From c14a6a6a0d0cab37f666795b57f362f257d2983d Mon Sep 17 00:00:00 2001 From: Jannis Metrikat <120120832+jmetrikat@users.noreply.github.com> Date: Fri, 8 Nov 2024 01:23:11 +0100 Subject: [PATCH 001/195] GO-4459 Add initial API service scaffolding --- api/apiservice.go | 99 +++++++++++++++++++++++++++++++++++++++ api/handlers.go | 91 +++++++++++++++++++++++++++++++++++ api/middleware.go | 48 +++++++++++++++++++ core/anytype/bootstrap.go | 4 +- go.mod | 7 +++ go.sum | 2 +- 6 files changed, 249 insertions(+), 2 deletions(-) create mode 100644 api/apiservice.go create mode 100644 api/handlers.go create mode 100644 api/middleware.go diff --git a/api/apiservice.go b/api/apiservice.go new file mode 100644 index 000000000..d145ff3c5 --- /dev/null +++ b/api/apiservice.go @@ -0,0 +1,99 @@ +package api + +import ( + "context" + "fmt" + "net/http" + "time" + + "github.com/anyproto/any-sync/app" + "github.com/gin-gonic/gin" +) + +const CName = "api" + +type Service interface { + app.ComponentRunnable +} + +type service struct { + router *gin.Engine + server *http.Server +} + +// TODO: User represents an authenticated user with permissions +type User struct { + ID string + Permissions string // "read-only" or "read-write" +} + +func New() Service { + return &service{} +} + +func (s *service) Init(a *app.App) error { + gin.SetMode(gin.ReleaseMode) + s.router = gin.New() + + // Unprotected routes + auth := s.router.Group("/v1/auth") + { + auth.POST("/displayCode", authDisplayCodeHandler) + auth.GET("/token", authTokenHandler) + } + + // Read-only routes + readOnly := s.router.Group("/v1") + readOnly.Use(AuthMiddleware()) + readOnly.Use(PermissionMiddleware("read-only")) + { + readOnly.GET("/spaces", getSpacesHandler) + readOnly.GET("/spaces/:space_id/members", getSpaceMembersHandler) + readOnly.GET("/spaces/:space_id/objects", getSpaceObjectsHandler) + readOnly.GET("/spaces/:space_id/objects/:object_id", getObjectHandler) + readOnly.GET("/spaces/:space_id/objectTypes", getObjectTypesHandler) + readOnly.GET("/spaces/:space_id/objectTypes/:typeId/templates", getObjectTypeTemplatesHandler) + readOnly.GET("/objects", getObjectsHandler) + } + + // Read-write routes + readWrite := s.router.Group("/v1") + readWrite.Use(AuthMiddleware()) + readWrite.Use(PermissionMiddleware("read-write")) + { + readWrite.POST("/spaces", createSpaceHandler) + readWrite.POST("/spaces/:space_id/objects/:object_id", createObjectHandler) + readWrite.PUT("/spaces/:space_id/objects/:object_id", updateObjectHandler) + } + return nil +} + +func (s *service) Name() string { + return CName +} + +func (s *service) Run(ctx context.Context) error { + s.server = &http.Server{ + Addr: ":31009", + Handler: s.router, + } + + // Start the HTTP server + go func() { + if err := s.server.ListenAndServe(); err != nil && err != http.ErrServerClosed { + fmt.Printf("failed to start HTTP server: %v\n", err) + } + }() + + return nil +} + +func (s *service) Close(ctx context.Context) error { + // Gracefully shut down the server + ctx, cancel := context.WithTimeout(ctx, 5*time.Second) + defer cancel() + if err := s.server.Shutdown(ctx); err != nil { + return fmt.Errorf("server shutdown failed: %w", err) + } + return nil +} diff --git a/api/handlers.go b/api/handlers.go new file mode 100644 index 000000000..c1cc95b08 --- /dev/null +++ b/api/handlers.go @@ -0,0 +1,91 @@ +package api + +import ( + "fmt" + "net/http" + + "github.com/gin-gonic/gin" +) + +// /v1/auth/displayCode [POST] +func authDisplayCodeHandler(c *gin.Context) { + // TODO: Implement the logic for opening a modal window with a code + c.JSON(http.StatusOK, gin.H{"message": "Display code modal opened successfully."}) +} + +// /v1/auth/token [GET] +func authTokenHandler(c *gin.Context) { + // TODO: Implement logic to retrieve an authentication token using a code + c.JSON(http.StatusOK, gin.H{"message": "Authentication token retrieved successfully."}) +} + +// /v1/spaces [GET] +func getSpacesHandler(c *gin.Context) { + // TODO: Implement logic to retrieve a list of spaces + c.JSON(http.StatusOK, gin.H{"message": "List of spaces retrieved successfully."}) +} + +// /v1/spaces [POST] +func createSpaceHandler(c *gin.Context) { + // TODO: Implement logic to create a new space + c.JSON(http.StatusOK, gin.H{"message": "Space created successfully."}) +} + +// /v1/spaces/:space_id/members [GET] +func getSpaceMembersHandler(c *gin.Context) { + spaceID := c.Param("space_id") + // TODO: Implement logic to retrieve members of a space + c.JSON(http.StatusOK, gin.H{"message": fmt.Sprintf("Members of space %s retrieved successfully.", spaceID)}) +} + +// /v1/spaces/:space_id/objects [GET] +func getSpaceObjectsHandler(c *gin.Context) { + spaceID := c.Param("space_id") + // TODO: Implement logic to retrieve objects in a space + c.JSON(http.StatusOK, gin.H{"message": fmt.Sprintf("Objects in space %s retrieved successfully.", spaceID)}) +} + +// /v1/spaces/:space_id/objects/:object_id [GET] +func getObjectHandler(c *gin.Context) { + spaceID := c.Param("space_id") + objectID := c.Param("object_id") + // TODO: Implement logic to retrieve a specific object + c.JSON(http.StatusOK, gin.H{"message": fmt.Sprintf("Object %s in space %s retrieved successfully.", objectID, spaceID)}) +} + +// /v1/spaces/:space_id/objects/:object_id [POST] +func createObjectHandler(c *gin.Context) { + spaceID := c.Param("space_id") + objectID := c.Param("object_id") + // TODO: Implement logic to create a new object + c.JSON(http.StatusOK, gin.H{"message": fmt.Sprintf("Object %s in space %s created successfully.", objectID, spaceID)}) +} + +// /v1/spaces/:space_id/objects/:object_id [PUT] +func updateObjectHandler(c *gin.Context) { + spaceID := c.Param("space_id") + objectID := c.Param("object_id") + // TODO: Implement logic to update an existing object + c.JSON(http.StatusOK, gin.H{"message": fmt.Sprintf("Object %s in space %s updated successfully.", objectID, spaceID)}) +} + +// /v1/spaces/:space_id/objectTypes [GET] +func getObjectTypesHandler(c *gin.Context) { + spaceID := c.Param("space_id") + // TODO: Implement logic to retrieve object types in a space + c.JSON(http.StatusOK, gin.H{"message": fmt.Sprintf("Object types in space %s retrieved successfully.", spaceID)}) +} + +// /v1/spaces/:space_id/objectTypes/:typeId/templates [GET] +func getObjectTypeTemplatesHandler(c *gin.Context) { + spaceID := c.Param("space_id") + typeID := c.Param("typeId") + // TODO: Implement logic to retrieve templates for an object type + c.JSON(http.StatusOK, gin.H{"message": fmt.Sprintf("Templates for object type %s in space %s retrieved successfully.", typeID, spaceID)}) +} + +// /v1/objects [GET] +func getObjectsHandler(c *gin.Context) { + // TODO: Implement logic to search and retrieve objects across all spaces + c.JSON(http.StatusOK, gin.H{"message": "Objects retrieved successfully."}) +} diff --git a/api/middleware.go b/api/middleware.go new file mode 100644 index 000000000..9b88bfc58 --- /dev/null +++ b/api/middleware.go @@ -0,0 +1,48 @@ +package api + +import ( + "net/http" + + "github.com/gin-gonic/gin" +) + +// Middleware to authenticate requests and add user info to context +func AuthMiddleware() gin.HandlerFunc { + return func(c *gin.Context) { + token := c.GetHeader("Authorization") + if token == "" { + c.AbortWithStatusJSON(http.StatusUnauthorized, gin.H{"error": "Unauthorized"}) + return + } + + // TODO: Validate the token and retrieve user information; this is mock example + user := &User{ + ID: "user123", + Permissions: "read-only", // or "read-only" + } + + // Add the user to the context + c.Set("user", user) + c.Next() + } +} + +// Middleware to check permissions +func PermissionMiddleware(requiredPermission string) gin.HandlerFunc { + return func(c *gin.Context) { + user, exists := c.Get("user") + if !exists { + c.AbortWithStatusJSON(http.StatusUnauthorized, gin.H{"error": "Unauthorized"}) + return + } + + u := user.(*User) + if requiredPermission == "read-write" && u.Permissions != "read-write" { + c.AbortWithStatusJSON(http.StatusForbidden, gin.H{"error": "Forbidden: write access required"}) + return + } + + // For read-only access, both "read-only" and "read-write" permissions are acceptable + c.Next() + } +} diff --git a/core/anytype/bootstrap.go b/core/anytype/bootstrap.go index 815de9897..9a98a4df1 100644 --- a/core/anytype/bootstrap.go +++ b/core/anytype/bootstrap.go @@ -31,6 +31,7 @@ import ( "github.com/anyproto/any-sync/nameservice/nameserviceclient" "github.com/anyproto/any-sync/paymentservice/paymentserviceclient" + "github.com/anyproto/anytype-heart/api" "github.com/anyproto/anytype-heart/core/acl" "github.com/anyproto/anytype-heart/core/anytype/account" "github.com/anyproto/anytype-heart/core/anytype/config" @@ -314,7 +315,8 @@ func Bootstrap(a *app.App, components ...app.Component) { Register(payments.New()). Register(paymentscache.New()). Register(peerstatus.New()). - Register(lastused.New()) + Register(lastused.New()). + Register(api.New()) } func MiddlewareVersion() string { diff --git a/go.mod b/go.mod index b37eef3c5..acae47705 100644 --- a/go.mod +++ b/go.mod @@ -29,6 +29,7 @@ require ( github.com/dsoprea/go-exif/v3 v3.0.1 github.com/dsoprea/go-jpeg-image-structure/v2 v2.0.0-20210512043942-b434301c6836 github.com/ethereum/go-ethereum v1.13.15 + github.com/gin-gonic/gin v1.6.3 github.com/globalsign/mgo v0.0.0-20181015135952-eeefdecb41b8 github.com/go-chi/chi/v5 v5.0.13 github.com/go-shiori/go-readability v0.0.0-20220215145315-dd6828d2f09b @@ -167,10 +168,14 @@ require ( github.com/flopp/go-findfont v0.1.0 // indirect github.com/fogleman/gg v1.3.0 // indirect github.com/fsnotify/fsnotify v1.6.0 // indirect + github.com/gin-contrib/sse v0.1.0 // indirect github.com/go-errors/errors v1.4.2 // indirect github.com/go-logr/logr v1.4.2 // indirect github.com/go-logr/stdr v1.2.2 // indirect github.com/go-ole/go-ole v1.3.0 // indirect + github.com/go-playground/locales v0.13.0 // indirect + github.com/go-playground/universal-translator v0.17.0 // indirect + github.com/go-playground/validator/v10 v10.2.0 // indirect github.com/go-shiori/dom v0.0.0-20210627111528-4e4722cd0d65 // indirect github.com/go-task/slim-sprig/v3 v3.0.0 // indirect github.com/go-xmlfmt/xmlfmt v0.0.0-20191208150333-d5b6f63a941b // indirect @@ -209,6 +214,7 @@ require ( github.com/jinzhu/copier v0.3.5 // indirect github.com/json-iterator/go v1.1.12 // indirect github.com/klauspost/cpuid/v2 v2.2.8 // indirect + github.com/leodido/go-urn v1.2.0 // indirect github.com/libp2p/go-buffer-pool v0.1.0 // indirect github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 // indirect github.com/mattn/go-colorable v0.1.13 // indirect @@ -260,6 +266,7 @@ require ( github.com/tklauser/numcpus v0.6.1 // indirect github.com/tyler-smith/go-bip39 v1.1.0 // indirect github.com/uber/jaeger-lib v2.4.1+incompatible // indirect + github.com/ugorji/go/codec v1.1.7 // indirect github.com/whyrusleeping/chunker v0.0.0-20181014151217-fe64bd25879f // indirect github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f // indirect github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 // indirect diff --git a/go.sum b/go.sum index 00dc39c05..597df0bbb 100644 --- a/go.sum +++ b/go.sum @@ -371,6 +371,7 @@ github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE= github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78= +github.com/go-playground/assert/v2 v2.0.1 h1:MsBgLAaY856+nPRTKrp3/OZK38U/wa0CcBYNjji3q3A= github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= github.com/go-playground/locales v0.13.0 h1:HyWk6mgj5qFqCT5fjGBuRArbVDfE4hi8+e8ceBS/t7Q= github.com/go-playground/locales v0.13.0/go.mod h1:taPMhCMXrRLJO55olJkUXHZBHCxTMfnGwq/HNwmWNS8= @@ -1395,7 +1396,6 @@ github.com/uber/jaeger-client-go v2.30.0+incompatible/go.mod h1:WVhlPFC8FDjOFMMW github.com/uber/jaeger-lib v2.4.1+incompatible h1:td4jdvLcExb4cBISKIpHuGoVXh+dVKhn2Um6rjCsSsg= github.com/uber/jaeger-lib v2.4.1+incompatible/go.mod h1:ComeNDZlWwrWnDv8aPp0Ba6+uUTzImX/AauajbLI56U= github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= -github.com/ugorji/go v1.1.7 h1:/68gy2h+1mWMrwZFeD1kQialdSzAb432dtpeJ42ovdo= github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw= github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= github.com/ugorji/go/codec v1.1.7 h1:2SvQaVZ1ouYrrKKwoSk2pzd4A9evlKJb9oTL+OaLUSs= From 6923257979c000538aaf0e63d7318b2c841c5b81 Mon Sep 17 00:00:00 2001 From: AnastasiaShemyakinskaya Date: Mon, 11 Nov 2024 17:12:52 +0100 Subject: [PATCH 002/195] GO-4406: add original creation date Signed-off-by: AnastasiaShemyakinskaya --- core/block/object/objectcreator/installer.go | 3 +++ core/block/object/objectcreator/object_type.go | 3 +++ core/block/object/objectcreator/relation.go | 3 +++ core/block/object/objectcreator/relation_option.go | 3 +++ 4 files changed, 12 insertions(+) diff --git a/core/block/object/objectcreator/installer.go b/core/block/object/objectcreator/installer.go index 1fa2156b4..0619eaf3a 100644 --- a/core/block/object/objectcreator/installer.go +++ b/core/block/object/objectcreator/installer.go @@ -5,6 +5,7 @@ import ( "errors" "fmt" "strings" + "time" "github.com/anyproto/any-sync/commonspace/object/tree/treestorage" "github.com/gogo/protobuf/types" @@ -196,6 +197,7 @@ func (s *service) reinstallBundledObjects(ctx context.Context, sourceSpace clien st.SetDetailAndBundledRelation(bundle.RelationKeyIsUninstalled, pbtypes.Bool(false)) st.SetDetailAndBundledRelation(bundle.RelationKeyIsDeleted, pbtypes.Bool(false)) st.SetDetailAndBundledRelation(bundle.RelationKeyIsArchived, pbtypes.Bool(false)) + st.SetOriginalCreatedTimestamp(time.Now().Unix()) typeKey = domain.TypeKey(st.UniqueKeyInternal()) ids = append(ids, id) @@ -237,6 +239,7 @@ func (s *service) prepareDetailsForInstallingObject( details.Fields[bundle.RelationKeySpaceId.String()] = pbtypes.String(spaceID) details.Fields[bundle.RelationKeySourceObject.String()] = pbtypes.String(sourceId) details.Fields[bundle.RelationKeyIsReadonly.String()] = pbtypes.Bool(false) + details.Fields[bundle.RelationKeyCreatedDate.String()] = pbtypes.Int64(time.Now().Unix()) if isNewSpace { lastused.SetLastUsedDateForInitialObjectType(sourceId, details) diff --git a/core/block/object/objectcreator/object_type.go b/core/block/object/objectcreator/object_type.go index 23df89b7e..f93767d96 100644 --- a/core/block/object/objectcreator/object_type.go +++ b/core/block/object/objectcreator/object_type.go @@ -43,6 +43,9 @@ func (s *service) createObjectType(ctx context.Context, space clientspace.Space, createState := state.NewDocWithUniqueKey("", nil, uniqueKey).(*state.State) createState.SetDetails(object) + if createDate := pbtypes.GetInt64(details, bundle.RelationKeyCreatedDate.String()); createDate != 0 { + createState.SetOriginalCreatedTimestamp(createDate) + } id, newDetails, err = s.CreateSmartBlockFromStateInSpace(ctx, space, []domain.TypeKey{bundle.TypeKeyObjectType}, createState) if err != nil { return "", nil, fmt.Errorf("create smartblock from state: %w", err) diff --git a/core/block/object/objectcreator/relation.go b/core/block/object/objectcreator/relation.go index be2ad63b3..b74ebe7bd 100644 --- a/core/block/object/objectcreator/relation.go +++ b/core/block/object/objectcreator/relation.go @@ -58,5 +58,8 @@ func (s *service) createRelation(ctx context.Context, space clientspace.Space, d createState := state.NewDocWithUniqueKey("", nil, uniqueKey).(*state.State) createState.SetDetails(object) + if createDate := pbtypes.GetInt64(details, bundle.RelationKeyCreatedDate.String()); createDate != 0 { + createState.SetOriginalCreatedTimestamp(createDate) + } return s.CreateSmartBlockFromStateInSpace(ctx, space, []domain.TypeKey{bundle.TypeKeyRelation}, createState) } diff --git a/core/block/object/objectcreator/relation_option.go b/core/block/object/objectcreator/relation_option.go index b799edf4d..169a8d415 100644 --- a/core/block/object/objectcreator/relation_option.go +++ b/core/block/object/objectcreator/relation_option.go @@ -40,6 +40,9 @@ func (s *service) createRelationOption(ctx context.Context, space clientspace.Sp createState := state.NewDocWithUniqueKey("", nil, uniqueKey).(*state.State) createState.SetDetails(object) + if createDate := pbtypes.GetInt64(details, bundle.RelationKeyCreatedDate.String()); createDate != 0 { + createState.SetOriginalCreatedTimestamp(createDate) + } return s.CreateSmartBlockFromStateInSpace(ctx, space, []domain.TypeKey{bundle.TypeKeyRelationOption}, createState) } From 68517354af897d5bd04050d3f900da75e47fa740 Mon Sep 17 00:00:00 2001 From: Jannis Metrikat <120120832+jmetrikat@users.noreply.github.com> Date: Sat, 16 Nov 2024 22:25:37 +0100 Subject: [PATCH 003/195] GO-4459 Move api to cmd and add auth + spaces handler --- api/apiservice.go | 99 ---------------- api/handlers.go | 91 --------------- cmd/api/handlers.go | 206 +++++++++++++++++++++++++++++++++ cmd/api/helper.go | 64 ++++++++++ cmd/api/main.go | 113 ++++++++++++++++++ {api => cmd/api}/middleware.go | 4 +- cmd/grpcserver/grpc.go | 6 + core/anytype/bootstrap.go | 4 +- 8 files changed, 392 insertions(+), 195 deletions(-) delete mode 100644 api/apiservice.go delete mode 100644 api/handlers.go create mode 100644 cmd/api/handlers.go create mode 100644 cmd/api/helper.go create mode 100644 cmd/api/main.go rename {api => cmd/api}/middleware.go (88%) diff --git a/api/apiservice.go b/api/apiservice.go deleted file mode 100644 index d145ff3c5..000000000 --- a/api/apiservice.go +++ /dev/null @@ -1,99 +0,0 @@ -package api - -import ( - "context" - "fmt" - "net/http" - "time" - - "github.com/anyproto/any-sync/app" - "github.com/gin-gonic/gin" -) - -const CName = "api" - -type Service interface { - app.ComponentRunnable -} - -type service struct { - router *gin.Engine - server *http.Server -} - -// TODO: User represents an authenticated user with permissions -type User struct { - ID string - Permissions string // "read-only" or "read-write" -} - -func New() Service { - return &service{} -} - -func (s *service) Init(a *app.App) error { - gin.SetMode(gin.ReleaseMode) - s.router = gin.New() - - // Unprotected routes - auth := s.router.Group("/v1/auth") - { - auth.POST("/displayCode", authDisplayCodeHandler) - auth.GET("/token", authTokenHandler) - } - - // Read-only routes - readOnly := s.router.Group("/v1") - readOnly.Use(AuthMiddleware()) - readOnly.Use(PermissionMiddleware("read-only")) - { - readOnly.GET("/spaces", getSpacesHandler) - readOnly.GET("/spaces/:space_id/members", getSpaceMembersHandler) - readOnly.GET("/spaces/:space_id/objects", getSpaceObjectsHandler) - readOnly.GET("/spaces/:space_id/objects/:object_id", getObjectHandler) - readOnly.GET("/spaces/:space_id/objectTypes", getObjectTypesHandler) - readOnly.GET("/spaces/:space_id/objectTypes/:typeId/templates", getObjectTypeTemplatesHandler) - readOnly.GET("/objects", getObjectsHandler) - } - - // Read-write routes - readWrite := s.router.Group("/v1") - readWrite.Use(AuthMiddleware()) - readWrite.Use(PermissionMiddleware("read-write")) - { - readWrite.POST("/spaces", createSpaceHandler) - readWrite.POST("/spaces/:space_id/objects/:object_id", createObjectHandler) - readWrite.PUT("/spaces/:space_id/objects/:object_id", updateObjectHandler) - } - return nil -} - -func (s *service) Name() string { - return CName -} - -func (s *service) Run(ctx context.Context) error { - s.server = &http.Server{ - Addr: ":31009", - Handler: s.router, - } - - // Start the HTTP server - go func() { - if err := s.server.ListenAndServe(); err != nil && err != http.ErrServerClosed { - fmt.Printf("failed to start HTTP server: %v\n", err) - } - }() - - return nil -} - -func (s *service) Close(ctx context.Context) error { - // Gracefully shut down the server - ctx, cancel := context.WithTimeout(ctx, 5*time.Second) - defer cancel() - if err := s.server.Shutdown(ctx); err != nil { - return fmt.Errorf("server shutdown failed: %w", err) - } - return nil -} diff --git a/api/handlers.go b/api/handlers.go deleted file mode 100644 index c1cc95b08..000000000 --- a/api/handlers.go +++ /dev/null @@ -1,91 +0,0 @@ -package api - -import ( - "fmt" - "net/http" - - "github.com/gin-gonic/gin" -) - -// /v1/auth/displayCode [POST] -func authDisplayCodeHandler(c *gin.Context) { - // TODO: Implement the logic for opening a modal window with a code - c.JSON(http.StatusOK, gin.H{"message": "Display code modal opened successfully."}) -} - -// /v1/auth/token [GET] -func authTokenHandler(c *gin.Context) { - // TODO: Implement logic to retrieve an authentication token using a code - c.JSON(http.StatusOK, gin.H{"message": "Authentication token retrieved successfully."}) -} - -// /v1/spaces [GET] -func getSpacesHandler(c *gin.Context) { - // TODO: Implement logic to retrieve a list of spaces - c.JSON(http.StatusOK, gin.H{"message": "List of spaces retrieved successfully."}) -} - -// /v1/spaces [POST] -func createSpaceHandler(c *gin.Context) { - // TODO: Implement logic to create a new space - c.JSON(http.StatusOK, gin.H{"message": "Space created successfully."}) -} - -// /v1/spaces/:space_id/members [GET] -func getSpaceMembersHandler(c *gin.Context) { - spaceID := c.Param("space_id") - // TODO: Implement logic to retrieve members of a space - c.JSON(http.StatusOK, gin.H{"message": fmt.Sprintf("Members of space %s retrieved successfully.", spaceID)}) -} - -// /v1/spaces/:space_id/objects [GET] -func getSpaceObjectsHandler(c *gin.Context) { - spaceID := c.Param("space_id") - // TODO: Implement logic to retrieve objects in a space - c.JSON(http.StatusOK, gin.H{"message": fmt.Sprintf("Objects in space %s retrieved successfully.", spaceID)}) -} - -// /v1/spaces/:space_id/objects/:object_id [GET] -func getObjectHandler(c *gin.Context) { - spaceID := c.Param("space_id") - objectID := c.Param("object_id") - // TODO: Implement logic to retrieve a specific object - c.JSON(http.StatusOK, gin.H{"message": fmt.Sprintf("Object %s in space %s retrieved successfully.", objectID, spaceID)}) -} - -// /v1/spaces/:space_id/objects/:object_id [POST] -func createObjectHandler(c *gin.Context) { - spaceID := c.Param("space_id") - objectID := c.Param("object_id") - // TODO: Implement logic to create a new object - c.JSON(http.StatusOK, gin.H{"message": fmt.Sprintf("Object %s in space %s created successfully.", objectID, spaceID)}) -} - -// /v1/spaces/:space_id/objects/:object_id [PUT] -func updateObjectHandler(c *gin.Context) { - spaceID := c.Param("space_id") - objectID := c.Param("object_id") - // TODO: Implement logic to update an existing object - c.JSON(http.StatusOK, gin.H{"message": fmt.Sprintf("Object %s in space %s updated successfully.", objectID, spaceID)}) -} - -// /v1/spaces/:space_id/objectTypes [GET] -func getObjectTypesHandler(c *gin.Context) { - spaceID := c.Param("space_id") - // TODO: Implement logic to retrieve object types in a space - c.JSON(http.StatusOK, gin.H{"message": fmt.Sprintf("Object types in space %s retrieved successfully.", spaceID)}) -} - -// /v1/spaces/:space_id/objectTypes/:typeId/templates [GET] -func getObjectTypeTemplatesHandler(c *gin.Context) { - spaceID := c.Param("space_id") - typeID := c.Param("typeId") - // TODO: Implement logic to retrieve templates for an object type - c.JSON(http.StatusOK, gin.H{"message": fmt.Sprintf("Templates for object type %s in space %s retrieved successfully.", typeID, spaceID)}) -} - -// /v1/objects [GET] -func getObjectsHandler(c *gin.Context) { - // TODO: Implement logic to search and retrieve objects across all spaces - c.JSON(http.StatusOK, gin.H{"message": "Objects retrieved successfully."}) -} diff --git a/cmd/api/handlers.go b/cmd/api/handlers.go new file mode 100644 index 000000000..69025afb6 --- /dev/null +++ b/cmd/api/handlers.go @@ -0,0 +1,206 @@ +package api + +import ( + "context" + "math/rand" + "net/http" + + "github.com/gin-gonic/gin" + "github.com/gogo/protobuf/types" + + "github.com/anyproto/anytype-heart/pb" + "github.com/anyproto/anytype-heart/pkg/lib/bundle" + "github.com/anyproto/anytype-heart/pkg/lib/pb/model" + "github.com/anyproto/anytype-heart/util/pbtypes" +) + +type NameRequest struct { + Name string `json:"name"` +} + +// /v1/auth/displayCode [POST] +func (a *ApiServer) authDisplayCodeHandler(c *gin.Context) { + // Call AccountLocalLinkNewChallenge to display code modal + ctx := context.Background() + resp := a.mw.AccountLocalLinkNewChallenge(ctx, &pb.RpcAccountLocalLinkNewChallengeRequest{"api-test"}) + + if resp.Error.Code != pb.RpcAccountLocalLinkNewChallengeResponseError_NULL { + c.JSON(http.StatusInternalServerError, gin.H{"message": "Failed to generate a new challenge."}) + } + + c.JSON(http.StatusOK, gin.H{"challengeId": resp.ChallengeId}) +} + +// /v1/auth/token [GET] +func (a *ApiServer) authTokenHandler(c *gin.Context) { + // Call AccountLocalLinkSolveChallenge to retrieve session token and app key + resp := a.mw.AccountLocalLinkSolveChallenge(context.Background(), &pb.RpcAccountLocalLinkSolveChallengeRequest{ + ChallengeId: c.Query("challengeId"), + Answer: c.Query("code"), + }) + + if resp.Error.Code != pb.RpcAccountLocalLinkSolveChallengeResponseError_NULL { + c.JSON(http.StatusInternalServerError, gin.H{"message": "Failed to authenticate user."}) + return + } + + c.JSON(http.StatusOK, gin.H{ + "sessionToken": resp.SessionToken, + "appKey": resp.AppKey, + }) +} + +// /v1/spaces [GET] +func (a *ApiServer) getSpacesHandler(c *gin.Context) { + // Call ObjectSearch for all objects of type spaceView + resp := a.mw.ObjectSearch(context.Background(), &pb.RpcObjectSearchRequest{ + SpaceId: a.accountInfo.TechSpaceId, + Filters: []*model.BlockContentDataviewFilter{ + { + RelationKey: bundle.RelationKeyLayout.String(), + Condition: model.BlockContentDataviewFilter_Equal, + Value: pbtypes.Int64(int64(model.ObjectType_spaceView)), + }, + { + RelationKey: bundle.RelationKeySpaceLocalStatus.String(), + Condition: model.BlockContentDataviewFilter_Equal, + Value: pbtypes.Int64(int64(model.SpaceStatus_Ok)), + }, + }, + Keys: []string{"id", "spaceId", "name", "description", "snippet", "iconEmoji", "iconImage", "iconOption", "relationFormat", "type", "layout", "isHidden", "isArchived", "isReadonly", "isDeleted", "isFavorite", "done", "fileExt", "fileMimeType", "sizeInBytes", "restrictions", "defaultTemplateId", "createdDate", "spaceDashboardId", "spaceAccountStatus", "spaceLocalStatus", "spaceAccessType", "readersLimit", "writersLimit", "targetSpaceId", "creator", "chatId", "identity", "participantPermissions", "participantStatus", "globalName"}, + }) + if resp.Error.Code != pb.RpcObjectSearchResponseError_NULL { + c.JSON(http.StatusInternalServerError, gin.H{"message": "Failed to retrieve list of spaces."}) + return + } + c.JSON(http.StatusOK, gin.H{"spaces": resp.Records}) +} + +// /v1/spaces [POST] +func (a *ApiServer) createSpaceHandler(c *gin.Context) { + // Create new workspace with a random icon and import default usecase + nameRequest := NameRequest{} + if err := c.BindJSON(&nameRequest); err != nil { + c.JSON(http.StatusBadRequest, gin.H{"message": "Invalid JSON"}) + return + } + name := nameRequest.Name + iconOption := rand.Intn(13) + + resp := a.mw.WorkspaceCreate(context.Background(), &pb.RpcWorkspaceCreateRequest{ + Details: &types.Struct{ + Fields: map[string]*types.Value{ + "iconOption": {Kind: &types.Value_NumberValue{NumberValue: float64(iconOption)}}, + "name": {Kind: &types.Value_StringValue{StringValue: name}}, + "spaceDashboardId": {Kind: &types.Value_StringValue{ + StringValue: "lastOpened", + }}, + }, + }, + UseCase: 1, + WithChat: true, + }) + + if resp.Error.Code != pb.RpcWorkspaceCreateResponseError_NULL { + c.JSON(http.StatusInternalServerError, gin.H{"message": "Failed to create a new space."}) + return + } + + c.JSON(http.StatusOK, gin.H{"spaceId": resp.SpaceId, "name": name, "iconOption": iconOption}) +} + +// /v1/spaces/:space_id/members [GET] +func (a *ApiServer) getSpaceMembersHandler(c *gin.Context) { + // Call ObjectSearch for all objects of type participant + spaceId := c.Param("space_id") + + resp := a.mw.ObjectSearch(context.Background(), &pb.RpcObjectSearchRequest{ + SpaceId: spaceId, + Filters: []*model.BlockContentDataviewFilter{ + { + RelationKey: bundle.RelationKeyLayout.String(), + Condition: model.BlockContentDataviewFilter_Equal, + Value: pbtypes.Int64(int64(model.ObjectType_participant)), + }, + }, + }) + + if resp.Error.Code != pb.RpcObjectSearchResponseError_NULL { + c.JSON(http.StatusInternalServerError, gin.H{"message": "Failed to retrieve list of members."}) + return + } + + // Convert the response to a list of members with their details: type, identity, name, role + members := []gin.H{} + for _, record := range resp.Records { + identity := record.Fields["identity"].GetStringValue() + name := record.Fields["name"].GetStringValue() + role := record.Fields["participantPermissions"].GetNumberValue() + typeName, err := a.resolveTypeToName(spaceId, record.Fields["type"].GetStringValue()) + if err != nil { + c.JSON(http.StatusInternalServerError, gin.H{"message": "Failed to resolve type to name."}) + return + } + + members = append(members, gin.H{ + "type": typeName, + "identity": identity, + "name": name, + "role": model.ParticipantPermissions_name[int32(role)], + }) + } + + c.JSON(http.StatusOK, gin.H{"members": members}) +} + +// /v1/spaces/:space_id/objects [GET] +func (a *ApiServer) getSpaceObjectsHandler(c *gin.Context) { + spaceID := c.Param("space_id") + // TODO: Implement logic to retrieve objects in a space + c.JSON(http.StatusNotImplemented, gin.H{"message": "Not implemented yet", "space_id": spaceID}) +} + +// /v1/spaces/:space_id/objects/:object_id [GET] +func (a *ApiServer) getObjectHandler(c *gin.Context) { + spaceID := c.Param("space_id") + objectID := c.Param("object_id") + // TODO: Implement logic to retrieve a specific object + c.JSON(http.StatusNotImplemented, gin.H{"message": "Not implemented yet", "space_id": spaceID, "object_id": objectID}) +} + +// /v1/spaces/:space_id/objects/:object_id [POST] +func (a *ApiServer) createObjectHandler(c *gin.Context) { + spaceID := c.Param("space_id") + objectID := c.Param("object_id") + // TODO: Implement logic to create a new object + c.JSON(http.StatusNotImplemented, gin.H{"message": "Not implemented yet", "space_id": spaceID, "object_id": objectID}) +} + +// /v1/spaces/:space_id/objects/:object_id [PUT] +func (a *ApiServer) updateObjectHandler(c *gin.Context) { + spaceID := c.Param("space_id") + objectID := c.Param("object_id") + // TODO: Implement logic to update an existing object + c.JSON(http.StatusNotImplemented, gin.H{"message": "Not implemented yet", "space_id": spaceID, "object_id": objectID}) +} + +// /v1/spaces/:space_id/objectTypes [GET] +func (a *ApiServer) getObjectTypesHandler(c *gin.Context) { + spaceID := c.Param("space_id") + // TODO: Implement logic to retrieve object types in a space + c.JSON(http.StatusNotImplemented, gin.H{"message": "Not implemented yet", "space_id": spaceID}) +} + +// /v1/spaces/:space_id/objectTypes/:typeId/templates [GET] +func (a *ApiServer) getObjectTypeTemplatesHandler(c *gin.Context) { + spaceID := c.Param("space_id") + typeID := c.Param("typeId") + // TODO: Implement logic to retrieve templates for an object type + c.JSON(http.StatusNotImplemented, gin.H{"message": "Not implemented yet", "space_id": spaceID, "typeId": typeID}) +} + +// /v1/objects [GET] +func (a *ApiServer) getObjectsHandler(c *gin.Context) { + // TODO: Implement logic to search and retrieve objects across all spaces + c.JSON(http.StatusNotImplemented, gin.H{"message": "Not implemented yet"}) +} diff --git a/cmd/api/helper.go b/cmd/api/helper.go new file mode 100644 index 000000000..c167e231d --- /dev/null +++ b/cmd/api/helper.go @@ -0,0 +1,64 @@ +package api + +import ( + "context" + + "github.com/anyproto/anytype-heart/pb" + "github.com/anyproto/anytype-heart/pkg/lib/bundle" + "github.com/anyproto/anytype-heart/pkg/lib/pb/model" + "github.com/anyproto/anytype-heart/util/pbtypes" +) + +// func (a *ApiServer) setInitialParameters(ctx context.Context) { +// resp := a.mw.InitialSetParameters(ctx, &pb.RpcInitialSetParametersRequest{ +// DoNotSaveLogs: false, +// DoNotSendLogs: false, +// DoNotSendTelemetry: false, +// LogLevel: "", +// Platform: "", +// Version: "0.0.1", +// Workdir: "", +// }) +// +// if resp.Error.Code != pb.RpcInitialSetParametersResponseError_NULL { +// fmt.Printf("failed to set initial parameters: %v\n", resp.Error.Description) +// return +// } +// } +// +// func (a *ApiServer) getAccountInfo(ctx context.Context, accountId string) { +// resp := a.mw.AccountSelect(ctx, &pb.RpcAccountSelectRequest{ +// Id: accountId, +// }) +// +// if resp.Error.Code != pb.RpcAccountSelectResponseError_NULL { +// fmt.Printf("failed to get account info: %v\n", resp.Error.Description) +// return +// } +// +// a.accountInfo = resp.Account.Info +// } + +func (a *ApiServer) resolveTypeToName(spaceId string, typeId string) (string, *pb.RpcObjectSearchResponseError) { + // Call ObjectSearch for object of specified type and return the name + resp := a.mw.ObjectSearch(context.Background(), &pb.RpcObjectSearchRequest{ + SpaceId: spaceId, + Filters: []*model.BlockContentDataviewFilter{ + { + RelationKey: bundle.RelationKeyId.String(), + Condition: model.BlockContentDataviewFilter_Equal, + Value: pbtypes.String(typeId), + }, + }, + }) + + if resp.Error.Code != pb.RpcObjectSearchResponseError_NULL { + return "", resp.Error + } + + if len(resp.Records) == 0 { + return "", &pb.RpcObjectSearchResponseError{Code: pb.RpcObjectSearchResponseError_BAD_INPUT, Description: "Type not found"} + } + + return resp.Records[0].Fields["name"].GetStringValue(), nil +} diff --git a/cmd/api/main.go b/cmd/api/main.go new file mode 100644 index 000000000..ded5ae600 --- /dev/null +++ b/cmd/api/main.go @@ -0,0 +1,113 @@ +package api + +import ( + "context" + "fmt" + "net/http" + "time" + + "github.com/gin-gonic/gin" + + "github.com/anyproto/anytype-heart/pb/service" + "github.com/anyproto/anytype-heart/pkg/lib/pb/model" +) + +const ( + httpPort = ":31009" + serverShutdownTime = 5 * time.Second +) + +type ApiServer struct { + mw service.ClientCommandsServer + router *gin.Engine + server *http.Server + accountInfo model.AccountInfo +} + +// TODO: User represents an authenticated user with permissions +type User struct { + ID string + Permissions string // "read-only" or "read-write" +} + +func newApiServer(mw service.ClientCommandsServer) *ApiServer { + a := &ApiServer{ + mw: mw, + router: gin.New(), + accountInfo: model.AccountInfo{ + TechSpaceId: "bafyreidken4zbd7p2ai6h4bgowudxbhzop4f4fewctm77f43qn5mzhsrje.2lcu0r85yg10d", + }, + } + + a.server = &http.Server{ + Addr: httpPort, + Handler: a.router, + } + + return a +} + +func RunApiServer(ctx context.Context, mw service.ClientCommandsServer) { + a := newApiServer(mw) + // a.setInitialParameters(ctx) + // a.getAccountInfo(ctx, "AAHTtt8wuQEnaYBNZ1Cyfcvs6DqPqxgn8VXDVk4avsUkMuha") + + // Unprotected routes + auth := a.router.Group("/v1/auth") + { + auth.POST("/displayCode", a.authDisplayCodeHandler) + auth.GET("/token", a.authTokenHandler) + } + + // Read-only routes + readOnly := a.router.Group("/v1") + // readOnly.Use(a.AuthMiddleware()) + // readOnly.Use(a.PermissionMiddleware("read-only")) + { + readOnly.GET("/spaces", a.getSpacesHandler) + readOnly.GET("/spaces/:space_id/members", a.getSpaceMembersHandler) + readOnly.GET("/spaces/:space_id/objects", a.getSpaceObjectsHandler) + readOnly.GET("/spaces/:space_id/objects/:object_id", a.getObjectHandler) + readOnly.GET("/spaces/:space_id/objectTypes", a.getObjectTypesHandler) + readOnly.GET("/spaces/:space_id/objectTypes/:typeId/templates", a.getObjectTypeTemplatesHandler) + readOnly.GET("/objects", a.getObjectsHandler) + } + + // Read-write routes + readWrite := a.router.Group("/v1") + // readWrite.Use(a.AuthMiddleware()) + // readWrite.Use(a.PermissionMiddleware("read-write")) + { + readWrite.POST("/spaces", a.createSpaceHandler) + readWrite.POST("/spaces/:space_id/objects/:object_id", a.createObjectHandler) + readWrite.PUT("/spaces/:space_id/objects/:object_id", a.updateObjectHandler) + } + + // Start the HTTP server + go func() { + if err := a.server.ListenAndServe(); err != nil && err != http.ErrServerClosed { + fmt.Printf("failed to start HTTP server: %v\n", err) + } + }() + + // Wait for the context to be done and then shut down the server + <-ctx.Done() + + // Create a new context with a timeout to shut down the server + shutdownCtx, cancel := context.WithTimeout(context.Background(), serverShutdownTime) + defer cancel() + if err := a.server.Shutdown(shutdownCtx); err != nil { + fmt.Println("server shutdown failed: %w", err) + } +} + +// func newClient(port string) (service.ClientCommandsClient, error) { +// ctx, cancel := context.WithTimeout(context.Background(), 1*time.Second) +// defer cancel() +// conn, err := grpc.DialContext(ctx, ":"+port, grpc.WithBlock(), grpc.WithTransportCredentials(insecure.NewCredentials())) +// if err != nil { +// return nil, err +// } +// +// return service.NewClientCommandsClient(conn), nil +// } diff --git a/api/middleware.go b/cmd/api/middleware.go similarity index 88% rename from api/middleware.go rename to cmd/api/middleware.go index 9b88bfc58..9bd81c726 100644 --- a/api/middleware.go +++ b/cmd/api/middleware.go @@ -7,7 +7,7 @@ import ( ) // Middleware to authenticate requests and add user info to context -func AuthMiddleware() gin.HandlerFunc { +func (a *ApiServer) AuthMiddleware() gin.HandlerFunc { return func(c *gin.Context) { token := c.GetHeader("Authorization") if token == "" { @@ -28,7 +28,7 @@ func AuthMiddleware() gin.HandlerFunc { } // Middleware to check permissions -func PermissionMiddleware(requiredPermission string) gin.HandlerFunc { +func (a *ApiServer) PermissionMiddleware(requiredPermission string) gin.HandlerFunc { return func(c *gin.Context) { user, exists := c.Get("user") if !exists { diff --git a/cmd/grpcserver/grpc.go b/cmd/grpcserver/grpc.go index 8802d6f40..0bc6412c8 100644 --- a/cmd/grpcserver/grpc.go +++ b/cmd/grpcserver/grpc.go @@ -28,6 +28,7 @@ import ( jaegercfg "github.com/uber/jaeger-client-go/config" "google.golang.org/grpc" + "github.com/anyproto/anytype-heart/cmd/api" "github.com/anyproto/anytype-heart/core" "github.com/anyproto/anytype-heart/core/event" "github.com/anyproto/anytype-heart/metrics" @@ -227,6 +228,11 @@ func main() { // do not change this, js client relies on this msg to ensure that server is up and parse address fmt.Println(grpcWebStartedMessagePrefix + webaddr) + // run rest api server + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + go api.RunApiServer(ctx, mw) + for { sig := <-signalChan if shouldSaveStack(sig) { diff --git a/core/anytype/bootstrap.go b/core/anytype/bootstrap.go index 9a98a4df1..815de9897 100644 --- a/core/anytype/bootstrap.go +++ b/core/anytype/bootstrap.go @@ -31,7 +31,6 @@ import ( "github.com/anyproto/any-sync/nameservice/nameserviceclient" "github.com/anyproto/any-sync/paymentservice/paymentserviceclient" - "github.com/anyproto/anytype-heart/api" "github.com/anyproto/anytype-heart/core/acl" "github.com/anyproto/anytype-heart/core/anytype/account" "github.com/anyproto/anytype-heart/core/anytype/config" @@ -315,8 +314,7 @@ func Bootstrap(a *app.App, components ...app.Component) { Register(payments.New()). Register(paymentscache.New()). Register(peerstatus.New()). - Register(lastused.New()). - Register(api.New()) + Register(lastused.New()) } func MiddlewareVersion() string { From 3a24c496f07b1d0ce00887fc837b31ad569c342e Mon Sep 17 00:00:00 2001 From: Jannis Metrikat <120120832+jmetrikat@users.noreply.github.com> Date: Sat, 16 Nov 2024 22:27:55 +0100 Subject: [PATCH 004/195] GO-4459 Add demo API client for endpoint testing --- cmd/api/demo/api_demo.go | 109 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 109 insertions(+) create mode 100644 cmd/api/demo/api_demo.go diff --git a/cmd/api/demo/api_demo.go b/cmd/api/demo/api_demo.go new file mode 100644 index 000000000..3752e0a64 --- /dev/null +++ b/cmd/api/demo/api_demo.go @@ -0,0 +1,109 @@ +package main + +import ( + "bytes" + "encoding/json" + "fmt" + "io" + "net/http" + "net/url" + "strings" + + "github.com/anyproto/anytype-heart/pkg/lib/logging" +) + +const ( + baseURL = "http://localhost:31009/v1" + testSpaceId = "bafyreifymx5ucm3fdc7vupfg7wakdo5qelni3jvlmawlnvjcppurn2b3di.2lcu0r85yg10d" // dev (entry space) + testObjectId = "bafyreidhtlbbspxecab6xf4pi5zyxcmvwy6lqzursbjouq5fxovh6y3xwu" // "Work Faster with Templates" + testTypeId = "bafyreifuklfpndjtlekqcjzuaerjtv2mckhn2w6txeumt5kqbthd7qxhui" // Space Member +) + +var log = logging.Logger("rest-api") + +// ReplacePlaceholders replaces placeholders in the endpoint with actual values from parameters. +func ReplacePlaceholders(endpoint string, parameters map[string]interface{}) string { + for key, value := range parameters { + placeholder := fmt.Sprintf("{%s}", key) + endpoint = strings.ReplaceAll(endpoint, placeholder, fmt.Sprintf("%v", value)) + } + + // Parse the base URL + endpoint + u, err := url.Parse(baseURL + endpoint) + if err != nil { + log.Errorf("Failed to parse URL: %v\n", err) + return "" + } + + return u.String() +} + +func main() { + endpoints := []struct { + method string + endpoint string + parameters map[string]interface{} + body map[string]interface{} + }{ + // auth + {"POST", "/auth/displayCode", nil, nil}, + {"GET", "/auth/token?challengeId={challengeId}&code={code}", map[string]interface{}{"challengeId": "6738dfc5cda913aad90e8c2a", "code": "2931"}, nil}, + + // spaces + {"POST", "/spaces", nil, map[string]interface{}{"name": "New Space"}}, + {"GET", "/spaces?limit={limit}&offset={offset}", map[string]interface{}{"limit": 100, "offset": 0}, nil}, + {"GET", "/spaces/{space_id}/members", map[string]interface{}{"space_id": testSpaceId}, nil}, + + // space_objects + {"GET", "/spaces/{space_id}/objects", map[string]interface{}{"space_id": testSpaceId, "limit": 100, "offset": 0}, nil}, + {"GET", "/spaces/{space_id}/objects/{object_id}", map[string]interface{}{"space_id": testSpaceId, "object_id": testObjectId}, nil}, + {"POST", "/spaces/{space_id}/objects", map[string]interface{}{"space_id": testSpaceId}, map[string]interface{}{"name": "New Object"}}, + {"PUT", "/spaces/{space_id}/objects/{object_id}", map[string]interface{}{"space_id": testSpaceId, "object_id": testObjectId}, map[string]interface{}{"name": "Updated Object"}}, + + // types_and_templates + {"GET", "/spaces/{space_id}/objectTypes?limit={limit}&offset={offset}", map[string]interface{}{"space_id": testSpaceId, "limit": 100, "offset": 0}, nil}, + {"GET", "/spaces/{space_id}/objectTypes/{type_id}/templates", map[string]interface{}{"space_id": testSpaceId, "type_id": testTypeId}, nil}, + + // search + {"GET", "/objects?search={search}&object_type={object_type}&limit={limit}&offset={offset}", map[string]interface{}{"search": "term", "object_type": "note", "limit": 100, "offset": 0}, nil}, + } + + for _, ep := range endpoints { + finalURL := ReplacePlaceholders(ep.endpoint, ep.parameters) + + var req *http.Request + var err error + + if ep.body != nil { + body, _ := json.Marshal(ep.body) + req, err = http.NewRequest(ep.method, finalURL, bytes.NewBuffer(body)) + req.Header.Set("Content-Type", "application/json") + } else { + req, err = http.NewRequest(ep.method, finalURL, nil) + } + + if err != nil { + log.Errorf("Failed to create request for %s: %v\n", ep.endpoint, err) + continue + } + + // Execute the HTTP request + client := &http.Client{} + resp, err := client.Do(req) + if err != nil { + log.Errorf("Failed to make request to %s: %v\n", ep.endpoint, err) + continue + } + defer resp.Body.Close() + + // Read the response + body, err := io.ReadAll(resp.Body) + if err != nil { + log.Errorf("Failed to read response body for %s: %v\n", ep.endpoint, err) + continue + } + + // Log the response + log.Infof("Endpoint: %s, Status Code: %d, Body: %s\n", finalURL, resp.StatusCode, string(body)) + } +} From 91d7d5b524bc204be91abc2efe59ee4806ae97a9 Mon Sep 17 00:00:00 2001 From: Jannis Metrikat <120120832+jmetrikat@users.noreply.github.com> Date: Sat, 16 Nov 2024 23:20:41 +0100 Subject: [PATCH 005/195] GO-4459 Fix lint --- cmd/api/demo/api_demo.go | 9 ++++++++- cmd/api/handlers.go | 13 +++++++++---- cmd/api/main.go | 5 +++-- 3 files changed, 20 insertions(+), 7 deletions(-) diff --git a/cmd/api/demo/api_demo.go b/cmd/api/demo/api_demo.go index 3752e0a64..3a5931fc1 100644 --- a/cmd/api/demo/api_demo.go +++ b/cmd/api/demo/api_demo.go @@ -75,8 +75,15 @@ func main() { var err error if ep.body != nil { - body, _ := json.Marshal(ep.body) + body, err := json.Marshal(ep.body) + if err != nil { + log.Errorf("Failed to marshal body for %s: %v\n", ep.endpoint, err) + continue + } req, err = http.NewRequest(ep.method, finalURL, bytes.NewBuffer(body)) + if err != nil { + log.Errorf("Failed to create request for %s: %v\n", ep.endpoint, err) + } req.Header.Set("Content-Type", "application/json") } else { req, err = http.NewRequest(ep.method, finalURL, nil) diff --git a/cmd/api/handlers.go b/cmd/api/handlers.go index 69025afb6..d81aae50e 100644 --- a/cmd/api/handlers.go +++ b/cmd/api/handlers.go @@ -2,7 +2,8 @@ package api import ( "context" - "math/rand" + "crypto/rand" + "math/big" "net/http" "github.com/gin-gonic/gin" @@ -22,7 +23,7 @@ type NameRequest struct { func (a *ApiServer) authDisplayCodeHandler(c *gin.Context) { // Call AccountLocalLinkNewChallenge to display code modal ctx := context.Background() - resp := a.mw.AccountLocalLinkNewChallenge(ctx, &pb.RpcAccountLocalLinkNewChallengeRequest{"api-test"}) + resp := a.mw.AccountLocalLinkNewChallenge(ctx, &pb.RpcAccountLocalLinkNewChallengeRequest{AppName: "api-test"}) if resp.Error.Code != pb.RpcAccountLocalLinkNewChallengeResponseError_NULL { c.JSON(http.StatusInternalServerError, gin.H{"message": "Failed to generate a new challenge."}) @@ -85,12 +86,16 @@ func (a *ApiServer) createSpaceHandler(c *gin.Context) { return } name := nameRequest.Name - iconOption := rand.Intn(13) + iconOption, err := rand.Int(rand.Reader, big.NewInt(13)) + if err != nil { + c.JSON(http.StatusInternalServerError, gin.H{"message": "Failed to generate random icon."}) + return + } resp := a.mw.WorkspaceCreate(context.Background(), &pb.RpcWorkspaceCreateRequest{ Details: &types.Struct{ Fields: map[string]*types.Value{ - "iconOption": {Kind: &types.Value_NumberValue{NumberValue: float64(iconOption)}}, + "iconOption": {Kind: &types.Value_NumberValue{NumberValue: float64(iconOption.Int64())}}, "name": {Kind: &types.Value_StringValue{StringValue: name}}, "spaceDashboardId": {Kind: &types.Value_StringValue{ StringValue: "lastOpened", diff --git a/cmd/api/main.go b/cmd/api/main.go index ded5ae600..f40fb7d5e 100644 --- a/cmd/api/main.go +++ b/cmd/api/main.go @@ -40,8 +40,9 @@ func newApiServer(mw service.ClientCommandsServer) *ApiServer { } a.server = &http.Server{ - Addr: httpPort, - Handler: a.router, + Addr: httpPort, + Handler: a.router, + ReadHeaderTimeout: 5 * time.Second, } return a From 89a17673a7e9c3bfc2ed5c46b63a51444ff91e66 Mon Sep 17 00:00:00 2001 From: AnastasiaShemyakinskaya Date: Mon, 18 Nov 2024 20:18:31 +0100 Subject: [PATCH 006/195] GO-4406: fix for relation options Signed-off-by: AnastasiaShemyakinskaya --- core/block/object/objectcreator/relation_option.go | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/core/block/object/objectcreator/relation_option.go b/core/block/object/objectcreator/relation_option.go index 169a8d415..e4a3c6737 100644 --- a/core/block/object/objectcreator/relation_option.go +++ b/core/block/object/objectcreator/relation_option.go @@ -49,7 +49,12 @@ func (s *service) createRelationOption(ctx context.Context, space clientspace.Sp func getUniqueKeyOrGenerate(sbType coresb.SmartBlockType, details *types.Struct) (domain.UniqueKey, error) { uniqueKey := pbtypes.GetString(details, bundle.RelationKeyUniqueKey.String()) if uniqueKey == "" { - return domain.NewUniqueKey(sbType, bson.NewObjectId().Hex()) + newUniqueKey, err := domain.NewUniqueKey(sbType, bson.NewObjectId().Hex()) + if err != nil { + return nil, err + } + details.Fields[bundle.RelationKeyUniqueKey.String()] = pbtypes.String(newUniqueKey.Marshal()) + return newUniqueKey, err } return domain.UnmarshalUniqueKey(uniqueKey) } From 4e974594b81afbd1e22b3f92bb92c97ae2bed14a Mon Sep 17 00:00:00 2001 From: Jannis Metrikat <120120832+jmetrikat@users.noreply.github.com> Date: Wed, 20 Nov 2024 10:59:59 +0100 Subject: [PATCH 007/195] GO-4459 Add schemas --- cmd/api/schemas.go | 92 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 92 insertions(+) create mode 100644 cmd/api/schemas.go diff --git a/cmd/api/schemas.go b/cmd/api/schemas.go new file mode 100644 index 000000000..36840c0c9 --- /dev/null +++ b/cmd/api/schemas.go @@ -0,0 +1,92 @@ +package api + +type Space struct { + Type string `json:"type" example:"space"` + ID string `json:"id"` + HomeObjectID string `json:"home_object_id" example:"bafyreie4qcl3wczb4cw5hrfyycikhjyh6oljdis3ewqrk5boaav3sbwqya"` + ArchiveObjectID string `json:"archive_object_id" example:"bafyreialsgoyflf3etjm3parzurivyaukzivwortf32b4twnlwpwocsrri"` + ProfileObjectID string `json:"profile_object_id" example:"bafyreiaxhwreshjqwndpwtdsu4mtihaqhhmlygqnyqpfyfwlqfq3rm3gw4"` + MarketplaceWorkspaceID string `json:"marketplace_workspace_id" example:"_anytype_marketplace"` + DeviceID string `json:"device_id" example:"12D3KooWGZMJ4kQVyQVXaj7gJPZr3RZ2nvd9M2Eq2pprEoPih9WF"` + AccountSpaceID string `json:"account_space_id" example:"bafyreihpd2knon5wbljhtfeg3fcqtg3i2pomhhnigui6lrjmzcjzep7gcy.23me69r569oi1"` + WidgetsID string `json:"widgets_id" example:"bafyreialj7pceh53mifm5dixlho47ke4qjmsn2uh4wsjf7xq2pnlo5xfva"` + SpaceViewID string `json:"space_view_id" example:"bafyreigzv3vq7qwlrsin6njoduq727ssnhwd6bgyfj6nm4hv3pxoc2rxhy"` + TechSpaceID string `json:"tech_space_id" example:"bafyreif4xuwncrjl6jajt4zrrfnylpki476nv2w64yf42ovt7gia7oypii.23me69r569oi1"` + Timezone string `json:"timezone" example:""` + NetworkID string `json:"network_id" example:"N83gJpVd9MuNRZAuJLZ7LiMntTThhPc6DtzWWVjb1M3PouVU"` +} + +type SpaceMember struct { + Type string `json:"type" example:"space_member"` + ID string `json:"id"` + Name string `json:"name" example:""` + Role string `json:"role" enum:"editor,viewer,owner"` +} + +type Object struct { + Type string `json:"type" example:"object"` + ID string `json:"id"` + ObjectType string `json:"object_type" example:"note"` + RootID string `json:"root_id"` + Blocks []Block `json:"blocks"` + Details []Detail `json:"details"` + RelationLinksList []RelationLink `json:"relation_links_list"` +} + +type Block struct { + ID string `json:"id"` + ChildrenIDs []string `json:"children_ids"` + BackgroundColor string `json:"background_color"` + Align string `json:"align"` + VerticalAlign string `json:"verticalalign"` + Layout Layout `json:"layout"` + Text Text `json:"text"` + File File `json:"file"` +} + +type Layout struct { + Style string `json:"style"` +} + +type Text struct { + Text string `json:"text"` + Style string `json:"style"` + Checked bool `json:"checked"` + Color string `json:"color"` + IconEmoji string `json:"iconemoji"` + IconImage string `json:"iconimage"` +} + +type File struct { + Hash string `json:"hash"` + Name string `json:"name"` + Type string `json:"type"` + Mime string `json:"mime"` + Size int `json:"size"` + AddedAt int `json:"addedat"` + TargetObjectID string `json:"targetobjectid"` + State int `json:"state"` + Style int `json:"style"` +} + +type Detail struct { + ID string `json:"id"` + Details map[string]interface{} `json:"details"` +} + +type RelationLink struct { + Key string `json:"key"` + Format string `json:"format"` +} + +type ObjectType struct { + Type string `json:"type" example:"object_type"` + ID string `json:"id"` + Name string `json:"name"` +} + +type ObjectTemplate struct { + Type string `json:"type" example:"object_template"` + ID string `json:"id"` + Name string `json:"name"` +} From 66ae28ebc7cc0d80af577e620f4368d8814cdb30 Mon Sep 17 00:00:00 2001 From: Jannis Metrikat <120120832+jmetrikat@users.noreply.github.com> Date: Wed, 20 Nov 2024 14:50:16 +0100 Subject: [PATCH 008/195] GO-4459 Fetch AccountInfo internally and enhance space/member response structures --- cmd/api/handlers.go | 54 ++++++++++++++++++++++++++++++++---------- cmd/api/helper.go | 39 +++++++----------------------- cmd/api/main.go | 31 ++++++++---------------- cmd/api/middleware.go | 16 +++++++++++++ cmd/api/schemas.go | 1 + cmd/grpcserver/grpc.go | 3 ++- core/core.go | 13 ++++++++++ 7 files changed, 91 insertions(+), 66 deletions(-) diff --git a/cmd/api/handlers.go b/cmd/api/handlers.go index d81aae50e..d528ca7d7 100644 --- a/cmd/api/handlers.go +++ b/cmd/api/handlers.go @@ -68,13 +68,42 @@ func (a *ApiServer) getSpacesHandler(c *gin.Context) { Value: pbtypes.Int64(int64(model.SpaceStatus_Ok)), }, }, - Keys: []string{"id", "spaceId", "name", "description", "snippet", "iconEmoji", "iconImage", "iconOption", "relationFormat", "type", "layout", "isHidden", "isArchived", "isReadonly", "isDeleted", "isFavorite", "done", "fileExt", "fileMimeType", "sizeInBytes", "restrictions", "defaultTemplateId", "createdDate", "spaceDashboardId", "spaceAccountStatus", "spaceLocalStatus", "spaceAccessType", "readersLimit", "writersLimit", "targetSpaceId", "creator", "chatId", "identity", "participantPermissions", "participantStatus", "globalName"}, }) if resp.Error.Code != pb.RpcObjectSearchResponseError_NULL { c.JSON(http.StatusInternalServerError, gin.H{"message": "Failed to retrieve list of spaces."}) return } - c.JSON(http.StatusOK, gin.H{"spaces": resp.Records}) + + // Convert the response to a list of spaces with their details: type, id, homeObjectID, archiveObjectID, profileObjectID, marketplaceWorkspaceID, deviceID, accountSpaceID, widgetsID, spaceViewID, techSpaceID, timezone, networkID + spaces := make([]Space, 0, len(resp.Records)) + for _, record := range resp.Records { + typeName, err := a.resolveTypeToName(record.Fields["targetSpaceId"].GetStringValue(), "ot-space") + if err != nil { + c.JSON(http.StatusInternalServerError, gin.H{"message": "Failed to resolve type to name."}) + return + } + + // TODO: Populate missing fields + space := Space{ + Type: typeName, + ID: record.Fields["id"].GetStringValue(), + Name: record.Fields["name"].GetStringValue(), + HomeObjectID: record.Fields["spaceDashboardId"].GetStringValue(), + // ArchiveObjectID: record.Fields["archive_object_id"].GetStringValue(), + // ProfileObjectID: record.Fields["profile_object_id"].GetStringValue(), + // MarketplaceWorkspaceID: record.Fields["marketplace_workspace_id"].GetStringValue(), + // DeviceID: record.Fields["device_id"].GetStringValue(), + // AccountSpaceID: record.Fields["account_space_id"].GetStringValue(), + // WidgetsID: record.Fields["widgets_id"].GetStringValue(), + // SpaceViewID: record.Fields["space_view_id"].GetStringValue(), + TechSpaceID: a.accountInfo.TechSpaceId, + // Timezone: record.Fields["timezone"].GetStringValue(), + // NetworkID: record.Fields["network_id"].GetStringValue(), + } + spaces = append(spaces, space) + } + + c.JSON(http.StatusOK, gin.H{"spaces": spaces}) } // /v1/spaces [POST] @@ -135,24 +164,23 @@ func (a *ApiServer) getSpaceMembersHandler(c *gin.Context) { return } - // Convert the response to a list of members with their details: type, identity, name, role - members := []gin.H{} + // Convert the response to a slice of SpaceMember structs with their details: type, identity, name, role + members := make([]SpaceMember, 0, len(resp.Records)) for _, record := range resp.Records { - identity := record.Fields["identity"].GetStringValue() - name := record.Fields["name"].GetStringValue() - role := record.Fields["participantPermissions"].GetNumberValue() typeName, err := a.resolveTypeToName(spaceId, record.Fields["type"].GetStringValue()) if err != nil { c.JSON(http.StatusInternalServerError, gin.H{"message": "Failed to resolve type to name."}) return } - members = append(members, gin.H{ - "type": typeName, - "identity": identity, - "name": name, - "role": model.ParticipantPermissions_name[int32(role)], - }) + member := SpaceMember{ + Type: typeName, + ID: record.Fields["identity"].GetStringValue(), + Name: record.Fields["name"].GetStringValue(), + Role: model.ParticipantPermissions_name[int32(record.Fields["participantPermissions"].GetNumberValue())], + } + + members = append(members, member) } c.JSON(http.StatusOK, gin.H{"members": members}) diff --git a/cmd/api/helper.go b/cmd/api/helper.go index c167e231d..8da3d5eb4 100644 --- a/cmd/api/helper.go +++ b/cmd/api/helper.go @@ -2,6 +2,7 @@ package api import ( "context" + "strings" "github.com/anyproto/anytype-heart/pb" "github.com/anyproto/anytype-heart/pkg/lib/bundle" @@ -9,43 +10,19 @@ import ( "github.com/anyproto/anytype-heart/util/pbtypes" ) -// func (a *ApiServer) setInitialParameters(ctx context.Context) { -// resp := a.mw.InitialSetParameters(ctx, &pb.RpcInitialSetParametersRequest{ -// DoNotSaveLogs: false, -// DoNotSendLogs: false, -// DoNotSendTelemetry: false, -// LogLevel: "", -// Platform: "", -// Version: "0.0.1", -// Workdir: "", -// }) -// -// if resp.Error.Code != pb.RpcInitialSetParametersResponseError_NULL { -// fmt.Printf("failed to set initial parameters: %v\n", resp.Error.Description) -// return -// } -// } -// -// func (a *ApiServer) getAccountInfo(ctx context.Context, accountId string) { -// resp := a.mw.AccountSelect(ctx, &pb.RpcAccountSelectRequest{ -// Id: accountId, -// }) -// -// if resp.Error.Code != pb.RpcAccountSelectResponseError_NULL { -// fmt.Printf("failed to get account info: %v\n", resp.Error.Description) -// return -// } -// -// a.accountInfo = resp.Account.Info -// } - func (a *ApiServer) resolveTypeToName(spaceId string, typeId string) (string, *pb.RpcObjectSearchResponseError) { + // Can't look up preinstalled types based on relation key, therefore need to use unique key + relKey := bundle.RelationKeyId.String() + if strings.Contains(typeId, "ot-") { + relKey = bundle.RelationKeyUniqueKey.String() + } + // Call ObjectSearch for object of specified type and return the name resp := a.mw.ObjectSearch(context.Background(), &pb.RpcObjectSearchRequest{ SpaceId: spaceId, Filters: []*model.BlockContentDataviewFilter{ { - RelationKey: bundle.RelationKeyId.String(), + RelationKey: relKey, Condition: model.BlockContentDataviewFilter_Equal, Value: pbtypes.String(typeId), }, diff --git a/cmd/api/main.go b/cmd/api/main.go index f40fb7d5e..fd57c5b19 100644 --- a/cmd/api/main.go +++ b/cmd/api/main.go @@ -8,6 +8,7 @@ import ( "github.com/gin-gonic/gin" + "github.com/anyproto/anytype-heart/core" "github.com/anyproto/anytype-heart/pb/service" "github.com/anyproto/anytype-heart/pkg/lib/pb/model" ) @@ -19,6 +20,7 @@ const ( type ApiServer struct { mw service.ClientCommandsServer + mwInternal core.MiddlewareInternal router *gin.Engine server *http.Server accountInfo model.AccountInfo @@ -30,13 +32,12 @@ type User struct { Permissions string // "read-only" or "read-write" } -func newApiServer(mw service.ClientCommandsServer) *ApiServer { +func newApiServer(mw service.ClientCommandsServer, mwInternal core.MiddlewareInternal) *ApiServer { a := &ApiServer{ - mw: mw, - router: gin.New(), - accountInfo: model.AccountInfo{ - TechSpaceId: "bafyreidken4zbd7p2ai6h4bgowudxbhzop4f4fewctm77f43qn5mzhsrje.2lcu0r85yg10d", - }, + mw: mw, + mwInternal: mwInternal, + router: gin.New(), + accountInfo: model.AccountInfo{}, } a.server = &http.Server{ @@ -48,10 +49,9 @@ func newApiServer(mw service.ClientCommandsServer) *ApiServer { return a } -func RunApiServer(ctx context.Context, mw service.ClientCommandsServer) { - a := newApiServer(mw) - // a.setInitialParameters(ctx) - // a.getAccountInfo(ctx, "AAHTtt8wuQEnaYBNZ1Cyfcvs6DqPqxgn8VXDVk4avsUkMuha") +func RunApiServer(ctx context.Context, mw service.ClientCommandsServer, mwInternal core.MiddlewareInternal) { + a := newApiServer(mw, mwInternal) + a.router.Use(a.EnsureAccountInfoMiddleware()) // Unprotected routes auth := a.router.Group("/v1/auth") @@ -101,14 +101,3 @@ func RunApiServer(ctx context.Context, mw service.ClientCommandsServer) { fmt.Println("server shutdown failed: %w", err) } } - -// func newClient(port string) (service.ClientCommandsClient, error) { -// ctx, cancel := context.WithTimeout(context.Background(), 1*time.Second) -// defer cancel() -// conn, err := grpc.DialContext(ctx, ":"+port, grpc.WithBlock(), grpc.WithTransportCredentials(insecure.NewCredentials())) -// if err != nil { -// return nil, err -// } -// -// return service.NewClientCommandsClient(conn), nil -// } diff --git a/cmd/api/middleware.go b/cmd/api/middleware.go index 9bd81c726..cc7110514 100644 --- a/cmd/api/middleware.go +++ b/cmd/api/middleware.go @@ -1,11 +1,27 @@ package api import ( + "context" "net/http" "github.com/gin-gonic/gin" ) +// Middleware to ensure account info is filled before each request +func (a *ApiServer) EnsureAccountInfoMiddleware() gin.HandlerFunc { + return func(c *gin.Context) { + if a.accountInfo.TechSpaceId == "" { + accountInfo, err := a.mwInternal.GetAccountInfo(context.Background()) + if err != nil { + c.AbortWithStatusJSON(http.StatusInternalServerError, gin.H{"error": "Failed to get account info"}) + return + } + a.accountInfo = *accountInfo + } + c.Next() + } +} + // Middleware to authenticate requests and add user info to context func (a *ApiServer) AuthMiddleware() gin.HandlerFunc { return func(c *gin.Context) { diff --git a/cmd/api/schemas.go b/cmd/api/schemas.go index 36840c0c9..01babb22d 100644 --- a/cmd/api/schemas.go +++ b/cmd/api/schemas.go @@ -3,6 +3,7 @@ package api type Space struct { Type string `json:"type" example:"space"` ID string `json:"id"` + Name string `json:"name" example:"Space Name"` HomeObjectID string `json:"home_object_id" example:"bafyreie4qcl3wczb4cw5hrfyycikhjyh6oljdis3ewqrk5boaav3sbwqya"` ArchiveObjectID string `json:"archive_object_id" example:"bafyreialsgoyflf3etjm3parzurivyaukzivwortf32b4twnlwpwocsrri"` ProfileObjectID string `json:"profile_object_id" example:"bafyreiaxhwreshjqwndpwtdsu4mtihaqhhmlygqnyqpfyfwlqfq3rm3gw4"` diff --git a/cmd/grpcserver/grpc.go b/cmd/grpcserver/grpc.go index 0bc6412c8..0ef4c2194 100644 --- a/cmd/grpcserver/grpc.go +++ b/cmd/grpcserver/grpc.go @@ -229,9 +229,10 @@ func main() { fmt.Println(grpcWebStartedMessagePrefix + webaddr) // run rest api server + var mwInternal core.MiddlewareInternal = mw ctx, cancel := context.WithCancel(context.Background()) defer cancel() - go api.RunApiServer(ctx, mw) + go api.RunApiServer(ctx, mw, mwInternal) for { sig := <-signalChan diff --git a/core/core.go b/core/core.go index 86cef1cb8..5713d9aaa 100644 --- a/core/core.go +++ b/core/core.go @@ -7,6 +7,7 @@ import ( "github.com/anyproto/any-sync/app" + "github.com/anyproto/anytype-heart/core/anytype/account" "github.com/anyproto/anytype-heart/core/application" "github.com/anyproto/anytype-heart/core/block" "github.com/anyproto/anytype-heart/core/block/collection" @@ -14,6 +15,7 @@ import ( "github.com/anyproto/anytype-heart/core/wallet" "github.com/anyproto/anytype-heart/pb" "github.com/anyproto/anytype-heart/pkg/lib/logging" + "github.com/anyproto/anytype-heart/pkg/lib/pb/model" utildebug "github.com/anyproto/anytype-heart/util/debug" ) @@ -23,6 +25,10 @@ var ( ErrNotLoggedIn = errors.New("not logged in") ) +type MiddlewareInternal interface { + GetAccountInfo(ctx context.Context) (*model.AccountInfo, error) +} + type Middleware struct { applicationService *application.Service } @@ -92,6 +98,13 @@ func (mw *Middleware) GetApp() *app.App { return mw.applicationService.GetApp() } +func (mw *Middleware) GetAccountInfo(ctx context.Context) (*model.AccountInfo, error) { + if a := mw.GetApp(); a != nil { + return a.MustComponent(account.CName).(account.Service).GetInfo(ctx) + } + return nil, ErrNotLoggedIn +} + func (mw *Middleware) SetEventSender(sender event.Sender) { mw.applicationService.SetEventSender(sender) } From 6d9742fae985388e01239806ddde6e967e83b3f1 Mon Sep 17 00:00:00 2001 From: Jannis Metrikat <120120832+jmetrikat@users.noreply.github.com> Date: Wed, 20 Nov 2024 15:38:56 +0100 Subject: [PATCH 009/195] =?UTF-8?q?GO-4459=C2=A0Add=20swagger=20codegen=20?= =?UTF-8?q?for=20API=20docs?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- cmd/api/docs/docs.go | 1007 +++++++++++++++++++++++++++++++++++++ cmd/api/docs/swagger.json | 983 ++++++++++++++++++++++++++++++++++++ cmd/api/docs/swagger.yaml | 657 ++++++++++++++++++++++++ cmd/api/handlers.go | 140 +++++- cmd/api/main.go | 28 +- cmd/api/schemas.go | 24 + go.mod | 29 +- go.sum | 57 +++ 8 files changed, 2903 insertions(+), 22 deletions(-) create mode 100644 cmd/api/docs/docs.go create mode 100644 cmd/api/docs/swagger.json create mode 100644 cmd/api/docs/swagger.yaml diff --git a/cmd/api/docs/docs.go b/cmd/api/docs/docs.go new file mode 100644 index 000000000..611ff14c7 --- /dev/null +++ b/cmd/api/docs/docs.go @@ -0,0 +1,1007 @@ +// Package docs Code generated by swaggo/swag. DO NOT EDIT +package docs + +import "github.com/swaggo/swag" + +const docTemplate = `{ + "schemes": {{ marshal .Schemes }}, + "swagger": "2.0", + "info": { + "description": "{{escape .Description}}", + "title": "{{.Title}}", + "termsOfService": "https://anytype.io/terms_of_use", + "contact": { + "name": "Anytype Support", + "url": "https://anytype.io/contact", + "email": "support@anytype.io" + }, + "license": { + "name": "Apache 2.0", + "url": "http://www.apache.org/licenses/LICENSE-2.0.html" + }, + "version": "{{.Version}}" + }, + "host": "{{.Host}}", + "basePath": "{{.BasePath}}", + "paths": { + "/auth/displayCode": { + "post": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "auth" + ], + "summary": "Open a modal window with a code in Anytype Desktop app", + "responses": { + "200": { + "description": "Success", + "schema": { + "type": "string" + } + }, + "502": { + "description": "Internal server error", + "schema": { + "$ref": "#/definitions/api.ServerError" + } + } + } + } + }, + "/auth/token": { + "get": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "auth" + ], + "summary": "Retrieve an authentication token using a code", + "parameters": [ + { + "type": "string", + "description": "The code retrieved from Anytype Desktop app", + "name": "code", + "in": "query", + "required": true + } + ], + "responses": { + "200": { + "description": "Access and refresh tokens", + "schema": { + "type": "object", + "additionalProperties": { + "type": "string" + } + } + }, + "400": { + "description": "Invalid input", + "schema": { + "$ref": "#/definitions/api.ValidationError" + } + }, + "502": { + "description": "Internal server error", + "schema": { + "$ref": "#/definitions/api.ServerError" + } + } + } + } + }, + "/objects": { + "get": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "search" + ], + "summary": "Search and retrieve objects across all the spaces", + "parameters": [ + { + "type": "string", + "description": "The search term to filter objects by name", + "name": "search", + "in": "query" + }, + { + "type": "string", + "description": "Specify object type for search", + "name": "object_type", + "in": "query" + }, + { + "type": "integer", + "description": "The number of items to skip before starting to collect the result set", + "name": "offset", + "in": "query" + }, + { + "type": "integer", + "default": 100, + "description": "The number of items to return", + "name": "limit", + "in": "query" + } + ], + "responses": { + "200": { + "description": "Total objects and object list", + "schema": { + "type": "object", + "additionalProperties": true + } + }, + "403": { + "description": "Unauthorized", + "schema": { + "$ref": "#/definitions/api.UnauthorizedError" + } + }, + "502": { + "description": "Internal server error", + "schema": { + "$ref": "#/definitions/api.ServerError" + } + } + } + } + }, + "/spaces": { + "get": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "spaces" + ], + "summary": "Retrieve a list of spaces", + "parameters": [ + { + "type": "integer", + "description": "The number of items to skip before starting to collect the result set", + "name": "offset", + "in": "query" + }, + { + "type": "integer", + "default": 100, + "description": "The number of items to return", + "name": "limit", + "in": "query" + } + ], + "responses": { + "200": { + "description": "List of spaces", + "schema": { + "type": "object", + "additionalProperties": { + "type": "array", + "items": { + "$ref": "#/definitions/api.Space" + } + } + } + }, + "403": { + "description": "Unauthorized", + "schema": { + "$ref": "#/definitions/api.UnauthorizedError" + } + }, + "502": { + "description": "Internal server error", + "schema": { + "$ref": "#/definitions/api.ServerError" + } + } + } + }, + "post": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "spaces" + ], + "summary": "Create a new Space", + "parameters": [ + { + "description": "Space Name", + "name": "name", + "in": "body", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "Space created successfully", + "schema": { + "$ref": "#/definitions/api.Space" + } + }, + "403": { + "description": "Unauthorized", + "schema": { + "$ref": "#/definitions/api.UnauthorizedError" + } + }, + "502": { + "description": "Internal server error", + "schema": { + "$ref": "#/definitions/api.ServerError" + } + } + } + } + }, + "/spaces/{space_id}/members": { + "get": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "spaces" + ], + "summary": "Retrieve a list of members for the specified Space", + "parameters": [ + { + "type": "string", + "description": "The ID of the space", + "name": "space_id", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "List of members", + "schema": { + "type": "object", + "additionalProperties": { + "type": "array", + "items": { + "$ref": "#/definitions/api.SpaceMember" + } + } + } + }, + "403": { + "description": "Unauthorized", + "schema": { + "$ref": "#/definitions/api.UnauthorizedError" + } + }, + "404": { + "description": "Resource not found", + "schema": { + "$ref": "#/definitions/api.NotFoundError" + } + }, + "502": { + "description": "Internal server error", + "schema": { + "$ref": "#/definitions/api.ServerError" + } + } + } + } + }, + "/spaces/{space_id}/objectTypes": { + "get": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "types_and_templates" + ], + "summary": "Retrieve object types in a specific space", + "parameters": [ + { + "type": "string", + "description": "The ID of the space", + "name": "space_id", + "in": "path", + "required": true + }, + { + "type": "integer", + "description": "The number of items to skip before starting to collect the result set", + "name": "offset", + "in": "query" + }, + { + "type": "integer", + "default": 100, + "description": "The number of items to return", + "name": "limit", + "in": "query" + } + ], + "responses": { + "200": { + "description": "Total and object types", + "schema": { + "type": "object", + "additionalProperties": true + } + }, + "403": { + "description": "Unauthorized", + "schema": { + "$ref": "#/definitions/api.UnauthorizedError" + } + }, + "404": { + "description": "Resource not found", + "schema": { + "$ref": "#/definitions/api.NotFoundError" + } + }, + "502": { + "description": "Internal server error", + "schema": { + "$ref": "#/definitions/api.ServerError" + } + } + } + } + }, + "/spaces/{space_id}/objectTypes/{typeId}/templates": { + "get": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "types_and_templates" + ], + "summary": "Retrieve a list of templates for a specific object type in a space", + "parameters": [ + { + "type": "string", + "description": "The ID of the space", + "name": "space_id", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "The ID of the object type", + "name": "typeId", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "List of templates", + "schema": { + "type": "object", + "additionalProperties": { + "type": "array", + "items": { + "$ref": "#/definitions/api.ObjectTemplate" + } + } + } + }, + "403": { + "description": "Unauthorized", + "schema": { + "$ref": "#/definitions/api.UnauthorizedError" + } + }, + "404": { + "description": "Resource not found", + "schema": { + "$ref": "#/definitions/api.NotFoundError" + } + }, + "502": { + "description": "Internal server error", + "schema": { + "$ref": "#/definitions/api.ServerError" + } + } + } + } + }, + "/spaces/{space_id}/objects": { + "get": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "space_objects" + ], + "summary": "Retrieve objects in a specific space", + "parameters": [ + { + "type": "string", + "description": "The ID of the space", + "name": "space_id", + "in": "path", + "required": true + }, + { + "type": "integer", + "description": "The number of items to skip before starting to collect the result set", + "name": "offset", + "in": "query" + }, + { + "type": "integer", + "default": 100, + "description": "The number of items to return", + "name": "limit", + "in": "query" + } + ], + "responses": { + "200": { + "description": "Total objects and object list", + "schema": { + "type": "object", + "additionalProperties": true + } + }, + "403": { + "description": "Unauthorized", + "schema": { + "$ref": "#/definitions/api.UnauthorizedError" + } + }, + "404": { + "description": "Resource not found", + "schema": { + "$ref": "#/definitions/api.NotFoundError" + } + }, + "502": { + "description": "Internal server error", + "schema": { + "$ref": "#/definitions/api.ServerError" + } + } + } + }, + "post": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "space_objects" + ], + "summary": "Create a new object in a specific space", + "parameters": [ + { + "type": "string", + "description": "The ID of the space", + "name": "space_id", + "in": "path", + "required": true + }, + { + "description": "Object details (e.g., name)", + "name": "object", + "in": "body", + "required": true, + "schema": { + "type": "object", + "additionalProperties": { + "type": "string" + } + } + } + ], + "responses": { + "200": { + "description": "The created object", + "schema": { + "$ref": "#/definitions/api.Object" + } + }, + "403": { + "description": "Unauthorized", + "schema": { + "$ref": "#/definitions/api.UnauthorizedError" + } + }, + "502": { + "description": "Internal server error", + "schema": { + "$ref": "#/definitions/api.ServerError" + } + } + } + } + }, + "/spaces/{space_id}/objects/{object_id}": { + "get": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "space_objects" + ], + "summary": "Retrieve a specific object in a space", + "parameters": [ + { + "type": "string", + "description": "The ID of the space", + "name": "space_id", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "The ID of the object", + "name": "object_id", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "The requested object", + "schema": { + "$ref": "#/definitions/api.Object" + } + }, + "403": { + "description": "Unauthorized", + "schema": { + "$ref": "#/definitions/api.UnauthorizedError" + } + }, + "404": { + "description": "Resource not found", + "schema": { + "$ref": "#/definitions/api.NotFoundError" + } + }, + "502": { + "description": "Internal server error", + "schema": { + "$ref": "#/definitions/api.ServerError" + } + } + } + }, + "put": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "space_objects" + ], + "summary": "Update an existing object in a specific space", + "parameters": [ + { + "type": "string", + "description": "The ID of the space", + "name": "space_id", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "The ID of the object", + "name": "object_id", + "in": "path", + "required": true + }, + { + "description": "The updated object details", + "name": "object", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/api.Object" + } + } + ], + "responses": { + "200": { + "description": "The updated object", + "schema": { + "$ref": "#/definitions/api.Object" + } + }, + "403": { + "description": "Unauthorized", + "schema": { + "$ref": "#/definitions/api.UnauthorizedError" + } + }, + "404": { + "description": "Resource not found", + "schema": { + "$ref": "#/definitions/api.NotFoundError" + } + }, + "502": { + "description": "Internal server error", + "schema": { + "$ref": "#/definitions/api.ServerError" + } + } + } + } + } + }, + "definitions": { + "api.Block": { + "type": "object", + "properties": { + "align": { + "type": "string" + }, + "background_color": { + "type": "string" + }, + "children_ids": { + "type": "array", + "items": { + "type": "string" + } + }, + "file": { + "$ref": "#/definitions/api.File" + }, + "id": { + "type": "string" + }, + "layout": { + "$ref": "#/definitions/api.Layout" + }, + "text": { + "$ref": "#/definitions/api.Text" + }, + "verticalalign": { + "type": "string" + } + } + }, + "api.Detail": { + "type": "object", + "properties": { + "details": { + "type": "object", + "additionalProperties": true + }, + "id": { + "type": "string" + } + } + }, + "api.File": { + "type": "object", + "properties": { + "addedat": { + "type": "integer" + }, + "hash": { + "type": "string" + }, + "mime": { + "type": "string" + }, + "name": { + "type": "string" + }, + "size": { + "type": "integer" + }, + "state": { + "type": "integer" + }, + "style": { + "type": "integer" + }, + "targetobjectid": { + "type": "string" + }, + "type": { + "type": "string" + } + } + }, + "api.Layout": { + "type": "object", + "properties": { + "style": { + "type": "string" + } + } + }, + "api.NotFoundError": { + "type": "object", + "properties": { + "error": { + "type": "object", + "properties": { + "message": { + "type": "string" + } + } + } + } + }, + "api.Object": { + "type": "object", + "properties": { + "blocks": { + "type": "array", + "items": { + "$ref": "#/definitions/api.Block" + } + }, + "details": { + "type": "array", + "items": { + "$ref": "#/definitions/api.Detail" + } + }, + "id": { + "type": "string" + }, + "object_type": { + "type": "string", + "example": "note" + }, + "relation_links_list": { + "type": "array", + "items": { + "$ref": "#/definitions/api.RelationLink" + } + }, + "root_id": { + "type": "string" + }, + "type": { + "type": "string", + "example": "object" + } + } + }, + "api.ObjectTemplate": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "type": { + "type": "string", + "example": "object_template" + } + } + }, + "api.RelationLink": { + "type": "object", + "properties": { + "format": { + "type": "string" + }, + "key": { + "type": "string" + } + } + }, + "api.ServerError": { + "type": "object", + "properties": { + "error": { + "type": "object", + "properties": { + "message": { + "type": "string" + } + } + } + } + }, + "api.Space": { + "type": "object", + "properties": { + "account_space_id": { + "type": "string", + "example": "bafyreihpd2knon5wbljhtfeg3fcqtg3i2pomhhnigui6lrjmzcjzep7gcy.23me69r569oi1" + }, + "archive_object_id": { + "type": "string", + "example": "bafyreialsgoyflf3etjm3parzurivyaukzivwortf32b4twnlwpwocsrri" + }, + "device_id": { + "type": "string", + "example": "12D3KooWGZMJ4kQVyQVXaj7gJPZr3RZ2nvd9M2Eq2pprEoPih9WF" + }, + "home_object_id": { + "type": "string", + "example": "bafyreie4qcl3wczb4cw5hrfyycikhjyh6oljdis3ewqrk5boaav3sbwqya" + }, + "id": { + "type": "string" + }, + "marketplace_workspace_id": { + "type": "string", + "example": "_anytype_marketplace" + }, + "name": { + "type": "string", + "example": "Space Name" + }, + "network_id": { + "type": "string", + "example": "N83gJpVd9MuNRZAuJLZ7LiMntTThhPc6DtzWWVjb1M3PouVU" + }, + "profile_object_id": { + "type": "string", + "example": "bafyreiaxhwreshjqwndpwtdsu4mtihaqhhmlygqnyqpfyfwlqfq3rm3gw4" + }, + "space_view_id": { + "type": "string", + "example": "bafyreigzv3vq7qwlrsin6njoduq727ssnhwd6bgyfj6nm4hv3pxoc2rxhy" + }, + "tech_space_id": { + "type": "string", + "example": "bafyreif4xuwncrjl6jajt4zrrfnylpki476nv2w64yf42ovt7gia7oypii.23me69r569oi1" + }, + "timezone": { + "type": "string", + "example": "" + }, + "type": { + "type": "string", + "example": "space" + }, + "widgets_id": { + "type": "string", + "example": "bafyreialj7pceh53mifm5dixlho47ke4qjmsn2uh4wsjf7xq2pnlo5xfva" + } + } + }, + "api.SpaceMember": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "name": { + "type": "string", + "example": "" + }, + "role": { + "type": "string" + }, + "type": { + "type": "string", + "example": "space_member" + } + } + }, + "api.Text": { + "type": "object", + "properties": { + "checked": { + "type": "boolean" + }, + "color": { + "type": "string" + }, + "iconemoji": { + "type": "string" + }, + "iconimage": { + "type": "string" + }, + "style": { + "type": "string" + }, + "text": { + "type": "string" + } + } + }, + "api.UnauthorizedError": { + "type": "object", + "properties": { + "error": { + "type": "object", + "properties": { + "message": { + "type": "string" + } + } + } + } + }, + "api.ValidationError": { + "type": "object", + "properties": { + "error": { + "type": "object", + "properties": { + "message": { + "type": "string" + } + } + } + } + } + }, + "securityDefinitions": { + "BasicAuth": { + "type": "basic" + } + }, + "externalDocs": { + "description": "OpenAPI", + "url": "https://swagger.io/resources/open-api/" + } +}` + +// SwaggerInfo holds exported Swagger Info so clients can modify it +var SwaggerInfo = &swag.Spec{ + Version: "1.0", + Host: "localhost:31009", + BasePath: "/v1", + Schemes: []string{}, + Title: "Anytype API", + Description: "This API allows interaction with Anytype resources such as spaces, objects, and object types.", + InfoInstanceName: "swagger", + SwaggerTemplate: docTemplate, + LeftDelim: "{{", + RightDelim: "}}", +} + +func init() { + swag.Register(SwaggerInfo.InstanceName(), SwaggerInfo) +} diff --git a/cmd/api/docs/swagger.json b/cmd/api/docs/swagger.json new file mode 100644 index 000000000..e57cb5ecd --- /dev/null +++ b/cmd/api/docs/swagger.json @@ -0,0 +1,983 @@ +{ + "swagger": "2.0", + "info": { + "description": "This API allows interaction with Anytype resources such as spaces, objects, and object types.", + "title": "Anytype API", + "termsOfService": "https://anytype.io/terms_of_use", + "contact": { + "name": "Anytype Support", + "url": "https://anytype.io/contact", + "email": "support@anytype.io" + }, + "license": { + "name": "Apache 2.0", + "url": "http://www.apache.org/licenses/LICENSE-2.0.html" + }, + "version": "1.0" + }, + "host": "localhost:31009", + "basePath": "/v1", + "paths": { + "/auth/displayCode": { + "post": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "auth" + ], + "summary": "Open a modal window with a code in Anytype Desktop app", + "responses": { + "200": { + "description": "Success", + "schema": { + "type": "string" + } + }, + "502": { + "description": "Internal server error", + "schema": { + "$ref": "#/definitions/api.ServerError" + } + } + } + } + }, + "/auth/token": { + "get": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "auth" + ], + "summary": "Retrieve an authentication token using a code", + "parameters": [ + { + "type": "string", + "description": "The code retrieved from Anytype Desktop app", + "name": "code", + "in": "query", + "required": true + } + ], + "responses": { + "200": { + "description": "Access and refresh tokens", + "schema": { + "type": "object", + "additionalProperties": { + "type": "string" + } + } + }, + "400": { + "description": "Invalid input", + "schema": { + "$ref": "#/definitions/api.ValidationError" + } + }, + "502": { + "description": "Internal server error", + "schema": { + "$ref": "#/definitions/api.ServerError" + } + } + } + } + }, + "/objects": { + "get": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "search" + ], + "summary": "Search and retrieve objects across all the spaces", + "parameters": [ + { + "type": "string", + "description": "The search term to filter objects by name", + "name": "search", + "in": "query" + }, + { + "type": "string", + "description": "Specify object type for search", + "name": "object_type", + "in": "query" + }, + { + "type": "integer", + "description": "The number of items to skip before starting to collect the result set", + "name": "offset", + "in": "query" + }, + { + "type": "integer", + "default": 100, + "description": "The number of items to return", + "name": "limit", + "in": "query" + } + ], + "responses": { + "200": { + "description": "Total objects and object list", + "schema": { + "type": "object", + "additionalProperties": true + } + }, + "403": { + "description": "Unauthorized", + "schema": { + "$ref": "#/definitions/api.UnauthorizedError" + } + }, + "502": { + "description": "Internal server error", + "schema": { + "$ref": "#/definitions/api.ServerError" + } + } + } + } + }, + "/spaces": { + "get": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "spaces" + ], + "summary": "Retrieve a list of spaces", + "parameters": [ + { + "type": "integer", + "description": "The number of items to skip before starting to collect the result set", + "name": "offset", + "in": "query" + }, + { + "type": "integer", + "default": 100, + "description": "The number of items to return", + "name": "limit", + "in": "query" + } + ], + "responses": { + "200": { + "description": "List of spaces", + "schema": { + "type": "object", + "additionalProperties": { + "type": "array", + "items": { + "$ref": "#/definitions/api.Space" + } + } + } + }, + "403": { + "description": "Unauthorized", + "schema": { + "$ref": "#/definitions/api.UnauthorizedError" + } + }, + "502": { + "description": "Internal server error", + "schema": { + "$ref": "#/definitions/api.ServerError" + } + } + } + }, + "post": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "spaces" + ], + "summary": "Create a new Space", + "parameters": [ + { + "description": "Space Name", + "name": "name", + "in": "body", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "Space created successfully", + "schema": { + "$ref": "#/definitions/api.Space" + } + }, + "403": { + "description": "Unauthorized", + "schema": { + "$ref": "#/definitions/api.UnauthorizedError" + } + }, + "502": { + "description": "Internal server error", + "schema": { + "$ref": "#/definitions/api.ServerError" + } + } + } + } + }, + "/spaces/{space_id}/members": { + "get": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "spaces" + ], + "summary": "Retrieve a list of members for the specified Space", + "parameters": [ + { + "type": "string", + "description": "The ID of the space", + "name": "space_id", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "List of members", + "schema": { + "type": "object", + "additionalProperties": { + "type": "array", + "items": { + "$ref": "#/definitions/api.SpaceMember" + } + } + } + }, + "403": { + "description": "Unauthorized", + "schema": { + "$ref": "#/definitions/api.UnauthorizedError" + } + }, + "404": { + "description": "Resource not found", + "schema": { + "$ref": "#/definitions/api.NotFoundError" + } + }, + "502": { + "description": "Internal server error", + "schema": { + "$ref": "#/definitions/api.ServerError" + } + } + } + } + }, + "/spaces/{space_id}/objectTypes": { + "get": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "types_and_templates" + ], + "summary": "Retrieve object types in a specific space", + "parameters": [ + { + "type": "string", + "description": "The ID of the space", + "name": "space_id", + "in": "path", + "required": true + }, + { + "type": "integer", + "description": "The number of items to skip before starting to collect the result set", + "name": "offset", + "in": "query" + }, + { + "type": "integer", + "default": 100, + "description": "The number of items to return", + "name": "limit", + "in": "query" + } + ], + "responses": { + "200": { + "description": "Total and object types", + "schema": { + "type": "object", + "additionalProperties": true + } + }, + "403": { + "description": "Unauthorized", + "schema": { + "$ref": "#/definitions/api.UnauthorizedError" + } + }, + "404": { + "description": "Resource not found", + "schema": { + "$ref": "#/definitions/api.NotFoundError" + } + }, + "502": { + "description": "Internal server error", + "schema": { + "$ref": "#/definitions/api.ServerError" + } + } + } + } + }, + "/spaces/{space_id}/objectTypes/{typeId}/templates": { + "get": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "types_and_templates" + ], + "summary": "Retrieve a list of templates for a specific object type in a space", + "parameters": [ + { + "type": "string", + "description": "The ID of the space", + "name": "space_id", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "The ID of the object type", + "name": "typeId", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "List of templates", + "schema": { + "type": "object", + "additionalProperties": { + "type": "array", + "items": { + "$ref": "#/definitions/api.ObjectTemplate" + } + } + } + }, + "403": { + "description": "Unauthorized", + "schema": { + "$ref": "#/definitions/api.UnauthorizedError" + } + }, + "404": { + "description": "Resource not found", + "schema": { + "$ref": "#/definitions/api.NotFoundError" + } + }, + "502": { + "description": "Internal server error", + "schema": { + "$ref": "#/definitions/api.ServerError" + } + } + } + } + }, + "/spaces/{space_id}/objects": { + "get": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "space_objects" + ], + "summary": "Retrieve objects in a specific space", + "parameters": [ + { + "type": "string", + "description": "The ID of the space", + "name": "space_id", + "in": "path", + "required": true + }, + { + "type": "integer", + "description": "The number of items to skip before starting to collect the result set", + "name": "offset", + "in": "query" + }, + { + "type": "integer", + "default": 100, + "description": "The number of items to return", + "name": "limit", + "in": "query" + } + ], + "responses": { + "200": { + "description": "Total objects and object list", + "schema": { + "type": "object", + "additionalProperties": true + } + }, + "403": { + "description": "Unauthorized", + "schema": { + "$ref": "#/definitions/api.UnauthorizedError" + } + }, + "404": { + "description": "Resource not found", + "schema": { + "$ref": "#/definitions/api.NotFoundError" + } + }, + "502": { + "description": "Internal server error", + "schema": { + "$ref": "#/definitions/api.ServerError" + } + } + } + }, + "post": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "space_objects" + ], + "summary": "Create a new object in a specific space", + "parameters": [ + { + "type": "string", + "description": "The ID of the space", + "name": "space_id", + "in": "path", + "required": true + }, + { + "description": "Object details (e.g., name)", + "name": "object", + "in": "body", + "required": true, + "schema": { + "type": "object", + "additionalProperties": { + "type": "string" + } + } + } + ], + "responses": { + "200": { + "description": "The created object", + "schema": { + "$ref": "#/definitions/api.Object" + } + }, + "403": { + "description": "Unauthorized", + "schema": { + "$ref": "#/definitions/api.UnauthorizedError" + } + }, + "502": { + "description": "Internal server error", + "schema": { + "$ref": "#/definitions/api.ServerError" + } + } + } + } + }, + "/spaces/{space_id}/objects/{object_id}": { + "get": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "space_objects" + ], + "summary": "Retrieve a specific object in a space", + "parameters": [ + { + "type": "string", + "description": "The ID of the space", + "name": "space_id", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "The ID of the object", + "name": "object_id", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "The requested object", + "schema": { + "$ref": "#/definitions/api.Object" + } + }, + "403": { + "description": "Unauthorized", + "schema": { + "$ref": "#/definitions/api.UnauthorizedError" + } + }, + "404": { + "description": "Resource not found", + "schema": { + "$ref": "#/definitions/api.NotFoundError" + } + }, + "502": { + "description": "Internal server error", + "schema": { + "$ref": "#/definitions/api.ServerError" + } + } + } + }, + "put": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "space_objects" + ], + "summary": "Update an existing object in a specific space", + "parameters": [ + { + "type": "string", + "description": "The ID of the space", + "name": "space_id", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "The ID of the object", + "name": "object_id", + "in": "path", + "required": true + }, + { + "description": "The updated object details", + "name": "object", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/api.Object" + } + } + ], + "responses": { + "200": { + "description": "The updated object", + "schema": { + "$ref": "#/definitions/api.Object" + } + }, + "403": { + "description": "Unauthorized", + "schema": { + "$ref": "#/definitions/api.UnauthorizedError" + } + }, + "404": { + "description": "Resource not found", + "schema": { + "$ref": "#/definitions/api.NotFoundError" + } + }, + "502": { + "description": "Internal server error", + "schema": { + "$ref": "#/definitions/api.ServerError" + } + } + } + } + } + }, + "definitions": { + "api.Block": { + "type": "object", + "properties": { + "align": { + "type": "string" + }, + "background_color": { + "type": "string" + }, + "children_ids": { + "type": "array", + "items": { + "type": "string" + } + }, + "file": { + "$ref": "#/definitions/api.File" + }, + "id": { + "type": "string" + }, + "layout": { + "$ref": "#/definitions/api.Layout" + }, + "text": { + "$ref": "#/definitions/api.Text" + }, + "verticalalign": { + "type": "string" + } + } + }, + "api.Detail": { + "type": "object", + "properties": { + "details": { + "type": "object", + "additionalProperties": true + }, + "id": { + "type": "string" + } + } + }, + "api.File": { + "type": "object", + "properties": { + "addedat": { + "type": "integer" + }, + "hash": { + "type": "string" + }, + "mime": { + "type": "string" + }, + "name": { + "type": "string" + }, + "size": { + "type": "integer" + }, + "state": { + "type": "integer" + }, + "style": { + "type": "integer" + }, + "targetobjectid": { + "type": "string" + }, + "type": { + "type": "string" + } + } + }, + "api.Layout": { + "type": "object", + "properties": { + "style": { + "type": "string" + } + } + }, + "api.NotFoundError": { + "type": "object", + "properties": { + "error": { + "type": "object", + "properties": { + "message": { + "type": "string" + } + } + } + } + }, + "api.Object": { + "type": "object", + "properties": { + "blocks": { + "type": "array", + "items": { + "$ref": "#/definitions/api.Block" + } + }, + "details": { + "type": "array", + "items": { + "$ref": "#/definitions/api.Detail" + } + }, + "id": { + "type": "string" + }, + "object_type": { + "type": "string", + "example": "note" + }, + "relation_links_list": { + "type": "array", + "items": { + "$ref": "#/definitions/api.RelationLink" + } + }, + "root_id": { + "type": "string" + }, + "type": { + "type": "string", + "example": "object" + } + } + }, + "api.ObjectTemplate": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "type": { + "type": "string", + "example": "object_template" + } + } + }, + "api.RelationLink": { + "type": "object", + "properties": { + "format": { + "type": "string" + }, + "key": { + "type": "string" + } + } + }, + "api.ServerError": { + "type": "object", + "properties": { + "error": { + "type": "object", + "properties": { + "message": { + "type": "string" + } + } + } + } + }, + "api.Space": { + "type": "object", + "properties": { + "account_space_id": { + "type": "string", + "example": "bafyreihpd2knon5wbljhtfeg3fcqtg3i2pomhhnigui6lrjmzcjzep7gcy.23me69r569oi1" + }, + "archive_object_id": { + "type": "string", + "example": "bafyreialsgoyflf3etjm3parzurivyaukzivwortf32b4twnlwpwocsrri" + }, + "device_id": { + "type": "string", + "example": "12D3KooWGZMJ4kQVyQVXaj7gJPZr3RZ2nvd9M2Eq2pprEoPih9WF" + }, + "home_object_id": { + "type": "string", + "example": "bafyreie4qcl3wczb4cw5hrfyycikhjyh6oljdis3ewqrk5boaav3sbwqya" + }, + "id": { + "type": "string" + }, + "marketplace_workspace_id": { + "type": "string", + "example": "_anytype_marketplace" + }, + "name": { + "type": "string", + "example": "Space Name" + }, + "network_id": { + "type": "string", + "example": "N83gJpVd9MuNRZAuJLZ7LiMntTThhPc6DtzWWVjb1M3PouVU" + }, + "profile_object_id": { + "type": "string", + "example": "bafyreiaxhwreshjqwndpwtdsu4mtihaqhhmlygqnyqpfyfwlqfq3rm3gw4" + }, + "space_view_id": { + "type": "string", + "example": "bafyreigzv3vq7qwlrsin6njoduq727ssnhwd6bgyfj6nm4hv3pxoc2rxhy" + }, + "tech_space_id": { + "type": "string", + "example": "bafyreif4xuwncrjl6jajt4zrrfnylpki476nv2w64yf42ovt7gia7oypii.23me69r569oi1" + }, + "timezone": { + "type": "string", + "example": "" + }, + "type": { + "type": "string", + "example": "space" + }, + "widgets_id": { + "type": "string", + "example": "bafyreialj7pceh53mifm5dixlho47ke4qjmsn2uh4wsjf7xq2pnlo5xfva" + } + } + }, + "api.SpaceMember": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "name": { + "type": "string", + "example": "" + }, + "role": { + "type": "string" + }, + "type": { + "type": "string", + "example": "space_member" + } + } + }, + "api.Text": { + "type": "object", + "properties": { + "checked": { + "type": "boolean" + }, + "color": { + "type": "string" + }, + "iconemoji": { + "type": "string" + }, + "iconimage": { + "type": "string" + }, + "style": { + "type": "string" + }, + "text": { + "type": "string" + } + } + }, + "api.UnauthorizedError": { + "type": "object", + "properties": { + "error": { + "type": "object", + "properties": { + "message": { + "type": "string" + } + } + } + } + }, + "api.ValidationError": { + "type": "object", + "properties": { + "error": { + "type": "object", + "properties": { + "message": { + "type": "string" + } + } + } + } + } + }, + "securityDefinitions": { + "BasicAuth": { + "type": "basic" + } + }, + "externalDocs": { + "description": "OpenAPI", + "url": "https://swagger.io/resources/open-api/" + } +} \ No newline at end of file diff --git a/cmd/api/docs/swagger.yaml b/cmd/api/docs/swagger.yaml new file mode 100644 index 000000000..b8de9a23b --- /dev/null +++ b/cmd/api/docs/swagger.yaml @@ -0,0 +1,657 @@ +basePath: /v1 +definitions: + api.Block: + properties: + align: + type: string + background_color: + type: string + children_ids: + items: + type: string + type: array + file: + $ref: '#/definitions/api.File' + id: + type: string + layout: + $ref: '#/definitions/api.Layout' + text: + $ref: '#/definitions/api.Text' + verticalalign: + type: string + type: object + api.Detail: + properties: + details: + additionalProperties: true + type: object + id: + type: string + type: object + api.File: + properties: + addedat: + type: integer + hash: + type: string + mime: + type: string + name: + type: string + size: + type: integer + state: + type: integer + style: + type: integer + targetobjectid: + type: string + type: + type: string + type: object + api.Layout: + properties: + style: + type: string + type: object + api.NotFoundError: + properties: + error: + properties: + message: + type: string + type: object + type: object + api.Object: + properties: + blocks: + items: + $ref: '#/definitions/api.Block' + type: array + details: + items: + $ref: '#/definitions/api.Detail' + type: array + id: + type: string + object_type: + example: note + type: string + relation_links_list: + items: + $ref: '#/definitions/api.RelationLink' + type: array + root_id: + type: string + type: + example: object + type: string + type: object + api.ObjectTemplate: + properties: + id: + type: string + name: + type: string + type: + example: object_template + type: string + type: object + api.RelationLink: + properties: + format: + type: string + key: + type: string + type: object + api.ServerError: + properties: + error: + properties: + message: + type: string + type: object + type: object + api.Space: + properties: + account_space_id: + example: bafyreihpd2knon5wbljhtfeg3fcqtg3i2pomhhnigui6lrjmzcjzep7gcy.23me69r569oi1 + type: string + archive_object_id: + example: bafyreialsgoyflf3etjm3parzurivyaukzivwortf32b4twnlwpwocsrri + type: string + device_id: + example: 12D3KooWGZMJ4kQVyQVXaj7gJPZr3RZ2nvd9M2Eq2pprEoPih9WF + type: string + home_object_id: + example: bafyreie4qcl3wczb4cw5hrfyycikhjyh6oljdis3ewqrk5boaav3sbwqya + type: string + id: + type: string + marketplace_workspace_id: + example: _anytype_marketplace + type: string + name: + example: Space Name + type: string + network_id: + example: N83gJpVd9MuNRZAuJLZ7LiMntTThhPc6DtzWWVjb1M3PouVU + type: string + profile_object_id: + example: bafyreiaxhwreshjqwndpwtdsu4mtihaqhhmlygqnyqpfyfwlqfq3rm3gw4 + type: string + space_view_id: + example: bafyreigzv3vq7qwlrsin6njoduq727ssnhwd6bgyfj6nm4hv3pxoc2rxhy + type: string + tech_space_id: + example: bafyreif4xuwncrjl6jajt4zrrfnylpki476nv2w64yf42ovt7gia7oypii.23me69r569oi1 + type: string + timezone: + example: "" + type: string + type: + example: space + type: string + widgets_id: + example: bafyreialj7pceh53mifm5dixlho47ke4qjmsn2uh4wsjf7xq2pnlo5xfva + type: string + type: object + api.SpaceMember: + properties: + id: + type: string + name: + example: "" + type: string + role: + type: string + type: + example: space_member + type: string + type: object + api.Text: + properties: + checked: + type: boolean + color: + type: string + iconemoji: + type: string + iconimage: + type: string + style: + type: string + text: + type: string + type: object + api.UnauthorizedError: + properties: + error: + properties: + message: + type: string + type: object + type: object + api.ValidationError: + properties: + error: + properties: + message: + type: string + type: object + type: object +externalDocs: + description: OpenAPI + url: https://swagger.io/resources/open-api/ +host: localhost:31009 +info: + contact: + email: support@anytype.io + name: Anytype Support + url: https://anytype.io/contact + description: This API allows interaction with Anytype resources such as spaces, + objects, and object types. + license: + name: Apache 2.0 + url: http://www.apache.org/licenses/LICENSE-2.0.html + termsOfService: https://anytype.io/terms_of_use + title: Anytype API + version: "1.0" +paths: + /auth/displayCode: + post: + consumes: + - application/json + produces: + - application/json + responses: + "200": + description: Success + schema: + type: string + "502": + description: Internal server error + schema: + $ref: '#/definitions/api.ServerError' + summary: Open a modal window with a code in Anytype Desktop app + tags: + - auth + /auth/token: + get: + consumes: + - application/json + parameters: + - description: The code retrieved from Anytype Desktop app + in: query + name: code + required: true + type: string + produces: + - application/json + responses: + "200": + description: Access and refresh tokens + schema: + additionalProperties: + type: string + type: object + "400": + description: Invalid input + schema: + $ref: '#/definitions/api.ValidationError' + "502": + description: Internal server error + schema: + $ref: '#/definitions/api.ServerError' + summary: Retrieve an authentication token using a code + tags: + - auth + /objects: + get: + consumes: + - application/json + parameters: + - description: The search term to filter objects by name + in: query + name: search + type: string + - description: Specify object type for search + in: query + name: object_type + type: string + - description: The number of items to skip before starting to collect the result + set + in: query + name: offset + type: integer + - default: 100 + description: The number of items to return + in: query + name: limit + type: integer + produces: + - application/json + responses: + "200": + description: Total objects and object list + schema: + additionalProperties: true + type: object + "403": + description: Unauthorized + schema: + $ref: '#/definitions/api.UnauthorizedError' + "502": + description: Internal server error + schema: + $ref: '#/definitions/api.ServerError' + summary: Search and retrieve objects across all the spaces + tags: + - search + /spaces: + get: + consumes: + - application/json + parameters: + - description: The number of items to skip before starting to collect the result + set + in: query + name: offset + type: integer + - default: 100 + description: The number of items to return + in: query + name: limit + type: integer + produces: + - application/json + responses: + "200": + description: List of spaces + schema: + additionalProperties: + items: + $ref: '#/definitions/api.Space' + type: array + type: object + "403": + description: Unauthorized + schema: + $ref: '#/definitions/api.UnauthorizedError' + "502": + description: Internal server error + schema: + $ref: '#/definitions/api.ServerError' + summary: Retrieve a list of spaces + tags: + - spaces + post: + consumes: + - application/json + parameters: + - description: Space Name + in: body + name: name + required: true + schema: + type: string + produces: + - application/json + responses: + "200": + description: Space created successfully + schema: + $ref: '#/definitions/api.Space' + "403": + description: Unauthorized + schema: + $ref: '#/definitions/api.UnauthorizedError' + "502": + description: Internal server error + schema: + $ref: '#/definitions/api.ServerError' + summary: Create a new Space + tags: + - spaces + /spaces/{space_id}/members: + get: + consumes: + - application/json + parameters: + - description: The ID of the space + in: path + name: space_id + required: true + type: string + produces: + - application/json + responses: + "200": + description: List of members + schema: + additionalProperties: + items: + $ref: '#/definitions/api.SpaceMember' + type: array + type: object + "403": + description: Unauthorized + schema: + $ref: '#/definitions/api.UnauthorizedError' + "404": + description: Resource not found + schema: + $ref: '#/definitions/api.NotFoundError' + "502": + description: Internal server error + schema: + $ref: '#/definitions/api.ServerError' + summary: Retrieve a list of members for the specified Space + tags: + - spaces + /spaces/{space_id}/objectTypes: + get: + consumes: + - application/json + parameters: + - description: The ID of the space + in: path + name: space_id + required: true + type: string + - description: The number of items to skip before starting to collect the result + set + in: query + name: offset + type: integer + - default: 100 + description: The number of items to return + in: query + name: limit + type: integer + produces: + - application/json + responses: + "200": + description: Total and object types + schema: + additionalProperties: true + type: object + "403": + description: Unauthorized + schema: + $ref: '#/definitions/api.UnauthorizedError' + "404": + description: Resource not found + schema: + $ref: '#/definitions/api.NotFoundError' + "502": + description: Internal server error + schema: + $ref: '#/definitions/api.ServerError' + summary: Retrieve object types in a specific space + tags: + - types_and_templates + /spaces/{space_id}/objectTypes/{typeId}/templates: + get: + consumes: + - application/json + parameters: + - description: The ID of the space + in: path + name: space_id + required: true + type: string + - description: The ID of the object type + in: path + name: typeId + required: true + type: string + produces: + - application/json + responses: + "200": + description: List of templates + schema: + additionalProperties: + items: + $ref: '#/definitions/api.ObjectTemplate' + type: array + type: object + "403": + description: Unauthorized + schema: + $ref: '#/definitions/api.UnauthorizedError' + "404": + description: Resource not found + schema: + $ref: '#/definitions/api.NotFoundError' + "502": + description: Internal server error + schema: + $ref: '#/definitions/api.ServerError' + summary: Retrieve a list of templates for a specific object type in a space + tags: + - types_and_templates + /spaces/{space_id}/objects: + get: + consumes: + - application/json + parameters: + - description: The ID of the space + in: path + name: space_id + required: true + type: string + - description: The number of items to skip before starting to collect the result + set + in: query + name: offset + type: integer + - default: 100 + description: The number of items to return + in: query + name: limit + type: integer + produces: + - application/json + responses: + "200": + description: Total objects and object list + schema: + additionalProperties: true + type: object + "403": + description: Unauthorized + schema: + $ref: '#/definitions/api.UnauthorizedError' + "404": + description: Resource not found + schema: + $ref: '#/definitions/api.NotFoundError' + "502": + description: Internal server error + schema: + $ref: '#/definitions/api.ServerError' + summary: Retrieve objects in a specific space + tags: + - space_objects + post: + consumes: + - application/json + parameters: + - description: The ID of the space + in: path + name: space_id + required: true + type: string + - description: Object details (e.g., name) + in: body + name: object + required: true + schema: + additionalProperties: + type: string + type: object + produces: + - application/json + responses: + "200": + description: The created object + schema: + $ref: '#/definitions/api.Object' + "403": + description: Unauthorized + schema: + $ref: '#/definitions/api.UnauthorizedError' + "502": + description: Internal server error + schema: + $ref: '#/definitions/api.ServerError' + summary: Create a new object in a specific space + tags: + - space_objects + /spaces/{space_id}/objects/{object_id}: + get: + consumes: + - application/json + parameters: + - description: The ID of the space + in: path + name: space_id + required: true + type: string + - description: The ID of the object + in: path + name: object_id + required: true + type: string + produces: + - application/json + responses: + "200": + description: The requested object + schema: + $ref: '#/definitions/api.Object' + "403": + description: Unauthorized + schema: + $ref: '#/definitions/api.UnauthorizedError' + "404": + description: Resource not found + schema: + $ref: '#/definitions/api.NotFoundError' + "502": + description: Internal server error + schema: + $ref: '#/definitions/api.ServerError' + summary: Retrieve a specific object in a space + tags: + - space_objects + put: + consumes: + - application/json + parameters: + - description: The ID of the space + in: path + name: space_id + required: true + type: string + - description: The ID of the object + in: path + name: object_id + required: true + type: string + - description: The updated object details + in: body + name: object + required: true + schema: + $ref: '#/definitions/api.Object' + produces: + - application/json + responses: + "200": + description: The updated object + schema: + $ref: '#/definitions/api.Object' + "403": + description: Unauthorized + schema: + $ref: '#/definitions/api.UnauthorizedError' + "404": + description: Resource not found + schema: + $ref: '#/definitions/api.NotFoundError' + "502": + description: Internal server error + schema: + $ref: '#/definitions/api.ServerError' + summary: Update an existing object in a specific space + tags: + - space_objects +securityDefinitions: + BasicAuth: + type: basic +swagger: "2.0" diff --git a/cmd/api/handlers.go b/cmd/api/handlers.go index d528ca7d7..59f616002 100644 --- a/cmd/api/handlers.go +++ b/cmd/api/handlers.go @@ -19,7 +19,13 @@ type NameRequest struct { Name string `json:"name"` } -// /v1/auth/displayCode [POST] +// @Summary Open a modal window with a code in Anytype Desktop app +// @Tags auth +// @Accept json +// @Produce json +// @Success 200 {string} string "Success" +// @Failure 502 {object} ServerError "Internal server error" +// @Router /auth/displayCode [post] func (a *ApiServer) authDisplayCodeHandler(c *gin.Context) { // Call AccountLocalLinkNewChallenge to display code modal ctx := context.Background() @@ -32,7 +38,15 @@ func (a *ApiServer) authDisplayCodeHandler(c *gin.Context) { c.JSON(http.StatusOK, gin.H{"challengeId": resp.ChallengeId}) } -// /v1/auth/token [GET] +// @Summary Retrieve an authentication token using a code +// @Tags auth +// @Accept json +// @Produce json +// @Param code query string true "The code retrieved from Anytype Desktop app" +// @Success 200 {object} map[string]string "Access and refresh tokens" +// @Failure 400 {object} ValidationError "Invalid input" +// @Failure 502 {object} ServerError "Internal server error" +// @Router /auth/token [get] func (a *ApiServer) authTokenHandler(c *gin.Context) { // Call AccountLocalLinkSolveChallenge to retrieve session token and app key resp := a.mw.AccountLocalLinkSolveChallenge(context.Background(), &pb.RpcAccountLocalLinkSolveChallengeRequest{ @@ -51,7 +65,16 @@ func (a *ApiServer) authTokenHandler(c *gin.Context) { }) } -// /v1/spaces [GET] +// @Summary Retrieve a list of spaces +// @Tags spaces +// @Accept json +// @Produce json +// @Param offset query int false "The number of items to skip before starting to collect the result set" +// @Param limit query int false "The number of items to return" default(100) +// @Success 200 {object} map[string][]Space "List of spaces" +// @Failure 403 {object} UnauthorizedError "Unauthorized" +// @Failure 502 {object} ServerError "Internal server error" +// @Router /spaces [get] func (a *ApiServer) getSpacesHandler(c *gin.Context) { // Call ObjectSearch for all objects of type spaceView resp := a.mw.ObjectSearch(context.Background(), &pb.RpcObjectSearchRequest{ @@ -106,7 +129,15 @@ func (a *ApiServer) getSpacesHandler(c *gin.Context) { c.JSON(http.StatusOK, gin.H{"spaces": spaces}) } -// /v1/spaces [POST] +// @Summary Create a new Space +// @Tags spaces +// @Accept json +// @Produce json +// @Param name body string true "Space Name" +// @Success 200 {object} Space "Space created successfully" +// @Failure 403 {object} UnauthorizedError "Unauthorized" +// @Failure 502 {object} ServerError "Internal server error" +// @Router /spaces [post] func (a *ApiServer) createSpaceHandler(c *gin.Context) { // Create new workspace with a random icon and import default usecase nameRequest := NameRequest{} @@ -143,7 +174,16 @@ func (a *ApiServer) createSpaceHandler(c *gin.Context) { c.JSON(http.StatusOK, gin.H{"spaceId": resp.SpaceId, "name": name, "iconOption": iconOption}) } -// /v1/spaces/:space_id/members [GET] +// @Summary Retrieve a list of members for the specified Space +// @Tags spaces +// @Accept json +// @Produce json +// @Param space_id path string true "The ID of the space" +// @Success 200 {object} map[string][]SpaceMember "List of members" +// @Failure 403 {object} UnauthorizedError "Unauthorized" +// @Failure 404 {object} NotFoundError "Resource not found" +// @Failure 502 {object} ServerError "Internal server error" +// @Router /spaces/{space_id}/members [get] func (a *ApiServer) getSpaceMembersHandler(c *gin.Context) { // Call ObjectSearch for all objects of type participant spaceId := c.Param("space_id") @@ -186,14 +226,35 @@ func (a *ApiServer) getSpaceMembersHandler(c *gin.Context) { c.JSON(http.StatusOK, gin.H{"members": members}) } -// /v1/spaces/:space_id/objects [GET] +// @Summary Retrieve objects in a specific space +// @Tags space_objects +// @Accept json +// @Produce json +// @Param space_id path string true "The ID of the space" +// @Param offset query int false "The number of items to skip before starting to collect the result set" +// @Param limit query int false "The number of items to return" default(100) +// @Success 200 {object} map[string]interface{} "Total objects and object list" +// @Failure 403 {object} UnauthorizedError "Unauthorized" +// @Failure 404 {object} NotFoundError "Resource not found" +// @Failure 502 {object} ServerError "Internal server error" +// @Router /spaces/{space_id}/objects [get] func (a *ApiServer) getSpaceObjectsHandler(c *gin.Context) { spaceID := c.Param("space_id") // TODO: Implement logic to retrieve objects in a space c.JSON(http.StatusNotImplemented, gin.H{"message": "Not implemented yet", "space_id": spaceID}) } -// /v1/spaces/:space_id/objects/:object_id [GET] +// @Summary Retrieve a specific object in a space +// @Tags space_objects +// @Accept json +// @Produce json +// @Param space_id path string true "The ID of the space" +// @Param object_id path string true "The ID of the object" +// @Success 200 {object} Object "The requested object" +// @Failure 403 {object} UnauthorizedError "Unauthorized" +// @Failure 404 {object} NotFoundError "Resource not found" +// @Failure 502 {object} ServerError "Internal server error" +// @Router /spaces/{space_id}/objects/{object_id} [get] func (a *ApiServer) getObjectHandler(c *gin.Context) { spaceID := c.Param("space_id") objectID := c.Param("object_id") @@ -201,15 +262,34 @@ func (a *ApiServer) getObjectHandler(c *gin.Context) { c.JSON(http.StatusNotImplemented, gin.H{"message": "Not implemented yet", "space_id": spaceID, "object_id": objectID}) } -// /v1/spaces/:space_id/objects/:object_id [POST] +// @Summary Create a new object in a specific space +// @Tags space_objects +// @Accept json +// @Produce json +// @Param space_id path string true "The ID of the space" +// @Param object body map[string]string true "Object details (e.g., name)" +// @Success 200 {object} Object "The created object" +// @Failure 403 {object} UnauthorizedError "Unauthorized" +// @Failure 502 {object} ServerError "Internal server error" +// @Router /spaces/{space_id}/objects [post] func (a *ApiServer) createObjectHandler(c *gin.Context) { spaceID := c.Param("space_id") - objectID := c.Param("object_id") // TODO: Implement logic to create a new object - c.JSON(http.StatusNotImplemented, gin.H{"message": "Not implemented yet", "space_id": spaceID, "object_id": objectID}) + c.JSON(http.StatusNotImplemented, gin.H{"message": "Not implemented yet", "space_id": spaceID}) } -// /v1/spaces/:space_id/objects/:object_id [PUT] +// @Summary Update an existing object in a specific space +// @Tags space_objects +// @Accept json +// @Produce json +// @Param space_id path string true "The ID of the space" +// @Param object_id path string true "The ID of the object" +// @Param object body Object true "The updated object details" +// @Success 200 {object} Object "The updated object" +// @Failure 403 {object} UnauthorizedError "Unauthorized" +// @Failure 404 {object} NotFoundError "Resource not found" +// @Failure 502 {object} ServerError "Internal server error" +// @Router /spaces/{space_id}/objects/{object_id} [put] func (a *ApiServer) updateObjectHandler(c *gin.Context) { spaceID := c.Param("space_id") objectID := c.Param("object_id") @@ -217,14 +297,35 @@ func (a *ApiServer) updateObjectHandler(c *gin.Context) { c.JSON(http.StatusNotImplemented, gin.H{"message": "Not implemented yet", "space_id": spaceID, "object_id": objectID}) } -// /v1/spaces/:space_id/objectTypes [GET] +// @Summary Retrieve object types in a specific space +// @Tags types_and_templates +// @Accept json +// @Produce json +// @Param space_id path string true "The ID of the space" +// @Param offset query int false "The number of items to skip before starting to collect the result set" +// @Param limit query int false "The number of items to return" default(100) +// @Success 200 {object} map[string]interface{} "Total and object types" +// @Failure 403 {object} UnauthorizedError "Unauthorized" +// @Failure 404 {object} NotFoundError "Resource not found" +// @Failure 502 {object} ServerError "Internal server error" +// @Router /spaces/{space_id}/objectTypes [get] func (a *ApiServer) getObjectTypesHandler(c *gin.Context) { spaceID := c.Param("space_id") // TODO: Implement logic to retrieve object types in a space c.JSON(http.StatusNotImplemented, gin.H{"message": "Not implemented yet", "space_id": spaceID}) } -// /v1/spaces/:space_id/objectTypes/:typeId/templates [GET] +// @Summary Retrieve a list of templates for a specific object type in a space +// @Tags types_and_templates +// @Accept json +// @Produce json +// @Param space_id path string true "The ID of the space" +// @Param typeId path string true "The ID of the object type" +// @Success 200 {object} map[string][]ObjectTemplate "List of templates" +// @Failure 403 {object} UnauthorizedError "Unauthorized" +// @Failure 404 {object} NotFoundError "Resource not found" +// @Failure 502 {object} ServerError "Internal server error" +// @Router /spaces/{space_id}/objectTypes/{typeId}/templates [get] func (a *ApiServer) getObjectTypeTemplatesHandler(c *gin.Context) { spaceID := c.Param("space_id") typeID := c.Param("typeId") @@ -232,7 +333,18 @@ func (a *ApiServer) getObjectTypeTemplatesHandler(c *gin.Context) { c.JSON(http.StatusNotImplemented, gin.H{"message": "Not implemented yet", "space_id": spaceID, "typeId": typeID}) } -// /v1/objects [GET] +// @Summary Search and retrieve objects across all the spaces +// @Tags search +// @Accept json +// @Produce json +// @Param search query string false "The search term to filter objects by name" +// @Param object_type query string false "Specify object type for search" +// @Param offset query int false "The number of items to skip before starting to collect the result set" +// @Param limit query int false "The number of items to return" default(100) +// @Success 200 {object} map[string]interface{} "Total objects and object list" +// @Failure 403 {object} UnauthorizedError "Unauthorized" +// @Failure 502 {object} ServerError "Internal server error" +// @Router /objects [get] func (a *ApiServer) getObjectsHandler(c *gin.Context) { // TODO: Implement logic to search and retrieve objects across all spaces c.JSON(http.StatusNotImplemented, gin.H{"message": "Not implemented yet"}) diff --git a/cmd/api/main.go b/cmd/api/main.go index fd57c5b19..1bf299a69 100644 --- a/cmd/api/main.go +++ b/cmd/api/main.go @@ -6,11 +6,13 @@ import ( "net/http" "time" - "github.com/gin-gonic/gin" - + _ "github.com/anyproto/anytype-heart/cmd/api/docs" "github.com/anyproto/anytype-heart/core" "github.com/anyproto/anytype-heart/pb/service" "github.com/anyproto/anytype-heart/pkg/lib/pb/model" + "github.com/gin-gonic/gin" + swaggerFiles "github.com/swaggo/files" + ginSwagger "github.com/swaggo/gin-swagger" ) const ( @@ -49,10 +51,32 @@ func newApiServer(mw service.ClientCommandsServer, mwInternal core.MiddlewareInt return a } +// @title Anytype API +// @version 1.0 +// @description This API allows interaction with Anytype resources such as spaces, objects, and object types. +// @termsOfService https://anytype.io/terms_of_use + +// @contact.name Anytype Support +// @contact.url https://anytype.io/contact +// @contact.email support@anytype.io + +// @license.name Apache 2.0 +// @license.url http://www.apache.org/licenses/LICENSE-2.0.html + +// @host localhost:31009 +// @BasePath /v1 + +// @securityDefinitions.basic BasicAuth + +// @externalDocs.description OpenAPI +// @externalDocs.url https://swagger.io/resources/open-api/ func RunApiServer(ctx context.Context, mw service.ClientCommandsServer, mwInternal core.MiddlewareInternal) { a := newApiServer(mw, mwInternal) a.router.Use(a.EnsureAccountInfoMiddleware()) + // Swagger route + a.router.GET("/swagger/*any", ginSwagger.WrapHandler(swaggerFiles.Handler)) + // Unprotected routes auth := a.router.Group("/v1/auth") { diff --git a/cmd/api/schemas.go b/cmd/api/schemas.go index 01babb22d..37072b263 100644 --- a/cmd/api/schemas.go +++ b/cmd/api/schemas.go @@ -91,3 +91,27 @@ type ObjectTemplate struct { ID string `json:"id"` Name string `json:"name"` } + +type ServerError struct { + Error struct { + Message string `json:"message"` + } `json:"error"` +} + +type ValidationError struct { + Error struct { + Message string `json:"message"` + } `json:"error"` +} + +type UnauthorizedError struct { + Error struct { + Message string `json:"message"` + } `json:"error"` +} + +type NotFoundError struct { + Error struct { + Message string `json:"message"` + } `json:"error"` +} diff --git a/go.mod b/go.mod index 783fb4fde..3d2c7d40e 100644 --- a/go.mod +++ b/go.mod @@ -27,7 +27,7 @@ require ( github.com/dsoprea/go-exif/v3 v3.0.1 github.com/dsoprea/go-jpeg-image-structure/v2 v2.0.0-20221012074422-4f3f7e934102 github.com/ethereum/go-ethereum v1.13.15 - github.com/gin-gonic/gin v1.6.3 + github.com/gin-gonic/gin v1.9.0 github.com/globalsign/mgo v0.0.0-20181015135952-eeefdecb41b8 github.com/go-chi/chi/v5 v5.1.0 github.com/go-shiori/go-readability v0.0.0-20241012063810-92284fa8a71f @@ -117,9 +117,12 @@ require ( require ( filippo.io/edwards25519 v1.1.0 // indirect github.com/HdrHistogram/hdrhistogram-go v1.1.2 // indirect + github.com/KyleBanks/depth v1.2.1 // indirect github.com/Masterminds/goutils v1.1.1 // indirect github.com/Masterminds/semver v1.5.0 // indirect github.com/Masterminds/sprig v2.22.0+incompatible // indirect + github.com/PuerkitoBio/purell v1.1.1 // indirect + github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 // indirect github.com/alecthomas/units v0.0.0-20240927000941-0f3dac36c52b // indirect github.com/alexbrainman/goissue34681 v0.0.0-20191006012335-3fc7a47baff5 // indirect github.com/andybalholm/cascadia v1.3.2 // indirect @@ -131,9 +134,11 @@ require ( github.com/btcsuite/btcd/btcec/v2 v2.2.0 // indirect github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1 // indirect github.com/btcsuite/btcutil v1.0.3-0.20201208143702-a53e38424cce // indirect + github.com/bytedance/sonic v1.8.0 // indirect github.com/cenkalti/backoff/v4 v4.3.0 // indirect github.com/cespare/xxhash v1.1.0 // indirect github.com/cespare/xxhash/v2 v2.3.0 // indirect + github.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311 // indirect github.com/chigopher/pathlib v0.19.1 // indirect github.com/crackcomm/go-gitignore v0.0.0-20241020182519-7843d2ba8fdf // indirect github.com/davidlazar/go-crypto v0.0.0-20200604182044-b73af7476f6c // indirect @@ -155,13 +160,18 @@ require ( github.com/go-logr/logr v1.4.2 // indirect github.com/go-logr/stdr v1.2.2 // indirect github.com/go-ole/go-ole v1.3.0 // indirect - github.com/go-playground/locales v0.13.0 // indirect - github.com/go-playground/universal-translator v0.17.0 // indirect - github.com/go-playground/validator/v10 v10.2.0 // indirect + github.com/go-openapi/jsonpointer v0.19.5 // indirect + github.com/go-openapi/jsonreference v0.19.6 // indirect + github.com/go-openapi/spec v0.20.4 // indirect + github.com/go-openapi/swag v0.19.15 // indirect + github.com/go-playground/locales v0.14.1 // indirect + github.com/go-playground/universal-translator v0.18.1 // indirect + github.com/go-playground/validator/v10 v10.11.2 // indirect github.com/go-shiori/dom v0.0.0-20230515143342-73569d674e1c // indirect github.com/go-task/slim-sprig/v3 v3.0.0 // indirect github.com/go-xmlfmt/xmlfmt v0.0.0-20191208150333-d5b6f63a941b // indirect github.com/gobwas/glob v0.2.3 // indirect + github.com/goccy/go-json v0.10.2 // indirect github.com/gogo/googleapis v1.3.1 // indirect github.com/gogs/chardet v0.0.0-20211120154057-b7413eaefb8f // indirect github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 // indirect @@ -193,11 +203,13 @@ require ( github.com/jbenet/go-temp-err-catcher v0.1.0 // indirect github.com/jbenet/goprocess v0.1.4 // indirect github.com/jinzhu/copier v0.3.5 // indirect + github.com/josharian/intern v1.0.0 // indirect github.com/json-iterator/go v1.1.12 // indirect github.com/klauspost/cpuid/v2 v2.2.8 // indirect - github.com/leodido/go-urn v1.2.0 // indirect + github.com/leodido/go-urn v1.2.1 // indirect github.com/libp2p/go-buffer-pool v0.1.0 // indirect github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 // indirect + github.com/mailru/easyjson v0.7.6 // indirect github.com/mattn/go-colorable v0.1.13 // indirect github.com/mattn/go-isatty v0.0.20 // indirect github.com/miekg/dns v1.1.62 // indirect @@ -241,12 +253,16 @@ require ( github.com/spf13/viper v1.15.0 // indirect github.com/stretchr/objx v0.5.2 // indirect github.com/subosito/gotenv v1.4.2 // indirect + github.com/swaggo/files v1.0.1 // indirect + github.com/swaggo/gin-swagger v1.6.0 // indirect + github.com/swaggo/swag v1.16.4 // indirect github.com/tetratelabs/wazero v1.8.1 // indirect github.com/tklauser/go-sysconf v0.3.12 // indirect github.com/tklauser/numcpus v0.6.1 // indirect + github.com/twitchyliquid64/golang-asm v0.15.1 // indirect github.com/tyler-smith/go-bip39 v1.1.0 // indirect github.com/uber/jaeger-lib v2.4.1+incompatible // indirect - github.com/ugorji/go/codec v1.1.7 // indirect + github.com/ugorji/go/codec v1.2.9 // indirect github.com/whyrusleeping/chunker v0.0.0-20181014151217-fe64bd25879f // indirect github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f // indirect github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 // indirect @@ -256,6 +272,7 @@ require ( go.opentelemetry.io/otel v1.32.0 // indirect go.opentelemetry.io/otel/metric v1.32.0 // indirect go.opentelemetry.io/otel/trace v1.32.0 // indirect + golang.org/x/arch v0.0.0-20210923205945-b76863e36670 // indirect golang.org/x/crypto v0.29.0 // indirect golang.org/x/mod v0.22.0 // indirect golang.org/x/sync v0.9.0 // indirect diff --git a/go.sum b/go.sum index 3d86eec18..3eac2d6b9 100644 --- a/go.sum +++ b/go.sum @@ -43,6 +43,8 @@ github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym github.com/HdrHistogram/hdrhistogram-go v1.1.2 h1:5IcZpTvzydCQeHzK4Ef/D5rrSqwxob0t8PQPMybUNFM= github.com/HdrHistogram/hdrhistogram-go v1.1.2/go.mod h1:yDgFjdqOqDEKOvasDdhWNXYg9BVp4O+o5f6V/ehm6Oo= github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible/go.mod h1:r7JcOSlj0wfOMncg0iLm8Leh48TZaKVeNIfJntJ2wa0= +github.com/KyleBanks/depth v1.2.1 h1:5h8fQADFrWtarTdtDudMmGsC7GPbOAu6RVB3ffsVFHc= +github.com/KyleBanks/depth v1.2.1/go.mod h1:jzSb9d0L43HxTQfT+oSA1EEp2q+ne2uh6XgeJcm8brE= github.com/Masterminds/goutils v1.1.1 h1:5nUrii3FMTL5diU80unEVvNevw1nH4+ZV4DSLVJLSYI= github.com/Masterminds/goutils v1.1.1/go.mod h1:8cTjp+g8YejhMuvIA5y2vz3BpJxksy863GQaJW2MFNU= github.com/Masterminds/semver v1.5.0 h1:H65muMkzWKEuNDnfl9d70GUjFniHKHRbFPGBuZ3QEww= @@ -54,6 +56,10 @@ github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAE github.com/PuerkitoBio/goquery v1.8.1/go.mod h1:Q8ICL1kNUJ2sXGoAhPGUdYDJvgQgHzJsnnd3H7Ho5jQ= github.com/PuerkitoBio/goquery v1.10.0 h1:6fiXdLuUvYs2OJSvNRqlNPoBm6YABE226xrbavY5Wv4= github.com/PuerkitoBio/goquery v1.10.0/go.mod h1:TjZZl68Q3eGHNBA8CWaxAN7rOU1EbDz3CWuolcO5Yu4= +github.com/PuerkitoBio/purell v1.1.1 h1:WEQqlqaGbrPkxLJWfBwQmfEAE1Z7ONdDLqrN38tNFfI= +github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= +github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 h1:d+Bc7a5rLufV/sSk/8dngufqelfh6jnri85riMAaF/M= +github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= github.com/Shopify/sarama v1.19.0/go.mod h1:FVkBWblsNy7DGZRfXLU0O9RCGt5g3g3yEuWXgklEdEo= github.com/Shopify/toxiproxy v2.1.4+incompatible/go.mod h1:OXgGpZ6Cli1/URJOF1DMxUHB2q5Ap20/P/eIdh4G0pI= github.com/VividCortex/ewma v1.2.0 h1:f58SaIzcDXrSy3kWaHNvuJgJ3Nmz59Zji6XoJR/q1ow= @@ -147,6 +153,9 @@ github.com/btcsuite/goleveldb v0.0.0-20160330041536-7834afc9e8cd/go.mod h1:F+uVa github.com/btcsuite/snappy-go v0.0.0-20151229074030-0bdef8d06723/go.mod h1:8woku9dyThutzjeg+3xrA5iCpBRH8XEEg3lh6TiUghc= github.com/btcsuite/websocket v0.0.0-20150119174127-31079b680792/go.mod h1:ghJtEyQwv5/p4Mg4C0fgbePVuGr935/5ddU9Z3TmDRY= github.com/btcsuite/winsvc v1.0.0/go.mod h1:jsenWakMcC0zFBFurPLEAyrnc/teJEM1O46fmI40EZs= +github.com/bytedance/sonic v1.5.0/go.mod h1:ED5hyg4y6t3/9Ku1R6dU/4KyJ48DZ4jPhfY1O2AihPM= +github.com/bytedance/sonic v1.8.0 h1:ea0Xadu+sHlu7x5O3gKhRpQ1IKiMrSiHttPF0ybECuA= +github.com/bytedance/sonic v1.8.0/go.mod h1:i736AoUSYt75HyZLoJW9ERYxcy6eaN6h4BZXU064P/U= github.com/casbin/casbin/v2 v2.1.2/go.mod h1:YcPU1XXisHhLzuxH9coDNf2FbKpjGlbCg3n9yuLkIJQ= github.com/cenkalti/backoff v2.2.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM= github.com/cenkalti/backoff/v4 v4.1.1/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw= @@ -164,6 +173,9 @@ github.com/cheggaaa/mb v1.0.3 h1:03ksWum+6kHclB+kjwKMaBtgl5gtNYUwNpxsHQciKe8= github.com/cheggaaa/mb v1.0.3/go.mod h1:NUl0GBtFLlfg2o6iZwxzcG7Lslc2wV/ADTFbLXtVPE4= github.com/cheggaaa/mb/v3 v3.0.2 h1:jd1Xx0zzihZlXL6HmnRXVCI1BHuXz/kY+VzX9WbvNDU= github.com/cheggaaa/mb/v3 v3.0.2/go.mod h1:zCt2QeYukhd/g0bIdNqF+b/kKz1hnLFNDkP49qN5kqI= +github.com/chenzhuoyu/base64x v0.0.0-20211019084208-fb5309c8db06/go.mod h1:DH46F32mSOjUmXrMHnKwZdA8wcEefY7UVqBKYGjpdQY= +github.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311 h1:qSGYFH7+jGhDF8vLC+iwCD4WpbV1EBDSzWkJODFLams= +github.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311/go.mod h1:b583jCggY9gE99b6G5LEC39OIiVsWj+R97kbl5odCEk= github.com/chigopher/pathlib v0.19.1 h1:RoLlUJc0CqBGwq239cilyhxPNLXTK+HXoASGyGznx5A= github.com/chigopher/pathlib v0.19.1/go.mod h1:tzC1dZLW8o33UQpWkNkhvPwL5n4yyFRFm/jL1YGWFvY= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= @@ -278,6 +290,8 @@ github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI= github.com/gin-gonic/gin v1.6.3 h1:ahKqKTFpO5KTPHxWZjEdPScmYaGtLo8Y4DMHoEsnp14= github.com/gin-gonic/gin v1.6.3/go.mod h1:75u5sXoLsGZoRN5Sgbi1eraJ4GU3++wFwWzhwvtwp4M= +github.com/gin-gonic/gin v1.9.0 h1:OjyFBKICoexlu99ctXNR2gg+c5pKrKMuyjgARg9qeY8= +github.com/gin-gonic/gin v1.9.0/go.mod h1:W1Me9+hsUSyj3CePGrd1/QrKJMSJ1Tu/0hFEH89961k= github.com/globalsign/mgo v0.0.0-20181015135952-eeefdecb41b8 h1:DujepqpGd1hyOd7aW59XpK7Qymp8iy83xq74fLr21is= github.com/globalsign/mgo v0.0.0-20181015135952-eeefdecb41b8/go.mod h1:xkRDCp4j0OGD1HRkm4kmhM+pmpv3AKq5SU7GMg4oO/Q= github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= @@ -305,14 +319,31 @@ github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE= github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78= +github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= +github.com/go-openapi/jsonpointer v0.19.5 h1:gZr+CIYByUqjcgeLXnQu2gHYQC9o73G2XUeOFYEICuY= +github.com/go-openapi/jsonpointer v0.19.5/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= +github.com/go-openapi/jsonreference v0.19.6 h1:UBIxjkht+AWIgYzCDSv2GN+E/togfwXUJFRTWhl2Jjs= +github.com/go-openapi/jsonreference v0.19.6/go.mod h1:diGHMEHg2IqXZGKxqyvWdfWU/aim5Dprw5bqpKkTvns= +github.com/go-openapi/spec v0.20.4 h1:O8hJrt0UMnhHcluhIdUgCLRWyM2x7QkBXRvOs7m+O1M= +github.com/go-openapi/spec v0.20.4/go.mod h1:faYFR1CvsJZ0mNsmsphTMSoRrNV3TEDoAM7FOEWeq8I= +github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= +github.com/go-openapi/swag v0.19.15 h1:D2NRCBzS9/pEY3gP9Nl8aDqGUcPFrwG2p+CNFrLyrCM= +github.com/go-openapi/swag v0.19.15/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ= github.com/go-playground/assert/v2 v2.0.1 h1:MsBgLAaY856+nPRTKrp3/OZK38U/wa0CcBYNjji3q3A= github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= +github.com/go-playground/assert/v2 v2.2.0 h1:JvknZsQTYeFEAhQwI4qEt9cyV5ONwRHC+lYKSsYSR8s= github.com/go-playground/locales v0.13.0 h1:HyWk6mgj5qFqCT5fjGBuRArbVDfE4hi8+e8ceBS/t7Q= github.com/go-playground/locales v0.13.0/go.mod h1:taPMhCMXrRLJO55olJkUXHZBHCxTMfnGwq/HNwmWNS8= +github.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/oXslEjJA= +github.com/go-playground/locales v0.14.1/go.mod h1:hxrqLVvrK65+Rwrd5Fc6F2O76J/NuW9t0sjnWqG1slY= github.com/go-playground/universal-translator v0.17.0 h1:icxd5fm+REJzpZx7ZfpaD876Lmtgy7VtROAbHHXk8no= github.com/go-playground/universal-translator v0.17.0/go.mod h1:UkSxE5sNxxRwHyU+Scu5vgOQjsIJAF8j9muTVoKLVtA= +github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJnYK9S473LQFuzCbDbfSFY= +github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY= github.com/go-playground/validator/v10 v10.2.0 h1:KgJ0snyC2R9VXYN2rneOtQcw5aHQB1Vv0sFl1UcHBOY= github.com/go-playground/validator/v10 v10.2.0/go.mod h1:uOYAAleCW8F/7oMFd6aG0GOhaH6EGOAJShg8Id5JGkI= +github.com/go-playground/validator/v10 v10.11.2 h1:q3SHpufmypg+erIExEKUmsgmhDTyhcJ38oeKGACXohU= +github.com/go-playground/validator/v10 v10.11.2/go.mod h1:NieE624vt4SCTJtD87arVLvdmjPAeV8BQlHtMnw9D7s= github.com/go-shiori/dom v0.0.0-20230515143342-73569d674e1c h1:wpkoddUomPfHiOziHZixGO5ZBS73cKqVzZipfrLmO1w= github.com/go-shiori/dom v0.0.0-20230515143342-73569d674e1c/go.mod h1:oVDCh3qjJMLVUSILBRwrm+Bc6RNXGZYtoh9xdvf1ffM= github.com/go-shiori/go-readability v0.0.0-20241012063810-92284fa8a71f h1:cypj7SJh+47G9J3VCPdMzT3uWcXWAWDJA54ErTfOigI= @@ -334,6 +365,8 @@ github.com/gobwas/ws v1.0.2 h1:CoAavW/wd/kulfZmSIBt6p24n4j7tHgNVCjsfHVNUbo= github.com/gobwas/ws v1.0.2/go.mod h1:szmBTxLgaFppYjEmNtny/v3w89xOydFnnZMcgRRu/EM= github.com/goccy/go-graphviz v0.2.9 h1:4yD2MIMpxNt+sOEARDh5jTE2S/jeAKi92w72B83mWGg= github.com/goccy/go-graphviz v0.2.9/go.mod h1:hssjl/qbvUXGmloY81BwXt2nqoApKo7DFgDj5dLJGb8= +github.com/goccy/go-json v0.10.2 h1:CrxCmQqYDkv1z7lO7Wbh2HN93uovUHgrECaO5ZrCXAU= +github.com/goccy/go-json v0.10.2/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/gogo/googleapis v0.0.0-20180223154316-0cd9801be74a/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s= github.com/gogo/googleapis v1.1.0/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s= @@ -576,6 +609,8 @@ github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht github.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0= github.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4= github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= +github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY= +github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= github.com/jrick/logrotate v1.0.0/go.mod h1:LNinyqDIJnpAur+b8yyulnQw/wDuN1+BYKlTRt3OuAQ= github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= @@ -603,6 +638,7 @@ github.com/klauspost/compress v1.10.3/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYs github.com/klauspost/compress v1.11.7/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= github.com/klauspost/compress v1.17.11 h1:In6xLpyWOi1+C7tXUUWv2ot1QvBjxevKAaI6IXrJmUc= github.com/klauspost/compress v1.17.11/go.mod h1:pMDklpSncoRMuLFrf1W9Ss9KT+0rH90U12bZKk7uwG0= +github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= github.com/klauspost/cpuid/v2 v2.2.8 h1:+StwCXwm9PdpiEkPyzBXIy+M9KUb4ODm0Zarf1kS5BM= github.com/klauspost/cpuid/v2 v2.2.8/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= @@ -625,6 +661,8 @@ github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0 github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= github.com/leodido/go-urn v1.2.0 h1:hpXL4XnriNwQ/ABnpepYM/1vCLWNDfUNts8dX3xTG6Y= github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII= +github.com/leodido/go-urn v1.2.1 h1:BqpAaACuzVSgi/VLzGZIobT2z4v53pjosyNd9Yv6n/w= +github.com/leodido/go-urn v1.2.1/go.mod h1:zt4jvISO2HfUBqxjfIshjdMTYS56ZS/qv49ictyFfxY= github.com/libp2p/go-buffer-pool v0.1.0 h1:oK4mSFcQz7cTQIfqbe4MIj9gLW+mnanjyFtc6cdF0Y8= github.com/libp2p/go-buffer-pool v0.1.0/go.mod h1:N+vh8gMqimBzdKkSMVuydVDq+UV5QTWy5HSiZacSbPg= github.com/libp2p/go-libp2p v0.37.0 h1:8K3mcZgwTldydMCNOiNi/ZJrOB9BY+GlI3UxYzxBi9A= @@ -652,6 +690,10 @@ github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0/go.mod h1:zJYVVT2 github.com/lyft/protoc-gen-validate v0.0.13/go.mod h1:XbGvPuh87YZc5TdIa2/I4pLk0QoUACkjt2znoq26NVQ= github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0VQdvPDY= github.com/magiconair/properties v1.8.7/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0= +github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= +github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= +github.com/mailru/easyjson v0.7.6 h1:8yTIVnZgCoiM1TgqoeTl+LfU5Jg6/xL3QhGQnimLYnA= +github.com/mailru/easyjson v0.7.6/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= github.com/matishsiao/goInfo v0.0.0-20240924010139-10388a85396f h1:XDrsC/9hdgiU9ecceSmYsS2E3fBtFiYc34dAMFgegnM= github.com/matishsiao/goInfo v0.0.0-20240924010139-10388a85396f/go.mod h1:aEt7p9Rvh67BYApmZwNDPpgircTO2kgdmDUoF/1QmwA= github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= @@ -971,6 +1013,12 @@ github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsT github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/subosito/gotenv v1.4.2 h1:X1TuBLAMDFbaTAChgCBLu3DU3UPyELpnF2jjJ2cz/S8= github.com/subosito/gotenv v1.4.2/go.mod h1:ayKnFf/c6rvx/2iiLrJUk1e6plDbT3edrFNGqEflhK0= +github.com/swaggo/files v1.0.1 h1:J1bVJ4XHZNq0I46UU90611i9/YzdrF7x92oX1ig5IdE= +github.com/swaggo/files v1.0.1/go.mod h1:0qXmMNH6sXNf+73t65aKeB+ApmgxdnkQzVTAj2uaMUg= +github.com/swaggo/gin-swagger v1.6.0 h1:y8sxvQ3E20/RCyrXeFfg60r6H0Z+SwpTjMYsMm+zy8M= +github.com/swaggo/gin-swagger v1.6.0/go.mod h1:BG00cCEy294xtVpyIAHG6+e2Qzj/xKlRdOqDkvq0uzo= +github.com/swaggo/swag v1.16.4 h1:clWJtd9LStiG3VeijiCfOVODP6VpHtKdQy9ELFG3s1A= +github.com/swaggo/swag v1.16.4/go.mod h1:VBsHJRsDvfYvqoiMKnsdwhNV9LEMHgEDZcyVYX0sxPg= github.com/tetratelabs/wazero v1.8.1 h1:NrcgVbWfkWvVc4UtT4LRLDf91PsOzDzefMdwhLfA550= github.com/tetratelabs/wazero v1.8.1/go.mod h1:yAI0XTsMBhREkM/YDAK/zNou3GoiAce1P6+rp/wQhjs= github.com/tj/assert v0.0.0-20190920132354-ee03d75cd160 h1:NSWpaDaurcAJY7PkL8Xt0PhZE7qpvbZl5ljd8r6U0bI= @@ -980,6 +1028,8 @@ github.com/tklauser/go-sysconf v0.3.12/go.mod h1:Ho14jnntGE1fpdOqQEEaiKRpvIavV0h github.com/tklauser/numcpus v0.6.1 h1:ng9scYS7az0Bk4OZLvrNXNSAO2Pxr1XXRAPyjhIx+Fk= github.com/tklauser/numcpus v0.6.1/go.mod h1:1XfjsgE2zo8GVw7POkMbHENHzVg3GzmoZ9fESEdAacY= github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= +github.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI= +github.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08= github.com/tyler-smith/go-bip39 v1.1.0 h1:5eUemwrMargf3BSLRRCalXT93Ns6pQJIjYQN2nyfOP8= github.com/tyler-smith/go-bip39 v1.1.0/go.mod h1:gUYDtqQw1JS3ZJ8UWVcGTGqqr6YIN3CWg+kkNaLt55U= github.com/uber/jaeger-client-go v2.30.0+incompatible h1:D6wyKGCecFaSRUpo8lCVbaOOb6ThwMmTEbhRwtKR97o= @@ -989,6 +1039,8 @@ github.com/uber/jaeger-lib v2.4.1+incompatible/go.mod h1:ComeNDZlWwrWnDv8aPp0Ba6 github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw= github.com/ugorji/go/codec v1.1.7 h1:2SvQaVZ1ouYrrKKwoSk2pzd4A9evlKJb9oTL+OaLUSs= github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY= +github.com/ugorji/go/codec v1.2.9 h1:rmenucSohSTiyL09Y+l2OCk+FrMxGMzho2+tjr5ticU= +github.com/ugorji/go/codec v1.2.9/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZgYf6w6lg= github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= github.com/urfave/cli v1.22.10/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= @@ -1075,6 +1127,8 @@ go.uber.org/zap v1.18.1/go.mod h1:xg/QME4nWcxGxrpdeYfq7UvYrLh66cuVKdrbD1XF/NI= go.uber.org/zap v1.19.1/go.mod h1:j3DNczoxDZroyBnOT1L/Q79cfUMGZxlv/9dzN7SM1rI= go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8= go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= +golang.org/x/arch v0.0.0-20210923205945-b76863e36670 h1:18EFjUmQOcUvxNYSkA6jO9VAiXCnxFY6NyDX0bHDmkU= +golang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8= golang.org/x/crypto v0.0.0-20170930174604-9419663f5a44/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= @@ -1186,6 +1240,7 @@ golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= +golang.org/x/net v0.0.0-20210421230115-4e50805a0758/go.mod h1:72T/g9IO56b78aLF+1Kcs5dz7/ng1VjMUvfKvpfy+jM= golang.org/x/net v0.0.0-20210423184538-5f58ad60dda6/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210916014120-12bc252f5db8/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= @@ -1279,6 +1334,7 @@ golang.org/x/sys v0.0.0-20210225134936-a50acf3fe073/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210420072515-93ed5bcd2bfe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210426080607-c94f62235c83/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -1538,6 +1594,7 @@ gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= From e16e5d29608c27896957a1de7ccea1488df37582 Mon Sep 17 00:00:00 2001 From: Jannis Metrikat <120120832+jmetrikat@users.noreply.github.com> Date: Wed, 20 Nov 2024 15:55:35 +0100 Subject: [PATCH 010/195] GO-4459 Fix lint imports and fmt --- cmd/api/handlers.go | 250 ++++++++++++++++++++++---------------------- cmd/api/main.go | 7 +- 2 files changed, 129 insertions(+), 128 deletions(-) diff --git a/cmd/api/handlers.go b/cmd/api/handlers.go index 59f616002..75328cbaa 100644 --- a/cmd/api/handlers.go +++ b/cmd/api/handlers.go @@ -19,13 +19,13 @@ type NameRequest struct { Name string `json:"name"` } -// @Summary Open a modal window with a code in Anytype Desktop app -// @Tags auth -// @Accept json -// @Produce json -// @Success 200 {string} string "Success" -// @Failure 502 {object} ServerError "Internal server error" -// @Router /auth/displayCode [post] +// @Summary Open a modal window with a code in Anytype Desktop app +// @Tags auth +// @Accept json +// @Produce json +// @Success 200 {string} string "Success" +// @Failure 502 {object} ServerError "Internal server error" +// @Router /auth/displayCode [post] func (a *ApiServer) authDisplayCodeHandler(c *gin.Context) { // Call AccountLocalLinkNewChallenge to display code modal ctx := context.Background() @@ -38,15 +38,15 @@ func (a *ApiServer) authDisplayCodeHandler(c *gin.Context) { c.JSON(http.StatusOK, gin.H{"challengeId": resp.ChallengeId}) } -// @Summary Retrieve an authentication token using a code -// @Tags auth -// @Accept json -// @Produce json -// @Param code query string true "The code retrieved from Anytype Desktop app" -// @Success 200 {object} map[string]string "Access and refresh tokens" -// @Failure 400 {object} ValidationError "Invalid input" -// @Failure 502 {object} ServerError "Internal server error" -// @Router /auth/token [get] +// @Summary Retrieve an authentication token using a code +// @Tags auth +// @Accept json +// @Produce json +// @Param code query string true "The code retrieved from Anytype Desktop app" +// @Success 200 {object} map[string]string "Access and refresh tokens" +// @Failure 400 {object} ValidationError "Invalid input" +// @Failure 502 {object} ServerError "Internal server error" +// @Router /auth/token [get] func (a *ApiServer) authTokenHandler(c *gin.Context) { // Call AccountLocalLinkSolveChallenge to retrieve session token and app key resp := a.mw.AccountLocalLinkSolveChallenge(context.Background(), &pb.RpcAccountLocalLinkSolveChallengeRequest{ @@ -65,16 +65,16 @@ func (a *ApiServer) authTokenHandler(c *gin.Context) { }) } -// @Summary Retrieve a list of spaces -// @Tags spaces -// @Accept json -// @Produce json -// @Param offset query int false "The number of items to skip before starting to collect the result set" -// @Param limit query int false "The number of items to return" default(100) -// @Success 200 {object} map[string][]Space "List of spaces" -// @Failure 403 {object} UnauthorizedError "Unauthorized" -// @Failure 502 {object} ServerError "Internal server error" -// @Router /spaces [get] +// @Summary Retrieve a list of spaces +// @Tags spaces +// @Accept json +// @Produce json +// @Param offset query int false "The number of items to skip before starting to collect the result set" +// @Param limit query int false "The number of items to return" default(100) +// @Success 200 {object} map[string][]Space "List of spaces" +// @Failure 403 {object} UnauthorizedError "Unauthorized" +// @Failure 502 {object} ServerError "Internal server error" +// @Router /spaces [get] func (a *ApiServer) getSpacesHandler(c *gin.Context) { // Call ObjectSearch for all objects of type spaceView resp := a.mw.ObjectSearch(context.Background(), &pb.RpcObjectSearchRequest{ @@ -129,15 +129,15 @@ func (a *ApiServer) getSpacesHandler(c *gin.Context) { c.JSON(http.StatusOK, gin.H{"spaces": spaces}) } -// @Summary Create a new Space -// @Tags spaces -// @Accept json -// @Produce json -// @Param name body string true "Space Name" -// @Success 200 {object} Space "Space created successfully" -// @Failure 403 {object} UnauthorizedError "Unauthorized" -// @Failure 502 {object} ServerError "Internal server error" -// @Router /spaces [post] +// @Summary Create a new Space +// @Tags spaces +// @Accept json +// @Produce json +// @Param name body string true "Space Name" +// @Success 200 {object} Space "Space created successfully" +// @Failure 403 {object} UnauthorizedError "Unauthorized" +// @Failure 502 {object} ServerError "Internal server error" +// @Router /spaces [post] func (a *ApiServer) createSpaceHandler(c *gin.Context) { // Create new workspace with a random icon and import default usecase nameRequest := NameRequest{} @@ -174,16 +174,16 @@ func (a *ApiServer) createSpaceHandler(c *gin.Context) { c.JSON(http.StatusOK, gin.H{"spaceId": resp.SpaceId, "name": name, "iconOption": iconOption}) } -// @Summary Retrieve a list of members for the specified Space -// @Tags spaces -// @Accept json -// @Produce json -// @Param space_id path string true "The ID of the space" -// @Success 200 {object} map[string][]SpaceMember "List of members" -// @Failure 403 {object} UnauthorizedError "Unauthorized" -// @Failure 404 {object} NotFoundError "Resource not found" -// @Failure 502 {object} ServerError "Internal server error" -// @Router /spaces/{space_id}/members [get] +// @Summary Retrieve a list of members for the specified Space +// @Tags spaces +// @Accept json +// @Produce json +// @Param space_id path string true "The ID of the space" +// @Success 200 {object} map[string][]SpaceMember "List of members" +// @Failure 403 {object} UnauthorizedError "Unauthorized" +// @Failure 404 {object} NotFoundError "Resource not found" +// @Failure 502 {object} ServerError "Internal server error" +// @Router /spaces/{space_id}/members [get] func (a *ApiServer) getSpaceMembersHandler(c *gin.Context) { // Call ObjectSearch for all objects of type participant spaceId := c.Param("space_id") @@ -226,35 +226,35 @@ func (a *ApiServer) getSpaceMembersHandler(c *gin.Context) { c.JSON(http.StatusOK, gin.H{"members": members}) } -// @Summary Retrieve objects in a specific space -// @Tags space_objects -// @Accept json -// @Produce json -// @Param space_id path string true "The ID of the space" -// @Param offset query int false "The number of items to skip before starting to collect the result set" -// @Param limit query int false "The number of items to return" default(100) -// @Success 200 {object} map[string]interface{} "Total objects and object list" -// @Failure 403 {object} UnauthorizedError "Unauthorized" -// @Failure 404 {object} NotFoundError "Resource not found" -// @Failure 502 {object} ServerError "Internal server error" -// @Router /spaces/{space_id}/objects [get] +// @Summary Retrieve objects in a specific space +// @Tags space_objects +// @Accept json +// @Produce json +// @Param space_id path string true "The ID of the space" +// @Param offset query int false "The number of items to skip before starting to collect the result set" +// @Param limit query int false "The number of items to return" default(100) +// @Success 200 {object} map[string]interface{} "Total objects and object list" +// @Failure 403 {object} UnauthorizedError "Unauthorized" +// @Failure 404 {object} NotFoundError "Resource not found" +// @Failure 502 {object} ServerError "Internal server error" +// @Router /spaces/{space_id}/objects [get] func (a *ApiServer) getSpaceObjectsHandler(c *gin.Context) { spaceID := c.Param("space_id") // TODO: Implement logic to retrieve objects in a space c.JSON(http.StatusNotImplemented, gin.H{"message": "Not implemented yet", "space_id": spaceID}) } -// @Summary Retrieve a specific object in a space -// @Tags space_objects -// @Accept json -// @Produce json -// @Param space_id path string true "The ID of the space" -// @Param object_id path string true "The ID of the object" -// @Success 200 {object} Object "The requested object" -// @Failure 403 {object} UnauthorizedError "Unauthorized" -// @Failure 404 {object} NotFoundError "Resource not found" -// @Failure 502 {object} ServerError "Internal server error" -// @Router /spaces/{space_id}/objects/{object_id} [get] +// @Summary Retrieve a specific object in a space +// @Tags space_objects +// @Accept json +// @Produce json +// @Param space_id path string true "The ID of the space" +// @Param object_id path string true "The ID of the object" +// @Success 200 {object} Object "The requested object" +// @Failure 403 {object} UnauthorizedError "Unauthorized" +// @Failure 404 {object} NotFoundError "Resource not found" +// @Failure 502 {object} ServerError "Internal server error" +// @Router /spaces/{space_id}/objects/{object_id} [get] func (a *ApiServer) getObjectHandler(c *gin.Context) { spaceID := c.Param("space_id") objectID := c.Param("object_id") @@ -262,34 +262,34 @@ func (a *ApiServer) getObjectHandler(c *gin.Context) { c.JSON(http.StatusNotImplemented, gin.H{"message": "Not implemented yet", "space_id": spaceID, "object_id": objectID}) } -// @Summary Create a new object in a specific space -// @Tags space_objects -// @Accept json -// @Produce json -// @Param space_id path string true "The ID of the space" -// @Param object body map[string]string true "Object details (e.g., name)" -// @Success 200 {object} Object "The created object" -// @Failure 403 {object} UnauthorizedError "Unauthorized" -// @Failure 502 {object} ServerError "Internal server error" -// @Router /spaces/{space_id}/objects [post] +// @Summary Create a new object in a specific space +// @Tags space_objects +// @Accept json +// @Produce json +// @Param space_id path string true "The ID of the space" +// @Param object body map[string]string true "Object details (e.g., name)" +// @Success 200 {object} Object "The created object" +// @Failure 403 {object} UnauthorizedError "Unauthorized" +// @Failure 502 {object} ServerError "Internal server error" +// @Router /spaces/{space_id}/objects [post] func (a *ApiServer) createObjectHandler(c *gin.Context) { spaceID := c.Param("space_id") // TODO: Implement logic to create a new object c.JSON(http.StatusNotImplemented, gin.H{"message": "Not implemented yet", "space_id": spaceID}) } -// @Summary Update an existing object in a specific space -// @Tags space_objects -// @Accept json -// @Produce json -// @Param space_id path string true "The ID of the space" -// @Param object_id path string true "The ID of the object" -// @Param object body Object true "The updated object details" -// @Success 200 {object} Object "The updated object" -// @Failure 403 {object} UnauthorizedError "Unauthorized" -// @Failure 404 {object} NotFoundError "Resource not found" -// @Failure 502 {object} ServerError "Internal server error" -// @Router /spaces/{space_id}/objects/{object_id} [put] +// @Summary Update an existing object in a specific space +// @Tags space_objects +// @Accept json +// @Produce json +// @Param space_id path string true "The ID of the space" +// @Param object_id path string true "The ID of the object" +// @Param object body Object true "The updated object details" +// @Success 200 {object} Object "The updated object" +// @Failure 403 {object} UnauthorizedError "Unauthorized" +// @Failure 404 {object} NotFoundError "Resource not found" +// @Failure 502 {object} ServerError "Internal server error" +// @Router /spaces/{space_id}/objects/{object_id} [put] func (a *ApiServer) updateObjectHandler(c *gin.Context) { spaceID := c.Param("space_id") objectID := c.Param("object_id") @@ -297,35 +297,35 @@ func (a *ApiServer) updateObjectHandler(c *gin.Context) { c.JSON(http.StatusNotImplemented, gin.H{"message": "Not implemented yet", "space_id": spaceID, "object_id": objectID}) } -// @Summary Retrieve object types in a specific space -// @Tags types_and_templates -// @Accept json -// @Produce json -// @Param space_id path string true "The ID of the space" -// @Param offset query int false "The number of items to skip before starting to collect the result set" -// @Param limit query int false "The number of items to return" default(100) -// @Success 200 {object} map[string]interface{} "Total and object types" -// @Failure 403 {object} UnauthorizedError "Unauthorized" -// @Failure 404 {object} NotFoundError "Resource not found" -// @Failure 502 {object} ServerError "Internal server error" -// @Router /spaces/{space_id}/objectTypes [get] +// @Summary Retrieve object types in a specific space +// @Tags types_and_templates +// @Accept json +// @Produce json +// @Param space_id path string true "The ID of the space" +// @Param offset query int false "The number of items to skip before starting to collect the result set" +// @Param limit query int false "The number of items to return" default(100) +// @Success 200 {object} map[string]interface{} "Total and object types" +// @Failure 403 {object} UnauthorizedError "Unauthorized" +// @Failure 404 {object} NotFoundError "Resource not found" +// @Failure 502 {object} ServerError "Internal server error" +// @Router /spaces/{space_id}/objectTypes [get] func (a *ApiServer) getObjectTypesHandler(c *gin.Context) { spaceID := c.Param("space_id") // TODO: Implement logic to retrieve object types in a space c.JSON(http.StatusNotImplemented, gin.H{"message": "Not implemented yet", "space_id": spaceID}) } -// @Summary Retrieve a list of templates for a specific object type in a space -// @Tags types_and_templates -// @Accept json -// @Produce json -// @Param space_id path string true "The ID of the space" -// @Param typeId path string true "The ID of the object type" -// @Success 200 {object} map[string][]ObjectTemplate "List of templates" -// @Failure 403 {object} UnauthorizedError "Unauthorized" -// @Failure 404 {object} NotFoundError "Resource not found" -// @Failure 502 {object} ServerError "Internal server error" -// @Router /spaces/{space_id}/objectTypes/{typeId}/templates [get] +// @Summary Retrieve a list of templates for a specific object type in a space +// @Tags types_and_templates +// @Accept json +// @Produce json +// @Param space_id path string true "The ID of the space" +// @Param typeId path string true "The ID of the object type" +// @Success 200 {object} map[string][]ObjectTemplate "List of templates" +// @Failure 403 {object} UnauthorizedError "Unauthorized" +// @Failure 404 {object} NotFoundError "Resource not found" +// @Failure 502 {object} ServerError "Internal server error" +// @Router /spaces/{space_id}/objectTypes/{typeId}/templates [get] func (a *ApiServer) getObjectTypeTemplatesHandler(c *gin.Context) { spaceID := c.Param("space_id") typeID := c.Param("typeId") @@ -333,18 +333,18 @@ func (a *ApiServer) getObjectTypeTemplatesHandler(c *gin.Context) { c.JSON(http.StatusNotImplemented, gin.H{"message": "Not implemented yet", "space_id": spaceID, "typeId": typeID}) } -// @Summary Search and retrieve objects across all the spaces -// @Tags search -// @Accept json -// @Produce json -// @Param search query string false "The search term to filter objects by name" -// @Param object_type query string false "Specify object type for search" -// @Param offset query int false "The number of items to skip before starting to collect the result set" -// @Param limit query int false "The number of items to return" default(100) -// @Success 200 {object} map[string]interface{} "Total objects and object list" -// @Failure 403 {object} UnauthorizedError "Unauthorized" -// @Failure 502 {object} ServerError "Internal server error" -// @Router /objects [get] +// @Summary Search and retrieve objects across all the spaces +// @Tags search +// @Accept json +// @Produce json +// @Param search query string false "The search term to filter objects by name" +// @Param object_type query string false "Specify object type for search" +// @Param offset query int false "The number of items to skip before starting to collect the result set" +// @Param limit query int false "The number of items to return" default(100) +// @Success 200 {object} map[string]interface{} "Total objects and object list" +// @Failure 403 {object} UnauthorizedError "Unauthorized" +// @Failure 502 {object} ServerError "Internal server error" +// @Router /objects [get] func (a *ApiServer) getObjectsHandler(c *gin.Context) { // TODO: Implement logic to search and retrieve objects across all spaces c.JSON(http.StatusNotImplemented, gin.H{"message": "Not implemented yet"}) diff --git a/cmd/api/main.go b/cmd/api/main.go index 1bf299a69..5070d238d 100644 --- a/cmd/api/main.go +++ b/cmd/api/main.go @@ -6,13 +6,14 @@ import ( "net/http" "time" + "github.com/gin-gonic/gin" + swaggerFiles "github.com/swaggo/files" + ginSwagger "github.com/swaggo/gin-swagger" + _ "github.com/anyproto/anytype-heart/cmd/api/docs" "github.com/anyproto/anytype-heart/core" "github.com/anyproto/anytype-heart/pb/service" "github.com/anyproto/anytype-heart/pkg/lib/pb/model" - "github.com/gin-gonic/gin" - swaggerFiles "github.com/swaggo/files" - ginSwagger "github.com/swaggo/gin-swagger" ) const ( From 8db96dee1fbc4ea2300e7c0b7f475a124b5e3de6 Mon Sep 17 00:00:00 2001 From: Jannis Metrikat <120120832+jmetrikat@users.noreply.github.com> Date: Wed, 20 Nov 2024 16:05:24 +0100 Subject: [PATCH 011/195] GO-4459 Fix godoc consistency --- cmd/api/handlers.go | 275 ++++++++++++++++++++++++-------------------- 1 file changed, 150 insertions(+), 125 deletions(-) diff --git a/cmd/api/handlers.go b/cmd/api/handlers.go index 75328cbaa..597a1d970 100644 --- a/cmd/api/handlers.go +++ b/cmd/api/handlers.go @@ -19,13 +19,15 @@ type NameRequest struct { Name string `json:"name"` } -// @Summary Open a modal window with a code in Anytype Desktop app -// @Tags auth -// @Accept json -// @Produce json -// @Success 200 {string} string "Success" -// @Failure 502 {object} ServerError "Internal server error" -// @Router /auth/displayCode [post] +// authdisplayCodeHandler generates a new challenge and returns the challenge ID +// +// @Summary Open a modal window with a code in Anytype Desktop app +// @Tags auth +// @Accept json +// @Produce json +// @Success 200 {string} string "Success" +// @Failure 502 {object} ServerError "Internal server error" +// @Router /auth/displayCode [post] func (a *ApiServer) authDisplayCodeHandler(c *gin.Context) { // Call AccountLocalLinkNewChallenge to display code modal ctx := context.Background() @@ -38,15 +40,18 @@ func (a *ApiServer) authDisplayCodeHandler(c *gin.Context) { c.JSON(http.StatusOK, gin.H{"challengeId": resp.ChallengeId}) } -// @Summary Retrieve an authentication token using a code -// @Tags auth -// @Accept json -// @Produce json -// @Param code query string true "The code retrieved from Anytype Desktop app" -// @Success 200 {object} map[string]string "Access and refresh tokens" -// @Failure 400 {object} ValidationError "Invalid input" -// @Failure 502 {object} ServerError "Internal server error" -// @Router /auth/token [get] +// authTokenHandler retrieves an authentication token using a code and challenge ID +// +// @Summary Retrieve an authentication token using a code +// @Tags auth +// @Accept json +// @Produce json +// @Param code query string true "The code retrieved from Anytype Desktop app" +// @ParamchallengeId query string true "The challenge ID" +// @Success 200 {object} map[string]string "Access and refresh tokens" +// @Failure 400 {object} ValidationError "Invalid input" +// @Failure 502 {object} ServerError "Internal server error" +// @Router /auth/token [get] func (a *ApiServer) authTokenHandler(c *gin.Context) { // Call AccountLocalLinkSolveChallenge to retrieve session token and app key resp := a.mw.AccountLocalLinkSolveChallenge(context.Background(), &pb.RpcAccountLocalLinkSolveChallengeRequest{ @@ -65,16 +70,18 @@ func (a *ApiServer) authTokenHandler(c *gin.Context) { }) } -// @Summary Retrieve a list of spaces -// @Tags spaces -// @Accept json -// @Produce json -// @Param offset query int false "The number of items to skip before starting to collect the result set" -// @Param limit query int false "The number of items to return" default(100) -// @Success 200 {object} map[string][]Space "List of spaces" -// @Failure 403 {object} UnauthorizedError "Unauthorized" -// @Failure 502 {object} ServerError "Internal server error" -// @Router /spaces [get] +// getSpacesHandler retrieves a list of spaces +// +// @Summary Retrieve a list of spaces +// @Tags spaces +// @Accept json +// @Produce json +// @Param offset query int false "The number of items to skip before starting to collect the result set" +// @Param limit query int false "The number of items to return" default(100) +// @Success 200 {object} map[string][]Space "List of spaces" +// @Failure 403 {object} UnauthorizedError "Unauthorized" +// @Failure 502 {object} ServerError "Internal server error" +// @Router /spaces [get] func (a *ApiServer) getSpacesHandler(c *gin.Context) { // Call ObjectSearch for all objects of type spaceView resp := a.mw.ObjectSearch(context.Background(), &pb.RpcObjectSearchRequest{ @@ -129,15 +136,17 @@ func (a *ApiServer) getSpacesHandler(c *gin.Context) { c.JSON(http.StatusOK, gin.H{"spaces": spaces}) } -// @Summary Create a new Space -// @Tags spaces -// @Accept json -// @Produce json -// @Param name body string true "Space Name" -// @Success 200 {object} Space "Space created successfully" -// @Failure 403 {object} UnauthorizedError "Unauthorized" -// @Failure 502 {object} ServerError "Internal server error" -// @Router /spaces [post] +// createSpaceHandler creates a new space +// +// @Summary Create a new Space +// @Tags spaces +// @Accept json +// @Produce json +// @Param name body string true "Space Name" +// @Success 200 {object} Space "Space created successfully" +// @Failure 403 {object} UnauthorizedError "Unauthorized" +// @Failure 502 {object} ServerError "Internal server error" +// @Router /spaces [post] func (a *ApiServer) createSpaceHandler(c *gin.Context) { // Create new workspace with a random icon and import default usecase nameRequest := NameRequest{} @@ -174,16 +183,18 @@ func (a *ApiServer) createSpaceHandler(c *gin.Context) { c.JSON(http.StatusOK, gin.H{"spaceId": resp.SpaceId, "name": name, "iconOption": iconOption}) } -// @Summary Retrieve a list of members for the specified Space -// @Tags spaces -// @Accept json -// @Produce json -// @Param space_id path string true "The ID of the space" -// @Success 200 {object} map[string][]SpaceMember "List of members" -// @Failure 403 {object} UnauthorizedError "Unauthorized" -// @Failure 404 {object} NotFoundError "Resource not found" -// @Failure 502 {object} ServerError "Internal server error" -// @Router /spaces/{space_id}/members [get] +// getSpaceMembersHandler retrieves a list of members for the specified space +// +// @Summary Retrieve a list of members for the specified Space +// @Tags spaces +// @Accept json +// @Produce json +// @Param space_id path string true "The ID of the space" +// @Success 200 {object} map[string][]SpaceMember "List of members" +// @Failure 403 {object} UnauthorizedError "Unauthorized" +// @Failure 404 {object} NotFoundError "Resource not found" +// @Failure 502 {object} ServerError "Internal server error" +// @Router /spaces/{space_id}/members [get] func (a *ApiServer) getSpaceMembersHandler(c *gin.Context) { // Call ObjectSearch for all objects of type participant spaceId := c.Param("space_id") @@ -226,35 +237,39 @@ func (a *ApiServer) getSpaceMembersHandler(c *gin.Context) { c.JSON(http.StatusOK, gin.H{"members": members}) } -// @Summary Retrieve objects in a specific space -// @Tags space_objects -// @Accept json -// @Produce json -// @Param space_id path string true "The ID of the space" -// @Param offset query int false "The number of items to skip before starting to collect the result set" -// @Param limit query int false "The number of items to return" default(100) -// @Success 200 {object} map[string]interface{} "Total objects and object list" -// @Failure 403 {object} UnauthorizedError "Unauthorized" -// @Failure 404 {object} NotFoundError "Resource not found" -// @Failure 502 {object} ServerError "Internal server error" -// @Router /spaces/{space_id}/objects [get] +// getSpaceHandler retrieves objects in a specific space +// +// @Summary Retrieve objects in a specific space +// @Tags space_objects +// @Accept json +// @Produce json +// @Param space_id path string true "The ID of the space" +// @Param offset query int false "The number of items to skip before starting to collect the result set" +// @Param limit query int false "The number of items to return" default(100) +// @Success 200 {object} map[string]interface{} "Total objects and object list" +// @Failure 403 {object} UnauthorizedError "Unauthorized" +// @Failure 404 {object} NotFoundError "Resource not found" +// @Failure 502 {object} ServerError "Internal server error" +// @Router /spaces/{space_id}/objects [get] func (a *ApiServer) getSpaceObjectsHandler(c *gin.Context) { spaceID := c.Param("space_id") // TODO: Implement logic to retrieve objects in a space c.JSON(http.StatusNotImplemented, gin.H{"message": "Not implemented yet", "space_id": spaceID}) } -// @Summary Retrieve a specific object in a space -// @Tags space_objects -// @Accept json -// @Produce json -// @Param space_id path string true "The ID of the space" -// @Param object_id path string true "The ID of the object" -// @Success 200 {object} Object "The requested object" -// @Failure 403 {object} UnauthorizedError "Unauthorized" -// @Failure 404 {object} NotFoundError "Resource not found" -// @Failure 502 {object} ServerError "Internal server error" -// @Router /spaces/{space_id}/objects/{object_id} [get] +// getObjectHandler retrieves a specific object in a space +// +// @Summary Retrieve a specific object in a space +// @Tags space_objects +// @Accept json +// @Produce json +// @Param space_id path string true "The ID of the space" +// @Param object_id path string true "The ID of the object" +// @Success 200 {object} Object "The requested object" +// @Failure 403 {object} UnauthorizedError "Unauthorized" +// @Failure 404 {object} NotFoundError "Resource not found" +// @Failure 502 {object} ServerError "Internal server error" +// @Router /spaces/{space_id}/objects/{object_id} [get] func (a *ApiServer) getObjectHandler(c *gin.Context) { spaceID := c.Param("space_id") objectID := c.Param("object_id") @@ -262,34 +277,38 @@ func (a *ApiServer) getObjectHandler(c *gin.Context) { c.JSON(http.StatusNotImplemented, gin.H{"message": "Not implemented yet", "space_id": spaceID, "object_id": objectID}) } -// @Summary Create a new object in a specific space -// @Tags space_objects -// @Accept json -// @Produce json -// @Param space_id path string true "The ID of the space" -// @Param object body map[string]string true "Object details (e.g., name)" -// @Success 200 {object} Object "The created object" -// @Failure 403 {object} UnauthorizedError "Unauthorized" -// @Failure 502 {object} ServerError "Internal server error" -// @Router /spaces/{space_id}/objects [post] +// createObjectHandler creates a new object in a specific space +// +// @Summary Create a new object in a specific space +// @Tags space_objects +// @Accept json +// @Produce json +// @Param space_id path string true "The ID of the space" +// @Param object body map[string]string true "Object details (e.g., name)" +// @Success 200 {object} Object "The created object" +// @Failure 403 {object} UnauthorizedError "Unauthorized" +// @Failure 502 {object} ServerError "Internal server error" +// @Router /spaces/{space_id}/objects [post] func (a *ApiServer) createObjectHandler(c *gin.Context) { spaceID := c.Param("space_id") // TODO: Implement logic to create a new object c.JSON(http.StatusNotImplemented, gin.H{"message": "Not implemented yet", "space_id": spaceID}) } -// @Summary Update an existing object in a specific space -// @Tags space_objects -// @Accept json -// @Produce json -// @Param space_id path string true "The ID of the space" -// @Param object_id path string true "The ID of the object" -// @Param object body Object true "The updated object details" -// @Success 200 {object} Object "The updated object" -// @Failure 403 {object} UnauthorizedError "Unauthorized" -// @Failure 404 {object} NotFoundError "Resource not found" -// @Failure 502 {object} ServerError "Internal server error" -// @Router /spaces/{space_id}/objects/{object_id} [put] +// updateObjectHandler updates an existing object in a specific space +// +// @Summary Update an existing object in a specific space +// @Tags space_objects +// @Accept json +// @Produce json +// @Param space_id path string true "The ID of the space" +// @Param object_id path string true "The ID of the object" +// @Param object body Object true "The updated object details" +// @Success 200 {object} Object "The updated object" +// @Failure 403 {object} UnauthorizedError "Unauthorized" +// @Failure 404 {object} NotFoundError "Resource not found" +// @Failure 502 {object} ServerError "Internal server error" +// @Router /spaces/{space_id}/objects/{object_id} [put] func (a *ApiServer) updateObjectHandler(c *gin.Context) { spaceID := c.Param("space_id") objectID := c.Param("object_id") @@ -297,35 +316,39 @@ func (a *ApiServer) updateObjectHandler(c *gin.Context) { c.JSON(http.StatusNotImplemented, gin.H{"message": "Not implemented yet", "space_id": spaceID, "object_id": objectID}) } -// @Summary Retrieve object types in a specific space -// @Tags types_and_templates -// @Accept json -// @Produce json -// @Param space_id path string true "The ID of the space" -// @Param offset query int false "The number of items to skip before starting to collect the result set" -// @Param limit query int false "The number of items to return" default(100) -// @Success 200 {object} map[string]interface{} "Total and object types" -// @Failure 403 {object} UnauthorizedError "Unauthorized" -// @Failure 404 {object} NotFoundError "Resource not found" -// @Failure 502 {object} ServerError "Internal server error" -// @Router /spaces/{space_id}/objectTypes [get] +// getObjectTypesHandler retrieves object types in a specific space +// +// @Summary Retrieve object types in a specific space +// @Tags types_and_templates +// @Accept json +// @Produce json +// @Param space_id path string true "The ID of the space" +// @Param offset query int false "The number of items to skip before starting to collect the result set" +// @Param limit query int false "The number of items to return" default(100) +// @Success 200 {object} map[string]interface{} "Total and object types" +// @Failure 403 {object} UnauthorizedError "Unauthorized" +// @Failure 404 {object} NotFoundError "Resource not found" +// @Failure 502 {object} ServerError "Internal server error" +// @Router /spaces/{space_id}/objectTypes [get] func (a *ApiServer) getObjectTypesHandler(c *gin.Context) { spaceID := c.Param("space_id") // TODO: Implement logic to retrieve object types in a space c.JSON(http.StatusNotImplemented, gin.H{"message": "Not implemented yet", "space_id": spaceID}) } -// @Summary Retrieve a list of templates for a specific object type in a space -// @Tags types_and_templates -// @Accept json -// @Produce json -// @Param space_id path string true "The ID of the space" -// @Param typeId path string true "The ID of the object type" -// @Success 200 {object} map[string][]ObjectTemplate "List of templates" -// @Failure 403 {object} UnauthorizedError "Unauthorized" -// @Failure 404 {object} NotFoundError "Resource not found" -// @Failure 502 {object} ServerError "Internal server error" -// @Router /spaces/{space_id}/objectTypes/{typeId}/templates [get] +// getObjectTypeTemplatesHandler retrieves a list of templates for a specific object type in a space +// +// @Summary Retrieve a list of templates for a specific object type in a space +// @Tags types_and_templates +// @Accept json +// @Produce json +// @Param space_id path string true "The ID of the space" +// @Param typeId path string true "The ID of the object type" +// @Success 200 {object} map[string][]ObjectTemplate "List of templates" +// @Failure 403 {object} UnauthorizedError "Unauthorized" +// @Failure 404 {object} NotFoundError "Resource not found" +// @Failure 502 {object} ServerError "Internal server error" +// @Router /spaces/{space_id}/objectTypes/{typeId}/templates [get] func (a *ApiServer) getObjectTypeTemplatesHandler(c *gin.Context) { spaceID := c.Param("space_id") typeID := c.Param("typeId") @@ -333,18 +356,20 @@ func (a *ApiServer) getObjectTypeTemplatesHandler(c *gin.Context) { c.JSON(http.StatusNotImplemented, gin.H{"message": "Not implemented yet", "space_id": spaceID, "typeId": typeID}) } -// @Summary Search and retrieve objects across all the spaces -// @Tags search -// @Accept json -// @Produce json -// @Param search query string false "The search term to filter objects by name" -// @Param object_type query string false "Specify object type for search" -// @Param offset query int false "The number of items to skip before starting to collect the result set" -// @Param limit query int false "The number of items to return" default(100) -// @Success 200 {object} map[string]interface{} "Total objects and object list" -// @Failure 403 {object} UnauthorizedError "Unauthorized" -// @Failure 502 {object} ServerError "Internal server error" -// @Router /objects [get] +// getObjectsHandler searches and retrieves objects across all the spaces +// +// @Summary Search and retrieve objects across all the spaces +// @Tags search +// @Accept json +// @Produce json +// @Param search query string false "The search term to filter objects by name" +// @Param object_type query string false "Specify object type for search" +// @Param offset query int false "The number of items to skip before starting to collect the result set" +// @Param limit query int false "The number of items to return" default(100) +// @Success 200 {object} map[string]interface{} "Total objects and object list" +// @Failure 403 {object} UnauthorizedError "Unauthorized" +// @Failure 502 {object} ServerError "Internal server error" +// @Router /objects [get] func (a *ApiServer) getObjectsHandler(c *gin.Context) { // TODO: Implement logic to search and retrieve objects across all spaces c.JSON(http.StatusNotImplemented, gin.H{"message": "Not implemented yet"}) From f59989bb6a166ae378f949fe7bc71aa94000592e Mon Sep 17 00:00:00 2001 From: Jannis Metrikat <120120832+jmetrikat@users.noreply.github.com> Date: Wed, 20 Nov 2024 19:02:53 +0100 Subject: [PATCH 012/195] GO-4459 Add object search handler --- cmd/api/handlers.go | 82 +++++++++++++++++++++++++++++++++++++++++++-- cmd/api/schemas.go | 15 +++++---- 2 files changed, 87 insertions(+), 10 deletions(-) diff --git a/cmd/api/handlers.go b/cmd/api/handlers.go index 597a1d970..78ad0360e 100644 --- a/cmd/api/handlers.go +++ b/cmd/api/handlers.go @@ -116,7 +116,7 @@ func (a *ApiServer) getSpacesHandler(c *gin.Context) { // TODO: Populate missing fields space := Space{ Type: typeName, - ID: record.Fields["id"].GetStringValue(), + ID: record.Fields["targetSpaceId"].GetStringValue(), Name: record.Fields["name"].GetStringValue(), HomeObjectID: record.Fields["spaceDashboardId"].GetStringValue(), // ArchiveObjectID: record.Fields["archive_object_id"].GetStringValue(), @@ -371,6 +371,82 @@ func (a *ApiServer) getObjectTypeTemplatesHandler(c *gin.Context) { // @Failure 502 {object} ServerError "Internal server error" // @Router /objects [get] func (a *ApiServer) getObjectsHandler(c *gin.Context) { - // TODO: Implement logic to search and retrieve objects across all spaces - c.JSON(http.StatusNotImplemented, gin.H{"message": "Not implemented yet"}) + searchTerm := c.Query("search") + objectType := c.Query("object_type") + // TODO implement offset and limit + // offset := c.DefaultQuery("offset", "0") + // limit := c.DefaultQuery("limit", "100") + + // First, call ObjectSearch for all objects of type spaceView + resp := a.mw.ObjectSearch(context.Background(), &pb.RpcObjectSearchRequest{ + SpaceId: a.accountInfo.TechSpaceId, + Filters: []*model.BlockContentDataviewFilter{ + { + RelationKey: bundle.RelationKeyLayout.String(), + Condition: model.BlockContentDataviewFilter_Equal, + Value: pbtypes.Int64(int64(model.ObjectType_spaceView)), + }, + { + RelationKey: bundle.RelationKeySpaceLocalStatus.String(), + Condition: model.BlockContentDataviewFilter_Equal, + Value: pbtypes.Int64(int64(model.SpaceStatus_Ok)), + }, + }, + }) + if resp.Error.Code != pb.RpcObjectSearchResponseError_NULL { + c.JSON(http.StatusInternalServerError, gin.H{"message": "Failed to retrieve list of spaces."}) + return + } + + // Then, get objects from each space that match the search parameters + searchResults := make([]Object, 0) + for _, spaceRecord := range resp.Records { + objectSearchResponse := a.mw.ObjectSearch(context.Background(), &pb.RpcObjectSearchRequest{ + SpaceId: spaceRecord.Fields["targetSpaceId"].GetStringValue(), + Filters: []*model.BlockContentDataviewFilter{ + { + RelationKey: bundle.RelationKeyLayout.String(), + Condition: model.BlockContentDataviewFilter_In, + Value: pbtypes.IntList([]int{ + int(model.ObjectType_basic), + int(model.ObjectType_note), + int(model.ObjectType_bookmark), + int(model.ObjectType_set), + int(model.ObjectType_collection), + }...), + }, + { + RelationKey: bundle.RelationKeyIsHidden.String(), + Condition: model.BlockContentDataviewFilter_NotEqual, + Value: pbtypes.String("true"), + }, + { + RelationKey: bundle.RelationKeyName.String(), + Condition: model.BlockContentDataviewFilter_Like, + Value: pbtypes.String(searchTerm), + }, + { + RelationKey: bundle.RelationKeyType.String(), + Condition: model.BlockContentDataviewFilter_Equal, + Value: pbtypes.String(objectType), + }, + }, + }) + + for _, record := range objectSearchResponse.Records { + searchResults = append(searchResults, Object{ + Type: model.ObjectTypeLayout_name[int32(record.Fields["layout"].GetNumberValue())], + ID: record.Fields["id"].GetStringValue(), + Name: record.Fields["name"].GetStringValue(), + IconEmoji: record.Fields["iconEmoji"].GetStringValue(), + ObjectType: record.Fields["type"].GetStringValue(), + // TODO populate other fields + // RootID: record.Fields["rootId"].GetStringValue(), + // Blocks: []Block{}, + // Details: []Detail{}, + }) + } + } + + c.JSON(http.StatusOK, gin.H{"objects": searchResults}) } diff --git a/cmd/api/schemas.go b/cmd/api/schemas.go index 37072b263..e68504c25 100644 --- a/cmd/api/schemas.go +++ b/cmd/api/schemas.go @@ -25,13 +25,14 @@ type SpaceMember struct { } type Object struct { - Type string `json:"type" example:"object"` - ID string `json:"id"` - ObjectType string `json:"object_type" example:"note"` - RootID string `json:"root_id"` - Blocks []Block `json:"blocks"` - Details []Detail `json:"details"` - RelationLinksList []RelationLink `json:"relation_links_list"` + Type string `json:"type" example:"object"` + ID string `json:"id" example:"bafyreie6n5l5nkbjal37su54cha4coy7qzuhrnajluzv5qd5jvtsrxkequ"` + Name string `json:"name" example:"Object Name"` + IconEmoji string `json:"iconEmoji"` + ObjectType string `json:"object_type" example:"note"` + RootID string `json:"root_id"` + Blocks []Block `json:"blocks"` + Details []Detail `json:"details"` } type Block struct { From cf08f2af5081261b4e5efaf9e169d7a797ef2006 Mon Sep 17 00:00:00 2001 From: Jannis Metrikat <120120832+jmetrikat@users.noreply.github.com> Date: Wed, 20 Nov 2024 19:31:46 +0100 Subject: [PATCH 013/195] GO-4459 Add space_object handlers --- cmd/api/handlers.go | 76 ++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 72 insertions(+), 4 deletions(-) diff --git a/cmd/api/handlers.go b/cmd/api/handlers.go index 78ad0360e..6adf1d2e0 100644 --- a/cmd/api/handlers.go +++ b/cmd/api/handlers.go @@ -253,8 +253,50 @@ func (a *ApiServer) getSpaceMembersHandler(c *gin.Context) { // @Router /spaces/{space_id}/objects [get] func (a *ApiServer) getSpaceObjectsHandler(c *gin.Context) { spaceID := c.Param("space_id") - // TODO: Implement logic to retrieve objects in a space - c.JSON(http.StatusNotImplemented, gin.H{"message": "Not implemented yet", "space_id": spaceID}) + // TODO implement offset and limit + // offset, _ := strconv.Atoi(c.DefaultQuery("offset", "0")) + // limit, _ := strconv.Atoi(c.DefaultQuery("limit", "100")) + + resp := a.mw.ObjectSearch(context.Background(), &pb.RpcObjectSearchRequest{ + SpaceId: spaceID, + Filters: []*model.BlockContentDataviewFilter{ + { + RelationKey: bundle.RelationKeyLayout.String(), + Condition: model.BlockContentDataviewFilter_In, + Value: pbtypes.IntList([]int{ + int(model.ObjectType_basic), + int(model.ObjectType_note), + int(model.ObjectType_bookmark), + int(model.ObjectType_set), + int(model.ObjectType_collection), + }...), + }, + }, + }) + + if resp.Error.Code != pb.RpcObjectSearchResponseError_NULL { + c.JSON(http.StatusInternalServerError, gin.H{"message": "Failed to retrieve list of objects."}) + return + } + + // Convert the response to a list of objects with their details: type, id, name, iconEmoji, objectType, rootID, blocks, details + objects := make([]Object, 0, len(resp.Records)) + for _, record := range resp.Records { + object := Object{ + Type: model.ObjectTypeLayout_name[int32(record.Fields["layout"].GetNumberValue())], + ID: record.Fields["id"].GetStringValue(), + Name: record.Fields["name"].GetStringValue(), + IconEmoji: record.Fields["iconEmoji"].GetStringValue(), + ObjectType: record.Fields["type"].GetStringValue(), + RootID: record.Fields["rootId"].GetStringValue(), + Blocks: []Block{}, + Details: []Detail{}, + } + + objects = append(objects, object) + } + + c.JSON(http.StatusOK, gin.H{"objects": objects}) } // getObjectHandler retrieves a specific object in a space @@ -273,8 +315,34 @@ func (a *ApiServer) getSpaceObjectsHandler(c *gin.Context) { func (a *ApiServer) getObjectHandler(c *gin.Context) { spaceID := c.Param("space_id") objectID := c.Param("object_id") - // TODO: Implement logic to retrieve a specific object - c.JSON(http.StatusNotImplemented, gin.H{"message": "Not implemented yet", "space_id": spaceID, "object_id": objectID}) + + resp := a.mw.ObjectOpen(context.Background(), &pb.RpcObjectOpenRequest{ + SpaceId: spaceID, + ObjectId: objectID, + }) + + if resp.Error.Code != pb.RpcObjectOpenResponseError_NULL { + if resp.Error.Code == pb.RpcObjectOpenResponseError_NOT_FOUND { + c.JSON(http.StatusNotFound, gin.H{"message": "Object not found", "space_id": spaceID, "object_id": objectID}) + return + } + c.JSON(http.StatusInternalServerError, gin.H{"message": "Failed to retrieve object."}) + return + } + + // Convert the response to an Object struct with its details: type, id, name, iconEmoji, objectType, rootID, blocks, details + object := Object{ + Type: "object", + ID: objectID, + Name: resp.ObjectView.Details[0].Details.Fields["name"].GetStringValue(), + IconEmoji: resp.ObjectView.Details[0].Details.Fields["iconEmoji"].GetStringValue(), + ObjectType: resp.ObjectView.Details[0].Details.Fields["type"].GetStringValue(), + RootID: resp.ObjectView.RootId, + Blocks: []Block{}, + Details: []Detail{}, + } + + c.JSON(http.StatusOK, gin.H{"object": object}) } // createObjectHandler creates a new object in a specific space From 74fb364905445496fb0ab12af320c787354d435c Mon Sep 17 00:00:00 2001 From: Jannis Metrikat <120120832+jmetrikat@users.noreply.github.com> Date: Wed, 20 Nov 2024 19:52:19 +0100 Subject: [PATCH 014/195] GO-4459 Cleanup handlers, middleware and docs --- cmd/api/handlers.go | 66 ++++++++++++++++++++++++------------------- cmd/api/main.go | 35 +++++++++++------------ cmd/api/middleware.go | 8 +++--- 3 files changed, 57 insertions(+), 52 deletions(-) diff --git a/cmd/api/handlers.go b/cmd/api/handlers.go index 6adf1d2e0..e9963f765 100644 --- a/cmd/api/handlers.go +++ b/cmd/api/handlers.go @@ -47,7 +47,7 @@ func (a *ApiServer) authDisplayCodeHandler(c *gin.Context) { // @Accept json // @Produce json // @Param code query string true "The code retrieved from Anytype Desktop app" -// @ParamchallengeId query string true "The challenge ID" +// @ParamchallengeId query string true "The challenge ID" // @Success 200 {object} map[string]string "Access and refresh tokens" // @Failure 400 {object} ValidationError "Invalid input" // @Failure 502 {object} ServerError "Internal server error" @@ -104,31 +104,40 @@ func (a *ApiServer) getSpacesHandler(c *gin.Context) { return } - // Convert the response to a list of spaces with their details: type, id, homeObjectID, archiveObjectID, profileObjectID, marketplaceWorkspaceID, deviceID, accountSpaceID, widgetsID, spaceViewID, techSpaceID, timezone, networkID spaces := make([]Space, 0, len(resp.Records)) for _, record := range resp.Records { - typeName, err := a.resolveTypeToName(record.Fields["targetSpaceId"].GetStringValue(), "ot-space") + spaceId := record.Fields["targetSpaceId"].GetStringValue() + workspaceResponse := a.mw.WorkspaceOpen(context.Background(), &pb.RpcWorkspaceOpenRequest{ + SpaceId: spaceId, + WithChat: true, + }) + + if workspaceResponse.Error.Code != pb.RpcWorkspaceOpenResponseError_NULL { + c.JSON(http.StatusInternalServerError, gin.H{"message": "Failed to open workspace."}) + return + } + + typeName, err := a.resolveTypeToName(spaceId, "ot-space") if err != nil { c.JSON(http.StatusInternalServerError, gin.H{"message": "Failed to resolve type to name."}) return } - // TODO: Populate missing fields space := Space{ - Type: typeName, - ID: record.Fields["targetSpaceId"].GetStringValue(), - Name: record.Fields["name"].GetStringValue(), - HomeObjectID: record.Fields["spaceDashboardId"].GetStringValue(), - // ArchiveObjectID: record.Fields["archive_object_id"].GetStringValue(), - // ProfileObjectID: record.Fields["profile_object_id"].GetStringValue(), - // MarketplaceWorkspaceID: record.Fields["marketplace_workspace_id"].GetStringValue(), - // DeviceID: record.Fields["device_id"].GetStringValue(), - // AccountSpaceID: record.Fields["account_space_id"].GetStringValue(), - // WidgetsID: record.Fields["widgets_id"].GetStringValue(), - // SpaceViewID: record.Fields["space_view_id"].GetStringValue(), - TechSpaceID: a.accountInfo.TechSpaceId, - // Timezone: record.Fields["timezone"].GetStringValue(), - // NetworkID: record.Fields["network_id"].GetStringValue(), + Type: typeName, + ID: spaceId, + Name: record.Fields["name"].GetStringValue(), + HomeObjectID: record.Fields["spaceDashboardId"].GetStringValue(), + ArchiveObjectID: workspaceResponse.Info.ArchiveObjectId, + ProfileObjectID: workspaceResponse.Info.ProfileObjectId, + MarketplaceWorkspaceID: workspaceResponse.Info.MarketplaceWorkspaceId, + DeviceID: workspaceResponse.Info.DeviceId, + AccountSpaceID: workspaceResponse.Info.AccountSpaceId, + WidgetsID: workspaceResponse.Info.WidgetsId, + SpaceViewID: workspaceResponse.Info.SpaceViewId, + TechSpaceID: a.accountInfo.TechSpaceId, + Timezone: workspaceResponse.Info.TimeZone, + NetworkID: workspaceResponse.Info.NetworkId, } spaces = append(spaces, space) } @@ -215,7 +224,6 @@ func (a *ApiServer) getSpaceMembersHandler(c *gin.Context) { return } - // Convert the response to a slice of SpaceMember structs with their details: type, identity, name, role members := make([]SpaceMember, 0, len(resp.Records)) for _, record := range resp.Records { typeName, err := a.resolveTypeToName(spaceId, record.Fields["type"].GetStringValue()) @@ -253,7 +261,7 @@ func (a *ApiServer) getSpaceMembersHandler(c *gin.Context) { // @Router /spaces/{space_id}/objects [get] func (a *ApiServer) getSpaceObjectsHandler(c *gin.Context) { spaceID := c.Param("space_id") - // TODO implement offset and limit + // TODO: implement offset and limit // offset, _ := strconv.Atoi(c.DefaultQuery("offset", "0")) // limit, _ := strconv.Atoi(c.DefaultQuery("limit", "100")) @@ -279,7 +287,6 @@ func (a *ApiServer) getSpaceObjectsHandler(c *gin.Context) { return } - // Convert the response to a list of objects with their details: type, id, name, iconEmoji, objectType, rootID, blocks, details objects := make([]Object, 0, len(resp.Records)) for _, record := range resp.Records { object := Object{ @@ -289,8 +296,9 @@ func (a *ApiServer) getSpaceObjectsHandler(c *gin.Context) { IconEmoji: record.Fields["iconEmoji"].GetStringValue(), ObjectType: record.Fields["type"].GetStringValue(), RootID: record.Fields["rootId"].GetStringValue(), - Blocks: []Block{}, - Details: []Detail{}, + // TODO: populate other fields + Blocks: []Block{}, + Details: []Detail{}, } objects = append(objects, object) @@ -330,7 +338,6 @@ func (a *ApiServer) getObjectHandler(c *gin.Context) { return } - // Convert the response to an Object struct with its details: type, id, name, iconEmoji, objectType, rootID, blocks, details object := Object{ Type: "object", ID: objectID, @@ -338,8 +345,9 @@ func (a *ApiServer) getObjectHandler(c *gin.Context) { IconEmoji: resp.ObjectView.Details[0].Details.Fields["iconEmoji"].GetStringValue(), ObjectType: resp.ObjectView.Details[0].Details.Fields["type"].GetStringValue(), RootID: resp.ObjectView.RootId, - Blocks: []Block{}, - Details: []Detail{}, + // TODO: populate other fields + Blocks: []Block{}, + Details: []Detail{}, } c.JSON(http.StatusOK, gin.H{"object": object}) @@ -441,7 +449,7 @@ func (a *ApiServer) getObjectTypeTemplatesHandler(c *gin.Context) { func (a *ApiServer) getObjectsHandler(c *gin.Context) { searchTerm := c.Query("search") objectType := c.Query("object_type") - // TODO implement offset and limit + // TODO: implement offset and limit // offset := c.DefaultQuery("offset", "0") // limit := c.DefaultQuery("limit", "100") @@ -508,10 +516,10 @@ func (a *ApiServer) getObjectsHandler(c *gin.Context) { Name: record.Fields["name"].GetStringValue(), IconEmoji: record.Fields["iconEmoji"].GetStringValue(), ObjectType: record.Fields["type"].GetStringValue(), - // TODO populate other fields + // TODO: populate other fields // RootID: record.Fields["rootId"].GetStringValue(), // Blocks: []Block{}, - // Details: []Detail{}, + // Details: []Detail{}, }) } } diff --git a/cmd/api/main.go b/cmd/api/main.go index 5070d238d..c6e59dadd 100644 --- a/cmd/api/main.go +++ b/cmd/api/main.go @@ -52,28 +52,25 @@ func newApiServer(mw service.ClientCommandsServer, mwInternal core.MiddlewareInt return a } -// @title Anytype API -// @version 1.0 -// @description This API allows interaction with Anytype resources such as spaces, objects, and object types. -// @termsOfService https://anytype.io/terms_of_use - -// @contact.name Anytype Support -// @contact.url https://anytype.io/contact -// @contact.email support@anytype.io - -// @license.name Apache 2.0 -// @license.url http://www.apache.org/licenses/LICENSE-2.0.html - -// @host localhost:31009 -// @BasePath /v1 - +// RunApiServer starts the HTTP server and registers the API routes. +// +// @title Anytype API +// @version 1.0 +// @description This API allows interaction with Anytype resources such as spaces, objects, and object types. +// @termsOfService https://anytype.io/terms_of_use +// @contact.name Anytype Support +// @contact.url https://anytype.io/contact +// @contact.email support@anytype.io +// @license.name Any Source Available License 1.0 +// @license.url https://github.com/anyproto/anytype-ts/blob/main/LICENSE.md +// @host localhost:31009 +// @BasePath /v1 // @securityDefinitions.basic BasicAuth - -// @externalDocs.description OpenAPI -// @externalDocs.url https://swagger.io/resources/open-api/ +// @externalDocs.description OpenAPI +// @externalDocs.url https://swagger.io/resources/open-api/ func RunApiServer(ctx context.Context, mw service.ClientCommandsServer, mwInternal core.MiddlewareInternal) { a := newApiServer(mw, mwInternal) - a.router.Use(a.EnsureAccountInfoMiddleware()) + a.router.Use(a.AccountInfoMiddleware()) // Swagger route a.router.GET("/swagger/*any", ginSwagger.WrapHandler(swaggerFiles.Handler)) diff --git a/cmd/api/middleware.go b/cmd/api/middleware.go index cc7110514..683b3401f 100644 --- a/cmd/api/middleware.go +++ b/cmd/api/middleware.go @@ -7,8 +7,8 @@ import ( "github.com/gin-gonic/gin" ) -// Middleware to ensure account info is filled before each request -func (a *ApiServer) EnsureAccountInfoMiddleware() gin.HandlerFunc { +// AccountInfoMiddleware retrieves the account information from the middleware service +func (a *ApiServer) AccountInfoMiddleware() gin.HandlerFunc { return func(c *gin.Context) { if a.accountInfo.TechSpaceId == "" { accountInfo, err := a.mwInternal.GetAccountInfo(context.Background()) @@ -22,7 +22,7 @@ func (a *ApiServer) EnsureAccountInfoMiddleware() gin.HandlerFunc { } } -// Middleware to authenticate requests and add user info to context +// TODO: AuthMiddleware to ensure the user is authenticated func (a *ApiServer) AuthMiddleware() gin.HandlerFunc { return func(c *gin.Context) { token := c.GetHeader("Authorization") @@ -43,7 +43,7 @@ func (a *ApiServer) AuthMiddleware() gin.HandlerFunc { } } -// Middleware to check permissions +// TODO: PermissionMiddleware to ensure the user has the required permissions func (a *ApiServer) PermissionMiddleware(requiredPermission string) gin.HandlerFunc { return func(c *gin.Context) { user, exists := c.Get("user") From c7e3214a5eab664c3b5d5584efff5b13433af50b Mon Sep 17 00:00:00 2001 From: Jannis Metrikat <120120832+jmetrikat@users.noreply.github.com> Date: Wed, 20 Nov 2024 19:53:57 +0100 Subject: [PATCH 015/195] GO-4459 Update demo --- cmd/api/demo/api_demo.go | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/cmd/api/demo/api_demo.go b/cmd/api/demo/api_demo.go index 3a5931fc1..171717616 100644 --- a/cmd/api/demo/api_demo.go +++ b/cmd/api/demo/api_demo.go @@ -16,7 +16,7 @@ const ( baseURL = "http://localhost:31009/v1" testSpaceId = "bafyreifymx5ucm3fdc7vupfg7wakdo5qelni3jvlmawlnvjcppurn2b3di.2lcu0r85yg10d" // dev (entry space) testObjectId = "bafyreidhtlbbspxecab6xf4pi5zyxcmvwy6lqzursbjouq5fxovh6y3xwu" // "Work Faster with Templates" - testTypeId = "bafyreifuklfpndjtlekqcjzuaerjtv2mckhn2w6txeumt5kqbthd7qxhui" // Space Member + testTypeId = "bafyreie3djy4mcldt3hgeet6bnjay2iajdyi2fvx556n6wcxii7brlni3i" // Page (in dev space) ) var log = logging.Logger("rest-api") @@ -46,11 +46,11 @@ func main() { body map[string]interface{} }{ // auth - {"POST", "/auth/displayCode", nil, nil}, - {"GET", "/auth/token?challengeId={challengeId}&code={code}", map[string]interface{}{"challengeId": "6738dfc5cda913aad90e8c2a", "code": "2931"}, nil}, + // {"POST", "/auth/displayCode", nil, nil}, + // {"GET", "/auth/token?challengeId={challengeId}&code={code}", map[string]interface{}{"challengeId": "6738dfc5cda913aad90e8c2a", "code": "2931"}, nil}, // spaces - {"POST", "/spaces", nil, map[string]interface{}{"name": "New Space"}}, + // {"POST", "/spaces", nil, map[string]interface{}{"name": "New Space"}}, {"GET", "/spaces?limit={limit}&offset={offset}", map[string]interface{}{"limit": 100, "offset": 0}, nil}, {"GET", "/spaces/{space_id}/members", map[string]interface{}{"space_id": testSpaceId}, nil}, @@ -65,7 +65,7 @@ func main() { {"GET", "/spaces/{space_id}/objectTypes/{type_id}/templates", map[string]interface{}{"space_id": testSpaceId, "type_id": testTypeId}, nil}, // search - {"GET", "/objects?search={search}&object_type={object_type}&limit={limit}&offset={offset}", map[string]interface{}{"search": "term", "object_type": "note", "limit": 100, "offset": 0}, nil}, + {"GET", "/objects?search={search}&object_type={object_type}&limit={limit}&offset={offset}", map[string]interface{}{"search": "writing", "object_type": testTypeId, "limit": 100, "offset": 0}, nil}, } for _, ep := range endpoints { @@ -111,6 +111,14 @@ func main() { } // Log the response - log.Infof("Endpoint: %s, Status Code: %d, Body: %s\n", finalURL, resp.StatusCode, string(body)) + var prettyJSON bytes.Buffer + err = json.Indent(&prettyJSON, body, "", " ") + if err != nil { + log.Errorf("Failed to pretty print response body for %s: %v\n", ep.endpoint, err) + log.Infof("%s\n", string(body)) + continue + } + + log.Infof("Endpoint: %s, Status Code: %d, Body: %s\n", finalURL, resp.StatusCode, prettyJSON.String()) } } From 81e12b4b86a579f4decc43b1b349c0b2634aa5c3 Mon Sep 17 00:00:00 2001 From: Jannis Metrikat <120120832+jmetrikat@users.noreply.github.com> Date: Thu, 21 Nov 2024 01:28:30 +0100 Subject: [PATCH 016/195] GO-4459 Add types_and_templates handler --- cmd/api/handlers.go | 103 ++++++++++++++++++++++++++++++++++++++++++-- cmd/api/schemas.go | 14 +++--- 2 files changed, 107 insertions(+), 10 deletions(-) diff --git a/cmd/api/handlers.go b/cmd/api/handlers.go index e9963f765..ebecc1dce 100644 --- a/cmd/api/handlers.go +++ b/cmd/api/handlers.go @@ -408,8 +408,39 @@ func (a *ApiServer) updateObjectHandler(c *gin.Context) { // @Router /spaces/{space_id}/objectTypes [get] func (a *ApiServer) getObjectTypesHandler(c *gin.Context) { spaceID := c.Param("space_id") - // TODO: Implement logic to retrieve object types in a space - c.JSON(http.StatusNotImplemented, gin.H{"message": "Not implemented yet", "space_id": spaceID}) + + resp := a.mw.ObjectSearch(context.Background(), &pb.RpcObjectSearchRequest{ + SpaceId: spaceID, + Filters: []*model.BlockContentDataviewFilter{ + { + RelationKey: bundle.RelationKeyLayout.String(), + Condition: model.BlockContentDataviewFilter_Equal, + Value: pbtypes.Int64(int64(model.ObjectType_objectType)), + }, + { + RelationKey: bundle.RelationKeyIsHidden.String(), + Condition: model.BlockContentDataviewFilter_NotEqual, + Value: pbtypes.String("true"), + }, + }, + }) + + if resp.Error.Code != pb.RpcObjectSearchResponseError_NULL { + c.JSON(http.StatusInternalServerError, gin.H{"message": "Failed to retrieve object types."}) + return + } + + objectTypes := make([]ObjectType, 0, len(resp.Records)) + for _, record := range resp.Records { + objectTypes = append(objectTypes, ObjectType{ + Type: "object_type", + ID: record.Fields["id"].GetStringValue(), + Name: record.Fields["name"].GetStringValue(), + IconEmoji: record.Fields["iconEmoji"].GetStringValue(), + }) + } + + c.JSON(http.StatusOK, gin.H{"objectTypes": objectTypes}) } // getObjectTypeTemplatesHandler retrieves a list of templates for a specific object type in a space @@ -428,8 +459,72 @@ func (a *ApiServer) getObjectTypesHandler(c *gin.Context) { func (a *ApiServer) getObjectTypeTemplatesHandler(c *gin.Context) { spaceID := c.Param("space_id") typeID := c.Param("typeId") - // TODO: Implement logic to retrieve templates for an object type - c.JSON(http.StatusNotImplemented, gin.H{"message": "Not implemented yet", "space_id": spaceID, "typeId": typeID}) + + // First, determine the type Id of "ot-template" in the space + templateTypeIdResp := a.mw.ObjectSearch(context.Background(), &pb.RpcObjectSearchRequest{ + SpaceId: spaceID, + Filters: []*model.BlockContentDataviewFilter{ + { + RelationKey: bundle.RelationKeyUniqueKey.String(), + Condition: model.BlockContentDataviewFilter_Equal, + Value: pbtypes.String("ot-template"), + }, + }, + }) + + if templateTypeIdResp.Error.Code != pb.RpcObjectSearchResponseError_NULL { + c.JSON(http.StatusInternalServerError, gin.H{"message": "Failed to retrieve template type."}) + return + } + + templateTypeID := templateTypeIdResp.Records[0].Fields["id"].GetStringValue() + + // Then, search all objects of the template type and filter by the target object type + templateObjectsResp := a.mw.ObjectSearch(context.Background(), &pb.RpcObjectSearchRequest{ + SpaceId: spaceID, + Filters: []*model.BlockContentDataviewFilter{ + { + RelationKey: bundle.RelationKeyType.String(), + Condition: model.BlockContentDataviewFilter_Equal, + Value: pbtypes.String(templateTypeID), + }, + }, + }) + + if templateObjectsResp.Error.Code != pb.RpcObjectSearchResponseError_NULL { + c.JSON(http.StatusInternalServerError, gin.H{"message": "Failed to retrieve template objects."}) + return + } + + templateIds := make([]string, 0) + for _, record := range templateObjectsResp.Records { + if record.Fields["targetObjectType"].GetStringValue() == typeID { + templateIds = append(templateIds, record.Fields["id"].GetStringValue()) + } + } + + // Finally, open each template and populate the response + templates := make([]ObjectTemplate, 0, len(templateIds)) + for _, templateId := range templateIds { + templateResp := a.mw.ObjectOpen(context.Background(), &pb.RpcObjectOpenRequest{ + SpaceId: spaceID, + ObjectId: templateId, + }) + + if templateResp.Error.Code != pb.RpcObjectOpenResponseError_NULL { + c.JSON(http.StatusInternalServerError, gin.H{"message": "Failed to retrieve template."}) + return + } + + templates = append(templates, ObjectTemplate{ + Type: "object_template", + ID: templateId, + Name: templateResp.ObjectView.Details[0].Details.Fields["name"].GetStringValue(), + IconEmoji: templateResp.ObjectView.Details[0].Details.Fields["iconEmoji"].GetStringValue(), + }) + } + + c.JSON(http.StatusOK, gin.H{"templates": templates}) } // getObjectsHandler searches and retrieves objects across all the spaces diff --git a/cmd/api/schemas.go b/cmd/api/schemas.go index e68504c25..42ecfa69d 100644 --- a/cmd/api/schemas.go +++ b/cmd/api/schemas.go @@ -82,15 +82,17 @@ type RelationLink struct { } type ObjectType struct { - Type string `json:"type" example:"object_type"` - ID string `json:"id"` - Name string `json:"name"` + Type string `json:"type" example:"object_type"` + ID string `json:"id"` + Name string `json:"name"` + IconEmoji string `json:"iconEmoji"` } type ObjectTemplate struct { - Type string `json:"type" example:"object_template"` - ID string `json:"id"` - Name string `json:"name"` + Type string `json:"type" example:"object_template"` + ID string `json:"id"` + Name string `json:"name"` + IconEmoji string `json:"iconEmoji"` } type ServerError struct { From 60dbf1e040bd8706494a493bf575e5e65500c989 Mon Sep 17 00:00:00 2001 From: Jannis Metrikat <120120832+jmetrikat@users.noreply.github.com> Date: Thu, 21 Nov 2024 04:26:17 +0100 Subject: [PATCH 017/195] GO-4459 Add SpaceID to object schema and adjust search filters --- cmd/api/handlers.go | 92 ++++++++++++++++++++++++++++++--------------- cmd/api/schemas.go | 1 + 2 files changed, 63 insertions(+), 30 deletions(-) diff --git a/cmd/api/handlers.go b/cmd/api/handlers.go index ebecc1dce..a9d2b066a 100644 --- a/cmd/api/handlers.go +++ b/cmd/api/handlers.go @@ -295,6 +295,7 @@ func (a *ApiServer) getSpaceObjectsHandler(c *gin.Context) { Name: record.Fields["name"].GetStringValue(), IconEmoji: record.Fields["iconEmoji"].GetStringValue(), ObjectType: record.Fields["type"].GetStringValue(), + SpaceID: spaceID, RootID: record.Fields["rootId"].GetStringValue(), // TODO: populate other fields Blocks: []Block{}, @@ -570,51 +571,82 @@ func (a *ApiServer) getObjectsHandler(c *gin.Context) { } // Then, get objects from each space that match the search parameters + var filters = []*model.BlockContentDataviewFilter{ + { + RelationKey: bundle.RelationKeyLayout.String(), + Condition: model.BlockContentDataviewFilter_In, + Value: pbtypes.IntList([]int{ + int(model.ObjectType_basic), + int(model.ObjectType_note), + int(model.ObjectType_bookmark), + int(model.ObjectType_set), + int(model.ObjectType_collection), + int(model.ObjectType_participant), + }...), + }, + { + RelationKey: bundle.RelationKeyIsHidden.String(), + Condition: model.BlockContentDataviewFilter_NotEqual, + Value: pbtypes.String("true"), + }, + { + RelationKey: bundle.RelationKeyName.String(), + Condition: model.BlockContentDataviewFilter_Like, + Value: pbtypes.String(searchTerm), + }, + } + + if searchTerm != "" { + filters = append(filters, &model.BlockContentDataviewFilter{ + RelationKey: bundle.RelationKeyName.String(), + Condition: model.BlockContentDataviewFilter_Like, + Value: pbtypes.String(searchTerm), + }) + } + + if objectType != "" { + filters = append(filters, &model.BlockContentDataviewFilter{ + RelationKey: bundle.RelationKeyType.String(), + Condition: model.BlockContentDataviewFilter_Equal, + Value: pbtypes.String(objectType), + }) + } + searchResults := make([]Object, 0) for _, spaceRecord := range resp.Records { objectSearchResponse := a.mw.ObjectSearch(context.Background(), &pb.RpcObjectSearchRequest{ SpaceId: spaceRecord.Fields["targetSpaceId"].GetStringValue(), - Filters: []*model.BlockContentDataviewFilter{ - { - RelationKey: bundle.RelationKeyLayout.String(), - Condition: model.BlockContentDataviewFilter_In, - Value: pbtypes.IntList([]int{ - int(model.ObjectType_basic), - int(model.ObjectType_note), - int(model.ObjectType_bookmark), - int(model.ObjectType_set), - int(model.ObjectType_collection), - }...), - }, - { - RelationKey: bundle.RelationKeyIsHidden.String(), - Condition: model.BlockContentDataviewFilter_NotEqual, - Value: pbtypes.String("true"), - }, - { - RelationKey: bundle.RelationKeyName.String(), - Condition: model.BlockContentDataviewFilter_Like, - Value: pbtypes.String(searchTerm), - }, - { - RelationKey: bundle.RelationKeyType.String(), - Condition: model.BlockContentDataviewFilter_Equal, - Value: pbtypes.String(objectType), - }, - }, + Filters: filters, + Sorts: []*model.BlockContentDataviewSort{{ + RelationKey: bundle.RelationKeyLastModifiedDate.String(), + Type: model.BlockContentDataviewSort_Desc, + }}, }) for _, record := range objectSearchResponse.Records { + objectTypeName, err := a.resolveTypeToName(spaceRecord.Fields["targetSpaceId"].GetStringValue(), record.Fields["type"].GetStringValue()) + if err != nil { + c.JSON(http.StatusInternalServerError, gin.H{"message": "Failed to resolve type to name."}) + return + } + searchResults = append(searchResults, Object{ Type: model.ObjectTypeLayout_name[int32(record.Fields["layout"].GetNumberValue())], ID: record.Fields["id"].GetStringValue(), Name: record.Fields["name"].GetStringValue(), IconEmoji: record.Fields["iconEmoji"].GetStringValue(), - ObjectType: record.Fields["type"].GetStringValue(), + ObjectType: objectTypeName, // TODO: populate other fields // RootID: record.Fields["rootId"].GetStringValue(), // Blocks: []Block{}, - // Details: []Detail{}, + Details: []Detail{ + { + ID: "lastModifiedDate", + Details: map[string]interface{}{ + "lastModifiedDate": record.Fields["lastModifiedDate"].GetNumberValue(), + }, + }, + }, }) } } diff --git a/cmd/api/schemas.go b/cmd/api/schemas.go index 42ecfa69d..2c8e7fd27 100644 --- a/cmd/api/schemas.go +++ b/cmd/api/schemas.go @@ -30,6 +30,7 @@ type Object struct { Name string `json:"name" example:"Object Name"` IconEmoji string `json:"iconEmoji"` ObjectType string `json:"object_type" example:"note"` + SpaceID string `json:"space_id"` RootID string `json:"root_id"` Blocks []Block `json:"blocks"` Details []Detail `json:"details"` From c70e25ce3942b3159f76533aaa34ac4a8abeebc1 Mon Sep 17 00:00:00 2001 From: Jannis Metrikat <120120832+jmetrikat@users.noreply.github.com> Date: Thu, 21 Nov 2024 23:46:12 +0100 Subject: [PATCH 018/195] GO-4459 Use nmh to retrieve gateway port --- cmd/api/main.go | 2 + cmd/api/middleware.go | 15 +++ cmd/api/nmh.go | 291 ++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 308 insertions(+) create mode 100644 cmd/api/nmh.go diff --git a/cmd/api/main.go b/cmd/api/main.go index c6e59dadd..57d338939 100644 --- a/cmd/api/main.go +++ b/cmd/api/main.go @@ -27,6 +27,7 @@ type ApiServer struct { router *gin.Engine server *http.Server accountInfo model.AccountInfo + ports map[string][]string } // TODO: User represents an authenticated user with permissions @@ -71,6 +72,7 @@ func newApiServer(mw service.ClientCommandsServer, mwInternal core.MiddlewareInt func RunApiServer(ctx context.Context, mw service.ClientCommandsServer, mwInternal core.MiddlewareInternal) { a := newApiServer(mw, mwInternal) a.router.Use(a.AccountInfoMiddleware()) + a.router.Use(a.PortsMiddleware()) // Swagger route a.router.GET("/swagger/*any", ginSwagger.WrapHandler(swaggerFiles.Handler)) diff --git a/cmd/api/middleware.go b/cmd/api/middleware.go index 683b3401f..22dc533ba 100644 --- a/cmd/api/middleware.go +++ b/cmd/api/middleware.go @@ -22,6 +22,21 @@ func (a *ApiServer) AccountInfoMiddleware() gin.HandlerFunc { } } +// PortsMiddleware retrieves the open ports from the middleware service +func (a *ApiServer) PortsMiddleware() gin.HandlerFunc { + return func(c *gin.Context) { + if len(a.ports) == 0 { + ports, err := getPorts() + if err != nil { + c.AbortWithStatusJSON(http.StatusInternalServerError, gin.H{"error": "Failed to get open ports"}) + return + } + a.ports = ports + } + c.Next() + } +} + // TODO: AuthMiddleware to ensure the user is authenticated func (a *ApiServer) AuthMiddleware() gin.HandlerFunc { return func(c *gin.Context) { diff --git a/cmd/api/nmh.go b/cmd/api/nmh.go new file mode 100644 index 000000000..8c38f39ba --- /dev/null +++ b/cmd/api/nmh.go @@ -0,0 +1,291 @@ +package api + +import ( + "bytes" + "context" + "errors" + "fmt" + "io/ioutil" + "log" + "net/http" + "os" + "os/exec" + "runtime" + "strings" + "time" +) + +var ( + // Trace logs general information messages. + Trace *log.Logger + // Error logs error messages. + Error *log.Logger +) + +// splits stdout into an array of lines, removing empty lines +func splitStdOutLines(stdout string) []string { + lines := strings.Split(stdout, "\n") + filteredLines := make([]string, 0) + for _, line := range lines { + if len(line) > 0 { + filteredLines = append(filteredLines, line) + } + } + return filteredLines +} + +// splits stdout into an array of tokens, replacing tabs with spaces +func splitStdOutTokens(line string) []string { + return strings.Fields(strings.ReplaceAll(line, "\t", " ")) +} + +// executes a command and returns the stdout as string +func execCommand(command string) (string, error) { + if runtime.GOOS == "windows" { + return execCommandWin(command) + } + stdout, err := exec.Command("bash", "-c", command).Output() + return string(stdout), err +} + +func execCommandWin(command string) (string, error) { + // Splitting the command into the executable and the arguments + // For Windows, commands are executed through cmd /C + cmd := exec.Command("cmd", "/C", command) + stdout, err := cmd.Output() + return string(stdout), err +} + +// checks if a string is contained in an array of strings +func contains(s []string, e string) bool { + for _, a := range s { + if a == e { + return true + } + } + return false +} + +// Windows: returns a list of open ports for all instances of anytypeHelper.exe found using cli utilities tasklist, netstat and findstr +func getOpenPortsWindows() (map[string][]string, error) { + appName := "anytypeHelper.exe" + stdout, err := execCommand(`tasklist`) + if err != nil { + return nil, err + } + + lines := splitStdOutLines(stdout) + pids := map[string]bool{} + for _, line := range lines { + if !strings.Contains(line, appName) { + continue + } + tokens := splitStdOutTokens(line) + pids[tokens[1]] = true + } + + if len(pids) == 0 { + return nil, errors.New("application not running") + } + + result := map[string][]string{} + for pid := range pids { + stdout, err := execCommand(`netstat -ano`) + if err != nil { + return nil, err + } + + lines := splitStdOutLines(stdout) + ports := map[string]bool{} + for _, line := range lines { + if !strings.Contains(line, pid) || !strings.Contains(line, "LISTENING") { + continue + } + tokens := splitStdOutTokens(line) + port := strings.Split(tokens[1], ":")[1] + ports[port] = true + } + + portsSlice := []string{} + for port := range ports { + portsSlice = append(portsSlice, port) + } + + result[pid] = portsSlice + } + + return result, nil +} + +func isFileGateway(port string) (bool, error) { + client := &http.Client{} + ctx, cancel := context.WithTimeout(context.Background(), time.Second*5) + defer cancel() + req, err := http.NewRequestWithContext(ctx, "GET", "http://127.0.0.1:"+port+"/file", nil) + if err != nil { + return false, err + } + // disable follow redirect + client.CheckRedirect = func(req *http.Request, via []*http.Request) error { + return http.ErrUseLastResponse + } + + resp, err := client.Do(req) + if err != nil { + return false, err + } + + bu := bytes.NewBuffer(nil) + if err := resp.Request.Write(bu); err != nil { + return false, err + } + if _, err := ioutil.ReadAll(bu); err != nil { + return false, err + } + + defer resp.Body.Close() + // should return 301 redirect Location: /file/ + if resp.StatusCode == 301 { + return true, err + } + return false, err +} + +func isGrpcWebServer(port string) (bool, error) { + client := &http.Client{} + ctx, cancel := context.WithTimeout(context.Background(), time.Second*5) + defer cancel() + var data = strings.NewReader(`AAAAAAIQFA==`) + req, err := http.NewRequestWithContext(ctx, "POST", "http://127.0.0.1:"+port+"/anytype.ClientCommands/AppGetVersion", data) + if err != nil { + return false, err + + } + req.Header.Set("Content-Type", "application/grpc-web-text") + req.Header.Set("X-Grpc-Web", "1") + resp, err := client.Do(req) + if err != nil { + return false, err + } + defer resp.Body.Close() + + // should has Content-Type: application/grpc-web-text + if resp.Header.Get("Content-Type") == "application/grpc-web-text" { + return true, nil + } + + return false, fmt.Errorf("unexpected content type: %s", resp.Header.Get("Content-Type")) +} + +// MacOS and Linux: returns a list of all open ports for all instances of anytype found using cli utilities lsof and grep +func getOpenPortsUnix() (map[string][]string, error) { + // execute the command + appName := "anytype" + // appName := "grpcserve" + stdout, err := execCommand(`lsof -i -P -n | grep LISTEN | grep "` + appName + `"`) + Trace.Print(`lsof -i -P -n | grep LISTEN | grep "` + appName + `"`) + if err != nil { + Trace.Print(err) + return nil, err + } + // initialize the result map + result := make(map[string][]string) + // split the output into lines + lines := splitStdOutLines(stdout) + for _, line := range lines { + + // normalize whitespace and split into tokens + tokens := splitStdOutTokens(line) + pid := tokens[1] + port := strings.Split(tokens[8], ":")[1] + + // add the port to the result map + if _, ok := result[pid]; !ok { + result[pid] = []string{} + } + + if !contains(result[pid], port) { + result[pid] = append(result[pid], port) + } + } + + if len(result) == 0 { + return nil, errors.New("application not running") + } + + return result, nil +} + +// Windows, MacOS and Linux: returns a list of all open ports for all instances of anytype found using cli utilities +func getOpenPorts() (map[string][]string, error) { + // Get Platform + platform := runtime.GOOS + var ( + ports map[string][]string + err error + ) + //nolint:nestif + if platform == "windows" { + ports, err = getOpenPortsWindows() + if err != nil { + return nil, err + } + } else if platform == "darwin" { + ports, err = getOpenPortsUnix() + if err != nil { + return nil, err + } + } else if platform == "linux" { + ports, err = getOpenPortsUnix() + if err != nil { + return nil, err + } + } else { + return nil, errors.New("unsupported platform") + } + totalPids := len(ports) + for pid, pidports := range ports { + var gatewayPort, grpcWebPort string + var errs []error + for _, port := range pidports { + var ( + errDetectGateway, errDetectGrpcWeb error + serviceDetected bool + ) + if gatewayPort == "" { + if serviceDetected, errDetectGateway = isFileGateway(port); serviceDetected { + gatewayPort = port + } + } + // in case we already detected grpcweb port skip this + if !serviceDetected && grpcWebPort == "" { + if serviceDetected, errDetectGrpcWeb = isGrpcWebServer(port); serviceDetected { + grpcWebPort = port + } + } + if !serviceDetected { + // means port failed to detect either gateway or grpcweb + errs = append(errs, fmt.Errorf("port: %s; gateway: %w; grpcweb: %w", port, errDetectGateway, errDetectGrpcWeb)) + } + } + if gatewayPort != "" && grpcWebPort != "" { + ports[pid] = []string{grpcWebPort, gatewayPort} + } else { + Trace.Printf("can't detect ports. pid: %s; grpc: '%s'; gateway: '%s'; error: %v;", pid, grpcWebPort, gatewayPort, errs) + delete(ports, pid) + } + } + if len(ports) > 0 { + Trace.Printf("found ports: %v", ports) + } else { + Trace.Printf("ports no able to detect for %d pids", totalPids) + } + return ports, nil +} + +func getPorts() (map[string][]string, error) { + Trace = log.New(os.Stdout, "TRACE: ", log.Ldate|log.Ltime|log.Lshortfile) + Error = log.New(os.Stderr, "ERROR: ", log.Ldate|log.Ltime|log.Lshortfile) + + return getOpenPorts() +} From f366aac385a9675e84c530ec67775fe5ddef4dfe Mon Sep 17 00:00:00 2001 From: Jannis Metrikat <120120832+jmetrikat@users.noreply.github.com> Date: Fri, 22 Nov 2024 00:22:27 +0100 Subject: [PATCH 019/195] GO-4459 Extend handlers and helpers with image and date logic --- cmd/api/handlers.go | 40 +++++++++++++++++---- cmd/api/helper.go | 88 +++++++++++++++++++++++++++++++++++++++++++++ cmd/api/schemas.go | 10 +++--- 3 files changed, 127 insertions(+), 11 deletions(-) diff --git a/cmd/api/handlers.go b/cmd/api/handlers.go index a9d2b066a..a6a62e63b 100644 --- a/cmd/api/handlers.go +++ b/cmd/api/handlers.go @@ -123,10 +123,28 @@ func (a *ApiServer) getSpacesHandler(c *gin.Context) { return } + // TODO cleanup image logic + // Convert space image or option to base64 string + var iconBase64 string + iconImageId := record.Fields["iconImage"].GetStringValue() + if iconImageId != "" { + b64, err2 := a.imageToBase64(a.getGatewayURL(iconImageId)) + if err2 != nil { + c.JSON(http.StatusInternalServerError, gin.H{"message": "Failed to convert image to base64."}) + return + } + iconBase64 = b64 + } else { + iconOption := record.Fields["iconOption"].GetNumberValue() + // TODO figure out size + iconBase64 = a.spaceSvg(int(iconOption), 100, string([]rune(record.Fields["name"].GetStringValue())[0])) + } + space := Space{ Type: typeName, ID: spaceId, Name: record.Fields["name"].GetStringValue(), + Icon: iconBase64, HomeObjectID: record.Fields["spaceDashboardId"].GetStringValue(), ArchiveObjectID: workspaceResponse.Info.ArchiveObjectId, ProfileObjectID: workspaceResponse.Info.ProfileObjectId, @@ -233,10 +251,11 @@ func (a *ApiServer) getSpaceMembersHandler(c *gin.Context) { } member := SpaceMember{ - Type: typeName, - ID: record.Fields["identity"].GetStringValue(), - Name: record.Fields["name"].GetStringValue(), - Role: model.ParticipantPermissions_name[int32(record.Fields["participantPermissions"].GetNumberValue())], + Type: typeName, + ID: record.Fields["id"].GetStringValue(), + Name: record.Fields["name"].GetStringValue(), + Identity: record.Fields["identity"].GetStringValue(), + Role: model.ParticipantPermissions_name[int32(record.Fields["participantPermissions"].GetNumberValue())], } members = append(members, member) @@ -296,10 +315,17 @@ func (a *ApiServer) getSpaceObjectsHandler(c *gin.Context) { IconEmoji: record.Fields["iconEmoji"].GetStringValue(), ObjectType: record.Fields["type"].GetStringValue(), SpaceID: spaceID, - RootID: record.Fields["rootId"].GetStringValue(), // TODO: populate other fields - Blocks: []Block{}, - Details: []Detail{}, + // RootID: record.Fields["rootId"].GetStringValue(), + // Blocks: []Block{}, + Details: []Detail{ + { + ID: "lastModifiedDate", + Details: map[string]interface{}{ + "lastModifiedDate": record.Fields["lastModifiedDate"].GetNumberValue(), + }, + }, + }, } objects = append(objects, object) diff --git a/cmd/api/helper.go b/cmd/api/helper.go index 8da3d5eb4..e770b0788 100644 --- a/cmd/api/helper.go +++ b/cmd/api/helper.go @@ -2,6 +2,11 @@ package api import ( "context" + "encoding/base64" + "fmt" + "io" + "net/http" + "os" "strings" "github.com/anyproto/anytype-heart/pb" @@ -10,6 +15,89 @@ import ( "github.com/anyproto/anytype-heart/util/pbtypes" ) +type IconSpace struct { + Text string + Bg map[string]string + List []string +} + +var iconSpace = IconSpace{ + Text: "#fff", + Bg: map[string]string{ + "grey": "#949494", + "yellow": "#ecd91b", + "orange": "#ffb522", + "red": "#f55522", + "pink": "#e51ca0", + "purple": "#ab50cc", + "blue": "#3e58eb", + "ice": "#2aa7ee", + "teal": "#0fc8ba", + "lime": "#5dd400", + }, + List: []string{"grey", "yellow", "orange", "red", "pink", "purple", "blue", "ice", "teal", "lime"}, +} + +func (a *ApiServer) spaceSvg(option int, size int, iconName string) string { + if option < 1 || option > len(iconSpace.List) { + return "" + } + bgColor := iconSpace.Bg[iconSpace.List[option-1]] + + fontWeight := func(size int) string { + if size > 50 { + return "bold" + } + return "normal" + } + + fontSize := func(size int) int { + return size / 2 + } + + text := fmt.Sprintf(`%s`, + iconSpace.Text, fontWeight(size), fontSize(size), iconName) + + svg := fmt.Sprintf(` + + + %s + `, size, size, size, size, size, size, bgColor, text) + + return "data:image/svg+xml;base64," + base64.StdEncoding.EncodeToString([]byte(svg)) +} + +func validateURL(url string) string { + if !strings.HasPrefix(url, "http://") && !strings.HasPrefix(url, "https://") { + return "" + } + return url +} + +func (a *ApiServer) imageToBase64(imagePath string) (string, error) { + resp, err := http.Get(validateURL(imagePath)) + if err != nil { + return "", err + } + defer resp.Body.Close() + + fileBytes, err := io.ReadAll(resp.Body) + if err != nil { + return "", err + } + encoded := base64.StdEncoding.EncodeToString(fileBytes) + return encoded, nil +} + +// Determine gateway port based on the current process ID +func (a *ApiServer) getGatewayURL(icon string) string { + pid := fmt.Sprintf("%d", os.Getpid()) + if ports, ok := a.ports[pid]; ok && len(ports) > 1 { + return fmt.Sprintf("http://127.0.0.1:%s/image/%s?width=100", ports[1], icon) + } + return "" +} + func (a *ApiServer) resolveTypeToName(spaceId string, typeId string) (string, *pb.RpcObjectSearchResponseError) { // Can't look up preinstalled types based on relation key, therefore need to use unique key relKey := bundle.RelationKeyId.String() diff --git a/cmd/api/schemas.go b/cmd/api/schemas.go index 2c8e7fd27..dae8692a6 100644 --- a/cmd/api/schemas.go +++ b/cmd/api/schemas.go @@ -4,6 +4,7 @@ type Space struct { Type string `json:"type" example:"space"` ID string `json:"id"` Name string `json:"name" example:"Space Name"` + Icon string `json:"icon"` HomeObjectID string `json:"home_object_id" example:"bafyreie4qcl3wczb4cw5hrfyycikhjyh6oljdis3ewqrk5boaav3sbwqya"` ArchiveObjectID string `json:"archive_object_id" example:"bafyreialsgoyflf3etjm3parzurivyaukzivwortf32b4twnlwpwocsrri"` ProfileObjectID string `json:"profile_object_id" example:"bafyreiaxhwreshjqwndpwtdsu4mtihaqhhmlygqnyqpfyfwlqfq3rm3gw4"` @@ -18,10 +19,11 @@ type Space struct { } type SpaceMember struct { - Type string `json:"type" example:"space_member"` - ID string `json:"id"` - Name string `json:"name" example:""` - Role string `json:"role" enum:"editor,viewer,owner"` + Type string `json:"type" example:"space_member"` + ID string `json:"id"` + Name string `json:"name" example:""` + Identity string `json:"identity" example:""` + Role string `json:"role" enum:"editor,viewer,owner"` } type Object struct { From a8660c5209cc088a2764de2f135103a179c2265d Mon Sep 17 00:00:00 2001 From: Jannis Metrikat <120120832+jmetrikat@users.noreply.github.com> Date: Fri, 22 Nov 2024 00:22:53 +0100 Subject: [PATCH 020/195] GO-4459 Update docs --- cmd/api/docs/docs.go | 44 +++++++++++++++++++++------------------ cmd/api/docs/swagger.json | 44 +++++++++++++++++++++------------------ cmd/api/docs/swagger.yaml | 30 ++++++++++++++------------ 3 files changed, 65 insertions(+), 53 deletions(-) diff --git a/cmd/api/docs/docs.go b/cmd/api/docs/docs.go index 611ff14c7..676eb42c2 100644 --- a/cmd/api/docs/docs.go +++ b/cmd/api/docs/docs.go @@ -16,8 +16,8 @@ const docTemplate = `{ "email": "support@anytype.io" }, "license": { - "name": "Apache 2.0", - "url": "http://www.apache.org/licenses/LICENSE-2.0.html" + "name": "Any Source Available License 1.0", + "url": "https://github.com/anyproto/anytype-ts/blob/main/LICENSE.md" }, "version": "{{.Version}}" }, @@ -787,22 +787,27 @@ const docTemplate = `{ "$ref": "#/definitions/api.Detail" } }, - "id": { + "iconEmoji": { "type": "string" }, + "id": { + "type": "string", + "example": "bafyreie6n5l5nkbjal37su54cha4coy7qzuhrnajluzv5qd5jvtsrxkequ" + }, + "name": { + "type": "string", + "example": "Object Name" + }, "object_type": { "type": "string", "example": "note" }, - "relation_links_list": { - "type": "array", - "items": { - "$ref": "#/definitions/api.RelationLink" - } - }, "root_id": { "type": "string" }, + "space_id": { + "type": "string" + }, "type": { "type": "string", "example": "object" @@ -812,6 +817,9 @@ const docTemplate = `{ "api.ObjectTemplate": { "type": "object", "properties": { + "iconEmoji": { + "type": "string" + }, "id": { "type": "string" }, @@ -824,17 +832,6 @@ const docTemplate = `{ } } }, - "api.RelationLink": { - "type": "object", - "properties": { - "format": { - "type": "string" - }, - "key": { - "type": "string" - } - } - }, "api.ServerError": { "type": "object", "properties": { @@ -867,6 +864,9 @@ const docTemplate = `{ "type": "string", "example": "bafyreie4qcl3wczb4cw5hrfyycikhjyh6oljdis3ewqrk5boaav3sbwqya" }, + "icon": { + "type": "string" + }, "id": { "type": "string" }, @@ -914,6 +914,10 @@ const docTemplate = `{ "id": { "type": "string" }, + "identity": { + "type": "string", + "example": "" + }, "name": { "type": "string", "example": "" diff --git a/cmd/api/docs/swagger.json b/cmd/api/docs/swagger.json index e57cb5ecd..5dcaef8f2 100644 --- a/cmd/api/docs/swagger.json +++ b/cmd/api/docs/swagger.json @@ -10,8 +10,8 @@ "email": "support@anytype.io" }, "license": { - "name": "Apache 2.0", - "url": "http://www.apache.org/licenses/LICENSE-2.0.html" + "name": "Any Source Available License 1.0", + "url": "https://github.com/anyproto/anytype-ts/blob/main/LICENSE.md" }, "version": "1.0" }, @@ -781,22 +781,27 @@ "$ref": "#/definitions/api.Detail" } }, - "id": { + "iconEmoji": { "type": "string" }, + "id": { + "type": "string", + "example": "bafyreie6n5l5nkbjal37su54cha4coy7qzuhrnajluzv5qd5jvtsrxkequ" + }, + "name": { + "type": "string", + "example": "Object Name" + }, "object_type": { "type": "string", "example": "note" }, - "relation_links_list": { - "type": "array", - "items": { - "$ref": "#/definitions/api.RelationLink" - } - }, "root_id": { "type": "string" }, + "space_id": { + "type": "string" + }, "type": { "type": "string", "example": "object" @@ -806,6 +811,9 @@ "api.ObjectTemplate": { "type": "object", "properties": { + "iconEmoji": { + "type": "string" + }, "id": { "type": "string" }, @@ -818,17 +826,6 @@ } } }, - "api.RelationLink": { - "type": "object", - "properties": { - "format": { - "type": "string" - }, - "key": { - "type": "string" - } - } - }, "api.ServerError": { "type": "object", "properties": { @@ -861,6 +858,9 @@ "type": "string", "example": "bafyreie4qcl3wczb4cw5hrfyycikhjyh6oljdis3ewqrk5boaav3sbwqya" }, + "icon": { + "type": "string" + }, "id": { "type": "string" }, @@ -908,6 +908,10 @@ "id": { "type": "string" }, + "identity": { + "type": "string", + "example": "" + }, "name": { "type": "string", "example": "" diff --git a/cmd/api/docs/swagger.yaml b/cmd/api/docs/swagger.yaml index b8de9a23b..6fdaf15c4 100644 --- a/cmd/api/docs/swagger.yaml +++ b/cmd/api/docs/swagger.yaml @@ -73,23 +73,29 @@ definitions: items: $ref: '#/definitions/api.Detail' type: array + iconEmoji: + type: string id: + example: bafyreie6n5l5nkbjal37su54cha4coy7qzuhrnajluzv5qd5jvtsrxkequ + type: string + name: + example: Object Name type: string object_type: example: note type: string - relation_links_list: - items: - $ref: '#/definitions/api.RelationLink' - type: array root_id: type: string + space_id: + type: string type: example: object type: string type: object api.ObjectTemplate: properties: + iconEmoji: + type: string id: type: string name: @@ -98,13 +104,6 @@ definitions: example: object_template type: string type: object - api.RelationLink: - properties: - format: - type: string - key: - type: string - type: object api.ServerError: properties: error: @@ -127,6 +126,8 @@ definitions: home_object_id: example: bafyreie4qcl3wczb4cw5hrfyycikhjyh6oljdis3ewqrk5boaav3sbwqya type: string + icon: + type: string id: type: string marketplace_workspace_id: @@ -161,6 +162,9 @@ definitions: properties: id: type: string + identity: + example: "" + type: string name: example: "" type: string @@ -213,8 +217,8 @@ info: description: This API allows interaction with Anytype resources such as spaces, objects, and object types. license: - name: Apache 2.0 - url: http://www.apache.org/licenses/LICENSE-2.0.html + name: Any Source Available License 1.0 + url: https://github.com/anyproto/anytype-ts/blob/main/LICENSE.md termsOfService: https://anytype.io/terms_of_use title: Anytype API version: "1.0" From 2f666fd3688c198b696fca61313c5e329bb74d87 Mon Sep 17 00:00:00 2001 From: Jannis Metrikat <120120832+jmetrikat@users.noreply.github.com> Date: Sat, 23 Nov 2024 14:04:35 +0100 Subject: [PATCH 021/195] GO-4459 Retrieve accountInfo internally through app, remove nmh --- cmd/api/helper.go | 7 +- cmd/api/main.go | 25 ++-- cmd/api/middleware.go | 34 +++-- cmd/api/nmh.go | 291 ------------------------------------------ core/core.go | 1 + 5 files changed, 30 insertions(+), 328 deletions(-) delete mode 100644 cmd/api/nmh.go diff --git a/cmd/api/helper.go b/cmd/api/helper.go index e770b0788..a7db660bc 100644 --- a/cmd/api/helper.go +++ b/cmd/api/helper.go @@ -6,7 +6,6 @@ import ( "fmt" "io" "net/http" - "os" "strings" "github.com/anyproto/anytype-heart/pb" @@ -91,11 +90,7 @@ func (a *ApiServer) imageToBase64(imagePath string) (string, error) { // Determine gateway port based on the current process ID func (a *ApiServer) getGatewayURL(icon string) string { - pid := fmt.Sprintf("%d", os.Getpid()) - if ports, ok := a.ports[pid]; ok && len(ports) > 1 { - return fmt.Sprintf("http://127.0.0.1:%s/image/%s?width=100", ports[1], icon) - } - return "" + return fmt.Sprintf("%s/image/%s?width=100", a.accountInfo.GatewayUrl, icon) } func (a *ApiServer) resolveTypeToName(spaceId string, typeId string) (string, *pb.RpcObjectSearchResponseError) { diff --git a/cmd/api/main.go b/cmd/api/main.go index 57d338939..db847eeb7 100644 --- a/cmd/api/main.go +++ b/cmd/api/main.go @@ -6,6 +6,7 @@ import ( "net/http" "time" + "github.com/anyproto/any-sync/app" "github.com/gin-gonic/gin" swaggerFiles "github.com/swaggo/files" ginSwagger "github.com/swaggo/gin-swagger" @@ -22,12 +23,14 @@ const ( ) type ApiServer struct { - mw service.ClientCommandsServer - mwInternal core.MiddlewareInternal - router *gin.Engine - server *http.Server - accountInfo model.AccountInfo - ports map[string][]string + mw service.ClientCommandsServer + mwInternal core.MiddlewareInternal + router *gin.Engine + server *http.Server + + // init after app start + app *app.App + accountInfo *model.AccountInfo } // TODO: User represents an authenticated user with permissions @@ -38,10 +41,9 @@ type User struct { func newApiServer(mw service.ClientCommandsServer, mwInternal core.MiddlewareInternal) *ApiServer { a := &ApiServer{ - mw: mw, - mwInternal: mwInternal, - router: gin.New(), - accountInfo: model.AccountInfo{}, + mw: mw, + mwInternal: mwInternal, + router: gin.New(), } a.server = &http.Server{ @@ -71,8 +73,7 @@ func newApiServer(mw service.ClientCommandsServer, mwInternal core.MiddlewareInt // @externalDocs.url https://swagger.io/resources/open-api/ func RunApiServer(ctx context.Context, mw service.ClientCommandsServer, mwInternal core.MiddlewareInternal) { a := newApiServer(mw, mwInternal) - a.router.Use(a.AccountInfoMiddleware()) - a.router.Use(a.PortsMiddleware()) + a.router.Use(a.initAccountInfo()) // Swagger route a.router.GET("/swagger/*any", ginSwagger.WrapHandler(swaggerFiles.Handler)) diff --git a/cmd/api/middleware.go b/cmd/api/middleware.go index 22dc533ba..23f1b320f 100644 --- a/cmd/api/middleware.go +++ b/cmd/api/middleware.go @@ -2,38 +2,34 @@ package api import ( "context" + "fmt" "net/http" "github.com/gin-gonic/gin" + + "github.com/anyproto/anytype-heart/core/anytype/account" ) -// AccountInfoMiddleware retrieves the account information from the middleware service -func (a *ApiServer) AccountInfoMiddleware() gin.HandlerFunc { +// initAccountInfo retrieves the account information from the account service +func (a *ApiServer) initAccountInfo() gin.HandlerFunc { return func(c *gin.Context) { - if a.accountInfo.TechSpaceId == "" { - accountInfo, err := a.mwInternal.GetAccountInfo(context.Background()) - if err != nil { - c.AbortWithStatusJSON(http.StatusInternalServerError, gin.H{"error": "Failed to get account info"}) + if a.app == nil && a.accountInfo == nil { + app := a.mwInternal.GetApp() + if app == nil { + c.AbortWithStatusJSON(http.StatusInternalServerError, gin.H{"error": "failed to get app instance"}) return } - a.accountInfo = *accountInfo - } - c.Next() - } -} -// PortsMiddleware retrieves the open ports from the middleware service -func (a *ApiServer) PortsMiddleware() gin.HandlerFunc { - return func(c *gin.Context) { - if len(a.ports) == 0 { - ports, err := getPorts() + accInfo, err := app.Component(account.CName).(account.Service).GetInfo(context.Background()) if err != nil { - c.AbortWithStatusJSON(http.StatusInternalServerError, gin.H{"error": "Failed to get open ports"}) + c.AbortWithStatusJSON(http.StatusInternalServerError, gin.H{"error": fmt.Sprintf("failed to get account info: %v", err)}) return } - a.ports = ports + + a.app = app + a.accountInfo = accInfo + c.Next() } - c.Next() } } diff --git a/cmd/api/nmh.go b/cmd/api/nmh.go deleted file mode 100644 index 8c38f39ba..000000000 --- a/cmd/api/nmh.go +++ /dev/null @@ -1,291 +0,0 @@ -package api - -import ( - "bytes" - "context" - "errors" - "fmt" - "io/ioutil" - "log" - "net/http" - "os" - "os/exec" - "runtime" - "strings" - "time" -) - -var ( - // Trace logs general information messages. - Trace *log.Logger - // Error logs error messages. - Error *log.Logger -) - -// splits stdout into an array of lines, removing empty lines -func splitStdOutLines(stdout string) []string { - lines := strings.Split(stdout, "\n") - filteredLines := make([]string, 0) - for _, line := range lines { - if len(line) > 0 { - filteredLines = append(filteredLines, line) - } - } - return filteredLines -} - -// splits stdout into an array of tokens, replacing tabs with spaces -func splitStdOutTokens(line string) []string { - return strings.Fields(strings.ReplaceAll(line, "\t", " ")) -} - -// executes a command and returns the stdout as string -func execCommand(command string) (string, error) { - if runtime.GOOS == "windows" { - return execCommandWin(command) - } - stdout, err := exec.Command("bash", "-c", command).Output() - return string(stdout), err -} - -func execCommandWin(command string) (string, error) { - // Splitting the command into the executable and the arguments - // For Windows, commands are executed through cmd /C - cmd := exec.Command("cmd", "/C", command) - stdout, err := cmd.Output() - return string(stdout), err -} - -// checks if a string is contained in an array of strings -func contains(s []string, e string) bool { - for _, a := range s { - if a == e { - return true - } - } - return false -} - -// Windows: returns a list of open ports for all instances of anytypeHelper.exe found using cli utilities tasklist, netstat and findstr -func getOpenPortsWindows() (map[string][]string, error) { - appName := "anytypeHelper.exe" - stdout, err := execCommand(`tasklist`) - if err != nil { - return nil, err - } - - lines := splitStdOutLines(stdout) - pids := map[string]bool{} - for _, line := range lines { - if !strings.Contains(line, appName) { - continue - } - tokens := splitStdOutTokens(line) - pids[tokens[1]] = true - } - - if len(pids) == 0 { - return nil, errors.New("application not running") - } - - result := map[string][]string{} - for pid := range pids { - stdout, err := execCommand(`netstat -ano`) - if err != nil { - return nil, err - } - - lines := splitStdOutLines(stdout) - ports := map[string]bool{} - for _, line := range lines { - if !strings.Contains(line, pid) || !strings.Contains(line, "LISTENING") { - continue - } - tokens := splitStdOutTokens(line) - port := strings.Split(tokens[1], ":")[1] - ports[port] = true - } - - portsSlice := []string{} - for port := range ports { - portsSlice = append(portsSlice, port) - } - - result[pid] = portsSlice - } - - return result, nil -} - -func isFileGateway(port string) (bool, error) { - client := &http.Client{} - ctx, cancel := context.WithTimeout(context.Background(), time.Second*5) - defer cancel() - req, err := http.NewRequestWithContext(ctx, "GET", "http://127.0.0.1:"+port+"/file", nil) - if err != nil { - return false, err - } - // disable follow redirect - client.CheckRedirect = func(req *http.Request, via []*http.Request) error { - return http.ErrUseLastResponse - } - - resp, err := client.Do(req) - if err != nil { - return false, err - } - - bu := bytes.NewBuffer(nil) - if err := resp.Request.Write(bu); err != nil { - return false, err - } - if _, err := ioutil.ReadAll(bu); err != nil { - return false, err - } - - defer resp.Body.Close() - // should return 301 redirect Location: /file/ - if resp.StatusCode == 301 { - return true, err - } - return false, err -} - -func isGrpcWebServer(port string) (bool, error) { - client := &http.Client{} - ctx, cancel := context.WithTimeout(context.Background(), time.Second*5) - defer cancel() - var data = strings.NewReader(`AAAAAAIQFA==`) - req, err := http.NewRequestWithContext(ctx, "POST", "http://127.0.0.1:"+port+"/anytype.ClientCommands/AppGetVersion", data) - if err != nil { - return false, err - - } - req.Header.Set("Content-Type", "application/grpc-web-text") - req.Header.Set("X-Grpc-Web", "1") - resp, err := client.Do(req) - if err != nil { - return false, err - } - defer resp.Body.Close() - - // should has Content-Type: application/grpc-web-text - if resp.Header.Get("Content-Type") == "application/grpc-web-text" { - return true, nil - } - - return false, fmt.Errorf("unexpected content type: %s", resp.Header.Get("Content-Type")) -} - -// MacOS and Linux: returns a list of all open ports for all instances of anytype found using cli utilities lsof and grep -func getOpenPortsUnix() (map[string][]string, error) { - // execute the command - appName := "anytype" - // appName := "grpcserve" - stdout, err := execCommand(`lsof -i -P -n | grep LISTEN | grep "` + appName + `"`) - Trace.Print(`lsof -i -P -n | grep LISTEN | grep "` + appName + `"`) - if err != nil { - Trace.Print(err) - return nil, err - } - // initialize the result map - result := make(map[string][]string) - // split the output into lines - lines := splitStdOutLines(stdout) - for _, line := range lines { - - // normalize whitespace and split into tokens - tokens := splitStdOutTokens(line) - pid := tokens[1] - port := strings.Split(tokens[8], ":")[1] - - // add the port to the result map - if _, ok := result[pid]; !ok { - result[pid] = []string{} - } - - if !contains(result[pid], port) { - result[pid] = append(result[pid], port) - } - } - - if len(result) == 0 { - return nil, errors.New("application not running") - } - - return result, nil -} - -// Windows, MacOS and Linux: returns a list of all open ports for all instances of anytype found using cli utilities -func getOpenPorts() (map[string][]string, error) { - // Get Platform - platform := runtime.GOOS - var ( - ports map[string][]string - err error - ) - //nolint:nestif - if platform == "windows" { - ports, err = getOpenPortsWindows() - if err != nil { - return nil, err - } - } else if platform == "darwin" { - ports, err = getOpenPortsUnix() - if err != nil { - return nil, err - } - } else if platform == "linux" { - ports, err = getOpenPortsUnix() - if err != nil { - return nil, err - } - } else { - return nil, errors.New("unsupported platform") - } - totalPids := len(ports) - for pid, pidports := range ports { - var gatewayPort, grpcWebPort string - var errs []error - for _, port := range pidports { - var ( - errDetectGateway, errDetectGrpcWeb error - serviceDetected bool - ) - if gatewayPort == "" { - if serviceDetected, errDetectGateway = isFileGateway(port); serviceDetected { - gatewayPort = port - } - } - // in case we already detected grpcweb port skip this - if !serviceDetected && grpcWebPort == "" { - if serviceDetected, errDetectGrpcWeb = isGrpcWebServer(port); serviceDetected { - grpcWebPort = port - } - } - if !serviceDetected { - // means port failed to detect either gateway or grpcweb - errs = append(errs, fmt.Errorf("port: %s; gateway: %w; grpcweb: %w", port, errDetectGateway, errDetectGrpcWeb)) - } - } - if gatewayPort != "" && grpcWebPort != "" { - ports[pid] = []string{grpcWebPort, gatewayPort} - } else { - Trace.Printf("can't detect ports. pid: %s; grpc: '%s'; gateway: '%s'; error: %v;", pid, grpcWebPort, gatewayPort, errs) - delete(ports, pid) - } - } - if len(ports) > 0 { - Trace.Printf("found ports: %v", ports) - } else { - Trace.Printf("ports no able to detect for %d pids", totalPids) - } - return ports, nil -} - -func getPorts() (map[string][]string, error) { - Trace = log.New(os.Stdout, "TRACE: ", log.Ldate|log.Ltime|log.Lshortfile) - Error = log.New(os.Stderr, "ERROR: ", log.Ldate|log.Ltime|log.Lshortfile) - - return getOpenPorts() -} diff --git a/core/core.go b/core/core.go index 5713d9aaa..595c1d5ba 100644 --- a/core/core.go +++ b/core/core.go @@ -26,6 +26,7 @@ var ( ) type MiddlewareInternal interface { + GetApp() *app.App GetAccountInfo(ctx context.Context) (*model.AccountInfo, error) } From 7ba6df706523c5b14cbecbf5f38e31f116e760cc Mon Sep 17 00:00:00 2001 From: Jannis Metrikat <120120832+jmetrikat@users.noreply.github.com> Date: Sat, 23 Nov 2024 15:25:10 +0100 Subject: [PATCH 022/195] GO-4459 Add create object handler --- cmd/api/demo/api_demo.go | 24 +++++++++++------- cmd/api/handlers.go | 53 ++++++++++++++++++++++++++++++++++++++-- cmd/api/main.go | 2 +- 3 files changed, 67 insertions(+), 12 deletions(-) diff --git a/cmd/api/demo/api_demo.go b/cmd/api/demo/api_demo.go index 171717616..340628f43 100644 --- a/cmd/api/demo/api_demo.go +++ b/cmd/api/demo/api_demo.go @@ -51,21 +51,21 @@ func main() { // spaces // {"POST", "/spaces", nil, map[string]interface{}{"name": "New Space"}}, - {"GET", "/spaces?limit={limit}&offset={offset}", map[string]interface{}{"limit": 100, "offset": 0}, nil}, - {"GET", "/spaces/{space_id}/members", map[string]interface{}{"space_id": testSpaceId}, nil}, + // {"GET", "/spaces?limit={limit}&offset={offset}", map[string]interface{}{"limit": 100, "offset": 0}, nil}, + // {"GET", "/spaces/{space_id}/members", map[string]interface{}{"space_id": testSpaceId}, nil}, // space_objects - {"GET", "/spaces/{space_id}/objects", map[string]interface{}{"space_id": testSpaceId, "limit": 100, "offset": 0}, nil}, - {"GET", "/spaces/{space_id}/objects/{object_id}", map[string]interface{}{"space_id": testSpaceId, "object_id": testObjectId}, nil}, - {"POST", "/spaces/{space_id}/objects", map[string]interface{}{"space_id": testSpaceId}, map[string]interface{}{"name": "New Object"}}, - {"PUT", "/spaces/{space_id}/objects/{object_id}", map[string]interface{}{"space_id": testSpaceId, "object_id": testObjectId}, map[string]interface{}{"name": "Updated Object"}}, + // {"GET", "/spaces/{space_id}/objects", map[string]interface{}{"space_id": testSpaceId, "limit": 100, "offset": 0}, nil}, + // {"GET", "/spaces/{space_id}/objects/{object_id}", map[string]interface{}{"space_id": testSpaceId, "object_id": testObjectId}, nil}, + // {"POST", "/spaces/{space_id}/objects", map[string]interface{}{"space_id": testSpaceId}, map[string]interface{}{"details": map[string]interface{}{"name": "New Object from demo", "iconEmoji": "💥"}, "template_id": "", "object_type_unique_key": "ot-page", "with_chat": false}}, + // {"PUT", "/spaces/{space_id}/objects/{object_id}", map[string]interface{}{"space_id": testSpaceId, "object_id": testObjectId}, map[string]interface{}{"name": "Updated Object"}}, // types_and_templates - {"GET", "/spaces/{space_id}/objectTypes?limit={limit}&offset={offset}", map[string]interface{}{"space_id": testSpaceId, "limit": 100, "offset": 0}, nil}, - {"GET", "/spaces/{space_id}/objectTypes/{type_id}/templates", map[string]interface{}{"space_id": testSpaceId, "type_id": testTypeId}, nil}, + // {"GET", "/spaces/{space_id}/objectTypes?limit={limit}&offset={offset}", map[string]interface{}{"space_id": testSpaceId, "limit": 100, "offset": 0}, nil}, + // {"GET", "/spaces/{space_id}/objectTypes/{type_id}/templates", map[string]interface{}{"space_id": testSpaceId, "type_id": testTypeId}, nil}, // search - {"GET", "/objects?search={search}&object_type={object_type}&limit={limit}&offset={offset}", map[string]interface{}{"search": "writing", "object_type": testTypeId, "limit": 100, "offset": 0}, nil}, + // {"GET", "/objects?search={search}&object_type={object_type}&limit={limit}&offset={offset}", map[string]interface{}{"search": "writing", "object_type": testTypeId, "limit": 100, "offset": 0}, nil}, } for _, ep := range endpoints { @@ -103,6 +103,12 @@ func main() { } defer resp.Body.Close() + // Check the status code + if resp.StatusCode != http.StatusOK { + log.Errorf("Request to %s returned status code %d\n", ep.endpoint, resp.StatusCode) + continue + } + // Read the response body, err := io.ReadAll(resp.Body) if err != nil { diff --git a/cmd/api/handlers.go b/cmd/api/handlers.go index a6a62e63b..50c3fe302 100644 --- a/cmd/api/handlers.go +++ b/cmd/api/handlers.go @@ -19,6 +19,13 @@ type NameRequest struct { Name string `json:"name"` } +type CreateObjectRequest struct { + Details map[string]interface{} `json:"details"` + TemplateID string `json:"template_id"` + ObjectTypeUniqueKey string `json:"object_type_unique_key"` + WithChat bool `json:"with_chat"` +} + // authdisplayCodeHandler generates a new challenge and returns the challenge ID // // @Summary Open a modal window with a code in Anytype Desktop app @@ -394,8 +401,49 @@ func (a *ApiServer) getObjectHandler(c *gin.Context) { // @Router /spaces/{space_id}/objects [post] func (a *ApiServer) createObjectHandler(c *gin.Context) { spaceID := c.Param("space_id") - // TODO: Implement logic to create a new object - c.JSON(http.StatusNotImplemented, gin.H{"message": "Not implemented yet", "space_id": spaceID}) + + request := CreateObjectRequest{} + if err := c.BindJSON(&request); err != nil { + c.JSON(http.StatusBadRequest, gin.H{"message": "Invalid JSON"}) + return + } + + resp := a.mw.ObjectCreate(context.Background(), &pb.RpcObjectCreateRequest{ + Details: &types.Struct{ + Fields: map[string]*types.Value{ + "name": {Kind: &types.Value_StringValue{StringValue: request.Details["name"].(string)}}, + "iconEmoji": {Kind: &types.Value_StringValue{StringValue: request.Details["iconEmoji"].(string)}}, + }, + }, + // TODO figure out internal flags + InternalFlags: []*model.InternalFlag{ + {Value: model.InternalFlagValue(2)}, + }, + TemplateId: request.TemplateID, + SpaceId: spaceID, + ObjectTypeUniqueKey: request.ObjectTypeUniqueKey, + WithChat: request.WithChat, + }) + + if resp.Error.Code != pb.RpcObjectCreateResponseError_NULL { + c.JSON(http.StatusInternalServerError, gin.H{"message": "Failed to create a new object."}) + return + } + + object := Object{ + Type: "object", + ID: resp.ObjectId, + Name: resp.Details.Fields["name"].GetStringValue(), + IconEmoji: resp.Details.Fields["iconEmoji"].GetStringValue(), + ObjectType: request.ObjectTypeUniqueKey, + SpaceID: resp.Details.Fields["spaceId"].GetStringValue(), + // TODO populate other fields + // RootID: resp.RootId, + // Blocks: []Block{}, + // Details: []Detail{}, + } + + c.JSON(http.StatusOK, gin.H{"object": object}) } // updateObjectHandler updates an existing object in a specific space @@ -462,6 +510,7 @@ func (a *ApiServer) getObjectTypesHandler(c *gin.Context) { objectTypes = append(objectTypes, ObjectType{ Type: "object_type", ID: record.Fields["id"].GetStringValue(), + UniqueKey: record.Fields["uniqueKey"].GetStringValue(), Name: record.Fields["name"].GetStringValue(), IconEmoji: record.Fields["iconEmoji"].GetStringValue(), }) diff --git a/cmd/api/main.go b/cmd/api/main.go index db847eeb7..ffe6b121c 100644 --- a/cmd/api/main.go +++ b/cmd/api/main.go @@ -105,7 +105,7 @@ func RunApiServer(ctx context.Context, mw service.ClientCommandsServer, mwIntern // readWrite.Use(a.PermissionMiddleware("read-write")) { readWrite.POST("/spaces", a.createSpaceHandler) - readWrite.POST("/spaces/:space_id/objects/:object_id", a.createObjectHandler) + readWrite.POST("/spaces/:space_id/objects/", a.createObjectHandler) readWrite.PUT("/spaces/:space_id/objects/:object_id", a.updateObjectHandler) } From 625f3fb4202e4f7ed3967ab63ce559d06743779f Mon Sep 17 00:00:00 2001 From: Jannis Metrikat <120120832+jmetrikat@users.noreply.github.com> Date: Sat, 23 Nov 2024 15:27:56 +0100 Subject: [PATCH 023/195] GO-4459 Don't resolve typename for unambiguous requests --- cmd/api/handlers.go | 16 ++-------------- 1 file changed, 2 insertions(+), 14 deletions(-) diff --git a/cmd/api/handlers.go b/cmd/api/handlers.go index 50c3fe302..1025e71dc 100644 --- a/cmd/api/handlers.go +++ b/cmd/api/handlers.go @@ -124,12 +124,6 @@ func (a *ApiServer) getSpacesHandler(c *gin.Context) { return } - typeName, err := a.resolveTypeToName(spaceId, "ot-space") - if err != nil { - c.JSON(http.StatusInternalServerError, gin.H{"message": "Failed to resolve type to name."}) - return - } - // TODO cleanup image logic // Convert space image or option to base64 string var iconBase64 string @@ -148,7 +142,7 @@ func (a *ApiServer) getSpacesHandler(c *gin.Context) { } space := Space{ - Type: typeName, + Type: "space", ID: spaceId, Name: record.Fields["name"].GetStringValue(), Icon: iconBase64, @@ -251,14 +245,8 @@ func (a *ApiServer) getSpaceMembersHandler(c *gin.Context) { members := make([]SpaceMember, 0, len(resp.Records)) for _, record := range resp.Records { - typeName, err := a.resolveTypeToName(spaceId, record.Fields["type"].GetStringValue()) - if err != nil { - c.JSON(http.StatusInternalServerError, gin.H{"message": "Failed to resolve type to name."}) - return - } - member := SpaceMember{ - Type: typeName, + Type: "space_member", ID: record.Fields["id"].GetStringValue(), Name: record.Fields["name"].GetStringValue(), Identity: record.Fields["identity"].GetStringValue(), From 2ff6f9dc4f6682291d6b5f45b40d1e2a8fb3c97c Mon Sep 17 00:00:00 2001 From: Jannis Metrikat <120120832+jmetrikat@users.noreply.github.com> Date: Sat, 23 Nov 2024 15:45:17 +0100 Subject: [PATCH 024/195] GO-4459 Update schemas, structs and docs --- cmd/api/docs/docs.go | 45 +++++++++++++++++++++++++++++++++------ cmd/api/docs/swagger.json | 45 +++++++++++++++++++++++++++++++++------ cmd/api/docs/swagger.yaml | 33 ++++++++++++++++++++++------ cmd/api/handlers.go | 37 ++++++++++++++++---------------- cmd/api/schemas.go | 1 + 5 files changed, 125 insertions(+), 36 deletions(-) diff --git a/cmd/api/docs/docs.go b/cmd/api/docs/docs.go index 676eb42c2..222fefe64 100644 --- a/cmd/api/docs/docs.go +++ b/cmd/api/docs/docs.go @@ -139,10 +139,15 @@ const docTemplate = `{ ], "responses": { "200": { - "description": "Total objects and object list", + "description": "List of objects", "schema": { "type": "object", - "additionalProperties": true + "additionalProperties": { + "type": "array", + "items": { + "$ref": "#/definitions/api.Object" + } + } } }, "403": { @@ -349,10 +354,12 @@ const docTemplate = `{ ], "responses": { "200": { - "description": "Total and object types", + "description": "List of object types", "schema": { "type": "object", - "additionalProperties": true + "additionalProperties": { + "$ref": "#/definitions/api.ObjectType" + } } }, "403": { @@ -474,10 +481,15 @@ const docTemplate = `{ ], "responses": { "200": { - "description": "Total objects and object list", + "description": "List of objects", "schema": { "type": "object", - "additionalProperties": true + "additionalProperties": { + "type": "array", + "items": { + "$ref": "#/definitions/api.Object" + } + } } }, "403": { @@ -832,6 +844,27 @@ const docTemplate = `{ } } }, + "api.ObjectType": { + "type": "object", + "properties": { + "iconEmoji": { + "type": "string" + }, + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "type": { + "type": "string", + "example": "object_type" + }, + "unique_key": { + "type": "string" + } + } + }, "api.ServerError": { "type": "object", "properties": { diff --git a/cmd/api/docs/swagger.json b/cmd/api/docs/swagger.json index 5dcaef8f2..a55d3a9a0 100644 --- a/cmd/api/docs/swagger.json +++ b/cmd/api/docs/swagger.json @@ -133,10 +133,15 @@ ], "responses": { "200": { - "description": "Total objects and object list", + "description": "List of objects", "schema": { "type": "object", - "additionalProperties": true + "additionalProperties": { + "type": "array", + "items": { + "$ref": "#/definitions/api.Object" + } + } } }, "403": { @@ -343,10 +348,12 @@ ], "responses": { "200": { - "description": "Total and object types", + "description": "List of object types", "schema": { "type": "object", - "additionalProperties": true + "additionalProperties": { + "$ref": "#/definitions/api.ObjectType" + } } }, "403": { @@ -468,10 +475,15 @@ ], "responses": { "200": { - "description": "Total objects and object list", + "description": "List of objects", "schema": { "type": "object", - "additionalProperties": true + "additionalProperties": { + "type": "array", + "items": { + "$ref": "#/definitions/api.Object" + } + } } }, "403": { @@ -826,6 +838,27 @@ } } }, + "api.ObjectType": { + "type": "object", + "properties": { + "iconEmoji": { + "type": "string" + }, + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "type": { + "type": "string", + "example": "object_type" + }, + "unique_key": { + "type": "string" + } + } + }, "api.ServerError": { "type": "object", "properties": { diff --git a/cmd/api/docs/swagger.yaml b/cmd/api/docs/swagger.yaml index 6fdaf15c4..9e55883cf 100644 --- a/cmd/api/docs/swagger.yaml +++ b/cmd/api/docs/swagger.yaml @@ -104,6 +104,20 @@ definitions: example: object_template type: string type: object + api.ObjectType: + properties: + iconEmoji: + type: string + id: + type: string + name: + type: string + type: + example: object_type + type: string + unique_key: + type: string + type: object api.ServerError: properties: error: @@ -298,9 +312,12 @@ paths: - application/json responses: "200": - description: Total objects and object list + description: List of objects schema: - additionalProperties: true + additionalProperties: + items: + $ref: '#/definitions/api.Object' + type: array type: object "403": description: Unauthorized @@ -438,9 +455,10 @@ paths: - application/json responses: "200": - description: Total and object types + description: List of object types schema: - additionalProperties: true + additionalProperties: + $ref: '#/definitions/api.ObjectType' type: object "403": description: Unauthorized @@ -522,9 +540,12 @@ paths: - application/json responses: "200": - description: Total objects and object list + description: List of objects schema: - additionalProperties: true + additionalProperties: + items: + $ref: '#/definitions/api.Object' + type: array type: object "403": description: Unauthorized diff --git a/cmd/api/handlers.go b/cmd/api/handlers.go index 1025e71dc..bbe01dae2 100644 --- a/cmd/api/handlers.go +++ b/cmd/api/handlers.go @@ -15,15 +15,16 @@ import ( "github.com/anyproto/anytype-heart/util/pbtypes" ) -type NameRequest struct { +type CreateSpaceRequest struct { Name string `json:"name"` } type CreateObjectRequest struct { - Details map[string]interface{} `json:"details"` - TemplateID string `json:"template_id"` - ObjectTypeUniqueKey string `json:"object_type_unique_key"` - WithChat bool `json:"with_chat"` + Name string `json:"name"` + IconEmoji string `json:"iconEmoji"` + TemplateID string `json:"template_id"` + ObjectTypeUniqueKey string `json:"object_type_unique_key"` + WithChat bool `json:"with_chat"` } // authdisplayCodeHandler generates a new challenge and returns the challenge ID @@ -54,7 +55,7 @@ func (a *ApiServer) authDisplayCodeHandler(c *gin.Context) { // @Accept json // @Produce json // @Param code query string true "The code retrieved from Anytype Desktop app" -// @ParamchallengeId query string true "The challenge ID" +// @ParamchallengeId query string true "The challenge ID" // @Success 200 {object} map[string]string "Access and refresh tokens" // @Failure 400 {object} ValidationError "Invalid input" // @Failure 502 {object} ServerError "Internal server error" @@ -177,7 +178,7 @@ func (a *ApiServer) getSpacesHandler(c *gin.Context) { // @Router /spaces [post] func (a *ApiServer) createSpaceHandler(c *gin.Context) { // Create new workspace with a random icon and import default usecase - nameRequest := NameRequest{} + nameRequest := CreateSpaceRequest{} if err := c.BindJSON(&nameRequest); err != nil { c.JSON(http.StatusBadRequest, gin.H{"message": "Invalid JSON"}) return @@ -268,7 +269,7 @@ func (a *ApiServer) getSpaceMembersHandler(c *gin.Context) { // @Param space_id path string true "The ID of the space" // @Param offset query int false "The number of items to skip before starting to collect the result set" // @Param limit query int false "The number of items to return" default(100) -// @Success 200 {object} map[string]interface{} "Total objects and object list" +// @Success 200 {object} map[string][]Object "List of objects" // @Failure 403 {object} UnauthorizedError "Unauthorized" // @Failure 404 {object} NotFoundError "Resource not found" // @Failure 502 {object} ServerError "Internal server error" @@ -399,8 +400,8 @@ func (a *ApiServer) createObjectHandler(c *gin.Context) { resp := a.mw.ObjectCreate(context.Background(), &pb.RpcObjectCreateRequest{ Details: &types.Struct{ Fields: map[string]*types.Value{ - "name": {Kind: &types.Value_StringValue{StringValue: request.Details["name"].(string)}}, - "iconEmoji": {Kind: &types.Value_StringValue{StringValue: request.Details["iconEmoji"].(string)}}, + "name": {Kind: &types.Value_StringValue{StringValue: request.Name}}, + "iconEmoji": {Kind: &types.Value_StringValue{StringValue: request.IconEmoji}}, }, }, // TODO figure out internal flags @@ -464,7 +465,7 @@ func (a *ApiServer) updateObjectHandler(c *gin.Context) { // @Param space_id path string true "The ID of the space" // @Param offset query int false "The number of items to skip before starting to collect the result set" // @Param limit query int false "The number of items to return" default(100) -// @Success 200 {object} map[string]interface{} "Total and object types" +// @Success 200 {object} map[string]ObjectType "List of object types" // @Failure 403 {object} UnauthorizedError "Unauthorized" // @Failure 404 {object} NotFoundError "Resource not found" // @Failure 502 {object} ServerError "Internal server error" @@ -597,13 +598,13 @@ func (a *ApiServer) getObjectTypeTemplatesHandler(c *gin.Context) { // @Tags search // @Accept json // @Produce json -// @Param search query string false "The search term to filter objects by name" -// @Param object_type query string false "Specify object type for search" -// @Param offset query int false "The number of items to skip before starting to collect the result set" -// @Param limit query int false "The number of items to return" default(100) -// @Success 200 {object} map[string]interface{} "Total objects and object list" -// @Failure 403 {object} UnauthorizedError "Unauthorized" -// @Failure 502 {object} ServerError "Internal server error" +// @Param search query string false "The search term to filter objects by name" +// @Param object_type query string false "Specify object type for search" +// @Param offset query int false "The number of items to skip before starting to collect the result set" +// @Param limit query int false "The number of items to return" default(100) +// @Success 200 {object} map[string][]Object "List of objects" +// @Failure 403 {object} UnauthorizedError "Unauthorized" +// @Failure 502 {object} ServerError "Internal server error" // @Router /objects [get] func (a *ApiServer) getObjectsHandler(c *gin.Context) { searchTerm := c.Query("search") diff --git a/cmd/api/schemas.go b/cmd/api/schemas.go index dae8692a6..743d5e7bd 100644 --- a/cmd/api/schemas.go +++ b/cmd/api/schemas.go @@ -87,6 +87,7 @@ type RelationLink struct { type ObjectType struct { Type string `json:"type" example:"object_type"` ID string `json:"id"` + UniqueKey string `json:"unique_key"` Name string `json:"name"` IconEmoji string `json:"iconEmoji"` } From 7bbd063f66acd24178b559fcc6f86618121b5e4d Mon Sep 17 00:00:00 2001 From: Jannis Metrikat <120120832+jmetrikat@users.noreply.github.com> Date: Sat, 23 Nov 2024 15:47:55 +0100 Subject: [PATCH 025/195] GO-4459 Fix request body --- cmd/api/demo/api_demo.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmd/api/demo/api_demo.go b/cmd/api/demo/api_demo.go index 340628f43..39593993d 100644 --- a/cmd/api/demo/api_demo.go +++ b/cmd/api/demo/api_demo.go @@ -57,7 +57,7 @@ func main() { // space_objects // {"GET", "/spaces/{space_id}/objects", map[string]interface{}{"space_id": testSpaceId, "limit": 100, "offset": 0}, nil}, // {"GET", "/spaces/{space_id}/objects/{object_id}", map[string]interface{}{"space_id": testSpaceId, "object_id": testObjectId}, nil}, - // {"POST", "/spaces/{space_id}/objects", map[string]interface{}{"space_id": testSpaceId}, map[string]interface{}{"details": map[string]interface{}{"name": "New Object from demo", "iconEmoji": "💥"}, "template_id": "", "object_type_unique_key": "ot-page", "with_chat": false}}, + {"POST", "/spaces/{space_id}/objects", map[string]interface{}{"space_id": testSpaceId}, map[string]interface{}{"name": "New Object from demo", "iconEmoji": "💥", "template_id": "", "object_type_unique_key": "ot-page", "with_chat": false}}, // {"PUT", "/spaces/{space_id}/objects/{object_id}", map[string]interface{}{"space_id": testSpaceId, "object_id": testObjectId}, map[string]interface{}{"name": "Updated Object"}}, // types_and_templates From e1a40e48e7cb9edcfa7e278b5bd5a1923e411752 Mon Sep 17 00:00:00 2001 From: Jannis Metrikat <120120832+jmetrikat@users.noreply.github.com> Date: Sat, 23 Nov 2024 17:22:56 +0100 Subject: [PATCH 026/195] GO-4459 Standardize schema format to snake_case --- cmd/api/demo/api_demo.go | 2 +- cmd/api/docs/docs.go | 36 +++++++++++++++++++++--------------- cmd/api/docs/swagger.json | 36 +++++++++++++++++++++--------------- cmd/api/docs/swagger.yaml | 24 +++++++++++++++--------- cmd/api/handlers.go | 2 +- cmd/api/schemas.go | 24 ++++++++++++------------ 6 files changed, 71 insertions(+), 53 deletions(-) diff --git a/cmd/api/demo/api_demo.go b/cmd/api/demo/api_demo.go index 39593993d..5f5ee2a65 100644 --- a/cmd/api/demo/api_demo.go +++ b/cmd/api/demo/api_demo.go @@ -57,7 +57,7 @@ func main() { // space_objects // {"GET", "/spaces/{space_id}/objects", map[string]interface{}{"space_id": testSpaceId, "limit": 100, "offset": 0}, nil}, // {"GET", "/spaces/{space_id}/objects/{object_id}", map[string]interface{}{"space_id": testSpaceId, "object_id": testObjectId}, nil}, - {"POST", "/spaces/{space_id}/objects", map[string]interface{}{"space_id": testSpaceId}, map[string]interface{}{"name": "New Object from demo", "iconEmoji": "💥", "template_id": "", "object_type_unique_key": "ot-page", "with_chat": false}}, + {"POST", "/spaces/{space_id}/objects", map[string]interface{}{"space_id": testSpaceId}, map[string]interface{}{"name": "New Object from demo", "icon_emoji": "💥", "template_id": "", "object_type_unique_key": "ot-page", "with_chat": false}}, // {"PUT", "/spaces/{space_id}/objects/{object_id}", map[string]interface{}{"space_id": testSpaceId, "object_id": testObjectId}, map[string]interface{}{"name": "Updated Object"}}, // types_and_templates diff --git a/cmd/api/docs/docs.go b/cmd/api/docs/docs.go index 222fefe64..bfb0951c8 100644 --- a/cmd/api/docs/docs.go +++ b/cmd/api/docs/docs.go @@ -714,7 +714,7 @@ const docTemplate = `{ "text": { "$ref": "#/definitions/api.Text" }, - "verticalalign": { + "vertical_align": { "type": "string" } } @@ -734,7 +734,7 @@ const docTemplate = `{ "api.File": { "type": "object", "properties": { - "addedat": { + "added_at": { "type": "integer" }, "hash": { @@ -755,7 +755,7 @@ const docTemplate = `{ "style": { "type": "integer" }, - "targetobjectid": { + "target_object_id": { "type": "string" }, "type": { @@ -799,8 +799,9 @@ const docTemplate = `{ "$ref": "#/definitions/api.Detail" } }, - "iconEmoji": { - "type": "string" + "icon_emoji": { + "type": "string", + "example": "📝" }, "id": { "type": "string", @@ -829,14 +830,16 @@ const docTemplate = `{ "api.ObjectTemplate": { "type": "object", "properties": { - "iconEmoji": { - "type": "string" + "icon_emoji": { + "type": "string", + "example": "📝" }, "id": { "type": "string" }, "name": { - "type": "string" + "type": "string", + "example": "Object Template Name" }, "type": { "type": "string", @@ -847,14 +850,16 @@ const docTemplate = `{ "api.ObjectType": { "type": "object", "properties": { - "iconEmoji": { - "type": "string" + "icon_emoji": { + "type": "string", + "example": "📝" }, "id": { "type": "string" }, "name": { - "type": "string" + "type": "string", + "example": "Object Type Name" }, "type": { "type": "string", @@ -898,7 +903,8 @@ const docTemplate = `{ "example": "bafyreie4qcl3wczb4cw5hrfyycikhjyh6oljdis3ewqrk5boaav3sbwqya" }, "icon": { - "type": "string" + "type": "string", + "example": "data:image/png;base64, \u003cbase64-encoded-image\u003e" }, "id": { "type": "string" @@ -953,7 +959,7 @@ const docTemplate = `{ }, "name": { "type": "string", - "example": "" + "example": "Space Member Name" }, "role": { "type": "string" @@ -973,10 +979,10 @@ const docTemplate = `{ "color": { "type": "string" }, - "iconemoji": { + "icon_emoji": { "type": "string" }, - "iconimage": { + "icon_image": { "type": "string" }, "style": { diff --git a/cmd/api/docs/swagger.json b/cmd/api/docs/swagger.json index a55d3a9a0..4807f85a2 100644 --- a/cmd/api/docs/swagger.json +++ b/cmd/api/docs/swagger.json @@ -708,7 +708,7 @@ "text": { "$ref": "#/definitions/api.Text" }, - "verticalalign": { + "vertical_align": { "type": "string" } } @@ -728,7 +728,7 @@ "api.File": { "type": "object", "properties": { - "addedat": { + "added_at": { "type": "integer" }, "hash": { @@ -749,7 +749,7 @@ "style": { "type": "integer" }, - "targetobjectid": { + "target_object_id": { "type": "string" }, "type": { @@ -793,8 +793,9 @@ "$ref": "#/definitions/api.Detail" } }, - "iconEmoji": { - "type": "string" + "icon_emoji": { + "type": "string", + "example": "📝" }, "id": { "type": "string", @@ -823,14 +824,16 @@ "api.ObjectTemplate": { "type": "object", "properties": { - "iconEmoji": { - "type": "string" + "icon_emoji": { + "type": "string", + "example": "📝" }, "id": { "type": "string" }, "name": { - "type": "string" + "type": "string", + "example": "Object Template Name" }, "type": { "type": "string", @@ -841,14 +844,16 @@ "api.ObjectType": { "type": "object", "properties": { - "iconEmoji": { - "type": "string" + "icon_emoji": { + "type": "string", + "example": "📝" }, "id": { "type": "string" }, "name": { - "type": "string" + "type": "string", + "example": "Object Type Name" }, "type": { "type": "string", @@ -892,7 +897,8 @@ "example": "bafyreie4qcl3wczb4cw5hrfyycikhjyh6oljdis3ewqrk5boaav3sbwqya" }, "icon": { - "type": "string" + "type": "string", + "example": "data:image/png;base64, \u003cbase64-encoded-image\u003e" }, "id": { "type": "string" @@ -947,7 +953,7 @@ }, "name": { "type": "string", - "example": "" + "example": "Space Member Name" }, "role": { "type": "string" @@ -967,10 +973,10 @@ "color": { "type": "string" }, - "iconemoji": { + "icon_emoji": { "type": "string" }, - "iconimage": { + "icon_image": { "type": "string" }, "style": { diff --git a/cmd/api/docs/swagger.yaml b/cmd/api/docs/swagger.yaml index 9e55883cf..2a9dd3800 100644 --- a/cmd/api/docs/swagger.yaml +++ b/cmd/api/docs/swagger.yaml @@ -18,7 +18,7 @@ definitions: $ref: '#/definitions/api.Layout' text: $ref: '#/definitions/api.Text' - verticalalign: + vertical_align: type: string type: object api.Detail: @@ -31,7 +31,7 @@ definitions: type: object api.File: properties: - addedat: + added_at: type: integer hash: type: string @@ -45,7 +45,7 @@ definitions: type: integer style: type: integer - targetobjectid: + target_object_id: type: string type: type: string @@ -73,7 +73,8 @@ definitions: items: $ref: '#/definitions/api.Detail' type: array - iconEmoji: + icon_emoji: + example: "\U0001F4DD" type: string id: example: bafyreie6n5l5nkbjal37su54cha4coy7qzuhrnajluzv5qd5jvtsrxkequ @@ -94,11 +95,13 @@ definitions: type: object api.ObjectTemplate: properties: - iconEmoji: + icon_emoji: + example: "\U0001F4DD" type: string id: type: string name: + example: Object Template Name type: string type: example: object_template @@ -106,11 +109,13 @@ definitions: type: object api.ObjectType: properties: - iconEmoji: + icon_emoji: + example: "\U0001F4DD" type: string id: type: string name: + example: Object Type Name type: string type: example: object_type @@ -141,6 +146,7 @@ definitions: example: bafyreie4qcl3wczb4cw5hrfyycikhjyh6oljdis3ewqrk5boaav3sbwqya type: string icon: + example: data:image/png;base64, type: string id: type: string @@ -180,7 +186,7 @@ definitions: example: "" type: string name: - example: "" + example: Space Member Name type: string role: type: string @@ -194,9 +200,9 @@ definitions: type: boolean color: type: string - iconemoji: + icon_emoji: type: string - iconimage: + icon_image: type: string style: type: string diff --git a/cmd/api/handlers.go b/cmd/api/handlers.go index bbe01dae2..31c708fca 100644 --- a/cmd/api/handlers.go +++ b/cmd/api/handlers.go @@ -21,7 +21,7 @@ type CreateSpaceRequest struct { type CreateObjectRequest struct { Name string `json:"name"` - IconEmoji string `json:"iconEmoji"` + IconEmoji string `json:"icon_emoji"` TemplateID string `json:"template_id"` ObjectTypeUniqueKey string `json:"object_type_unique_key"` WithChat bool `json:"with_chat"` diff --git a/cmd/api/schemas.go b/cmd/api/schemas.go index 743d5e7bd..33d4db2b9 100644 --- a/cmd/api/schemas.go +++ b/cmd/api/schemas.go @@ -4,7 +4,7 @@ type Space struct { Type string `json:"type" example:"space"` ID string `json:"id"` Name string `json:"name" example:"Space Name"` - Icon string `json:"icon"` + Icon string `json:"icon" example:"data:image/png;base64, "` HomeObjectID string `json:"home_object_id" example:"bafyreie4qcl3wczb4cw5hrfyycikhjyh6oljdis3ewqrk5boaav3sbwqya"` ArchiveObjectID string `json:"archive_object_id" example:"bafyreialsgoyflf3etjm3parzurivyaukzivwortf32b4twnlwpwocsrri"` ProfileObjectID string `json:"profile_object_id" example:"bafyreiaxhwreshjqwndpwtdsu4mtihaqhhmlygqnyqpfyfwlqfq3rm3gw4"` @@ -21,7 +21,7 @@ type Space struct { type SpaceMember struct { Type string `json:"type" example:"space_member"` ID string `json:"id"` - Name string `json:"name" example:""` + Name string `json:"name" example:"Space Member Name"` Identity string `json:"identity" example:""` Role string `json:"role" enum:"editor,viewer,owner"` } @@ -30,7 +30,7 @@ type Object struct { Type string `json:"type" example:"object"` ID string `json:"id" example:"bafyreie6n5l5nkbjal37su54cha4coy7qzuhrnajluzv5qd5jvtsrxkequ"` Name string `json:"name" example:"Object Name"` - IconEmoji string `json:"iconEmoji"` + IconEmoji string `json:"icon_emoji" example:"📝"` ObjectType string `json:"object_type" example:"note"` SpaceID string `json:"space_id"` RootID string `json:"root_id"` @@ -43,7 +43,7 @@ type Block struct { ChildrenIDs []string `json:"children_ids"` BackgroundColor string `json:"background_color"` Align string `json:"align"` - VerticalAlign string `json:"verticalalign"` + VerticalAlign string `json:"vertical_align"` Layout Layout `json:"layout"` Text Text `json:"text"` File File `json:"file"` @@ -58,8 +58,8 @@ type Text struct { Style string `json:"style"` Checked bool `json:"checked"` Color string `json:"color"` - IconEmoji string `json:"iconemoji"` - IconImage string `json:"iconimage"` + IconEmoji string `json:"icon_emoji"` + IconImage string `json:"icon_image"` } type File struct { @@ -68,8 +68,8 @@ type File struct { Type string `json:"type"` Mime string `json:"mime"` Size int `json:"size"` - AddedAt int `json:"addedat"` - TargetObjectID string `json:"targetobjectid"` + AddedAt int `json:"added_at"` + TargetObjectID string `json:"target_object_id"` State int `json:"state"` Style int `json:"style"` } @@ -88,15 +88,15 @@ type ObjectType struct { Type string `json:"type" example:"object_type"` ID string `json:"id"` UniqueKey string `json:"unique_key"` - Name string `json:"name"` - IconEmoji string `json:"iconEmoji"` + Name string `json:"name" example:"Object Type Name"` + IconEmoji string `json:"icon_emoji" example:"📝"` } type ObjectTemplate struct { Type string `json:"type" example:"object_template"` ID string `json:"id"` - Name string `json:"name"` - IconEmoji string `json:"iconEmoji"` + Name string `json:"name" example:"Object Template Name"` + IconEmoji string `json:"icon_emoji" example:"📝"` } type ServerError struct { From 431af5ef0dc49407abe1be408a314f3c0ed3e922 Mon Sep 17 00:00:00 2001 From: Jannis Metrikat <120120832+jmetrikat@users.noreply.github.com> Date: Sun, 24 Nov 2024 12:57:56 +0100 Subject: [PATCH 027/195] GO-4459 Resolve type names, fix bool filters, sort asc by name --- cmd/api/handlers.go | 39 +++++++++++++++++++++++++++++++++++---- 1 file changed, 35 insertions(+), 4 deletions(-) diff --git a/cmd/api/handlers.go b/cmd/api/handlers.go index 31c708fca..683202a9e 100644 --- a/cmd/api/handlers.go +++ b/cmd/api/handlers.go @@ -106,6 +106,12 @@ func (a *ApiServer) getSpacesHandler(c *gin.Context) { Value: pbtypes.Int64(int64(model.SpaceStatus_Ok)), }, }, + Sorts: []*model.BlockContentDataviewSort{ + { + RelationKey: "name", + Type: model.BlockContentDataviewSort_Asc, + }, + }, }) if resp.Error.Code != pb.RpcObjectSearchResponseError_NULL { c.JSON(http.StatusInternalServerError, gin.H{"message": "Failed to retrieve list of spaces."}) @@ -237,6 +243,12 @@ func (a *ApiServer) getSpaceMembersHandler(c *gin.Context) { Value: pbtypes.Int64(int64(model.ObjectType_participant)), }, }, + Sorts: []*model.BlockContentDataviewSort{ + { + RelationKey: "name", + Type: model.BlockContentDataviewSort_Asc, + }, + }, }) if resp.Error.Code != pb.RpcObjectSearchResponseError_NULL { @@ -304,12 +316,19 @@ func (a *ApiServer) getSpaceObjectsHandler(c *gin.Context) { objects := make([]Object, 0, len(resp.Records)) for _, record := range resp.Records { + objectTypeName, err := a.resolveTypeToName(spaceID, record.Fields["type"].GetStringValue()) + if err != nil { + c.JSON(http.StatusInternalServerError, gin.H{"message": "Failed to resolve object type name."}) + return + } + object := Object{ + // TODO fix type inconsistency Type: model.ObjectTypeLayout_name[int32(record.Fields["layout"].GetNumberValue())], ID: record.Fields["id"].GetStringValue(), Name: record.Fields["name"].GetStringValue(), IconEmoji: record.Fields["iconEmoji"].GetStringValue(), - ObjectType: record.Fields["type"].GetStringValue(), + ObjectType: objectTypeName, SpaceID: spaceID, // TODO: populate other fields // RootID: record.Fields["rootId"].GetStringValue(), @@ -361,12 +380,18 @@ func (a *ApiServer) getObjectHandler(c *gin.Context) { return } + objectTypeName, err := a.resolveTypeToName(spaceID, resp.ObjectView.Details[0].Details.Fields["type"].GetStringValue()) + if err != nil { + c.JSON(http.StatusInternalServerError, gin.H{"message": "Failed to resolve object type name."}) + return + } + object := Object{ Type: "object", ID: objectID, Name: resp.ObjectView.Details[0].Details.Fields["name"].GetStringValue(), IconEmoji: resp.ObjectView.Details[0].Details.Fields["iconEmoji"].GetStringValue(), - ObjectType: resp.ObjectView.Details[0].Details.Fields["type"].GetStringValue(), + ObjectType: objectTypeName, RootID: resp.ObjectView.RootId, // TODO: populate other fields Blocks: []Block{}, @@ -484,7 +509,13 @@ func (a *ApiServer) getObjectTypesHandler(c *gin.Context) { { RelationKey: bundle.RelationKeyIsHidden.String(), Condition: model.BlockContentDataviewFilter_NotEqual, - Value: pbtypes.String("true"), + Value: pbtypes.Bool(true), + }, + }, + Sorts: []*model.BlockContentDataviewSort{ + { + RelationKey: "name", + Type: model.BlockContentDataviewSort_Asc, }, }, }) @@ -651,7 +682,7 @@ func (a *ApiServer) getObjectsHandler(c *gin.Context) { { RelationKey: bundle.RelationKeyIsHidden.String(), Condition: model.BlockContentDataviewFilter_NotEqual, - Value: pbtypes.String("true"), + Value: pbtypes.Bool(true), }, { RelationKey: bundle.RelationKeyName.String(), From 48fc236a29792f64710fb9912d4cfa5754d96517 Mon Sep 17 00:00:00 2001 From: Jannis Metrikat <120120832+jmetrikat@users.noreply.github.com> Date: Sun, 24 Nov 2024 12:59:16 +0100 Subject: [PATCH 028/195] GO-4459 Add more examples to docs --- cmd/api/docs/docs.go | 33 ++++++++++++++++++++------------- cmd/api/docs/swagger.json | 33 ++++++++++++++++++++------------- cmd/api/docs/swagger.yaml | 19 +++++++++++++------ cmd/api/schemas.go | 26 +++++++++++++------------- 4 files changed, 66 insertions(+), 45 deletions(-) diff --git a/cmd/api/docs/docs.go b/cmd/api/docs/docs.go index bfb0951c8..20942d7d4 100644 --- a/cmd/api/docs/docs.go +++ b/cmd/api/docs/docs.go @@ -801,7 +801,7 @@ const docTemplate = `{ }, "icon_emoji": { "type": "string", - "example": "📝" + "example": "📄" }, "id": { "type": "string", @@ -813,13 +813,14 @@ const docTemplate = `{ }, "object_type": { "type": "string", - "example": "note" + "example": "Page" }, "root_id": { "type": "string" }, "space_id": { - "type": "string" + "type": "string", + "example": "bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1" }, "type": { "type": "string", @@ -832,10 +833,11 @@ const docTemplate = `{ "properties": { "icon_emoji": { "type": "string", - "example": "📝" + "example": "📄" }, "id": { - "type": "string" + "type": "string", + "example": "bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5uutge" }, "name": { "type": "string", @@ -852,21 +854,23 @@ const docTemplate = `{ "properties": { "icon_emoji": { "type": "string", - "example": "📝" + "example": "📄" }, "id": { - "type": "string" + "type": "string", + "example": "bafyreigyb6l5szohs32ts26ku2j42yd65e6hqy2u3gtzgdwqv6hzftsetu" }, "name": { "type": "string", - "example": "Object Type Name" + "example": "Page" }, "type": { "type": "string", "example": "object_type" }, "unique_key": { - "type": "string" + "type": "string", + "example": "ot-page" } } }, @@ -907,7 +911,8 @@ const docTemplate = `{ "example": "data:image/png;base64, \u003cbase64-encoded-image\u003e" }, "id": { - "type": "string" + "type": "string", + "example": "bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1" }, "marketplace_workspace_id": { "type": "string", @@ -951,18 +956,20 @@ const docTemplate = `{ "type": "object", "properties": { "id": { - "type": "string" + "type": "string", + "example": "_participant_bafyreigyfkt6rbv24sbv5aq2hko1bhmv5xxlf22b4bypdu6j7hnphm3psq_23me69r569oi1_AAjEaEwPF4nkEh9AWkqEnzcQ8HziBB4ETjiTpvRCQvWnSMDZ" }, "identity": { "type": "string", - "example": "" + "example": "AAjEaEwPF4nkEh7AWkqEnzcQ8HziGB4ETjiTpvRCQvWnSMDZ" }, "name": { "type": "string", "example": "Space Member Name" }, "role": { - "type": "string" + "type": "string", + "example": "editor" }, "type": { "type": "string", diff --git a/cmd/api/docs/swagger.json b/cmd/api/docs/swagger.json index 4807f85a2..deda809e3 100644 --- a/cmd/api/docs/swagger.json +++ b/cmd/api/docs/swagger.json @@ -795,7 +795,7 @@ }, "icon_emoji": { "type": "string", - "example": "📝" + "example": "📄" }, "id": { "type": "string", @@ -807,13 +807,14 @@ }, "object_type": { "type": "string", - "example": "note" + "example": "Page" }, "root_id": { "type": "string" }, "space_id": { - "type": "string" + "type": "string", + "example": "bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1" }, "type": { "type": "string", @@ -826,10 +827,11 @@ "properties": { "icon_emoji": { "type": "string", - "example": "📝" + "example": "📄" }, "id": { - "type": "string" + "type": "string", + "example": "bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5uutge" }, "name": { "type": "string", @@ -846,21 +848,23 @@ "properties": { "icon_emoji": { "type": "string", - "example": "📝" + "example": "📄" }, "id": { - "type": "string" + "type": "string", + "example": "bafyreigyb6l5szohs32ts26ku2j42yd65e6hqy2u3gtzgdwqv6hzftsetu" }, "name": { "type": "string", - "example": "Object Type Name" + "example": "Page" }, "type": { "type": "string", "example": "object_type" }, "unique_key": { - "type": "string" + "type": "string", + "example": "ot-page" } } }, @@ -901,7 +905,8 @@ "example": "data:image/png;base64, \u003cbase64-encoded-image\u003e" }, "id": { - "type": "string" + "type": "string", + "example": "bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1" }, "marketplace_workspace_id": { "type": "string", @@ -945,18 +950,20 @@ "type": "object", "properties": { "id": { - "type": "string" + "type": "string", + "example": "_participant_bafyreigyfkt6rbv24sbv5aq2hko1bhmv5xxlf22b4bypdu6j7hnphm3psq_23me69r569oi1_AAjEaEwPF4nkEh9AWkqEnzcQ8HziBB4ETjiTpvRCQvWnSMDZ" }, "identity": { "type": "string", - "example": "" + "example": "AAjEaEwPF4nkEh7AWkqEnzcQ8HziGB4ETjiTpvRCQvWnSMDZ" }, "name": { "type": "string", "example": "Space Member Name" }, "role": { - "type": "string" + "type": "string", + "example": "editor" }, "type": { "type": "string", diff --git a/cmd/api/docs/swagger.yaml b/cmd/api/docs/swagger.yaml index 2a9dd3800..6fa7877f8 100644 --- a/cmd/api/docs/swagger.yaml +++ b/cmd/api/docs/swagger.yaml @@ -74,7 +74,7 @@ definitions: $ref: '#/definitions/api.Detail' type: array icon_emoji: - example: "\U0001F4DD" + example: "\U0001F4C4" type: string id: example: bafyreie6n5l5nkbjal37su54cha4coy7qzuhrnajluzv5qd5jvtsrxkequ @@ -83,11 +83,12 @@ definitions: example: Object Name type: string object_type: - example: note + example: Page type: string root_id: type: string space_id: + example: bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1 type: string type: example: object @@ -96,9 +97,10 @@ definitions: api.ObjectTemplate: properties: icon_emoji: - example: "\U0001F4DD" + example: "\U0001F4C4" type: string id: + example: bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5uutge type: string name: example: Object Template Name @@ -110,17 +112,19 @@ definitions: api.ObjectType: properties: icon_emoji: - example: "\U0001F4DD" + example: "\U0001F4C4" type: string id: + example: bafyreigyb6l5szohs32ts26ku2j42yd65e6hqy2u3gtzgdwqv6hzftsetu type: string name: - example: Object Type Name + example: Page type: string type: example: object_type type: string unique_key: + example: ot-page type: string type: object api.ServerError: @@ -149,6 +153,7 @@ definitions: example: data:image/png;base64, type: string id: + example: bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1 type: string marketplace_workspace_id: example: _anytype_marketplace @@ -181,14 +186,16 @@ definitions: api.SpaceMember: properties: id: + example: _participant_bafyreigyfkt6rbv24sbv5aq2hko1bhmv5xxlf22b4bypdu6j7hnphm3psq_23me69r569oi1_AAjEaEwPF4nkEh9AWkqEnzcQ8HziBB4ETjiTpvRCQvWnSMDZ type: string identity: - example: "" + example: AAjEaEwPF4nkEh7AWkqEnzcQ8HziGB4ETjiTpvRCQvWnSMDZ type: string name: example: Space Member Name type: string role: + example: editor type: string type: example: space_member diff --git a/cmd/api/schemas.go b/cmd/api/schemas.go index 33d4db2b9..925a7f2dc 100644 --- a/cmd/api/schemas.go +++ b/cmd/api/schemas.go @@ -2,7 +2,7 @@ package api type Space struct { Type string `json:"type" example:"space"` - ID string `json:"id"` + ID string `json:"id" example:"bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1"` Name string `json:"name" example:"Space Name"` Icon string `json:"icon" example:"data:image/png;base64, "` HomeObjectID string `json:"home_object_id" example:"bafyreie4qcl3wczb4cw5hrfyycikhjyh6oljdis3ewqrk5boaav3sbwqya"` @@ -20,19 +20,19 @@ type Space struct { type SpaceMember struct { Type string `json:"type" example:"space_member"` - ID string `json:"id"` + ID string `json:"id" example:"_participant_bafyreigyfkt6rbv24sbv5aq2hko1bhmv5xxlf22b4bypdu6j7hnphm3psq_23me69r569oi1_AAjEaEwPF4nkEh9AWkqEnzcQ8HziBB4ETjiTpvRCQvWnSMDZ"` Name string `json:"name" example:"Space Member Name"` - Identity string `json:"identity" example:""` - Role string `json:"role" enum:"editor,viewer,owner"` + Identity string `json:"identity" example:"AAjEaEwPF4nkEh7AWkqEnzcQ8HziGB4ETjiTpvRCQvWnSMDZ"` + Role string `json:"role" enum:"editor,viewer,owner" example:"editor"` } type Object struct { Type string `json:"type" example:"object"` ID string `json:"id" example:"bafyreie6n5l5nkbjal37su54cha4coy7qzuhrnajluzv5qd5jvtsrxkequ"` Name string `json:"name" example:"Object Name"` - IconEmoji string `json:"icon_emoji" example:"📝"` - ObjectType string `json:"object_type" example:"note"` - SpaceID string `json:"space_id"` + IconEmoji string `json:"icon_emoji" example:"📄"` + ObjectType string `json:"object_type" example:"Page"` + SpaceID string `json:"space_id" example:"bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1"` RootID string `json:"root_id"` Blocks []Block `json:"blocks"` Details []Detail `json:"details"` @@ -86,17 +86,17 @@ type RelationLink struct { type ObjectType struct { Type string `json:"type" example:"object_type"` - ID string `json:"id"` - UniqueKey string `json:"unique_key"` - Name string `json:"name" example:"Object Type Name"` - IconEmoji string `json:"icon_emoji" example:"📝"` + ID string `json:"id" example:"bafyreigyb6l5szohs32ts26ku2j42yd65e6hqy2u3gtzgdwqv6hzftsetu"` + UniqueKey string `json:"unique_key" example:"ot-page"` + Name string `json:"name" example:"Page"` + IconEmoji string `json:"icon_emoji" example:"📄"` } type ObjectTemplate struct { Type string `json:"type" example:"object_template"` - ID string `json:"id"` + ID string `json:"id" example:"bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5uutge"` Name string `json:"name" example:"Object Template Name"` - IconEmoji string `json:"icon_emoji" example:"📝"` + IconEmoji string `json:"icon_emoji" example:"📄"` } type ServerError struct { From 36e594f05e36105b64ec2ce4bf7e0d55a9474404 Mon Sep 17 00:00:00 2001 From: Jannis Metrikat <120120832+jmetrikat@users.noreply.github.com> Date: Sun, 24 Nov 2024 14:22:58 +0100 Subject: [PATCH 029/195] GO-4459 Return icon and global name for members --- cmd/api/handlers.go | 31 +++++++++++++++++++++++++------ cmd/api/schemas.go | 12 +++++++----- 2 files changed, 32 insertions(+), 11 deletions(-) diff --git a/cmd/api/handlers.go b/cmd/api/handlers.go index 683202a9e..ed3b13a61 100644 --- a/cmd/api/handlers.go +++ b/cmd/api/handlers.go @@ -145,7 +145,12 @@ func (a *ApiServer) getSpacesHandler(c *gin.Context) { } else { iconOption := record.Fields["iconOption"].GetNumberValue() // TODO figure out size - iconBase64 = a.spaceSvg(int(iconOption), 100, string([]rune(record.Fields["name"].GetStringValue())[0])) + // Prevent index out of range error for space with empty name + if len(record.Fields["name"].GetStringValue()) > 0 { + iconBase64 = a.spaceSvg(int(iconOption), 100, string([]rune(record.Fields["name"].GetStringValue())[0])) + } else { + iconBase64 = a.spaceSvg(int(iconOption), 100, "") + } } space := Space{ @@ -258,12 +263,26 @@ func (a *ApiServer) getSpaceMembersHandler(c *gin.Context) { members := make([]SpaceMember, 0, len(resp.Records)) for _, record := range resp.Records { + // Convert iconImage to base64 string + iconImageId := record.Fields["iconImage"].GetStringValue() + iconBase64 := "" + if iconImageId != "" { + b64, err2 := a.imageToBase64(a.getGatewayURL(iconImageId)) + if err2 != nil { + c.JSON(http.StatusInternalServerError, gin.H{"message": "Failed to convert image to base64."}) + return + } + iconBase64 = b64 + } + member := SpaceMember{ - Type: "space_member", - ID: record.Fields["id"].GetStringValue(), - Name: record.Fields["name"].GetStringValue(), - Identity: record.Fields["identity"].GetStringValue(), - Role: model.ParticipantPermissions_name[int32(record.Fields["participantPermissions"].GetNumberValue())], + Type: "space_member", + ID: record.Fields["id"].GetStringValue(), + Name: record.Fields["name"].GetStringValue(), + Icon: iconBase64, + Identity: record.Fields["identity"].GetStringValue(), + GlobalName: record.Fields["globalName"].GetStringValue(), + Role: model.ParticipantPermissions_name[int32(record.Fields["participantPermissions"].GetNumberValue())], } members = append(members, member) diff --git a/cmd/api/schemas.go b/cmd/api/schemas.go index 925a7f2dc..bae16a96c 100644 --- a/cmd/api/schemas.go +++ b/cmd/api/schemas.go @@ -19,11 +19,13 @@ type Space struct { } type SpaceMember struct { - Type string `json:"type" example:"space_member"` - ID string `json:"id" example:"_participant_bafyreigyfkt6rbv24sbv5aq2hko1bhmv5xxlf22b4bypdu6j7hnphm3psq_23me69r569oi1_AAjEaEwPF4nkEh9AWkqEnzcQ8HziBB4ETjiTpvRCQvWnSMDZ"` - Name string `json:"name" example:"Space Member Name"` - Identity string `json:"identity" example:"AAjEaEwPF4nkEh7AWkqEnzcQ8HziGB4ETjiTpvRCQvWnSMDZ"` - Role string `json:"role" enum:"editor,viewer,owner" example:"editor"` + Type string `json:"type" example:"space_member"` + ID string `json:"id" example:"_participant_bafyreigyfkt6rbv24sbv5aq2hko1bhmv5xxlf22b4bypdu6j7hnphm3psq_23me69r569oi1_AAjEaEwPF4nkEh9AWkqEnzcQ8HziBB4ETjiTpvRCQvWnSMDZ"` + Name string `json:"name" example:"John Doe"` + Icon string `json:"icon" example:"data:image/png;base64, "` + Identity string `json:"identity" example:"AAjEaEwPF4nkEh7AWkqEnzcQ8HziGB4ETjiTpvRCQvWnSMDZ"` + GlobalName string `json:"global_name" example:"john.any"` + Role string `json:"role" enum:"Reader,Writer,Owner,NoPermission" example:"Owner"` } type Object struct { From 1c4b724edc236006547ff5ed63b1529ef638d8a8 Mon Sep 17 00:00:00 2001 From: Jannis Metrikat <120120832+jmetrikat@users.noreply.github.com> Date: Sun, 24 Nov 2024 17:37:53 +0100 Subject: [PATCH 030/195] GO-4459 Rename 'ID' to 'Id' --- cmd/api/docs/docs.go | 21 +++++- cmd/api/docs/swagger.json | 21 +++++- cmd/api/docs/swagger.yaml | 17 ++++- cmd/api/handlers.go | 148 +++++++++++++++++++------------------- cmd/api/schemas.go | 42 +++++------ 5 files changed, 146 insertions(+), 103 deletions(-) diff --git a/cmd/api/docs/docs.go b/cmd/api/docs/docs.go index 20942d7d4..028200fdf 100644 --- a/cmd/api/docs/docs.go +++ b/cmd/api/docs/docs.go @@ -71,6 +71,13 @@ const docTemplate = `{ "name": "code", "in": "query", "required": true + }, + { + "type": "string", + "description": "The challenge ID", + "name": "challengeId", + "in": "query", + "required": true } ], "responses": { @@ -333,7 +340,7 @@ const docTemplate = `{ "parameters": [ { "type": "string", - "description": "The ID of the space", + "description": "The Id of the space", "name": "space_id", "in": "path", "required": true @@ -955,6 +962,14 @@ const docTemplate = `{ "api.SpaceMember": { "type": "object", "properties": { + "global_name": { + "type": "string", + "example": "john.any" + }, + "icon": { + "type": "string", + "example": "data:image/png;base64, \u003cbase64-encoded-image\u003e" + }, "id": { "type": "string", "example": "_participant_bafyreigyfkt6rbv24sbv5aq2hko1bhmv5xxlf22b4bypdu6j7hnphm3psq_23me69r569oi1_AAjEaEwPF4nkEh9AWkqEnzcQ8HziBB4ETjiTpvRCQvWnSMDZ" @@ -965,11 +980,11 @@ const docTemplate = `{ }, "name": { "type": "string", - "example": "Space Member Name" + "example": "John Doe" }, "role": { "type": "string", - "example": "editor" + "example": "Owner" }, "type": { "type": "string", diff --git a/cmd/api/docs/swagger.json b/cmd/api/docs/swagger.json index deda809e3..f9ec01e0b 100644 --- a/cmd/api/docs/swagger.json +++ b/cmd/api/docs/swagger.json @@ -65,6 +65,13 @@ "name": "code", "in": "query", "required": true + }, + { + "type": "string", + "description": "The challenge ID", + "name": "challengeId", + "in": "query", + "required": true } ], "responses": { @@ -327,7 +334,7 @@ "parameters": [ { "type": "string", - "description": "The ID of the space", + "description": "The Id of the space", "name": "space_id", "in": "path", "required": true @@ -949,6 +956,14 @@ "api.SpaceMember": { "type": "object", "properties": { + "global_name": { + "type": "string", + "example": "john.any" + }, + "icon": { + "type": "string", + "example": "data:image/png;base64, \u003cbase64-encoded-image\u003e" + }, "id": { "type": "string", "example": "_participant_bafyreigyfkt6rbv24sbv5aq2hko1bhmv5xxlf22b4bypdu6j7hnphm3psq_23me69r569oi1_AAjEaEwPF4nkEh9AWkqEnzcQ8HziBB4ETjiTpvRCQvWnSMDZ" @@ -959,11 +974,11 @@ }, "name": { "type": "string", - "example": "Space Member Name" + "example": "John Doe" }, "role": { "type": "string", - "example": "editor" + "example": "Owner" }, "type": { "type": "string", diff --git a/cmd/api/docs/swagger.yaml b/cmd/api/docs/swagger.yaml index 6fa7877f8..636a6a2c3 100644 --- a/cmd/api/docs/swagger.yaml +++ b/cmd/api/docs/swagger.yaml @@ -185,6 +185,12 @@ definitions: type: object api.SpaceMember: properties: + global_name: + example: john.any + type: string + icon: + example: data:image/png;base64, + type: string id: example: _participant_bafyreigyfkt6rbv24sbv5aq2hko1bhmv5xxlf22b4bypdu6j7hnphm3psq_23me69r569oi1_AAjEaEwPF4nkEh9AWkqEnzcQ8HziBB4ETjiTpvRCQvWnSMDZ type: string @@ -192,10 +198,10 @@ definitions: example: AAjEaEwPF4nkEh7AWkqEnzcQ8HziGB4ETjiTpvRCQvWnSMDZ type: string name: - example: Space Member Name + example: John Doe type: string role: - example: editor + example: Owner type: string type: example: space_member @@ -278,6 +284,11 @@ paths: name: code required: true type: string + - description: The challenge ID + in: query + name: challengeId + required: true + type: string produces: - application/json responses: @@ -449,7 +460,7 @@ paths: consumes: - application/json parameters: - - description: The ID of the space + - description: The Id of the space in: path name: space_id required: true diff --git a/cmd/api/handlers.go b/cmd/api/handlers.go index ed3b13a61..4ef1ee77a 100644 --- a/cmd/api/handlers.go +++ b/cmd/api/handlers.go @@ -22,12 +22,12 @@ type CreateSpaceRequest struct { type CreateObjectRequest struct { Name string `json:"name"` IconEmoji string `json:"icon_emoji"` - TemplateID string `json:"template_id"` + TemplateId string `json:"template_id"` ObjectTypeUniqueKey string `json:"object_type_unique_key"` WithChat bool `json:"with_chat"` } -// authdisplayCodeHandler generates a new challenge and returns the challenge ID +// authdisplayCodeHandler generates a new challenge and returns the challenge Id // // @Summary Open a modal window with a code in Anytype Desktop app // @Tags auth @@ -50,16 +50,16 @@ func (a *ApiServer) authDisplayCodeHandler(c *gin.Context) { // authTokenHandler retrieves an authentication token using a code and challenge ID // -// @Summary Retrieve an authentication token using a code -// @Tags auth -// @Accept json -// @Produce json -// @Param code query string true "The code retrieved from Anytype Desktop app" -// @ParamchallengeId query string true "The challenge ID" -// @Success 200 {object} map[string]string "Access and refresh tokens" -// @Failure 400 {object} ValidationError "Invalid input" -// @Failure 502 {object} ServerError "Internal server error" -// @Router /auth/token [get] +// @Summary Retrieve an authentication token using a code +// @Tags auth +// @Accept json +// @Produce json +// @Param code query string true "The code retrieved from Anytype Desktop app" +// @Param challengeId query string true "The challenge ID" +// @Success 200 {object} map[string]string "Access and refresh tokens" +// @Failure 400 {object} ValidationError "Invalid input" +// @Failure 502 {object} ServerError "Internal server error" +// @Router /auth/token [get] func (a *ApiServer) authTokenHandler(c *gin.Context) { // Call AccountLocalLinkSolveChallenge to retrieve session token and app key resp := a.mw.AccountLocalLinkSolveChallenge(context.Background(), &pb.RpcAccountLocalLinkSolveChallengeRequest{ @@ -155,20 +155,20 @@ func (a *ApiServer) getSpacesHandler(c *gin.Context) { space := Space{ Type: "space", - ID: spaceId, + Id: spaceId, Name: record.Fields["name"].GetStringValue(), Icon: iconBase64, - HomeObjectID: record.Fields["spaceDashboardId"].GetStringValue(), - ArchiveObjectID: workspaceResponse.Info.ArchiveObjectId, - ProfileObjectID: workspaceResponse.Info.ProfileObjectId, - MarketplaceWorkspaceID: workspaceResponse.Info.MarketplaceWorkspaceId, - DeviceID: workspaceResponse.Info.DeviceId, - AccountSpaceID: workspaceResponse.Info.AccountSpaceId, - WidgetsID: workspaceResponse.Info.WidgetsId, - SpaceViewID: workspaceResponse.Info.SpaceViewId, - TechSpaceID: a.accountInfo.TechSpaceId, + HomeObjectId: record.Fields["spaceDashboardId"].GetStringValue(), + ArchiveObjectId: workspaceResponse.Info.ArchiveObjectId, + ProfileObjectId: workspaceResponse.Info.ProfileObjectId, + MarketplaceWorkspaceId: workspaceResponse.Info.MarketplaceWorkspaceId, + DeviceId: workspaceResponse.Info.DeviceId, + AccountSpaceId: workspaceResponse.Info.AccountSpaceId, + WidgetsId: workspaceResponse.Info.WidgetsId, + SpaceViewId: workspaceResponse.Info.SpaceViewId, + TechSpaceId: a.accountInfo.TechSpaceId, Timezone: workspaceResponse.Info.TimeZone, - NetworkID: workspaceResponse.Info.NetworkId, + NetworkId: workspaceResponse.Info.NetworkId, } spaces = append(spaces, space) } @@ -277,7 +277,7 @@ func (a *ApiServer) getSpaceMembersHandler(c *gin.Context) { member := SpaceMember{ Type: "space_member", - ID: record.Fields["id"].GetStringValue(), + Id: record.Fields["id"].GetStringValue(), Name: record.Fields["name"].GetStringValue(), Icon: iconBase64, Identity: record.Fields["identity"].GetStringValue(), @@ -297,22 +297,22 @@ func (a *ApiServer) getSpaceMembersHandler(c *gin.Context) { // @Tags space_objects // @Accept json // @Produce json -// @Param space_id path string true "The ID of the space" -// @Param offset query int false "The number of items to skip before starting to collect the result set" -// @Param limit query int false "The number of items to return" default(100) -// @Success 200 {object} map[string][]Object "List of objects" -// @Failure 403 {object} UnauthorizedError "Unauthorized" -// @Failure 404 {object} NotFoundError "Resource not found" -// @Failure 502 {object} ServerError "Internal server error" +// @Param space_id path string true "The ID of the space" +// @Param offset query int false "The number of items to skip before starting to collect the result set" +// @Param limit query int false "The number of items to return" default(100) +// @Success 200 {object} map[string][]Object "List of objects" +// @Failure 403 {object} UnauthorizedError "Unauthorized" +// @Failure 404 {object} NotFoundError "Resource not found" +// @Failure 502 {object} ServerError "Internal server error" // @Router /spaces/{space_id}/objects [get] func (a *ApiServer) getSpaceObjectsHandler(c *gin.Context) { - spaceID := c.Param("space_id") + spaceId := c.Param("space_id") // TODO: implement offset and limit // offset, _ := strconv.Atoi(c.DefaultQuery("offset", "0")) // limit, _ := strconv.Atoi(c.DefaultQuery("limit", "100")) resp := a.mw.ObjectSearch(context.Background(), &pb.RpcObjectSearchRequest{ - SpaceId: spaceID, + SpaceId: spaceId, Filters: []*model.BlockContentDataviewFilter{ { RelationKey: bundle.RelationKeyLayout.String(), @@ -335,7 +335,7 @@ func (a *ApiServer) getSpaceObjectsHandler(c *gin.Context) { objects := make([]Object, 0, len(resp.Records)) for _, record := range resp.Records { - objectTypeName, err := a.resolveTypeToName(spaceID, record.Fields["type"].GetStringValue()) + objectTypeName, err := a.resolveTypeToName(spaceId, record.Fields["type"].GetStringValue()) if err != nil { c.JSON(http.StatusInternalServerError, gin.H{"message": "Failed to resolve object type name."}) return @@ -344,17 +344,17 @@ func (a *ApiServer) getSpaceObjectsHandler(c *gin.Context) { object := Object{ // TODO fix type inconsistency Type: model.ObjectTypeLayout_name[int32(record.Fields["layout"].GetNumberValue())], - ID: record.Fields["id"].GetStringValue(), + Id: record.Fields["id"].GetStringValue(), Name: record.Fields["name"].GetStringValue(), IconEmoji: record.Fields["iconEmoji"].GetStringValue(), ObjectType: objectTypeName, - SpaceID: spaceID, + SpaceId: spaceId, // TODO: populate other fields - // RootID: record.Fields["rootId"].GetStringValue(), + // RootId: record.Fields["rootId"].GetStringValue(), // Blocks: []Block{}, Details: []Detail{ { - ID: "lastModifiedDate", + Id: "lastModifiedDate", Details: map[string]interface{}{ "lastModifiedDate": record.Fields["lastModifiedDate"].GetNumberValue(), }, @@ -382,24 +382,24 @@ func (a *ApiServer) getSpaceObjectsHandler(c *gin.Context) { // @Failure 502 {object} ServerError "Internal server error" // @Router /spaces/{space_id}/objects/{object_id} [get] func (a *ApiServer) getObjectHandler(c *gin.Context) { - spaceID := c.Param("space_id") - objectID := c.Param("object_id") + spaceId := c.Param("space_id") + objectId := c.Param("object_id") resp := a.mw.ObjectOpen(context.Background(), &pb.RpcObjectOpenRequest{ - SpaceId: spaceID, - ObjectId: objectID, + SpaceId: spaceId, + ObjectId: objectId, }) if resp.Error.Code != pb.RpcObjectOpenResponseError_NULL { if resp.Error.Code == pb.RpcObjectOpenResponseError_NOT_FOUND { - c.JSON(http.StatusNotFound, gin.H{"message": "Object not found", "space_id": spaceID, "object_id": objectID}) + c.JSON(http.StatusNotFound, gin.H{"message": "Object not found", "space_id": spaceId, "object_id": objectId}) return } c.JSON(http.StatusInternalServerError, gin.H{"message": "Failed to retrieve object."}) return } - objectTypeName, err := a.resolveTypeToName(spaceID, resp.ObjectView.Details[0].Details.Fields["type"].GetStringValue()) + objectTypeName, err := a.resolveTypeToName(spaceId, resp.ObjectView.Details[0].Details.Fields["type"].GetStringValue()) if err != nil { c.JSON(http.StatusInternalServerError, gin.H{"message": "Failed to resolve object type name."}) return @@ -407,11 +407,11 @@ func (a *ApiServer) getObjectHandler(c *gin.Context) { object := Object{ Type: "object", - ID: objectID, + Id: objectId, Name: resp.ObjectView.Details[0].Details.Fields["name"].GetStringValue(), IconEmoji: resp.ObjectView.Details[0].Details.Fields["iconEmoji"].GetStringValue(), ObjectType: objectTypeName, - RootID: resp.ObjectView.RootId, + RootId: resp.ObjectView.RootId, // TODO: populate other fields Blocks: []Block{}, Details: []Detail{}, @@ -433,7 +433,7 @@ func (a *ApiServer) getObjectHandler(c *gin.Context) { // @Failure 502 {object} ServerError "Internal server error" // @Router /spaces/{space_id}/objects [post] func (a *ApiServer) createObjectHandler(c *gin.Context) { - spaceID := c.Param("space_id") + spaceId := c.Param("space_id") request := CreateObjectRequest{} if err := c.BindJSON(&request); err != nil { @@ -452,8 +452,8 @@ func (a *ApiServer) createObjectHandler(c *gin.Context) { InternalFlags: []*model.InternalFlag{ {Value: model.InternalFlagValue(2)}, }, - TemplateId: request.TemplateID, - SpaceId: spaceID, + TemplateId: request.TemplateId, + SpaceId: spaceId, ObjectTypeUniqueKey: request.ObjectTypeUniqueKey, WithChat: request.WithChat, }) @@ -465,13 +465,13 @@ func (a *ApiServer) createObjectHandler(c *gin.Context) { object := Object{ Type: "object", - ID: resp.ObjectId, + Id: resp.ObjectId, Name: resp.Details.Fields["name"].GetStringValue(), IconEmoji: resp.Details.Fields["iconEmoji"].GetStringValue(), ObjectType: request.ObjectTypeUniqueKey, - SpaceID: resp.Details.Fields["spaceId"].GetStringValue(), + SpaceId: resp.Details.Fields["spaceId"].GetStringValue(), // TODO populate other fields - // RootID: resp.RootId, + // RootId: resp.RootId, // Blocks: []Block{}, // Details: []Detail{}, } @@ -494,10 +494,10 @@ func (a *ApiServer) createObjectHandler(c *gin.Context) { // @Failure 502 {object} ServerError "Internal server error" // @Router /spaces/{space_id}/objects/{object_id} [put] func (a *ApiServer) updateObjectHandler(c *gin.Context) { - spaceID := c.Param("space_id") - objectID := c.Param("object_id") + spaceId := c.Param("space_id") + objectId := c.Param("object_id") // TODO: Implement logic to update an existing object - c.JSON(http.StatusNotImplemented, gin.H{"message": "Not implemented yet", "space_id": spaceID, "object_id": objectID}) + c.JSON(http.StatusNotImplemented, gin.H{"message": "Not implemented yet", "space_id": spaceId, "object_id": objectId}) } // getObjectTypesHandler retrieves object types in a specific space @@ -506,7 +506,7 @@ func (a *ApiServer) updateObjectHandler(c *gin.Context) { // @Tags types_and_templates // @Accept json // @Produce json -// @Param space_id path string true "The ID of the space" +// @Param space_id path string true "The Id of the space" // @Param offset query int false "The number of items to skip before starting to collect the result set" // @Param limit query int false "The number of items to return" default(100) // @Success 200 {object} map[string]ObjectType "List of object types" @@ -515,10 +515,10 @@ func (a *ApiServer) updateObjectHandler(c *gin.Context) { // @Failure 502 {object} ServerError "Internal server error" // @Router /spaces/{space_id}/objectTypes [get] func (a *ApiServer) getObjectTypesHandler(c *gin.Context) { - spaceID := c.Param("space_id") + spaceId := c.Param("space_id") resp := a.mw.ObjectSearch(context.Background(), &pb.RpcObjectSearchRequest{ - SpaceId: spaceID, + SpaceId: spaceId, Filters: []*model.BlockContentDataviewFilter{ { RelationKey: bundle.RelationKeyLayout.String(), @@ -548,7 +548,7 @@ func (a *ApiServer) getObjectTypesHandler(c *gin.Context) { for _, record := range resp.Records { objectTypes = append(objectTypes, ObjectType{ Type: "object_type", - ID: record.Fields["id"].GetStringValue(), + Id: record.Fields["id"].GetStringValue(), UniqueKey: record.Fields["uniqueKey"].GetStringValue(), Name: record.Fields["name"].GetStringValue(), IconEmoji: record.Fields["iconEmoji"].GetStringValue(), @@ -572,12 +572,12 @@ func (a *ApiServer) getObjectTypesHandler(c *gin.Context) { // @Failure 502 {object} ServerError "Internal server error" // @Router /spaces/{space_id}/objectTypes/{typeId}/templates [get] func (a *ApiServer) getObjectTypeTemplatesHandler(c *gin.Context) { - spaceID := c.Param("space_id") - typeID := c.Param("typeId") + spaceId := c.Param("space_id") + typeId := c.Param("typeId") // First, determine the type Id of "ot-template" in the space templateTypeIdResp := a.mw.ObjectSearch(context.Background(), &pb.RpcObjectSearchRequest{ - SpaceId: spaceID, + SpaceId: spaceId, Filters: []*model.BlockContentDataviewFilter{ { RelationKey: bundle.RelationKeyUniqueKey.String(), @@ -592,16 +592,16 @@ func (a *ApiServer) getObjectTypeTemplatesHandler(c *gin.Context) { return } - templateTypeID := templateTypeIdResp.Records[0].Fields["id"].GetStringValue() + templateTypeId := templateTypeIdResp.Records[0].Fields["id"].GetStringValue() // Then, search all objects of the template type and filter by the target object type templateObjectsResp := a.mw.ObjectSearch(context.Background(), &pb.RpcObjectSearchRequest{ - SpaceId: spaceID, + SpaceId: spaceId, Filters: []*model.BlockContentDataviewFilter{ { RelationKey: bundle.RelationKeyType.String(), Condition: model.BlockContentDataviewFilter_Equal, - Value: pbtypes.String(templateTypeID), + Value: pbtypes.String(templateTypeId), }, }, }) @@ -613,7 +613,7 @@ func (a *ApiServer) getObjectTypeTemplatesHandler(c *gin.Context) { templateIds := make([]string, 0) for _, record := range templateObjectsResp.Records { - if record.Fields["targetObjectType"].GetStringValue() == typeID { + if record.Fields["targetObjectType"].GetStringValue() == typeId { templateIds = append(templateIds, record.Fields["id"].GetStringValue()) } } @@ -622,7 +622,7 @@ func (a *ApiServer) getObjectTypeTemplatesHandler(c *gin.Context) { templates := make([]ObjectTemplate, 0, len(templateIds)) for _, templateId := range templateIds { templateResp := a.mw.ObjectOpen(context.Background(), &pb.RpcObjectOpenRequest{ - SpaceId: spaceID, + SpaceId: spaceId, ObjectId: templateId, }) @@ -633,7 +633,7 @@ func (a *ApiServer) getObjectTypeTemplatesHandler(c *gin.Context) { templates = append(templates, ObjectTemplate{ Type: "object_template", - ID: templateId, + Id: templateId, Name: templateResp.ObjectView.Details[0].Details.Fields["name"].GetStringValue(), IconEmoji: templateResp.ObjectView.Details[0].Details.Fields["iconEmoji"].GetStringValue(), }) @@ -728,8 +728,9 @@ func (a *ApiServer) getObjectsHandler(c *gin.Context) { searchResults := make([]Object, 0) for _, spaceRecord := range resp.Records { + spaceId := spaceRecord.Fields["targetSpaceId"].GetStringValue() objectSearchResponse := a.mw.ObjectSearch(context.Background(), &pb.RpcObjectSearchRequest{ - SpaceId: spaceRecord.Fields["targetSpaceId"].GetStringValue(), + SpaceId: spaceId, Filters: filters, Sorts: []*model.BlockContentDataviewSort{{ RelationKey: bundle.RelationKeyLastModifiedDate.String(), @@ -738,7 +739,7 @@ func (a *ApiServer) getObjectsHandler(c *gin.Context) { }) for _, record := range objectSearchResponse.Records { - objectTypeName, err := a.resolveTypeToName(spaceRecord.Fields["targetSpaceId"].GetStringValue(), record.Fields["type"].GetStringValue()) + objectTypeName, err := a.resolveTypeToName(spaceId, record.Fields["type"].GetStringValue()) if err != nil { c.JSON(http.StatusInternalServerError, gin.H{"message": "Failed to resolve type to name."}) return @@ -746,16 +747,17 @@ func (a *ApiServer) getObjectsHandler(c *gin.Context) { searchResults = append(searchResults, Object{ Type: model.ObjectTypeLayout_name[int32(record.Fields["layout"].GetNumberValue())], - ID: record.Fields["id"].GetStringValue(), + Id: record.Fields["id"].GetStringValue(), Name: record.Fields["name"].GetStringValue(), IconEmoji: record.Fields["iconEmoji"].GetStringValue(), ObjectType: objectTypeName, + SpaceId: spaceId, // TODO: populate other fields - // RootID: record.Fields["rootId"].GetStringValue(), + // RootId: record.Fields["rootId"].GetStringValue(), // Blocks: []Block{}, Details: []Detail{ { - ID: "lastModifiedDate", + Id: "lastModifiedDate", Details: map[string]interface{}{ "lastModifiedDate": record.Fields["lastModifiedDate"].GetNumberValue(), }, diff --git a/cmd/api/schemas.go b/cmd/api/schemas.go index bae16a96c..816a171ba 100644 --- a/cmd/api/schemas.go +++ b/cmd/api/schemas.go @@ -2,25 +2,25 @@ package api type Space struct { Type string `json:"type" example:"space"` - ID string `json:"id" example:"bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1"` + Id string `json:"id" example:"bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1"` Name string `json:"name" example:"Space Name"` Icon string `json:"icon" example:"data:image/png;base64, "` - HomeObjectID string `json:"home_object_id" example:"bafyreie4qcl3wczb4cw5hrfyycikhjyh6oljdis3ewqrk5boaav3sbwqya"` - ArchiveObjectID string `json:"archive_object_id" example:"bafyreialsgoyflf3etjm3parzurivyaukzivwortf32b4twnlwpwocsrri"` - ProfileObjectID string `json:"profile_object_id" example:"bafyreiaxhwreshjqwndpwtdsu4mtihaqhhmlygqnyqpfyfwlqfq3rm3gw4"` - MarketplaceWorkspaceID string `json:"marketplace_workspace_id" example:"_anytype_marketplace"` - DeviceID string `json:"device_id" example:"12D3KooWGZMJ4kQVyQVXaj7gJPZr3RZ2nvd9M2Eq2pprEoPih9WF"` - AccountSpaceID string `json:"account_space_id" example:"bafyreihpd2knon5wbljhtfeg3fcqtg3i2pomhhnigui6lrjmzcjzep7gcy.23me69r569oi1"` - WidgetsID string `json:"widgets_id" example:"bafyreialj7pceh53mifm5dixlho47ke4qjmsn2uh4wsjf7xq2pnlo5xfva"` - SpaceViewID string `json:"space_view_id" example:"bafyreigzv3vq7qwlrsin6njoduq727ssnhwd6bgyfj6nm4hv3pxoc2rxhy"` - TechSpaceID string `json:"tech_space_id" example:"bafyreif4xuwncrjl6jajt4zrrfnylpki476nv2w64yf42ovt7gia7oypii.23me69r569oi1"` + HomeObjectId string `json:"home_object_id" example:"bafyreie4qcl3wczb4cw5hrfyycikhjyh6oljdis3ewqrk5boaav3sbwqya"` + ArchiveObjectId string `json:"archive_object_id" example:"bafyreialsgoyflf3etjm3parzurivyaukzivwortf32b4twnlwpwocsrri"` + ProfileObjectId string `json:"profile_object_id" example:"bafyreiaxhwreshjqwndpwtdsu4mtihaqhhmlygqnyqpfyfwlqfq3rm3gw4"` + MarketplaceWorkspaceId string `json:"marketplace_workspace_id" example:"_anytype_marketplace"` + DeviceId string `json:"device_id" example:"12D3KooWGZMJ4kQVyQVXaj7gJPZr3RZ2nvd9M2Eq2pprEoPih9WF"` + AccountSpaceId string `json:"account_space_id" example:"bafyreihpd2knon5wbljhtfeg3fcqtg3i2pomhhnigui6lrjmzcjzep7gcy.23me69r569oi1"` + WidgetsId string `json:"widgets_id" example:"bafyreialj7pceh53mifm5dixlho47ke4qjmsn2uh4wsjf7xq2pnlo5xfva"` + SpaceViewId string `json:"space_view_id" example:"bafyreigzv3vq7qwlrsin6njoduq727ssnhwd6bgyfj6nm4hv3pxoc2rxhy"` + TechSpaceId string `json:"tech_space_id" example:"bafyreif4xuwncrjl6jajt4zrrfnylpki476nv2w64yf42ovt7gia7oypii.23me69r569oi1"` Timezone string `json:"timezone" example:""` - NetworkID string `json:"network_id" example:"N83gJpVd9MuNRZAuJLZ7LiMntTThhPc6DtzWWVjb1M3PouVU"` + NetworkId string `json:"network_id" example:"N83gJpVd9MuNRZAuJLZ7LiMntTThhPc6DtzWWVjb1M3PouVU"` } type SpaceMember struct { Type string `json:"type" example:"space_member"` - ID string `json:"id" example:"_participant_bafyreigyfkt6rbv24sbv5aq2hko1bhmv5xxlf22b4bypdu6j7hnphm3psq_23me69r569oi1_AAjEaEwPF4nkEh9AWkqEnzcQ8HziBB4ETjiTpvRCQvWnSMDZ"` + Id string `json:"id" example:"_participant_bafyreigyfkt6rbv24sbv5aq2hko1bhmv5xxlf22b4bypdu6j7hnphm3psq_23me69r569oi1_AAjEaEwPF4nkEh9AWkqEnzcQ8HziBB4ETjiTpvRCQvWnSMDZ"` Name string `json:"name" example:"John Doe"` Icon string `json:"icon" example:"data:image/png;base64, "` Identity string `json:"identity" example:"AAjEaEwPF4nkEh7AWkqEnzcQ8HziGB4ETjiTpvRCQvWnSMDZ"` @@ -30,19 +30,19 @@ type SpaceMember struct { type Object struct { Type string `json:"type" example:"object"` - ID string `json:"id" example:"bafyreie6n5l5nkbjal37su54cha4coy7qzuhrnajluzv5qd5jvtsrxkequ"` + Id string `json:"id" example:"bafyreie6n5l5nkbjal37su54cha4coy7qzuhrnajluzv5qd5jvtsrxkequ"` Name string `json:"name" example:"Object Name"` IconEmoji string `json:"icon_emoji" example:"📄"` ObjectType string `json:"object_type" example:"Page"` - SpaceID string `json:"space_id" example:"bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1"` - RootID string `json:"root_id"` + SpaceId string `json:"space_id" example:"bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1"` + RootId string `json:"root_id"` Blocks []Block `json:"blocks"` Details []Detail `json:"details"` } type Block struct { - ID string `json:"id"` - ChildrenIDs []string `json:"children_ids"` + Id string `json:"id"` + ChildrenIds []string `json:"children_ids"` BackgroundColor string `json:"background_color"` Align string `json:"align"` VerticalAlign string `json:"vertical_align"` @@ -71,13 +71,13 @@ type File struct { Mime string `json:"mime"` Size int `json:"size"` AddedAt int `json:"added_at"` - TargetObjectID string `json:"target_object_id"` + TargetObjectId string `json:"target_object_id"` State int `json:"state"` Style int `json:"style"` } type Detail struct { - ID string `json:"id"` + Id string `json:"id"` Details map[string]interface{} `json:"details"` } @@ -88,7 +88,7 @@ type RelationLink struct { type ObjectType struct { Type string `json:"type" example:"object_type"` - ID string `json:"id" example:"bafyreigyb6l5szohs32ts26ku2j42yd65e6hqy2u3gtzgdwqv6hzftsetu"` + Id string `json:"id" example:"bafyreigyb6l5szohs32ts26ku2j42yd65e6hqy2u3gtzgdwqv6hzftsetu"` UniqueKey string `json:"unique_key" example:"ot-page"` Name string `json:"name" example:"Page"` IconEmoji string `json:"icon_emoji" example:"📄"` @@ -96,7 +96,7 @@ type ObjectType struct { type ObjectTemplate struct { Type string `json:"type" example:"object_template"` - ID string `json:"id" example:"bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5uutge"` + Id string `json:"id" example:"bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5uutge"` Name string `json:"name" example:"Object Template Name"` IconEmoji string `json:"icon_emoji" example:"📄"` } From a66cdf723e8171ddef5528b5d6e030f5585a1a7c Mon Sep 17 00:00:00 2001 From: Jannis Metrikat <120120832+jmetrikat@users.noreply.github.com> Date: Wed, 27 Nov 2024 15:18:46 +0100 Subject: [PATCH 031/195] GO-4459 Enhance logging and image fetching, update handlers --- cmd/api/demo/api_demo.go | 2 +- cmd/api/handlers.go | 8 +++----- cmd/api/helper.go | 8 ++++++-- cmd/api/main.go | 1 + 4 files changed, 11 insertions(+), 8 deletions(-) diff --git a/cmd/api/demo/api_demo.go b/cmd/api/demo/api_demo.go index 5f5ee2a65..a60f73e87 100644 --- a/cmd/api/demo/api_demo.go +++ b/cmd/api/demo/api_demo.go @@ -98,7 +98,7 @@ func main() { client := &http.Client{} resp, err := client.Do(req) if err != nil { - log.Errorf("Failed to make request to %s: %v\n", ep.endpoint, err) + log.Errorf("Failed to make request to %s: %v\n", finalURL, err.Error()) continue } defer resp.Body.Close() diff --git a/cmd/api/handlers.go b/cmd/api/handlers.go index 4ef1ee77a..ae0d18aa7 100644 --- a/cmd/api/handlers.go +++ b/cmd/api/handlers.go @@ -448,10 +448,6 @@ func (a *ApiServer) createObjectHandler(c *gin.Context) { "iconEmoji": {Kind: &types.Value_StringValue{StringValue: request.IconEmoji}}, }, }, - // TODO figure out internal flags - InternalFlags: []*model.InternalFlag{ - {Value: model.InternalFlagValue(2)}, - }, TemplateId: request.TemplateId, SpaceId: spaceId, ObjectTypeUniqueKey: request.ObjectTypeUniqueKey, @@ -506,7 +502,7 @@ func (a *ApiServer) updateObjectHandler(c *gin.Context) { // @Tags types_and_templates // @Accept json // @Produce json -// @Param space_id path string true "The Id of the space" +// @Param space_id path string true "The ID of the space" // @Param offset query int false "The number of items to skip before starting to collect the result set" // @Param limit query int false "The number of items to return" default(100) // @Success 200 {object} map[string]ObjectType "List of object types" @@ -691,6 +687,8 @@ func (a *ApiServer) getObjectsHandler(c *gin.Context) { Condition: model.BlockContentDataviewFilter_In, Value: pbtypes.IntList([]int{ int(model.ObjectType_basic), + int(model.ObjectType_profile), + int(model.ObjectType_todo), int(model.ObjectType_note), int(model.ObjectType_bookmark), int(model.ObjectType_set), diff --git a/cmd/api/helper.go b/cmd/api/helper.go index a7db660bc..a91ebfef7 100644 --- a/cmd/api/helper.go +++ b/cmd/api/helper.go @@ -74,9 +74,13 @@ func validateURL(url string) string { } func (a *ApiServer) imageToBase64(imagePath string) (string, error) { - resp, err := http.Get(validateURL(imagePath)) + client := &http.Client{ + Timeout: httpTimeout, + } + resp, err := client.Get(validateURL(imagePath)) if err != nil { - return "", err + // don't return error if image is not found + return "", nil } defer resp.Body.Close() diff --git a/cmd/api/main.go b/cmd/api/main.go index ffe6b121c..449e15ca2 100644 --- a/cmd/api/main.go +++ b/cmd/api/main.go @@ -19,6 +19,7 @@ import ( const ( httpPort = ":31009" + httpTimeout = 1 * time.Second serverShutdownTime = 5 * time.Second ) From 012e82d04c063b2cb470028e0255c58b68d7d73f Mon Sep 17 00:00:00 2001 From: AnastasiaShemyakinskaya Date: Wed, 27 Nov 2024 16:04:19 +0100 Subject: [PATCH 032/195] GO-4406: fix comments Signed-off-by: AnastasiaShemyakinskaya --- core/block/editor/state/state.go | 2 +- core/block/object/objectcreator/creator.go | 6 ++++++ core/block/object/objectcreator/object_type.go | 4 +--- core/block/object/objectcreator/relation.go | 4 +--- core/block/object/objectcreator/relation_option.go | 4 +--- 5 files changed, 10 insertions(+), 10 deletions(-) diff --git a/core/block/editor/state/state.go b/core/block/editor/state/state.go index 4e04fdfea..3cd247d65 100644 --- a/core/block/editor/state/state.go +++ b/core/block/editor/state/state.go @@ -133,7 +133,7 @@ type State struct { groupId string noObjectType bool - originalCreatedTimestamp int64 // pass here from snapshots when importing objects + originalCreatedTimestamp int64 // pass here from snapshots when importing objects or used for derived objects such as relations, types and etc } func (s *State) MigrationVersion() uint32 { diff --git a/core/block/object/objectcreator/creator.go b/core/block/object/objectcreator/creator.go index 765442306..44f400457 100644 --- a/core/block/object/objectcreator/creator.go +++ b/core/block/object/objectcreator/creator.go @@ -210,3 +210,9 @@ func buildDateObject(space clientspace.Space, details *types.Struct) (string, *t details, err = detailsGetter.DetailsFromId() return id, details, err } + +func setOriginalCreatedTimestamp(state *state.State, details *types.Struct) { + if createDate := pbtypes.GetInt64(details, bundle.RelationKeyCreatedDate.String()); createDate != 0 { + state.SetOriginalCreatedTimestamp(createDate) + } +} diff --git a/core/block/object/objectcreator/object_type.go b/core/block/object/objectcreator/object_type.go index f93767d96..30e6af2bc 100644 --- a/core/block/object/objectcreator/object_type.go +++ b/core/block/object/objectcreator/object_type.go @@ -43,9 +43,7 @@ func (s *service) createObjectType(ctx context.Context, space clientspace.Space, createState := state.NewDocWithUniqueKey("", nil, uniqueKey).(*state.State) createState.SetDetails(object) - if createDate := pbtypes.GetInt64(details, bundle.RelationKeyCreatedDate.String()); createDate != 0 { - createState.SetOriginalCreatedTimestamp(createDate) - } + setOriginalCreatedTimestamp(createState, details) id, newDetails, err = s.CreateSmartBlockFromStateInSpace(ctx, space, []domain.TypeKey{bundle.TypeKeyObjectType}, createState) if err != nil { return "", nil, fmt.Errorf("create smartblock from state: %w", err) diff --git a/core/block/object/objectcreator/relation.go b/core/block/object/objectcreator/relation.go index b74ebe7bd..d1936e0c5 100644 --- a/core/block/object/objectcreator/relation.go +++ b/core/block/object/objectcreator/relation.go @@ -58,8 +58,6 @@ func (s *service) createRelation(ctx context.Context, space clientspace.Space, d createState := state.NewDocWithUniqueKey("", nil, uniqueKey).(*state.State) createState.SetDetails(object) - if createDate := pbtypes.GetInt64(details, bundle.RelationKeyCreatedDate.String()); createDate != 0 { - createState.SetOriginalCreatedTimestamp(createDate) - } + setOriginalCreatedTimestamp(createState, details) return s.CreateSmartBlockFromStateInSpace(ctx, space, []domain.TypeKey{bundle.TypeKeyRelation}, createState) } diff --git a/core/block/object/objectcreator/relation_option.go b/core/block/object/objectcreator/relation_option.go index e4a3c6737..6f312a990 100644 --- a/core/block/object/objectcreator/relation_option.go +++ b/core/block/object/objectcreator/relation_option.go @@ -40,9 +40,7 @@ func (s *service) createRelationOption(ctx context.Context, space clientspace.Sp createState := state.NewDocWithUniqueKey("", nil, uniqueKey).(*state.State) createState.SetDetails(object) - if createDate := pbtypes.GetInt64(details, bundle.RelationKeyCreatedDate.String()); createDate != 0 { - createState.SetOriginalCreatedTimestamp(createDate) - } + setOriginalCreatedTimestamp(createState, details) return s.CreateSmartBlockFromStateInSpace(ctx, space, []domain.TypeKey{bundle.TypeKeyRelationOption}, createState) } From e9dc778e45be2ad5f909e6362c4ab17e02ce6207 Mon Sep 17 00:00:00 2001 From: Jannis Metrikat <120120832+jmetrikat@users.noreply.github.com> Date: Wed, 27 Nov 2024 23:33:25 +0100 Subject: [PATCH 033/195] GO-4459 Add chat endpoints and message schemas --- cmd/api/demo/api_demo.go | 15 +- cmd/api/docs/docs.go | 367 +++++++++++++++++++++++++++++++++++++- cmd/api/docs/swagger.json | 367 +++++++++++++++++++++++++++++++++++++- cmd/api/docs/swagger.yaml | 244 ++++++++++++++++++++++++- cmd/api/handlers.go | 210 +++++++++++++++++++--- cmd/api/helper.go | 57 +++++- cmd/api/main.go | 13 +- cmd/api/schemas.go | 33 ++++ 8 files changed, 1270 insertions(+), 36 deletions(-) diff --git a/cmd/api/demo/api_demo.go b/cmd/api/demo/api_demo.go index a60f73e87..f413f82e8 100644 --- a/cmd/api/demo/api_demo.go +++ b/cmd/api/demo/api_demo.go @@ -17,6 +17,8 @@ const ( testSpaceId = "bafyreifymx5ucm3fdc7vupfg7wakdo5qelni3jvlmawlnvjcppurn2b3di.2lcu0r85yg10d" // dev (entry space) testObjectId = "bafyreidhtlbbspxecab6xf4pi5zyxcmvwy6lqzursbjouq5fxovh6y3xwu" // "Work Faster with Templates" testTypeId = "bafyreie3djy4mcldt3hgeet6bnjay2iajdyi2fvx556n6wcxii7brlni3i" // Page (in dev space) + // chatSpaceId = "bafyreigryvrmerbtfswwz5kav2uq5dlvx3hl45kxn4nflg7lz46lneqs7m.2nvj2qik6ctdy" // Anytype Wiki space + chatSpaceId = "bafyreiexhpzaf7uxzheubh7cjeusqukjnxfvvhh4at6bygljwvto2dttnm.2lcu0r85yg10d" // chat space ) var log = logging.Logger("rest-api") @@ -57,7 +59,7 @@ func main() { // space_objects // {"GET", "/spaces/{space_id}/objects", map[string]interface{}{"space_id": testSpaceId, "limit": 100, "offset": 0}, nil}, // {"GET", "/spaces/{space_id}/objects/{object_id}", map[string]interface{}{"space_id": testSpaceId, "object_id": testObjectId}, nil}, - {"POST", "/spaces/{space_id}/objects", map[string]interface{}{"space_id": testSpaceId}, map[string]interface{}{"name": "New Object from demo", "icon_emoji": "💥", "template_id": "", "object_type_unique_key": "ot-page", "with_chat": false}}, + // {"POST", "/spaces/{space_id}/objects", map[string]interface{}{"space_id": testSpaceId}, map[string]interface{}{"name": "New Object from demo", "icon_emoji": "💥", "template_id": "", "object_type_unique_key": "ot-page", "with_chat": false}}, // {"PUT", "/spaces/{space_id}/objects/{object_id}", map[string]interface{}{"space_id": testSpaceId, "object_id": testObjectId}, map[string]interface{}{"name": "Updated Object"}}, // types_and_templates @@ -66,6 +68,10 @@ func main() { // search // {"GET", "/objects?search={search}&object_type={object_type}&limit={limit}&offset={offset}", map[string]interface{}{"search": "writing", "object_type": testTypeId, "limit": 100, "offset": 0}, nil}, + + // chat + // {"GET", "/spaces/{space_id}/chat/messages?limit={limit}&offset={offset}", map[string]interface{}{"space_id": chatSpaceId, "limit": 100, "offset": 0}, nil}, + // {"POST", "/spaces/{space_id}/chat/messages", map[string]interface{}{"space_id": chatSpaceId}, map[string]interface{}{"text": "new message from demo"}}, } for _, ep := range endpoints { @@ -105,7 +111,12 @@ func main() { // Check the status code if resp.StatusCode != http.StatusOK { - log.Errorf("Request to %s returned status code %d\n", ep.endpoint, resp.StatusCode) + body, err := io.ReadAll(resp.Body) + if err != nil { + log.Errorf("Failes to read response body for request to %s with code %d.", finalURL, resp.StatusCode) + continue + } + log.Errorf("Request to %s returned status code %d: %v\n", finalURL, resp.StatusCode, string(body)) continue } diff --git a/cmd/api/docs/docs.go b/cmd/api/docs/docs.go index 028200fdf..cd5d79547 100644 --- a/cmd/api/docs/docs.go +++ b/cmd/api/docs/docs.go @@ -340,7 +340,7 @@ const docTemplate = `{ "parameters": [ { "type": "string", - "description": "The Id of the space", + "description": "The ID of the space", "name": "space_id", "in": "path", "required": true @@ -691,9 +691,273 @@ const docTemplate = `{ } } } + }, + "/v1/spaces/{space_id}/chat/messages": { + "get": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "chat" + ], + "summary": "Retrieve last chat messages", + "parameters": [ + { + "type": "string", + "description": "The ID of the space", + "name": "space_id", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "List of chat messages", + "schema": { + "type": "object", + "additionalProperties": { + "type": "array", + "items": { + "$ref": "#/definitions/api.ChatMessage" + } + } + } + }, + "502": { + "description": "Internal server error", + "schema": { + "$ref": "#/definitions/api.ServerError" + } + } + } + }, + "post": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "chat" + ], + "summary": "Add a new chat message", + "parameters": [ + { + "type": "string", + "description": "The ID of the space", + "name": "space_id", + "in": "path", + "required": true + }, + { + "description": "Chat message", + "name": "message", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/api.ChatMessage" + } + } + ], + "responses": { + "201": { + "description": "Created chat message", + "schema": { + "$ref": "#/definitions/api.ChatMessage" + } + }, + "400": { + "description": "Invalid input", + "schema": { + "$ref": "#/definitions/api.ValidationError" + } + }, + "502": { + "description": "Internal server error", + "schema": { + "$ref": "#/definitions/api.ServerError" + } + } + } + } + }, + "/v1/spaces/{space_id}/chat/messages/{message_id}": { + "get": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "chat" + ], + "summary": "Retrieve a specific chat message", + "parameters": [ + { + "type": "string", + "description": "The ID of the space", + "name": "space_id", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "Message ID", + "name": "message_id", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "Chat message", + "schema": { + "$ref": "#/definitions/api.ChatMessage" + } + }, + "404": { + "description": "Message not found", + "schema": { + "$ref": "#/definitions/api.NotFoundError" + } + }, + "502": { + "description": "Internal server error", + "schema": { + "$ref": "#/definitions/api.ServerError" + } + } + } + }, + "put": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "chat" + ], + "summary": "Update an existing chat message", + "parameters": [ + { + "type": "string", + "description": "The ID of the space", + "name": "space_id", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "Message ID", + "name": "message_id", + "in": "path", + "required": true + }, + { + "description": "Chat message", + "name": "message", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/api.ChatMessage" + } + } + ], + "responses": { + "200": { + "description": "Updated chat message", + "schema": { + "$ref": "#/definitions/api.ChatMessage" + } + }, + "400": { + "description": "Invalid input", + "schema": { + "$ref": "#/definitions/api.ValidationError" + } + }, + "404": { + "description": "Message not found", + "schema": { + "$ref": "#/definitions/api.NotFoundError" + } + }, + "502": { + "description": "Internal server error", + "schema": { + "$ref": "#/definitions/api.ServerError" + } + } + } + }, + "delete": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "chat" + ], + "summary": "Delete a chat message", + "parameters": [ + { + "type": "string", + "description": "The ID of the space", + "name": "space_id", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "Message ID", + "name": "message_id", + "in": "path", + "required": true + } + ], + "responses": { + "204": { + "description": "Message deleted successfully" + }, + "404": { + "description": "Message not found", + "schema": { + "$ref": "#/definitions/api.NotFoundError" + } + }, + "502": { + "description": "Internal server error", + "schema": { + "$ref": "#/definitions/api.ServerError" + } + } + } + } } }, "definitions": { + "api.Attachment": { + "type": "object", + "properties": { + "target": { + "description": "Identifier for the attachment object", + "type": "string" + }, + "type": { + "description": "Type of attachment", + "type": "string" + } + } + }, "api.Block": { "type": "object", "properties": { @@ -726,6 +990,59 @@ const docTemplate = `{ } } }, + "api.ChatMessage": { + "type": "object", + "properties": { + "attachments": { + "description": "Attachments slice", + "type": "array", + "items": { + "$ref": "#/definitions/api.Attachment" + } + }, + "chat_message": { + "type": "string" + }, + "created_at": { + "type": "integer" + }, + "creator": { + "description": "Identifier for the message creator", + "type": "string" + }, + "id": { + "description": "Unique message identifier", + "type": "string" + }, + "message": { + "description": "Message content", + "allOf": [ + { + "$ref": "#/definitions/api.MessageContent" + } + ] + }, + "modified_at": { + "type": "integer" + }, + "order_id": { + "description": "Used for subscriptions", + "type": "string" + }, + "reactions": { + "description": "Reactions to the message", + "allOf": [ + { + "$ref": "#/definitions/api.Reactions" + } + ] + }, + "reply_to_message_id": { + "description": "Identifier for the message being replied to", + "type": "string" + } + } + }, "api.Detail": { "type": "object", "properties": { @@ -770,6 +1087,18 @@ const docTemplate = `{ } } }, + "api.IdentityList": { + "type": "object", + "properties": { + "ids": { + "description": "List of user IDs", + "type": "array", + "items": { + "type": "string" + } + } + } + }, "api.Layout": { "type": "object", "properties": { @@ -778,6 +1107,26 @@ const docTemplate = `{ } } }, + "api.MessageContent": { + "type": "object", + "properties": { + "marks": { + "description": "List of marks applied to the text", + "type": "array", + "items": { + "type": "string" + } + }, + "style": { + "description": "The style/type of the message part", + "type": "string" + }, + "text": { + "description": "The text content of the message part", + "type": "string" + } + } + }, "api.NotFoundError": { "type": "object", "properties": { @@ -881,6 +1230,18 @@ const docTemplate = `{ } } }, + "api.Reactions": { + "type": "object", + "properties": { + "reactions": { + "description": "Map of emoji to list of user IDs", + "type": "object", + "additionalProperties": { + "$ref": "#/definitions/api.IdentityList" + } + } + } + }, "api.ServerError": { "type": "object", "properties": { @@ -956,6 +1317,10 @@ const docTemplate = `{ "widgets_id": { "type": "string", "example": "bafyreialj7pceh53mifm5dixlho47ke4qjmsn2uh4wsjf7xq2pnlo5xfva" + }, + "workspace_object_id": { + "type": "string", + "example": "bafyreiapey2g6e6za4zfxvlgwdy4hbbfu676gmwrhnqvjbxvrchr7elr3y" } } }, diff --git a/cmd/api/docs/swagger.json b/cmd/api/docs/swagger.json index f9ec01e0b..fb0a5f041 100644 --- a/cmd/api/docs/swagger.json +++ b/cmd/api/docs/swagger.json @@ -334,7 +334,7 @@ "parameters": [ { "type": "string", - "description": "The Id of the space", + "description": "The ID of the space", "name": "space_id", "in": "path", "required": true @@ -685,9 +685,273 @@ } } } + }, + "/v1/spaces/{space_id}/chat/messages": { + "get": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "chat" + ], + "summary": "Retrieve last chat messages", + "parameters": [ + { + "type": "string", + "description": "The ID of the space", + "name": "space_id", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "List of chat messages", + "schema": { + "type": "object", + "additionalProperties": { + "type": "array", + "items": { + "$ref": "#/definitions/api.ChatMessage" + } + } + } + }, + "502": { + "description": "Internal server error", + "schema": { + "$ref": "#/definitions/api.ServerError" + } + } + } + }, + "post": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "chat" + ], + "summary": "Add a new chat message", + "parameters": [ + { + "type": "string", + "description": "The ID of the space", + "name": "space_id", + "in": "path", + "required": true + }, + { + "description": "Chat message", + "name": "message", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/api.ChatMessage" + } + } + ], + "responses": { + "201": { + "description": "Created chat message", + "schema": { + "$ref": "#/definitions/api.ChatMessage" + } + }, + "400": { + "description": "Invalid input", + "schema": { + "$ref": "#/definitions/api.ValidationError" + } + }, + "502": { + "description": "Internal server error", + "schema": { + "$ref": "#/definitions/api.ServerError" + } + } + } + } + }, + "/v1/spaces/{space_id}/chat/messages/{message_id}": { + "get": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "chat" + ], + "summary": "Retrieve a specific chat message", + "parameters": [ + { + "type": "string", + "description": "The ID of the space", + "name": "space_id", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "Message ID", + "name": "message_id", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "Chat message", + "schema": { + "$ref": "#/definitions/api.ChatMessage" + } + }, + "404": { + "description": "Message not found", + "schema": { + "$ref": "#/definitions/api.NotFoundError" + } + }, + "502": { + "description": "Internal server error", + "schema": { + "$ref": "#/definitions/api.ServerError" + } + } + } + }, + "put": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "chat" + ], + "summary": "Update an existing chat message", + "parameters": [ + { + "type": "string", + "description": "The ID of the space", + "name": "space_id", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "Message ID", + "name": "message_id", + "in": "path", + "required": true + }, + { + "description": "Chat message", + "name": "message", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/api.ChatMessage" + } + } + ], + "responses": { + "200": { + "description": "Updated chat message", + "schema": { + "$ref": "#/definitions/api.ChatMessage" + } + }, + "400": { + "description": "Invalid input", + "schema": { + "$ref": "#/definitions/api.ValidationError" + } + }, + "404": { + "description": "Message not found", + "schema": { + "$ref": "#/definitions/api.NotFoundError" + } + }, + "502": { + "description": "Internal server error", + "schema": { + "$ref": "#/definitions/api.ServerError" + } + } + } + }, + "delete": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "chat" + ], + "summary": "Delete a chat message", + "parameters": [ + { + "type": "string", + "description": "The ID of the space", + "name": "space_id", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "Message ID", + "name": "message_id", + "in": "path", + "required": true + } + ], + "responses": { + "204": { + "description": "Message deleted successfully" + }, + "404": { + "description": "Message not found", + "schema": { + "$ref": "#/definitions/api.NotFoundError" + } + }, + "502": { + "description": "Internal server error", + "schema": { + "$ref": "#/definitions/api.ServerError" + } + } + } + } } }, "definitions": { + "api.Attachment": { + "type": "object", + "properties": { + "target": { + "description": "Identifier for the attachment object", + "type": "string" + }, + "type": { + "description": "Type of attachment", + "type": "string" + } + } + }, "api.Block": { "type": "object", "properties": { @@ -720,6 +984,59 @@ } } }, + "api.ChatMessage": { + "type": "object", + "properties": { + "attachments": { + "description": "Attachments slice", + "type": "array", + "items": { + "$ref": "#/definitions/api.Attachment" + } + }, + "chat_message": { + "type": "string" + }, + "created_at": { + "type": "integer" + }, + "creator": { + "description": "Identifier for the message creator", + "type": "string" + }, + "id": { + "description": "Unique message identifier", + "type": "string" + }, + "message": { + "description": "Message content", + "allOf": [ + { + "$ref": "#/definitions/api.MessageContent" + } + ] + }, + "modified_at": { + "type": "integer" + }, + "order_id": { + "description": "Used for subscriptions", + "type": "string" + }, + "reactions": { + "description": "Reactions to the message", + "allOf": [ + { + "$ref": "#/definitions/api.Reactions" + } + ] + }, + "reply_to_message_id": { + "description": "Identifier for the message being replied to", + "type": "string" + } + } + }, "api.Detail": { "type": "object", "properties": { @@ -764,6 +1081,18 @@ } } }, + "api.IdentityList": { + "type": "object", + "properties": { + "ids": { + "description": "List of user IDs", + "type": "array", + "items": { + "type": "string" + } + } + } + }, "api.Layout": { "type": "object", "properties": { @@ -772,6 +1101,26 @@ } } }, + "api.MessageContent": { + "type": "object", + "properties": { + "marks": { + "description": "List of marks applied to the text", + "type": "array", + "items": { + "type": "string" + } + }, + "style": { + "description": "The style/type of the message part", + "type": "string" + }, + "text": { + "description": "The text content of the message part", + "type": "string" + } + } + }, "api.NotFoundError": { "type": "object", "properties": { @@ -875,6 +1224,18 @@ } } }, + "api.Reactions": { + "type": "object", + "properties": { + "reactions": { + "description": "Map of emoji to list of user IDs", + "type": "object", + "additionalProperties": { + "$ref": "#/definitions/api.IdentityList" + } + } + } + }, "api.ServerError": { "type": "object", "properties": { @@ -950,6 +1311,10 @@ "widgets_id": { "type": "string", "example": "bafyreialj7pceh53mifm5dixlho47ke4qjmsn2uh4wsjf7xq2pnlo5xfva" + }, + "workspace_object_id": { + "type": "string", + "example": "bafyreiapey2g6e6za4zfxvlgwdy4hbbfu676gmwrhnqvjbxvrchr7elr3y" } } }, diff --git a/cmd/api/docs/swagger.yaml b/cmd/api/docs/swagger.yaml index 636a6a2c3..44f40e8ee 100644 --- a/cmd/api/docs/swagger.yaml +++ b/cmd/api/docs/swagger.yaml @@ -1,5 +1,14 @@ basePath: /v1 definitions: + api.Attachment: + properties: + target: + description: Identifier for the attachment object + type: string + type: + description: Type of attachment + type: string + type: object api.Block: properties: align: @@ -21,6 +30,40 @@ definitions: vertical_align: type: string type: object + api.ChatMessage: + properties: + attachments: + description: Attachments slice + items: + $ref: '#/definitions/api.Attachment' + type: array + chat_message: + type: string + created_at: + type: integer + creator: + description: Identifier for the message creator + type: string + id: + description: Unique message identifier + type: string + message: + allOf: + - $ref: '#/definitions/api.MessageContent' + description: Message content + modified_at: + type: integer + order_id: + description: Used for subscriptions + type: string + reactions: + allOf: + - $ref: '#/definitions/api.Reactions' + description: Reactions to the message + reply_to_message_id: + description: Identifier for the message being replied to + type: string + type: object api.Detail: properties: details: @@ -50,11 +93,33 @@ definitions: type: type: string type: object + api.IdentityList: + properties: + ids: + description: List of user IDs + items: + type: string + type: array + type: object api.Layout: properties: style: type: string type: object + api.MessageContent: + properties: + marks: + description: List of marks applied to the text + items: + type: string + type: array + style: + description: The style/type of the message part + type: string + text: + description: The text content of the message part + type: string + type: object api.NotFoundError: properties: error: @@ -127,6 +192,14 @@ definitions: example: ot-page type: string type: object + api.Reactions: + properties: + reactions: + additionalProperties: + $ref: '#/definitions/api.IdentityList' + description: Map of emoji to list of user IDs + type: object + type: object api.ServerError: properties: error: @@ -182,6 +255,9 @@ definitions: widgets_id: example: bafyreialj7pceh53mifm5dixlho47ke4qjmsn2uh4wsjf7xq2pnlo5xfva type: string + workspace_object_id: + example: bafyreiapey2g6e6za4zfxvlgwdy4hbbfu676gmwrhnqvjbxvrchr7elr3y + type: string type: object api.SpaceMember: properties: @@ -460,7 +536,7 @@ paths: consumes: - application/json parameters: - - description: The Id of the space + - description: The ID of the space in: path name: space_id required: true @@ -700,6 +776,172 @@ paths: summary: Update an existing object in a specific space tags: - space_objects + /v1/spaces/{space_id}/chat/messages: + get: + consumes: + - application/json + parameters: + - description: The ID of the space + in: path + name: space_id + required: true + type: string + produces: + - application/json + responses: + "200": + description: List of chat messages + schema: + additionalProperties: + items: + $ref: '#/definitions/api.ChatMessage' + type: array + type: object + "502": + description: Internal server error + schema: + $ref: '#/definitions/api.ServerError' + summary: Retrieve last chat messages + tags: + - chat + post: + consumes: + - application/json + parameters: + - description: The ID of the space + in: path + name: space_id + required: true + type: string + - description: Chat message + in: body + name: message + required: true + schema: + $ref: '#/definitions/api.ChatMessage' + produces: + - application/json + responses: + "201": + description: Created chat message + schema: + $ref: '#/definitions/api.ChatMessage' + "400": + description: Invalid input + schema: + $ref: '#/definitions/api.ValidationError' + "502": + description: Internal server error + schema: + $ref: '#/definitions/api.ServerError' + summary: Add a new chat message + tags: + - chat + /v1/spaces/{space_id}/chat/messages/{message_id}: + delete: + consumes: + - application/json + parameters: + - description: The ID of the space + in: path + name: space_id + required: true + type: string + - description: Message ID + in: path + name: message_id + required: true + type: string + produces: + - application/json + responses: + "204": + description: Message deleted successfully + "404": + description: Message not found + schema: + $ref: '#/definitions/api.NotFoundError' + "502": + description: Internal server error + schema: + $ref: '#/definitions/api.ServerError' + summary: Delete a chat message + tags: + - chat + get: + consumes: + - application/json + parameters: + - description: The ID of the space + in: path + name: space_id + required: true + type: string + - description: Message ID + in: path + name: message_id + required: true + type: string + produces: + - application/json + responses: + "200": + description: Chat message + schema: + $ref: '#/definitions/api.ChatMessage' + "404": + description: Message not found + schema: + $ref: '#/definitions/api.NotFoundError' + "502": + description: Internal server error + schema: + $ref: '#/definitions/api.ServerError' + summary: Retrieve a specific chat message + tags: + - chat + put: + consumes: + - application/json + parameters: + - description: The ID of the space + in: path + name: space_id + required: true + type: string + - description: Message ID + in: path + name: message_id + required: true + type: string + - description: Chat message + in: body + name: message + required: true + schema: + $ref: '#/definitions/api.ChatMessage' + produces: + - application/json + responses: + "200": + description: Updated chat message + schema: + $ref: '#/definitions/api.ChatMessage' + "400": + description: Invalid input + schema: + $ref: '#/definitions/api.ValidationError' + "404": + description: Message not found + schema: + $ref: '#/definitions/api.NotFoundError' + "502": + description: Internal server error + schema: + $ref: '#/definitions/api.ServerError' + summary: Update an existing chat message + tags: + - chat securityDefinitions: BasicAuth: type: basic diff --git a/cmd/api/handlers.go b/cmd/api/handlers.go index ae0d18aa7..837d1c0f6 100644 --- a/cmd/api/handlers.go +++ b/cmd/api/handlers.go @@ -5,6 +5,7 @@ import ( "crypto/rand" "math/big" "net/http" + "time" "github.com/gin-gonic/gin" "github.com/gogo/protobuf/types" @@ -15,6 +16,11 @@ import ( "github.com/anyproto/anytype-heart/util/pbtypes" ) +const ( + httpTimeout = 1 * time.Second + paginationLimit = 100 +) + type CreateSpaceRequest struct { Name string `json:"name"` } @@ -27,6 +33,11 @@ type CreateObjectRequest struct { WithChat bool `json:"with_chat"` } +type AddMessageRequest struct { + Text string `json:"text"` + Style string `json:"style"` +} + // authdisplayCodeHandler generates a new challenge and returns the challenge Id // // @Summary Open a modal window with a code in Anytype Desktop app @@ -121,15 +132,7 @@ func (a *ApiServer) getSpacesHandler(c *gin.Context) { spaces := make([]Space, 0, len(resp.Records)) for _, record := range resp.Records { spaceId := record.Fields["targetSpaceId"].GetStringValue() - workspaceResponse := a.mw.WorkspaceOpen(context.Background(), &pb.RpcWorkspaceOpenRequest{ - SpaceId: spaceId, - WithChat: true, - }) - - if workspaceResponse.Error.Code != pb.RpcWorkspaceOpenResponseError_NULL { - c.JSON(http.StatusInternalServerError, gin.H{"message": "Failed to open workspace."}) - return - } + workspace := a.getWorkspaceInfo(c, spaceId) // TODO cleanup image logic // Convert space image or option to base64 string @@ -153,24 +156,9 @@ func (a *ApiServer) getSpacesHandler(c *gin.Context) { } } - space := Space{ - Type: "space", - Id: spaceId, - Name: record.Fields["name"].GetStringValue(), - Icon: iconBase64, - HomeObjectId: record.Fields["spaceDashboardId"].GetStringValue(), - ArchiveObjectId: workspaceResponse.Info.ArchiveObjectId, - ProfileObjectId: workspaceResponse.Info.ProfileObjectId, - MarketplaceWorkspaceId: workspaceResponse.Info.MarketplaceWorkspaceId, - DeviceId: workspaceResponse.Info.DeviceId, - AccountSpaceId: workspaceResponse.Info.AccountSpaceId, - WidgetsId: workspaceResponse.Info.WidgetsId, - SpaceViewId: workspaceResponse.Info.SpaceViewId, - TechSpaceId: a.accountInfo.TechSpaceId, - Timezone: workspaceResponse.Info.TimeZone, - NetworkId: workspaceResponse.Info.NetworkId, - } - spaces = append(spaces, space) + workspace.Name = record.Fields["name"].GetStringValue() + workspace.Icon = iconBase64 + spaces = append(spaces, workspace) } c.JSON(http.StatusOK, gin.H{"spaces": spaces}) @@ -767,3 +755,171 @@ func (a *ApiServer) getObjectsHandler(c *gin.Context) { c.JSON(http.StatusOK, gin.H{"objects": searchResults}) } + +// getChatMessagesHandler retrieves last chat messages +// +// @Summary Retrieve last chat messages +// @Tags chat +// @Accept json +// @Produce json +// @Param space_id path string true "The ID of the space" +// @Success 200 {object} map[string][]ChatMessage "List of chat messages" +// @Failure 502 {object} ServerError "Internal server error" +// @Router /v1/spaces/{space_id}/chat/messages [get] +func (a *ApiServer) getChatMessagesHandler(c *gin.Context) { + spaceId := c.Param("space_id") + chatId := a.getChatIdForSpace(c, spaceId) + + lastMessages := a.mw.ChatSubscribeLastMessages(context.Background(), &pb.RpcChatSubscribeLastMessagesRequest{ + ChatObjectId: chatId, + Limit: paginationLimit, + }) + + if lastMessages.Error.Code != pb.RpcChatSubscribeLastMessagesResponseError_NULL { + c.JSON(http.StatusInternalServerError, gin.H{"message": "Failed to retrieve last messages."}) + } + + messages := make([]ChatMessage, 0, len(lastMessages.Messages)) + for _, message := range lastMessages.Messages { + + attachments := make([]Attachment, 0, len(message.Attachments)) + for _, attachment := range message.Attachments { + target := attachment.Target + if attachment.Type != model.ChatMessageAttachment_LINK { + target = a.getGatewayURL(attachment.Target) + } + attachments = append(attachments, Attachment{ + Target: target, + Type: model.ChatMessageAttachmentAttachmentType_name[int32(attachment.Type)], + }) + } + + messages = append(messages, ChatMessage{ + Type: "chat_message", + Id: message.Id, + Creator: message.Creator, + CreatedAt: message.CreatedAt, + ReplyToMessageId: message.ReplyToMessageId, + Message: MessageContent{ + Text: message.Message.Text, + // TODO: params + // Style: nil, + // Marks: nil, + }, + Attachments: attachments, + Reactions: Reactions{ + ReactionsMap: func() map[string]IdentityList { + reactionsMap := make(map[string]IdentityList) + for emoji, ids := range message.Reactions.Reactions { + reactionsMap[emoji] = IdentityList{Ids: ids.Ids} + } + return reactionsMap + }(), + }, + }) + } + + c.JSON(http.StatusOK, gin.H{"messages": messages}) +} + +// getChatMessageHandler retrieves a specific chat message by message_id +// +// @Summary Retrieve a specific chat message +// @Tags chat +// @Accept json +// @Produce json +// @Param space_id path string true "The ID of the space" +// @Param message_id path string true "Message ID" +// @Success 200 {object} ChatMessage "Chat message" +// @Failure 404 {object} NotFoundError "Message not found" +// @Failure 502 {object} ServerError "Internal server error" +// @Router /v1/spaces/{space_id}/chat/messages/{message_id} [get] +func (a *ApiServer) getChatMessageHandler(c *gin.Context) { + // TODO: Implement logic to retrieve a specific chat message by message_id + + c.JSON(http.StatusNotImplemented, gin.H{"message": "Not implemented yet"}) +} + +// addChatMessageHandler adds a new chat message to chat +// +// @Summary Add a new chat message +// @Tags chat +// @Accept json +// @Produce json +// @Param space_id path string true "The ID of the space" +// @Param message body ChatMessage true "Chat message" +// @Success 201 {object} ChatMessage "Created chat message" +// @Failure 400 {object} ValidationError "Invalid input" +// @Failure 502 {object} ServerError "Internal server error" +// @Router /v1/spaces/{space_id}/chat/messages [post] +func (a *ApiServer) addChatMessageHandler(c *gin.Context) { + spaceId := c.Param("space_id") + + request := AddMessageRequest{} + if err := c.BindJSON(&request); err != nil { + c.JSON(http.StatusBadRequest, gin.H{"message": "Invalid JSON"}) + return + } + + chatId := a.getChatIdForSpace(c, spaceId) + resp := a.mw.ChatAddMessage(context.Background(), &pb.RpcChatAddMessageRequest{ + ChatObjectId: chatId, + Message: &model.ChatMessage{ + Id: "", + OrderId: "", + Creator: "", + CreatedAt: 0, + ModifiedAt: 0, + ReplyToMessageId: "", + Message: &model.ChatMessageMessageContent{ + Text: request.Text, + // TODO: param + // Style: request.Style, + }, + }, + }) + + if resp.Error.Code != pb.RpcChatAddMessageResponseError_NULL { + c.JSON(http.StatusInternalServerError, gin.H{"message": "Failed to create message."}) + } + + c.JSON(http.StatusOK, gin.H{"messageId": resp.MessageId}) +} + +// updateChatMessageHandler updates an existing chat message by message_id +// +// @Summary Update an existing chat message +// @Tags chat +// @Accept json +// @Produce json +// @Param space_id path string true "The ID of the space" +// @Param message_id path string true "Message ID" +// @Param message body ChatMessage true "Chat message" +// @Success 200 {object} ChatMessage "Updated chat message" +// @Failure 400 {object} ValidationError "Invalid input" +// @Failure 404 {object} NotFoundError "Message not found" +// @Failure 502 {object} ServerError "Internal server error" +// @Router /v1/spaces/{space_id}/chat/messages/{message_id} [put] +func (a *ApiServer) updateChatMessageHandler(c *gin.Context) { + // TODO: Implement logic to update an existing chat message by message_id + + c.JSON(http.StatusNotImplemented, gin.H{"message": "Not implemented yet"}) +} + +// deleteChatMessageHandler deletes a chat message by message_id +// +// @Summary Delete a chat message +// @Tags chat +// @Accept json +// @Produce json +// @Param space_id path string true "The ID of the space" +// @Param message_id path string true "Message ID" +// @Success 204 "Message deleted successfully" +// @Failure 404 {object} NotFoundError "Message not found" +// @Failure 502 {object} ServerError "Internal server error" +// @Router /v1/spaces/{space_id}/chat/messages/{message_id} [delete] +func (a *ApiServer) deleteChatMessageHandler(c *gin.Context) { + // TODO: Implement logic to delete a chat message by message_id + + c.JSON(http.StatusNotImplemented, gin.H{"message": "Not implemented yet"}) +} diff --git a/cmd/api/helper.go b/cmd/api/helper.go index a91ebfef7..171f71d54 100644 --- a/cmd/api/helper.go +++ b/cmd/api/helper.go @@ -8,6 +8,8 @@ import ( "net/http" "strings" + "github.com/gin-gonic/gin" + "github.com/anyproto/anytype-heart/pb" "github.com/anyproto/anytype-heart/pkg/lib/bundle" "github.com/anyproto/anytype-heart/pkg/lib/pb/model" @@ -92,9 +94,8 @@ func (a *ApiServer) imageToBase64(imagePath string) (string, error) { return encoded, nil } -// Determine gateway port based on the current process ID -func (a *ApiServer) getGatewayURL(icon string) string { - return fmt.Sprintf("%s/image/%s?width=100", a.accountInfo.GatewayUrl, icon) +func (a *ApiServer) getGatewayURL(objectId string) string { + return fmt.Sprintf("%s/image/%s", a.accountInfo.GatewayUrl, objectId) } func (a *ApiServer) resolveTypeToName(spaceId string, typeId string) (string, *pb.RpcObjectSearchResponseError) { @@ -126,3 +127,53 @@ func (a *ApiServer) resolveTypeToName(spaceId string, typeId string) (string, *p return resp.Records[0].Fields["name"].GetStringValue(), nil } + +func (a *ApiServer) getChatIdForSpace(c *gin.Context, spaceId string) string { + workspace := a.getWorkspaceInfo(c, spaceId) + + resp := a.mw.ObjectOpen(context.Background(), &pb.RpcObjectOpenRequest{ + SpaceId: spaceId, + ObjectId: workspace.WorkspaceObjectId, + }) + + if resp.Error.Code != pb.RpcObjectOpenResponseError_NULL { + c.JSON(http.StatusInternalServerError, gin.H{"message": "Failed to open workspace object."}) + return "" + } + + if !resp.ObjectView.Details[0].Details.Fields["hasChat"].GetBoolValue() { + c.JSON(http.StatusNotFound, gin.H{"message": "Chat not found"}) + return "" + } + + return resp.ObjectView.Details[0].Details.Fields["chatId"].GetStringValue() +} + +func (a *ApiServer) getWorkspaceInfo(c *gin.Context, spaceId string) Space { + workspaceResponse := a.mw.WorkspaceOpen(context.Background(), &pb.RpcWorkspaceOpenRequest{ + SpaceId: spaceId, + WithChat: true, + }) + + if workspaceResponse.Error.Code != pb.RpcWorkspaceOpenResponseError_NULL { + c.JSON(http.StatusInternalServerError, gin.H{"message": "Failed to open workspace."}) + return Space{} + } + + return Space{ + Type: "space", + Id: spaceId, + HomeObjectId: workspaceResponse.Info.HomeObjectId, + ArchiveObjectId: workspaceResponse.Info.ArchiveObjectId, + ProfileObjectId: workspaceResponse.Info.ProfileObjectId, + MarketplaceWorkspaceId: workspaceResponse.Info.MarketplaceWorkspaceId, + WorkspaceObjectId: workspaceResponse.Info.WorkspaceObjectId, + DeviceId: workspaceResponse.Info.DeviceId, + AccountSpaceId: workspaceResponse.Info.AccountSpaceId, + WidgetsId: workspaceResponse.Info.WidgetsId, + SpaceViewId: workspaceResponse.Info.SpaceViewId, + TechSpaceId: workspaceResponse.Info.TechSpaceId, + Timezone: workspaceResponse.Info.TimeZone, + NetworkId: workspaceResponse.Info.NetworkId, + } +} diff --git a/cmd/api/main.go b/cmd/api/main.go index 449e15ca2..f780ee13b 100644 --- a/cmd/api/main.go +++ b/cmd/api/main.go @@ -19,7 +19,6 @@ import ( const ( httpPort = ":31009" - httpTimeout = 1 * time.Second serverShutdownTime = 5 * time.Second ) @@ -110,6 +109,18 @@ func RunApiServer(ctx context.Context, mw service.ClientCommandsServer, mwIntern readWrite.PUT("/spaces/:space_id/objects/:object_id", a.updateObjectHandler) } + // Chat routes + chat := a.router.Group("/v1/spaces/:space_id/chat") + // chat.Use(a.AuthMiddleware()) + // chat.Use(a.PermissionMiddleware("read-write")) + { + chat.GET("/messages", a.getChatMessagesHandler) + chat.GET("/messages/:message_id", a.getChatMessageHandler) + chat.POST("/messages", a.addChatMessageHandler) + chat.PUT("/messages/:message_id", a.updateChatMessageHandler) + chat.DELETE("/messages/:message_id", a.deleteChatMessageHandler) + } + // Start the HTTP server go func() { if err := a.server.ListenAndServe(); err != nil && err != http.ErrServerClosed { diff --git a/cmd/api/schemas.go b/cmd/api/schemas.go index 816a171ba..e83a6cbe5 100644 --- a/cmd/api/schemas.go +++ b/cmd/api/schemas.go @@ -9,6 +9,7 @@ type Space struct { ArchiveObjectId string `json:"archive_object_id" example:"bafyreialsgoyflf3etjm3parzurivyaukzivwortf32b4twnlwpwocsrri"` ProfileObjectId string `json:"profile_object_id" example:"bafyreiaxhwreshjqwndpwtdsu4mtihaqhhmlygqnyqpfyfwlqfq3rm3gw4"` MarketplaceWorkspaceId string `json:"marketplace_workspace_id" example:"_anytype_marketplace"` + WorkspaceObjectId string `json:"workspace_object_id" example:"bafyreiapey2g6e6za4zfxvlgwdy4hbbfu676gmwrhnqvjbxvrchr7elr3y"` DeviceId string `json:"device_id" example:"12D3KooWGZMJ4kQVyQVXaj7gJPZr3RZ2nvd9M2Eq2pprEoPih9WF"` AccountSpaceId string `json:"account_space_id" example:"bafyreihpd2knon5wbljhtfeg3fcqtg3i2pomhhnigui6lrjmzcjzep7gcy.23me69r569oi1"` WidgetsId string `json:"widgets_id" example:"bafyreialj7pceh53mifm5dixlho47ke4qjmsn2uh4wsjf7xq2pnlo5xfva"` @@ -101,6 +102,38 @@ type ObjectTemplate struct { IconEmoji string `json:"icon_emoji" example:"📄"` } +type ChatMessage struct { + Type string `json:"chat_message"` + Id string `json:"id"` // Unique message identifier + OrderId string `json:"order_id"` // Used for subscriptions + Creator string `json:"creator"` // Identifier for the message creator + CreatedAt int64 `json:"created_at"` + ModifiedAt int64 `json:"modified_at"` + ReplyToMessageId string `json:"reply_to_message_id"` // Identifier for the message being replied to + Message MessageContent `json:"message"` // Message content + Attachments []Attachment `json:"attachments"` // Attachments slice + Reactions Reactions `json:"reactions"` // Reactions to the message +} + +type MessageContent struct { + Text string `json:"text"` // The text content of the message part + Style string `json:"style"` // The style/type of the message part + Marks []string `json:"marks"` // List of marks applied to the text +} + +type Attachment struct { + Target string `json:"target"` // Identifier for the attachment object + Type string `json:"type"` // Type of attachment +} + +type Reactions struct { + ReactionsMap map[string]IdentityList `json:"reactions"` // Map of emoji to list of user IDs +} + +type IdentityList struct { + Ids []string `json:"ids"` // List of user IDs +} + type ServerError struct { Error struct { Message string `json:"message"` From ba984b8d91700888f82ca48632855b57a1e17649 Mon Sep 17 00:00:00 2001 From: Jannis Metrikat <120120832+jmetrikat@users.noreply.github.com> Date: Thu, 28 Nov 2024 13:50:00 +0100 Subject: [PATCH 034/195] GO-4459 Rework media responses, fix filter, introduce limits --- cmd/api/handlers.go | 68 +++++++++++++++++++++------------------------ cmd/api/helper.go | 8 ++++-- 2 files changed, 38 insertions(+), 38 deletions(-) diff --git a/cmd/api/handlers.go b/cmd/api/handlers.go index 837d1c0f6..8d5b130f1 100644 --- a/cmd/api/handlers.go +++ b/cmd/api/handlers.go @@ -5,6 +5,8 @@ import ( "crypto/rand" "math/big" "net/http" + "sort" + "strconv" "time" "github.com/gin-gonic/gin" @@ -116,6 +118,11 @@ func (a *ApiServer) getSpacesHandler(c *gin.Context) { Condition: model.BlockContentDataviewFilter_Equal, Value: pbtypes.Int64(int64(model.SpaceStatus_Ok)), }, + { + RelationKey: bundle.RelationKeySpaceRemoteStatus.String(), + Condition: model.BlockContentDataviewFilter_Equal, + Value: pbtypes.Int64(int64(model.SpaceStatus_Ok)), + }, }, Sorts: []*model.BlockContentDataviewSort{ { @@ -133,31 +140,14 @@ func (a *ApiServer) getSpacesHandler(c *gin.Context) { for _, record := range resp.Records { spaceId := record.Fields["targetSpaceId"].GetStringValue() workspace := a.getWorkspaceInfo(c, spaceId) + workspace.Name = record.Fields["name"].GetStringValue() - // TODO cleanup image logic - // Convert space image or option to base64 string - var iconBase64 string + // Set space icon to gateway URL iconImageId := record.Fields["iconImage"].GetStringValue() if iconImageId != "" { - b64, err2 := a.imageToBase64(a.getGatewayURL(iconImageId)) - if err2 != nil { - c.JSON(http.StatusInternalServerError, gin.H{"message": "Failed to convert image to base64."}) - return - } - iconBase64 = b64 - } else { - iconOption := record.Fields["iconOption"].GetNumberValue() - // TODO figure out size - // Prevent index out of range error for space with empty name - if len(record.Fields["name"].GetStringValue()) > 0 { - iconBase64 = a.spaceSvg(int(iconOption), 100, string([]rune(record.Fields["name"].GetStringValue())[0])) - } else { - iconBase64 = a.spaceSvg(int(iconOption), 100, "") - } + workspace.Icon = a.getGatewayURLForMedia(iconImageId, true) } - workspace.Name = record.Fields["name"].GetStringValue() - workspace.Icon = iconBase64 spaces = append(spaces, workspace) } @@ -251,35 +241,28 @@ func (a *ApiServer) getSpaceMembersHandler(c *gin.Context) { members := make([]SpaceMember, 0, len(resp.Records)) for _, record := range resp.Records { - // Convert iconImage to base64 string - iconImageId := record.Fields["iconImage"].GetStringValue() - iconBase64 := "" - if iconImageId != "" { - b64, err2 := a.imageToBase64(a.getGatewayURL(iconImageId)) - if err2 != nil { - c.JSON(http.StatusInternalServerError, gin.H{"message": "Failed to convert image to base64."}) - return - } - iconBase64 = b64 - } - member := SpaceMember{ Type: "space_member", Id: record.Fields["id"].GetStringValue(), Name: record.Fields["name"].GetStringValue(), - Icon: iconBase64, Identity: record.Fields["identity"].GetStringValue(), GlobalName: record.Fields["globalName"].GetStringValue(), Role: model.ParticipantPermissions_name[int32(record.Fields["participantPermissions"].GetNumberValue())], } + // Set member icon to gateway URL + iconImageId := record.Fields["iconImage"].GetStringValue() + if iconImageId != "" { + member.Icon = a.getGatewayURLForMedia(iconImageId, true) + } + members = append(members, member) } c.JSON(http.StatusOK, gin.H{"members": members}) } -// getSpaceHandler retrieves objects in a specific space +// getSpaceObjectsHandler retrieves objects in a specific space // // @Summary Retrieve objects in a specific space // @Tags space_objects @@ -645,7 +628,12 @@ func (a *ApiServer) getObjectsHandler(c *gin.Context) { objectType := c.Query("object_type") // TODO: implement offset and limit // offset := c.DefaultQuery("offset", "0") - // limit := c.DefaultQuery("limit", "100") + l := c.DefaultQuery("limit", "100") + limit, err := strconv.Atoi(l) + if err != nil { + c.JSON(http.StatusInternalServerError, gin.H{"message": "Failed to parse limit."}) + return + } // First, call ObjectSearch for all objects of type spaceView resp := a.mw.ObjectSearch(context.Background(), &pb.RpcObjectSearchRequest{ @@ -753,6 +741,14 @@ func (a *ApiServer) getObjectsHandler(c *gin.Context) { } } + // Sort search results by lastModifiedDate and return the first `limit` results + sort.Slice(searchResults, func(i, j int) bool { + return searchResults[i].Details[0].Details["lastModifiedDate"].(float64) > searchResults[j].Details[0].Details["lastModifiedDate"].(float64) + }) + if len(searchResults) > limit { + searchResults = searchResults[:limit] + } + c.JSON(http.StatusOK, gin.H{"objects": searchResults}) } @@ -786,7 +782,7 @@ func (a *ApiServer) getChatMessagesHandler(c *gin.Context) { for _, attachment := range message.Attachments { target := attachment.Target if attachment.Type != model.ChatMessageAttachment_LINK { - target = a.getGatewayURL(attachment.Target) + target = a.getGatewayURLForMedia(attachment.Target, false) } attachments = append(attachments, Attachment{ Target: target, diff --git a/cmd/api/helper.go b/cmd/api/helper.go index 171f71d54..795406fb5 100644 --- a/cmd/api/helper.go +++ b/cmd/api/helper.go @@ -94,8 +94,12 @@ func (a *ApiServer) imageToBase64(imagePath string) (string, error) { return encoded, nil } -func (a *ApiServer) getGatewayURL(objectId string) string { - return fmt.Sprintf("%s/image/%s", a.accountInfo.GatewayUrl, objectId) +func (a *ApiServer) getGatewayURLForMedia(objectId string, isIcon bool) string { + widthParam := "" + if isIcon { + widthParam = "?width=100" + } + return fmt.Sprintf("%s/image/%s%s", a.accountInfo.GatewayUrl, objectId, widthParam) } func (a *ApiServer) resolveTypeToName(spaceId string, typeId string) (string, *pb.RpcObjectSearchResponseError) { From e5fd45bba5947c561713935351a73612cbb86e23 Mon Sep 17 00:00:00 2001 From: Jannis Metrikat <120120832+jmetrikat@users.noreply.github.com> Date: Thu, 28 Nov 2024 15:18:50 +0100 Subject: [PATCH 035/195] GO-4459 Investigate object search performance --- cmd/api/handlers.go | 15 ++++----------- 1 file changed, 4 insertions(+), 11 deletions(-) diff --git a/cmd/api/handlers.go b/cmd/api/handlers.go index 8d5b130f1..e9786598d 100644 --- a/cmd/api/handlers.go +++ b/cmd/api/handlers.go @@ -5,7 +5,6 @@ import ( "crypto/rand" "math/big" "net/http" - "sort" "strconv" "time" @@ -677,14 +676,10 @@ func (a *ApiServer) getObjectsHandler(c *gin.Context) { Condition: model.BlockContentDataviewFilter_NotEqual, Value: pbtypes.Bool(true), }, - { - RelationKey: bundle.RelationKeyName.String(), - Condition: model.BlockContentDataviewFilter_Like, - Value: pbtypes.String(searchTerm), - }, } if searchTerm != "" { + // TODO also include snippet for notes filters = append(filters, &model.BlockContentDataviewFilter{ RelationKey: bundle.RelationKeyName.String(), Condition: model.BlockContentDataviewFilter_Like, @@ -710,8 +705,10 @@ func (a *ApiServer) getObjectsHandler(c *gin.Context) { RelationKey: bundle.RelationKeyLastModifiedDate.String(), Type: model.BlockContentDataviewSort_Desc, }}, + Keys: []string{"id", "name", "type", "layout", "iconEmoji", "lastModifiedDate"}, + Limit: 25, + // FullText: searchTerm, }) - for _, record := range objectSearchResponse.Records { objectTypeName, err := a.resolveTypeToName(spaceId, record.Fields["type"].GetStringValue()) if err != nil { @@ -741,10 +738,6 @@ func (a *ApiServer) getObjectsHandler(c *gin.Context) { } } - // Sort search results by lastModifiedDate and return the first `limit` results - sort.Slice(searchResults, func(i, j int) bool { - return searchResults[i].Details[0].Details["lastModifiedDate"].(float64) > searchResults[j].Details[0].Details["lastModifiedDate"].(float64) - }) if len(searchResults) > limit { searchResults = searchResults[:limit] } From ad821cf8679e61946f9f8f462ff9462160230536 Mon Sep 17 00:00:00 2001 From: kirillston Date: Fri, 29 Nov 2024 17:55:29 +0100 Subject: [PATCH 036/195] GO-4455 Tidy LinkPreview call --- core/linkpreview.go | 19 +++---------------- 1 file changed, 3 insertions(+), 16 deletions(-) diff --git a/core/linkpreview.go b/core/linkpreview.go index f9b045ed0..450da53f9 100644 --- a/core/linkpreview.go +++ b/core/linkpreview.go @@ -3,7 +3,6 @@ package core import ( "context" "fmt" - "strings" "time" "github.com/anyproto/anytype-heart/pb" @@ -12,7 +11,7 @@ import ( ) func (mw *Middleware) LinkPreview(cctx context.Context, req *pb.RpcLinkPreviewRequest) *pb.RpcLinkPreviewResponse { - ctx, cancel := context.WithTimeout(context.Background(), time.Second*5) + ctx, cancel := context.WithTimeout(cctx, time.Second*5) defer cancel() u, err := uri.NormalizeAndParseURI(req.Url) @@ -25,24 +24,12 @@ func (mw *Middleware) LinkPreview(cctx context.Context, req *pb.RpcLinkPreviewRe } } - if mw.applicationService.GetApp() == nil { - return &pb.RpcLinkPreviewResponse{ - Error: &pb.RpcLinkPreviewResponseError{ - Code: pb.RpcLinkPreviewResponseError_UNKNOWN_ERROR, - }, - } - } - lp := mw.applicationService.GetApp().MustComponent(linkpreview.CName).(linkpreview.LinkPreview) - data, _, _, err := lp.Fetch(ctx, u.String()) + data, _, _, err := getService[linkpreview.LinkPreview](mw).Fetch(ctx, u.String()) if err != nil { - // trim the actual url from the error - errTrimmed := strings.Replace(err.Error(), u.String(), "", -1) - errTrimmed = strings.Replace(errTrimmed, u.Hostname(), "", -1) // in case of dns errors - return &pb.RpcLinkPreviewResponse{ Error: &pb.RpcLinkPreviewResponseError{ Code: pb.RpcLinkPreviewResponseError_UNKNOWN_ERROR, - Description: errTrimmed, + Description: getErrorDescription(err), }, } } From cf7ad1fd51af871a3f58ed2c86b989b00806f56f Mon Sep 17 00:00:00 2001 From: Jannis Metrikat <120120832+jmetrikat@users.noreply.github.com> Date: Fri, 29 Nov 2024 19:29:03 +0100 Subject: [PATCH 037/195] GO-4459 Only return active space members --- cmd/api/handlers.go | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/cmd/api/handlers.go b/cmd/api/handlers.go index e9786598d..075d9e6c2 100644 --- a/cmd/api/handlers.go +++ b/cmd/api/handlers.go @@ -224,6 +224,11 @@ func (a *ApiServer) getSpaceMembersHandler(c *gin.Context) { Condition: model.BlockContentDataviewFilter_Equal, Value: pbtypes.Int64(int64(model.ObjectType_participant)), }, + { + RelationKey: bundle.RelationKeyParticipantStatus.String(), + Condition: model.BlockContentDataviewFilter_Equal, + Value: pbtypes.Int64(int64(model.ParticipantStatus_Active)), + }, }, Sorts: []*model.BlockContentDataviewSort{ { From 9ffb2d510f81177c045c80ddf95154a58463eef4 Mon Sep 17 00:00:00 2001 From: Jannis Metrikat <120120832+jmetrikat@users.noreply.github.com> Date: Sun, 1 Dec 2024 15:54:51 +0100 Subject: [PATCH 038/195] GO-4459 Remove unused func and clean up handlers --- cmd/api/demo/api_demo.go | 13 ++++--- cmd/api/handlers.go | 23 +++++++++--- cmd/api/helper.go | 80 ---------------------------------------- 3 files changed, 25 insertions(+), 91 deletions(-) diff --git a/cmd/api/demo/api_demo.go b/cmd/api/demo/api_demo.go index f413f82e8..603a948d4 100644 --- a/cmd/api/demo/api_demo.go +++ b/cmd/api/demo/api_demo.go @@ -13,10 +13,11 @@ import ( ) const ( - baseURL = "http://localhost:31009/v1" - testSpaceId = "bafyreifymx5ucm3fdc7vupfg7wakdo5qelni3jvlmawlnvjcppurn2b3di.2lcu0r85yg10d" // dev (entry space) - testObjectId = "bafyreidhtlbbspxecab6xf4pi5zyxcmvwy6lqzursbjouq5fxovh6y3xwu" // "Work Faster with Templates" - testTypeId = "bafyreie3djy4mcldt3hgeet6bnjay2iajdyi2fvx556n6wcxii7brlni3i" // Page (in dev space) + baseURL = "http://localhost:31009/v1" + // testSpaceId = "bafyreifymx5ucm3fdc7vupfg7wakdo5qelni3jvlmawlnvjcppurn2b3di.2lcu0r85yg10d" // dev (entry space) + // testSpaceId = "bafyreiakofsfkgb7psju346cir2hit5hinhywaybi6vhp7hx4jw7hkngje.scoxzd7vu6rz" // HPI + // testObjectId = "bafyreidhtlbbspxecab6xf4pi5zyxcmvwy6lqzursbjouq5fxovh6y3xwu" // "Work Faster with Templates" + // testTypeId = "bafyreie3djy4mcldt3hgeet6bnjay2iajdyi2fvx556n6wcxii7brlni3i" // Page (in dev space) // chatSpaceId = "bafyreigryvrmerbtfswwz5kav2uq5dlvx3hl45kxn4nflg7lz46lneqs7m.2nvj2qik6ctdy" // Anytype Wiki space chatSpaceId = "bafyreiexhpzaf7uxzheubh7cjeusqukjnxfvvhh4at6bygljwvto2dttnm.2lcu0r85yg10d" // chat space ) @@ -54,7 +55,7 @@ func main() { // spaces // {"POST", "/spaces", nil, map[string]interface{}{"name": "New Space"}}, // {"GET", "/spaces?limit={limit}&offset={offset}", map[string]interface{}{"limit": 100, "offset": 0}, nil}, - // {"GET", "/spaces/{space_id}/members", map[string]interface{}{"space_id": testSpaceId}, nil}, + // {"GET", "/spaces/{space_id}/members", map[string]interface{}{"space_id": testSpaceId}, nil}, // space_objects // {"GET", "/spaces/{space_id}/objects", map[string]interface{}{"space_id": testSpaceId, "limit": 100, "offset": 0}, nil}, @@ -70,7 +71,7 @@ func main() { // {"GET", "/objects?search={search}&object_type={object_type}&limit={limit}&offset={offset}", map[string]interface{}{"search": "writing", "object_type": testTypeId, "limit": 100, "offset": 0}, nil}, // chat - // {"GET", "/spaces/{space_id}/chat/messages?limit={limit}&offset={offset}", map[string]interface{}{"space_id": chatSpaceId, "limit": 100, "offset": 0}, nil}, + {"GET", "/spaces/{space_id}/chat/messages?limit={limit}&offset={offset}", map[string]interface{}{"space_id": chatSpaceId, "limit": 100, "offset": 0}, nil}, // {"POST", "/spaces/{space_id}/chat/messages", map[string]interface{}{"space_id": chatSpaceId}, map[string]interface{}{"text": "new message from demo"}}, } diff --git a/cmd/api/handlers.go b/cmd/api/handlers.go index 075d9e6c2..2e39c1868 100644 --- a/cmd/api/handlers.go +++ b/cmd/api/handlers.go @@ -6,7 +6,6 @@ import ( "math/big" "net/http" "strconv" - "time" "github.com/gin-gonic/gin" "github.com/gogo/protobuf/types" @@ -18,7 +17,6 @@ import ( ) const ( - httpTimeout = 1 * time.Second paginationLimit = 100 ) @@ -188,7 +186,7 @@ func (a *ApiServer) createSpaceHandler(c *gin.Context) { }}, }, }, - UseCase: 1, + UseCase: pb.RpcObjectImportUseCaseRequest_GET_STARTED, WithChat: true, }) @@ -284,7 +282,12 @@ func (a *ApiServer) getSpaceObjectsHandler(c *gin.Context) { spaceId := c.Param("space_id") // TODO: implement offset and limit // offset, _ := strconv.Atoi(c.DefaultQuery("offset", "0")) - // limit, _ := strconv.Atoi(c.DefaultQuery("limit", "100")) + l := c.DefaultQuery("limit", "100") + limit, err := strconv.Atoi(l) + if err != nil { + c.JSON(http.StatusBadRequest, gin.H{"message": "Invalid limit value"}) + return + } resp := a.mw.ObjectSearch(context.Background(), &pb.RpcObjectSearchRequest{ SpaceId: spaceId, @@ -301,6 +304,12 @@ func (a *ApiServer) getSpaceObjectsHandler(c *gin.Context) { }...), }, }, + Sorts: []*model.BlockContentDataviewSort{{ + RelationKey: bundle.RelationKeyLastModifiedDate.String(), + Type: model.BlockContentDataviewSort_Desc, + }}, + Keys: []string{"id", "name", "type", "layout", "iconEmoji", "lastModifiedDate"}, + Limit: int32(limit), }) if resp.Error.Code != pb.RpcObjectSearchResponseError_NULL { @@ -340,6 +349,10 @@ func (a *ApiServer) getSpaceObjectsHandler(c *gin.Context) { objects = append(objects, object) } + if len(objects) > limit { + objects = objects[:limit] + } + c.JSON(http.StatusOK, gin.H{"objects": objects}) } @@ -813,7 +826,7 @@ func (a *ApiServer) getChatMessagesHandler(c *gin.Context) { }) } - c.JSON(http.StatusOK, gin.H{"messages": messages}) + c.JSON(http.StatusOK, gin.H{"chatId": chatId, "messages": messages}) } // getChatMessageHandler retrieves a specific chat message by message_id diff --git a/cmd/api/helper.go b/cmd/api/helper.go index 795406fb5..4f1402b0f 100644 --- a/cmd/api/helper.go +++ b/cmd/api/helper.go @@ -2,9 +2,7 @@ package api import ( "context" - "encoding/base64" "fmt" - "io" "net/http" "strings" @@ -16,84 +14,6 @@ import ( "github.com/anyproto/anytype-heart/util/pbtypes" ) -type IconSpace struct { - Text string - Bg map[string]string - List []string -} - -var iconSpace = IconSpace{ - Text: "#fff", - Bg: map[string]string{ - "grey": "#949494", - "yellow": "#ecd91b", - "orange": "#ffb522", - "red": "#f55522", - "pink": "#e51ca0", - "purple": "#ab50cc", - "blue": "#3e58eb", - "ice": "#2aa7ee", - "teal": "#0fc8ba", - "lime": "#5dd400", - }, - List: []string{"grey", "yellow", "orange", "red", "pink", "purple", "blue", "ice", "teal", "lime"}, -} - -func (a *ApiServer) spaceSvg(option int, size int, iconName string) string { - if option < 1 || option > len(iconSpace.List) { - return "" - } - bgColor := iconSpace.Bg[iconSpace.List[option-1]] - - fontWeight := func(size int) string { - if size > 50 { - return "bold" - } - return "normal" - } - - fontSize := func(size int) int { - return size / 2 - } - - text := fmt.Sprintf(`%s`, - iconSpace.Text, fontWeight(size), fontSize(size), iconName) - - svg := fmt.Sprintf(` - - - %s - `, size, size, size, size, size, size, bgColor, text) - - return "data:image/svg+xml;base64," + base64.StdEncoding.EncodeToString([]byte(svg)) -} - -func validateURL(url string) string { - if !strings.HasPrefix(url, "http://") && !strings.HasPrefix(url, "https://") { - return "" - } - return url -} - -func (a *ApiServer) imageToBase64(imagePath string) (string, error) { - client := &http.Client{ - Timeout: httpTimeout, - } - resp, err := client.Get(validateURL(imagePath)) - if err != nil { - // don't return error if image is not found - return "", nil - } - defer resp.Body.Close() - - fileBytes, err := io.ReadAll(resp.Body) - if err != nil { - return "", err - } - encoded := base64.StdEncoding.EncodeToString(fileBytes) - return encoded, nil -} - func (a *ApiServer) getGatewayURLForMedia(objectId string, isIcon bool) string { widthParam := "" if isIcon { From c54e66ebc0e4a665dd06358250d6ddead5cee870 Mon Sep 17 00:00:00 2001 From: Jannis Metrikat <120120832+jmetrikat@users.noreply.github.com> Date: Mon, 2 Dec 2024 20:07:06 +0100 Subject: [PATCH 039/195] GO-4459 Fix the sort after lastModifiedDate for object search --- cmd/api/handlers.go | 35 ++++++++++++++++++++++++----------- cmd/api/main.go | 2 +- 2 files changed, 25 insertions(+), 12 deletions(-) diff --git a/cmd/api/handlers.go b/cmd/api/handlers.go index 2e39c1868..b8c281651 100644 --- a/cmd/api/handlers.go +++ b/cmd/api/handlers.go @@ -17,7 +17,9 @@ import ( ) const ( - paginationLimit = 100 + paginationLimit = "100" + paginationLimitPerSpace = 10 + paginationLimitPerChat = 100 ) type CreateSpaceRequest struct { @@ -264,7 +266,7 @@ func (a *ApiServer) getSpaceMembersHandler(c *gin.Context) { c.JSON(http.StatusOK, gin.H{"members": members}) } -// getSpaceObjectsHandler retrieves objects in a specific space +// getObjectsForSpaceHandler retrieves objects in a specific space // // @Summary Retrieve objects in a specific space // @Tags space_objects @@ -278,11 +280,11 @@ func (a *ApiServer) getSpaceMembersHandler(c *gin.Context) { // @Failure 404 {object} NotFoundError "Resource not found" // @Failure 502 {object} ServerError "Internal server error" // @Router /spaces/{space_id}/objects [get] -func (a *ApiServer) getSpaceObjectsHandler(c *gin.Context) { +func (a *ApiServer) getObjectsForSpaceHandler(c *gin.Context) { spaceId := c.Param("space_id") // TODO: implement offset and limit // offset, _ := strconv.Atoi(c.DefaultQuery("offset", "0")) - l := c.DefaultQuery("limit", "100") + l := c.DefaultQuery("limit", paginationLimit) limit, err := strconv.Atoi(l) if err != nil { c.JSON(http.StatusBadRequest, gin.H{"message": "Invalid limit value"}) @@ -305,8 +307,11 @@ func (a *ApiServer) getSpaceObjectsHandler(c *gin.Context) { }, }, Sorts: []*model.BlockContentDataviewSort{{ - RelationKey: bundle.RelationKeyLastModifiedDate.String(), - Type: model.BlockContentDataviewSort_Desc, + RelationKey: bundle.RelationKeyLastModifiedDate.String(), + Type: model.BlockContentDataviewSort_Desc, + Format: model.RelationFormat_longtext, + IncludeTime: true, + EmptyPlacement: model.BlockContentDataviewSort_NotSpecified, }}, Keys: []string{"id", "name", "type", "layout", "iconEmoji", "lastModifiedDate"}, Limit: int32(limit), @@ -645,7 +650,7 @@ func (a *ApiServer) getObjectsHandler(c *gin.Context) { objectType := c.Query("object_type") // TODO: implement offset and limit // offset := c.DefaultQuery("offset", "0") - l := c.DefaultQuery("limit", "100") + l := c.DefaultQuery("limit", paginationLimit) limit, err := strconv.Atoi(l) if err != nil { c.JSON(http.StatusInternalServerError, gin.H{"message": "Failed to parse limit."}) @@ -666,6 +671,11 @@ func (a *ApiServer) getObjectsHandler(c *gin.Context) { Condition: model.BlockContentDataviewFilter_Equal, Value: pbtypes.Int64(int64(model.SpaceStatus_Ok)), }, + { + RelationKey: bundle.RelationKeySpaceRemoteStatus.String(), + Condition: model.BlockContentDataviewFilter_Equal, + Value: pbtypes.Int64(int64(model.SpaceStatus_Ok)), + }, }, }) if resp.Error.Code != pb.RpcObjectSearchResponseError_NULL { @@ -720,11 +730,14 @@ func (a *ApiServer) getObjectsHandler(c *gin.Context) { SpaceId: spaceId, Filters: filters, Sorts: []*model.BlockContentDataviewSort{{ - RelationKey: bundle.RelationKeyLastModifiedDate.String(), - Type: model.BlockContentDataviewSort_Desc, + RelationKey: bundle.RelationKeyLastModifiedDate.String(), + Type: model.BlockContentDataviewSort_Desc, + Format: model.RelationFormat_longtext, + IncludeTime: true, + EmptyPlacement: model.BlockContentDataviewSort_NotSpecified, }}, Keys: []string{"id", "name", "type", "layout", "iconEmoji", "lastModifiedDate"}, - Limit: 25, + Limit: paginationLimitPerSpace, // FullText: searchTerm, }) for _, record := range objectSearchResponse.Records { @@ -779,7 +792,7 @@ func (a *ApiServer) getChatMessagesHandler(c *gin.Context) { lastMessages := a.mw.ChatSubscribeLastMessages(context.Background(), &pb.RpcChatSubscribeLastMessagesRequest{ ChatObjectId: chatId, - Limit: paginationLimit, + Limit: paginationLimitPerChat, }) if lastMessages.Error.Code != pb.RpcChatSubscribeLastMessagesResponseError_NULL { diff --git a/cmd/api/main.go b/cmd/api/main.go index f780ee13b..aa4622e09 100644 --- a/cmd/api/main.go +++ b/cmd/api/main.go @@ -92,7 +92,7 @@ func RunApiServer(ctx context.Context, mw service.ClientCommandsServer, mwIntern { readOnly.GET("/spaces", a.getSpacesHandler) readOnly.GET("/spaces/:space_id/members", a.getSpaceMembersHandler) - readOnly.GET("/spaces/:space_id/objects", a.getSpaceObjectsHandler) + readOnly.GET("/spaces/:space_id/objects", a.getObjectsForSpaceHandler) readOnly.GET("/spaces/:space_id/objects/:object_id", a.getObjectHandler) readOnly.GET("/spaces/:space_id/objectTypes", a.getObjectTypesHandler) readOnly.GET("/spaces/:space_id/objectTypes/:typeId/templates", a.getObjectTypeTemplatesHandler) From 1fce139e26553efb3f1ecce9c136d8abceb881fd Mon Sep 17 00:00:00 2001 From: Jannis Metrikat <120120832+jmetrikat@users.noreply.github.com> Date: Mon, 2 Dec 2024 20:41:59 +0100 Subject: [PATCH 040/195] GO-4459 Re-sort elements for consistency in across-spaces search --- cmd/api/handlers.go | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/cmd/api/handlers.go b/cmd/api/handlers.go index b8c281651..7ebeb01a2 100644 --- a/cmd/api/handlers.go +++ b/cmd/api/handlers.go @@ -5,6 +5,7 @@ import ( "crypto/rand" "math/big" "net/http" + "sort" "strconv" "github.com/gin-gonic/gin" @@ -769,6 +770,11 @@ func (a *ApiServer) getObjectsHandler(c *gin.Context) { } } + // sort after lastModifiedDate to achieve descending sort order across all spaces + sort.Slice(searchResults, func(i, j int) bool { + return searchResults[i].Details[0].Details["lastModifiedDate"].(float64) > searchResults[j].Details[0].Details["lastModifiedDate"].(float64) + }) + if len(searchResults) > limit { searchResults = searchResults[:limit] } From 807426c615d8d5aabd692c2d0eb3fde99bc0776d Mon Sep 17 00:00:00 2001 From: Jannis Metrikat <120120832+jmetrikat@users.noreply.github.com> Date: Sun, 8 Dec 2024 16:42:53 +0100 Subject: [PATCH 041/195] GO-4459 Add offset based pagination --- cmd/api/docs/docs.go | 13 +++++++ cmd/api/docs/swagger.json | 13 +++++++ cmd/api/docs/swagger.yaml | 10 +++++ cmd/api/handlers.go | 79 ++++++++++++++++++++++----------------- cmd/api/main.go | 26 +++++++++---- go.mod | 22 ++++++----- go.sum | 49 ++++++++++++++---------- 7 files changed, 141 insertions(+), 71 deletions(-) diff --git a/cmd/api/docs/docs.go b/cmd/api/docs/docs.go index cd5d79547..8dfd1f0fc 100644 --- a/cmd/api/docs/docs.go +++ b/cmd/api/docs/docs.go @@ -289,6 +289,19 @@ const docTemplate = `{ "name": "space_id", "in": "path", "required": true + }, + { + "type": "integer", + "description": "The number of items to skip before starting to collect the result set", + "name": "offset", + "in": "query" + }, + { + "type": "integer", + "default": 100, + "description": "The number of items to return", + "name": "limit", + "in": "query" } ], "responses": { diff --git a/cmd/api/docs/swagger.json b/cmd/api/docs/swagger.json index fb0a5f041..13435cd56 100644 --- a/cmd/api/docs/swagger.json +++ b/cmd/api/docs/swagger.json @@ -283,6 +283,19 @@ "name": "space_id", "in": "path", "required": true + }, + { + "type": "integer", + "description": "The number of items to skip before starting to collect the result set", + "name": "offset", + "in": "query" + }, + { + "type": "integer", + "default": 100, + "description": "The number of items to return", + "name": "limit", + "in": "query" } ], "responses": { diff --git a/cmd/api/docs/swagger.yaml b/cmd/api/docs/swagger.yaml index 44f40e8ee..a8706efde 100644 --- a/cmd/api/docs/swagger.yaml +++ b/cmd/api/docs/swagger.yaml @@ -505,6 +505,16 @@ paths: name: space_id required: true type: string + - description: The number of items to skip before starting to collect the result + set + in: query + name: offset + type: integer + - default: 100 + description: The number of items to return + in: query + name: limit + type: integer produces: - application/json responses: diff --git a/cmd/api/handlers.go b/cmd/api/handlers.go index 7ebeb01a2..6c9b01b3c 100644 --- a/cmd/api/handlers.go +++ b/cmd/api/handlers.go @@ -6,7 +6,6 @@ import ( "math/big" "net/http" "sort" - "strconv" "github.com/gin-gonic/gin" "github.com/gogo/protobuf/types" @@ -17,12 +16,6 @@ import ( "github.com/anyproto/anytype-heart/util/pbtypes" ) -const ( - paginationLimit = "100" - paginationLimitPerSpace = 10 - paginationLimitPerChat = 100 -) - type CreateSpaceRequest struct { Name string `json:"name"` } @@ -104,7 +97,10 @@ func (a *ApiServer) authTokenHandler(c *gin.Context) { // @Failure 502 {object} ServerError "Internal server error" // @Router /spaces [get] func (a *ApiServer) getSpacesHandler(c *gin.Context) { - // Call ObjectSearch for all objects of type spaceView + offset := c.GetInt("offset") + limit := c.GetInt("limit") + + // Call ObjectSearch for all objects of type spaceView with pagination resp := a.mw.ObjectSearch(context.Background(), &pb.RpcObjectSearchRequest{ SpaceId: a.accountInfo.TechSpaceId, Filters: []*model.BlockContentDataviewFilter{ @@ -130,7 +126,10 @@ func (a *ApiServer) getSpacesHandler(c *gin.Context) { Type: model.BlockContentDataviewSort_Asc, }, }, + Offset: int32(offset), + Limit: int32(limit), }) + if resp.Error.Code != pb.RpcObjectSearchResponseError_NULL { c.JSON(http.StatusInternalServerError, gin.H{"message": "Failed to retrieve list of spaces."}) return @@ -166,7 +165,6 @@ func (a *ApiServer) getSpacesHandler(c *gin.Context) { // @Failure 502 {object} ServerError "Internal server error" // @Router /spaces [post] func (a *ApiServer) createSpaceHandler(c *gin.Context) { - // Create new workspace with a random icon and import default usecase nameRequest := CreateSpaceRequest{} if err := c.BindJSON(&nameRequest); err != nil { c.JSON(http.StatusBadRequest, gin.H{"message": "Invalid JSON"}) @@ -179,6 +177,7 @@ func (a *ApiServer) createSpaceHandler(c *gin.Context) { return } + // Create new workspace with a random icon and import default use case resp := a.mw.WorkspaceCreate(context.Background(), &pb.RpcWorkspaceCreateRequest{ Details: &types.Struct{ Fields: map[string]*types.Value{ @@ -208,15 +207,19 @@ func (a *ApiServer) createSpaceHandler(c *gin.Context) { // @Accept json // @Produce json // @Param space_id path string true "The ID of the space" +// @Param offset query int false "The number of items to skip before starting to collect the result set" +// @Param limit query int false "The number of items to return" default(100) // @Success 200 {object} map[string][]SpaceMember "List of members" // @Failure 403 {object} UnauthorizedError "Unauthorized" // @Failure 404 {object} NotFoundError "Resource not found" // @Failure 502 {object} ServerError "Internal server error" // @Router /spaces/{space_id}/members [get] func (a *ApiServer) getSpaceMembersHandler(c *gin.Context) { - // Call ObjectSearch for all objects of type participant spaceId := c.Param("space_id") + offset := c.GetInt("offset") + limit := c.GetInt("limit") + // Call ObjectSearch for all objects of type participant resp := a.mw.ObjectSearch(context.Background(), &pb.RpcObjectSearchRequest{ SpaceId: spaceId, Filters: []*model.BlockContentDataviewFilter{ @@ -237,6 +240,8 @@ func (a *ApiServer) getSpaceMembersHandler(c *gin.Context) { Type: model.BlockContentDataviewSort_Asc, }, }, + Offset: int32(offset), + Limit: int32(limit), }) if resp.Error.Code != pb.RpcObjectSearchResponseError_NULL { @@ -283,14 +288,8 @@ func (a *ApiServer) getSpaceMembersHandler(c *gin.Context) { // @Router /spaces/{space_id}/objects [get] func (a *ApiServer) getObjectsForSpaceHandler(c *gin.Context) { spaceId := c.Param("space_id") - // TODO: implement offset and limit - // offset, _ := strconv.Atoi(c.DefaultQuery("offset", "0")) - l := c.DefaultQuery("limit", paginationLimit) - limit, err := strconv.Atoi(l) - if err != nil { - c.JSON(http.StatusBadRequest, gin.H{"message": "Invalid limit value"}) - return - } + offset := c.GetInt("offset") + limit := c.GetInt("limit") resp := a.mw.ObjectSearch(context.Background(), &pb.RpcObjectSearchRequest{ SpaceId: spaceId, @@ -314,8 +313,9 @@ func (a *ApiServer) getObjectsForSpaceHandler(c *gin.Context) { IncludeTime: true, EmptyPlacement: model.BlockContentDataviewSort_NotSpecified, }}, - Keys: []string{"id", "name", "type", "layout", "iconEmoji", "lastModifiedDate"}, - Limit: int32(limit), + Keys: []string{"id", "name", "type", "layout", "iconEmoji", "lastModifiedDate"}, + Offset: int32(offset), + Limit: int32(limit), }) if resp.Error.Code != pb.RpcObjectSearchResponseError_NULL { @@ -506,6 +506,8 @@ func (a *ApiServer) updateObjectHandler(c *gin.Context) { // @Router /spaces/{space_id}/objectTypes [get] func (a *ApiServer) getObjectTypesHandler(c *gin.Context) { spaceId := c.Param("space_id") + offset := c.GetInt("offset") + limit := c.GetInt("limit") resp := a.mw.ObjectSearch(context.Background(), &pb.RpcObjectSearchRequest{ SpaceId: spaceId, @@ -527,6 +529,8 @@ func (a *ApiServer) getObjectTypesHandler(c *gin.Context) { Type: model.BlockContentDataviewSort_Asc, }, }, + Offset: int32(offset), + Limit: int32(limit), }) if resp.Error.Code != pb.RpcObjectSearchResponseError_NULL { @@ -556,6 +560,8 @@ func (a *ApiServer) getObjectTypesHandler(c *gin.Context) { // @Produce json // @Param space_id path string true "The ID of the space" // @Param typeId path string true "The ID of the object type" +// @Param offset query int false "The number of items to skip before starting to collect the result set" +// @Param limit query int false "The number of items to return" default(100) // @Success 200 {object} map[string][]ObjectTemplate "List of templates" // @Failure 403 {object} UnauthorizedError "Unauthorized" // @Failure 404 {object} NotFoundError "Resource not found" @@ -564,6 +570,8 @@ func (a *ApiServer) getObjectTypesHandler(c *gin.Context) { func (a *ApiServer) getObjectTypeTemplatesHandler(c *gin.Context) { spaceId := c.Param("space_id") typeId := c.Param("typeId") + offset := c.GetInt("offset") + limit := c.GetInt("limit") // First, determine the type Id of "ot-template" in the space templateTypeIdResp := a.mw.ObjectSearch(context.Background(), &pb.RpcObjectSearchRequest{ @@ -594,6 +602,8 @@ func (a *ApiServer) getObjectTypeTemplatesHandler(c *gin.Context) { Value: pbtypes.String(templateTypeId), }, }, + Offset: int32(offset), + Limit: int32(limit), }) if templateObjectsResp.Error.Code != pb.RpcObjectSearchResponseError_NULL { @@ -649,14 +659,8 @@ func (a *ApiServer) getObjectTypeTemplatesHandler(c *gin.Context) { func (a *ApiServer) getObjectsHandler(c *gin.Context) { searchTerm := c.Query("search") objectType := c.Query("object_type") - // TODO: implement offset and limit - // offset := c.DefaultQuery("offset", "0") - l := c.DefaultQuery("limit", paginationLimit) - limit, err := strconv.Atoi(l) - if err != nil { - c.JSON(http.StatusInternalServerError, gin.H{"message": "Failed to parse limit."}) - return - } + offset := c.GetInt("offset") + limit := c.GetInt("limit") // First, call ObjectSearch for all objects of type spaceView resp := a.mw.ObjectSearch(context.Background(), &pb.RpcObjectSearchRequest{ @@ -679,6 +683,7 @@ func (a *ApiServer) getObjectsHandler(c *gin.Context) { }, }, }) + if resp.Error.Code != pb.RpcObjectSearchResponseError_NULL { c.JSON(http.StatusInternalServerError, gin.H{"message": "Failed to retrieve list of spaces."}) return @@ -737,8 +742,11 @@ func (a *ApiServer) getObjectsHandler(c *gin.Context) { IncludeTime: true, EmptyPlacement: model.BlockContentDataviewSort_NotSpecified, }}, - Keys: []string{"id", "name", "type", "layout", "iconEmoji", "lastModifiedDate"}, - Limit: paginationLimitPerSpace, + Keys: []string{"id", "name", "type", "layout", "iconEmoji", "lastModifiedDate"}, + Offset: int32(offset), + Limit: int32(limit), + // TODO split limit between spaces + // Limit: paginationLimitPerSpace, // FullText: searchTerm, }) for _, record := range objectSearchResponse.Records { @@ -775,10 +783,6 @@ func (a *ApiServer) getObjectsHandler(c *gin.Context) { return searchResults[i].Details[0].Details["lastModifiedDate"].(float64) > searchResults[j].Details[0].Details["lastModifiedDate"].(float64) }) - if len(searchResults) > limit { - searchResults = searchResults[:limit] - } - c.JSON(http.StatusOK, gin.H{"objects": searchResults}) } @@ -789,16 +793,21 @@ func (a *ApiServer) getObjectsHandler(c *gin.Context) { // @Accept json // @Produce json // @Param space_id path string true "The ID of the space" +// @Param offset query int false "The number of items to skip before starting to collect the result set" +// @Param limit query int false "The number of items to return" default(100) // @Success 200 {object} map[string][]ChatMessage "List of chat messages" // @Failure 502 {object} ServerError "Internal server error" // @Router /v1/spaces/{space_id}/chat/messages [get] func (a *ApiServer) getChatMessagesHandler(c *gin.Context) { spaceId := c.Param("space_id") chatId := a.getChatIdForSpace(c, spaceId) + // TODO: implement offset + // offset := c.GetInt("offset") + limit := c.GetInt("limit") lastMessages := a.mw.ChatSubscribeLastMessages(context.Background(), &pb.RpcChatSubscribeLastMessagesRequest{ ChatObjectId: chatId, - Limit: paginationLimitPerChat, + Limit: int32(limit), }) if lastMessages.Error.Code != pb.RpcChatSubscribeLastMessagesResponseError_NULL { diff --git a/cmd/api/main.go b/cmd/api/main.go index aa4622e09..f36081873 100644 --- a/cmd/api/main.go +++ b/cmd/api/main.go @@ -11,6 +11,8 @@ import ( swaggerFiles "github.com/swaggo/files" ginSwagger "github.com/swaggo/gin-swagger" + "github.com/webstradev/gin-pagination/v2/pkg/pagination" + _ "github.com/anyproto/anytype-heart/cmd/api/docs" "github.com/anyproto/anytype-heart/core" "github.com/anyproto/anytype-heart/pb/service" @@ -75,6 +77,16 @@ func RunApiServer(ctx context.Context, mw service.ClientCommandsServer, mwIntern a := newApiServer(mw, mwInternal) a.router.Use(a.initAccountInfo()) + // Initialize pagination middleware + paginator := pagination.New( + pagination.WithPageText("offset"), + pagination.WithSizeText("limit"), + pagination.WithDefaultPage(0), + pagination.WithDefaultPageSize(100), + pagination.WithMinPageSize(1), + pagination.WithMaxPageSize(1000), + ) + // Swagger route a.router.GET("/swagger/*any", ginSwagger.WrapHandler(swaggerFiles.Handler)) @@ -90,13 +102,13 @@ func RunApiServer(ctx context.Context, mw service.ClientCommandsServer, mwIntern // readOnly.Use(a.AuthMiddleware()) // readOnly.Use(a.PermissionMiddleware("read-only")) { - readOnly.GET("/spaces", a.getSpacesHandler) - readOnly.GET("/spaces/:space_id/members", a.getSpaceMembersHandler) - readOnly.GET("/spaces/:space_id/objects", a.getObjectsForSpaceHandler) + readOnly.GET("/spaces", paginator, a.getSpacesHandler) + readOnly.GET("/spaces/:space_id/members", paginator, a.getSpaceMembersHandler) + readOnly.GET("/spaces/:space_id/objects", paginator, a.getObjectsForSpaceHandler) readOnly.GET("/spaces/:space_id/objects/:object_id", a.getObjectHandler) - readOnly.GET("/spaces/:space_id/objectTypes", a.getObjectTypesHandler) - readOnly.GET("/spaces/:space_id/objectTypes/:typeId/templates", a.getObjectTypeTemplatesHandler) - readOnly.GET("/objects", a.getObjectsHandler) + readOnly.GET("/spaces/:space_id/objectTypes", paginator, a.getObjectTypesHandler) + readOnly.GET("/spaces/:space_id/objectTypes/:typeId/templates", paginator, a.getObjectTypeTemplatesHandler) + readOnly.GET("/objects", paginator, a.getObjectsHandler) } // Read-write routes @@ -114,7 +126,7 @@ func RunApiServer(ctx context.Context, mw service.ClientCommandsServer, mwIntern // chat.Use(a.AuthMiddleware()) // chat.Use(a.PermissionMiddleware("read-write")) { - chat.GET("/messages", a.getChatMessagesHandler) + chat.GET("/messages", paginator, a.getChatMessagesHandler) chat.GET("/messages/:message_id", a.getChatMessageHandler) chat.POST("/messages", a.addChatMessageHandler) chat.PUT("/messages/:message_id", a.updateChatMessageHandler) diff --git a/go.mod b/go.mod index 7df76eb7e..2ff4e802d 100644 --- a/go.mod +++ b/go.mod @@ -27,7 +27,7 @@ require ( github.com/dsoprea/go-exif/v3 v3.0.1 github.com/dsoprea/go-jpeg-image-structure/v2 v2.0.0-20221012074422-4f3f7e934102 github.com/ethereum/go-ethereum v1.13.15 - github.com/gin-gonic/gin v1.9.0 + github.com/gin-gonic/gin v1.10.0 github.com/globalsign/mgo v0.0.0-20181015135952-eeefdecb41b8 github.com/go-chi/chi/v5 v5.1.0 github.com/go-shiori/go-readability v0.0.0-20241012063810-92284fa8a71f @@ -95,6 +95,7 @@ require ( github.com/uber/jaeger-client-go v2.30.0+incompatible github.com/valyala/fastjson v1.6.4 github.com/vektra/mockery/v2 v2.47.0 + github.com/webstradev/gin-pagination/v2 v2.0.2 github.com/xeipuuv/gojsonschema v1.2.0 github.com/yuin/goldmark v1.7.8 github.com/zeebo/blake3 v0.2.4 @@ -137,12 +138,14 @@ require ( github.com/btcsuite/btcd/btcec/v2 v2.2.0 // indirect github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1 // indirect github.com/btcsuite/btcutil v1.0.3-0.20201208143702-a53e38424cce // indirect - github.com/bytedance/sonic v1.8.0 // indirect + github.com/bytedance/sonic v1.12.3 // indirect + github.com/bytedance/sonic/loader v0.2.0 // indirect github.com/cenkalti/backoff/v4 v4.3.0 // indirect github.com/cespare/xxhash v1.1.0 // indirect github.com/cespare/xxhash/v2 v2.3.0 // indirect - github.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311 // indirect github.com/chigopher/pathlib v0.19.1 // indirect + github.com/cloudwego/base64x v0.1.4 // indirect + github.com/cloudwego/iasm v0.2.0 // indirect github.com/crackcomm/go-gitignore v0.0.0-20241020182519-7843d2ba8fdf // indirect github.com/davidlazar/go-crypto v0.0.0-20200604182044-b73af7476f6c // indirect github.com/decred/dcrd/dcrec/secp256k1/v4 v4.3.0 // indirect @@ -158,6 +161,7 @@ require ( github.com/flopp/go-findfont v0.1.0 // indirect github.com/fogleman/gg v1.3.0 // indirect github.com/fsnotify/fsnotify v1.6.0 // indirect + github.com/gabriel-vasile/mimetype v1.4.6 // indirect github.com/gin-contrib/sse v0.1.0 // indirect github.com/go-errors/errors v1.4.2 // indirect github.com/go-logr/logr v1.4.2 // indirect @@ -169,12 +173,12 @@ require ( github.com/go-openapi/swag v0.19.15 // indirect github.com/go-playground/locales v0.14.1 // indirect github.com/go-playground/universal-translator v0.18.1 // indirect - github.com/go-playground/validator/v10 v10.11.2 // indirect + github.com/go-playground/validator/v10 v10.22.1 // indirect github.com/go-shiori/dom v0.0.0-20230515143342-73569d674e1c // indirect github.com/go-task/slim-sprig/v3 v3.0.0 // indirect github.com/go-xmlfmt/xmlfmt v0.0.0-20191208150333-d5b6f63a941b // indirect github.com/gobwas/glob v0.2.3 // indirect - github.com/goccy/go-json v0.10.2 // indirect + github.com/goccy/go-json v0.10.3 // indirect github.com/gogo/googleapis v1.3.1 // indirect github.com/gogs/chardet v0.0.0-20211120154057-b7413eaefb8f // indirect github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 // indirect @@ -209,7 +213,7 @@ require ( github.com/josharian/intern v1.0.0 // indirect github.com/json-iterator/go v1.1.12 // indirect github.com/klauspost/cpuid/v2 v2.2.8 // indirect - github.com/leodido/go-urn v1.2.1 // indirect + github.com/leodido/go-urn v1.4.0 // indirect github.com/libp2p/go-buffer-pool v0.1.0 // indirect github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 // indirect github.com/mailru/easyjson v0.7.6 // indirect @@ -232,7 +236,7 @@ require ( github.com/mwitkow/go-proto-validators v0.3.2 // indirect github.com/ncruces/go-strftime v0.1.9 // indirect github.com/onsi/ginkgo/v2 v2.20.2 // indirect - github.com/pelletier/go-toml/v2 v2.0.6 // indirect + github.com/pelletier/go-toml/v2 v2.2.3 // indirect github.com/petermattis/goid v0.0.0-20240813172612-4fcff4a6cae7 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect github.com/polydawn/refmt v0.89.0 // indirect @@ -262,7 +266,7 @@ require ( github.com/twitchyliquid64/golang-asm v0.15.1 // indirect github.com/tyler-smith/go-bip39 v1.1.0 // indirect github.com/uber/jaeger-lib v2.4.1+incompatible // indirect - github.com/ugorji/go/codec v1.2.9 // indirect + github.com/ugorji/go/codec v1.2.12 // indirect github.com/whyrusleeping/chunker v0.0.0-20181014151217-fe64bd25879f // indirect github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f // indirect github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 // indirect @@ -272,7 +276,7 @@ require ( go.opentelemetry.io/otel v1.32.0 // indirect go.opentelemetry.io/otel/metric v1.32.0 // indirect go.opentelemetry.io/otel/trace v1.32.0 // indirect - golang.org/x/arch v0.0.0-20210923205945-b76863e36670 // indirect + golang.org/x/arch v0.11.0 // indirect golang.org/x/crypto v0.29.0 // indirect golang.org/x/mod v0.22.0 // indirect golang.org/x/sync v0.9.0 // indirect diff --git a/go.sum b/go.sum index 779008d97..336358393 100644 --- a/go.sum +++ b/go.sum @@ -153,9 +153,11 @@ github.com/btcsuite/goleveldb v0.0.0-20160330041536-7834afc9e8cd/go.mod h1:F+uVa github.com/btcsuite/snappy-go v0.0.0-20151229074030-0bdef8d06723/go.mod h1:8woku9dyThutzjeg+3xrA5iCpBRH8XEEg3lh6TiUghc= github.com/btcsuite/websocket v0.0.0-20150119174127-31079b680792/go.mod h1:ghJtEyQwv5/p4Mg4C0fgbePVuGr935/5ddU9Z3TmDRY= github.com/btcsuite/winsvc v1.0.0/go.mod h1:jsenWakMcC0zFBFurPLEAyrnc/teJEM1O46fmI40EZs= -github.com/bytedance/sonic v1.5.0/go.mod h1:ED5hyg4y6t3/9Ku1R6dU/4KyJ48DZ4jPhfY1O2AihPM= -github.com/bytedance/sonic v1.8.0 h1:ea0Xadu+sHlu7x5O3gKhRpQ1IKiMrSiHttPF0ybECuA= -github.com/bytedance/sonic v1.8.0/go.mod h1:i736AoUSYt75HyZLoJW9ERYxcy6eaN6h4BZXU064P/U= +github.com/bytedance/sonic v1.12.3 h1:W2MGa7RCU1QTeYRTPE3+88mVC0yXmsRQRChiyVocVjU= +github.com/bytedance/sonic v1.12.3/go.mod h1:B8Gt/XvtZ3Fqj+iSKMypzymZxw/FVwgIGKzMzT9r/rk= +github.com/bytedance/sonic/loader v0.1.1/go.mod h1:ncP89zfokxS5LZrJxl5z0UJcsk4M4yY2JpfqGeCtNLU= +github.com/bytedance/sonic/loader v0.2.0 h1:zNprn+lsIP06C/IqCHs3gPQIvnvpKbbxyXQP1iU4kWM= +github.com/bytedance/sonic/loader v0.2.0/go.mod h1:ncP89zfokxS5LZrJxl5z0UJcsk4M4yY2JpfqGeCtNLU= github.com/casbin/casbin/v2 v2.1.2/go.mod h1:YcPU1XXisHhLzuxH9coDNf2FbKpjGlbCg3n9yuLkIJQ= github.com/cenkalti/backoff v2.2.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM= github.com/cenkalti/backoff/v4 v4.1.1/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw= @@ -173,9 +175,6 @@ github.com/cheggaaa/mb v1.0.3 h1:03ksWum+6kHclB+kjwKMaBtgl5gtNYUwNpxsHQciKe8= github.com/cheggaaa/mb v1.0.3/go.mod h1:NUl0GBtFLlfg2o6iZwxzcG7Lslc2wV/ADTFbLXtVPE4= github.com/cheggaaa/mb/v3 v3.0.2 h1:jd1Xx0zzihZlXL6HmnRXVCI1BHuXz/kY+VzX9WbvNDU= github.com/cheggaaa/mb/v3 v3.0.2/go.mod h1:zCt2QeYukhd/g0bIdNqF+b/kKz1hnLFNDkP49qN5kqI= -github.com/chenzhuoyu/base64x v0.0.0-20211019084208-fb5309c8db06/go.mod h1:DH46F32mSOjUmXrMHnKwZdA8wcEefY7UVqBKYGjpdQY= -github.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311 h1:qSGYFH7+jGhDF8vLC+iwCD4WpbV1EBDSzWkJODFLams= -github.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311/go.mod h1:b583jCggY9gE99b6G5LEC39OIiVsWj+R97kbl5odCEk= github.com/chigopher/pathlib v0.19.1 h1:RoLlUJc0CqBGwq239cilyhxPNLXTK+HXoASGyGznx5A= github.com/chigopher/pathlib v0.19.1/go.mod h1:tzC1dZLW8o33UQpWkNkhvPwL5n4yyFRFm/jL1YGWFvY= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= @@ -183,6 +182,10 @@ github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5P github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= github.com/clbanning/x2j v0.0.0-20191024224557-825249438eec/go.mod h1:jMjuTZXRI4dUb/I5gc9Hdhagfvm9+RyrPryS/auMzxE= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= +github.com/cloudwego/base64x v0.1.4 h1:jwCgWpFanWmN8xoIUHa2rtzmkd5J2plF/dnLS6Xd/0Y= +github.com/cloudwego/base64x v0.1.4/go.mod h1:0zlkT4Wn5C6NdauXdJRhSKRlJvmclQ1hhJgA0rcu/8w= +github.com/cloudwego/iasm v0.2.0 h1:1KNIy1I1H9hNNFEEH3DVnI4UujN+1zjpuk6gwHLTssg= +github.com/cloudwego/iasm v0.2.0/go.mod h1:8rXZaNYT2n95jn+zTI1sDr+IgcD2GVs0nlbbQPiEFhY= github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= @@ -285,14 +288,16 @@ github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7z github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY= github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw= +github.com/gabriel-vasile/mimetype v1.4.6 h1:3+PzJTKLkvgjeTbts6msPJt4DixhT4YtFNf1gtGe3zc= +github.com/gabriel-vasile/mimetype v1.4.6/go.mod h1:JX1qVKqZd40hUPpAfiNTe0Sne7hdfKSbOqqmkq8GCXc= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/gin-contrib/gzip v0.0.6 h1:NjcunTcGAj5CO1gn4N8jHOSIeRFHIbn51z6K+xaN4d4= github.com/gin-contrib/gzip v0.0.6/go.mod h1:QOJlmV2xmayAjkNS2Y8NQsMneuRShOU/kjovCXNuzzk= github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE= github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI= github.com/gin-gonic/gin v1.6.3/go.mod h1:75u5sXoLsGZoRN5Sgbi1eraJ4GU3++wFwWzhwvtwp4M= -github.com/gin-gonic/gin v1.9.0 h1:OjyFBKICoexlu99ctXNR2gg+c5pKrKMuyjgARg9qeY8= -github.com/gin-gonic/gin v1.9.0/go.mod h1:W1Me9+hsUSyj3CePGrd1/QrKJMSJ1Tu/0hFEH89961k= +github.com/gin-gonic/gin v1.10.0 h1:nTuyha1TYqgedzytsKYqna+DfLos46nTv2ygFy86HFU= +github.com/gin-gonic/gin v1.10.0/go.mod h1:4PMNQiOhvDRa013RKVbsiNwoyezlm2rm0uX/T7kzp5Y= github.com/globalsign/mgo v0.0.0-20181015135952-eeefdecb41b8 h1:DujepqpGd1hyOd7aW59XpK7Qymp8iy83xq74fLr21is= github.com/globalsign/mgo v0.0.0-20181015135952-eeefdecb41b8/go.mod h1:xkRDCp4j0OGD1HRkm4kmhM+pmpv3AKq5SU7GMg4oO/Q= github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= @@ -340,8 +345,8 @@ github.com/go-playground/universal-translator v0.17.0/go.mod h1:UkSxE5sNxxRwHyU+ github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJnYK9S473LQFuzCbDbfSFY= github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY= github.com/go-playground/validator/v10 v10.2.0/go.mod h1:uOYAAleCW8F/7oMFd6aG0GOhaH6EGOAJShg8Id5JGkI= -github.com/go-playground/validator/v10 v10.11.2 h1:q3SHpufmypg+erIExEKUmsgmhDTyhcJ38oeKGACXohU= -github.com/go-playground/validator/v10 v10.11.2/go.mod h1:NieE624vt4SCTJtD87arVLvdmjPAeV8BQlHtMnw9D7s= +github.com/go-playground/validator/v10 v10.22.1 h1:40JcKH+bBNGFczGuoBYgX4I6m/i27HYW8P9FDk5PbgA= +github.com/go-playground/validator/v10 v10.22.1/go.mod h1:dbuPbCMFw/DrkbEynArYaCwl3amGuJotoKCe95atGMM= github.com/go-shiori/dom v0.0.0-20230515143342-73569d674e1c h1:wpkoddUomPfHiOziHZixGO5ZBS73cKqVzZipfrLmO1w= github.com/go-shiori/dom v0.0.0-20230515143342-73569d674e1c/go.mod h1:oVDCh3qjJMLVUSILBRwrm+Bc6RNXGZYtoh9xdvf1ffM= github.com/go-shiori/go-readability v0.0.0-20241012063810-92284fa8a71f h1:cypj7SJh+47G9J3VCPdMzT3uWcXWAWDJA54ErTfOigI= @@ -363,8 +368,8 @@ github.com/gobwas/ws v1.0.2 h1:CoAavW/wd/kulfZmSIBt6p24n4j7tHgNVCjsfHVNUbo= github.com/gobwas/ws v1.0.2/go.mod h1:szmBTxLgaFppYjEmNtny/v3w89xOydFnnZMcgRRu/EM= github.com/goccy/go-graphviz v0.2.9 h1:4yD2MIMpxNt+sOEARDh5jTE2S/jeAKi92w72B83mWGg= github.com/goccy/go-graphviz v0.2.9/go.mod h1:hssjl/qbvUXGmloY81BwXt2nqoApKo7DFgDj5dLJGb8= -github.com/goccy/go-json v0.10.2 h1:CrxCmQqYDkv1z7lO7Wbh2HN93uovUHgrECaO5ZrCXAU= -github.com/goccy/go-json v0.10.2/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= +github.com/goccy/go-json v0.10.3 h1:KZ5WoDbxAIgm2HNbYckL0se1fHD6rz5j4ywS6ebzDqA= +github.com/goccy/go-json v0.10.3/go.mod h1:oq7eo15ShAhp70Anwd5lgX2pLfOS3QCiwU/PULtXL6M= github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/gogo/googleapis v0.0.0-20180223154316-0cd9801be74a/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s= github.com/gogo/googleapis v1.1.0/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s= @@ -639,6 +644,7 @@ github.com/klauspost/compress v1.17.11/go.mod h1:pMDklpSncoRMuLFrf1W9Ss9KT+0rH90 github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= github.com/klauspost/cpuid/v2 v2.2.8 h1:+StwCXwm9PdpiEkPyzBXIy+M9KUb4ODm0Zarf1kS5BM= github.com/klauspost/cpuid/v2 v2.2.8/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws= +github.com/knz/go-libedit v1.10.1/go.mod h1:MZTVkCWyz0oBc7JOWP3wNAzd002ZbM/5hgShxwh4x8M= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/koron/go-ssdp v0.0.4 h1:1IDwrghSKYM7yLf7XCzbByg2sJ/JcNOZRXS2jczTwz0= @@ -658,8 +664,8 @@ github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII= -github.com/leodido/go-urn v1.2.1 h1:BqpAaACuzVSgi/VLzGZIobT2z4v53pjosyNd9Yv6n/w= -github.com/leodido/go-urn v1.2.1/go.mod h1:zt4jvISO2HfUBqxjfIshjdMTYS56ZS/qv49ictyFfxY= +github.com/leodido/go-urn v1.4.0 h1:WT9HwE9SGECu3lg4d/dIA+jxlljEa1/ffXKmRjqdmIQ= +github.com/leodido/go-urn v1.4.0/go.mod h1:bvxc+MVxLKB4z00jd1z+Dvzr47oO32F/QSNjSBOlFxI= github.com/libp2p/go-buffer-pool v0.1.0 h1:oK4mSFcQz7cTQIfqbe4MIj9gLW+mnanjyFtc6cdF0Y8= github.com/libp2p/go-buffer-pool v0.1.0/go.mod h1:N+vh8gMqimBzdKkSMVuydVDq+UV5QTWy5HSiZacSbPg= github.com/libp2p/go-libp2p v0.37.0 h1:8K3mcZgwTldydMCNOiNi/ZJrOB9BY+GlI3UxYzxBi9A= @@ -823,8 +829,8 @@ github.com/otiai10/opengraph/v2 v2.1.0/go.mod h1:gHYa6c2GENKqbB7O6Mkqpq2Ma0Nti31 github.com/pact-foundation/pact-go v1.0.4/go.mod h1:uExwJY4kCzNPcHRj+hCR/HBbOOIwwtUjcrb0b5/5kLM= github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k= -github.com/pelletier/go-toml/v2 v2.0.6 h1:nrzqCb7j9cDFj2coyLNLaZuJTLjWjlaz6nvTvIwycIU= -github.com/pelletier/go-toml/v2 v2.0.6/go.mod h1:eumQOmlWiOPt5WriQQqoM5y18pDHwha2N+QD+EUNTek= +github.com/pelletier/go-toml/v2 v2.2.3 h1:YmeHyLY8mFWbdkNWwpr+qIL2bEqT0o95WSdkNHvL12M= +github.com/pelletier/go-toml/v2 v2.2.3/go.mod h1:MfCQTFTvCcUyyvvwm1+G6H/jORL20Xlb6rzQu9GuUkc= github.com/performancecopilot/speed v3.0.0+incompatible/go.mod h1:/CLtqpZ5gBg1M9iaPbIdPPGyKcA8hKdoy6hAWba7Yac= github.com/petermattis/goid v0.0.0-20240813172612-4fcff4a6cae7 h1:Dx7Ovyv/SFnMFw3fD4oEoeorXc6saIiQ23LrGLth0Gw= github.com/petermattis/goid v0.0.0-20240813172612-4fcff4a6cae7/go.mod h1:pxMtw7cyUw6B2bRH0ZBANSPg+AoSud1I1iyJHI69jH4= @@ -1036,8 +1042,8 @@ github.com/uber/jaeger-lib v2.4.1+incompatible h1:td4jdvLcExb4cBISKIpHuGoVXh+dVK github.com/uber/jaeger-lib v2.4.1+incompatible/go.mod h1:ComeNDZlWwrWnDv8aPp0Ba6+uUTzImX/AauajbLI56U= github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw= github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY= -github.com/ugorji/go/codec v1.2.9 h1:rmenucSohSTiyL09Y+l2OCk+FrMxGMzho2+tjr5ticU= -github.com/ugorji/go/codec v1.2.9/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZgYf6w6lg= +github.com/ugorji/go/codec v1.2.12 h1:9LC83zGrHhuUA9l16C9AHXAqEV/2wBQ4nkvumAE65EE= +github.com/ugorji/go/codec v1.2.12/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZgYf6w6lg= github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= github.com/urfave/cli v1.22.10/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= @@ -1049,6 +1055,8 @@ github.com/warpfork/go-testmark v0.12.1 h1:rMgCpJfwy1sJ50x0M0NgyphxYYPMOODIJHhsX github.com/warpfork/go-testmark v0.12.1/go.mod h1:kHwy7wfvGSPh1rQJYKayD4AbtNaeyZdcGi9tNJTaa5Y= github.com/warpfork/go-wish v0.0.0-20220906213052-39a1cc7a02d0 h1:GDDkbFiaK8jsSDJfjId/PEGEShv6ugrt4kYsC5UIDaQ= github.com/warpfork/go-wish v0.0.0-20220906213052-39a1cc7a02d0/go.mod h1:x6AKhvSSexNrVSrViXSHUEbICjmGXhtgABaHIySUSGw= +github.com/webstradev/gin-pagination/v2 v2.0.2 h1:CCbmxdvW3lJR5UJM972jlLgi6R0aU/fMyuj5CfULqz8= +github.com/webstradev/gin-pagination/v2 v2.0.2/go.mod h1:C/1SBe8wng4aKNt3+vWVaQJwi+blntO3JT/uy0LqJjE= github.com/whyrusleeping/chunker v0.0.0-20181014151217-fe64bd25879f h1:jQa4QT2UP9WYv2nzyawpKMOCl+Z/jW7djv2/J50lj9E= github.com/whyrusleeping/chunker v0.0.0-20181014151217-fe64bd25879f/go.mod h1:p9UJB6dDgdPgMJZs7UjUOdulKyRr9fqkS+6JKAInPy8= github.com/wlynxg/anet v0.0.5 h1:J3VJGi1gvo0JwZ/P1/Yc/8p63SoW98B5dHkYDmpgvvU= @@ -1124,8 +1132,8 @@ go.uber.org/zap v1.18.1/go.mod h1:xg/QME4nWcxGxrpdeYfq7UvYrLh66cuVKdrbD1XF/NI= go.uber.org/zap v1.19.1/go.mod h1:j3DNczoxDZroyBnOT1L/Q79cfUMGZxlv/9dzN7SM1rI= go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8= go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= -golang.org/x/arch v0.0.0-20210923205945-b76863e36670 h1:18EFjUmQOcUvxNYSkA6jO9VAiXCnxFY6NyDX0bHDmkU= -golang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8= +golang.org/x/arch v0.11.0 h1:KXV8WWKCXm6tRpLirl2szsO5j/oOODwZf4hATmGVNs4= +golang.org/x/arch v0.11.0/go.mod h1:FEVrYAQjsQXMVJ1nsMoVVXPZg6p2JE2mx8psSWTDQys= golang.org/x/crypto v0.0.0-20170930174604-9419663f5a44/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= @@ -1632,6 +1640,7 @@ modernc.org/token v1.1.0/go.mod h1:UGzOrNV1mAFSEB63lOFHIpNRUVMvYTc6yu1SMY/XTDM= nhooyr.io/websocket v1.8.6/go.mod h1:B70DZP8IakI65RVQ51MsWP/8jndNma26DVA/nFSCgW0= nhooyr.io/websocket v1.8.7 h1:usjR2uOr/zjjkVMy0lW+PPohFok7PCow5sDjLgX4P4g= nhooyr.io/websocket v1.8.7/go.mod h1:B70DZP8IakI65RVQ51MsWP/8jndNma26DVA/nFSCgW0= +nullprogram.com/x/optparse v1.0.0/go.mod h1:KdyPE+Igbe0jQUrVfMqDMeJQIJZEuyV7pjYmp6pbG50= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= From 1a62a1834a50b47be2efa8b968df9ef27c2e6ba6 Mon Sep 17 00:00:00 2001 From: Jannis Metrikat <120120832+jmetrikat@users.noreply.github.com> Date: Thu, 12 Dec 2024 01:06:02 +0100 Subject: [PATCH 042/195] GO-4459 Fix icon and pagination related issues --- cmd/api/demo/api_demo.go | 6 +++--- cmd/api/docs/docs.go | 26 ++++++++++++++++++++++++++ cmd/api/docs/swagger.json | 26 ++++++++++++++++++++++++++ cmd/api/docs/swagger.yaml | 20 ++++++++++++++++++++ cmd/api/handlers.go | 36 +++++++++++++++++++----------------- cmd/api/helper.go | 17 +++++++++++++++++ 6 files changed, 111 insertions(+), 20 deletions(-) diff --git a/cmd/api/demo/api_demo.go b/cmd/api/demo/api_demo.go index 603a948d4..9dfda9e41 100644 --- a/cmd/api/demo/api_demo.go +++ b/cmd/api/demo/api_demo.go @@ -55,17 +55,17 @@ func main() { // spaces // {"POST", "/spaces", nil, map[string]interface{}{"name": "New Space"}}, // {"GET", "/spaces?limit={limit}&offset={offset}", map[string]interface{}{"limit": 100, "offset": 0}, nil}, - // {"GET", "/spaces/{space_id}/members", map[string]interface{}{"space_id": testSpaceId}, nil}, + // {"GET", "/spaces/{space_id}/members?limit={limit}&offset={offset}", map[string]interface{}{"space_id": testSpaceId}, nil}, // space_objects - // {"GET", "/spaces/{space_id}/objects", map[string]interface{}{"space_id": testSpaceId, "limit": 100, "offset": 0}, nil}, + // {"GET", "/spaces/{space_id}/objects?limit={limit}&offset={offset}", map[string]interface{}{"space_id": testSpaceId, "limit": 100, "offset": 0}, nil}, // {"GET", "/spaces/{space_id}/objects/{object_id}", map[string]interface{}{"space_id": testSpaceId, "object_id": testObjectId}, nil}, // {"POST", "/spaces/{space_id}/objects", map[string]interface{}{"space_id": testSpaceId}, map[string]interface{}{"name": "New Object from demo", "icon_emoji": "💥", "template_id": "", "object_type_unique_key": "ot-page", "with_chat": false}}, // {"PUT", "/spaces/{space_id}/objects/{object_id}", map[string]interface{}{"space_id": testSpaceId, "object_id": testObjectId}, map[string]interface{}{"name": "Updated Object"}}, // types_and_templates // {"GET", "/spaces/{space_id}/objectTypes?limit={limit}&offset={offset}", map[string]interface{}{"space_id": testSpaceId, "limit": 100, "offset": 0}, nil}, - // {"GET", "/spaces/{space_id}/objectTypes/{type_id}/templates", map[string]interface{}{"space_id": testSpaceId, "type_id": testTypeId}, nil}, + // {"GET", "/spaces/{space_id}/objectTypes/{type_id}/templates?limit={limit}&offset={offset}", map[string]interface{}{"space_id": testSpaceId, "type_id": testTypeId}, nil}, // search // {"GET", "/objects?search={search}&object_type={object_type}&limit={limit}&offset={offset}", map[string]interface{}{"search": "writing", "object_type": testTypeId, "limit": 100, "offset": 0}, nil}, diff --git a/cmd/api/docs/docs.go b/cmd/api/docs/docs.go index 8dfd1f0fc..f60232516 100644 --- a/cmd/api/docs/docs.go +++ b/cmd/api/docs/docs.go @@ -429,6 +429,19 @@ const docTemplate = `{ "name": "typeId", "in": "path", "required": true + }, + { + "type": "integer", + "description": "The number of items to skip before starting to collect the result set", + "name": "offset", + "in": "query" + }, + { + "type": "integer", + "default": 100, + "description": "The number of items to return", + "name": "limit", + "in": "query" } ], "responses": { @@ -724,6 +737,19 @@ const docTemplate = `{ "name": "space_id", "in": "path", "required": true + }, + { + "type": "integer", + "description": "The number of items to skip before starting to collect the result set", + "name": "offset", + "in": "query" + }, + { + "type": "integer", + "default": 100, + "description": "The number of items to return", + "name": "limit", + "in": "query" } ], "responses": { diff --git a/cmd/api/docs/swagger.json b/cmd/api/docs/swagger.json index 13435cd56..a120e643f 100644 --- a/cmd/api/docs/swagger.json +++ b/cmd/api/docs/swagger.json @@ -423,6 +423,19 @@ "name": "typeId", "in": "path", "required": true + }, + { + "type": "integer", + "description": "The number of items to skip before starting to collect the result set", + "name": "offset", + "in": "query" + }, + { + "type": "integer", + "default": 100, + "description": "The number of items to return", + "name": "limit", + "in": "query" } ], "responses": { @@ -718,6 +731,19 @@ "name": "space_id", "in": "path", "required": true + }, + { + "type": "integer", + "description": "The number of items to skip before starting to collect the result set", + "name": "offset", + "in": "query" + }, + { + "type": "integer", + "default": 100, + "description": "The number of items to return", + "name": "limit", + "in": "query" } ], "responses": { diff --git a/cmd/api/docs/swagger.yaml b/cmd/api/docs/swagger.yaml index a8706efde..d12c6e3b2 100644 --- a/cmd/api/docs/swagger.yaml +++ b/cmd/api/docs/swagger.yaml @@ -600,6 +600,16 @@ paths: name: typeId required: true type: string + - description: The number of items to skip before starting to collect the result + set + in: query + name: offset + type: integer + - default: 100 + description: The number of items to return + in: query + name: limit + type: integer produces: - application/json responses: @@ -796,6 +806,16 @@ paths: name: space_id required: true type: string + - description: The number of items to skip before starting to collect the result + set + in: query + name: offset + type: integer + - default: 100 + description: The number of items to return + in: query + name: limit + type: integer produces: - application/json responses: diff --git a/cmd/api/handlers.go b/cmd/api/handlers.go index 6c9b01b3c..ef4ca5192 100644 --- a/cmd/api/handlers.go +++ b/cmd/api/handlers.go @@ -33,7 +33,7 @@ type AddMessageRequest struct { Style string `json:"style"` } -// authdisplayCodeHandler generates a new challenge and returns the challenge Id +// authDisplayCodeHandler generates a new challenge and returns the challenge ID // // @Summary Open a modal window with a code in Anytype Desktop app // @Tags auth @@ -137,8 +137,7 @@ func (a *ApiServer) getSpacesHandler(c *gin.Context) { spaces := make([]Space, 0, len(resp.Records)) for _, record := range resp.Records { - spaceId := record.Fields["targetSpaceId"].GetStringValue() - workspace := a.getWorkspaceInfo(c, spaceId) + workspace := a.getWorkspaceInfo(c, record.Fields["targetSpaceId"].GetStringValue()) workspace.Name = record.Fields["name"].GetStringValue() // Set space icon to gateway URL @@ -251,21 +250,18 @@ func (a *ApiServer) getSpaceMembersHandler(c *gin.Context) { members := make([]SpaceMember, 0, len(resp.Records)) for _, record := range resp.Records { + icon := a.getIconFromEmojiOrImage(c, record.Fields["iconEmoji"].GetStringValue(), record.Fields["iconImage"].GetStringValue()) + member := SpaceMember{ Type: "space_member", Id: record.Fields["id"].GetStringValue(), Name: record.Fields["name"].GetStringValue(), + Icon: icon, Identity: record.Fields["identity"].GetStringValue(), GlobalName: record.Fields["globalName"].GetStringValue(), Role: model.ParticipantPermissions_name[int32(record.Fields["participantPermissions"].GetNumberValue())], } - // Set member icon to gateway URL - iconImageId := record.Fields["iconImage"].GetStringValue() - if iconImageId != "" { - member.Icon = a.getGatewayURLForMedia(iconImageId, true) - } - members = append(members, member) } @@ -299,10 +295,13 @@ func (a *ApiServer) getObjectsForSpaceHandler(c *gin.Context) { Condition: model.BlockContentDataviewFilter_In, Value: pbtypes.IntList([]int{ int(model.ObjectType_basic), + int(model.ObjectType_profile), + int(model.ObjectType_todo), int(model.ObjectType_note), int(model.ObjectType_bookmark), int(model.ObjectType_set), int(model.ObjectType_collection), + int(model.ObjectType_participant), }...), }, }, @@ -313,7 +312,7 @@ func (a *ApiServer) getObjectsForSpaceHandler(c *gin.Context) { IncludeTime: true, EmptyPlacement: model.BlockContentDataviewSort_NotSpecified, }}, - Keys: []string{"id", "name", "type", "layout", "iconEmoji", "lastModifiedDate"}, + Keys: []string{"id", "name", "type", "layout", "iconEmoji", "iconImage", "lastModifiedDate"}, Offset: int32(offset), Limit: int32(limit), }) @@ -325,6 +324,7 @@ func (a *ApiServer) getObjectsForSpaceHandler(c *gin.Context) { objects := make([]Object, 0, len(resp.Records)) for _, record := range resp.Records { + icon := a.getIconFromEmojiOrImage(c, record.Fields["iconEmoji"].GetStringValue(), record.Fields["iconImage"].GetStringValue()) objectTypeName, err := a.resolveTypeToName(spaceId, record.Fields["type"].GetStringValue()) if err != nil { c.JSON(http.StatusInternalServerError, gin.H{"message": "Failed to resolve object type name."}) @@ -336,7 +336,7 @@ func (a *ApiServer) getObjectsForSpaceHandler(c *gin.Context) { Type: model.ObjectTypeLayout_name[int32(record.Fields["layout"].GetNumberValue())], Id: record.Fields["id"].GetStringValue(), Name: record.Fields["name"].GetStringValue(), - IconEmoji: record.Fields["iconEmoji"].GetStringValue(), + IconEmoji: icon, ObjectType: objectTypeName, SpaceId: spaceId, // TODO: populate other fields @@ -355,10 +355,6 @@ func (a *ApiServer) getObjectsForSpaceHandler(c *gin.Context) { objects = append(objects, object) } - if len(objects) > limit { - objects = objects[:limit] - } - c.JSON(http.StatusOK, gin.H{"objects": objects}) } @@ -742,7 +738,7 @@ func (a *ApiServer) getObjectsHandler(c *gin.Context) { IncludeTime: true, EmptyPlacement: model.BlockContentDataviewSort_NotSpecified, }}, - Keys: []string{"id", "name", "type", "layout", "iconEmoji", "lastModifiedDate"}, + Keys: []string{"id", "name", "type", "layout", "iconEmoji", "iconImage", "lastModifiedDate"}, Offset: int32(offset), Limit: int32(limit), // TODO split limit between spaces @@ -750,6 +746,7 @@ func (a *ApiServer) getObjectsHandler(c *gin.Context) { // FullText: searchTerm, }) for _, record := range objectSearchResponse.Records { + icon := a.getIconFromEmojiOrImage(c, record.Fields["iconEmoji"].GetStringValue(), record.Fields["iconImage"].GetStringValue()) objectTypeName, err := a.resolveTypeToName(spaceId, record.Fields["type"].GetStringValue()) if err != nil { c.JSON(http.StatusInternalServerError, gin.H{"message": "Failed to resolve type to name."}) @@ -760,7 +757,7 @@ func (a *ApiServer) getObjectsHandler(c *gin.Context) { Type: model.ObjectTypeLayout_name[int32(record.Fields["layout"].GetNumberValue())], Id: record.Fields["id"].GetStringValue(), Name: record.Fields["name"].GetStringValue(), - IconEmoji: record.Fields["iconEmoji"].GetStringValue(), + IconEmoji: icon, ObjectType: objectTypeName, SpaceId: spaceId, // TODO: populate other fields @@ -783,6 +780,11 @@ func (a *ApiServer) getObjectsHandler(c *gin.Context) { return searchResults[i].Details[0].Details["lastModifiedDate"].(float64) > searchResults[j].Details[0].Details["lastModifiedDate"].(float64) }) + // TODO: solve global pagination vs per space pagination + if len(searchResults) > limit { + searchResults = searchResults[:limit] + } + c.JSON(http.StatusOK, gin.H{"objects": searchResults}) } diff --git a/cmd/api/helper.go b/cmd/api/helper.go index 4f1402b0f..1b8a7e79d 100644 --- a/cmd/api/helper.go +++ b/cmd/api/helper.go @@ -14,6 +14,7 @@ import ( "github.com/anyproto/anytype-heart/util/pbtypes" ) +// getGatewayURLForMedia returns the URL of file gateway for the media object with the given ID func (a *ApiServer) getGatewayURLForMedia(objectId string, isIcon bool) string { widthParam := "" if isIcon { @@ -22,6 +23,7 @@ func (a *ApiServer) getGatewayURLForMedia(objectId string, isIcon bool) string { return fmt.Sprintf("%s/image/%s%s", a.accountInfo.GatewayUrl, objectId, widthParam) } +// resolveTypeToName resolves the type ID to the name of the type, e.g. "ot-page" to "Page" or "bafyreigyb6l5szohs32ts26ku2j42yd65e6hqy2u3gtzgdwqv6hzftsetu" to "Custom Type" func (a *ApiServer) resolveTypeToName(spaceId string, typeId string) (string, *pb.RpcObjectSearchResponseError) { // Can't look up preinstalled types based on relation key, therefore need to use unique key relKey := bundle.RelationKeyId.String() @@ -52,6 +54,7 @@ func (a *ApiServer) resolveTypeToName(spaceId string, typeId string) (string, *p return resp.Records[0].Fields["name"].GetStringValue(), nil } +// getChatIdForSpace returns the chat ID for the space with the given ID func (a *ApiServer) getChatIdForSpace(c *gin.Context, spaceId string) string { workspace := a.getWorkspaceInfo(c, spaceId) @@ -73,6 +76,7 @@ func (a *ApiServer) getChatIdForSpace(c *gin.Context, spaceId string) string { return resp.ObjectView.Details[0].Details.Fields["chatId"].GetStringValue() } +// getWorkspaceInfo returns the workspace info for the space with the given ID func (a *ApiServer) getWorkspaceInfo(c *gin.Context, spaceId string) Space { workspaceResponse := a.mw.WorkspaceOpen(context.Background(), &pb.RpcWorkspaceOpenRequest{ SpaceId: spaceId, @@ -101,3 +105,16 @@ func (a *ApiServer) getWorkspaceInfo(c *gin.Context, spaceId string) Space { NetworkId: workspaceResponse.Info.NetworkId, } } + +// getIconFromEmojiOrImage returns the icon to use for the object, which can be either an emoji or an image url +func (a *ApiServer) getIconFromEmojiOrImage(c *gin.Context, iconEmoji string, iconImage string) string { + if iconEmoji != "" { + return iconEmoji + } + + if iconImage != "" { + return a.getGatewayURLForMedia(iconImage, true) + } + + return "" +} From 017dc75193bec60ea7fe4f16dd985ef0018f1e8d Mon Sep 17 00:00:00 2001 From: Jannis Metrikat <120120832+jmetrikat@users.noreply.github.com> Date: Thu, 12 Dec 2024 01:48:59 +0100 Subject: [PATCH 043/195] GO-4459 Use ObjectShow instead of ObjectOpen --- cmd/api/handlers.go | 12 ++++++------ cmd/api/helper.go | 4 ++-- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/cmd/api/handlers.go b/cmd/api/handlers.go index ef4ca5192..839e41499 100644 --- a/cmd/api/handlers.go +++ b/cmd/api/handlers.go @@ -375,13 +375,13 @@ func (a *ApiServer) getObjectHandler(c *gin.Context) { spaceId := c.Param("space_id") objectId := c.Param("object_id") - resp := a.mw.ObjectOpen(context.Background(), &pb.RpcObjectOpenRequest{ + resp := a.mw.ObjectShow(context.Background(), &pb.RpcObjectShowRequest{ SpaceId: spaceId, ObjectId: objectId, }) - if resp.Error.Code != pb.RpcObjectOpenResponseError_NULL { - if resp.Error.Code == pb.RpcObjectOpenResponseError_NOT_FOUND { + if resp.Error.Code != pb.RpcObjectShowResponseError_NULL { + if resp.Error.Code == pb.RpcObjectShowResponseError_NOT_FOUND { c.JSON(http.StatusNotFound, gin.H{"message": "Object not found", "space_id": spaceId, "object_id": objectId}) return } @@ -569,7 +569,7 @@ func (a *ApiServer) getObjectTypeTemplatesHandler(c *gin.Context) { offset := c.GetInt("offset") limit := c.GetInt("limit") - // First, determine the type Id of "ot-template" in the space + // First, determine the type ID of "ot-template" in the space templateTypeIdResp := a.mw.ObjectSearch(context.Background(), &pb.RpcObjectSearchRequest{ SpaceId: spaceId, Filters: []*model.BlockContentDataviewFilter{ @@ -617,12 +617,12 @@ func (a *ApiServer) getObjectTypeTemplatesHandler(c *gin.Context) { // Finally, open each template and populate the response templates := make([]ObjectTemplate, 0, len(templateIds)) for _, templateId := range templateIds { - templateResp := a.mw.ObjectOpen(context.Background(), &pb.RpcObjectOpenRequest{ + templateResp := a.mw.ObjectShow(context.Background(), &pb.RpcObjectShowRequest{ SpaceId: spaceId, ObjectId: templateId, }) - if templateResp.Error.Code != pb.RpcObjectOpenResponseError_NULL { + if templateResp.Error.Code != pb.RpcObjectShowResponseError_NULL { c.JSON(http.StatusInternalServerError, gin.H{"message": "Failed to retrieve template."}) return } diff --git a/cmd/api/helper.go b/cmd/api/helper.go index 1b8a7e79d..0633ae148 100644 --- a/cmd/api/helper.go +++ b/cmd/api/helper.go @@ -58,12 +58,12 @@ func (a *ApiServer) resolveTypeToName(spaceId string, typeId string) (string, *p func (a *ApiServer) getChatIdForSpace(c *gin.Context, spaceId string) string { workspace := a.getWorkspaceInfo(c, spaceId) - resp := a.mw.ObjectOpen(context.Background(), &pb.RpcObjectOpenRequest{ + resp := a.mw.ObjectShow(context.Background(), &pb.RpcObjectShowRequest{ SpaceId: spaceId, ObjectId: workspace.WorkspaceObjectId, }) - if resp.Error.Code != pb.RpcObjectOpenResponseError_NULL { + if resp.Error.Code != pb.RpcObjectShowResponseError_NULL { c.JSON(http.StatusInternalServerError, gin.H{"message": "Failed to open workspace object."}) return "" } From 71c2589441fda43e4ca1602a846a5228dd6447aa Mon Sep 17 00:00:00 2001 From: Jannis Metrikat <120120832+jmetrikat@users.noreply.github.com> Date: Thu, 12 Dec 2024 02:00:33 +0100 Subject: [PATCH 044/195] GO-4459 Return 404 on empty results --- cmd/api/docs/docs.go | 6 +++++ cmd/api/docs/swagger.json | 6 +++++ cmd/api/docs/swagger.yaml | 4 +++ cmd/api/handlers.go | 56 +++++++++++++++++++++++++++++++++++---- 4 files changed, 67 insertions(+), 5 deletions(-) diff --git a/cmd/api/docs/docs.go b/cmd/api/docs/docs.go index f60232516..0a1227126 100644 --- a/cmd/api/docs/docs.go +++ b/cmd/api/docs/docs.go @@ -218,6 +218,12 @@ const docTemplate = `{ "$ref": "#/definitions/api.UnauthorizedError" } }, + "404": { + "description": "Resource not found", + "schema": { + "$ref": "#/definitions/api.NotFoundError" + } + }, "502": { "description": "Internal server error", "schema": { diff --git a/cmd/api/docs/swagger.json b/cmd/api/docs/swagger.json index a120e643f..75e6f0acd 100644 --- a/cmd/api/docs/swagger.json +++ b/cmd/api/docs/swagger.json @@ -212,6 +212,12 @@ "$ref": "#/definitions/api.UnauthorizedError" } }, + "404": { + "description": "Resource not found", + "schema": { + "$ref": "#/definitions/api.NotFoundError" + } + }, "502": { "description": "Internal server error", "schema": { diff --git a/cmd/api/docs/swagger.yaml b/cmd/api/docs/swagger.yaml index d12c6e3b2..4f1b4b95f 100644 --- a/cmd/api/docs/swagger.yaml +++ b/cmd/api/docs/swagger.yaml @@ -460,6 +460,10 @@ paths: description: Unauthorized schema: $ref: '#/definitions/api.UnauthorizedError' + "404": + description: Resource not found + schema: + $ref: '#/definitions/api.NotFoundError' "502": description: Internal server error schema: diff --git a/cmd/api/handlers.go b/cmd/api/handlers.go index 839e41499..cc1afa23f 100644 --- a/cmd/api/handlers.go +++ b/cmd/api/handlers.go @@ -94,6 +94,7 @@ func (a *ApiServer) authTokenHandler(c *gin.Context) { // @Param limit query int false "The number of items to return" default(100) // @Success 200 {object} map[string][]Space "List of spaces" // @Failure 403 {object} UnauthorizedError "Unauthorized" +// @Failure 404 {object} NotFoundError "Resource not found" // @Failure 502 {object} ServerError "Internal server error" // @Router /spaces [get] func (a *ApiServer) getSpacesHandler(c *gin.Context) { @@ -135,6 +136,11 @@ func (a *ApiServer) getSpacesHandler(c *gin.Context) { return } + if len(resp.Records) == 0 { + c.JSON(http.StatusNotFound, gin.H{"message": "No spaces found."}) + return + } + spaces := make([]Space, 0, len(resp.Records)) for _, record := range resp.Records { workspace := a.getWorkspaceInfo(c, record.Fields["targetSpaceId"].GetStringValue()) @@ -248,6 +254,11 @@ func (a *ApiServer) getSpaceMembersHandler(c *gin.Context) { return } + if len(resp.Records) == 0 { + c.JSON(http.StatusNotFound, gin.H{"message": "No members found."}) + return + } + members := make([]SpaceMember, 0, len(resp.Records)) for _, record := range resp.Records { icon := a.getIconFromEmojiOrImage(c, record.Fields["iconEmoji"].GetStringValue(), record.Fields["iconImage"].GetStringValue()) @@ -322,6 +333,11 @@ func (a *ApiServer) getObjectsForSpaceHandler(c *gin.Context) { return } + if len(resp.Records) == 0 { + c.JSON(http.StatusNotFound, gin.H{"message": "No objects found."}) + return + } + objects := make([]Object, 0, len(resp.Records)) for _, record := range resp.Records { icon := a.getIconFromEmojiOrImage(c, record.Fields["iconEmoji"].GetStringValue(), record.Fields["iconImage"].GetStringValue()) @@ -534,6 +550,11 @@ func (a *ApiServer) getObjectTypesHandler(c *gin.Context) { return } + if len(resp.Records) == 0 { + c.JSON(http.StatusNotFound, gin.H{"message": "No object types found."}) + return + } + objectTypes := make([]ObjectType, 0, len(resp.Records)) for _, record := range resp.Records { objectTypes = append(objectTypes, ObjectType{ @@ -586,6 +607,11 @@ func (a *ApiServer) getObjectTypeTemplatesHandler(c *gin.Context) { return } + if len(templateTypeIdResp.Records) == 0 { + c.JSON(http.StatusNotFound, gin.H{"message": "Template type not found."}) + return + } + templateTypeId := templateTypeIdResp.Records[0].Fields["id"].GetStringValue() // Then, search all objects of the template type and filter by the target object type @@ -607,6 +633,11 @@ func (a *ApiServer) getObjectTypeTemplatesHandler(c *gin.Context) { return } + if len(templateObjectsResp.Records) == 0 { + c.JSON(http.StatusNotFound, gin.H{"message": "No templates found."}) + return + } + templateIds := make([]string, 0) for _, record := range templateObjectsResp.Records { if record.Fields["targetObjectType"].GetStringValue() == typeId { @@ -659,7 +690,7 @@ func (a *ApiServer) getObjectsHandler(c *gin.Context) { limit := c.GetInt("limit") // First, call ObjectSearch for all objects of type spaceView - resp := a.mw.ObjectSearch(context.Background(), &pb.RpcObjectSearchRequest{ + spaceResp := a.mw.ObjectSearch(context.Background(), &pb.RpcObjectSearchRequest{ SpaceId: a.accountInfo.TechSpaceId, Filters: []*model.BlockContentDataviewFilter{ { @@ -680,11 +711,16 @@ func (a *ApiServer) getObjectsHandler(c *gin.Context) { }, }) - if resp.Error.Code != pb.RpcObjectSearchResponseError_NULL { + if spaceResp.Error.Code != pb.RpcObjectSearchResponseError_NULL { c.JSON(http.StatusInternalServerError, gin.H{"message": "Failed to retrieve list of spaces."}) return } + if len(spaceResp.Records) == 0 { + c.JSON(http.StatusNotFound, gin.H{"message": "No spaces found."}) + return + } + // Then, get objects from each space that match the search parameters var filters = []*model.BlockContentDataviewFilter{ { @@ -726,9 +762,9 @@ func (a *ApiServer) getObjectsHandler(c *gin.Context) { } searchResults := make([]Object, 0) - for _, spaceRecord := range resp.Records { + for _, spaceRecord := range spaceResp.Records { spaceId := spaceRecord.Fields["targetSpaceId"].GetStringValue() - objectSearchResponse := a.mw.ObjectSearch(context.Background(), &pb.RpcObjectSearchRequest{ + objectResp := a.mw.ObjectSearch(context.Background(), &pb.RpcObjectSearchRequest{ SpaceId: spaceId, Filters: filters, Sorts: []*model.BlockContentDataviewSort{{ @@ -745,7 +781,17 @@ func (a *ApiServer) getObjectsHandler(c *gin.Context) { // Limit: paginationLimitPerSpace, // FullText: searchTerm, }) - for _, record := range objectSearchResponse.Records { + + if objectResp.Error.Code != pb.RpcObjectSearchResponseError_NULL { + c.JSON(http.StatusInternalServerError, gin.H{"message": "Failed to retrieve list of objects."}) + return + } + + if len(objectResp.Records) == 0 { + continue + } + + for _, record := range objectResp.Records { icon := a.getIconFromEmojiOrImage(c, record.Fields["iconEmoji"].GetStringValue(), record.Fields["iconImage"].GetStringValue()) objectTypeName, err := a.resolveTypeToName(spaceId, record.Fields["type"].GetStringValue()) if err != nil { From 3c8160e480856e2ab61d2bd60c3bfcd5e5900e6b Mon Sep 17 00:00:00 2001 From: Jannis Metrikat <120120832+jmetrikat@users.noreply.github.com> Date: Thu, 12 Dec 2024 02:05:08 +0100 Subject: [PATCH 045/195] GO-4459 Always fetch accountInfo to fix inconsistencies after logout --- cmd/api/main.go | 2 -- cmd/api/middleware.go | 30 ++++++++++++++---------------- 2 files changed, 14 insertions(+), 18 deletions(-) diff --git a/cmd/api/main.go b/cmd/api/main.go index f36081873..381064c91 100644 --- a/cmd/api/main.go +++ b/cmd/api/main.go @@ -6,7 +6,6 @@ import ( "net/http" "time" - "github.com/anyproto/any-sync/app" "github.com/gin-gonic/gin" swaggerFiles "github.com/swaggo/files" ginSwagger "github.com/swaggo/gin-swagger" @@ -31,7 +30,6 @@ type ApiServer struct { server *http.Server // init after app start - app *app.App accountInfo *model.AccountInfo } diff --git a/cmd/api/middleware.go b/cmd/api/middleware.go index 23f1b320f..b4fa0aa7f 100644 --- a/cmd/api/middleware.go +++ b/cmd/api/middleware.go @@ -13,23 +13,21 @@ import ( // initAccountInfo retrieves the account information from the account service func (a *ApiServer) initAccountInfo() gin.HandlerFunc { return func(c *gin.Context) { - if a.app == nil && a.accountInfo == nil { - app := a.mwInternal.GetApp() - if app == nil { - c.AbortWithStatusJSON(http.StatusInternalServerError, gin.H{"error": "failed to get app instance"}) - return - } - - accInfo, err := app.Component(account.CName).(account.Service).GetInfo(context.Background()) - if err != nil { - c.AbortWithStatusJSON(http.StatusInternalServerError, gin.H{"error": fmt.Sprintf("failed to get account info: %v", err)}) - return - } - - a.app = app - a.accountInfo = accInfo - c.Next() + // TODO: consider not fetching account info on every request; currently used to avoid inconsistencies on logout/login + app := a.mwInternal.GetApp() + if app == nil { + c.AbortWithStatusJSON(http.StatusInternalServerError, gin.H{"error": "failed to get app instance"}) + return } + + accInfo, err := app.Component(account.CName).(account.Service).GetInfo(context.Background()) + if err != nil { + c.AbortWithStatusJSON(http.StatusInternalServerError, gin.H{"error": fmt.Sprintf("failed to get account info: %v", err)}) + return + } + + a.accountInfo = accInfo + c.Next() } } From 770c11498dfbdf828db4125d41cac6c2f01d53f9 Mon Sep 17 00:00:00 2001 From: Jannis Metrikat <120120832+jmetrikat@users.noreply.github.com> Date: Thu, 12 Dec 2024 02:50:45 +0100 Subject: [PATCH 046/195] GO-4459 Standardize error handling in helper functions --- cmd/api/handlers.go | 52 +++++++++++++++++++++++++++------------------ cmd/api/helper.go | 34 ++++++++++++++--------------- 2 files changed, 47 insertions(+), 39 deletions(-) diff --git a/cmd/api/handlers.go b/cmd/api/handlers.go index cc1afa23f..7ae6b97d1 100644 --- a/cmd/api/handlers.go +++ b/cmd/api/handlers.go @@ -143,15 +143,15 @@ func (a *ApiServer) getSpacesHandler(c *gin.Context) { spaces := make([]Space, 0, len(resp.Records)) for _, record := range resp.Records { - workspace := a.getWorkspaceInfo(c, record.Fields["targetSpaceId"].GetStringValue()) - workspace.Name = record.Fields["name"].GetStringValue() - - // Set space icon to gateway URL - iconImageId := record.Fields["iconImage"].GetStringValue() - if iconImageId != "" { - workspace.Icon = a.getGatewayURLForMedia(iconImageId, true) + workspace, statusCode, errorMessage := a.getWorkspaceInfo(record.Fields["targetSpaceId"].GetStringValue()) + if statusCode != http.StatusOK { + c.JSON(statusCode, gin.H{"message": errorMessage}) + return } + workspace.Name = record.Fields["name"].GetStringValue() + workspace.Icon = a.getIconFromEmojiOrImage(record.Fields["iconEmoji"].GetStringValue(), record.Fields["iconImage"].GetStringValue()) + spaces = append(spaces, workspace) } @@ -261,7 +261,7 @@ func (a *ApiServer) getSpaceMembersHandler(c *gin.Context) { members := make([]SpaceMember, 0, len(resp.Records)) for _, record := range resp.Records { - icon := a.getIconFromEmojiOrImage(c, record.Fields["iconEmoji"].GetStringValue(), record.Fields["iconImage"].GetStringValue()) + icon := a.getIconFromEmojiOrImage(record.Fields["iconEmoji"].GetStringValue(), record.Fields["iconImage"].GetStringValue()) member := SpaceMember{ Type: "space_member", @@ -340,10 +340,10 @@ func (a *ApiServer) getObjectsForSpaceHandler(c *gin.Context) { objects := make([]Object, 0, len(resp.Records)) for _, record := range resp.Records { - icon := a.getIconFromEmojiOrImage(c, record.Fields["iconEmoji"].GetStringValue(), record.Fields["iconImage"].GetStringValue()) - objectTypeName, err := a.resolveTypeToName(spaceId, record.Fields["type"].GetStringValue()) - if err != nil { - c.JSON(http.StatusInternalServerError, gin.H{"message": "Failed to resolve object type name."}) + icon := a.getIconFromEmojiOrImage(record.Fields["iconEmoji"].GetStringValue(), record.Fields["iconImage"].GetStringValue()) + objectTypeName, statusCode, errorMessage := a.resolveTypeToName(spaceId, record.Fields["type"].GetStringValue()) + if statusCode != http.StatusOK { + c.JSON(statusCode, gin.H{"message": errorMessage}) return } @@ -405,9 +405,9 @@ func (a *ApiServer) getObjectHandler(c *gin.Context) { return } - objectTypeName, err := a.resolveTypeToName(spaceId, resp.ObjectView.Details[0].Details.Fields["type"].GetStringValue()) - if err != nil { - c.JSON(http.StatusInternalServerError, gin.H{"message": "Failed to resolve object type name."}) + objectTypeName, statusCode, errorMessage := a.resolveTypeToName(spaceId, resp.ObjectView.Details[0].Details.Fields["type"].GetStringValue()) + if statusCode != http.StatusOK { + c.JSON(statusCode, gin.H{"message": errorMessage}) return } @@ -792,10 +792,10 @@ func (a *ApiServer) getObjectsHandler(c *gin.Context) { } for _, record := range objectResp.Records { - icon := a.getIconFromEmojiOrImage(c, record.Fields["iconEmoji"].GetStringValue(), record.Fields["iconImage"].GetStringValue()) - objectTypeName, err := a.resolveTypeToName(spaceId, record.Fields["type"].GetStringValue()) - if err != nil { - c.JSON(http.StatusInternalServerError, gin.H{"message": "Failed to resolve type to name."}) + icon := a.getIconFromEmojiOrImage(record.Fields["iconEmoji"].GetStringValue(), record.Fields["iconImage"].GetStringValue()) + objectTypeName, statusCode, errorMessage := a.resolveTypeToName(spaceId, record.Fields["type"].GetStringValue()) + if statusCode != http.StatusOK { + c.JSON(statusCode, gin.H{"message": errorMessage}) return } @@ -848,11 +848,16 @@ func (a *ApiServer) getObjectsHandler(c *gin.Context) { // @Router /v1/spaces/{space_id}/chat/messages [get] func (a *ApiServer) getChatMessagesHandler(c *gin.Context) { spaceId := c.Param("space_id") - chatId := a.getChatIdForSpace(c, spaceId) // TODO: implement offset // offset := c.GetInt("offset") limit := c.GetInt("limit") + chatId, statusCode, errorMessage := a.getChatIdForSpace(spaceId) + if statusCode != http.StatusOK { + c.JSON(statusCode, gin.H{"message": errorMessage}) + return + } + lastMessages := a.mw.ChatSubscribeLastMessages(context.Background(), &pb.RpcChatSubscribeLastMessagesRequest{ ChatObjectId: chatId, Limit: int32(limit), @@ -944,7 +949,12 @@ func (a *ApiServer) addChatMessageHandler(c *gin.Context) { return } - chatId := a.getChatIdForSpace(c, spaceId) + chatId, statusCode, errorMessage := a.getChatIdForSpace(spaceId) + if statusCode != http.StatusOK { + c.JSON(statusCode, gin.H{"message": errorMessage}) + return + } + resp := a.mw.ChatAddMessage(context.Background(), &pb.RpcChatAddMessageRequest{ ChatObjectId: chatId, Message: &model.ChatMessage{ diff --git a/cmd/api/helper.go b/cmd/api/helper.go index 0633ae148..7bdbd0127 100644 --- a/cmd/api/helper.go +++ b/cmd/api/helper.go @@ -6,8 +6,6 @@ import ( "net/http" "strings" - "github.com/gin-gonic/gin" - "github.com/anyproto/anytype-heart/pb" "github.com/anyproto/anytype-heart/pkg/lib/bundle" "github.com/anyproto/anytype-heart/pkg/lib/pb/model" @@ -24,7 +22,7 @@ func (a *ApiServer) getGatewayURLForMedia(objectId string, isIcon bool) string { } // resolveTypeToName resolves the type ID to the name of the type, e.g. "ot-page" to "Page" or "bafyreigyb6l5szohs32ts26ku2j42yd65e6hqy2u3gtzgdwqv6hzftsetu" to "Custom Type" -func (a *ApiServer) resolveTypeToName(spaceId string, typeId string) (string, *pb.RpcObjectSearchResponseError) { +func (a *ApiServer) resolveTypeToName(spaceId string, typeId string) (typeName string, statusCode int, errorMessage string) { // Can't look up preinstalled types based on relation key, therefore need to use unique key relKey := bundle.RelationKeyId.String() if strings.Contains(typeId, "ot-") { @@ -44,19 +42,22 @@ func (a *ApiServer) resolveTypeToName(spaceId string, typeId string) (string, *p }) if resp.Error.Code != pb.RpcObjectSearchResponseError_NULL { - return "", resp.Error + return "", http.StatusInternalServerError, "Failed to search for type." } if len(resp.Records) == 0 { - return "", &pb.RpcObjectSearchResponseError{Code: pb.RpcObjectSearchResponseError_BAD_INPUT, Description: "Type not found"} + return "", http.StatusNotFound, "Type not found." } - return resp.Records[0].Fields["name"].GetStringValue(), nil + return resp.Records[0].Fields["name"].GetStringValue(), http.StatusOK, "" } // getChatIdForSpace returns the chat ID for the space with the given ID -func (a *ApiServer) getChatIdForSpace(c *gin.Context, spaceId string) string { - workspace := a.getWorkspaceInfo(c, spaceId) +func (a *ApiServer) getChatIdForSpace(spaceId string) (chatId string, statusCode int, errorMessage string) { + workspace, statusCode, errorMessage := a.getWorkspaceInfo(spaceId) + if statusCode != http.StatusOK { + return "", statusCode, errorMessage + } resp := a.mw.ObjectShow(context.Background(), &pb.RpcObjectShowRequest{ SpaceId: spaceId, @@ -64,28 +65,25 @@ func (a *ApiServer) getChatIdForSpace(c *gin.Context, spaceId string) string { }) if resp.Error.Code != pb.RpcObjectShowResponseError_NULL { - c.JSON(http.StatusInternalServerError, gin.H{"message": "Failed to open workspace object."}) - return "" + return "", http.StatusInternalServerError, "Failed to open workspace object." } if !resp.ObjectView.Details[0].Details.Fields["hasChat"].GetBoolValue() { - c.JSON(http.StatusNotFound, gin.H{"message": "Chat not found"}) - return "" + return "", http.StatusNotFound, "Chat not found." } - return resp.ObjectView.Details[0].Details.Fields["chatId"].GetStringValue() + return resp.ObjectView.Details[0].Details.Fields["chatId"].GetStringValue(), http.StatusOK, "" } // getWorkspaceInfo returns the workspace info for the space with the given ID -func (a *ApiServer) getWorkspaceInfo(c *gin.Context, spaceId string) Space { +func (a *ApiServer) getWorkspaceInfo(spaceId string) (space Space, statusCode int, errorMessage string) { workspaceResponse := a.mw.WorkspaceOpen(context.Background(), &pb.RpcWorkspaceOpenRequest{ SpaceId: spaceId, WithChat: true, }) if workspaceResponse.Error.Code != pb.RpcWorkspaceOpenResponseError_NULL { - c.JSON(http.StatusInternalServerError, gin.H{"message": "Failed to open workspace."}) - return Space{} + return Space{}, http.StatusInternalServerError, "Failed to open workspace." } return Space{ @@ -103,11 +101,11 @@ func (a *ApiServer) getWorkspaceInfo(c *gin.Context, spaceId string) Space { TechSpaceId: workspaceResponse.Info.TechSpaceId, Timezone: workspaceResponse.Info.TimeZone, NetworkId: workspaceResponse.Info.NetworkId, - } + }, http.StatusOK, "" } // getIconFromEmojiOrImage returns the icon to use for the object, which can be either an emoji or an image url -func (a *ApiServer) getIconFromEmojiOrImage(c *gin.Context, iconEmoji string, iconImage string) string { +func (a *ApiServer) getIconFromEmojiOrImage(iconEmoji string, iconImage string) string { if iconEmoji != "" { return iconEmoji } From 0a0aadda138bc146dc34271b179ad4157418e195 Mon Sep 17 00:00:00 2001 From: Jannis Metrikat <120120832+jmetrikat@users.noreply.github.com> Date: Thu, 12 Dec 2024 21:24:01 +0100 Subject: [PATCH 047/195] GO-4459 Rename IconEmoji to Icon --- cmd/api/docs/docs.go | 11 ++++------- cmd/api/docs/swagger.json | 11 ++++------- cmd/api/docs/swagger.yaml | 10 ++++------ cmd/api/handlers.go | 22 +++++++++++----------- cmd/api/schemas.go | 28 +++++++++++----------------- 5 files changed, 34 insertions(+), 48 deletions(-) diff --git a/cmd/api/docs/docs.go b/cmd/api/docs/docs.go index 0a1227126..6dc42526c 100644 --- a/cmd/api/docs/docs.go +++ b/cmd/api/docs/docs.go @@ -1200,7 +1200,7 @@ const docTemplate = `{ "$ref": "#/definitions/api.Detail" } }, - "icon_emoji": { + "icon": { "type": "string", "example": "📄" }, @@ -1232,7 +1232,7 @@ const docTemplate = `{ "api.ObjectTemplate": { "type": "object", "properties": { - "icon_emoji": { + "icon": { "type": "string", "example": "📄" }, @@ -1253,7 +1253,7 @@ const docTemplate = `{ "api.ObjectType": { "type": "object", "properties": { - "icon_emoji": { + "icon": { "type": "string", "example": "📄" }, @@ -1411,10 +1411,7 @@ const docTemplate = `{ "color": { "type": "string" }, - "icon_emoji": { - "type": "string" - }, - "icon_image": { + "icon": { "type": "string" }, "style": { diff --git a/cmd/api/docs/swagger.json b/cmd/api/docs/swagger.json index 75e6f0acd..8b5f4a627 100644 --- a/cmd/api/docs/swagger.json +++ b/cmd/api/docs/swagger.json @@ -1194,7 +1194,7 @@ "$ref": "#/definitions/api.Detail" } }, - "icon_emoji": { + "icon": { "type": "string", "example": "📄" }, @@ -1226,7 +1226,7 @@ "api.ObjectTemplate": { "type": "object", "properties": { - "icon_emoji": { + "icon": { "type": "string", "example": "📄" }, @@ -1247,7 +1247,7 @@ "api.ObjectType": { "type": "object", "properties": { - "icon_emoji": { + "icon": { "type": "string", "example": "📄" }, @@ -1405,10 +1405,7 @@ "color": { "type": "string" }, - "icon_emoji": { - "type": "string" - }, - "icon_image": { + "icon": { "type": "string" }, "style": { diff --git a/cmd/api/docs/swagger.yaml b/cmd/api/docs/swagger.yaml index 4f1b4b95f..846e14d69 100644 --- a/cmd/api/docs/swagger.yaml +++ b/cmd/api/docs/swagger.yaml @@ -138,7 +138,7 @@ definitions: items: $ref: '#/definitions/api.Detail' type: array - icon_emoji: + icon: example: "\U0001F4C4" type: string id: @@ -161,7 +161,7 @@ definitions: type: object api.ObjectTemplate: properties: - icon_emoji: + icon: example: "\U0001F4C4" type: string id: @@ -176,7 +176,7 @@ definitions: type: object api.ObjectType: properties: - icon_emoji: + icon: example: "\U0001F4C4" type: string id: @@ -289,9 +289,7 @@ definitions: type: boolean color: type: string - icon_emoji: - type: string - icon_image: + icon: type: string style: type: string diff --git a/cmd/api/handlers.go b/cmd/api/handlers.go index 7ae6b97d1..7e4821444 100644 --- a/cmd/api/handlers.go +++ b/cmd/api/handlers.go @@ -22,7 +22,7 @@ type CreateSpaceRequest struct { type CreateObjectRequest struct { Name string `json:"name"` - IconEmoji string `json:"icon_emoji"` + Icon string `json:"icon"` TemplateId string `json:"template_id"` ObjectTypeUniqueKey string `json:"object_type_unique_key"` WithChat bool `json:"with_chat"` @@ -352,7 +352,7 @@ func (a *ApiServer) getObjectsForSpaceHandler(c *gin.Context) { Type: model.ObjectTypeLayout_name[int32(record.Fields["layout"].GetNumberValue())], Id: record.Fields["id"].GetStringValue(), Name: record.Fields["name"].GetStringValue(), - IconEmoji: icon, + Icon: icon, ObjectType: objectTypeName, SpaceId: spaceId, // TODO: populate other fields @@ -415,7 +415,7 @@ func (a *ApiServer) getObjectHandler(c *gin.Context) { Type: "object", Id: objectId, Name: resp.ObjectView.Details[0].Details.Fields["name"].GetStringValue(), - IconEmoji: resp.ObjectView.Details[0].Details.Fields["iconEmoji"].GetStringValue(), + Icon: resp.ObjectView.Details[0].Details.Fields["iconEmoji"].GetStringValue(), ObjectType: objectTypeName, RootId: resp.ObjectView.RootId, // TODO: populate other fields @@ -451,7 +451,7 @@ func (a *ApiServer) createObjectHandler(c *gin.Context) { Details: &types.Struct{ Fields: map[string]*types.Value{ "name": {Kind: &types.Value_StringValue{StringValue: request.Name}}, - "iconEmoji": {Kind: &types.Value_StringValue{StringValue: request.IconEmoji}}, + "iconEmoji": {Kind: &types.Value_StringValue{StringValue: request.Icon}}, }, }, TemplateId: request.TemplateId, @@ -469,7 +469,7 @@ func (a *ApiServer) createObjectHandler(c *gin.Context) { Type: "object", Id: resp.ObjectId, Name: resp.Details.Fields["name"].GetStringValue(), - IconEmoji: resp.Details.Fields["iconEmoji"].GetStringValue(), + Icon: resp.Details.Fields["iconEmoji"].GetStringValue(), ObjectType: request.ObjectTypeUniqueKey, SpaceId: resp.Details.Fields["spaceId"].GetStringValue(), // TODO populate other fields @@ -562,7 +562,7 @@ func (a *ApiServer) getObjectTypesHandler(c *gin.Context) { Id: record.Fields["id"].GetStringValue(), UniqueKey: record.Fields["uniqueKey"].GetStringValue(), Name: record.Fields["name"].GetStringValue(), - IconEmoji: record.Fields["iconEmoji"].GetStringValue(), + Icon: record.Fields["iconEmoji"].GetStringValue(), }) } @@ -659,10 +659,10 @@ func (a *ApiServer) getObjectTypeTemplatesHandler(c *gin.Context) { } templates = append(templates, ObjectTemplate{ - Type: "object_template", - Id: templateId, - Name: templateResp.ObjectView.Details[0].Details.Fields["name"].GetStringValue(), - IconEmoji: templateResp.ObjectView.Details[0].Details.Fields["iconEmoji"].GetStringValue(), + Type: "object_template", + Id: templateId, + Name: templateResp.ObjectView.Details[0].Details.Fields["name"].GetStringValue(), + Icon: templateResp.ObjectView.Details[0].Details.Fields["iconEmoji"].GetStringValue(), }) } @@ -803,7 +803,7 @@ func (a *ApiServer) getObjectsHandler(c *gin.Context) { Type: model.ObjectTypeLayout_name[int32(record.Fields["layout"].GetNumberValue())], Id: record.Fields["id"].GetStringValue(), Name: record.Fields["name"].GetStringValue(), - IconEmoji: icon, + Icon: icon, ObjectType: objectTypeName, SpaceId: spaceId, // TODO: populate other fields diff --git a/cmd/api/schemas.go b/cmd/api/schemas.go index e83a6cbe5..9ad0af17f 100644 --- a/cmd/api/schemas.go +++ b/cmd/api/schemas.go @@ -33,7 +33,7 @@ type Object struct { Type string `json:"type" example:"object"` Id string `json:"id" example:"bafyreie6n5l5nkbjal37su54cha4coy7qzuhrnajluzv5qd5jvtsrxkequ"` Name string `json:"name" example:"Object Name"` - IconEmoji string `json:"icon_emoji" example:"📄"` + Icon string `json:"icon" example:"📄"` ObjectType string `json:"object_type" example:"Page"` SpaceId string `json:"space_id" example:"bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1"` RootId string `json:"root_id"` @@ -57,12 +57,11 @@ type Layout struct { } type Text struct { - Text string `json:"text"` - Style string `json:"style"` - Checked bool `json:"checked"` - Color string `json:"color"` - IconEmoji string `json:"icon_emoji"` - IconImage string `json:"icon_image"` + Text string `json:"text"` + Style string `json:"style"` + Checked bool `json:"checked"` + Color string `json:"color"` + Icon string `json:"icon"` } type File struct { @@ -82,24 +81,19 @@ type Detail struct { Details map[string]interface{} `json:"details"` } -type RelationLink struct { - Key string `json:"key"` - Format string `json:"format"` -} - type ObjectType struct { Type string `json:"type" example:"object_type"` Id string `json:"id" example:"bafyreigyb6l5szohs32ts26ku2j42yd65e6hqy2u3gtzgdwqv6hzftsetu"` UniqueKey string `json:"unique_key" example:"ot-page"` Name string `json:"name" example:"Page"` - IconEmoji string `json:"icon_emoji" example:"📄"` + Icon string `json:"icon" example:"📄"` } type ObjectTemplate struct { - Type string `json:"type" example:"object_template"` - Id string `json:"id" example:"bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5uutge"` - Name string `json:"name" example:"Object Template Name"` - IconEmoji string `json:"icon_emoji" example:"📄"` + Type string `json:"type" example:"object_template"` + Id string `json:"id" example:"bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5uutge"` + Name string `json:"name" example:"Object Template Name"` + Icon string `json:"icon" example:"📄"` } type ChatMessage struct { From 101ea2a288b72769713782c7631d2aab54bc5455 Mon Sep 17 00:00:00 2001 From: Jannis Metrikat <120120832+jmetrikat@users.noreply.github.com> Date: Wed, 18 Dec 2024 14:12:12 +0100 Subject: [PATCH 048/195] GO-4459 Add initial handler tests using mocked middleware interfaces --- .mockery.yaml | 6 + cmd/api/handlers_test.go | 121 + cmd/api/main.go | 2 +- core/mock_core/mock_MiddlewareInternal.go | 145 + .../mock_service/mock_ClientCommandsServer.go | 13254 ++++++++++++++++ 5 files changed, 13527 insertions(+), 1 deletion(-) create mode 100644 cmd/api/handlers_test.go create mode 100644 core/mock_core/mock_MiddlewareInternal.go create mode 100644 pb/service/mock_service/mock_ClientCommandsServer.go diff --git a/.mockery.yaml b/.mockery.yaml index d40638613..2ee80d161 100644 --- a/.mockery.yaml +++ b/.mockery.yaml @@ -222,3 +222,9 @@ packages: github.com/anyproto/anytype-heart/core/kanban: interfaces: Service: + github.com/anyproto/anytype-heart/pb/service: + interfaces: + ClientCommandsServer: + github.com/anyproto/anytype-heart/core: + interfaces: + MiddlewareInternal: \ No newline at end of file diff --git a/cmd/api/handlers_test.go b/cmd/api/handlers_test.go new file mode 100644 index 000000000..6271e5a43 --- /dev/null +++ b/cmd/api/handlers_test.go @@ -0,0 +1,121 @@ +package api + +import ( + "net/http" + "net/http/httptest" + "testing" + + "github.com/gin-gonic/gin" + + "github.com/stretchr/testify/mock" + "github.com/stretchr/testify/require" + + "github.com/anyproto/anytype-heart/core/mock_core" + "github.com/anyproto/anytype-heart/pb" + "github.com/anyproto/anytype-heart/pb/service/mock_service" +) + +type fixture struct { + *ApiServer + mwMock *mock_service.MockClientCommandsServer + mwInternalMock *mock_core.MockMiddlewareInternal + router *gin.Engine +} + +func newFixture(t *testing.T) *fixture { + mw := mock_service.NewMockClientCommandsServer(t) + mwInternal := mock_core.NewMockMiddlewareInternal(t) + apiServer := &ApiServer{mw: mw, mwInternal: mwInternal, router: gin.Default()} + + apiServer.router.POST("/auth/displayCode", apiServer.authDisplayCodeHandler) + apiServer.router.GET("/auth/token", apiServer.authTokenHandler) + + return &fixture{ + ApiServer: apiServer, + mwMock: mw, + mwInternalMock: mwInternal, + router: apiServer.router, + } +} + +func TestApiServer_AuthDisplayCodeHandler(t *testing.T) { + t.Run("successful challenge creation", func(t *testing.T) { + fx := newFixture(t) + + fx.mwMock.On("AccountLocalLinkNewChallenge", mock.Anything, &pb.RpcAccountLocalLinkNewChallengeRequest{AppName: "api-test"}). + Return(&pb.RpcAccountLocalLinkNewChallengeResponse{ + ChallengeId: "mocked-challenge-id", + Error: &pb.RpcAccountLocalLinkNewChallengeResponseError{Code: pb.RpcAccountLocalLinkNewChallengeResponseError_NULL}, + }).Once() + + req, _ := http.NewRequest("POST", "/auth/displayCode", nil) + w := httptest.NewRecorder() + fx.router.ServeHTTP(w, req) + + require.Equal(t, http.StatusOK, w.Code) + require.Contains(t, w.Body.String(), "mocked-challenge-id") + }) + + t.Run("failed challenge creation", func(t *testing.T) { + fx := newFixture(t) + + // Mock middleware behavior + fx.mwMock.On("AccountLocalLinkNewChallenge", mock.Anything, &pb.RpcAccountLocalLinkNewChallengeRequest{AppName: "api-test"}). + Return(&pb.RpcAccountLocalLinkNewChallengeResponse{ + Error: &pb.RpcAccountLocalLinkNewChallengeResponseError{Code: pb.RpcAccountLocalLinkNewChallengeResponseError_UNKNOWN_ERROR}, + }).Once() + + req, _ := http.NewRequest("POST", "/auth/displayCode", nil) + w := httptest.NewRecorder() + fx.router.ServeHTTP(w, req) + + require.Equal(t, http.StatusInternalServerError, w.Code) + }) +} + +func TestApiServer_AuthTokenHandler(t *testing.T) { + t.Run("successful token retrieval", func(t *testing.T) { + fx := newFixture(t) + challengeId := "mocked-challenge-id" + code := "mocked-code" + + // Mock middleware behavior + fx.mwMock.On("AccountLocalLinkSolveChallenge", mock.Anything, &pb.RpcAccountLocalLinkSolveChallengeRequest{ + ChallengeId: challengeId, + Answer: code, + }). + Return(&pb.RpcAccountLocalLinkSolveChallengeResponse{ + SessionToken: "mocked-session-token", + AppKey: "mocked-app-key", + Error: &pb.RpcAccountLocalLinkSolveChallengeResponseError{Code: pb.RpcAccountLocalLinkSolveChallengeResponseError_NULL}, + }).Once() + + req, _ := http.NewRequest("GET", "/auth/token?challengeId="+challengeId+"&code="+code, nil) + w := httptest.NewRecorder() + fx.router.ServeHTTP(w, req) + + require.Equal(t, http.StatusOK, w.Code) + require.Contains(t, w.Body.String(), "mocked-session-token") + require.Contains(t, w.Body.String(), "mocked-app-key") + }) + + t.Run("failed token retrieval", func(t *testing.T) { + fx := newFixture(t) + challengeId := "mocked-challenge-id" + code := "mocked-code" + + fx.mwMock.On("AccountLocalLinkSolveChallenge", mock.Anything, &pb.RpcAccountLocalLinkSolveChallengeRequest{ + ChallengeId: challengeId, + Answer: code, + }). + Return(&pb.RpcAccountLocalLinkSolveChallengeResponse{ + Error: &pb.RpcAccountLocalLinkSolveChallengeResponseError{Code: pb.RpcAccountLocalLinkSolveChallengeResponseError_UNKNOWN_ERROR}, + }).Once() + + req, _ := http.NewRequest("GET", "/auth/token?challengeId="+challengeId+"&code="+code, nil) + w := httptest.NewRecorder() + fx.router.ServeHTTP(w, req) + + require.Equal(t, http.StatusInternalServerError, w.Code) + }) +} diff --git a/cmd/api/main.go b/cmd/api/main.go index 381064c91..9c60fba22 100644 --- a/cmd/api/main.go +++ b/cmd/api/main.go @@ -43,7 +43,7 @@ func newApiServer(mw service.ClientCommandsServer, mwInternal core.MiddlewareInt a := &ApiServer{ mw: mw, mwInternal: mwInternal, - router: gin.New(), + router: gin.Default(), } a.server = &http.Server{ diff --git a/core/mock_core/mock_MiddlewareInternal.go b/core/mock_core/mock_MiddlewareInternal.go new file mode 100644 index 000000000..d55bfa317 --- /dev/null +++ b/core/mock_core/mock_MiddlewareInternal.go @@ -0,0 +1,145 @@ +// Code generated by mockery. DO NOT EDIT. + +package mock_core + +import ( + context "context" + + app "github.com/anyproto/any-sync/app" + + mock "github.com/stretchr/testify/mock" + + model "github.com/anyproto/anytype-heart/pkg/lib/pb/model" +) + +// MockMiddlewareInternal is an autogenerated mock type for the MiddlewareInternal type +type MockMiddlewareInternal struct { + mock.Mock +} + +type MockMiddlewareInternal_Expecter struct { + mock *mock.Mock +} + +func (_m *MockMiddlewareInternal) EXPECT() *MockMiddlewareInternal_Expecter { + return &MockMiddlewareInternal_Expecter{mock: &_m.Mock} +} + +// GetAccountInfo provides a mock function with given fields: ctx +func (_m *MockMiddlewareInternal) GetAccountInfo(ctx context.Context) (*model.AccountInfo, error) { + ret := _m.Called(ctx) + + if len(ret) == 0 { + panic("no return value specified for GetAccountInfo") + } + + var r0 *model.AccountInfo + var r1 error + if rf, ok := ret.Get(0).(func(context.Context) (*model.AccountInfo, error)); ok { + return rf(ctx) + } + if rf, ok := ret.Get(0).(func(context.Context) *model.AccountInfo); ok { + r0 = rf(ctx) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*model.AccountInfo) + } + } + + if rf, ok := ret.Get(1).(func(context.Context) error); ok { + r1 = rf(ctx) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// MockMiddlewareInternal_GetAccountInfo_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetAccountInfo' +type MockMiddlewareInternal_GetAccountInfo_Call struct { + *mock.Call +} + +// GetAccountInfo is a helper method to define mock.On call +// - ctx context.Context +func (_e *MockMiddlewareInternal_Expecter) GetAccountInfo(ctx interface{}) *MockMiddlewareInternal_GetAccountInfo_Call { + return &MockMiddlewareInternal_GetAccountInfo_Call{Call: _e.mock.On("GetAccountInfo", ctx)} +} + +func (_c *MockMiddlewareInternal_GetAccountInfo_Call) Run(run func(ctx context.Context)) *MockMiddlewareInternal_GetAccountInfo_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context)) + }) + return _c +} + +func (_c *MockMiddlewareInternal_GetAccountInfo_Call) Return(_a0 *model.AccountInfo, _a1 error) *MockMiddlewareInternal_GetAccountInfo_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *MockMiddlewareInternal_GetAccountInfo_Call) RunAndReturn(run func(context.Context) (*model.AccountInfo, error)) *MockMiddlewareInternal_GetAccountInfo_Call { + _c.Call.Return(run) + return _c +} + +// GetApp provides a mock function with given fields: +func (_m *MockMiddlewareInternal) GetApp() *app.App { + ret := _m.Called() + + if len(ret) == 0 { + panic("no return value specified for GetApp") + } + + var r0 *app.App + if rf, ok := ret.Get(0).(func() *app.App); ok { + r0 = rf() + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*app.App) + } + } + + return r0 +} + +// MockMiddlewareInternal_GetApp_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetApp' +type MockMiddlewareInternal_GetApp_Call struct { + *mock.Call +} + +// GetApp is a helper method to define mock.On call +func (_e *MockMiddlewareInternal_Expecter) GetApp() *MockMiddlewareInternal_GetApp_Call { + return &MockMiddlewareInternal_GetApp_Call{Call: _e.mock.On("GetApp")} +} + +func (_c *MockMiddlewareInternal_GetApp_Call) Run(run func()) *MockMiddlewareInternal_GetApp_Call { + _c.Call.Run(func(args mock.Arguments) { + run() + }) + return _c +} + +func (_c *MockMiddlewareInternal_GetApp_Call) Return(_a0 *app.App) *MockMiddlewareInternal_GetApp_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockMiddlewareInternal_GetApp_Call) RunAndReturn(run func() *app.App) *MockMiddlewareInternal_GetApp_Call { + _c.Call.Return(run) + return _c +} + +// NewMockMiddlewareInternal creates a new instance of MockMiddlewareInternal. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +// The first argument is typically a *testing.T value. +func NewMockMiddlewareInternal(t interface { + mock.TestingT + Cleanup(func()) +}) *MockMiddlewareInternal { + mock := &MockMiddlewareInternal{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} diff --git a/pb/service/mock_service/mock_ClientCommandsServer.go b/pb/service/mock_service/mock_ClientCommandsServer.go new file mode 100644 index 000000000..e6ce72bf3 --- /dev/null +++ b/pb/service/mock_service/mock_ClientCommandsServer.go @@ -0,0 +1,13254 @@ +// Code generated by mockery. DO NOT EDIT. + +package mock_service + +import ( + context "context" + + pb "github.com/anyproto/anytype-heart/pb" + mock "github.com/stretchr/testify/mock" + + service "github.com/anyproto/anytype-heart/pb/service" +) + +// MockClientCommandsServer is an autogenerated mock type for the ClientCommandsServer type +type MockClientCommandsServer struct { + mock.Mock +} + +type MockClientCommandsServer_Expecter struct { + mock *mock.Mock +} + +func (_m *MockClientCommandsServer) EXPECT() *MockClientCommandsServer_Expecter { + return &MockClientCommandsServer_Expecter{mock: &_m.Mock} +} + +// AccountChangeNetworkConfigAndRestart provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) AccountChangeNetworkConfigAndRestart(_a0 context.Context, _a1 *pb.RpcAccountChangeNetworkConfigAndRestartRequest) *pb.RpcAccountChangeNetworkConfigAndRestartResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for AccountChangeNetworkConfigAndRestart") + } + + var r0 *pb.RpcAccountChangeNetworkConfigAndRestartResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcAccountChangeNetworkConfigAndRestartRequest) *pb.RpcAccountChangeNetworkConfigAndRestartResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcAccountChangeNetworkConfigAndRestartResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_AccountChangeNetworkConfigAndRestart_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'AccountChangeNetworkConfigAndRestart' +type MockClientCommandsServer_AccountChangeNetworkConfigAndRestart_Call struct { + *mock.Call +} + +// AccountChangeNetworkConfigAndRestart is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcAccountChangeNetworkConfigAndRestartRequest +func (_e *MockClientCommandsServer_Expecter) AccountChangeNetworkConfigAndRestart(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_AccountChangeNetworkConfigAndRestart_Call { + return &MockClientCommandsServer_AccountChangeNetworkConfigAndRestart_Call{Call: _e.mock.On("AccountChangeNetworkConfigAndRestart", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_AccountChangeNetworkConfigAndRestart_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcAccountChangeNetworkConfigAndRestartRequest)) *MockClientCommandsServer_AccountChangeNetworkConfigAndRestart_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcAccountChangeNetworkConfigAndRestartRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_AccountChangeNetworkConfigAndRestart_Call) Return(_a0 *pb.RpcAccountChangeNetworkConfigAndRestartResponse) *MockClientCommandsServer_AccountChangeNetworkConfigAndRestart_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_AccountChangeNetworkConfigAndRestart_Call) RunAndReturn(run func(context.Context, *pb.RpcAccountChangeNetworkConfigAndRestartRequest) *pb.RpcAccountChangeNetworkConfigAndRestartResponse) *MockClientCommandsServer_AccountChangeNetworkConfigAndRestart_Call { + _c.Call.Return(run) + return _c +} + +// AccountConfigUpdate provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) AccountConfigUpdate(_a0 context.Context, _a1 *pb.RpcAccountConfigUpdateRequest) *pb.RpcAccountConfigUpdateResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for AccountConfigUpdate") + } + + var r0 *pb.RpcAccountConfigUpdateResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcAccountConfigUpdateRequest) *pb.RpcAccountConfigUpdateResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcAccountConfigUpdateResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_AccountConfigUpdate_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'AccountConfigUpdate' +type MockClientCommandsServer_AccountConfigUpdate_Call struct { + *mock.Call +} + +// AccountConfigUpdate is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcAccountConfigUpdateRequest +func (_e *MockClientCommandsServer_Expecter) AccountConfigUpdate(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_AccountConfigUpdate_Call { + return &MockClientCommandsServer_AccountConfigUpdate_Call{Call: _e.mock.On("AccountConfigUpdate", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_AccountConfigUpdate_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcAccountConfigUpdateRequest)) *MockClientCommandsServer_AccountConfigUpdate_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcAccountConfigUpdateRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_AccountConfigUpdate_Call) Return(_a0 *pb.RpcAccountConfigUpdateResponse) *MockClientCommandsServer_AccountConfigUpdate_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_AccountConfigUpdate_Call) RunAndReturn(run func(context.Context, *pb.RpcAccountConfigUpdateRequest) *pb.RpcAccountConfigUpdateResponse) *MockClientCommandsServer_AccountConfigUpdate_Call { + _c.Call.Return(run) + return _c +} + +// AccountCreate provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) AccountCreate(_a0 context.Context, _a1 *pb.RpcAccountCreateRequest) *pb.RpcAccountCreateResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for AccountCreate") + } + + var r0 *pb.RpcAccountCreateResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcAccountCreateRequest) *pb.RpcAccountCreateResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcAccountCreateResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_AccountCreate_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'AccountCreate' +type MockClientCommandsServer_AccountCreate_Call struct { + *mock.Call +} + +// AccountCreate is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcAccountCreateRequest +func (_e *MockClientCommandsServer_Expecter) AccountCreate(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_AccountCreate_Call { + return &MockClientCommandsServer_AccountCreate_Call{Call: _e.mock.On("AccountCreate", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_AccountCreate_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcAccountCreateRequest)) *MockClientCommandsServer_AccountCreate_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcAccountCreateRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_AccountCreate_Call) Return(_a0 *pb.RpcAccountCreateResponse) *MockClientCommandsServer_AccountCreate_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_AccountCreate_Call) RunAndReturn(run func(context.Context, *pb.RpcAccountCreateRequest) *pb.RpcAccountCreateResponse) *MockClientCommandsServer_AccountCreate_Call { + _c.Call.Return(run) + return _c +} + +// AccountDelete provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) AccountDelete(_a0 context.Context, _a1 *pb.RpcAccountDeleteRequest) *pb.RpcAccountDeleteResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for AccountDelete") + } + + var r0 *pb.RpcAccountDeleteResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcAccountDeleteRequest) *pb.RpcAccountDeleteResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcAccountDeleteResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_AccountDelete_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'AccountDelete' +type MockClientCommandsServer_AccountDelete_Call struct { + *mock.Call +} + +// AccountDelete is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcAccountDeleteRequest +func (_e *MockClientCommandsServer_Expecter) AccountDelete(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_AccountDelete_Call { + return &MockClientCommandsServer_AccountDelete_Call{Call: _e.mock.On("AccountDelete", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_AccountDelete_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcAccountDeleteRequest)) *MockClientCommandsServer_AccountDelete_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcAccountDeleteRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_AccountDelete_Call) Return(_a0 *pb.RpcAccountDeleteResponse) *MockClientCommandsServer_AccountDelete_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_AccountDelete_Call) RunAndReturn(run func(context.Context, *pb.RpcAccountDeleteRequest) *pb.RpcAccountDeleteResponse) *MockClientCommandsServer_AccountDelete_Call { + _c.Call.Return(run) + return _c +} + +// AccountEnableLocalNetworkSync provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) AccountEnableLocalNetworkSync(_a0 context.Context, _a1 *pb.RpcAccountEnableLocalNetworkSyncRequest) *pb.RpcAccountEnableLocalNetworkSyncResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for AccountEnableLocalNetworkSync") + } + + var r0 *pb.RpcAccountEnableLocalNetworkSyncResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcAccountEnableLocalNetworkSyncRequest) *pb.RpcAccountEnableLocalNetworkSyncResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcAccountEnableLocalNetworkSyncResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_AccountEnableLocalNetworkSync_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'AccountEnableLocalNetworkSync' +type MockClientCommandsServer_AccountEnableLocalNetworkSync_Call struct { + *mock.Call +} + +// AccountEnableLocalNetworkSync is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcAccountEnableLocalNetworkSyncRequest +func (_e *MockClientCommandsServer_Expecter) AccountEnableLocalNetworkSync(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_AccountEnableLocalNetworkSync_Call { + return &MockClientCommandsServer_AccountEnableLocalNetworkSync_Call{Call: _e.mock.On("AccountEnableLocalNetworkSync", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_AccountEnableLocalNetworkSync_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcAccountEnableLocalNetworkSyncRequest)) *MockClientCommandsServer_AccountEnableLocalNetworkSync_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcAccountEnableLocalNetworkSyncRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_AccountEnableLocalNetworkSync_Call) Return(_a0 *pb.RpcAccountEnableLocalNetworkSyncResponse) *MockClientCommandsServer_AccountEnableLocalNetworkSync_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_AccountEnableLocalNetworkSync_Call) RunAndReturn(run func(context.Context, *pb.RpcAccountEnableLocalNetworkSyncRequest) *pb.RpcAccountEnableLocalNetworkSyncResponse) *MockClientCommandsServer_AccountEnableLocalNetworkSync_Call { + _c.Call.Return(run) + return _c +} + +// AccountLocalLinkNewChallenge provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) AccountLocalLinkNewChallenge(_a0 context.Context, _a1 *pb.RpcAccountLocalLinkNewChallengeRequest) *pb.RpcAccountLocalLinkNewChallengeResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for AccountLocalLinkNewChallenge") + } + + var r0 *pb.RpcAccountLocalLinkNewChallengeResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcAccountLocalLinkNewChallengeRequest) *pb.RpcAccountLocalLinkNewChallengeResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcAccountLocalLinkNewChallengeResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_AccountLocalLinkNewChallenge_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'AccountLocalLinkNewChallenge' +type MockClientCommandsServer_AccountLocalLinkNewChallenge_Call struct { + *mock.Call +} + +// AccountLocalLinkNewChallenge is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcAccountLocalLinkNewChallengeRequest +func (_e *MockClientCommandsServer_Expecter) AccountLocalLinkNewChallenge(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_AccountLocalLinkNewChallenge_Call { + return &MockClientCommandsServer_AccountLocalLinkNewChallenge_Call{Call: _e.mock.On("AccountLocalLinkNewChallenge", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_AccountLocalLinkNewChallenge_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcAccountLocalLinkNewChallengeRequest)) *MockClientCommandsServer_AccountLocalLinkNewChallenge_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcAccountLocalLinkNewChallengeRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_AccountLocalLinkNewChallenge_Call) Return(_a0 *pb.RpcAccountLocalLinkNewChallengeResponse) *MockClientCommandsServer_AccountLocalLinkNewChallenge_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_AccountLocalLinkNewChallenge_Call) RunAndReturn(run func(context.Context, *pb.RpcAccountLocalLinkNewChallengeRequest) *pb.RpcAccountLocalLinkNewChallengeResponse) *MockClientCommandsServer_AccountLocalLinkNewChallenge_Call { + _c.Call.Return(run) + return _c +} + +// AccountLocalLinkSolveChallenge provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) AccountLocalLinkSolveChallenge(_a0 context.Context, _a1 *pb.RpcAccountLocalLinkSolveChallengeRequest) *pb.RpcAccountLocalLinkSolveChallengeResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for AccountLocalLinkSolveChallenge") + } + + var r0 *pb.RpcAccountLocalLinkSolveChallengeResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcAccountLocalLinkSolveChallengeRequest) *pb.RpcAccountLocalLinkSolveChallengeResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcAccountLocalLinkSolveChallengeResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_AccountLocalLinkSolveChallenge_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'AccountLocalLinkSolveChallenge' +type MockClientCommandsServer_AccountLocalLinkSolveChallenge_Call struct { + *mock.Call +} + +// AccountLocalLinkSolveChallenge is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcAccountLocalLinkSolveChallengeRequest +func (_e *MockClientCommandsServer_Expecter) AccountLocalLinkSolveChallenge(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_AccountLocalLinkSolveChallenge_Call { + return &MockClientCommandsServer_AccountLocalLinkSolveChallenge_Call{Call: _e.mock.On("AccountLocalLinkSolveChallenge", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_AccountLocalLinkSolveChallenge_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcAccountLocalLinkSolveChallengeRequest)) *MockClientCommandsServer_AccountLocalLinkSolveChallenge_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcAccountLocalLinkSolveChallengeRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_AccountLocalLinkSolveChallenge_Call) Return(_a0 *pb.RpcAccountLocalLinkSolveChallengeResponse) *MockClientCommandsServer_AccountLocalLinkSolveChallenge_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_AccountLocalLinkSolveChallenge_Call) RunAndReturn(run func(context.Context, *pb.RpcAccountLocalLinkSolveChallengeRequest) *pb.RpcAccountLocalLinkSolveChallengeResponse) *MockClientCommandsServer_AccountLocalLinkSolveChallenge_Call { + _c.Call.Return(run) + return _c +} + +// AccountMove provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) AccountMove(_a0 context.Context, _a1 *pb.RpcAccountMoveRequest) *pb.RpcAccountMoveResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for AccountMove") + } + + var r0 *pb.RpcAccountMoveResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcAccountMoveRequest) *pb.RpcAccountMoveResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcAccountMoveResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_AccountMove_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'AccountMove' +type MockClientCommandsServer_AccountMove_Call struct { + *mock.Call +} + +// AccountMove is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcAccountMoveRequest +func (_e *MockClientCommandsServer_Expecter) AccountMove(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_AccountMove_Call { + return &MockClientCommandsServer_AccountMove_Call{Call: _e.mock.On("AccountMove", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_AccountMove_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcAccountMoveRequest)) *MockClientCommandsServer_AccountMove_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcAccountMoveRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_AccountMove_Call) Return(_a0 *pb.RpcAccountMoveResponse) *MockClientCommandsServer_AccountMove_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_AccountMove_Call) RunAndReturn(run func(context.Context, *pb.RpcAccountMoveRequest) *pb.RpcAccountMoveResponse) *MockClientCommandsServer_AccountMove_Call { + _c.Call.Return(run) + return _c +} + +// AccountRecover provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) AccountRecover(_a0 context.Context, _a1 *pb.RpcAccountRecoverRequest) *pb.RpcAccountRecoverResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for AccountRecover") + } + + var r0 *pb.RpcAccountRecoverResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcAccountRecoverRequest) *pb.RpcAccountRecoverResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcAccountRecoverResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_AccountRecover_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'AccountRecover' +type MockClientCommandsServer_AccountRecover_Call struct { + *mock.Call +} + +// AccountRecover is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcAccountRecoverRequest +func (_e *MockClientCommandsServer_Expecter) AccountRecover(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_AccountRecover_Call { + return &MockClientCommandsServer_AccountRecover_Call{Call: _e.mock.On("AccountRecover", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_AccountRecover_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcAccountRecoverRequest)) *MockClientCommandsServer_AccountRecover_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcAccountRecoverRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_AccountRecover_Call) Return(_a0 *pb.RpcAccountRecoverResponse) *MockClientCommandsServer_AccountRecover_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_AccountRecover_Call) RunAndReturn(run func(context.Context, *pb.RpcAccountRecoverRequest) *pb.RpcAccountRecoverResponse) *MockClientCommandsServer_AccountRecover_Call { + _c.Call.Return(run) + return _c +} + +// AccountRecoverFromLegacyExport provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) AccountRecoverFromLegacyExport(_a0 context.Context, _a1 *pb.RpcAccountRecoverFromLegacyExportRequest) *pb.RpcAccountRecoverFromLegacyExportResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for AccountRecoverFromLegacyExport") + } + + var r0 *pb.RpcAccountRecoverFromLegacyExportResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcAccountRecoverFromLegacyExportRequest) *pb.RpcAccountRecoverFromLegacyExportResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcAccountRecoverFromLegacyExportResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_AccountRecoverFromLegacyExport_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'AccountRecoverFromLegacyExport' +type MockClientCommandsServer_AccountRecoverFromLegacyExport_Call struct { + *mock.Call +} + +// AccountRecoverFromLegacyExport is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcAccountRecoverFromLegacyExportRequest +func (_e *MockClientCommandsServer_Expecter) AccountRecoverFromLegacyExport(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_AccountRecoverFromLegacyExport_Call { + return &MockClientCommandsServer_AccountRecoverFromLegacyExport_Call{Call: _e.mock.On("AccountRecoverFromLegacyExport", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_AccountRecoverFromLegacyExport_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcAccountRecoverFromLegacyExportRequest)) *MockClientCommandsServer_AccountRecoverFromLegacyExport_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcAccountRecoverFromLegacyExportRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_AccountRecoverFromLegacyExport_Call) Return(_a0 *pb.RpcAccountRecoverFromLegacyExportResponse) *MockClientCommandsServer_AccountRecoverFromLegacyExport_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_AccountRecoverFromLegacyExport_Call) RunAndReturn(run func(context.Context, *pb.RpcAccountRecoverFromLegacyExportRequest) *pb.RpcAccountRecoverFromLegacyExportResponse) *MockClientCommandsServer_AccountRecoverFromLegacyExport_Call { + _c.Call.Return(run) + return _c +} + +// AccountRevertDeletion provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) AccountRevertDeletion(_a0 context.Context, _a1 *pb.RpcAccountRevertDeletionRequest) *pb.RpcAccountRevertDeletionResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for AccountRevertDeletion") + } + + var r0 *pb.RpcAccountRevertDeletionResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcAccountRevertDeletionRequest) *pb.RpcAccountRevertDeletionResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcAccountRevertDeletionResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_AccountRevertDeletion_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'AccountRevertDeletion' +type MockClientCommandsServer_AccountRevertDeletion_Call struct { + *mock.Call +} + +// AccountRevertDeletion is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcAccountRevertDeletionRequest +func (_e *MockClientCommandsServer_Expecter) AccountRevertDeletion(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_AccountRevertDeletion_Call { + return &MockClientCommandsServer_AccountRevertDeletion_Call{Call: _e.mock.On("AccountRevertDeletion", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_AccountRevertDeletion_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcAccountRevertDeletionRequest)) *MockClientCommandsServer_AccountRevertDeletion_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcAccountRevertDeletionRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_AccountRevertDeletion_Call) Return(_a0 *pb.RpcAccountRevertDeletionResponse) *MockClientCommandsServer_AccountRevertDeletion_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_AccountRevertDeletion_Call) RunAndReturn(run func(context.Context, *pb.RpcAccountRevertDeletionRequest) *pb.RpcAccountRevertDeletionResponse) *MockClientCommandsServer_AccountRevertDeletion_Call { + _c.Call.Return(run) + return _c +} + +// AccountSelect provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) AccountSelect(_a0 context.Context, _a1 *pb.RpcAccountSelectRequest) *pb.RpcAccountSelectResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for AccountSelect") + } + + var r0 *pb.RpcAccountSelectResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcAccountSelectRequest) *pb.RpcAccountSelectResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcAccountSelectResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_AccountSelect_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'AccountSelect' +type MockClientCommandsServer_AccountSelect_Call struct { + *mock.Call +} + +// AccountSelect is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcAccountSelectRequest +func (_e *MockClientCommandsServer_Expecter) AccountSelect(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_AccountSelect_Call { + return &MockClientCommandsServer_AccountSelect_Call{Call: _e.mock.On("AccountSelect", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_AccountSelect_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcAccountSelectRequest)) *MockClientCommandsServer_AccountSelect_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcAccountSelectRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_AccountSelect_Call) Return(_a0 *pb.RpcAccountSelectResponse) *MockClientCommandsServer_AccountSelect_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_AccountSelect_Call) RunAndReturn(run func(context.Context, *pb.RpcAccountSelectRequest) *pb.RpcAccountSelectResponse) *MockClientCommandsServer_AccountSelect_Call { + _c.Call.Return(run) + return _c +} + +// AccountStop provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) AccountStop(_a0 context.Context, _a1 *pb.RpcAccountStopRequest) *pb.RpcAccountStopResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for AccountStop") + } + + var r0 *pb.RpcAccountStopResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcAccountStopRequest) *pb.RpcAccountStopResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcAccountStopResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_AccountStop_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'AccountStop' +type MockClientCommandsServer_AccountStop_Call struct { + *mock.Call +} + +// AccountStop is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcAccountStopRequest +func (_e *MockClientCommandsServer_Expecter) AccountStop(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_AccountStop_Call { + return &MockClientCommandsServer_AccountStop_Call{Call: _e.mock.On("AccountStop", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_AccountStop_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcAccountStopRequest)) *MockClientCommandsServer_AccountStop_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcAccountStopRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_AccountStop_Call) Return(_a0 *pb.RpcAccountStopResponse) *MockClientCommandsServer_AccountStop_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_AccountStop_Call) RunAndReturn(run func(context.Context, *pb.RpcAccountStopRequest) *pb.RpcAccountStopResponse) *MockClientCommandsServer_AccountStop_Call { + _c.Call.Return(run) + return _c +} + +// AppGetVersion provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) AppGetVersion(_a0 context.Context, _a1 *pb.RpcAppGetVersionRequest) *pb.RpcAppGetVersionResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for AppGetVersion") + } + + var r0 *pb.RpcAppGetVersionResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcAppGetVersionRequest) *pb.RpcAppGetVersionResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcAppGetVersionResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_AppGetVersion_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'AppGetVersion' +type MockClientCommandsServer_AppGetVersion_Call struct { + *mock.Call +} + +// AppGetVersion is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcAppGetVersionRequest +func (_e *MockClientCommandsServer_Expecter) AppGetVersion(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_AppGetVersion_Call { + return &MockClientCommandsServer_AppGetVersion_Call{Call: _e.mock.On("AppGetVersion", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_AppGetVersion_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcAppGetVersionRequest)) *MockClientCommandsServer_AppGetVersion_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcAppGetVersionRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_AppGetVersion_Call) Return(_a0 *pb.RpcAppGetVersionResponse) *MockClientCommandsServer_AppGetVersion_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_AppGetVersion_Call) RunAndReturn(run func(context.Context, *pb.RpcAppGetVersionRequest) *pb.RpcAppGetVersionResponse) *MockClientCommandsServer_AppGetVersion_Call { + _c.Call.Return(run) + return _c +} + +// AppSetDeviceState provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) AppSetDeviceState(_a0 context.Context, _a1 *pb.RpcAppSetDeviceStateRequest) *pb.RpcAppSetDeviceStateResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for AppSetDeviceState") + } + + var r0 *pb.RpcAppSetDeviceStateResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcAppSetDeviceStateRequest) *pb.RpcAppSetDeviceStateResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcAppSetDeviceStateResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_AppSetDeviceState_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'AppSetDeviceState' +type MockClientCommandsServer_AppSetDeviceState_Call struct { + *mock.Call +} + +// AppSetDeviceState is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcAppSetDeviceStateRequest +func (_e *MockClientCommandsServer_Expecter) AppSetDeviceState(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_AppSetDeviceState_Call { + return &MockClientCommandsServer_AppSetDeviceState_Call{Call: _e.mock.On("AppSetDeviceState", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_AppSetDeviceState_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcAppSetDeviceStateRequest)) *MockClientCommandsServer_AppSetDeviceState_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcAppSetDeviceStateRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_AppSetDeviceState_Call) Return(_a0 *pb.RpcAppSetDeviceStateResponse) *MockClientCommandsServer_AppSetDeviceState_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_AppSetDeviceState_Call) RunAndReturn(run func(context.Context, *pb.RpcAppSetDeviceStateRequest) *pb.RpcAppSetDeviceStateResponse) *MockClientCommandsServer_AppSetDeviceState_Call { + _c.Call.Return(run) + return _c +} + +// AppShutdown provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) AppShutdown(_a0 context.Context, _a1 *pb.RpcAppShutdownRequest) *pb.RpcAppShutdownResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for AppShutdown") + } + + var r0 *pb.RpcAppShutdownResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcAppShutdownRequest) *pb.RpcAppShutdownResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcAppShutdownResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_AppShutdown_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'AppShutdown' +type MockClientCommandsServer_AppShutdown_Call struct { + *mock.Call +} + +// AppShutdown is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcAppShutdownRequest +func (_e *MockClientCommandsServer_Expecter) AppShutdown(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_AppShutdown_Call { + return &MockClientCommandsServer_AppShutdown_Call{Call: _e.mock.On("AppShutdown", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_AppShutdown_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcAppShutdownRequest)) *MockClientCommandsServer_AppShutdown_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcAppShutdownRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_AppShutdown_Call) Return(_a0 *pb.RpcAppShutdownResponse) *MockClientCommandsServer_AppShutdown_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_AppShutdown_Call) RunAndReturn(run func(context.Context, *pb.RpcAppShutdownRequest) *pb.RpcAppShutdownResponse) *MockClientCommandsServer_AppShutdown_Call { + _c.Call.Return(run) + return _c +} + +// BlockBookmarkCreateAndFetch provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) BlockBookmarkCreateAndFetch(_a0 context.Context, _a1 *pb.RpcBlockBookmarkCreateAndFetchRequest) *pb.RpcBlockBookmarkCreateAndFetchResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for BlockBookmarkCreateAndFetch") + } + + var r0 *pb.RpcBlockBookmarkCreateAndFetchResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcBlockBookmarkCreateAndFetchRequest) *pb.RpcBlockBookmarkCreateAndFetchResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcBlockBookmarkCreateAndFetchResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_BlockBookmarkCreateAndFetch_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'BlockBookmarkCreateAndFetch' +type MockClientCommandsServer_BlockBookmarkCreateAndFetch_Call struct { + *mock.Call +} + +// BlockBookmarkCreateAndFetch is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcBlockBookmarkCreateAndFetchRequest +func (_e *MockClientCommandsServer_Expecter) BlockBookmarkCreateAndFetch(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_BlockBookmarkCreateAndFetch_Call { + return &MockClientCommandsServer_BlockBookmarkCreateAndFetch_Call{Call: _e.mock.On("BlockBookmarkCreateAndFetch", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_BlockBookmarkCreateAndFetch_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcBlockBookmarkCreateAndFetchRequest)) *MockClientCommandsServer_BlockBookmarkCreateAndFetch_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcBlockBookmarkCreateAndFetchRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_BlockBookmarkCreateAndFetch_Call) Return(_a0 *pb.RpcBlockBookmarkCreateAndFetchResponse) *MockClientCommandsServer_BlockBookmarkCreateAndFetch_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_BlockBookmarkCreateAndFetch_Call) RunAndReturn(run func(context.Context, *pb.RpcBlockBookmarkCreateAndFetchRequest) *pb.RpcBlockBookmarkCreateAndFetchResponse) *MockClientCommandsServer_BlockBookmarkCreateAndFetch_Call { + _c.Call.Return(run) + return _c +} + +// BlockBookmarkFetch provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) BlockBookmarkFetch(_a0 context.Context, _a1 *pb.RpcBlockBookmarkFetchRequest) *pb.RpcBlockBookmarkFetchResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for BlockBookmarkFetch") + } + + var r0 *pb.RpcBlockBookmarkFetchResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcBlockBookmarkFetchRequest) *pb.RpcBlockBookmarkFetchResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcBlockBookmarkFetchResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_BlockBookmarkFetch_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'BlockBookmarkFetch' +type MockClientCommandsServer_BlockBookmarkFetch_Call struct { + *mock.Call +} + +// BlockBookmarkFetch is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcBlockBookmarkFetchRequest +func (_e *MockClientCommandsServer_Expecter) BlockBookmarkFetch(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_BlockBookmarkFetch_Call { + return &MockClientCommandsServer_BlockBookmarkFetch_Call{Call: _e.mock.On("BlockBookmarkFetch", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_BlockBookmarkFetch_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcBlockBookmarkFetchRequest)) *MockClientCommandsServer_BlockBookmarkFetch_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcBlockBookmarkFetchRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_BlockBookmarkFetch_Call) Return(_a0 *pb.RpcBlockBookmarkFetchResponse) *MockClientCommandsServer_BlockBookmarkFetch_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_BlockBookmarkFetch_Call) RunAndReturn(run func(context.Context, *pb.RpcBlockBookmarkFetchRequest) *pb.RpcBlockBookmarkFetchResponse) *MockClientCommandsServer_BlockBookmarkFetch_Call { + _c.Call.Return(run) + return _c +} + +// BlockCopy provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) BlockCopy(_a0 context.Context, _a1 *pb.RpcBlockCopyRequest) *pb.RpcBlockCopyResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for BlockCopy") + } + + var r0 *pb.RpcBlockCopyResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcBlockCopyRequest) *pb.RpcBlockCopyResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcBlockCopyResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_BlockCopy_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'BlockCopy' +type MockClientCommandsServer_BlockCopy_Call struct { + *mock.Call +} + +// BlockCopy is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcBlockCopyRequest +func (_e *MockClientCommandsServer_Expecter) BlockCopy(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_BlockCopy_Call { + return &MockClientCommandsServer_BlockCopy_Call{Call: _e.mock.On("BlockCopy", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_BlockCopy_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcBlockCopyRequest)) *MockClientCommandsServer_BlockCopy_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcBlockCopyRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_BlockCopy_Call) Return(_a0 *pb.RpcBlockCopyResponse) *MockClientCommandsServer_BlockCopy_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_BlockCopy_Call) RunAndReturn(run func(context.Context, *pb.RpcBlockCopyRequest) *pb.RpcBlockCopyResponse) *MockClientCommandsServer_BlockCopy_Call { + _c.Call.Return(run) + return _c +} + +// BlockCreate provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) BlockCreate(_a0 context.Context, _a1 *pb.RpcBlockCreateRequest) *pb.RpcBlockCreateResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for BlockCreate") + } + + var r0 *pb.RpcBlockCreateResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcBlockCreateRequest) *pb.RpcBlockCreateResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcBlockCreateResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_BlockCreate_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'BlockCreate' +type MockClientCommandsServer_BlockCreate_Call struct { + *mock.Call +} + +// BlockCreate is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcBlockCreateRequest +func (_e *MockClientCommandsServer_Expecter) BlockCreate(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_BlockCreate_Call { + return &MockClientCommandsServer_BlockCreate_Call{Call: _e.mock.On("BlockCreate", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_BlockCreate_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcBlockCreateRequest)) *MockClientCommandsServer_BlockCreate_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcBlockCreateRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_BlockCreate_Call) Return(_a0 *pb.RpcBlockCreateResponse) *MockClientCommandsServer_BlockCreate_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_BlockCreate_Call) RunAndReturn(run func(context.Context, *pb.RpcBlockCreateRequest) *pb.RpcBlockCreateResponse) *MockClientCommandsServer_BlockCreate_Call { + _c.Call.Return(run) + return _c +} + +// BlockCreateWidget provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) BlockCreateWidget(_a0 context.Context, _a1 *pb.RpcBlockCreateWidgetRequest) *pb.RpcBlockCreateWidgetResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for BlockCreateWidget") + } + + var r0 *pb.RpcBlockCreateWidgetResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcBlockCreateWidgetRequest) *pb.RpcBlockCreateWidgetResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcBlockCreateWidgetResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_BlockCreateWidget_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'BlockCreateWidget' +type MockClientCommandsServer_BlockCreateWidget_Call struct { + *mock.Call +} + +// BlockCreateWidget is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcBlockCreateWidgetRequest +func (_e *MockClientCommandsServer_Expecter) BlockCreateWidget(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_BlockCreateWidget_Call { + return &MockClientCommandsServer_BlockCreateWidget_Call{Call: _e.mock.On("BlockCreateWidget", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_BlockCreateWidget_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcBlockCreateWidgetRequest)) *MockClientCommandsServer_BlockCreateWidget_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcBlockCreateWidgetRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_BlockCreateWidget_Call) Return(_a0 *pb.RpcBlockCreateWidgetResponse) *MockClientCommandsServer_BlockCreateWidget_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_BlockCreateWidget_Call) RunAndReturn(run func(context.Context, *pb.RpcBlockCreateWidgetRequest) *pb.RpcBlockCreateWidgetResponse) *MockClientCommandsServer_BlockCreateWidget_Call { + _c.Call.Return(run) + return _c +} + +// BlockCut provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) BlockCut(_a0 context.Context, _a1 *pb.RpcBlockCutRequest) *pb.RpcBlockCutResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for BlockCut") + } + + var r0 *pb.RpcBlockCutResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcBlockCutRequest) *pb.RpcBlockCutResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcBlockCutResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_BlockCut_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'BlockCut' +type MockClientCommandsServer_BlockCut_Call struct { + *mock.Call +} + +// BlockCut is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcBlockCutRequest +func (_e *MockClientCommandsServer_Expecter) BlockCut(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_BlockCut_Call { + return &MockClientCommandsServer_BlockCut_Call{Call: _e.mock.On("BlockCut", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_BlockCut_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcBlockCutRequest)) *MockClientCommandsServer_BlockCut_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcBlockCutRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_BlockCut_Call) Return(_a0 *pb.RpcBlockCutResponse) *MockClientCommandsServer_BlockCut_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_BlockCut_Call) RunAndReturn(run func(context.Context, *pb.RpcBlockCutRequest) *pb.RpcBlockCutResponse) *MockClientCommandsServer_BlockCut_Call { + _c.Call.Return(run) + return _c +} + +// BlockDataviewCreateFromExistingObject provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) BlockDataviewCreateFromExistingObject(_a0 context.Context, _a1 *pb.RpcBlockDataviewCreateFromExistingObjectRequest) *pb.RpcBlockDataviewCreateFromExistingObjectResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for BlockDataviewCreateFromExistingObject") + } + + var r0 *pb.RpcBlockDataviewCreateFromExistingObjectResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcBlockDataviewCreateFromExistingObjectRequest) *pb.RpcBlockDataviewCreateFromExistingObjectResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcBlockDataviewCreateFromExistingObjectResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_BlockDataviewCreateFromExistingObject_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'BlockDataviewCreateFromExistingObject' +type MockClientCommandsServer_BlockDataviewCreateFromExistingObject_Call struct { + *mock.Call +} + +// BlockDataviewCreateFromExistingObject is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcBlockDataviewCreateFromExistingObjectRequest +func (_e *MockClientCommandsServer_Expecter) BlockDataviewCreateFromExistingObject(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_BlockDataviewCreateFromExistingObject_Call { + return &MockClientCommandsServer_BlockDataviewCreateFromExistingObject_Call{Call: _e.mock.On("BlockDataviewCreateFromExistingObject", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_BlockDataviewCreateFromExistingObject_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcBlockDataviewCreateFromExistingObjectRequest)) *MockClientCommandsServer_BlockDataviewCreateFromExistingObject_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcBlockDataviewCreateFromExistingObjectRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_BlockDataviewCreateFromExistingObject_Call) Return(_a0 *pb.RpcBlockDataviewCreateFromExistingObjectResponse) *MockClientCommandsServer_BlockDataviewCreateFromExistingObject_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_BlockDataviewCreateFromExistingObject_Call) RunAndReturn(run func(context.Context, *pb.RpcBlockDataviewCreateFromExistingObjectRequest) *pb.RpcBlockDataviewCreateFromExistingObjectResponse) *MockClientCommandsServer_BlockDataviewCreateFromExistingObject_Call { + _c.Call.Return(run) + return _c +} + +// BlockDataviewFilterAdd provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) BlockDataviewFilterAdd(_a0 context.Context, _a1 *pb.RpcBlockDataviewFilterAddRequest) *pb.RpcBlockDataviewFilterAddResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for BlockDataviewFilterAdd") + } + + var r0 *pb.RpcBlockDataviewFilterAddResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcBlockDataviewFilterAddRequest) *pb.RpcBlockDataviewFilterAddResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcBlockDataviewFilterAddResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_BlockDataviewFilterAdd_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'BlockDataviewFilterAdd' +type MockClientCommandsServer_BlockDataviewFilterAdd_Call struct { + *mock.Call +} + +// BlockDataviewFilterAdd is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcBlockDataviewFilterAddRequest +func (_e *MockClientCommandsServer_Expecter) BlockDataviewFilterAdd(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_BlockDataviewFilterAdd_Call { + return &MockClientCommandsServer_BlockDataviewFilterAdd_Call{Call: _e.mock.On("BlockDataviewFilterAdd", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_BlockDataviewFilterAdd_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcBlockDataviewFilterAddRequest)) *MockClientCommandsServer_BlockDataviewFilterAdd_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcBlockDataviewFilterAddRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_BlockDataviewFilterAdd_Call) Return(_a0 *pb.RpcBlockDataviewFilterAddResponse) *MockClientCommandsServer_BlockDataviewFilterAdd_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_BlockDataviewFilterAdd_Call) RunAndReturn(run func(context.Context, *pb.RpcBlockDataviewFilterAddRequest) *pb.RpcBlockDataviewFilterAddResponse) *MockClientCommandsServer_BlockDataviewFilterAdd_Call { + _c.Call.Return(run) + return _c +} + +// BlockDataviewFilterRemove provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) BlockDataviewFilterRemove(_a0 context.Context, _a1 *pb.RpcBlockDataviewFilterRemoveRequest) *pb.RpcBlockDataviewFilterRemoveResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for BlockDataviewFilterRemove") + } + + var r0 *pb.RpcBlockDataviewFilterRemoveResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcBlockDataviewFilterRemoveRequest) *pb.RpcBlockDataviewFilterRemoveResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcBlockDataviewFilterRemoveResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_BlockDataviewFilterRemove_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'BlockDataviewFilterRemove' +type MockClientCommandsServer_BlockDataviewFilterRemove_Call struct { + *mock.Call +} + +// BlockDataviewFilterRemove is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcBlockDataviewFilterRemoveRequest +func (_e *MockClientCommandsServer_Expecter) BlockDataviewFilterRemove(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_BlockDataviewFilterRemove_Call { + return &MockClientCommandsServer_BlockDataviewFilterRemove_Call{Call: _e.mock.On("BlockDataviewFilterRemove", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_BlockDataviewFilterRemove_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcBlockDataviewFilterRemoveRequest)) *MockClientCommandsServer_BlockDataviewFilterRemove_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcBlockDataviewFilterRemoveRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_BlockDataviewFilterRemove_Call) Return(_a0 *pb.RpcBlockDataviewFilterRemoveResponse) *MockClientCommandsServer_BlockDataviewFilterRemove_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_BlockDataviewFilterRemove_Call) RunAndReturn(run func(context.Context, *pb.RpcBlockDataviewFilterRemoveRequest) *pb.RpcBlockDataviewFilterRemoveResponse) *MockClientCommandsServer_BlockDataviewFilterRemove_Call { + _c.Call.Return(run) + return _c +} + +// BlockDataviewFilterReplace provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) BlockDataviewFilterReplace(_a0 context.Context, _a1 *pb.RpcBlockDataviewFilterReplaceRequest) *pb.RpcBlockDataviewFilterReplaceResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for BlockDataviewFilterReplace") + } + + var r0 *pb.RpcBlockDataviewFilterReplaceResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcBlockDataviewFilterReplaceRequest) *pb.RpcBlockDataviewFilterReplaceResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcBlockDataviewFilterReplaceResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_BlockDataviewFilterReplace_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'BlockDataviewFilterReplace' +type MockClientCommandsServer_BlockDataviewFilterReplace_Call struct { + *mock.Call +} + +// BlockDataviewFilterReplace is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcBlockDataviewFilterReplaceRequest +func (_e *MockClientCommandsServer_Expecter) BlockDataviewFilterReplace(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_BlockDataviewFilterReplace_Call { + return &MockClientCommandsServer_BlockDataviewFilterReplace_Call{Call: _e.mock.On("BlockDataviewFilterReplace", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_BlockDataviewFilterReplace_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcBlockDataviewFilterReplaceRequest)) *MockClientCommandsServer_BlockDataviewFilterReplace_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcBlockDataviewFilterReplaceRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_BlockDataviewFilterReplace_Call) Return(_a0 *pb.RpcBlockDataviewFilterReplaceResponse) *MockClientCommandsServer_BlockDataviewFilterReplace_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_BlockDataviewFilterReplace_Call) RunAndReturn(run func(context.Context, *pb.RpcBlockDataviewFilterReplaceRequest) *pb.RpcBlockDataviewFilterReplaceResponse) *MockClientCommandsServer_BlockDataviewFilterReplace_Call { + _c.Call.Return(run) + return _c +} + +// BlockDataviewFilterSort provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) BlockDataviewFilterSort(_a0 context.Context, _a1 *pb.RpcBlockDataviewFilterSortRequest) *pb.RpcBlockDataviewFilterSortResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for BlockDataviewFilterSort") + } + + var r0 *pb.RpcBlockDataviewFilterSortResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcBlockDataviewFilterSortRequest) *pb.RpcBlockDataviewFilterSortResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcBlockDataviewFilterSortResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_BlockDataviewFilterSort_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'BlockDataviewFilterSort' +type MockClientCommandsServer_BlockDataviewFilterSort_Call struct { + *mock.Call +} + +// BlockDataviewFilterSort is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcBlockDataviewFilterSortRequest +func (_e *MockClientCommandsServer_Expecter) BlockDataviewFilterSort(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_BlockDataviewFilterSort_Call { + return &MockClientCommandsServer_BlockDataviewFilterSort_Call{Call: _e.mock.On("BlockDataviewFilterSort", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_BlockDataviewFilterSort_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcBlockDataviewFilterSortRequest)) *MockClientCommandsServer_BlockDataviewFilterSort_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcBlockDataviewFilterSortRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_BlockDataviewFilterSort_Call) Return(_a0 *pb.RpcBlockDataviewFilterSortResponse) *MockClientCommandsServer_BlockDataviewFilterSort_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_BlockDataviewFilterSort_Call) RunAndReturn(run func(context.Context, *pb.RpcBlockDataviewFilterSortRequest) *pb.RpcBlockDataviewFilterSortResponse) *MockClientCommandsServer_BlockDataviewFilterSort_Call { + _c.Call.Return(run) + return _c +} + +// BlockDataviewGroupOrderUpdate provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) BlockDataviewGroupOrderUpdate(_a0 context.Context, _a1 *pb.RpcBlockDataviewGroupOrderUpdateRequest) *pb.RpcBlockDataviewGroupOrderUpdateResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for BlockDataviewGroupOrderUpdate") + } + + var r0 *pb.RpcBlockDataviewGroupOrderUpdateResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcBlockDataviewGroupOrderUpdateRequest) *pb.RpcBlockDataviewGroupOrderUpdateResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcBlockDataviewGroupOrderUpdateResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_BlockDataviewGroupOrderUpdate_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'BlockDataviewGroupOrderUpdate' +type MockClientCommandsServer_BlockDataviewGroupOrderUpdate_Call struct { + *mock.Call +} + +// BlockDataviewGroupOrderUpdate is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcBlockDataviewGroupOrderUpdateRequest +func (_e *MockClientCommandsServer_Expecter) BlockDataviewGroupOrderUpdate(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_BlockDataviewGroupOrderUpdate_Call { + return &MockClientCommandsServer_BlockDataviewGroupOrderUpdate_Call{Call: _e.mock.On("BlockDataviewGroupOrderUpdate", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_BlockDataviewGroupOrderUpdate_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcBlockDataviewGroupOrderUpdateRequest)) *MockClientCommandsServer_BlockDataviewGroupOrderUpdate_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcBlockDataviewGroupOrderUpdateRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_BlockDataviewGroupOrderUpdate_Call) Return(_a0 *pb.RpcBlockDataviewGroupOrderUpdateResponse) *MockClientCommandsServer_BlockDataviewGroupOrderUpdate_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_BlockDataviewGroupOrderUpdate_Call) RunAndReturn(run func(context.Context, *pb.RpcBlockDataviewGroupOrderUpdateRequest) *pb.RpcBlockDataviewGroupOrderUpdateResponse) *MockClientCommandsServer_BlockDataviewGroupOrderUpdate_Call { + _c.Call.Return(run) + return _c +} + +// BlockDataviewObjectOrderMove provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) BlockDataviewObjectOrderMove(_a0 context.Context, _a1 *pb.RpcBlockDataviewObjectOrderMoveRequest) *pb.RpcBlockDataviewObjectOrderMoveResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for BlockDataviewObjectOrderMove") + } + + var r0 *pb.RpcBlockDataviewObjectOrderMoveResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcBlockDataviewObjectOrderMoveRequest) *pb.RpcBlockDataviewObjectOrderMoveResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcBlockDataviewObjectOrderMoveResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_BlockDataviewObjectOrderMove_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'BlockDataviewObjectOrderMove' +type MockClientCommandsServer_BlockDataviewObjectOrderMove_Call struct { + *mock.Call +} + +// BlockDataviewObjectOrderMove is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcBlockDataviewObjectOrderMoveRequest +func (_e *MockClientCommandsServer_Expecter) BlockDataviewObjectOrderMove(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_BlockDataviewObjectOrderMove_Call { + return &MockClientCommandsServer_BlockDataviewObjectOrderMove_Call{Call: _e.mock.On("BlockDataviewObjectOrderMove", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_BlockDataviewObjectOrderMove_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcBlockDataviewObjectOrderMoveRequest)) *MockClientCommandsServer_BlockDataviewObjectOrderMove_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcBlockDataviewObjectOrderMoveRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_BlockDataviewObjectOrderMove_Call) Return(_a0 *pb.RpcBlockDataviewObjectOrderMoveResponse) *MockClientCommandsServer_BlockDataviewObjectOrderMove_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_BlockDataviewObjectOrderMove_Call) RunAndReturn(run func(context.Context, *pb.RpcBlockDataviewObjectOrderMoveRequest) *pb.RpcBlockDataviewObjectOrderMoveResponse) *MockClientCommandsServer_BlockDataviewObjectOrderMove_Call { + _c.Call.Return(run) + return _c +} + +// BlockDataviewObjectOrderUpdate provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) BlockDataviewObjectOrderUpdate(_a0 context.Context, _a1 *pb.RpcBlockDataviewObjectOrderUpdateRequest) *pb.RpcBlockDataviewObjectOrderUpdateResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for BlockDataviewObjectOrderUpdate") + } + + var r0 *pb.RpcBlockDataviewObjectOrderUpdateResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcBlockDataviewObjectOrderUpdateRequest) *pb.RpcBlockDataviewObjectOrderUpdateResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcBlockDataviewObjectOrderUpdateResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_BlockDataviewObjectOrderUpdate_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'BlockDataviewObjectOrderUpdate' +type MockClientCommandsServer_BlockDataviewObjectOrderUpdate_Call struct { + *mock.Call +} + +// BlockDataviewObjectOrderUpdate is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcBlockDataviewObjectOrderUpdateRequest +func (_e *MockClientCommandsServer_Expecter) BlockDataviewObjectOrderUpdate(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_BlockDataviewObjectOrderUpdate_Call { + return &MockClientCommandsServer_BlockDataviewObjectOrderUpdate_Call{Call: _e.mock.On("BlockDataviewObjectOrderUpdate", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_BlockDataviewObjectOrderUpdate_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcBlockDataviewObjectOrderUpdateRequest)) *MockClientCommandsServer_BlockDataviewObjectOrderUpdate_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcBlockDataviewObjectOrderUpdateRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_BlockDataviewObjectOrderUpdate_Call) Return(_a0 *pb.RpcBlockDataviewObjectOrderUpdateResponse) *MockClientCommandsServer_BlockDataviewObjectOrderUpdate_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_BlockDataviewObjectOrderUpdate_Call) RunAndReturn(run func(context.Context, *pb.RpcBlockDataviewObjectOrderUpdateRequest) *pb.RpcBlockDataviewObjectOrderUpdateResponse) *MockClientCommandsServer_BlockDataviewObjectOrderUpdate_Call { + _c.Call.Return(run) + return _c +} + +// BlockDataviewRelationAdd provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) BlockDataviewRelationAdd(_a0 context.Context, _a1 *pb.RpcBlockDataviewRelationAddRequest) *pb.RpcBlockDataviewRelationAddResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for BlockDataviewRelationAdd") + } + + var r0 *pb.RpcBlockDataviewRelationAddResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcBlockDataviewRelationAddRequest) *pb.RpcBlockDataviewRelationAddResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcBlockDataviewRelationAddResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_BlockDataviewRelationAdd_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'BlockDataviewRelationAdd' +type MockClientCommandsServer_BlockDataviewRelationAdd_Call struct { + *mock.Call +} + +// BlockDataviewRelationAdd is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcBlockDataviewRelationAddRequest +func (_e *MockClientCommandsServer_Expecter) BlockDataviewRelationAdd(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_BlockDataviewRelationAdd_Call { + return &MockClientCommandsServer_BlockDataviewRelationAdd_Call{Call: _e.mock.On("BlockDataviewRelationAdd", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_BlockDataviewRelationAdd_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcBlockDataviewRelationAddRequest)) *MockClientCommandsServer_BlockDataviewRelationAdd_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcBlockDataviewRelationAddRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_BlockDataviewRelationAdd_Call) Return(_a0 *pb.RpcBlockDataviewRelationAddResponse) *MockClientCommandsServer_BlockDataviewRelationAdd_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_BlockDataviewRelationAdd_Call) RunAndReturn(run func(context.Context, *pb.RpcBlockDataviewRelationAddRequest) *pb.RpcBlockDataviewRelationAddResponse) *MockClientCommandsServer_BlockDataviewRelationAdd_Call { + _c.Call.Return(run) + return _c +} + +// BlockDataviewRelationDelete provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) BlockDataviewRelationDelete(_a0 context.Context, _a1 *pb.RpcBlockDataviewRelationDeleteRequest) *pb.RpcBlockDataviewRelationDeleteResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for BlockDataviewRelationDelete") + } + + var r0 *pb.RpcBlockDataviewRelationDeleteResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcBlockDataviewRelationDeleteRequest) *pb.RpcBlockDataviewRelationDeleteResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcBlockDataviewRelationDeleteResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_BlockDataviewRelationDelete_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'BlockDataviewRelationDelete' +type MockClientCommandsServer_BlockDataviewRelationDelete_Call struct { + *mock.Call +} + +// BlockDataviewRelationDelete is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcBlockDataviewRelationDeleteRequest +func (_e *MockClientCommandsServer_Expecter) BlockDataviewRelationDelete(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_BlockDataviewRelationDelete_Call { + return &MockClientCommandsServer_BlockDataviewRelationDelete_Call{Call: _e.mock.On("BlockDataviewRelationDelete", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_BlockDataviewRelationDelete_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcBlockDataviewRelationDeleteRequest)) *MockClientCommandsServer_BlockDataviewRelationDelete_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcBlockDataviewRelationDeleteRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_BlockDataviewRelationDelete_Call) Return(_a0 *pb.RpcBlockDataviewRelationDeleteResponse) *MockClientCommandsServer_BlockDataviewRelationDelete_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_BlockDataviewRelationDelete_Call) RunAndReturn(run func(context.Context, *pb.RpcBlockDataviewRelationDeleteRequest) *pb.RpcBlockDataviewRelationDeleteResponse) *MockClientCommandsServer_BlockDataviewRelationDelete_Call { + _c.Call.Return(run) + return _c +} + +// BlockDataviewSetSource provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) BlockDataviewSetSource(_a0 context.Context, _a1 *pb.RpcBlockDataviewSetSourceRequest) *pb.RpcBlockDataviewSetSourceResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for BlockDataviewSetSource") + } + + var r0 *pb.RpcBlockDataviewSetSourceResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcBlockDataviewSetSourceRequest) *pb.RpcBlockDataviewSetSourceResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcBlockDataviewSetSourceResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_BlockDataviewSetSource_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'BlockDataviewSetSource' +type MockClientCommandsServer_BlockDataviewSetSource_Call struct { + *mock.Call +} + +// BlockDataviewSetSource is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcBlockDataviewSetSourceRequest +func (_e *MockClientCommandsServer_Expecter) BlockDataviewSetSource(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_BlockDataviewSetSource_Call { + return &MockClientCommandsServer_BlockDataviewSetSource_Call{Call: _e.mock.On("BlockDataviewSetSource", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_BlockDataviewSetSource_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcBlockDataviewSetSourceRequest)) *MockClientCommandsServer_BlockDataviewSetSource_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcBlockDataviewSetSourceRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_BlockDataviewSetSource_Call) Return(_a0 *pb.RpcBlockDataviewSetSourceResponse) *MockClientCommandsServer_BlockDataviewSetSource_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_BlockDataviewSetSource_Call) RunAndReturn(run func(context.Context, *pb.RpcBlockDataviewSetSourceRequest) *pb.RpcBlockDataviewSetSourceResponse) *MockClientCommandsServer_BlockDataviewSetSource_Call { + _c.Call.Return(run) + return _c +} + +// BlockDataviewSortAdd provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) BlockDataviewSortAdd(_a0 context.Context, _a1 *pb.RpcBlockDataviewSortAddRequest) *pb.RpcBlockDataviewSortAddResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for BlockDataviewSortAdd") + } + + var r0 *pb.RpcBlockDataviewSortAddResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcBlockDataviewSortAddRequest) *pb.RpcBlockDataviewSortAddResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcBlockDataviewSortAddResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_BlockDataviewSortAdd_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'BlockDataviewSortAdd' +type MockClientCommandsServer_BlockDataviewSortAdd_Call struct { + *mock.Call +} + +// BlockDataviewSortAdd is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcBlockDataviewSortAddRequest +func (_e *MockClientCommandsServer_Expecter) BlockDataviewSortAdd(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_BlockDataviewSortAdd_Call { + return &MockClientCommandsServer_BlockDataviewSortAdd_Call{Call: _e.mock.On("BlockDataviewSortAdd", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_BlockDataviewSortAdd_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcBlockDataviewSortAddRequest)) *MockClientCommandsServer_BlockDataviewSortAdd_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcBlockDataviewSortAddRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_BlockDataviewSortAdd_Call) Return(_a0 *pb.RpcBlockDataviewSortAddResponse) *MockClientCommandsServer_BlockDataviewSortAdd_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_BlockDataviewSortAdd_Call) RunAndReturn(run func(context.Context, *pb.RpcBlockDataviewSortAddRequest) *pb.RpcBlockDataviewSortAddResponse) *MockClientCommandsServer_BlockDataviewSortAdd_Call { + _c.Call.Return(run) + return _c +} + +// BlockDataviewSortRemove provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) BlockDataviewSortRemove(_a0 context.Context, _a1 *pb.RpcBlockDataviewSortRemoveRequest) *pb.RpcBlockDataviewSortRemoveResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for BlockDataviewSortRemove") + } + + var r0 *pb.RpcBlockDataviewSortRemoveResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcBlockDataviewSortRemoveRequest) *pb.RpcBlockDataviewSortRemoveResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcBlockDataviewSortRemoveResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_BlockDataviewSortRemove_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'BlockDataviewSortRemove' +type MockClientCommandsServer_BlockDataviewSortRemove_Call struct { + *mock.Call +} + +// BlockDataviewSortRemove is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcBlockDataviewSortRemoveRequest +func (_e *MockClientCommandsServer_Expecter) BlockDataviewSortRemove(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_BlockDataviewSortRemove_Call { + return &MockClientCommandsServer_BlockDataviewSortRemove_Call{Call: _e.mock.On("BlockDataviewSortRemove", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_BlockDataviewSortRemove_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcBlockDataviewSortRemoveRequest)) *MockClientCommandsServer_BlockDataviewSortRemove_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcBlockDataviewSortRemoveRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_BlockDataviewSortRemove_Call) Return(_a0 *pb.RpcBlockDataviewSortRemoveResponse) *MockClientCommandsServer_BlockDataviewSortRemove_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_BlockDataviewSortRemove_Call) RunAndReturn(run func(context.Context, *pb.RpcBlockDataviewSortRemoveRequest) *pb.RpcBlockDataviewSortRemoveResponse) *MockClientCommandsServer_BlockDataviewSortRemove_Call { + _c.Call.Return(run) + return _c +} + +// BlockDataviewSortReplace provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) BlockDataviewSortReplace(_a0 context.Context, _a1 *pb.RpcBlockDataviewSortReplaceRequest) *pb.RpcBlockDataviewSortReplaceResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for BlockDataviewSortReplace") + } + + var r0 *pb.RpcBlockDataviewSortReplaceResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcBlockDataviewSortReplaceRequest) *pb.RpcBlockDataviewSortReplaceResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcBlockDataviewSortReplaceResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_BlockDataviewSortReplace_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'BlockDataviewSortReplace' +type MockClientCommandsServer_BlockDataviewSortReplace_Call struct { + *mock.Call +} + +// BlockDataviewSortReplace is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcBlockDataviewSortReplaceRequest +func (_e *MockClientCommandsServer_Expecter) BlockDataviewSortReplace(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_BlockDataviewSortReplace_Call { + return &MockClientCommandsServer_BlockDataviewSortReplace_Call{Call: _e.mock.On("BlockDataviewSortReplace", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_BlockDataviewSortReplace_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcBlockDataviewSortReplaceRequest)) *MockClientCommandsServer_BlockDataviewSortReplace_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcBlockDataviewSortReplaceRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_BlockDataviewSortReplace_Call) Return(_a0 *pb.RpcBlockDataviewSortReplaceResponse) *MockClientCommandsServer_BlockDataviewSortReplace_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_BlockDataviewSortReplace_Call) RunAndReturn(run func(context.Context, *pb.RpcBlockDataviewSortReplaceRequest) *pb.RpcBlockDataviewSortReplaceResponse) *MockClientCommandsServer_BlockDataviewSortReplace_Call { + _c.Call.Return(run) + return _c +} + +// BlockDataviewSortSort provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) BlockDataviewSortSort(_a0 context.Context, _a1 *pb.RpcBlockDataviewSortSSortRequest) *pb.RpcBlockDataviewSortSSortResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for BlockDataviewSortSort") + } + + var r0 *pb.RpcBlockDataviewSortSSortResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcBlockDataviewSortSSortRequest) *pb.RpcBlockDataviewSortSSortResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcBlockDataviewSortSSortResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_BlockDataviewSortSort_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'BlockDataviewSortSort' +type MockClientCommandsServer_BlockDataviewSortSort_Call struct { + *mock.Call +} + +// BlockDataviewSortSort is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcBlockDataviewSortSSortRequest +func (_e *MockClientCommandsServer_Expecter) BlockDataviewSortSort(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_BlockDataviewSortSort_Call { + return &MockClientCommandsServer_BlockDataviewSortSort_Call{Call: _e.mock.On("BlockDataviewSortSort", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_BlockDataviewSortSort_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcBlockDataviewSortSSortRequest)) *MockClientCommandsServer_BlockDataviewSortSort_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcBlockDataviewSortSSortRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_BlockDataviewSortSort_Call) Return(_a0 *pb.RpcBlockDataviewSortSSortResponse) *MockClientCommandsServer_BlockDataviewSortSort_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_BlockDataviewSortSort_Call) RunAndReturn(run func(context.Context, *pb.RpcBlockDataviewSortSSortRequest) *pb.RpcBlockDataviewSortSSortResponse) *MockClientCommandsServer_BlockDataviewSortSort_Call { + _c.Call.Return(run) + return _c +} + +// BlockDataviewViewCreate provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) BlockDataviewViewCreate(_a0 context.Context, _a1 *pb.RpcBlockDataviewViewCreateRequest) *pb.RpcBlockDataviewViewCreateResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for BlockDataviewViewCreate") + } + + var r0 *pb.RpcBlockDataviewViewCreateResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcBlockDataviewViewCreateRequest) *pb.RpcBlockDataviewViewCreateResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcBlockDataviewViewCreateResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_BlockDataviewViewCreate_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'BlockDataviewViewCreate' +type MockClientCommandsServer_BlockDataviewViewCreate_Call struct { + *mock.Call +} + +// BlockDataviewViewCreate is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcBlockDataviewViewCreateRequest +func (_e *MockClientCommandsServer_Expecter) BlockDataviewViewCreate(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_BlockDataviewViewCreate_Call { + return &MockClientCommandsServer_BlockDataviewViewCreate_Call{Call: _e.mock.On("BlockDataviewViewCreate", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_BlockDataviewViewCreate_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcBlockDataviewViewCreateRequest)) *MockClientCommandsServer_BlockDataviewViewCreate_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcBlockDataviewViewCreateRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_BlockDataviewViewCreate_Call) Return(_a0 *pb.RpcBlockDataviewViewCreateResponse) *MockClientCommandsServer_BlockDataviewViewCreate_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_BlockDataviewViewCreate_Call) RunAndReturn(run func(context.Context, *pb.RpcBlockDataviewViewCreateRequest) *pb.RpcBlockDataviewViewCreateResponse) *MockClientCommandsServer_BlockDataviewViewCreate_Call { + _c.Call.Return(run) + return _c +} + +// BlockDataviewViewDelete provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) BlockDataviewViewDelete(_a0 context.Context, _a1 *pb.RpcBlockDataviewViewDeleteRequest) *pb.RpcBlockDataviewViewDeleteResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for BlockDataviewViewDelete") + } + + var r0 *pb.RpcBlockDataviewViewDeleteResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcBlockDataviewViewDeleteRequest) *pb.RpcBlockDataviewViewDeleteResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcBlockDataviewViewDeleteResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_BlockDataviewViewDelete_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'BlockDataviewViewDelete' +type MockClientCommandsServer_BlockDataviewViewDelete_Call struct { + *mock.Call +} + +// BlockDataviewViewDelete is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcBlockDataviewViewDeleteRequest +func (_e *MockClientCommandsServer_Expecter) BlockDataviewViewDelete(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_BlockDataviewViewDelete_Call { + return &MockClientCommandsServer_BlockDataviewViewDelete_Call{Call: _e.mock.On("BlockDataviewViewDelete", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_BlockDataviewViewDelete_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcBlockDataviewViewDeleteRequest)) *MockClientCommandsServer_BlockDataviewViewDelete_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcBlockDataviewViewDeleteRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_BlockDataviewViewDelete_Call) Return(_a0 *pb.RpcBlockDataviewViewDeleteResponse) *MockClientCommandsServer_BlockDataviewViewDelete_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_BlockDataviewViewDelete_Call) RunAndReturn(run func(context.Context, *pb.RpcBlockDataviewViewDeleteRequest) *pb.RpcBlockDataviewViewDeleteResponse) *MockClientCommandsServer_BlockDataviewViewDelete_Call { + _c.Call.Return(run) + return _c +} + +// BlockDataviewViewRelationAdd provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) BlockDataviewViewRelationAdd(_a0 context.Context, _a1 *pb.RpcBlockDataviewViewRelationAddRequest) *pb.RpcBlockDataviewViewRelationAddResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for BlockDataviewViewRelationAdd") + } + + var r0 *pb.RpcBlockDataviewViewRelationAddResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcBlockDataviewViewRelationAddRequest) *pb.RpcBlockDataviewViewRelationAddResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcBlockDataviewViewRelationAddResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_BlockDataviewViewRelationAdd_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'BlockDataviewViewRelationAdd' +type MockClientCommandsServer_BlockDataviewViewRelationAdd_Call struct { + *mock.Call +} + +// BlockDataviewViewRelationAdd is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcBlockDataviewViewRelationAddRequest +func (_e *MockClientCommandsServer_Expecter) BlockDataviewViewRelationAdd(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_BlockDataviewViewRelationAdd_Call { + return &MockClientCommandsServer_BlockDataviewViewRelationAdd_Call{Call: _e.mock.On("BlockDataviewViewRelationAdd", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_BlockDataviewViewRelationAdd_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcBlockDataviewViewRelationAddRequest)) *MockClientCommandsServer_BlockDataviewViewRelationAdd_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcBlockDataviewViewRelationAddRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_BlockDataviewViewRelationAdd_Call) Return(_a0 *pb.RpcBlockDataviewViewRelationAddResponse) *MockClientCommandsServer_BlockDataviewViewRelationAdd_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_BlockDataviewViewRelationAdd_Call) RunAndReturn(run func(context.Context, *pb.RpcBlockDataviewViewRelationAddRequest) *pb.RpcBlockDataviewViewRelationAddResponse) *MockClientCommandsServer_BlockDataviewViewRelationAdd_Call { + _c.Call.Return(run) + return _c +} + +// BlockDataviewViewRelationRemove provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) BlockDataviewViewRelationRemove(_a0 context.Context, _a1 *pb.RpcBlockDataviewViewRelationRemoveRequest) *pb.RpcBlockDataviewViewRelationRemoveResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for BlockDataviewViewRelationRemove") + } + + var r0 *pb.RpcBlockDataviewViewRelationRemoveResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcBlockDataviewViewRelationRemoveRequest) *pb.RpcBlockDataviewViewRelationRemoveResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcBlockDataviewViewRelationRemoveResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_BlockDataviewViewRelationRemove_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'BlockDataviewViewRelationRemove' +type MockClientCommandsServer_BlockDataviewViewRelationRemove_Call struct { + *mock.Call +} + +// BlockDataviewViewRelationRemove is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcBlockDataviewViewRelationRemoveRequest +func (_e *MockClientCommandsServer_Expecter) BlockDataviewViewRelationRemove(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_BlockDataviewViewRelationRemove_Call { + return &MockClientCommandsServer_BlockDataviewViewRelationRemove_Call{Call: _e.mock.On("BlockDataviewViewRelationRemove", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_BlockDataviewViewRelationRemove_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcBlockDataviewViewRelationRemoveRequest)) *MockClientCommandsServer_BlockDataviewViewRelationRemove_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcBlockDataviewViewRelationRemoveRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_BlockDataviewViewRelationRemove_Call) Return(_a0 *pb.RpcBlockDataviewViewRelationRemoveResponse) *MockClientCommandsServer_BlockDataviewViewRelationRemove_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_BlockDataviewViewRelationRemove_Call) RunAndReturn(run func(context.Context, *pb.RpcBlockDataviewViewRelationRemoveRequest) *pb.RpcBlockDataviewViewRelationRemoveResponse) *MockClientCommandsServer_BlockDataviewViewRelationRemove_Call { + _c.Call.Return(run) + return _c +} + +// BlockDataviewViewRelationReplace provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) BlockDataviewViewRelationReplace(_a0 context.Context, _a1 *pb.RpcBlockDataviewViewRelationReplaceRequest) *pb.RpcBlockDataviewViewRelationReplaceResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for BlockDataviewViewRelationReplace") + } + + var r0 *pb.RpcBlockDataviewViewRelationReplaceResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcBlockDataviewViewRelationReplaceRequest) *pb.RpcBlockDataviewViewRelationReplaceResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcBlockDataviewViewRelationReplaceResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_BlockDataviewViewRelationReplace_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'BlockDataviewViewRelationReplace' +type MockClientCommandsServer_BlockDataviewViewRelationReplace_Call struct { + *mock.Call +} + +// BlockDataviewViewRelationReplace is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcBlockDataviewViewRelationReplaceRequest +func (_e *MockClientCommandsServer_Expecter) BlockDataviewViewRelationReplace(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_BlockDataviewViewRelationReplace_Call { + return &MockClientCommandsServer_BlockDataviewViewRelationReplace_Call{Call: _e.mock.On("BlockDataviewViewRelationReplace", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_BlockDataviewViewRelationReplace_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcBlockDataviewViewRelationReplaceRequest)) *MockClientCommandsServer_BlockDataviewViewRelationReplace_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcBlockDataviewViewRelationReplaceRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_BlockDataviewViewRelationReplace_Call) Return(_a0 *pb.RpcBlockDataviewViewRelationReplaceResponse) *MockClientCommandsServer_BlockDataviewViewRelationReplace_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_BlockDataviewViewRelationReplace_Call) RunAndReturn(run func(context.Context, *pb.RpcBlockDataviewViewRelationReplaceRequest) *pb.RpcBlockDataviewViewRelationReplaceResponse) *MockClientCommandsServer_BlockDataviewViewRelationReplace_Call { + _c.Call.Return(run) + return _c +} + +// BlockDataviewViewRelationSort provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) BlockDataviewViewRelationSort(_a0 context.Context, _a1 *pb.RpcBlockDataviewViewRelationSortRequest) *pb.RpcBlockDataviewViewRelationSortResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for BlockDataviewViewRelationSort") + } + + var r0 *pb.RpcBlockDataviewViewRelationSortResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcBlockDataviewViewRelationSortRequest) *pb.RpcBlockDataviewViewRelationSortResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcBlockDataviewViewRelationSortResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_BlockDataviewViewRelationSort_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'BlockDataviewViewRelationSort' +type MockClientCommandsServer_BlockDataviewViewRelationSort_Call struct { + *mock.Call +} + +// BlockDataviewViewRelationSort is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcBlockDataviewViewRelationSortRequest +func (_e *MockClientCommandsServer_Expecter) BlockDataviewViewRelationSort(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_BlockDataviewViewRelationSort_Call { + return &MockClientCommandsServer_BlockDataviewViewRelationSort_Call{Call: _e.mock.On("BlockDataviewViewRelationSort", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_BlockDataviewViewRelationSort_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcBlockDataviewViewRelationSortRequest)) *MockClientCommandsServer_BlockDataviewViewRelationSort_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcBlockDataviewViewRelationSortRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_BlockDataviewViewRelationSort_Call) Return(_a0 *pb.RpcBlockDataviewViewRelationSortResponse) *MockClientCommandsServer_BlockDataviewViewRelationSort_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_BlockDataviewViewRelationSort_Call) RunAndReturn(run func(context.Context, *pb.RpcBlockDataviewViewRelationSortRequest) *pb.RpcBlockDataviewViewRelationSortResponse) *MockClientCommandsServer_BlockDataviewViewRelationSort_Call { + _c.Call.Return(run) + return _c +} + +// BlockDataviewViewSetActive provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) BlockDataviewViewSetActive(_a0 context.Context, _a1 *pb.RpcBlockDataviewViewSetActiveRequest) *pb.RpcBlockDataviewViewSetActiveResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for BlockDataviewViewSetActive") + } + + var r0 *pb.RpcBlockDataviewViewSetActiveResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcBlockDataviewViewSetActiveRequest) *pb.RpcBlockDataviewViewSetActiveResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcBlockDataviewViewSetActiveResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_BlockDataviewViewSetActive_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'BlockDataviewViewSetActive' +type MockClientCommandsServer_BlockDataviewViewSetActive_Call struct { + *mock.Call +} + +// BlockDataviewViewSetActive is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcBlockDataviewViewSetActiveRequest +func (_e *MockClientCommandsServer_Expecter) BlockDataviewViewSetActive(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_BlockDataviewViewSetActive_Call { + return &MockClientCommandsServer_BlockDataviewViewSetActive_Call{Call: _e.mock.On("BlockDataviewViewSetActive", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_BlockDataviewViewSetActive_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcBlockDataviewViewSetActiveRequest)) *MockClientCommandsServer_BlockDataviewViewSetActive_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcBlockDataviewViewSetActiveRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_BlockDataviewViewSetActive_Call) Return(_a0 *pb.RpcBlockDataviewViewSetActiveResponse) *MockClientCommandsServer_BlockDataviewViewSetActive_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_BlockDataviewViewSetActive_Call) RunAndReturn(run func(context.Context, *pb.RpcBlockDataviewViewSetActiveRequest) *pb.RpcBlockDataviewViewSetActiveResponse) *MockClientCommandsServer_BlockDataviewViewSetActive_Call { + _c.Call.Return(run) + return _c +} + +// BlockDataviewViewSetPosition provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) BlockDataviewViewSetPosition(_a0 context.Context, _a1 *pb.RpcBlockDataviewViewSetPositionRequest) *pb.RpcBlockDataviewViewSetPositionResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for BlockDataviewViewSetPosition") + } + + var r0 *pb.RpcBlockDataviewViewSetPositionResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcBlockDataviewViewSetPositionRequest) *pb.RpcBlockDataviewViewSetPositionResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcBlockDataviewViewSetPositionResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_BlockDataviewViewSetPosition_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'BlockDataviewViewSetPosition' +type MockClientCommandsServer_BlockDataviewViewSetPosition_Call struct { + *mock.Call +} + +// BlockDataviewViewSetPosition is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcBlockDataviewViewSetPositionRequest +func (_e *MockClientCommandsServer_Expecter) BlockDataviewViewSetPosition(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_BlockDataviewViewSetPosition_Call { + return &MockClientCommandsServer_BlockDataviewViewSetPosition_Call{Call: _e.mock.On("BlockDataviewViewSetPosition", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_BlockDataviewViewSetPosition_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcBlockDataviewViewSetPositionRequest)) *MockClientCommandsServer_BlockDataviewViewSetPosition_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcBlockDataviewViewSetPositionRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_BlockDataviewViewSetPosition_Call) Return(_a0 *pb.RpcBlockDataviewViewSetPositionResponse) *MockClientCommandsServer_BlockDataviewViewSetPosition_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_BlockDataviewViewSetPosition_Call) RunAndReturn(run func(context.Context, *pb.RpcBlockDataviewViewSetPositionRequest) *pb.RpcBlockDataviewViewSetPositionResponse) *MockClientCommandsServer_BlockDataviewViewSetPosition_Call { + _c.Call.Return(run) + return _c +} + +// BlockDataviewViewUpdate provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) BlockDataviewViewUpdate(_a0 context.Context, _a1 *pb.RpcBlockDataviewViewUpdateRequest) *pb.RpcBlockDataviewViewUpdateResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for BlockDataviewViewUpdate") + } + + var r0 *pb.RpcBlockDataviewViewUpdateResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcBlockDataviewViewUpdateRequest) *pb.RpcBlockDataviewViewUpdateResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcBlockDataviewViewUpdateResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_BlockDataviewViewUpdate_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'BlockDataviewViewUpdate' +type MockClientCommandsServer_BlockDataviewViewUpdate_Call struct { + *mock.Call +} + +// BlockDataviewViewUpdate is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcBlockDataviewViewUpdateRequest +func (_e *MockClientCommandsServer_Expecter) BlockDataviewViewUpdate(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_BlockDataviewViewUpdate_Call { + return &MockClientCommandsServer_BlockDataviewViewUpdate_Call{Call: _e.mock.On("BlockDataviewViewUpdate", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_BlockDataviewViewUpdate_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcBlockDataviewViewUpdateRequest)) *MockClientCommandsServer_BlockDataviewViewUpdate_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcBlockDataviewViewUpdateRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_BlockDataviewViewUpdate_Call) Return(_a0 *pb.RpcBlockDataviewViewUpdateResponse) *MockClientCommandsServer_BlockDataviewViewUpdate_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_BlockDataviewViewUpdate_Call) RunAndReturn(run func(context.Context, *pb.RpcBlockDataviewViewUpdateRequest) *pb.RpcBlockDataviewViewUpdateResponse) *MockClientCommandsServer_BlockDataviewViewUpdate_Call { + _c.Call.Return(run) + return _c +} + +// BlockDivListSetStyle provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) BlockDivListSetStyle(_a0 context.Context, _a1 *pb.RpcBlockDivListSetStyleRequest) *pb.RpcBlockDivListSetStyleResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for BlockDivListSetStyle") + } + + var r0 *pb.RpcBlockDivListSetStyleResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcBlockDivListSetStyleRequest) *pb.RpcBlockDivListSetStyleResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcBlockDivListSetStyleResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_BlockDivListSetStyle_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'BlockDivListSetStyle' +type MockClientCommandsServer_BlockDivListSetStyle_Call struct { + *mock.Call +} + +// BlockDivListSetStyle is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcBlockDivListSetStyleRequest +func (_e *MockClientCommandsServer_Expecter) BlockDivListSetStyle(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_BlockDivListSetStyle_Call { + return &MockClientCommandsServer_BlockDivListSetStyle_Call{Call: _e.mock.On("BlockDivListSetStyle", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_BlockDivListSetStyle_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcBlockDivListSetStyleRequest)) *MockClientCommandsServer_BlockDivListSetStyle_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcBlockDivListSetStyleRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_BlockDivListSetStyle_Call) Return(_a0 *pb.RpcBlockDivListSetStyleResponse) *MockClientCommandsServer_BlockDivListSetStyle_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_BlockDivListSetStyle_Call) RunAndReturn(run func(context.Context, *pb.RpcBlockDivListSetStyleRequest) *pb.RpcBlockDivListSetStyleResponse) *MockClientCommandsServer_BlockDivListSetStyle_Call { + _c.Call.Return(run) + return _c +} + +// BlockExport provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) BlockExport(_a0 context.Context, _a1 *pb.RpcBlockExportRequest) *pb.RpcBlockExportResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for BlockExport") + } + + var r0 *pb.RpcBlockExportResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcBlockExportRequest) *pb.RpcBlockExportResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcBlockExportResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_BlockExport_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'BlockExport' +type MockClientCommandsServer_BlockExport_Call struct { + *mock.Call +} + +// BlockExport is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcBlockExportRequest +func (_e *MockClientCommandsServer_Expecter) BlockExport(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_BlockExport_Call { + return &MockClientCommandsServer_BlockExport_Call{Call: _e.mock.On("BlockExport", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_BlockExport_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcBlockExportRequest)) *MockClientCommandsServer_BlockExport_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcBlockExportRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_BlockExport_Call) Return(_a0 *pb.RpcBlockExportResponse) *MockClientCommandsServer_BlockExport_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_BlockExport_Call) RunAndReturn(run func(context.Context, *pb.RpcBlockExportRequest) *pb.RpcBlockExportResponse) *MockClientCommandsServer_BlockExport_Call { + _c.Call.Return(run) + return _c +} + +// BlockFileCreateAndUpload provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) BlockFileCreateAndUpload(_a0 context.Context, _a1 *pb.RpcBlockFileCreateAndUploadRequest) *pb.RpcBlockFileCreateAndUploadResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for BlockFileCreateAndUpload") + } + + var r0 *pb.RpcBlockFileCreateAndUploadResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcBlockFileCreateAndUploadRequest) *pb.RpcBlockFileCreateAndUploadResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcBlockFileCreateAndUploadResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_BlockFileCreateAndUpload_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'BlockFileCreateAndUpload' +type MockClientCommandsServer_BlockFileCreateAndUpload_Call struct { + *mock.Call +} + +// BlockFileCreateAndUpload is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcBlockFileCreateAndUploadRequest +func (_e *MockClientCommandsServer_Expecter) BlockFileCreateAndUpload(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_BlockFileCreateAndUpload_Call { + return &MockClientCommandsServer_BlockFileCreateAndUpload_Call{Call: _e.mock.On("BlockFileCreateAndUpload", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_BlockFileCreateAndUpload_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcBlockFileCreateAndUploadRequest)) *MockClientCommandsServer_BlockFileCreateAndUpload_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcBlockFileCreateAndUploadRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_BlockFileCreateAndUpload_Call) Return(_a0 *pb.RpcBlockFileCreateAndUploadResponse) *MockClientCommandsServer_BlockFileCreateAndUpload_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_BlockFileCreateAndUpload_Call) RunAndReturn(run func(context.Context, *pb.RpcBlockFileCreateAndUploadRequest) *pb.RpcBlockFileCreateAndUploadResponse) *MockClientCommandsServer_BlockFileCreateAndUpload_Call { + _c.Call.Return(run) + return _c +} + +// BlockFileListSetStyle provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) BlockFileListSetStyle(_a0 context.Context, _a1 *pb.RpcBlockFileListSetStyleRequest) *pb.RpcBlockFileListSetStyleResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for BlockFileListSetStyle") + } + + var r0 *pb.RpcBlockFileListSetStyleResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcBlockFileListSetStyleRequest) *pb.RpcBlockFileListSetStyleResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcBlockFileListSetStyleResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_BlockFileListSetStyle_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'BlockFileListSetStyle' +type MockClientCommandsServer_BlockFileListSetStyle_Call struct { + *mock.Call +} + +// BlockFileListSetStyle is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcBlockFileListSetStyleRequest +func (_e *MockClientCommandsServer_Expecter) BlockFileListSetStyle(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_BlockFileListSetStyle_Call { + return &MockClientCommandsServer_BlockFileListSetStyle_Call{Call: _e.mock.On("BlockFileListSetStyle", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_BlockFileListSetStyle_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcBlockFileListSetStyleRequest)) *MockClientCommandsServer_BlockFileListSetStyle_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcBlockFileListSetStyleRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_BlockFileListSetStyle_Call) Return(_a0 *pb.RpcBlockFileListSetStyleResponse) *MockClientCommandsServer_BlockFileListSetStyle_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_BlockFileListSetStyle_Call) RunAndReturn(run func(context.Context, *pb.RpcBlockFileListSetStyleRequest) *pb.RpcBlockFileListSetStyleResponse) *MockClientCommandsServer_BlockFileListSetStyle_Call { + _c.Call.Return(run) + return _c +} + +// BlockFileSetName provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) BlockFileSetName(_a0 context.Context, _a1 *pb.RpcBlockFileSetNameRequest) *pb.RpcBlockFileSetNameResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for BlockFileSetName") + } + + var r0 *pb.RpcBlockFileSetNameResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcBlockFileSetNameRequest) *pb.RpcBlockFileSetNameResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcBlockFileSetNameResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_BlockFileSetName_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'BlockFileSetName' +type MockClientCommandsServer_BlockFileSetName_Call struct { + *mock.Call +} + +// BlockFileSetName is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcBlockFileSetNameRequest +func (_e *MockClientCommandsServer_Expecter) BlockFileSetName(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_BlockFileSetName_Call { + return &MockClientCommandsServer_BlockFileSetName_Call{Call: _e.mock.On("BlockFileSetName", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_BlockFileSetName_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcBlockFileSetNameRequest)) *MockClientCommandsServer_BlockFileSetName_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcBlockFileSetNameRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_BlockFileSetName_Call) Return(_a0 *pb.RpcBlockFileSetNameResponse) *MockClientCommandsServer_BlockFileSetName_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_BlockFileSetName_Call) RunAndReturn(run func(context.Context, *pb.RpcBlockFileSetNameRequest) *pb.RpcBlockFileSetNameResponse) *MockClientCommandsServer_BlockFileSetName_Call { + _c.Call.Return(run) + return _c +} + +// BlockFileSetTargetObjectId provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) BlockFileSetTargetObjectId(_a0 context.Context, _a1 *pb.RpcBlockFileSetTargetObjectIdRequest) *pb.RpcBlockFileSetTargetObjectIdResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for BlockFileSetTargetObjectId") + } + + var r0 *pb.RpcBlockFileSetTargetObjectIdResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcBlockFileSetTargetObjectIdRequest) *pb.RpcBlockFileSetTargetObjectIdResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcBlockFileSetTargetObjectIdResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_BlockFileSetTargetObjectId_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'BlockFileSetTargetObjectId' +type MockClientCommandsServer_BlockFileSetTargetObjectId_Call struct { + *mock.Call +} + +// BlockFileSetTargetObjectId is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcBlockFileSetTargetObjectIdRequest +func (_e *MockClientCommandsServer_Expecter) BlockFileSetTargetObjectId(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_BlockFileSetTargetObjectId_Call { + return &MockClientCommandsServer_BlockFileSetTargetObjectId_Call{Call: _e.mock.On("BlockFileSetTargetObjectId", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_BlockFileSetTargetObjectId_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcBlockFileSetTargetObjectIdRequest)) *MockClientCommandsServer_BlockFileSetTargetObjectId_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcBlockFileSetTargetObjectIdRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_BlockFileSetTargetObjectId_Call) Return(_a0 *pb.RpcBlockFileSetTargetObjectIdResponse) *MockClientCommandsServer_BlockFileSetTargetObjectId_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_BlockFileSetTargetObjectId_Call) RunAndReturn(run func(context.Context, *pb.RpcBlockFileSetTargetObjectIdRequest) *pb.RpcBlockFileSetTargetObjectIdResponse) *MockClientCommandsServer_BlockFileSetTargetObjectId_Call { + _c.Call.Return(run) + return _c +} + +// BlockImageSetName provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) BlockImageSetName(_a0 context.Context, _a1 *pb.RpcBlockImageSetNameRequest) *pb.RpcBlockImageSetNameResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for BlockImageSetName") + } + + var r0 *pb.RpcBlockImageSetNameResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcBlockImageSetNameRequest) *pb.RpcBlockImageSetNameResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcBlockImageSetNameResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_BlockImageSetName_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'BlockImageSetName' +type MockClientCommandsServer_BlockImageSetName_Call struct { + *mock.Call +} + +// BlockImageSetName is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcBlockImageSetNameRequest +func (_e *MockClientCommandsServer_Expecter) BlockImageSetName(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_BlockImageSetName_Call { + return &MockClientCommandsServer_BlockImageSetName_Call{Call: _e.mock.On("BlockImageSetName", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_BlockImageSetName_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcBlockImageSetNameRequest)) *MockClientCommandsServer_BlockImageSetName_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcBlockImageSetNameRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_BlockImageSetName_Call) Return(_a0 *pb.RpcBlockImageSetNameResponse) *MockClientCommandsServer_BlockImageSetName_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_BlockImageSetName_Call) RunAndReturn(run func(context.Context, *pb.RpcBlockImageSetNameRequest) *pb.RpcBlockImageSetNameResponse) *MockClientCommandsServer_BlockImageSetName_Call { + _c.Call.Return(run) + return _c +} + +// BlockLatexSetText provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) BlockLatexSetText(_a0 context.Context, _a1 *pb.RpcBlockLatexSetTextRequest) *pb.RpcBlockLatexSetTextResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for BlockLatexSetText") + } + + var r0 *pb.RpcBlockLatexSetTextResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcBlockLatexSetTextRequest) *pb.RpcBlockLatexSetTextResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcBlockLatexSetTextResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_BlockLatexSetText_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'BlockLatexSetText' +type MockClientCommandsServer_BlockLatexSetText_Call struct { + *mock.Call +} + +// BlockLatexSetText is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcBlockLatexSetTextRequest +func (_e *MockClientCommandsServer_Expecter) BlockLatexSetText(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_BlockLatexSetText_Call { + return &MockClientCommandsServer_BlockLatexSetText_Call{Call: _e.mock.On("BlockLatexSetText", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_BlockLatexSetText_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcBlockLatexSetTextRequest)) *MockClientCommandsServer_BlockLatexSetText_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcBlockLatexSetTextRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_BlockLatexSetText_Call) Return(_a0 *pb.RpcBlockLatexSetTextResponse) *MockClientCommandsServer_BlockLatexSetText_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_BlockLatexSetText_Call) RunAndReturn(run func(context.Context, *pb.RpcBlockLatexSetTextRequest) *pb.RpcBlockLatexSetTextResponse) *MockClientCommandsServer_BlockLatexSetText_Call { + _c.Call.Return(run) + return _c +} + +// BlockLinkCreateWithObject provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) BlockLinkCreateWithObject(_a0 context.Context, _a1 *pb.RpcBlockLinkCreateWithObjectRequest) *pb.RpcBlockLinkCreateWithObjectResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for BlockLinkCreateWithObject") + } + + var r0 *pb.RpcBlockLinkCreateWithObjectResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcBlockLinkCreateWithObjectRequest) *pb.RpcBlockLinkCreateWithObjectResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcBlockLinkCreateWithObjectResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_BlockLinkCreateWithObject_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'BlockLinkCreateWithObject' +type MockClientCommandsServer_BlockLinkCreateWithObject_Call struct { + *mock.Call +} + +// BlockLinkCreateWithObject is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcBlockLinkCreateWithObjectRequest +func (_e *MockClientCommandsServer_Expecter) BlockLinkCreateWithObject(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_BlockLinkCreateWithObject_Call { + return &MockClientCommandsServer_BlockLinkCreateWithObject_Call{Call: _e.mock.On("BlockLinkCreateWithObject", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_BlockLinkCreateWithObject_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcBlockLinkCreateWithObjectRequest)) *MockClientCommandsServer_BlockLinkCreateWithObject_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcBlockLinkCreateWithObjectRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_BlockLinkCreateWithObject_Call) Return(_a0 *pb.RpcBlockLinkCreateWithObjectResponse) *MockClientCommandsServer_BlockLinkCreateWithObject_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_BlockLinkCreateWithObject_Call) RunAndReturn(run func(context.Context, *pb.RpcBlockLinkCreateWithObjectRequest) *pb.RpcBlockLinkCreateWithObjectResponse) *MockClientCommandsServer_BlockLinkCreateWithObject_Call { + _c.Call.Return(run) + return _c +} + +// BlockLinkListSetAppearance provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) BlockLinkListSetAppearance(_a0 context.Context, _a1 *pb.RpcBlockLinkListSetAppearanceRequest) *pb.RpcBlockLinkListSetAppearanceResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for BlockLinkListSetAppearance") + } + + var r0 *pb.RpcBlockLinkListSetAppearanceResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcBlockLinkListSetAppearanceRequest) *pb.RpcBlockLinkListSetAppearanceResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcBlockLinkListSetAppearanceResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_BlockLinkListSetAppearance_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'BlockLinkListSetAppearance' +type MockClientCommandsServer_BlockLinkListSetAppearance_Call struct { + *mock.Call +} + +// BlockLinkListSetAppearance is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcBlockLinkListSetAppearanceRequest +func (_e *MockClientCommandsServer_Expecter) BlockLinkListSetAppearance(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_BlockLinkListSetAppearance_Call { + return &MockClientCommandsServer_BlockLinkListSetAppearance_Call{Call: _e.mock.On("BlockLinkListSetAppearance", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_BlockLinkListSetAppearance_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcBlockLinkListSetAppearanceRequest)) *MockClientCommandsServer_BlockLinkListSetAppearance_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcBlockLinkListSetAppearanceRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_BlockLinkListSetAppearance_Call) Return(_a0 *pb.RpcBlockLinkListSetAppearanceResponse) *MockClientCommandsServer_BlockLinkListSetAppearance_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_BlockLinkListSetAppearance_Call) RunAndReturn(run func(context.Context, *pb.RpcBlockLinkListSetAppearanceRequest) *pb.RpcBlockLinkListSetAppearanceResponse) *MockClientCommandsServer_BlockLinkListSetAppearance_Call { + _c.Call.Return(run) + return _c +} + +// BlockListConvertToObjects provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) BlockListConvertToObjects(_a0 context.Context, _a1 *pb.RpcBlockListConvertToObjectsRequest) *pb.RpcBlockListConvertToObjectsResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for BlockListConvertToObjects") + } + + var r0 *pb.RpcBlockListConvertToObjectsResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcBlockListConvertToObjectsRequest) *pb.RpcBlockListConvertToObjectsResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcBlockListConvertToObjectsResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_BlockListConvertToObjects_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'BlockListConvertToObjects' +type MockClientCommandsServer_BlockListConvertToObjects_Call struct { + *mock.Call +} + +// BlockListConvertToObjects is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcBlockListConvertToObjectsRequest +func (_e *MockClientCommandsServer_Expecter) BlockListConvertToObjects(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_BlockListConvertToObjects_Call { + return &MockClientCommandsServer_BlockListConvertToObjects_Call{Call: _e.mock.On("BlockListConvertToObjects", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_BlockListConvertToObjects_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcBlockListConvertToObjectsRequest)) *MockClientCommandsServer_BlockListConvertToObjects_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcBlockListConvertToObjectsRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_BlockListConvertToObjects_Call) Return(_a0 *pb.RpcBlockListConvertToObjectsResponse) *MockClientCommandsServer_BlockListConvertToObjects_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_BlockListConvertToObjects_Call) RunAndReturn(run func(context.Context, *pb.RpcBlockListConvertToObjectsRequest) *pb.RpcBlockListConvertToObjectsResponse) *MockClientCommandsServer_BlockListConvertToObjects_Call { + _c.Call.Return(run) + return _c +} + +// BlockListDelete provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) BlockListDelete(_a0 context.Context, _a1 *pb.RpcBlockListDeleteRequest) *pb.RpcBlockListDeleteResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for BlockListDelete") + } + + var r0 *pb.RpcBlockListDeleteResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcBlockListDeleteRequest) *pb.RpcBlockListDeleteResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcBlockListDeleteResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_BlockListDelete_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'BlockListDelete' +type MockClientCommandsServer_BlockListDelete_Call struct { + *mock.Call +} + +// BlockListDelete is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcBlockListDeleteRequest +func (_e *MockClientCommandsServer_Expecter) BlockListDelete(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_BlockListDelete_Call { + return &MockClientCommandsServer_BlockListDelete_Call{Call: _e.mock.On("BlockListDelete", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_BlockListDelete_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcBlockListDeleteRequest)) *MockClientCommandsServer_BlockListDelete_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcBlockListDeleteRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_BlockListDelete_Call) Return(_a0 *pb.RpcBlockListDeleteResponse) *MockClientCommandsServer_BlockListDelete_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_BlockListDelete_Call) RunAndReturn(run func(context.Context, *pb.RpcBlockListDeleteRequest) *pb.RpcBlockListDeleteResponse) *MockClientCommandsServer_BlockListDelete_Call { + _c.Call.Return(run) + return _c +} + +// BlockListDuplicate provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) BlockListDuplicate(_a0 context.Context, _a1 *pb.RpcBlockListDuplicateRequest) *pb.RpcBlockListDuplicateResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for BlockListDuplicate") + } + + var r0 *pb.RpcBlockListDuplicateResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcBlockListDuplicateRequest) *pb.RpcBlockListDuplicateResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcBlockListDuplicateResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_BlockListDuplicate_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'BlockListDuplicate' +type MockClientCommandsServer_BlockListDuplicate_Call struct { + *mock.Call +} + +// BlockListDuplicate is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcBlockListDuplicateRequest +func (_e *MockClientCommandsServer_Expecter) BlockListDuplicate(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_BlockListDuplicate_Call { + return &MockClientCommandsServer_BlockListDuplicate_Call{Call: _e.mock.On("BlockListDuplicate", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_BlockListDuplicate_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcBlockListDuplicateRequest)) *MockClientCommandsServer_BlockListDuplicate_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcBlockListDuplicateRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_BlockListDuplicate_Call) Return(_a0 *pb.RpcBlockListDuplicateResponse) *MockClientCommandsServer_BlockListDuplicate_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_BlockListDuplicate_Call) RunAndReturn(run func(context.Context, *pb.RpcBlockListDuplicateRequest) *pb.RpcBlockListDuplicateResponse) *MockClientCommandsServer_BlockListDuplicate_Call { + _c.Call.Return(run) + return _c +} + +// BlockListMoveToExistingObject provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) BlockListMoveToExistingObject(_a0 context.Context, _a1 *pb.RpcBlockListMoveToExistingObjectRequest) *pb.RpcBlockListMoveToExistingObjectResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for BlockListMoveToExistingObject") + } + + var r0 *pb.RpcBlockListMoveToExistingObjectResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcBlockListMoveToExistingObjectRequest) *pb.RpcBlockListMoveToExistingObjectResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcBlockListMoveToExistingObjectResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_BlockListMoveToExistingObject_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'BlockListMoveToExistingObject' +type MockClientCommandsServer_BlockListMoveToExistingObject_Call struct { + *mock.Call +} + +// BlockListMoveToExistingObject is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcBlockListMoveToExistingObjectRequest +func (_e *MockClientCommandsServer_Expecter) BlockListMoveToExistingObject(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_BlockListMoveToExistingObject_Call { + return &MockClientCommandsServer_BlockListMoveToExistingObject_Call{Call: _e.mock.On("BlockListMoveToExistingObject", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_BlockListMoveToExistingObject_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcBlockListMoveToExistingObjectRequest)) *MockClientCommandsServer_BlockListMoveToExistingObject_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcBlockListMoveToExistingObjectRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_BlockListMoveToExistingObject_Call) Return(_a0 *pb.RpcBlockListMoveToExistingObjectResponse) *MockClientCommandsServer_BlockListMoveToExistingObject_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_BlockListMoveToExistingObject_Call) RunAndReturn(run func(context.Context, *pb.RpcBlockListMoveToExistingObjectRequest) *pb.RpcBlockListMoveToExistingObjectResponse) *MockClientCommandsServer_BlockListMoveToExistingObject_Call { + _c.Call.Return(run) + return _c +} + +// BlockListMoveToNewObject provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) BlockListMoveToNewObject(_a0 context.Context, _a1 *pb.RpcBlockListMoveToNewObjectRequest) *pb.RpcBlockListMoveToNewObjectResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for BlockListMoveToNewObject") + } + + var r0 *pb.RpcBlockListMoveToNewObjectResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcBlockListMoveToNewObjectRequest) *pb.RpcBlockListMoveToNewObjectResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcBlockListMoveToNewObjectResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_BlockListMoveToNewObject_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'BlockListMoveToNewObject' +type MockClientCommandsServer_BlockListMoveToNewObject_Call struct { + *mock.Call +} + +// BlockListMoveToNewObject is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcBlockListMoveToNewObjectRequest +func (_e *MockClientCommandsServer_Expecter) BlockListMoveToNewObject(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_BlockListMoveToNewObject_Call { + return &MockClientCommandsServer_BlockListMoveToNewObject_Call{Call: _e.mock.On("BlockListMoveToNewObject", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_BlockListMoveToNewObject_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcBlockListMoveToNewObjectRequest)) *MockClientCommandsServer_BlockListMoveToNewObject_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcBlockListMoveToNewObjectRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_BlockListMoveToNewObject_Call) Return(_a0 *pb.RpcBlockListMoveToNewObjectResponse) *MockClientCommandsServer_BlockListMoveToNewObject_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_BlockListMoveToNewObject_Call) RunAndReturn(run func(context.Context, *pb.RpcBlockListMoveToNewObjectRequest) *pb.RpcBlockListMoveToNewObjectResponse) *MockClientCommandsServer_BlockListMoveToNewObject_Call { + _c.Call.Return(run) + return _c +} + +// BlockListSetAlign provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) BlockListSetAlign(_a0 context.Context, _a1 *pb.RpcBlockListSetAlignRequest) *pb.RpcBlockListSetAlignResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for BlockListSetAlign") + } + + var r0 *pb.RpcBlockListSetAlignResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcBlockListSetAlignRequest) *pb.RpcBlockListSetAlignResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcBlockListSetAlignResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_BlockListSetAlign_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'BlockListSetAlign' +type MockClientCommandsServer_BlockListSetAlign_Call struct { + *mock.Call +} + +// BlockListSetAlign is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcBlockListSetAlignRequest +func (_e *MockClientCommandsServer_Expecter) BlockListSetAlign(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_BlockListSetAlign_Call { + return &MockClientCommandsServer_BlockListSetAlign_Call{Call: _e.mock.On("BlockListSetAlign", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_BlockListSetAlign_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcBlockListSetAlignRequest)) *MockClientCommandsServer_BlockListSetAlign_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcBlockListSetAlignRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_BlockListSetAlign_Call) Return(_a0 *pb.RpcBlockListSetAlignResponse) *MockClientCommandsServer_BlockListSetAlign_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_BlockListSetAlign_Call) RunAndReturn(run func(context.Context, *pb.RpcBlockListSetAlignRequest) *pb.RpcBlockListSetAlignResponse) *MockClientCommandsServer_BlockListSetAlign_Call { + _c.Call.Return(run) + return _c +} + +// BlockListSetBackgroundColor provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) BlockListSetBackgroundColor(_a0 context.Context, _a1 *pb.RpcBlockListSetBackgroundColorRequest) *pb.RpcBlockListSetBackgroundColorResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for BlockListSetBackgroundColor") + } + + var r0 *pb.RpcBlockListSetBackgroundColorResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcBlockListSetBackgroundColorRequest) *pb.RpcBlockListSetBackgroundColorResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcBlockListSetBackgroundColorResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_BlockListSetBackgroundColor_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'BlockListSetBackgroundColor' +type MockClientCommandsServer_BlockListSetBackgroundColor_Call struct { + *mock.Call +} + +// BlockListSetBackgroundColor is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcBlockListSetBackgroundColorRequest +func (_e *MockClientCommandsServer_Expecter) BlockListSetBackgroundColor(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_BlockListSetBackgroundColor_Call { + return &MockClientCommandsServer_BlockListSetBackgroundColor_Call{Call: _e.mock.On("BlockListSetBackgroundColor", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_BlockListSetBackgroundColor_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcBlockListSetBackgroundColorRequest)) *MockClientCommandsServer_BlockListSetBackgroundColor_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcBlockListSetBackgroundColorRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_BlockListSetBackgroundColor_Call) Return(_a0 *pb.RpcBlockListSetBackgroundColorResponse) *MockClientCommandsServer_BlockListSetBackgroundColor_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_BlockListSetBackgroundColor_Call) RunAndReturn(run func(context.Context, *pb.RpcBlockListSetBackgroundColorRequest) *pb.RpcBlockListSetBackgroundColorResponse) *MockClientCommandsServer_BlockListSetBackgroundColor_Call { + _c.Call.Return(run) + return _c +} + +// BlockListSetFields provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) BlockListSetFields(_a0 context.Context, _a1 *pb.RpcBlockListSetFieldsRequest) *pb.RpcBlockListSetFieldsResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for BlockListSetFields") + } + + var r0 *pb.RpcBlockListSetFieldsResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcBlockListSetFieldsRequest) *pb.RpcBlockListSetFieldsResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcBlockListSetFieldsResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_BlockListSetFields_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'BlockListSetFields' +type MockClientCommandsServer_BlockListSetFields_Call struct { + *mock.Call +} + +// BlockListSetFields is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcBlockListSetFieldsRequest +func (_e *MockClientCommandsServer_Expecter) BlockListSetFields(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_BlockListSetFields_Call { + return &MockClientCommandsServer_BlockListSetFields_Call{Call: _e.mock.On("BlockListSetFields", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_BlockListSetFields_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcBlockListSetFieldsRequest)) *MockClientCommandsServer_BlockListSetFields_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcBlockListSetFieldsRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_BlockListSetFields_Call) Return(_a0 *pb.RpcBlockListSetFieldsResponse) *MockClientCommandsServer_BlockListSetFields_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_BlockListSetFields_Call) RunAndReturn(run func(context.Context, *pb.RpcBlockListSetFieldsRequest) *pb.RpcBlockListSetFieldsResponse) *MockClientCommandsServer_BlockListSetFields_Call { + _c.Call.Return(run) + return _c +} + +// BlockListSetVerticalAlign provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) BlockListSetVerticalAlign(_a0 context.Context, _a1 *pb.RpcBlockListSetVerticalAlignRequest) *pb.RpcBlockListSetVerticalAlignResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for BlockListSetVerticalAlign") + } + + var r0 *pb.RpcBlockListSetVerticalAlignResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcBlockListSetVerticalAlignRequest) *pb.RpcBlockListSetVerticalAlignResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcBlockListSetVerticalAlignResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_BlockListSetVerticalAlign_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'BlockListSetVerticalAlign' +type MockClientCommandsServer_BlockListSetVerticalAlign_Call struct { + *mock.Call +} + +// BlockListSetVerticalAlign is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcBlockListSetVerticalAlignRequest +func (_e *MockClientCommandsServer_Expecter) BlockListSetVerticalAlign(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_BlockListSetVerticalAlign_Call { + return &MockClientCommandsServer_BlockListSetVerticalAlign_Call{Call: _e.mock.On("BlockListSetVerticalAlign", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_BlockListSetVerticalAlign_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcBlockListSetVerticalAlignRequest)) *MockClientCommandsServer_BlockListSetVerticalAlign_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcBlockListSetVerticalAlignRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_BlockListSetVerticalAlign_Call) Return(_a0 *pb.RpcBlockListSetVerticalAlignResponse) *MockClientCommandsServer_BlockListSetVerticalAlign_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_BlockListSetVerticalAlign_Call) RunAndReturn(run func(context.Context, *pb.RpcBlockListSetVerticalAlignRequest) *pb.RpcBlockListSetVerticalAlignResponse) *MockClientCommandsServer_BlockListSetVerticalAlign_Call { + _c.Call.Return(run) + return _c +} + +// BlockListTurnInto provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) BlockListTurnInto(_a0 context.Context, _a1 *pb.RpcBlockListTurnIntoRequest) *pb.RpcBlockListTurnIntoResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for BlockListTurnInto") + } + + var r0 *pb.RpcBlockListTurnIntoResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcBlockListTurnIntoRequest) *pb.RpcBlockListTurnIntoResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcBlockListTurnIntoResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_BlockListTurnInto_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'BlockListTurnInto' +type MockClientCommandsServer_BlockListTurnInto_Call struct { + *mock.Call +} + +// BlockListTurnInto is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcBlockListTurnIntoRequest +func (_e *MockClientCommandsServer_Expecter) BlockListTurnInto(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_BlockListTurnInto_Call { + return &MockClientCommandsServer_BlockListTurnInto_Call{Call: _e.mock.On("BlockListTurnInto", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_BlockListTurnInto_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcBlockListTurnIntoRequest)) *MockClientCommandsServer_BlockListTurnInto_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcBlockListTurnIntoRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_BlockListTurnInto_Call) Return(_a0 *pb.RpcBlockListTurnIntoResponse) *MockClientCommandsServer_BlockListTurnInto_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_BlockListTurnInto_Call) RunAndReturn(run func(context.Context, *pb.RpcBlockListTurnIntoRequest) *pb.RpcBlockListTurnIntoResponse) *MockClientCommandsServer_BlockListTurnInto_Call { + _c.Call.Return(run) + return _c +} + +// BlockMerge provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) BlockMerge(_a0 context.Context, _a1 *pb.RpcBlockMergeRequest) *pb.RpcBlockMergeResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for BlockMerge") + } + + var r0 *pb.RpcBlockMergeResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcBlockMergeRequest) *pb.RpcBlockMergeResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcBlockMergeResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_BlockMerge_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'BlockMerge' +type MockClientCommandsServer_BlockMerge_Call struct { + *mock.Call +} + +// BlockMerge is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcBlockMergeRequest +func (_e *MockClientCommandsServer_Expecter) BlockMerge(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_BlockMerge_Call { + return &MockClientCommandsServer_BlockMerge_Call{Call: _e.mock.On("BlockMerge", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_BlockMerge_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcBlockMergeRequest)) *MockClientCommandsServer_BlockMerge_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcBlockMergeRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_BlockMerge_Call) Return(_a0 *pb.RpcBlockMergeResponse) *MockClientCommandsServer_BlockMerge_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_BlockMerge_Call) RunAndReturn(run func(context.Context, *pb.RpcBlockMergeRequest) *pb.RpcBlockMergeResponse) *MockClientCommandsServer_BlockMerge_Call { + _c.Call.Return(run) + return _c +} + +// BlockPaste provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) BlockPaste(_a0 context.Context, _a1 *pb.RpcBlockPasteRequest) *pb.RpcBlockPasteResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for BlockPaste") + } + + var r0 *pb.RpcBlockPasteResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcBlockPasteRequest) *pb.RpcBlockPasteResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcBlockPasteResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_BlockPaste_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'BlockPaste' +type MockClientCommandsServer_BlockPaste_Call struct { + *mock.Call +} + +// BlockPaste is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcBlockPasteRequest +func (_e *MockClientCommandsServer_Expecter) BlockPaste(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_BlockPaste_Call { + return &MockClientCommandsServer_BlockPaste_Call{Call: _e.mock.On("BlockPaste", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_BlockPaste_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcBlockPasteRequest)) *MockClientCommandsServer_BlockPaste_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcBlockPasteRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_BlockPaste_Call) Return(_a0 *pb.RpcBlockPasteResponse) *MockClientCommandsServer_BlockPaste_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_BlockPaste_Call) RunAndReturn(run func(context.Context, *pb.RpcBlockPasteRequest) *pb.RpcBlockPasteResponse) *MockClientCommandsServer_BlockPaste_Call { + _c.Call.Return(run) + return _c +} + +// BlockPreview provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) BlockPreview(_a0 context.Context, _a1 *pb.RpcBlockPreviewRequest) *pb.RpcBlockPreviewResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for BlockPreview") + } + + var r0 *pb.RpcBlockPreviewResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcBlockPreviewRequest) *pb.RpcBlockPreviewResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcBlockPreviewResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_BlockPreview_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'BlockPreview' +type MockClientCommandsServer_BlockPreview_Call struct { + *mock.Call +} + +// BlockPreview is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcBlockPreviewRequest +func (_e *MockClientCommandsServer_Expecter) BlockPreview(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_BlockPreview_Call { + return &MockClientCommandsServer_BlockPreview_Call{Call: _e.mock.On("BlockPreview", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_BlockPreview_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcBlockPreviewRequest)) *MockClientCommandsServer_BlockPreview_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcBlockPreviewRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_BlockPreview_Call) Return(_a0 *pb.RpcBlockPreviewResponse) *MockClientCommandsServer_BlockPreview_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_BlockPreview_Call) RunAndReturn(run func(context.Context, *pb.RpcBlockPreviewRequest) *pb.RpcBlockPreviewResponse) *MockClientCommandsServer_BlockPreview_Call { + _c.Call.Return(run) + return _c +} + +// BlockRelationAdd provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) BlockRelationAdd(_a0 context.Context, _a1 *pb.RpcBlockRelationAddRequest) *pb.RpcBlockRelationAddResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for BlockRelationAdd") + } + + var r0 *pb.RpcBlockRelationAddResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcBlockRelationAddRequest) *pb.RpcBlockRelationAddResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcBlockRelationAddResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_BlockRelationAdd_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'BlockRelationAdd' +type MockClientCommandsServer_BlockRelationAdd_Call struct { + *mock.Call +} + +// BlockRelationAdd is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcBlockRelationAddRequest +func (_e *MockClientCommandsServer_Expecter) BlockRelationAdd(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_BlockRelationAdd_Call { + return &MockClientCommandsServer_BlockRelationAdd_Call{Call: _e.mock.On("BlockRelationAdd", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_BlockRelationAdd_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcBlockRelationAddRequest)) *MockClientCommandsServer_BlockRelationAdd_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcBlockRelationAddRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_BlockRelationAdd_Call) Return(_a0 *pb.RpcBlockRelationAddResponse) *MockClientCommandsServer_BlockRelationAdd_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_BlockRelationAdd_Call) RunAndReturn(run func(context.Context, *pb.RpcBlockRelationAddRequest) *pb.RpcBlockRelationAddResponse) *MockClientCommandsServer_BlockRelationAdd_Call { + _c.Call.Return(run) + return _c +} + +// BlockRelationSetKey provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) BlockRelationSetKey(_a0 context.Context, _a1 *pb.RpcBlockRelationSetKeyRequest) *pb.RpcBlockRelationSetKeyResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for BlockRelationSetKey") + } + + var r0 *pb.RpcBlockRelationSetKeyResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcBlockRelationSetKeyRequest) *pb.RpcBlockRelationSetKeyResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcBlockRelationSetKeyResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_BlockRelationSetKey_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'BlockRelationSetKey' +type MockClientCommandsServer_BlockRelationSetKey_Call struct { + *mock.Call +} + +// BlockRelationSetKey is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcBlockRelationSetKeyRequest +func (_e *MockClientCommandsServer_Expecter) BlockRelationSetKey(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_BlockRelationSetKey_Call { + return &MockClientCommandsServer_BlockRelationSetKey_Call{Call: _e.mock.On("BlockRelationSetKey", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_BlockRelationSetKey_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcBlockRelationSetKeyRequest)) *MockClientCommandsServer_BlockRelationSetKey_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcBlockRelationSetKeyRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_BlockRelationSetKey_Call) Return(_a0 *pb.RpcBlockRelationSetKeyResponse) *MockClientCommandsServer_BlockRelationSetKey_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_BlockRelationSetKey_Call) RunAndReturn(run func(context.Context, *pb.RpcBlockRelationSetKeyRequest) *pb.RpcBlockRelationSetKeyResponse) *MockClientCommandsServer_BlockRelationSetKey_Call { + _c.Call.Return(run) + return _c +} + +// BlockReplace provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) BlockReplace(_a0 context.Context, _a1 *pb.RpcBlockReplaceRequest) *pb.RpcBlockReplaceResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for BlockReplace") + } + + var r0 *pb.RpcBlockReplaceResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcBlockReplaceRequest) *pb.RpcBlockReplaceResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcBlockReplaceResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_BlockReplace_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'BlockReplace' +type MockClientCommandsServer_BlockReplace_Call struct { + *mock.Call +} + +// BlockReplace is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcBlockReplaceRequest +func (_e *MockClientCommandsServer_Expecter) BlockReplace(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_BlockReplace_Call { + return &MockClientCommandsServer_BlockReplace_Call{Call: _e.mock.On("BlockReplace", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_BlockReplace_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcBlockReplaceRequest)) *MockClientCommandsServer_BlockReplace_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcBlockReplaceRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_BlockReplace_Call) Return(_a0 *pb.RpcBlockReplaceResponse) *MockClientCommandsServer_BlockReplace_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_BlockReplace_Call) RunAndReturn(run func(context.Context, *pb.RpcBlockReplaceRequest) *pb.RpcBlockReplaceResponse) *MockClientCommandsServer_BlockReplace_Call { + _c.Call.Return(run) + return _c +} + +// BlockSetCarriage provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) BlockSetCarriage(_a0 context.Context, _a1 *pb.RpcBlockSetCarriageRequest) *pb.RpcBlockSetCarriageResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for BlockSetCarriage") + } + + var r0 *pb.RpcBlockSetCarriageResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcBlockSetCarriageRequest) *pb.RpcBlockSetCarriageResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcBlockSetCarriageResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_BlockSetCarriage_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'BlockSetCarriage' +type MockClientCommandsServer_BlockSetCarriage_Call struct { + *mock.Call +} + +// BlockSetCarriage is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcBlockSetCarriageRequest +func (_e *MockClientCommandsServer_Expecter) BlockSetCarriage(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_BlockSetCarriage_Call { + return &MockClientCommandsServer_BlockSetCarriage_Call{Call: _e.mock.On("BlockSetCarriage", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_BlockSetCarriage_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcBlockSetCarriageRequest)) *MockClientCommandsServer_BlockSetCarriage_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcBlockSetCarriageRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_BlockSetCarriage_Call) Return(_a0 *pb.RpcBlockSetCarriageResponse) *MockClientCommandsServer_BlockSetCarriage_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_BlockSetCarriage_Call) RunAndReturn(run func(context.Context, *pb.RpcBlockSetCarriageRequest) *pb.RpcBlockSetCarriageResponse) *MockClientCommandsServer_BlockSetCarriage_Call { + _c.Call.Return(run) + return _c +} + +// BlockSetFields provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) BlockSetFields(_a0 context.Context, _a1 *pb.RpcBlockSetFieldsRequest) *pb.RpcBlockSetFieldsResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for BlockSetFields") + } + + var r0 *pb.RpcBlockSetFieldsResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcBlockSetFieldsRequest) *pb.RpcBlockSetFieldsResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcBlockSetFieldsResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_BlockSetFields_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'BlockSetFields' +type MockClientCommandsServer_BlockSetFields_Call struct { + *mock.Call +} + +// BlockSetFields is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcBlockSetFieldsRequest +func (_e *MockClientCommandsServer_Expecter) BlockSetFields(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_BlockSetFields_Call { + return &MockClientCommandsServer_BlockSetFields_Call{Call: _e.mock.On("BlockSetFields", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_BlockSetFields_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcBlockSetFieldsRequest)) *MockClientCommandsServer_BlockSetFields_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcBlockSetFieldsRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_BlockSetFields_Call) Return(_a0 *pb.RpcBlockSetFieldsResponse) *MockClientCommandsServer_BlockSetFields_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_BlockSetFields_Call) RunAndReturn(run func(context.Context, *pb.RpcBlockSetFieldsRequest) *pb.RpcBlockSetFieldsResponse) *MockClientCommandsServer_BlockSetFields_Call { + _c.Call.Return(run) + return _c +} + +// BlockSplit provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) BlockSplit(_a0 context.Context, _a1 *pb.RpcBlockSplitRequest) *pb.RpcBlockSplitResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for BlockSplit") + } + + var r0 *pb.RpcBlockSplitResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcBlockSplitRequest) *pb.RpcBlockSplitResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcBlockSplitResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_BlockSplit_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'BlockSplit' +type MockClientCommandsServer_BlockSplit_Call struct { + *mock.Call +} + +// BlockSplit is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcBlockSplitRequest +func (_e *MockClientCommandsServer_Expecter) BlockSplit(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_BlockSplit_Call { + return &MockClientCommandsServer_BlockSplit_Call{Call: _e.mock.On("BlockSplit", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_BlockSplit_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcBlockSplitRequest)) *MockClientCommandsServer_BlockSplit_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcBlockSplitRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_BlockSplit_Call) Return(_a0 *pb.RpcBlockSplitResponse) *MockClientCommandsServer_BlockSplit_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_BlockSplit_Call) RunAndReturn(run func(context.Context, *pb.RpcBlockSplitRequest) *pb.RpcBlockSplitResponse) *MockClientCommandsServer_BlockSplit_Call { + _c.Call.Return(run) + return _c +} + +// BlockTableColumnCreate provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) BlockTableColumnCreate(_a0 context.Context, _a1 *pb.RpcBlockTableColumnCreateRequest) *pb.RpcBlockTableColumnCreateResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for BlockTableColumnCreate") + } + + var r0 *pb.RpcBlockTableColumnCreateResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcBlockTableColumnCreateRequest) *pb.RpcBlockTableColumnCreateResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcBlockTableColumnCreateResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_BlockTableColumnCreate_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'BlockTableColumnCreate' +type MockClientCommandsServer_BlockTableColumnCreate_Call struct { + *mock.Call +} + +// BlockTableColumnCreate is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcBlockTableColumnCreateRequest +func (_e *MockClientCommandsServer_Expecter) BlockTableColumnCreate(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_BlockTableColumnCreate_Call { + return &MockClientCommandsServer_BlockTableColumnCreate_Call{Call: _e.mock.On("BlockTableColumnCreate", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_BlockTableColumnCreate_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcBlockTableColumnCreateRequest)) *MockClientCommandsServer_BlockTableColumnCreate_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcBlockTableColumnCreateRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_BlockTableColumnCreate_Call) Return(_a0 *pb.RpcBlockTableColumnCreateResponse) *MockClientCommandsServer_BlockTableColumnCreate_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_BlockTableColumnCreate_Call) RunAndReturn(run func(context.Context, *pb.RpcBlockTableColumnCreateRequest) *pb.RpcBlockTableColumnCreateResponse) *MockClientCommandsServer_BlockTableColumnCreate_Call { + _c.Call.Return(run) + return _c +} + +// BlockTableColumnDelete provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) BlockTableColumnDelete(_a0 context.Context, _a1 *pb.RpcBlockTableColumnDeleteRequest) *pb.RpcBlockTableColumnDeleteResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for BlockTableColumnDelete") + } + + var r0 *pb.RpcBlockTableColumnDeleteResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcBlockTableColumnDeleteRequest) *pb.RpcBlockTableColumnDeleteResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcBlockTableColumnDeleteResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_BlockTableColumnDelete_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'BlockTableColumnDelete' +type MockClientCommandsServer_BlockTableColumnDelete_Call struct { + *mock.Call +} + +// BlockTableColumnDelete is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcBlockTableColumnDeleteRequest +func (_e *MockClientCommandsServer_Expecter) BlockTableColumnDelete(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_BlockTableColumnDelete_Call { + return &MockClientCommandsServer_BlockTableColumnDelete_Call{Call: _e.mock.On("BlockTableColumnDelete", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_BlockTableColumnDelete_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcBlockTableColumnDeleteRequest)) *MockClientCommandsServer_BlockTableColumnDelete_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcBlockTableColumnDeleteRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_BlockTableColumnDelete_Call) Return(_a0 *pb.RpcBlockTableColumnDeleteResponse) *MockClientCommandsServer_BlockTableColumnDelete_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_BlockTableColumnDelete_Call) RunAndReturn(run func(context.Context, *pb.RpcBlockTableColumnDeleteRequest) *pb.RpcBlockTableColumnDeleteResponse) *MockClientCommandsServer_BlockTableColumnDelete_Call { + _c.Call.Return(run) + return _c +} + +// BlockTableColumnDuplicate provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) BlockTableColumnDuplicate(_a0 context.Context, _a1 *pb.RpcBlockTableColumnDuplicateRequest) *pb.RpcBlockTableColumnDuplicateResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for BlockTableColumnDuplicate") + } + + var r0 *pb.RpcBlockTableColumnDuplicateResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcBlockTableColumnDuplicateRequest) *pb.RpcBlockTableColumnDuplicateResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcBlockTableColumnDuplicateResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_BlockTableColumnDuplicate_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'BlockTableColumnDuplicate' +type MockClientCommandsServer_BlockTableColumnDuplicate_Call struct { + *mock.Call +} + +// BlockTableColumnDuplicate is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcBlockTableColumnDuplicateRequest +func (_e *MockClientCommandsServer_Expecter) BlockTableColumnDuplicate(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_BlockTableColumnDuplicate_Call { + return &MockClientCommandsServer_BlockTableColumnDuplicate_Call{Call: _e.mock.On("BlockTableColumnDuplicate", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_BlockTableColumnDuplicate_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcBlockTableColumnDuplicateRequest)) *MockClientCommandsServer_BlockTableColumnDuplicate_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcBlockTableColumnDuplicateRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_BlockTableColumnDuplicate_Call) Return(_a0 *pb.RpcBlockTableColumnDuplicateResponse) *MockClientCommandsServer_BlockTableColumnDuplicate_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_BlockTableColumnDuplicate_Call) RunAndReturn(run func(context.Context, *pb.RpcBlockTableColumnDuplicateRequest) *pb.RpcBlockTableColumnDuplicateResponse) *MockClientCommandsServer_BlockTableColumnDuplicate_Call { + _c.Call.Return(run) + return _c +} + +// BlockTableColumnListFill provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) BlockTableColumnListFill(_a0 context.Context, _a1 *pb.RpcBlockTableColumnListFillRequest) *pb.RpcBlockTableColumnListFillResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for BlockTableColumnListFill") + } + + var r0 *pb.RpcBlockTableColumnListFillResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcBlockTableColumnListFillRequest) *pb.RpcBlockTableColumnListFillResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcBlockTableColumnListFillResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_BlockTableColumnListFill_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'BlockTableColumnListFill' +type MockClientCommandsServer_BlockTableColumnListFill_Call struct { + *mock.Call +} + +// BlockTableColumnListFill is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcBlockTableColumnListFillRequest +func (_e *MockClientCommandsServer_Expecter) BlockTableColumnListFill(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_BlockTableColumnListFill_Call { + return &MockClientCommandsServer_BlockTableColumnListFill_Call{Call: _e.mock.On("BlockTableColumnListFill", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_BlockTableColumnListFill_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcBlockTableColumnListFillRequest)) *MockClientCommandsServer_BlockTableColumnListFill_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcBlockTableColumnListFillRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_BlockTableColumnListFill_Call) Return(_a0 *pb.RpcBlockTableColumnListFillResponse) *MockClientCommandsServer_BlockTableColumnListFill_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_BlockTableColumnListFill_Call) RunAndReturn(run func(context.Context, *pb.RpcBlockTableColumnListFillRequest) *pb.RpcBlockTableColumnListFillResponse) *MockClientCommandsServer_BlockTableColumnListFill_Call { + _c.Call.Return(run) + return _c +} + +// BlockTableColumnMove provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) BlockTableColumnMove(_a0 context.Context, _a1 *pb.RpcBlockTableColumnMoveRequest) *pb.RpcBlockTableColumnMoveResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for BlockTableColumnMove") + } + + var r0 *pb.RpcBlockTableColumnMoveResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcBlockTableColumnMoveRequest) *pb.RpcBlockTableColumnMoveResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcBlockTableColumnMoveResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_BlockTableColumnMove_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'BlockTableColumnMove' +type MockClientCommandsServer_BlockTableColumnMove_Call struct { + *mock.Call +} + +// BlockTableColumnMove is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcBlockTableColumnMoveRequest +func (_e *MockClientCommandsServer_Expecter) BlockTableColumnMove(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_BlockTableColumnMove_Call { + return &MockClientCommandsServer_BlockTableColumnMove_Call{Call: _e.mock.On("BlockTableColumnMove", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_BlockTableColumnMove_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcBlockTableColumnMoveRequest)) *MockClientCommandsServer_BlockTableColumnMove_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcBlockTableColumnMoveRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_BlockTableColumnMove_Call) Return(_a0 *pb.RpcBlockTableColumnMoveResponse) *MockClientCommandsServer_BlockTableColumnMove_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_BlockTableColumnMove_Call) RunAndReturn(run func(context.Context, *pb.RpcBlockTableColumnMoveRequest) *pb.RpcBlockTableColumnMoveResponse) *MockClientCommandsServer_BlockTableColumnMove_Call { + _c.Call.Return(run) + return _c +} + +// BlockTableCreate provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) BlockTableCreate(_a0 context.Context, _a1 *pb.RpcBlockTableCreateRequest) *pb.RpcBlockTableCreateResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for BlockTableCreate") + } + + var r0 *pb.RpcBlockTableCreateResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcBlockTableCreateRequest) *pb.RpcBlockTableCreateResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcBlockTableCreateResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_BlockTableCreate_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'BlockTableCreate' +type MockClientCommandsServer_BlockTableCreate_Call struct { + *mock.Call +} + +// BlockTableCreate is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcBlockTableCreateRequest +func (_e *MockClientCommandsServer_Expecter) BlockTableCreate(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_BlockTableCreate_Call { + return &MockClientCommandsServer_BlockTableCreate_Call{Call: _e.mock.On("BlockTableCreate", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_BlockTableCreate_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcBlockTableCreateRequest)) *MockClientCommandsServer_BlockTableCreate_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcBlockTableCreateRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_BlockTableCreate_Call) Return(_a0 *pb.RpcBlockTableCreateResponse) *MockClientCommandsServer_BlockTableCreate_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_BlockTableCreate_Call) RunAndReturn(run func(context.Context, *pb.RpcBlockTableCreateRequest) *pb.RpcBlockTableCreateResponse) *MockClientCommandsServer_BlockTableCreate_Call { + _c.Call.Return(run) + return _c +} + +// BlockTableExpand provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) BlockTableExpand(_a0 context.Context, _a1 *pb.RpcBlockTableExpandRequest) *pb.RpcBlockTableExpandResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for BlockTableExpand") + } + + var r0 *pb.RpcBlockTableExpandResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcBlockTableExpandRequest) *pb.RpcBlockTableExpandResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcBlockTableExpandResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_BlockTableExpand_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'BlockTableExpand' +type MockClientCommandsServer_BlockTableExpand_Call struct { + *mock.Call +} + +// BlockTableExpand is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcBlockTableExpandRequest +func (_e *MockClientCommandsServer_Expecter) BlockTableExpand(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_BlockTableExpand_Call { + return &MockClientCommandsServer_BlockTableExpand_Call{Call: _e.mock.On("BlockTableExpand", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_BlockTableExpand_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcBlockTableExpandRequest)) *MockClientCommandsServer_BlockTableExpand_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcBlockTableExpandRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_BlockTableExpand_Call) Return(_a0 *pb.RpcBlockTableExpandResponse) *MockClientCommandsServer_BlockTableExpand_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_BlockTableExpand_Call) RunAndReturn(run func(context.Context, *pb.RpcBlockTableExpandRequest) *pb.RpcBlockTableExpandResponse) *MockClientCommandsServer_BlockTableExpand_Call { + _c.Call.Return(run) + return _c +} + +// BlockTableRowCreate provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) BlockTableRowCreate(_a0 context.Context, _a1 *pb.RpcBlockTableRowCreateRequest) *pb.RpcBlockTableRowCreateResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for BlockTableRowCreate") + } + + var r0 *pb.RpcBlockTableRowCreateResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcBlockTableRowCreateRequest) *pb.RpcBlockTableRowCreateResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcBlockTableRowCreateResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_BlockTableRowCreate_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'BlockTableRowCreate' +type MockClientCommandsServer_BlockTableRowCreate_Call struct { + *mock.Call +} + +// BlockTableRowCreate is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcBlockTableRowCreateRequest +func (_e *MockClientCommandsServer_Expecter) BlockTableRowCreate(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_BlockTableRowCreate_Call { + return &MockClientCommandsServer_BlockTableRowCreate_Call{Call: _e.mock.On("BlockTableRowCreate", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_BlockTableRowCreate_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcBlockTableRowCreateRequest)) *MockClientCommandsServer_BlockTableRowCreate_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcBlockTableRowCreateRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_BlockTableRowCreate_Call) Return(_a0 *pb.RpcBlockTableRowCreateResponse) *MockClientCommandsServer_BlockTableRowCreate_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_BlockTableRowCreate_Call) RunAndReturn(run func(context.Context, *pb.RpcBlockTableRowCreateRequest) *pb.RpcBlockTableRowCreateResponse) *MockClientCommandsServer_BlockTableRowCreate_Call { + _c.Call.Return(run) + return _c +} + +// BlockTableRowDelete provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) BlockTableRowDelete(_a0 context.Context, _a1 *pb.RpcBlockTableRowDeleteRequest) *pb.RpcBlockTableRowDeleteResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for BlockTableRowDelete") + } + + var r0 *pb.RpcBlockTableRowDeleteResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcBlockTableRowDeleteRequest) *pb.RpcBlockTableRowDeleteResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcBlockTableRowDeleteResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_BlockTableRowDelete_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'BlockTableRowDelete' +type MockClientCommandsServer_BlockTableRowDelete_Call struct { + *mock.Call +} + +// BlockTableRowDelete is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcBlockTableRowDeleteRequest +func (_e *MockClientCommandsServer_Expecter) BlockTableRowDelete(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_BlockTableRowDelete_Call { + return &MockClientCommandsServer_BlockTableRowDelete_Call{Call: _e.mock.On("BlockTableRowDelete", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_BlockTableRowDelete_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcBlockTableRowDeleteRequest)) *MockClientCommandsServer_BlockTableRowDelete_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcBlockTableRowDeleteRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_BlockTableRowDelete_Call) Return(_a0 *pb.RpcBlockTableRowDeleteResponse) *MockClientCommandsServer_BlockTableRowDelete_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_BlockTableRowDelete_Call) RunAndReturn(run func(context.Context, *pb.RpcBlockTableRowDeleteRequest) *pb.RpcBlockTableRowDeleteResponse) *MockClientCommandsServer_BlockTableRowDelete_Call { + _c.Call.Return(run) + return _c +} + +// BlockTableRowDuplicate provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) BlockTableRowDuplicate(_a0 context.Context, _a1 *pb.RpcBlockTableRowDuplicateRequest) *pb.RpcBlockTableRowDuplicateResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for BlockTableRowDuplicate") + } + + var r0 *pb.RpcBlockTableRowDuplicateResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcBlockTableRowDuplicateRequest) *pb.RpcBlockTableRowDuplicateResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcBlockTableRowDuplicateResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_BlockTableRowDuplicate_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'BlockTableRowDuplicate' +type MockClientCommandsServer_BlockTableRowDuplicate_Call struct { + *mock.Call +} + +// BlockTableRowDuplicate is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcBlockTableRowDuplicateRequest +func (_e *MockClientCommandsServer_Expecter) BlockTableRowDuplicate(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_BlockTableRowDuplicate_Call { + return &MockClientCommandsServer_BlockTableRowDuplicate_Call{Call: _e.mock.On("BlockTableRowDuplicate", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_BlockTableRowDuplicate_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcBlockTableRowDuplicateRequest)) *MockClientCommandsServer_BlockTableRowDuplicate_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcBlockTableRowDuplicateRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_BlockTableRowDuplicate_Call) Return(_a0 *pb.RpcBlockTableRowDuplicateResponse) *MockClientCommandsServer_BlockTableRowDuplicate_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_BlockTableRowDuplicate_Call) RunAndReturn(run func(context.Context, *pb.RpcBlockTableRowDuplicateRequest) *pb.RpcBlockTableRowDuplicateResponse) *MockClientCommandsServer_BlockTableRowDuplicate_Call { + _c.Call.Return(run) + return _c +} + +// BlockTableRowListClean provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) BlockTableRowListClean(_a0 context.Context, _a1 *pb.RpcBlockTableRowListCleanRequest) *pb.RpcBlockTableRowListCleanResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for BlockTableRowListClean") + } + + var r0 *pb.RpcBlockTableRowListCleanResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcBlockTableRowListCleanRequest) *pb.RpcBlockTableRowListCleanResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcBlockTableRowListCleanResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_BlockTableRowListClean_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'BlockTableRowListClean' +type MockClientCommandsServer_BlockTableRowListClean_Call struct { + *mock.Call +} + +// BlockTableRowListClean is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcBlockTableRowListCleanRequest +func (_e *MockClientCommandsServer_Expecter) BlockTableRowListClean(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_BlockTableRowListClean_Call { + return &MockClientCommandsServer_BlockTableRowListClean_Call{Call: _e.mock.On("BlockTableRowListClean", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_BlockTableRowListClean_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcBlockTableRowListCleanRequest)) *MockClientCommandsServer_BlockTableRowListClean_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcBlockTableRowListCleanRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_BlockTableRowListClean_Call) Return(_a0 *pb.RpcBlockTableRowListCleanResponse) *MockClientCommandsServer_BlockTableRowListClean_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_BlockTableRowListClean_Call) RunAndReturn(run func(context.Context, *pb.RpcBlockTableRowListCleanRequest) *pb.RpcBlockTableRowListCleanResponse) *MockClientCommandsServer_BlockTableRowListClean_Call { + _c.Call.Return(run) + return _c +} + +// BlockTableRowListFill provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) BlockTableRowListFill(_a0 context.Context, _a1 *pb.RpcBlockTableRowListFillRequest) *pb.RpcBlockTableRowListFillResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for BlockTableRowListFill") + } + + var r0 *pb.RpcBlockTableRowListFillResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcBlockTableRowListFillRequest) *pb.RpcBlockTableRowListFillResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcBlockTableRowListFillResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_BlockTableRowListFill_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'BlockTableRowListFill' +type MockClientCommandsServer_BlockTableRowListFill_Call struct { + *mock.Call +} + +// BlockTableRowListFill is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcBlockTableRowListFillRequest +func (_e *MockClientCommandsServer_Expecter) BlockTableRowListFill(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_BlockTableRowListFill_Call { + return &MockClientCommandsServer_BlockTableRowListFill_Call{Call: _e.mock.On("BlockTableRowListFill", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_BlockTableRowListFill_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcBlockTableRowListFillRequest)) *MockClientCommandsServer_BlockTableRowListFill_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcBlockTableRowListFillRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_BlockTableRowListFill_Call) Return(_a0 *pb.RpcBlockTableRowListFillResponse) *MockClientCommandsServer_BlockTableRowListFill_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_BlockTableRowListFill_Call) RunAndReturn(run func(context.Context, *pb.RpcBlockTableRowListFillRequest) *pb.RpcBlockTableRowListFillResponse) *MockClientCommandsServer_BlockTableRowListFill_Call { + _c.Call.Return(run) + return _c +} + +// BlockTableRowSetHeader provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) BlockTableRowSetHeader(_a0 context.Context, _a1 *pb.RpcBlockTableRowSetHeaderRequest) *pb.RpcBlockTableRowSetHeaderResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for BlockTableRowSetHeader") + } + + var r0 *pb.RpcBlockTableRowSetHeaderResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcBlockTableRowSetHeaderRequest) *pb.RpcBlockTableRowSetHeaderResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcBlockTableRowSetHeaderResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_BlockTableRowSetHeader_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'BlockTableRowSetHeader' +type MockClientCommandsServer_BlockTableRowSetHeader_Call struct { + *mock.Call +} + +// BlockTableRowSetHeader is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcBlockTableRowSetHeaderRequest +func (_e *MockClientCommandsServer_Expecter) BlockTableRowSetHeader(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_BlockTableRowSetHeader_Call { + return &MockClientCommandsServer_BlockTableRowSetHeader_Call{Call: _e.mock.On("BlockTableRowSetHeader", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_BlockTableRowSetHeader_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcBlockTableRowSetHeaderRequest)) *MockClientCommandsServer_BlockTableRowSetHeader_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcBlockTableRowSetHeaderRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_BlockTableRowSetHeader_Call) Return(_a0 *pb.RpcBlockTableRowSetHeaderResponse) *MockClientCommandsServer_BlockTableRowSetHeader_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_BlockTableRowSetHeader_Call) RunAndReturn(run func(context.Context, *pb.RpcBlockTableRowSetHeaderRequest) *pb.RpcBlockTableRowSetHeaderResponse) *MockClientCommandsServer_BlockTableRowSetHeader_Call { + _c.Call.Return(run) + return _c +} + +// BlockTableSort provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) BlockTableSort(_a0 context.Context, _a1 *pb.RpcBlockTableSortRequest) *pb.RpcBlockTableSortResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for BlockTableSort") + } + + var r0 *pb.RpcBlockTableSortResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcBlockTableSortRequest) *pb.RpcBlockTableSortResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcBlockTableSortResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_BlockTableSort_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'BlockTableSort' +type MockClientCommandsServer_BlockTableSort_Call struct { + *mock.Call +} + +// BlockTableSort is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcBlockTableSortRequest +func (_e *MockClientCommandsServer_Expecter) BlockTableSort(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_BlockTableSort_Call { + return &MockClientCommandsServer_BlockTableSort_Call{Call: _e.mock.On("BlockTableSort", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_BlockTableSort_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcBlockTableSortRequest)) *MockClientCommandsServer_BlockTableSort_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcBlockTableSortRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_BlockTableSort_Call) Return(_a0 *pb.RpcBlockTableSortResponse) *MockClientCommandsServer_BlockTableSort_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_BlockTableSort_Call) RunAndReturn(run func(context.Context, *pb.RpcBlockTableSortRequest) *pb.RpcBlockTableSortResponse) *MockClientCommandsServer_BlockTableSort_Call { + _c.Call.Return(run) + return _c +} + +// BlockTextListClearContent provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) BlockTextListClearContent(_a0 context.Context, _a1 *pb.RpcBlockTextListClearContentRequest) *pb.RpcBlockTextListClearContentResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for BlockTextListClearContent") + } + + var r0 *pb.RpcBlockTextListClearContentResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcBlockTextListClearContentRequest) *pb.RpcBlockTextListClearContentResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcBlockTextListClearContentResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_BlockTextListClearContent_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'BlockTextListClearContent' +type MockClientCommandsServer_BlockTextListClearContent_Call struct { + *mock.Call +} + +// BlockTextListClearContent is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcBlockTextListClearContentRequest +func (_e *MockClientCommandsServer_Expecter) BlockTextListClearContent(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_BlockTextListClearContent_Call { + return &MockClientCommandsServer_BlockTextListClearContent_Call{Call: _e.mock.On("BlockTextListClearContent", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_BlockTextListClearContent_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcBlockTextListClearContentRequest)) *MockClientCommandsServer_BlockTextListClearContent_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcBlockTextListClearContentRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_BlockTextListClearContent_Call) Return(_a0 *pb.RpcBlockTextListClearContentResponse) *MockClientCommandsServer_BlockTextListClearContent_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_BlockTextListClearContent_Call) RunAndReturn(run func(context.Context, *pb.RpcBlockTextListClearContentRequest) *pb.RpcBlockTextListClearContentResponse) *MockClientCommandsServer_BlockTextListClearContent_Call { + _c.Call.Return(run) + return _c +} + +// BlockTextListClearStyle provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) BlockTextListClearStyle(_a0 context.Context, _a1 *pb.RpcBlockTextListClearStyleRequest) *pb.RpcBlockTextListClearStyleResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for BlockTextListClearStyle") + } + + var r0 *pb.RpcBlockTextListClearStyleResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcBlockTextListClearStyleRequest) *pb.RpcBlockTextListClearStyleResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcBlockTextListClearStyleResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_BlockTextListClearStyle_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'BlockTextListClearStyle' +type MockClientCommandsServer_BlockTextListClearStyle_Call struct { + *mock.Call +} + +// BlockTextListClearStyle is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcBlockTextListClearStyleRequest +func (_e *MockClientCommandsServer_Expecter) BlockTextListClearStyle(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_BlockTextListClearStyle_Call { + return &MockClientCommandsServer_BlockTextListClearStyle_Call{Call: _e.mock.On("BlockTextListClearStyle", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_BlockTextListClearStyle_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcBlockTextListClearStyleRequest)) *MockClientCommandsServer_BlockTextListClearStyle_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcBlockTextListClearStyleRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_BlockTextListClearStyle_Call) Return(_a0 *pb.RpcBlockTextListClearStyleResponse) *MockClientCommandsServer_BlockTextListClearStyle_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_BlockTextListClearStyle_Call) RunAndReturn(run func(context.Context, *pb.RpcBlockTextListClearStyleRequest) *pb.RpcBlockTextListClearStyleResponse) *MockClientCommandsServer_BlockTextListClearStyle_Call { + _c.Call.Return(run) + return _c +} + +// BlockTextListSetColor provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) BlockTextListSetColor(_a0 context.Context, _a1 *pb.RpcBlockTextListSetColorRequest) *pb.RpcBlockTextListSetColorResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for BlockTextListSetColor") + } + + var r0 *pb.RpcBlockTextListSetColorResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcBlockTextListSetColorRequest) *pb.RpcBlockTextListSetColorResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcBlockTextListSetColorResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_BlockTextListSetColor_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'BlockTextListSetColor' +type MockClientCommandsServer_BlockTextListSetColor_Call struct { + *mock.Call +} + +// BlockTextListSetColor is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcBlockTextListSetColorRequest +func (_e *MockClientCommandsServer_Expecter) BlockTextListSetColor(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_BlockTextListSetColor_Call { + return &MockClientCommandsServer_BlockTextListSetColor_Call{Call: _e.mock.On("BlockTextListSetColor", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_BlockTextListSetColor_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcBlockTextListSetColorRequest)) *MockClientCommandsServer_BlockTextListSetColor_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcBlockTextListSetColorRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_BlockTextListSetColor_Call) Return(_a0 *pb.RpcBlockTextListSetColorResponse) *MockClientCommandsServer_BlockTextListSetColor_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_BlockTextListSetColor_Call) RunAndReturn(run func(context.Context, *pb.RpcBlockTextListSetColorRequest) *pb.RpcBlockTextListSetColorResponse) *MockClientCommandsServer_BlockTextListSetColor_Call { + _c.Call.Return(run) + return _c +} + +// BlockTextListSetMark provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) BlockTextListSetMark(_a0 context.Context, _a1 *pb.RpcBlockTextListSetMarkRequest) *pb.RpcBlockTextListSetMarkResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for BlockTextListSetMark") + } + + var r0 *pb.RpcBlockTextListSetMarkResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcBlockTextListSetMarkRequest) *pb.RpcBlockTextListSetMarkResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcBlockTextListSetMarkResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_BlockTextListSetMark_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'BlockTextListSetMark' +type MockClientCommandsServer_BlockTextListSetMark_Call struct { + *mock.Call +} + +// BlockTextListSetMark is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcBlockTextListSetMarkRequest +func (_e *MockClientCommandsServer_Expecter) BlockTextListSetMark(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_BlockTextListSetMark_Call { + return &MockClientCommandsServer_BlockTextListSetMark_Call{Call: _e.mock.On("BlockTextListSetMark", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_BlockTextListSetMark_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcBlockTextListSetMarkRequest)) *MockClientCommandsServer_BlockTextListSetMark_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcBlockTextListSetMarkRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_BlockTextListSetMark_Call) Return(_a0 *pb.RpcBlockTextListSetMarkResponse) *MockClientCommandsServer_BlockTextListSetMark_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_BlockTextListSetMark_Call) RunAndReturn(run func(context.Context, *pb.RpcBlockTextListSetMarkRequest) *pb.RpcBlockTextListSetMarkResponse) *MockClientCommandsServer_BlockTextListSetMark_Call { + _c.Call.Return(run) + return _c +} + +// BlockTextListSetStyle provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) BlockTextListSetStyle(_a0 context.Context, _a1 *pb.RpcBlockTextListSetStyleRequest) *pb.RpcBlockTextListSetStyleResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for BlockTextListSetStyle") + } + + var r0 *pb.RpcBlockTextListSetStyleResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcBlockTextListSetStyleRequest) *pb.RpcBlockTextListSetStyleResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcBlockTextListSetStyleResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_BlockTextListSetStyle_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'BlockTextListSetStyle' +type MockClientCommandsServer_BlockTextListSetStyle_Call struct { + *mock.Call +} + +// BlockTextListSetStyle is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcBlockTextListSetStyleRequest +func (_e *MockClientCommandsServer_Expecter) BlockTextListSetStyle(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_BlockTextListSetStyle_Call { + return &MockClientCommandsServer_BlockTextListSetStyle_Call{Call: _e.mock.On("BlockTextListSetStyle", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_BlockTextListSetStyle_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcBlockTextListSetStyleRequest)) *MockClientCommandsServer_BlockTextListSetStyle_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcBlockTextListSetStyleRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_BlockTextListSetStyle_Call) Return(_a0 *pb.RpcBlockTextListSetStyleResponse) *MockClientCommandsServer_BlockTextListSetStyle_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_BlockTextListSetStyle_Call) RunAndReturn(run func(context.Context, *pb.RpcBlockTextListSetStyleRequest) *pb.RpcBlockTextListSetStyleResponse) *MockClientCommandsServer_BlockTextListSetStyle_Call { + _c.Call.Return(run) + return _c +} + +// BlockTextSetChecked provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) BlockTextSetChecked(_a0 context.Context, _a1 *pb.RpcBlockTextSetCheckedRequest) *pb.RpcBlockTextSetCheckedResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for BlockTextSetChecked") + } + + var r0 *pb.RpcBlockTextSetCheckedResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcBlockTextSetCheckedRequest) *pb.RpcBlockTextSetCheckedResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcBlockTextSetCheckedResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_BlockTextSetChecked_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'BlockTextSetChecked' +type MockClientCommandsServer_BlockTextSetChecked_Call struct { + *mock.Call +} + +// BlockTextSetChecked is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcBlockTextSetCheckedRequest +func (_e *MockClientCommandsServer_Expecter) BlockTextSetChecked(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_BlockTextSetChecked_Call { + return &MockClientCommandsServer_BlockTextSetChecked_Call{Call: _e.mock.On("BlockTextSetChecked", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_BlockTextSetChecked_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcBlockTextSetCheckedRequest)) *MockClientCommandsServer_BlockTextSetChecked_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcBlockTextSetCheckedRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_BlockTextSetChecked_Call) Return(_a0 *pb.RpcBlockTextSetCheckedResponse) *MockClientCommandsServer_BlockTextSetChecked_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_BlockTextSetChecked_Call) RunAndReturn(run func(context.Context, *pb.RpcBlockTextSetCheckedRequest) *pb.RpcBlockTextSetCheckedResponse) *MockClientCommandsServer_BlockTextSetChecked_Call { + _c.Call.Return(run) + return _c +} + +// BlockTextSetColor provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) BlockTextSetColor(_a0 context.Context, _a1 *pb.RpcBlockTextSetColorRequest) *pb.RpcBlockTextSetColorResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for BlockTextSetColor") + } + + var r0 *pb.RpcBlockTextSetColorResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcBlockTextSetColorRequest) *pb.RpcBlockTextSetColorResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcBlockTextSetColorResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_BlockTextSetColor_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'BlockTextSetColor' +type MockClientCommandsServer_BlockTextSetColor_Call struct { + *mock.Call +} + +// BlockTextSetColor is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcBlockTextSetColorRequest +func (_e *MockClientCommandsServer_Expecter) BlockTextSetColor(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_BlockTextSetColor_Call { + return &MockClientCommandsServer_BlockTextSetColor_Call{Call: _e.mock.On("BlockTextSetColor", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_BlockTextSetColor_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcBlockTextSetColorRequest)) *MockClientCommandsServer_BlockTextSetColor_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcBlockTextSetColorRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_BlockTextSetColor_Call) Return(_a0 *pb.RpcBlockTextSetColorResponse) *MockClientCommandsServer_BlockTextSetColor_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_BlockTextSetColor_Call) RunAndReturn(run func(context.Context, *pb.RpcBlockTextSetColorRequest) *pb.RpcBlockTextSetColorResponse) *MockClientCommandsServer_BlockTextSetColor_Call { + _c.Call.Return(run) + return _c +} + +// BlockTextSetIcon provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) BlockTextSetIcon(_a0 context.Context, _a1 *pb.RpcBlockTextSetIconRequest) *pb.RpcBlockTextSetIconResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for BlockTextSetIcon") + } + + var r0 *pb.RpcBlockTextSetIconResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcBlockTextSetIconRequest) *pb.RpcBlockTextSetIconResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcBlockTextSetIconResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_BlockTextSetIcon_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'BlockTextSetIcon' +type MockClientCommandsServer_BlockTextSetIcon_Call struct { + *mock.Call +} + +// BlockTextSetIcon is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcBlockTextSetIconRequest +func (_e *MockClientCommandsServer_Expecter) BlockTextSetIcon(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_BlockTextSetIcon_Call { + return &MockClientCommandsServer_BlockTextSetIcon_Call{Call: _e.mock.On("BlockTextSetIcon", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_BlockTextSetIcon_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcBlockTextSetIconRequest)) *MockClientCommandsServer_BlockTextSetIcon_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcBlockTextSetIconRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_BlockTextSetIcon_Call) Return(_a0 *pb.RpcBlockTextSetIconResponse) *MockClientCommandsServer_BlockTextSetIcon_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_BlockTextSetIcon_Call) RunAndReturn(run func(context.Context, *pb.RpcBlockTextSetIconRequest) *pb.RpcBlockTextSetIconResponse) *MockClientCommandsServer_BlockTextSetIcon_Call { + _c.Call.Return(run) + return _c +} + +// BlockTextSetStyle provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) BlockTextSetStyle(_a0 context.Context, _a1 *pb.RpcBlockTextSetStyleRequest) *pb.RpcBlockTextSetStyleResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for BlockTextSetStyle") + } + + var r0 *pb.RpcBlockTextSetStyleResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcBlockTextSetStyleRequest) *pb.RpcBlockTextSetStyleResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcBlockTextSetStyleResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_BlockTextSetStyle_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'BlockTextSetStyle' +type MockClientCommandsServer_BlockTextSetStyle_Call struct { + *mock.Call +} + +// BlockTextSetStyle is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcBlockTextSetStyleRequest +func (_e *MockClientCommandsServer_Expecter) BlockTextSetStyle(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_BlockTextSetStyle_Call { + return &MockClientCommandsServer_BlockTextSetStyle_Call{Call: _e.mock.On("BlockTextSetStyle", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_BlockTextSetStyle_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcBlockTextSetStyleRequest)) *MockClientCommandsServer_BlockTextSetStyle_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcBlockTextSetStyleRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_BlockTextSetStyle_Call) Return(_a0 *pb.RpcBlockTextSetStyleResponse) *MockClientCommandsServer_BlockTextSetStyle_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_BlockTextSetStyle_Call) RunAndReturn(run func(context.Context, *pb.RpcBlockTextSetStyleRequest) *pb.RpcBlockTextSetStyleResponse) *MockClientCommandsServer_BlockTextSetStyle_Call { + _c.Call.Return(run) + return _c +} + +// BlockTextSetText provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) BlockTextSetText(_a0 context.Context, _a1 *pb.RpcBlockTextSetTextRequest) *pb.RpcBlockTextSetTextResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for BlockTextSetText") + } + + var r0 *pb.RpcBlockTextSetTextResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcBlockTextSetTextRequest) *pb.RpcBlockTextSetTextResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcBlockTextSetTextResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_BlockTextSetText_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'BlockTextSetText' +type MockClientCommandsServer_BlockTextSetText_Call struct { + *mock.Call +} + +// BlockTextSetText is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcBlockTextSetTextRequest +func (_e *MockClientCommandsServer_Expecter) BlockTextSetText(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_BlockTextSetText_Call { + return &MockClientCommandsServer_BlockTextSetText_Call{Call: _e.mock.On("BlockTextSetText", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_BlockTextSetText_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcBlockTextSetTextRequest)) *MockClientCommandsServer_BlockTextSetText_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcBlockTextSetTextRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_BlockTextSetText_Call) Return(_a0 *pb.RpcBlockTextSetTextResponse) *MockClientCommandsServer_BlockTextSetText_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_BlockTextSetText_Call) RunAndReturn(run func(context.Context, *pb.RpcBlockTextSetTextRequest) *pb.RpcBlockTextSetTextResponse) *MockClientCommandsServer_BlockTextSetText_Call { + _c.Call.Return(run) + return _c +} + +// BlockUpload provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) BlockUpload(_a0 context.Context, _a1 *pb.RpcBlockUploadRequest) *pb.RpcBlockUploadResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for BlockUpload") + } + + var r0 *pb.RpcBlockUploadResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcBlockUploadRequest) *pb.RpcBlockUploadResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcBlockUploadResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_BlockUpload_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'BlockUpload' +type MockClientCommandsServer_BlockUpload_Call struct { + *mock.Call +} + +// BlockUpload is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcBlockUploadRequest +func (_e *MockClientCommandsServer_Expecter) BlockUpload(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_BlockUpload_Call { + return &MockClientCommandsServer_BlockUpload_Call{Call: _e.mock.On("BlockUpload", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_BlockUpload_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcBlockUploadRequest)) *MockClientCommandsServer_BlockUpload_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcBlockUploadRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_BlockUpload_Call) Return(_a0 *pb.RpcBlockUploadResponse) *MockClientCommandsServer_BlockUpload_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_BlockUpload_Call) RunAndReturn(run func(context.Context, *pb.RpcBlockUploadRequest) *pb.RpcBlockUploadResponse) *MockClientCommandsServer_BlockUpload_Call { + _c.Call.Return(run) + return _c +} + +// BlockVideoSetName provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) BlockVideoSetName(_a0 context.Context, _a1 *pb.RpcBlockVideoSetNameRequest) *pb.RpcBlockVideoSetNameResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for BlockVideoSetName") + } + + var r0 *pb.RpcBlockVideoSetNameResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcBlockVideoSetNameRequest) *pb.RpcBlockVideoSetNameResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcBlockVideoSetNameResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_BlockVideoSetName_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'BlockVideoSetName' +type MockClientCommandsServer_BlockVideoSetName_Call struct { + *mock.Call +} + +// BlockVideoSetName is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcBlockVideoSetNameRequest +func (_e *MockClientCommandsServer_Expecter) BlockVideoSetName(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_BlockVideoSetName_Call { + return &MockClientCommandsServer_BlockVideoSetName_Call{Call: _e.mock.On("BlockVideoSetName", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_BlockVideoSetName_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcBlockVideoSetNameRequest)) *MockClientCommandsServer_BlockVideoSetName_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcBlockVideoSetNameRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_BlockVideoSetName_Call) Return(_a0 *pb.RpcBlockVideoSetNameResponse) *MockClientCommandsServer_BlockVideoSetName_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_BlockVideoSetName_Call) RunAndReturn(run func(context.Context, *pb.RpcBlockVideoSetNameRequest) *pb.RpcBlockVideoSetNameResponse) *MockClientCommandsServer_BlockVideoSetName_Call { + _c.Call.Return(run) + return _c +} + +// BlockWidgetSetLayout provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) BlockWidgetSetLayout(_a0 context.Context, _a1 *pb.RpcBlockWidgetSetLayoutRequest) *pb.RpcBlockWidgetSetLayoutResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for BlockWidgetSetLayout") + } + + var r0 *pb.RpcBlockWidgetSetLayoutResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcBlockWidgetSetLayoutRequest) *pb.RpcBlockWidgetSetLayoutResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcBlockWidgetSetLayoutResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_BlockWidgetSetLayout_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'BlockWidgetSetLayout' +type MockClientCommandsServer_BlockWidgetSetLayout_Call struct { + *mock.Call +} + +// BlockWidgetSetLayout is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcBlockWidgetSetLayoutRequest +func (_e *MockClientCommandsServer_Expecter) BlockWidgetSetLayout(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_BlockWidgetSetLayout_Call { + return &MockClientCommandsServer_BlockWidgetSetLayout_Call{Call: _e.mock.On("BlockWidgetSetLayout", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_BlockWidgetSetLayout_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcBlockWidgetSetLayoutRequest)) *MockClientCommandsServer_BlockWidgetSetLayout_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcBlockWidgetSetLayoutRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_BlockWidgetSetLayout_Call) Return(_a0 *pb.RpcBlockWidgetSetLayoutResponse) *MockClientCommandsServer_BlockWidgetSetLayout_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_BlockWidgetSetLayout_Call) RunAndReturn(run func(context.Context, *pb.RpcBlockWidgetSetLayoutRequest) *pb.RpcBlockWidgetSetLayoutResponse) *MockClientCommandsServer_BlockWidgetSetLayout_Call { + _c.Call.Return(run) + return _c +} + +// BlockWidgetSetLimit provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) BlockWidgetSetLimit(_a0 context.Context, _a1 *pb.RpcBlockWidgetSetLimitRequest) *pb.RpcBlockWidgetSetLimitResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for BlockWidgetSetLimit") + } + + var r0 *pb.RpcBlockWidgetSetLimitResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcBlockWidgetSetLimitRequest) *pb.RpcBlockWidgetSetLimitResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcBlockWidgetSetLimitResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_BlockWidgetSetLimit_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'BlockWidgetSetLimit' +type MockClientCommandsServer_BlockWidgetSetLimit_Call struct { + *mock.Call +} + +// BlockWidgetSetLimit is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcBlockWidgetSetLimitRequest +func (_e *MockClientCommandsServer_Expecter) BlockWidgetSetLimit(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_BlockWidgetSetLimit_Call { + return &MockClientCommandsServer_BlockWidgetSetLimit_Call{Call: _e.mock.On("BlockWidgetSetLimit", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_BlockWidgetSetLimit_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcBlockWidgetSetLimitRequest)) *MockClientCommandsServer_BlockWidgetSetLimit_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcBlockWidgetSetLimitRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_BlockWidgetSetLimit_Call) Return(_a0 *pb.RpcBlockWidgetSetLimitResponse) *MockClientCommandsServer_BlockWidgetSetLimit_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_BlockWidgetSetLimit_Call) RunAndReturn(run func(context.Context, *pb.RpcBlockWidgetSetLimitRequest) *pb.RpcBlockWidgetSetLimitResponse) *MockClientCommandsServer_BlockWidgetSetLimit_Call { + _c.Call.Return(run) + return _c +} + +// BlockWidgetSetTargetId provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) BlockWidgetSetTargetId(_a0 context.Context, _a1 *pb.RpcBlockWidgetSetTargetIdRequest) *pb.RpcBlockWidgetSetTargetIdResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for BlockWidgetSetTargetId") + } + + var r0 *pb.RpcBlockWidgetSetTargetIdResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcBlockWidgetSetTargetIdRequest) *pb.RpcBlockWidgetSetTargetIdResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcBlockWidgetSetTargetIdResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_BlockWidgetSetTargetId_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'BlockWidgetSetTargetId' +type MockClientCommandsServer_BlockWidgetSetTargetId_Call struct { + *mock.Call +} + +// BlockWidgetSetTargetId is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcBlockWidgetSetTargetIdRequest +func (_e *MockClientCommandsServer_Expecter) BlockWidgetSetTargetId(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_BlockWidgetSetTargetId_Call { + return &MockClientCommandsServer_BlockWidgetSetTargetId_Call{Call: _e.mock.On("BlockWidgetSetTargetId", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_BlockWidgetSetTargetId_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcBlockWidgetSetTargetIdRequest)) *MockClientCommandsServer_BlockWidgetSetTargetId_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcBlockWidgetSetTargetIdRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_BlockWidgetSetTargetId_Call) Return(_a0 *pb.RpcBlockWidgetSetTargetIdResponse) *MockClientCommandsServer_BlockWidgetSetTargetId_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_BlockWidgetSetTargetId_Call) RunAndReturn(run func(context.Context, *pb.RpcBlockWidgetSetTargetIdRequest) *pb.RpcBlockWidgetSetTargetIdResponse) *MockClientCommandsServer_BlockWidgetSetTargetId_Call { + _c.Call.Return(run) + return _c +} + +// BlockWidgetSetViewId provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) BlockWidgetSetViewId(_a0 context.Context, _a1 *pb.RpcBlockWidgetSetViewIdRequest) *pb.RpcBlockWidgetSetViewIdResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for BlockWidgetSetViewId") + } + + var r0 *pb.RpcBlockWidgetSetViewIdResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcBlockWidgetSetViewIdRequest) *pb.RpcBlockWidgetSetViewIdResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcBlockWidgetSetViewIdResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_BlockWidgetSetViewId_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'BlockWidgetSetViewId' +type MockClientCommandsServer_BlockWidgetSetViewId_Call struct { + *mock.Call +} + +// BlockWidgetSetViewId is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcBlockWidgetSetViewIdRequest +func (_e *MockClientCommandsServer_Expecter) BlockWidgetSetViewId(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_BlockWidgetSetViewId_Call { + return &MockClientCommandsServer_BlockWidgetSetViewId_Call{Call: _e.mock.On("BlockWidgetSetViewId", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_BlockWidgetSetViewId_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcBlockWidgetSetViewIdRequest)) *MockClientCommandsServer_BlockWidgetSetViewId_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcBlockWidgetSetViewIdRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_BlockWidgetSetViewId_Call) Return(_a0 *pb.RpcBlockWidgetSetViewIdResponse) *MockClientCommandsServer_BlockWidgetSetViewId_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_BlockWidgetSetViewId_Call) RunAndReturn(run func(context.Context, *pb.RpcBlockWidgetSetViewIdRequest) *pb.RpcBlockWidgetSetViewIdResponse) *MockClientCommandsServer_BlockWidgetSetViewId_Call { + _c.Call.Return(run) + return _c +} + +// BroadcastPayloadEvent provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) BroadcastPayloadEvent(_a0 context.Context, _a1 *pb.RpcBroadcastPayloadEventRequest) *pb.RpcBroadcastPayloadEventResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for BroadcastPayloadEvent") + } + + var r0 *pb.RpcBroadcastPayloadEventResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcBroadcastPayloadEventRequest) *pb.RpcBroadcastPayloadEventResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcBroadcastPayloadEventResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_BroadcastPayloadEvent_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'BroadcastPayloadEvent' +type MockClientCommandsServer_BroadcastPayloadEvent_Call struct { + *mock.Call +} + +// BroadcastPayloadEvent is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcBroadcastPayloadEventRequest +func (_e *MockClientCommandsServer_Expecter) BroadcastPayloadEvent(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_BroadcastPayloadEvent_Call { + return &MockClientCommandsServer_BroadcastPayloadEvent_Call{Call: _e.mock.On("BroadcastPayloadEvent", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_BroadcastPayloadEvent_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcBroadcastPayloadEventRequest)) *MockClientCommandsServer_BroadcastPayloadEvent_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcBroadcastPayloadEventRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_BroadcastPayloadEvent_Call) Return(_a0 *pb.RpcBroadcastPayloadEventResponse) *MockClientCommandsServer_BroadcastPayloadEvent_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_BroadcastPayloadEvent_Call) RunAndReturn(run func(context.Context, *pb.RpcBroadcastPayloadEventRequest) *pb.RpcBroadcastPayloadEventResponse) *MockClientCommandsServer_BroadcastPayloadEvent_Call { + _c.Call.Return(run) + return _c +} + +// ChatAddMessage provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) ChatAddMessage(_a0 context.Context, _a1 *pb.RpcChatAddMessageRequest) *pb.RpcChatAddMessageResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for ChatAddMessage") + } + + var r0 *pb.RpcChatAddMessageResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcChatAddMessageRequest) *pb.RpcChatAddMessageResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcChatAddMessageResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_ChatAddMessage_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ChatAddMessage' +type MockClientCommandsServer_ChatAddMessage_Call struct { + *mock.Call +} + +// ChatAddMessage is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcChatAddMessageRequest +func (_e *MockClientCommandsServer_Expecter) ChatAddMessage(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_ChatAddMessage_Call { + return &MockClientCommandsServer_ChatAddMessage_Call{Call: _e.mock.On("ChatAddMessage", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_ChatAddMessage_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcChatAddMessageRequest)) *MockClientCommandsServer_ChatAddMessage_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcChatAddMessageRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_ChatAddMessage_Call) Return(_a0 *pb.RpcChatAddMessageResponse) *MockClientCommandsServer_ChatAddMessage_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_ChatAddMessage_Call) RunAndReturn(run func(context.Context, *pb.RpcChatAddMessageRequest) *pb.RpcChatAddMessageResponse) *MockClientCommandsServer_ChatAddMessage_Call { + _c.Call.Return(run) + return _c +} + +// ChatDeleteMessage provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) ChatDeleteMessage(_a0 context.Context, _a1 *pb.RpcChatDeleteMessageRequest) *pb.RpcChatDeleteMessageResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for ChatDeleteMessage") + } + + var r0 *pb.RpcChatDeleteMessageResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcChatDeleteMessageRequest) *pb.RpcChatDeleteMessageResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcChatDeleteMessageResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_ChatDeleteMessage_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ChatDeleteMessage' +type MockClientCommandsServer_ChatDeleteMessage_Call struct { + *mock.Call +} + +// ChatDeleteMessage is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcChatDeleteMessageRequest +func (_e *MockClientCommandsServer_Expecter) ChatDeleteMessage(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_ChatDeleteMessage_Call { + return &MockClientCommandsServer_ChatDeleteMessage_Call{Call: _e.mock.On("ChatDeleteMessage", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_ChatDeleteMessage_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcChatDeleteMessageRequest)) *MockClientCommandsServer_ChatDeleteMessage_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcChatDeleteMessageRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_ChatDeleteMessage_Call) Return(_a0 *pb.RpcChatDeleteMessageResponse) *MockClientCommandsServer_ChatDeleteMessage_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_ChatDeleteMessage_Call) RunAndReturn(run func(context.Context, *pb.RpcChatDeleteMessageRequest) *pb.RpcChatDeleteMessageResponse) *MockClientCommandsServer_ChatDeleteMessage_Call { + _c.Call.Return(run) + return _c +} + +// ChatEditMessageContent provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) ChatEditMessageContent(_a0 context.Context, _a1 *pb.RpcChatEditMessageContentRequest) *pb.RpcChatEditMessageContentResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for ChatEditMessageContent") + } + + var r0 *pb.RpcChatEditMessageContentResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcChatEditMessageContentRequest) *pb.RpcChatEditMessageContentResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcChatEditMessageContentResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_ChatEditMessageContent_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ChatEditMessageContent' +type MockClientCommandsServer_ChatEditMessageContent_Call struct { + *mock.Call +} + +// ChatEditMessageContent is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcChatEditMessageContentRequest +func (_e *MockClientCommandsServer_Expecter) ChatEditMessageContent(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_ChatEditMessageContent_Call { + return &MockClientCommandsServer_ChatEditMessageContent_Call{Call: _e.mock.On("ChatEditMessageContent", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_ChatEditMessageContent_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcChatEditMessageContentRequest)) *MockClientCommandsServer_ChatEditMessageContent_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcChatEditMessageContentRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_ChatEditMessageContent_Call) Return(_a0 *pb.RpcChatEditMessageContentResponse) *MockClientCommandsServer_ChatEditMessageContent_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_ChatEditMessageContent_Call) RunAndReturn(run func(context.Context, *pb.RpcChatEditMessageContentRequest) *pb.RpcChatEditMessageContentResponse) *MockClientCommandsServer_ChatEditMessageContent_Call { + _c.Call.Return(run) + return _c +} + +// ChatGetMessages provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) ChatGetMessages(_a0 context.Context, _a1 *pb.RpcChatGetMessagesRequest) *pb.RpcChatGetMessagesResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for ChatGetMessages") + } + + var r0 *pb.RpcChatGetMessagesResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcChatGetMessagesRequest) *pb.RpcChatGetMessagesResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcChatGetMessagesResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_ChatGetMessages_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ChatGetMessages' +type MockClientCommandsServer_ChatGetMessages_Call struct { + *mock.Call +} + +// ChatGetMessages is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcChatGetMessagesRequest +func (_e *MockClientCommandsServer_Expecter) ChatGetMessages(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_ChatGetMessages_Call { + return &MockClientCommandsServer_ChatGetMessages_Call{Call: _e.mock.On("ChatGetMessages", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_ChatGetMessages_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcChatGetMessagesRequest)) *MockClientCommandsServer_ChatGetMessages_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcChatGetMessagesRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_ChatGetMessages_Call) Return(_a0 *pb.RpcChatGetMessagesResponse) *MockClientCommandsServer_ChatGetMessages_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_ChatGetMessages_Call) RunAndReturn(run func(context.Context, *pb.RpcChatGetMessagesRequest) *pb.RpcChatGetMessagesResponse) *MockClientCommandsServer_ChatGetMessages_Call { + _c.Call.Return(run) + return _c +} + +// ChatGetMessagesByIds provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) ChatGetMessagesByIds(_a0 context.Context, _a1 *pb.RpcChatGetMessagesByIdsRequest) *pb.RpcChatGetMessagesByIdsResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for ChatGetMessagesByIds") + } + + var r0 *pb.RpcChatGetMessagesByIdsResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcChatGetMessagesByIdsRequest) *pb.RpcChatGetMessagesByIdsResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcChatGetMessagesByIdsResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_ChatGetMessagesByIds_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ChatGetMessagesByIds' +type MockClientCommandsServer_ChatGetMessagesByIds_Call struct { + *mock.Call +} + +// ChatGetMessagesByIds is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcChatGetMessagesByIdsRequest +func (_e *MockClientCommandsServer_Expecter) ChatGetMessagesByIds(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_ChatGetMessagesByIds_Call { + return &MockClientCommandsServer_ChatGetMessagesByIds_Call{Call: _e.mock.On("ChatGetMessagesByIds", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_ChatGetMessagesByIds_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcChatGetMessagesByIdsRequest)) *MockClientCommandsServer_ChatGetMessagesByIds_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcChatGetMessagesByIdsRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_ChatGetMessagesByIds_Call) Return(_a0 *pb.RpcChatGetMessagesByIdsResponse) *MockClientCommandsServer_ChatGetMessagesByIds_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_ChatGetMessagesByIds_Call) RunAndReturn(run func(context.Context, *pb.RpcChatGetMessagesByIdsRequest) *pb.RpcChatGetMessagesByIdsResponse) *MockClientCommandsServer_ChatGetMessagesByIds_Call { + _c.Call.Return(run) + return _c +} + +// ChatSubscribeLastMessages provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) ChatSubscribeLastMessages(_a0 context.Context, _a1 *pb.RpcChatSubscribeLastMessagesRequest) *pb.RpcChatSubscribeLastMessagesResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for ChatSubscribeLastMessages") + } + + var r0 *pb.RpcChatSubscribeLastMessagesResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcChatSubscribeLastMessagesRequest) *pb.RpcChatSubscribeLastMessagesResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcChatSubscribeLastMessagesResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_ChatSubscribeLastMessages_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ChatSubscribeLastMessages' +type MockClientCommandsServer_ChatSubscribeLastMessages_Call struct { + *mock.Call +} + +// ChatSubscribeLastMessages is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcChatSubscribeLastMessagesRequest +func (_e *MockClientCommandsServer_Expecter) ChatSubscribeLastMessages(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_ChatSubscribeLastMessages_Call { + return &MockClientCommandsServer_ChatSubscribeLastMessages_Call{Call: _e.mock.On("ChatSubscribeLastMessages", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_ChatSubscribeLastMessages_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcChatSubscribeLastMessagesRequest)) *MockClientCommandsServer_ChatSubscribeLastMessages_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcChatSubscribeLastMessagesRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_ChatSubscribeLastMessages_Call) Return(_a0 *pb.RpcChatSubscribeLastMessagesResponse) *MockClientCommandsServer_ChatSubscribeLastMessages_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_ChatSubscribeLastMessages_Call) RunAndReturn(run func(context.Context, *pb.RpcChatSubscribeLastMessagesRequest) *pb.RpcChatSubscribeLastMessagesResponse) *MockClientCommandsServer_ChatSubscribeLastMessages_Call { + _c.Call.Return(run) + return _c +} + +// ChatToggleMessageReaction provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) ChatToggleMessageReaction(_a0 context.Context, _a1 *pb.RpcChatToggleMessageReactionRequest) *pb.RpcChatToggleMessageReactionResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for ChatToggleMessageReaction") + } + + var r0 *pb.RpcChatToggleMessageReactionResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcChatToggleMessageReactionRequest) *pb.RpcChatToggleMessageReactionResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcChatToggleMessageReactionResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_ChatToggleMessageReaction_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ChatToggleMessageReaction' +type MockClientCommandsServer_ChatToggleMessageReaction_Call struct { + *mock.Call +} + +// ChatToggleMessageReaction is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcChatToggleMessageReactionRequest +func (_e *MockClientCommandsServer_Expecter) ChatToggleMessageReaction(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_ChatToggleMessageReaction_Call { + return &MockClientCommandsServer_ChatToggleMessageReaction_Call{Call: _e.mock.On("ChatToggleMessageReaction", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_ChatToggleMessageReaction_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcChatToggleMessageReactionRequest)) *MockClientCommandsServer_ChatToggleMessageReaction_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcChatToggleMessageReactionRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_ChatToggleMessageReaction_Call) Return(_a0 *pb.RpcChatToggleMessageReactionResponse) *MockClientCommandsServer_ChatToggleMessageReaction_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_ChatToggleMessageReaction_Call) RunAndReturn(run func(context.Context, *pb.RpcChatToggleMessageReactionRequest) *pb.RpcChatToggleMessageReactionResponse) *MockClientCommandsServer_ChatToggleMessageReaction_Call { + _c.Call.Return(run) + return _c +} + +// ChatUnsubscribe provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) ChatUnsubscribe(_a0 context.Context, _a1 *pb.RpcChatUnsubscribeRequest) *pb.RpcChatUnsubscribeResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for ChatUnsubscribe") + } + + var r0 *pb.RpcChatUnsubscribeResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcChatUnsubscribeRequest) *pb.RpcChatUnsubscribeResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcChatUnsubscribeResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_ChatUnsubscribe_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ChatUnsubscribe' +type MockClientCommandsServer_ChatUnsubscribe_Call struct { + *mock.Call +} + +// ChatUnsubscribe is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcChatUnsubscribeRequest +func (_e *MockClientCommandsServer_Expecter) ChatUnsubscribe(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_ChatUnsubscribe_Call { + return &MockClientCommandsServer_ChatUnsubscribe_Call{Call: _e.mock.On("ChatUnsubscribe", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_ChatUnsubscribe_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcChatUnsubscribeRequest)) *MockClientCommandsServer_ChatUnsubscribe_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcChatUnsubscribeRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_ChatUnsubscribe_Call) Return(_a0 *pb.RpcChatUnsubscribeResponse) *MockClientCommandsServer_ChatUnsubscribe_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_ChatUnsubscribe_Call) RunAndReturn(run func(context.Context, *pb.RpcChatUnsubscribeRequest) *pb.RpcChatUnsubscribeResponse) *MockClientCommandsServer_ChatUnsubscribe_Call { + _c.Call.Return(run) + return _c +} + +// DebugAccountSelectTrace provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) DebugAccountSelectTrace(_a0 context.Context, _a1 *pb.RpcDebugAccountSelectTraceRequest) *pb.RpcDebugAccountSelectTraceResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for DebugAccountSelectTrace") + } + + var r0 *pb.RpcDebugAccountSelectTraceResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcDebugAccountSelectTraceRequest) *pb.RpcDebugAccountSelectTraceResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcDebugAccountSelectTraceResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_DebugAccountSelectTrace_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'DebugAccountSelectTrace' +type MockClientCommandsServer_DebugAccountSelectTrace_Call struct { + *mock.Call +} + +// DebugAccountSelectTrace is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcDebugAccountSelectTraceRequest +func (_e *MockClientCommandsServer_Expecter) DebugAccountSelectTrace(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_DebugAccountSelectTrace_Call { + return &MockClientCommandsServer_DebugAccountSelectTrace_Call{Call: _e.mock.On("DebugAccountSelectTrace", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_DebugAccountSelectTrace_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcDebugAccountSelectTraceRequest)) *MockClientCommandsServer_DebugAccountSelectTrace_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcDebugAccountSelectTraceRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_DebugAccountSelectTrace_Call) Return(_a0 *pb.RpcDebugAccountSelectTraceResponse) *MockClientCommandsServer_DebugAccountSelectTrace_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_DebugAccountSelectTrace_Call) RunAndReturn(run func(context.Context, *pb.RpcDebugAccountSelectTraceRequest) *pb.RpcDebugAccountSelectTraceResponse) *MockClientCommandsServer_DebugAccountSelectTrace_Call { + _c.Call.Return(run) + return _c +} + +// DebugAnystoreObjectChanges provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) DebugAnystoreObjectChanges(_a0 context.Context, _a1 *pb.RpcDebugAnystoreObjectChangesRequest) *pb.RpcDebugAnystoreObjectChangesResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for DebugAnystoreObjectChanges") + } + + var r0 *pb.RpcDebugAnystoreObjectChangesResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcDebugAnystoreObjectChangesRequest) *pb.RpcDebugAnystoreObjectChangesResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcDebugAnystoreObjectChangesResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_DebugAnystoreObjectChanges_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'DebugAnystoreObjectChanges' +type MockClientCommandsServer_DebugAnystoreObjectChanges_Call struct { + *mock.Call +} + +// DebugAnystoreObjectChanges is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcDebugAnystoreObjectChangesRequest +func (_e *MockClientCommandsServer_Expecter) DebugAnystoreObjectChanges(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_DebugAnystoreObjectChanges_Call { + return &MockClientCommandsServer_DebugAnystoreObjectChanges_Call{Call: _e.mock.On("DebugAnystoreObjectChanges", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_DebugAnystoreObjectChanges_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcDebugAnystoreObjectChangesRequest)) *MockClientCommandsServer_DebugAnystoreObjectChanges_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcDebugAnystoreObjectChangesRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_DebugAnystoreObjectChanges_Call) Return(_a0 *pb.RpcDebugAnystoreObjectChangesResponse) *MockClientCommandsServer_DebugAnystoreObjectChanges_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_DebugAnystoreObjectChanges_Call) RunAndReturn(run func(context.Context, *pb.RpcDebugAnystoreObjectChangesRequest) *pb.RpcDebugAnystoreObjectChangesResponse) *MockClientCommandsServer_DebugAnystoreObjectChanges_Call { + _c.Call.Return(run) + return _c +} + +// DebugExportLocalstore provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) DebugExportLocalstore(_a0 context.Context, _a1 *pb.RpcDebugExportLocalstoreRequest) *pb.RpcDebugExportLocalstoreResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for DebugExportLocalstore") + } + + var r0 *pb.RpcDebugExportLocalstoreResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcDebugExportLocalstoreRequest) *pb.RpcDebugExportLocalstoreResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcDebugExportLocalstoreResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_DebugExportLocalstore_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'DebugExportLocalstore' +type MockClientCommandsServer_DebugExportLocalstore_Call struct { + *mock.Call +} + +// DebugExportLocalstore is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcDebugExportLocalstoreRequest +func (_e *MockClientCommandsServer_Expecter) DebugExportLocalstore(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_DebugExportLocalstore_Call { + return &MockClientCommandsServer_DebugExportLocalstore_Call{Call: _e.mock.On("DebugExportLocalstore", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_DebugExportLocalstore_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcDebugExportLocalstoreRequest)) *MockClientCommandsServer_DebugExportLocalstore_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcDebugExportLocalstoreRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_DebugExportLocalstore_Call) Return(_a0 *pb.RpcDebugExportLocalstoreResponse) *MockClientCommandsServer_DebugExportLocalstore_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_DebugExportLocalstore_Call) RunAndReturn(run func(context.Context, *pb.RpcDebugExportLocalstoreRequest) *pb.RpcDebugExportLocalstoreResponse) *MockClientCommandsServer_DebugExportLocalstore_Call { + _c.Call.Return(run) + return _c +} + +// DebugExportLog provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) DebugExportLog(_a0 context.Context, _a1 *pb.RpcDebugExportLogRequest) *pb.RpcDebugExportLogResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for DebugExportLog") + } + + var r0 *pb.RpcDebugExportLogResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcDebugExportLogRequest) *pb.RpcDebugExportLogResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcDebugExportLogResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_DebugExportLog_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'DebugExportLog' +type MockClientCommandsServer_DebugExportLog_Call struct { + *mock.Call +} + +// DebugExportLog is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcDebugExportLogRequest +func (_e *MockClientCommandsServer_Expecter) DebugExportLog(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_DebugExportLog_Call { + return &MockClientCommandsServer_DebugExportLog_Call{Call: _e.mock.On("DebugExportLog", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_DebugExportLog_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcDebugExportLogRequest)) *MockClientCommandsServer_DebugExportLog_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcDebugExportLogRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_DebugExportLog_Call) Return(_a0 *pb.RpcDebugExportLogResponse) *MockClientCommandsServer_DebugExportLog_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_DebugExportLog_Call) RunAndReturn(run func(context.Context, *pb.RpcDebugExportLogRequest) *pb.RpcDebugExportLogResponse) *MockClientCommandsServer_DebugExportLog_Call { + _c.Call.Return(run) + return _c +} + +// DebugNetCheck provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) DebugNetCheck(_a0 context.Context, _a1 *pb.RpcDebugNetCheckRequest) *pb.RpcDebugNetCheckResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for DebugNetCheck") + } + + var r0 *pb.RpcDebugNetCheckResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcDebugNetCheckRequest) *pb.RpcDebugNetCheckResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcDebugNetCheckResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_DebugNetCheck_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'DebugNetCheck' +type MockClientCommandsServer_DebugNetCheck_Call struct { + *mock.Call +} + +// DebugNetCheck is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcDebugNetCheckRequest +func (_e *MockClientCommandsServer_Expecter) DebugNetCheck(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_DebugNetCheck_Call { + return &MockClientCommandsServer_DebugNetCheck_Call{Call: _e.mock.On("DebugNetCheck", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_DebugNetCheck_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcDebugNetCheckRequest)) *MockClientCommandsServer_DebugNetCheck_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcDebugNetCheckRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_DebugNetCheck_Call) Return(_a0 *pb.RpcDebugNetCheckResponse) *MockClientCommandsServer_DebugNetCheck_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_DebugNetCheck_Call) RunAndReturn(run func(context.Context, *pb.RpcDebugNetCheckRequest) *pb.RpcDebugNetCheckResponse) *MockClientCommandsServer_DebugNetCheck_Call { + _c.Call.Return(run) + return _c +} + +// DebugOpenedObjects provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) DebugOpenedObjects(_a0 context.Context, _a1 *pb.RpcDebugOpenedObjectsRequest) *pb.RpcDebugOpenedObjectsResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for DebugOpenedObjects") + } + + var r0 *pb.RpcDebugOpenedObjectsResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcDebugOpenedObjectsRequest) *pb.RpcDebugOpenedObjectsResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcDebugOpenedObjectsResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_DebugOpenedObjects_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'DebugOpenedObjects' +type MockClientCommandsServer_DebugOpenedObjects_Call struct { + *mock.Call +} + +// DebugOpenedObjects is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcDebugOpenedObjectsRequest +func (_e *MockClientCommandsServer_Expecter) DebugOpenedObjects(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_DebugOpenedObjects_Call { + return &MockClientCommandsServer_DebugOpenedObjects_Call{Call: _e.mock.On("DebugOpenedObjects", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_DebugOpenedObjects_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcDebugOpenedObjectsRequest)) *MockClientCommandsServer_DebugOpenedObjects_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcDebugOpenedObjectsRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_DebugOpenedObjects_Call) Return(_a0 *pb.RpcDebugOpenedObjectsResponse) *MockClientCommandsServer_DebugOpenedObjects_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_DebugOpenedObjects_Call) RunAndReturn(run func(context.Context, *pb.RpcDebugOpenedObjectsRequest) *pb.RpcDebugOpenedObjectsResponse) *MockClientCommandsServer_DebugOpenedObjects_Call { + _c.Call.Return(run) + return _c +} + +// DebugPing provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) DebugPing(_a0 context.Context, _a1 *pb.RpcDebugPingRequest) *pb.RpcDebugPingResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for DebugPing") + } + + var r0 *pb.RpcDebugPingResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcDebugPingRequest) *pb.RpcDebugPingResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcDebugPingResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_DebugPing_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'DebugPing' +type MockClientCommandsServer_DebugPing_Call struct { + *mock.Call +} + +// DebugPing is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcDebugPingRequest +func (_e *MockClientCommandsServer_Expecter) DebugPing(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_DebugPing_Call { + return &MockClientCommandsServer_DebugPing_Call{Call: _e.mock.On("DebugPing", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_DebugPing_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcDebugPingRequest)) *MockClientCommandsServer_DebugPing_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcDebugPingRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_DebugPing_Call) Return(_a0 *pb.RpcDebugPingResponse) *MockClientCommandsServer_DebugPing_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_DebugPing_Call) RunAndReturn(run func(context.Context, *pb.RpcDebugPingRequest) *pb.RpcDebugPingResponse) *MockClientCommandsServer_DebugPing_Call { + _c.Call.Return(run) + return _c +} + +// DebugRunProfiler provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) DebugRunProfiler(_a0 context.Context, _a1 *pb.RpcDebugRunProfilerRequest) *pb.RpcDebugRunProfilerResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for DebugRunProfiler") + } + + var r0 *pb.RpcDebugRunProfilerResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcDebugRunProfilerRequest) *pb.RpcDebugRunProfilerResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcDebugRunProfilerResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_DebugRunProfiler_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'DebugRunProfiler' +type MockClientCommandsServer_DebugRunProfiler_Call struct { + *mock.Call +} + +// DebugRunProfiler is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcDebugRunProfilerRequest +func (_e *MockClientCommandsServer_Expecter) DebugRunProfiler(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_DebugRunProfiler_Call { + return &MockClientCommandsServer_DebugRunProfiler_Call{Call: _e.mock.On("DebugRunProfiler", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_DebugRunProfiler_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcDebugRunProfilerRequest)) *MockClientCommandsServer_DebugRunProfiler_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcDebugRunProfilerRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_DebugRunProfiler_Call) Return(_a0 *pb.RpcDebugRunProfilerResponse) *MockClientCommandsServer_DebugRunProfiler_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_DebugRunProfiler_Call) RunAndReturn(run func(context.Context, *pb.RpcDebugRunProfilerRequest) *pb.RpcDebugRunProfilerResponse) *MockClientCommandsServer_DebugRunProfiler_Call { + _c.Call.Return(run) + return _c +} + +// DebugSpaceSummary provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) DebugSpaceSummary(_a0 context.Context, _a1 *pb.RpcDebugSpaceSummaryRequest) *pb.RpcDebugSpaceSummaryResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for DebugSpaceSummary") + } + + var r0 *pb.RpcDebugSpaceSummaryResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcDebugSpaceSummaryRequest) *pb.RpcDebugSpaceSummaryResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcDebugSpaceSummaryResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_DebugSpaceSummary_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'DebugSpaceSummary' +type MockClientCommandsServer_DebugSpaceSummary_Call struct { + *mock.Call +} + +// DebugSpaceSummary is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcDebugSpaceSummaryRequest +func (_e *MockClientCommandsServer_Expecter) DebugSpaceSummary(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_DebugSpaceSummary_Call { + return &MockClientCommandsServer_DebugSpaceSummary_Call{Call: _e.mock.On("DebugSpaceSummary", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_DebugSpaceSummary_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcDebugSpaceSummaryRequest)) *MockClientCommandsServer_DebugSpaceSummary_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcDebugSpaceSummaryRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_DebugSpaceSummary_Call) Return(_a0 *pb.RpcDebugSpaceSummaryResponse) *MockClientCommandsServer_DebugSpaceSummary_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_DebugSpaceSummary_Call) RunAndReturn(run func(context.Context, *pb.RpcDebugSpaceSummaryRequest) *pb.RpcDebugSpaceSummaryResponse) *MockClientCommandsServer_DebugSpaceSummary_Call { + _c.Call.Return(run) + return _c +} + +// DebugStackGoroutines provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) DebugStackGoroutines(_a0 context.Context, _a1 *pb.RpcDebugStackGoroutinesRequest) *pb.RpcDebugStackGoroutinesResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for DebugStackGoroutines") + } + + var r0 *pb.RpcDebugStackGoroutinesResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcDebugStackGoroutinesRequest) *pb.RpcDebugStackGoroutinesResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcDebugStackGoroutinesResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_DebugStackGoroutines_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'DebugStackGoroutines' +type MockClientCommandsServer_DebugStackGoroutines_Call struct { + *mock.Call +} + +// DebugStackGoroutines is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcDebugStackGoroutinesRequest +func (_e *MockClientCommandsServer_Expecter) DebugStackGoroutines(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_DebugStackGoroutines_Call { + return &MockClientCommandsServer_DebugStackGoroutines_Call{Call: _e.mock.On("DebugStackGoroutines", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_DebugStackGoroutines_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcDebugStackGoroutinesRequest)) *MockClientCommandsServer_DebugStackGoroutines_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcDebugStackGoroutinesRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_DebugStackGoroutines_Call) Return(_a0 *pb.RpcDebugStackGoroutinesResponse) *MockClientCommandsServer_DebugStackGoroutines_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_DebugStackGoroutines_Call) RunAndReturn(run func(context.Context, *pb.RpcDebugStackGoroutinesRequest) *pb.RpcDebugStackGoroutinesResponse) *MockClientCommandsServer_DebugStackGoroutines_Call { + _c.Call.Return(run) + return _c +} + +// DebugStat provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) DebugStat(_a0 context.Context, _a1 *pb.RpcDebugStatRequest) *pb.RpcDebugStatResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for DebugStat") + } + + var r0 *pb.RpcDebugStatResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcDebugStatRequest) *pb.RpcDebugStatResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcDebugStatResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_DebugStat_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'DebugStat' +type MockClientCommandsServer_DebugStat_Call struct { + *mock.Call +} + +// DebugStat is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcDebugStatRequest +func (_e *MockClientCommandsServer_Expecter) DebugStat(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_DebugStat_Call { + return &MockClientCommandsServer_DebugStat_Call{Call: _e.mock.On("DebugStat", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_DebugStat_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcDebugStatRequest)) *MockClientCommandsServer_DebugStat_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcDebugStatRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_DebugStat_Call) Return(_a0 *pb.RpcDebugStatResponse) *MockClientCommandsServer_DebugStat_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_DebugStat_Call) RunAndReturn(run func(context.Context, *pb.RpcDebugStatRequest) *pb.RpcDebugStatResponse) *MockClientCommandsServer_DebugStat_Call { + _c.Call.Return(run) + return _c +} + +// DebugSubscriptions provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) DebugSubscriptions(_a0 context.Context, _a1 *pb.RpcDebugSubscriptionsRequest) *pb.RpcDebugSubscriptionsResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for DebugSubscriptions") + } + + var r0 *pb.RpcDebugSubscriptionsResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcDebugSubscriptionsRequest) *pb.RpcDebugSubscriptionsResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcDebugSubscriptionsResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_DebugSubscriptions_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'DebugSubscriptions' +type MockClientCommandsServer_DebugSubscriptions_Call struct { + *mock.Call +} + +// DebugSubscriptions is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcDebugSubscriptionsRequest +func (_e *MockClientCommandsServer_Expecter) DebugSubscriptions(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_DebugSubscriptions_Call { + return &MockClientCommandsServer_DebugSubscriptions_Call{Call: _e.mock.On("DebugSubscriptions", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_DebugSubscriptions_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcDebugSubscriptionsRequest)) *MockClientCommandsServer_DebugSubscriptions_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcDebugSubscriptionsRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_DebugSubscriptions_Call) Return(_a0 *pb.RpcDebugSubscriptionsResponse) *MockClientCommandsServer_DebugSubscriptions_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_DebugSubscriptions_Call) RunAndReturn(run func(context.Context, *pb.RpcDebugSubscriptionsRequest) *pb.RpcDebugSubscriptionsResponse) *MockClientCommandsServer_DebugSubscriptions_Call { + _c.Call.Return(run) + return _c +} + +// DebugTree provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) DebugTree(_a0 context.Context, _a1 *pb.RpcDebugTreeRequest) *pb.RpcDebugTreeResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for DebugTree") + } + + var r0 *pb.RpcDebugTreeResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcDebugTreeRequest) *pb.RpcDebugTreeResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcDebugTreeResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_DebugTree_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'DebugTree' +type MockClientCommandsServer_DebugTree_Call struct { + *mock.Call +} + +// DebugTree is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcDebugTreeRequest +func (_e *MockClientCommandsServer_Expecter) DebugTree(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_DebugTree_Call { + return &MockClientCommandsServer_DebugTree_Call{Call: _e.mock.On("DebugTree", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_DebugTree_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcDebugTreeRequest)) *MockClientCommandsServer_DebugTree_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcDebugTreeRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_DebugTree_Call) Return(_a0 *pb.RpcDebugTreeResponse) *MockClientCommandsServer_DebugTree_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_DebugTree_Call) RunAndReturn(run func(context.Context, *pb.RpcDebugTreeRequest) *pb.RpcDebugTreeResponse) *MockClientCommandsServer_DebugTree_Call { + _c.Call.Return(run) + return _c +} + +// DebugTreeHeads provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) DebugTreeHeads(_a0 context.Context, _a1 *pb.RpcDebugTreeHeadsRequest) *pb.RpcDebugTreeHeadsResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for DebugTreeHeads") + } + + var r0 *pb.RpcDebugTreeHeadsResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcDebugTreeHeadsRequest) *pb.RpcDebugTreeHeadsResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcDebugTreeHeadsResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_DebugTreeHeads_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'DebugTreeHeads' +type MockClientCommandsServer_DebugTreeHeads_Call struct { + *mock.Call +} + +// DebugTreeHeads is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcDebugTreeHeadsRequest +func (_e *MockClientCommandsServer_Expecter) DebugTreeHeads(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_DebugTreeHeads_Call { + return &MockClientCommandsServer_DebugTreeHeads_Call{Call: _e.mock.On("DebugTreeHeads", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_DebugTreeHeads_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcDebugTreeHeadsRequest)) *MockClientCommandsServer_DebugTreeHeads_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcDebugTreeHeadsRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_DebugTreeHeads_Call) Return(_a0 *pb.RpcDebugTreeHeadsResponse) *MockClientCommandsServer_DebugTreeHeads_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_DebugTreeHeads_Call) RunAndReturn(run func(context.Context, *pb.RpcDebugTreeHeadsRequest) *pb.RpcDebugTreeHeadsResponse) *MockClientCommandsServer_DebugTreeHeads_Call { + _c.Call.Return(run) + return _c +} + +// DeviceList provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) DeviceList(_a0 context.Context, _a1 *pb.RpcDeviceListRequest) *pb.RpcDeviceListResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for DeviceList") + } + + var r0 *pb.RpcDeviceListResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcDeviceListRequest) *pb.RpcDeviceListResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcDeviceListResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_DeviceList_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'DeviceList' +type MockClientCommandsServer_DeviceList_Call struct { + *mock.Call +} + +// DeviceList is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcDeviceListRequest +func (_e *MockClientCommandsServer_Expecter) DeviceList(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_DeviceList_Call { + return &MockClientCommandsServer_DeviceList_Call{Call: _e.mock.On("DeviceList", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_DeviceList_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcDeviceListRequest)) *MockClientCommandsServer_DeviceList_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcDeviceListRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_DeviceList_Call) Return(_a0 *pb.RpcDeviceListResponse) *MockClientCommandsServer_DeviceList_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_DeviceList_Call) RunAndReturn(run func(context.Context, *pb.RpcDeviceListRequest) *pb.RpcDeviceListResponse) *MockClientCommandsServer_DeviceList_Call { + _c.Call.Return(run) + return _c +} + +// DeviceNetworkStateSet provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) DeviceNetworkStateSet(_a0 context.Context, _a1 *pb.RpcDeviceNetworkStateSetRequest) *pb.RpcDeviceNetworkStateSetResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for DeviceNetworkStateSet") + } + + var r0 *pb.RpcDeviceNetworkStateSetResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcDeviceNetworkStateSetRequest) *pb.RpcDeviceNetworkStateSetResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcDeviceNetworkStateSetResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_DeviceNetworkStateSet_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'DeviceNetworkStateSet' +type MockClientCommandsServer_DeviceNetworkStateSet_Call struct { + *mock.Call +} + +// DeviceNetworkStateSet is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcDeviceNetworkStateSetRequest +func (_e *MockClientCommandsServer_Expecter) DeviceNetworkStateSet(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_DeviceNetworkStateSet_Call { + return &MockClientCommandsServer_DeviceNetworkStateSet_Call{Call: _e.mock.On("DeviceNetworkStateSet", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_DeviceNetworkStateSet_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcDeviceNetworkStateSetRequest)) *MockClientCommandsServer_DeviceNetworkStateSet_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcDeviceNetworkStateSetRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_DeviceNetworkStateSet_Call) Return(_a0 *pb.RpcDeviceNetworkStateSetResponse) *MockClientCommandsServer_DeviceNetworkStateSet_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_DeviceNetworkStateSet_Call) RunAndReturn(run func(context.Context, *pb.RpcDeviceNetworkStateSetRequest) *pb.RpcDeviceNetworkStateSetResponse) *MockClientCommandsServer_DeviceNetworkStateSet_Call { + _c.Call.Return(run) + return _c +} + +// DeviceSetName provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) DeviceSetName(_a0 context.Context, _a1 *pb.RpcDeviceSetNameRequest) *pb.RpcDeviceSetNameResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for DeviceSetName") + } + + var r0 *pb.RpcDeviceSetNameResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcDeviceSetNameRequest) *pb.RpcDeviceSetNameResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcDeviceSetNameResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_DeviceSetName_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'DeviceSetName' +type MockClientCommandsServer_DeviceSetName_Call struct { + *mock.Call +} + +// DeviceSetName is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcDeviceSetNameRequest +func (_e *MockClientCommandsServer_Expecter) DeviceSetName(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_DeviceSetName_Call { + return &MockClientCommandsServer_DeviceSetName_Call{Call: _e.mock.On("DeviceSetName", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_DeviceSetName_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcDeviceSetNameRequest)) *MockClientCommandsServer_DeviceSetName_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcDeviceSetNameRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_DeviceSetName_Call) Return(_a0 *pb.RpcDeviceSetNameResponse) *MockClientCommandsServer_DeviceSetName_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_DeviceSetName_Call) RunAndReturn(run func(context.Context, *pb.RpcDeviceSetNameRequest) *pb.RpcDeviceSetNameResponse) *MockClientCommandsServer_DeviceSetName_Call { + _c.Call.Return(run) + return _c +} + +// FileDownload provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) FileDownload(_a0 context.Context, _a1 *pb.RpcFileDownloadRequest) *pb.RpcFileDownloadResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for FileDownload") + } + + var r0 *pb.RpcFileDownloadResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcFileDownloadRequest) *pb.RpcFileDownloadResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcFileDownloadResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_FileDownload_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'FileDownload' +type MockClientCommandsServer_FileDownload_Call struct { + *mock.Call +} + +// FileDownload is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcFileDownloadRequest +func (_e *MockClientCommandsServer_Expecter) FileDownload(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_FileDownload_Call { + return &MockClientCommandsServer_FileDownload_Call{Call: _e.mock.On("FileDownload", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_FileDownload_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcFileDownloadRequest)) *MockClientCommandsServer_FileDownload_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcFileDownloadRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_FileDownload_Call) Return(_a0 *pb.RpcFileDownloadResponse) *MockClientCommandsServer_FileDownload_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_FileDownload_Call) RunAndReturn(run func(context.Context, *pb.RpcFileDownloadRequest) *pb.RpcFileDownloadResponse) *MockClientCommandsServer_FileDownload_Call { + _c.Call.Return(run) + return _c +} + +// FileDrop provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) FileDrop(_a0 context.Context, _a1 *pb.RpcFileDropRequest) *pb.RpcFileDropResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for FileDrop") + } + + var r0 *pb.RpcFileDropResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcFileDropRequest) *pb.RpcFileDropResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcFileDropResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_FileDrop_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'FileDrop' +type MockClientCommandsServer_FileDrop_Call struct { + *mock.Call +} + +// FileDrop is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcFileDropRequest +func (_e *MockClientCommandsServer_Expecter) FileDrop(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_FileDrop_Call { + return &MockClientCommandsServer_FileDrop_Call{Call: _e.mock.On("FileDrop", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_FileDrop_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcFileDropRequest)) *MockClientCommandsServer_FileDrop_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcFileDropRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_FileDrop_Call) Return(_a0 *pb.RpcFileDropResponse) *MockClientCommandsServer_FileDrop_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_FileDrop_Call) RunAndReturn(run func(context.Context, *pb.RpcFileDropRequest) *pb.RpcFileDropResponse) *MockClientCommandsServer_FileDrop_Call { + _c.Call.Return(run) + return _c +} + +// FileListOffload provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) FileListOffload(_a0 context.Context, _a1 *pb.RpcFileListOffloadRequest) *pb.RpcFileListOffloadResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for FileListOffload") + } + + var r0 *pb.RpcFileListOffloadResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcFileListOffloadRequest) *pb.RpcFileListOffloadResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcFileListOffloadResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_FileListOffload_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'FileListOffload' +type MockClientCommandsServer_FileListOffload_Call struct { + *mock.Call +} + +// FileListOffload is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcFileListOffloadRequest +func (_e *MockClientCommandsServer_Expecter) FileListOffload(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_FileListOffload_Call { + return &MockClientCommandsServer_FileListOffload_Call{Call: _e.mock.On("FileListOffload", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_FileListOffload_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcFileListOffloadRequest)) *MockClientCommandsServer_FileListOffload_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcFileListOffloadRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_FileListOffload_Call) Return(_a0 *pb.RpcFileListOffloadResponse) *MockClientCommandsServer_FileListOffload_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_FileListOffload_Call) RunAndReturn(run func(context.Context, *pb.RpcFileListOffloadRequest) *pb.RpcFileListOffloadResponse) *MockClientCommandsServer_FileListOffload_Call { + _c.Call.Return(run) + return _c +} + +// FileNodeUsage provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) FileNodeUsage(_a0 context.Context, _a1 *pb.RpcFileNodeUsageRequest) *pb.RpcFileNodeUsageResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for FileNodeUsage") + } + + var r0 *pb.RpcFileNodeUsageResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcFileNodeUsageRequest) *pb.RpcFileNodeUsageResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcFileNodeUsageResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_FileNodeUsage_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'FileNodeUsage' +type MockClientCommandsServer_FileNodeUsage_Call struct { + *mock.Call +} + +// FileNodeUsage is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcFileNodeUsageRequest +func (_e *MockClientCommandsServer_Expecter) FileNodeUsage(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_FileNodeUsage_Call { + return &MockClientCommandsServer_FileNodeUsage_Call{Call: _e.mock.On("FileNodeUsage", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_FileNodeUsage_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcFileNodeUsageRequest)) *MockClientCommandsServer_FileNodeUsage_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcFileNodeUsageRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_FileNodeUsage_Call) Return(_a0 *pb.RpcFileNodeUsageResponse) *MockClientCommandsServer_FileNodeUsage_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_FileNodeUsage_Call) RunAndReturn(run func(context.Context, *pb.RpcFileNodeUsageRequest) *pb.RpcFileNodeUsageResponse) *MockClientCommandsServer_FileNodeUsage_Call { + _c.Call.Return(run) + return _c +} + +// FileReconcile provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) FileReconcile(_a0 context.Context, _a1 *pb.RpcFileReconcileRequest) *pb.RpcFileReconcileResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for FileReconcile") + } + + var r0 *pb.RpcFileReconcileResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcFileReconcileRequest) *pb.RpcFileReconcileResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcFileReconcileResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_FileReconcile_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'FileReconcile' +type MockClientCommandsServer_FileReconcile_Call struct { + *mock.Call +} + +// FileReconcile is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcFileReconcileRequest +func (_e *MockClientCommandsServer_Expecter) FileReconcile(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_FileReconcile_Call { + return &MockClientCommandsServer_FileReconcile_Call{Call: _e.mock.On("FileReconcile", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_FileReconcile_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcFileReconcileRequest)) *MockClientCommandsServer_FileReconcile_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcFileReconcileRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_FileReconcile_Call) Return(_a0 *pb.RpcFileReconcileResponse) *MockClientCommandsServer_FileReconcile_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_FileReconcile_Call) RunAndReturn(run func(context.Context, *pb.RpcFileReconcileRequest) *pb.RpcFileReconcileResponse) *MockClientCommandsServer_FileReconcile_Call { + _c.Call.Return(run) + return _c +} + +// FileSpaceOffload provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) FileSpaceOffload(_a0 context.Context, _a1 *pb.RpcFileSpaceOffloadRequest) *pb.RpcFileSpaceOffloadResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for FileSpaceOffload") + } + + var r0 *pb.RpcFileSpaceOffloadResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcFileSpaceOffloadRequest) *pb.RpcFileSpaceOffloadResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcFileSpaceOffloadResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_FileSpaceOffload_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'FileSpaceOffload' +type MockClientCommandsServer_FileSpaceOffload_Call struct { + *mock.Call +} + +// FileSpaceOffload is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcFileSpaceOffloadRequest +func (_e *MockClientCommandsServer_Expecter) FileSpaceOffload(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_FileSpaceOffload_Call { + return &MockClientCommandsServer_FileSpaceOffload_Call{Call: _e.mock.On("FileSpaceOffload", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_FileSpaceOffload_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcFileSpaceOffloadRequest)) *MockClientCommandsServer_FileSpaceOffload_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcFileSpaceOffloadRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_FileSpaceOffload_Call) Return(_a0 *pb.RpcFileSpaceOffloadResponse) *MockClientCommandsServer_FileSpaceOffload_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_FileSpaceOffload_Call) RunAndReturn(run func(context.Context, *pb.RpcFileSpaceOffloadRequest) *pb.RpcFileSpaceOffloadResponse) *MockClientCommandsServer_FileSpaceOffload_Call { + _c.Call.Return(run) + return _c +} + +// FileSpaceUsage provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) FileSpaceUsage(_a0 context.Context, _a1 *pb.RpcFileSpaceUsageRequest) *pb.RpcFileSpaceUsageResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for FileSpaceUsage") + } + + var r0 *pb.RpcFileSpaceUsageResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcFileSpaceUsageRequest) *pb.RpcFileSpaceUsageResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcFileSpaceUsageResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_FileSpaceUsage_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'FileSpaceUsage' +type MockClientCommandsServer_FileSpaceUsage_Call struct { + *mock.Call +} + +// FileSpaceUsage is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcFileSpaceUsageRequest +func (_e *MockClientCommandsServer_Expecter) FileSpaceUsage(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_FileSpaceUsage_Call { + return &MockClientCommandsServer_FileSpaceUsage_Call{Call: _e.mock.On("FileSpaceUsage", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_FileSpaceUsage_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcFileSpaceUsageRequest)) *MockClientCommandsServer_FileSpaceUsage_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcFileSpaceUsageRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_FileSpaceUsage_Call) Return(_a0 *pb.RpcFileSpaceUsageResponse) *MockClientCommandsServer_FileSpaceUsage_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_FileSpaceUsage_Call) RunAndReturn(run func(context.Context, *pb.RpcFileSpaceUsageRequest) *pb.RpcFileSpaceUsageResponse) *MockClientCommandsServer_FileSpaceUsage_Call { + _c.Call.Return(run) + return _c +} + +// FileUpload provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) FileUpload(_a0 context.Context, _a1 *pb.RpcFileUploadRequest) *pb.RpcFileUploadResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for FileUpload") + } + + var r0 *pb.RpcFileUploadResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcFileUploadRequest) *pb.RpcFileUploadResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcFileUploadResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_FileUpload_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'FileUpload' +type MockClientCommandsServer_FileUpload_Call struct { + *mock.Call +} + +// FileUpload is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcFileUploadRequest +func (_e *MockClientCommandsServer_Expecter) FileUpload(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_FileUpload_Call { + return &MockClientCommandsServer_FileUpload_Call{Call: _e.mock.On("FileUpload", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_FileUpload_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcFileUploadRequest)) *MockClientCommandsServer_FileUpload_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcFileUploadRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_FileUpload_Call) Return(_a0 *pb.RpcFileUploadResponse) *MockClientCommandsServer_FileUpload_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_FileUpload_Call) RunAndReturn(run func(context.Context, *pb.RpcFileUploadRequest) *pb.RpcFileUploadResponse) *MockClientCommandsServer_FileUpload_Call { + _c.Call.Return(run) + return _c +} + +// GalleryDownloadIndex provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) GalleryDownloadIndex(_a0 context.Context, _a1 *pb.RpcGalleryDownloadIndexRequest) *pb.RpcGalleryDownloadIndexResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for GalleryDownloadIndex") + } + + var r0 *pb.RpcGalleryDownloadIndexResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcGalleryDownloadIndexRequest) *pb.RpcGalleryDownloadIndexResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcGalleryDownloadIndexResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_GalleryDownloadIndex_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GalleryDownloadIndex' +type MockClientCommandsServer_GalleryDownloadIndex_Call struct { + *mock.Call +} + +// GalleryDownloadIndex is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcGalleryDownloadIndexRequest +func (_e *MockClientCommandsServer_Expecter) GalleryDownloadIndex(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_GalleryDownloadIndex_Call { + return &MockClientCommandsServer_GalleryDownloadIndex_Call{Call: _e.mock.On("GalleryDownloadIndex", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_GalleryDownloadIndex_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcGalleryDownloadIndexRequest)) *MockClientCommandsServer_GalleryDownloadIndex_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcGalleryDownloadIndexRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_GalleryDownloadIndex_Call) Return(_a0 *pb.RpcGalleryDownloadIndexResponse) *MockClientCommandsServer_GalleryDownloadIndex_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_GalleryDownloadIndex_Call) RunAndReturn(run func(context.Context, *pb.RpcGalleryDownloadIndexRequest) *pb.RpcGalleryDownloadIndexResponse) *MockClientCommandsServer_GalleryDownloadIndex_Call { + _c.Call.Return(run) + return _c +} + +// GalleryDownloadManifest provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) GalleryDownloadManifest(_a0 context.Context, _a1 *pb.RpcGalleryDownloadManifestRequest) *pb.RpcGalleryDownloadManifestResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for GalleryDownloadManifest") + } + + var r0 *pb.RpcGalleryDownloadManifestResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcGalleryDownloadManifestRequest) *pb.RpcGalleryDownloadManifestResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcGalleryDownloadManifestResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_GalleryDownloadManifest_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GalleryDownloadManifest' +type MockClientCommandsServer_GalleryDownloadManifest_Call struct { + *mock.Call +} + +// GalleryDownloadManifest is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcGalleryDownloadManifestRequest +func (_e *MockClientCommandsServer_Expecter) GalleryDownloadManifest(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_GalleryDownloadManifest_Call { + return &MockClientCommandsServer_GalleryDownloadManifest_Call{Call: _e.mock.On("GalleryDownloadManifest", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_GalleryDownloadManifest_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcGalleryDownloadManifestRequest)) *MockClientCommandsServer_GalleryDownloadManifest_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcGalleryDownloadManifestRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_GalleryDownloadManifest_Call) Return(_a0 *pb.RpcGalleryDownloadManifestResponse) *MockClientCommandsServer_GalleryDownloadManifest_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_GalleryDownloadManifest_Call) RunAndReturn(run func(context.Context, *pb.RpcGalleryDownloadManifestRequest) *pb.RpcGalleryDownloadManifestResponse) *MockClientCommandsServer_GalleryDownloadManifest_Call { + _c.Call.Return(run) + return _c +} + +// HistoryDiffVersions provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) HistoryDiffVersions(_a0 context.Context, _a1 *pb.RpcHistoryDiffVersionsRequest) *pb.RpcHistoryDiffVersionsResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for HistoryDiffVersions") + } + + var r0 *pb.RpcHistoryDiffVersionsResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcHistoryDiffVersionsRequest) *pb.RpcHistoryDiffVersionsResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcHistoryDiffVersionsResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_HistoryDiffVersions_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'HistoryDiffVersions' +type MockClientCommandsServer_HistoryDiffVersions_Call struct { + *mock.Call +} + +// HistoryDiffVersions is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcHistoryDiffVersionsRequest +func (_e *MockClientCommandsServer_Expecter) HistoryDiffVersions(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_HistoryDiffVersions_Call { + return &MockClientCommandsServer_HistoryDiffVersions_Call{Call: _e.mock.On("HistoryDiffVersions", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_HistoryDiffVersions_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcHistoryDiffVersionsRequest)) *MockClientCommandsServer_HistoryDiffVersions_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcHistoryDiffVersionsRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_HistoryDiffVersions_Call) Return(_a0 *pb.RpcHistoryDiffVersionsResponse) *MockClientCommandsServer_HistoryDiffVersions_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_HistoryDiffVersions_Call) RunAndReturn(run func(context.Context, *pb.RpcHistoryDiffVersionsRequest) *pb.RpcHistoryDiffVersionsResponse) *MockClientCommandsServer_HistoryDiffVersions_Call { + _c.Call.Return(run) + return _c +} + +// HistoryGetVersions provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) HistoryGetVersions(_a0 context.Context, _a1 *pb.RpcHistoryGetVersionsRequest) *pb.RpcHistoryGetVersionsResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for HistoryGetVersions") + } + + var r0 *pb.RpcHistoryGetVersionsResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcHistoryGetVersionsRequest) *pb.RpcHistoryGetVersionsResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcHistoryGetVersionsResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_HistoryGetVersions_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'HistoryGetVersions' +type MockClientCommandsServer_HistoryGetVersions_Call struct { + *mock.Call +} + +// HistoryGetVersions is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcHistoryGetVersionsRequest +func (_e *MockClientCommandsServer_Expecter) HistoryGetVersions(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_HistoryGetVersions_Call { + return &MockClientCommandsServer_HistoryGetVersions_Call{Call: _e.mock.On("HistoryGetVersions", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_HistoryGetVersions_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcHistoryGetVersionsRequest)) *MockClientCommandsServer_HistoryGetVersions_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcHistoryGetVersionsRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_HistoryGetVersions_Call) Return(_a0 *pb.RpcHistoryGetVersionsResponse) *MockClientCommandsServer_HistoryGetVersions_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_HistoryGetVersions_Call) RunAndReturn(run func(context.Context, *pb.RpcHistoryGetVersionsRequest) *pb.RpcHistoryGetVersionsResponse) *MockClientCommandsServer_HistoryGetVersions_Call { + _c.Call.Return(run) + return _c +} + +// HistorySetVersion provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) HistorySetVersion(_a0 context.Context, _a1 *pb.RpcHistorySetVersionRequest) *pb.RpcHistorySetVersionResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for HistorySetVersion") + } + + var r0 *pb.RpcHistorySetVersionResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcHistorySetVersionRequest) *pb.RpcHistorySetVersionResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcHistorySetVersionResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_HistorySetVersion_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'HistorySetVersion' +type MockClientCommandsServer_HistorySetVersion_Call struct { + *mock.Call +} + +// HistorySetVersion is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcHistorySetVersionRequest +func (_e *MockClientCommandsServer_Expecter) HistorySetVersion(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_HistorySetVersion_Call { + return &MockClientCommandsServer_HistorySetVersion_Call{Call: _e.mock.On("HistorySetVersion", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_HistorySetVersion_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcHistorySetVersionRequest)) *MockClientCommandsServer_HistorySetVersion_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcHistorySetVersionRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_HistorySetVersion_Call) Return(_a0 *pb.RpcHistorySetVersionResponse) *MockClientCommandsServer_HistorySetVersion_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_HistorySetVersion_Call) RunAndReturn(run func(context.Context, *pb.RpcHistorySetVersionRequest) *pb.RpcHistorySetVersionResponse) *MockClientCommandsServer_HistorySetVersion_Call { + _c.Call.Return(run) + return _c +} + +// HistoryShowVersion provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) HistoryShowVersion(_a0 context.Context, _a1 *pb.RpcHistoryShowVersionRequest) *pb.RpcHistoryShowVersionResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for HistoryShowVersion") + } + + var r0 *pb.RpcHistoryShowVersionResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcHistoryShowVersionRequest) *pb.RpcHistoryShowVersionResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcHistoryShowVersionResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_HistoryShowVersion_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'HistoryShowVersion' +type MockClientCommandsServer_HistoryShowVersion_Call struct { + *mock.Call +} + +// HistoryShowVersion is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcHistoryShowVersionRequest +func (_e *MockClientCommandsServer_Expecter) HistoryShowVersion(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_HistoryShowVersion_Call { + return &MockClientCommandsServer_HistoryShowVersion_Call{Call: _e.mock.On("HistoryShowVersion", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_HistoryShowVersion_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcHistoryShowVersionRequest)) *MockClientCommandsServer_HistoryShowVersion_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcHistoryShowVersionRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_HistoryShowVersion_Call) Return(_a0 *pb.RpcHistoryShowVersionResponse) *MockClientCommandsServer_HistoryShowVersion_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_HistoryShowVersion_Call) RunAndReturn(run func(context.Context, *pb.RpcHistoryShowVersionRequest) *pb.RpcHistoryShowVersionResponse) *MockClientCommandsServer_HistoryShowVersion_Call { + _c.Call.Return(run) + return _c +} + +// InitialSetParameters provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) InitialSetParameters(_a0 context.Context, _a1 *pb.RpcInitialSetParametersRequest) *pb.RpcInitialSetParametersResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for InitialSetParameters") + } + + var r0 *pb.RpcInitialSetParametersResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcInitialSetParametersRequest) *pb.RpcInitialSetParametersResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcInitialSetParametersResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_InitialSetParameters_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'InitialSetParameters' +type MockClientCommandsServer_InitialSetParameters_Call struct { + *mock.Call +} + +// InitialSetParameters is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcInitialSetParametersRequest +func (_e *MockClientCommandsServer_Expecter) InitialSetParameters(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_InitialSetParameters_Call { + return &MockClientCommandsServer_InitialSetParameters_Call{Call: _e.mock.On("InitialSetParameters", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_InitialSetParameters_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcInitialSetParametersRequest)) *MockClientCommandsServer_InitialSetParameters_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcInitialSetParametersRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_InitialSetParameters_Call) Return(_a0 *pb.RpcInitialSetParametersResponse) *MockClientCommandsServer_InitialSetParameters_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_InitialSetParameters_Call) RunAndReturn(run func(context.Context, *pb.RpcInitialSetParametersRequest) *pb.RpcInitialSetParametersResponse) *MockClientCommandsServer_InitialSetParameters_Call { + _c.Call.Return(run) + return _c +} + +// LinkPreview provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) LinkPreview(_a0 context.Context, _a1 *pb.RpcLinkPreviewRequest) *pb.RpcLinkPreviewResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for LinkPreview") + } + + var r0 *pb.RpcLinkPreviewResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcLinkPreviewRequest) *pb.RpcLinkPreviewResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcLinkPreviewResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_LinkPreview_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'LinkPreview' +type MockClientCommandsServer_LinkPreview_Call struct { + *mock.Call +} + +// LinkPreview is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcLinkPreviewRequest +func (_e *MockClientCommandsServer_Expecter) LinkPreview(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_LinkPreview_Call { + return &MockClientCommandsServer_LinkPreview_Call{Call: _e.mock.On("LinkPreview", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_LinkPreview_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcLinkPreviewRequest)) *MockClientCommandsServer_LinkPreview_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcLinkPreviewRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_LinkPreview_Call) Return(_a0 *pb.RpcLinkPreviewResponse) *MockClientCommandsServer_LinkPreview_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_LinkPreview_Call) RunAndReturn(run func(context.Context, *pb.RpcLinkPreviewRequest) *pb.RpcLinkPreviewResponse) *MockClientCommandsServer_LinkPreview_Call { + _c.Call.Return(run) + return _c +} + +// ListenSessionEvents provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) ListenSessionEvents(_a0 *pb.StreamRequest, _a1 service.ClientCommands_ListenSessionEventsServer) { + _m.Called(_a0, _a1) +} + +// MockClientCommandsServer_ListenSessionEvents_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ListenSessionEvents' +type MockClientCommandsServer_ListenSessionEvents_Call struct { + *mock.Call +} + +// ListenSessionEvents is a helper method to define mock.On call +// - _a0 *pb.StreamRequest +// - _a1 service.ClientCommands_ListenSessionEventsServer +func (_e *MockClientCommandsServer_Expecter) ListenSessionEvents(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_ListenSessionEvents_Call { + return &MockClientCommandsServer_ListenSessionEvents_Call{Call: _e.mock.On("ListenSessionEvents", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_ListenSessionEvents_Call) Run(run func(_a0 *pb.StreamRequest, _a1 service.ClientCommands_ListenSessionEventsServer)) *MockClientCommandsServer_ListenSessionEvents_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(*pb.StreamRequest), args[1].(service.ClientCommands_ListenSessionEventsServer)) + }) + return _c +} + +func (_c *MockClientCommandsServer_ListenSessionEvents_Call) Return() *MockClientCommandsServer_ListenSessionEvents_Call { + _c.Call.Return() + return _c +} + +func (_c *MockClientCommandsServer_ListenSessionEvents_Call) RunAndReturn(run func(*pb.StreamRequest, service.ClientCommands_ListenSessionEventsServer)) *MockClientCommandsServer_ListenSessionEvents_Call { + _c.Call.Return(run) + return _c +} + +// LogSend provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) LogSend(_a0 context.Context, _a1 *pb.RpcLogSendRequest) *pb.RpcLogSendResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for LogSend") + } + + var r0 *pb.RpcLogSendResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcLogSendRequest) *pb.RpcLogSendResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcLogSendResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_LogSend_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'LogSend' +type MockClientCommandsServer_LogSend_Call struct { + *mock.Call +} + +// LogSend is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcLogSendRequest +func (_e *MockClientCommandsServer_Expecter) LogSend(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_LogSend_Call { + return &MockClientCommandsServer_LogSend_Call{Call: _e.mock.On("LogSend", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_LogSend_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcLogSendRequest)) *MockClientCommandsServer_LogSend_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcLogSendRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_LogSend_Call) Return(_a0 *pb.RpcLogSendResponse) *MockClientCommandsServer_LogSend_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_LogSend_Call) RunAndReturn(run func(context.Context, *pb.RpcLogSendRequest) *pb.RpcLogSendResponse) *MockClientCommandsServer_LogSend_Call { + _c.Call.Return(run) + return _c +} + +// MembershipFinalize provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) MembershipFinalize(_a0 context.Context, _a1 *pb.RpcMembershipFinalizeRequest) *pb.RpcMembershipFinalizeResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for MembershipFinalize") + } + + var r0 *pb.RpcMembershipFinalizeResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcMembershipFinalizeRequest) *pb.RpcMembershipFinalizeResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcMembershipFinalizeResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_MembershipFinalize_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'MembershipFinalize' +type MockClientCommandsServer_MembershipFinalize_Call struct { + *mock.Call +} + +// MembershipFinalize is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcMembershipFinalizeRequest +func (_e *MockClientCommandsServer_Expecter) MembershipFinalize(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_MembershipFinalize_Call { + return &MockClientCommandsServer_MembershipFinalize_Call{Call: _e.mock.On("MembershipFinalize", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_MembershipFinalize_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcMembershipFinalizeRequest)) *MockClientCommandsServer_MembershipFinalize_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcMembershipFinalizeRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_MembershipFinalize_Call) Return(_a0 *pb.RpcMembershipFinalizeResponse) *MockClientCommandsServer_MembershipFinalize_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_MembershipFinalize_Call) RunAndReturn(run func(context.Context, *pb.RpcMembershipFinalizeRequest) *pb.RpcMembershipFinalizeResponse) *MockClientCommandsServer_MembershipFinalize_Call { + _c.Call.Return(run) + return _c +} + +// MembershipGetPortalLinkUrl provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) MembershipGetPortalLinkUrl(_a0 context.Context, _a1 *pb.RpcMembershipGetPortalLinkUrlRequest) *pb.RpcMembershipGetPortalLinkUrlResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for MembershipGetPortalLinkUrl") + } + + var r0 *pb.RpcMembershipGetPortalLinkUrlResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcMembershipGetPortalLinkUrlRequest) *pb.RpcMembershipGetPortalLinkUrlResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcMembershipGetPortalLinkUrlResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_MembershipGetPortalLinkUrl_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'MembershipGetPortalLinkUrl' +type MockClientCommandsServer_MembershipGetPortalLinkUrl_Call struct { + *mock.Call +} + +// MembershipGetPortalLinkUrl is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcMembershipGetPortalLinkUrlRequest +func (_e *MockClientCommandsServer_Expecter) MembershipGetPortalLinkUrl(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_MembershipGetPortalLinkUrl_Call { + return &MockClientCommandsServer_MembershipGetPortalLinkUrl_Call{Call: _e.mock.On("MembershipGetPortalLinkUrl", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_MembershipGetPortalLinkUrl_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcMembershipGetPortalLinkUrlRequest)) *MockClientCommandsServer_MembershipGetPortalLinkUrl_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcMembershipGetPortalLinkUrlRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_MembershipGetPortalLinkUrl_Call) Return(_a0 *pb.RpcMembershipGetPortalLinkUrlResponse) *MockClientCommandsServer_MembershipGetPortalLinkUrl_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_MembershipGetPortalLinkUrl_Call) RunAndReturn(run func(context.Context, *pb.RpcMembershipGetPortalLinkUrlRequest) *pb.RpcMembershipGetPortalLinkUrlResponse) *MockClientCommandsServer_MembershipGetPortalLinkUrl_Call { + _c.Call.Return(run) + return _c +} + +// MembershipGetStatus provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) MembershipGetStatus(_a0 context.Context, _a1 *pb.RpcMembershipGetStatusRequest) *pb.RpcMembershipGetStatusResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for MembershipGetStatus") + } + + var r0 *pb.RpcMembershipGetStatusResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcMembershipGetStatusRequest) *pb.RpcMembershipGetStatusResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcMembershipGetStatusResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_MembershipGetStatus_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'MembershipGetStatus' +type MockClientCommandsServer_MembershipGetStatus_Call struct { + *mock.Call +} + +// MembershipGetStatus is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcMembershipGetStatusRequest +func (_e *MockClientCommandsServer_Expecter) MembershipGetStatus(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_MembershipGetStatus_Call { + return &MockClientCommandsServer_MembershipGetStatus_Call{Call: _e.mock.On("MembershipGetStatus", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_MembershipGetStatus_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcMembershipGetStatusRequest)) *MockClientCommandsServer_MembershipGetStatus_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcMembershipGetStatusRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_MembershipGetStatus_Call) Return(_a0 *pb.RpcMembershipGetStatusResponse) *MockClientCommandsServer_MembershipGetStatus_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_MembershipGetStatus_Call) RunAndReturn(run func(context.Context, *pb.RpcMembershipGetStatusRequest) *pb.RpcMembershipGetStatusResponse) *MockClientCommandsServer_MembershipGetStatus_Call { + _c.Call.Return(run) + return _c +} + +// MembershipGetTiers provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) MembershipGetTiers(_a0 context.Context, _a1 *pb.RpcMembershipGetTiersRequest) *pb.RpcMembershipGetTiersResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for MembershipGetTiers") + } + + var r0 *pb.RpcMembershipGetTiersResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcMembershipGetTiersRequest) *pb.RpcMembershipGetTiersResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcMembershipGetTiersResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_MembershipGetTiers_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'MembershipGetTiers' +type MockClientCommandsServer_MembershipGetTiers_Call struct { + *mock.Call +} + +// MembershipGetTiers is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcMembershipGetTiersRequest +func (_e *MockClientCommandsServer_Expecter) MembershipGetTiers(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_MembershipGetTiers_Call { + return &MockClientCommandsServer_MembershipGetTiers_Call{Call: _e.mock.On("MembershipGetTiers", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_MembershipGetTiers_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcMembershipGetTiersRequest)) *MockClientCommandsServer_MembershipGetTiers_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcMembershipGetTiersRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_MembershipGetTiers_Call) Return(_a0 *pb.RpcMembershipGetTiersResponse) *MockClientCommandsServer_MembershipGetTiers_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_MembershipGetTiers_Call) RunAndReturn(run func(context.Context, *pb.RpcMembershipGetTiersRequest) *pb.RpcMembershipGetTiersResponse) *MockClientCommandsServer_MembershipGetTiers_Call { + _c.Call.Return(run) + return _c +} + +// MembershipGetVerificationEmail provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) MembershipGetVerificationEmail(_a0 context.Context, _a1 *pb.RpcMembershipGetVerificationEmailRequest) *pb.RpcMembershipGetVerificationEmailResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for MembershipGetVerificationEmail") + } + + var r0 *pb.RpcMembershipGetVerificationEmailResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcMembershipGetVerificationEmailRequest) *pb.RpcMembershipGetVerificationEmailResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcMembershipGetVerificationEmailResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_MembershipGetVerificationEmail_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'MembershipGetVerificationEmail' +type MockClientCommandsServer_MembershipGetVerificationEmail_Call struct { + *mock.Call +} + +// MembershipGetVerificationEmail is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcMembershipGetVerificationEmailRequest +func (_e *MockClientCommandsServer_Expecter) MembershipGetVerificationEmail(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_MembershipGetVerificationEmail_Call { + return &MockClientCommandsServer_MembershipGetVerificationEmail_Call{Call: _e.mock.On("MembershipGetVerificationEmail", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_MembershipGetVerificationEmail_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcMembershipGetVerificationEmailRequest)) *MockClientCommandsServer_MembershipGetVerificationEmail_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcMembershipGetVerificationEmailRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_MembershipGetVerificationEmail_Call) Return(_a0 *pb.RpcMembershipGetVerificationEmailResponse) *MockClientCommandsServer_MembershipGetVerificationEmail_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_MembershipGetVerificationEmail_Call) RunAndReturn(run func(context.Context, *pb.RpcMembershipGetVerificationEmailRequest) *pb.RpcMembershipGetVerificationEmailResponse) *MockClientCommandsServer_MembershipGetVerificationEmail_Call { + _c.Call.Return(run) + return _c +} + +// MembershipGetVerificationEmailStatus provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) MembershipGetVerificationEmailStatus(_a0 context.Context, _a1 *pb.RpcMembershipGetVerificationEmailStatusRequest) *pb.RpcMembershipGetVerificationEmailStatusResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for MembershipGetVerificationEmailStatus") + } + + var r0 *pb.RpcMembershipGetVerificationEmailStatusResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcMembershipGetVerificationEmailStatusRequest) *pb.RpcMembershipGetVerificationEmailStatusResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcMembershipGetVerificationEmailStatusResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_MembershipGetVerificationEmailStatus_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'MembershipGetVerificationEmailStatus' +type MockClientCommandsServer_MembershipGetVerificationEmailStatus_Call struct { + *mock.Call +} + +// MembershipGetVerificationEmailStatus is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcMembershipGetVerificationEmailStatusRequest +func (_e *MockClientCommandsServer_Expecter) MembershipGetVerificationEmailStatus(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_MembershipGetVerificationEmailStatus_Call { + return &MockClientCommandsServer_MembershipGetVerificationEmailStatus_Call{Call: _e.mock.On("MembershipGetVerificationEmailStatus", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_MembershipGetVerificationEmailStatus_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcMembershipGetVerificationEmailStatusRequest)) *MockClientCommandsServer_MembershipGetVerificationEmailStatus_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcMembershipGetVerificationEmailStatusRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_MembershipGetVerificationEmailStatus_Call) Return(_a0 *pb.RpcMembershipGetVerificationEmailStatusResponse) *MockClientCommandsServer_MembershipGetVerificationEmailStatus_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_MembershipGetVerificationEmailStatus_Call) RunAndReturn(run func(context.Context, *pb.RpcMembershipGetVerificationEmailStatusRequest) *pb.RpcMembershipGetVerificationEmailStatusResponse) *MockClientCommandsServer_MembershipGetVerificationEmailStatus_Call { + _c.Call.Return(run) + return _c +} + +// MembershipIsNameValid provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) MembershipIsNameValid(_a0 context.Context, _a1 *pb.RpcMembershipIsNameValidRequest) *pb.RpcMembershipIsNameValidResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for MembershipIsNameValid") + } + + var r0 *pb.RpcMembershipIsNameValidResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcMembershipIsNameValidRequest) *pb.RpcMembershipIsNameValidResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcMembershipIsNameValidResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_MembershipIsNameValid_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'MembershipIsNameValid' +type MockClientCommandsServer_MembershipIsNameValid_Call struct { + *mock.Call +} + +// MembershipIsNameValid is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcMembershipIsNameValidRequest +func (_e *MockClientCommandsServer_Expecter) MembershipIsNameValid(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_MembershipIsNameValid_Call { + return &MockClientCommandsServer_MembershipIsNameValid_Call{Call: _e.mock.On("MembershipIsNameValid", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_MembershipIsNameValid_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcMembershipIsNameValidRequest)) *MockClientCommandsServer_MembershipIsNameValid_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcMembershipIsNameValidRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_MembershipIsNameValid_Call) Return(_a0 *pb.RpcMembershipIsNameValidResponse) *MockClientCommandsServer_MembershipIsNameValid_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_MembershipIsNameValid_Call) RunAndReturn(run func(context.Context, *pb.RpcMembershipIsNameValidRequest) *pb.RpcMembershipIsNameValidResponse) *MockClientCommandsServer_MembershipIsNameValid_Call { + _c.Call.Return(run) + return _c +} + +// MembershipRegisterPaymentRequest provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) MembershipRegisterPaymentRequest(_a0 context.Context, _a1 *pb.RpcMembershipRegisterPaymentRequestRequest) *pb.RpcMembershipRegisterPaymentRequestResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for MembershipRegisterPaymentRequest") + } + + var r0 *pb.RpcMembershipRegisterPaymentRequestResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcMembershipRegisterPaymentRequestRequest) *pb.RpcMembershipRegisterPaymentRequestResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcMembershipRegisterPaymentRequestResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_MembershipRegisterPaymentRequest_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'MembershipRegisterPaymentRequest' +type MockClientCommandsServer_MembershipRegisterPaymentRequest_Call struct { + *mock.Call +} + +// MembershipRegisterPaymentRequest is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcMembershipRegisterPaymentRequestRequest +func (_e *MockClientCommandsServer_Expecter) MembershipRegisterPaymentRequest(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_MembershipRegisterPaymentRequest_Call { + return &MockClientCommandsServer_MembershipRegisterPaymentRequest_Call{Call: _e.mock.On("MembershipRegisterPaymentRequest", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_MembershipRegisterPaymentRequest_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcMembershipRegisterPaymentRequestRequest)) *MockClientCommandsServer_MembershipRegisterPaymentRequest_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcMembershipRegisterPaymentRequestRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_MembershipRegisterPaymentRequest_Call) Return(_a0 *pb.RpcMembershipRegisterPaymentRequestResponse) *MockClientCommandsServer_MembershipRegisterPaymentRequest_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_MembershipRegisterPaymentRequest_Call) RunAndReturn(run func(context.Context, *pb.RpcMembershipRegisterPaymentRequestRequest) *pb.RpcMembershipRegisterPaymentRequestResponse) *MockClientCommandsServer_MembershipRegisterPaymentRequest_Call { + _c.Call.Return(run) + return _c +} + +// MembershipVerifyAppStoreReceipt provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) MembershipVerifyAppStoreReceipt(_a0 context.Context, _a1 *pb.RpcMembershipVerifyAppStoreReceiptRequest) *pb.RpcMembershipVerifyAppStoreReceiptResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for MembershipVerifyAppStoreReceipt") + } + + var r0 *pb.RpcMembershipVerifyAppStoreReceiptResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcMembershipVerifyAppStoreReceiptRequest) *pb.RpcMembershipVerifyAppStoreReceiptResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcMembershipVerifyAppStoreReceiptResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_MembershipVerifyAppStoreReceipt_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'MembershipVerifyAppStoreReceipt' +type MockClientCommandsServer_MembershipVerifyAppStoreReceipt_Call struct { + *mock.Call +} + +// MembershipVerifyAppStoreReceipt is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcMembershipVerifyAppStoreReceiptRequest +func (_e *MockClientCommandsServer_Expecter) MembershipVerifyAppStoreReceipt(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_MembershipVerifyAppStoreReceipt_Call { + return &MockClientCommandsServer_MembershipVerifyAppStoreReceipt_Call{Call: _e.mock.On("MembershipVerifyAppStoreReceipt", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_MembershipVerifyAppStoreReceipt_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcMembershipVerifyAppStoreReceiptRequest)) *MockClientCommandsServer_MembershipVerifyAppStoreReceipt_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcMembershipVerifyAppStoreReceiptRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_MembershipVerifyAppStoreReceipt_Call) Return(_a0 *pb.RpcMembershipVerifyAppStoreReceiptResponse) *MockClientCommandsServer_MembershipVerifyAppStoreReceipt_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_MembershipVerifyAppStoreReceipt_Call) RunAndReturn(run func(context.Context, *pb.RpcMembershipVerifyAppStoreReceiptRequest) *pb.RpcMembershipVerifyAppStoreReceiptResponse) *MockClientCommandsServer_MembershipVerifyAppStoreReceipt_Call { + _c.Call.Return(run) + return _c +} + +// MembershipVerifyEmailCode provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) MembershipVerifyEmailCode(_a0 context.Context, _a1 *pb.RpcMembershipVerifyEmailCodeRequest) *pb.RpcMembershipVerifyEmailCodeResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for MembershipVerifyEmailCode") + } + + var r0 *pb.RpcMembershipVerifyEmailCodeResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcMembershipVerifyEmailCodeRequest) *pb.RpcMembershipVerifyEmailCodeResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcMembershipVerifyEmailCodeResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_MembershipVerifyEmailCode_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'MembershipVerifyEmailCode' +type MockClientCommandsServer_MembershipVerifyEmailCode_Call struct { + *mock.Call +} + +// MembershipVerifyEmailCode is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcMembershipVerifyEmailCodeRequest +func (_e *MockClientCommandsServer_Expecter) MembershipVerifyEmailCode(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_MembershipVerifyEmailCode_Call { + return &MockClientCommandsServer_MembershipVerifyEmailCode_Call{Call: _e.mock.On("MembershipVerifyEmailCode", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_MembershipVerifyEmailCode_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcMembershipVerifyEmailCodeRequest)) *MockClientCommandsServer_MembershipVerifyEmailCode_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcMembershipVerifyEmailCodeRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_MembershipVerifyEmailCode_Call) Return(_a0 *pb.RpcMembershipVerifyEmailCodeResponse) *MockClientCommandsServer_MembershipVerifyEmailCode_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_MembershipVerifyEmailCode_Call) RunAndReturn(run func(context.Context, *pb.RpcMembershipVerifyEmailCodeRequest) *pb.RpcMembershipVerifyEmailCodeResponse) *MockClientCommandsServer_MembershipVerifyEmailCode_Call { + _c.Call.Return(run) + return _c +} + +// NameServiceResolveAnyId provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) NameServiceResolveAnyId(_a0 context.Context, _a1 *pb.RpcNameServiceResolveAnyIdRequest) *pb.RpcNameServiceResolveAnyIdResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for NameServiceResolveAnyId") + } + + var r0 *pb.RpcNameServiceResolveAnyIdResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcNameServiceResolveAnyIdRequest) *pb.RpcNameServiceResolveAnyIdResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcNameServiceResolveAnyIdResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_NameServiceResolveAnyId_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'NameServiceResolveAnyId' +type MockClientCommandsServer_NameServiceResolveAnyId_Call struct { + *mock.Call +} + +// NameServiceResolveAnyId is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcNameServiceResolveAnyIdRequest +func (_e *MockClientCommandsServer_Expecter) NameServiceResolveAnyId(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_NameServiceResolveAnyId_Call { + return &MockClientCommandsServer_NameServiceResolveAnyId_Call{Call: _e.mock.On("NameServiceResolveAnyId", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_NameServiceResolveAnyId_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcNameServiceResolveAnyIdRequest)) *MockClientCommandsServer_NameServiceResolveAnyId_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcNameServiceResolveAnyIdRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_NameServiceResolveAnyId_Call) Return(_a0 *pb.RpcNameServiceResolveAnyIdResponse) *MockClientCommandsServer_NameServiceResolveAnyId_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_NameServiceResolveAnyId_Call) RunAndReturn(run func(context.Context, *pb.RpcNameServiceResolveAnyIdRequest) *pb.RpcNameServiceResolveAnyIdResponse) *MockClientCommandsServer_NameServiceResolveAnyId_Call { + _c.Call.Return(run) + return _c +} + +// NameServiceResolveName provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) NameServiceResolveName(_a0 context.Context, _a1 *pb.RpcNameServiceResolveNameRequest) *pb.RpcNameServiceResolveNameResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for NameServiceResolveName") + } + + var r0 *pb.RpcNameServiceResolveNameResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcNameServiceResolveNameRequest) *pb.RpcNameServiceResolveNameResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcNameServiceResolveNameResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_NameServiceResolveName_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'NameServiceResolveName' +type MockClientCommandsServer_NameServiceResolveName_Call struct { + *mock.Call +} + +// NameServiceResolveName is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcNameServiceResolveNameRequest +func (_e *MockClientCommandsServer_Expecter) NameServiceResolveName(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_NameServiceResolveName_Call { + return &MockClientCommandsServer_NameServiceResolveName_Call{Call: _e.mock.On("NameServiceResolveName", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_NameServiceResolveName_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcNameServiceResolveNameRequest)) *MockClientCommandsServer_NameServiceResolveName_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcNameServiceResolveNameRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_NameServiceResolveName_Call) Return(_a0 *pb.RpcNameServiceResolveNameResponse) *MockClientCommandsServer_NameServiceResolveName_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_NameServiceResolveName_Call) RunAndReturn(run func(context.Context, *pb.RpcNameServiceResolveNameRequest) *pb.RpcNameServiceResolveNameResponse) *MockClientCommandsServer_NameServiceResolveName_Call { + _c.Call.Return(run) + return _c +} + +// NameServiceUserAccountGet provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) NameServiceUserAccountGet(_a0 context.Context, _a1 *pb.RpcNameServiceUserAccountGetRequest) *pb.RpcNameServiceUserAccountGetResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for NameServiceUserAccountGet") + } + + var r0 *pb.RpcNameServiceUserAccountGetResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcNameServiceUserAccountGetRequest) *pb.RpcNameServiceUserAccountGetResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcNameServiceUserAccountGetResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_NameServiceUserAccountGet_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'NameServiceUserAccountGet' +type MockClientCommandsServer_NameServiceUserAccountGet_Call struct { + *mock.Call +} + +// NameServiceUserAccountGet is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcNameServiceUserAccountGetRequest +func (_e *MockClientCommandsServer_Expecter) NameServiceUserAccountGet(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_NameServiceUserAccountGet_Call { + return &MockClientCommandsServer_NameServiceUserAccountGet_Call{Call: _e.mock.On("NameServiceUserAccountGet", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_NameServiceUserAccountGet_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcNameServiceUserAccountGetRequest)) *MockClientCommandsServer_NameServiceUserAccountGet_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcNameServiceUserAccountGetRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_NameServiceUserAccountGet_Call) Return(_a0 *pb.RpcNameServiceUserAccountGetResponse) *MockClientCommandsServer_NameServiceUserAccountGet_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_NameServiceUserAccountGet_Call) RunAndReturn(run func(context.Context, *pb.RpcNameServiceUserAccountGetRequest) *pb.RpcNameServiceUserAccountGetResponse) *MockClientCommandsServer_NameServiceUserAccountGet_Call { + _c.Call.Return(run) + return _c +} + +// NavigationGetObjectInfoWithLinks provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) NavigationGetObjectInfoWithLinks(_a0 context.Context, _a1 *pb.RpcNavigationGetObjectInfoWithLinksRequest) *pb.RpcNavigationGetObjectInfoWithLinksResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for NavigationGetObjectInfoWithLinks") + } + + var r0 *pb.RpcNavigationGetObjectInfoWithLinksResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcNavigationGetObjectInfoWithLinksRequest) *pb.RpcNavigationGetObjectInfoWithLinksResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcNavigationGetObjectInfoWithLinksResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_NavigationGetObjectInfoWithLinks_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'NavigationGetObjectInfoWithLinks' +type MockClientCommandsServer_NavigationGetObjectInfoWithLinks_Call struct { + *mock.Call +} + +// NavigationGetObjectInfoWithLinks is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcNavigationGetObjectInfoWithLinksRequest +func (_e *MockClientCommandsServer_Expecter) NavigationGetObjectInfoWithLinks(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_NavigationGetObjectInfoWithLinks_Call { + return &MockClientCommandsServer_NavigationGetObjectInfoWithLinks_Call{Call: _e.mock.On("NavigationGetObjectInfoWithLinks", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_NavigationGetObjectInfoWithLinks_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcNavigationGetObjectInfoWithLinksRequest)) *MockClientCommandsServer_NavigationGetObjectInfoWithLinks_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcNavigationGetObjectInfoWithLinksRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_NavigationGetObjectInfoWithLinks_Call) Return(_a0 *pb.RpcNavigationGetObjectInfoWithLinksResponse) *MockClientCommandsServer_NavigationGetObjectInfoWithLinks_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_NavigationGetObjectInfoWithLinks_Call) RunAndReturn(run func(context.Context, *pb.RpcNavigationGetObjectInfoWithLinksRequest) *pb.RpcNavigationGetObjectInfoWithLinksResponse) *MockClientCommandsServer_NavigationGetObjectInfoWithLinks_Call { + _c.Call.Return(run) + return _c +} + +// NavigationListObjects provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) NavigationListObjects(_a0 context.Context, _a1 *pb.RpcNavigationListObjectsRequest) *pb.RpcNavigationListObjectsResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for NavigationListObjects") + } + + var r0 *pb.RpcNavigationListObjectsResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcNavigationListObjectsRequest) *pb.RpcNavigationListObjectsResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcNavigationListObjectsResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_NavigationListObjects_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'NavigationListObjects' +type MockClientCommandsServer_NavigationListObjects_Call struct { + *mock.Call +} + +// NavigationListObjects is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcNavigationListObjectsRequest +func (_e *MockClientCommandsServer_Expecter) NavigationListObjects(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_NavigationListObjects_Call { + return &MockClientCommandsServer_NavigationListObjects_Call{Call: _e.mock.On("NavigationListObjects", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_NavigationListObjects_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcNavigationListObjectsRequest)) *MockClientCommandsServer_NavigationListObjects_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcNavigationListObjectsRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_NavigationListObjects_Call) Return(_a0 *pb.RpcNavigationListObjectsResponse) *MockClientCommandsServer_NavigationListObjects_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_NavigationListObjects_Call) RunAndReturn(run func(context.Context, *pb.RpcNavigationListObjectsRequest) *pb.RpcNavigationListObjectsResponse) *MockClientCommandsServer_NavigationListObjects_Call { + _c.Call.Return(run) + return _c +} + +// NotificationList provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) NotificationList(_a0 context.Context, _a1 *pb.RpcNotificationListRequest) *pb.RpcNotificationListResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for NotificationList") + } + + var r0 *pb.RpcNotificationListResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcNotificationListRequest) *pb.RpcNotificationListResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcNotificationListResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_NotificationList_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'NotificationList' +type MockClientCommandsServer_NotificationList_Call struct { + *mock.Call +} + +// NotificationList is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcNotificationListRequest +func (_e *MockClientCommandsServer_Expecter) NotificationList(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_NotificationList_Call { + return &MockClientCommandsServer_NotificationList_Call{Call: _e.mock.On("NotificationList", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_NotificationList_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcNotificationListRequest)) *MockClientCommandsServer_NotificationList_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcNotificationListRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_NotificationList_Call) Return(_a0 *pb.RpcNotificationListResponse) *MockClientCommandsServer_NotificationList_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_NotificationList_Call) RunAndReturn(run func(context.Context, *pb.RpcNotificationListRequest) *pb.RpcNotificationListResponse) *MockClientCommandsServer_NotificationList_Call { + _c.Call.Return(run) + return _c +} + +// NotificationReply provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) NotificationReply(_a0 context.Context, _a1 *pb.RpcNotificationReplyRequest) *pb.RpcNotificationReplyResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for NotificationReply") + } + + var r0 *pb.RpcNotificationReplyResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcNotificationReplyRequest) *pb.RpcNotificationReplyResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcNotificationReplyResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_NotificationReply_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'NotificationReply' +type MockClientCommandsServer_NotificationReply_Call struct { + *mock.Call +} + +// NotificationReply is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcNotificationReplyRequest +func (_e *MockClientCommandsServer_Expecter) NotificationReply(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_NotificationReply_Call { + return &MockClientCommandsServer_NotificationReply_Call{Call: _e.mock.On("NotificationReply", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_NotificationReply_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcNotificationReplyRequest)) *MockClientCommandsServer_NotificationReply_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcNotificationReplyRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_NotificationReply_Call) Return(_a0 *pb.RpcNotificationReplyResponse) *MockClientCommandsServer_NotificationReply_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_NotificationReply_Call) RunAndReturn(run func(context.Context, *pb.RpcNotificationReplyRequest) *pb.RpcNotificationReplyResponse) *MockClientCommandsServer_NotificationReply_Call { + _c.Call.Return(run) + return _c +} + +// NotificationTest provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) NotificationTest(_a0 context.Context, _a1 *pb.RpcNotificationTestRequest) *pb.RpcNotificationTestResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for NotificationTest") + } + + var r0 *pb.RpcNotificationTestResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcNotificationTestRequest) *pb.RpcNotificationTestResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcNotificationTestResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_NotificationTest_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'NotificationTest' +type MockClientCommandsServer_NotificationTest_Call struct { + *mock.Call +} + +// NotificationTest is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcNotificationTestRequest +func (_e *MockClientCommandsServer_Expecter) NotificationTest(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_NotificationTest_Call { + return &MockClientCommandsServer_NotificationTest_Call{Call: _e.mock.On("NotificationTest", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_NotificationTest_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcNotificationTestRequest)) *MockClientCommandsServer_NotificationTest_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcNotificationTestRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_NotificationTest_Call) Return(_a0 *pb.RpcNotificationTestResponse) *MockClientCommandsServer_NotificationTest_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_NotificationTest_Call) RunAndReturn(run func(context.Context, *pb.RpcNotificationTestRequest) *pb.RpcNotificationTestResponse) *MockClientCommandsServer_NotificationTest_Call { + _c.Call.Return(run) + return _c +} + +// ObjectApplyTemplate provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) ObjectApplyTemplate(_a0 context.Context, _a1 *pb.RpcObjectApplyTemplateRequest) *pb.RpcObjectApplyTemplateResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for ObjectApplyTemplate") + } + + var r0 *pb.RpcObjectApplyTemplateResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcObjectApplyTemplateRequest) *pb.RpcObjectApplyTemplateResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcObjectApplyTemplateResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_ObjectApplyTemplate_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ObjectApplyTemplate' +type MockClientCommandsServer_ObjectApplyTemplate_Call struct { + *mock.Call +} + +// ObjectApplyTemplate is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcObjectApplyTemplateRequest +func (_e *MockClientCommandsServer_Expecter) ObjectApplyTemplate(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_ObjectApplyTemplate_Call { + return &MockClientCommandsServer_ObjectApplyTemplate_Call{Call: _e.mock.On("ObjectApplyTemplate", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_ObjectApplyTemplate_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcObjectApplyTemplateRequest)) *MockClientCommandsServer_ObjectApplyTemplate_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcObjectApplyTemplateRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_ObjectApplyTemplate_Call) Return(_a0 *pb.RpcObjectApplyTemplateResponse) *MockClientCommandsServer_ObjectApplyTemplate_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_ObjectApplyTemplate_Call) RunAndReturn(run func(context.Context, *pb.RpcObjectApplyTemplateRequest) *pb.RpcObjectApplyTemplateResponse) *MockClientCommandsServer_ObjectApplyTemplate_Call { + _c.Call.Return(run) + return _c +} + +// ObjectBookmarkFetch provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) ObjectBookmarkFetch(_a0 context.Context, _a1 *pb.RpcObjectBookmarkFetchRequest) *pb.RpcObjectBookmarkFetchResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for ObjectBookmarkFetch") + } + + var r0 *pb.RpcObjectBookmarkFetchResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcObjectBookmarkFetchRequest) *pb.RpcObjectBookmarkFetchResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcObjectBookmarkFetchResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_ObjectBookmarkFetch_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ObjectBookmarkFetch' +type MockClientCommandsServer_ObjectBookmarkFetch_Call struct { + *mock.Call +} + +// ObjectBookmarkFetch is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcObjectBookmarkFetchRequest +func (_e *MockClientCommandsServer_Expecter) ObjectBookmarkFetch(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_ObjectBookmarkFetch_Call { + return &MockClientCommandsServer_ObjectBookmarkFetch_Call{Call: _e.mock.On("ObjectBookmarkFetch", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_ObjectBookmarkFetch_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcObjectBookmarkFetchRequest)) *MockClientCommandsServer_ObjectBookmarkFetch_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcObjectBookmarkFetchRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_ObjectBookmarkFetch_Call) Return(_a0 *pb.RpcObjectBookmarkFetchResponse) *MockClientCommandsServer_ObjectBookmarkFetch_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_ObjectBookmarkFetch_Call) RunAndReturn(run func(context.Context, *pb.RpcObjectBookmarkFetchRequest) *pb.RpcObjectBookmarkFetchResponse) *MockClientCommandsServer_ObjectBookmarkFetch_Call { + _c.Call.Return(run) + return _c +} + +// ObjectChatAdd provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) ObjectChatAdd(_a0 context.Context, _a1 *pb.RpcObjectChatAddRequest) *pb.RpcObjectChatAddResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for ObjectChatAdd") + } + + var r0 *pb.RpcObjectChatAddResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcObjectChatAddRequest) *pb.RpcObjectChatAddResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcObjectChatAddResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_ObjectChatAdd_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ObjectChatAdd' +type MockClientCommandsServer_ObjectChatAdd_Call struct { + *mock.Call +} + +// ObjectChatAdd is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcObjectChatAddRequest +func (_e *MockClientCommandsServer_Expecter) ObjectChatAdd(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_ObjectChatAdd_Call { + return &MockClientCommandsServer_ObjectChatAdd_Call{Call: _e.mock.On("ObjectChatAdd", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_ObjectChatAdd_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcObjectChatAddRequest)) *MockClientCommandsServer_ObjectChatAdd_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcObjectChatAddRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_ObjectChatAdd_Call) Return(_a0 *pb.RpcObjectChatAddResponse) *MockClientCommandsServer_ObjectChatAdd_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_ObjectChatAdd_Call) RunAndReturn(run func(context.Context, *pb.RpcObjectChatAddRequest) *pb.RpcObjectChatAddResponse) *MockClientCommandsServer_ObjectChatAdd_Call { + _c.Call.Return(run) + return _c +} + +// ObjectClose provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) ObjectClose(_a0 context.Context, _a1 *pb.RpcObjectCloseRequest) *pb.RpcObjectCloseResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for ObjectClose") + } + + var r0 *pb.RpcObjectCloseResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcObjectCloseRequest) *pb.RpcObjectCloseResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcObjectCloseResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_ObjectClose_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ObjectClose' +type MockClientCommandsServer_ObjectClose_Call struct { + *mock.Call +} + +// ObjectClose is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcObjectCloseRequest +func (_e *MockClientCommandsServer_Expecter) ObjectClose(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_ObjectClose_Call { + return &MockClientCommandsServer_ObjectClose_Call{Call: _e.mock.On("ObjectClose", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_ObjectClose_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcObjectCloseRequest)) *MockClientCommandsServer_ObjectClose_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcObjectCloseRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_ObjectClose_Call) Return(_a0 *pb.RpcObjectCloseResponse) *MockClientCommandsServer_ObjectClose_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_ObjectClose_Call) RunAndReturn(run func(context.Context, *pb.RpcObjectCloseRequest) *pb.RpcObjectCloseResponse) *MockClientCommandsServer_ObjectClose_Call { + _c.Call.Return(run) + return _c +} + +// ObjectCollectionAdd provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) ObjectCollectionAdd(_a0 context.Context, _a1 *pb.RpcObjectCollectionAddRequest) *pb.RpcObjectCollectionAddResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for ObjectCollectionAdd") + } + + var r0 *pb.RpcObjectCollectionAddResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcObjectCollectionAddRequest) *pb.RpcObjectCollectionAddResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcObjectCollectionAddResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_ObjectCollectionAdd_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ObjectCollectionAdd' +type MockClientCommandsServer_ObjectCollectionAdd_Call struct { + *mock.Call +} + +// ObjectCollectionAdd is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcObjectCollectionAddRequest +func (_e *MockClientCommandsServer_Expecter) ObjectCollectionAdd(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_ObjectCollectionAdd_Call { + return &MockClientCommandsServer_ObjectCollectionAdd_Call{Call: _e.mock.On("ObjectCollectionAdd", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_ObjectCollectionAdd_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcObjectCollectionAddRequest)) *MockClientCommandsServer_ObjectCollectionAdd_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcObjectCollectionAddRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_ObjectCollectionAdd_Call) Return(_a0 *pb.RpcObjectCollectionAddResponse) *MockClientCommandsServer_ObjectCollectionAdd_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_ObjectCollectionAdd_Call) RunAndReturn(run func(context.Context, *pb.RpcObjectCollectionAddRequest) *pb.RpcObjectCollectionAddResponse) *MockClientCommandsServer_ObjectCollectionAdd_Call { + _c.Call.Return(run) + return _c +} + +// ObjectCollectionRemove provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) ObjectCollectionRemove(_a0 context.Context, _a1 *pb.RpcObjectCollectionRemoveRequest) *pb.RpcObjectCollectionRemoveResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for ObjectCollectionRemove") + } + + var r0 *pb.RpcObjectCollectionRemoveResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcObjectCollectionRemoveRequest) *pb.RpcObjectCollectionRemoveResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcObjectCollectionRemoveResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_ObjectCollectionRemove_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ObjectCollectionRemove' +type MockClientCommandsServer_ObjectCollectionRemove_Call struct { + *mock.Call +} + +// ObjectCollectionRemove is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcObjectCollectionRemoveRequest +func (_e *MockClientCommandsServer_Expecter) ObjectCollectionRemove(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_ObjectCollectionRemove_Call { + return &MockClientCommandsServer_ObjectCollectionRemove_Call{Call: _e.mock.On("ObjectCollectionRemove", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_ObjectCollectionRemove_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcObjectCollectionRemoveRequest)) *MockClientCommandsServer_ObjectCollectionRemove_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcObjectCollectionRemoveRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_ObjectCollectionRemove_Call) Return(_a0 *pb.RpcObjectCollectionRemoveResponse) *MockClientCommandsServer_ObjectCollectionRemove_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_ObjectCollectionRemove_Call) RunAndReturn(run func(context.Context, *pb.RpcObjectCollectionRemoveRequest) *pb.RpcObjectCollectionRemoveResponse) *MockClientCommandsServer_ObjectCollectionRemove_Call { + _c.Call.Return(run) + return _c +} + +// ObjectCollectionSort provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) ObjectCollectionSort(_a0 context.Context, _a1 *pb.RpcObjectCollectionSortRequest) *pb.RpcObjectCollectionSortResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for ObjectCollectionSort") + } + + var r0 *pb.RpcObjectCollectionSortResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcObjectCollectionSortRequest) *pb.RpcObjectCollectionSortResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcObjectCollectionSortResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_ObjectCollectionSort_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ObjectCollectionSort' +type MockClientCommandsServer_ObjectCollectionSort_Call struct { + *mock.Call +} + +// ObjectCollectionSort is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcObjectCollectionSortRequest +func (_e *MockClientCommandsServer_Expecter) ObjectCollectionSort(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_ObjectCollectionSort_Call { + return &MockClientCommandsServer_ObjectCollectionSort_Call{Call: _e.mock.On("ObjectCollectionSort", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_ObjectCollectionSort_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcObjectCollectionSortRequest)) *MockClientCommandsServer_ObjectCollectionSort_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcObjectCollectionSortRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_ObjectCollectionSort_Call) Return(_a0 *pb.RpcObjectCollectionSortResponse) *MockClientCommandsServer_ObjectCollectionSort_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_ObjectCollectionSort_Call) RunAndReturn(run func(context.Context, *pb.RpcObjectCollectionSortRequest) *pb.RpcObjectCollectionSortResponse) *MockClientCommandsServer_ObjectCollectionSort_Call { + _c.Call.Return(run) + return _c +} + +// ObjectCreate provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) ObjectCreate(_a0 context.Context, _a1 *pb.RpcObjectCreateRequest) *pb.RpcObjectCreateResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for ObjectCreate") + } + + var r0 *pb.RpcObjectCreateResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcObjectCreateRequest) *pb.RpcObjectCreateResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcObjectCreateResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_ObjectCreate_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ObjectCreate' +type MockClientCommandsServer_ObjectCreate_Call struct { + *mock.Call +} + +// ObjectCreate is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcObjectCreateRequest +func (_e *MockClientCommandsServer_Expecter) ObjectCreate(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_ObjectCreate_Call { + return &MockClientCommandsServer_ObjectCreate_Call{Call: _e.mock.On("ObjectCreate", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_ObjectCreate_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcObjectCreateRequest)) *MockClientCommandsServer_ObjectCreate_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcObjectCreateRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_ObjectCreate_Call) Return(_a0 *pb.RpcObjectCreateResponse) *MockClientCommandsServer_ObjectCreate_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_ObjectCreate_Call) RunAndReturn(run func(context.Context, *pb.RpcObjectCreateRequest) *pb.RpcObjectCreateResponse) *MockClientCommandsServer_ObjectCreate_Call { + _c.Call.Return(run) + return _c +} + +// ObjectCreateBookmark provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) ObjectCreateBookmark(_a0 context.Context, _a1 *pb.RpcObjectCreateBookmarkRequest) *pb.RpcObjectCreateBookmarkResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for ObjectCreateBookmark") + } + + var r0 *pb.RpcObjectCreateBookmarkResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcObjectCreateBookmarkRequest) *pb.RpcObjectCreateBookmarkResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcObjectCreateBookmarkResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_ObjectCreateBookmark_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ObjectCreateBookmark' +type MockClientCommandsServer_ObjectCreateBookmark_Call struct { + *mock.Call +} + +// ObjectCreateBookmark is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcObjectCreateBookmarkRequest +func (_e *MockClientCommandsServer_Expecter) ObjectCreateBookmark(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_ObjectCreateBookmark_Call { + return &MockClientCommandsServer_ObjectCreateBookmark_Call{Call: _e.mock.On("ObjectCreateBookmark", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_ObjectCreateBookmark_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcObjectCreateBookmarkRequest)) *MockClientCommandsServer_ObjectCreateBookmark_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcObjectCreateBookmarkRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_ObjectCreateBookmark_Call) Return(_a0 *pb.RpcObjectCreateBookmarkResponse) *MockClientCommandsServer_ObjectCreateBookmark_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_ObjectCreateBookmark_Call) RunAndReturn(run func(context.Context, *pb.RpcObjectCreateBookmarkRequest) *pb.RpcObjectCreateBookmarkResponse) *MockClientCommandsServer_ObjectCreateBookmark_Call { + _c.Call.Return(run) + return _c +} + +// ObjectCreateFromUrl provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) ObjectCreateFromUrl(_a0 context.Context, _a1 *pb.RpcObjectCreateFromUrlRequest) *pb.RpcObjectCreateFromUrlResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for ObjectCreateFromUrl") + } + + var r0 *pb.RpcObjectCreateFromUrlResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcObjectCreateFromUrlRequest) *pb.RpcObjectCreateFromUrlResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcObjectCreateFromUrlResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_ObjectCreateFromUrl_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ObjectCreateFromUrl' +type MockClientCommandsServer_ObjectCreateFromUrl_Call struct { + *mock.Call +} + +// ObjectCreateFromUrl is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcObjectCreateFromUrlRequest +func (_e *MockClientCommandsServer_Expecter) ObjectCreateFromUrl(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_ObjectCreateFromUrl_Call { + return &MockClientCommandsServer_ObjectCreateFromUrl_Call{Call: _e.mock.On("ObjectCreateFromUrl", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_ObjectCreateFromUrl_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcObjectCreateFromUrlRequest)) *MockClientCommandsServer_ObjectCreateFromUrl_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcObjectCreateFromUrlRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_ObjectCreateFromUrl_Call) Return(_a0 *pb.RpcObjectCreateFromUrlResponse) *MockClientCommandsServer_ObjectCreateFromUrl_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_ObjectCreateFromUrl_Call) RunAndReturn(run func(context.Context, *pb.RpcObjectCreateFromUrlRequest) *pb.RpcObjectCreateFromUrlResponse) *MockClientCommandsServer_ObjectCreateFromUrl_Call { + _c.Call.Return(run) + return _c +} + +// ObjectCreateObjectType provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) ObjectCreateObjectType(_a0 context.Context, _a1 *pb.RpcObjectCreateObjectTypeRequest) *pb.RpcObjectCreateObjectTypeResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for ObjectCreateObjectType") + } + + var r0 *pb.RpcObjectCreateObjectTypeResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcObjectCreateObjectTypeRequest) *pb.RpcObjectCreateObjectTypeResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcObjectCreateObjectTypeResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_ObjectCreateObjectType_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ObjectCreateObjectType' +type MockClientCommandsServer_ObjectCreateObjectType_Call struct { + *mock.Call +} + +// ObjectCreateObjectType is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcObjectCreateObjectTypeRequest +func (_e *MockClientCommandsServer_Expecter) ObjectCreateObjectType(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_ObjectCreateObjectType_Call { + return &MockClientCommandsServer_ObjectCreateObjectType_Call{Call: _e.mock.On("ObjectCreateObjectType", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_ObjectCreateObjectType_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcObjectCreateObjectTypeRequest)) *MockClientCommandsServer_ObjectCreateObjectType_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcObjectCreateObjectTypeRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_ObjectCreateObjectType_Call) Return(_a0 *pb.RpcObjectCreateObjectTypeResponse) *MockClientCommandsServer_ObjectCreateObjectType_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_ObjectCreateObjectType_Call) RunAndReturn(run func(context.Context, *pb.RpcObjectCreateObjectTypeRequest) *pb.RpcObjectCreateObjectTypeResponse) *MockClientCommandsServer_ObjectCreateObjectType_Call { + _c.Call.Return(run) + return _c +} + +// ObjectCreateRelation provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) ObjectCreateRelation(_a0 context.Context, _a1 *pb.RpcObjectCreateRelationRequest) *pb.RpcObjectCreateRelationResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for ObjectCreateRelation") + } + + var r0 *pb.RpcObjectCreateRelationResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcObjectCreateRelationRequest) *pb.RpcObjectCreateRelationResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcObjectCreateRelationResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_ObjectCreateRelation_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ObjectCreateRelation' +type MockClientCommandsServer_ObjectCreateRelation_Call struct { + *mock.Call +} + +// ObjectCreateRelation is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcObjectCreateRelationRequest +func (_e *MockClientCommandsServer_Expecter) ObjectCreateRelation(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_ObjectCreateRelation_Call { + return &MockClientCommandsServer_ObjectCreateRelation_Call{Call: _e.mock.On("ObjectCreateRelation", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_ObjectCreateRelation_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcObjectCreateRelationRequest)) *MockClientCommandsServer_ObjectCreateRelation_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcObjectCreateRelationRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_ObjectCreateRelation_Call) Return(_a0 *pb.RpcObjectCreateRelationResponse) *MockClientCommandsServer_ObjectCreateRelation_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_ObjectCreateRelation_Call) RunAndReturn(run func(context.Context, *pb.RpcObjectCreateRelationRequest) *pb.RpcObjectCreateRelationResponse) *MockClientCommandsServer_ObjectCreateRelation_Call { + _c.Call.Return(run) + return _c +} + +// ObjectCreateRelationOption provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) ObjectCreateRelationOption(_a0 context.Context, _a1 *pb.RpcObjectCreateRelationOptionRequest) *pb.RpcObjectCreateRelationOptionResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for ObjectCreateRelationOption") + } + + var r0 *pb.RpcObjectCreateRelationOptionResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcObjectCreateRelationOptionRequest) *pb.RpcObjectCreateRelationOptionResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcObjectCreateRelationOptionResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_ObjectCreateRelationOption_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ObjectCreateRelationOption' +type MockClientCommandsServer_ObjectCreateRelationOption_Call struct { + *mock.Call +} + +// ObjectCreateRelationOption is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcObjectCreateRelationOptionRequest +func (_e *MockClientCommandsServer_Expecter) ObjectCreateRelationOption(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_ObjectCreateRelationOption_Call { + return &MockClientCommandsServer_ObjectCreateRelationOption_Call{Call: _e.mock.On("ObjectCreateRelationOption", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_ObjectCreateRelationOption_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcObjectCreateRelationOptionRequest)) *MockClientCommandsServer_ObjectCreateRelationOption_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcObjectCreateRelationOptionRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_ObjectCreateRelationOption_Call) Return(_a0 *pb.RpcObjectCreateRelationOptionResponse) *MockClientCommandsServer_ObjectCreateRelationOption_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_ObjectCreateRelationOption_Call) RunAndReturn(run func(context.Context, *pb.RpcObjectCreateRelationOptionRequest) *pb.RpcObjectCreateRelationOptionResponse) *MockClientCommandsServer_ObjectCreateRelationOption_Call { + _c.Call.Return(run) + return _c +} + +// ObjectCreateSet provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) ObjectCreateSet(_a0 context.Context, _a1 *pb.RpcObjectCreateSetRequest) *pb.RpcObjectCreateSetResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for ObjectCreateSet") + } + + var r0 *pb.RpcObjectCreateSetResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcObjectCreateSetRequest) *pb.RpcObjectCreateSetResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcObjectCreateSetResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_ObjectCreateSet_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ObjectCreateSet' +type MockClientCommandsServer_ObjectCreateSet_Call struct { + *mock.Call +} + +// ObjectCreateSet is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcObjectCreateSetRequest +func (_e *MockClientCommandsServer_Expecter) ObjectCreateSet(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_ObjectCreateSet_Call { + return &MockClientCommandsServer_ObjectCreateSet_Call{Call: _e.mock.On("ObjectCreateSet", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_ObjectCreateSet_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcObjectCreateSetRequest)) *MockClientCommandsServer_ObjectCreateSet_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcObjectCreateSetRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_ObjectCreateSet_Call) Return(_a0 *pb.RpcObjectCreateSetResponse) *MockClientCommandsServer_ObjectCreateSet_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_ObjectCreateSet_Call) RunAndReturn(run func(context.Context, *pb.RpcObjectCreateSetRequest) *pb.RpcObjectCreateSetResponse) *MockClientCommandsServer_ObjectCreateSet_Call { + _c.Call.Return(run) + return _c +} + +// ObjectCrossSpaceSearchSubscribe provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) ObjectCrossSpaceSearchSubscribe(_a0 context.Context, _a1 *pb.RpcObjectCrossSpaceSearchSubscribeRequest) *pb.RpcObjectCrossSpaceSearchSubscribeResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for ObjectCrossSpaceSearchSubscribe") + } + + var r0 *pb.RpcObjectCrossSpaceSearchSubscribeResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcObjectCrossSpaceSearchSubscribeRequest) *pb.RpcObjectCrossSpaceSearchSubscribeResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcObjectCrossSpaceSearchSubscribeResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_ObjectCrossSpaceSearchSubscribe_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ObjectCrossSpaceSearchSubscribe' +type MockClientCommandsServer_ObjectCrossSpaceSearchSubscribe_Call struct { + *mock.Call +} + +// ObjectCrossSpaceSearchSubscribe is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcObjectCrossSpaceSearchSubscribeRequest +func (_e *MockClientCommandsServer_Expecter) ObjectCrossSpaceSearchSubscribe(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_ObjectCrossSpaceSearchSubscribe_Call { + return &MockClientCommandsServer_ObjectCrossSpaceSearchSubscribe_Call{Call: _e.mock.On("ObjectCrossSpaceSearchSubscribe", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_ObjectCrossSpaceSearchSubscribe_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcObjectCrossSpaceSearchSubscribeRequest)) *MockClientCommandsServer_ObjectCrossSpaceSearchSubscribe_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcObjectCrossSpaceSearchSubscribeRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_ObjectCrossSpaceSearchSubscribe_Call) Return(_a0 *pb.RpcObjectCrossSpaceSearchSubscribeResponse) *MockClientCommandsServer_ObjectCrossSpaceSearchSubscribe_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_ObjectCrossSpaceSearchSubscribe_Call) RunAndReturn(run func(context.Context, *pb.RpcObjectCrossSpaceSearchSubscribeRequest) *pb.RpcObjectCrossSpaceSearchSubscribeResponse) *MockClientCommandsServer_ObjectCrossSpaceSearchSubscribe_Call { + _c.Call.Return(run) + return _c +} + +// ObjectCrossSpaceSearchUnsubscribe provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) ObjectCrossSpaceSearchUnsubscribe(_a0 context.Context, _a1 *pb.RpcObjectCrossSpaceSearchUnsubscribeRequest) *pb.RpcObjectCrossSpaceSearchUnsubscribeResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for ObjectCrossSpaceSearchUnsubscribe") + } + + var r0 *pb.RpcObjectCrossSpaceSearchUnsubscribeResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcObjectCrossSpaceSearchUnsubscribeRequest) *pb.RpcObjectCrossSpaceSearchUnsubscribeResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcObjectCrossSpaceSearchUnsubscribeResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_ObjectCrossSpaceSearchUnsubscribe_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ObjectCrossSpaceSearchUnsubscribe' +type MockClientCommandsServer_ObjectCrossSpaceSearchUnsubscribe_Call struct { + *mock.Call +} + +// ObjectCrossSpaceSearchUnsubscribe is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcObjectCrossSpaceSearchUnsubscribeRequest +func (_e *MockClientCommandsServer_Expecter) ObjectCrossSpaceSearchUnsubscribe(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_ObjectCrossSpaceSearchUnsubscribe_Call { + return &MockClientCommandsServer_ObjectCrossSpaceSearchUnsubscribe_Call{Call: _e.mock.On("ObjectCrossSpaceSearchUnsubscribe", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_ObjectCrossSpaceSearchUnsubscribe_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcObjectCrossSpaceSearchUnsubscribeRequest)) *MockClientCommandsServer_ObjectCrossSpaceSearchUnsubscribe_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcObjectCrossSpaceSearchUnsubscribeRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_ObjectCrossSpaceSearchUnsubscribe_Call) Return(_a0 *pb.RpcObjectCrossSpaceSearchUnsubscribeResponse) *MockClientCommandsServer_ObjectCrossSpaceSearchUnsubscribe_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_ObjectCrossSpaceSearchUnsubscribe_Call) RunAndReturn(run func(context.Context, *pb.RpcObjectCrossSpaceSearchUnsubscribeRequest) *pb.RpcObjectCrossSpaceSearchUnsubscribeResponse) *MockClientCommandsServer_ObjectCrossSpaceSearchUnsubscribe_Call { + _c.Call.Return(run) + return _c +} + +// ObjectDateByTimestamp provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) ObjectDateByTimestamp(_a0 context.Context, _a1 *pb.RpcObjectDateByTimestampRequest) *pb.RpcObjectDateByTimestampResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for ObjectDateByTimestamp") + } + + var r0 *pb.RpcObjectDateByTimestampResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcObjectDateByTimestampRequest) *pb.RpcObjectDateByTimestampResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcObjectDateByTimestampResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_ObjectDateByTimestamp_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ObjectDateByTimestamp' +type MockClientCommandsServer_ObjectDateByTimestamp_Call struct { + *mock.Call +} + +// ObjectDateByTimestamp is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcObjectDateByTimestampRequest +func (_e *MockClientCommandsServer_Expecter) ObjectDateByTimestamp(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_ObjectDateByTimestamp_Call { + return &MockClientCommandsServer_ObjectDateByTimestamp_Call{Call: _e.mock.On("ObjectDateByTimestamp", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_ObjectDateByTimestamp_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcObjectDateByTimestampRequest)) *MockClientCommandsServer_ObjectDateByTimestamp_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcObjectDateByTimestampRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_ObjectDateByTimestamp_Call) Return(_a0 *pb.RpcObjectDateByTimestampResponse) *MockClientCommandsServer_ObjectDateByTimestamp_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_ObjectDateByTimestamp_Call) RunAndReturn(run func(context.Context, *pb.RpcObjectDateByTimestampRequest) *pb.RpcObjectDateByTimestampResponse) *MockClientCommandsServer_ObjectDateByTimestamp_Call { + _c.Call.Return(run) + return _c +} + +// ObjectDuplicate provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) ObjectDuplicate(_a0 context.Context, _a1 *pb.RpcObjectDuplicateRequest) *pb.RpcObjectDuplicateResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for ObjectDuplicate") + } + + var r0 *pb.RpcObjectDuplicateResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcObjectDuplicateRequest) *pb.RpcObjectDuplicateResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcObjectDuplicateResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_ObjectDuplicate_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ObjectDuplicate' +type MockClientCommandsServer_ObjectDuplicate_Call struct { + *mock.Call +} + +// ObjectDuplicate is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcObjectDuplicateRequest +func (_e *MockClientCommandsServer_Expecter) ObjectDuplicate(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_ObjectDuplicate_Call { + return &MockClientCommandsServer_ObjectDuplicate_Call{Call: _e.mock.On("ObjectDuplicate", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_ObjectDuplicate_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcObjectDuplicateRequest)) *MockClientCommandsServer_ObjectDuplicate_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcObjectDuplicateRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_ObjectDuplicate_Call) Return(_a0 *pb.RpcObjectDuplicateResponse) *MockClientCommandsServer_ObjectDuplicate_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_ObjectDuplicate_Call) RunAndReturn(run func(context.Context, *pb.RpcObjectDuplicateRequest) *pb.RpcObjectDuplicateResponse) *MockClientCommandsServer_ObjectDuplicate_Call { + _c.Call.Return(run) + return _c +} + +// ObjectGraph provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) ObjectGraph(_a0 context.Context, _a1 *pb.RpcObjectGraphRequest) *pb.RpcObjectGraphResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for ObjectGraph") + } + + var r0 *pb.RpcObjectGraphResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcObjectGraphRequest) *pb.RpcObjectGraphResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcObjectGraphResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_ObjectGraph_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ObjectGraph' +type MockClientCommandsServer_ObjectGraph_Call struct { + *mock.Call +} + +// ObjectGraph is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcObjectGraphRequest +func (_e *MockClientCommandsServer_Expecter) ObjectGraph(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_ObjectGraph_Call { + return &MockClientCommandsServer_ObjectGraph_Call{Call: _e.mock.On("ObjectGraph", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_ObjectGraph_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcObjectGraphRequest)) *MockClientCommandsServer_ObjectGraph_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcObjectGraphRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_ObjectGraph_Call) Return(_a0 *pb.RpcObjectGraphResponse) *MockClientCommandsServer_ObjectGraph_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_ObjectGraph_Call) RunAndReturn(run func(context.Context, *pb.RpcObjectGraphRequest) *pb.RpcObjectGraphResponse) *MockClientCommandsServer_ObjectGraph_Call { + _c.Call.Return(run) + return _c +} + +// ObjectGroupsSubscribe provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) ObjectGroupsSubscribe(_a0 context.Context, _a1 *pb.RpcObjectGroupsSubscribeRequest) *pb.RpcObjectGroupsSubscribeResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for ObjectGroupsSubscribe") + } + + var r0 *pb.RpcObjectGroupsSubscribeResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcObjectGroupsSubscribeRequest) *pb.RpcObjectGroupsSubscribeResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcObjectGroupsSubscribeResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_ObjectGroupsSubscribe_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ObjectGroupsSubscribe' +type MockClientCommandsServer_ObjectGroupsSubscribe_Call struct { + *mock.Call +} + +// ObjectGroupsSubscribe is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcObjectGroupsSubscribeRequest +func (_e *MockClientCommandsServer_Expecter) ObjectGroupsSubscribe(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_ObjectGroupsSubscribe_Call { + return &MockClientCommandsServer_ObjectGroupsSubscribe_Call{Call: _e.mock.On("ObjectGroupsSubscribe", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_ObjectGroupsSubscribe_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcObjectGroupsSubscribeRequest)) *MockClientCommandsServer_ObjectGroupsSubscribe_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcObjectGroupsSubscribeRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_ObjectGroupsSubscribe_Call) Return(_a0 *pb.RpcObjectGroupsSubscribeResponse) *MockClientCommandsServer_ObjectGroupsSubscribe_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_ObjectGroupsSubscribe_Call) RunAndReturn(run func(context.Context, *pb.RpcObjectGroupsSubscribeRequest) *pb.RpcObjectGroupsSubscribeResponse) *MockClientCommandsServer_ObjectGroupsSubscribe_Call { + _c.Call.Return(run) + return _c +} + +// ObjectImport provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) ObjectImport(_a0 context.Context, _a1 *pb.RpcObjectImportRequest) *pb.RpcObjectImportResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for ObjectImport") + } + + var r0 *pb.RpcObjectImportResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcObjectImportRequest) *pb.RpcObjectImportResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcObjectImportResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_ObjectImport_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ObjectImport' +type MockClientCommandsServer_ObjectImport_Call struct { + *mock.Call +} + +// ObjectImport is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcObjectImportRequest +func (_e *MockClientCommandsServer_Expecter) ObjectImport(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_ObjectImport_Call { + return &MockClientCommandsServer_ObjectImport_Call{Call: _e.mock.On("ObjectImport", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_ObjectImport_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcObjectImportRequest)) *MockClientCommandsServer_ObjectImport_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcObjectImportRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_ObjectImport_Call) Return(_a0 *pb.RpcObjectImportResponse) *MockClientCommandsServer_ObjectImport_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_ObjectImport_Call) RunAndReturn(run func(context.Context, *pb.RpcObjectImportRequest) *pb.RpcObjectImportResponse) *MockClientCommandsServer_ObjectImport_Call { + _c.Call.Return(run) + return _c +} + +// ObjectImportExperience provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) ObjectImportExperience(_a0 context.Context, _a1 *pb.RpcObjectImportExperienceRequest) *pb.RpcObjectImportExperienceResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for ObjectImportExperience") + } + + var r0 *pb.RpcObjectImportExperienceResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcObjectImportExperienceRequest) *pb.RpcObjectImportExperienceResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcObjectImportExperienceResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_ObjectImportExperience_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ObjectImportExperience' +type MockClientCommandsServer_ObjectImportExperience_Call struct { + *mock.Call +} + +// ObjectImportExperience is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcObjectImportExperienceRequest +func (_e *MockClientCommandsServer_Expecter) ObjectImportExperience(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_ObjectImportExperience_Call { + return &MockClientCommandsServer_ObjectImportExperience_Call{Call: _e.mock.On("ObjectImportExperience", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_ObjectImportExperience_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcObjectImportExperienceRequest)) *MockClientCommandsServer_ObjectImportExperience_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcObjectImportExperienceRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_ObjectImportExperience_Call) Return(_a0 *pb.RpcObjectImportExperienceResponse) *MockClientCommandsServer_ObjectImportExperience_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_ObjectImportExperience_Call) RunAndReturn(run func(context.Context, *pb.RpcObjectImportExperienceRequest) *pb.RpcObjectImportExperienceResponse) *MockClientCommandsServer_ObjectImportExperience_Call { + _c.Call.Return(run) + return _c +} + +// ObjectImportList provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) ObjectImportList(_a0 context.Context, _a1 *pb.RpcObjectImportListRequest) *pb.RpcObjectImportListResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for ObjectImportList") + } + + var r0 *pb.RpcObjectImportListResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcObjectImportListRequest) *pb.RpcObjectImportListResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcObjectImportListResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_ObjectImportList_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ObjectImportList' +type MockClientCommandsServer_ObjectImportList_Call struct { + *mock.Call +} + +// ObjectImportList is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcObjectImportListRequest +func (_e *MockClientCommandsServer_Expecter) ObjectImportList(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_ObjectImportList_Call { + return &MockClientCommandsServer_ObjectImportList_Call{Call: _e.mock.On("ObjectImportList", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_ObjectImportList_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcObjectImportListRequest)) *MockClientCommandsServer_ObjectImportList_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcObjectImportListRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_ObjectImportList_Call) Return(_a0 *pb.RpcObjectImportListResponse) *MockClientCommandsServer_ObjectImportList_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_ObjectImportList_Call) RunAndReturn(run func(context.Context, *pb.RpcObjectImportListRequest) *pb.RpcObjectImportListResponse) *MockClientCommandsServer_ObjectImportList_Call { + _c.Call.Return(run) + return _c +} + +// ObjectImportNotionValidateToken provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) ObjectImportNotionValidateToken(_a0 context.Context, _a1 *pb.RpcObjectImportNotionValidateTokenRequest) *pb.RpcObjectImportNotionValidateTokenResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for ObjectImportNotionValidateToken") + } + + var r0 *pb.RpcObjectImportNotionValidateTokenResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcObjectImportNotionValidateTokenRequest) *pb.RpcObjectImportNotionValidateTokenResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcObjectImportNotionValidateTokenResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_ObjectImportNotionValidateToken_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ObjectImportNotionValidateToken' +type MockClientCommandsServer_ObjectImportNotionValidateToken_Call struct { + *mock.Call +} + +// ObjectImportNotionValidateToken is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcObjectImportNotionValidateTokenRequest +func (_e *MockClientCommandsServer_Expecter) ObjectImportNotionValidateToken(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_ObjectImportNotionValidateToken_Call { + return &MockClientCommandsServer_ObjectImportNotionValidateToken_Call{Call: _e.mock.On("ObjectImportNotionValidateToken", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_ObjectImportNotionValidateToken_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcObjectImportNotionValidateTokenRequest)) *MockClientCommandsServer_ObjectImportNotionValidateToken_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcObjectImportNotionValidateTokenRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_ObjectImportNotionValidateToken_Call) Return(_a0 *pb.RpcObjectImportNotionValidateTokenResponse) *MockClientCommandsServer_ObjectImportNotionValidateToken_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_ObjectImportNotionValidateToken_Call) RunAndReturn(run func(context.Context, *pb.RpcObjectImportNotionValidateTokenRequest) *pb.RpcObjectImportNotionValidateTokenResponse) *MockClientCommandsServer_ObjectImportNotionValidateToken_Call { + _c.Call.Return(run) + return _c +} + +// ObjectImportUseCase provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) ObjectImportUseCase(_a0 context.Context, _a1 *pb.RpcObjectImportUseCaseRequest) *pb.RpcObjectImportUseCaseResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for ObjectImportUseCase") + } + + var r0 *pb.RpcObjectImportUseCaseResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcObjectImportUseCaseRequest) *pb.RpcObjectImportUseCaseResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcObjectImportUseCaseResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_ObjectImportUseCase_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ObjectImportUseCase' +type MockClientCommandsServer_ObjectImportUseCase_Call struct { + *mock.Call +} + +// ObjectImportUseCase is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcObjectImportUseCaseRequest +func (_e *MockClientCommandsServer_Expecter) ObjectImportUseCase(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_ObjectImportUseCase_Call { + return &MockClientCommandsServer_ObjectImportUseCase_Call{Call: _e.mock.On("ObjectImportUseCase", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_ObjectImportUseCase_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcObjectImportUseCaseRequest)) *MockClientCommandsServer_ObjectImportUseCase_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcObjectImportUseCaseRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_ObjectImportUseCase_Call) Return(_a0 *pb.RpcObjectImportUseCaseResponse) *MockClientCommandsServer_ObjectImportUseCase_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_ObjectImportUseCase_Call) RunAndReturn(run func(context.Context, *pb.RpcObjectImportUseCaseRequest) *pb.RpcObjectImportUseCaseResponse) *MockClientCommandsServer_ObjectImportUseCase_Call { + _c.Call.Return(run) + return _c +} + +// ObjectListDelete provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) ObjectListDelete(_a0 context.Context, _a1 *pb.RpcObjectListDeleteRequest) *pb.RpcObjectListDeleteResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for ObjectListDelete") + } + + var r0 *pb.RpcObjectListDeleteResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcObjectListDeleteRequest) *pb.RpcObjectListDeleteResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcObjectListDeleteResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_ObjectListDelete_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ObjectListDelete' +type MockClientCommandsServer_ObjectListDelete_Call struct { + *mock.Call +} + +// ObjectListDelete is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcObjectListDeleteRequest +func (_e *MockClientCommandsServer_Expecter) ObjectListDelete(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_ObjectListDelete_Call { + return &MockClientCommandsServer_ObjectListDelete_Call{Call: _e.mock.On("ObjectListDelete", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_ObjectListDelete_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcObjectListDeleteRequest)) *MockClientCommandsServer_ObjectListDelete_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcObjectListDeleteRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_ObjectListDelete_Call) Return(_a0 *pb.RpcObjectListDeleteResponse) *MockClientCommandsServer_ObjectListDelete_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_ObjectListDelete_Call) RunAndReturn(run func(context.Context, *pb.RpcObjectListDeleteRequest) *pb.RpcObjectListDeleteResponse) *MockClientCommandsServer_ObjectListDelete_Call { + _c.Call.Return(run) + return _c +} + +// ObjectListDuplicate provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) ObjectListDuplicate(_a0 context.Context, _a1 *pb.RpcObjectListDuplicateRequest) *pb.RpcObjectListDuplicateResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for ObjectListDuplicate") + } + + var r0 *pb.RpcObjectListDuplicateResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcObjectListDuplicateRequest) *pb.RpcObjectListDuplicateResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcObjectListDuplicateResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_ObjectListDuplicate_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ObjectListDuplicate' +type MockClientCommandsServer_ObjectListDuplicate_Call struct { + *mock.Call +} + +// ObjectListDuplicate is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcObjectListDuplicateRequest +func (_e *MockClientCommandsServer_Expecter) ObjectListDuplicate(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_ObjectListDuplicate_Call { + return &MockClientCommandsServer_ObjectListDuplicate_Call{Call: _e.mock.On("ObjectListDuplicate", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_ObjectListDuplicate_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcObjectListDuplicateRequest)) *MockClientCommandsServer_ObjectListDuplicate_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcObjectListDuplicateRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_ObjectListDuplicate_Call) Return(_a0 *pb.RpcObjectListDuplicateResponse) *MockClientCommandsServer_ObjectListDuplicate_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_ObjectListDuplicate_Call) RunAndReturn(run func(context.Context, *pb.RpcObjectListDuplicateRequest) *pb.RpcObjectListDuplicateResponse) *MockClientCommandsServer_ObjectListDuplicate_Call { + _c.Call.Return(run) + return _c +} + +// ObjectListExport provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) ObjectListExport(_a0 context.Context, _a1 *pb.RpcObjectListExportRequest) *pb.RpcObjectListExportResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for ObjectListExport") + } + + var r0 *pb.RpcObjectListExportResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcObjectListExportRequest) *pb.RpcObjectListExportResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcObjectListExportResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_ObjectListExport_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ObjectListExport' +type MockClientCommandsServer_ObjectListExport_Call struct { + *mock.Call +} + +// ObjectListExport is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcObjectListExportRequest +func (_e *MockClientCommandsServer_Expecter) ObjectListExport(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_ObjectListExport_Call { + return &MockClientCommandsServer_ObjectListExport_Call{Call: _e.mock.On("ObjectListExport", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_ObjectListExport_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcObjectListExportRequest)) *MockClientCommandsServer_ObjectListExport_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcObjectListExportRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_ObjectListExport_Call) Return(_a0 *pb.RpcObjectListExportResponse) *MockClientCommandsServer_ObjectListExport_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_ObjectListExport_Call) RunAndReturn(run func(context.Context, *pb.RpcObjectListExportRequest) *pb.RpcObjectListExportResponse) *MockClientCommandsServer_ObjectListExport_Call { + _c.Call.Return(run) + return _c +} + +// ObjectListModifyDetailValues provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) ObjectListModifyDetailValues(_a0 context.Context, _a1 *pb.RpcObjectListModifyDetailValuesRequest) *pb.RpcObjectListModifyDetailValuesResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for ObjectListModifyDetailValues") + } + + var r0 *pb.RpcObjectListModifyDetailValuesResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcObjectListModifyDetailValuesRequest) *pb.RpcObjectListModifyDetailValuesResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcObjectListModifyDetailValuesResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_ObjectListModifyDetailValues_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ObjectListModifyDetailValues' +type MockClientCommandsServer_ObjectListModifyDetailValues_Call struct { + *mock.Call +} + +// ObjectListModifyDetailValues is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcObjectListModifyDetailValuesRequest +func (_e *MockClientCommandsServer_Expecter) ObjectListModifyDetailValues(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_ObjectListModifyDetailValues_Call { + return &MockClientCommandsServer_ObjectListModifyDetailValues_Call{Call: _e.mock.On("ObjectListModifyDetailValues", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_ObjectListModifyDetailValues_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcObjectListModifyDetailValuesRequest)) *MockClientCommandsServer_ObjectListModifyDetailValues_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcObjectListModifyDetailValuesRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_ObjectListModifyDetailValues_Call) Return(_a0 *pb.RpcObjectListModifyDetailValuesResponse) *MockClientCommandsServer_ObjectListModifyDetailValues_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_ObjectListModifyDetailValues_Call) RunAndReturn(run func(context.Context, *pb.RpcObjectListModifyDetailValuesRequest) *pb.RpcObjectListModifyDetailValuesResponse) *MockClientCommandsServer_ObjectListModifyDetailValues_Call { + _c.Call.Return(run) + return _c +} + +// ObjectListSetDetails provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) ObjectListSetDetails(_a0 context.Context, _a1 *pb.RpcObjectListSetDetailsRequest) *pb.RpcObjectListSetDetailsResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for ObjectListSetDetails") + } + + var r0 *pb.RpcObjectListSetDetailsResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcObjectListSetDetailsRequest) *pb.RpcObjectListSetDetailsResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcObjectListSetDetailsResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_ObjectListSetDetails_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ObjectListSetDetails' +type MockClientCommandsServer_ObjectListSetDetails_Call struct { + *mock.Call +} + +// ObjectListSetDetails is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcObjectListSetDetailsRequest +func (_e *MockClientCommandsServer_Expecter) ObjectListSetDetails(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_ObjectListSetDetails_Call { + return &MockClientCommandsServer_ObjectListSetDetails_Call{Call: _e.mock.On("ObjectListSetDetails", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_ObjectListSetDetails_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcObjectListSetDetailsRequest)) *MockClientCommandsServer_ObjectListSetDetails_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcObjectListSetDetailsRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_ObjectListSetDetails_Call) Return(_a0 *pb.RpcObjectListSetDetailsResponse) *MockClientCommandsServer_ObjectListSetDetails_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_ObjectListSetDetails_Call) RunAndReturn(run func(context.Context, *pb.RpcObjectListSetDetailsRequest) *pb.RpcObjectListSetDetailsResponse) *MockClientCommandsServer_ObjectListSetDetails_Call { + _c.Call.Return(run) + return _c +} + +// ObjectListSetIsArchived provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) ObjectListSetIsArchived(_a0 context.Context, _a1 *pb.RpcObjectListSetIsArchivedRequest) *pb.RpcObjectListSetIsArchivedResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for ObjectListSetIsArchived") + } + + var r0 *pb.RpcObjectListSetIsArchivedResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcObjectListSetIsArchivedRequest) *pb.RpcObjectListSetIsArchivedResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcObjectListSetIsArchivedResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_ObjectListSetIsArchived_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ObjectListSetIsArchived' +type MockClientCommandsServer_ObjectListSetIsArchived_Call struct { + *mock.Call +} + +// ObjectListSetIsArchived is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcObjectListSetIsArchivedRequest +func (_e *MockClientCommandsServer_Expecter) ObjectListSetIsArchived(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_ObjectListSetIsArchived_Call { + return &MockClientCommandsServer_ObjectListSetIsArchived_Call{Call: _e.mock.On("ObjectListSetIsArchived", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_ObjectListSetIsArchived_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcObjectListSetIsArchivedRequest)) *MockClientCommandsServer_ObjectListSetIsArchived_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcObjectListSetIsArchivedRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_ObjectListSetIsArchived_Call) Return(_a0 *pb.RpcObjectListSetIsArchivedResponse) *MockClientCommandsServer_ObjectListSetIsArchived_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_ObjectListSetIsArchived_Call) RunAndReturn(run func(context.Context, *pb.RpcObjectListSetIsArchivedRequest) *pb.RpcObjectListSetIsArchivedResponse) *MockClientCommandsServer_ObjectListSetIsArchived_Call { + _c.Call.Return(run) + return _c +} + +// ObjectListSetIsFavorite provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) ObjectListSetIsFavorite(_a0 context.Context, _a1 *pb.RpcObjectListSetIsFavoriteRequest) *pb.RpcObjectListSetIsFavoriteResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for ObjectListSetIsFavorite") + } + + var r0 *pb.RpcObjectListSetIsFavoriteResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcObjectListSetIsFavoriteRequest) *pb.RpcObjectListSetIsFavoriteResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcObjectListSetIsFavoriteResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_ObjectListSetIsFavorite_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ObjectListSetIsFavorite' +type MockClientCommandsServer_ObjectListSetIsFavorite_Call struct { + *mock.Call +} + +// ObjectListSetIsFavorite is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcObjectListSetIsFavoriteRequest +func (_e *MockClientCommandsServer_Expecter) ObjectListSetIsFavorite(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_ObjectListSetIsFavorite_Call { + return &MockClientCommandsServer_ObjectListSetIsFavorite_Call{Call: _e.mock.On("ObjectListSetIsFavorite", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_ObjectListSetIsFavorite_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcObjectListSetIsFavoriteRequest)) *MockClientCommandsServer_ObjectListSetIsFavorite_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcObjectListSetIsFavoriteRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_ObjectListSetIsFavorite_Call) Return(_a0 *pb.RpcObjectListSetIsFavoriteResponse) *MockClientCommandsServer_ObjectListSetIsFavorite_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_ObjectListSetIsFavorite_Call) RunAndReturn(run func(context.Context, *pb.RpcObjectListSetIsFavoriteRequest) *pb.RpcObjectListSetIsFavoriteResponse) *MockClientCommandsServer_ObjectListSetIsFavorite_Call { + _c.Call.Return(run) + return _c +} + +// ObjectListSetObjectType provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) ObjectListSetObjectType(_a0 context.Context, _a1 *pb.RpcObjectListSetObjectTypeRequest) *pb.RpcObjectListSetObjectTypeResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for ObjectListSetObjectType") + } + + var r0 *pb.RpcObjectListSetObjectTypeResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcObjectListSetObjectTypeRequest) *pb.RpcObjectListSetObjectTypeResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcObjectListSetObjectTypeResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_ObjectListSetObjectType_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ObjectListSetObjectType' +type MockClientCommandsServer_ObjectListSetObjectType_Call struct { + *mock.Call +} + +// ObjectListSetObjectType is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcObjectListSetObjectTypeRequest +func (_e *MockClientCommandsServer_Expecter) ObjectListSetObjectType(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_ObjectListSetObjectType_Call { + return &MockClientCommandsServer_ObjectListSetObjectType_Call{Call: _e.mock.On("ObjectListSetObjectType", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_ObjectListSetObjectType_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcObjectListSetObjectTypeRequest)) *MockClientCommandsServer_ObjectListSetObjectType_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcObjectListSetObjectTypeRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_ObjectListSetObjectType_Call) Return(_a0 *pb.RpcObjectListSetObjectTypeResponse) *MockClientCommandsServer_ObjectListSetObjectType_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_ObjectListSetObjectType_Call) RunAndReturn(run func(context.Context, *pb.RpcObjectListSetObjectTypeRequest) *pb.RpcObjectListSetObjectTypeResponse) *MockClientCommandsServer_ObjectListSetObjectType_Call { + _c.Call.Return(run) + return _c +} + +// ObjectOpen provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) ObjectOpen(_a0 context.Context, _a1 *pb.RpcObjectOpenRequest) *pb.RpcObjectOpenResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for ObjectOpen") + } + + var r0 *pb.RpcObjectOpenResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcObjectOpenRequest) *pb.RpcObjectOpenResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcObjectOpenResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_ObjectOpen_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ObjectOpen' +type MockClientCommandsServer_ObjectOpen_Call struct { + *mock.Call +} + +// ObjectOpen is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcObjectOpenRequest +func (_e *MockClientCommandsServer_Expecter) ObjectOpen(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_ObjectOpen_Call { + return &MockClientCommandsServer_ObjectOpen_Call{Call: _e.mock.On("ObjectOpen", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_ObjectOpen_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcObjectOpenRequest)) *MockClientCommandsServer_ObjectOpen_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcObjectOpenRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_ObjectOpen_Call) Return(_a0 *pb.RpcObjectOpenResponse) *MockClientCommandsServer_ObjectOpen_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_ObjectOpen_Call) RunAndReturn(run func(context.Context, *pb.RpcObjectOpenRequest) *pb.RpcObjectOpenResponse) *MockClientCommandsServer_ObjectOpen_Call { + _c.Call.Return(run) + return _c +} + +// ObjectRedo provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) ObjectRedo(_a0 context.Context, _a1 *pb.RpcObjectRedoRequest) *pb.RpcObjectRedoResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for ObjectRedo") + } + + var r0 *pb.RpcObjectRedoResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcObjectRedoRequest) *pb.RpcObjectRedoResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcObjectRedoResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_ObjectRedo_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ObjectRedo' +type MockClientCommandsServer_ObjectRedo_Call struct { + *mock.Call +} + +// ObjectRedo is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcObjectRedoRequest +func (_e *MockClientCommandsServer_Expecter) ObjectRedo(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_ObjectRedo_Call { + return &MockClientCommandsServer_ObjectRedo_Call{Call: _e.mock.On("ObjectRedo", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_ObjectRedo_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcObjectRedoRequest)) *MockClientCommandsServer_ObjectRedo_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcObjectRedoRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_ObjectRedo_Call) Return(_a0 *pb.RpcObjectRedoResponse) *MockClientCommandsServer_ObjectRedo_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_ObjectRedo_Call) RunAndReturn(run func(context.Context, *pb.RpcObjectRedoRequest) *pb.RpcObjectRedoResponse) *MockClientCommandsServer_ObjectRedo_Call { + _c.Call.Return(run) + return _c +} + +// ObjectRelationAdd provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) ObjectRelationAdd(_a0 context.Context, _a1 *pb.RpcObjectRelationAddRequest) *pb.RpcObjectRelationAddResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for ObjectRelationAdd") + } + + var r0 *pb.RpcObjectRelationAddResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcObjectRelationAddRequest) *pb.RpcObjectRelationAddResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcObjectRelationAddResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_ObjectRelationAdd_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ObjectRelationAdd' +type MockClientCommandsServer_ObjectRelationAdd_Call struct { + *mock.Call +} + +// ObjectRelationAdd is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcObjectRelationAddRequest +func (_e *MockClientCommandsServer_Expecter) ObjectRelationAdd(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_ObjectRelationAdd_Call { + return &MockClientCommandsServer_ObjectRelationAdd_Call{Call: _e.mock.On("ObjectRelationAdd", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_ObjectRelationAdd_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcObjectRelationAddRequest)) *MockClientCommandsServer_ObjectRelationAdd_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcObjectRelationAddRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_ObjectRelationAdd_Call) Return(_a0 *pb.RpcObjectRelationAddResponse) *MockClientCommandsServer_ObjectRelationAdd_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_ObjectRelationAdd_Call) RunAndReturn(run func(context.Context, *pb.RpcObjectRelationAddRequest) *pb.RpcObjectRelationAddResponse) *MockClientCommandsServer_ObjectRelationAdd_Call { + _c.Call.Return(run) + return _c +} + +// ObjectRelationAddFeatured provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) ObjectRelationAddFeatured(_a0 context.Context, _a1 *pb.RpcObjectRelationAddFeaturedRequest) *pb.RpcObjectRelationAddFeaturedResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for ObjectRelationAddFeatured") + } + + var r0 *pb.RpcObjectRelationAddFeaturedResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcObjectRelationAddFeaturedRequest) *pb.RpcObjectRelationAddFeaturedResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcObjectRelationAddFeaturedResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_ObjectRelationAddFeatured_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ObjectRelationAddFeatured' +type MockClientCommandsServer_ObjectRelationAddFeatured_Call struct { + *mock.Call +} + +// ObjectRelationAddFeatured is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcObjectRelationAddFeaturedRequest +func (_e *MockClientCommandsServer_Expecter) ObjectRelationAddFeatured(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_ObjectRelationAddFeatured_Call { + return &MockClientCommandsServer_ObjectRelationAddFeatured_Call{Call: _e.mock.On("ObjectRelationAddFeatured", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_ObjectRelationAddFeatured_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcObjectRelationAddFeaturedRequest)) *MockClientCommandsServer_ObjectRelationAddFeatured_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcObjectRelationAddFeaturedRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_ObjectRelationAddFeatured_Call) Return(_a0 *pb.RpcObjectRelationAddFeaturedResponse) *MockClientCommandsServer_ObjectRelationAddFeatured_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_ObjectRelationAddFeatured_Call) RunAndReturn(run func(context.Context, *pb.RpcObjectRelationAddFeaturedRequest) *pb.RpcObjectRelationAddFeaturedResponse) *MockClientCommandsServer_ObjectRelationAddFeatured_Call { + _c.Call.Return(run) + return _c +} + +// ObjectRelationDelete provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) ObjectRelationDelete(_a0 context.Context, _a1 *pb.RpcObjectRelationDeleteRequest) *pb.RpcObjectRelationDeleteResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for ObjectRelationDelete") + } + + var r0 *pb.RpcObjectRelationDeleteResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcObjectRelationDeleteRequest) *pb.RpcObjectRelationDeleteResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcObjectRelationDeleteResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_ObjectRelationDelete_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ObjectRelationDelete' +type MockClientCommandsServer_ObjectRelationDelete_Call struct { + *mock.Call +} + +// ObjectRelationDelete is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcObjectRelationDeleteRequest +func (_e *MockClientCommandsServer_Expecter) ObjectRelationDelete(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_ObjectRelationDelete_Call { + return &MockClientCommandsServer_ObjectRelationDelete_Call{Call: _e.mock.On("ObjectRelationDelete", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_ObjectRelationDelete_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcObjectRelationDeleteRequest)) *MockClientCommandsServer_ObjectRelationDelete_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcObjectRelationDeleteRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_ObjectRelationDelete_Call) Return(_a0 *pb.RpcObjectRelationDeleteResponse) *MockClientCommandsServer_ObjectRelationDelete_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_ObjectRelationDelete_Call) RunAndReturn(run func(context.Context, *pb.RpcObjectRelationDeleteRequest) *pb.RpcObjectRelationDeleteResponse) *MockClientCommandsServer_ObjectRelationDelete_Call { + _c.Call.Return(run) + return _c +} + +// ObjectRelationListAvailable provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) ObjectRelationListAvailable(_a0 context.Context, _a1 *pb.RpcObjectRelationListAvailableRequest) *pb.RpcObjectRelationListAvailableResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for ObjectRelationListAvailable") + } + + var r0 *pb.RpcObjectRelationListAvailableResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcObjectRelationListAvailableRequest) *pb.RpcObjectRelationListAvailableResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcObjectRelationListAvailableResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_ObjectRelationListAvailable_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ObjectRelationListAvailable' +type MockClientCommandsServer_ObjectRelationListAvailable_Call struct { + *mock.Call +} + +// ObjectRelationListAvailable is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcObjectRelationListAvailableRequest +func (_e *MockClientCommandsServer_Expecter) ObjectRelationListAvailable(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_ObjectRelationListAvailable_Call { + return &MockClientCommandsServer_ObjectRelationListAvailable_Call{Call: _e.mock.On("ObjectRelationListAvailable", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_ObjectRelationListAvailable_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcObjectRelationListAvailableRequest)) *MockClientCommandsServer_ObjectRelationListAvailable_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcObjectRelationListAvailableRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_ObjectRelationListAvailable_Call) Return(_a0 *pb.RpcObjectRelationListAvailableResponse) *MockClientCommandsServer_ObjectRelationListAvailable_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_ObjectRelationListAvailable_Call) RunAndReturn(run func(context.Context, *pb.RpcObjectRelationListAvailableRequest) *pb.RpcObjectRelationListAvailableResponse) *MockClientCommandsServer_ObjectRelationListAvailable_Call { + _c.Call.Return(run) + return _c +} + +// ObjectRelationRemoveFeatured provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) ObjectRelationRemoveFeatured(_a0 context.Context, _a1 *pb.RpcObjectRelationRemoveFeaturedRequest) *pb.RpcObjectRelationRemoveFeaturedResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for ObjectRelationRemoveFeatured") + } + + var r0 *pb.RpcObjectRelationRemoveFeaturedResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcObjectRelationRemoveFeaturedRequest) *pb.RpcObjectRelationRemoveFeaturedResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcObjectRelationRemoveFeaturedResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_ObjectRelationRemoveFeatured_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ObjectRelationRemoveFeatured' +type MockClientCommandsServer_ObjectRelationRemoveFeatured_Call struct { + *mock.Call +} + +// ObjectRelationRemoveFeatured is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcObjectRelationRemoveFeaturedRequest +func (_e *MockClientCommandsServer_Expecter) ObjectRelationRemoveFeatured(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_ObjectRelationRemoveFeatured_Call { + return &MockClientCommandsServer_ObjectRelationRemoveFeatured_Call{Call: _e.mock.On("ObjectRelationRemoveFeatured", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_ObjectRelationRemoveFeatured_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcObjectRelationRemoveFeaturedRequest)) *MockClientCommandsServer_ObjectRelationRemoveFeatured_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcObjectRelationRemoveFeaturedRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_ObjectRelationRemoveFeatured_Call) Return(_a0 *pb.RpcObjectRelationRemoveFeaturedResponse) *MockClientCommandsServer_ObjectRelationRemoveFeatured_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_ObjectRelationRemoveFeatured_Call) RunAndReturn(run func(context.Context, *pb.RpcObjectRelationRemoveFeaturedRequest) *pb.RpcObjectRelationRemoveFeaturedResponse) *MockClientCommandsServer_ObjectRelationRemoveFeatured_Call { + _c.Call.Return(run) + return _c +} + +// ObjectSearch provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) ObjectSearch(_a0 context.Context, _a1 *pb.RpcObjectSearchRequest) *pb.RpcObjectSearchResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for ObjectSearch") + } + + var r0 *pb.RpcObjectSearchResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcObjectSearchRequest) *pb.RpcObjectSearchResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcObjectSearchResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_ObjectSearch_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ObjectSearch' +type MockClientCommandsServer_ObjectSearch_Call struct { + *mock.Call +} + +// ObjectSearch is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcObjectSearchRequest +func (_e *MockClientCommandsServer_Expecter) ObjectSearch(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_ObjectSearch_Call { + return &MockClientCommandsServer_ObjectSearch_Call{Call: _e.mock.On("ObjectSearch", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_ObjectSearch_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcObjectSearchRequest)) *MockClientCommandsServer_ObjectSearch_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcObjectSearchRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_ObjectSearch_Call) Return(_a0 *pb.RpcObjectSearchResponse) *MockClientCommandsServer_ObjectSearch_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_ObjectSearch_Call) RunAndReturn(run func(context.Context, *pb.RpcObjectSearchRequest) *pb.RpcObjectSearchResponse) *MockClientCommandsServer_ObjectSearch_Call { + _c.Call.Return(run) + return _c +} + +// ObjectSearchSubscribe provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) ObjectSearchSubscribe(_a0 context.Context, _a1 *pb.RpcObjectSearchSubscribeRequest) *pb.RpcObjectSearchSubscribeResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for ObjectSearchSubscribe") + } + + var r0 *pb.RpcObjectSearchSubscribeResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcObjectSearchSubscribeRequest) *pb.RpcObjectSearchSubscribeResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcObjectSearchSubscribeResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_ObjectSearchSubscribe_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ObjectSearchSubscribe' +type MockClientCommandsServer_ObjectSearchSubscribe_Call struct { + *mock.Call +} + +// ObjectSearchSubscribe is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcObjectSearchSubscribeRequest +func (_e *MockClientCommandsServer_Expecter) ObjectSearchSubscribe(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_ObjectSearchSubscribe_Call { + return &MockClientCommandsServer_ObjectSearchSubscribe_Call{Call: _e.mock.On("ObjectSearchSubscribe", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_ObjectSearchSubscribe_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcObjectSearchSubscribeRequest)) *MockClientCommandsServer_ObjectSearchSubscribe_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcObjectSearchSubscribeRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_ObjectSearchSubscribe_Call) Return(_a0 *pb.RpcObjectSearchSubscribeResponse) *MockClientCommandsServer_ObjectSearchSubscribe_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_ObjectSearchSubscribe_Call) RunAndReturn(run func(context.Context, *pb.RpcObjectSearchSubscribeRequest) *pb.RpcObjectSearchSubscribeResponse) *MockClientCommandsServer_ObjectSearchSubscribe_Call { + _c.Call.Return(run) + return _c +} + +// ObjectSearchUnsubscribe provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) ObjectSearchUnsubscribe(_a0 context.Context, _a1 *pb.RpcObjectSearchUnsubscribeRequest) *pb.RpcObjectSearchUnsubscribeResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for ObjectSearchUnsubscribe") + } + + var r0 *pb.RpcObjectSearchUnsubscribeResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcObjectSearchUnsubscribeRequest) *pb.RpcObjectSearchUnsubscribeResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcObjectSearchUnsubscribeResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_ObjectSearchUnsubscribe_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ObjectSearchUnsubscribe' +type MockClientCommandsServer_ObjectSearchUnsubscribe_Call struct { + *mock.Call +} + +// ObjectSearchUnsubscribe is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcObjectSearchUnsubscribeRequest +func (_e *MockClientCommandsServer_Expecter) ObjectSearchUnsubscribe(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_ObjectSearchUnsubscribe_Call { + return &MockClientCommandsServer_ObjectSearchUnsubscribe_Call{Call: _e.mock.On("ObjectSearchUnsubscribe", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_ObjectSearchUnsubscribe_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcObjectSearchUnsubscribeRequest)) *MockClientCommandsServer_ObjectSearchUnsubscribe_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcObjectSearchUnsubscribeRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_ObjectSearchUnsubscribe_Call) Return(_a0 *pb.RpcObjectSearchUnsubscribeResponse) *MockClientCommandsServer_ObjectSearchUnsubscribe_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_ObjectSearchUnsubscribe_Call) RunAndReturn(run func(context.Context, *pb.RpcObjectSearchUnsubscribeRequest) *pb.RpcObjectSearchUnsubscribeResponse) *MockClientCommandsServer_ObjectSearchUnsubscribe_Call { + _c.Call.Return(run) + return _c +} + +// ObjectSearchWithMeta provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) ObjectSearchWithMeta(_a0 context.Context, _a1 *pb.RpcObjectSearchWithMetaRequest) *pb.RpcObjectSearchWithMetaResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for ObjectSearchWithMeta") + } + + var r0 *pb.RpcObjectSearchWithMetaResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcObjectSearchWithMetaRequest) *pb.RpcObjectSearchWithMetaResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcObjectSearchWithMetaResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_ObjectSearchWithMeta_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ObjectSearchWithMeta' +type MockClientCommandsServer_ObjectSearchWithMeta_Call struct { + *mock.Call +} + +// ObjectSearchWithMeta is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcObjectSearchWithMetaRequest +func (_e *MockClientCommandsServer_Expecter) ObjectSearchWithMeta(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_ObjectSearchWithMeta_Call { + return &MockClientCommandsServer_ObjectSearchWithMeta_Call{Call: _e.mock.On("ObjectSearchWithMeta", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_ObjectSearchWithMeta_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcObjectSearchWithMetaRequest)) *MockClientCommandsServer_ObjectSearchWithMeta_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcObjectSearchWithMetaRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_ObjectSearchWithMeta_Call) Return(_a0 *pb.RpcObjectSearchWithMetaResponse) *MockClientCommandsServer_ObjectSearchWithMeta_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_ObjectSearchWithMeta_Call) RunAndReturn(run func(context.Context, *pb.RpcObjectSearchWithMetaRequest) *pb.RpcObjectSearchWithMetaResponse) *MockClientCommandsServer_ObjectSearchWithMeta_Call { + _c.Call.Return(run) + return _c +} + +// ObjectSetDetails provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) ObjectSetDetails(_a0 context.Context, _a1 *pb.RpcObjectSetDetailsRequest) *pb.RpcObjectSetDetailsResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for ObjectSetDetails") + } + + var r0 *pb.RpcObjectSetDetailsResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcObjectSetDetailsRequest) *pb.RpcObjectSetDetailsResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcObjectSetDetailsResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_ObjectSetDetails_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ObjectSetDetails' +type MockClientCommandsServer_ObjectSetDetails_Call struct { + *mock.Call +} + +// ObjectSetDetails is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcObjectSetDetailsRequest +func (_e *MockClientCommandsServer_Expecter) ObjectSetDetails(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_ObjectSetDetails_Call { + return &MockClientCommandsServer_ObjectSetDetails_Call{Call: _e.mock.On("ObjectSetDetails", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_ObjectSetDetails_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcObjectSetDetailsRequest)) *MockClientCommandsServer_ObjectSetDetails_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcObjectSetDetailsRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_ObjectSetDetails_Call) Return(_a0 *pb.RpcObjectSetDetailsResponse) *MockClientCommandsServer_ObjectSetDetails_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_ObjectSetDetails_Call) RunAndReturn(run func(context.Context, *pb.RpcObjectSetDetailsRequest) *pb.RpcObjectSetDetailsResponse) *MockClientCommandsServer_ObjectSetDetails_Call { + _c.Call.Return(run) + return _c +} + +// ObjectSetInternalFlags provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) ObjectSetInternalFlags(_a0 context.Context, _a1 *pb.RpcObjectSetInternalFlagsRequest) *pb.RpcObjectSetInternalFlagsResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for ObjectSetInternalFlags") + } + + var r0 *pb.RpcObjectSetInternalFlagsResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcObjectSetInternalFlagsRequest) *pb.RpcObjectSetInternalFlagsResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcObjectSetInternalFlagsResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_ObjectSetInternalFlags_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ObjectSetInternalFlags' +type MockClientCommandsServer_ObjectSetInternalFlags_Call struct { + *mock.Call +} + +// ObjectSetInternalFlags is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcObjectSetInternalFlagsRequest +func (_e *MockClientCommandsServer_Expecter) ObjectSetInternalFlags(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_ObjectSetInternalFlags_Call { + return &MockClientCommandsServer_ObjectSetInternalFlags_Call{Call: _e.mock.On("ObjectSetInternalFlags", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_ObjectSetInternalFlags_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcObjectSetInternalFlagsRequest)) *MockClientCommandsServer_ObjectSetInternalFlags_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcObjectSetInternalFlagsRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_ObjectSetInternalFlags_Call) Return(_a0 *pb.RpcObjectSetInternalFlagsResponse) *MockClientCommandsServer_ObjectSetInternalFlags_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_ObjectSetInternalFlags_Call) RunAndReturn(run func(context.Context, *pb.RpcObjectSetInternalFlagsRequest) *pb.RpcObjectSetInternalFlagsResponse) *MockClientCommandsServer_ObjectSetInternalFlags_Call { + _c.Call.Return(run) + return _c +} + +// ObjectSetIsArchived provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) ObjectSetIsArchived(_a0 context.Context, _a1 *pb.RpcObjectSetIsArchivedRequest) *pb.RpcObjectSetIsArchivedResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for ObjectSetIsArchived") + } + + var r0 *pb.RpcObjectSetIsArchivedResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcObjectSetIsArchivedRequest) *pb.RpcObjectSetIsArchivedResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcObjectSetIsArchivedResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_ObjectSetIsArchived_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ObjectSetIsArchived' +type MockClientCommandsServer_ObjectSetIsArchived_Call struct { + *mock.Call +} + +// ObjectSetIsArchived is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcObjectSetIsArchivedRequest +func (_e *MockClientCommandsServer_Expecter) ObjectSetIsArchived(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_ObjectSetIsArchived_Call { + return &MockClientCommandsServer_ObjectSetIsArchived_Call{Call: _e.mock.On("ObjectSetIsArchived", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_ObjectSetIsArchived_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcObjectSetIsArchivedRequest)) *MockClientCommandsServer_ObjectSetIsArchived_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcObjectSetIsArchivedRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_ObjectSetIsArchived_Call) Return(_a0 *pb.RpcObjectSetIsArchivedResponse) *MockClientCommandsServer_ObjectSetIsArchived_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_ObjectSetIsArchived_Call) RunAndReturn(run func(context.Context, *pb.RpcObjectSetIsArchivedRequest) *pb.RpcObjectSetIsArchivedResponse) *MockClientCommandsServer_ObjectSetIsArchived_Call { + _c.Call.Return(run) + return _c +} + +// ObjectSetIsFavorite provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) ObjectSetIsFavorite(_a0 context.Context, _a1 *pb.RpcObjectSetIsFavoriteRequest) *pb.RpcObjectSetIsFavoriteResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for ObjectSetIsFavorite") + } + + var r0 *pb.RpcObjectSetIsFavoriteResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcObjectSetIsFavoriteRequest) *pb.RpcObjectSetIsFavoriteResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcObjectSetIsFavoriteResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_ObjectSetIsFavorite_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ObjectSetIsFavorite' +type MockClientCommandsServer_ObjectSetIsFavorite_Call struct { + *mock.Call +} + +// ObjectSetIsFavorite is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcObjectSetIsFavoriteRequest +func (_e *MockClientCommandsServer_Expecter) ObjectSetIsFavorite(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_ObjectSetIsFavorite_Call { + return &MockClientCommandsServer_ObjectSetIsFavorite_Call{Call: _e.mock.On("ObjectSetIsFavorite", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_ObjectSetIsFavorite_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcObjectSetIsFavoriteRequest)) *MockClientCommandsServer_ObjectSetIsFavorite_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcObjectSetIsFavoriteRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_ObjectSetIsFavorite_Call) Return(_a0 *pb.RpcObjectSetIsFavoriteResponse) *MockClientCommandsServer_ObjectSetIsFavorite_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_ObjectSetIsFavorite_Call) RunAndReturn(run func(context.Context, *pb.RpcObjectSetIsFavoriteRequest) *pb.RpcObjectSetIsFavoriteResponse) *MockClientCommandsServer_ObjectSetIsFavorite_Call { + _c.Call.Return(run) + return _c +} + +// ObjectSetLayout provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) ObjectSetLayout(_a0 context.Context, _a1 *pb.RpcObjectSetLayoutRequest) *pb.RpcObjectSetLayoutResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for ObjectSetLayout") + } + + var r0 *pb.RpcObjectSetLayoutResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcObjectSetLayoutRequest) *pb.RpcObjectSetLayoutResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcObjectSetLayoutResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_ObjectSetLayout_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ObjectSetLayout' +type MockClientCommandsServer_ObjectSetLayout_Call struct { + *mock.Call +} + +// ObjectSetLayout is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcObjectSetLayoutRequest +func (_e *MockClientCommandsServer_Expecter) ObjectSetLayout(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_ObjectSetLayout_Call { + return &MockClientCommandsServer_ObjectSetLayout_Call{Call: _e.mock.On("ObjectSetLayout", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_ObjectSetLayout_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcObjectSetLayoutRequest)) *MockClientCommandsServer_ObjectSetLayout_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcObjectSetLayoutRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_ObjectSetLayout_Call) Return(_a0 *pb.RpcObjectSetLayoutResponse) *MockClientCommandsServer_ObjectSetLayout_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_ObjectSetLayout_Call) RunAndReturn(run func(context.Context, *pb.RpcObjectSetLayoutRequest) *pb.RpcObjectSetLayoutResponse) *MockClientCommandsServer_ObjectSetLayout_Call { + _c.Call.Return(run) + return _c +} + +// ObjectSetObjectType provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) ObjectSetObjectType(_a0 context.Context, _a1 *pb.RpcObjectSetObjectTypeRequest) *pb.RpcObjectSetObjectTypeResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for ObjectSetObjectType") + } + + var r0 *pb.RpcObjectSetObjectTypeResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcObjectSetObjectTypeRequest) *pb.RpcObjectSetObjectTypeResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcObjectSetObjectTypeResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_ObjectSetObjectType_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ObjectSetObjectType' +type MockClientCommandsServer_ObjectSetObjectType_Call struct { + *mock.Call +} + +// ObjectSetObjectType is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcObjectSetObjectTypeRequest +func (_e *MockClientCommandsServer_Expecter) ObjectSetObjectType(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_ObjectSetObjectType_Call { + return &MockClientCommandsServer_ObjectSetObjectType_Call{Call: _e.mock.On("ObjectSetObjectType", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_ObjectSetObjectType_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcObjectSetObjectTypeRequest)) *MockClientCommandsServer_ObjectSetObjectType_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcObjectSetObjectTypeRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_ObjectSetObjectType_Call) Return(_a0 *pb.RpcObjectSetObjectTypeResponse) *MockClientCommandsServer_ObjectSetObjectType_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_ObjectSetObjectType_Call) RunAndReturn(run func(context.Context, *pb.RpcObjectSetObjectTypeRequest) *pb.RpcObjectSetObjectTypeResponse) *MockClientCommandsServer_ObjectSetObjectType_Call { + _c.Call.Return(run) + return _c +} + +// ObjectSetSource provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) ObjectSetSource(_a0 context.Context, _a1 *pb.RpcObjectSetSourceRequest) *pb.RpcObjectSetSourceResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for ObjectSetSource") + } + + var r0 *pb.RpcObjectSetSourceResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcObjectSetSourceRequest) *pb.RpcObjectSetSourceResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcObjectSetSourceResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_ObjectSetSource_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ObjectSetSource' +type MockClientCommandsServer_ObjectSetSource_Call struct { + *mock.Call +} + +// ObjectSetSource is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcObjectSetSourceRequest +func (_e *MockClientCommandsServer_Expecter) ObjectSetSource(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_ObjectSetSource_Call { + return &MockClientCommandsServer_ObjectSetSource_Call{Call: _e.mock.On("ObjectSetSource", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_ObjectSetSource_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcObjectSetSourceRequest)) *MockClientCommandsServer_ObjectSetSource_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcObjectSetSourceRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_ObjectSetSource_Call) Return(_a0 *pb.RpcObjectSetSourceResponse) *MockClientCommandsServer_ObjectSetSource_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_ObjectSetSource_Call) RunAndReturn(run func(context.Context, *pb.RpcObjectSetSourceRequest) *pb.RpcObjectSetSourceResponse) *MockClientCommandsServer_ObjectSetSource_Call { + _c.Call.Return(run) + return _c +} + +// ObjectShareByLink provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) ObjectShareByLink(_a0 context.Context, _a1 *pb.RpcObjectShareByLinkRequest) *pb.RpcObjectShareByLinkResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for ObjectShareByLink") + } + + var r0 *pb.RpcObjectShareByLinkResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcObjectShareByLinkRequest) *pb.RpcObjectShareByLinkResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcObjectShareByLinkResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_ObjectShareByLink_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ObjectShareByLink' +type MockClientCommandsServer_ObjectShareByLink_Call struct { + *mock.Call +} + +// ObjectShareByLink is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcObjectShareByLinkRequest +func (_e *MockClientCommandsServer_Expecter) ObjectShareByLink(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_ObjectShareByLink_Call { + return &MockClientCommandsServer_ObjectShareByLink_Call{Call: _e.mock.On("ObjectShareByLink", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_ObjectShareByLink_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcObjectShareByLinkRequest)) *MockClientCommandsServer_ObjectShareByLink_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcObjectShareByLinkRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_ObjectShareByLink_Call) Return(_a0 *pb.RpcObjectShareByLinkResponse) *MockClientCommandsServer_ObjectShareByLink_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_ObjectShareByLink_Call) RunAndReturn(run func(context.Context, *pb.RpcObjectShareByLinkRequest) *pb.RpcObjectShareByLinkResponse) *MockClientCommandsServer_ObjectShareByLink_Call { + _c.Call.Return(run) + return _c +} + +// ObjectShow provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) ObjectShow(_a0 context.Context, _a1 *pb.RpcObjectShowRequest) *pb.RpcObjectShowResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for ObjectShow") + } + + var r0 *pb.RpcObjectShowResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcObjectShowRequest) *pb.RpcObjectShowResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcObjectShowResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_ObjectShow_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ObjectShow' +type MockClientCommandsServer_ObjectShow_Call struct { + *mock.Call +} + +// ObjectShow is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcObjectShowRequest +func (_e *MockClientCommandsServer_Expecter) ObjectShow(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_ObjectShow_Call { + return &MockClientCommandsServer_ObjectShow_Call{Call: _e.mock.On("ObjectShow", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_ObjectShow_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcObjectShowRequest)) *MockClientCommandsServer_ObjectShow_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcObjectShowRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_ObjectShow_Call) Return(_a0 *pb.RpcObjectShowResponse) *MockClientCommandsServer_ObjectShow_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_ObjectShow_Call) RunAndReturn(run func(context.Context, *pb.RpcObjectShowRequest) *pb.RpcObjectShowResponse) *MockClientCommandsServer_ObjectShow_Call { + _c.Call.Return(run) + return _c +} + +// ObjectSubscribeIds provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) ObjectSubscribeIds(_a0 context.Context, _a1 *pb.RpcObjectSubscribeIdsRequest) *pb.RpcObjectSubscribeIdsResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for ObjectSubscribeIds") + } + + var r0 *pb.RpcObjectSubscribeIdsResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcObjectSubscribeIdsRequest) *pb.RpcObjectSubscribeIdsResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcObjectSubscribeIdsResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_ObjectSubscribeIds_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ObjectSubscribeIds' +type MockClientCommandsServer_ObjectSubscribeIds_Call struct { + *mock.Call +} + +// ObjectSubscribeIds is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcObjectSubscribeIdsRequest +func (_e *MockClientCommandsServer_Expecter) ObjectSubscribeIds(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_ObjectSubscribeIds_Call { + return &MockClientCommandsServer_ObjectSubscribeIds_Call{Call: _e.mock.On("ObjectSubscribeIds", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_ObjectSubscribeIds_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcObjectSubscribeIdsRequest)) *MockClientCommandsServer_ObjectSubscribeIds_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcObjectSubscribeIdsRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_ObjectSubscribeIds_Call) Return(_a0 *pb.RpcObjectSubscribeIdsResponse) *MockClientCommandsServer_ObjectSubscribeIds_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_ObjectSubscribeIds_Call) RunAndReturn(run func(context.Context, *pb.RpcObjectSubscribeIdsRequest) *pb.RpcObjectSubscribeIdsResponse) *MockClientCommandsServer_ObjectSubscribeIds_Call { + _c.Call.Return(run) + return _c +} + +// ObjectToBookmark provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) ObjectToBookmark(_a0 context.Context, _a1 *pb.RpcObjectToBookmarkRequest) *pb.RpcObjectToBookmarkResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for ObjectToBookmark") + } + + var r0 *pb.RpcObjectToBookmarkResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcObjectToBookmarkRequest) *pb.RpcObjectToBookmarkResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcObjectToBookmarkResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_ObjectToBookmark_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ObjectToBookmark' +type MockClientCommandsServer_ObjectToBookmark_Call struct { + *mock.Call +} + +// ObjectToBookmark is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcObjectToBookmarkRequest +func (_e *MockClientCommandsServer_Expecter) ObjectToBookmark(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_ObjectToBookmark_Call { + return &MockClientCommandsServer_ObjectToBookmark_Call{Call: _e.mock.On("ObjectToBookmark", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_ObjectToBookmark_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcObjectToBookmarkRequest)) *MockClientCommandsServer_ObjectToBookmark_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcObjectToBookmarkRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_ObjectToBookmark_Call) Return(_a0 *pb.RpcObjectToBookmarkResponse) *MockClientCommandsServer_ObjectToBookmark_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_ObjectToBookmark_Call) RunAndReturn(run func(context.Context, *pb.RpcObjectToBookmarkRequest) *pb.RpcObjectToBookmarkResponse) *MockClientCommandsServer_ObjectToBookmark_Call { + _c.Call.Return(run) + return _c +} + +// ObjectToCollection provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) ObjectToCollection(_a0 context.Context, _a1 *pb.RpcObjectToCollectionRequest) *pb.RpcObjectToCollectionResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for ObjectToCollection") + } + + var r0 *pb.RpcObjectToCollectionResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcObjectToCollectionRequest) *pb.RpcObjectToCollectionResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcObjectToCollectionResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_ObjectToCollection_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ObjectToCollection' +type MockClientCommandsServer_ObjectToCollection_Call struct { + *mock.Call +} + +// ObjectToCollection is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcObjectToCollectionRequest +func (_e *MockClientCommandsServer_Expecter) ObjectToCollection(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_ObjectToCollection_Call { + return &MockClientCommandsServer_ObjectToCollection_Call{Call: _e.mock.On("ObjectToCollection", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_ObjectToCollection_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcObjectToCollectionRequest)) *MockClientCommandsServer_ObjectToCollection_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcObjectToCollectionRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_ObjectToCollection_Call) Return(_a0 *pb.RpcObjectToCollectionResponse) *MockClientCommandsServer_ObjectToCollection_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_ObjectToCollection_Call) RunAndReturn(run func(context.Context, *pb.RpcObjectToCollectionRequest) *pb.RpcObjectToCollectionResponse) *MockClientCommandsServer_ObjectToCollection_Call { + _c.Call.Return(run) + return _c +} + +// ObjectToSet provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) ObjectToSet(_a0 context.Context, _a1 *pb.RpcObjectToSetRequest) *pb.RpcObjectToSetResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for ObjectToSet") + } + + var r0 *pb.RpcObjectToSetResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcObjectToSetRequest) *pb.RpcObjectToSetResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcObjectToSetResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_ObjectToSet_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ObjectToSet' +type MockClientCommandsServer_ObjectToSet_Call struct { + *mock.Call +} + +// ObjectToSet is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcObjectToSetRequest +func (_e *MockClientCommandsServer_Expecter) ObjectToSet(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_ObjectToSet_Call { + return &MockClientCommandsServer_ObjectToSet_Call{Call: _e.mock.On("ObjectToSet", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_ObjectToSet_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcObjectToSetRequest)) *MockClientCommandsServer_ObjectToSet_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcObjectToSetRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_ObjectToSet_Call) Return(_a0 *pb.RpcObjectToSetResponse) *MockClientCommandsServer_ObjectToSet_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_ObjectToSet_Call) RunAndReturn(run func(context.Context, *pb.RpcObjectToSetRequest) *pb.RpcObjectToSetResponse) *MockClientCommandsServer_ObjectToSet_Call { + _c.Call.Return(run) + return _c +} + +// ObjectTypeRelationAdd provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) ObjectTypeRelationAdd(_a0 context.Context, _a1 *pb.RpcObjectTypeRelationAddRequest) *pb.RpcObjectTypeRelationAddResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for ObjectTypeRelationAdd") + } + + var r0 *pb.RpcObjectTypeRelationAddResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcObjectTypeRelationAddRequest) *pb.RpcObjectTypeRelationAddResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcObjectTypeRelationAddResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_ObjectTypeRelationAdd_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ObjectTypeRelationAdd' +type MockClientCommandsServer_ObjectTypeRelationAdd_Call struct { + *mock.Call +} + +// ObjectTypeRelationAdd is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcObjectTypeRelationAddRequest +func (_e *MockClientCommandsServer_Expecter) ObjectTypeRelationAdd(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_ObjectTypeRelationAdd_Call { + return &MockClientCommandsServer_ObjectTypeRelationAdd_Call{Call: _e.mock.On("ObjectTypeRelationAdd", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_ObjectTypeRelationAdd_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcObjectTypeRelationAddRequest)) *MockClientCommandsServer_ObjectTypeRelationAdd_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcObjectTypeRelationAddRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_ObjectTypeRelationAdd_Call) Return(_a0 *pb.RpcObjectTypeRelationAddResponse) *MockClientCommandsServer_ObjectTypeRelationAdd_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_ObjectTypeRelationAdd_Call) RunAndReturn(run func(context.Context, *pb.RpcObjectTypeRelationAddRequest) *pb.RpcObjectTypeRelationAddResponse) *MockClientCommandsServer_ObjectTypeRelationAdd_Call { + _c.Call.Return(run) + return _c +} + +// ObjectTypeRelationRemove provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) ObjectTypeRelationRemove(_a0 context.Context, _a1 *pb.RpcObjectTypeRelationRemoveRequest) *pb.RpcObjectTypeRelationRemoveResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for ObjectTypeRelationRemove") + } + + var r0 *pb.RpcObjectTypeRelationRemoveResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcObjectTypeRelationRemoveRequest) *pb.RpcObjectTypeRelationRemoveResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcObjectTypeRelationRemoveResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_ObjectTypeRelationRemove_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ObjectTypeRelationRemove' +type MockClientCommandsServer_ObjectTypeRelationRemove_Call struct { + *mock.Call +} + +// ObjectTypeRelationRemove is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcObjectTypeRelationRemoveRequest +func (_e *MockClientCommandsServer_Expecter) ObjectTypeRelationRemove(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_ObjectTypeRelationRemove_Call { + return &MockClientCommandsServer_ObjectTypeRelationRemove_Call{Call: _e.mock.On("ObjectTypeRelationRemove", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_ObjectTypeRelationRemove_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcObjectTypeRelationRemoveRequest)) *MockClientCommandsServer_ObjectTypeRelationRemove_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcObjectTypeRelationRemoveRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_ObjectTypeRelationRemove_Call) Return(_a0 *pb.RpcObjectTypeRelationRemoveResponse) *MockClientCommandsServer_ObjectTypeRelationRemove_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_ObjectTypeRelationRemove_Call) RunAndReturn(run func(context.Context, *pb.RpcObjectTypeRelationRemoveRequest) *pb.RpcObjectTypeRelationRemoveResponse) *MockClientCommandsServer_ObjectTypeRelationRemove_Call { + _c.Call.Return(run) + return _c +} + +// ObjectUndo provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) ObjectUndo(_a0 context.Context, _a1 *pb.RpcObjectUndoRequest) *pb.RpcObjectUndoResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for ObjectUndo") + } + + var r0 *pb.RpcObjectUndoResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcObjectUndoRequest) *pb.RpcObjectUndoResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcObjectUndoResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_ObjectUndo_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ObjectUndo' +type MockClientCommandsServer_ObjectUndo_Call struct { + *mock.Call +} + +// ObjectUndo is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcObjectUndoRequest +func (_e *MockClientCommandsServer_Expecter) ObjectUndo(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_ObjectUndo_Call { + return &MockClientCommandsServer_ObjectUndo_Call{Call: _e.mock.On("ObjectUndo", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_ObjectUndo_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcObjectUndoRequest)) *MockClientCommandsServer_ObjectUndo_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcObjectUndoRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_ObjectUndo_Call) Return(_a0 *pb.RpcObjectUndoResponse) *MockClientCommandsServer_ObjectUndo_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_ObjectUndo_Call) RunAndReturn(run func(context.Context, *pb.RpcObjectUndoRequest) *pb.RpcObjectUndoResponse) *MockClientCommandsServer_ObjectUndo_Call { + _c.Call.Return(run) + return _c +} + +// ObjectWorkspaceSetDashboard provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) ObjectWorkspaceSetDashboard(_a0 context.Context, _a1 *pb.RpcObjectWorkspaceSetDashboardRequest) *pb.RpcObjectWorkspaceSetDashboardResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for ObjectWorkspaceSetDashboard") + } + + var r0 *pb.RpcObjectWorkspaceSetDashboardResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcObjectWorkspaceSetDashboardRequest) *pb.RpcObjectWorkspaceSetDashboardResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcObjectWorkspaceSetDashboardResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_ObjectWorkspaceSetDashboard_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ObjectWorkspaceSetDashboard' +type MockClientCommandsServer_ObjectWorkspaceSetDashboard_Call struct { + *mock.Call +} + +// ObjectWorkspaceSetDashboard is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcObjectWorkspaceSetDashboardRequest +func (_e *MockClientCommandsServer_Expecter) ObjectWorkspaceSetDashboard(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_ObjectWorkspaceSetDashboard_Call { + return &MockClientCommandsServer_ObjectWorkspaceSetDashboard_Call{Call: _e.mock.On("ObjectWorkspaceSetDashboard", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_ObjectWorkspaceSetDashboard_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcObjectWorkspaceSetDashboardRequest)) *MockClientCommandsServer_ObjectWorkspaceSetDashboard_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcObjectWorkspaceSetDashboardRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_ObjectWorkspaceSetDashboard_Call) Return(_a0 *pb.RpcObjectWorkspaceSetDashboardResponse) *MockClientCommandsServer_ObjectWorkspaceSetDashboard_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_ObjectWorkspaceSetDashboard_Call) RunAndReturn(run func(context.Context, *pb.RpcObjectWorkspaceSetDashboardRequest) *pb.RpcObjectWorkspaceSetDashboardResponse) *MockClientCommandsServer_ObjectWorkspaceSetDashboard_Call { + _c.Call.Return(run) + return _c +} + +// ProcessCancel provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) ProcessCancel(_a0 context.Context, _a1 *pb.RpcProcessCancelRequest) *pb.RpcProcessCancelResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for ProcessCancel") + } + + var r0 *pb.RpcProcessCancelResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcProcessCancelRequest) *pb.RpcProcessCancelResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcProcessCancelResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_ProcessCancel_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ProcessCancel' +type MockClientCommandsServer_ProcessCancel_Call struct { + *mock.Call +} + +// ProcessCancel is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcProcessCancelRequest +func (_e *MockClientCommandsServer_Expecter) ProcessCancel(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_ProcessCancel_Call { + return &MockClientCommandsServer_ProcessCancel_Call{Call: _e.mock.On("ProcessCancel", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_ProcessCancel_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcProcessCancelRequest)) *MockClientCommandsServer_ProcessCancel_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcProcessCancelRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_ProcessCancel_Call) Return(_a0 *pb.RpcProcessCancelResponse) *MockClientCommandsServer_ProcessCancel_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_ProcessCancel_Call) RunAndReturn(run func(context.Context, *pb.RpcProcessCancelRequest) *pb.RpcProcessCancelResponse) *MockClientCommandsServer_ProcessCancel_Call { + _c.Call.Return(run) + return _c +} + +// ProcessSubscribe provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) ProcessSubscribe(_a0 context.Context, _a1 *pb.RpcProcessSubscribeRequest) *pb.RpcProcessSubscribeResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for ProcessSubscribe") + } + + var r0 *pb.RpcProcessSubscribeResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcProcessSubscribeRequest) *pb.RpcProcessSubscribeResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcProcessSubscribeResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_ProcessSubscribe_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ProcessSubscribe' +type MockClientCommandsServer_ProcessSubscribe_Call struct { + *mock.Call +} + +// ProcessSubscribe is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcProcessSubscribeRequest +func (_e *MockClientCommandsServer_Expecter) ProcessSubscribe(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_ProcessSubscribe_Call { + return &MockClientCommandsServer_ProcessSubscribe_Call{Call: _e.mock.On("ProcessSubscribe", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_ProcessSubscribe_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcProcessSubscribeRequest)) *MockClientCommandsServer_ProcessSubscribe_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcProcessSubscribeRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_ProcessSubscribe_Call) Return(_a0 *pb.RpcProcessSubscribeResponse) *MockClientCommandsServer_ProcessSubscribe_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_ProcessSubscribe_Call) RunAndReturn(run func(context.Context, *pb.RpcProcessSubscribeRequest) *pb.RpcProcessSubscribeResponse) *MockClientCommandsServer_ProcessSubscribe_Call { + _c.Call.Return(run) + return _c +} + +// ProcessUnsubscribe provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) ProcessUnsubscribe(_a0 context.Context, _a1 *pb.RpcProcessUnsubscribeRequest) *pb.RpcProcessUnsubscribeResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for ProcessUnsubscribe") + } + + var r0 *pb.RpcProcessUnsubscribeResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcProcessUnsubscribeRequest) *pb.RpcProcessUnsubscribeResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcProcessUnsubscribeResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_ProcessUnsubscribe_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ProcessUnsubscribe' +type MockClientCommandsServer_ProcessUnsubscribe_Call struct { + *mock.Call +} + +// ProcessUnsubscribe is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcProcessUnsubscribeRequest +func (_e *MockClientCommandsServer_Expecter) ProcessUnsubscribe(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_ProcessUnsubscribe_Call { + return &MockClientCommandsServer_ProcessUnsubscribe_Call{Call: _e.mock.On("ProcessUnsubscribe", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_ProcessUnsubscribe_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcProcessUnsubscribeRequest)) *MockClientCommandsServer_ProcessUnsubscribe_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcProcessUnsubscribeRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_ProcessUnsubscribe_Call) Return(_a0 *pb.RpcProcessUnsubscribeResponse) *MockClientCommandsServer_ProcessUnsubscribe_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_ProcessUnsubscribe_Call) RunAndReturn(run func(context.Context, *pb.RpcProcessUnsubscribeRequest) *pb.RpcProcessUnsubscribeResponse) *MockClientCommandsServer_ProcessUnsubscribe_Call { + _c.Call.Return(run) + return _c +} + +// RelationListRemoveOption provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) RelationListRemoveOption(_a0 context.Context, _a1 *pb.RpcRelationListRemoveOptionRequest) *pb.RpcRelationListRemoveOptionResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for RelationListRemoveOption") + } + + var r0 *pb.RpcRelationListRemoveOptionResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcRelationListRemoveOptionRequest) *pb.RpcRelationListRemoveOptionResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcRelationListRemoveOptionResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_RelationListRemoveOption_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'RelationListRemoveOption' +type MockClientCommandsServer_RelationListRemoveOption_Call struct { + *mock.Call +} + +// RelationListRemoveOption is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcRelationListRemoveOptionRequest +func (_e *MockClientCommandsServer_Expecter) RelationListRemoveOption(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_RelationListRemoveOption_Call { + return &MockClientCommandsServer_RelationListRemoveOption_Call{Call: _e.mock.On("RelationListRemoveOption", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_RelationListRemoveOption_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcRelationListRemoveOptionRequest)) *MockClientCommandsServer_RelationListRemoveOption_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcRelationListRemoveOptionRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_RelationListRemoveOption_Call) Return(_a0 *pb.RpcRelationListRemoveOptionResponse) *MockClientCommandsServer_RelationListRemoveOption_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_RelationListRemoveOption_Call) RunAndReturn(run func(context.Context, *pb.RpcRelationListRemoveOptionRequest) *pb.RpcRelationListRemoveOptionResponse) *MockClientCommandsServer_RelationListRemoveOption_Call { + _c.Call.Return(run) + return _c +} + +// RelationListWithValue provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) RelationListWithValue(_a0 context.Context, _a1 *pb.RpcRelationListWithValueRequest) *pb.RpcRelationListWithValueResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for RelationListWithValue") + } + + var r0 *pb.RpcRelationListWithValueResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcRelationListWithValueRequest) *pb.RpcRelationListWithValueResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcRelationListWithValueResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_RelationListWithValue_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'RelationListWithValue' +type MockClientCommandsServer_RelationListWithValue_Call struct { + *mock.Call +} + +// RelationListWithValue is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcRelationListWithValueRequest +func (_e *MockClientCommandsServer_Expecter) RelationListWithValue(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_RelationListWithValue_Call { + return &MockClientCommandsServer_RelationListWithValue_Call{Call: _e.mock.On("RelationListWithValue", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_RelationListWithValue_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcRelationListWithValueRequest)) *MockClientCommandsServer_RelationListWithValue_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcRelationListWithValueRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_RelationListWithValue_Call) Return(_a0 *pb.RpcRelationListWithValueResponse) *MockClientCommandsServer_RelationListWithValue_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_RelationListWithValue_Call) RunAndReturn(run func(context.Context, *pb.RpcRelationListWithValueRequest) *pb.RpcRelationListWithValueResponse) *MockClientCommandsServer_RelationListWithValue_Call { + _c.Call.Return(run) + return _c +} + +// RelationOptions provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) RelationOptions(_a0 context.Context, _a1 *pb.RpcRelationOptionsRequest) *pb.RpcRelationOptionsResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for RelationOptions") + } + + var r0 *pb.RpcRelationOptionsResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcRelationOptionsRequest) *pb.RpcRelationOptionsResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcRelationOptionsResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_RelationOptions_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'RelationOptions' +type MockClientCommandsServer_RelationOptions_Call struct { + *mock.Call +} + +// RelationOptions is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcRelationOptionsRequest +func (_e *MockClientCommandsServer_Expecter) RelationOptions(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_RelationOptions_Call { + return &MockClientCommandsServer_RelationOptions_Call{Call: _e.mock.On("RelationOptions", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_RelationOptions_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcRelationOptionsRequest)) *MockClientCommandsServer_RelationOptions_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcRelationOptionsRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_RelationOptions_Call) Return(_a0 *pb.RpcRelationOptionsResponse) *MockClientCommandsServer_RelationOptions_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_RelationOptions_Call) RunAndReturn(run func(context.Context, *pb.RpcRelationOptionsRequest) *pb.RpcRelationOptionsResponse) *MockClientCommandsServer_RelationOptions_Call { + _c.Call.Return(run) + return _c +} + +// SpaceDelete provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) SpaceDelete(_a0 context.Context, _a1 *pb.RpcSpaceDeleteRequest) *pb.RpcSpaceDeleteResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for SpaceDelete") + } + + var r0 *pb.RpcSpaceDeleteResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcSpaceDeleteRequest) *pb.RpcSpaceDeleteResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcSpaceDeleteResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_SpaceDelete_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'SpaceDelete' +type MockClientCommandsServer_SpaceDelete_Call struct { + *mock.Call +} + +// SpaceDelete is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcSpaceDeleteRequest +func (_e *MockClientCommandsServer_Expecter) SpaceDelete(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_SpaceDelete_Call { + return &MockClientCommandsServer_SpaceDelete_Call{Call: _e.mock.On("SpaceDelete", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_SpaceDelete_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcSpaceDeleteRequest)) *MockClientCommandsServer_SpaceDelete_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcSpaceDeleteRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_SpaceDelete_Call) Return(_a0 *pb.RpcSpaceDeleteResponse) *MockClientCommandsServer_SpaceDelete_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_SpaceDelete_Call) RunAndReturn(run func(context.Context, *pb.RpcSpaceDeleteRequest) *pb.RpcSpaceDeleteResponse) *MockClientCommandsServer_SpaceDelete_Call { + _c.Call.Return(run) + return _c +} + +// SpaceInviteGenerate provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) SpaceInviteGenerate(_a0 context.Context, _a1 *pb.RpcSpaceInviteGenerateRequest) *pb.RpcSpaceInviteGenerateResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for SpaceInviteGenerate") + } + + var r0 *pb.RpcSpaceInviteGenerateResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcSpaceInviteGenerateRequest) *pb.RpcSpaceInviteGenerateResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcSpaceInviteGenerateResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_SpaceInviteGenerate_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'SpaceInviteGenerate' +type MockClientCommandsServer_SpaceInviteGenerate_Call struct { + *mock.Call +} + +// SpaceInviteGenerate is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcSpaceInviteGenerateRequest +func (_e *MockClientCommandsServer_Expecter) SpaceInviteGenerate(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_SpaceInviteGenerate_Call { + return &MockClientCommandsServer_SpaceInviteGenerate_Call{Call: _e.mock.On("SpaceInviteGenerate", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_SpaceInviteGenerate_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcSpaceInviteGenerateRequest)) *MockClientCommandsServer_SpaceInviteGenerate_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcSpaceInviteGenerateRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_SpaceInviteGenerate_Call) Return(_a0 *pb.RpcSpaceInviteGenerateResponse) *MockClientCommandsServer_SpaceInviteGenerate_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_SpaceInviteGenerate_Call) RunAndReturn(run func(context.Context, *pb.RpcSpaceInviteGenerateRequest) *pb.RpcSpaceInviteGenerateResponse) *MockClientCommandsServer_SpaceInviteGenerate_Call { + _c.Call.Return(run) + return _c +} + +// SpaceInviteGetCurrent provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) SpaceInviteGetCurrent(_a0 context.Context, _a1 *pb.RpcSpaceInviteGetCurrentRequest) *pb.RpcSpaceInviteGetCurrentResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for SpaceInviteGetCurrent") + } + + var r0 *pb.RpcSpaceInviteGetCurrentResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcSpaceInviteGetCurrentRequest) *pb.RpcSpaceInviteGetCurrentResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcSpaceInviteGetCurrentResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_SpaceInviteGetCurrent_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'SpaceInviteGetCurrent' +type MockClientCommandsServer_SpaceInviteGetCurrent_Call struct { + *mock.Call +} + +// SpaceInviteGetCurrent is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcSpaceInviteGetCurrentRequest +func (_e *MockClientCommandsServer_Expecter) SpaceInviteGetCurrent(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_SpaceInviteGetCurrent_Call { + return &MockClientCommandsServer_SpaceInviteGetCurrent_Call{Call: _e.mock.On("SpaceInviteGetCurrent", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_SpaceInviteGetCurrent_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcSpaceInviteGetCurrentRequest)) *MockClientCommandsServer_SpaceInviteGetCurrent_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcSpaceInviteGetCurrentRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_SpaceInviteGetCurrent_Call) Return(_a0 *pb.RpcSpaceInviteGetCurrentResponse) *MockClientCommandsServer_SpaceInviteGetCurrent_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_SpaceInviteGetCurrent_Call) RunAndReturn(run func(context.Context, *pb.RpcSpaceInviteGetCurrentRequest) *pb.RpcSpaceInviteGetCurrentResponse) *MockClientCommandsServer_SpaceInviteGetCurrent_Call { + _c.Call.Return(run) + return _c +} + +// SpaceInviteRevoke provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) SpaceInviteRevoke(_a0 context.Context, _a1 *pb.RpcSpaceInviteRevokeRequest) *pb.RpcSpaceInviteRevokeResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for SpaceInviteRevoke") + } + + var r0 *pb.RpcSpaceInviteRevokeResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcSpaceInviteRevokeRequest) *pb.RpcSpaceInviteRevokeResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcSpaceInviteRevokeResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_SpaceInviteRevoke_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'SpaceInviteRevoke' +type MockClientCommandsServer_SpaceInviteRevoke_Call struct { + *mock.Call +} + +// SpaceInviteRevoke is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcSpaceInviteRevokeRequest +func (_e *MockClientCommandsServer_Expecter) SpaceInviteRevoke(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_SpaceInviteRevoke_Call { + return &MockClientCommandsServer_SpaceInviteRevoke_Call{Call: _e.mock.On("SpaceInviteRevoke", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_SpaceInviteRevoke_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcSpaceInviteRevokeRequest)) *MockClientCommandsServer_SpaceInviteRevoke_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcSpaceInviteRevokeRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_SpaceInviteRevoke_Call) Return(_a0 *pb.RpcSpaceInviteRevokeResponse) *MockClientCommandsServer_SpaceInviteRevoke_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_SpaceInviteRevoke_Call) RunAndReturn(run func(context.Context, *pb.RpcSpaceInviteRevokeRequest) *pb.RpcSpaceInviteRevokeResponse) *MockClientCommandsServer_SpaceInviteRevoke_Call { + _c.Call.Return(run) + return _c +} + +// SpaceInviteView provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) SpaceInviteView(_a0 context.Context, _a1 *pb.RpcSpaceInviteViewRequest) *pb.RpcSpaceInviteViewResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for SpaceInviteView") + } + + var r0 *pb.RpcSpaceInviteViewResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcSpaceInviteViewRequest) *pb.RpcSpaceInviteViewResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcSpaceInviteViewResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_SpaceInviteView_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'SpaceInviteView' +type MockClientCommandsServer_SpaceInviteView_Call struct { + *mock.Call +} + +// SpaceInviteView is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcSpaceInviteViewRequest +func (_e *MockClientCommandsServer_Expecter) SpaceInviteView(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_SpaceInviteView_Call { + return &MockClientCommandsServer_SpaceInviteView_Call{Call: _e.mock.On("SpaceInviteView", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_SpaceInviteView_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcSpaceInviteViewRequest)) *MockClientCommandsServer_SpaceInviteView_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcSpaceInviteViewRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_SpaceInviteView_Call) Return(_a0 *pb.RpcSpaceInviteViewResponse) *MockClientCommandsServer_SpaceInviteView_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_SpaceInviteView_Call) RunAndReturn(run func(context.Context, *pb.RpcSpaceInviteViewRequest) *pb.RpcSpaceInviteViewResponse) *MockClientCommandsServer_SpaceInviteView_Call { + _c.Call.Return(run) + return _c +} + +// SpaceJoin provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) SpaceJoin(_a0 context.Context, _a1 *pb.RpcSpaceJoinRequest) *pb.RpcSpaceJoinResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for SpaceJoin") + } + + var r0 *pb.RpcSpaceJoinResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcSpaceJoinRequest) *pb.RpcSpaceJoinResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcSpaceJoinResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_SpaceJoin_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'SpaceJoin' +type MockClientCommandsServer_SpaceJoin_Call struct { + *mock.Call +} + +// SpaceJoin is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcSpaceJoinRequest +func (_e *MockClientCommandsServer_Expecter) SpaceJoin(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_SpaceJoin_Call { + return &MockClientCommandsServer_SpaceJoin_Call{Call: _e.mock.On("SpaceJoin", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_SpaceJoin_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcSpaceJoinRequest)) *MockClientCommandsServer_SpaceJoin_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcSpaceJoinRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_SpaceJoin_Call) Return(_a0 *pb.RpcSpaceJoinResponse) *MockClientCommandsServer_SpaceJoin_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_SpaceJoin_Call) RunAndReturn(run func(context.Context, *pb.RpcSpaceJoinRequest) *pb.RpcSpaceJoinResponse) *MockClientCommandsServer_SpaceJoin_Call { + _c.Call.Return(run) + return _c +} + +// SpaceJoinCancel provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) SpaceJoinCancel(_a0 context.Context, _a1 *pb.RpcSpaceJoinCancelRequest) *pb.RpcSpaceJoinCancelResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for SpaceJoinCancel") + } + + var r0 *pb.RpcSpaceJoinCancelResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcSpaceJoinCancelRequest) *pb.RpcSpaceJoinCancelResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcSpaceJoinCancelResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_SpaceJoinCancel_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'SpaceJoinCancel' +type MockClientCommandsServer_SpaceJoinCancel_Call struct { + *mock.Call +} + +// SpaceJoinCancel is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcSpaceJoinCancelRequest +func (_e *MockClientCommandsServer_Expecter) SpaceJoinCancel(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_SpaceJoinCancel_Call { + return &MockClientCommandsServer_SpaceJoinCancel_Call{Call: _e.mock.On("SpaceJoinCancel", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_SpaceJoinCancel_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcSpaceJoinCancelRequest)) *MockClientCommandsServer_SpaceJoinCancel_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcSpaceJoinCancelRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_SpaceJoinCancel_Call) Return(_a0 *pb.RpcSpaceJoinCancelResponse) *MockClientCommandsServer_SpaceJoinCancel_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_SpaceJoinCancel_Call) RunAndReturn(run func(context.Context, *pb.RpcSpaceJoinCancelRequest) *pb.RpcSpaceJoinCancelResponse) *MockClientCommandsServer_SpaceJoinCancel_Call { + _c.Call.Return(run) + return _c +} + +// SpaceLeaveApprove provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) SpaceLeaveApprove(_a0 context.Context, _a1 *pb.RpcSpaceLeaveApproveRequest) *pb.RpcSpaceLeaveApproveResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for SpaceLeaveApprove") + } + + var r0 *pb.RpcSpaceLeaveApproveResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcSpaceLeaveApproveRequest) *pb.RpcSpaceLeaveApproveResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcSpaceLeaveApproveResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_SpaceLeaveApprove_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'SpaceLeaveApprove' +type MockClientCommandsServer_SpaceLeaveApprove_Call struct { + *mock.Call +} + +// SpaceLeaveApprove is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcSpaceLeaveApproveRequest +func (_e *MockClientCommandsServer_Expecter) SpaceLeaveApprove(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_SpaceLeaveApprove_Call { + return &MockClientCommandsServer_SpaceLeaveApprove_Call{Call: _e.mock.On("SpaceLeaveApprove", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_SpaceLeaveApprove_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcSpaceLeaveApproveRequest)) *MockClientCommandsServer_SpaceLeaveApprove_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcSpaceLeaveApproveRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_SpaceLeaveApprove_Call) Return(_a0 *pb.RpcSpaceLeaveApproveResponse) *MockClientCommandsServer_SpaceLeaveApprove_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_SpaceLeaveApprove_Call) RunAndReturn(run func(context.Context, *pb.RpcSpaceLeaveApproveRequest) *pb.RpcSpaceLeaveApproveResponse) *MockClientCommandsServer_SpaceLeaveApprove_Call { + _c.Call.Return(run) + return _c +} + +// SpaceMakeShareable provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) SpaceMakeShareable(_a0 context.Context, _a1 *pb.RpcSpaceMakeShareableRequest) *pb.RpcSpaceMakeShareableResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for SpaceMakeShareable") + } + + var r0 *pb.RpcSpaceMakeShareableResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcSpaceMakeShareableRequest) *pb.RpcSpaceMakeShareableResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcSpaceMakeShareableResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_SpaceMakeShareable_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'SpaceMakeShareable' +type MockClientCommandsServer_SpaceMakeShareable_Call struct { + *mock.Call +} + +// SpaceMakeShareable is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcSpaceMakeShareableRequest +func (_e *MockClientCommandsServer_Expecter) SpaceMakeShareable(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_SpaceMakeShareable_Call { + return &MockClientCommandsServer_SpaceMakeShareable_Call{Call: _e.mock.On("SpaceMakeShareable", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_SpaceMakeShareable_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcSpaceMakeShareableRequest)) *MockClientCommandsServer_SpaceMakeShareable_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcSpaceMakeShareableRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_SpaceMakeShareable_Call) Return(_a0 *pb.RpcSpaceMakeShareableResponse) *MockClientCommandsServer_SpaceMakeShareable_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_SpaceMakeShareable_Call) RunAndReturn(run func(context.Context, *pb.RpcSpaceMakeShareableRequest) *pb.RpcSpaceMakeShareableResponse) *MockClientCommandsServer_SpaceMakeShareable_Call { + _c.Call.Return(run) + return _c +} + +// SpaceParticipantPermissionsChange provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) SpaceParticipantPermissionsChange(_a0 context.Context, _a1 *pb.RpcSpaceParticipantPermissionsChangeRequest) *pb.RpcSpaceParticipantPermissionsChangeResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for SpaceParticipantPermissionsChange") + } + + var r0 *pb.RpcSpaceParticipantPermissionsChangeResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcSpaceParticipantPermissionsChangeRequest) *pb.RpcSpaceParticipantPermissionsChangeResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcSpaceParticipantPermissionsChangeResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_SpaceParticipantPermissionsChange_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'SpaceParticipantPermissionsChange' +type MockClientCommandsServer_SpaceParticipantPermissionsChange_Call struct { + *mock.Call +} + +// SpaceParticipantPermissionsChange is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcSpaceParticipantPermissionsChangeRequest +func (_e *MockClientCommandsServer_Expecter) SpaceParticipantPermissionsChange(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_SpaceParticipantPermissionsChange_Call { + return &MockClientCommandsServer_SpaceParticipantPermissionsChange_Call{Call: _e.mock.On("SpaceParticipantPermissionsChange", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_SpaceParticipantPermissionsChange_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcSpaceParticipantPermissionsChangeRequest)) *MockClientCommandsServer_SpaceParticipantPermissionsChange_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcSpaceParticipantPermissionsChangeRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_SpaceParticipantPermissionsChange_Call) Return(_a0 *pb.RpcSpaceParticipantPermissionsChangeResponse) *MockClientCommandsServer_SpaceParticipantPermissionsChange_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_SpaceParticipantPermissionsChange_Call) RunAndReturn(run func(context.Context, *pb.RpcSpaceParticipantPermissionsChangeRequest) *pb.RpcSpaceParticipantPermissionsChangeResponse) *MockClientCommandsServer_SpaceParticipantPermissionsChange_Call { + _c.Call.Return(run) + return _c +} + +// SpaceParticipantRemove provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) SpaceParticipantRemove(_a0 context.Context, _a1 *pb.RpcSpaceParticipantRemoveRequest) *pb.RpcSpaceParticipantRemoveResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for SpaceParticipantRemove") + } + + var r0 *pb.RpcSpaceParticipantRemoveResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcSpaceParticipantRemoveRequest) *pb.RpcSpaceParticipantRemoveResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcSpaceParticipantRemoveResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_SpaceParticipantRemove_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'SpaceParticipantRemove' +type MockClientCommandsServer_SpaceParticipantRemove_Call struct { + *mock.Call +} + +// SpaceParticipantRemove is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcSpaceParticipantRemoveRequest +func (_e *MockClientCommandsServer_Expecter) SpaceParticipantRemove(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_SpaceParticipantRemove_Call { + return &MockClientCommandsServer_SpaceParticipantRemove_Call{Call: _e.mock.On("SpaceParticipantRemove", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_SpaceParticipantRemove_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcSpaceParticipantRemoveRequest)) *MockClientCommandsServer_SpaceParticipantRemove_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcSpaceParticipantRemoveRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_SpaceParticipantRemove_Call) Return(_a0 *pb.RpcSpaceParticipantRemoveResponse) *MockClientCommandsServer_SpaceParticipantRemove_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_SpaceParticipantRemove_Call) RunAndReturn(run func(context.Context, *pb.RpcSpaceParticipantRemoveRequest) *pb.RpcSpaceParticipantRemoveResponse) *MockClientCommandsServer_SpaceParticipantRemove_Call { + _c.Call.Return(run) + return _c +} + +// SpaceRequestApprove provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) SpaceRequestApprove(_a0 context.Context, _a1 *pb.RpcSpaceRequestApproveRequest) *pb.RpcSpaceRequestApproveResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for SpaceRequestApprove") + } + + var r0 *pb.RpcSpaceRequestApproveResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcSpaceRequestApproveRequest) *pb.RpcSpaceRequestApproveResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcSpaceRequestApproveResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_SpaceRequestApprove_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'SpaceRequestApprove' +type MockClientCommandsServer_SpaceRequestApprove_Call struct { + *mock.Call +} + +// SpaceRequestApprove is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcSpaceRequestApproveRequest +func (_e *MockClientCommandsServer_Expecter) SpaceRequestApprove(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_SpaceRequestApprove_Call { + return &MockClientCommandsServer_SpaceRequestApprove_Call{Call: _e.mock.On("SpaceRequestApprove", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_SpaceRequestApprove_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcSpaceRequestApproveRequest)) *MockClientCommandsServer_SpaceRequestApprove_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcSpaceRequestApproveRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_SpaceRequestApprove_Call) Return(_a0 *pb.RpcSpaceRequestApproveResponse) *MockClientCommandsServer_SpaceRequestApprove_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_SpaceRequestApprove_Call) RunAndReturn(run func(context.Context, *pb.RpcSpaceRequestApproveRequest) *pb.RpcSpaceRequestApproveResponse) *MockClientCommandsServer_SpaceRequestApprove_Call { + _c.Call.Return(run) + return _c +} + +// SpaceRequestDecline provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) SpaceRequestDecline(_a0 context.Context, _a1 *pb.RpcSpaceRequestDeclineRequest) *pb.RpcSpaceRequestDeclineResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for SpaceRequestDecline") + } + + var r0 *pb.RpcSpaceRequestDeclineResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcSpaceRequestDeclineRequest) *pb.RpcSpaceRequestDeclineResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcSpaceRequestDeclineResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_SpaceRequestDecline_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'SpaceRequestDecline' +type MockClientCommandsServer_SpaceRequestDecline_Call struct { + *mock.Call +} + +// SpaceRequestDecline is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcSpaceRequestDeclineRequest +func (_e *MockClientCommandsServer_Expecter) SpaceRequestDecline(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_SpaceRequestDecline_Call { + return &MockClientCommandsServer_SpaceRequestDecline_Call{Call: _e.mock.On("SpaceRequestDecline", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_SpaceRequestDecline_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcSpaceRequestDeclineRequest)) *MockClientCommandsServer_SpaceRequestDecline_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcSpaceRequestDeclineRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_SpaceRequestDecline_Call) Return(_a0 *pb.RpcSpaceRequestDeclineResponse) *MockClientCommandsServer_SpaceRequestDecline_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_SpaceRequestDecline_Call) RunAndReturn(run func(context.Context, *pb.RpcSpaceRequestDeclineRequest) *pb.RpcSpaceRequestDeclineResponse) *MockClientCommandsServer_SpaceRequestDecline_Call { + _c.Call.Return(run) + return _c +} + +// SpaceSetOrder provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) SpaceSetOrder(_a0 context.Context, _a1 *pb.RpcSpaceSetOrderRequest) *pb.RpcSpaceSetOrderResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for SpaceSetOrder") + } + + var r0 *pb.RpcSpaceSetOrderResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcSpaceSetOrderRequest) *pb.RpcSpaceSetOrderResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcSpaceSetOrderResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_SpaceSetOrder_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'SpaceSetOrder' +type MockClientCommandsServer_SpaceSetOrder_Call struct { + *mock.Call +} + +// SpaceSetOrder is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcSpaceSetOrderRequest +func (_e *MockClientCommandsServer_Expecter) SpaceSetOrder(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_SpaceSetOrder_Call { + return &MockClientCommandsServer_SpaceSetOrder_Call{Call: _e.mock.On("SpaceSetOrder", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_SpaceSetOrder_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcSpaceSetOrderRequest)) *MockClientCommandsServer_SpaceSetOrder_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcSpaceSetOrderRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_SpaceSetOrder_Call) Return(_a0 *pb.RpcSpaceSetOrderResponse) *MockClientCommandsServer_SpaceSetOrder_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_SpaceSetOrder_Call) RunAndReturn(run func(context.Context, *pb.RpcSpaceSetOrderRequest) *pb.RpcSpaceSetOrderResponse) *MockClientCommandsServer_SpaceSetOrder_Call { + _c.Call.Return(run) + return _c +} + +// SpaceStopSharing provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) SpaceStopSharing(_a0 context.Context, _a1 *pb.RpcSpaceStopSharingRequest) *pb.RpcSpaceStopSharingResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for SpaceStopSharing") + } + + var r0 *pb.RpcSpaceStopSharingResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcSpaceStopSharingRequest) *pb.RpcSpaceStopSharingResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcSpaceStopSharingResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_SpaceStopSharing_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'SpaceStopSharing' +type MockClientCommandsServer_SpaceStopSharing_Call struct { + *mock.Call +} + +// SpaceStopSharing is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcSpaceStopSharingRequest +func (_e *MockClientCommandsServer_Expecter) SpaceStopSharing(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_SpaceStopSharing_Call { + return &MockClientCommandsServer_SpaceStopSharing_Call{Call: _e.mock.On("SpaceStopSharing", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_SpaceStopSharing_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcSpaceStopSharingRequest)) *MockClientCommandsServer_SpaceStopSharing_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcSpaceStopSharingRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_SpaceStopSharing_Call) Return(_a0 *pb.RpcSpaceStopSharingResponse) *MockClientCommandsServer_SpaceStopSharing_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_SpaceStopSharing_Call) RunAndReturn(run func(context.Context, *pb.RpcSpaceStopSharingRequest) *pb.RpcSpaceStopSharingResponse) *MockClientCommandsServer_SpaceStopSharing_Call { + _c.Call.Return(run) + return _c +} + +// SpaceUnsetOrder provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) SpaceUnsetOrder(_a0 context.Context, _a1 *pb.RpcSpaceUnsetOrderRequest) *pb.RpcSpaceUnsetOrderResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for SpaceUnsetOrder") + } + + var r0 *pb.RpcSpaceUnsetOrderResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcSpaceUnsetOrderRequest) *pb.RpcSpaceUnsetOrderResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcSpaceUnsetOrderResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_SpaceUnsetOrder_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'SpaceUnsetOrder' +type MockClientCommandsServer_SpaceUnsetOrder_Call struct { + *mock.Call +} + +// SpaceUnsetOrder is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcSpaceUnsetOrderRequest +func (_e *MockClientCommandsServer_Expecter) SpaceUnsetOrder(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_SpaceUnsetOrder_Call { + return &MockClientCommandsServer_SpaceUnsetOrder_Call{Call: _e.mock.On("SpaceUnsetOrder", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_SpaceUnsetOrder_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcSpaceUnsetOrderRequest)) *MockClientCommandsServer_SpaceUnsetOrder_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcSpaceUnsetOrderRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_SpaceUnsetOrder_Call) Return(_a0 *pb.RpcSpaceUnsetOrderResponse) *MockClientCommandsServer_SpaceUnsetOrder_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_SpaceUnsetOrder_Call) RunAndReturn(run func(context.Context, *pb.RpcSpaceUnsetOrderRequest) *pb.RpcSpaceUnsetOrderResponse) *MockClientCommandsServer_SpaceUnsetOrder_Call { + _c.Call.Return(run) + return _c +} + +// TemplateClone provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) TemplateClone(_a0 context.Context, _a1 *pb.RpcTemplateCloneRequest) *pb.RpcTemplateCloneResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for TemplateClone") + } + + var r0 *pb.RpcTemplateCloneResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcTemplateCloneRequest) *pb.RpcTemplateCloneResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcTemplateCloneResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_TemplateClone_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'TemplateClone' +type MockClientCommandsServer_TemplateClone_Call struct { + *mock.Call +} + +// TemplateClone is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcTemplateCloneRequest +func (_e *MockClientCommandsServer_Expecter) TemplateClone(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_TemplateClone_Call { + return &MockClientCommandsServer_TemplateClone_Call{Call: _e.mock.On("TemplateClone", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_TemplateClone_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcTemplateCloneRequest)) *MockClientCommandsServer_TemplateClone_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcTemplateCloneRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_TemplateClone_Call) Return(_a0 *pb.RpcTemplateCloneResponse) *MockClientCommandsServer_TemplateClone_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_TemplateClone_Call) RunAndReturn(run func(context.Context, *pb.RpcTemplateCloneRequest) *pb.RpcTemplateCloneResponse) *MockClientCommandsServer_TemplateClone_Call { + _c.Call.Return(run) + return _c +} + +// TemplateCreateFromObject provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) TemplateCreateFromObject(_a0 context.Context, _a1 *pb.RpcTemplateCreateFromObjectRequest) *pb.RpcTemplateCreateFromObjectResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for TemplateCreateFromObject") + } + + var r0 *pb.RpcTemplateCreateFromObjectResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcTemplateCreateFromObjectRequest) *pb.RpcTemplateCreateFromObjectResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcTemplateCreateFromObjectResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_TemplateCreateFromObject_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'TemplateCreateFromObject' +type MockClientCommandsServer_TemplateCreateFromObject_Call struct { + *mock.Call +} + +// TemplateCreateFromObject is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcTemplateCreateFromObjectRequest +func (_e *MockClientCommandsServer_Expecter) TemplateCreateFromObject(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_TemplateCreateFromObject_Call { + return &MockClientCommandsServer_TemplateCreateFromObject_Call{Call: _e.mock.On("TemplateCreateFromObject", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_TemplateCreateFromObject_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcTemplateCreateFromObjectRequest)) *MockClientCommandsServer_TemplateCreateFromObject_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcTemplateCreateFromObjectRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_TemplateCreateFromObject_Call) Return(_a0 *pb.RpcTemplateCreateFromObjectResponse) *MockClientCommandsServer_TemplateCreateFromObject_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_TemplateCreateFromObject_Call) RunAndReturn(run func(context.Context, *pb.RpcTemplateCreateFromObjectRequest) *pb.RpcTemplateCreateFromObjectResponse) *MockClientCommandsServer_TemplateCreateFromObject_Call { + _c.Call.Return(run) + return _c +} + +// TemplateExportAll provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) TemplateExportAll(_a0 context.Context, _a1 *pb.RpcTemplateExportAllRequest) *pb.RpcTemplateExportAllResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for TemplateExportAll") + } + + var r0 *pb.RpcTemplateExportAllResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcTemplateExportAllRequest) *pb.RpcTemplateExportAllResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcTemplateExportAllResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_TemplateExportAll_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'TemplateExportAll' +type MockClientCommandsServer_TemplateExportAll_Call struct { + *mock.Call +} + +// TemplateExportAll is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcTemplateExportAllRequest +func (_e *MockClientCommandsServer_Expecter) TemplateExportAll(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_TemplateExportAll_Call { + return &MockClientCommandsServer_TemplateExportAll_Call{Call: _e.mock.On("TemplateExportAll", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_TemplateExportAll_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcTemplateExportAllRequest)) *MockClientCommandsServer_TemplateExportAll_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcTemplateExportAllRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_TemplateExportAll_Call) Return(_a0 *pb.RpcTemplateExportAllResponse) *MockClientCommandsServer_TemplateExportAll_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_TemplateExportAll_Call) RunAndReturn(run func(context.Context, *pb.RpcTemplateExportAllRequest) *pb.RpcTemplateExportAllResponse) *MockClientCommandsServer_TemplateExportAll_Call { + _c.Call.Return(run) + return _c +} + +// UnsplashDownload provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) UnsplashDownload(_a0 context.Context, _a1 *pb.RpcUnsplashDownloadRequest) *pb.RpcUnsplashDownloadResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for UnsplashDownload") + } + + var r0 *pb.RpcUnsplashDownloadResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcUnsplashDownloadRequest) *pb.RpcUnsplashDownloadResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcUnsplashDownloadResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_UnsplashDownload_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'UnsplashDownload' +type MockClientCommandsServer_UnsplashDownload_Call struct { + *mock.Call +} + +// UnsplashDownload is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcUnsplashDownloadRequest +func (_e *MockClientCommandsServer_Expecter) UnsplashDownload(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_UnsplashDownload_Call { + return &MockClientCommandsServer_UnsplashDownload_Call{Call: _e.mock.On("UnsplashDownload", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_UnsplashDownload_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcUnsplashDownloadRequest)) *MockClientCommandsServer_UnsplashDownload_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcUnsplashDownloadRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_UnsplashDownload_Call) Return(_a0 *pb.RpcUnsplashDownloadResponse) *MockClientCommandsServer_UnsplashDownload_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_UnsplashDownload_Call) RunAndReturn(run func(context.Context, *pb.RpcUnsplashDownloadRequest) *pb.RpcUnsplashDownloadResponse) *MockClientCommandsServer_UnsplashDownload_Call { + _c.Call.Return(run) + return _c +} + +// UnsplashSearch provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) UnsplashSearch(_a0 context.Context, _a1 *pb.RpcUnsplashSearchRequest) *pb.RpcUnsplashSearchResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for UnsplashSearch") + } + + var r0 *pb.RpcUnsplashSearchResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcUnsplashSearchRequest) *pb.RpcUnsplashSearchResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcUnsplashSearchResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_UnsplashSearch_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'UnsplashSearch' +type MockClientCommandsServer_UnsplashSearch_Call struct { + *mock.Call +} + +// UnsplashSearch is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcUnsplashSearchRequest +func (_e *MockClientCommandsServer_Expecter) UnsplashSearch(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_UnsplashSearch_Call { + return &MockClientCommandsServer_UnsplashSearch_Call{Call: _e.mock.On("UnsplashSearch", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_UnsplashSearch_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcUnsplashSearchRequest)) *MockClientCommandsServer_UnsplashSearch_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcUnsplashSearchRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_UnsplashSearch_Call) Return(_a0 *pb.RpcUnsplashSearchResponse) *MockClientCommandsServer_UnsplashSearch_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_UnsplashSearch_Call) RunAndReturn(run func(context.Context, *pb.RpcUnsplashSearchRequest) *pb.RpcUnsplashSearchResponse) *MockClientCommandsServer_UnsplashSearch_Call { + _c.Call.Return(run) + return _c +} + +// WalletCloseSession provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) WalletCloseSession(_a0 context.Context, _a1 *pb.RpcWalletCloseSessionRequest) *pb.RpcWalletCloseSessionResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for WalletCloseSession") + } + + var r0 *pb.RpcWalletCloseSessionResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcWalletCloseSessionRequest) *pb.RpcWalletCloseSessionResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcWalletCloseSessionResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_WalletCloseSession_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'WalletCloseSession' +type MockClientCommandsServer_WalletCloseSession_Call struct { + *mock.Call +} + +// WalletCloseSession is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcWalletCloseSessionRequest +func (_e *MockClientCommandsServer_Expecter) WalletCloseSession(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_WalletCloseSession_Call { + return &MockClientCommandsServer_WalletCloseSession_Call{Call: _e.mock.On("WalletCloseSession", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_WalletCloseSession_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcWalletCloseSessionRequest)) *MockClientCommandsServer_WalletCloseSession_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcWalletCloseSessionRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_WalletCloseSession_Call) Return(_a0 *pb.RpcWalletCloseSessionResponse) *MockClientCommandsServer_WalletCloseSession_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_WalletCloseSession_Call) RunAndReturn(run func(context.Context, *pb.RpcWalletCloseSessionRequest) *pb.RpcWalletCloseSessionResponse) *MockClientCommandsServer_WalletCloseSession_Call { + _c.Call.Return(run) + return _c +} + +// WalletConvert provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) WalletConvert(_a0 context.Context, _a1 *pb.RpcWalletConvertRequest) *pb.RpcWalletConvertResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for WalletConvert") + } + + var r0 *pb.RpcWalletConvertResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcWalletConvertRequest) *pb.RpcWalletConvertResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcWalletConvertResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_WalletConvert_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'WalletConvert' +type MockClientCommandsServer_WalletConvert_Call struct { + *mock.Call +} + +// WalletConvert is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcWalletConvertRequest +func (_e *MockClientCommandsServer_Expecter) WalletConvert(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_WalletConvert_Call { + return &MockClientCommandsServer_WalletConvert_Call{Call: _e.mock.On("WalletConvert", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_WalletConvert_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcWalletConvertRequest)) *MockClientCommandsServer_WalletConvert_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcWalletConvertRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_WalletConvert_Call) Return(_a0 *pb.RpcWalletConvertResponse) *MockClientCommandsServer_WalletConvert_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_WalletConvert_Call) RunAndReturn(run func(context.Context, *pb.RpcWalletConvertRequest) *pb.RpcWalletConvertResponse) *MockClientCommandsServer_WalletConvert_Call { + _c.Call.Return(run) + return _c +} + +// WalletCreate provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) WalletCreate(_a0 context.Context, _a1 *pb.RpcWalletCreateRequest) *pb.RpcWalletCreateResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for WalletCreate") + } + + var r0 *pb.RpcWalletCreateResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcWalletCreateRequest) *pb.RpcWalletCreateResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcWalletCreateResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_WalletCreate_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'WalletCreate' +type MockClientCommandsServer_WalletCreate_Call struct { + *mock.Call +} + +// WalletCreate is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcWalletCreateRequest +func (_e *MockClientCommandsServer_Expecter) WalletCreate(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_WalletCreate_Call { + return &MockClientCommandsServer_WalletCreate_Call{Call: _e.mock.On("WalletCreate", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_WalletCreate_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcWalletCreateRequest)) *MockClientCommandsServer_WalletCreate_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcWalletCreateRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_WalletCreate_Call) Return(_a0 *pb.RpcWalletCreateResponse) *MockClientCommandsServer_WalletCreate_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_WalletCreate_Call) RunAndReturn(run func(context.Context, *pb.RpcWalletCreateRequest) *pb.RpcWalletCreateResponse) *MockClientCommandsServer_WalletCreate_Call { + _c.Call.Return(run) + return _c +} + +// WalletCreateSession provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) WalletCreateSession(_a0 context.Context, _a1 *pb.RpcWalletCreateSessionRequest) *pb.RpcWalletCreateSessionResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for WalletCreateSession") + } + + var r0 *pb.RpcWalletCreateSessionResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcWalletCreateSessionRequest) *pb.RpcWalletCreateSessionResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcWalletCreateSessionResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_WalletCreateSession_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'WalletCreateSession' +type MockClientCommandsServer_WalletCreateSession_Call struct { + *mock.Call +} + +// WalletCreateSession is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcWalletCreateSessionRequest +func (_e *MockClientCommandsServer_Expecter) WalletCreateSession(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_WalletCreateSession_Call { + return &MockClientCommandsServer_WalletCreateSession_Call{Call: _e.mock.On("WalletCreateSession", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_WalletCreateSession_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcWalletCreateSessionRequest)) *MockClientCommandsServer_WalletCreateSession_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcWalletCreateSessionRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_WalletCreateSession_Call) Return(_a0 *pb.RpcWalletCreateSessionResponse) *MockClientCommandsServer_WalletCreateSession_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_WalletCreateSession_Call) RunAndReturn(run func(context.Context, *pb.RpcWalletCreateSessionRequest) *pb.RpcWalletCreateSessionResponse) *MockClientCommandsServer_WalletCreateSession_Call { + _c.Call.Return(run) + return _c +} + +// WalletRecover provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) WalletRecover(_a0 context.Context, _a1 *pb.RpcWalletRecoverRequest) *pb.RpcWalletRecoverResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for WalletRecover") + } + + var r0 *pb.RpcWalletRecoverResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcWalletRecoverRequest) *pb.RpcWalletRecoverResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcWalletRecoverResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_WalletRecover_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'WalletRecover' +type MockClientCommandsServer_WalletRecover_Call struct { + *mock.Call +} + +// WalletRecover is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcWalletRecoverRequest +func (_e *MockClientCommandsServer_Expecter) WalletRecover(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_WalletRecover_Call { + return &MockClientCommandsServer_WalletRecover_Call{Call: _e.mock.On("WalletRecover", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_WalletRecover_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcWalletRecoverRequest)) *MockClientCommandsServer_WalletRecover_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcWalletRecoverRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_WalletRecover_Call) Return(_a0 *pb.RpcWalletRecoverResponse) *MockClientCommandsServer_WalletRecover_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_WalletRecover_Call) RunAndReturn(run func(context.Context, *pb.RpcWalletRecoverRequest) *pb.RpcWalletRecoverResponse) *MockClientCommandsServer_WalletRecover_Call { + _c.Call.Return(run) + return _c +} + +// WorkspaceCreate provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) WorkspaceCreate(_a0 context.Context, _a1 *pb.RpcWorkspaceCreateRequest) *pb.RpcWorkspaceCreateResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for WorkspaceCreate") + } + + var r0 *pb.RpcWorkspaceCreateResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcWorkspaceCreateRequest) *pb.RpcWorkspaceCreateResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcWorkspaceCreateResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_WorkspaceCreate_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'WorkspaceCreate' +type MockClientCommandsServer_WorkspaceCreate_Call struct { + *mock.Call +} + +// WorkspaceCreate is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcWorkspaceCreateRequest +func (_e *MockClientCommandsServer_Expecter) WorkspaceCreate(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_WorkspaceCreate_Call { + return &MockClientCommandsServer_WorkspaceCreate_Call{Call: _e.mock.On("WorkspaceCreate", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_WorkspaceCreate_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcWorkspaceCreateRequest)) *MockClientCommandsServer_WorkspaceCreate_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcWorkspaceCreateRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_WorkspaceCreate_Call) Return(_a0 *pb.RpcWorkspaceCreateResponse) *MockClientCommandsServer_WorkspaceCreate_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_WorkspaceCreate_Call) RunAndReturn(run func(context.Context, *pb.RpcWorkspaceCreateRequest) *pb.RpcWorkspaceCreateResponse) *MockClientCommandsServer_WorkspaceCreate_Call { + _c.Call.Return(run) + return _c +} + +// WorkspaceExport provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) WorkspaceExport(_a0 context.Context, _a1 *pb.RpcWorkspaceExportRequest) *pb.RpcWorkspaceExportResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for WorkspaceExport") + } + + var r0 *pb.RpcWorkspaceExportResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcWorkspaceExportRequest) *pb.RpcWorkspaceExportResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcWorkspaceExportResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_WorkspaceExport_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'WorkspaceExport' +type MockClientCommandsServer_WorkspaceExport_Call struct { + *mock.Call +} + +// WorkspaceExport is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcWorkspaceExportRequest +func (_e *MockClientCommandsServer_Expecter) WorkspaceExport(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_WorkspaceExport_Call { + return &MockClientCommandsServer_WorkspaceExport_Call{Call: _e.mock.On("WorkspaceExport", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_WorkspaceExport_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcWorkspaceExportRequest)) *MockClientCommandsServer_WorkspaceExport_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcWorkspaceExportRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_WorkspaceExport_Call) Return(_a0 *pb.RpcWorkspaceExportResponse) *MockClientCommandsServer_WorkspaceExport_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_WorkspaceExport_Call) RunAndReturn(run func(context.Context, *pb.RpcWorkspaceExportRequest) *pb.RpcWorkspaceExportResponse) *MockClientCommandsServer_WorkspaceExport_Call { + _c.Call.Return(run) + return _c +} + +// WorkspaceGetAll provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) WorkspaceGetAll(_a0 context.Context, _a1 *pb.RpcWorkspaceGetAllRequest) *pb.RpcWorkspaceGetAllResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for WorkspaceGetAll") + } + + var r0 *pb.RpcWorkspaceGetAllResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcWorkspaceGetAllRequest) *pb.RpcWorkspaceGetAllResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcWorkspaceGetAllResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_WorkspaceGetAll_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'WorkspaceGetAll' +type MockClientCommandsServer_WorkspaceGetAll_Call struct { + *mock.Call +} + +// WorkspaceGetAll is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcWorkspaceGetAllRequest +func (_e *MockClientCommandsServer_Expecter) WorkspaceGetAll(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_WorkspaceGetAll_Call { + return &MockClientCommandsServer_WorkspaceGetAll_Call{Call: _e.mock.On("WorkspaceGetAll", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_WorkspaceGetAll_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcWorkspaceGetAllRequest)) *MockClientCommandsServer_WorkspaceGetAll_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcWorkspaceGetAllRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_WorkspaceGetAll_Call) Return(_a0 *pb.RpcWorkspaceGetAllResponse) *MockClientCommandsServer_WorkspaceGetAll_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_WorkspaceGetAll_Call) RunAndReturn(run func(context.Context, *pb.RpcWorkspaceGetAllRequest) *pb.RpcWorkspaceGetAllResponse) *MockClientCommandsServer_WorkspaceGetAll_Call { + _c.Call.Return(run) + return _c +} + +// WorkspaceGetCurrent provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) WorkspaceGetCurrent(_a0 context.Context, _a1 *pb.RpcWorkspaceGetCurrentRequest) *pb.RpcWorkspaceGetCurrentResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for WorkspaceGetCurrent") + } + + var r0 *pb.RpcWorkspaceGetCurrentResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcWorkspaceGetCurrentRequest) *pb.RpcWorkspaceGetCurrentResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcWorkspaceGetCurrentResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_WorkspaceGetCurrent_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'WorkspaceGetCurrent' +type MockClientCommandsServer_WorkspaceGetCurrent_Call struct { + *mock.Call +} + +// WorkspaceGetCurrent is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcWorkspaceGetCurrentRequest +func (_e *MockClientCommandsServer_Expecter) WorkspaceGetCurrent(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_WorkspaceGetCurrent_Call { + return &MockClientCommandsServer_WorkspaceGetCurrent_Call{Call: _e.mock.On("WorkspaceGetCurrent", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_WorkspaceGetCurrent_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcWorkspaceGetCurrentRequest)) *MockClientCommandsServer_WorkspaceGetCurrent_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcWorkspaceGetCurrentRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_WorkspaceGetCurrent_Call) Return(_a0 *pb.RpcWorkspaceGetCurrentResponse) *MockClientCommandsServer_WorkspaceGetCurrent_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_WorkspaceGetCurrent_Call) RunAndReturn(run func(context.Context, *pb.RpcWorkspaceGetCurrentRequest) *pb.RpcWorkspaceGetCurrentResponse) *MockClientCommandsServer_WorkspaceGetCurrent_Call { + _c.Call.Return(run) + return _c +} + +// WorkspaceObjectAdd provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) WorkspaceObjectAdd(_a0 context.Context, _a1 *pb.RpcWorkspaceObjectAddRequest) *pb.RpcWorkspaceObjectAddResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for WorkspaceObjectAdd") + } + + var r0 *pb.RpcWorkspaceObjectAddResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcWorkspaceObjectAddRequest) *pb.RpcWorkspaceObjectAddResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcWorkspaceObjectAddResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_WorkspaceObjectAdd_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'WorkspaceObjectAdd' +type MockClientCommandsServer_WorkspaceObjectAdd_Call struct { + *mock.Call +} + +// WorkspaceObjectAdd is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcWorkspaceObjectAddRequest +func (_e *MockClientCommandsServer_Expecter) WorkspaceObjectAdd(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_WorkspaceObjectAdd_Call { + return &MockClientCommandsServer_WorkspaceObjectAdd_Call{Call: _e.mock.On("WorkspaceObjectAdd", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_WorkspaceObjectAdd_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcWorkspaceObjectAddRequest)) *MockClientCommandsServer_WorkspaceObjectAdd_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcWorkspaceObjectAddRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_WorkspaceObjectAdd_Call) Return(_a0 *pb.RpcWorkspaceObjectAddResponse) *MockClientCommandsServer_WorkspaceObjectAdd_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_WorkspaceObjectAdd_Call) RunAndReturn(run func(context.Context, *pb.RpcWorkspaceObjectAddRequest) *pb.RpcWorkspaceObjectAddResponse) *MockClientCommandsServer_WorkspaceObjectAdd_Call { + _c.Call.Return(run) + return _c +} + +// WorkspaceObjectListAdd provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) WorkspaceObjectListAdd(_a0 context.Context, _a1 *pb.RpcWorkspaceObjectListAddRequest) *pb.RpcWorkspaceObjectListAddResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for WorkspaceObjectListAdd") + } + + var r0 *pb.RpcWorkspaceObjectListAddResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcWorkspaceObjectListAddRequest) *pb.RpcWorkspaceObjectListAddResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcWorkspaceObjectListAddResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_WorkspaceObjectListAdd_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'WorkspaceObjectListAdd' +type MockClientCommandsServer_WorkspaceObjectListAdd_Call struct { + *mock.Call +} + +// WorkspaceObjectListAdd is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcWorkspaceObjectListAddRequest +func (_e *MockClientCommandsServer_Expecter) WorkspaceObjectListAdd(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_WorkspaceObjectListAdd_Call { + return &MockClientCommandsServer_WorkspaceObjectListAdd_Call{Call: _e.mock.On("WorkspaceObjectListAdd", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_WorkspaceObjectListAdd_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcWorkspaceObjectListAddRequest)) *MockClientCommandsServer_WorkspaceObjectListAdd_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcWorkspaceObjectListAddRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_WorkspaceObjectListAdd_Call) Return(_a0 *pb.RpcWorkspaceObjectListAddResponse) *MockClientCommandsServer_WorkspaceObjectListAdd_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_WorkspaceObjectListAdd_Call) RunAndReturn(run func(context.Context, *pb.RpcWorkspaceObjectListAddRequest) *pb.RpcWorkspaceObjectListAddResponse) *MockClientCommandsServer_WorkspaceObjectListAdd_Call { + _c.Call.Return(run) + return _c +} + +// WorkspaceObjectListRemove provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) WorkspaceObjectListRemove(_a0 context.Context, _a1 *pb.RpcWorkspaceObjectListRemoveRequest) *pb.RpcWorkspaceObjectListRemoveResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for WorkspaceObjectListRemove") + } + + var r0 *pb.RpcWorkspaceObjectListRemoveResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcWorkspaceObjectListRemoveRequest) *pb.RpcWorkspaceObjectListRemoveResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcWorkspaceObjectListRemoveResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_WorkspaceObjectListRemove_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'WorkspaceObjectListRemove' +type MockClientCommandsServer_WorkspaceObjectListRemove_Call struct { + *mock.Call +} + +// WorkspaceObjectListRemove is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcWorkspaceObjectListRemoveRequest +func (_e *MockClientCommandsServer_Expecter) WorkspaceObjectListRemove(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_WorkspaceObjectListRemove_Call { + return &MockClientCommandsServer_WorkspaceObjectListRemove_Call{Call: _e.mock.On("WorkspaceObjectListRemove", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_WorkspaceObjectListRemove_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcWorkspaceObjectListRemoveRequest)) *MockClientCommandsServer_WorkspaceObjectListRemove_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcWorkspaceObjectListRemoveRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_WorkspaceObjectListRemove_Call) Return(_a0 *pb.RpcWorkspaceObjectListRemoveResponse) *MockClientCommandsServer_WorkspaceObjectListRemove_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_WorkspaceObjectListRemove_Call) RunAndReturn(run func(context.Context, *pb.RpcWorkspaceObjectListRemoveRequest) *pb.RpcWorkspaceObjectListRemoveResponse) *MockClientCommandsServer_WorkspaceObjectListRemove_Call { + _c.Call.Return(run) + return _c +} + +// WorkspaceOpen provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) WorkspaceOpen(_a0 context.Context, _a1 *pb.RpcWorkspaceOpenRequest) *pb.RpcWorkspaceOpenResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for WorkspaceOpen") + } + + var r0 *pb.RpcWorkspaceOpenResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcWorkspaceOpenRequest) *pb.RpcWorkspaceOpenResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcWorkspaceOpenResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_WorkspaceOpen_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'WorkspaceOpen' +type MockClientCommandsServer_WorkspaceOpen_Call struct { + *mock.Call +} + +// WorkspaceOpen is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcWorkspaceOpenRequest +func (_e *MockClientCommandsServer_Expecter) WorkspaceOpen(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_WorkspaceOpen_Call { + return &MockClientCommandsServer_WorkspaceOpen_Call{Call: _e.mock.On("WorkspaceOpen", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_WorkspaceOpen_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcWorkspaceOpenRequest)) *MockClientCommandsServer_WorkspaceOpen_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcWorkspaceOpenRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_WorkspaceOpen_Call) Return(_a0 *pb.RpcWorkspaceOpenResponse) *MockClientCommandsServer_WorkspaceOpen_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_WorkspaceOpen_Call) RunAndReturn(run func(context.Context, *pb.RpcWorkspaceOpenRequest) *pb.RpcWorkspaceOpenResponse) *MockClientCommandsServer_WorkspaceOpen_Call { + _c.Call.Return(run) + return _c +} + +// WorkspaceSelect provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) WorkspaceSelect(_a0 context.Context, _a1 *pb.RpcWorkspaceSelectRequest) *pb.RpcWorkspaceSelectResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for WorkspaceSelect") + } + + var r0 *pb.RpcWorkspaceSelectResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcWorkspaceSelectRequest) *pb.RpcWorkspaceSelectResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcWorkspaceSelectResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_WorkspaceSelect_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'WorkspaceSelect' +type MockClientCommandsServer_WorkspaceSelect_Call struct { + *mock.Call +} + +// WorkspaceSelect is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcWorkspaceSelectRequest +func (_e *MockClientCommandsServer_Expecter) WorkspaceSelect(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_WorkspaceSelect_Call { + return &MockClientCommandsServer_WorkspaceSelect_Call{Call: _e.mock.On("WorkspaceSelect", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_WorkspaceSelect_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcWorkspaceSelectRequest)) *MockClientCommandsServer_WorkspaceSelect_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcWorkspaceSelectRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_WorkspaceSelect_Call) Return(_a0 *pb.RpcWorkspaceSelectResponse) *MockClientCommandsServer_WorkspaceSelect_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_WorkspaceSelect_Call) RunAndReturn(run func(context.Context, *pb.RpcWorkspaceSelectRequest) *pb.RpcWorkspaceSelectResponse) *MockClientCommandsServer_WorkspaceSelect_Call { + _c.Call.Return(run) + return _c +} + +// WorkspaceSetInfo provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) WorkspaceSetInfo(_a0 context.Context, _a1 *pb.RpcWorkspaceSetInfoRequest) *pb.RpcWorkspaceSetInfoResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for WorkspaceSetInfo") + } + + var r0 *pb.RpcWorkspaceSetInfoResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcWorkspaceSetInfoRequest) *pb.RpcWorkspaceSetInfoResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcWorkspaceSetInfoResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_WorkspaceSetInfo_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'WorkspaceSetInfo' +type MockClientCommandsServer_WorkspaceSetInfo_Call struct { + *mock.Call +} + +// WorkspaceSetInfo is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcWorkspaceSetInfoRequest +func (_e *MockClientCommandsServer_Expecter) WorkspaceSetInfo(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_WorkspaceSetInfo_Call { + return &MockClientCommandsServer_WorkspaceSetInfo_Call{Call: _e.mock.On("WorkspaceSetInfo", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_WorkspaceSetInfo_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcWorkspaceSetInfoRequest)) *MockClientCommandsServer_WorkspaceSetInfo_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcWorkspaceSetInfoRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_WorkspaceSetInfo_Call) Return(_a0 *pb.RpcWorkspaceSetInfoResponse) *MockClientCommandsServer_WorkspaceSetInfo_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_WorkspaceSetInfo_Call) RunAndReturn(run func(context.Context, *pb.RpcWorkspaceSetInfoRequest) *pb.RpcWorkspaceSetInfoResponse) *MockClientCommandsServer_WorkspaceSetInfo_Call { + _c.Call.Return(run) + return _c +} + +// NewMockClientCommandsServer creates a new instance of MockClientCommandsServer. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +// The first argument is typically a *testing.T value. +func NewMockClientCommandsServer(t interface { + mock.TestingT + Cleanup(func()) +}) *MockClientCommandsServer { + mock := &MockClientCommandsServer{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} From 7a963e8281dd6a3b5e5040291c8648140dd31d20 Mon Sep 17 00:00:00 2001 From: Jannis Metrikat <120120832+jmetrikat@users.noreply.github.com> Date: Thu, 19 Dec 2024 12:52:56 +0100 Subject: [PATCH 049/195] GO-4459 Add keys to all ObjectSearchRequests --- cmd/api/handlers.go | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/cmd/api/handlers.go b/cmd/api/handlers.go index 7e4821444..688925fd9 100644 --- a/cmd/api/handlers.go +++ b/cmd/api/handlers.go @@ -127,6 +127,7 @@ func (a *ApiServer) getSpacesHandler(c *gin.Context) { Type: model.BlockContentDataviewSort_Asc, }, }, + Keys: []string{"targetSpaceId", "name", "iconEmoji", "iconImage"}, Offset: int32(offset), Limit: int32(limit), }) @@ -245,6 +246,7 @@ func (a *ApiServer) getSpaceMembersHandler(c *gin.Context) { Type: model.BlockContentDataviewSort_Asc, }, }, + Keys: []string{"id", "name", "iconEmoji", "iconImage", "identity", "globalName", "participantPermissions"}, Offset: int32(offset), Limit: int32(limit), }) @@ -541,6 +543,7 @@ func (a *ApiServer) getObjectTypesHandler(c *gin.Context) { Type: model.BlockContentDataviewSort_Asc, }, }, + Keys: []string{"id", "uniqueKey", "name", "iconEmoji"}, Offset: int32(offset), Limit: int32(limit), }) @@ -600,6 +603,7 @@ func (a *ApiServer) getObjectTypeTemplatesHandler(c *gin.Context) { Value: pbtypes.String("ot-template"), }, }, + Keys: []string{"id"}, }) if templateTypeIdResp.Error.Code != pb.RpcObjectSearchResponseError_NULL { @@ -624,6 +628,7 @@ func (a *ApiServer) getObjectTypeTemplatesHandler(c *gin.Context) { Value: pbtypes.String(templateTypeId), }, }, + Keys: []string{"id", "targetObjectType", "name", "iconEmoji"}, Offset: int32(offset), Limit: int32(limit), }) @@ -709,6 +714,7 @@ func (a *ApiServer) getObjectsHandler(c *gin.Context) { Value: pbtypes.Int64(int64(model.SpaceStatus_Ok)), }, }, + Keys: []string{"targetSpaceId"}, }) if spaceResp.Error.Code != pb.RpcObjectSearchResponseError_NULL { From f032f71931c2c898204bd8b22e3ae44fb9a53b2a Mon Sep 17 00:00:00 2001 From: Jannis Metrikat <120120832+jmetrikat@users.noreply.github.com> Date: Thu, 19 Dec 2024 12:53:44 +0100 Subject: [PATCH 050/195] GO-4459 Fixes --- cmd/api/demo/api_demo.go | 9 +++++---- cmd/api/schemas.go | 4 ++-- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/cmd/api/demo/api_demo.go b/cmd/api/demo/api_demo.go index 9dfda9e41..0f319acae 100644 --- a/cmd/api/demo/api_demo.go +++ b/cmd/api/demo/api_demo.go @@ -14,7 +14,8 @@ import ( const ( baseURL = "http://localhost:31009/v1" - // testSpaceId = "bafyreifymx5ucm3fdc7vupfg7wakdo5qelni3jvlmawlnvjcppurn2b3di.2lcu0r85yg10d" // dev (entry space) + // testSpaceId = "bafyreifymx5ucm3fdc7vupfg7wakdo5qelni3jvlmawlnvjcppurn2b3di.2lcu0r85yg10d" // dev (entry space) + testSpaceId = "bafyreiezhzb4ggnhjwejmh67pd5grilk6jn3jt7y2rnfpbkjwekilreola.1t123w9f2lgn5" // LFLC // testSpaceId = "bafyreiakofsfkgb7psju346cir2hit5hinhywaybi6vhp7hx4jw7hkngje.scoxzd7vu6rz" // HPI // testObjectId = "bafyreidhtlbbspxecab6xf4pi5zyxcmvwy6lqzursbjouq5fxovh6y3xwu" // "Work Faster with Templates" // testTypeId = "bafyreie3djy4mcldt3hgeet6bnjay2iajdyi2fvx556n6wcxii7brlni3i" // Page (in dev space) @@ -55,7 +56,7 @@ func main() { // spaces // {"POST", "/spaces", nil, map[string]interface{}{"name": "New Space"}}, // {"GET", "/spaces?limit={limit}&offset={offset}", map[string]interface{}{"limit": 100, "offset": 0}, nil}, - // {"GET", "/spaces/{space_id}/members?limit={limit}&offset={offset}", map[string]interface{}{"space_id": testSpaceId}, nil}, + // {"GET", "/spaces/{space_id}/members?limit={limit}&offset={offset}", map[string]interface{}{"space_id": testSpaceId, "limit": 100, "offset": 0}, nil}, // space_objects // {"GET", "/spaces/{space_id}/objects?limit={limit}&offset={offset}", map[string]interface{}{"space_id": testSpaceId, "limit": 100, "offset": 0}, nil}, @@ -65,13 +66,13 @@ func main() { // types_and_templates // {"GET", "/spaces/{space_id}/objectTypes?limit={limit}&offset={offset}", map[string]interface{}{"space_id": testSpaceId, "limit": 100, "offset": 0}, nil}, - // {"GET", "/spaces/{space_id}/objectTypes/{type_id}/templates?limit={limit}&offset={offset}", map[string]interface{}{"space_id": testSpaceId, "type_id": testTypeId}, nil}, + // {"GET", "/spaces/{space_id}/objectTypes/{type_id}/templates?limit={limit}&offset={offset}", map[string]interface{}{"space_id": testSpaceId, "type_id": testTypeId, "limit": 100, "offset": 0}, nil}, // search // {"GET", "/objects?search={search}&object_type={object_type}&limit={limit}&offset={offset}", map[string]interface{}{"search": "writing", "object_type": testTypeId, "limit": 100, "offset": 0}, nil}, // chat - {"GET", "/spaces/{space_id}/chat/messages?limit={limit}&offset={offset}", map[string]interface{}{"space_id": chatSpaceId, "limit": 100, "offset": 0}, nil}, + // {"GET", "/spaces/{space_id}/chat/messages?limit={limit}&offset={offset}", map[string]interface{}{"space_id": chatSpaceId, "limit": 100, "offset": 0}, nil}, // {"POST", "/spaces/{space_id}/chat/messages", map[string]interface{}{"space_id": chatSpaceId}, map[string]interface{}{"text": "new message from demo"}}, } diff --git a/cmd/api/schemas.go b/cmd/api/schemas.go index 9ad0af17f..2ef084315 100644 --- a/cmd/api/schemas.go +++ b/cmd/api/schemas.go @@ -4,7 +4,7 @@ type Space struct { Type string `json:"type" example:"space"` Id string `json:"id" example:"bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1"` Name string `json:"name" example:"Space Name"` - Icon string `json:"icon" example:"data:image/png;base64, "` + Icon string `json:"icon" example:"http://127.0.0.1:31006/image/bafybeieptz5hvcy6txplcvphjbbh5yjc2zqhmihs3owkh5oab4ezauzqay?width=100"` HomeObjectId string `json:"home_object_id" example:"bafyreie4qcl3wczb4cw5hrfyycikhjyh6oljdis3ewqrk5boaav3sbwqya"` ArchiveObjectId string `json:"archive_object_id" example:"bafyreialsgoyflf3etjm3parzurivyaukzivwortf32b4twnlwpwocsrri"` ProfileObjectId string `json:"profile_object_id" example:"bafyreiaxhwreshjqwndpwtdsu4mtihaqhhmlygqnyqpfyfwlqfq3rm3gw4"` @@ -23,7 +23,7 @@ type SpaceMember struct { Type string `json:"type" example:"space_member"` Id string `json:"id" example:"_participant_bafyreigyfkt6rbv24sbv5aq2hko1bhmv5xxlf22b4bypdu6j7hnphm3psq_23me69r569oi1_AAjEaEwPF4nkEh9AWkqEnzcQ8HziBB4ETjiTpvRCQvWnSMDZ"` Name string `json:"name" example:"John Doe"` - Icon string `json:"icon" example:"data:image/png;base64, "` + Icon string `json:"icon" example:"http://127.0.0.1:31006/image/bafybeieptz5hvcy6txplcvphjbbh5yjc2zqhmihs3owkh5oab4ezauzqay?width=100"` Identity string `json:"identity" example:"AAjEaEwPF4nkEh7AWkqEnzcQ8HziGB4ETjiTpvRCQvWnSMDZ"` GlobalName string `json:"global_name" example:"john.any"` Role string `json:"role" enum:"Reader,Writer,Owner,NoPermission" example:"Owner"` From d56cf2fce3c9f1b025f65b319a7999fdf8364a89 Mon Sep 17 00:00:00 2001 From: Jannis Metrikat <120120832+jmetrikat@users.noreply.github.com> Date: Thu, 19 Dec 2024 13:32:00 +0100 Subject: [PATCH 051/195] GO-4459 Increase unit test coverage --- cmd/api/handlers_test.go | 557 ++++++++++++++++++++++++++++++++++++++- cmd/api/main.go | 2 +- 2 files changed, 552 insertions(+), 7 deletions(-) diff --git a/cmd/api/handlers_test.go b/cmd/api/handlers_test.go index 6271e5a43..873ec9c9b 100644 --- a/cmd/api/handlers_test.go +++ b/cmd/api/handlers_test.go @@ -3,16 +3,22 @@ package api import ( "net/http" "net/http/httptest" + "strings" "testing" "github.com/gin-gonic/gin" + "github.com/webstradev/gin-pagination/v2/pkg/pagination" "github.com/stretchr/testify/mock" "github.com/stretchr/testify/require" + "github.com/gogo/protobuf/types" + "github.com/anyproto/anytype-heart/core/mock_core" "github.com/anyproto/anytype-heart/pb" "github.com/anyproto/anytype-heart/pb/service/mock_service" + "github.com/anyproto/anytype-heart/pkg/lib/pb/model" + "github.com/anyproto/anytype-heart/util/pbtypes" ) type fixture struct { @@ -27,8 +33,37 @@ func newFixture(t *testing.T) *fixture { mwInternal := mock_core.NewMockMiddlewareInternal(t) apiServer := &ApiServer{mw: mw, mwInternal: mwInternal, router: gin.Default()} - apiServer.router.POST("/auth/displayCode", apiServer.authDisplayCodeHandler) - apiServer.router.GET("/auth/token", apiServer.authTokenHandler) + paginator := pagination.New( + pagination.WithPageText("offset"), + pagination.WithSizeText("limit"), + pagination.WithDefaultPage(0), + pagination.WithDefaultPageSize(100), + pagination.WithMinPageSize(1), + pagination.WithMaxPageSize(1000), + ) + + auth := apiServer.router.Group("/v1/auth") + { + auth.POST("/displayCode", apiServer.authDisplayCodeHandler) + auth.GET("/token", apiServer.authTokenHandler) + } + readOnly := apiServer.router.Group("/v1") + { + readOnly.GET("/spaces", paginator, apiServer.getSpacesHandler) + readOnly.GET("/spaces/:space_id/members", paginator, apiServer.getSpaceMembersHandler) + readOnly.GET("/spaces/:space_id/objects", paginator, apiServer.getObjectsForSpaceHandler) + readOnly.GET("/spaces/:space_id/objects/:object_id", apiServer.getObjectHandler) + readOnly.GET("/spaces/:space_id/objectTypes", paginator, apiServer.getObjectTypesHandler) + readOnly.GET("/spaces/:space_id/objectTypes/:typeId/templates", paginator, apiServer.getObjectTypeTemplatesHandler) + readOnly.GET("/objects", paginator, apiServer.getObjectsHandler) + } + + readWrite := apiServer.router.Group("/v1") + { + readWrite.POST("/spaces", apiServer.createSpaceHandler) + readWrite.POST("/spaces/:space_id/objects", apiServer.createObjectHandler) + readWrite.PUT("/spaces/:space_id/objects/:object_id", apiServer.updateObjectHandler) + } return &fixture{ ApiServer: apiServer, @@ -48,7 +83,7 @@ func TestApiServer_AuthDisplayCodeHandler(t *testing.T) { Error: &pb.RpcAccountLocalLinkNewChallengeResponseError{Code: pb.RpcAccountLocalLinkNewChallengeResponseError_NULL}, }).Once() - req, _ := http.NewRequest("POST", "/auth/displayCode", nil) + req, _ := http.NewRequest("POST", "/v1/auth/displayCode", nil) w := httptest.NewRecorder() fx.router.ServeHTTP(w, req) @@ -65,7 +100,7 @@ func TestApiServer_AuthDisplayCodeHandler(t *testing.T) { Error: &pb.RpcAccountLocalLinkNewChallengeResponseError{Code: pb.RpcAccountLocalLinkNewChallengeResponseError_UNKNOWN_ERROR}, }).Once() - req, _ := http.NewRequest("POST", "/auth/displayCode", nil) + req, _ := http.NewRequest("POST", "/v1/auth/displayCode", nil) w := httptest.NewRecorder() fx.router.ServeHTTP(w, req) @@ -90,7 +125,7 @@ func TestApiServer_AuthTokenHandler(t *testing.T) { Error: &pb.RpcAccountLocalLinkSolveChallengeResponseError{Code: pb.RpcAccountLocalLinkSolveChallengeResponseError_NULL}, }).Once() - req, _ := http.NewRequest("GET", "/auth/token?challengeId="+challengeId+"&code="+code, nil) + req, _ := http.NewRequest("GET", "/v1/auth/token?challengeId="+challengeId+"&code="+code, nil) w := httptest.NewRecorder() fx.router.ServeHTTP(w, req) @@ -112,10 +147,520 @@ func TestApiServer_AuthTokenHandler(t *testing.T) { Error: &pb.RpcAccountLocalLinkSolveChallengeResponseError{Code: pb.RpcAccountLocalLinkSolveChallengeResponseError_UNKNOWN_ERROR}, }).Once() - req, _ := http.NewRequest("GET", "/auth/token?challengeId="+challengeId+"&code="+code, nil) + req, _ := http.NewRequest("GET", "/v1/auth/token?challengeId="+challengeId+"&code="+code, nil) w := httptest.NewRecorder() fx.router.ServeHTTP(w, req) require.Equal(t, http.StatusInternalServerError, w.Code) }) } + +func TestApiServer_GetSpacesHandler(t *testing.T) { + t.Run("successful retrieval of spaces", func(t *testing.T) { + fx := newFixture(t) + fx.accountInfo = &model.AccountInfo{TechSpaceId: "tech-space-id"} + + fx.mwMock.On("ObjectSearch", mock.Anything, mock.Anything).Return(&pb.RpcObjectSearchResponse{ + Records: []*types.Struct{ + { + Fields: map[string]*types.Value{ + "name": pbtypes.String("My Workspace"), + "targetSpaceId": pbtypes.String("my-space-id"), + "iconEmoji": pbtypes.String("🚀"), + "iconImage": pbtypes.String(""), + }, + }, + { + Fields: map[string]*types.Value{ + "name": pbtypes.String("Another Workspace"), + "targetSpaceId": pbtypes.String("another-space-id"), + "iconEmoji": pbtypes.String(""), + "iconImage": pbtypes.String("bafyreialsgoyflf3etjm3parzurivyaukzivwortf32b4twnlwpwocsrri"), + }, + }, + }, + Error: &pb.RpcObjectSearchResponseError{Code: pb.RpcObjectSearchResponseError_NULL}, + }).Once() + + fx.mwMock.On("WorkspaceOpen", mock.Anything, mock.Anything).Return(&pb.RpcWorkspaceOpenResponse{ + Error: &pb.RpcWorkspaceOpenResponseError{Code: pb.RpcWorkspaceOpenResponseError_NULL}, + Info: &model.AccountInfo{ + HomeObjectId: "home-object-id", + ArchiveObjectId: "archive-object-id", + ProfileObjectId: "profile-object-id", + MarketplaceWorkspaceId: "marketplace-workspace-id", + WorkspaceObjectId: "workspace-object-id", + DeviceId: "device-id", + AccountSpaceId: "account-space-id", + WidgetsId: "widgets-id", + SpaceViewId: "space-view-id", + TechSpaceId: "tech-space-id", + GatewayUrl: "gateway-url", + LocalStoragePath: "local-storage-path", + TimeZone: "time-zone", + AnalyticsId: "analytics-id", + NetworkId: "network-id", + }, + }, nil).Twice() + + req, _ := http.NewRequest("GET", "/v1/spaces", nil) + w := httptest.NewRecorder() + fx.router.ServeHTTP(w, req) + + require.Equal(t, http.StatusOK, w.Code) + require.Contains(t, w.Body.String(), "My Workspace") + require.Contains(t, w.Body.String(), "Another Workspace") + }) + + t.Run("no spaces found", func(t *testing.T) { + fx := newFixture(t) + fx.accountInfo = &model.AccountInfo{TechSpaceId: "tech-space-id"} + + fx.mwMock.On("ObjectSearch", mock.Anything, mock.Anything). + Return(&pb.RpcObjectSearchResponse{ + Records: []*types.Struct{}, + Error: &pb.RpcObjectSearchResponseError{Code: pb.RpcObjectSearchResponseError_NULL}, + }).Once() + + req, _ := http.NewRequest("GET", "/v1/spaces", nil) + w := httptest.NewRecorder() + fx.router.ServeHTTP(w, req) + + require.Equal(t, http.StatusNotFound, w.Code) + }) +} + +func TestApiServer_CreateSpaceHandler(t *testing.T) { + t.Run("successful create space", func(t *testing.T) { + fx := newFixture(t) + fx.mwMock.On("WorkspaceCreate", mock.Anything, mock.Anything). + Return(&pb.RpcWorkspaceCreateResponse{ + Error: &pb.RpcWorkspaceCreateResponseError{Code: pb.RpcWorkspaceCreateResponseError_NULL}, + SpaceId: "new-space-id", + }).Once() + + body := strings.NewReader(`{"name":"New Space"}`) + req, _ := http.NewRequest("POST", "/v1/spaces", body) + w := httptest.NewRecorder() + fx.router.ServeHTTP(w, req) + + require.Equal(t, http.StatusOK, w.Code) + require.Contains(t, w.Body.String(), "new-space-id") + }) + + t.Run("invalid JSON", func(t *testing.T) { + fx := newFixture(t) + + body := strings.NewReader(`{invalid json}`) + req, _ := http.NewRequest("POST", "/v1/spaces", body) + w := httptest.NewRecorder() + fx.router.ServeHTTP(w, req) + + require.Equal(t, http.StatusBadRequest, w.Code) + }) + + t.Run("failed workspace creation", func(t *testing.T) { + fx := newFixture(t) + fx.mwMock.On("WorkspaceCreate", mock.Anything, mock.Anything). + Return(&pb.RpcWorkspaceCreateResponse{ + Error: &pb.RpcWorkspaceCreateResponseError{Code: pb.RpcWorkspaceCreateResponseError_UNKNOWN_ERROR}, + }).Once() + + body := strings.NewReader(`{"name":"Fail Space"}`) + req, _ := http.NewRequest("POST", "/v1/spaces", body) + w := httptest.NewRecorder() + fx.router.ServeHTTP(w, req) + + require.Equal(t, http.StatusInternalServerError, w.Code) + }) +} + +func TestApiServer_GetSpaceMembersHandler(t *testing.T) { + t.Run("successfully get space members", func(t *testing.T) { + fx := newFixture(t) + + fx.mwMock.On("ObjectSearch", mock.Anything, mock.Anything). + Return(&pb.RpcObjectSearchResponse{ + Records: []*types.Struct{ + { + Fields: map[string]*types.Value{ + "id": pbtypes.String("member-1"), + "name": pbtypes.String("John Doe"), + "iconEmoji": pbtypes.String("👤"), + }, + }, + }, + Error: &pb.RpcObjectSearchResponseError{Code: pb.RpcObjectSearchResponseError_NULL}, + }).Once() + + req, _ := http.NewRequest("GET", "/v1/spaces/my-space/members", nil) + w := httptest.NewRecorder() + fx.router.ServeHTTP(w, req) + + require.Equal(t, http.StatusOK, w.Code) + require.Contains(t, w.Body.String(), "John Doe") + }) + + t.Run("no members found", func(t *testing.T) { + fx := newFixture(t) + + fx.mwMock.On("ObjectSearch", mock.Anything, mock.Anything). + Return(&pb.RpcObjectSearchResponse{ + Records: []*types.Struct{}, + Error: &pb.RpcObjectSearchResponseError{Code: pb.RpcObjectSearchResponseError_NULL}, + }).Once() + + req, _ := http.NewRequest("GET", "/v1/spaces/empty-space/members", nil) + w := httptest.NewRecorder() + fx.router.ServeHTTP(w, req) + + require.Equal(t, http.StatusNotFound, w.Code) + }) +} + +func TestApiServer_GetObjectsForSpaceHandler(t *testing.T) { + t.Run("successfully get objects for a space", func(t *testing.T) { + fx := newFixture(t) + + fx.mwMock.On("ObjectSearch", mock.Anything, mock.Anything). + Return(&pb.RpcObjectSearchResponse{ + Records: []*types.Struct{ + { + Fields: map[string]*types.Value{ + "id": pbtypes.String("object-1"), + "name": pbtypes.String("My Object"), + "type": pbtypes.String("basic-type-id"), + "layout": pbtypes.Float64(float64(model.ObjectType_basic)), + "iconEmoji": pbtypes.String("📄"), + "lastModifiedDate": pbtypes.Float64(1234567890), + }, + }, + }, + Error: &pb.RpcObjectSearchResponseError{Code: pb.RpcObjectSearchResponseError_NULL}, + }).Twice() + + // Mock type resolution + fx.mwMock.On("ObjectShow", mock.Anything, mock.Anything).Return(&pb.RpcObjectShowResponse{ + Error: &pb.RpcObjectShowResponseError{Code: pb.RpcObjectShowResponseError_NULL}, + ObjectView: &model.ObjectView{ + Details: []*model.ObjectViewDetailsSet{ + { + Details: &types.Struct{ + Fields: map[string]*types.Value{ + "name": pbtypes.String("Basic Type"), + }, + }, + }, + }, + }, + }, nil).Maybe() + + req, _ := http.NewRequest("GET", "/v1/spaces/my-space/objects", nil) + w := httptest.NewRecorder() + fx.router.ServeHTTP(w, req) + + require.Equal(t, http.StatusOK, w.Code) + require.Contains(t, w.Body.String(), "My Object") + }) + + t.Run("no objects found", func(t *testing.T) { + fx := newFixture(t) + + fx.mwMock.On("ObjectSearch", mock.Anything, mock.Anything). + Return(&pb.RpcObjectSearchResponse{ + Records: []*types.Struct{}, + Error: &pb.RpcObjectSearchResponseError{Code: pb.RpcObjectSearchResponseError_NULL}, + }).Once() + + req, _ := http.NewRequest("GET", "/v1/spaces/empty-space/objects", nil) + w := httptest.NewRecorder() + fx.router.ServeHTTP(w, req) + + require.Equal(t, http.StatusNotFound, w.Code) + }) +} + +func TestApiServer_GetObjectHandler(t *testing.T) { + t.Run("object found", func(t *testing.T) { + fx := newFixture(t) + + fx.mwMock.On("ObjectShow", mock.Anything, &pb.RpcObjectShowRequest{ + SpaceId: "my-space", + ObjectId: "obj-1", + }).Return(&pb.RpcObjectShowResponse{ + Error: &pb.RpcObjectShowResponseError{Code: pb.RpcObjectShowResponseError_NULL}, + ObjectView: &model.ObjectView{ + RootId: "root-1", + Details: []*model.ObjectViewDetailsSet{ + { + Details: &types.Struct{ + Fields: map[string]*types.Value{ + "name": pbtypes.String("Found Object"), + "type": pbtypes.String("basic-type-id"), + "iconEmoji": pbtypes.String("🔍"), + }, + }, + }, + }, + }, + }, nil).Once() + + // Type resolution mock + fx.mwMock.On("ObjectSearch", mock.Anything, mock.Anything).Return(&pb.RpcObjectSearchResponse{ + Error: &pb.RpcObjectSearchResponseError{Code: pb.RpcObjectSearchResponseError_NULL}, + Records: []*types.Struct{ + { + Fields: map[string]*types.Value{ + "name": pbtypes.String("Basic Type"), + }, + }, + }, + }, nil).Once() + + req, _ := http.NewRequest("GET", "/v1/spaces/my-space/objects/obj-1", nil) + w := httptest.NewRecorder() + fx.router.ServeHTTP(w, req) + + require.Equal(t, http.StatusOK, w.Code) + require.Contains(t, w.Body.String(), "Found Object") + }) + + t.Run("object not found", func(t *testing.T) { + fx := newFixture(t) + + fx.mwMock.On("ObjectShow", mock.Anything, mock.Anything). + Return(&pb.RpcObjectShowResponse{ + Error: &pb.RpcObjectShowResponseError{Code: pb.RpcObjectShowResponseError_NOT_FOUND}, + }, nil).Once() + + req, _ := http.NewRequest("GET", "/v1/spaces/my-space/objects/missing-obj", nil) + w := httptest.NewRecorder() + fx.router.ServeHTTP(w, req) + + require.Equal(t, http.StatusNotFound, w.Code) + }) +} + +func TestApiServer_CreateObjectHandler(t *testing.T) { + t.Run("successful object creation", func(t *testing.T) { + fx := newFixture(t) + + fx.mwMock.On("ObjectCreate", mock.Anything, mock.Anything). + Return(&pb.RpcObjectCreateResponse{ + Error: &pb.RpcObjectCreateResponseError{Code: pb.RpcObjectCreateResponseError_NULL}, + ObjectId: "new-obj-id", + Details: &types.Struct{ + Fields: map[string]*types.Value{ + "name": pbtypes.String("New Object"), + "iconEmoji": pbtypes.String("🆕"), + "spaceId": pbtypes.String("my-space"), + }, + }, + }).Once() + + body := strings.NewReader(`{"name":"New Object","icon":"🆕","template_id":"","object_type_unique_key":"basic","with_chat":false}`) + req, _ := http.NewRequest("POST", "/v1/spaces/my-space/objects", body) + w := httptest.NewRecorder() + fx.router.ServeHTTP(w, req) + + require.Equal(t, http.StatusOK, w.Code) + require.Contains(t, w.Body.String(), "new-obj-id") + }) + + t.Run("invalid JSON", func(t *testing.T) { + fx := newFixture(t) + + body := strings.NewReader(`{invalid json}`) + req, _ := http.NewRequest("POST", "/v1/spaces/my-space/objects", body) + w := httptest.NewRecorder() + fx.router.ServeHTTP(w, req) + + require.Equal(t, http.StatusBadRequest, w.Code) + }) + + t.Run("creation error", func(t *testing.T) { + fx := newFixture(t) + + fx.mwMock.On("ObjectCreate", mock.Anything, mock.Anything). + Return(&pb.RpcObjectCreateResponse{ + Error: &pb.RpcObjectCreateResponseError{Code: pb.RpcObjectCreateResponseError_UNKNOWN_ERROR}, + }).Once() + + body := strings.NewReader(`{"name":"Fail Object"}`) + req, _ := http.NewRequest("POST", "/v1/spaces/my-space/objects", body) + w := httptest.NewRecorder() + fx.router.ServeHTTP(w, req) + + require.Equal(t, http.StatusInternalServerError, w.Code) + }) +} + +func TestApiServer_UpdateObjectHandler(t *testing.T) { + fx := newFixture(t) + + body := strings.NewReader(`{"name":"Updated Object"}`) + req, _ := http.NewRequest("PUT", "/v1/spaces/my-space/objects/obj-1", body) + w := httptest.NewRecorder() + fx.router.ServeHTTP(w, req) + + require.Equal(t, http.StatusNotImplemented, w.Code) +} + +func TestApiServer_GetObjectTypesHandler(t *testing.T) { + t.Run("types found", func(t *testing.T) { + fx := newFixture(t) + + fx.mwMock.On("ObjectSearch", mock.Anything, mock.Anything). + Return(&pb.RpcObjectSearchResponse{ + Records: []*types.Struct{ + { + Fields: map[string]*types.Value{ + "id": pbtypes.String("type-1"), + "name": pbtypes.String("Type One"), + "uniqueKey": pbtypes.String("type-one-key"), + "iconEmoji": pbtypes.String("🗂️"), + }, + }, + }, + Error: &pb.RpcObjectSearchResponseError{Code: pb.RpcObjectSearchResponseError_NULL}, + }).Once() + + req, _ := http.NewRequest("GET", "/v1/spaces/my-space/objectTypes", nil) + w := httptest.NewRecorder() + fx.router.ServeHTTP(w, req) + + require.Equal(t, http.StatusOK, w.Code) + require.Contains(t, w.Body.String(), "Type One") + }) + + t.Run("no types found", func(t *testing.T) { + fx := newFixture(t) + + fx.mwMock.On("ObjectSearch", mock.Anything, mock.Anything). + Return(&pb.RpcObjectSearchResponse{ + Records: []*types.Struct{}, + Error: &pb.RpcObjectSearchResponseError{Code: pb.RpcObjectSearchResponseError_NULL}, + }).Once() + + req, _ := http.NewRequest("GET", "/v1/spaces/my-space/objectTypes", nil) + w := httptest.NewRecorder() + fx.router.ServeHTTP(w, req) + + require.Equal(t, http.StatusNotFound, w.Code) + }) +} + +func TestApiServer_GetObjectTypeTemplatesHandler(t *testing.T) { + t.Run("templates found", func(t *testing.T) { + fx := newFixture(t) + + // Mock template type search + fx.mwMock.On("ObjectSearch", mock.Anything, mock.Anything).Return(&pb.RpcObjectSearchResponse{ + Records: []*types.Struct{ + { + Fields: map[string]*types.Value{ + "id": pbtypes.String("template-type-id"), + "uniqueKey": pbtypes.String("ot-template"), + }, + }, + }, + Error: &pb.RpcObjectSearchResponseError{Code: pb.RpcObjectSearchResponseError_NULL}, + }).Once() + + // Mock actual template objects search + fx.mwMock.On("ObjectSearch", mock.Anything, mock.Anything).Return(&pb.RpcObjectSearchResponse{ + Records: []*types.Struct{ + { + Fields: map[string]*types.Value{ + "id": pbtypes.String("template-1"), + "targetObjectType": pbtypes.String("target-type-id"), + }, + }, + }, + Error: &pb.RpcObjectSearchResponseError{Code: pb.RpcObjectSearchResponseError_NULL}, + }).Once() + + // Mock template show + fx.mwMock.On("ObjectShow", mock.Anything, mock.Anything).Return(&pb.RpcObjectShowResponse{ + Error: &pb.RpcObjectShowResponseError{Code: pb.RpcObjectShowResponseError_NULL}, + ObjectView: &model.ObjectView{ + Details: []*model.ObjectViewDetailsSet{ + { + Details: &types.Struct{ + Fields: map[string]*types.Value{ + "name": pbtypes.String("Template Name"), + "iconEmoji": pbtypes.String("📝"), + }, + }, + }, + }, + }, + }, nil).Once() + + req, _ := http.NewRequest("GET", "/v1/spaces/my-space/objectTypes/target-type-id/templates", nil) + w := httptest.NewRecorder() + fx.router.ServeHTTP(w, req) + + require.Equal(t, http.StatusOK, w.Code) + require.Contains(t, w.Body.String(), "Template Name") + }) + + t.Run("no template type found", func(t *testing.T) { + fx := newFixture(t) + + fx.mwMock.On("ObjectSearch", mock.Anything, mock.Anything). + Return(&pb.RpcObjectSearchResponse{ + Records: []*types.Struct{}, + Error: &pb.RpcObjectSearchResponseError{Code: pb.RpcObjectSearchResponseError_NULL}, + }).Once() + + req, _ := http.NewRequest("GET", "/v1/spaces/my-space/objectTypes/missing-type-id/templates", nil) + w := httptest.NewRecorder() + fx.router.ServeHTTP(w, req) + + require.Equal(t, http.StatusNotFound, w.Code) + }) +} + +func TestApiServer_GetObjectsHandler(t *testing.T) { + t.Run("objects found globally", func(t *testing.T) { + fx := newFixture(t) + + // Mock retrieving spaces first + fx.accountInfo = &model.AccountInfo{TechSpaceId: "tech-space-id"} + fx.mwMock.On("ObjectSearch", mock.Anything, mock.Anything).Return(&pb.RpcObjectSearchResponse{ + Records: []*types.Struct{ + { + Fields: map[string]*types.Value{ + "targetSpaceId": pbtypes.String("space-1"), + }, + }, + }, + Error: &pb.RpcObjectSearchResponseError{Code: pb.RpcObjectSearchResponseError_NULL}, + }).Twice() + + // Mock objects in space-1 + fx.mwMock.On("ObjectSearch", mock.Anything, mock.Anything).Return(&pb.RpcObjectSearchResponse{ + Records: []*types.Struct{ + { + Fields: map[string]*types.Value{ + "id": pbtypes.String("obj-global-1"), + "name": pbtypes.String("Global Object"), + "type": pbtypes.String("global-type-id"), + "layout": pbtypes.Float64(float64(model.ObjectType_basic)), + "iconEmoji": pbtypes.String("🌐"), + "lastModifiedDate": pbtypes.Float64(999999), + }, + }, + }, + Error: &pb.RpcObjectSearchResponseError{Code: pb.RpcObjectSearchResponseError_NULL}, + }).Once() + + req, _ := http.NewRequest("GET", "/v1/objects", nil) + w := httptest.NewRecorder() + fx.router.ServeHTTP(w, req) + + require.Equal(t, http.StatusOK, w.Code) + require.Contains(t, w.Body.String(), "Global Object") + }) +} diff --git a/cmd/api/main.go b/cmd/api/main.go index 9c60fba22..8d7e5c940 100644 --- a/cmd/api/main.go +++ b/cmd/api/main.go @@ -115,7 +115,7 @@ func RunApiServer(ctx context.Context, mw service.ClientCommandsServer, mwIntern // readWrite.Use(a.PermissionMiddleware("read-write")) { readWrite.POST("/spaces", a.createSpaceHandler) - readWrite.POST("/spaces/:space_id/objects/", a.createObjectHandler) + readWrite.POST("/spaces/:space_id/objects", a.createObjectHandler) readWrite.PUT("/spaces/:space_id/objects/:object_id", a.updateObjectHandler) } From 3924aa9f8e819590839c71f126fbc08f56b103cb Mon Sep 17 00:00:00 2001 From: kirillston Date: Thu, 19 Dec 2024 20:40:03 +0300 Subject: [PATCH 052/195] GO-4444 Use bundle info to revise sys objects --- .../migration/readonlyfixer/relationsfixer.go | 4 +- .../readonlyfixer/relationsfixer_test.go | 6 +- space/internal/components/migration/runner.go | 7 +- .../components/migration/runner_test.go | 12 +- .../systemobjectreviser.go | 65 +++++---- .../systemobjectreviser_test.go | 129 +++++++----------- 6 files changed, 105 insertions(+), 118 deletions(-) diff --git a/space/internal/components/migration/readonlyfixer/relationsfixer.go b/space/internal/components/migration/readonlyfixer/relationsfixer.go index 965f4f29d..daa4ba5bb 100644 --- a/space/internal/components/migration/readonlyfixer/relationsfixer.go +++ b/space/internal/components/migration/readonlyfixer/relationsfixer.go @@ -28,11 +28,11 @@ const MName = "ReadonlyRelationsFixer" // This migration was implemented to fix relations in accounts of users that are not able to modify its value (GO-2331) type Migration struct{} -func (Migration) Name() string { +func (m Migration) Name() string { return MName } -func (Migration) Run(ctx context.Context, log logger.CtxLogger, store, _ dependencies.QueryableStore, space dependencies.SpaceWithCtx) (toMigrate, migrated int, err error) { +func (m Migration) Run(ctx context.Context, log logger.CtxLogger, store dependencies.QueryableStore, space dependencies.SpaceWithCtx) (toMigrate, migrated int, err error) { spaceId := space.Id() relations, err := listReadonlyTagAndStatusRelations(store, spaceId) diff --git a/space/internal/components/migration/readonlyfixer/relationsfixer_test.go b/space/internal/components/migration/readonlyfixer/relationsfixer_test.go index 94b5d500e..5f2525ee0 100644 --- a/space/internal/components/migration/readonlyfixer/relationsfixer_test.go +++ b/space/internal/components/migration/readonlyfixer/relationsfixer_test.go @@ -82,7 +82,7 @@ func TestFixReadonlyInRelations(t *testing.T) { ).Times(2) // when - migrated, toMigrate, err := fixer.Run(ctx, log, store.SpaceIndex("space1"), nil, spc) + migrated, toMigrate, err := fixer.Run(ctx, log, store.SpaceIndex("space1"), spc) // then assert.NoError(t, err) @@ -99,7 +99,7 @@ func TestFixReadonlyInRelations(t *testing.T) { // sp.EXPECT().Do(mock.Anything, mock.Anything).Times(1).Return(nil) // when - migrated, toMigrate, err := fixer.Run(ctx, log, store.SpaceIndex("space2"), nil, spc) + migrated, toMigrate, err := fixer.Run(ctx, log, store.SpaceIndex("space2"), spc) // then assert.NoError(t, err) @@ -116,7 +116,7 @@ func TestFixReadonlyInRelations(t *testing.T) { // sp.EXPECT().Do(mock.Anything, mock.Anything).Times(1).Return(nil) // when - migrated, toMigrate, err := fixer.Run(ctx, log, store.SpaceIndex("space3"), nil, spc) + migrated, toMigrate, err := fixer.Run(ctx, log, store.SpaceIndex("space3"), spc) // then assert.NoError(t, err) diff --git a/space/internal/components/migration/runner.go b/space/internal/components/migration/runner.go index c3f6c1490..21e6cc76d 100644 --- a/space/internal/components/migration/runner.go +++ b/space/internal/components/migration/runner.go @@ -10,7 +10,6 @@ import ( "github.com/anyproto/any-sync/app/logger" "go.uber.org/zap" - "github.com/anyproto/anytype-heart/pkg/lib/localstore/addr" "github.com/anyproto/anytype-heart/pkg/lib/localstore/objectstore" "github.com/anyproto/anytype-heart/space/clientspace" "github.com/anyproto/anytype-heart/space/internal/components/dependencies" @@ -27,7 +26,7 @@ const ( var log = logger.NewNamed(CName) type Migration interface { - Run(context.Context, logger.CtxLogger, dependencies.QueryableStore, dependencies.QueryableStore, dependencies.SpaceWithCtx) (toMigrate, migrated int, err error) + Run(context.Context, logger.CtxLogger, dependencies.QueryableStore, dependencies.SpaceWithCtx) (toMigrate, migrated int, err error) Name() string } @@ -107,7 +106,7 @@ func (r *Runner) run(migrations ...Migration) (err error) { start := time.Now() store := r.store.SpaceIndex(spaceId) - marketPlaceStore := r.store.SpaceIndex(addr.AnytypeMarketplaceWorkspace) + // marketPlaceStore := r.store.SpaceIndex(addr.AnytypeMarketplaceWorkspace) spent := time.Since(start) for _, m := range migrations { @@ -115,7 +114,7 @@ func (r *Runner) run(migrations ...Migration) (err error) { err = errors.Join(err, e) return } - toMigrate, migrated, e := m.Run(r.ctx, log, store, marketPlaceStore, r.spc) + toMigrate, migrated, e := m.Run(r.ctx, log, store, r.spc) if e != nil { err = errors.Join(err, wrapError(e, m.Name(), spaceId, migrated, toMigrate)) continue diff --git a/space/internal/components/migration/runner_test.go b/space/internal/components/migration/runner_test.go index 4d3b2a097..9a91616cf 100644 --- a/space/internal/components/migration/runner_test.go +++ b/space/internal/components/migration/runner_test.go @@ -140,11 +140,11 @@ func TestRunner(t *testing.T) { type longStoreMigration struct{} -func (longStoreMigration) Name() string { +func (m longStoreMigration) Name() string { return "long migration" } -func (longStoreMigration) Run(ctx context.Context, _ logger.CtxLogger, store, queryableStore dependencies.QueryableStore, _ dependencies.SpaceWithCtx) (toMigrate, migrated int, err error) { +func (m longStoreMigration) Run(ctx context.Context, _ logger.CtxLogger, store, queryableStore dependencies.QueryableStore, _ dependencies.SpaceWithCtx) (toMigrate, migrated int, err error) { for { if _, err = store.Query(database.Query{}); err != nil { return 0, 0, err @@ -154,11 +154,11 @@ func (longStoreMigration) Run(ctx context.Context, _ logger.CtxLogger, store, qu type longSpaceMigration struct{} -func (longSpaceMigration) Name() string { +func (m longSpaceMigration) Name() string { return "long migration" } -func (longSpaceMigration) Run(ctx context.Context, _ logger.CtxLogger, _, store dependencies.QueryableStore, space dependencies.SpaceWithCtx) (toMigrate, migrated int, err error) { +func (m longSpaceMigration) Run(ctx context.Context, _ logger.CtxLogger, store dependencies.QueryableStore, space dependencies.SpaceWithCtx) (toMigrate, migrated int, err error) { for { if err = space.DoCtx(ctx, "", func(smartblock.SmartBlock) error { // do smth @@ -171,10 +171,10 @@ func (longSpaceMigration) Run(ctx context.Context, _ logger.CtxLogger, _, store type instantMigration struct{} -func (instantMigration) Name() string { +func (m instantMigration) Name() string { return "instant migration" } -func (instantMigration) Run(context.Context, logger.CtxLogger, dependencies.QueryableStore, dependencies.QueryableStore, dependencies.SpaceWithCtx) (toMigrate, migrated int, err error) { +func (m instantMigration) Run(context.Context, logger.CtxLogger, dependencies.QueryableStore, dependencies.SpaceWithCtx) (toMigrate, migrated int, err error) { return 0, 0, nil } diff --git a/space/internal/components/migration/systemobjectreviser/systemobjectreviser.go b/space/internal/components/migration/systemobjectreviser/systemobjectreviser.go index 059c0cc6d..40656cbfc 100644 --- a/space/internal/components/migration/systemobjectreviser/systemobjectreviser.go +++ b/space/internal/components/migration/systemobjectreviser/systemobjectreviser.go @@ -13,6 +13,7 @@ import ( "github.com/anyproto/anytype-heart/core/block/editor/smartblock" "github.com/anyproto/anytype-heart/core/domain" + "github.com/anyproto/anytype-heart/core/relationutils" "github.com/anyproto/anytype-heart/core/session" "github.com/anyproto/anytype-heart/pkg/lib/bundle" coresb "github.com/anyproto/anytype-heart/pkg/lib/core/smartblock" @@ -37,23 +38,18 @@ const revisionKey = bundle.RelationKeyRevision // For more info see 'System Objects Update' section of docs/Flow.md type Migration struct{} -func (Migration) Name() string { +func (m Migration) Name() string { return MName } -func (Migration) Run(ctx context.Context, log logger.CtxLogger, store, marketPlace dependencies.QueryableStore, space dependencies.SpaceWithCtx) (toMigrate, migrated int, err error) { +func (m Migration) Run(ctx context.Context, log logger.CtxLogger, store dependencies.QueryableStore, space dependencies.SpaceWithCtx) (toMigrate, migrated int, err error) { spaceObjects, err := listAllTypesAndRelations(store) if err != nil { return 0, 0, fmt.Errorf("failed to get relations and types from client space: %w", err) } - marketObjects, err := listAllTypesAndRelations(marketPlace) - if err != nil { - return 0, 0, fmt.Errorf("failed to get relations from marketplace space: %w", err) - } - for _, details := range spaceObjects { - shouldBeRevised, e := reviseSystemObject(ctx, log, space, details, marketObjects) + shouldBeRevised, e := reviseObject(ctx, log, space, details) if !shouldBeRevised { continue } @@ -89,15 +85,25 @@ func listAllTypesAndRelations(store dependencies.QueryableStore) (map[string]*do return details, nil } -func reviseSystemObject(ctx context.Context, log logger.CtxLogger, space dependencies.SpaceWithCtx, localObject *domain.Details, marketObjects map[string]*domain.Details) (toRevise bool, err error) { - source := localObject.GetString(bundle.RelationKeySourceObject) - marketObject, found := marketObjects[source] - if !found || !isSystemObject(localObject) || marketObject.GetInt64(revisionKey) <= localObject.GetInt64(revisionKey) { +func reviseObject(ctx context.Context, log logger.CtxLogger, space dependencies.SpaceWithCtx, localObject *domain.Details) (toRevise bool, err error) { + uniqueKeyRaw := localObject.GetString(bundle.RelationKeyUniqueKey) + + uk, err := domain.UnmarshalUniqueKey(uniqueKeyRaw) + if err != nil { + return false, fmt.Errorf("failed to unmarshal unique key '%s': %w", uniqueKeyRaw, err) + } + + bundleObject := getBundleSystemObjectDetails(uk) + if bundleObject == nil { return false, nil } - details := buildDiffDetails(marketObject, localObject) - recRelsDetail, err := checkRecommendedRelations(ctx, space, marketObject, localObject) + if bundleObject.GetInt64(revisionKey) <= localObject.GetInt64(revisionKey) { + return false, nil + } + details := buildDiffDetails(bundleObject, localObject) + + recRelsDetail, err := checkRecommendedRelations(ctx, space, bundleObject, localObject) if err != nil { log.Error("failed to check recommended relations", zap.Error(err)) } @@ -107,7 +113,7 @@ func reviseSystemObject(ctx context.Context, log logger.CtxLogger, space depende } if details.Len() > 0 { - log.Debug("updating system object", zap.String("source", source), zap.String("space", space.Id())) + log.Debug("updating system object", zap.String("key", uk.InternalKey()), zap.String("space", space.Id())) if err := space.DoCtx(ctx, localObject.GetString(bundle.RelationKeyId), func(sb smartblock.SmartBlock) error { st := sb.NewState() for key, value := range details.Iterate() { @@ -115,25 +121,34 @@ func reviseSystemObject(ctx context.Context, log logger.CtxLogger, space depende } return sb.Apply(st) }); err != nil { - return true, fmt.Errorf("failed to update system object %s in space %s: %w", source, space.Id(), err) + return true, fmt.Errorf("failed to update system object '%s' in space '%s': %w", uk.InternalKey(), space.Id(), err) } } return true, nil } -func isSystemObject(details *domain.Details) bool { - rawKey := details.GetString(bundle.RelationKeyUniqueKey) - uk, err := domain.UnmarshalUniqueKey(rawKey) - if err != nil { - return false - } +// getBundleSystemObjectDetails returns nil if the object with provided unique key is not either system relation or system type +func getBundleSystemObjectDetails(uk domain.UniqueKey) *domain.Details { switch uk.SmartblockType() { case coresb.SmartBlockTypeObjectType: - return lo.Contains(bundle.SystemTypes, domain.TypeKey(uk.InternalKey())) + typeKey := domain.TypeKey(uk.InternalKey()) + if !lo.Contains(bundle.SystemTypes, typeKey) { + // non system object type, no need to revise + return nil + } + objectType := bundle.MustGetType(typeKey) + return (&relationutils.ObjectType{ObjectType: objectType}).BundledTypeDetails() case coresb.SmartBlockTypeRelation: - return lo.Contains(bundle.SystemRelations, domain.RelationKey(uk.InternalKey())) + relationKey := domain.RelationKey(uk.InternalKey()) + if !lo.Contains(bundle.SystemRelations, relationKey) { + // non system relation, no need to revise + return nil + } + relation := bundle.MustGetRelation(relationKey) + return (&relationutils.Relation{Relation: relation}).ToDetails() + default: + return nil } - return false } func buildDiffDetails(origin, current *domain.Details) *domain.Details { diff --git a/space/internal/components/migration/systemobjectreviser/systemobjectreviser_test.go b/space/internal/components/migration/systemobjectreviser/systemobjectreviser_test.go index 191863f56..cce8fb771 100644 --- a/space/internal/components/migration/systemobjectreviser/systemobjectreviser_test.go +++ b/space/internal/components/migration/systemobjectreviser/systemobjectreviser_test.go @@ -23,23 +23,13 @@ func TestMigration_Run(t *testing.T) { store.AddObjects(t, "space1", []objectstore.TestObject{ { bundle.RelationKeySpaceId: domain.String("space1"), - bundle.RelationKeyRelationFormat: domain.Int64(int64(model.RelationFormat_checkbox)), + bundle.RelationKeyRelationFormat: domain.Int64(int64(model.RelationFormat_object)), bundle.RelationKeyLayout: domain.Int64(int64(model.ObjectType_relation)), bundle.RelationKeyId: domain.String("id1"), - bundle.RelationKeyIsHidden: domain.Bool(true), - bundle.RelationKeyRevision: domain.Int64(1), - bundle.RelationKeyUniqueKey: domain.String(bundle.RelationKeyDone.URL()), - bundle.RelationKeySourceObject: domain.String(bundle.RelationKeyDone.BundledURL()), - }, - }) - marketPlace := objectstore.NewStoreFixture(t) - marketPlace.AddObjects(t, addr.AnytypeMarketplaceWorkspace, []objectstore.TestObject{ - { - bundle.RelationKeySpaceId: domain.String(addr.AnytypeMarketplaceWorkspace), - bundle.RelationKeyRelationFormat: domain.Int64(int64(model.RelationFormat_checkbox)), - bundle.RelationKeyLayout: domain.Int64(int64(model.ObjectType_relation)), - bundle.RelationKeyId: domain.String(bundle.RelationKeyDone.BundledURL()), - bundle.RelationKeyRevision: domain.Int64(2), + bundle.RelationKeyIsHidden: domain.Bool(true), // bundle = false + bundle.RelationKeyRevision: domain.Int64(1), // bundle = 3 + bundle.RelationKeyUniqueKey: domain.String(bundle.RelationKeyBacklinks.URL()), + bundle.RelationKeySourceObject: domain.String(bundle.RelationKeyBacklinks.BundledURL()), }, }) fixer := &Migration{} @@ -52,7 +42,7 @@ func TestMigration_Run(t *testing.T) { spc.EXPECT().DoCtx(ctx, "id1", mock.Anything).Return(nil).Times(1) // when - migrated, toMigrate, err := fixer.Run(ctx, log, store.SpaceIndex("space1"), marketPlace.SpaceIndex(addr.AnytypeMarketplaceWorkspace), spc) + migrated, toMigrate, err := fixer.Run(ctx, log, store.SpaceIndex("space1"), spc) // then assert.NoError(t, err) @@ -63,7 +53,7 @@ func TestMigration_Run(t *testing.T) { func TestReviseSystemObject(t *testing.T) { ctx := context.Background() - log := logger.NewNamed("tesr") + log := logger.NewNamed("test") marketObjects := map[string]*domain.Details{ "_otnote": domain.NewDetailsFromMap(map[domain.RelationKey]domain.Value{revisionKey: domain.Int64(3)}), "_otpage": domain.NewDetailsFromMap(map[domain.RelationKey]domain.Value{revisionKey: domain.Int64(2)}), @@ -77,16 +67,19 @@ func TestReviseSystemObject(t *testing.T) { t.Run("system object type is updated if revision is higher", func(t *testing.T) { // given objectType := domain.NewDetailsFromMap(map[domain.RelationKey]domain.Value{ - bundle.RelationKeyRevision: domain.Int64(1), - bundle.RelationKeySourceObject: domain.String("_otnote"), - bundle.RelationKeyUniqueKey: domain.String("ot-note"), + bundle.RelationKeyRevision: domain.Int64(bundle.MustGetType(bundle.TypeKeyFile).Revision - 1), + bundle.RelationKeySourceObject: domain.String("_otfile"), + bundle.RelationKeyUniqueKey: domain.String("ot-file"), }) space := mock_space.NewMockSpace(t) space.EXPECT().DoCtx(mock.Anything, mock.Anything, mock.Anything).Times(1).Return(nil) space.EXPECT().Id().Times(1).Return("") + space.EXPECT().DeriveObjectID(mock.Anything, mock.Anything).RunAndReturn(func(_ context.Context, key domain.UniqueKey) (string, error) { + return addr.ObjectTypeKeyToIdPrefix + key.InternalKey(), nil + }).Maybe() // when - toRevise, err := reviseSystemObject(ctx, log, space, objectType, marketObjects) + toRevise, err := reviseObject(ctx, log, space, objectType) // then assert.NoError(t, err) @@ -95,16 +88,19 @@ func TestReviseSystemObject(t *testing.T) { t.Run("system object type is updated if no revision is set", func(t *testing.T) { // given - objectType := domain.NewDetailsFromMap(map[domain.RelationKey]domain.Value{ - bundle.RelationKeySourceObject: domain.String("_otpage"), - bundle.RelationKeyUniqueKey: domain.String("ot-page"), + objectType := domain.NewDetailsFromMap(map[domain.RelationKey]domain.Value{ // bundle Audio type revision = 1 + bundle.RelationKeySourceObject: domain.String("_otaudio"), + bundle.RelationKeyUniqueKey: domain.String("ot-audio"), }) space := mock_space.NewMockSpace(t) space.EXPECT().DoCtx(mock.Anything, mock.Anything, mock.Anything).Times(1).Return(nil) space.EXPECT().Id().Times(1).Return("") + space.EXPECT().DeriveObjectID(mock.Anything, mock.Anything).RunAndReturn(func(_ context.Context, key domain.UniqueKey) (string, error) { + return addr.ObjectTypeKeyToIdPrefix + key.InternalKey(), nil + }).Maybe() // when - toRevise, err := reviseSystemObject(ctx, log, space, objectType, marketObjects) + toRevise, err := reviseObject(ctx, log, space, objectType) // then assert.NoError(t, err) @@ -119,7 +115,7 @@ func TestReviseSystemObject(t *testing.T) { space := mock_space.NewMockSpace(t) // if unexpected space.Do will be called, test will fail // when - toRevise, err := reviseSystemObject(ctx, log, space, objectType, marketObjects) + toRevise, err := reviseObject(ctx, log, space, objectType) // then assert.NoError(t, err) @@ -135,7 +131,7 @@ func TestReviseSystemObject(t *testing.T) { space := mock_space.NewMockSpace(t) // if unexpected space.Do will be called, test will fail // when - toRevise, err := reviseSystemObject(ctx, log, space, objectType, marketObjects) + toRevise, err := reviseObject(ctx, log, space, objectType) // then assert.NoError(t, err) @@ -145,14 +141,14 @@ func TestReviseSystemObject(t *testing.T) { t.Run("system object type with same revision is not updated", func(t *testing.T) { // given objectType := domain.NewDetailsFromMap(map[domain.RelationKey]domain.Value{ - bundle.RelationKeyRevision: domain.Int64(3), - bundle.RelationKeySourceObject: domain.String("_otnote"), - bundle.RelationKeyUniqueKey: domain.String("ot-note"), + bundle.RelationKeyRevision: domain.Int64(bundle.MustGetType(bundle.TypeKeyImage).Revision), + bundle.RelationKeySourceObject: domain.String("_otimage"), + bundle.RelationKeyUniqueKey: domain.String("ot-image"), }) space := mock_space.NewMockSpace(t) // if unexpected space.Do will be called, test will fail // when - toRevise, err := reviseSystemObject(ctx, log, space, objectType, marketObjects) + toRevise, err := reviseObject(ctx, log, space, objectType) // then assert.NoError(t, err) @@ -162,16 +158,16 @@ func TestReviseSystemObject(t *testing.T) { t.Run("system relation is updated if revision is higher", func(t *testing.T) { // given rel := domain.NewDetailsFromMap(map[domain.RelationKey]domain.Value{ - bundle.RelationKeyRevision: domain.Int64(1), - bundle.RelationKeySourceObject: domain.String("_brdescription"), - bundle.RelationKeyUniqueKey: domain.String("rel-description"), + bundle.RelationKeyRevision: domain.Int64(bundle.MustGetRelation(bundle.RelationKeyGlobalName).Revision - 1), + bundle.RelationKeySourceObject: domain.String("_brglobalName"), + bundle.RelationKeyUniqueKey: domain.String("rel-globalName"), }) space := mock_space.NewMockSpace(t) space.EXPECT().DoCtx(mock.Anything, mock.Anything, mock.Anything).Times(1).Return(nil) space.EXPECT().Id().Times(1).Return("") // when - toRevise, err := reviseSystemObject(ctx, log, space, rel, marketObjects) + toRevise, err := reviseObject(ctx, log, space, rel) // then assert.NoError(t, err) @@ -180,16 +176,16 @@ func TestReviseSystemObject(t *testing.T) { t.Run("system relation is updated if no revision is set", func(t *testing.T) { // given - rel := domain.NewDetailsFromMap(map[domain.RelationKey]domain.Value{ - bundle.RelationKeySourceObject: domain.String("_brid"), - bundle.RelationKeyUniqueKey: domain.String("rel-id"), + rel := domain.NewDetailsFromMap(map[domain.RelationKey]domain.Value{ // done revision = 1 + bundle.RelationKeySourceObject: domain.String("_brdone"), + bundle.RelationKeyUniqueKey: domain.String("rel-done"), }) space := mock_space.NewMockSpace(t) space.EXPECT().DoCtx(mock.Anything, mock.Anything, mock.Anything).Times(1).Return(nil) space.EXPECT().Id().Times(1).Return("") // when - toRevise, err := reviseSystemObject(ctx, log, space, rel, marketObjects) + toRevise, err := reviseObject(ctx, log, space, rel) // then assert.NoError(t, err) @@ -204,7 +200,7 @@ func TestReviseSystemObject(t *testing.T) { space := mock_space.NewMockSpace(t) // if unexpected space.Do will be called, test will fail // when - toRevise, err := reviseSystemObject(ctx, log, space, rel, marketObjects) + toRevise, err := reviseObject(ctx, log, space, rel) // then assert.NoError(t, err) @@ -221,7 +217,7 @@ func TestReviseSystemObject(t *testing.T) { space := mock_space.NewMockSpace(t) // if unexpected space.Do will be called, test will fail // when - toRevise, err := reviseSystemObject(ctx, log, space, rel, marketObjects) + toRevise, err := reviseObject(ctx, log, space, rel) // then assert.NoError(t, err) @@ -231,14 +227,14 @@ func TestReviseSystemObject(t *testing.T) { t.Run("system relation with same revision is not updated", func(t *testing.T) { // given rel := domain.NewDetailsFromMap(map[domain.RelationKey]domain.Value{ - bundle.RelationKeyRevision: domain.Int64(3), - bundle.RelationKeySourceObject: domain.String("_brisReadonly"), - bundle.RelationKeyUniqueKey: domain.String("rel-isReadonly"), + bundle.RelationKeyRevision: domain.Int64(bundle.MustGetRelation(bundle.RelationKeyBacklinks).Revision), + bundle.RelationKeySourceObject: domain.String("_brbacklinks"), + bundle.RelationKeyUniqueKey: domain.String("rel-backlinks"), }) space := mock_space.NewMockSpace(t) // if unexpected space.Do will be called, test will fail // when - toRevise, err := reviseSystemObject(ctx, log, space, rel, marketObjects) + toRevise, err := reviseObject(ctx, log, space, rel) // then assert.NoError(t, err) @@ -248,17 +244,17 @@ func TestReviseSystemObject(t *testing.T) { t.Run("relation with absent maxCount is updated", func(t *testing.T) { // given rel := domain.NewDetailsFromMap(map[domain.RelationKey]domain.Value{ - bundle.RelationKeyRevision: domain.Int64(2), - bundle.RelationKeySourceObject: domain.String("_brisReadonly"), - bundle.RelationKeyUniqueKey: domain.String("rel-isReadonly"), - bundle.RelationKeyRelationMaxCount: domain.Int64(1), + bundle.RelationKeyRevision: domain.Int64(bundle.MustGetRelation(bundle.RelationKeyBacklinks).Revision - 1), + bundle.RelationKeySourceObject: domain.String("_brbacklinks"), + bundle.RelationKeyUniqueKey: domain.String("rel-backlinks"), + bundle.RelationKeyRelationMaxCount: domain.Int64(1), // maxCount of bundle backlinks = 0 }) space := mock_space.NewMockSpace(t) space.EXPECT().DoCtx(mock.Anything, mock.Anything, mock.Anything).Times(1).Return(nil) space.EXPECT().Id().Times(1).Return("") // when - toRevise, err := reviseSystemObject(ctx, log, space, rel, marketObjects) + toRevise, err := reviseObject(ctx, log, space, rel) // then assert.NoError(t, err) @@ -268,9 +264,9 @@ func TestReviseSystemObject(t *testing.T) { t.Run("recommendedRelations list is updated", func(t *testing.T) { // given rel := domain.NewDetailsFromMap(map[domain.RelationKey]domain.Value{ - bundle.RelationKeyRevision: domain.Int64(1), - bundle.RelationKeySourceObject: domain.String("_otpage"), - bundle.RelationKeyUniqueKey: domain.String("ot-page"), + bundle.RelationKeyRevision: domain.Int64(bundle.MustGetType(bundle.TypeKeyImage).Revision - 1), + bundle.RelationKeySourceObject: domain.String("_otimage"), + bundle.RelationKeyUniqueKey: domain.String("ot-image"), bundle.RelationKeyRecommendedRelations: domain.StringList([]string{"rel-name"}), }) space := mock_space.NewMockSpace(t) @@ -281,36 +277,13 @@ func TestReviseSystemObject(t *testing.T) { }).Maybe() // when - marketObjects["_otpage"].SetStringList("recommendedRelations", []string{"_brname", "_brorigin"}) - toRevise, err := reviseSystemObject(ctx, log, space, rel, marketObjects) + toRevise, err := reviseObject(ctx, log, space, rel) // then assert.NoError(t, err) assert.True(t, toRevise) }) - t.Run("recommendedRelations list is not updated", func(t *testing.T) { - // given - rel := domain.NewDetailsFromMap(map[domain.RelationKey]domain.Value{ - bundle.RelationKeyRevision: domain.Int64(2), - bundle.RelationKeySourceObject: domain.String("_otpage"), - bundle.RelationKeyUniqueKey: domain.String("ot-page"), - bundle.RelationKeyRecommendedRelations: domain.StringList([]string{"rel-name", "rel-tag"}), - }) - space := mock_space.NewMockSpace(t) - space.EXPECT().DeriveObjectID(mock.Anything, mock.Anything).RunAndReturn(func(_ context.Context, key domain.UniqueKey) (string, error) { - return addr.ObjectTypeKeyToIdPrefix + key.InternalKey(), nil - }).Maybe() - - // when - marketObjects["_otpage"].SetStringList("recommendedRelations", []string{"_brname", "_brtag"}) - toRevise, err := reviseSystemObject(ctx, log, space, rel, marketObjects) - - // then - assert.NoError(t, err) - assert.False(t, toRevise) - }) - t.Run("recommendedRelations list is updated by not system relations", func(t *testing.T) { // given rel := domain.NewDetailsFromMap(map[domain.RelationKey]domain.Value{ @@ -326,7 +299,7 @@ func TestReviseSystemObject(t *testing.T) { // when marketObjects["_otpage"].SetStringList("recommendedRelations", []string{"_brname", "_brtag"}) - toRevise, err := reviseSystemObject(ctx, log, space, rel, marketObjects) + toRevise, err := reviseObject(ctx, log, space, rel) // then assert.NoError(t, err) From afd627364c72bcbea79636733fed0b6a024538b7 Mon Sep 17 00:00:00 2001 From: kirillston Date: Thu, 19 Dec 2024 21:11:51 +0300 Subject: [PATCH 053/195] GO-4444 Delete iface with no use --- .../migration/systemobjectreviser/systemobjectreviser.go | 5 ----- 1 file changed, 5 deletions(-) diff --git a/space/internal/components/migration/systemobjectreviser/systemobjectreviser.go b/space/internal/components/migration/systemobjectreviser/systemobjectreviser.go index 40656cbfc..a57848dc2 100644 --- a/space/internal/components/migration/systemobjectreviser/systemobjectreviser.go +++ b/space/internal/components/migration/systemobjectreviser/systemobjectreviser.go @@ -14,7 +14,6 @@ import ( "github.com/anyproto/anytype-heart/core/block/editor/smartblock" "github.com/anyproto/anytype-heart/core/domain" "github.com/anyproto/anytype-heart/core/relationutils" - "github.com/anyproto/anytype-heart/core/session" "github.com/anyproto/anytype-heart/pkg/lib/bundle" coresb "github.com/anyproto/anytype-heart/pkg/lib/core/smartblock" "github.com/anyproto/anytype-heart/pkg/lib/database" @@ -24,10 +23,6 @@ import ( "github.com/anyproto/anytype-heart/util/slice" ) -type detailsSettable interface { - SetDetails(ctx session.Context, details []*model.Detail, showEvent bool) (err error) -} - const MName = "SystemObjectReviser" const revisionKey = bundle.RelationKeyRevision From 9c23630758a04e72557b7b8867a86bab11e94f51 Mon Sep 17 00:00:00 2001 From: Jannis Metrikat <120120832+jmetrikat@users.noreply.github.com> Date: Thu, 19 Dec 2024 22:00:31 +0100 Subject: [PATCH 054/195] GO-4459 Harden auth tests and pass gin.Request.Context in handlers.go --- cmd/api/docs/docs.go | 6 +- cmd/api/docs/swagger.json | 6 +- cmd/api/docs/swagger.yaml | 6 +- cmd/api/handlers.go | 57 +++++++-------- cmd/api/handlers_test.go | 147 ++++++++++++++++++++++++++++++-------- cmd/api/schemas.go | 9 +++ 6 files changed, 162 insertions(+), 69 deletions(-) diff --git a/cmd/api/docs/docs.go b/cmd/api/docs/docs.go index 6dc42526c..85896294c 100644 --- a/cmd/api/docs/docs.go +++ b/cmd/api/docs/docs.go @@ -75,7 +75,7 @@ const docTemplate = `{ { "type": "string", "description": "The challenge ID", - "name": "challengeId", + "name": "challenge_id", "in": "query", "required": true } @@ -1321,7 +1321,7 @@ const docTemplate = `{ }, "icon": { "type": "string", - "example": "data:image/png;base64, \u003cbase64-encoded-image\u003e" + "example": "http://127.0.0.1:31006/image/bafybeieptz5hvcy6txplcvphjbbh5yjc2zqhmihs3owkh5oab4ezauzqay?width=100" }, "id": { "type": "string", @@ -1378,7 +1378,7 @@ const docTemplate = `{ }, "icon": { "type": "string", - "example": "data:image/png;base64, \u003cbase64-encoded-image\u003e" + "example": "http://127.0.0.1:31006/image/bafybeieptz5hvcy6txplcvphjbbh5yjc2zqhmihs3owkh5oab4ezauzqay?width=100" }, "id": { "type": "string", diff --git a/cmd/api/docs/swagger.json b/cmd/api/docs/swagger.json index 8b5f4a627..63bbbca07 100644 --- a/cmd/api/docs/swagger.json +++ b/cmd/api/docs/swagger.json @@ -69,7 +69,7 @@ { "type": "string", "description": "The challenge ID", - "name": "challengeId", + "name": "challenge_id", "in": "query", "required": true } @@ -1315,7 +1315,7 @@ }, "icon": { "type": "string", - "example": "data:image/png;base64, \u003cbase64-encoded-image\u003e" + "example": "http://127.0.0.1:31006/image/bafybeieptz5hvcy6txplcvphjbbh5yjc2zqhmihs3owkh5oab4ezauzqay?width=100" }, "id": { "type": "string", @@ -1372,7 +1372,7 @@ }, "icon": { "type": "string", - "example": "data:image/png;base64, \u003cbase64-encoded-image\u003e" + "example": "http://127.0.0.1:31006/image/bafybeieptz5hvcy6txplcvphjbbh5yjc2zqhmihs3owkh5oab4ezauzqay?width=100" }, "id": { "type": "string", diff --git a/cmd/api/docs/swagger.yaml b/cmd/api/docs/swagger.yaml index 846e14d69..96613a99b 100644 --- a/cmd/api/docs/swagger.yaml +++ b/cmd/api/docs/swagger.yaml @@ -223,7 +223,7 @@ definitions: example: bafyreie4qcl3wczb4cw5hrfyycikhjyh6oljdis3ewqrk5boaav3sbwqya type: string icon: - example: data:image/png;base64, + example: http://127.0.0.1:31006/image/bafybeieptz5hvcy6txplcvphjbbh5yjc2zqhmihs3owkh5oab4ezauzqay?width=100 type: string id: example: bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1 @@ -265,7 +265,7 @@ definitions: example: john.any type: string icon: - example: data:image/png;base64, + example: http://127.0.0.1:31006/image/bafybeieptz5hvcy6txplcvphjbbh5yjc2zqhmihs3owkh5oab4ezauzqay?width=100 type: string id: example: _participant_bafyreigyfkt6rbv24sbv5aq2hko1bhmv5xxlf22b4bypdu6j7hnphm3psq_23me69r569oi1_AAjEaEwPF4nkEh9AWkqEnzcQ8HziBB4ETjiTpvRCQvWnSMDZ @@ -360,7 +360,7 @@ paths: type: string - description: The challenge ID in: query - name: challengeId + name: challenge_id required: true type: string produces: diff --git a/cmd/api/handlers.go b/cmd/api/handlers.go index 688925fd9..076ecadfb 100644 --- a/cmd/api/handlers.go +++ b/cmd/api/handlers.go @@ -1,7 +1,6 @@ package api import ( - "context" "crypto/rand" "math/big" "net/http" @@ -43,15 +42,13 @@ type AddMessageRequest struct { // @Failure 502 {object} ServerError "Internal server error" // @Router /auth/displayCode [post] func (a *ApiServer) authDisplayCodeHandler(c *gin.Context) { - // Call AccountLocalLinkNewChallenge to display code modal - ctx := context.Background() - resp := a.mw.AccountLocalLinkNewChallenge(ctx, &pb.RpcAccountLocalLinkNewChallengeRequest{AppName: "api-test"}) + resp := a.mw.AccountLocalLinkNewChallenge(c.Request.Context(), &pb.RpcAccountLocalLinkNewChallengeRequest{AppName: "api-test"}) if resp.Error.Code != pb.RpcAccountLocalLinkNewChallengeResponseError_NULL { c.JSON(http.StatusInternalServerError, gin.H{"message": "Failed to generate a new challenge."}) } - c.JSON(http.StatusOK, gin.H{"challengeId": resp.ChallengeId}) + c.JSON(http.StatusOK, AuthDisplayCodeResponse{ChallengeId: resp.ChallengeId}) } // authTokenHandler retrieves an authentication token using a code and challenge ID @@ -60,16 +57,16 @@ func (a *ApiServer) authDisplayCodeHandler(c *gin.Context) { // @Tags auth // @Accept json // @Produce json -// @Param code query string true "The code retrieved from Anytype Desktop app" -// @Param challengeId query string true "The challenge ID" -// @Success 200 {object} map[string]string "Access and refresh tokens" -// @Failure 400 {object} ValidationError "Invalid input" -// @Failure 502 {object} ServerError "Internal server error" +// @Param code query string true "The code retrieved from Anytype Desktop app" +// @Param challenge_id query string true "The challenge ID" +// @Success 200 {object} map[string]string "Access and refresh tokens" +// @Failure 400 {object} ValidationError "Invalid input" +// @Failure 502 {object} ServerError "Internal server error" // @Router /auth/token [get] func (a *ApiServer) authTokenHandler(c *gin.Context) { // Call AccountLocalLinkSolveChallenge to retrieve session token and app key - resp := a.mw.AccountLocalLinkSolveChallenge(context.Background(), &pb.RpcAccountLocalLinkSolveChallengeRequest{ - ChallengeId: c.Query("challengeId"), + resp := a.mw.AccountLocalLinkSolveChallenge(c.Request.Context(), &pb.RpcAccountLocalLinkSolveChallengeRequest{ + ChallengeId: c.Query("challenge_id"), Answer: c.Query("code"), }) @@ -78,9 +75,9 @@ func (a *ApiServer) authTokenHandler(c *gin.Context) { return } - c.JSON(http.StatusOK, gin.H{ - "sessionToken": resp.SessionToken, - "appKey": resp.AppKey, + c.JSON(http.StatusOK, AuthTokenResponse{ + SessionToken: resp.SessionToken, + AppKey: resp.AppKey, }) } @@ -101,8 +98,8 @@ func (a *ApiServer) getSpacesHandler(c *gin.Context) { offset := c.GetInt("offset") limit := c.GetInt("limit") - // Call ObjectSearch for all objects of type spaceView with pagination - resp := a.mw.ObjectSearch(context.Background(), &pb.RpcObjectSearchRequest{ + // Call ObjectSearch for all objects of type spaceView + resp := a.mw.ObjectSearch(c.Request.Context(), &pb.RpcObjectSearchRequest{ SpaceId: a.accountInfo.TechSpaceId, Filters: []*model.BlockContentDataviewFilter{ { @@ -184,7 +181,7 @@ func (a *ApiServer) createSpaceHandler(c *gin.Context) { } // Create new workspace with a random icon and import default use case - resp := a.mw.WorkspaceCreate(context.Background(), &pb.RpcWorkspaceCreateRequest{ + resp := a.mw.WorkspaceCreate(c.Request.Context(), &pb.RpcWorkspaceCreateRequest{ Details: &types.Struct{ Fields: map[string]*types.Value{ "iconOption": {Kind: &types.Value_NumberValue{NumberValue: float64(iconOption.Int64())}}, @@ -226,7 +223,7 @@ func (a *ApiServer) getSpaceMembersHandler(c *gin.Context) { limit := c.GetInt("limit") // Call ObjectSearch for all objects of type participant - resp := a.mw.ObjectSearch(context.Background(), &pb.RpcObjectSearchRequest{ + resp := a.mw.ObjectSearch(c.Request.Context(), &pb.RpcObjectSearchRequest{ SpaceId: spaceId, Filters: []*model.BlockContentDataviewFilter{ { @@ -300,7 +297,7 @@ func (a *ApiServer) getObjectsForSpaceHandler(c *gin.Context) { offset := c.GetInt("offset") limit := c.GetInt("limit") - resp := a.mw.ObjectSearch(context.Background(), &pb.RpcObjectSearchRequest{ + resp := a.mw.ObjectSearch(c.Request.Context(), &pb.RpcObjectSearchRequest{ SpaceId: spaceId, Filters: []*model.BlockContentDataviewFilter{ { @@ -393,7 +390,7 @@ func (a *ApiServer) getObjectHandler(c *gin.Context) { spaceId := c.Param("space_id") objectId := c.Param("object_id") - resp := a.mw.ObjectShow(context.Background(), &pb.RpcObjectShowRequest{ + resp := a.mw.ObjectShow(c.Request.Context(), &pb.RpcObjectShowRequest{ SpaceId: spaceId, ObjectId: objectId, }) @@ -449,7 +446,7 @@ func (a *ApiServer) createObjectHandler(c *gin.Context) { return } - resp := a.mw.ObjectCreate(context.Background(), &pb.RpcObjectCreateRequest{ + resp := a.mw.ObjectCreate(c.Request.Context(), &pb.RpcObjectCreateRequest{ Details: &types.Struct{ Fields: map[string]*types.Value{ "name": {Kind: &types.Value_StringValue{StringValue: request.Name}}, @@ -523,7 +520,7 @@ func (a *ApiServer) getObjectTypesHandler(c *gin.Context) { offset := c.GetInt("offset") limit := c.GetInt("limit") - resp := a.mw.ObjectSearch(context.Background(), &pb.RpcObjectSearchRequest{ + resp := a.mw.ObjectSearch(c.Request.Context(), &pb.RpcObjectSearchRequest{ SpaceId: spaceId, Filters: []*model.BlockContentDataviewFilter{ { @@ -594,7 +591,7 @@ func (a *ApiServer) getObjectTypeTemplatesHandler(c *gin.Context) { limit := c.GetInt("limit") // First, determine the type ID of "ot-template" in the space - templateTypeIdResp := a.mw.ObjectSearch(context.Background(), &pb.RpcObjectSearchRequest{ + templateTypeIdResp := a.mw.ObjectSearch(c.Request.Context(), &pb.RpcObjectSearchRequest{ SpaceId: spaceId, Filters: []*model.BlockContentDataviewFilter{ { @@ -619,7 +616,7 @@ func (a *ApiServer) getObjectTypeTemplatesHandler(c *gin.Context) { templateTypeId := templateTypeIdResp.Records[0].Fields["id"].GetStringValue() // Then, search all objects of the template type and filter by the target object type - templateObjectsResp := a.mw.ObjectSearch(context.Background(), &pb.RpcObjectSearchRequest{ + templateObjectsResp := a.mw.ObjectSearch(c.Request.Context(), &pb.RpcObjectSearchRequest{ SpaceId: spaceId, Filters: []*model.BlockContentDataviewFilter{ { @@ -653,7 +650,7 @@ func (a *ApiServer) getObjectTypeTemplatesHandler(c *gin.Context) { // Finally, open each template and populate the response templates := make([]ObjectTemplate, 0, len(templateIds)) for _, templateId := range templateIds { - templateResp := a.mw.ObjectShow(context.Background(), &pb.RpcObjectShowRequest{ + templateResp := a.mw.ObjectShow(c.Request.Context(), &pb.RpcObjectShowRequest{ SpaceId: spaceId, ObjectId: templateId, }) @@ -695,7 +692,7 @@ func (a *ApiServer) getObjectsHandler(c *gin.Context) { limit := c.GetInt("limit") // First, call ObjectSearch for all objects of type spaceView - spaceResp := a.mw.ObjectSearch(context.Background(), &pb.RpcObjectSearchRequest{ + spaceResp := a.mw.ObjectSearch(c.Request.Context(), &pb.RpcObjectSearchRequest{ SpaceId: a.accountInfo.TechSpaceId, Filters: []*model.BlockContentDataviewFilter{ { @@ -770,7 +767,7 @@ func (a *ApiServer) getObjectsHandler(c *gin.Context) { searchResults := make([]Object, 0) for _, spaceRecord := range spaceResp.Records { spaceId := spaceRecord.Fields["targetSpaceId"].GetStringValue() - objectResp := a.mw.ObjectSearch(context.Background(), &pb.RpcObjectSearchRequest{ + objectResp := a.mw.ObjectSearch(c.Request.Context(), &pb.RpcObjectSearchRequest{ SpaceId: spaceId, Filters: filters, Sorts: []*model.BlockContentDataviewSort{{ @@ -864,7 +861,7 @@ func (a *ApiServer) getChatMessagesHandler(c *gin.Context) { return } - lastMessages := a.mw.ChatSubscribeLastMessages(context.Background(), &pb.RpcChatSubscribeLastMessagesRequest{ + lastMessages := a.mw.ChatSubscribeLastMessages(c.Request.Context(), &pb.RpcChatSubscribeLastMessagesRequest{ ChatObjectId: chatId, Limit: int32(limit), }) @@ -961,7 +958,7 @@ func (a *ApiServer) addChatMessageHandler(c *gin.Context) { return } - resp := a.mw.ChatAddMessage(context.Background(), &pb.RpcChatAddMessageRequest{ + resp := a.mw.ChatAddMessage(c.Request.Context(), &pb.RpcChatAddMessageRequest{ ChatObjectId: chatId, Message: &model.ChatMessage{ Id: "", diff --git a/cmd/api/handlers_test.go b/cmd/api/handlers_test.go index 873ec9c9b..6cd32a2ea 100644 --- a/cmd/api/handlers_test.go +++ b/cmd/api/handlers_test.go @@ -1,6 +1,7 @@ package api import ( + "encoding/json" "net/http" "net/http/httptest" "strings" @@ -75,6 +76,7 @@ func newFixture(t *testing.T) *fixture { func TestApiServer_AuthDisplayCodeHandler(t *testing.T) { t.Run("successful challenge creation", func(t *testing.T) { + // given fx := newFixture(t) fx.mwMock.On("AccountLocalLinkNewChallenge", mock.Anything, &pb.RpcAccountLocalLinkNewChallengeRequest{AppName: "api-test"}). @@ -83,58 +85,76 @@ func TestApiServer_AuthDisplayCodeHandler(t *testing.T) { Error: &pb.RpcAccountLocalLinkNewChallengeResponseError{Code: pb.RpcAccountLocalLinkNewChallengeResponseError_NULL}, }).Once() + // when req, _ := http.NewRequest("POST", "/v1/auth/displayCode", nil) w := httptest.NewRecorder() fx.router.ServeHTTP(w, req) + // then require.Equal(t, http.StatusOK, w.Code) - require.Contains(t, w.Body.String(), "mocked-challenge-id") + + var response AuthDisplayCodeResponse + err := json.Unmarshal(w.Body.Bytes(), &response) + require.NoError(t, err) + require.Equal(t, "mocked-challenge-id", response.ChallengeId) }) t.Run("failed challenge creation", func(t *testing.T) { + // given fx := newFixture(t) - // Mock middleware behavior fx.mwMock.On("AccountLocalLinkNewChallenge", mock.Anything, &pb.RpcAccountLocalLinkNewChallengeRequest{AppName: "api-test"}). Return(&pb.RpcAccountLocalLinkNewChallengeResponse{ Error: &pb.RpcAccountLocalLinkNewChallengeResponseError{Code: pb.RpcAccountLocalLinkNewChallengeResponseError_UNKNOWN_ERROR}, }).Once() + // when req, _ := http.NewRequest("POST", "/v1/auth/displayCode", nil) w := httptest.NewRecorder() fx.router.ServeHTTP(w, req) + // then require.Equal(t, http.StatusInternalServerError, w.Code) }) } func TestApiServer_AuthTokenHandler(t *testing.T) { t.Run("successful token retrieval", func(t *testing.T) { + // given fx := newFixture(t) + challengeId := "mocked-challenge-id" code := "mocked-code" + sessionToken := "mocked-session-token" + appKey := "mocked-app-key" - // Mock middleware behavior fx.mwMock.On("AccountLocalLinkSolveChallenge", mock.Anything, &pb.RpcAccountLocalLinkSolveChallengeRequest{ ChallengeId: challengeId, Answer: code, }). Return(&pb.RpcAccountLocalLinkSolveChallengeResponse{ - SessionToken: "mocked-session-token", - AppKey: "mocked-app-key", + SessionToken: sessionToken, + AppKey: appKey, Error: &pb.RpcAccountLocalLinkSolveChallengeResponseError{Code: pb.RpcAccountLocalLinkSolveChallengeResponseError_NULL}, }).Once() - req, _ := http.NewRequest("GET", "/v1/auth/token?challengeId="+challengeId+"&code="+code, nil) + // when + req, _ := http.NewRequest("GET", "/v1/auth/token?challenge_id="+challengeId+"&code="+code, nil) w := httptest.NewRecorder() fx.router.ServeHTTP(w, req) + // then require.Equal(t, http.StatusOK, w.Code) - require.Contains(t, w.Body.String(), "mocked-session-token") - require.Contains(t, w.Body.String(), "mocked-app-key") + + var response AuthTokenResponse + err := json.Unmarshal(w.Body.Bytes(), &response) + require.NoError(t, err) + require.Equal(t, sessionToken, response.SessionToken) + require.Equal(t, appKey, response.AppKey) }) t.Run("failed token retrieval", func(t *testing.T) { + // given fx := newFixture(t) challengeId := "mocked-challenge-id" code := "mocked-code" @@ -147,16 +167,19 @@ func TestApiServer_AuthTokenHandler(t *testing.T) { Error: &pb.RpcAccountLocalLinkSolveChallengeResponseError{Code: pb.RpcAccountLocalLinkSolveChallengeResponseError_UNKNOWN_ERROR}, }).Once() - req, _ := http.NewRequest("GET", "/v1/auth/token?challengeId="+challengeId+"&code="+code, nil) + // when + req, _ := http.NewRequest("GET", "/v1/auth/token?challenge_id="+challengeId+"&code="+code, nil) w := httptest.NewRecorder() fx.router.ServeHTTP(w, req) + // then require.Equal(t, http.StatusInternalServerError, w.Code) }) } func TestApiServer_GetSpacesHandler(t *testing.T) { t.Run("successful retrieval of spaces", func(t *testing.T) { + // given fx := newFixture(t) fx.accountInfo = &model.AccountInfo{TechSpaceId: "tech-space-id"} @@ -203,16 +226,19 @@ func TestApiServer_GetSpacesHandler(t *testing.T) { }, }, nil).Twice() + // when req, _ := http.NewRequest("GET", "/v1/spaces", nil) w := httptest.NewRecorder() fx.router.ServeHTTP(w, req) + // then require.Equal(t, http.StatusOK, w.Code) require.Contains(t, w.Body.String(), "My Workspace") require.Contains(t, w.Body.String(), "Another Workspace") }) t.Run("no spaces found", func(t *testing.T) { + // given fx := newFixture(t) fx.accountInfo = &model.AccountInfo{TechSpaceId: "tech-space-id"} @@ -222,16 +248,19 @@ func TestApiServer_GetSpacesHandler(t *testing.T) { Error: &pb.RpcObjectSearchResponseError{Code: pb.RpcObjectSearchResponseError_NULL}, }).Once() + // when req, _ := http.NewRequest("GET", "/v1/spaces", nil) w := httptest.NewRecorder() fx.router.ServeHTTP(w, req) + // then require.Equal(t, http.StatusNotFound, w.Code) }) } func TestApiServer_CreateSpaceHandler(t *testing.T) { t.Run("successful create space", func(t *testing.T) { + // given fx := newFixture(t) fx.mwMock.On("WorkspaceCreate", mock.Anything, mock.Anything). Return(&pb.RpcWorkspaceCreateResponse{ @@ -239,44 +268,53 @@ func TestApiServer_CreateSpaceHandler(t *testing.T) { SpaceId: "new-space-id", }).Once() + // when body := strings.NewReader(`{"name":"New Space"}`) req, _ := http.NewRequest("POST", "/v1/spaces", body) w := httptest.NewRecorder() fx.router.ServeHTTP(w, req) + // then require.Equal(t, http.StatusOK, w.Code) require.Contains(t, w.Body.String(), "new-space-id") }) t.Run("invalid JSON", func(t *testing.T) { + // given fx := newFixture(t) + // when body := strings.NewReader(`{invalid json}`) req, _ := http.NewRequest("POST", "/v1/spaces", body) w := httptest.NewRecorder() fx.router.ServeHTTP(w, req) + // then require.Equal(t, http.StatusBadRequest, w.Code) }) t.Run("failed workspace creation", func(t *testing.T) { + // given fx := newFixture(t) fx.mwMock.On("WorkspaceCreate", mock.Anything, mock.Anything). Return(&pb.RpcWorkspaceCreateResponse{ Error: &pb.RpcWorkspaceCreateResponseError{Code: pb.RpcWorkspaceCreateResponseError_UNKNOWN_ERROR}, }).Once() + // when body := strings.NewReader(`{"name":"Fail Space"}`) req, _ := http.NewRequest("POST", "/v1/spaces", body) w := httptest.NewRecorder() fx.router.ServeHTTP(w, req) + // then require.Equal(t, http.StatusInternalServerError, w.Code) }) } func TestApiServer_GetSpaceMembersHandler(t *testing.T) { t.Run("successfully get space members", func(t *testing.T) { + // given fx := newFixture(t) fx.mwMock.On("ObjectSearch", mock.Anything, mock.Anything). @@ -293,15 +331,18 @@ func TestApiServer_GetSpaceMembersHandler(t *testing.T) { Error: &pb.RpcObjectSearchResponseError{Code: pb.RpcObjectSearchResponseError_NULL}, }).Once() + // when req, _ := http.NewRequest("GET", "/v1/spaces/my-space/members", nil) w := httptest.NewRecorder() fx.router.ServeHTTP(w, req) + // then require.Equal(t, http.StatusOK, w.Code) require.Contains(t, w.Body.String(), "John Doe") }) t.Run("no members found", func(t *testing.T) { + // given fx := newFixture(t) fx.mwMock.On("ObjectSearch", mock.Anything, mock.Anything). @@ -310,16 +351,19 @@ func TestApiServer_GetSpaceMembersHandler(t *testing.T) { Error: &pb.RpcObjectSearchResponseError{Code: pb.RpcObjectSearchResponseError_NULL}, }).Once() + // when req, _ := http.NewRequest("GET", "/v1/spaces/empty-space/members", nil) w := httptest.NewRecorder() fx.router.ServeHTTP(w, req) + // then require.Equal(t, http.StatusNotFound, w.Code) }) } func TestApiServer_GetObjectsForSpaceHandler(t *testing.T) { t.Run("successfully get objects for a space", func(t *testing.T) { + // given fx := newFixture(t) fx.mwMock.On("ObjectSearch", mock.Anything, mock.Anything). @@ -355,15 +399,18 @@ func TestApiServer_GetObjectsForSpaceHandler(t *testing.T) { }, }, nil).Maybe() + // when req, _ := http.NewRequest("GET", "/v1/spaces/my-space/objects", nil) w := httptest.NewRecorder() fx.router.ServeHTTP(w, req) + // then require.Equal(t, http.StatusOK, w.Code) require.Contains(t, w.Body.String(), "My Object") }) t.Run("no objects found", func(t *testing.T) { + // given fx := newFixture(t) fx.mwMock.On("ObjectSearch", mock.Anything, mock.Anything). @@ -372,38 +419,42 @@ func TestApiServer_GetObjectsForSpaceHandler(t *testing.T) { Error: &pb.RpcObjectSearchResponseError{Code: pb.RpcObjectSearchResponseError_NULL}, }).Once() + // when req, _ := http.NewRequest("GET", "/v1/spaces/empty-space/objects", nil) w := httptest.NewRecorder() fx.router.ServeHTTP(w, req) + // then require.Equal(t, http.StatusNotFound, w.Code) }) } func TestApiServer_GetObjectHandler(t *testing.T) { t.Run("object found", func(t *testing.T) { + // given fx := newFixture(t) fx.mwMock.On("ObjectShow", mock.Anything, &pb.RpcObjectShowRequest{ SpaceId: "my-space", ObjectId: "obj-1", - }).Return(&pb.RpcObjectShowResponse{ - Error: &pb.RpcObjectShowResponseError{Code: pb.RpcObjectShowResponseError_NULL}, - ObjectView: &model.ObjectView{ - RootId: "root-1", - Details: []*model.ObjectViewDetailsSet{ - { - Details: &types.Struct{ - Fields: map[string]*types.Value{ - "name": pbtypes.String("Found Object"), - "type": pbtypes.String("basic-type-id"), - "iconEmoji": pbtypes.String("🔍"), + }). + Return(&pb.RpcObjectShowResponse{ + Error: &pb.RpcObjectShowResponseError{Code: pb.RpcObjectShowResponseError_NULL}, + ObjectView: &model.ObjectView{ + RootId: "root-1", + Details: []*model.ObjectViewDetailsSet{ + { + Details: &types.Struct{ + Fields: map[string]*types.Value{ + "name": pbtypes.String("Found Object"), + "type": pbtypes.String("basic-type-id"), + "iconEmoji": pbtypes.String("🔍"), + }, }, }, }, }, - }, - }, nil).Once() + }, nil).Once() // Type resolution mock fx.mwMock.On("ObjectSearch", mock.Anything, mock.Anything).Return(&pb.RpcObjectSearchResponse{ @@ -417,15 +468,18 @@ func TestApiServer_GetObjectHandler(t *testing.T) { }, }, nil).Once() + // when req, _ := http.NewRequest("GET", "/v1/spaces/my-space/objects/obj-1", nil) w := httptest.NewRecorder() fx.router.ServeHTTP(w, req) + // then require.Equal(t, http.StatusOK, w.Code) require.Contains(t, w.Body.String(), "Found Object") }) t.Run("object not found", func(t *testing.T) { + // given fx := newFixture(t) fx.mwMock.On("ObjectShow", mock.Anything, mock.Anything). @@ -433,16 +487,19 @@ func TestApiServer_GetObjectHandler(t *testing.T) { Error: &pb.RpcObjectShowResponseError{Code: pb.RpcObjectShowResponseError_NOT_FOUND}, }, nil).Once() + // when req, _ := http.NewRequest("GET", "/v1/spaces/my-space/objects/missing-obj", nil) w := httptest.NewRecorder() fx.router.ServeHTTP(w, req) + // then require.Equal(t, http.StatusNotFound, w.Code) }) } func TestApiServer_CreateObjectHandler(t *testing.T) { t.Run("successful object creation", func(t *testing.T) { + // given fx := newFixture(t) fx.mwMock.On("ObjectCreate", mock.Anything, mock.Anything). @@ -458,27 +515,33 @@ func TestApiServer_CreateObjectHandler(t *testing.T) { }, }).Once() + // when body := strings.NewReader(`{"name":"New Object","icon":"🆕","template_id":"","object_type_unique_key":"basic","with_chat":false}`) req, _ := http.NewRequest("POST", "/v1/spaces/my-space/objects", body) w := httptest.NewRecorder() fx.router.ServeHTTP(w, req) + // then require.Equal(t, http.StatusOK, w.Code) require.Contains(t, w.Body.String(), "new-obj-id") }) - t.Run("invalid JSON", func(t *testing.T) { + t.Run("invalid json", func(t *testing.T) { + // given fx := newFixture(t) + // when body := strings.NewReader(`{invalid json}`) req, _ := http.NewRequest("POST", "/v1/spaces/my-space/objects", body) w := httptest.NewRecorder() fx.router.ServeHTTP(w, req) + // then require.Equal(t, http.StatusBadRequest, w.Code) }) t.Run("creation error", func(t *testing.T) { + // given fx := newFixture(t) fx.mwMock.On("ObjectCreate", mock.Anything, mock.Anything). @@ -486,28 +549,38 @@ func TestApiServer_CreateObjectHandler(t *testing.T) { Error: &pb.RpcObjectCreateResponseError{Code: pb.RpcObjectCreateResponseError_UNKNOWN_ERROR}, }).Once() + // when body := strings.NewReader(`{"name":"Fail Object"}`) req, _ := http.NewRequest("POST", "/v1/spaces/my-space/objects", body) w := httptest.NewRecorder() fx.router.ServeHTTP(w, req) + // then require.Equal(t, http.StatusInternalServerError, w.Code) }) } func TestApiServer_UpdateObjectHandler(t *testing.T) { - fx := newFixture(t) + t.Run("not implemented", func(t *testing.T) { + // given + fx := newFixture(t) - body := strings.NewReader(`{"name":"Updated Object"}`) - req, _ := http.NewRequest("PUT", "/v1/spaces/my-space/objects/obj-1", body) - w := httptest.NewRecorder() - fx.router.ServeHTTP(w, req) + // when + body := strings.NewReader(`{"name":"Updated Object"}`) + req, _ := http.NewRequest("PUT", "/v1/spaces/my-space/objects/obj-1", body) + w := httptest.NewRecorder() + fx.router.ServeHTTP(w, req) - require.Equal(t, http.StatusNotImplemented, w.Code) + // then + require.Equal(t, http.StatusNotImplemented, w.Code) + }) + + // TODO: further tests } func TestApiServer_GetObjectTypesHandler(t *testing.T) { t.Run("types found", func(t *testing.T) { + // given fx := newFixture(t) fx.mwMock.On("ObjectSearch", mock.Anything, mock.Anything). @@ -525,15 +598,18 @@ func TestApiServer_GetObjectTypesHandler(t *testing.T) { Error: &pb.RpcObjectSearchResponseError{Code: pb.RpcObjectSearchResponseError_NULL}, }).Once() + // when req, _ := http.NewRequest("GET", "/v1/spaces/my-space/objectTypes", nil) w := httptest.NewRecorder() fx.router.ServeHTTP(w, req) + // then require.Equal(t, http.StatusOK, w.Code) require.Contains(t, w.Body.String(), "Type One") }) t.Run("no types found", func(t *testing.T) { + // given fx := newFixture(t) fx.mwMock.On("ObjectSearch", mock.Anything, mock.Anything). @@ -542,16 +618,19 @@ func TestApiServer_GetObjectTypesHandler(t *testing.T) { Error: &pb.RpcObjectSearchResponseError{Code: pb.RpcObjectSearchResponseError_NULL}, }).Once() + // when req, _ := http.NewRequest("GET", "/v1/spaces/my-space/objectTypes", nil) w := httptest.NewRecorder() fx.router.ServeHTTP(w, req) + // then require.Equal(t, http.StatusNotFound, w.Code) }) } func TestApiServer_GetObjectTypeTemplatesHandler(t *testing.T) { t.Run("templates found", func(t *testing.T) { + // given fx := newFixture(t) // Mock template type search @@ -580,7 +659,7 @@ func TestApiServer_GetObjectTypeTemplatesHandler(t *testing.T) { Error: &pb.RpcObjectSearchResponseError{Code: pb.RpcObjectSearchResponseError_NULL}, }).Once() - // Mock template show + // Mock object show for template details fx.mwMock.On("ObjectShow", mock.Anything, mock.Anything).Return(&pb.RpcObjectShowResponse{ Error: &pb.RpcObjectShowResponseError{Code: pb.RpcObjectShowResponseError_NULL}, ObjectView: &model.ObjectView{ @@ -597,15 +676,18 @@ func TestApiServer_GetObjectTypeTemplatesHandler(t *testing.T) { }, }, nil).Once() + // when req, _ := http.NewRequest("GET", "/v1/spaces/my-space/objectTypes/target-type-id/templates", nil) w := httptest.NewRecorder() fx.router.ServeHTTP(w, req) + // then require.Equal(t, http.StatusOK, w.Code) require.Contains(t, w.Body.String(), "Template Name") }) t.Run("no template type found", func(t *testing.T) { + // given fx := newFixture(t) fx.mwMock.On("ObjectSearch", mock.Anything, mock.Anything). @@ -614,16 +696,19 @@ func TestApiServer_GetObjectTypeTemplatesHandler(t *testing.T) { Error: &pb.RpcObjectSearchResponseError{Code: pb.RpcObjectSearchResponseError_NULL}, }).Once() + // when req, _ := http.NewRequest("GET", "/v1/spaces/my-space/objectTypes/missing-type-id/templates", nil) w := httptest.NewRecorder() fx.router.ServeHTTP(w, req) + // then require.Equal(t, http.StatusNotFound, w.Code) }) } func TestApiServer_GetObjectsHandler(t *testing.T) { t.Run("objects found globally", func(t *testing.T) { + // given fx := newFixture(t) // Mock retrieving spaces first @@ -656,10 +741,12 @@ func TestApiServer_GetObjectsHandler(t *testing.T) { Error: &pb.RpcObjectSearchResponseError{Code: pb.RpcObjectSearchResponseError_NULL}, }).Once() + // when req, _ := http.NewRequest("GET", "/v1/objects", nil) w := httptest.NewRecorder() fx.router.ServeHTTP(w, req) + // then require.Equal(t, http.StatusOK, w.Code) require.Contains(t, w.Body.String(), "Global Object") }) diff --git a/cmd/api/schemas.go b/cmd/api/schemas.go index 2ef084315..b3f32bbe1 100644 --- a/cmd/api/schemas.go +++ b/cmd/api/schemas.go @@ -1,5 +1,14 @@ package api +type AuthDisplayCodeResponse struct { + ChallengeId string `json:"challenge_id" example:"67647f5ecda913e9a2e11b26"` +} + +type AuthTokenResponse struct { + SessionToken string `json:"session_token" example:""` + AppKey string `json:"app_key" example:""` +} + type Space struct { Type string `json:"type" example:"space"` Id string `json:"id" example:"bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1"` From 02d1c0906fdc8b66e8d8a3c7de48723e5e1712cb Mon Sep 17 00:00:00 2001 From: Jannis Metrikat <120120832+jmetrikat@users.noreply.github.com> Date: Thu, 19 Dec 2024 23:31:11 +0100 Subject: [PATCH 055/195] GO-4459 Refactor space tests --- cmd/api/docs/docs.go | 142 +++++++++++++++++++++----------- cmd/api/docs/swagger.json | 142 +++++++++++++++++++++----------- cmd/api/docs/swagger.yaml | 106 +++++++++++++++--------- cmd/api/handlers.go | 43 +++++----- cmd/api/handlers_test.go | 169 ++++++++++++++++++++++++++++++++------ cmd/api/main.go | 2 +- cmd/api/schemas.go | 17 +++- 7 files changed, 435 insertions(+), 186 deletions(-) diff --git a/cmd/api/docs/docs.go b/cmd/api/docs/docs.go index 85896294c..ae8c64d50 100644 --- a/cmd/api/docs/docs.go +++ b/cmd/api/docs/docs.go @@ -38,9 +38,9 @@ const docTemplate = `{ "summary": "Open a modal window with a code in Anytype Desktop app", "responses": { "200": { - "description": "Success", + "description": "Challenge ID", "schema": { - "type": "string" + "$ref": "#/definitions/api.AuthDisplayCodeResponse" } }, "502": { @@ -82,12 +82,9 @@ const docTemplate = `{ ], "responses": { "200": { - "description": "Access and refresh tokens", + "description": "Authentication token", "schema": { - "type": "object", - "additionalProperties": { - "type": "string" - } + "$ref": "#/definitions/api.AuthTokenResponse" } }, "400": { @@ -203,13 +200,7 @@ const docTemplate = `{ "200": { "description": "List of spaces", "schema": { - "type": "object", - "additionalProperties": { - "type": "array", - "items": { - "$ref": "#/definitions/api.Space" - } - } + "$ref": "#/definitions/api.SpacesResponse" } }, "403": { @@ -258,7 +249,7 @@ const docTemplate = `{ "200": { "description": "Space created successfully", "schema": { - "$ref": "#/definitions/api.Space" + "$ref": "#/definitions/api.CreateSpaceResponse" } }, "403": { @@ -314,13 +305,7 @@ const docTemplate = `{ "200": { "description": "List of members", "schema": { - "type": "object", - "additionalProperties": { - "type": "array", - "items": { - "$ref": "#/definitions/api.SpaceMember" - } - } + "$ref": "#/definitions/api.MembersResponse" } }, "403": { @@ -1003,6 +988,28 @@ const docTemplate = `{ } } }, + "api.AuthDisplayCodeResponse": { + "type": "object", + "properties": { + "challenge_id": { + "type": "string", + "example": "67647f5ecda913e9a2e11b26" + } + } + }, + "api.AuthTokenResponse": { + "type": "object", + "properties": { + "app_key": { + "type": "string", + "example": "" + }, + "session_token": { + "type": "string", + "example": "" + } + } + }, "api.Block": { "type": "object", "properties": { @@ -1088,6 +1095,19 @@ const docTemplate = `{ } } }, + "api.CreateSpaceResponse": { + "type": "object", + "properties": { + "name": { + "type": "string", + "example": "Space Name" + }, + "space_id": { + "type": "string", + "example": "bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1" + } + } + }, "api.Detail": { "type": "object", "properties": { @@ -1152,6 +1172,50 @@ const docTemplate = `{ } } }, + "api.Member": { + "type": "object", + "properties": { + "global_name": { + "type": "string", + "example": "john.any" + }, + "icon": { + "type": "string", + "example": "http://127.0.0.1:31006/image/bafybeieptz5hvcy6txplcvphjbbh5yjc2zqhmihs3owkh5oab4ezauzqay?width=100" + }, + "id": { + "type": "string", + "example": "_participant_bafyreigyfkt6rbv24sbv5aq2hko1bhmv5xxlf22b4bypdu6j7hnphm3psq_23me69r569oi1_AAjEaEwPF4nkEh9AWkqEnzcQ8HziBB4ETjiTpvRCQvWnSMDZ" + }, + "identity": { + "type": "string", + "example": "AAjEaEwPF4nkEh7AWkqEnzcQ8HziGB4ETjiTpvRCQvWnSMDZ" + }, + "name": { + "type": "string", + "example": "John Doe" + }, + "role": { + "type": "string", + "example": "Owner" + }, + "type": { + "type": "string", + "example": "member" + } + } + }, + "api.MembersResponse": { + "type": "object", + "properties": { + "members": { + "type": "array", + "items": { + "$ref": "#/definitions/api.Member" + } + } + } + }, "api.MessageContent": { "type": "object", "properties": { @@ -1369,36 +1433,14 @@ const docTemplate = `{ } } }, - "api.SpaceMember": { + "api.SpacesResponse": { "type": "object", "properties": { - "global_name": { - "type": "string", - "example": "john.any" - }, - "icon": { - "type": "string", - "example": "http://127.0.0.1:31006/image/bafybeieptz5hvcy6txplcvphjbbh5yjc2zqhmihs3owkh5oab4ezauzqay?width=100" - }, - "id": { - "type": "string", - "example": "_participant_bafyreigyfkt6rbv24sbv5aq2hko1bhmv5xxlf22b4bypdu6j7hnphm3psq_23me69r569oi1_AAjEaEwPF4nkEh9AWkqEnzcQ8HziBB4ETjiTpvRCQvWnSMDZ" - }, - "identity": { - "type": "string", - "example": "AAjEaEwPF4nkEh7AWkqEnzcQ8HziGB4ETjiTpvRCQvWnSMDZ" - }, - "name": { - "type": "string", - "example": "John Doe" - }, - "role": { - "type": "string", - "example": "Owner" - }, - "type": { - "type": "string", - "example": "space_member" + "spaces": { + "type": "array", + "items": { + "$ref": "#/definitions/api.Space" + } } } }, diff --git a/cmd/api/docs/swagger.json b/cmd/api/docs/swagger.json index 63bbbca07..6ea28f9ba 100644 --- a/cmd/api/docs/swagger.json +++ b/cmd/api/docs/swagger.json @@ -32,9 +32,9 @@ "summary": "Open a modal window with a code in Anytype Desktop app", "responses": { "200": { - "description": "Success", + "description": "Challenge ID", "schema": { - "type": "string" + "$ref": "#/definitions/api.AuthDisplayCodeResponse" } }, "502": { @@ -76,12 +76,9 @@ ], "responses": { "200": { - "description": "Access and refresh tokens", + "description": "Authentication token", "schema": { - "type": "object", - "additionalProperties": { - "type": "string" - } + "$ref": "#/definitions/api.AuthTokenResponse" } }, "400": { @@ -197,13 +194,7 @@ "200": { "description": "List of spaces", "schema": { - "type": "object", - "additionalProperties": { - "type": "array", - "items": { - "$ref": "#/definitions/api.Space" - } - } + "$ref": "#/definitions/api.SpacesResponse" } }, "403": { @@ -252,7 +243,7 @@ "200": { "description": "Space created successfully", "schema": { - "$ref": "#/definitions/api.Space" + "$ref": "#/definitions/api.CreateSpaceResponse" } }, "403": { @@ -308,13 +299,7 @@ "200": { "description": "List of members", "schema": { - "type": "object", - "additionalProperties": { - "type": "array", - "items": { - "$ref": "#/definitions/api.SpaceMember" - } - } + "$ref": "#/definitions/api.MembersResponse" } }, "403": { @@ -997,6 +982,28 @@ } } }, + "api.AuthDisplayCodeResponse": { + "type": "object", + "properties": { + "challenge_id": { + "type": "string", + "example": "67647f5ecda913e9a2e11b26" + } + } + }, + "api.AuthTokenResponse": { + "type": "object", + "properties": { + "app_key": { + "type": "string", + "example": "" + }, + "session_token": { + "type": "string", + "example": "" + } + } + }, "api.Block": { "type": "object", "properties": { @@ -1082,6 +1089,19 @@ } } }, + "api.CreateSpaceResponse": { + "type": "object", + "properties": { + "name": { + "type": "string", + "example": "Space Name" + }, + "space_id": { + "type": "string", + "example": "bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1" + } + } + }, "api.Detail": { "type": "object", "properties": { @@ -1146,6 +1166,50 @@ } } }, + "api.Member": { + "type": "object", + "properties": { + "global_name": { + "type": "string", + "example": "john.any" + }, + "icon": { + "type": "string", + "example": "http://127.0.0.1:31006/image/bafybeieptz5hvcy6txplcvphjbbh5yjc2zqhmihs3owkh5oab4ezauzqay?width=100" + }, + "id": { + "type": "string", + "example": "_participant_bafyreigyfkt6rbv24sbv5aq2hko1bhmv5xxlf22b4bypdu6j7hnphm3psq_23me69r569oi1_AAjEaEwPF4nkEh9AWkqEnzcQ8HziBB4ETjiTpvRCQvWnSMDZ" + }, + "identity": { + "type": "string", + "example": "AAjEaEwPF4nkEh7AWkqEnzcQ8HziGB4ETjiTpvRCQvWnSMDZ" + }, + "name": { + "type": "string", + "example": "John Doe" + }, + "role": { + "type": "string", + "example": "Owner" + }, + "type": { + "type": "string", + "example": "member" + } + } + }, + "api.MembersResponse": { + "type": "object", + "properties": { + "members": { + "type": "array", + "items": { + "$ref": "#/definitions/api.Member" + } + } + } + }, "api.MessageContent": { "type": "object", "properties": { @@ -1363,36 +1427,14 @@ } } }, - "api.SpaceMember": { + "api.SpacesResponse": { "type": "object", "properties": { - "global_name": { - "type": "string", - "example": "john.any" - }, - "icon": { - "type": "string", - "example": "http://127.0.0.1:31006/image/bafybeieptz5hvcy6txplcvphjbbh5yjc2zqhmihs3owkh5oab4ezauzqay?width=100" - }, - "id": { - "type": "string", - "example": "_participant_bafyreigyfkt6rbv24sbv5aq2hko1bhmv5xxlf22b4bypdu6j7hnphm3psq_23me69r569oi1_AAjEaEwPF4nkEh9AWkqEnzcQ8HziBB4ETjiTpvRCQvWnSMDZ" - }, - "identity": { - "type": "string", - "example": "AAjEaEwPF4nkEh7AWkqEnzcQ8HziGB4ETjiTpvRCQvWnSMDZ" - }, - "name": { - "type": "string", - "example": "John Doe" - }, - "role": { - "type": "string", - "example": "Owner" - }, - "type": { - "type": "string", - "example": "space_member" + "spaces": { + "type": "array", + "items": { + "$ref": "#/definitions/api.Space" + } } } }, diff --git a/cmd/api/docs/swagger.yaml b/cmd/api/docs/swagger.yaml index 96613a99b..1a441344a 100644 --- a/cmd/api/docs/swagger.yaml +++ b/cmd/api/docs/swagger.yaml @@ -9,6 +9,21 @@ definitions: description: Type of attachment type: string type: object + api.AuthDisplayCodeResponse: + properties: + challenge_id: + example: 67647f5ecda913e9a2e11b26 + type: string + type: object + api.AuthTokenResponse: + properties: + app_key: + example: "" + type: string + session_token: + example: "" + type: string + type: object api.Block: properties: align: @@ -64,6 +79,15 @@ definitions: description: Identifier for the message being replied to type: string type: object + api.CreateSpaceResponse: + properties: + name: + example: Space Name + type: string + space_id: + example: bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1 + type: string + type: object api.Detail: properties: details: @@ -106,6 +130,37 @@ definitions: style: type: string type: object + api.Member: + properties: + global_name: + example: john.any + type: string + icon: + example: http://127.0.0.1:31006/image/bafybeieptz5hvcy6txplcvphjbbh5yjc2zqhmihs3owkh5oab4ezauzqay?width=100 + type: string + id: + example: _participant_bafyreigyfkt6rbv24sbv5aq2hko1bhmv5xxlf22b4bypdu6j7hnphm3psq_23me69r569oi1_AAjEaEwPF4nkEh9AWkqEnzcQ8HziBB4ETjiTpvRCQvWnSMDZ + type: string + identity: + example: AAjEaEwPF4nkEh7AWkqEnzcQ8HziGB4ETjiTpvRCQvWnSMDZ + type: string + name: + example: John Doe + type: string + role: + example: Owner + type: string + type: + example: member + type: string + type: object + api.MembersResponse: + properties: + members: + items: + $ref: '#/definitions/api.Member' + type: array + type: object api.MessageContent: properties: marks: @@ -259,29 +314,12 @@ definitions: example: bafyreiapey2g6e6za4zfxvlgwdy4hbbfu676gmwrhnqvjbxvrchr7elr3y type: string type: object - api.SpaceMember: + api.SpacesResponse: properties: - global_name: - example: john.any - type: string - icon: - example: http://127.0.0.1:31006/image/bafybeieptz5hvcy6txplcvphjbbh5yjc2zqhmihs3owkh5oab4ezauzqay?width=100 - type: string - id: - example: _participant_bafyreigyfkt6rbv24sbv5aq2hko1bhmv5xxlf22b4bypdu6j7hnphm3psq_23me69r569oi1_AAjEaEwPF4nkEh9AWkqEnzcQ8HziBB4ETjiTpvRCQvWnSMDZ - type: string - identity: - example: AAjEaEwPF4nkEh7AWkqEnzcQ8HziGB4ETjiTpvRCQvWnSMDZ - type: string - name: - example: John Doe - type: string - role: - example: Owner - type: string - type: - example: space_member - type: string + spaces: + items: + $ref: '#/definitions/api.Space' + type: array type: object api.Text: properties: @@ -338,9 +376,9 @@ paths: - application/json responses: "200": - description: Success + description: Challenge ID schema: - type: string + $ref: '#/definitions/api.AuthDisplayCodeResponse' "502": description: Internal server error schema: @@ -367,11 +405,9 @@ paths: - application/json responses: "200": - description: Access and refresh tokens + description: Authentication token schema: - additionalProperties: - type: string - type: object + $ref: '#/definitions/api.AuthTokenResponse' "400": description: Invalid input schema: @@ -449,11 +485,7 @@ paths: "200": description: List of spaces schema: - additionalProperties: - items: - $ref: '#/definitions/api.Space' - type: array - type: object + $ref: '#/definitions/api.SpacesResponse' "403": description: Unauthorized schema: @@ -485,7 +517,7 @@ paths: "200": description: Space created successfully schema: - $ref: '#/definitions/api.Space' + $ref: '#/definitions/api.CreateSpaceResponse' "403": description: Unauthorized schema: @@ -523,11 +555,7 @@ paths: "200": description: List of members schema: - additionalProperties: - items: - $ref: '#/definitions/api.SpaceMember' - type: array - type: object + $ref: '#/definitions/api.MembersResponse' "403": description: Unauthorized schema: diff --git a/cmd/api/handlers.go b/cmd/api/handlers.go index 076ecadfb..26f133ded 100644 --- a/cmd/api/handlers.go +++ b/cmd/api/handlers.go @@ -38,8 +38,8 @@ type AddMessageRequest struct { // @Tags auth // @Accept json // @Produce json -// @Success 200 {string} string "Success" -// @Failure 502 {object} ServerError "Internal server error" +// @Success 200 {object} AuthDisplayCodeResponse "Challenge ID" +// @Failure 502 {object} ServerError "Internal server error" // @Router /auth/displayCode [post] func (a *ApiServer) authDisplayCodeHandler(c *gin.Context) { resp := a.mw.AccountLocalLinkNewChallenge(c.Request.Context(), &pb.RpcAccountLocalLinkNewChallengeRequest{AppName: "api-test"}) @@ -59,11 +59,16 @@ func (a *ApiServer) authDisplayCodeHandler(c *gin.Context) { // @Produce json // @Param code query string true "The code retrieved from Anytype Desktop app" // @Param challenge_id query string true "The challenge ID" -// @Success 200 {object} map[string]string "Access and refresh tokens" +// @Success 200 {object} AuthTokenResponse "Authentication token" // @Failure 400 {object} ValidationError "Invalid input" // @Failure 502 {object} ServerError "Internal server error" // @Router /auth/token [get] func (a *ApiServer) authTokenHandler(c *gin.Context) { + if c.Query("challenge_id") == "" || c.Query("code") == "" { + c.JSON(http.StatusBadRequest, gin.H{"message": "Invalid input"}) + return + } + // Call AccountLocalLinkSolveChallenge to retrieve session token and app key resp := a.mw.AccountLocalLinkSolveChallenge(c.Request.Context(), &pb.RpcAccountLocalLinkSolveChallengeRequest{ ChallengeId: c.Query("challenge_id"), @@ -89,7 +94,7 @@ func (a *ApiServer) authTokenHandler(c *gin.Context) { // @Produce json // @Param offset query int false "The number of items to skip before starting to collect the result set" // @Param limit query int false "The number of items to return" default(100) -// @Success 200 {object} map[string][]Space "List of spaces" +// @Success 200 {object} SpacesResponse "List of spaces" // @Failure 403 {object} UnauthorizedError "Unauthorized" // @Failure 404 {object} NotFoundError "Resource not found" // @Failure 502 {object} ServerError "Internal server error" @@ -153,7 +158,7 @@ func (a *ApiServer) getSpacesHandler(c *gin.Context) { spaces = append(spaces, workspace) } - c.JSON(http.StatusOK, gin.H{"spaces": spaces}) + c.JSON(http.StatusOK, SpacesResponse{Spaces: spaces}) } // createSpaceHandler creates a new space @@ -163,7 +168,7 @@ func (a *ApiServer) getSpacesHandler(c *gin.Context) { // @Accept json // @Produce json // @Param name body string true "Space Name" -// @Success 200 {object} Space "Space created successfully" +// @Success 200 {object} CreateSpaceResponse "Space created successfully" // @Failure 403 {object} UnauthorizedError "Unauthorized" // @Failure 502 {object} ServerError "Internal server error" // @Router /spaces [post] @@ -200,24 +205,24 @@ func (a *ApiServer) createSpaceHandler(c *gin.Context) { return } - c.JSON(http.StatusOK, gin.H{"spaceId": resp.SpaceId, "name": name, "iconOption": iconOption}) + c.JSON(http.StatusOK, CreateSpaceResponse{SpaceId: resp.SpaceId, Name: name}) } -// getSpaceMembersHandler retrieves a list of members for the specified space +// getMembersHandler retrieves a list of members for the specified space // // @Summary Retrieve a list of members for the specified Space // @Tags spaces // @Accept json // @Produce json -// @Param space_id path string true "The ID of the space" -// @Param offset query int false "The number of items to skip before starting to collect the result set" -// @Param limit query int false "The number of items to return" default(100) -// @Success 200 {object} map[string][]SpaceMember "List of members" -// @Failure 403 {object} UnauthorizedError "Unauthorized" -// @Failure 404 {object} NotFoundError "Resource not found" -// @Failure 502 {object} ServerError "Internal server error" +// @Param space_id path string true "The ID of the space" +// @Param offset query int false "The number of items to skip before starting to collect the result set" +// @Param limit query int false "The number of items to return" default(100) +// @Success 200 {object} MembersResponse "List of members" +// @Failure 403 {object} UnauthorizedError "Unauthorized" +// @Failure 404 {object} NotFoundError "Resource not found" +// @Failure 502 {object} ServerError "Internal server error" // @Router /spaces/{space_id}/members [get] -func (a *ApiServer) getSpaceMembersHandler(c *gin.Context) { +func (a *ApiServer) getMembersHandler(c *gin.Context) { spaceId := c.Param("space_id") offset := c.GetInt("offset") limit := c.GetInt("limit") @@ -258,11 +263,11 @@ func (a *ApiServer) getSpaceMembersHandler(c *gin.Context) { return } - members := make([]SpaceMember, 0, len(resp.Records)) + members := make([]Member, 0, len(resp.Records)) for _, record := range resp.Records { icon := a.getIconFromEmojiOrImage(record.Fields["iconEmoji"].GetStringValue(), record.Fields["iconImage"].GetStringValue()) - member := SpaceMember{ + member := Member{ Type: "space_member", Id: record.Fields["id"].GetStringValue(), Name: record.Fields["name"].GetStringValue(), @@ -275,7 +280,7 @@ func (a *ApiServer) getSpaceMembersHandler(c *gin.Context) { members = append(members, member) } - c.JSON(http.StatusOK, gin.H{"members": members}) + c.JSON(http.StatusOK, MembersResponse{Members: members}) } // getObjectsForSpaceHandler retrieves objects in a specific space diff --git a/cmd/api/handlers_test.go b/cmd/api/handlers_test.go index 6cd32a2ea..a5113f239 100644 --- a/cmd/api/handlers_test.go +++ b/cmd/api/handlers_test.go @@ -2,8 +2,10 @@ package api import ( "encoding/json" + "fmt" "net/http" "net/http/httptest" + "regexp" "strings" "testing" @@ -18,10 +20,19 @@ import ( "github.com/anyproto/anytype-heart/core/mock_core" "github.com/anyproto/anytype-heart/pb" "github.com/anyproto/anytype-heart/pb/service/mock_service" + "github.com/anyproto/anytype-heart/pkg/lib/bundle" "github.com/anyproto/anytype-heart/pkg/lib/pb/model" "github.com/anyproto/anytype-heart/util/pbtypes" ) +const ( + offset = 0 + limit = 100 + techSpaceId = "tech-space-id" + gatewayUrl = "http://localhost:31006" + iconImage = "bafyreialsgoyflf3etjm3parzurivyaukzivwortf32b4twnlwpwocsrri" +) + type fixture struct { *ApiServer mwMock *mock_service.MockClientCommandsServer @@ -51,7 +62,7 @@ func newFixture(t *testing.T) *fixture { readOnly := apiServer.router.Group("/v1") { readOnly.GET("/spaces", paginator, apiServer.getSpacesHandler) - readOnly.GET("/spaces/:space_id/members", paginator, apiServer.getSpaceMembersHandler) + readOnly.GET("/spaces/:space_id/members", paginator, apiServer.getMembersHandler) readOnly.GET("/spaces/:space_id/objects", paginator, apiServer.getObjectsForSpaceHandler) readOnly.GET("/spaces/:space_id/objects/:object_id", apiServer.getObjectHandler) readOnly.GET("/spaces/:space_id/objectTypes", paginator, apiServer.getObjectTypesHandler) @@ -153,6 +164,19 @@ func TestApiServer_AuthTokenHandler(t *testing.T) { require.Equal(t, appKey, response.AppKey) }) + t.Run("bad request", func(t *testing.T) { + // given + fx := newFixture(t) + + // when + req, _ := http.NewRequest("GET", "/v1/auth/token", nil) + w := httptest.NewRecorder() + fx.router.ServeHTTP(w, req) + + // then + require.Equal(t, http.StatusBadRequest, w.Code) + }) + t.Run("failed token retrieval", func(t *testing.T) { // given fx := newFixture(t) @@ -181,10 +205,46 @@ func TestApiServer_GetSpacesHandler(t *testing.T) { t.Run("successful retrieval of spaces", func(t *testing.T) { // given fx := newFixture(t) - fx.accountInfo = &model.AccountInfo{TechSpaceId: "tech-space-id"} + fx.accountInfo = &model.AccountInfo{TechSpaceId: techSpaceId, GatewayUrl: gatewayUrl} - fx.mwMock.On("ObjectSearch", mock.Anything, mock.Anything).Return(&pb.RpcObjectSearchResponse{ + fx.mwMock.On("ObjectSearch", mock.Anything, &pb.RpcObjectSearchRequest{ + SpaceId: techSpaceId, + Filters: []*model.BlockContentDataviewFilter{ + { + RelationKey: bundle.RelationKeyLayout.String(), + Condition: model.BlockContentDataviewFilter_Equal, + Value: pbtypes.Int64(int64(model.ObjectType_spaceView)), + }, + { + RelationKey: bundle.RelationKeySpaceLocalStatus.String(), + Condition: model.BlockContentDataviewFilter_Equal, + Value: pbtypes.Int64(int64(model.SpaceStatus_Ok)), + }, + { + RelationKey: bundle.RelationKeySpaceRemoteStatus.String(), + Condition: model.BlockContentDataviewFilter_Equal, + Value: pbtypes.Int64(int64(model.SpaceStatus_Ok)), + }, + }, + Sorts: []*model.BlockContentDataviewSort{ + { + RelationKey: "name", + Type: model.BlockContentDataviewSort_Asc, + }, + }, + Keys: []string{"targetSpaceId", "name", "iconEmoji", "iconImage"}, + Offset: offset, + Limit: limit, + }).Return(&pb.RpcObjectSearchResponse{ Records: []*types.Struct{ + { + Fields: map[string]*types.Value{ + "name": pbtypes.String("Another Workspace"), + "targetSpaceId": pbtypes.String("another-space-id"), + "iconEmoji": pbtypes.String(""), + "iconImage": pbtypes.String(iconImage), + }, + }, { Fields: map[string]*types.Value{ "name": pbtypes.String("My Workspace"), @@ -193,14 +253,6 @@ func TestApiServer_GetSpacesHandler(t *testing.T) { "iconImage": pbtypes.String(""), }, }, - { - Fields: map[string]*types.Value{ - "name": pbtypes.String("Another Workspace"), - "targetSpaceId": pbtypes.String("another-space-id"), - "iconEmoji": pbtypes.String(""), - "iconImage": pbtypes.String("bafyreialsgoyflf3etjm3parzurivyaukzivwortf32b4twnlwpwocsrri"), - }, - }, }, Error: &pb.RpcObjectSearchResponseError{Code: pb.RpcObjectSearchResponseError_NULL}, }).Once() @@ -227,20 +279,29 @@ func TestApiServer_GetSpacesHandler(t *testing.T) { }, nil).Twice() // when - req, _ := http.NewRequest("GET", "/v1/spaces", nil) + req, _ := http.NewRequest("GET", fmt.Sprintf("/v1/spaces?offset=%d&limit=%d", offset, limit), nil) w := httptest.NewRecorder() fx.router.ServeHTTP(w, req) // then require.Equal(t, http.StatusOK, w.Code) - require.Contains(t, w.Body.String(), "My Workspace") - require.Contains(t, w.Body.String(), "Another Workspace") + + var response SpacesResponse + err := json.Unmarshal(w.Body.Bytes(), &response) + require.NoError(t, err) + require.Len(t, response.Spaces, 2) + require.Equal(t, "Another Workspace", response.Spaces[0].Name) + require.Equal(t, "another-space-id", response.Spaces[0].Id) + require.Regexpf(t, regexp.MustCompile(gatewayUrl+`/image/`+iconImage), response.Spaces[0].Icon, "Icon URL does not match") + require.Equal(t, "My Workspace", response.Spaces[1].Name) + require.Equal(t, "my-space-id", response.Spaces[1].Id) + require.Equal(t, "🚀", response.Spaces[1].Icon) }) t.Run("no spaces found", func(t *testing.T) { // given fx := newFixture(t) - fx.accountInfo = &model.AccountInfo{TechSpaceId: "tech-space-id"} + fx.accountInfo = &model.AccountInfo{TechSpaceId: techSpaceId} fx.mwMock.On("ObjectSearch", mock.Anything, mock.Anything). Return(&pb.RpcObjectSearchResponse{ @@ -249,13 +310,47 @@ func TestApiServer_GetSpacesHandler(t *testing.T) { }).Once() // when - req, _ := http.NewRequest("GET", "/v1/spaces", nil) + req, _ := http.NewRequest("GET", fmt.Sprintf("/v1/spaces?offset=%d&limit=%d", offset, limit), nil) w := httptest.NewRecorder() fx.router.ServeHTTP(w, req) // then require.Equal(t, http.StatusNotFound, w.Code) }) + + t.Run("failed workspace open", func(t *testing.T) { + // given + fx := newFixture(t) + fx.accountInfo = &model.AccountInfo{TechSpaceId: techSpaceId} + + fx.mwMock.On("ObjectSearch", mock.Anything, mock.Anything). + Return(&pb.RpcObjectSearchResponse{ + Records: []*types.Struct{ + { + Fields: map[string]*types.Value{ + "name": pbtypes.String("My Workspace"), + "targetSpaceId": pbtypes.String("my-space-id"), + "iconEmoji": pbtypes.String("🚀"), + "iconImage": pbtypes.String(""), + }, + }, + }, + Error: &pb.RpcObjectSearchResponseError{Code: pb.RpcObjectSearchResponseError_NULL}, + }).Once() + + fx.mwMock.On("WorkspaceOpen", mock.Anything, mock.Anything). + Return(&pb.RpcWorkspaceOpenResponse{ + Error: &pb.RpcWorkspaceOpenResponseError{Code: pb.RpcWorkspaceOpenResponseError_UNKNOWN_ERROR}, + }, nil).Once() + + // when + req, _ := http.NewRequest("GET", fmt.Sprintf("/v1/spaces?offset=%d&limit=%d", offset, limit), nil) + w := httptest.NewRecorder() + fx.router.ServeHTTP(w, req) + + // then + require.Equal(t, http.StatusInternalServerError, w.Code) + }) } func TestApiServer_CreateSpaceHandler(t *testing.T) { @@ -312,19 +407,31 @@ func TestApiServer_CreateSpaceHandler(t *testing.T) { }) } -func TestApiServer_GetSpaceMembersHandler(t *testing.T) { - t.Run("successfully get space members", func(t *testing.T) { +func TestApiServer_GetMembersHandler(t *testing.T) { + t.Run("successfully get members", func(t *testing.T) { // given fx := newFixture(t) + fx.accountInfo = &model.AccountInfo{TechSpaceId: techSpaceId, GatewayUrl: gatewayUrl} fx.mwMock.On("ObjectSearch", mock.Anything, mock.Anything). Return(&pb.RpcObjectSearchResponse{ Records: []*types.Struct{ { Fields: map[string]*types.Value{ - "id": pbtypes.String("member-1"), - "name": pbtypes.String("John Doe"), - "iconEmoji": pbtypes.String("👤"), + "id": pbtypes.String("member-1"), + "name": pbtypes.String("John Doe"), + "iconEmoji": pbtypes.String("👤"), + "identity": pbtypes.String("AAjEaEwPF4nkEh7AWkqEnzcQ8HziGB4ETjiTpvRCQvWnSMDZ"), + "globalName": pbtypes.String("john.any"), + }, + }, + { + Fields: map[string]*types.Value{ + "id": pbtypes.String("member-2"), + "name": pbtypes.String("Jane Doe"), + "iconImage": pbtypes.String(iconImage), + "identity": pbtypes.String("AAjLbEwPF4nkEh7AWkqEnzcQ8HziGB4ETjiTpvRCQvWnSMD4"), + "globalName": pbtypes.String("jane.any"), }, }, }, @@ -332,13 +439,25 @@ func TestApiServer_GetSpaceMembersHandler(t *testing.T) { }).Once() // when - req, _ := http.NewRequest("GET", "/v1/spaces/my-space/members", nil) + req, _ := http.NewRequest("GET", fmt.Sprintf("/v1/spaces/my-space/members?offset=%d&limit=%d", offset, limit), nil) w := httptest.NewRecorder() fx.router.ServeHTTP(w, req) // then require.Equal(t, http.StatusOK, w.Code) - require.Contains(t, w.Body.String(), "John Doe") + + var response MembersResponse + err := json.Unmarshal(w.Body.Bytes(), &response) + require.NoError(t, err) + require.Len(t, response.Members, 2) + require.Equal(t, "member-1", response.Members[0].Id) + require.Equal(t, "John Doe", response.Members[0].Name) + require.Equal(t, "👤", response.Members[0].Icon) + require.Equal(t, "john.any", response.Members[0].GlobalName) + require.Equal(t, "member-2", response.Members[1].Id) + require.Equal(t, "Jane Doe", response.Members[1].Name) + require.Regexpf(t, regexp.MustCompile(gatewayUrl+`/image/`+iconImage), response.Members[1].Icon, "Icon URL does not match") + require.Equal(t, "jane.any", response.Members[1].GlobalName) }) t.Run("no members found", func(t *testing.T) { @@ -352,7 +471,7 @@ func TestApiServer_GetSpaceMembersHandler(t *testing.T) { }).Once() // when - req, _ := http.NewRequest("GET", "/v1/spaces/empty-space/members", nil) + req, _ := http.NewRequest("GET", fmt.Sprintf("/v1/spaces/empty-space/members?offset=%d&limit=%d", offset, limit), nil) w := httptest.NewRecorder() fx.router.ServeHTTP(w, req) @@ -712,7 +831,7 @@ func TestApiServer_GetObjectsHandler(t *testing.T) { fx := newFixture(t) // Mock retrieving spaces first - fx.accountInfo = &model.AccountInfo{TechSpaceId: "tech-space-id"} + fx.accountInfo = &model.AccountInfo{TechSpaceId: techSpaceId} fx.mwMock.On("ObjectSearch", mock.Anything, mock.Anything).Return(&pb.RpcObjectSearchResponse{ Records: []*types.Struct{ { diff --git a/cmd/api/main.go b/cmd/api/main.go index 8d7e5c940..7f4ee53ad 100644 --- a/cmd/api/main.go +++ b/cmd/api/main.go @@ -101,7 +101,7 @@ func RunApiServer(ctx context.Context, mw service.ClientCommandsServer, mwIntern // readOnly.Use(a.PermissionMiddleware("read-only")) { readOnly.GET("/spaces", paginator, a.getSpacesHandler) - readOnly.GET("/spaces/:space_id/members", paginator, a.getSpaceMembersHandler) + readOnly.GET("/spaces/:space_id/members", paginator, a.getMembersHandler) readOnly.GET("/spaces/:space_id/objects", paginator, a.getObjectsForSpaceHandler) readOnly.GET("/spaces/:space_id/objects/:object_id", a.getObjectHandler) readOnly.GET("/spaces/:space_id/objectTypes", paginator, a.getObjectTypesHandler) diff --git a/cmd/api/schemas.go b/cmd/api/schemas.go index b3f32bbe1..ea38c0d47 100644 --- a/cmd/api/schemas.go +++ b/cmd/api/schemas.go @@ -9,6 +9,15 @@ type AuthTokenResponse struct { AppKey string `json:"app_key" example:""` } +type SpacesResponse struct { + Spaces []Space `json:"spaces"` +} + +type CreateSpaceResponse struct { + SpaceId string `json:"space_id" example:"bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1"` + Name string `json:"name" example:"Space Name"` +} + type Space struct { Type string `json:"type" example:"space"` Id string `json:"id" example:"bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1"` @@ -28,8 +37,12 @@ type Space struct { NetworkId string `json:"network_id" example:"N83gJpVd9MuNRZAuJLZ7LiMntTThhPc6DtzWWVjb1M3PouVU"` } -type SpaceMember struct { - Type string `json:"type" example:"space_member"` +type MembersResponse struct { + Members []Member `json:"members"` +} + +type Member struct { + Type string `json:"type" example:"member"` Id string `json:"id" example:"_participant_bafyreigyfkt6rbv24sbv5aq2hko1bhmv5xxlf22b4bypdu6j7hnphm3psq_23me69r569oi1_AAjEaEwPF4nkEh9AWkqEnzcQ8HziBB4ETjiTpvRCQvWnSMDZ"` Name string `json:"name" example:"John Doe"` Icon string `json:"icon" example:"http://127.0.0.1:31006/image/bafybeieptz5hvcy6txplcvphjbbh5yjc2zqhmihs3owkh5oab4ezauzqay?width=100"` From 7c735fa8470df89b43563ea10674af805973ae03 Mon Sep 17 00:00:00 2001 From: Jannis Metrikat <120120832+jmetrikat@users.noreply.github.com> Date: Thu, 26 Dec 2024 17:37:26 +0100 Subject: [PATCH 056/195] GO-4459 Return tags in details --- cmd/api/handlers.go | 45 ++++++++++++++++++++++++++++++++++++++++----- cmd/api/helper.go | 19 +++++++++++++++++++ cmd/api/schemas.go | 6 ++++++ 3 files changed, 65 insertions(+), 5 deletions(-) diff --git a/cmd/api/handlers.go b/cmd/api/handlers.go index 26f133ded..adef9b356 100644 --- a/cmd/api/handlers.go +++ b/cmd/api/handlers.go @@ -351,6 +351,11 @@ func (a *ApiServer) getObjectsForSpaceHandler(c *gin.Context) { return } + objectShowResp := a.mw.ObjectShow(c.Request.Context(), &pb.RpcObjectShowRequest{ + SpaceId: spaceId, + ObjectId: record.Fields["id"].GetStringValue(), + }) + object := Object{ // TODO fix type inconsistency Type: model.ObjectTypeLayout_name[int32(record.Fields["layout"].GetNumberValue())], @@ -359,8 +364,8 @@ func (a *ApiServer) getObjectsForSpaceHandler(c *gin.Context) { Icon: icon, ObjectType: objectTypeName, SpaceId: spaceId, + RootId: objectShowResp.ObjectView.RootId, // TODO: populate other fields - // RootId: record.Fields["rootId"].GetStringValue(), // Blocks: []Block{}, Details: []Detail{ { @@ -369,6 +374,12 @@ func (a *ApiServer) getObjectsForSpaceHandler(c *gin.Context) { "lastModifiedDate": record.Fields["lastModifiedDate"].GetNumberValue(), }, }, + { + Id: "tags", + Details: map[string]interface{}{ + "tags": a.getTags(objectShowResp), + }, + }, }, } @@ -423,8 +434,21 @@ func (a *ApiServer) getObjectHandler(c *gin.Context) { ObjectType: objectTypeName, RootId: resp.ObjectView.RootId, // TODO: populate other fields - Blocks: []Block{}, - Details: []Detail{}, + // Blocks: []Block{}, + Details: []Detail{ + { + Id: "lastModifiedDate", + Details: map[string]interface{}{ + "lastModifiedDate": resp.ObjectView.Details[0].Details.Fields["lastModifiedDate"].GetNumberValue(), + }, + }, + { + Id: "tags", + Details: map[string]interface{}{ + "tags": a.getTags(resp), + }, + }, + }, } c.JSON(http.StatusOK, gin.H{"object": object}) @@ -571,7 +595,7 @@ func (a *ApiServer) getObjectTypesHandler(c *gin.Context) { }) } - c.JSON(http.StatusOK, gin.H{"objectTypes": objectTypes}) + c.JSON(http.StatusOK, gin.H{"object_types": objectTypes}) } // getObjectTypeTemplatesHandler retrieves a list of templates for a specific object type in a space @@ -807,6 +831,11 @@ func (a *ApiServer) getObjectsHandler(c *gin.Context) { return } + objectShowResp := a.mw.ObjectShow(c.Request.Context(), &pb.RpcObjectShowRequest{ + SpaceId: spaceId, + ObjectId: record.Fields["id"].GetStringValue(), + }) + searchResults = append(searchResults, Object{ Type: model.ObjectTypeLayout_name[int32(record.Fields["layout"].GetNumberValue())], Id: record.Fields["id"].GetStringValue(), @@ -814,8 +843,8 @@ func (a *ApiServer) getObjectsHandler(c *gin.Context) { Icon: icon, ObjectType: objectTypeName, SpaceId: spaceId, + RootId: objectShowResp.ObjectView.RootId, // TODO: populate other fields - // RootId: record.Fields["rootId"].GetStringValue(), // Blocks: []Block{}, Details: []Detail{ { @@ -824,6 +853,12 @@ func (a *ApiServer) getObjectsHandler(c *gin.Context) { "lastModifiedDate": record.Fields["lastModifiedDate"].GetNumberValue(), }, }, + { + Id: "tags", + Details: map[string]interface{}{ + "tags": a.getTags(objectShowResp), + }, + }, }, }) } diff --git a/cmd/api/helper.go b/cmd/api/helper.go index 7bdbd0127..2dbf8ebb8 100644 --- a/cmd/api/helper.go +++ b/cmd/api/helper.go @@ -116,3 +116,22 @@ func (a *ApiServer) getIconFromEmojiOrImage(iconEmoji string, iconImage string) return "" } + +// getTags returns the list of tags from the object details +func (a *ApiServer) getTags(resp *pb.RpcObjectShowResponse) []Tag { + tags := []Tag{} + for _, tagId := range resp.ObjectView.Details[0].Details.Fields["tag"].GetListValue().Values { + id := tagId.GetStringValue() + for _, detail := range resp.ObjectView.Details { + if detail.Id == id { + tags = append(tags, Tag{ + Id: id, + Name: detail.Details.Fields["name"].GetStringValue(), + Color: detail.Details.Fields["relationOptionColor"].GetStringValue(), + }) + break + } + } + } + return tags +} diff --git a/cmd/api/schemas.go b/cmd/api/schemas.go index ea38c0d47..57548978c 100644 --- a/cmd/api/schemas.go +++ b/cmd/api/schemas.go @@ -103,6 +103,12 @@ type Detail struct { Details map[string]interface{} `json:"details"` } +type Tag struct { + Id string `json:"id" example:"bafyreiaixlnaefu3ci22zdenjhsdlyaeeoyjrsid5qhfeejzlccijbj7sq"` + Name string `json:"name" example:"Tag Name"` + Color string `json:"color" example:"yellow"` +} + type ObjectType struct { Type string `json:"type" example:"object_type"` Id string `json:"id" example:"bafyreigyb6l5szohs32ts26ku2j42yd65e6hqy2u3gtzgdwqv6hzftsetu"` From 9e87a1bf4a90a69abd433a16be24935b4cac35c7 Mon Sep 17 00:00:00 2001 From: Jannis Metrikat <120120832+jmetrikat@users.noreply.github.com> Date: Thu, 26 Dec 2024 17:48:22 +0100 Subject: [PATCH 057/195] GO-4459 Add check for tag field existence --- cmd/api/helper.go | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/cmd/api/helper.go b/cmd/api/helper.go index 2dbf8ebb8..2cd6daca9 100644 --- a/cmd/api/helper.go +++ b/cmd/api/helper.go @@ -120,7 +120,13 @@ func (a *ApiServer) getIconFromEmojiOrImage(iconEmoji string, iconImage string) // getTags returns the list of tags from the object details func (a *ApiServer) getTags(resp *pb.RpcObjectShowResponse) []Tag { tags := []Tag{} - for _, tagId := range resp.ObjectView.Details[0].Details.Fields["tag"].GetListValue().Values { + + tagField, ok := resp.ObjectView.Details[0].Details.Fields["tag"] + if !ok { + return tags + } + + for _, tagId := range tagField.GetListValue().Values { id := tagId.GetStringValue() for _, detail := range resp.ObjectView.Details { if detail.Id == id { From d180dc6a49325198a9ea5a0d09345e6859b0dd5d Mon Sep 17 00:00:00 2001 From: Jannis Metrikat <120120832+jmetrikat@users.noreply.github.com> Date: Thu, 26 Dec 2024 20:33:03 +0100 Subject: [PATCH 058/195] GO-4459 Return blocks in object response --- cmd/api/docs/docs.go | 15 ++------ cmd/api/docs/swagger.json | 15 ++------ cmd/api/docs/swagger.yaml | 11 ++---- cmd/api/handlers.go | 9 ++--- cmd/api/helper.go | 73 +++++++++++++++++++++++++++++++++++++++ cmd/api/schemas.go | 13 +++---- 6 files changed, 86 insertions(+), 50 deletions(-) diff --git a/cmd/api/docs/docs.go b/cmd/api/docs/docs.go index ae8c64d50..d87f6e590 100644 --- a/cmd/api/docs/docs.go +++ b/cmd/api/docs/docs.go @@ -1031,9 +1031,6 @@ const docTemplate = `{ "id": { "type": "string" }, - "layout": { - "$ref": "#/definitions/api.Layout" - }, "text": { "$ref": "#/definitions/api.Text" }, @@ -1139,10 +1136,10 @@ const docTemplate = `{ "type": "integer" }, "state": { - "type": "integer" + "type": "string" }, "style": { - "type": "integer" + "type": "string" }, "target_object_id": { "type": "string" @@ -1164,14 +1161,6 @@ const docTemplate = `{ } } }, - "api.Layout": { - "type": "object", - "properties": { - "style": { - "type": "string" - } - } - }, "api.Member": { "type": "object", "properties": { diff --git a/cmd/api/docs/swagger.json b/cmd/api/docs/swagger.json index 6ea28f9ba..64f5f32d3 100644 --- a/cmd/api/docs/swagger.json +++ b/cmd/api/docs/swagger.json @@ -1025,9 +1025,6 @@ "id": { "type": "string" }, - "layout": { - "$ref": "#/definitions/api.Layout" - }, "text": { "$ref": "#/definitions/api.Text" }, @@ -1133,10 +1130,10 @@ "type": "integer" }, "state": { - "type": "integer" + "type": "string" }, "style": { - "type": "integer" + "type": "string" }, "target_object_id": { "type": "string" @@ -1158,14 +1155,6 @@ } } }, - "api.Layout": { - "type": "object", - "properties": { - "style": { - "type": "string" - } - } - }, "api.Member": { "type": "object", "properties": { diff --git a/cmd/api/docs/swagger.yaml b/cmd/api/docs/swagger.yaml index 1a441344a..871d20bc8 100644 --- a/cmd/api/docs/swagger.yaml +++ b/cmd/api/docs/swagger.yaml @@ -38,8 +38,6 @@ definitions: $ref: '#/definitions/api.File' id: type: string - layout: - $ref: '#/definitions/api.Layout' text: $ref: '#/definitions/api.Text' vertical_align: @@ -109,9 +107,9 @@ definitions: size: type: integer state: - type: integer + type: string style: - type: integer + type: string target_object_id: type: string type: @@ -125,11 +123,6 @@ definitions: type: string type: array type: object - api.Layout: - properties: - style: - type: string - type: object api.Member: properties: global_name: diff --git a/cmd/api/handlers.go b/cmd/api/handlers.go index adef9b356..25c87bccb 100644 --- a/cmd/api/handlers.go +++ b/cmd/api/handlers.go @@ -365,8 +365,7 @@ func (a *ApiServer) getObjectsForSpaceHandler(c *gin.Context) { ObjectType: objectTypeName, SpaceId: spaceId, RootId: objectShowResp.ObjectView.RootId, - // TODO: populate other fields - // Blocks: []Block{}, + Blocks: a.getBlocks(objectShowResp), Details: []Detail{ { Id: "lastModifiedDate", @@ -433,8 +432,7 @@ func (a *ApiServer) getObjectHandler(c *gin.Context) { Icon: resp.ObjectView.Details[0].Details.Fields["iconEmoji"].GetStringValue(), ObjectType: objectTypeName, RootId: resp.ObjectView.RootId, - // TODO: populate other fields - // Blocks: []Block{}, + Blocks: a.getBlocks(resp), Details: []Detail{ { Id: "lastModifiedDate", @@ -844,8 +842,7 @@ func (a *ApiServer) getObjectsHandler(c *gin.Context) { ObjectType: objectTypeName, SpaceId: spaceId, RootId: objectShowResp.ObjectView.RootId, - // TODO: populate other fields - // Blocks: []Block{}, + Blocks: a.getBlocks(objectShowResp), Details: []Detail{ { Id: "lastModifiedDate", diff --git a/cmd/api/helper.go b/cmd/api/helper.go index 2cd6daca9..65bee8070 100644 --- a/cmd/api/helper.go +++ b/cmd/api/helper.go @@ -141,3 +141,76 @@ func (a *ApiServer) getTags(resp *pb.RpcObjectShowResponse) []Tag { } return tags } + +func (a *ApiServer) getBlocks(resp *pb.RpcObjectShowResponse) []Block { + blocks := []Block{} + + for _, block := range resp.ObjectView.Blocks { + var text *Text + var file *File + + switch content := block.Content.(type) { + case *model.BlockContentOfText: + text = &Text{ + Text: content.Text.Text, + Style: model.BlockContentTextStyle_name[int32(content.Text.Style)], + Checked: content.Text.Checked, + Color: content.Text.Color, + Icon: a.getIconFromEmojiOrImage(content.Text.IconEmoji, content.Text.IconImage), + } + case *model.BlockContentOfFile: + file = &File{ + Hash: content.File.Hash, + Name: content.File.Name, + Type: model.BlockContentFileType_name[int32(content.File.Type)], + Mime: content.File.Mime, + Size: content.File.Size(), + AddedAt: int(content.File.AddedAt), + TargetObjectId: content.File.TargetObjectId, + State: model.BlockContentFileState_name[int32(content.File.State)], + Style: model.BlockContentFileStyle_name[int32(content.File.Style)], + } + // TODO: other content types? + } + + blocks = append(blocks, Block{ + Id: block.Id, + ChildrenIds: block.ChildrenIds, + BackgroundColor: block.BackgroundColor, + Align: mapAlign(block.Align), + VerticalAlign: mapVerticalAlign(block.VerticalAlign), + Text: text, + File: file, + }) + } + + return blocks +} + +func mapAlign(align model.BlockAlign) string { + switch align { + case model.Block_AlignLeft: + return "left" + case model.Block_AlignCenter: + return "center" + case model.Block_AlignRight: + return "right" + case model.Block_AlignJustify: + return "justify" + default: + return "unknown" + } +} + +func mapVerticalAlign(align model.BlockVerticalAlign) string { + switch align { + case model.Block_VerticalAlignTop: + return "top" + case model.Block_VerticalAlignMiddle: + return "middle" + case model.Block_VerticalAlignBottom: + return "bottom" + default: + return "unknown" + } +} diff --git a/cmd/api/schemas.go b/cmd/api/schemas.go index 57548978c..8be218f1a 100644 --- a/cmd/api/schemas.go +++ b/cmd/api/schemas.go @@ -69,13 +69,8 @@ type Block struct { BackgroundColor string `json:"background_color"` Align string `json:"align"` VerticalAlign string `json:"vertical_align"` - Layout Layout `json:"layout"` - Text Text `json:"text"` - File File `json:"file"` -} - -type Layout struct { - Style string `json:"style"` + Text *Text `json:"text,omitempty"` + File *File `json:"file,omitempty"` } type Text struct { @@ -94,8 +89,8 @@ type File struct { Size int `json:"size"` AddedAt int `json:"added_at"` TargetObjectId string `json:"target_object_id"` - State int `json:"state"` - Style int `json:"style"` + State string `json:"state"` + Style string `json:"style"` } type Detail struct { From cee9715f44525545bcffbaf7fb369eaf820f5e91 Mon Sep 17 00:00:00 2001 From: Jannis Metrikat <120120832+jmetrikat@users.noreply.github.com> Date: Thu, 26 Dec 2024 21:35:12 +0100 Subject: [PATCH 059/195] GO-4459 Refactor getDetails --- cmd/api/handlers.go | 45 ++------------------------- cmd/api/helper.go | 75 ++++++++++++++++++++++++++++++--------------- 2 files changed, 53 insertions(+), 67 deletions(-) diff --git a/cmd/api/handlers.go b/cmd/api/handlers.go index 25c87bccb..20602c435 100644 --- a/cmd/api/handlers.go +++ b/cmd/api/handlers.go @@ -366,20 +366,7 @@ func (a *ApiServer) getObjectsForSpaceHandler(c *gin.Context) { SpaceId: spaceId, RootId: objectShowResp.ObjectView.RootId, Blocks: a.getBlocks(objectShowResp), - Details: []Detail{ - { - Id: "lastModifiedDate", - Details: map[string]interface{}{ - "lastModifiedDate": record.Fields["lastModifiedDate"].GetNumberValue(), - }, - }, - { - Id: "tags", - Details: map[string]interface{}{ - "tags": a.getTags(objectShowResp), - }, - }, - }, + Details: a.getDetails(objectShowResp), } objects = append(objects, object) @@ -433,20 +420,7 @@ func (a *ApiServer) getObjectHandler(c *gin.Context) { ObjectType: objectTypeName, RootId: resp.ObjectView.RootId, Blocks: a.getBlocks(resp), - Details: []Detail{ - { - Id: "lastModifiedDate", - Details: map[string]interface{}{ - "lastModifiedDate": resp.ObjectView.Details[0].Details.Fields["lastModifiedDate"].GetNumberValue(), - }, - }, - { - Id: "tags", - Details: map[string]interface{}{ - "tags": a.getTags(resp), - }, - }, - }, + Details: a.getDetails(resp), } c.JSON(http.StatusOK, gin.H{"object": object}) @@ -843,20 +817,7 @@ func (a *ApiServer) getObjectsHandler(c *gin.Context) { SpaceId: spaceId, RootId: objectShowResp.ObjectView.RootId, Blocks: a.getBlocks(objectShowResp), - Details: []Detail{ - { - Id: "lastModifiedDate", - Details: map[string]interface{}{ - "lastModifiedDate": record.Fields["lastModifiedDate"].GetNumberValue(), - }, - }, - { - Id: "tags", - Details: map[string]interface{}{ - "tags": a.getTags(objectShowResp), - }, - }, - }, + Details: a.getDetails(objectShowResp), }) } } diff --git a/cmd/api/helper.go b/cmd/api/helper.go index 65bee8070..7760c39b5 100644 --- a/cmd/api/helper.go +++ b/cmd/api/helper.go @@ -117,31 +117,7 @@ func (a *ApiServer) getIconFromEmojiOrImage(iconEmoji string, iconImage string) return "" } -// getTags returns the list of tags from the object details -func (a *ApiServer) getTags(resp *pb.RpcObjectShowResponse) []Tag { - tags := []Tag{} - - tagField, ok := resp.ObjectView.Details[0].Details.Fields["tag"] - if !ok { - return tags - } - - for _, tagId := range tagField.GetListValue().Values { - id := tagId.GetStringValue() - for _, detail := range resp.ObjectView.Details { - if detail.Id == id { - tags = append(tags, Tag{ - Id: id, - Name: detail.Details.Fields["name"].GetStringValue(), - Color: detail.Details.Fields["relationOptionColor"].GetStringValue(), - }) - break - } - } - } - return tags -} - +// getBlocks returns the blocks of the object func (a *ApiServer) getBlocks(resp *pb.RpcObjectShowResponse) []Block { blocks := []Block{} @@ -214,3 +190,52 @@ func mapVerticalAlign(align model.BlockVerticalAlign) string { return "unknown" } } + +// getDetails returns the details of the object +func (a *ApiServer) getDetails(resp *pb.RpcObjectShowResponse) []Detail { + return []Detail{ + { + Id: "lastModifiedDate", + Details: map[string]interface{}{ + "lastModifiedDate": resp.ObjectView.Details[0].Details.Fields["lastModifiedDate"].GetNumberValue(), + }, + }, + { + Id: "createdDate", + Details: map[string]interface{}{ + "createdDate": resp.ObjectView.Details[0].Details.Fields["createdDate"].GetNumberValue(), + }, + }, + { + Id: "tags", + Details: map[string]interface{}{ + "tags": a.getTags(resp), + }, + }, + } +} + +// getTags returns the list of tags from the object details +func (a *ApiServer) getTags(resp *pb.RpcObjectShowResponse) []Tag { + tags := []Tag{} + + tagField, ok := resp.ObjectView.Details[0].Details.Fields["tag"] + if !ok { + return tags + } + + for _, tagId := range tagField.GetListValue().Values { + id := tagId.GetStringValue() + for _, detail := range resp.ObjectView.Details { + if detail.Id == id { + tags = append(tags, Tag{ + Id: id, + Name: detail.Details.Fields["name"].GetStringValue(), + Color: detail.Details.Fields["relationOptionColor"].GetStringValue(), + }) + break + } + } + } + return tags +} From 24f25ffbe9b255051c6472da59c7f08eb82e4b15 Mon Sep 17 00:00:00 2001 From: Jannis Metrikat <120120832+jmetrikat@users.noreply.github.com> Date: Sun, 29 Dec 2024 13:37:44 +0100 Subject: [PATCH 060/195] GO-4459 Return paginated responses --- cmd/api/docs/swagger.json | 79 +++++++++++++++++++++----------- cmd/api/handlers.go | 96 ++++++++++++++++++++++++++------------- cmd/api/helper.go | 14 ++++++ cmd/api/schemas.go | 20 ++++---- 4 files changed, 143 insertions(+), 66 deletions(-) diff --git a/cmd/api/docs/swagger.json b/cmd/api/docs/swagger.json index 64f5f32d3..f891e097c 100644 --- a/cmd/api/docs/swagger.json +++ b/cmd/api/docs/swagger.json @@ -96,7 +96,7 @@ } } }, - "/objects": { + "/search": { "get": { "consumes": [ "application/json" @@ -112,7 +112,7 @@ { "type": "string", "description": "The search term to filter objects by name", - "name": "search", + "name": "query", "in": "query" }, { @@ -194,7 +194,7 @@ "200": { "description": "List of spaces", "schema": { - "$ref": "#/definitions/api.SpacesResponse" + "$ref": "#/definitions/api.PaginatedResponse-api_Space" } }, "403": { @@ -299,7 +299,7 @@ "200": { "description": "List of members", "schema": { - "$ref": "#/definitions/api.MembersResponse" + "$ref": "#/definitions/api.PaginatedResponse-api_Member" } }, "403": { @@ -1188,17 +1188,6 @@ } } }, - "api.MembersResponse": { - "type": "object", - "properties": { - "members": { - "type": "array", - "items": { - "$ref": "#/definitions/api.Member" - } - } - } - }, "api.MessageContent": { "type": "object", "properties": { @@ -1322,6 +1311,55 @@ } } }, + "api.PaginatedResponse-api_Member": { + "type": "object", + "properties": { + "data": { + "type": "array", + "items": { + "$ref": "#/definitions/api.Member" + } + }, + "pagination": { + "$ref": "#/definitions/api.PaginationMeta" + } + } + }, + "api.PaginatedResponse-api_Space": { + "type": "object", + "properties": { + "data": { + "type": "array", + "items": { + "$ref": "#/definitions/api.Space" + } + }, + "pagination": { + "$ref": "#/definitions/api.PaginationMeta" + } + } + }, + "api.PaginationMeta": { + "type": "object", + "properties": { + "has_next": { + "description": "whether there are more items available", + "type": "boolean" + }, + "limit": { + "description": "the current limit", + "type": "integer" + }, + "offset": { + "description": "the current offset", + "type": "integer" + }, + "total": { + "description": "the total number of items returned", + "type": "integer" + } + } + }, "api.Reactions": { "type": "object", "properties": { @@ -1416,17 +1454,6 @@ } } }, - "api.SpacesResponse": { - "type": "object", - "properties": { - "spaces": { - "type": "array", - "items": { - "$ref": "#/definitions/api.Space" - } - } - } - }, "api.Text": { "type": "object", "properties": { diff --git a/cmd/api/handlers.go b/cmd/api/handlers.go index 20602c435..bffc7f42f 100644 --- a/cmd/api/handlers.go +++ b/cmd/api/handlers.go @@ -92,12 +92,12 @@ func (a *ApiServer) authTokenHandler(c *gin.Context) { // @Tags spaces // @Accept json // @Produce json -// @Param offset query int false "The number of items to skip before starting to collect the result set" -// @Param limit query int false "The number of items to return" default(100) -// @Success 200 {object} SpacesResponse "List of spaces" -// @Failure 403 {object} UnauthorizedError "Unauthorized" -// @Failure 404 {object} NotFoundError "Resource not found" -// @Failure 502 {object} ServerError "Internal server error" +// @Param offset query int false "The number of items to skip before starting to collect the result set" +// @Param limit query int false "The number of items to return" default(100) +// @Success 200 {object} PaginatedResponse[Space] "List of spaces" +// @Failure 403 {object} UnauthorizedError "Unauthorized" +// @Failure 404 {object} NotFoundError "Resource not found" +// @Failure 502 {object} ServerError "Internal server error" // @Router /spaces [get] func (a *ApiServer) getSpacesHandler(c *gin.Context) { offset := c.GetInt("offset") @@ -131,7 +131,7 @@ func (a *ApiServer) getSpacesHandler(c *gin.Context) { }, Keys: []string{"targetSpaceId", "name", "iconEmoji", "iconImage"}, Offset: int32(offset), - Limit: int32(limit), + Limit: int32(limit + 1), }) if resp.Error.Code != pb.RpcObjectSearchResponseError_NULL { @@ -158,7 +158,13 @@ func (a *ApiServer) getSpacesHandler(c *gin.Context) { spaces = append(spaces, workspace) } - c.JSON(http.StatusOK, SpacesResponse{Spaces: spaces}) + hasNext := false + if len(spaces) > limit { + hasNext = true + spaces = spaces[:limit] + } + + respondWithPagination(c, http.StatusOK, spaces, len(spaces), offset, limit, hasNext) } // createSpaceHandler creates a new space @@ -214,13 +220,13 @@ func (a *ApiServer) createSpaceHandler(c *gin.Context) { // @Tags spaces // @Accept json // @Produce json -// @Param space_id path string true "The ID of the space" -// @Param offset query int false "The number of items to skip before starting to collect the result set" -// @Param limit query int false "The number of items to return" default(100) -// @Success 200 {object} MembersResponse "List of members" -// @Failure 403 {object} UnauthorizedError "Unauthorized" -// @Failure 404 {object} NotFoundError "Resource not found" -// @Failure 502 {object} ServerError "Internal server error" +// @Param space_id path string true "The ID of the space" +// @Param offset query int false "The number of items to skip before starting to collect the result set" +// @Param limit query int false "The number of items to return" default(100) +// @Success 200 {object} PaginatedResponse[Member] "List of members" +// @Failure 403 {object} UnauthorizedError "Unauthorized" +// @Failure 404 {object} NotFoundError "Resource not found" +// @Failure 502 {object} ServerError "Internal server error" // @Router /spaces/{space_id}/members [get] func (a *ApiServer) getMembersHandler(c *gin.Context) { spaceId := c.Param("space_id") @@ -250,7 +256,7 @@ func (a *ApiServer) getMembersHandler(c *gin.Context) { }, Keys: []string{"id", "name", "iconEmoji", "iconImage", "identity", "globalName", "participantPermissions"}, Offset: int32(offset), - Limit: int32(limit), + Limit: int32(limit + 1), }) if resp.Error.Code != pb.RpcObjectSearchResponseError_NULL { @@ -280,7 +286,13 @@ func (a *ApiServer) getMembersHandler(c *gin.Context) { members = append(members, member) } - c.JSON(http.StatusOK, MembersResponse{Members: members}) + hasNext := false + if len(members) > limit { + hasNext = true + members = members[:limit] + } + + respondWithPagination(c, http.StatusOK, members, len(members), offset, limit, hasNext) } // getObjectsForSpaceHandler retrieves objects in a specific space @@ -329,7 +341,7 @@ func (a *ApiServer) getObjectsForSpaceHandler(c *gin.Context) { }}, Keys: []string{"id", "name", "type", "layout", "iconEmoji", "iconImage", "lastModifiedDate"}, Offset: int32(offset), - Limit: int32(limit), + Limit: int32(limit + 1), }) if resp.Error.Code != pb.RpcObjectSearchResponseError_NULL { @@ -372,7 +384,13 @@ func (a *ApiServer) getObjectsForSpaceHandler(c *gin.Context) { objects = append(objects, object) } - c.JSON(http.StatusOK, gin.H{"objects": objects}) + hasNext := false + if len(objects) > limit { + hasNext = true + objects = objects[:limit] + } + + respondWithPagination(c, http.StatusOK, objects, len(objects), offset, limit, hasNext) } // getObjectHandler retrieves a specific object in a space @@ -543,7 +561,7 @@ func (a *ApiServer) getObjectTypesHandler(c *gin.Context) { }, Keys: []string{"id", "uniqueKey", "name", "iconEmoji"}, Offset: int32(offset), - Limit: int32(limit), + Limit: int32(limit + 1), }) if resp.Error.Code != pb.RpcObjectSearchResponseError_NULL { @@ -567,7 +585,13 @@ func (a *ApiServer) getObjectTypesHandler(c *gin.Context) { }) } - c.JSON(http.StatusOK, gin.H{"object_types": objectTypes}) + hasNext := false + if len(objectTypes) > limit { + hasNext = true + objectTypes = objectTypes[:limit] + } + + respondWithPagination(c, http.StatusOK, objectTypes, len(objectTypes), offset, limit, hasNext) } // getObjectTypeTemplatesHandler retrieves a list of templates for a specific object type in a space @@ -628,7 +652,7 @@ func (a *ApiServer) getObjectTypeTemplatesHandler(c *gin.Context) { }, Keys: []string{"id", "targetObjectType", "name", "iconEmoji"}, Offset: int32(offset), - Limit: int32(limit), + Limit: int32(limit + 1), }) if templateObjectsResp.Error.Code != pb.RpcObjectSearchResponseError_NULL { @@ -669,25 +693,31 @@ func (a *ApiServer) getObjectTypeTemplatesHandler(c *gin.Context) { }) } - c.JSON(http.StatusOK, gin.H{"templates": templates}) + hasNext := false + if len(templates) > limit { + hasNext = true + templates = templates[:limit] + } + + respondWithPagination(c, http.StatusOK, templates, len(templates), offset, limit, hasNext) } -// getObjectsHandler searches and retrieves objects across all the spaces +// searchHandler searches and retrieves objects across all the spaces // // @Summary Search and retrieve objects across all the spaces // @Tags search // @Accept json // @Produce json -// @Param search query string false "The search term to filter objects by name" +// @Param query query string false "The search term to filter objects by name" // @Param object_type query string false "Specify object type for search" // @Param offset query int false "The number of items to skip before starting to collect the result set" // @Param limit query int false "The number of items to return" default(100) // @Success 200 {object} map[string][]Object "List of objects" // @Failure 403 {object} UnauthorizedError "Unauthorized" // @Failure 502 {object} ServerError "Internal server error" -// @Router /objects [get] -func (a *ApiServer) getObjectsHandler(c *gin.Context) { - searchTerm := c.Query("search") +// @Router /search [get] +func (a *ApiServer) searchHandler(c *gin.Context) { + searchQuery := c.Query("query") objectType := c.Query("object_type") offset := c.GetInt("offset") limit := c.GetInt("limit") @@ -748,12 +778,12 @@ func (a *ApiServer) getObjectsHandler(c *gin.Context) { }, } - if searchTerm != "" { + if searchQuery != "" { // TODO also include snippet for notes filters = append(filters, &model.BlockContentDataviewFilter{ RelationKey: bundle.RelationKeyName.String(), Condition: model.BlockContentDataviewFilter_Like, - Value: pbtypes.String(searchTerm), + Value: pbtypes.String(searchQuery), }) } @@ -780,7 +810,7 @@ func (a *ApiServer) getObjectsHandler(c *gin.Context) { }}, Keys: []string{"id", "name", "type", "layout", "iconEmoji", "iconImage", "lastModifiedDate"}, Offset: int32(offset), - Limit: int32(limit), + Limit: int32(limit + 1), // TODO split limit between spaces // Limit: paginationLimitPerSpace, // FullText: searchTerm, @@ -828,11 +858,13 @@ func (a *ApiServer) getObjectsHandler(c *gin.Context) { }) // TODO: solve global pagination vs per space pagination + hasNext := false if len(searchResults) > limit { + hasNext = true searchResults = searchResults[:limit] } - c.JSON(http.StatusOK, gin.H{"objects": searchResults}) + respondWithPagination(c, http.StatusOK, searchResults, len(searchResults), offset, limit, hasNext) } // getChatMessagesHandler retrieves last chat messages diff --git a/cmd/api/helper.go b/cmd/api/helper.go index 7760c39b5..df35033ac 100644 --- a/cmd/api/helper.go +++ b/cmd/api/helper.go @@ -6,6 +6,8 @@ import ( "net/http" "strings" + "github.com/gin-gonic/gin" + "github.com/anyproto/anytype-heart/pb" "github.com/anyproto/anytype-heart/pkg/lib/bundle" "github.com/anyproto/anytype-heart/pkg/lib/pb/model" @@ -239,3 +241,15 @@ func (a *ApiServer) getTags(resp *pb.RpcObjectShowResponse) []Tag { } return tags } + +func respondWithPagination[T any](c *gin.Context, statusCode int, data []T, total, offset, limit int, hasNext bool) { + c.JSON(statusCode, PaginatedResponse[T]{ + Data: data, + Pagination: PaginationMeta{ + Total: total, + Offset: offset, + Limit: limit, + HasNext: hasNext, + }, + }) +} diff --git a/cmd/api/schemas.go b/cmd/api/schemas.go index 8be218f1a..52e9f8a90 100644 --- a/cmd/api/schemas.go +++ b/cmd/api/schemas.go @@ -1,5 +1,17 @@ package api +type PaginationMeta struct { + Total int `json:"total"` // the total number of items returned + Offset int `json:"offset"` // the current offset + Limit int `json:"limit"` // the current limit + HasNext bool `json:"has_next"` // whether there are more items available +} + +type PaginatedResponse[T any] struct { + Data []T `json:"data"` + Pagination PaginationMeta `json:"pagination"` +} + type AuthDisplayCodeResponse struct { ChallengeId string `json:"challenge_id" example:"67647f5ecda913e9a2e11b26"` } @@ -9,10 +21,6 @@ type AuthTokenResponse struct { AppKey string `json:"app_key" example:""` } -type SpacesResponse struct { - Spaces []Space `json:"spaces"` -} - type CreateSpaceResponse struct { SpaceId string `json:"space_id" example:"bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1"` Name string `json:"name" example:"Space Name"` @@ -37,10 +45,6 @@ type Space struct { NetworkId string `json:"network_id" example:"N83gJpVd9MuNRZAuJLZ7LiMntTThhPc6DtzWWVjb1M3PouVU"` } -type MembersResponse struct { - Members []Member `json:"members"` -} - type Member struct { Type string `json:"type" example:"member"` Id string `json:"id" example:"_participant_bafyreigyfkt6rbv24sbv5aq2hko1bhmv5xxlf22b4bypdu6j7hnphm3psq_23me69r569oi1_AAjEaEwPF4nkEh9AWkqEnzcQ8HziBB4ETjiTpvRCQvWnSMDZ"` From 3c2028454b82a884ae833d4c694211137c309fec Mon Sep 17 00:00:00 2001 From: Jannis Metrikat <120120832+jmetrikat@users.noreply.github.com> Date: Sun, 29 Dec 2024 13:38:27 +0100 Subject: [PATCH 061/195] GO-4459 Refactor search endpoint --- cmd/api/docs/docs.go | 79 ++++++++++------ cmd/api/docs/swagger.yaml | 55 +++++++---- cmd/api/handlers_test.go | 188 ++++++++++++++++++++++++++++++++------ cmd/api/main.go | 2 +- 4 files changed, 253 insertions(+), 71 deletions(-) diff --git a/cmd/api/docs/docs.go b/cmd/api/docs/docs.go index d87f6e590..1aeeae272 100644 --- a/cmd/api/docs/docs.go +++ b/cmd/api/docs/docs.go @@ -102,7 +102,7 @@ const docTemplate = `{ } } }, - "/objects": { + "/search": { "get": { "consumes": [ "application/json" @@ -118,7 +118,7 @@ const docTemplate = `{ { "type": "string", "description": "The search term to filter objects by name", - "name": "search", + "name": "query", "in": "query" }, { @@ -200,7 +200,7 @@ const docTemplate = `{ "200": { "description": "List of spaces", "schema": { - "$ref": "#/definitions/api.SpacesResponse" + "$ref": "#/definitions/api.PaginatedResponse-api_Space" } }, "403": { @@ -305,7 +305,7 @@ const docTemplate = `{ "200": { "description": "List of members", "schema": { - "$ref": "#/definitions/api.MembersResponse" + "$ref": "#/definitions/api.PaginatedResponse-api_Member" } }, "403": { @@ -1194,17 +1194,6 @@ const docTemplate = `{ } } }, - "api.MembersResponse": { - "type": "object", - "properties": { - "members": { - "type": "array", - "items": { - "$ref": "#/definitions/api.Member" - } - } - } - }, "api.MessageContent": { "type": "object", "properties": { @@ -1328,6 +1317,55 @@ const docTemplate = `{ } } }, + "api.PaginatedResponse-api_Member": { + "type": "object", + "properties": { + "data": { + "type": "array", + "items": { + "$ref": "#/definitions/api.Member" + } + }, + "pagination": { + "$ref": "#/definitions/api.PaginationMeta" + } + } + }, + "api.PaginatedResponse-api_Space": { + "type": "object", + "properties": { + "data": { + "type": "array", + "items": { + "$ref": "#/definitions/api.Space" + } + }, + "pagination": { + "$ref": "#/definitions/api.PaginationMeta" + } + } + }, + "api.PaginationMeta": { + "type": "object", + "properties": { + "has_next": { + "description": "whether there are more items available", + "type": "boolean" + }, + "limit": { + "description": "the current limit", + "type": "integer" + }, + "offset": { + "description": "the current offset", + "type": "integer" + }, + "total": { + "description": "the total number of items returned", + "type": "integer" + } + } + }, "api.Reactions": { "type": "object", "properties": { @@ -1422,17 +1460,6 @@ const docTemplate = `{ } } }, - "api.SpacesResponse": { - "type": "object", - "properties": { - "spaces": { - "type": "array", - "items": { - "$ref": "#/definitions/api.Space" - } - } - } - }, "api.Text": { "type": "object", "properties": { diff --git a/cmd/api/docs/swagger.yaml b/cmd/api/docs/swagger.yaml index 871d20bc8..3bf1db00f 100644 --- a/cmd/api/docs/swagger.yaml +++ b/cmd/api/docs/swagger.yaml @@ -147,13 +147,6 @@ definitions: example: member type: string type: object - api.MembersResponse: - properties: - members: - items: - $ref: '#/definitions/api.Member' - type: array - type: object api.MessageContent: properties: marks: @@ -240,6 +233,39 @@ definitions: example: ot-page type: string type: object + api.PaginatedResponse-api_Member: + properties: + data: + items: + $ref: '#/definitions/api.Member' + type: array + pagination: + $ref: '#/definitions/api.PaginationMeta' + type: object + api.PaginatedResponse-api_Space: + properties: + data: + items: + $ref: '#/definitions/api.Space' + type: array + pagination: + $ref: '#/definitions/api.PaginationMeta' + type: object + api.PaginationMeta: + properties: + has_next: + description: whether there are more items available + type: boolean + limit: + description: the current limit + type: integer + offset: + description: the current offset + type: integer + total: + description: the total number of items returned + type: integer + type: object api.Reactions: properties: reactions: @@ -307,13 +333,6 @@ definitions: example: bafyreiapey2g6e6za4zfxvlgwdy4hbbfu676gmwrhnqvjbxvrchr7elr3y type: string type: object - api.SpacesResponse: - properties: - spaces: - items: - $ref: '#/definitions/api.Space' - type: array - type: object api.Text: properties: checked: @@ -412,14 +431,14 @@ paths: summary: Retrieve an authentication token using a code tags: - auth - /objects: + /search: get: consumes: - application/json parameters: - description: The search term to filter objects by name in: query - name: search + name: query type: string - description: Specify object type for search in: query @@ -478,7 +497,7 @@ paths: "200": description: List of spaces schema: - $ref: '#/definitions/api.SpacesResponse' + $ref: '#/definitions/api.PaginatedResponse-api_Space' "403": description: Unauthorized schema: @@ -548,7 +567,7 @@ paths: "200": description: List of members schema: - $ref: '#/definitions/api.MembersResponse' + $ref: '#/definitions/api.PaginatedResponse-api_Member' "403": description: Unauthorized schema: diff --git a/cmd/api/handlers_test.go b/cmd/api/handlers_test.go index a5113f239..7b2e4780c 100644 --- a/cmd/api/handlers_test.go +++ b/cmd/api/handlers_test.go @@ -67,7 +67,7 @@ func newFixture(t *testing.T) *fixture { readOnly.GET("/spaces/:space_id/objects/:object_id", apiServer.getObjectHandler) readOnly.GET("/spaces/:space_id/objectTypes", paginator, apiServer.getObjectTypesHandler) readOnly.GET("/spaces/:space_id/objectTypes/:typeId/templates", paginator, apiServer.getObjectTypeTemplatesHandler) - readOnly.GET("/objects", paginator, apiServer.getObjectsHandler) + readOnly.GET("/search", paginator, apiServer.searchHandler) } readWrite := apiServer.router.Group("/v1") @@ -234,7 +234,7 @@ func TestApiServer_GetSpacesHandler(t *testing.T) { }, Keys: []string{"targetSpaceId", "name", "iconEmoji", "iconImage"}, Offset: offset, - Limit: limit, + Limit: limit + 1, }).Return(&pb.RpcObjectSearchResponse{ Records: []*types.Struct{ { @@ -286,16 +286,16 @@ func TestApiServer_GetSpacesHandler(t *testing.T) { // then require.Equal(t, http.StatusOK, w.Code) - var response SpacesResponse + var response PaginatedResponse[Space] err := json.Unmarshal(w.Body.Bytes(), &response) require.NoError(t, err) - require.Len(t, response.Spaces, 2) - require.Equal(t, "Another Workspace", response.Spaces[0].Name) - require.Equal(t, "another-space-id", response.Spaces[0].Id) - require.Regexpf(t, regexp.MustCompile(gatewayUrl+`/image/`+iconImage), response.Spaces[0].Icon, "Icon URL does not match") - require.Equal(t, "My Workspace", response.Spaces[1].Name) - require.Equal(t, "my-space-id", response.Spaces[1].Id) - require.Equal(t, "🚀", response.Spaces[1].Icon) + require.Len(t, response.Data, 2) + require.Equal(t, "Another Workspace", response.Data[0].Name) + require.Equal(t, "another-space-id", response.Data[0].Id) + require.Regexpf(t, regexp.MustCompile(gatewayUrl+`/image/`+iconImage), response.Data[0].Icon, "Icon URL does not match") + require.Equal(t, "My Workspace", response.Data[1].Name) + require.Equal(t, "my-space-id", response.Data[1].Id) + require.Equal(t, "🚀", response.Data[1].Icon) }) t.Run("no spaces found", func(t *testing.T) { @@ -446,18 +446,18 @@ func TestApiServer_GetMembersHandler(t *testing.T) { // then require.Equal(t, http.StatusOK, w.Code) - var response MembersResponse + var response PaginatedResponse[Member] err := json.Unmarshal(w.Body.Bytes(), &response) require.NoError(t, err) - require.Len(t, response.Members, 2) - require.Equal(t, "member-1", response.Members[0].Id) - require.Equal(t, "John Doe", response.Members[0].Name) - require.Equal(t, "👤", response.Members[0].Icon) - require.Equal(t, "john.any", response.Members[0].GlobalName) - require.Equal(t, "member-2", response.Members[1].Id) - require.Equal(t, "Jane Doe", response.Members[1].Name) - require.Regexpf(t, regexp.MustCompile(gatewayUrl+`/image/`+iconImage), response.Members[1].Icon, "Icon URL does not match") - require.Equal(t, "jane.any", response.Members[1].GlobalName) + require.Len(t, response.Data, 2) + require.Equal(t, "member-1", response.Data[0].Id) + require.Equal(t, "John Doe", response.Data[0].Name) + require.Equal(t, "👤", response.Data[0].Icon) + require.Equal(t, "john.any", response.Data[0].GlobalName) + require.Equal(t, "member-2", response.Data[1].Id) + require.Equal(t, "Jane Doe", response.Data[1].Name) + require.Regexpf(t, regexp.MustCompile(gatewayUrl+`/image/`+iconImage), response.Data[1].Icon, "Icon URL does not match") + require.Equal(t, "jane.any", response.Data[1].GlobalName) }) t.Run("no members found", func(t *testing.T) { @@ -825,14 +825,34 @@ func TestApiServer_GetObjectTypeTemplatesHandler(t *testing.T) { }) } -func TestApiServer_GetObjectsHandler(t *testing.T) { +func TestApiServer_SearchHandler(t *testing.T) { t.Run("objects found globally", func(t *testing.T) { // given fx := newFixture(t) // Mock retrieving spaces first fx.accountInfo = &model.AccountInfo{TechSpaceId: techSpaceId} - fx.mwMock.On("ObjectSearch", mock.Anything, mock.Anything).Return(&pb.RpcObjectSearchResponse{ + fx.mwMock.On("ObjectSearch", mock.Anything, &pb.RpcObjectSearchRequest{ + SpaceId: techSpaceId, + Filters: []*model.BlockContentDataviewFilter{ + { + RelationKey: bundle.RelationKeyLayout.String(), + Condition: model.BlockContentDataviewFilter_Equal, + Value: pbtypes.Int64(int64(model.ObjectType_spaceView)), + }, + { + RelationKey: bundle.RelationKeySpaceLocalStatus.String(), + Condition: model.BlockContentDataviewFilter_Equal, + Value: pbtypes.Int64(int64(model.SpaceStatus_Ok)), + }, + { + RelationKey: bundle.RelationKeySpaceRemoteStatus.String(), + Condition: model.BlockContentDataviewFilter_Equal, + Value: pbtypes.Int64(int64(model.SpaceStatus_Ok)), + }, + }, + Keys: []string{"targetSpaceId"}, + }).Return(&pb.RpcObjectSearchResponse{ Records: []*types.Struct{ { Fields: map[string]*types.Value{ @@ -841,7 +861,7 @@ func TestApiServer_GetObjectsHandler(t *testing.T) { }, }, Error: &pb.RpcObjectSearchResponseError{Code: pb.RpcObjectSearchResponseError_NULL}, - }).Twice() + }).Once() // Mock objects in space-1 fx.mwMock.On("ObjectSearch", mock.Anything, mock.Anything).Return(&pb.RpcObjectSearchResponse{ @@ -858,15 +878,131 @@ func TestApiServer_GetObjectsHandler(t *testing.T) { }, }, Error: &pb.RpcObjectSearchResponseError{Code: pb.RpcObjectSearchResponseError_NULL}, - }).Once() + }).Twice() + + // Mock object show for object blocks and details + fx.mwMock.On("ObjectShow", mock.Anything, &pb.RpcObjectShowRequest{ + SpaceId: "space-1", + ObjectId: "obj-global-1", + }).Return(&pb.RpcObjectShowResponse{ + ObjectView: &model.ObjectView{ + RootId: "root-123", + Blocks: []*model.Block{ + { + Id: "root-123", + Restrictions: &model.BlockRestrictions{ + Read: false, + Edit: false, + Remove: false, + Drag: false, + DropOn: false, + }, + ChildrenIds: []string{"header", "text-block", "relation-block"}, + }, + { + Id: "header", + Restrictions: &model.BlockRestrictions{ + Read: false, + Edit: true, + Remove: true, + Drag: true, + DropOn: true, + }, + ChildrenIds: []string{"title", "featuredRelations"}, + }, + { + Id: "text-block", + Content: &model.BlockContentOfText{ + Text: &model.BlockContentText{ + Text: "This is a sample text block", + Style: model.BlockContentText_Paragraph, + }, + }, + }, + }, + Details: []*model.ObjectViewDetailsSet{ + { + Id: "root-123", + Details: &types.Struct{ + Fields: map[string]*types.Value{ + "name": pbtypes.String("Global Object"), + "iconEmoji": pbtypes.String("🌐"), + "lastModifiedDate": pbtypes.Float64(999999), + "createdDate": pbtypes.Float64(888888), + "tag": pbtypes.StringList([]string{"tag-1", "tag-2"}), + }, + }, + }, + { + Id: "tag-1", + Details: &types.Struct{ + Fields: map[string]*types.Value{ + "name": pbtypes.String("Important"), + "relationOptionColor": pbtypes.String("red"), + }, + }, + }, + { + Id: "tag-2", + Details: &types.Struct{ + Fields: map[string]*types.Value{ + "name": pbtypes.String("Optional"), + "relationOptionColor": pbtypes.String("blue"), + }, + }, + }, + }, + }, + Error: &pb.RpcObjectShowResponseError{Code: pb.RpcObjectShowResponseError_NULL}, + }, nil).Once() // when - req, _ := http.NewRequest("GET", "/v1/objects", nil) + req, _ := http.NewRequest("GET", "/v1/search", nil) w := httptest.NewRecorder() fx.router.ServeHTTP(w, req) // then require.Equal(t, http.StatusOK, w.Code) - require.Contains(t, w.Body.String(), "Global Object") + + var response PaginatedResponse[Object] + err := json.Unmarshal(w.Body.Bytes(), &response) + require.NoError(t, err) + require.Len(t, response.Data, 1) + require.Equal(t, "space-1", response.Data[0].SpaceId) + require.Equal(t, "Global Object", response.Data[0].Name) + require.Equal(t, "obj-global-1", response.Data[0].Id) + require.Equal(t, "🌐", response.Data[0].Icon) + + // check details + for _, detail := range response.Data[0].Details { + if detail.Id == "createdDate" { + require.Equal(t, float64(888888), detail.Details["createdDate"]) + } else if detail.Id == "lastModifiedDate" { + require.Equal(t, float64(999999), detail.Details["lastModifiedDate"]) + } + } + + // check tags + tags := []Tag{} + for _, detail := range response.Data[0].Details { + if tagList, ok := detail.Details["tags"].([]interface{}); ok { + for _, tagValue := range tagList { + tagStruct := tagValue.(map[string]interface{}) + tag := Tag{ + Id: tagStruct["id"].(string), + Name: tagStruct["name"].(string), + Color: tagStruct["color"].(string), + } + tags = append(tags, tag) + } + } + } + require.Len(t, tags, 2) + require.Equal(t, "tag-1", tags[0].Id) + require.Equal(t, "Important", tags[0].Name) + require.Equal(t, "red", tags[0].Color) + require.Equal(t, "tag-2", tags[1].Id) + require.Equal(t, "Optional", tags[1].Name) + require.Equal(t, "blue", tags[1].Color) }) } diff --git a/cmd/api/main.go b/cmd/api/main.go index 7f4ee53ad..b4dd6b962 100644 --- a/cmd/api/main.go +++ b/cmd/api/main.go @@ -106,7 +106,7 @@ func RunApiServer(ctx context.Context, mw service.ClientCommandsServer, mwIntern readOnly.GET("/spaces/:space_id/objects/:object_id", a.getObjectHandler) readOnly.GET("/spaces/:space_id/objectTypes", paginator, a.getObjectTypesHandler) readOnly.GET("/spaces/:space_id/objectTypes/:typeId/templates", paginator, a.getObjectTypeTemplatesHandler) - readOnly.GET("/objects", paginator, a.getObjectsHandler) + readOnly.GET("/search", paginator, a.searchHandler) } // Read-write routes From ffb4c8b87f537cd76735a2f7e35894969915e02d Mon Sep 17 00:00:00 2001 From: Jannis Metrikat <120120832+jmetrikat@users.noreply.github.com> Date: Sun, 29 Dec 2024 16:46:10 +0100 Subject: [PATCH 062/195] GO-4459 Refactor schema and handlers --- cmd/api/docs/docs.go | 14 +++++++++----- cmd/api/docs/swagger.json | 14 +++++++++----- cmd/api/docs/swagger.yaml | 6 +++++- cmd/api/handlers.go | 8 ++++---- cmd/api/handlers_test.go | 2 +- cmd/api/helper.go | 2 +- cmd/api/main.go | 2 +- cmd/api/schemas.go | 8 ++++---- 8 files changed, 34 insertions(+), 22 deletions(-) diff --git a/cmd/api/docs/docs.go b/cmd/api/docs/docs.go index 1aeeae272..426156ff3 100644 --- a/cmd/api/docs/docs.go +++ b/cmd/api/docs/docs.go @@ -1348,21 +1348,25 @@ const docTemplate = `{ "api.PaginationMeta": { "type": "object", "properties": { - "has_next": { + "has_more": { "description": "whether there are more items available", - "type": "boolean" + "type": "boolean", + "example": true }, "limit": { "description": "the current limit", - "type": "integer" + "type": "integer", + "example": 100 }, "offset": { "description": "the current offset", - "type": "integer" + "type": "integer", + "example": 0 }, "total": { "description": "the total number of items returned", - "type": "integer" + "type": "integer", + "example": 100 } } }, diff --git a/cmd/api/docs/swagger.json b/cmd/api/docs/swagger.json index f891e097c..bb3358676 100644 --- a/cmd/api/docs/swagger.json +++ b/cmd/api/docs/swagger.json @@ -1342,21 +1342,25 @@ "api.PaginationMeta": { "type": "object", "properties": { - "has_next": { + "has_more": { "description": "whether there are more items available", - "type": "boolean" + "type": "boolean", + "example": true }, "limit": { "description": "the current limit", - "type": "integer" + "type": "integer", + "example": 100 }, "offset": { "description": "the current offset", - "type": "integer" + "type": "integer", + "example": 0 }, "total": { "description": "the total number of items returned", - "type": "integer" + "type": "integer", + "example": 100 } } }, diff --git a/cmd/api/docs/swagger.yaml b/cmd/api/docs/swagger.yaml index 3bf1db00f..5d8c8a223 100644 --- a/cmd/api/docs/swagger.yaml +++ b/cmd/api/docs/swagger.yaml @@ -253,17 +253,21 @@ definitions: type: object api.PaginationMeta: properties: - has_next: + has_more: description: whether there are more items available + example: true type: boolean limit: description: the current limit + example: 100 type: integer offset: description: the current offset + example: 0 type: integer total: description: the total number of items returned + example: 100 type: integer type: object api.Reactions: diff --git a/cmd/api/handlers.go b/cmd/api/handlers.go index bffc7f42f..0bb3f2401 100644 --- a/cmd/api/handlers.go +++ b/cmd/api/handlers.go @@ -295,7 +295,7 @@ func (a *ApiServer) getMembersHandler(c *gin.Context) { respondWithPagination(c, http.StatusOK, members, len(members), offset, limit, hasNext) } -// getObjectsForSpaceHandler retrieves objects in a specific space +// getObjectsHandler retrieves objects in a specific space // // @Summary Retrieve objects in a specific space // @Tags space_objects @@ -309,7 +309,7 @@ func (a *ApiServer) getMembersHandler(c *gin.Context) { // @Failure 404 {object} NotFoundError "Resource not found" // @Failure 502 {object} ServerError "Internal server error" // @Router /spaces/{space_id}/objects [get] -func (a *ApiServer) getObjectsForSpaceHandler(c *gin.Context) { +func (a *ApiServer) getObjectsHandler(c *gin.Context) { spaceId := c.Param("space_id") offset := c.GetInt("offset") limit := c.GetInt("limit") @@ -339,7 +339,7 @@ func (a *ApiServer) getObjectsForSpaceHandler(c *gin.Context) { IncludeTime: true, EmptyPlacement: model.BlockContentDataviewSort_NotSpecified, }}, - Keys: []string{"id", "name", "type", "layout", "iconEmoji", "iconImage", "lastModifiedDate"}, + Keys: []string{"id", "name", "type", "layout", "iconEmoji", "iconImage"}, Offset: int32(offset), Limit: int32(limit + 1), }) @@ -808,7 +808,7 @@ func (a *ApiServer) searchHandler(c *gin.Context) { IncludeTime: true, EmptyPlacement: model.BlockContentDataviewSort_NotSpecified, }}, - Keys: []string{"id", "name", "type", "layout", "iconEmoji", "iconImage", "lastModifiedDate"}, + Keys: []string{"id", "name", "type", "layout", "iconEmoji", "iconImage"}, Offset: int32(offset), Limit: int32(limit + 1), // TODO split limit between spaces diff --git a/cmd/api/handlers_test.go b/cmd/api/handlers_test.go index 7b2e4780c..22cf41b90 100644 --- a/cmd/api/handlers_test.go +++ b/cmd/api/handlers_test.go @@ -63,7 +63,7 @@ func newFixture(t *testing.T) *fixture { { readOnly.GET("/spaces", paginator, apiServer.getSpacesHandler) readOnly.GET("/spaces/:space_id/members", paginator, apiServer.getMembersHandler) - readOnly.GET("/spaces/:space_id/objects", paginator, apiServer.getObjectsForSpaceHandler) + readOnly.GET("/spaces/:space_id/objects", paginator, apiServer.getObjectsHandler) readOnly.GET("/spaces/:space_id/objects/:object_id", apiServer.getObjectHandler) readOnly.GET("/spaces/:space_id/objectTypes", paginator, apiServer.getObjectTypesHandler) readOnly.GET("/spaces/:space_id/objectTypes/:typeId/templates", paginator, apiServer.getObjectTypeTemplatesHandler) diff --git a/cmd/api/helper.go b/cmd/api/helper.go index df35033ac..34f532496 100644 --- a/cmd/api/helper.go +++ b/cmd/api/helper.go @@ -249,7 +249,7 @@ func respondWithPagination[T any](c *gin.Context, statusCode int, data []T, tota Total: total, Offset: offset, Limit: limit, - HasNext: hasNext, + HasMore: hasNext, }, }) } diff --git a/cmd/api/main.go b/cmd/api/main.go index b4dd6b962..e0e26baa9 100644 --- a/cmd/api/main.go +++ b/cmd/api/main.go @@ -102,7 +102,7 @@ func RunApiServer(ctx context.Context, mw service.ClientCommandsServer, mwIntern { readOnly.GET("/spaces", paginator, a.getSpacesHandler) readOnly.GET("/spaces/:space_id/members", paginator, a.getMembersHandler) - readOnly.GET("/spaces/:space_id/objects", paginator, a.getObjectsForSpaceHandler) + readOnly.GET("/spaces/:space_id/objects", paginator, a.getObjectsHandler) readOnly.GET("/spaces/:space_id/objects/:object_id", a.getObjectHandler) readOnly.GET("/spaces/:space_id/objectTypes", paginator, a.getObjectTypesHandler) readOnly.GET("/spaces/:space_id/objectTypes/:typeId/templates", paginator, a.getObjectTypeTemplatesHandler) diff --git a/cmd/api/schemas.go b/cmd/api/schemas.go index 52e9f8a90..3e9578697 100644 --- a/cmd/api/schemas.go +++ b/cmd/api/schemas.go @@ -1,10 +1,10 @@ package api type PaginationMeta struct { - Total int `json:"total"` // the total number of items returned - Offset int `json:"offset"` // the current offset - Limit int `json:"limit"` // the current limit - HasNext bool `json:"has_next"` // whether there are more items available + Total int `json:"total" example:"100"` // the total number of items returned + Offset int `json:"offset" example:"0"` // the current offset + Limit int `json:"limit" example:"100"` // the current limit + HasMore bool `json:"has_more" example:"true"` // whether there are more items available } type PaginatedResponse[T any] struct { From 5001594a8fb683a38b96050620003e04a739ad54 Mon Sep 17 00:00:00 2001 From: Jannis Metrikat <120120832+jmetrikat@users.noreply.github.com> Date: Sun, 29 Dec 2024 17:52:17 +0100 Subject: [PATCH 063/195] GO-4459 Refactor pagination and 'total' calculation --- cmd/api/docs/docs.go | 4 +- cmd/api/docs/swagger.json | 4 +- cmd/api/docs/swagger.yaml | 4 +- cmd/api/handlers.go | 102 ++++++++++++-------------------------- cmd/api/handlers_test.go | 4 +- cmd/api/helper.go | 23 ++++++++- cmd/api/schemas.go | 2 +- 7 files changed, 62 insertions(+), 81 deletions(-) diff --git a/cmd/api/docs/docs.go b/cmd/api/docs/docs.go index 426156ff3..fa14eb412 100644 --- a/cmd/api/docs/docs.go +++ b/cmd/api/docs/docs.go @@ -1364,9 +1364,9 @@ const docTemplate = `{ "example": 0 }, "total": { - "description": "the total number of items returned", + "description": "the total number of items available on that endpoint", "type": "integer", - "example": 100 + "example": 1024 } } }, diff --git a/cmd/api/docs/swagger.json b/cmd/api/docs/swagger.json index bb3358676..1cddd64a3 100644 --- a/cmd/api/docs/swagger.json +++ b/cmd/api/docs/swagger.json @@ -1358,9 +1358,9 @@ "example": 0 }, "total": { - "description": "the total number of items returned", + "description": "the total number of items available on that endpoint", "type": "integer", - "example": 100 + "example": 1024 } } }, diff --git a/cmd/api/docs/swagger.yaml b/cmd/api/docs/swagger.yaml index 5d8c8a223..08959f27e 100644 --- a/cmd/api/docs/swagger.yaml +++ b/cmd/api/docs/swagger.yaml @@ -266,8 +266,8 @@ definitions: example: 0 type: integer total: - description: the total number of items returned - example: 100 + description: the total number of items available on that endpoint + example: 1024 type: integer type: object api.Reactions: diff --git a/cmd/api/handlers.go b/cmd/api/handlers.go index 0bb3f2401..2728a5f48 100644 --- a/cmd/api/handlers.go +++ b/cmd/api/handlers.go @@ -129,9 +129,7 @@ func (a *ApiServer) getSpacesHandler(c *gin.Context) { Type: model.BlockContentDataviewSort_Asc, }, }, - Keys: []string{"targetSpaceId", "name", "iconEmoji", "iconImage"}, - Offset: int32(offset), - Limit: int32(limit + 1), + Keys: []string{"targetSpaceId", "name", "iconEmoji", "iconImage"}, }) if resp.Error.Code != pb.RpcObjectSearchResponseError_NULL { @@ -144,8 +142,10 @@ func (a *ApiServer) getSpacesHandler(c *gin.Context) { return } - spaces := make([]Space, 0, len(resp.Records)) - for _, record := range resp.Records { + paginatedSpaces, hasMore := paginate(resp.Records, offset, limit) + spaces := make([]Space, 0, len(paginatedSpaces)) + + for _, record := range paginatedSpaces { workspace, statusCode, errorMessage := a.getWorkspaceInfo(record.Fields["targetSpaceId"].GetStringValue()) if statusCode != http.StatusOK { c.JSON(statusCode, gin.H{"message": errorMessage}) @@ -158,13 +158,7 @@ func (a *ApiServer) getSpacesHandler(c *gin.Context) { spaces = append(spaces, workspace) } - hasNext := false - if len(spaces) > limit { - hasNext = true - spaces = spaces[:limit] - } - - respondWithPagination(c, http.StatusOK, spaces, len(spaces), offset, limit, hasNext) + respondWithPagination(c, http.StatusOK, spaces, len(resp.Records), offset, limit, hasMore) } // createSpaceHandler creates a new space @@ -254,9 +248,7 @@ func (a *ApiServer) getMembersHandler(c *gin.Context) { Type: model.BlockContentDataviewSort_Asc, }, }, - Keys: []string{"id", "name", "iconEmoji", "iconImage", "identity", "globalName", "participantPermissions"}, - Offset: int32(offset), - Limit: int32(limit + 1), + Keys: []string{"id", "name", "iconEmoji", "iconImage", "identity", "globalName", "participantPermissions"}, }) if resp.Error.Code != pb.RpcObjectSearchResponseError_NULL { @@ -269,8 +261,10 @@ func (a *ApiServer) getMembersHandler(c *gin.Context) { return } - members := make([]Member, 0, len(resp.Records)) - for _, record := range resp.Records { + paginatedMembers, hasMore := paginate(resp.Records, offset, limit) + members := make([]Member, 0, len(paginatedMembers)) + + for _, record := range paginatedMembers { icon := a.getIconFromEmojiOrImage(record.Fields["iconEmoji"].GetStringValue(), record.Fields["iconImage"].GetStringValue()) member := Member{ @@ -286,13 +280,7 @@ func (a *ApiServer) getMembersHandler(c *gin.Context) { members = append(members, member) } - hasNext := false - if len(members) > limit { - hasNext = true - members = members[:limit] - } - - respondWithPagination(c, http.StatusOK, members, len(members), offset, limit, hasNext) + respondWithPagination(c, http.StatusOK, members, len(resp.Records), offset, limit, hasMore) } // getObjectsHandler retrieves objects in a specific space @@ -339,9 +327,7 @@ func (a *ApiServer) getObjectsHandler(c *gin.Context) { IncludeTime: true, EmptyPlacement: model.BlockContentDataviewSort_NotSpecified, }}, - Keys: []string{"id", "name", "type", "layout", "iconEmoji", "iconImage"}, - Offset: int32(offset), - Limit: int32(limit + 1), + Keys: []string{"id", "name", "type", "layout", "iconEmoji", "iconImage"}, }) if resp.Error.Code != pb.RpcObjectSearchResponseError_NULL { @@ -354,8 +340,10 @@ func (a *ApiServer) getObjectsHandler(c *gin.Context) { return } - objects := make([]Object, 0, len(resp.Records)) - for _, record := range resp.Records { + paginatedObjects, hasMore := paginate(resp.Records, offset, limit) + objects := make([]Object, 0, len(paginatedObjects)) + + for _, record := range paginatedObjects { icon := a.getIconFromEmojiOrImage(record.Fields["iconEmoji"].GetStringValue(), record.Fields["iconImage"].GetStringValue()) objectTypeName, statusCode, errorMessage := a.resolveTypeToName(spaceId, record.Fields["type"].GetStringValue()) if statusCode != http.StatusOK { @@ -384,13 +372,7 @@ func (a *ApiServer) getObjectsHandler(c *gin.Context) { objects = append(objects, object) } - hasNext := false - if len(objects) > limit { - hasNext = true - objects = objects[:limit] - } - - respondWithPagination(c, http.StatusOK, objects, len(objects), offset, limit, hasNext) + respondWithPagination(c, http.StatusOK, objects, len(resp.Records), offset, limit, hasMore) } // getObjectHandler retrieves a specific object in a space @@ -559,9 +541,7 @@ func (a *ApiServer) getObjectTypesHandler(c *gin.Context) { Type: model.BlockContentDataviewSort_Asc, }, }, - Keys: []string{"id", "uniqueKey", "name", "iconEmoji"}, - Offset: int32(offset), - Limit: int32(limit + 1), + Keys: []string{"id", "uniqueKey", "name", "iconEmoji"}, }) if resp.Error.Code != pb.RpcObjectSearchResponseError_NULL { @@ -574,8 +554,10 @@ func (a *ApiServer) getObjectTypesHandler(c *gin.Context) { return } - objectTypes := make([]ObjectType, 0, len(resp.Records)) - for _, record := range resp.Records { + paginatedTypes, hasMore := paginate(resp.Records, offset, limit) + objectTypes := make([]ObjectType, 0, len(paginatedTypes)) + + for _, record := range paginatedTypes { objectTypes = append(objectTypes, ObjectType{ Type: "object_type", Id: record.Fields["id"].GetStringValue(), @@ -585,13 +567,7 @@ func (a *ApiServer) getObjectTypesHandler(c *gin.Context) { }) } - hasNext := false - if len(objectTypes) > limit { - hasNext = true - objectTypes = objectTypes[:limit] - } - - respondWithPagination(c, http.StatusOK, objectTypes, len(objectTypes), offset, limit, hasNext) + respondWithPagination(c, http.StatusOK, objectTypes, len(resp.Records), offset, limit, hasMore) } // getObjectTypeTemplatesHandler retrieves a list of templates for a specific object type in a space @@ -650,9 +626,7 @@ func (a *ApiServer) getObjectTypeTemplatesHandler(c *gin.Context) { Value: pbtypes.String(templateTypeId), }, }, - Keys: []string{"id", "targetObjectType", "name", "iconEmoji"}, - Offset: int32(offset), - Limit: int32(limit + 1), + Keys: []string{"id", "targetObjectType", "name", "iconEmoji"}, }) if templateObjectsResp.Error.Code != pb.RpcObjectSearchResponseError_NULL { @@ -673,8 +647,10 @@ func (a *ApiServer) getObjectTypeTemplatesHandler(c *gin.Context) { } // Finally, open each template and populate the response - templates := make([]ObjectTemplate, 0, len(templateIds)) - for _, templateId := range templateIds { + paginatedTemplates, hasMore := paginate(templateIds, offset, limit) + templates := make([]ObjectTemplate, 0, len(paginatedTemplates)) + + for _, templateId := range paginatedTemplates { templateResp := a.mw.ObjectShow(c.Request.Context(), &pb.RpcObjectShowRequest{ SpaceId: spaceId, ObjectId: templateId, @@ -693,13 +669,7 @@ func (a *ApiServer) getObjectTypeTemplatesHandler(c *gin.Context) { }) } - hasNext := false - if len(templates) > limit { - hasNext = true - templates = templates[:limit] - } - - respondWithPagination(c, http.StatusOK, templates, len(templates), offset, limit, hasNext) + respondWithPagination(c, http.StatusOK, templates, len(templateIds), offset, limit, hasMore) } // searchHandler searches and retrieves objects across all the spaces @@ -808,9 +778,7 @@ func (a *ApiServer) searchHandler(c *gin.Context) { IncludeTime: true, EmptyPlacement: model.BlockContentDataviewSort_NotSpecified, }}, - Keys: []string{"id", "name", "type", "layout", "iconEmoji", "iconImage"}, - Offset: int32(offset), - Limit: int32(limit + 1), + Keys: []string{"id", "name", "type", "layout", "iconEmoji", "iconImage"}, // TODO split limit between spaces // Limit: paginationLimitPerSpace, // FullText: searchTerm, @@ -858,13 +826,9 @@ func (a *ApiServer) searchHandler(c *gin.Context) { }) // TODO: solve global pagination vs per space pagination - hasNext := false - if len(searchResults) > limit { - hasNext = true - searchResults = searchResults[:limit] - } + paginatedResults, hasMore := paginate(searchResults, offset, limit) - respondWithPagination(c, http.StatusOK, searchResults, len(searchResults), offset, limit, hasNext) + respondWithPagination(c, http.StatusOK, paginatedResults, len(searchResults), offset, limit, hasMore) } // getChatMessagesHandler retrieves last chat messages diff --git a/cmd/api/handlers_test.go b/cmd/api/handlers_test.go index 22cf41b90..19d32f2b4 100644 --- a/cmd/api/handlers_test.go +++ b/cmd/api/handlers_test.go @@ -232,9 +232,7 @@ func TestApiServer_GetSpacesHandler(t *testing.T) { Type: model.BlockContentDataviewSort_Asc, }, }, - Keys: []string{"targetSpaceId", "name", "iconEmoji", "iconImage"}, - Offset: offset, - Limit: limit + 1, + Keys: []string{"targetSpaceId", "name", "iconEmoji", "iconImage"}, }).Return(&pb.RpcObjectSearchResponse{ Records: []*types.Struct{ { diff --git a/cmd/api/helper.go b/cmd/api/helper.go index 34f532496..8bd9839ca 100644 --- a/cmd/api/helper.go +++ b/cmd/api/helper.go @@ -242,14 +242,33 @@ func (a *ApiServer) getTags(resp *pb.RpcObjectShowResponse) []Tag { return tags } -func respondWithPagination[T any](c *gin.Context, statusCode int, data []T, total, offset, limit int, hasNext bool) { +// respondWithPagination returns a json response with the paginated data and corresponding metadata +func respondWithPagination[T any](c *gin.Context, statusCode int, data []T, total, offset, limit int, hasMore bool) { c.JSON(statusCode, PaginatedResponse[T]{ Data: data, Pagination: PaginationMeta{ Total: total, Offset: offset, Limit: limit, - HasMore: hasNext, + HasMore: hasMore, }, }) } + +// paginate paginates the given records based on the offset and limit +func paginate[T any](records []T, offset, limit int) ([]T, bool) { + total := len(records) + start := offset + end := offset + limit + + if start > total { + start = total + } + if end > total { + end = total + } + + paginated := records[start:end] + hasMore := end < total + return paginated, hasMore +} diff --git a/cmd/api/schemas.go b/cmd/api/schemas.go index 3e9578697..33461598c 100644 --- a/cmd/api/schemas.go +++ b/cmd/api/schemas.go @@ -1,7 +1,7 @@ package api type PaginationMeta struct { - Total int `json:"total" example:"100"` // the total number of items returned + Total int `json:"total" example:"1024"` // the total number of items available on that endpoint Offset int `json:"offset" example:"0"` // the current offset Limit int `json:"limit" example:"100"` // the current limit HasMore bool `json:"has_more" example:"true"` // whether there are more items available From c46d198d99fd8d4312c0cb819ed0b4499213cf5d Mon Sep 17 00:00:00 2001 From: Jannis Metrikat <120120832+jmetrikat@users.noreply.github.com> Date: Mon, 30 Dec 2024 11:14:34 +0100 Subject: [PATCH 064/195] GO-4459 Remove unused GetAccountInfo from core --- core/core.go | 10 ---- core/mock_core/mock_MiddlewareInternal.go | 62 ----------------------- 2 files changed, 72 deletions(-) diff --git a/core/core.go b/core/core.go index 7343f92a1..f7b4e308f 100644 --- a/core/core.go +++ b/core/core.go @@ -7,7 +7,6 @@ import ( "github.com/anyproto/any-sync/app" - "github.com/anyproto/anytype-heart/core/anytype/account" "github.com/anyproto/anytype-heart/core/application" "github.com/anyproto/anytype-heart/core/block" "github.com/anyproto/anytype-heart/core/block/collection" @@ -15,7 +14,6 @@ import ( "github.com/anyproto/anytype-heart/core/wallet" "github.com/anyproto/anytype-heart/pb" "github.com/anyproto/anytype-heart/pkg/lib/logging" - "github.com/anyproto/anytype-heart/pkg/lib/pb/model" utildebug "github.com/anyproto/anytype-heart/util/debug" ) @@ -27,7 +25,6 @@ var ( type MiddlewareInternal interface { GetApp() *app.App - GetAccountInfo(ctx context.Context) (*model.AccountInfo, error) } type Middleware struct { @@ -108,13 +105,6 @@ func (mw *Middleware) GetApp() *app.App { return mw.applicationService.GetApp() } -func (mw *Middleware) GetAccountInfo(ctx context.Context) (*model.AccountInfo, error) { - if a := mw.GetApp(); a != nil { - return a.MustComponent(account.CName).(account.Service).GetInfo(ctx) - } - return nil, ErrNotLoggedIn -} - func (mw *Middleware) SetEventSender(sender event.Sender) { mw.applicationService.SetEventSender(sender) } diff --git a/core/mock_core/mock_MiddlewareInternal.go b/core/mock_core/mock_MiddlewareInternal.go index d55bfa317..33f1ca692 100644 --- a/core/mock_core/mock_MiddlewareInternal.go +++ b/core/mock_core/mock_MiddlewareInternal.go @@ -3,13 +3,9 @@ package mock_core import ( - context "context" - app "github.com/anyproto/any-sync/app" mock "github.com/stretchr/testify/mock" - - model "github.com/anyproto/anytype-heart/pkg/lib/pb/model" ) // MockMiddlewareInternal is an autogenerated mock type for the MiddlewareInternal type @@ -25,64 +21,6 @@ func (_m *MockMiddlewareInternal) EXPECT() *MockMiddlewareInternal_Expecter { return &MockMiddlewareInternal_Expecter{mock: &_m.Mock} } -// GetAccountInfo provides a mock function with given fields: ctx -func (_m *MockMiddlewareInternal) GetAccountInfo(ctx context.Context) (*model.AccountInfo, error) { - ret := _m.Called(ctx) - - if len(ret) == 0 { - panic("no return value specified for GetAccountInfo") - } - - var r0 *model.AccountInfo - var r1 error - if rf, ok := ret.Get(0).(func(context.Context) (*model.AccountInfo, error)); ok { - return rf(ctx) - } - if rf, ok := ret.Get(0).(func(context.Context) *model.AccountInfo); ok { - r0 = rf(ctx) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*model.AccountInfo) - } - } - - if rf, ok := ret.Get(1).(func(context.Context) error); ok { - r1 = rf(ctx) - } else { - r1 = ret.Error(1) - } - - return r0, r1 -} - -// MockMiddlewareInternal_GetAccountInfo_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetAccountInfo' -type MockMiddlewareInternal_GetAccountInfo_Call struct { - *mock.Call -} - -// GetAccountInfo is a helper method to define mock.On call -// - ctx context.Context -func (_e *MockMiddlewareInternal_Expecter) GetAccountInfo(ctx interface{}) *MockMiddlewareInternal_GetAccountInfo_Call { - return &MockMiddlewareInternal_GetAccountInfo_Call{Call: _e.mock.On("GetAccountInfo", ctx)} -} - -func (_c *MockMiddlewareInternal_GetAccountInfo_Call) Run(run func(ctx context.Context)) *MockMiddlewareInternal_GetAccountInfo_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context)) - }) - return _c -} - -func (_c *MockMiddlewareInternal_GetAccountInfo_Call) Return(_a0 *model.AccountInfo, _a1 error) *MockMiddlewareInternal_GetAccountInfo_Call { - _c.Call.Return(_a0, _a1) - return _c -} - -func (_c *MockMiddlewareInternal_GetAccountInfo_Call) RunAndReturn(run func(context.Context) (*model.AccountInfo, error)) *MockMiddlewareInternal_GetAccountInfo_Call { - _c.Call.Return(run) - return _c -} - // GetApp provides a mock function with given fields: func (_m *MockMiddlewareInternal) GetApp() *app.App { ret := _m.Called() From c379686478ab8fef5e7f51b0c374230db3a03546 Mon Sep 17 00:00:00 2001 From: Jannis Metrikat <120120832+jmetrikat@users.noreply.github.com> Date: Mon, 30 Dec 2024 12:04:11 +0100 Subject: [PATCH 065/195] GO-4459: Implement support for spaceOrder --- cmd/api/handlers.go | 6 ++++-- cmd/api/handlers_test.go | 6 ++++-- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/cmd/api/handlers.go b/cmd/api/handlers.go index 2728a5f48..3ca7dc70c 100644 --- a/cmd/api/handlers.go +++ b/cmd/api/handlers.go @@ -125,8 +125,10 @@ func (a *ApiServer) getSpacesHandler(c *gin.Context) { }, Sorts: []*model.BlockContentDataviewSort{ { - RelationKey: "name", - Type: model.BlockContentDataviewSort_Asc, + RelationKey: "spaceOrder", + Type: model.BlockContentDataviewSort_Asc, + NoCollate: true, + EmptyPlacement: model.BlockContentDataviewSort_End, }, }, Keys: []string{"targetSpaceId", "name", "iconEmoji", "iconImage"}, diff --git a/cmd/api/handlers_test.go b/cmd/api/handlers_test.go index 19d32f2b4..04419d58a 100644 --- a/cmd/api/handlers_test.go +++ b/cmd/api/handlers_test.go @@ -228,8 +228,10 @@ func TestApiServer_GetSpacesHandler(t *testing.T) { }, Sorts: []*model.BlockContentDataviewSort{ { - RelationKey: "name", - Type: model.BlockContentDataviewSort_Asc, + RelationKey: "spaceOrder", + Type: model.BlockContentDataviewSort_Asc, + NoCollate: true, + EmptyPlacement: model.BlockContentDataviewSort_End, }, }, Keys: []string{"targetSpaceId", "name", "iconEmoji", "iconImage"}, From c0f69df4b94365b9a0f56475dd6bd17d85845926 Mon Sep 17 00:00:00 2001 From: Jannis Metrikat <120120832+jmetrikat@users.noreply.github.com> Date: Mon, 30 Dec 2024 15:19:04 +0100 Subject: [PATCH 066/195] GO-4459: Refactor into space, pagination, utils, remove chat --- cmd/api/docs/docs.go | 723 ++++++++----------------------- cmd/api/docs/swagger.json | 723 ++++++++----------------------- cmd/api/docs/swagger.yaml | 408 ++++------------- cmd/api/handlers.go | 410 +----------------- cmd/api/helper.go | 111 +---- cmd/api/main.go | 30 +- cmd/api/middleware.go | 1 + cmd/api/pagination/model.go | 13 + cmd/api/pagination/pagination.go | 39 ++ cmd/api/schemas.go | 78 ---- cmd/api/space/handler.go | 124 ++++++ cmd/api/space/model.go | 41 ++ cmd/api/space/service.go | 214 +++++++++ cmd/api/space/service_test.go | 312 +++++++++++++ cmd/api/utils/utils.go | 29 ++ 15 files changed, 1235 insertions(+), 2021 deletions(-) create mode 100644 cmd/api/pagination/model.go create mode 100644 cmd/api/pagination/pagination.go create mode 100644 cmd/api/space/handler.go create mode 100644 cmd/api/space/model.go create mode 100644 cmd/api/space/service.go create mode 100644 cmd/api/space/service_test.go create mode 100644 cmd/api/utils/utils.go diff --git a/cmd/api/docs/docs.go b/cmd/api/docs/docs.go index fa14eb412..f2f8e8790 100644 --- a/cmd/api/docs/docs.go +++ b/cmd/api/docs/docs.go @@ -200,7 +200,7 @@ const docTemplate = `{ "200": { "description": "List of spaces", "schema": { - "$ref": "#/definitions/api.PaginatedResponse-api_Space" + "$ref": "#/definitions/pagination.PaginatedResponse-space_Space" } }, "403": { @@ -249,7 +249,7 @@ const docTemplate = `{ "200": { "description": "Space created successfully", "schema": { - "$ref": "#/definitions/api.CreateSpaceResponse" + "$ref": "#/definitions/space.CreateSpaceResponse" } }, "403": { @@ -305,7 +305,7 @@ const docTemplate = `{ "200": { "description": "List of members", "schema": { - "$ref": "#/definitions/api.PaginatedResponse-api_Member" + "$ref": "#/definitions/pagination.PaginatedResponse-space_Member" } }, "403": { @@ -708,286 +708,9 @@ const docTemplate = `{ } } } - }, - "/v1/spaces/{space_id}/chat/messages": { - "get": { - "consumes": [ - "application/json" - ], - "produces": [ - "application/json" - ], - "tags": [ - "chat" - ], - "summary": "Retrieve last chat messages", - "parameters": [ - { - "type": "string", - "description": "The ID of the space", - "name": "space_id", - "in": "path", - "required": true - }, - { - "type": "integer", - "description": "The number of items to skip before starting to collect the result set", - "name": "offset", - "in": "query" - }, - { - "type": "integer", - "default": 100, - "description": "The number of items to return", - "name": "limit", - "in": "query" - } - ], - "responses": { - "200": { - "description": "List of chat messages", - "schema": { - "type": "object", - "additionalProperties": { - "type": "array", - "items": { - "$ref": "#/definitions/api.ChatMessage" - } - } - } - }, - "502": { - "description": "Internal server error", - "schema": { - "$ref": "#/definitions/api.ServerError" - } - } - } - }, - "post": { - "consumes": [ - "application/json" - ], - "produces": [ - "application/json" - ], - "tags": [ - "chat" - ], - "summary": "Add a new chat message", - "parameters": [ - { - "type": "string", - "description": "The ID of the space", - "name": "space_id", - "in": "path", - "required": true - }, - { - "description": "Chat message", - "name": "message", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/api.ChatMessage" - } - } - ], - "responses": { - "201": { - "description": "Created chat message", - "schema": { - "$ref": "#/definitions/api.ChatMessage" - } - }, - "400": { - "description": "Invalid input", - "schema": { - "$ref": "#/definitions/api.ValidationError" - } - }, - "502": { - "description": "Internal server error", - "schema": { - "$ref": "#/definitions/api.ServerError" - } - } - } - } - }, - "/v1/spaces/{space_id}/chat/messages/{message_id}": { - "get": { - "consumes": [ - "application/json" - ], - "produces": [ - "application/json" - ], - "tags": [ - "chat" - ], - "summary": "Retrieve a specific chat message", - "parameters": [ - { - "type": "string", - "description": "The ID of the space", - "name": "space_id", - "in": "path", - "required": true - }, - { - "type": "string", - "description": "Message ID", - "name": "message_id", - "in": "path", - "required": true - } - ], - "responses": { - "200": { - "description": "Chat message", - "schema": { - "$ref": "#/definitions/api.ChatMessage" - } - }, - "404": { - "description": "Message not found", - "schema": { - "$ref": "#/definitions/api.NotFoundError" - } - }, - "502": { - "description": "Internal server error", - "schema": { - "$ref": "#/definitions/api.ServerError" - } - } - } - }, - "put": { - "consumes": [ - "application/json" - ], - "produces": [ - "application/json" - ], - "tags": [ - "chat" - ], - "summary": "Update an existing chat message", - "parameters": [ - { - "type": "string", - "description": "The ID of the space", - "name": "space_id", - "in": "path", - "required": true - }, - { - "type": "string", - "description": "Message ID", - "name": "message_id", - "in": "path", - "required": true - }, - { - "description": "Chat message", - "name": "message", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/api.ChatMessage" - } - } - ], - "responses": { - "200": { - "description": "Updated chat message", - "schema": { - "$ref": "#/definitions/api.ChatMessage" - } - }, - "400": { - "description": "Invalid input", - "schema": { - "$ref": "#/definitions/api.ValidationError" - } - }, - "404": { - "description": "Message not found", - "schema": { - "$ref": "#/definitions/api.NotFoundError" - } - }, - "502": { - "description": "Internal server error", - "schema": { - "$ref": "#/definitions/api.ServerError" - } - } - } - }, - "delete": { - "consumes": [ - "application/json" - ], - "produces": [ - "application/json" - ], - "tags": [ - "chat" - ], - "summary": "Delete a chat message", - "parameters": [ - { - "type": "string", - "description": "The ID of the space", - "name": "space_id", - "in": "path", - "required": true - }, - { - "type": "string", - "description": "Message ID", - "name": "message_id", - "in": "path", - "required": true - } - ], - "responses": { - "204": { - "description": "Message deleted successfully" - }, - "404": { - "description": "Message not found", - "schema": { - "$ref": "#/definitions/api.NotFoundError" - } - }, - "502": { - "description": "Internal server error", - "schema": { - "$ref": "#/definitions/api.ServerError" - } - } - } - } } }, "definitions": { - "api.Attachment": { - "type": "object", - "properties": { - "target": { - "description": "Identifier for the attachment object", - "type": "string" - }, - "type": { - "description": "Type of attachment", - "type": "string" - } - } - }, "api.AuthDisplayCodeResponse": { "type": "object", "properties": { @@ -1039,72 +762,6 @@ const docTemplate = `{ } } }, - "api.ChatMessage": { - "type": "object", - "properties": { - "attachments": { - "description": "Attachments slice", - "type": "array", - "items": { - "$ref": "#/definitions/api.Attachment" - } - }, - "chat_message": { - "type": "string" - }, - "created_at": { - "type": "integer" - }, - "creator": { - "description": "Identifier for the message creator", - "type": "string" - }, - "id": { - "description": "Unique message identifier", - "type": "string" - }, - "message": { - "description": "Message content", - "allOf": [ - { - "$ref": "#/definitions/api.MessageContent" - } - ] - }, - "modified_at": { - "type": "integer" - }, - "order_id": { - "description": "Used for subscriptions", - "type": "string" - }, - "reactions": { - "description": "Reactions to the message", - "allOf": [ - { - "$ref": "#/definitions/api.Reactions" - } - ] - }, - "reply_to_message_id": { - "description": "Identifier for the message being replied to", - "type": "string" - } - } - }, - "api.CreateSpaceResponse": { - "type": "object", - "properties": { - "name": { - "type": "string", - "example": "Space Name" - }, - "space_id": { - "type": "string", - "example": "bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1" - } - } - }, "api.Detail": { "type": "object", "properties": { @@ -1149,71 +806,6 @@ const docTemplate = `{ } } }, - "api.IdentityList": { - "type": "object", - "properties": { - "ids": { - "description": "List of user IDs", - "type": "array", - "items": { - "type": "string" - } - } - } - }, - "api.Member": { - "type": "object", - "properties": { - "global_name": { - "type": "string", - "example": "john.any" - }, - "icon": { - "type": "string", - "example": "http://127.0.0.1:31006/image/bafybeieptz5hvcy6txplcvphjbbh5yjc2zqhmihs3owkh5oab4ezauzqay?width=100" - }, - "id": { - "type": "string", - "example": "_participant_bafyreigyfkt6rbv24sbv5aq2hko1bhmv5xxlf22b4bypdu6j7hnphm3psq_23me69r569oi1_AAjEaEwPF4nkEh9AWkqEnzcQ8HziBB4ETjiTpvRCQvWnSMDZ" - }, - "identity": { - "type": "string", - "example": "AAjEaEwPF4nkEh7AWkqEnzcQ8HziGB4ETjiTpvRCQvWnSMDZ" - }, - "name": { - "type": "string", - "example": "John Doe" - }, - "role": { - "type": "string", - "example": "Owner" - }, - "type": { - "type": "string", - "example": "member" - } - } - }, - "api.MessageContent": { - "type": "object", - "properties": { - "marks": { - "description": "List of marks applied to the text", - "type": "array", - "items": { - "type": "string" - } - }, - "style": { - "description": "The style/type of the message part", - "type": "string" - }, - "text": { - "description": "The text content of the message part", - "type": "string" - } - } - }, "api.NotFoundError": { "type": "object", "properties": { @@ -1317,71 +909,6 @@ const docTemplate = `{ } } }, - "api.PaginatedResponse-api_Member": { - "type": "object", - "properties": { - "data": { - "type": "array", - "items": { - "$ref": "#/definitions/api.Member" - } - }, - "pagination": { - "$ref": "#/definitions/api.PaginationMeta" - } - } - }, - "api.PaginatedResponse-api_Space": { - "type": "object", - "properties": { - "data": { - "type": "array", - "items": { - "$ref": "#/definitions/api.Space" - } - }, - "pagination": { - "$ref": "#/definitions/api.PaginationMeta" - } - } - }, - "api.PaginationMeta": { - "type": "object", - "properties": { - "has_more": { - "description": "whether there are more items available", - "type": "boolean", - "example": true - }, - "limit": { - "description": "the current limit", - "type": "integer", - "example": 100 - }, - "offset": { - "description": "the current offset", - "type": "integer", - "example": 0 - }, - "total": { - "description": "the total number of items available on that endpoint", - "type": "integer", - "example": 1024 - } - } - }, - "api.Reactions": { - "type": "object", - "properties": { - "reactions": { - "description": "Map of emoji to list of user IDs", - "type": "object", - "additionalProperties": { - "$ref": "#/definitions/api.IdentityList" - } - } - } - }, "api.ServerError": { "type": "object", "properties": { @@ -1395,75 +922,6 @@ const docTemplate = `{ } } }, - "api.Space": { - "type": "object", - "properties": { - "account_space_id": { - "type": "string", - "example": "bafyreihpd2knon5wbljhtfeg3fcqtg3i2pomhhnigui6lrjmzcjzep7gcy.23me69r569oi1" - }, - "archive_object_id": { - "type": "string", - "example": "bafyreialsgoyflf3etjm3parzurivyaukzivwortf32b4twnlwpwocsrri" - }, - "device_id": { - "type": "string", - "example": "12D3KooWGZMJ4kQVyQVXaj7gJPZr3RZ2nvd9M2Eq2pprEoPih9WF" - }, - "home_object_id": { - "type": "string", - "example": "bafyreie4qcl3wczb4cw5hrfyycikhjyh6oljdis3ewqrk5boaav3sbwqya" - }, - "icon": { - "type": "string", - "example": "http://127.0.0.1:31006/image/bafybeieptz5hvcy6txplcvphjbbh5yjc2zqhmihs3owkh5oab4ezauzqay?width=100" - }, - "id": { - "type": "string", - "example": "bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1" - }, - "marketplace_workspace_id": { - "type": "string", - "example": "_anytype_marketplace" - }, - "name": { - "type": "string", - "example": "Space Name" - }, - "network_id": { - "type": "string", - "example": "N83gJpVd9MuNRZAuJLZ7LiMntTThhPc6DtzWWVjb1M3PouVU" - }, - "profile_object_id": { - "type": "string", - "example": "bafyreiaxhwreshjqwndpwtdsu4mtihaqhhmlygqnyqpfyfwlqfq3rm3gw4" - }, - "space_view_id": { - "type": "string", - "example": "bafyreigzv3vq7qwlrsin6njoduq727ssnhwd6bgyfj6nm4hv3pxoc2rxhy" - }, - "tech_space_id": { - "type": "string", - "example": "bafyreif4xuwncrjl6jajt4zrrfnylpki476nv2w64yf42ovt7gia7oypii.23me69r569oi1" - }, - "timezone": { - "type": "string", - "example": "" - }, - "type": { - "type": "string", - "example": "space" - }, - "widgets_id": { - "type": "string", - "example": "bafyreialj7pceh53mifm5dixlho47ke4qjmsn2uh4wsjf7xq2pnlo5xfva" - }, - "workspace_object_id": { - "type": "string", - "example": "bafyreiapey2g6e6za4zfxvlgwdy4hbbfu676gmwrhnqvjbxvrchr7elr3y" - } - } - }, "api.Text": { "type": "object", "properties": { @@ -1509,6 +967,181 @@ const docTemplate = `{ } } } + }, + "pagination.PaginatedResponse-space_Member": { + "type": "object", + "properties": { + "data": { + "type": "array", + "items": { + "$ref": "#/definitions/space.Member" + } + }, + "pagination": { + "$ref": "#/definitions/pagination.PaginationMeta" + } + } + }, + "pagination.PaginatedResponse-space_Space": { + "type": "object", + "properties": { + "data": { + "type": "array", + "items": { + "$ref": "#/definitions/space.Space" + } + }, + "pagination": { + "$ref": "#/definitions/pagination.PaginationMeta" + } + } + }, + "pagination.PaginationMeta": { + "type": "object", + "properties": { + "has_more": { + "description": "whether there are more items available", + "type": "boolean", + "example": true + }, + "limit": { + "description": "the current limit", + "type": "integer", + "example": 100 + }, + "offset": { + "description": "the current offset", + "type": "integer", + "example": 0 + }, + "total": { + "description": "the total number of items available on that endpoint", + "type": "integer", + "example": 1024 + } + } + }, + "space.CreateSpaceResponse": { + "type": "object", + "properties": { + "space": { + "$ref": "#/definitions/space.Space" + } + } + }, + "space.Member": { + "type": "object", + "properties": { + "global_name": { + "type": "string", + "example": "john.any" + }, + "icon": { + "type": "string", + "example": "http://127.0.0.1:31006/image/bafybeieptz5hvcy6txplcvphjbbh5yjc2zqhmihs3owkh5oab4ezauzqay?width=100" + }, + "id": { + "type": "string", + "example": "_participant_bafyreigyfkt6rbv24sbv5aq2hko1bhmv5xxlf22b4bypdu6j7hnphm3psq_23me69r569oi1_AAjEaEwPF4nkEh9AWkqEnzcQ8HziBB4ETjiTpvRCQvWnSMDZ" + }, + "identity": { + "type": "string", + "example": "AAjEaEwPF4nkEh7AWkqEnzcQ8HziGB4ETjiTpvRCQvWnSMDZ" + }, + "name": { + "type": "string", + "example": "John Doe" + }, + "role": { + "type": "string", + "example": "Owner" + }, + "type": { + "type": "string", + "example": "member" + } + } + }, + "space.Space": { + "type": "object", + "properties": { + "account_space_id": { + "type": "string", + "example": "bafyreihpd2knon5wbljhtfeg3fcqtg3i2pomhhnigui6lrjmzcjzep7gcy.23me69r569oi1" + }, + "analytics_id": { + "type": "string", + "example": "" + }, + "archive_object_id": { + "type": "string", + "example": "bafyreialsgoyflf3etjm3parzurivyaukzivwortf32b4twnlwpwocsrri" + }, + "device_id": { + "type": "string", + "example": "12D3KooWGZMJ4kQVyQVXaj7gJPZr3RZ2nvd9M2Eq2pprEoPih9WF" + }, + "gateway_url": { + "type": "string", + "example": "" + }, + "home_object_id": { + "type": "string", + "example": "bafyreie4qcl3wczb4cw5hrfyycikhjyh6oljdis3ewqrk5boaav3sbwqya" + }, + "icon": { + "type": "string", + "example": "http://127.0.0.1:31006/image/bafybeieptz5hvcy6txplcvphjbbh5yjc2zqhmihs3owkh5oab4ezauzqay?width=100" + }, + "id": { + "type": "string", + "example": "bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1" + }, + "local_storage_path": { + "type": "string", + "example": "" + }, + "marketplace_workspace_id": { + "type": "string", + "example": "_anytype_marketplace" + }, + "name": { + "type": "string", + "example": "Space Name" + }, + "network_id": { + "type": "string", + "example": "N83gJpVd9MuNRZAuJLZ7LiMntTThhPc6DtzWWVjb1M3PouVU" + }, + "profile_object_id": { + "type": "string", + "example": "bafyreiaxhwreshjqwndpwtdsu4mtihaqhhmlygqnyqpfyfwlqfq3rm3gw4" + }, + "space_view_id": { + "type": "string", + "example": "bafyreigzv3vq7qwlrsin6njoduq727ssnhwd6bgyfj6nm4hv3pxoc2rxhy" + }, + "tech_space_id": { + "type": "string", + "example": "bafyreif4xuwncrjl6jajt4zrrfnylpki476nv2w64yf42ovt7gia7oypii.23me69r569oi1" + }, + "timezone": { + "type": "string", + "example": "" + }, + "type": { + "type": "string", + "example": "space" + }, + "widgets_id": { + "type": "string", + "example": "bafyreialj7pceh53mifm5dixlho47ke4qjmsn2uh4wsjf7xq2pnlo5xfva" + }, + "workspace_object_id": { + "type": "string", + "example": "bafyreiapey2g6e6za4zfxvlgwdy4hbbfu676gmwrhnqvjbxvrchr7elr3y" + } + } } }, "securityDefinitions": { diff --git a/cmd/api/docs/swagger.json b/cmd/api/docs/swagger.json index 1cddd64a3..8285da535 100644 --- a/cmd/api/docs/swagger.json +++ b/cmd/api/docs/swagger.json @@ -194,7 +194,7 @@ "200": { "description": "List of spaces", "schema": { - "$ref": "#/definitions/api.PaginatedResponse-api_Space" + "$ref": "#/definitions/pagination.PaginatedResponse-space_Space" } }, "403": { @@ -243,7 +243,7 @@ "200": { "description": "Space created successfully", "schema": { - "$ref": "#/definitions/api.CreateSpaceResponse" + "$ref": "#/definitions/space.CreateSpaceResponse" } }, "403": { @@ -299,7 +299,7 @@ "200": { "description": "List of members", "schema": { - "$ref": "#/definitions/api.PaginatedResponse-api_Member" + "$ref": "#/definitions/pagination.PaginatedResponse-space_Member" } }, "403": { @@ -702,286 +702,9 @@ } } } - }, - "/v1/spaces/{space_id}/chat/messages": { - "get": { - "consumes": [ - "application/json" - ], - "produces": [ - "application/json" - ], - "tags": [ - "chat" - ], - "summary": "Retrieve last chat messages", - "parameters": [ - { - "type": "string", - "description": "The ID of the space", - "name": "space_id", - "in": "path", - "required": true - }, - { - "type": "integer", - "description": "The number of items to skip before starting to collect the result set", - "name": "offset", - "in": "query" - }, - { - "type": "integer", - "default": 100, - "description": "The number of items to return", - "name": "limit", - "in": "query" - } - ], - "responses": { - "200": { - "description": "List of chat messages", - "schema": { - "type": "object", - "additionalProperties": { - "type": "array", - "items": { - "$ref": "#/definitions/api.ChatMessage" - } - } - } - }, - "502": { - "description": "Internal server error", - "schema": { - "$ref": "#/definitions/api.ServerError" - } - } - } - }, - "post": { - "consumes": [ - "application/json" - ], - "produces": [ - "application/json" - ], - "tags": [ - "chat" - ], - "summary": "Add a new chat message", - "parameters": [ - { - "type": "string", - "description": "The ID of the space", - "name": "space_id", - "in": "path", - "required": true - }, - { - "description": "Chat message", - "name": "message", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/api.ChatMessage" - } - } - ], - "responses": { - "201": { - "description": "Created chat message", - "schema": { - "$ref": "#/definitions/api.ChatMessage" - } - }, - "400": { - "description": "Invalid input", - "schema": { - "$ref": "#/definitions/api.ValidationError" - } - }, - "502": { - "description": "Internal server error", - "schema": { - "$ref": "#/definitions/api.ServerError" - } - } - } - } - }, - "/v1/spaces/{space_id}/chat/messages/{message_id}": { - "get": { - "consumes": [ - "application/json" - ], - "produces": [ - "application/json" - ], - "tags": [ - "chat" - ], - "summary": "Retrieve a specific chat message", - "parameters": [ - { - "type": "string", - "description": "The ID of the space", - "name": "space_id", - "in": "path", - "required": true - }, - { - "type": "string", - "description": "Message ID", - "name": "message_id", - "in": "path", - "required": true - } - ], - "responses": { - "200": { - "description": "Chat message", - "schema": { - "$ref": "#/definitions/api.ChatMessage" - } - }, - "404": { - "description": "Message not found", - "schema": { - "$ref": "#/definitions/api.NotFoundError" - } - }, - "502": { - "description": "Internal server error", - "schema": { - "$ref": "#/definitions/api.ServerError" - } - } - } - }, - "put": { - "consumes": [ - "application/json" - ], - "produces": [ - "application/json" - ], - "tags": [ - "chat" - ], - "summary": "Update an existing chat message", - "parameters": [ - { - "type": "string", - "description": "The ID of the space", - "name": "space_id", - "in": "path", - "required": true - }, - { - "type": "string", - "description": "Message ID", - "name": "message_id", - "in": "path", - "required": true - }, - { - "description": "Chat message", - "name": "message", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/api.ChatMessage" - } - } - ], - "responses": { - "200": { - "description": "Updated chat message", - "schema": { - "$ref": "#/definitions/api.ChatMessage" - } - }, - "400": { - "description": "Invalid input", - "schema": { - "$ref": "#/definitions/api.ValidationError" - } - }, - "404": { - "description": "Message not found", - "schema": { - "$ref": "#/definitions/api.NotFoundError" - } - }, - "502": { - "description": "Internal server error", - "schema": { - "$ref": "#/definitions/api.ServerError" - } - } - } - }, - "delete": { - "consumes": [ - "application/json" - ], - "produces": [ - "application/json" - ], - "tags": [ - "chat" - ], - "summary": "Delete a chat message", - "parameters": [ - { - "type": "string", - "description": "The ID of the space", - "name": "space_id", - "in": "path", - "required": true - }, - { - "type": "string", - "description": "Message ID", - "name": "message_id", - "in": "path", - "required": true - } - ], - "responses": { - "204": { - "description": "Message deleted successfully" - }, - "404": { - "description": "Message not found", - "schema": { - "$ref": "#/definitions/api.NotFoundError" - } - }, - "502": { - "description": "Internal server error", - "schema": { - "$ref": "#/definitions/api.ServerError" - } - } - } - } } }, "definitions": { - "api.Attachment": { - "type": "object", - "properties": { - "target": { - "description": "Identifier for the attachment object", - "type": "string" - }, - "type": { - "description": "Type of attachment", - "type": "string" - } - } - }, "api.AuthDisplayCodeResponse": { "type": "object", "properties": { @@ -1033,72 +756,6 @@ } } }, - "api.ChatMessage": { - "type": "object", - "properties": { - "attachments": { - "description": "Attachments slice", - "type": "array", - "items": { - "$ref": "#/definitions/api.Attachment" - } - }, - "chat_message": { - "type": "string" - }, - "created_at": { - "type": "integer" - }, - "creator": { - "description": "Identifier for the message creator", - "type": "string" - }, - "id": { - "description": "Unique message identifier", - "type": "string" - }, - "message": { - "description": "Message content", - "allOf": [ - { - "$ref": "#/definitions/api.MessageContent" - } - ] - }, - "modified_at": { - "type": "integer" - }, - "order_id": { - "description": "Used for subscriptions", - "type": "string" - }, - "reactions": { - "description": "Reactions to the message", - "allOf": [ - { - "$ref": "#/definitions/api.Reactions" - } - ] - }, - "reply_to_message_id": { - "description": "Identifier for the message being replied to", - "type": "string" - } - } - }, - "api.CreateSpaceResponse": { - "type": "object", - "properties": { - "name": { - "type": "string", - "example": "Space Name" - }, - "space_id": { - "type": "string", - "example": "bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1" - } - } - }, "api.Detail": { "type": "object", "properties": { @@ -1143,71 +800,6 @@ } } }, - "api.IdentityList": { - "type": "object", - "properties": { - "ids": { - "description": "List of user IDs", - "type": "array", - "items": { - "type": "string" - } - } - } - }, - "api.Member": { - "type": "object", - "properties": { - "global_name": { - "type": "string", - "example": "john.any" - }, - "icon": { - "type": "string", - "example": "http://127.0.0.1:31006/image/bafybeieptz5hvcy6txplcvphjbbh5yjc2zqhmihs3owkh5oab4ezauzqay?width=100" - }, - "id": { - "type": "string", - "example": "_participant_bafyreigyfkt6rbv24sbv5aq2hko1bhmv5xxlf22b4bypdu6j7hnphm3psq_23me69r569oi1_AAjEaEwPF4nkEh9AWkqEnzcQ8HziBB4ETjiTpvRCQvWnSMDZ" - }, - "identity": { - "type": "string", - "example": "AAjEaEwPF4nkEh7AWkqEnzcQ8HziGB4ETjiTpvRCQvWnSMDZ" - }, - "name": { - "type": "string", - "example": "John Doe" - }, - "role": { - "type": "string", - "example": "Owner" - }, - "type": { - "type": "string", - "example": "member" - } - } - }, - "api.MessageContent": { - "type": "object", - "properties": { - "marks": { - "description": "List of marks applied to the text", - "type": "array", - "items": { - "type": "string" - } - }, - "style": { - "description": "The style/type of the message part", - "type": "string" - }, - "text": { - "description": "The text content of the message part", - "type": "string" - } - } - }, "api.NotFoundError": { "type": "object", "properties": { @@ -1311,71 +903,6 @@ } } }, - "api.PaginatedResponse-api_Member": { - "type": "object", - "properties": { - "data": { - "type": "array", - "items": { - "$ref": "#/definitions/api.Member" - } - }, - "pagination": { - "$ref": "#/definitions/api.PaginationMeta" - } - } - }, - "api.PaginatedResponse-api_Space": { - "type": "object", - "properties": { - "data": { - "type": "array", - "items": { - "$ref": "#/definitions/api.Space" - } - }, - "pagination": { - "$ref": "#/definitions/api.PaginationMeta" - } - } - }, - "api.PaginationMeta": { - "type": "object", - "properties": { - "has_more": { - "description": "whether there are more items available", - "type": "boolean", - "example": true - }, - "limit": { - "description": "the current limit", - "type": "integer", - "example": 100 - }, - "offset": { - "description": "the current offset", - "type": "integer", - "example": 0 - }, - "total": { - "description": "the total number of items available on that endpoint", - "type": "integer", - "example": 1024 - } - } - }, - "api.Reactions": { - "type": "object", - "properties": { - "reactions": { - "description": "Map of emoji to list of user IDs", - "type": "object", - "additionalProperties": { - "$ref": "#/definitions/api.IdentityList" - } - } - } - }, "api.ServerError": { "type": "object", "properties": { @@ -1389,75 +916,6 @@ } } }, - "api.Space": { - "type": "object", - "properties": { - "account_space_id": { - "type": "string", - "example": "bafyreihpd2knon5wbljhtfeg3fcqtg3i2pomhhnigui6lrjmzcjzep7gcy.23me69r569oi1" - }, - "archive_object_id": { - "type": "string", - "example": "bafyreialsgoyflf3etjm3parzurivyaukzivwortf32b4twnlwpwocsrri" - }, - "device_id": { - "type": "string", - "example": "12D3KooWGZMJ4kQVyQVXaj7gJPZr3RZ2nvd9M2Eq2pprEoPih9WF" - }, - "home_object_id": { - "type": "string", - "example": "bafyreie4qcl3wczb4cw5hrfyycikhjyh6oljdis3ewqrk5boaav3sbwqya" - }, - "icon": { - "type": "string", - "example": "http://127.0.0.1:31006/image/bafybeieptz5hvcy6txplcvphjbbh5yjc2zqhmihs3owkh5oab4ezauzqay?width=100" - }, - "id": { - "type": "string", - "example": "bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1" - }, - "marketplace_workspace_id": { - "type": "string", - "example": "_anytype_marketplace" - }, - "name": { - "type": "string", - "example": "Space Name" - }, - "network_id": { - "type": "string", - "example": "N83gJpVd9MuNRZAuJLZ7LiMntTThhPc6DtzWWVjb1M3PouVU" - }, - "profile_object_id": { - "type": "string", - "example": "bafyreiaxhwreshjqwndpwtdsu4mtihaqhhmlygqnyqpfyfwlqfq3rm3gw4" - }, - "space_view_id": { - "type": "string", - "example": "bafyreigzv3vq7qwlrsin6njoduq727ssnhwd6bgyfj6nm4hv3pxoc2rxhy" - }, - "tech_space_id": { - "type": "string", - "example": "bafyreif4xuwncrjl6jajt4zrrfnylpki476nv2w64yf42ovt7gia7oypii.23me69r569oi1" - }, - "timezone": { - "type": "string", - "example": "" - }, - "type": { - "type": "string", - "example": "space" - }, - "widgets_id": { - "type": "string", - "example": "bafyreialj7pceh53mifm5dixlho47ke4qjmsn2uh4wsjf7xq2pnlo5xfva" - }, - "workspace_object_id": { - "type": "string", - "example": "bafyreiapey2g6e6za4zfxvlgwdy4hbbfu676gmwrhnqvjbxvrchr7elr3y" - } - } - }, "api.Text": { "type": "object", "properties": { @@ -1503,6 +961,181 @@ } } } + }, + "pagination.PaginatedResponse-space_Member": { + "type": "object", + "properties": { + "data": { + "type": "array", + "items": { + "$ref": "#/definitions/space.Member" + } + }, + "pagination": { + "$ref": "#/definitions/pagination.PaginationMeta" + } + } + }, + "pagination.PaginatedResponse-space_Space": { + "type": "object", + "properties": { + "data": { + "type": "array", + "items": { + "$ref": "#/definitions/space.Space" + } + }, + "pagination": { + "$ref": "#/definitions/pagination.PaginationMeta" + } + } + }, + "pagination.PaginationMeta": { + "type": "object", + "properties": { + "has_more": { + "description": "whether there are more items available", + "type": "boolean", + "example": true + }, + "limit": { + "description": "the current limit", + "type": "integer", + "example": 100 + }, + "offset": { + "description": "the current offset", + "type": "integer", + "example": 0 + }, + "total": { + "description": "the total number of items available on that endpoint", + "type": "integer", + "example": 1024 + } + } + }, + "space.CreateSpaceResponse": { + "type": "object", + "properties": { + "space": { + "$ref": "#/definitions/space.Space" + } + } + }, + "space.Member": { + "type": "object", + "properties": { + "global_name": { + "type": "string", + "example": "john.any" + }, + "icon": { + "type": "string", + "example": "http://127.0.0.1:31006/image/bafybeieptz5hvcy6txplcvphjbbh5yjc2zqhmihs3owkh5oab4ezauzqay?width=100" + }, + "id": { + "type": "string", + "example": "_participant_bafyreigyfkt6rbv24sbv5aq2hko1bhmv5xxlf22b4bypdu6j7hnphm3psq_23me69r569oi1_AAjEaEwPF4nkEh9AWkqEnzcQ8HziBB4ETjiTpvRCQvWnSMDZ" + }, + "identity": { + "type": "string", + "example": "AAjEaEwPF4nkEh7AWkqEnzcQ8HziGB4ETjiTpvRCQvWnSMDZ" + }, + "name": { + "type": "string", + "example": "John Doe" + }, + "role": { + "type": "string", + "example": "Owner" + }, + "type": { + "type": "string", + "example": "member" + } + } + }, + "space.Space": { + "type": "object", + "properties": { + "account_space_id": { + "type": "string", + "example": "bafyreihpd2knon5wbljhtfeg3fcqtg3i2pomhhnigui6lrjmzcjzep7gcy.23me69r569oi1" + }, + "analytics_id": { + "type": "string", + "example": "" + }, + "archive_object_id": { + "type": "string", + "example": "bafyreialsgoyflf3etjm3parzurivyaukzivwortf32b4twnlwpwocsrri" + }, + "device_id": { + "type": "string", + "example": "12D3KooWGZMJ4kQVyQVXaj7gJPZr3RZ2nvd9M2Eq2pprEoPih9WF" + }, + "gateway_url": { + "type": "string", + "example": "" + }, + "home_object_id": { + "type": "string", + "example": "bafyreie4qcl3wczb4cw5hrfyycikhjyh6oljdis3ewqrk5boaav3sbwqya" + }, + "icon": { + "type": "string", + "example": "http://127.0.0.1:31006/image/bafybeieptz5hvcy6txplcvphjbbh5yjc2zqhmihs3owkh5oab4ezauzqay?width=100" + }, + "id": { + "type": "string", + "example": "bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1" + }, + "local_storage_path": { + "type": "string", + "example": "" + }, + "marketplace_workspace_id": { + "type": "string", + "example": "_anytype_marketplace" + }, + "name": { + "type": "string", + "example": "Space Name" + }, + "network_id": { + "type": "string", + "example": "N83gJpVd9MuNRZAuJLZ7LiMntTThhPc6DtzWWVjb1M3PouVU" + }, + "profile_object_id": { + "type": "string", + "example": "bafyreiaxhwreshjqwndpwtdsu4mtihaqhhmlygqnyqpfyfwlqfq3rm3gw4" + }, + "space_view_id": { + "type": "string", + "example": "bafyreigzv3vq7qwlrsin6njoduq727ssnhwd6bgyfj6nm4hv3pxoc2rxhy" + }, + "tech_space_id": { + "type": "string", + "example": "bafyreif4xuwncrjl6jajt4zrrfnylpki476nv2w64yf42ovt7gia7oypii.23me69r569oi1" + }, + "timezone": { + "type": "string", + "example": "" + }, + "type": { + "type": "string", + "example": "space" + }, + "widgets_id": { + "type": "string", + "example": "bafyreialj7pceh53mifm5dixlho47ke4qjmsn2uh4wsjf7xq2pnlo5xfva" + }, + "workspace_object_id": { + "type": "string", + "example": "bafyreiapey2g6e6za4zfxvlgwdy4hbbfu676gmwrhnqvjbxvrchr7elr3y" + } + } } }, "securityDefinitions": { diff --git a/cmd/api/docs/swagger.yaml b/cmd/api/docs/swagger.yaml index 08959f27e..a9f287cae 100644 --- a/cmd/api/docs/swagger.yaml +++ b/cmd/api/docs/swagger.yaml @@ -1,14 +1,5 @@ basePath: /v1 definitions: - api.Attachment: - properties: - target: - description: Identifier for the attachment object - type: string - type: - description: Type of attachment - type: string - type: object api.AuthDisplayCodeResponse: properties: challenge_id: @@ -43,49 +34,6 @@ definitions: vertical_align: type: string type: object - api.ChatMessage: - properties: - attachments: - description: Attachments slice - items: - $ref: '#/definitions/api.Attachment' - type: array - chat_message: - type: string - created_at: - type: integer - creator: - description: Identifier for the message creator - type: string - id: - description: Unique message identifier - type: string - message: - allOf: - - $ref: '#/definitions/api.MessageContent' - description: Message content - modified_at: - type: integer - order_id: - description: Used for subscriptions - type: string - reactions: - allOf: - - $ref: '#/definitions/api.Reactions' - description: Reactions to the message - reply_to_message_id: - description: Identifier for the message being replied to - type: string - type: object - api.CreateSpaceResponse: - properties: - name: - example: Space Name - type: string - space_id: - example: bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1 - type: string - type: object api.Detail: properties: details: @@ -115,52 +63,6 @@ definitions: type: type: string type: object - api.IdentityList: - properties: - ids: - description: List of user IDs - items: - type: string - type: array - type: object - api.Member: - properties: - global_name: - example: john.any - type: string - icon: - example: http://127.0.0.1:31006/image/bafybeieptz5hvcy6txplcvphjbbh5yjc2zqhmihs3owkh5oab4ezauzqay?width=100 - type: string - id: - example: _participant_bafyreigyfkt6rbv24sbv5aq2hko1bhmv5xxlf22b4bypdu6j7hnphm3psq_23me69r569oi1_AAjEaEwPF4nkEh9AWkqEnzcQ8HziBB4ETjiTpvRCQvWnSMDZ - type: string - identity: - example: AAjEaEwPF4nkEh7AWkqEnzcQ8HziGB4ETjiTpvRCQvWnSMDZ - type: string - name: - example: John Doe - type: string - role: - example: Owner - type: string - type: - example: member - type: string - type: object - api.MessageContent: - properties: - marks: - description: List of marks applied to the text - items: - type: string - type: array - style: - description: The style/type of the message part - type: string - text: - description: The text content of the message part - type: string - type: object api.NotFoundError: properties: error: @@ -233,25 +135,62 @@ definitions: example: ot-page type: string type: object - api.PaginatedResponse-api_Member: + api.ServerError: + properties: + error: + properties: + message: + type: string + type: object + type: object + api.Text: + properties: + checked: + type: boolean + color: + type: string + icon: + type: string + style: + type: string + text: + type: string + type: object + api.UnauthorizedError: + properties: + error: + properties: + message: + type: string + type: object + type: object + api.ValidationError: + properties: + error: + properties: + message: + type: string + type: object + type: object + pagination.PaginatedResponse-space_Member: properties: data: items: - $ref: '#/definitions/api.Member' + $ref: '#/definitions/space.Member' type: array pagination: - $ref: '#/definitions/api.PaginationMeta' + $ref: '#/definitions/pagination.PaginationMeta' type: object - api.PaginatedResponse-api_Space: + pagination.PaginatedResponse-space_Space: properties: data: items: - $ref: '#/definitions/api.Space' + $ref: '#/definitions/space.Space' type: array pagination: - $ref: '#/definitions/api.PaginationMeta' + $ref: '#/definitions/pagination.PaginationMeta' type: object - api.PaginationMeta: + pagination.PaginationMeta: properties: has_more: description: whether there are more items available @@ -270,33 +209,52 @@ definitions: example: 1024 type: integer type: object - api.Reactions: + space.CreateSpaceResponse: properties: - reactions: - additionalProperties: - $ref: '#/definitions/api.IdentityList' - description: Map of emoji to list of user IDs - type: object + space: + $ref: '#/definitions/space.Space' type: object - api.ServerError: + space.Member: properties: - error: - properties: - message: - type: string - type: object + global_name: + example: john.any + type: string + icon: + example: http://127.0.0.1:31006/image/bafybeieptz5hvcy6txplcvphjbbh5yjc2zqhmihs3owkh5oab4ezauzqay?width=100 + type: string + id: + example: _participant_bafyreigyfkt6rbv24sbv5aq2hko1bhmv5xxlf22b4bypdu6j7hnphm3psq_23me69r569oi1_AAjEaEwPF4nkEh9AWkqEnzcQ8HziBB4ETjiTpvRCQvWnSMDZ + type: string + identity: + example: AAjEaEwPF4nkEh7AWkqEnzcQ8HziGB4ETjiTpvRCQvWnSMDZ + type: string + name: + example: John Doe + type: string + role: + example: Owner + type: string + type: + example: member + type: string type: object - api.Space: + space.Space: properties: account_space_id: example: bafyreihpd2knon5wbljhtfeg3fcqtg3i2pomhhnigui6lrjmzcjzep7gcy.23me69r569oi1 type: string + analytics_id: + example: "" + type: string archive_object_id: example: bafyreialsgoyflf3etjm3parzurivyaukzivwortf32b4twnlwpwocsrri type: string device_id: example: 12D3KooWGZMJ4kQVyQVXaj7gJPZr3RZ2nvd9M2Eq2pprEoPih9WF type: string + gateway_url: + example: "" + type: string home_object_id: example: bafyreie4qcl3wczb4cw5hrfyycikhjyh6oljdis3ewqrk5boaav3sbwqya type: string @@ -306,6 +264,9 @@ definitions: id: example: bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1 type: string + local_storage_path: + example: "" + type: string marketplace_workspace_id: example: _anytype_marketplace type: string @@ -337,35 +298,6 @@ definitions: example: bafyreiapey2g6e6za4zfxvlgwdy4hbbfu676gmwrhnqvjbxvrchr7elr3y type: string type: object - api.Text: - properties: - checked: - type: boolean - color: - type: string - icon: - type: string - style: - type: string - text: - type: string - type: object - api.UnauthorizedError: - properties: - error: - properties: - message: - type: string - type: object - type: object - api.ValidationError: - properties: - error: - properties: - message: - type: string - type: object - type: object externalDocs: description: OpenAPI url: https://swagger.io/resources/open-api/ @@ -501,7 +433,7 @@ paths: "200": description: List of spaces schema: - $ref: '#/definitions/api.PaginatedResponse-api_Space' + $ref: '#/definitions/pagination.PaginatedResponse-space_Space' "403": description: Unauthorized schema: @@ -533,7 +465,7 @@ paths: "200": description: Space created successfully schema: - $ref: '#/definitions/api.CreateSpaceResponse' + $ref: '#/definitions/space.CreateSpaceResponse' "403": description: Unauthorized schema: @@ -571,7 +503,7 @@ paths: "200": description: List of members schema: - $ref: '#/definitions/api.PaginatedResponse-api_Member' + $ref: '#/definitions/pagination.PaginatedResponse-space_Member' "403": description: Unauthorized schema: @@ -842,182 +774,6 @@ paths: summary: Update an existing object in a specific space tags: - space_objects - /v1/spaces/{space_id}/chat/messages: - get: - consumes: - - application/json - parameters: - - description: The ID of the space - in: path - name: space_id - required: true - type: string - - description: The number of items to skip before starting to collect the result - set - in: query - name: offset - type: integer - - default: 100 - description: The number of items to return - in: query - name: limit - type: integer - produces: - - application/json - responses: - "200": - description: List of chat messages - schema: - additionalProperties: - items: - $ref: '#/definitions/api.ChatMessage' - type: array - type: object - "502": - description: Internal server error - schema: - $ref: '#/definitions/api.ServerError' - summary: Retrieve last chat messages - tags: - - chat - post: - consumes: - - application/json - parameters: - - description: The ID of the space - in: path - name: space_id - required: true - type: string - - description: Chat message - in: body - name: message - required: true - schema: - $ref: '#/definitions/api.ChatMessage' - produces: - - application/json - responses: - "201": - description: Created chat message - schema: - $ref: '#/definitions/api.ChatMessage' - "400": - description: Invalid input - schema: - $ref: '#/definitions/api.ValidationError' - "502": - description: Internal server error - schema: - $ref: '#/definitions/api.ServerError' - summary: Add a new chat message - tags: - - chat - /v1/spaces/{space_id}/chat/messages/{message_id}: - delete: - consumes: - - application/json - parameters: - - description: The ID of the space - in: path - name: space_id - required: true - type: string - - description: Message ID - in: path - name: message_id - required: true - type: string - produces: - - application/json - responses: - "204": - description: Message deleted successfully - "404": - description: Message not found - schema: - $ref: '#/definitions/api.NotFoundError' - "502": - description: Internal server error - schema: - $ref: '#/definitions/api.ServerError' - summary: Delete a chat message - tags: - - chat - get: - consumes: - - application/json - parameters: - - description: The ID of the space - in: path - name: space_id - required: true - type: string - - description: Message ID - in: path - name: message_id - required: true - type: string - produces: - - application/json - responses: - "200": - description: Chat message - schema: - $ref: '#/definitions/api.ChatMessage' - "404": - description: Message not found - schema: - $ref: '#/definitions/api.NotFoundError' - "502": - description: Internal server error - schema: - $ref: '#/definitions/api.ServerError' - summary: Retrieve a specific chat message - tags: - - chat - put: - consumes: - - application/json - parameters: - - description: The ID of the space - in: path - name: space_id - required: true - type: string - - description: Message ID - in: path - name: message_id - required: true - type: string - - description: Chat message - in: body - name: message - required: true - schema: - $ref: '#/definitions/api.ChatMessage' - produces: - - application/json - responses: - "200": - description: Updated chat message - schema: - $ref: '#/definitions/api.ChatMessage' - "400": - description: Invalid input - schema: - $ref: '#/definitions/api.ValidationError' - "404": - description: Message not found - schema: - $ref: '#/definitions/api.NotFoundError' - "502": - description: Internal server error - schema: - $ref: '#/definitions/api.ServerError' - summary: Update an existing chat message - tags: - - chat securityDefinitions: BasicAuth: type: basic diff --git a/cmd/api/handlers.go b/cmd/api/handlers.go index 3ca7dc70c..a5e132519 100644 --- a/cmd/api/handlers.go +++ b/cmd/api/handlers.go @@ -1,24 +1,20 @@ package api import ( - "crypto/rand" - "math/big" "net/http" "sort" "github.com/gin-gonic/gin" "github.com/gogo/protobuf/types" + "github.com/anyproto/anytype-heart/cmd/api/pagination" + "github.com/anyproto/anytype-heart/cmd/api/utils" "github.com/anyproto/anytype-heart/pb" "github.com/anyproto/anytype-heart/pkg/lib/bundle" "github.com/anyproto/anytype-heart/pkg/lib/pb/model" "github.com/anyproto/anytype-heart/util/pbtypes" ) -type CreateSpaceRequest struct { - Name string `json:"name"` -} - type CreateObjectRequest struct { Name string `json:"name"` Icon string `json:"icon"` @@ -86,205 +82,6 @@ func (a *ApiServer) authTokenHandler(c *gin.Context) { }) } -// getSpacesHandler retrieves a list of spaces -// -// @Summary Retrieve a list of spaces -// @Tags spaces -// @Accept json -// @Produce json -// @Param offset query int false "The number of items to skip before starting to collect the result set" -// @Param limit query int false "The number of items to return" default(100) -// @Success 200 {object} PaginatedResponse[Space] "List of spaces" -// @Failure 403 {object} UnauthorizedError "Unauthorized" -// @Failure 404 {object} NotFoundError "Resource not found" -// @Failure 502 {object} ServerError "Internal server error" -// @Router /spaces [get] -func (a *ApiServer) getSpacesHandler(c *gin.Context) { - offset := c.GetInt("offset") - limit := c.GetInt("limit") - - // Call ObjectSearch for all objects of type spaceView - resp := a.mw.ObjectSearch(c.Request.Context(), &pb.RpcObjectSearchRequest{ - SpaceId: a.accountInfo.TechSpaceId, - Filters: []*model.BlockContentDataviewFilter{ - { - RelationKey: bundle.RelationKeyLayout.String(), - Condition: model.BlockContentDataviewFilter_Equal, - Value: pbtypes.Int64(int64(model.ObjectType_spaceView)), - }, - { - RelationKey: bundle.RelationKeySpaceLocalStatus.String(), - Condition: model.BlockContentDataviewFilter_Equal, - Value: pbtypes.Int64(int64(model.SpaceStatus_Ok)), - }, - { - RelationKey: bundle.RelationKeySpaceRemoteStatus.String(), - Condition: model.BlockContentDataviewFilter_Equal, - Value: pbtypes.Int64(int64(model.SpaceStatus_Ok)), - }, - }, - Sorts: []*model.BlockContentDataviewSort{ - { - RelationKey: "spaceOrder", - Type: model.BlockContentDataviewSort_Asc, - NoCollate: true, - EmptyPlacement: model.BlockContentDataviewSort_End, - }, - }, - Keys: []string{"targetSpaceId", "name", "iconEmoji", "iconImage"}, - }) - - if resp.Error.Code != pb.RpcObjectSearchResponseError_NULL { - c.JSON(http.StatusInternalServerError, gin.H{"message": "Failed to retrieve list of spaces."}) - return - } - - if len(resp.Records) == 0 { - c.JSON(http.StatusNotFound, gin.H{"message": "No spaces found."}) - return - } - - paginatedSpaces, hasMore := paginate(resp.Records, offset, limit) - spaces := make([]Space, 0, len(paginatedSpaces)) - - for _, record := range paginatedSpaces { - workspace, statusCode, errorMessage := a.getWorkspaceInfo(record.Fields["targetSpaceId"].GetStringValue()) - if statusCode != http.StatusOK { - c.JSON(statusCode, gin.H{"message": errorMessage}) - return - } - - workspace.Name = record.Fields["name"].GetStringValue() - workspace.Icon = a.getIconFromEmojiOrImage(record.Fields["iconEmoji"].GetStringValue(), record.Fields["iconImage"].GetStringValue()) - - spaces = append(spaces, workspace) - } - - respondWithPagination(c, http.StatusOK, spaces, len(resp.Records), offset, limit, hasMore) -} - -// createSpaceHandler creates a new space -// -// @Summary Create a new Space -// @Tags spaces -// @Accept json -// @Produce json -// @Param name body string true "Space Name" -// @Success 200 {object} CreateSpaceResponse "Space created successfully" -// @Failure 403 {object} UnauthorizedError "Unauthorized" -// @Failure 502 {object} ServerError "Internal server error" -// @Router /spaces [post] -func (a *ApiServer) createSpaceHandler(c *gin.Context) { - nameRequest := CreateSpaceRequest{} - if err := c.BindJSON(&nameRequest); err != nil { - c.JSON(http.StatusBadRequest, gin.H{"message": "Invalid JSON"}) - return - } - name := nameRequest.Name - iconOption, err := rand.Int(rand.Reader, big.NewInt(13)) - if err != nil { - c.JSON(http.StatusInternalServerError, gin.H{"message": "Failed to generate random icon."}) - return - } - - // Create new workspace with a random icon and import default use case - resp := a.mw.WorkspaceCreate(c.Request.Context(), &pb.RpcWorkspaceCreateRequest{ - Details: &types.Struct{ - Fields: map[string]*types.Value{ - "iconOption": {Kind: &types.Value_NumberValue{NumberValue: float64(iconOption.Int64())}}, - "name": {Kind: &types.Value_StringValue{StringValue: name}}, - "spaceDashboardId": {Kind: &types.Value_StringValue{ - StringValue: "lastOpened", - }}, - }, - }, - UseCase: pb.RpcObjectImportUseCaseRequest_GET_STARTED, - WithChat: true, - }) - - if resp.Error.Code != pb.RpcWorkspaceCreateResponseError_NULL { - c.JSON(http.StatusInternalServerError, gin.H{"message": "Failed to create a new space."}) - return - } - - c.JSON(http.StatusOK, CreateSpaceResponse{SpaceId: resp.SpaceId, Name: name}) -} - -// getMembersHandler retrieves a list of members for the specified space -// -// @Summary Retrieve a list of members for the specified Space -// @Tags spaces -// @Accept json -// @Produce json -// @Param space_id path string true "The ID of the space" -// @Param offset query int false "The number of items to skip before starting to collect the result set" -// @Param limit query int false "The number of items to return" default(100) -// @Success 200 {object} PaginatedResponse[Member] "List of members" -// @Failure 403 {object} UnauthorizedError "Unauthorized" -// @Failure 404 {object} NotFoundError "Resource not found" -// @Failure 502 {object} ServerError "Internal server error" -// @Router /spaces/{space_id}/members [get] -func (a *ApiServer) getMembersHandler(c *gin.Context) { - spaceId := c.Param("space_id") - offset := c.GetInt("offset") - limit := c.GetInt("limit") - - // Call ObjectSearch for all objects of type participant - resp := a.mw.ObjectSearch(c.Request.Context(), &pb.RpcObjectSearchRequest{ - SpaceId: spaceId, - Filters: []*model.BlockContentDataviewFilter{ - { - RelationKey: bundle.RelationKeyLayout.String(), - Condition: model.BlockContentDataviewFilter_Equal, - Value: pbtypes.Int64(int64(model.ObjectType_participant)), - }, - { - RelationKey: bundle.RelationKeyParticipantStatus.String(), - Condition: model.BlockContentDataviewFilter_Equal, - Value: pbtypes.Int64(int64(model.ParticipantStatus_Active)), - }, - }, - Sorts: []*model.BlockContentDataviewSort{ - { - RelationKey: "name", - Type: model.BlockContentDataviewSort_Asc, - }, - }, - Keys: []string{"id", "name", "iconEmoji", "iconImage", "identity", "globalName", "participantPermissions"}, - }) - - if resp.Error.Code != pb.RpcObjectSearchResponseError_NULL { - c.JSON(http.StatusInternalServerError, gin.H{"message": "Failed to retrieve list of members."}) - return - } - - if len(resp.Records) == 0 { - c.JSON(http.StatusNotFound, gin.H{"message": "No members found."}) - return - } - - paginatedMembers, hasMore := paginate(resp.Records, offset, limit) - members := make([]Member, 0, len(paginatedMembers)) - - for _, record := range paginatedMembers { - icon := a.getIconFromEmojiOrImage(record.Fields["iconEmoji"].GetStringValue(), record.Fields["iconImage"].GetStringValue()) - - member := Member{ - Type: "space_member", - Id: record.Fields["id"].GetStringValue(), - Name: record.Fields["name"].GetStringValue(), - Icon: icon, - Identity: record.Fields["identity"].GetStringValue(), - GlobalName: record.Fields["globalName"].GetStringValue(), - Role: model.ParticipantPermissions_name[int32(record.Fields["participantPermissions"].GetNumberValue())], - } - - members = append(members, member) - } - - respondWithPagination(c, http.StatusOK, members, len(resp.Records), offset, limit, hasMore) -} - // getObjectsHandler retrieves objects in a specific space // // @Summary Retrieve objects in a specific space @@ -342,11 +139,11 @@ func (a *ApiServer) getObjectsHandler(c *gin.Context) { return } - paginatedObjects, hasMore := paginate(resp.Records, offset, limit) + paginatedObjects, hasMore := pagination.Paginate(resp.Records, offset, limit) objects := make([]Object, 0, len(paginatedObjects)) for _, record := range paginatedObjects { - icon := a.getIconFromEmojiOrImage(record.Fields["iconEmoji"].GetStringValue(), record.Fields["iconImage"].GetStringValue()) + icon := utils.GetIconFromEmojiOrImage(a.accountInfo, record.Fields["iconEmoji"].GetStringValue(), record.Fields["iconImage"].GetStringValue()) objectTypeName, statusCode, errorMessage := a.resolveTypeToName(spaceId, record.Fields["type"].GetStringValue()) if statusCode != http.StatusOK { c.JSON(statusCode, gin.H{"message": errorMessage}) @@ -374,7 +171,7 @@ func (a *ApiServer) getObjectsHandler(c *gin.Context) { objects = append(objects, object) } - respondWithPagination(c, http.StatusOK, objects, len(resp.Records), offset, limit, hasMore) + pagination.RespondWithPagination(c, http.StatusOK, objects, len(resp.Records), offset, limit, hasMore) } // getObjectHandler retrieves a specific object in a space @@ -556,7 +353,7 @@ func (a *ApiServer) getObjectTypesHandler(c *gin.Context) { return } - paginatedTypes, hasMore := paginate(resp.Records, offset, limit) + paginatedTypes, hasMore := pagination.Paginate(resp.Records, offset, limit) objectTypes := make([]ObjectType, 0, len(paginatedTypes)) for _, record := range paginatedTypes { @@ -569,7 +366,7 @@ func (a *ApiServer) getObjectTypesHandler(c *gin.Context) { }) } - respondWithPagination(c, http.StatusOK, objectTypes, len(resp.Records), offset, limit, hasMore) + pagination.RespondWithPagination(c, http.StatusOK, objectTypes, len(resp.Records), offset, limit, hasMore) } // getObjectTypeTemplatesHandler retrieves a list of templates for a specific object type in a space @@ -649,7 +446,7 @@ func (a *ApiServer) getObjectTypeTemplatesHandler(c *gin.Context) { } // Finally, open each template and populate the response - paginatedTemplates, hasMore := paginate(templateIds, offset, limit) + paginatedTemplates, hasMore := pagination.Paginate(templateIds, offset, limit) templates := make([]ObjectTemplate, 0, len(paginatedTemplates)) for _, templateId := range paginatedTemplates { @@ -671,7 +468,7 @@ func (a *ApiServer) getObjectTypeTemplatesHandler(c *gin.Context) { }) } - respondWithPagination(c, http.StatusOK, templates, len(templateIds), offset, limit, hasMore) + pagination.RespondWithPagination(c, http.StatusOK, templates, len(templateIds), offset, limit, hasMore) } // searchHandler searches and retrieves objects across all the spaces @@ -796,7 +593,7 @@ func (a *ApiServer) searchHandler(c *gin.Context) { } for _, record := range objectResp.Records { - icon := a.getIconFromEmojiOrImage(record.Fields["iconEmoji"].GetStringValue(), record.Fields["iconImage"].GetStringValue()) + icon := utils.GetIconFromEmojiOrImage(a.accountInfo, record.Fields["iconEmoji"].GetStringValue(), record.Fields["iconImage"].GetStringValue()) objectTypeName, statusCode, errorMessage := a.resolveTypeToName(spaceId, record.Fields["type"].GetStringValue()) if statusCode != http.StatusOK { c.JSON(statusCode, gin.H{"message": errorMessage}) @@ -828,190 +625,7 @@ func (a *ApiServer) searchHandler(c *gin.Context) { }) // TODO: solve global pagination vs per space pagination - paginatedResults, hasMore := paginate(searchResults, offset, limit) + paginatedResults, hasMore := pagination.Paginate(searchResults, offset, limit) - respondWithPagination(c, http.StatusOK, paginatedResults, len(searchResults), offset, limit, hasMore) -} - -// getChatMessagesHandler retrieves last chat messages -// -// @Summary Retrieve last chat messages -// @Tags chat -// @Accept json -// @Produce json -// @Param space_id path string true "The ID of the space" -// @Param offset query int false "The number of items to skip before starting to collect the result set" -// @Param limit query int false "The number of items to return" default(100) -// @Success 200 {object} map[string][]ChatMessage "List of chat messages" -// @Failure 502 {object} ServerError "Internal server error" -// @Router /v1/spaces/{space_id}/chat/messages [get] -func (a *ApiServer) getChatMessagesHandler(c *gin.Context) { - spaceId := c.Param("space_id") - // TODO: implement offset - // offset := c.GetInt("offset") - limit := c.GetInt("limit") - - chatId, statusCode, errorMessage := a.getChatIdForSpace(spaceId) - if statusCode != http.StatusOK { - c.JSON(statusCode, gin.H{"message": errorMessage}) - return - } - - lastMessages := a.mw.ChatSubscribeLastMessages(c.Request.Context(), &pb.RpcChatSubscribeLastMessagesRequest{ - ChatObjectId: chatId, - Limit: int32(limit), - }) - - if lastMessages.Error.Code != pb.RpcChatSubscribeLastMessagesResponseError_NULL { - c.JSON(http.StatusInternalServerError, gin.H{"message": "Failed to retrieve last messages."}) - } - - messages := make([]ChatMessage, 0, len(lastMessages.Messages)) - for _, message := range lastMessages.Messages { - - attachments := make([]Attachment, 0, len(message.Attachments)) - for _, attachment := range message.Attachments { - target := attachment.Target - if attachment.Type != model.ChatMessageAttachment_LINK { - target = a.getGatewayURLForMedia(attachment.Target, false) - } - attachments = append(attachments, Attachment{ - Target: target, - Type: model.ChatMessageAttachmentAttachmentType_name[int32(attachment.Type)], - }) - } - - messages = append(messages, ChatMessage{ - Type: "chat_message", - Id: message.Id, - Creator: message.Creator, - CreatedAt: message.CreatedAt, - ReplyToMessageId: message.ReplyToMessageId, - Message: MessageContent{ - Text: message.Message.Text, - // TODO: params - // Style: nil, - // Marks: nil, - }, - Attachments: attachments, - Reactions: Reactions{ - ReactionsMap: func() map[string]IdentityList { - reactionsMap := make(map[string]IdentityList) - for emoji, ids := range message.Reactions.Reactions { - reactionsMap[emoji] = IdentityList{Ids: ids.Ids} - } - return reactionsMap - }(), - }, - }) - } - - c.JSON(http.StatusOK, gin.H{"chatId": chatId, "messages": messages}) -} - -// getChatMessageHandler retrieves a specific chat message by message_id -// -// @Summary Retrieve a specific chat message -// @Tags chat -// @Accept json -// @Produce json -// @Param space_id path string true "The ID of the space" -// @Param message_id path string true "Message ID" -// @Success 200 {object} ChatMessage "Chat message" -// @Failure 404 {object} NotFoundError "Message not found" -// @Failure 502 {object} ServerError "Internal server error" -// @Router /v1/spaces/{space_id}/chat/messages/{message_id} [get] -func (a *ApiServer) getChatMessageHandler(c *gin.Context) { - // TODO: Implement logic to retrieve a specific chat message by message_id - - c.JSON(http.StatusNotImplemented, gin.H{"message": "Not implemented yet"}) -} - -// addChatMessageHandler adds a new chat message to chat -// -// @Summary Add a new chat message -// @Tags chat -// @Accept json -// @Produce json -// @Param space_id path string true "The ID of the space" -// @Param message body ChatMessage true "Chat message" -// @Success 201 {object} ChatMessage "Created chat message" -// @Failure 400 {object} ValidationError "Invalid input" -// @Failure 502 {object} ServerError "Internal server error" -// @Router /v1/spaces/{space_id}/chat/messages [post] -func (a *ApiServer) addChatMessageHandler(c *gin.Context) { - spaceId := c.Param("space_id") - - request := AddMessageRequest{} - if err := c.BindJSON(&request); err != nil { - c.JSON(http.StatusBadRequest, gin.H{"message": "Invalid JSON"}) - return - } - - chatId, statusCode, errorMessage := a.getChatIdForSpace(spaceId) - if statusCode != http.StatusOK { - c.JSON(statusCode, gin.H{"message": errorMessage}) - return - } - - resp := a.mw.ChatAddMessage(c.Request.Context(), &pb.RpcChatAddMessageRequest{ - ChatObjectId: chatId, - Message: &model.ChatMessage{ - Id: "", - OrderId: "", - Creator: "", - CreatedAt: 0, - ModifiedAt: 0, - ReplyToMessageId: "", - Message: &model.ChatMessageMessageContent{ - Text: request.Text, - // TODO: param - // Style: request.Style, - }, - }, - }) - - if resp.Error.Code != pb.RpcChatAddMessageResponseError_NULL { - c.JSON(http.StatusInternalServerError, gin.H{"message": "Failed to create message."}) - } - - c.JSON(http.StatusOK, gin.H{"messageId": resp.MessageId}) -} - -// updateChatMessageHandler updates an existing chat message by message_id -// -// @Summary Update an existing chat message -// @Tags chat -// @Accept json -// @Produce json -// @Param space_id path string true "The ID of the space" -// @Param message_id path string true "Message ID" -// @Param message body ChatMessage true "Chat message" -// @Success 200 {object} ChatMessage "Updated chat message" -// @Failure 400 {object} ValidationError "Invalid input" -// @Failure 404 {object} NotFoundError "Message not found" -// @Failure 502 {object} ServerError "Internal server error" -// @Router /v1/spaces/{space_id}/chat/messages/{message_id} [put] -func (a *ApiServer) updateChatMessageHandler(c *gin.Context) { - // TODO: Implement logic to update an existing chat message by message_id - - c.JSON(http.StatusNotImplemented, gin.H{"message": "Not implemented yet"}) -} - -// deleteChatMessageHandler deletes a chat message by message_id -// -// @Summary Delete a chat message -// @Tags chat -// @Accept json -// @Produce json -// @Param space_id path string true "The ID of the space" -// @Param message_id path string true "Message ID" -// @Success 204 "Message deleted successfully" -// @Failure 404 {object} NotFoundError "Message not found" -// @Failure 502 {object} ServerError "Internal server error" -// @Router /v1/spaces/{space_id}/chat/messages/{message_id} [delete] -func (a *ApiServer) deleteChatMessageHandler(c *gin.Context) { - // TODO: Implement logic to delete a chat message by message_id - - c.JSON(http.StatusNotImplemented, gin.H{"message": "Not implemented yet"}) + pagination.RespondWithPagination(c, http.StatusOK, paginatedResults, len(searchResults), offset, limit, hasMore) } diff --git a/cmd/api/helper.go b/cmd/api/helper.go index 8bd9839ca..1c4db84d8 100644 --- a/cmd/api/helper.go +++ b/cmd/api/helper.go @@ -2,27 +2,16 @@ package api import ( "context" - "fmt" "net/http" "strings" - "github.com/gin-gonic/gin" - + "github.com/anyproto/anytype-heart/cmd/api/utils" "github.com/anyproto/anytype-heart/pb" "github.com/anyproto/anytype-heart/pkg/lib/bundle" "github.com/anyproto/anytype-heart/pkg/lib/pb/model" "github.com/anyproto/anytype-heart/util/pbtypes" ) -// getGatewayURLForMedia returns the URL of file gateway for the media object with the given ID -func (a *ApiServer) getGatewayURLForMedia(objectId string, isIcon bool) string { - widthParam := "" - if isIcon { - widthParam = "?width=100" - } - return fmt.Sprintf("%s/image/%s%s", a.accountInfo.GatewayUrl, objectId, widthParam) -} - // resolveTypeToName resolves the type ID to the name of the type, e.g. "ot-page" to "Page" or "bafyreigyb6l5szohs32ts26ku2j42yd65e6hqy2u3gtzgdwqv6hzftsetu" to "Custom Type" func (a *ApiServer) resolveTypeToName(spaceId string, typeId string) (typeName string, statusCode int, errorMessage string) { // Can't look up preinstalled types based on relation key, therefore need to use unique key @@ -54,71 +43,6 @@ func (a *ApiServer) resolveTypeToName(spaceId string, typeId string) (typeName s return resp.Records[0].Fields["name"].GetStringValue(), http.StatusOK, "" } -// getChatIdForSpace returns the chat ID for the space with the given ID -func (a *ApiServer) getChatIdForSpace(spaceId string) (chatId string, statusCode int, errorMessage string) { - workspace, statusCode, errorMessage := a.getWorkspaceInfo(spaceId) - if statusCode != http.StatusOK { - return "", statusCode, errorMessage - } - - resp := a.mw.ObjectShow(context.Background(), &pb.RpcObjectShowRequest{ - SpaceId: spaceId, - ObjectId: workspace.WorkspaceObjectId, - }) - - if resp.Error.Code != pb.RpcObjectShowResponseError_NULL { - return "", http.StatusInternalServerError, "Failed to open workspace object." - } - - if !resp.ObjectView.Details[0].Details.Fields["hasChat"].GetBoolValue() { - return "", http.StatusNotFound, "Chat not found." - } - - return resp.ObjectView.Details[0].Details.Fields["chatId"].GetStringValue(), http.StatusOK, "" -} - -// getWorkspaceInfo returns the workspace info for the space with the given ID -func (a *ApiServer) getWorkspaceInfo(spaceId string) (space Space, statusCode int, errorMessage string) { - workspaceResponse := a.mw.WorkspaceOpen(context.Background(), &pb.RpcWorkspaceOpenRequest{ - SpaceId: spaceId, - WithChat: true, - }) - - if workspaceResponse.Error.Code != pb.RpcWorkspaceOpenResponseError_NULL { - return Space{}, http.StatusInternalServerError, "Failed to open workspace." - } - - return Space{ - Type: "space", - Id: spaceId, - HomeObjectId: workspaceResponse.Info.HomeObjectId, - ArchiveObjectId: workspaceResponse.Info.ArchiveObjectId, - ProfileObjectId: workspaceResponse.Info.ProfileObjectId, - MarketplaceWorkspaceId: workspaceResponse.Info.MarketplaceWorkspaceId, - WorkspaceObjectId: workspaceResponse.Info.WorkspaceObjectId, - DeviceId: workspaceResponse.Info.DeviceId, - AccountSpaceId: workspaceResponse.Info.AccountSpaceId, - WidgetsId: workspaceResponse.Info.WidgetsId, - SpaceViewId: workspaceResponse.Info.SpaceViewId, - TechSpaceId: workspaceResponse.Info.TechSpaceId, - Timezone: workspaceResponse.Info.TimeZone, - NetworkId: workspaceResponse.Info.NetworkId, - }, http.StatusOK, "" -} - -// getIconFromEmojiOrImage returns the icon to use for the object, which can be either an emoji or an image url -func (a *ApiServer) getIconFromEmojiOrImage(iconEmoji string, iconImage string) string { - if iconEmoji != "" { - return iconEmoji - } - - if iconImage != "" { - return a.getGatewayURLForMedia(iconImage, true) - } - - return "" -} - // getBlocks returns the blocks of the object func (a *ApiServer) getBlocks(resp *pb.RpcObjectShowResponse) []Block { blocks := []Block{} @@ -134,7 +58,7 @@ func (a *ApiServer) getBlocks(resp *pb.RpcObjectShowResponse) []Block { Style: model.BlockContentTextStyle_name[int32(content.Text.Style)], Checked: content.Text.Checked, Color: content.Text.Color, - Icon: a.getIconFromEmojiOrImage(content.Text.IconEmoji, content.Text.IconImage), + Icon: utils.GetIconFromEmojiOrImage(a.accountInfo, content.Text.IconEmoji, content.Text.IconImage), } case *model.BlockContentOfFile: file = &File{ @@ -241,34 +165,3 @@ func (a *ApiServer) getTags(resp *pb.RpcObjectShowResponse) []Tag { } return tags } - -// respondWithPagination returns a json response with the paginated data and corresponding metadata -func respondWithPagination[T any](c *gin.Context, statusCode int, data []T, total, offset, limit int, hasMore bool) { - c.JSON(statusCode, PaginatedResponse[T]{ - Data: data, - Pagination: PaginationMeta{ - Total: total, - Offset: offset, - Limit: limit, - HasMore: hasMore, - }, - }) -} - -// paginate paginates the given records based on the offset and limit -func paginate[T any](records []T, offset, limit int) ([]T, bool) { - total := len(records) - start := offset - end := offset + limit - - if start > total { - start = total - } - if end > total { - end = total - } - - paginated := records[start:end] - hasMore := end < total - return paginated, hasMore -} diff --git a/cmd/api/main.go b/cmd/api/main.go index e0e26baa9..b443cc27c 100644 --- a/cmd/api/main.go +++ b/cmd/api/main.go @@ -13,6 +13,7 @@ import ( "github.com/webstradev/gin-pagination/v2/pkg/pagination" _ "github.com/anyproto/anytype-heart/cmd/api/docs" + "github.com/anyproto/anytype-heart/cmd/api/space" "github.com/anyproto/anytype-heart/core" "github.com/anyproto/anytype-heart/pb/service" "github.com/anyproto/anytype-heart/pkg/lib/pb/model" @@ -29,8 +30,8 @@ type ApiServer struct { router *gin.Engine server *http.Server - // init after app start - accountInfo *model.AccountInfo + accountInfo *model.AccountInfo + spaceService *space.SpaceService } // TODO: User represents an authenticated user with permissions @@ -41,9 +42,10 @@ type User struct { func newApiServer(mw service.ClientCommandsServer, mwInternal core.MiddlewareInternal) *ApiServer { a := &ApiServer{ - mw: mw, - mwInternal: mwInternal, - router: gin.Default(), + mw: mw, + mwInternal: mwInternal, + router: gin.Default(), + spaceService: space.NewService(mw), } a.server = &http.Server{ @@ -100,8 +102,8 @@ func RunApiServer(ctx context.Context, mw service.ClientCommandsServer, mwIntern // readOnly.Use(a.AuthMiddleware()) // readOnly.Use(a.PermissionMiddleware("read-only")) { - readOnly.GET("/spaces", paginator, a.getSpacesHandler) - readOnly.GET("/spaces/:space_id/members", paginator, a.getMembersHandler) + readOnly.GET("/spaces", paginator, space.GetSpacesHandler(a.spaceService)) + readOnly.GET("/spaces/:space_id/members", paginator, space.GetMembersHandler(a.spaceService)) readOnly.GET("/spaces/:space_id/objects", paginator, a.getObjectsHandler) readOnly.GET("/spaces/:space_id/objects/:object_id", a.getObjectHandler) readOnly.GET("/spaces/:space_id/objectTypes", paginator, a.getObjectTypesHandler) @@ -114,23 +116,11 @@ func RunApiServer(ctx context.Context, mw service.ClientCommandsServer, mwIntern // readWrite.Use(a.AuthMiddleware()) // readWrite.Use(a.PermissionMiddleware("read-write")) { - readWrite.POST("/spaces", a.createSpaceHandler) + // readWrite.POST("/spaces", a.createSpaceHandler) readWrite.POST("/spaces/:space_id/objects", a.createObjectHandler) readWrite.PUT("/spaces/:space_id/objects/:object_id", a.updateObjectHandler) } - // Chat routes - chat := a.router.Group("/v1/spaces/:space_id/chat") - // chat.Use(a.AuthMiddleware()) - // chat.Use(a.PermissionMiddleware("read-write")) - { - chat.GET("/messages", paginator, a.getChatMessagesHandler) - chat.GET("/messages/:message_id", a.getChatMessageHandler) - chat.POST("/messages", a.addChatMessageHandler) - chat.PUT("/messages/:message_id", a.updateChatMessageHandler) - chat.DELETE("/messages/:message_id", a.deleteChatMessageHandler) - } - // Start the HTTP server go func() { if err := a.server.ListenAndServe(); err != nil && err != http.ErrServerClosed { diff --git a/cmd/api/middleware.go b/cmd/api/middleware.go index b4fa0aa7f..882d659a4 100644 --- a/cmd/api/middleware.go +++ b/cmd/api/middleware.go @@ -27,6 +27,7 @@ func (a *ApiServer) initAccountInfo() gin.HandlerFunc { } a.accountInfo = accInfo + a.spaceService.AccountInfo = accInfo c.Next() } } diff --git a/cmd/api/pagination/model.go b/cmd/api/pagination/model.go new file mode 100644 index 000000000..06539ce63 --- /dev/null +++ b/cmd/api/pagination/model.go @@ -0,0 +1,13 @@ +package pagination + +type PaginationMeta struct { + Total int `json:"total" example:"1024"` // the total number of items available on that endpoint + Offset int `json:"offset" example:"0"` // the current offset + Limit int `json:"limit" example:"100"` // the current limit + HasMore bool `json:"has_more" example:"true"` // whether there are more items available +} + +type PaginatedResponse[T any] struct { + Data []T `json:"data"` + Pagination PaginationMeta `json:"pagination"` +} diff --git a/cmd/api/pagination/pagination.go b/cmd/api/pagination/pagination.go new file mode 100644 index 000000000..e648f470e --- /dev/null +++ b/cmd/api/pagination/pagination.go @@ -0,0 +1,39 @@ +package pagination + +import "github.com/gin-gonic/gin" + +type Service[T any] interface { + RespondWithPagination(c *gin.Context, statusCode int, data []T, total, offset, limit int, hasMore bool) + Paginate(records []T, offset, limit int) ([]T, bool) +} + +// RespondWithPagination returns a json response with the paginated data and corresponding metadata +func RespondWithPagination[T any](c *gin.Context, statusCode int, data []T, total, offset, limit int, hasMore bool) { + c.JSON(statusCode, PaginatedResponse[T]{ + Data: data, + Pagination: PaginationMeta{ + Total: total, + Offset: offset, + Limit: limit, + HasMore: hasMore, + }, + }) +} + +// Paginate paginates the given records based on the offset and limit +func Paginate[T any](records []T, offset, limit int) ([]T, bool) { + total := len(records) + start := offset + end := offset + limit + + if start > total { + start = total + } + if end > total { + end = total + } + + paginated := records[start:end] + hasMore := end < total + return paginated, hasMore +} diff --git a/cmd/api/schemas.go b/cmd/api/schemas.go index 33461598c..5ec8247f4 100644 --- a/cmd/api/schemas.go +++ b/cmd/api/schemas.go @@ -1,17 +1,5 @@ package api -type PaginationMeta struct { - Total int `json:"total" example:"1024"` // the total number of items available on that endpoint - Offset int `json:"offset" example:"0"` // the current offset - Limit int `json:"limit" example:"100"` // the current limit - HasMore bool `json:"has_more" example:"true"` // whether there are more items available -} - -type PaginatedResponse[T any] struct { - Data []T `json:"data"` - Pagination PaginationMeta `json:"pagination"` -} - type AuthDisplayCodeResponse struct { ChallengeId string `json:"challenge_id" example:"67647f5ecda913e9a2e11b26"` } @@ -21,40 +9,6 @@ type AuthTokenResponse struct { AppKey string `json:"app_key" example:""` } -type CreateSpaceResponse struct { - SpaceId string `json:"space_id" example:"bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1"` - Name string `json:"name" example:"Space Name"` -} - -type Space struct { - Type string `json:"type" example:"space"` - Id string `json:"id" example:"bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1"` - Name string `json:"name" example:"Space Name"` - Icon string `json:"icon" example:"http://127.0.0.1:31006/image/bafybeieptz5hvcy6txplcvphjbbh5yjc2zqhmihs3owkh5oab4ezauzqay?width=100"` - HomeObjectId string `json:"home_object_id" example:"bafyreie4qcl3wczb4cw5hrfyycikhjyh6oljdis3ewqrk5boaav3sbwqya"` - ArchiveObjectId string `json:"archive_object_id" example:"bafyreialsgoyflf3etjm3parzurivyaukzivwortf32b4twnlwpwocsrri"` - ProfileObjectId string `json:"profile_object_id" example:"bafyreiaxhwreshjqwndpwtdsu4mtihaqhhmlygqnyqpfyfwlqfq3rm3gw4"` - MarketplaceWorkspaceId string `json:"marketplace_workspace_id" example:"_anytype_marketplace"` - WorkspaceObjectId string `json:"workspace_object_id" example:"bafyreiapey2g6e6za4zfxvlgwdy4hbbfu676gmwrhnqvjbxvrchr7elr3y"` - DeviceId string `json:"device_id" example:"12D3KooWGZMJ4kQVyQVXaj7gJPZr3RZ2nvd9M2Eq2pprEoPih9WF"` - AccountSpaceId string `json:"account_space_id" example:"bafyreihpd2knon5wbljhtfeg3fcqtg3i2pomhhnigui6lrjmzcjzep7gcy.23me69r569oi1"` - WidgetsId string `json:"widgets_id" example:"bafyreialj7pceh53mifm5dixlho47ke4qjmsn2uh4wsjf7xq2pnlo5xfva"` - SpaceViewId string `json:"space_view_id" example:"bafyreigzv3vq7qwlrsin6njoduq727ssnhwd6bgyfj6nm4hv3pxoc2rxhy"` - TechSpaceId string `json:"tech_space_id" example:"bafyreif4xuwncrjl6jajt4zrrfnylpki476nv2w64yf42ovt7gia7oypii.23me69r569oi1"` - Timezone string `json:"timezone" example:""` - NetworkId string `json:"network_id" example:"N83gJpVd9MuNRZAuJLZ7LiMntTThhPc6DtzWWVjb1M3PouVU"` -} - -type Member struct { - Type string `json:"type" example:"member"` - Id string `json:"id" example:"_participant_bafyreigyfkt6rbv24sbv5aq2hko1bhmv5xxlf22b4bypdu6j7hnphm3psq_23me69r569oi1_AAjEaEwPF4nkEh9AWkqEnzcQ8HziBB4ETjiTpvRCQvWnSMDZ"` - Name string `json:"name" example:"John Doe"` - Icon string `json:"icon" example:"http://127.0.0.1:31006/image/bafybeieptz5hvcy6txplcvphjbbh5yjc2zqhmihs3owkh5oab4ezauzqay?width=100"` - Identity string `json:"identity" example:"AAjEaEwPF4nkEh7AWkqEnzcQ8HziGB4ETjiTpvRCQvWnSMDZ"` - GlobalName string `json:"global_name" example:"john.any"` - Role string `json:"role" enum:"Reader,Writer,Owner,NoPermission" example:"Owner"` -} - type Object struct { Type string `json:"type" example:"object"` Id string `json:"id" example:"bafyreie6n5l5nkbjal37su54cha4coy7qzuhrnajluzv5qd5jvtsrxkequ"` @@ -123,38 +77,6 @@ type ObjectTemplate struct { Icon string `json:"icon" example:"📄"` } -type ChatMessage struct { - Type string `json:"chat_message"` - Id string `json:"id"` // Unique message identifier - OrderId string `json:"order_id"` // Used for subscriptions - Creator string `json:"creator"` // Identifier for the message creator - CreatedAt int64 `json:"created_at"` - ModifiedAt int64 `json:"modified_at"` - ReplyToMessageId string `json:"reply_to_message_id"` // Identifier for the message being replied to - Message MessageContent `json:"message"` // Message content - Attachments []Attachment `json:"attachments"` // Attachments slice - Reactions Reactions `json:"reactions"` // Reactions to the message -} - -type MessageContent struct { - Text string `json:"text"` // The text content of the message part - Style string `json:"style"` // The style/type of the message part - Marks []string `json:"marks"` // List of marks applied to the text -} - -type Attachment struct { - Target string `json:"target"` // Identifier for the attachment object - Type string `json:"type"` // Type of attachment -} - -type Reactions struct { - ReactionsMap map[string]IdentityList `json:"reactions"` // Map of emoji to list of user IDs -} - -type IdentityList struct { - Ids []string `json:"ids"` // List of user IDs -} - type ServerError struct { Error struct { Message string `json:"message"` diff --git a/cmd/api/space/handler.go b/cmd/api/space/handler.go new file mode 100644 index 000000000..dd9ebb0bb --- /dev/null +++ b/cmd/api/space/handler.go @@ -0,0 +1,124 @@ +package space + +import ( + "errors" + "net/http" + + "github.com/gin-gonic/gin" + + "github.com/anyproto/anytype-heart/cmd/api/pagination" +) + +// GetSpacesHandler retrieves a list of spaces +// +// @Summary Retrieve a list of spaces +// @Tags spaces +// @Accept json +// @Produce json +// @Param offset query int false "The number of items to skip before starting to collect the result set" +// @Param limit query int false "The number of items to return" default(100) +// @Success 200 {object} pagination.PaginatedResponse[Space] "List of spaces" +// @Failure 403 {object} api.UnauthorizedError "Unauthorized" +// @Failure 404 {object} api.NotFoundError "Resource not found" +// @Failure 502 {object} api.ServerError "Internal server error" +// @Router /spaces [get] +func GetSpacesHandler(s *SpaceService) gin.HandlerFunc { + return func(c *gin.Context) { + offset := c.GetInt("offset") + limit := c.GetInt("limit") + + spaces, total, hasMore, err := s.ListSpaces(c.Request.Context(), offset, limit) + if err != nil { + switch { + case errors.Is(err, ErrNoSpacesFound): + c.JSON(http.StatusNotFound, gin.H{"message": "No spaces found."}) + return + case errors.Is(err, ErrFailedListSpaces): + c.JSON(http.StatusInternalServerError, gin.H{"message": "Failed to retrieve list of spaces."}) + return + case errors.Is(err, ErrFailedOpenWorkspace): + c.JSON(http.StatusInternalServerError, gin.H{"message": "Failed to open workspace."}) + default: + c.JSON(http.StatusInternalServerError, gin.H{"message": err.Error()}) + return + } + } + + pagination.RespondWithPagination(c, http.StatusOK, spaces, total, offset, limit, hasMore) + } +} + +// CreateSpaceHandler creates a new space +// +// @Summary Create a new Space +// @Tags spaces +// @Accept json +// @Produce json +// @Param name body string true "Space Name" +// @Success 200 {object} CreateSpaceResponse "Space created successfully" +// @Failure 403 {object} api.UnauthorizedError "Unauthorized" +// @Failure 502 {object} api.ServerError "Internal server error" +// @Router /spaces [post] +func CreateSpaceHandler(s *SpaceService) gin.HandlerFunc { + return func(c *gin.Context) { + nameRequest := CreateSpaceRequest{} + if err := c.BindJSON(&nameRequest); err != nil { + c.JSON(http.StatusBadRequest, gin.H{"message": "Invalid JSON"}) + return + } + name := nameRequest.Name + + space, err := s.CreateSpace(c.Request.Context(), name) + if err != nil { + switch { + case errors.Is(err, ErrFailedCreateSpace): + c.JSON(http.StatusInternalServerError, gin.H{"message": "Failed to create space."}) + return + default: + c.JSON(http.StatusInternalServerError, gin.H{"message": err.Error()}) + return + } + } + + c.JSON(http.StatusOK, CreateSpaceResponse{Space: space}) + } +} + +// GetMembersHandler retrieves a list of members for the specified space +// +// @Summary Retrieve a list of members for the specified Space +// @Tags spaces +// @Accept json +// @Produce json +// @Param space_id path string true "The ID of the space" +// @Param offset query int false "The number of items to skip before starting to collect the result set" +// @Param limit query int false "The number of items to return" default(100) +// @Success 200 {object} pagination.PaginatedResponse[Member] "List of members" +// @Failure 403 {object} api.UnauthorizedError "Unauthorized" +// @Failure 404 {object} api.NotFoundError "Resource not found" +// @Failure 502 {object} api.ServerError "Internal server error" +// @Router /spaces/{space_id}/members [get] +func GetMembersHandler(s *SpaceService) gin.HandlerFunc { + return func(c *gin.Context) { + spaceId := c.Param("space_id") + offset := c.GetInt("offset") + limit := c.GetInt("limit") + + members, total, hasMore, err := s.ListMembers(c.Request.Context(), spaceId, offset, limit) + if err != nil { + switch { + case errors.Is(err, ErrNoMembersFound): + c.JSON(http.StatusNotFound, gin.H{"message": "No members found."}) + return + case errors.Is(err, ErrFailedListMembers): + c.JSON(http.StatusInternalServerError, gin.H{"message": "Failed to retrieve list of members."}) + return + default: + c.JSON(http.StatusInternalServerError, gin.H{"message": err.Error()}) + return + } + } + + pagination.RespondWithPagination(c, http.StatusOK, members, total, offset, limit, hasMore) + } +} diff --git a/cmd/api/space/model.go b/cmd/api/space/model.go new file mode 100644 index 000000000..78ef51e45 --- /dev/null +++ b/cmd/api/space/model.go @@ -0,0 +1,41 @@ +package space + +type CreateSpaceRequest struct { + Name string `json:"name"` +} + +type CreateSpaceResponse struct { + Space Space `json:"space"` +} + +type Space struct { + Type string `json:"type" example:"space"` + Id string `json:"id" example:"bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1"` + Name string `json:"name" example:"Space Name"` + Icon string `json:"icon" example:"http://127.0.0.1:31006/image/bafybeieptz5hvcy6txplcvphjbbh5yjc2zqhmihs3owkh5oab4ezauzqay?width=100"` + HomeObjectId string `json:"home_object_id" example:"bafyreie4qcl3wczb4cw5hrfyycikhjyh6oljdis3ewqrk5boaav3sbwqya"` + ArchiveObjectId string `json:"archive_object_id" example:"bafyreialsgoyflf3etjm3parzurivyaukzivwortf32b4twnlwpwocsrri"` + ProfileObjectId string `json:"profile_object_id" example:"bafyreiaxhwreshjqwndpwtdsu4mtihaqhhmlygqnyqpfyfwlqfq3rm3gw4"` + MarketplaceWorkspaceId string `json:"marketplace_workspace_id" example:"_anytype_marketplace"` + WorkspaceObjectId string `json:"workspace_object_id" example:"bafyreiapey2g6e6za4zfxvlgwdy4hbbfu676gmwrhnqvjbxvrchr7elr3y"` + DeviceId string `json:"device_id" example:"12D3KooWGZMJ4kQVyQVXaj7gJPZr3RZ2nvd9M2Eq2pprEoPih9WF"` + AccountSpaceId string `json:"account_space_id" example:"bafyreihpd2knon5wbljhtfeg3fcqtg3i2pomhhnigui6lrjmzcjzep7gcy.23me69r569oi1"` + WidgetsId string `json:"widgets_id" example:"bafyreialj7pceh53mifm5dixlho47ke4qjmsn2uh4wsjf7xq2pnlo5xfva"` + SpaceViewId string `json:"space_view_id" example:"bafyreigzv3vq7qwlrsin6njoduq727ssnhwd6bgyfj6nm4hv3pxoc2rxhy"` + TechSpaceId string `json:"tech_space_id" example:"bafyreif4xuwncrjl6jajt4zrrfnylpki476nv2w64yf42ovt7gia7oypii.23me69r569oi1"` + GatewayUrl string `json:"gateway_url" example:"http://127.0.0.1:31006"` + LocalStoragePath string `json:"local_storage_path" example:"/Users/johndoe/Library/Application Support/Anytype/data/AAHTtt1wuQEnaYBNZ2Cyfcvs6DqPqxgn8VXDVk4avsUkMuha"` + Timezone string `json:"timezone" example:""` + AnalyticsId string `json:"analytics_id" example:"624aecdd-4797-4611-9d61-a2ae5f53cf1c"` + NetworkId string `json:"network_id" example:"N83gJpVd9MuNRZAuJLZ7LiMntTThhPc6DtzWWVjb1M3PouVU"` +} + +type Member struct { + Type string `json:"type" example:"member"` + Id string `json:"id" example:"_participant_bafyreigyfkt6rbv24sbv5aq2hko1bhmv5xxlf22b4bypdu6j7hnphm3psq_23me69r569oi1_AAjEaEwPF4nkEh9AWkqEnzcQ8HziBB4ETjiTpvRCQvWnSMDZ"` + Name string `json:"name" example:"John Doe"` + Icon string `json:"icon" example:"http://127.0.0.1:31006/image/bafybeieptz5hvcy6txplcvphjbbh5yjc2zqhmihs3owkh5oab4ezauzqay?width=100"` + Identity string `json:"identity" example:"AAjEaEwPF4nkEh7AWkqEnzcQ8HziGB4ETjiTpvRCQvWnSMDZ"` + GlobalName string `json:"global_name" example:"john.any"` + Role string `json:"role" enum:"Reader,Writer,Owner,NoPermission" example:"Owner"` +} diff --git a/cmd/api/space/service.go b/cmd/api/space/service.go new file mode 100644 index 000000000..9ba824149 --- /dev/null +++ b/cmd/api/space/service.go @@ -0,0 +1,214 @@ +package space + +import ( + "context" + "crypto/rand" + "errors" + "math/big" + + "github.com/gogo/protobuf/types" + + "github.com/anyproto/anytype-heart/cmd/api/pagination" + "github.com/anyproto/anytype-heart/cmd/api/utils" + "github.com/anyproto/anytype-heart/pb" + "github.com/anyproto/anytype-heart/pb/service" + "github.com/anyproto/anytype-heart/pkg/lib/bundle" + "github.com/anyproto/anytype-heart/pkg/lib/pb/model" + "github.com/anyproto/anytype-heart/util/pbtypes" +) + +var ( + ErrNoSpacesFound = errors.New("no spaces found") + ErrFailedListSpaces = errors.New("failed to retrieve list of spaces") + ErrFailedOpenWorkspace = errors.New("failed to open workspace") + ErrFailedGenerateRandomIcon = errors.New("failed to generate random icon") + ErrFailedCreateSpace = errors.New("failed to create space") + ErrNoMembersFound = errors.New("no members found") + ErrFailedListMembers = errors.New("failed to retrieve list of members") +) + +type Service interface { + ListSpaces(ctx context.Context) ([]Space, error) + CreateSpace(ctx context.Context, name string) (Space, error) +} + +type SpaceService struct { + mw service.ClientCommandsServer + AccountInfo *model.AccountInfo +} + +func NewService(mw service.ClientCommandsServer) *SpaceService { + return &SpaceService{mw: mw} +} + +func (s *SpaceService) ListSpaces(ctx context.Context, offset int, limit int) (spaces []Space, total int, hasMore bool, err error) { + resp := s.mw.ObjectSearch(ctx, &pb.RpcObjectSearchRequest{ + SpaceId: s.AccountInfo.TechSpaceId, + Filters: []*model.BlockContentDataviewFilter{ + { + RelationKey: bundle.RelationKeyLayout.String(), + Condition: model.BlockContentDataviewFilter_Equal, + Value: pbtypes.Int64(int64(model.ObjectType_spaceView)), + }, + { + RelationKey: bundle.RelationKeySpaceLocalStatus.String(), + Condition: model.BlockContentDataviewFilter_Equal, + Value: pbtypes.Int64(int64(model.SpaceStatus_Ok)), + }, + { + RelationKey: bundle.RelationKeySpaceRemoteStatus.String(), + Condition: model.BlockContentDataviewFilter_Equal, + Value: pbtypes.Int64(int64(model.SpaceStatus_Ok)), + }, + }, + Sorts: []*model.BlockContentDataviewSort{ + { + RelationKey: "spaceOrder", + Type: model.BlockContentDataviewSort_Asc, + NoCollate: true, + EmptyPlacement: model.BlockContentDataviewSort_End, + }, + }, + Keys: []string{"targetSpaceId", "name", "iconEmoji", "iconImage"}, + }) + + if resp.Error.Code != pb.RpcObjectSearchResponseError_NULL { + return nil, 0, false, ErrFailedListSpaces + } + + if len(resp.Records) == 0 { + return nil, 0, false, ErrNoSpacesFound + } + + total = len(resp.Records) + paginatedRecords, hasMore := pagination.Paginate(resp.Records, offset, limit) + spaces = make([]Space, 0, len(paginatedRecords)) + + for _, record := range paginatedRecords { + workspace, err := s.getWorkspaceInfo(record.Fields["targetSpaceId"].GetStringValue()) + if err != nil { + return nil, 0, false, err + } + + // TODO: name and icon are only returned here; fix that + workspace.Name = record.Fields["name"].GetStringValue() + workspace.Icon = utils.GetIconFromEmojiOrImage(s.AccountInfo, record.Fields["iconEmoji"].GetStringValue(), record.Fields["iconImage"].GetStringValue()) + + spaces = append(spaces, workspace) + } + + return spaces, total, hasMore, nil +} + +func (s *SpaceService) CreateSpace(ctx context.Context, name string) (Space, error) { + iconOption, err := rand.Int(rand.Reader, big.NewInt(13)) + if err != nil { + return Space{}, ErrFailedGenerateRandomIcon + } + + // Create new workspace with a random icon and import default use case + resp := s.mw.WorkspaceCreate(ctx, &pb.RpcWorkspaceCreateRequest{ + Details: &types.Struct{ + Fields: map[string]*types.Value{ + "iconOption": pbtypes.Float64(float64(iconOption.Int64())), + "name": pbtypes.String(name), + "spaceDashboardId": pbtypes.String("lastOpened"), + }, + }, + UseCase: pb.RpcObjectImportUseCaseRequest_GET_STARTED, + WithChat: true, + }) + + if resp.Error.Code != pb.RpcWorkspaceCreateResponseError_NULL { + return Space{}, ErrFailedCreateSpace + } + + return s.getWorkspaceInfo(resp.SpaceId) +} + +func (s *SpaceService) ListMembers(ctx context.Context, spaceId string, offset int, limit int) (members []Member, total int, hasMore bool, err error) { + resp := s.mw.ObjectSearch(ctx, &pb.RpcObjectSearchRequest{ + SpaceId: spaceId, + Filters: []*model.BlockContentDataviewFilter{ + { + RelationKey: bundle.RelationKeyLayout.String(), + Condition: model.BlockContentDataviewFilter_Equal, + Value: pbtypes.Int64(int64(model.ObjectType_participant)), + }, + { + RelationKey: bundle.RelationKeyParticipantStatus.String(), + Condition: model.BlockContentDataviewFilter_Equal, + Value: pbtypes.Int64(int64(model.ParticipantStatus_Active)), + }, + }, + Sorts: []*model.BlockContentDataviewSort{ + { + RelationKey: "name", + Type: model.BlockContentDataviewSort_Asc, + }, + }, + Keys: []string{"id", "name", "iconEmoji", "iconImage", "identity", "globalName", "participantPermissions"}, + }) + + if resp.Error.Code != pb.RpcObjectSearchResponseError_NULL { + return nil, 0, false, ErrFailedListMembers + } + + if len(resp.Records) == 0 { + return nil, 0, false, ErrNoMembersFound + } + + total = len(resp.Records) + paginatedMembers, hasMore := pagination.Paginate(resp.Records, offset, limit) + members = make([]Member, 0, len(paginatedMembers)) + + for _, record := range paginatedMembers { + icon := utils.GetIconFromEmojiOrImage(s.AccountInfo, record.Fields["iconEmoji"].GetStringValue(), record.Fields["iconImage"].GetStringValue()) + + member := Member{ + Type: "space_member", + Id: record.Fields["id"].GetStringValue(), + Name: record.Fields["name"].GetStringValue(), + Icon: icon, + Identity: record.Fields["identity"].GetStringValue(), + GlobalName: record.Fields["globalName"].GetStringValue(), + Role: model.ParticipantPermissions_name[int32(record.Fields["participantPermissions"].GetNumberValue())], + } + + members = append(members, member) + } + + return members, total, hasMore, nil +} + +// getWorkspaceInfo returns the workspace info for the space with the given ID +func (s *SpaceService) getWorkspaceInfo(spaceId string) (space Space, err error) { + workspaceResponse := s.mw.WorkspaceOpen(context.Background(), &pb.RpcWorkspaceOpenRequest{ + SpaceId: spaceId, + WithChat: true, + }) + + if workspaceResponse.Error.Code != pb.RpcWorkspaceOpenResponseError_NULL { + return Space{}, ErrFailedOpenWorkspace + } + + return Space{ + Type: "space", + Id: spaceId, + HomeObjectId: workspaceResponse.Info.HomeObjectId, + ArchiveObjectId: workspaceResponse.Info.ArchiveObjectId, + ProfileObjectId: workspaceResponse.Info.ProfileObjectId, + MarketplaceWorkspaceId: workspaceResponse.Info.MarketplaceWorkspaceId, + WorkspaceObjectId: workspaceResponse.Info.WorkspaceObjectId, + DeviceId: workspaceResponse.Info.DeviceId, + AccountSpaceId: workspaceResponse.Info.AccountSpaceId, + WidgetsId: workspaceResponse.Info.WidgetsId, + SpaceViewId: workspaceResponse.Info.SpaceViewId, + TechSpaceId: workspaceResponse.Info.TechSpaceId, + GatewayUrl: workspaceResponse.Info.GatewayUrl, + LocalStoragePath: workspaceResponse.Info.LocalStoragePath, + Timezone: workspaceResponse.Info.TimeZone, + AnalyticsId: workspaceResponse.Info.AnalyticsId, + NetworkId: workspaceResponse.Info.NetworkId, + }, nil +} diff --git a/cmd/api/space/service_test.go b/cmd/api/space/service_test.go new file mode 100644 index 000000000..0ab45fdad --- /dev/null +++ b/cmd/api/space/service_test.go @@ -0,0 +1,312 @@ +package space + +import ( + "regexp" + "testing" + + "github.com/stretchr/testify/mock" + "github.com/stretchr/testify/require" + + "github.com/gogo/protobuf/types" + + "github.com/anyproto/anytype-heart/pb" + "github.com/anyproto/anytype-heart/pb/service/mock_service" + "github.com/anyproto/anytype-heart/pkg/lib/bundle" + "github.com/anyproto/anytype-heart/pkg/lib/pb/model" + "github.com/anyproto/anytype-heart/util/pbtypes" +) + +const ( + offset = 0 + limit = 100 + techSpaceId = "tech-space-id" + gatewayUrl = "http://localhost:31006" + iconImage = "bafyreialsgoyflf3etjm3parzurivyaukzivwortf32b4twnlwpwocsrri" +) + +type fixture struct { + *SpaceService + mwMock *mock_service.MockClientCommandsServer +} + +func newFixture(t *testing.T) *fixture { + mw := mock_service.NewMockClientCommandsServer(t) + spaceService := &SpaceService{mw: mw, AccountInfo: &model.AccountInfo{TechSpaceId: techSpaceId, GatewayUrl: gatewayUrl}} + + return &fixture{ + SpaceService: spaceService, + mwMock: mw, + } +} + +func TestSpaceService_ListSpaces(t *testing.T) { + t.Run("successful retrieval of spaces", func(t *testing.T) { + // given + fx := newFixture(t) + + fx.mwMock.On("ObjectSearch", mock.Anything, &pb.RpcObjectSearchRequest{ + SpaceId: techSpaceId, + Filters: []*model.BlockContentDataviewFilter{ + { + RelationKey: bundle.RelationKeyLayout.String(), + Condition: model.BlockContentDataviewFilter_Equal, + Value: pbtypes.Int64(int64(model.ObjectType_spaceView)), + }, + { + RelationKey: bundle.RelationKeySpaceLocalStatus.String(), + Condition: model.BlockContentDataviewFilter_Equal, + Value: pbtypes.Int64(int64(model.SpaceStatus_Ok)), + }, + { + RelationKey: bundle.RelationKeySpaceRemoteStatus.String(), + Condition: model.BlockContentDataviewFilter_Equal, + Value: pbtypes.Int64(int64(model.SpaceStatus_Ok)), + }, + }, + Sorts: []*model.BlockContentDataviewSort{ + { + RelationKey: "spaceOrder", + Type: model.BlockContentDataviewSort_Asc, + NoCollate: true, + EmptyPlacement: model.BlockContentDataviewSort_End, + }, + }, + Keys: []string{"targetSpaceId", "name", "iconEmoji", "iconImage"}, + }).Return(&pb.RpcObjectSearchResponse{ + Records: []*types.Struct{ + { + Fields: map[string]*types.Value{ + "name": pbtypes.String("Another Workspace"), + "targetSpaceId": pbtypes.String("another-space-id"), + "iconEmoji": pbtypes.String(""), + "iconImage": pbtypes.String(iconImage), + }, + }, + { + Fields: map[string]*types.Value{ + "name": pbtypes.String("My Workspace"), + "targetSpaceId": pbtypes.String("my-space-id"), + "iconEmoji": pbtypes.String("🚀"), + "iconImage": pbtypes.String(""), + }, + }, + }, + Error: &pb.RpcObjectSearchResponseError{Code: pb.RpcObjectSearchResponseError_NULL}, + }).Once() + + fx.mwMock.On("WorkspaceOpen", mock.Anything, mock.Anything).Return(&pb.RpcWorkspaceOpenResponse{ + Error: &pb.RpcWorkspaceOpenResponseError{Code: pb.RpcWorkspaceOpenResponseError_NULL}, + Info: &model.AccountInfo{ + HomeObjectId: "home-object-id", + ArchiveObjectId: "archive-object-id", + ProfileObjectId: "profile-object-id", + MarketplaceWorkspaceId: "marketplace-workspace-id", + WorkspaceObjectId: "workspace-object-id", + DeviceId: "device-id", + AccountSpaceId: "account-space-id", + WidgetsId: "widgets-id", + SpaceViewId: "space-view-id", + TechSpaceId: "tech-space-id", + GatewayUrl: "gateway-url", + LocalStoragePath: "local-storage-path", + TimeZone: "time-zone", + AnalyticsId: "analytics-id", + NetworkId: "network-id", + }, + }, nil).Twice() + + // when + spaces, total, hasMore, err := fx.ListSpaces(nil, offset, limit) + + // then + require.NoError(t, err) + require.Len(t, spaces, 2) + require.Equal(t, "Another Workspace", spaces[0].Name) + require.Equal(t, "another-space-id", spaces[0].Id) + require.Regexpf(t, regexp.MustCompile(gatewayUrl+`/image/`+iconImage), spaces[0].Icon, "Icon URL does not match") + require.Equal(t, "My Workspace", spaces[1].Name) + require.Equal(t, "my-space-id", spaces[1].Id) + require.Equal(t, "🚀", spaces[1].Icon) + require.Equal(t, 2, total) + require.False(t, hasMore) + }) + + t.Run("no spaces found", func(t *testing.T) { + // given + fx := newFixture(t) + + fx.mwMock.On("ObjectSearch", mock.Anything, mock.Anything). + Return(&pb.RpcObjectSearchResponse{ + Records: []*types.Struct{}, + Error: &pb.RpcObjectSearchResponseError{Code: pb.RpcObjectSearchResponseError_NULL}, + }).Once() + + // when + spaces, total, hasMore, err := fx.ListSpaces(nil, offset, limit) + + // then + require.ErrorIs(t, err, ErrNoSpacesFound) + require.Len(t, spaces, 0) + require.Equal(t, 0, total) + require.False(t, hasMore) + }) + + t.Run("failed workspace open", func(t *testing.T) { + // given + fx := newFixture(t) + + fx.mwMock.On("ObjectSearch", mock.Anything, mock.Anything). + Return(&pb.RpcObjectSearchResponse{ + Records: []*types.Struct{ + { + Fields: map[string]*types.Value{ + "name": pbtypes.String("My Workspace"), + "targetSpaceId": pbtypes.String("my-space-id"), + "iconEmoji": pbtypes.String("🚀"), + "iconImage": pbtypes.String(""), + }, + }, + }, + Error: &pb.RpcObjectSearchResponseError{Code: pb.RpcObjectSearchResponseError_NULL}, + }).Once() + + fx.mwMock.On("WorkspaceOpen", mock.Anything, mock.Anything). + Return(&pb.RpcWorkspaceOpenResponse{ + Error: &pb.RpcWorkspaceOpenResponseError{Code: pb.RpcWorkspaceOpenResponseError_UNKNOWN_ERROR}, + }, nil).Once() + + // when + spaces, total, hasMore, err := fx.ListSpaces(nil, offset, limit) + + // then + require.ErrorIs(t, err, ErrFailedOpenWorkspace) + require.Len(t, spaces, 0) + require.Equal(t, 0, total) + require.False(t, hasMore) + }) +} + +func TestSpaceService_CreateSpace(t *testing.T) { + t.Run("successful create space", func(t *testing.T) { + // given + fx := newFixture(t) + fx.mwMock.On("WorkspaceCreate", mock.Anything, mock.Anything). + Return(&pb.RpcWorkspaceCreateResponse{ + Error: &pb.RpcWorkspaceCreateResponseError{Code: pb.RpcWorkspaceCreateResponseError_NULL}, + SpaceId: "new-space-id", + }).Once() + + fx.mwMock.On("WorkspaceOpen", mock.Anything, mock.Anything).Return(&pb.RpcWorkspaceOpenResponse{ + Error: &pb.RpcWorkspaceOpenResponseError{Code: pb.RpcWorkspaceOpenResponseError_NULL}, + Info: &model.AccountInfo{ + HomeObjectId: "home-object-id", + ArchiveObjectId: "archive-object-id", + ProfileObjectId: "profile-object-id", + MarketplaceWorkspaceId: "marketplace-workspace-id", + WorkspaceObjectId: "workspace-object-id", + DeviceId: "device-id", + AccountSpaceId: "account-space-id", + WidgetsId: "widgets-id", + SpaceViewId: "space-view-id", + TechSpaceId: "tech-space-id", + GatewayUrl: "gateway-url", + LocalStoragePath: "local-storage-path", + TimeZone: "time-zone", + AnalyticsId: "analytics-id", + NetworkId: "network-id", + }, + }, nil).Once() + + // when + space, err := fx.CreateSpace(nil, "New Space") + + // then + require.NoError(t, err) + require.Equal(t, "new-space-id", space.Id) + }) + + t.Run("failed workspace creation", func(t *testing.T) { + // given + fx := newFixture(t) + fx.mwMock.On("WorkspaceCreate", mock.Anything, mock.Anything). + Return(&pb.RpcWorkspaceCreateResponse{ + Error: &pb.RpcWorkspaceCreateResponseError{Code: pb.RpcWorkspaceCreateResponseError_UNKNOWN_ERROR}, + }).Once() + + // when + space, err := fx.CreateSpace(nil, "New Space") + + // then + require.ErrorIs(t, err, ErrFailedCreateSpace) + require.Equal(t, Space{}, space) + }) +} + +func TestSpaceService_ListMembers(t *testing.T) { + t.Run("successfully get members", func(t *testing.T) { + // given + fx := newFixture(t) + + fx.mwMock.On("ObjectSearch", mock.Anything, mock.Anything). + Return(&pb.RpcObjectSearchResponse{ + Records: []*types.Struct{ + { + Fields: map[string]*types.Value{ + "id": pbtypes.String("member-1"), + "name": pbtypes.String("John Doe"), + "iconEmoji": pbtypes.String("👤"), + "identity": pbtypes.String("AAjEaEwPF4nkEh7AWkqEnzcQ8HziGB4ETjiTpvRCQvWnSMDZ"), + "globalName": pbtypes.String("john.any"), + }, + }, + { + Fields: map[string]*types.Value{ + "id": pbtypes.String("member-2"), + "name": pbtypes.String("Jane Doe"), + "iconImage": pbtypes.String(iconImage), + "identity": pbtypes.String("AAjLbEwPF4nkEh7AWkqEnzcQ8HziGB4ETjiTpvRCQvWnSMD4"), + "globalName": pbtypes.String("jane.any"), + }, + }, + }, + Error: &pb.RpcObjectSearchResponseError{Code: pb.RpcObjectSearchResponseError_NULL}, + }).Once() + + // when + members, total, hasMore, err := fx.ListMembers(nil, "space-id", offset, limit) + + // then + require.NoError(t, err) + require.Len(t, members, 2) + require.Equal(t, "member-1", members[0].Id) + require.Equal(t, "John Doe", members[0].Name) + require.Equal(t, "👤", members[0].Icon) + require.Equal(t, "john.any", members[0].GlobalName) + require.Equal(t, "member-2", members[1].Id) + require.Equal(t, "Jane Doe", members[1].Name) + require.Regexpf(t, regexp.MustCompile(gatewayUrl+`/image/`+iconImage), members[1].Icon, "Icon URL does not match") + require.Equal(t, "jane.any", members[1].GlobalName) + require.Equal(t, 2, total) + require.False(t, hasMore) + }) + + t.Run("no members found", func(t *testing.T) { + // given + fx := newFixture(t) + + fx.mwMock.On("ObjectSearch", mock.Anything, mock.Anything). + Return(&pb.RpcObjectSearchResponse{ + Records: []*types.Struct{}, + Error: &pb.RpcObjectSearchResponseError{Code: pb.RpcObjectSearchResponseError_NULL}, + }).Once() + + // when + members, total, hasMore, err := fx.ListMembers(nil, "space-id", offset, limit) + + // then + require.ErrorIs(t, err, ErrNoMembersFound) + require.Len(t, members, 0) + require.Equal(t, 0, total) + require.False(t, hasMore) + }) +} diff --git a/cmd/api/utils/utils.go b/cmd/api/utils/utils.go new file mode 100644 index 000000000..bd24f7e11 --- /dev/null +++ b/cmd/api/utils/utils.go @@ -0,0 +1,29 @@ +package utils + +import ( + "fmt" + + "github.com/anyproto/anytype-heart/pkg/lib/pb/model" +) + +// GetIconFromEmojiOrImage returns the icon to use for the object, which can be either an emoji or an image url +func GetIconFromEmojiOrImage(accountInfo *model.AccountInfo, iconEmoji string, iconImage string) string { + if iconEmoji != "" { + return iconEmoji + } + + if iconImage != "" { + return GetGatewayURLForMedia(accountInfo, iconImage, true) + } + + return "" +} + +// GetGatewayURLForMedia returns the URL of file gateway for the media object with the given ID +func GetGatewayURLForMedia(accountInfo *model.AccountInfo, objectId string, isIcon bool) string { + widthParam := "" + if isIcon { + widthParam = "?width=100" + } + return fmt.Sprintf("%s/image/%s%s", accountInfo.GatewayUrl, objectId, widthParam) +} From 5f7355f49613e73df66d37dfc9b55f4c0180941d Mon Sep 17 00:00:00 2001 From: Jannis Metrikat <120120832+jmetrikat@users.noreply.github.com> Date: Mon, 30 Dec 2024 20:30:07 +0100 Subject: [PATCH 067/195] GO-4459: Refactor into auth, object, search, utils --- cmd/api/auth/handler.go | 69 +++ cmd/api/auth/model.go | 10 + cmd/api/auth/service.go | 60 +++ cmd/api/docs/docs.go | 224 ++++---- cmd/api/docs/swagger.json | 224 ++++---- cmd/api/docs/swagger.yaml | 182 +++---- cmd/api/handlers.go | 630 ----------------------- cmd/api/main.go | 41 +- cmd/api/middleware.go | 2 + cmd/api/object/handler.go | 424 +++++++++++++++ cmd/api/{schemas.go => object/model.go} | 35 +- cmd/api/{helper.go => object/service.go} | 194 +++---- cmd/api/search/handler.go | 50 ++ cmd/api/search/service.go | 151 ++++++ cmd/api/space/handler.go | 80 ++- cmd/api/space/service.go | 6 +- cmd/api/util/error.go | 100 ++++ cmd/api/util/util.go | 72 +++ cmd/api/utils/utils.go | 29 -- 19 files changed, 1433 insertions(+), 1150 deletions(-) create mode 100644 cmd/api/auth/handler.go create mode 100644 cmd/api/auth/model.go create mode 100644 cmd/api/auth/service.go create mode 100644 cmd/api/object/handler.go rename cmd/api/{schemas.go => object/model.go} (78%) rename cmd/api/{helper.go => object/service.go} (61%) create mode 100644 cmd/api/search/handler.go create mode 100644 cmd/api/search/service.go create mode 100644 cmd/api/util/error.go create mode 100644 cmd/api/util/util.go delete mode 100644 cmd/api/utils/utils.go diff --git a/cmd/api/auth/handler.go b/cmd/api/auth/handler.go new file mode 100644 index 000000000..d3850ceea --- /dev/null +++ b/cmd/api/auth/handler.go @@ -0,0 +1,69 @@ +package auth + +import ( + "net/http" + + "github.com/gin-gonic/gin" + + "github.com/anyproto/anytype-heart/cmd/api/util" +) + +// AuthDisplayCodeHandler generates a new challenge and returns the challenge ID +// +// @Summary Open a modal window with a code in Anytype Desktop app +// @Tags auth +// @Accept json +// @Produce json +// @Success 200 {object} AuthDisplayCodeResponse "Challenge ID" +// @Failure 502 {object} util.ServerError "Internal server error" +// @Router /auth/displayCode [post] +func AuthDisplayCodeHandler(s *AuthService) gin.HandlerFunc { + return func(c *gin.Context) { + challengeId, err := s.GenerateNewChallenge(c.Request.Context(), "api-test") + code := util.MapErrorCode(err, util.ErrToCode(ErrFailedGenerateChallenge, http.StatusInternalServerError)) + + if code != http.StatusOK { + apiErr := util.CodeToAPIError(code, err.Error()) + c.JSON(code, apiErr) + return + } + + c.JSON(http.StatusOK, AuthDisplayCodeResponse{ChallengeId: challengeId}) + } +} + +// AuthTokenHandler retrieves an authentication token using a code and challenge ID +// +// @Summary Retrieve an authentication token using a code +// @Tags auth +// @Accept json +// @Produce json +// @Param code query string true "The code retrieved from Anytype Desktop app" +// @Param challenge_id query string true "The challenge ID" +// @Success 200 {object} AuthTokenResponse "Authentication token" +// @Failure 400 {object} util.ValidationError "Invalid input" +// @Failure 502 {object} util.ServerError "Internal server error" +// @Router /auth/token [get] +func AuthTokenHandler(s *AuthService) gin.HandlerFunc { + return func(c *gin.Context) { + challengeID := c.Query("challenge_id") + code := c.Query("code") + + sessionToken, appKey, err := s.SolveChallengeForToken(c.Request.Context(), challengeID, code) + errCode := util.MapErrorCode(err, + util.ErrToCode(ErrInvalidInput, http.StatusBadRequest), + util.ErrToCode(ErrorFailedAuthenticate, http.StatusInternalServerError), + ) + + if errCode != http.StatusOK { + apiErr := util.CodeToAPIError(errCode, err.Error()) + c.JSON(errCode, apiErr) + return + } + + c.JSON(http.StatusOK, AuthTokenResponse{ + SessionToken: sessionToken, + AppKey: appKey, + }) + } +} diff --git a/cmd/api/auth/model.go b/cmd/api/auth/model.go new file mode 100644 index 000000000..706d9e5cd --- /dev/null +++ b/cmd/api/auth/model.go @@ -0,0 +1,10 @@ +package auth + +type AuthDisplayCodeResponse struct { + ChallengeId string `json:"challenge_id" example:"67647f5ecda913e9a2e11b26"` +} + +type AuthTokenResponse struct { + SessionToken string `json:"session_token" example:""` + AppKey string `json:"app_key" example:""` +} diff --git a/cmd/api/auth/service.go b/cmd/api/auth/service.go new file mode 100644 index 000000000..22a21871b --- /dev/null +++ b/cmd/api/auth/service.go @@ -0,0 +1,60 @@ +package auth + +import ( + "context" + "errors" + + "github.com/anyproto/anytype-heart/pb" + "github.com/anyproto/anytype-heart/pb/service" +) + +var ( + ErrFailedGenerateChallenge = errors.New("failed to generate a new challenge") + ErrInvalidInput = errors.New("invalid input") + ErrorFailedAuthenticate = errors.New("failed to authenticate user") +) + +type Service interface { + GenerateNewChallenge(ctx context.Context, appName string) (string, error) + SolveChallengeForToken(ctx context.Context, challengeID, code string) (sessionToken, appKey string, err error) +} + +type AuthService struct { + mw service.ClientCommandsServer +} + +func NewService(mw service.ClientCommandsServer) *AuthService { + return &AuthService{mw: mw} +} + +// GenerateNewChallenge calls mw.AccountLocalLinkNewChallenge(...) +// and returns the challenge ID, or an error if it fails. +func (s *AuthService) GenerateNewChallenge(ctx context.Context, appName string) (string, error) { + resp := s.mw.AccountLocalLinkNewChallenge(ctx, &pb.RpcAccountLocalLinkNewChallengeRequest{AppName: "api-test"}) + + if resp.Error.Code != pb.RpcAccountLocalLinkNewChallengeResponseError_NULL { + return "", ErrFailedGenerateChallenge + } + + return resp.ChallengeId, nil +} + +// SolveChallengeForToken calls mw.AccountLocalLinkSolveChallenge(...) +// and returns the session token + app key, or an error if it fails. +func (s *AuthService) SolveChallengeForToken(ctx context.Context, challengeID, code string) (sessionToken, appKey string, err error) { + if challengeID == "" || code == "" { + return "", "", ErrInvalidInput + } + + // Call AccountLocalLinkSolveChallenge to retrieve session token and app key + resp := s.mw.AccountLocalLinkSolveChallenge(ctx, &pb.RpcAccountLocalLinkSolveChallengeRequest{ + ChallengeId: challengeID, + Answer: code, + }) + + if resp.Error.Code != pb.RpcAccountLocalLinkSolveChallengeResponseError_NULL { + return "", "", ErrorFailedAuthenticate + } + + return resp.SessionToken, resp.AppKey, nil +} diff --git a/cmd/api/docs/docs.go b/cmd/api/docs/docs.go index f2f8e8790..54924da3c 100644 --- a/cmd/api/docs/docs.go +++ b/cmd/api/docs/docs.go @@ -40,13 +40,13 @@ const docTemplate = `{ "200": { "description": "Challenge ID", "schema": { - "$ref": "#/definitions/api.AuthDisplayCodeResponse" + "$ref": "#/definitions/auth.AuthDisplayCodeResponse" } }, "502": { "description": "Internal server error", "schema": { - "$ref": "#/definitions/api.ServerError" + "$ref": "#/definitions/util.ServerError" } } } @@ -84,19 +84,19 @@ const docTemplate = `{ "200": { "description": "Authentication token", "schema": { - "$ref": "#/definitions/api.AuthTokenResponse" + "$ref": "#/definitions/auth.AuthTokenResponse" } }, "400": { "description": "Invalid input", "schema": { - "$ref": "#/definitions/api.ValidationError" + "$ref": "#/definitions/util.ValidationError" } }, "502": { "description": "Internal server error", "schema": { - "$ref": "#/definitions/api.ServerError" + "$ref": "#/definitions/util.ServerError" } } } @@ -123,7 +123,7 @@ const docTemplate = `{ }, { "type": "string", - "description": "Specify object type for search", + "description": "Specify object.Object type for search", "name": "object_type", "in": "query" }, @@ -149,7 +149,7 @@ const docTemplate = `{ "additionalProperties": { "type": "array", "items": { - "$ref": "#/definitions/api.Object" + "$ref": "#/definitions/object.Object" } } } @@ -157,13 +157,19 @@ const docTemplate = `{ "403": { "description": "Unauthorized", "schema": { - "$ref": "#/definitions/api.UnauthorizedError" + "$ref": "#/definitions/util.UnauthorizedError" + } + }, + "404": { + "description": "Resource not found", + "schema": { + "$ref": "#/definitions/util.NotFoundError" } }, "502": { "description": "Internal server error", "schema": { - "$ref": "#/definitions/api.ServerError" + "$ref": "#/definitions/util.ServerError" } } } @@ -206,19 +212,19 @@ const docTemplate = `{ "403": { "description": "Unauthorized", "schema": { - "$ref": "#/definitions/api.UnauthorizedError" + "$ref": "#/definitions/util.UnauthorizedError" } }, "404": { "description": "Resource not found", "schema": { - "$ref": "#/definitions/api.NotFoundError" + "$ref": "#/definitions/util.NotFoundError" } }, "502": { "description": "Internal server error", "schema": { - "$ref": "#/definitions/api.ServerError" + "$ref": "#/definitions/util.ServerError" } } } @@ -255,13 +261,13 @@ const docTemplate = `{ "403": { "description": "Unauthorized", "schema": { - "$ref": "#/definitions/api.UnauthorizedError" + "$ref": "#/definitions/util.UnauthorizedError" } }, "502": { "description": "Internal server error", "schema": { - "$ref": "#/definitions/api.ServerError" + "$ref": "#/definitions/util.ServerError" } } } @@ -311,19 +317,19 @@ const docTemplate = `{ "403": { "description": "Unauthorized", "schema": { - "$ref": "#/definitions/api.UnauthorizedError" + "$ref": "#/definitions/util.UnauthorizedError" } }, "404": { "description": "Resource not found", "schema": { - "$ref": "#/definitions/api.NotFoundError" + "$ref": "#/definitions/util.NotFoundError" } }, "502": { "description": "Internal server error", "schema": { - "$ref": "#/definitions/api.ServerError" + "$ref": "#/definitions/util.ServerError" } } } @@ -369,26 +375,26 @@ const docTemplate = `{ "schema": { "type": "object", "additionalProperties": { - "$ref": "#/definitions/api.ObjectType" + "$ref": "#/definitions/object.ObjectType" } } }, "403": { "description": "Unauthorized", "schema": { - "$ref": "#/definitions/api.UnauthorizedError" + "$ref": "#/definitions/util.UnauthorizedError" } }, "404": { "description": "Resource not found", "schema": { - "$ref": "#/definitions/api.NotFoundError" + "$ref": "#/definitions/util.NotFoundError" } }, "502": { "description": "Internal server error", "schema": { - "$ref": "#/definitions/api.ServerError" + "$ref": "#/definitions/util.ServerError" } } } @@ -443,7 +449,7 @@ const docTemplate = `{ "additionalProperties": { "type": "array", "items": { - "$ref": "#/definitions/api.ObjectTemplate" + "$ref": "#/definitions/object.ObjectTemplate" } } } @@ -451,19 +457,19 @@ const docTemplate = `{ "403": { "description": "Unauthorized", "schema": { - "$ref": "#/definitions/api.UnauthorizedError" + "$ref": "#/definitions/util.UnauthorizedError" } }, "404": { "description": "Resource not found", "schema": { - "$ref": "#/definitions/api.NotFoundError" + "$ref": "#/definitions/util.NotFoundError" } }, "502": { "description": "Internal server error", "schema": { - "$ref": "#/definitions/api.ServerError" + "$ref": "#/definitions/util.ServerError" } } } @@ -511,7 +517,7 @@ const docTemplate = `{ "additionalProperties": { "type": "array", "items": { - "$ref": "#/definitions/api.Object" + "$ref": "#/definitions/object.Object" } } } @@ -519,19 +525,19 @@ const docTemplate = `{ "403": { "description": "Unauthorized", "schema": { - "$ref": "#/definitions/api.UnauthorizedError" + "$ref": "#/definitions/util.UnauthorizedError" } }, "404": { "description": "Resource not found", "schema": { - "$ref": "#/definitions/api.NotFoundError" + "$ref": "#/definitions/util.NotFoundError" } }, "502": { "description": "Internal server error", "schema": { - "$ref": "#/definitions/api.ServerError" + "$ref": "#/definitions/util.ServerError" } } } @@ -572,19 +578,19 @@ const docTemplate = `{ "200": { "description": "The created object", "schema": { - "$ref": "#/definitions/api.Object" + "$ref": "#/definitions/object.Object" } }, "403": { "description": "Unauthorized", "schema": { - "$ref": "#/definitions/api.UnauthorizedError" + "$ref": "#/definitions/util.UnauthorizedError" } }, "502": { "description": "Internal server error", "schema": { - "$ref": "#/definitions/api.ServerError" + "$ref": "#/definitions/util.ServerError" } } } @@ -622,25 +628,25 @@ const docTemplate = `{ "200": { "description": "The requested object", "schema": { - "$ref": "#/definitions/api.Object" + "$ref": "#/definitions/object.Object" } }, "403": { "description": "Unauthorized", "schema": { - "$ref": "#/definitions/api.UnauthorizedError" + "$ref": "#/definitions/util.UnauthorizedError" } }, "404": { "description": "Resource not found", "schema": { - "$ref": "#/definitions/api.NotFoundError" + "$ref": "#/definitions/util.NotFoundError" } }, "502": { "description": "Internal server error", "schema": { - "$ref": "#/definitions/api.ServerError" + "$ref": "#/definitions/util.ServerError" } } } @@ -677,7 +683,7 @@ const docTemplate = `{ "in": "body", "required": true, "schema": { - "$ref": "#/definitions/api.Object" + "$ref": "#/definitions/object.Object" } } ], @@ -685,25 +691,25 @@ const docTemplate = `{ "200": { "description": "The updated object", "schema": { - "$ref": "#/definitions/api.Object" + "$ref": "#/definitions/object.Object" } }, "403": { "description": "Unauthorized", "schema": { - "$ref": "#/definitions/api.UnauthorizedError" + "$ref": "#/definitions/util.UnauthorizedError" } }, "404": { "description": "Resource not found", "schema": { - "$ref": "#/definitions/api.NotFoundError" + "$ref": "#/definitions/util.NotFoundError" } }, "502": { "description": "Internal server error", "schema": { - "$ref": "#/definitions/api.ServerError" + "$ref": "#/definitions/util.ServerError" } } } @@ -711,7 +717,7 @@ const docTemplate = `{ } }, "definitions": { - "api.AuthDisplayCodeResponse": { + "auth.AuthDisplayCodeResponse": { "type": "object", "properties": { "challenge_id": { @@ -720,7 +726,7 @@ const docTemplate = `{ } } }, - "api.AuthTokenResponse": { + "auth.AuthTokenResponse": { "type": "object", "properties": { "app_key": { @@ -733,7 +739,7 @@ const docTemplate = `{ } } }, - "api.Block": { + "object.Block": { "type": "object", "properties": { "align": { @@ -749,20 +755,20 @@ const docTemplate = `{ } }, "file": { - "$ref": "#/definitions/api.File" + "$ref": "#/definitions/object.File" }, "id": { "type": "string" }, "text": { - "$ref": "#/definitions/api.Text" + "$ref": "#/definitions/object.Text" }, "vertical_align": { "type": "string" } } }, - "api.Detail": { + "object.Detail": { "type": "object", "properties": { "details": { @@ -774,7 +780,7 @@ const docTemplate = `{ } } }, - "api.File": { + "object.File": { "type": "object", "properties": { "added_at": { @@ -806,32 +812,19 @@ const docTemplate = `{ } } }, - "api.NotFoundError": { - "type": "object", - "properties": { - "error": { - "type": "object", - "properties": { - "message": { - "type": "string" - } - } - } - } - }, - "api.Object": { + "object.Object": { "type": "object", "properties": { "blocks": { "type": "array", "items": { - "$ref": "#/definitions/api.Block" + "$ref": "#/definitions/object.Block" } }, "details": { "type": "array", "items": { - "$ref": "#/definitions/api.Detail" + "$ref": "#/definitions/object.Detail" } }, "icon": { @@ -863,7 +856,7 @@ const docTemplate = `{ } } }, - "api.ObjectTemplate": { + "object.ObjectTemplate": { "type": "object", "properties": { "icon": { @@ -884,7 +877,7 @@ const docTemplate = `{ } } }, - "api.ObjectType": { + "object.ObjectType": { "type": "object", "properties": { "icon": { @@ -909,20 +902,7 @@ const docTemplate = `{ } } }, - "api.ServerError": { - "type": "object", - "properties": { - "error": { - "type": "object", - "properties": { - "message": { - "type": "string" - } - } - } - } - }, - "api.Text": { + "object.Text": { "type": "object", "properties": { "checked": { @@ -942,32 +922,6 @@ const docTemplate = `{ } } }, - "api.UnauthorizedError": { - "type": "object", - "properties": { - "error": { - "type": "object", - "properties": { - "message": { - "type": "string" - } - } - } - } - }, - "api.ValidationError": { - "type": "object", - "properties": { - "error": { - "type": "object", - "properties": { - "message": { - "type": "string" - } - } - } - } - }, "pagination.PaginatedResponse-space_Member": { "type": "object", "properties": { @@ -1071,7 +1025,7 @@ const docTemplate = `{ }, "analytics_id": { "type": "string", - "example": "" + "example": "624aecdd-4797-4611-9d61-a2ae5f53cf1c" }, "archive_object_id": { "type": "string", @@ -1083,7 +1037,7 @@ const docTemplate = `{ }, "gateway_url": { "type": "string", - "example": "" + "example": "http://127.0.0.1:31006" }, "home_object_id": { "type": "string", @@ -1099,7 +1053,7 @@ const docTemplate = `{ }, "local_storage_path": { "type": "string", - "example": "" + "example": "/Users/johndoe/Library/Application Support/Anytype/data/AAHTtt1wuQEnaYBNZ2Cyfcvs6DqPqxgn8VXDVk4avsUkMuha" }, "marketplace_workspace_id": { "type": "string", @@ -1142,6 +1096,58 @@ const docTemplate = `{ "example": "bafyreiapey2g6e6za4zfxvlgwdy4hbbfu676gmwrhnqvjbxvrchr7elr3y" } } + }, + "util.NotFoundError": { + "type": "object", + "properties": { + "error": { + "type": "object", + "properties": { + "message": { + "type": "string" + } + } + } + } + }, + "util.ServerError": { + "type": "object", + "properties": { + "error": { + "type": "object", + "properties": { + "message": { + "type": "string" + } + } + } + } + }, + "util.UnauthorizedError": { + "type": "object", + "properties": { + "error": { + "type": "object", + "properties": { + "message": { + "type": "string" + } + } + } + } + }, + "util.ValidationError": { + "type": "object", + "properties": { + "error": { + "type": "object", + "properties": { + "message": { + "type": "string" + } + } + } + } } }, "securityDefinitions": { diff --git a/cmd/api/docs/swagger.json b/cmd/api/docs/swagger.json index 8285da535..d81a69838 100644 --- a/cmd/api/docs/swagger.json +++ b/cmd/api/docs/swagger.json @@ -34,13 +34,13 @@ "200": { "description": "Challenge ID", "schema": { - "$ref": "#/definitions/api.AuthDisplayCodeResponse" + "$ref": "#/definitions/auth.AuthDisplayCodeResponse" } }, "502": { "description": "Internal server error", "schema": { - "$ref": "#/definitions/api.ServerError" + "$ref": "#/definitions/util.ServerError" } } } @@ -78,19 +78,19 @@ "200": { "description": "Authentication token", "schema": { - "$ref": "#/definitions/api.AuthTokenResponse" + "$ref": "#/definitions/auth.AuthTokenResponse" } }, "400": { "description": "Invalid input", "schema": { - "$ref": "#/definitions/api.ValidationError" + "$ref": "#/definitions/util.ValidationError" } }, "502": { "description": "Internal server error", "schema": { - "$ref": "#/definitions/api.ServerError" + "$ref": "#/definitions/util.ServerError" } } } @@ -117,7 +117,7 @@ }, { "type": "string", - "description": "Specify object type for search", + "description": "Specify object.Object type for search", "name": "object_type", "in": "query" }, @@ -143,7 +143,7 @@ "additionalProperties": { "type": "array", "items": { - "$ref": "#/definitions/api.Object" + "$ref": "#/definitions/object.Object" } } } @@ -151,13 +151,19 @@ "403": { "description": "Unauthorized", "schema": { - "$ref": "#/definitions/api.UnauthorizedError" + "$ref": "#/definitions/util.UnauthorizedError" + } + }, + "404": { + "description": "Resource not found", + "schema": { + "$ref": "#/definitions/util.NotFoundError" } }, "502": { "description": "Internal server error", "schema": { - "$ref": "#/definitions/api.ServerError" + "$ref": "#/definitions/util.ServerError" } } } @@ -200,19 +206,19 @@ "403": { "description": "Unauthorized", "schema": { - "$ref": "#/definitions/api.UnauthorizedError" + "$ref": "#/definitions/util.UnauthorizedError" } }, "404": { "description": "Resource not found", "schema": { - "$ref": "#/definitions/api.NotFoundError" + "$ref": "#/definitions/util.NotFoundError" } }, "502": { "description": "Internal server error", "schema": { - "$ref": "#/definitions/api.ServerError" + "$ref": "#/definitions/util.ServerError" } } } @@ -249,13 +255,13 @@ "403": { "description": "Unauthorized", "schema": { - "$ref": "#/definitions/api.UnauthorizedError" + "$ref": "#/definitions/util.UnauthorizedError" } }, "502": { "description": "Internal server error", "schema": { - "$ref": "#/definitions/api.ServerError" + "$ref": "#/definitions/util.ServerError" } } } @@ -305,19 +311,19 @@ "403": { "description": "Unauthorized", "schema": { - "$ref": "#/definitions/api.UnauthorizedError" + "$ref": "#/definitions/util.UnauthorizedError" } }, "404": { "description": "Resource not found", "schema": { - "$ref": "#/definitions/api.NotFoundError" + "$ref": "#/definitions/util.NotFoundError" } }, "502": { "description": "Internal server error", "schema": { - "$ref": "#/definitions/api.ServerError" + "$ref": "#/definitions/util.ServerError" } } } @@ -363,26 +369,26 @@ "schema": { "type": "object", "additionalProperties": { - "$ref": "#/definitions/api.ObjectType" + "$ref": "#/definitions/object.ObjectType" } } }, "403": { "description": "Unauthorized", "schema": { - "$ref": "#/definitions/api.UnauthorizedError" + "$ref": "#/definitions/util.UnauthorizedError" } }, "404": { "description": "Resource not found", "schema": { - "$ref": "#/definitions/api.NotFoundError" + "$ref": "#/definitions/util.NotFoundError" } }, "502": { "description": "Internal server error", "schema": { - "$ref": "#/definitions/api.ServerError" + "$ref": "#/definitions/util.ServerError" } } } @@ -437,7 +443,7 @@ "additionalProperties": { "type": "array", "items": { - "$ref": "#/definitions/api.ObjectTemplate" + "$ref": "#/definitions/object.ObjectTemplate" } } } @@ -445,19 +451,19 @@ "403": { "description": "Unauthorized", "schema": { - "$ref": "#/definitions/api.UnauthorizedError" + "$ref": "#/definitions/util.UnauthorizedError" } }, "404": { "description": "Resource not found", "schema": { - "$ref": "#/definitions/api.NotFoundError" + "$ref": "#/definitions/util.NotFoundError" } }, "502": { "description": "Internal server error", "schema": { - "$ref": "#/definitions/api.ServerError" + "$ref": "#/definitions/util.ServerError" } } } @@ -505,7 +511,7 @@ "additionalProperties": { "type": "array", "items": { - "$ref": "#/definitions/api.Object" + "$ref": "#/definitions/object.Object" } } } @@ -513,19 +519,19 @@ "403": { "description": "Unauthorized", "schema": { - "$ref": "#/definitions/api.UnauthorizedError" + "$ref": "#/definitions/util.UnauthorizedError" } }, "404": { "description": "Resource not found", "schema": { - "$ref": "#/definitions/api.NotFoundError" + "$ref": "#/definitions/util.NotFoundError" } }, "502": { "description": "Internal server error", "schema": { - "$ref": "#/definitions/api.ServerError" + "$ref": "#/definitions/util.ServerError" } } } @@ -566,19 +572,19 @@ "200": { "description": "The created object", "schema": { - "$ref": "#/definitions/api.Object" + "$ref": "#/definitions/object.Object" } }, "403": { "description": "Unauthorized", "schema": { - "$ref": "#/definitions/api.UnauthorizedError" + "$ref": "#/definitions/util.UnauthorizedError" } }, "502": { "description": "Internal server error", "schema": { - "$ref": "#/definitions/api.ServerError" + "$ref": "#/definitions/util.ServerError" } } } @@ -616,25 +622,25 @@ "200": { "description": "The requested object", "schema": { - "$ref": "#/definitions/api.Object" + "$ref": "#/definitions/object.Object" } }, "403": { "description": "Unauthorized", "schema": { - "$ref": "#/definitions/api.UnauthorizedError" + "$ref": "#/definitions/util.UnauthorizedError" } }, "404": { "description": "Resource not found", "schema": { - "$ref": "#/definitions/api.NotFoundError" + "$ref": "#/definitions/util.NotFoundError" } }, "502": { "description": "Internal server error", "schema": { - "$ref": "#/definitions/api.ServerError" + "$ref": "#/definitions/util.ServerError" } } } @@ -671,7 +677,7 @@ "in": "body", "required": true, "schema": { - "$ref": "#/definitions/api.Object" + "$ref": "#/definitions/object.Object" } } ], @@ -679,25 +685,25 @@ "200": { "description": "The updated object", "schema": { - "$ref": "#/definitions/api.Object" + "$ref": "#/definitions/object.Object" } }, "403": { "description": "Unauthorized", "schema": { - "$ref": "#/definitions/api.UnauthorizedError" + "$ref": "#/definitions/util.UnauthorizedError" } }, "404": { "description": "Resource not found", "schema": { - "$ref": "#/definitions/api.NotFoundError" + "$ref": "#/definitions/util.NotFoundError" } }, "502": { "description": "Internal server error", "schema": { - "$ref": "#/definitions/api.ServerError" + "$ref": "#/definitions/util.ServerError" } } } @@ -705,7 +711,7 @@ } }, "definitions": { - "api.AuthDisplayCodeResponse": { + "auth.AuthDisplayCodeResponse": { "type": "object", "properties": { "challenge_id": { @@ -714,7 +720,7 @@ } } }, - "api.AuthTokenResponse": { + "auth.AuthTokenResponse": { "type": "object", "properties": { "app_key": { @@ -727,7 +733,7 @@ } } }, - "api.Block": { + "object.Block": { "type": "object", "properties": { "align": { @@ -743,20 +749,20 @@ } }, "file": { - "$ref": "#/definitions/api.File" + "$ref": "#/definitions/object.File" }, "id": { "type": "string" }, "text": { - "$ref": "#/definitions/api.Text" + "$ref": "#/definitions/object.Text" }, "vertical_align": { "type": "string" } } }, - "api.Detail": { + "object.Detail": { "type": "object", "properties": { "details": { @@ -768,7 +774,7 @@ } } }, - "api.File": { + "object.File": { "type": "object", "properties": { "added_at": { @@ -800,32 +806,19 @@ } } }, - "api.NotFoundError": { - "type": "object", - "properties": { - "error": { - "type": "object", - "properties": { - "message": { - "type": "string" - } - } - } - } - }, - "api.Object": { + "object.Object": { "type": "object", "properties": { "blocks": { "type": "array", "items": { - "$ref": "#/definitions/api.Block" + "$ref": "#/definitions/object.Block" } }, "details": { "type": "array", "items": { - "$ref": "#/definitions/api.Detail" + "$ref": "#/definitions/object.Detail" } }, "icon": { @@ -857,7 +850,7 @@ } } }, - "api.ObjectTemplate": { + "object.ObjectTemplate": { "type": "object", "properties": { "icon": { @@ -878,7 +871,7 @@ } } }, - "api.ObjectType": { + "object.ObjectType": { "type": "object", "properties": { "icon": { @@ -903,20 +896,7 @@ } } }, - "api.ServerError": { - "type": "object", - "properties": { - "error": { - "type": "object", - "properties": { - "message": { - "type": "string" - } - } - } - } - }, - "api.Text": { + "object.Text": { "type": "object", "properties": { "checked": { @@ -936,32 +916,6 @@ } } }, - "api.UnauthorizedError": { - "type": "object", - "properties": { - "error": { - "type": "object", - "properties": { - "message": { - "type": "string" - } - } - } - } - }, - "api.ValidationError": { - "type": "object", - "properties": { - "error": { - "type": "object", - "properties": { - "message": { - "type": "string" - } - } - } - } - }, "pagination.PaginatedResponse-space_Member": { "type": "object", "properties": { @@ -1065,7 +1019,7 @@ }, "analytics_id": { "type": "string", - "example": "" + "example": "624aecdd-4797-4611-9d61-a2ae5f53cf1c" }, "archive_object_id": { "type": "string", @@ -1077,7 +1031,7 @@ }, "gateway_url": { "type": "string", - "example": "" + "example": "http://127.0.0.1:31006" }, "home_object_id": { "type": "string", @@ -1093,7 +1047,7 @@ }, "local_storage_path": { "type": "string", - "example": "" + "example": "/Users/johndoe/Library/Application Support/Anytype/data/AAHTtt1wuQEnaYBNZ2Cyfcvs6DqPqxgn8VXDVk4avsUkMuha" }, "marketplace_workspace_id": { "type": "string", @@ -1136,6 +1090,58 @@ "example": "bafyreiapey2g6e6za4zfxvlgwdy4hbbfu676gmwrhnqvjbxvrchr7elr3y" } } + }, + "util.NotFoundError": { + "type": "object", + "properties": { + "error": { + "type": "object", + "properties": { + "message": { + "type": "string" + } + } + } + } + }, + "util.ServerError": { + "type": "object", + "properties": { + "error": { + "type": "object", + "properties": { + "message": { + "type": "string" + } + } + } + } + }, + "util.UnauthorizedError": { + "type": "object", + "properties": { + "error": { + "type": "object", + "properties": { + "message": { + "type": "string" + } + } + } + } + }, + "util.ValidationError": { + "type": "object", + "properties": { + "error": { + "type": "object", + "properties": { + "message": { + "type": "string" + } + } + } + } } }, "securityDefinitions": { diff --git a/cmd/api/docs/swagger.yaml b/cmd/api/docs/swagger.yaml index a9f287cae..402548ae1 100644 --- a/cmd/api/docs/swagger.yaml +++ b/cmd/api/docs/swagger.yaml @@ -1,12 +1,12 @@ basePath: /v1 definitions: - api.AuthDisplayCodeResponse: + auth.AuthDisplayCodeResponse: properties: challenge_id: example: 67647f5ecda913e9a2e11b26 type: string type: object - api.AuthTokenResponse: + auth.AuthTokenResponse: properties: app_key: example: "" @@ -15,7 +15,7 @@ definitions: example: "" type: string type: object - api.Block: + object.Block: properties: align: type: string @@ -26,15 +26,15 @@ definitions: type: string type: array file: - $ref: '#/definitions/api.File' + $ref: '#/definitions/object.File' id: type: string text: - $ref: '#/definitions/api.Text' + $ref: '#/definitions/object.Text' vertical_align: type: string type: object - api.Detail: + object.Detail: properties: details: additionalProperties: true @@ -42,7 +42,7 @@ definitions: id: type: string type: object - api.File: + object.File: properties: added_at: type: integer @@ -63,23 +63,15 @@ definitions: type: type: string type: object - api.NotFoundError: - properties: - error: - properties: - message: - type: string - type: object - type: object - api.Object: + object.Object: properties: blocks: items: - $ref: '#/definitions/api.Block' + $ref: '#/definitions/object.Block' type: array details: items: - $ref: '#/definitions/api.Detail' + $ref: '#/definitions/object.Detail' type: array icon: example: "\U0001F4C4" @@ -102,7 +94,7 @@ definitions: example: object type: string type: object - api.ObjectTemplate: + object.ObjectTemplate: properties: icon: example: "\U0001F4C4" @@ -117,7 +109,7 @@ definitions: example: object_template type: string type: object - api.ObjectType: + object.ObjectType: properties: icon: example: "\U0001F4C4" @@ -135,15 +127,7 @@ definitions: example: ot-page type: string type: object - api.ServerError: - properties: - error: - properties: - message: - type: string - type: object - type: object - api.Text: + object.Text: properties: checked: type: boolean @@ -156,22 +140,6 @@ definitions: text: type: string type: object - api.UnauthorizedError: - properties: - error: - properties: - message: - type: string - type: object - type: object - api.ValidationError: - properties: - error: - properties: - message: - type: string - type: object - type: object pagination.PaginatedResponse-space_Member: properties: data: @@ -244,7 +212,7 @@ definitions: example: bafyreihpd2knon5wbljhtfeg3fcqtg3i2pomhhnigui6lrjmzcjzep7gcy.23me69r569oi1 type: string analytics_id: - example: "" + example: 624aecdd-4797-4611-9d61-a2ae5f53cf1c type: string archive_object_id: example: bafyreialsgoyflf3etjm3parzurivyaukzivwortf32b4twnlwpwocsrri @@ -253,7 +221,7 @@ definitions: example: 12D3KooWGZMJ4kQVyQVXaj7gJPZr3RZ2nvd9M2Eq2pprEoPih9WF type: string gateway_url: - example: "" + example: http://127.0.0.1:31006 type: string home_object_id: example: bafyreie4qcl3wczb4cw5hrfyycikhjyh6oljdis3ewqrk5boaav3sbwqya @@ -265,7 +233,7 @@ definitions: example: bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1 type: string local_storage_path: - example: "" + example: /Users/johndoe/Library/Application Support/Anytype/data/AAHTtt1wuQEnaYBNZ2Cyfcvs6DqPqxgn8VXDVk4avsUkMuha type: string marketplace_workspace_id: example: _anytype_marketplace @@ -298,6 +266,38 @@ definitions: example: bafyreiapey2g6e6za4zfxvlgwdy4hbbfu676gmwrhnqvjbxvrchr7elr3y type: string type: object + util.NotFoundError: + properties: + error: + properties: + message: + type: string + type: object + type: object + util.ServerError: + properties: + error: + properties: + message: + type: string + type: object + type: object + util.UnauthorizedError: + properties: + error: + properties: + message: + type: string + type: object + type: object + util.ValidationError: + properties: + error: + properties: + message: + type: string + type: object + type: object externalDocs: description: OpenAPI url: https://swagger.io/resources/open-api/ @@ -326,11 +326,11 @@ paths: "200": description: Challenge ID schema: - $ref: '#/definitions/api.AuthDisplayCodeResponse' + $ref: '#/definitions/auth.AuthDisplayCodeResponse' "502": description: Internal server error schema: - $ref: '#/definitions/api.ServerError' + $ref: '#/definitions/util.ServerError' summary: Open a modal window with a code in Anytype Desktop app tags: - auth @@ -355,15 +355,15 @@ paths: "200": description: Authentication token schema: - $ref: '#/definitions/api.AuthTokenResponse' + $ref: '#/definitions/auth.AuthTokenResponse' "400": description: Invalid input schema: - $ref: '#/definitions/api.ValidationError' + $ref: '#/definitions/util.ValidationError' "502": description: Internal server error schema: - $ref: '#/definitions/api.ServerError' + $ref: '#/definitions/util.ServerError' summary: Retrieve an authentication token using a code tags: - auth @@ -376,7 +376,7 @@ paths: in: query name: query type: string - - description: Specify object type for search + - description: Specify object.Object type for search in: query name: object_type type: string @@ -398,17 +398,21 @@ paths: schema: additionalProperties: items: - $ref: '#/definitions/api.Object' + $ref: '#/definitions/object.Object' type: array type: object "403": description: Unauthorized schema: - $ref: '#/definitions/api.UnauthorizedError' + $ref: '#/definitions/util.UnauthorizedError' + "404": + description: Resource not found + schema: + $ref: '#/definitions/util.NotFoundError' "502": description: Internal server error schema: - $ref: '#/definitions/api.ServerError' + $ref: '#/definitions/util.ServerError' summary: Search and retrieve objects across all the spaces tags: - search @@ -437,15 +441,15 @@ paths: "403": description: Unauthorized schema: - $ref: '#/definitions/api.UnauthorizedError' + $ref: '#/definitions/util.UnauthorizedError' "404": description: Resource not found schema: - $ref: '#/definitions/api.NotFoundError' + $ref: '#/definitions/util.NotFoundError' "502": description: Internal server error schema: - $ref: '#/definitions/api.ServerError' + $ref: '#/definitions/util.ServerError' summary: Retrieve a list of spaces tags: - spaces @@ -469,11 +473,11 @@ paths: "403": description: Unauthorized schema: - $ref: '#/definitions/api.UnauthorizedError' + $ref: '#/definitions/util.UnauthorizedError' "502": description: Internal server error schema: - $ref: '#/definitions/api.ServerError' + $ref: '#/definitions/util.ServerError' summary: Create a new Space tags: - spaces @@ -507,15 +511,15 @@ paths: "403": description: Unauthorized schema: - $ref: '#/definitions/api.UnauthorizedError' + $ref: '#/definitions/util.UnauthorizedError' "404": description: Resource not found schema: - $ref: '#/definitions/api.NotFoundError' + $ref: '#/definitions/util.NotFoundError' "502": description: Internal server error schema: - $ref: '#/definitions/api.ServerError' + $ref: '#/definitions/util.ServerError' summary: Retrieve a list of members for the specified Space tags: - spaces @@ -546,20 +550,20 @@ paths: description: List of object types schema: additionalProperties: - $ref: '#/definitions/api.ObjectType' + $ref: '#/definitions/object.ObjectType' type: object "403": description: Unauthorized schema: - $ref: '#/definitions/api.UnauthorizedError' + $ref: '#/definitions/util.UnauthorizedError' "404": description: Resource not found schema: - $ref: '#/definitions/api.NotFoundError' + $ref: '#/definitions/util.NotFoundError' "502": description: Internal server error schema: - $ref: '#/definitions/api.ServerError' + $ref: '#/definitions/util.ServerError' summary: Retrieve object types in a specific space tags: - types_and_templates @@ -596,21 +600,21 @@ paths: schema: additionalProperties: items: - $ref: '#/definitions/api.ObjectTemplate' + $ref: '#/definitions/object.ObjectTemplate' type: array type: object "403": description: Unauthorized schema: - $ref: '#/definitions/api.UnauthorizedError' + $ref: '#/definitions/util.UnauthorizedError' "404": description: Resource not found schema: - $ref: '#/definitions/api.NotFoundError' + $ref: '#/definitions/util.NotFoundError' "502": description: Internal server error schema: - $ref: '#/definitions/api.ServerError' + $ref: '#/definitions/util.ServerError' summary: Retrieve a list of templates for a specific object type in a space tags: - types_and_templates @@ -642,21 +646,21 @@ paths: schema: additionalProperties: items: - $ref: '#/definitions/api.Object' + $ref: '#/definitions/object.Object' type: array type: object "403": description: Unauthorized schema: - $ref: '#/definitions/api.UnauthorizedError' + $ref: '#/definitions/util.UnauthorizedError' "404": description: Resource not found schema: - $ref: '#/definitions/api.NotFoundError' + $ref: '#/definitions/util.NotFoundError' "502": description: Internal server error schema: - $ref: '#/definitions/api.ServerError' + $ref: '#/definitions/util.ServerError' summary: Retrieve objects in a specific space tags: - space_objects @@ -683,15 +687,15 @@ paths: "200": description: The created object schema: - $ref: '#/definitions/api.Object' + $ref: '#/definitions/object.Object' "403": description: Unauthorized schema: - $ref: '#/definitions/api.UnauthorizedError' + $ref: '#/definitions/util.UnauthorizedError' "502": description: Internal server error schema: - $ref: '#/definitions/api.ServerError' + $ref: '#/definitions/util.ServerError' summary: Create a new object in a specific space tags: - space_objects @@ -716,19 +720,19 @@ paths: "200": description: The requested object schema: - $ref: '#/definitions/api.Object' + $ref: '#/definitions/object.Object' "403": description: Unauthorized schema: - $ref: '#/definitions/api.UnauthorizedError' + $ref: '#/definitions/util.UnauthorizedError' "404": description: Resource not found schema: - $ref: '#/definitions/api.NotFoundError' + $ref: '#/definitions/util.NotFoundError' "502": description: Internal server error schema: - $ref: '#/definitions/api.ServerError' + $ref: '#/definitions/util.ServerError' summary: Retrieve a specific object in a space tags: - space_objects @@ -751,26 +755,26 @@ paths: name: object required: true schema: - $ref: '#/definitions/api.Object' + $ref: '#/definitions/object.Object' produces: - application/json responses: "200": description: The updated object schema: - $ref: '#/definitions/api.Object' + $ref: '#/definitions/object.Object' "403": description: Unauthorized schema: - $ref: '#/definitions/api.UnauthorizedError' + $ref: '#/definitions/util.UnauthorizedError' "404": description: Resource not found schema: - $ref: '#/definitions/api.NotFoundError' + $ref: '#/definitions/util.NotFoundError' "502": description: Internal server error schema: - $ref: '#/definitions/api.ServerError' + $ref: '#/definitions/util.ServerError' summary: Update an existing object in a specific space tags: - space_objects diff --git a/cmd/api/handlers.go b/cmd/api/handlers.go index a5e132519..778f64ec1 100644 --- a/cmd/api/handlers.go +++ b/cmd/api/handlers.go @@ -1,631 +1 @@ package api - -import ( - "net/http" - "sort" - - "github.com/gin-gonic/gin" - "github.com/gogo/protobuf/types" - - "github.com/anyproto/anytype-heart/cmd/api/pagination" - "github.com/anyproto/anytype-heart/cmd/api/utils" - "github.com/anyproto/anytype-heart/pb" - "github.com/anyproto/anytype-heart/pkg/lib/bundle" - "github.com/anyproto/anytype-heart/pkg/lib/pb/model" - "github.com/anyproto/anytype-heart/util/pbtypes" -) - -type CreateObjectRequest struct { - Name string `json:"name"` - Icon string `json:"icon"` - TemplateId string `json:"template_id"` - ObjectTypeUniqueKey string `json:"object_type_unique_key"` - WithChat bool `json:"with_chat"` -} - -type AddMessageRequest struct { - Text string `json:"text"` - Style string `json:"style"` -} - -// authDisplayCodeHandler generates a new challenge and returns the challenge ID -// -// @Summary Open a modal window with a code in Anytype Desktop app -// @Tags auth -// @Accept json -// @Produce json -// @Success 200 {object} AuthDisplayCodeResponse "Challenge ID" -// @Failure 502 {object} ServerError "Internal server error" -// @Router /auth/displayCode [post] -func (a *ApiServer) authDisplayCodeHandler(c *gin.Context) { - resp := a.mw.AccountLocalLinkNewChallenge(c.Request.Context(), &pb.RpcAccountLocalLinkNewChallengeRequest{AppName: "api-test"}) - - if resp.Error.Code != pb.RpcAccountLocalLinkNewChallengeResponseError_NULL { - c.JSON(http.StatusInternalServerError, gin.H{"message": "Failed to generate a new challenge."}) - } - - c.JSON(http.StatusOK, AuthDisplayCodeResponse{ChallengeId: resp.ChallengeId}) -} - -// authTokenHandler retrieves an authentication token using a code and challenge ID -// -// @Summary Retrieve an authentication token using a code -// @Tags auth -// @Accept json -// @Produce json -// @Param code query string true "The code retrieved from Anytype Desktop app" -// @Param challenge_id query string true "The challenge ID" -// @Success 200 {object} AuthTokenResponse "Authentication token" -// @Failure 400 {object} ValidationError "Invalid input" -// @Failure 502 {object} ServerError "Internal server error" -// @Router /auth/token [get] -func (a *ApiServer) authTokenHandler(c *gin.Context) { - if c.Query("challenge_id") == "" || c.Query("code") == "" { - c.JSON(http.StatusBadRequest, gin.H{"message": "Invalid input"}) - return - } - - // Call AccountLocalLinkSolveChallenge to retrieve session token and app key - resp := a.mw.AccountLocalLinkSolveChallenge(c.Request.Context(), &pb.RpcAccountLocalLinkSolveChallengeRequest{ - ChallengeId: c.Query("challenge_id"), - Answer: c.Query("code"), - }) - - if resp.Error.Code != pb.RpcAccountLocalLinkSolveChallengeResponseError_NULL { - c.JSON(http.StatusInternalServerError, gin.H{"message": "Failed to authenticate user."}) - return - } - - c.JSON(http.StatusOK, AuthTokenResponse{ - SessionToken: resp.SessionToken, - AppKey: resp.AppKey, - }) -} - -// getObjectsHandler retrieves objects in a specific space -// -// @Summary Retrieve objects in a specific space -// @Tags space_objects -// @Accept json -// @Produce json -// @Param space_id path string true "The ID of the space" -// @Param offset query int false "The number of items to skip before starting to collect the result set" -// @Param limit query int false "The number of items to return" default(100) -// @Success 200 {object} map[string][]Object "List of objects" -// @Failure 403 {object} UnauthorizedError "Unauthorized" -// @Failure 404 {object} NotFoundError "Resource not found" -// @Failure 502 {object} ServerError "Internal server error" -// @Router /spaces/{space_id}/objects [get] -func (a *ApiServer) getObjectsHandler(c *gin.Context) { - spaceId := c.Param("space_id") - offset := c.GetInt("offset") - limit := c.GetInt("limit") - - resp := a.mw.ObjectSearch(c.Request.Context(), &pb.RpcObjectSearchRequest{ - SpaceId: spaceId, - Filters: []*model.BlockContentDataviewFilter{ - { - RelationKey: bundle.RelationKeyLayout.String(), - Condition: model.BlockContentDataviewFilter_In, - Value: pbtypes.IntList([]int{ - int(model.ObjectType_basic), - int(model.ObjectType_profile), - int(model.ObjectType_todo), - int(model.ObjectType_note), - int(model.ObjectType_bookmark), - int(model.ObjectType_set), - int(model.ObjectType_collection), - int(model.ObjectType_participant), - }...), - }, - }, - Sorts: []*model.BlockContentDataviewSort{{ - RelationKey: bundle.RelationKeyLastModifiedDate.String(), - Type: model.BlockContentDataviewSort_Desc, - Format: model.RelationFormat_longtext, - IncludeTime: true, - EmptyPlacement: model.BlockContentDataviewSort_NotSpecified, - }}, - Keys: []string{"id", "name", "type", "layout", "iconEmoji", "iconImage"}, - }) - - if resp.Error.Code != pb.RpcObjectSearchResponseError_NULL { - c.JSON(http.StatusInternalServerError, gin.H{"message": "Failed to retrieve list of objects."}) - return - } - - if len(resp.Records) == 0 { - c.JSON(http.StatusNotFound, gin.H{"message": "No objects found."}) - return - } - - paginatedObjects, hasMore := pagination.Paginate(resp.Records, offset, limit) - objects := make([]Object, 0, len(paginatedObjects)) - - for _, record := range paginatedObjects { - icon := utils.GetIconFromEmojiOrImage(a.accountInfo, record.Fields["iconEmoji"].GetStringValue(), record.Fields["iconImage"].GetStringValue()) - objectTypeName, statusCode, errorMessage := a.resolveTypeToName(spaceId, record.Fields["type"].GetStringValue()) - if statusCode != http.StatusOK { - c.JSON(statusCode, gin.H{"message": errorMessage}) - return - } - - objectShowResp := a.mw.ObjectShow(c.Request.Context(), &pb.RpcObjectShowRequest{ - SpaceId: spaceId, - ObjectId: record.Fields["id"].GetStringValue(), - }) - - object := Object{ - // TODO fix type inconsistency - Type: model.ObjectTypeLayout_name[int32(record.Fields["layout"].GetNumberValue())], - Id: record.Fields["id"].GetStringValue(), - Name: record.Fields["name"].GetStringValue(), - Icon: icon, - ObjectType: objectTypeName, - SpaceId: spaceId, - RootId: objectShowResp.ObjectView.RootId, - Blocks: a.getBlocks(objectShowResp), - Details: a.getDetails(objectShowResp), - } - - objects = append(objects, object) - } - - pagination.RespondWithPagination(c, http.StatusOK, objects, len(resp.Records), offset, limit, hasMore) -} - -// getObjectHandler retrieves a specific object in a space -// -// @Summary Retrieve a specific object in a space -// @Tags space_objects -// @Accept json -// @Produce json -// @Param space_id path string true "The ID of the space" -// @Param object_id path string true "The ID of the object" -// @Success 200 {object} Object "The requested object" -// @Failure 403 {object} UnauthorizedError "Unauthorized" -// @Failure 404 {object} NotFoundError "Resource not found" -// @Failure 502 {object} ServerError "Internal server error" -// @Router /spaces/{space_id}/objects/{object_id} [get] -func (a *ApiServer) getObjectHandler(c *gin.Context) { - spaceId := c.Param("space_id") - objectId := c.Param("object_id") - - resp := a.mw.ObjectShow(c.Request.Context(), &pb.RpcObjectShowRequest{ - SpaceId: spaceId, - ObjectId: objectId, - }) - - if resp.Error.Code != pb.RpcObjectShowResponseError_NULL { - if resp.Error.Code == pb.RpcObjectShowResponseError_NOT_FOUND { - c.JSON(http.StatusNotFound, gin.H{"message": "Object not found", "space_id": spaceId, "object_id": objectId}) - return - } - c.JSON(http.StatusInternalServerError, gin.H{"message": "Failed to retrieve object."}) - return - } - - objectTypeName, statusCode, errorMessage := a.resolveTypeToName(spaceId, resp.ObjectView.Details[0].Details.Fields["type"].GetStringValue()) - if statusCode != http.StatusOK { - c.JSON(statusCode, gin.H{"message": errorMessage}) - return - } - - object := Object{ - Type: "object", - Id: objectId, - Name: resp.ObjectView.Details[0].Details.Fields["name"].GetStringValue(), - Icon: resp.ObjectView.Details[0].Details.Fields["iconEmoji"].GetStringValue(), - ObjectType: objectTypeName, - RootId: resp.ObjectView.RootId, - Blocks: a.getBlocks(resp), - Details: a.getDetails(resp), - } - - c.JSON(http.StatusOK, gin.H{"object": object}) -} - -// createObjectHandler creates a new object in a specific space -// -// @Summary Create a new object in a specific space -// @Tags space_objects -// @Accept json -// @Produce json -// @Param space_id path string true "The ID of the space" -// @Param object body map[string]string true "Object details (e.g., name)" -// @Success 200 {object} Object "The created object" -// @Failure 403 {object} UnauthorizedError "Unauthorized" -// @Failure 502 {object} ServerError "Internal server error" -// @Router /spaces/{space_id}/objects [post] -func (a *ApiServer) createObjectHandler(c *gin.Context) { - spaceId := c.Param("space_id") - - request := CreateObjectRequest{} - if err := c.BindJSON(&request); err != nil { - c.JSON(http.StatusBadRequest, gin.H{"message": "Invalid JSON"}) - return - } - - resp := a.mw.ObjectCreate(c.Request.Context(), &pb.RpcObjectCreateRequest{ - Details: &types.Struct{ - Fields: map[string]*types.Value{ - "name": {Kind: &types.Value_StringValue{StringValue: request.Name}}, - "iconEmoji": {Kind: &types.Value_StringValue{StringValue: request.Icon}}, - }, - }, - TemplateId: request.TemplateId, - SpaceId: spaceId, - ObjectTypeUniqueKey: request.ObjectTypeUniqueKey, - WithChat: request.WithChat, - }) - - if resp.Error.Code != pb.RpcObjectCreateResponseError_NULL { - c.JSON(http.StatusInternalServerError, gin.H{"message": "Failed to create a new object."}) - return - } - - object := Object{ - Type: "object", - Id: resp.ObjectId, - Name: resp.Details.Fields["name"].GetStringValue(), - Icon: resp.Details.Fields["iconEmoji"].GetStringValue(), - ObjectType: request.ObjectTypeUniqueKey, - SpaceId: resp.Details.Fields["spaceId"].GetStringValue(), - // TODO populate other fields - // RootId: resp.RootId, - // Blocks: []Block{}, - // Details: []Detail{}, - } - - c.JSON(http.StatusOK, gin.H{"object": object}) -} - -// updateObjectHandler updates an existing object in a specific space -// -// @Summary Update an existing object in a specific space -// @Tags space_objects -// @Accept json -// @Produce json -// @Param space_id path string true "The ID of the space" -// @Param object_id path string true "The ID of the object" -// @Param object body Object true "The updated object details" -// @Success 200 {object} Object "The updated object" -// @Failure 403 {object} UnauthorizedError "Unauthorized" -// @Failure 404 {object} NotFoundError "Resource not found" -// @Failure 502 {object} ServerError "Internal server error" -// @Router /spaces/{space_id}/objects/{object_id} [put] -func (a *ApiServer) updateObjectHandler(c *gin.Context) { - spaceId := c.Param("space_id") - objectId := c.Param("object_id") - // TODO: Implement logic to update an existing object - c.JSON(http.StatusNotImplemented, gin.H{"message": "Not implemented yet", "space_id": spaceId, "object_id": objectId}) -} - -// getObjectTypesHandler retrieves object types in a specific space -// -// @Summary Retrieve object types in a specific space -// @Tags types_and_templates -// @Accept json -// @Produce json -// @Param space_id path string true "The ID of the space" -// @Param offset query int false "The number of items to skip before starting to collect the result set" -// @Param limit query int false "The number of items to return" default(100) -// @Success 200 {object} map[string]ObjectType "List of object types" -// @Failure 403 {object} UnauthorizedError "Unauthorized" -// @Failure 404 {object} NotFoundError "Resource not found" -// @Failure 502 {object} ServerError "Internal server error" -// @Router /spaces/{space_id}/objectTypes [get] -func (a *ApiServer) getObjectTypesHandler(c *gin.Context) { - spaceId := c.Param("space_id") - offset := c.GetInt("offset") - limit := c.GetInt("limit") - - resp := a.mw.ObjectSearch(c.Request.Context(), &pb.RpcObjectSearchRequest{ - SpaceId: spaceId, - Filters: []*model.BlockContentDataviewFilter{ - { - RelationKey: bundle.RelationKeyLayout.String(), - Condition: model.BlockContentDataviewFilter_Equal, - Value: pbtypes.Int64(int64(model.ObjectType_objectType)), - }, - { - RelationKey: bundle.RelationKeyIsHidden.String(), - Condition: model.BlockContentDataviewFilter_NotEqual, - Value: pbtypes.Bool(true), - }, - }, - Sorts: []*model.BlockContentDataviewSort{ - { - RelationKey: "name", - Type: model.BlockContentDataviewSort_Asc, - }, - }, - Keys: []string{"id", "uniqueKey", "name", "iconEmoji"}, - }) - - if resp.Error.Code != pb.RpcObjectSearchResponseError_NULL { - c.JSON(http.StatusInternalServerError, gin.H{"message": "Failed to retrieve object types."}) - return - } - - if len(resp.Records) == 0 { - c.JSON(http.StatusNotFound, gin.H{"message": "No object types found."}) - return - } - - paginatedTypes, hasMore := pagination.Paginate(resp.Records, offset, limit) - objectTypes := make([]ObjectType, 0, len(paginatedTypes)) - - for _, record := range paginatedTypes { - objectTypes = append(objectTypes, ObjectType{ - Type: "object_type", - Id: record.Fields["id"].GetStringValue(), - UniqueKey: record.Fields["uniqueKey"].GetStringValue(), - Name: record.Fields["name"].GetStringValue(), - Icon: record.Fields["iconEmoji"].GetStringValue(), - }) - } - - pagination.RespondWithPagination(c, http.StatusOK, objectTypes, len(resp.Records), offset, limit, hasMore) -} - -// getObjectTypeTemplatesHandler retrieves a list of templates for a specific object type in a space -// -// @Summary Retrieve a list of templates for a specific object type in a space -// @Tags types_and_templates -// @Accept json -// @Produce json -// @Param space_id path string true "The ID of the space" -// @Param typeId path string true "The ID of the object type" -// @Param offset query int false "The number of items to skip before starting to collect the result set" -// @Param limit query int false "The number of items to return" default(100) -// @Success 200 {object} map[string][]ObjectTemplate "List of templates" -// @Failure 403 {object} UnauthorizedError "Unauthorized" -// @Failure 404 {object} NotFoundError "Resource not found" -// @Failure 502 {object} ServerError "Internal server error" -// @Router /spaces/{space_id}/objectTypes/{typeId}/templates [get] -func (a *ApiServer) getObjectTypeTemplatesHandler(c *gin.Context) { - spaceId := c.Param("space_id") - typeId := c.Param("typeId") - offset := c.GetInt("offset") - limit := c.GetInt("limit") - - // First, determine the type ID of "ot-template" in the space - templateTypeIdResp := a.mw.ObjectSearch(c.Request.Context(), &pb.RpcObjectSearchRequest{ - SpaceId: spaceId, - Filters: []*model.BlockContentDataviewFilter{ - { - RelationKey: bundle.RelationKeyUniqueKey.String(), - Condition: model.BlockContentDataviewFilter_Equal, - Value: pbtypes.String("ot-template"), - }, - }, - Keys: []string{"id"}, - }) - - if templateTypeIdResp.Error.Code != pb.RpcObjectSearchResponseError_NULL { - c.JSON(http.StatusInternalServerError, gin.H{"message": "Failed to retrieve template type."}) - return - } - - if len(templateTypeIdResp.Records) == 0 { - c.JSON(http.StatusNotFound, gin.H{"message": "Template type not found."}) - return - } - - templateTypeId := templateTypeIdResp.Records[0].Fields["id"].GetStringValue() - - // Then, search all objects of the template type and filter by the target object type - templateObjectsResp := a.mw.ObjectSearch(c.Request.Context(), &pb.RpcObjectSearchRequest{ - SpaceId: spaceId, - Filters: []*model.BlockContentDataviewFilter{ - { - RelationKey: bundle.RelationKeyType.String(), - Condition: model.BlockContentDataviewFilter_Equal, - Value: pbtypes.String(templateTypeId), - }, - }, - Keys: []string{"id", "targetObjectType", "name", "iconEmoji"}, - }) - - if templateObjectsResp.Error.Code != pb.RpcObjectSearchResponseError_NULL { - c.JSON(http.StatusInternalServerError, gin.H{"message": "Failed to retrieve template objects."}) - return - } - - if len(templateObjectsResp.Records) == 0 { - c.JSON(http.StatusNotFound, gin.H{"message": "No templates found."}) - return - } - - templateIds := make([]string, 0) - for _, record := range templateObjectsResp.Records { - if record.Fields["targetObjectType"].GetStringValue() == typeId { - templateIds = append(templateIds, record.Fields["id"].GetStringValue()) - } - } - - // Finally, open each template and populate the response - paginatedTemplates, hasMore := pagination.Paginate(templateIds, offset, limit) - templates := make([]ObjectTemplate, 0, len(paginatedTemplates)) - - for _, templateId := range paginatedTemplates { - templateResp := a.mw.ObjectShow(c.Request.Context(), &pb.RpcObjectShowRequest{ - SpaceId: spaceId, - ObjectId: templateId, - }) - - if templateResp.Error.Code != pb.RpcObjectShowResponseError_NULL { - c.JSON(http.StatusInternalServerError, gin.H{"message": "Failed to retrieve template."}) - return - } - - templates = append(templates, ObjectTemplate{ - Type: "object_template", - Id: templateId, - Name: templateResp.ObjectView.Details[0].Details.Fields["name"].GetStringValue(), - Icon: templateResp.ObjectView.Details[0].Details.Fields["iconEmoji"].GetStringValue(), - }) - } - - pagination.RespondWithPagination(c, http.StatusOK, templates, len(templateIds), offset, limit, hasMore) -} - -// searchHandler searches and retrieves objects across all the spaces -// -// @Summary Search and retrieve objects across all the spaces -// @Tags search -// @Accept json -// @Produce json -// @Param query query string false "The search term to filter objects by name" -// @Param object_type query string false "Specify object type for search" -// @Param offset query int false "The number of items to skip before starting to collect the result set" -// @Param limit query int false "The number of items to return" default(100) -// @Success 200 {object} map[string][]Object "List of objects" -// @Failure 403 {object} UnauthorizedError "Unauthorized" -// @Failure 502 {object} ServerError "Internal server error" -// @Router /search [get] -func (a *ApiServer) searchHandler(c *gin.Context) { - searchQuery := c.Query("query") - objectType := c.Query("object_type") - offset := c.GetInt("offset") - limit := c.GetInt("limit") - - // First, call ObjectSearch for all objects of type spaceView - spaceResp := a.mw.ObjectSearch(c.Request.Context(), &pb.RpcObjectSearchRequest{ - SpaceId: a.accountInfo.TechSpaceId, - Filters: []*model.BlockContentDataviewFilter{ - { - RelationKey: bundle.RelationKeyLayout.String(), - Condition: model.BlockContentDataviewFilter_Equal, - Value: pbtypes.Int64(int64(model.ObjectType_spaceView)), - }, - { - RelationKey: bundle.RelationKeySpaceLocalStatus.String(), - Condition: model.BlockContentDataviewFilter_Equal, - Value: pbtypes.Int64(int64(model.SpaceStatus_Ok)), - }, - { - RelationKey: bundle.RelationKeySpaceRemoteStatus.String(), - Condition: model.BlockContentDataviewFilter_Equal, - Value: pbtypes.Int64(int64(model.SpaceStatus_Ok)), - }, - }, - Keys: []string{"targetSpaceId"}, - }) - - if spaceResp.Error.Code != pb.RpcObjectSearchResponseError_NULL { - c.JSON(http.StatusInternalServerError, gin.H{"message": "Failed to retrieve list of spaces."}) - return - } - - if len(spaceResp.Records) == 0 { - c.JSON(http.StatusNotFound, gin.H{"message": "No spaces found."}) - return - } - - // Then, get objects from each space that match the search parameters - var filters = []*model.BlockContentDataviewFilter{ - { - RelationKey: bundle.RelationKeyLayout.String(), - Condition: model.BlockContentDataviewFilter_In, - Value: pbtypes.IntList([]int{ - int(model.ObjectType_basic), - int(model.ObjectType_profile), - int(model.ObjectType_todo), - int(model.ObjectType_note), - int(model.ObjectType_bookmark), - int(model.ObjectType_set), - int(model.ObjectType_collection), - int(model.ObjectType_participant), - }...), - }, - { - RelationKey: bundle.RelationKeyIsHidden.String(), - Condition: model.BlockContentDataviewFilter_NotEqual, - Value: pbtypes.Bool(true), - }, - } - - if searchQuery != "" { - // TODO also include snippet for notes - filters = append(filters, &model.BlockContentDataviewFilter{ - RelationKey: bundle.RelationKeyName.String(), - Condition: model.BlockContentDataviewFilter_Like, - Value: pbtypes.String(searchQuery), - }) - } - - if objectType != "" { - filters = append(filters, &model.BlockContentDataviewFilter{ - RelationKey: bundle.RelationKeyType.String(), - Condition: model.BlockContentDataviewFilter_Equal, - Value: pbtypes.String(objectType), - }) - } - - searchResults := make([]Object, 0) - for _, spaceRecord := range spaceResp.Records { - spaceId := spaceRecord.Fields["targetSpaceId"].GetStringValue() - objectResp := a.mw.ObjectSearch(c.Request.Context(), &pb.RpcObjectSearchRequest{ - SpaceId: spaceId, - Filters: filters, - Sorts: []*model.BlockContentDataviewSort{{ - RelationKey: bundle.RelationKeyLastModifiedDate.String(), - Type: model.BlockContentDataviewSort_Desc, - Format: model.RelationFormat_longtext, - IncludeTime: true, - EmptyPlacement: model.BlockContentDataviewSort_NotSpecified, - }}, - Keys: []string{"id", "name", "type", "layout", "iconEmoji", "iconImage"}, - // TODO split limit between spaces - // Limit: paginationLimitPerSpace, - // FullText: searchTerm, - }) - - if objectResp.Error.Code != pb.RpcObjectSearchResponseError_NULL { - c.JSON(http.StatusInternalServerError, gin.H{"message": "Failed to retrieve list of objects."}) - return - } - - if len(objectResp.Records) == 0 { - continue - } - - for _, record := range objectResp.Records { - icon := utils.GetIconFromEmojiOrImage(a.accountInfo, record.Fields["iconEmoji"].GetStringValue(), record.Fields["iconImage"].GetStringValue()) - objectTypeName, statusCode, errorMessage := a.resolveTypeToName(spaceId, record.Fields["type"].GetStringValue()) - if statusCode != http.StatusOK { - c.JSON(statusCode, gin.H{"message": errorMessage}) - return - } - - objectShowResp := a.mw.ObjectShow(c.Request.Context(), &pb.RpcObjectShowRequest{ - SpaceId: spaceId, - ObjectId: record.Fields["id"].GetStringValue(), - }) - - searchResults = append(searchResults, Object{ - Type: model.ObjectTypeLayout_name[int32(record.Fields["layout"].GetNumberValue())], - Id: record.Fields["id"].GetStringValue(), - Name: record.Fields["name"].GetStringValue(), - Icon: icon, - ObjectType: objectTypeName, - SpaceId: spaceId, - RootId: objectShowResp.ObjectView.RootId, - Blocks: a.getBlocks(objectShowResp), - Details: a.getDetails(objectShowResp), - }) - } - } - - // sort after lastModifiedDate to achieve descending sort order across all spaces - sort.Slice(searchResults, func(i, j int) bool { - return searchResults[i].Details[0].Details["lastModifiedDate"].(float64) > searchResults[j].Details[0].Details["lastModifiedDate"].(float64) - }) - - // TODO: solve global pagination vs per space pagination - paginatedResults, hasMore := pagination.Paginate(searchResults, offset, limit) - - pagination.RespondWithPagination(c, http.StatusOK, paginatedResults, len(searchResults), offset, limit, hasMore) -} diff --git a/cmd/api/main.go b/cmd/api/main.go index b443cc27c..2d2506304 100644 --- a/cmd/api/main.go +++ b/cmd/api/main.go @@ -12,7 +12,10 @@ import ( "github.com/webstradev/gin-pagination/v2/pkg/pagination" + "github.com/anyproto/anytype-heart/cmd/api/auth" _ "github.com/anyproto/anytype-heart/cmd/api/docs" + "github.com/anyproto/anytype-heart/cmd/api/object" + "github.com/anyproto/anytype-heart/cmd/api/search" "github.com/anyproto/anytype-heart/cmd/api/space" "github.com/anyproto/anytype-heart/core" "github.com/anyproto/anytype-heart/pb/service" @@ -30,8 +33,11 @@ type ApiServer struct { router *gin.Engine server *http.Server - accountInfo *model.AccountInfo - spaceService *space.SpaceService + accountInfo *model.AccountInfo + authService *auth.AuthService + objectService *object.ObjectService + spaceService *space.SpaceService + searchService *search.SearchService } // TODO: User represents an authenticated user with permissions @@ -42,10 +48,13 @@ type User struct { func newApiServer(mw service.ClientCommandsServer, mwInternal core.MiddlewareInternal) *ApiServer { a := &ApiServer{ - mw: mw, - mwInternal: mwInternal, - router: gin.Default(), - spaceService: space.NewService(mw), + mw: mw, + mwInternal: mwInternal, + router: gin.Default(), + authService: auth.NewService(mw), + objectService: object.NewService(mw), + spaceService: space.NewService(mw), + searchService: search.NewService(mw), } a.server = &http.Server{ @@ -91,10 +100,10 @@ func RunApiServer(ctx context.Context, mw service.ClientCommandsServer, mwIntern a.router.GET("/swagger/*any", ginSwagger.WrapHandler(swaggerFiles.Handler)) // Unprotected routes - auth := a.router.Group("/v1/auth") + authRouter := a.router.Group("/v1/auth") { - auth.POST("/displayCode", a.authDisplayCodeHandler) - auth.GET("/token", a.authTokenHandler) + authRouter.POST("/displayCode", auth.AuthDisplayCodeHandler(a.authService)) + authRouter.GET("/token", auth.AuthTokenHandler(a.authService)) } // Read-only routes @@ -104,11 +113,11 @@ func RunApiServer(ctx context.Context, mw service.ClientCommandsServer, mwIntern { readOnly.GET("/spaces", paginator, space.GetSpacesHandler(a.spaceService)) readOnly.GET("/spaces/:space_id/members", paginator, space.GetMembersHandler(a.spaceService)) - readOnly.GET("/spaces/:space_id/objects", paginator, a.getObjectsHandler) - readOnly.GET("/spaces/:space_id/objects/:object_id", a.getObjectHandler) - readOnly.GET("/spaces/:space_id/objectTypes", paginator, a.getObjectTypesHandler) - readOnly.GET("/spaces/:space_id/objectTypes/:typeId/templates", paginator, a.getObjectTypeTemplatesHandler) - readOnly.GET("/search", paginator, a.searchHandler) + readOnly.GET("/spaces/:space_id/objects", paginator, object.GetObjectsHandler(a.objectService)) + readOnly.GET("/spaces/:space_id/objects/:object_id", object.GetObjectHandler(a.objectService)) + readOnly.GET("/spaces/:space_id/objectTypes", paginator, object.GetObjectTypesHandler(a.objectService)) + readOnly.GET("/spaces/:space_id/objectTypes/:typeId/templates", paginator, object.GetObjectTypeTemplatesHandler(a.objectService)) + readOnly.GET("/search", paginator, search.SearchHandler(a.searchService)) } // Read-write routes @@ -117,8 +126,8 @@ func RunApiServer(ctx context.Context, mw service.ClientCommandsServer, mwIntern // readWrite.Use(a.PermissionMiddleware("read-write")) { // readWrite.POST("/spaces", a.createSpaceHandler) - readWrite.POST("/spaces/:space_id/objects", a.createObjectHandler) - readWrite.PUT("/spaces/:space_id/objects/:object_id", a.updateObjectHandler) + readWrite.POST("/spaces/:space_id/objects", object.CreateObjectHandler(a.objectService)) + readWrite.PUT("/spaces/:space_id/objects/:object_id", object.UpdateObjectHandler(a.objectService)) } // Start the HTTP server diff --git a/cmd/api/middleware.go b/cmd/api/middleware.go index 882d659a4..b1b9caec3 100644 --- a/cmd/api/middleware.go +++ b/cmd/api/middleware.go @@ -27,7 +27,9 @@ func (a *ApiServer) initAccountInfo() gin.HandlerFunc { } a.accountInfo = accInfo + a.objectService.AccountInfo = accInfo a.spaceService.AccountInfo = accInfo + a.searchService.AccountInfo = accInfo c.Next() } } diff --git a/cmd/api/object/handler.go b/cmd/api/object/handler.go new file mode 100644 index 000000000..b7be68fe9 --- /dev/null +++ b/cmd/api/object/handler.go @@ -0,0 +1,424 @@ +package object + +import ( + "net/http" + + "github.com/gin-gonic/gin" + "github.com/gogo/protobuf/types" + + "github.com/anyproto/anytype-heart/cmd/api/pagination" + "github.com/anyproto/anytype-heart/cmd/api/util" + "github.com/anyproto/anytype-heart/pb" + "github.com/anyproto/anytype-heart/pkg/lib/bundle" + "github.com/anyproto/anytype-heart/pkg/lib/pb/model" + "github.com/anyproto/anytype-heart/util/pbtypes" +) + +type CreateObjectRequest struct { + Name string `json:"name"` + Icon string `json:"icon"` + TemplateId string `json:"template_id"` + ObjectTypeUniqueKey string `json:"object_type_unique_key"` + WithChat bool `json:"with_chat"` +} + +// GetObjectsHandler retrieves objects in a specific space +// +// @Summary Retrieve objects in a specific space +// @Tags space_objects +// @Accept json +// @Produce json +// @Param space_id path string true "The ID of the space" +// @Param offset query int false "The number of items to skip before starting to collect the result set" +// @Param limit query int false "The number of items to return" default(100) +// @Success 200 {object} map[string][]Object "List of objects" +// @Failure 403 {object} util.UnauthorizedError "Unauthorized" +// @Failure 404 {object} util.NotFoundError "Resource not found" +// @Failure 502 {object} util.ServerError "Internal server error" +// @Router /spaces/{space_id}/objects [get] +func GetObjectsHandler(s *ObjectService) gin.HandlerFunc { + return func(c *gin.Context) { + spaceId := c.Param("space_id") + offset := c.GetInt("offset") + limit := c.GetInt("limit") + + resp := s.mw.ObjectSearch(c.Request.Context(), &pb.RpcObjectSearchRequest{ + SpaceId: spaceId, + Filters: []*model.BlockContentDataviewFilter{ + { + RelationKey: bundle.RelationKeyLayout.String(), + Condition: model.BlockContentDataviewFilter_In, + Value: pbtypes.IntList([]int{ + int(model.ObjectType_basic), + int(model.ObjectType_profile), + int(model.ObjectType_todo), + int(model.ObjectType_note), + int(model.ObjectType_bookmark), + int(model.ObjectType_set), + int(model.ObjectType_collection), + int(model.ObjectType_participant), + }...), + }, + }, + Sorts: []*model.BlockContentDataviewSort{{ + RelationKey: bundle.RelationKeyLastModifiedDate.String(), + Type: model.BlockContentDataviewSort_Desc, + Format: model.RelationFormat_longtext, + IncludeTime: true, + EmptyPlacement: model.BlockContentDataviewSort_NotSpecified, + }}, + Keys: []string{"id", "name", "type", "layout", "iconEmoji", "iconImage"}, + }) + + if resp.Error.Code != pb.RpcObjectSearchResponseError_NULL { + c.JSON(http.StatusInternalServerError, gin.H{"message": "Failed to retrieve list of objects."}) + return + } + + if len(resp.Records) == 0 { + c.JSON(http.StatusNotFound, gin.H{"message": "No objects found."}) + return + } + + paginatedObjects, hasMore := pagination.Paginate(resp.Records, offset, limit) + objects := make([]Object, 0, len(paginatedObjects)) + + for _, record := range paginatedObjects { + icon := util.GetIconFromEmojiOrImage(s.AccountInfo, record.Fields["iconEmoji"].GetStringValue(), record.Fields["iconImage"].GetStringValue()) + objectTypeName, err := util.ResolveTypeToName(s.mw, spaceId, record.Fields["type"].GetStringValue()) + if err != nil { + c.JSON(http.StatusInternalServerError, gin.H{"message": "Failed to resolve object type name."}) + return + } + + objectShowResp := s.mw.ObjectShow(c.Request.Context(), &pb.RpcObjectShowRequest{ + SpaceId: spaceId, + ObjectId: record.Fields["id"].GetStringValue(), + }) + + object := Object{ + // TODO fix type inconsistency + Type: model.ObjectTypeLayout_name[int32(record.Fields["layout"].GetNumberValue())], + Id: record.Fields["id"].GetStringValue(), + Name: record.Fields["name"].GetStringValue(), + Icon: icon, + ObjectType: objectTypeName, + SpaceId: spaceId, + RootId: objectShowResp.ObjectView.RootId, + Blocks: s.GetBlocks(objectShowResp), + Details: s.GetDetails(objectShowResp), + } + + objects = append(objects, object) + } + + pagination.RespondWithPagination(c, http.StatusOK, objects, len(resp.Records), offset, limit, hasMore) + } +} + +// GetObjectHandler retrieves a specific object in a space +// +// @Summary Retrieve a specific object in a space +// @Tags space_objects +// @Accept json +// @Produce json +// @Param space_id path string true "The ID of the space" +// @Param object_id path string true "The ID of the object" +// @Success 200 {object} Object "The requested object" +// @Failure 403 {object} util.UnauthorizedError "Unauthorized" +// @Failure 404 {object} util.NotFoundError "Resource not found" +// @Failure 502 {object} util.ServerError "Internal server error" +// @Router /spaces/{space_id}/objects/{object_id} [get] +func GetObjectHandler(s *ObjectService) gin.HandlerFunc { + return func(c *gin.Context) { + spaceId := c.Param("space_id") + objectId := c.Param("object_id") + + resp := s.mw.ObjectShow(c.Request.Context(), &pb.RpcObjectShowRequest{ + SpaceId: spaceId, + ObjectId: objectId, + }) + + if resp.Error.Code != pb.RpcObjectShowResponseError_NULL { + if resp.Error.Code == pb.RpcObjectShowResponseError_NOT_FOUND { + c.JSON(http.StatusNotFound, gin.H{"message": "Object not found", "space_id": spaceId, "object_id": objectId}) + return + } + c.JSON(http.StatusInternalServerError, gin.H{"message": "Failed to retrieve object."}) + return + } + + objectTypeName, err := util.ResolveTypeToName(s.mw, spaceId, resp.ObjectView.Details[0].Details.Fields["type"].GetStringValue()) + if err != nil { + c.JSON(http.StatusInternalServerError, gin.H{"message": "Failed to resolve object type name."}) + return + } + + object := Object{ + Type: "object", + Id: objectId, + Name: resp.ObjectView.Details[0].Details.Fields["name"].GetStringValue(), + Icon: resp.ObjectView.Details[0].Details.Fields["iconEmoji"].GetStringValue(), + ObjectType: objectTypeName, + RootId: resp.ObjectView.RootId, + Blocks: s.GetBlocks(resp), + Details: s.GetDetails(resp), + } + + c.JSON(http.StatusOK, gin.H{"object": object}) + } +} + +// CreateObjectHandler creates a new object in a specific space +// +// @Summary Create a new object in a specific space +// @Tags space_objects +// @Accept json +// @Produce json +// @Param space_id path string true "The ID of the space" +// @Param object body map[string]string true "Object details (e.g., name)" +// @Success 200 {object} Object "The created object" +// @Failure 403 {object} util.UnauthorizedError "Unauthorized" +// @Failure 502 {object} util.ServerError "Internal server error" +// @Router /spaces/{space_id}/objects [post] +func CreateObjectHandler(s *ObjectService) gin.HandlerFunc { + return func(c *gin.Context) { + spaceId := c.Param("space_id") + + request := CreateObjectRequest{} + if err := c.BindJSON(&request); err != nil { + c.JSON(http.StatusBadRequest, gin.H{"message": "Invalid JSON"}) + return + } + + resp := s.mw.ObjectCreate(c.Request.Context(), &pb.RpcObjectCreateRequest{ + Details: &types.Struct{ + Fields: map[string]*types.Value{ + "name": pbtypes.String(request.Name), + "iconEmoji": pbtypes.String(request.Icon), + }, + }, + TemplateId: request.TemplateId, + SpaceId: spaceId, + ObjectTypeUniqueKey: request.ObjectTypeUniqueKey, + WithChat: request.WithChat, + }) + + if resp.Error.Code != pb.RpcObjectCreateResponseError_NULL { + c.JSON(http.StatusInternalServerError, gin.H{"message": "Failed to create a new object."}) + return + } + + object := Object{ + Type: "object", + Id: resp.ObjectId, + Name: resp.Details.Fields["name"].GetStringValue(), + Icon: resp.Details.Fields["iconEmoji"].GetStringValue(), + ObjectType: request.ObjectTypeUniqueKey, + SpaceId: resp.Details.Fields["spaceId"].GetStringValue(), + // TODO populate other fields + // RootId: resp.RootId, + // Blocks: []Block{}, + // Details: []Detail{}, + } + + c.JSON(http.StatusOK, gin.H{"object": object}) + } +} + +// UpdateObjectHandler updates an existing object in a specific space +// +// @Summary Update an existing object in a specific space +// @Tags space_objects +// @Accept json +// @Produce json +// @Param space_id path string true "The ID of the space" +// @Param object_id path string true "The ID of the object" +// @Param object body Object true "The updated object details" +// @Success 200 {object} Object "The updated object" +// @Failure 403 {object} util.UnauthorizedError "Unauthorized" +// @Failure 404 {object} util.NotFoundError "Resource not found" +// @Failure 502 {object} util.ServerError "Internal server error" +// @Router /spaces/{space_id}/objects/{object_id} [put] +func UpdateObjectHandler(s *ObjectService) gin.HandlerFunc { + return func(c *gin.Context) { + spaceId := c.Param("space_id") + objectId := c.Param("object_id") + // TODO: Implement logic to update an existing object + c.JSON(http.StatusNotImplemented, gin.H{"message": "Not implemented yet", "space_id": spaceId, "object_id": objectId}) + } +} + +// GetObjectTypesHandler retrieves object types in a specific space +// +// @Summary Retrieve object types in a specific space +// @Tags types_and_templates +// @Accept json +// @Produce json +// @Param space_id path string true "The ID of the space" +// @Param offset query int false "The number of items to skip before starting to collect the result set" +// @Param limit query int false "The number of items to return" default(100) +// @Success 200 {object} map[string]ObjectType "List of object types" +// @Failure 403 {object} util.UnauthorizedError "Unauthorized" +// @Failure 404 {object} util.NotFoundError "Resource not found" +// @Failure 502 {object} util.ServerError "Internal server error" +// @Router /spaces/{space_id}/objectTypes [get] +func GetObjectTypesHandler(s *ObjectService) gin.HandlerFunc { + return func(c *gin.Context) { + spaceId := c.Param("space_id") + offset := c.GetInt("offset") + limit := c.GetInt("limit") + + resp := s.mw.ObjectSearch(c.Request.Context(), &pb.RpcObjectSearchRequest{ + SpaceId: spaceId, + Filters: []*model.BlockContentDataviewFilter{ + { + RelationKey: bundle.RelationKeyLayout.String(), + Condition: model.BlockContentDataviewFilter_Equal, + Value: pbtypes.Int64(int64(model.ObjectType_objectType)), + }, + { + RelationKey: bundle.RelationKeyIsHidden.String(), + Condition: model.BlockContentDataviewFilter_NotEqual, + Value: pbtypes.Bool(true), + }, + }, + Sorts: []*model.BlockContentDataviewSort{ + { + RelationKey: "name", + Type: model.BlockContentDataviewSort_Asc, + }, + }, + Keys: []string{"id", "uniqueKey", "name", "iconEmoji"}, + }) + + if resp.Error.Code != pb.RpcObjectSearchResponseError_NULL { + c.JSON(http.StatusInternalServerError, gin.H{"message": "Failed to retrieve object types."}) + return + } + + if len(resp.Records) == 0 { + c.JSON(http.StatusNotFound, gin.H{"message": "No object types found."}) + return + } + + paginatedTypes, hasMore := pagination.Paginate(resp.Records, offset, limit) + objectTypes := make([]ObjectType, 0, len(paginatedTypes)) + + for _, record := range paginatedTypes { + objectTypes = append(objectTypes, ObjectType{ + Type: "object_type", + Id: record.Fields["id"].GetStringValue(), + UniqueKey: record.Fields["uniqueKey"].GetStringValue(), + Name: record.Fields["name"].GetStringValue(), + Icon: record.Fields["iconEmoji"].GetStringValue(), + }) + } + + pagination.RespondWithPagination(c, http.StatusOK, objectTypes, len(resp.Records), offset, limit, hasMore) + } +} + +// GetObjectTypeTemplatesHandler retrieves a list of templates for a specific object type in a space +// +// @Summary Retrieve a list of templates for a specific object type in a space +// @Tags types_and_templates +// @Accept json +// @Produce json +// @Param space_id path string true "The ID of the space" +// @Param typeId path string true "The ID of the object type" +// @Param offset query int false "The number of items to skip before starting to collect the result set" +// @Param limit query int false "The number of items to return" default(100) +// @Success 200 {object} map[string][]ObjectTemplate "List of templates" +// @Failure 403 {object} util.UnauthorizedError "Unauthorized" +// @Failure 404 {object} util.NotFoundError "Resource not found" +// @Failure 502 {object} util.ServerError "Internal server error" +// @Router /spaces/{space_id}/objectTypes/{typeId}/templates [get] +func GetObjectTypeTemplatesHandler(s *ObjectService) gin.HandlerFunc { + return func(c *gin.Context) { + spaceId := c.Param("space_id") + typeId := c.Param("typeId") + offset := c.GetInt("offset") + limit := c.GetInt("limit") + + // First, determine the type ID of "ot-template" in the space + templateTypeIdResp := s.mw.ObjectSearch(c.Request.Context(), &pb.RpcObjectSearchRequest{ + SpaceId: spaceId, + Filters: []*model.BlockContentDataviewFilter{ + { + RelationKey: bundle.RelationKeyUniqueKey.String(), + Condition: model.BlockContentDataviewFilter_Equal, + Value: pbtypes.String("ot-template"), + }, + }, + Keys: []string{"id"}, + }) + + if templateTypeIdResp.Error.Code != pb.RpcObjectSearchResponseError_NULL { + c.JSON(http.StatusInternalServerError, gin.H{"message": "Failed to retrieve template type."}) + return + } + + if len(templateTypeIdResp.Records) == 0 { + c.JSON(http.StatusNotFound, gin.H{"message": "Template type not found."}) + return + } + + templateTypeId := templateTypeIdResp.Records[0].Fields["id"].GetStringValue() + + // Then, search all objects of the template type and filter by the target object type + templateObjectsResp := s.mw.ObjectSearch(c.Request.Context(), &pb.RpcObjectSearchRequest{ + SpaceId: spaceId, + Filters: []*model.BlockContentDataviewFilter{ + { + RelationKey: bundle.RelationKeyType.String(), + Condition: model.BlockContentDataviewFilter_Equal, + Value: pbtypes.String(templateTypeId), + }, + }, + Keys: []string{"id", "targetObjectType", "name", "iconEmoji"}, + }) + + if templateObjectsResp.Error.Code != pb.RpcObjectSearchResponseError_NULL { + c.JSON(http.StatusInternalServerError, gin.H{"message": "Failed to retrieve template objects."}) + return + } + + if len(templateObjectsResp.Records) == 0 { + c.JSON(http.StatusNotFound, gin.H{"message": "No templates found."}) + return + } + + templateIds := make([]string, 0) + for _, record := range templateObjectsResp.Records { + if record.Fields["targetObjectType"].GetStringValue() == typeId { + templateIds = append(templateIds, record.Fields["id"].GetStringValue()) + } + } + + // Finally, open each template and populate the response + paginatedTemplates, hasMore := pagination.Paginate(templateIds, offset, limit) + templates := make([]ObjectTemplate, 0, len(paginatedTemplates)) + + for _, templateId := range paginatedTemplates { + templateResp := s.mw.ObjectShow(c.Request.Context(), &pb.RpcObjectShowRequest{ + SpaceId: spaceId, + ObjectId: templateId, + }) + + if templateResp.Error.Code != pb.RpcObjectShowResponseError_NULL { + c.JSON(http.StatusInternalServerError, gin.H{"message": "Failed to retrieve template."}) + return + } + + templates = append(templates, ObjectTemplate{ + Type: "object_template", + Id: templateId, + Name: templateResp.ObjectView.Details[0].Details.Fields["name"].GetStringValue(), + Icon: templateResp.ObjectView.Details[0].Details.Fields["iconEmoji"].GetStringValue(), + }) + } + + pagination.RespondWithPagination(c, http.StatusOK, templates, len(templateIds), offset, limit, hasMore) + } +} diff --git a/cmd/api/schemas.go b/cmd/api/object/model.go similarity index 78% rename from cmd/api/schemas.go rename to cmd/api/object/model.go index 5ec8247f4..a77d6b94f 100644 --- a/cmd/api/schemas.go +++ b/cmd/api/object/model.go @@ -1,13 +1,4 @@ -package api - -type AuthDisplayCodeResponse struct { - ChallengeId string `json:"challenge_id" example:"67647f5ecda913e9a2e11b26"` -} - -type AuthTokenResponse struct { - SessionToken string `json:"session_token" example:""` - AppKey string `json:"app_key" example:""` -} +package object type Object struct { Type string `json:"type" example:"object"` @@ -76,27 +67,3 @@ type ObjectTemplate struct { Name string `json:"name" example:"Object Template Name"` Icon string `json:"icon" example:"📄"` } - -type ServerError struct { - Error struct { - Message string `json:"message"` - } `json:"error"` -} - -type ValidationError struct { - Error struct { - Message string `json:"message"` - } `json:"error"` -} - -type UnauthorizedError struct { - Error struct { - Message string `json:"message"` - } `json:"error"` -} - -type NotFoundError struct { - Error struct { - Message string `json:"message"` - } `json:"error"` -} diff --git a/cmd/api/helper.go b/cmd/api/object/service.go similarity index 61% rename from cmd/api/helper.go rename to cmd/api/object/service.go index 1c4db84d8..34be383f1 100644 --- a/cmd/api/helper.go +++ b/cmd/api/object/service.go @@ -1,50 +1,119 @@ -package api +package object import ( - "context" - "net/http" - "strings" + "errors" - "github.com/anyproto/anytype-heart/cmd/api/utils" + "github.com/anyproto/anytype-heart/cmd/api/util" "github.com/anyproto/anytype-heart/pb" - "github.com/anyproto/anytype-heart/pkg/lib/bundle" + "github.com/anyproto/anytype-heart/pb/service" "github.com/anyproto/anytype-heart/pkg/lib/pb/model" - "github.com/anyproto/anytype-heart/util/pbtypes" ) -// resolveTypeToName resolves the type ID to the name of the type, e.g. "ot-page" to "Page" or "bafyreigyb6l5szohs32ts26ku2j42yd65e6hqy2u3gtzgdwqv6hzftsetu" to "Custom Type" -func (a *ApiServer) resolveTypeToName(spaceId string, typeId string) (typeName string, statusCode int, errorMessage string) { - // Can't look up preinstalled types based on relation key, therefore need to use unique key - relKey := bundle.RelationKeyId.String() - if strings.Contains(typeId, "ot-") { - relKey = bundle.RelationKeyUniqueKey.String() - } +var ( + ErrFailedGenerateChallenge = errors.New("failed to generate a new challenge") + ErrInvalidInput = errors.New("invalid input") + ErrorFailedAuthenticate = errors.New("failed to authenticate user") +) - // Call ObjectSearch for object of specified type and return the name - resp := a.mw.ObjectSearch(context.Background(), &pb.RpcObjectSearchRequest{ - SpaceId: spaceId, - Filters: []*model.BlockContentDataviewFilter{ - { - RelationKey: relKey, - Condition: model.BlockContentDataviewFilter_Equal, - Value: pbtypes.String(typeId), - }, - }, - }) - - if resp.Error.Code != pb.RpcObjectSearchResponseError_NULL { - return "", http.StatusInternalServerError, "Failed to search for type." - } - - if len(resp.Records) == 0 { - return "", http.StatusNotFound, "Type not found." - } - - return resp.Records[0].Fields["name"].GetStringValue(), http.StatusOK, "" +type Service interface { + ListObjects() ([]Object, error) + GetObject(id string) (Object, error) + CreateObject(obj Object) (Object, error) + UpdateObject(obj Object) (Object, error) + ListTypes() ([]ObjectType, error) + ListTemplates() ([]ObjectTemplate, error) } -// getBlocks returns the blocks of the object -func (a *ApiServer) getBlocks(resp *pb.RpcObjectShowResponse) []Block { +type ObjectService struct { + mw service.ClientCommandsServer + AccountInfo *model.AccountInfo +} + +func NewService(mw service.ClientCommandsServer) *ObjectService { + return &ObjectService{mw: mw} +} + +func (s *ObjectService) ListObjects() ([]Object, error) { + // TODO + return nil, nil +} + +func (s *ObjectService) GetObject(id string) (Object, error) { + // TODO + return Object{}, nil +} + +func (s *ObjectService) CreateObject(obj Object) (Object, error) { + // TODO + return Object{}, nil +} + +func (s *ObjectService) UpdateObject(obj Object) (Object, error) { + // TODO + return Object{}, nil +} + +func (s *ObjectService) ListTypes() ([]ObjectType, error) { + // TODO + return nil, nil +} + +func (s *ObjectService) ListTemplates() ([]ObjectTemplate, error) { + // TODO + return nil, nil +} + +// GetDetails returns the details of the object +func (s *ObjectService) GetDetails(resp *pb.RpcObjectShowResponse) []Detail { + return []Detail{ + { + Id: "lastModifiedDate", + Details: map[string]interface{}{ + "lastModifiedDate": resp.ObjectView.Details[0].Details.Fields["lastModifiedDate"].GetNumberValue(), + }, + }, + { + Id: "createdDate", + Details: map[string]interface{}{ + "createdDate": resp.ObjectView.Details[0].Details.Fields["createdDate"].GetNumberValue(), + }, + }, + { + Id: "tags", + Details: map[string]interface{}{ + "tags": s.getTags(resp), + }, + }, + } +} + +// getTags returns the list of tags from the object details +func (s *ObjectService) getTags(resp *pb.RpcObjectShowResponse) []Tag { + tags := []Tag{} + + tagField, ok := resp.ObjectView.Details[0].Details.Fields["tag"] + if !ok { + return tags + } + + for _, tagId := range tagField.GetListValue().Values { + id := tagId.GetStringValue() + for _, detail := range resp.ObjectView.Details { + if detail.Id == id { + tags = append(tags, Tag{ + Id: id, + Name: detail.Details.Fields["name"].GetStringValue(), + Color: detail.Details.Fields["relationOptionColor"].GetStringValue(), + }) + break + } + } + } + return tags +} + +// GetBlocks returns the blocks of the object +func (s *ObjectService) GetBlocks(resp *pb.RpcObjectShowResponse) []Block { blocks := []Block{} for _, block := range resp.ObjectView.Blocks { @@ -58,7 +127,7 @@ func (a *ApiServer) getBlocks(resp *pb.RpcObjectShowResponse) []Block { Style: model.BlockContentTextStyle_name[int32(content.Text.Style)], Checked: content.Text.Checked, Color: content.Text.Color, - Icon: utils.GetIconFromEmojiOrImage(a.accountInfo, content.Text.IconEmoji, content.Text.IconImage), + Icon: util.GetIconFromEmojiOrImage(s.AccountInfo, content.Text.IconEmoji, content.Text.IconImage), } case *model.BlockContentOfFile: file = &File{ @@ -116,52 +185,3 @@ func mapVerticalAlign(align model.BlockVerticalAlign) string { return "unknown" } } - -// getDetails returns the details of the object -func (a *ApiServer) getDetails(resp *pb.RpcObjectShowResponse) []Detail { - return []Detail{ - { - Id: "lastModifiedDate", - Details: map[string]interface{}{ - "lastModifiedDate": resp.ObjectView.Details[0].Details.Fields["lastModifiedDate"].GetNumberValue(), - }, - }, - { - Id: "createdDate", - Details: map[string]interface{}{ - "createdDate": resp.ObjectView.Details[0].Details.Fields["createdDate"].GetNumberValue(), - }, - }, - { - Id: "tags", - Details: map[string]interface{}{ - "tags": a.getTags(resp), - }, - }, - } -} - -// getTags returns the list of tags from the object details -func (a *ApiServer) getTags(resp *pb.RpcObjectShowResponse) []Tag { - tags := []Tag{} - - tagField, ok := resp.ObjectView.Details[0].Details.Fields["tag"] - if !ok { - return tags - } - - for _, tagId := range tagField.GetListValue().Values { - id := tagId.GetStringValue() - for _, detail := range resp.ObjectView.Details { - if detail.Id == id { - tags = append(tags, Tag{ - Id: id, - Name: detail.Details.Fields["name"].GetStringValue(), - Color: detail.Details.Fields["relationOptionColor"].GetStringValue(), - }) - break - } - } - } - return tags -} diff --git a/cmd/api/search/handler.go b/cmd/api/search/handler.go new file mode 100644 index 000000000..c60514fdd --- /dev/null +++ b/cmd/api/search/handler.go @@ -0,0 +1,50 @@ +package search + +import ( + "net/http" + + "github.com/gin-gonic/gin" + + "github.com/anyproto/anytype-heart/cmd/api/pagination" + "github.com/anyproto/anytype-heart/cmd/api/space" + "github.com/anyproto/anytype-heart/cmd/api/util" +) + +// SearchHandler searches and retrieves objects across all the spaces +// +// @Summary Search and retrieve objects across all the spaces +// @Tags search +// @Accept json +// @Produce json +// @Param query query string false "The search term to filter objects by name" +// @Param object_type query string false "Specify object.Object type for search" +// @Param offset query int false "The number of items to skip before starting to collect the result set" +// @Param limit query int false "The number of items to return" default(100) +// @Success 200 {object} map[string][]object.Object "List of objects" +// @Failure 403 {object} util.UnauthorizedError "Unauthorized" +// @Failure 404 {object} util.NotFoundError "Resource not found" +// @Failure 502 {object} util.ServerError "Internal server error" +// @Router /search [get] +func SearchHandler(s *SearchService) gin.HandlerFunc { + return func(c *gin.Context) { + searchQuery := c.Query("query") + objectType := c.Query("object_type") + offset := c.GetInt("offset") + limit := c.GetInt("limit") + + objects, total, hasMore, err := s.Search(c, searchQuery, objectType, offset, limit) + code := util.MapErrorCode(err, + util.ErrToCode(ErrNoObjectsFound, http.StatusNotFound), + util.ErrToCode(ErrFailedSearchObjects, http.StatusInternalServerError), + util.ErrToCode(space.ErrNoSpacesFound, http.StatusNotFound), + ) + + if code != http.StatusOK { + apiErr := util.CodeToAPIError(code, err.Error()) + c.JSON(code, apiErr) + return + } + + pagination.RespondWithPagination(c, http.StatusOK, objects, total, offset, limit, hasMore) + } +} diff --git a/cmd/api/search/service.go b/cmd/api/search/service.go new file mode 100644 index 000000000..0637285c7 --- /dev/null +++ b/cmd/api/search/service.go @@ -0,0 +1,151 @@ +package search + +import ( + "context" + "errors" + "sort" + + "github.com/anyproto/anytype-heart/cmd/api/object" + "github.com/anyproto/anytype-heart/cmd/api/pagination" + "github.com/anyproto/anytype-heart/cmd/api/space" + "github.com/anyproto/anytype-heart/cmd/api/util" + "github.com/anyproto/anytype-heart/pb" + "github.com/anyproto/anytype-heart/pb/service" + "github.com/anyproto/anytype-heart/pkg/lib/bundle" + "github.com/anyproto/anytype-heart/pkg/lib/pb/model" + "github.com/anyproto/anytype-heart/util/pbtypes" +) + +var ( + ErrFailedSearchObjects = errors.New("failed to retrieve objects from space") + ErrNoObjectsFound = errors.New("no objects found") +) + +type Service interface { + Search(ctx context.Context) ([]object.Object, error) +} + +type SearchService struct { + mw service.ClientCommandsServer + spaceService *space.SpaceService + objectService *object.ObjectService + AccountInfo *model.AccountInfo +} + +func NewService(mw service.ClientCommandsServer) *SearchService { + return &SearchService{mw: mw, spaceService: space.NewService(mw), objectService: object.NewService(mw)} +} + +func (s *SearchService) Search(ctx context.Context, searchQuery string, objectType string, offset, limit int) (objects []object.Object, total int, hasMore bool, err error) { + spaces, _, _, err := s.spaceService.ListSpaces(ctx, 0, 100) + if err != nil { + return nil, 0, false, err + } + + // Then, get objects from each space that match the search parameters + var filters = []*model.BlockContentDataviewFilter{ + { + RelationKey: bundle.RelationKeyLayout.String(), + Condition: model.BlockContentDataviewFilter_In, + Value: pbtypes.IntList([]int{ + int(model.ObjectType_basic), + int(model.ObjectType_profile), + int(model.ObjectType_todo), + int(model.ObjectType_note), + int(model.ObjectType_bookmark), + int(model.ObjectType_set), + int(model.ObjectType_collection), + int(model.ObjectType_participant), + }...), + }, + { + RelationKey: bundle.RelationKeyIsHidden.String(), + Condition: model.BlockContentDataviewFilter_NotEqual, + Value: pbtypes.Bool(true), + }, + } + + if searchQuery != "" { + // TODO also include snippet for notes + filters = append(filters, &model.BlockContentDataviewFilter{ + RelationKey: bundle.RelationKeyName.String(), + Condition: model.BlockContentDataviewFilter_Like, + Value: pbtypes.String(searchQuery), + }) + } + + if objectType != "" { + filters = append(filters, &model.BlockContentDataviewFilter{ + RelationKey: bundle.RelationKeyType.String(), + Condition: model.BlockContentDataviewFilter_Equal, + Value: pbtypes.String(objectType), + }) + } + + results := make([]object.Object, 0) + for _, space := range spaces { + spaceId := space.Id + objResp := s.mw.ObjectSearch(ctx, &pb.RpcObjectSearchRequest{ + SpaceId: spaceId, + Filters: filters, + Sorts: []*model.BlockContentDataviewSort{{ + RelationKey: bundle.RelationKeyLastModifiedDate.String(), + Type: model.BlockContentDataviewSort_Desc, + Format: model.RelationFormat_longtext, + IncludeTime: true, + EmptyPlacement: model.BlockContentDataviewSort_NotSpecified, + }}, + Keys: []string{"id", "name", "type", "layout", "iconEmoji", "iconImage"}, + // TODO split limit between spaces + // Limit: paginationLimitPerSpace, + // FullText: searchTerm, + }) + + if objResp.Error.Code != pb.RpcObjectSearchResponseError_NULL { + return nil, 0, false, ErrFailedSearchObjects + } + + if len(objResp.Records) == 0 { + continue + } + + for _, record := range objResp.Records { + icon := util.GetIconFromEmojiOrImage(s.AccountInfo, record.Fields["iconEmoji"].GetStringValue(), record.Fields["iconImage"].GetStringValue()) + objectTypeName, err := util.ResolveTypeToName(s.mw, spaceId, record.Fields["type"].GetStringValue()) + if err != nil { + return nil, 0, false, err + } + + showResp := s.mw.ObjectShow(ctx, &pb.RpcObjectShowRequest{ + SpaceId: spaceId, + ObjectId: record.Fields["id"].GetStringValue(), + }) + + results = append(results, object.Object{ + Type: model.ObjectTypeLayout_name[int32(record.Fields["layout"].GetNumberValue())], + Id: record.Fields["id"].GetStringValue(), + Name: record.Fields["name"].GetStringValue(), + Icon: icon, + ObjectType: objectTypeName, + SpaceId: spaceId, + RootId: showResp.ObjectView.RootId, + Blocks: s.objectService.GetBlocks(showResp), + Details: s.objectService.GetDetails(showResp), + }) + } + } + + if len(results) == 0 { + return nil, 0, false, ErrNoObjectsFound + } + + // sort after lastModifiedDate to achieve descending sort order across all spaces + sort.Slice(results, func(i, j int) bool { + return results[i].Details[0].Details["lastModifiedDate"].(float64) > results[j].Details[0].Details["lastModifiedDate"].(float64) + }) + + // TODO: solve global pagination vs per space pagination + total = len(results) + paginatedResults, hasMore := pagination.Paginate(results, offset, limit) + return paginatedResults, total, hasMore, nil +} diff --git a/cmd/api/space/handler.go b/cmd/api/space/handler.go index dd9ebb0bb..650f3c120 100644 --- a/cmd/api/space/handler.go +++ b/cmd/api/space/handler.go @@ -1,12 +1,12 @@ package space import ( - "errors" "net/http" "github.com/gin-gonic/gin" "github.com/anyproto/anytype-heart/cmd/api/pagination" + "github.com/anyproto/anytype-heart/cmd/api/util" ) // GetSpacesHandler retrieves a list of spaces @@ -18,9 +18,9 @@ import ( // @Param offset query int false "The number of items to skip before starting to collect the result set" // @Param limit query int false "The number of items to return" default(100) // @Success 200 {object} pagination.PaginatedResponse[Space] "List of spaces" -// @Failure 403 {object} api.UnauthorizedError "Unauthorized" -// @Failure 404 {object} api.NotFoundError "Resource not found" -// @Failure 502 {object} api.ServerError "Internal server error" +// @Failure 403 {object} util.UnauthorizedError "Unauthorized" +// @Failure 404 {object} util.NotFoundError "Resource not found" +// @Failure 502 {object} util.ServerError "Internal server error" // @Router /spaces [get] func GetSpacesHandler(s *SpaceService) gin.HandlerFunc { return func(c *gin.Context) { @@ -28,20 +28,16 @@ func GetSpacesHandler(s *SpaceService) gin.HandlerFunc { limit := c.GetInt("limit") spaces, total, hasMore, err := s.ListSpaces(c.Request.Context(), offset, limit) - if err != nil { - switch { - case errors.Is(err, ErrNoSpacesFound): - c.JSON(http.StatusNotFound, gin.H{"message": "No spaces found."}) - return - case errors.Is(err, ErrFailedListSpaces): - c.JSON(http.StatusInternalServerError, gin.H{"message": "Failed to retrieve list of spaces."}) - return - case errors.Is(err, ErrFailedOpenWorkspace): - c.JSON(http.StatusInternalServerError, gin.H{"message": "Failed to open workspace."}) - default: - c.JSON(http.StatusInternalServerError, gin.H{"message": err.Error()}) - return - } + code := util.MapErrorCode(err, + util.ErrToCode(ErrNoSpacesFound, http.StatusNotFound), + util.ErrToCode(ErrFailedListSpaces, http.StatusInternalServerError), + util.ErrToCode(ErrFailedOpenWorkspace, http.StatusInternalServerError), + ) + + if code != http.StatusOK { + apiErr := util.CodeToAPIError(code, err.Error()) + c.JSON(code, apiErr) + return } pagination.RespondWithPagination(c, http.StatusOK, spaces, total, offset, limit, hasMore) @@ -56,8 +52,8 @@ func GetSpacesHandler(s *SpaceService) gin.HandlerFunc { // @Produce json // @Param name body string true "Space Name" // @Success 200 {object} CreateSpaceResponse "Space created successfully" -// @Failure 403 {object} api.UnauthorizedError "Unauthorized" -// @Failure 502 {object} api.ServerError "Internal server error" +// @Failure 403 {object} util.UnauthorizedError "Unauthorized" +// @Failure 502 {object} util.ServerError "Internal server error" // @Router /spaces [post] func CreateSpaceHandler(s *SpaceService) gin.HandlerFunc { return func(c *gin.Context) { @@ -69,15 +65,14 @@ func CreateSpaceHandler(s *SpaceService) gin.HandlerFunc { name := nameRequest.Name space, err := s.CreateSpace(c.Request.Context(), name) - if err != nil { - switch { - case errors.Is(err, ErrFailedCreateSpace): - c.JSON(http.StatusInternalServerError, gin.H{"message": "Failed to create space."}) - return - default: - c.JSON(http.StatusInternalServerError, gin.H{"message": err.Error()}) - return - } + code := util.MapErrorCode(err, + util.ErrToCode(ErrFailedCreateSpace, http.StatusInternalServerError), + ) + + if code != http.StatusOK { + apiErr := util.CodeToAPIError(code, err.Error()) + c.JSON(code, apiErr) + return } c.JSON(http.StatusOK, CreateSpaceResponse{Space: space}) @@ -94,9 +89,9 @@ func CreateSpaceHandler(s *SpaceService) gin.HandlerFunc { // @Param offset query int false "The number of items to skip before starting to collect the result set" // @Param limit query int false "The number of items to return" default(100) // @Success 200 {object} pagination.PaginatedResponse[Member] "List of members" -// @Failure 403 {object} api.UnauthorizedError "Unauthorized" -// @Failure 404 {object} api.NotFoundError "Resource not found" -// @Failure 502 {object} api.ServerError "Internal server error" +// @Failure 403 {object} util.UnauthorizedError "Unauthorized" +// @Failure 404 {object} util.NotFoundError "Resource not found" +// @Failure 502 {object} util.ServerError "Internal server error" // @Router /spaces/{space_id}/members [get] func GetMembersHandler(s *SpaceService) gin.HandlerFunc { return func(c *gin.Context) { @@ -105,18 +100,15 @@ func GetMembersHandler(s *SpaceService) gin.HandlerFunc { limit := c.GetInt("limit") members, total, hasMore, err := s.ListMembers(c.Request.Context(), spaceId, offset, limit) - if err != nil { - switch { - case errors.Is(err, ErrNoMembersFound): - c.JSON(http.StatusNotFound, gin.H{"message": "No members found."}) - return - case errors.Is(err, ErrFailedListMembers): - c.JSON(http.StatusInternalServerError, gin.H{"message": "Failed to retrieve list of members."}) - return - default: - c.JSON(http.StatusInternalServerError, gin.H{"message": err.Error()}) - return - } + code := util.MapErrorCode(err, + util.ErrToCode(ErrNoMembersFound, http.StatusNotFound), + util.ErrToCode(ErrFailedListMembers, http.StatusInternalServerError), + ) + + if code != http.StatusOK { + apiErr := util.CodeToAPIError(code, err.Error()) + c.JSON(code, apiErr) + return } pagination.RespondWithPagination(c, http.StatusOK, members, total, offset, limit, hasMore) diff --git a/cmd/api/space/service.go b/cmd/api/space/service.go index 9ba824149..9900d6f73 100644 --- a/cmd/api/space/service.go +++ b/cmd/api/space/service.go @@ -9,7 +9,7 @@ import ( "github.com/gogo/protobuf/types" "github.com/anyproto/anytype-heart/cmd/api/pagination" - "github.com/anyproto/anytype-heart/cmd/api/utils" + "github.com/anyproto/anytype-heart/cmd/api/util" "github.com/anyproto/anytype-heart/pb" "github.com/anyproto/anytype-heart/pb/service" "github.com/anyproto/anytype-heart/pkg/lib/bundle" @@ -92,7 +92,7 @@ func (s *SpaceService) ListSpaces(ctx context.Context, offset int, limit int) (s // TODO: name and icon are only returned here; fix that workspace.Name = record.Fields["name"].GetStringValue() - workspace.Icon = utils.GetIconFromEmojiOrImage(s.AccountInfo, record.Fields["iconEmoji"].GetStringValue(), record.Fields["iconImage"].GetStringValue()) + workspace.Icon = util.GetIconFromEmojiOrImage(s.AccountInfo, record.Fields["iconEmoji"].GetStringValue(), record.Fields["iconImage"].GetStringValue()) spaces = append(spaces, workspace) } @@ -163,7 +163,7 @@ func (s *SpaceService) ListMembers(ctx context.Context, spaceId string, offset i members = make([]Member, 0, len(paginatedMembers)) for _, record := range paginatedMembers { - icon := utils.GetIconFromEmojiOrImage(s.AccountInfo, record.Fields["iconEmoji"].GetStringValue(), record.Fields["iconImage"].GetStringValue()) + icon := util.GetIconFromEmojiOrImage(s.AccountInfo, record.Fields["iconEmoji"].GetStringValue(), record.Fields["iconImage"].GetStringValue()) member := Member{ Type: "space_member", diff --git a/cmd/api/util/error.go b/cmd/api/util/error.go new file mode 100644 index 000000000..543c81eb9 --- /dev/null +++ b/cmd/api/util/error.go @@ -0,0 +1,100 @@ +package util + +import ( + "errors" + "net/http" +) + +type ServerError struct { + Error struct { + Message string `json:"message"` + } `json:"error"` +} + +type ValidationError struct { + Error struct { + Message string `json:"message"` + } `json:"error"` +} + +type UnauthorizedError struct { + Error struct { + Message string `json:"message"` + } `json:"error"` +} + +type NotFoundError struct { + Error struct { + Message string `json:"message"` + } `json:"error"` +} + +type errCodeMapping struct { + target error + code int +} + +// ErrToCode just returns a mapping to pair a target error with a code +func ErrToCode(target error, code int) errCodeMapping { + return errCodeMapping{ + target: target, + code: code, + } +} + +// MapErrorCode checks if err matches any “target” in the mappings, +// returning the first matching code. If none match, returns 500. +func MapErrorCode(err error, mappings ...errCodeMapping) int { + if err == nil { + return http.StatusOK + } + for _, m := range mappings { + if errors.Is(err, m.target) { + return m.code + } + } + + return http.StatusInternalServerError +} + +// CodeToAPIError returns an instance of the correct struct +// for the given HTTP code, embedding the supplied message. +func CodeToAPIError(code int, message string) any { + switch code { + case http.StatusNotFound: + return NotFoundError{ + Error: struct { + Message string `json:"message"` + }{ + Message: message, + }, + } + + case http.StatusUnauthorized: + return UnauthorizedError{ + Error: struct { + Message string `json:"message"` + }{ + Message: message, + }, + } + + case http.StatusBadRequest: + return ValidationError{ + Error: struct { + Message string `json:"message"` + }{ + Message: message, + }, + } + + default: + return ServerError{ + Error: struct { + Message string `json:"message"` + }{ + Message: message, + }, + } + } +} diff --git a/cmd/api/util/util.go b/cmd/api/util/util.go new file mode 100644 index 000000000..2f63d8a1c --- /dev/null +++ b/cmd/api/util/util.go @@ -0,0 +1,72 @@ +package util + +import ( + "context" + "errors" + "fmt" + "strings" + + "github.com/anyproto/anytype-heart/pb" + "github.com/anyproto/anytype-heart/pb/service" + "github.com/anyproto/anytype-heart/pkg/lib/bundle" + "github.com/anyproto/anytype-heart/pkg/lib/pb/model" + "github.com/anyproto/anytype-heart/util/pbtypes" +) + +var ( + ErrFailedSearchType = errors.New("failed to search for type") + ErrorTypeNotFound = errors.New("type not found") +) + +// GetIconFromEmojiOrImage returns the icon to use for the object, which can be either an emoji or an image url +func GetIconFromEmojiOrImage(accountInfo *model.AccountInfo, iconEmoji string, iconImage string) string { + if iconEmoji != "" { + return iconEmoji + } + + if iconImage != "" { + return GetGatewayURLForMedia(accountInfo, iconImage, true) + } + + return "" +} + +// GetGatewayURLForMedia returns the URL of file gateway for the media object with the given ID +func GetGatewayURLForMedia(accountInfo *model.AccountInfo, objectId string, isIcon bool) string { + widthParam := "" + if isIcon { + widthParam = "?width=100" + } + return fmt.Sprintf("%s/image/%s%s", accountInfo.GatewayUrl, objectId, widthParam) +} + +// ResolveTypeToName resolves the type ID to the name of the type, e.g. "ot-page" to "Page" or "bafyreigyb6l5szohs32ts26ku2j42yd65e6hqy2u3gtzgdwqv6hzftsetu" to "Custom Type" +func ResolveTypeToName(mw service.ClientCommandsServer, spaceId string, typeId string) (typeName string, err error) { + // Can't look up preinstalled types based on relation key, therefore need to use unique key + relKey := bundle.RelationKeyId.String() + if strings.Contains(typeId, "ot-") { + relKey = bundle.RelationKeyUniqueKey.String() + } + + // Call ObjectSearch for object of specified type and return the name + resp := mw.ObjectSearch(context.Background(), &pb.RpcObjectSearchRequest{ + SpaceId: spaceId, + Filters: []*model.BlockContentDataviewFilter{ + { + RelationKey: relKey, + Condition: model.BlockContentDataviewFilter_Equal, + Value: pbtypes.String(typeId), + }, + }, + }) + + if resp.Error.Code != pb.RpcObjectSearchResponseError_NULL { + return "", ErrFailedSearchType + } + + if len(resp.Records) == 0 { + return "", ErrorTypeNotFound + } + + return resp.Records[0].Fields["name"].GetStringValue(), nil +} diff --git a/cmd/api/utils/utils.go b/cmd/api/utils/utils.go deleted file mode 100644 index bd24f7e11..000000000 --- a/cmd/api/utils/utils.go +++ /dev/null @@ -1,29 +0,0 @@ -package utils - -import ( - "fmt" - - "github.com/anyproto/anytype-heart/pkg/lib/pb/model" -) - -// GetIconFromEmojiOrImage returns the icon to use for the object, which can be either an emoji or an image url -func GetIconFromEmojiOrImage(accountInfo *model.AccountInfo, iconEmoji string, iconImage string) string { - if iconEmoji != "" { - return iconEmoji - } - - if iconImage != "" { - return GetGatewayURLForMedia(accountInfo, iconImage, true) - } - - return "" -} - -// GetGatewayURLForMedia returns the URL of file gateway for the media object with the given ID -func GetGatewayURLForMedia(accountInfo *model.AccountInfo, objectId string, isIcon bool) string { - widthParam := "" - if isIcon { - widthParam = "?width=100" - } - return fmt.Sprintf("%s/image/%s%s", accountInfo.GatewayUrl, objectId, widthParam) -} From d05cc8a257e637b63e0d0026f65af050045f111f Mon Sep 17 00:00:00 2001 From: Jannis Metrikat <120120832+jmetrikat@users.noreply.github.com> Date: Tue, 31 Dec 2024 12:37:42 +0100 Subject: [PATCH 068/195] GO-4459: Refactor main into server and router --- cmd/api/main.go | 122 ++++------------------------- cmd/api/{ => server}/middleware.go | 23 +++--- cmd/api/server/router.go | 65 +++++++++++++++ cmd/api/server/server.go | 67 ++++++++++++++++ 4 files changed, 162 insertions(+), 115 deletions(-) rename cmd/api/{ => server}/middleware.go (78%) create mode 100644 cmd/api/server/router.go create mode 100644 cmd/api/server/server.go diff --git a/cmd/api/main.go b/cmd/api/main.go index 2d2506304..3a23d5732 100644 --- a/cmd/api/main.go +++ b/cmd/api/main.go @@ -4,68 +4,20 @@ import ( "context" "fmt" "net/http" + "os" + "os/signal" "time" - "github.com/gin-gonic/gin" - swaggerFiles "github.com/swaggo/files" - ginSwagger "github.com/swaggo/gin-swagger" - - "github.com/webstradev/gin-pagination/v2/pkg/pagination" - - "github.com/anyproto/anytype-heart/cmd/api/auth" _ "github.com/anyproto/anytype-heart/cmd/api/docs" - "github.com/anyproto/anytype-heart/cmd/api/object" - "github.com/anyproto/anytype-heart/cmd/api/search" - "github.com/anyproto/anytype-heart/cmd/api/space" + "github.com/anyproto/anytype-heart/cmd/api/server" "github.com/anyproto/anytype-heart/core" "github.com/anyproto/anytype-heart/pb/service" - "github.com/anyproto/anytype-heart/pkg/lib/pb/model" ) const ( - httpPort = ":31009" serverShutdownTime = 5 * time.Second ) -type ApiServer struct { - mw service.ClientCommandsServer - mwInternal core.MiddlewareInternal - router *gin.Engine - server *http.Server - - accountInfo *model.AccountInfo - authService *auth.AuthService - objectService *object.ObjectService - spaceService *space.SpaceService - searchService *search.SearchService -} - -// TODO: User represents an authenticated user with permissions -type User struct { - ID string - Permissions string // "read-only" or "read-write" -} - -func newApiServer(mw service.ClientCommandsServer, mwInternal core.MiddlewareInternal) *ApiServer { - a := &ApiServer{ - mw: mw, - mwInternal: mwInternal, - router: gin.Default(), - authService: auth.NewService(mw), - objectService: object.NewService(mw), - spaceService: space.NewService(mw), - searchService: search.NewService(mw), - } - - a.server = &http.Server{ - Addr: httpPort, - Handler: a.router, - ReadHeaderTimeout: 5 * time.Second, - } - - return a -} - // RunApiServer starts the HTTP server and registers the API routes. // // @title Anytype API @@ -83,67 +35,25 @@ func newApiServer(mw service.ClientCommandsServer, mwInternal core.MiddlewareInt // @externalDocs.description OpenAPI // @externalDocs.url https://swagger.io/resources/open-api/ func RunApiServer(ctx context.Context, mw service.ClientCommandsServer, mwInternal core.MiddlewareInternal) { - a := newApiServer(mw, mwInternal) - a.router.Use(a.initAccountInfo()) + // Create a new server instance including the router + srv := server.NewServer(mw, mwInternal) - // Initialize pagination middleware - paginator := pagination.New( - pagination.WithPageText("offset"), - pagination.WithSizeText("limit"), - pagination.WithDefaultPage(0), - pagination.WithDefaultPageSize(100), - pagination.WithMinPageSize(1), - pagination.WithMaxPageSize(1000), - ) - - // Swagger route - a.router.GET("/swagger/*any", ginSwagger.WrapHandler(swaggerFiles.Handler)) - - // Unprotected routes - authRouter := a.router.Group("/v1/auth") - { - authRouter.POST("/displayCode", auth.AuthDisplayCodeHandler(a.authService)) - authRouter.GET("/token", auth.AuthTokenHandler(a.authService)) - } - - // Read-only routes - readOnly := a.router.Group("/v1") - // readOnly.Use(a.AuthMiddleware()) - // readOnly.Use(a.PermissionMiddleware("read-only")) - { - readOnly.GET("/spaces", paginator, space.GetSpacesHandler(a.spaceService)) - readOnly.GET("/spaces/:space_id/members", paginator, space.GetMembersHandler(a.spaceService)) - readOnly.GET("/spaces/:space_id/objects", paginator, object.GetObjectsHandler(a.objectService)) - readOnly.GET("/spaces/:space_id/objects/:object_id", object.GetObjectHandler(a.objectService)) - readOnly.GET("/spaces/:space_id/objectTypes", paginator, object.GetObjectTypesHandler(a.objectService)) - readOnly.GET("/spaces/:space_id/objectTypes/:typeId/templates", paginator, object.GetObjectTypeTemplatesHandler(a.objectService)) - readOnly.GET("/search", paginator, search.SearchHandler(a.searchService)) - } - - // Read-write routes - readWrite := a.router.Group("/v1") - // readWrite.Use(a.AuthMiddleware()) - // readWrite.Use(a.PermissionMiddleware("read-write")) - { - // readWrite.POST("/spaces", a.createSpaceHandler) - readWrite.POST("/spaces/:space_id/objects", object.CreateObjectHandler(a.objectService)) - readWrite.PUT("/spaces/:space_id/objects/:object_id", object.UpdateObjectHandler(a.objectService)) - } - - // Start the HTTP server + // Start the server in a goroutine so we can handle graceful shutdown go func() { - if err := a.server.ListenAndServe(); err != nil && err != http.ErrServerClosed { - fmt.Printf("failed to start HTTP server: %v\n", err) + if err := srv.ListenAndServe(); err != nil && err != http.ErrServerClosed { + fmt.Printf("API server error: %v\n", err) } }() - // Wait for the context to be done and then shut down the server - <-ctx.Done() + // Graceful shutdown on CTRL+C / SIGINT + quit := make(chan os.Signal, 1) + signal.Notify(quit, os.Interrupt) + <-quit - // Create a new context with a timeout to shut down the server - shutdownCtx, cancel := context.WithTimeout(context.Background(), serverShutdownTime) + ctx, cancel := context.WithTimeout(context.Background(), serverShutdownTime) defer cancel() - if err := a.server.Shutdown(shutdownCtx); err != nil { - fmt.Println("server shutdown failed: %w", err) + + if err := srv.Shutdown(ctx); err != nil { + fmt.Printf("API server shutdown failed: %v\n", err) } } diff --git a/cmd/api/middleware.go b/cmd/api/server/middleware.go similarity index 78% rename from cmd/api/middleware.go rename to cmd/api/server/middleware.go index b1b9caec3..48bbebc2b 100644 --- a/cmd/api/middleware.go +++ b/cmd/api/server/middleware.go @@ -1,4 +1,4 @@ -package api +package server import ( "context" @@ -10,11 +10,17 @@ import ( "github.com/anyproto/anytype-heart/core/anytype/account" ) +// // TODO: User represents an authenticated user with permissions +type User struct { + ID string + Permissions string // "read-only" or "read-write" +} + // initAccountInfo retrieves the account information from the account service -func (a *ApiServer) initAccountInfo() gin.HandlerFunc { +func (s *Server) initAccountInfo() gin.HandlerFunc { return func(c *gin.Context) { // TODO: consider not fetching account info on every request; currently used to avoid inconsistencies on logout/login - app := a.mwInternal.GetApp() + app := s.mwInternal.GetApp() if app == nil { c.AbortWithStatusJSON(http.StatusInternalServerError, gin.H{"error": "failed to get app instance"}) return @@ -26,16 +32,15 @@ func (a *ApiServer) initAccountInfo() gin.HandlerFunc { return } - a.accountInfo = accInfo - a.objectService.AccountInfo = accInfo - a.spaceService.AccountInfo = accInfo - a.searchService.AccountInfo = accInfo + s.objectService.AccountInfo = accInfo + s.spaceService.AccountInfo = accInfo + s.searchService.AccountInfo = accInfo c.Next() } } // TODO: AuthMiddleware to ensure the user is authenticated -func (a *ApiServer) AuthMiddleware() gin.HandlerFunc { +func (s *Server) AuthMiddleware() gin.HandlerFunc { return func(c *gin.Context) { token := c.GetHeader("Authorization") if token == "" { @@ -56,7 +61,7 @@ func (a *ApiServer) AuthMiddleware() gin.HandlerFunc { } // TODO: PermissionMiddleware to ensure the user has the required permissions -func (a *ApiServer) PermissionMiddleware(requiredPermission string) gin.HandlerFunc { +func (s *Server) PermissionMiddleware(requiredPermission string) gin.HandlerFunc { return func(c *gin.Context) { user, exists := c.Get("user") if !exists { diff --git a/cmd/api/server/router.go b/cmd/api/server/router.go new file mode 100644 index 000000000..372d87053 --- /dev/null +++ b/cmd/api/server/router.go @@ -0,0 +1,65 @@ +package server + +import ( + "github.com/gin-gonic/gin" + swaggerFiles "github.com/swaggo/files" + ginSwagger "github.com/swaggo/gin-swagger" + "github.com/webstradev/gin-pagination/v2/pkg/pagination" + + "github.com/anyproto/anytype-heart/cmd/api/auth" + "github.com/anyproto/anytype-heart/cmd/api/object" + "github.com/anyproto/anytype-heart/cmd/api/search" + "github.com/anyproto/anytype-heart/cmd/api/space" +) + +// NewRouter builds and returns a *gin.Engine with all routes configured. +func (s *Server) NewRouter() *gin.Engine { + router := gin.Default() + router.Use(s.initAccountInfo()) + + // Pagination middleware setup + paginator := pagination.New( + pagination.WithPageText("offset"), + pagination.WithSizeText("limit"), + pagination.WithDefaultPage(0), + pagination.WithDefaultPageSize(100), + pagination.WithMinPageSize(1), + pagination.WithMaxPageSize(1000), + ) + + // Swagger route + router.GET("/swagger/*any", ginSwagger.WrapHandler(swaggerFiles.Handler)) + + // Unprotected routes + authRouter := router.Group("/v1/auth") + { + authRouter.POST("/displayCode", auth.AuthDisplayCodeHandler(s.authService)) + authRouter.GET("/token", auth.AuthTokenHandler(s.authService)) + } + + // Read-only group + readOnly := router.Group("/v1") + // readOnly.Use(a.AuthMiddleware()) + // readOnly.Use(a.PermissionMiddleware("read-only")) + { + readOnly.GET("/spaces", paginator, space.GetSpacesHandler(s.spaceService)) + readOnly.GET("/spaces/:space_id/members", paginator, space.GetMembersHandler(s.spaceService)) + readOnly.GET("/spaces/:space_id/objects", paginator, object.GetObjectsHandler(s.objectService)) + readOnly.GET("/spaces/:space_id/objects/:object_id", object.GetObjectHandler(s.objectService)) + readOnly.GET("/spaces/:space_id/objectTypes", paginator, object.GetObjectTypesHandler(s.objectService)) + readOnly.GET("/spaces/:space_id/objectTypes/:typeId/templates", paginator, object.GetObjectTypeTemplatesHandler(s.objectService)) + readOnly.GET("/search", paginator, search.SearchHandler(s.searchService)) + } + + // Read-write group + readWrite := router.Group("/v1") + // readWrite.Use(a.AuthMiddleware()) + // readWrite.Use(a.PermissionMiddleware("read-write")) + { + readWrite.POST("/spaces", space.CreateSpaceHandler(s.spaceService)) + readWrite.POST("/spaces/:space_id/objects", object.CreateObjectHandler(s.objectService)) + readWrite.PUT("/spaces/:space_id/objects/:object_id", object.UpdateObjectHandler(s.objectService)) + } + + return router +} diff --git a/cmd/api/server/server.go b/cmd/api/server/server.go new file mode 100644 index 000000000..17d4e2592 --- /dev/null +++ b/cmd/api/server/server.go @@ -0,0 +1,67 @@ +package server + +import ( + "context" + "fmt" + "net/http" + "time" + + "github.com/gin-gonic/gin" + + "github.com/anyproto/anytype-heart/cmd/api/auth" + "github.com/anyproto/anytype-heart/cmd/api/object" + "github.com/anyproto/anytype-heart/cmd/api/search" + "github.com/anyproto/anytype-heart/cmd/api/space" + "github.com/anyproto/anytype-heart/core" + "github.com/anyproto/anytype-heart/pb/service" +) + +const ( + httpPort = ":31009" + readHeaderTimeout = 5 * time.Second +) + +// Server wraps the HTTP server logic. +type Server struct { + engine *gin.Engine + srv *http.Server + + mwInternal core.MiddlewareInternal + authService *auth.AuthService + objectService *object.ObjectService + spaceService *space.SpaceService + searchService *search.SearchService +} + +// NewServer constructs a new Server with default config +// and sets up routes via your router.go +func NewServer(mw service.ClientCommandsServer, mwInternal core.MiddlewareInternal) *Server { + s := &Server{ + mwInternal: mwInternal, + authService: auth.NewService(mw), + objectService: object.NewService(mw), + spaceService: space.NewService(mw), + searchService: search.NewService(mw), + } + + s.engine = s.NewRouter() + s.srv = &http.Server{ + Addr: httpPort, + Handler: s.engine, + ReadHeaderTimeout: readHeaderTimeout, + } + + return s +} + +// ListenAndServe starts the HTTP server +func (s *Server) ListenAndServe() error { + fmt.Printf("Starting API server on %s\n", httpPort) + return s.srv.ListenAndServe() +} + +// Shutdown gracefully stops the server +func (s *Server) Shutdown(ctx context.Context) error { + fmt.Println("Shutting down API server...") + return s.srv.Shutdown(ctx) +} From 239a606eb3772a77dccc484a22d4ada9beafbaeb Mon Sep 17 00:00:00 2001 From: Jannis Metrikat <120120832+jmetrikat@users.noreply.github.com> Date: Tue, 31 Dec 2024 12:39:13 +0100 Subject: [PATCH 069/195] GO-4459: Refactor auth tests --- cmd/api/auth/handler.go | 2 +- cmd/api/auth/service.go | 4 +- cmd/api/auth/service_test.go | 140 ++++++++++++ cmd/api/handlers_test.go | 395 ---------------------------------- cmd/api/space/service_test.go | 6 +- 5 files changed, 148 insertions(+), 399 deletions(-) create mode 100644 cmd/api/auth/service_test.go diff --git a/cmd/api/auth/handler.go b/cmd/api/auth/handler.go index d3850ceea..0c5dfd269 100644 --- a/cmd/api/auth/handler.go +++ b/cmd/api/auth/handler.go @@ -52,7 +52,7 @@ func AuthTokenHandler(s *AuthService) gin.HandlerFunc { sessionToken, appKey, err := s.SolveChallengeForToken(c.Request.Context(), challengeID, code) errCode := util.MapErrorCode(err, util.ErrToCode(ErrInvalidInput, http.StatusBadRequest), - util.ErrToCode(ErrorFailedAuthenticate, http.StatusInternalServerError), + util.ErrToCode(ErrFailedAuthenticate, http.StatusInternalServerError), ) if errCode != http.StatusOK { diff --git a/cmd/api/auth/service.go b/cmd/api/auth/service.go index 22a21871b..19b857c79 100644 --- a/cmd/api/auth/service.go +++ b/cmd/api/auth/service.go @@ -11,7 +11,7 @@ import ( var ( ErrFailedGenerateChallenge = errors.New("failed to generate a new challenge") ErrInvalidInput = errors.New("invalid input") - ErrorFailedAuthenticate = errors.New("failed to authenticate user") + ErrFailedAuthenticate = errors.New("failed to authenticate user") ) type Service interface { @@ -53,7 +53,7 @@ func (s *AuthService) SolveChallengeForToken(ctx context.Context, challengeID, c }) if resp.Error.Code != pb.RpcAccountLocalLinkSolveChallengeResponseError_NULL { - return "", "", ErrorFailedAuthenticate + return "", "", ErrFailedAuthenticate } return resp.SessionToken, resp.AppKey, nil diff --git a/cmd/api/auth/service_test.go b/cmd/api/auth/service_test.go new file mode 100644 index 000000000..a78f759e2 --- /dev/null +++ b/cmd/api/auth/service_test.go @@ -0,0 +1,140 @@ +package auth + +import ( + "context" + "testing" + + "github.com/stretchr/testify/mock" + "github.com/stretchr/testify/require" + + "github.com/anyproto/anytype-heart/pb" + "github.com/anyproto/anytype-heart/pb/service/mock_service" +) + +const ( + mockedAppName = "api-test" + mockedChallengeId = "mocked-challenge-id" + mockedCode = "mocked-mockedCode" + mockedSessionToken = "mocked-session-token" + mockedAppKey = "mocked-app-key" +) + +type fixture struct { + *AuthService + mwMock *mock_service.MockClientCommandsServer +} + +func newFixture(t *testing.T) *fixture { + mw := mock_service.NewMockClientCommandsServer(t) + authService := NewService(mw) + + return &fixture{ + AuthService: authService, + mwMock: mw, + } +} + +func TestAuthService_GenerateNewChallenge(t *testing.T) { + t.Run("successful challenge creation", func(t *testing.T) { + // given + ctx := context.Background() + fx := newFixture(t) + + fx.mwMock.On("AccountLocalLinkNewChallenge", mock.Anything, &pb.RpcAccountLocalLinkNewChallengeRequest{AppName: mockedAppName}). + Return(&pb.RpcAccountLocalLinkNewChallengeResponse{ + ChallengeId: mockedChallengeId, + Error: &pb.RpcAccountLocalLinkNewChallengeResponseError{Code: pb.RpcAccountLocalLinkNewChallengeResponseError_NULL}, + }).Once() + + // when + challengeId, err := fx.GenerateNewChallenge(ctx, mockedAppName) + + // then + require.NoError(t, err) + require.Equal(t, mockedChallengeId, challengeId) + }) + + t.Run("failed challenge creation", func(t *testing.T) { + // given + ctx := context.Background() + fx := newFixture(t) + + fx.mwMock.On("AccountLocalLinkNewChallenge", mock.Anything, &pb.RpcAccountLocalLinkNewChallengeRequest{AppName: mockedAppName}). + Return(&pb.RpcAccountLocalLinkNewChallengeResponse{ + Error: &pb.RpcAccountLocalLinkNewChallengeResponseError{Code: pb.RpcAccountLocalLinkNewChallengeResponseError_UNKNOWN_ERROR}, + }).Once() + + // when + challengeId, err := fx.GenerateNewChallenge(ctx, mockedAppName) + + // then + require.Error(t, err) + require.Equal(t, ErrFailedGenerateChallenge, err) + require.Empty(t, challengeId) + }) +} + +func TestAuthService_SolveChallengeForToken(t *testing.T) { + t.Run("successful token retrieval", func(t *testing.T) { + // given + ctx := context.Background() + fx := newFixture(t) + + fx.mwMock.On("AccountLocalLinkSolveChallenge", mock.Anything, &pb.RpcAccountLocalLinkSolveChallengeRequest{ + ChallengeId: mockedChallengeId, + Answer: mockedCode, + }). + Return(&pb.RpcAccountLocalLinkSolveChallengeResponse{ + SessionToken: mockedSessionToken, + AppKey: mockedAppKey, + Error: &pb.RpcAccountLocalLinkSolveChallengeResponseError{Code: pb.RpcAccountLocalLinkSolveChallengeResponseError_NULL}, + }).Once() + + // when + sessionToken, appKey, err := fx.SolveChallengeForToken(ctx, mockedChallengeId, mockedCode) + + // then + require.NoError(t, err) + require.Equal(t, mockedSessionToken, sessionToken) + require.Equal(t, mockedAppKey, appKey) + + }) + + t.Run("bad request", func(t *testing.T) { + // given + ctx := context.Background() + fx := newFixture(t) + + // when + sessionToken, appKey, err := fx.SolveChallengeForToken(ctx, "", "") + + // then + require.Error(t, err) + require.Equal(t, ErrInvalidInput, err) + require.Empty(t, sessionToken) + require.Empty(t, appKey) + }) + + t.Run("failed token retrieval", func(t *testing.T) { + // given + ctx := context.Background() + fx := newFixture(t) + + fx.mwMock.On("AccountLocalLinkSolveChallenge", mock.Anything, &pb.RpcAccountLocalLinkSolveChallengeRequest{ + ChallengeId: mockedChallengeId, + Answer: mockedCode, + }). + Return(&pb.RpcAccountLocalLinkSolveChallengeResponse{ + Error: &pb.RpcAccountLocalLinkSolveChallengeResponseError{Code: pb.RpcAccountLocalLinkSolveChallengeResponseError_UNKNOWN_ERROR}, + }).Once() + + // when + sessionToken, appKey, err := fx.SolveChallengeForToken(ctx, mockedChallengeId, mockedCode) + + // then + require.Error(t, err) + require.Equal(t, ErrFailedAuthenticate, err) + require.Empty(t, sessionToken) + require.Empty(t, appKey) + }) +} diff --git a/cmd/api/handlers_test.go b/cmd/api/handlers_test.go index 04419d58a..703aef502 100644 --- a/cmd/api/handlers_test.go +++ b/cmd/api/handlers_test.go @@ -85,401 +85,6 @@ func newFixture(t *testing.T) *fixture { } } -func TestApiServer_AuthDisplayCodeHandler(t *testing.T) { - t.Run("successful challenge creation", func(t *testing.T) { - // given - fx := newFixture(t) - - fx.mwMock.On("AccountLocalLinkNewChallenge", mock.Anything, &pb.RpcAccountLocalLinkNewChallengeRequest{AppName: "api-test"}). - Return(&pb.RpcAccountLocalLinkNewChallengeResponse{ - ChallengeId: "mocked-challenge-id", - Error: &pb.RpcAccountLocalLinkNewChallengeResponseError{Code: pb.RpcAccountLocalLinkNewChallengeResponseError_NULL}, - }).Once() - - // when - req, _ := http.NewRequest("POST", "/v1/auth/displayCode", nil) - w := httptest.NewRecorder() - fx.router.ServeHTTP(w, req) - - // then - require.Equal(t, http.StatusOK, w.Code) - - var response AuthDisplayCodeResponse - err := json.Unmarshal(w.Body.Bytes(), &response) - require.NoError(t, err) - require.Equal(t, "mocked-challenge-id", response.ChallengeId) - }) - - t.Run("failed challenge creation", func(t *testing.T) { - // given - fx := newFixture(t) - - fx.mwMock.On("AccountLocalLinkNewChallenge", mock.Anything, &pb.RpcAccountLocalLinkNewChallengeRequest{AppName: "api-test"}). - Return(&pb.RpcAccountLocalLinkNewChallengeResponse{ - Error: &pb.RpcAccountLocalLinkNewChallengeResponseError{Code: pb.RpcAccountLocalLinkNewChallengeResponseError_UNKNOWN_ERROR}, - }).Once() - - // when - req, _ := http.NewRequest("POST", "/v1/auth/displayCode", nil) - w := httptest.NewRecorder() - fx.router.ServeHTTP(w, req) - - // then - require.Equal(t, http.StatusInternalServerError, w.Code) - }) -} - -func TestApiServer_AuthTokenHandler(t *testing.T) { - t.Run("successful token retrieval", func(t *testing.T) { - // given - fx := newFixture(t) - - challengeId := "mocked-challenge-id" - code := "mocked-code" - sessionToken := "mocked-session-token" - appKey := "mocked-app-key" - - fx.mwMock.On("AccountLocalLinkSolveChallenge", mock.Anything, &pb.RpcAccountLocalLinkSolveChallengeRequest{ - ChallengeId: challengeId, - Answer: code, - }). - Return(&pb.RpcAccountLocalLinkSolveChallengeResponse{ - SessionToken: sessionToken, - AppKey: appKey, - Error: &pb.RpcAccountLocalLinkSolveChallengeResponseError{Code: pb.RpcAccountLocalLinkSolveChallengeResponseError_NULL}, - }).Once() - - // when - req, _ := http.NewRequest("GET", "/v1/auth/token?challenge_id="+challengeId+"&code="+code, nil) - w := httptest.NewRecorder() - fx.router.ServeHTTP(w, req) - - // then - require.Equal(t, http.StatusOK, w.Code) - - var response AuthTokenResponse - err := json.Unmarshal(w.Body.Bytes(), &response) - require.NoError(t, err) - require.Equal(t, sessionToken, response.SessionToken) - require.Equal(t, appKey, response.AppKey) - }) - - t.Run("bad request", func(t *testing.T) { - // given - fx := newFixture(t) - - // when - req, _ := http.NewRequest("GET", "/v1/auth/token", nil) - w := httptest.NewRecorder() - fx.router.ServeHTTP(w, req) - - // then - require.Equal(t, http.StatusBadRequest, w.Code) - }) - - t.Run("failed token retrieval", func(t *testing.T) { - // given - fx := newFixture(t) - challengeId := "mocked-challenge-id" - code := "mocked-code" - - fx.mwMock.On("AccountLocalLinkSolveChallenge", mock.Anything, &pb.RpcAccountLocalLinkSolveChallengeRequest{ - ChallengeId: challengeId, - Answer: code, - }). - Return(&pb.RpcAccountLocalLinkSolveChallengeResponse{ - Error: &pb.RpcAccountLocalLinkSolveChallengeResponseError{Code: pb.RpcAccountLocalLinkSolveChallengeResponseError_UNKNOWN_ERROR}, - }).Once() - - // when - req, _ := http.NewRequest("GET", "/v1/auth/token?challenge_id="+challengeId+"&code="+code, nil) - w := httptest.NewRecorder() - fx.router.ServeHTTP(w, req) - - // then - require.Equal(t, http.StatusInternalServerError, w.Code) - }) -} - -func TestApiServer_GetSpacesHandler(t *testing.T) { - t.Run("successful retrieval of spaces", func(t *testing.T) { - // given - fx := newFixture(t) - fx.accountInfo = &model.AccountInfo{TechSpaceId: techSpaceId, GatewayUrl: gatewayUrl} - - fx.mwMock.On("ObjectSearch", mock.Anything, &pb.RpcObjectSearchRequest{ - SpaceId: techSpaceId, - Filters: []*model.BlockContentDataviewFilter{ - { - RelationKey: bundle.RelationKeyLayout.String(), - Condition: model.BlockContentDataviewFilter_Equal, - Value: pbtypes.Int64(int64(model.ObjectType_spaceView)), - }, - { - RelationKey: bundle.RelationKeySpaceLocalStatus.String(), - Condition: model.BlockContentDataviewFilter_Equal, - Value: pbtypes.Int64(int64(model.SpaceStatus_Ok)), - }, - { - RelationKey: bundle.RelationKeySpaceRemoteStatus.String(), - Condition: model.BlockContentDataviewFilter_Equal, - Value: pbtypes.Int64(int64(model.SpaceStatus_Ok)), - }, - }, - Sorts: []*model.BlockContentDataviewSort{ - { - RelationKey: "spaceOrder", - Type: model.BlockContentDataviewSort_Asc, - NoCollate: true, - EmptyPlacement: model.BlockContentDataviewSort_End, - }, - }, - Keys: []string{"targetSpaceId", "name", "iconEmoji", "iconImage"}, - }).Return(&pb.RpcObjectSearchResponse{ - Records: []*types.Struct{ - { - Fields: map[string]*types.Value{ - "name": pbtypes.String("Another Workspace"), - "targetSpaceId": pbtypes.String("another-space-id"), - "iconEmoji": pbtypes.String(""), - "iconImage": pbtypes.String(iconImage), - }, - }, - { - Fields: map[string]*types.Value{ - "name": pbtypes.String("My Workspace"), - "targetSpaceId": pbtypes.String("my-space-id"), - "iconEmoji": pbtypes.String("🚀"), - "iconImage": pbtypes.String(""), - }, - }, - }, - Error: &pb.RpcObjectSearchResponseError{Code: pb.RpcObjectSearchResponseError_NULL}, - }).Once() - - fx.mwMock.On("WorkspaceOpen", mock.Anything, mock.Anything).Return(&pb.RpcWorkspaceOpenResponse{ - Error: &pb.RpcWorkspaceOpenResponseError{Code: pb.RpcWorkspaceOpenResponseError_NULL}, - Info: &model.AccountInfo{ - HomeObjectId: "home-object-id", - ArchiveObjectId: "archive-object-id", - ProfileObjectId: "profile-object-id", - MarketplaceWorkspaceId: "marketplace-workspace-id", - WorkspaceObjectId: "workspace-object-id", - DeviceId: "device-id", - AccountSpaceId: "account-space-id", - WidgetsId: "widgets-id", - SpaceViewId: "space-view-id", - TechSpaceId: "tech-space-id", - GatewayUrl: "gateway-url", - LocalStoragePath: "local-storage-path", - TimeZone: "time-zone", - AnalyticsId: "analytics-id", - NetworkId: "network-id", - }, - }, nil).Twice() - - // when - req, _ := http.NewRequest("GET", fmt.Sprintf("/v1/spaces?offset=%d&limit=%d", offset, limit), nil) - w := httptest.NewRecorder() - fx.router.ServeHTTP(w, req) - - // then - require.Equal(t, http.StatusOK, w.Code) - - var response PaginatedResponse[Space] - err := json.Unmarshal(w.Body.Bytes(), &response) - require.NoError(t, err) - require.Len(t, response.Data, 2) - require.Equal(t, "Another Workspace", response.Data[0].Name) - require.Equal(t, "another-space-id", response.Data[0].Id) - require.Regexpf(t, regexp.MustCompile(gatewayUrl+`/image/`+iconImage), response.Data[0].Icon, "Icon URL does not match") - require.Equal(t, "My Workspace", response.Data[1].Name) - require.Equal(t, "my-space-id", response.Data[1].Id) - require.Equal(t, "🚀", response.Data[1].Icon) - }) - - t.Run("no spaces found", func(t *testing.T) { - // given - fx := newFixture(t) - fx.accountInfo = &model.AccountInfo{TechSpaceId: techSpaceId} - - fx.mwMock.On("ObjectSearch", mock.Anything, mock.Anything). - Return(&pb.RpcObjectSearchResponse{ - Records: []*types.Struct{}, - Error: &pb.RpcObjectSearchResponseError{Code: pb.RpcObjectSearchResponseError_NULL}, - }).Once() - - // when - req, _ := http.NewRequest("GET", fmt.Sprintf("/v1/spaces?offset=%d&limit=%d", offset, limit), nil) - w := httptest.NewRecorder() - fx.router.ServeHTTP(w, req) - - // then - require.Equal(t, http.StatusNotFound, w.Code) - }) - - t.Run("failed workspace open", func(t *testing.T) { - // given - fx := newFixture(t) - fx.accountInfo = &model.AccountInfo{TechSpaceId: techSpaceId} - - fx.mwMock.On("ObjectSearch", mock.Anything, mock.Anything). - Return(&pb.RpcObjectSearchResponse{ - Records: []*types.Struct{ - { - Fields: map[string]*types.Value{ - "name": pbtypes.String("My Workspace"), - "targetSpaceId": pbtypes.String("my-space-id"), - "iconEmoji": pbtypes.String("🚀"), - "iconImage": pbtypes.String(""), - }, - }, - }, - Error: &pb.RpcObjectSearchResponseError{Code: pb.RpcObjectSearchResponseError_NULL}, - }).Once() - - fx.mwMock.On("WorkspaceOpen", mock.Anything, mock.Anything). - Return(&pb.RpcWorkspaceOpenResponse{ - Error: &pb.RpcWorkspaceOpenResponseError{Code: pb.RpcWorkspaceOpenResponseError_UNKNOWN_ERROR}, - }, nil).Once() - - // when - req, _ := http.NewRequest("GET", fmt.Sprintf("/v1/spaces?offset=%d&limit=%d", offset, limit), nil) - w := httptest.NewRecorder() - fx.router.ServeHTTP(w, req) - - // then - require.Equal(t, http.StatusInternalServerError, w.Code) - }) -} - -func TestApiServer_CreateSpaceHandler(t *testing.T) { - t.Run("successful create space", func(t *testing.T) { - // given - fx := newFixture(t) - fx.mwMock.On("WorkspaceCreate", mock.Anything, mock.Anything). - Return(&pb.RpcWorkspaceCreateResponse{ - Error: &pb.RpcWorkspaceCreateResponseError{Code: pb.RpcWorkspaceCreateResponseError_NULL}, - SpaceId: "new-space-id", - }).Once() - - // when - body := strings.NewReader(`{"name":"New Space"}`) - req, _ := http.NewRequest("POST", "/v1/spaces", body) - w := httptest.NewRecorder() - fx.router.ServeHTTP(w, req) - - // then - require.Equal(t, http.StatusOK, w.Code) - require.Contains(t, w.Body.String(), "new-space-id") - }) - - t.Run("invalid JSON", func(t *testing.T) { - // given - fx := newFixture(t) - - // when - body := strings.NewReader(`{invalid json}`) - req, _ := http.NewRequest("POST", "/v1/spaces", body) - w := httptest.NewRecorder() - fx.router.ServeHTTP(w, req) - - // then - require.Equal(t, http.StatusBadRequest, w.Code) - }) - - t.Run("failed workspace creation", func(t *testing.T) { - // given - fx := newFixture(t) - fx.mwMock.On("WorkspaceCreate", mock.Anything, mock.Anything). - Return(&pb.RpcWorkspaceCreateResponse{ - Error: &pb.RpcWorkspaceCreateResponseError{Code: pb.RpcWorkspaceCreateResponseError_UNKNOWN_ERROR}, - }).Once() - - // when - body := strings.NewReader(`{"name":"Fail Space"}`) - req, _ := http.NewRequest("POST", "/v1/spaces", body) - w := httptest.NewRecorder() - fx.router.ServeHTTP(w, req) - - // then - require.Equal(t, http.StatusInternalServerError, w.Code) - }) -} - -func TestApiServer_GetMembersHandler(t *testing.T) { - t.Run("successfully get members", func(t *testing.T) { - // given - fx := newFixture(t) - fx.accountInfo = &model.AccountInfo{TechSpaceId: techSpaceId, GatewayUrl: gatewayUrl} - - fx.mwMock.On("ObjectSearch", mock.Anything, mock.Anything). - Return(&pb.RpcObjectSearchResponse{ - Records: []*types.Struct{ - { - Fields: map[string]*types.Value{ - "id": pbtypes.String("member-1"), - "name": pbtypes.String("John Doe"), - "iconEmoji": pbtypes.String("👤"), - "identity": pbtypes.String("AAjEaEwPF4nkEh7AWkqEnzcQ8HziGB4ETjiTpvRCQvWnSMDZ"), - "globalName": pbtypes.String("john.any"), - }, - }, - { - Fields: map[string]*types.Value{ - "id": pbtypes.String("member-2"), - "name": pbtypes.String("Jane Doe"), - "iconImage": pbtypes.String(iconImage), - "identity": pbtypes.String("AAjLbEwPF4nkEh7AWkqEnzcQ8HziGB4ETjiTpvRCQvWnSMD4"), - "globalName": pbtypes.String("jane.any"), - }, - }, - }, - Error: &pb.RpcObjectSearchResponseError{Code: pb.RpcObjectSearchResponseError_NULL}, - }).Once() - - // when - req, _ := http.NewRequest("GET", fmt.Sprintf("/v1/spaces/my-space/members?offset=%d&limit=%d", offset, limit), nil) - w := httptest.NewRecorder() - fx.router.ServeHTTP(w, req) - - // then - require.Equal(t, http.StatusOK, w.Code) - - var response PaginatedResponse[Member] - err := json.Unmarshal(w.Body.Bytes(), &response) - require.NoError(t, err) - require.Len(t, response.Data, 2) - require.Equal(t, "member-1", response.Data[0].Id) - require.Equal(t, "John Doe", response.Data[0].Name) - require.Equal(t, "👤", response.Data[0].Icon) - require.Equal(t, "john.any", response.Data[0].GlobalName) - require.Equal(t, "member-2", response.Data[1].Id) - require.Equal(t, "Jane Doe", response.Data[1].Name) - require.Regexpf(t, regexp.MustCompile(gatewayUrl+`/image/`+iconImage), response.Data[1].Icon, "Icon URL does not match") - require.Equal(t, "jane.any", response.Data[1].GlobalName) - }) - - t.Run("no members found", func(t *testing.T) { - // given - fx := newFixture(t) - - fx.mwMock.On("ObjectSearch", mock.Anything, mock.Anything). - Return(&pb.RpcObjectSearchResponse{ - Records: []*types.Struct{}, - Error: &pb.RpcObjectSearchResponseError{Code: pb.RpcObjectSearchResponseError_NULL}, - }).Once() - - // when - req, _ := http.NewRequest("GET", fmt.Sprintf("/v1/spaces/empty-space/members?offset=%d&limit=%d", offset, limit), nil) - w := httptest.NewRecorder() - fx.router.ServeHTTP(w, req) - - // then - require.Equal(t, http.StatusNotFound, w.Code) - }) -} - func TestApiServer_GetObjectsForSpaceHandler(t *testing.T) { t.Run("successfully get objects for a space", func(t *testing.T) { // given diff --git a/cmd/api/space/service_test.go b/cmd/api/space/service_test.go index 0ab45fdad..5d2293b96 100644 --- a/cmd/api/space/service_test.go +++ b/cmd/api/space/service_test.go @@ -31,7 +31,11 @@ type fixture struct { func newFixture(t *testing.T) *fixture { mw := mock_service.NewMockClientCommandsServer(t) - spaceService := &SpaceService{mw: mw, AccountInfo: &model.AccountInfo{TechSpaceId: techSpaceId, GatewayUrl: gatewayUrl}} + spaceService := NewService(mw) + spaceService.AccountInfo = &model.AccountInfo{ + TechSpaceId: techSpaceId, + GatewayUrl: gatewayUrl, + } return &fixture{ SpaceService: spaceService, From 5bae6a15854e2c0e90338d752242aaab255af68e Mon Sep 17 00:00:00 2001 From: Jannis Metrikat <120120832+jmetrikat@users.noreply.github.com> Date: Tue, 31 Dec 2024 12:54:28 +0100 Subject: [PATCH 070/195] GO-4459: Fix service dependencies for search --- cmd/api/search/service.go | 4 ++-- cmd/api/server/server.go | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/cmd/api/search/service.go b/cmd/api/search/service.go index 0637285c7..c6039fe9f 100644 --- a/cmd/api/search/service.go +++ b/cmd/api/search/service.go @@ -32,8 +32,8 @@ type SearchService struct { AccountInfo *model.AccountInfo } -func NewService(mw service.ClientCommandsServer) *SearchService { - return &SearchService{mw: mw, spaceService: space.NewService(mw), objectService: object.NewService(mw)} +func NewService(mw service.ClientCommandsServer, spaceService *space.SpaceService, objectService *object.ObjectService) *SearchService { + return &SearchService{mw: mw, spaceService: spaceService, objectService: objectService} } func (s *SearchService) Search(ctx context.Context, searchQuery string, objectType string, offset, limit int) (objects []object.Object, total int, hasMore bool, err error) { diff --git a/cmd/api/server/server.go b/cmd/api/server/server.go index 17d4e2592..29cef94d3 100644 --- a/cmd/api/server/server.go +++ b/cmd/api/server/server.go @@ -41,9 +41,9 @@ func NewServer(mw service.ClientCommandsServer, mwInternal core.MiddlewareIntern authService: auth.NewService(mw), objectService: object.NewService(mw), spaceService: space.NewService(mw), - searchService: search.NewService(mw), } + s.searchService = search.NewService(mw, s.spaceService, s.objectService) s.engine = s.NewRouter() s.srv = &http.Server{ Addr: httpPort, From 3933b131f30441f552884e8f90b81522b0831b61 Mon Sep 17 00:00:00 2001 From: Jannis Metrikat <120120832+jmetrikat@users.noreply.github.com> Date: Tue, 31 Dec 2024 13:01:18 +0100 Subject: [PATCH 071/195] GO-4459: Fix lint --- cmd/api/demo/api_demo.go | 13 +- cmd/api/handlers.go | 1 - cmd/api/handlers_test.go | 613 --------------------------------------- cmd/api/main.go | 3 +- 4 files changed, 7 insertions(+), 623 deletions(-) delete mode 100644 cmd/api/handlers.go delete mode 100644 cmd/api/handlers_test.go diff --git a/cmd/api/demo/api_demo.go b/cmd/api/demo/api_demo.go index 0f319acae..311938774 100644 --- a/cmd/api/demo/api_demo.go +++ b/cmd/api/demo/api_demo.go @@ -15,12 +15,13 @@ import ( const ( baseURL = "http://localhost:31009/v1" // testSpaceId = "bafyreifymx5ucm3fdc7vupfg7wakdo5qelni3jvlmawlnvjcppurn2b3di.2lcu0r85yg10d" // dev (entry space) - testSpaceId = "bafyreiezhzb4ggnhjwejmh67pd5grilk6jn3jt7y2rnfpbkjwekilreola.1t123w9f2lgn5" // LFLC + // testSpaceId = "bafyreiezhzb4ggnhjwejmh67pd5grilk6jn3jt7y2rnfpbkjwekilreola.1t123w9f2lgn5" // LFLC // testSpaceId = "bafyreiakofsfkgb7psju346cir2hit5hinhywaybi6vhp7hx4jw7hkngje.scoxzd7vu6rz" // HPI // testObjectId = "bafyreidhtlbbspxecab6xf4pi5zyxcmvwy6lqzursbjouq5fxovh6y3xwu" // "Work Faster with Templates" - // testTypeId = "bafyreie3djy4mcldt3hgeet6bnjay2iajdyi2fvx556n6wcxii7brlni3i" // Page (in dev space) + // testObjectId = "bafyreib3i5uq2tztocw3wrvhdugkwoxgg2xjh2jnl5retnyky66mr5b274" // Tag Test Page (in dev space) + // testTypeId = "bafyreie3djy4mcldt3hgeet6bnjay2iajdyi2fvx556n6wcxii7brlni3i" // Page (in dev space) // chatSpaceId = "bafyreigryvrmerbtfswwz5kav2uq5dlvx3hl45kxn4nflg7lz46lneqs7m.2nvj2qik6ctdy" // Anytype Wiki space - chatSpaceId = "bafyreiexhpzaf7uxzheubh7cjeusqukjnxfvvhh4at6bygljwvto2dttnm.2lcu0r85yg10d" // chat space + // chatSpaceId = "bafyreiexhpzaf7uxzheubh7cjeusqukjnxfvvhh4at6bygljwvto2dttnm.2lcu0r85yg10d" // chat space ) var log = logging.Logger("rest-api") @@ -69,11 +70,7 @@ func main() { // {"GET", "/spaces/{space_id}/objectTypes/{type_id}/templates?limit={limit}&offset={offset}", map[string]interface{}{"space_id": testSpaceId, "type_id": testTypeId, "limit": 100, "offset": 0}, nil}, // search - // {"GET", "/objects?search={search}&object_type={object_type}&limit={limit}&offset={offset}", map[string]interface{}{"search": "writing", "object_type": testTypeId, "limit": 100, "offset": 0}, nil}, - - // chat - // {"GET", "/spaces/{space_id}/chat/messages?limit={limit}&offset={offset}", map[string]interface{}{"space_id": chatSpaceId, "limit": 100, "offset": 0}, nil}, - // {"POST", "/spaces/{space_id}/chat/messages", map[string]interface{}{"space_id": chatSpaceId}, map[string]interface{}{"text": "new message from demo"}}, + // {"GET", "/search?query={query}&object_type={object_type}&limit={limit}&offset={offset}", map[string]interface{}{"query": "Tag", "object_type": testTypeId, "limit": 100, "offset": 0}, nil}, } for _, ep := range endpoints { diff --git a/cmd/api/handlers.go b/cmd/api/handlers.go deleted file mode 100644 index 778f64ec1..000000000 --- a/cmd/api/handlers.go +++ /dev/null @@ -1 +0,0 @@ -package api diff --git a/cmd/api/handlers_test.go b/cmd/api/handlers_test.go deleted file mode 100644 index 703aef502..000000000 --- a/cmd/api/handlers_test.go +++ /dev/null @@ -1,613 +0,0 @@ -package api - -import ( - "encoding/json" - "fmt" - "net/http" - "net/http/httptest" - "regexp" - "strings" - "testing" - - "github.com/gin-gonic/gin" - "github.com/webstradev/gin-pagination/v2/pkg/pagination" - - "github.com/stretchr/testify/mock" - "github.com/stretchr/testify/require" - - "github.com/gogo/protobuf/types" - - "github.com/anyproto/anytype-heart/core/mock_core" - "github.com/anyproto/anytype-heart/pb" - "github.com/anyproto/anytype-heart/pb/service/mock_service" - "github.com/anyproto/anytype-heart/pkg/lib/bundle" - "github.com/anyproto/anytype-heart/pkg/lib/pb/model" - "github.com/anyproto/anytype-heart/util/pbtypes" -) - -const ( - offset = 0 - limit = 100 - techSpaceId = "tech-space-id" - gatewayUrl = "http://localhost:31006" - iconImage = "bafyreialsgoyflf3etjm3parzurivyaukzivwortf32b4twnlwpwocsrri" -) - -type fixture struct { - *ApiServer - mwMock *mock_service.MockClientCommandsServer - mwInternalMock *mock_core.MockMiddlewareInternal - router *gin.Engine -} - -func newFixture(t *testing.T) *fixture { - mw := mock_service.NewMockClientCommandsServer(t) - mwInternal := mock_core.NewMockMiddlewareInternal(t) - apiServer := &ApiServer{mw: mw, mwInternal: mwInternal, router: gin.Default()} - - paginator := pagination.New( - pagination.WithPageText("offset"), - pagination.WithSizeText("limit"), - pagination.WithDefaultPage(0), - pagination.WithDefaultPageSize(100), - pagination.WithMinPageSize(1), - pagination.WithMaxPageSize(1000), - ) - - auth := apiServer.router.Group("/v1/auth") - { - auth.POST("/displayCode", apiServer.authDisplayCodeHandler) - auth.GET("/token", apiServer.authTokenHandler) - } - readOnly := apiServer.router.Group("/v1") - { - readOnly.GET("/spaces", paginator, apiServer.getSpacesHandler) - readOnly.GET("/spaces/:space_id/members", paginator, apiServer.getMembersHandler) - readOnly.GET("/spaces/:space_id/objects", paginator, apiServer.getObjectsHandler) - readOnly.GET("/spaces/:space_id/objects/:object_id", apiServer.getObjectHandler) - readOnly.GET("/spaces/:space_id/objectTypes", paginator, apiServer.getObjectTypesHandler) - readOnly.GET("/spaces/:space_id/objectTypes/:typeId/templates", paginator, apiServer.getObjectTypeTemplatesHandler) - readOnly.GET("/search", paginator, apiServer.searchHandler) - } - - readWrite := apiServer.router.Group("/v1") - { - readWrite.POST("/spaces", apiServer.createSpaceHandler) - readWrite.POST("/spaces/:space_id/objects", apiServer.createObjectHandler) - readWrite.PUT("/spaces/:space_id/objects/:object_id", apiServer.updateObjectHandler) - } - - return &fixture{ - ApiServer: apiServer, - mwMock: mw, - mwInternalMock: mwInternal, - router: apiServer.router, - } -} - -func TestApiServer_GetObjectsForSpaceHandler(t *testing.T) { - t.Run("successfully get objects for a space", func(t *testing.T) { - // given - fx := newFixture(t) - - fx.mwMock.On("ObjectSearch", mock.Anything, mock.Anything). - Return(&pb.RpcObjectSearchResponse{ - Records: []*types.Struct{ - { - Fields: map[string]*types.Value{ - "id": pbtypes.String("object-1"), - "name": pbtypes.String("My Object"), - "type": pbtypes.String("basic-type-id"), - "layout": pbtypes.Float64(float64(model.ObjectType_basic)), - "iconEmoji": pbtypes.String("📄"), - "lastModifiedDate": pbtypes.Float64(1234567890), - }, - }, - }, - Error: &pb.RpcObjectSearchResponseError{Code: pb.RpcObjectSearchResponseError_NULL}, - }).Twice() - - // Mock type resolution - fx.mwMock.On("ObjectShow", mock.Anything, mock.Anything).Return(&pb.RpcObjectShowResponse{ - Error: &pb.RpcObjectShowResponseError{Code: pb.RpcObjectShowResponseError_NULL}, - ObjectView: &model.ObjectView{ - Details: []*model.ObjectViewDetailsSet{ - { - Details: &types.Struct{ - Fields: map[string]*types.Value{ - "name": pbtypes.String("Basic Type"), - }, - }, - }, - }, - }, - }, nil).Maybe() - - // when - req, _ := http.NewRequest("GET", "/v1/spaces/my-space/objects", nil) - w := httptest.NewRecorder() - fx.router.ServeHTTP(w, req) - - // then - require.Equal(t, http.StatusOK, w.Code) - require.Contains(t, w.Body.String(), "My Object") - }) - - t.Run("no objects found", func(t *testing.T) { - // given - fx := newFixture(t) - - fx.mwMock.On("ObjectSearch", mock.Anything, mock.Anything). - Return(&pb.RpcObjectSearchResponse{ - Records: []*types.Struct{}, - Error: &pb.RpcObjectSearchResponseError{Code: pb.RpcObjectSearchResponseError_NULL}, - }).Once() - - // when - req, _ := http.NewRequest("GET", "/v1/spaces/empty-space/objects", nil) - w := httptest.NewRecorder() - fx.router.ServeHTTP(w, req) - - // then - require.Equal(t, http.StatusNotFound, w.Code) - }) -} - -func TestApiServer_GetObjectHandler(t *testing.T) { - t.Run("object found", func(t *testing.T) { - // given - fx := newFixture(t) - - fx.mwMock.On("ObjectShow", mock.Anything, &pb.RpcObjectShowRequest{ - SpaceId: "my-space", - ObjectId: "obj-1", - }). - Return(&pb.RpcObjectShowResponse{ - Error: &pb.RpcObjectShowResponseError{Code: pb.RpcObjectShowResponseError_NULL}, - ObjectView: &model.ObjectView{ - RootId: "root-1", - Details: []*model.ObjectViewDetailsSet{ - { - Details: &types.Struct{ - Fields: map[string]*types.Value{ - "name": pbtypes.String("Found Object"), - "type": pbtypes.String("basic-type-id"), - "iconEmoji": pbtypes.String("🔍"), - }, - }, - }, - }, - }, - }, nil).Once() - - // Type resolution mock - fx.mwMock.On("ObjectSearch", mock.Anything, mock.Anything).Return(&pb.RpcObjectSearchResponse{ - Error: &pb.RpcObjectSearchResponseError{Code: pb.RpcObjectSearchResponseError_NULL}, - Records: []*types.Struct{ - { - Fields: map[string]*types.Value{ - "name": pbtypes.String("Basic Type"), - }, - }, - }, - }, nil).Once() - - // when - req, _ := http.NewRequest("GET", "/v1/spaces/my-space/objects/obj-1", nil) - w := httptest.NewRecorder() - fx.router.ServeHTTP(w, req) - - // then - require.Equal(t, http.StatusOK, w.Code) - require.Contains(t, w.Body.String(), "Found Object") - }) - - t.Run("object not found", func(t *testing.T) { - // given - fx := newFixture(t) - - fx.mwMock.On("ObjectShow", mock.Anything, mock.Anything). - Return(&pb.RpcObjectShowResponse{ - Error: &pb.RpcObjectShowResponseError{Code: pb.RpcObjectShowResponseError_NOT_FOUND}, - }, nil).Once() - - // when - req, _ := http.NewRequest("GET", "/v1/spaces/my-space/objects/missing-obj", nil) - w := httptest.NewRecorder() - fx.router.ServeHTTP(w, req) - - // then - require.Equal(t, http.StatusNotFound, w.Code) - }) -} - -func TestApiServer_CreateObjectHandler(t *testing.T) { - t.Run("successful object creation", func(t *testing.T) { - // given - fx := newFixture(t) - - fx.mwMock.On("ObjectCreate", mock.Anything, mock.Anything). - Return(&pb.RpcObjectCreateResponse{ - Error: &pb.RpcObjectCreateResponseError{Code: pb.RpcObjectCreateResponseError_NULL}, - ObjectId: "new-obj-id", - Details: &types.Struct{ - Fields: map[string]*types.Value{ - "name": pbtypes.String("New Object"), - "iconEmoji": pbtypes.String("🆕"), - "spaceId": pbtypes.String("my-space"), - }, - }, - }).Once() - - // when - body := strings.NewReader(`{"name":"New Object","icon":"🆕","template_id":"","object_type_unique_key":"basic","with_chat":false}`) - req, _ := http.NewRequest("POST", "/v1/spaces/my-space/objects", body) - w := httptest.NewRecorder() - fx.router.ServeHTTP(w, req) - - // then - require.Equal(t, http.StatusOK, w.Code) - require.Contains(t, w.Body.String(), "new-obj-id") - }) - - t.Run("invalid json", func(t *testing.T) { - // given - fx := newFixture(t) - - // when - body := strings.NewReader(`{invalid json}`) - req, _ := http.NewRequest("POST", "/v1/spaces/my-space/objects", body) - w := httptest.NewRecorder() - fx.router.ServeHTTP(w, req) - - // then - require.Equal(t, http.StatusBadRequest, w.Code) - }) - - t.Run("creation error", func(t *testing.T) { - // given - fx := newFixture(t) - - fx.mwMock.On("ObjectCreate", mock.Anything, mock.Anything). - Return(&pb.RpcObjectCreateResponse{ - Error: &pb.RpcObjectCreateResponseError{Code: pb.RpcObjectCreateResponseError_UNKNOWN_ERROR}, - }).Once() - - // when - body := strings.NewReader(`{"name":"Fail Object"}`) - req, _ := http.NewRequest("POST", "/v1/spaces/my-space/objects", body) - w := httptest.NewRecorder() - fx.router.ServeHTTP(w, req) - - // then - require.Equal(t, http.StatusInternalServerError, w.Code) - }) -} - -func TestApiServer_UpdateObjectHandler(t *testing.T) { - t.Run("not implemented", func(t *testing.T) { - // given - fx := newFixture(t) - - // when - body := strings.NewReader(`{"name":"Updated Object"}`) - req, _ := http.NewRequest("PUT", "/v1/spaces/my-space/objects/obj-1", body) - w := httptest.NewRecorder() - fx.router.ServeHTTP(w, req) - - // then - require.Equal(t, http.StatusNotImplemented, w.Code) - }) - - // TODO: further tests -} - -func TestApiServer_GetObjectTypesHandler(t *testing.T) { - t.Run("types found", func(t *testing.T) { - // given - fx := newFixture(t) - - fx.mwMock.On("ObjectSearch", mock.Anything, mock.Anything). - Return(&pb.RpcObjectSearchResponse{ - Records: []*types.Struct{ - { - Fields: map[string]*types.Value{ - "id": pbtypes.String("type-1"), - "name": pbtypes.String("Type One"), - "uniqueKey": pbtypes.String("type-one-key"), - "iconEmoji": pbtypes.String("🗂️"), - }, - }, - }, - Error: &pb.RpcObjectSearchResponseError{Code: pb.RpcObjectSearchResponseError_NULL}, - }).Once() - - // when - req, _ := http.NewRequest("GET", "/v1/spaces/my-space/objectTypes", nil) - w := httptest.NewRecorder() - fx.router.ServeHTTP(w, req) - - // then - require.Equal(t, http.StatusOK, w.Code) - require.Contains(t, w.Body.String(), "Type One") - }) - - t.Run("no types found", func(t *testing.T) { - // given - fx := newFixture(t) - - fx.mwMock.On("ObjectSearch", mock.Anything, mock.Anything). - Return(&pb.RpcObjectSearchResponse{ - Records: []*types.Struct{}, - Error: &pb.RpcObjectSearchResponseError{Code: pb.RpcObjectSearchResponseError_NULL}, - }).Once() - - // when - req, _ := http.NewRequest("GET", "/v1/spaces/my-space/objectTypes", nil) - w := httptest.NewRecorder() - fx.router.ServeHTTP(w, req) - - // then - require.Equal(t, http.StatusNotFound, w.Code) - }) -} - -func TestApiServer_GetObjectTypeTemplatesHandler(t *testing.T) { - t.Run("templates found", func(t *testing.T) { - // given - fx := newFixture(t) - - // Mock template type search - fx.mwMock.On("ObjectSearch", mock.Anything, mock.Anything).Return(&pb.RpcObjectSearchResponse{ - Records: []*types.Struct{ - { - Fields: map[string]*types.Value{ - "id": pbtypes.String("template-type-id"), - "uniqueKey": pbtypes.String("ot-template"), - }, - }, - }, - Error: &pb.RpcObjectSearchResponseError{Code: pb.RpcObjectSearchResponseError_NULL}, - }).Once() - - // Mock actual template objects search - fx.mwMock.On("ObjectSearch", mock.Anything, mock.Anything).Return(&pb.RpcObjectSearchResponse{ - Records: []*types.Struct{ - { - Fields: map[string]*types.Value{ - "id": pbtypes.String("template-1"), - "targetObjectType": pbtypes.String("target-type-id"), - }, - }, - }, - Error: &pb.RpcObjectSearchResponseError{Code: pb.RpcObjectSearchResponseError_NULL}, - }).Once() - - // Mock object show for template details - fx.mwMock.On("ObjectShow", mock.Anything, mock.Anything).Return(&pb.RpcObjectShowResponse{ - Error: &pb.RpcObjectShowResponseError{Code: pb.RpcObjectShowResponseError_NULL}, - ObjectView: &model.ObjectView{ - Details: []*model.ObjectViewDetailsSet{ - { - Details: &types.Struct{ - Fields: map[string]*types.Value{ - "name": pbtypes.String("Template Name"), - "iconEmoji": pbtypes.String("📝"), - }, - }, - }, - }, - }, - }, nil).Once() - - // when - req, _ := http.NewRequest("GET", "/v1/spaces/my-space/objectTypes/target-type-id/templates", nil) - w := httptest.NewRecorder() - fx.router.ServeHTTP(w, req) - - // then - require.Equal(t, http.StatusOK, w.Code) - require.Contains(t, w.Body.String(), "Template Name") - }) - - t.Run("no template type found", func(t *testing.T) { - // given - fx := newFixture(t) - - fx.mwMock.On("ObjectSearch", mock.Anything, mock.Anything). - Return(&pb.RpcObjectSearchResponse{ - Records: []*types.Struct{}, - Error: &pb.RpcObjectSearchResponseError{Code: pb.RpcObjectSearchResponseError_NULL}, - }).Once() - - // when - req, _ := http.NewRequest("GET", "/v1/spaces/my-space/objectTypes/missing-type-id/templates", nil) - w := httptest.NewRecorder() - fx.router.ServeHTTP(w, req) - - // then - require.Equal(t, http.StatusNotFound, w.Code) - }) -} - -func TestApiServer_SearchHandler(t *testing.T) { - t.Run("objects found globally", func(t *testing.T) { - // given - fx := newFixture(t) - - // Mock retrieving spaces first - fx.accountInfo = &model.AccountInfo{TechSpaceId: techSpaceId} - fx.mwMock.On("ObjectSearch", mock.Anything, &pb.RpcObjectSearchRequest{ - SpaceId: techSpaceId, - Filters: []*model.BlockContentDataviewFilter{ - { - RelationKey: bundle.RelationKeyLayout.String(), - Condition: model.BlockContentDataviewFilter_Equal, - Value: pbtypes.Int64(int64(model.ObjectType_spaceView)), - }, - { - RelationKey: bundle.RelationKeySpaceLocalStatus.String(), - Condition: model.BlockContentDataviewFilter_Equal, - Value: pbtypes.Int64(int64(model.SpaceStatus_Ok)), - }, - { - RelationKey: bundle.RelationKeySpaceRemoteStatus.String(), - Condition: model.BlockContentDataviewFilter_Equal, - Value: pbtypes.Int64(int64(model.SpaceStatus_Ok)), - }, - }, - Keys: []string{"targetSpaceId"}, - }).Return(&pb.RpcObjectSearchResponse{ - Records: []*types.Struct{ - { - Fields: map[string]*types.Value{ - "targetSpaceId": pbtypes.String("space-1"), - }, - }, - }, - Error: &pb.RpcObjectSearchResponseError{Code: pb.RpcObjectSearchResponseError_NULL}, - }).Once() - - // Mock objects in space-1 - fx.mwMock.On("ObjectSearch", mock.Anything, mock.Anything).Return(&pb.RpcObjectSearchResponse{ - Records: []*types.Struct{ - { - Fields: map[string]*types.Value{ - "id": pbtypes.String("obj-global-1"), - "name": pbtypes.String("Global Object"), - "type": pbtypes.String("global-type-id"), - "layout": pbtypes.Float64(float64(model.ObjectType_basic)), - "iconEmoji": pbtypes.String("🌐"), - "lastModifiedDate": pbtypes.Float64(999999), - }, - }, - }, - Error: &pb.RpcObjectSearchResponseError{Code: pb.RpcObjectSearchResponseError_NULL}, - }).Twice() - - // Mock object show for object blocks and details - fx.mwMock.On("ObjectShow", mock.Anything, &pb.RpcObjectShowRequest{ - SpaceId: "space-1", - ObjectId: "obj-global-1", - }).Return(&pb.RpcObjectShowResponse{ - ObjectView: &model.ObjectView{ - RootId: "root-123", - Blocks: []*model.Block{ - { - Id: "root-123", - Restrictions: &model.BlockRestrictions{ - Read: false, - Edit: false, - Remove: false, - Drag: false, - DropOn: false, - }, - ChildrenIds: []string{"header", "text-block", "relation-block"}, - }, - { - Id: "header", - Restrictions: &model.BlockRestrictions{ - Read: false, - Edit: true, - Remove: true, - Drag: true, - DropOn: true, - }, - ChildrenIds: []string{"title", "featuredRelations"}, - }, - { - Id: "text-block", - Content: &model.BlockContentOfText{ - Text: &model.BlockContentText{ - Text: "This is a sample text block", - Style: model.BlockContentText_Paragraph, - }, - }, - }, - }, - Details: []*model.ObjectViewDetailsSet{ - { - Id: "root-123", - Details: &types.Struct{ - Fields: map[string]*types.Value{ - "name": pbtypes.String("Global Object"), - "iconEmoji": pbtypes.String("🌐"), - "lastModifiedDate": pbtypes.Float64(999999), - "createdDate": pbtypes.Float64(888888), - "tag": pbtypes.StringList([]string{"tag-1", "tag-2"}), - }, - }, - }, - { - Id: "tag-1", - Details: &types.Struct{ - Fields: map[string]*types.Value{ - "name": pbtypes.String("Important"), - "relationOptionColor": pbtypes.String("red"), - }, - }, - }, - { - Id: "tag-2", - Details: &types.Struct{ - Fields: map[string]*types.Value{ - "name": pbtypes.String("Optional"), - "relationOptionColor": pbtypes.String("blue"), - }, - }, - }, - }, - }, - Error: &pb.RpcObjectShowResponseError{Code: pb.RpcObjectShowResponseError_NULL}, - }, nil).Once() - - // when - req, _ := http.NewRequest("GET", "/v1/search", nil) - w := httptest.NewRecorder() - fx.router.ServeHTTP(w, req) - - // then - require.Equal(t, http.StatusOK, w.Code) - - var response PaginatedResponse[Object] - err := json.Unmarshal(w.Body.Bytes(), &response) - require.NoError(t, err) - require.Len(t, response.Data, 1) - require.Equal(t, "space-1", response.Data[0].SpaceId) - require.Equal(t, "Global Object", response.Data[0].Name) - require.Equal(t, "obj-global-1", response.Data[0].Id) - require.Equal(t, "🌐", response.Data[0].Icon) - - // check details - for _, detail := range response.Data[0].Details { - if detail.Id == "createdDate" { - require.Equal(t, float64(888888), detail.Details["createdDate"]) - } else if detail.Id == "lastModifiedDate" { - require.Equal(t, float64(999999), detail.Details["lastModifiedDate"]) - } - } - - // check tags - tags := []Tag{} - for _, detail := range response.Data[0].Details { - if tagList, ok := detail.Details["tags"].([]interface{}); ok { - for _, tagValue := range tagList { - tagStruct := tagValue.(map[string]interface{}) - tag := Tag{ - Id: tagStruct["id"].(string), - Name: tagStruct["name"].(string), - Color: tagStruct["color"].(string), - } - tags = append(tags, tag) - } - } - } - require.Len(t, tags, 2) - require.Equal(t, "tag-1", tags[0].Id) - require.Equal(t, "Important", tags[0].Name) - require.Equal(t, "red", tags[0].Color) - require.Equal(t, "tag-2", tags[1].Id) - require.Equal(t, "Optional", tags[1].Name) - require.Equal(t, "blue", tags[1].Color) - }) -} diff --git a/cmd/api/main.go b/cmd/api/main.go index 3a23d5732..8584c330e 100644 --- a/cmd/api/main.go +++ b/cmd/api/main.go @@ -2,6 +2,7 @@ package api import ( "context" + "errors" "fmt" "net/http" "os" @@ -40,7 +41,7 @@ func RunApiServer(ctx context.Context, mw service.ClientCommandsServer, mwIntern // Start the server in a goroutine so we can handle graceful shutdown go func() { - if err := srv.ListenAndServe(); err != nil && err != http.ErrServerClosed { + if err := srv.ListenAndServe(); err != nil && !errors.Is(err, http.ErrServerClosed) { fmt.Printf("API server error: %v\n", err) } }() From 2bb2285551c3093fd092362bd51be50b831c91aa Mon Sep 17 00:00:00 2001 From: Jannis Metrikat <120120832+jmetrikat@users.noreply.github.com> Date: Tue, 31 Dec 2024 16:52:35 +0100 Subject: [PATCH 072/195] GO-4459: Add search tests again --- cmd/api/search/service_test.go | 241 +++++++++++++++++++++++++++++++++ 1 file changed, 241 insertions(+) create mode 100644 cmd/api/search/service_test.go diff --git a/cmd/api/search/service_test.go b/cmd/api/search/service_test.go new file mode 100644 index 000000000..d16a6d2ce --- /dev/null +++ b/cmd/api/search/service_test.go @@ -0,0 +1,241 @@ +package search + +import ( + "context" + "testing" + + "github.com/gogo/protobuf/types" + "github.com/stretchr/testify/mock" + "github.com/stretchr/testify/require" + + "github.com/anyproto/anytype-heart/cmd/api/object" + "github.com/anyproto/anytype-heart/cmd/api/space" + "github.com/anyproto/anytype-heart/pb" + "github.com/anyproto/anytype-heart/pb/service/mock_service" + "github.com/anyproto/anytype-heart/pkg/lib/bundle" + "github.com/anyproto/anytype-heart/pkg/lib/pb/model" + "github.com/anyproto/anytype-heart/util/pbtypes" +) + +const ( + offset = 0 + limit = 100 + techSpaceId = "tech-space-id" + gatewayUrl = "http://localhost:31006" + iconImage = "bafyreialsgoyflf3etjm3parzurivyaukzivwortf32b4twnlwpwocsrri" +) + +type fixture struct { + *SearchService + mwMock *mock_service.MockClientCommandsServer +} + +func newFixture(t *testing.T) *fixture { + mw := mock_service.NewMockClientCommandsServer(t) + + spaceService := space.NewService(mw) + spaceService.AccountInfo = &model.AccountInfo{TechSpaceId: techSpaceId} + objectService := object.NewService(mw) + objectService.AccountInfo = &model.AccountInfo{TechSpaceId: techSpaceId} + searchService := NewService(mw, spaceService, objectService) + searchService.AccountInfo = &model.AccountInfo{ + TechSpaceId: techSpaceId, + GatewayUrl: gatewayUrl, + } + + return &fixture{ + SearchService: searchService, + mwMock: mw, + } +} + +func TestSearchService_Search(t *testing.T) { + t.Run("objects found globally", func(t *testing.T) { + // given + ctx := context.Background() + fx := newFixture(t) + + // Mock retrieving spaces first + fx.mwMock.On("ObjectSearch", mock.Anything, &pb.RpcObjectSearchRequest{ + SpaceId: techSpaceId, + Filters: []*model.BlockContentDataviewFilter{ + { + RelationKey: bundle.RelationKeyLayout.String(), + Condition: model.BlockContentDataviewFilter_Equal, + Value: pbtypes.Int64(int64(model.ObjectType_spaceView)), + }, + { + RelationKey: bundle.RelationKeySpaceLocalStatus.String(), + Condition: model.BlockContentDataviewFilter_Equal, + Value: pbtypes.Int64(int64(model.SpaceStatus_Ok)), + }, + { + RelationKey: bundle.RelationKeySpaceRemoteStatus.String(), + Condition: model.BlockContentDataviewFilter_Equal, + Value: pbtypes.Int64(int64(model.SpaceStatus_Ok)), + }, + }, + Sorts: []*model.BlockContentDataviewSort{ + { + RelationKey: "spaceOrder", + Type: model.BlockContentDataviewSort_Asc, + NoCollate: true, + EmptyPlacement: model.BlockContentDataviewSort_End, + }, + }, + Keys: []string{"targetSpaceId", "name", "iconEmoji", "iconImage"}, + }).Return(&pb.RpcObjectSearchResponse{ + Records: []*types.Struct{ + { + Fields: map[string]*types.Value{ + "targetSpaceId": pbtypes.String("space-1"), + }, + }, + }, + Error: &pb.RpcObjectSearchResponseError{Code: pb.RpcObjectSearchResponseError_NULL}, + }).Once() + + // Mock workspace opening + fx.mwMock.On("WorkspaceOpen", mock.Anything, &pb.RpcWorkspaceOpenRequest{ + SpaceId: "space-1", + WithChat: true, + }).Return(&pb.RpcWorkspaceOpenResponse{ + Info: &model.AccountInfo{ + TechSpaceId: "space-1", + }, + Error: &pb.RpcWorkspaceOpenResponseError{Code: pb.RpcWorkspaceOpenResponseError_NULL}, + }).Once() + + // Mock objects in space-1 + fx.mwMock.On("ObjectSearch", mock.Anything, mock.Anything).Return(&pb.RpcObjectSearchResponse{ + Records: []*types.Struct{ + { + Fields: map[string]*types.Value{ + "id": pbtypes.String("obj-global-1"), + "name": pbtypes.String("Global Object"), + "type": pbtypes.String("global-type-id"), + "layout": pbtypes.Float64(float64(model.ObjectType_basic)), + "iconEmoji": pbtypes.String("🌐"), + "lastModifiedDate": pbtypes.Float64(999999), + }, + }, + }, + Error: &pb.RpcObjectSearchResponseError{Code: pb.RpcObjectSearchResponseError_NULL}, + }).Twice() + + // Mock object show for object blocks and details + fx.mwMock.On("ObjectShow", mock.Anything, &pb.RpcObjectShowRequest{ + SpaceId: "space-1", + ObjectId: "obj-global-1", + }).Return(&pb.RpcObjectShowResponse{ + ObjectView: &model.ObjectView{ + RootId: "root-123", + Blocks: []*model.Block{ + { + Id: "root-123", + Restrictions: &model.BlockRestrictions{ + Read: false, + Edit: false, + Remove: false, + Drag: false, + DropOn: false, + }, + ChildrenIds: []string{"header", "text-block", "relation-block"}, + }, + { + Id: "header", + Restrictions: &model.BlockRestrictions{ + Read: false, + Edit: true, + Remove: true, + Drag: true, + DropOn: true, + }, + ChildrenIds: []string{"title", "featuredRelations"}, + }, + { + Id: "text-block", + Content: &model.BlockContentOfText{ + Text: &model.BlockContentText{ + Text: "This is a sample text block", + Style: model.BlockContentText_Paragraph, + }, + }, + }, + }, + Details: []*model.ObjectViewDetailsSet{ + { + Id: "root-123", + Details: &types.Struct{ + Fields: map[string]*types.Value{ + "name": pbtypes.String("Global Object"), + "iconEmoji": pbtypes.String("🌐"), + "lastModifiedDate": pbtypes.Float64(999999), + "createdDate": pbtypes.Float64(888888), + "tag": pbtypes.StringList([]string{"tag-1", "tag-2"}), + }, + }, + }, + { + Id: "tag-1", + Details: &types.Struct{ + Fields: map[string]*types.Value{ + "name": pbtypes.String("Important"), + "relationOptionColor": pbtypes.String("red"), + }, + }, + }, + { + Id: "tag-2", + Details: &types.Struct{ + Fields: map[string]*types.Value{ + "name": pbtypes.String("Optional"), + "relationOptionColor": pbtypes.String("blue"), + }, + }, + }, + }, + }, + Error: &pb.RpcObjectShowResponseError{Code: pb.RpcObjectShowResponseError_NULL}, + }, nil).Once() + + // when + objects, _, _, err := fx.Search(ctx, "search-term", "", offset, limit) + + // then + require.NoError(t, err) + require.Len(t, objects, 1) + require.Equal(t, "space-1", objects[0].SpaceId) + require.Equal(t, "Global Object", objects[0].Name) + require.Equal(t, "obj-global-1", objects[0].Id) + require.Equal(t, "🌐", objects[0].Icon) + require.Equal(t, "basic", objects[0].Type) + require.Equal(t, "This is a sample text block", objects[0].Blocks[2].Text.Text) + + // check details + for _, detail := range objects[0].Details { + if detail.Id == "createdDate" { + require.Equal(t, float64(888888), detail.Details["createdDate"]) + } else if detail.Id == "lastModifiedDate" { + require.Equal(t, float64(999999), detail.Details["lastModifiedDate"]) + } + } + + // check tags + tags := []object.Tag{} + for _, detail := range objects[0].Details { + if tagList, ok := detail.Details["tags"].([]object.Tag); ok { + for _, tag := range tagList { + tags = append(tags, tag) + } + } + } + require.Len(t, tags, 2) + require.Equal(t, "tag-1", tags[0].Id) + require.Equal(t, "Important", tags[0].Name) + require.Equal(t, "red", tags[0].Color) + require.Equal(t, "tag-2", tags[1].Id) + require.Equal(t, "Optional", tags[1].Name) + require.Equal(t, "blue", tags[1].Color) + }) +} From 3520002beefec430088bf18751d90f460fcee213 Mon Sep 17 00:00:00 2001 From: Jannis Metrikat <120120832+jmetrikat@users.noreply.github.com> Date: Wed, 1 Jan 2025 15:21:28 +0100 Subject: [PATCH 073/195] GO-4459: Refactor object service, add tests again --- cmd/api/docs/docs.go | 32 +- cmd/api/docs/swagger.json | 32 +- cmd/api/docs/swagger.yaml | 22 +- cmd/api/object/handler.go | 341 +++++--------------- cmd/api/object/model.go | 24 ++ cmd/api/object/service.go | 329 +++++++++++++++++-- cmd/api/object/service_test.go | 568 +++++++++++++++++++++++++++++++++ cmd/api/server/router.go | 4 +- cmd/api/util/util.go | 1 + 9 files changed, 1052 insertions(+), 301 deletions(-) create mode 100644 cmd/api/object/service_test.go diff --git a/cmd/api/docs/docs.go b/cmd/api/docs/docs.go index 54924da3c..0998e883d 100644 --- a/cmd/api/docs/docs.go +++ b/cmd/api/docs/docs.go @@ -578,7 +578,13 @@ const docTemplate = `{ "200": { "description": "The created object", "schema": { - "$ref": "#/definitions/object.Object" + "$ref": "#/definitions/object.CreateObjectResponse" + } + }, + "400": { + "description": "Bad request", + "schema": { + "$ref": "#/definitions/util.ValidationError" } }, "403": { @@ -691,7 +697,13 @@ const docTemplate = `{ "200": { "description": "The updated object", "schema": { - "$ref": "#/definitions/object.Object" + "$ref": "#/definitions/object.UpdateObjectResponse" + } + }, + "400": { + "description": "Bad request", + "schema": { + "$ref": "#/definitions/util.ValidationError" } }, "403": { @@ -768,6 +780,14 @@ const docTemplate = `{ } } }, + "object.CreateObjectResponse": { + "type": "object", + "properties": { + "object": { + "$ref": "#/definitions/object.Object" + } + } + }, "object.Detail": { "type": "object", "properties": { @@ -922,6 +942,14 @@ const docTemplate = `{ } } }, + "object.UpdateObjectResponse": { + "type": "object", + "properties": { + "object": { + "$ref": "#/definitions/object.Object" + } + } + }, "pagination.PaginatedResponse-space_Member": { "type": "object", "properties": { diff --git a/cmd/api/docs/swagger.json b/cmd/api/docs/swagger.json index d81a69838..1aa508608 100644 --- a/cmd/api/docs/swagger.json +++ b/cmd/api/docs/swagger.json @@ -572,7 +572,13 @@ "200": { "description": "The created object", "schema": { - "$ref": "#/definitions/object.Object" + "$ref": "#/definitions/object.CreateObjectResponse" + } + }, + "400": { + "description": "Bad request", + "schema": { + "$ref": "#/definitions/util.ValidationError" } }, "403": { @@ -685,7 +691,13 @@ "200": { "description": "The updated object", "schema": { - "$ref": "#/definitions/object.Object" + "$ref": "#/definitions/object.UpdateObjectResponse" + } + }, + "400": { + "description": "Bad request", + "schema": { + "$ref": "#/definitions/util.ValidationError" } }, "403": { @@ -762,6 +774,14 @@ } } }, + "object.CreateObjectResponse": { + "type": "object", + "properties": { + "object": { + "$ref": "#/definitions/object.Object" + } + } + }, "object.Detail": { "type": "object", "properties": { @@ -916,6 +936,14 @@ } } }, + "object.UpdateObjectResponse": { + "type": "object", + "properties": { + "object": { + "$ref": "#/definitions/object.Object" + } + } + }, "pagination.PaginatedResponse-space_Member": { "type": "object", "properties": { diff --git a/cmd/api/docs/swagger.yaml b/cmd/api/docs/swagger.yaml index 402548ae1..98042165f 100644 --- a/cmd/api/docs/swagger.yaml +++ b/cmd/api/docs/swagger.yaml @@ -34,6 +34,11 @@ definitions: vertical_align: type: string type: object + object.CreateObjectResponse: + properties: + object: + $ref: '#/definitions/object.Object' + type: object object.Detail: properties: details: @@ -140,6 +145,11 @@ definitions: text: type: string type: object + object.UpdateObjectResponse: + properties: + object: + $ref: '#/definitions/object.Object' + type: object pagination.PaginatedResponse-space_Member: properties: data: @@ -687,7 +697,11 @@ paths: "200": description: The created object schema: - $ref: '#/definitions/object.Object' + $ref: '#/definitions/object.CreateObjectResponse' + "400": + description: Bad request + schema: + $ref: '#/definitions/util.ValidationError' "403": description: Unauthorized schema: @@ -762,7 +776,11 @@ paths: "200": description: The updated object schema: - $ref: '#/definitions/object.Object' + $ref: '#/definitions/object.UpdateObjectResponse' + "400": + description: Bad request + schema: + $ref: '#/definitions/util.ValidationError' "403": description: Unauthorized schema: diff --git a/cmd/api/object/handler.go b/cmd/api/object/handler.go index b7be68fe9..94e81de6d 100644 --- a/cmd/api/object/handler.go +++ b/cmd/api/object/handler.go @@ -4,24 +4,11 @@ import ( "net/http" "github.com/gin-gonic/gin" - "github.com/gogo/protobuf/types" "github.com/anyproto/anytype-heart/cmd/api/pagination" "github.com/anyproto/anytype-heart/cmd/api/util" - "github.com/anyproto/anytype-heart/pb" - "github.com/anyproto/anytype-heart/pkg/lib/bundle" - "github.com/anyproto/anytype-heart/pkg/lib/pb/model" - "github.com/anyproto/anytype-heart/util/pbtypes" ) -type CreateObjectRequest struct { - Name string `json:"name"` - Icon string `json:"icon"` - TemplateId string `json:"template_id"` - ObjectTypeUniqueKey string `json:"object_type_unique_key"` - WithChat bool `json:"with_chat"` -} - // GetObjectsHandler retrieves objects in a specific space // // @Summary Retrieve objects in a specific space @@ -42,77 +29,19 @@ func GetObjectsHandler(s *ObjectService) gin.HandlerFunc { offset := c.GetInt("offset") limit := c.GetInt("limit") - resp := s.mw.ObjectSearch(c.Request.Context(), &pb.RpcObjectSearchRequest{ - SpaceId: spaceId, - Filters: []*model.BlockContentDataviewFilter{ - { - RelationKey: bundle.RelationKeyLayout.String(), - Condition: model.BlockContentDataviewFilter_In, - Value: pbtypes.IntList([]int{ - int(model.ObjectType_basic), - int(model.ObjectType_profile), - int(model.ObjectType_todo), - int(model.ObjectType_note), - int(model.ObjectType_bookmark), - int(model.ObjectType_set), - int(model.ObjectType_collection), - int(model.ObjectType_participant), - }...), - }, - }, - Sorts: []*model.BlockContentDataviewSort{{ - RelationKey: bundle.RelationKeyLastModifiedDate.String(), - Type: model.BlockContentDataviewSort_Desc, - Format: model.RelationFormat_longtext, - IncludeTime: true, - EmptyPlacement: model.BlockContentDataviewSort_NotSpecified, - }}, - Keys: []string{"id", "name", "type", "layout", "iconEmoji", "iconImage"}, - }) + objects, total, hasMore, err := s.ListObjects(c.Request.Context(), spaceId, offset, limit) + code := util.MapErrorCode(err, + util.ErrToCode(ErrorFailedRetrieveObjects, http.StatusInternalServerError), + util.ErrToCode(ErrNoObjectsFound, http.StatusNotFound), + ) - if resp.Error.Code != pb.RpcObjectSearchResponseError_NULL { - c.JSON(http.StatusInternalServerError, gin.H{"message": "Failed to retrieve list of objects."}) + if code != http.StatusOK { + apiErr := util.CodeToAPIError(code, err.Error()) + c.JSON(code, apiErr) return } - if len(resp.Records) == 0 { - c.JSON(http.StatusNotFound, gin.H{"message": "No objects found."}) - return - } - - paginatedObjects, hasMore := pagination.Paginate(resp.Records, offset, limit) - objects := make([]Object, 0, len(paginatedObjects)) - - for _, record := range paginatedObjects { - icon := util.GetIconFromEmojiOrImage(s.AccountInfo, record.Fields["iconEmoji"].GetStringValue(), record.Fields["iconImage"].GetStringValue()) - objectTypeName, err := util.ResolveTypeToName(s.mw, spaceId, record.Fields["type"].GetStringValue()) - if err != nil { - c.JSON(http.StatusInternalServerError, gin.H{"message": "Failed to resolve object type name."}) - return - } - - objectShowResp := s.mw.ObjectShow(c.Request.Context(), &pb.RpcObjectShowRequest{ - SpaceId: spaceId, - ObjectId: record.Fields["id"].GetStringValue(), - }) - - object := Object{ - // TODO fix type inconsistency - Type: model.ObjectTypeLayout_name[int32(record.Fields["layout"].GetNumberValue())], - Id: record.Fields["id"].GetStringValue(), - Name: record.Fields["name"].GetStringValue(), - Icon: icon, - ObjectType: objectTypeName, - SpaceId: spaceId, - RootId: objectShowResp.ObjectView.RootId, - Blocks: s.GetBlocks(objectShowResp), - Details: s.GetDetails(objectShowResp), - } - - objects = append(objects, object) - } - - pagination.RespondWithPagination(c, http.StatusOK, objects, len(resp.Records), offset, limit, hasMore) + pagination.RespondWithPagination(c, http.StatusOK, objects, total, offset, limit, hasMore) } } @@ -134,38 +63,19 @@ func GetObjectHandler(s *ObjectService) gin.HandlerFunc { spaceId := c.Param("space_id") objectId := c.Param("object_id") - resp := s.mw.ObjectShow(c.Request.Context(), &pb.RpcObjectShowRequest{ - SpaceId: spaceId, - ObjectId: objectId, - }) + object, err := s.GetObject(c.Request.Context(), spaceId, objectId) + code := util.MapErrorCode(err, + util.ErrToCode(ErrObjectNotFound, http.StatusNotFound), + util.ErrToCode(ErrFailedRetrieveObject, http.StatusInternalServerError), + ) - if resp.Error.Code != pb.RpcObjectShowResponseError_NULL { - if resp.Error.Code == pb.RpcObjectShowResponseError_NOT_FOUND { - c.JSON(http.StatusNotFound, gin.H{"message": "Object not found", "space_id": spaceId, "object_id": objectId}) - return - } - c.JSON(http.StatusInternalServerError, gin.H{"message": "Failed to retrieve object."}) + if code != http.StatusOK { + apiErr := util.CodeToAPIError(code, err.Error()) + c.JSON(code, apiErr) return } - objectTypeName, err := util.ResolveTypeToName(s.mw, spaceId, resp.ObjectView.Details[0].Details.Fields["type"].GetStringValue()) - if err != nil { - c.JSON(http.StatusInternalServerError, gin.H{"message": "Failed to resolve object type name."}) - return - } - - object := Object{ - Type: "object", - Id: objectId, - Name: resp.ObjectView.Details[0].Details.Fields["name"].GetStringValue(), - Icon: resp.ObjectView.Details[0].Details.Fields["iconEmoji"].GetStringValue(), - ObjectType: objectTypeName, - RootId: resp.ObjectView.RootId, - Blocks: s.GetBlocks(resp), - Details: s.GetDetails(resp), - } - - c.JSON(http.StatusOK, gin.H{"object": object}) + c.JSON(http.StatusOK, GetObjectResponse{Object: object}) } } @@ -177,7 +87,8 @@ func GetObjectHandler(s *ObjectService) gin.HandlerFunc { // @Produce json // @Param space_id path string true "The ID of the space" // @Param object body map[string]string true "Object details (e.g., name)" -// @Success 200 {object} Object "The created object" +// @Success 200 {object} CreateObjectResponse "The created object" +// @Failure 400 {object} util.ValidationError "Bad request" // @Failure 403 {object} util.UnauthorizedError "Unauthorized" // @Failure 502 {object} util.ServerError "Internal server error" // @Router /spaces/{space_id}/objects [post] @@ -187,42 +98,23 @@ func CreateObjectHandler(s *ObjectService) gin.HandlerFunc { request := CreateObjectRequest{} if err := c.BindJSON(&request); err != nil { - c.JSON(http.StatusBadRequest, gin.H{"message": "Invalid JSON"}) + c.JSON(http.StatusBadRequest, util.CodeToAPIError(http.StatusBadRequest, ErrBadInput.Error())) return } - resp := s.mw.ObjectCreate(c.Request.Context(), &pb.RpcObjectCreateRequest{ - Details: &types.Struct{ - Fields: map[string]*types.Value{ - "name": pbtypes.String(request.Name), - "iconEmoji": pbtypes.String(request.Icon), - }, - }, - TemplateId: request.TemplateId, - SpaceId: spaceId, - ObjectTypeUniqueKey: request.ObjectTypeUniqueKey, - WithChat: request.WithChat, - }) + object, err := s.CreateObject(c.Request.Context(), spaceId, request) + code := util.MapErrorCode(err, + util.ErrToCode(ErrFailedCreateObject, http.StatusInternalServerError), + util.ErrToCode(ErrFailedRetrieveObject, http.StatusInternalServerError), + ) - if resp.Error.Code != pb.RpcObjectCreateResponseError_NULL { - c.JSON(http.StatusInternalServerError, gin.H{"message": "Failed to create a new object."}) + if code != http.StatusOK { + apiErr := util.CodeToAPIError(code, err.Error()) + c.JSON(code, apiErr) return } - object := Object{ - Type: "object", - Id: resp.ObjectId, - Name: resp.Details.Fields["name"].GetStringValue(), - Icon: resp.Details.Fields["iconEmoji"].GetStringValue(), - ObjectType: request.ObjectTypeUniqueKey, - SpaceId: resp.Details.Fields["spaceId"].GetStringValue(), - // TODO populate other fields - // RootId: resp.RootId, - // Blocks: []Block{}, - // Details: []Detail{}, - } - - c.JSON(http.StatusOK, gin.H{"object": object}) + c.JSON(http.StatusOK, CreateObjectResponse{Object: object}) } } @@ -235,7 +127,8 @@ func CreateObjectHandler(s *ObjectService) gin.HandlerFunc { // @Param space_id path string true "The ID of the space" // @Param object_id path string true "The ID of the object" // @Param object body Object true "The updated object details" -// @Success 200 {object} Object "The updated object" +// @Success 200 {object} UpdateObjectResponse "The updated object" +// @Failure 400 {object} util.ValidationError "Bad request" // @Failure 403 {object} util.UnauthorizedError "Unauthorized" // @Failure 404 {object} util.NotFoundError "Resource not found" // @Failure 502 {object} util.ServerError "Internal server error" @@ -244,12 +137,31 @@ func UpdateObjectHandler(s *ObjectService) gin.HandlerFunc { return func(c *gin.Context) { spaceId := c.Param("space_id") objectId := c.Param("object_id") - // TODO: Implement logic to update an existing object - c.JSON(http.StatusNotImplemented, gin.H{"message": "Not implemented yet", "space_id": spaceId, "object_id": objectId}) + + request := UpdateObjectRequest{} + if err := c.BindJSON(&request); err != nil { + c.JSON(http.StatusBadRequest, util.CodeToAPIError(http.StatusBadRequest, ErrBadInput.Error())) + return + } + + object, err := s.UpdateObject(c.Request.Context(), spaceId, objectId, request) + code := util.MapErrorCode(err, + util.ErrToCode(ErrNotImplemented, http.StatusNotImplemented), + util.ErrToCode(ErrFailedUpdateObject, http.StatusInternalServerError), + util.ErrToCode(ErrFailedRetrieveObject, http.StatusInternalServerError), + ) + + if code != http.StatusOK { + apiErr := util.CodeToAPIError(code, err.Error()) + c.JSON(code, apiErr) + return + } + + c.JSON(http.StatusNotImplemented, UpdateObjectResponse{Object: object}) } } -// GetObjectTypesHandler retrieves object types in a specific space +// GetTypesHandler retrieves object types in a specific space // // @Summary Retrieve object types in a specific space // @Tags types_and_templates @@ -263,63 +175,29 @@ func UpdateObjectHandler(s *ObjectService) gin.HandlerFunc { // @Failure 404 {object} util.NotFoundError "Resource not found" // @Failure 502 {object} util.ServerError "Internal server error" // @Router /spaces/{space_id}/objectTypes [get] -func GetObjectTypesHandler(s *ObjectService) gin.HandlerFunc { +func GetTypesHandler(s *ObjectService) gin.HandlerFunc { return func(c *gin.Context) { spaceId := c.Param("space_id") offset := c.GetInt("offset") limit := c.GetInt("limit") - resp := s.mw.ObjectSearch(c.Request.Context(), &pb.RpcObjectSearchRequest{ - SpaceId: spaceId, - Filters: []*model.BlockContentDataviewFilter{ - { - RelationKey: bundle.RelationKeyLayout.String(), - Condition: model.BlockContentDataviewFilter_Equal, - Value: pbtypes.Int64(int64(model.ObjectType_objectType)), - }, - { - RelationKey: bundle.RelationKeyIsHidden.String(), - Condition: model.BlockContentDataviewFilter_NotEqual, - Value: pbtypes.Bool(true), - }, - }, - Sorts: []*model.BlockContentDataviewSort{ - { - RelationKey: "name", - Type: model.BlockContentDataviewSort_Asc, - }, - }, - Keys: []string{"id", "uniqueKey", "name", "iconEmoji"}, - }) + types, total, hasMore, err := s.ListTypes(c.Request.Context(), spaceId, offset, limit) + code := util.MapErrorCode(err, + util.ErrToCode(ErrFailedRetrieveTypes, http.StatusInternalServerError), + util.ErrToCode(ErrNoTypesFound, http.StatusNotFound), + ) - if resp.Error.Code != pb.RpcObjectSearchResponseError_NULL { - c.JSON(http.StatusInternalServerError, gin.H{"message": "Failed to retrieve object types."}) + if code != http.StatusOK { + apiErr := util.CodeToAPIError(code, err.Error()) + c.JSON(code, apiErr) return } - if len(resp.Records) == 0 { - c.JSON(http.StatusNotFound, gin.H{"message": "No object types found."}) - return - } - - paginatedTypes, hasMore := pagination.Paginate(resp.Records, offset, limit) - objectTypes := make([]ObjectType, 0, len(paginatedTypes)) - - for _, record := range paginatedTypes { - objectTypes = append(objectTypes, ObjectType{ - Type: "object_type", - Id: record.Fields["id"].GetStringValue(), - UniqueKey: record.Fields["uniqueKey"].GetStringValue(), - Name: record.Fields["name"].GetStringValue(), - Icon: record.Fields["iconEmoji"].GetStringValue(), - }) - } - - pagination.RespondWithPagination(c, http.StatusOK, objectTypes, len(resp.Records), offset, limit, hasMore) + pagination.RespondWithPagination(c, http.StatusOK, types, total, offset, limit, hasMore) } } -// GetObjectTypeTemplatesHandler retrieves a list of templates for a specific object type in a space +// GetTemplatesHandler retrieves a list of templates for a specific object type in a space // // @Summary Retrieve a list of templates for a specific object type in a space // @Tags types_and_templates @@ -334,91 +212,28 @@ func GetObjectTypesHandler(s *ObjectService) gin.HandlerFunc { // @Failure 404 {object} util.NotFoundError "Resource not found" // @Failure 502 {object} util.ServerError "Internal server error" // @Router /spaces/{space_id}/objectTypes/{typeId}/templates [get] -func GetObjectTypeTemplatesHandler(s *ObjectService) gin.HandlerFunc { +func GetTemplatesHandler(s *ObjectService) gin.HandlerFunc { return func(c *gin.Context) { spaceId := c.Param("space_id") typeId := c.Param("typeId") offset := c.GetInt("offset") limit := c.GetInt("limit") - // First, determine the type ID of "ot-template" in the space - templateTypeIdResp := s.mw.ObjectSearch(c.Request.Context(), &pb.RpcObjectSearchRequest{ - SpaceId: spaceId, - Filters: []*model.BlockContentDataviewFilter{ - { - RelationKey: bundle.RelationKeyUniqueKey.String(), - Condition: model.BlockContentDataviewFilter_Equal, - Value: pbtypes.String("ot-template"), - }, - }, - Keys: []string{"id"}, - }) + templates, total, hasMore, err := s.ListTemplates(c.Request.Context(), spaceId, typeId, offset, limit) + code := util.MapErrorCode(err, + util.ErrToCode(ErrFailedRetrieveTemplateType, http.StatusInternalServerError), + util.ErrToCode(ErrTemplateTypeNotFound, http.StatusNotFound), + util.ErrToCode(ErrFailedRetrieveTemplates, http.StatusInternalServerError), + util.ErrToCode(ErrFailedRetrieveTemplate, http.StatusInternalServerError), + util.ErrToCode(ErrNoTemplatesFound, http.StatusNotFound), + ) - if templateTypeIdResp.Error.Code != pb.RpcObjectSearchResponseError_NULL { - c.JSON(http.StatusInternalServerError, gin.H{"message": "Failed to retrieve template type."}) + if code != http.StatusOK { + apiErr := util.CodeToAPIError(code, err.Error()) + c.JSON(code, apiErr) return } - if len(templateTypeIdResp.Records) == 0 { - c.JSON(http.StatusNotFound, gin.H{"message": "Template type not found."}) - return - } - - templateTypeId := templateTypeIdResp.Records[0].Fields["id"].GetStringValue() - - // Then, search all objects of the template type and filter by the target object type - templateObjectsResp := s.mw.ObjectSearch(c.Request.Context(), &pb.RpcObjectSearchRequest{ - SpaceId: spaceId, - Filters: []*model.BlockContentDataviewFilter{ - { - RelationKey: bundle.RelationKeyType.String(), - Condition: model.BlockContentDataviewFilter_Equal, - Value: pbtypes.String(templateTypeId), - }, - }, - Keys: []string{"id", "targetObjectType", "name", "iconEmoji"}, - }) - - if templateObjectsResp.Error.Code != pb.RpcObjectSearchResponseError_NULL { - c.JSON(http.StatusInternalServerError, gin.H{"message": "Failed to retrieve template objects."}) - return - } - - if len(templateObjectsResp.Records) == 0 { - c.JSON(http.StatusNotFound, gin.H{"message": "No templates found."}) - return - } - - templateIds := make([]string, 0) - for _, record := range templateObjectsResp.Records { - if record.Fields["targetObjectType"].GetStringValue() == typeId { - templateIds = append(templateIds, record.Fields["id"].GetStringValue()) - } - } - - // Finally, open each template and populate the response - paginatedTemplates, hasMore := pagination.Paginate(templateIds, offset, limit) - templates := make([]ObjectTemplate, 0, len(paginatedTemplates)) - - for _, templateId := range paginatedTemplates { - templateResp := s.mw.ObjectShow(c.Request.Context(), &pb.RpcObjectShowRequest{ - SpaceId: spaceId, - ObjectId: templateId, - }) - - if templateResp.Error.Code != pb.RpcObjectShowResponseError_NULL { - c.JSON(http.StatusInternalServerError, gin.H{"message": "Failed to retrieve template."}) - return - } - - templates = append(templates, ObjectTemplate{ - Type: "object_template", - Id: templateId, - Name: templateResp.ObjectView.Details[0].Details.Fields["name"].GetStringValue(), - Icon: templateResp.ObjectView.Details[0].Details.Fields["iconEmoji"].GetStringValue(), - }) - } - - pagination.RespondWithPagination(c, http.StatusOK, templates, len(templateIds), offset, limit, hasMore) + pagination.RespondWithPagination(c, http.StatusOK, templates, total, offset, limit, hasMore) } } diff --git a/cmd/api/object/model.go b/cmd/api/object/model.go index a77d6b94f..96f714a73 100644 --- a/cmd/api/object/model.go +++ b/cmd/api/object/model.go @@ -1,5 +1,29 @@ package object +type GetObjectResponse struct { + Object Object `json:"object"` +} + +type CreateObjectRequest struct { + Name string `json:"name"` + Icon string `json:"icon"` + TemplateId string `json:"template_id"` + ObjectTypeUniqueKey string `json:"object_type_unique_key"` + WithChat bool `json:"with_chat"` +} + +type CreateObjectResponse struct { + Object Object `json:"object"` +} + +type UpdateObjectRequest struct { + Object Object `json:"object"` +} + +type UpdateObjectResponse struct { + Object Object `json:"object"` +} + type Object struct { Type string `json:"type" example:"object"` Id string `json:"id" example:"bafyreie6n5l5nkbjal37su54cha4coy7qzuhrnajluzv5qd5jvtsrxkequ"` diff --git a/cmd/api/object/service.go b/cmd/api/object/service.go index 34be383f1..d2362b370 100644 --- a/cmd/api/object/service.go +++ b/cmd/api/object/service.go @@ -1,27 +1,45 @@ package object import ( + "context" "errors" + "github.com/gogo/protobuf/types" + + "github.com/anyproto/anytype-heart/cmd/api/pagination" "github.com/anyproto/anytype-heart/cmd/api/util" "github.com/anyproto/anytype-heart/pb" "github.com/anyproto/anytype-heart/pb/service" + "github.com/anyproto/anytype-heart/pkg/lib/bundle" "github.com/anyproto/anytype-heart/pkg/lib/pb/model" + "github.com/anyproto/anytype-heart/util/pbtypes" ) var ( - ErrFailedGenerateChallenge = errors.New("failed to generate a new challenge") - ErrInvalidInput = errors.New("invalid input") - ErrorFailedAuthenticate = errors.New("failed to authenticate user") + ErrObjectNotFound = errors.New("object not found") + ErrFailedRetrieveObject = errors.New("failed to retrieve object") + ErrorFailedRetrieveObjects = errors.New("failed to retrieve list of objects") + ErrNoObjectsFound = errors.New("no objects found") + ErrFailedCreateObject = errors.New("failed to create object") + ErrBadInput = errors.New("bad input") + ErrNotImplemented = errors.New("not implemented") + ErrFailedUpdateObject = errors.New("failed to update object") + ErrFailedRetrieveTypes = errors.New("failed to retrieve types") + ErrNoTypesFound = errors.New("no types found") + ErrFailedRetrieveTemplateType = errors.New("failed to retrieve template type") + ErrTemplateTypeNotFound = errors.New("template type not found") + ErrFailedRetrieveTemplate = errors.New("failed to retrieve template") + ErrFailedRetrieveTemplates = errors.New("failed to retrieve templates") + ErrNoTemplatesFound = errors.New("no templates found") ) type Service interface { - ListObjects() ([]Object, error) - GetObject(id string) (Object, error) - CreateObject(obj Object) (Object, error) - UpdateObject(obj Object) (Object, error) - ListTypes() ([]ObjectType, error) - ListTemplates() ([]ObjectTemplate, error) + ListObjects(ctx context.Context, spaceId string, offset int, limit int) ([]Object, int, bool, error) + GetObject(ctx context.Context, spaceId string, objectId string) (Object, error) + CreateObject(ctx context.Context, spaceId string, obj Object) (Object, error) + UpdateObject(ctx context.Context, spaceId string, obj Object) (Object, error) + ListTypes(ctx context.Context, spaceId string, offset int, limit int) ([]ObjectType, int, bool, error) + ListTemplates(ctx context.Context, spaceId string, typeId string, offset int, limit int) ([]ObjectTemplate, int, bool, error) } type ObjectService struct { @@ -29,41 +47,290 @@ type ObjectService struct { AccountInfo *model.AccountInfo } +// NewService creates a new object service func NewService(mw service.ClientCommandsServer) *ObjectService { return &ObjectService{mw: mw} } -func (s *ObjectService) ListObjects() ([]Object, error) { - // TODO - return nil, nil +// ListObjects retrieves a list of objects in a specific space +func (s *ObjectService) ListObjects(ctx context.Context, spaceId string, offset int, limit int) (objects []Object, total int, hasMore bool, err error) { + resp := s.mw.ObjectSearch(ctx, &pb.RpcObjectSearchRequest{ + SpaceId: spaceId, + Filters: []*model.BlockContentDataviewFilter{ + { + RelationKey: bundle.RelationKeyLayout.String(), + Condition: model.BlockContentDataviewFilter_In, + Value: pbtypes.IntList([]int{ + int(model.ObjectType_basic), + int(model.ObjectType_profile), + int(model.ObjectType_todo), + int(model.ObjectType_note), + int(model.ObjectType_bookmark), + int(model.ObjectType_set), + int(model.ObjectType_collection), + int(model.ObjectType_participant), + }...), + }, + }, + Sorts: []*model.BlockContentDataviewSort{{ + RelationKey: bundle.RelationKeyLastModifiedDate.String(), + Type: model.BlockContentDataviewSort_Desc, + Format: model.RelationFormat_longtext, + IncludeTime: true, + EmptyPlacement: model.BlockContentDataviewSort_NotSpecified, + }}, + FullText: "", + Offset: 0, + Limit: 0, + ObjectTypeFilter: []string{}, + Keys: []string{"id", "name", "type", "layout", "iconEmoji", "iconImage"}, + }) + + if resp.Error.Code != pb.RpcObjectSearchResponseError_NULL { + return nil, 0, false, ErrorFailedRetrieveObjects + } + + if len(resp.Records) == 0 { + return nil, 0, false, ErrNoObjectsFound + } + + total = len(resp.Records) + paginatedObjects, hasMore := pagination.Paginate(resp.Records, offset, limit) + objects = make([]Object, 0, len(paginatedObjects)) + + for _, record := range paginatedObjects { + object, err := s.GetObject(ctx, spaceId, record.Fields["id"].GetStringValue()) + if err != nil { + return nil, 0, false, err + } + + // TODO: layout is not correctly returned in ObjectShow; therefore we need to resolve it here + object.Type = model.ObjectTypeLayout_name[int32(record.Fields["layout"].GetNumberValue())] + + objects = append(objects, object) + } + return objects, total, hasMore, nil } -func (s *ObjectService) GetObject(id string) (Object, error) { - // TODO - return Object{}, nil +// GetObject retrieves a single object by its ID in a specific space +func (s *ObjectService) GetObject(ctx context.Context, spaceId string, objectId string) (Object, error) { + resp := s.mw.ObjectShow(ctx, &pb.RpcObjectShowRequest{ + SpaceId: spaceId, + ObjectId: objectId, + }) + + if resp.Error.Code == pb.RpcObjectShowResponseError_NOT_FOUND { + return Object{}, ErrObjectNotFound + } + + if resp.Error.Code != pb.RpcObjectShowResponseError_NULL { + return Object{}, ErrFailedRetrieveObject + } + + icon := util.GetIconFromEmojiOrImage(s.AccountInfo, resp.ObjectView.Details[0].Details.Fields["iconEmoji"].GetStringValue(), resp.ObjectView.Details[0].Details.Fields["iconImage"].GetStringValue()) + objectTypeName, err := util.ResolveTypeToName(s.mw, spaceId, resp.ObjectView.Details[0].Details.Fields["type"].GetStringValue()) + if err != nil { + return Object{}, err + } + + object := Object{ + Type: "object", + Id: resp.ObjectView.Details[0].Details.Fields["id"].GetStringValue(), + Name: resp.ObjectView.Details[0].Details.Fields["name"].GetStringValue(), + Icon: icon, + ObjectType: objectTypeName, + SpaceId: resp.ObjectView.Details[0].Details.Fields["spaceId"].GetStringValue(), + RootId: resp.ObjectView.RootId, + Blocks: s.GetBlocks(resp), + Details: s.GetDetails(resp), + } + + return object, nil } -func (s *ObjectService) CreateObject(obj Object) (Object, error) { - // TODO - return Object{}, nil +// CreateObject creates a new object in a specific space +func (s *ObjectService) CreateObject(ctx context.Context, spaceId string, request CreateObjectRequest) (Object, error) { + resp := s.mw.ObjectCreate(ctx, &pb.RpcObjectCreateRequest{ + Details: &types.Struct{ + Fields: map[string]*types.Value{ + "name": pbtypes.String(request.Name), + "iconEmoji": pbtypes.String(request.Icon), + }, + }, + TemplateId: request.TemplateId, + SpaceId: spaceId, + ObjectTypeUniqueKey: request.ObjectTypeUniqueKey, + WithChat: request.WithChat, + }) + + if resp.Error.Code != pb.RpcObjectCreateResponseError_NULL { + return Object{}, ErrFailedCreateObject + } + + objShowResp := s.mw.ObjectShow(ctx, &pb.RpcObjectShowRequest{ + SpaceId: spaceId, + ObjectId: resp.ObjectId, + }) + + if objShowResp.Error.Code != pb.RpcObjectShowResponseError_NULL { + return Object{}, ErrFailedRetrieveObject + } + + icon2 := util.GetIconFromEmojiOrImage(s.AccountInfo, objShowResp.ObjectView.Details[0].Details.Fields["iconEmoji"].GetStringValue(), objShowResp.ObjectView.Details[0].Details.Fields["iconImage"].GetStringValue()) + objectTypeName, err := util.ResolveTypeToName(s.mw, spaceId, objShowResp.ObjectView.Details[0].Details.Fields["type"].GetStringValue()) + if err != nil { + return Object{}, err + } + + object := Object{ + Type: "object", + Id: resp.ObjectId, + Name: objShowResp.ObjectView.Details[0].Details.Fields["name"].GetStringValue(), + Icon: icon2, + ObjectType: objectTypeName, + SpaceId: objShowResp.ObjectView.Details[0].Details.Fields["spaceId"].GetStringValue(), + RootId: objShowResp.ObjectView.RootId, + Blocks: s.GetBlocks(objShowResp), + Details: s.GetDetails(objShowResp), + } + + return object, nil } -func (s *ObjectService) UpdateObject(obj Object) (Object, error) { - // TODO - return Object{}, nil +// UpdateObject updates an existing object in a specific space +func (s *ObjectService) UpdateObject(ctx context.Context, spaceId string, objectId string, request UpdateObjectRequest) (Object, error) { + // TODO: Implement logic to update an existing object + return Object{}, ErrNotImplemented } -func (s *ObjectService) ListTypes() ([]ObjectType, error) { - // TODO - return nil, nil +// ListTypes returns the list of types in a specific space +func (s *ObjectService) ListTypes(ctx context.Context, spaceId string, offset int, limit int) (types []ObjectType, total int, hasMore bool, err error) { + resp := s.mw.ObjectSearch(ctx, &pb.RpcObjectSearchRequest{ + SpaceId: spaceId, + Filters: []*model.BlockContentDataviewFilter{ + { + RelationKey: bundle.RelationKeyLayout.String(), + Condition: model.BlockContentDataviewFilter_Equal, + Value: pbtypes.Int64(int64(model.ObjectType_objectType)), + }, + { + RelationKey: bundle.RelationKeyIsHidden.String(), + Condition: model.BlockContentDataviewFilter_NotEqual, + Value: pbtypes.Bool(true), + }, + }, + Sorts: []*model.BlockContentDataviewSort{ + { + RelationKey: "name", + Type: model.BlockContentDataviewSort_Asc, + }, + }, + Keys: []string{"id", "uniqueKey", "name", "iconEmoji"}, + }) + + if resp.Error.Code != pb.RpcObjectSearchResponseError_NULL { + return nil, 0, false, ErrFailedRetrieveTypes + } + + if len(resp.Records) == 0 { + return nil, 0, false, ErrNoTypesFound + } + + total = len(resp.Records) + paginatedTypes, hasMore := pagination.Paginate(resp.Records, offset, limit) + objectTypes := make([]ObjectType, 0, len(paginatedTypes)) + + for _, record := range paginatedTypes { + objectTypes = append(objectTypes, ObjectType{ + Type: "object_type", + Id: record.Fields["id"].GetStringValue(), + UniqueKey: record.Fields["uniqueKey"].GetStringValue(), + Name: record.Fields["name"].GetStringValue(), + Icon: record.Fields["iconEmoji"].GetStringValue(), + }) + } + return objectTypes, total, hasMore, nil } -func (s *ObjectService) ListTemplates() ([]ObjectTemplate, error) { - // TODO - return nil, nil +// ListTemplates returns the list of templates in a specific space +func (s *ObjectService) ListTemplates(ctx context.Context, spaceId string, typeId string, offset int, limit int) (templates []ObjectTemplate, total int, hasMore bool, err error) { + // First, determine the type ID of "ot-template" in the space + templateTypeIdResp := s.mw.ObjectSearch(ctx, &pb.RpcObjectSearchRequest{ + SpaceId: spaceId, + Filters: []*model.BlockContentDataviewFilter{ + { + RelationKey: bundle.RelationKeyUniqueKey.String(), + Condition: model.BlockContentDataviewFilter_Equal, + Value: pbtypes.String("ot-template"), + }, + }, + Keys: []string{"id"}, + }) + + if templateTypeIdResp.Error.Code != pb.RpcObjectSearchResponseError_NULL { + return nil, 0, false, ErrFailedRetrieveTemplateType + } + + if len(templateTypeIdResp.Records) == 0 { + return nil, 0, false, ErrTemplateTypeNotFound + } + + // Then, search all objects of the template type and filter by the target object type + templateTypeId := templateTypeIdResp.Records[0].Fields["id"].GetStringValue() + templateObjectsResp := s.mw.ObjectSearch(ctx, &pb.RpcObjectSearchRequest{ + SpaceId: spaceId, + Filters: []*model.BlockContentDataviewFilter{ + { + RelationKey: bundle.RelationKeyType.String(), + Condition: model.BlockContentDataviewFilter_Equal, + Value: pbtypes.String(templateTypeId), + }, + }, + Keys: []string{"id", "targetObjectType", "name", "iconEmoji"}, + }) + + if templateObjectsResp.Error.Code != pb.RpcObjectSearchResponseError_NULL { + return nil, 0, false, ErrFailedRetrieveTemplates + } + + if len(templateObjectsResp.Records) == 0 { + return nil, 0, false, ErrNoTemplatesFound + } + + templateIds := make([]string, 0) + for _, record := range templateObjectsResp.Records { + if record.Fields["targetObjectType"].GetStringValue() == typeId { + templateIds = append(templateIds, record.Fields["id"].GetStringValue()) + } + } + + total = len(templateIds) + paginatedTemplates, hasMore := pagination.Paginate(templateIds, offset, limit) + templates = make([]ObjectTemplate, 0, len(paginatedTemplates)) + + // Finally, open each template and populate the response + for _, templateId := range paginatedTemplates { + templateResp := s.mw.ObjectShow(ctx, &pb.RpcObjectShowRequest{ + SpaceId: spaceId, + ObjectId: templateId, + }) + + if templateResp.Error.Code != pb.RpcObjectShowResponseError_NULL { + return nil, 0, false, ErrFailedRetrieveTemplate + } + + templates = append(templates, ObjectTemplate{ + Type: "object_template", + Id: templateId, + Name: templateResp.ObjectView.Details[0].Details.Fields["name"].GetStringValue(), + Icon: templateResp.ObjectView.Details[0].Details.Fields["iconEmoji"].GetStringValue(), + }) + } + + return templates, total, hasMore, nil } -// GetDetails returns the details of the object +// GetDetails returns the list of details from the ObjectShowResponse func (s *ObjectService) GetDetails(resp *pb.RpcObjectShowResponse) []Detail { return []Detail{ { @@ -87,7 +354,7 @@ func (s *ObjectService) GetDetails(resp *pb.RpcObjectShowResponse) []Detail { } } -// getTags returns the list of tags from the object details +// getTags returns the list of tags from the ObjectShowResponse func (s *ObjectService) getTags(resp *pb.RpcObjectShowResponse) []Tag { tags := []Tag{} @@ -112,7 +379,7 @@ func (s *ObjectService) getTags(resp *pb.RpcObjectShowResponse) []Tag { return tags } -// GetBlocks returns the blocks of the object +// GetBlocks returns the list of blocks from the ObjectShowResponse func (s *ObjectService) GetBlocks(resp *pb.RpcObjectShowResponse) []Block { blocks := []Block{} @@ -158,6 +425,7 @@ func (s *ObjectService) GetBlocks(resp *pb.RpcObjectShowResponse) []Block { return blocks } +// mapAlign maps the protobuf BlockAlign to a string func mapAlign(align model.BlockAlign) string { switch align { case model.Block_AlignLeft: @@ -173,6 +441,7 @@ func mapAlign(align model.BlockAlign) string { } } +// mapVerticalAlign maps the protobuf BlockVerticalAlign to a string func mapVerticalAlign(align model.BlockVerticalAlign) string { switch align { case model.Block_VerticalAlignTop: diff --git a/cmd/api/object/service_test.go b/cmd/api/object/service_test.go new file mode 100644 index 000000000..96cd526dc --- /dev/null +++ b/cmd/api/object/service_test.go @@ -0,0 +1,568 @@ +package object + +import ( + "context" + "testing" + + "github.com/gogo/protobuf/types" + "github.com/stretchr/testify/mock" + "github.com/stretchr/testify/require" + + "github.com/anyproto/anytype-heart/pb" + "github.com/anyproto/anytype-heart/pb/service/mock_service" + "github.com/anyproto/anytype-heart/pkg/lib/bundle" + "github.com/anyproto/anytype-heart/pkg/lib/pb/model" + "github.com/anyproto/anytype-heart/util/pbtypes" +) + +const ( + offset = 0 + limit = 100 + mockedSpaceId = "mocked-space-id" + mockedObjectId = "mocked-object-id" + mockedNewObjectId = "mocked-new-object-id" + mockedTechSpaceId = "mocked-tech-space-id" + gatewayUrl = "http://localhost:31006" +) + +type fixture struct { + *ObjectService + mwMock *mock_service.MockClientCommandsServer +} + +func newFixture(t *testing.T) *fixture { + mw := mock_service.NewMockClientCommandsServer(t) + objectService := NewService(mw) + objectService.AccountInfo = &model.AccountInfo{ + TechSpaceId: mockedTechSpaceId, + GatewayUrl: gatewayUrl, + } + + return &fixture{ + ObjectService: objectService, + mwMock: mw, + } +} + +func TestObjectService_ListObjects(t *testing.T) { + t.Run("successfully get objects for a space", func(t *testing.T) { + // given + ctx := context.Background() + fx := newFixture(t) + + fx.mwMock.On("ObjectSearch", mock.Anything, &pb.RpcObjectSearchRequest{ + SpaceId: mockedSpaceId, + Filters: []*model.BlockContentDataviewFilter{ + { + RelationKey: bundle.RelationKeyLayout.String(), + Condition: model.BlockContentDataviewFilter_In, + Value: pbtypes.IntList([]int{ + int(model.ObjectType_basic), + int(model.ObjectType_profile), + int(model.ObjectType_todo), + int(model.ObjectType_note), + int(model.ObjectType_bookmark), + int(model.ObjectType_set), + int(model.ObjectType_collection), + int(model.ObjectType_participant), + }...), + }, + }, + Sorts: []*model.BlockContentDataviewSort{{ + RelationKey: bundle.RelationKeyLastModifiedDate.String(), + Type: model.BlockContentDataviewSort_Desc, + Format: model.RelationFormat_longtext, + IncludeTime: true, + EmptyPlacement: model.BlockContentDataviewSort_NotSpecified, + }}, + FullText: "", + Offset: 0, + Limit: 0, + ObjectTypeFilter: []string{}, + Keys: []string{"id", "name", "type", "layout", "iconEmoji", "iconImage"}, + }).Return(&pb.RpcObjectSearchResponse{ + Records: []*types.Struct{ + { + Fields: map[string]*types.Value{ + "id": pbtypes.String(mockedObjectId), + "name": pbtypes.String("My Object"), + "type": pbtypes.String("ot-page"), + "layout": pbtypes.Float64(float64(model.ObjectType_basic)), + "iconEmoji": pbtypes.String("📄"), + }, + }, + }, + Error: &pb.RpcObjectSearchResponseError{Code: pb.RpcObjectSearchResponseError_NULL}, + }).Once() + + // Mock object show for object details + fx.mwMock.On("ObjectShow", mock.Anything, &pb.RpcObjectShowRequest{ + SpaceId: mockedSpaceId, + ObjectId: mockedObjectId, + }).Return(&pb.RpcObjectShowResponse{ + ObjectView: &model.ObjectView{ + RootId: mockedObjectId, + Details: []*model.ObjectViewDetailsSet{ + { + Details: &types.Struct{ + Fields: map[string]*types.Value{ + "id": pbtypes.String(mockedObjectId), + "name": pbtypes.String("My Object"), + "type": pbtypes.String("ot-page"), + "iconEmoji": pbtypes.String("📄"), + "lastModifiedDate": pbtypes.Float64(999999), + "createdDate": pbtypes.Float64(888888), + }, + }, + }, + }, + }, + Error: &pb.RpcObjectShowResponseError{Code: pb.RpcObjectShowResponseError_NULL}, + }).Once() + + // Mock type resolution + fx.mwMock.On("ObjectSearch", mock.Anything, &pb.RpcObjectSearchRequest{ + SpaceId: mockedSpaceId, + Filters: []*model.BlockContentDataviewFilter{ + { + RelationKey: "uniqueKey", + Condition: model.BlockContentDataviewFilter_Equal, + Value: pbtypes.String("ot-page"), + }, + }, + Keys: []string{"name"}, + }).Return(&pb.RpcObjectSearchResponse{ + Records: []*types.Struct{ + { + Fields: map[string]*types.Value{ + "name": pbtypes.String("Page"), + }, + }, + }, + Error: &pb.RpcObjectSearchResponseError{Code: pb.RpcObjectSearchResponseError_NULL}, + }).Once() + + // when + objects, total, hasMore, err := fx.ListObjects(ctx, mockedSpaceId, offset, limit) + + // then + require.NoError(t, err) + require.Len(t, objects, 1) + require.Equal(t, mockedObjectId, objects[0].Id) + require.Equal(t, "My Object", objects[0].Name) + require.Equal(t, "Page", objects[0].ObjectType) + require.Equal(t, "📄", objects[0].Icon) + require.Equal(t, 3, len(objects[0].Details)) + + for _, detail := range objects[0].Details { + if detail.Id == "createdDate" { + require.Equal(t, float64(888888), detail.Details["createdDate"]) + } else if detail.Id == "lastModifiedDate" { + require.Equal(t, float64(999999), detail.Details["lastModifiedDate"]) + } else if detail.Id == "tags" { + require.Empty(t, detail.Details["tags"]) + } else { + t.Errorf("unexpected detail id: %s", detail.Id) + } + } + + require.Equal(t, 1, total) + require.False(t, hasMore) + }) + + t.Run("no objects found", func(t *testing.T) { + // given + ctx := context.Background() + fx := newFixture(t) + + fx.mwMock.On("ObjectSearch", mock.Anything, mock.Anything). + Return(&pb.RpcObjectSearchResponse{ + Records: []*types.Struct{}, + Error: &pb.RpcObjectSearchResponseError{Code: pb.RpcObjectSearchResponseError_NULL}, + }).Once() + + // when + objects, total, hasMore, err := fx.ListObjects(ctx, "empty-space", offset, limit) + + // then + require.ErrorIs(t, err, ErrNoObjectsFound) + require.Len(t, objects, 0) + require.Equal(t, 0, total) + require.False(t, hasMore) + }) +} + +func TestObjectService_GetObject(t *testing.T) { + t.Run("object found", func(t *testing.T) { + // given + ctx := context.Background() + fx := newFixture(t) + + fx.mwMock.On("ObjectShow", mock.Anything, &pb.RpcObjectShowRequest{ + SpaceId: mockedSpaceId, + ObjectId: mockedObjectId, + }). + Return(&pb.RpcObjectShowResponse{ + Error: &pb.RpcObjectShowResponseError{Code: pb.RpcObjectShowResponseError_NULL}, + ObjectView: &model.ObjectView{ + RootId: mockedObjectId, + Details: []*model.ObjectViewDetailsSet{ + { + Details: &types.Struct{ + Fields: map[string]*types.Value{ + "id": pbtypes.String(mockedObjectId), + "name": pbtypes.String("Found Object"), + "type": pbtypes.String("ot-page"), + "iconEmoji": pbtypes.String("🔍"), + "lastModifiedDate": pbtypes.Float64(999999), + "createdDate": pbtypes.Float64(888888), + }, + }, + }, + }, + }, + }, nil).Once() + + // Mock type resolution + fx.mwMock.On("ObjectSearch", mock.Anything, &pb.RpcObjectSearchRequest{ + SpaceId: mockedSpaceId, + Filters: []*model.BlockContentDataviewFilter{ + { + RelationKey: "uniqueKey", + Condition: model.BlockContentDataviewFilter_Equal, + Value: pbtypes.String("ot-page"), + }, + }, + Keys: []string{"name"}, + }).Return(&pb.RpcObjectSearchResponse{ + Error: &pb.RpcObjectSearchResponseError{Code: pb.RpcObjectSearchResponseError_NULL}, + Records: []*types.Struct{ + { + Fields: map[string]*types.Value{ + "name": pbtypes.String("Page"), + }, + }, + }, + }, nil).Once() + + // when + object, err := fx.GetObject(ctx, mockedSpaceId, mockedObjectId) + + // then + require.NoError(t, err) + require.Equal(t, mockedObjectId, object.Id) + require.Equal(t, "Found Object", object.Name) + require.Equal(t, "Page", object.ObjectType) + require.Equal(t, "🔍", object.Icon) + require.Equal(t, 3, len(object.Details)) + + for _, detail := range object.Details { + if detail.Id == "createdDate" { + require.Equal(t, float64(888888), detail.Details["createdDate"]) + } else if detail.Id == "lastModifiedDate" { + require.Equal(t, float64(999999), detail.Details["lastModifiedDate"]) + } else if detail.Id == "tags" { + require.Empty(t, detail.Details["tags"]) + } else { + t.Errorf("unexpected detail id: %s", detail.Id) + } + } + }) + + t.Run("object not found", func(t *testing.T) { + // given + ctx := context.Background() + fx := newFixture(t) + + fx.mwMock.On("ObjectShow", mock.Anything, mock.Anything). + Return(&pb.RpcObjectShowResponse{ + Error: &pb.RpcObjectShowResponseError{Code: pb.RpcObjectShowResponseError_NOT_FOUND}, + }, nil).Once() + + // when + object, err := fx.GetObject(ctx, mockedSpaceId, "missing-obj") + + // then + require.ErrorIs(t, err, ErrObjectNotFound) + require.Empty(t, object) + }) +} + +func TestObjectService_CreateObject(t *testing.T) { + t.Run("successful object creation", func(t *testing.T) { + // given + ctx := context.Background() + fx := newFixture(t) + + fx.mwMock.On("ObjectCreate", mock.Anything, &pb.RpcObjectCreateRequest{ + Details: &types.Struct{ + Fields: map[string]*types.Value{ + "name": pbtypes.String("New Object"), + "iconEmoji": pbtypes.String("🆕"), + }, + }, + TemplateId: "", + SpaceId: mockedSpaceId, + ObjectTypeUniqueKey: "", + WithChat: false, + }).Return(&pb.RpcObjectCreateResponse{ + ObjectId: mockedNewObjectId, + Details: &types.Struct{ + Fields: map[string]*types.Value{ + "id": pbtypes.String(mockedNewObjectId), + "name": pbtypes.String("New Object"), + "iconEmoji": pbtypes.String("🆕"), + "spaceId": pbtypes.String(mockedSpaceId), + }, + }, + Error: &pb.RpcObjectCreateResponseError{Code: pb.RpcObjectCreateResponseError_NULL}, + }).Once() + + // Mock object show for object details + fx.mwMock.On("ObjectShow", mock.Anything, &pb.RpcObjectShowRequest{ + SpaceId: mockedSpaceId, + ObjectId: mockedNewObjectId, + }).Return(&pb.RpcObjectShowResponse{ + ObjectView: &model.ObjectView{ + RootId: mockedNewObjectId, + Details: []*model.ObjectViewDetailsSet{ + { + Details: &types.Struct{ + Fields: map[string]*types.Value{ + "id": pbtypes.String(mockedNewObjectId), + "name": pbtypes.String("New Object"), + "type": pbtypes.String("ot-page"), + "iconEmoji": pbtypes.String("🆕"), + "spaceId": pbtypes.String(mockedSpaceId), + }, + }, + }, + }, + }, + Error: &pb.RpcObjectShowResponseError{Code: pb.RpcObjectShowResponseError_NULL}, + }).Once() + + // Mock type resolution + fx.mwMock.On("ObjectSearch", mock.Anything, &pb.RpcObjectSearchRequest{ + SpaceId: mockedSpaceId, + Filters: []*model.BlockContentDataviewFilter{ + { + RelationKey: "uniqueKey", + Condition: model.BlockContentDataviewFilter_Equal, + Value: pbtypes.String("ot-page"), + }, + }, + Keys: []string{"name"}, + }).Return(&pb.RpcObjectSearchResponse{ + Error: &pb.RpcObjectSearchResponseError{Code: pb.RpcObjectSearchResponseError_NULL}, + Records: []*types.Struct{ + { + Fields: map[string]*types.Value{ + "name": pbtypes.String("Page"), + }, + }, + }, + }).Once() + + // when + object, err := fx.CreateObject(ctx, mockedSpaceId, CreateObjectRequest{ + Name: "New Object", + Icon: "🆕", + // TODO: use actual values + TemplateId: "", + ObjectTypeUniqueKey: "", + WithChat: false, + }) + + // then + require.NoError(t, err) + require.Equal(t, mockedNewObjectId, object.Id) + require.Equal(t, "New Object", object.Name) + require.Equal(t, "Page", object.ObjectType) + require.Equal(t, "🆕", object.Icon) + require.Equal(t, mockedSpaceId, object.SpaceId) + }) + + t.Run("creation error", func(t *testing.T) { + // given + ctx := context.Background() + fx := newFixture(t) + + fx.mwMock.On("ObjectCreate", mock.Anything, mock.Anything). + Return(&pb.RpcObjectCreateResponse{ + Error: &pb.RpcObjectCreateResponseError{Code: pb.RpcObjectCreateResponseError_UNKNOWN_ERROR}, + }).Once() + + // when + object, err := fx.CreateObject(ctx, mockedSpaceId, CreateObjectRequest{ + Name: "Fail Object", + Icon: "", + }) + + // then + require.ErrorIs(t, err, ErrFailedCreateObject) + require.Empty(t, object) + }) +} + +func TestObjectService_UpdateObject(t *testing.T) { + t.Run("not implemented", func(t *testing.T) { + // given + ctx := context.Background() + fx := newFixture(t) + + // when + object, err := fx.UpdateObject(ctx, mockedSpaceId, mockedObjectId, UpdateObjectRequest{ + Object: Object{ + Name: "Updated Object", + }, + }) + + // then + require.ErrorIs(t, err, ErrNotImplemented) + require.Empty(t, object) + }) + + // TODO: further tests +} + +func TestObjectService_ListTypes(t *testing.T) { + t.Run("types found", func(t *testing.T) { + // given + ctx := context.Background() + fx := newFixture(t) + + fx.mwMock.On("ObjectSearch", mock.Anything, mock.Anything). + Return(&pb.RpcObjectSearchResponse{ + Records: []*types.Struct{ + { + Fields: map[string]*types.Value{ + "id": pbtypes.String("type-1"), + "name": pbtypes.String("Type One"), + "uniqueKey": pbtypes.String("type-one-key"), + "iconEmoji": pbtypes.String("🗂️"), + }, + }, + }, + Error: &pb.RpcObjectSearchResponseError{Code: pb.RpcObjectSearchResponseError_NULL}, + }).Once() + + // when + types, total, hasMore, err := fx.ListTypes(ctx, mockedSpaceId, offset, limit) + + // then + require.NoError(t, err) + require.Len(t, types, 1) + require.Equal(t, "type-1", types[0].Id) + require.Equal(t, "Type One", types[0].Name) + require.Equal(t, "type-one-key", types[0].UniqueKey) + require.Equal(t, "🗂️", types[0].Icon) + require.Equal(t, 1, total) + require.False(t, hasMore) + }) + + t.Run("no types found", func(t *testing.T) { + // given + ctx := context.Background() + fx := newFixture(t) + + fx.mwMock.On("ObjectSearch", mock.Anything, mock.Anything). + Return(&pb.RpcObjectSearchResponse{ + Records: []*types.Struct{}, + Error: &pb.RpcObjectSearchResponseError{Code: pb.RpcObjectSearchResponseError_NULL}, + }).Once() + + // when + types, total, hasMore, err := fx.ListTypes(ctx, "empty-space", offset, limit) + + // then + require.ErrorIs(t, err, ErrNoTypesFound) + require.Len(t, types, 0) + require.Equal(t, 0, total) + require.False(t, hasMore) + }) +} + +func TestObjectService_ListTemplates(t *testing.T) { + t.Run("templates found", func(t *testing.T) { + // given + ctx := context.Background() + fx := newFixture(t) + + // Mock template type search + fx.mwMock.On("ObjectSearch", mock.Anything, mock.Anything).Return(&pb.RpcObjectSearchResponse{ + Records: []*types.Struct{ + { + Fields: map[string]*types.Value{ + "id": pbtypes.String("template-type-id"), + "uniqueKey": pbtypes.String("ot-template"), + }, + }, + }, + Error: &pb.RpcObjectSearchResponseError{Code: pb.RpcObjectSearchResponseError_NULL}, + }).Once() + + // Mock actual template objects search + fx.mwMock.On("ObjectSearch", mock.Anything, mock.Anything).Return(&pb.RpcObjectSearchResponse{ + Records: []*types.Struct{ + { + Fields: map[string]*types.Value{ + "id": pbtypes.String("template-1"), + "targetObjectType": pbtypes.String("target-type-id"), + }, + }, + }, + Error: &pb.RpcObjectSearchResponseError{Code: pb.RpcObjectSearchResponseError_NULL}, + }).Once() + + // Mock object show for template details + fx.mwMock.On("ObjectShow", mock.Anything, mock.Anything).Return(&pb.RpcObjectShowResponse{ + Error: &pb.RpcObjectShowResponseError{Code: pb.RpcObjectShowResponseError_NULL}, + ObjectView: &model.ObjectView{ + Details: []*model.ObjectViewDetailsSet{ + { + Details: &types.Struct{ + Fields: map[string]*types.Value{ + "name": pbtypes.String("Template Name"), + "iconEmoji": pbtypes.String("📝"), + }, + }, + }, + }, + }, + }, nil).Once() + + // when + templates, total, hasMore, err := fx.ListTemplates(ctx, mockedSpaceId, "target-type-id", offset, limit) + + // then + require.NoError(t, err) + require.Len(t, templates, 1) + require.Equal(t, "template-1", templates[0].Id) + require.Equal(t, "Template Name", templates[0].Name) + require.Equal(t, "📝", templates[0].Icon) + require.Equal(t, 1, total) + require.False(t, hasMore) + }) + + t.Run("no template type found", func(t *testing.T) { + // given + ctx := context.Background() + fx := newFixture(t) + + fx.mwMock.On("ObjectSearch", mock.Anything, mock.Anything). + Return(&pb.RpcObjectSearchResponse{ + Records: []*types.Struct{}, + Error: &pb.RpcObjectSearchResponseError{Code: pb.RpcObjectSearchResponseError_NULL}, + }).Once() + + // when + templates, total, hasMore, err := fx.ListTemplates(ctx, mockedSpaceId, "missing-type-id", offset, limit) + + // then + require.ErrorIs(t, err, ErrTemplateTypeNotFound) + require.Len(t, templates, 0) + require.Equal(t, 0, total) + require.False(t, hasMore) + }) +} diff --git a/cmd/api/server/router.go b/cmd/api/server/router.go index 372d87053..37b905440 100644 --- a/cmd/api/server/router.go +++ b/cmd/api/server/router.go @@ -46,8 +46,8 @@ func (s *Server) NewRouter() *gin.Engine { readOnly.GET("/spaces/:space_id/members", paginator, space.GetMembersHandler(s.spaceService)) readOnly.GET("/spaces/:space_id/objects", paginator, object.GetObjectsHandler(s.objectService)) readOnly.GET("/spaces/:space_id/objects/:object_id", object.GetObjectHandler(s.objectService)) - readOnly.GET("/spaces/:space_id/objectTypes", paginator, object.GetObjectTypesHandler(s.objectService)) - readOnly.GET("/spaces/:space_id/objectTypes/:typeId/templates", paginator, object.GetObjectTypeTemplatesHandler(s.objectService)) + readOnly.GET("/spaces/:space_id/objectTypes", paginator, object.GetTypesHandler(s.objectService)) + readOnly.GET("/spaces/:space_id/objectTypes/:typeId/templates", paginator, object.GetTemplatesHandler(s.objectService)) readOnly.GET("/search", paginator, search.SearchHandler(s.searchService)) } diff --git a/cmd/api/util/util.go b/cmd/api/util/util.go index 2f63d8a1c..38c75fe34 100644 --- a/cmd/api/util/util.go +++ b/cmd/api/util/util.go @@ -58,6 +58,7 @@ func ResolveTypeToName(mw service.ClientCommandsServer, spaceId string, typeId s Value: pbtypes.String(typeId), }, }, + Keys: []string{"name"}, }) if resp.Error.Code != pb.RpcObjectSearchResponseError_NULL { From 2b7b996cbc6ceb89d92553850659a535dd1bde20 Mon Sep 17 00:00:00 2001 From: Jannis Metrikat <120120832+jmetrikat@users.noreply.github.com> Date: Wed, 1 Jan 2025 15:22:16 +0100 Subject: [PATCH 074/195] GO-4459: Return 403 when not logged in, fix interfaces --- cmd/api/pagination/pagination.go | 9 +++++---- cmd/api/search/service_test.go | 6 ++++-- cmd/api/server/middleware.go | 2 +- cmd/api/space/service.go | 2 +- 4 files changed, 11 insertions(+), 8 deletions(-) diff --git a/cmd/api/pagination/pagination.go b/cmd/api/pagination/pagination.go index e648f470e..90fe9fc34 100644 --- a/cmd/api/pagination/pagination.go +++ b/cmd/api/pagination/pagination.go @@ -3,12 +3,12 @@ package pagination import "github.com/gin-gonic/gin" type Service[T any] interface { - RespondWithPagination(c *gin.Context, statusCode int, data []T, total, offset, limit int, hasMore bool) - Paginate(records []T, offset, limit int) ([]T, bool) + RespondWithPagination(c *gin.Context, statusCode int, data []T, total int, offset int, limit int, hasMore bool) + Paginate(records []T, offset int, limit int) ([]T, bool) } // RespondWithPagination returns a json response with the paginated data and corresponding metadata -func RespondWithPagination[T any](c *gin.Context, statusCode int, data []T, total, offset, limit int, hasMore bool) { +func RespondWithPagination[T any](c *gin.Context, statusCode int, data []T, total int, offset int, limit int, hasMore bool) { c.JSON(statusCode, PaginatedResponse[T]{ Data: data, Pagination: PaginationMeta{ @@ -21,7 +21,7 @@ func RespondWithPagination[T any](c *gin.Context, statusCode int, data []T, tota } // Paginate paginates the given records based on the offset and limit -func Paginate[T any](records []T, offset, limit int) ([]T, bool) { +func Paginate[T any](records []T, offset int, limit int) ([]T, bool) { total := len(records) start := offset end := offset + limit @@ -35,5 +35,6 @@ func Paginate[T any](records []T, offset, limit int) ([]T, bool) { paginated := records[start:end] hasMore := end < total + return paginated, hasMore } diff --git a/cmd/api/search/service_test.go b/cmd/api/search/service_test.go index d16a6d2ce..cf3f06180 100644 --- a/cmd/api/search/service_test.go +++ b/cmd/api/search/service_test.go @@ -22,7 +22,6 @@ const ( limit = 100 techSpaceId = "tech-space-id" gatewayUrl = "http://localhost:31006" - iconImage = "bafyreialsgoyflf3etjm3parzurivyaukzivwortf32b4twnlwpwocsrri" ) type fixture struct { @@ -200,7 +199,7 @@ func TestSearchService_Search(t *testing.T) { }, nil).Once() // when - objects, _, _, err := fx.Search(ctx, "search-term", "", offset, limit) + objects, total, hasMore, err := fx.Search(ctx, "search-term", "", offset, limit) // then require.NoError(t, err) @@ -237,5 +236,8 @@ func TestSearchService_Search(t *testing.T) { require.Equal(t, "tag-2", tags[1].Id) require.Equal(t, "Optional", tags[1].Name) require.Equal(t, "blue", tags[1].Color) + + require.Equal(t, 1, total) + require.False(t, hasMore) }) } diff --git a/cmd/api/server/middleware.go b/cmd/api/server/middleware.go index 48bbebc2b..00f21bbed 100644 --- a/cmd/api/server/middleware.go +++ b/cmd/api/server/middleware.go @@ -22,7 +22,7 @@ func (s *Server) initAccountInfo() gin.HandlerFunc { // TODO: consider not fetching account info on every request; currently used to avoid inconsistencies on logout/login app := s.mwInternal.GetApp() if app == nil { - c.AbortWithStatusJSON(http.StatusInternalServerError, gin.H{"error": "failed to get app instance"}) + c.AbortWithStatusJSON(http.StatusForbidden, gin.H{"error": "failed to get app instance"}) return } diff --git a/cmd/api/space/service.go b/cmd/api/space/service.go index 9900d6f73..0cc42843c 100644 --- a/cmd/api/space/service.go +++ b/cmd/api/space/service.go @@ -28,7 +28,7 @@ var ( ) type Service interface { - ListSpaces(ctx context.Context) ([]Space, error) + ListSpaces(ctx context.Context, offset int, limit int) ([]Space, int, bool, error) CreateSpace(ctx context.Context, name string) (Space, error) } From 697160479b7c2837aad48ccfd1825ac42bfbb1c4 Mon Sep 17 00:00:00 2001 From: Jannis Metrikat <120120832+jmetrikat@users.noreply.github.com> Date: Wed, 1 Jan 2025 15:40:50 +0100 Subject: [PATCH 075/195] GO-4459: Add pagination tests --- cmd/api/pagination/pagination_test.go | 94 +++++++++++++++++++++++++++ 1 file changed, 94 insertions(+) create mode 100644 cmd/api/pagination/pagination_test.go diff --git a/cmd/api/pagination/pagination_test.go b/cmd/api/pagination/pagination_test.go new file mode 100644 index 000000000..c4bab3936 --- /dev/null +++ b/cmd/api/pagination/pagination_test.go @@ -0,0 +1,94 @@ +package pagination + +import ( + "reflect" + "testing" +) + +func TestPaginate(t *testing.T) { + type args struct { + records []int + offset int + limit int + } + tests := []struct { + name string + args args + wantPaginated []int + wantHasMore bool + }{ + { + name: "Offset=0, Limit=2 (first two items)", + args: args{ + records: []int{1, 2, 3, 4, 5}, + offset: 0, + limit: 2, + }, + wantPaginated: []int{1, 2}, + wantHasMore: true, // items remain: [3,4,5] + }, + { + name: "Offset=2, Limit=2 (middle slice)", + args: args{ + records: []int{1, 2, 3, 4, 5}, + offset: 2, + limit: 2, + }, + wantPaginated: []int{3, 4}, + wantHasMore: true, // item 5 remains + }, + { + name: "Offset=4, Limit=2 (tail of the slice)", + args: args{ + records: []int{1, 2, 3, 4, 5}, + offset: 4, + limit: 2, + }, + wantPaginated: []int{5}, + wantHasMore: false, + }, + { + name: "Offset > length (should return empty)", + args: args{ + records: []int{1, 2, 3, 4, 5}, + offset: 10, + limit: 2, + }, + wantPaginated: []int{}, + wantHasMore: false, + }, + { + name: "Limit > length (should return entire slice)", + args: args{ + records: []int{1, 2, 3}, + offset: 0, + limit: 10, + }, + wantPaginated: []int{1, 2, 3}, + wantHasMore: false, + }, + { + name: "Zero limit (no items returned)", + args: args{ + records: []int{1, 2, 3, 4, 5}, + offset: 1, + limit: 0, + }, + wantPaginated: []int{}, + wantHasMore: true, // items remain: [2,3,4,5] + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + gotPaginated, gotHasMore := Paginate(tt.args.records, tt.args.offset, tt.args.limit) + + if !reflect.DeepEqual(gotPaginated, tt.wantPaginated) { + t.Errorf("Paginate() gotPaginated = %v, want %v", gotPaginated, tt.wantPaginated) + } + if gotHasMore != tt.wantHasMore { + t.Errorf("Paginate() gotHasMore = %v, want %v", gotHasMore, tt.wantHasMore) + } + }) + } +} From 279e2d24b12bcfcc90d5a73e7feb61bc3e1ae3b8 Mon Sep 17 00:00:00 2001 From: Jannis Metrikat <120120832+jmetrikat@users.noreply.github.com> Date: Wed, 1 Jan 2025 15:41:02 +0100 Subject: [PATCH 076/195] GO-4459: Update interfaces and comments --- cmd/api/auth/service.go | 6 ++---- cmd/api/object/service.go | 21 ++++++++++----------- cmd/api/search/service.go | 3 ++- cmd/api/server/middleware.go | 8 ++++---- cmd/api/server/server.go | 9 ++++----- cmd/api/space/service.go | 6 +++++- 6 files changed, 27 insertions(+), 26 deletions(-) diff --git a/cmd/api/auth/service.go b/cmd/api/auth/service.go index 19b857c79..2ccd5200e 100644 --- a/cmd/api/auth/service.go +++ b/cmd/api/auth/service.go @@ -27,8 +27,7 @@ func NewService(mw service.ClientCommandsServer) *AuthService { return &AuthService{mw: mw} } -// GenerateNewChallenge calls mw.AccountLocalLinkNewChallenge(...) -// and returns the challenge ID, or an error if it fails. +// GenerateNewChallenge calls AccountLocalLinkNewChallenge and returns the challenge ID, or an error if it fails. func (s *AuthService) GenerateNewChallenge(ctx context.Context, appName string) (string, error) { resp := s.mw.AccountLocalLinkNewChallenge(ctx, &pb.RpcAccountLocalLinkNewChallengeRequest{AppName: "api-test"}) @@ -39,8 +38,7 @@ func (s *AuthService) GenerateNewChallenge(ctx context.Context, appName string) return resp.ChallengeId, nil } -// SolveChallengeForToken calls mw.AccountLocalLinkSolveChallenge(...) -// and returns the session token + app key, or an error if it fails. +// SolveChallengeForToken calls AccountLocalLinkSolveChallenge and returns the session token + app key, or an error if it fails. func (s *AuthService) SolveChallengeForToken(ctx context.Context, challengeID, code string) (sessionToken, appKey string, err error) { if challengeID == "" || code == "" { return "", "", ErrInvalidInput diff --git a/cmd/api/object/service.go b/cmd/api/object/service.go index d2362b370..d7a494f4d 100644 --- a/cmd/api/object/service.go +++ b/cmd/api/object/service.go @@ -47,12 +47,11 @@ type ObjectService struct { AccountInfo *model.AccountInfo } -// NewService creates a new object service func NewService(mw service.ClientCommandsServer) *ObjectService { return &ObjectService{mw: mw} } -// ListObjects retrieves a list of objects in a specific space +// ListObjects retrieves a paginated list of objects in a specific space. func (s *ObjectService) ListObjects(ctx context.Context, spaceId string, offset int, limit int) (objects []Object, total int, hasMore bool, err error) { resp := s.mw.ObjectSearch(ctx, &pb.RpcObjectSearchRequest{ SpaceId: spaceId, @@ -112,7 +111,7 @@ func (s *ObjectService) ListObjects(ctx context.Context, spaceId string, offset return objects, total, hasMore, nil } -// GetObject retrieves a single object by its ID in a specific space +// GetObject retrieves a single object by its ID in a specific space. func (s *ObjectService) GetObject(ctx context.Context, spaceId string, objectId string) (Object, error) { resp := s.mw.ObjectShow(ctx, &pb.RpcObjectShowRequest{ SpaceId: spaceId, @@ -148,7 +147,7 @@ func (s *ObjectService) GetObject(ctx context.Context, spaceId string, objectId return object, nil } -// CreateObject creates a new object in a specific space +// CreateObject creates a new object in a specific space. func (s *ObjectService) CreateObject(ctx context.Context, spaceId string, request CreateObjectRequest) (Object, error) { resp := s.mw.ObjectCreate(ctx, &pb.RpcObjectCreateRequest{ Details: &types.Struct{ @@ -197,13 +196,13 @@ func (s *ObjectService) CreateObject(ctx context.Context, spaceId string, reques return object, nil } -// UpdateObject updates an existing object in a specific space +// UpdateObject updates an existing object in a specific space. func (s *ObjectService) UpdateObject(ctx context.Context, spaceId string, objectId string, request UpdateObjectRequest) (Object, error) { // TODO: Implement logic to update an existing object return Object{}, ErrNotImplemented } -// ListTypes returns the list of types in a specific space +// ListTypes returns a paginated list of types in a specific space. func (s *ObjectService) ListTypes(ctx context.Context, spaceId string, offset int, limit int) (types []ObjectType, total int, hasMore bool, err error) { resp := s.mw.ObjectSearch(ctx, &pb.RpcObjectSearchRequest{ SpaceId: spaceId, @@ -252,7 +251,7 @@ func (s *ObjectService) ListTypes(ctx context.Context, spaceId string, offset in return objectTypes, total, hasMore, nil } -// ListTemplates returns the list of templates in a specific space +// ListTemplates returns a paginated list of templates in a specific space. func (s *ObjectService) ListTemplates(ctx context.Context, spaceId string, typeId string, offset int, limit int) (templates []ObjectTemplate, total int, hasMore bool, err error) { // First, determine the type ID of "ot-template" in the space templateTypeIdResp := s.mw.ObjectSearch(ctx, &pb.RpcObjectSearchRequest{ @@ -330,7 +329,7 @@ func (s *ObjectService) ListTemplates(ctx context.Context, spaceId string, typeI return templates, total, hasMore, nil } -// GetDetails returns the list of details from the ObjectShowResponse +// GetDetails returns the list of details from the ObjectShowResponse. func (s *ObjectService) GetDetails(resp *pb.RpcObjectShowResponse) []Detail { return []Detail{ { @@ -379,7 +378,7 @@ func (s *ObjectService) getTags(resp *pb.RpcObjectShowResponse) []Tag { return tags } -// GetBlocks returns the list of blocks from the ObjectShowResponse +// GetBlocks returns the list of blocks from the ObjectShowResponse. func (s *ObjectService) GetBlocks(resp *pb.RpcObjectShowResponse) []Block { blocks := []Block{} @@ -425,7 +424,7 @@ func (s *ObjectService) GetBlocks(resp *pb.RpcObjectShowResponse) []Block { return blocks } -// mapAlign maps the protobuf BlockAlign to a string +// mapAlign maps the protobuf BlockAlign to a string. func mapAlign(align model.BlockAlign) string { switch align { case model.Block_AlignLeft: @@ -441,7 +440,7 @@ func mapAlign(align model.BlockAlign) string { } } -// mapVerticalAlign maps the protobuf BlockVerticalAlign to a string +// mapVerticalAlign maps the protobuf BlockVerticalAlign to a string. func mapVerticalAlign(align model.BlockVerticalAlign) string { switch align { case model.Block_VerticalAlignTop: diff --git a/cmd/api/search/service.go b/cmd/api/search/service.go index c6039fe9f..285f08cc0 100644 --- a/cmd/api/search/service.go +++ b/cmd/api/search/service.go @@ -22,7 +22,7 @@ var ( ) type Service interface { - Search(ctx context.Context) ([]object.Object, error) + Search(ctx context.Context, searchQuery string, objectType string, offset, limit int) (objects []object.Object, total int, hasMore bool, err error) } type SearchService struct { @@ -36,6 +36,7 @@ func NewService(mw service.ClientCommandsServer, spaceService *space.SpaceServic return &SearchService{mw: mw, spaceService: spaceService, objectService: objectService} } +// Search retrieves a paginated list of objects from all spaces that match the search parameters. func (s *SearchService) Search(ctx context.Context, searchQuery string, objectType string, offset, limit int) (objects []object.Object, total int, hasMore bool, err error) { spaces, _, _, err := s.spaceService.ListSpaces(ctx, 0, 100) if err != nil { diff --git a/cmd/api/server/middleware.go b/cmd/api/server/middleware.go index 00f21bbed..82290e3df 100644 --- a/cmd/api/server/middleware.go +++ b/cmd/api/server/middleware.go @@ -10,13 +10,13 @@ import ( "github.com/anyproto/anytype-heart/core/anytype/account" ) -// // TODO: User represents an authenticated user with permissions +// TODO: User represents an authenticated user with permissions type User struct { ID string Permissions string // "read-only" or "read-write" } -// initAccountInfo retrieves the account information from the account service +// initAccountInfo retrieves the account information from the account service. func (s *Server) initAccountInfo() gin.HandlerFunc { return func(c *gin.Context) { // TODO: consider not fetching account info on every request; currently used to avoid inconsistencies on logout/login @@ -39,7 +39,7 @@ func (s *Server) initAccountInfo() gin.HandlerFunc { } } -// TODO: AuthMiddleware to ensure the user is authenticated +// TODO: AuthMiddleware ensures the user is authenticated. func (s *Server) AuthMiddleware() gin.HandlerFunc { return func(c *gin.Context) { token := c.GetHeader("Authorization") @@ -60,7 +60,7 @@ func (s *Server) AuthMiddleware() gin.HandlerFunc { } } -// TODO: PermissionMiddleware to ensure the user has the required permissions +// TODO: PermissionMiddleware ensures the user has the required permissions. func (s *Server) PermissionMiddleware(requiredPermission string) gin.HandlerFunc { return func(c *gin.Context) { user, exists := c.Get("user") diff --git a/cmd/api/server/server.go b/cmd/api/server/server.go index 29cef94d3..183fa0f64 100644 --- a/cmd/api/server/server.go +++ b/cmd/api/server/server.go @@ -21,7 +21,7 @@ const ( readHeaderTimeout = 5 * time.Second ) -// Server wraps the HTTP server logic. +// Server wraps the HTTP server and service logic. type Server struct { engine *gin.Engine srv *http.Server @@ -33,8 +33,7 @@ type Server struct { searchService *search.SearchService } -// NewServer constructs a new Server with default config -// and sets up routes via your router.go +// NewServer constructs a new Server with default config and sets up the routes. func NewServer(mw service.ClientCommandsServer, mwInternal core.MiddlewareInternal) *Server { s := &Server{ mwInternal: mwInternal, @@ -54,13 +53,13 @@ func NewServer(mw service.ClientCommandsServer, mwInternal core.MiddlewareIntern return s } -// ListenAndServe starts the HTTP server +// ListenAndServe starts the HTTP server. func (s *Server) ListenAndServe() error { fmt.Printf("Starting API server on %s\n", httpPort) return s.srv.ListenAndServe() } -// Shutdown gracefully stops the server +// Shutdown gracefully stops the server. func (s *Server) Shutdown(ctx context.Context) error { fmt.Println("Shutting down API server...") return s.srv.Shutdown(ctx) diff --git a/cmd/api/space/service.go b/cmd/api/space/service.go index 0cc42843c..fe5ed7a93 100644 --- a/cmd/api/space/service.go +++ b/cmd/api/space/service.go @@ -30,6 +30,7 @@ var ( type Service interface { ListSpaces(ctx context.Context, offset int, limit int) ([]Space, int, bool, error) CreateSpace(ctx context.Context, name string) (Space, error) + ListMembers(ctx context.Context, spaceId string, offset int, limit int) ([]Member, int, bool, error) } type SpaceService struct { @@ -41,6 +42,7 @@ func NewService(mw service.ClientCommandsServer) *SpaceService { return &SpaceService{mw: mw} } +// ListSpaces returns a paginated list of spaces for the account. func (s *SpaceService) ListSpaces(ctx context.Context, offset int, limit int) (spaces []Space, total int, hasMore bool, err error) { resp := s.mw.ObjectSearch(ctx, &pb.RpcObjectSearchRequest{ SpaceId: s.AccountInfo.TechSpaceId, @@ -100,6 +102,7 @@ func (s *SpaceService) ListSpaces(ctx context.Context, offset int, limit int) (s return spaces, total, hasMore, nil } +// CreateSpace creates a new space with the given name and returns the space info. func (s *SpaceService) CreateSpace(ctx context.Context, name string) (Space, error) { iconOption, err := rand.Int(rand.Reader, big.NewInt(13)) if err != nil { @@ -126,6 +129,7 @@ func (s *SpaceService) CreateSpace(ctx context.Context, name string) (Space, err return s.getWorkspaceInfo(resp.SpaceId) } +// ListMembers returns a paginated list of members in the space with the given ID. func (s *SpaceService) ListMembers(ctx context.Context, spaceId string, offset int, limit int) (members []Member, total int, hasMore bool, err error) { resp := s.mw.ObjectSearch(ctx, &pb.RpcObjectSearchRequest{ SpaceId: spaceId, @@ -181,7 +185,7 @@ func (s *SpaceService) ListMembers(ctx context.Context, spaceId string, offset i return members, total, hasMore, nil } -// getWorkspaceInfo returns the workspace info for the space with the given ID +// getWorkspaceInfo returns the workspace info for the space with the given ID. func (s *SpaceService) getWorkspaceInfo(spaceId string) (space Space, err error) { workspaceResponse := s.mw.WorkspaceOpen(context.Background(), &pb.RpcWorkspaceOpenRequest{ SpaceId: spaceId, From a2ccc7da5ebc0e8b6e7fd193ac5133edc6a7d990 Mon Sep 17 00:00:00 2001 From: Jannis Metrikat <120120832+jmetrikat@users.noreply.github.com> Date: Thu, 2 Jan 2025 14:14:07 +0100 Subject: [PATCH 077/195] GO-4459: Add complex filters in search for query and object types --- cmd/api/demo/api_demo.go | 3 +- cmd/api/docs/docs.go | 10 ++- cmd/api/docs/swagger.json | 10 ++- cmd/api/docs/swagger.yaml | 9 ++- cmd/api/search/handler.go | 20 ++--- cmd/api/search/service.go | 155 +++++++++++++++++++++++++++----------- cmd/api/space/service.go | 3 + 7 files changed, 148 insertions(+), 62 deletions(-) diff --git a/cmd/api/demo/api_demo.go b/cmd/api/demo/api_demo.go index 311938774..a46afa670 100644 --- a/cmd/api/demo/api_demo.go +++ b/cmd/api/demo/api_demo.go @@ -30,7 +30,8 @@ var log = logging.Logger("rest-api") func ReplacePlaceholders(endpoint string, parameters map[string]interface{}) string { for key, value := range parameters { placeholder := fmt.Sprintf("{%s}", key) - endpoint = strings.ReplaceAll(endpoint, placeholder, fmt.Sprintf("%v", value)) + encodedValue := url.QueryEscape(fmt.Sprintf("%v", value)) + endpoint = strings.ReplaceAll(endpoint, placeholder, encodedValue) } // Parse the base URL + endpoint diff --git a/cmd/api/docs/docs.go b/cmd/api/docs/docs.go index 0998e883d..c7a2aab4b 100644 --- a/cmd/api/docs/docs.go +++ b/cmd/api/docs/docs.go @@ -122,9 +122,13 @@ const docTemplate = `{ "in": "query" }, { - "type": "string", - "description": "Specify object.Object type for search", - "name": "object_type", + "type": "array", + "items": { + "type": "string" + }, + "collectionFormat": "csv", + "description": "Specify object types for search", + "name": "object_types", "in": "query" }, { diff --git a/cmd/api/docs/swagger.json b/cmd/api/docs/swagger.json index 1aa508608..b34bb51a2 100644 --- a/cmd/api/docs/swagger.json +++ b/cmd/api/docs/swagger.json @@ -116,9 +116,13 @@ "in": "query" }, { - "type": "string", - "description": "Specify object.Object type for search", - "name": "object_type", + "type": "array", + "items": { + "type": "string" + }, + "collectionFormat": "csv", + "description": "Specify object types for search", + "name": "object_types", "in": "query" }, { diff --git a/cmd/api/docs/swagger.yaml b/cmd/api/docs/swagger.yaml index 98042165f..e9786c94d 100644 --- a/cmd/api/docs/swagger.yaml +++ b/cmd/api/docs/swagger.yaml @@ -386,10 +386,13 @@ paths: in: query name: query type: string - - description: Specify object.Object type for search + - collectionFormat: csv + description: Specify object types for search in: query - name: object_type - type: string + items: + type: string + name: object_types + type: array - description: The number of items to skip before starting to collect the result set in: query diff --git a/cmd/api/search/handler.go b/cmd/api/search/handler.go index c60514fdd..78e17b764 100644 --- a/cmd/api/search/handler.go +++ b/cmd/api/search/handler.go @@ -16,23 +16,23 @@ import ( // @Tags search // @Accept json // @Produce json -// @Param query query string false "The search term to filter objects by name" -// @Param object_type query string false "Specify object.Object type for search" -// @Param offset query int false "The number of items to skip before starting to collect the result set" -// @Param limit query int false "The number of items to return" default(100) -// @Success 200 {object} map[string][]object.Object "List of objects" -// @Failure 403 {object} util.UnauthorizedError "Unauthorized" -// @Failure 404 {object} util.NotFoundError "Resource not found" -// @Failure 502 {object} util.ServerError "Internal server error" +// @Param query query string false "The search term to filter objects by name" +// @Param object_types query []string false "Specify object types for search" +// @Param offset query int false "The number of items to skip before starting to collect the result set" +// @Param limit query int false "The number of items to return" default(100) +// @Success 200 {object} map[string][]object.Object "List of objects" +// @Failure 403 {object} util.UnauthorizedError "Unauthorized" +// @Failure 404 {object} util.NotFoundError "Resource not found" +// @Failure 502 {object} util.ServerError "Internal server error" // @Router /search [get] func SearchHandler(s *SearchService) gin.HandlerFunc { return func(c *gin.Context) { searchQuery := c.Query("query") - objectType := c.Query("object_type") + objectTypes := c.QueryArray("object_types") offset := c.GetInt("offset") limit := c.GetInt("limit") - objects, total, hasMore, err := s.Search(c, searchQuery, objectType, offset, limit) + objects, total, hasMore, err := s.Search(c, searchQuery, objectTypes, offset, limit) code := util.MapErrorCode(err, util.ErrToCode(ErrNoObjectsFound, http.StatusNotFound), util.ErrToCode(ErrFailedSearchObjects, http.StatusInternalServerError), diff --git a/cmd/api/search/service.go b/cmd/api/search/service.go index 285f08cc0..c856c50f4 100644 --- a/cmd/api/search/service.go +++ b/cmd/api/search/service.go @@ -4,6 +4,7 @@ import ( "context" "errors" "sort" + "strings" "github.com/anyproto/anytype-heart/cmd/api/object" "github.com/anyproto/anytype-heart/cmd/api/pagination" @@ -22,7 +23,7 @@ var ( ) type Service interface { - Search(ctx context.Context, searchQuery string, objectType string, offset, limit int) (objects []object.Object, total int, hasMore bool, err error) + Search(ctx context.Context, searchQuery string, objectTypes []string, offset, limit int) (objects []object.Object, total int, hasMore bool, err error) } type SearchService struct { @@ -37,51 +38,16 @@ func NewService(mw service.ClientCommandsServer, spaceService *space.SpaceServic } // Search retrieves a paginated list of objects from all spaces that match the search parameters. -func (s *SearchService) Search(ctx context.Context, searchQuery string, objectType string, offset, limit int) (objects []object.Object, total int, hasMore bool, err error) { +func (s *SearchService) Search(ctx context.Context, searchQuery string, objectTypes []string, offset, limit int) (objects []object.Object, total int, hasMore bool, err error) { spaces, _, _, err := s.spaceService.ListSpaces(ctx, 0, 100) if err != nil { return nil, 0, false, err } - // Then, get objects from each space that match the search parameters - var filters = []*model.BlockContentDataviewFilter{ - { - RelationKey: bundle.RelationKeyLayout.String(), - Condition: model.BlockContentDataviewFilter_In, - Value: pbtypes.IntList([]int{ - int(model.ObjectType_basic), - int(model.ObjectType_profile), - int(model.ObjectType_todo), - int(model.ObjectType_note), - int(model.ObjectType_bookmark), - int(model.ObjectType_set), - int(model.ObjectType_collection), - int(model.ObjectType_participant), - }...), - }, - { - RelationKey: bundle.RelationKeyIsHidden.String(), - Condition: model.BlockContentDataviewFilter_NotEqual, - Value: pbtypes.Bool(true), - }, - } - - if searchQuery != "" { - // TODO also include snippet for notes - filters = append(filters, &model.BlockContentDataviewFilter{ - RelationKey: bundle.RelationKeyName.String(), - Condition: model.BlockContentDataviewFilter_Like, - Value: pbtypes.String(searchQuery), - }) - } - - if objectType != "" { - filters = append(filters, &model.BlockContentDataviewFilter{ - RelationKey: bundle.RelationKeyType.String(), - Condition: model.BlockContentDataviewFilter_Equal, - Value: pbtypes.String(objectType), - }) - } + baseFilters := s.prepareBaseFilters() + queryFilters := s.prepareQueryFilter(searchQuery) + objectTypeFilters := s.prepareObjectTypeFilters(objectTypes) + filters := s.combineFilters(model.BlockContentDataviewFilter_And, baseFilters, queryFilters, objectTypeFilters) results := make([]object.Object, 0) for _, space := range spaces { @@ -96,7 +62,7 @@ func (s *SearchService) Search(ctx context.Context, searchQuery string, objectTy IncludeTime: true, EmptyPlacement: model.BlockContentDataviewSort_NotSpecified, }}, - Keys: []string{"id", "name", "type", "layout", "iconEmoji", "iconImage"}, + Keys: []string{"id", "name", "type", "snippet", "layout", "iconEmoji", "iconImage"}, // TODO split limit between spaces // Limit: paginationLimitPerSpace, // FullText: searchTerm, @@ -122,6 +88,7 @@ func (s *SearchService) Search(ctx context.Context, searchQuery string, objectTy ObjectId: record.Fields["id"].GetStringValue(), }) + // TODO: return snippet for notes? results = append(results, object.Object{ Type: model.ObjectTypeLayout_name[int32(record.Fields["layout"].GetNumberValue())], Id: record.Fields["id"].GetStringValue(), @@ -150,3 +117,107 @@ func (s *SearchService) Search(ctx context.Context, searchQuery string, objectTy paginatedResults, hasMore := pagination.Paginate(results, offset, limit) return paginatedResults, total, hasMore, nil } + +// makeAndCondition combines multiple filter groups with the given operator. +func (s *SearchService) combineFilters(operator model.BlockContentDataviewFilterOperator, filterGroups ...[]*model.BlockContentDataviewFilter) []*model.BlockContentDataviewFilter { + nestedFilters := make([]*model.BlockContentDataviewFilter, 0) + for _, group := range filterGroups { + nestedFilters = append(nestedFilters, group...) + } + + if len(nestedFilters) == 0 { + return nil + } + + return []*model.BlockContentDataviewFilter{ + { + Operator: operator, + NestedFilters: nestedFilters, + }, + } +} + +// prepareBaseFilters returns a list of default filters that should be applied to all search queries. +func (s *SearchService) prepareBaseFilters() []*model.BlockContentDataviewFilter { + return []*model.BlockContentDataviewFilter{ + { + Operator: model.BlockContentDataviewFilter_No, + RelationKey: bundle.RelationKeyLayout.String(), + Condition: model.BlockContentDataviewFilter_In, + Value: pbtypes.IntList([]int{ + int(model.ObjectType_basic), + int(model.ObjectType_profile), + int(model.ObjectType_todo), + int(model.ObjectType_note), + int(model.ObjectType_bookmark), + int(model.ObjectType_set), + // int(model.ObjectType_collection), + int(model.ObjectType_participant), + }...), + }, + { + Operator: model.BlockContentDataviewFilter_No, + RelationKey: bundle.RelationKeyIsHidden.String(), + Condition: model.BlockContentDataviewFilter_NotEqual, + Value: pbtypes.Bool(true), + }, + } +} + +// prepareQueryFilter combines object name and snippet filters with an OR condition. +func (s *SearchService) prepareQueryFilter(searchQuery string) []*model.BlockContentDataviewFilter { + if searchQuery == "" { + return nil + } + + return []*model.BlockContentDataviewFilter{ + { + Operator: model.BlockContentDataviewFilter_Or, + NestedFilters: []*model.BlockContentDataviewFilter{ + { + Operator: model.BlockContentDataviewFilter_No, + RelationKey: bundle.RelationKeyName.String(), + Condition: model.BlockContentDataviewFilter_Like, + Value: pbtypes.String(searchQuery), + }, + { + Operator: model.BlockContentDataviewFilter_No, + RelationKey: bundle.RelationKeySnippet.String(), + Condition: model.BlockContentDataviewFilter_Like, + Value: pbtypes.String(searchQuery), + }, + }, + }, + } +} + +// prepareObjectTypeFilters combines object type filters with an OR condition. +func (s *SearchService) prepareObjectTypeFilters(objectTypes []string) []*model.BlockContentDataviewFilter { + if len(objectTypes) == 0 || objectTypes[0] == "" { + return nil + } + + // Prepare nested filters for each object type + nestedFilters := make([]*model.BlockContentDataviewFilter, len(objectTypes)) + for i, objectType := range objectTypes { + relationKey := bundle.RelationKeyType.String() + if strings.HasPrefix(objectType, "ot-") { + relationKey = bundle.RelationKeyUniqueKey.String() + } + + nestedFilters[i] = &model.BlockContentDataviewFilter{ + Operator: model.BlockContentDataviewFilter_No, + RelationKey: relationKey, + Condition: model.BlockContentDataviewFilter_Equal, + Value: pbtypes.String(objectType), + } + } + + // Combine all filters with an OR operator + return []*model.BlockContentDataviewFilter{ + { + Operator: model.BlockContentDataviewFilter_Or, + NestedFilters: nestedFilters, + }, + } +} diff --git a/cmd/api/space/service.go b/cmd/api/space/service.go index fe5ed7a93..492ec26f0 100644 --- a/cmd/api/space/service.go +++ b/cmd/api/space/service.go @@ -48,16 +48,19 @@ func (s *SpaceService) ListSpaces(ctx context.Context, offset int, limit int) (s SpaceId: s.AccountInfo.TechSpaceId, Filters: []*model.BlockContentDataviewFilter{ { + Operator: model.BlockContentDataviewFilter_No, RelationKey: bundle.RelationKeyLayout.String(), Condition: model.BlockContentDataviewFilter_Equal, Value: pbtypes.Int64(int64(model.ObjectType_spaceView)), }, { + Operator: model.BlockContentDataviewFilter_No, RelationKey: bundle.RelationKeySpaceLocalStatus.String(), Condition: model.BlockContentDataviewFilter_Equal, Value: pbtypes.Int64(int64(model.SpaceStatus_Ok)), }, { + Operator: model.BlockContentDataviewFilter_No, RelationKey: bundle.RelationKeySpaceRemoteStatus.String(), Condition: model.BlockContentDataviewFilter_Equal, Value: pbtypes.Int64(int64(model.SpaceStatus_Ok)), From 017b963d326d580920a0643506179220883d99cd Mon Sep 17 00:00:00 2001 From: Jannis Metrikat <120120832+jmetrikat@users.noreply.github.com> Date: Thu, 2 Jan 2025 18:45:47 +0100 Subject: [PATCH 078/195] GO-4459: Rename auth handler and model --- cmd/api/auth/handler.go | 16 ++++++++-------- cmd/api/auth/model.go | 4 ++-- cmd/api/docs/docs.go | 8 ++++---- cmd/api/docs/swagger.json | 8 ++++---- cmd/api/docs/swagger.yaml | 8 ++++---- cmd/api/search/service.go | 2 +- cmd/api/server/router.go | 6 +++--- 7 files changed, 26 insertions(+), 26 deletions(-) diff --git a/cmd/api/auth/handler.go b/cmd/api/auth/handler.go index 0c5dfd269..353398364 100644 --- a/cmd/api/auth/handler.go +++ b/cmd/api/auth/handler.go @@ -8,16 +8,16 @@ import ( "github.com/anyproto/anytype-heart/cmd/api/util" ) -// AuthDisplayCodeHandler generates a new challenge and returns the challenge ID +// DisplayCodeHandler generates a new challenge and returns the challenge ID // // @Summary Open a modal window with a code in Anytype Desktop app // @Tags auth // @Accept json // @Produce json -// @Success 200 {object} AuthDisplayCodeResponse "Challenge ID" +// @Success 200 {object} DisplayCodeResponse "Challenge ID" // @Failure 502 {object} util.ServerError "Internal server error" // @Router /auth/displayCode [post] -func AuthDisplayCodeHandler(s *AuthService) gin.HandlerFunc { +func DisplayCodeHandler(s *AuthService) gin.HandlerFunc { return func(c *gin.Context) { challengeId, err := s.GenerateNewChallenge(c.Request.Context(), "api-test") code := util.MapErrorCode(err, util.ErrToCode(ErrFailedGenerateChallenge, http.StatusInternalServerError)) @@ -28,11 +28,11 @@ func AuthDisplayCodeHandler(s *AuthService) gin.HandlerFunc { return } - c.JSON(http.StatusOK, AuthDisplayCodeResponse{ChallengeId: challengeId}) + c.JSON(http.StatusOK, DisplayCodeResponse{ChallengeId: challengeId}) } } -// AuthTokenHandler retrieves an authentication token using a code and challenge ID +// TokenHandler retrieves an authentication token using a code and challenge ID // // @Summary Retrieve an authentication token using a code // @Tags auth @@ -40,11 +40,11 @@ func AuthDisplayCodeHandler(s *AuthService) gin.HandlerFunc { // @Produce json // @Param code query string true "The code retrieved from Anytype Desktop app" // @Param challenge_id query string true "The challenge ID" -// @Success 200 {object} AuthTokenResponse "Authentication token" +// @Success 200 {object} TokenResponse "Authentication token" // @Failure 400 {object} util.ValidationError "Invalid input" // @Failure 502 {object} util.ServerError "Internal server error" // @Router /auth/token [get] -func AuthTokenHandler(s *AuthService) gin.HandlerFunc { +func TokenHandler(s *AuthService) gin.HandlerFunc { return func(c *gin.Context) { challengeID := c.Query("challenge_id") code := c.Query("code") @@ -61,7 +61,7 @@ func AuthTokenHandler(s *AuthService) gin.HandlerFunc { return } - c.JSON(http.StatusOK, AuthTokenResponse{ + c.JSON(http.StatusOK, TokenResponse{ SessionToken: sessionToken, AppKey: appKey, }) diff --git a/cmd/api/auth/model.go b/cmd/api/auth/model.go index 706d9e5cd..e3e4af2c4 100644 --- a/cmd/api/auth/model.go +++ b/cmd/api/auth/model.go @@ -1,10 +1,10 @@ package auth -type AuthDisplayCodeResponse struct { +type DisplayCodeResponse struct { ChallengeId string `json:"challenge_id" example:"67647f5ecda913e9a2e11b26"` } -type AuthTokenResponse struct { +type TokenResponse struct { SessionToken string `json:"session_token" example:""` AppKey string `json:"app_key" example:""` } diff --git a/cmd/api/docs/docs.go b/cmd/api/docs/docs.go index c7a2aab4b..6479de3ff 100644 --- a/cmd/api/docs/docs.go +++ b/cmd/api/docs/docs.go @@ -40,7 +40,7 @@ const docTemplate = `{ "200": { "description": "Challenge ID", "schema": { - "$ref": "#/definitions/auth.AuthDisplayCodeResponse" + "$ref": "#/definitions/auth.DisplayCodeResponse" } }, "502": { @@ -84,7 +84,7 @@ const docTemplate = `{ "200": { "description": "Authentication token", "schema": { - "$ref": "#/definitions/auth.AuthTokenResponse" + "$ref": "#/definitions/auth.TokenResponse" } }, "400": { @@ -733,7 +733,7 @@ const docTemplate = `{ } }, "definitions": { - "auth.AuthDisplayCodeResponse": { + "auth.DisplayCodeResponse": { "type": "object", "properties": { "challenge_id": { @@ -742,7 +742,7 @@ const docTemplate = `{ } } }, - "auth.AuthTokenResponse": { + "auth.TokenResponse": { "type": "object", "properties": { "app_key": { diff --git a/cmd/api/docs/swagger.json b/cmd/api/docs/swagger.json index b34bb51a2..65e38342e 100644 --- a/cmd/api/docs/swagger.json +++ b/cmd/api/docs/swagger.json @@ -34,7 +34,7 @@ "200": { "description": "Challenge ID", "schema": { - "$ref": "#/definitions/auth.AuthDisplayCodeResponse" + "$ref": "#/definitions/auth.DisplayCodeResponse" } }, "502": { @@ -78,7 +78,7 @@ "200": { "description": "Authentication token", "schema": { - "$ref": "#/definitions/auth.AuthTokenResponse" + "$ref": "#/definitions/auth.TokenResponse" } }, "400": { @@ -727,7 +727,7 @@ } }, "definitions": { - "auth.AuthDisplayCodeResponse": { + "auth.DisplayCodeResponse": { "type": "object", "properties": { "challenge_id": { @@ -736,7 +736,7 @@ } } }, - "auth.AuthTokenResponse": { + "auth.TokenResponse": { "type": "object", "properties": { "app_key": { diff --git a/cmd/api/docs/swagger.yaml b/cmd/api/docs/swagger.yaml index e9786c94d..7b3023991 100644 --- a/cmd/api/docs/swagger.yaml +++ b/cmd/api/docs/swagger.yaml @@ -1,12 +1,12 @@ basePath: /v1 definitions: - auth.AuthDisplayCodeResponse: + auth.DisplayCodeResponse: properties: challenge_id: example: 67647f5ecda913e9a2e11b26 type: string type: object - auth.AuthTokenResponse: + auth.TokenResponse: properties: app_key: example: "" @@ -336,7 +336,7 @@ paths: "200": description: Challenge ID schema: - $ref: '#/definitions/auth.AuthDisplayCodeResponse' + $ref: '#/definitions/auth.DisplayCodeResponse' "502": description: Internal server error schema: @@ -365,7 +365,7 @@ paths: "200": description: Authentication token schema: - $ref: '#/definitions/auth.AuthTokenResponse' + $ref: '#/definitions/auth.TokenResponse' "400": description: Invalid input schema: diff --git a/cmd/api/search/service.go b/cmd/api/search/service.go index c856c50f4..d438a87a6 100644 --- a/cmd/api/search/service.go +++ b/cmd/api/search/service.go @@ -151,7 +151,7 @@ func (s *SearchService) prepareBaseFilters() []*model.BlockContentDataviewFilter int(model.ObjectType_note), int(model.ObjectType_bookmark), int(model.ObjectType_set), - // int(model.ObjectType_collection), + int(model.ObjectType_collection), int(model.ObjectType_participant), }...), }, diff --git a/cmd/api/server/router.go b/cmd/api/server/router.go index 37b905440..b5338ea28 100644 --- a/cmd/api/server/router.go +++ b/cmd/api/server/router.go @@ -30,11 +30,11 @@ func (s *Server) NewRouter() *gin.Engine { // Swagger route router.GET("/swagger/*any", ginSwagger.WrapHandler(swaggerFiles.Handler)) - // Unprotected routes + // Auth authRouter := router.Group("/v1/auth") { - authRouter.POST("/displayCode", auth.AuthDisplayCodeHandler(s.authService)) - authRouter.GET("/token", auth.AuthTokenHandler(s.authService)) + authRouter.POST("/displayCode", auth.DisplayCodeHandler(s.authService)) + authRouter.GET("/token", auth.TokenHandler(s.authService)) } // Read-only group From 0358d34af7585a2eb5c2a58fdb04db888dd24e2e Mon Sep 17 00:00:00 2001 From: Jannis Metrikat <120120832+jmetrikat@users.noreply.github.com> Date: Fri, 3 Jan 2025 19:13:20 +0100 Subject: [PATCH 079/195] GO-4459: Refactor handlers and middleware --- cmd/api/auth/service.go | 2 +- cmd/api/docs/docs.go | 6 +++++ cmd/api/docs/swagger.json | 6 +++++ cmd/api/docs/swagger.yaml | 4 +++ cmd/api/object/handler.go | 6 +++-- cmd/api/server/middleware.go | 47 ++++++------------------------------ cmd/api/space/handler.go | 7 +++--- 7 files changed, 32 insertions(+), 46 deletions(-) diff --git a/cmd/api/auth/service.go b/cmd/api/auth/service.go index 2ccd5200e..17afa23cf 100644 --- a/cmd/api/auth/service.go +++ b/cmd/api/auth/service.go @@ -29,7 +29,7 @@ func NewService(mw service.ClientCommandsServer) *AuthService { // GenerateNewChallenge calls AccountLocalLinkNewChallenge and returns the challenge ID, or an error if it fails. func (s *AuthService) GenerateNewChallenge(ctx context.Context, appName string) (string, error) { - resp := s.mw.AccountLocalLinkNewChallenge(ctx, &pb.RpcAccountLocalLinkNewChallengeRequest{AppName: "api-test"}) + resp := s.mw.AccountLocalLinkNewChallenge(ctx, &pb.RpcAccountLocalLinkNewChallengeRequest{AppName: appName}) if resp.Error.Code != pb.RpcAccountLocalLinkNewChallengeResponseError_NULL { return "", ErrFailedGenerateChallenge diff --git a/cmd/api/docs/docs.go b/cmd/api/docs/docs.go index 6479de3ff..400a4b48c 100644 --- a/cmd/api/docs/docs.go +++ b/cmd/api/docs/docs.go @@ -262,6 +262,12 @@ const docTemplate = `{ "$ref": "#/definitions/space.CreateSpaceResponse" } }, + "400": { + "description": "Bad request", + "schema": { + "$ref": "#/definitions/util.ValidationError" + } + }, "403": { "description": "Unauthorized", "schema": { diff --git a/cmd/api/docs/swagger.json b/cmd/api/docs/swagger.json index 65e38342e..22c0d4d92 100644 --- a/cmd/api/docs/swagger.json +++ b/cmd/api/docs/swagger.json @@ -256,6 +256,12 @@ "$ref": "#/definitions/space.CreateSpaceResponse" } }, + "400": { + "description": "Bad request", + "schema": { + "$ref": "#/definitions/util.ValidationError" + } + }, "403": { "description": "Unauthorized", "schema": { diff --git a/cmd/api/docs/swagger.yaml b/cmd/api/docs/swagger.yaml index 7b3023991..63fa856a0 100644 --- a/cmd/api/docs/swagger.yaml +++ b/cmd/api/docs/swagger.yaml @@ -483,6 +483,10 @@ paths: description: Space created successfully schema: $ref: '#/definitions/space.CreateSpaceResponse' + "400": + description: Bad request + schema: + $ref: '#/definitions/util.ValidationError' "403": description: Unauthorized schema: diff --git a/cmd/api/object/handler.go b/cmd/api/object/handler.go index 94e81de6d..0e5867c6a 100644 --- a/cmd/api/object/handler.go +++ b/cmd/api/object/handler.go @@ -98,7 +98,8 @@ func CreateObjectHandler(s *ObjectService) gin.HandlerFunc { request := CreateObjectRequest{} if err := c.BindJSON(&request); err != nil { - c.JSON(http.StatusBadRequest, util.CodeToAPIError(http.StatusBadRequest, ErrBadInput.Error())) + apiErr := util.CodeToAPIError(http.StatusBadRequest, err.Error()) + c.JSON(http.StatusBadRequest, apiErr) return } @@ -140,7 +141,8 @@ func UpdateObjectHandler(s *ObjectService) gin.HandlerFunc { request := UpdateObjectRequest{} if err := c.BindJSON(&request); err != nil { - c.JSON(http.StatusBadRequest, util.CodeToAPIError(http.StatusBadRequest, ErrBadInput.Error())) + apiErr := util.CodeToAPIError(http.StatusBadRequest, err.Error()) + c.JSON(http.StatusBadRequest, apiErr) return } diff --git a/cmd/api/server/middleware.go b/cmd/api/server/middleware.go index 82290e3df..362f5b298 100644 --- a/cmd/api/server/middleware.go +++ b/cmd/api/server/middleware.go @@ -10,12 +10,6 @@ import ( "github.com/anyproto/anytype-heart/core/anytype/account" ) -// TODO: User represents an authenticated user with permissions -type User struct { - ID string - Permissions string // "read-only" or "read-write" -} - // initAccountInfo retrieves the account information from the account service. func (s *Server) initAccountInfo() gin.HandlerFunc { return func(c *gin.Context) { @@ -39,43 +33,16 @@ func (s *Server) initAccountInfo() gin.HandlerFunc { } } -// TODO: AuthMiddleware ensures the user is authenticated. -func (s *Server) AuthMiddleware() gin.HandlerFunc { +// ensureAuthenticated is a middleware that ensures the request is authenticated. +func (s *Server) ensureAuthenticated() gin.HandlerFunc { return func(c *gin.Context) { - token := c.GetHeader("Authorization") - if token == "" { - c.AbortWithStatusJSON(http.StatusUnauthorized, gin.H{"error": "Unauthorized"}) - return - } + // token := c.GetHeader("Authorization") + // if token == "" { + // c.AbortWithStatusJSON(http.StatusUnauthorized, gin.H{"error": "Unauthorized"}) + // return + // } // TODO: Validate the token and retrieve user information; this is mock example - user := &User{ - ID: "user123", - Permissions: "read-only", // or "read-only" - } - - // Add the user to the context - c.Set("user", user) - c.Next() - } -} - -// TODO: PermissionMiddleware ensures the user has the required permissions. -func (s *Server) PermissionMiddleware(requiredPermission string) gin.HandlerFunc { - return func(c *gin.Context) { - user, exists := c.Get("user") - if !exists { - c.AbortWithStatusJSON(http.StatusUnauthorized, gin.H{"error": "Unauthorized"}) - return - } - - u := user.(*User) - if requiredPermission == "read-write" && u.Permissions != "read-write" { - c.AbortWithStatusJSON(http.StatusForbidden, gin.H{"error": "Forbidden: write access required"}) - return - } - - // For read-only access, both "read-only" and "read-write" permissions are acceptable c.Next() } } diff --git a/cmd/api/space/handler.go b/cmd/api/space/handler.go index 650f3c120..e50eec2f9 100644 --- a/cmd/api/space/handler.go +++ b/cmd/api/space/handler.go @@ -52,6 +52,7 @@ func GetSpacesHandler(s *SpaceService) gin.HandlerFunc { // @Produce json // @Param name body string true "Space Name" // @Success 200 {object} CreateSpaceResponse "Space created successfully" +// @Failure 400 {object} util.ValidationError "Bad request" // @Failure 403 {object} util.UnauthorizedError "Unauthorized" // @Failure 502 {object} util.ServerError "Internal server error" // @Router /spaces [post] @@ -59,12 +60,12 @@ func CreateSpaceHandler(s *SpaceService) gin.HandlerFunc { return func(c *gin.Context) { nameRequest := CreateSpaceRequest{} if err := c.BindJSON(&nameRequest); err != nil { - c.JSON(http.StatusBadRequest, gin.H{"message": "Invalid JSON"}) + apiErr := util.CodeToAPIError(http.StatusBadRequest, err.Error()) + c.JSON(http.StatusBadRequest, apiErr) return } - name := nameRequest.Name - space, err := s.CreateSpace(c.Request.Context(), name) + space, err := s.CreateSpace(c.Request.Context(), nameRequest.Name) code := util.MapErrorCode(err, util.ErrToCode(ErrFailedCreateSpace, http.StatusInternalServerError), ) From f869fbf7b770ce5ebff2f0a453ae68371448e3c3 Mon Sep 17 00:00:00 2001 From: Jannis Metrikat <120120832+jmetrikat@users.noreply.github.com> Date: Fri, 3 Jan 2025 19:15:01 +0100 Subject: [PATCH 080/195] GO-4459: Add object export endpoint --- cmd/api/docs/docs.go | 77 ++++++++++++++++++++++++++++++++++++ cmd/api/docs/swagger.json | 77 ++++++++++++++++++++++++++++++++++++ cmd/api/docs/swagger.yaml | 51 ++++++++++++++++++++++++ cmd/api/export/handler.go | 59 +++++++++++++++++++++++++++ cmd/api/export/model.go | 9 +++++ cmd/api/export/service.go | 61 ++++++++++++++++++++++++++++ cmd/api/server/middleware.go | 1 + cmd/api/server/router.go | 53 ++++++++++++------------- cmd/api/server/server.go | 3 ++ cmd/api/space/service.go | 1 + 10 files changed, 365 insertions(+), 27 deletions(-) create mode 100644 cmd/api/export/handler.go create mode 100644 cmd/api/export/model.go create mode 100644 cmd/api/export/service.go diff --git a/cmd/api/docs/docs.go b/cmd/api/docs/docs.go index 400a4b48c..cd9f1472e 100644 --- a/cmd/api/docs/docs.go +++ b/cmd/api/docs/docs.go @@ -736,6 +736,75 @@ const docTemplate = `{ } } } + }, + "/spaces/{space_id}/objects/{object_id}/export/{format}": { + "post": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "exports" + ], + "summary": "Export an object", + "parameters": [ + { + "type": "string", + "description": "Space ID", + "name": "space_id", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "Object ID", + "name": "object_id", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "Export format", + "name": "format", + "in": "query", + "required": true + } + ], + "responses": { + "200": { + "description": "Object exported successfully", + "schema": { + "$ref": "#/definitions/export.ObjectExportResponse" + } + }, + "400": { + "description": "Bad request", + "schema": { + "$ref": "#/definitions/util.ValidationError" + } + }, + "403": { + "description": "Unauthorized", + "schema": { + "$ref": "#/definitions/util.UnauthorizedError" + } + }, + "404": { + "description": "Resource not found", + "schema": { + "$ref": "#/definitions/util.NotFoundError" + } + }, + "502": { + "description": "Internal server error", + "schema": { + "$ref": "#/definitions/util.ServerError" + } + } + } + } } }, "definitions": { @@ -761,6 +830,14 @@ const docTemplate = `{ } } }, + "export.ObjectExportResponse": { + "type": "object", + "properties": { + "path": { + "type": "string" + } + } + }, "object.Block": { "type": "object", "properties": { diff --git a/cmd/api/docs/swagger.json b/cmd/api/docs/swagger.json index 22c0d4d92..ba80c68c3 100644 --- a/cmd/api/docs/swagger.json +++ b/cmd/api/docs/swagger.json @@ -730,6 +730,75 @@ } } } + }, + "/spaces/{space_id}/objects/{object_id}/export/{format}": { + "post": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "exports" + ], + "summary": "Export an object", + "parameters": [ + { + "type": "string", + "description": "Space ID", + "name": "space_id", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "Object ID", + "name": "object_id", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "Export format", + "name": "format", + "in": "query", + "required": true + } + ], + "responses": { + "200": { + "description": "Object exported successfully", + "schema": { + "$ref": "#/definitions/export.ObjectExportResponse" + } + }, + "400": { + "description": "Bad request", + "schema": { + "$ref": "#/definitions/util.ValidationError" + } + }, + "403": { + "description": "Unauthorized", + "schema": { + "$ref": "#/definitions/util.UnauthorizedError" + } + }, + "404": { + "description": "Resource not found", + "schema": { + "$ref": "#/definitions/util.NotFoundError" + } + }, + "502": { + "description": "Internal server error", + "schema": { + "$ref": "#/definitions/util.ServerError" + } + } + } + } } }, "definitions": { @@ -755,6 +824,14 @@ } } }, + "export.ObjectExportResponse": { + "type": "object", + "properties": { + "path": { + "type": "string" + } + } + }, "object.Block": { "type": "object", "properties": { diff --git a/cmd/api/docs/swagger.yaml b/cmd/api/docs/swagger.yaml index 63fa856a0..a6653423b 100644 --- a/cmd/api/docs/swagger.yaml +++ b/cmd/api/docs/swagger.yaml @@ -15,6 +15,11 @@ definitions: example: "" type: string type: object + export.ObjectExportResponse: + properties: + path: + type: string + type: object object.Block: properties: align: @@ -803,6 +808,52 @@ paths: summary: Update an existing object in a specific space tags: - space_objects + /spaces/{space_id}/objects/{object_id}/export/{format}: + post: + consumes: + - application/json + parameters: + - description: Space ID + in: path + name: space_id + required: true + type: string + - description: Object ID + in: path + name: object_id + required: true + type: string + - description: Export format + in: query + name: format + required: true + type: string + produces: + - application/json + responses: + "200": + description: Object exported successfully + schema: + $ref: '#/definitions/export.ObjectExportResponse' + "400": + description: Bad request + schema: + $ref: '#/definitions/util.ValidationError' + "403": + description: Unauthorized + schema: + $ref: '#/definitions/util.UnauthorizedError' + "404": + description: Resource not found + schema: + $ref: '#/definitions/util.NotFoundError' + "502": + description: Internal server error + schema: + $ref: '#/definitions/util.ServerError' + summary: Export an object + tags: + - exports securityDefinitions: BasicAuth: type: basic diff --git a/cmd/api/export/handler.go b/cmd/api/export/handler.go new file mode 100644 index 000000000..27cce4fc7 --- /dev/null +++ b/cmd/api/export/handler.go @@ -0,0 +1,59 @@ +package export + +import ( + "net/http" + + "github.com/gin-gonic/gin" + + "github.com/anyproto/anytype-heart/cmd/api/util" +) + +// GetObjectExportHandler exports an object to the specified format +// +// @Summary Export an object +// @Tags exports +// @Accept json +// @Produce json +// @Param space_id path string true "Space ID" +// @Param object_id path string true "Object ID" +// @Param format query string true "Export format" +// @Success 200 {object} ObjectExportResponse "Object exported successfully" +// @Failure 400 {object} util.ValidationError "Bad request" +// @Failure 403 {object} util.UnauthorizedError "Unauthorized" +// @Failure 404 {object} util.NotFoundError "Resource not found" +// @Failure 502 {object} util.ServerError "Internal server error" +// @Router /spaces/{space_id}/objects/{object_id}/export/{format} [post] +func GetObjectExportHandler(s *ExportService) gin.HandlerFunc { + return func(c *gin.Context) { + spaceId := c.Param("space_id") + objectId := c.Param("object_id") + format := c.Query("format") + + objectAsRequest := ObjectExportRequest{} + if err := c.ShouldBindJSON(&objectAsRequest); err != nil { + apiErr := util.CodeToAPIError(http.StatusBadRequest, ErrBadInput.Error()) + c.JSON(http.StatusBadRequest, apiErr) + return + } + + outputPath, err := s.GetObjectExport(c.Request.Context(), spaceId, objectId, format, objectAsRequest.Path) + code := util.MapErrorCode(err, util.ErrToCode(ErrFailedExportObjectAsMarkdown, http.StatusInternalServerError)) + + if code != http.StatusOK { + apiErr := util.CodeToAPIError(code, err.Error()) + c.JSON(code, apiErr) + return + } + + c.JSON(http.StatusOK, ObjectExportResponse{Path: outputPath}) + } +} + +func GetSpaceExportHandler(s *ExportService) gin.HandlerFunc { + return func(c *gin.Context) { + // spaceId := c.Param("space_id") + // format := c.Query("format") + + c.JSON(http.StatusNotImplemented, "Not implemented") + } +} diff --git a/cmd/api/export/model.go b/cmd/api/export/model.go new file mode 100644 index 000000000..f4f464d10 --- /dev/null +++ b/cmd/api/export/model.go @@ -0,0 +1,9 @@ +package export + +type ObjectExportRequest struct { + Path string `json:"path"` +} + +type ObjectExportResponse struct { + Path string `json:"path"` +} diff --git a/cmd/api/export/service.go b/cmd/api/export/service.go new file mode 100644 index 000000000..066c63a4f --- /dev/null +++ b/cmd/api/export/service.go @@ -0,0 +1,61 @@ +package export + +import ( + "context" + "errors" + + "github.com/anyproto/anytype-heart/pb" + "github.com/anyproto/anytype-heart/pb/service" + "github.com/anyproto/anytype-heart/pkg/lib/pb/model" +) + +var ( + ErrFailedExportObjectAsMarkdown = errors.New("failed to export object as markdown") + ErrBadInput = errors.New("bad input") +) + +type Service interface { + GetObjectExport(ctx context.Context, spaceId string, objectId string, format string, path string) (string, error) +} + +type ExportService struct { + mw service.ClientCommandsServer + AccountInfo *model.AccountInfo +} + +func NewService(mw service.ClientCommandsServer) *ExportService { + return &ExportService{mw: mw} +} + +// GetObjectExport retrieves an object from a space and exports it as a specific format. +func (s *ExportService) GetObjectExport(ctx context.Context, spaceId string, objectId string, format string, path string) (string, error) { + resp := s.mw.ObjectListExport(ctx, &pb.RpcObjectListExportRequest{ + SpaceId: spaceId, + Path: path, + ObjectIds: []string{objectId}, + Format: s.mapStringToFormat(format), + Zip: false, + IncludeNested: false, + IncludeFiles: true, + IsJson: false, + IncludeArchived: false, + }) + + if resp.Error.Code != pb.RpcObjectListExportResponseError_NULL { + return "", ErrFailedExportObjectAsMarkdown + } + + return resp.Path, nil +} + +// mapStringToFormat maps a format string to an ExportFormat enum. +func (s *ExportService) mapStringToFormat(format string) model.ExportFormat { + switch format { + case "markdown": + return model.Export_Markdown + case "protobuf": + return model.Export_Protobuf + default: + return model.Export_Markdown + } +} diff --git a/cmd/api/server/middleware.go b/cmd/api/server/middleware.go index 362f5b298..6cefcd012 100644 --- a/cmd/api/server/middleware.go +++ b/cmd/api/server/middleware.go @@ -26,6 +26,7 @@ func (s *Server) initAccountInfo() gin.HandlerFunc { return } + s.exportService.AccountInfo = accInfo s.objectService.AccountInfo = accInfo s.spaceService.AccountInfo = accInfo s.searchService.AccountInfo = accInfo diff --git a/cmd/api/server/router.go b/cmd/api/server/router.go index b5338ea28..ec04196fc 100644 --- a/cmd/api/server/router.go +++ b/cmd/api/server/router.go @@ -7,6 +7,7 @@ import ( "github.com/webstradev/gin-pagination/v2/pkg/pagination" "github.com/anyproto/anytype-heart/cmd/api/auth" + "github.com/anyproto/anytype-heart/cmd/api/export" "github.com/anyproto/anytype-heart/cmd/api/object" "github.com/anyproto/anytype-heart/cmd/api/search" "github.com/anyproto/anytype-heart/cmd/api/space" @@ -15,7 +16,6 @@ import ( // NewRouter builds and returns a *gin.Engine with all routes configured. func (s *Server) NewRouter() *gin.Engine { router := gin.Default() - router.Use(s.initAccountInfo()) // Pagination middleware setup paginator := pagination.New( @@ -30,35 +30,34 @@ func (s *Server) NewRouter() *gin.Engine { // Swagger route router.GET("/swagger/*any", ginSwagger.WrapHandler(swaggerFiles.Handler)) - // Auth - authRouter := router.Group("/v1/auth") + // API routes + v1 := router.Group("/v1") + v1.Use(s.initAccountInfo()) + v1.Use(s.ensureAuthenticated()) { - authRouter.POST("/displayCode", auth.DisplayCodeHandler(s.authService)) - authRouter.GET("/token", auth.TokenHandler(s.authService)) - } + // Auth + v1.POST("/auth/display_code", auth.DisplayCodeHandler(s.authService)) + v1.GET("/auth/token", auth.TokenHandler(s.authService)) - // Read-only group - readOnly := router.Group("/v1") - // readOnly.Use(a.AuthMiddleware()) - // readOnly.Use(a.PermissionMiddleware("read-only")) - { - readOnly.GET("/spaces", paginator, space.GetSpacesHandler(s.spaceService)) - readOnly.GET("/spaces/:space_id/members", paginator, space.GetMembersHandler(s.spaceService)) - readOnly.GET("/spaces/:space_id/objects", paginator, object.GetObjectsHandler(s.objectService)) - readOnly.GET("/spaces/:space_id/objects/:object_id", object.GetObjectHandler(s.objectService)) - readOnly.GET("/spaces/:space_id/objectTypes", paginator, object.GetTypesHandler(s.objectService)) - readOnly.GET("/spaces/:space_id/objectTypes/:typeId/templates", paginator, object.GetTemplatesHandler(s.objectService)) - readOnly.GET("/search", paginator, search.SearchHandler(s.searchService)) - } + // Export + v1.POST("/spaces/:space_id/objects/:object_id/export/:format", export.GetObjectExportHandler(s.exportService)) + v1.GET("/spaces/:space_id/objects/export/:format", export.GetSpaceExportHandler(s.exportService)) - // Read-write group - readWrite := router.Group("/v1") - // readWrite.Use(a.AuthMiddleware()) - // readWrite.Use(a.PermissionMiddleware("read-write")) - { - readWrite.POST("/spaces", space.CreateSpaceHandler(s.spaceService)) - readWrite.POST("/spaces/:space_id/objects", object.CreateObjectHandler(s.objectService)) - readWrite.PUT("/spaces/:space_id/objects/:object_id", object.UpdateObjectHandler(s.objectService)) + // Object + v1.GET("/spaces/:space_id/objects", paginator, object.GetObjectsHandler(s.objectService)) + v1.GET("/spaces/:space_id/objects/:object_id", object.GetObjectHandler(s.objectService)) + v1.GET("/spaces/:space_id/object_types", paginator, object.GetTypesHandler(s.objectService)) + v1.GET("/spaces/:space_id/object_types/:typeId/templates", paginator, object.GetTemplatesHandler(s.objectService)) + v1.POST("/spaces/:space_id/objects", object.CreateObjectHandler(s.objectService)) + v1.PUT("/spaces/:space_id/objects/:object_id", object.UpdateObjectHandler(s.objectService)) + + // Search + v1.GET("/search", paginator, search.SearchHandler(s.searchService)) + + // Space + v1.GET("/spaces", paginator, space.GetSpacesHandler(s.spaceService)) + v1.GET("/spaces/:space_id/members", paginator, space.GetMembersHandler(s.spaceService)) + v1.POST("/spaces", space.CreateSpaceHandler(s.spaceService)) } return router diff --git a/cmd/api/server/server.go b/cmd/api/server/server.go index 183fa0f64..3441e2965 100644 --- a/cmd/api/server/server.go +++ b/cmd/api/server/server.go @@ -9,6 +9,7 @@ import ( "github.com/gin-gonic/gin" "github.com/anyproto/anytype-heart/cmd/api/auth" + "github.com/anyproto/anytype-heart/cmd/api/export" "github.com/anyproto/anytype-heart/cmd/api/object" "github.com/anyproto/anytype-heart/cmd/api/search" "github.com/anyproto/anytype-heart/cmd/api/space" @@ -28,6 +29,7 @@ type Server struct { mwInternal core.MiddlewareInternal authService *auth.AuthService + exportService *export.ExportService objectService *object.ObjectService spaceService *space.SpaceService searchService *search.SearchService @@ -38,6 +40,7 @@ func NewServer(mw service.ClientCommandsServer, mwInternal core.MiddlewareIntern s := &Server{ mwInternal: mwInternal, authService: auth.NewService(mw), + exportService: export.NewService(mw), objectService: object.NewService(mw), spaceService: space.NewService(mw), } diff --git a/cmd/api/space/service.go b/cmd/api/space/service.go index 492ec26f0..2e47c15d2 100644 --- a/cmd/api/space/service.go +++ b/cmd/api/space/service.go @@ -23,6 +23,7 @@ var ( ErrFailedOpenWorkspace = errors.New("failed to open workspace") ErrFailedGenerateRandomIcon = errors.New("failed to generate random icon") ErrFailedCreateSpace = errors.New("failed to create space") + ErrBadInput = errors.New("bad input") ErrNoMembersFound = errors.New("no members found") ErrFailedListMembers = errors.New("failed to retrieve list of members") ) From 47acefc70408b04adc847217fd0bddf26b6453c1 Mon Sep 17 00:00:00 2001 From: Jannis Metrikat <120120832+jmetrikat@users.noreply.github.com> Date: Sat, 4 Jan 2025 17:10:13 +0100 Subject: [PATCH 081/195] GO-4459: Return object layout and unify GetObject usage --- cmd/api/demo/api_demo.go | 15 ++++++++------- cmd/api/docs/docs.go | 4 ++++ cmd/api/docs/swagger.json | 4 ++++ cmd/api/docs/swagger.yaml | 3 +++ cmd/api/object/model.go | 1 + cmd/api/object/service.go | 35 +++------------------------------- cmd/api/object/service_test.go | 2 +- cmd/api/search/service.go | 25 +++--------------------- cmd/api/search/service_test.go | 16 ++++++++-------- 9 files changed, 35 insertions(+), 70 deletions(-) diff --git a/cmd/api/demo/api_demo.go b/cmd/api/demo/api_demo.go index a46afa670..1848c06a3 100644 --- a/cmd/api/demo/api_demo.go +++ b/cmd/api/demo/api_demo.go @@ -55,23 +55,24 @@ func main() { // {"POST", "/auth/displayCode", nil, nil}, // {"GET", "/auth/token?challengeId={challengeId}&code={code}", map[string]interface{}{"challengeId": "6738dfc5cda913aad90e8c2a", "code": "2931"}, nil}, + // export + // {"GET", "/spaces/{space_id}/objects/{object_id}/export/{format}", map[string]interface{}{"space_id": testSpaceId, "object_id": testObjectId, "format": "markdown"}, nil}, + // spaces // {"POST", "/spaces", nil, map[string]interface{}{"name": "New Space"}}, // {"GET", "/spaces?limit={limit}&offset={offset}", map[string]interface{}{"limit": 100, "offset": 0}, nil}, // {"GET", "/spaces/{space_id}/members?limit={limit}&offset={offset}", map[string]interface{}{"space_id": testSpaceId, "limit": 100, "offset": 0}, nil}, - // space_objects + // objects // {"GET", "/spaces/{space_id}/objects?limit={limit}&offset={offset}", map[string]interface{}{"space_id": testSpaceId, "limit": 100, "offset": 0}, nil}, // {"GET", "/spaces/{space_id}/objects/{object_id}", map[string]interface{}{"space_id": testSpaceId, "object_id": testObjectId}, nil}, - // {"POST", "/spaces/{space_id}/objects", map[string]interface{}{"space_id": testSpaceId}, map[string]interface{}{"name": "New Object from demo", "icon_emoji": "💥", "template_id": "", "object_type_unique_key": "ot-page", "with_chat": false}}, + // {"POST", "/spaces/{space_id}/objects", map[string]interface{}{"space_id": testSpaceId}, map[string]interface{}{"name": "New Object from demo", "icon": "💥", "template_id": "", "object_type_unique_key": "ot-page", "with_chat": false}}, // {"PUT", "/spaces/{space_id}/objects/{object_id}", map[string]interface{}{"space_id": testSpaceId, "object_id": testObjectId}, map[string]interface{}{"name": "Updated Object"}}, - - // types_and_templates - // {"GET", "/spaces/{space_id}/objectTypes?limit={limit}&offset={offset}", map[string]interface{}{"space_id": testSpaceId, "limit": 100, "offset": 0}, nil}, - // {"GET", "/spaces/{space_id}/objectTypes/{type_id}/templates?limit={limit}&offset={offset}", map[string]interface{}{"space_id": testSpaceId, "type_id": testTypeId, "limit": 100, "offset": 0}, nil}, + // {"GET", "/spaces/{space_id}/object_types?limit={limit}&offset={offset}", map[string]interface{}{"space_id": testSpaceId, "limit": 100, "offset": 0}, nil}, + // {"GET", "/spaces/{space_id}/object_types/{type_id}/templates?limit={limit}&offset={offset}", map[string]interface{}{"space_id": testSpaceId, "type_id": testTypeId, "limit": 100, "offset": 0}, nil}, // search - // {"GET", "/search?query={query}&object_type={object_type}&limit={limit}&offset={offset}", map[string]interface{}{"query": "Tag", "object_type": testTypeId, "limit": 100, "offset": 0}, nil}, + // {"GET", "/search?query={query}&object_types={object_types}&limit={limit}&offset={offset}", map[string]interface{}{"query": "new", "object_types": "", "limit": 100, "offset": 0}, nil}, } for _, ep := range endpoints { diff --git a/cmd/api/docs/docs.go b/cmd/api/docs/docs.go index cd9f1472e..3f9f3d61b 100644 --- a/cmd/api/docs/docs.go +++ b/cmd/api/docs/docs.go @@ -942,6 +942,10 @@ const docTemplate = `{ "type": "string", "example": "bafyreie6n5l5nkbjal37su54cha4coy7qzuhrnajluzv5qd5jvtsrxkequ" }, + "layout": { + "type": "string", + "example": "basic" + }, "name": { "type": "string", "example": "Object Name" diff --git a/cmd/api/docs/swagger.json b/cmd/api/docs/swagger.json index ba80c68c3..1f9fcf0d5 100644 --- a/cmd/api/docs/swagger.json +++ b/cmd/api/docs/swagger.json @@ -936,6 +936,10 @@ "type": "string", "example": "bafyreie6n5l5nkbjal37su54cha4coy7qzuhrnajluzv5qd5jvtsrxkequ" }, + "layout": { + "type": "string", + "example": "basic" + }, "name": { "type": "string", "example": "Object Name" diff --git a/cmd/api/docs/swagger.yaml b/cmd/api/docs/swagger.yaml index a6653423b..5431da43f 100644 --- a/cmd/api/docs/swagger.yaml +++ b/cmd/api/docs/swagger.yaml @@ -89,6 +89,9 @@ definitions: id: example: bafyreie6n5l5nkbjal37su54cha4coy7qzuhrnajluzv5qd5jvtsrxkequ type: string + layout: + example: basic + type: string name: example: Object Name type: string diff --git a/cmd/api/object/model.go b/cmd/api/object/model.go index 96f714a73..ff5387b00 100644 --- a/cmd/api/object/model.go +++ b/cmd/api/object/model.go @@ -29,6 +29,7 @@ type Object struct { Id string `json:"id" example:"bafyreie6n5l5nkbjal37su54cha4coy7qzuhrnajluzv5qd5jvtsrxkequ"` Name string `json:"name" example:"Object Name"` Icon string `json:"icon" example:"📄"` + Layout string `json:"layout" example:"basic"` ObjectType string `json:"object_type" example:"Page"` SpaceId string `json:"space_id" example:"bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1"` RootId string `json:"root_id"` diff --git a/cmd/api/object/service.go b/cmd/api/object/service.go index d7a494f4d..4dc1e9a2b 100644 --- a/cmd/api/object/service.go +++ b/cmd/api/object/service.go @@ -82,7 +82,7 @@ func (s *ObjectService) ListObjects(ctx context.Context, spaceId string, offset Offset: 0, Limit: 0, ObjectTypeFilter: []string{}, - Keys: []string{"id", "name", "type", "layout", "iconEmoji", "iconImage"}, + Keys: []string{"id", "name"}, }) if resp.Error.Code != pb.RpcObjectSearchResponseError_NULL { @@ -103,9 +103,6 @@ func (s *ObjectService) ListObjects(ctx context.Context, spaceId string, offset return nil, 0, false, err } - // TODO: layout is not correctly returned in ObjectShow; therefore we need to resolve it here - object.Type = model.ObjectTypeLayout_name[int32(record.Fields["layout"].GetNumberValue())] - objects = append(objects, object) } return objects, total, hasMore, nil @@ -137,6 +134,7 @@ func (s *ObjectService) GetObject(ctx context.Context, spaceId string, objectId Id: resp.ObjectView.Details[0].Details.Fields["id"].GetStringValue(), Name: resp.ObjectView.Details[0].Details.Fields["name"].GetStringValue(), Icon: icon, + Layout: model.ObjectTypeLayout_name[int32(resp.ObjectView.Details[0].Details.Fields["layout"].GetNumberValue())], ObjectType: objectTypeName, SpaceId: resp.ObjectView.Details[0].Details.Fields["spaceId"].GetStringValue(), RootId: resp.ObjectView.RootId, @@ -166,34 +164,7 @@ func (s *ObjectService) CreateObject(ctx context.Context, spaceId string, reques return Object{}, ErrFailedCreateObject } - objShowResp := s.mw.ObjectShow(ctx, &pb.RpcObjectShowRequest{ - SpaceId: spaceId, - ObjectId: resp.ObjectId, - }) - - if objShowResp.Error.Code != pb.RpcObjectShowResponseError_NULL { - return Object{}, ErrFailedRetrieveObject - } - - icon2 := util.GetIconFromEmojiOrImage(s.AccountInfo, objShowResp.ObjectView.Details[0].Details.Fields["iconEmoji"].GetStringValue(), objShowResp.ObjectView.Details[0].Details.Fields["iconImage"].GetStringValue()) - objectTypeName, err := util.ResolveTypeToName(s.mw, spaceId, objShowResp.ObjectView.Details[0].Details.Fields["type"].GetStringValue()) - if err != nil { - return Object{}, err - } - - object := Object{ - Type: "object", - Id: resp.ObjectId, - Name: objShowResp.ObjectView.Details[0].Details.Fields["name"].GetStringValue(), - Icon: icon2, - ObjectType: objectTypeName, - SpaceId: objShowResp.ObjectView.Details[0].Details.Fields["spaceId"].GetStringValue(), - RootId: objShowResp.ObjectView.RootId, - Blocks: s.GetBlocks(objShowResp), - Details: s.GetDetails(objShowResp), - } - - return object, nil + return s.GetObject(ctx, spaceId, resp.ObjectId) } // UpdateObject updates an existing object in a specific space. diff --git a/cmd/api/object/service_test.go b/cmd/api/object/service_test.go index 96cd526dc..8ce672413 100644 --- a/cmd/api/object/service_test.go +++ b/cmd/api/object/service_test.go @@ -79,7 +79,7 @@ func TestObjectService_ListObjects(t *testing.T) { Offset: 0, Limit: 0, ObjectTypeFilter: []string{}, - Keys: []string{"id", "name", "type", "layout", "iconEmoji", "iconImage"}, + Keys: []string{"id", "name"}, }).Return(&pb.RpcObjectSearchResponse{ Records: []*types.Struct{ { diff --git a/cmd/api/search/service.go b/cmd/api/search/service.go index d438a87a6..09aea44f9 100644 --- a/cmd/api/search/service.go +++ b/cmd/api/search/service.go @@ -9,7 +9,6 @@ import ( "github.com/anyproto/anytype-heart/cmd/api/object" "github.com/anyproto/anytype-heart/cmd/api/pagination" "github.com/anyproto/anytype-heart/cmd/api/space" - "github.com/anyproto/anytype-heart/cmd/api/util" "github.com/anyproto/anytype-heart/pb" "github.com/anyproto/anytype-heart/pb/service" "github.com/anyproto/anytype-heart/pkg/lib/bundle" @@ -62,7 +61,7 @@ func (s *SearchService) Search(ctx context.Context, searchQuery string, objectTy IncludeTime: true, EmptyPlacement: model.BlockContentDataviewSort_NotSpecified, }}, - Keys: []string{"id", "name", "type", "snippet", "layout", "iconEmoji", "iconImage"}, + Keys: []string{"id", "name"}, // TODO split limit between spaces // Limit: paginationLimitPerSpace, // FullText: searchTerm, @@ -77,29 +76,11 @@ func (s *SearchService) Search(ctx context.Context, searchQuery string, objectTy } for _, record := range objResp.Records { - icon := util.GetIconFromEmojiOrImage(s.AccountInfo, record.Fields["iconEmoji"].GetStringValue(), record.Fields["iconImage"].GetStringValue()) - objectTypeName, err := util.ResolveTypeToName(s.mw, spaceId, record.Fields["type"].GetStringValue()) + object, err := s.objectService.GetObject(ctx, spaceId, record.Fields["id"].GetStringValue()) if err != nil { return nil, 0, false, err } - - showResp := s.mw.ObjectShow(ctx, &pb.RpcObjectShowRequest{ - SpaceId: spaceId, - ObjectId: record.Fields["id"].GetStringValue(), - }) - - // TODO: return snippet for notes? - results = append(results, object.Object{ - Type: model.ObjectTypeLayout_name[int32(record.Fields["layout"].GetNumberValue())], - Id: record.Fields["id"].GetStringValue(), - Name: record.Fields["name"].GetStringValue(), - Icon: icon, - ObjectType: objectTypeName, - SpaceId: spaceId, - RootId: showResp.ObjectView.RootId, - Blocks: s.objectService.GetBlocks(showResp), - Details: s.objectService.GetDetails(showResp), - }) + results = append(results, object) } } diff --git a/cmd/api/search/service_test.go b/cmd/api/search/service_test.go index cf3f06180..bbc795c89 100644 --- a/cmd/api/search/service_test.go +++ b/cmd/api/search/service_test.go @@ -110,12 +110,8 @@ func TestSearchService_Search(t *testing.T) { Records: []*types.Struct{ { Fields: map[string]*types.Value{ - "id": pbtypes.String("obj-global-1"), - "name": pbtypes.String("Global Object"), - "type": pbtypes.String("global-type-id"), - "layout": pbtypes.Float64(float64(model.ObjectType_basic)), - "iconEmoji": pbtypes.String("🌐"), - "lastModifiedDate": pbtypes.Float64(999999), + "id": pbtypes.String("obj-global-1"), + "name": pbtypes.String("Global Object"), }, }, }, @@ -167,10 +163,13 @@ func TestSearchService_Search(t *testing.T) { Id: "root-123", Details: &types.Struct{ Fields: map[string]*types.Value{ + "id": pbtypes.String("obj-global-1"), "name": pbtypes.String("Global Object"), + "layout": pbtypes.Int64(int64(model.ObjectType_basic)), "iconEmoji": pbtypes.String("🌐"), "lastModifiedDate": pbtypes.Float64(999999), "createdDate": pbtypes.Float64(888888), + "spaceId": pbtypes.String("space-1"), "tag": pbtypes.StringList([]string{"tag-1", "tag-2"}), }, }, @@ -199,16 +198,17 @@ func TestSearchService_Search(t *testing.T) { }, nil).Once() // when - objects, total, hasMore, err := fx.Search(ctx, "search-term", "", offset, limit) + objects, total, hasMore, err := fx.Search(ctx, "search-term", []string{}, offset, limit) // then require.NoError(t, err) require.Len(t, objects, 1) + require.Equal(t, "object", objects[0].Type) require.Equal(t, "space-1", objects[0].SpaceId) require.Equal(t, "Global Object", objects[0].Name) require.Equal(t, "obj-global-1", objects[0].Id) + require.Equal(t, "basic", objects[0].Layout) require.Equal(t, "🌐", objects[0].Icon) - require.Equal(t, "basic", objects[0].Type) require.Equal(t, "This is a sample text block", objects[0].Blocks[2].Text.Text) // check details From 4cd1d481ff957b54bdddd1109374949a9be6498b Mon Sep 17 00:00:00 2001 From: Jannis Metrikat <120120832+jmetrikat@users.noreply.github.com> Date: Sat, 4 Jan 2025 21:02:16 +0100 Subject: [PATCH 082/195] GO-4459: Add description, body, source to CreateObjectRequest --- cmd/api/object/handler.go | 6 +++ cmd/api/object/model.go | 3 ++ cmd/api/object/service.go | 92 ++++++++++++++++++++++++++++++++++++--- 3 files changed, 94 insertions(+), 7 deletions(-) diff --git a/cmd/api/object/handler.go b/cmd/api/object/handler.go index 0e5867c6a..61515b8c2 100644 --- a/cmd/api/object/handler.go +++ b/cmd/api/object/handler.go @@ -33,6 +33,8 @@ func GetObjectsHandler(s *ObjectService) gin.HandlerFunc { code := util.MapErrorCode(err, util.ErrToCode(ErrorFailedRetrieveObjects, http.StatusInternalServerError), util.ErrToCode(ErrNoObjectsFound, http.StatusNotFound), + util.ErrToCode(ErrObjectNotFound, http.StatusNotFound), + util.ErrToCode(ErrFailedRetrieveObject, http.StatusInternalServerError), ) if code != http.StatusOK { @@ -105,7 +107,11 @@ func CreateObjectHandler(s *ObjectService) gin.HandlerFunc { object, err := s.CreateObject(c.Request.Context(), spaceId, request) code := util.MapErrorCode(err, + util.ErrToCode(ErrInputMissingSource, http.StatusBadRequest), util.ErrToCode(ErrFailedCreateObject, http.StatusInternalServerError), + util.ErrToCode(ErrFailedSetRelationFeatured, http.StatusInternalServerError), + util.ErrToCode(ErrFailedFetchBookmark, http.StatusInternalServerError), + util.ErrToCode(ErrObjectNotFound, http.StatusNotFound), util.ErrToCode(ErrFailedRetrieveObject, http.StatusInternalServerError), ) diff --git a/cmd/api/object/model.go b/cmd/api/object/model.go index ff5387b00..5cb45f5fd 100644 --- a/cmd/api/object/model.go +++ b/cmd/api/object/model.go @@ -7,6 +7,9 @@ type GetObjectResponse struct { type CreateObjectRequest struct { Name string `json:"name"` Icon string `json:"icon"` + Description string `json:"description"` + Body string `json:"body"` + Source string `json:"source"` TemplateId string `json:"template_id"` ObjectTypeUniqueKey string `json:"object_type_unique_key"` WithChat bool `json:"with_chat"` diff --git a/cmd/api/object/service.go b/cmd/api/object/service.go index 4dc1e9a2b..9e8872330 100644 --- a/cmd/api/object/service.go +++ b/cmd/api/object/service.go @@ -21,7 +21,10 @@ var ( ErrorFailedRetrieveObjects = errors.New("failed to retrieve list of objects") ErrNoObjectsFound = errors.New("no objects found") ErrFailedCreateObject = errors.New("failed to create object") - ErrBadInput = errors.New("bad input") + ErrInputMissingSource = errors.New("source is missing for bookmark") + ErrFailedSetRelationFeatured = errors.New("failed to set relation featured") + ErrFailedFetchBookmark = errors.New("failed to fetch bookmark") + ErrFailedPasteBody = errors.New("failed to paste body") ErrNotImplemented = errors.New("not implemented") ErrFailedUpdateObject = errors.New("failed to update object") ErrFailedRetrieveTypes = errors.New("failed to retrieve types") @@ -147,13 +150,21 @@ func (s *ObjectService) GetObject(ctx context.Context, spaceId string, objectId // CreateObject creates a new object in a specific space. func (s *ObjectService) CreateObject(ctx context.Context, spaceId string, request CreateObjectRequest) (Object, error) { - resp := s.mw.ObjectCreate(ctx, &pb.RpcObjectCreateRequest{ - Details: &types.Struct{ - Fields: map[string]*types.Value{ - "name": pbtypes.String(request.Name), - "iconEmoji": pbtypes.String(request.Icon), - }, + if request.ObjectTypeUniqueKey == "ot-bookmark" && request.Source == "" { + return Object{}, ErrInputMissingSource + } + + details := &types.Struct{ + Fields: map[string]*types.Value{ + "name": pbtypes.String(request.Name), + "iconEmoji": pbtypes.String(request.Icon), + "description": pbtypes.String(request.Description), + "source": pbtypes.String(request.Source), }, + } + + resp := s.mw.ObjectCreate(ctx, &pb.RpcObjectCreateRequest{ + Details: details, TemplateId: request.TemplateId, SpaceId: spaceId, ObjectTypeUniqueKey: request.ObjectTypeUniqueKey, @@ -164,6 +175,73 @@ func (s *ObjectService) CreateObject(ctx context.Context, spaceId string, reques return Object{}, ErrFailedCreateObject } + // ObjectRelationAddFeatured if description was set + if request.Description != "" { + relAddFeatResp := s.mw.ObjectRelationAddFeatured(ctx, &pb.RpcObjectRelationAddFeaturedRequest{ + ContextId: resp.ObjectId, + Relations: []string{"description"}, + }) + + if relAddFeatResp.Error.Code != pb.RpcObjectRelationAddFeaturedResponseError_NULL { + object, _ := s.GetObject(ctx, spaceId, resp.ObjectId) + return object, ErrFailedSetRelationFeatured + } + } + + // ObjectBookmarkFetch after creating a bookmark object + if request.ObjectTypeUniqueKey == "ot-bookmark" { + bookmarkResp := s.mw.ObjectBookmarkFetch(ctx, &pb.RpcObjectBookmarkFetchRequest{ + ContextId: resp.ObjectId, + Url: request.Source, + }) + + if bookmarkResp.Error.Code != pb.RpcObjectBookmarkFetchResponseError_NULL { + object, _ := s.GetObject(ctx, spaceId, resp.ObjectId) + return object, ErrFailedFetchBookmark + } + } + + // First call BlockCreate at top, then BlockPaste to paste the body + if request.Body != "" { + blockCreateResp := s.mw.BlockCreate(ctx, &pb.RpcBlockCreateRequest{ + ContextId: resp.ObjectId, + TargetId: "", + Block: &model.Block{ + Id: "", + BackgroundColor: "", + Align: model.Block_AlignLeft, + VerticalAlign: model.Block_VerticalAlignTop, + Content: &model.BlockContentOfText{ + Text: &model.BlockContentText{ + Text: "", + Style: model.BlockContentText_Paragraph, + Checked: false, + Color: "", + IconEmoji: "", + IconImage: "", + }, + }, + }, + Position: model.Block_Bottom, + }) + + if blockCreateResp.Error.Code != pb.RpcBlockCreateResponseError_NULL { + object, _ := s.GetObject(ctx, spaceId, resp.ObjectId) + return object, ErrFailedCreateObject + } + + blockPasteResp := s.mw.BlockPaste(ctx, &pb.RpcBlockPasteRequest{ + ContextId: resp.ObjectId, + FocusedBlockId: blockCreateResp.BlockId, + TextSlot: request.Body, + }) + + if blockPasteResp.Error.Code != pb.RpcBlockPasteResponseError_NULL { + object, _ := s.GetObject(ctx, spaceId, resp.ObjectId) + return object, ErrFailedPasteBody + } + } + return s.GetObject(ctx, spaceId, resp.ObjectId) } From 5214bb76cf11e9bbafca26307920c3d1e1de0c74 Mon Sep 17 00:00:00 2001 From: Jannis Metrikat <120120832+jmetrikat@users.noreply.github.com> Date: Mon, 6 Jan 2025 13:20:44 +0100 Subject: [PATCH 083/195] GO-4459: Fix objectType filters by resolving uniqueKey to actual type's id --- cmd/api/search/service.go | 27 +++++++++++++++++---------- cmd/api/util/util.go | 25 +++++++++++++++++++++++++ 2 files changed, 42 insertions(+), 10 deletions(-) diff --git a/cmd/api/search/service.go b/cmd/api/search/service.go index 09aea44f9..f95363f65 100644 --- a/cmd/api/search/service.go +++ b/cmd/api/search/service.go @@ -9,6 +9,7 @@ import ( "github.com/anyproto/anytype-heart/cmd/api/object" "github.com/anyproto/anytype-heart/cmd/api/pagination" "github.com/anyproto/anytype-heart/cmd/api/space" + "github.com/anyproto/anytype-heart/cmd/api/util" "github.com/anyproto/anytype-heart/pb" "github.com/anyproto/anytype-heart/pb/service" "github.com/anyproto/anytype-heart/pkg/lib/bundle" @@ -45,14 +46,15 @@ func (s *SearchService) Search(ctx context.Context, searchQuery string, objectTy baseFilters := s.prepareBaseFilters() queryFilters := s.prepareQueryFilter(searchQuery) - objectTypeFilters := s.prepareObjectTypeFilters(objectTypes) - filters := s.combineFilters(model.BlockContentDataviewFilter_And, baseFilters, queryFilters, objectTypeFilters) results := make([]object.Object, 0) for _, space := range spaces { - spaceId := space.Id + // Resolve object type IDs per space, as they are unique per space + objectTypeFilters := s.prepareObjectTypeFilters(space.Id, objectTypes) + filters := s.combineFilters(model.BlockContentDataviewFilter_And, baseFilters, queryFilters, objectTypeFilters) + objResp := s.mw.ObjectSearch(ctx, &pb.RpcObjectSearchRequest{ - SpaceId: spaceId, + SpaceId: space.Id, Filters: filters, Sorts: []*model.BlockContentDataviewSort{{ RelationKey: bundle.RelationKeyLastModifiedDate.String(), @@ -76,7 +78,7 @@ func (s *SearchService) Search(ctx context.Context, searchQuery string, objectTy } for _, record := range objResp.Records { - object, err := s.objectService.GetObject(ctx, spaceId, record.Fields["id"].GetStringValue()) + object, err := s.objectService.GetObject(ctx, space.Id, record.Fields["id"].GetStringValue()) if err != nil { return nil, 0, false, err } @@ -173,7 +175,7 @@ func (s *SearchService) prepareQueryFilter(searchQuery string) []*model.BlockCon } // prepareObjectTypeFilters combines object type filters with an OR condition. -func (s *SearchService) prepareObjectTypeFilters(objectTypes []string) []*model.BlockContentDataviewFilter { +func (s *SearchService) prepareObjectTypeFilters(spaceId string, objectTypes []string) []*model.BlockContentDataviewFilter { if len(objectTypes) == 0 || objectTypes[0] == "" { return nil } @@ -181,16 +183,21 @@ func (s *SearchService) prepareObjectTypeFilters(objectTypes []string) []*model. // Prepare nested filters for each object type nestedFilters := make([]*model.BlockContentDataviewFilter, len(objectTypes)) for i, objectType := range objectTypes { - relationKey := bundle.RelationKeyType.String() + typeId := objectType + if strings.HasPrefix(objectType, "ot-") { - relationKey = bundle.RelationKeyUniqueKey.String() + var err error + typeId, err = util.ResolveUniqueKeyToTypeId(s.mw, spaceId, objectType) + if err != nil { + continue + } } nestedFilters[i] = &model.BlockContentDataviewFilter{ Operator: model.BlockContentDataviewFilter_No, - RelationKey: relationKey, + RelationKey: bundle.RelationKeyType.String(), Condition: model.BlockContentDataviewFilter_Equal, - Value: pbtypes.String(objectType), + Value: pbtypes.String(typeId), } } diff --git a/cmd/api/util/util.go b/cmd/api/util/util.go index 38c75fe34..7d467674b 100644 --- a/cmd/api/util/util.go +++ b/cmd/api/util/util.go @@ -71,3 +71,28 @@ func ResolveTypeToName(mw service.ClientCommandsServer, spaceId string, typeId s return resp.Records[0].Fields["name"].GetStringValue(), nil } + +func ResolveUniqueKeyToTypeId(mw service.ClientCommandsServer, spaceId string, uniqueKey string) (typeId string, err error) { + // Call ObjectSearch for type with unique key and return the type's ID + resp := mw.ObjectSearch(context.Background(), &pb.RpcObjectSearchRequest{ + SpaceId: spaceId, + Filters: []*model.BlockContentDataviewFilter{ + { + RelationKey: bundle.RelationKeyUniqueKey.String(), + Condition: model.BlockContentDataviewFilter_Equal, + Value: pbtypes.String(uniqueKey), + }, + }, + Keys: []string{"id"}, + }) + + if resp.Error.Code != pb.RpcObjectSearchResponseError_NULL { + return "", ErrFailedSearchType + } + + if len(resp.Records) == 0 { + return "", ErrorTypeNotFound + } + + return resp.Records[0].Fields["id"].GetStringValue(), nil +} From 6aa11620610d1073fe847c29b45afd1522422854 Mon Sep 17 00:00:00 2001 From: Jannis Metrikat <120120832+jmetrikat@users.noreply.github.com> Date: Mon, 6 Jan 2025 20:51:19 +0100 Subject: [PATCH 084/195] GO-4459: Fix object search crash by avoiding nil object type filters --- cmd/api/search/service.go | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/cmd/api/search/service.go b/cmd/api/search/service.go index f95363f65..0014e7eaa 100644 --- a/cmd/api/search/service.go +++ b/cmd/api/search/service.go @@ -105,7 +105,9 @@ func (s *SearchService) Search(ctx context.Context, searchQuery string, objectTy func (s *SearchService) combineFilters(operator model.BlockContentDataviewFilterOperator, filterGroups ...[]*model.BlockContentDataviewFilter) []*model.BlockContentDataviewFilter { nestedFilters := make([]*model.BlockContentDataviewFilter, 0) for _, group := range filterGroups { - nestedFilters = append(nestedFilters, group...) + if len(group) > 0 { + nestedFilters = append(nestedFilters, group...) + } } if len(nestedFilters) == 0 { @@ -181,8 +183,8 @@ func (s *SearchService) prepareObjectTypeFilters(spaceId string, objectTypes []s } // Prepare nested filters for each object type - nestedFilters := make([]*model.BlockContentDataviewFilter, len(objectTypes)) - for i, objectType := range objectTypes { + nestedFilters := make([]*model.BlockContentDataviewFilter, 0, len(objectTypes)) + for _, objectType := range objectTypes { typeId := objectType if strings.HasPrefix(objectType, "ot-") { @@ -193,12 +195,16 @@ func (s *SearchService) prepareObjectTypeFilters(spaceId string, objectTypes []s } } - nestedFilters[i] = &model.BlockContentDataviewFilter{ + nestedFilters = append(nestedFilters, &model.BlockContentDataviewFilter{ Operator: model.BlockContentDataviewFilter_No, RelationKey: bundle.RelationKeyType.String(), Condition: model.BlockContentDataviewFilter_Equal, Value: pbtypes.String(typeId), - } + }) + } + + if len(nestedFilters) == 0 { + return nil } // Combine all filters with an OR operator From a9eb7259a11785acdcdd27698ae800922de66a44 Mon Sep 17 00:00:00 2001 From: Jannis Metrikat <120120832+jmetrikat@users.noreply.github.com> Date: Wed, 8 Jan 2025 23:27:19 +0100 Subject: [PATCH 085/195] GO-4459: Update swagger docs --- cmd/api/auth/handler.go | 14 +++++++------- cmd/api/auth/service.go | 8 ++++---- cmd/api/demo/api_demo.go | 4 ++-- cmd/api/docs/docs.go | 32 ++++++++++++++++---------------- cmd/api/docs/swagger.json | 32 ++++++++++++++++---------------- cmd/api/docs/swagger.yaml | 34 +++++++++++++++++----------------- cmd/api/export/handler.go | 2 +- cmd/api/object/handler.go | 20 ++++++++++---------- cmd/api/server/router.go | 4 ++-- 9 files changed, 75 insertions(+), 75 deletions(-) diff --git a/cmd/api/auth/handler.go b/cmd/api/auth/handler.go index 353398364..907218510 100644 --- a/cmd/api/auth/handler.go +++ b/cmd/api/auth/handler.go @@ -15,8 +15,8 @@ import ( // @Accept json // @Produce json // @Success 200 {object} DisplayCodeResponse "Challenge ID" -// @Failure 502 {object} util.ServerError "Internal server error" -// @Router /auth/displayCode [post] +// @Failure 502 {object} util.ServerError "Internal server error" +// @Router /auth/display_code [post] func DisplayCodeHandler(s *AuthService) gin.HandlerFunc { return func(c *gin.Context) { challengeId, err := s.GenerateNewChallenge(c.Request.Context(), "api-test") @@ -38,18 +38,18 @@ func DisplayCodeHandler(s *AuthService) gin.HandlerFunc { // @Tags auth // @Accept json // @Produce json -// @Param code query string true "The code retrieved from Anytype Desktop app" // @Param challenge_id query string true "The challenge ID" -// @Success 200 {object} TokenResponse "Authentication token" +// @Param code query string true "The 4-digit code retrieved from Anytype Desktop app" +// @Success 200 {object} TokenResponse "Authentication token" // @Failure 400 {object} util.ValidationError "Invalid input" // @Failure 502 {object} util.ServerError "Internal server error" -// @Router /auth/token [get] +// @Router /auth/token [post] func TokenHandler(s *AuthService) gin.HandlerFunc { return func(c *gin.Context) { - challengeID := c.Query("challenge_id") + challengeId := c.Query("challenge_id") code := c.Query("code") - sessionToken, appKey, err := s.SolveChallengeForToken(c.Request.Context(), challengeID, code) + sessionToken, appKey, err := s.SolveChallengeForToken(c.Request.Context(), challengeId, code) errCode := util.MapErrorCode(err, util.ErrToCode(ErrInvalidInput, http.StatusBadRequest), util.ErrToCode(ErrFailedAuthenticate, http.StatusInternalServerError), diff --git a/cmd/api/auth/service.go b/cmd/api/auth/service.go index 17afa23cf..87c05bc2e 100644 --- a/cmd/api/auth/service.go +++ b/cmd/api/auth/service.go @@ -16,7 +16,7 @@ var ( type Service interface { GenerateNewChallenge(ctx context.Context, appName string) (string, error) - SolveChallengeForToken(ctx context.Context, challengeID, code string) (sessionToken, appKey string, err error) + SolveChallengeForToken(ctx context.Context, challengeId string, code string) (sessionToken, appKey string, err error) } type AuthService struct { @@ -39,14 +39,14 @@ func (s *AuthService) GenerateNewChallenge(ctx context.Context, appName string) } // SolveChallengeForToken calls AccountLocalLinkSolveChallenge and returns the session token + app key, or an error if it fails. -func (s *AuthService) SolveChallengeForToken(ctx context.Context, challengeID, code string) (sessionToken, appKey string, err error) { - if challengeID == "" || code == "" { +func (s *AuthService) SolveChallengeForToken(ctx context.Context, challengeId string, code string) (sessionToken string, appKey string, err error) { + if challengeId == "" || code == "" { return "", "", ErrInvalidInput } // Call AccountLocalLinkSolveChallenge to retrieve session token and app key resp := s.mw.AccountLocalLinkSolveChallenge(ctx, &pb.RpcAccountLocalLinkSolveChallengeRequest{ - ChallengeId: challengeID, + ChallengeId: challengeId, Answer: code, }) diff --git a/cmd/api/demo/api_demo.go b/cmd/api/demo/api_demo.go index 1848c06a3..58ba523c1 100644 --- a/cmd/api/demo/api_demo.go +++ b/cmd/api/demo/api_demo.go @@ -52,8 +52,8 @@ func main() { body map[string]interface{} }{ // auth - // {"POST", "/auth/displayCode", nil, nil}, - // {"GET", "/auth/token?challengeId={challengeId}&code={code}", map[string]interface{}{"challengeId": "6738dfc5cda913aad90e8c2a", "code": "2931"}, nil}, + // {"POST", "/auth/display_code", nil, nil}, + // {"POST", "/auth/token?challenge_id={challenge_id}&code={code}", map[string]interface{}{"challenge_id": "6738dfc5cda913aad90e8c2a", "code": "2931"}, nil}, // export // {"GET", "/spaces/{space_id}/objects/{object_id}/export/{format}", map[string]interface{}{"space_id": testSpaceId, "object_id": testObjectId, "format": "markdown"}, nil}, diff --git a/cmd/api/docs/docs.go b/cmd/api/docs/docs.go index 3f9f3d61b..e83846886 100644 --- a/cmd/api/docs/docs.go +++ b/cmd/api/docs/docs.go @@ -24,7 +24,7 @@ const docTemplate = `{ "host": "{{.Host}}", "basePath": "{{.BasePath}}", "paths": { - "/auth/displayCode": { + "/auth/display_code": { "post": { "consumes": [ "application/json" @@ -53,7 +53,7 @@ const docTemplate = `{ } }, "/auth/token": { - "get": { + "post": { "consumes": [ "application/json" ], @@ -67,15 +67,15 @@ const docTemplate = `{ "parameters": [ { "type": "string", - "description": "The code retrieved from Anytype Desktop app", - "name": "code", + "description": "The challenge ID", + "name": "challenge_id", "in": "query", "required": true }, { "type": "string", - "description": "The challenge ID", - "name": "challenge_id", + "description": "The 4-digit code retrieved from Anytype Desktop app", + "name": "code", "in": "query", "required": true } @@ -345,7 +345,7 @@ const docTemplate = `{ } } }, - "/spaces/{space_id}/objectTypes": { + "/spaces/{space_id}/object_types": { "get": { "consumes": [ "application/json" @@ -354,7 +354,7 @@ const docTemplate = `{ "application/json" ], "tags": [ - "types_and_templates" + "objects" ], "summary": "Retrieve object types in a specific space", "parameters": [ @@ -410,7 +410,7 @@ const docTemplate = `{ } } }, - "/spaces/{space_id}/objectTypes/{typeId}/templates": { + "/spaces/{space_id}/object_types/{type_id}/templates": { "get": { "consumes": [ "application/json" @@ -419,7 +419,7 @@ const docTemplate = `{ "application/json" ], "tags": [ - "types_and_templates" + "objects" ], "summary": "Retrieve a list of templates for a specific object type in a space", "parameters": [ @@ -433,7 +433,7 @@ const docTemplate = `{ { "type": "string", "description": "The ID of the object type", - "name": "typeId", + "name": "type_id", "in": "path", "required": true }, @@ -494,7 +494,7 @@ const docTemplate = `{ "application/json" ], "tags": [ - "space_objects" + "objects" ], "summary": "Retrieve objects in a specific space", "parameters": [ @@ -560,7 +560,7 @@ const docTemplate = `{ "application/json" ], "tags": [ - "space_objects" + "objects" ], "summary": "Create a new object in a specific space", "parameters": [ @@ -621,7 +621,7 @@ const docTemplate = `{ "application/json" ], "tags": [ - "space_objects" + "objects" ], "summary": "Retrieve a specific object in a space", "parameters": [ @@ -675,7 +675,7 @@ const docTemplate = `{ "application/json" ], "tags": [ - "space_objects" + "objects" ], "summary": "Update an existing object in a specific space", "parameters": [ @@ -746,7 +746,7 @@ const docTemplate = `{ "application/json" ], "tags": [ - "exports" + "export" ], "summary": "Export an object", "parameters": [ diff --git a/cmd/api/docs/swagger.json b/cmd/api/docs/swagger.json index 1f9fcf0d5..d9d5fd390 100644 --- a/cmd/api/docs/swagger.json +++ b/cmd/api/docs/swagger.json @@ -18,7 +18,7 @@ "host": "localhost:31009", "basePath": "/v1", "paths": { - "/auth/displayCode": { + "/auth/display_code": { "post": { "consumes": [ "application/json" @@ -47,7 +47,7 @@ } }, "/auth/token": { - "get": { + "post": { "consumes": [ "application/json" ], @@ -61,15 +61,15 @@ "parameters": [ { "type": "string", - "description": "The code retrieved from Anytype Desktop app", - "name": "code", + "description": "The challenge ID", + "name": "challenge_id", "in": "query", "required": true }, { "type": "string", - "description": "The challenge ID", - "name": "challenge_id", + "description": "The 4-digit code retrieved from Anytype Desktop app", + "name": "code", "in": "query", "required": true } @@ -339,7 +339,7 @@ } } }, - "/spaces/{space_id}/objectTypes": { + "/spaces/{space_id}/object_types": { "get": { "consumes": [ "application/json" @@ -348,7 +348,7 @@ "application/json" ], "tags": [ - "types_and_templates" + "objects" ], "summary": "Retrieve object types in a specific space", "parameters": [ @@ -404,7 +404,7 @@ } } }, - "/spaces/{space_id}/objectTypes/{typeId}/templates": { + "/spaces/{space_id}/object_types/{type_id}/templates": { "get": { "consumes": [ "application/json" @@ -413,7 +413,7 @@ "application/json" ], "tags": [ - "types_and_templates" + "objects" ], "summary": "Retrieve a list of templates for a specific object type in a space", "parameters": [ @@ -427,7 +427,7 @@ { "type": "string", "description": "The ID of the object type", - "name": "typeId", + "name": "type_id", "in": "path", "required": true }, @@ -488,7 +488,7 @@ "application/json" ], "tags": [ - "space_objects" + "objects" ], "summary": "Retrieve objects in a specific space", "parameters": [ @@ -554,7 +554,7 @@ "application/json" ], "tags": [ - "space_objects" + "objects" ], "summary": "Create a new object in a specific space", "parameters": [ @@ -615,7 +615,7 @@ "application/json" ], "tags": [ - "space_objects" + "objects" ], "summary": "Retrieve a specific object in a space", "parameters": [ @@ -669,7 +669,7 @@ "application/json" ], "tags": [ - "space_objects" + "objects" ], "summary": "Update an existing object in a specific space", "parameters": [ @@ -740,7 +740,7 @@ "application/json" ], "tags": [ - "exports" + "export" ], "summary": "Export an object", "parameters": [ diff --git a/cmd/api/docs/swagger.yaml b/cmd/api/docs/swagger.yaml index 5431da43f..7bb0dae7a 100644 --- a/cmd/api/docs/swagger.yaml +++ b/cmd/api/docs/swagger.yaml @@ -334,7 +334,7 @@ info: title: Anytype API version: "1.0" paths: - /auth/displayCode: + /auth/display_code: post: consumes: - application/json @@ -353,20 +353,20 @@ paths: tags: - auth /auth/token: - get: + post: consumes: - application/json parameters: - - description: The code retrieved from Anytype Desktop app - in: query - name: code - required: true - type: string - description: The challenge ID in: query name: challenge_id required: true type: string + - description: The 4-digit code retrieved from Anytype Desktop app + in: query + name: code + required: true + type: string produces: - application/json responses: @@ -548,7 +548,7 @@ paths: summary: Retrieve a list of members for the specified Space tags: - spaces - /spaces/{space_id}/objectTypes: + /spaces/{space_id}/object_types: get: consumes: - application/json @@ -591,8 +591,8 @@ paths: $ref: '#/definitions/util.ServerError' summary: Retrieve object types in a specific space tags: - - types_and_templates - /spaces/{space_id}/objectTypes/{typeId}/templates: + - objects + /spaces/{space_id}/object_types/{type_id}/templates: get: consumes: - application/json @@ -604,7 +604,7 @@ paths: type: string - description: The ID of the object type in: path - name: typeId + name: type_id required: true type: string - description: The number of items to skip before starting to collect the result @@ -642,7 +642,7 @@ paths: $ref: '#/definitions/util.ServerError' summary: Retrieve a list of templates for a specific object type in a space tags: - - types_and_templates + - objects /spaces/{space_id}/objects: get: consumes: @@ -688,7 +688,7 @@ paths: $ref: '#/definitions/util.ServerError' summary: Retrieve objects in a specific space tags: - - space_objects + - objects post: consumes: - application/json @@ -727,7 +727,7 @@ paths: $ref: '#/definitions/util.ServerError' summary: Create a new object in a specific space tags: - - space_objects + - objects /spaces/{space_id}/objects/{object_id}: get: consumes: @@ -764,7 +764,7 @@ paths: $ref: '#/definitions/util.ServerError' summary: Retrieve a specific object in a space tags: - - space_objects + - objects put: consumes: - application/json @@ -810,7 +810,7 @@ paths: $ref: '#/definitions/util.ServerError' summary: Update an existing object in a specific space tags: - - space_objects + - objects /spaces/{space_id}/objects/{object_id}/export/{format}: post: consumes: @@ -856,7 +856,7 @@ paths: $ref: '#/definitions/util.ServerError' summary: Export an object tags: - - exports + - export securityDefinitions: BasicAuth: type: basic diff --git a/cmd/api/export/handler.go b/cmd/api/export/handler.go index 27cce4fc7..289b05122 100644 --- a/cmd/api/export/handler.go +++ b/cmd/api/export/handler.go @@ -11,7 +11,7 @@ import ( // GetObjectExportHandler exports an object to the specified format // // @Summary Export an object -// @Tags exports +// @Tags export // @Accept json // @Produce json // @Param space_id path string true "Space ID" diff --git a/cmd/api/object/handler.go b/cmd/api/object/handler.go index 61515b8c2..12b9a253d 100644 --- a/cmd/api/object/handler.go +++ b/cmd/api/object/handler.go @@ -12,7 +12,7 @@ import ( // GetObjectsHandler retrieves objects in a specific space // // @Summary Retrieve objects in a specific space -// @Tags space_objects +// @Tags objects // @Accept json // @Produce json // @Param space_id path string true "The ID of the space" @@ -50,7 +50,7 @@ func GetObjectsHandler(s *ObjectService) gin.HandlerFunc { // GetObjectHandler retrieves a specific object in a space // // @Summary Retrieve a specific object in a space -// @Tags space_objects +// @Tags objects // @Accept json // @Produce json // @Param space_id path string true "The ID of the space" @@ -84,7 +84,7 @@ func GetObjectHandler(s *ObjectService) gin.HandlerFunc { // CreateObjectHandler creates a new object in a specific space // // @Summary Create a new object in a specific space -// @Tags space_objects +// @Tags objects // @Accept json // @Produce json // @Param space_id path string true "The ID of the space" @@ -128,7 +128,7 @@ func CreateObjectHandler(s *ObjectService) gin.HandlerFunc { // UpdateObjectHandler updates an existing object in a specific space // // @Summary Update an existing object in a specific space -// @Tags space_objects +// @Tags objects // @Accept json // @Produce json // @Param space_id path string true "The ID of the space" @@ -172,7 +172,7 @@ func UpdateObjectHandler(s *ObjectService) gin.HandlerFunc { // GetTypesHandler retrieves object types in a specific space // // @Summary Retrieve object types in a specific space -// @Tags types_and_templates +// @Tags objects // @Accept json // @Produce json // @Param space_id path string true "The ID of the space" @@ -182,7 +182,7 @@ func UpdateObjectHandler(s *ObjectService) gin.HandlerFunc { // @Failure 403 {object} util.UnauthorizedError "Unauthorized" // @Failure 404 {object} util.NotFoundError "Resource not found" // @Failure 502 {object} util.ServerError "Internal server error" -// @Router /spaces/{space_id}/objectTypes [get] +// @Router /spaces/{space_id}/object_types [get] func GetTypesHandler(s *ObjectService) gin.HandlerFunc { return func(c *gin.Context) { spaceId := c.Param("space_id") @@ -208,22 +208,22 @@ func GetTypesHandler(s *ObjectService) gin.HandlerFunc { // GetTemplatesHandler retrieves a list of templates for a specific object type in a space // // @Summary Retrieve a list of templates for a specific object type in a space -// @Tags types_and_templates +// @Tags objects // @Accept json // @Produce json // @Param space_id path string true "The ID of the space" -// @Param typeId path string true "The ID of the object type" +// @Param type_id path string true "The ID of the object type" // @Param offset query int false "The number of items to skip before starting to collect the result set" // @Param limit query int false "The number of items to return" default(100) // @Success 200 {object} map[string][]ObjectTemplate "List of templates" // @Failure 403 {object} util.UnauthorizedError "Unauthorized" // @Failure 404 {object} util.NotFoundError "Resource not found" // @Failure 502 {object} util.ServerError "Internal server error" -// @Router /spaces/{space_id}/objectTypes/{typeId}/templates [get] +// @Router /spaces/{space_id}/object_types/{type_id}/templates [get] func GetTemplatesHandler(s *ObjectService) gin.HandlerFunc { return func(c *gin.Context) { spaceId := c.Param("space_id") - typeId := c.Param("typeId") + typeId := c.Param("type_id") offset := c.GetInt("offset") limit := c.GetInt("limit") diff --git a/cmd/api/server/router.go b/cmd/api/server/router.go index ec04196fc..ba0d309f3 100644 --- a/cmd/api/server/router.go +++ b/cmd/api/server/router.go @@ -37,11 +37,11 @@ func (s *Server) NewRouter() *gin.Engine { { // Auth v1.POST("/auth/display_code", auth.DisplayCodeHandler(s.authService)) - v1.GET("/auth/token", auth.TokenHandler(s.authService)) + v1.POST("/auth/token", auth.TokenHandler(s.authService)) // Export v1.POST("/spaces/:space_id/objects/:object_id/export/:format", export.GetObjectExportHandler(s.exportService)) - v1.GET("/spaces/:space_id/objects/export/:format", export.GetSpaceExportHandler(s.exportService)) + v1.POST("/spaces/:space_id/objects/export/:format", export.GetSpaceExportHandler(s.exportService)) // Object v1.GET("/spaces/:space_id/objects", paginator, object.GetObjectsHandler(s.objectService)) From d8c8ce4b004a1979cc6acdda47ce12d2f5c3e01e Mon Sep 17 00:00:00 2001 From: Jannis Metrikat <120120832+jmetrikat@users.noreply.github.com> Date: Thu, 9 Jan 2025 00:17:58 +0100 Subject: [PATCH 086/195] GO-4459: Add endpoint to delete object --- cmd/api/demo/api_demo.go | 1 + cmd/api/docs/docs.go | 84 ++++++++++++++++++++++++++++++--------- cmd/api/docs/swagger.json | 84 ++++++++++++++++++++++++++++++--------- cmd/api/docs/swagger.yaml | 57 ++++++++++++++++++++------ cmd/api/object/handler.go | 47 +++++++++++++++++++--- cmd/api/object/model.go | 11 +---- cmd/api/object/service.go | 25 +++++++++++- cmd/api/server/router.go | 1 + 8 files changed, 242 insertions(+), 68 deletions(-) diff --git a/cmd/api/demo/api_demo.go b/cmd/api/demo/api_demo.go index 58ba523c1..5901cd37c 100644 --- a/cmd/api/demo/api_demo.go +++ b/cmd/api/demo/api_demo.go @@ -66,6 +66,7 @@ func main() { // objects // {"GET", "/spaces/{space_id}/objects?limit={limit}&offset={offset}", map[string]interface{}{"space_id": testSpaceId, "limit": 100, "offset": 0}, nil}, // {"GET", "/spaces/{space_id}/objects/{object_id}", map[string]interface{}{"space_id": testSpaceId, "object_id": testObjectId}, nil}, + // {"DELETE", "/spaces/{space_id}/objects/{object_id}", map[string]interface{}{"space_id": "asd", "object_id": "asd"}, nil}, // {"POST", "/spaces/{space_id}/objects", map[string]interface{}{"space_id": testSpaceId}, map[string]interface{}{"name": "New Object from demo", "icon": "💥", "template_id": "", "object_type_unique_key": "ot-page", "with_chat": false}}, // {"PUT", "/spaces/{space_id}/objects/{object_id}", map[string]interface{}{"space_id": testSpaceId, "object_id": testObjectId}, map[string]interface{}{"name": "Updated Object"}}, // {"GET", "/spaces/{space_id}/object_types?limit={limit}&offset={offset}", map[string]interface{}{"space_id": testSpaceId, "limit": 100, "offset": 0}, nil}, diff --git a/cmd/api/docs/docs.go b/cmd/api/docs/docs.go index e83846886..bd37c0172 100644 --- a/cmd/api/docs/docs.go +++ b/cmd/api/docs/docs.go @@ -588,7 +588,7 @@ const docTemplate = `{ "200": { "description": "The created object", "schema": { - "$ref": "#/definitions/object.CreateObjectResponse" + "$ref": "#/definitions/object.ObjectResponse" } }, "400": { @@ -644,7 +644,7 @@ const docTemplate = `{ "200": { "description": "The requested object", "schema": { - "$ref": "#/definitions/object.Object" + "$ref": "#/definitions/object.ObjectResponse" } }, "403": { @@ -707,7 +707,7 @@ const docTemplate = `{ "200": { "description": "The updated object", "schema": { - "$ref": "#/definitions/object.UpdateObjectResponse" + "$ref": "#/definitions/object.ObjectResponse" } }, "400": { @@ -735,6 +735,60 @@ const docTemplate = `{ } } } + }, + "delete": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "objects" + ], + "summary": "Delete a specific object in a space", + "parameters": [ + { + "type": "string", + "description": "The ID of the space", + "name": "space_id", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "The ID of the object", + "name": "object_id", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "The deleted object", + "schema": { + "$ref": "#/definitions/object.ObjectResponse" + } + }, + "403": { + "description": "Unauthorized", + "schema": { + "$ref": "#/definitions/util.UnauthorizedError" + } + }, + "404": { + "description": "Resource not found", + "schema": { + "$ref": "#/definitions/util.NotFoundError" + } + }, + "502": { + "description": "Internal server error", + "schema": { + "$ref": "#/definitions/util.ServerError" + } + } + } } }, "/spaces/{space_id}/objects/{object_id}/export/{format}": { @@ -867,14 +921,6 @@ const docTemplate = `{ } } }, - "object.CreateObjectResponse": { - "type": "object", - "properties": { - "object": { - "$ref": "#/definitions/object.Object" - } - } - }, "object.Detail": { "type": "object", "properties": { @@ -967,6 +1013,14 @@ const docTemplate = `{ } } }, + "object.ObjectResponse": { + "type": "object", + "properties": { + "object": { + "$ref": "#/definitions/object.Object" + } + } + }, "object.ObjectTemplate": { "type": "object", "properties": { @@ -1033,14 +1087,6 @@ const docTemplate = `{ } } }, - "object.UpdateObjectResponse": { - "type": "object", - "properties": { - "object": { - "$ref": "#/definitions/object.Object" - } - } - }, "pagination.PaginatedResponse-space_Member": { "type": "object", "properties": { diff --git a/cmd/api/docs/swagger.json b/cmd/api/docs/swagger.json index d9d5fd390..7c882dc72 100644 --- a/cmd/api/docs/swagger.json +++ b/cmd/api/docs/swagger.json @@ -582,7 +582,7 @@ "200": { "description": "The created object", "schema": { - "$ref": "#/definitions/object.CreateObjectResponse" + "$ref": "#/definitions/object.ObjectResponse" } }, "400": { @@ -638,7 +638,7 @@ "200": { "description": "The requested object", "schema": { - "$ref": "#/definitions/object.Object" + "$ref": "#/definitions/object.ObjectResponse" } }, "403": { @@ -701,7 +701,7 @@ "200": { "description": "The updated object", "schema": { - "$ref": "#/definitions/object.UpdateObjectResponse" + "$ref": "#/definitions/object.ObjectResponse" } }, "400": { @@ -729,6 +729,60 @@ } } } + }, + "delete": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "objects" + ], + "summary": "Delete a specific object in a space", + "parameters": [ + { + "type": "string", + "description": "The ID of the space", + "name": "space_id", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "The ID of the object", + "name": "object_id", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "The deleted object", + "schema": { + "$ref": "#/definitions/object.ObjectResponse" + } + }, + "403": { + "description": "Unauthorized", + "schema": { + "$ref": "#/definitions/util.UnauthorizedError" + } + }, + "404": { + "description": "Resource not found", + "schema": { + "$ref": "#/definitions/util.NotFoundError" + } + }, + "502": { + "description": "Internal server error", + "schema": { + "$ref": "#/definitions/util.ServerError" + } + } + } } }, "/spaces/{space_id}/objects/{object_id}/export/{format}": { @@ -861,14 +915,6 @@ } } }, - "object.CreateObjectResponse": { - "type": "object", - "properties": { - "object": { - "$ref": "#/definitions/object.Object" - } - } - }, "object.Detail": { "type": "object", "properties": { @@ -961,6 +1007,14 @@ } } }, + "object.ObjectResponse": { + "type": "object", + "properties": { + "object": { + "$ref": "#/definitions/object.Object" + } + } + }, "object.ObjectTemplate": { "type": "object", "properties": { @@ -1027,14 +1081,6 @@ } } }, - "object.UpdateObjectResponse": { - "type": "object", - "properties": { - "object": { - "$ref": "#/definitions/object.Object" - } - } - }, "pagination.PaginatedResponse-space_Member": { "type": "object", "properties": { diff --git a/cmd/api/docs/swagger.yaml b/cmd/api/docs/swagger.yaml index 7bb0dae7a..6c2bc2bdc 100644 --- a/cmd/api/docs/swagger.yaml +++ b/cmd/api/docs/swagger.yaml @@ -39,11 +39,6 @@ definitions: vertical_align: type: string type: object - object.CreateObjectResponse: - properties: - object: - $ref: '#/definitions/object.Object' - type: object object.Detail: properties: details: @@ -107,6 +102,11 @@ definitions: example: object type: string type: object + object.ObjectResponse: + properties: + object: + $ref: '#/definitions/object.Object' + type: object object.ObjectTemplate: properties: icon: @@ -153,11 +153,6 @@ definitions: text: type: string type: object - object.UpdateObjectResponse: - properties: - object: - $ref: '#/definitions/object.Object' - type: object pagination.PaginatedResponse-space_Member: properties: data: @@ -712,7 +707,7 @@ paths: "200": description: The created object schema: - $ref: '#/definitions/object.CreateObjectResponse' + $ref: '#/definitions/object.ObjectResponse' "400": description: Bad request schema: @@ -729,6 +724,42 @@ paths: tags: - objects /spaces/{space_id}/objects/{object_id}: + delete: + consumes: + - application/json + parameters: + - description: The ID of the space + in: path + name: space_id + required: true + type: string + - description: The ID of the object + in: path + name: object_id + required: true + type: string + produces: + - application/json + responses: + "200": + description: The deleted object + schema: + $ref: '#/definitions/object.ObjectResponse' + "403": + description: Unauthorized + schema: + $ref: '#/definitions/util.UnauthorizedError' + "404": + description: Resource not found + schema: + $ref: '#/definitions/util.NotFoundError' + "502": + description: Internal server error + schema: + $ref: '#/definitions/util.ServerError' + summary: Delete a specific object in a space + tags: + - objects get: consumes: - application/json @@ -749,7 +780,7 @@ paths: "200": description: The requested object schema: - $ref: '#/definitions/object.Object' + $ref: '#/definitions/object.ObjectResponse' "403": description: Unauthorized schema: @@ -791,7 +822,7 @@ paths: "200": description: The updated object schema: - $ref: '#/definitions/object.UpdateObjectResponse' + $ref: '#/definitions/object.ObjectResponse' "400": description: Bad request schema: diff --git a/cmd/api/object/handler.go b/cmd/api/object/handler.go index 12b9a253d..c6f60d89f 100644 --- a/cmd/api/object/handler.go +++ b/cmd/api/object/handler.go @@ -55,7 +55,7 @@ func GetObjectsHandler(s *ObjectService) gin.HandlerFunc { // @Produce json // @Param space_id path string true "The ID of the space" // @Param object_id path string true "The ID of the object" -// @Success 200 {object} Object "The requested object" +// @Success 200 {object} ObjectResponse "The requested object" // @Failure 403 {object} util.UnauthorizedError "Unauthorized" // @Failure 404 {object} util.NotFoundError "Resource not found" // @Failure 502 {object} util.ServerError "Internal server error" @@ -77,7 +77,42 @@ func GetObjectHandler(s *ObjectService) gin.HandlerFunc { return } - c.JSON(http.StatusOK, GetObjectResponse{Object: object}) + c.JSON(http.StatusOK, ObjectResponse{Object: object}) + } +} + +// DeleteObjectHandler deletes a specific object in a space +// +// @Summary Delete a specific object in a space +// @Tags objects +// @Accept json +// @Produce json +// @Param space_id path string true "The ID of the space" +// @Param object_id path string true "The ID of the object" +// @Success 200 {object} ObjectResponse "The deleted object" +// @Failure 403 {object} util.UnauthorizedError "Unauthorized" +// @Failure 404 {object} util.NotFoundError "Resource not found" +// @Failure 502 {object} util.ServerError "Internal server error" +// @Router /spaces/{space_id}/objects/{object_id} [delete] +func DeleteObjectHandler(s *ObjectService) gin.HandlerFunc { + return func(c *gin.Context) { + spaceId := c.Param("space_id") + objectId := c.Param("object_id") + + object, err := s.DeleteObject(c.Request.Context(), spaceId, objectId) + code := util.MapErrorCode(err, + util.ErrToCode(ErrObjectNotFound, http.StatusNotFound), + util.ErrToCode(ErrFailedRetrieveObject, http.StatusInternalServerError), + util.ErrToCode(ErrFailedDeleteObject, http.StatusInternalServerError), + ) + + if code != http.StatusOK { + apiErr := util.CodeToAPIError(code, err.Error()) + c.JSON(code, apiErr) + return + } + + c.JSON(http.StatusOK, ObjectResponse{Object: object}) } } @@ -89,7 +124,7 @@ func GetObjectHandler(s *ObjectService) gin.HandlerFunc { // @Produce json // @Param space_id path string true "The ID of the space" // @Param object body map[string]string true "Object details (e.g., name)" -// @Success 200 {object} CreateObjectResponse "The created object" +// @Success 200 {object} ObjectResponse "The created object" // @Failure 400 {object} util.ValidationError "Bad request" // @Failure 403 {object} util.UnauthorizedError "Unauthorized" // @Failure 502 {object} util.ServerError "Internal server error" @@ -121,7 +156,7 @@ func CreateObjectHandler(s *ObjectService) gin.HandlerFunc { return } - c.JSON(http.StatusOK, CreateObjectResponse{Object: object}) + c.JSON(http.StatusOK, ObjectResponse{Object: object}) } } @@ -134,7 +169,7 @@ func CreateObjectHandler(s *ObjectService) gin.HandlerFunc { // @Param space_id path string true "The ID of the space" // @Param object_id path string true "The ID of the object" // @Param object body Object true "The updated object details" -// @Success 200 {object} UpdateObjectResponse "The updated object" +// @Success 200 {object} ObjectResponse "The updated object" // @Failure 400 {object} util.ValidationError "Bad request" // @Failure 403 {object} util.UnauthorizedError "Unauthorized" // @Failure 404 {object} util.NotFoundError "Resource not found" @@ -165,7 +200,7 @@ func UpdateObjectHandler(s *ObjectService) gin.HandlerFunc { return } - c.JSON(http.StatusNotImplemented, UpdateObjectResponse{Object: object}) + c.JSON(http.StatusNotImplemented, ObjectResponse{Object: object}) } } diff --git a/cmd/api/object/model.go b/cmd/api/object/model.go index 5cb45f5fd..faa4cb350 100644 --- a/cmd/api/object/model.go +++ b/cmd/api/object/model.go @@ -1,9 +1,5 @@ package object -type GetObjectResponse struct { - Object Object `json:"object"` -} - type CreateObjectRequest struct { Name string `json:"name"` Icon string `json:"icon"` @@ -15,15 +11,12 @@ type CreateObjectRequest struct { WithChat bool `json:"with_chat"` } -type CreateObjectResponse struct { - Object Object `json:"object"` -} - +// TODO: Add fields to the request type UpdateObjectRequest struct { Object Object `json:"object"` } -type UpdateObjectResponse struct { +type ObjectResponse struct { Object Object `json:"object"` } diff --git a/cmd/api/object/service.go b/cmd/api/object/service.go index 9e8872330..e482ca803 100644 --- a/cmd/api/object/service.go +++ b/cmd/api/object/service.go @@ -20,6 +20,7 @@ var ( ErrFailedRetrieveObject = errors.New("failed to retrieve object") ErrorFailedRetrieveObjects = errors.New("failed to retrieve list of objects") ErrNoObjectsFound = errors.New("no objects found") + ErrFailedDeleteObject = errors.New("failed to delete object") ErrFailedCreateObject = errors.New("failed to create object") ErrInputMissingSource = errors.New("source is missing for bookmark") ErrFailedSetRelationFeatured = errors.New("failed to set relation featured") @@ -39,8 +40,9 @@ var ( type Service interface { ListObjects(ctx context.Context, spaceId string, offset int, limit int) ([]Object, int, bool, error) GetObject(ctx context.Context, spaceId string, objectId string) (Object, error) - CreateObject(ctx context.Context, spaceId string, obj Object) (Object, error) - UpdateObject(ctx context.Context, spaceId string, obj Object) (Object, error) + DeleteObject(ctx context.Context, spaceId string, objectId string) error + CreateObject(ctx context.Context, spaceId string, request CreateObjectRequest) (Object, error) + UpdateObject(ctx context.Context, spaceId string, objectId string, request UpdateObjectRequest) (Object, error) ListTypes(ctx context.Context, spaceId string, offset int, limit int) ([]ObjectType, int, bool, error) ListTemplates(ctx context.Context, spaceId string, typeId string, offset int, limit int) ([]ObjectTemplate, int, bool, error) } @@ -148,6 +150,25 @@ func (s *ObjectService) GetObject(ctx context.Context, spaceId string, objectId return object, nil } +// DeleteObject deletes an existing object in a specific space. +func (s *ObjectService) DeleteObject(ctx context.Context, spaceId string, objectId string) (Object, error) { + object, err := s.GetObject(ctx, spaceId, objectId) + if err != nil { + return Object{}, err + } + + resp := s.mw.ObjectListSetIsArchived(ctx, &pb.RpcObjectListSetIsArchivedRequest{ + ObjectIds: []string{objectId}, + IsArchived: true, + }) + + if resp.Error.Code != pb.RpcObjectListSetIsArchivedResponseError_NULL { + return Object{}, ErrFailedDeleteObject + } + + return object, nil +} + // CreateObject creates a new object in a specific space. func (s *ObjectService) CreateObject(ctx context.Context, spaceId string, request CreateObjectRequest) (Object, error) { if request.ObjectTypeUniqueKey == "ot-bookmark" && request.Source == "" { diff --git a/cmd/api/server/router.go b/cmd/api/server/router.go index ba0d309f3..9104b84cb 100644 --- a/cmd/api/server/router.go +++ b/cmd/api/server/router.go @@ -46,6 +46,7 @@ func (s *Server) NewRouter() *gin.Engine { // Object v1.GET("/spaces/:space_id/objects", paginator, object.GetObjectsHandler(s.objectService)) v1.GET("/spaces/:space_id/objects/:object_id", object.GetObjectHandler(s.objectService)) + v1.DELETE("/spaces/:space_id/objects/:object_id", object.DeleteObjectHandler(s.objectService)) v1.GET("/spaces/:space_id/object_types", paginator, object.GetTypesHandler(s.objectService)) v1.GET("/spaces/:space_id/object_types/:typeId/templates", paginator, object.GetTemplatesHandler(s.objectService)) v1.POST("/spaces/:space_id/objects", object.CreateObjectHandler(s.objectService)) From aeed6dcaa2ad8c2eed5078f6d4204131ac7139cb Mon Sep 17 00:00:00 2001 From: Jannis Metrikat <120120832+jmetrikat@users.noreply.github.com> Date: Thu, 9 Jan 2025 23:08:41 +0100 Subject: [PATCH 087/195] GO-4459: Return recommended layout for object type --- cmd/api/object/model.go | 11 ++++++----- cmd/api/object/service.go | 13 +++++++------ 2 files changed, 13 insertions(+), 11 deletions(-) diff --git a/cmd/api/object/model.go b/cmd/api/object/model.go index faa4cb350..8c9eac48e 100644 --- a/cmd/api/object/model.go +++ b/cmd/api/object/model.go @@ -75,11 +75,12 @@ type Tag struct { } type ObjectType struct { - Type string `json:"type" example:"object_type"` - Id string `json:"id" example:"bafyreigyb6l5szohs32ts26ku2j42yd65e6hqy2u3gtzgdwqv6hzftsetu"` - UniqueKey string `json:"unique_key" example:"ot-page"` - Name string `json:"name" example:"Page"` - Icon string `json:"icon" example:"📄"` + Type string `json:"type" example:"object_type"` + Id string `json:"id" example:"bafyreigyb6l5szohs32ts26ku2j42yd65e6hqy2u3gtzgdwqv6hzftsetu"` + UniqueKey string `json:"unique_key" example:"ot-page"` + Name string `json:"name" example:"Page"` + Icon string `json:"icon" example:"📄"` + RecommendedLayout string `json:"recommended_layout" example:"todo"` } type ObjectTemplate struct { diff --git a/cmd/api/object/service.go b/cmd/api/object/service.go index e482ca803..320815100 100644 --- a/cmd/api/object/service.go +++ b/cmd/api/object/service.go @@ -294,7 +294,7 @@ func (s *ObjectService) ListTypes(ctx context.Context, spaceId string, offset in Type: model.BlockContentDataviewSort_Asc, }, }, - Keys: []string{"id", "uniqueKey", "name", "iconEmoji"}, + Keys: []string{"id", "uniqueKey", "name", "iconEmoji", "recommendedLayout"}, }) if resp.Error.Code != pb.RpcObjectSearchResponseError_NULL { @@ -311,11 +311,12 @@ func (s *ObjectService) ListTypes(ctx context.Context, spaceId string, offset in for _, record := range paginatedTypes { objectTypes = append(objectTypes, ObjectType{ - Type: "object_type", - Id: record.Fields["id"].GetStringValue(), - UniqueKey: record.Fields["uniqueKey"].GetStringValue(), - Name: record.Fields["name"].GetStringValue(), - Icon: record.Fields["iconEmoji"].GetStringValue(), + Type: "object_type", + Id: record.Fields["id"].GetStringValue(), + UniqueKey: record.Fields["uniqueKey"].GetStringValue(), + Name: record.Fields["name"].GetStringValue(), + Icon: record.Fields["iconEmoji"].GetStringValue(), + RecommendedLayout: model.ObjectTypeLayout_name[int32(record.Fields["recommendedLayout"].GetNumberValue())], }) } return objectTypes, total, hasMore, nil From e4149a72f6b6ce12eaa504eba05f632d5e881d71 Mon Sep 17 00:00:00 2001 From: AnastasiaShemyakinskaya Date: Fri, 10 Jan 2025 15:32:17 +0100 Subject: [PATCH 088/195] GO-4418: fix empty collection in case when archive has directory in root with files Signed-off-by: AnastasiaShemyakinskaya --- core/block/import/common/source/directory.go | 44 +++++++++++++++++++- core/block/import/common/source/zip.go | 9 +++- 2 files changed, 51 insertions(+), 2 deletions(-) diff --git a/core/block/import/common/source/directory.go b/core/block/import/common/source/directory.go index cdbf2b329..07fc805c6 100644 --- a/core/block/import/common/source/directory.go +++ b/core/block/import/common/source/directory.go @@ -4,6 +4,9 @@ import ( "io" "os" "path/filepath" + "slices" + "sort" + "strings" "github.com/samber/lo" @@ -13,6 +16,7 @@ import ( type Directory struct { fileReaders map[string]struct{} importPath string + rootDirs []string } func NewDirectory() *Directory { @@ -23,6 +27,9 @@ func (d *Directory) Initialize(importPath string) error { files := make(map[string]struct{}) err := filepath.Walk(importPath, func(path string, info os.FileInfo, err error) error { + if strings.HasPrefix(info.Name(), ".DS_Store") { + return nil + } if info != nil && !info.IsDir() { files[path] = struct{}{} } @@ -31,6 +38,7 @@ func (d *Directory) Initialize(importPath string) error { ) d.fileReaders = files d.importPath = importPath + d.rootDirs = findNonEmptyDirs(files) if err != nil { return err } @@ -80,7 +88,41 @@ func (d *Directory) CountFilesWithGivenExtensions(extension []string) int { } func (d *Directory) IsRootFile(fileName string) bool { - return filepath.Dir(fileName) == d.importPath + fileDir := filepath.Dir(fileName) + return fileDir == d.importPath || slices.Contains(d.rootDirs, fileDir) } func (d *Directory) Close() {} + +func findNonEmptyDirs(files map[string]struct{}) []string { + dirs := make([]string, 0, len(files)) + for file := range files { + dir := filepath.Dir(file) + if dir == "." { + return []string{dir} + } + dirs = append(dirs, dir) + } + sort.Strings(dirs) + var result []string + visited := make(map[string]bool) + + for _, dir := range dirs { + if isSubdirectoryOfAny(dir, result) { + continue + } + result = lo.Union(result, []string{dir}) + visited[dir] = true + } + + return result +} + +func isSubdirectoryOfAny(dir string, directories []string) bool { + for _, base := range directories { + if strings.HasPrefix(dir, base+string(filepath.Separator)) { + return true + } + } + return false +} diff --git a/core/block/import/common/source/zip.go b/core/block/import/common/source/zip.go index ef3b21fb1..3c7103f9e 100644 --- a/core/block/import/common/source/zip.go +++ b/core/block/import/common/source/zip.go @@ -5,6 +5,7 @@ import ( "fmt" "io" "path/filepath" + "slices" "strings" "github.com/samber/lo" @@ -20,6 +21,7 @@ type Zip struct { archiveReader *zip.ReadCloser fileReaders map[string]*zip.File originalToNormalizedNames map[string]string + rootDirs []string } func NewZip() *Zip { @@ -33,16 +35,20 @@ func (z *Zip) Initialize(importPath string) error { return err } fileReaders := make(map[string]*zip.File, len(archiveReader.File)) + filePaths := make(map[string]struct{}, len(archiveReader.File)) for i, f := range archiveReader.File { if strings.HasPrefix(f.Name, "__MACOSX/") { continue } normalizedName := normalizeName(f, i) fileReaders[normalizedName] = f + filePaths[normalizedName] = struct{}{} if normalizedName != f.Name { z.originalToNormalizedNames[f.Name] = normalizedName } } + + z.rootDirs = findNonEmptyDirs(filePaths) z.fileReaders = fileReaders return nil } @@ -101,7 +107,8 @@ func (z *Zip) Close() { } func (z *Zip) IsRootFile(fileName string) bool { - return filepath.Dir(fileName) == "." + fileDir := filepath.Dir(fileName) + return fileDir == "." || slices.Contains(z.rootDirs, fileDir) } func (z *Zip) GetFileOriginalName(fileName string) string { From 646183810fcae7e53ac021465e59633892abb33f Mon Sep 17 00:00:00 2001 From: AnastasiaShemyakinskaya Date: Fri, 10 Jan 2025 17:04:11 +0100 Subject: [PATCH 089/195] GO-4818: add tests Signed-off-by: AnastasiaShemyakinskaya --- .../import/common/source/directory_test.go | 102 +++++++++++++++ core/block/import/common/source/zip_test.go | 119 ++++++++++++++++++ 2 files changed, 221 insertions(+) create mode 100644 core/block/import/common/source/directory_test.go create mode 100644 core/block/import/common/source/zip_test.go diff --git a/core/block/import/common/source/directory_test.go b/core/block/import/common/source/directory_test.go new file mode 100644 index 000000000..f4d33c7e0 --- /dev/null +++ b/core/block/import/common/source/directory_test.go @@ -0,0 +1,102 @@ +package source + +import ( + "os" + "path/filepath" + "testing" + + "github.com/stretchr/testify/assert" +) + +func createTestDir(tempDir string, files map[string]string) error { + for name, content := range files { + fullPath := filepath.Join(tempDir, name) + err := os.MkdirAll(filepath.Dir(fullPath), 0777) + if err != nil { + return err + } + file, err := os.Create(fullPath) + if err != nil { + return err + } + defer file.Close() + _, err = file.Write([]byte(content)) + if err != nil { + return err + } + } + return nil +} + +func TestDirectory_Initialize(t *testing.T) { + t.Run("success", func(t *testing.T) { + // given + files := map[string]string{ + "file1.txt": "test", + filepath.Join("folder", "file2.txt"): "test", + } + tempDir := t.TempDir() + err := createTestDir(tempDir, files) + defer os.RemoveAll(tempDir) + assert.NoError(t, err) + // when + directory := NewDirectory() + err = directory.Initialize(tempDir) + + // then + assert.NoError(t, err) + assert.Equal(t, tempDir, directory.importPath) + assert.Len(t, directory.fileReaders, 2) + expectedRoots := []string{tempDir} + assert.Equal(t, expectedRoots, directory.rootDirs) + }) + t.Run("directory with another dir inside", func(t *testing.T) { + // given + files := map[string]string{ + filepath.Join("folder", "file2.txt"): "test", + filepath.Join("folder", "file3.txt"): "test", + filepath.Join("folder", "folder1", "file4.txt"): "test", + } + + tempDir := t.TempDir() + err := createTestDir(tempDir, files) + assert.NoError(t, err) + defer os.RemoveAll(tempDir) + + // when + directory := NewDirectory() + err = directory.Initialize(tempDir) + + // then + assert.NoError(t, err) + assert.Equal(t, tempDir, directory.importPath) + assert.Len(t, directory.fileReaders, 3) + + expectedRoots := []string{filepath.Join(tempDir, "folder")} + assert.Equal(t, expectedRoots, directory.rootDirs) + }) + t.Run("directory with 2 dirs inside", func(t *testing.T) { + // given + files := map[string]string{ + filepath.Join("folder", "file2.txt"): "test", + filepath.Join("folder1", "folder2", "file4.txt"): "test", + } + + tempDir := t.TempDir() + err := createTestDir(tempDir, files) + assert.NoError(t, err) + defer os.RemoveAll(tempDir) + + // when + directory := NewDirectory() + err = directory.Initialize(tempDir) + + // then + assert.NoError(t, err) + assert.Equal(t, tempDir, directory.importPath) + assert.Len(t, directory.fileReaders, 2) + + expectedRoots := []string{filepath.Join(tempDir, "folder"), filepath.Join(tempDir, "folder1", "folder2")} + assert.Equal(t, expectedRoots, directory.rootDirs) + }) +} diff --git a/core/block/import/common/source/zip_test.go b/core/block/import/common/source/zip_test.go new file mode 100644 index 000000000..6578715f8 --- /dev/null +++ b/core/block/import/common/source/zip_test.go @@ -0,0 +1,119 @@ +package source + +import ( + "archive/zip" + "io/ioutil" + "os" + "path/filepath" + "testing" + + "github.com/stretchr/testify/assert" +) + +func createTestZip(t *testing.T, files map[string]string) (string, error) { + tmpFile, err := ioutil.TempFile(t.TempDir(), "test-*.zip") + if err != nil { + return "", err + } + defer tmpFile.Close() + + zipWriter := zip.NewWriter(tmpFile) + for name, content := range files { + writer, err := zipWriter.Create(name) + if err != nil { + return "", err + } + _, err = writer.Write([]byte(content)) + if err != nil { + return "", err + } + } + if err := zipWriter.Close(); err != nil { + return "", err + } + + return tmpFile.Name(), nil +} + +func TestZip_Initialize(t *testing.T) { + t.Run("success", func(t *testing.T) { + // given + files := map[string]string{ + "file1.txt": "test", + filepath.Join("folder", "file2.txt"): "test", + } + + zipPath, err := createTestZip(t, files) + assert.NoError(t, err) + defer os.Remove(zipPath) + + // when + zipInstance := NewZip() + err = zipInstance.Initialize(zipPath) + + // then + assert.NoError(t, err) + assert.NotNil(t, zipInstance.archiveReader) + assert.Len(t, zipInstance.fileReaders, 2) + + expectedRoots := []string{"."} + assert.Equal(t, expectedRoots, zipInstance.rootDirs) + }) + t.Run("zip files with dir inside", func(t *testing.T) { + // given + files := map[string]string{ + filepath.Join("folder", "file2.txt"): "test", + filepath.Join("folder", "file3.txt"): "test", + filepath.Join("folder", "folder1", "file4.txt"): "test", + } + + zipPath, err := createTestZip(t, files) + assert.NoError(t, err) + defer os.Remove(zipPath) + + // when + zipInstance := NewZip() + err = zipInstance.Initialize(zipPath) + + // then + assert.NoError(t, err) + assert.NotNil(t, zipInstance.archiveReader) + assert.Len(t, zipInstance.fileReaders, 3) + + expectedRoots := []string{"folder"} + assert.Equal(t, expectedRoots, zipInstance.rootDirs) + }) + t.Run("zip files with 2 dirs inside", func(t *testing.T) { + // given + files := map[string]string{ + filepath.Join("folder", "file2.txt"): "test", + filepath.Join("folder1", "folder2", "file4.txt"): "test", + } + + zipPath, err := createTestZip(t, files) + assert.NoError(t, err) + defer os.Remove(zipPath) + + // when + zipInstance := NewZip() + err = zipInstance.Initialize(zipPath) + + // then + assert.NoError(t, err) + assert.NotNil(t, zipInstance.archiveReader) + assert.Len(t, zipInstance.fileReaders, 2) + + expectedRoots := []string{"folder", filepath.Join("folder1", "folder2")} + assert.Equal(t, expectedRoots, zipInstance.rootDirs) + }) + t.Run("invalid path", func(t *testing.T) { + // given + zipInstance := NewZip() + + // when + err := zipInstance.Initialize("invalid_path.zip") + + // then + assert.Error(t, err) + }) +} From 4b21551fdd8b4d78af0ff72d8319aec8c34d4daa Mon Sep 17 00:00:00 2001 From: Jannis Metrikat <120120832+jmetrikat@users.noreply.github.com> Date: Fri, 10 Jan 2025 20:52:23 +0100 Subject: [PATCH 090/195] GO-4459: Fix object delete error handling --- cmd/api/object/handler.go | 2 +- cmd/api/object/service.go | 6 +++--- cmd/api/search/service.go | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/cmd/api/object/handler.go b/cmd/api/object/handler.go index c6f60d89f..cb2a224b3 100644 --- a/cmd/api/object/handler.go +++ b/cmd/api/object/handler.go @@ -103,7 +103,7 @@ func DeleteObjectHandler(s *ObjectService) gin.HandlerFunc { code := util.MapErrorCode(err, util.ErrToCode(ErrObjectNotFound, http.StatusNotFound), util.ErrToCode(ErrFailedRetrieveObject, http.StatusInternalServerError), - util.ErrToCode(ErrFailedDeleteObject, http.StatusInternalServerError), + util.ErrToCode(ErrFailedDeleteObject, http.StatusForbidden), ) if code != http.StatusOK { diff --git a/cmd/api/object/service.go b/cmd/api/object/service.go index 320815100..986cc7027 100644 --- a/cmd/api/object/service.go +++ b/cmd/api/object/service.go @@ -157,12 +157,12 @@ func (s *ObjectService) DeleteObject(ctx context.Context, spaceId string, object return Object{}, err } - resp := s.mw.ObjectListSetIsArchived(ctx, &pb.RpcObjectListSetIsArchivedRequest{ - ObjectIds: []string{objectId}, + resp := s.mw.ObjectSetIsArchived(ctx, &pb.RpcObjectSetIsArchivedRequest{ + ContextId: objectId, IsArchived: true, }) - if resp.Error.Code != pb.RpcObjectListSetIsArchivedResponseError_NULL { + if resp.Error.Code != pb.RpcObjectSetIsArchivedResponseError_NULL { return Object{}, ErrFailedDeleteObject } diff --git a/cmd/api/search/service.go b/cmd/api/search/service.go index 0014e7eaa..1d293f32d 100644 --- a/cmd/api/search/service.go +++ b/cmd/api/search/service.go @@ -59,7 +59,7 @@ func (s *SearchService) Search(ctx context.Context, searchQuery string, objectTy Sorts: []*model.BlockContentDataviewSort{{ RelationKey: bundle.RelationKeyLastModifiedDate.String(), Type: model.BlockContentDataviewSort_Desc, - Format: model.RelationFormat_longtext, + Format: model.RelationFormat_date, IncludeTime: true, EmptyPlacement: model.BlockContentDataviewSort_NotSpecified, }}, From 2cb03241f6e3f49fa1d310d602e7ef2906a4e76d Mon Sep 17 00:00:00 2001 From: Jannis Metrikat <120120832+jmetrikat@users.noreply.github.com> Date: Sat, 11 Jan 2025 18:44:30 +0100 Subject: [PATCH 091/195] GO-4459: Refactor pagination middleware --- cmd/api/pagination/pagination.go | 68 ++++++++++++++++++++++++++------ cmd/api/server/router.go | 29 +++++++------- 2 files changed, 69 insertions(+), 28 deletions(-) diff --git a/cmd/api/pagination/pagination.go b/cmd/api/pagination/pagination.go index 90fe9fc34..706756933 100644 --- a/cmd/api/pagination/pagination.go +++ b/cmd/api/pagination/pagination.go @@ -1,13 +1,52 @@ package pagination -import "github.com/gin-gonic/gin" +import ( + "fmt" + "net/http" + "strconv" -type Service[T any] interface { - RespondWithPagination(c *gin.Context, statusCode int, data []T, total int, offset int, limit int, hasMore bool) - Paginate(records []T, offset int, limit int) ([]T, bool) + "github.com/gin-gonic/gin" +) + +// Config holds pagination configuration options. +type Config struct { + DefaultPage int + DefaultPageSize int + MinPageSize int + MaxPageSize int } -// RespondWithPagination returns a json response with the paginated data and corresponding metadata +// New creates a Gin middleware for pagination with the provided Config. +func New(cfg Config) gin.HandlerFunc { + return func(c *gin.Context) { + page := getIntQueryParam(c, "offset", cfg.DefaultPage) + size := getIntQueryParam(c, "limit", cfg.DefaultPageSize) + + if size < cfg.MinPageSize || size > cfg.MaxPageSize { + c.AbortWithStatusJSON(http.StatusBadRequest, gin.H{ + "error": fmt.Sprintf("limit must be between %d and %d", cfg.MinPageSize, cfg.MaxPageSize), + }) + return + } + + c.Set("offset", page) + c.Set("limit", size) + + c.Next() + } +} + +// getIntQueryParam retrieves an integer query parameter or falls back to a default value. +func getIntQueryParam(c *gin.Context, key string, defaultValue int) int { + valStr := c.DefaultQuery(key, strconv.Itoa(defaultValue)) + val, err := strconv.Atoi(valStr) + if err != nil || val < 0 { + return defaultValue + } + return val +} + +// RespondWithPagination sends a paginated JSON response. func RespondWithPagination[T any](c *gin.Context, statusCode int, data []T, total int, offset int, limit int, hasMore bool) { c.JSON(statusCode, PaginatedResponse[T]{ Data: data, @@ -20,20 +59,23 @@ func RespondWithPagination[T any](c *gin.Context, statusCode int, data []T, tota }) } -// Paginate paginates the given records based on the offset and limit +// Paginate slices the records based on the offset and limit, and determines if more records are available. func Paginate[T any](records []T, offset int, limit int) ([]T, bool) { - total := len(records) - start := offset - end := offset + limit - - if start > total { - start = total + if offset < 0 || limit < 1 { + return []T{}, len(records) > 0 } + + total := len(records) + if offset > total { + offset = total + } + + end := offset + limit if end > total { end = total } - paginated := records[start:end] + paginated := records[offset:end] hasMore := end < total return paginated, hasMore diff --git a/cmd/api/server/router.go b/cmd/api/server/router.go index 9104b84cb..2cc5633a7 100644 --- a/cmd/api/server/router.go +++ b/cmd/api/server/router.go @@ -4,11 +4,11 @@ import ( "github.com/gin-gonic/gin" swaggerFiles "github.com/swaggo/files" ginSwagger "github.com/swaggo/gin-swagger" - "github.com/webstradev/gin-pagination/v2/pkg/pagination" "github.com/anyproto/anytype-heart/cmd/api/auth" "github.com/anyproto/anytype-heart/cmd/api/export" "github.com/anyproto/anytype-heart/cmd/api/object" + "github.com/anyproto/anytype-heart/cmd/api/pagination" "github.com/anyproto/anytype-heart/cmd/api/search" "github.com/anyproto/anytype-heart/cmd/api/space" ) @@ -18,20 +18,19 @@ func (s *Server) NewRouter() *gin.Engine { router := gin.Default() // Pagination middleware setup - paginator := pagination.New( - pagination.WithPageText("offset"), - pagination.WithSizeText("limit"), - pagination.WithDefaultPage(0), - pagination.WithDefaultPageSize(100), - pagination.WithMinPageSize(1), - pagination.WithMaxPageSize(1000), - ) + paginator := pagination.New(pagination.Config{ + DefaultPage: 0, + DefaultPageSize: 100, + MinPageSize: 1, + MaxPageSize: 1000, + }) // Swagger route router.GET("/swagger/*any", ginSwagger.WrapHandler(swaggerFiles.Handler)) // API routes v1 := router.Group("/v1") + v1.Use(paginator) v1.Use(s.initAccountInfo()) v1.Use(s.ensureAuthenticated()) { @@ -44,20 +43,20 @@ func (s *Server) NewRouter() *gin.Engine { v1.POST("/spaces/:space_id/objects/export/:format", export.GetSpaceExportHandler(s.exportService)) // Object - v1.GET("/spaces/:space_id/objects", paginator, object.GetObjectsHandler(s.objectService)) + v1.GET("/spaces/:space_id/objects", object.GetObjectsHandler(s.objectService)) v1.GET("/spaces/:space_id/objects/:object_id", object.GetObjectHandler(s.objectService)) v1.DELETE("/spaces/:space_id/objects/:object_id", object.DeleteObjectHandler(s.objectService)) - v1.GET("/spaces/:space_id/object_types", paginator, object.GetTypesHandler(s.objectService)) - v1.GET("/spaces/:space_id/object_types/:typeId/templates", paginator, object.GetTemplatesHandler(s.objectService)) + v1.GET("/spaces/:space_id/object_types", object.GetTypesHandler(s.objectService)) + v1.GET("/spaces/:space_id/object_types/:typeId/templates", object.GetTemplatesHandler(s.objectService)) v1.POST("/spaces/:space_id/objects", object.CreateObjectHandler(s.objectService)) v1.PUT("/spaces/:space_id/objects/:object_id", object.UpdateObjectHandler(s.objectService)) // Search - v1.GET("/search", paginator, search.SearchHandler(s.searchService)) + v1.GET("/search", search.SearchHandler(s.searchService)) // Space - v1.GET("/spaces", paginator, space.GetSpacesHandler(s.spaceService)) - v1.GET("/spaces/:space_id/members", paginator, space.GetMembersHandler(s.spaceService)) + v1.GET("/spaces", space.GetSpacesHandler(s.spaceService)) + v1.GET("/spaces/:space_id/members", space.GetMembersHandler(s.spaceService)) v1.POST("/spaces", space.CreateSpaceHandler(s.spaceService)) } From db30b1e0f55f7cf2400611f969962492d7f11197 Mon Sep 17 00:00:00 2001 From: Jannis Metrikat <120120832+jmetrikat@users.noreply.github.com> Date: Sat, 11 Jan 2025 18:44:51 +0100 Subject: [PATCH 092/195] GO-4459: Add pagination tests --- cmd/api/pagination/pagination_test.go | 174 ++++++++++++++++++++++++-- 1 file changed, 167 insertions(+), 7 deletions(-) diff --git a/cmd/api/pagination/pagination_test.go b/cmd/api/pagination/pagination_test.go index c4bab3936..928f0eee1 100644 --- a/cmd/api/pagination/pagination_test.go +++ b/cmd/api/pagination/pagination_test.go @@ -1,10 +1,164 @@ package pagination import ( - "reflect" + "encoding/json" + "net/http" + "net/http/httptest" "testing" + + "github.com/gin-gonic/gin" + "github.com/stretchr/testify/assert" ) +func TestNew(t *testing.T) { + commonConfig := Config{ + DefaultPage: 0, + DefaultPageSize: 10, + MinPageSize: 1, + MaxPageSize: 50, + } + + tests := []struct { + name string + queryParams map[string]string + overrideConfig func(cfg Config) Config + expectedStatus int + expectedOffset int + expectedLimit int + }{ + { + name: "Valid offset and limit", + queryParams: map[string]string{ + "offset": "10", + "limit": "20", + }, + overrideConfig: nil, + expectedStatus: http.StatusOK, + expectedOffset: 10, + expectedLimit: 20, + }, + { + name: "Offset missing, use default", + queryParams: map[string]string{ + "limit": "20", + }, + overrideConfig: nil, + expectedStatus: http.StatusOK, + expectedOffset: 0, + expectedLimit: 20, + }, + { + name: "Limit missing, use default", + queryParams: map[string]string{ + "offset": "5", + }, + overrideConfig: nil, + expectedStatus: http.StatusOK, + expectedOffset: 5, + expectedLimit: 10, + }, + { + name: "Limit below minimum", + queryParams: map[string]string{ + "offset": "5", + "limit": "0", + }, + overrideConfig: nil, + expectedStatus: http.StatusBadRequest, + }, + { + name: "Limit above maximum", + queryParams: map[string]string{ + "offset": "5", + "limit": "100", + }, + overrideConfig: nil, + expectedStatus: http.StatusBadRequest, + }, + { + name: "Negative offset, use default", + queryParams: map[string]string{ + "offset": "-5", + "limit": "10", + }, + overrideConfig: nil, + expectedStatus: http.StatusOK, + expectedOffset: 0, + expectedLimit: 10, + }, + { + name: "Custom min and max page size", + queryParams: map[string]string{ + "offset": "5", + "limit": "15", + }, + overrideConfig: func(cfg Config) Config { + cfg.MinPageSize = 10 + cfg.MaxPageSize = 20 + return cfg + }, + expectedStatus: http.StatusOK, + expectedOffset: 5, + expectedLimit: 15, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + // Apply overrideConfig if provided + cfg := commonConfig + if tt.overrideConfig != nil { + cfg = tt.overrideConfig(cfg) + } + + // Set up Gin + gin.SetMode(gin.TestMode) + r := gin.New() + r.Use(New(cfg)) + + // Define a test endpoint + r.GET("/", func(c *gin.Context) { + offset, _ := c.Get("offset") + limit, _ := c.Get("limit") + + c.JSON(http.StatusOK, gin.H{ + "offset": offset, + "limit": limit, + }) + }) + + // Create a test request + req := httptest.NewRequest(http.MethodGet, "/", nil) + q := req.URL.Query() + for k, v := range tt.queryParams { + q.Add(k, v) + } + req.URL.RawQuery = q.Encode() + + // Perform the request + w := httptest.NewRecorder() + r.ServeHTTP(w, req) + + // Check the response + assert.Equal(t, tt.expectedStatus, w.Code) + + if w.Code == http.StatusOK { + var resp map[string]interface{} + err := json.Unmarshal(w.Body.Bytes(), &resp) + assert.NoError(t, err) + + // Validate offset and limit + if offset, ok := resp["offset"].(float64); ok { + assert.Equal(t, float64(tt.expectedOffset), offset) + } + if limit, ok := resp["limit"].(float64); ok { + assert.Equal(t, float64(tt.expectedLimit), limit) + } + } + }) + } +} + func TestPaginate(t *testing.T) { type args struct { records []int @@ -77,18 +231,24 @@ func TestPaginate(t *testing.T) { wantPaginated: []int{}, wantHasMore: true, // items remain: [2,3,4,5] }, + { + name: "Negative offset and limit (should return empty)", + args: args{ + records: []int{1, 2, 3, 4, 5}, + offset: -1, + limit: -1, + }, + wantPaginated: []int{}, + wantHasMore: true, // items remain: [1,2,3,4,5] + }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { gotPaginated, gotHasMore := Paginate(tt.args.records, tt.args.offset, tt.args.limit) - if !reflect.DeepEqual(gotPaginated, tt.wantPaginated) { - t.Errorf("Paginate() gotPaginated = %v, want %v", gotPaginated, tt.wantPaginated) - } - if gotHasMore != tt.wantHasMore { - t.Errorf("Paginate() gotHasMore = %v, want %v", gotHasMore, tt.wantHasMore) - } + assert.Equal(t, tt.wantPaginated, gotPaginated, "Paginate() gotPaginated = %v, want %v", gotPaginated, tt.wantPaginated) + assert.Equal(t, tt.wantHasMore, gotHasMore, "Paginate() gotHasMore = %v, want %v", gotHasMore, tt.wantHasMore) }) } } From edc2219836d9a061fe44363129b5a79371558677 Mon Sep 17 00:00:00 2001 From: Jannis Metrikat <120120832+jmetrikat@users.noreply.github.com> Date: Sat, 11 Jan 2025 18:48:18 +0100 Subject: [PATCH 093/195] GO-4459: Remove unused dependency --- go.mod | 3 +-- go.sum | 2 -- 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/go.mod b/go.mod index 170d98496..7e842dc16 100644 --- a/go.mod +++ b/go.mod @@ -62,7 +62,6 @@ require ( github.com/kelseyhightower/envconfig v1.4.0 github.com/klauspost/compress v1.17.11 github.com/kovidgoyal/imaging v1.6.3 - github.com/libp2p/go-libp2p v0.37.0 github.com/libp2p/zeroconf/v2 v2.2.0 github.com/logrusorgru/aurora v2.0.3+incompatible github.com/magiconair/properties v1.8.9 @@ -96,7 +95,6 @@ require ( github.com/uber/jaeger-client-go v2.30.0+incompatible github.com/valyala/fastjson v1.6.4 github.com/vektra/mockery/v2 v2.47.0 - github.com/webstradev/gin-pagination/v2 v2.0.2 github.com/xeipuuv/gojsonschema v1.2.0 github.com/yuin/goldmark v1.7.8 github.com/zeebo/blake3 v0.2.4 @@ -215,6 +213,7 @@ require ( github.com/klauspost/cpuid/v2 v2.2.8 // indirect github.com/leodido/go-urn v1.4.0 // indirect github.com/libp2p/go-buffer-pool v0.1.0 // indirect + github.com/libp2p/go-libp2p v0.37.0 // indirect github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 // indirect github.com/mailru/easyjson v0.7.6 // indirect github.com/mattn/go-colorable v0.1.13 // indirect diff --git a/go.sum b/go.sum index 2586e14d0..62d1047a5 100644 --- a/go.sum +++ b/go.sum @@ -1055,8 +1055,6 @@ github.com/warpfork/go-testmark v0.12.1 h1:rMgCpJfwy1sJ50x0M0NgyphxYYPMOODIJHhsX github.com/warpfork/go-testmark v0.12.1/go.mod h1:kHwy7wfvGSPh1rQJYKayD4AbtNaeyZdcGi9tNJTaa5Y= github.com/warpfork/go-wish v0.0.0-20220906213052-39a1cc7a02d0 h1:GDDkbFiaK8jsSDJfjId/PEGEShv6ugrt4kYsC5UIDaQ= github.com/warpfork/go-wish v0.0.0-20220906213052-39a1cc7a02d0/go.mod h1:x6AKhvSSexNrVSrViXSHUEbICjmGXhtgABaHIySUSGw= -github.com/webstradev/gin-pagination/v2 v2.0.2 h1:CCbmxdvW3lJR5UJM972jlLgi6R0aU/fMyuj5CfULqz8= -github.com/webstradev/gin-pagination/v2 v2.0.2/go.mod h1:C/1SBe8wng4aKNt3+vWVaQJwi+blntO3JT/uy0LqJjE= github.com/whyrusleeping/chunker v0.0.0-20181014151217-fe64bd25879f h1:jQa4QT2UP9WYv2nzyawpKMOCl+Z/jW7djv2/J50lj9E= github.com/whyrusleeping/chunker v0.0.0-20181014151217-fe64bd25879f/go.mod h1:p9UJB6dDgdPgMJZs7UjUOdulKyRr9fqkS+6JKAInPy8= github.com/wlynxg/anet v0.0.5 h1:J3VJGi1gvo0JwZ/P1/Yc/8p63SoW98B5dHkYDmpgvvU= From 892d929683e8ab0f624679725e0335ef127e1305 Mon Sep 17 00:00:00 2001 From: Jannis Metrikat <120120832+jmetrikat@users.noreply.github.com> Date: Sun, 12 Jan 2025 00:21:56 +0100 Subject: [PATCH 094/195] GO-4459: Refactor api into component runnable service --- cmd/api/main.go | 60 ---------- cmd/api/server/server.go | 69 ------------ cmd/grpcserver/grpc.go | 7 +- core/anytype/bootstrap.go | 4 +- {cmd => core}/api/auth/handler.go | 2 +- {cmd => core}/api/auth/model.go | 0 {cmd => core}/api/auth/service.go | 0 {cmd => core}/api/auth/service_test.go | 0 {cmd => core}/api/demo/api_demo.go | 0 {cmd => core}/api/docs/docs.go | 4 + {cmd => core}/api/docs/swagger.json | 4 + {cmd => core}/api/docs/swagger.yaml | 3 + {cmd => core}/api/export/handler.go | 2 +- {cmd => core}/api/export/model.go | 0 {cmd => core}/api/export/service.go | 0 {cmd => core}/api/object/handler.go | 4 +- {cmd => core}/api/object/model.go | 0 {cmd => core}/api/object/service.go | 4 +- {cmd => core}/api/object/service_test.go | 0 {cmd => core}/api/pagination/model.go | 0 {cmd => core}/api/pagination/pagination.go | 0 .../api/pagination/pagination_test.go | 0 {cmd => core}/api/search/handler.go | 6 +- {cmd => core}/api/search/service.go | 18 +-- {cmd => core}/api/search/service_test.go | 10 +- {cmd => core}/api/server/middleware.go | 8 +- {cmd => core}/api/server/router.go | 17 +-- core/api/server/server.go | 44 ++++++++ core/api/service.go | 104 ++++++++++++++++++ {cmd => core}/api/space/handler.go | 4 +- {cmd => core}/api/space/model.go | 0 {cmd => core}/api/space/service.go | 4 +- {cmd => core}/api/space/service_test.go | 0 {cmd => core}/api/util/error.go | 0 {cmd => core}/api/util/util.go | 0 35 files changed, 204 insertions(+), 174 deletions(-) delete mode 100644 cmd/api/main.go delete mode 100644 cmd/api/server/server.go rename {cmd => core}/api/auth/handler.go (97%) rename {cmd => core}/api/auth/model.go (100%) rename {cmd => core}/api/auth/service.go (100%) rename {cmd => core}/api/auth/service_test.go (100%) rename {cmd => core}/api/demo/api_demo.go (100%) rename {cmd => core}/api/docs/docs.go (99%) rename {cmd => core}/api/docs/swagger.json (99%) rename {cmd => core}/api/docs/swagger.yaml (99%) rename {cmd => core}/api/export/handler.go (97%) rename {cmd => core}/api/export/model.go (100%) rename {cmd => core}/api/export/service.go (100%) rename {cmd => core}/api/object/handler.go (99%) rename {cmd => core}/api/object/model.go (100%) rename {cmd => core}/api/object/service.go (99%) rename {cmd => core}/api/object/service_test.go (100%) rename {cmd => core}/api/pagination/model.go (100%) rename {cmd => core}/api/pagination/pagination.go (100%) rename {cmd => core}/api/pagination/pagination_test.go (100%) rename {cmd => core}/api/search/handler.go (91%) rename {cmd => core}/api/search/service.go (92%) rename {cmd => core}/api/search/service_test.go (96%) rename {cmd => core}/api/server/middleware.go (85%) rename {cmd => core}/api/server/router.go (81%) create mode 100644 core/api/server/server.go create mode 100644 core/api/service.go rename {cmd => core}/api/space/handler.go (97%) rename {cmd => core}/api/space/model.go (100%) rename {cmd => core}/api/space/service.go (98%) rename {cmd => core}/api/space/service_test.go (100%) rename {cmd => core}/api/util/error.go (100%) rename {cmd => core}/api/util/util.go (100%) diff --git a/cmd/api/main.go b/cmd/api/main.go deleted file mode 100644 index 8584c330e..000000000 --- a/cmd/api/main.go +++ /dev/null @@ -1,60 +0,0 @@ -package api - -import ( - "context" - "errors" - "fmt" - "net/http" - "os" - "os/signal" - "time" - - _ "github.com/anyproto/anytype-heart/cmd/api/docs" - "github.com/anyproto/anytype-heart/cmd/api/server" - "github.com/anyproto/anytype-heart/core" - "github.com/anyproto/anytype-heart/pb/service" -) - -const ( - serverShutdownTime = 5 * time.Second -) - -// RunApiServer starts the HTTP server and registers the API routes. -// -// @title Anytype API -// @version 1.0 -// @description This API allows interaction with Anytype resources such as spaces, objects, and object types. -// @termsOfService https://anytype.io/terms_of_use -// @contact.name Anytype Support -// @contact.url https://anytype.io/contact -// @contact.email support@anytype.io -// @license.name Any Source Available License 1.0 -// @license.url https://github.com/anyproto/anytype-ts/blob/main/LICENSE.md -// @host localhost:31009 -// @BasePath /v1 -// @securityDefinitions.basic BasicAuth -// @externalDocs.description OpenAPI -// @externalDocs.url https://swagger.io/resources/open-api/ -func RunApiServer(ctx context.Context, mw service.ClientCommandsServer, mwInternal core.MiddlewareInternal) { - // Create a new server instance including the router - srv := server.NewServer(mw, mwInternal) - - // Start the server in a goroutine so we can handle graceful shutdown - go func() { - if err := srv.ListenAndServe(); err != nil && !errors.Is(err, http.ErrServerClosed) { - fmt.Printf("API server error: %v\n", err) - } - }() - - // Graceful shutdown on CTRL+C / SIGINT - quit := make(chan os.Signal, 1) - signal.Notify(quit, os.Interrupt) - <-quit - - ctx, cancel := context.WithTimeout(context.Background(), serverShutdownTime) - defer cancel() - - if err := srv.Shutdown(ctx); err != nil { - fmt.Printf("API server shutdown failed: %v\n", err) - } -} diff --git a/cmd/api/server/server.go b/cmd/api/server/server.go deleted file mode 100644 index 3441e2965..000000000 --- a/cmd/api/server/server.go +++ /dev/null @@ -1,69 +0,0 @@ -package server - -import ( - "context" - "fmt" - "net/http" - "time" - - "github.com/gin-gonic/gin" - - "github.com/anyproto/anytype-heart/cmd/api/auth" - "github.com/anyproto/anytype-heart/cmd/api/export" - "github.com/anyproto/anytype-heart/cmd/api/object" - "github.com/anyproto/anytype-heart/cmd/api/search" - "github.com/anyproto/anytype-heart/cmd/api/space" - "github.com/anyproto/anytype-heart/core" - "github.com/anyproto/anytype-heart/pb/service" -) - -const ( - httpPort = ":31009" - readHeaderTimeout = 5 * time.Second -) - -// Server wraps the HTTP server and service logic. -type Server struct { - engine *gin.Engine - srv *http.Server - - mwInternal core.MiddlewareInternal - authService *auth.AuthService - exportService *export.ExportService - objectService *object.ObjectService - spaceService *space.SpaceService - searchService *search.SearchService -} - -// NewServer constructs a new Server with default config and sets up the routes. -func NewServer(mw service.ClientCommandsServer, mwInternal core.MiddlewareInternal) *Server { - s := &Server{ - mwInternal: mwInternal, - authService: auth.NewService(mw), - exportService: export.NewService(mw), - objectService: object.NewService(mw), - spaceService: space.NewService(mw), - } - - s.searchService = search.NewService(mw, s.spaceService, s.objectService) - s.engine = s.NewRouter() - s.srv = &http.Server{ - Addr: httpPort, - Handler: s.engine, - ReadHeaderTimeout: readHeaderTimeout, - } - - return s -} - -// ListenAndServe starts the HTTP server. -func (s *Server) ListenAndServe() error { - fmt.Printf("Starting API server on %s\n", httpPort) - return s.srv.ListenAndServe() -} - -// Shutdown gracefully stops the server. -func (s *Server) Shutdown(ctx context.Context) error { - fmt.Println("Shutting down API server...") - return s.srv.Shutdown(ctx) -} diff --git a/cmd/grpcserver/grpc.go b/cmd/grpcserver/grpc.go index 6e23abf88..987f6d1c9 100644 --- a/cmd/grpcserver/grpc.go +++ b/cmd/grpcserver/grpc.go @@ -30,8 +30,8 @@ import ( jaegercfg "github.com/uber/jaeger-client-go/config" "google.golang.org/grpc" - "github.com/anyproto/anytype-heart/cmd/api" "github.com/anyproto/anytype-heart/core" + "github.com/anyproto/anytype-heart/core/api" "github.com/anyproto/anytype-heart/core/event" "github.com/anyproto/anytype-heart/metrics" "github.com/anyproto/anytype-heart/pb" @@ -248,10 +248,7 @@ func main() { } // run rest api server - var mwInternal core.MiddlewareInternal = mw - ctx, cancel := context.WithCancel(context.Background()) - defer cancel() - go api.RunApiServer(ctx, mw, mwInternal) + api.SetMiddlewareParams(mw) for { sig := <-signalChan diff --git a/core/anytype/bootstrap.go b/core/anytype/bootstrap.go index 26beb7b85..2f053ed09 100644 --- a/core/anytype/bootstrap.go +++ b/core/anytype/bootstrap.go @@ -34,6 +34,7 @@ import ( "github.com/anyproto/anytype-heart/core/acl" "github.com/anyproto/anytype-heart/core/anytype/account" "github.com/anyproto/anytype-heart/core/anytype/config" + "github.com/anyproto/anytype-heart/core/api" "github.com/anyproto/anytype-heart/core/block" "github.com/anyproto/anytype-heart/core/block/backlinks" "github.com/anyproto/anytype-heart/core/block/bookmark" @@ -317,7 +318,8 @@ func Bootstrap(a *app.App, components ...app.Component) { Register(paymentscache.New()). Register(peerstatus.New()). Register(lastused.New()). - Register(spaceview.New()) + Register(spaceview.New()). + Register(api.New()) } func MiddlewareVersion() string { diff --git a/cmd/api/auth/handler.go b/core/api/auth/handler.go similarity index 97% rename from cmd/api/auth/handler.go rename to core/api/auth/handler.go index 907218510..8193505f7 100644 --- a/cmd/api/auth/handler.go +++ b/core/api/auth/handler.go @@ -5,7 +5,7 @@ import ( "github.com/gin-gonic/gin" - "github.com/anyproto/anytype-heart/cmd/api/util" + "github.com/anyproto/anytype-heart/core/api/util" ) // DisplayCodeHandler generates a new challenge and returns the challenge ID diff --git a/cmd/api/auth/model.go b/core/api/auth/model.go similarity index 100% rename from cmd/api/auth/model.go rename to core/api/auth/model.go diff --git a/cmd/api/auth/service.go b/core/api/auth/service.go similarity index 100% rename from cmd/api/auth/service.go rename to core/api/auth/service.go diff --git a/cmd/api/auth/service_test.go b/core/api/auth/service_test.go similarity index 100% rename from cmd/api/auth/service_test.go rename to core/api/auth/service_test.go diff --git a/cmd/api/demo/api_demo.go b/core/api/demo/api_demo.go similarity index 100% rename from cmd/api/demo/api_demo.go rename to core/api/demo/api_demo.go diff --git a/cmd/api/docs/docs.go b/core/api/docs/docs.go similarity index 99% rename from cmd/api/docs/docs.go rename to core/api/docs/docs.go index bd37c0172..e4edc552b 100644 --- a/cmd/api/docs/docs.go +++ b/core/api/docs/docs.go @@ -1057,6 +1057,10 @@ const docTemplate = `{ "type": "string", "example": "Page" }, + "recommended_layout": { + "type": "string", + "example": "todo" + }, "type": { "type": "string", "example": "object_type" diff --git a/cmd/api/docs/swagger.json b/core/api/docs/swagger.json similarity index 99% rename from cmd/api/docs/swagger.json rename to core/api/docs/swagger.json index 7c882dc72..cb33fc852 100644 --- a/cmd/api/docs/swagger.json +++ b/core/api/docs/swagger.json @@ -1051,6 +1051,10 @@ "type": "string", "example": "Page" }, + "recommended_layout": { + "type": "string", + "example": "todo" + }, "type": { "type": "string", "example": "object_type" diff --git a/cmd/api/docs/swagger.yaml b/core/api/docs/swagger.yaml similarity index 99% rename from cmd/api/docs/swagger.yaml rename to core/api/docs/swagger.yaml index 6c2bc2bdc..c924ff003 100644 --- a/cmd/api/docs/swagger.yaml +++ b/core/api/docs/swagger.yaml @@ -133,6 +133,9 @@ definitions: name: example: Page type: string + recommended_layout: + example: todo + type: string type: example: object_type type: string diff --git a/cmd/api/export/handler.go b/core/api/export/handler.go similarity index 97% rename from cmd/api/export/handler.go rename to core/api/export/handler.go index 289b05122..d07f674bd 100644 --- a/cmd/api/export/handler.go +++ b/core/api/export/handler.go @@ -5,7 +5,7 @@ import ( "github.com/gin-gonic/gin" - "github.com/anyproto/anytype-heart/cmd/api/util" + "github.com/anyproto/anytype-heart/core/api/util" ) // GetObjectExportHandler exports an object to the specified format diff --git a/cmd/api/export/model.go b/core/api/export/model.go similarity index 100% rename from cmd/api/export/model.go rename to core/api/export/model.go diff --git a/cmd/api/export/service.go b/core/api/export/service.go similarity index 100% rename from cmd/api/export/service.go rename to core/api/export/service.go diff --git a/cmd/api/object/handler.go b/core/api/object/handler.go similarity index 99% rename from cmd/api/object/handler.go rename to core/api/object/handler.go index cb2a224b3..18facccf7 100644 --- a/cmd/api/object/handler.go +++ b/core/api/object/handler.go @@ -5,8 +5,8 @@ import ( "github.com/gin-gonic/gin" - "github.com/anyproto/anytype-heart/cmd/api/pagination" - "github.com/anyproto/anytype-heart/cmd/api/util" + "github.com/anyproto/anytype-heart/core/api/pagination" + "github.com/anyproto/anytype-heart/core/api/util" ) // GetObjectsHandler retrieves objects in a specific space diff --git a/cmd/api/object/model.go b/core/api/object/model.go similarity index 100% rename from cmd/api/object/model.go rename to core/api/object/model.go diff --git a/cmd/api/object/service.go b/core/api/object/service.go similarity index 99% rename from cmd/api/object/service.go rename to core/api/object/service.go index 986cc7027..e5f459687 100644 --- a/cmd/api/object/service.go +++ b/core/api/object/service.go @@ -6,8 +6,8 @@ import ( "github.com/gogo/protobuf/types" - "github.com/anyproto/anytype-heart/cmd/api/pagination" - "github.com/anyproto/anytype-heart/cmd/api/util" + "github.com/anyproto/anytype-heart/core/api/pagination" + "github.com/anyproto/anytype-heart/core/api/util" "github.com/anyproto/anytype-heart/pb" "github.com/anyproto/anytype-heart/pb/service" "github.com/anyproto/anytype-heart/pkg/lib/bundle" diff --git a/cmd/api/object/service_test.go b/core/api/object/service_test.go similarity index 100% rename from cmd/api/object/service_test.go rename to core/api/object/service_test.go diff --git a/cmd/api/pagination/model.go b/core/api/pagination/model.go similarity index 100% rename from cmd/api/pagination/model.go rename to core/api/pagination/model.go diff --git a/cmd/api/pagination/pagination.go b/core/api/pagination/pagination.go similarity index 100% rename from cmd/api/pagination/pagination.go rename to core/api/pagination/pagination.go diff --git a/cmd/api/pagination/pagination_test.go b/core/api/pagination/pagination_test.go similarity index 100% rename from cmd/api/pagination/pagination_test.go rename to core/api/pagination/pagination_test.go diff --git a/cmd/api/search/handler.go b/core/api/search/handler.go similarity index 91% rename from cmd/api/search/handler.go rename to core/api/search/handler.go index 78e17b764..efa19b326 100644 --- a/cmd/api/search/handler.go +++ b/core/api/search/handler.go @@ -5,9 +5,9 @@ import ( "github.com/gin-gonic/gin" - "github.com/anyproto/anytype-heart/cmd/api/pagination" - "github.com/anyproto/anytype-heart/cmd/api/space" - "github.com/anyproto/anytype-heart/cmd/api/util" + "github.com/anyproto/anytype-heart/core/api/pagination" + "github.com/anyproto/anytype-heart/core/api/space" + "github.com/anyproto/anytype-heart/core/api/util" ) // SearchHandler searches and retrieves objects across all the spaces diff --git a/cmd/api/search/service.go b/core/api/search/service.go similarity index 92% rename from cmd/api/search/service.go rename to core/api/search/service.go index 1d293f32d..54ca8a4de 100644 --- a/cmd/api/search/service.go +++ b/core/api/search/service.go @@ -6,10 +6,10 @@ import ( "sort" "strings" - "github.com/anyproto/anytype-heart/cmd/api/object" - "github.com/anyproto/anytype-heart/cmd/api/pagination" - "github.com/anyproto/anytype-heart/cmd/api/space" - "github.com/anyproto/anytype-heart/cmd/api/util" + object2 "github.com/anyproto/anytype-heart/core/api/object" + "github.com/anyproto/anytype-heart/core/api/pagination" + "github.com/anyproto/anytype-heart/core/api/space" + "github.com/anyproto/anytype-heart/core/api/util" "github.com/anyproto/anytype-heart/pb" "github.com/anyproto/anytype-heart/pb/service" "github.com/anyproto/anytype-heart/pkg/lib/bundle" @@ -23,22 +23,22 @@ var ( ) type Service interface { - Search(ctx context.Context, searchQuery string, objectTypes []string, offset, limit int) (objects []object.Object, total int, hasMore bool, err error) + Search(ctx context.Context, searchQuery string, objectTypes []string, offset, limit int) (objects []object2.Object, total int, hasMore bool, err error) } type SearchService struct { mw service.ClientCommandsServer spaceService *space.SpaceService - objectService *object.ObjectService + objectService *object2.ObjectService AccountInfo *model.AccountInfo } -func NewService(mw service.ClientCommandsServer, spaceService *space.SpaceService, objectService *object.ObjectService) *SearchService { +func NewService(mw service.ClientCommandsServer, spaceService *space.SpaceService, objectService *object2.ObjectService) *SearchService { return &SearchService{mw: mw, spaceService: spaceService, objectService: objectService} } // Search retrieves a paginated list of objects from all spaces that match the search parameters. -func (s *SearchService) Search(ctx context.Context, searchQuery string, objectTypes []string, offset, limit int) (objects []object.Object, total int, hasMore bool, err error) { +func (s *SearchService) Search(ctx context.Context, searchQuery string, objectTypes []string, offset, limit int) (objects []object2.Object, total int, hasMore bool, err error) { spaces, _, _, err := s.spaceService.ListSpaces(ctx, 0, 100) if err != nil { return nil, 0, false, err @@ -47,7 +47,7 @@ func (s *SearchService) Search(ctx context.Context, searchQuery string, objectTy baseFilters := s.prepareBaseFilters() queryFilters := s.prepareQueryFilter(searchQuery) - results := make([]object.Object, 0) + results := make([]object2.Object, 0) for _, space := range spaces { // Resolve object type IDs per space, as they are unique per space objectTypeFilters := s.prepareObjectTypeFilters(space.Id, objectTypes) diff --git a/cmd/api/search/service_test.go b/core/api/search/service_test.go similarity index 96% rename from cmd/api/search/service_test.go rename to core/api/search/service_test.go index bbc795c89..eba17ef4d 100644 --- a/cmd/api/search/service_test.go +++ b/core/api/search/service_test.go @@ -8,8 +8,8 @@ import ( "github.com/stretchr/testify/mock" "github.com/stretchr/testify/require" - "github.com/anyproto/anytype-heart/cmd/api/object" - "github.com/anyproto/anytype-heart/cmd/api/space" + object2 "github.com/anyproto/anytype-heart/core/api/object" + "github.com/anyproto/anytype-heart/core/api/space" "github.com/anyproto/anytype-heart/pb" "github.com/anyproto/anytype-heart/pb/service/mock_service" "github.com/anyproto/anytype-heart/pkg/lib/bundle" @@ -34,7 +34,7 @@ func newFixture(t *testing.T) *fixture { spaceService := space.NewService(mw) spaceService.AccountInfo = &model.AccountInfo{TechSpaceId: techSpaceId} - objectService := object.NewService(mw) + objectService := object2.NewService(mw) objectService.AccountInfo = &model.AccountInfo{TechSpaceId: techSpaceId} searchService := NewService(mw, spaceService, objectService) searchService.AccountInfo = &model.AccountInfo{ @@ -221,9 +221,9 @@ func TestSearchService_Search(t *testing.T) { } // check tags - tags := []object.Tag{} + tags := []object2.Tag{} for _, detail := range objects[0].Details { - if tagList, ok := detail.Details["tags"].([]object.Tag); ok { + if tagList, ok := detail.Details["tags"].([]object2.Tag); ok { for _, tag := range tagList { tags = append(tags, tag) } diff --git a/cmd/api/server/middleware.go b/core/api/server/middleware.go similarity index 85% rename from cmd/api/server/middleware.go rename to core/api/server/middleware.go index 6cefcd012..b88747337 100644 --- a/cmd/api/server/middleware.go +++ b/core/api/server/middleware.go @@ -5,22 +5,22 @@ import ( "fmt" "net/http" + "github.com/anyproto/any-sync/app" "github.com/gin-gonic/gin" "github.com/anyproto/anytype-heart/core/anytype/account" ) // initAccountInfo retrieves the account information from the account service. -func (s *Server) initAccountInfo() gin.HandlerFunc { +func (s *Server) initAccountInfo(a *app.App) gin.HandlerFunc { return func(c *gin.Context) { // TODO: consider not fetching account info on every request; currently used to avoid inconsistencies on logout/login - app := s.mwInternal.GetApp() - if app == nil { + if a == nil { c.AbortWithStatusJSON(http.StatusForbidden, gin.H{"error": "failed to get app instance"}) return } - accInfo, err := app.Component(account.CName).(account.Service).GetInfo(context.Background()) + accInfo, err := a.Component(account.CName).(account.Service).GetInfo(context.Background()) if err != nil { c.AbortWithStatusJSON(http.StatusInternalServerError, gin.H{"error": fmt.Sprintf("failed to get account info: %v", err)}) return diff --git a/cmd/api/server/router.go b/core/api/server/router.go similarity index 81% rename from cmd/api/server/router.go rename to core/api/server/router.go index 2cc5633a7..5fa9ad842 100644 --- a/cmd/api/server/router.go +++ b/core/api/server/router.go @@ -1,20 +1,21 @@ package server import ( + "github.com/anyproto/any-sync/app" "github.com/gin-gonic/gin" swaggerFiles "github.com/swaggo/files" ginSwagger "github.com/swaggo/gin-swagger" - "github.com/anyproto/anytype-heart/cmd/api/auth" - "github.com/anyproto/anytype-heart/cmd/api/export" - "github.com/anyproto/anytype-heart/cmd/api/object" - "github.com/anyproto/anytype-heart/cmd/api/pagination" - "github.com/anyproto/anytype-heart/cmd/api/search" - "github.com/anyproto/anytype-heart/cmd/api/space" + "github.com/anyproto/anytype-heart/core/api/auth" + "github.com/anyproto/anytype-heart/core/api/export" + "github.com/anyproto/anytype-heart/core/api/object" + "github.com/anyproto/anytype-heart/core/api/pagination" + "github.com/anyproto/anytype-heart/core/api/search" + "github.com/anyproto/anytype-heart/core/api/space" ) // NewRouter builds and returns a *gin.Engine with all routes configured. -func (s *Server) NewRouter() *gin.Engine { +func (s *Server) NewRouter(a *app.App) *gin.Engine { router := gin.Default() // Pagination middleware setup @@ -31,7 +32,7 @@ func (s *Server) NewRouter() *gin.Engine { // API routes v1 := router.Group("/v1") v1.Use(paginator) - v1.Use(s.initAccountInfo()) + v1.Use(s.initAccountInfo(a)) v1.Use(s.ensureAuthenticated()) { // Auth diff --git a/core/api/server/server.go b/core/api/server/server.go new file mode 100644 index 000000000..3141fc2f1 --- /dev/null +++ b/core/api/server/server.go @@ -0,0 +1,44 @@ +package server + +import ( + "github.com/anyproto/any-sync/app" + "github.com/gin-gonic/gin" + + "github.com/anyproto/anytype-heart/core/api/auth" + "github.com/anyproto/anytype-heart/core/api/export" + "github.com/anyproto/anytype-heart/core/api/object" + "github.com/anyproto/anytype-heart/core/api/search" + "github.com/anyproto/anytype-heart/core/api/space" + "github.com/anyproto/anytype-heart/pb/service" +) + +// Server wraps the HTTP server and service logic. +type Server struct { + engine *gin.Engine + + authService *auth.AuthService + exportService *export.ExportService + objectService *object.ObjectService + spaceService *space.SpaceService + searchService *search.SearchService +} + +// NewServer constructs a new Server with default config and sets up the routes. +func NewServer(a *app.App, mw service.ClientCommandsServer) *Server { + s := &Server{ + authService: auth.NewService(mw), + exportService: export.NewService(mw), + objectService: object.NewService(mw), + spaceService: space.NewService(mw), + } + + s.searchService = search.NewService(mw, s.spaceService, s.objectService) + s.engine = s.NewRouter(a) + + return s +} + +// Engine returns the underlying gin.Engine. +func (s *Server) Engine() *gin.Engine { + return s.engine +} diff --git a/core/api/service.go b/core/api/service.go new file mode 100644 index 000000000..21715d6cf --- /dev/null +++ b/core/api/service.go @@ -0,0 +1,104 @@ +package api + +import ( + "context" + "fmt" + "net/http" + "time" + + "github.com/anyproto/any-sync/app" + + "github.com/anyproto/anytype-heart/core/api/server" + "github.com/anyproto/anytype-heart/pb/service" + "github.com/anyproto/anytype-heart/pkg/lib/logging" +) + +const ( + CName = "api" + httpPort = ":31009" + timeout = 5 * time.Second +) + +var ( + logger = logging.Logger(CName) + mwSrv service.ClientCommandsServer +) + +type Api interface { + app.ComponentRunnable +} + +type apiService struct { + srv *server.Server + httpSrv *http.Server + mw service.ClientCommandsServer +} + +func New() Api { + return &apiService{ + mw: mwSrv, + } +} + +func (s *apiService) Name() (name string) { + return CName +} + +// @title Anytype API +// @version 1.0 +// @description This API allows interaction with Anytype resources such as spaces, objects, and object types. +// @termsOfService https://anytype.io/terms_of_use +// @contact.name Anytype Support +// @contact.url https://anytype.io/contact +// @contact.email support@anytype.io +// @license.name Any Source Available License 1.0 +// @license.url https://github.com/anyproto/anytype-ts/blob/main/LICENSE.md +// @host localhost:31009 +// @BasePath /v1 +// @securityDefinitions.basic BasicAuth +// @externalDocs.description OpenAPI +// @externalDocs.url https://swagger.io/resources/open-api/ +func (s *apiService) Init(a *app.App) (err error) { + fmt.Println("Initializing API service...") + + s.srv = server.NewServer(a, s.mw) + s.httpSrv = &http.Server{ + Addr: httpPort, + Handler: s.srv.Engine(), + ReadHeaderTimeout: timeout, + } + + return nil +} + +func (s *apiService) Run(ctx context.Context) (err error) { + fmt.Printf("Starting API server on %s\n", s.httpSrv.Addr) + + go func() { + if err := s.httpSrv.ListenAndServe(); err != nil && err != http.ErrServerClosed { + fmt.Printf("API server ListenAndServe error: %v\n", err) + } + }() + + return nil +} + +func (s *apiService) Close(ctx context.Context) (err error) { + fmt.Println("Closing API service...") + + // Give the server a short time to finish ongoing requests. + shutdownCtx, cancel := context.WithTimeout(ctx, timeout) + defer cancel() + + if err := s.httpSrv.Shutdown(shutdownCtx); err != nil { + fmt.Printf("API server shutdown error: %v\n", err) + return err + } + + fmt.Println("API service stopped gracefully.") + return nil +} + +func SetMiddlewareParams(mw service.ClientCommandsServer) { + mwSrv = mw +} diff --git a/cmd/api/space/handler.go b/core/api/space/handler.go similarity index 97% rename from cmd/api/space/handler.go rename to core/api/space/handler.go index e50eec2f9..54679d78f 100644 --- a/cmd/api/space/handler.go +++ b/core/api/space/handler.go @@ -5,8 +5,8 @@ import ( "github.com/gin-gonic/gin" - "github.com/anyproto/anytype-heart/cmd/api/pagination" - "github.com/anyproto/anytype-heart/cmd/api/util" + "github.com/anyproto/anytype-heart/core/api/pagination" + "github.com/anyproto/anytype-heart/core/api/util" ) // GetSpacesHandler retrieves a list of spaces diff --git a/cmd/api/space/model.go b/core/api/space/model.go similarity index 100% rename from cmd/api/space/model.go rename to core/api/space/model.go diff --git a/cmd/api/space/service.go b/core/api/space/service.go similarity index 98% rename from cmd/api/space/service.go rename to core/api/space/service.go index 2e47c15d2..4b84baa5b 100644 --- a/cmd/api/space/service.go +++ b/core/api/space/service.go @@ -8,8 +8,8 @@ import ( "github.com/gogo/protobuf/types" - "github.com/anyproto/anytype-heart/cmd/api/pagination" - "github.com/anyproto/anytype-heart/cmd/api/util" + "github.com/anyproto/anytype-heart/core/api/pagination" + "github.com/anyproto/anytype-heart/core/api/util" "github.com/anyproto/anytype-heart/pb" "github.com/anyproto/anytype-heart/pb/service" "github.com/anyproto/anytype-heart/pkg/lib/bundle" diff --git a/cmd/api/space/service_test.go b/core/api/space/service_test.go similarity index 100% rename from cmd/api/space/service_test.go rename to core/api/space/service_test.go diff --git a/cmd/api/util/error.go b/core/api/util/error.go similarity index 100% rename from cmd/api/util/error.go rename to core/api/util/error.go diff --git a/cmd/api/util/util.go b/core/api/util/util.go similarity index 100% rename from cmd/api/util/util.go rename to core/api/util/util.go From 987f14bb85ee51a1bd17aa561d9dae880df2df46 Mon Sep 17 00:00:00 2001 From: Jannis Metrikat <120120832+jmetrikat@users.noreply.github.com> Date: Sun, 12 Jan 2025 00:28:48 +0100 Subject: [PATCH 095/195] GO-4459: Fix lint --- cmd/grpcserver/grpc.go | 2 +- core/api/object/service.go | 8 ++++---- core/api/service.go | 34 +++++++++++++++++----------------- 3 files changed, 22 insertions(+), 22 deletions(-) diff --git a/cmd/grpcserver/grpc.go b/cmd/grpcserver/grpc.go index 987f6d1c9..d9e421a98 100644 --- a/cmd/grpcserver/grpc.go +++ b/cmd/grpcserver/grpc.go @@ -247,7 +247,7 @@ func main() { } } - // run rest api server + // pass mw to api service api.SetMiddlewareParams(mw) for { diff --git a/core/api/object/service.go b/core/api/object/service.go index e5f459687..f8f0c651e 100644 --- a/core/api/object/service.go +++ b/core/api/object/service.go @@ -204,7 +204,7 @@ func (s *ObjectService) CreateObject(ctx context.Context, spaceId string, reques }) if relAddFeatResp.Error.Code != pb.RpcObjectRelationAddFeaturedResponseError_NULL { - object, _ := s.GetObject(ctx, spaceId, resp.ObjectId) + object, _ := s.GetObject(ctx, spaceId, resp.ObjectId) // nolint:errcheck return object, ErrFailedSetRelationFeatured } } @@ -217,7 +217,7 @@ func (s *ObjectService) CreateObject(ctx context.Context, spaceId string, reques }) if bookmarkResp.Error.Code != pb.RpcObjectBookmarkFetchResponseError_NULL { - object, _ := s.GetObject(ctx, spaceId, resp.ObjectId) + object, _ := s.GetObject(ctx, spaceId, resp.ObjectId) // nolint:errcheck return object, ErrFailedFetchBookmark } } @@ -247,7 +247,7 @@ func (s *ObjectService) CreateObject(ctx context.Context, spaceId string, reques }) if blockCreateResp.Error.Code != pb.RpcBlockCreateResponseError_NULL { - object, _ := s.GetObject(ctx, spaceId, resp.ObjectId) + object, _ := s.GetObject(ctx, spaceId, resp.ObjectId) // nolint:errcheck return object, ErrFailedCreateObject } @@ -258,7 +258,7 @@ func (s *ObjectService) CreateObject(ctx context.Context, spaceId string, reques }) if blockPasteResp.Error.Code != pb.RpcBlockPasteResponseError_NULL { - object, _ := s.GetObject(ctx, spaceId, resp.ObjectId) + object, _ := s.GetObject(ctx, spaceId, resp.ObjectId) // nolint:errcheck return object, ErrFailedPasteBody } } diff --git a/core/api/service.go b/core/api/service.go index 21715d6cf..d7b1d1507 100644 --- a/core/api/service.go +++ b/core/api/service.go @@ -10,7 +10,6 @@ import ( "github.com/anyproto/anytype-heart/core/api/server" "github.com/anyproto/anytype-heart/pb/service" - "github.com/anyproto/anytype-heart/pkg/lib/logging" ) const ( @@ -20,8 +19,7 @@ const ( ) var ( - logger = logging.Logger(CName) - mwSrv service.ClientCommandsServer + mwSrv service.ClientCommandsServer ) type Api interface { @@ -44,20 +42,22 @@ func (s *apiService) Name() (name string) { return CName } -// @title Anytype API -// @version 1.0 -// @description This API allows interaction with Anytype resources such as spaces, objects, and object types. -// @termsOfService https://anytype.io/terms_of_use -// @contact.name Anytype Support -// @contact.url https://anytype.io/contact -// @contact.email support@anytype.io -// @license.name Any Source Available License 1.0 -// @license.url https://github.com/anyproto/anytype-ts/blob/main/LICENSE.md -// @host localhost:31009 -// @BasePath /v1 -// @securityDefinitions.basic BasicAuth -// @externalDocs.description OpenAPI -// @externalDocs.url https://swagger.io/resources/open-api/ +// Init initializes the API service. +// +// @title Anytype API +// @version 1.0 +// @description This API allows interaction with Anytype resources such as spaces, objects, and object types. +// @termsOfService https://anytype.io/terms_of_use +// @contact.name Anytype Support +// @contact.url https://anytype.io/contact +// @contact.email support@anytype.io +// @license.name Any Source Available License 1.0 +// @license.url https://github.com/anyproto/anytype-ts/blob/main/LICENSE.md +// @host localhost:31009 +// @BasePath /v1 +// @securityDefinitions.basic BasicAuth +// @externalDocs.description OpenAPI +// @externalDocs.url https://swagger.io/resources/open-api/ func (s *apiService) Init(a *app.App) (err error) { fmt.Println("Initializing API service...") From a019504b8f0ba6b2b60f93444092f41b08f9eee9 Mon Sep 17 00:00:00 2001 From: Jannis Metrikat <120120832+jmetrikat@users.noreply.github.com> Date: Sun, 12 Jan 2025 23:33:03 +0100 Subject: [PATCH 096/195] GO-4459: Remove mw internal interface --- .mockery.yaml | 5 +- core/core.go | 4 -- core/mock_core/mock_MiddlewareInternal.go | 83 ----------------------- 3 files changed, 1 insertion(+), 91 deletions(-) delete mode 100644 core/mock_core/mock_MiddlewareInternal.go diff --git a/.mockery.yaml b/.mockery.yaml index ecc47af3e..35990d91a 100644 --- a/.mockery.yaml +++ b/.mockery.yaml @@ -227,7 +227,4 @@ packages: Service: github.com/anyproto/anytype-heart/pb/service: interfaces: - ClientCommandsServer: - github.com/anyproto/anytype-heart/core: - interfaces: - MiddlewareInternal: \ No newline at end of file + ClientCommandsServer: \ No newline at end of file diff --git a/core/core.go b/core/core.go index 0a913d74c..394167770 100644 --- a/core/core.go +++ b/core/core.go @@ -23,10 +23,6 @@ var ( ErrNotLoggedIn = errors.New("not logged in") ) -type MiddlewareInternal interface { - GetApp() *app.App -} - type Middleware struct { applicationService *application.Service } diff --git a/core/mock_core/mock_MiddlewareInternal.go b/core/mock_core/mock_MiddlewareInternal.go deleted file mode 100644 index 33f1ca692..000000000 --- a/core/mock_core/mock_MiddlewareInternal.go +++ /dev/null @@ -1,83 +0,0 @@ -// Code generated by mockery. DO NOT EDIT. - -package mock_core - -import ( - app "github.com/anyproto/any-sync/app" - - mock "github.com/stretchr/testify/mock" -) - -// MockMiddlewareInternal is an autogenerated mock type for the MiddlewareInternal type -type MockMiddlewareInternal struct { - mock.Mock -} - -type MockMiddlewareInternal_Expecter struct { - mock *mock.Mock -} - -func (_m *MockMiddlewareInternal) EXPECT() *MockMiddlewareInternal_Expecter { - return &MockMiddlewareInternal_Expecter{mock: &_m.Mock} -} - -// GetApp provides a mock function with given fields: -func (_m *MockMiddlewareInternal) GetApp() *app.App { - ret := _m.Called() - - if len(ret) == 0 { - panic("no return value specified for GetApp") - } - - var r0 *app.App - if rf, ok := ret.Get(0).(func() *app.App); ok { - r0 = rf() - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*app.App) - } - } - - return r0 -} - -// MockMiddlewareInternal_GetApp_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetApp' -type MockMiddlewareInternal_GetApp_Call struct { - *mock.Call -} - -// GetApp is a helper method to define mock.On call -func (_e *MockMiddlewareInternal_Expecter) GetApp() *MockMiddlewareInternal_GetApp_Call { - return &MockMiddlewareInternal_GetApp_Call{Call: _e.mock.On("GetApp")} -} - -func (_c *MockMiddlewareInternal_GetApp_Call) Run(run func()) *MockMiddlewareInternal_GetApp_Call { - _c.Call.Run(func(args mock.Arguments) { - run() - }) - return _c -} - -func (_c *MockMiddlewareInternal_GetApp_Call) Return(_a0 *app.App) *MockMiddlewareInternal_GetApp_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockMiddlewareInternal_GetApp_Call) RunAndReturn(run func() *app.App) *MockMiddlewareInternal_GetApp_Call { - _c.Call.Return(run) - return _c -} - -// NewMockMiddlewareInternal creates a new instance of MockMiddlewareInternal. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. -// The first argument is typically a *testing.T value. -func NewMockMiddlewareInternal(t interface { - mock.TestingT - Cleanup(func()) -}) *MockMiddlewareInternal { - mock := &MockMiddlewareInternal{} - mock.Mock.Test(t) - - t.Cleanup(func() { mock.AssertExpectations(t) }) - - return mock -} From cca9d16c87098acbf42032c5aeec16922870c94e Mon Sep 17 00:00:00 2001 From: Jannis Metrikat <120120832+jmetrikat@users.noreply.github.com> Date: Tue, 14 Jan 2025 22:31:09 +0100 Subject: [PATCH 097/195] GO-4459: Move services --- core/api/demo/api_demo.go | 143 ------------------ core/api/server/router.go | 10 +- core/api/server/server.go | 10 +- core/api/{ => services}/auth/handler.go | 0 core/api/{ => services}/auth/model.go | 0 core/api/{ => services}/auth/service.go | 0 core/api/{ => services}/auth/service_test.go | 0 core/api/{ => services}/export/handler.go | 0 core/api/{ => services}/export/model.go | 0 core/api/{ => services}/export/service.go | 0 core/api/{ => services}/object/handler.go | 0 core/api/{ => services}/object/model.go | 0 core/api/{ => services}/object/service.go | 0 .../api/{ => services}/object/service_test.go | 0 core/api/{ => services}/search/handler.go | 2 +- core/api/{ => services}/search/service.go | 14 +- .../api/{ => services}/search/service_test.go | 10 +- core/api/{ => services}/space/handler.go | 0 core/api/{ => services}/space/model.go | 0 core/api/{ => services}/space/service.go | 0 core/api/{ => services}/space/service_test.go | 0 21 files changed, 23 insertions(+), 166 deletions(-) delete mode 100644 core/api/demo/api_demo.go rename core/api/{ => services}/auth/handler.go (100%) rename core/api/{ => services}/auth/model.go (100%) rename core/api/{ => services}/auth/service.go (100%) rename core/api/{ => services}/auth/service_test.go (100%) rename core/api/{ => services}/export/handler.go (100%) rename core/api/{ => services}/export/model.go (100%) rename core/api/{ => services}/export/service.go (100%) rename core/api/{ => services}/object/handler.go (100%) rename core/api/{ => services}/object/model.go (100%) rename core/api/{ => services}/object/service.go (100%) rename core/api/{ => services}/object/service_test.go (100%) rename core/api/{ => services}/search/handler.go (96%) rename core/api/{ => services}/search/service.go (94%) rename core/api/{ => services}/search/service_test.go (96%) rename core/api/{ => services}/space/handler.go (100%) rename core/api/{ => services}/space/model.go (100%) rename core/api/{ => services}/space/service.go (100%) rename core/api/{ => services}/space/service_test.go (100%) diff --git a/core/api/demo/api_demo.go b/core/api/demo/api_demo.go deleted file mode 100644 index 5901cd37c..000000000 --- a/core/api/demo/api_demo.go +++ /dev/null @@ -1,143 +0,0 @@ -package main - -import ( - "bytes" - "encoding/json" - "fmt" - "io" - "net/http" - "net/url" - "strings" - - "github.com/anyproto/anytype-heart/pkg/lib/logging" -) - -const ( - baseURL = "http://localhost:31009/v1" - // testSpaceId = "bafyreifymx5ucm3fdc7vupfg7wakdo5qelni3jvlmawlnvjcppurn2b3di.2lcu0r85yg10d" // dev (entry space) - // testSpaceId = "bafyreiezhzb4ggnhjwejmh67pd5grilk6jn3jt7y2rnfpbkjwekilreola.1t123w9f2lgn5" // LFLC - // testSpaceId = "bafyreiakofsfkgb7psju346cir2hit5hinhywaybi6vhp7hx4jw7hkngje.scoxzd7vu6rz" // HPI - // testObjectId = "bafyreidhtlbbspxecab6xf4pi5zyxcmvwy6lqzursbjouq5fxovh6y3xwu" // "Work Faster with Templates" - // testObjectId = "bafyreib3i5uq2tztocw3wrvhdugkwoxgg2xjh2jnl5retnyky66mr5b274" // Tag Test Page (in dev space) - // testTypeId = "bafyreie3djy4mcldt3hgeet6bnjay2iajdyi2fvx556n6wcxii7brlni3i" // Page (in dev space) - // chatSpaceId = "bafyreigryvrmerbtfswwz5kav2uq5dlvx3hl45kxn4nflg7lz46lneqs7m.2nvj2qik6ctdy" // Anytype Wiki space - // chatSpaceId = "bafyreiexhpzaf7uxzheubh7cjeusqukjnxfvvhh4at6bygljwvto2dttnm.2lcu0r85yg10d" // chat space -) - -var log = logging.Logger("rest-api") - -// ReplacePlaceholders replaces placeholders in the endpoint with actual values from parameters. -func ReplacePlaceholders(endpoint string, parameters map[string]interface{}) string { - for key, value := range parameters { - placeholder := fmt.Sprintf("{%s}", key) - encodedValue := url.QueryEscape(fmt.Sprintf("%v", value)) - endpoint = strings.ReplaceAll(endpoint, placeholder, encodedValue) - } - - // Parse the base URL + endpoint - u, err := url.Parse(baseURL + endpoint) - if err != nil { - log.Errorf("Failed to parse URL: %v\n", err) - return "" - } - - return u.String() -} - -func main() { - endpoints := []struct { - method string - endpoint string - parameters map[string]interface{} - body map[string]interface{} - }{ - // auth - // {"POST", "/auth/display_code", nil, nil}, - // {"POST", "/auth/token?challenge_id={challenge_id}&code={code}", map[string]interface{}{"challenge_id": "6738dfc5cda913aad90e8c2a", "code": "2931"}, nil}, - - // export - // {"GET", "/spaces/{space_id}/objects/{object_id}/export/{format}", map[string]interface{}{"space_id": testSpaceId, "object_id": testObjectId, "format": "markdown"}, nil}, - - // spaces - // {"POST", "/spaces", nil, map[string]interface{}{"name": "New Space"}}, - // {"GET", "/spaces?limit={limit}&offset={offset}", map[string]interface{}{"limit": 100, "offset": 0}, nil}, - // {"GET", "/spaces/{space_id}/members?limit={limit}&offset={offset}", map[string]interface{}{"space_id": testSpaceId, "limit": 100, "offset": 0}, nil}, - - // objects - // {"GET", "/spaces/{space_id}/objects?limit={limit}&offset={offset}", map[string]interface{}{"space_id": testSpaceId, "limit": 100, "offset": 0}, nil}, - // {"GET", "/spaces/{space_id}/objects/{object_id}", map[string]interface{}{"space_id": testSpaceId, "object_id": testObjectId}, nil}, - // {"DELETE", "/spaces/{space_id}/objects/{object_id}", map[string]interface{}{"space_id": "asd", "object_id": "asd"}, nil}, - // {"POST", "/spaces/{space_id}/objects", map[string]interface{}{"space_id": testSpaceId}, map[string]interface{}{"name": "New Object from demo", "icon": "💥", "template_id": "", "object_type_unique_key": "ot-page", "with_chat": false}}, - // {"PUT", "/spaces/{space_id}/objects/{object_id}", map[string]interface{}{"space_id": testSpaceId, "object_id": testObjectId}, map[string]interface{}{"name": "Updated Object"}}, - // {"GET", "/spaces/{space_id}/object_types?limit={limit}&offset={offset}", map[string]interface{}{"space_id": testSpaceId, "limit": 100, "offset": 0}, nil}, - // {"GET", "/spaces/{space_id}/object_types/{type_id}/templates?limit={limit}&offset={offset}", map[string]interface{}{"space_id": testSpaceId, "type_id": testTypeId, "limit": 100, "offset": 0}, nil}, - - // search - // {"GET", "/search?query={query}&object_types={object_types}&limit={limit}&offset={offset}", map[string]interface{}{"query": "new", "object_types": "", "limit": 100, "offset": 0}, nil}, - } - - for _, ep := range endpoints { - finalURL := ReplacePlaceholders(ep.endpoint, ep.parameters) - - var req *http.Request - var err error - - if ep.body != nil { - body, err := json.Marshal(ep.body) - if err != nil { - log.Errorf("Failed to marshal body for %s: %v\n", ep.endpoint, err) - continue - } - req, err = http.NewRequest(ep.method, finalURL, bytes.NewBuffer(body)) - if err != nil { - log.Errorf("Failed to create request for %s: %v\n", ep.endpoint, err) - } - req.Header.Set("Content-Type", "application/json") - } else { - req, err = http.NewRequest(ep.method, finalURL, nil) - } - - if err != nil { - log.Errorf("Failed to create request for %s: %v\n", ep.endpoint, err) - continue - } - - // Execute the HTTP request - client := &http.Client{} - resp, err := client.Do(req) - if err != nil { - log.Errorf("Failed to make request to %s: %v\n", finalURL, err.Error()) - continue - } - defer resp.Body.Close() - - // Check the status code - if resp.StatusCode != http.StatusOK { - body, err := io.ReadAll(resp.Body) - if err != nil { - log.Errorf("Failes to read response body for request to %s with code %d.", finalURL, resp.StatusCode) - continue - } - log.Errorf("Request to %s returned status code %d: %v\n", finalURL, resp.StatusCode, string(body)) - continue - } - - // Read the response - body, err := io.ReadAll(resp.Body) - if err != nil { - log.Errorf("Failed to read response body for %s: %v\n", ep.endpoint, err) - continue - } - - // Log the response - var prettyJSON bytes.Buffer - err = json.Indent(&prettyJSON, body, "", " ") - if err != nil { - log.Errorf("Failed to pretty print response body for %s: %v\n", ep.endpoint, err) - log.Infof("%s\n", string(body)) - continue - } - - log.Infof("Endpoint: %s, Status Code: %d, Body: %s\n", finalURL, resp.StatusCode, prettyJSON.String()) - } -} diff --git a/core/api/server/router.go b/core/api/server/router.go index 5fa9ad842..6ce14184d 100644 --- a/core/api/server/router.go +++ b/core/api/server/router.go @@ -6,12 +6,12 @@ import ( swaggerFiles "github.com/swaggo/files" ginSwagger "github.com/swaggo/gin-swagger" - "github.com/anyproto/anytype-heart/core/api/auth" - "github.com/anyproto/anytype-heart/core/api/export" - "github.com/anyproto/anytype-heart/core/api/object" "github.com/anyproto/anytype-heart/core/api/pagination" - "github.com/anyproto/anytype-heart/core/api/search" - "github.com/anyproto/anytype-heart/core/api/space" + "github.com/anyproto/anytype-heart/core/api/services/auth" + "github.com/anyproto/anytype-heart/core/api/services/export" + "github.com/anyproto/anytype-heart/core/api/services/object" + "github.com/anyproto/anytype-heart/core/api/services/search" + "github.com/anyproto/anytype-heart/core/api/services/space" ) // NewRouter builds and returns a *gin.Engine with all routes configured. diff --git a/core/api/server/server.go b/core/api/server/server.go index 3141fc2f1..578162f99 100644 --- a/core/api/server/server.go +++ b/core/api/server/server.go @@ -4,11 +4,11 @@ import ( "github.com/anyproto/any-sync/app" "github.com/gin-gonic/gin" - "github.com/anyproto/anytype-heart/core/api/auth" - "github.com/anyproto/anytype-heart/core/api/export" - "github.com/anyproto/anytype-heart/core/api/object" - "github.com/anyproto/anytype-heart/core/api/search" - "github.com/anyproto/anytype-heart/core/api/space" + "github.com/anyproto/anytype-heart/core/api/services/auth" + "github.com/anyproto/anytype-heart/core/api/services/export" + "github.com/anyproto/anytype-heart/core/api/services/object" + "github.com/anyproto/anytype-heart/core/api/services/search" + "github.com/anyproto/anytype-heart/core/api/services/space" "github.com/anyproto/anytype-heart/pb/service" ) diff --git a/core/api/auth/handler.go b/core/api/services/auth/handler.go similarity index 100% rename from core/api/auth/handler.go rename to core/api/services/auth/handler.go diff --git a/core/api/auth/model.go b/core/api/services/auth/model.go similarity index 100% rename from core/api/auth/model.go rename to core/api/services/auth/model.go diff --git a/core/api/auth/service.go b/core/api/services/auth/service.go similarity index 100% rename from core/api/auth/service.go rename to core/api/services/auth/service.go diff --git a/core/api/auth/service_test.go b/core/api/services/auth/service_test.go similarity index 100% rename from core/api/auth/service_test.go rename to core/api/services/auth/service_test.go diff --git a/core/api/export/handler.go b/core/api/services/export/handler.go similarity index 100% rename from core/api/export/handler.go rename to core/api/services/export/handler.go diff --git a/core/api/export/model.go b/core/api/services/export/model.go similarity index 100% rename from core/api/export/model.go rename to core/api/services/export/model.go diff --git a/core/api/export/service.go b/core/api/services/export/service.go similarity index 100% rename from core/api/export/service.go rename to core/api/services/export/service.go diff --git a/core/api/object/handler.go b/core/api/services/object/handler.go similarity index 100% rename from core/api/object/handler.go rename to core/api/services/object/handler.go diff --git a/core/api/object/model.go b/core/api/services/object/model.go similarity index 100% rename from core/api/object/model.go rename to core/api/services/object/model.go diff --git a/core/api/object/service.go b/core/api/services/object/service.go similarity index 100% rename from core/api/object/service.go rename to core/api/services/object/service.go diff --git a/core/api/object/service_test.go b/core/api/services/object/service_test.go similarity index 100% rename from core/api/object/service_test.go rename to core/api/services/object/service_test.go diff --git a/core/api/search/handler.go b/core/api/services/search/handler.go similarity index 96% rename from core/api/search/handler.go rename to core/api/services/search/handler.go index efa19b326..eb4528e94 100644 --- a/core/api/search/handler.go +++ b/core/api/services/search/handler.go @@ -6,7 +6,7 @@ import ( "github.com/gin-gonic/gin" "github.com/anyproto/anytype-heart/core/api/pagination" - "github.com/anyproto/anytype-heart/core/api/space" + "github.com/anyproto/anytype-heart/core/api/services/space" "github.com/anyproto/anytype-heart/core/api/util" ) diff --git a/core/api/search/service.go b/core/api/services/search/service.go similarity index 94% rename from core/api/search/service.go rename to core/api/services/search/service.go index 54ca8a4de..66fc04d55 100644 --- a/core/api/search/service.go +++ b/core/api/services/search/service.go @@ -6,9 +6,9 @@ import ( "sort" "strings" - object2 "github.com/anyproto/anytype-heart/core/api/object" "github.com/anyproto/anytype-heart/core/api/pagination" - "github.com/anyproto/anytype-heart/core/api/space" + "github.com/anyproto/anytype-heart/core/api/services/object" + "github.com/anyproto/anytype-heart/core/api/services/space" "github.com/anyproto/anytype-heart/core/api/util" "github.com/anyproto/anytype-heart/pb" "github.com/anyproto/anytype-heart/pb/service" @@ -23,22 +23,22 @@ var ( ) type Service interface { - Search(ctx context.Context, searchQuery string, objectTypes []string, offset, limit int) (objects []object2.Object, total int, hasMore bool, err error) + Search(ctx context.Context, searchQuery string, objectTypes []string, offset, limit int) (objects []object.Object, total int, hasMore bool, err error) } type SearchService struct { mw service.ClientCommandsServer spaceService *space.SpaceService - objectService *object2.ObjectService + objectService *object.ObjectService AccountInfo *model.AccountInfo } -func NewService(mw service.ClientCommandsServer, spaceService *space.SpaceService, objectService *object2.ObjectService) *SearchService { +func NewService(mw service.ClientCommandsServer, spaceService *space.SpaceService, objectService *object.ObjectService) *SearchService { return &SearchService{mw: mw, spaceService: spaceService, objectService: objectService} } // Search retrieves a paginated list of objects from all spaces that match the search parameters. -func (s *SearchService) Search(ctx context.Context, searchQuery string, objectTypes []string, offset, limit int) (objects []object2.Object, total int, hasMore bool, err error) { +func (s *SearchService) Search(ctx context.Context, searchQuery string, objectTypes []string, offset, limit int) (objects []object.Object, total int, hasMore bool, err error) { spaces, _, _, err := s.spaceService.ListSpaces(ctx, 0, 100) if err != nil { return nil, 0, false, err @@ -47,7 +47,7 @@ func (s *SearchService) Search(ctx context.Context, searchQuery string, objectTy baseFilters := s.prepareBaseFilters() queryFilters := s.prepareQueryFilter(searchQuery) - results := make([]object2.Object, 0) + results := make([]object.Object, 0) for _, space := range spaces { // Resolve object type IDs per space, as they are unique per space objectTypeFilters := s.prepareObjectTypeFilters(space.Id, objectTypes) diff --git a/core/api/search/service_test.go b/core/api/services/search/service_test.go similarity index 96% rename from core/api/search/service_test.go rename to core/api/services/search/service_test.go index eba17ef4d..fb6aaee6c 100644 --- a/core/api/search/service_test.go +++ b/core/api/services/search/service_test.go @@ -8,8 +8,8 @@ import ( "github.com/stretchr/testify/mock" "github.com/stretchr/testify/require" - object2 "github.com/anyproto/anytype-heart/core/api/object" - "github.com/anyproto/anytype-heart/core/api/space" + "github.com/anyproto/anytype-heart/core/api/services/object" + "github.com/anyproto/anytype-heart/core/api/services/space" "github.com/anyproto/anytype-heart/pb" "github.com/anyproto/anytype-heart/pb/service/mock_service" "github.com/anyproto/anytype-heart/pkg/lib/bundle" @@ -34,7 +34,7 @@ func newFixture(t *testing.T) *fixture { spaceService := space.NewService(mw) spaceService.AccountInfo = &model.AccountInfo{TechSpaceId: techSpaceId} - objectService := object2.NewService(mw) + objectService := object.NewService(mw) objectService.AccountInfo = &model.AccountInfo{TechSpaceId: techSpaceId} searchService := NewService(mw, spaceService, objectService) searchService.AccountInfo = &model.AccountInfo{ @@ -221,9 +221,9 @@ func TestSearchService_Search(t *testing.T) { } // check tags - tags := []object2.Tag{} + tags := []object.Tag{} for _, detail := range objects[0].Details { - if tagList, ok := detail.Details["tags"].([]object2.Tag); ok { + if tagList, ok := detail.Details["tags"].([]object.Tag); ok { for _, tag := range tagList { tags = append(tags, tag) } diff --git a/core/api/space/handler.go b/core/api/services/space/handler.go similarity index 100% rename from core/api/space/handler.go rename to core/api/services/space/handler.go diff --git a/core/api/space/model.go b/core/api/services/space/model.go similarity index 100% rename from core/api/space/model.go rename to core/api/services/space/model.go diff --git a/core/api/space/service.go b/core/api/services/space/service.go similarity index 100% rename from core/api/space/service.go rename to core/api/services/space/service.go diff --git a/core/api/space/service_test.go b/core/api/services/space/service_test.go similarity index 100% rename from core/api/space/service_test.go rename to core/api/services/space/service_test.go From 7000d44796b2c616cb44d316469963d56feeb7fc Mon Sep 17 00:00:00 2001 From: Jannis Metrikat <120120832+jmetrikat@users.noreply.github.com> Date: Tue, 14 Jan 2025 23:45:15 +0100 Subject: [PATCH 098/195] GO-4459: Add RPC to start and stop server --- clientlibrary/service/service.pb.go | 729 ++--- core/api/service.go | 77 +- docs/proto.md | 154 ++ pb/commands.pb.go | 3842 ++++++++++++++++++--------- pb/protos/commands.proto | 45 + pb/protos/service/service.proto | 4 + pb/service/service.pb.go | 729 ++--- 7 files changed, 3715 insertions(+), 1865 deletions(-) diff --git a/clientlibrary/service/service.pb.go b/clientlibrary/service/service.pb.go index 3cbe99da9..e57f17c9a 100644 --- a/clientlibrary/service/service.pb.go +++ b/clientlibrary/service/service.pb.go @@ -25,337 +25,340 @@ const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package func init() { proto.RegisterFile("pb/protos/service/service.proto", fileDescriptor_93a29dc403579097) } var fileDescriptor_93a29dc403579097 = []byte{ - // 5279 bytes of a gzipped FileDescriptorProto + // 5319 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x9d, 0x5b, 0x6f, 0x24, 0x49, - 0x56, 0xf8, 0xc7, 0x2f, 0xff, 0xf9, 0x93, 0xcb, 0x0e, 0x50, 0x03, 0xc3, 0xec, 0xb0, 0xdb, 0xb7, - 0xe9, 0xb6, 0xdd, 0x6d, 0xbb, 0xdc, 0xd3, 0x3d, 0x3d, 0xb3, 0xda, 0x45, 0x42, 0x6e, 0xbb, 0xed, - 0x31, 0x6b, 0xbb, 0x8d, 0xab, 0xdc, 0x2d, 0x8d, 0x84, 0x44, 0x38, 0x2b, 0x5c, 0x4e, 0x9c, 0x95, - 0x91, 0x9b, 0x19, 0x55, 0xee, 0x5a, 0x04, 0x02, 0x81, 0x40, 0x20, 0x10, 0x2b, 0x6e, 0xaf, 0x48, - 0x7c, 0x1a, 0x1e, 0xf7, 0x91, 0x47, 0x34, 0x23, 0x1e, 0xf8, 0x16, 0x28, 0x23, 0x23, 0xe3, 0x72, - 0xf2, 0x9c, 0xc8, 0xf4, 0x3e, 0x75, 0xab, 0xce, 0xef, 0x9c, 0x13, 0xd7, 0x13, 0x27, 0x22, 0x23, - 0xd3, 0xd1, 0xdd, 0xfc, 0x62, 0x3b, 0x2f, 0x84, 0x14, 0xe5, 0x76, 0xc9, 0x8b, 0x45, 0x12, 0xf3, - 0xe6, 0xdf, 0xa1, 0xfa, 0x79, 0xf0, 0x3e, 0xcb, 0x96, 0x72, 0x99, 0xf3, 0x4f, 0x3e, 0xb6, 0x64, - 0x2c, 0x66, 0x33, 0x96, 0x4d, 0xca, 0x1a, 0xf9, 0xe4, 0x23, 0x2b, 0xe1, 0x0b, 0x9e, 0x49, 0xfd, - 0xfb, 0xb3, 0xff, 0xf9, 0xdf, 0x95, 0xe8, 0x83, 0xdd, 0x34, 0xe1, 0x99, 0xdc, 0xd5, 0x1a, 0x83, - 0xaf, 0xa3, 0xef, 0xee, 0xe4, 0xf9, 0x01, 0x97, 0x6f, 0x78, 0x51, 0x26, 0x22, 0x1b, 0x7c, 0x3a, - 0xd4, 0x0e, 0x86, 0x67, 0x79, 0x3c, 0xdc, 0xc9, 0xf3, 0xa1, 0x15, 0x0e, 0xcf, 0xf8, 0x4f, 0xe7, - 0xbc, 0x94, 0x9f, 0x3c, 0x0c, 0x43, 0x65, 0x2e, 0xb2, 0x92, 0x0f, 0x2e, 0xa3, 0xdf, 0xd8, 0xc9, - 0xf3, 0x11, 0x97, 0x7b, 0xbc, 0xaa, 0xc0, 0x48, 0x32, 0xc9, 0x07, 0x6b, 0x2d, 0x55, 0x1f, 0x30, - 0x3e, 0xd6, 0xbb, 0x41, 0xed, 0x67, 0x1c, 0x7d, 0xa7, 0xf2, 0x73, 0x35, 0x97, 0x13, 0x71, 0x93, - 0x0d, 0xee, 0xb7, 0x15, 0xb5, 0xc8, 0xd8, 0x7e, 0x10, 0x42, 0xb4, 0xd5, 0xb7, 0xd1, 0xaf, 0xbe, + 0x56, 0xf8, 0xc7, 0x2f, 0xff, 0xf9, 0x93, 0xcb, 0x0e, 0x50, 0x03, 0xc3, 0xec, 0xb0, 0xdb, 0xdd, + 0xd3, 0x17, 0xdb, 0xdd, 0xb6, 0xcb, 0x3d, 0xdd, 0xd3, 0x33, 0xab, 0x5d, 0x24, 0xe4, 0xb6, 0xdb, + 0x1e, 0xb3, 0xb6, 0xdb, 0xb8, 0xca, 0xdd, 0xd2, 0x48, 0x48, 0x84, 0xb3, 0xc2, 0xe5, 0xc4, 0x59, + 0x19, 0xb9, 0x99, 0x51, 0xe5, 0xae, 0x45, 0x20, 0x10, 0x08, 0x04, 0x02, 0xb1, 0xe2, 0xf6, 0x0a, + 0xe2, 0xd3, 0xf0, 0xb8, 0x8f, 0x3c, 0xa2, 0x99, 0x47, 0xbe, 0x04, 0xca, 0xc8, 0xc8, 0xb8, 0x9c, + 0x3c, 0x27, 0x32, 0xbd, 0x4f, 0xdd, 0xf2, 0xf9, 0x9d, 0x73, 0xe2, 0x7a, 0xe2, 0x44, 0x64, 0x64, + 0x56, 0x74, 0x37, 0xbf, 0xd8, 0xce, 0x0b, 0x21, 0x45, 0xb9, 0x5d, 0xf2, 0x62, 0x91, 0xc4, 0xbc, + 0xf9, 0x77, 0xa8, 0xfe, 0x3c, 0x78, 0x9f, 0x65, 0x4b, 0xb9, 0xcc, 0xf9, 0x27, 0x1f, 0x5b, 0x32, + 0x16, 0xb3, 0x19, 0xcb, 0x26, 0x65, 0x8d, 0x7c, 0xf2, 0x91, 0x95, 0xf0, 0x05, 0xcf, 0xa4, 0xfe, + 0xfb, 0xb3, 0xff, 0xf8, 0xdf, 0x95, 0xe8, 0x83, 0xdd, 0x34, 0xe1, 0x99, 0xdc, 0xd5, 0x1a, 0x83, + 0xaf, 0xa3, 0xef, 0xee, 0xe4, 0xf9, 0x01, 0x97, 0x6f, 0x78, 0x51, 0x26, 0x22, 0x1b, 0x3c, 0x18, + 0x6a, 0x07, 0xc3, 0xb3, 0x3c, 0x1e, 0xee, 0xe4, 0xf9, 0xd0, 0x0a, 0x87, 0x67, 0xfc, 0xa7, 0x73, + 0x5e, 0xca, 0x4f, 0x1e, 0x86, 0xa1, 0x32, 0x17, 0x59, 0xc9, 0x07, 0x97, 0xd1, 0x6f, 0xec, 0xe4, + 0xf9, 0x88, 0xcb, 0x3d, 0x5e, 0x55, 0x60, 0x24, 0x99, 0xe4, 0x83, 0xb5, 0x96, 0xaa, 0x0f, 0x18, + 0x1f, 0xeb, 0xdd, 0xa0, 0xf6, 0x33, 0x8e, 0xbe, 0x53, 0xf9, 0xb9, 0x9a, 0xcb, 0x89, 0xb8, 0xc9, + 0x06, 0x9f, 0xb6, 0x15, 0xb5, 0xc8, 0xd8, 0xbe, 0x1f, 0x42, 0xb4, 0xd5, 0xb7, 0xd1, 0xaf, 0xbe, 0x65, 0x69, 0xca, 0xe5, 0x6e, 0xc1, 0xab, 0x82, 0xfb, 0x3a, 0xb5, 0x68, 0x58, 0xcb, 0x8c, 0xdd, - 0x4f, 0x83, 0x8c, 0x36, 0xfc, 0x75, 0xf4, 0xdd, 0x5a, 0x72, 0xc6, 0x63, 0xb1, 0xe0, 0xc5, 0x00, - 0xd5, 0xd2, 0x42, 0xa2, 0xc9, 0x5b, 0x10, 0xb4, 0xbd, 0x2b, 0xb2, 0x05, 0x2f, 0x24, 0x6e, 0x5b, - 0x0b, 0xc3, 0xb6, 0x2d, 0xa4, 0x6d, 0xff, 0xed, 0x4a, 0xf4, 0xfd, 0x9d, 0x38, 0x16, 0xf3, 0x4c, - 0x1e, 0x89, 0x98, 0xa5, 0x47, 0x49, 0x76, 0x7d, 0xc2, 0x6f, 0x76, 0xaf, 0x2a, 0x3e, 0x9b, 0xf2, - 0xc1, 0x73, 0xbf, 0x55, 0x6b, 0x74, 0x68, 0xd8, 0xa1, 0x0b, 0x1b, 0xdf, 0x9f, 0xdf, 0x4e, 0x49, - 0x97, 0xe5, 0x1f, 0x57, 0xa2, 0x3b, 0xb0, 0x2c, 0x23, 0x91, 0x2e, 0xb8, 0x2d, 0xcd, 0x8b, 0x0e, - 0xc3, 0x3e, 0x6e, 0xca, 0xf3, 0xc5, 0x6d, 0xd5, 0x74, 0x89, 0xd2, 0xe8, 0x43, 0x77, 0xb8, 0x8c, - 0x78, 0xa9, 0xa6, 0xd3, 0x63, 0x7a, 0x44, 0x68, 0xc4, 0x78, 0x7e, 0xd2, 0x07, 0xd5, 0xde, 0x92, - 0x68, 0xa0, 0xbd, 0xa5, 0xa2, 0x34, 0xce, 0xd6, 0x51, 0x0b, 0x0e, 0x61, 0x7c, 0x3d, 0xee, 0x41, - 0x6a, 0x57, 0x7f, 0x14, 0xfd, 0xda, 0x5b, 0x51, 0x5c, 0x97, 0x39, 0x8b, 0xb9, 0x9e, 0x0a, 0x8f, - 0x7c, 0xed, 0x46, 0x0a, 0x67, 0xc3, 0x6a, 0x17, 0xe6, 0x0c, 0xda, 0x46, 0xf8, 0x3a, 0xe7, 0x30, - 0x06, 0x59, 0xc5, 0x4a, 0x48, 0x0d, 0x5a, 0x08, 0x69, 0xdb, 0xd7, 0xd1, 0xc0, 0xda, 0xbe, 0xf8, - 0x63, 0x1e, 0xcb, 0x9d, 0xc9, 0x04, 0xf6, 0x8a, 0xd5, 0x55, 0xc4, 0x70, 0x67, 0x32, 0xa1, 0x7a, - 0x05, 0x47, 0xb5, 0xb3, 0x9b, 0xe8, 0x23, 0xe0, 0xec, 0x28, 0x29, 0x95, 0xc3, 0xad, 0xb0, 0x15, - 0x8d, 0x19, 0xa7, 0xc3, 0xbe, 0xb8, 0x76, 0xfc, 0xe7, 0x2b, 0xd1, 0xf7, 0x10, 0xcf, 0x67, 0x7c, - 0x26, 0x16, 0x7c, 0xf0, 0xb4, 0xdb, 0x5a, 0x4d, 0x1a, 0xff, 0x9f, 0xdd, 0x42, 0x03, 0x19, 0x26, - 0x23, 0x9e, 0xf2, 0x58, 0x92, 0xc3, 0xa4, 0x16, 0x77, 0x0e, 0x13, 0x83, 0x39, 0x33, 0xac, 0x11, - 0x1e, 0x70, 0xb9, 0x3b, 0x2f, 0x0a, 0x9e, 0x49, 0xb2, 0x2f, 0x2d, 0xd2, 0xd9, 0x97, 0x1e, 0x8a, - 0xd4, 0xe7, 0x80, 0xcb, 0x9d, 0x34, 0x25, 0xeb, 0x53, 0x8b, 0x3b, 0xeb, 0x63, 0x30, 0xed, 0x21, - 0x8e, 0x7e, 0xdd, 0x69, 0x31, 0x79, 0x98, 0x5d, 0x8a, 0x01, 0xdd, 0x16, 0x4a, 0x6e, 0x7c, 0xac, - 0x75, 0x72, 0x48, 0x35, 0x5e, 0xbd, 0xcb, 0x45, 0x41, 0x77, 0x4b, 0x2d, 0xee, 0xac, 0x86, 0xc1, - 0xb4, 0x87, 0x3f, 0x8c, 0x3e, 0xd0, 0x51, 0xb2, 0x59, 0xcf, 0x1e, 0xa2, 0x21, 0x14, 0x2e, 0x68, - 0x8f, 0x3a, 0x28, 0x1b, 0x1c, 0xb4, 0x4c, 0x07, 0x9f, 0x4f, 0x51, 0x3d, 0x10, 0x7a, 0x1e, 0x86, - 0xa1, 0x96, 0xed, 0x3d, 0x9e, 0x72, 0xd2, 0x76, 0x2d, 0xec, 0xb0, 0x6d, 0x20, 0x6d, 0xbb, 0x88, - 0x7e, 0xcb, 0x34, 0x4b, 0xb5, 0x8e, 0x2a, 0x79, 0x15, 0xa4, 0x37, 0x88, 0x7a, 0xbb, 0x90, 0xf1, - 0xb5, 0xd9, 0x0f, 0x6e, 0xd5, 0x47, 0xcf, 0x40, 0xbc, 0x3e, 0x60, 0xfe, 0x3d, 0x0c, 0x43, 0xda, - 0xf6, 0xdf, 0xad, 0x44, 0x3f, 0xd0, 0xb2, 0x57, 0x19, 0xbb, 0x48, 0xb9, 0x5a, 0x12, 0x4f, 0xb8, - 0xbc, 0x11, 0xc5, 0xf5, 0x68, 0x99, 0xc5, 0xc4, 0xf2, 0x8f, 0xc3, 0x1d, 0xcb, 0x3f, 0xa9, 0xe4, - 0x64, 0x7c, 0xba, 0xa2, 0x52, 0xe4, 0x30, 0xe3, 0x6b, 0x6a, 0x20, 0x45, 0x4e, 0x65, 0x7c, 0x3e, - 0xd2, 0xb2, 0x7a, 0x5c, 0x85, 0x4d, 0xdc, 0xea, 0xb1, 0x1b, 0x27, 0x1f, 0x84, 0x10, 0x1b, 0xb6, - 0x9a, 0x01, 0x2c, 0xb2, 0xcb, 0x64, 0x7a, 0x9e, 0x4f, 0xaa, 0x61, 0xfc, 0x18, 0x1f, 0xa1, 0x0e, - 0x42, 0x84, 0x2d, 0x02, 0xd5, 0xde, 0xfe, 0xc1, 0x26, 0x46, 0x7a, 0x2a, 0xed, 0x17, 0x62, 0x76, - 0xc4, 0xa7, 0x2c, 0x5e, 0xea, 0xf9, 0xff, 0x79, 0x68, 0xe2, 0x41, 0xda, 0x14, 0xe2, 0xc5, 0x2d, - 0xb5, 0x74, 0x79, 0xfe, 0x7d, 0x25, 0x7a, 0xd8, 0x54, 0xff, 0x8a, 0x65, 0x53, 0xae, 0xfb, 0xb3, - 0x2e, 0xfd, 0x4e, 0x36, 0x39, 0xe3, 0xa5, 0x64, 0x85, 0x1c, 0xfc, 0x08, 0xaf, 0x64, 0x48, 0xc7, - 0x94, 0xed, 0xc7, 0xbf, 0x94, 0xae, 0xed, 0xf5, 0x51, 0x15, 0xd8, 0x74, 0x08, 0xf0, 0x7b, 0x5d, - 0x49, 0x60, 0x00, 0x78, 0x10, 0x42, 0x6c, 0xaf, 0x2b, 0xc1, 0x61, 0xb6, 0x48, 0x24, 0x3f, 0xe0, - 0x19, 0x2f, 0xda, 0xbd, 0x5e, 0xab, 0xfa, 0x08, 0xd1, 0xeb, 0x04, 0x6a, 0x83, 0x8d, 0xe7, 0xcd, - 0x2c, 0x8e, 0x1b, 0x01, 0x23, 0xad, 0xe5, 0x71, 0xb3, 0x1f, 0x6c, 0x77, 0x77, 0x8e, 0xcf, 0x33, - 0xbe, 0x10, 0xd7, 0x70, 0x77, 0xe7, 0x9a, 0xa8, 0x01, 0x62, 0x77, 0x87, 0x82, 0x76, 0x05, 0x73, - 0xfc, 0xbc, 0x49, 0xf8, 0x0d, 0x58, 0xc1, 0x5c, 0xe5, 0x4a, 0x4c, 0xac, 0x60, 0x08, 0xa6, 0x3d, - 0x9c, 0x44, 0xbf, 0xa2, 0x84, 0xbf, 0x2f, 0x92, 0x6c, 0x70, 0x17, 0x51, 0xaa, 0x04, 0xc6, 0xea, - 0x3d, 0x1a, 0x00, 0x25, 0xae, 0x7e, 0xdd, 0x65, 0x59, 0xcc, 0x53, 0xb4, 0xc4, 0x56, 0x1c, 0x2c, - 0xb1, 0x87, 0xd9, 0xd4, 0x41, 0x09, 0xab, 0xf8, 0x35, 0xba, 0x62, 0x45, 0x92, 0x4d, 0x07, 0x98, - 0xae, 0x23, 0x27, 0x52, 0x07, 0x8c, 0x03, 0x43, 0x58, 0x2b, 0xee, 0xe4, 0x79, 0x51, 0x85, 0x45, - 0x6c, 0x08, 0xfb, 0x48, 0x70, 0x08, 0xb7, 0x50, 0xdc, 0xdb, 0x1e, 0x8f, 0xd3, 0x24, 0x0b, 0x7a, - 0xd3, 0x48, 0x1f, 0x6f, 0x16, 0x05, 0x83, 0xf7, 0x88, 0xb3, 0x05, 0x6f, 0x6a, 0x86, 0xb5, 0x8c, - 0x0b, 0x04, 0x07, 0x2f, 0x00, 0xed, 0x3e, 0x4d, 0x89, 0x8f, 0xd9, 0x35, 0xaf, 0x1a, 0x98, 0x57, - 0xeb, 0xda, 0x00, 0xd3, 0xf7, 0x08, 0x62, 0x9f, 0x86, 0x93, 0xda, 0xd5, 0x3c, 0xfa, 0x48, 0xc9, - 0x4f, 0x59, 0x21, 0x93, 0x38, 0xc9, 0x59, 0xd6, 0xe4, 0xff, 0xd8, 0xbc, 0x6e, 0x51, 0xc6, 0xe5, - 0x56, 0x4f, 0x5a, 0xbb, 0xfd, 0xb7, 0x95, 0xe8, 0x3e, 0xf4, 0x7b, 0xca, 0x8b, 0x59, 0xa2, 0xb6, + 0x07, 0x41, 0x46, 0x1b, 0xfe, 0x3a, 0xfa, 0x6e, 0x2d, 0x39, 0xe3, 0xb1, 0x58, 0xf0, 0x62, 0x80, + 0x6a, 0x69, 0x21, 0xd1, 0xe4, 0x2d, 0x08, 0xda, 0xde, 0x15, 0xd9, 0x82, 0x17, 0x12, 0xb7, 0xad, + 0x85, 0x61, 0xdb, 0x16, 0xd2, 0xb6, 0xff, 0x76, 0x25, 0xfa, 0xfe, 0x4e, 0x1c, 0x8b, 0x79, 0x26, + 0x8f, 0x44, 0xcc, 0xd2, 0xa3, 0x24, 0xbb, 0x3e, 0xe1, 0x37, 0xbb, 0x57, 0x15, 0x9f, 0x4d, 0xf9, + 0xe0, 0xb9, 0xdf, 0xaa, 0x35, 0x3a, 0x34, 0xec, 0xd0, 0x85, 0x8d, 0xef, 0xcf, 0x6f, 0xa7, 0xa4, + 0xcb, 0xf2, 0x8f, 0x2b, 0xd1, 0x1d, 0x58, 0x96, 0x91, 0x48, 0x17, 0xdc, 0x96, 0xe6, 0x45, 0x87, + 0x61, 0x1f, 0x37, 0xe5, 0xf9, 0xe2, 0xb6, 0x6a, 0xba, 0x44, 0x69, 0xf4, 0xa1, 0x3b, 0x5c, 0x46, + 0xbc, 0x54, 0xd3, 0xe9, 0x31, 0x3d, 0x22, 0x34, 0x62, 0x3c, 0x3f, 0xe9, 0x83, 0x6a, 0x6f, 0x49, + 0x34, 0xd0, 0xde, 0x52, 0x51, 0x1a, 0x67, 0xeb, 0xa8, 0x05, 0x87, 0x30, 0xbe, 0x1e, 0xf7, 0x20, + 0xb5, 0xab, 0x3f, 0x8a, 0x7e, 0xed, 0xad, 0x28, 0xae, 0xcb, 0x9c, 0xc5, 0x5c, 0x4f, 0x85, 0x47, + 0xbe, 0x76, 0x23, 0x85, 0xb3, 0x61, 0xb5, 0x0b, 0x73, 0x06, 0x6d, 0x23, 0x7c, 0x9d, 0x73, 0x18, + 0x83, 0xac, 0x62, 0x25, 0xa4, 0x06, 0x2d, 0x84, 0xb4, 0xed, 0xeb, 0x68, 0x60, 0x6d, 0x5f, 0xfc, + 0x31, 0x8f, 0xe5, 0xce, 0x64, 0x02, 0x7b, 0xc5, 0xea, 0x2a, 0x62, 0xb8, 0x33, 0x99, 0x50, 0xbd, + 0x82, 0xa3, 0xda, 0xd9, 0x4d, 0xf4, 0x11, 0x70, 0x76, 0x94, 0x94, 0xca, 0xe1, 0x56, 0xd8, 0x8a, + 0xc6, 0x8c, 0xd3, 0x61, 0x5f, 0x5c, 0x3b, 0xfe, 0xf3, 0x95, 0xe8, 0x7b, 0x88, 0xe7, 0x33, 0x3e, + 0x13, 0x0b, 0x3e, 0x78, 0xda, 0x6d, 0xad, 0x26, 0x8d, 0xff, 0xcf, 0x6e, 0xa1, 0x81, 0x0c, 0x93, + 0x11, 0x4f, 0x79, 0x2c, 0xc9, 0x61, 0x52, 0x8b, 0x3b, 0x87, 0x89, 0xc1, 0x9c, 0x19, 0xd6, 0x08, + 0x0f, 0xb8, 0xdc, 0x9d, 0x17, 0x05, 0xcf, 0x24, 0xd9, 0x97, 0x16, 0xe9, 0xec, 0x4b, 0x0f, 0x45, + 0xea, 0x73, 0xc0, 0xe5, 0x4e, 0x9a, 0x92, 0xf5, 0xa9, 0xc5, 0x9d, 0xf5, 0x31, 0x98, 0xf6, 0x10, + 0x47, 0xbf, 0xee, 0xb4, 0x98, 0x3c, 0xcc, 0x2e, 0xc5, 0x80, 0x6e, 0x0b, 0x25, 0x37, 0x3e, 0xd6, + 0x3a, 0x39, 0xa4, 0x1a, 0xaf, 0xde, 0xe5, 0xa2, 0xa0, 0xbb, 0xa5, 0x16, 0x77, 0x56, 0xc3, 0x60, + 0xda, 0xc3, 0x1f, 0x46, 0x1f, 0xe8, 0x28, 0xd9, 0xac, 0x67, 0x0f, 0xd1, 0x10, 0x0a, 0x17, 0xb4, + 0x47, 0x1d, 0x94, 0x0d, 0x0e, 0x5a, 0xa6, 0x83, 0xcf, 0x03, 0x54, 0x0f, 0x84, 0x9e, 0x87, 0x61, + 0xa8, 0x65, 0x7b, 0x8f, 0xa7, 0x9c, 0xb4, 0x5d, 0x0b, 0x3b, 0x6c, 0x1b, 0x48, 0xdb, 0x2e, 0xa2, + 0xdf, 0x32, 0xcd, 0x52, 0xad, 0xa3, 0x4a, 0x5e, 0x05, 0xe9, 0x0d, 0xa2, 0xde, 0x2e, 0x64, 0x7c, + 0x6d, 0xf6, 0x83, 0x5b, 0xf5, 0xd1, 0x33, 0x10, 0xaf, 0x0f, 0x98, 0x7f, 0x0f, 0xc3, 0x90, 0xb6, + 0xfd, 0x77, 0x2b, 0xd1, 0x0f, 0xb4, 0xec, 0x55, 0xc6, 0x2e, 0x52, 0xae, 0x96, 0xc4, 0x13, 0x2e, + 0x6f, 0x44, 0x71, 0x3d, 0x5a, 0x66, 0x31, 0xb1, 0xfc, 0xe3, 0x70, 0xc7, 0xf2, 0x4f, 0x2a, 0x39, + 0x19, 0x9f, 0xae, 0xa8, 0x14, 0x39, 0xcc, 0xf8, 0x9a, 0x1a, 0x48, 0x91, 0x53, 0x19, 0x9f, 0x8f, + 0xb4, 0xac, 0x1e, 0x57, 0x61, 0x13, 0xb7, 0x7a, 0xec, 0xc6, 0xc9, 0xfb, 0x21, 0xc4, 0x86, 0xad, + 0x66, 0x00, 0x8b, 0xec, 0x32, 0x99, 0x9e, 0xe7, 0x93, 0x6a, 0x18, 0x3f, 0xc6, 0x47, 0xa8, 0x83, + 0x10, 0x61, 0x8b, 0x40, 0xb5, 0xb7, 0x7f, 0xb0, 0x89, 0x91, 0x9e, 0x4a, 0xfb, 0x85, 0x98, 0x1d, + 0xf1, 0x29, 0x8b, 0x97, 0x7a, 0xfe, 0x7f, 0x1e, 0x9a, 0x78, 0x90, 0x36, 0x85, 0x78, 0x71, 0x4b, + 0x2d, 0x5d, 0x9e, 0x7f, 0x5f, 0x89, 0x1e, 0x36, 0xd5, 0xbf, 0x62, 0xd9, 0x94, 0xeb, 0xfe, 0xac, + 0x4b, 0xbf, 0x93, 0x4d, 0xce, 0x78, 0x29, 0x59, 0x21, 0x07, 0x3f, 0xc2, 0x2b, 0x19, 0xd2, 0x31, + 0x65, 0xfb, 0xf1, 0x2f, 0xa5, 0x6b, 0x7b, 0x7d, 0x54, 0x05, 0x36, 0x1d, 0x02, 0xfc, 0x5e, 0x57, + 0x12, 0x18, 0x00, 0xee, 0x87, 0x10, 0xdb, 0xeb, 0x4a, 0x70, 0x98, 0x2d, 0x12, 0xc9, 0x0f, 0x78, + 0xc6, 0x8b, 0x76, 0xaf, 0xd7, 0xaa, 0x3e, 0x42, 0xf4, 0x3a, 0x81, 0xda, 0x60, 0xe3, 0x79, 0x33, + 0x8b, 0xe3, 0x46, 0xc0, 0x48, 0x6b, 0x79, 0xdc, 0xec, 0x07, 0xdb, 0xdd, 0x9d, 0xe3, 0xf3, 0x8c, + 0x2f, 0xc4, 0x35, 0xdc, 0xdd, 0xb9, 0x26, 0x6a, 0x80, 0xd8, 0xdd, 0xa1, 0xa0, 0x5d, 0xc1, 0x1c, + 0x3f, 0x6f, 0x12, 0x7e, 0x03, 0x56, 0x30, 0x57, 0xb9, 0x12, 0x13, 0x2b, 0x18, 0x82, 0x69, 0x0f, + 0x27, 0xd1, 0xaf, 0x28, 0xe1, 0xef, 0x8b, 0x24, 0x1b, 0xdc, 0x45, 0x94, 0x2a, 0x81, 0xb1, 0x7a, + 0x8f, 0x06, 0x40, 0x89, 0xab, 0xbf, 0xee, 0xb2, 0x2c, 0xe6, 0x29, 0x5a, 0x62, 0x2b, 0x0e, 0x96, + 0xd8, 0xc3, 0x6c, 0xea, 0xa0, 0x84, 0x55, 0xfc, 0x1a, 0x5d, 0xb1, 0x22, 0xc9, 0xa6, 0x03, 0x4c, + 0xd7, 0x91, 0x13, 0xa9, 0x03, 0xc6, 0x81, 0x21, 0xac, 0x15, 0x77, 0xf2, 0xbc, 0xa8, 0xc2, 0x22, + 0x36, 0x84, 0x7d, 0x24, 0x38, 0x84, 0x5b, 0x28, 0xee, 0x6d, 0x8f, 0xc7, 0x69, 0x92, 0x05, 0xbd, + 0x69, 0xa4, 0x8f, 0x37, 0x8b, 0x82, 0xc1, 0x7b, 0xc4, 0xd9, 0x82, 0x37, 0x35, 0xc3, 0x5a, 0xc6, + 0x05, 0x82, 0x83, 0x17, 0x80, 0x76, 0x9f, 0xa6, 0xc4, 0xc7, 0xec, 0x9a, 0x57, 0x0d, 0xcc, 0xab, + 0x75, 0x6d, 0x80, 0xe9, 0x7b, 0x04, 0xb1, 0x4f, 0xc3, 0x49, 0xed, 0x6a, 0x1e, 0x7d, 0xa4, 0xe4, + 0xa7, 0xac, 0x90, 0x49, 0x9c, 0xe4, 0x2c, 0x6b, 0xf2, 0x7f, 0x6c, 0x5e, 0xb7, 0x28, 0xe3, 0x72, + 0xab, 0x27, 0xad, 0xdd, 0xfe, 0xdb, 0x4a, 0xf4, 0x29, 0xf4, 0x7b, 0xca, 0x8b, 0x59, 0xa2, 0xb6, 0x91, 0x65, 0x1d, 0x84, 0x07, 0x5f, 0x86, 0x8d, 0xb6, 0x14, 0x4c, 0x69, 0x7e, 0x78, 0x7b, 0x45, 0x9b, 0x0c, 0x8d, 0x74, 0x6a, 0xfd, 0xba, 0x98, 0xb4, 0x8e, 0x59, 0x46, 0x4d, 0xbe, 0xac, 0x84, 0x44, 0x32, 0xd4, 0x82, 0xc0, 0x0c, 0x3f, 0xcf, 0xca, 0xc6, 0x3a, 0x36, 0xc3, 0xad, 0x38, 0x38, 0xc3, 0x3d, 0x4c, 0x7b, 0xf8, 0x83, 0x28, 0xaa, 0x37, 0x5b, 0x6a, 0x43, 0xec, 0xc7, 0x1c, 0xbd, - 0x0b, 0xf3, 0x76, 0xc3, 0xf7, 0x03, 0x84, 0x5d, 0xe8, 0xea, 0xdf, 0xd5, 0x3e, 0x7f, 0x80, 0x6a, - 0x28, 0x11, 0xb1, 0xd0, 0x01, 0x04, 0x16, 0x74, 0x74, 0x25, 0x6e, 0xf0, 0x82, 0x56, 0x92, 0x70, - 0x41, 0x35, 0x61, 0x4f, 0xde, 0x74, 0x41, 0xb1, 0x93, 0xb7, 0xa6, 0x18, 0xa1, 0x93, 0x37, 0xc8, - 0x68, 0xc3, 0x22, 0xfa, 0x4d, 0xd7, 0xf0, 0x4b, 0x21, 0xae, 0x67, 0xac, 0xb8, 0x1e, 0x3c, 0xa1, - 0x95, 0x1b, 0xc6, 0x38, 0xda, 0xe8, 0xc5, 0xda, 0xa0, 0xe6, 0x3a, 0xac, 0xd2, 0xa4, 0xf3, 0x22, - 0x05, 0x41, 0xcd, 0xb3, 0xa1, 0x11, 0x22, 0xa8, 0x11, 0xa8, 0x1d, 0x95, 0xae, 0xb7, 0x11, 0x87, - 0x7b, 0x3d, 0x4f, 0x7d, 0xc4, 0xa9, 0xbd, 0x1e, 0x82, 0xc1, 0x21, 0x74, 0x50, 0xb0, 0xfc, 0x0a, - 0x1f, 0x42, 0x4a, 0x14, 0x1e, 0x42, 0x0d, 0x02, 0xfb, 0x7b, 0xc4, 0x59, 0x11, 0x5f, 0xe1, 0xfd, - 0x5d, 0xcb, 0xc2, 0xfd, 0x6d, 0x18, 0xd8, 0xdf, 0xb5, 0xe0, 0x6d, 0x22, 0xaf, 0x8e, 0xb9, 0x64, - 0x78, 0x7f, 0xfb, 0x4c, 0xb8, 0xbf, 0x5b, 0xac, 0xcd, 0xc3, 0x5c, 0x87, 0xa3, 0xf9, 0x45, 0x19, - 0x17, 0xc9, 0x05, 0x1f, 0x04, 0xac, 0x18, 0x88, 0xc8, 0xc3, 0x48, 0x58, 0xfb, 0xfc, 0xf9, 0x4a, - 0x74, 0xb7, 0xe9, 0x76, 0x51, 0x96, 0x3a, 0xe6, 0xf9, 0xee, 0x5f, 0xe0, 0xfd, 0x4b, 0xe0, 0xc4, - 0x59, 0x68, 0x0f, 0x35, 0x67, 0x4d, 0xc0, 0x8b, 0x74, 0x9e, 0x95, 0xa6, 0x50, 0x5f, 0xf6, 0xb1, - 0xee, 0x28, 0x10, 0x6b, 0x42, 0x2f, 0x45, 0xbb, 0x1c, 0xeb, 0xfe, 0x69, 0x64, 0x87, 0x93, 0x12, - 0x2c, 0xc7, 0x4d, 0x7b, 0x3b, 0x04, 0xb1, 0x1c, 0xe3, 0x24, 0x1c, 0x0a, 0x07, 0x85, 0x98, 0xe7, - 0x65, 0xc7, 0x50, 0x00, 0x50, 0x78, 0x28, 0xb4, 0x61, 0xed, 0xf3, 0x5d, 0xf4, 0xdb, 0xee, 0xf0, - 0x73, 0x1b, 0x7b, 0x8b, 0x1e, 0x53, 0x58, 0x13, 0x0f, 0xfb, 0xe2, 0x36, 0x21, 0x6d, 0x3c, 0xcb, - 0x3d, 0x2e, 0x59, 0x92, 0x96, 0x83, 0x55, 0xdc, 0x46, 0x23, 0x27, 0x12, 0x52, 0x8c, 0x83, 0xf1, - 0x6d, 0x6f, 0x9e, 0xa7, 0x49, 0xdc, 0x3e, 0x89, 0xd6, 0xba, 0x46, 0x1c, 0x8e, 0x6f, 0x2e, 0x06, - 0xe3, 0x75, 0xb5, 0xe4, 0xab, 0xff, 0x8c, 0x97, 0x39, 0xc7, 0xe3, 0xb5, 0x87, 0x84, 0xe3, 0x35, - 0x44, 0x61, 0x7d, 0x46, 0x5c, 0x1e, 0xb1, 0xa5, 0x98, 0x13, 0xf1, 0xda, 0x88, 0xc3, 0xf5, 0x71, - 0x31, 0x9b, 0x13, 0x1a, 0x0f, 0x87, 0x99, 0xe4, 0x45, 0xc6, 0xd2, 0xfd, 0x94, 0x4d, 0xcb, 0x01, - 0x11, 0x63, 0x7c, 0x8a, 0xc8, 0x09, 0x69, 0x1a, 0x69, 0xc6, 0xc3, 0x72, 0x9f, 0x2d, 0x44, 0x91, - 0x48, 0xba, 0x19, 0x2d, 0xd2, 0xd9, 0x8c, 0x1e, 0x8a, 0x7a, 0xdb, 0x29, 0xe2, 0xab, 0x64, 0xc1, - 0x27, 0x01, 0x6f, 0x0d, 0xd2, 0xc3, 0x9b, 0x83, 0x22, 0x9d, 0x36, 0x12, 0xf3, 0x22, 0xe6, 0x64, - 0xa7, 0xd5, 0xe2, 0xce, 0x4e, 0x33, 0x98, 0xf6, 0xf0, 0x57, 0x2b, 0xd1, 0xef, 0xd4, 0x52, 0xf7, - 0x78, 0x78, 0x8f, 0x95, 0x57, 0x17, 0x82, 0x15, 0x93, 0xc1, 0x67, 0x98, 0x1d, 0x14, 0x35, 0xae, - 0x9f, 0xdd, 0x46, 0x05, 0x36, 0xeb, 0x51, 0x52, 0x3a, 0x33, 0x0e, 0x6d, 0x56, 0x0f, 0x09, 0x37, - 0x2b, 0x44, 0x61, 0x00, 0x51, 0xf2, 0xfa, 0x28, 0x66, 0x95, 0xd4, 0xf7, 0xcf, 0x63, 0xd6, 0x3a, - 0x39, 0x18, 0x1f, 0x2b, 0xa1, 0x3f, 0x5a, 0xb6, 0x28, 0x1b, 0xf8, 0x88, 0x19, 0xf6, 0xc5, 0x49, - 0xcf, 0x66, 0x56, 0x84, 0x3d, 0xb7, 0x66, 0xc6, 0xb0, 0x2f, 0x4e, 0x78, 0x76, 0xc2, 0x5a, 0xc8, - 0x33, 0x12, 0xda, 0x86, 0x7d, 0x71, 0x98, 0x7d, 0x69, 0xa6, 0x59, 0x17, 0x9e, 0x04, 0xec, 0xc0, - 0xb5, 0x61, 0xa3, 0x17, 0xab, 0x1d, 0xfe, 0xcd, 0x4a, 0xf4, 0x7d, 0xeb, 0xf1, 0x58, 0x4c, 0x92, - 0xcb, 0x65, 0x0d, 0xbd, 0x61, 0xe9, 0x9c, 0x97, 0x83, 0x67, 0x94, 0xb5, 0x36, 0x6b, 0x4a, 0xf0, - 0xfc, 0x56, 0x3a, 0x70, 0xee, 0xec, 0xe4, 0x79, 0xba, 0x1c, 0xf3, 0x59, 0x9e, 0x92, 0x73, 0xc7, - 0x43, 0xc2, 0x73, 0x07, 0xa2, 0x30, 0x2b, 0x1f, 0x8b, 0x2a, 0xe7, 0x47, 0xb3, 0x72, 0x25, 0x0a, - 0x67, 0xe5, 0x0d, 0x02, 0x73, 0xa5, 0xb1, 0xd8, 0x15, 0x69, 0xca, 0x63, 0xd9, 0x7e, 0xc4, 0x6c, - 0x34, 0x2d, 0x11, 0xce, 0x95, 0x00, 0x69, 0x4f, 0x63, 0x9a, 0x3d, 0x24, 0x2b, 0xf8, 0xcb, 0xe5, - 0x51, 0x92, 0x5d, 0x0f, 0xf0, 0xb4, 0xc0, 0x02, 0xc4, 0x69, 0x0c, 0x0a, 0xc2, 0xbd, 0xea, 0x79, - 0x36, 0x11, 0xf8, 0x5e, 0xb5, 0x92, 0x84, 0xf7, 0xaa, 0x9a, 0x80, 0x26, 0xcf, 0x38, 0x65, 0xb2, - 0x92, 0x84, 0x4d, 0x6a, 0x02, 0x0b, 0x85, 0xfa, 0xcc, 0x9e, 0x0c, 0x85, 0xe0, 0x94, 0x7e, 0xad, - 0x93, 0x83, 0x23, 0xb4, 0xd9, 0xb4, 0xee, 0x73, 0x19, 0x5f, 0xe1, 0x23, 0xd4, 0x43, 0xc2, 0x23, - 0x14, 0xa2, 0xb0, 0x4a, 0x63, 0x61, 0x36, 0xdd, 0xab, 0xf8, 0xf8, 0x68, 0x6d, 0xb8, 0xd7, 0x3a, - 0x39, 0xb8, 0x8d, 0x3c, 0x9c, 0xa9, 0x36, 0x43, 0x07, 0x79, 0x2d, 0x0b, 0x6f, 0x23, 0x0d, 0x03, - 0x4b, 0x5f, 0x0b, 0xaa, 0xe6, 0xc4, 0x4b, 0x6f, 0xe5, 0xe1, 0xd2, 0x7b, 0x9c, 0x76, 0xf2, 0x2f, - 0x66, 0x1b, 0x57, 0x4b, 0x4f, 0x44, 0x35, 0x47, 0xde, 0xb0, 0x34, 0x99, 0x30, 0xc9, 0xc7, 0xe2, - 0x9a, 0x67, 0xf8, 0x8e, 0x49, 0x97, 0xb6, 0xe6, 0x87, 0x9e, 0x42, 0x78, 0xc7, 0x14, 0x56, 0x84, - 0xe3, 0xa4, 0xa6, 0xcf, 0x4b, 0xbe, 0xcb, 0x4a, 0x22, 0x92, 0x79, 0x48, 0x78, 0x9c, 0x40, 0x14, - 0xe6, 0xab, 0xb5, 0xfc, 0xd5, 0xbb, 0x9c, 0x17, 0x09, 0xcf, 0x62, 0x8e, 0xe7, 0xab, 0x90, 0x0a, - 0xe7, 0xab, 0x08, 0x0d, 0xf7, 0x6a, 0x7b, 0x4c, 0xf2, 0x97, 0xcb, 0x71, 0x32, 0xe3, 0xa5, 0x64, - 0xb3, 0x1c, 0xdf, 0xab, 0x01, 0x28, 0xbc, 0x57, 0x6b, 0xc3, 0xad, 0xa3, 0x21, 0x13, 0x10, 0xdb, - 0x37, 0x53, 0x20, 0x11, 0xb8, 0x99, 0x42, 0xa0, 0xb0, 0x61, 0x2d, 0x80, 0x1e, 0x0e, 0xb7, 0xac, - 0x04, 0x0f, 0x87, 0x69, 0xba, 0x75, 0xe0, 0x66, 0x98, 0x51, 0x35, 0x35, 0x3b, 0x8a, 0x3e, 0x72, - 0xa7, 0xe8, 0x46, 0x2f, 0x16, 0x3f, 0xe1, 0x3b, 0xe3, 0x29, 0x53, 0xcb, 0x56, 0xe0, 0x18, 0xad, - 0x61, 0xfa, 0x9c, 0xf0, 0x39, 0xac, 0x76, 0xf8, 0x17, 0x2b, 0xd1, 0x27, 0x98, 0xc7, 0xd7, 0xb9, - 0xf2, 0xfb, 0xb4, 0xdb, 0x56, 0x4d, 0x12, 0x57, 0x6f, 0xc2, 0x1a, 0xba, 0x0c, 0x7f, 0x12, 0x7d, - 0xdc, 0x88, 0xec, 0xcd, 0x1c, 0x5d, 0x00, 0x3f, 0x69, 0x33, 0xe5, 0x87, 0x9c, 0x71, 0xbf, 0xdd, - 0x9b, 0xb7, 0xfb, 0x21, 0xbf, 0x5c, 0x25, 0xd8, 0x0f, 0x19, 0x1b, 0x5a, 0x4c, 0xec, 0x87, 0x10, - 0xcc, 0xce, 0x4e, 0xb7, 0x7a, 0x6f, 0x13, 0x79, 0xa5, 0xf2, 0x2d, 0x30, 0x3b, 0xbd, 0xb2, 0x1a, - 0x88, 0x98, 0x9d, 0x24, 0x0c, 0x33, 0x92, 0x06, 0xac, 0xe6, 0x26, 0x16, 0xcb, 0x8d, 0x21, 0x77, - 0x66, 0xae, 0x77, 0x83, 0x70, 0xbc, 0x36, 0x62, 0xbd, 0xf5, 0x79, 0x12, 0xb2, 0x00, 0xb6, 0x3f, - 0x1b, 0xbd, 0x58, 0xed, 0xf0, 0xcf, 0xa2, 0xef, 0xb5, 0x2a, 0xb6, 0xcf, 0x99, 0x9c, 0x17, 0x7c, - 0x32, 0xd8, 0xee, 0x28, 0x77, 0x03, 0x1a, 0xd7, 0x4f, 0xfb, 0x2b, 0xb4, 0x72, 0xf4, 0x86, 0xab, - 0x87, 0x95, 0x29, 0xc3, 0xb3, 0x90, 0x49, 0x9f, 0x0d, 0xe6, 0xe8, 0xb4, 0x4e, 0x6b, 0x9b, 0xed, - 0x8e, 0xae, 0x9d, 0x05, 0x4b, 0x52, 0xf5, 0x90, 0xee, 0xb3, 0x90, 0x51, 0x0f, 0x0d, 0x6e, 0xb3, - 0x49, 0x95, 0x56, 0x64, 0x56, 0x73, 0xdc, 0xd9, 0x9e, 0x6d, 0xd2, 0x91, 0x00, 0xd9, 0x9d, 0x6d, - 0xf5, 0xa4, 0xb5, 0x5b, 0xd9, 0x2c, 0x79, 0xd5, 0xcf, 0xee, 0x20, 0xc7, 0xbc, 0x6a, 0x55, 0x64, - 0xa4, 0x6f, 0xf5, 0xa4, 0xb5, 0xd7, 0x3f, 0x8d, 0x3e, 0x6e, 0x7b, 0xd5, 0x0b, 0xd1, 0x76, 0xa7, - 0x29, 0xb0, 0x16, 0x3d, 0xed, 0xaf, 0x60, 0xb7, 0x34, 0x5f, 0x25, 0xa5, 0x14, 0xc5, 0x72, 0x74, - 0x25, 0x6e, 0x9a, 0x1b, 0xef, 0xfe, 0x6c, 0xd5, 0xc0, 0xd0, 0x21, 0x88, 0x2d, 0x0d, 0x4e, 0xb6, - 0x5c, 0xd9, 0x9b, 0xf1, 0x25, 0xe1, 0xca, 0x21, 0x3a, 0x5c, 0xf9, 0xa4, 0x8d, 0x55, 0x4d, 0xad, - 0xec, 0x35, 0xfe, 0x35, 0xbc, 0xa8, 0xed, 0xab, 0xfc, 0xeb, 0xdd, 0xa0, 0xcd, 0x58, 0xb4, 0x78, - 0x2f, 0xb9, 0xbc, 0x34, 0x75, 0xc2, 0x4b, 0xea, 0x22, 0x44, 0xc6, 0x42, 0xa0, 0x36, 0xe9, 0xde, - 0x4f, 0x52, 0xae, 0x4e, 0xf4, 0x5f, 0x5f, 0x5e, 0xa6, 0x82, 0x4d, 0x40, 0xd2, 0x5d, 0x89, 0x87, - 0xae, 0x9c, 0x48, 0xba, 0x31, 0xce, 0x3e, 0x23, 0xae, 0xa4, 0x67, 0x3c, 0x16, 0x59, 0x9c, 0xa4, - 0xf0, 0x02, 0xa0, 0xd2, 0x34, 0x42, 0xe2, 0x19, 0x71, 0x0b, 0xb2, 0x0b, 0x63, 0x25, 0xaa, 0xa6, - 0x7d, 0x53, 0xfe, 0x47, 0x6d, 0x45, 0x47, 0x4c, 0x2c, 0x8c, 0x08, 0x66, 0xf7, 0x9e, 0x95, 0xf0, - 0x3c, 0x57, 0xc6, 0xef, 0xb5, 0xb5, 0x6a, 0x09, 0xb1, 0xf7, 0xf4, 0x09, 0xbb, 0x87, 0xaa, 0x7e, - 0xdf, 0x13, 0x37, 0x99, 0x32, 0xfa, 0xa0, 0xad, 0xd2, 0xc8, 0x88, 0x3d, 0x14, 0x64, 0xb4, 0xe1, - 0x9f, 0x44, 0xff, 0x5f, 0x19, 0x2e, 0x44, 0x3e, 0xb8, 0x83, 0x28, 0x14, 0xce, 0x5d, 0xbd, 0xbb, - 0xa4, 0xdc, 0x5e, 0x39, 0x35, 0x63, 0xe3, 0xbc, 0x64, 0x53, 0x3e, 0x78, 0x48, 0xf4, 0xb8, 0x92, - 0x12, 0x57, 0x4e, 0xdb, 0x94, 0x3f, 0x2a, 0x4e, 0xc4, 0x44, 0x5b, 0x47, 0x6a, 0x68, 0x84, 0xa1, - 0x51, 0xe1, 0x42, 0x36, 0x99, 0x39, 0x61, 0x8b, 0x64, 0x6a, 0x16, 0x9c, 0x3a, 0x6e, 0x95, 0x20, - 0x99, 0xb1, 0xcc, 0xd0, 0x81, 0x88, 0x64, 0x86, 0x84, 0xb5, 0xcf, 0x7f, 0x5e, 0x89, 0xee, 0x59, - 0xe6, 0xa0, 0x39, 0xad, 0x3b, 0xcc, 0x2e, 0x45, 0x95, 0xfa, 0x1c, 0x25, 0xd9, 0x75, 0x39, 0xf8, - 0x82, 0x32, 0x89, 0xf3, 0xa6, 0x28, 0x5f, 0xde, 0x5a, 0xcf, 0x66, 0xad, 0xcd, 0x51, 0x96, 0x7d, - 0x9e, 0x5d, 0x6b, 0x80, 0xac, 0xd5, 0x9c, 0x78, 0x41, 0x8e, 0xc8, 0x5a, 0x43, 0xbc, 0xed, 0x62, - 0xe3, 0x3c, 0x15, 0x19, 0xec, 0x62, 0x6b, 0xa1, 0x12, 0x12, 0x5d, 0xdc, 0x82, 0x6c, 0x3c, 0x6e, - 0x44, 0xf5, 0xa9, 0xcb, 0x4e, 0x9a, 0x82, 0x78, 0x6c, 0x54, 0x0d, 0x40, 0xc4, 0x63, 0x14, 0xd4, - 0x7e, 0xce, 0xa2, 0xef, 0x54, 0x4d, 0x7a, 0x5a, 0xf0, 0x45, 0xc2, 0xe1, 0xd5, 0x0b, 0x47, 0x42, - 0xcc, 0x7f, 0x9f, 0xb0, 0x33, 0xeb, 0x3c, 0x2b, 0xf3, 0x94, 0x95, 0x57, 0xfa, 0x61, 0xbc, 0x5f, - 0xe7, 0x46, 0x08, 0x1f, 0xc7, 0x3f, 0xea, 0xa0, 0x6c, 0x50, 0x6f, 0x64, 0x26, 0xc4, 0xac, 0xe2, - 0xaa, 0xad, 0x30, 0xb3, 0xd6, 0xc9, 0xd9, 0x13, 0xef, 0x03, 0x96, 0xa6, 0xbc, 0x58, 0x36, 0xb2, - 0x63, 0x96, 0x25, 0x97, 0xbc, 0x94, 0xe0, 0xc4, 0x5b, 0x53, 0x43, 0x88, 0x11, 0x27, 0xde, 0x01, - 0xdc, 0x66, 0xf3, 0xc0, 0xf3, 0x61, 0x36, 0xe1, 0xef, 0x40, 0x36, 0x0f, 0xed, 0x28, 0x86, 0xc8, - 0xe6, 0x29, 0xd6, 0x9e, 0xfc, 0xbe, 0x4c, 0x45, 0x7c, 0xad, 0x97, 0x00, 0xbf, 0x83, 0x95, 0x04, - 0xae, 0x01, 0x0f, 0x42, 0x88, 0x5d, 0x04, 0x94, 0xe0, 0x8c, 0xe7, 0x29, 0x8b, 0xe1, 0xfd, 0x9b, - 0x5a, 0x47, 0xcb, 0x88, 0x45, 0x00, 0x32, 0xa0, 0xb8, 0xfa, 0x5e, 0x0f, 0x56, 0x5c, 0x70, 0xad, - 0xe7, 0x41, 0x08, 0xb1, 0xcb, 0xa0, 0x12, 0x8c, 0xf2, 0x34, 0x91, 0x60, 0x1a, 0xd4, 0x1a, 0x4a, - 0x42, 0x4c, 0x03, 0x9f, 0x00, 0x26, 0x8f, 0x79, 0x31, 0xe5, 0xa8, 0x49, 0x25, 0x09, 0x9a, 0x6c, - 0x08, 0x7b, 0xc9, 0xb4, 0xae, 0xbb, 0xc8, 0x97, 0xe0, 0x92, 0xa9, 0xae, 0x96, 0xc8, 0x97, 0xc4, - 0x25, 0x53, 0x0f, 0x00, 0x45, 0x3c, 0x65, 0xa5, 0xc4, 0x8b, 0xa8, 0x24, 0xc1, 0x22, 0x36, 0x84, - 0x5d, 0xa3, 0xeb, 0x22, 0xce, 0x25, 0x58, 0xa3, 0x75, 0x01, 0x9c, 0x27, 0xd0, 0x77, 0x49, 0xb9, - 0x8d, 0x24, 0x75, 0xaf, 0x70, 0xb9, 0x9f, 0xf0, 0x74, 0x52, 0x82, 0x48, 0xa2, 0xdb, 0xbd, 0x91, - 0x12, 0x91, 0xa4, 0x4d, 0x81, 0xa1, 0xa4, 0xcf, 0xc7, 0xb1, 0xda, 0x81, 0xa3, 0xf1, 0x07, 0x21, - 0xc4, 0xc6, 0xa7, 0xa6, 0xd0, 0xbb, 0xac, 0x28, 0x92, 0x6a, 0xf1, 0x5f, 0xc5, 0x0b, 0xd4, 0xc8, - 0x89, 0xf8, 0x84, 0x71, 0x60, 0x7a, 0x35, 0x81, 0x1b, 0x2b, 0x18, 0x0c, 0xdd, 0x9f, 0x06, 0x19, - 0x9b, 0x71, 0x2a, 0x89, 0xf3, 0x08, 0x15, 0x6b, 0x4d, 0xe4, 0x09, 0xea, 0x6a, 0x17, 0xe6, 0xbc, - 0x04, 0x62, 0x5c, 0x1c, 0x8b, 0x05, 0x1f, 0x8b, 0x57, 0xef, 0x92, 0x52, 0x26, 0xd9, 0x54, 0xaf, - 0xdc, 0xcf, 0x09, 0x4b, 0x18, 0x4c, 0xbc, 0x04, 0xd2, 0xa9, 0x64, 0x13, 0x08, 0x50, 0x96, 0x13, - 0x7e, 0x83, 0x26, 0x10, 0xd0, 0xa2, 0xe1, 0x88, 0x04, 0x22, 0xc4, 0xdb, 0x73, 0x14, 0xe3, 0x5c, - 0xbf, 0x29, 0x3b, 0x16, 0x4d, 0x2e, 0x47, 0x59, 0x83, 0x20, 0xb1, 0x95, 0x0d, 0x2a, 0xd8, 0xfd, - 0xa5, 0xf1, 0x6f, 0xa7, 0xd8, 0x3a, 0x61, 0xa7, 0x3d, 0xcd, 0x1e, 0xf7, 0x20, 0x11, 0x57, 0xf6, - 0x1e, 0x00, 0xe5, 0xaa, 0x7d, 0x0d, 0xe0, 0x71, 0x0f, 0xd2, 0x39, 0x93, 0x71, 0xab, 0xf5, 0x92, - 0xc5, 0xd7, 0xd3, 0x42, 0xcc, 0xb3, 0xc9, 0xae, 0x48, 0x45, 0x01, 0xce, 0x64, 0xbc, 0x52, 0x03, - 0x94, 0x38, 0x93, 0xe9, 0x50, 0xb1, 0x19, 0x9c, 0x5b, 0x8a, 0x9d, 0x34, 0x99, 0xc2, 0x1d, 0xb5, - 0x67, 0x48, 0x01, 0x44, 0x06, 0x87, 0x82, 0xc8, 0x20, 0xaa, 0x77, 0xdc, 0x32, 0x89, 0x59, 0x5a, - 0xfb, 0xdb, 0xa6, 0xcd, 0x78, 0x60, 0xe7, 0x20, 0x42, 0x14, 0x90, 0x7a, 0x8e, 0xe7, 0x45, 0x76, - 0x98, 0x49, 0x41, 0xd6, 0xb3, 0x01, 0x3a, 0xeb, 0xe9, 0x80, 0x20, 0xac, 0x8e, 0xf9, 0xbb, 0xaa, - 0x34, 0xd5, 0x3f, 0x58, 0x58, 0xad, 0x7e, 0x1f, 0x6a, 0x79, 0x28, 0xac, 0x02, 0x0e, 0x54, 0x46, - 0x3b, 0xa9, 0x07, 0x4c, 0x40, 0xdb, 0x1f, 0x26, 0xeb, 0xdd, 0x20, 0xee, 0x67, 0x24, 0x97, 0x29, - 0x0f, 0xf9, 0x51, 0x40, 0x1f, 0x3f, 0x0d, 0x68, 0x8f, 0x5b, 0xbc, 0xfa, 0x5c, 0xf1, 0xf8, 0xba, - 0x75, 0xad, 0xc9, 0x2f, 0x68, 0x8d, 0x10, 0xc7, 0x2d, 0x04, 0x8a, 0x77, 0xd1, 0x61, 0x2c, 0xb2, - 0x50, 0x17, 0x55, 0xf2, 0x3e, 0x5d, 0xa4, 0x39, 0xbb, 0xf9, 0x35, 0x52, 0x3d, 0x32, 0xeb, 0x6e, - 0xda, 0x20, 0x2c, 0xb8, 0x10, 0xb1, 0xf9, 0x25, 0x61, 0x9b, 0x93, 0x43, 0x9f, 0xc7, 0xed, 0x3b, - 0xdf, 0x2d, 0x2b, 0xc7, 0xf4, 0x9d, 0x6f, 0x8a, 0xa5, 0x2b, 0x59, 0x8f, 0x91, 0x0e, 0x2b, 0xfe, - 0x38, 0xd9, 0xec, 0x07, 0xdb, 0x2d, 0x8f, 0xe7, 0x73, 0x37, 0xe5, 0xac, 0xa8, 0xbd, 0x6e, 0x05, - 0x0c, 0x59, 0x8c, 0xd8, 0xf2, 0x04, 0x70, 0x10, 0xc2, 0x3c, 0xcf, 0xbb, 0x22, 0x93, 0x3c, 0x93, - 0x58, 0x08, 0xf3, 0x8d, 0x69, 0x30, 0x14, 0xc2, 0x28, 0x05, 0x30, 0x6e, 0xd5, 0x79, 0x10, 0x97, - 0x27, 0x6c, 0x86, 0x66, 0x6c, 0xf5, 0x59, 0x4f, 0x2d, 0x0f, 0x8d, 0x5b, 0xc0, 0x39, 0x0f, 0xf9, - 0x5c, 0x2f, 0x63, 0x56, 0x4c, 0xcd, 0xe9, 0xc6, 0x64, 0xf0, 0x94, 0xb6, 0xe3, 0x93, 0xc4, 0x43, - 0xbe, 0xb0, 0x06, 0x08, 0x3b, 0x87, 0x33, 0x36, 0x35, 0x35, 0x45, 0x6a, 0xa0, 0xe4, 0xad, 0xaa, - 0xae, 0x77, 0x83, 0xc0, 0xcf, 0x9b, 0x64, 0xc2, 0x45, 0xc0, 0x8f, 0x92, 0xf7, 0xf1, 0x03, 0x41, - 0x90, 0xbd, 0x55, 0xf5, 0xae, 0x77, 0x74, 0x3b, 0xd9, 0x44, 0xef, 0x63, 0x87, 0x44, 0xf3, 0x00, - 0x2e, 0x94, 0xbd, 0x11, 0x3c, 0x98, 0xa3, 0xcd, 0x01, 0x6d, 0x68, 0x8e, 0x9a, 0xf3, 0xd7, 0x3e, - 0x73, 0x14, 0x83, 0xb5, 0xcf, 0x9f, 0xe9, 0x39, 0xba, 0xc7, 0x24, 0xab, 0xf2, 0xf6, 0x37, 0x09, - 0xbf, 0xd1, 0x1b, 0x61, 0xa4, 0xbe, 0x0d, 0x35, 0x54, 0xaf, 0x2a, 0x82, 0x5d, 0xf1, 0x76, 0x6f, - 0x3e, 0xe0, 0x5b, 0xef, 0x10, 0x3a, 0x7d, 0x83, 0xad, 0xc2, 0x76, 0x6f, 0x3e, 0xe0, 0x5b, 0xbf, - 0x03, 0xdd, 0xe9, 0x1b, 0xbc, 0x08, 0xbd, 0xdd, 0x9b, 0xd7, 0xbe, 0xff, 0xb2, 0x99, 0xb8, 0xae, - 0xf3, 0x2a, 0x0f, 0x8b, 0x65, 0xb2, 0xe0, 0x58, 0x3a, 0xe9, 0xdb, 0x33, 0x68, 0x28, 0x9d, 0xa4, - 0x55, 0x9c, 0x0f, 0xe7, 0x60, 0xa5, 0x38, 0x15, 0x65, 0xa2, 0x1e, 0xd2, 0x3f, 0xef, 0x61, 0xb4, - 0x81, 0x43, 0x9b, 0xa6, 0x90, 0x92, 0x7d, 0xdc, 0xe8, 0xa1, 0xf6, 0x16, 0xf3, 0x66, 0xc0, 0x5e, - 0xfb, 0x32, 0xf3, 0x56, 0x4f, 0xda, 0x3e, 0xf8, 0xf3, 0x18, 0xf7, 0x89, 0x63, 0xa8, 0x57, 0xd1, - 0x87, 0x8e, 0x4f, 0xfb, 0x2b, 0x68, 0xf7, 0x7f, 0xdd, 0xec, 0x2b, 0xa0, 0x7f, 0x3d, 0x09, 0x9e, - 0xf5, 0xb1, 0x08, 0x26, 0xc2, 0xf3, 0x5b, 0xe9, 0xe8, 0x82, 0xfc, 0x7d, 0xb3, 0x81, 0x6e, 0x50, - 0xf5, 0x2e, 0x87, 0x7a, 0xf7, 0x4f, 0xcf, 0x89, 0x50, 0xb7, 0x5a, 0x18, 0xce, 0x8c, 0x17, 0xb7, - 0xd4, 0x72, 0x3e, 0xa3, 0xe4, 0xc1, 0xfa, 0x9d, 0x43, 0xa7, 0x3c, 0x21, 0xcb, 0x0e, 0x0d, 0x0b, - 0xf4, 0xc5, 0x6d, 0xd5, 0xa8, 0xb9, 0xe2, 0xc0, 0xea, 0xab, 0x0c, 0xcf, 0x7b, 0x1a, 0xf6, 0xbe, - 0xd3, 0xf0, 0xf9, 0xed, 0x94, 0x74, 0x59, 0xfe, 0x63, 0x25, 0x7a, 0xe4, 0xb1, 0xf6, 0x79, 0x02, - 0x38, 0xf5, 0xf8, 0x71, 0xc0, 0x3e, 0xa5, 0x64, 0x0a, 0xf7, 0xbb, 0xbf, 0x9c, 0xb2, 0xfd, 0xe6, - 0x90, 0xa7, 0xb2, 0x9f, 0xa4, 0x92, 0x17, 0xed, 0x6f, 0x0e, 0xf9, 0x76, 0x6b, 0x6a, 0x48, 0x7f, - 0x73, 0x28, 0x80, 0x3b, 0xdf, 0x1c, 0x42, 0x3c, 0xa3, 0xdf, 0x1c, 0x42, 0xad, 0x05, 0xbf, 0x39, - 0x14, 0xd6, 0xa0, 0xc2, 0x7b, 0x53, 0x84, 0xfa, 0xdc, 0xba, 0x97, 0x45, 0xff, 0x18, 0xfb, 0xd9, - 0x6d, 0x54, 0x88, 0x05, 0xae, 0xe6, 0xd4, 0x3d, 0xb7, 0x1e, 0x6d, 0xea, 0xdd, 0x75, 0xdb, 0xee, - 0xcd, 0x6b, 0xdf, 0x3f, 0xd5, 0xbb, 0x1b, 0x13, 0xce, 0x45, 0xa1, 0xbe, 0x37, 0xb5, 0x11, 0x0a, - 0xcf, 0x95, 0x05, 0xb7, 0xe7, 0x37, 0xfb, 0xc1, 0x44, 0x75, 0x2b, 0x42, 0x77, 0xfa, 0xb0, 0xcb, - 0x10, 0xe8, 0xf2, 0xed, 0xde, 0x3c, 0xb1, 0x8c, 0xd4, 0xbe, 0xeb, 0xde, 0xee, 0x61, 0xcc, 0xef, - 0xeb, 0xa7, 0xfd, 0x15, 0xb4, 0xfb, 0x85, 0x4e, 0x1b, 0x5d, 0xf7, 0xaa, 0x9f, 0xb7, 0xba, 0x4c, - 0x8d, 0xbc, 0x6e, 0x1e, 0xf6, 0xc5, 0x43, 0x09, 0x84, 0xbb, 0x84, 0x76, 0x25, 0x10, 0xe8, 0x32, - 0xfa, 0xf9, 0xed, 0x94, 0x74, 0x59, 0xfe, 0x69, 0x25, 0xba, 0x4b, 0x96, 0x45, 0x8f, 0x83, 0x2f, - 0xfa, 0x5a, 0x06, 0xe3, 0xe1, 0xcb, 0x5b, 0xeb, 0xe9, 0x42, 0xfd, 0xeb, 0x4a, 0x74, 0x2f, 0x50, - 0xa8, 0x7a, 0x80, 0xdc, 0xc2, 0xba, 0x3f, 0x50, 0x7e, 0x78, 0x7b, 0x45, 0x6a, 0xb9, 0x77, 0xf1, - 0x51, 0xfb, 0x63, 0x3c, 0x01, 0xdb, 0x23, 0xfa, 0x63, 0x3c, 0xdd, 0x5a, 0xf0, 0x90, 0x87, 0x5d, - 0x34, 0x9b, 0x2e, 0xf4, 0x90, 0x47, 0xdd, 0x50, 0x03, 0x7b, 0x8e, 0xb5, 0x4e, 0x0e, 0x73, 0xf2, - 0xea, 0x5d, 0xce, 0xb2, 0x09, 0xed, 0xa4, 0x96, 0x77, 0x3b, 0x31, 0x1c, 0x3c, 0x1c, 0xab, 0xa4, - 0x67, 0xa2, 0xd9, 0x48, 0x3d, 0xa6, 0xf4, 0x0d, 0x12, 0x3c, 0x1c, 0x6b, 0xa1, 0x84, 0x37, 0x9d, - 0x35, 0x86, 0xbc, 0x81, 0x64, 0xf1, 0x49, 0x1f, 0x14, 0xa4, 0xe8, 0xc6, 0x9b, 0x39, 0x73, 0xdf, - 0x0c, 0x59, 0x69, 0x9d, 0xbb, 0x6f, 0xf5, 0xa4, 0x09, 0xb7, 0x23, 0x2e, 0xbf, 0xe2, 0x6c, 0xc2, - 0x8b, 0xa0, 0x5b, 0x43, 0xf5, 0x72, 0xeb, 0xd2, 0x98, 0xdb, 0x5d, 0x91, 0xce, 0x67, 0x99, 0xee, - 0x4c, 0xd2, 0xad, 0x4b, 0x75, 0xbb, 0x05, 0x34, 0x3c, 0x16, 0xb4, 0x6e, 0x55, 0x7a, 0xf9, 0x24, - 0x6c, 0xc6, 0xcb, 0x2a, 0x37, 0x7a, 0xb1, 0x74, 0x3d, 0xf5, 0x30, 0xea, 0xa8, 0x27, 0x18, 0x49, - 0x5b, 0x3d, 0x69, 0x78, 0x3e, 0xe7, 0xb8, 0x35, 0xe3, 0x69, 0xbb, 0xc3, 0x56, 0x6b, 0x48, 0x3d, - 0xed, 0xaf, 0x00, 0x4f, 0x43, 0xf5, 0xa8, 0x3a, 0x4a, 0x4a, 0xb9, 0x9f, 0xa4, 0xe9, 0x60, 0x23, - 0x30, 0x4c, 0x1a, 0x28, 0x78, 0x1a, 0x8a, 0xc0, 0xc4, 0x48, 0x6e, 0x4e, 0x0f, 0xb3, 0x41, 0x97, - 0x1d, 0x45, 0xf5, 0x1a, 0xc9, 0x2e, 0x0d, 0x4e, 0xb4, 0x9c, 0xa6, 0x36, 0xb5, 0x1d, 0x86, 0x1b, - 0xae, 0x55, 0xe1, 0xed, 0xde, 0x3c, 0x78, 0xdc, 0xae, 0x28, 0xb5, 0xb2, 0x3c, 0xa4, 0x4c, 0x78, - 0x2b, 0xc9, 0xa3, 0x0e, 0x0a, 0x9c, 0x0a, 0xd6, 0xd3, 0xe8, 0x6d, 0x32, 0x99, 0x72, 0x89, 0x3e, - 0x29, 0x72, 0x81, 0xe0, 0x93, 0x22, 0x00, 0x82, 0xae, 0xab, 0x7f, 0x37, 0xc7, 0xa1, 0x87, 0x13, - 0xac, 0xeb, 0xb4, 0xb2, 0x43, 0x85, 0xba, 0x0e, 0xa5, 0x41, 0x34, 0x30, 0x6e, 0xf5, 0xeb, 0xf8, - 0x4f, 0x42, 0x66, 0xc0, 0x3b, 0xf9, 0x1b, 0xbd, 0x58, 0xb0, 0xa2, 0x58, 0x87, 0xc9, 0x2c, 0x91, - 0xd8, 0x8a, 0xe2, 0xd8, 0xa8, 0x90, 0xd0, 0x8a, 0xd2, 0x46, 0xa9, 0xea, 0x55, 0x39, 0xc2, 0xe1, - 0x24, 0x5c, 0xbd, 0x9a, 0xe9, 0x57, 0x3d, 0xc3, 0xb6, 0x1e, 0x6c, 0x66, 0x66, 0xc8, 0xc8, 0x2b, - 0xbd, 0x59, 0x46, 0xc6, 0xb6, 0x7a, 0x4d, 0x13, 0x82, 0xa1, 0xa8, 0x43, 0x29, 0xc0, 0x03, 0xfb, - 0x8a, 0x6b, 0x9e, 0xbd, 0xe6, 0x39, 0x67, 0x05, 0xcb, 0x62, 0x74, 0x73, 0xaa, 0x0c, 0xb6, 0xc8, - 0xd0, 0xe6, 0x94, 0xd4, 0x00, 0x8f, 0xcd, 0xfd, 0x17, 0x2c, 0x91, 0xa9, 0x60, 0xde, 0x64, 0xf4, - 0xdf, 0xaf, 0x7c, 0xdc, 0x83, 0x84, 0x8f, 0xcd, 0x1b, 0xc0, 0x1c, 0x7c, 0xd7, 0x4e, 0x3f, 0x0b, - 0x98, 0xf2, 0xd1, 0xd0, 0x46, 0x98, 0x56, 0x01, 0x83, 0xda, 0x24, 0xb8, 0x5c, 0xfe, 0x84, 0x2f, - 0xb1, 0x41, 0x6d, 0xf3, 0x53, 0x85, 0x84, 0x06, 0x75, 0x1b, 0x05, 0x79, 0xa6, 0xbb, 0x0f, 0x5a, - 0x0d, 0xe8, 0xbb, 0x5b, 0x9f, 0xb5, 0x4e, 0x0e, 0xcc, 0x9c, 0xbd, 0x64, 0xe1, 0x3d, 0x27, 0x40, - 0x0a, 0xba, 0x97, 0x2c, 0xf0, 0xc7, 0x04, 0x1b, 0xbd, 0x58, 0xf8, 0x48, 0x9e, 0x49, 0xfe, 0xae, - 0x79, 0x56, 0x8e, 0x14, 0x57, 0xc9, 0x5b, 0x0f, 0xcb, 0xd7, 0xbb, 0x41, 0x7b, 0x01, 0xf6, 0xb4, - 0x10, 0x31, 0x2f, 0x4b, 0xfd, 0x85, 0x42, 0xff, 0x86, 0x91, 0x96, 0x0d, 0xc1, 0xf7, 0x09, 0x1f, - 0x86, 0x21, 0xdb, 0x33, 0x5a, 0x64, 0xbf, 0x7a, 0xb3, 0x8a, 0x6a, 0xb6, 0x3f, 0x78, 0xb3, 0xd6, - 0xc9, 0xd9, 0xe9, 0xa5, 0xa5, 0xee, 0x67, 0x6e, 0xd6, 0x51, 0x75, 0xec, 0x0b, 0x37, 0x8f, 0x7b, - 0x90, 0xda, 0xd5, 0x57, 0xd1, 0xfb, 0x47, 0x62, 0x3a, 0xe2, 0xd9, 0x64, 0xf0, 0x03, 0xff, 0x0a, - 0xad, 0x98, 0x0e, 0xab, 0x9f, 0x8d, 0xd1, 0x3b, 0x94, 0xd8, 0x5e, 0x02, 0xdc, 0xe3, 0x17, 0xf3, - 0xe9, 0x48, 0x32, 0x09, 0x2e, 0x01, 0xaa, 0xdf, 0x87, 0x95, 0x80, 0xb8, 0x04, 0xe8, 0x01, 0xc0, - 0xde, 0xb8, 0xe0, 0x1c, 0xb5, 0x57, 0x09, 0x82, 0xf6, 0x34, 0x60, 0xb3, 0x08, 0x63, 0xaf, 0x4a, - 0xd4, 0xe1, 0xa5, 0x3d, 0xab, 0xa3, 0xa4, 0x44, 0x16, 0xd1, 0xa6, 0xec, 0xe0, 0xae, 0xab, 0xaf, - 0xbe, 0x3a, 0x32, 0x9f, 0xcd, 0x58, 0xb1, 0x04, 0x83, 0x5b, 0xd7, 0xd2, 0x01, 0x88, 0xc1, 0x8d, - 0x82, 0x76, 0xd6, 0x36, 0xcd, 0x1c, 0x5f, 0x1f, 0x88, 0x42, 0xcc, 0x65, 0x92, 0x71, 0xf8, 0xe5, - 0x09, 0xd3, 0xa0, 0x2e, 0x43, 0xcc, 0x5a, 0x8a, 0xb5, 0x59, 0xae, 0x22, 0xea, 0xfb, 0x84, 0xea, - 0xbb, 0xc5, 0xa5, 0x14, 0x05, 0x7c, 0x9e, 0x58, 0x5b, 0x81, 0x10, 0x91, 0xe5, 0x92, 0x30, 0xe8, - 0xfb, 0xd3, 0x24, 0x9b, 0xa2, 0x7d, 0x7f, 0xea, 0x7e, 0xf5, 0xf3, 0x1e, 0x0d, 0xd8, 0x09, 0x55, - 0x37, 0x5a, 0x3d, 0x01, 0xf4, 0xbb, 0x9c, 0x68, 0xa3, 0xbb, 0x04, 0x31, 0xa1, 0x70, 0x12, 0xb8, - 0x7a, 0x9d, 0xf3, 0x8c, 0x4f, 0x9a, 0x5b, 0x73, 0x98, 0x2b, 0x8f, 0x08, 0xba, 0x82, 0xa4, 0x8d, - 0x45, 0x4a, 0x7e, 0x36, 0xcf, 0x4e, 0x0b, 0x71, 0x99, 0xa4, 0xbc, 0x00, 0xb1, 0xa8, 0x56, 0x77, - 0xe4, 0x44, 0x2c, 0xc2, 0x38, 0x7b, 0xfd, 0x42, 0x49, 0xbd, 0x8f, 0x6f, 0x8f, 0x0b, 0x16, 0xc3, - 0xeb, 0x17, 0xb5, 0x8d, 0x36, 0x46, 0x9c, 0x0c, 0x06, 0x70, 0x27, 0xd1, 0xa9, 0x5d, 0x67, 0x4b, - 0x35, 0x3e, 0xf4, 0xbb, 0x84, 0xea, 0x5b, 0x98, 0x25, 0x48, 0x74, 0xb4, 0x39, 0x8c, 0x24, 0x12, - 0x9d, 0xb0, 0x86, 0x5d, 0x4a, 0x14, 0x77, 0xa2, 0xaf, 0x15, 0x81, 0xa5, 0xa4, 0xb6, 0xd1, 0x08, - 0x89, 0xa5, 0xa4, 0x05, 0x81, 0x80, 0xd4, 0x4c, 0x83, 0x29, 0x1a, 0x90, 0x8c, 0x34, 0x18, 0x90, - 0x5c, 0xca, 0x06, 0x8a, 0xc3, 0x2c, 0x91, 0x09, 0x4b, 0x47, 0x5c, 0x9e, 0xb2, 0x82, 0xcd, 0xb8, - 0xe4, 0x05, 0x0c, 0x14, 0x1a, 0x19, 0x7a, 0x0c, 0x11, 0x28, 0x28, 0x56, 0x3b, 0xfc, 0xbd, 0xe8, - 0xc3, 0x6a, 0xdd, 0xe7, 0x99, 0xfe, 0x33, 0x1b, 0xaf, 0xd4, 0xdf, 0xe7, 0x19, 0x7c, 0x64, 0x6c, - 0x8c, 0x64, 0xc1, 0xd9, 0xac, 0xb1, 0xfd, 0x81, 0xf9, 0x5d, 0x81, 0x4f, 0x57, 0xaa, 0xf1, 0x7c, - 0x22, 0x64, 0x72, 0x59, 0x6d, 0xb3, 0xf5, 0x1b, 0x44, 0x60, 0x3c, 0xbb, 0xe2, 0x61, 0xe0, 0x5b, - 0x14, 0x18, 0x67, 0xe3, 0xb4, 0x2b, 0x3d, 0xe3, 0x79, 0x0a, 0xe3, 0xb4, 0xa7, 0xad, 0x00, 0x22, - 0x4e, 0xa3, 0xa0, 0x9d, 0x9c, 0xae, 0x78, 0xcc, 0xc3, 0x95, 0x19, 0xf3, 0x7e, 0x95, 0x19, 0x7b, - 0x2f, 0x65, 0xa4, 0xd1, 0x87, 0xc7, 0x7c, 0x76, 0xc1, 0x8b, 0xf2, 0x2a, 0xc9, 0x0f, 0xaa, 0x84, - 0x8b, 0xc9, 0x39, 0x7c, 0x6d, 0xd1, 0x12, 0x43, 0x83, 0x10, 0x59, 0x29, 0x81, 0xda, 0x95, 0xc0, - 0x02, 0x87, 0xe5, 0x09, 0x9b, 0x71, 0xf5, 0x65, 0x0d, 0xb0, 0x12, 0x38, 0x46, 0x1c, 0x88, 0x58, - 0x09, 0x48, 0xd8, 0x79, 0xbf, 0xcb, 0x32, 0x67, 0x7c, 0x5a, 0x8d, 0xb0, 0xe2, 0x94, 0x2d, 0x67, - 0x3c, 0x93, 0xda, 0x24, 0x38, 0x93, 0x77, 0x4c, 0xe2, 0x3c, 0x71, 0x26, 0xdf, 0x47, 0xcf, 0x09, - 0x4d, 0x5e, 0xc3, 0x9f, 0x8a, 0x42, 0xd6, 0x7f, 0x44, 0xe7, 0xbc, 0x48, 0x41, 0x68, 0xf2, 0x1b, - 0xd5, 0x23, 0x89, 0xd0, 0x14, 0xd6, 0x70, 0xbe, 0x3e, 0xef, 0x95, 0xe1, 0x0d, 0x2f, 0xcc, 0x38, - 0x79, 0x35, 0x63, 0x49, 0xaa, 0x47, 0xc3, 0x8f, 0x02, 0xb6, 0x09, 0x1d, 0xe2, 0xeb, 0xf3, 0x7d, - 0x75, 0x9d, 0xef, 0xf5, 0x87, 0x4b, 0x08, 0x1e, 0x11, 0x74, 0xd8, 0x27, 0x1e, 0x11, 0x74, 0x6b, - 0xd9, 0x9d, 0xbb, 0x65, 0x15, 0xb7, 0x54, 0xc4, 0xae, 0x98, 0xc0, 0xf3, 0x42, 0xc7, 0x26, 0x00, - 0x89, 0x9d, 0x7b, 0x50, 0xc1, 0xa6, 0x06, 0x16, 0xdb, 0x4f, 0x32, 0x96, 0x26, 0x3f, 0x83, 0x69, - 0xbd, 0x63, 0xa7, 0x21, 0x88, 0xd4, 0x00, 0x27, 0x31, 0x57, 0x07, 0x5c, 0x8e, 0x93, 0x2a, 0xf4, - 0xaf, 0x07, 0xda, 0x4d, 0x11, 0xdd, 0xae, 0x1c, 0xd2, 0xf9, 0x46, 0x2b, 0x6c, 0xd6, 0x9d, 0x3c, - 0x1f, 0x55, 0xab, 0xea, 0x19, 0x8f, 0x79, 0x92, 0xcb, 0xc1, 0x8b, 0x70, 0x5b, 0x01, 0x9c, 0xb8, - 0x68, 0xd1, 0x43, 0xcd, 0x79, 0x7c, 0x5f, 0xc5, 0x92, 0x51, 0xfd, 0xd7, 0xe5, 0xce, 0x4b, 0x5e, - 0xe8, 0x44, 0xe3, 0x80, 0x4b, 0x30, 0x3b, 0x1d, 0x6e, 0xe8, 0x80, 0x55, 0x45, 0x89, 0xd9, 0x19, - 0xd6, 0xb0, 0x87, 0x7d, 0x0e, 0x77, 0xc6, 0x4b, 0x91, 0x2e, 0xb8, 0xba, 0x6f, 0xb8, 0x49, 0x1a, - 0x73, 0x28, 0xe2, 0xb0, 0x8f, 0xa6, 0x6d, 0xb6, 0xd6, 0x76, 0xbb, 0x93, 0x2d, 0x0f, 0xe1, 0x95, - 0x09, 0xc4, 0x92, 0xc2, 0x88, 0x6c, 0x2d, 0x80, 0x3b, 0x87, 0xe1, 0x85, 0x60, 0x93, 0x98, 0x95, - 0xf2, 0x94, 0x2d, 0x53, 0xc1, 0x26, 0x6a, 0x5d, 0x87, 0x87, 0xe1, 0x0d, 0x33, 0x74, 0x21, 0xea, - 0x30, 0x9c, 0x82, 0xdd, 0xec, 0x4c, 0xfd, 0xd1, 0x3c, 0x7d, 0x97, 0x13, 0x66, 0x67, 0xaa, 0xbc, - 0xf0, 0x1e, 0xe7, 0xc3, 0x30, 0x64, 0xdf, 0x41, 0xab, 0x45, 0x2a, 0x0d, 0xb9, 0x87, 0xe9, 0x78, - 0x09, 0xc8, 0xfd, 0x00, 0x61, 0xbf, 0x4b, 0x51, 0xff, 0xde, 0xfc, 0xdd, 0x17, 0xa9, 0xbf, 0x64, - 0xbd, 0x89, 0xe9, 0xba, 0xd0, 0xd0, 0xfd, 0xc0, 0xdd, 0x56, 0x4f, 0xda, 0xa6, 0x99, 0xbb, 0x57, - 0x4c, 0xee, 0x4c, 0x26, 0xc7, 0xbc, 0x44, 0x5e, 0x28, 0xaf, 0x84, 0x43, 0x2b, 0x25, 0xd2, 0xcc, - 0x36, 0x65, 0x07, 0x7a, 0x25, 0x7b, 0x35, 0x49, 0xa4, 0x96, 0x35, 0x37, 0xa4, 0x37, 0xdb, 0x06, - 0xda, 0x14, 0x51, 0x2b, 0x9a, 0xb6, 0xb1, 0xbc, 0x62, 0xc6, 0x62, 0x3a, 0x4d, 0xb9, 0x86, 0xce, - 0x38, 0xab, 0x3f, 0xe4, 0xb7, 0xdd, 0xb6, 0x85, 0x82, 0x44, 0x2c, 0x0f, 0x2a, 0xd8, 0x34, 0xb2, - 0xc2, 0xea, 0x47, 0x52, 0x4d, 0xc3, 0xae, 0xb5, 0xcd, 0x78, 0x00, 0x91, 0x46, 0xa2, 0xa0, 0x7d, - 0xef, 0xad, 0x12, 0x1f, 0xf0, 0xa6, 0x25, 0xe0, 0x27, 0x88, 0x94, 0xb2, 0x23, 0x26, 0xde, 0x7b, - 0x43, 0x30, 0xbb, 0x4f, 0x00, 0x1e, 0x5e, 0x2e, 0x0f, 0x27, 0x70, 0x9f, 0x00, 0xf5, 0x15, 0x43, - 0xec, 0x13, 0x28, 0xd6, 0xef, 0x3a, 0x73, 0xee, 0x75, 0xc4, 0x4a, 0x5b, 0x39, 0xa4, 0xeb, 0x50, - 0x30, 0xd4, 0x75, 0x94, 0x82, 0xdf, 0xa4, 0xee, 0xd1, 0x1a, 0xd2, 0xa4, 0xd8, 0xb9, 0xda, 0x6a, - 0x17, 0x66, 0xe3, 0x92, 0xd9, 0x4f, 0xaa, 0x2b, 0x4b, 0xf8, 0x17, 0xfc, 0x6b, 0x21, 0x11, 0x97, - 0x5a, 0x50, 0x6d, 0xfb, 0xe5, 0xfd, 0xff, 0xfc, 0xe6, 0xce, 0xca, 0x2f, 0xbe, 0xb9, 0xb3, 0xf2, - 0xdf, 0xdf, 0xdc, 0x59, 0xf9, 0xf9, 0xb7, 0x77, 0xde, 0xfb, 0xc5, 0xb7, 0x77, 0xde, 0xfb, 0xaf, - 0x6f, 0xef, 0xbc, 0xf7, 0xf5, 0xfb, 0xfa, 0x8f, 0xa9, 0x5e, 0xfc, 0x3f, 0xf5, 0x27, 0x51, 0x9f, - 0xff, 0x5f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x39, 0xd6, 0xda, 0x85, 0x70, 0x75, 0x00, 0x00, + 0x0b, 0xf3, 0x76, 0xc3, 0x9f, 0x06, 0x08, 0xbb, 0xd0, 0xd5, 0x7f, 0x57, 0xfb, 0xfc, 0x01, 0xaa, + 0xa1, 0x44, 0xc4, 0x42, 0x07, 0x10, 0x58, 0xd0, 0xd1, 0x95, 0xb8, 0xc1, 0x0b, 0x5a, 0x49, 0xc2, + 0x05, 0xd5, 0x84, 0x3d, 0x79, 0xd3, 0x05, 0xc5, 0x4e, 0xde, 0x9a, 0x62, 0x84, 0x4e, 0xde, 0x20, + 0xa3, 0x0d, 0x8b, 0xe8, 0x37, 0x5d, 0xc3, 0x2f, 0x85, 0xb8, 0x9e, 0xb1, 0xe2, 0x7a, 0xf0, 0x84, + 0x56, 0x6e, 0x18, 0xe3, 0x68, 0xa3, 0x17, 0x6b, 0x83, 0x9a, 0xeb, 0xb0, 0x4a, 0x93, 0xce, 0x8b, + 0x14, 0x04, 0x35, 0xcf, 0x86, 0x46, 0x88, 0xa0, 0x46, 0xa0, 0x76, 0x54, 0xba, 0xde, 0x46, 0x1c, + 0xee, 0xf5, 0x3c, 0xf5, 0x11, 0xa7, 0xf6, 0x7a, 0x08, 0x06, 0x87, 0xd0, 0x41, 0xc1, 0xf2, 0x2b, + 0x7c, 0x08, 0x29, 0x51, 0x78, 0x08, 0x35, 0x08, 0xec, 0xef, 0x11, 0x67, 0x45, 0x7c, 0x85, 0xf7, + 0x77, 0x2d, 0x0b, 0xf7, 0xb7, 0x61, 0x60, 0x7f, 0xd7, 0x82, 0xb7, 0x89, 0xbc, 0x3a, 0xe6, 0x92, + 0xe1, 0xfd, 0xed, 0x33, 0xe1, 0xfe, 0x6e, 0xb1, 0x36, 0x0f, 0x73, 0x1d, 0x8e, 0xe6, 0x17, 0x65, + 0x5c, 0x24, 0x17, 0x7c, 0x10, 0xb0, 0x62, 0x20, 0x22, 0x0f, 0x23, 0x61, 0xed, 0xf3, 0xe7, 0x2b, + 0xd1, 0xdd, 0xa6, 0xdb, 0x45, 0x59, 0xea, 0x98, 0xe7, 0xbb, 0x7f, 0x81, 0xf7, 0x2f, 0x81, 0x13, + 0x67, 0xa1, 0x3d, 0xd4, 0x9c, 0x35, 0x01, 0x2f, 0xd2, 0x79, 0x56, 0x9a, 0x42, 0x7d, 0xd9, 0xc7, + 0xba, 0xa3, 0x40, 0xac, 0x09, 0xbd, 0x14, 0xed, 0x72, 0xac, 0xfb, 0xa7, 0x91, 0x1d, 0x4e, 0x4a, + 0xb0, 0x1c, 0x37, 0xed, 0xed, 0x10, 0xc4, 0x72, 0x8c, 0x93, 0x70, 0x28, 0x1c, 0x14, 0x62, 0x9e, + 0x97, 0x1d, 0x43, 0x01, 0x40, 0xe1, 0xa1, 0xd0, 0x86, 0xb5, 0xcf, 0x77, 0xd1, 0x6f, 0xbb, 0xc3, + 0xcf, 0x6d, 0xec, 0x2d, 0x7a, 0x4c, 0x61, 0x4d, 0x3c, 0xec, 0x8b, 0xdb, 0x84, 0xb4, 0xf1, 0x2c, + 0xf7, 0xb8, 0x64, 0x49, 0x5a, 0x0e, 0x56, 0x71, 0x1b, 0x8d, 0x9c, 0x48, 0x48, 0x31, 0x0e, 0xc6, + 0xb7, 0xbd, 0x79, 0x9e, 0x26, 0x71, 0xfb, 0x24, 0x5a, 0xeb, 0x1a, 0x71, 0x38, 0xbe, 0xb9, 0x18, + 0x8c, 0xd7, 0xd5, 0x92, 0xaf, 0xfe, 0x33, 0x5e, 0xe6, 0x1c, 0x8f, 0xd7, 0x1e, 0x12, 0x8e, 0xd7, + 0x10, 0x85, 0xf5, 0x19, 0x71, 0x79, 0xc4, 0x96, 0x62, 0x4e, 0xc4, 0x6b, 0x23, 0x0e, 0xd7, 0xc7, + 0xc5, 0x6c, 0x4e, 0x68, 0x3c, 0x1c, 0x66, 0x92, 0x17, 0x19, 0x4b, 0xf7, 0x53, 0x36, 0x2d, 0x07, + 0x44, 0x8c, 0xf1, 0x29, 0x22, 0x27, 0xa4, 0x69, 0xa4, 0x19, 0x0f, 0xcb, 0x7d, 0xb6, 0x10, 0x45, + 0x22, 0xe9, 0x66, 0xb4, 0x48, 0x67, 0x33, 0x7a, 0x28, 0xea, 0x6d, 0xa7, 0x88, 0xaf, 0x92, 0x05, + 0x9f, 0x04, 0xbc, 0x35, 0x48, 0x0f, 0x6f, 0x0e, 0x8a, 0x74, 0xda, 0x48, 0xcc, 0x8b, 0x98, 0x93, + 0x9d, 0x56, 0x8b, 0x3b, 0x3b, 0xcd, 0x60, 0xda, 0xc3, 0x5f, 0xad, 0x44, 0xbf, 0x53, 0x4b, 0xdd, + 0xe3, 0xe1, 0x3d, 0x56, 0x5e, 0x5d, 0x08, 0x56, 0x4c, 0x06, 0x9f, 0x61, 0x76, 0x50, 0xd4, 0xb8, + 0x7e, 0x76, 0x1b, 0x15, 0xd8, 0xac, 0x47, 0x49, 0xe9, 0xcc, 0x38, 0xb4, 0x59, 0x3d, 0x24, 0xdc, + 0xac, 0x10, 0x85, 0x01, 0x44, 0xc9, 0xeb, 0xa3, 0x98, 0x55, 0x52, 0xdf, 0x3f, 0x8f, 0x59, 0xeb, + 0xe4, 0x60, 0x7c, 0xac, 0x84, 0xfe, 0x68, 0xd9, 0xa2, 0x6c, 0xe0, 0x23, 0x66, 0xd8, 0x17, 0x27, + 0x3d, 0x9b, 0x59, 0x11, 0xf6, 0xdc, 0x9a, 0x19, 0xc3, 0xbe, 0x38, 0xe1, 0xd9, 0x09, 0x6b, 0x21, + 0xcf, 0x48, 0x68, 0x1b, 0xf6, 0xc5, 0x61, 0xf6, 0xa5, 0x99, 0x66, 0x5d, 0x78, 0x12, 0xb0, 0x03, + 0xd7, 0x86, 0x8d, 0x5e, 0xac, 0x76, 0xf8, 0x37, 0x2b, 0xd1, 0xf7, 0xad, 0xc7, 0x63, 0x31, 0x49, + 0x2e, 0x97, 0x35, 0xf4, 0x86, 0xa5, 0x73, 0x5e, 0x0e, 0x9e, 0x51, 0xd6, 0xda, 0xac, 0x29, 0xc1, + 0xf3, 0x5b, 0xe9, 0xc0, 0xb9, 0xb3, 0x93, 0xe7, 0xe9, 0x72, 0xcc, 0x67, 0x79, 0x4a, 0xce, 0x1d, + 0x0f, 0x09, 0xcf, 0x1d, 0x88, 0xc2, 0xac, 0x7c, 0x2c, 0xaa, 0x9c, 0x1f, 0xcd, 0xca, 0x95, 0x28, + 0x9c, 0x95, 0x37, 0x08, 0xcc, 0x95, 0xc6, 0x62, 0x57, 0xa4, 0x29, 0x8f, 0x65, 0xfb, 0x11, 0xb3, + 0xd1, 0xb4, 0x44, 0x38, 0x57, 0x02, 0xa4, 0x3d, 0x8d, 0x69, 0xf6, 0x90, 0xac, 0xe0, 0x2f, 0x97, + 0x47, 0x49, 0x76, 0x3d, 0xc0, 0xd3, 0x02, 0x0b, 0x10, 0xa7, 0x31, 0x28, 0x08, 0xf7, 0xaa, 0xe7, + 0xd9, 0x44, 0xe0, 0x7b, 0xd5, 0x4a, 0x12, 0xde, 0xab, 0x6a, 0x02, 0x9a, 0x3c, 0xe3, 0x94, 0xc9, + 0x4a, 0x12, 0x36, 0xa9, 0x09, 0x2c, 0x14, 0xea, 0x33, 0x7b, 0x32, 0x14, 0x82, 0x53, 0xfa, 0xb5, + 0x4e, 0x0e, 0x8e, 0xd0, 0x66, 0xd3, 0xba, 0xcf, 0x65, 0x7c, 0x85, 0x8f, 0x50, 0x0f, 0x09, 0x8f, + 0x50, 0x88, 0xc2, 0x2a, 0x8d, 0x85, 0xd9, 0x74, 0xaf, 0xe2, 0xe3, 0xa3, 0xb5, 0xe1, 0x5e, 0xeb, + 0xe4, 0xe0, 0x36, 0xf2, 0x70, 0xa6, 0xda, 0x0c, 0x1d, 0xe4, 0xb5, 0x2c, 0xbc, 0x8d, 0x34, 0x0c, + 0x2c, 0x7d, 0x2d, 0xa8, 0x9a, 0x13, 0x2f, 0xbd, 0x95, 0x87, 0x4b, 0xef, 0x71, 0xda, 0xc9, 0xbf, + 0x98, 0x6d, 0x5c, 0x2d, 0x3d, 0x11, 0xd5, 0x1c, 0x79, 0xc3, 0xd2, 0x64, 0xc2, 0x24, 0x1f, 0x8b, + 0x6b, 0x9e, 0xe1, 0x3b, 0x26, 0x5d, 0xda, 0x9a, 0x1f, 0x7a, 0x0a, 0xe1, 0x1d, 0x53, 0x58, 0x11, + 0x8e, 0x93, 0x9a, 0x3e, 0x2f, 0xf9, 0x2e, 0x2b, 0x89, 0x48, 0xe6, 0x21, 0xe1, 0x71, 0x02, 0x51, + 0x98, 0xaf, 0xd6, 0xf2, 0x57, 0xef, 0x72, 0x5e, 0x24, 0x3c, 0x8b, 0x39, 0x9e, 0xaf, 0x42, 0x2a, + 0x9c, 0xaf, 0x22, 0x34, 0xdc, 0xab, 0xed, 0x31, 0xc9, 0x5f, 0x2e, 0xc7, 0xc9, 0x8c, 0x97, 0x92, + 0xcd, 0x72, 0x7c, 0xaf, 0x06, 0xa0, 0xf0, 0x5e, 0xad, 0x0d, 0xb7, 0x8e, 0x86, 0x4c, 0x40, 0x6c, + 0xdf, 0x4c, 0x81, 0x44, 0xe0, 0x66, 0x0a, 0x81, 0xc2, 0x86, 0xb5, 0x00, 0x7a, 0x38, 0xdc, 0xb2, + 0x12, 0x3c, 0x1c, 0xa6, 0xe9, 0xd6, 0x81, 0x9b, 0x61, 0x46, 0xd5, 0xd4, 0xec, 0x28, 0xfa, 0xc8, + 0x9d, 0xa2, 0x1b, 0xbd, 0x58, 0xfc, 0x84, 0xef, 0x8c, 0xa7, 0x4c, 0x2d, 0x5b, 0x81, 0x63, 0xb4, + 0x86, 0xe9, 0x73, 0xc2, 0xe7, 0xb0, 0xda, 0xe1, 0x5f, 0xac, 0x44, 0x9f, 0x60, 0x1e, 0x5f, 0xe7, + 0xca, 0xef, 0xd3, 0x6e, 0x5b, 0x35, 0x49, 0x5c, 0xbd, 0x09, 0x6b, 0xe8, 0x32, 0xfc, 0x49, 0xf4, + 0x71, 0x23, 0xb2, 0x37, 0x73, 0x74, 0x01, 0xfc, 0xa4, 0xcd, 0x94, 0x1f, 0x72, 0xc6, 0xfd, 0x76, + 0x6f, 0xde, 0xee, 0x87, 0xfc, 0x72, 0x95, 0x60, 0x3f, 0x64, 0x6c, 0x68, 0x31, 0xb1, 0x1f, 0x42, + 0x30, 0x3b, 0x3b, 0xdd, 0xea, 0xbd, 0x4d, 0xe4, 0x95, 0xca, 0xb7, 0xc0, 0xec, 0xf4, 0xca, 0x6a, + 0x20, 0x62, 0x76, 0x92, 0x30, 0xcc, 0x48, 0x1a, 0xb0, 0x9a, 0x9b, 0x58, 0x2c, 0x37, 0x86, 0xdc, + 0x99, 0xb9, 0xde, 0x0d, 0xc2, 0xf1, 0xda, 0x88, 0xf5, 0xd6, 0xe7, 0x49, 0xc8, 0x02, 0xd8, 0xfe, + 0x6c, 0xf4, 0x62, 0xb5, 0xc3, 0x3f, 0x8b, 0xbe, 0xd7, 0xaa, 0xd8, 0x3e, 0x67, 0x72, 0x5e, 0xf0, + 0xc9, 0x60, 0xbb, 0xa3, 0xdc, 0x0d, 0x68, 0x5c, 0x3f, 0xed, 0xaf, 0xd0, 0xca, 0xd1, 0x1b, 0xae, + 0x1e, 0x56, 0xa6, 0x0c, 0xcf, 0x42, 0x26, 0x7d, 0x36, 0x98, 0xa3, 0xd3, 0x3a, 0xad, 0x6d, 0xb6, + 0x3b, 0xba, 0x76, 0x16, 0x2c, 0x49, 0xd5, 0x43, 0xba, 0xcf, 0x42, 0x46, 0x3d, 0x34, 0xb8, 0xcd, + 0x26, 0x55, 0x5a, 0x91, 0x59, 0xcd, 0x71, 0x67, 0x7b, 0xb6, 0x49, 0x47, 0x02, 0x64, 0x77, 0xb6, + 0xd5, 0x93, 0xd6, 0x6e, 0x65, 0xb3, 0xe4, 0x55, 0x7f, 0x76, 0x07, 0x39, 0xe6, 0x55, 0xab, 0x22, + 0x23, 0x7d, 0xab, 0x27, 0xad, 0xbd, 0xfe, 0x69, 0xf4, 0x71, 0xdb, 0xab, 0x5e, 0x88, 0xb6, 0x3b, + 0x4d, 0x81, 0xb5, 0xe8, 0x69, 0x7f, 0x05, 0xbb, 0xa5, 0xf9, 0x2a, 0x29, 0xa5, 0x28, 0x96, 0xa3, + 0x2b, 0x71, 0xd3, 0xdc, 0x78, 0xf7, 0x67, 0xab, 0x06, 0x86, 0x0e, 0x41, 0x6c, 0x69, 0x70, 0xb2, + 0xe5, 0xca, 0xde, 0x8c, 0x2f, 0x09, 0x57, 0x0e, 0xd1, 0xe1, 0xca, 0x27, 0x6d, 0xac, 0x6a, 0x6a, + 0x65, 0xaf, 0xf1, 0xaf, 0xe1, 0x45, 0x6d, 0x5f, 0xe5, 0x5f, 0xef, 0x06, 0x6d, 0xc6, 0xa2, 0xc5, + 0x7b, 0xc9, 0xe5, 0xa5, 0xa9, 0x13, 0x5e, 0x52, 0x17, 0x21, 0x32, 0x16, 0x02, 0xb5, 0x49, 0xf7, + 0x7e, 0x92, 0x72, 0x75, 0xa2, 0xff, 0xfa, 0xf2, 0x32, 0x15, 0x6c, 0x02, 0x92, 0xee, 0x4a, 0x3c, + 0x74, 0xe5, 0x44, 0xd2, 0x8d, 0x71, 0xf6, 0x19, 0x71, 0x25, 0x3d, 0xe3, 0xb1, 0xc8, 0xe2, 0x24, + 0x85, 0x17, 0x00, 0x95, 0xa6, 0x11, 0x12, 0xcf, 0x88, 0x5b, 0x90, 0x5d, 0x18, 0x2b, 0x51, 0x35, + 0xed, 0x9b, 0xf2, 0x3f, 0x6a, 0x2b, 0x3a, 0x62, 0x62, 0x61, 0x44, 0x30, 0xbb, 0xf7, 0xac, 0x84, + 0xe7, 0xb9, 0x32, 0x7e, 0xaf, 0xad, 0x55, 0x4b, 0x88, 0xbd, 0xa7, 0x4f, 0xd8, 0x3d, 0x54, 0xf5, + 0xf7, 0x3d, 0x71, 0x93, 0x29, 0xa3, 0xf7, 0xdb, 0x2a, 0x8d, 0x8c, 0xd8, 0x43, 0x41, 0x46, 0x1b, + 0xfe, 0x49, 0xf4, 0xff, 0x95, 0xe1, 0x42, 0xe4, 0x83, 0x3b, 0x88, 0x42, 0xe1, 0xdc, 0xd5, 0xbb, + 0x4b, 0xca, 0xed, 0x95, 0x53, 0x33, 0x36, 0xce, 0x4b, 0x36, 0xe5, 0x83, 0x87, 0x44, 0x8f, 0x2b, + 0x29, 0x71, 0xe5, 0xb4, 0x4d, 0xf9, 0xa3, 0xe2, 0x44, 0x4c, 0xb4, 0x75, 0xa4, 0x86, 0x46, 0x18, + 0x1a, 0x15, 0x2e, 0x64, 0x93, 0x99, 0x13, 0xb6, 0x48, 0xa6, 0x66, 0xc1, 0xa9, 0xe3, 0x56, 0x09, + 0x92, 0x19, 0xcb, 0x0c, 0x1d, 0x88, 0x48, 0x66, 0x48, 0x58, 0xfb, 0xfc, 0xe7, 0x95, 0xe8, 0x9e, + 0x65, 0x0e, 0x9a, 0xd3, 0xba, 0xc3, 0xec, 0x52, 0x54, 0xa9, 0xcf, 0x51, 0x92, 0x5d, 0x97, 0x83, + 0x2f, 0x28, 0x93, 0x38, 0x6f, 0x8a, 0xf2, 0xe5, 0xad, 0xf5, 0x6c, 0xd6, 0xda, 0x1c, 0x65, 0xd9, + 0xe7, 0xd9, 0xb5, 0x06, 0xc8, 0x5a, 0xcd, 0x89, 0x17, 0xe4, 0x88, 0xac, 0x35, 0xc4, 0xdb, 0x2e, + 0x36, 0xce, 0x53, 0x91, 0xc1, 0x2e, 0xb6, 0x16, 0x2a, 0x21, 0xd1, 0xc5, 0x2d, 0xc8, 0xc6, 0xe3, + 0x46, 0x54, 0x9f, 0xba, 0xec, 0xa4, 0x29, 0x88, 0xc7, 0x46, 0xd5, 0x00, 0x44, 0x3c, 0x46, 0x41, + 0xed, 0xe7, 0x2c, 0xfa, 0x4e, 0xd5, 0xa4, 0xa7, 0x05, 0x5f, 0x24, 0x1c, 0x5e, 0xbd, 0x70, 0x24, + 0xc4, 0xfc, 0xf7, 0x09, 0x3b, 0xb3, 0xce, 0xb3, 0x32, 0x4f, 0x59, 0x79, 0xa5, 0x1f, 0xc6, 0xfb, + 0x75, 0x6e, 0x84, 0xf0, 0x71, 0xfc, 0xa3, 0x0e, 0xca, 0x06, 0xf5, 0x46, 0x66, 0x42, 0xcc, 0x2a, + 0xae, 0xda, 0x0a, 0x33, 0x6b, 0x9d, 0x9c, 0x3d, 0xf1, 0x3e, 0x60, 0x69, 0xca, 0x8b, 0x65, 0x23, + 0x3b, 0x66, 0x59, 0x72, 0xc9, 0x4b, 0x09, 0x4e, 0xbc, 0x35, 0x35, 0x84, 0x18, 0x71, 0xe2, 0x1d, + 0xc0, 0x6d, 0x36, 0x0f, 0x3c, 0x1f, 0x66, 0x13, 0xfe, 0x0e, 0x64, 0xf3, 0xd0, 0x8e, 0x62, 0x88, + 0x6c, 0x9e, 0x62, 0xed, 0xc9, 0xef, 0xcb, 0x54, 0xc4, 0xd7, 0x7a, 0x09, 0xf0, 0x3b, 0x58, 0x49, + 0xe0, 0x1a, 0x70, 0x3f, 0x84, 0xd8, 0x45, 0x40, 0x09, 0xce, 0x78, 0x9e, 0xb2, 0x18, 0xde, 0xbf, + 0xa9, 0x75, 0xb4, 0x8c, 0x58, 0x04, 0x20, 0x03, 0x8a, 0xab, 0xef, 0xf5, 0x60, 0xc5, 0x05, 0xd7, + 0x7a, 0xee, 0x87, 0x10, 0xbb, 0x0c, 0x2a, 0xc1, 0x28, 0x4f, 0x13, 0x09, 0xa6, 0x41, 0xad, 0xa1, + 0x24, 0xc4, 0x34, 0xf0, 0x09, 0x60, 0xf2, 0x98, 0x17, 0x53, 0x8e, 0x9a, 0x54, 0x92, 0xa0, 0xc9, + 0x86, 0xb0, 0x97, 0x4c, 0xeb, 0xba, 0x8b, 0x7c, 0x09, 0x2e, 0x99, 0xea, 0x6a, 0x89, 0x7c, 0x49, + 0x5c, 0x32, 0xf5, 0x00, 0x50, 0xc4, 0x53, 0x56, 0x4a, 0xbc, 0x88, 0x4a, 0x12, 0x2c, 0x62, 0x43, + 0xd8, 0x35, 0xba, 0x2e, 0xe2, 0x5c, 0x82, 0x35, 0x5a, 0x17, 0xc0, 0x79, 0x02, 0x7d, 0x97, 0x94, + 0xdb, 0x48, 0x52, 0xf7, 0x0a, 0x97, 0xfb, 0x09, 0x4f, 0x27, 0x25, 0x88, 0x24, 0xba, 0xdd, 0x1b, + 0x29, 0x11, 0x49, 0xda, 0x14, 0x18, 0x4a, 0xfa, 0x7c, 0x1c, 0xab, 0x1d, 0x38, 0x1a, 0xbf, 0x1f, + 0x42, 0x6c, 0x7c, 0x6a, 0x0a, 0xbd, 0xcb, 0x8a, 0x22, 0xa9, 0x16, 0xff, 0x55, 0xbc, 0x40, 0x8d, + 0x9c, 0x88, 0x4f, 0x18, 0x07, 0xa6, 0x57, 0x13, 0xb8, 0xb1, 0x82, 0xc1, 0xd0, 0xfd, 0x20, 0xc8, + 0xd8, 0x8c, 0x53, 0x49, 0x9c, 0x47, 0xa8, 0x58, 0x6b, 0x22, 0x4f, 0x50, 0x57, 0xbb, 0x30, 0xe7, + 0x25, 0x10, 0xe3, 0xe2, 0x58, 0x2c, 0xf8, 0x58, 0xbc, 0x7a, 0x97, 0x94, 0x32, 0xc9, 0xa6, 0x7a, + 0xe5, 0x7e, 0x4e, 0x58, 0xc2, 0x60, 0xe2, 0x25, 0x90, 0x4e, 0x25, 0x9b, 0x40, 0x80, 0xb2, 0x9c, + 0xf0, 0x1b, 0x34, 0x81, 0x80, 0x16, 0x0d, 0x47, 0x24, 0x10, 0x21, 0xde, 0x9e, 0xa3, 0x18, 0xe7, + 0xfa, 0x4d, 0xd9, 0xb1, 0x68, 0x72, 0x39, 0xca, 0x1a, 0x04, 0x89, 0xad, 0x6c, 0x50, 0xc1, 0xee, + 0x2f, 0x8d, 0x7f, 0x3b, 0xc5, 0xd6, 0x09, 0x3b, 0xed, 0x69, 0xf6, 0xb8, 0x07, 0x89, 0xb8, 0xb2, + 0xf7, 0x00, 0x28, 0x57, 0xed, 0x6b, 0x00, 0x8f, 0x7b, 0x90, 0xce, 0x99, 0x8c, 0x5b, 0xad, 0x97, + 0x2c, 0xbe, 0x9e, 0x16, 0x62, 0x9e, 0x4d, 0x76, 0x45, 0x2a, 0x0a, 0x70, 0x26, 0xe3, 0x95, 0x1a, + 0xa0, 0xc4, 0x99, 0x4c, 0x87, 0x8a, 0xcd, 0xe0, 0xdc, 0x52, 0xec, 0xa4, 0xc9, 0x14, 0xee, 0xa8, + 0x3d, 0x43, 0x0a, 0x20, 0x32, 0x38, 0x14, 0x44, 0x06, 0x51, 0xbd, 0xe3, 0x96, 0x49, 0xcc, 0xd2, + 0xda, 0xdf, 0x36, 0x6d, 0xc6, 0x03, 0x3b, 0x07, 0x11, 0xa2, 0x80, 0xd4, 0x73, 0x3c, 0x2f, 0xb2, + 0xc3, 0x4c, 0x0a, 0xb2, 0x9e, 0x0d, 0xd0, 0x59, 0x4f, 0x07, 0x04, 0x61, 0x75, 0xcc, 0xdf, 0x55, + 0xa5, 0xa9, 0xfe, 0xc1, 0xc2, 0x6a, 0xf5, 0xf7, 0xa1, 0x96, 0x87, 0xc2, 0x2a, 0xe0, 0x40, 0x65, + 0xb4, 0x93, 0x7a, 0xc0, 0x04, 0xb4, 0xfd, 0x61, 0xb2, 0xde, 0x0d, 0xe2, 0x7e, 0x46, 0x72, 0x99, + 0xf2, 0x90, 0x1f, 0x05, 0xf4, 0xf1, 0xd3, 0x80, 0xf6, 0xb8, 0xc5, 0xab, 0xcf, 0x15, 0x8f, 0xaf, + 0x5b, 0xd7, 0x9a, 0xfc, 0x82, 0xd6, 0x08, 0x71, 0xdc, 0x42, 0xa0, 0x78, 0x17, 0x1d, 0xc6, 0x22, + 0x0b, 0x75, 0x51, 0x25, 0xef, 0xd3, 0x45, 0x9a, 0xb3, 0x9b, 0x5f, 0x23, 0xd5, 0x23, 0xb3, 0xee, + 0xa6, 0x0d, 0xc2, 0x82, 0x0b, 0x11, 0x9b, 0x5f, 0x12, 0xb6, 0x39, 0x39, 0xf4, 0x79, 0xdc, 0xbe, + 0xf3, 0xdd, 0xb2, 0x72, 0x4c, 0xdf, 0xf9, 0xa6, 0x58, 0xba, 0x92, 0xf5, 0x18, 0xe9, 0xb0, 0xe2, + 0x8f, 0x93, 0xcd, 0x7e, 0xb0, 0xdd, 0xf2, 0x78, 0x3e, 0x77, 0x53, 0xce, 0x8a, 0xda, 0xeb, 0x56, + 0xc0, 0x90, 0xc5, 0x88, 0x2d, 0x4f, 0x00, 0x07, 0x21, 0xcc, 0xf3, 0xbc, 0x2b, 0x32, 0xc9, 0x33, + 0x89, 0x85, 0x30, 0xdf, 0x98, 0x06, 0x43, 0x21, 0x8c, 0x52, 0x00, 0xe3, 0x56, 0x9d, 0x07, 0x71, + 0x79, 0xc2, 0x66, 0x68, 0xc6, 0x56, 0x9f, 0xf5, 0xd4, 0xf2, 0xd0, 0xb8, 0x05, 0x9c, 0xf3, 0x90, + 0xcf, 0xf5, 0x32, 0x66, 0xc5, 0xd4, 0x9c, 0x6e, 0x4c, 0x06, 0x4f, 0x69, 0x3b, 0x3e, 0x49, 0x3c, + 0xe4, 0x0b, 0x6b, 0x80, 0xb0, 0x73, 0x38, 0x63, 0x53, 0x53, 0x53, 0xa4, 0x06, 0x4a, 0xde, 0xaa, + 0xea, 0x7a, 0x37, 0x08, 0xfc, 0xbc, 0x49, 0x26, 0x5c, 0x04, 0xfc, 0x28, 0x79, 0x1f, 0x3f, 0x10, + 0x04, 0xd9, 0x5b, 0x55, 0xef, 0x7a, 0x47, 0xb7, 0x93, 0x4d, 0xf4, 0x3e, 0x76, 0x48, 0x34, 0x0f, + 0xe0, 0x42, 0xd9, 0x1b, 0xc1, 0x83, 0x39, 0xda, 0x1c, 0xd0, 0x86, 0xe6, 0xa8, 0x39, 0x7f, 0xed, + 0x33, 0x47, 0x31, 0x58, 0xfb, 0xfc, 0x99, 0x9e, 0xa3, 0x7b, 0x4c, 0xb2, 0x2a, 0x6f, 0x7f, 0x93, + 0xf0, 0x1b, 0xbd, 0x11, 0x46, 0xea, 0xdb, 0x50, 0x43, 0xf5, 0xaa, 0x22, 0xd8, 0x15, 0x6f, 0xf7, + 0xe6, 0x03, 0xbe, 0xf5, 0x0e, 0xa1, 0xd3, 0x37, 0xd8, 0x2a, 0x6c, 0xf7, 0xe6, 0x03, 0xbe, 0xf5, + 0x3b, 0xd0, 0x9d, 0xbe, 0xc1, 0x8b, 0xd0, 0xdb, 0xbd, 0x79, 0xed, 0xfb, 0x2f, 0x9b, 0x89, 0xeb, + 0x3a, 0xaf, 0xf2, 0xb0, 0x58, 0x26, 0x0b, 0x8e, 0xa5, 0x93, 0xbe, 0x3d, 0x83, 0x86, 0xd2, 0x49, + 0x5a, 0xc5, 0xf9, 0x70, 0x0e, 0x56, 0x8a, 0x53, 0x51, 0x26, 0xea, 0x21, 0xfd, 0xf3, 0x1e, 0x46, + 0x1b, 0x38, 0xb4, 0x69, 0x0a, 0x29, 0xd9, 0xc7, 0x8d, 0x1e, 0x6a, 0x6f, 0x31, 0x6f, 0x06, 0xec, + 0xb5, 0x2f, 0x33, 0x6f, 0xf5, 0xa4, 0xed, 0x83, 0x3f, 0x8f, 0x71, 0x9f, 0x38, 0x86, 0x7a, 0x15, + 0x7d, 0xe8, 0xf8, 0xb4, 0xbf, 0x82, 0x76, 0xff, 0xd7, 0xcd, 0xbe, 0x02, 0xfa, 0xd7, 0x93, 0xe0, + 0x59, 0x1f, 0x8b, 0x60, 0x22, 0x3c, 0xbf, 0x95, 0x8e, 0x2e, 0xc8, 0xdf, 0x37, 0x1b, 0xe8, 0x06, + 0x55, 0xef, 0x72, 0xa8, 0x77, 0xff, 0xf4, 0x9c, 0x08, 0x75, 0xab, 0x85, 0xe1, 0xcc, 0x78, 0x71, + 0x4b, 0x2d, 0xe7, 0x33, 0x4a, 0x1e, 0xac, 0xdf, 0x39, 0x74, 0xca, 0x13, 0xb2, 0xec, 0xd0, 0xb0, + 0x40, 0x5f, 0xdc, 0x56, 0x8d, 0x9a, 0x2b, 0x0e, 0xac, 0xbe, 0xca, 0xf0, 0xbc, 0xa7, 0x61, 0xef, + 0x3b, 0x0d, 0x9f, 0xdf, 0x4e, 0x49, 0x97, 0xe5, 0x3f, 0x57, 0xa2, 0x47, 0x1e, 0x6b, 0x9f, 0x27, + 0x80, 0x53, 0x8f, 0x1f, 0x07, 0xec, 0x53, 0x4a, 0xa6, 0x70, 0xbf, 0xfb, 0xcb, 0x29, 0xdb, 0x6f, + 0x0e, 0x79, 0x2a, 0xfb, 0x49, 0x2a, 0x79, 0xd1, 0xfe, 0xe6, 0x90, 0x6f, 0xb7, 0xa6, 0x86, 0xf4, + 0x37, 0x87, 0x02, 0xb8, 0xf3, 0xcd, 0x21, 0xc4, 0x33, 0xfa, 0xcd, 0x21, 0xd4, 0x5a, 0xf0, 0x9b, + 0x43, 0x61, 0x0d, 0x2a, 0xbc, 0x37, 0x45, 0xa8, 0xcf, 0xad, 0x7b, 0x59, 0xf4, 0x8f, 0xb1, 0x9f, + 0xdd, 0x46, 0x85, 0x58, 0xe0, 0x6a, 0x4e, 0xdd, 0x73, 0xeb, 0xd1, 0xa6, 0xde, 0x5d, 0xb7, 0xed, + 0xde, 0xbc, 0xf6, 0xfd, 0x53, 0xbd, 0xbb, 0x31, 0xe1, 0x5c, 0x14, 0xea, 0x7b, 0x53, 0x1b, 0xa1, + 0xf0, 0x5c, 0x59, 0x70, 0x7b, 0x7e, 0xb3, 0x1f, 0x4c, 0x54, 0xb7, 0x22, 0x74, 0xa7, 0x0f, 0xbb, + 0x0c, 0x81, 0x2e, 0xdf, 0xee, 0xcd, 0x13, 0xcb, 0x48, 0xed, 0xbb, 0xee, 0xed, 0x1e, 0xc6, 0xfc, + 0xbe, 0x7e, 0xda, 0x5f, 0x41, 0xbb, 0x5f, 0xe8, 0xb4, 0xd1, 0x75, 0xaf, 0xfa, 0x79, 0xab, 0xcb, + 0xd4, 0xc8, 0xeb, 0xe6, 0x61, 0x5f, 0x3c, 0x94, 0x40, 0xb8, 0x4b, 0x68, 0x57, 0x02, 0x81, 0x2e, + 0xa3, 0x9f, 0xdf, 0x4e, 0x49, 0x97, 0xe5, 0x9f, 0x56, 0xa2, 0xbb, 0x64, 0x59, 0xf4, 0x38, 0xf8, + 0xa2, 0xaf, 0x65, 0x30, 0x1e, 0xbe, 0xbc, 0xb5, 0x9e, 0x2e, 0xd4, 0xbf, 0xae, 0x44, 0xf7, 0x02, + 0x85, 0xaa, 0x07, 0xc8, 0x2d, 0xac, 0xfb, 0x03, 0xe5, 0x87, 0xb7, 0x57, 0xa4, 0x96, 0x7b, 0x17, + 0x1f, 0xb5, 0x3f, 0xc6, 0x13, 0xb0, 0x3d, 0xa2, 0x3f, 0xc6, 0xd3, 0xad, 0x05, 0x0f, 0x79, 0xd8, + 0x45, 0xb3, 0xe9, 0x42, 0x0f, 0x79, 0xd4, 0x0d, 0x35, 0xb0, 0xe7, 0x58, 0xeb, 0xe4, 0x30, 0x27, + 0xaf, 0xde, 0xe5, 0x2c, 0x9b, 0xd0, 0x4e, 0x6a, 0x79, 0xb7, 0x13, 0xc3, 0xc1, 0xc3, 0xb1, 0x4a, + 0x7a, 0x26, 0x9a, 0x8d, 0xd4, 0x63, 0x4a, 0xdf, 0x20, 0xc1, 0xc3, 0xb1, 0x16, 0x4a, 0x78, 0xd3, + 0x59, 0x63, 0xc8, 0x1b, 0x48, 0x16, 0x9f, 0xf4, 0x41, 0x41, 0x8a, 0x6e, 0xbc, 0x99, 0x33, 0xf7, + 0xcd, 0x90, 0x95, 0xd6, 0xb9, 0xfb, 0x56, 0x4f, 0x9a, 0x70, 0x3b, 0xe2, 0xf2, 0x2b, 0xce, 0x26, + 0xbc, 0x08, 0xba, 0x35, 0x54, 0x2f, 0xb7, 0x2e, 0x8d, 0xb9, 0xdd, 0x15, 0xe9, 0x7c, 0x96, 0xe9, + 0xce, 0x24, 0xdd, 0xba, 0x54, 0xb7, 0x5b, 0x40, 0xc3, 0x63, 0x41, 0xeb, 0x56, 0xa5, 0x97, 0x4f, + 0xc2, 0x66, 0xbc, 0xac, 0x72, 0xa3, 0x17, 0x4b, 0xd7, 0x53, 0x0f, 0xa3, 0x8e, 0x7a, 0x82, 0x91, + 0xb4, 0xd5, 0x93, 0x86, 0xe7, 0x73, 0x8e, 0x5b, 0x33, 0x9e, 0xb6, 0x3b, 0x6c, 0xb5, 0x86, 0xd4, + 0xd3, 0xfe, 0x0a, 0xf0, 0x34, 0x54, 0x8f, 0xaa, 0xa3, 0xa4, 0x94, 0xfb, 0x49, 0x9a, 0x0e, 0x36, + 0x02, 0xc3, 0xa4, 0x81, 0x82, 0xa7, 0xa1, 0x08, 0x4c, 0x8c, 0xe4, 0xe6, 0xf4, 0x30, 0x1b, 0x74, + 0xd9, 0x51, 0x54, 0xaf, 0x91, 0xec, 0xd2, 0xe0, 0x44, 0xcb, 0x69, 0x6a, 0x53, 0xdb, 0x61, 0xb8, + 0xe1, 0x5a, 0x15, 0xde, 0xee, 0xcd, 0x83, 0xc7, 0xed, 0x8a, 0x52, 0x2b, 0xcb, 0x43, 0xca, 0x84, + 0xb7, 0x92, 0x3c, 0xea, 0xa0, 0xc0, 0xa9, 0x60, 0x3d, 0x8d, 0xde, 0x26, 0x93, 0x29, 0x97, 0xe8, + 0x93, 0x22, 0x17, 0x08, 0x3e, 0x29, 0x02, 0x20, 0xe8, 0xba, 0xfa, 0xef, 0xe6, 0x38, 0xf4, 0x70, + 0x82, 0x75, 0x9d, 0x56, 0x76, 0xa8, 0x50, 0xd7, 0xa1, 0x34, 0x88, 0x06, 0xc6, 0xad, 0x7e, 0x1d, + 0xff, 0x49, 0xc8, 0x0c, 0x78, 0x27, 0x7f, 0xa3, 0x17, 0x0b, 0x56, 0x14, 0xeb, 0x30, 0x99, 0x25, + 0x12, 0x5b, 0x51, 0x1c, 0x1b, 0x15, 0x12, 0x5a, 0x51, 0xda, 0x28, 0x55, 0xbd, 0x2a, 0x47, 0x38, + 0x9c, 0x84, 0xab, 0x57, 0x33, 0xfd, 0xaa, 0x67, 0xd8, 0xd6, 0x83, 0xcd, 0xcc, 0x0c, 0x19, 0x79, + 0xa5, 0x37, 0xcb, 0xc8, 0xd8, 0x56, 0xaf, 0x69, 0x42, 0x30, 0x14, 0x75, 0x28, 0x05, 0x78, 0x60, + 0x5f, 0x71, 0xcd, 0xb3, 0xd7, 0x3c, 0xe7, 0xac, 0x60, 0x59, 0x8c, 0x6e, 0x4e, 0x95, 0xc1, 0x16, + 0x19, 0xda, 0x9c, 0x92, 0x1a, 0xe0, 0xb1, 0xb9, 0xff, 0x82, 0x25, 0x32, 0x15, 0xcc, 0x9b, 0x8c, + 0xfe, 0xfb, 0x95, 0x8f, 0x7b, 0x90, 0xf0, 0xb1, 0x79, 0x03, 0x98, 0x83, 0xef, 0xda, 0xe9, 0x67, + 0x01, 0x53, 0x3e, 0x1a, 0xda, 0x08, 0xd3, 0x2a, 0x60, 0x50, 0x9b, 0x04, 0x97, 0xcb, 0x9f, 0xf0, + 0x25, 0x36, 0xa8, 0x6d, 0x7e, 0xaa, 0x90, 0xd0, 0xa0, 0x6e, 0xa3, 0x20, 0xcf, 0x74, 0xf7, 0x41, + 0xab, 0x01, 0x7d, 0x77, 0xeb, 0xb3, 0xd6, 0xc9, 0x81, 0x99, 0xb3, 0x97, 0x2c, 0xbc, 0xe7, 0x04, + 0x48, 0x41, 0xf7, 0x92, 0x05, 0xfe, 0x98, 0x60, 0xa3, 0x17, 0x0b, 0x1f, 0xc9, 0x33, 0xc9, 0xdf, + 0x35, 0xcf, 0xca, 0x91, 0xe2, 0x2a, 0x79, 0xeb, 0x61, 0xf9, 0x7a, 0x37, 0x68, 0x2f, 0xc0, 0x9e, + 0x16, 0x22, 0xe6, 0x65, 0xa9, 0xbf, 0x50, 0xe8, 0xdf, 0x30, 0xd2, 0xb2, 0x21, 0xf8, 0x3e, 0xe1, + 0xc3, 0x30, 0x64, 0x7b, 0x46, 0x8b, 0xec, 0x57, 0x6f, 0x56, 0x51, 0xcd, 0xf6, 0x07, 0x6f, 0xd6, + 0x3a, 0x39, 0x3b, 0xbd, 0xb4, 0xd4, 0xfd, 0xcc, 0xcd, 0x3a, 0xaa, 0x8e, 0x7d, 0xe1, 0xe6, 0x71, + 0x0f, 0x52, 0xbb, 0xfa, 0x2a, 0x7a, 0xff, 0x48, 0x4c, 0x47, 0x3c, 0x9b, 0x0c, 0x7e, 0xe0, 0x5f, + 0xa1, 0x15, 0xd3, 0x61, 0xf5, 0x67, 0x63, 0xf4, 0x0e, 0x25, 0xb6, 0x97, 0x00, 0xf7, 0xf8, 0xc5, + 0x7c, 0x3a, 0x92, 0x4c, 0x82, 0x4b, 0x80, 0xea, 0xef, 0xc3, 0x4a, 0x40, 0x5c, 0x02, 0xf4, 0x00, + 0x60, 0x6f, 0x5c, 0x70, 0x8e, 0xda, 0xab, 0x04, 0x41, 0x7b, 0x1a, 0xb0, 0x59, 0x84, 0xb1, 0x57, + 0x25, 0xea, 0xf0, 0xd2, 0x9e, 0xd5, 0x51, 0x52, 0x22, 0x8b, 0x68, 0x53, 0x76, 0x70, 0xd7, 0xd5, + 0x57, 0x5f, 0x1d, 0x99, 0xcf, 0x66, 0xac, 0x58, 0x82, 0xc1, 0xad, 0x6b, 0xe9, 0x00, 0xc4, 0xe0, + 0x46, 0x41, 0x3b, 0x6b, 0x9b, 0x66, 0x8e, 0xaf, 0x0f, 0x44, 0x21, 0xe6, 0x32, 0xc9, 0x38, 0xfc, + 0xf2, 0x84, 0x69, 0x50, 0x97, 0x21, 0x66, 0x2d, 0xc5, 0xda, 0x2c, 0x57, 0x11, 0xf5, 0x7d, 0x42, + 0xf5, 0xdd, 0xe2, 0x52, 0x8a, 0x02, 0x3e, 0x4f, 0xac, 0xad, 0x40, 0x88, 0xc8, 0x72, 0x49, 0x18, + 0xf4, 0xfd, 0x69, 0x92, 0x4d, 0xd1, 0xbe, 0x3f, 0x75, 0xbf, 0xfa, 0x79, 0x8f, 0x06, 0xec, 0x84, + 0xaa, 0x1b, 0xad, 0x9e, 0x00, 0xfa, 0x5d, 0x4e, 0xb4, 0xd1, 0x5d, 0x82, 0x98, 0x50, 0x38, 0x09, + 0x5c, 0xbd, 0xce, 0x79, 0xc6, 0x27, 0xcd, 0xad, 0x39, 0xcc, 0x95, 0x47, 0x04, 0x5d, 0x41, 0xd2, + 0xc6, 0x22, 0x25, 0x3f, 0x9b, 0x67, 0xa7, 0x85, 0xb8, 0x4c, 0x52, 0x5e, 0x80, 0x58, 0x54, 0xab, + 0x3b, 0x72, 0x22, 0x16, 0x61, 0x9c, 0xbd, 0x7e, 0xa1, 0xa4, 0xde, 0xc7, 0xb7, 0xc7, 0x05, 0x8b, + 0xe1, 0xf5, 0x8b, 0xda, 0x46, 0x1b, 0x23, 0x4e, 0x06, 0x03, 0xb8, 0x93, 0xe8, 0xd4, 0xae, 0xb3, + 0xa5, 0x1a, 0x1f, 0xfa, 0x5d, 0x42, 0xf5, 0x2d, 0xcc, 0x12, 0x24, 0x3a, 0xda, 0x1c, 0x46, 0x12, + 0x89, 0x4e, 0x58, 0xc3, 0x2e, 0x25, 0x8a, 0x3b, 0xd1, 0xd7, 0x8a, 0xc0, 0x52, 0x52, 0xdb, 0x68, + 0x84, 0xc4, 0x52, 0xd2, 0x82, 0x40, 0x40, 0x6a, 0xa6, 0xc1, 0x14, 0x0d, 0x48, 0x46, 0x1a, 0x0c, + 0x48, 0x2e, 0x65, 0x03, 0xc5, 0x61, 0x96, 0xc8, 0x84, 0xa5, 0x23, 0x2e, 0x4f, 0x59, 0xc1, 0x66, + 0x5c, 0xf2, 0x02, 0x06, 0x0a, 0x8d, 0x0c, 0x3d, 0x86, 0x08, 0x14, 0x14, 0xab, 0x1d, 0xfe, 0x5e, + 0xf4, 0x61, 0xb5, 0xee, 0xf3, 0x4c, 0xff, 0xcc, 0xc6, 0x2b, 0xf5, 0xfb, 0x3c, 0x83, 0x8f, 0x8c, + 0x8d, 0x91, 0x2c, 0x38, 0x9b, 0x35, 0xb6, 0x3f, 0x30, 0x7f, 0x57, 0xe0, 0xd3, 0x95, 0x6a, 0x3c, + 0x9f, 0x08, 0x99, 0x5c, 0x56, 0xdb, 0x6c, 0xfd, 0x06, 0x11, 0x18, 0xcf, 0xae, 0x78, 0x18, 0xf8, + 0x16, 0x05, 0xc6, 0xd9, 0x38, 0xed, 0x4a, 0xcf, 0x78, 0x9e, 0xc2, 0x38, 0xed, 0x69, 0x2b, 0x80, + 0x88, 0xd3, 0x28, 0x68, 0x27, 0xa7, 0x2b, 0x1e, 0xf3, 0x70, 0x65, 0xc6, 0xbc, 0x5f, 0x65, 0xc6, + 0xde, 0x4b, 0x19, 0x69, 0xf4, 0xe1, 0x31, 0x9f, 0x5d, 0xf0, 0xa2, 0xbc, 0x4a, 0xf2, 0x83, 0x2a, + 0xe1, 0x62, 0x72, 0x0e, 0x5f, 0x5b, 0xb4, 0xc4, 0xd0, 0x20, 0x44, 0x56, 0x4a, 0xa0, 0x76, 0x25, + 0xb0, 0xc0, 0x61, 0x79, 0xc2, 0x66, 0x5c, 0x7d, 0x59, 0x03, 0xac, 0x04, 0x8e, 0x11, 0x07, 0x22, + 0x56, 0x02, 0x12, 0x76, 0xde, 0xef, 0xb2, 0xcc, 0x19, 0x9f, 0x56, 0x23, 0xac, 0x38, 0x65, 0xcb, + 0x19, 0xcf, 0xa4, 0x36, 0x09, 0xce, 0xe4, 0x1d, 0x93, 0x38, 0x4f, 0x9c, 0xc9, 0xf7, 0xd1, 0x73, + 0x42, 0x93, 0xd7, 0xf0, 0xa7, 0xa2, 0x90, 0xf5, 0x8f, 0xe8, 0x9c, 0x17, 0x29, 0x08, 0x4d, 0x7e, + 0xa3, 0x7a, 0x24, 0x11, 0x9a, 0xc2, 0x1a, 0xce, 0xd7, 0xe7, 0xbd, 0x32, 0xbc, 0xe1, 0x85, 0x19, + 0x27, 0xaf, 0x66, 0x2c, 0x49, 0xf5, 0x68, 0xf8, 0x51, 0xc0, 0x36, 0xa1, 0x43, 0x7c, 0x7d, 0xbe, + 0xaf, 0xae, 0xf3, 0xbd, 0xfe, 0x70, 0x09, 0xc1, 0x23, 0x82, 0x0e, 0xfb, 0xc4, 0x23, 0x82, 0x6e, + 0x2d, 0xbb, 0x73, 0xb7, 0xac, 0xe2, 0x96, 0x8a, 0xd8, 0x15, 0x13, 0x78, 0x5e, 0xe8, 0xd8, 0x04, + 0x20, 0xb1, 0x73, 0x0f, 0x2a, 0xd8, 0xd4, 0xc0, 0x62, 0xfb, 0x49, 0xc6, 0xd2, 0xe4, 0x67, 0x30, + 0xad, 0x77, 0xec, 0x34, 0x04, 0x91, 0x1a, 0xe0, 0x24, 0xe6, 0xea, 0x80, 0xcb, 0x71, 0x52, 0x85, + 0xfe, 0xf5, 0x40, 0xbb, 0x29, 0xa2, 0xdb, 0x95, 0x43, 0x3a, 0xdf, 0x68, 0x85, 0xcd, 0xba, 0x93, + 0xe7, 0xa3, 0x6a, 0x55, 0x3d, 0xe3, 0x31, 0x4f, 0x72, 0x39, 0x78, 0x11, 0x6e, 0x2b, 0x80, 0x13, + 0x17, 0x2d, 0x7a, 0xa8, 0x39, 0x8f, 0xef, 0xab, 0x58, 0x32, 0xaa, 0x7f, 0x5d, 0xee, 0xbc, 0xe4, + 0x85, 0x4e, 0x34, 0x0e, 0xb8, 0x04, 0xb3, 0xd3, 0xe1, 0x86, 0x0e, 0x58, 0x55, 0x94, 0x98, 0x9d, + 0x61, 0x0d, 0x7b, 0xd8, 0xe7, 0x70, 0x67, 0xbc, 0x14, 0xe9, 0x82, 0xab, 0xfb, 0x86, 0x9b, 0xa4, + 0x31, 0x87, 0x22, 0x0e, 0xfb, 0x68, 0xda, 0x66, 0x6b, 0x6d, 0xb7, 0x3b, 0xd9, 0xf2, 0x10, 0x5e, + 0x99, 0x40, 0x2c, 0x29, 0x8c, 0xc8, 0xd6, 0x02, 0xb8, 0x73, 0x18, 0x5e, 0x08, 0x36, 0x89, 0x59, + 0x29, 0x4f, 0xd9, 0x32, 0x15, 0x6c, 0xa2, 0xd6, 0x75, 0x78, 0x18, 0xde, 0x30, 0x43, 0x17, 0xa2, + 0x0e, 0xc3, 0x29, 0xd8, 0xcd, 0xce, 0xd4, 0x8f, 0xe6, 0xe9, 0xbb, 0x9c, 0x30, 0x3b, 0x53, 0xe5, + 0x85, 0xf7, 0x38, 0x1f, 0x86, 0x21, 0xfb, 0x0e, 0x5a, 0x2d, 0x52, 0x69, 0xc8, 0x3d, 0x4c, 0xc7, + 0x4b, 0x40, 0x3e, 0x0d, 0x10, 0xf6, 0xbb, 0x14, 0xf5, 0xdf, 0x9b, 0xdf, 0x7d, 0x91, 0xfa, 0x4b, + 0xd6, 0x9b, 0x98, 0xae, 0x0b, 0x0d, 0xdd, 0x0f, 0xdc, 0x6d, 0xf5, 0xa4, 0x6d, 0x9a, 0xb9, 0x7b, + 0xc5, 0xe4, 0xce, 0x64, 0x72, 0xcc, 0x4b, 0xe4, 0x85, 0xf2, 0x4a, 0x38, 0xb4, 0x52, 0x22, 0xcd, + 0x6c, 0x53, 0x76, 0xa0, 0x57, 0xb2, 0x57, 0x93, 0x44, 0x6a, 0x59, 0x73, 0x43, 0x7a, 0xb3, 0x6d, + 0xa0, 0x4d, 0x11, 0xb5, 0xa2, 0x69, 0x1b, 0xcb, 0x2b, 0x66, 0x2c, 0xa6, 0xd3, 0x94, 0x6b, 0xe8, + 0x8c, 0xb3, 0xfa, 0x43, 0x7e, 0xdb, 0x6d, 0x5b, 0x28, 0x48, 0xc4, 0xf2, 0xa0, 0x82, 0x4d, 0x23, + 0x2b, 0xac, 0x7e, 0x24, 0xd5, 0x34, 0xec, 0x5a, 0xdb, 0x8c, 0x07, 0x10, 0x69, 0x24, 0x0a, 0xda, + 0xf7, 0xde, 0x2a, 0xf1, 0x01, 0x6f, 0x5a, 0x02, 0x7e, 0x82, 0x48, 0x29, 0x3b, 0x62, 0xe2, 0xbd, + 0x37, 0x04, 0xb3, 0xfb, 0x04, 0xe0, 0xe1, 0xe5, 0xf2, 0x70, 0x02, 0xf7, 0x09, 0x50, 0x5f, 0x31, + 0xc4, 0x3e, 0x81, 0x62, 0xfd, 0xae, 0x33, 0xe7, 0x5e, 0x47, 0xac, 0xb4, 0x95, 0x43, 0xba, 0x0e, + 0x05, 0x43, 0x5d, 0x47, 0x29, 0xf8, 0x4d, 0xea, 0x1e, 0xad, 0x21, 0x4d, 0x8a, 0x9d, 0xab, 0xad, + 0x76, 0x61, 0x36, 0x2e, 0x99, 0xfd, 0xa4, 0xba, 0xb2, 0x84, 0x7f, 0xc1, 0xbf, 0x16, 0x12, 0x71, + 0xa9, 0x05, 0x39, 0x3f, 0x49, 0x96, 0x27, 0x23, 0xc9, 0x0a, 0x59, 0x05, 0xe4, 0xf6, 0x4f, 0x92, + 0xe5, 0xc9, 0xd0, 0x91, 0x52, 0x3f, 0x49, 0xd6, 0xa2, 0x9c, 0x9f, 0xd9, 0xaa, 0xcc, 0x8b, 0x5c, + 0x5b, 0x7f, 0x80, 0xe8, 0x35, 0x42, 0xf2, 0x37, 0x53, 0x01, 0x54, 0xdb, 0x7e, 0xf9, 0xe9, 0x7f, + 0x7d, 0x73, 0x67, 0xe5, 0x17, 0xdf, 0xdc, 0x59, 0xf9, 0x9f, 0x6f, 0xee, 0xac, 0xfc, 0xfc, 0xdb, + 0x3b, 0xef, 0xfd, 0xe2, 0xdb, 0x3b, 0xef, 0xfd, 0xf7, 0xb7, 0x77, 0xde, 0xfb, 0xfa, 0x7d, 0xfd, + 0x3b, 0xb0, 0x17, 0xff, 0x4f, 0xfd, 0x9a, 0xeb, 0xf3, 0xff, 0x0b, 0x00, 0x00, 0xff, 0xff, 0x8e, + 0xa4, 0xab, 0x9b, 0x2b, 0x76, 0x00, 0x00, } // This is a compile-time assertion to ensure that this generated file @@ -696,6 +699,10 @@ type ClientCommandsHandler interface { ChatSubscribeLastMessages(context.Context, *pb.RpcChatSubscribeLastMessagesRequest) *pb.RpcChatSubscribeLastMessagesResponse ChatUnsubscribe(context.Context, *pb.RpcChatUnsubscribeRequest) *pb.RpcChatUnsubscribeResponse ObjectChatAdd(context.Context, *pb.RpcObjectChatAddRequest) *pb.RpcObjectChatAddResponse + // API + // *** + ApiStartServer(context.Context, *pb.RpcApiStartServerRequest) *pb.RpcApiStartServerResponse + ApiStopServer(context.Context, *pb.RpcApiStopServerRequest) *pb.RpcApiStopServerResponse } func registerClientCommandsHandler(srv ClientCommandsHandler) { @@ -6082,6 +6089,46 @@ func ObjectChatAdd(b []byte) (resp []byte) { return resp } +func ApiStartServer(b []byte) (resp []byte) { + defer func() { + if PanicHandler != nil { + if r := recover(); r != nil { + resp, _ = (&pb.RpcApiStartServerResponse{Error: &pb.RpcApiStartServerResponseError{Code: pb.RpcApiStartServerResponseError_UNKNOWN_ERROR, Description: "panic recovered"}}).Marshal() + PanicHandler(r) + } + } + }() + + in := new(pb.RpcApiStartServerRequest) + if err := in.Unmarshal(b); err != nil { + resp, _ = (&pb.RpcApiStartServerResponse{Error: &pb.RpcApiStartServerResponseError{Code: pb.RpcApiStartServerResponseError_BAD_INPUT, Description: err.Error()}}).Marshal() + return resp + } + + resp, _ = clientCommandsHandler.ApiStartServer(context.Background(), in).Marshal() + return resp +} + +func ApiStopServer(b []byte) (resp []byte) { + defer func() { + if PanicHandler != nil { + if r := recover(); r != nil { + resp, _ = (&pb.RpcApiStopServerResponse{Error: &pb.RpcApiStopServerResponseError{Code: pb.RpcApiStopServerResponseError_UNKNOWN_ERROR, Description: "panic recovered"}}).Marshal() + PanicHandler(r) + } + } + }() + + in := new(pb.RpcApiStopServerRequest) + if err := in.Unmarshal(b); err != nil { + resp, _ = (&pb.RpcApiStopServerResponse{Error: &pb.RpcApiStopServerResponseError{Code: pb.RpcApiStopServerResponseError_BAD_INPUT, Description: err.Error()}}).Marshal() + return resp + } + + resp, _ = clientCommandsHandler.ApiStopServer(context.Background(), in).Marshal() + return resp +} + var PanicHandler func(v interface{}) func CommandAsync(cmd string, data []byte, callback func(data []byte)) { @@ -6626,6 +6673,10 @@ func CommandAsync(cmd string, data []byte, callback func(data []byte)) { cd = ChatUnsubscribe(data) case "ObjectChatAdd": cd = ObjectChatAdd(data) + case "ApiStartServer": + cd = ApiStartServer(data) + case "ApiStopServer": + cd = ApiStopServer(data) default: log.Errorf("unknown command type: %s\n", cmd) } @@ -10414,3 +10465,31 @@ func (h *ClientCommandsHandlerProxy) ObjectChatAdd(ctx context.Context, req *pb. call, _ := actualCall(ctx, req) return call.(*pb.RpcObjectChatAddResponse) } +func (h *ClientCommandsHandlerProxy) ApiStartServer(ctx context.Context, req *pb.RpcApiStartServerRequest) *pb.RpcApiStartServerResponse { + actualCall := func(ctx context.Context, req any) (any, error) { + return h.client.ApiStartServer(ctx, req.(*pb.RpcApiStartServerRequest)), nil + } + for _, interceptor := range h.interceptors { + toCall := actualCall + currentInterceptor := interceptor + actualCall = func(ctx context.Context, req any) (any, error) { + return currentInterceptor(ctx, req, "ApiStartServer", toCall) + } + } + call, _ := actualCall(ctx, req) + return call.(*pb.RpcApiStartServerResponse) +} +func (h *ClientCommandsHandlerProxy) ApiStopServer(ctx context.Context, req *pb.RpcApiStopServerRequest) *pb.RpcApiStopServerResponse { + actualCall := func(ctx context.Context, req any) (any, error) { + return h.client.ApiStopServer(ctx, req.(*pb.RpcApiStopServerRequest)), nil + } + for _, interceptor := range h.interceptors { + toCall := actualCall + currentInterceptor := interceptor + actualCall = func(ctx context.Context, req any) (any, error) { + return currentInterceptor(ctx, req, "ApiStopServer", toCall) + } + } + call, _ := actualCall(ctx, req) + return call.(*pb.RpcApiStopServerResponse) +} diff --git a/core/api/service.go b/core/api/service.go index d7b1d1507..13ceeab58 100644 --- a/core/api/service.go +++ b/core/api/service.go @@ -2,8 +2,10 @@ package api import ( "context" + "errors" "fmt" "net/http" + "strings" "time" "github.com/anyproto/any-sync/app" @@ -19,10 +21,15 @@ const ( ) var ( - mwSrv service.ClientCommandsServer + mwSrv service.ClientCommandsServer + ErrPortAlreadyUsed = fmt.Errorf("port %s is already in use", httpPort) + ErrServerAlreadyStarted = fmt.Errorf("server already started") + ErrServerNotStarted = fmt.Errorf("server not started") ) type Api interface { + Start() error + Stop() error app.ComponentRunnable } @@ -59,24 +66,27 @@ func (s *apiService) Name() (name string) { // @externalDocs.description OpenAPI // @externalDocs.url https://swagger.io/resources/open-api/ func (s *apiService) Init(a *app.App) (err error) { - fmt.Println("Initializing API service...") - s.srv = server.NewServer(a, s.mw) + return nil +} + +func (s *apiService) Run(ctx context.Context) (err error) { + // TODO: remove once client takes responsibility s.httpSrv = &http.Server{ Addr: httpPort, Handler: s.srv.Engine(), ReadHeaderTimeout: timeout, } - return nil -} - -func (s *apiService) Run(ctx context.Context) (err error) { fmt.Printf("Starting API server on %s\n", s.httpSrv.Addr) go func() { - if err := s.httpSrv.ListenAndServe(); err != nil && err != http.ErrServerClosed { - fmt.Printf("API server ListenAndServe error: %v\n", err) + if err := s.httpSrv.ListenAndServe(); err != nil && !errors.Is(err, http.ErrServerClosed) { + if strings.Contains(err.Error(), "address already in use") { + fmt.Printf("API server ListenAndServe error: %v\n", ErrPortAlreadyUsed) + } else { + fmt.Printf("API server ListenAndServe error: %v\n", err) + } } }() @@ -84,18 +94,59 @@ func (s *apiService) Run(ctx context.Context) (err error) { } func (s *apiService) Close(ctx context.Context) (err error) { - fmt.Println("Closing API service...") + if s.httpSrv == nil { + return nil + } - // Give the server a short time to finish ongoing requests. shutdownCtx, cancel := context.WithTimeout(ctx, timeout) defer cancel() if err := s.httpSrv.Shutdown(shutdownCtx); err != nil { - fmt.Printf("API server shutdown error: %v\n", err) return err } - fmt.Println("API service stopped gracefully.") + return nil +} + +func (s *apiService) Start() error { + if s.httpSrv != nil { + return ErrServerAlreadyStarted + } + + s.httpSrv = &http.Server{ + Addr: httpPort, + Handler: s.srv.Engine(), + ReadHeaderTimeout: timeout, + } + + fmt.Printf("Starting API server on %s\n", s.httpSrv.Addr) + + go func() { + if err := s.httpSrv.ListenAndServe(); err != nil && !errors.Is(err, http.ErrServerClosed) { + if strings.Contains(err.Error(), "address already in use") { + fmt.Printf("API server ListenAndServe error: %v\n", ErrPortAlreadyUsed) + } else { + fmt.Printf("API server ListenAndServe error: %v\n", err) + } + } + }() + + return nil +} +func (s *apiService) Stop() error { + if s.httpSrv == nil { + return ErrServerNotStarted + } + + shutdownCtx, cancel := context.WithTimeout(context.Background(), timeout) + defer cancel() + + if err := s.httpSrv.Shutdown(shutdownCtx); err != nil { + return err + } + + // Clear the server reference to allow reinitialization + s.httpSrv = nil return nil } diff --git a/docs/proto.md b/docs/proto.md index c7d539e7e..1ff0ea3dd 100644 --- a/docs/proto.md +++ b/docs/proto.md @@ -107,6 +107,15 @@ - [Rpc.Account.Stop.Request](#anytype-Rpc-Account-Stop-Request) - [Rpc.Account.Stop.Response](#anytype-Rpc-Account-Stop-Response) - [Rpc.Account.Stop.Response.Error](#anytype-Rpc-Account-Stop-Response-Error) + - [Rpc.Api](#anytype-Rpc-Api) + - [Rpc.Api.StartServer](#anytype-Rpc-Api-StartServer) + - [Rpc.Api.StartServer.Request](#anytype-Rpc-Api-StartServer-Request) + - [Rpc.Api.StartServer.Response](#anytype-Rpc-Api-StartServer-Response) + - [Rpc.Api.StartServer.Response.Error](#anytype-Rpc-Api-StartServer-Response-Error) + - [Rpc.Api.StopServer](#anytype-Rpc-Api-StopServer) + - [Rpc.Api.StopServer.Request](#anytype-Rpc-Api-StopServer-Request) + - [Rpc.Api.StopServer.Response](#anytype-Rpc-Api-StopServer-Response) + - [Rpc.Api.StopServer.Response.Error](#anytype-Rpc-Api-StopServer-Response-Error) - [Rpc.App](#anytype-Rpc-App) - [Rpc.App.GetVersion](#anytype-Rpc-App-GetVersion) - [Rpc.App.GetVersion.Request](#anytype-Rpc-App-GetVersion-Request) @@ -1267,6 +1276,8 @@ - [Rpc.Account.RevertDeletion.Response.Error.Code](#anytype-Rpc-Account-RevertDeletion-Response-Error-Code) - [Rpc.Account.Select.Response.Error.Code](#anytype-Rpc-Account-Select-Response-Error-Code) - [Rpc.Account.Stop.Response.Error.Code](#anytype-Rpc-Account-Stop-Response-Error-Code) + - [Rpc.Api.StartServer.Response.Error.Code](#anytype-Rpc-Api-StartServer-Response-Error-Code) + - [Rpc.Api.StopServer.Response.Error.Code](#anytype-Rpc-Api-StopServer-Response-Error-Code) - [Rpc.App.GetVersion.Response.Error.Code](#anytype-Rpc-App-GetVersion-Response-Error-Code) - [Rpc.App.SetDeviceState.Request.DeviceState](#anytype-Rpc-App-SetDeviceState-Request-DeviceState) - [Rpc.App.SetDeviceState.Response.Error.Code](#anytype-Rpc-App-SetDeviceState-Response-Error-Code) @@ -2233,6 +2244,8 @@ | ChatSubscribeLastMessages | [Rpc.Chat.SubscribeLastMessages.Request](#anytype-Rpc-Chat-SubscribeLastMessages-Request) | [Rpc.Chat.SubscribeLastMessages.Response](#anytype-Rpc-Chat-SubscribeLastMessages-Response) | | | ChatUnsubscribe | [Rpc.Chat.Unsubscribe.Request](#anytype-Rpc-Chat-Unsubscribe-Request) | [Rpc.Chat.Unsubscribe.Response](#anytype-Rpc-Chat-Unsubscribe-Response) | | | ObjectChatAdd | [Rpc.Object.ChatAdd.Request](#anytype-Rpc-Object-ChatAdd-Request) | [Rpc.Object.ChatAdd.Response](#anytype-Rpc-Object-ChatAdd-Response) | | +| ApiStartServer | [Rpc.Api.StartServer.Request](#anytype-Rpc-Api-StartServer-Request) | [Rpc.Api.StartServer.Response](#anytype-Rpc-Api-StartServer-Response) | API *** | +| ApiStopServer | [Rpc.Api.StopServer.Request](#anytype-Rpc-Api-StopServer-Request) | [Rpc.Api.StopServer.Response](#anytype-Rpc-Api-StopServer-Response) | | @@ -3702,6 +3715,118 @@ Middleware-to-front-end response for an account stop request + + +### Rpc.Api + + + + + + + + + +### Rpc.Api.StartServer + + + + + + + + + +### Rpc.Api.StartServer.Request +empty + + + + + + + + +### Rpc.Api.StartServer.Response + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| error | [Rpc.Api.StartServer.Response.Error](#anytype-Rpc-Api-StartServer-Response-Error) | | | + + + + + + + + +### Rpc.Api.StartServer.Response.Error + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| code | [Rpc.Api.StartServer.Response.Error.Code](#anytype-Rpc-Api-StartServer-Response-Error-Code) | | | +| description | [string](#string) | | | + + + + + + + + +### Rpc.Api.StopServer + + + + + + + + + +### Rpc.Api.StopServer.Request +empty + + + + + + + + +### Rpc.Api.StopServer.Response + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| error | [Rpc.Api.StopServer.Response.Error](#anytype-Rpc-Api-StopServer-Response-Error) | | | + + + + + + + + +### Rpc.Api.StopServer.Response.Error + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| code | [Rpc.Api.StopServer.Response.Error.Code](#anytype-Rpc-Api-StopServer-Response-Error-Code) | | | +| description | [string](#string) | | | + + + + + + ### Rpc.App @@ -20602,6 +20727,35 @@ Middleware-to-front-end response, that can contain a NULL error or a non-NULL er + + +### Rpc.Api.StartServer.Response.Error.Code + + +| Name | Number | Description | +| ---- | ------ | ----------- | +| NULL | 0 | | +| UNKNOWN_ERROR | 1 | | +| BAD_INPUT | 2 | | +| PORT_ALREADY_USED | 3 | | +| SERVER_ALREADY_STARTED | 4 | | + + + + + +### Rpc.Api.StopServer.Response.Error.Code + + +| Name | Number | Description | +| ---- | ------ | ----------- | +| NULL | 0 | | +| UNKNOWN_ERROR | 1 | | +| BAD_INPUT | 2 | | +| SERVER_NOT_STARTED | 3 | | + + + ### Rpc.App.GetVersion.Response.Error.Code diff --git a/pb/commands.pb.go b/pb/commands.pb.go index 57d40ca5f..288670d9e 100644 --- a/pb/commands.pb.go +++ b/pb/commands.pb.go @@ -9034,6 +9034,71 @@ func (RpcChatUnsubscribeResponseErrorCode) EnumDescriptor() ([]byte, []int) { return fileDescriptor_8261c968b2e6f45c, []int{0, 40, 7, 1, 0, 0} } +type RpcApiStartServerResponseErrorCode int32 + +const ( + RpcApiStartServerResponseError_NULL RpcApiStartServerResponseErrorCode = 0 + RpcApiStartServerResponseError_UNKNOWN_ERROR RpcApiStartServerResponseErrorCode = 1 + RpcApiStartServerResponseError_BAD_INPUT RpcApiStartServerResponseErrorCode = 2 + RpcApiStartServerResponseError_PORT_ALREADY_USED RpcApiStartServerResponseErrorCode = 3 + RpcApiStartServerResponseError_SERVER_ALREADY_STARTED RpcApiStartServerResponseErrorCode = 4 +) + +var RpcApiStartServerResponseErrorCode_name = map[int32]string{ + 0: "NULL", + 1: "UNKNOWN_ERROR", + 2: "BAD_INPUT", + 3: "PORT_ALREADY_USED", + 4: "SERVER_ALREADY_STARTED", +} + +var RpcApiStartServerResponseErrorCode_value = map[string]int32{ + "NULL": 0, + "UNKNOWN_ERROR": 1, + "BAD_INPUT": 2, + "PORT_ALREADY_USED": 3, + "SERVER_ALREADY_STARTED": 4, +} + +func (x RpcApiStartServerResponseErrorCode) String() string { + return proto.EnumName(RpcApiStartServerResponseErrorCode_name, int32(x)) +} + +func (RpcApiStartServerResponseErrorCode) EnumDescriptor() ([]byte, []int) { + return fileDescriptor_8261c968b2e6f45c, []int{0, 41, 0, 1, 0, 0} +} + +type RpcApiStopServerResponseErrorCode int32 + +const ( + RpcApiStopServerResponseError_NULL RpcApiStopServerResponseErrorCode = 0 + RpcApiStopServerResponseError_UNKNOWN_ERROR RpcApiStopServerResponseErrorCode = 1 + RpcApiStopServerResponseError_BAD_INPUT RpcApiStopServerResponseErrorCode = 2 + RpcApiStopServerResponseError_SERVER_NOT_STARTED RpcApiStopServerResponseErrorCode = 3 +) + +var RpcApiStopServerResponseErrorCode_name = map[int32]string{ + 0: "NULL", + 1: "UNKNOWN_ERROR", + 2: "BAD_INPUT", + 3: "SERVER_NOT_STARTED", +} + +var RpcApiStopServerResponseErrorCode_value = map[string]int32{ + "NULL": 0, + "UNKNOWN_ERROR": 1, + "BAD_INPUT": 2, + "SERVER_NOT_STARTED": 3, +} + +func (x RpcApiStopServerResponseErrorCode) String() string { + return proto.EnumName(RpcApiStopServerResponseErrorCode_name, int32(x)) +} + +func (RpcApiStopServerResponseErrorCode) EnumDescriptor() ([]byte, []int) { + return fileDescriptor_8261c968b2e6f45c, []int{0, 41, 1, 1, 0, 0} +} + // Rpc is a namespace, that agregates all of the service commands between client and middleware. // Structure: Topic > Subtopic > Subsub... > Action > (Request, Response). // Request – message from a client. @@ -69181,6 +69246,378 @@ func (m *RpcChatUnsubscribeResponseError) GetDescription() string { return "" } +type RpcApi struct { +} + +func (m *RpcApi) Reset() { *m = RpcApi{} } +func (m *RpcApi) String() string { return proto.CompactTextString(m) } +func (*RpcApi) ProtoMessage() {} +func (*RpcApi) Descriptor() ([]byte, []int) { + return fileDescriptor_8261c968b2e6f45c, []int{0, 41} +} +func (m *RpcApi) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *RpcApi) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_RpcApi.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 *RpcApi) XXX_Merge(src proto.Message) { + xxx_messageInfo_RpcApi.Merge(m, src) +} +func (m *RpcApi) XXX_Size() int { + return m.Size() +} +func (m *RpcApi) XXX_DiscardUnknown() { + xxx_messageInfo_RpcApi.DiscardUnknown(m) +} + +var xxx_messageInfo_RpcApi proto.InternalMessageInfo + +type RpcApiStartServer struct { +} + +func (m *RpcApiStartServer) Reset() { *m = RpcApiStartServer{} } +func (m *RpcApiStartServer) String() string { return proto.CompactTextString(m) } +func (*RpcApiStartServer) ProtoMessage() {} +func (*RpcApiStartServer) Descriptor() ([]byte, []int) { + return fileDescriptor_8261c968b2e6f45c, []int{0, 41, 0} +} +func (m *RpcApiStartServer) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *RpcApiStartServer) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_RpcApiStartServer.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 *RpcApiStartServer) XXX_Merge(src proto.Message) { + xxx_messageInfo_RpcApiStartServer.Merge(m, src) +} +func (m *RpcApiStartServer) XXX_Size() int { + return m.Size() +} +func (m *RpcApiStartServer) XXX_DiscardUnknown() { + xxx_messageInfo_RpcApiStartServer.DiscardUnknown(m) +} + +var xxx_messageInfo_RpcApiStartServer proto.InternalMessageInfo + +type RpcApiStartServerRequest struct { +} + +func (m *RpcApiStartServerRequest) Reset() { *m = RpcApiStartServerRequest{} } +func (m *RpcApiStartServerRequest) String() string { return proto.CompactTextString(m) } +func (*RpcApiStartServerRequest) ProtoMessage() {} +func (*RpcApiStartServerRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_8261c968b2e6f45c, []int{0, 41, 0, 0} +} +func (m *RpcApiStartServerRequest) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *RpcApiStartServerRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_RpcApiStartServerRequest.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 *RpcApiStartServerRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_RpcApiStartServerRequest.Merge(m, src) +} +func (m *RpcApiStartServerRequest) XXX_Size() int { + return m.Size() +} +func (m *RpcApiStartServerRequest) XXX_DiscardUnknown() { + xxx_messageInfo_RpcApiStartServerRequest.DiscardUnknown(m) +} + +var xxx_messageInfo_RpcApiStartServerRequest proto.InternalMessageInfo + +type RpcApiStartServerResponse struct { + Error *RpcApiStartServerResponseError `protobuf:"bytes,1,opt,name=error,proto3" json:"error,omitempty"` +} + +func (m *RpcApiStartServerResponse) Reset() { *m = RpcApiStartServerResponse{} } +func (m *RpcApiStartServerResponse) String() string { return proto.CompactTextString(m) } +func (*RpcApiStartServerResponse) ProtoMessage() {} +func (*RpcApiStartServerResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_8261c968b2e6f45c, []int{0, 41, 0, 1} +} +func (m *RpcApiStartServerResponse) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *RpcApiStartServerResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_RpcApiStartServerResponse.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 *RpcApiStartServerResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_RpcApiStartServerResponse.Merge(m, src) +} +func (m *RpcApiStartServerResponse) XXX_Size() int { + return m.Size() +} +func (m *RpcApiStartServerResponse) XXX_DiscardUnknown() { + xxx_messageInfo_RpcApiStartServerResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_RpcApiStartServerResponse proto.InternalMessageInfo + +func (m *RpcApiStartServerResponse) GetError() *RpcApiStartServerResponseError { + if m != nil { + return m.Error + } + return nil +} + +type RpcApiStartServerResponseError struct { + Code RpcApiStartServerResponseErrorCode `protobuf:"varint,1,opt,name=code,proto3,enum=anytype.RpcApiStartServerResponseErrorCode" json:"code,omitempty"` + Description string `protobuf:"bytes,2,opt,name=description,proto3" json:"description,omitempty"` +} + +func (m *RpcApiStartServerResponseError) Reset() { *m = RpcApiStartServerResponseError{} } +func (m *RpcApiStartServerResponseError) String() string { return proto.CompactTextString(m) } +func (*RpcApiStartServerResponseError) ProtoMessage() {} +func (*RpcApiStartServerResponseError) Descriptor() ([]byte, []int) { + return fileDescriptor_8261c968b2e6f45c, []int{0, 41, 0, 1, 0} +} +func (m *RpcApiStartServerResponseError) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *RpcApiStartServerResponseError) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_RpcApiStartServerResponseError.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 *RpcApiStartServerResponseError) XXX_Merge(src proto.Message) { + xxx_messageInfo_RpcApiStartServerResponseError.Merge(m, src) +} +func (m *RpcApiStartServerResponseError) XXX_Size() int { + return m.Size() +} +func (m *RpcApiStartServerResponseError) XXX_DiscardUnknown() { + xxx_messageInfo_RpcApiStartServerResponseError.DiscardUnknown(m) +} + +var xxx_messageInfo_RpcApiStartServerResponseError proto.InternalMessageInfo + +func (m *RpcApiStartServerResponseError) GetCode() RpcApiStartServerResponseErrorCode { + if m != nil { + return m.Code + } + return RpcApiStartServerResponseError_NULL +} + +func (m *RpcApiStartServerResponseError) GetDescription() string { + if m != nil { + return m.Description + } + return "" +} + +type RpcApiStopServer struct { +} + +func (m *RpcApiStopServer) Reset() { *m = RpcApiStopServer{} } +func (m *RpcApiStopServer) String() string { return proto.CompactTextString(m) } +func (*RpcApiStopServer) ProtoMessage() {} +func (*RpcApiStopServer) Descriptor() ([]byte, []int) { + return fileDescriptor_8261c968b2e6f45c, []int{0, 41, 1} +} +func (m *RpcApiStopServer) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *RpcApiStopServer) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_RpcApiStopServer.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 *RpcApiStopServer) XXX_Merge(src proto.Message) { + xxx_messageInfo_RpcApiStopServer.Merge(m, src) +} +func (m *RpcApiStopServer) XXX_Size() int { + return m.Size() +} +func (m *RpcApiStopServer) XXX_DiscardUnknown() { + xxx_messageInfo_RpcApiStopServer.DiscardUnknown(m) +} + +var xxx_messageInfo_RpcApiStopServer proto.InternalMessageInfo + +type RpcApiStopServerRequest struct { +} + +func (m *RpcApiStopServerRequest) Reset() { *m = RpcApiStopServerRequest{} } +func (m *RpcApiStopServerRequest) String() string { return proto.CompactTextString(m) } +func (*RpcApiStopServerRequest) ProtoMessage() {} +func (*RpcApiStopServerRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_8261c968b2e6f45c, []int{0, 41, 1, 0} +} +func (m *RpcApiStopServerRequest) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *RpcApiStopServerRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_RpcApiStopServerRequest.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 *RpcApiStopServerRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_RpcApiStopServerRequest.Merge(m, src) +} +func (m *RpcApiStopServerRequest) XXX_Size() int { + return m.Size() +} +func (m *RpcApiStopServerRequest) XXX_DiscardUnknown() { + xxx_messageInfo_RpcApiStopServerRequest.DiscardUnknown(m) +} + +var xxx_messageInfo_RpcApiStopServerRequest proto.InternalMessageInfo + +type RpcApiStopServerResponse struct { + Error *RpcApiStopServerResponseError `protobuf:"bytes,1,opt,name=error,proto3" json:"error,omitempty"` +} + +func (m *RpcApiStopServerResponse) Reset() { *m = RpcApiStopServerResponse{} } +func (m *RpcApiStopServerResponse) String() string { return proto.CompactTextString(m) } +func (*RpcApiStopServerResponse) ProtoMessage() {} +func (*RpcApiStopServerResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_8261c968b2e6f45c, []int{0, 41, 1, 1} +} +func (m *RpcApiStopServerResponse) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *RpcApiStopServerResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_RpcApiStopServerResponse.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 *RpcApiStopServerResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_RpcApiStopServerResponse.Merge(m, src) +} +func (m *RpcApiStopServerResponse) XXX_Size() int { + return m.Size() +} +func (m *RpcApiStopServerResponse) XXX_DiscardUnknown() { + xxx_messageInfo_RpcApiStopServerResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_RpcApiStopServerResponse proto.InternalMessageInfo + +func (m *RpcApiStopServerResponse) GetError() *RpcApiStopServerResponseError { + if m != nil { + return m.Error + } + return nil +} + +type RpcApiStopServerResponseError struct { + Code RpcApiStopServerResponseErrorCode `protobuf:"varint,1,opt,name=code,proto3,enum=anytype.RpcApiStopServerResponseErrorCode" json:"code,omitempty"` + Description string `protobuf:"bytes,2,opt,name=description,proto3" json:"description,omitempty"` +} + +func (m *RpcApiStopServerResponseError) Reset() { *m = RpcApiStopServerResponseError{} } +func (m *RpcApiStopServerResponseError) String() string { return proto.CompactTextString(m) } +func (*RpcApiStopServerResponseError) ProtoMessage() {} +func (*RpcApiStopServerResponseError) Descriptor() ([]byte, []int) { + return fileDescriptor_8261c968b2e6f45c, []int{0, 41, 1, 1, 0} +} +func (m *RpcApiStopServerResponseError) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *RpcApiStopServerResponseError) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_RpcApiStopServerResponseError.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 *RpcApiStopServerResponseError) XXX_Merge(src proto.Message) { + xxx_messageInfo_RpcApiStopServerResponseError.Merge(m, src) +} +func (m *RpcApiStopServerResponseError) XXX_Size() int { + return m.Size() +} +func (m *RpcApiStopServerResponseError) XXX_DiscardUnknown() { + xxx_messageInfo_RpcApiStopServerResponseError.DiscardUnknown(m) +} + +var xxx_messageInfo_RpcApiStopServerResponseError proto.InternalMessageInfo + +func (m *RpcApiStopServerResponseError) GetCode() RpcApiStopServerResponseErrorCode { + if m != nil { + return m.Code + } + return RpcApiStopServerResponseError_NULL +} + +func (m *RpcApiStopServerResponseError) GetDescription() string { + if m != nil { + return m.Description + } + return "" +} + type Empty struct { } @@ -69564,6 +70001,8 @@ func init() { proto.RegisterEnum("anytype.RpcChatGetMessagesByIdsResponseErrorCode", RpcChatGetMessagesByIdsResponseErrorCode_name, RpcChatGetMessagesByIdsResponseErrorCode_value) proto.RegisterEnum("anytype.RpcChatSubscribeLastMessagesResponseErrorCode", RpcChatSubscribeLastMessagesResponseErrorCode_name, RpcChatSubscribeLastMessagesResponseErrorCode_value) proto.RegisterEnum("anytype.RpcChatUnsubscribeResponseErrorCode", RpcChatUnsubscribeResponseErrorCode_name, RpcChatUnsubscribeResponseErrorCode_value) + proto.RegisterEnum("anytype.RpcApiStartServerResponseErrorCode", RpcApiStartServerResponseErrorCode_name, RpcApiStartServerResponseErrorCode_value) + proto.RegisterEnum("anytype.RpcApiStopServerResponseErrorCode", RpcApiStopServerResponseErrorCode_name, RpcApiStopServerResponseErrorCode_value) proto.RegisterType((*Rpc)(nil), "anytype.Rpc") proto.RegisterType((*RpcApp)(nil), "anytype.Rpc.App") proto.RegisterType((*RpcAppGetVersion)(nil), "anytype.Rpc.App.GetVersion") @@ -70766,6 +71205,15 @@ func init() { proto.RegisterType((*RpcChatUnsubscribeRequest)(nil), "anytype.Rpc.Chat.Unsubscribe.Request") proto.RegisterType((*RpcChatUnsubscribeResponse)(nil), "anytype.Rpc.Chat.Unsubscribe.Response") proto.RegisterType((*RpcChatUnsubscribeResponseError)(nil), "anytype.Rpc.Chat.Unsubscribe.Response.Error") + proto.RegisterType((*RpcApi)(nil), "anytype.Rpc.Api") + proto.RegisterType((*RpcApiStartServer)(nil), "anytype.Rpc.Api.StartServer") + proto.RegisterType((*RpcApiStartServerRequest)(nil), "anytype.Rpc.Api.StartServer.Request") + proto.RegisterType((*RpcApiStartServerResponse)(nil), "anytype.Rpc.Api.StartServer.Response") + proto.RegisterType((*RpcApiStartServerResponseError)(nil), "anytype.Rpc.Api.StartServer.Response.Error") + proto.RegisterType((*RpcApiStopServer)(nil), "anytype.Rpc.Api.StopServer") + proto.RegisterType((*RpcApiStopServerRequest)(nil), "anytype.Rpc.Api.StopServer.Request") + proto.RegisterType((*RpcApiStopServerResponse)(nil), "anytype.Rpc.Api.StopServer.Response") + proto.RegisterType((*RpcApiStopServerResponseError)(nil), "anytype.Rpc.Api.StopServer.Response.Error") proto.RegisterType((*Empty)(nil), "anytype.Empty") proto.RegisterType((*StreamRequest)(nil), "anytype.StreamRequest") proto.RegisterExtension(E_NoAuth) @@ -70774,1209 +71222,1217 @@ func init() { func init() { proto.RegisterFile("pb/protos/commands.proto", fileDescriptor_8261c968b2e6f45c) } var fileDescriptor_8261c968b2e6f45c = []byte{ - // 19227 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0xbd, 0x7f, 0x9c, 0x23, 0x47, - 0x75, 0x2f, 0xba, 0x52, 0x4b, 0x9a, 0x99, 0x33, 0x3f, 0x56, 0xdb, 0xde, 0x5d, 0xaf, 0xcb, 0x66, - 0x6d, 0xd6, 0xc6, 0x38, 0xc6, 0x8c, 0x8d, 0x21, 0x80, 0x8d, 0x8d, 0xad, 0xd1, 0x68, 0x66, 0x64, - 0xcf, 0x48, 0x43, 0x4b, 0xb3, 0x8b, 0x93, 0x9b, 0xa7, 0xdb, 0x2b, 0xd5, 0xcc, 0xb4, 0x57, 0xd3, - 0xad, 0xb4, 0x7a, 0x66, 0xbd, 0xbc, 0xcf, 0x7d, 0x37, 0x84, 0x98, 0x1f, 0x21, 0x5c, 0x42, 0x08, - 0x49, 0xf8, 0x0d, 0x06, 0xc3, 0x85, 0x04, 0x08, 0xbf, 0x2f, 0x24, 0x01, 0xc2, 0x8f, 0x40, 0x48, - 0x42, 0x08, 0x84, 0x40, 0x48, 0x78, 0x81, 0x40, 0x08, 0x79, 0x9f, 0x10, 0x5e, 0xf2, 0x6e, 0xe0, - 0x92, 0x84, 0x97, 0xf7, 0xe9, 0xaa, 0xea, 0xee, 0x2a, 0x8d, 0xba, 0x55, 0xad, 0x51, 0x6b, 0x4c, - 0x78, 0xff, 0x75, 0x57, 0x57, 0x9f, 0x3a, 0x75, 0xbe, 0xa7, 0xaa, 0x4e, 0x55, 0x9d, 0x3a, 0x05, + // 19346 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0xbd, 0x7b, 0x98, 0x24, 0x47, + 0x75, 0x27, 0x3a, 0x95, 0x59, 0x55, 0xdd, 0x7d, 0xfa, 0x31, 0x35, 0xa9, 0x99, 0xd1, 0x28, 0x24, + 0x46, 0xf2, 0x48, 0x08, 0x59, 0x88, 0x96, 0x10, 0x18, 0x23, 0x21, 0x21, 0x55, 0x57, 0x67, 0x77, + 0x97, 0xd4, 0x5d, 0xd5, 0x64, 0x55, 0xcf, 0x20, 0xef, 0xfa, 0xd6, 0xe6, 0x54, 0x45, 0x77, 0xa7, + 0xa6, 0x3a, 0xb3, 0x9c, 0x95, 0xdd, 0xa3, 0xe1, 0x7e, 0x7b, 0xd7, 0x18, 0x8b, 0x87, 0x31, 0x8b, + 0x31, 0xc6, 0x36, 0x6f, 0x10, 0x08, 0x16, 0x6c, 0xc0, 0xbc, 0x17, 0x6c, 0xf3, 0xc6, 0x60, 0x6c, + 0x63, 0x0c, 0xe6, 0x61, 0x6c, 0xae, 0xc1, 0x60, 0x8c, 0xef, 0x67, 0x96, 0x6b, 0xdf, 0x35, 0x2c, + 0xb6, 0xb9, 0xdc, 0x2f, 0x23, 0x23, 0x33, 0x23, 0xaa, 0x2b, 0xb3, 0x22, 0xab, 0x2b, 0xab, 0x85, + 0xb9, 0xff, 0x65, 0x46, 0x46, 0x9e, 0x38, 0x71, 0x7e, 0x27, 0x22, 0x4e, 0x44, 0x9c, 0x38, 0x01, 0xa7, 0x3a, 0xe7, 0x6f, 0xee, 0xd8, 0x96, 0x63, 0x75, 0x6f, 0x6e, 0x5a, 0x3b, 0x3b, 0xba, 0xd9, - 0xea, 0xce, 0x93, 0x77, 0x75, 0x42, 0x37, 0x2f, 0x39, 0x97, 0x3a, 0x18, 0x5d, 0xd7, 0xb9, 0xb0, - 0x75, 0x73, 0xdb, 0x38, 0x7f, 0x73, 0xe7, 0xfc, 0xcd, 0x3b, 0x56, 0x0b, 0xb7, 0xbd, 0x1f, 0xc8, - 0x0b, 0xcb, 0x8e, 0x6e, 0x08, 0xcb, 0xd5, 0xb6, 0x9a, 0x7a, 0xbb, 0xeb, 0x58, 0x36, 0x66, 0x39, - 0x4f, 0x06, 0x45, 0xe2, 0x3d, 0x6c, 0x3a, 0x1e, 0x85, 0xab, 0xb6, 0x2c, 0x6b, 0xab, 0x8d, 0xe9, - 0xb7, 0xf3, 0xbb, 0x9b, 0x37, 0x77, 0x1d, 0x7b, 0xb7, 0xe9, 0xb0, 0xaf, 0xd7, 0xf4, 0x7e, 0x6d, - 0xe1, 0x6e, 0xd3, 0x36, 0x3a, 0x8e, 0x65, 0xd3, 0x1c, 0x67, 0xfe, 0xe1, 0x5f, 0x26, 0x40, 0xd1, - 0x3a, 0x4d, 0xf4, 0xdd, 0x09, 0x50, 0x0a, 0x9d, 0x0e, 0xfa, 0x44, 0x1a, 0x60, 0x19, 0x3b, 0x67, - 0xb1, 0xdd, 0x35, 0x2c, 0x13, 0x1d, 0x85, 0x09, 0x0d, 0xff, 0xf4, 0x2e, 0xee, 0x3a, 0xb7, 0x67, - 0x9e, 0xff, 0x4d, 0x25, 0x85, 0x1e, 0x4e, 0xc3, 0xa4, 0x86, 0xbb, 0x1d, 0xcb, 0xec, 0x62, 0xf5, - 0x6e, 0xc8, 0x62, 0xdb, 0xb6, 0xec, 0x53, 0xa9, 0x6b, 0x52, 0x37, 0x4c, 0xdf, 0x7a, 0xe3, 0x3c, - 0xab, 0xfe, 0xbc, 0xd6, 0x69, 0xce, 0x17, 0x3a, 0x9d, 0xf9, 0x80, 0xd2, 0xbc, 0xf7, 0xd3, 0x7c, - 0xc9, 0xfd, 0x43, 0xa3, 0x3f, 0xaa, 0xa7, 0x60, 0x62, 0x8f, 0x66, 0x38, 0x95, 0xbe, 0x26, 0x75, - 0xc3, 0x94, 0xe6, 0xbd, 0xba, 0x5f, 0x5a, 0xd8, 0xd1, 0x8d, 0x76, 0xf7, 0x94, 0x42, 0xbf, 0xb0, - 0x57, 0xf4, 0x50, 0x0a, 0xb2, 0x84, 0x88, 0x5a, 0x84, 0x4c, 0xd3, 0x6a, 0x61, 0x52, 0xfc, 0xdc, - 0xad, 0x37, 0xcb, 0x17, 0x3f, 0x5f, 0xb4, 0x5a, 0x58, 0x23, 0x3f, 0xab, 0xd7, 0xc0, 0xb4, 0x27, - 0x96, 0x80, 0x0d, 0x3e, 0xe9, 0xcc, 0xad, 0x90, 0x71, 0xf3, 0xab, 0x93, 0x90, 0xa9, 0x6c, 0xac, - 0xae, 0xe6, 0x8f, 0xa8, 0xc7, 0x60, 0x76, 0xa3, 0x72, 0x6f, 0xa5, 0x7a, 0xae, 0xd2, 0x28, 0x69, - 0x5a, 0x55, 0xcb, 0xa7, 0xd4, 0x59, 0x98, 0x5a, 0x28, 0x2c, 0x36, 0xca, 0x95, 0xf5, 0x8d, 0x7a, - 0x3e, 0x8d, 0x5e, 0xa3, 0xc0, 0x5c, 0x0d, 0x3b, 0x8b, 0x78, 0xcf, 0x68, 0xe2, 0x9a, 0xa3, 0x3b, - 0x18, 0xbd, 0x38, 0xe5, 0x0b, 0x53, 0xdd, 0x70, 0x0b, 0xf5, 0x3f, 0xb1, 0x0a, 0x3c, 0x71, 0x5f, - 0x05, 0x44, 0x0a, 0xf3, 0xec, 0xef, 0x79, 0x2e, 0x4d, 0xe3, 0xe9, 0x9c, 0x79, 0x3c, 0x4c, 0x73, - 0xdf, 0xd4, 0x39, 0x80, 0x85, 0x42, 0xf1, 0xde, 0x65, 0xad, 0xba, 0x51, 0x59, 0xcc, 0x1f, 0x71, - 0xdf, 0x97, 0xaa, 0x5a, 0x89, 0xbd, 0xa7, 0xd0, 0xf7, 0x53, 0x1c, 0x98, 0x8b, 0x22, 0x98, 0xf3, - 0x83, 0x99, 0xe9, 0x03, 0x28, 0x7a, 0x93, 0x0f, 0xce, 0xb2, 0x00, 0xce, 0x13, 0xe3, 0x91, 0x4b, - 0x1e, 0xa0, 0x07, 0xd3, 0x30, 0x59, 0xdb, 0xde, 0x75, 0x5a, 0xd6, 0x45, 0x13, 0x4d, 0xf9, 0xc8, - 0xa0, 0x6f, 0xf3, 0x32, 0x79, 0xba, 0x28, 0x93, 0x1b, 0xf6, 0x57, 0x82, 0x51, 0x08, 0x91, 0xc6, - 0xeb, 0x7c, 0x69, 0x14, 0x04, 0x69, 0x3c, 0x5e, 0x96, 0x50, 0xf2, 0x72, 0x78, 0xc5, 0x53, 0x21, - 0x5b, 0xeb, 0xe8, 0x4d, 0x8c, 0xfe, 0x50, 0x81, 0x99, 0x55, 0xac, 0xef, 0xe1, 0x42, 0xa7, 0x63, - 0x5b, 0x7b, 0x18, 0x15, 0x03, 0x7d, 0x3d, 0x05, 0x13, 0x5d, 0x37, 0x53, 0xb9, 0x45, 0x6a, 0x30, - 0xa5, 0x79, 0xaf, 0xea, 0x69, 0x00, 0xa3, 0x85, 0x4d, 0xc7, 0x70, 0x0c, 0xdc, 0x3d, 0x95, 0xbe, - 0x46, 0xb9, 0x61, 0x4a, 0xe3, 0x52, 0xd0, 0x77, 0xd3, 0xb2, 0x3a, 0x46, 0xb8, 0x98, 0xe7, 0x39, - 0x08, 0x91, 0xea, 0x1b, 0xd2, 0x32, 0x3a, 0x36, 0x90, 0x5c, 0x3c, 0xd9, 0xbe, 0x3d, 0x15, 0x5f, - 0xb8, 0x6e, 0x8e, 0x4a, 0xb5, 0x51, 0xdb, 0x28, 0xae, 0x34, 0x6a, 0xeb, 0x85, 0x62, 0x29, 0x8f, - 0xd5, 0xe3, 0x90, 0x27, 0x8f, 0x8d, 0x72, 0xad, 0xb1, 0x58, 0x5a, 0x2d, 0xd5, 0x4b, 0x8b, 0xf9, - 0x4d, 0x55, 0x85, 0x39, 0xad, 0xf4, 0x8c, 0x8d, 0x52, 0xad, 0xde, 0x58, 0x2a, 0x94, 0x57, 0x4b, - 0x8b, 0xf9, 0x2d, 0xf7, 0xe7, 0xd5, 0xf2, 0x5a, 0xb9, 0xde, 0xd0, 0x4a, 0x85, 0xe2, 0x4a, 0x69, - 0x31, 0xbf, 0xad, 0x5e, 0x0e, 0x97, 0x55, 0xaa, 0x8d, 0xc2, 0xfa, 0xba, 0x56, 0x3d, 0x5b, 0x6a, - 0xb0, 0x3f, 0x6a, 0x79, 0x83, 0x16, 0x54, 0x6f, 0xd4, 0x56, 0x0a, 0x5a, 0xa9, 0xb0, 0xb0, 0x5a, - 0xca, 0xdf, 0x8f, 0x9e, 0xa3, 0xc0, 0xec, 0x9a, 0x7e, 0x01, 0xd7, 0xb6, 0x75, 0x1b, 0xeb, 0xe7, - 0xdb, 0x18, 0x5d, 0x2b, 0x81, 0x27, 0xfa, 0x43, 0x1e, 0xaf, 0x92, 0x88, 0xd7, 0xcd, 0x7d, 0x04, - 0x2c, 0x14, 0x11, 0x02, 0xd8, 0xff, 0xf2, 0x9b, 0xc1, 0x8a, 0x00, 0xd8, 0x93, 0x62, 0xd2, 0x8b, - 0x87, 0xd8, 0xcf, 0x3e, 0x02, 0x10, 0x43, 0x5f, 0x51, 0x60, 0xae, 0x6c, 0xee, 0x19, 0x0e, 0x5e, - 0xc6, 0x26, 0xb6, 0xdd, 0x71, 0x40, 0x0a, 0x86, 0x87, 0x15, 0x0e, 0x86, 0x25, 0x11, 0x86, 0x5b, - 0xfa, 0x88, 0x4d, 0x2c, 0x23, 0x64, 0xb4, 0xbd, 0x0a, 0xa6, 0x0c, 0x92, 0xaf, 0x68, 0xb4, 0x98, - 0xc4, 0x82, 0x04, 0xf5, 0x3a, 0x98, 0xa5, 0x2f, 0x4b, 0x46, 0x1b, 0xdf, 0x8b, 0x2f, 0xb1, 0x71, - 0x57, 0x4c, 0x44, 0xbf, 0xe0, 0x37, 0xbe, 0xb2, 0x80, 0xe5, 0x8f, 0xc7, 0x65, 0x2a, 0x1e, 0x98, - 0x2f, 0x7b, 0x24, 0x34, 0xbf, 0x7d, 0xad, 0xcc, 0x40, 0x3f, 0x48, 0xc3, 0x74, 0xcd, 0xb1, 0x3a, - 0xae, 0xca, 0x1a, 0xe6, 0x96, 0x1c, 0xb8, 0x9f, 0xe2, 0xdb, 0x58, 0x51, 0x04, 0xf7, 0xf1, 0x7d, - 0xe4, 0xc8, 0x15, 0x10, 0xd2, 0xc2, 0xbe, 0xeb, 0xb7, 0xb0, 0x25, 0x01, 0x95, 0x5b, 0x63, 0x51, - 0xfb, 0x21, 0x6c, 0x5f, 0x2f, 0x53, 0x20, 0xef, 0xa9, 0x99, 0x53, 0xdc, 0xb5, 0x6d, 0x6c, 0x3a, - 0x72, 0x20, 0xfc, 0x05, 0x0f, 0xc2, 0x8a, 0x08, 0xc2, 0xad, 0x11, 0xca, 0xec, 0x95, 0x92, 0x60, - 0x1b, 0xfb, 0x88, 0x8f, 0xe6, 0xbd, 0x02, 0x9a, 0x4f, 0x89, 0xcf, 0x56, 0x3c, 0x48, 0x57, 0x86, - 0x40, 0xf4, 0x38, 0xe4, 0xdd, 0x31, 0xa9, 0x58, 0x2f, 0x9f, 0x2d, 0x35, 0xca, 0x95, 0xb3, 0xe5, - 0x7a, 0x29, 0x8f, 0xd1, 0x4b, 0x15, 0x98, 0xa1, 0xac, 0x69, 0x78, 0xcf, 0xba, 0x20, 0xd9, 0xeb, - 0x7d, 0x25, 0xa6, 0xb1, 0xc0, 0x97, 0x10, 0xd2, 0x32, 0x7e, 0x3e, 0x86, 0xb1, 0x10, 0x41, 0xee, - 0x91, 0xd4, 0x5b, 0xed, 0x6b, 0x06, 0x5b, 0x7d, 0x5a, 0x4b, 0xdf, 0xde, 0xea, 0x65, 0x19, 0x00, - 0x5a, 0xc9, 0xb3, 0x06, 0xbe, 0x88, 0xd6, 0x02, 0x4c, 0x04, 0xb5, 0x4d, 0x0d, 0x54, 0xdb, 0x74, - 0x3f, 0xb5, 0x7d, 0x3f, 0x3f, 0x66, 0x2d, 0x88, 0xe8, 0xdd, 0x14, 0x2a, 0x6e, 0x97, 0x93, 0xf0, - 0xd9, 0xa1, 0xa7, 0x28, 0x69, 0xd1, 0xea, 0xbc, 0x0a, 0xa6, 0xc8, 0x63, 0x45, 0xdf, 0xc1, 0xac, - 0x0d, 0x05, 0x09, 0xea, 0x19, 0x98, 0xa1, 0x19, 0x9b, 0x96, 0xe9, 0xd6, 0x27, 0x43, 0x32, 0x08, - 0x69, 0x2e, 0x88, 0x4d, 0x1b, 0xeb, 0x8e, 0x65, 0x13, 0x1a, 0x59, 0x0a, 0x22, 0x97, 0x84, 0xbe, - 0xe5, 0xb7, 0xc2, 0x92, 0xa0, 0x39, 0x4f, 0x88, 0x53, 0x95, 0x78, 0x7a, 0xb3, 0x37, 0x5c, 0xfb, - 0xa3, 0xad, 0xae, 0xe1, 0xa2, 0xbd, 0x44, 0xa6, 0x76, 0x58, 0x3d, 0x09, 0x2a, 0x4b, 0x75, 0xf3, - 0x16, 0xab, 0x95, 0x7a, 0xa9, 0x52, 0xcf, 0x6f, 0xf6, 0xd5, 0xa8, 0x2d, 0xf4, 0x86, 0x0c, 0x64, - 0xee, 0xb1, 0x0c, 0x13, 0x3d, 0x98, 0x12, 0x54, 0xc2, 0xc4, 0xce, 0x45, 0xcb, 0xbe, 0xe0, 0x37, - 0xd4, 0x20, 0x21, 0x1a, 0x9b, 0x40, 0x95, 0x94, 0x81, 0xaa, 0x94, 0xe9, 0xa7, 0x4a, 0xbf, 0xc4, - 0xab, 0xd2, 0x1d, 0xa2, 0x2a, 0x5d, 0xdf, 0x47, 0xfe, 0x2e, 0xf3, 0x21, 0x1d, 0xc0, 0x27, 0xfd, - 0x0e, 0xe0, 0x2e, 0x01, 0xc6, 0xc7, 0xc9, 0x91, 0x89, 0x07, 0xe0, 0x97, 0x13, 0x6d, 0xf8, 0xfd, - 0xa0, 0xde, 0x0a, 0x81, 0x7a, 0xbb, 0x4f, 0x9f, 0x60, 0xec, 0xef, 0x3a, 0xee, 0xdf, 0xdf, 0x4d, - 0x5c, 0x50, 0x4f, 0xc0, 0xb1, 0xc5, 0xf2, 0xd2, 0x52, 0x49, 0x2b, 0x55, 0xea, 0x8d, 0x4a, 0xa9, - 0x7e, 0xae, 0xaa, 0xdd, 0x9b, 0x6f, 0xa3, 0x87, 0x14, 0x00, 0x57, 0x42, 0x45, 0xdd, 0x6c, 0xe2, - 0xb6, 0x5c, 0x8f, 0xfe, 0x0f, 0xe9, 0x78, 0x7d, 0x42, 0x40, 0x3f, 0x04, 0xce, 0x57, 0xa7, 0xe5, - 0x5b, 0x65, 0x28, 0xb1, 0x78, 0xa0, 0xbe, 0xf5, 0x91, 0x60, 0x7b, 0x5e, 0x06, 0x47, 0x3d, 0x7a, - 0x2c, 0x7b, 0xff, 0x69, 0xdf, 0x3b, 0x32, 0x30, 0xc7, 0x60, 0xf1, 0xe6, 0xf1, 0xcf, 0x4f, 0xc9, - 0x4c, 0xe4, 0x11, 0x4c, 0xb2, 0x69, 0xbb, 0xd7, 0xbd, 0xfb, 0xef, 0xea, 0x32, 0x4c, 0x77, 0xb0, - 0xbd, 0x63, 0x74, 0xbb, 0x86, 0x65, 0xd2, 0x05, 0xb9, 0xb9, 0x5b, 0x1f, 0xe3, 0x4b, 0x9c, 0xac, - 0x5d, 0xce, 0xaf, 0xeb, 0xb6, 0x63, 0x34, 0x8d, 0x8e, 0x6e, 0x3a, 0xeb, 0x41, 0x66, 0x8d, 0xff, - 0x13, 0xbd, 0x24, 0xe6, 0xb4, 0x46, 0xac, 0x49, 0x88, 0x4a, 0xfc, 0x76, 0x8c, 0x29, 0x49, 0x24, - 0xc1, 0x78, 0x6a, 0xf1, 0x89, 0x44, 0xd5, 0xa2, 0x0f, 0xde, 0x5b, 0xea, 0x15, 0x70, 0xa2, 0x5c, - 0x29, 0x56, 0x35, 0xad, 0x54, 0xac, 0x37, 0xd6, 0x4b, 0xda, 0x5a, 0xb9, 0x56, 0x2b, 0x57, 0x2b, - 0xb5, 0x83, 0xb4, 0x76, 0xf4, 0x69, 0xc5, 0xd7, 0x98, 0x45, 0xdc, 0x6c, 0x1b, 0x26, 0x46, 0x77, - 0x1d, 0x50, 0x61, 0xc4, 0x55, 0x1f, 0x79, 0x9c, 0x59, 0xf9, 0x21, 0x38, 0xbf, 0x3e, 0x3e, 0xce, - 0xfd, 0x09, 0xfe, 0x07, 0x6e, 0xfe, 0x5f, 0x51, 0xe0, 0x18, 0xd7, 0x10, 0x35, 0xbc, 0x33, 0xb2, - 0x95, 0xbc, 0x9f, 0xe5, 0xdb, 0x6e, 0x59, 0xc4, 0xb4, 0x9f, 0x35, 0xbd, 0x8f, 0x8d, 0x10, 0x58, - 0xdf, 0xea, 0xc3, 0xba, 0x2a, 0xc0, 0xfa, 0xd4, 0x21, 0x68, 0xc6, 0x43, 0xf6, 0x37, 0x13, 0x45, - 0xf6, 0x0a, 0x38, 0xb1, 0x5e, 0xd0, 0xea, 0xe5, 0x62, 0x79, 0xbd, 0xe0, 0x8e, 0xa3, 0xdc, 0x90, - 0x1d, 0x62, 0xae, 0x8b, 0xa0, 0xf7, 0xc5, 0xf7, 0xc3, 0x19, 0xb8, 0xaa, 0x7f, 0x47, 0x5b, 0xdc, - 0xd6, 0xcd, 0x2d, 0x8c, 0x0c, 0x19, 0xa8, 0x17, 0x61, 0xa2, 0x49, 0xb2, 0x53, 0x9c, 0xf9, 0xad, - 0x9b, 0x88, 0xbe, 0x9c, 0x96, 0xa0, 0x79, 0xbf, 0xa2, 0x77, 0xf3, 0x0a, 0x51, 0x17, 0x15, 0xe2, - 0xe9, 0xd1, 0xe0, 0xed, 0xe3, 0x3b, 0x44, 0x37, 0x3e, 0xeb, 0xeb, 0xc6, 0x39, 0x41, 0x37, 0x8a, - 0x07, 0x23, 0x1f, 0x4f, 0x4d, 0xfe, 0xe0, 0x91, 0xd0, 0x01, 0x84, 0x6a, 0x93, 0x11, 0x3e, 0x2a, - 0xf4, 0xed, 0xee, 0x5f, 0xab, 0x40, 0x6e, 0x11, 0xb7, 0xb1, 0xec, 0x4a, 0xe4, 0x77, 0xd2, 0xb2, - 0x1b, 0x22, 0x14, 0x06, 0x4a, 0x3b, 0x7c, 0x75, 0xc4, 0x31, 0x76, 0x70, 0xd7, 0xd1, 0x77, 0x3a, - 0x44, 0xd4, 0x8a, 0x16, 0x24, 0xa0, 0x9f, 0x4b, 0xcb, 0x6c, 0x97, 0x44, 0x14, 0xf3, 0x1f, 0x63, - 0x4d, 0xf1, 0xf3, 0x69, 0x98, 0xac, 0x61, 0xa7, 0x6a, 0xb7, 0xb0, 0x8d, 0x6a, 0x01, 0x46, 0xd7, - 0xc0, 0x34, 0x01, 0xc5, 0x9d, 0x66, 0xfa, 0x38, 0xf1, 0x49, 0xea, 0xf5, 0x30, 0xe7, 0xbf, 0x92, - 0xdf, 0x59, 0x37, 0xde, 0x93, 0x8a, 0xfe, 0x31, 0x25, 0xbb, 0x8b, 0xcb, 0x96, 0x0c, 0x19, 0x37, - 0x21, 0xad, 0x54, 0x6e, 0x47, 0x36, 0x92, 0x54, 0xf2, 0x1b, 0x5d, 0xef, 0x4c, 0x03, 0x6c, 0x98, - 0x5d, 0x4f, 0xae, 0x8f, 0x8b, 0x21, 0x57, 0xf4, 0xcf, 0xa9, 0x78, 0xb3, 0x98, 0xa0, 0x9c, 0x10, - 0x89, 0xbd, 0x31, 0xc6, 0xda, 0x42, 0x28, 0xb1, 0xe4, 0x65, 0xf6, 0xf5, 0x39, 0xc8, 0x9d, 0xd3, - 0xdb, 0x6d, 0xec, 0xa0, 0x6f, 0xa4, 0x21, 0x57, 0xb4, 0xb1, 0xee, 0x60, 0x5e, 0x74, 0x08, 0x26, - 0x6d, 0xcb, 0x72, 0xd6, 0x75, 0x67, 0x9b, 0xc9, 0xcd, 0x7f, 0x67, 0x0e, 0x03, 0xbf, 0xc1, 0x77, - 0x1f, 0x77, 0x89, 0xa2, 0xfb, 0x31, 0xa1, 0xb6, 0xb4, 0xa0, 0x79, 0x5a, 0x48, 0x48, 0xff, 0x81, - 0x60, 0x72, 0xc7, 0xc4, 0x3b, 0x96, 0x69, 0x34, 0x3d, 0x9b, 0xd3, 0x7b, 0x47, 0x1f, 0xf5, 0x65, - 0xba, 0x20, 0xc8, 0x74, 0x5e, 0xba, 0x94, 0x78, 0x02, 0xad, 0x0d, 0xd1, 0x7b, 0x5c, 0x0d, 0x57, - 0xd2, 0xce, 0xa0, 0x51, 0xaf, 0x36, 0x8a, 0x5a, 0xa9, 0x50, 0x2f, 0x35, 0x56, 0xab, 0xc5, 0xc2, - 0x6a, 0x43, 0x2b, 0xad, 0x57, 0xf3, 0x18, 0xfd, 0x6d, 0xda, 0x15, 0x6e, 0xd3, 0xda, 0xc3, 0x36, - 0x5a, 0x96, 0x92, 0x73, 0x94, 0x4c, 0x18, 0x06, 0xbf, 0x24, 0xed, 0xb4, 0xc1, 0xa4, 0xc3, 0x38, - 0x08, 0x51, 0xde, 0x8f, 0x49, 0x35, 0xf7, 0x48, 0x52, 0x8f, 0x00, 0x49, 0xff, 0xcf, 0x34, 0x4c, - 0x14, 0x2d, 0x73, 0x0f, 0xdb, 0x0e, 0x3f, 0xdf, 0xe1, 0xa5, 0x99, 0x12, 0xa5, 0xe9, 0x0e, 0x92, - 0xd8, 0x74, 0x6c, 0xab, 0xe3, 0x4d, 0x78, 0xbc, 0x57, 0xf4, 0xe6, 0xb8, 0x12, 0x66, 0x25, 0x87, - 0x2f, 0x7c, 0xf6, 0x2f, 0x48, 0x60, 0x4f, 0xe9, 0x69, 0x00, 0x0f, 0xc5, 0xc1, 0xa5, 0x3f, 0x03, - 0xc9, 0x77, 0x29, 0x5f, 0x55, 0x60, 0x96, 0x36, 0xbe, 0x1a, 0x26, 0x16, 0x1a, 0xaa, 0xf2, 0x4b, - 0x8e, 0x3d, 0xc2, 0x5f, 0x39, 0x22, 0x88, 0x3f, 0xa7, 0x77, 0x3a, 0xfe, 0xf2, 0xf3, 0xca, 0x11, - 0x8d, 0xbd, 0x53, 0x35, 0x5f, 0xc8, 0x41, 0x46, 0xdf, 0x75, 0xb6, 0xd1, 0x0f, 0xa4, 0x27, 0x9f, - 0x42, 0x67, 0xc0, 0xf8, 0x09, 0x81, 0xe4, 0x38, 0x64, 0x1d, 0xeb, 0x02, 0xf6, 0xe4, 0x40, 0x5f, - 0x5c, 0x38, 0xf4, 0x4e, 0xa7, 0x4e, 0x3e, 0x30, 0x38, 0xbc, 0x77, 0xd7, 0xd6, 0xd1, 0x9b, 0x4d, - 0x6b, 0xd7, 0x74, 0xca, 0xde, 0x12, 0x74, 0x90, 0x80, 0xbe, 0x94, 0x92, 0x99, 0xcc, 0x4a, 0x30, - 0x18, 0x0f, 0xb2, 0xf3, 0x43, 0x34, 0xa5, 0x79, 0xb8, 0xb1, 0xb0, 0xbe, 0xde, 0xa8, 0x57, 0xef, - 0x2d, 0x55, 0x02, 0xc3, 0xb3, 0x51, 0xae, 0x34, 0xea, 0x2b, 0xa5, 0x46, 0x71, 0x43, 0x23, 0xeb, - 0x84, 0x85, 0x62, 0xb1, 0xba, 0x51, 0xa9, 0xe7, 0x31, 0x7a, 0x5b, 0x1a, 0x66, 0x8a, 0x6d, 0xab, - 0xeb, 0x23, 0x7c, 0x75, 0x80, 0xb0, 0x2f, 0xc6, 0x14, 0x27, 0x46, 0xf4, 0xaf, 0x29, 0x59, 0xa7, - 0x03, 0x4f, 0x20, 0x1c, 0xf9, 0x90, 0x5e, 0xea, 0xcd, 0x52, 0x4e, 0x07, 0x83, 0xe9, 0x25, 0xdf, - 0x24, 0x3e, 0x7f, 0x3b, 0x4c, 0x14, 0xa8, 0x62, 0xa0, 0xbf, 0x4a, 0x41, 0xae, 0x68, 0x99, 0x9b, - 0xc6, 0x96, 0x6b, 0xcc, 0x61, 0x53, 0x3f, 0xdf, 0xc6, 0x8b, 0xba, 0xa3, 0xef, 0x19, 0xf8, 0x22, - 0xa9, 0xc0, 0xa4, 0xd6, 0x93, 0xea, 0x32, 0xc5, 0x52, 0xf0, 0xf9, 0xdd, 0x2d, 0xc2, 0xd4, 0xa4, - 0xc6, 0x27, 0xa9, 0x4f, 0x85, 0xcb, 0xe9, 0xeb, 0xba, 0x8d, 0x6d, 0xdc, 0xc6, 0x7a, 0x17, 0xbb, - 0xd3, 0x22, 0x13, 0xb7, 0x89, 0xd2, 0x4e, 0x6a, 0x61, 0x9f, 0xd5, 0x33, 0x30, 0x43, 0x3f, 0x11, - 0x53, 0xa4, 0x4b, 0xd4, 0x78, 0x52, 0x13, 0xd2, 0xd4, 0xc7, 0x43, 0x16, 0x3f, 0xe0, 0xd8, 0xfa, - 0xa9, 0x16, 0xc1, 0xeb, 0xf2, 0x79, 0xea, 0x75, 0x38, 0xef, 0x79, 0x1d, 0xce, 0xd7, 0x88, 0x4f, - 0xa2, 0x46, 0x73, 0xa1, 0x57, 0x4d, 0xfa, 0x86, 0xc4, 0xbf, 0xa7, 0x03, 0xc5, 0x50, 0x21, 0x63, - 0xea, 0x3b, 0x98, 0xe9, 0x05, 0x79, 0x56, 0x6f, 0x84, 0xa3, 0xfa, 0x9e, 0xee, 0xe8, 0xf6, 0xaa, - 0xd5, 0xd4, 0xdb, 0x64, 0xf0, 0xf3, 0x5a, 0x7e, 0xef, 0x07, 0xb2, 0x23, 0xe4, 0x58, 0x36, 0x26, - 0xb9, 0xbc, 0x1d, 0x21, 0x2f, 0xc1, 0xa5, 0x6e, 0x34, 0x2d, 0x93, 0xf0, 0xaf, 0x68, 0xe4, 0xd9, - 0x95, 0x4a, 0xcb, 0xe8, 0xba, 0x15, 0x21, 0x54, 0x2a, 0x74, 0x6b, 0xa3, 0x76, 0xc9, 0x6c, 0x92, - 0xdd, 0xa0, 0x49, 0x2d, 0xec, 0xb3, 0xba, 0x00, 0xd3, 0x6c, 0x23, 0x64, 0xcd, 0xd5, 0xab, 0x1c, - 0xd1, 0xab, 0x6b, 0x44, 0x9f, 0x2e, 0x8a, 0xe7, 0x7c, 0x25, 0xc8, 0xa7, 0xf1, 0x3f, 0xa9, 0x77, - 0xc3, 0x95, 0xec, 0xb5, 0xb8, 0xdb, 0x75, 0xac, 0x1d, 0x0a, 0xfa, 0x92, 0xd1, 0xa6, 0x35, 0x98, - 0x20, 0x35, 0x88, 0xca, 0xa2, 0xde, 0x0a, 0xc7, 0x3b, 0x36, 0xde, 0xc4, 0xf6, 0x7d, 0xfa, 0xce, - 0xee, 0x03, 0x75, 0x5b, 0x37, 0xbb, 0x1d, 0xcb, 0x76, 0x4e, 0x4d, 0x12, 0xe6, 0xfb, 0x7e, 0x63, - 0x1d, 0xe5, 0x24, 0xe4, 0xa8, 0xf8, 0xd0, 0x8b, 0xb3, 0xd2, 0xee, 0x9c, 0xac, 0x42, 0x91, 0xe6, - 0xd9, 0x2d, 0x30, 0xc1, 0x7a, 0x38, 0x02, 0xd4, 0xf4, 0xad, 0x27, 0x7b, 0xd6, 0x15, 0x18, 0x15, - 0xcd, 0xcb, 0xa6, 0x3e, 0x11, 0x72, 0x4d, 0x52, 0x2d, 0x82, 0xd9, 0xf4, 0xad, 0x57, 0xf6, 0x2f, - 0x94, 0x64, 0xd1, 0x58, 0x56, 0xf4, 0xe7, 0x8a, 0x94, 0x07, 0x68, 0x14, 0xc7, 0xf1, 0x5a, 0xf5, - 0xb7, 0xd2, 0x43, 0x74, 0x9b, 0x37, 0xc1, 0x0d, 0xac, 0x4f, 0x64, 0xf6, 0xc7, 0x62, 0x63, 0x61, - 0xc3, 0x9b, 0x0c, 0xba, 0x56, 0x49, 0xad, 0x5e, 0xd0, 0xdc, 0x99, 0xfc, 0xa2, 0x3b, 0x89, 0xbc, - 0x11, 0xae, 0x1f, 0x90, 0xbb, 0x54, 0x6f, 0x54, 0x0a, 0x6b, 0xa5, 0xfc, 0xa6, 0x68, 0xdb, 0xd4, - 0xea, 0xd5, 0xf5, 0x86, 0xb6, 0x51, 0xa9, 0x94, 0x2b, 0xcb, 0x94, 0x98, 0x6b, 0x12, 0x9e, 0x0c, - 0x32, 0x9c, 0xd3, 0xca, 0xf5, 0x52, 0xa3, 0x58, 0xad, 0x2c, 0x95, 0x97, 0xf3, 0xc6, 0x20, 0xc3, - 0xe8, 0x7e, 0xf5, 0x1a, 0xb8, 0x4a, 0xe0, 0xa4, 0x5c, 0xad, 0xb8, 0x33, 0xdb, 0x62, 0xa1, 0x52, - 0x2c, 0xb9, 0xd3, 0xd8, 0x0b, 0x2a, 0x82, 0x13, 0x94, 0x5c, 0x63, 0xa9, 0xbc, 0xca, 0x6f, 0x46, - 0x7d, 0x2a, 0xa5, 0x9e, 0x82, 0xcb, 0xf8, 0x6f, 0xe5, 0xca, 0xd9, 0xc2, 0x6a, 0x79, 0x31, 0xff, - 0xfb, 0x29, 0xf5, 0x3a, 0xb8, 0x5a, 0xf8, 0x8b, 0xee, 0x2b, 0x35, 0xca, 0x8b, 0x8d, 0xb5, 0x72, - 0x6d, 0xad, 0x50, 0x2f, 0xae, 0xe4, 0x3f, 0x4d, 0xe6, 0x0b, 0xbe, 0x01, 0xcc, 0xb9, 0x65, 0xbe, - 0x8c, 0x1f, 0xd3, 0x0b, 0xa2, 0xa2, 0x3e, 0xae, 0x2f, 0xec, 0xd1, 0x36, 0xec, 0x27, 0xfc, 0xd1, - 0x61, 0x51, 0x50, 0xa1, 0x5b, 0x62, 0xd0, 0x8a, 0xa7, 0x43, 0xf5, 0x21, 0x54, 0xe8, 0x1a, 0xb8, - 0xaa, 0x52, 0xa2, 0x48, 0x69, 0xa5, 0x62, 0xf5, 0x6c, 0x49, 0x6b, 0x9c, 0x2b, 0xac, 0xae, 0x96, - 0xea, 0x8d, 0xa5, 0xb2, 0x56, 0xab, 0xe7, 0x37, 0xd1, 0x3f, 0xa7, 0xfd, 0xd5, 0x1c, 0x4e, 0x5a, - 0x7f, 0x95, 0x8e, 0xdb, 0xac, 0x23, 0x57, 0x6d, 0x7e, 0x1c, 0x72, 0x5d, 0x47, 0x77, 0x76, 0xbb, - 0xac, 0x55, 0x3f, 0xaa, 0x7f, 0xab, 0x9e, 0xaf, 0x91, 0x4c, 0x1a, 0xcb, 0x8c, 0xfe, 0x3c, 0x15, - 0xa7, 0x99, 0x8e, 0x60, 0x41, 0xc7, 0x18, 0x42, 0xc4, 0xa7, 0x01, 0x79, 0xda, 0x5e, 0xae, 0x35, - 0x0a, 0xab, 0x5a, 0xa9, 0xb0, 0x78, 0x9f, 0xbf, 0x8c, 0x83, 0xd5, 0x13, 0x70, 0x6c, 0xa3, 0x52, - 0x58, 0x58, 0x2d, 0x91, 0xe6, 0x52, 0xad, 0x54, 0x4a, 0x45, 0x57, 0xee, 0x3f, 0x47, 0x36, 0x4d, - 0x5c, 0x0b, 0x9a, 0xf0, 0xed, 0x5a, 0x39, 0x9c, 0xfc, 0xbf, 0x29, 0xed, 0x5b, 0x14, 0x68, 0x18, - 0x4f, 0x6b, 0xb4, 0x38, 0x7c, 0x49, 0xca, 0x9d, 0x48, 0x8a, 0x93, 0x78, 0x78, 0xfc, 0xe7, 0x21, - 0xf0, 0x38, 0x01, 0xc7, 0x78, 0x3c, 0x88, 0x5b, 0x51, 0x38, 0x0c, 0x5f, 0x9b, 0x84, 0x5c, 0x0d, - 0xb7, 0x71, 0xd3, 0x41, 0xef, 0xe0, 0x8c, 0x89, 0x39, 0x48, 0xfb, 0x6e, 0x2c, 0x69, 0xa3, 0x25, - 0x4c, 0x9f, 0xd3, 0x3d, 0xd3, 0xe7, 0x08, 0x33, 0x40, 0x89, 0x65, 0x06, 0x64, 0x12, 0x30, 0x03, - 0xb2, 0xc3, 0x9b, 0x01, 0xb9, 0x41, 0x66, 0x00, 0x7a, 0x63, 0x2e, 0x6e, 0x2f, 0x41, 0x45, 0x7d, - 0xb8, 0x83, 0xff, 0x3f, 0x64, 0xe2, 0xf4, 0x2a, 0x7d, 0x39, 0x8e, 0xa7, 0xc5, 0x3f, 0x50, 0x12, - 0x58, 0x7e, 0x50, 0xaf, 0x85, 0xab, 0x83, 0xf7, 0x46, 0xe9, 0x99, 0xe5, 0x5a, 0xbd, 0x46, 0x46, - 0xfc, 0x62, 0x55, 0xd3, 0x36, 0xd6, 0xe9, 0x1a, 0xf2, 0x49, 0x50, 0x03, 0x2a, 0xda, 0x46, 0x85, - 0x8e, 0xef, 0x5b, 0x22, 0xf5, 0xa5, 0x72, 0x65, 0xb1, 0xe1, 0xb7, 0x99, 0xca, 0x52, 0x35, 0xbf, - 0xed, 0x4e, 0xd9, 0x38, 0xea, 0xee, 0x00, 0xcd, 0x4a, 0x28, 0x54, 0x16, 0x1b, 0x6b, 0x95, 0xd2, - 0x5a, 0xb5, 0x52, 0x2e, 0x92, 0xf4, 0x5a, 0xa9, 0x9e, 0x37, 0xdc, 0x81, 0xa6, 0xc7, 0xa2, 0xa8, - 0x95, 0x0a, 0x5a, 0x71, 0xa5, 0xa4, 0xd1, 0x22, 0xef, 0x57, 0xaf, 0x87, 0x33, 0x85, 0x4a, 0xb5, - 0xee, 0xa6, 0x14, 0x2a, 0xf7, 0xd5, 0xef, 0x5b, 0x2f, 0x35, 0xd6, 0xb5, 0x6a, 0xb1, 0x54, 0xab, - 0xb9, 0xed, 0x94, 0xd9, 0x1f, 0xf9, 0xb6, 0xfa, 0x74, 0xb8, 0x9d, 0x63, 0xad, 0x54, 0x27, 0x1b, - 0x96, 0x6b, 0x55, 0xe2, 0xb3, 0xb2, 0x58, 0x6a, 0xac, 0x14, 0x6a, 0x8d, 0x72, 0xa5, 0x58, 0x5d, - 0x5b, 0x2f, 0xd4, 0xcb, 0x6e, 0x73, 0x5e, 0xd7, 0xaa, 0xf5, 0x6a, 0xe3, 0x6c, 0x49, 0xab, 0x95, - 0xab, 0x95, 0xbc, 0xe9, 0x56, 0x99, 0x6b, 0xff, 0x5e, 0x3f, 0x6c, 0xa9, 0x57, 0xc1, 0x29, 0x2f, - 0x7d, 0xb5, 0xea, 0x0a, 0x9a, 0xb3, 0x48, 0x3a, 0x89, 0x5a, 0x24, 0xff, 0x92, 0x86, 0x4c, 0xcd, - 0xb1, 0x3a, 0xe8, 0xc7, 0x82, 0x0e, 0xe6, 0x34, 0x80, 0x4d, 0xf6, 0x1f, 0xdd, 0x59, 0x18, 0x9b, - 0x97, 0x71, 0x29, 0xe8, 0xf7, 0xa4, 0x37, 0x4d, 0x82, 0x3e, 0xdb, 0xea, 0x84, 0xd8, 0x2a, 0xdf, - 0x97, 0x3b, 0x45, 0x12, 0x4e, 0x28, 0x9e, 0xbe, 0xff, 0xfc, 0x30, 0xdb, 0x22, 0x08, 0x4e, 0x72, - 0xb0, 0xb9, 0xf2, 0xf7, 0x54, 0x02, 0xab, 0x97, 0xc3, 0x65, 0x3d, 0xca, 0x45, 0x74, 0x6a, 0x53, - 0x7d, 0x34, 0x3c, 0x8a, 0x53, 0xef, 0xd2, 0x5a, 0xf5, 0x6c, 0xc9, 0x57, 0xe4, 0xc5, 0x42, 0xbd, - 0x90, 0xdf, 0x42, 0x9f, 0x57, 0x20, 0xb3, 0x66, 0xed, 0xf5, 0xee, 0x55, 0x99, 0xf8, 0x22, 0xb7, - 0x16, 0xea, 0xbd, 0x8a, 0x5e, 0xf3, 0x52, 0x62, 0x5f, 0x0b, 0xdf, 0x97, 0xfe, 0x52, 0x3a, 0x8e, - 0xd8, 0xd7, 0x0e, 0xba, 0x19, 0xfd, 0x77, 0xc3, 0x88, 0x3d, 0x44, 0xb4, 0x58, 0x3d, 0x03, 0xa7, - 0x83, 0x0f, 0xe5, 0xc5, 0x52, 0xa5, 0x5e, 0x5e, 0xba, 0x2f, 0x10, 0x6e, 0x59, 0x93, 0x12, 0xff, - 0xa0, 0x6e, 0x2c, 0x7a, 0xa6, 0x71, 0x0a, 0x8e, 0x07, 0xdf, 0x96, 0x4b, 0x75, 0xef, 0xcb, 0xfd, - 0xe8, 0xc1, 0x2c, 0xcc, 0xd0, 0x6e, 0x7d, 0xa3, 0xd3, 0xd2, 0x1d, 0x8c, 0x9e, 0x18, 0xa0, 0x7b, - 0x03, 0x1c, 0x2d, 0xaf, 0x2f, 0xd5, 0x6a, 0x8e, 0x65, 0xeb, 0x5b, 0xb8, 0xd0, 0x6a, 0xd9, 0x4c, - 0x5a, 0xbd, 0xc9, 0xe8, 0xbd, 0xd2, 0xeb, 0x7c, 0xe2, 0x50, 0x42, 0xcb, 0x0c, 0x41, 0xfd, 0xab, - 0x52, 0xeb, 0x72, 0x12, 0x04, 0xe3, 0xa1, 0x7f, 0xff, 0x88, 0xdb, 0x5c, 0x38, 0x2e, 0x9b, 0x67, - 0x9e, 0x97, 0x86, 0xa9, 0xba, 0xb1, 0x83, 0x9f, 0x65, 0x99, 0xb8, 0xab, 0x4e, 0x80, 0xb2, 0xbc, - 0x56, 0xcf, 0x1f, 0x71, 0x1f, 0x5c, 0xa3, 0x2a, 0x45, 0x1e, 0x4a, 0x6e, 0x01, 0xee, 0x43, 0xa1, - 0x9e, 0x57, 0xdc, 0x87, 0xb5, 0x52, 0x3d, 0x9f, 0x71, 0x1f, 0x2a, 0xa5, 0x7a, 0x3e, 0xeb, 0x3e, - 0xac, 0xaf, 0xd6, 0xf3, 0x39, 0xf7, 0xa1, 0x5c, 0xab, 0xe7, 0x27, 0xdc, 0x87, 0x85, 0x5a, 0x3d, - 0x3f, 0xe9, 0x3e, 0x9c, 0xad, 0xd5, 0xf3, 0x53, 0xee, 0x43, 0xb1, 0x5e, 0xcf, 0x83, 0xfb, 0x70, - 0x4f, 0xad, 0x9e, 0x9f, 0x76, 0x1f, 0x0a, 0xc5, 0x7a, 0x7e, 0x86, 0x3c, 0x94, 0xea, 0xf9, 0x59, - 0xf7, 0xa1, 0x56, 0xab, 0xe7, 0xe7, 0x08, 0xe5, 0x5a, 0x3d, 0x7f, 0x94, 0x94, 0x55, 0xae, 0xe7, - 0xf3, 0xee, 0xc3, 0x4a, 0xad, 0x9e, 0x3f, 0x46, 0x32, 0xd7, 0xea, 0x79, 0x95, 0x14, 0x5a, 0xab, - 0xe7, 0x2f, 0x23, 0x79, 0x6a, 0xf5, 0xfc, 0x71, 0x52, 0x44, 0xad, 0x9e, 0x3f, 0x41, 0xd8, 0x28, - 0xd5, 0xf3, 0x27, 0x49, 0x1e, 0xad, 0x9e, 0xbf, 0x9c, 0x7c, 0xaa, 0xd4, 0xf3, 0xa7, 0x08, 0x63, - 0xa5, 0x7a, 0xfe, 0x0a, 0xf2, 0xa0, 0xd5, 0xf3, 0x88, 0x7c, 0x2a, 0xd4, 0xf3, 0x57, 0xa2, 0x47, - 0xc1, 0xd4, 0x32, 0x76, 0x28, 0x88, 0x28, 0x0f, 0xca, 0x32, 0x76, 0x78, 0x33, 0xfe, 0xeb, 0x0a, - 0x5c, 0xce, 0xa6, 0x7e, 0x4b, 0xb6, 0xb5, 0xb3, 0x8a, 0xb7, 0xf4, 0xe6, 0xa5, 0xd2, 0x03, 0xae, - 0x09, 0xc5, 0xef, 0xcb, 0xaa, 0x90, 0xe9, 0x04, 0x9d, 0x11, 0x79, 0x8e, 0xb4, 0x38, 0xbd, 0xc5, - 0x28, 0x25, 0x58, 0x8c, 0x62, 0x16, 0xd9, 0x3f, 0xf1, 0x1a, 0x2d, 0xac, 0x1f, 0xa7, 0x7a, 0xd6, - 0x8f, 0xdd, 0x66, 0xd2, 0xc1, 0x76, 0xd7, 0x32, 0xf5, 0x76, 0x8d, 0x6d, 0xdc, 0xd3, 0x55, 0xaf, - 0xde, 0x64, 0xf5, 0x19, 0x5e, 0xcb, 0xa0, 0x56, 0xd9, 0xd3, 0xa2, 0x66, 0xb8, 0xbd, 0xd5, 0x0c, - 0x69, 0x24, 0x9f, 0xf6, 0x1b, 0x49, 0x5d, 0x68, 0x24, 0x77, 0x1f, 0x80, 0x76, 0xbc, 0xf6, 0x52, - 0x1e, 0x6e, 0x6a, 0x11, 0xb8, 0xb5, 0x7a, 0xcb, 0xd5, 0x0a, 0xfa, 0x7c, 0x1a, 0x4e, 0x96, 0xcc, - 0x7e, 0x16, 0x3e, 0xaf, 0x0b, 0x6f, 0xe3, 0xa1, 0x59, 0x17, 0x45, 0x7a, 0x7b, 0xdf, 0x6a, 0xf7, - 0xa7, 0x19, 0x22, 0xd1, 0xcf, 0xf8, 0x12, 0xad, 0x09, 0x12, 0xbd, 0x6b, 0x78, 0xd2, 0xf1, 0x04, - 0x5a, 0x19, 0x69, 0x07, 0x94, 0x41, 0xdf, 0xca, 0xc0, 0xa3, 0xa8, 0xef, 0x0d, 0xe3, 0x90, 0xb6, - 0xb2, 0x82, 0xd9, 0xd2, 0x70, 0xd7, 0xd1, 0x6d, 0x47, 0x38, 0x0f, 0xdd, 0x33, 0x95, 0x4a, 0x25, - 0x30, 0x95, 0x4a, 0x0f, 0x9c, 0x4a, 0xa1, 0xf7, 0xf0, 0xe6, 0xc3, 0x39, 0x11, 0xe3, 0x42, 0xff, - 0xfe, 0x3f, 0xaa, 0x86, 0x61, 0x50, 0xfb, 0x76, 0xc5, 0x4f, 0x08, 0x50, 0x2f, 0x1d, 0xb8, 0x84, - 0x78, 0x88, 0xff, 0xde, 0x68, 0xed, 0xbc, 0x0c, 0xff, 0x4d, 0x34, 0x4a, 0xf2, 0xad, 0x44, 0x0d, - 0xf4, 0xcf, 0x4e, 0xc0, 0x14, 0x69, 0x0b, 0xab, 0x86, 0x79, 0x01, 0x3d, 0xa4, 0xc0, 0x4c, 0x05, - 0x5f, 0x2c, 0x6e, 0xeb, 0xed, 0x36, 0x36, 0xb7, 0x30, 0x6f, 0xb6, 0x9f, 0x82, 0x09, 0xbd, 0xd3, - 0xa9, 0x04, 0xfb, 0x0c, 0xde, 0x2b, 0xeb, 0x7f, 0xbf, 0xd9, 0xb7, 0x91, 0xa7, 0x22, 0x1a, 0xb9, - 0x5f, 0xee, 0x3c, 0x5f, 0x66, 0xc8, 0x0c, 0xf9, 0x1a, 0x98, 0x6e, 0x7a, 0x59, 0xfc, 0x73, 0x13, - 0x7c, 0x12, 0xfa, 0x9b, 0x58, 0xdd, 0x80, 0x54, 0xe1, 0xf1, 0x94, 0x02, 0x8f, 0xd8, 0x0e, 0x39, - 0x01, 0xc7, 0xea, 0xd5, 0x6a, 0x63, 0xad, 0x50, 0xb9, 0x2f, 0x38, 0xaf, 0xbc, 0x89, 0x5e, 0x9d, - 0x81, 0xb9, 0x9a, 0xd5, 0xde, 0xc3, 0x01, 0x4c, 0x65, 0xc1, 0x21, 0x87, 0x97, 0x53, 0x6a, 0x9f, - 0x9c, 0xd4, 0x93, 0x90, 0xd3, 0xcd, 0xee, 0x45, 0xec, 0xd9, 0x86, 0xec, 0x8d, 0xc1, 0xf8, 0x61, - 0xbe, 0x1d, 0x6b, 0x22, 0x8c, 0x77, 0x0c, 0x90, 0xa4, 0xc8, 0x55, 0x08, 0x90, 0x67, 0x60, 0xa6, - 0x4b, 0x37, 0x0b, 0xeb, 0xdc, 0x9e, 0xb0, 0x90, 0x46, 0x58, 0xa4, 0xbb, 0xd5, 0x0a, 0x63, 0x91, - 0xbc, 0xa1, 0x87, 0xfc, 0xe6, 0xbf, 0x21, 0x40, 0x5c, 0x38, 0x08, 0x63, 0xf1, 0x40, 0x7e, 0xed, - 0xa8, 0x67, 0x78, 0xa7, 0xe0, 0x38, 0x6b, 0xb5, 0x8d, 0xe2, 0x4a, 0x61, 0x75, 0xb5, 0x54, 0x59, - 0x2e, 0x35, 0xca, 0x8b, 0x74, 0xab, 0x22, 0x48, 0x29, 0xd4, 0xeb, 0xa5, 0xb5, 0xf5, 0x7a, 0xad, - 0x51, 0x7a, 0x66, 0xb1, 0x54, 0x5a, 0x24, 0x2e, 0x71, 0xe4, 0x4c, 0x8b, 0xe7, 0xbc, 0x58, 0xa8, - 0xd4, 0xce, 0x95, 0xb4, 0xfc, 0xf6, 0x99, 0x02, 0x4c, 0x73, 0xfd, 0xbc, 0xcb, 0xdd, 0x22, 0xde, - 0xd4, 0x77, 0xdb, 0xcc, 0x56, 0xcb, 0x1f, 0x71, 0xb9, 0x23, 0xb2, 0xa9, 0x9a, 0xed, 0x4b, 0xf9, - 0x94, 0x9a, 0x87, 0x19, 0xbe, 0x4b, 0xcf, 0xa7, 0xd1, 0x3b, 0xaf, 0x82, 0xa9, 0x73, 0x96, 0x7d, - 0x81, 0xf8, 0x71, 0xa1, 0x0f, 0xd0, 0xb8, 0x26, 0xde, 0x09, 0x51, 0x6e, 0x60, 0x7f, 0xad, 0xbc, - 0xb7, 0x80, 0x47, 0x6d, 0x7e, 0xe0, 0x29, 0xd0, 0x6b, 0x60, 0xfa, 0xa2, 0x97, 0x3b, 0x68, 0xe9, - 0x5c, 0x12, 0xfa, 0xef, 0x72, 0xfb, 0xff, 0x83, 0x8b, 0x4c, 0x7e, 0x7f, 0xfa, 0x1d, 0x69, 0xc8, - 0x2d, 0x63, 0xa7, 0xd0, 0x6e, 0xf3, 0x72, 0x7b, 0xb9, 0xf4, 0xc9, 0x1e, 0xa1, 0x12, 0x85, 0x76, - 0x3b, 0xbc, 0x51, 0x71, 0x02, 0xf2, 0x3c, 0xd0, 0x85, 0x34, 0x49, 0xbf, 0xb9, 0x01, 0x05, 0x26, - 0x2f, 0xb1, 0x8f, 0x2a, 0xfe, 0x1e, 0xf7, 0xc3, 0x9c, 0x95, 0xf3, 0x84, 0x20, 0xa6, 0x4d, 0x2a, - 0x7a, 0xaf, 0xdc, 0xcb, 0xa7, 0xde, 0x0b, 0x13, 0xbb, 0x5d, 0x5c, 0xd4, 0xbb, 0x98, 0xf0, 0xd6, - 0x5b, 0xd3, 0xea, 0xf9, 0xfb, 0x71, 0xd3, 0x99, 0x2f, 0xef, 0xb8, 0x06, 0xf5, 0x06, 0xcd, 0xe8, - 0x87, 0x89, 0x61, 0xef, 0x9a, 0x47, 0xc1, 0x9d, 0x94, 0x5c, 0x34, 0x9c, 0xed, 0xe2, 0xb6, 0xee, - 0xb0, 0xb5, 0x6d, 0xff, 0x1d, 0xbd, 0x78, 0x08, 0x38, 0x23, 0xf7, 0x82, 0x43, 0x0f, 0x08, 0xc6, - 0x06, 0x71, 0x04, 0x1b, 0xb8, 0xc3, 0x80, 0xf8, 0xf7, 0x69, 0xc8, 0x54, 0x3b, 0xd8, 0x94, 0x3e, - 0x0d, 0xe3, 0xcb, 0x36, 0xdd, 0x23, 0xdb, 0x87, 0xe4, 0xbd, 0xc3, 0xfc, 0x4a, 0xbb, 0x25, 0x87, - 0x48, 0xf6, 0x66, 0xc8, 0x18, 0xe6, 0xa6, 0xc5, 0x0c, 0xd3, 0x2b, 0x43, 0x36, 0x81, 0xca, 0xe6, - 0xa6, 0xa5, 0x91, 0x8c, 0xb2, 0x8e, 0x61, 0x51, 0x65, 0x27, 0x2f, 0xee, 0x6f, 0x4f, 0x42, 0x8e, - 0xaa, 0x33, 0x7a, 0x99, 0x02, 0x4a, 0xa1, 0xd5, 0x0a, 0x11, 0x7c, 0x7a, 0x9f, 0xe0, 0x2d, 0xf2, - 0x9b, 0x8f, 0x89, 0xff, 0x2e, 0x06, 0x33, 0x91, 0xec, 0xdb, 0x59, 0x93, 0x2a, 0xb4, 0x5a, 0xe1, - 0x3e, 0xa8, 0x7e, 0x81, 0x69, 0xb1, 0x40, 0xbe, 0x85, 0x2b, 0x72, 0x2d, 0x3c, 0xf6, 0x40, 0x10, - 0xca, 0x5f, 0xf2, 0x10, 0xfd, 0x53, 0x1a, 0x26, 0x56, 0x8d, 0xae, 0xe3, 0x62, 0x53, 0x90, 0xc1, - 0xe6, 0x2a, 0x98, 0xf2, 0x44, 0xe3, 0x76, 0x79, 0x6e, 0x7f, 0x1e, 0x24, 0xa0, 0x37, 0xf0, 0xe8, - 0xdc, 0x23, 0xa2, 0xf3, 0xa4, 0xe8, 0xda, 0x33, 0x2e, 0xc2, 0x4f, 0x19, 0x04, 0xc5, 0xa6, 0x7b, - 0x8b, 0xfd, 0x0d, 0x5f, 0xe0, 0x6b, 0x82, 0xc0, 0x6f, 0x1b, 0xa6, 0xc8, 0xe4, 0x85, 0xfe, 0x85, - 0x34, 0x80, 0x5b, 0x36, 0x3b, 0xca, 0xf5, 0x58, 0xe1, 0x80, 0x76, 0x84, 0x74, 0x5f, 0xcd, 0x4b, - 0x77, 0x4d, 0x94, 0xee, 0x53, 0x06, 0x57, 0x35, 0xea, 0xc8, 0x96, 0x9a, 0x07, 0xc5, 0xf0, 0x45, - 0xeb, 0x3e, 0xa2, 0x77, 0xf8, 0x42, 0x5d, 0x17, 0x84, 0x7a, 0xc7, 0x90, 0x25, 0x25, 0x2f, 0xd7, - 0xbf, 0x48, 0xc3, 0x44, 0x0d, 0x3b, 0x6e, 0x37, 0x89, 0xce, 0xca, 0xf4, 0xf0, 0x5c, 0xdb, 0x4e, - 0x4b, 0xb6, 0xed, 0xef, 0xa5, 0x64, 0x03, 0xbd, 0x04, 0x92, 0x61, 0x3c, 0x85, 0x2c, 0x1e, 0x3c, - 0x2c, 0x15, 0xe8, 0x65, 0x10, 0xb5, 0xe4, 0xa5, 0xfb, 0xb6, 0xb4, 0xbf, 0x31, 0x2f, 0x9e, 0xb4, - 0xe0, 0xcd, 0xe2, 0xd4, 0x7e, 0xb3, 0x58, 0xfe, 0xa4, 0x05, 0x5f, 0xc7, 0xf0, 0x5d, 0xe9, 0xd8, - 0xc6, 0xc6, 0x08, 0x36, 0x8c, 0x87, 0x91, 0xd7, 0x73, 0x14, 0xc8, 0xb1, 0x95, 0xe5, 0xbb, 0xa2, - 0x57, 0x96, 0x07, 0x4f, 0x2d, 0xde, 0x3f, 0x84, 0x29, 0x17, 0xb5, 0xdc, 0xeb, 0xb3, 0x91, 0xe6, - 0xd8, 0xb8, 0x09, 0xb2, 0x24, 0x12, 0x25, 0x1b, 0xe7, 0x82, 0xbd, 0x7e, 0x8f, 0x44, 0xc9, 0xfd, - 0xaa, 0xd1, 0x4c, 0xb1, 0x51, 0x18, 0xc1, 0x0a, 0xf1, 0x30, 0x28, 0xbc, 0xe7, 0xf3, 0x29, 0xdf, - 0x08, 0x79, 0x7f, 0x86, 0x99, 0x7f, 0x9f, 0x14, 0x63, 0x62, 0x34, 0x2d, 0xd3, 0xc1, 0x0f, 0x70, - 0x6b, 0xf2, 0x7e, 0x42, 0xa4, 0x65, 0x70, 0x0a, 0x26, 0x1c, 0x9b, 0x5f, 0xa7, 0xf7, 0x5e, 0xf9, - 0x1e, 0x27, 0x2b, 0xf6, 0x38, 0x15, 0x38, 0x63, 0x98, 0xcd, 0xf6, 0x6e, 0x0b, 0x6b, 0xb8, 0xad, - 0xbb, 0xb5, 0xea, 0x16, 0xba, 0x8b, 0xb8, 0x83, 0xcd, 0x16, 0x36, 0x1d, 0xca, 0xa7, 0xe7, 0x93, - 0x2b, 0x91, 0x13, 0x7d, 0x83, 0x57, 0x8c, 0x3b, 0x45, 0xc5, 0x78, 0x6c, 0xbf, 0x79, 0x45, 0x84, - 0x11, 0x7a, 0x1b, 0x00, 0xad, 0xdb, 0x59, 0x03, 0x5f, 0x64, 0x1d, 0xe2, 0x15, 0x3d, 0xa6, 0x68, - 0xd5, 0xcf, 0xa0, 0x71, 0x99, 0xd1, 0x57, 0x7c, 0x65, 0xb8, 0x5b, 0x50, 0x86, 0x9b, 0x24, 0x59, - 0x88, 0xa7, 0x07, 0x9d, 0x21, 0xd6, 0x3a, 0x66, 0x61, 0x2a, 0x58, 0xa1, 0x54, 0xd4, 0x2b, 0xe0, - 0x84, 0xe7, 0xf3, 0x50, 0x29, 0x95, 0x16, 0x6b, 0x8d, 0x8d, 0xf5, 0x65, 0xad, 0xb0, 0x58, 0xca, - 0x83, 0xaa, 0xc2, 0x5c, 0x75, 0xe1, 0x9e, 0x52, 0xb1, 0xee, 0xbb, 0x2a, 0x64, 0xd0, 0x9f, 0xa5, - 0x21, 0x4b, 0x1c, 0xca, 0xd1, 0x4f, 0x8d, 0x48, 0x73, 0xba, 0xc2, 0x0e, 0x8f, 0x3f, 0x91, 0x92, - 0x8f, 0x55, 0xc9, 0x84, 0x49, 0xb8, 0x3a, 0x50, 0xac, 0xca, 0x08, 0x42, 0xc9, 0x37, 0x4f, 0xb7, - 0x49, 0xd6, 0xb6, 0xad, 0x8b, 0x3f, 0xca, 0x4d, 0xd2, 0xad, 0xff, 0x21, 0x37, 0xc9, 0x3e, 0x2c, - 0x8c, 0xbd, 0x49, 0xf6, 0x69, 0x77, 0x11, 0xcd, 0x14, 0x3d, 0x3b, 0xeb, 0x2f, 0xc8, 0x3c, 0x2f, - 0x7d, 0xa0, 0x05, 0x99, 0x02, 0xcc, 0x1a, 0xa6, 0x83, 0x6d, 0x53, 0x6f, 0x2f, 0xb5, 0xf5, 0x2d, - 0xef, 0x00, 0x7d, 0xef, 0x2c, 0xbc, 0xcc, 0xe5, 0xd1, 0xc4, 0x3f, 0xd4, 0xd3, 0x00, 0x0e, 0xde, - 0xe9, 0xb4, 0x75, 0x27, 0x50, 0x3d, 0x2e, 0x85, 0xd7, 0xbe, 0x8c, 0xa8, 0x7d, 0xb7, 0xc0, 0x65, - 0x14, 0xb4, 0xfa, 0xa5, 0x0e, 0xde, 0x30, 0x8d, 0x9f, 0xde, 0x25, 0x21, 0x94, 0xa8, 0x8e, 0xf6, - 0xfb, 0x24, 0x2c, 0x4b, 0xe4, 0x7a, 0x96, 0x25, 0xfe, 0x5e, 0xfa, 0x68, 0xa6, 0xd7, 0xea, 0x07, - 0x1c, 0xcd, 0xf4, 0x5b, 0x9a, 0xd2, 0xd3, 0xd2, 0x7c, 0x63, 0x21, 0x23, 0x61, 0x2c, 0xf0, 0xa8, - 0x64, 0x25, 0x0d, 0xed, 0xd7, 0x4b, 0x9d, 0xfd, 0x8c, 0xaa, 0xc6, 0x18, 0x26, 0x72, 0x0a, 0xcc, - 0xd1, 0xa2, 0x17, 0x2c, 0xeb, 0xc2, 0x8e, 0x6e, 0x5f, 0x40, 0xf6, 0x81, 0x54, 0x31, 0x72, 0x4d, - 0x24, 0x74, 0xa1, 0xef, 0x33, 0x3c, 0xea, 0xcb, 0x22, 0xea, 0x4f, 0x08, 0x17, 0x97, 0xc7, 0xf3, - 0x78, 0x16, 0x45, 0xde, 0xe2, 0xe3, 0x79, 0x8f, 0x80, 0xe7, 0x93, 0x63, 0x33, 0x98, 0x3c, 0xae, - 0x7f, 0xe0, 0xe3, 0xea, 0x75, 0xf4, 0xfc, 0x7c, 0x72, 0x94, 0xb8, 0xa2, 0xaf, 0x0e, 0x87, 0x9d, - 0xc7, 0xd7, 0x10, 0xd8, 0xe5, 0x41, 0xb9, 0xe0, 0x6f, 0x61, 0xb9, 0x8f, 0x7c, 0x85, 0x32, 0xc9, - 0xa1, 0x19, 0xc2, 0xf2, 0x58, 0xd0, 0x3c, 0x2e, 0xb2, 0x50, 0xed, 0x24, 0x8a, 0xe9, 0x97, 0xa5, - 0xd7, 0x69, 0xfa, 0x0a, 0x88, 0x72, 0x37, 0x9e, 0x56, 0x29, 0xb7, 0xc8, 0x23, 0xcf, 0x66, 0xf2, - 0x68, 0xbe, 0x28, 0x0b, 0x53, 0xde, 0xe1, 0x59, 0x12, 0xdb, 0xdd, 0xc7, 0xf0, 0x24, 0xe4, 0xba, - 0xd6, 0xae, 0xdd, 0xc4, 0x6c, 0xe5, 0x8c, 0xbd, 0x0d, 0xb1, 0xca, 0x33, 0x70, 0x3c, 0xdf, 0x67, - 0x32, 0x64, 0x62, 0x9b, 0x0c, 0xe1, 0x06, 0x69, 0xd4, 0x00, 0xff, 0x62, 0xe9, 0x80, 0x9c, 0x02, - 0x66, 0x35, 0xec, 0x3c, 0x12, 0xc7, 0xf8, 0xdf, 0x95, 0x5a, 0x43, 0x18, 0x50, 0x93, 0x78, 0x2a, - 0x57, 0x1d, 0xc2, 0x50, 0xbd, 0x12, 0x2e, 0xf7, 0x72, 0x30, 0x0b, 0x95, 0x58, 0xa4, 0x1b, 0xda, - 0x6a, 0x5e, 0x41, 0xcf, 0xc9, 0x40, 0x9e, 0xb2, 0x56, 0xf5, 0x8d, 0x35, 0xf4, 0xf2, 0xd4, 0x61, - 0x5b, 0xa4, 0xe1, 0x53, 0xcc, 0xcf, 0xa5, 0x65, 0x83, 0x7e, 0x09, 0x82, 0x0f, 0x6a, 0x17, 0xa2, - 0x49, 0x43, 0x34, 0xb3, 0x08, 0xe5, 0x43, 0xbf, 0x9e, 0x92, 0x89, 0x21, 0x26, 0xc7, 0x62, 0xf2, - 0xbd, 0xd2, 0x17, 0x33, 0x5e, 0x0c, 0x84, 0x25, 0xdb, 0xda, 0xd9, 0xb0, 0xdb, 0xe8, 0xff, 0x94, - 0x0a, 0xd1, 0x18, 0x62, 0xfe, 0xa7, 0xc3, 0xcd, 0xff, 0x3c, 0x28, 0xbb, 0x76, 0xdb, 0x1b, 0xbe, - 0x77, 0xed, 0xf6, 0x10, 0xc3, 0xb7, 0x7a, 0x3d, 0xcc, 0xe9, 0xad, 0xd6, 0xba, 0xbe, 0x85, 0x8b, - 0xee, 0xbc, 0xda, 0x74, 0xd8, 0xf9, 0xe8, 0x9e, 0xd4, 0xc8, 0xae, 0xe8, 0x1b, 0xd2, 0x3b, 0x71, - 0x02, 0x48, 0x4c, 0x3e, 0x63, 0x19, 0xde, 0xdc, 0x21, 0xa1, 0xb9, 0xad, 0x07, 0xd1, 0x1a, 0xd8, - 0x9b, 0xe4, 0x0e, 0x9d, 0x04, 0xdf, 0xc9, 0x6b, 0xd6, 0x6f, 0xa7, 0x61, 0xc2, 0x95, 0x77, 0xa1, - 0xd5, 0x42, 0x8f, 0x11, 0x82, 0x9a, 0x84, 0xee, 0x91, 0xbe, 0x40, 0x7a, 0x73, 0xda, 0xab, 0x21, - 0xa5, 0x1f, 0x82, 0x49, 0x20, 0xc4, 0xb4, 0x20, 0x44, 0xb9, 0x3d, 0xe8, 0xc8, 0x22, 0x92, 0x17, - 0xdf, 0xa7, 0xd3, 0x30, 0xeb, 0xcd, 0x23, 0x96, 0xb0, 0xd3, 0xdc, 0x46, 0xb7, 0xc9, 0x2e, 0x34, - 0xb1, 0x96, 0x96, 0xf6, 0x5b, 0x1a, 0xfa, 0x41, 0x2a, 0xa6, 0xca, 0x0b, 0x25, 0x87, 0xac, 0xd2, - 0xc5, 0xd2, 0xc5, 0x28, 0x82, 0xc9, 0x0b, 0xf3, 0x2b, 0x69, 0x80, 0xba, 0xe5, 0xcf, 0x75, 0x0f, - 0x20, 0xc9, 0x97, 0x4a, 0xdf, 0x97, 0xc0, 0x2a, 0x1e, 0x14, 0x1b, 0xbf, 0xe7, 0x90, 0xdc, 0x62, - 0x1b, 0x54, 0xd2, 0x58, 0xda, 0xfa, 0xd4, 0xe2, 0x6e, 0xa7, 0x6d, 0x34, 0x75, 0xa7, 0x77, 0x5f, - 0x38, 0x5c, 0xbc, 0xe4, 0xe2, 0xa3, 0x58, 0x46, 0xa1, 0x5f, 0x46, 0x88, 0x2c, 0xe9, 0x61, 0xdb, - 0xb4, 0x77, 0xd8, 0x56, 0x72, 0xaf, 0x67, 0x00, 0xf1, 0x31, 0xa8, 0xa7, 0x02, 0x47, 0xab, 0x1d, - 0x6c, 0x2e, 0xd8, 0x58, 0x6f, 0x35, 0xed, 0xdd, 0x9d, 0xf3, 0x5d, 0xde, 0xa9, 0x21, 0x5a, 0x47, - 0xb9, 0xa5, 0xe3, 0xb4, 0xb0, 0x74, 0x8c, 0x9e, 0xab, 0xc8, 0x1e, 0xfd, 0xe6, 0x36, 0x38, 0x38, - 0x1e, 0x86, 0x18, 0xea, 0x62, 0x6d, 0xc5, 0xf5, 0xac, 0x12, 0x67, 0xe2, 0xac, 0x12, 0xbf, 0x55, - 0xea, 0x20, 0xb9, 0x54, 0xbd, 0xc6, 0xb2, 0xa3, 0x3a, 0x57, 0xc3, 0x4e, 0x08, 0xbc, 0xd7, 0xc1, - 0xec, 0xf9, 0xe0, 0x8b, 0x0f, 0xb1, 0x98, 0xd8, 0xc7, 0xcf, 0xe1, 0x6d, 0x71, 0x57, 0x60, 0x44, - 0x16, 0x42, 0xd0, 0xf5, 0x11, 0x4c, 0xcb, 0x6c, 0xa6, 0xc6, 0x5a, 0x4e, 0x89, 0x2c, 0x3f, 0x79, - 0x14, 0x3e, 0x9e, 0x86, 0x69, 0x72, 0x9d, 0xd3, 0xc2, 0x25, 0xe2, 0x9d, 0x2f, 0x69, 0x94, 0xbc, - 0x88, 0x17, 0xb3, 0x0a, 0x99, 0xb6, 0x61, 0x5e, 0xf0, 0x76, 0xc1, 0xdd, 0xe7, 0xe0, 0x72, 0x90, - 0x74, 0x9f, 0xcb, 0x41, 0xfc, 0x7d, 0x0a, 0xbf, 0xdc, 0x03, 0xdd, 0x56, 0x37, 0x90, 0x5c, 0xf2, - 0x62, 0xfc, 0xdb, 0x0c, 0xe4, 0x6a, 0x58, 0xb7, 0x9b, 0xdb, 0xe8, 0xfd, 0xe9, 0xbe, 0x53, 0x85, - 0x49, 0x71, 0xaa, 0xb0, 0x04, 0x13, 0x9b, 0x46, 0xdb, 0xc1, 0x36, 0xf5, 0x0c, 0xe2, 0xbb, 0x76, - 0xda, 0xc4, 0x17, 0xda, 0x56, 0xf3, 0xc2, 0x3c, 0x33, 0xdd, 0xe7, 0xbd, 0x60, 0x52, 0xf3, 0x4b, - 0xe4, 0x27, 0xcd, 0xfb, 0xd9, 0x35, 0x08, 0xbb, 0x96, 0xed, 0x84, 0xc5, 0x09, 0x0e, 0xa1, 0x52, - 0xb3, 0x6c, 0x47, 0xa3, 0x3f, 0xba, 0x30, 0x6f, 0xee, 0xb6, 0xdb, 0x75, 0xfc, 0x80, 0xe3, 0x4d, - 0xdb, 0xbc, 0x77, 0xd7, 0x58, 0xb4, 0x36, 0x37, 0xbb, 0x98, 0x2e, 0x1a, 0x64, 0x35, 0xf6, 0xa6, - 0x1e, 0x87, 0x6c, 0xdb, 0xd8, 0x31, 0xe8, 0x44, 0x23, 0xab, 0xd1, 0x17, 0xf5, 0x46, 0xc8, 0x07, - 0x73, 0x1c, 0xca, 0xe8, 0xa9, 0x1c, 0x69, 0x9a, 0xfb, 0xd2, 0x5d, 0x9d, 0xb9, 0x80, 0x2f, 0x75, - 0x4f, 0x4d, 0x90, 0xef, 0xe4, 0x59, 0x74, 0xc3, 0x94, 0xd9, 0xef, 0xa0, 0x12, 0x0f, 0x9f, 0xc1, - 0xda, 0xb8, 0x69, 0xd9, 0x2d, 0x4f, 0x36, 0xe1, 0x13, 0x0c, 0x96, 0x2f, 0xde, 0x2e, 0x45, 0xdf, - 0xc2, 0xc7, 0xe0, 0x02, 0x91, 0x73, 0xbb, 0x4d, 0xb7, 0xe8, 0x73, 0x86, 0xb3, 0xbd, 0x86, 0x1d, - 0x1d, 0xfd, 0xad, 0xd2, 0x57, 0xe3, 0xa6, 0xff, 0x7f, 0x8d, 0x1b, 0xa0, 0x71, 0x34, 0x4c, 0x80, - 0xb3, 0x6b, 0x9b, 0xae, 0x1c, 0x59, 0x60, 0x2e, 0x2e, 0x45, 0xbd, 0x03, 0xae, 0x08, 0xde, 0xbc, - 0xa5, 0xd2, 0x45, 0x36, 0x6d, 0x9d, 0x22, 0xd9, 0xc3, 0x33, 0xa8, 0xeb, 0x70, 0x2d, 0xfd, 0xb8, - 0x52, 0x5f, 0x5b, 0x5d, 0x31, 0xb6, 0xb6, 0xdb, 0xc6, 0xd6, 0xb6, 0xd3, 0x2d, 0x9b, 0x5d, 0x07, - 0xeb, 0xad, 0xea, 0xa6, 0x46, 0x23, 0x7c, 0x03, 0xa1, 0x23, 0x93, 0x55, 0xf4, 0x1c, 0x92, 0x1b, - 0xdd, 0x78, 0x4d, 0x09, 0x69, 0x29, 0x4f, 0x76, 0x5b, 0x4a, 0x77, 0xb7, 0xed, 0x63, 0x7a, 0x55, - 0x0f, 0xa6, 0x81, 0xaa, 0xef, 0xb6, 0x49, 0x73, 0x21, 0x99, 0xe3, 0x8e, 0x73, 0x11, 0x9c, 0x24, - 0xdf, 0x6c, 0xfe, 0xdf, 0x1c, 0x64, 0x97, 0x6d, 0xbd, 0xb3, 0x8d, 0x9e, 0xc3, 0xf5, 0xcf, 0xa3, - 0x6a, 0x13, 0xbe, 0x76, 0xa6, 0x07, 0x69, 0xa7, 0x32, 0x40, 0x3b, 0x33, 0x9c, 0x76, 0x86, 0x2f, - 0x2a, 0x9f, 0x81, 0x99, 0xa6, 0xd5, 0x6e, 0xe3, 0xa6, 0x2b, 0x8f, 0x72, 0x8b, 0xac, 0xe6, 0x4c, - 0x69, 0x42, 0x1a, 0x09, 0xb8, 0x87, 0x9d, 0x1a, 0x5d, 0x43, 0xa7, 0x4a, 0x1f, 0x24, 0xa0, 0x97, - 0xa7, 0x21, 0x53, 0x6a, 0x6d, 0x61, 0x61, 0x9d, 0x3d, 0xc5, 0xad, 0xb3, 0x9f, 0x84, 0x9c, 0xa3, - 0xdb, 0x5b, 0xd8, 0xf1, 0xd6, 0x09, 0xe8, 0x9b, 0x1f, 0x07, 0x50, 0xe1, 0xe2, 0x00, 0x3e, 0x05, - 0x32, 0xae, 0xcc, 0x58, 0x84, 0x9d, 0x6b, 0xfb, 0xc1, 0x4f, 0x64, 0x3f, 0xef, 0x96, 0x38, 0xef, - 0xd6, 0x5a, 0x23, 0x3f, 0xf4, 0x62, 0x9d, 0xdd, 0x87, 0x35, 0xb9, 0xac, 0xa8, 0x69, 0x99, 0xe5, - 0x1d, 0x7d, 0x0b, 0xb3, 0x6a, 0x06, 0x09, 0xde, 0xd7, 0xd2, 0x8e, 0x75, 0xbf, 0xc1, 0x42, 0xf2, - 0x05, 0x09, 0x6e, 0x15, 0xb6, 0x8d, 0x56, 0x0b, 0x9b, 0xac, 0x65, 0xb3, 0xb7, 0x33, 0xa7, 0x21, - 0xe3, 0xf2, 0xe0, 0xea, 0x8f, 0x6b, 0x2c, 0xe4, 0x8f, 0xa8, 0x33, 0x6e, 0xb3, 0xa2, 0x8d, 0x37, - 0x9f, 0x12, 0xd7, 0x54, 0x65, 0xdc, 0x76, 0x68, 0xe5, 0xfa, 0x37, 0xae, 0xc7, 0x43, 0xd6, 0xb4, - 0x5a, 0x78, 0xe0, 0x20, 0x44, 0x73, 0xa9, 0x4f, 0x82, 0x2c, 0x6e, 0xb9, 0xbd, 0x82, 0x42, 0xb2, - 0x9f, 0x8e, 0x96, 0xa5, 0x46, 0x33, 0xc7, 0xf3, 0x0d, 0xea, 0xc7, 0x6d, 0xf2, 0x0d, 0xf0, 0x17, - 0x26, 0xe0, 0x28, 0xed, 0x03, 0x6a, 0xbb, 0xe7, 0x5d, 0x52, 0xe7, 0x31, 0x7a, 0xb8, 0xff, 0xc0, - 0x75, 0x54, 0x54, 0xf6, 0xe3, 0x90, 0xed, 0xee, 0x9e, 0xf7, 0x8d, 0x50, 0xfa, 0xc2, 0x37, 0xdd, - 0xf4, 0x48, 0x86, 0x33, 0x65, 0xd8, 0xe1, 0x4c, 0x18, 0x9a, 0x14, 0xaf, 0xf1, 0x07, 0x03, 0x59, - 0x8e, 0x24, 0x7b, 0x03, 0x59, 0xbf, 0x61, 0xe8, 0x14, 0x4c, 0xe8, 0x9b, 0x0e, 0xb6, 0x03, 0x33, - 0x91, 0xbd, 0xba, 0x43, 0xe5, 0x79, 0xbc, 0x69, 0xd9, 0xae, 0x58, 0xa6, 0xe8, 0x50, 0xe9, 0xbd, - 0x73, 0x2d, 0x17, 0x84, 0x1d, 0xb2, 0x9b, 0xe0, 0x98, 0x69, 0x2d, 0xe2, 0x0e, 0x93, 0x33, 0x45, - 0x71, 0x96, 0xb4, 0x80, 0xfd, 0x1f, 0xf6, 0x75, 0x25, 0x73, 0xfb, 0xbb, 0x12, 0xf4, 0xd9, 0xb8, - 0x73, 0xe6, 0x1e, 0xa0, 0x47, 0x66, 0xa1, 0xa9, 0x4f, 0x83, 0x99, 0x16, 0x73, 0xd1, 0x6a, 0x1a, - 0x7e, 0x2b, 0x09, 0xfd, 0x4f, 0xc8, 0x1c, 0x28, 0x52, 0x86, 0x57, 0xa4, 0x65, 0x98, 0x24, 0x07, - 0x72, 0x5c, 0x4d, 0xca, 0xf6, 0xc4, 0x2b, 0x24, 0xd3, 0x3a, 0xbf, 0x52, 0x9c, 0xd8, 0xe6, 0x8b, - 0xec, 0x17, 0xcd, 0xff, 0x39, 0xde, 0xec, 0x3b, 0x5a, 0x42, 0xc9, 0x37, 0xc7, 0xdf, 0xc8, 0xc1, - 0x15, 0x45, 0xdb, 0xea, 0x76, 0x49, 0x14, 0x8a, 0xde, 0x86, 0xf9, 0xe6, 0xb4, 0x10, 0x11, 0xf8, - 0x11, 0xdd, 0xfc, 0xfa, 0x35, 0xa8, 0xf1, 0x35, 0x8d, 0x6f, 0x48, 0x1f, 0x65, 0xf6, 0xf7, 0x1f, - 0x42, 0x84, 0xfe, 0xa3, 0xd1, 0x48, 0xde, 0x93, 0x92, 0x39, 0x5d, 0x1d, 0x53, 0x56, 0xc9, 0x37, - 0x97, 0x2f, 0xa7, 0xe1, 0xca, 0x5e, 0x6e, 0x36, 0xcc, 0xae, 0xdf, 0x60, 0xae, 0x1e, 0xd0, 0x5e, - 0xc4, 0xd3, 0xb8, 0x91, 0x77, 0xf1, 0x84, 0xd4, 0x9d, 0x2b, 0x2d, 0x64, 0xb1, 0xe4, 0x7d, 0x29, - 0x99, 0xbb, 0x78, 0x62, 0x93, 0x4f, 0x5e, 0xb8, 0x9f, 0xcb, 0xc0, 0xd1, 0x65, 0xdb, 0xda, 0xed, - 0x74, 0x83, 0x1e, 0xe8, 0xaf, 0xfa, 0x6f, 0xb8, 0xe6, 0x64, 0x4c, 0x83, 0x6b, 0x60, 0xda, 0x66, - 0xd6, 0x5c, 0xb0, 0xfd, 0xca, 0x27, 0xf1, 0xbd, 0x97, 0x72, 0x90, 0xde, 0x2b, 0xe8, 0x67, 0x32, - 0x42, 0x3f, 0xd3, 0xdb, 0x73, 0x64, 0xfb, 0xf4, 0x1c, 0x7f, 0x99, 0x8e, 0x39, 0xa8, 0xf6, 0x88, - 0x28, 0xa4, 0xbf, 0x28, 0x42, 0x6e, 0x8b, 0x64, 0x64, 0xdd, 0xc5, 0xe3, 0xe4, 0x6a, 0x46, 0x88, - 0x6b, 0xec, 0xd7, 0x40, 0xae, 0x0a, 0xaf, 0xc3, 0xb1, 0x06, 0xb8, 0x68, 0x6e, 0x93, 0x57, 0xaa, - 0x87, 0x32, 0x30, 0xe3, 0x97, 0x5e, 0x6e, 0x75, 0xd1, 0x8b, 0xfa, 0x6b, 0xd4, 0xac, 0x8c, 0x46, - 0xed, 0x5b, 0x67, 0xf6, 0x47, 0x1d, 0x85, 0x1b, 0x75, 0xfa, 0x8e, 0x2e, 0x33, 0x21, 0xa3, 0x0b, - 0x7a, 0xb6, 0x22, 0x1b, 0x53, 0x5f, 0xec, 0x5a, 0x49, 0x6d, 0x1e, 0xc9, 0x83, 0x85, 0x64, 0x64, - 0xff, 0xc1, 0xb5, 0x4a, 0x5e, 0x49, 0x3e, 0x94, 0x86, 0x63, 0xfb, 0x3b, 0xf3, 0x47, 0x8b, 0x5e, - 0x68, 0x6e, 0x9d, 0xba, 0xbe, 0x17, 0x1a, 0x79, 0x13, 0x37, 0xe9, 0x22, 0x8f, 0xc6, 0x0a, 0xf6, - 0xde, 0xe0, 0x4e, 0x5c, 0xee, 0xf0, 0xab, 0x24, 0xd1, 0xe4, 0x05, 0xf8, 0xcb, 0x0a, 0x4c, 0xd5, - 0xb0, 0xb3, 0xaa, 0x5f, 0xb2, 0x76, 0x1d, 0xa4, 0xcb, 0x6e, 0xcf, 0x3d, 0x15, 0x72, 0x6d, 0xf2, - 0x0b, 0xbb, 0xaa, 0xf4, 0x9a, 0xbe, 0xfb, 0x5b, 0xc4, 0xf7, 0x87, 0x92, 0xd6, 0x58, 0x7e, 0xf1, - 0x4c, 0xb2, 0xcc, 0xee, 0xa8, 0xcf, 0xdd, 0x48, 0xb6, 0x76, 0x62, 0xed, 0x9d, 0x86, 0x15, 0x9d, - 0x3c, 0x2c, 0xcf, 0x55, 0x60, 0xb6, 0x86, 0x9d, 0x72, 0x77, 0x49, 0xdf, 0xb3, 0x6c, 0xc3, 0xc1, - 0xfc, 0x5d, 0x45, 0xd1, 0xd0, 0x9c, 0x06, 0x30, 0xfc, 0xdf, 0x58, 0xa4, 0x04, 0x2e, 0x05, 0xfd, - 0x7a, 0x5c, 0x47, 0x21, 0x81, 0x8f, 0x91, 0x80, 0x10, 0xcb, 0xc7, 0x22, 0xaa, 0xf8, 0xe4, 0x81, - 0xf8, 0x52, 0x9a, 0x01, 0x51, 0xb0, 0x9b, 0xdb, 0xc6, 0x1e, 0x6e, 0xc5, 0x04, 0xc2, 0xfb, 0x2d, - 0x00, 0xc2, 0x27, 0x14, 0xdb, 0x7d, 0x45, 0xe0, 0x63, 0x14, 0xee, 0x2b, 0x51, 0x04, 0xc7, 0x12, - 0xec, 0xc0, 0xed, 0x7a, 0xd8, 0x7a, 0xe6, 0x5d, 0xb2, 0x62, 0x0d, 0x4c, 0xb6, 0x34, 0x6f, 0xb2, - 0x0d, 0xd5, 0xb1, 0xd0, 0xb2, 0x07, 0xe9, 0x74, 0x26, 0x89, 0x8e, 0xa5, 0x6f, 0xd1, 0xc9, 0x0b, - 0xfd, 0x7d, 0x0a, 0x9c, 0xf0, 0x4f, 0x01, 0xd7, 0xb0, 0xb3, 0xa8, 0x77, 0xb7, 0xcf, 0x5b, 0xba, - 0xdd, 0xe2, 0xaf, 0xb0, 0x1d, 0xfa, 0xc4, 0x1f, 0xfa, 0x22, 0x0f, 0x42, 0x45, 0x04, 0xa1, 0xaf, - 0xab, 0x68, 0x5f, 0x5e, 0x46, 0xd1, 0xc9, 0x44, 0x7a, 0xb3, 0xfe, 0xa6, 0x0f, 0xd6, 0x33, 0x04, - 0xb0, 0xee, 0x1c, 0x96, 0xc5, 0xe4, 0x81, 0xfb, 0x35, 0x3a, 0x22, 0x70, 0x5e, 0xcd, 0xf7, 0xc9, - 0x02, 0x16, 0xe2, 0xd5, 0xaa, 0x84, 0x7a, 0xb5, 0x0e, 0x35, 0x46, 0x0c, 0xf4, 0x48, 0x4e, 0x76, - 0x8c, 0x38, 0x44, 0x6f, 0xe3, 0x77, 0x29, 0x90, 0x27, 0x61, 0x20, 0x38, 0x8f, 0x6f, 0x74, 0xbf, - 0x2c, 0x3a, 0xfb, 0xbc, 0xcb, 0x27, 0xe2, 0x7a, 0x97, 0xa3, 0x77, 0xc6, 0xf5, 0x21, 0xef, 0xe5, - 0x76, 0x24, 0x88, 0xc5, 0x72, 0x11, 0x1f, 0xc0, 0x41, 0xf2, 0xa0, 0xfd, 0x37, 0x05, 0xc0, 0x6d, - 0xd0, 0xec, 0xec, 0xc3, 0x33, 0x65, 0xe1, 0xba, 0x99, 0xf7, 0xab, 0x77, 0x81, 0x3a, 0xd1, 0x03, - 0x14, 0xa5, 0x18, 0x9c, 0xaa, 0x78, 0x38, 0xae, 0x6f, 0x65, 0xc0, 0xd5, 0x48, 0x60, 0x89, 0xe5, - 0x6d, 0x19, 0x5a, 0x76, 0xf2, 0x80, 0xfc, 0x8f, 0x34, 0x64, 0xeb, 0x56, 0x0d, 0x3b, 0x07, 0x37, - 0x05, 0x62, 0x1f, 0xdb, 0x27, 0xe5, 0x8e, 0xe2, 0xd8, 0x7e, 0x3f, 0x42, 0xc9, 0x8b, 0xee, 0xbd, - 0x69, 0x98, 0xa9, 0x5b, 0x45, 0x7f, 0x71, 0x4a, 0xde, 0x57, 0x55, 0xfe, 0x5e, 0x40, 0xbf, 0x82, - 0x41, 0x31, 0x07, 0xba, 0x17, 0x70, 0x30, 0xbd, 0xe4, 0xe5, 0x76, 0x1b, 0x1c, 0xdd, 0x30, 0x5b, - 0x96, 0x86, 0x5b, 0x16, 0x5b, 0xe9, 0x56, 0x55, 0xc8, 0xec, 0x9a, 0x2d, 0x8b, 0xb0, 0x9c, 0xd5, - 0xc8, 0xb3, 0x9b, 0x66, 0xe3, 0x96, 0xc5, 0x7c, 0x03, 0xc8, 0x33, 0xfa, 0x86, 0x02, 0x19, 0xf7, - 0x5f, 0x79, 0x51, 0xbf, 0x4b, 0x89, 0x19, 0x88, 0xc0, 0x25, 0x3f, 0x12, 0x4b, 0xe8, 0x2e, 0x6e, - 0xed, 0x9f, 0x7a, 0xb0, 0x5e, 0x1b, 0x56, 0x1e, 0x27, 0x8a, 0x60, 0xcd, 0x5f, 0x3d, 0x05, 0x13, - 0xe7, 0xdb, 0x56, 0xf3, 0x42, 0x70, 0x5e, 0x9e, 0xbd, 0xaa, 0x37, 0x42, 0xd6, 0xd6, 0xcd, 0x2d, - 0xcc, 0xf6, 0x14, 0x8e, 0xf7, 0xf4, 0x85, 0xc4, 0xeb, 0x45, 0xa3, 0x59, 0xd0, 0x3b, 0xe3, 0x84, - 0x40, 0xe8, 0x53, 0xf9, 0x78, 0xfa, 0xb0, 0x38, 0xc4, 0xc9, 0xb2, 0x3c, 0xcc, 0x14, 0x0b, 0xf4, - 0x06, 0xce, 0xb5, 0xea, 0xd9, 0x52, 0x5e, 0x21, 0x30, 0xbb, 0x32, 0x49, 0x10, 0x66, 0x97, 0xfc, - 0x8f, 0x2c, 0xcc, 0x7d, 0x2a, 0x7f, 0x18, 0x30, 0x7f, 0x3a, 0x0d, 0xb3, 0xab, 0x46, 0xd7, 0x09, - 0xf3, 0xf6, 0x8f, 0x88, 0x02, 0xf7, 0xe2, 0xb8, 0xa6, 0xb2, 0x50, 0x8e, 0x74, 0xf8, 0xb7, 0x58, - 0xe6, 0x70, 0x54, 0x11, 0xe3, 0x39, 0x96, 0x42, 0x38, 0xa0, 0xb7, 0xe6, 0x49, 0x4b, 0x32, 0xb6, - 0xa1, 0x14, 0x14, 0x32, 0x7e, 0x43, 0x29, 0xb4, 0xec, 0xe4, 0xe5, 0xfb, 0x8d, 0x34, 0x1c, 0x73, - 0x8b, 0x8f, 0x5a, 0x96, 0x0a, 0x17, 0xf3, 0xc0, 0x65, 0xa9, 0xd8, 0x2b, 0xe3, 0xfb, 0x78, 0x19, - 0xc5, 0xca, 0xf8, 0x20, 0xa2, 0x63, 0x16, 0x73, 0xc8, 0x32, 0xec, 0x20, 0x31, 0x47, 0x2c, 0xc3, - 0x0e, 0x2f, 0xe6, 0xe8, 0xa5, 0xd8, 0x21, 0xc5, 0x7c, 0x68, 0x0b, 0xac, 0x6f, 0x54, 0x7c, 0x31, - 0x87, 0xae, 0x6d, 0x44, 0x88, 0x39, 0xf6, 0x89, 0x5d, 0xf4, 0xee, 0x21, 0x05, 0x3f, 0xe2, 0xf5, - 0x8d, 0x61, 0x60, 0x3a, 0xc4, 0x35, 0x8e, 0x57, 0x28, 0x30, 0xc7, 0xb8, 0xe8, 0x3f, 0x65, 0x8e, - 0xc0, 0x28, 0xf6, 0x94, 0x39, 0xf6, 0x19, 0x20, 0x91, 0xb3, 0xf1, 0x9f, 0x01, 0x8a, 0x2c, 0x3f, - 0x79, 0x70, 0xbe, 0x99, 0x81, 0x93, 0x2e, 0x0b, 0x6b, 0x56, 0xcb, 0xd8, 0xbc, 0x44, 0xb9, 0x38, - 0xab, 0xb7, 0x77, 0x71, 0x17, 0x7d, 0x20, 0x2d, 0x8b, 0xd2, 0x7f, 0x02, 0xb0, 0x3a, 0xd8, 0xa6, - 0x81, 0xd4, 0x18, 0x50, 0x77, 0x84, 0x55, 0x76, 0x7f, 0x49, 0x7e, 0x50, 0xf4, 0xaa, 0x47, 0x44, - 0xe3, 0xe8, 0xb9, 0x56, 0xe1, 0x94, 0xff, 0xa5, 0xd7, 0xc1, 0x23, 0xb5, 0xdf, 0xc1, 0xe3, 0x06, - 0x50, 0xf4, 0x56, 0xcb, 0x87, 0xaa, 0x77, 0x33, 0x9b, 0x94, 0xa9, 0xb9, 0x59, 0xdc, 0x9c, 0x5d, - 0x1c, 0x1c, 0xcd, 0x0b, 0xc9, 0xd9, 0xc5, 0x8e, 0x3a, 0x0f, 0x39, 0x7a, 0x83, 0xa0, 0xbf, 0xa2, - 0xdf, 0x3f, 0x33, 0xcb, 0x25, 0x9a, 0x76, 0x55, 0x51, 0x0d, 0x6f, 0x8b, 0x25, 0x99, 0x7e, 0xfd, - 0x74, 0x60, 0x27, 0x6b, 0x82, 0x82, 0x3d, 0x7d, 0x68, 0xca, 0xe3, 0xd9, 0x0d, 0x2b, 0x74, 0x3a, - 0xed, 0x4b, 0x75, 0x16, 0x7c, 0x25, 0xd6, 0x6e, 0x18, 0x17, 0xc3, 0x25, 0xdd, 0x1b, 0xc3, 0x25, - 0xfe, 0x6e, 0x98, 0xc0, 0xc7, 0x28, 0x76, 0xc3, 0xa2, 0x08, 0x8e, 0x61, 0x3d, 0x32, 0x4b, 0xad, - 0x66, 0x16, 0xa3, 0xf6, 0x2d, 0xfd, 0x0f, 0xa1, 0x81, 0xe8, 0xec, 0xd2, 0x2f, 0x7c, 0x6d, 0x64, - 0x6c, 0x6e, 0xf5, 0x49, 0x90, 0xdb, 0xb4, 0xec, 0x1d, 0xdd, 0xdb, 0xb8, 0xef, 0x3d, 0x29, 0xc2, - 0xe2, 0xc2, 0x2e, 0x91, 0x3c, 0x1a, 0xcb, 0xeb, 0xce, 0x47, 0x9e, 0x65, 0x74, 0x58, 0xd4, 0x45, - 0xf7, 0x51, 0xbd, 0x0e, 0x66, 0x59, 0xf0, 0xc5, 0x0a, 0xee, 0x3a, 0xb8, 0xc5, 0x22, 0x56, 0x88, - 0x89, 0xea, 0x19, 0x98, 0x61, 0x09, 0x4b, 0x46, 0x1b, 0x77, 0x59, 0xd0, 0x0a, 0x21, 0x4d, 0x3d, - 0x09, 0x39, 0xa3, 0x7b, 0x4f, 0xd7, 0x32, 0x89, 0xff, 0xff, 0xa4, 0xc6, 0xde, 0xd4, 0x1b, 0xe0, - 0x28, 0xcb, 0xe7, 0x1b, 0xab, 0xf4, 0xc0, 0x4e, 0x6f, 0x32, 0xfa, 0xfc, 0x30, 0x13, 0x87, 0xd8, - 0xf1, 0x78, 0x5d, 0x14, 0x76, 0x9b, 0x4d, 0x8c, 0x5b, 0xec, 0x64, 0x93, 0xf7, 0x1a, 0x33, 0x52, - 0x6f, 0xec, 0x69, 0xc6, 0x21, 0x85, 0xea, 0xfd, 0xe8, 0x09, 0xc8, 0xd1, 0x6b, 0x2f, 0xd0, 0xcb, - 0xe6, 0xfa, 0x2a, 0xe3, 0x9c, 0xa8, 0x8c, 0x1b, 0x30, 0x63, 0x5a, 0x6e, 0x71, 0xeb, 0xba, 0xad, - 0xef, 0x74, 0xa3, 0x56, 0x11, 0x29, 0x5d, 0x7f, 0xc8, 0xa8, 0x70, 0xbf, 0xad, 0x1c, 0xd1, 0x04, - 0x32, 0xea, 0xff, 0x06, 0x47, 0xcf, 0xb3, 0x08, 0x00, 0x5d, 0x46, 0x39, 0x1d, 0xee, 0x63, 0xd7, - 0x43, 0x79, 0x41, 0xfc, 0x73, 0xe5, 0x88, 0xd6, 0x4b, 0x4c, 0xfd, 0x49, 0x98, 0x73, 0x5f, 0x5b, - 0xd6, 0x45, 0x8f, 0x71, 0x25, 0xdc, 0xd0, 0xe8, 0x21, 0xbf, 0x26, 0xfc, 0xb8, 0x72, 0x44, 0xeb, - 0x21, 0xa5, 0x56, 0x01, 0xb6, 0x9d, 0x9d, 0x36, 0x23, 0x9c, 0x09, 0x57, 0xc9, 0x1e, 0xc2, 0x2b, - 0xfe, 0x4f, 0x2b, 0x47, 0x34, 0x8e, 0x84, 0xba, 0x0a, 0x53, 0xce, 0x03, 0x0e, 0xa3, 0x97, 0x0d, - 0xdf, 0xdc, 0xee, 0xa1, 0x57, 0xf7, 0xfe, 0x59, 0x39, 0xa2, 0x05, 0x04, 0xd4, 0x32, 0x4c, 0x76, - 0xce, 0x33, 0x62, 0xb9, 0x3e, 0x57, 0xfd, 0xf7, 0x27, 0xb6, 0x7e, 0xde, 0xa7, 0xe5, 0xff, 0xee, - 0x32, 0xd6, 0xec, 0xee, 0x31, 0x5a, 0x13, 0xd2, 0x8c, 0x15, 0xbd, 0x7f, 0x5c, 0xc6, 0x7c, 0x02, - 0x6a, 0x19, 0xa6, 0xba, 0xa6, 0xde, 0xe9, 0x6e, 0x5b, 0x4e, 0xf7, 0xd4, 0x64, 0x8f, 0x1f, 0x64, - 0x38, 0xb5, 0x1a, 0xfb, 0x47, 0x0b, 0xfe, 0x56, 0x9f, 0x04, 0x27, 0x76, 0xc9, 0xf5, 0xa1, 0xa5, - 0x07, 0x8c, 0xae, 0x63, 0x98, 0x5b, 0x5e, 0x0c, 0x59, 0xda, 0x9b, 0xf4, 0xff, 0xa8, 0xce, 0xb3, - 0x13, 0x51, 0x40, 0xda, 0x26, 0xea, 0xdd, 0x8c, 0xa3, 0xc5, 0x72, 0x07, 0xa1, 0x9e, 0x06, 0x19, - 0xf7, 0x13, 0x39, 0xb3, 0x39, 0xd7, 0x7f, 0xa1, 0xaf, 0x57, 0x77, 0x48, 0x03, 0x76, 0x7f, 0x72, - 0xc7, 0x46, 0xd3, 0x5a, 0xb7, 0xad, 0x2d, 0x1b, 0x77, 0xbb, 0xcc, 0xe1, 0x90, 0x4b, 0x71, 0x1b, - 0xb8, 0xd1, 0x5d, 0x33, 0xb6, 0xa8, 0xf5, 0xc4, 0xfc, 0xdd, 0xf9, 0x24, 0x3a, 0xdb, 0xac, 0xe0, - 0x8b, 0xc4, 0x21, 0x98, 0x9c, 0xbf, 0x21, 0xb3, 0x4d, 0x2f, 0x05, 0x5d, 0x0f, 0x33, 0x7c, 0x23, - 0xa3, 0x77, 0x67, 0x19, 0x81, 0xed, 0xc5, 0xde, 0xd0, 0x75, 0x30, 0x27, 0xea, 0x34, 0x37, 0xc4, - 0x28, 0x5e, 0x57, 0x88, 0xae, 0x85, 0xa3, 0x3d, 0x0d, 0xcb, 0x8b, 0x29, 0x92, 0x0a, 0x62, 0x8a, - 0x5c, 0x03, 0x10, 0x68, 0x71, 0x5f, 0x32, 0x57, 0xc3, 0x94, 0xaf, 0x97, 0x7d, 0x33, 0x7c, 0x2d, - 0x05, 0x93, 0x9e, 0xb2, 0xf5, 0xcb, 0xe0, 0x8e, 0x2f, 0x26, 0xb7, 0x81, 0xc0, 0xa6, 0xd9, 0x42, - 0x9a, 0x3b, 0x8e, 0x04, 0x6e, 0xbb, 0x75, 0xc3, 0x69, 0x7b, 0x47, 0xdf, 0x7a, 0x93, 0xd5, 0x75, - 0x00, 0x83, 0x60, 0x54, 0x0f, 0xce, 0xc2, 0xdd, 0x12, 0xa3, 0x3d, 0x50, 0x7d, 0xe0, 0x68, 0x9c, - 0x79, 0x34, 0x3b, 0xa8, 0x36, 0x05, 0xd9, 0xda, 0x7a, 0xa1, 0x58, 0xca, 0x1f, 0x51, 0xe7, 0x00, - 0x4a, 0xcf, 0x5c, 0x2f, 0x69, 0xe5, 0x52, 0xa5, 0x58, 0xca, 0xa7, 0xd0, 0x2b, 0xd3, 0x30, 0xe5, - 0x37, 0x82, 0xbe, 0x95, 0x2c, 0x31, 0xd5, 0x1a, 0x78, 0x3d, 0xd1, 0xfe, 0x46, 0xc5, 0x2b, 0xd9, - 0x53, 0xe1, 0xf2, 0xdd, 0x2e, 0x5e, 0x32, 0xec, 0xae, 0xa3, 0x59, 0x17, 0x97, 0x2c, 0xdb, 0x8f, - 0x9a, 0xec, 0x5d, 0xc3, 0x1f, 0xf2, 0xd9, 0xb5, 0x28, 0x5a, 0x98, 0x1c, 0x8a, 0xc2, 0x36, 0x5b, - 0x19, 0x0e, 0x12, 0x5c, 0xba, 0x0e, 0xbd, 0xf7, 0xbe, 0x8b, 0x35, 0xeb, 0x62, 0xb7, 0x60, 0xb6, - 0x8a, 0x56, 0x7b, 0x77, 0xc7, 0xec, 0x32, 0x9b, 0x20, 0xec, 0xb3, 0x2b, 0x1d, 0x72, 0xf9, 0xd8, - 0x1c, 0x40, 0xb1, 0xba, 0xba, 0x5a, 0x2a, 0xd6, 0xcb, 0xd5, 0x4a, 0xfe, 0x88, 0x2b, 0xad, 0x7a, - 0x61, 0x61, 0xd5, 0x95, 0xce, 0x4f, 0xc1, 0xa4, 0xd7, 0xa6, 0x59, 0x18, 0x94, 0x94, 0x17, 0x06, - 0x45, 0x2d, 0xc0, 0xa4, 0xd7, 0xca, 0xd9, 0x88, 0xf0, 0x98, 0xde, 0x63, 0xaf, 0x3b, 0xba, 0xed, - 0x10, 0x7f, 0x69, 0x8f, 0xc8, 0x82, 0xde, 0xc5, 0x9a, 0xff, 0xdb, 0x99, 0xc7, 0x33, 0x0e, 0x54, - 0x98, 0x2b, 0xac, 0xae, 0x36, 0xaa, 0x5a, 0xa3, 0x52, 0xad, 0xaf, 0x94, 0x2b, 0xcb, 0x74, 0x84, - 0x2c, 0x2f, 0x57, 0xaa, 0x5a, 0x89, 0x0e, 0x90, 0xb5, 0x7c, 0x8a, 0x5e, 0x7e, 0xb7, 0x30, 0x09, - 0xb9, 0x0e, 0x91, 0x2e, 0xfa, 0xb2, 0x12, 0xf3, 0xbc, 0xbb, 0x8f, 0x53, 0xc8, 0xf5, 0x5c, 0x82, - 0xcf, 0x79, 0xba, 0xcf, 0x99, 0xd0, 0x33, 0x30, 0x43, 0x6d, 0xb9, 0x2e, 0x59, 0xbe, 0x67, 0x37, - 0xdc, 0x0a, 0x69, 0xe8, 0xe3, 0xe9, 0x18, 0x87, 0xe0, 0xfb, 0x72, 0x14, 0xcf, 0xb8, 0xf8, 0xd3, - 0x61, 0x2e, 0xbb, 0x53, 0x61, 0xae, 0x5c, 0xa9, 0x97, 0xb4, 0x4a, 0x61, 0x95, 0x65, 0x51, 0xd4, - 0x53, 0x70, 0xbc, 0x52, 0x65, 0x31, 0xfd, 0x6a, 0xe4, 0x5a, 0xed, 0xb5, 0xf5, 0xaa, 0x56, 0xcf, - 0x67, 0xd5, 0x93, 0xa0, 0xd2, 0x67, 0xe1, 0x56, 0xfa, 0x9c, 0xfa, 0x58, 0xb8, 0x76, 0xb5, 0xbc, - 0x56, 0xae, 0x37, 0xaa, 0x4b, 0x0d, 0xad, 0x7a, 0xae, 0xe6, 0x22, 0xa8, 0x95, 0x56, 0x0b, 0xae, - 0x22, 0x71, 0x97, 0xe0, 0x4d, 0xa8, 0x97, 0xc1, 0x51, 0x72, 0xc1, 0x25, 0xb9, 0xd9, 0x9e, 0x96, - 0x37, 0xa9, 0x5e, 0x05, 0xa7, 0xca, 0x95, 0xda, 0xc6, 0xd2, 0x52, 0xb9, 0x58, 0x2e, 0x55, 0xea, - 0x8d, 0xf5, 0x92, 0xb6, 0x56, 0xae, 0xd5, 0xdc, 0x7f, 0xf3, 0x53, 0xe4, 0x8a, 0x31, 0xda, 0x67, - 0xa2, 0xf7, 0x2b, 0x30, 0x7b, 0x56, 0x6f, 0x1b, 0xee, 0x40, 0x41, 0xee, 0x1e, 0xec, 0x39, 0x2e, - 0xe2, 0x90, 0x3b, 0x0a, 0x99, 0xc3, 0x39, 0x79, 0x41, 0x3f, 0xa7, 0xc4, 0x3c, 0x2e, 0xc2, 0x80, - 0xa0, 0x25, 0xce, 0x0b, 0xa5, 0x85, 0x4c, 0x6e, 0x5e, 0x9f, 0x8e, 0x71, 0x5c, 0x44, 0x9e, 0x7c, - 0x3c, 0xf0, 0x5f, 0x35, 0x2a, 0xf0, 0xf3, 0x30, 0xb3, 0x51, 0x29, 0x6c, 0xd4, 0x57, 0xaa, 0x5a, - 0xf9, 0x27, 0x48, 0xb4, 0xf1, 0x59, 0x98, 0x5a, 0xaa, 0x6a, 0x0b, 0xe5, 0xc5, 0xc5, 0x52, 0x25, - 0x9f, 0x55, 0x2f, 0x87, 0xcb, 0x6a, 0x25, 0xed, 0x6c, 0xb9, 0x58, 0x6a, 0x6c, 0x54, 0x0a, 0x67, - 0x0b, 0xe5, 0x55, 0xd2, 0x47, 0xe4, 0x22, 0xee, 0x4d, 0x9c, 0x40, 0x3f, 0x93, 0x01, 0xa0, 0x55, - 0x77, 0x2d, 0x69, 0xfe, 0x76, 0xbd, 0x3f, 0x8b, 0x3b, 0x69, 0x08, 0xc8, 0x84, 0xb4, 0xdf, 0x32, - 0x4c, 0xda, 0xec, 0x03, 0x5b, 0x3e, 0x19, 0x44, 0x87, 0x3e, 0x7a, 0xd4, 0x34, 0xff, 0x77, 0xf4, - 0x81, 0x38, 0x73, 0x84, 0x50, 0xc6, 0xe2, 0x21, 0xb9, 0x34, 0x1a, 0x20, 0xd1, 0x8b, 0x52, 0x30, - 0x27, 0x56, 0xcc, 0xad, 0x04, 0x31, 0xa6, 0xe4, 0x2a, 0x21, 0xfe, 0xcc, 0x19, 0x59, 0x67, 0x9e, - 0xc8, 0x86, 0x53, 0xf0, 0x5a, 0x26, 0x3d, 0xf9, 0xed, 0x59, 0x2c, 0xf9, 0x94, 0xcb, 0xbc, 0x6b, - 0x74, 0xd0, 0xab, 0xd5, 0xeb, 0x0f, 0x38, 0x79, 0x05, 0x7d, 0x4d, 0x81, 0x59, 0xe1, 0xfa, 0x3e, - 0xf4, 0xfa, 0x94, 0xcc, 0xd5, 0x5a, 0xdc, 0xc5, 0x80, 0xa9, 0x83, 0x5e, 0x0c, 0x78, 0xe6, 0x66, - 0x98, 0x60, 0x69, 0x44, 0xbe, 0xd5, 0x8a, 0x6b, 0x0a, 0x1c, 0x85, 0xe9, 0xe5, 0x52, 0xbd, 0x51, - 0xab, 0x17, 0xb4, 0x7a, 0x69, 0x31, 0x9f, 0x72, 0x07, 0xbe, 0xd2, 0xda, 0x7a, 0xfd, 0xbe, 0x7c, - 0x3a, 0xbe, 0x07, 0x5e, 0x2f, 0x23, 0x63, 0xf6, 0xc0, 0x8b, 0x2a, 0x3e, 0xf9, 0xb9, 0xea, 0x67, - 0x15, 0xc8, 0x53, 0x0e, 0x4a, 0x0f, 0x74, 0xb0, 0x6d, 0x60, 0xb3, 0x89, 0xd1, 0x05, 0x99, 0x88, - 0x9f, 0xfb, 0x62, 0xe1, 0x91, 0xfe, 0x9c, 0xb3, 0x12, 0xe9, 0x4b, 0x8f, 0x81, 0x9d, 0xd9, 0x67, - 0x60, 0x7f, 0x26, 0xae, 0x0b, 0x5e, 0x2f, 0xbb, 0x23, 0x81, 0xec, 0x53, 0x71, 0x5c, 0xf0, 0x06, - 0x70, 0x30, 0x96, 0x40, 0xbe, 0x21, 0xe3, 0x6f, 0x5e, 0x41, 0x2f, 0x54, 0xe0, 0xe8, 0xa2, 0xee, - 0xe0, 0x85, 0x4b, 0x75, 0x63, 0x07, 0x77, 0x1d, 0x7d, 0xa7, 0x13, 0x72, 0x25, 0x5e, 0x6a, 0xdf, - 0x95, 0x78, 0x8e, 0xf7, 0x07, 0xe1, 0x54, 0xd1, 0x82, 0x04, 0xf4, 0x9e, 0xb8, 0x87, 0xf6, 0x7a, - 0x78, 0x18, 0x59, 0xb4, 0xdd, 0x78, 0x87, 0xf1, 0xa2, 0xb9, 0x18, 0xc3, 0x0d, 0xb5, 0x53, 0x90, - 0xa7, 0xac, 0x70, 0x5e, 0x66, 0xbf, 0xcc, 0x6e, 0x91, 0x6c, 0xc4, 0x08, 0xea, 0xe7, 0x85, 0x49, - 0x48, 0x8b, 0x61, 0x12, 0x84, 0x45, 0x4b, 0xa5, 0xd7, 0x33, 0x20, 0x6e, 0x67, 0xc8, 0xb9, 0x94, - 0x85, 0xc7, 0x51, 0x4d, 0xae, 0x33, 0x8c, 0x2c, 0x7e, 0x3c, 0x37, 0x9d, 0xb1, 0xbb, 0x0c, 0x4b, - 0xb2, 0xc8, 0x44, 0x5f, 0xe8, 0x18, 0xd7, 0xbf, 0x58, 0x70, 0xe9, 0x8b, 0xb8, 0xe5, 0x30, 0x39, - 0xff, 0xe2, 0x41, 0x1c, 0x24, 0x8f, 0xc2, 0x0f, 0xd2, 0x90, 0xa9, 0x59, 0xb6, 0x33, 0x2a, 0x0c, - 0xe2, 0xee, 0x89, 0x72, 0x12, 0xa8, 0x85, 0xcf, 0x39, 0x93, 0xdb, 0x13, 0x8d, 0x2e, 0x7f, 0x0c, - 0x71, 0x11, 0x8f, 0xc2, 0x1c, 0xe5, 0xc4, 0xbf, 0x34, 0xe4, 0xdf, 0xd2, 0xb4, 0xbf, 0xba, 0x57, - 0x16, 0x91, 0x33, 0x30, 0xc3, 0xed, 0x49, 0xfa, 0x17, 0x66, 0xf3, 0x69, 0xe8, 0xcd, 0x3c, 0x2e, - 0x8b, 0x22, 0x2e, 0xfd, 0x66, 0xdc, 0xfe, 0xbd, 0x1b, 0xa3, 0xea, 0x99, 0xe2, 0x84, 0x58, 0x8c, - 0x28, 0x3c, 0x79, 0x44, 0x1e, 0x54, 0x20, 0xc7, 0x7c, 0xc2, 0x46, 0x8a, 0x40, 0xdc, 0x96, 0xe1, - 0x0b, 0x41, 0xce, 0x77, 0x4c, 0x19, 0x75, 0xcb, 0x88, 0x2e, 0x3f, 0x79, 0x1c, 0xfe, 0x9d, 0x39, - 0x3b, 0x16, 0xf6, 0x74, 0xa3, 0xad, 0x9f, 0x6f, 0xc7, 0x08, 0x6d, 0xfc, 0xf1, 0x98, 0xc7, 0xbb, - 0xfc, 0xaa, 0x0a, 0xe5, 0x85, 0x48, 0xfc, 0xc7, 0x61, 0xca, 0xf6, 0x97, 0x24, 0xbd, 0xd3, 0xef, - 0x3d, 0x8e, 0xa6, 0xec, 0xbb, 0x16, 0xe4, 0x8c, 0x75, 0x96, 0x4b, 0x8a, 0x9f, 0xb1, 0x9c, 0x3d, - 0x99, 0x2e, 0xb4, 0x5a, 0x4b, 0x58, 0x77, 0x76, 0x6d, 0xdc, 0x8a, 0x35, 0x44, 0x88, 0x22, 0x9a, - 0xe2, 0x25, 0x21, 0x04, 0x17, 0x5c, 0x15, 0xd1, 0x79, 0xf2, 0x80, 0xde, 0xc0, 0xe3, 0x65, 0x24, - 0x5d, 0xd2, 0xdb, 0x7d, 0x48, 0xaa, 0x02, 0x24, 0x4f, 0x1b, 0x8e, 0x89, 0xe4, 0x01, 0xf9, 0x55, - 0x05, 0xe6, 0xa8, 0x9d, 0x30, 0x6a, 0x4c, 0x7e, 0x27, 0xa6, 0x0f, 0x09, 0x77, 0x2d, 0x13, 0xcf, - 0xce, 0x48, 0x60, 0x89, 0xe3, 0x71, 0x22, 0xc7, 0x47, 0xf2, 0xc8, 0x7c, 0x3e, 0x07, 0xc0, 0xf9, - 0x05, 0x7e, 0x3c, 0x17, 0x04, 0xfa, 0x43, 0xef, 0x64, 0xf3, 0x8f, 0x9a, 0x10, 0x75, 0x9a, 0xf3, - 0xf9, 0xf3, 0x37, 0xa4, 0xc4, 0x44, 0xa9, 0x51, 0xe5, 0x4f, 0x63, 0xda, 0xbc, 0xcc, 0x2b, 0x6f, - 0xe0, 0xe0, 0x3e, 0x64, 0x2f, 0xf7, 0x89, 0x18, 0xc6, 0xef, 0x20, 0x56, 0xe2, 0xa1, 0xb6, 0x3a, - 0xc4, 0xcc, 0xfe, 0x14, 0x1c, 0xd7, 0x4a, 0x85, 0xc5, 0x6a, 0x65, 0xf5, 0x3e, 0xfe, 0x8e, 0x9e, - 0xbc, 0xc2, 0x4f, 0x4e, 0x12, 0x81, 0xed, 0x0d, 0x31, 0xfb, 0x40, 0x51, 0x56, 0x51, 0xb3, 0x15, - 0x6e, 0x71, 0x65, 0x70, 0xaf, 0x26, 0x41, 0xf6, 0x30, 0x51, 0x78, 0x10, 0xb8, 0x66, 0xf4, 0x02, - 0x05, 0xf2, 0xc1, 0x35, 0xf1, 0xec, 0x32, 0xb6, 0xaa, 0xe8, 0x36, 0xd8, 0xa1, 0xfb, 0x4f, 0x81, - 0xdb, 0xa0, 0x97, 0xa0, 0x5e, 0x0f, 0x73, 0xcd, 0x6d, 0xdc, 0xbc, 0x50, 0x36, 0xbd, 0x7d, 0x75, - 0xba, 0x09, 0xdb, 0x93, 0x2a, 0x02, 0x73, 0xaf, 0x08, 0x8c, 0x38, 0x89, 0x16, 0x06, 0x69, 0x9e, - 0xa9, 0x10, 0x5c, 0x7e, 0xdf, 0xc7, 0xa5, 0x22, 0xe0, 0x72, 0xfb, 0x50, 0x54, 0xe3, 0xc1, 0x52, - 0x19, 0x02, 0x16, 0x04, 0x27, 0xab, 0xeb, 0xf5, 0x72, 0xb5, 0xd2, 0xd8, 0xa8, 0x95, 0x16, 0x1b, - 0x0b, 0x1e, 0x38, 0xb5, 0xbc, 0x82, 0xbe, 0x95, 0x86, 0x09, 0xca, 0x56, 0xb7, 0xe7, 0x5a, 0xf7, - 0x68, 0x7f, 0x49, 0xf4, 0x0e, 0xe9, 0xe8, 0x07, 0xbe, 0x20, 0x58, 0x39, 0x21, 0xfd, 0xd4, 0x53, - 0x61, 0x82, 0x82, 0xec, 0xad, 0x68, 0x9d, 0x0e, 0xe9, 0xa5, 0x18, 0x19, 0xcd, 0xcb, 0x2e, 0x19, - 0x09, 0x61, 0x00, 0x1b, 0xc9, 0x8f, 0x2c, 0xcf, 0xce, 0x50, 0x33, 0xf8, 0x9c, 0xe1, 0x6c, 0x13, - 0x77, 0x4a, 0xf4, 0x0c, 0x99, 0xe5, 0xc5, 0x9b, 0x20, 0xbb, 0xe7, 0xe6, 0x1e, 0xe0, 0x9a, 0x4a, - 0x33, 0xa1, 0x57, 0x49, 0x07, 0xde, 0x14, 0xf4, 0xd3, 0xe7, 0x29, 0x04, 0x9c, 0x35, 0xc8, 0xb4, - 0x8d, 0xae, 0xc3, 0xc6, 0x8f, 0xdb, 0x62, 0x11, 0xf2, 0x1e, 0xca, 0x0e, 0xde, 0xd1, 0x08, 0x19, - 0x74, 0x0f, 0xcc, 0xf0, 0xa9, 0x12, 0xee, 0xb9, 0xa7, 0x60, 0x82, 0x1d, 0x1b, 0x63, 0x4b, 0xac, - 0xde, 0xab, 0xe4, 0xb2, 0xa6, 0x54, 0x6d, 0x93, 0xd7, 0x81, 0xff, 0xe7, 0x28, 0x4c, 0xac, 0x18, - 0x5d, 0xc7, 0xb2, 0x2f, 0xa1, 0x87, 0x53, 0x30, 0x71, 0x16, 0xdb, 0x5d, 0xc3, 0x32, 0xf7, 0xb9, - 0x1a, 0x5c, 0x03, 0xd3, 0x1d, 0x1b, 0xef, 0x19, 0xd6, 0x6e, 0x37, 0x58, 0x9c, 0xe1, 0x93, 0x54, - 0x04, 0x93, 0xfa, 0xae, 0xb3, 0x6d, 0xd9, 0x41, 0xb4, 0x09, 0xef, 0x5d, 0x3d, 0x0d, 0x40, 0x9f, - 0x2b, 0xfa, 0x0e, 0x66, 0x0e, 0x14, 0x5c, 0x8a, 0xaa, 0x42, 0xc6, 0x31, 0x76, 0x30, 0x0b, 0x3f, - 0x4b, 0x9e, 0x5d, 0x01, 0x93, 0x50, 0x6e, 0x2c, 0x64, 0x9e, 0xa2, 0x79, 0xaf, 0xe8, 0x8b, 0x0a, - 0x4c, 0x2f, 0x63, 0x87, 0xb1, 0xda, 0x45, 0x2f, 0x4e, 0x49, 0xdd, 0xf8, 0xe0, 0x8e, 0xb1, 0x6d, - 0xbd, 0xeb, 0xfd, 0xe7, 0x2f, 0xc1, 0x8a, 0x89, 0x41, 0x2c, 0x5c, 0x85, 0x0f, 0x84, 0x4d, 0x02, - 0xa3, 0x39, 0x65, 0xea, 0x77, 0xc9, 0x32, 0xb3, 0x4d, 0x90, 0xfd, 0x1f, 0xd0, 0x7b, 0xd3, 0xb2, - 0x87, 0x8a, 0x99, 0xec, 0xe7, 0xb9, 0xfa, 0x84, 0x76, 0x47, 0x93, 0x7b, 0x2c, 0xc7, 0xbe, 0x18, - 0xe7, 0x3c, 0x25, 0x46, 0x46, 0xf3, 0x73, 0x4b, 0x1e, 0x47, 0x1e, 0xcc, 0x49, 0xf2, 0xda, 0xf8, - 0x3d, 0x05, 0xa6, 0x6b, 0xdb, 0xd6, 0x45, 0x4f, 0x8e, 0x3f, 0x25, 0x07, 0xec, 0x55, 0x30, 0xb5, - 0xd7, 0x03, 0x6a, 0x90, 0x10, 0x7e, 0x07, 0x3b, 0x7a, 0xbe, 0x12, 0x17, 0x26, 0x8e, 0xb9, 0x91, - 0xdf, 0x90, 0xae, 0x3e, 0x19, 0x26, 0x18, 0xd7, 0x6c, 0xc9, 0x25, 0x1a, 0x60, 0x2f, 0x33, 0x5f, - 0xc1, 0x8c, 0x58, 0xc1, 0x78, 0xc8, 0x87, 0x57, 0x2e, 0x79, 0xe4, 0xff, 0x28, 0x4d, 0x82, 0x51, - 0x78, 0xc0, 0x17, 0x47, 0x00, 0x3c, 0xfa, 0x7e, 0x4a, 0x76, 0x61, 0xd2, 0x97, 0x80, 0xcf, 0xc1, - 0x81, 0x6e, 0x73, 0x19, 0x48, 0x2e, 0x79, 0x79, 0xbe, 0x32, 0x03, 0x33, 0x8b, 0xc6, 0xe6, 0xa6, - 0xdf, 0x49, 0xbe, 0x44, 0xb2, 0x93, 0x0c, 0x77, 0x07, 0x70, 0xed, 0xdc, 0x5d, 0xdb, 0xc6, 0xa6, - 0x57, 0x29, 0xd6, 0x9c, 0x7a, 0x52, 0xd5, 0x1b, 0xe0, 0xa8, 0x37, 0x2e, 0xf0, 0x1d, 0xe5, 0x94, - 0xd6, 0x9b, 0x8c, 0xbe, 0x2b, 0xbd, 0xab, 0xe5, 0x49, 0x94, 0xaf, 0x52, 0x48, 0x03, 0xbc, 0x03, - 0x66, 0xb7, 0x69, 0x6e, 0x32, 0xf5, 0xf7, 0x3a, 0xcb, 0x93, 0x3d, 0xc1, 0x7e, 0xd7, 0x70, 0xb7, - 0xab, 0x6f, 0x61, 0x4d, 0xcc, 0xdc, 0xd3, 0x7c, 0x95, 0x38, 0x57, 0x57, 0xc9, 0x6d, 0x90, 0x49, - 0xd4, 0x64, 0x0c, 0xda, 0x71, 0x06, 0x32, 0x4b, 0x46, 0x1b, 0xa3, 0x9f, 0x4f, 0xc3, 0x94, 0x86, - 0x9b, 0x96, 0xd9, 0x74, 0xdf, 0x38, 0xe7, 0xa0, 0x7f, 0x4c, 0xc9, 0x5e, 0xd9, 0xe8, 0xd2, 0x99, - 0xf7, 0x69, 0x84, 0xb4, 0x1b, 0xb9, 0xab, 0x19, 0x23, 0x49, 0x8d, 0xe1, 0x82, 0x0d, 0x77, 0xea, - 0xb1, 0xb9, 0xd9, 0xb6, 0x74, 0x61, 0xf1, 0xab, 0xd7, 0x14, 0xba, 0x11, 0xf2, 0xde, 0x19, 0x0f, - 0xcb, 0x59, 0x37, 0x4c, 0xd3, 0x3f, 0x44, 0xbc, 0x2f, 0x5d, 0xdc, 0xb7, 0x8d, 0x8c, 0xc3, 0x42, - 0xea, 0xce, 0x4a, 0x0f, 0xd1, 0xec, 0xeb, 0x61, 0xee, 0xfc, 0x25, 0x07, 0x77, 0x59, 0x2e, 0x56, - 0x6c, 0x46, 0xeb, 0x49, 0xe5, 0xa2, 0x28, 0x47, 0xc5, 0x6b, 0x89, 0x28, 0x30, 0x9e, 0xa8, 0x57, - 0x86, 0x98, 0x01, 0x1e, 0x87, 0x7c, 0xa5, 0xba, 0x58, 0x22, 0xbe, 0x6a, 0x9e, 0xf7, 0xcf, 0x16, - 0x7a, 0xa9, 0x02, 0x33, 0xc4, 0x99, 0xc4, 0x43, 0xe1, 0x5a, 0x89, 0xf9, 0x08, 0xfa, 0x8a, 0xb4, - 0x1f, 0x1b, 0xa9, 0x32, 0x5f, 0x40, 0xb8, 0xa0, 0x37, 0x8d, 0x76, 0xaf, 0xa0, 0xb3, 0x5a, 0x4f, - 0x6a, 0x1f, 0x40, 0x94, 0xbe, 0x80, 0xfc, 0x96, 0x94, 0x33, 0xdb, 0x20, 0xee, 0x0e, 0x0b, 0x95, - 0xdf, 0x56, 0x60, 0xda, 0x9d, 0xa4, 0x78, 0xa0, 0x54, 0x05, 0x50, 0x2c, 0xb3, 0x7d, 0x29, 0x58, - 0x16, 0xf1, 0x5e, 0x63, 0x35, 0x92, 0xbf, 0x90, 0x9e, 0xb9, 0x13, 0x11, 0x71, 0xbc, 0x8c, 0x09, - 0xbf, 0x0f, 0x4a, 0xcd, 0xe7, 0x07, 0x30, 0x77, 0x58, 0xf0, 0x7d, 0x23, 0x0b, 0xb9, 0x8d, 0x0e, - 0x41, 0xee, 0x55, 0x8a, 0x4c, 0x44, 0xf2, 0x7d, 0x07, 0x19, 0x5c, 0x33, 0xab, 0x6d, 0x35, 0xf5, - 0xf6, 0x7a, 0x70, 0x22, 0x2c, 0x48, 0x50, 0x6f, 0x67, 0xbe, 0x8d, 0xf4, 0x38, 0xdd, 0xf5, 0x91, - 0xc1, 0xba, 0x89, 0x8c, 0xb8, 0x43, 0x23, 0x37, 0xc1, 0xb1, 0x96, 0xd1, 0xd5, 0xcf, 0xb7, 0x71, - 0xc9, 0x6c, 0xda, 0x97, 0xa8, 0x38, 0xd8, 0xb4, 0x6a, 0xdf, 0x07, 0xf5, 0x4e, 0xc8, 0x76, 0x9d, - 0x4b, 0x6d, 0x3a, 0x4f, 0xe4, 0xcf, 0x98, 0x84, 0x16, 0x55, 0x73, 0xb3, 0x6b, 0xf4, 0x2f, 0xde, - 0x45, 0x69, 0x42, 0xf2, 0xbe, 0xe6, 0x27, 0x42, 0xce, 0xb2, 0x8d, 0x2d, 0x83, 0xde, 0xbf, 0x33, - 0xb7, 0x2f, 0x26, 0x1d, 0x35, 0x05, 0xaa, 0x24, 0x8b, 0xc6, 0xb2, 0xaa, 0x4f, 0x86, 0x29, 0x63, - 0x47, 0xdf, 0xc2, 0xf7, 0x1a, 0x26, 0x3d, 0xb1, 0x37, 0x77, 0xeb, 0xa9, 0x7d, 0xc7, 0x67, 0xd8, - 0x77, 0x2d, 0xc8, 0x8a, 0x3e, 0x98, 0x96, 0x0d, 0x9c, 0x43, 0xea, 0x46, 0x41, 0x1d, 0xcb, 0xbd, - 0xd5, 0xe8, 0xb5, 0x52, 0x21, 0x6d, 0xc2, 0xd9, 0x4a, 0x7e, 0xf0, 0xfe, 0x42, 0x1a, 0x26, 0x17, - 0xad, 0x8b, 0x26, 0x51, 0xf4, 0xdb, 0xe4, 0x6c, 0xdd, 0x3e, 0x87, 0x1c, 0xc5, 0x6b, 0x21, 0x23, - 0x4f, 0x34, 0x90, 0xda, 0x7a, 0x45, 0x86, 0xc0, 0x10, 0xd9, 0x72, 0x24, 0x2f, 0xeb, 0x8b, 0x2a, - 0x27, 0x79, 0xb9, 0xfe, 0xb1, 0x02, 0x99, 0x45, 0xdb, 0xea, 0xa0, 0xb7, 0xa7, 0x62, 0xb8, 0x2c, - 0xb4, 0x6c, 0xab, 0x53, 0x27, 0xb7, 0x6d, 0x05, 0xc7, 0x38, 0xf8, 0x34, 0xf5, 0x36, 0x98, 0xec, - 0x58, 0x5d, 0xc3, 0xf1, 0xa6, 0x11, 0x73, 0xb7, 0x3e, 0xaa, 0x6f, 0x6b, 0x5e, 0x67, 0x99, 0x34, - 0x3f, 0xbb, 0xdb, 0x6b, 0x13, 0x11, 0xba, 0x72, 0x71, 0xc5, 0xe8, 0xdd, 0x38, 0xd6, 0x93, 0x8a, - 0x5e, 0xc6, 0x23, 0xf9, 0x34, 0x11, 0xc9, 0xc7, 0xf4, 0x91, 0xb0, 0x6d, 0x75, 0x46, 0xb2, 0xc9, - 0xf8, 0x6a, 0x1f, 0xd5, 0xa7, 0x0b, 0xa8, 0xde, 0x28, 0x55, 0x66, 0xf2, 0x88, 0x7e, 0x30, 0x03, - 0x40, 0xcc, 0x8c, 0x0d, 0x77, 0x02, 0x24, 0x67, 0x63, 0x3d, 0x37, 0xc3, 0xc9, 0xb2, 0x20, 0xca, - 0xf2, 0x71, 0x21, 0x56, 0x0c, 0x21, 0x1f, 0x22, 0xd1, 0x02, 0x64, 0x77, 0xdd, 0xcf, 0x4c, 0xa2, - 0x92, 0x24, 0xc8, 0xab, 0x46, 0xff, 0x44, 0x7f, 0x94, 0x82, 0x2c, 0x49, 0x50, 0x4f, 0x03, 0x90, - 0x81, 0x9d, 0x1e, 0x08, 0x4a, 0x91, 0x21, 0x9c, 0x4b, 0x21, 0xda, 0x6a, 0xb4, 0xd8, 0x67, 0x6a, - 0x32, 0x07, 0x09, 0xee, 0xdf, 0x64, 0xb8, 0x27, 0xb4, 0x98, 0x01, 0xc0, 0xa5, 0xb8, 0x7f, 0x93, - 0xb7, 0x55, 0xbc, 0x49, 0x03, 0x21, 0x67, 0xb4, 0x20, 0xc1, 0xff, 0x7b, 0xd5, 0xbf, 0x3e, 0xcb, - 0xfb, 0x9b, 0xa4, 0xb8, 0x93, 0x61, 0xa2, 0x96, 0x0b, 0x41, 0x11, 0x39, 0x92, 0xa9, 0x37, 0x19, - 0xbd, 0xc1, 0x57, 0x9b, 0x45, 0x41, 0x6d, 0x6e, 0x89, 0x21, 0xde, 0xe4, 0x95, 0xe7, 0x6b, 0x59, - 0x98, 0xaa, 0x58, 0x2d, 0xa6, 0x3b, 0xdc, 0x84, 0xf1, 0x53, 0xd9, 0x58, 0x13, 0x46, 0x9f, 0x46, - 0x88, 0x82, 0xdc, 0x2d, 0x2a, 0x88, 0x1c, 0x05, 0x5e, 0x3f, 0xd4, 0x05, 0xc8, 0x11, 0xed, 0xdd, - 0x7f, 0x2f, 0x53, 0x14, 0x09, 0x22, 0x5a, 0x8d, 0xfd, 0xf9, 0x1f, 0x4e, 0xc7, 0xfe, 0x2b, 0x64, - 0x49, 0x05, 0x23, 0x76, 0x77, 0xc4, 0x8a, 0xa6, 0xa3, 0x2b, 0xaa, 0x44, 0x57, 0x34, 0xd3, 0x5b, - 0xd1, 0x38, 0xeb, 0x00, 0x61, 0x1a, 0x92, 0xbc, 0x8e, 0xff, 0xfd, 0x04, 0x40, 0x45, 0xdf, 0x33, - 0xb6, 0xe8, 0xee, 0xf0, 0x17, 0xbd, 0xf9, 0x0f, 0xdb, 0xc7, 0xfd, 0x6f, 0xdc, 0x40, 0x78, 0x1b, - 0x4c, 0xb0, 0x71, 0x8f, 0x55, 0xe4, 0x6a, 0xa1, 0x22, 0x01, 0x15, 0x6a, 0x96, 0x3e, 0xe0, 0x68, - 0x5e, 0x7e, 0xe1, 0x0a, 0xd9, 0x74, 0xcf, 0x15, 0xb2, 0xfd, 0xf7, 0x20, 0x42, 0x2e, 0x96, 0x45, - 0xef, 0x93, 0xf6, 0xe8, 0xe7, 0xf8, 0xe1, 0x6a, 0x14, 0xd2, 0x04, 0x9f, 0x08, 0x13, 0x96, 0xbf, - 0xa1, 0xad, 0x84, 0xae, 0x83, 0x95, 0xcd, 0x4d, 0x4b, 0xf3, 0x72, 0x4a, 0x6e, 0x7e, 0x49, 0xf1, - 0x31, 0x96, 0x43, 0x33, 0x27, 0x97, 0xbd, 0xa0, 0x52, 0x6e, 0x3d, 0xce, 0x19, 0xce, 0xf6, 0xaa, - 0x61, 0x5e, 0xe8, 0xa2, 0xff, 0x2c, 0x67, 0x41, 0x72, 0xf8, 0xa7, 0xe3, 0xe1, 0x2f, 0xc6, 0xec, - 0xa8, 0x89, 0xa8, 0xdd, 0x19, 0x46, 0xa5, 0x3f, 0xb7, 0x21, 0x00, 0xde, 0x0e, 0x39, 0xca, 0x28, - 0xeb, 0x44, 0xcf, 0x84, 0xe2, 0xe7, 0x53, 0xd2, 0xd8, 0x1f, 0xe8, 0xbd, 0x3e, 0x8e, 0x67, 0x05, - 0x1c, 0x17, 0x0e, 0xc4, 0x59, 0xe2, 0x90, 0x9e, 0x79, 0x02, 0x4c, 0x30, 0x49, 0xab, 0x73, 0x7c, - 0x2b, 0xce, 0x1f, 0x51, 0x01, 0x72, 0x6b, 0xd6, 0x1e, 0xae, 0x5b, 0xf9, 0x94, 0xfb, 0xec, 0xf2, - 0x57, 0xb7, 0xf2, 0x69, 0xf4, 0x9a, 0x49, 0x98, 0xf4, 0xa3, 0xf9, 0x7c, 0x21, 0x0d, 0xf9, 0xa2, - 0x8d, 0x75, 0x07, 0x2f, 0xd9, 0xd6, 0x0e, 0xad, 0x91, 0xbc, 0x77, 0xe8, 0xaf, 0x4a, 0xbb, 0x78, - 0xf8, 0x51, 0x76, 0x7a, 0x0b, 0x0b, 0xc1, 0x92, 0x2e, 0x42, 0xa6, 0xbd, 0x45, 0x48, 0xf4, 0x36, - 0x29, 0x97, 0x0f, 0xd9, 0x52, 0x92, 0x6f, 0x6a, 0x9f, 0x49, 0x43, 0xb6, 0xd8, 0xb6, 0x4c, 0xcc, - 0x1f, 0x61, 0x1a, 0x78, 0x56, 0xa6, 0xff, 0x4e, 0x04, 0x7a, 0x76, 0x5a, 0xd6, 0xd6, 0x08, 0x04, - 0xe0, 0x96, 0x2d, 0x29, 0x5b, 0xb9, 0x41, 0x2a, 0x92, 0x74, 0xf2, 0x02, 0xfd, 0x56, 0x1a, 0xa6, - 0x68, 0x5c, 0x9c, 0x42, 0xbb, 0x8d, 0x1e, 0x15, 0x08, 0xb5, 0x4f, 0x44, 0x24, 0xf4, 0x5b, 0xd2, - 0x2e, 0xfa, 0x7e, 0xad, 0x7c, 0xda, 0x31, 0x02, 0x04, 0xc5, 0xf3, 0x18, 0x97, 0xdb, 0x4b, 0x1b, - 0xc8, 0x50, 0xf2, 0xa2, 0xfe, 0xb3, 0xb4, 0x6b, 0x00, 0x98, 0x17, 0xd6, 0x6d, 0xbc, 0x67, 0xe0, - 0x8b, 0xe8, 0xca, 0x40, 0xd8, 0xfb, 0x83, 0x7e, 0xbc, 0x45, 0x7a, 0x11, 0x87, 0x23, 0x19, 0xba, - 0x95, 0x35, 0xdd, 0x0e, 0x32, 0xb1, 0x5e, 0xbc, 0x37, 0x12, 0x0b, 0x47, 0x46, 0xe3, 0xb3, 0x4b, - 0xae, 0xd9, 0x84, 0x73, 0x91, 0xbc, 0x60, 0x3f, 0x32, 0x01, 0x93, 0x1b, 0x66, 0xb7, 0xd3, 0xd6, - 0xbb, 0xdb, 0xe8, 0xdf, 0x14, 0xc8, 0xd1, 0xdb, 0xc0, 0xd0, 0x8f, 0x0b, 0xb1, 0x05, 0x7e, 0x7a, - 0x17, 0xdb, 0x9e, 0x0b, 0x0e, 0x7d, 0xe9, 0x7f, 0x59, 0x39, 0xfa, 0xa0, 0x22, 0x3b, 0x49, 0xf5, - 0x0a, 0xe5, 0xae, 0x85, 0xef, 0x7f, 0x9c, 0xbd, 0x63, 0x34, 0x9d, 0x5d, 0xdb, 0xbf, 0xfa, 0xfa, - 0xf1, 0x72, 0x54, 0xd6, 0xe9, 0x5f, 0x9a, 0xff, 0x3b, 0xd2, 0x61, 0x82, 0x25, 0xee, 0xdb, 0x4e, - 0xda, 0x7f, 0xfe, 0xf6, 0x24, 0xe4, 0x74, 0xdb, 0x31, 0xba, 0x0e, 0xdb, 0x60, 0x65, 0x6f, 0x6e, - 0x77, 0x49, 0x9f, 0x36, 0xec, 0xb6, 0x17, 0x85, 0xc4, 0x4f, 0x40, 0xbf, 0x2d, 0x35, 0x7f, 0x8c, - 0xae, 0x79, 0x3c, 0xc8, 0xef, 0x1d, 0x62, 0x8d, 0xfa, 0x72, 0xb8, 0x4c, 0x2b, 0xd4, 0x4b, 0x0d, - 0x1a, 0xb4, 0xc2, 0x8f, 0x4f, 0xd1, 0x42, 0xef, 0x51, 0xb8, 0xf5, 0xbb, 0x4b, 0xc2, 0x18, 0xc1, - 0xa4, 0x18, 0x8c, 0x11, 0x7e, 0x42, 0xc4, 0x6e, 0xb5, 0xb0, 0x08, 0xab, 0xc8, 0x2f, 0xc2, 0xfe, - 0x86, 0xf4, 0x6e, 0x92, 0x2f, 0xca, 0x01, 0x6b, 0x80, 0x51, 0xb7, 0x05, 0x7d, 0x48, 0x6a, 0x67, - 0x68, 0x50, 0x49, 0x87, 0x08, 0xdb, 0x9b, 0x27, 0x60, 0x62, 0x59, 0x6f, 0xb7, 0xb1, 0x7d, 0xc9, - 0x1d, 0x92, 0xf2, 0x1e, 0x87, 0x6b, 0xba, 0x69, 0x6c, 0xe2, 0xae, 0x13, 0xdd, 0x59, 0xbe, 0x4f, - 0x3a, 0x12, 0x2d, 0x2b, 0x63, 0xbe, 0x97, 0x7e, 0x88, 0xcc, 0x6f, 0x86, 0x8c, 0x61, 0x6e, 0x5a, - 0xac, 0xcb, 0xec, 0x5d, 0xb5, 0xf7, 0x7e, 0x26, 0x53, 0x17, 0x92, 0x51, 0x32, 0x18, 0xad, 0x24, - 0x17, 0xc9, 0xf7, 0x9c, 0xbf, 0x99, 0x81, 0x59, 0x8f, 0x89, 0xb2, 0xd9, 0xc2, 0x0f, 0xf0, 0x4b, - 0x31, 0x2f, 0xcd, 0xc8, 0x1e, 0x07, 0xeb, 0xad, 0x0f, 0x21, 0x15, 0x22, 0xd2, 0x3a, 0x40, 0x53, - 0x77, 0xf0, 0x96, 0x65, 0x1b, 0x7e, 0x7f, 0xf8, 0xa4, 0x38, 0xd4, 0x8a, 0xf4, 0xef, 0x4b, 0x1a, - 0x47, 0x47, 0xbd, 0x13, 0xa6, 0xb1, 0x7f, 0xfe, 0xde, 0x5b, 0xaa, 0x89, 0xc4, 0x8b, 0xcf, 0x8f, - 0xfe, 0x4c, 0xea, 0xd4, 0x99, 0x4c, 0x35, 0xe3, 0x61, 0xd6, 0x18, 0xae, 0x0d, 0x6d, 0x54, 0xd6, - 0x0a, 0x5a, 0x6d, 0xa5, 0xb0, 0xba, 0x5a, 0xae, 0x2c, 0xfb, 0x81, 0x5f, 0x54, 0x98, 0x5b, 0xac, - 0x9e, 0xab, 0x70, 0x91, 0x79, 0x32, 0x68, 0x1d, 0x26, 0x3d, 0x79, 0xf5, 0xf3, 0xc5, 0xe4, 0x65, - 0xc6, 0x7c, 0x31, 0xb9, 0x24, 0xd7, 0x38, 0x33, 0x9a, 0xbe, 0x83, 0x0e, 0x79, 0x46, 0x7f, 0xa0, - 0x43, 0x96, 0xac, 0xa9, 0xa3, 0x77, 0x91, 0x6d, 0xc0, 0x4e, 0x5b, 0x6f, 0x62, 0xb4, 0x13, 0xc3, - 0x1a, 0xf7, 0xae, 0x46, 0x48, 0xef, 0xbb, 0x1a, 0x81, 0x3c, 0x32, 0xab, 0xef, 0x78, 0xbf, 0x75, - 0x7c, 0x8d, 0x66, 0x11, 0x0f, 0x68, 0x45, 0xee, 0xae, 0xd0, 0xe5, 0x7f, 0xc6, 0x66, 0x88, 0x4a, - 0x86, 0xf3, 0x14, 0xcf, 0x12, 0x95, 0xdb, 0x87, 0x89, 0xe2, 0x68, 0x0c, 0xd7, 0x77, 0x67, 0x20, - 0x5b, 0xeb, 0xb4, 0x0d, 0x07, 0xbd, 0x22, 0x3d, 0x12, 0xcc, 0xe8, 0x75, 0x16, 0xca, 0xc0, 0xeb, - 0x2c, 0x82, 0x5d, 0xd7, 0x8c, 0xc4, 0xae, 0x6b, 0x1d, 0x3f, 0xe0, 0x88, 0xbb, 0xae, 0xb7, 0xb1, - 0xe0, 0x6d, 0x74, 0xcf, 0xf6, 0x31, 0x7d, 0x44, 0x4a, 0xaa, 0xd5, 0x27, 0x2a, 0xe0, 0x99, 0x27, - 0xb0, 0xe0, 0x64, 0x00, 0xb9, 0x85, 0x6a, 0xbd, 0x5e, 0x5d, 0xcb, 0x1f, 0x21, 0x51, 0x6d, 0xaa, - 0xeb, 0x34, 0x54, 0x4c, 0xb9, 0x52, 0x29, 0x69, 0xf9, 0x34, 0x09, 0x97, 0x56, 0xae, 0xaf, 0x96, - 0xf2, 0x8a, 0x18, 0xdb, 0x3c, 0xd2, 0xfc, 0x16, 0xcb, 0x4e, 0x52, 0xbd, 0xe4, 0x0c, 0xf1, 0x70, - 0x7e, 0x92, 0x57, 0xae, 0x5f, 0x51, 0x20, 0xbb, 0x86, 0xed, 0x2d, 0x8c, 0x7e, 0x3a, 0xc6, 0x26, - 0xdf, 0xa6, 0x61, 0x77, 0x69, 0x70, 0xb9, 0x60, 0x93, 0x8f, 0x4f, 0x53, 0xaf, 0x83, 0xd9, 0x2e, - 0x6e, 0x5a, 0x66, 0xcb, 0xcb, 0x44, 0xfb, 0x23, 0x31, 0x51, 0xbc, 0x57, 0x5e, 0x02, 0x32, 0xc2, - 0xe8, 0x48, 0x76, 0xea, 0xe2, 0x00, 0xd3, 0xaf, 0xd4, 0xe4, 0x81, 0xf9, 0xae, 0xe2, 0xfe, 0xd4, - 0xb9, 0x84, 0x5e, 0x2e, 0xbd, 0xfb, 0x7a, 0x13, 0xe4, 0x88, 0x9a, 0x7a, 0x63, 0x74, 0xff, 0xfe, - 0x98, 0xe5, 0x51, 0x17, 0xe0, 0x58, 0x17, 0xb7, 0x71, 0xd3, 0xc1, 0x2d, 0xb7, 0xe9, 0x6a, 0x03, - 0x3b, 0x85, 0xfd, 0xd9, 0xd1, 0x9f, 0xf0, 0x00, 0xde, 0x21, 0x02, 0x78, 0x7d, 0x1f, 0x51, 0xba, - 0x15, 0x0a, 0xb7, 0x95, 0xdd, 0x6a, 0xd4, 0xda, 0x96, 0xbf, 0x28, 0xee, 0xbd, 0xbb, 0xdf, 0xb6, - 0x9d, 0x9d, 0x36, 0xf9, 0xc6, 0x0e, 0x18, 0x78, 0xef, 0xea, 0x3c, 0x4c, 0xe8, 0xe6, 0x25, 0xf2, - 0x29, 0x13, 0x51, 0x6b, 0x2f, 0x13, 0x7a, 0x8d, 0x8f, 0xfc, 0x5d, 0x02, 0xf2, 0x8f, 0x93, 0x63, - 0x37, 0x79, 0xe0, 0x7f, 0x6e, 0x02, 0xb2, 0xeb, 0x7a, 0xd7, 0xc1, 0xe8, 0xff, 0x56, 0x64, 0x91, - 0xbf, 0x1e, 0xe6, 0x36, 0xad, 0xe6, 0x6e, 0x17, 0xb7, 0xc4, 0x46, 0xd9, 0x93, 0x3a, 0x0a, 0xcc, - 0xd5, 0x1b, 0x21, 0xef, 0x25, 0x32, 0xb2, 0xde, 0x36, 0xfc, 0xbe, 0x74, 0x12, 0x29, 0xbb, 0xbb, - 0xae, 0xdb, 0x4e, 0x75, 0x93, 0xa4, 0xf9, 0x91, 0xb2, 0xf9, 0x44, 0x01, 0xfa, 0x5c, 0x04, 0xf4, - 0x13, 0xe1, 0xd0, 0x4f, 0x4a, 0x40, 0xaf, 0x16, 0x60, 0x72, 0xd3, 0x68, 0x63, 0xf2, 0xc3, 0x14, - 0xf9, 0xa1, 0xdf, 0x98, 0x44, 0x64, 0xef, 0x8f, 0x49, 0x4b, 0x46, 0x1b, 0x6b, 0xfe, 0x6f, 0xde, - 0x44, 0x06, 0x82, 0x89, 0xcc, 0x2a, 0xf5, 0xa7, 0x75, 0x0d, 0x2f, 0x53, 0xdf, 0xc1, 0xde, 0xe2, - 0x9b, 0xc9, 0x0e, 0xb7, 0xb4, 0x74, 0x47, 0x27, 0x60, 0xcc, 0x68, 0xe4, 0x59, 0xf4, 0x0b, 0x51, - 0x7a, 0xfd, 0x42, 0x9e, 0xa7, 0xc4, 0xeb, 0x11, 0x3d, 0x66, 0x43, 0x5a, 0xd4, 0x79, 0x0f, 0x20, - 0x6a, 0x29, 0xfa, 0xef, 0x2e, 0x30, 0x4d, 0xdd, 0xc6, 0xce, 0x3a, 0xef, 0x89, 0x91, 0xd5, 0xc4, - 0x44, 0xe2, 0xca, 0xd7, 0xad, 0xe9, 0x3b, 0x98, 0x14, 0x56, 0x74, 0xbf, 0x31, 0x17, 0xad, 0x7d, - 0xe9, 0x41, 0xff, 0x9b, 0x1d, 0x75, 0xff, 0xdb, 0xaf, 0x8e, 0xc9, 0x37, 0xc3, 0xd7, 0x67, 0x40, - 0x29, 0xee, 0x3a, 0x8f, 0xe8, 0xee, 0xf7, 0x07, 0xd2, 0x7e, 0x2e, 0xac, 0x3f, 0x0b, 0xbd, 0x48, - 0x7e, 0x4c, 0xbd, 0x6f, 0x4c, 0x2d, 0x91, 0xf3, 0xa7, 0x09, 0xab, 0x5b, 0xf2, 0x3a, 0xf2, 0x76, - 0xc5, 0x77, 0xb0, 0x7c, 0x30, 0x75, 0x70, 0xd3, 0x1c, 0xd1, 0xfe, 0x89, 0xeb, 0x19, 0xfc, 0x77, - 0xaf, 0xe3, 0xc9, 0x08, 0xb1, 0xfa, 0xc8, 0xf6, 0x3a, 0x11, 0xe5, 0x8c, 0x46, 0x5f, 0xd0, 0x2b, - 0xa5, 0xdd, 0xce, 0xa9, 0xd8, 0x22, 0x5d, 0x09, 0xe3, 0xd9, 0x54, 0x72, 0x97, 0x85, 0x46, 0x14, - 0x9b, 0x3c, 0x60, 0xdf, 0xe1, 0x5d, 0x05, 0x0b, 0x07, 0x46, 0x0c, 0xbd, 0x56, 0x7a, 0x3b, 0x8a, - 0x56, 0x7b, 0xc0, 0x7a, 0x61, 0x3c, 0x79, 0xcb, 0x6d, 0x56, 0x45, 0x16, 0x9c, 0xbc, 0xc4, 0xbf, - 0xad, 0x40, 0x8e, 0x6e, 0x41, 0xa2, 0xb7, 0xa6, 0x62, 0xdc, 0xb2, 0xee, 0x88, 0x2e, 0x84, 0xfe, - 0x7b, 0x9c, 0x35, 0x07, 0xc1, 0xd5, 0x30, 0x13, 0xcb, 0xd5, 0x50, 0x3c, 0xc7, 0x29, 0xd1, 0x8e, - 0x68, 0x1d, 0x13, 0x9e, 0x4e, 0xc6, 0x69, 0x61, 0x7d, 0x19, 0x4a, 0x1e, 0xef, 0x17, 0x64, 0x61, - 0x86, 0x16, 0x7d, 0xce, 0x68, 0x6d, 0x61, 0x07, 0xbd, 0x27, 0xfd, 0xc3, 0x83, 0xba, 0x5a, 0x81, - 0x99, 0x8b, 0x84, 0xed, 0x55, 0xfd, 0x92, 0xb5, 0xeb, 0xb0, 0x95, 0x8b, 0x1b, 0x23, 0xd7, 0x3d, - 0x68, 0x3d, 0xe7, 0xe9, 0x1f, 0x9a, 0xf0, 0xbf, 0x2b, 0x63, 0xba, 0xe0, 0x4f, 0x1d, 0xb8, 0x72, - 0xc4, 0xc8, 0xe2, 0x93, 0xd4, 0x93, 0x90, 0xdb, 0x33, 0xf0, 0xc5, 0x72, 0x8b, 0x59, 0xb7, 0xec, - 0x0d, 0xfd, 0xae, 0xf4, 0xbe, 0x2d, 0x0f, 0x37, 0xe3, 0x25, 0x59, 0x2d, 0x94, 0xdb, 0xbd, 0x1d, - 0xc8, 0xd6, 0x18, 0xce, 0x14, 0x8b, 0x97, 0x71, 0x16, 0x63, 0x28, 0x62, 0x98, 0xe1, 0x2c, 0x86, - 0xf2, 0x88, 0x3c, 0xb1, 0x42, 0x05, 0x30, 0xe2, 0x7b, 0x3a, 0xe5, 0xe2, 0x4b, 0x0c, 0x28, 0x3a, - 0x79, 0xc9, 0xbf, 0x41, 0x81, 0xa9, 0x1a, 0x76, 0x96, 0x0c, 0xdc, 0x6e, 0x75, 0x91, 0x7d, 0x70, - 0xd3, 0xe8, 0x66, 0xc8, 0x6d, 0x12, 0x62, 0x83, 0xce, 0x2d, 0xb0, 0x6c, 0xe8, 0xf5, 0x69, 0xd9, - 0x1d, 0x61, 0xb6, 0xfa, 0xe6, 0x71, 0x3b, 0x12, 0x98, 0xe4, 0x3c, 0x7a, 0xa3, 0x4b, 0x1e, 0x43, - 0x60, 0x5b, 0x05, 0x66, 0xd8, 0xed, 0x7d, 0x85, 0xb6, 0xb1, 0x65, 0xa2, 0xdd, 0x11, 0xb4, 0x10, - 0xf5, 0x16, 0xc8, 0xea, 0x2e, 0x35, 0xb6, 0xf5, 0x8a, 0xfa, 0x76, 0x9e, 0xa4, 0x3c, 0x8d, 0x66, - 0x8c, 0x11, 0x46, 0x32, 0x50, 0x6c, 0x8f, 0xe7, 0x31, 0x86, 0x91, 0x1c, 0x58, 0x78, 0xf2, 0x88, - 0x7d, 0x55, 0x81, 0xe3, 0x8c, 0x81, 0xb3, 0xd8, 0x76, 0x8c, 0xa6, 0xde, 0xa6, 0xc8, 0xbd, 0x28, - 0x35, 0x0a, 0xe8, 0x56, 0x60, 0x76, 0x8f, 0x27, 0xcb, 0x20, 0x3c, 0xd3, 0x17, 0x42, 0x81, 0x01, - 0x4d, 0xfc, 0x31, 0x46, 0x38, 0x3e, 0x41, 0xaa, 0x02, 0xcd, 0x31, 0x86, 0xe3, 0x93, 0x66, 0x22, - 0x79, 0x88, 0x5f, 0xc6, 0x42, 0xf3, 0x04, 0xdd, 0xe7, 0x17, 0xa5, 0xb1, 0xdd, 0x80, 0x69, 0x82, - 0x25, 0xfd, 0x91, 0x2d, 0x43, 0x44, 0x28, 0xb1, 0xdf, 0xef, 0xb0, 0x0b, 0xc3, 0xfc, 0x7f, 0x35, - 0x9e, 0x0e, 0x3a, 0x07, 0x10, 0x7c, 0xe2, 0x3b, 0xe9, 0x54, 0x58, 0x27, 0x9d, 0x96, 0xeb, 0xa4, - 0xdf, 0x22, 0x1d, 0x2c, 0xa5, 0x3f, 0xdb, 0x07, 0x57, 0x0f, 0xb9, 0x30, 0x19, 0x83, 0x4b, 0x4f, - 0x5e, 0x2f, 0x5e, 0x93, 0xe9, 0xbd, 0xa6, 0xfd, 0xe3, 0x23, 0x99, 0x4f, 0xf1, 0xfd, 0x81, 0xd2, - 0xd3, 0x1f, 0x1c, 0xc0, 0x92, 0xbe, 0x01, 0x8e, 0xd2, 0x22, 0x8a, 0x3e, 0x5b, 0x59, 0x1a, 0x0a, - 0xa2, 0x27, 0x19, 0x7d, 0x62, 0x08, 0x25, 0x18, 0x74, 0x87, 0x7c, 0x54, 0x27, 0x17, 0xcf, 0xd8, - 0x8d, 0xab, 0x20, 0x87, 0x77, 0xf5, 0xfc, 0xb7, 0x32, 0xd4, 0xda, 0xdd, 0x20, 0x77, 0xba, 0xa1, - 0x3f, 0xcf, 0x8c, 0x62, 0x44, 0xb8, 0x1b, 0x32, 0xc4, 0xc5, 0x5d, 0x09, 0x5d, 0xd2, 0x08, 0x8a, - 0x0c, 0x2e, 0xdc, 0xc3, 0x0f, 0x38, 0x2b, 0x47, 0x34, 0xf2, 0xa7, 0x7a, 0x23, 0x1c, 0x3d, 0xaf, - 0x37, 0x2f, 0x6c, 0xd9, 0xd6, 0x2e, 0xb9, 0xfd, 0xca, 0x62, 0xd7, 0x68, 0x91, 0xeb, 0x08, 0xc5, - 0x0f, 0xea, 0xad, 0x9e, 0xe9, 0x90, 0x1d, 0x64, 0x3a, 0xac, 0x1c, 0x61, 0xc6, 0x83, 0xfa, 0x04, - 0xbf, 0xd3, 0xc9, 0x45, 0x76, 0x3a, 0x2b, 0x47, 0xbc, 0x6e, 0x47, 0x5d, 0x84, 0xc9, 0x96, 0xb1, - 0x47, 0xb6, 0xaa, 0xc9, 0xac, 0x6b, 0xd0, 0xd1, 0xe5, 0x45, 0x63, 0x8f, 0x6e, 0x6c, 0xaf, 0x1c, - 0xd1, 0xfc, 0x3f, 0xd5, 0x65, 0x98, 0x22, 0xdb, 0x02, 0x84, 0xcc, 0x64, 0xac, 0x63, 0xc9, 0x2b, - 0x47, 0xb4, 0xe0, 0x5f, 0xd7, 0xfa, 0xc8, 0x90, 0xb3, 0x1f, 0x77, 0x79, 0xdb, 0xed, 0xa9, 0x58, - 0xdb, 0xed, 0xae, 0x2c, 0xe8, 0x86, 0xfb, 0x49, 0xc8, 0x36, 0x89, 0x84, 0xd3, 0x4c, 0xc2, 0xf4, - 0x55, 0xbd, 0x03, 0x32, 0x3b, 0xba, 0xed, 0x4d, 0x9e, 0xaf, 0x1f, 0x4c, 0x77, 0x4d, 0xb7, 0x2f, - 0xb8, 0x08, 0xba, 0x7f, 0x2d, 0x4c, 0x40, 0x96, 0x08, 0xce, 0x7f, 0x40, 0x6f, 0xcf, 0x50, 0x33, - 0xa4, 0x68, 0x99, 0xee, 0xb0, 0x5f, 0xb7, 0xbc, 0x03, 0x32, 0xbf, 0x9b, 0x1a, 0x8d, 0x05, 0xd9, - 0xf7, 0x5e, 0x73, 0x25, 0xf4, 0x5e, 0xf3, 0x9e, 0x0b, 0x76, 0x33, 0xbd, 0x17, 0xec, 0x06, 0xcb, - 0x07, 0xd9, 0xc1, 0x8e, 0x2a, 0x7f, 0x32, 0x84, 0xe9, 0xd2, 0x2b, 0x88, 0xf0, 0x19, 0x78, 0xdb, - 0x30, 0xb9, 0x3a, 0x7b, 0xaf, 0x31, 0x3b, 0xa5, 0xb8, 0x46, 0xcd, 0x00, 0xf6, 0x92, 0xef, 0x9b, - 0x7e, 0x3d, 0x03, 0xa7, 0xe8, 0x35, 0xce, 0x7b, 0xb8, 0x6e, 0x89, 0xf7, 0x4d, 0xa2, 0x3f, 0x1c, - 0x89, 0xd2, 0xf4, 0x19, 0x70, 0x94, 0xbe, 0x03, 0xce, 0xbe, 0x43, 0xca, 0x99, 0x01, 0x87, 0x94, - 0xb3, 0xf1, 0x56, 0x0e, 0x3f, 0xcc, 0xeb, 0xcf, 0xba, 0xa8, 0x3f, 0xb7, 0x87, 0x00, 0xd4, 0x4f, - 0x2e, 0x23, 0xb1, 0x6f, 0xde, 0xe5, 0x6b, 0x4a, 0x4d, 0xd0, 0x94, 0xbb, 0x86, 0x67, 0x24, 0x79, - 0x6d, 0xf9, 0x9d, 0x0c, 0x5c, 0x16, 0x30, 0x53, 0xc1, 0x17, 0x99, 0xa2, 0x7c, 0x61, 0x24, 0x8a, - 0x12, 0x3f, 0x06, 0x42, 0xd2, 0x1a, 0xf3, 0x47, 0xd2, 0x67, 0x87, 0x7a, 0x81, 0xf2, 0x65, 0x13, - 0xa2, 0x2c, 0x27, 0x21, 0x47, 0x7b, 0x18, 0x06, 0x0d, 0x7b, 0x8b, 0xd9, 0xdd, 0xc8, 0x9d, 0x38, - 0x92, 0xe5, 0x6d, 0x0c, 0xfa, 0xc3, 0xd6, 0x35, 0xea, 0xbb, 0xb6, 0x59, 0x36, 0x1d, 0x0b, 0xfd, - 0xec, 0x48, 0x14, 0xc7, 0xf7, 0x86, 0x53, 0x86, 0xf1, 0x86, 0x1b, 0x6a, 0x95, 0xc3, 0xab, 0xc1, - 0xa1, 0xac, 0x72, 0x84, 0x14, 0x9e, 0x3c, 0x7e, 0xef, 0x54, 0xe0, 0x24, 0x9b, 0x6c, 0x2d, 0x88, - 0x16, 0x22, 0xba, 0x6f, 0x14, 0x40, 0x1e, 0xf7, 0xcc, 0x24, 0x76, 0xcb, 0x19, 0x79, 0x11, 0x4f, - 0x4a, 0x45, 0xde, 0xef, 0x20, 0x4c, 0x07, 0x7b, 0x38, 0x1c, 0x09, 0x52, 0x72, 0xd7, 0x3a, 0xc4, - 0x60, 0x23, 0x79, 0xcc, 0x5e, 0xa2, 0x40, 0x8e, 0x5d, 0xdf, 0xbf, 0x91, 0x88, 0xc3, 0x84, 0x18, - 0xe5, 0x59, 0x62, 0x47, 0x2e, 0xf6, 0x25, 0xf7, 0xc9, 0xed, 0xc5, 0x1d, 0xd2, 0x2d, 0xf6, 0xdf, - 0x4d, 0xc3, 0x74, 0x0d, 0x3b, 0x45, 0xdd, 0xb6, 0x0d, 0x7d, 0x6b, 0x54, 0x1e, 0xdf, 0xb2, 0xde, - 0xc3, 0xe8, 0x7b, 0x29, 0xd9, 0xf3, 0x34, 0xfe, 0x42, 0xb8, 0xc7, 0x6a, 0x48, 0x2c, 0xc1, 0x87, - 0xa5, 0xce, 0xcc, 0x0c, 0xa2, 0x36, 0x06, 0x8f, 0xed, 0x34, 0x4c, 0x78, 0x67, 0xf1, 0x6e, 0x16, - 0xce, 0x67, 0x6e, 0x3b, 0x3b, 0xde, 0x31, 0x18, 0xf2, 0xbc, 0xff, 0x0c, 0x18, 0x7a, 0x75, 0x4c, - 0x47, 0xf9, 0xe8, 0x83, 0x84, 0xf1, 0xda, 0x58, 0x1c, 0x77, 0xf8, 0xc3, 0x3a, 0x3a, 0xf8, 0x5b, - 0x13, 0x6c, 0x39, 0x72, 0x55, 0x77, 0xf0, 0x03, 0xe8, 0x8b, 0x0a, 0x4c, 0xd4, 0xb0, 0xe3, 0x8e, - 0xb7, 0xc2, 0xe5, 0xa6, 0xc3, 0x6a, 0xb8, 0xca, 0xad, 0x78, 0x4c, 0xb1, 0x35, 0x8c, 0x7b, 0x60, - 0xaa, 0x63, 0x5b, 0x4d, 0xdc, 0xed, 0xb2, 0xd5, 0x0b, 0xde, 0x51, 0xad, 0xdf, 0xe8, 0x4f, 0x58, - 0x9b, 0x5f, 0xf7, 0xfe, 0xd1, 0x82, 0xdf, 0xe3, 0x9a, 0x01, 0x94, 0x12, 0xab, 0xe0, 0xb8, 0xcd, - 0x80, 0xa8, 0xc2, 0x93, 0x07, 0xfa, 0x73, 0x0a, 0xcc, 0xd4, 0xb0, 0xe3, 0x4b, 0x31, 0xc6, 0x26, - 0x47, 0x38, 0xbc, 0x02, 0x94, 0xca, 0xc1, 0xa0, 0x94, 0xbf, 0x1a, 0x50, 0x94, 0xa6, 0x4f, 0x6c, - 0x8c, 0x57, 0x03, 0xca, 0x71, 0x30, 0x86, 0xe3, 0x6b, 0x8f, 0x81, 0x29, 0xc2, 0x0b, 0x69, 0xb0, - 0xbf, 0x90, 0x09, 0x1a, 0xef, 0x97, 0x12, 0x6a, 0xbc, 0x77, 0x42, 0x76, 0x47, 0xb7, 0x2f, 0x74, - 0x49, 0xc3, 0x9d, 0x96, 0x31, 0xdb, 0xd7, 0xdc, 0xec, 0x1a, 0xfd, 0xab, 0xbf, 0x9f, 0x66, 0x36, - 0x9e, 0x9f, 0xe6, 0xc3, 0xe9, 0x58, 0x23, 0x21, 0x9d, 0x3b, 0x8c, 0xb0, 0xc9, 0xc7, 0x18, 0x37, - 0x23, 0xca, 0x4e, 0x5e, 0x39, 0x5e, 0xa4, 0xc0, 0xa4, 0x3b, 0x6e, 0x13, 0x7b, 0xfc, 0xdc, 0xc1, - 0xd5, 0xa1, 0xbf, 0xa1, 0x1f, 0xb3, 0x07, 0xf6, 0x24, 0x32, 0x3a, 0xf3, 0x3e, 0x46, 0x0f, 0x1c, - 0x55, 0x78, 0xf2, 0x78, 0xbc, 0x9b, 0xe2, 0x41, 0xda, 0x03, 0x7a, 0x93, 0x02, 0xca, 0x32, 0x76, - 0xc6, 0x6d, 0x45, 0xbe, 0x43, 0x3a, 0xc4, 0x91, 0x20, 0x30, 0xc2, 0xf3, 0xfc, 0x32, 0x1e, 0x4d, - 0x03, 0x92, 0x8b, 0x6d, 0x24, 0xc5, 0x40, 0xf2, 0xa8, 0xbd, 0x9f, 0xa2, 0x46, 0x37, 0x17, 0x7e, - 0x66, 0x04, 0xbd, 0xea, 0x78, 0x17, 0x3e, 0x3c, 0x01, 0x12, 0x1a, 0x87, 0xd5, 0xde, 0xfa, 0x15, - 0x3e, 0x96, 0xab, 0xf8, 0xc0, 0x6d, 0xec, 0xdb, 0xb8, 0x79, 0x01, 0xb7, 0xd0, 0x4f, 0x1e, 0x1c, - 0xba, 0x53, 0x30, 0xd1, 0xa4, 0xd4, 0x08, 0x78, 0x93, 0x9a, 0xf7, 0x1a, 0xe3, 0x5e, 0x69, 0xb1, - 0x23, 0xa2, 0xbf, 0x8f, 0xf1, 0x5e, 0x69, 0x89, 0xe2, 0xc7, 0x60, 0xb6, 0xd0, 0x59, 0x46, 0xb9, - 0x69, 0x99, 0xe8, 0xbf, 0x1c, 0x1c, 0x96, 0xab, 0x60, 0xca, 0x68, 0x5a, 0x26, 0x09, 0x43, 0xe1, - 0x1d, 0x02, 0xf2, 0x13, 0xbc, 0xaf, 0xa5, 0x1d, 0xeb, 0x7e, 0x83, 0xed, 0x9a, 0x07, 0x09, 0xc3, - 0x1a, 0x13, 0x2e, 0xeb, 0x87, 0x65, 0x4c, 0xf4, 0x29, 0x3b, 0x79, 0xc8, 0x3e, 0x11, 0x78, 0xb7, - 0xd1, 0xae, 0xf0, 0x11, 0xb1, 0x0a, 0x3c, 0xcc, 0x70, 0xc6, 0xd7, 0xe2, 0x50, 0x86, 0xb3, 0x08, - 0x06, 0xc6, 0x70, 0x63, 0x45, 0x80, 0x63, 0xe2, 0x6b, 0xc0, 0x07, 0x40, 0x67, 0x74, 0xe6, 0xe1, - 0x90, 0xe8, 0x1c, 0x8e, 0x89, 0xf8, 0x21, 0x16, 0x22, 0x93, 0x59, 0x3c, 0xe8, 0xbf, 0x8e, 0x02, - 0x9c, 0xdb, 0x87, 0xf1, 0x57, 0xa0, 0xde, 0x0a, 0x31, 0x6e, 0xc4, 0xde, 0x27, 0x41, 0x97, 0xca, - 0x18, 0xef, 0x8a, 0x97, 0x29, 0x3f, 0x79, 0x00, 0x5f, 0xa8, 0xc0, 0x1c, 0xf1, 0x11, 0x68, 0x63, - 0xdd, 0xa6, 0x1d, 0xe5, 0x48, 0x1c, 0xe5, 0xdf, 0x2d, 0x1d, 0xe0, 0x47, 0x94, 0x43, 0xc0, 0xc7, - 0x48, 0xa0, 0x90, 0x8b, 0xee, 0x23, 0xc9, 0xc2, 0x58, 0xb6, 0x51, 0xf2, 0x3e, 0x0b, 0x4c, 0xc5, - 0x47, 0x83, 0x47, 0x4c, 0x8f, 0x5c, 0x51, 0x18, 0x5e, 0x63, 0x1b, 0xb3, 0x47, 0xae, 0x0c, 0x13, - 0xc9, 0x63, 0xf2, 0xa6, 0x5b, 0xd8, 0x82, 0x73, 0x9d, 0x5c, 0x18, 0xff, 0xda, 0x8c, 0x7f, 0xa2, - 0xed, 0x73, 0x23, 0xf1, 0xc0, 0x3c, 0x40, 0x40, 0x7c, 0x15, 0x32, 0xb6, 0x75, 0x91, 0x2e, 0x6d, - 0xcd, 0x6a, 0xe4, 0x99, 0x5e, 0x4f, 0xd9, 0xde, 0xdd, 0x31, 0xe9, 0xc9, 0xd0, 0x59, 0xcd, 0x7b, - 0x55, 0xaf, 0x83, 0xd9, 0x8b, 0x86, 0xb3, 0xbd, 0x82, 0xf5, 0x16, 0xb6, 0x35, 0xeb, 0x22, 0xf1, - 0x98, 0x9b, 0xd4, 0xc4, 0x44, 0xd1, 0x7f, 0x45, 0xc2, 0xbe, 0x24, 0xb7, 0xc8, 0x8f, 0xe5, 0xf8, - 0x5b, 0x1c, 0xcb, 0x33, 0x9c, 0xab, 0xe4, 0x15, 0xe6, 0x03, 0x0a, 0x4c, 0x69, 0xd6, 0x45, 0xa6, - 0x24, 0xff, 0xc7, 0xe1, 0xea, 0x48, 0xec, 0x89, 0x1e, 0x91, 0x9c, 0xcf, 0xfe, 0xd8, 0x27, 0x7a, - 0x91, 0xc5, 0x8f, 0xe5, 0xe4, 0xd2, 0x8c, 0x66, 0x5d, 0xac, 0x61, 0x87, 0xb6, 0x08, 0xd4, 0x18, - 0x91, 0x93, 0xb5, 0xd1, 0xa5, 0x04, 0xd9, 0x3c, 0xdc, 0x7f, 0x8f, 0xbb, 0x8b, 0xe0, 0x0b, 0xc8, - 0x67, 0x71, 0xdc, 0xbb, 0x08, 0x03, 0x39, 0x18, 0x43, 0x8c, 0x14, 0x05, 0xa6, 0x35, 0xeb, 0xa2, - 0x3b, 0x34, 0x2c, 0x19, 0xed, 0xf6, 0x68, 0x46, 0xc8, 0xb8, 0xc6, 0xbf, 0x27, 0x06, 0x8f, 0x8b, - 0xb1, 0x1b, 0xff, 0x03, 0x18, 0x48, 0x1e, 0x86, 0xe7, 0xd1, 0xc6, 0xe2, 0x8d, 0xd0, 0xe6, 0x68, - 0x70, 0x18, 0xb6, 0x41, 0xf8, 0x6c, 0x1c, 0x5a, 0x83, 0x08, 0xe3, 0x60, 0x2c, 0x3b, 0x27, 0x73, - 0x45, 0x32, 0xcc, 0x8f, 0xb6, 0x4d, 0xbc, 0x37, 0x9e, 0x6b, 0x22, 0x1b, 0x76, 0x05, 0x46, 0x46, - 0x82, 0x46, 0x0c, 0x17, 0x44, 0x09, 0x1e, 0x92, 0xc7, 0xe3, 0xa3, 0x0a, 0xcc, 0x50, 0x16, 0x1e, - 0x21, 0x56, 0xc0, 0x50, 0x8d, 0x8a, 0xaf, 0xc1, 0xe1, 0x34, 0xaa, 0x08, 0x0e, 0xc6, 0x72, 0x2b, - 0xa8, 0x6b, 0xc7, 0x0d, 0x71, 0x7c, 0x3c, 0x0c, 0xc1, 0xa1, 0x8d, 0xb1, 0x11, 0x1e, 0x21, 0x1f, - 0xc6, 0x18, 0x3b, 0xa4, 0x63, 0xe4, 0xcf, 0xf3, 0x5b, 0xd1, 0x28, 0x31, 0x38, 0x40, 0x53, 0x18, - 0x21, 0x0c, 0x43, 0x36, 0x85, 0x43, 0x42, 0xe2, 0x6b, 0x0a, 0x00, 0x65, 0x60, 0xcd, 0xda, 0x23, - 0x97, 0xf9, 0x8c, 0xa0, 0x3b, 0xeb, 0x75, 0xab, 0x57, 0x06, 0xb8, 0xd5, 0xc7, 0x0c, 0xe1, 0x12, - 0x77, 0x25, 0x90, 0x93, 0xb2, 0x5b, 0xc9, 0xb1, 0xaf, 0x04, 0x46, 0x97, 0x9f, 0x3c, 0xc6, 0x5f, - 0xa1, 0xd6, 0x5c, 0x70, 0xc0, 0xf4, 0xd7, 0x46, 0x82, 0x32, 0x37, 0xfb, 0x57, 0xc4, 0xd9, 0xff, - 0x01, 0xb0, 0x1d, 0xd6, 0x46, 0x1c, 0x74, 0x70, 0x34, 0x79, 0x1b, 0xf1, 0xf0, 0x0e, 0x88, 0xfe, - 0x4c, 0x06, 0x8e, 0xb2, 0x4e, 0xe4, 0x87, 0x01, 0xe2, 0x98, 0xe7, 0xf0, 0x84, 0x4e, 0x72, 0x00, - 0xca, 0xa3, 0x5a, 0x90, 0x8a, 0xb3, 0x94, 0x29, 0xc1, 0xde, 0x58, 0x56, 0x37, 0x72, 0xa5, 0x07, - 0x3a, 0xba, 0xd9, 0x92, 0x0f, 0xf7, 0x3b, 0x00, 0x78, 0x6f, 0xad, 0x51, 0x11, 0xd7, 0x1a, 0xfb, - 0xac, 0x4c, 0xc6, 0xde, 0xb9, 0x26, 0x22, 0xa3, 0xec, 0x8e, 0x7d, 0xe7, 0x3a, 0xbc, 0xec, 0xe4, - 0x51, 0x7a, 0xaf, 0x02, 0x99, 0x9a, 0x65, 0x3b, 0xe8, 0xf9, 0x71, 0x5a, 0x27, 0x95, 0x7c, 0x00, - 0x92, 0xf7, 0xae, 0x16, 0x85, 0x5b, 0x9a, 0x6f, 0x8e, 0x3e, 0xea, 0xac, 0x3b, 0x3a, 0xf1, 0xea, - 0x76, 0xcb, 0xe7, 0xae, 0x6b, 0x8e, 0x1b, 0x4f, 0x87, 0xca, 0xaf, 0x16, 0x7e, 0x00, 0x23, 0xb1, - 0x78, 0x3a, 0xa1, 0x25, 0x27, 0x8f, 0xdb, 0x43, 0x47, 0x99, 0x6f, 0xeb, 0x92, 0xd1, 0xc6, 0xe8, - 0xf9, 0xd4, 0x65, 0xa4, 0xa2, 0xef, 0x60, 0xf9, 0x23, 0x31, 0x91, 0xae, 0xad, 0x24, 0xbe, 0xac, - 0x12, 0xc4, 0x97, 0x8d, 0xdb, 0xa0, 0xe8, 0x01, 0x74, 0xca, 0xd2, 0xb8, 0x1b, 0x54, 0x44, 0xd9, - 0x63, 0x89, 0xd3, 0x79, 0xac, 0x86, 0x1d, 0x6a, 0x54, 0x56, 0xbd, 0x1b, 0x58, 0x7e, 0x6a, 0x24, - 0x11, 0x3b, 0xfd, 0x0b, 0x5e, 0x94, 0x9e, 0x0b, 0x5e, 0x3e, 0xc0, 0x83, 0xb3, 0x26, 0x82, 0xf3, - 0x94, 0x70, 0x01, 0x89, 0x4c, 0x8e, 0x04, 0xa6, 0x77, 0xf8, 0x30, 0xad, 0x0b, 0x30, 0xdd, 0x31, - 0x24, 0x17, 0xc9, 0x03, 0xf6, 0x8b, 0x59, 0x38, 0x4a, 0x27, 0xfd, 0x05, 0xb3, 0xc5, 0x22, 0xac, - 0xbe, 0x35, 0x7d, 0xc8, 0x9b, 0x6d, 0xfb, 0x43, 0xb0, 0x0a, 0xb1, 0x9c, 0xb3, 0xbd, 0xb7, 0xe3, - 0x2f, 0xd0, 0x70, 0xae, 0x6e, 0x27, 0x4a, 0x76, 0xda, 0xe4, 0x6f, 0xc8, 0xf7, 0xff, 0x13, 0xef, - 0x32, 0x9a, 0x90, 0xbf, 0xcb, 0xe8, 0x8f, 0xe3, 0xad, 0xdb, 0x91, 0xa2, 0x7b, 0x04, 0x9e, 0xb0, - 0xed, 0x14, 0x63, 0x45, 0x4f, 0x82, 0xbb, 0x1f, 0x0d, 0x77, 0xb2, 0x20, 0x82, 0xc8, 0x90, 0xee, - 0x64, 0x84, 0xc0, 0x61, 0xba, 0x93, 0x0d, 0x62, 0x60, 0x0c, 0xb7, 0xda, 0x67, 0xd9, 0x6e, 0x3e, - 0x69, 0x37, 0xe8, 0x2f, 0xd3, 0x89, 0x8f, 0xd2, 0xdf, 0x4f, 0xc5, 0xf2, 0x7f, 0x26, 0x7c, 0x45, - 0x0f, 0xd3, 0x71, 0x3c, 0x9a, 0xa3, 0xc8, 0x8d, 0x61, 0xdd, 0x28, 0x4d, 0x7c, 0xd1, 0xcf, 0x19, - 0x2d, 0x67, 0x7b, 0x44, 0x27, 0x3a, 0x2e, 0xba, 0xb4, 0xbc, 0xeb, 0x91, 0xc9, 0x0b, 0xfa, 0xd7, - 0x54, 0xac, 0x10, 0x52, 0xbe, 0x48, 0x08, 0x5b, 0x21, 0x22, 0x8e, 0x11, 0xf8, 0x29, 0x92, 0xde, - 0x18, 0x35, 0xfa, 0xac, 0xd1, 0xc2, 0xd6, 0x23, 0x50, 0xa3, 0x09, 0x5f, 0xa3, 0xd3, 0xe8, 0x28, - 0x72, 0x3f, 0xa2, 0x1a, 0xed, 0x8b, 0x64, 0x44, 0x1a, 0x1d, 0x49, 0x2f, 0x79, 0x19, 0xbf, 0x7a, - 0x86, 0x4d, 0xa4, 0x56, 0x0d, 0xf3, 0x02, 0xfa, 0xe7, 0x9c, 0x77, 0x31, 0xf3, 0x39, 0xc3, 0xd9, - 0x66, 0xb1, 0x60, 0x7e, 0x47, 0xfa, 0x6e, 0x94, 0x21, 0xe2, 0xbd, 0x88, 0xe1, 0xa4, 0xb2, 0xfb, - 0xc2, 0x49, 0x15, 0x60, 0xd6, 0x30, 0x1d, 0x6c, 0x9b, 0x7a, 0x7b, 0xa9, 0xad, 0x6f, 0x75, 0x4f, - 0x4d, 0xf4, 0xbd, 0xbc, 0xae, 0xcc, 0xe5, 0xd1, 0xc4, 0x3f, 0xf8, 0xeb, 0x2b, 0x27, 0xc5, 0xeb, - 0x2b, 0x43, 0xa2, 0x5f, 0x4d, 0x85, 0x47, 0xbf, 0xf2, 0xa3, 0x5b, 0xc1, 0xe0, 0xe0, 0xd8, 0xb2, - 0xb6, 0x71, 0xcc, 0x70, 0x7f, 0x37, 0x4b, 0x46, 0x61, 0xf3, 0x43, 0x3f, 0xbe, 0x4e, 0x89, 0xb5, - 0xba, 0xe7, 0x2a, 0xc2, 0x7c, 0xaf, 0x12, 0xc4, 0xb6, 0x50, 0xf9, 0xca, 0x2b, 0x3d, 0x95, 0xf7, - 0x4d, 0x9e, 0x8c, 0x84, 0xc9, 0xc3, 0x2b, 0x55, 0x56, 0x4e, 0xa9, 0xe2, 0x2c, 0x16, 0xca, 0xd4, - 0x76, 0x0c, 0xa7, 0x91, 0xb2, 0x70, 0xcc, 0x8b, 0x76, 0xdb, 0xe9, 0x60, 0xdd, 0xd6, 0xcd, 0x26, - 0x46, 0x9f, 0x48, 0x8f, 0xc2, 0xec, 0x5d, 0x82, 0x49, 0xa3, 0x69, 0x99, 0x35, 0xe3, 0x59, 0xde, - 0xe5, 0x72, 0xd1, 0x41, 0xd6, 0x89, 0x44, 0xca, 0xec, 0x0f, 0xcd, 0xff, 0x57, 0x2d, 0xc3, 0x54, - 0x53, 0xb7, 0x5b, 0x34, 0x08, 0x5f, 0xb6, 0xe7, 0x22, 0xa7, 0x50, 0x42, 0x45, 0xef, 0x17, 0x2d, - 0xf8, 0x5b, 0xad, 0x8a, 0x42, 0xcc, 0xf5, 0x44, 0xf3, 0x08, 0x25, 0xb6, 0x18, 0xfc, 0x24, 0xc8, - 0xdc, 0x95, 0x8e, 0x8d, 0xdb, 0xe4, 0x0e, 0x7a, 0xda, 0x43, 0x4c, 0x69, 0x41, 0x42, 0xdc, 0xe5, - 0x01, 0x52, 0xd4, 0x3e, 0x34, 0xc6, 0xbd, 0x3c, 0x20, 0xc5, 0x45, 0xf2, 0x9a, 0xf9, 0xae, 0x1c, - 0xcc, 0xd2, 0x5e, 0x8d, 0x89, 0x13, 0xbd, 0x90, 0x5c, 0x21, 0xed, 0xdc, 0x8b, 0x2f, 0xa1, 0xda, - 0xc1, 0xc7, 0xe4, 0x3c, 0x28, 0x17, 0xfc, 0x80, 0x83, 0xee, 0x63, 0xdc, 0x7d, 0x7b, 0x8f, 0xaf, - 0x79, 0xca, 0xd3, 0xb8, 0xf7, 0xed, 0xa3, 0x8b, 0x4f, 0x1e, 0x9f, 0x5f, 0x52, 0x40, 0x29, 0xb4, - 0x5a, 0xa8, 0x79, 0x70, 0x28, 0xae, 0x81, 0x69, 0xaf, 0xcd, 0x04, 0x31, 0x20, 0xf9, 0xa4, 0xb8, - 0x8b, 0xa0, 0xbe, 0x6c, 0x0a, 0xad, 0xb1, 0xef, 0x2a, 0x44, 0x94, 0x9d, 0x3c, 0x28, 0xbf, 0x36, - 0xc1, 0x1a, 0xcd, 0x82, 0x65, 0x5d, 0x20, 0x47, 0x65, 0x9e, 0xaf, 0x40, 0x76, 0x09, 0x3b, 0xcd, - 0xed, 0x11, 0xb5, 0x99, 0x5d, 0xbb, 0xed, 0xb5, 0x99, 0x7d, 0xf7, 0xe1, 0x0f, 0xb6, 0x61, 0x3d, - 0xb6, 0xe6, 0x09, 0x4b, 0xe3, 0x8e, 0xee, 0x1c, 0x59, 0x7a, 0xf2, 0xe0, 0xfc, 0xab, 0x02, 0x73, - 0xfe, 0x0a, 0x17, 0xc5, 0xe4, 0x17, 0x53, 0x8f, 0xb4, 0xf5, 0x4e, 0xf4, 0x85, 0x78, 0x21, 0xd2, - 0x7c, 0x99, 0x8a, 0x35, 0x4b, 0x78, 0x61, 0x31, 0x46, 0xf0, 0x34, 0x39, 0x06, 0xc7, 0x30, 0x83, - 0x57, 0x60, 0x92, 0x30, 0xb4, 0x68, 0xec, 0x11, 0xd7, 0x41, 0x61, 0xa1, 0xf1, 0xd9, 0x23, 0x59, - 0x68, 0xbc, 0x43, 0x5c, 0x68, 0x94, 0x8c, 0x78, 0xec, 0xad, 0x33, 0xc6, 0xf4, 0xa5, 0x71, 0xff, - 0x1f, 0xf9, 0x32, 0x63, 0x0c, 0x5f, 0x9a, 0x01, 0xe5, 0x27, 0x8f, 0xe8, 0xeb, 0xfe, 0x13, 0xeb, - 0x6c, 0xbd, 0x0d, 0x55, 0xf4, 0x7f, 0x1d, 0x83, 0xcc, 0x59, 0xf7, 0xe1, 0x7f, 0x06, 0x37, 0x62, - 0xbd, 0x7c, 0x04, 0xc1, 0x19, 0x9e, 0x0e, 0x19, 0x97, 0x3e, 0x9b, 0xb6, 0xdc, 0x28, 0xb7, 0xbb, - 0xeb, 0x32, 0xa2, 0x91, 0xff, 0xd4, 0x93, 0x90, 0xeb, 0x5a, 0xbb, 0x76, 0xd3, 0x35, 0x9f, 0x5d, - 0x8d, 0x61, 0x6f, 0x71, 0x83, 0x92, 0x0a, 0xa4, 0xe7, 0x47, 0xe7, 0x32, 0xca, 0x5d, 0x90, 0xa4, - 0x08, 0x17, 0x24, 0xc5, 0xd8, 0x3f, 0x90, 0xe0, 0x2d, 0x79, 0x8d, 0xf8, 0x4b, 0x72, 0x57, 0x60, - 0x6b, 0x54, 0xb0, 0x87, 0x88, 0xe5, 0xa0, 0xea, 0x10, 0xd7, 0xe1, 0x5b, 0x14, 0xad, 0x1f, 0x07, - 0x7e, 0xac, 0x0e, 0xdf, 0x12, 0x3c, 0x8c, 0xe5, 0x94, 0x7a, 0x8e, 0x39, 0xa9, 0xde, 0x37, 0x4a, - 0x74, 0x33, 0x82, 0xd2, 0x1f, 0x08, 0x9d, 0x11, 0x3a, 0xaf, 0x0e, 0x8d, 0xce, 0x21, 0xb9, 0xaf, - 0xfe, 0x9e, 0x42, 0x22, 0x61, 0x7a, 0x46, 0x8e, 0xfc, 0x45, 0x47, 0xb1, 0x21, 0x72, 0xc7, 0x60, - 0x21, 0x0e, 0xf4, 0xec, 0xf0, 0xa1, 0xc1, 0x45, 0xd1, 0x71, 0xfc, 0x8f, 0x3b, 0x34, 0xb8, 0x2c, - 0x23, 0xc9, 0x03, 0xf9, 0x46, 0x7a, 0xb1, 0x58, 0xa1, 0xe9, 0x18, 0x7b, 0x23, 0x6e, 0x69, 0xe2, - 0xf0, 0x12, 0x33, 0x1a, 0xf0, 0x3e, 0x09, 0x51, 0x0e, 0xc7, 0x1d, 0x0d, 0x58, 0x8e, 0x8d, 0xe4, - 0x61, 0xfa, 0x9b, 0x9c, 0x2b, 0x3d, 0xb6, 0x36, 0xf3, 0x26, 0xb6, 0x1a, 0x80, 0x0f, 0x8e, 0xd6, - 0x19, 0x98, 0xe1, 0xa6, 0xfe, 0xde, 0x85, 0x35, 0x42, 0x5a, 0xdc, 0x83, 0xee, 0xbe, 0xc8, 0x46, - 0xbe, 0x30, 0x10, 0x63, 0xc1, 0x57, 0x86, 0x89, 0xb1, 0xdc, 0x07, 0xe7, 0x8d, 0x61, 0x63, 0xc2, - 0xea, 0x77, 0x78, 0xac, 0xaa, 0x22, 0x56, 0xb7, 0xc9, 0x88, 0x49, 0x6e, 0x4c, 0x93, 0x9a, 0x37, - 0xbe, 0xd3, 0x87, 0x4b, 0x13, 0xe0, 0x7a, 0xfa, 0xd0, 0x7c, 0x24, 0x8f, 0xd8, 0x2b, 0x68, 0x77, - 0x58, 0xa3, 0x26, 0xfb, 0x68, 0xba, 0x43, 0x36, 0x1b, 0x50, 0x84, 0xd9, 0x40, 0x4c, 0x7f, 0xfb, - 0xc0, 0x8d, 0xd4, 0x63, 0x6e, 0x10, 0x44, 0x99, 0x11, 0xfb, 0xdb, 0x0f, 0xe4, 0x20, 0x79, 0x70, - 0xfe, 0x51, 0x01, 0x58, 0xb6, 0xad, 0xdd, 0x4e, 0xd5, 0x6e, 0x61, 0x1b, 0xfd, 0x75, 0x30, 0x01, - 0x78, 0xe9, 0x08, 0x26, 0x00, 0xeb, 0x00, 0x5b, 0x3e, 0x71, 0xa6, 0xe1, 0xb7, 0xc8, 0x99, 0xfb, - 0x01, 0x53, 0x1a, 0x47, 0x43, 0xbc, 0x72, 0xf6, 0x19, 0x22, 0xc6, 0x51, 0x7d, 0x56, 0x40, 0x6e, - 0x94, 0x13, 0x80, 0x77, 0xfb, 0x58, 0xd7, 0x05, 0xac, 0xef, 0x3e, 0x00, 0x27, 0xc9, 0x63, 0xfe, - 0x4f, 0x13, 0x30, 0x4d, 0xb7, 0xeb, 0xa8, 0x4c, 0xff, 0x2e, 0x00, 0xfd, 0xd7, 0x46, 0x00, 0xfa, - 0x06, 0xcc, 0x58, 0x01, 0x75, 0xda, 0xa7, 0xf2, 0x0b, 0x30, 0x91, 0xb0, 0x73, 0x7c, 0x69, 0x02, - 0x19, 0xf4, 0x31, 0x1e, 0x79, 0x4d, 0x44, 0xfe, 0x8e, 0x08, 0x79, 0x73, 0x14, 0x47, 0x09, 0xfd, - 0x7b, 0x7c, 0xe8, 0x37, 0x04, 0xe8, 0x0b, 0x07, 0x61, 0x65, 0x0c, 0xe1, 0xf6, 0x15, 0xc8, 0x90, - 0xd3, 0x71, 0xbf, 0x9e, 0xe0, 0xfc, 0xfe, 0x14, 0x4c, 0x90, 0x26, 0xeb, 0xcf, 0x3b, 0xbc, 0x57, - 0xf7, 0x8b, 0xbe, 0xe9, 0x60, 0xdb, 0xf7, 0x58, 0xf0, 0x5e, 0x5d, 0x1e, 0x3c, 0xaf, 0xe4, 0xee, - 0xa9, 0x1c, 0xdd, 0x88, 0xf4, 0x13, 0x86, 0x9e, 0x94, 0xf0, 0x12, 0x1f, 0xd9, 0x79, 0xb9, 0x61, - 0x26, 0x25, 0x03, 0x18, 0x49, 0x1e, 0xf8, 0x3f, 0xcf, 0xc0, 0x29, 0xba, 0xaa, 0xb4, 0x64, 0x5b, - 0x3b, 0x3d, 0xb7, 0x5b, 0x19, 0x07, 0xd7, 0x85, 0xeb, 0x61, 0xce, 0x11, 0xfc, 0xb1, 0x99, 0x4e, - 0xf4, 0xa4, 0xa2, 0x3f, 0xe1, 0x7d, 0x2a, 0x9e, 0x29, 0x22, 0xb9, 0x10, 0x21, 0xc0, 0x30, 0xde, - 0x63, 0x2f, 0xd4, 0x4b, 0x32, 0xca, 0x2d, 0x52, 0x29, 0x43, 0xad, 0x59, 0xfa, 0x3a, 0x95, 0x95, - 0xd1, 0xa9, 0x0f, 0xfa, 0x3a, 0xf5, 0x93, 0x82, 0x4e, 0x2d, 0x1f, 0x5c, 0x24, 0xc9, 0xeb, 0xd6, - 0x6b, 0xfd, 0x8d, 0x21, 0x7f, 0xdb, 0x6e, 0x27, 0x81, 0xcd, 0x3a, 0xde, 0x1f, 0x29, 0x23, 0xf8, - 0x23, 0x89, 0xf7, 0x51, 0xc4, 0x98, 0x09, 0x8b, 0x5c, 0x87, 0xe8, 0xd2, 0x1c, 0xa4, 0x0d, 0x8f, - 0xbb, 0xb4, 0xd1, 0x1a, 0x6a, 0xae, 0x1b, 0x59, 0xd0, 0x18, 0xd6, 0x96, 0xe6, 0x20, 0xb7, 0x64, - 0xb4, 0x1d, 0x6c, 0xa3, 0xaf, 0xb0, 0x99, 0xee, 0x6b, 0x13, 0x1c, 0x00, 0x16, 0x21, 0xb7, 0x49, - 0x4a, 0x63, 0x26, 0xf3, 0x4d, 0x72, 0xad, 0x87, 0x72, 0xa8, 0xb1, 0x7f, 0xe3, 0x46, 0xe7, 0xeb, - 0x21, 0x33, 0xb2, 0x29, 0x72, 0x8c, 0xe8, 0x7c, 0x83, 0x59, 0x18, 0xcb, 0xc5, 0x54, 0x39, 0x0d, - 0xef, 0xb8, 0x63, 0xfc, 0x85, 0xe4, 0x10, 0xce, 0x83, 0x62, 0xb4, 0xba, 0xa4, 0x73, 0x9c, 0xd2, - 0xdc, 0xc7, 0xb8, 0xbe, 0x42, 0xbd, 0xa2, 0xa2, 0x2c, 0x8f, 0xdb, 0x57, 0x48, 0x8a, 0x8b, 0xe4, - 0x31, 0xfb, 0x3e, 0x71, 0x14, 0xed, 0xb4, 0xf5, 0x26, 0x76, 0xb9, 0x4f, 0x0c, 0x35, 0xda, 0x93, - 0x65, 0xbc, 0x9e, 0x8c, 0x6b, 0xa7, 0xd9, 0x03, 0xb4, 0xd3, 0x61, 0x97, 0x21, 0x7d, 0x99, 0x93, - 0x8a, 0x1f, 0xda, 0x32, 0x64, 0x24, 0x1b, 0x63, 0xb8, 0x76, 0xd4, 0x3b, 0x48, 0x3b, 0xd6, 0xd6, - 0x3a, 0xec, 0x26, 0x0d, 0x13, 0xd6, 0xc8, 0x0e, 0xcd, 0x0e, 0xb3, 0x49, 0x13, 0xce, 0xc3, 0x18, - 0xd0, 0x9a, 0x63, 0x68, 0x7d, 0x9e, 0x0d, 0xa3, 0x09, 0xef, 0x93, 0x76, 0x2d, 0xdb, 0x89, 0xb7, - 0x4f, 0xea, 0x72, 0xa7, 0x91, 0xff, 0xe2, 0x1e, 0xbc, 0x12, 0xcf, 0x55, 0x8f, 0x6a, 0xf8, 0x8c, - 0x71, 0xf0, 0x6a, 0x10, 0x03, 0xc9, 0xc3, 0xfb, 0xb6, 0x43, 0x1a, 0x3c, 0x87, 0x6d, 0x8e, 0xac, - 0x0d, 0x8c, 0x6c, 0xe8, 0x1c, 0xa6, 0x39, 0x86, 0xf3, 0x90, 0x3c, 0x5e, 0xdf, 0xe1, 0x06, 0xce, - 0xb7, 0x8c, 0x71, 0xe0, 0xf4, 0x5a, 0x66, 0x76, 0xc8, 0x96, 0x39, 0xec, 0xfe, 0x0f, 0x93, 0xf5, - 0xe8, 0x06, 0xcc, 0x61, 0xf6, 0x7f, 0x22, 0x98, 0x48, 0x1e, 0xf1, 0xb7, 0x2a, 0x90, 0xad, 0x8d, - 0x7f, 0xbc, 0x1c, 0x76, 0x2e, 0x42, 0x64, 0x55, 0x1b, 0xd9, 0x70, 0x39, 0xcc, 0x5c, 0x24, 0x94, - 0x85, 0x31, 0x04, 0xde, 0x3f, 0x0a, 0x33, 0x64, 0x49, 0xc4, 0xdb, 0x66, 0xfd, 0x0e, 0x1b, 0x35, - 0x1f, 0x4e, 0xb0, 0xad, 0xde, 0x03, 0x93, 0xde, 0xfe, 0x1d, 0x1b, 0x39, 0xe7, 0xe5, 0xda, 0xa7, - 0xc7, 0xa5, 0xe6, 0xff, 0x7f, 0x20, 0x67, 0x88, 0x91, 0xef, 0xd5, 0x0e, 0xeb, 0x0c, 0x71, 0xa8, - 0xfb, 0xb5, 0x7f, 0x1c, 0x8c, 0xa8, 0xff, 0x25, 0x39, 0xcc, 0x7b, 0xf7, 0x71, 0x33, 0x7d, 0xf6, - 0x71, 0x3f, 0xc1, 0x63, 0x59, 0x13, 0xb1, 0xbc, 0x53, 0x56, 0x84, 0x23, 0x1c, 0x6b, 0xdf, 0xeb, - 0xc3, 0x79, 0x56, 0x80, 0x73, 0xe1, 0x40, 0xbc, 0x8c, 0xe1, 0xe0, 0x63, 0x26, 0x18, 0x73, 0x3f, - 0x99, 0x60, 0x3b, 0xee, 0x39, 0x55, 0x91, 0xd9, 0x77, 0xaa, 0x42, 0x68, 0xe9, 0xd9, 0x03, 0xb6, - 0xf4, 0x4f, 0xf2, 0xda, 0x51, 0x17, 0xb5, 0xe3, 0xe9, 0xf2, 0x88, 0x8c, 0x6e, 0x64, 0x7e, 0x9f, - 0xaf, 0x1e, 0xe7, 0x04, 0xf5, 0x28, 0x1e, 0x8c, 0x99, 0xe4, 0xf5, 0xe3, 0xf7, 0xbd, 0x09, 0xed, - 0x21, 0xb7, 0xf7, 0x61, 0xb7, 0x8a, 0x05, 0x21, 0x8e, 0x6c, 0xe4, 0x1e, 0x66, 0xab, 0x78, 0x10, - 0x27, 0x63, 0x88, 0xc5, 0x36, 0x0b, 0xd3, 0x84, 0xa7, 0x73, 0x46, 0x6b, 0x0b, 0x3b, 0xe8, 0x75, - 0xd4, 0x47, 0xd1, 0x8b, 0x7c, 0x39, 0xa2, 0xf0, 0x44, 0x61, 0xe7, 0x5d, 0xe3, 0x7a, 0x74, 0x50, - 0x26, 0xe7, 0x39, 0x06, 0xc7, 0x1d, 0x41, 0x71, 0x20, 0x07, 0xc9, 0x43, 0xf6, 0x31, 0xea, 0x6e, - 0xb3, 0xaa, 0x5f, 0xb2, 0x76, 0x1d, 0xf4, 0xe0, 0x08, 0x3a, 0xe8, 0x05, 0xc8, 0xb5, 0x09, 0x35, - 0x76, 0x2c, 0x23, 0x7a, 0xba, 0xc3, 0x44, 0x40, 0xcb, 0xd7, 0xd8, 0x9f, 0x71, 0xcf, 0x66, 0x04, - 0x72, 0xa4, 0x74, 0xc6, 0x7d, 0x36, 0x63, 0x40, 0xf9, 0x63, 0xb9, 0x63, 0x67, 0xd2, 0x2d, 0xdd, - 0xd8, 0x31, 0x9c, 0x11, 0x45, 0x70, 0x68, 0xbb, 0xb4, 0xbc, 0x08, 0x0e, 0xe4, 0x25, 0xee, 0x89, - 0x51, 0x4e, 0x2a, 0xee, 0xef, 0xe3, 0x3e, 0x31, 0x1a, 0x5d, 0x7c, 0xf2, 0x98, 0xfc, 0x0a, 0x6d, - 0x59, 0x67, 0xa9, 0xf3, 0x6d, 0x82, 0x7e, 0xbd, 0x43, 0x37, 0x16, 0xca, 0xda, 0xe1, 0x35, 0x96, - 0xbe, 0xe5, 0x27, 0x0f, 0xcc, 0x7f, 0xff, 0x31, 0xc8, 0x2e, 0xe2, 0xf3, 0xbb, 0x5b, 0xe8, 0x0e, - 0x98, 0xac, 0xdb, 0x18, 0x97, 0xcd, 0x4d, 0xcb, 0x95, 0xae, 0xe3, 0x3e, 0x7b, 0x90, 0xb0, 0x37, - 0x17, 0x8f, 0x6d, 0xac, 0xb7, 0x82, 0xf3, 0x67, 0xde, 0x2b, 0x7a, 0x79, 0x1a, 0x32, 0x35, 0x47, - 0x77, 0xd0, 0x94, 0x8f, 0x2d, 0x7a, 0x90, 0xc7, 0xe2, 0x0e, 0x11, 0x8b, 0xeb, 0x05, 0x59, 0x10, - 0x0e, 0xe6, 0xdd, 0xff, 0x43, 0x00, 0x40, 0x30, 0x79, 0x7f, 0xd7, 0x32, 0xdd, 0x1c, 0xde, 0x11, - 0x48, 0xef, 0x1d, 0xbd, 0xc6, 0x17, 0xf7, 0x5d, 0x82, 0xb8, 0x1f, 0x27, 0x57, 0xc4, 0x18, 0x56, - 0xda, 0xd2, 0x30, 0xe5, 0x8a, 0x76, 0x05, 0xeb, 0xad, 0x2e, 0x7a, 0x74, 0xa0, 0xfc, 0x21, 0x62, - 0x46, 0x1f, 0x92, 0x0e, 0xc6, 0x49, 0x6b, 0xe5, 0x13, 0x0f, 0xf7, 0xe8, 0xf0, 0x36, 0xff, 0xd3, - 0x62, 0x30, 0x92, 0x9b, 0x21, 0x63, 0x98, 0x9b, 0x16, 0xf3, 0x2f, 0xbc, 0x32, 0x84, 0xb6, 0xab, - 0x13, 0x1a, 0xc9, 0x28, 0x19, 0xa9, 0x33, 0x9a, 0xad, 0xb1, 0x5c, 0x7a, 0x97, 0x71, 0x4b, 0x47, - 0xff, 0xfb, 0x40, 0x61, 0xab, 0x2a, 0x64, 0x3a, 0xba, 0xb3, 0xcd, 0x8a, 0x26, 0xcf, 0xae, 0x8d, - 0xbc, 0x6b, 0xea, 0xa6, 0x65, 0x5e, 0xda, 0x31, 0x9e, 0xe5, 0xdf, 0xad, 0x2b, 0xa4, 0xb9, 0x9c, - 0x6f, 0x61, 0x13, 0xdb, 0xba, 0x83, 0x6b, 0x7b, 0x5b, 0x64, 0x8e, 0x35, 0xa9, 0xf1, 0x49, 0xb1, - 0xf5, 0xdf, 0xe5, 0x38, 0x5c, 0xff, 0x37, 0x8d, 0x36, 0x26, 0x91, 0x9a, 0x98, 0xfe, 0x7b, 0xef, - 0xb1, 0xf4, 0xbf, 0x4f, 0x11, 0xc9, 0xa3, 0xf1, 0x6f, 0x69, 0x98, 0xa9, 0xb9, 0x0a, 0x57, 0xdb, - 0xdd, 0xd9, 0xd1, 0xed, 0x4b, 0xe8, 0xda, 0x00, 0x15, 0x4e, 0x35, 0x53, 0xa2, 0x5f, 0xca, 0xef, - 0x49, 0x5f, 0x2b, 0xcd, 0x9a, 0x36, 0x57, 0x42, 0xec, 0x76, 0xf0, 0x04, 0xc8, 0xba, 0xea, 0xed, - 0x79, 0x5c, 0x46, 0x36, 0x04, 0x9a, 0x53, 0x32, 0xa2, 0xd5, 0x40, 0xde, 0xc6, 0x10, 0x4d, 0x23, - 0x0d, 0x47, 0x6b, 0x8e, 0xde, 0xbc, 0xb0, 0x6c, 0xd9, 0xd6, 0xae, 0x63, 0x98, 0xb8, 0x8b, 0x1e, - 0x15, 0x20, 0xe0, 0xe9, 0x7f, 0x2a, 0xd0, 0x7f, 0xf4, 0xef, 0x29, 0xd9, 0x51, 0xd4, 0xef, 0x56, - 0x79, 0xf2, 0x21, 0x01, 0xaa, 0xe4, 0xc6, 0x45, 0x19, 0x8a, 0xc9, 0x0b, 0xed, 0x2d, 0x0a, 0xe4, - 0x4b, 0x0f, 0x74, 0x2c, 0xdb, 0x59, 0xb5, 0x9a, 0x7a, 0xbb, 0xeb, 0x58, 0x36, 0x46, 0xd5, 0x48, - 0xa9, 0xb9, 0x3d, 0x4c, 0xcb, 0x6a, 0x06, 0x83, 0x23, 0x7b, 0xe3, 0xd5, 0x4e, 0x11, 0x75, 0xfc, - 0x63, 0xd2, 0xbb, 0x8c, 0x54, 0x2a, 0xbd, 0x1c, 0x85, 0xe8, 0x79, 0xbf, 0x2e, 0x2d, 0xde, 0x61, - 0x09, 0xb9, 0x9d, 0x47, 0x29, 0xa6, 0xc6, 0xb0, 0x54, 0x9e, 0x86, 0xd9, 0xda, 0xee, 0x79, 0x9f, - 0x48, 0x97, 0x37, 0x42, 0x5e, 0x2f, 0x1d, 0xa5, 0x82, 0x29, 0x1e, 0x4f, 0x28, 0x44, 0xbe, 0xd7, - 0xc1, 0x6c, 0x97, 0xcf, 0xc6, 0xf0, 0x16, 0x13, 0x25, 0xa3, 0x53, 0x0c, 0x2e, 0x35, 0x79, 0x01, - 0xbe, 0x2f, 0x0d, 0xb3, 0xd5, 0x0e, 0x36, 0x71, 0x8b, 0x7a, 0x41, 0x0a, 0x02, 0x7c, 0x79, 0x4c, - 0x01, 0x0a, 0x84, 0x42, 0x04, 0x18, 0x78, 0x2c, 0x2f, 0x7a, 0xc2, 0x0b, 0x12, 0x62, 0x09, 0x2e, - 0xaa, 0xb4, 0xe4, 0x05, 0xf7, 0xe5, 0x34, 0x4c, 0x6b, 0xbb, 0xe6, 0xba, 0x6d, 0xb9, 0xa3, 0xb1, - 0x8d, 0xee, 0x0c, 0x3a, 0x88, 0x9b, 0xe0, 0x58, 0x6b, 0xd7, 0x26, 0xeb, 0x4f, 0x65, 0xb3, 0x86, - 0x9b, 0x96, 0xd9, 0xea, 0x92, 0x7a, 0x64, 0xb5, 0xfd, 0x1f, 0x6e, 0xcf, 0x3c, 0xff, 0x9b, 0x4a, - 0x0a, 0xbd, 0x50, 0x3a, 0xd4, 0x0d, 0xad, 0x3c, 0x57, 0xb4, 0x7c, 0x4f, 0x20, 0x19, 0xd0, 0x66, - 0x50, 0x09, 0xc9, 0x0b, 0xf7, 0xf3, 0x69, 0x50, 0x0b, 0xcd, 0xa6, 0xb5, 0x6b, 0x3a, 0x35, 0xdc, - 0xc6, 0x4d, 0xa7, 0x6e, 0xeb, 0x4d, 0xcc, 0xdb, 0xcf, 0x79, 0x50, 0x5a, 0x86, 0xcd, 0xfa, 0x60, - 0xf7, 0x91, 0xc9, 0xf1, 0xe5, 0xd2, 0x3b, 0x8e, 0xb4, 0x96, 0xfb, 0x4b, 0x89, 0x21, 0x4e, 0xb9, - 0x7d, 0x45, 0xc9, 0x82, 0x92, 0x97, 0xea, 0x27, 0xd3, 0x30, 0xe5, 0xf5, 0xd8, 0x5b, 0x32, 0xc2, - 0xfc, 0x95, 0x98, 0x93, 0x11, 0x9f, 0x78, 0x0c, 0x19, 0xbe, 0x2b, 0xc6, 0xac, 0x22, 0x8c, 0x7e, - 0x3c, 0xd1, 0x15, 0xe2, 0x8b, 0xce, 0x7d, 0xad, 0x54, 0x1b, 0x4b, 0xd5, 0xd5, 0xc5, 0x92, 0x96, - 0x57, 0xd0, 0x57, 0xd2, 0x90, 0x59, 0x37, 0xcc, 0x2d, 0x3e, 0xba, 0xd2, 0x71, 0xd7, 0x8e, 0x6c, - 0xe1, 0x07, 0x58, 0x4b, 0xa7, 0x2f, 0xea, 0xad, 0x70, 0xdc, 0xdc, 0xdd, 0x39, 0x8f, 0xed, 0xea, - 0x26, 0x19, 0x65, 0xbb, 0x75, 0xab, 0x86, 0x4d, 0x6a, 0x84, 0x66, 0xb5, 0xbe, 0xdf, 0x44, 0x13, - 0x4c, 0x62, 0xf2, 0xe0, 0x72, 0x12, 0x22, 0x71, 0x9f, 0xa9, 0x34, 0xc7, 0x54, 0xac, 0x69, 0x43, - 0x1f, 0xe2, 0xc9, 0x6b, 0xea, 0x1f, 0x64, 0xe1, 0x44, 0xc1, 0xbc, 0x44, 0x6c, 0x0a, 0xda, 0xc1, - 0x17, 0xb7, 0x75, 0x73, 0x0b, 0x93, 0x01, 0xc2, 0x97, 0x38, 0x1f, 0xa2, 0x3f, 0x25, 0x86, 0xe8, - 0x57, 0x35, 0x98, 0xb0, 0xec, 0x16, 0xb6, 0x17, 0x2e, 0x11, 0x9e, 0x7a, 0x97, 0x9d, 0x59, 0x9b, - 0xec, 0x57, 0xc4, 0x3c, 0x23, 0x3f, 0x5f, 0xa5, 0xff, 0x6b, 0x1e, 0xa1, 0x33, 0x37, 0xc1, 0x04, - 0x4b, 0x53, 0x67, 0x60, 0xb2, 0xaa, 0x2d, 0x96, 0xb4, 0x46, 0x79, 0x31, 0x7f, 0x44, 0xbd, 0x0c, - 0x8e, 0x96, 0xeb, 0x25, 0xad, 0x50, 0x2f, 0x57, 0x2b, 0x0d, 0x92, 0x9e, 0x4f, 0xa1, 0xe7, 0x65, - 0x64, 0x3d, 0x7b, 0xa3, 0x99, 0xe9, 0x07, 0xab, 0x06, 0x13, 0x4d, 0x9a, 0x81, 0x0c, 0xa1, 0xd3, - 0xb1, 0x6a, 0xc7, 0x08, 0xd2, 0x04, 0xcd, 0x23, 0xa4, 0x9e, 0x06, 0xb8, 0x68, 0x5b, 0xe6, 0x56, - 0x70, 0xea, 0x70, 0x52, 0xe3, 0x52, 0xd0, 0x83, 0x29, 0xc8, 0xd1, 0x7f, 0xc8, 0x95, 0x24, 0xe4, - 0x29, 0x10, 0xbc, 0xf7, 0xee, 0x5a, 0xbc, 0x44, 0x5e, 0xc1, 0x44, 0x8b, 0xbd, 0xba, 0xba, 0x48, - 0x65, 0x40, 0x2d, 0x61, 0x56, 0x95, 0x9b, 0x21, 0x47, 0xff, 0x65, 0x5e, 0x07, 0xe1, 0xe1, 0x45, - 0x69, 0x36, 0x49, 0x3f, 0x65, 0x79, 0x99, 0x26, 0xaf, 0xcd, 0x1f, 0x4e, 0xc3, 0x64, 0x05, 0x3b, - 0xc5, 0x6d, 0xdc, 0xbc, 0x80, 0x1e, 0x2b, 0x2e, 0x80, 0xb6, 0x0d, 0x6c, 0x3a, 0xf7, 0xed, 0xb4, - 0xfd, 0x05, 0x50, 0x2f, 0x01, 0xbd, 0x80, 0xef, 0x7c, 0xef, 0x16, 0xf5, 0xe7, 0xc6, 0x3e, 0x75, - 0xf5, 0x4a, 0x08, 0x51, 0x99, 0x93, 0x90, 0xb3, 0x71, 0x77, 0xb7, 0xed, 0x2d, 0xa2, 0xb1, 0x37, - 0xf4, 0x90, 0x2f, 0xce, 0xa2, 0x20, 0xce, 0x9b, 0xe5, 0x8b, 0x18, 0x43, 0xbc, 0xd2, 0x0c, 0x4c, - 0x94, 0x4d, 0xc3, 0x31, 0xf4, 0x36, 0x7a, 0x61, 0x06, 0x66, 0x6b, 0xd8, 0x59, 0xd7, 0x6d, 0x7d, - 0x07, 0x3b, 0xd8, 0xee, 0xa2, 0xef, 0x89, 0x7d, 0x42, 0xa7, 0xad, 0x3b, 0x9b, 0x96, 0xbd, 0xe3, - 0xa9, 0xa6, 0xf7, 0xee, 0xaa, 0xe6, 0x1e, 0xb6, 0xbb, 0x01, 0x5f, 0xde, 0xab, 0xfb, 0xe5, 0xa2, - 0x65, 0x5f, 0x70, 0x07, 0x41, 0x36, 0x4d, 0x63, 0xaf, 0x2e, 0xbd, 0xb6, 0xb5, 0xb5, 0x8a, 0xf7, - 0xb0, 0x17, 0x2e, 0xcd, 0x7f, 0x77, 0xe7, 0x02, 0x2d, 0xab, 0x62, 0x39, 0x6e, 0xa7, 0xbd, 0x6a, - 0x6d, 0xd1, 0x78, 0xb1, 0x93, 0x9a, 0x98, 0x18, 0xe4, 0xd2, 0xf7, 0x30, 0xc9, 0x95, 0xe3, 0x73, - 0xb1, 0x44, 0x75, 0x1e, 0x54, 0xff, 0xb7, 0x3a, 0x6e, 0xe3, 0x1d, 0xec, 0xd8, 0x97, 0xc8, 0xb5, - 0x10, 0x93, 0x5a, 0x9f, 0x2f, 0x6c, 0x80, 0x96, 0x9f, 0xac, 0x33, 0xe9, 0xcd, 0x0b, 0x92, 0x3b, - 0xd0, 0x64, 0x5d, 0x86, 0xe2, 0x58, 0xae, 0xbd, 0x52, 0x5c, 0x6b, 0xe6, 0x95, 0x0a, 0x64, 0xc8, - 0xe0, 0xf9, 0xd6, 0x94, 0xb0, 0xc2, 0xb4, 0x83, 0xbb, 0x5d, 0x7d, 0x0b, 0x7b, 0x2b, 0x4c, 0xec, - 0x55, 0xbd, 0x0d, 0xb2, 0x6d, 0x82, 0x29, 0x1d, 0x1c, 0xae, 0x15, 0x6a, 0xe6, 0x1a, 0x18, 0x2e, - 0x2d, 0x7f, 0x24, 0x20, 0x70, 0x6b, 0xf4, 0x8f, 0x33, 0xf7, 0x40, 0x96, 0xc2, 0x3f, 0x05, 0xd9, - 0xc5, 0xd2, 0xc2, 0xc6, 0x72, 0xfe, 0x88, 0xfb, 0xe8, 0xf1, 0x37, 0x05, 0xd9, 0xa5, 0x42, 0xbd, - 0xb0, 0x9a, 0x4f, 0xbb, 0xf5, 0x28, 0x57, 0x96, 0xaa, 0x79, 0xc5, 0x4d, 0x5c, 0x2f, 0x54, 0xca, - 0xc5, 0x7c, 0x46, 0x9d, 0x86, 0x89, 0x73, 0x05, 0xad, 0x52, 0xae, 0x2c, 0xe7, 0xb3, 0xe8, 0x6f, - 0x78, 0xfc, 0x6e, 0x17, 0xf1, 0xbb, 0x2e, 0x8c, 0xa7, 0x7e, 0x90, 0xbd, 0xca, 0x87, 0xec, 0x4e, - 0x01, 0xb2, 0x1f, 0x93, 0x21, 0x32, 0x06, 0x77, 0xa6, 0x1c, 0x4c, 0xac, 0xdb, 0x56, 0x13, 0x77, - 0xbb, 0xe8, 0x57, 0xd3, 0x90, 0x2b, 0xea, 0x66, 0x13, 0xb7, 0xd1, 0x15, 0x01, 0x54, 0xd4, 0x55, - 0x34, 0xe5, 0x9f, 0x16, 0xfb, 0xc7, 0x94, 0x6c, 0xef, 0xc7, 0xe8, 0xce, 0x53, 0x9a, 0x21, 0xf2, - 0x91, 0xeb, 0xe5, 0x22, 0x49, 0x8d, 0xe1, 0x6a, 0x9c, 0x34, 0x4c, 0xb1, 0xd5, 0x80, 0xf3, 0x98, - 0x9f, 0x87, 0x7f, 0x2f, 0x25, 0x3b, 0x39, 0xf4, 0x6a, 0xe0, 0x93, 0x09, 0x91, 0x87, 0xdc, 0x44, - 0x70, 0x10, 0xb5, 0x31, 0x6c, 0x1e, 0xa6, 0x61, 0x7a, 0xc3, 0xec, 0xf6, 0x13, 0x8a, 0x7c, 0x1c, - 0x7d, 0xaf, 0x1a, 0x1c, 0xa1, 0x03, 0xc5, 0xd1, 0x1f, 0x4c, 0x2f, 0x79, 0xc1, 0x7c, 0x2f, 0x05, - 0xc7, 0x97, 0xb1, 0x89, 0x6d, 0xa3, 0x49, 0x6b, 0xe0, 0x49, 0xe2, 0x4e, 0x51, 0x12, 0x8f, 0x15, - 0x38, 0xef, 0xf7, 0x87, 0x28, 0x81, 0xd7, 0xfa, 0x12, 0xb8, 0x5b, 0x90, 0xc0, 0x4d, 0x92, 0x74, - 0xc6, 0x70, 0x1f, 0xfa, 0x14, 0xcc, 0x54, 0x2c, 0xc7, 0xd8, 0x34, 0x9a, 0xd4, 0x07, 0xed, 0x15, - 0x0a, 0x64, 0x56, 0x8d, 0xae, 0x83, 0x0a, 0x41, 0x77, 0x72, 0x0d, 0x4c, 0x1b, 0x66, 0xb3, 0xbd, - 0xdb, 0xc2, 0x1a, 0xd6, 0x69, 0xbf, 0x32, 0xa9, 0xf1, 0x49, 0xc1, 0xd6, 0xbe, 0xcb, 0x96, 0xe2, - 0x6d, 0xed, 0x7f, 0x46, 0x7a, 0x19, 0x86, 0x67, 0x81, 0x04, 0xa4, 0x0c, 0xb1, 0xbb, 0x0a, 0x30, - 0x6b, 0x72, 0x59, 0x3d, 0x83, 0xbd, 0xf7, 0x42, 0x01, 0x9e, 0x9c, 0x26, 0xfe, 0x81, 0x3e, 0x20, - 0xd5, 0x58, 0x07, 0x31, 0x14, 0x0f, 0x99, 0xa5, 0x21, 0x26, 0xc9, 0x2a, 0xcc, 0x95, 0x2b, 0xf5, - 0x92, 0x56, 0x29, 0xac, 0xb2, 0x2c, 0x0a, 0xfa, 0xb7, 0x34, 0x64, 0x35, 0xdc, 0x69, 0x5f, 0xe2, - 0x23, 0x46, 0x33, 0x47, 0xf1, 0x94, 0xef, 0x28, 0xae, 0x2e, 0x01, 0xe8, 0x4d, 0xb7, 0x60, 0x72, - 0xa5, 0x56, 0xba, 0x6f, 0x1c, 0x53, 0xa1, 0x82, 0x05, 0x3f, 0xb7, 0xc6, 0xfd, 0x89, 0x5e, 0x24, - 0xbd, 0x73, 0x24, 0x50, 0x23, 0x1c, 0x86, 0xf4, 0x09, 0x1f, 0x94, 0xda, 0xec, 0x19, 0x48, 0xee, - 0x70, 0xc4, 0xff, 0xd5, 0x34, 0x64, 0xea, 0x6e, 0x6f, 0xc9, 0x75, 0x9c, 0x7f, 0x38, 0x9c, 0x8e, - 0xbb, 0x64, 0x42, 0x74, 0xfc, 0x2e, 0x98, 0xe1, 0x35, 0x96, 0xb9, 0x4a, 0x44, 0xaa, 0xb8, 0xf0, - 0xc3, 0x30, 0x1a, 0xde, 0x87, 0x9d, 0xc3, 0x11, 0xf1, 0xa7, 0x1e, 0x07, 0xb0, 0x86, 0x77, 0xce, - 0x63, 0xbb, 0xbb, 0x6d, 0x74, 0xd0, 0xdf, 0x2a, 0x30, 0xb5, 0x8c, 0x9d, 0x9a, 0xa3, 0x3b, 0xbb, - 0xdd, 0x9e, 0xed, 0x4e, 0xd3, 0x2a, 0xea, 0xcd, 0x6d, 0xcc, 0xba, 0x23, 0xef, 0x15, 0xbd, 0x47, - 0x91, 0xf5, 0x27, 0x0a, 0xca, 0x99, 0xf7, 0xcb, 0x08, 0xc1, 0xe4, 0xf1, 0x90, 0x69, 0xe9, 0x8e, - 0xce, 0xb0, 0xb8, 0xa2, 0x07, 0x8b, 0x80, 0x90, 0x46, 0xb2, 0xa1, 0xdf, 0x4c, 0xcb, 0x38, 0x14, - 0x49, 0x94, 0x1f, 0x0f, 0x84, 0x0f, 0xa4, 0x86, 0x40, 0xe1, 0x18, 0xcc, 0x56, 0xaa, 0xf5, 0xc6, - 0x6a, 0x75, 0x79, 0xb9, 0xe4, 0xa6, 0xe6, 0x15, 0xf5, 0x24, 0xa8, 0xeb, 0x85, 0xfb, 0xd6, 0x4a, - 0x95, 0x7a, 0xa3, 0x52, 0x5d, 0x2c, 0xb1, 0x3f, 0x33, 0xea, 0x51, 0x98, 0x2e, 0x16, 0x8a, 0x2b, - 0x5e, 0x42, 0x56, 0x3d, 0x05, 0xc7, 0xd7, 0x4a, 0x6b, 0x0b, 0x25, 0xad, 0xb6, 0x52, 0x5e, 0x6f, - 0xb8, 0x64, 0x96, 0xaa, 0x1b, 0x95, 0xc5, 0x7c, 0x4e, 0x45, 0x70, 0x92, 0xfb, 0x72, 0x4e, 0xab, - 0x56, 0x96, 0x1b, 0xb5, 0x7a, 0xa1, 0x5e, 0xca, 0x4f, 0xa8, 0x97, 0xc1, 0xd1, 0x62, 0xa1, 0x42, - 0xb2, 0x17, 0xab, 0x95, 0x4a, 0xa9, 0x58, 0xcf, 0x4f, 0xa2, 0x7f, 0xcf, 0xc0, 0x74, 0xb9, 0x5b, - 0xd1, 0x77, 0xf0, 0x59, 0xbd, 0x6d, 0xb4, 0xd0, 0x0b, 0xb9, 0x99, 0xc7, 0x75, 0x30, 0x6b, 0xd3, - 0x47, 0xdc, 0xaa, 0x1b, 0x98, 0xa2, 0x39, 0xab, 0x89, 0x89, 0xee, 0x9c, 0xdc, 0x24, 0x04, 0xbc, - 0x39, 0x39, 0x7d, 0x53, 0x17, 0x00, 0xe8, 0x53, 0x3d, 0xb8, 0xdc, 0xf5, 0x4c, 0x6f, 0x6b, 0xd2, - 0x77, 0x70, 0x17, 0xdb, 0x7b, 0x46, 0x13, 0x7b, 0x39, 0x35, 0xee, 0x2f, 0xf4, 0x35, 0x45, 0x76, - 0x7f, 0x91, 0x03, 0x95, 0xab, 0x4e, 0x48, 0x6f, 0xf8, 0xf3, 0x8a, 0xcc, 0xee, 0xa0, 0x14, 0xc9, - 0x78, 0x9a, 0xf2, 0x92, 0xf4, 0x70, 0xcb, 0xb6, 0xf5, 0x6a, 0xb5, 0x51, 0x5b, 0xa9, 0x6a, 0xf5, - 0xbc, 0xa2, 0xce, 0xc0, 0xa4, 0xfb, 0xba, 0x5a, 0xad, 0x2c, 0xe7, 0x33, 0xea, 0x09, 0x38, 0xb6, - 0x52, 0xa8, 0x35, 0xca, 0x95, 0xb3, 0x85, 0xd5, 0xf2, 0x62, 0xa3, 0xb8, 0x52, 0xd0, 0x6a, 0xf9, - 0xac, 0x7a, 0x05, 0x9c, 0xa8, 0x97, 0x4b, 0x5a, 0x63, 0xa9, 0x54, 0xa8, 0x6f, 0x68, 0xa5, 0x5a, - 0xa3, 0x52, 0x6d, 0x54, 0x0a, 0x6b, 0xa5, 0x7c, 0xce, 0x6d, 0xfe, 0xe4, 0x53, 0xa0, 0x36, 0x13, - 0xfb, 0x95, 0x71, 0x32, 0x44, 0x19, 0xa7, 0x7a, 0x95, 0x11, 0x78, 0xb5, 0xd2, 0x4a, 0xb5, 0x92, - 0x76, 0xb6, 0x94, 0x9f, 0xee, 0xa7, 0x6b, 0x33, 0xea, 0x71, 0xc8, 0xbb, 0x3c, 0x34, 0xca, 0x35, - 0x2f, 0xe7, 0x62, 0x7e, 0x16, 0x7d, 0x32, 0x07, 0x27, 0x35, 0xbc, 0x65, 0x74, 0x1d, 0x6c, 0xaf, - 0xeb, 0x97, 0x76, 0xb0, 0xe9, 0x78, 0x9d, 0xfc, 0xff, 0x8a, 0xad, 0x8c, 0x6b, 0x30, 0xdb, 0xa1, - 0x34, 0xd6, 0xb0, 0xb3, 0x6d, 0xb5, 0xd8, 0x28, 0xfc, 0xd8, 0xd0, 0x9e, 0x63, 0x7e, 0x9d, 0xcf, - 0xae, 0x89, 0x7f, 0x73, 0xba, 0xad, 0x44, 0xe8, 0x76, 0x66, 0x18, 0xdd, 0x56, 0xaf, 0x82, 0xa9, - 0xdd, 0x2e, 0xb6, 0x4b, 0x3b, 0xba, 0xd1, 0xf6, 0x2e, 0xe7, 0xf4, 0x13, 0xd0, 0x3b, 0x33, 0xb2, - 0x27, 0x56, 0xb8, 0xba, 0xf4, 0x17, 0x63, 0x48, 0xdf, 0x7a, 0x1a, 0x80, 0x55, 0x76, 0xc3, 0x6e, - 0x33, 0x65, 0xe5, 0x52, 0x5c, 0xfe, 0xce, 0x1b, 0xed, 0xb6, 0x61, 0x6e, 0xf9, 0xfb, 0xfe, 0x41, - 0x02, 0x7a, 0x89, 0x22, 0x73, 0x82, 0x25, 0x2e, 0x6f, 0xf1, 0x5a, 0xd3, 0x8b, 0xd2, 0x63, 0xee, - 0x77, 0xf7, 0x37, 0x9d, 0x9c, 0x9a, 0x87, 0x19, 0x92, 0xc6, 0x5a, 0x60, 0x7e, 0xc2, 0xed, 0x83, - 0x3d, 0x72, 0x6b, 0xa5, 0xfa, 0x4a, 0x75, 0xd1, 0xff, 0x36, 0xe9, 0x92, 0x74, 0x99, 0x29, 0x54, - 0xee, 0x23, 0xad, 0x71, 0x4a, 0x7d, 0x14, 0x5c, 0xc1, 0x75, 0xd8, 0x85, 0x55, 0xad, 0x54, 0x58, - 0xbc, 0xaf, 0x51, 0x7a, 0x66, 0xb9, 0x56, 0xaf, 0x89, 0x8d, 0xcb, 0x6b, 0x47, 0xd3, 0x2e, 0xbf, - 0xa5, 0xb5, 0x42, 0x79, 0x95, 0xf5, 0xef, 0x4b, 0x55, 0x6d, 0xad, 0x50, 0xcf, 0xcf, 0xa0, 0x57, - 0x2a, 0x90, 0x5f, 0xc6, 0xce, 0xba, 0x65, 0x3b, 0x7a, 0x7b, 0xd5, 0x30, 0x2f, 0x6c, 0xd8, 0x6d, - 0x61, 0xb2, 0x29, 0x1d, 0xa6, 0x43, 0x1c, 0x22, 0x05, 0x82, 0xe1, 0x3b, 0xe2, 0x1d, 0x92, 0x2d, - 0x50, 0xa6, 0x20, 0x01, 0x3d, 0x3b, 0x2d, 0xb3, 0xdc, 0x2d, 0x5f, 0x6a, 0x3c, 0x3d, 0x79, 0xce, - 0xb8, 0xc7, 0xe7, 0x3e, 0xa8, 0xe5, 0xd0, 0xf3, 0x33, 0x30, 0xb9, 0x64, 0x98, 0x7a, 0xdb, 0x78, - 0x96, 0x10, 0xbf, 0x34, 0xe8, 0x63, 0x52, 0x11, 0x7d, 0x4c, 0x7a, 0xa8, 0xf1, 0xf3, 0x97, 0x15, - 0xd9, 0xe5, 0x05, 0x4e, 0xf6, 0x1e, 0x93, 0x21, 0x83, 0xe7, 0x47, 0xd2, 0x32, 0xcb, 0x0b, 0x83, - 0xe9, 0xc5, 0xc3, 0xf0, 0xd3, 0x3f, 0x1c, 0x36, 0x56, 0x4f, 0xfb, 0x9e, 0xec, 0xa7, 0x0a, 0x53, - 0xe8, 0x4f, 0x15, 0x40, 0xcb, 0xd8, 0x39, 0x8b, 0x6d, 0x7f, 0x2a, 0x40, 0x7a, 0x7d, 0x66, 0x6f, - 0x73, 0x4d, 0xf6, 0xad, 0x3c, 0x80, 0xe7, 0x44, 0x00, 0x0b, 0x11, 0x8d, 0x27, 0x84, 0x74, 0x48, - 0xe3, 0x2d, 0x43, 0xae, 0x4b, 0xbe, 0x33, 0x35, 0x7b, 0x42, 0xf8, 0x70, 0x49, 0x88, 0xf1, 0xd4, - 0x29, 0x61, 0x8d, 0x11, 0x40, 0xdf, 0xf7, 0x27, 0x41, 0x3f, 0x21, 0x68, 0xc7, 0xd2, 0x81, 0x99, - 0x8d, 0xa7, 0x2f, 0x76, 0xb2, 0xea, 0xd2, 0xcf, 0xbe, 0x41, 0x1f, 0xc9, 0xc2, 0xf1, 0x7e, 0xd5, - 0x41, 0xbf, 0x95, 0x12, 0x76, 0xd8, 0x31, 0x19, 0xf2, 0x53, 0x6c, 0x03, 0xd1, 0x7d, 0x51, 0x9f, - 0x04, 0x27, 0xfc, 0x65, 0xb8, 0xba, 0x55, 0xc1, 0x17, 0xbb, 0x6d, 0xec, 0x38, 0xd8, 0x26, 0x55, - 0x9b, 0xd4, 0xfa, 0x7f, 0x54, 0x9f, 0x0a, 0x97, 0x1b, 0x66, 0xd7, 0x68, 0x61, 0xbb, 0x6e, 0x74, - 0xba, 0x05, 0xb3, 0x55, 0xdf, 0x75, 0x2c, 0xdb, 0xd0, 0xd9, 0x55, 0x92, 0x93, 0x5a, 0xd8, 0x67, - 0xf5, 0x46, 0xc8, 0x1b, 0xdd, 0xaa, 0x79, 0xde, 0xd2, 0xed, 0x96, 0x61, 0x6e, 0xad, 0x1a, 0x5d, - 0x87, 0x79, 0x00, 0xef, 0x4b, 0x47, 0x7f, 0xa7, 0xc8, 0x1e, 0xa6, 0x1b, 0x00, 0x6b, 0x48, 0x87, - 0xf2, 0x02, 0x45, 0xe6, 0x78, 0x5c, 0x3c, 0xda, 0xf1, 0x94, 0xe5, 0x79, 0xe3, 0x36, 0x24, 0xfa, - 0x8f, 0xe0, 0xa4, 0x6b, 0xa1, 0xe9, 0x9e, 0x21, 0x70, 0xb6, 0xa4, 0x95, 0x97, 0xca, 0x25, 0xd7, - 0xac, 0x38, 0x01, 0xc7, 0x82, 0x6f, 0x8b, 0xf7, 0x35, 0x6a, 0xa5, 0x4a, 0x3d, 0x3f, 0xe9, 0xf6, - 0x53, 0x34, 0x79, 0xa9, 0x50, 0x5e, 0x2d, 0x2d, 0x36, 0xea, 0x55, 0xf7, 0xcb, 0xe2, 0x70, 0xa6, - 0x05, 0x7a, 0x30, 0x03, 0x47, 0x89, 0x6c, 0x2f, 0x11, 0xa9, 0xba, 0x42, 0xe9, 0xf1, 0xb5, 0xf5, - 0x01, 0x9a, 0xa2, 0xe2, 0x45, 0x9f, 0x93, 0xbe, 0x29, 0x93, 0x83, 0xb0, 0xa7, 0x8c, 0x10, 0xcd, - 0xf8, 0x5e, 0x5a, 0x26, 0x42, 0x85, 0x34, 0xd9, 0x78, 0x4a, 0xf1, 0x2f, 0xe3, 0x1e, 0x71, 0xc2, - 0xc1, 0x27, 0x56, 0x66, 0x91, 0xfc, 0xfc, 0xcc, 0xf5, 0xb2, 0x46, 0xd4, 0x61, 0x0e, 0x80, 0xa4, - 0x10, 0x0d, 0xa2, 0x7a, 0xd0, 0x77, 0xbc, 0x0a, 0xd3, 0x83, 0x42, 0xb1, 0x5e, 0x3e, 0x5b, 0x0a, - 0xd3, 0x83, 0xcf, 0x2a, 0x30, 0xb9, 0x8c, 0x1d, 0x77, 0x4e, 0xd5, 0x45, 0x4f, 0x93, 0x58, 0xff, - 0x71, 0xcd, 0x98, 0xb6, 0xd5, 0xd4, 0xdb, 0xfe, 0x32, 0x00, 0x7d, 0x43, 0xcf, 0x1d, 0xc6, 0x04, - 0xf1, 0x8a, 0x0e, 0x19, 0xaf, 0x9e, 0x02, 0x59, 0xc7, 0xfd, 0xcc, 0x96, 0xa1, 0x1f, 0x1d, 0x3a, - 0x5c, 0xb9, 0x44, 0x16, 0x75, 0x47, 0xd7, 0x68, 0x7e, 0x6e, 0x74, 0x92, 0xb4, 0x5d, 0x42, 0x18, - 0xf9, 0x61, 0xb4, 0x3f, 0xff, 0x46, 0x81, 0x13, 0xb4, 0x7d, 0x14, 0x3a, 0x9d, 0x9a, 0x63, 0xd9, - 0x58, 0xc3, 0x4d, 0x6c, 0x74, 0x9c, 0x9e, 0xf5, 0x3d, 0x9b, 0xa6, 0x7a, 0x9b, 0xcd, 0xec, 0x15, - 0xbd, 0x49, 0x91, 0x8d, 0xc1, 0xbc, 0xaf, 0x3d, 0xf6, 0x94, 0x17, 0xd2, 0xd8, 0x3f, 0x91, 0x96, - 0x89, 0xaa, 0x1c, 0x93, 0x78, 0x3c, 0xa0, 0x3e, 0x7a, 0x08, 0x40, 0x79, 0x2b, 0x37, 0x5a, 0xa9, - 0x58, 0x2a, 0xaf, 0xbb, 0x83, 0xc0, 0xd5, 0x70, 0xe5, 0xfa, 0x86, 0x56, 0x5c, 0x29, 0xd4, 0x4a, - 0x0d, 0xad, 0xb4, 0x5c, 0xae, 0xd5, 0x99, 0x53, 0x16, 0xfd, 0x6b, 0x42, 0xbd, 0x0a, 0x4e, 0xd5, - 0x36, 0x16, 0x6a, 0x45, 0xad, 0xbc, 0x4e, 0xd2, 0xb5, 0x52, 0xa5, 0x74, 0x8e, 0x7d, 0x9d, 0x44, - 0x1f, 0xca, 0xc3, 0xb4, 0x3b, 0x01, 0xa8, 0xd1, 0x79, 0x01, 0xfa, 0x76, 0x06, 0xa6, 0x35, 0xdc, - 0xb5, 0xda, 0x7b, 0x64, 0x8e, 0x30, 0xae, 0xa9, 0xc7, 0x77, 0x15, 0xd9, 0xf3, 0xdb, 0x1c, 0xb3, - 0xf3, 0x1c, 0xa3, 0xe1, 0x13, 0x4d, 0x7d, 0x4f, 0x37, 0xda, 0xfa, 0x79, 0xd6, 0xd5, 0x4c, 0x6a, - 0x41, 0x82, 0x3a, 0x0f, 0xaa, 0x75, 0xd1, 0xc4, 0x76, 0xad, 0x79, 0xb1, 0xe4, 0x6c, 0x17, 0x5a, - 0x2d, 0x1b, 0x77, 0xbb, 0x6c, 0xf5, 0xa2, 0xcf, 0x17, 0xf5, 0x06, 0x38, 0x4a, 0x52, 0xb9, 0xcc, - 0xd4, 0x41, 0xa6, 0x37, 0xd9, 0xcf, 0x59, 0x30, 0x2f, 0x79, 0x39, 0xb3, 0x5c, 0xce, 0x20, 0x99, - 0x3f, 0x2e, 0x91, 0x13, 0x4f, 0xe9, 0x5c, 0x03, 0xd3, 0xa6, 0xbe, 0x83, 0x4b, 0x0f, 0x74, 0x0c, - 0x1b, 0x77, 0x89, 0x63, 0x8c, 0xa2, 0xf1, 0x49, 0xe8, 0x23, 0x52, 0xe7, 0xcd, 0xe5, 0x24, 0x16, - 0x4f, 0xf7, 0x97, 0x87, 0x50, 0xfd, 0x3e, 0xfd, 0x8c, 0x82, 0x3e, 0xa4, 0xc0, 0x0c, 0x63, 0xaa, - 0x60, 0x5e, 0x2a, 0xb7, 0xd0, 0xd5, 0x82, 0xf1, 0xab, 0xbb, 0x69, 0x9e, 0xf1, 0x4b, 0x5e, 0xd0, - 0x2f, 0x28, 0xb2, 0xee, 0xce, 0x7d, 0x2a, 0x4e, 0xca, 0x08, 0x77, 0x1c, 0xdd, 0xb4, 0x76, 0x99, - 0xa3, 0xea, 0xa4, 0x46, 0x5f, 0x92, 0x5c, 0xd4, 0x43, 0xbf, 0x2b, 0xe5, 0x4c, 0x2d, 0x59, 0x8d, - 0x43, 0x02, 0xf0, 0x53, 0x0a, 0xcc, 0x31, 0xae, 0x6a, 0xec, 0x9c, 0x8f, 0xd4, 0x81, 0xb7, 0x5f, - 0x94, 0x36, 0x04, 0xfb, 0xd4, 0x9f, 0x95, 0xf4, 0x88, 0x01, 0xf2, 0x63, 0x52, 0xc1, 0xd1, 0xa4, - 0x2b, 0x72, 0x48, 0x50, 0xbe, 0x2b, 0x03, 0xd3, 0x1b, 0x5d, 0x6c, 0x33, 0xbf, 0x7d, 0xf4, 0x50, - 0x06, 0x94, 0x65, 0x2c, 0x6c, 0xa4, 0xbe, 0x58, 0xda, 0xc3, 0x97, 0xaf, 0x2c, 0x47, 0xd4, 0xb5, - 0x91, 0x42, 0x60, 0xbb, 0x1e, 0xe6, 0xa8, 0x48, 0x0b, 0x8e, 0xe3, 0x1a, 0x89, 0x9e, 0x37, 0x6d, - 0x4f, 0xea, 0x28, 0xb6, 0x8a, 0x48, 0x59, 0x6e, 0x96, 0xa2, 0xcb, 0xd3, 0x2a, 0xde, 0xa4, 0xf3, - 0xd9, 0x8c, 0xd6, 0x93, 0xaa, 0xde, 0x02, 0x97, 0x59, 0x1d, 0x4c, 0xcf, 0xaf, 0x70, 0x99, 0xb3, - 0x24, 0x73, 0xbf, 0x4f, 0xe8, 0xdb, 0x52, 0xbe, 0xba, 0xf2, 0xd2, 0x89, 0xa7, 0x0b, 0x9d, 0xd1, - 0x98, 0x24, 0xc7, 0x21, 0xef, 0xe6, 0x20, 0xfb, 0x2f, 0x5a, 0xa9, 0x56, 0x5d, 0x3d, 0x5b, 0xea, - 0xbf, 0x8c, 0x91, 0x45, 0xcf, 0x53, 0x60, 0x6a, 0xc1, 0xb6, 0xf4, 0x56, 0x53, 0xef, 0x3a, 0xe8, - 0xfb, 0x69, 0x98, 0x59, 0xd7, 0x2f, 0xb5, 0x2d, 0xbd, 0x45, 0xfc, 0xfb, 0x7b, 0xfa, 0x82, 0x0e, - 0xfd, 0xe4, 0xf5, 0x05, 0xec, 0x55, 0x3c, 0x18, 0xe8, 0x1f, 0xdd, 0x4b, 0xc9, 0x5c, 0xa8, 0xe9, - 0x6f, 0xf3, 0xa5, 0xfb, 0x05, 0x2b, 0xf5, 0xf8, 0x9a, 0xe7, 0x79, 0x0a, 0xb1, 0x28, 0x3f, 0x24, - 0x17, 0x7e, 0x54, 0x86, 0xe4, 0xe1, 0xec, 0xca, 0x3f, 0x7f, 0x12, 0x72, 0x8b, 0x98, 0x58, 0x71, - 0xff, 0x23, 0x0d, 0x13, 0x35, 0xec, 0x10, 0x0b, 0xee, 0x36, 0xc1, 0x53, 0xb8, 0x45, 0x32, 0x04, - 0x4e, 0xec, 0xde, 0xbb, 0x3b, 0x59, 0xe7, 0xce, 0x5b, 0x93, 0xe7, 0x18, 0x1e, 0x89, 0xb4, 0xdc, - 0x79, 0x56, 0xe6, 0x81, 0x3c, 0x12, 0x23, 0x49, 0x25, 0xef, 0x6b, 0xf5, 0x9e, 0x34, 0x73, 0xad, - 0xe2, 0x7a, 0xbd, 0xd7, 0xf1, 0xfa, 0x19, 0xe9, 0x6d, 0xc6, 0x98, 0x8f, 0x70, 0x8e, 0x7a, 0x22, - 0x4c, 0x50, 0x99, 0x7b, 0xf3, 0xd1, 0x5e, 0x3f, 0x05, 0x4a, 0x82, 0x9c, 0xbd, 0xf6, 0x72, 0x4a, - 0xba, 0xa8, 0x85, 0x17, 0x3e, 0x96, 0x18, 0x04, 0x33, 0x15, 0xec, 0x5c, 0xb4, 0xec, 0x0b, 0x35, - 0x47, 0x77, 0x30, 0xfa, 0x97, 0x34, 0x28, 0x35, 0xec, 0xf0, 0xd1, 0x4f, 0x2a, 0x70, 0x8c, 0x56, - 0x88, 0x65, 0x24, 0xfd, 0x37, 0xad, 0xc8, 0x35, 0x7d, 0x85, 0xc0, 0xe5, 0xd3, 0xf6, 0xff, 0x8a, - 0x7e, 0xb5, 0x6f, 0xd0, 0xa7, 0x74, 0x9f, 0x49, 0x03, 0x93, 0x0c, 0xcf, 0xa0, 0xab, 0x60, 0x21, - 0x7a, 0xfa, 0x61, 0x29, 0xb3, 0x5a, 0x8e, 0xe6, 0xe1, 0x74, 0x05, 0x1f, 0xbb, 0x02, 0x32, 0xc5, - 0x6d, 0xdd, 0x41, 0xef, 0x56, 0x00, 0x0a, 0xad, 0xd6, 0x1a, 0xf5, 0x01, 0xe7, 0x1d, 0xd2, 0xce, - 0xc0, 0x4c, 0x73, 0x5b, 0x0f, 0xee, 0x36, 0xa1, 0xfd, 0x81, 0x90, 0xa6, 0x3e, 0x29, 0x70, 0x26, - 0xa7, 0x52, 0x45, 0x3d, 0x30, 0xb9, 0x65, 0x30, 0xda, 0xbe, 0xa3, 0xb9, 0x18, 0x0a, 0x33, 0xf2, - 0x08, 0x9d, 0xfb, 0xfb, 0x7c, 0xc0, 0x5e, 0xf8, 0x1c, 0x8e, 0x91, 0xf6, 0x0f, 0xd8, 0x04, 0x09, - 0x31, 0x4f, 0x7a, 0xcb, 0x05, 0xf4, 0x88, 0xe6, 0x6b, 0x2c, 0xa1, 0x6b, 0xd5, 0x52, 0xcb, 0xf0, - 0x44, 0xcb, 0x02, 0x66, 0xa1, 0x17, 0xa5, 0xe2, 0xc1, 0x17, 0x2d, 0xb8, 0xbb, 0x61, 0x16, 0xb7, - 0x0c, 0x07, 0x7b, 0xb5, 0x64, 0x02, 0x8c, 0x82, 0x58, 0xfc, 0x01, 0x3d, 0x47, 0x3a, 0xe8, 0x1a, - 0x11, 0xe8, 0xfe, 0x1a, 0x85, 0xb4, 0x3f, 0xb9, 0x30, 0x6a, 0x72, 0x34, 0x93, 0x07, 0xeb, 0xb9, - 0x0a, 0x9c, 0xa8, 0x5b, 0x5b, 0x5b, 0x6d, 0xec, 0x89, 0x09, 0x53, 0xef, 0x4c, 0xa4, 0x8f, 0x12, - 0x2e, 0xb2, 0x13, 0x64, 0xdd, 0x6f, 0xf8, 0x47, 0xc9, 0xdc, 0x17, 0xf1, 0xc4, 0x54, 0xe4, 0x2c, - 0x8a, 0x88, 0xab, 0x2f, 0x9f, 0x21, 0x28, 0xc8, 0x05, 0x7c, 0x96, 0x26, 0x9b, 0x3c, 0x10, 0x5f, - 0x4a, 0xc3, 0x2c, 0xbd, 0xb9, 0xd2, 0x53, 0xd0, 0x7b, 0x47, 0x08, 0x00, 0xfa, 0x7e, 0x4a, 0xd6, - 0xcf, 0x96, 0xc8, 0x44, 0xe0, 0x24, 0x44, 0xc4, 0x72, 0x41, 0x55, 0x06, 0x92, 0x4b, 0x5e, 0xb4, - 0x7f, 0xa4, 0xc0, 0xf4, 0x32, 0xf6, 0x5a, 0x5a, 0x37, 0x76, 0x4f, 0x74, 0x06, 0x66, 0xc8, 0xf5, - 0x6d, 0x55, 0x76, 0x4c, 0x92, 0xae, 0x9a, 0x09, 0x69, 0xea, 0x75, 0x30, 0x7b, 0x1e, 0x6f, 0x5a, - 0x36, 0xae, 0x0a, 0x67, 0x29, 0xc5, 0xc4, 0x90, 0xf0, 0x74, 0x42, 0x1c, 0xb4, 0x05, 0x11, 0x9b, - 0x9b, 0xf6, 0x0b, 0x93, 0xab, 0x4a, 0xc8, 0x98, 0xf3, 0x64, 0x98, 0x64, 0xc8, 0x7b, 0x66, 0x5a, - 0x54, 0xbf, 0xe8, 0xe7, 0x45, 0x6f, 0xf4, 0x11, 0x2d, 0x09, 0x88, 0x3e, 0x21, 0x0e, 0x13, 0x63, - 0xb9, 0xdf, 0x3d, 0xcf, 0x95, 0xbf, 0x70, 0xa9, 0xdc, 0xea, 0xa2, 0xb5, 0x78, 0x98, 0x9e, 0x06, - 0xf0, 0x1b, 0x87, 0x17, 0xd6, 0x82, 0x4b, 0x11, 0x23, 0xd7, 0x47, 0x1e, 0xd4, 0xeb, 0x15, 0x07, - 0x61, 0x67, 0xc4, 0xc0, 0xc8, 0x1d, 0xf0, 0x93, 0xe1, 0x24, 0x79, 0x74, 0x3e, 0xa3, 0xc0, 0x09, - 0xff, 0xfc, 0xd1, 0xaa, 0xde, 0x0d, 0xda, 0x5d, 0x31, 0x1e, 0x44, 0xc2, 0x81, 0x0f, 0xbf, 0xb1, - 0x7c, 0x27, 0xde, 0x98, 0xd1, 0x97, 0x93, 0xd1, 0xa2, 0xa3, 0xde, 0x04, 0xc7, 0xcc, 0xdd, 0x1d, - 0x5f, 0xea, 0xa4, 0xc5, 0xb3, 0x16, 0xbe, 0xff, 0x43, 0x9c, 0x91, 0x49, 0x86, 0xf9, 0xb1, 0xcc, - 0x29, 0x85, 0x23, 0x5d, 0x8f, 0x8f, 0x05, 0x23, 0xfa, 0xe7, 0x54, 0xac, 0xde, 0x6d, 0xf0, 0x99, - 0xaf, 0x18, 0xbd, 0xd4, 0x21, 0x1e, 0xf8, 0x3a, 0x33, 0x01, 0xd9, 0xd2, 0x4e, 0xc7, 0xb9, 0x74, - 0xe6, 0x31, 0x30, 0x5b, 0x73, 0x6c, 0xac, 0xef, 0x70, 0x3b, 0x03, 0x8e, 0x75, 0x01, 0x9b, 0xde, - 0xce, 0x00, 0x79, 0xb9, 0xfd, 0x36, 0x98, 0x30, 0xad, 0x86, 0xbe, 0xeb, 0x6c, 0xab, 0x57, 0xef, - 0x3b, 0x52, 0xcf, 0xc0, 0xaf, 0xb2, 0x18, 0x46, 0x5f, 0xbb, 0x83, 0xac, 0x0d, 0xe7, 0x4c, 0xab, - 0xb0, 0xeb, 0x6c, 0x2f, 0x5c, 0xf5, 0xa9, 0xbf, 0x3e, 0x9d, 0xfa, 0xec, 0x5f, 0x9f, 0x4e, 0x7d, - 0xf5, 0xaf, 0x4f, 0xa7, 0x7e, 0xf1, 0xeb, 0xa7, 0x8f, 0x7c, 0xf6, 0xeb, 0xa7, 0x8f, 0x7c, 0xe9, - 0xeb, 0xa7, 0x8f, 0xfc, 0x44, 0xba, 0x73, 0xfe, 0x7c, 0x8e, 0x50, 0x79, 0xe2, 0xff, 0x17, 0x00, - 0x00, 0xff, 0xff, 0xd2, 0xcb, 0x15, 0x81, 0xce, 0xfe, 0x01, 0x00, + 0xea, 0xce, 0x93, 0x77, 0x65, 0x42, 0x37, 0x2f, 0x39, 0x97, 0x3a, 0x18, 0x5d, 0xd7, 0xb9, 0xb0, + 0x75, 0x73, 0xdb, 0x38, 0x7f, 0x73, 0xe7, 0xfc, 0xcd, 0x3b, 0x56, 0x0b, 0xb7, 0xfd, 0x1f, 0xc8, + 0x0b, 0xcd, 0x8e, 0x6e, 0x88, 0xca, 0xd5, 0xb6, 0x9a, 0x7a, 0xbb, 0xeb, 0x58, 0x36, 0xa6, 0x39, + 0x4f, 0x86, 0x45, 0xe2, 0x3d, 0x6c, 0x3a, 0x3e, 0x85, 0xab, 0xb6, 0x2c, 0x6b, 0xab, 0x8d, 0xbd, + 0x6f, 0xe7, 0x77, 0x37, 0x6f, 0xee, 0x3a, 0xf6, 0x6e, 0xd3, 0xa1, 0x5f, 0xaf, 0xe9, 0xfd, 0xda, + 0xc2, 0xdd, 0xa6, 0x6d, 0x74, 0x1c, 0xcb, 0xf6, 0x72, 0x9c, 0xf9, 0xea, 0x0f, 0x27, 0x40, 0xd6, + 0x3a, 0x4d, 0xf4, 0xdd, 0x09, 0x90, 0x8b, 0x9d, 0x0e, 0xfa, 0xb8, 0x04, 0xb0, 0x8c, 0x9d, 0xb3, + 0xd8, 0xee, 0x1a, 0x96, 0x89, 0x8e, 0xc2, 0x84, 0x86, 0x7f, 0x6e, 0x17, 0x77, 0x9d, 0xdb, 0xb3, + 0xcf, 0xfd, 0xa6, 0x9c, 0x41, 0x0f, 0x4b, 0x30, 0xa9, 0xe1, 0x6e, 0xc7, 0x32, 0xbb, 0x58, 0xb9, + 0x1b, 0x72, 0xd8, 0xb6, 0x2d, 0xfb, 0x54, 0xe6, 0x9a, 0xcc, 0x0d, 0xd3, 0xb7, 0xde, 0x38, 0x4f, + 0xab, 0x3f, 0xaf, 0x75, 0x9a, 0xf3, 0xc5, 0x4e, 0x67, 0x3e, 0xa4, 0x34, 0xef, 0xff, 0x34, 0xaf, + 0xba, 0x7f, 0x68, 0xde, 0x8f, 0xca, 0x29, 0x98, 0xd8, 0xf3, 0x32, 0x9c, 0x92, 0xae, 0xc9, 0xdc, + 0x30, 0xa5, 0xf9, 0xaf, 0xee, 0x97, 0x16, 0x76, 0x74, 0xa3, 0xdd, 0x3d, 0x25, 0x7b, 0x5f, 0xe8, + 0x2b, 0x7a, 0x28, 0x03, 0x39, 0x42, 0x44, 0x29, 0x41, 0xb6, 0x69, 0xb5, 0x30, 0x29, 0x7e, 0xee, + 0xd6, 0x9b, 0xc5, 0x8b, 0x9f, 0x2f, 0x59, 0x2d, 0xac, 0x91, 0x9f, 0x95, 0x6b, 0x60, 0xda, 0x17, + 0x4b, 0xc8, 0x06, 0x9b, 0x74, 0xe6, 0x56, 0xc8, 0xba, 0xf9, 0x95, 0x49, 0xc8, 0x56, 0x36, 0x56, + 0x57, 0x0b, 0x47, 0x94, 0x63, 0x30, 0xbb, 0x51, 0xb9, 0xb7, 0x52, 0x3d, 0x57, 0x69, 0xa8, 0x9a, + 0x56, 0xd5, 0x0a, 0x19, 0x65, 0x16, 0xa6, 0x16, 0x8a, 0x8b, 0x8d, 0x72, 0x65, 0x7d, 0xa3, 0x5e, + 0x90, 0xd0, 0xab, 0x64, 0x98, 0xab, 0x61, 0x67, 0x11, 0xef, 0x19, 0x4d, 0x5c, 0x73, 0x74, 0x07, + 0xa3, 0x17, 0x66, 0x02, 0x61, 0x2a, 0x1b, 0x6e, 0xa1, 0xc1, 0x27, 0x5a, 0x81, 0x27, 0xec, 0xab, + 0x00, 0x4f, 0x61, 0x9e, 0xfe, 0x3d, 0xcf, 0xa4, 0x69, 0x2c, 0x9d, 0x33, 0x8f, 0x83, 0x69, 0xe6, + 0x9b, 0x32, 0x07, 0xb0, 0x50, 0x2c, 0xdd, 0xbb, 0xac, 0x55, 0x37, 0x2a, 0x8b, 0x85, 0x23, 0xee, + 0xfb, 0x52, 0x55, 0x53, 0xe9, 0x7b, 0x06, 0x7d, 0x3f, 0xc3, 0x80, 0xb9, 0xc8, 0x83, 0x39, 0x3f, + 0x98, 0x99, 0x3e, 0x80, 0xa2, 0x37, 0x04, 0xe0, 0x2c, 0x73, 0xe0, 0x3c, 0x21, 0x19, 0xb9, 0xf4, + 0x01, 0x7a, 0x50, 0x82, 0xc9, 0xda, 0xf6, 0xae, 0xd3, 0xb2, 0x2e, 0x9a, 0x68, 0x2a, 0x40, 0x06, + 0x7d, 0x9b, 0x95, 0xc9, 0x53, 0x79, 0x99, 0xdc, 0xb0, 0xbf, 0x12, 0x94, 0x42, 0x84, 0x34, 0x5e, + 0x13, 0x48, 0xa3, 0xc8, 0x49, 0xe3, 0x71, 0xa2, 0x84, 0xd2, 0x97, 0xc3, 0xcb, 0x9e, 0x0c, 0xb9, + 0x5a, 0x47, 0x6f, 0x62, 0xf4, 0xc7, 0x32, 0xcc, 0xac, 0x62, 0x7d, 0x0f, 0x17, 0x3b, 0x1d, 0xdb, + 0xda, 0xc3, 0xa8, 0x14, 0xea, 0xeb, 0x29, 0x98, 0xe8, 0xba, 0x99, 0xca, 0x2d, 0x52, 0x83, 0x29, + 0xcd, 0x7f, 0x55, 0x4e, 0x03, 0x18, 0x2d, 0x6c, 0x3a, 0x86, 0x63, 0xe0, 0xee, 0x29, 0xe9, 0x1a, + 0xf9, 0x86, 0x29, 0x8d, 0x49, 0x41, 0xdf, 0x95, 0x44, 0x75, 0x8c, 0x70, 0x31, 0xcf, 0x72, 0x10, + 0x21, 0xd5, 0xd7, 0x49, 0x22, 0x3a, 0x36, 0x90, 0x5c, 0x32, 0xd9, 0xbe, 0x35, 0x93, 0x5c, 0xb8, + 0x6e, 0x8e, 0x4a, 0xb5, 0x51, 0xdb, 0x28, 0xad, 0x34, 0x6a, 0xeb, 0xc5, 0x92, 0x5a, 0xc0, 0xca, + 0x71, 0x28, 0x90, 0xc7, 0x46, 0xb9, 0xd6, 0x58, 0x54, 0x57, 0xd5, 0xba, 0xba, 0x58, 0xd8, 0x54, + 0x14, 0x98, 0xd3, 0xd4, 0xa7, 0x6d, 0xa8, 0xb5, 0x7a, 0x63, 0xa9, 0x58, 0x5e, 0x55, 0x17, 0x0b, + 0x5b, 0xee, 0xcf, 0xab, 0xe5, 0xb5, 0x72, 0xbd, 0xa1, 0xa9, 0xc5, 0xd2, 0x8a, 0xba, 0x58, 0xd8, + 0x56, 0x2e, 0x87, 0xcb, 0x2a, 0xd5, 0x46, 0x71, 0x7d, 0x5d, 0xab, 0x9e, 0x55, 0x1b, 0xf4, 0x8f, + 0x5a, 0xc1, 0xf0, 0x0a, 0xaa, 0x37, 0x6a, 0x2b, 0x45, 0x4d, 0x2d, 0x2e, 0xac, 0xaa, 0x85, 0xfb, + 0xd1, 0xb3, 0x64, 0x98, 0x5d, 0xd3, 0x2f, 0xe0, 0xda, 0xb6, 0x6e, 0x63, 0xfd, 0x7c, 0x1b, 0xa3, + 0x6b, 0x05, 0xf0, 0x44, 0x7f, 0xcc, 0xe2, 0xa5, 0xf2, 0x78, 0xdd, 0xdc, 0x47, 0xc0, 0x5c, 0x11, + 0x11, 0x80, 0xfd, 0xaf, 0xa0, 0x19, 0xac, 0x70, 0x80, 0x3d, 0x31, 0x21, 0xbd, 0x64, 0x88, 0xfd, + 0xc2, 0x23, 0x00, 0x31, 0xf4, 0x15, 0x19, 0xe6, 0xca, 0xe6, 0x9e, 0xe1, 0xe0, 0x65, 0x6c, 0x62, + 0xdb, 0x1d, 0x07, 0x84, 0x60, 0x78, 0x58, 0x66, 0x60, 0x58, 0xe2, 0x61, 0xb8, 0xa5, 0x8f, 0xd8, + 0xf8, 0x32, 0x22, 0x46, 0xdb, 0xab, 0x60, 0xca, 0x20, 0xf9, 0x4a, 0x46, 0x8b, 0x4a, 0x2c, 0x4c, + 0x50, 0xae, 0x83, 0x59, 0xef, 0x65, 0xc9, 0x68, 0xe3, 0x7b, 0xf1, 0x25, 0x3a, 0xee, 0xf2, 0x89, + 0xe8, 0x97, 0x83, 0xc6, 0x57, 0xe6, 0xb0, 0xfc, 0xa9, 0xa4, 0x4c, 0x25, 0x03, 0xf3, 0x25, 0x8f, + 0x84, 0xe6, 0xb7, 0xaf, 0x95, 0x19, 0xe8, 0x07, 0x12, 0x4c, 0xd7, 0x1c, 0xab, 0xe3, 0xaa, 0xac, + 0x61, 0x6e, 0x89, 0x81, 0xfb, 0x49, 0xb6, 0x8d, 0x95, 0x78, 0x70, 0x1f, 0xd7, 0x47, 0x8e, 0x4c, + 0x01, 0x11, 0x2d, 0xec, 0xbb, 0x41, 0x0b, 0x5b, 0xe2, 0x50, 0xb9, 0x35, 0x11, 0xb5, 0x1f, 0xc1, + 0xf6, 0xf5, 0x12, 0x19, 0x0a, 0xbe, 0x9a, 0x39, 0xa5, 0x5d, 0xdb, 0xc6, 0xa6, 0x23, 0x06, 0xc2, + 0x5f, 0xb2, 0x20, 0xac, 0xf0, 0x20, 0xdc, 0x1a, 0xa3, 0xcc, 0x7e, 0x29, 0x29, 0xb6, 0xb1, 0x0f, + 0x05, 0x68, 0xde, 0xcb, 0xa1, 0xf9, 0xd3, 0xc9, 0xd9, 0x4a, 0x06, 0xe9, 0xca, 0x10, 0x88, 0x1e, + 0x87, 0x82, 0x3b, 0x26, 0x95, 0xea, 0xe5, 0xb3, 0x6a, 0xa3, 0x5c, 0x39, 0x5b, 0xae, 0xab, 0x05, + 0x8c, 0x5e, 0x2c, 0xc3, 0x8c, 0xc7, 0x9a, 0x86, 0xf7, 0xac, 0x0b, 0x82, 0xbd, 0xde, 0x57, 0x12, + 0x1a, 0x0b, 0x6c, 0x09, 0x11, 0x2d, 0xe3, 0x97, 0x12, 0x18, 0x0b, 0x31, 0xe4, 0x1e, 0x49, 0xbd, + 0xd5, 0xbe, 0x66, 0xb0, 0xd5, 0xa7, 0xb5, 0xf4, 0xed, 0xad, 0x5e, 0x92, 0x05, 0xf0, 0x2a, 0x79, + 0xd6, 0xc0, 0x17, 0xd1, 0x5a, 0x88, 0x09, 0xa7, 0xb6, 0x99, 0x81, 0x6a, 0x2b, 0xf5, 0x53, 0xdb, + 0xf7, 0xb2, 0x63, 0xd6, 0x02, 0x8f, 0xde, 0x4d, 0x91, 0xe2, 0x76, 0x39, 0x89, 0x9e, 0x1d, 0xfa, + 0x8a, 0x22, 0xf1, 0x56, 0xe7, 0x55, 0x30, 0x45, 0x1e, 0x2b, 0xfa, 0x0e, 0xa6, 0x6d, 0x28, 0x4c, + 0x50, 0xce, 0xc0, 0x8c, 0x97, 0xb1, 0x69, 0x99, 0x6e, 0x7d, 0xb2, 0x24, 0x03, 0x97, 0xe6, 0x82, + 0xd8, 0xb4, 0xb1, 0xee, 0x58, 0x36, 0xa1, 0x91, 0xf3, 0x40, 0x64, 0x92, 0xd0, 0xb7, 0x82, 0x56, + 0xa8, 0x72, 0x9a, 0xf3, 0xf8, 0x24, 0x55, 0x49, 0xa6, 0x37, 0x7b, 0xc3, 0xb5, 0x3f, 0xaf, 0xd5, + 0x35, 0x5c, 0xb4, 0x97, 0xc8, 0xd4, 0x0e, 0x2b, 0x27, 0x41, 0xa1, 0xa9, 0x6e, 0xde, 0x52, 0xb5, + 0x52, 0x57, 0x2b, 0xf5, 0xc2, 0x66, 0x5f, 0x8d, 0xda, 0x42, 0xaf, 0xcb, 0x42, 0xf6, 0x1e, 0xcb, + 0x30, 0xd1, 0x83, 0x19, 0x4e, 0x25, 0x4c, 0xec, 0x5c, 0xb4, 0xec, 0x0b, 0x41, 0x43, 0x0d, 0x13, + 0xe2, 0xb1, 0x09, 0x55, 0x49, 0x1e, 0xa8, 0x4a, 0xd9, 0x7e, 0xaa, 0xf4, 0xab, 0xac, 0x2a, 0xdd, + 0xc1, 0xab, 0xd2, 0xf5, 0x7d, 0xe4, 0xef, 0x32, 0x1f, 0xd1, 0x01, 0x7c, 0x22, 0xe8, 0x00, 0xee, + 0xe2, 0x60, 0x7c, 0xac, 0x18, 0x99, 0x64, 0x00, 0x7e, 0x39, 0xd5, 0x86, 0xdf, 0x0f, 0xea, 0xad, + 0x08, 0xa8, 0xb7, 0xfb, 0xf4, 0x09, 0xc6, 0xfe, 0xae, 0xe3, 0xfe, 0xfd, 0xdd, 0xc4, 0x05, 0xe5, + 0x04, 0x1c, 0x5b, 0x2c, 0x2f, 0x2d, 0xa9, 0x9a, 0x5a, 0xa9, 0x37, 0x2a, 0x6a, 0xfd, 0x5c, 0x55, + 0xbb, 0xb7, 0xd0, 0x46, 0x0f, 0xc9, 0x00, 0xae, 0x84, 0x4a, 0xba, 0xd9, 0xc4, 0x6d, 0xb1, 0x1e, + 0xfd, 0x7f, 0x48, 0xc9, 0xfa, 0x84, 0x90, 0x7e, 0x04, 0x9c, 0xaf, 0x94, 0xc4, 0x5b, 0x65, 0x24, + 0xb1, 0x64, 0xa0, 0xbe, 0xf9, 0x91, 0x60, 0x7b, 0x5e, 0x06, 0x47, 0x7d, 0x7a, 0x34, 0x7b, 0xff, + 0x69, 0xdf, 0xdb, 0xb2, 0x30, 0x47, 0x61, 0xf1, 0xe7, 0xf1, 0xcf, 0xcd, 0x88, 0x4c, 0xe4, 0x11, + 0x4c, 0xd2, 0x69, 0xbb, 0xdf, 0xbd, 0x07, 0xef, 0xca, 0x32, 0x4c, 0x77, 0xb0, 0xbd, 0x63, 0x74, + 0xbb, 0x86, 0x65, 0x7a, 0x0b, 0x72, 0x73, 0xb7, 0x3e, 0x3a, 0x90, 0x38, 0x59, 0xbb, 0x9c, 0x5f, + 0xd7, 0x6d, 0xc7, 0x68, 0x1a, 0x1d, 0xdd, 0x74, 0xd6, 0xc3, 0xcc, 0x1a, 0xfb, 0x27, 0x7a, 0x51, + 0xc2, 0x69, 0x0d, 0x5f, 0x93, 0x08, 0x95, 0xf8, 0xbd, 0x04, 0x53, 0x92, 0x58, 0x82, 0xc9, 0xd4, + 0xe2, 0xe3, 0xa9, 0xaa, 0x45, 0x1f, 0xbc, 0xb7, 0x94, 0x2b, 0xe0, 0x44, 0xb9, 0x52, 0xaa, 0x6a, + 0x9a, 0x5a, 0xaa, 0x37, 0xd6, 0x55, 0x6d, 0xad, 0x5c, 0xab, 0x95, 0xab, 0x95, 0xda, 0x41, 0x5a, + 0x3b, 0xfa, 0x94, 0x1c, 0x68, 0xcc, 0x22, 0x6e, 0xb6, 0x0d, 0x13, 0xa3, 0xbb, 0x0e, 0xa8, 0x30, + 0xfc, 0xaa, 0x8f, 0x38, 0xce, 0xb4, 0xfc, 0x08, 0x9c, 0x5f, 0x9b, 0x1c, 0xe7, 0xfe, 0x04, 0xff, + 0x1d, 0x37, 0xff, 0xaf, 0xc8, 0x70, 0x8c, 0x69, 0x88, 0x1a, 0xde, 0x19, 0xd9, 0x4a, 0xde, 0x2f, + 0xb0, 0x6d, 0xb7, 0xcc, 0x63, 0xda, 0xcf, 0x9a, 0xde, 0xc7, 0x46, 0x04, 0xac, 0x6f, 0x0e, 0x60, + 0x5d, 0xe5, 0x60, 0x7d, 0xf2, 0x10, 0x34, 0x93, 0x21, 0xfb, 0x3b, 0xa9, 0x22, 0x7b, 0x05, 0x9c, + 0x58, 0x2f, 0x6a, 0xf5, 0x72, 0xa9, 0xbc, 0x5e, 0x74, 0xc7, 0x51, 0x66, 0xc8, 0x8e, 0x30, 0xd7, + 0x79, 0xd0, 0xfb, 0xe2, 0xfb, 0xc1, 0x2c, 0x5c, 0xd5, 0xbf, 0xa3, 0x2d, 0x6d, 0xeb, 0xe6, 0x16, + 0x46, 0x86, 0x08, 0xd4, 0x8b, 0x30, 0xd1, 0x24, 0xd9, 0x3d, 0x9c, 0xd9, 0xad, 0x9b, 0x98, 0xbe, + 0xdc, 0x2b, 0x41, 0xf3, 0x7f, 0x45, 0xef, 0x64, 0x15, 0xa2, 0xce, 0x2b, 0xc4, 0x53, 0xe3, 0xc1, + 0xdb, 0xc7, 0x77, 0x84, 0x6e, 0x7c, 0x26, 0xd0, 0x8d, 0x73, 0x9c, 0x6e, 0x94, 0x0e, 0x46, 0x3e, + 0x99, 0x9a, 0xfc, 0xd1, 0x23, 0xa1, 0x03, 0x88, 0xd4, 0x26, 0x23, 0x7a, 0x54, 0xe8, 0xdb, 0xdd, + 0xbf, 0x5a, 0x86, 0xfc, 0x22, 0x6e, 0x63, 0xd1, 0x95, 0xc8, 0xef, 0x48, 0xa2, 0x1b, 0x22, 0x1e, + 0x0c, 0x1e, 0xed, 0xe8, 0xd5, 0x11, 0xc7, 0xd8, 0xc1, 0x5d, 0x47, 0xdf, 0xe9, 0x10, 0x51, 0xcb, + 0x5a, 0x98, 0x80, 0x7e, 0x51, 0x12, 0xd9, 0x2e, 0x89, 0x29, 0xe6, 0xdf, 0xc7, 0x9a, 0xe2, 0xe7, + 0x24, 0x98, 0xac, 0x61, 0xa7, 0x6a, 0xb7, 0xb0, 0x8d, 0x6a, 0x21, 0x46, 0xd7, 0xc0, 0x34, 0x01, + 0xc5, 0x9d, 0x66, 0x06, 0x38, 0xb1, 0x49, 0xca, 0xf5, 0x30, 0x17, 0xbc, 0x92, 0xdf, 0x69, 0x37, + 0xde, 0x93, 0x8a, 0xfe, 0x31, 0x23, 0xba, 0x8b, 0x4b, 0x97, 0x0c, 0x29, 0x37, 0x11, 0xad, 0x54, + 0x6c, 0x47, 0x36, 0x96, 0x54, 0xfa, 0x1b, 0x5d, 0x6f, 0x97, 0x00, 0x36, 0xcc, 0xae, 0x2f, 0xd7, + 0xc7, 0x26, 0x90, 0x2b, 0xfa, 0xe7, 0x4c, 0xb2, 0x59, 0x4c, 0x58, 0x4e, 0x84, 0xc4, 0x5e, 0x9f, + 0x60, 0x6d, 0x21, 0x92, 0x58, 0xfa, 0x32, 0xfb, 0xfa, 0x1c, 0xe4, 0xcf, 0xe9, 0xed, 0x36, 0x76, + 0xd0, 0x37, 0x24, 0xc8, 0x97, 0x6c, 0xac, 0x3b, 0x98, 0x15, 0x1d, 0x82, 0x49, 0xdb, 0xb2, 0x9c, + 0x75, 0xdd, 0xd9, 0xa6, 0x72, 0x0b, 0xde, 0xa9, 0xc3, 0xc0, 0x6f, 0xb3, 0xdd, 0xc7, 0x5d, 0xbc, + 0xe8, 0x7e, 0x92, 0xab, 0xad, 0x57, 0xd0, 0xbc, 0x57, 0x48, 0x44, 0xff, 0x81, 0x60, 0x72, 0xc7, + 0xc4, 0x3b, 0x96, 0x69, 0x34, 0x7d, 0x9b, 0xd3, 0x7f, 0x47, 0x1f, 0x09, 0x64, 0xba, 0xc0, 0xc9, + 0x74, 0x5e, 0xb8, 0x94, 0x64, 0x02, 0xad, 0x0d, 0xd1, 0x7b, 0x5c, 0x0d, 0x57, 0x7a, 0x9d, 0x41, + 0xa3, 0x5e, 0x6d, 0x94, 0x34, 0xb5, 0x58, 0x57, 0x1b, 0xab, 0xd5, 0x52, 0x71, 0xb5, 0xa1, 0xa9, + 0xeb, 0xd5, 0x02, 0x46, 0x7f, 0x27, 0xb9, 0xc2, 0x6d, 0x5a, 0x7b, 0xd8, 0x46, 0xcb, 0x42, 0x72, + 0x8e, 0x93, 0x09, 0xc5, 0xe0, 0x57, 0x85, 0x9d, 0x36, 0xa8, 0x74, 0x28, 0x07, 0x11, 0xca, 0xfb, + 0x51, 0xa1, 0xe6, 0x1e, 0x4b, 0xea, 0x11, 0x20, 0xe9, 0xff, 0x29, 0xc1, 0x44, 0xc9, 0x32, 0xf7, + 0xb0, 0xed, 0xb0, 0xf3, 0x1d, 0x56, 0x9a, 0x19, 0x5e, 0x9a, 0xee, 0x20, 0x89, 0x4d, 0xc7, 0xb6, + 0x3a, 0xfe, 0x84, 0xc7, 0x7f, 0x45, 0x6f, 0x4c, 0x2a, 0x61, 0x5a, 0x72, 0xf4, 0xc2, 0x67, 0xff, + 0x82, 0x38, 0xf6, 0xe4, 0x9e, 0x06, 0xf0, 0x50, 0x12, 0x5c, 0xfa, 0x33, 0x90, 0x7e, 0x97, 0xf2, + 0x55, 0x19, 0x66, 0xbd, 0xc6, 0x57, 0xc3, 0xc4, 0x42, 0x43, 0x55, 0x76, 0xc9, 0xb1, 0x47, 0xf8, + 0x2b, 0x47, 0x38, 0xf1, 0xe7, 0xf5, 0x4e, 0x27, 0x58, 0x7e, 0x5e, 0x39, 0xa2, 0xd1, 0x77, 0x4f, + 0xcd, 0x17, 0xf2, 0x90, 0xd5, 0x77, 0x9d, 0x6d, 0xf4, 0x03, 0xe1, 0xc9, 0x27, 0xd7, 0x19, 0x50, + 0x7e, 0x22, 0x20, 0x39, 0x0e, 0x39, 0xc7, 0xba, 0x80, 0x7d, 0x39, 0x78, 0x2f, 0x2e, 0x1c, 0x7a, + 0xa7, 0x53, 0x27, 0x1f, 0x28, 0x1c, 0xfe, 0xbb, 0x6b, 0xeb, 0xe8, 0xcd, 0xa6, 0xb5, 0x6b, 0x3a, + 0x65, 0x7f, 0x09, 0x3a, 0x4c, 0x40, 0x5f, 0xca, 0x88, 0x4c, 0x66, 0x05, 0x18, 0x4c, 0x06, 0xd9, + 0xf9, 0x21, 0x9a, 0xd2, 0x3c, 0xdc, 0x58, 0x5c, 0x5f, 0x6f, 0xd4, 0xab, 0xf7, 0xaa, 0x95, 0xd0, + 0xf0, 0x6c, 0x94, 0x2b, 0x8d, 0xfa, 0x8a, 0xda, 0x28, 0x6d, 0x68, 0x64, 0x9d, 0xb0, 0x58, 0x2a, + 0x55, 0x37, 0x2a, 0xf5, 0x02, 0x46, 0x6f, 0x91, 0x60, 0xa6, 0xd4, 0xb6, 0xba, 0x01, 0xc2, 0x57, + 0x87, 0x08, 0x07, 0x62, 0xcc, 0x30, 0x62, 0x44, 0xff, 0x9a, 0x11, 0x75, 0x3a, 0xf0, 0x05, 0xc2, + 0x90, 0x8f, 0xe8, 0xa5, 0xde, 0x28, 0xe4, 0x74, 0x30, 0x98, 0x5e, 0xfa, 0x4d, 0xe2, 0x73, 0xb7, + 0xc3, 0x44, 0xd1, 0x53, 0x0c, 0xf4, 0xd7, 0x19, 0xc8, 0x97, 0x2c, 0x73, 0xd3, 0xd8, 0x72, 0x8d, + 0x39, 0x6c, 0xea, 0xe7, 0xdb, 0x78, 0x51, 0x77, 0xf4, 0x3d, 0x03, 0x5f, 0x24, 0x15, 0x98, 0xd4, + 0x7a, 0x52, 0x5d, 0xa6, 0x68, 0x0a, 0x3e, 0xbf, 0xbb, 0x45, 0x98, 0x9a, 0xd4, 0xd8, 0x24, 0xe5, + 0xc9, 0x70, 0xb9, 0xf7, 0xba, 0x6e, 0x63, 0x1b, 0xb7, 0xb1, 0xde, 0xc5, 0xee, 0xb4, 0xc8, 0xc4, + 0x6d, 0xa2, 0xb4, 0x93, 0x5a, 0xd4, 0x67, 0xe5, 0x0c, 0xcc, 0x78, 0x9f, 0x88, 0x29, 0xd2, 0x25, + 0x6a, 0x3c, 0xa9, 0x71, 0x69, 0xca, 0xe3, 0x20, 0x87, 0x1f, 0x70, 0x6c, 0xfd, 0x54, 0x8b, 0xe0, + 0x75, 0xf9, 0xbc, 0xe7, 0x75, 0x38, 0xef, 0x7b, 0x1d, 0xce, 0xd7, 0x88, 0x4f, 0xa2, 0xe6, 0xe5, + 0x42, 0xaf, 0x98, 0x0c, 0x0c, 0x89, 0x1f, 0x4a, 0xa1, 0x62, 0x28, 0x90, 0x35, 0xf5, 0x1d, 0x4c, + 0xf5, 0x82, 0x3c, 0x2b, 0x37, 0xc2, 0x51, 0x7d, 0x4f, 0x77, 0x74, 0x7b, 0xd5, 0x6a, 0xea, 0x6d, + 0x32, 0xf8, 0xf9, 0x2d, 0xbf, 0xf7, 0x03, 0xd9, 0x11, 0x72, 0x2c, 0x1b, 0x93, 0x5c, 0xfe, 0x8e, + 0x90, 0x9f, 0xe0, 0x52, 0x37, 0x9a, 0x96, 0x49, 0xf8, 0x97, 0x35, 0xf2, 0xec, 0x4a, 0xa5, 0x65, + 0x74, 0xdd, 0x8a, 0x10, 0x2a, 0x15, 0x6f, 0x6b, 0xa3, 0x76, 0xc9, 0x6c, 0x92, 0xdd, 0xa0, 0x49, + 0x2d, 0xea, 0xb3, 0xb2, 0x00, 0xd3, 0x74, 0x23, 0x64, 0xcd, 0xd5, 0xab, 0x3c, 0xd1, 0xab, 0x6b, + 0x78, 0x9f, 0x2e, 0x0f, 0xcf, 0xf9, 0x4a, 0x98, 0x4f, 0x63, 0x7f, 0x52, 0xee, 0x86, 0x2b, 0xe9, + 0x6b, 0x69, 0xb7, 0xeb, 0x58, 0x3b, 0x1e, 0xe8, 0x4b, 0x46, 0xdb, 0xab, 0xc1, 0x04, 0xa9, 0x41, + 0x5c, 0x16, 0xe5, 0x56, 0x38, 0xde, 0xb1, 0xf1, 0x26, 0xb6, 0xef, 0xd3, 0x77, 0x76, 0x1f, 0xa8, + 0xdb, 0xba, 0xd9, 0xed, 0x58, 0xb6, 0x73, 0x6a, 0x92, 0x30, 0xdf, 0xf7, 0x1b, 0xed, 0x28, 0x27, + 0x21, 0xef, 0x89, 0x0f, 0xbd, 0x30, 0x27, 0xec, 0xce, 0x49, 0x2b, 0x14, 0x6b, 0x9e, 0xdd, 0x02, + 0x13, 0xb4, 0x87, 0x23, 0x40, 0x4d, 0xdf, 0x7a, 0xb2, 0x67, 0x5d, 0x81, 0x52, 0xd1, 0xfc, 0x6c, + 0xca, 0x13, 0x20, 0xdf, 0x24, 0xd5, 0x22, 0x98, 0x4d, 0xdf, 0x7a, 0x65, 0xff, 0x42, 0x49, 0x16, + 0x8d, 0x66, 0x45, 0x7f, 0x21, 0x0b, 0x79, 0x80, 0xc6, 0x71, 0x9c, 0xac, 0x55, 0x7f, 0x4b, 0x1a, + 0xa2, 0xdb, 0xbc, 0x09, 0x6e, 0xa0, 0x7d, 0x22, 0xb5, 0x3f, 0x16, 0x1b, 0x0b, 0x1b, 0xfe, 0x64, + 0xd0, 0xb5, 0x4a, 0x6a, 0xf5, 0xa2, 0xe6, 0xce, 0xe4, 0x17, 0xdd, 0x49, 0xe4, 0x8d, 0x70, 0xfd, + 0x80, 0xdc, 0x6a, 0xbd, 0x51, 0x29, 0xae, 0xa9, 0x85, 0x4d, 0xde, 0xb6, 0xa9, 0xd5, 0xab, 0xeb, + 0x0d, 0x6d, 0xa3, 0x52, 0x29, 0x57, 0x96, 0x3d, 0x62, 0xae, 0x49, 0x78, 0x32, 0xcc, 0x70, 0x4e, + 0x2b, 0xd7, 0xd5, 0x46, 0xa9, 0x5a, 0x59, 0x2a, 0x2f, 0x17, 0x8c, 0x41, 0x86, 0xd1, 0xfd, 0xca, + 0x35, 0x70, 0x15, 0xc7, 0x49, 0xb9, 0x5a, 0x71, 0x67, 0xb6, 0xa5, 0x62, 0xa5, 0xa4, 0xba, 0xd3, + 0xd8, 0x0b, 0x0a, 0x82, 0x13, 0x1e, 0xb9, 0xc6, 0x52, 0x79, 0x95, 0xdd, 0x8c, 0xfa, 0x64, 0x46, + 0x39, 0x05, 0x97, 0xb1, 0xdf, 0xca, 0x95, 0xb3, 0xc5, 0xd5, 0xf2, 0x62, 0xe1, 0x0f, 0x33, 0xca, + 0x75, 0x70, 0x35, 0xf7, 0x97, 0xb7, 0xaf, 0xd4, 0x28, 0x2f, 0x36, 0xd6, 0xca, 0xb5, 0xb5, 0x62, + 0xbd, 0xb4, 0x52, 0xf8, 0x14, 0x99, 0x2f, 0x04, 0x06, 0x30, 0xe3, 0x96, 0xf9, 0x12, 0x76, 0x4c, + 0x2f, 0xf2, 0x8a, 0xfa, 0xd8, 0xbe, 0xb0, 0xc7, 0xdb, 0xb0, 0x1f, 0x0f, 0x46, 0x87, 0x45, 0x4e, + 0x85, 0x6e, 0x49, 0x40, 0x2b, 0x99, 0x0e, 0xd5, 0x87, 0x50, 0xa1, 0x6b, 0xe0, 0xaa, 0x8a, 0xea, + 0x21, 0xa5, 0xa9, 0xa5, 0xea, 0x59, 0x55, 0x6b, 0x9c, 0x2b, 0xae, 0xae, 0xaa, 0xf5, 0xc6, 0x52, + 0x59, 0xab, 0xd5, 0x0b, 0x9b, 0xe8, 0x9f, 0xa5, 0x60, 0x35, 0x87, 0x91, 0xd6, 0x5f, 0x4b, 0x49, + 0x9b, 0x75, 0xec, 0xaa, 0xcd, 0x4f, 0x41, 0xbe, 0xeb, 0xe8, 0xce, 0x6e, 0x97, 0xb6, 0xea, 0x47, + 0xf5, 0x6f, 0xd5, 0xf3, 0x35, 0x92, 0x49, 0xa3, 0x99, 0xd1, 0x5f, 0x64, 0x92, 0x34, 0xd3, 0x11, + 0x2c, 0xe8, 0x18, 0x43, 0x88, 0xf8, 0x34, 0x20, 0x5f, 0xdb, 0xcb, 0xb5, 0x46, 0x71, 0x55, 0x53, + 0x8b, 0x8b, 0xf7, 0x05, 0xcb, 0x38, 0x58, 0x39, 0x01, 0xc7, 0x36, 0x2a, 0xc5, 0x85, 0x55, 0x95, + 0x34, 0x97, 0x6a, 0xa5, 0xa2, 0x96, 0x5c, 0xb9, 0xff, 0x22, 0xd9, 0x34, 0x71, 0x2d, 0x68, 0xc2, + 0xb7, 0x6b, 0xe5, 0x30, 0xf2, 0xff, 0xa6, 0xb0, 0x6f, 0x51, 0xa8, 0x61, 0x2c, 0xad, 0xd1, 0xe2, + 0xf0, 0x25, 0x21, 0x77, 0x22, 0x21, 0x4e, 0x92, 0xe1, 0xf1, 0x9f, 0x86, 0xc0, 0xe3, 0x04, 0x1c, + 0x63, 0xf1, 0x20, 0x6e, 0x45, 0xd1, 0x30, 0x7c, 0x6d, 0x12, 0xf2, 0x35, 0xdc, 0xc6, 0x4d, 0x07, + 0xbd, 0x8d, 0x31, 0x26, 0xe6, 0x40, 0x0a, 0xdc, 0x58, 0x24, 0xa3, 0xc5, 0x4d, 0x9f, 0xa5, 0x9e, + 0xe9, 0x73, 0x8c, 0x19, 0x20, 0x27, 0x32, 0x03, 0xb2, 0x29, 0x98, 0x01, 0xb9, 0xe1, 0xcd, 0x80, + 0xfc, 0x20, 0x33, 0x00, 0xbd, 0x3e, 0x9f, 0xb4, 0x97, 0xf0, 0x44, 0x7d, 0xb8, 0x83, 0xff, 0xff, + 0xc8, 0x26, 0xe9, 0x55, 0xfa, 0x72, 0x9c, 0x4c, 0x8b, 0x7f, 0x20, 0xa7, 0xb0, 0xfc, 0xa0, 0x5c, + 0x0b, 0x57, 0x87, 0xef, 0x0d, 0xf5, 0xe9, 0xe5, 0x5a, 0xbd, 0x46, 0x46, 0xfc, 0x52, 0x55, 0xd3, + 0x36, 0xd6, 0xbd, 0x35, 0xe4, 0x93, 0xa0, 0x84, 0x54, 0xb4, 0x8d, 0x8a, 0x37, 0xbe, 0x6f, 0xf1, + 0xd4, 0x97, 0xca, 0x95, 0xc5, 0x46, 0xd0, 0x66, 0x2a, 0x4b, 0xd5, 0xc2, 0xb6, 0x3b, 0x65, 0x63, + 0xa8, 0xbb, 0x03, 0x34, 0x2d, 0xa1, 0x58, 0x59, 0x6c, 0xac, 0x55, 0xd4, 0xb5, 0x6a, 0xa5, 0x5c, + 0x22, 0xe9, 0x35, 0xb5, 0x5e, 0x30, 0xdc, 0x81, 0xa6, 0xc7, 0xa2, 0xa8, 0xa9, 0x45, 0xad, 0xb4, + 0xa2, 0x6a, 0x5e, 0x91, 0xf7, 0x2b, 0xd7, 0xc3, 0x99, 0x62, 0xa5, 0x5a, 0x77, 0x53, 0x8a, 0x95, + 0xfb, 0xea, 0xf7, 0xad, 0xab, 0x8d, 0x75, 0xad, 0x5a, 0x52, 0x6b, 0x35, 0xb7, 0x9d, 0x52, 0xfb, + 0xa3, 0xd0, 0x56, 0x9e, 0x0a, 0xb7, 0x33, 0xac, 0xa9, 0x75, 0xb2, 0x61, 0xb9, 0x56, 0x25, 0x3e, + 0x2b, 0x8b, 0x6a, 0x63, 0xa5, 0x58, 0x6b, 0x94, 0x2b, 0xa5, 0xea, 0xda, 0x7a, 0xb1, 0x5e, 0x76, + 0x9b, 0xf3, 0xba, 0x56, 0xad, 0x57, 0x1b, 0x67, 0x55, 0xad, 0x56, 0xae, 0x56, 0x0a, 0xa6, 0x5b, + 0x65, 0xa6, 0xfd, 0xfb, 0xfd, 0xb0, 0xa5, 0x5c, 0x05, 0xa7, 0xfc, 0xf4, 0xd5, 0xaa, 0x2b, 0x68, + 0xc6, 0x22, 0xe9, 0xa4, 0x6a, 0x91, 0xfc, 0x8b, 0x04, 0xd9, 0x9a, 0x63, 0x75, 0xd0, 0x4f, 0x86, + 0x1d, 0xcc, 0x69, 0x00, 0x9b, 0xec, 0x3f, 0xba, 0xb3, 0x30, 0x3a, 0x2f, 0x63, 0x52, 0xd0, 0x1f, + 0x08, 0x6f, 0x9a, 0x84, 0x7d, 0xb6, 0xd5, 0x89, 0xb0, 0x55, 0xbe, 0x2f, 0x76, 0x8a, 0x24, 0x9a, + 0x50, 0x32, 0x7d, 0xff, 0xa5, 0x61, 0xb6, 0x45, 0x10, 0x9c, 0x64, 0x60, 0x73, 0xe5, 0xef, 0xab, + 0x04, 0x56, 0x2e, 0x87, 0xcb, 0x7a, 0x94, 0x8b, 0xe8, 0xd4, 0xa6, 0xf2, 0x13, 0xf0, 0x28, 0x46, + 0xbd, 0xd5, 0xb5, 0xea, 0x59, 0x35, 0x50, 0xe4, 0xc5, 0x62, 0xbd, 0x58, 0xd8, 0x42, 0x9f, 0x93, + 0x21, 0xbb, 0x66, 0xed, 0xf5, 0xee, 0x55, 0x99, 0xf8, 0x22, 0xb3, 0x16, 0xea, 0xbf, 0xf2, 0x5e, + 0xf3, 0x42, 0x62, 0x5f, 0x8b, 0xde, 0x97, 0xfe, 0x92, 0x94, 0x44, 0xec, 0x6b, 0x07, 0xdd, 0x8c, + 0xfe, 0xfb, 0x61, 0xc4, 0x1e, 0x21, 0x5a, 0xac, 0x9c, 0x81, 0xd3, 0xe1, 0x87, 0xf2, 0xa2, 0x5a, + 0xa9, 0x97, 0x97, 0xee, 0x0b, 0x85, 0x5b, 0xd6, 0x84, 0xc4, 0x3f, 0xa8, 0x1b, 0x8b, 0x9f, 0x69, + 0x9c, 0x82, 0xe3, 0xe1, 0xb7, 0x65, 0xb5, 0xee, 0x7f, 0xb9, 0x1f, 0x3d, 0x98, 0x83, 0x19, 0xaf, + 0x5b, 0xdf, 0xe8, 0xb4, 0x74, 0x07, 0xa3, 0x27, 0x84, 0xe8, 0xde, 0x00, 0x47, 0xcb, 0xeb, 0x4b, + 0xb5, 0x9a, 0x63, 0xd9, 0xfa, 0x16, 0x2e, 0xb6, 0x5a, 0x36, 0x95, 0x56, 0x6f, 0x32, 0x7a, 0xb7, + 0xf0, 0x3a, 0x1f, 0x3f, 0x94, 0x78, 0x65, 0x46, 0xa0, 0xfe, 0x55, 0xa1, 0x75, 0x39, 0x01, 0x82, + 0xc9, 0xd0, 0xbf, 0x7f, 0xc4, 0x6d, 0x2e, 0x1a, 0x97, 0xcd, 0x33, 0xcf, 0x91, 0x60, 0xaa, 0x6e, + 0xec, 0xe0, 0x67, 0x58, 0x26, 0xee, 0x2a, 0x13, 0x20, 0x2f, 0xaf, 0xd5, 0x0b, 0x47, 0xdc, 0x07, + 0xd7, 0xa8, 0xca, 0x90, 0x07, 0xd5, 0x2d, 0xc0, 0x7d, 0x28, 0xd6, 0x0b, 0xb2, 0xfb, 0xb0, 0xa6, + 0xd6, 0x0b, 0x59, 0xf7, 0xa1, 0xa2, 0xd6, 0x0b, 0x39, 0xf7, 0x61, 0x7d, 0xb5, 0x5e, 0xc8, 0xbb, + 0x0f, 0xe5, 0x5a, 0xbd, 0x30, 0xe1, 0x3e, 0x2c, 0xd4, 0xea, 0x85, 0x49, 0xf7, 0xe1, 0x6c, 0xad, + 0x5e, 0x98, 0x72, 0x1f, 0x4a, 0xf5, 0x7a, 0x01, 0xdc, 0x87, 0x7b, 0x6a, 0xf5, 0xc2, 0xb4, 0xfb, + 0x50, 0x2c, 0xd5, 0x0b, 0x33, 0xe4, 0x41, 0xad, 0x17, 0x66, 0xdd, 0x87, 0x5a, 0xad, 0x5e, 0x98, + 0x23, 0x94, 0x6b, 0xf5, 0xc2, 0x51, 0x52, 0x56, 0xb9, 0x5e, 0x28, 0xb8, 0x0f, 0x2b, 0xb5, 0x7a, + 0xe1, 0x18, 0xc9, 0x5c, 0xab, 0x17, 0x14, 0x52, 0x68, 0xad, 0x5e, 0xb8, 0x8c, 0xe4, 0xa9, 0xd5, + 0x0b, 0xc7, 0x49, 0x11, 0xb5, 0x7a, 0xe1, 0x04, 0x61, 0x43, 0xad, 0x17, 0x4e, 0x92, 0x3c, 0x5a, + 0xbd, 0x70, 0x39, 0xf9, 0x54, 0xa9, 0x17, 0x4e, 0x11, 0xc6, 0xd4, 0x7a, 0xe1, 0x0a, 0xf2, 0xa0, + 0xd5, 0x0b, 0x88, 0x7c, 0x2a, 0xd6, 0x0b, 0x57, 0xa2, 0x47, 0xc1, 0xd4, 0x32, 0x76, 0x3c, 0x10, + 0x51, 0x01, 0xe4, 0x65, 0xec, 0xb0, 0x66, 0xfc, 0xd7, 0x65, 0xb8, 0x9c, 0x4e, 0xfd, 0x96, 0x6c, + 0x6b, 0x67, 0x15, 0x6f, 0xe9, 0xcd, 0x4b, 0xea, 0x03, 0xae, 0x09, 0xc5, 0xee, 0xcb, 0x2a, 0x90, + 0xed, 0x84, 0x9d, 0x11, 0x79, 0x8e, 0xb5, 0x38, 0xfd, 0xc5, 0x28, 0x39, 0x5c, 0x8c, 0xa2, 0x16, + 0xd9, 0x3f, 0xb1, 0x1a, 0xcd, 0xad, 0x1f, 0x67, 0x7a, 0xd6, 0x8f, 0xdd, 0x66, 0xd2, 0xc1, 0x76, + 0xd7, 0x32, 0xf5, 0x76, 0x8d, 0x6e, 0xdc, 0x7b, 0xab, 0x5e, 0xbd, 0xc9, 0xca, 0xd3, 0xfc, 0x96, + 0xe1, 0x59, 0x65, 0x4f, 0x89, 0x9b, 0xe1, 0xf6, 0x56, 0x33, 0xa2, 0x91, 0x7c, 0x2a, 0x68, 0x24, + 0x75, 0xae, 0x91, 0xdc, 0x7d, 0x00, 0xda, 0xc9, 0xda, 0x4b, 0x79, 0xb8, 0xa9, 0x45, 0xe8, 0xd6, + 0xea, 0x2f, 0x57, 0xcb, 0xe8, 0x73, 0x12, 0x9c, 0x54, 0xcd, 0x7e, 0x16, 0x3e, 0xab, 0x0b, 0x6f, + 0x61, 0xa1, 0x59, 0xe7, 0x45, 0x7a, 0x7b, 0xdf, 0x6a, 0xf7, 0xa7, 0x19, 0x21, 0xd1, 0x4f, 0x07, + 0x12, 0xad, 0x71, 0x12, 0xbd, 0x6b, 0x78, 0xd2, 0xc9, 0x04, 0x5a, 0x19, 0x69, 0x07, 0x94, 0x45, + 0xdf, 0xca, 0xc2, 0xa3, 0x3c, 0xdf, 0x1b, 0xca, 0xa1, 0xd7, 0xca, 0x8a, 0x66, 0x4b, 0xc3, 0x5d, + 0x47, 0xb7, 0x1d, 0xee, 0x3c, 0x74, 0xcf, 0x54, 0x2a, 0x93, 0xc2, 0x54, 0x4a, 0x1a, 0x38, 0x95, + 0x42, 0xef, 0x62, 0xcd, 0x87, 0x73, 0x3c, 0xc6, 0xc5, 0xfe, 0xfd, 0x7f, 0x5c, 0x0d, 0xa3, 0xa0, + 0x0e, 0xec, 0x8a, 0x9f, 0xe1, 0xa0, 0x5e, 0x3a, 0x70, 0x09, 0xc9, 0x10, 0xff, 0x83, 0xd1, 0xda, + 0x79, 0x59, 0xf6, 0x1b, 0x6f, 0x94, 0x14, 0x5a, 0xa9, 0x1a, 0xe8, 0x9f, 0x99, 0x80, 0x29, 0xd2, + 0x16, 0x56, 0x0d, 0xf3, 0x02, 0x7a, 0x48, 0x86, 0x99, 0x0a, 0xbe, 0x58, 0xda, 0xd6, 0xdb, 0x6d, + 0x6c, 0x6e, 0x61, 0xd6, 0x6c, 0x3f, 0x05, 0x13, 0x7a, 0xa7, 0x53, 0x09, 0xf7, 0x19, 0xfc, 0x57, + 0xda, 0xff, 0x7e, 0xb3, 0x6f, 0x23, 0xcf, 0xc4, 0x34, 0xf2, 0xa0, 0xdc, 0x79, 0xb6, 0xcc, 0x88, + 0x19, 0xf2, 0x35, 0x30, 0xdd, 0xf4, 0xb3, 0x04, 0xe7, 0x26, 0xd8, 0x24, 0xf4, 0xb7, 0x89, 0xba, + 0x01, 0xa1, 0xc2, 0x93, 0x29, 0x05, 0x1e, 0xb1, 0x1d, 0x72, 0x02, 0x8e, 0xd5, 0xab, 0xd5, 0xc6, + 0x5a, 0xb1, 0x72, 0x5f, 0x78, 0x5e, 0x79, 0x13, 0xbd, 0x32, 0x0b, 0x73, 0x35, 0xab, 0xbd, 0x87, + 0x43, 0x98, 0xca, 0x9c, 0x43, 0x0e, 0x2b, 0xa7, 0xcc, 0x3e, 0x39, 0x29, 0x27, 0x21, 0xaf, 0x9b, + 0xdd, 0x8b, 0xd8, 0xb7, 0x0d, 0xe9, 0x1b, 0x85, 0xf1, 0x83, 0x6c, 0x3b, 0xd6, 0x78, 0x18, 0xef, + 0x18, 0x20, 0x49, 0x9e, 0xab, 0x08, 0x20, 0xcf, 0xc0, 0x4c, 0xd7, 0xdb, 0x2c, 0xac, 0x33, 0x7b, + 0xc2, 0x5c, 0x1a, 0x61, 0xd1, 0xdb, 0xad, 0x96, 0x29, 0x8b, 0xe4, 0x0d, 0x3d, 0x14, 0x34, 0xff, + 0x0d, 0x0e, 0xe2, 0xe2, 0x41, 0x18, 0x4b, 0x06, 0xf2, 0xab, 0x47, 0x3d, 0xc3, 0x3b, 0x05, 0xc7, + 0x69, 0xab, 0x6d, 0x94, 0x56, 0x8a, 0xab, 0xab, 0x6a, 0x65, 0x59, 0x6d, 0x94, 0x17, 0xbd, 0xad, + 0x8a, 0x30, 0xa5, 0x58, 0xaf, 0xab, 0x6b, 0xeb, 0xf5, 0x5a, 0x43, 0x7d, 0x7a, 0x49, 0x55, 0x17, + 0x89, 0x4b, 0x1c, 0x39, 0xd3, 0xe2, 0x3b, 0x2f, 0x16, 0x2b, 0xb5, 0x73, 0xaa, 0x56, 0xd8, 0x3e, + 0x53, 0x84, 0x69, 0xa6, 0x9f, 0x77, 0xb9, 0x5b, 0xc4, 0x9b, 0xfa, 0x6e, 0x9b, 0xda, 0x6a, 0x85, + 0x23, 0x2e, 0x77, 0x44, 0x36, 0x55, 0xb3, 0x7d, 0xa9, 0x90, 0x51, 0x0a, 0x30, 0xc3, 0x76, 0xe9, + 0x05, 0x09, 0xbd, 0xfd, 0x2a, 0x98, 0x3a, 0x67, 0xd9, 0x17, 0x88, 0x1f, 0x17, 0x7a, 0x9f, 0x17, + 0xd7, 0xc4, 0x3f, 0x21, 0xca, 0x0c, 0xec, 0xaf, 0x16, 0xf7, 0x16, 0xf0, 0xa9, 0xcd, 0x0f, 0x3c, + 0x05, 0x7a, 0x0d, 0x4c, 0x5f, 0xf4, 0x73, 0x87, 0x2d, 0x9d, 0x49, 0x42, 0xff, 0x4d, 0x6c, 0xff, + 0x7f, 0x70, 0x91, 0xe9, 0xef, 0x4f, 0xbf, 0x4d, 0x82, 0xfc, 0x32, 0x76, 0x8a, 0xed, 0x36, 0x2b, + 0xb7, 0x97, 0x0a, 0x9f, 0xec, 0xe1, 0x2a, 0x51, 0x6c, 0xb7, 0xa3, 0x1b, 0x15, 0x23, 0x20, 0xdf, + 0x03, 0x9d, 0x4b, 0x13, 0xf4, 0x9b, 0x1b, 0x50, 0x60, 0xfa, 0x12, 0xfb, 0x88, 0x1c, 0xec, 0x71, + 0x3f, 0xcc, 0x58, 0x39, 0x8f, 0x0f, 0x63, 0xda, 0x64, 0xe2, 0xf7, 0xca, 0xfd, 0x7c, 0xca, 0xbd, + 0x30, 0xb1, 0xdb, 0xc5, 0x25, 0xbd, 0x8b, 0x09, 0x6f, 0xbd, 0x35, 0xad, 0x9e, 0xbf, 0x1f, 0x37, + 0x9d, 0xf9, 0xf2, 0x8e, 0x6b, 0x50, 0x6f, 0x78, 0x19, 0x83, 0x30, 0x31, 0xf4, 0x5d, 0xf3, 0x29, + 0xb8, 0x93, 0x92, 0x8b, 0x86, 0xb3, 0x5d, 0xda, 0xd6, 0x1d, 0xba, 0xb6, 0x1d, 0xbc, 0xa3, 0x17, + 0x0e, 0x01, 0x67, 0xec, 0x5e, 0x70, 0xe4, 0x01, 0xc1, 0xc4, 0x20, 0x8e, 0x60, 0x03, 0x77, 0x18, + 0x10, 0xff, 0x41, 0x82, 0x6c, 0xb5, 0x83, 0x4d, 0xe1, 0xd3, 0x30, 0x81, 0x6c, 0xa5, 0x1e, 0xd9, + 0x3e, 0x24, 0xee, 0x1d, 0x16, 0x54, 0xda, 0x2d, 0x39, 0x42, 0xb2, 0x37, 0x43, 0xd6, 0x30, 0x37, + 0x2d, 0x6a, 0x98, 0x5e, 0x19, 0xb1, 0x09, 0x54, 0x36, 0x37, 0x2d, 0x8d, 0x64, 0x14, 0x75, 0x0c, + 0x8b, 0x2b, 0x3b, 0x7d, 0x71, 0x7f, 0x7b, 0x12, 0xf2, 0x9e, 0x3a, 0xa3, 0x97, 0xc8, 0x20, 0x17, + 0x5b, 0xad, 0x08, 0xc1, 0x4b, 0xfb, 0x04, 0x6f, 0x91, 0xdf, 0x02, 0x4c, 0x82, 0x77, 0x3e, 0x98, + 0x89, 0x60, 0xdf, 0x4e, 0x9b, 0x54, 0xb1, 0xd5, 0x8a, 0xf6, 0x41, 0x0d, 0x0a, 0x94, 0xf8, 0x02, + 0xd9, 0x16, 0x2e, 0x8b, 0xb5, 0xf0, 0xc4, 0x03, 0x41, 0x24, 0x7f, 0xe9, 0x43, 0xf4, 0x4f, 0x12, + 0x4c, 0xac, 0x1a, 0x5d, 0xc7, 0xc5, 0xa6, 0x28, 0x82, 0xcd, 0x55, 0x30, 0xe5, 0x8b, 0xc6, 0xed, + 0xf2, 0xdc, 0xfe, 0x3c, 0x4c, 0x40, 0xaf, 0x63, 0xd1, 0xb9, 0x87, 0x47, 0xe7, 0x89, 0xf1, 0xb5, + 0xa7, 0x5c, 0x44, 0x9f, 0x32, 0x08, 0x8b, 0x95, 0x7a, 0x8b, 0xfd, 0xed, 0x40, 0xe0, 0x6b, 0x9c, + 0xc0, 0x6f, 0x1b, 0xa6, 0xc8, 0xf4, 0x85, 0xfe, 0x79, 0x09, 0xc0, 0x2d, 0x9b, 0x1e, 0xe5, 0x7a, + 0x0c, 0x77, 0x40, 0x3b, 0x46, 0xba, 0xaf, 0x64, 0xa5, 0xbb, 0xc6, 0x4b, 0xf7, 0xa7, 0x07, 0x57, + 0x35, 0xee, 0xc8, 0x96, 0x52, 0x00, 0xd9, 0x08, 0x44, 0xeb, 0x3e, 0xa2, 0xb7, 0x05, 0x42, 0x5d, + 0xe7, 0x84, 0x7a, 0xc7, 0x90, 0x25, 0xa5, 0x2f, 0xd7, 0xbf, 0x94, 0x60, 0xa2, 0x86, 0x1d, 0xb7, + 0x9b, 0x44, 0x67, 0x45, 0x7a, 0x78, 0xa6, 0x6d, 0x4b, 0x82, 0x6d, 0xfb, 0x7b, 0x19, 0xd1, 0x40, + 0x2f, 0xa1, 0x64, 0x28, 0x4f, 0x11, 0x8b, 0x07, 0x0f, 0x0b, 0x05, 0x7a, 0x19, 0x44, 0x2d, 0x7d, + 0xe9, 0xbe, 0x45, 0x0a, 0x36, 0xe6, 0xf9, 0x93, 0x16, 0xac, 0x59, 0x9c, 0xd9, 0x6f, 0x16, 0x8b, + 0x9f, 0xb4, 0x60, 0xeb, 0x18, 0xbd, 0x2b, 0x9d, 0xd8, 0xd8, 0x18, 0xc1, 0x86, 0xf1, 0x30, 0xf2, + 0x7a, 0x96, 0x0c, 0x79, 0xba, 0xb2, 0x7c, 0x57, 0xfc, 0xca, 0xf2, 0xe0, 0xa9, 0xc5, 0x7b, 0x87, + 0x30, 0xe5, 0xe2, 0x96, 0x7b, 0x03, 0x36, 0x24, 0x86, 0x8d, 0x9b, 0x20, 0x47, 0x22, 0x51, 0xd2, + 0x71, 0x2e, 0xdc, 0xeb, 0xf7, 0x49, 0xa8, 0xee, 0x57, 0xcd, 0xcb, 0x94, 0x18, 0x85, 0x11, 0xac, + 0x10, 0x0f, 0x83, 0xc2, 0xbb, 0x3e, 0x97, 0x09, 0x8c, 0x90, 0xf7, 0x66, 0xa9, 0xf9, 0xf7, 0x09, + 0x3e, 0x26, 0x46, 0xd3, 0x32, 0x1d, 0xfc, 0x00, 0xb3, 0x26, 0x1f, 0x24, 0xc4, 0x5a, 0x06, 0xa7, + 0x60, 0xc2, 0xb1, 0xd9, 0x75, 0x7a, 0xff, 0x95, 0xed, 0x71, 0x72, 0x7c, 0x8f, 0x53, 0x81, 0x33, + 0x86, 0xd9, 0x6c, 0xef, 0xb6, 0xb0, 0x86, 0xdb, 0xba, 0x5b, 0xab, 0x6e, 0xb1, 0xbb, 0x88, 0x3b, + 0xd8, 0x6c, 0x61, 0xd3, 0xf1, 0xf8, 0xf4, 0x7d, 0x72, 0x05, 0x72, 0xa2, 0x6f, 0xb0, 0x8a, 0x71, + 0x27, 0xaf, 0x18, 0x8f, 0xe9, 0x37, 0xaf, 0x88, 0x31, 0x42, 0x6f, 0x03, 0xf0, 0xea, 0x76, 0xd6, + 0xc0, 0x17, 0x69, 0x87, 0x78, 0x45, 0x8f, 0x29, 0x5a, 0x0d, 0x32, 0x68, 0x4c, 0x66, 0xf4, 0x95, + 0x40, 0x19, 0xee, 0xe6, 0x94, 0xe1, 0x26, 0x41, 0x16, 0x92, 0xe9, 0x41, 0x67, 0x88, 0xb5, 0x8e, + 0x59, 0x98, 0x0a, 0x57, 0x28, 0x65, 0xe5, 0x0a, 0x38, 0xe1, 0xfb, 0x3c, 0x54, 0x54, 0x75, 0xb1, + 0xd6, 0xd8, 0x58, 0x5f, 0xd6, 0x8a, 0x8b, 0x6a, 0x01, 0x14, 0x05, 0xe6, 0xaa, 0x0b, 0xf7, 0xa8, + 0xa5, 0x7a, 0xe0, 0xaa, 0x90, 0x45, 0x5f, 0x90, 0x20, 0x47, 0x1c, 0xca, 0xd1, 0xcf, 0x8e, 0x48, + 0x73, 0xba, 0xdc, 0x0e, 0x4f, 0x30, 0x91, 0x12, 0x8f, 0x55, 0x49, 0x85, 0x49, 0xb8, 0x3a, 0x50, + 0xac, 0xca, 0x18, 0x42, 0xe9, 0x37, 0x4f, 0xb7, 0x49, 0xd6, 0xb6, 0xad, 0x8b, 0x3f, 0xce, 0x4d, + 0xd2, 0xad, 0xff, 0x21, 0x37, 0xc9, 0x3e, 0x2c, 0x8c, 0xbd, 0x49, 0xf6, 0x69, 0x77, 0x31, 0xcd, + 0x14, 0x3d, 0x33, 0x17, 0x2c, 0xc8, 0x3c, 0x47, 0x3a, 0xd0, 0x82, 0x4c, 0x11, 0x66, 0x0d, 0xd3, + 0xc1, 0xb6, 0xa9, 0xb7, 0x97, 0xda, 0xfa, 0x96, 0x7f, 0x80, 0xbe, 0x77, 0x16, 0x5e, 0x66, 0xf2, + 0x68, 0xfc, 0x1f, 0xca, 0x69, 0x00, 0x07, 0xef, 0x74, 0xda, 0xba, 0x13, 0xaa, 0x1e, 0x93, 0xc2, + 0x6a, 0x5f, 0x96, 0xd7, 0xbe, 0x5b, 0xe0, 0x32, 0x0f, 0xb4, 0xfa, 0xa5, 0x0e, 0xde, 0x30, 0x8d, + 0x9f, 0xdb, 0x25, 0x21, 0x94, 0x3c, 0x1d, 0xed, 0xf7, 0x89, 0x5b, 0x96, 0xc8, 0xf7, 0x2c, 0x4b, + 0xfc, 0x83, 0xf0, 0xd1, 0x4c, 0xbf, 0xd5, 0x0f, 0x38, 0x9a, 0x19, 0xb4, 0x34, 0xb9, 0xa7, 0xa5, + 0x05, 0xc6, 0x42, 0x56, 0xc0, 0x58, 0x60, 0x51, 0xc9, 0x09, 0x1a, 0xda, 0xaf, 0x15, 0x3a, 0xfb, + 0x19, 0x57, 0x8d, 0x31, 0x4c, 0xe4, 0x64, 0x98, 0xf3, 0x8a, 0x5e, 0xb0, 0xac, 0x0b, 0x3b, 0xba, + 0x7d, 0x01, 0xd9, 0x07, 0x52, 0xc5, 0xd8, 0x35, 0x91, 0xc8, 0x85, 0xbe, 0x4f, 0xb3, 0xa8, 0x2f, + 0xf3, 0xa8, 0x3f, 0x3e, 0x5a, 0x5c, 0x3e, 0xcf, 0xe3, 0x59, 0x14, 0x79, 0x53, 0x80, 0xe7, 0x3d, + 0x1c, 0x9e, 0x4f, 0x4a, 0xcc, 0x60, 0xfa, 0xb8, 0xfe, 0x51, 0x80, 0xab, 0xdf, 0xd1, 0xb3, 0xf3, + 0xc9, 0x51, 0xe2, 0x8a, 0xbe, 0x3a, 0x1c, 0x76, 0x3e, 0x5f, 0x43, 0x60, 0x57, 0x00, 0xf9, 0x42, + 0xb0, 0x85, 0xe5, 0x3e, 0xb2, 0x15, 0xca, 0xa6, 0x87, 0x66, 0x04, 0xcb, 0x63, 0x41, 0xf3, 0x38, + 0xcf, 0x42, 0xb5, 0x93, 0x2a, 0xa6, 0x5f, 0x16, 0x5e, 0xa7, 0xe9, 0x2b, 0x20, 0x8f, 0xbb, 0xf1, + 0xb4, 0x4a, 0xb1, 0x45, 0x1e, 0x71, 0x36, 0xd3, 0x47, 0xf3, 0x05, 0x39, 0x98, 0xf2, 0x0f, 0xcf, + 0x92, 0xd8, 0xee, 0x01, 0x86, 0x27, 0x21, 0xdf, 0xb5, 0x76, 0xed, 0x26, 0xa6, 0x2b, 0x67, 0xf4, + 0x6d, 0x88, 0x55, 0x9e, 0x81, 0xe3, 0xf9, 0x3e, 0x93, 0x21, 0x9b, 0xd8, 0x64, 0x88, 0x36, 0x48, + 0xe3, 0x06, 0xf8, 0x17, 0x0a, 0x07, 0xe4, 0xe4, 0x30, 0xab, 0x61, 0xe7, 0x91, 0x38, 0xc6, 0x7f, + 0x58, 0x68, 0x0d, 0x61, 0x40, 0x4d, 0x92, 0xa9, 0x5c, 0x75, 0x08, 0x43, 0xf5, 0x4a, 0xb8, 0xdc, + 0xcf, 0x41, 0x2d, 0x54, 0x62, 0x91, 0x6e, 0x68, 0xab, 0x05, 0x19, 0x3d, 0x2b, 0x0b, 0x05, 0x8f, + 0xb5, 0x6a, 0x60, 0xac, 0xa1, 0x97, 0x66, 0x0e, 0xdb, 0x22, 0x8d, 0x9e, 0x62, 0x7e, 0x56, 0x12, + 0x0d, 0xfa, 0xc5, 0x09, 0x3e, 0xac, 0x5d, 0x84, 0x26, 0x0d, 0xd1, 0xcc, 0x62, 0x94, 0x0f, 0xfd, + 0x56, 0x46, 0x24, 0x86, 0x98, 0x18, 0x8b, 0xe9, 0xf7, 0x4a, 0x5f, 0xcc, 0xfa, 0x31, 0x10, 0x96, + 0x6c, 0x6b, 0x67, 0xc3, 0x6e, 0xa3, 0xff, 0x53, 0x28, 0x44, 0x63, 0x84, 0xf9, 0x2f, 0x45, 0x9b, + 0xff, 0x05, 0x90, 0x77, 0xed, 0xb6, 0x3f, 0x7c, 0xef, 0xda, 0xed, 0x21, 0x86, 0x6f, 0xe5, 0x7a, + 0x98, 0xd3, 0x5b, 0xad, 0x75, 0x7d, 0x0b, 0x97, 0xdc, 0x79, 0xb5, 0xe9, 0xd0, 0xf3, 0xd1, 0x3d, + 0xa9, 0xb1, 0x5d, 0xd1, 0x37, 0x84, 0x77, 0xe2, 0x38, 0x90, 0xa8, 0x7c, 0xc6, 0x32, 0xbc, 0xb9, + 0x43, 0x42, 0x73, 0x5b, 0x0f, 0xa3, 0x35, 0xd0, 0x37, 0xc1, 0x1d, 0x3a, 0x01, 0xbe, 0xd3, 0xd7, + 0xac, 0xdf, 0x93, 0x60, 0xc2, 0x95, 0x77, 0xb1, 0xd5, 0x42, 0x8f, 0xe6, 0x82, 0x9a, 0x44, 0xee, + 0x91, 0x3e, 0x4f, 0x78, 0x73, 0xda, 0xaf, 0xa1, 0x47, 0x3f, 0x02, 0x93, 0x50, 0x88, 0x12, 0x27, + 0x44, 0xb1, 0x3d, 0xe8, 0xd8, 0x22, 0xd2, 0x17, 0xdf, 0xa7, 0x24, 0x98, 0xf5, 0xe7, 0x11, 0x4b, + 0xd8, 0x69, 0x6e, 0xa3, 0xdb, 0x44, 0x17, 0x9a, 0x68, 0x4b, 0x93, 0x82, 0x96, 0x86, 0x7e, 0x90, + 0x49, 0xa8, 0xf2, 0x5c, 0xc9, 0x11, 0xab, 0x74, 0x89, 0x74, 0x31, 0x8e, 0x60, 0xfa, 0xc2, 0xfc, + 0x8a, 0x04, 0x50, 0xb7, 0x82, 0xb9, 0xee, 0x01, 0x24, 0xf9, 0x62, 0xe1, 0xfb, 0x12, 0x68, 0xc5, + 0xc3, 0x62, 0x93, 0xf7, 0x1c, 0x82, 0x5b, 0x6c, 0x83, 0x4a, 0x1a, 0x4b, 0x5b, 0x9f, 0x5a, 0xdc, + 0xed, 0xb4, 0x8d, 0xa6, 0xee, 0xf4, 0xee, 0x0b, 0x47, 0x8b, 0x97, 0x5c, 0x7c, 0x94, 0xc8, 0x28, + 0x0c, 0xca, 0x88, 0x90, 0xa5, 0x77, 0xd8, 0x56, 0xf2, 0x0f, 0xdb, 0x0a, 0xee, 0xf5, 0x0c, 0x20, + 0x3e, 0x06, 0xf5, 0x94, 0xe1, 0x68, 0xb5, 0x83, 0xcd, 0x05, 0x1b, 0xeb, 0xad, 0xa6, 0xbd, 0xbb, + 0x73, 0xbe, 0xcb, 0x3a, 0x35, 0xc4, 0xeb, 0x28, 0xb3, 0x74, 0x2c, 0x71, 0x4b, 0xc7, 0xe8, 0xd9, + 0xb2, 0xe8, 0xd1, 0x6f, 0x66, 0x83, 0x83, 0xe1, 0x61, 0x88, 0xa1, 0x2e, 0xd1, 0x56, 0x5c, 0xcf, + 0x2a, 0x71, 0x36, 0xc9, 0x2a, 0xf1, 0x9b, 0x85, 0x0e, 0x92, 0x0b, 0xd5, 0x6b, 0x2c, 0x3b, 0xaa, + 0x73, 0x35, 0xec, 0x44, 0xc0, 0x7b, 0x1d, 0xcc, 0x9e, 0x0f, 0xbf, 0x04, 0x10, 0xf3, 0x89, 0x7d, + 0xfc, 0x1c, 0xde, 0x92, 0x74, 0x05, 0x86, 0x67, 0x21, 0x02, 0xdd, 0x00, 0x41, 0x49, 0x64, 0x33, + 0x35, 0xd1, 0x72, 0x4a, 0x6c, 0xf9, 0xe9, 0xa3, 0xf0, 0x31, 0x09, 0xa6, 0xc9, 0x75, 0x4e, 0x0b, + 0x97, 0x88, 0x77, 0xbe, 0xa0, 0x51, 0xf2, 0x02, 0x56, 0xcc, 0x0a, 0x64, 0xdb, 0x86, 0x79, 0xc1, + 0xdf, 0x05, 0x77, 0x9f, 0xc3, 0xcb, 0x41, 0xa4, 0x3e, 0x97, 0x83, 0x04, 0xfb, 0x14, 0x41, 0xb9, + 0x07, 0xba, 0xad, 0x6e, 0x20, 0xb9, 0xf4, 0xc5, 0xf8, 0x77, 0x59, 0xc8, 0xd7, 0xb0, 0x6e, 0x37, + 0xb7, 0xd1, 0x7b, 0xa5, 0xbe, 0x53, 0x85, 0x49, 0x7e, 0xaa, 0xb0, 0x04, 0x13, 0x9b, 0x46, 0xdb, + 0xc1, 0xb6, 0xe7, 0x19, 0xc4, 0x76, 0xed, 0x5e, 0x13, 0x5f, 0x68, 0x5b, 0xcd, 0x0b, 0xf3, 0xd4, + 0x74, 0x9f, 0xf7, 0x83, 0x49, 0xcd, 0x2f, 0x91, 0x9f, 0x34, 0xff, 0x67, 0xd7, 0x20, 0xec, 0x5a, + 0xb6, 0x13, 0x15, 0x27, 0x38, 0x82, 0x4a, 0xcd, 0xb2, 0x1d, 0xcd, 0xfb, 0xd1, 0x85, 0x79, 0x73, + 0xb7, 0xdd, 0xae, 0xe3, 0x07, 0x1c, 0x7f, 0xda, 0xe6, 0xbf, 0xbb, 0xc6, 0xa2, 0xb5, 0xb9, 0xd9, + 0xc5, 0xde, 0xa2, 0x41, 0x4e, 0xa3, 0x6f, 0xca, 0x71, 0xc8, 0xb5, 0x8d, 0x1d, 0xc3, 0x9b, 0x68, + 0xe4, 0x34, 0xef, 0x45, 0xb9, 0x11, 0x0a, 0xe1, 0x1c, 0xc7, 0x63, 0xf4, 0x54, 0x9e, 0x34, 0xcd, + 0x7d, 0xe9, 0xae, 0xce, 0x5c, 0xc0, 0x97, 0xba, 0xa7, 0x26, 0xc8, 0x77, 0xf2, 0xcc, 0xbb, 0x61, + 0x8a, 0xec, 0x77, 0x78, 0x12, 0x8f, 0x9e, 0xc1, 0xda, 0xb8, 0x69, 0xd9, 0x2d, 0x5f, 0x36, 0xd1, + 0x13, 0x0c, 0x9a, 0x2f, 0xd9, 0x2e, 0x45, 0xdf, 0xc2, 0xc7, 0xe0, 0x02, 0x91, 0x77, 0xbb, 0x4d, + 0xb7, 0xe8, 0x73, 0x86, 0xb3, 0xbd, 0x86, 0x1d, 0x1d, 0xfd, 0x9d, 0xdc, 0x57, 0xe3, 0xa6, 0xff, + 0x7f, 0x8d, 0x1b, 0xa0, 0x71, 0x5e, 0x98, 0x00, 0x67, 0xd7, 0x36, 0x5d, 0x39, 0xd2, 0xc0, 0x5c, + 0x4c, 0x8a, 0x72, 0x07, 0x5c, 0x11, 0xbe, 0xf9, 0x4b, 0xa5, 0x8b, 0x74, 0xda, 0x3a, 0x45, 0xb2, + 0x47, 0x67, 0x50, 0xd6, 0xe1, 0x5a, 0xef, 0xe3, 0x4a, 0x7d, 0x6d, 0x75, 0xc5, 0xd8, 0xda, 0x6e, + 0x1b, 0x5b, 0xdb, 0x4e, 0xb7, 0x6c, 0x76, 0x1d, 0xac, 0xb7, 0xaa, 0x9b, 0x9a, 0x17, 0xe1, 0x1b, + 0x08, 0x1d, 0x91, 0xac, 0xbc, 0xe7, 0x90, 0xd8, 0xe8, 0xc6, 0x6a, 0x4a, 0x44, 0x4b, 0x79, 0x92, + 0xdb, 0x52, 0xba, 0xbb, 0xed, 0x00, 0xd3, 0xab, 0x7a, 0x30, 0x0d, 0x55, 0x7d, 0xb7, 0x4d, 0x9a, + 0x0b, 0xc9, 0x9c, 0x74, 0x9c, 0x8b, 0xe1, 0x24, 0xfd, 0x66, 0xf3, 0xff, 0xe6, 0x21, 0xb7, 0x6c, + 0xeb, 0x9d, 0x6d, 0xf4, 0x2c, 0xa6, 0x7f, 0x1e, 0x55, 0x9b, 0x08, 0xb4, 0x53, 0x1a, 0xa4, 0x9d, + 0xf2, 0x00, 0xed, 0xcc, 0x32, 0xda, 0x19, 0xbd, 0xa8, 0x7c, 0x06, 0x66, 0x9a, 0x56, 0xbb, 0x8d, + 0x9b, 0xae, 0x3c, 0xca, 0x2d, 0xb2, 0x9a, 0x33, 0xa5, 0x71, 0x69, 0x24, 0xe0, 0x1e, 0x76, 0x6a, + 0xde, 0x1a, 0xba, 0xa7, 0xf4, 0x61, 0x02, 0x7a, 0xa9, 0x04, 0x59, 0xb5, 0xb5, 0x85, 0xb9, 0x75, + 0xf6, 0x0c, 0xb3, 0xce, 0x7e, 0x12, 0xf2, 0x8e, 0x6e, 0x6f, 0x61, 0xc7, 0x5f, 0x27, 0xf0, 0xde, + 0x82, 0x38, 0x80, 0x32, 0x13, 0x07, 0xf0, 0xa7, 0x21, 0xeb, 0xca, 0x8c, 0x46, 0xd8, 0xb9, 0xb6, + 0x1f, 0xfc, 0x44, 0xf6, 0xf3, 0x6e, 0x89, 0xf3, 0x6e, 0xad, 0x35, 0xf2, 0x43, 0x2f, 0xd6, 0xb9, + 0x7d, 0x58, 0x93, 0xcb, 0x8a, 0x9a, 0x96, 0x59, 0xde, 0xd1, 0xb7, 0x30, 0xad, 0x66, 0x98, 0xe0, + 0x7f, 0x55, 0x77, 0xac, 0xfb, 0x0d, 0x1a, 0x92, 0x2f, 0x4c, 0x70, 0xab, 0xb0, 0x6d, 0xb4, 0x5a, + 0xd8, 0xa4, 0x2d, 0x9b, 0xbe, 0x9d, 0x39, 0x0d, 0x59, 0x97, 0x07, 0x57, 0x7f, 0x5c, 0x63, 0xa1, + 0x70, 0x44, 0x99, 0x71, 0x9b, 0x95, 0xd7, 0x78, 0x0b, 0x19, 0x7e, 0x4d, 0x55, 0xc4, 0x6d, 0xc7, + 0xab, 0x5c, 0xff, 0xc6, 0xf5, 0x38, 0xc8, 0x99, 0x56, 0x0b, 0x0f, 0x1c, 0x84, 0xbc, 0x5c, 0xca, + 0x13, 0x21, 0x87, 0x5b, 0x6e, 0xaf, 0x20, 0x93, 0xec, 0xa7, 0xe3, 0x65, 0xa9, 0x79, 0x99, 0x93, + 0xf9, 0x06, 0xf5, 0xe3, 0x36, 0xfd, 0x06, 0xf8, 0xcb, 0x13, 0x70, 0xd4, 0xeb, 0x03, 0x6a, 0xbb, + 0xe7, 0x5d, 0x52, 0xe7, 0x31, 0x7a, 0xb8, 0xff, 0xc0, 0x75, 0x94, 0x57, 0xf6, 0xe3, 0x90, 0xeb, + 0xee, 0x9e, 0x0f, 0x8c, 0x50, 0xef, 0x85, 0x6d, 0xba, 0xd2, 0x48, 0x86, 0x33, 0x79, 0xd8, 0xe1, + 0x8c, 0x1b, 0x9a, 0x64, 0xbf, 0xf1, 0x87, 0x03, 0x59, 0x9e, 0x24, 0xfb, 0x03, 0x59, 0xbf, 0x61, + 0xe8, 0x14, 0x4c, 0xe8, 0x9b, 0x0e, 0xb6, 0x43, 0x33, 0x91, 0xbe, 0xba, 0x43, 0xe5, 0x79, 0xbc, + 0x69, 0xd9, 0xae, 0x58, 0xa6, 0xbc, 0xa1, 0xd2, 0x7f, 0x67, 0x5a, 0x2e, 0x70, 0x3b, 0x64, 0x37, + 0xc1, 0x31, 0xd3, 0x5a, 0xc4, 0x1d, 0x2a, 0x67, 0x0f, 0xc5, 0x59, 0xd2, 0x02, 0xf6, 0x7f, 0xd8, + 0xd7, 0x95, 0xcc, 0xed, 0xef, 0x4a, 0xd0, 0x67, 0x92, 0xce, 0x99, 0x7b, 0x80, 0x1e, 0x99, 0x85, + 0xa6, 0x3c, 0x05, 0x66, 0x5a, 0xd4, 0x45, 0xab, 0x69, 0x04, 0xad, 0x24, 0xf2, 0x3f, 0x2e, 0x73, + 0xa8, 0x48, 0x59, 0x56, 0x91, 0x96, 0x61, 0x92, 0x1c, 0xc8, 0x71, 0x35, 0x29, 0xd7, 0x13, 0xaf, + 0x90, 0x4c, 0xeb, 0x82, 0x4a, 0x31, 0x62, 0x9b, 0x2f, 0xd1, 0x5f, 0xb4, 0xe0, 0xe7, 0x64, 0xb3, + 0xef, 0x78, 0x09, 0xa5, 0xdf, 0x1c, 0x7f, 0x3b, 0x0f, 0x57, 0x94, 0x6c, 0xab, 0xdb, 0x25, 0x51, + 0x28, 0x7a, 0x1b, 0xe6, 0x1b, 0x25, 0x2e, 0x22, 0xf0, 0x23, 0xba, 0xf9, 0xf5, 0x6b, 0x50, 0xe3, + 0x6b, 0x1a, 0xdf, 0x10, 0x3e, 0xca, 0x1c, 0xec, 0x3f, 0x44, 0x08, 0xfd, 0xc7, 0xa3, 0x91, 0xbc, + 0x2b, 0x23, 0x72, 0xba, 0x3a, 0xa1, 0xac, 0xd2, 0x6f, 0x2e, 0x5f, 0x96, 0xe0, 0xca, 0x5e, 0x6e, + 0x36, 0xcc, 0x6e, 0xd0, 0x60, 0xae, 0x1e, 0xd0, 0x5e, 0xf8, 0xd3, 0xb8, 0xb1, 0x77, 0xf1, 0x44, + 0xd4, 0x9d, 0x29, 0x2d, 0x62, 0xb1, 0xe4, 0x3d, 0x19, 0x91, 0xbb, 0x78, 0x12, 0x93, 0x4f, 0x5f, + 0xb8, 0x9f, 0xcd, 0xc2, 0xd1, 0x65, 0xdb, 0xda, 0xed, 0x74, 0xc3, 0x1e, 0xe8, 0xaf, 0xfb, 0x6f, + 0xb8, 0xe6, 0x45, 0x4c, 0x83, 0x6b, 0x60, 0xda, 0xa6, 0xd6, 0x5c, 0xb8, 0xfd, 0xca, 0x26, 0xb1, + 0xbd, 0x97, 0x7c, 0x90, 0xde, 0x2b, 0xec, 0x67, 0xb2, 0x5c, 0x3f, 0xd3, 0xdb, 0x73, 0xe4, 0xfa, + 0xf4, 0x1c, 0x7f, 0x25, 0x25, 0x1c, 0x54, 0x7b, 0x44, 0x14, 0xd1, 0x5f, 0x94, 0x20, 0xbf, 0x45, + 0x32, 0xd2, 0xee, 0xe2, 0xb1, 0x62, 0x35, 0x23, 0xc4, 0x35, 0xfa, 0x6b, 0x28, 0x57, 0x99, 0xd5, + 0xe1, 0x44, 0x03, 0x5c, 0x3c, 0xb7, 0xe9, 0x2b, 0xd5, 0x43, 0x59, 0x98, 0x09, 0x4a, 0x2f, 0xb7, + 0xba, 0xe8, 0x05, 0xfd, 0x35, 0x6a, 0x56, 0x44, 0xa3, 0xf6, 0xad, 0x33, 0x07, 0xa3, 0x8e, 0xcc, + 0x8c, 0x3a, 0x7d, 0x47, 0x97, 0x99, 0x88, 0xd1, 0x05, 0x3d, 0x53, 0x16, 0x8d, 0xa9, 0xcf, 0x77, + 0xad, 0xa4, 0x36, 0x8f, 0xe4, 0xc1, 0x42, 0x30, 0xb2, 0xff, 0xe0, 0x5a, 0xa5, 0xaf, 0x24, 0x1f, + 0x90, 0xe0, 0xd8, 0xfe, 0xce, 0xfc, 0x27, 0x78, 0x2f, 0x34, 0xb7, 0x4e, 0xdd, 0xc0, 0x0b, 0x8d, + 0xbc, 0xf1, 0x9b, 0x74, 0xb1, 0x47, 0x63, 0x39, 0x7b, 0x6f, 0x70, 0x27, 0x2e, 0x76, 0xf8, 0x55, + 0x90, 0x68, 0xfa, 0x02, 0xfc, 0x35, 0x19, 0xa6, 0x6a, 0xd8, 0x59, 0xd5, 0x2f, 0x59, 0xbb, 0x0e, + 0xd2, 0x45, 0xb7, 0xe7, 0x9e, 0x0c, 0xf9, 0x36, 0xf9, 0x85, 0x5e, 0x55, 0x7a, 0x4d, 0xdf, 0xfd, + 0x2d, 0xe2, 0xfb, 0xe3, 0x91, 0xd6, 0x68, 0x7e, 0xfe, 0x4c, 0xb2, 0xc8, 0xee, 0x68, 0xc0, 0xdd, + 0x48, 0xb6, 0x76, 0x12, 0xed, 0x9d, 0x46, 0x15, 0x9d, 0x3e, 0x2c, 0xcf, 0x96, 0x61, 0xb6, 0x86, + 0x9d, 0x72, 0x77, 0x49, 0xdf, 0xb3, 0x6c, 0xc3, 0xc1, 0xec, 0x5d, 0x45, 0xf1, 0xd0, 0x9c, 0x06, + 0x30, 0x82, 0xdf, 0x68, 0xa4, 0x04, 0x26, 0x05, 0xfd, 0x56, 0x52, 0x47, 0x21, 0x8e, 0x8f, 0x91, + 0x80, 0x90, 0xc8, 0xc7, 0x22, 0xae, 0xf8, 0xf4, 0x81, 0xf8, 0x92, 0x44, 0x81, 0x28, 0xda, 0xcd, + 0x6d, 0x63, 0x0f, 0xb7, 0x12, 0x02, 0xe1, 0xff, 0x16, 0x02, 0x11, 0x10, 0x4a, 0xec, 0xbe, 0xc2, + 0xf1, 0x31, 0x0a, 0xf7, 0x95, 0x38, 0x82, 0x63, 0x09, 0x76, 0xe0, 0x76, 0x3d, 0x74, 0x3d, 0xf3, + 0x2e, 0x51, 0xb1, 0x86, 0x26, 0x9b, 0xc4, 0x9a, 0x6c, 0x43, 0x75, 0x2c, 0x5e, 0xd9, 0x83, 0x74, + 0x3a, 0x9b, 0x46, 0xc7, 0xd2, 0xb7, 0xe8, 0xf4, 0x85, 0xfe, 0x1e, 0x19, 0x4e, 0x04, 0xa7, 0x80, + 0x6b, 0xd8, 0x59, 0xd4, 0xbb, 0xdb, 0xe7, 0x2d, 0xdd, 0x6e, 0xb1, 0x57, 0xd8, 0x0e, 0x7d, 0xe2, + 0x0f, 0x7d, 0x91, 0x05, 0xa1, 0xc2, 0x83, 0xd0, 0xd7, 0x55, 0xb4, 0x2f, 0x2f, 0xa3, 0xe8, 0x64, + 0x62, 0xbd, 0x59, 0x7f, 0x27, 0x00, 0xeb, 0x69, 0x1c, 0x58, 0x77, 0x0e, 0xcb, 0x62, 0xfa, 0xc0, + 0xfd, 0xa6, 0x37, 0x22, 0x30, 0x5e, 0xcd, 0xf7, 0x89, 0x02, 0x16, 0xe1, 0xd5, 0x2a, 0x47, 0x7a, + 0xb5, 0x0e, 0x35, 0x46, 0x0c, 0xf4, 0x48, 0x4e, 0x77, 0x8c, 0x38, 0x44, 0x6f, 0xe3, 0x77, 0xc8, + 0x50, 0x20, 0x61, 0x20, 0x18, 0x8f, 0x6f, 0x74, 0xbf, 0x28, 0x3a, 0xfb, 0xbc, 0xcb, 0x27, 0x92, + 0x7a, 0x97, 0xa3, 0xb7, 0x27, 0xf5, 0x21, 0xef, 0xe5, 0x76, 0x24, 0x88, 0x25, 0x72, 0x11, 0x1f, + 0xc0, 0x41, 0xfa, 0xa0, 0xfd, 0x57, 0x19, 0xc0, 0x6d, 0xd0, 0xf4, 0xec, 0xc3, 0xd3, 0x45, 0xe1, + 0xba, 0x99, 0xf5, 0xab, 0x77, 0x81, 0x3a, 0xd1, 0x03, 0x94, 0x47, 0x31, 0x3c, 0x55, 0xf1, 0x70, + 0x52, 0xdf, 0xca, 0x90, 0xab, 0x91, 0xc0, 0x92, 0xc8, 0xdb, 0x32, 0xb2, 0xec, 0xf4, 0x01, 0xf9, + 0xef, 0x12, 0xe4, 0xea, 0x56, 0x0d, 0x3b, 0x07, 0x37, 0x05, 0x12, 0x1f, 0xdb, 0x27, 0xe5, 0x8e, + 0xe2, 0xd8, 0x7e, 0x3f, 0x42, 0xe9, 0x8b, 0xee, 0xdd, 0x12, 0xcc, 0xd4, 0xad, 0x52, 0xb0, 0x38, + 0x25, 0xee, 0xab, 0x2a, 0x7e, 0x2f, 0x60, 0x50, 0xc1, 0xb0, 0x98, 0x03, 0xdd, 0x0b, 0x38, 0x98, + 0x5e, 0xfa, 0x72, 0xbb, 0x0d, 0x8e, 0x6e, 0x98, 0x2d, 0x4b, 0xc3, 0x2d, 0x8b, 0xae, 0x74, 0x2b, + 0x0a, 0x64, 0x77, 0xcd, 0x96, 0x45, 0x58, 0xce, 0x69, 0xe4, 0xd9, 0x4d, 0xb3, 0x71, 0xcb, 0xa2, + 0xbe, 0x01, 0xe4, 0x19, 0x7d, 0x43, 0x86, 0xac, 0xfb, 0xaf, 0xb8, 0xa8, 0xdf, 0x21, 0x27, 0x0c, + 0x44, 0xe0, 0x92, 0x1f, 0x89, 0x25, 0x74, 0x17, 0xb3, 0xf6, 0xef, 0x79, 0xb0, 0x5e, 0x1b, 0x55, + 0x1e, 0x23, 0x8a, 0x70, 0xcd, 0x5f, 0x39, 0x05, 0x13, 0xe7, 0xdb, 0x56, 0xf3, 0x42, 0x78, 0x5e, + 0x9e, 0xbe, 0x2a, 0x37, 0x42, 0xce, 0xd6, 0xcd, 0x2d, 0x4c, 0xf7, 0x14, 0x8e, 0xf7, 0xf4, 0x85, + 0xc4, 0xeb, 0x45, 0xf3, 0xb2, 0xa0, 0xb7, 0x27, 0x09, 0x81, 0xd0, 0xa7, 0xf2, 0xc9, 0xf4, 0x61, + 0x71, 0x88, 0x93, 0x65, 0x05, 0x98, 0x29, 0x15, 0xbd, 0x1b, 0x38, 0xd7, 0xaa, 0x67, 0xd5, 0x82, + 0x4c, 0x60, 0x76, 0x65, 0x92, 0x22, 0xcc, 0x2e, 0xf9, 0x1f, 0x5b, 0x98, 0xfb, 0x54, 0xfe, 0x30, + 0x60, 0xfe, 0x94, 0x04, 0xb3, 0xab, 0x46, 0xd7, 0x89, 0xf2, 0xf6, 0x8f, 0x89, 0x02, 0xf7, 0xc2, + 0xa4, 0xa6, 0x32, 0x57, 0x8e, 0x70, 0xf8, 0xb7, 0x44, 0xe6, 0x70, 0x5c, 0x11, 0xe3, 0x39, 0x96, + 0x42, 0x38, 0xf0, 0x6e, 0xcd, 0x13, 0x96, 0x64, 0x62, 0x43, 0x29, 0x2c, 0x64, 0xfc, 0x86, 0x52, + 0x64, 0xd9, 0xe9, 0xcb, 0xf7, 0x1b, 0x12, 0x1c, 0x73, 0x8b, 0x8f, 0x5b, 0x96, 0x8a, 0x16, 0xf3, + 0xc0, 0x65, 0xa9, 0xc4, 0x2b, 0xe3, 0xfb, 0x78, 0x19, 0xc5, 0xca, 0xf8, 0x20, 0xa2, 0x63, 0x16, + 0x73, 0xc4, 0x32, 0xec, 0x20, 0x31, 0xc7, 0x2c, 0xc3, 0x0e, 0x2f, 0xe6, 0xf8, 0xa5, 0xd8, 0x21, + 0xc5, 0x7c, 0x68, 0x0b, 0xac, 0xaf, 0x97, 0x03, 0x31, 0x47, 0xae, 0x6d, 0xc4, 0x88, 0x39, 0xf1, + 0x89, 0x5d, 0xf4, 0xce, 0x21, 0x05, 0x3f, 0xe2, 0xf5, 0x8d, 0x61, 0x60, 0x3a, 0xc4, 0x35, 0x8e, + 0x97, 0xc9, 0x30, 0x47, 0xb9, 0xe8, 0x3f, 0x65, 0x8e, 0xc1, 0x28, 0xf1, 0x94, 0x39, 0xf1, 0x19, + 0x20, 0x9e, 0xb3, 0xf1, 0x9f, 0x01, 0x8a, 0x2d, 0x3f, 0x7d, 0x70, 0xbe, 0x99, 0x85, 0x93, 0x2e, + 0x0b, 0x6b, 0x56, 0xcb, 0xd8, 0xbc, 0xe4, 0x71, 0x71, 0x56, 0x6f, 0xef, 0xe2, 0x2e, 0x7a, 0x9f, + 0x24, 0x8a, 0xd2, 0x7f, 0x04, 0xb0, 0x3a, 0xd8, 0xf6, 0x02, 0xa9, 0x51, 0xa0, 0xee, 0x88, 0xaa, + 0xec, 0xfe, 0x92, 0x82, 0xa0, 0xe8, 0x55, 0x9f, 0x88, 0xc6, 0xd0, 0x73, 0xad, 0xc2, 0xa9, 0xe0, + 0x4b, 0xaf, 0x83, 0x47, 0x66, 0xbf, 0x83, 0xc7, 0x0d, 0x20, 0xeb, 0xad, 0x56, 0x00, 0x55, 0xef, + 0x66, 0x36, 0x29, 0x53, 0x73, 0xb3, 0xb8, 0x39, 0xbb, 0x38, 0x3c, 0x9a, 0x17, 0x91, 0xb3, 0x8b, + 0x1d, 0x65, 0x1e, 0xf2, 0xde, 0x0d, 0x82, 0xc1, 0x8a, 0x7e, 0xff, 0xcc, 0x34, 0x17, 0x6f, 0xda, + 0x55, 0x79, 0x35, 0xbc, 0x2d, 0x91, 0x64, 0xfa, 0xf5, 0xd3, 0xa1, 0x9d, 0xac, 0x71, 0x0a, 0xf6, + 0xd4, 0xa1, 0x29, 0x8f, 0x67, 0x37, 0xac, 0xd8, 0xe9, 0xb4, 0x2f, 0xd5, 0x69, 0xf0, 0x95, 0x44, + 0xbb, 0x61, 0x4c, 0x0c, 0x17, 0xa9, 0x37, 0x86, 0x4b, 0xf2, 0xdd, 0x30, 0x8e, 0x8f, 0x51, 0xec, + 0x86, 0xc5, 0x11, 0x1c, 0xc3, 0x7a, 0x64, 0xce, 0xb3, 0x9a, 0x69, 0x8c, 0xda, 0x37, 0xf5, 0x3f, + 0x84, 0x06, 0xbc, 0xb3, 0x4b, 0xbf, 0xf0, 0xb5, 0xb1, 0xb1, 0xb9, 0x95, 0x27, 0x42, 0x7e, 0xd3, + 0xb2, 0x77, 0x74, 0x7f, 0xe3, 0xbe, 0xf7, 0xa4, 0x08, 0x8d, 0x0b, 0xbb, 0x44, 0xf2, 0x68, 0x34, + 0xaf, 0x3b, 0x1f, 0x79, 0x86, 0xd1, 0xa1, 0x51, 0x17, 0xdd, 0x47, 0xe5, 0x3a, 0x98, 0xa5, 0xc1, + 0x17, 0x2b, 0xb8, 0xeb, 0xe0, 0x16, 0x8d, 0x58, 0xc1, 0x27, 0x2a, 0x67, 0x60, 0x86, 0x26, 0x2c, + 0x19, 0x6d, 0xdc, 0xa5, 0x41, 0x2b, 0xb8, 0x34, 0xe5, 0x24, 0xe4, 0x8d, 0xee, 0x3d, 0x5d, 0xcb, + 0x24, 0xfe, 0xff, 0x93, 0x1a, 0x7d, 0x53, 0x6e, 0x80, 0xa3, 0x34, 0x5f, 0x60, 0xac, 0x7a, 0x07, + 0x76, 0x7a, 0x93, 0xd1, 0xe7, 0x86, 0x99, 0x38, 0x24, 0x8e, 0xc7, 0xeb, 0xa2, 0xb0, 0xdb, 0x6c, + 0x62, 0xdc, 0xa2, 0x27, 0x9b, 0xfc, 0xd7, 0x84, 0x91, 0x7a, 0x13, 0x4f, 0x33, 0x0e, 0x29, 0x54, + 0xef, 0x47, 0x4e, 0x40, 0xde, 0xbb, 0xf6, 0x02, 0xbd, 0x64, 0xae, 0xaf, 0x32, 0xce, 0xf1, 0xca, + 0xb8, 0x01, 0x33, 0xa6, 0xe5, 0x16, 0xb7, 0xae, 0xdb, 0xfa, 0x4e, 0x37, 0x6e, 0x15, 0xd1, 0xa3, + 0x1b, 0x0c, 0x19, 0x15, 0xe6, 0xb7, 0x95, 0x23, 0x1a, 0x47, 0x46, 0xf9, 0xdf, 0xe0, 0xe8, 0x79, + 0x1a, 0x01, 0xa0, 0x4b, 0x29, 0x4b, 0xd1, 0x3e, 0x76, 0x3d, 0x94, 0x17, 0xf8, 0x3f, 0x57, 0x8e, + 0x68, 0xbd, 0xc4, 0x94, 0xff, 0x00, 0x73, 0xee, 0x6b, 0xcb, 0xba, 0xe8, 0x33, 0x2e, 0x47, 0x1b, + 0x1a, 0x3d, 0xe4, 0xd7, 0xb8, 0x1f, 0x57, 0x8e, 0x68, 0x3d, 0xa4, 0x94, 0x2a, 0xc0, 0xb6, 0xb3, + 0xd3, 0xa6, 0x84, 0xb3, 0xd1, 0x2a, 0xd9, 0x43, 0x78, 0x25, 0xf8, 0x69, 0xe5, 0x88, 0xc6, 0x90, + 0x50, 0x56, 0x61, 0xca, 0x79, 0xc0, 0xa1, 0xf4, 0x72, 0xd1, 0x9b, 0xdb, 0x3d, 0xf4, 0xea, 0xfe, + 0x3f, 0x2b, 0x47, 0xb4, 0x90, 0x80, 0x52, 0x86, 0xc9, 0xce, 0x79, 0x4a, 0x2c, 0xdf, 0xe7, 0xaa, + 0xff, 0xfe, 0xc4, 0xd6, 0xcf, 0x07, 0xb4, 0x82, 0xdf, 0x5d, 0xc6, 0x9a, 0xdd, 0x3d, 0x4a, 0x6b, + 0x42, 0x98, 0xb1, 0x92, 0xff, 0x8f, 0xcb, 0x58, 0x40, 0x40, 0x29, 0xc3, 0x54, 0xd7, 0xd4, 0x3b, + 0xdd, 0x6d, 0xcb, 0xe9, 0x9e, 0x9a, 0xec, 0xf1, 0x83, 0x8c, 0xa6, 0x56, 0xa3, 0xff, 0x68, 0xe1, + 0xdf, 0xca, 0x13, 0xe1, 0xc4, 0x2e, 0xb9, 0x3e, 0x54, 0x7d, 0xc0, 0xe8, 0x3a, 0x86, 0xb9, 0xe5, + 0xc7, 0x90, 0xf5, 0x7a, 0x93, 0xfe, 0x1f, 0x95, 0x79, 0x7a, 0x22, 0x0a, 0x48, 0xdb, 0x44, 0xbd, + 0x9b, 0x71, 0x5e, 0xb1, 0xcc, 0x41, 0xa8, 0xa7, 0x40, 0xd6, 0xfd, 0x44, 0xce, 0x6c, 0xce, 0xf5, + 0x5f, 0xe8, 0xeb, 0xd5, 0x1d, 0xd2, 0x80, 0xdd, 0x9f, 0xdc, 0xb1, 0xd1, 0xb4, 0xd6, 0x6d, 0x6b, + 0xcb, 0xc6, 0xdd, 0x2e, 0x75, 0x38, 0x64, 0x52, 0xdc, 0x06, 0x6e, 0x74, 0xd7, 0x8c, 0x2d, 0xcf, + 0x7a, 0xa2, 0xfe, 0xee, 0x6c, 0x92, 0x37, 0xdb, 0xac, 0xe0, 0x8b, 0xc4, 0x21, 0x98, 0x9c, 0xbf, + 0x21, 0xb3, 0x4d, 0x3f, 0x05, 0x5d, 0x0f, 0x33, 0x6c, 0x23, 0xf3, 0xee, 0xce, 0x32, 0x42, 0xdb, + 0x8b, 0xbe, 0xa1, 0xeb, 0x60, 0x8e, 0xd7, 0x69, 0x66, 0x88, 0x91, 0xfd, 0xae, 0x10, 0x5d, 0x0b, + 0x47, 0x7b, 0x1a, 0x96, 0x1f, 0x53, 0x24, 0x13, 0xc6, 0x14, 0xb9, 0x06, 0x20, 0xd4, 0xe2, 0xbe, + 0x64, 0xae, 0x86, 0xa9, 0x40, 0x2f, 0xfb, 0x66, 0xf8, 0x5a, 0x06, 0x26, 0x7d, 0x65, 0xeb, 0x97, + 0xc1, 0x1d, 0x5f, 0x4c, 0x66, 0x03, 0x81, 0x4e, 0xb3, 0xb9, 0x34, 0x77, 0x1c, 0x09, 0xdd, 0x76, + 0xeb, 0x86, 0xd3, 0xf6, 0x8f, 0xbe, 0xf5, 0x26, 0x2b, 0xeb, 0x00, 0x06, 0xc1, 0xa8, 0x1e, 0x9e, + 0x85, 0xbb, 0x25, 0x41, 0x7b, 0xf0, 0xf4, 0x81, 0xa1, 0x71, 0xe6, 0x27, 0xe8, 0x41, 0xb5, 0x29, + 0xc8, 0xd5, 0xd6, 0x8b, 0x25, 0xb5, 0x70, 0x44, 0x99, 0x03, 0x50, 0x9f, 0xbe, 0xae, 0x6a, 0x65, + 0xb5, 0x52, 0x52, 0x0b, 0x19, 0xf4, 0x72, 0x09, 0xa6, 0x82, 0x46, 0xd0, 0xb7, 0x92, 0x2a, 0x55, + 0xad, 0x81, 0xd7, 0x13, 0xed, 0x6f, 0x54, 0xac, 0x92, 0x3d, 0x19, 0x2e, 0xdf, 0xed, 0xe2, 0x25, + 0xc3, 0xee, 0x3a, 0x9a, 0x75, 0x71, 0xc9, 0xb2, 0x83, 0xa8, 0xc9, 0xfe, 0x35, 0xfc, 0x11, 0x9f, + 0x5d, 0x8b, 0xa2, 0x85, 0xc9, 0xa1, 0x28, 0x6c, 0xd3, 0x95, 0xe1, 0x30, 0xc1, 0xa5, 0xeb, 0x78, + 0xf7, 0xde, 0x77, 0xb1, 0x66, 0x5d, 0xec, 0x16, 0xcd, 0x56, 0xc9, 0x6a, 0xef, 0xee, 0x98, 0x5d, + 0x6a, 0x13, 0x44, 0x7d, 0x76, 0xa5, 0x43, 0x2e, 0x1f, 0x9b, 0x03, 0x28, 0x55, 0x57, 0x57, 0xd5, + 0x52, 0xbd, 0x5c, 0xad, 0x14, 0x8e, 0xb8, 0xd2, 0xaa, 0x17, 0x17, 0x56, 0x5d, 0xe9, 0xfc, 0x2c, + 0x4c, 0xfa, 0x6d, 0x9a, 0x86, 0x41, 0xc9, 0xf8, 0x61, 0x50, 0x94, 0x22, 0x4c, 0xfa, 0xad, 0x9c, + 0x8e, 0x08, 0x8f, 0xee, 0x3d, 0xf6, 0xba, 0xa3, 0xdb, 0x0e, 0xf1, 0x97, 0xf6, 0x89, 0x2c, 0xe8, + 0x5d, 0xac, 0x05, 0xbf, 0x9d, 0x79, 0x1c, 0xe5, 0x40, 0x81, 0xb9, 0xe2, 0xea, 0x6a, 0xa3, 0xaa, + 0x35, 0x2a, 0xd5, 0xfa, 0x4a, 0xb9, 0xb2, 0xec, 0x8d, 0x90, 0xe5, 0xe5, 0x4a, 0x55, 0x53, 0xbd, + 0x01, 0xb2, 0x56, 0xc8, 0x78, 0x97, 0xdf, 0x2d, 0x4c, 0x42, 0xbe, 0x43, 0xa4, 0x8b, 0xbe, 0x2c, + 0x27, 0x3c, 0xef, 0x1e, 0xe0, 0x14, 0x71, 0x3d, 0x17, 0xe7, 0x73, 0x2e, 0xf5, 0x39, 0x13, 0x7a, + 0x06, 0x66, 0x3c, 0x5b, 0xae, 0x4b, 0x96, 0xef, 0xe9, 0x0d, 0xb7, 0x5c, 0x1a, 0xfa, 0x98, 0x94, + 0xe0, 0x10, 0x7c, 0x5f, 0x8e, 0x92, 0x19, 0x17, 0x7f, 0x3e, 0xcc, 0x65, 0x77, 0x0a, 0xcc, 0x95, + 0x2b, 0x75, 0x55, 0xab, 0x14, 0x57, 0x69, 0x16, 0x59, 0x39, 0x05, 0xc7, 0x2b, 0x55, 0x1a, 0xd3, + 0xaf, 0x46, 0xae, 0xd5, 0x5e, 0x5b, 0xaf, 0x6a, 0xf5, 0x42, 0x4e, 0x39, 0x09, 0x8a, 0xf7, 0xcc, + 0xdd, 0x4a, 0x9f, 0x57, 0x1e, 0x03, 0xd7, 0xae, 0x96, 0xd7, 0xca, 0xf5, 0x46, 0x75, 0xa9, 0xa1, + 0x55, 0xcf, 0xd5, 0x5c, 0x04, 0x35, 0x75, 0xb5, 0xe8, 0x2a, 0x12, 0x73, 0x09, 0xde, 0x84, 0x72, + 0x19, 0x1c, 0x25, 0x17, 0x5c, 0x92, 0x9b, 0xed, 0xbd, 0xf2, 0x26, 0x95, 0xab, 0xe0, 0x54, 0xb9, + 0x52, 0xdb, 0x58, 0x5a, 0x2a, 0x97, 0xca, 0x6a, 0xa5, 0xde, 0x58, 0x57, 0xb5, 0xb5, 0x72, 0xad, + 0xe6, 0xfe, 0x5b, 0x98, 0x22, 0x57, 0x8c, 0x79, 0x7d, 0x26, 0x7a, 0xaf, 0x0c, 0xb3, 0x67, 0xf5, + 0xb6, 0xe1, 0x0e, 0x14, 0xe4, 0xee, 0xc1, 0x9e, 0xe3, 0x22, 0x0e, 0xb9, 0xa3, 0x90, 0x3a, 0x9c, + 0x93, 0x17, 0xf4, 0x8b, 0x72, 0xc2, 0xe3, 0x22, 0x14, 0x08, 0xaf, 0xc4, 0x79, 0xae, 0xb4, 0x88, + 0xc9, 0xcd, 0x6b, 0xa5, 0x04, 0xc7, 0x45, 0xc4, 0xc9, 0x27, 0x03, 0xff, 0x15, 0xa3, 0x02, 0xbf, + 0x00, 0x33, 0x1b, 0x95, 0xe2, 0x46, 0x7d, 0xa5, 0xaa, 0x95, 0x7f, 0x86, 0x44, 0x1b, 0x9f, 0x85, + 0xa9, 0xa5, 0xaa, 0xb6, 0x50, 0x5e, 0x5c, 0x54, 0x2b, 0x85, 0x9c, 0x72, 0x39, 0x5c, 0x56, 0x53, + 0xb5, 0xb3, 0xe5, 0x92, 0xda, 0xd8, 0xa8, 0x14, 0xcf, 0x16, 0xcb, 0xab, 0xa4, 0x8f, 0xc8, 0xc7, + 0xdc, 0x9b, 0x38, 0x81, 0x7e, 0x3e, 0x0b, 0xe0, 0x55, 0xdd, 0xb5, 0xa4, 0xd9, 0xdb, 0xf5, 0xbe, + 0x90, 0x74, 0xd2, 0x10, 0x92, 0x89, 0x68, 0xbf, 0x65, 0x98, 0xb4, 0xe9, 0x07, 0xba, 0x7c, 0x32, + 0x88, 0x8e, 0xf7, 0xe8, 0x53, 0xd3, 0x82, 0xdf, 0xd1, 0xfb, 0x92, 0xcc, 0x11, 0x22, 0x19, 0x4b, + 0x86, 0xe4, 0xd2, 0x68, 0x80, 0x44, 0x2f, 0xc8, 0xc0, 0x1c, 0x5f, 0x31, 0xb7, 0x12, 0xc4, 0x98, + 0x12, 0xab, 0x04, 0xff, 0x33, 0x63, 0x64, 0x9d, 0x79, 0x02, 0x1d, 0x4e, 0xc1, 0x6f, 0x99, 0xde, + 0xc9, 0x6f, 0xdf, 0x62, 0x29, 0x64, 0x5c, 0xe6, 0x5d, 0xa3, 0xc3, 0xbb, 0x5a, 0xbd, 0xfe, 0x80, + 0x53, 0x90, 0xd1, 0xd7, 0x64, 0x98, 0xe5, 0xae, 0xef, 0x43, 0xaf, 0xcd, 0x88, 0x5c, 0xad, 0xc5, + 0x5c, 0x0c, 0x98, 0x39, 0xe8, 0xc5, 0x80, 0x67, 0x6e, 0x86, 0x09, 0x9a, 0x46, 0xe4, 0x5b, 0xad, + 0xb8, 0xa6, 0xc0, 0x51, 0x98, 0x5e, 0x56, 0xeb, 0x8d, 0x5a, 0xbd, 0xa8, 0xd5, 0xd5, 0xc5, 0x42, + 0xc6, 0x1d, 0xf8, 0xd4, 0xb5, 0xf5, 0xfa, 0x7d, 0x05, 0x29, 0xb9, 0x07, 0x5e, 0x2f, 0x23, 0x63, + 0xf6, 0xc0, 0x8b, 0x2b, 0x3e, 0xfd, 0xb9, 0xea, 0x67, 0x64, 0x28, 0x78, 0x1c, 0xa8, 0x0f, 0x74, + 0xb0, 0x6d, 0x60, 0xb3, 0x89, 0xd1, 0x05, 0x91, 0x88, 0x9f, 0xfb, 0x62, 0xe1, 0x91, 0xfe, 0x9c, + 0xb1, 0x12, 0xbd, 0x97, 0x1e, 0x03, 0x3b, 0xbb, 0xcf, 0xc0, 0xfe, 0x74, 0x52, 0x17, 0xbc, 0x5e, + 0x76, 0x47, 0x02, 0xd9, 0x27, 0x93, 0xb8, 0xe0, 0x0d, 0xe0, 0x60, 0x2c, 0x81, 0x7c, 0x23, 0xc6, + 0xdf, 0x82, 0x8c, 0x9e, 0x2f, 0xc3, 0xd1, 0x45, 0xdd, 0xc1, 0x0b, 0x97, 0xea, 0xc6, 0x0e, 0xee, + 0x3a, 0xfa, 0x4e, 0x27, 0xe2, 0x4a, 0xbc, 0xcc, 0xbe, 0x2b, 0xf1, 0x1c, 0xff, 0x0f, 0xc2, 0xa9, + 0xac, 0x85, 0x09, 0xe8, 0x5d, 0x49, 0x0f, 0xed, 0xf5, 0xf0, 0x30, 0xb2, 0x68, 0xbb, 0xc9, 0x0e, + 0xe3, 0xc5, 0x73, 0x31, 0x86, 0x1b, 0x6a, 0xa7, 0xa0, 0xe0, 0xb1, 0xc2, 0x78, 0x99, 0xfd, 0x1a, + 0xbd, 0x45, 0xb2, 0x91, 0x20, 0xa8, 0x9f, 0x1f, 0x26, 0x41, 0xe2, 0xc3, 0x24, 0x70, 0x8b, 0x96, + 0x72, 0xaf, 0x67, 0x40, 0xd2, 0xce, 0x90, 0x71, 0x29, 0x8b, 0x8e, 0xa3, 0x9a, 0x5e, 0x67, 0x18, + 0x5b, 0xfc, 0x78, 0x6e, 0x3a, 0xa3, 0x77, 0x19, 0xaa, 0xa2, 0xc8, 0xc4, 0x5f, 0xe8, 0x98, 0xd4, + 0xbf, 0x98, 0x73, 0xe9, 0x8b, 0xb9, 0xe5, 0x30, 0x3d, 0xff, 0xe2, 0x41, 0x1c, 0xa4, 0x8f, 0xc2, + 0x0f, 0x24, 0xc8, 0xd6, 0x2c, 0xdb, 0x19, 0x15, 0x06, 0x49, 0xf7, 0x44, 0x19, 0x09, 0xd4, 0xa2, + 0xe7, 0x9c, 0xe9, 0xed, 0x89, 0xc6, 0x97, 0x3f, 0x86, 0xb8, 0x88, 0x47, 0x61, 0xce, 0xe3, 0x24, + 0xb8, 0x34, 0xe4, 0xdf, 0x24, 0xaf, 0xbf, 0xba, 0x57, 0x14, 0x91, 0x33, 0x30, 0xc3, 0xec, 0x49, + 0x06, 0x17, 0x66, 0xb3, 0x69, 0xe8, 0x8d, 0x2c, 0x2e, 0x8b, 0x3c, 0x2e, 0xfd, 0x66, 0xdc, 0xc1, + 0xbd, 0x1b, 0xa3, 0xea, 0x99, 0x92, 0x84, 0x58, 0x8c, 0x29, 0x3c, 0x7d, 0x44, 0x1e, 0x94, 0x21, + 0x4f, 0x7d, 0xc2, 0x46, 0x8a, 0x40, 0xd2, 0x96, 0x11, 0x08, 0x41, 0xcc, 0x77, 0x4c, 0x1e, 0x75, + 0xcb, 0x88, 0x2f, 0x3f, 0x7d, 0x1c, 0x7e, 0x48, 0x9d, 0x1d, 0x8b, 0x7b, 0xba, 0xd1, 0xd6, 0xcf, + 0xb7, 0x13, 0x84, 0x36, 0xfe, 0x58, 0xc2, 0xe3, 0x5d, 0x41, 0x55, 0xb9, 0xf2, 0x22, 0x24, 0xfe, + 0x53, 0x30, 0x65, 0x07, 0x4b, 0x92, 0xfe, 0xe9, 0xf7, 0x1e, 0x47, 0x53, 0xfa, 0x5d, 0x0b, 0x73, + 0x26, 0x3a, 0xcb, 0x25, 0xc4, 0xcf, 0x58, 0xce, 0x9e, 0x4c, 0x17, 0x5b, 0xad, 0x25, 0xac, 0x3b, + 0xbb, 0x36, 0x6e, 0x25, 0x1a, 0x22, 0x78, 0x11, 0x4d, 0xb1, 0x92, 0xe0, 0x82, 0x0b, 0xae, 0xf2, + 0xe8, 0x3c, 0x69, 0x40, 0x6f, 0xe0, 0xf3, 0x32, 0x92, 0x2e, 0xe9, 0xad, 0x01, 0x24, 0x55, 0x0e, + 0x92, 0xa7, 0x0c, 0xc7, 0x44, 0xfa, 0x80, 0xfc, 0x86, 0x0c, 0x73, 0x9e, 0x9d, 0x30, 0x6a, 0x4c, + 0x7e, 0x3f, 0xa1, 0x0f, 0x09, 0x73, 0x2d, 0x13, 0xcb, 0xce, 0x48, 0x60, 0x49, 0xe2, 0x71, 0x22, + 0xc6, 0x47, 0xfa, 0xc8, 0x7c, 0x2e, 0x0f, 0xc0, 0xf8, 0x05, 0x7e, 0x2c, 0x1f, 0x06, 0xfa, 0x43, + 0x6f, 0xa7, 0xf3, 0x8f, 0x1a, 0x17, 0x75, 0x9a, 0xf1, 0xf9, 0x0b, 0x36, 0xa4, 0xf8, 0x44, 0xa1, + 0x51, 0xe5, 0xcf, 0x13, 0xda, 0xbc, 0xd4, 0x2b, 0x6f, 0xe0, 0xe0, 0x3e, 0x64, 0x2f, 0xf7, 0xf1, + 0x04, 0xc6, 0xef, 0x20, 0x56, 0x92, 0xa1, 0xb6, 0x3a, 0xc4, 0xcc, 0xfe, 0x14, 0x1c, 0xd7, 0xd4, + 0xe2, 0x62, 0xb5, 0xb2, 0x7a, 0x1f, 0x7b, 0x47, 0x4f, 0x41, 0x66, 0x27, 0x27, 0xa9, 0xc0, 0xf6, + 0xba, 0x84, 0x7d, 0x20, 0x2f, 0xab, 0xb8, 0xd9, 0x0a, 0xb3, 0xb8, 0x32, 0xb8, 0x57, 0x13, 0x20, + 0x7b, 0x98, 0x28, 0x3c, 0x08, 0x4c, 0x33, 0x7a, 0x9e, 0x0c, 0x85, 0xf0, 0x9a, 0x78, 0x7a, 0x19, + 0x5b, 0x95, 0x77, 0x1b, 0xec, 0x78, 0xfb, 0x4f, 0xa1, 0xdb, 0xa0, 0x9f, 0xa0, 0x5c, 0x0f, 0x73, + 0xcd, 0x6d, 0xdc, 0xbc, 0x50, 0x36, 0xfd, 0x7d, 0x75, 0x6f, 0x13, 0xb6, 0x27, 0x95, 0x07, 0xe6, + 0x5e, 0x1e, 0x18, 0x7e, 0x12, 0xcd, 0x0d, 0xd2, 0x2c, 0x53, 0x11, 0xb8, 0xfc, 0x61, 0x80, 0x4b, + 0x85, 0xc3, 0xe5, 0xf6, 0xa1, 0xa8, 0x26, 0x83, 0xa5, 0x32, 0x04, 0x2c, 0x08, 0x4e, 0x56, 0xd7, + 0xeb, 0xe5, 0x6a, 0xa5, 0xb1, 0x51, 0x53, 0x17, 0x1b, 0x0b, 0x3e, 0x38, 0xb5, 0x82, 0x8c, 0xbe, + 0x25, 0xc1, 0x84, 0xc7, 0x56, 0xb7, 0xe7, 0x5a, 0xf7, 0x78, 0x7f, 0x49, 0xf4, 0x36, 0xe1, 0xe8, + 0x07, 0x81, 0x20, 0x68, 0x39, 0x11, 0xfd, 0xd4, 0x93, 0x61, 0xc2, 0x03, 0xd9, 0x5f, 0xd1, 0x3a, + 0x1d, 0xd1, 0x4b, 0x51, 0x32, 0x9a, 0x9f, 0x5d, 0x30, 0x12, 0xc2, 0x00, 0x36, 0xd2, 0x1f, 0x59, + 0x9e, 0x99, 0xf5, 0xcc, 0xe0, 0x73, 0x86, 0xb3, 0x4d, 0xdc, 0x29, 0xd1, 0xd3, 0x44, 0x96, 0x17, + 0x6f, 0x82, 0xdc, 0x9e, 0x9b, 0x7b, 0x80, 0x6b, 0xaa, 0x97, 0x09, 0xbd, 0x42, 0x38, 0xf0, 0x26, + 0xa7, 0x9f, 0x01, 0x4f, 0x11, 0xe0, 0xac, 0x41, 0xb6, 0x6d, 0x74, 0x1d, 0x3a, 0x7e, 0xdc, 0x96, + 0x88, 0x90, 0xff, 0x50, 0x76, 0xf0, 0x8e, 0x46, 0xc8, 0xa0, 0x7b, 0x60, 0x86, 0x4d, 0x15, 0x70, + 0xcf, 0x3d, 0x05, 0x13, 0xf4, 0xd8, 0x18, 0x5d, 0x62, 0xf5, 0x5f, 0x05, 0x97, 0x35, 0x85, 0x6a, + 0x9b, 0xbe, 0x0e, 0xfc, 0x3f, 0x47, 0x61, 0x62, 0xc5, 0xe8, 0x3a, 0x96, 0x7d, 0x09, 0x3d, 0x9c, + 0x81, 0x89, 0xb3, 0xd8, 0xee, 0x1a, 0x96, 0xb9, 0xcf, 0xd5, 0xe0, 0x1a, 0x98, 0xee, 0xd8, 0x78, + 0xcf, 0xb0, 0x76, 0xbb, 0xe1, 0xe2, 0x0c, 0x9b, 0xa4, 0x20, 0x98, 0xd4, 0x77, 0x9d, 0x6d, 0xcb, + 0x0e, 0xa3, 0x4d, 0xf8, 0xef, 0xca, 0x69, 0x00, 0xef, 0xb9, 0xa2, 0xef, 0x60, 0xea, 0x40, 0xc1, + 0xa4, 0x28, 0x0a, 0x64, 0x1d, 0x63, 0x07, 0xd3, 0xf0, 0xb3, 0xe4, 0xd9, 0x15, 0x30, 0x09, 0xe5, + 0x46, 0x43, 0xe6, 0xc9, 0x9a, 0xff, 0x8a, 0xbe, 0x28, 0xc3, 0xf4, 0x32, 0x76, 0x28, 0xab, 0x5d, + 0xf4, 0xc2, 0x8c, 0xd0, 0x8d, 0x0f, 0xee, 0x18, 0xdb, 0xd6, 0xbb, 0xfe, 0x7f, 0xc1, 0x12, 0x2c, + 0x9f, 0x18, 0xc6, 0xc2, 0x95, 0xd9, 0x40, 0xd8, 0x24, 0x30, 0x9a, 0x53, 0xf6, 0xfc, 0x2e, 0x69, + 0x66, 0xba, 0x09, 0xb2, 0xff, 0x03, 0x7a, 0xb7, 0x24, 0x7a, 0xa8, 0x98, 0xca, 0x7e, 0x9e, 0xa9, + 0x4f, 0x64, 0x77, 0x34, 0xb9, 0x47, 0x73, 0xec, 0x8b, 0x71, 0xce, 0x52, 0xa2, 0x64, 0xb4, 0x20, + 0xb7, 0xe0, 0x71, 0xe4, 0xc1, 0x9c, 0xa4, 0xaf, 0x8d, 0xdf, 0x93, 0x61, 0xba, 0xb6, 0x6d, 0x5d, + 0xf4, 0xe5, 0xf8, 0xb3, 0x62, 0xc0, 0x5e, 0x05, 0x53, 0x7b, 0x3d, 0xa0, 0x86, 0x09, 0xd1, 0x77, + 0xb0, 0xa3, 0xe7, 0xca, 0x49, 0x61, 0x62, 0x98, 0x1b, 0xf9, 0x0d, 0xe9, 0xca, 0x93, 0x60, 0x82, + 0x72, 0x4d, 0x97, 0x5c, 0xe2, 0x01, 0xf6, 0x33, 0xb3, 0x15, 0xcc, 0xf2, 0x15, 0x4c, 0x86, 0x7c, + 0x74, 0xe5, 0xd2, 0x47, 0xfe, 0x4f, 0x24, 0x12, 0x8c, 0xc2, 0x07, 0xbe, 0x34, 0x02, 0xe0, 0xd1, + 0xf7, 0x33, 0xa2, 0x0b, 0x93, 0x81, 0x04, 0x02, 0x0e, 0x0e, 0x74, 0x9b, 0xcb, 0x40, 0x72, 0xe9, + 0xcb, 0xf3, 0xe5, 0x59, 0x98, 0x59, 0x34, 0x36, 0x37, 0x83, 0x4e, 0xf2, 0x45, 0x82, 0x9d, 0x64, + 0xb4, 0x3b, 0x80, 0x6b, 0xe7, 0xee, 0xda, 0x36, 0x36, 0xfd, 0x4a, 0xd1, 0xe6, 0xd4, 0x93, 0xaa, + 0xdc, 0x00, 0x47, 0xfd, 0x71, 0x81, 0xed, 0x28, 0xa7, 0xb4, 0xde, 0x64, 0xf4, 0x5d, 0xe1, 0x5d, + 0x2d, 0x5f, 0xa2, 0x6c, 0x95, 0x22, 0x1a, 0xe0, 0x1d, 0x30, 0xbb, 0xed, 0xe5, 0x26, 0x53, 0x7f, + 0xbf, 0xb3, 0x3c, 0xd9, 0x13, 0xec, 0x77, 0x0d, 0x77, 0xbb, 0xfa, 0x16, 0xd6, 0xf8, 0xcc, 0x3d, + 0xcd, 0x57, 0x4e, 0x72, 0x75, 0x95, 0xd8, 0x06, 0x99, 0x40, 0x4d, 0xc6, 0xa0, 0x1d, 0x67, 0x20, + 0xbb, 0x64, 0xb4, 0x31, 0xfa, 0x25, 0x09, 0xa6, 0x34, 0xdc, 0xb4, 0xcc, 0xa6, 0xfb, 0xc6, 0x38, + 0x07, 0xfd, 0x63, 0x46, 0xf4, 0xca, 0x46, 0x97, 0xce, 0x7c, 0x40, 0x23, 0xa2, 0xdd, 0x88, 0x5d, + 0xcd, 0x18, 0x4b, 0x6a, 0x0c, 0x17, 0x6c, 0xb8, 0x53, 0x8f, 0xcd, 0xcd, 0xb6, 0xa5, 0x73, 0x8b, + 0x5f, 0xbd, 0xa6, 0xd0, 0x8d, 0x50, 0xf0, 0xcf, 0x78, 0x58, 0xce, 0xba, 0x61, 0x9a, 0xc1, 0x21, + 0xe2, 0x7d, 0xe9, 0xfc, 0xbe, 0x6d, 0x6c, 0x1c, 0x16, 0x52, 0x77, 0x5a, 0x7a, 0x84, 0x66, 0x5f, + 0x0f, 0x73, 0xe7, 0x2f, 0x39, 0xb8, 0x4b, 0x73, 0xd1, 0x62, 0xb3, 0x5a, 0x4f, 0x2a, 0x13, 0x45, + 0x39, 0x2e, 0x5e, 0x4b, 0x4c, 0x81, 0xc9, 0x44, 0xbd, 0x32, 0xc4, 0x0c, 0xf0, 0x38, 0x14, 0x2a, + 0xd5, 0x45, 0x95, 0xf8, 0xaa, 0xf9, 0xde, 0x3f, 0x5b, 0xe8, 0xc5, 0x32, 0xcc, 0x10, 0x67, 0x12, + 0x1f, 0x85, 0x6b, 0x05, 0xe6, 0x23, 0xe8, 0x2b, 0xc2, 0x7e, 0x6c, 0xa4, 0xca, 0x6c, 0x01, 0xd1, + 0x82, 0xde, 0x34, 0xda, 0xbd, 0x82, 0xce, 0x69, 0x3d, 0xa9, 0x7d, 0x00, 0x91, 0xfb, 0x02, 0xf2, + 0xbb, 0x42, 0xce, 0x6c, 0x83, 0xb8, 0x3b, 0x2c, 0x54, 0x7e, 0x4f, 0x86, 0x69, 0x77, 0x92, 0xe2, + 0x83, 0x52, 0xe5, 0x40, 0xb1, 0xcc, 0xf6, 0xa5, 0x70, 0x59, 0xc4, 0x7f, 0x4d, 0xd4, 0x48, 0xfe, + 0x52, 0x78, 0xe6, 0x4e, 0x44, 0xc4, 0xf0, 0x32, 0x26, 0xfc, 0xde, 0x2f, 0x34, 0x9f, 0x1f, 0xc0, + 0xdc, 0x61, 0xc1, 0xf7, 0x8d, 0x1c, 0xe4, 0x37, 0x3a, 0x04, 0xb9, 0x57, 0xc8, 0x22, 0x11, 0xc9, + 0xf7, 0x1d, 0x64, 0x70, 0xcd, 0xac, 0xb6, 0xd5, 0xd4, 0xdb, 0xeb, 0xe1, 0x89, 0xb0, 0x30, 0x41, + 0xb9, 0x9d, 0xfa, 0x36, 0x7a, 0xc7, 0xe9, 0xae, 0x8f, 0x0d, 0xd6, 0x4d, 0x64, 0xc4, 0x1c, 0x1a, + 0xb9, 0x09, 0x8e, 0xb5, 0x8c, 0xae, 0x7e, 0xbe, 0x8d, 0x55, 0xb3, 0x69, 0x5f, 0xf2, 0xc4, 0x41, + 0xa7, 0x55, 0xfb, 0x3e, 0x28, 0x77, 0x42, 0xae, 0xeb, 0x5c, 0x6a, 0x7b, 0xf3, 0x44, 0xf6, 0x8c, + 0x49, 0x64, 0x51, 0x35, 0x37, 0xbb, 0xe6, 0xfd, 0xc5, 0xba, 0x28, 0x4d, 0x08, 0xde, 0xd7, 0xfc, + 0x04, 0xc8, 0x5b, 0xb6, 0xb1, 0x65, 0x78, 0xf7, 0xef, 0xcc, 0xed, 0x8b, 0x49, 0xe7, 0x99, 0x02, + 0x55, 0x92, 0x45, 0xa3, 0x59, 0x95, 0x27, 0xc1, 0x94, 0xb1, 0xa3, 0x6f, 0xe1, 0x7b, 0x0d, 0xd3, + 0x3b, 0xb1, 0x37, 0x77, 0xeb, 0xa9, 0x7d, 0xc7, 0x67, 0xe8, 0x77, 0x2d, 0xcc, 0x8a, 0xde, 0x2f, + 0x89, 0x06, 0xce, 0x21, 0x75, 0xf3, 0x40, 0x1d, 0xcb, 0xbd, 0xd5, 0xe8, 0xd5, 0x42, 0x21, 0x6d, + 0xa2, 0xd9, 0x4a, 0x7f, 0xf0, 0xfe, 0xbc, 0x04, 0x93, 0x8b, 0xd6, 0x45, 0x93, 0x28, 0xfa, 0x6d, + 0x62, 0xb6, 0x6e, 0x9f, 0x43, 0x8e, 0xfc, 0xb5, 0x90, 0xb1, 0x27, 0x1a, 0x48, 0x6d, 0xfd, 0x22, + 0x23, 0x60, 0x88, 0x6d, 0x39, 0x82, 0x97, 0xf5, 0xc5, 0x95, 0x93, 0xbe, 0x5c, 0xff, 0x54, 0x86, + 0xec, 0xa2, 0x6d, 0x75, 0xd0, 0x5b, 0x33, 0x09, 0x5c, 0x16, 0x5a, 0xb6, 0xd5, 0xa9, 0x93, 0xdb, + 0xb6, 0xc2, 0x63, 0x1c, 0x6c, 0x9a, 0x72, 0x1b, 0x4c, 0x76, 0xac, 0xae, 0xe1, 0xf8, 0xd3, 0x88, + 0xb9, 0x5b, 0x1f, 0xd5, 0xb7, 0x35, 0xaf, 0xd3, 0x4c, 0x5a, 0x90, 0xdd, 0xed, 0xb5, 0x89, 0x08, + 0x5d, 0xb9, 0xb8, 0x62, 0xf4, 0x6f, 0x1c, 0xeb, 0x49, 0x45, 0x2f, 0x61, 0x91, 0x7c, 0x0a, 0x8f, + 0xe4, 0xa3, 0xfb, 0x48, 0xd8, 0xb6, 0x3a, 0x23, 0xd9, 0x64, 0x7c, 0x65, 0x80, 0xea, 0x53, 0x39, + 0x54, 0x6f, 0x14, 0x2a, 0x33, 0x7d, 0x44, 0xdf, 0x9f, 0x05, 0x20, 0x66, 0xc6, 0x86, 0x3b, 0x01, + 0x12, 0xb3, 0xb1, 0x9e, 0x9d, 0x65, 0x64, 0x59, 0xe4, 0x65, 0xf9, 0xd8, 0x08, 0x2b, 0x86, 0x90, + 0x8f, 0x90, 0x68, 0x11, 0x72, 0xbb, 0xee, 0x67, 0x2a, 0x51, 0x41, 0x12, 0xe4, 0x55, 0xf3, 0xfe, + 0x44, 0x7f, 0x92, 0x81, 0x1c, 0x49, 0x50, 0x4e, 0x03, 0x90, 0x81, 0xdd, 0x3b, 0x10, 0x94, 0x21, + 0x43, 0x38, 0x93, 0x42, 0xb4, 0xd5, 0x68, 0xd1, 0xcf, 0x9e, 0xc9, 0x1c, 0x26, 0xb8, 0x7f, 0x93, + 0xe1, 0x9e, 0xd0, 0xa2, 0x06, 0x00, 0x93, 0xe2, 0xfe, 0x4d, 0xde, 0x56, 0xf1, 0xa6, 0x17, 0x08, + 0x39, 0xab, 0x85, 0x09, 0xc1, 0xdf, 0xab, 0xc1, 0xf5, 0x59, 0xfe, 0xdf, 0x24, 0xc5, 0x9d, 0x0c, + 0x13, 0xb5, 0x5c, 0x08, 0x8b, 0xc8, 0x93, 0x4c, 0xbd, 0xc9, 0xe8, 0x75, 0x81, 0xda, 0x2c, 0x72, + 0x6a, 0x73, 0x4b, 0x02, 0xf1, 0xa6, 0xaf, 0x3c, 0x5f, 0xcb, 0xc1, 0x54, 0xc5, 0x6a, 0x51, 0xdd, + 0x61, 0x26, 0x8c, 0x9f, 0xcc, 0x25, 0x9a, 0x30, 0x06, 0x34, 0x22, 0x14, 0xe4, 0x6e, 0x5e, 0x41, + 0xc4, 0x28, 0xb0, 0xfa, 0xa1, 0x2c, 0x40, 0x9e, 0x68, 0xef, 0xfe, 0x7b, 0x99, 0xe2, 0x48, 0x10, + 0xd1, 0x6a, 0xf4, 0xcf, 0x7f, 0x77, 0x3a, 0xf6, 0x5f, 0x20, 0x47, 0x2a, 0x18, 0xb3, 0xbb, 0xc3, + 0x57, 0x54, 0x8a, 0xaf, 0xa8, 0x1c, 0x5f, 0xd1, 0x6c, 0x6f, 0x45, 0x93, 0xac, 0x03, 0x44, 0x69, + 0x48, 0xfa, 0x3a, 0xfe, 0x0f, 0x13, 0x00, 0x15, 0x7d, 0xcf, 0xd8, 0xf2, 0x76, 0x87, 0xbf, 0xe8, + 0xcf, 0x7f, 0xe8, 0x3e, 0xee, 0x7f, 0x65, 0x06, 0xc2, 0xdb, 0x60, 0x82, 0x8e, 0x7b, 0xb4, 0x22, + 0x57, 0x73, 0x15, 0x09, 0xa9, 0x78, 0x66, 0xe9, 0x03, 0x8e, 0xe6, 0xe7, 0xe7, 0xae, 0x90, 0x95, + 0x7a, 0xae, 0x90, 0xed, 0xbf, 0x07, 0x11, 0x71, 0xb1, 0x2c, 0x7a, 0x8f, 0xb0, 0x47, 0x3f, 0xc3, + 0x0f, 0x53, 0xa3, 0x88, 0x26, 0xf8, 0x04, 0x98, 0xb0, 0x82, 0x0d, 0x6d, 0x39, 0x72, 0x1d, 0xac, + 0x6c, 0x6e, 0x5a, 0x9a, 0x9f, 0x53, 0x70, 0xf3, 0x4b, 0x88, 0x8f, 0xb1, 0x1c, 0x9a, 0x39, 0xb9, + 0xec, 0x07, 0x95, 0x72, 0xeb, 0x71, 0xce, 0x70, 0xb6, 0x57, 0x0d, 0xf3, 0x42, 0x17, 0xfd, 0x27, + 0x31, 0x0b, 0x92, 0xc1, 0x5f, 0x4a, 0x86, 0x3f, 0x1f, 0xb3, 0xa3, 0xc6, 0xa3, 0x76, 0x67, 0x14, + 0x95, 0xfe, 0xdc, 0x46, 0x00, 0x78, 0x3b, 0xe4, 0x3d, 0x46, 0x69, 0x27, 0x7a, 0x26, 0x12, 0xbf, + 0x80, 0x92, 0x46, 0xff, 0x40, 0xef, 0x0e, 0x70, 0x3c, 0xcb, 0xe1, 0xb8, 0x70, 0x20, 0xce, 0x52, + 0x87, 0xf4, 0xcc, 0xe3, 0x61, 0x82, 0x4a, 0x5a, 0x99, 0x63, 0x5b, 0x71, 0xe1, 0x88, 0x02, 0x90, + 0x5f, 0xb3, 0xf6, 0x70, 0xdd, 0x2a, 0x64, 0xdc, 0x67, 0x97, 0xbf, 0xba, 0x55, 0x90, 0xd0, 0xab, + 0x26, 0x61, 0x32, 0x88, 0xe6, 0xf3, 0x79, 0x09, 0x0a, 0x25, 0x1b, 0xeb, 0x0e, 0x5e, 0xb2, 0xad, + 0x1d, 0xaf, 0x46, 0xe2, 0xde, 0xa1, 0xbf, 0x21, 0xec, 0xe2, 0x11, 0x44, 0xd9, 0xe9, 0x2d, 0x2c, + 0x02, 0x4b, 0x6f, 0x11, 0x52, 0xf2, 0x17, 0x21, 0xd1, 0x5b, 0x84, 0x5c, 0x3e, 0x44, 0x4b, 0x49, + 0xbf, 0xa9, 0x7d, 0x5a, 0x82, 0x5c, 0xa9, 0x6d, 0x99, 0x98, 0x3d, 0xc2, 0x34, 0xf0, 0xac, 0x4c, + 0xff, 0x9d, 0x08, 0xf4, 0x4c, 0x49, 0xd4, 0xd6, 0x08, 0x05, 0xe0, 0x96, 0x2d, 0x28, 0x5b, 0xb1, + 0x41, 0x2a, 0x96, 0x74, 0xfa, 0x02, 0xfd, 0x96, 0x04, 0x53, 0x5e, 0x5c, 0x9c, 0x62, 0xbb, 0x8d, + 0x1e, 0x15, 0x0a, 0xb5, 0x4f, 0x44, 0x24, 0xf4, 0xbb, 0xc2, 0x2e, 0xfa, 0x41, 0xad, 0x02, 0xda, + 0x09, 0x02, 0x04, 0x25, 0xf3, 0x18, 0x17, 0xdb, 0x4b, 0x1b, 0xc8, 0x50, 0xfa, 0xa2, 0xfe, 0x82, + 0xe4, 0x1a, 0x00, 0xe6, 0x85, 0x75, 0x1b, 0xef, 0x19, 0xf8, 0x22, 0xba, 0x32, 0x14, 0xf6, 0xfe, + 0xa0, 0x1f, 0x6f, 0x12, 0x5e, 0xc4, 0x61, 0x48, 0x46, 0x6e, 0x65, 0x4d, 0xb7, 0xc3, 0x4c, 0xb4, + 0x17, 0xef, 0x8d, 0xc4, 0xc2, 0x90, 0xd1, 0xd8, 0xec, 0x82, 0x6b, 0x36, 0xd1, 0x5c, 0xa4, 0x2f, + 0xd8, 0x0f, 0x4d, 0xc0, 0xe4, 0x86, 0xd9, 0xed, 0xb4, 0xf5, 0xee, 0x36, 0xfa, 0x37, 0x19, 0xf2, + 0xde, 0x6d, 0x60, 0xe8, 0xa7, 0xb8, 0xd8, 0x02, 0x3f, 0xb7, 0x8b, 0x6d, 0xdf, 0x05, 0xc7, 0x7b, + 0xe9, 0x7f, 0x59, 0x39, 0x7a, 0xbf, 0x2c, 0x3a, 0x49, 0xf5, 0x0b, 0x65, 0xae, 0x85, 0xef, 0x7f, + 0x9c, 0xbd, 0x63, 0x34, 0x9d, 0x5d, 0x3b, 0xb8, 0xfa, 0xfa, 0x71, 0x62, 0x54, 0xd6, 0xbd, 0xbf, + 0xb4, 0xe0, 0x77, 0xa4, 0xc3, 0x04, 0x4d, 0xdc, 0xb7, 0x9d, 0xb4, 0xff, 0xfc, 0xed, 0x49, 0xc8, + 0xeb, 0xb6, 0x63, 0x74, 0x1d, 0xba, 0xc1, 0x4a, 0xdf, 0xdc, 0xee, 0xd2, 0x7b, 0xda, 0xb0, 0xdb, + 0x7e, 0x14, 0x92, 0x20, 0x01, 0xfd, 0x9e, 0xd0, 0xfc, 0x31, 0xbe, 0xe6, 0xc9, 0x20, 0xbf, 0x77, + 0x88, 0x35, 0xea, 0xcb, 0xe1, 0x32, 0xad, 0x58, 0x57, 0x1b, 0x5e, 0xd0, 0x8a, 0x20, 0x3e, 0x45, + 0x0b, 0xbd, 0x4b, 0x66, 0xd6, 0xef, 0x2e, 0x71, 0x63, 0x04, 0x95, 0x62, 0x38, 0x46, 0x04, 0x09, + 0x31, 0xbb, 0xd5, 0xdc, 0x22, 0xac, 0x2c, 0xbe, 0x08, 0xfb, 0xdb, 0xc2, 0xbb, 0x49, 0x81, 0x28, + 0x07, 0xac, 0x01, 0xc6, 0xdd, 0x16, 0xf4, 0x01, 0xa1, 0x9d, 0xa1, 0x41, 0x25, 0x1d, 0x22, 0x6c, + 0x6f, 0x9c, 0x80, 0x89, 0x65, 0xbd, 0xdd, 0xc6, 0xf6, 0x25, 0x77, 0x48, 0x2a, 0xf8, 0x1c, 0xae, + 0xe9, 0xa6, 0xb1, 0x89, 0xbb, 0x4e, 0x7c, 0x67, 0xf9, 0x1e, 0xe1, 0x48, 0xb4, 0xb4, 0x8c, 0xf9, + 0x5e, 0xfa, 0x11, 0x32, 0xbf, 0x19, 0xb2, 0x86, 0xb9, 0x69, 0xd1, 0x2e, 0xb3, 0x77, 0xd5, 0xde, + 0xff, 0x99, 0x4c, 0x5d, 0x48, 0x46, 0xc1, 0x60, 0xb4, 0x82, 0x5c, 0xa4, 0xdf, 0x73, 0xfe, 0x4e, + 0x16, 0x66, 0x7d, 0x26, 0xca, 0x66, 0x0b, 0x3f, 0xc0, 0x2e, 0xc5, 0xbc, 0x38, 0x2b, 0x7a, 0x1c, + 0xac, 0xb7, 0x3e, 0x84, 0x54, 0x84, 0x48, 0xeb, 0x00, 0x4d, 0xdd, 0xc1, 0x5b, 0x96, 0x6d, 0x04, + 0xfd, 0xe1, 0x13, 0x93, 0x50, 0x2b, 0x79, 0x7f, 0x5f, 0xd2, 0x18, 0x3a, 0xca, 0x9d, 0x30, 0x8d, + 0x83, 0xf3, 0xf7, 0xfe, 0x52, 0x4d, 0x2c, 0x5e, 0x6c, 0x7e, 0xf4, 0x05, 0xa1, 0x53, 0x67, 0x22, + 0xd5, 0x4c, 0x86, 0x59, 0x63, 0xb8, 0x36, 0xb4, 0x51, 0x59, 0x2b, 0x6a, 0xb5, 0x95, 0xe2, 0xea, + 0x6a, 0xb9, 0xb2, 0x1c, 0x04, 0x7e, 0x51, 0x60, 0x6e, 0xb1, 0x7a, 0xae, 0xc2, 0x44, 0xe6, 0xc9, + 0xa2, 0x75, 0x98, 0xf4, 0xe5, 0xd5, 0xcf, 0x17, 0x93, 0x95, 0x19, 0xf5, 0xc5, 0x64, 0x92, 0x5c, + 0xe3, 0xcc, 0x68, 0x06, 0x0e, 0x3a, 0xe4, 0x19, 0xfd, 0x91, 0x0e, 0x39, 0xb2, 0xa6, 0x8e, 0xde, + 0x41, 0xb6, 0x01, 0x3b, 0x6d, 0xbd, 0x89, 0xd1, 0x4e, 0x02, 0x6b, 0xdc, 0xbf, 0x1a, 0x41, 0xda, + 0x77, 0x35, 0x02, 0x79, 0xa4, 0x56, 0xdf, 0xf1, 0x7e, 0xeb, 0xf8, 0x9a, 0x97, 0x85, 0x3f, 0xa0, + 0x15, 0xbb, 0xbb, 0xe2, 0x2d, 0xff, 0x53, 0x36, 0x23, 0x54, 0x32, 0x9a, 0xa7, 0x64, 0x96, 0xa8, + 0xd8, 0x3e, 0x4c, 0x1c, 0x47, 0x63, 0xb8, 0xbe, 0x3b, 0x0b, 0xb9, 0x5a, 0xa7, 0x6d, 0x38, 0xe8, + 0x65, 0xd2, 0x48, 0x30, 0xf3, 0xae, 0xb3, 0x90, 0x07, 0x5e, 0x67, 0x11, 0xee, 0xba, 0x66, 0x05, + 0x76, 0x5d, 0xeb, 0xf8, 0x01, 0x87, 0xdf, 0x75, 0xbd, 0x8d, 0x06, 0x6f, 0xf3, 0xf6, 0x6c, 0x1f, + 0xdd, 0x47, 0xa4, 0xa4, 0x5a, 0x7d, 0xa2, 0x02, 0x9e, 0x79, 0x3c, 0x0d, 0x4e, 0x06, 0x90, 0x5f, + 0xa8, 0xd6, 0xeb, 0xd5, 0xb5, 0xc2, 0x11, 0x12, 0xd5, 0xa6, 0xba, 0xee, 0x85, 0x8a, 0x29, 0x57, + 0x2a, 0xaa, 0x56, 0x90, 0x48, 0xb8, 0xb4, 0x72, 0x7d, 0x55, 0x2d, 0xc8, 0x7c, 0x6c, 0xf3, 0x58, + 0xf3, 0x9b, 0x2f, 0x3b, 0x4d, 0xf5, 0x12, 0x33, 0xc4, 0xa3, 0xf9, 0x49, 0x5f, 0xb9, 0x7e, 0x5d, + 0x86, 0xdc, 0x1a, 0xb6, 0xb7, 0x30, 0xfa, 0xb9, 0x04, 0x9b, 0x7c, 0x9b, 0x86, 0xdd, 0xf5, 0x82, + 0xcb, 0x85, 0x9b, 0x7c, 0x6c, 0x9a, 0x72, 0x1d, 0xcc, 0x76, 0x71, 0xd3, 0x32, 0x5b, 0x7e, 0x26, + 0xaf, 0x3f, 0xe2, 0x13, 0xf9, 0x7b, 0xe5, 0x05, 0x20, 0x23, 0x8c, 0x8e, 0x64, 0xa7, 0x2e, 0x09, + 0x30, 0xfd, 0x4a, 0x4d, 0x1f, 0x98, 0xef, 0xca, 0xee, 0x4f, 0x9d, 0x4b, 0xe8, 0xa5, 0xc2, 0xbb, + 0xaf, 0x37, 0x41, 0x9e, 0xa8, 0xa9, 0x3f, 0x46, 0xf7, 0xef, 0x8f, 0x69, 0x1e, 0x65, 0x01, 0x8e, + 0x75, 0x71, 0x1b, 0x37, 0x1d, 0xdc, 0x72, 0x9b, 0xae, 0x36, 0xb0, 0x53, 0xd8, 0x9f, 0x1d, 0xfd, + 0x19, 0x0b, 0xe0, 0x1d, 0x3c, 0x80, 0xd7, 0xf7, 0x11, 0xa5, 0x5b, 0xa1, 0x68, 0x5b, 0xd9, 0xad, + 0x46, 0xad, 0x6d, 0x05, 0x8b, 0xe2, 0xfe, 0xbb, 0xfb, 0x6d, 0xdb, 0xd9, 0x69, 0x93, 0x6f, 0xf4, + 0x80, 0x81, 0xff, 0xae, 0xcc, 0xc3, 0x84, 0x6e, 0x5e, 0x22, 0x9f, 0xb2, 0x31, 0xb5, 0xf6, 0x33, + 0xa1, 0x57, 0x05, 0xc8, 0xdf, 0xc5, 0x21, 0xff, 0x58, 0x31, 0x76, 0xd3, 0x07, 0xfe, 0x17, 0x27, + 0x20, 0xb7, 0xae, 0x77, 0x1d, 0x8c, 0xfe, 0x6f, 0x59, 0x14, 0xf9, 0xeb, 0x61, 0x6e, 0xd3, 0x6a, + 0xee, 0x76, 0x71, 0x8b, 0x6f, 0x94, 0x3d, 0xa9, 0xa3, 0xc0, 0x5c, 0xb9, 0x11, 0x0a, 0x7e, 0x22, + 0x25, 0xeb, 0x6f, 0xc3, 0xef, 0x4b, 0x27, 0x91, 0xb2, 0xbb, 0xeb, 0xba, 0xed, 0x54, 0x37, 0x49, + 0x5a, 0x10, 0x29, 0x9b, 0x4d, 0xe4, 0xa0, 0xcf, 0xc7, 0x40, 0x3f, 0x11, 0x0d, 0xfd, 0xa4, 0x00, + 0xf4, 0x4a, 0x11, 0x26, 0x37, 0x8d, 0x36, 0x26, 0x3f, 0x4c, 0x91, 0x1f, 0xfa, 0x8d, 0x49, 0x44, + 0xf6, 0xc1, 0x98, 0xb4, 0x64, 0xb4, 0xb1, 0x16, 0xfc, 0xe6, 0x4f, 0x64, 0x20, 0x9c, 0xc8, 0xac, + 0x7a, 0xfe, 0xb4, 0xae, 0xe1, 0x65, 0xea, 0x3b, 0xd8, 0x5f, 0x7c, 0x33, 0xe9, 0xe1, 0x96, 0x96, + 0xee, 0xe8, 0x04, 0x8c, 0x19, 0x8d, 0x3c, 0xf3, 0x7e, 0x21, 0x72, 0xaf, 0x5f, 0xc8, 0x73, 0xe4, + 0x64, 0x3d, 0xa2, 0xcf, 0x6c, 0x44, 0x8b, 0x3a, 0xef, 0x03, 0xe4, 0x59, 0x8a, 0xc1, 0xbb, 0x0b, + 0x4c, 0x53, 0xb7, 0xb1, 0xb3, 0xce, 0x7a, 0x62, 0xe4, 0x34, 0x3e, 0x91, 0xb8, 0xf2, 0x75, 0x6b, + 0xfa, 0x0e, 0x26, 0x85, 0x95, 0xdc, 0x6f, 0xd4, 0x45, 0x6b, 0x5f, 0x7a, 0xd8, 0xff, 0xe6, 0x46, + 0xdd, 0xff, 0xf6, 0xab, 0x63, 0xfa, 0xcd, 0xf0, 0xb5, 0x59, 0x90, 0x4b, 0xbb, 0xce, 0x23, 0xba, + 0xfb, 0xfd, 0x81, 0xb0, 0x9f, 0x0b, 0xed, 0xcf, 0x22, 0x2f, 0x92, 0x1f, 0x53, 0xef, 0x9b, 0x50, + 0x4b, 0xc4, 0xfc, 0x69, 0xa2, 0xea, 0x96, 0xbe, 0x8e, 0xbc, 0x55, 0x0e, 0x1c, 0x2c, 0x1f, 0xcc, + 0x1c, 0xdc, 0x34, 0x47, 0x5e, 0xff, 0xc4, 0xf4, 0x0c, 0xc1, 0xbb, 0xdf, 0xf1, 0x64, 0xb9, 0x58, + 0x7d, 0x64, 0x7b, 0x9d, 0x88, 0x72, 0x46, 0xf3, 0x5e, 0xd0, 0xcb, 0x85, 0xdd, 0xce, 0x3d, 0xb1, + 0xc5, 0xba, 0x12, 0x26, 0xb3, 0xa9, 0xc4, 0x2e, 0x0b, 0x8d, 0x29, 0x36, 0x7d, 0xc0, 0xbe, 0xc3, + 0xba, 0x0a, 0x16, 0x0f, 0x8c, 0x18, 0x7a, 0xb5, 0xf0, 0x76, 0x94, 0x57, 0xed, 0x01, 0xeb, 0x85, + 0xc9, 0xe4, 0x2d, 0xb6, 0x59, 0x15, 0x5b, 0x70, 0xfa, 0x12, 0xff, 0xb6, 0x0c, 0x79, 0x6f, 0x0b, + 0x12, 0xbd, 0x39, 0x93, 0xe0, 0x96, 0x75, 0x87, 0x77, 0x21, 0x0c, 0xde, 0x93, 0xac, 0x39, 0x70, + 0xae, 0x86, 0xd9, 0x44, 0xae, 0x86, 0xfc, 0x39, 0x4e, 0x81, 0x76, 0xe4, 0xd5, 0x31, 0xe5, 0xe9, + 0x64, 0x92, 0x16, 0xd6, 0x97, 0xa1, 0xf4, 0xf1, 0x7e, 0x5e, 0x0e, 0x66, 0xbc, 0xa2, 0xcf, 0x19, + 0xad, 0x2d, 0xec, 0xa0, 0x77, 0x49, 0x3f, 0x3a, 0xa8, 0x2b, 0x15, 0x98, 0xb9, 0x48, 0xd8, 0x5e, + 0xd5, 0x2f, 0x59, 0xbb, 0x0e, 0x5d, 0xb9, 0xb8, 0x31, 0x76, 0xdd, 0xc3, 0xab, 0xe7, 0xbc, 0xf7, + 0x87, 0xc6, 0xfd, 0xef, 0xca, 0xd8, 0x5b, 0xf0, 0xf7, 0x1c, 0xb8, 0xf2, 0xc4, 0xc8, 0x62, 0x93, + 0x94, 0x93, 0x90, 0xdf, 0x33, 0xf0, 0xc5, 0x72, 0x8b, 0x5a, 0xb7, 0xf4, 0x0d, 0x7d, 0x58, 0x78, + 0xdf, 0x96, 0x85, 0x9b, 0xf2, 0x92, 0xae, 0x16, 0x8a, 0xed, 0xde, 0x0e, 0x64, 0x6b, 0x0c, 0x67, + 0x8a, 0xf9, 0xcb, 0x38, 0x4b, 0x09, 0x14, 0x31, 0xca, 0x70, 0xe6, 0x43, 0x79, 0xc4, 0x9e, 0x58, + 0xf1, 0x04, 0x30, 0xe2, 0x7b, 0x3a, 0xc5, 0xe2, 0x4b, 0x0c, 0x28, 0x3a, 0x7d, 0xc9, 0xbf, 0x4e, + 0x86, 0xa9, 0x1a, 0x76, 0x96, 0x0c, 0xdc, 0x6e, 0x75, 0x91, 0x7d, 0x70, 0xd3, 0xe8, 0x66, 0xc8, + 0x6f, 0x12, 0x62, 0x83, 0xce, 0x2d, 0xd0, 0x6c, 0xe8, 0xb5, 0x92, 0xe8, 0x8e, 0x30, 0x5d, 0x7d, + 0xf3, 0xb9, 0x1d, 0x09, 0x4c, 0x62, 0x1e, 0xbd, 0xf1, 0x25, 0x8f, 0x21, 0xb0, 0xad, 0x0c, 0x33, + 0xf4, 0xf6, 0xbe, 0x62, 0xdb, 0xd8, 0x32, 0xd1, 0xee, 0x08, 0x5a, 0x88, 0x72, 0x0b, 0xe4, 0x74, + 0x97, 0x1a, 0xdd, 0x7a, 0x45, 0x7d, 0x3b, 0x4f, 0x52, 0x9e, 0xe6, 0x65, 0x4c, 0x10, 0x46, 0x32, + 0x54, 0x6c, 0x9f, 0xe7, 0x31, 0x86, 0x91, 0x1c, 0x58, 0x78, 0xfa, 0x88, 0x7d, 0x55, 0x86, 0xe3, + 0x94, 0x81, 0xb3, 0xd8, 0x76, 0x8c, 0xa6, 0xde, 0xf6, 0x90, 0x7b, 0x41, 0x66, 0x14, 0xd0, 0xad, + 0xc0, 0xec, 0x1e, 0x4b, 0x96, 0x42, 0x78, 0xa6, 0x2f, 0x84, 0x1c, 0x03, 0x1a, 0xff, 0x63, 0x82, + 0x70, 0x7c, 0x9c, 0x54, 0x39, 0x9a, 0x63, 0x0c, 0xc7, 0x27, 0xcc, 0x44, 0xfa, 0x10, 0xbf, 0x84, + 0x86, 0xe6, 0x09, 0xbb, 0xcf, 0x2f, 0x0a, 0x63, 0xbb, 0x01, 0xd3, 0x04, 0x4b, 0xef, 0x47, 0xba, + 0x0c, 0x11, 0xa3, 0xc4, 0x41, 0xbf, 0x43, 0x2f, 0x0c, 0x0b, 0xfe, 0xd5, 0x58, 0x3a, 0xe8, 0x1c, + 0x40, 0xf8, 0x89, 0xed, 0xa4, 0x33, 0x51, 0x9d, 0xb4, 0x24, 0xd6, 0x49, 0xbf, 0x49, 0x38, 0x58, + 0x4a, 0x7f, 0xb6, 0x0f, 0xae, 0x1e, 0x62, 0x61, 0x32, 0x06, 0x97, 0x9e, 0xbe, 0x5e, 0xbc, 0x2a, + 0xdb, 0x7b, 0x4d, 0xfb, 0xc7, 0x46, 0x32, 0x9f, 0x62, 0xfb, 0x03, 0xb9, 0xa7, 0x3f, 0x38, 0x80, + 0x25, 0x7d, 0x03, 0x1c, 0xf5, 0x8a, 0x28, 0x05, 0x6c, 0xe5, 0xbc, 0x50, 0x10, 0x3d, 0xc9, 0xe8, + 0xe3, 0x43, 0x28, 0xc1, 0xa0, 0x3b, 0xe4, 0xe3, 0x3a, 0xb9, 0x64, 0xc6, 0x6e, 0x52, 0x05, 0x39, + 0xbc, 0xab, 0xe7, 0xbf, 0x95, 0xf5, 0xac, 0xdd, 0x0d, 0x72, 0xa7, 0x1b, 0xfa, 0x8b, 0xec, 0x28, + 0x46, 0x84, 0xbb, 0x21, 0x4b, 0x5c, 0xdc, 0xe5, 0xc8, 0x25, 0x8d, 0xb0, 0xc8, 0xf0, 0xc2, 0x3d, + 0xfc, 0x80, 0xb3, 0x72, 0x44, 0x23, 0x7f, 0x2a, 0x37, 0xc2, 0xd1, 0xf3, 0x7a, 0xf3, 0xc2, 0x96, + 0x6d, 0xed, 0x92, 0xdb, 0xaf, 0x2c, 0x7a, 0x8d, 0x16, 0xb9, 0x8e, 0x90, 0xff, 0xa0, 0xdc, 0xea, + 0x9b, 0x0e, 0xb9, 0x41, 0xa6, 0xc3, 0xca, 0x11, 0x6a, 0x3c, 0x28, 0x8f, 0x0f, 0x3a, 0x9d, 0x7c, + 0x6c, 0xa7, 0xb3, 0x72, 0xc4, 0xef, 0x76, 0x94, 0x45, 0x98, 0x6c, 0x19, 0x7b, 0x64, 0xab, 0x9a, + 0xcc, 0xba, 0x06, 0x1d, 0x5d, 0x5e, 0x34, 0xf6, 0xbc, 0x8d, 0xed, 0x95, 0x23, 0x5a, 0xf0, 0xa7, + 0xb2, 0x0c, 0x53, 0x64, 0x5b, 0x80, 0x90, 0x99, 0x4c, 0x74, 0x2c, 0x79, 0xe5, 0x88, 0x16, 0xfe, + 0xeb, 0x5a, 0x1f, 0x59, 0x72, 0xf6, 0xe3, 0x2e, 0x7f, 0xbb, 0x3d, 0x93, 0x68, 0xbb, 0xdd, 0x95, + 0x85, 0xb7, 0xe1, 0x7e, 0x12, 0x72, 0x4d, 0x22, 0x61, 0x89, 0x4a, 0xd8, 0x7b, 0x55, 0xee, 0x80, + 0xec, 0x8e, 0x6e, 0xfb, 0x93, 0xe7, 0xeb, 0x07, 0xd3, 0x5d, 0xd3, 0xed, 0x0b, 0x2e, 0x82, 0xee, + 0x5f, 0x0b, 0x13, 0x90, 0x23, 0x82, 0x0b, 0x1e, 0xd0, 0x5b, 0xb3, 0x9e, 0x19, 0x52, 0xb2, 0x4c, + 0x77, 0xd8, 0xaf, 0x5b, 0xfe, 0x01, 0x99, 0x0f, 0x67, 0x46, 0x63, 0x41, 0xf6, 0xbd, 0xd7, 0x5c, + 0x8e, 0xbc, 0xd7, 0xbc, 0xe7, 0x82, 0xdd, 0x6c, 0xef, 0x05, 0xbb, 0xe1, 0xf2, 0x41, 0x6e, 0xb0, + 0xa3, 0xca, 0x9f, 0x0d, 0x61, 0xba, 0xf4, 0x0a, 0x22, 0x7a, 0x06, 0xde, 0x36, 0x4c, 0xa6, 0xce, + 0xfe, 0x6b, 0xc2, 0x4e, 0x29, 0xa9, 0x51, 0x33, 0x80, 0xbd, 0xf4, 0xfb, 0xa6, 0xdf, 0xca, 0xc2, + 0x29, 0xef, 0x1a, 0xe7, 0x3d, 0x5c, 0xb7, 0xf8, 0xfb, 0x26, 0xd1, 0x1f, 0x8f, 0x44, 0x69, 0xfa, + 0x0c, 0x38, 0x72, 0xdf, 0x01, 0x67, 0xdf, 0x21, 0xe5, 0xec, 0x80, 0x43, 0xca, 0xb9, 0x64, 0x2b, + 0x87, 0x1f, 0x64, 0xf5, 0x67, 0x9d, 0xd7, 0x9f, 0xdb, 0x23, 0x00, 0xea, 0x27, 0x97, 0x91, 0xd8, + 0x37, 0xef, 0x08, 0x34, 0xa5, 0xc6, 0x69, 0xca, 0x5d, 0xc3, 0x33, 0x92, 0xbe, 0xb6, 0xfc, 0x7e, + 0x16, 0x2e, 0x0b, 0x99, 0xa9, 0xe0, 0x8b, 0x54, 0x51, 0x3e, 0x3f, 0x12, 0x45, 0x49, 0x1e, 0x03, + 0x21, 0x6d, 0x8d, 0xf9, 0x13, 0xe1, 0xb3, 0x43, 0xbd, 0x40, 0x05, 0xb2, 0x89, 0x50, 0x96, 0x93, + 0x90, 0xf7, 0x7a, 0x18, 0x0a, 0x0d, 0x7d, 0x4b, 0xd8, 0xdd, 0x88, 0x9d, 0x38, 0x12, 0xe5, 0x6d, + 0x0c, 0xfa, 0x43, 0xd7, 0x35, 0xea, 0xbb, 0xb6, 0x59, 0x36, 0x1d, 0x0b, 0xfd, 0xc2, 0x48, 0x14, + 0x27, 0xf0, 0x86, 0x93, 0x87, 0xf1, 0x86, 0x1b, 0x6a, 0x95, 0xc3, 0xaf, 0xc1, 0xa1, 0xac, 0x72, + 0x44, 0x14, 0x9e, 0x3e, 0x7e, 0x6f, 0x97, 0xe1, 0x24, 0x9d, 0x6c, 0x2d, 0xf0, 0x16, 0x22, 0xba, + 0x6f, 0x14, 0x40, 0x1e, 0xf7, 0xcd, 0x24, 0x7a, 0xcb, 0x19, 0x79, 0xe1, 0x4f, 0x4a, 0xc5, 0xde, + 0xef, 0xc0, 0x4d, 0x07, 0x7b, 0x38, 0x1c, 0x09, 0x52, 0x62, 0xd7, 0x3a, 0x24, 0x60, 0x23, 0x7d, + 0xcc, 0x5e, 0x24, 0x43, 0x9e, 0x5e, 0xdf, 0xbf, 0x91, 0x8a, 0xc3, 0x04, 0x1f, 0xe5, 0x59, 0x60, + 0x47, 0x2e, 0xf1, 0x25, 0xf7, 0xe9, 0xed, 0xc5, 0x1d, 0xd2, 0x2d, 0xf6, 0xdf, 0x95, 0x60, 0xba, + 0x86, 0x9d, 0x92, 0x6e, 0xdb, 0x86, 0xbe, 0x35, 0x2a, 0x8f, 0x6f, 0x51, 0xef, 0x61, 0xf4, 0xbd, + 0x8c, 0xe8, 0x79, 0x9a, 0x60, 0x21, 0xdc, 0x67, 0x35, 0x22, 0x96, 0xe0, 0xc3, 0x42, 0x67, 0x66, + 0x06, 0x51, 0x1b, 0x83, 0xc7, 0xb6, 0x04, 0x13, 0xfe, 0x59, 0xbc, 0x9b, 0xb9, 0xf3, 0x99, 0xdb, + 0xce, 0x8e, 0x7f, 0x0c, 0x86, 0x3c, 0xef, 0x3f, 0x03, 0x86, 0x5e, 0x99, 0xd0, 0x51, 0x3e, 0xfe, + 0x20, 0x61, 0xb2, 0x36, 0x96, 0xc4, 0x1d, 0xfe, 0xb0, 0x8e, 0x0e, 0xfe, 0xee, 0x04, 0x5d, 0x8e, + 0x5c, 0xd5, 0x1d, 0xfc, 0x00, 0xfa, 0xa2, 0x0c, 0x13, 0x35, 0xec, 0xb8, 0xe3, 0x2d, 0x77, 0xb9, + 0xe9, 0xb0, 0x1a, 0xae, 0x30, 0x2b, 0x1e, 0x53, 0x74, 0x0d, 0xe3, 0x1e, 0x98, 0xea, 0xd8, 0x56, + 0x13, 0x77, 0xbb, 0x74, 0xf5, 0x82, 0x75, 0x54, 0xeb, 0x37, 0xfa, 0x13, 0xd6, 0xe6, 0xd7, 0xfd, + 0x7f, 0xb4, 0xf0, 0xf7, 0xa4, 0x66, 0x80, 0x47, 0x89, 0x56, 0x70, 0xdc, 0x66, 0x40, 0x5c, 0xe1, + 0xe9, 0x03, 0xfd, 0x59, 0x19, 0x66, 0x6a, 0xd8, 0x09, 0xa4, 0x98, 0x60, 0x93, 0x23, 0x1a, 0x5e, + 0x0e, 0x4a, 0xf9, 0x60, 0x50, 0x8a, 0x5f, 0x0d, 0xc8, 0x4b, 0x33, 0x20, 0x36, 0xc6, 0xab, 0x01, + 0xc5, 0x38, 0x18, 0xc3, 0xf1, 0xb5, 0x47, 0xc3, 0x14, 0xe1, 0x85, 0x34, 0xd8, 0x5f, 0xce, 0x86, + 0x8d, 0xf7, 0x4b, 0x29, 0x35, 0xde, 0x3b, 0x21, 0xb7, 0xa3, 0xdb, 0x17, 0xba, 0xa4, 0xe1, 0x4e, + 0x8b, 0x98, 0xed, 0x6b, 0x6e, 0x76, 0xcd, 0xfb, 0xab, 0xbf, 0x9f, 0x66, 0x2e, 0x99, 0x9f, 0xe6, + 0xc3, 0x52, 0xa2, 0x91, 0xd0, 0x9b, 0x3b, 0x8c, 0xb0, 0xc9, 0x27, 0x18, 0x37, 0x63, 0xca, 0x4e, + 0x5f, 0x39, 0x5e, 0x20, 0xc3, 0xa4, 0x3b, 0x6e, 0x13, 0x7b, 0xfc, 0xdc, 0xc1, 0xd5, 0xa1, 0xbf, + 0xa1, 0x9f, 0xb0, 0x07, 0xf6, 0x25, 0x32, 0x3a, 0xf3, 0x3e, 0x41, 0x0f, 0x1c, 0x57, 0x78, 0xfa, + 0x78, 0xbc, 0xd3, 0xc3, 0x83, 0xb4, 0x07, 0xf4, 0x06, 0x19, 0xe4, 0x65, 0xec, 0x8c, 0xdb, 0x8a, + 0x7c, 0x9b, 0x70, 0x88, 0x23, 0x4e, 0x60, 0x84, 0xe7, 0xf9, 0x65, 0x3c, 0x9a, 0x06, 0x24, 0x16, + 0xdb, 0x48, 0x88, 0x81, 0xf4, 0x51, 0x7b, 0xaf, 0x87, 0x9a, 0xb7, 0xb9, 0xf0, 0xf3, 0x23, 0xe8, + 0x55, 0xc7, 0xbb, 0xf0, 0xe1, 0x0b, 0x90, 0xd0, 0x38, 0xac, 0xf6, 0xd6, 0xaf, 0xf0, 0xb1, 0x5c, + 0xc5, 0x07, 0x6e, 0x63, 0xdf, 0xc6, 0xcd, 0x0b, 0xb8, 0x85, 0xfe, 0xc3, 0xc1, 0xa1, 0x3b, 0x05, + 0x13, 0x4d, 0x8f, 0x1a, 0x01, 0x6f, 0x52, 0xf3, 0x5f, 0x13, 0xdc, 0x2b, 0xcd, 0x77, 0x44, 0xde, + 0xef, 0x63, 0xbc, 0x57, 0x5a, 0xa0, 0xf8, 0x31, 0x98, 0x2d, 0xde, 0x2c, 0xa3, 0xdc, 0xb4, 0x4c, + 0xf4, 0x9f, 0x0f, 0x0e, 0xcb, 0x55, 0x30, 0x65, 0x34, 0x2d, 0x93, 0x84, 0xa1, 0xf0, 0x0f, 0x01, + 0x05, 0x09, 0xfe, 0x57, 0x75, 0xc7, 0xba, 0xdf, 0xa0, 0xbb, 0xe6, 0x61, 0xc2, 0xb0, 0xc6, 0x84, + 0xcb, 0xfa, 0x61, 0x19, 0x13, 0x7d, 0xca, 0x4e, 0x1f, 0xb2, 0x8f, 0x87, 0xde, 0x6d, 0x5e, 0x57, + 0xf8, 0x88, 0x58, 0x05, 0x1e, 0x66, 0x38, 0x63, 0x6b, 0x71, 0x28, 0xc3, 0x59, 0x0c, 0x03, 0x63, + 0xb8, 0xb1, 0x22, 0xc4, 0x31, 0xf5, 0x35, 0xe0, 0x03, 0xa0, 0x33, 0x3a, 0xf3, 0x70, 0x48, 0x74, + 0x0e, 0xc7, 0x44, 0xfc, 0x00, 0x0d, 0x91, 0x49, 0x2d, 0x1e, 0xf4, 0x5f, 0x46, 0x01, 0xce, 0xed, + 0xc3, 0xf8, 0x2b, 0x78, 0xde, 0x0a, 0x09, 0x6e, 0xc4, 0xde, 0x27, 0x41, 0x97, 0xca, 0x18, 0xef, + 0x8a, 0x17, 0x29, 0x3f, 0x7d, 0x00, 0x9f, 0x2f, 0xc3, 0x1c, 0xf1, 0x11, 0x68, 0x63, 0xdd, 0xf6, + 0x3a, 0xca, 0x91, 0x38, 0xca, 0xbf, 0x53, 0x38, 0xc0, 0x0f, 0x2f, 0x87, 0x90, 0x8f, 0x91, 0x40, + 0x21, 0x16, 0xdd, 0x47, 0x90, 0x85, 0xb1, 0x6c, 0xa3, 0x14, 0x02, 0x16, 0xa8, 0x8a, 0x8f, 0x06, + 0x8f, 0x84, 0x1e, 0xb9, 0xbc, 0x30, 0xfc, 0xc6, 0x36, 0x66, 0x8f, 0x5c, 0x11, 0x26, 0xd2, 0xc7, + 0xe4, 0x0d, 0xb7, 0xd0, 0x05, 0xe7, 0x3a, 0xb9, 0x30, 0xfe, 0xd5, 0xd9, 0xe0, 0x44, 0xdb, 0x67, + 0x47, 0xe2, 0x81, 0x79, 0x80, 0x80, 0xf8, 0x0a, 0x64, 0x6d, 0xeb, 0xa2, 0xb7, 0xb4, 0x35, 0xab, + 0x91, 0x67, 0xef, 0x7a, 0xca, 0xf6, 0xee, 0x8e, 0xe9, 0x9d, 0x0c, 0x9d, 0xd5, 0xfc, 0x57, 0xe5, + 0x3a, 0x98, 0xbd, 0x68, 0x38, 0xdb, 0x2b, 0x58, 0x6f, 0x61, 0x5b, 0xb3, 0x2e, 0x12, 0x8f, 0xb9, + 0x49, 0x8d, 0x4f, 0xe4, 0xfd, 0x57, 0x04, 0xec, 0x4b, 0x72, 0x8b, 0xfc, 0x58, 0x8e, 0xbf, 0x25, + 0xb1, 0x3c, 0xa3, 0xb9, 0x4a, 0x5f, 0x61, 0xde, 0x27, 0xc3, 0x94, 0x66, 0x5d, 0xa4, 0x4a, 0xf2, + 0x7f, 0x1c, 0xae, 0x8e, 0x24, 0x9e, 0xe8, 0x11, 0xc9, 0x05, 0xec, 0x8f, 0x7d, 0xa2, 0x17, 0x5b, + 0xfc, 0x58, 0x4e, 0x2e, 0xcd, 0x68, 0xd6, 0xc5, 0x1a, 0x76, 0xbc, 0x16, 0x81, 0x1a, 0x23, 0x72, + 0xb2, 0x36, 0xba, 0x1e, 0x41, 0x3a, 0x0f, 0x0f, 0xde, 0x93, 0xee, 0x22, 0x04, 0x02, 0x0a, 0x58, + 0x1c, 0xf7, 0x2e, 0xc2, 0x40, 0x0e, 0xc6, 0x10, 0x23, 0x45, 0x86, 0x69, 0xcd, 0xba, 0xe8, 0x0e, + 0x0d, 0x4b, 0x46, 0xbb, 0x3d, 0x9a, 0x11, 0x32, 0xa9, 0xf1, 0xef, 0x8b, 0xc1, 0xe7, 0x62, 0xec, + 0xc6, 0xff, 0x00, 0x06, 0xd2, 0x87, 0xe1, 0x39, 0x5e, 0x63, 0xf1, 0x47, 0x68, 0x73, 0x34, 0x38, + 0x0c, 0xdb, 0x20, 0x02, 0x36, 0x0e, 0xad, 0x41, 0x44, 0x71, 0x30, 0x96, 0x9d, 0x93, 0xb9, 0x12, + 0x19, 0xe6, 0x47, 0xdb, 0x26, 0xde, 0x9d, 0xcc, 0x35, 0x91, 0x0e, 0xbb, 0x1c, 0x23, 0x23, 0x41, + 0x23, 0x81, 0x0b, 0xa2, 0x00, 0x0f, 0xe9, 0xe3, 0xf1, 0x11, 0x19, 0x66, 0x3c, 0x16, 0x1e, 0x21, + 0x56, 0xc0, 0x50, 0x8d, 0x8a, 0xad, 0xc1, 0xe1, 0x34, 0xaa, 0x18, 0x0e, 0xc6, 0x72, 0x2b, 0xa8, + 0x6b, 0xc7, 0x0d, 0x71, 0x7c, 0x3c, 0x0a, 0xc1, 0xa1, 0x8d, 0xb1, 0x11, 0x1e, 0x21, 0x1f, 0xc6, + 0x18, 0x3b, 0xa4, 0x63, 0xe4, 0xcf, 0x09, 0x5a, 0xd1, 0x28, 0x31, 0x38, 0x40, 0x53, 0x18, 0x21, + 0x0c, 0x43, 0x36, 0x85, 0x43, 0x42, 0xe2, 0x6b, 0x32, 0x80, 0xc7, 0xc0, 0x9a, 0xb5, 0x47, 0x2e, + 0xf3, 0x19, 0x41, 0x77, 0xd6, 0xeb, 0x56, 0x2f, 0x0f, 0x70, 0xab, 0x4f, 0x18, 0xc2, 0x25, 0xe9, + 0x4a, 0x20, 0x23, 0x65, 0xb7, 0x92, 0x63, 0x5f, 0x09, 0x8c, 0x2f, 0x3f, 0x7d, 0x8c, 0xbf, 0xe2, + 0x59, 0x73, 0xe1, 0x01, 0xd3, 0xdf, 0x1c, 0x09, 0xca, 0xcc, 0xec, 0x5f, 0xe6, 0x67, 0xff, 0x07, + 0xc0, 0x76, 0x58, 0x1b, 0x71, 0xd0, 0xc1, 0xd1, 0xf4, 0x6d, 0xc4, 0xc3, 0x3b, 0x20, 0xfa, 0xf3, + 0x59, 0x38, 0x4a, 0x3b, 0x91, 0x1f, 0x05, 0x88, 0x13, 0x9e, 0xc3, 0xe3, 0x3a, 0xc9, 0x01, 0x28, + 0x8f, 0x6a, 0x41, 0x2a, 0xc9, 0x52, 0xa6, 0x00, 0x7b, 0x63, 0x59, 0xdd, 0xc8, 0xab, 0x0f, 0x74, + 0x74, 0xb3, 0x25, 0x1e, 0xee, 0x77, 0x00, 0xf0, 0xfe, 0x5a, 0xa3, 0xcc, 0xaf, 0x35, 0xf6, 0x59, + 0x99, 0x4c, 0xbc, 0x73, 0x4d, 0x44, 0xe6, 0xb1, 0x3b, 0xf6, 0x9d, 0xeb, 0xe8, 0xb2, 0xd3, 0x47, + 0xe9, 0xdd, 0x32, 0x64, 0x6b, 0x96, 0xed, 0xa0, 0xe7, 0x26, 0x69, 0x9d, 0x9e, 0xe4, 0x43, 0x90, + 0xfc, 0x77, 0xa5, 0xc4, 0xdd, 0xd2, 0x7c, 0x73, 0xfc, 0x51, 0x67, 0xdd, 0xd1, 0x89, 0x57, 0xb7, + 0x5b, 0x3e, 0x73, 0x5d, 0x73, 0xd2, 0x78, 0x3a, 0x9e, 0xfc, 0x6a, 0xd1, 0x07, 0x30, 0x52, 0x8b, + 0xa7, 0x13, 0x59, 0x72, 0xfa, 0xb8, 0x3d, 0x74, 0x94, 0xfa, 0xb6, 0x2e, 0x19, 0x6d, 0x8c, 0x9e, + 0xeb, 0xb9, 0x8c, 0x54, 0xf4, 0x1d, 0x2c, 0x7e, 0x24, 0x26, 0xd6, 0xb5, 0x95, 0xc4, 0x97, 0x95, + 0xc3, 0xf8, 0xb2, 0x49, 0x1b, 0x94, 0x77, 0x00, 0xdd, 0x63, 0x69, 0xdc, 0x0d, 0x2a, 0xa6, 0xec, + 0xb1, 0xc4, 0xe9, 0x3c, 0x56, 0xc3, 0x8e, 0x67, 0x54, 0x56, 0xfd, 0x1b, 0x58, 0x7e, 0x76, 0x24, + 0x11, 0x3b, 0x83, 0x0b, 0x5e, 0xe4, 0x9e, 0x0b, 0x5e, 0xde, 0xc7, 0x82, 0xb3, 0xc6, 0x83, 0xf3, + 0xd3, 0xd1, 0x02, 0xe2, 0x99, 0x1c, 0x09, 0x4c, 0x6f, 0x0b, 0x60, 0x5a, 0xe7, 0x60, 0xba, 0x63, + 0x48, 0x2e, 0xd2, 0x07, 0xec, 0x57, 0x72, 0x70, 0xd4, 0x9b, 0xf4, 0x17, 0xcd, 0x16, 0x8d, 0xb0, + 0xfa, 0x66, 0xe9, 0x90, 0x37, 0xdb, 0xf6, 0x87, 0x60, 0xe5, 0x62, 0x39, 0xe7, 0x7a, 0x6f, 0xc7, + 0x5f, 0xf0, 0xc2, 0xb9, 0xba, 0x9d, 0x28, 0xd9, 0x69, 0x13, 0xbf, 0x21, 0x3f, 0xf8, 0x8f, 0xbf, + 0xcb, 0x68, 0x42, 0xfc, 0x2e, 0xa3, 0x3f, 0x4d, 0xb6, 0x6e, 0x47, 0x8a, 0xee, 0x11, 0x78, 0xca, + 0xb6, 0x53, 0x82, 0x15, 0x3d, 0x01, 0xee, 0x7e, 0x3c, 0xdc, 0xc9, 0xc2, 0x08, 0x22, 0x43, 0xba, + 0x93, 0x11, 0x02, 0x87, 0xe9, 0x4e, 0x36, 0x88, 0x81, 0x31, 0xdc, 0x6a, 0x9f, 0xa3, 0xbb, 0xf9, + 0xa4, 0xdd, 0xa0, 0xbf, 0x92, 0x52, 0x1f, 0xa5, 0xbf, 0x9f, 0x49, 0xe4, 0xff, 0x4c, 0xf8, 0x8a, + 0x1f, 0xa6, 0x93, 0x78, 0x34, 0xc7, 0x91, 0x1b, 0xc3, 0xba, 0x91, 0x44, 0x7c, 0xd1, 0xcf, 0x19, + 0x2d, 0x67, 0x7b, 0x44, 0x27, 0x3a, 0x2e, 0xba, 0xb4, 0xfc, 0xeb, 0x91, 0xc9, 0x0b, 0xfa, 0xd7, + 0x4c, 0xa2, 0x10, 0x52, 0x81, 0x48, 0x08, 0x5b, 0x11, 0x22, 0x4e, 0x10, 0xf8, 0x29, 0x96, 0xde, + 0x18, 0x35, 0xfa, 0xac, 0xd1, 0xc2, 0xd6, 0x23, 0x50, 0xa3, 0x09, 0x5f, 0xa3, 0xd3, 0xe8, 0x38, + 0x72, 0x3f, 0xa6, 0x1a, 0x1d, 0x88, 0x64, 0x44, 0x1a, 0x1d, 0x4b, 0x2f, 0x7d, 0x19, 0xbf, 0x72, + 0x86, 0x4e, 0xa4, 0x56, 0x0d, 0xf3, 0x02, 0xfa, 0xe7, 0xbc, 0x7f, 0x31, 0xf3, 0x39, 0xc3, 0xd9, + 0xa6, 0xb1, 0x60, 0x7e, 0x5f, 0xf8, 0x6e, 0x94, 0x21, 0xe2, 0xbd, 0xf0, 0xe1, 0xa4, 0x72, 0xfb, + 0xc2, 0x49, 0x15, 0x61, 0xd6, 0x30, 0x1d, 0x6c, 0x9b, 0x7a, 0x7b, 0xa9, 0xad, 0x6f, 0x75, 0x4f, + 0x4d, 0xf4, 0xbd, 0xbc, 0xae, 0xcc, 0xe4, 0xd1, 0xf8, 0x3f, 0xd8, 0xeb, 0x2b, 0x27, 0xf9, 0xeb, + 0x2b, 0x23, 0xa2, 0x5f, 0x4d, 0x45, 0x47, 0xbf, 0x0a, 0xa2, 0x5b, 0xc1, 0xe0, 0xe0, 0xd8, 0xa2, + 0xb6, 0x71, 0xc2, 0x70, 0x7f, 0x37, 0x0b, 0x46, 0x61, 0x0b, 0x42, 0x3f, 0xbe, 0x46, 0x4e, 0xb4, + 0xba, 0xe7, 0x2a, 0xc2, 0x7c, 0xaf, 0x12, 0x24, 0xb6, 0x50, 0xd9, 0xca, 0xcb, 0x3d, 0x95, 0x0f, + 0x4c, 0x9e, 0xac, 0x80, 0xc9, 0xc3, 0x2a, 0x55, 0x4e, 0x4c, 0xa9, 0x92, 0x2c, 0x16, 0x8a, 0xd4, + 0x76, 0x0c, 0xa7, 0x91, 0x72, 0x70, 0xcc, 0x8f, 0x76, 0xdb, 0xe9, 0x60, 0xdd, 0xd6, 0xcd, 0x26, + 0x46, 0x1f, 0x97, 0x46, 0x61, 0xf6, 0x2e, 0xc1, 0xa4, 0xd1, 0xb4, 0xcc, 0x9a, 0xf1, 0x0c, 0xff, + 0x72, 0xb9, 0xf8, 0x20, 0xeb, 0x44, 0x22, 0x65, 0xfa, 0x87, 0x16, 0xfc, 0xab, 0x94, 0x61, 0xaa, + 0xa9, 0xdb, 0x2d, 0x2f, 0x08, 0x5f, 0xae, 0xe7, 0x22, 0xa7, 0x48, 0x42, 0x25, 0xff, 0x17, 0x2d, + 0xfc, 0x5b, 0xa9, 0xf2, 0x42, 0xcc, 0xf7, 0x44, 0xf3, 0x88, 0x24, 0xb6, 0x18, 0xfe, 0xc4, 0xc9, + 0xdc, 0x95, 0x8e, 0x8d, 0xdb, 0xe4, 0x0e, 0x7a, 0xaf, 0x87, 0x98, 0xd2, 0xc2, 0x84, 0xa4, 0xcb, + 0x03, 0xa4, 0xa8, 0x7d, 0x68, 0x8c, 0x7b, 0x79, 0x40, 0x88, 0x8b, 0xf4, 0x35, 0xf3, 0x1d, 0x79, + 0x98, 0xf5, 0x7a, 0x35, 0x2a, 0x4e, 0xf4, 0x7c, 0x72, 0x85, 0xb4, 0x73, 0x2f, 0xbe, 0x84, 0x6a, + 0x07, 0x1f, 0x93, 0x0b, 0x20, 0x5f, 0x08, 0x02, 0x0e, 0xba, 0x8f, 0x49, 0xf7, 0xed, 0x7d, 0xbe, + 0xe6, 0x3d, 0x9e, 0xc6, 0xbd, 0x6f, 0x1f, 0x5f, 0x7c, 0xfa, 0xf8, 0xfc, 0xaa, 0x0c, 0x72, 0xb1, + 0xd5, 0x42, 0xcd, 0x83, 0x43, 0x71, 0x0d, 0x4c, 0xfb, 0x6d, 0x26, 0x8c, 0x01, 0xc9, 0x26, 0x25, + 0x5d, 0x04, 0x0d, 0x64, 0x53, 0x6c, 0x8d, 0x7d, 0x57, 0x21, 0xa6, 0xec, 0xf4, 0x41, 0xf9, 0xcd, + 0x09, 0xda, 0x68, 0x16, 0x2c, 0xeb, 0x02, 0x39, 0x2a, 0xf3, 0x5c, 0x19, 0x72, 0x4b, 0xd8, 0x69, + 0x6e, 0x8f, 0xa8, 0xcd, 0xec, 0xda, 0x6d, 0xbf, 0xcd, 0xec, 0xbb, 0x0f, 0x7f, 0xb0, 0x0d, 0xeb, + 0xb3, 0x35, 0x4f, 0x58, 0x1a, 0x77, 0x74, 0xe7, 0xd8, 0xd2, 0xd3, 0x07, 0xe7, 0x5f, 0x65, 0x98, + 0x0b, 0x56, 0xb8, 0x3c, 0x4c, 0x7e, 0x25, 0xf3, 0x48, 0x5b, 0xef, 0x44, 0x9f, 0x4f, 0x16, 0x22, + 0x2d, 0x90, 0x29, 0x5f, 0xb3, 0x94, 0x17, 0x16, 0x13, 0x04, 0x4f, 0x13, 0x63, 0x70, 0x0c, 0x33, + 0x78, 0x19, 0x26, 0x09, 0x43, 0x8b, 0xc6, 0x1e, 0x71, 0x1d, 0xe4, 0x16, 0x1a, 0x9f, 0x39, 0x92, + 0x85, 0xc6, 0x3b, 0xf8, 0x85, 0x46, 0xc1, 0x88, 0xc7, 0xfe, 0x3a, 0x63, 0x42, 0x5f, 0x1a, 0xf7, + 0xff, 0x91, 0x2f, 0x33, 0x26, 0xf0, 0xa5, 0x19, 0x50, 0x7e, 0xfa, 0x88, 0xbe, 0xe6, 0x3f, 0xd2, + 0xce, 0xd6, 0xdf, 0x50, 0x45, 0xff, 0xd7, 0x31, 0xc8, 0x9e, 0x75, 0x1f, 0xfe, 0x67, 0x78, 0x23, + 0xd6, 0x4b, 0x47, 0x10, 0x9c, 0xe1, 0xa9, 0x90, 0x75, 0xe9, 0xd3, 0x69, 0xcb, 0x8d, 0x62, 0xbb, + 0xbb, 0x2e, 0x23, 0x1a, 0xf9, 0x4f, 0x39, 0x09, 0xf9, 0xae, 0xb5, 0x6b, 0x37, 0x5d, 0xf3, 0xd9, + 0xd5, 0x18, 0xfa, 0x96, 0x34, 0x28, 0x29, 0x47, 0x7a, 0x7e, 0x74, 0x2e, 0xa3, 0xcc, 0x05, 0x49, + 0x32, 0x77, 0x41, 0x52, 0x82, 0xfd, 0x03, 0x01, 0xde, 0xd2, 0xd7, 0x88, 0xbf, 0x22, 0x77, 0x05, + 0xb6, 0x46, 0x05, 0x7b, 0x84, 0x58, 0x0e, 0xaa, 0x0e, 0x49, 0x1d, 0xbe, 0x79, 0xd1, 0x06, 0x71, + 0xe0, 0xc7, 0xea, 0xf0, 0x2d, 0xc0, 0xc3, 0x58, 0x4e, 0xa9, 0xe7, 0xa9, 0x93, 0xea, 0x7d, 0xa3, + 0x44, 0x37, 0xcb, 0x29, 0xfd, 0x81, 0xd0, 0x19, 0xa1, 0xf3, 0xea, 0xd0, 0xe8, 0x1c, 0x92, 0xfb, + 0xea, 0x1f, 0xc8, 0x24, 0x12, 0xa6, 0x6f, 0xe4, 0x88, 0x5f, 0x74, 0x94, 0x18, 0x22, 0x77, 0x0c, + 0xe6, 0xe2, 0x40, 0xcf, 0x0e, 0x1f, 0x1a, 0x9c, 0x17, 0x1d, 0xc3, 0xff, 0xb8, 0x43, 0x83, 0x8b, + 0x32, 0x92, 0x3e, 0x90, 0xaf, 0xf7, 0x2e, 0x16, 0x2b, 0x36, 0x1d, 0x63, 0x6f, 0xc4, 0x2d, 0x8d, + 0x1f, 0x5e, 0x12, 0x46, 0x03, 0xde, 0x27, 0x21, 0x8f, 0xc3, 0x71, 0x47, 0x03, 0x16, 0x63, 0x23, + 0x7d, 0x98, 0xfe, 0x36, 0xef, 0x4a, 0x8f, 0xae, 0xcd, 0xbc, 0x81, 0xae, 0x06, 0xe0, 0x83, 0xa3, + 0x75, 0x06, 0x66, 0x98, 0xa9, 0xbf, 0x7f, 0x61, 0x0d, 0x97, 0x96, 0xf4, 0xa0, 0x7b, 0x20, 0xb2, + 0x91, 0x2f, 0x0c, 0x24, 0x58, 0xf0, 0x15, 0x61, 0x62, 0x2c, 0xf7, 0xc1, 0xf9, 0x63, 0xd8, 0x98, + 0xb0, 0xfa, 0x7d, 0x16, 0xab, 0x2a, 0x8f, 0xd5, 0x6d, 0x22, 0x62, 0x12, 0x1b, 0xd3, 0x84, 0xe6, + 0x8d, 0x6f, 0x0f, 0xe0, 0xd2, 0x38, 0xb8, 0x9e, 0x3a, 0x34, 0x1f, 0xe9, 0x23, 0xf6, 0x32, 0xaf, + 0x3b, 0xac, 0x79, 0x26, 0xfb, 0x68, 0xba, 0x43, 0x3a, 0x1b, 0x90, 0xb9, 0xd9, 0x40, 0x42, 0x7f, + 0xfb, 0xd0, 0x8d, 0xd4, 0x67, 0x6e, 0x10, 0x44, 0xd9, 0x11, 0xfb, 0xdb, 0x0f, 0xe4, 0x20, 0x7d, + 0x70, 0xfe, 0x51, 0x06, 0x58, 0xb6, 0xad, 0xdd, 0x4e, 0xd5, 0x6e, 0x61, 0x1b, 0xfd, 0x4d, 0x38, + 0x01, 0x78, 0xf1, 0x08, 0x26, 0x00, 0xeb, 0x00, 0x5b, 0x01, 0x71, 0xaa, 0xe1, 0xb7, 0x88, 0x99, + 0xfb, 0x21, 0x53, 0x1a, 0x43, 0x83, 0xbf, 0x72, 0xf6, 0x69, 0x3c, 0xc6, 0x71, 0x7d, 0x56, 0x48, + 0x6e, 0x94, 0x13, 0x80, 0x77, 0x06, 0x58, 0xd7, 0x39, 0xac, 0xef, 0x3e, 0x00, 0x27, 0xe9, 0x63, + 0xfe, 0x4f, 0x13, 0x30, 0xed, 0x6d, 0xd7, 0x79, 0x32, 0xfd, 0xfb, 0x10, 0xf4, 0xdf, 0x1c, 0x01, + 0xe8, 0x1b, 0x30, 0x63, 0x85, 0xd4, 0xbd, 0x3e, 0x95, 0x5d, 0x80, 0x89, 0x85, 0x9d, 0xe1, 0x4b, + 0xe3, 0xc8, 0xa0, 0x8f, 0xb2, 0xc8, 0x6b, 0x3c, 0xf2, 0x77, 0xc4, 0xc8, 0x9b, 0xa1, 0x38, 0x4a, + 0xe8, 0xdf, 0x15, 0x40, 0xbf, 0xc1, 0x41, 0x5f, 0x3c, 0x08, 0x2b, 0x63, 0x08, 0xb7, 0x2f, 0x43, + 0x96, 0x9c, 0x8e, 0xfb, 0xad, 0x14, 0xe7, 0xf7, 0xa7, 0x60, 0x82, 0x34, 0xd9, 0x60, 0xde, 0xe1, + 0xbf, 0xba, 0x5f, 0xf4, 0x4d, 0x07, 0xdb, 0x81, 0xc7, 0x82, 0xff, 0xea, 0xf2, 0xe0, 0x7b, 0x25, + 0x77, 0x4f, 0xe5, 0xbd, 0x8d, 0xc8, 0x20, 0x61, 0xe8, 0x49, 0x09, 0x2b, 0xf1, 0x91, 0x9d, 0x97, + 0x1b, 0x66, 0x52, 0x32, 0x80, 0x91, 0xf4, 0x81, 0xff, 0x8b, 0x2c, 0x9c, 0xf2, 0x56, 0x95, 0x96, + 0x6c, 0x6b, 0xa7, 0xe7, 0x76, 0x2b, 0xe3, 0xe0, 0xba, 0x70, 0x3d, 0xcc, 0x39, 0x9c, 0x3f, 0x36, + 0xd5, 0x89, 0x9e, 0x54, 0xf4, 0x67, 0xac, 0x4f, 0xc5, 0xd3, 0x79, 0x24, 0x17, 0x62, 0x04, 0x18, + 0xc5, 0x7b, 0xe2, 0x85, 0x7a, 0x41, 0x46, 0x99, 0x45, 0x2a, 0x79, 0xa8, 0x35, 0xcb, 0x40, 0xa7, + 0x72, 0x22, 0x3a, 0xf5, 0xfe, 0x40, 0xa7, 0xfe, 0x03, 0xa7, 0x53, 0xcb, 0x07, 0x17, 0x49, 0xfa, + 0xba, 0xf5, 0xea, 0x60, 0x63, 0x28, 0xd8, 0xb6, 0xdb, 0x49, 0x61, 0xb3, 0x8e, 0xf5, 0x47, 0xca, + 0x72, 0xfe, 0x48, 0xfc, 0x7d, 0x14, 0x09, 0x66, 0xc2, 0x3c, 0xd7, 0x11, 0xba, 0x34, 0x07, 0x92, + 0xe1, 0x73, 0x27, 0x19, 0xad, 0xa1, 0xe6, 0xba, 0xb1, 0x05, 0x8d, 0x61, 0x6d, 0x69, 0x0e, 0xf2, + 0x4b, 0x46, 0xdb, 0xc1, 0x36, 0xfa, 0x0a, 0x9d, 0xe9, 0xbe, 0x3a, 0xc5, 0x01, 0x60, 0x11, 0xf2, + 0x9b, 0xa4, 0x34, 0x6a, 0x32, 0xdf, 0x24, 0xd6, 0x7a, 0x3c, 0x0e, 0x35, 0xfa, 0x6f, 0xd2, 0xe8, + 0x7c, 0x3d, 0x64, 0x46, 0x36, 0x45, 0x4e, 0x10, 0x9d, 0x6f, 0x30, 0x0b, 0x63, 0xb9, 0x98, 0x2a, + 0xaf, 0xe1, 0x1d, 0x77, 0x8c, 0xbf, 0x90, 0x1e, 0xc2, 0x05, 0x90, 0x8d, 0x56, 0x97, 0x74, 0x8e, + 0x53, 0x9a, 0xfb, 0x98, 0xd4, 0x57, 0xa8, 0x57, 0x54, 0x1e, 0xcb, 0xe3, 0xf6, 0x15, 0x12, 0xe2, + 0x22, 0x7d, 0xcc, 0xbe, 0x4f, 0x1c, 0x45, 0x3b, 0x6d, 0xbd, 0x89, 0x5d, 0xee, 0x53, 0x43, 0xcd, + 0xeb, 0xc9, 0xb2, 0x7e, 0x4f, 0xc6, 0xb4, 0xd3, 0xdc, 0x01, 0xda, 0xe9, 0xb0, 0xcb, 0x90, 0x81, + 0xcc, 0x49, 0xc5, 0x0f, 0x6d, 0x19, 0x32, 0x96, 0x8d, 0x31, 0x5c, 0x3b, 0xea, 0x1f, 0xa4, 0x1d, + 0x6b, 0x6b, 0x1d, 0x76, 0x93, 0x86, 0x0a, 0x6b, 0x64, 0x87, 0x66, 0x87, 0xd9, 0xa4, 0x89, 0xe6, + 0x61, 0x0c, 0x68, 0xcd, 0x51, 0xb4, 0x3e, 0x47, 0x87, 0xd1, 0x94, 0xf7, 0x49, 0xbb, 0x96, 0xed, + 0x24, 0xdb, 0x27, 0x75, 0xb9, 0xd3, 0xc8, 0x7f, 0x49, 0x0f, 0x5e, 0xf1, 0xe7, 0xaa, 0x47, 0x35, + 0x7c, 0x26, 0x38, 0x78, 0x35, 0x88, 0x81, 0xf4, 0xe1, 0x7d, 0xcb, 0x21, 0x0d, 0x9e, 0xc3, 0x36, + 0x47, 0xda, 0x06, 0x46, 0x36, 0x74, 0x0e, 0xd3, 0x1c, 0xa3, 0x79, 0x48, 0x1f, 0xaf, 0xef, 0x30, + 0x03, 0xe7, 0x9b, 0xc6, 0x38, 0x70, 0xfa, 0x2d, 0x33, 0x37, 0x64, 0xcb, 0x1c, 0x76, 0xff, 0x87, + 0xca, 0x7a, 0x74, 0x03, 0xe6, 0x30, 0xfb, 0x3f, 0x31, 0x4c, 0xa4, 0x8f, 0xf8, 0x9b, 0x65, 0xc8, + 0xd5, 0xc6, 0x3f, 0x5e, 0x0e, 0x3b, 0x17, 0x21, 0xb2, 0xaa, 0x8d, 0x6c, 0xb8, 0x1c, 0x66, 0x2e, + 0x12, 0xc9, 0xc2, 0x18, 0x02, 0xef, 0x1f, 0x85, 0x19, 0xb2, 0x24, 0xe2, 0x6f, 0xb3, 0x7e, 0x87, + 0x8e, 0x9a, 0x0f, 0xa7, 0xd8, 0x56, 0xef, 0x81, 0x49, 0x7f, 0xff, 0x8e, 0x8e, 0x9c, 0xf3, 0x62, + 0xed, 0xd3, 0xe7, 0x52, 0x0b, 0xfe, 0x3f, 0x90, 0x33, 0xc4, 0xc8, 0xf7, 0x6a, 0x87, 0x75, 0x86, + 0x38, 0xd4, 0xfd, 0xda, 0x3f, 0x0d, 0x47, 0xd4, 0xff, 0x9c, 0x1e, 0xe6, 0xbd, 0xfb, 0xb8, 0xd9, + 0x3e, 0xfb, 0xb8, 0x1f, 0x67, 0xb1, 0xac, 0xf1, 0x58, 0xde, 0x29, 0x2a, 0xc2, 0x11, 0x8e, 0xb5, + 0xef, 0x0e, 0xe0, 0x3c, 0xcb, 0xc1, 0xb9, 0x70, 0x20, 0x5e, 0xc6, 0x70, 0xf0, 0x31, 0x1b, 0x8e, + 0xb9, 0x9f, 0x48, 0xb1, 0x1d, 0xf7, 0x9c, 0xaa, 0xc8, 0xee, 0x3b, 0x55, 0xc1, 0xb5, 0xf4, 0xdc, + 0x01, 0x5b, 0xfa, 0x27, 0x58, 0xed, 0xa8, 0xf3, 0xda, 0xf1, 0x54, 0x71, 0x44, 0x46, 0x37, 0x32, + 0xbf, 0x27, 0x50, 0x8f, 0x73, 0x9c, 0x7a, 0x94, 0x0e, 0xc6, 0x4c, 0xfa, 0xfa, 0xf1, 0x87, 0xfe, + 0x84, 0xf6, 0x90, 0xdb, 0xfb, 0xb0, 0x5b, 0xc5, 0x9c, 0x10, 0x47, 0x36, 0x72, 0x0f, 0xb3, 0x55, + 0x3c, 0x88, 0x93, 0x31, 0xc4, 0x62, 0x9b, 0x85, 0x69, 0xc2, 0xd3, 0x39, 0xa3, 0xb5, 0x85, 0x1d, + 0xf4, 0x1a, 0xcf, 0x47, 0xd1, 0x8f, 0x7c, 0x39, 0xa2, 0xf0, 0x44, 0x51, 0xe7, 0x5d, 0x93, 0x7a, + 0x74, 0x78, 0x4c, 0xce, 0x33, 0x0c, 0x8e, 0x3b, 0x82, 0xe2, 0x40, 0x0e, 0xd2, 0x87, 0xec, 0xa3, + 0x9e, 0xbb, 0xcd, 0xaa, 0x7e, 0xc9, 0xda, 0x75, 0xd0, 0x83, 0x23, 0xe8, 0xa0, 0x17, 0x20, 0xdf, + 0x26, 0xd4, 0xe8, 0xb1, 0x8c, 0xf8, 0xe9, 0x0e, 0x15, 0x81, 0x57, 0xbe, 0x46, 0xff, 0x4c, 0x7a, + 0x36, 0x23, 0x94, 0xa3, 0x47, 0x67, 0xdc, 0x67, 0x33, 0x06, 0x94, 0x3f, 0x96, 0x3b, 0x76, 0x26, + 0xdd, 0xd2, 0x8d, 0x1d, 0xc3, 0x19, 0x51, 0x04, 0x87, 0xb6, 0x4b, 0xcb, 0x8f, 0xe0, 0x40, 0x5e, + 0x92, 0x9e, 0x18, 0x65, 0xa4, 0xe2, 0xfe, 0x3e, 0xee, 0x13, 0xa3, 0xf1, 0xc5, 0xa7, 0x8f, 0xc9, + 0xaf, 0x7b, 0x2d, 0xeb, 0xac, 0xe7, 0x7c, 0x9b, 0xa2, 0x5f, 0xef, 0xd0, 0x8d, 0xc5, 0x63, 0xed, + 0xf0, 0x1a, 0x4b, 0xdf, 0xf2, 0xd3, 0x07, 0xe6, 0xbf, 0xfd, 0x24, 0xe4, 0x16, 0xf1, 0xf9, 0xdd, + 0x2d, 0x74, 0x07, 0x4c, 0xd6, 0x6d, 0x8c, 0xcb, 0xe6, 0xa6, 0xe5, 0x4a, 0xd7, 0x71, 0x9f, 0x7d, + 0x48, 0xe8, 0x9b, 0x8b, 0xc7, 0x36, 0xd6, 0x5b, 0xe1, 0xf9, 0x33, 0xff, 0x15, 0xbd, 0x54, 0x82, + 0x6c, 0xcd, 0xd1, 0x1d, 0x34, 0x15, 0x60, 0x8b, 0x1e, 0x64, 0xb1, 0xb8, 0x83, 0xc7, 0xe2, 0x7a, + 0x4e, 0x16, 0x84, 0x83, 0x79, 0xf7, 0xff, 0x08, 0x00, 0x10, 0x4c, 0xde, 0xdf, 0xb5, 0x4c, 0x37, + 0x87, 0x7f, 0x04, 0xd2, 0x7f, 0x47, 0xaf, 0x0a, 0xc4, 0x7d, 0x17, 0x27, 0xee, 0xc7, 0x8a, 0x15, + 0x31, 0x86, 0x95, 0x36, 0x09, 0xa6, 0x5c, 0xd1, 0xae, 0x60, 0xbd, 0xd5, 0x45, 0x3f, 0x11, 0x2a, + 0x7f, 0x84, 0x98, 0xd1, 0x07, 0x84, 0x83, 0x71, 0x7a, 0xb5, 0x0a, 0x88, 0x47, 0x7b, 0x74, 0xf8, + 0x9b, 0xff, 0x12, 0x1f, 0x8c, 0xe4, 0x66, 0xc8, 0x1a, 0xe6, 0xa6, 0x45, 0xfd, 0x0b, 0xaf, 0x8c, + 0xa0, 0xed, 0xea, 0x84, 0x46, 0x32, 0x0a, 0x46, 0xea, 0x8c, 0x67, 0x6b, 0x2c, 0x97, 0xde, 0x65, + 0xdd, 0xd2, 0xd1, 0xff, 0x3e, 0x50, 0xd8, 0x8a, 0x02, 0xd9, 0x8e, 0xee, 0x6c, 0xd3, 0xa2, 0xc9, + 0xb3, 0x6b, 0x23, 0xef, 0x9a, 0xba, 0x69, 0x99, 0x97, 0x76, 0x8c, 0x67, 0x04, 0x77, 0xeb, 0x72, + 0x69, 0x2e, 0xe7, 0x5b, 0xd8, 0xc4, 0xb6, 0xee, 0xe0, 0xda, 0xde, 0x16, 0x99, 0x63, 0x4d, 0x6a, + 0x6c, 0x52, 0x62, 0xfd, 0x77, 0x39, 0x8e, 0xd6, 0xff, 0x4d, 0xa3, 0x8d, 0x49, 0xa4, 0x26, 0xaa, + 0xff, 0xfe, 0x7b, 0x22, 0xfd, 0xef, 0x53, 0x44, 0xfa, 0x68, 0xfc, 0x9b, 0x04, 0x33, 0x35, 0x57, + 0xe1, 0x6a, 0xbb, 0x3b, 0x3b, 0xba, 0x7d, 0x09, 0x5d, 0x1b, 0xa2, 0xc2, 0xa8, 0x66, 0x86, 0xf7, + 0x4b, 0xf9, 0x03, 0xe1, 0x6b, 0xa5, 0x69, 0xd3, 0x66, 0x4a, 0x48, 0xdc, 0x0e, 0x1e, 0x0f, 0x39, + 0x57, 0xbd, 0x7d, 0x8f, 0xcb, 0xd8, 0x86, 0xe0, 0xe5, 0x14, 0x8c, 0x68, 0x35, 0x90, 0xb7, 0x31, + 0x44, 0xd3, 0x90, 0xe0, 0x68, 0xcd, 0xd1, 0x9b, 0x17, 0x96, 0x2d, 0xdb, 0xda, 0x75, 0x0c, 0x13, + 0x77, 0xd1, 0xa3, 0x42, 0x04, 0x7c, 0xfd, 0xcf, 0x84, 0xfa, 0x8f, 0x7e, 0x98, 0x11, 0x1d, 0x45, + 0x83, 0x6e, 0x95, 0x25, 0x1f, 0x11, 0xa0, 0x4a, 0x6c, 0x5c, 0x14, 0xa1, 0x98, 0xbe, 0xd0, 0xde, + 0x24, 0x43, 0x41, 0x7d, 0xa0, 0x63, 0xd9, 0xce, 0xaa, 0xd5, 0xd4, 0xdb, 0x5d, 0xc7, 0xb2, 0x31, + 0xaa, 0xc6, 0x4a, 0xcd, 0xed, 0x61, 0x5a, 0x56, 0x33, 0x1c, 0x1c, 0xe9, 0x1b, 0xab, 0x76, 0x32, + 0xaf, 0xe3, 0x1f, 0x15, 0xde, 0x65, 0xf4, 0xa4, 0xd2, 0xcb, 0x51, 0x84, 0x9e, 0xf7, 0xeb, 0xd2, + 0x92, 0x1d, 0x96, 0x10, 0xdb, 0x79, 0x14, 0x62, 0x6a, 0x0c, 0x4b, 0xe5, 0x12, 0xcc, 0xd6, 0x76, + 0xcf, 0x07, 0x44, 0xba, 0xac, 0x11, 0xf2, 0x5a, 0xe1, 0x28, 0x15, 0x54, 0xf1, 0x58, 0x42, 0x11, + 0xf2, 0xbd, 0x0e, 0x66, 0xbb, 0x6c, 0x36, 0x8a, 0x37, 0x9f, 0x28, 0x18, 0x9d, 0x62, 0x70, 0xa9, + 0xe9, 0x0b, 0xf0, 0x3d, 0x12, 0xcc, 0x56, 0x3b, 0xd8, 0xc4, 0x2d, 0xcf, 0x0b, 0x92, 0x13, 0xe0, + 0x4b, 0x13, 0x0a, 0x90, 0x23, 0x14, 0x21, 0xc0, 0xd0, 0x63, 0x79, 0xd1, 0x17, 0x5e, 0x98, 0x90, + 0x48, 0x70, 0x71, 0xa5, 0xa5, 0x2f, 0xb8, 0x2f, 0x4b, 0x30, 0xad, 0xed, 0x9a, 0xeb, 0xb6, 0xe5, + 0x8e, 0xc6, 0x36, 0xba, 0x33, 0xec, 0x20, 0x6e, 0x82, 0x63, 0xad, 0x5d, 0x9b, 0xac, 0x3f, 0x95, + 0xcd, 0x1a, 0x6e, 0x5a, 0x66, 0xab, 0x4b, 0xea, 0x91, 0xd3, 0xf6, 0x7f, 0xb8, 0x3d, 0xfb, 0xdc, + 0x6f, 0xca, 0x19, 0xf4, 0x7c, 0xe1, 0x50, 0x37, 0x5e, 0xe5, 0x99, 0xa2, 0xc5, 0x7b, 0x02, 0xc1, + 0x80, 0x36, 0x83, 0x4a, 0x48, 0x5f, 0xb8, 0x9f, 0x93, 0x40, 0x29, 0x36, 0x9b, 0xd6, 0xae, 0xe9, + 0xd4, 0x70, 0x1b, 0x37, 0x9d, 0xba, 0xad, 0x37, 0x31, 0x6b, 0x3f, 0x17, 0x40, 0x6e, 0x19, 0x36, + 0xed, 0x83, 0xdd, 0x47, 0x2a, 0xc7, 0x97, 0x0a, 0xef, 0x38, 0x7a, 0xb5, 0xdc, 0x5f, 0x4a, 0x02, + 0x71, 0x8a, 0xed, 0x2b, 0x0a, 0x16, 0x94, 0xbe, 0x54, 0x3f, 0x21, 0xc1, 0x94, 0xdf, 0x63, 0x6f, + 0x89, 0x08, 0xf3, 0xd7, 0x13, 0x4e, 0x46, 0x02, 0xe2, 0x09, 0x64, 0xf8, 0x8e, 0x04, 0xb3, 0x8a, + 0x28, 0xfa, 0xc9, 0x44, 0x57, 0x4c, 0x2e, 0x3a, 0xf7, 0xb5, 0x52, 0x6d, 0x2c, 0x55, 0x57, 0x17, + 0x55, 0xad, 0x20, 0xa3, 0xaf, 0x48, 0x90, 0x5d, 0x37, 0xcc, 0x2d, 0x36, 0xba, 0xd2, 0x71, 0xd7, + 0x8e, 0x6c, 0xe1, 0x07, 0x68, 0x4b, 0xf7, 0x5e, 0x94, 0x5b, 0xe1, 0xb8, 0xb9, 0xbb, 0x73, 0x1e, + 0xdb, 0xd5, 0x4d, 0x32, 0xca, 0x76, 0xeb, 0x56, 0x0d, 0x9b, 0x9e, 0x11, 0x9a, 0xd3, 0xfa, 0x7e, + 0xe3, 0x4d, 0x30, 0x81, 0xc9, 0x83, 0xcb, 0x49, 0x84, 0xc4, 0x03, 0xa6, 0x24, 0x86, 0xa9, 0x44, + 0xd3, 0x86, 0x3e, 0xc4, 0xd3, 0xd7, 0xd4, 0x3f, 0xca, 0xc1, 0x89, 0xa2, 0x79, 0x89, 0xd8, 0x14, + 0x5e, 0x07, 0x5f, 0xda, 0xd6, 0xcd, 0x2d, 0x4c, 0x06, 0x88, 0x40, 0xe2, 0x6c, 0x88, 0xfe, 0x0c, + 0x1f, 0xa2, 0x5f, 0xd1, 0x60, 0xc2, 0xb2, 0x5b, 0xd8, 0x5e, 0xb8, 0x44, 0x78, 0xea, 0x5d, 0x76, + 0xa6, 0x6d, 0xb2, 0x5f, 0x11, 0xf3, 0x94, 0xfc, 0x7c, 0xd5, 0xfb, 0x5f, 0xf3, 0x09, 0x9d, 0xb9, + 0x09, 0x26, 0x68, 0x9a, 0x32, 0x03, 0x93, 0x55, 0x6d, 0x51, 0xd5, 0x1a, 0xe5, 0xc5, 0xc2, 0x11, + 0xe5, 0x32, 0x38, 0x5a, 0xae, 0xab, 0x5a, 0xb1, 0x5e, 0xae, 0x56, 0x1a, 0x24, 0xbd, 0x90, 0x41, + 0xcf, 0xc9, 0x8a, 0x7a, 0xf6, 0xc6, 0x33, 0xd3, 0x0f, 0x56, 0x0d, 0x26, 0x9a, 0x5e, 0x06, 0x32, + 0x84, 0x4e, 0x27, 0xaa, 0x1d, 0x25, 0xe8, 0x25, 0x68, 0x3e, 0x21, 0xe5, 0x34, 0xc0, 0x45, 0xdb, + 0x32, 0xb7, 0xc2, 0x53, 0x87, 0x93, 0x1a, 0x93, 0x82, 0x1e, 0xcc, 0x40, 0xde, 0xfb, 0x87, 0x5c, + 0x49, 0x42, 0x9e, 0x42, 0xc1, 0xfb, 0xef, 0xae, 0xc5, 0x4b, 0xe4, 0x15, 0x4e, 0xb4, 0xe8, 0xab, + 0xab, 0x8b, 0x9e, 0x0c, 0x3c, 0x4b, 0x98, 0x56, 0xe5, 0x66, 0xc8, 0x7b, 0xff, 0x52, 0xaf, 0x83, + 0xe8, 0xf0, 0xa2, 0x5e, 0x36, 0x41, 0x3f, 0x65, 0x71, 0x99, 0xa6, 0xaf, 0xcd, 0x1f, 0x94, 0x60, + 0xb2, 0x82, 0x9d, 0xd2, 0x36, 0x6e, 0x5e, 0x40, 0x8f, 0xe1, 0x17, 0x40, 0xdb, 0x06, 0x36, 0x9d, + 0xfb, 0x76, 0xda, 0xc1, 0x02, 0xa8, 0x9f, 0x80, 0x9e, 0xc7, 0x76, 0xbe, 0x77, 0xf3, 0xfa, 0x73, + 0x63, 0x9f, 0xba, 0xfa, 0x25, 0x44, 0xa8, 0xcc, 0x49, 0xc8, 0xdb, 0xb8, 0xbb, 0xdb, 0xf6, 0x17, + 0xd1, 0xe8, 0x1b, 0x7a, 0x28, 0x10, 0x67, 0x89, 0x13, 0xe7, 0xcd, 0xe2, 0x45, 0x8c, 0x21, 0x5e, + 0x69, 0x16, 0x26, 0xca, 0xa6, 0xe1, 0x18, 0x7a, 0x1b, 0x3d, 0x3f, 0x0b, 0xb3, 0x35, 0xec, 0xac, + 0xeb, 0xb6, 0xbe, 0x83, 0x1d, 0x6c, 0x77, 0xd1, 0xf7, 0xf8, 0x3e, 0xa1, 0xd3, 0xd6, 0x9d, 0x4d, + 0xcb, 0xde, 0xf1, 0x55, 0xd3, 0x7f, 0x77, 0x55, 0x73, 0x0f, 0xdb, 0xdd, 0x90, 0x2f, 0xff, 0xd5, + 0xfd, 0x72, 0xd1, 0xb2, 0x2f, 0xb8, 0x83, 0x20, 0x9d, 0xa6, 0xd1, 0x57, 0x97, 0x5e, 0xdb, 0xda, + 0x5a, 0xc5, 0x7b, 0xd8, 0x0f, 0x97, 0x16, 0xbc, 0xbb, 0x73, 0x81, 0x96, 0x55, 0xb1, 0x1c, 0xb7, + 0xd3, 0x5e, 0xb5, 0xb6, 0xbc, 0x78, 0xb1, 0x93, 0x1a, 0x9f, 0x18, 0xe6, 0xd2, 0xf7, 0x30, 0xc9, + 0x95, 0x67, 0x73, 0xd1, 0x44, 0x65, 0x1e, 0x94, 0xe0, 0xb7, 0x3a, 0x6e, 0xe3, 0x1d, 0xec, 0xd8, + 0x97, 0xc8, 0xb5, 0x10, 0x93, 0x5a, 0x9f, 0x2f, 0x74, 0x80, 0x16, 0x9f, 0xac, 0x53, 0xe9, 0xcd, + 0x73, 0x92, 0x3b, 0xd0, 0x64, 0x5d, 0x84, 0xe2, 0x58, 0xae, 0xbd, 0x92, 0x5d, 0x6b, 0xe6, 0xe5, + 0x32, 0x64, 0xc9, 0xe0, 0xf9, 0xe6, 0x0c, 0xb7, 0xc2, 0xb4, 0x83, 0xbb, 0x5d, 0x7d, 0x0b, 0xfb, + 0x2b, 0x4c, 0xf4, 0x55, 0xb9, 0x0d, 0x72, 0x6d, 0x82, 0xa9, 0x37, 0x38, 0x5c, 0xcb, 0xd5, 0xcc, + 0x35, 0x30, 0x5c, 0x5a, 0xc1, 0x48, 0x40, 0xe0, 0xd6, 0xbc, 0x3f, 0xce, 0xdc, 0x03, 0x39, 0x0f, + 0xfe, 0x29, 0xc8, 0x2d, 0xaa, 0x0b, 0x1b, 0xcb, 0x85, 0x23, 0xee, 0xa3, 0xcf, 0xdf, 0x14, 0xe4, + 0x96, 0x8a, 0xf5, 0xe2, 0x6a, 0x41, 0x72, 0xeb, 0x51, 0xae, 0x2c, 0x55, 0x0b, 0xb2, 0x9b, 0xb8, + 0x5e, 0xac, 0x94, 0x4b, 0x85, 0xac, 0x32, 0x0d, 0x13, 0xe7, 0x8a, 0x5a, 0xa5, 0x5c, 0x59, 0x2e, + 0xe4, 0xd0, 0xdf, 0xb2, 0xf8, 0xdd, 0xce, 0xe3, 0x77, 0x5d, 0x14, 0x4f, 0xfd, 0x20, 0x7b, 0x45, + 0x00, 0xd9, 0x9d, 0x1c, 0x64, 0x3f, 0x29, 0x42, 0x64, 0x0c, 0xee, 0x4c, 0x79, 0x98, 0x58, 0xb7, + 0xad, 0x26, 0xee, 0x76, 0xd1, 0x6f, 0x48, 0x90, 0x2f, 0xe9, 0x66, 0x13, 0xb7, 0xd1, 0x15, 0x21, + 0x54, 0x9e, 0xab, 0x68, 0x26, 0x38, 0x2d, 0xf6, 0x8f, 0x19, 0xd1, 0xde, 0x8f, 0xd2, 0x9d, 0xf7, + 0x68, 0x46, 0xc8, 0x47, 0xac, 0x97, 0x8b, 0x25, 0x35, 0x86, 0xab, 0x71, 0x24, 0x98, 0xa2, 0xab, + 0x01, 0xe7, 0x31, 0x3b, 0x0f, 0xff, 0x5e, 0x46, 0x74, 0x72, 0xe8, 0xd7, 0x20, 0x20, 0x13, 0x21, + 0x0f, 0xb1, 0x89, 0xe0, 0x20, 0x6a, 0x63, 0xd8, 0x3c, 0x94, 0x60, 0x7a, 0xc3, 0xec, 0xf6, 0x13, + 0x8a, 0x78, 0x1c, 0x7d, 0xbf, 0x1a, 0x0c, 0xa1, 0x03, 0xc5, 0xd1, 0x1f, 0x4c, 0x2f, 0x7d, 0xc1, + 0x7c, 0x2f, 0x03, 0xc7, 0x97, 0xb1, 0x89, 0x6d, 0xa3, 0xe9, 0xd5, 0xc0, 0x97, 0xc4, 0x9d, 0xbc, + 0x24, 0x1e, 0xc3, 0x71, 0xde, 0xef, 0x0f, 0x5e, 0x02, 0xaf, 0x0e, 0x24, 0x70, 0x37, 0x27, 0x81, + 0x9b, 0x04, 0xe9, 0x8c, 0xe1, 0x3e, 0xf4, 0x29, 0x98, 0xa9, 0x58, 0x8e, 0xb1, 0x69, 0x34, 0x3d, + 0x1f, 0xb4, 0x97, 0xc9, 0x90, 0x5d, 0x35, 0xba, 0x0e, 0x2a, 0x86, 0xdd, 0xc9, 0x35, 0x30, 0x6d, + 0x98, 0xcd, 0xf6, 0x6e, 0x0b, 0x6b, 0x58, 0xf7, 0xfa, 0x95, 0x49, 0x8d, 0x4d, 0x0a, 0xb7, 0xf6, + 0x5d, 0xb6, 0x64, 0x7f, 0x6b, 0xff, 0xd3, 0xc2, 0xcb, 0x30, 0x2c, 0x0b, 0x24, 0x20, 0x65, 0x84, + 0xdd, 0x55, 0x84, 0x59, 0x93, 0xc9, 0xea, 0x1b, 0xec, 0xbd, 0x17, 0x0a, 0xb0, 0xe4, 0x34, 0xfe, + 0x0f, 0xf4, 0x3e, 0xa1, 0xc6, 0x3a, 0x88, 0xa1, 0x64, 0xc8, 0x2c, 0x0d, 0x31, 0x49, 0x56, 0x60, + 0xae, 0x5c, 0xa9, 0xab, 0x5a, 0xa5, 0xb8, 0x4a, 0xb3, 0xc8, 0xe8, 0xdf, 0x24, 0xc8, 0x69, 0xb8, + 0xd3, 0xbe, 0xc4, 0x46, 0x8c, 0xa6, 0x8e, 0xe2, 0x99, 0xc0, 0x51, 0x5c, 0x59, 0x02, 0xd0, 0x9b, + 0x6e, 0xc1, 0xe4, 0x4a, 0x2d, 0xa9, 0x6f, 0x1c, 0x53, 0xae, 0x82, 0xc5, 0x20, 0xb7, 0xc6, 0xfc, + 0x89, 0x5e, 0x20, 0xbc, 0x73, 0xc4, 0x51, 0x23, 0x1c, 0x46, 0xf4, 0x09, 0xef, 0x17, 0xda, 0xec, + 0x19, 0x48, 0xee, 0x70, 0xc4, 0xff, 0x55, 0x09, 0xb2, 0x75, 0xb7, 0xb7, 0x64, 0x3a, 0xce, 0x3f, + 0x1e, 0x4e, 0xc7, 0x5d, 0x32, 0x11, 0x3a, 0x7e, 0x17, 0xcc, 0xb0, 0x1a, 0x4b, 0x5d, 0x25, 0x62, + 0x55, 0x9c, 0xfb, 0x61, 0x18, 0x0d, 0xef, 0xc3, 0xce, 0xe1, 0x88, 0xf8, 0x93, 0x8f, 0x05, 0x58, + 0xc3, 0x3b, 0xe7, 0xb1, 0xdd, 0xdd, 0x36, 0x3a, 0xe8, 0xef, 0x64, 0x98, 0x5a, 0xc6, 0x4e, 0xcd, + 0xd1, 0x9d, 0xdd, 0x6e, 0xcf, 0x76, 0xa7, 0x69, 0x95, 0xf4, 0xe6, 0x36, 0xa6, 0xdd, 0x91, 0xff, + 0x8a, 0xde, 0x25, 0x8b, 0xfa, 0x13, 0x85, 0xe5, 0xcc, 0x07, 0x65, 0x44, 0x60, 0xf2, 0x38, 0xc8, + 0xb6, 0x74, 0x47, 0xa7, 0x58, 0x5c, 0xd1, 0x83, 0x45, 0x48, 0x48, 0x23, 0xd9, 0xd0, 0xef, 0x48, + 0x22, 0x0e, 0x45, 0x02, 0xe5, 0x27, 0x03, 0xe1, 0x7d, 0x99, 0x21, 0x50, 0x38, 0x06, 0xb3, 0x95, + 0x6a, 0xbd, 0xb1, 0x5a, 0x5d, 0x5e, 0x56, 0xdd, 0xd4, 0x82, 0xac, 0x9c, 0x04, 0x65, 0xbd, 0x78, + 0xdf, 0x9a, 0x5a, 0xa9, 0x37, 0x2a, 0xd5, 0x45, 0x95, 0xfe, 0x99, 0x55, 0x8e, 0xc2, 0x74, 0xa9, + 0x58, 0x5a, 0xf1, 0x13, 0x72, 0xca, 0x29, 0x38, 0xbe, 0xa6, 0xae, 0x2d, 0xa8, 0x5a, 0x6d, 0xa5, + 0xbc, 0xde, 0x70, 0xc9, 0x2c, 0x55, 0x37, 0x2a, 0x8b, 0x85, 0xbc, 0x82, 0xe0, 0x24, 0xf3, 0xe5, + 0x9c, 0x56, 0xad, 0x2c, 0x37, 0x6a, 0xf5, 0x62, 0x5d, 0x2d, 0x4c, 0x28, 0x97, 0xc1, 0xd1, 0x52, + 0xb1, 0x42, 0xb2, 0x97, 0xaa, 0x95, 0x8a, 0x5a, 0xaa, 0x17, 0x26, 0xd1, 0x0f, 0xb3, 0x30, 0x5d, + 0xee, 0x56, 0xf4, 0x1d, 0x7c, 0x56, 0x6f, 0x1b, 0x2d, 0xf4, 0x7c, 0x66, 0xe6, 0x71, 0x1d, 0xcc, + 0xda, 0xde, 0x23, 0x6e, 0xd5, 0x0d, 0xec, 0xa1, 0x39, 0xab, 0xf1, 0x89, 0xee, 0x9c, 0xdc, 0x24, + 0x04, 0xfc, 0x39, 0xb9, 0xf7, 0xa6, 0x2c, 0x00, 0x78, 0x4f, 0xf5, 0xf0, 0x72, 0xd7, 0x33, 0xbd, + 0xad, 0x49, 0xdf, 0xc1, 0x5d, 0x6c, 0xef, 0x19, 0x4d, 0xec, 0xe7, 0xd4, 0x98, 0xbf, 0xd0, 0xd7, + 0x64, 0xd1, 0xfd, 0x45, 0x06, 0x54, 0xa6, 0x3a, 0x11, 0xbd, 0xe1, 0x2f, 0xc9, 0x22, 0xbb, 0x83, + 0x42, 0x24, 0x93, 0x69, 0xca, 0x8b, 0xa4, 0xe1, 0x96, 0x6d, 0xeb, 0xd5, 0x6a, 0xa3, 0xb6, 0x52, + 0xd5, 0xea, 0x05, 0x59, 0x99, 0x81, 0x49, 0xf7, 0x75, 0xb5, 0x5a, 0x59, 0x2e, 0x64, 0x95, 0x13, + 0x70, 0x6c, 0xa5, 0x58, 0x6b, 0x94, 0x2b, 0x67, 0x8b, 0xab, 0xe5, 0xc5, 0x46, 0x69, 0xa5, 0xa8, + 0xd5, 0x0a, 0x39, 0xe5, 0x0a, 0x38, 0x51, 0x2f, 0xab, 0x5a, 0x63, 0x49, 0x2d, 0xd6, 0x37, 0x34, + 0xb5, 0xd6, 0xa8, 0x54, 0x1b, 0x95, 0xe2, 0x9a, 0x5a, 0xc8, 0xbb, 0xcd, 0x9f, 0x7c, 0x0a, 0xd5, + 0x66, 0x62, 0xbf, 0x32, 0x4e, 0x46, 0x28, 0xe3, 0x54, 0xaf, 0x32, 0x02, 0xab, 0x56, 0x9a, 0x5a, + 0x53, 0xb5, 0xb3, 0x6a, 0x61, 0xba, 0x9f, 0xae, 0xcd, 0x28, 0xc7, 0xa1, 0xe0, 0xf2, 0xd0, 0x28, + 0xd7, 0xfc, 0x9c, 0x8b, 0x85, 0x59, 0xf4, 0x89, 0x3c, 0x9c, 0xd4, 0xf0, 0x96, 0xd1, 0x75, 0xb0, + 0xbd, 0xae, 0x5f, 0xda, 0xc1, 0xa6, 0xe3, 0x77, 0xf2, 0xff, 0x2b, 0xb1, 0x32, 0xae, 0xc1, 0x6c, + 0xc7, 0xa3, 0xb1, 0x86, 0x9d, 0x6d, 0xab, 0x45, 0x47, 0xe1, 0xc7, 0x44, 0xf6, 0x1c, 0xf3, 0xeb, + 0x6c, 0x76, 0x8d, 0xff, 0x9b, 0xd1, 0x6d, 0x39, 0x46, 0xb7, 0xb3, 0xc3, 0xe8, 0xb6, 0x72, 0x15, + 0x4c, 0xed, 0x76, 0xb1, 0xad, 0xee, 0xe8, 0x46, 0xdb, 0xbf, 0x9c, 0x33, 0x48, 0x40, 0x6f, 0xcf, + 0x8a, 0x9e, 0x58, 0x61, 0xea, 0xd2, 0x5f, 0x8c, 0x11, 0x7d, 0xeb, 0x69, 0x00, 0x5a, 0xd9, 0x0d, + 0xbb, 0x4d, 0x95, 0x95, 0x49, 0x71, 0xf9, 0x3b, 0x6f, 0xb4, 0xdb, 0x86, 0xb9, 0x15, 0xec, 0xfb, + 0x87, 0x09, 0xe8, 0x45, 0xb2, 0xc8, 0x09, 0x96, 0xa4, 0xbc, 0x25, 0x6b, 0x4d, 0x2f, 0x90, 0xc6, + 0xdc, 0xef, 0xee, 0x6f, 0x3a, 0x79, 0xa5, 0x00, 0x33, 0x24, 0x8d, 0xb6, 0xc0, 0xc2, 0x84, 0xdb, + 0x07, 0xfb, 0xe4, 0xd6, 0xd4, 0xfa, 0x4a, 0x75, 0x31, 0xf8, 0x36, 0xe9, 0x92, 0x74, 0x99, 0x29, + 0x56, 0xee, 0x23, 0xad, 0x71, 0x4a, 0x79, 0x14, 0x5c, 0xc1, 0x74, 0xd8, 0xc5, 0x55, 0x4d, 0x2d, + 0x2e, 0xde, 0xd7, 0x50, 0x9f, 0x5e, 0xae, 0xd5, 0x6b, 0x7c, 0xe3, 0xf2, 0xdb, 0xd1, 0xb4, 0xcb, + 0xaf, 0xba, 0x56, 0x2c, 0xaf, 0xd2, 0xfe, 0x7d, 0xa9, 0xaa, 0xad, 0x15, 0xeb, 0x85, 0x19, 0xf4, + 0x72, 0x19, 0x0a, 0xcb, 0xd8, 0x59, 0xb7, 0x6c, 0x47, 0x6f, 0xaf, 0x1a, 0xe6, 0x85, 0x0d, 0xbb, + 0xcd, 0x4d, 0x36, 0x85, 0xc3, 0x74, 0xf0, 0x43, 0x24, 0x47, 0x30, 0x7a, 0x47, 0xbc, 0x43, 0xb2, + 0x85, 0xca, 0x14, 0x26, 0xa0, 0x67, 0x4a, 0x22, 0xcb, 0xdd, 0xe2, 0xa5, 0x26, 0xd3, 0x93, 0x67, + 0x8d, 0x7b, 0x7c, 0xee, 0x83, 0x5a, 0x1e, 0x3d, 0x37, 0x0b, 0x93, 0x4b, 0x86, 0xa9, 0xb7, 0x8d, + 0x67, 0x70, 0xf1, 0x4b, 0xc3, 0x3e, 0x26, 0x13, 0xd3, 0xc7, 0x48, 0x43, 0x8d, 0x9f, 0xbf, 0x26, + 0x8b, 0x2e, 0x2f, 0x30, 0xb2, 0xf7, 0x99, 0x8c, 0x18, 0x3c, 0x3f, 0x24, 0x89, 0x2c, 0x2f, 0x0c, + 0xa6, 0x97, 0x0c, 0xc3, 0x4f, 0xfd, 0x68, 0xd8, 0x58, 0x3d, 0xed, 0x7b, 0xb2, 0x9f, 0x2a, 0x4c, + 0xa1, 0x3f, 0x97, 0x01, 0x2d, 0x63, 0xe7, 0x2c, 0xb6, 0x83, 0xa9, 0x00, 0xe9, 0xf5, 0xa9, 0xbd, + 0xcd, 0x34, 0xd9, 0x37, 0xb3, 0x00, 0x9e, 0xe3, 0x01, 0x2c, 0xc6, 0x34, 0x9e, 0x08, 0xd2, 0x11, + 0x8d, 0xb7, 0x0c, 0xf9, 0x2e, 0xf9, 0x4e, 0xd5, 0xec, 0xf1, 0xd1, 0xc3, 0x25, 0x21, 0xc6, 0x52, + 0xf7, 0x08, 0x6b, 0x94, 0x00, 0xfa, 0x7e, 0x30, 0x09, 0xfa, 0x19, 0x4e, 0x3b, 0x96, 0x0e, 0xcc, + 0x6c, 0x32, 0x7d, 0xb1, 0xd3, 0x55, 0x97, 0x7e, 0xf6, 0x0d, 0xfa, 0x50, 0x0e, 0x8e, 0xf7, 0xab, + 0x0e, 0xfa, 0xdd, 0x0c, 0xb7, 0xc3, 0x8e, 0xc9, 0x90, 0x9f, 0xa1, 0x1b, 0x88, 0xee, 0x8b, 0xf2, + 0x44, 0x38, 0x11, 0x2c, 0xc3, 0xd5, 0xad, 0x0a, 0xbe, 0xd8, 0x6d, 0x63, 0xc7, 0xc1, 0x36, 0xa9, + 0xda, 0xa4, 0xd6, 0xff, 0xa3, 0xf2, 0x64, 0xb8, 0xdc, 0x30, 0xbb, 0x46, 0x0b, 0xdb, 0x75, 0xa3, + 0xd3, 0x2d, 0x9a, 0xad, 0xfa, 0xae, 0x63, 0xd9, 0x86, 0x4e, 0xaf, 0x92, 0x9c, 0xd4, 0xa2, 0x3e, + 0x2b, 0x37, 0x42, 0xc1, 0xe8, 0x56, 0xcd, 0xf3, 0x96, 0x6e, 0xb7, 0x0c, 0x73, 0x6b, 0xd5, 0xe8, + 0x3a, 0xd4, 0x03, 0x78, 0x5f, 0x3a, 0xfa, 0x7b, 0x59, 0xf4, 0x30, 0xdd, 0x00, 0x58, 0x23, 0x3a, + 0x94, 0xe7, 0xc9, 0x22, 0xc7, 0xe3, 0x92, 0xd1, 0x4e, 0xa6, 0x2c, 0xcf, 0x19, 0xb7, 0x21, 0xd1, + 0x7f, 0x04, 0x27, 0x5d, 0x8b, 0x97, 0xee, 0x1b, 0x02, 0x67, 0x55, 0xad, 0xbc, 0x54, 0x56, 0x5d, + 0xb3, 0xe2, 0x04, 0x1c, 0x0b, 0xbf, 0x2d, 0xde, 0xd7, 0xa8, 0xa9, 0x95, 0x7a, 0x61, 0xd2, 0xed, + 0xa7, 0xbc, 0xe4, 0xa5, 0x62, 0x79, 0x55, 0x5d, 0x6c, 0xd4, 0xab, 0xee, 0x97, 0xc5, 0xe1, 0x4c, + 0x0b, 0xf4, 0x60, 0x16, 0x8e, 0x12, 0xd9, 0x5e, 0x22, 0x52, 0x75, 0x85, 0xd2, 0xe3, 0x6b, 0x1b, + 0x00, 0x34, 0xe5, 0x89, 0x17, 0x7d, 0x56, 0xf8, 0xa6, 0x4c, 0x06, 0xc2, 0x9e, 0x32, 0x22, 0x34, + 0xe3, 0x7b, 0x92, 0x48, 0x84, 0x0a, 0x61, 0xb2, 0xc9, 0x94, 0xe2, 0x5f, 0xc6, 0x3d, 0xe2, 0x44, + 0x83, 0x4f, 0xac, 0xcc, 0x12, 0xf9, 0xf9, 0xe9, 0xeb, 0x65, 0x8d, 0xa8, 0xc3, 0x1c, 0x00, 0x49, + 0x21, 0x1a, 0xe4, 0xe9, 0x41, 0xdf, 0xf1, 0x2a, 0x4a, 0x0f, 0x8a, 0xa5, 0x7a, 0xf9, 0xac, 0x1a, + 0xa5, 0x07, 0x9f, 0x91, 0x61, 0x72, 0x19, 0x3b, 0xee, 0x9c, 0xaa, 0x8b, 0x9e, 0x22, 0xb0, 0xfe, + 0xe3, 0x9a, 0x31, 0x6d, 0xab, 0xa9, 0xb7, 0x83, 0x65, 0x00, 0xef, 0x0d, 0x3d, 0x7b, 0x18, 0x13, + 0xc4, 0x2f, 0x3a, 0x62, 0xbc, 0xfa, 0x69, 0xc8, 0x39, 0xee, 0x67, 0xba, 0x0c, 0xfd, 0x13, 0x91, + 0xc3, 0x95, 0x4b, 0x64, 0x51, 0x77, 0x74, 0xcd, 0xcb, 0xcf, 0x8c, 0x4e, 0x82, 0xb6, 0x4b, 0x04, + 0x23, 0x3f, 0x8a, 0xf6, 0xe7, 0xdf, 0xca, 0x70, 0xc2, 0x6b, 0x1f, 0xc5, 0x4e, 0xa7, 0xe6, 0x58, + 0x36, 0xd6, 0x70, 0x13, 0x1b, 0x1d, 0xa7, 0x67, 0x7d, 0xcf, 0xf6, 0x52, 0xfd, 0xcd, 0x66, 0xfa, + 0x8a, 0xde, 0x20, 0x8b, 0xc6, 0x60, 0xde, 0xd7, 0x1e, 0x7b, 0xca, 0x8b, 0x68, 0xec, 0x1f, 0x97, + 0x44, 0xa2, 0x2a, 0x27, 0x24, 0x9e, 0x0c, 0xa8, 0x8f, 0x1c, 0x02, 0x50, 0xfe, 0xca, 0x8d, 0xa6, + 0x96, 0xd4, 0xf2, 0xba, 0x3b, 0x08, 0x5c, 0x0d, 0x57, 0xae, 0x6f, 0x68, 0xa5, 0x95, 0x62, 0x4d, + 0x6d, 0x68, 0xea, 0x72, 0xb9, 0x56, 0xa7, 0x4e, 0x59, 0xde, 0x5f, 0x13, 0xca, 0x55, 0x70, 0xaa, + 0xb6, 0xb1, 0x50, 0x2b, 0x69, 0xe5, 0x75, 0x92, 0xae, 0xa9, 0x15, 0xf5, 0x1c, 0xfd, 0x3a, 0x89, + 0x3e, 0x50, 0x80, 0x69, 0x77, 0x02, 0x50, 0xf3, 0xe6, 0x05, 0xe8, 0xdb, 0x59, 0x98, 0xd6, 0x70, + 0xd7, 0x6a, 0xef, 0x91, 0x39, 0xc2, 0xb8, 0xa6, 0x1e, 0xdf, 0x95, 0x45, 0xcf, 0x6f, 0x33, 0xcc, + 0xce, 0x33, 0x8c, 0x46, 0x4f, 0x34, 0xf5, 0x3d, 0xdd, 0x68, 0xeb, 0xe7, 0x69, 0x57, 0x33, 0xa9, + 0x85, 0x09, 0xca, 0x3c, 0x28, 0xd6, 0x45, 0x13, 0xdb, 0xb5, 0xe6, 0x45, 0xd5, 0xd9, 0x2e, 0xb6, + 0x5a, 0x36, 0xee, 0x76, 0xe9, 0xea, 0x45, 0x9f, 0x2f, 0xca, 0x0d, 0x70, 0x94, 0xa4, 0x32, 0x99, + 0x3d, 0x07, 0x99, 0xde, 0xe4, 0x20, 0x67, 0xd1, 0xbc, 0xe4, 0xe7, 0xcc, 0x31, 0x39, 0xc3, 0x64, + 0xf6, 0xb8, 0x44, 0x9e, 0x3f, 0xa5, 0x73, 0x0d, 0x4c, 0x9b, 0xfa, 0x0e, 0x56, 0x1f, 0xe8, 0x18, + 0x36, 0xee, 0x12, 0xc7, 0x18, 0x59, 0x63, 0x93, 0xd0, 0x87, 0x84, 0xce, 0x9b, 0x8b, 0x49, 0x2c, + 0x99, 0xee, 0x2f, 0x0f, 0xa1, 0xfa, 0x7d, 0xfa, 0x19, 0x19, 0x7d, 0x40, 0x86, 0x19, 0xca, 0x54, + 0xd1, 0xbc, 0x54, 0x6e, 0xa1, 0xab, 0x39, 0xe3, 0x57, 0x77, 0xd3, 0x7c, 0xe3, 0x97, 0xbc, 0xa0, + 0x5f, 0x96, 0x45, 0xdd, 0x9d, 0xfb, 0x54, 0x9c, 0x94, 0x11, 0xed, 0x38, 0xba, 0x69, 0xed, 0x52, + 0x47, 0xd5, 0x49, 0xcd, 0x7b, 0x49, 0x73, 0x51, 0x0f, 0x7d, 0x58, 0xc8, 0x99, 0x5a, 0xb0, 0x1a, + 0x87, 0x04, 0xe0, 0x27, 0x65, 0x98, 0xa3, 0x5c, 0xd5, 0xe8, 0x39, 0x1f, 0xa1, 0x03, 0x6f, 0xbf, + 0x22, 0x6c, 0x08, 0xf6, 0xa9, 0x3f, 0x2d, 0xe9, 0x11, 0x03, 0xe4, 0x47, 0x85, 0x82, 0xa3, 0x09, + 0x57, 0xe4, 0x90, 0xa0, 0x7c, 0x47, 0x16, 0xa6, 0x37, 0xba, 0xd8, 0xa6, 0x7e, 0xfb, 0xe8, 0xa1, + 0x2c, 0xc8, 0xcb, 0x98, 0xdb, 0x48, 0x7d, 0xa1, 0xb0, 0x87, 0x2f, 0x5b, 0x59, 0x86, 0xa8, 0x6b, + 0x23, 0x45, 0xc0, 0x76, 0x3d, 0xcc, 0x79, 0x22, 0x2d, 0x3a, 0x8e, 0x6b, 0x24, 0xfa, 0xde, 0xb4, + 0x3d, 0xa9, 0xa3, 0xd8, 0x2a, 0x22, 0x65, 0xb9, 0x59, 0x4a, 0x2e, 0x4f, 0xab, 0x78, 0xd3, 0x9b, + 0xcf, 0x66, 0xb5, 0x9e, 0x54, 0xe5, 0x16, 0xb8, 0xcc, 0xea, 0x60, 0xef, 0xfc, 0x0a, 0x93, 0x39, + 0x47, 0x32, 0xf7, 0xfb, 0x84, 0xbe, 0x2d, 0xe4, 0xab, 0x2b, 0x2e, 0x9d, 0x64, 0xba, 0xd0, 0x19, + 0x8d, 0x49, 0x72, 0x1c, 0x0a, 0x6e, 0x0e, 0xb2, 0xff, 0xa2, 0xa9, 0xb5, 0xea, 0xea, 0x59, 0xb5, + 0xff, 0x32, 0x46, 0x0e, 0x3d, 0x47, 0x86, 0xa9, 0x05, 0xdb, 0xd2, 0x5b, 0x4d, 0xbd, 0xeb, 0xa0, + 0xef, 0x4b, 0x30, 0xb3, 0xae, 0x5f, 0x6a, 0x5b, 0x7a, 0x8b, 0xf8, 0xf7, 0xf7, 0xf4, 0x05, 0x1d, + 0xef, 0x93, 0xdf, 0x17, 0xd0, 0x57, 0xfe, 0x60, 0x60, 0x70, 0x74, 0x2f, 0x23, 0x72, 0xa1, 0x66, + 0xb0, 0xcd, 0x27, 0xf5, 0x0b, 0x56, 0xea, 0xf3, 0x35, 0xcf, 0xf2, 0x14, 0x61, 0x51, 0x7e, 0x40, + 0x2c, 0xfc, 0xa8, 0x08, 0xc9, 0xc3, 0xd9, 0x95, 0x7f, 0xee, 0x24, 0xe4, 0x17, 0x31, 0xb1, 0xe2, + 0xfe, 0xbb, 0x04, 0x13, 0x35, 0xec, 0x10, 0x0b, 0xee, 0x36, 0xce, 0x53, 0xb8, 0x45, 0x32, 0x84, + 0x4e, 0xec, 0xfe, 0xbb, 0x3b, 0x59, 0x67, 0xce, 0x5b, 0x93, 0xe7, 0x04, 0x1e, 0x89, 0x5e, 0xb9, + 0xf3, 0xb4, 0xcc, 0x03, 0x79, 0x24, 0xc6, 0x92, 0x4a, 0xdf, 0xd7, 0xea, 0x5d, 0x12, 0x75, 0xad, + 0x62, 0x7a, 0xbd, 0xd7, 0xb0, 0xfa, 0x19, 0xeb, 0x6d, 0x46, 0x99, 0x8f, 0x71, 0x8e, 0x7a, 0x02, + 0x4c, 0x78, 0x32, 0xf7, 0xe7, 0xa3, 0xbd, 0x7e, 0x0a, 0x1e, 0x09, 0x72, 0xf6, 0xda, 0xcf, 0x29, + 0xe8, 0xa2, 0x16, 0x5d, 0xf8, 0x58, 0x62, 0x10, 0xcc, 0x54, 0xb0, 0x73, 0xd1, 0xb2, 0x2f, 0xd4, + 0x1c, 0xdd, 0xc1, 0xe8, 0x5f, 0x24, 0x90, 0x6b, 0xd8, 0x61, 0xa3, 0x9f, 0x54, 0xe0, 0x98, 0x57, + 0x21, 0x9a, 0x91, 0xf4, 0xdf, 0x5e, 0x45, 0xae, 0xe9, 0x2b, 0x04, 0x26, 0x9f, 0xb6, 0xff, 0x57, + 0xf4, 0x1b, 0x7d, 0x83, 0x3e, 0x49, 0x7d, 0x26, 0x0d, 0x54, 0x32, 0x2c, 0x83, 0xae, 0x82, 0x45, + 0xe8, 0xe9, 0x07, 0x85, 0xcc, 0x6a, 0x31, 0x9a, 0x87, 0xd3, 0x15, 0x7c, 0xf4, 0x0a, 0xc8, 0x96, + 0xb6, 0x75, 0x07, 0xbd, 0x53, 0x06, 0x28, 0xb6, 0x5a, 0x6b, 0x9e, 0x0f, 0x38, 0xeb, 0x90, 0x76, + 0x06, 0x66, 0x9a, 0xdb, 0x7a, 0x78, 0xb7, 0x89, 0xd7, 0x1f, 0x70, 0x69, 0xca, 0x13, 0x43, 0x67, + 0x72, 0x4f, 0xaa, 0xa8, 0x07, 0x26, 0xb7, 0x0c, 0x4a, 0x3b, 0x70, 0x34, 0xe7, 0x43, 0x61, 0xc6, + 0x1e, 0xa1, 0x73, 0x7f, 0x9f, 0x0f, 0xd9, 0x8b, 0x9e, 0xc3, 0x51, 0xd2, 0xc1, 0x01, 0x9b, 0x30, + 0x21, 0xe1, 0x49, 0x6f, 0xb1, 0x80, 0x1e, 0xf1, 0x7c, 0x8d, 0x25, 0x74, 0xad, 0xa2, 0xb6, 0x0c, + 0x5f, 0xb4, 0x34, 0x60, 0x16, 0x7a, 0x41, 0x26, 0x19, 0x7c, 0xf1, 0x82, 0xbb, 0x1b, 0x66, 0x71, + 0xcb, 0x70, 0xb0, 0x5f, 0x4b, 0x2a, 0xc0, 0x38, 0x88, 0xf9, 0x1f, 0xd0, 0xb3, 0x84, 0x83, 0xae, + 0x11, 0x81, 0xee, 0xaf, 0x51, 0x44, 0xfb, 0x13, 0x0b, 0xa3, 0x26, 0x46, 0x33, 0x7d, 0xb0, 0x9e, + 0x2d, 0xc3, 0x89, 0xba, 0xb5, 0xb5, 0xd5, 0xc6, 0xbe, 0x98, 0xb0, 0xe7, 0x9d, 0x89, 0xf4, 0x51, + 0xc2, 0x45, 0x76, 0x82, 0xac, 0xfb, 0x8d, 0xe0, 0x28, 0x99, 0xfb, 0xc2, 0x9f, 0x98, 0x8a, 0x9d, + 0x45, 0x11, 0x71, 0xf5, 0xe5, 0x33, 0x02, 0x05, 0xb1, 0x80, 0xcf, 0xc2, 0x64, 0xd3, 0x07, 0xe2, + 0x4b, 0x12, 0xcc, 0x7a, 0x37, 0x57, 0xfa, 0x0a, 0x7a, 0xef, 0x08, 0x01, 0x40, 0xdf, 0xcf, 0x88, + 0xfa, 0xd9, 0x12, 0x99, 0x70, 0x9c, 0x44, 0x88, 0x58, 0x2c, 0xa8, 0xca, 0x40, 0x72, 0xe9, 0x8b, + 0xf6, 0x4f, 0x64, 0x98, 0x5e, 0xc6, 0x7e, 0x4b, 0xeb, 0x26, 0xee, 0x89, 0xce, 0xc0, 0x0c, 0xb9, + 0xbe, 0xad, 0x4a, 0x8f, 0x49, 0x7a, 0xab, 0x66, 0x5c, 0x9a, 0x72, 0x1d, 0xcc, 0x9e, 0xc7, 0x9b, + 0x96, 0x8d, 0xab, 0xdc, 0x59, 0x4a, 0x3e, 0x31, 0x22, 0x3c, 0x1d, 0x17, 0x07, 0x6d, 0x81, 0xc7, + 0xe6, 0xa6, 0xfd, 0xc2, 0x64, 0xaa, 0x12, 0x31, 0xe6, 0x3c, 0x09, 0x26, 0x29, 0xf2, 0xbe, 0x99, + 0x16, 0xd7, 0x2f, 0x06, 0x79, 0xd1, 0xeb, 0x03, 0x44, 0x55, 0x0e, 0xd1, 0xc7, 0x27, 0x61, 0x62, + 0x2c, 0xf7, 0xbb, 0x17, 0x98, 0xf2, 0x17, 0x2e, 0x95, 0x5b, 0x5d, 0xb4, 0x96, 0x0c, 0xd3, 0xd3, + 0x00, 0x41, 0xe3, 0xf0, 0xc3, 0x5a, 0x30, 0x29, 0x7c, 0xe4, 0xfa, 0xd8, 0x83, 0x7a, 0xbd, 0xe2, + 0x20, 0xec, 0x8c, 0x18, 0x18, 0xb1, 0x03, 0x7e, 0x22, 0x9c, 0xa4, 0x8f, 0xce, 0xa7, 0x65, 0x38, + 0x11, 0x9c, 0x3f, 0x5a, 0xd5, 0xbb, 0x61, 0xbb, 0x2b, 0x25, 0x83, 0x88, 0x3b, 0xf0, 0x11, 0x34, + 0x96, 0xef, 0x24, 0x1b, 0x33, 0xfa, 0x72, 0x32, 0x5a, 0x74, 0x94, 0x9b, 0xe0, 0x98, 0xb9, 0xbb, + 0x13, 0x48, 0x9d, 0xb4, 0x78, 0xda, 0xc2, 0xf7, 0x7f, 0x48, 0x32, 0x32, 0x89, 0x30, 0x3f, 0x96, + 0x39, 0x25, 0x77, 0xa4, 0xeb, 0x71, 0x89, 0x60, 0x44, 0xff, 0x9c, 0x49, 0xd4, 0xbb, 0x0d, 0x3e, + 0xf3, 0x95, 0xa0, 0x97, 0x3a, 0xcc, 0x03, 0x5f, 0xdf, 0xc9, 0x82, 0x5c, 0xec, 0x18, 0xe8, 0xc3, + 0x12, 0x4c, 0xd7, 0x1c, 0xdd, 0x76, 0x6a, 0xd8, 0xde, 0xc3, 0x36, 0x3b, 0x33, 0x7f, 0x83, 0xf0, + 0x5c, 0xa3, 0xd8, 0x31, 0xe6, 0x19, 0x22, 0x11, 0x92, 0xf9, 0x82, 0xd0, 0xfc, 0x20, 0x9e, 0x56, + 0x32, 0xc1, 0xe0, 0x21, 0xa6, 0x7c, 0x27, 0xe0, 0xd8, 0x7a, 0x55, 0xab, 0x07, 0xbb, 0xf3, 0x1b, + 0x35, 0x75, 0xb1, 0x20, 0x2b, 0x08, 0x4e, 0x12, 0x3f, 0x69, 0x2d, 0xf8, 0x50, 0xab, 0x17, 0xb5, + 0xba, 0xba, 0x58, 0xc8, 0xa2, 0xd7, 0x49, 0x00, 0x35, 0xc7, 0xea, 0xec, 0x17, 0xa1, 0xf8, 0xa1, + 0x7b, 0xaf, 0xda, 0x3e, 0x8d, 0x81, 0x67, 0x87, 0xe2, 0x16, 0x79, 0x62, 0x49, 0x25, 0x13, 0xe0, + 0x3d, 0x43, 0x08, 0xf0, 0x24, 0x28, 0x54, 0x52, 0x95, 0x6a, 0x3d, 0x90, 0x92, 0x7c, 0x66, 0x02, + 0x72, 0xea, 0x4e, 0xc7, 0xb9, 0x74, 0xe6, 0xd1, 0x30, 0x5b, 0x73, 0x6c, 0xac, 0xef, 0x30, 0x7b, + 0x51, 0x8e, 0x75, 0x01, 0x9b, 0xfe, 0x5e, 0x14, 0x79, 0xb9, 0xfd, 0x36, 0x98, 0x30, 0xad, 0x86, + 0xbe, 0xeb, 0x6c, 0x2b, 0x57, 0xef, 0x0b, 0xe2, 0x40, 0xbb, 0x9b, 0x2a, 0x8d, 0x9a, 0xf5, 0xb5, + 0x3b, 0xc8, 0x6e, 0x44, 0xde, 0xb4, 0x8a, 0xbb, 0xce, 0xf6, 0xc2, 0x55, 0x9f, 0xfc, 0x9b, 0xd3, + 0x99, 0xcf, 0xfc, 0xcd, 0xe9, 0xcc, 0x57, 0xff, 0xe6, 0x74, 0xe6, 0x57, 0xbe, 0x7e, 0xfa, 0xc8, + 0x67, 0xbe, 0x7e, 0xfa, 0xc8, 0x97, 0xbe, 0x7e, 0xfa, 0xc8, 0xcf, 0x48, 0x9d, 0xf3, 0xe7, 0xf3, + 0x84, 0xca, 0x13, 0xfe, 0xbf, 0x00, 0x00, 0x00, 0xff, 0xff, 0x66, 0x5b, 0xbd, 0xa1, 0x40, 0x01, + 0x02, 0x00, } func (m *Rpc) Marshal() (dAtA []byte, err error) { @@ -116295,6 +116751,261 @@ func (m *RpcChatUnsubscribeResponseError) MarshalToSizedBuffer(dAtA []byte) (int return len(dAtA) - i, nil } +func (m *RpcApi) 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 *RpcApi) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *RpcApi) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + return len(dAtA) - i, nil +} + +func (m *RpcApiStartServer) 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 *RpcApiStartServer) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *RpcApiStartServer) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + return len(dAtA) - i, nil +} + +func (m *RpcApiStartServerRequest) 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 *RpcApiStartServerRequest) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *RpcApiStartServerRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + return len(dAtA) - i, nil +} + +func (m *RpcApiStartServerResponse) 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 *RpcApiStartServerResponse) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *RpcApiStartServerResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.Error != nil { + { + size, err := m.Error.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintCommands(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *RpcApiStartServerResponseError) 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 *RpcApiStartServerResponseError) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *RpcApiStartServerResponseError) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.Description) > 0 { + i -= len(m.Description) + copy(dAtA[i:], m.Description) + i = encodeVarintCommands(dAtA, i, uint64(len(m.Description))) + i-- + dAtA[i] = 0x12 + } + if m.Code != 0 { + i = encodeVarintCommands(dAtA, i, uint64(m.Code)) + i-- + dAtA[i] = 0x8 + } + return len(dAtA) - i, nil +} + +func (m *RpcApiStopServer) 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 *RpcApiStopServer) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *RpcApiStopServer) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + return len(dAtA) - i, nil +} + +func (m *RpcApiStopServerRequest) 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 *RpcApiStopServerRequest) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *RpcApiStopServerRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + return len(dAtA) - i, nil +} + +func (m *RpcApiStopServerResponse) 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 *RpcApiStopServerResponse) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *RpcApiStopServerResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.Error != nil { + { + size, err := m.Error.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintCommands(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *RpcApiStopServerResponseError) 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 *RpcApiStopServerResponseError) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *RpcApiStopServerResponseError) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.Description) > 0 { + i -= len(m.Description) + copy(dAtA[i:], m.Description) + i = encodeVarintCommands(dAtA, i, uint64(len(m.Description))) + i-- + dAtA[i] = 0x12 + } + if m.Code != 0 { + i = encodeVarintCommands(dAtA, i, uint64(m.Code)) + i-- + dAtA[i] = 0x8 + } + return len(dAtA) - i, nil +} + func (m *Empty) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -135163,6 +135874,109 @@ func (m *RpcChatUnsubscribeResponseError) Size() (n int) { return n } +func (m *RpcApi) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + return n +} + +func (m *RpcApiStartServer) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + return n +} + +func (m *RpcApiStartServerRequest) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + return n +} + +func (m *RpcApiStartServerResponse) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Error != nil { + l = m.Error.Size() + n += 1 + l + sovCommands(uint64(l)) + } + return n +} + +func (m *RpcApiStartServerResponseError) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Code != 0 { + n += 1 + sovCommands(uint64(m.Code)) + } + l = len(m.Description) + if l > 0 { + n += 1 + l + sovCommands(uint64(l)) + } + return n +} + +func (m *RpcApiStopServer) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + return n +} + +func (m *RpcApiStopServerRequest) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + return n +} + +func (m *RpcApiStopServerResponse) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Error != nil { + l = m.Error.Size() + n += 1 + l + sovCommands(uint64(l)) + } + return n +} + +func (m *RpcApiStopServerResponseError) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Code != 0 { + n += 1 + sovCommands(uint64(m.Code)) + } + l = len(m.Description) + if l > 0 { + n += 1 + l + sovCommands(uint64(l)) + } + return n +} + func (m *Empty) Size() (n int) { if m == nil { return 0 @@ -255185,6 +255999,630 @@ func (m *RpcChatUnsubscribeResponseError) Unmarshal(dAtA []byte) error { } return nil } +func (m *RpcApi) 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 ErrIntOverflowCommands + } + 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: Api: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Api: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + default: + iNdEx = preIndex + skippy, err := skipCommands(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthCommands + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *RpcApiStartServer) 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 ErrIntOverflowCommands + } + 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: StartServer: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: StartServer: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + default: + iNdEx = preIndex + skippy, err := skipCommands(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthCommands + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *RpcApiStartServerRequest) 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 ErrIntOverflowCommands + } + 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: Request: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Request: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + default: + iNdEx = preIndex + skippy, err := skipCommands(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthCommands + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *RpcApiStartServerResponse) 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 ErrIntOverflowCommands + } + 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: Response: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Response: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Error", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowCommands + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthCommands + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthCommands + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Error == nil { + m.Error = &RpcApiStartServerResponseError{} + } + if err := m.Error.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipCommands(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthCommands + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *RpcApiStartServerResponseError) 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 ErrIntOverflowCommands + } + 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: Error: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Error: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Code", wireType) + } + m.Code = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowCommands + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Code |= RpcApiStartServerResponseErrorCode(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Description", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowCommands + } + 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 ErrInvalidLengthCommands + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthCommands + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Description = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipCommands(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthCommands + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *RpcApiStopServer) 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 ErrIntOverflowCommands + } + 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: StopServer: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: StopServer: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + default: + iNdEx = preIndex + skippy, err := skipCommands(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthCommands + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *RpcApiStopServerRequest) 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 ErrIntOverflowCommands + } + 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: Request: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Request: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + default: + iNdEx = preIndex + skippy, err := skipCommands(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthCommands + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *RpcApiStopServerResponse) 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 ErrIntOverflowCommands + } + 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: Response: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Response: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Error", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowCommands + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthCommands + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthCommands + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Error == nil { + m.Error = &RpcApiStopServerResponseError{} + } + if err := m.Error.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipCommands(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthCommands + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *RpcApiStopServerResponseError) 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 ErrIntOverflowCommands + } + 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: Error: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Error: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Code", wireType) + } + m.Code = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowCommands + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Code |= RpcApiStopServerResponseErrorCode(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Description", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowCommands + } + 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 ErrInvalidLengthCommands + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthCommands + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Description = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipCommands(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthCommands + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} func (m *Empty) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 diff --git a/pb/protos/commands.proto b/pb/protos/commands.proto index bb7ea7b88..a331f7c4f 100644 --- a/pb/protos/commands.proto +++ b/pb/protos/commands.proto @@ -7721,6 +7721,51 @@ message Rpc { } } } + message Api { + message StartServer { + message Request { + // empty + } + + message Response { + Error error = 1; + + message Error { + Code code = 1; + string description = 2; + + enum Code { + NULL = 0; + UNKNOWN_ERROR = 1; + BAD_INPUT = 2; + PORT_ALREADY_USED = 3; + SERVER_ALREADY_STARTED = 4; + } + } + } + } + message StopServer { + message Request{ + // empty + } + + message Response { + Error error = 1; + + message Error { + Code code = 1; + string description = 2; + + enum Code { + NULL = 0; + UNKNOWN_ERROR = 1; + BAD_INPUT = 2; + SERVER_NOT_STARTED = 3; + } + } + } + } + } } diff --git a/pb/protos/service/service.proto b/pb/protos/service/service.proto index 56a5f4706..7186e56e8 100644 --- a/pb/protos/service/service.proto +++ b/pb/protos/service/service.proto @@ -379,4 +379,8 @@ service ClientCommands { rpc ChatUnsubscribe (anytype.Rpc.Chat.Unsubscribe.Request) returns (anytype.Rpc.Chat.Unsubscribe.Response); rpc ObjectChatAdd (anytype.Rpc.Object.ChatAdd.Request) returns (anytype.Rpc.Object.ChatAdd.Response); + // API + // *** + rpc ApiStartServer (anytype.Rpc.Api.StartServer.Request) returns (anytype.Rpc.Api.StartServer.Response); + rpc ApiStopServer (anytype.Rpc.Api.StopServer.Request) returns (anytype.Rpc.Api.StopServer.Response); } diff --git a/pb/service/service.pb.go b/pb/service/service.pb.go index 6b5274431..c0dedc04d 100644 --- a/pb/service/service.pb.go +++ b/pb/service/service.pb.go @@ -26,337 +26,340 @@ const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package func init() { proto.RegisterFile("pb/protos/service/service.proto", fileDescriptor_93a29dc403579097) } var fileDescriptor_93a29dc403579097 = []byte{ - // 5279 bytes of a gzipped FileDescriptorProto + // 5319 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x9d, 0x5b, 0x6f, 0x24, 0x49, - 0x56, 0xf8, 0xc7, 0x2f, 0xff, 0xf9, 0x93, 0xcb, 0x0e, 0x50, 0x03, 0xc3, 0xec, 0xb0, 0xdb, 0xb7, - 0xe9, 0xb6, 0xdd, 0x6d, 0xbb, 0xdc, 0xd3, 0x3d, 0x3d, 0xb3, 0xda, 0x45, 0x42, 0x6e, 0xbb, 0xed, - 0x31, 0x6b, 0xbb, 0x8d, 0xab, 0xdc, 0x2d, 0x8d, 0x84, 0x44, 0x38, 0x2b, 0x5c, 0x4e, 0x9c, 0x95, - 0x91, 0x9b, 0x19, 0x55, 0xee, 0x5a, 0x04, 0x02, 0x81, 0x40, 0x20, 0x10, 0x2b, 0x6e, 0xaf, 0x48, - 0x7c, 0x1a, 0x1e, 0xf7, 0x91, 0x47, 0x34, 0x23, 0x1e, 0xf8, 0x16, 0x28, 0x23, 0x23, 0xe3, 0x72, - 0xf2, 0x9c, 0xc8, 0xf4, 0x3e, 0x75, 0xab, 0xce, 0xef, 0x9c, 0x13, 0xd7, 0x13, 0x27, 0x22, 0x23, - 0xd3, 0xd1, 0xdd, 0xfc, 0x62, 0x3b, 0x2f, 0x84, 0x14, 0xe5, 0x76, 0xc9, 0x8b, 0x45, 0x12, 0xf3, - 0xe6, 0xdf, 0xa1, 0xfa, 0x79, 0xf0, 0x3e, 0xcb, 0x96, 0x72, 0x99, 0xf3, 0x4f, 0x3e, 0xb6, 0x64, - 0x2c, 0x66, 0x33, 0x96, 0x4d, 0xca, 0x1a, 0xf9, 0xe4, 0x23, 0x2b, 0xe1, 0x0b, 0x9e, 0x49, 0xfd, - 0xfb, 0xb3, 0xff, 0xf9, 0xdf, 0x95, 0xe8, 0x83, 0xdd, 0x34, 0xe1, 0x99, 0xdc, 0xd5, 0x1a, 0x83, - 0xaf, 0xa3, 0xef, 0xee, 0xe4, 0xf9, 0x01, 0x97, 0x6f, 0x78, 0x51, 0x26, 0x22, 0x1b, 0x7c, 0x3a, - 0xd4, 0x0e, 0x86, 0x67, 0x79, 0x3c, 0xdc, 0xc9, 0xf3, 0xa1, 0x15, 0x0e, 0xcf, 0xf8, 0x4f, 0xe7, - 0xbc, 0x94, 0x9f, 0x3c, 0x0c, 0x43, 0x65, 0x2e, 0xb2, 0x92, 0x0f, 0x2e, 0xa3, 0xdf, 0xd8, 0xc9, - 0xf3, 0x11, 0x97, 0x7b, 0xbc, 0xaa, 0xc0, 0x48, 0x32, 0xc9, 0x07, 0x6b, 0x2d, 0x55, 0x1f, 0x30, - 0x3e, 0xd6, 0xbb, 0x41, 0xed, 0x67, 0x1c, 0x7d, 0xa7, 0xf2, 0x73, 0x35, 0x97, 0x13, 0x71, 0x93, - 0x0d, 0xee, 0xb7, 0x15, 0xb5, 0xc8, 0xd8, 0x7e, 0x10, 0x42, 0xb4, 0xd5, 0xb7, 0xd1, 0xaf, 0xbe, + 0x56, 0xf8, 0xc7, 0x2f, 0xff, 0xf9, 0x93, 0xcb, 0x0e, 0x50, 0x03, 0xc3, 0xec, 0xb0, 0xdb, 0xdd, + 0xd3, 0x17, 0xdb, 0xdd, 0xb6, 0xcb, 0x3d, 0xdd, 0xd3, 0x33, 0xab, 0x5d, 0x24, 0xe4, 0xb6, 0xdb, + 0x1e, 0xb3, 0xb6, 0xdb, 0xb8, 0xca, 0xdd, 0xd2, 0x48, 0x48, 0x84, 0xb3, 0xc2, 0xe5, 0xc4, 0x59, + 0x19, 0xb9, 0x99, 0x51, 0xe5, 0xae, 0x45, 0x20, 0x10, 0x08, 0x04, 0x02, 0xb1, 0xe2, 0xf6, 0x0a, + 0xe2, 0xd3, 0xf0, 0xb8, 0x8f, 0x3c, 0xa2, 0x99, 0x47, 0xbe, 0x04, 0xca, 0xc8, 0xc8, 0xb8, 0x9c, + 0x3c, 0x27, 0x32, 0xbd, 0x4f, 0xdd, 0xf2, 0xf9, 0x9d, 0x73, 0xe2, 0x7a, 0xe2, 0x44, 0x64, 0x64, + 0x56, 0x74, 0x37, 0xbf, 0xd8, 0xce, 0x0b, 0x21, 0x45, 0xb9, 0x5d, 0xf2, 0x62, 0x91, 0xc4, 0xbc, + 0xf9, 0x77, 0xa8, 0xfe, 0x3c, 0x78, 0x9f, 0x65, 0x4b, 0xb9, 0xcc, 0xf9, 0x27, 0x1f, 0x5b, 0x32, + 0x16, 0xb3, 0x19, 0xcb, 0x26, 0x65, 0x8d, 0x7c, 0xf2, 0x91, 0x95, 0xf0, 0x05, 0xcf, 0xa4, 0xfe, + 0xfb, 0xb3, 0xff, 0xf8, 0xdf, 0x95, 0xe8, 0x83, 0xdd, 0x34, 0xe1, 0x99, 0xdc, 0xd5, 0x1a, 0x83, + 0xaf, 0xa3, 0xef, 0xee, 0xe4, 0xf9, 0x01, 0x97, 0x6f, 0x78, 0x51, 0x26, 0x22, 0x1b, 0x3c, 0x18, + 0x6a, 0x07, 0xc3, 0xb3, 0x3c, 0x1e, 0xee, 0xe4, 0xf9, 0xd0, 0x0a, 0x87, 0x67, 0xfc, 0xa7, 0x73, + 0x5e, 0xca, 0x4f, 0x1e, 0x86, 0xa1, 0x32, 0x17, 0x59, 0xc9, 0x07, 0x97, 0xd1, 0x6f, 0xec, 0xe4, + 0xf9, 0x88, 0xcb, 0x3d, 0x5e, 0x55, 0x60, 0x24, 0x99, 0xe4, 0x83, 0xb5, 0x96, 0xaa, 0x0f, 0x18, + 0x1f, 0xeb, 0xdd, 0xa0, 0xf6, 0x33, 0x8e, 0xbe, 0x53, 0xf9, 0xb9, 0x9a, 0xcb, 0x89, 0xb8, 0xc9, + 0x06, 0x9f, 0xb6, 0x15, 0xb5, 0xc8, 0xd8, 0xbe, 0x1f, 0x42, 0xb4, 0xd5, 0xb7, 0xd1, 0xaf, 0xbe, 0x65, 0x69, 0xca, 0xe5, 0x6e, 0xc1, 0xab, 0x82, 0xfb, 0x3a, 0xb5, 0x68, 0x58, 0xcb, 0x8c, 0xdd, - 0x4f, 0x83, 0x8c, 0x36, 0xfc, 0x75, 0xf4, 0xdd, 0x5a, 0x72, 0xc6, 0x63, 0xb1, 0xe0, 0xc5, 0x00, - 0xd5, 0xd2, 0x42, 0xa2, 0xc9, 0x5b, 0x10, 0xb4, 0xbd, 0x2b, 0xb2, 0x05, 0x2f, 0x24, 0x6e, 0x5b, - 0x0b, 0xc3, 0xb6, 0x2d, 0xa4, 0x6d, 0xff, 0xed, 0x4a, 0xf4, 0xfd, 0x9d, 0x38, 0x16, 0xf3, 0x4c, - 0x1e, 0x89, 0x98, 0xa5, 0x47, 0x49, 0x76, 0x7d, 0xc2, 0x6f, 0x76, 0xaf, 0x2a, 0x3e, 0x9b, 0xf2, - 0xc1, 0x73, 0xbf, 0x55, 0x6b, 0x74, 0x68, 0xd8, 0xa1, 0x0b, 0x1b, 0xdf, 0x9f, 0xdf, 0x4e, 0x49, - 0x97, 0xe5, 0x1f, 0x57, 0xa2, 0x3b, 0xb0, 0x2c, 0x23, 0x91, 0x2e, 0xb8, 0x2d, 0xcd, 0x8b, 0x0e, - 0xc3, 0x3e, 0x6e, 0xca, 0xf3, 0xc5, 0x6d, 0xd5, 0x74, 0x89, 0xd2, 0xe8, 0x43, 0x77, 0xb8, 0x8c, - 0x78, 0xa9, 0xa6, 0xd3, 0x63, 0x7a, 0x44, 0x68, 0xc4, 0x78, 0x7e, 0xd2, 0x07, 0xd5, 0xde, 0x92, - 0x68, 0xa0, 0xbd, 0xa5, 0xa2, 0x34, 0xce, 0xd6, 0x51, 0x0b, 0x0e, 0x61, 0x7c, 0x3d, 0xee, 0x41, - 0x6a, 0x57, 0x7f, 0x14, 0xfd, 0xda, 0x5b, 0x51, 0x5c, 0x97, 0x39, 0x8b, 0xb9, 0x9e, 0x0a, 0x8f, - 0x7c, 0xed, 0x46, 0x0a, 0x67, 0xc3, 0x6a, 0x17, 0xe6, 0x0c, 0xda, 0x46, 0xf8, 0x3a, 0xe7, 0x30, - 0x06, 0x59, 0xc5, 0x4a, 0x48, 0x0d, 0x5a, 0x08, 0x69, 0xdb, 0xd7, 0xd1, 0xc0, 0xda, 0xbe, 0xf8, - 0x63, 0x1e, 0xcb, 0x9d, 0xc9, 0x04, 0xf6, 0x8a, 0xd5, 0x55, 0xc4, 0x70, 0x67, 0x32, 0xa1, 0x7a, - 0x05, 0x47, 0xb5, 0xb3, 0x9b, 0xe8, 0x23, 0xe0, 0xec, 0x28, 0x29, 0x95, 0xc3, 0xad, 0xb0, 0x15, - 0x8d, 0x19, 0xa7, 0xc3, 0xbe, 0xb8, 0x76, 0xfc, 0xe7, 0x2b, 0xd1, 0xf7, 0x10, 0xcf, 0x67, 0x7c, - 0x26, 0x16, 0x7c, 0xf0, 0xb4, 0xdb, 0x5a, 0x4d, 0x1a, 0xff, 0x9f, 0xdd, 0x42, 0x03, 0x19, 0x26, - 0x23, 0x9e, 0xf2, 0x58, 0x92, 0xc3, 0xa4, 0x16, 0x77, 0x0e, 0x13, 0x83, 0x39, 0x33, 0xac, 0x11, - 0x1e, 0x70, 0xb9, 0x3b, 0x2f, 0x0a, 0x9e, 0x49, 0xb2, 0x2f, 0x2d, 0xd2, 0xd9, 0x97, 0x1e, 0x8a, - 0xd4, 0xe7, 0x80, 0xcb, 0x9d, 0x34, 0x25, 0xeb, 0x53, 0x8b, 0x3b, 0xeb, 0x63, 0x30, 0xed, 0x21, - 0x8e, 0x7e, 0xdd, 0x69, 0x31, 0x79, 0x98, 0x5d, 0x8a, 0x01, 0xdd, 0x16, 0x4a, 0x6e, 0x7c, 0xac, - 0x75, 0x72, 0x48, 0x35, 0x5e, 0xbd, 0xcb, 0x45, 0x41, 0x77, 0x4b, 0x2d, 0xee, 0xac, 0x86, 0xc1, - 0xb4, 0x87, 0x3f, 0x8c, 0x3e, 0xd0, 0x51, 0xb2, 0x59, 0xcf, 0x1e, 0xa2, 0x21, 0x14, 0x2e, 0x68, - 0x8f, 0x3a, 0x28, 0x1b, 0x1c, 0xb4, 0x4c, 0x07, 0x9f, 0x4f, 0x51, 0x3d, 0x10, 0x7a, 0x1e, 0x86, - 0xa1, 0x96, 0xed, 0x3d, 0x9e, 0x72, 0xd2, 0x76, 0x2d, 0xec, 0xb0, 0x6d, 0x20, 0x6d, 0xbb, 0x88, - 0x7e, 0xcb, 0x34, 0x4b, 0xb5, 0x8e, 0x2a, 0x79, 0x15, 0xa4, 0x37, 0x88, 0x7a, 0xbb, 0x90, 0xf1, - 0xb5, 0xd9, 0x0f, 0x6e, 0xd5, 0x47, 0xcf, 0x40, 0xbc, 0x3e, 0x60, 0xfe, 0x3d, 0x0c, 0x43, 0xda, - 0xf6, 0xdf, 0xad, 0x44, 0x3f, 0xd0, 0xb2, 0x57, 0x19, 0xbb, 0x48, 0xb9, 0x5a, 0x12, 0x4f, 0xb8, - 0xbc, 0x11, 0xc5, 0xf5, 0x68, 0x99, 0xc5, 0xc4, 0xf2, 0x8f, 0xc3, 0x1d, 0xcb, 0x3f, 0xa9, 0xe4, - 0x64, 0x7c, 0xba, 0xa2, 0x52, 0xe4, 0x30, 0xe3, 0x6b, 0x6a, 0x20, 0x45, 0x4e, 0x65, 0x7c, 0x3e, - 0xd2, 0xb2, 0x7a, 0x5c, 0x85, 0x4d, 0xdc, 0xea, 0xb1, 0x1b, 0x27, 0x1f, 0x84, 0x10, 0x1b, 0xb6, - 0x9a, 0x01, 0x2c, 0xb2, 0xcb, 0x64, 0x7a, 0x9e, 0x4f, 0xaa, 0x61, 0xfc, 0x18, 0x1f, 0xa1, 0x0e, - 0x42, 0x84, 0x2d, 0x02, 0xd5, 0xde, 0xfe, 0xc1, 0x26, 0x46, 0x7a, 0x2a, 0xed, 0x17, 0x62, 0x76, - 0xc4, 0xa7, 0x2c, 0x5e, 0xea, 0xf9, 0xff, 0x79, 0x68, 0xe2, 0x41, 0xda, 0x14, 0xe2, 0xc5, 0x2d, - 0xb5, 0x74, 0x79, 0xfe, 0x7d, 0x25, 0x7a, 0xd8, 0x54, 0xff, 0x8a, 0x65, 0x53, 0xae, 0xfb, 0xb3, - 0x2e, 0xfd, 0x4e, 0x36, 0x39, 0xe3, 0xa5, 0x64, 0x85, 0x1c, 0xfc, 0x08, 0xaf, 0x64, 0x48, 0xc7, - 0x94, 0xed, 0xc7, 0xbf, 0x94, 0xae, 0xed, 0xf5, 0x51, 0x15, 0xd8, 0x74, 0x08, 0xf0, 0x7b, 0x5d, - 0x49, 0x60, 0x00, 0x78, 0x10, 0x42, 0x6c, 0xaf, 0x2b, 0xc1, 0x61, 0xb6, 0x48, 0x24, 0x3f, 0xe0, - 0x19, 0x2f, 0xda, 0xbd, 0x5e, 0xab, 0xfa, 0x08, 0xd1, 0xeb, 0x04, 0x6a, 0x83, 0x8d, 0xe7, 0xcd, - 0x2c, 0x8e, 0x1b, 0x01, 0x23, 0xad, 0xe5, 0x71, 0xb3, 0x1f, 0x6c, 0x77, 0x77, 0x8e, 0xcf, 0x33, - 0xbe, 0x10, 0xd7, 0x70, 0x77, 0xe7, 0x9a, 0xa8, 0x01, 0x62, 0x77, 0x87, 0x82, 0x76, 0x05, 0x73, - 0xfc, 0xbc, 0x49, 0xf8, 0x0d, 0x58, 0xc1, 0x5c, 0xe5, 0x4a, 0x4c, 0xac, 0x60, 0x08, 0xa6, 0x3d, - 0x9c, 0x44, 0xbf, 0xa2, 0x84, 0xbf, 0x2f, 0x92, 0x6c, 0x70, 0x17, 0x51, 0xaa, 0x04, 0xc6, 0xea, - 0x3d, 0x1a, 0x00, 0x25, 0xae, 0x7e, 0xdd, 0x65, 0x59, 0xcc, 0x53, 0xb4, 0xc4, 0x56, 0x1c, 0x2c, - 0xb1, 0x87, 0xd9, 0xd4, 0x41, 0x09, 0xab, 0xf8, 0x35, 0xba, 0x62, 0x45, 0x92, 0x4d, 0x07, 0x98, - 0xae, 0x23, 0x27, 0x52, 0x07, 0x8c, 0x03, 0x43, 0x58, 0x2b, 0xee, 0xe4, 0x79, 0x51, 0x85, 0x45, - 0x6c, 0x08, 0xfb, 0x48, 0x70, 0x08, 0xb7, 0x50, 0xdc, 0xdb, 0x1e, 0x8f, 0xd3, 0x24, 0x0b, 0x7a, - 0xd3, 0x48, 0x1f, 0x6f, 0x16, 0x05, 0x83, 0xf7, 0x88, 0xb3, 0x05, 0x6f, 0x6a, 0x86, 0xb5, 0x8c, - 0x0b, 0x04, 0x07, 0x2f, 0x00, 0xed, 0x3e, 0x4d, 0x89, 0x8f, 0xd9, 0x35, 0xaf, 0x1a, 0x98, 0x57, - 0xeb, 0xda, 0x00, 0xd3, 0xf7, 0x08, 0x62, 0x9f, 0x86, 0x93, 0xda, 0xd5, 0x3c, 0xfa, 0x48, 0xc9, - 0x4f, 0x59, 0x21, 0x93, 0x38, 0xc9, 0x59, 0xd6, 0xe4, 0xff, 0xd8, 0xbc, 0x6e, 0x51, 0xc6, 0xe5, - 0x56, 0x4f, 0x5a, 0xbb, 0xfd, 0xb7, 0x95, 0xe8, 0x3e, 0xf4, 0x7b, 0xca, 0x8b, 0x59, 0xa2, 0xb6, + 0x07, 0x41, 0x46, 0x1b, 0xfe, 0x3a, 0xfa, 0x6e, 0x2d, 0x39, 0xe3, 0xb1, 0x58, 0xf0, 0x62, 0x80, + 0x6a, 0x69, 0x21, 0xd1, 0xe4, 0x2d, 0x08, 0xda, 0xde, 0x15, 0xd9, 0x82, 0x17, 0x12, 0xb7, 0xad, + 0x85, 0x61, 0xdb, 0x16, 0xd2, 0xb6, 0xff, 0x76, 0x25, 0xfa, 0xfe, 0x4e, 0x1c, 0x8b, 0x79, 0x26, + 0x8f, 0x44, 0xcc, 0xd2, 0xa3, 0x24, 0xbb, 0x3e, 0xe1, 0x37, 0xbb, 0x57, 0x15, 0x9f, 0x4d, 0xf9, + 0xe0, 0xb9, 0xdf, 0xaa, 0x35, 0x3a, 0x34, 0xec, 0xd0, 0x85, 0x8d, 0xef, 0xcf, 0x6f, 0xa7, 0xa4, + 0xcb, 0xf2, 0x8f, 0x2b, 0xd1, 0x1d, 0x58, 0x96, 0x91, 0x48, 0x17, 0xdc, 0x96, 0xe6, 0x45, 0x87, + 0x61, 0x1f, 0x37, 0xe5, 0xf9, 0xe2, 0xb6, 0x6a, 0xba, 0x44, 0x69, 0xf4, 0xa1, 0x3b, 0x5c, 0x46, + 0xbc, 0x54, 0xd3, 0xe9, 0x31, 0x3d, 0x22, 0x34, 0x62, 0x3c, 0x3f, 0xe9, 0x83, 0x6a, 0x6f, 0x49, + 0x34, 0xd0, 0xde, 0x52, 0x51, 0x1a, 0x67, 0xeb, 0xa8, 0x05, 0x87, 0x30, 0xbe, 0x1e, 0xf7, 0x20, + 0xb5, 0xab, 0x3f, 0x8a, 0x7e, 0xed, 0xad, 0x28, 0xae, 0xcb, 0x9c, 0xc5, 0x5c, 0x4f, 0x85, 0x47, + 0xbe, 0x76, 0x23, 0x85, 0xb3, 0x61, 0xb5, 0x0b, 0x73, 0x06, 0x6d, 0x23, 0x7c, 0x9d, 0x73, 0x18, + 0x83, 0xac, 0x62, 0x25, 0xa4, 0x06, 0x2d, 0x84, 0xb4, 0xed, 0xeb, 0x68, 0x60, 0x6d, 0x5f, 0xfc, + 0x31, 0x8f, 0xe5, 0xce, 0x64, 0x02, 0x7b, 0xc5, 0xea, 0x2a, 0x62, 0xb8, 0x33, 0x99, 0x50, 0xbd, + 0x82, 0xa3, 0xda, 0xd9, 0x4d, 0xf4, 0x11, 0x70, 0x76, 0x94, 0x94, 0xca, 0xe1, 0x56, 0xd8, 0x8a, + 0xc6, 0x8c, 0xd3, 0x61, 0x5f, 0x5c, 0x3b, 0xfe, 0xf3, 0x95, 0xe8, 0x7b, 0x88, 0xe7, 0x33, 0x3e, + 0x13, 0x0b, 0x3e, 0x78, 0xda, 0x6d, 0xad, 0x26, 0x8d, 0xff, 0xcf, 0x6e, 0xa1, 0x81, 0x0c, 0x93, + 0x11, 0x4f, 0x79, 0x2c, 0xc9, 0x61, 0x52, 0x8b, 0x3b, 0x87, 0x89, 0xc1, 0x9c, 0x19, 0xd6, 0x08, + 0x0f, 0xb8, 0xdc, 0x9d, 0x17, 0x05, 0xcf, 0x24, 0xd9, 0x97, 0x16, 0xe9, 0xec, 0x4b, 0x0f, 0x45, + 0xea, 0x73, 0xc0, 0xe5, 0x4e, 0x9a, 0x92, 0xf5, 0xa9, 0xc5, 0x9d, 0xf5, 0x31, 0x98, 0xf6, 0x10, + 0x47, 0xbf, 0xee, 0xb4, 0x98, 0x3c, 0xcc, 0x2e, 0xc5, 0x80, 0x6e, 0x0b, 0x25, 0x37, 0x3e, 0xd6, + 0x3a, 0x39, 0xa4, 0x1a, 0xaf, 0xde, 0xe5, 0xa2, 0xa0, 0xbb, 0xa5, 0x16, 0x77, 0x56, 0xc3, 0x60, + 0xda, 0xc3, 0x1f, 0x46, 0x1f, 0xe8, 0x28, 0xd9, 0xac, 0x67, 0x0f, 0xd1, 0x10, 0x0a, 0x17, 0xb4, + 0x47, 0x1d, 0x94, 0x0d, 0x0e, 0x5a, 0xa6, 0x83, 0xcf, 0x03, 0x54, 0x0f, 0x84, 0x9e, 0x87, 0x61, + 0xa8, 0x65, 0x7b, 0x8f, 0xa7, 0x9c, 0xb4, 0x5d, 0x0b, 0x3b, 0x6c, 0x1b, 0x48, 0xdb, 0x2e, 0xa2, + 0xdf, 0x32, 0xcd, 0x52, 0xad, 0xa3, 0x4a, 0x5e, 0x05, 0xe9, 0x0d, 0xa2, 0xde, 0x2e, 0x64, 0x7c, + 0x6d, 0xf6, 0x83, 0x5b, 0xf5, 0xd1, 0x33, 0x10, 0xaf, 0x0f, 0x98, 0x7f, 0x0f, 0xc3, 0x90, 0xb6, + 0xfd, 0x77, 0x2b, 0xd1, 0x0f, 0xb4, 0xec, 0x55, 0xc6, 0x2e, 0x52, 0xae, 0x96, 0xc4, 0x13, 0x2e, + 0x6f, 0x44, 0x71, 0x3d, 0x5a, 0x66, 0x31, 0xb1, 0xfc, 0xe3, 0x70, 0xc7, 0xf2, 0x4f, 0x2a, 0x39, + 0x19, 0x9f, 0xae, 0xa8, 0x14, 0x39, 0xcc, 0xf8, 0x9a, 0x1a, 0x48, 0x91, 0x53, 0x19, 0x9f, 0x8f, + 0xb4, 0xac, 0x1e, 0x57, 0x61, 0x13, 0xb7, 0x7a, 0xec, 0xc6, 0xc9, 0xfb, 0x21, 0xc4, 0x86, 0xad, + 0x66, 0x00, 0x8b, 0xec, 0x32, 0x99, 0x9e, 0xe7, 0x93, 0x6a, 0x18, 0x3f, 0xc6, 0x47, 0xa8, 0x83, + 0x10, 0x61, 0x8b, 0x40, 0xb5, 0xb7, 0x7f, 0xb0, 0x89, 0x91, 0x9e, 0x4a, 0xfb, 0x85, 0x98, 0x1d, + 0xf1, 0x29, 0x8b, 0x97, 0x7a, 0xfe, 0x7f, 0x1e, 0x9a, 0x78, 0x90, 0x36, 0x85, 0x78, 0x71, 0x4b, + 0x2d, 0x5d, 0x9e, 0x7f, 0x5f, 0x89, 0x1e, 0x36, 0xd5, 0xbf, 0x62, 0xd9, 0x94, 0xeb, 0xfe, 0xac, + 0x4b, 0xbf, 0x93, 0x4d, 0xce, 0x78, 0x29, 0x59, 0x21, 0x07, 0x3f, 0xc2, 0x2b, 0x19, 0xd2, 0x31, + 0x65, 0xfb, 0xf1, 0x2f, 0xa5, 0x6b, 0x7b, 0x7d, 0x54, 0x05, 0x36, 0x1d, 0x02, 0xfc, 0x5e, 0x57, + 0x12, 0x18, 0x00, 0xee, 0x87, 0x10, 0xdb, 0xeb, 0x4a, 0x70, 0x98, 0x2d, 0x12, 0xc9, 0x0f, 0x78, + 0xc6, 0x8b, 0x76, 0xaf, 0xd7, 0xaa, 0x3e, 0x42, 0xf4, 0x3a, 0x81, 0xda, 0x60, 0xe3, 0x79, 0x33, + 0x8b, 0xe3, 0x46, 0xc0, 0x48, 0x6b, 0x79, 0xdc, 0xec, 0x07, 0xdb, 0xdd, 0x9d, 0xe3, 0xf3, 0x8c, + 0x2f, 0xc4, 0x35, 0xdc, 0xdd, 0xb9, 0x26, 0x6a, 0x80, 0xd8, 0xdd, 0xa1, 0xa0, 0x5d, 0xc1, 0x1c, + 0x3f, 0x6f, 0x12, 0x7e, 0x03, 0x56, 0x30, 0x57, 0xb9, 0x12, 0x13, 0x2b, 0x18, 0x82, 0x69, 0x0f, + 0x27, 0xd1, 0xaf, 0x28, 0xe1, 0xef, 0x8b, 0x24, 0x1b, 0xdc, 0x45, 0x94, 0x2a, 0x81, 0xb1, 0x7a, + 0x8f, 0x06, 0x40, 0x89, 0xab, 0xbf, 0xee, 0xb2, 0x2c, 0xe6, 0x29, 0x5a, 0x62, 0x2b, 0x0e, 0x96, + 0xd8, 0xc3, 0x6c, 0xea, 0xa0, 0x84, 0x55, 0xfc, 0x1a, 0x5d, 0xb1, 0x22, 0xc9, 0xa6, 0x03, 0x4c, + 0xd7, 0x91, 0x13, 0xa9, 0x03, 0xc6, 0x81, 0x21, 0xac, 0x15, 0x77, 0xf2, 0xbc, 0xa8, 0xc2, 0x22, + 0x36, 0x84, 0x7d, 0x24, 0x38, 0x84, 0x5b, 0x28, 0xee, 0x6d, 0x8f, 0xc7, 0x69, 0x92, 0x05, 0xbd, + 0x69, 0xa4, 0x8f, 0x37, 0x8b, 0x82, 0xc1, 0x7b, 0xc4, 0xd9, 0x82, 0x37, 0x35, 0xc3, 0x5a, 0xc6, + 0x05, 0x82, 0x83, 0x17, 0x80, 0x76, 0x9f, 0xa6, 0xc4, 0xc7, 0xec, 0x9a, 0x57, 0x0d, 0xcc, 0xab, + 0x75, 0x6d, 0x80, 0xe9, 0x7b, 0x04, 0xb1, 0x4f, 0xc3, 0x49, 0xed, 0x6a, 0x1e, 0x7d, 0xa4, 0xe4, + 0xa7, 0xac, 0x90, 0x49, 0x9c, 0xe4, 0x2c, 0x6b, 0xf2, 0x7f, 0x6c, 0x5e, 0xb7, 0x28, 0xe3, 0x72, + 0xab, 0x27, 0xad, 0xdd, 0xfe, 0xdb, 0x4a, 0xf4, 0x29, 0xf4, 0x7b, 0xca, 0x8b, 0x59, 0xa2, 0xb6, 0x91, 0x65, 0x1d, 0x84, 0x07, 0x5f, 0x86, 0x8d, 0xb6, 0x14, 0x4c, 0x69, 0x7e, 0x78, 0x7b, 0x45, 0x9b, 0x0c, 0x8d, 0x74, 0x6a, 0xfd, 0xba, 0x98, 0xb4, 0x8e, 0x59, 0x46, 0x4d, 0xbe, 0xac, 0x84, 0x44, 0x32, 0xd4, 0x82, 0xc0, 0x0c, 0x3f, 0xcf, 0xca, 0xc6, 0x3a, 0x36, 0xc3, 0xad, 0x38, 0x38, 0xc3, 0x3d, 0x4c, 0x7b, 0xf8, 0x83, 0x28, 0xaa, 0x37, 0x5b, 0x6a, 0x43, 0xec, 0xc7, 0x1c, 0xbd, - 0x0b, 0xf3, 0x76, 0xc3, 0xf7, 0x03, 0x84, 0x5d, 0xe8, 0xea, 0xdf, 0xd5, 0x3e, 0x7f, 0x80, 0x6a, - 0x28, 0x11, 0xb1, 0xd0, 0x01, 0x04, 0x16, 0x74, 0x74, 0x25, 0x6e, 0xf0, 0x82, 0x56, 0x92, 0x70, - 0x41, 0x35, 0x61, 0x4f, 0xde, 0x74, 0x41, 0xb1, 0x93, 0xb7, 0xa6, 0x18, 0xa1, 0x93, 0x37, 0xc8, - 0x68, 0xc3, 0x22, 0xfa, 0x4d, 0xd7, 0xf0, 0x4b, 0x21, 0xae, 0x67, 0xac, 0xb8, 0x1e, 0x3c, 0xa1, - 0x95, 0x1b, 0xc6, 0x38, 0xda, 0xe8, 0xc5, 0xda, 0xa0, 0xe6, 0x3a, 0xac, 0xd2, 0xa4, 0xf3, 0x22, - 0x05, 0x41, 0xcd, 0xb3, 0xa1, 0x11, 0x22, 0xa8, 0x11, 0xa8, 0x1d, 0x95, 0xae, 0xb7, 0x11, 0x87, - 0x7b, 0x3d, 0x4f, 0x7d, 0xc4, 0xa9, 0xbd, 0x1e, 0x82, 0xc1, 0x21, 0x74, 0x50, 0xb0, 0xfc, 0x0a, - 0x1f, 0x42, 0x4a, 0x14, 0x1e, 0x42, 0x0d, 0x02, 0xfb, 0x7b, 0xc4, 0x59, 0x11, 0x5f, 0xe1, 0xfd, - 0x5d, 0xcb, 0xc2, 0xfd, 0x6d, 0x18, 0xd8, 0xdf, 0xb5, 0xe0, 0x6d, 0x22, 0xaf, 0x8e, 0xb9, 0x64, - 0x78, 0x7f, 0xfb, 0x4c, 0xb8, 0xbf, 0x5b, 0xac, 0xcd, 0xc3, 0x5c, 0x87, 0xa3, 0xf9, 0x45, 0x19, - 0x17, 0xc9, 0x05, 0x1f, 0x04, 0xac, 0x18, 0x88, 0xc8, 0xc3, 0x48, 0x58, 0xfb, 0xfc, 0xf9, 0x4a, - 0x74, 0xb7, 0xe9, 0x76, 0x51, 0x96, 0x3a, 0xe6, 0xf9, 0xee, 0x5f, 0xe0, 0xfd, 0x4b, 0xe0, 0xc4, - 0x59, 0x68, 0x0f, 0x35, 0x67, 0x4d, 0xc0, 0x8b, 0x74, 0x9e, 0x95, 0xa6, 0x50, 0x5f, 0xf6, 0xb1, - 0xee, 0x28, 0x10, 0x6b, 0x42, 0x2f, 0x45, 0xbb, 0x1c, 0xeb, 0xfe, 0x69, 0x64, 0x87, 0x93, 0x12, - 0x2c, 0xc7, 0x4d, 0x7b, 0x3b, 0x04, 0xb1, 0x1c, 0xe3, 0x24, 0x1c, 0x0a, 0x07, 0x85, 0x98, 0xe7, - 0x65, 0xc7, 0x50, 0x00, 0x50, 0x78, 0x28, 0xb4, 0x61, 0xed, 0xf3, 0x5d, 0xf4, 0xdb, 0xee, 0xf0, - 0x73, 0x1b, 0x7b, 0x8b, 0x1e, 0x53, 0x58, 0x13, 0x0f, 0xfb, 0xe2, 0x36, 0x21, 0x6d, 0x3c, 0xcb, - 0x3d, 0x2e, 0x59, 0x92, 0x96, 0x83, 0x55, 0xdc, 0x46, 0x23, 0x27, 0x12, 0x52, 0x8c, 0x83, 0xf1, - 0x6d, 0x6f, 0x9e, 0xa7, 0x49, 0xdc, 0x3e, 0x89, 0xd6, 0xba, 0x46, 0x1c, 0x8e, 0x6f, 0x2e, 0x06, - 0xe3, 0x75, 0xb5, 0xe4, 0xab, 0xff, 0x8c, 0x97, 0x39, 0xc7, 0xe3, 0xb5, 0x87, 0x84, 0xe3, 0x35, - 0x44, 0x61, 0x7d, 0x46, 0x5c, 0x1e, 0xb1, 0xa5, 0x98, 0x13, 0xf1, 0xda, 0x88, 0xc3, 0xf5, 0x71, - 0x31, 0x9b, 0x13, 0x1a, 0x0f, 0x87, 0x99, 0xe4, 0x45, 0xc6, 0xd2, 0xfd, 0x94, 0x4d, 0xcb, 0x01, - 0x11, 0x63, 0x7c, 0x8a, 0xc8, 0x09, 0x69, 0x1a, 0x69, 0xc6, 0xc3, 0x72, 0x9f, 0x2d, 0x44, 0x91, - 0x48, 0xba, 0x19, 0x2d, 0xd2, 0xd9, 0x8c, 0x1e, 0x8a, 0x7a, 0xdb, 0x29, 0xe2, 0xab, 0x64, 0xc1, - 0x27, 0x01, 0x6f, 0x0d, 0xd2, 0xc3, 0x9b, 0x83, 0x22, 0x9d, 0x36, 0x12, 0xf3, 0x22, 0xe6, 0x64, - 0xa7, 0xd5, 0xe2, 0xce, 0x4e, 0x33, 0x98, 0xf6, 0xf0, 0x57, 0x2b, 0xd1, 0xef, 0xd4, 0x52, 0xf7, - 0x78, 0x78, 0x8f, 0x95, 0x57, 0x17, 0x82, 0x15, 0x93, 0xc1, 0x67, 0x98, 0x1d, 0x14, 0x35, 0xae, - 0x9f, 0xdd, 0x46, 0x05, 0x36, 0xeb, 0x51, 0x52, 0x3a, 0x33, 0x0e, 0x6d, 0x56, 0x0f, 0x09, 0x37, - 0x2b, 0x44, 0x61, 0x00, 0x51, 0xf2, 0xfa, 0x28, 0x66, 0x95, 0xd4, 0xf7, 0xcf, 0x63, 0xd6, 0x3a, - 0x39, 0x18, 0x1f, 0x2b, 0xa1, 0x3f, 0x5a, 0xb6, 0x28, 0x1b, 0xf8, 0x88, 0x19, 0xf6, 0xc5, 0x49, - 0xcf, 0x66, 0x56, 0x84, 0x3d, 0xb7, 0x66, 0xc6, 0xb0, 0x2f, 0x4e, 0x78, 0x76, 0xc2, 0x5a, 0xc8, - 0x33, 0x12, 0xda, 0x86, 0x7d, 0x71, 0x98, 0x7d, 0x69, 0xa6, 0x59, 0x17, 0x9e, 0x04, 0xec, 0xc0, - 0xb5, 0x61, 0xa3, 0x17, 0xab, 0x1d, 0xfe, 0xcd, 0x4a, 0xf4, 0x7d, 0xeb, 0xf1, 0x58, 0x4c, 0x92, - 0xcb, 0x65, 0x0d, 0xbd, 0x61, 0xe9, 0x9c, 0x97, 0x83, 0x67, 0x94, 0xb5, 0x36, 0x6b, 0x4a, 0xf0, - 0xfc, 0x56, 0x3a, 0x70, 0xee, 0xec, 0xe4, 0x79, 0xba, 0x1c, 0xf3, 0x59, 0x9e, 0x92, 0x73, 0xc7, - 0x43, 0xc2, 0x73, 0x07, 0xa2, 0x30, 0x2b, 0x1f, 0x8b, 0x2a, 0xe7, 0x47, 0xb3, 0x72, 0x25, 0x0a, - 0x67, 0xe5, 0x0d, 0x02, 0x73, 0xa5, 0xb1, 0xd8, 0x15, 0x69, 0xca, 0x63, 0xd9, 0x7e, 0xc4, 0x6c, - 0x34, 0x2d, 0x11, 0xce, 0x95, 0x00, 0x69, 0x4f, 0x63, 0x9a, 0x3d, 0x24, 0x2b, 0xf8, 0xcb, 0xe5, - 0x51, 0x92, 0x5d, 0x0f, 0xf0, 0xb4, 0xc0, 0x02, 0xc4, 0x69, 0x0c, 0x0a, 0xc2, 0xbd, 0xea, 0x79, - 0x36, 0x11, 0xf8, 0x5e, 0xb5, 0x92, 0x84, 0xf7, 0xaa, 0x9a, 0x80, 0x26, 0xcf, 0x38, 0x65, 0xb2, - 0x92, 0x84, 0x4d, 0x6a, 0x02, 0x0b, 0x85, 0xfa, 0xcc, 0x9e, 0x0c, 0x85, 0xe0, 0x94, 0x7e, 0xad, - 0x93, 0x83, 0x23, 0xb4, 0xd9, 0xb4, 0xee, 0x73, 0x19, 0x5f, 0xe1, 0x23, 0xd4, 0x43, 0xc2, 0x23, - 0x14, 0xa2, 0xb0, 0x4a, 0x63, 0x61, 0x36, 0xdd, 0xab, 0xf8, 0xf8, 0x68, 0x6d, 0xb8, 0xd7, 0x3a, - 0x39, 0xb8, 0x8d, 0x3c, 0x9c, 0xa9, 0x36, 0x43, 0x07, 0x79, 0x2d, 0x0b, 0x6f, 0x23, 0x0d, 0x03, - 0x4b, 0x5f, 0x0b, 0xaa, 0xe6, 0xc4, 0x4b, 0x6f, 0xe5, 0xe1, 0xd2, 0x7b, 0x9c, 0x76, 0xf2, 0x2f, - 0x66, 0x1b, 0x57, 0x4b, 0x4f, 0x44, 0x35, 0x47, 0xde, 0xb0, 0x34, 0x99, 0x30, 0xc9, 0xc7, 0xe2, - 0x9a, 0x67, 0xf8, 0x8e, 0x49, 0x97, 0xb6, 0xe6, 0x87, 0x9e, 0x42, 0x78, 0xc7, 0x14, 0x56, 0x84, - 0xe3, 0xa4, 0xa6, 0xcf, 0x4b, 0xbe, 0xcb, 0x4a, 0x22, 0x92, 0x79, 0x48, 0x78, 0x9c, 0x40, 0x14, - 0xe6, 0xab, 0xb5, 0xfc, 0xd5, 0xbb, 0x9c, 0x17, 0x09, 0xcf, 0x62, 0x8e, 0xe7, 0xab, 0x90, 0x0a, - 0xe7, 0xab, 0x08, 0x0d, 0xf7, 0x6a, 0x7b, 0x4c, 0xf2, 0x97, 0xcb, 0x71, 0x32, 0xe3, 0xa5, 0x64, - 0xb3, 0x1c, 0xdf, 0xab, 0x01, 0x28, 0xbc, 0x57, 0x6b, 0xc3, 0xad, 0xa3, 0x21, 0x13, 0x10, 0xdb, - 0x37, 0x53, 0x20, 0x11, 0xb8, 0x99, 0x42, 0xa0, 0xb0, 0x61, 0x2d, 0x80, 0x1e, 0x0e, 0xb7, 0xac, - 0x04, 0x0f, 0x87, 0x69, 0xba, 0x75, 0xe0, 0x66, 0x98, 0x51, 0x35, 0x35, 0x3b, 0x8a, 0x3e, 0x72, - 0xa7, 0xe8, 0x46, 0x2f, 0x16, 0x3f, 0xe1, 0x3b, 0xe3, 0x29, 0x53, 0xcb, 0x56, 0xe0, 0x18, 0xad, - 0x61, 0xfa, 0x9c, 0xf0, 0x39, 0xac, 0x76, 0xf8, 0x17, 0x2b, 0xd1, 0x27, 0x98, 0xc7, 0xd7, 0xb9, - 0xf2, 0xfb, 0xb4, 0xdb, 0x56, 0x4d, 0x12, 0x57, 0x6f, 0xc2, 0x1a, 0xba, 0x0c, 0x7f, 0x12, 0x7d, - 0xdc, 0x88, 0xec, 0xcd, 0x1c, 0x5d, 0x00, 0x3f, 0x69, 0x33, 0xe5, 0x87, 0x9c, 0x71, 0xbf, 0xdd, - 0x9b, 0xb7, 0xfb, 0x21, 0xbf, 0x5c, 0x25, 0xd8, 0x0f, 0x19, 0x1b, 0x5a, 0x4c, 0xec, 0x87, 0x10, - 0xcc, 0xce, 0x4e, 0xb7, 0x7a, 0x6f, 0x13, 0x79, 0xa5, 0xf2, 0x2d, 0x30, 0x3b, 0xbd, 0xb2, 0x1a, - 0x88, 0x98, 0x9d, 0x24, 0x0c, 0x33, 0x92, 0x06, 0xac, 0xe6, 0x26, 0x16, 0xcb, 0x8d, 0x21, 0x77, - 0x66, 0xae, 0x77, 0x83, 0x70, 0xbc, 0x36, 0x62, 0xbd, 0xf5, 0x79, 0x12, 0xb2, 0x00, 0xb6, 0x3f, - 0x1b, 0xbd, 0x58, 0xed, 0xf0, 0xcf, 0xa2, 0xef, 0xb5, 0x2a, 0xb6, 0xcf, 0x99, 0x9c, 0x17, 0x7c, - 0x32, 0xd8, 0xee, 0x28, 0x77, 0x03, 0x1a, 0xd7, 0x4f, 0xfb, 0x2b, 0xb4, 0x72, 0xf4, 0x86, 0xab, - 0x87, 0x95, 0x29, 0xc3, 0xb3, 0x90, 0x49, 0x9f, 0x0d, 0xe6, 0xe8, 0xb4, 0x4e, 0x6b, 0x9b, 0xed, - 0x8e, 0xae, 0x9d, 0x05, 0x4b, 0x52, 0xf5, 0x90, 0xee, 0xb3, 0x90, 0x51, 0x0f, 0x0d, 0x6e, 0xb3, - 0x49, 0x95, 0x56, 0x64, 0x56, 0x73, 0xdc, 0xd9, 0x9e, 0x6d, 0xd2, 0x91, 0x00, 0xd9, 0x9d, 0x6d, - 0xf5, 0xa4, 0xb5, 0x5b, 0xd9, 0x2c, 0x79, 0xd5, 0xcf, 0xee, 0x20, 0xc7, 0xbc, 0x6a, 0x55, 0x64, - 0xa4, 0x6f, 0xf5, 0xa4, 0xb5, 0xd7, 0x3f, 0x8d, 0x3e, 0x6e, 0x7b, 0xd5, 0x0b, 0xd1, 0x76, 0xa7, - 0x29, 0xb0, 0x16, 0x3d, 0xed, 0xaf, 0x60, 0xb7, 0x34, 0x5f, 0x25, 0xa5, 0x14, 0xc5, 0x72, 0x74, - 0x25, 0x6e, 0x9a, 0x1b, 0xef, 0xfe, 0x6c, 0xd5, 0xc0, 0xd0, 0x21, 0x88, 0x2d, 0x0d, 0x4e, 0xb6, - 0x5c, 0xd9, 0x9b, 0xf1, 0x25, 0xe1, 0xca, 0x21, 0x3a, 0x5c, 0xf9, 0xa4, 0x8d, 0x55, 0x4d, 0xad, - 0xec, 0x35, 0xfe, 0x35, 0xbc, 0xa8, 0xed, 0xab, 0xfc, 0xeb, 0xdd, 0xa0, 0xcd, 0x58, 0xb4, 0x78, - 0x2f, 0xb9, 0xbc, 0x34, 0x75, 0xc2, 0x4b, 0xea, 0x22, 0x44, 0xc6, 0x42, 0xa0, 0x36, 0xe9, 0xde, - 0x4f, 0x52, 0xae, 0x4e, 0xf4, 0x5f, 0x5f, 0x5e, 0xa6, 0x82, 0x4d, 0x40, 0xd2, 0x5d, 0x89, 0x87, - 0xae, 0x9c, 0x48, 0xba, 0x31, 0xce, 0x3e, 0x23, 0xae, 0xa4, 0x67, 0x3c, 0x16, 0x59, 0x9c, 0xa4, - 0xf0, 0x02, 0xa0, 0xd2, 0x34, 0x42, 0xe2, 0x19, 0x71, 0x0b, 0xb2, 0x0b, 0x63, 0x25, 0xaa, 0xa6, - 0x7d, 0x53, 0xfe, 0x47, 0x6d, 0x45, 0x47, 0x4c, 0x2c, 0x8c, 0x08, 0x66, 0xf7, 0x9e, 0x95, 0xf0, - 0x3c, 0x57, 0xc6, 0xef, 0xb5, 0xb5, 0x6a, 0x09, 0xb1, 0xf7, 0xf4, 0x09, 0xbb, 0x87, 0xaa, 0x7e, - 0xdf, 0x13, 0x37, 0x99, 0x32, 0xfa, 0xa0, 0xad, 0xd2, 0xc8, 0x88, 0x3d, 0x14, 0x64, 0xb4, 0xe1, - 0x9f, 0x44, 0xff, 0x5f, 0x19, 0x2e, 0x44, 0x3e, 0xb8, 0x83, 0x28, 0x14, 0xce, 0x5d, 0xbd, 0xbb, - 0xa4, 0xdc, 0x5e, 0x39, 0x35, 0x63, 0xe3, 0xbc, 0x64, 0x53, 0x3e, 0x78, 0x48, 0xf4, 0xb8, 0x92, - 0x12, 0x57, 0x4e, 0xdb, 0x94, 0x3f, 0x2a, 0x4e, 0xc4, 0x44, 0x5b, 0x47, 0x6a, 0x68, 0x84, 0xa1, - 0x51, 0xe1, 0x42, 0x36, 0x99, 0x39, 0x61, 0x8b, 0x64, 0x6a, 0x16, 0x9c, 0x3a, 0x6e, 0x95, 0x20, - 0x99, 0xb1, 0xcc, 0xd0, 0x81, 0x88, 0x64, 0x86, 0x84, 0xb5, 0xcf, 0x7f, 0x5e, 0x89, 0xee, 0x59, - 0xe6, 0xa0, 0x39, 0xad, 0x3b, 0xcc, 0x2e, 0x45, 0x95, 0xfa, 0x1c, 0x25, 0xd9, 0x75, 0x39, 0xf8, - 0x82, 0x32, 0x89, 0xf3, 0xa6, 0x28, 0x5f, 0xde, 0x5a, 0xcf, 0x66, 0xad, 0xcd, 0x51, 0x96, 0x7d, - 0x9e, 0x5d, 0x6b, 0x80, 0xac, 0xd5, 0x9c, 0x78, 0x41, 0x8e, 0xc8, 0x5a, 0x43, 0xbc, 0xed, 0x62, - 0xe3, 0x3c, 0x15, 0x19, 0xec, 0x62, 0x6b, 0xa1, 0x12, 0x12, 0x5d, 0xdc, 0x82, 0x6c, 0x3c, 0x6e, - 0x44, 0xf5, 0xa9, 0xcb, 0x4e, 0x9a, 0x82, 0x78, 0x6c, 0x54, 0x0d, 0x40, 0xc4, 0x63, 0x14, 0xd4, - 0x7e, 0xce, 0xa2, 0xef, 0x54, 0x4d, 0x7a, 0x5a, 0xf0, 0x45, 0xc2, 0xe1, 0xd5, 0x0b, 0x47, 0x42, - 0xcc, 0x7f, 0x9f, 0xb0, 0x33, 0xeb, 0x3c, 0x2b, 0xf3, 0x94, 0x95, 0x57, 0xfa, 0x61, 0xbc, 0x5f, - 0xe7, 0x46, 0x08, 0x1f, 0xc7, 0x3f, 0xea, 0xa0, 0x6c, 0x50, 0x6f, 0x64, 0x26, 0xc4, 0xac, 0xe2, - 0xaa, 0xad, 0x30, 0xb3, 0xd6, 0xc9, 0xd9, 0x13, 0xef, 0x03, 0x96, 0xa6, 0xbc, 0x58, 0x36, 0xb2, - 0x63, 0x96, 0x25, 0x97, 0xbc, 0x94, 0xe0, 0xc4, 0x5b, 0x53, 0x43, 0x88, 0x11, 0x27, 0xde, 0x01, - 0xdc, 0x66, 0xf3, 0xc0, 0xf3, 0x61, 0x36, 0xe1, 0xef, 0x40, 0x36, 0x0f, 0xed, 0x28, 0x86, 0xc8, - 0xe6, 0x29, 0xd6, 0x9e, 0xfc, 0xbe, 0x4c, 0x45, 0x7c, 0xad, 0x97, 0x00, 0xbf, 0x83, 0x95, 0x04, - 0xae, 0x01, 0x0f, 0x42, 0x88, 0x5d, 0x04, 0x94, 0xe0, 0x8c, 0xe7, 0x29, 0x8b, 0xe1, 0xfd, 0x9b, - 0x5a, 0x47, 0xcb, 0x88, 0x45, 0x00, 0x32, 0xa0, 0xb8, 0xfa, 0x5e, 0x0f, 0x56, 0x5c, 0x70, 0xad, - 0xe7, 0x41, 0x08, 0xb1, 0xcb, 0xa0, 0x12, 0x8c, 0xf2, 0x34, 0x91, 0x60, 0x1a, 0xd4, 0x1a, 0x4a, - 0x42, 0x4c, 0x03, 0x9f, 0x00, 0x26, 0x8f, 0x79, 0x31, 0xe5, 0xa8, 0x49, 0x25, 0x09, 0x9a, 0x6c, - 0x08, 0x7b, 0xc9, 0xb4, 0xae, 0xbb, 0xc8, 0x97, 0xe0, 0x92, 0xa9, 0xae, 0x96, 0xc8, 0x97, 0xc4, - 0x25, 0x53, 0x0f, 0x00, 0x45, 0x3c, 0x65, 0xa5, 0xc4, 0x8b, 0xa8, 0x24, 0xc1, 0x22, 0x36, 0x84, - 0x5d, 0xa3, 0xeb, 0x22, 0xce, 0x25, 0x58, 0xa3, 0x75, 0x01, 0x9c, 0x27, 0xd0, 0x77, 0x49, 0xb9, - 0x8d, 0x24, 0x75, 0xaf, 0x70, 0xb9, 0x9f, 0xf0, 0x74, 0x52, 0x82, 0x48, 0xa2, 0xdb, 0xbd, 0x91, - 0x12, 0x91, 0xa4, 0x4d, 0x81, 0xa1, 0xa4, 0xcf, 0xc7, 0xb1, 0xda, 0x81, 0xa3, 0xf1, 0x07, 0x21, - 0xc4, 0xc6, 0xa7, 0xa6, 0xd0, 0xbb, 0xac, 0x28, 0x92, 0x6a, 0xf1, 0x5f, 0xc5, 0x0b, 0xd4, 0xc8, - 0x89, 0xf8, 0x84, 0x71, 0x60, 0x7a, 0x35, 0x81, 0x1b, 0x2b, 0x18, 0x0c, 0xdd, 0x9f, 0x06, 0x19, - 0x9b, 0x71, 0x2a, 0x89, 0xf3, 0x08, 0x15, 0x6b, 0x4d, 0xe4, 0x09, 0xea, 0x6a, 0x17, 0xe6, 0xbc, - 0x04, 0x62, 0x5c, 0x1c, 0x8b, 0x05, 0x1f, 0x8b, 0x57, 0xef, 0x92, 0x52, 0x26, 0xd9, 0x54, 0xaf, - 0xdc, 0xcf, 0x09, 0x4b, 0x18, 0x4c, 0xbc, 0x04, 0xd2, 0xa9, 0x64, 0x13, 0x08, 0x50, 0x96, 0x13, - 0x7e, 0x83, 0x26, 0x10, 0xd0, 0xa2, 0xe1, 0x88, 0x04, 0x22, 0xc4, 0xdb, 0x73, 0x14, 0xe3, 0x5c, - 0xbf, 0x29, 0x3b, 0x16, 0x4d, 0x2e, 0x47, 0x59, 0x83, 0x20, 0xb1, 0x95, 0x0d, 0x2a, 0xd8, 0xfd, - 0xa5, 0xf1, 0x6f, 0xa7, 0xd8, 0x3a, 0x61, 0xa7, 0x3d, 0xcd, 0x1e, 0xf7, 0x20, 0x11, 0x57, 0xf6, - 0x1e, 0x00, 0xe5, 0xaa, 0x7d, 0x0d, 0xe0, 0x71, 0x0f, 0xd2, 0x39, 0x93, 0x71, 0xab, 0xf5, 0x92, - 0xc5, 0xd7, 0xd3, 0x42, 0xcc, 0xb3, 0xc9, 0xae, 0x48, 0x45, 0x01, 0xce, 0x64, 0xbc, 0x52, 0x03, - 0x94, 0x38, 0x93, 0xe9, 0x50, 0xb1, 0x19, 0x9c, 0x5b, 0x8a, 0x9d, 0x34, 0x99, 0xc2, 0x1d, 0xb5, - 0x67, 0x48, 0x01, 0x44, 0x06, 0x87, 0x82, 0xc8, 0x20, 0xaa, 0x77, 0xdc, 0x32, 0x89, 0x59, 0x5a, - 0xfb, 0xdb, 0xa6, 0xcd, 0x78, 0x60, 0xe7, 0x20, 0x42, 0x14, 0x90, 0x7a, 0x8e, 0xe7, 0x45, 0x76, - 0x98, 0x49, 0x41, 0xd6, 0xb3, 0x01, 0x3a, 0xeb, 0xe9, 0x80, 0x20, 0xac, 0x8e, 0xf9, 0xbb, 0xaa, - 0x34, 0xd5, 0x3f, 0x58, 0x58, 0xad, 0x7e, 0x1f, 0x6a, 0x79, 0x28, 0xac, 0x02, 0x0e, 0x54, 0x46, - 0x3b, 0xa9, 0x07, 0x4c, 0x40, 0xdb, 0x1f, 0x26, 0xeb, 0xdd, 0x20, 0xee, 0x67, 0x24, 0x97, 0x29, - 0x0f, 0xf9, 0x51, 0x40, 0x1f, 0x3f, 0x0d, 0x68, 0x8f, 0x5b, 0xbc, 0xfa, 0x5c, 0xf1, 0xf8, 0xba, - 0x75, 0xad, 0xc9, 0x2f, 0x68, 0x8d, 0x10, 0xc7, 0x2d, 0x04, 0x8a, 0x77, 0xd1, 0x61, 0x2c, 0xb2, - 0x50, 0x17, 0x55, 0xf2, 0x3e, 0x5d, 0xa4, 0x39, 0xbb, 0xf9, 0x35, 0x52, 0x3d, 0x32, 0xeb, 0x6e, - 0xda, 0x20, 0x2c, 0xb8, 0x10, 0xb1, 0xf9, 0x25, 0x61, 0x9b, 0x93, 0x43, 0x9f, 0xc7, 0xed, 0x3b, - 0xdf, 0x2d, 0x2b, 0xc7, 0xf4, 0x9d, 0x6f, 0x8a, 0xa5, 0x2b, 0x59, 0x8f, 0x91, 0x0e, 0x2b, 0xfe, - 0x38, 0xd9, 0xec, 0x07, 0xdb, 0x2d, 0x8f, 0xe7, 0x73, 0x37, 0xe5, 0xac, 0xa8, 0xbd, 0x6e, 0x05, - 0x0c, 0x59, 0x8c, 0xd8, 0xf2, 0x04, 0x70, 0x10, 0xc2, 0x3c, 0xcf, 0xbb, 0x22, 0x93, 0x3c, 0x93, - 0x58, 0x08, 0xf3, 0x8d, 0x69, 0x30, 0x14, 0xc2, 0x28, 0x05, 0x30, 0x6e, 0xd5, 0x79, 0x10, 0x97, - 0x27, 0x6c, 0x86, 0x66, 0x6c, 0xf5, 0x59, 0x4f, 0x2d, 0x0f, 0x8d, 0x5b, 0xc0, 0x39, 0x0f, 0xf9, - 0x5c, 0x2f, 0x63, 0x56, 0x4c, 0xcd, 0xe9, 0xc6, 0x64, 0xf0, 0x94, 0xb6, 0xe3, 0x93, 0xc4, 0x43, - 0xbe, 0xb0, 0x06, 0x08, 0x3b, 0x87, 0x33, 0x36, 0x35, 0x35, 0x45, 0x6a, 0xa0, 0xe4, 0xad, 0xaa, - 0xae, 0x77, 0x83, 0xc0, 0xcf, 0x9b, 0x64, 0xc2, 0x45, 0xc0, 0x8f, 0x92, 0xf7, 0xf1, 0x03, 0x41, - 0x90, 0xbd, 0x55, 0xf5, 0xae, 0x77, 0x74, 0x3b, 0xd9, 0x44, 0xef, 0x63, 0x87, 0x44, 0xf3, 0x00, - 0x2e, 0x94, 0xbd, 0x11, 0x3c, 0x98, 0xa3, 0xcd, 0x01, 0x6d, 0x68, 0x8e, 0x9a, 0xf3, 0xd7, 0x3e, - 0x73, 0x14, 0x83, 0xb5, 0xcf, 0x9f, 0xe9, 0x39, 0xba, 0xc7, 0x24, 0xab, 0xf2, 0xf6, 0x37, 0x09, - 0xbf, 0xd1, 0x1b, 0x61, 0xa4, 0xbe, 0x0d, 0x35, 0x54, 0xaf, 0x2a, 0x82, 0x5d, 0xf1, 0x76, 0x6f, - 0x3e, 0xe0, 0x5b, 0xef, 0x10, 0x3a, 0x7d, 0x83, 0xad, 0xc2, 0x76, 0x6f, 0x3e, 0xe0, 0x5b, 0xbf, - 0x03, 0xdd, 0xe9, 0x1b, 0xbc, 0x08, 0xbd, 0xdd, 0x9b, 0xd7, 0xbe, 0xff, 0xb2, 0x99, 0xb8, 0xae, - 0xf3, 0x2a, 0x0f, 0x8b, 0x65, 0xb2, 0xe0, 0x58, 0x3a, 0xe9, 0xdb, 0x33, 0x68, 0x28, 0x9d, 0xa4, - 0x55, 0x9c, 0x0f, 0xe7, 0x60, 0xa5, 0x38, 0x15, 0x65, 0xa2, 0x1e, 0xd2, 0x3f, 0xef, 0x61, 0xb4, - 0x81, 0x43, 0x9b, 0xa6, 0x90, 0x92, 0x7d, 0xdc, 0xe8, 0xa1, 0xf6, 0x16, 0xf3, 0x66, 0xc0, 0x5e, - 0xfb, 0x32, 0xf3, 0x56, 0x4f, 0xda, 0x3e, 0xf8, 0xf3, 0x18, 0xf7, 0x89, 0x63, 0xa8, 0x57, 0xd1, - 0x87, 0x8e, 0x4f, 0xfb, 0x2b, 0x68, 0xf7, 0x7f, 0xdd, 0xec, 0x2b, 0xa0, 0x7f, 0x3d, 0x09, 0x9e, - 0xf5, 0xb1, 0x08, 0x26, 0xc2, 0xf3, 0x5b, 0xe9, 0xe8, 0x82, 0xfc, 0x7d, 0xb3, 0x81, 0x6e, 0x50, - 0xf5, 0x2e, 0x87, 0x7a, 0xf7, 0x4f, 0xcf, 0x89, 0x50, 0xb7, 0x5a, 0x18, 0xce, 0x8c, 0x17, 0xb7, - 0xd4, 0x72, 0x3e, 0xa3, 0xe4, 0xc1, 0xfa, 0x9d, 0x43, 0xa7, 0x3c, 0x21, 0xcb, 0x0e, 0x0d, 0x0b, - 0xf4, 0xc5, 0x6d, 0xd5, 0xa8, 0xb9, 0xe2, 0xc0, 0xea, 0xab, 0x0c, 0xcf, 0x7b, 0x1a, 0xf6, 0xbe, - 0xd3, 0xf0, 0xf9, 0xed, 0x94, 0x74, 0x59, 0xfe, 0x63, 0x25, 0x7a, 0xe4, 0xb1, 0xf6, 0x79, 0x02, - 0x38, 0xf5, 0xf8, 0x71, 0xc0, 0x3e, 0xa5, 0x64, 0x0a, 0xf7, 0xbb, 0xbf, 0x9c, 0xb2, 0xfd, 0xe6, - 0x90, 0xa7, 0xb2, 0x9f, 0xa4, 0x92, 0x17, 0xed, 0x6f, 0x0e, 0xf9, 0x76, 0x6b, 0x6a, 0x48, 0x7f, - 0x73, 0x28, 0x80, 0x3b, 0xdf, 0x1c, 0x42, 0x3c, 0xa3, 0xdf, 0x1c, 0x42, 0xad, 0x05, 0xbf, 0x39, - 0x14, 0xd6, 0xa0, 0xc2, 0x7b, 0x53, 0x84, 0xfa, 0xdc, 0xba, 0x97, 0x45, 0xff, 0x18, 0xfb, 0xd9, - 0x6d, 0x54, 0x88, 0x05, 0xae, 0xe6, 0xd4, 0x3d, 0xb7, 0x1e, 0x6d, 0xea, 0xdd, 0x75, 0xdb, 0xee, - 0xcd, 0x6b, 0xdf, 0x3f, 0xd5, 0xbb, 0x1b, 0x13, 0xce, 0x45, 0xa1, 0xbe, 0x37, 0xb5, 0x11, 0x0a, - 0xcf, 0x95, 0x05, 0xb7, 0xe7, 0x37, 0xfb, 0xc1, 0x44, 0x75, 0x2b, 0x42, 0x77, 0xfa, 0xb0, 0xcb, - 0x10, 0xe8, 0xf2, 0xed, 0xde, 0x3c, 0xb1, 0x8c, 0xd4, 0xbe, 0xeb, 0xde, 0xee, 0x61, 0xcc, 0xef, - 0xeb, 0xa7, 0xfd, 0x15, 0xb4, 0xfb, 0x85, 0x4e, 0x1b, 0x5d, 0xf7, 0xaa, 0x9f, 0xb7, 0xba, 0x4c, - 0x8d, 0xbc, 0x6e, 0x1e, 0xf6, 0xc5, 0x43, 0x09, 0x84, 0xbb, 0x84, 0x76, 0x25, 0x10, 0xe8, 0x32, - 0xfa, 0xf9, 0xed, 0x94, 0x74, 0x59, 0xfe, 0x69, 0x25, 0xba, 0x4b, 0x96, 0x45, 0x8f, 0x83, 0x2f, - 0xfa, 0x5a, 0x06, 0xe3, 0xe1, 0xcb, 0x5b, 0xeb, 0xe9, 0x42, 0xfd, 0xeb, 0x4a, 0x74, 0x2f, 0x50, - 0xa8, 0x7a, 0x80, 0xdc, 0xc2, 0xba, 0x3f, 0x50, 0x7e, 0x78, 0x7b, 0x45, 0x6a, 0xb9, 0x77, 0xf1, - 0x51, 0xfb, 0x63, 0x3c, 0x01, 0xdb, 0x23, 0xfa, 0x63, 0x3c, 0xdd, 0x5a, 0xf0, 0x90, 0x87, 0x5d, - 0x34, 0x9b, 0x2e, 0xf4, 0x90, 0x47, 0xdd, 0x50, 0x03, 0x7b, 0x8e, 0xb5, 0x4e, 0x0e, 0x73, 0xf2, - 0xea, 0x5d, 0xce, 0xb2, 0x09, 0xed, 0xa4, 0x96, 0x77, 0x3b, 0x31, 0x1c, 0x3c, 0x1c, 0xab, 0xa4, - 0x67, 0xa2, 0xd9, 0x48, 0x3d, 0xa6, 0xf4, 0x0d, 0x12, 0x3c, 0x1c, 0x6b, 0xa1, 0x84, 0x37, 0x9d, - 0x35, 0x86, 0xbc, 0x81, 0x64, 0xf1, 0x49, 0x1f, 0x14, 0xa4, 0xe8, 0xc6, 0x9b, 0x39, 0x73, 0xdf, - 0x0c, 0x59, 0x69, 0x9d, 0xbb, 0x6f, 0xf5, 0xa4, 0x09, 0xb7, 0x23, 0x2e, 0xbf, 0xe2, 0x6c, 0xc2, - 0x8b, 0xa0, 0x5b, 0x43, 0xf5, 0x72, 0xeb, 0xd2, 0x98, 0xdb, 0x5d, 0x91, 0xce, 0x67, 0x99, 0xee, - 0x4c, 0xd2, 0xad, 0x4b, 0x75, 0xbb, 0x05, 0x34, 0x3c, 0x16, 0xb4, 0x6e, 0x55, 0x7a, 0xf9, 0x24, - 0x6c, 0xc6, 0xcb, 0x2a, 0x37, 0x7a, 0xb1, 0x74, 0x3d, 0xf5, 0x30, 0xea, 0xa8, 0x27, 0x18, 0x49, - 0x5b, 0x3d, 0x69, 0x78, 0x3e, 0xe7, 0xb8, 0x35, 0xe3, 0x69, 0xbb, 0xc3, 0x56, 0x6b, 0x48, 0x3d, - 0xed, 0xaf, 0x00, 0x4f, 0x43, 0xf5, 0xa8, 0x3a, 0x4a, 0x4a, 0xb9, 0x9f, 0xa4, 0xe9, 0x60, 0x23, - 0x30, 0x4c, 0x1a, 0x28, 0x78, 0x1a, 0x8a, 0xc0, 0xc4, 0x48, 0x6e, 0x4e, 0x0f, 0xb3, 0x41, 0x97, - 0x1d, 0x45, 0xf5, 0x1a, 0xc9, 0x2e, 0x0d, 0x4e, 0xb4, 0x9c, 0xa6, 0x36, 0xb5, 0x1d, 0x86, 0x1b, - 0xae, 0x55, 0xe1, 0xed, 0xde, 0x3c, 0x78, 0xdc, 0xae, 0x28, 0xb5, 0xb2, 0x3c, 0xa4, 0x4c, 0x78, - 0x2b, 0xc9, 0xa3, 0x0e, 0x0a, 0x9c, 0x0a, 0xd6, 0xd3, 0xe8, 0x6d, 0x32, 0x99, 0x72, 0x89, 0x3e, - 0x29, 0x72, 0x81, 0xe0, 0x93, 0x22, 0x00, 0x82, 0xae, 0xab, 0x7f, 0x37, 0xc7, 0xa1, 0x87, 0x13, - 0xac, 0xeb, 0xb4, 0xb2, 0x43, 0x85, 0xba, 0x0e, 0xa5, 0x41, 0x34, 0x30, 0x6e, 0xf5, 0xeb, 0xf8, - 0x4f, 0x42, 0x66, 0xc0, 0x3b, 0xf9, 0x1b, 0xbd, 0x58, 0xb0, 0xa2, 0x58, 0x87, 0xc9, 0x2c, 0x91, - 0xd8, 0x8a, 0xe2, 0xd8, 0xa8, 0x90, 0xd0, 0x8a, 0xd2, 0x46, 0xa9, 0xea, 0x55, 0x39, 0xc2, 0xe1, - 0x24, 0x5c, 0xbd, 0x9a, 0xe9, 0x57, 0x3d, 0xc3, 0xb6, 0x1e, 0x6c, 0x66, 0x66, 0xc8, 0xc8, 0x2b, - 0xbd, 0x59, 0x46, 0xc6, 0xb6, 0x7a, 0x4d, 0x13, 0x82, 0xa1, 0xa8, 0x43, 0x29, 0xc0, 0x03, 0xfb, - 0x8a, 0x6b, 0x9e, 0xbd, 0xe6, 0x39, 0x67, 0x05, 0xcb, 0x62, 0x74, 0x73, 0xaa, 0x0c, 0xb6, 0xc8, - 0xd0, 0xe6, 0x94, 0xd4, 0x00, 0x8f, 0xcd, 0xfd, 0x17, 0x2c, 0x91, 0xa9, 0x60, 0xde, 0x64, 0xf4, - 0xdf, 0xaf, 0x7c, 0xdc, 0x83, 0x84, 0x8f, 0xcd, 0x1b, 0xc0, 0x1c, 0x7c, 0xd7, 0x4e, 0x3f, 0x0b, - 0x98, 0xf2, 0xd1, 0xd0, 0x46, 0x98, 0x56, 0x01, 0x83, 0xda, 0x24, 0xb8, 0x5c, 0xfe, 0x84, 0x2f, - 0xb1, 0x41, 0x6d, 0xf3, 0x53, 0x85, 0x84, 0x06, 0x75, 0x1b, 0x05, 0x79, 0xa6, 0xbb, 0x0f, 0x5a, - 0x0d, 0xe8, 0xbb, 0x5b, 0x9f, 0xb5, 0x4e, 0x0e, 0xcc, 0x9c, 0xbd, 0x64, 0xe1, 0x3d, 0x27, 0x40, - 0x0a, 0xba, 0x97, 0x2c, 0xf0, 0xc7, 0x04, 0x1b, 0xbd, 0x58, 0xf8, 0x48, 0x9e, 0x49, 0xfe, 0xae, - 0x79, 0x56, 0x8e, 0x14, 0x57, 0xc9, 0x5b, 0x0f, 0xcb, 0xd7, 0xbb, 0x41, 0x7b, 0x01, 0xf6, 0xb4, - 0x10, 0x31, 0x2f, 0x4b, 0xfd, 0x85, 0x42, 0xff, 0x86, 0x91, 0x96, 0x0d, 0xc1, 0xf7, 0x09, 0x1f, - 0x86, 0x21, 0xdb, 0x33, 0x5a, 0x64, 0xbf, 0x7a, 0xb3, 0x8a, 0x6a, 0xb6, 0x3f, 0x78, 0xb3, 0xd6, - 0xc9, 0xd9, 0xe9, 0xa5, 0xa5, 0xee, 0x67, 0x6e, 0xd6, 0x51, 0x75, 0xec, 0x0b, 0x37, 0x8f, 0x7b, - 0x90, 0xda, 0xd5, 0x57, 0xd1, 0xfb, 0x47, 0x62, 0x3a, 0xe2, 0xd9, 0x64, 0xf0, 0x03, 0xff, 0x0a, - 0xad, 0x98, 0x0e, 0xab, 0x9f, 0x8d, 0xd1, 0x3b, 0x94, 0xd8, 0x5e, 0x02, 0xdc, 0xe3, 0x17, 0xf3, - 0xe9, 0x48, 0x32, 0x09, 0x2e, 0x01, 0xaa, 0xdf, 0x87, 0x95, 0x80, 0xb8, 0x04, 0xe8, 0x01, 0xc0, - 0xde, 0xb8, 0xe0, 0x1c, 0xb5, 0x57, 0x09, 0x82, 0xf6, 0x34, 0x60, 0xb3, 0x08, 0x63, 0xaf, 0x4a, - 0xd4, 0xe1, 0xa5, 0x3d, 0xab, 0xa3, 0xa4, 0x44, 0x16, 0xd1, 0xa6, 0xec, 0xe0, 0xae, 0xab, 0xaf, - 0xbe, 0x3a, 0x32, 0x9f, 0xcd, 0x58, 0xb1, 0x04, 0x83, 0x5b, 0xd7, 0xd2, 0x01, 0x88, 0xc1, 0x8d, - 0x82, 0x76, 0xd6, 0x36, 0xcd, 0x1c, 0x5f, 0x1f, 0x88, 0x42, 0xcc, 0x65, 0x92, 0x71, 0xf8, 0xe5, - 0x09, 0xd3, 0xa0, 0x2e, 0x43, 0xcc, 0x5a, 0x8a, 0xb5, 0x59, 0xae, 0x22, 0xea, 0xfb, 0x84, 0xea, - 0xbb, 0xc5, 0xa5, 0x14, 0x05, 0x7c, 0x9e, 0x58, 0x5b, 0x81, 0x10, 0x91, 0xe5, 0x92, 0x30, 0xe8, - 0xfb, 0xd3, 0x24, 0x9b, 0xa2, 0x7d, 0x7f, 0xea, 0x7e, 0xf5, 0xf3, 0x1e, 0x0d, 0xd8, 0x09, 0x55, - 0x37, 0x5a, 0x3d, 0x01, 0xf4, 0xbb, 0x9c, 0x68, 0xa3, 0xbb, 0x04, 0x31, 0xa1, 0x70, 0x12, 0xb8, - 0x7a, 0x9d, 0xf3, 0x8c, 0x4f, 0x9a, 0x5b, 0x73, 0x98, 0x2b, 0x8f, 0x08, 0xba, 0x82, 0xa4, 0x8d, - 0x45, 0x4a, 0x7e, 0x36, 0xcf, 0x4e, 0x0b, 0x71, 0x99, 0xa4, 0xbc, 0x00, 0xb1, 0xa8, 0x56, 0x77, - 0xe4, 0x44, 0x2c, 0xc2, 0x38, 0x7b, 0xfd, 0x42, 0x49, 0xbd, 0x8f, 0x6f, 0x8f, 0x0b, 0x16, 0xc3, - 0xeb, 0x17, 0xb5, 0x8d, 0x36, 0x46, 0x9c, 0x0c, 0x06, 0x70, 0x27, 0xd1, 0xa9, 0x5d, 0x67, 0x4b, - 0x35, 0x3e, 0xf4, 0xbb, 0x84, 0xea, 0x5b, 0x98, 0x25, 0x48, 0x74, 0xb4, 0x39, 0x8c, 0x24, 0x12, - 0x9d, 0xb0, 0x86, 0x5d, 0x4a, 0x14, 0x77, 0xa2, 0xaf, 0x15, 0x81, 0xa5, 0xa4, 0xb6, 0xd1, 0x08, - 0x89, 0xa5, 0xa4, 0x05, 0x81, 0x80, 0xd4, 0x4c, 0x83, 0x29, 0x1a, 0x90, 0x8c, 0x34, 0x18, 0x90, - 0x5c, 0xca, 0x06, 0x8a, 0xc3, 0x2c, 0x91, 0x09, 0x4b, 0x47, 0x5c, 0x9e, 0xb2, 0x82, 0xcd, 0xb8, - 0xe4, 0x05, 0x0c, 0x14, 0x1a, 0x19, 0x7a, 0x0c, 0x11, 0x28, 0x28, 0x56, 0x3b, 0xfc, 0xbd, 0xe8, - 0xc3, 0x6a, 0xdd, 0xe7, 0x99, 0xfe, 0x33, 0x1b, 0xaf, 0xd4, 0xdf, 0xe7, 0x19, 0x7c, 0x64, 0x6c, - 0x8c, 0x64, 0xc1, 0xd9, 0xac, 0xb1, 0xfd, 0x81, 0xf9, 0x5d, 0x81, 0x4f, 0x57, 0xaa, 0xf1, 0x7c, - 0x22, 0x64, 0x72, 0x59, 0x6d, 0xb3, 0xf5, 0x1b, 0x44, 0x60, 0x3c, 0xbb, 0xe2, 0x61, 0xe0, 0x5b, - 0x14, 0x18, 0x67, 0xe3, 0xb4, 0x2b, 0x3d, 0xe3, 0x79, 0x0a, 0xe3, 0xb4, 0xa7, 0xad, 0x00, 0x22, - 0x4e, 0xa3, 0xa0, 0x9d, 0x9c, 0xae, 0x78, 0xcc, 0xc3, 0x95, 0x19, 0xf3, 0x7e, 0x95, 0x19, 0x7b, - 0x2f, 0x65, 0xa4, 0xd1, 0x87, 0xc7, 0x7c, 0x76, 0xc1, 0x8b, 0xf2, 0x2a, 0xc9, 0x0f, 0xaa, 0x84, - 0x8b, 0xc9, 0x39, 0x7c, 0x6d, 0xd1, 0x12, 0x43, 0x83, 0x10, 0x59, 0x29, 0x81, 0xda, 0x95, 0xc0, - 0x02, 0x87, 0xe5, 0x09, 0x9b, 0x71, 0xf5, 0x65, 0x0d, 0xb0, 0x12, 0x38, 0x46, 0x1c, 0x88, 0x58, - 0x09, 0x48, 0xd8, 0x79, 0xbf, 0xcb, 0x32, 0x67, 0x7c, 0x5a, 0x8d, 0xb0, 0xe2, 0x94, 0x2d, 0x67, - 0x3c, 0x93, 0xda, 0x24, 0x38, 0x93, 0x77, 0x4c, 0xe2, 0x3c, 0x71, 0x26, 0xdf, 0x47, 0xcf, 0x09, - 0x4d, 0x5e, 0xc3, 0x9f, 0x8a, 0x42, 0xd6, 0x7f, 0x44, 0xe7, 0xbc, 0x48, 0x41, 0x68, 0xf2, 0x1b, - 0xd5, 0x23, 0x89, 0xd0, 0x14, 0xd6, 0x70, 0xbe, 0x3e, 0xef, 0x95, 0xe1, 0x0d, 0x2f, 0xcc, 0x38, - 0x79, 0x35, 0x63, 0x49, 0xaa, 0x47, 0xc3, 0x8f, 0x02, 0xb6, 0x09, 0x1d, 0xe2, 0xeb, 0xf3, 0x7d, - 0x75, 0x9d, 0xef, 0xf5, 0x87, 0x4b, 0x08, 0x1e, 0x11, 0x74, 0xd8, 0x27, 0x1e, 0x11, 0x74, 0x6b, - 0xd9, 0x9d, 0xbb, 0x65, 0x15, 0xb7, 0x54, 0xc4, 0xae, 0x98, 0xc0, 0xf3, 0x42, 0xc7, 0x26, 0x00, - 0x89, 0x9d, 0x7b, 0x50, 0xc1, 0xa6, 0x06, 0x16, 0xdb, 0x4f, 0x32, 0x96, 0x26, 0x3f, 0x83, 0x69, - 0xbd, 0x63, 0xa7, 0x21, 0x88, 0xd4, 0x00, 0x27, 0x31, 0x57, 0x07, 0x5c, 0x8e, 0x93, 0x2a, 0xf4, - 0xaf, 0x07, 0xda, 0x4d, 0x11, 0xdd, 0xae, 0x1c, 0xd2, 0xf9, 0x46, 0x2b, 0x6c, 0xd6, 0x9d, 0x3c, - 0x1f, 0x55, 0xab, 0xea, 0x19, 0x8f, 0x79, 0x92, 0xcb, 0xc1, 0x8b, 0x70, 0x5b, 0x01, 0x9c, 0xb8, - 0x68, 0xd1, 0x43, 0xcd, 0x79, 0x7c, 0x5f, 0xc5, 0x92, 0x51, 0xfd, 0xd7, 0xe5, 0xce, 0x4b, 0x5e, - 0xe8, 0x44, 0xe3, 0x80, 0x4b, 0x30, 0x3b, 0x1d, 0x6e, 0xe8, 0x80, 0x55, 0x45, 0x89, 0xd9, 0x19, - 0xd6, 0xb0, 0x87, 0x7d, 0x0e, 0x77, 0xc6, 0x4b, 0x91, 0x2e, 0xb8, 0xba, 0x6f, 0xb8, 0x49, 0x1a, - 0x73, 0x28, 0xe2, 0xb0, 0x8f, 0xa6, 0x6d, 0xb6, 0xd6, 0x76, 0xbb, 0x93, 0x2d, 0x0f, 0xe1, 0x95, - 0x09, 0xc4, 0x92, 0xc2, 0x88, 0x6c, 0x2d, 0x80, 0x3b, 0x87, 0xe1, 0x85, 0x60, 0x93, 0x98, 0x95, - 0xf2, 0x94, 0x2d, 0x53, 0xc1, 0x26, 0x6a, 0x5d, 0x87, 0x87, 0xe1, 0x0d, 0x33, 0x74, 0x21, 0xea, - 0x30, 0x9c, 0x82, 0xdd, 0xec, 0x4c, 0xfd, 0xd1, 0x3c, 0x7d, 0x97, 0x13, 0x66, 0x67, 0xaa, 0xbc, - 0xf0, 0x1e, 0xe7, 0xc3, 0x30, 0x64, 0xdf, 0x41, 0xab, 0x45, 0x2a, 0x0d, 0xb9, 0x87, 0xe9, 0x78, - 0x09, 0xc8, 0xfd, 0x00, 0x61, 0xbf, 0x4b, 0x51, 0xff, 0xde, 0xfc, 0xdd, 0x17, 0xa9, 0xbf, 0x64, - 0xbd, 0x89, 0xe9, 0xba, 0xd0, 0xd0, 0xfd, 0xc0, 0xdd, 0x56, 0x4f, 0xda, 0xa6, 0x99, 0xbb, 0x57, - 0x4c, 0xee, 0x4c, 0x26, 0xc7, 0xbc, 0x44, 0x5e, 0x28, 0xaf, 0x84, 0x43, 0x2b, 0x25, 0xd2, 0xcc, - 0x36, 0x65, 0x07, 0x7a, 0x25, 0x7b, 0x35, 0x49, 0xa4, 0x96, 0x35, 0x37, 0xa4, 0x37, 0xdb, 0x06, - 0xda, 0x14, 0x51, 0x2b, 0x9a, 0xb6, 0xb1, 0xbc, 0x62, 0xc6, 0x62, 0x3a, 0x4d, 0xb9, 0x86, 0xce, - 0x38, 0xab, 0x3f, 0xe4, 0xb7, 0xdd, 0xb6, 0x85, 0x82, 0x44, 0x2c, 0x0f, 0x2a, 0xd8, 0x34, 0xb2, - 0xc2, 0xea, 0x47, 0x52, 0x4d, 0xc3, 0xae, 0xb5, 0xcd, 0x78, 0x00, 0x91, 0x46, 0xa2, 0xa0, 0x7d, - 0xef, 0xad, 0x12, 0x1f, 0xf0, 0xa6, 0x25, 0xe0, 0x27, 0x88, 0x94, 0xb2, 0x23, 0x26, 0xde, 0x7b, - 0x43, 0x30, 0xbb, 0x4f, 0x00, 0x1e, 0x5e, 0x2e, 0x0f, 0x27, 0x70, 0x9f, 0x00, 0xf5, 0x15, 0x43, - 0xec, 0x13, 0x28, 0xd6, 0xef, 0x3a, 0x73, 0xee, 0x75, 0xc4, 0x4a, 0x5b, 0x39, 0xa4, 0xeb, 0x50, - 0x30, 0xd4, 0x75, 0x94, 0x82, 0xdf, 0xa4, 0xee, 0xd1, 0x1a, 0xd2, 0xa4, 0xd8, 0xb9, 0xda, 0x6a, - 0x17, 0x66, 0xe3, 0x92, 0xd9, 0x4f, 0xaa, 0x2b, 0x4b, 0xf8, 0x17, 0xfc, 0x6b, 0x21, 0x11, 0x97, - 0x5a, 0x50, 0x6d, 0xfb, 0xe5, 0xfd, 0xff, 0xfc, 0xe6, 0xce, 0xca, 0x2f, 0xbe, 0xb9, 0xb3, 0xf2, - 0xdf, 0xdf, 0xdc, 0x59, 0xf9, 0xf9, 0xb7, 0x77, 0xde, 0xfb, 0xc5, 0xb7, 0x77, 0xde, 0xfb, 0xaf, - 0x6f, 0xef, 0xbc, 0xf7, 0xf5, 0xfb, 0xfa, 0x8f, 0xa9, 0x5e, 0xfc, 0x3f, 0xf5, 0x27, 0x51, 0x9f, - 0xff, 0x5f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x39, 0xd6, 0xda, 0x85, 0x70, 0x75, 0x00, 0x00, + 0x0b, 0xf3, 0x76, 0xc3, 0x9f, 0x06, 0x08, 0xbb, 0xd0, 0xd5, 0x7f, 0x57, 0xfb, 0xfc, 0x01, 0xaa, + 0xa1, 0x44, 0xc4, 0x42, 0x07, 0x10, 0x58, 0xd0, 0xd1, 0x95, 0xb8, 0xc1, 0x0b, 0x5a, 0x49, 0xc2, + 0x05, 0xd5, 0x84, 0x3d, 0x79, 0xd3, 0x05, 0xc5, 0x4e, 0xde, 0x9a, 0x62, 0x84, 0x4e, 0xde, 0x20, + 0xa3, 0x0d, 0x8b, 0xe8, 0x37, 0x5d, 0xc3, 0x2f, 0x85, 0xb8, 0x9e, 0xb1, 0xe2, 0x7a, 0xf0, 0x84, + 0x56, 0x6e, 0x18, 0xe3, 0x68, 0xa3, 0x17, 0x6b, 0x83, 0x9a, 0xeb, 0xb0, 0x4a, 0x93, 0xce, 0x8b, + 0x14, 0x04, 0x35, 0xcf, 0x86, 0x46, 0x88, 0xa0, 0x46, 0xa0, 0x76, 0x54, 0xba, 0xde, 0x46, 0x1c, + 0xee, 0xf5, 0x3c, 0xf5, 0x11, 0xa7, 0xf6, 0x7a, 0x08, 0x06, 0x87, 0xd0, 0x41, 0xc1, 0xf2, 0x2b, + 0x7c, 0x08, 0x29, 0x51, 0x78, 0x08, 0x35, 0x08, 0xec, 0xef, 0x11, 0x67, 0x45, 0x7c, 0x85, 0xf7, + 0x77, 0x2d, 0x0b, 0xf7, 0xb7, 0x61, 0x60, 0x7f, 0xd7, 0x82, 0xb7, 0x89, 0xbc, 0x3a, 0xe6, 0x92, + 0xe1, 0xfd, 0xed, 0x33, 0xe1, 0xfe, 0x6e, 0xb1, 0x36, 0x0f, 0x73, 0x1d, 0x8e, 0xe6, 0x17, 0x65, + 0x5c, 0x24, 0x17, 0x7c, 0x10, 0xb0, 0x62, 0x20, 0x22, 0x0f, 0x23, 0x61, 0xed, 0xf3, 0xe7, 0x2b, + 0xd1, 0xdd, 0xa6, 0xdb, 0x45, 0x59, 0xea, 0x98, 0xe7, 0xbb, 0x7f, 0x81, 0xf7, 0x2f, 0x81, 0x13, + 0x67, 0xa1, 0x3d, 0xd4, 0x9c, 0x35, 0x01, 0x2f, 0xd2, 0x79, 0x56, 0x9a, 0x42, 0x7d, 0xd9, 0xc7, + 0xba, 0xa3, 0x40, 0xac, 0x09, 0xbd, 0x14, 0xed, 0x72, 0xac, 0xfb, 0xa7, 0x91, 0x1d, 0x4e, 0x4a, + 0xb0, 0x1c, 0x37, 0xed, 0xed, 0x10, 0xc4, 0x72, 0x8c, 0x93, 0x70, 0x28, 0x1c, 0x14, 0x62, 0x9e, + 0x97, 0x1d, 0x43, 0x01, 0x40, 0xe1, 0xa1, 0xd0, 0x86, 0xb5, 0xcf, 0x77, 0xd1, 0x6f, 0xbb, 0xc3, + 0xcf, 0x6d, 0xec, 0x2d, 0x7a, 0x4c, 0x61, 0x4d, 0x3c, 0xec, 0x8b, 0xdb, 0x84, 0xb4, 0xf1, 0x2c, + 0xf7, 0xb8, 0x64, 0x49, 0x5a, 0x0e, 0x56, 0x71, 0x1b, 0x8d, 0x9c, 0x48, 0x48, 0x31, 0x0e, 0xc6, + 0xb7, 0xbd, 0x79, 0x9e, 0x26, 0x71, 0xfb, 0x24, 0x5a, 0xeb, 0x1a, 0x71, 0x38, 0xbe, 0xb9, 0x18, + 0x8c, 0xd7, 0xd5, 0x92, 0xaf, 0xfe, 0x33, 0x5e, 0xe6, 0x1c, 0x8f, 0xd7, 0x1e, 0x12, 0x8e, 0xd7, + 0x10, 0x85, 0xf5, 0x19, 0x71, 0x79, 0xc4, 0x96, 0x62, 0x4e, 0xc4, 0x6b, 0x23, 0x0e, 0xd7, 0xc7, + 0xc5, 0x6c, 0x4e, 0x68, 0x3c, 0x1c, 0x66, 0x92, 0x17, 0x19, 0x4b, 0xf7, 0x53, 0x36, 0x2d, 0x07, + 0x44, 0x8c, 0xf1, 0x29, 0x22, 0x27, 0xa4, 0x69, 0xa4, 0x19, 0x0f, 0xcb, 0x7d, 0xb6, 0x10, 0x45, + 0x22, 0xe9, 0x66, 0xb4, 0x48, 0x67, 0x33, 0x7a, 0x28, 0xea, 0x6d, 0xa7, 0x88, 0xaf, 0x92, 0x05, + 0x9f, 0x04, 0xbc, 0x35, 0x48, 0x0f, 0x6f, 0x0e, 0x8a, 0x74, 0xda, 0x48, 0xcc, 0x8b, 0x98, 0x93, + 0x9d, 0x56, 0x8b, 0x3b, 0x3b, 0xcd, 0x60, 0xda, 0xc3, 0x5f, 0xad, 0x44, 0xbf, 0x53, 0x4b, 0xdd, + 0xe3, 0xe1, 0x3d, 0x56, 0x5e, 0x5d, 0x08, 0x56, 0x4c, 0x06, 0x9f, 0x61, 0x76, 0x50, 0xd4, 0xb8, + 0x7e, 0x76, 0x1b, 0x15, 0xd8, 0xac, 0x47, 0x49, 0xe9, 0xcc, 0x38, 0xb4, 0x59, 0x3d, 0x24, 0xdc, + 0xac, 0x10, 0x85, 0x01, 0x44, 0xc9, 0xeb, 0xa3, 0x98, 0x55, 0x52, 0xdf, 0x3f, 0x8f, 0x59, 0xeb, + 0xe4, 0x60, 0x7c, 0xac, 0x84, 0xfe, 0x68, 0xd9, 0xa2, 0x6c, 0xe0, 0x23, 0x66, 0xd8, 0x17, 0x27, + 0x3d, 0x9b, 0x59, 0x11, 0xf6, 0xdc, 0x9a, 0x19, 0xc3, 0xbe, 0x38, 0xe1, 0xd9, 0x09, 0x6b, 0x21, + 0xcf, 0x48, 0x68, 0x1b, 0xf6, 0xc5, 0x61, 0xf6, 0xa5, 0x99, 0x66, 0x5d, 0x78, 0x12, 0xb0, 0x03, + 0xd7, 0x86, 0x8d, 0x5e, 0xac, 0x76, 0xf8, 0x37, 0x2b, 0xd1, 0xf7, 0xad, 0xc7, 0x63, 0x31, 0x49, + 0x2e, 0x97, 0x35, 0xf4, 0x86, 0xa5, 0x73, 0x5e, 0x0e, 0x9e, 0x51, 0xd6, 0xda, 0xac, 0x29, 0xc1, + 0xf3, 0x5b, 0xe9, 0xc0, 0xb9, 0xb3, 0x93, 0xe7, 0xe9, 0x72, 0xcc, 0x67, 0x79, 0x4a, 0xce, 0x1d, + 0x0f, 0x09, 0xcf, 0x1d, 0x88, 0xc2, 0xac, 0x7c, 0x2c, 0xaa, 0x9c, 0x1f, 0xcd, 0xca, 0x95, 0x28, + 0x9c, 0x95, 0x37, 0x08, 0xcc, 0x95, 0xc6, 0x62, 0x57, 0xa4, 0x29, 0x8f, 0x65, 0xfb, 0x11, 0xb3, + 0xd1, 0xb4, 0x44, 0x38, 0x57, 0x02, 0xa4, 0x3d, 0x8d, 0x69, 0xf6, 0x90, 0xac, 0xe0, 0x2f, 0x97, + 0x47, 0x49, 0x76, 0x3d, 0xc0, 0xd3, 0x02, 0x0b, 0x10, 0xa7, 0x31, 0x28, 0x08, 0xf7, 0xaa, 0xe7, + 0xd9, 0x44, 0xe0, 0x7b, 0xd5, 0x4a, 0x12, 0xde, 0xab, 0x6a, 0x02, 0x9a, 0x3c, 0xe3, 0x94, 0xc9, + 0x4a, 0x12, 0x36, 0xa9, 0x09, 0x2c, 0x14, 0xea, 0x33, 0x7b, 0x32, 0x14, 0x82, 0x53, 0xfa, 0xb5, + 0x4e, 0x0e, 0x8e, 0xd0, 0x66, 0xd3, 0xba, 0xcf, 0x65, 0x7c, 0x85, 0x8f, 0x50, 0x0f, 0x09, 0x8f, + 0x50, 0x88, 0xc2, 0x2a, 0x8d, 0x85, 0xd9, 0x74, 0xaf, 0xe2, 0xe3, 0xa3, 0xb5, 0xe1, 0x5e, 0xeb, + 0xe4, 0xe0, 0x36, 0xf2, 0x70, 0xa6, 0xda, 0x0c, 0x1d, 0xe4, 0xb5, 0x2c, 0xbc, 0x8d, 0x34, 0x0c, + 0x2c, 0x7d, 0x2d, 0xa8, 0x9a, 0x13, 0x2f, 0xbd, 0x95, 0x87, 0x4b, 0xef, 0x71, 0xda, 0xc9, 0xbf, + 0x98, 0x6d, 0x5c, 0x2d, 0x3d, 0x11, 0xd5, 0x1c, 0x79, 0xc3, 0xd2, 0x64, 0xc2, 0x24, 0x1f, 0x8b, + 0x6b, 0x9e, 0xe1, 0x3b, 0x26, 0x5d, 0xda, 0x9a, 0x1f, 0x7a, 0x0a, 0xe1, 0x1d, 0x53, 0x58, 0x11, + 0x8e, 0x93, 0x9a, 0x3e, 0x2f, 0xf9, 0x2e, 0x2b, 0x89, 0x48, 0xe6, 0x21, 0xe1, 0x71, 0x02, 0x51, + 0x98, 0xaf, 0xd6, 0xf2, 0x57, 0xef, 0x72, 0x5e, 0x24, 0x3c, 0x8b, 0x39, 0x9e, 0xaf, 0x42, 0x2a, + 0x9c, 0xaf, 0x22, 0x34, 0xdc, 0xab, 0xed, 0x31, 0xc9, 0x5f, 0x2e, 0xc7, 0xc9, 0x8c, 0x97, 0x92, + 0xcd, 0x72, 0x7c, 0xaf, 0x06, 0xa0, 0xf0, 0x5e, 0xad, 0x0d, 0xb7, 0x8e, 0x86, 0x4c, 0x40, 0x6c, + 0xdf, 0x4c, 0x81, 0x44, 0xe0, 0x66, 0x0a, 0x81, 0xc2, 0x86, 0xb5, 0x00, 0x7a, 0x38, 0xdc, 0xb2, + 0x12, 0x3c, 0x1c, 0xa6, 0xe9, 0xd6, 0x81, 0x9b, 0x61, 0x46, 0xd5, 0xd4, 0xec, 0x28, 0xfa, 0xc8, + 0x9d, 0xa2, 0x1b, 0xbd, 0x58, 0xfc, 0x84, 0xef, 0x8c, 0xa7, 0x4c, 0x2d, 0x5b, 0x81, 0x63, 0xb4, + 0x86, 0xe9, 0x73, 0xc2, 0xe7, 0xb0, 0xda, 0xe1, 0x5f, 0xac, 0x44, 0x9f, 0x60, 0x1e, 0x5f, 0xe7, + 0xca, 0xef, 0xd3, 0x6e, 0x5b, 0x35, 0x49, 0x5c, 0xbd, 0x09, 0x6b, 0xe8, 0x32, 0xfc, 0x49, 0xf4, + 0x71, 0x23, 0xb2, 0x37, 0x73, 0x74, 0x01, 0xfc, 0xa4, 0xcd, 0x94, 0x1f, 0x72, 0xc6, 0xfd, 0x76, + 0x6f, 0xde, 0xee, 0x87, 0xfc, 0x72, 0x95, 0x60, 0x3f, 0x64, 0x6c, 0x68, 0x31, 0xb1, 0x1f, 0x42, + 0x30, 0x3b, 0x3b, 0xdd, 0xea, 0xbd, 0x4d, 0xe4, 0x95, 0xca, 0xb7, 0xc0, 0xec, 0xf4, 0xca, 0x6a, + 0x20, 0x62, 0x76, 0x92, 0x30, 0xcc, 0x48, 0x1a, 0xb0, 0x9a, 0x9b, 0x58, 0x2c, 0x37, 0x86, 0xdc, + 0x99, 0xb9, 0xde, 0x0d, 0xc2, 0xf1, 0xda, 0x88, 0xf5, 0xd6, 0xe7, 0x49, 0xc8, 0x02, 0xd8, 0xfe, + 0x6c, 0xf4, 0x62, 0xb5, 0xc3, 0x3f, 0x8b, 0xbe, 0xd7, 0xaa, 0xd8, 0x3e, 0x67, 0x72, 0x5e, 0xf0, + 0xc9, 0x60, 0xbb, 0xa3, 0xdc, 0x0d, 0x68, 0x5c, 0x3f, 0xed, 0xaf, 0xd0, 0xca, 0xd1, 0x1b, 0xae, + 0x1e, 0x56, 0xa6, 0x0c, 0xcf, 0x42, 0x26, 0x7d, 0x36, 0x98, 0xa3, 0xd3, 0x3a, 0xad, 0x6d, 0xb6, + 0x3b, 0xba, 0x76, 0x16, 0x2c, 0x49, 0xd5, 0x43, 0xba, 0xcf, 0x42, 0x46, 0x3d, 0x34, 0xb8, 0xcd, + 0x26, 0x55, 0x5a, 0x91, 0x59, 0xcd, 0x71, 0x67, 0x7b, 0xb6, 0x49, 0x47, 0x02, 0x64, 0x77, 0xb6, + 0xd5, 0x93, 0xd6, 0x6e, 0x65, 0xb3, 0xe4, 0x55, 0x7f, 0x76, 0x07, 0x39, 0xe6, 0x55, 0xab, 0x22, + 0x23, 0x7d, 0xab, 0x27, 0xad, 0xbd, 0xfe, 0x69, 0xf4, 0x71, 0xdb, 0xab, 0x5e, 0x88, 0xb6, 0x3b, + 0x4d, 0x81, 0xb5, 0xe8, 0x69, 0x7f, 0x05, 0xbb, 0xa5, 0xf9, 0x2a, 0x29, 0xa5, 0x28, 0x96, 0xa3, + 0x2b, 0x71, 0xd3, 0xdc, 0x78, 0xf7, 0x67, 0xab, 0x06, 0x86, 0x0e, 0x41, 0x6c, 0x69, 0x70, 0xb2, + 0xe5, 0xca, 0xde, 0x8c, 0x2f, 0x09, 0x57, 0x0e, 0xd1, 0xe1, 0xca, 0x27, 0x6d, 0xac, 0x6a, 0x6a, + 0x65, 0xaf, 0xf1, 0xaf, 0xe1, 0x45, 0x6d, 0x5f, 0xe5, 0x5f, 0xef, 0x06, 0x6d, 0xc6, 0xa2, 0xc5, + 0x7b, 0xc9, 0xe5, 0xa5, 0xa9, 0x13, 0x5e, 0x52, 0x17, 0x21, 0x32, 0x16, 0x02, 0xb5, 0x49, 0xf7, + 0x7e, 0x92, 0x72, 0x75, 0xa2, 0xff, 0xfa, 0xf2, 0x32, 0x15, 0x6c, 0x02, 0x92, 0xee, 0x4a, 0x3c, + 0x74, 0xe5, 0x44, 0xd2, 0x8d, 0x71, 0xf6, 0x19, 0x71, 0x25, 0x3d, 0xe3, 0xb1, 0xc8, 0xe2, 0x24, + 0x85, 0x17, 0x00, 0x95, 0xa6, 0x11, 0x12, 0xcf, 0x88, 0x5b, 0x90, 0x5d, 0x18, 0x2b, 0x51, 0x35, + 0xed, 0x9b, 0xf2, 0x3f, 0x6a, 0x2b, 0x3a, 0x62, 0x62, 0x61, 0x44, 0x30, 0xbb, 0xf7, 0xac, 0x84, + 0xe7, 0xb9, 0x32, 0x7e, 0xaf, 0xad, 0x55, 0x4b, 0x88, 0xbd, 0xa7, 0x4f, 0xd8, 0x3d, 0x54, 0xf5, + 0xf7, 0x3d, 0x71, 0x93, 0x29, 0xa3, 0xf7, 0xdb, 0x2a, 0x8d, 0x8c, 0xd8, 0x43, 0x41, 0x46, 0x1b, + 0xfe, 0x49, 0xf4, 0xff, 0x95, 0xe1, 0x42, 0xe4, 0x83, 0x3b, 0x88, 0x42, 0xe1, 0xdc, 0xd5, 0xbb, + 0x4b, 0xca, 0xed, 0x95, 0x53, 0x33, 0x36, 0xce, 0x4b, 0x36, 0xe5, 0x83, 0x87, 0x44, 0x8f, 0x2b, + 0x29, 0x71, 0xe5, 0xb4, 0x4d, 0xf9, 0xa3, 0xe2, 0x44, 0x4c, 0xb4, 0x75, 0xa4, 0x86, 0x46, 0x18, + 0x1a, 0x15, 0x2e, 0x64, 0x93, 0x99, 0x13, 0xb6, 0x48, 0xa6, 0x66, 0xc1, 0xa9, 0xe3, 0x56, 0x09, + 0x92, 0x19, 0xcb, 0x0c, 0x1d, 0x88, 0x48, 0x66, 0x48, 0x58, 0xfb, 0xfc, 0xe7, 0x95, 0xe8, 0x9e, + 0x65, 0x0e, 0x9a, 0xd3, 0xba, 0xc3, 0xec, 0x52, 0x54, 0xa9, 0xcf, 0x51, 0x92, 0x5d, 0x97, 0x83, + 0x2f, 0x28, 0x93, 0x38, 0x6f, 0x8a, 0xf2, 0xe5, 0xad, 0xf5, 0x6c, 0xd6, 0xda, 0x1c, 0x65, 0xd9, + 0xe7, 0xd9, 0xb5, 0x06, 0xc8, 0x5a, 0xcd, 0x89, 0x17, 0xe4, 0x88, 0xac, 0x35, 0xc4, 0xdb, 0x2e, + 0x36, 0xce, 0x53, 0x91, 0xc1, 0x2e, 0xb6, 0x16, 0x2a, 0x21, 0xd1, 0xc5, 0x2d, 0xc8, 0xc6, 0xe3, + 0x46, 0x54, 0x9f, 0xba, 0xec, 0xa4, 0x29, 0x88, 0xc7, 0x46, 0xd5, 0x00, 0x44, 0x3c, 0x46, 0x41, + 0xed, 0xe7, 0x2c, 0xfa, 0x4e, 0xd5, 0xa4, 0xa7, 0x05, 0x5f, 0x24, 0x1c, 0x5e, 0xbd, 0x70, 0x24, + 0xc4, 0xfc, 0xf7, 0x09, 0x3b, 0xb3, 0xce, 0xb3, 0x32, 0x4f, 0x59, 0x79, 0xa5, 0x1f, 0xc6, 0xfb, + 0x75, 0x6e, 0x84, 0xf0, 0x71, 0xfc, 0xa3, 0x0e, 0xca, 0x06, 0xf5, 0x46, 0x66, 0x42, 0xcc, 0x2a, + 0xae, 0xda, 0x0a, 0x33, 0x6b, 0x9d, 0x9c, 0x3d, 0xf1, 0x3e, 0x60, 0x69, 0xca, 0x8b, 0x65, 0x23, + 0x3b, 0x66, 0x59, 0x72, 0xc9, 0x4b, 0x09, 0x4e, 0xbc, 0x35, 0x35, 0x84, 0x18, 0x71, 0xe2, 0x1d, + 0xc0, 0x6d, 0x36, 0x0f, 0x3c, 0x1f, 0x66, 0x13, 0xfe, 0x0e, 0x64, 0xf3, 0xd0, 0x8e, 0x62, 0x88, + 0x6c, 0x9e, 0x62, 0xed, 0xc9, 0xef, 0xcb, 0x54, 0xc4, 0xd7, 0x7a, 0x09, 0xf0, 0x3b, 0x58, 0x49, + 0xe0, 0x1a, 0x70, 0x3f, 0x84, 0xd8, 0x45, 0x40, 0x09, 0xce, 0x78, 0x9e, 0xb2, 0x18, 0xde, 0xbf, + 0xa9, 0x75, 0xb4, 0x8c, 0x58, 0x04, 0x20, 0x03, 0x8a, 0xab, 0xef, 0xf5, 0x60, 0xc5, 0x05, 0xd7, + 0x7a, 0xee, 0x87, 0x10, 0xbb, 0x0c, 0x2a, 0xc1, 0x28, 0x4f, 0x13, 0x09, 0xa6, 0x41, 0xad, 0xa1, + 0x24, 0xc4, 0x34, 0xf0, 0x09, 0x60, 0xf2, 0x98, 0x17, 0x53, 0x8e, 0x9a, 0x54, 0x92, 0xa0, 0xc9, + 0x86, 0xb0, 0x97, 0x4c, 0xeb, 0xba, 0x8b, 0x7c, 0x09, 0x2e, 0x99, 0xea, 0x6a, 0x89, 0x7c, 0x49, + 0x5c, 0x32, 0xf5, 0x00, 0x50, 0xc4, 0x53, 0x56, 0x4a, 0xbc, 0x88, 0x4a, 0x12, 0x2c, 0x62, 0x43, + 0xd8, 0x35, 0xba, 0x2e, 0xe2, 0x5c, 0x82, 0x35, 0x5a, 0x17, 0xc0, 0x79, 0x02, 0x7d, 0x97, 0x94, + 0xdb, 0x48, 0x52, 0xf7, 0x0a, 0x97, 0xfb, 0x09, 0x4f, 0x27, 0x25, 0x88, 0x24, 0xba, 0xdd, 0x1b, + 0x29, 0x11, 0x49, 0xda, 0x14, 0x18, 0x4a, 0xfa, 0x7c, 0x1c, 0xab, 0x1d, 0x38, 0x1a, 0xbf, 0x1f, + 0x42, 0x6c, 0x7c, 0x6a, 0x0a, 0xbd, 0xcb, 0x8a, 0x22, 0xa9, 0x16, 0xff, 0x55, 0xbc, 0x40, 0x8d, + 0x9c, 0x88, 0x4f, 0x18, 0x07, 0xa6, 0x57, 0x13, 0xb8, 0xb1, 0x82, 0xc1, 0xd0, 0xfd, 0x20, 0xc8, + 0xd8, 0x8c, 0x53, 0x49, 0x9c, 0x47, 0xa8, 0x58, 0x6b, 0x22, 0x4f, 0x50, 0x57, 0xbb, 0x30, 0xe7, + 0x25, 0x10, 0xe3, 0xe2, 0x58, 0x2c, 0xf8, 0x58, 0xbc, 0x7a, 0x97, 0x94, 0x32, 0xc9, 0xa6, 0x7a, + 0xe5, 0x7e, 0x4e, 0x58, 0xc2, 0x60, 0xe2, 0x25, 0x90, 0x4e, 0x25, 0x9b, 0x40, 0x80, 0xb2, 0x9c, + 0xf0, 0x1b, 0x34, 0x81, 0x80, 0x16, 0x0d, 0x47, 0x24, 0x10, 0x21, 0xde, 0x9e, 0xa3, 0x18, 0xe7, + 0xfa, 0x4d, 0xd9, 0xb1, 0x68, 0x72, 0x39, 0xca, 0x1a, 0x04, 0x89, 0xad, 0x6c, 0x50, 0xc1, 0xee, + 0x2f, 0x8d, 0x7f, 0x3b, 0xc5, 0xd6, 0x09, 0x3b, 0xed, 0x69, 0xf6, 0xb8, 0x07, 0x89, 0xb8, 0xb2, + 0xf7, 0x00, 0x28, 0x57, 0xed, 0x6b, 0x00, 0x8f, 0x7b, 0x90, 0xce, 0x99, 0x8c, 0x5b, 0xad, 0x97, + 0x2c, 0xbe, 0x9e, 0x16, 0x62, 0x9e, 0x4d, 0x76, 0x45, 0x2a, 0x0a, 0x70, 0x26, 0xe3, 0x95, 0x1a, + 0xa0, 0xc4, 0x99, 0x4c, 0x87, 0x8a, 0xcd, 0xe0, 0xdc, 0x52, 0xec, 0xa4, 0xc9, 0x14, 0xee, 0xa8, + 0x3d, 0x43, 0x0a, 0x20, 0x32, 0x38, 0x14, 0x44, 0x06, 0x51, 0xbd, 0xe3, 0x96, 0x49, 0xcc, 0xd2, + 0xda, 0xdf, 0x36, 0x6d, 0xc6, 0x03, 0x3b, 0x07, 0x11, 0xa2, 0x80, 0xd4, 0x73, 0x3c, 0x2f, 0xb2, + 0xc3, 0x4c, 0x0a, 0xb2, 0x9e, 0x0d, 0xd0, 0x59, 0x4f, 0x07, 0x04, 0x61, 0x75, 0xcc, 0xdf, 0x55, + 0xa5, 0xa9, 0xfe, 0xc1, 0xc2, 0x6a, 0xf5, 0xf7, 0xa1, 0x96, 0x87, 0xc2, 0x2a, 0xe0, 0x40, 0x65, + 0xb4, 0x93, 0x7a, 0xc0, 0x04, 0xb4, 0xfd, 0x61, 0xb2, 0xde, 0x0d, 0xe2, 0x7e, 0x46, 0x72, 0x99, + 0xf2, 0x90, 0x1f, 0x05, 0xf4, 0xf1, 0xd3, 0x80, 0xf6, 0xb8, 0xc5, 0xab, 0xcf, 0x15, 0x8f, 0xaf, + 0x5b, 0xd7, 0x9a, 0xfc, 0x82, 0xd6, 0x08, 0x71, 0xdc, 0x42, 0xa0, 0x78, 0x17, 0x1d, 0xc6, 0x22, + 0x0b, 0x75, 0x51, 0x25, 0xef, 0xd3, 0x45, 0x9a, 0xb3, 0x9b, 0x5f, 0x23, 0xd5, 0x23, 0xb3, 0xee, + 0xa6, 0x0d, 0xc2, 0x82, 0x0b, 0x11, 0x9b, 0x5f, 0x12, 0xb6, 0x39, 0x39, 0xf4, 0x79, 0xdc, 0xbe, + 0xf3, 0xdd, 0xb2, 0x72, 0x4c, 0xdf, 0xf9, 0xa6, 0x58, 0xba, 0x92, 0xf5, 0x18, 0xe9, 0xb0, 0xe2, + 0x8f, 0x93, 0xcd, 0x7e, 0xb0, 0xdd, 0xf2, 0x78, 0x3e, 0x77, 0x53, 0xce, 0x8a, 0xda, 0xeb, 0x56, + 0xc0, 0x90, 0xc5, 0x88, 0x2d, 0x4f, 0x00, 0x07, 0x21, 0xcc, 0xf3, 0xbc, 0x2b, 0x32, 0xc9, 0x33, + 0x89, 0x85, 0x30, 0xdf, 0x98, 0x06, 0x43, 0x21, 0x8c, 0x52, 0x00, 0xe3, 0x56, 0x9d, 0x07, 0x71, + 0x79, 0xc2, 0x66, 0x68, 0xc6, 0x56, 0x9f, 0xf5, 0xd4, 0xf2, 0xd0, 0xb8, 0x05, 0x9c, 0xf3, 0x90, + 0xcf, 0xf5, 0x32, 0x66, 0xc5, 0xd4, 0x9c, 0x6e, 0x4c, 0x06, 0x4f, 0x69, 0x3b, 0x3e, 0x49, 0x3c, + 0xe4, 0x0b, 0x6b, 0x80, 0xb0, 0x73, 0x38, 0x63, 0x53, 0x53, 0x53, 0xa4, 0x06, 0x4a, 0xde, 0xaa, + 0xea, 0x7a, 0x37, 0x08, 0xfc, 0xbc, 0x49, 0x26, 0x5c, 0x04, 0xfc, 0x28, 0x79, 0x1f, 0x3f, 0x10, + 0x04, 0xd9, 0x5b, 0x55, 0xef, 0x7a, 0x47, 0xb7, 0x93, 0x4d, 0xf4, 0x3e, 0x76, 0x48, 0x34, 0x0f, + 0xe0, 0x42, 0xd9, 0x1b, 0xc1, 0x83, 0x39, 0xda, 0x1c, 0xd0, 0x86, 0xe6, 0xa8, 0x39, 0x7f, 0xed, + 0x33, 0x47, 0x31, 0x58, 0xfb, 0xfc, 0x99, 0x9e, 0xa3, 0x7b, 0x4c, 0xb2, 0x2a, 0x6f, 0x7f, 0x93, + 0xf0, 0x1b, 0xbd, 0x11, 0x46, 0xea, 0xdb, 0x50, 0x43, 0xf5, 0xaa, 0x22, 0xd8, 0x15, 0x6f, 0xf7, + 0xe6, 0x03, 0xbe, 0xf5, 0x0e, 0xa1, 0xd3, 0x37, 0xd8, 0x2a, 0x6c, 0xf7, 0xe6, 0x03, 0xbe, 0xf5, + 0x3b, 0xd0, 0x9d, 0xbe, 0xc1, 0x8b, 0xd0, 0xdb, 0xbd, 0x79, 0xed, 0xfb, 0x2f, 0x9b, 0x89, 0xeb, + 0x3a, 0xaf, 0xf2, 0xb0, 0x58, 0x26, 0x0b, 0x8e, 0xa5, 0x93, 0xbe, 0x3d, 0x83, 0x86, 0xd2, 0x49, + 0x5a, 0xc5, 0xf9, 0x70, 0x0e, 0x56, 0x8a, 0x53, 0x51, 0x26, 0xea, 0x21, 0xfd, 0xf3, 0x1e, 0x46, + 0x1b, 0x38, 0xb4, 0x69, 0x0a, 0x29, 0xd9, 0xc7, 0x8d, 0x1e, 0x6a, 0x6f, 0x31, 0x6f, 0x06, 0xec, + 0xb5, 0x2f, 0x33, 0x6f, 0xf5, 0xa4, 0xed, 0x83, 0x3f, 0x8f, 0x71, 0x9f, 0x38, 0x86, 0x7a, 0x15, + 0x7d, 0xe8, 0xf8, 0xb4, 0xbf, 0x82, 0x76, 0xff, 0xd7, 0xcd, 0xbe, 0x02, 0xfa, 0xd7, 0x93, 0xe0, + 0x59, 0x1f, 0x8b, 0x60, 0x22, 0x3c, 0xbf, 0x95, 0x8e, 0x2e, 0xc8, 0xdf, 0x37, 0x1b, 0xe8, 0x06, + 0x55, 0xef, 0x72, 0xa8, 0x77, 0xff, 0xf4, 0x9c, 0x08, 0x75, 0xab, 0x85, 0xe1, 0xcc, 0x78, 0x71, + 0x4b, 0x2d, 0xe7, 0x33, 0x4a, 0x1e, 0xac, 0xdf, 0x39, 0x74, 0xca, 0x13, 0xb2, 0xec, 0xd0, 0xb0, + 0x40, 0x5f, 0xdc, 0x56, 0x8d, 0x9a, 0x2b, 0x0e, 0xac, 0xbe, 0xca, 0xf0, 0xbc, 0xa7, 0x61, 0xef, + 0x3b, 0x0d, 0x9f, 0xdf, 0x4e, 0x49, 0x97, 0xe5, 0x3f, 0x57, 0xa2, 0x47, 0x1e, 0x6b, 0x9f, 0x27, + 0x80, 0x53, 0x8f, 0x1f, 0x07, 0xec, 0x53, 0x4a, 0xa6, 0x70, 0xbf, 0xfb, 0xcb, 0x29, 0xdb, 0x6f, + 0x0e, 0x79, 0x2a, 0xfb, 0x49, 0x2a, 0x79, 0xd1, 0xfe, 0xe6, 0x90, 0x6f, 0xb7, 0xa6, 0x86, 0xf4, + 0x37, 0x87, 0x02, 0xb8, 0xf3, 0xcd, 0x21, 0xc4, 0x33, 0xfa, 0xcd, 0x21, 0xd4, 0x5a, 0xf0, 0x9b, + 0x43, 0x61, 0x0d, 0x2a, 0xbc, 0x37, 0x45, 0xa8, 0xcf, 0xad, 0x7b, 0x59, 0xf4, 0x8f, 0xb1, 0x9f, + 0xdd, 0x46, 0x85, 0x58, 0xe0, 0x6a, 0x4e, 0xdd, 0x73, 0xeb, 0xd1, 0xa6, 0xde, 0x5d, 0xb7, 0xed, + 0xde, 0xbc, 0xf6, 0xfd, 0x53, 0xbd, 0xbb, 0x31, 0xe1, 0x5c, 0x14, 0xea, 0x7b, 0x53, 0x1b, 0xa1, + 0xf0, 0x5c, 0x59, 0x70, 0x7b, 0x7e, 0xb3, 0x1f, 0x4c, 0x54, 0xb7, 0x22, 0x74, 0xa7, 0x0f, 0xbb, + 0x0c, 0x81, 0x2e, 0xdf, 0xee, 0xcd, 0x13, 0xcb, 0x48, 0xed, 0xbb, 0xee, 0xed, 0x1e, 0xc6, 0xfc, + 0xbe, 0x7e, 0xda, 0x5f, 0x41, 0xbb, 0x5f, 0xe8, 0xb4, 0xd1, 0x75, 0xaf, 0xfa, 0x79, 0xab, 0xcb, + 0xd4, 0xc8, 0xeb, 0xe6, 0x61, 0x5f, 0x3c, 0x94, 0x40, 0xb8, 0x4b, 0x68, 0x57, 0x02, 0x81, 0x2e, + 0xa3, 0x9f, 0xdf, 0x4e, 0x49, 0x97, 0xe5, 0x9f, 0x56, 0xa2, 0xbb, 0x64, 0x59, 0xf4, 0x38, 0xf8, + 0xa2, 0xaf, 0x65, 0x30, 0x1e, 0xbe, 0xbc, 0xb5, 0x9e, 0x2e, 0xd4, 0xbf, 0xae, 0x44, 0xf7, 0x02, + 0x85, 0xaa, 0x07, 0xc8, 0x2d, 0xac, 0xfb, 0x03, 0xe5, 0x87, 0xb7, 0x57, 0xa4, 0x96, 0x7b, 0x17, + 0x1f, 0xb5, 0x3f, 0xc6, 0x13, 0xb0, 0x3d, 0xa2, 0x3f, 0xc6, 0xd3, 0xad, 0x05, 0x0f, 0x79, 0xd8, + 0x45, 0xb3, 0xe9, 0x42, 0x0f, 0x79, 0xd4, 0x0d, 0x35, 0xb0, 0xe7, 0x58, 0xeb, 0xe4, 0x30, 0x27, + 0xaf, 0xde, 0xe5, 0x2c, 0x9b, 0xd0, 0x4e, 0x6a, 0x79, 0xb7, 0x13, 0xc3, 0xc1, 0xc3, 0xb1, 0x4a, + 0x7a, 0x26, 0x9a, 0x8d, 0xd4, 0x63, 0x4a, 0xdf, 0x20, 0xc1, 0xc3, 0xb1, 0x16, 0x4a, 0x78, 0xd3, + 0x59, 0x63, 0xc8, 0x1b, 0x48, 0x16, 0x9f, 0xf4, 0x41, 0x41, 0x8a, 0x6e, 0xbc, 0x99, 0x33, 0xf7, + 0xcd, 0x90, 0x95, 0xd6, 0xb9, 0xfb, 0x56, 0x4f, 0x9a, 0x70, 0x3b, 0xe2, 0xf2, 0x2b, 0xce, 0x26, + 0xbc, 0x08, 0xba, 0x35, 0x54, 0x2f, 0xb7, 0x2e, 0x8d, 0xb9, 0xdd, 0x15, 0xe9, 0x7c, 0x96, 0xe9, + 0xce, 0x24, 0xdd, 0xba, 0x54, 0xb7, 0x5b, 0x40, 0xc3, 0x63, 0x41, 0xeb, 0x56, 0xa5, 0x97, 0x4f, + 0xc2, 0x66, 0xbc, 0xac, 0x72, 0xa3, 0x17, 0x4b, 0xd7, 0x53, 0x0f, 0xa3, 0x8e, 0x7a, 0x82, 0x91, + 0xb4, 0xd5, 0x93, 0x86, 0xe7, 0x73, 0x8e, 0x5b, 0x33, 0x9e, 0xb6, 0x3b, 0x6c, 0xb5, 0x86, 0xd4, + 0xd3, 0xfe, 0x0a, 0xf0, 0x34, 0x54, 0x8f, 0xaa, 0xa3, 0xa4, 0x94, 0xfb, 0x49, 0x9a, 0x0e, 0x36, + 0x02, 0xc3, 0xa4, 0x81, 0x82, 0xa7, 0xa1, 0x08, 0x4c, 0x8c, 0xe4, 0xe6, 0xf4, 0x30, 0x1b, 0x74, + 0xd9, 0x51, 0x54, 0xaf, 0x91, 0xec, 0xd2, 0xe0, 0x44, 0xcb, 0x69, 0x6a, 0x53, 0xdb, 0x61, 0xb8, + 0xe1, 0x5a, 0x15, 0xde, 0xee, 0xcd, 0x83, 0xc7, 0xed, 0x8a, 0x52, 0x2b, 0xcb, 0x43, 0xca, 0x84, + 0xb7, 0x92, 0x3c, 0xea, 0xa0, 0xc0, 0xa9, 0x60, 0x3d, 0x8d, 0xde, 0x26, 0x93, 0x29, 0x97, 0xe8, + 0x93, 0x22, 0x17, 0x08, 0x3e, 0x29, 0x02, 0x20, 0xe8, 0xba, 0xfa, 0xef, 0xe6, 0x38, 0xf4, 0x70, + 0x82, 0x75, 0x9d, 0x56, 0x76, 0xa8, 0x50, 0xd7, 0xa1, 0x34, 0x88, 0x06, 0xc6, 0xad, 0x7e, 0x1d, + 0xff, 0x49, 0xc8, 0x0c, 0x78, 0x27, 0x7f, 0xa3, 0x17, 0x0b, 0x56, 0x14, 0xeb, 0x30, 0x99, 0x25, + 0x12, 0x5b, 0x51, 0x1c, 0x1b, 0x15, 0x12, 0x5a, 0x51, 0xda, 0x28, 0x55, 0xbd, 0x2a, 0x47, 0x38, + 0x9c, 0x84, 0xab, 0x57, 0x33, 0xfd, 0xaa, 0x67, 0xd8, 0xd6, 0x83, 0xcd, 0xcc, 0x0c, 0x19, 0x79, + 0xa5, 0x37, 0xcb, 0xc8, 0xd8, 0x56, 0xaf, 0x69, 0x42, 0x30, 0x14, 0x75, 0x28, 0x05, 0x78, 0x60, + 0x5f, 0x71, 0xcd, 0xb3, 0xd7, 0x3c, 0xe7, 0xac, 0x60, 0x59, 0x8c, 0x6e, 0x4e, 0x95, 0xc1, 0x16, + 0x19, 0xda, 0x9c, 0x92, 0x1a, 0xe0, 0xb1, 0xb9, 0xff, 0x82, 0x25, 0x32, 0x15, 0xcc, 0x9b, 0x8c, + 0xfe, 0xfb, 0x95, 0x8f, 0x7b, 0x90, 0xf0, 0xb1, 0x79, 0x03, 0x98, 0x83, 0xef, 0xda, 0xe9, 0x67, + 0x01, 0x53, 0x3e, 0x1a, 0xda, 0x08, 0xd3, 0x2a, 0x60, 0x50, 0x9b, 0x04, 0x97, 0xcb, 0x9f, 0xf0, + 0x25, 0x36, 0xa8, 0x6d, 0x7e, 0xaa, 0x90, 0xd0, 0xa0, 0x6e, 0xa3, 0x20, 0xcf, 0x74, 0xf7, 0x41, + 0xab, 0x01, 0x7d, 0x77, 0xeb, 0xb3, 0xd6, 0xc9, 0x81, 0x99, 0xb3, 0x97, 0x2c, 0xbc, 0xe7, 0x04, + 0x48, 0x41, 0xf7, 0x92, 0x05, 0xfe, 0x98, 0x60, 0xa3, 0x17, 0x0b, 0x1f, 0xc9, 0x33, 0xc9, 0xdf, + 0x35, 0xcf, 0xca, 0x91, 0xe2, 0x2a, 0x79, 0xeb, 0x61, 0xf9, 0x7a, 0x37, 0x68, 0x2f, 0xc0, 0x9e, + 0x16, 0x22, 0xe6, 0x65, 0xa9, 0xbf, 0x50, 0xe8, 0xdf, 0x30, 0xd2, 0xb2, 0x21, 0xf8, 0x3e, 0xe1, + 0xc3, 0x30, 0x64, 0x7b, 0x46, 0x8b, 0xec, 0x57, 0x6f, 0x56, 0x51, 0xcd, 0xf6, 0x07, 0x6f, 0xd6, + 0x3a, 0x39, 0x3b, 0xbd, 0xb4, 0xd4, 0xfd, 0xcc, 0xcd, 0x3a, 0xaa, 0x8e, 0x7d, 0xe1, 0xe6, 0x71, + 0x0f, 0x52, 0xbb, 0xfa, 0x2a, 0x7a, 0xff, 0x48, 0x4c, 0x47, 0x3c, 0x9b, 0x0c, 0x7e, 0xe0, 0x5f, + 0xa1, 0x15, 0xd3, 0x61, 0xf5, 0x67, 0x63, 0xf4, 0x0e, 0x25, 0xb6, 0x97, 0x00, 0xf7, 0xf8, 0xc5, + 0x7c, 0x3a, 0x92, 0x4c, 0x82, 0x4b, 0x80, 0xea, 0xef, 0xc3, 0x4a, 0x40, 0x5c, 0x02, 0xf4, 0x00, + 0x60, 0x6f, 0x5c, 0x70, 0x8e, 0xda, 0xab, 0x04, 0x41, 0x7b, 0x1a, 0xb0, 0x59, 0x84, 0xb1, 0x57, + 0x25, 0xea, 0xf0, 0xd2, 0x9e, 0xd5, 0x51, 0x52, 0x22, 0x8b, 0x68, 0x53, 0x76, 0x70, 0xd7, 0xd5, + 0x57, 0x5f, 0x1d, 0x99, 0xcf, 0x66, 0xac, 0x58, 0x82, 0xc1, 0xad, 0x6b, 0xe9, 0x00, 0xc4, 0xe0, + 0x46, 0x41, 0x3b, 0x6b, 0x9b, 0x66, 0x8e, 0xaf, 0x0f, 0x44, 0x21, 0xe6, 0x32, 0xc9, 0x38, 0xfc, + 0xf2, 0x84, 0x69, 0x50, 0x97, 0x21, 0x66, 0x2d, 0xc5, 0xda, 0x2c, 0x57, 0x11, 0xf5, 0x7d, 0x42, + 0xf5, 0xdd, 0xe2, 0x52, 0x8a, 0x02, 0x3e, 0x4f, 0xac, 0xad, 0x40, 0x88, 0xc8, 0x72, 0x49, 0x18, + 0xf4, 0xfd, 0x69, 0x92, 0x4d, 0xd1, 0xbe, 0x3f, 0x75, 0xbf, 0xfa, 0x79, 0x8f, 0x06, 0xec, 0x84, + 0xaa, 0x1b, 0xad, 0x9e, 0x00, 0xfa, 0x5d, 0x4e, 0xb4, 0xd1, 0x5d, 0x82, 0x98, 0x50, 0x38, 0x09, + 0x5c, 0xbd, 0xce, 0x79, 0xc6, 0x27, 0xcd, 0xad, 0x39, 0xcc, 0x95, 0x47, 0x04, 0x5d, 0x41, 0xd2, + 0xc6, 0x22, 0x25, 0x3f, 0x9b, 0x67, 0xa7, 0x85, 0xb8, 0x4c, 0x52, 0x5e, 0x80, 0x58, 0x54, 0xab, + 0x3b, 0x72, 0x22, 0x16, 0x61, 0x9c, 0xbd, 0x7e, 0xa1, 0xa4, 0xde, 0xc7, 0xb7, 0xc7, 0x05, 0x8b, + 0xe1, 0xf5, 0x8b, 0xda, 0x46, 0x1b, 0x23, 0x4e, 0x06, 0x03, 0xb8, 0x93, 0xe8, 0xd4, 0xae, 0xb3, + 0xa5, 0x1a, 0x1f, 0xfa, 0x5d, 0x42, 0xf5, 0x2d, 0xcc, 0x12, 0x24, 0x3a, 0xda, 0x1c, 0x46, 0x12, + 0x89, 0x4e, 0x58, 0xc3, 0x2e, 0x25, 0x8a, 0x3b, 0xd1, 0xd7, 0x8a, 0xc0, 0x52, 0x52, 0xdb, 0x68, + 0x84, 0xc4, 0x52, 0xd2, 0x82, 0x40, 0x40, 0x6a, 0xa6, 0xc1, 0x14, 0x0d, 0x48, 0x46, 0x1a, 0x0c, + 0x48, 0x2e, 0x65, 0x03, 0xc5, 0x61, 0x96, 0xc8, 0x84, 0xa5, 0x23, 0x2e, 0x4f, 0x59, 0xc1, 0x66, + 0x5c, 0xf2, 0x02, 0x06, 0x0a, 0x8d, 0x0c, 0x3d, 0x86, 0x08, 0x14, 0x14, 0xab, 0x1d, 0xfe, 0x5e, + 0xf4, 0x61, 0xb5, 0xee, 0xf3, 0x4c, 0xff, 0xcc, 0xc6, 0x2b, 0xf5, 0xfb, 0x3c, 0x83, 0x8f, 0x8c, + 0x8d, 0x91, 0x2c, 0x38, 0x9b, 0x35, 0xb6, 0x3f, 0x30, 0x7f, 0x57, 0xe0, 0xd3, 0x95, 0x6a, 0x3c, + 0x9f, 0x08, 0x99, 0x5c, 0x56, 0xdb, 0x6c, 0xfd, 0x06, 0x11, 0x18, 0xcf, 0xae, 0x78, 0x18, 0xf8, + 0x16, 0x05, 0xc6, 0xd9, 0x38, 0xed, 0x4a, 0xcf, 0x78, 0x9e, 0xc2, 0x38, 0xed, 0x69, 0x2b, 0x80, + 0x88, 0xd3, 0x28, 0x68, 0x27, 0xa7, 0x2b, 0x1e, 0xf3, 0x70, 0x65, 0xc6, 0xbc, 0x5f, 0x65, 0xc6, + 0xde, 0x4b, 0x19, 0x69, 0xf4, 0xe1, 0x31, 0x9f, 0x5d, 0xf0, 0xa2, 0xbc, 0x4a, 0xf2, 0x83, 0x2a, + 0xe1, 0x62, 0x72, 0x0e, 0x5f, 0x5b, 0xb4, 0xc4, 0xd0, 0x20, 0x44, 0x56, 0x4a, 0xa0, 0x76, 0x25, + 0xb0, 0xc0, 0x61, 0x79, 0xc2, 0x66, 0x5c, 0x7d, 0x59, 0x03, 0xac, 0x04, 0x8e, 0x11, 0x07, 0x22, + 0x56, 0x02, 0x12, 0x76, 0xde, 0xef, 0xb2, 0xcc, 0x19, 0x9f, 0x56, 0x23, 0xac, 0x38, 0x65, 0xcb, + 0x19, 0xcf, 0xa4, 0x36, 0x09, 0xce, 0xe4, 0x1d, 0x93, 0x38, 0x4f, 0x9c, 0xc9, 0xf7, 0xd1, 0x73, + 0x42, 0x93, 0xd7, 0xf0, 0xa7, 0xa2, 0x90, 0xf5, 0x8f, 0xe8, 0x9c, 0x17, 0x29, 0x08, 0x4d, 0x7e, + 0xa3, 0x7a, 0x24, 0x11, 0x9a, 0xc2, 0x1a, 0xce, 0xd7, 0xe7, 0xbd, 0x32, 0xbc, 0xe1, 0x85, 0x19, + 0x27, 0xaf, 0x66, 0x2c, 0x49, 0xf5, 0x68, 0xf8, 0x51, 0xc0, 0x36, 0xa1, 0x43, 0x7c, 0x7d, 0xbe, + 0xaf, 0xae, 0xf3, 0xbd, 0xfe, 0x70, 0x09, 0xc1, 0x23, 0x82, 0x0e, 0xfb, 0xc4, 0x23, 0x82, 0x6e, + 0x2d, 0xbb, 0x73, 0xb7, 0xac, 0xe2, 0x96, 0x8a, 0xd8, 0x15, 0x13, 0x78, 0x5e, 0xe8, 0xd8, 0x04, + 0x20, 0xb1, 0x73, 0x0f, 0x2a, 0xd8, 0xd4, 0xc0, 0x62, 0xfb, 0x49, 0xc6, 0xd2, 0xe4, 0x67, 0x30, + 0xad, 0x77, 0xec, 0x34, 0x04, 0x91, 0x1a, 0xe0, 0x24, 0xe6, 0xea, 0x80, 0xcb, 0x71, 0x52, 0x85, + 0xfe, 0xf5, 0x40, 0xbb, 0x29, 0xa2, 0xdb, 0x95, 0x43, 0x3a, 0xdf, 0x68, 0x85, 0xcd, 0xba, 0x93, + 0xe7, 0xa3, 0x6a, 0x55, 0x3d, 0xe3, 0x31, 0x4f, 0x72, 0x39, 0x78, 0x11, 0x6e, 0x2b, 0x80, 0x13, + 0x17, 0x2d, 0x7a, 0xa8, 0x39, 0x8f, 0xef, 0xab, 0x58, 0x32, 0xaa, 0x7f, 0x5d, 0xee, 0xbc, 0xe4, + 0x85, 0x4e, 0x34, 0x0e, 0xb8, 0x04, 0xb3, 0xd3, 0xe1, 0x86, 0x0e, 0x58, 0x55, 0x94, 0x98, 0x9d, + 0x61, 0x0d, 0x7b, 0xd8, 0xe7, 0x70, 0x67, 0xbc, 0x14, 0xe9, 0x82, 0xab, 0xfb, 0x86, 0x9b, 0xa4, + 0x31, 0x87, 0x22, 0x0e, 0xfb, 0x68, 0xda, 0x66, 0x6b, 0x6d, 0xb7, 0x3b, 0xd9, 0xf2, 0x10, 0x5e, + 0x99, 0x40, 0x2c, 0x29, 0x8c, 0xc8, 0xd6, 0x02, 0xb8, 0x73, 0x18, 0x5e, 0x08, 0x36, 0x89, 0x59, + 0x29, 0x4f, 0xd9, 0x32, 0x15, 0x6c, 0xa2, 0xd6, 0x75, 0x78, 0x18, 0xde, 0x30, 0x43, 0x17, 0xa2, + 0x0e, 0xc3, 0x29, 0xd8, 0xcd, 0xce, 0xd4, 0x8f, 0xe6, 0xe9, 0xbb, 0x9c, 0x30, 0x3b, 0x53, 0xe5, + 0x85, 0xf7, 0x38, 0x1f, 0x86, 0x21, 0xfb, 0x0e, 0x5a, 0x2d, 0x52, 0x69, 0xc8, 0x3d, 0x4c, 0xc7, + 0x4b, 0x40, 0x3e, 0x0d, 0x10, 0xf6, 0xbb, 0x14, 0xf5, 0xdf, 0x9b, 0xdf, 0x7d, 0x91, 0xfa, 0x4b, + 0xd6, 0x9b, 0x98, 0xae, 0x0b, 0x0d, 0xdd, 0x0f, 0xdc, 0x6d, 0xf5, 0xa4, 0x6d, 0x9a, 0xb9, 0x7b, + 0xc5, 0xe4, 0xce, 0x64, 0x72, 0xcc, 0x4b, 0xe4, 0x85, 0xf2, 0x4a, 0x38, 0xb4, 0x52, 0x22, 0xcd, + 0x6c, 0x53, 0x76, 0xa0, 0x57, 0xb2, 0x57, 0x93, 0x44, 0x6a, 0x59, 0x73, 0x43, 0x7a, 0xb3, 0x6d, + 0xa0, 0x4d, 0x11, 0xb5, 0xa2, 0x69, 0x1b, 0xcb, 0x2b, 0x66, 0x2c, 0xa6, 0xd3, 0x94, 0x6b, 0xe8, + 0x8c, 0xb3, 0xfa, 0x43, 0x7e, 0xdb, 0x6d, 0x5b, 0x28, 0x48, 0xc4, 0xf2, 0xa0, 0x82, 0x4d, 0x23, + 0x2b, 0xac, 0x7e, 0x24, 0xd5, 0x34, 0xec, 0x5a, 0xdb, 0x8c, 0x07, 0x10, 0x69, 0x24, 0x0a, 0xda, + 0xf7, 0xde, 0x2a, 0xf1, 0x01, 0x6f, 0x5a, 0x02, 0x7e, 0x82, 0x48, 0x29, 0x3b, 0x62, 0xe2, 0xbd, + 0x37, 0x04, 0xb3, 0xfb, 0x04, 0xe0, 0xe1, 0xe5, 0xf2, 0x70, 0x02, 0xf7, 0x09, 0x50, 0x5f, 0x31, + 0xc4, 0x3e, 0x81, 0x62, 0xfd, 0xae, 0x33, 0xe7, 0x5e, 0x47, 0xac, 0xb4, 0x95, 0x43, 0xba, 0x0e, + 0x05, 0x43, 0x5d, 0x47, 0x29, 0xf8, 0x4d, 0xea, 0x1e, 0xad, 0x21, 0x4d, 0x8a, 0x9d, 0xab, 0xad, + 0x76, 0x61, 0x36, 0x2e, 0x99, 0xfd, 0xa4, 0xba, 0xb2, 0x84, 0x7f, 0xc1, 0xbf, 0x16, 0x12, 0x71, + 0xa9, 0x05, 0x39, 0x3f, 0x49, 0x96, 0x27, 0x23, 0xc9, 0x0a, 0x59, 0x05, 0xe4, 0xf6, 0x4f, 0x92, + 0xe5, 0xc9, 0xd0, 0x91, 0x52, 0x3f, 0x49, 0xd6, 0xa2, 0x9c, 0x9f, 0xd9, 0xaa, 0xcc, 0x8b, 0x5c, + 0x5b, 0x7f, 0x80, 0xe8, 0x35, 0x42, 0xf2, 0x37, 0x53, 0x01, 0x54, 0xdb, 0x7e, 0xf9, 0xe9, 0x7f, + 0x7d, 0x73, 0x67, 0xe5, 0x17, 0xdf, 0xdc, 0x59, 0xf9, 0x9f, 0x6f, 0xee, 0xac, 0xfc, 0xfc, 0xdb, + 0x3b, 0xef, 0xfd, 0xe2, 0xdb, 0x3b, 0xef, 0xfd, 0xf7, 0xb7, 0x77, 0xde, 0xfb, 0xfa, 0x7d, 0xfd, + 0x3b, 0xb0, 0x17, 0xff, 0x4f, 0xfd, 0x9a, 0xeb, 0xf3, 0xff, 0x0b, 0x00, 0x00, 0xff, 0xff, 0x8e, + 0xa4, 0xab, 0x9b, 0x2b, 0x76, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -702,6 +705,10 @@ type ClientCommandsClient interface { ChatSubscribeLastMessages(ctx context.Context, in *pb.RpcChatSubscribeLastMessagesRequest, opts ...grpc.CallOption) (*pb.RpcChatSubscribeLastMessagesResponse, error) ChatUnsubscribe(ctx context.Context, in *pb.RpcChatUnsubscribeRequest, opts ...grpc.CallOption) (*pb.RpcChatUnsubscribeResponse, error) ObjectChatAdd(ctx context.Context, in *pb.RpcObjectChatAddRequest, opts ...grpc.CallOption) (*pb.RpcObjectChatAddResponse, error) + // API + // *** + ApiStartServer(ctx context.Context, in *pb.RpcApiStartServerRequest, opts ...grpc.CallOption) (*pb.RpcApiStartServerResponse, error) + ApiStopServer(ctx context.Context, in *pb.RpcApiStopServerRequest, opts ...grpc.CallOption) (*pb.RpcApiStopServerResponse, error) } type clientCommandsClient struct { @@ -3165,6 +3172,24 @@ func (c *clientCommandsClient) ObjectChatAdd(ctx context.Context, in *pb.RpcObje return out, nil } +func (c *clientCommandsClient) ApiStartServer(ctx context.Context, in *pb.RpcApiStartServerRequest, opts ...grpc.CallOption) (*pb.RpcApiStartServerResponse, error) { + out := new(pb.RpcApiStartServerResponse) + err := c.cc.Invoke(ctx, "/anytype.ClientCommands/ApiStartServer", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *clientCommandsClient) ApiStopServer(ctx context.Context, in *pb.RpcApiStopServerRequest, opts ...grpc.CallOption) (*pb.RpcApiStopServerResponse, error) { + out := new(pb.RpcApiStopServerResponse) + err := c.cc.Invoke(ctx, "/anytype.ClientCommands/ApiStopServer", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + // ClientCommandsServer is the server API for ClientCommands service. type ClientCommandsServer interface { AppGetVersion(context.Context, *pb.RpcAppGetVersionRequest) *pb.RpcAppGetVersionResponse @@ -3498,6 +3523,10 @@ type ClientCommandsServer interface { ChatSubscribeLastMessages(context.Context, *pb.RpcChatSubscribeLastMessagesRequest) *pb.RpcChatSubscribeLastMessagesResponse ChatUnsubscribe(context.Context, *pb.RpcChatUnsubscribeRequest) *pb.RpcChatUnsubscribeResponse ObjectChatAdd(context.Context, *pb.RpcObjectChatAddRequest) *pb.RpcObjectChatAddResponse + // API + // *** + ApiStartServer(context.Context, *pb.RpcApiStartServerRequest) *pb.RpcApiStartServerResponse + ApiStopServer(context.Context, *pb.RpcApiStopServerRequest) *pb.RpcApiStopServerResponse } // UnimplementedClientCommandsServer can be embedded to have forward compatible implementations. @@ -4314,6 +4343,12 @@ func (*UnimplementedClientCommandsServer) ChatUnsubscribe(ctx context.Context, r func (*UnimplementedClientCommandsServer) ObjectChatAdd(ctx context.Context, req *pb.RpcObjectChatAddRequest) *pb.RpcObjectChatAddResponse { return nil } +func (*UnimplementedClientCommandsServer) ApiStartServer(ctx context.Context, req *pb.RpcApiStartServerRequest) *pb.RpcApiStartServerResponse { + return nil +} +func (*UnimplementedClientCommandsServer) ApiStopServer(ctx context.Context, req *pb.RpcApiStopServerRequest) *pb.RpcApiStopServerResponse { + return nil +} func RegisterClientCommandsServer(s *grpc.Server, srv ClientCommandsServer) { s.RegisterService(&_ClientCommands_serviceDesc, srv) @@ -9183,6 +9218,42 @@ func _ClientCommands_ObjectChatAdd_Handler(srv interface{}, ctx context.Context, return interceptor(ctx, in, info, handler) } +func _ClientCommands_ApiStartServer_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(pb.RpcApiStartServerRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ClientCommandsServer).ApiStartServer(ctx, in), nil + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/anytype.ClientCommands/ApiStartServer", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ClientCommandsServer).ApiStartServer(ctx, req.(*pb.RpcApiStartServerRequest)), nil + } + return interceptor(ctx, in, info, handler) +} + +func _ClientCommands_ApiStopServer_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(pb.RpcApiStopServerRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ClientCommandsServer).ApiStopServer(ctx, in), nil + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/anytype.ClientCommands/ApiStopServer", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ClientCommandsServer).ApiStopServer(ctx, req.(*pb.RpcApiStopServerRequest)), nil + } + return interceptor(ctx, in, info, handler) +} + var _ClientCommands_serviceDesc = grpc.ServiceDesc{ ServiceName: "anytype.ClientCommands", HandlerType: (*ClientCommandsServer)(nil), @@ -10263,6 +10334,14 @@ var _ClientCommands_serviceDesc = grpc.ServiceDesc{ MethodName: "ObjectChatAdd", Handler: _ClientCommands_ObjectChatAdd_Handler, }, + { + MethodName: "ApiStartServer", + Handler: _ClientCommands_ApiStartServer_Handler, + }, + { + MethodName: "ApiStopServer", + Handler: _ClientCommands_ApiStopServer_Handler, + }, }, Streams: []grpc.StreamDesc{ { From c75635b8ac3a31333a242a47944c3c9724ab9ce9 Mon Sep 17 00:00:00 2001 From: Jannis Metrikat <120120832+jmetrikat@users.noreply.github.com> Date: Tue, 14 Jan 2025 23:52:14 +0100 Subject: [PATCH 099/195] GO-4459: Refactor util.go --- core/api/util/util.go | 13 ++----------- 1 file changed, 2 insertions(+), 11 deletions(-) diff --git a/core/api/util/util.go b/core/api/util/util.go index 7d467674b..1612897c2 100644 --- a/core/api/util/util.go +++ b/core/api/util/util.go @@ -25,26 +25,17 @@ func GetIconFromEmojiOrImage(accountInfo *model.AccountInfo, iconEmoji string, i } if iconImage != "" { - return GetGatewayURLForMedia(accountInfo, iconImage, true) + return fmt.Sprintf("%s/image/%s", accountInfo.GatewayUrl, iconImage) } return "" } -// GetGatewayURLForMedia returns the URL of file gateway for the media object with the given ID -func GetGatewayURLForMedia(accountInfo *model.AccountInfo, objectId string, isIcon bool) string { - widthParam := "" - if isIcon { - widthParam = "?width=100" - } - return fmt.Sprintf("%s/image/%s%s", accountInfo.GatewayUrl, objectId, widthParam) -} - // ResolveTypeToName resolves the type ID to the name of the type, e.g. "ot-page" to "Page" or "bafyreigyb6l5szohs32ts26ku2j42yd65e6hqy2u3gtzgdwqv6hzftsetu" to "Custom Type" func ResolveTypeToName(mw service.ClientCommandsServer, spaceId string, typeId string) (typeName string, err error) { // Can't look up preinstalled types based on relation key, therefore need to use unique key relKey := bundle.RelationKeyId.String() - if strings.Contains(typeId, "ot-") { + if strings.HasPrefix(typeId, "ot-") { relKey = bundle.RelationKeyUniqueKey.String() } From e70cd1fc247d4d0d749e050943beb6245638670a Mon Sep 17 00:00:00 2001 From: Jannis Metrikat <120120832+jmetrikat@users.noreply.github.com> Date: Tue, 14 Jan 2025 23:58:39 +0100 Subject: [PATCH 100/195] GO-4459: Remove unused endpoints to update object and export space --- core/api/docs/docs.go | 69 ------------------------ core/api/docs/swagger.json | 69 ------------------------ core/api/docs/swagger.yaml | 46 ---------------- core/api/server/router.go | 2 - core/api/services/export/handler.go | 9 ---- core/api/services/object/handler.go | 44 --------------- core/api/services/object/model.go | 5 -- core/api/services/object/service.go | 9 ---- core/api/services/object/service_test.go | 21 -------- 9 files changed, 274 deletions(-) diff --git a/core/api/docs/docs.go b/core/api/docs/docs.go index e4edc552b..b14d66306 100644 --- a/core/api/docs/docs.go +++ b/core/api/docs/docs.go @@ -667,75 +667,6 @@ const docTemplate = `{ } } }, - "put": { - "consumes": [ - "application/json" - ], - "produces": [ - "application/json" - ], - "tags": [ - "objects" - ], - "summary": "Update an existing object in a specific space", - "parameters": [ - { - "type": "string", - "description": "The ID of the space", - "name": "space_id", - "in": "path", - "required": true - }, - { - "type": "string", - "description": "The ID of the object", - "name": "object_id", - "in": "path", - "required": true - }, - { - "description": "The updated object details", - "name": "object", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/object.Object" - } - } - ], - "responses": { - "200": { - "description": "The updated object", - "schema": { - "$ref": "#/definitions/object.ObjectResponse" - } - }, - "400": { - "description": "Bad request", - "schema": { - "$ref": "#/definitions/util.ValidationError" - } - }, - "403": { - "description": "Unauthorized", - "schema": { - "$ref": "#/definitions/util.UnauthorizedError" - } - }, - "404": { - "description": "Resource not found", - "schema": { - "$ref": "#/definitions/util.NotFoundError" - } - }, - "502": { - "description": "Internal server error", - "schema": { - "$ref": "#/definitions/util.ServerError" - } - } - } - }, "delete": { "consumes": [ "application/json" diff --git a/core/api/docs/swagger.json b/core/api/docs/swagger.json index cb33fc852..68a3b91e7 100644 --- a/core/api/docs/swagger.json +++ b/core/api/docs/swagger.json @@ -661,75 +661,6 @@ } } }, - "put": { - "consumes": [ - "application/json" - ], - "produces": [ - "application/json" - ], - "tags": [ - "objects" - ], - "summary": "Update an existing object in a specific space", - "parameters": [ - { - "type": "string", - "description": "The ID of the space", - "name": "space_id", - "in": "path", - "required": true - }, - { - "type": "string", - "description": "The ID of the object", - "name": "object_id", - "in": "path", - "required": true - }, - { - "description": "The updated object details", - "name": "object", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/object.Object" - } - } - ], - "responses": { - "200": { - "description": "The updated object", - "schema": { - "$ref": "#/definitions/object.ObjectResponse" - } - }, - "400": { - "description": "Bad request", - "schema": { - "$ref": "#/definitions/util.ValidationError" - } - }, - "403": { - "description": "Unauthorized", - "schema": { - "$ref": "#/definitions/util.UnauthorizedError" - } - }, - "404": { - "description": "Resource not found", - "schema": { - "$ref": "#/definitions/util.NotFoundError" - } - }, - "502": { - "description": "Internal server error", - "schema": { - "$ref": "#/definitions/util.ServerError" - } - } - } - }, "delete": { "consumes": [ "application/json" diff --git a/core/api/docs/swagger.yaml b/core/api/docs/swagger.yaml index c924ff003..dc4fdc6dc 100644 --- a/core/api/docs/swagger.yaml +++ b/core/api/docs/swagger.yaml @@ -799,52 +799,6 @@ paths: summary: Retrieve a specific object in a space tags: - objects - put: - consumes: - - application/json - parameters: - - description: The ID of the space - in: path - name: space_id - required: true - type: string - - description: The ID of the object - in: path - name: object_id - required: true - type: string - - description: The updated object details - in: body - name: object - required: true - schema: - $ref: '#/definitions/object.Object' - produces: - - application/json - responses: - "200": - description: The updated object - schema: - $ref: '#/definitions/object.ObjectResponse' - "400": - description: Bad request - schema: - $ref: '#/definitions/util.ValidationError' - "403": - description: Unauthorized - schema: - $ref: '#/definitions/util.UnauthorizedError' - "404": - description: Resource not found - schema: - $ref: '#/definitions/util.NotFoundError' - "502": - description: Internal server error - schema: - $ref: '#/definitions/util.ServerError' - summary: Update an existing object in a specific space - tags: - - objects /spaces/{space_id}/objects/{object_id}/export/{format}: post: consumes: diff --git a/core/api/server/router.go b/core/api/server/router.go index 6ce14184d..136e710aa 100644 --- a/core/api/server/router.go +++ b/core/api/server/router.go @@ -41,7 +41,6 @@ func (s *Server) NewRouter(a *app.App) *gin.Engine { // Export v1.POST("/spaces/:space_id/objects/:object_id/export/:format", export.GetObjectExportHandler(s.exportService)) - v1.POST("/spaces/:space_id/objects/export/:format", export.GetSpaceExportHandler(s.exportService)) // Object v1.GET("/spaces/:space_id/objects", object.GetObjectsHandler(s.objectService)) @@ -50,7 +49,6 @@ func (s *Server) NewRouter(a *app.App) *gin.Engine { v1.GET("/spaces/:space_id/object_types", object.GetTypesHandler(s.objectService)) v1.GET("/spaces/:space_id/object_types/:typeId/templates", object.GetTemplatesHandler(s.objectService)) v1.POST("/spaces/:space_id/objects", object.CreateObjectHandler(s.objectService)) - v1.PUT("/spaces/:space_id/objects/:object_id", object.UpdateObjectHandler(s.objectService)) // Search v1.GET("/search", search.SearchHandler(s.searchService)) diff --git a/core/api/services/export/handler.go b/core/api/services/export/handler.go index d07f674bd..aa1017c9b 100644 --- a/core/api/services/export/handler.go +++ b/core/api/services/export/handler.go @@ -48,12 +48,3 @@ func GetObjectExportHandler(s *ExportService) gin.HandlerFunc { c.JSON(http.StatusOK, ObjectExportResponse{Path: outputPath}) } } - -func GetSpaceExportHandler(s *ExportService) gin.HandlerFunc { - return func(c *gin.Context) { - // spaceId := c.Param("space_id") - // format := c.Query("format") - - c.JSON(http.StatusNotImplemented, "Not implemented") - } -} diff --git a/core/api/services/object/handler.go b/core/api/services/object/handler.go index 18facccf7..9f835d14d 100644 --- a/core/api/services/object/handler.go +++ b/core/api/services/object/handler.go @@ -160,50 +160,6 @@ func CreateObjectHandler(s *ObjectService) gin.HandlerFunc { } } -// UpdateObjectHandler updates an existing object in a specific space -// -// @Summary Update an existing object in a specific space -// @Tags objects -// @Accept json -// @Produce json -// @Param space_id path string true "The ID of the space" -// @Param object_id path string true "The ID of the object" -// @Param object body Object true "The updated object details" -// @Success 200 {object} ObjectResponse "The updated object" -// @Failure 400 {object} util.ValidationError "Bad request" -// @Failure 403 {object} util.UnauthorizedError "Unauthorized" -// @Failure 404 {object} util.NotFoundError "Resource not found" -// @Failure 502 {object} util.ServerError "Internal server error" -// @Router /spaces/{space_id}/objects/{object_id} [put] -func UpdateObjectHandler(s *ObjectService) gin.HandlerFunc { - return func(c *gin.Context) { - spaceId := c.Param("space_id") - objectId := c.Param("object_id") - - request := UpdateObjectRequest{} - if err := c.BindJSON(&request); err != nil { - apiErr := util.CodeToAPIError(http.StatusBadRequest, err.Error()) - c.JSON(http.StatusBadRequest, apiErr) - return - } - - object, err := s.UpdateObject(c.Request.Context(), spaceId, objectId, request) - code := util.MapErrorCode(err, - util.ErrToCode(ErrNotImplemented, http.StatusNotImplemented), - util.ErrToCode(ErrFailedUpdateObject, http.StatusInternalServerError), - util.ErrToCode(ErrFailedRetrieveObject, http.StatusInternalServerError), - ) - - if code != http.StatusOK { - apiErr := util.CodeToAPIError(code, err.Error()) - c.JSON(code, apiErr) - return - } - - c.JSON(http.StatusNotImplemented, ObjectResponse{Object: object}) - } -} - // GetTypesHandler retrieves object types in a specific space // // @Summary Retrieve object types in a specific space diff --git a/core/api/services/object/model.go b/core/api/services/object/model.go index 8c9eac48e..1a2858a6f 100644 --- a/core/api/services/object/model.go +++ b/core/api/services/object/model.go @@ -11,11 +11,6 @@ type CreateObjectRequest struct { WithChat bool `json:"with_chat"` } -// TODO: Add fields to the request -type UpdateObjectRequest struct { - Object Object `json:"object"` -} - type ObjectResponse struct { Object Object `json:"object"` } diff --git a/core/api/services/object/service.go b/core/api/services/object/service.go index f8f0c651e..577130a80 100644 --- a/core/api/services/object/service.go +++ b/core/api/services/object/service.go @@ -26,8 +26,6 @@ var ( ErrFailedSetRelationFeatured = errors.New("failed to set relation featured") ErrFailedFetchBookmark = errors.New("failed to fetch bookmark") ErrFailedPasteBody = errors.New("failed to paste body") - ErrNotImplemented = errors.New("not implemented") - ErrFailedUpdateObject = errors.New("failed to update object") ErrFailedRetrieveTypes = errors.New("failed to retrieve types") ErrNoTypesFound = errors.New("no types found") ErrFailedRetrieveTemplateType = errors.New("failed to retrieve template type") @@ -42,7 +40,6 @@ type Service interface { GetObject(ctx context.Context, spaceId string, objectId string) (Object, error) DeleteObject(ctx context.Context, spaceId string, objectId string) error CreateObject(ctx context.Context, spaceId string, request CreateObjectRequest) (Object, error) - UpdateObject(ctx context.Context, spaceId string, objectId string, request UpdateObjectRequest) (Object, error) ListTypes(ctx context.Context, spaceId string, offset int, limit int) ([]ObjectType, int, bool, error) ListTemplates(ctx context.Context, spaceId string, typeId string, offset int, limit int) ([]ObjectTemplate, int, bool, error) } @@ -266,12 +263,6 @@ func (s *ObjectService) CreateObject(ctx context.Context, spaceId string, reques return s.GetObject(ctx, spaceId, resp.ObjectId) } -// UpdateObject updates an existing object in a specific space. -func (s *ObjectService) UpdateObject(ctx context.Context, spaceId string, objectId string, request UpdateObjectRequest) (Object, error) { - // TODO: Implement logic to update an existing object - return Object{}, ErrNotImplemented -} - // ListTypes returns a paginated list of types in a specific space. func (s *ObjectService) ListTypes(ctx context.Context, spaceId string, offset int, limit int) (types []ObjectType, total int, hasMore bool, err error) { resp := s.mw.ObjectSearch(ctx, &pb.RpcObjectSearchRequest{ diff --git a/core/api/services/object/service_test.go b/core/api/services/object/service_test.go index 8ce672413..4b3d42e5b 100644 --- a/core/api/services/object/service_test.go +++ b/core/api/services/object/service_test.go @@ -405,27 +405,6 @@ func TestObjectService_CreateObject(t *testing.T) { }) } -func TestObjectService_UpdateObject(t *testing.T) { - t.Run("not implemented", func(t *testing.T) { - // given - ctx := context.Background() - fx := newFixture(t) - - // when - object, err := fx.UpdateObject(ctx, mockedSpaceId, mockedObjectId, UpdateObjectRequest{ - Object: Object{ - Name: "Updated Object", - }, - }) - - // then - require.ErrorIs(t, err, ErrNotImplemented) - require.Empty(t, object) - }) - - // TODO: further tests -} - func TestObjectService_ListTypes(t *testing.T) { t.Run("types found", func(t *testing.T) { // given From 972ec0f7cb5ba4c8ae326e7eea8e000569c494c9 Mon Sep 17 00:00:00 2001 From: Jannis Metrikat <120120832+jmetrikat@users.noreply.github.com> Date: Tue, 14 Jan 2025 23:58:52 +0100 Subject: [PATCH 101/195] GO-4459: Update mock --- .../mock_service/mock_ClientCommandsServer.go | 98 +++++++++++++++++++ 1 file changed, 98 insertions(+) diff --git a/pb/service/mock_service/mock_ClientCommandsServer.go b/pb/service/mock_service/mock_ClientCommandsServer.go index e6ce72bf3..1504906a7 100644 --- a/pb/service/mock_service/mock_ClientCommandsServer.go +++ b/pb/service/mock_service/mock_ClientCommandsServer.go @@ -661,6 +661,104 @@ func (_c *MockClientCommandsServer_AccountStop_Call) RunAndReturn(run func(conte return _c } +// ApiStartServer provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) ApiStartServer(_a0 context.Context, _a1 *pb.RpcApiStartServerRequest) *pb.RpcApiStartServerResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for ApiStartServer") + } + + var r0 *pb.RpcApiStartServerResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcApiStartServerRequest) *pb.RpcApiStartServerResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcApiStartServerResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_ApiStartServer_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ApiStartServer' +type MockClientCommandsServer_ApiStartServer_Call struct { + *mock.Call +} + +// ApiStartServer is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcApiStartServerRequest +func (_e *MockClientCommandsServer_Expecter) ApiStartServer(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_ApiStartServer_Call { + return &MockClientCommandsServer_ApiStartServer_Call{Call: _e.mock.On("ApiStartServer", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_ApiStartServer_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcApiStartServerRequest)) *MockClientCommandsServer_ApiStartServer_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcApiStartServerRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_ApiStartServer_Call) Return(_a0 *pb.RpcApiStartServerResponse) *MockClientCommandsServer_ApiStartServer_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_ApiStartServer_Call) RunAndReturn(run func(context.Context, *pb.RpcApiStartServerRequest) *pb.RpcApiStartServerResponse) *MockClientCommandsServer_ApiStartServer_Call { + _c.Call.Return(run) + return _c +} + +// ApiStopServer provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) ApiStopServer(_a0 context.Context, _a1 *pb.RpcApiStopServerRequest) *pb.RpcApiStopServerResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for ApiStopServer") + } + + var r0 *pb.RpcApiStopServerResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcApiStopServerRequest) *pb.RpcApiStopServerResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcApiStopServerResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_ApiStopServer_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ApiStopServer' +type MockClientCommandsServer_ApiStopServer_Call struct { + *mock.Call +} + +// ApiStopServer is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcApiStopServerRequest +func (_e *MockClientCommandsServer_Expecter) ApiStopServer(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_ApiStopServer_Call { + return &MockClientCommandsServer_ApiStopServer_Call{Call: _e.mock.On("ApiStopServer", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_ApiStopServer_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcApiStopServerRequest)) *MockClientCommandsServer_ApiStopServer_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcApiStopServerRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_ApiStopServer_Call) Return(_a0 *pb.RpcApiStopServerResponse) *MockClientCommandsServer_ApiStopServer_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_ApiStopServer_Call) RunAndReturn(run func(context.Context, *pb.RpcApiStopServerRequest) *pb.RpcApiStopServerResponse) *MockClientCommandsServer_ApiStopServer_Call { + _c.Call.Return(run) + return _c +} + // AppGetVersion provides a mock function with given fields: _a0, _a1 func (_m *MockClientCommandsServer) AppGetVersion(_a0 context.Context, _a1 *pb.RpcAppGetVersionRequest) *pb.RpcAppGetVersionResponse { ret := _m.Called(_a0, _a1) From e0ba47894c110741aecd3461e2c1bb2d2affbb42 Mon Sep 17 00:00:00 2001 From: Jannis Metrikat <120120832+jmetrikat@users.noreply.github.com> Date: Wed, 15 Jan 2025 00:21:18 +0100 Subject: [PATCH 102/195] GO-4459: Add missing api.go --- core/api.go | 57 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 57 insertions(+) create mode 100644 core/api.go diff --git a/core/api.go b/core/api.go new file mode 100644 index 000000000..3a1f21577 --- /dev/null +++ b/core/api.go @@ -0,0 +1,57 @@ +package core + +import ( + "context" + "fmt" + + "github.com/anyproto/anytype-heart/core/api" + "github.com/anyproto/anytype-heart/pb" +) + +func (mw *Middleware) ApiStartServer(cctx context.Context, req *pb.RpcApiStartServerRequest) *pb.RpcApiStartServerResponse { + response := func(err error) *pb.RpcApiStartServerResponse { + m := &pb.RpcApiStartServerResponse{ + Error: &pb.RpcApiStartServerResponseError{ + Code: pb.RpcApiStartServerResponseError_NULL, + }, + } + if err != nil { + m.Error.Code = mapErrorCode(err, + errToCode(api.ErrPortAlreadyUsed, pb.RpcApiStartServerResponseError_PORT_ALREADY_USED), + errToCode(api.ErrServerAlreadyStarted, pb.RpcApiStartServerResponseError_SERVER_ALREADY_STARTED)) + m.Error.Description = getErrorDescription(err) + } + return m + } + + apiService := mw.applicationService.GetApp().Component(api.CName).(api.Api) + if apiService == nil { + return response(fmt.Errorf("node not started")) + } + + err := apiService.Start() + return response(err) +} + +func (mw *Middleware) ApiStopServer(cctx context.Context, req *pb.RpcApiStopServerRequest) *pb.RpcApiStopServerResponse { + response := func(err error) *pb.RpcApiStopServerResponse { + m := &pb.RpcApiStopServerResponse{ + Error: &pb.RpcApiStopServerResponseError{ + Code: pb.RpcApiStopServerResponseError_NULL, + }, + } + if err != nil { + m.Error.Code = mapErrorCode(err, errToCode(api.ErrServerNotStarted, pb.RpcApiStopServerResponseError_SERVER_NOT_STARTED)) + m.Error.Description = getErrorDescription(err) + } + return m + } + + apiService := mw.applicationService.GetApp().Component(api.CName).(api.Api) + if apiService == nil { + return response(fmt.Errorf("node not started")) + } + + err := apiService.Stop() + return response(err) +} From 1ad655f8b17399659e8cec586e494d1988660a4f Mon Sep 17 00:00:00 2001 From: Jannis Metrikat <120120832+jmetrikat@users.noreply.github.com> Date: Wed, 15 Jan 2025 02:00:26 +0100 Subject: [PATCH 103/195] GO-4459: Add rate limiter to write requests --- core/api/server/middleware.go | 53 ++++++++++++++++++++++++----------- core/api/server/router.go | 25 +++++++++++------ go.mod | 2 ++ go.sum | 4 +++ 4 files changed, 59 insertions(+), 25 deletions(-) diff --git a/core/api/server/middleware.go b/core/api/server/middleware.go index b88747337..6f0273545 100644 --- a/core/api/server/middleware.go +++ b/core/api/server/middleware.go @@ -6,30 +6,27 @@ import ( "net/http" "github.com/anyproto/any-sync/app" + "github.com/didip/tollbooth/v8" + "github.com/didip/tollbooth/v8/limiter" "github.com/gin-gonic/gin" "github.com/anyproto/anytype-heart/core/anytype/account" ) -// initAccountInfo retrieves the account information from the account service. -func (s *Server) initAccountInfo(a *app.App) gin.HandlerFunc { +// rateLimit is a middleware that limits the number of requests per second. +func (s *Server) rateLimit(max float64) gin.HandlerFunc { + lmt := tollbooth.NewLimiter(max, nil) + lmt.SetIPLookup(limiter.IPLookup{ + Name: "RemoteAddr", + IndexFromRight: 0, + }) + return func(c *gin.Context) { - // TODO: consider not fetching account info on every request; currently used to avoid inconsistencies on logout/login - if a == nil { - c.AbortWithStatusJSON(http.StatusForbidden, gin.H{"error": "failed to get app instance"}) + httpError := tollbooth.LimitByRequest(lmt, c.Writer, c.Request) + if httpError != nil { + c.AbortWithStatusJSON(httpError.StatusCode, gin.H{"error": httpError.Message}) return } - - accInfo, err := a.Component(account.CName).(account.Service).GetInfo(context.Background()) - if err != nil { - c.AbortWithStatusJSON(http.StatusInternalServerError, gin.H{"error": fmt.Sprintf("failed to get account info: %v", err)}) - return - } - - s.exportService.AccountInfo = accInfo - s.objectService.AccountInfo = accInfo - s.spaceService.AccountInfo = accInfo - s.searchService.AccountInfo = accInfo c.Next() } } @@ -47,3 +44,27 @@ func (s *Server) ensureAuthenticated() gin.HandlerFunc { c.Next() } } + +// ensureAccountInfo is a middleware that ensures the account info is available in the services. +func (s *Server) ensureAccountInfo(a *app.App) gin.HandlerFunc { + return func(c *gin.Context) { + // TODO: consider not fetching account info on every request; currently used to avoid inconsistencies on logout/login + if a == nil { + c.AbortWithStatusJSON(http.StatusForbidden, gin.H{"error": "failed to get app instance"}) + return + } + + accInfo, err := a.Component(account.CName).(account.Service).GetInfo(context.Background()) + if err != nil { + c.AbortWithStatusJSON(http.StatusInternalServerError, gin.H{"error": fmt.Sprintf("failed to get account info: %v", err)}) + return + } + + s.exportService.AccountInfo = accInfo + s.objectService.AccountInfo = accInfo + s.spaceService.AccountInfo = accInfo + s.searchService.AccountInfo = accInfo + + c.Next() + } +} diff --git a/core/api/server/router.go b/core/api/server/router.go index 136e710aa..67e1e0592 100644 --- a/core/api/server/router.go +++ b/core/api/server/router.go @@ -14,16 +14,23 @@ import ( "github.com/anyproto/anytype-heart/core/api/services/space" ) +const ( + defaultPage = 0 + defaultPageSize = 100 + minPageSize = 1 + maxPageSize = 1000 + maxWriteRequestsPerSecond = 1 +) + // NewRouter builds and returns a *gin.Engine with all routes configured. func (s *Server) NewRouter(a *app.App) *gin.Engine { router := gin.Default() - // Pagination middleware setup paginator := pagination.New(pagination.Config{ - DefaultPage: 0, - DefaultPageSize: 100, - MinPageSize: 1, - MaxPageSize: 1000, + DefaultPage: defaultPage, + DefaultPageSize: defaultPageSize, + MinPageSize: minPageSize, + MaxPageSize: maxPageSize, }) // Swagger route @@ -32,8 +39,8 @@ func (s *Server) NewRouter(a *app.App) *gin.Engine { // API routes v1 := router.Group("/v1") v1.Use(paginator) - v1.Use(s.initAccountInfo(a)) v1.Use(s.ensureAuthenticated()) + v1.Use(s.ensureAccountInfo(a)) { // Auth v1.POST("/auth/display_code", auth.DisplayCodeHandler(s.authService)) @@ -45,10 +52,10 @@ func (s *Server) NewRouter(a *app.App) *gin.Engine { // Object v1.GET("/spaces/:space_id/objects", object.GetObjectsHandler(s.objectService)) v1.GET("/spaces/:space_id/objects/:object_id", object.GetObjectHandler(s.objectService)) - v1.DELETE("/spaces/:space_id/objects/:object_id", object.DeleteObjectHandler(s.objectService)) + v1.DELETE("/spaces/:space_id/objects/:object_id", s.rateLimit(maxWriteRequestsPerSecond), object.DeleteObjectHandler(s.objectService)) v1.GET("/spaces/:space_id/object_types", object.GetTypesHandler(s.objectService)) v1.GET("/spaces/:space_id/object_types/:typeId/templates", object.GetTemplatesHandler(s.objectService)) - v1.POST("/spaces/:space_id/objects", object.CreateObjectHandler(s.objectService)) + v1.POST("/spaces/:space_id/objects", s.rateLimit(maxWriteRequestsPerSecond), object.CreateObjectHandler(s.objectService)) // Search v1.GET("/search", search.SearchHandler(s.searchService)) @@ -56,7 +63,7 @@ func (s *Server) NewRouter(a *app.App) *gin.Engine { // Space v1.GET("/spaces", space.GetSpacesHandler(s.spaceService)) v1.GET("/spaces/:space_id/members", space.GetMembersHandler(s.spaceService)) - v1.POST("/spaces", space.CreateSpaceHandler(s.spaceService)) + v1.POST("/spaces", s.rateLimit(maxWriteRequestsPerSecond), space.CreateSpaceHandler(s.spaceService)) } return router diff --git a/go.mod b/go.mod index 7e842dc16..942dcecf0 100644 --- a/go.mod +++ b/go.mod @@ -149,6 +149,7 @@ require ( github.com/decred/dcrd/dcrec/secp256k1/v4 v4.3.0 // indirect github.com/desertbit/timer v0.0.0-20180107155436-c41aec40b27f // indirect github.com/dgraph-io/ristretto v0.1.1 // indirect + github.com/didip/tollbooth/v8 v8.0.1 // indirect github.com/disintegration/imaging v1.6.2 // indirect github.com/dsoprea/go-iptc v0.0.0-20200609062250-162ae6b44feb // indirect github.com/dsoprea/go-logging v0.0.0-20200710184922-b02d349568dd // indirect @@ -169,6 +170,7 @@ require ( github.com/go-openapi/jsonreference v0.19.6 // indirect github.com/go-openapi/spec v0.20.4 // indirect github.com/go-openapi/swag v0.19.15 // indirect + github.com/go-pkgz/expirable-cache/v3 v3.0.0 // indirect github.com/go-playground/locales v0.14.1 // indirect github.com/go-playground/universal-translator v0.18.1 // indirect github.com/go-playground/validator/v10 v10.22.1 // indirect diff --git a/go.sum b/go.sum index 62d1047a5..6383f62bc 100644 --- a/go.sum +++ b/go.sum @@ -226,6 +226,8 @@ github.com/dgtony/collections v0.1.6 h1:Qv4xLe4nXJgIeeExex6e7mDyP57tzZN3MYaGfN8u github.com/dgtony/collections v0.1.6/go.mod h1:olD2FRoNisWmjMhK6LDRKv+lMnDoryOZIT+owtd/o6U= github.com/dhowden/tag v0.0.0-20240417053706-3d75831295e8 h1:OtSeLS5y0Uy01jaKK4mA/WVIYtpzVm63vLVAPzJXigg= github.com/dhowden/tag v0.0.0-20240417053706-3d75831295e8/go.mod h1:apkPC/CR3s48O2D7Y++n1XWEpgPNNCjXYga3PPbJe2E= +github.com/didip/tollbooth/v8 v8.0.1 h1:VAAapTo1t4Bn6bbpcHjuovwoa9u3JH++wgjbpWv+rB8= +github.com/didip/tollbooth/v8 v8.0.1/go.mod h1:oEd9l+ep373d7DmvKLc0a5gasPOev2mTewi6KPQBGJ4= github.com/disintegration/imaging v1.6.2 h1:w1LecBlG2Lnp8B3jk5zSuNqd7b4DXhcjwek1ei82L+c= github.com/disintegration/imaging v1.6.2/go.mod h1:44/5580QXChDfwIclfc/PCwrr44amcmDAg8hxG0Ewe4= github.com/dsoprea/go-exif/v2 v2.0.0-20200321225314-640175a69fe4/go.mod h1:Lm2lMM2zx8p4a34ZemkaUV95AnMl4ZvLbCUbwOvLC2E= @@ -335,6 +337,8 @@ github.com/go-openapi/spec v0.20.4/go.mod h1:faYFR1CvsJZ0mNsmsphTMSoRrNV3TEDoAM7 github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= github.com/go-openapi/swag v0.19.15 h1:D2NRCBzS9/pEY3gP9Nl8aDqGUcPFrwG2p+CNFrLyrCM= github.com/go-openapi/swag v0.19.15/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ= +github.com/go-pkgz/expirable-cache/v3 v3.0.0 h1:u3/gcu3sabLYiTCevoRKv+WzjIn5oo7P8XtiXBeRDLw= +github.com/go-pkgz/expirable-cache/v3 v3.0.0/go.mod h1:2OQiDyEGQalYecLWmXprm3maPXeVb5/6/X7yRPYTzec= github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= github.com/go-playground/assert/v2 v2.2.0 h1:JvknZsQTYeFEAhQwI4qEt9cyV5ONwRHC+lYKSsYSR8s= github.com/go-playground/assert/v2 v2.2.0/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= From d98041dc28b9ab7cde813f3c86f366ca03121bb8 Mon Sep 17 00:00:00 2001 From: AnastasiaShemyakinskaya Date: Wed, 15 Jan 2025 12:16:10 +0100 Subject: [PATCH 104/195] GO-4406: merge main Signed-off-by: AnastasiaShemyakinskaya --- core/block/object/objectcreator/creator.go | 4 ++-- core/block/object/objectcreator/installer.go | 2 +- core/block/object/objectcreator/relation_option.go | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/core/block/object/objectcreator/creator.go b/core/block/object/objectcreator/creator.go index 357a781b3..4405e58c9 100644 --- a/core/block/object/objectcreator/creator.go +++ b/core/block/object/objectcreator/creator.go @@ -212,8 +212,8 @@ func buildDateObject(space clientspace.Space, details *domain.Details) (string, return dateObject.Id(), details, err } -func setOriginalCreatedTimestamp(state *state.State, details *types.Struct) { - if createDate := pbtypes.GetInt64(details, bundle.RelationKeyCreatedDate.String()); createDate != 0 { +func setOriginalCreatedTimestamp(state *state.State, details *domain.Details) { + if createDate := details.GetInt64(bundle.RelationKeyCreatedDate); createDate != 0 { state.SetOriginalCreatedTimestamp(createDate) } } diff --git a/core/block/object/objectcreator/installer.go b/core/block/object/objectcreator/installer.go index e217f81d4..ca71571a2 100644 --- a/core/block/object/objectcreator/installer.go +++ b/core/block/object/objectcreator/installer.go @@ -255,7 +255,7 @@ func (s *service) prepareDetailsForInstallingObject( details.SetString(bundle.RelationKeySpaceId, spaceID) details.SetString(bundle.RelationKeySourceObject, sourceId) details.SetBool(bundle.RelationKeyIsReadonly, false) - details.Fields[bundle.RelationKeyCreatedDate.String()] = pbtypes.Int64(time.Now().Unix()) + details.SetInt64(bundle.RelationKeyCreatedDate, time.Now().Unix()) // we should delete old createdDate as it belongs to source object from marketplace details.Delete(bundle.RelationKeyCreatedDate) diff --git a/core/block/object/objectcreator/relation_option.go b/core/block/object/objectcreator/relation_option.go index 6f407ece3..42724ab7b 100644 --- a/core/block/object/objectcreator/relation_option.go +++ b/core/block/object/objectcreator/relation_option.go @@ -48,7 +48,7 @@ func getUniqueKeyOrGenerate(sbType coresb.SmartBlockType, details *domain.Detail if err != nil { return nil, err } - details.Fields[bundle.RelationKeyUniqueKey.String()] = pbtypes.String(newUniqueKey.Marshal()) + details.SetString(bundle.RelationKeyUniqueKey, newUniqueKey.Marshal()) return newUniqueKey, err } return domain.UnmarshalUniqueKey(uniqueKey) From c2fe8eb36c214d61993cc3d891e93aea487fb395 Mon Sep 17 00:00:00 2001 From: Jannis Metrikat <120120832+jmetrikat@users.noreply.github.com> Date: Wed, 15 Jan 2025 12:32:04 +0100 Subject: [PATCH 105/195] GO-4459: Return time in ISO 8601 instead of POSIX --- core/api/services/object/model.go | 4 +-- core/api/services/object/service.go | 40 +++++------------------- core/api/services/search/service.go | 12 +++---- core/api/services/search/service_test.go | 4 +-- 4 files changed, 18 insertions(+), 42 deletions(-) diff --git a/core/api/services/object/model.go b/core/api/services/object/model.go index 1a2858a6f..3f8b8219c 100644 --- a/core/api/services/object/model.go +++ b/core/api/services/object/model.go @@ -32,8 +32,8 @@ type Block struct { Id string `json:"id"` ChildrenIds []string `json:"children_ids"` BackgroundColor string `json:"background_color"` - Align string `json:"align"` - VerticalAlign string `json:"vertical_align"` + Align string `json:"align" example:"AlignLeft"` + VerticalAlign string `json:"vertical_align" example:"VerticalAlignTop"` Text *Text `json:"text,omitempty"` File *File `json:"file,omitempty"` } diff --git a/core/api/services/object/service.go b/core/api/services/object/service.go index 577130a80..c7b8a83d8 100644 --- a/core/api/services/object/service.go +++ b/core/api/services/object/service.go @@ -3,6 +3,7 @@ package object import ( "context" "errors" + "time" "github.com/gogo/protobuf/types" @@ -397,13 +398,13 @@ func (s *ObjectService) GetDetails(resp *pb.RpcObjectShowResponse) []Detail { { Id: "lastModifiedDate", Details: map[string]interface{}{ - "lastModifiedDate": resp.ObjectView.Details[0].Details.Fields["lastModifiedDate"].GetNumberValue(), + "lastModifiedDate": PosixToISO8601(resp.ObjectView.Details[0].Details.Fields["lastModifiedDate"].GetNumberValue()), }, }, { Id: "createdDate", Details: map[string]interface{}{ - "createdDate": resp.ObjectView.Details[0].Details.Fields["createdDate"].GetNumberValue(), + "createdDate": PosixToISO8601(resp.ObjectView.Details[0].Details.Fields["createdDate"].GetNumberValue()), }, }, { @@ -476,8 +477,8 @@ func (s *ObjectService) GetBlocks(resp *pb.RpcObjectShowResponse) []Block { Id: block.Id, ChildrenIds: block.ChildrenIds, BackgroundColor: block.BackgroundColor, - Align: mapAlign(block.Align), - VerticalAlign: mapVerticalAlign(block.VerticalAlign), + Align: model.BlockAlign_name[int32(block.Align)], + VerticalAlign: model.BlockVerticalAlign_name[int32(block.VerticalAlign)], Text: text, File: file, }) @@ -486,32 +487,7 @@ func (s *ObjectService) GetBlocks(resp *pb.RpcObjectShowResponse) []Block { return blocks } -// mapAlign maps the protobuf BlockAlign to a string. -func mapAlign(align model.BlockAlign) string { - switch align { - case model.Block_AlignLeft: - return "left" - case model.Block_AlignCenter: - return "center" - case model.Block_AlignRight: - return "right" - case model.Block_AlignJustify: - return "justify" - default: - return "unknown" - } -} - -// mapVerticalAlign maps the protobuf BlockVerticalAlign to a string. -func mapVerticalAlign(align model.BlockVerticalAlign) string { - switch align { - case model.Block_VerticalAlignTop: - return "top" - case model.Block_VerticalAlignMiddle: - return "middle" - case model.Block_VerticalAlignBottom: - return "bottom" - default: - return "unknown" - } +func PosixToISO8601(posix float64) string { + t := time.Unix(int64(posix), 0).UTC() + return t.Format(time.RFC3339) } diff --git a/core/api/services/search/service.go b/core/api/services/search/service.go index 66fc04d55..20386b8f6 100644 --- a/core/api/services/search/service.go +++ b/core/api/services/search/service.go @@ -63,10 +63,8 @@ func (s *SearchService) Search(ctx context.Context, searchQuery string, objectTy IncludeTime: true, EmptyPlacement: model.BlockContentDataviewSort_NotSpecified, }}, - Keys: []string{"id", "name"}, - // TODO split limit between spaces - // Limit: paginationLimitPerSpace, - // FullText: searchTerm, + Keys: []string{"id", "name"}, + Limit: int32(limit), // nolint: gosec }) if objResp.Error.Code != pb.RpcObjectSearchResponseError_NULL { @@ -90,9 +88,11 @@ func (s *SearchService) Search(ctx context.Context, searchQuery string, objectTy return nil, 0, false, ErrNoObjectsFound } - // sort after lastModifiedDate to achieve descending sort order across all spaces + // sort after ISO 8601 lastModifiedDate to achieve descending sort order across all spaces sort.Slice(results, func(i, j int) bool { - return results[i].Details[0].Details["lastModifiedDate"].(float64) > results[j].Details[0].Details["lastModifiedDate"].(float64) + dateStrI := results[i].Details[0].Details["lastModifiedDate"].(string) + dateStrJ := results[j].Details[0].Details["lastModifiedDate"].(string) + return dateStrI > dateStrJ }) // TODO: solve global pagination vs per space pagination diff --git a/core/api/services/search/service_test.go b/core/api/services/search/service_test.go index fb6aaee6c..a54cc68f5 100644 --- a/core/api/services/search/service_test.go +++ b/core/api/services/search/service_test.go @@ -214,9 +214,9 @@ func TestSearchService_Search(t *testing.T) { // check details for _, detail := range objects[0].Details { if detail.Id == "createdDate" { - require.Equal(t, float64(888888), detail.Details["createdDate"]) + require.Equal(t, string("1970-01-11T06:54:48Z"), detail.Details["createdDate"]) } else if detail.Id == "lastModifiedDate" { - require.Equal(t, float64(999999), detail.Details["lastModifiedDate"]) + require.Equal(t, string("1970-01-12T13:46:39Z"), detail.Details["lastModifiedDate"]) } } From c547ed88a7c9754bdb6ab6afcfae4d135bfd44ae Mon Sep 17 00:00:00 2001 From: Jannis Metrikat <120120832+jmetrikat@users.noreply.github.com> Date: Wed, 15 Jan 2025 12:57:18 +0100 Subject: [PATCH 106/195] GO-4848: Add ObjectOrigin enum option for API --- core/api/services/object/service.go | 9 +- docs/proto.md | 1 + pkg/lib/pb/model/models.pb.go | 1123 +++++++++++++------------- pkg/lib/pb/model/protos/models.proto | 1 + 4 files changed, 570 insertions(+), 564 deletions(-) diff --git a/core/api/services/object/service.go b/core/api/services/object/service.go index c7b8a83d8..38bcdf20c 100644 --- a/core/api/services/object/service.go +++ b/core/api/services/object/service.go @@ -175,10 +175,11 @@ func (s *ObjectService) CreateObject(ctx context.Context, spaceId string, reques details := &types.Struct{ Fields: map[string]*types.Value{ - "name": pbtypes.String(request.Name), - "iconEmoji": pbtypes.String(request.Icon), - "description": pbtypes.String(request.Description), - "source": pbtypes.String(request.Source), + "name": pbtypes.String(request.Name), + "iconEmoji": pbtypes.String(request.Icon), + "description": pbtypes.String(request.Description), + "source": pbtypes.String(request.Source), + string(bundle.RelationKeyOrigin): pbtypes.Int64(int64(model.ObjectOrigin_api)), }, } diff --git a/docs/proto.md b/docs/proto.md index 6982fe2e2..e064340eb 100644 --- a/docs/proto.md +++ b/docs/proto.md @@ -30641,6 +30641,7 @@ Look https://github.com/golang/protobuf/issues/1135 for more information. | usecase | 6 | | | builtin | 7 | | | bookmark | 8 | | +| api | 9 | | diff --git a/pkg/lib/pb/model/models.pb.go b/pkg/lib/pb/model/models.pb.go index 8f9a8adce..17607ca49 100644 --- a/pkg/lib/pb/model/models.pb.go +++ b/pkg/lib/pb/model/models.pb.go @@ -200,6 +200,7 @@ const ( ObjectOrigin_usecase ObjectOrigin = 6 ObjectOrigin_builtin ObjectOrigin = 7 ObjectOrigin_bookmark ObjectOrigin = 8 + ObjectOrigin_api ObjectOrigin = 9 ) var ObjectOrigin_name = map[int32]string{ @@ -212,6 +213,7 @@ var ObjectOrigin_name = map[int32]string{ 6: "usecase", 7: "builtin", 8: "bookmark", + 9: "api", } var ObjectOrigin_value = map[string]int32{ @@ -224,6 +226,7 @@ var ObjectOrigin_value = map[string]int32{ "usecase": 6, "builtin": 7, "bookmark": 8, + "api": 9, } func (x ObjectOrigin) String() string { @@ -9507,566 +9510,566 @@ func init() { } var fileDescriptor_98a910b73321e591 = []byte{ - // 8929 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xcc, 0x7d, 0x5b, 0x70, 0x23, 0xc9, - 0x91, 0x18, 0xf1, 0x06, 0x12, 0x04, 0x59, 0xac, 0x79, 0x41, 0xd0, 0x68, 0x3c, 0x82, 0x56, 0xbb, - 0xa3, 0xd1, 0x8a, 0xb3, 0x3b, 0xbb, 0xab, 0x5d, 0xed, 0x69, 0x57, 0x02, 0x41, 0x70, 0x88, 0x1d, - 0x92, 0xa0, 0x1a, 0x98, 0x19, 0xed, 0xc6, 0x9d, 0xe9, 0x26, 0xba, 0x08, 0xb4, 0xd8, 0xe8, 0x86, - 0xba, 0x0b, 0x1c, 0x72, 0xc3, 0x76, 0x9c, 0x5f, 0x77, 0xbe, 0x3f, 0xdd, 0xd9, 0x67, 0xfb, 0x3e, - 0x1c, 0x27, 0xfd, 0x39, 0x7c, 0x0a, 0xbf, 0x22, 0x14, 0x7e, 0x84, 0x2f, 0xc2, 0xbe, 0x0f, 0xdb, - 0x11, 0xfe, 0x91, 0xed, 0x1f, 0xff, 0xd9, 0x21, 0x45, 0xf8, 0xc7, 0x61, 0x5f, 0x9c, 0xfd, 0x73, - 0xe1, 0xf0, 0x87, 0x23, 0xb3, 0xaa, 0x1f, 0x78, 0x90, 0x83, 0xd9, 0xbb, 0x73, 0xdc, 0x17, 0xbb, - 0xb2, 0x33, 0xb3, 0xb3, 0xaa, 0xb2, 0xb2, 0x32, 0xb3, 0xb2, 0x40, 0x78, 0x65, 0x7c, 0x3a, 0x78, - 0xe0, 0xd8, 0xc7, 0x0f, 0xc6, 0xc7, 0x0f, 0x46, 0x9e, 0x25, 0x9c, 0x07, 0x63, 0xdf, 0x93, 0x5e, - 0xa0, 0x1a, 0xc1, 0x26, 0xb5, 0x78, 0xc5, 0x74, 0x2f, 0xe4, 0xc5, 0x58, 0x6c, 0x12, 0xb4, 0x76, - 0x7b, 0xe0, 0x79, 0x03, 0x47, 0x28, 0xd4, 0xe3, 0xc9, 0xc9, 0x83, 0x40, 0xfa, 0x93, 0xbe, 0x54, - 0xc8, 0xf5, 0x9f, 0x66, 0xe1, 0x66, 0x77, 0x64, 0xfa, 0x72, 0xcb, 0xf1, 0xfa, 0xa7, 0x5d, 0xd7, - 0x1c, 0x07, 0x43, 0x4f, 0x6e, 0x99, 0x81, 0xe0, 0xaf, 0x43, 0xfe, 0x18, 0x81, 0x41, 0x35, 0x75, - 0x37, 0x73, 0xaf, 0xfc, 0xf0, 0xfa, 0xe6, 0x14, 0xe3, 0x4d, 0xa2, 0x30, 0x34, 0x0e, 0x7f, 0x13, - 0x0a, 0x96, 0x90, 0xa6, 0xed, 0x04, 0xd5, 0xf4, 0xdd, 0xd4, 0xbd, 0xf2, 0xc3, 0x5b, 0x9b, 0xea, - 0xc3, 0x9b, 0xe1, 0x87, 0x37, 0xbb, 0xf4, 0x61, 0x23, 0xc4, 0xe3, 0xef, 0x42, 0xf1, 0xc4, 0x76, - 0xc4, 0x63, 0x71, 0x11, 0x54, 0x33, 0x57, 0xd2, 0x6c, 0xa5, 0xab, 0x29, 0x23, 0x42, 0xe6, 0x4d, - 0x58, 0x13, 0xe7, 0xd2, 0x37, 0x0d, 0xe1, 0x98, 0xd2, 0xf6, 0xdc, 0xa0, 0x9a, 0x25, 0x09, 0x6f, - 0xcd, 0x48, 0x18, 0xbe, 0x27, 0xf2, 0x19, 0x12, 0x7e, 0x17, 0xca, 0xde, 0xf1, 0xf7, 0x44, 0x5f, - 0xf6, 0x2e, 0xc6, 0x22, 0xa8, 0xe6, 0xee, 0x66, 0xee, 0x95, 0x8c, 0x24, 0x88, 0x7f, 0x03, 0xca, - 0x7d, 0xcf, 0x71, 0x44, 0x5f, 0x7d, 0x23, 0x7f, 0x75, 0xb7, 0x92, 0xb8, 0xfc, 0x6d, 0xb8, 0xe1, - 0x8b, 0x91, 0x77, 0x26, 0xac, 0x66, 0x04, 0xa5, 0x7e, 0x16, 0xe9, 0x33, 0x8b, 0x5f, 0xf2, 0x06, - 0x54, 0x7c, 0x2d, 0xdf, 0x9e, 0xed, 0x9e, 0x06, 0xd5, 0x02, 0x75, 0xeb, 0xf3, 0x97, 0x74, 0x0b, - 0x71, 0x8c, 0x69, 0x0a, 0xce, 0x20, 0x73, 0x2a, 0x2e, 0xaa, 0xa5, 0xbb, 0xa9, 0x7b, 0x25, 0x03, - 0x1f, 0xf9, 0xfb, 0x50, 0xf5, 0x7c, 0x7b, 0x60, 0xbb, 0xa6, 0xd3, 0xf4, 0x85, 0x29, 0x85, 0xd5, - 0xb3, 0x47, 0x22, 0x90, 0xe6, 0x68, 0x5c, 0x85, 0xbb, 0xa9, 0x7b, 0x19, 0xe3, 0xd2, 0xf7, 0xfc, - 0x2d, 0x35, 0x43, 0x6d, 0xf7, 0xc4, 0xab, 0x96, 0x75, 0xf7, 0xa7, 0x65, 0xd9, 0xd1, 0xaf, 0x8d, - 0x08, 0xb1, 0xfe, 0x87, 0x69, 0xc8, 0x77, 0x85, 0xe9, 0xf7, 0x87, 0xb5, 0x5f, 0x4d, 0x41, 0xde, - 0x10, 0xc1, 0xc4, 0x91, 0xbc, 0x06, 0x45, 0x35, 0xb6, 0x6d, 0xab, 0x9a, 0x22, 0xe9, 0xa2, 0xf6, - 0x67, 0xd1, 0x9d, 0x4d, 0xc8, 0x8e, 0x84, 0x34, 0xab, 0x19, 0x1a, 0xa1, 0xda, 0x8c, 0x54, 0xea, - 0xf3, 0x9b, 0xfb, 0x42, 0x9a, 0x06, 0xe1, 0xd5, 0x7e, 0x9e, 0x82, 0x2c, 0x36, 0xf9, 0x6d, 0x28, - 0x0d, 0xed, 0xc1, 0xd0, 0xb1, 0x07, 0x43, 0xa9, 0x05, 0x89, 0x01, 0xfc, 0x43, 0x58, 0x8f, 0x1a, - 0x86, 0xe9, 0x0e, 0x04, 0x4a, 0xb4, 0x48, 0xf9, 0xe9, 0xa5, 0x31, 0x8b, 0xcc, 0xab, 0x50, 0xa0, - 0xf5, 0xd0, 0xb6, 0x48, 0xa3, 0x4b, 0x46, 0xd8, 0x44, 0x75, 0x0b, 0x67, 0xea, 0xb1, 0xb8, 0xa8, - 0x66, 0xe9, 0x6d, 0x12, 0xc4, 0x1b, 0xb0, 0x1e, 0x36, 0xb7, 0xf5, 0x68, 0xe4, 0xae, 0x1e, 0x8d, - 0x59, 0xfc, 0xfa, 0x3f, 0xda, 0x83, 0x1c, 0x2d, 0x4b, 0xbe, 0x06, 0x69, 0x3b, 0x1c, 0xe8, 0xb4, - 0x6d, 0xf1, 0x07, 0x90, 0x3f, 0xb1, 0x85, 0x63, 0xbd, 0x70, 0x84, 0x35, 0x1a, 0x6f, 0xc1, 0xaa, - 0x2f, 0x02, 0xe9, 0xdb, 0x5a, 0xfb, 0xd5, 0x02, 0xfd, 0xe2, 0x22, 0x1b, 0xb0, 0x69, 0x24, 0x10, - 0x8d, 0x29, 0x32, 0xec, 0x76, 0x7f, 0x68, 0x3b, 0x96, 0x2f, 0xdc, 0xb6, 0xa5, 0xd6, 0x69, 0xc9, - 0x48, 0x82, 0xf8, 0x3d, 0x58, 0x3f, 0x36, 0xfb, 0xa7, 0x03, 0xdf, 0x9b, 0xb8, 0xb8, 0x20, 0x3c, - 0x9f, 0xba, 0x5d, 0x32, 0x66, 0xc1, 0xfc, 0x0d, 0xc8, 0x99, 0x8e, 0x3d, 0x70, 0x69, 0x25, 0xae, - 0xcd, 0x4d, 0xba, 0x92, 0xa5, 0x81, 0x18, 0x86, 0x42, 0xe4, 0xbb, 0x50, 0x39, 0x13, 0xbe, 0xb4, - 0xfb, 0xa6, 0x43, 0xf0, 0x6a, 0x81, 0x28, 0xeb, 0x0b, 0x29, 0x9f, 0x26, 0x31, 0x8d, 0x69, 0x42, - 0xde, 0x06, 0x08, 0xd0, 0x4c, 0xd2, 0x74, 0xea, 0xb5, 0xf0, 0xda, 0x42, 0x36, 0x4d, 0xcf, 0x95, - 0xc2, 0x95, 0x9b, 0xdd, 0x08, 0x7d, 0x77, 0xc5, 0x48, 0x10, 0xf3, 0x77, 0x21, 0x2b, 0xc5, 0xb9, - 0xac, 0xae, 0x5d, 0x31, 0xa2, 0x21, 0x93, 0x9e, 0x38, 0x97, 0xbb, 0x2b, 0x06, 0x11, 0x20, 0x21, - 0x2e, 0xb2, 0xea, 0xfa, 0x12, 0x84, 0xb8, 0x2e, 0x91, 0x10, 0x09, 0xf8, 0x07, 0x90, 0x77, 0xcc, - 0x0b, 0x6f, 0x22, 0xab, 0x8c, 0x48, 0xbf, 0x74, 0x25, 0xe9, 0x1e, 0xa1, 0xee, 0xae, 0x18, 0x9a, - 0x88, 0xbf, 0x0d, 0x19, 0xcb, 0x3e, 0xab, 0x6e, 0x10, 0xed, 0xdd, 0x2b, 0x69, 0xb7, 0xed, 0xb3, - 0xdd, 0x15, 0x03, 0xd1, 0x79, 0x13, 0x8a, 0xc7, 0x9e, 0x77, 0x3a, 0x32, 0xfd, 0xd3, 0x2a, 0x27, - 0xd2, 0x2f, 0x5f, 0x49, 0xba, 0xa5, 0x91, 0x77, 0x57, 0x8c, 0x88, 0x10, 0xbb, 0x6c, 0xf7, 0x3d, - 0xb7, 0x7a, 0x6d, 0x89, 0x2e, 0xb7, 0xfb, 0x9e, 0x8b, 0x5d, 0x46, 0x02, 0x24, 0x74, 0x6c, 0xf7, - 0xb4, 0x7a, 0x7d, 0x09, 0x42, 0xb4, 0x9c, 0x48, 0x88, 0x04, 0x28, 0xb6, 0x65, 0x4a, 0xf3, 0xcc, - 0x16, 0xcf, 0xab, 0x37, 0x96, 0x10, 0x7b, 0x5b, 0x23, 0xa3, 0xd8, 0x21, 0x21, 0x32, 0x09, 0x97, - 0x66, 0xf5, 0xe6, 0x12, 0x4c, 0x42, 0x8b, 0x8e, 0x4c, 0x42, 0x42, 0xfe, 0x67, 0x61, 0xe3, 0x44, - 0x98, 0x72, 0xe2, 0x0b, 0x2b, 0xde, 0xe8, 0x6e, 0x11, 0xb7, 0xcd, 0xab, 0xe7, 0x7e, 0x96, 0x6a, - 0x77, 0xc5, 0x98, 0x67, 0xc5, 0xdf, 0x87, 0x9c, 0x63, 0x4a, 0x71, 0x5e, 0xad, 0x12, 0xcf, 0xfa, - 0x0b, 0x94, 0x42, 0x8a, 0xf3, 0xdd, 0x15, 0x43, 0x91, 0xf0, 0xef, 0xc2, 0xba, 0x34, 0x8f, 0x1d, - 0xd1, 0x39, 0xd1, 0x08, 0x41, 0xf5, 0x73, 0xc4, 0xe5, 0xf5, 0xab, 0xd5, 0x79, 0x9a, 0x66, 0x77, - 0xc5, 0x98, 0x65, 0x83, 0x52, 0x11, 0xa8, 0x5a, 0x5b, 0x42, 0x2a, 0xe2, 0x87, 0x52, 0x11, 0x09, - 0xdf, 0x83, 0x32, 0x3d, 0x34, 0x3d, 0x67, 0x32, 0x72, 0xab, 0x9f, 0x27, 0x0e, 0xf7, 0x5e, 0xcc, - 0x41, 0xe1, 0xef, 0xae, 0x18, 0x49, 0x72, 0x9c, 0x44, 0x6a, 0x1a, 0xde, 0xf3, 0xea, 0xed, 0x25, - 0x26, 0xb1, 0xa7, 0x91, 0x71, 0x12, 0x43, 0x42, 0x5c, 0x7a, 0xcf, 0x6d, 0x6b, 0x20, 0x64, 0xf5, - 0x0b, 0x4b, 0x2c, 0xbd, 0x67, 0x84, 0x8a, 0x4b, 0x4f, 0x11, 0xa1, 0x1a, 0xf7, 0x87, 0xa6, 0xac, - 0xde, 0x59, 0x42, 0x8d, 0x9b, 0x43, 0x93, 0x6c, 0x05, 0x12, 0xd4, 0x3e, 0x85, 0xd5, 0xa4, 0x55, - 0xe6, 0x1c, 0xb2, 0xbe, 0x30, 0xd5, 0x8e, 0x50, 0x34, 0xe8, 0x19, 0x61, 0xc2, 0xb2, 0x25, 0xed, - 0x08, 0x45, 0x83, 0x9e, 0xf9, 0x4d, 0xc8, 0x2b, 0xdf, 0x84, 0x0c, 0x7e, 0xd1, 0xd0, 0x2d, 0xc4, - 0xb5, 0x7c, 0x73, 0x40, 0xfb, 0x56, 0xd1, 0xa0, 0x67, 0xc4, 0xb5, 0x7c, 0x6f, 0xdc, 0x71, 0xc9, - 0x60, 0x17, 0x0d, 0xdd, 0xaa, 0xfd, 0x8d, 0x0f, 0xa0, 0xa0, 0x85, 0xaa, 0xfd, 0xdd, 0x14, 0xe4, - 0x95, 0x41, 0xe1, 0xdf, 0x82, 0x5c, 0x20, 0x2f, 0x1c, 0x41, 0x32, 0xac, 0x3d, 0xfc, 0xca, 0x12, - 0x46, 0x68, 0xb3, 0x8b, 0x04, 0x86, 0xa2, 0xab, 0x1b, 0x90, 0xa3, 0x36, 0x2f, 0x40, 0xc6, 0xf0, - 0x9e, 0xb3, 0x15, 0x0e, 0x90, 0x57, 0x93, 0xc5, 0x52, 0x08, 0xdc, 0xb6, 0xcf, 0x58, 0x1a, 0x81, - 0xbb, 0xc2, 0xb4, 0x84, 0xcf, 0x32, 0xbc, 0x02, 0xa5, 0x70, 0x5a, 0x02, 0x96, 0xe5, 0x0c, 0x56, - 0x13, 0x13, 0x1e, 0xb0, 0x5c, 0xed, 0x7f, 0x65, 0x21, 0x8b, 0xeb, 0x9f, 0xbf, 0x02, 0x15, 0x69, - 0xfa, 0x03, 0xa1, 0x1c, 0xe1, 0xc8, 0x49, 0x99, 0x06, 0xf2, 0x0f, 0xc2, 0x3e, 0xa4, 0xa9, 0x0f, - 0xaf, 0xbd, 0xd0, 0xae, 0x4c, 0xf5, 0x20, 0xb1, 0x0b, 0x67, 0x96, 0xdb, 0x85, 0x77, 0xa0, 0x88, - 0xe6, 0xac, 0x6b, 0x7f, 0x2a, 0x68, 0xe8, 0xd7, 0x1e, 0xde, 0x7f, 0xf1, 0x27, 0xdb, 0x9a, 0xc2, - 0x88, 0x68, 0x79, 0x1b, 0x4a, 0x7d, 0xd3, 0xb7, 0x48, 0x18, 0x9a, 0xad, 0xb5, 0x87, 0x5f, 0x7d, - 0x31, 0xa3, 0x66, 0x48, 0x62, 0xc4, 0xd4, 0xbc, 0x03, 0x65, 0x4b, 0x04, 0x7d, 0xdf, 0x1e, 0x93, - 0x79, 0x53, 0x7b, 0xf1, 0xd7, 0x5e, 0xcc, 0x6c, 0x3b, 0x26, 0x32, 0x92, 0x1c, 0xd0, 0x23, 0xf3, - 0x23, 0xfb, 0x56, 0x20, 0x07, 0x21, 0x06, 0xd4, 0xdf, 0x85, 0x62, 0xd8, 0x1f, 0xbe, 0x0a, 0x45, - 0xfc, 0x7b, 0xe0, 0xb9, 0x82, 0xad, 0xe0, 0xdc, 0x62, 0xab, 0x3b, 0x32, 0x1d, 0x87, 0xa5, 0xf8, - 0x1a, 0x00, 0x36, 0xf7, 0x85, 0x65, 0x4f, 0x46, 0x2c, 0x5d, 0xff, 0x85, 0x50, 0x5b, 0x8a, 0x90, - 0x3d, 0x34, 0x07, 0x48, 0xb1, 0x0a, 0xc5, 0xd0, 0x5c, 0xb3, 0x14, 0xd2, 0x6f, 0x9b, 0xc1, 0xf0, - 0xd8, 0x33, 0x7d, 0x8b, 0xa5, 0x79, 0x19, 0x0a, 0x0d, 0xbf, 0x3f, 0xb4, 0xcf, 0x04, 0xcb, 0xd4, - 0x1f, 0x40, 0x39, 0x21, 0x2f, 0xb2, 0xd0, 0x1f, 0x2d, 0x41, 0xae, 0x61, 0x59, 0xc2, 0x62, 0x29, - 0x24, 0xd0, 0x1d, 0x64, 0xe9, 0xfa, 0x57, 0xa1, 0x14, 0x8d, 0x16, 0xa2, 0xe3, 0xc6, 0xcd, 0x56, - 0xf0, 0x09, 0xc1, 0x2c, 0x85, 0x5a, 0xd9, 0x76, 0x1d, 0xdb, 0x15, 0x2c, 0x5d, 0xfb, 0x73, 0xa4, - 0xaa, 0xfc, 0x9b, 0xd3, 0x0b, 0xe2, 0xd5, 0x17, 0xed, 0xac, 0xd3, 0xab, 0xe1, 0xf3, 0x89, 0xfe, - 0xed, 0xd9, 0x24, 0x5c, 0x11, 0xb2, 0xdb, 0x9e, 0x0c, 0x58, 0xaa, 0xf6, 0xdf, 0xd3, 0x50, 0x0c, - 0x37, 0x54, 0x8c, 0x09, 0x26, 0xbe, 0xa3, 0x15, 0x1a, 0x1f, 0xf9, 0x75, 0xc8, 0x49, 0x5b, 0x6a, - 0x35, 0x2e, 0x19, 0xaa, 0x81, 0xbe, 0x5a, 0x72, 0x66, 0x95, 0x03, 0x3b, 0x3b, 0x55, 0xf6, 0xc8, - 0x1c, 0x88, 0x5d, 0x33, 0x18, 0x6a, 0x17, 0x36, 0x06, 0x20, 0xfd, 0x89, 0x79, 0x86, 0x3a, 0x47, - 0xef, 0x95, 0x17, 0x97, 0x04, 0xf1, 0xb7, 0x20, 0x8b, 0x1d, 0xd4, 0x4a, 0xf3, 0x67, 0x66, 0x3a, - 0x8c, 0x6a, 0x72, 0xe8, 0x0b, 0x9c, 0x9e, 0x4d, 0x8c, 0xc0, 0x0c, 0x42, 0xe6, 0xaf, 0xc2, 0x9a, - 0x5a, 0x84, 0x9d, 0x30, 0x7e, 0x28, 0x10, 0xe7, 0x19, 0x28, 0x6f, 0xe0, 0x70, 0x9a, 0x52, 0x54, - 0x8b, 0x4b, 0xe8, 0x77, 0x38, 0x38, 0x9b, 0x5d, 0x24, 0x31, 0x14, 0x65, 0xfd, 0x1d, 0x1c, 0x53, - 0x53, 0x0a, 0x9c, 0xe6, 0xd6, 0x68, 0x2c, 0x2f, 0x94, 0xd2, 0xec, 0x08, 0xd9, 0x1f, 0xda, 0xee, - 0x80, 0xa5, 0xd4, 0x10, 0xe3, 0x24, 0x12, 0x8a, 0xef, 0x7b, 0x3e, 0xcb, 0xd4, 0x6a, 0x90, 0x45, - 0x1d, 0x45, 0x23, 0xe9, 0x9a, 0x23, 0xa1, 0x47, 0x9a, 0x9e, 0x6b, 0xd7, 0x60, 0x63, 0x6e, 0x3f, - 0xae, 0xfd, 0xf3, 0xbc, 0xd2, 0x10, 0xa4, 0x20, 0x5f, 0x50, 0x53, 0x90, 0x9b, 0xf7, 0x52, 0x36, - 0x06, 0xb9, 0x4c, 0xdb, 0x98, 0x0f, 0x20, 0x87, 0x1d, 0x0b, 0x4d, 0xcc, 0x12, 0xe4, 0xfb, 0x88, - 0x6e, 0x28, 0x2a, 0x8c, 0x60, 0xfa, 0x43, 0xd1, 0x3f, 0x15, 0x96, 0xb6, 0xf5, 0x61, 0x13, 0x95, - 0xa6, 0x9f, 0x70, 0xcf, 0x55, 0x83, 0x54, 0xa2, 0xef, 0xb9, 0xad, 0x91, 0xf7, 0x3d, 0x9b, 0xe6, - 0x15, 0x55, 0x22, 0x04, 0x84, 0x6f, 0xdb, 0xa8, 0x23, 0x7a, 0xda, 0x62, 0x40, 0xad, 0x05, 0x39, - 0xfa, 0x36, 0xae, 0x04, 0x25, 0xb3, 0xca, 0x34, 0xbc, 0xba, 0x9c, 0xcc, 0x5a, 0xe4, 0xda, 0x8f, - 0xd3, 0x90, 0xc5, 0x36, 0xbf, 0x0f, 0x39, 0x1f, 0xe3, 0x30, 0x1a, 0xce, 0xcb, 0x62, 0x36, 0x85, - 0xc2, 0xbf, 0xa5, 0x55, 0x31, 0xbd, 0x84, 0xb2, 0x44, 0x5f, 0x4c, 0xaa, 0xe5, 0x75, 0xc8, 0x8d, - 0x4d, 0xdf, 0x1c, 0xe9, 0x75, 0xa2, 0x1a, 0xf5, 0x1f, 0xa6, 0x20, 0x8b, 0x48, 0x7c, 0x03, 0x2a, - 0x5d, 0xe9, 0xdb, 0xa7, 0x42, 0x0e, 0x7d, 0x6f, 0x32, 0x18, 0x2a, 0x4d, 0x7a, 0x2c, 0x2e, 0x94, - 0xbd, 0x51, 0x06, 0x41, 0x9a, 0x8e, 0xdd, 0x67, 0x69, 0xd4, 0xaa, 0x2d, 0xcf, 0xb1, 0x58, 0x86, - 0xaf, 0x43, 0xf9, 0x89, 0x6b, 0x09, 0x3f, 0xe8, 0x7b, 0xbe, 0xb0, 0x58, 0x56, 0xaf, 0xee, 0x53, - 0x96, 0xa3, 0xbd, 0x4c, 0x9c, 0x4b, 0x8a, 0x85, 0x58, 0x9e, 0x5f, 0x83, 0xf5, 0xad, 0xe9, 0x00, - 0x89, 0x15, 0xd0, 0x26, 0xed, 0x0b, 0x17, 0x95, 0x8c, 0x15, 0x95, 0x12, 0x7b, 0xdf, 0xb3, 0x59, - 0x09, 0x3f, 0xa6, 0xd6, 0x09, 0x83, 0xfa, 0xbf, 0x4c, 0x85, 0x96, 0xa3, 0x02, 0xa5, 0x43, 0xd3, - 0x37, 0x07, 0xbe, 0x39, 0x46, 0xf9, 0xca, 0x50, 0x50, 0x1b, 0xe7, 0x9b, 0xca, 0xba, 0xa9, 0xc6, - 0x43, 0x65, 0x1b, 0x55, 0xe3, 0x2d, 0x96, 0x89, 0x1b, 0x6f, 0xb3, 0x2c, 0x7e, 0xe3, 0x3b, 0x13, - 0x4f, 0x0a, 0x96, 0x23, 0x5b, 0xe7, 0x59, 0x82, 0xe5, 0x11, 0xd8, 0x43, 0x8b, 0xc2, 0x0a, 0xd8, - 0xe7, 0x26, 0xea, 0xcf, 0xb1, 0x77, 0xce, 0x8a, 0x28, 0x06, 0x0e, 0xa3, 0xb0, 0x58, 0x09, 0xdf, - 0x1c, 0x4c, 0x46, 0xc7, 0x02, 0xbb, 0x09, 0xf8, 0xa6, 0xe7, 0x0d, 0x06, 0x8e, 0x60, 0x65, 0x1c, - 0x83, 0x84, 0xf1, 0x65, 0xab, 0x64, 0x69, 0x4d, 0xc7, 0xf1, 0x26, 0x92, 0x55, 0x6a, 0x7f, 0x98, - 0x81, 0x2c, 0x46, 0x37, 0xb8, 0x76, 0x86, 0x68, 0x67, 0xf4, 0xda, 0xc1, 0xe7, 0x68, 0x05, 0xa6, - 0xe3, 0x15, 0xc8, 0xdf, 0xd7, 0x33, 0x9d, 0x59, 0xc2, 0xca, 0x22, 0xe3, 0xe4, 0x24, 0x73, 0xc8, - 0x8e, 0xec, 0x91, 0xd0, 0xb6, 0x8e, 0x9e, 0x11, 0x16, 0xe0, 0x7e, 0x9c, 0xa3, 0xe4, 0x09, 0x3d, - 0xe3, 0xaa, 0x31, 0x71, 0x5b, 0x68, 0x48, 0x5a, 0x03, 0x19, 0x23, 0x6c, 0x2e, 0xb0, 0x5e, 0xa5, - 0x85, 0xd6, 0xeb, 0x83, 0xd0, 0x7a, 0x15, 0x96, 0x58, 0xf5, 0x24, 0x66, 0xd2, 0x72, 0xc5, 0x46, - 0xa3, 0xb8, 0x3c, 0x79, 0x62, 0x33, 0xd9, 0xd6, 0x5a, 0x1b, 0x6f, 0x74, 0x45, 0x35, 0xca, 0x2c, - 0x85, 0xb3, 0x49, 0xcb, 0x55, 0xd9, 0xbc, 0xa7, 0xb6, 0x25, 0x3c, 0x96, 0xa1, 0x8d, 0x70, 0x62, - 0xd9, 0x1e, 0xcb, 0xa2, 0xe7, 0x75, 0xb8, 0xbd, 0xc3, 0x72, 0xf5, 0x57, 0x13, 0x5b, 0x52, 0x63, - 0x22, 0x3d, 0xc5, 0x86, 0xd4, 0x37, 0xa5, 0xb4, 0xf1, 0x58, 0x58, 0x2c, 0x5d, 0xff, 0xfa, 0x02, - 0x33, 0x5b, 0x81, 0xd2, 0x93, 0xb1, 0xe3, 0x99, 0xd6, 0x15, 0x76, 0x76, 0x15, 0x20, 0x8e, 0xaa, - 0x6b, 0xff, 0xa6, 0x1e, 0x6f, 0xe7, 0xe8, 0x8b, 0x06, 0xde, 0xc4, 0xef, 0x0b, 0x32, 0x21, 0x25, - 0x43, 0xb7, 0xf8, 0xb7, 0x21, 0x87, 0xef, 0xc3, 0x34, 0xce, 0xfd, 0xa5, 0x62, 0xb9, 0xcd, 0xa7, - 0xb6, 0x78, 0x6e, 0x28, 0x42, 0x7e, 0x07, 0xc0, 0xec, 0x4b, 0xfb, 0x4c, 0x20, 0x50, 0x2f, 0xf6, - 0x04, 0x84, 0xbf, 0x93, 0x74, 0x5f, 0xae, 0xce, 0x43, 0x26, 0xfc, 0x1a, 0x6e, 0x40, 0x19, 0x97, - 0xee, 0xb8, 0xe3, 0xe3, 0x6a, 0xaf, 0xae, 0x12, 0xe1, 0x1b, 0xcb, 0x89, 0xf7, 0x28, 0x22, 0x34, - 0x92, 0x4c, 0xf8, 0x13, 0x58, 0x55, 0x39, 0x35, 0xcd, 0xb4, 0x42, 0x4c, 0xdf, 0x5c, 0x8e, 0x69, - 0x27, 0xa6, 0x34, 0xa6, 0xd8, 0xcc, 0xa7, 0x25, 0x73, 0x2f, 0x9d, 0x96, 0x7c, 0x15, 0xd6, 0x7a, - 0xd3, 0xab, 0x40, 0x6d, 0x15, 0x33, 0x50, 0x5e, 0x87, 0x55, 0x3b, 0x88, 0xb3, 0xa2, 0x94, 0x23, - 0x29, 0x1a, 0x53, 0xb0, 0xda, 0x7f, 0xc8, 0x43, 0x96, 0x46, 0x7e, 0x36, 0xc7, 0xd5, 0x9c, 0x32, - 0xe9, 0x0f, 0x96, 0x9f, 0xea, 0x99, 0x15, 0x4f, 0x16, 0x24, 0x93, 0xb0, 0x20, 0xdf, 0x86, 0x5c, - 0xe0, 0xf9, 0x32, 0x9c, 0xde, 0x25, 0x95, 0xa8, 0xeb, 0xf9, 0xd2, 0x50, 0x84, 0x7c, 0x07, 0x0a, - 0x27, 0xb6, 0x23, 0x71, 0x52, 0xd4, 0xe0, 0xbd, 0xbe, 0x1c, 0x8f, 0x1d, 0x22, 0x32, 0x42, 0x62, - 0xbe, 0x97, 0x54, 0xb6, 0x3c, 0x71, 0xda, 0x5c, 0x8e, 0xd3, 0x22, 0x1d, 0xbc, 0x0f, 0xac, 0xef, - 0x9d, 0x09, 0xdf, 0x48, 0x24, 0x26, 0xd5, 0x26, 0x3d, 0x07, 0xe7, 0x35, 0x28, 0x0e, 0x6d, 0x4b, - 0xa0, 0x9f, 0x43, 0x36, 0xa6, 0x68, 0x44, 0x6d, 0xfe, 0x18, 0x8a, 0x14, 0x1f, 0xa0, 0x55, 0x2c, - 0xbd, 0xf4, 0xe0, 0xab, 0x50, 0x25, 0x64, 0x80, 0x1f, 0xa2, 0x8f, 0xef, 0xd8, 0x92, 0xf2, 0xd3, - 0x45, 0x23, 0x6a, 0xa3, 0xc0, 0xa4, 0xef, 0x49, 0x81, 0xcb, 0x4a, 0xe0, 0x59, 0x38, 0x7f, 0x1b, - 0x6e, 0x10, 0x6c, 0x66, 0x93, 0xc4, 0xa5, 0x86, 0x4c, 0x17, 0xbf, 0x44, 0x87, 0x65, 0x6c, 0x0e, - 0xc4, 0x9e, 0x3d, 0xb2, 0x65, 0xb5, 0x72, 0x37, 0x75, 0x2f, 0x67, 0xc4, 0x00, 0xfe, 0x3a, 0x6c, - 0x58, 0xe2, 0xc4, 0x9c, 0x38, 0xb2, 0x27, 0x46, 0x63, 0xc7, 0x94, 0xa2, 0x6d, 0x91, 0x8e, 0x96, - 0x8c, 0xf9, 0x17, 0xfc, 0x0d, 0xb8, 0xa6, 0x81, 0x9d, 0xe8, 0x54, 0xa1, 0x6d, 0x51, 0xfa, 0xae, - 0x64, 0x2c, 0x7a, 0x55, 0xdf, 0xd7, 0x66, 0x18, 0x37, 0x50, 0x8c, 0x53, 0x43, 0x03, 0x1a, 0x48, - 0xb5, 0x23, 0x3f, 0x32, 0x1d, 0x47, 0xf8, 0x17, 0x2a, 0xc8, 0x7d, 0x6c, 0xba, 0xc7, 0xa6, 0xcb, - 0x32, 0xb4, 0xc7, 0x9a, 0x8e, 0x70, 0x2d, 0xd3, 0x57, 0x3b, 0xf2, 0x23, 0xda, 0xd0, 0x73, 0xf5, - 0x7b, 0x90, 0xa5, 0x21, 0x2d, 0x41, 0x4e, 0x45, 0x49, 0x14, 0x31, 0xeb, 0x08, 0x89, 0x2c, 0xf2, - 0x1e, 0x2e, 0x3f, 0x96, 0xae, 0xfd, 0xef, 0x1c, 0x14, 0xc3, 0xc1, 0x0b, 0xcf, 0x10, 0x52, 0xf1, - 0x19, 0x02, 0xba, 0x71, 0xc1, 0x53, 0x3b, 0xb0, 0x8f, 0xb5, 0x5b, 0x5a, 0x34, 0x62, 0x00, 0x7a, - 0x42, 0xcf, 0x6d, 0x4b, 0x0e, 0x69, 0xcd, 0xe4, 0x0c, 0xd5, 0xe0, 0xf7, 0x60, 0xdd, 0xc2, 0x71, - 0x70, 0xfb, 0xce, 0xc4, 0x12, 0x3d, 0xdc, 0x45, 0x55, 0x9a, 0x60, 0x16, 0xcc, 0x3f, 0x06, 0x90, - 0xf6, 0x48, 0xec, 0x78, 0xfe, 0xc8, 0x94, 0x3a, 0x36, 0xf8, 0xc6, 0xcb, 0x69, 0xf5, 0x66, 0x2f, - 0x62, 0x60, 0x24, 0x98, 0x21, 0x6b, 0xfc, 0x9a, 0x66, 0x5d, 0xf8, 0x4c, 0xac, 0xb7, 0x23, 0x06, - 0x46, 0x82, 0x19, 0xef, 0x41, 0xe1, 0xc4, 0xf3, 0x47, 0x13, 0xc7, 0xd4, 0x7b, 0xee, 0xfb, 0x2f, - 0xc9, 0x77, 0x47, 0x51, 0x93, 0xed, 0x09, 0x59, 0xd5, 0x7f, 0x11, 0x20, 0xfe, 0x1e, 0xbf, 0x09, - 0x7c, 0xdf, 0x73, 0xe5, 0xb0, 0x71, 0x7c, 0xec, 0x6f, 0x89, 0x13, 0xcf, 0x17, 0xdb, 0x26, 0x6e, - 0x96, 0x37, 0x60, 0x23, 0x82, 0x37, 0x4e, 0xa4, 0xf0, 0x11, 0x4c, 0x13, 0xda, 0x1d, 0x7a, 0xbe, - 0x54, 0x1e, 0x1b, 0x3d, 0x3e, 0xe9, 0xb2, 0x0c, 0x6e, 0xd0, 0xed, 0x6e, 0x87, 0x65, 0xeb, 0xf7, - 0x00, 0xe2, 0x81, 0xa2, 0xc8, 0x86, 0x9e, 0xde, 0x7c, 0xa8, 0xe3, 0x1c, 0x6a, 0x3d, 0x7c, 0x9b, - 0xa5, 0xea, 0x3f, 0x4b, 0x41, 0x39, 0x21, 0xe0, 0x74, 0x04, 0xdc, 0xf4, 0x26, 0xae, 0x54, 0x21, - 0x37, 0x3d, 0x3e, 0x35, 0x9d, 0x09, 0x6e, 0xd5, 0x1b, 0x50, 0xa1, 0xf6, 0xb6, 0x1d, 0x48, 0xdb, - 0xed, 0x4b, 0x96, 0x89, 0x50, 0xd4, 0x36, 0x9f, 0x8d, 0x50, 0x0e, 0x3c, 0x0d, 0xca, 0x71, 0x06, - 0xab, 0x87, 0xc2, 0xef, 0x8b, 0x10, 0x89, 0x5c, 0x5b, 0x0d, 0x89, 0xd0, 0x94, 0x6b, 0x6b, 0xca, - 0x61, 0x77, 0x32, 0x62, 0x45, 0x74, 0x11, 0xb1, 0xd1, 0x38, 0x13, 0x3e, 0x7a, 0x26, 0x25, 0xfc, - 0x0e, 0x02, 0x50, 0xb7, 0x4d, 0x97, 0x41, 0x88, 0xbd, 0x6f, 0xbb, 0xac, 0x1c, 0x35, 0xcc, 0x73, - 0xb6, 0x8a, 0xf2, 0x53, 0x20, 0xc0, 0x2a, 0xb5, 0xff, 0x96, 0x81, 0x2c, 0x5a, 0x69, 0x8c, 0x5c, - 0x93, 0x26, 0x45, 0x69, 0x7e, 0x12, 0xf4, 0xd9, 0xf6, 0x16, 0xe4, 0x9d, 0xdc, 0x5b, 0xde, 0x83, - 0x72, 0x7f, 0x12, 0x48, 0x6f, 0x44, 0x1b, 0xab, 0x3e, 0xbb, 0xba, 0x39, 0x97, 0x03, 0xa2, 0xe1, - 0x34, 0x92, 0xa8, 0xfc, 0x1d, 0xc8, 0x9f, 0x28, 0x1d, 0x56, 0x59, 0xa0, 0x2f, 0x5c, 0xb2, 0xf7, - 0x6a, 0x3d, 0xd5, 0xc8, 0xd8, 0x2f, 0x7b, 0x6e, 0xfd, 0x25, 0x41, 0x7a, 0x0f, 0xcd, 0x47, 0x7b, - 0xe8, 0x2f, 0xc2, 0x9a, 0xc0, 0x01, 0x3f, 0x74, 0xcc, 0xbe, 0x18, 0x09, 0x37, 0x5c, 0x34, 0x6f, - 0xbf, 0x44, 0x8f, 0x69, 0xc6, 0xa8, 0xdb, 0x33, 0xbc, 0xd0, 0x8e, 0xb8, 0x1e, 0x6e, 0xe5, 0x61, - 0x98, 0x5e, 0x34, 0x62, 0x40, 0xfd, 0xcb, 0xda, 0xfa, 0x15, 0x20, 0xd3, 0x08, 0xfa, 0x3a, 0x9f, - 0x21, 0x82, 0xbe, 0x0a, 0x96, 0x9a, 0x34, 0x1c, 0x2c, 0x5d, 0x7f, 0x13, 0x4a, 0xd1, 0x17, 0x50, - 0x79, 0x0e, 0x3c, 0xd9, 0x1d, 0x8b, 0xbe, 0x7d, 0x62, 0x0b, 0x4b, 0xe9, 0x67, 0x57, 0x9a, 0xbe, - 0x54, 0x29, 0xc1, 0x96, 0x6b, 0xb1, 0x74, 0xed, 0x77, 0x8a, 0x90, 0x57, 0x5b, 0xa9, 0xee, 0x70, - 0x29, 0xea, 0xf0, 0x77, 0xa0, 0xe8, 0x8d, 0x85, 0x6f, 0x4a, 0xcf, 0xd7, 0x79, 0x98, 0x77, 0x5e, - 0x66, 0x6b, 0xde, 0xec, 0x68, 0x62, 0x23, 0x62, 0x33, 0xab, 0x4d, 0xe9, 0x79, 0x6d, 0xba, 0x0f, - 0x2c, 0xdc, 0x85, 0x0f, 0x7d, 0xa4, 0x93, 0x17, 0x3a, 0xaa, 0x9e, 0x83, 0xf3, 0x1e, 0x94, 0xfa, - 0x9e, 0x6b, 0xd9, 0x51, 0x4e, 0x66, 0xed, 0xe1, 0xd7, 0x5f, 0x4a, 0xc2, 0x66, 0x48, 0x6d, 0xc4, - 0x8c, 0xf8, 0xeb, 0x90, 0x3b, 0x43, 0x35, 0x23, 0x7d, 0xba, 0x5c, 0x09, 0x15, 0x12, 0xff, 0x04, - 0xca, 0xdf, 0x9f, 0xd8, 0xfd, 0xd3, 0x4e, 0x32, 0xe7, 0xf7, 0xde, 0x4b, 0x49, 0xf1, 0x9d, 0x98, - 0xde, 0x48, 0x32, 0x4b, 0xa8, 0x76, 0xe1, 0x8f, 0xa0, 0xda, 0xc5, 0x79, 0xd5, 0x36, 0xa0, 0xe2, - 0x8a, 0x40, 0x0a, 0x6b, 0x47, 0x7b, 0x5e, 0xf0, 0x19, 0x3c, 0xaf, 0x69, 0x16, 0xf5, 0x2f, 0x41, - 0x31, 0x9c, 0x70, 0x9e, 0x87, 0xf4, 0x01, 0x86, 0x38, 0x79, 0x48, 0x77, 0x7c, 0xa5, 0x6d, 0x0d, - 0xd4, 0xb6, 0xfa, 0xef, 0xa7, 0xa0, 0x14, 0x0d, 0xfa, 0xb4, 0xe5, 0x6c, 0x7d, 0x7f, 0x62, 0x3a, - 0x2c, 0x45, 0xc1, 0xaf, 0x27, 0x55, 0x8b, 0x8c, 0xf5, 0x23, 0x3a, 0x7a, 0xf7, 0x59, 0x86, 0x36, - 0x7c, 0x11, 0x04, 0x2c, 0xcb, 0x39, 0xac, 0x69, 0x70, 0xc7, 0x57, 0xa8, 0x39, 0x34, 0x7c, 0xf8, - 0x36, 0x04, 0xe4, 0x95, 0x7f, 0x70, 0x2a, 0x94, 0x81, 0x3c, 0xf0, 0x24, 0x35, 0x8a, 0x28, 0x54, - 0xdb, 0x65, 0x25, 0xfc, 0xe6, 0x81, 0x27, 0xdb, 0x68, 0x12, 0xa3, 0x60, 0xab, 0x1c, 0x7e, 0x9e, - 0x5a, 0x64, 0x11, 0x1b, 0x8e, 0xd3, 0x76, 0x59, 0x45, 0xbf, 0x50, 0xad, 0x35, 0xe4, 0xd8, 0x3a, - 0x37, 0xfb, 0x48, 0xbe, 0x8e, 0x16, 0x16, 0x69, 0x74, 0x9b, 0xe1, 0x92, 0x6c, 0x9d, 0xdb, 0x81, - 0x0c, 0xd8, 0x46, 0xfd, 0xdf, 0xa7, 0xa0, 0x9c, 0x98, 0x60, 0x0c, 0xe6, 0x08, 0x11, 0xb7, 0x32, - 0x15, 0xdb, 0x7d, 0x8c, 0xc3, 0xe8, 0x5b, 0xe1, 0x36, 0xd5, 0xf3, 0xf0, 0x31, 0x8d, 0xdf, 0xeb, - 0x79, 0x23, 0xcf, 0xf7, 0xbd, 0xe7, 0xca, 0x91, 0xd9, 0x33, 0x03, 0xf9, 0x4c, 0x88, 0x53, 0x96, - 0xc5, 0xae, 0x36, 0x27, 0xbe, 0x2f, 0x5c, 0x05, 0xc8, 0x91, 0x70, 0xe2, 0x5c, 0xb5, 0xf2, 0xc8, - 0x14, 0x91, 0x69, 0x1f, 0x64, 0x05, 0x34, 0x04, 0x1a, 0x5b, 0x41, 0x8a, 0x88, 0x80, 0xe8, 0xaa, - 0x59, 0xc2, 0x4d, 0x45, 0xe5, 0x1b, 0x3a, 0x27, 0xdb, 0xe6, 0x45, 0xd0, 0x18, 0x78, 0x0c, 0x66, - 0x81, 0x07, 0xde, 0x73, 0x56, 0xae, 0x4d, 0x00, 0xe2, 0x08, 0x0b, 0x23, 0x4b, 0x54, 0x88, 0xe8, - 0x44, 0x40, 0xb7, 0x78, 0x07, 0x00, 0x9f, 0x08, 0x33, 0x0c, 0x2f, 0x5f, 0xc2, 0xed, 0x25, 0x3a, - 0x23, 0xc1, 0xa2, 0xf6, 0x17, 0xa0, 0x14, 0xbd, 0xe0, 0x55, 0x28, 0x90, 0x83, 0x1a, 0x7d, 0x36, - 0x6c, 0xa2, 0xb7, 0x65, 0xbb, 0x96, 0x38, 0x27, 0xbb, 0x92, 0x33, 0x54, 0x03, 0xa5, 0x1c, 0xda, - 0x96, 0x25, 0xdc, 0xf0, 0xdc, 0x46, 0xb5, 0x16, 0x9d, 0xae, 0x67, 0x17, 0x9e, 0xae, 0xd7, 0x7e, - 0x09, 0xca, 0x89, 0x10, 0xf0, 0xd2, 0x6e, 0x27, 0x04, 0x4b, 0x4f, 0x0b, 0x76, 0x1b, 0x4a, 0x61, - 0x45, 0x47, 0x40, 0x7b, 0x5b, 0xc9, 0x88, 0x01, 0xb5, 0x7f, 0x9a, 0x46, 0xbf, 0x14, 0xbb, 0x36, - 0x1b, 0xb6, 0xed, 0x40, 0x3e, 0x90, 0xa6, 0x9c, 0x84, 0xa5, 0x09, 0x4b, 0x2e, 0xd0, 0x2e, 0xd1, - 0xec, 0xae, 0x18, 0x9a, 0x9a, 0x7f, 0x00, 0x19, 0x69, 0x0e, 0x74, 0xda, 0xf3, 0x2b, 0xcb, 0x31, - 0xe9, 0x99, 0x83, 0xdd, 0x15, 0x03, 0xe9, 0xf8, 0x1e, 0x14, 0xfb, 0x3a, 0x53, 0xa5, 0x8d, 0xe2, - 0x92, 0x91, 0x55, 0x98, 0xdf, 0xda, 0x5d, 0x31, 0x22, 0x0e, 0xfc, 0xdb, 0x90, 0x45, 0x5f, 0x51, - 0x57, 0x70, 0x2c, 0x19, 0x31, 0xe2, 0x72, 0xd9, 0x5d, 0x31, 0x88, 0x72, 0xab, 0x00, 0x39, 0xb2, - 0xc1, 0xb5, 0x2a, 0xe4, 0x55, 0x5f, 0x67, 0x47, 0xae, 0x76, 0x0b, 0x32, 0x3d, 0x73, 0x80, 0xfe, - 0xba, 0x6d, 0x05, 0x3a, 0xf1, 0x81, 0x8f, 0xb5, 0x57, 0xe2, 0xac, 0x5b, 0x32, 0xa1, 0x9b, 0x9a, - 0x4a, 0xe8, 0xd6, 0xf2, 0x90, 0xc5, 0x2f, 0xd6, 0x6e, 0x5f, 0xe5, 0xfb, 0xd7, 0xfe, 0x7e, 0x06, - 0xc3, 0x04, 0x29, 0xce, 0x17, 0x26, 0xab, 0x3f, 0x82, 0xd2, 0xd8, 0xf7, 0xfa, 0x22, 0x08, 0x3c, - 0x5f, 0x3b, 0x47, 0xaf, 0xbf, 0xf8, 0x20, 0x79, 0xf3, 0x30, 0xa4, 0x31, 0x62, 0xf2, 0xfa, 0xbf, - 0x4a, 0x43, 0x29, 0x7a, 0xa1, 0xa2, 0x13, 0x29, 0xce, 0x55, 0x62, 0x72, 0x5f, 0xf8, 0x23, 0xd3, - 0xb6, 0x94, 0xf5, 0x68, 0x0e, 0xcd, 0xd0, 0xc9, 0xfd, 0xd8, 0x9b, 0xc8, 0xc9, 0xb1, 0x50, 0x09, - 0xa9, 0xa7, 0xf6, 0x48, 0x78, 0x2c, 0x4b, 0x47, 0x41, 0xa8, 0xd8, 0x7d, 0xc7, 0x9b, 0x58, 0x2c, - 0x87, 0xed, 0x47, 0xb4, 0xbd, 0xed, 0x9b, 0xe3, 0x40, 0xd9, 0xcc, 0x7d, 0xdb, 0xf7, 0x58, 0x01, - 0x89, 0x76, 0xec, 0xc1, 0xc8, 0x64, 0x45, 0x64, 0xd6, 0x7b, 0x6e, 0x4b, 0x34, 0xc2, 0x25, 0x74, - 0x53, 0x3b, 0x63, 0xe1, 0x76, 0xa5, 0x2f, 0x84, 0xdc, 0x37, 0xc7, 0x2a, 0x43, 0x69, 0x08, 0xcb, - 0xb2, 0xa5, 0xb2, 0x9f, 0x3b, 0x66, 0x5f, 0x1c, 0x7b, 0xde, 0x29, 0x5b, 0x45, 0x43, 0xd3, 0x76, - 0x03, 0x69, 0x0e, 0x7c, 0x73, 0xa4, 0x6c, 0x68, 0x4f, 0x38, 0x82, 0x5a, 0x6b, 0xf4, 0x6d, 0x5b, - 0x0e, 0x27, 0xc7, 0x8f, 0x30, 0x8a, 0x5b, 0x57, 0xa7, 0x46, 0x96, 0x18, 0x0b, 0xb4, 0xa1, 0xab, - 0x50, 0xdc, 0xb2, 0x1d, 0xfb, 0xd8, 0x76, 0x6c, 0xb6, 0x81, 0xa8, 0xad, 0xf3, 0xbe, 0xe9, 0xd8, - 0x96, 0x6f, 0x3e, 0x67, 0x1c, 0x85, 0x7b, 0xec, 0x7b, 0xa7, 0x36, 0xbb, 0x86, 0x88, 0x14, 0xd4, - 0x9d, 0xd9, 0x9f, 0xb2, 0xeb, 0x74, 0xf2, 0x75, 0x2a, 0x64, 0x7f, 0x78, 0x62, 0x1e, 0xb3, 0x1b, - 0x71, 0x82, 0xee, 0x66, 0x6d, 0x03, 0xd6, 0x67, 0xce, 0xd8, 0x6b, 0x05, 0x1d, 0x4b, 0xd6, 0x2a, - 0x50, 0x4e, 0x1c, 0x7e, 0xd6, 0x5e, 0x85, 0x62, 0x78, 0x34, 0x8a, 0x31, 0xb7, 0x1d, 0xa8, 0xa4, - 0xae, 0x56, 0x92, 0xa8, 0x5d, 0xfb, 0xdd, 0x14, 0xe4, 0xd5, 0xb9, 0x34, 0xdf, 0x8a, 0xea, 0x48, - 0x52, 0x4b, 0x9c, 0x45, 0x2a, 0x22, 0x7d, 0x92, 0x1b, 0x15, 0x93, 0x5c, 0x87, 0x9c, 0x43, 0xc1, - 0xb5, 0x36, 0x5f, 0xd4, 0x48, 0x58, 0x9b, 0x4c, 0xd2, 0xda, 0xd4, 0x1b, 0xd1, 0xe9, 0x71, 0x98, - 0x48, 0x24, 0xaf, 0xb0, 0xe7, 0x0b, 0xa1, 0x92, 0x84, 0x14, 0x1b, 0xa7, 0x69, 0xaf, 0xf0, 0x46, - 0x63, 0xb3, 0x2f, 0x09, 0x40, 0xbb, 0x28, 0x1a, 0x53, 0x96, 0x45, 0x2d, 0x6f, 0x0e, 0x4d, 0x59, - 0x3f, 0x81, 0xe2, 0xa1, 0x17, 0xcc, 0xee, 0xc9, 0x05, 0xc8, 0xf4, 0xbc, 0xb1, 0xf2, 0x30, 0xb7, - 0x3c, 0x49, 0x1e, 0xa6, 0xda, 0x82, 0x4f, 0xa4, 0x52, 0x2a, 0xc3, 0x1e, 0x0c, 0xa5, 0x8a, 0xab, - 0xdb, 0xae, 0x2b, 0x7c, 0x96, 0xc3, 0x39, 0x34, 0xc4, 0x18, 0xbd, 0x5a, 0x96, 0xc7, 0x59, 0x23, - 0xf8, 0x8e, 0xed, 0x07, 0x92, 0x15, 0xea, 0x6d, 0xdc, 0x4d, 0xed, 0x01, 0x6d, 0x82, 0xf4, 0x40, - 0xac, 0x56, 0x50, 0x44, 0x6a, 0x36, 0x85, 0x8b, 0x3a, 0x46, 0xd1, 0x93, 0x2a, 0x35, 0xa2, 0x0f, - 0xa4, 0x71, 0x07, 0xa3, 0xf6, 0x47, 0x93, 0x40, 0xda, 0x27, 0x17, 0x2c, 0x53, 0x7f, 0x06, 0x95, - 0xa9, 0xa2, 0x24, 0x7e, 0x1d, 0xd8, 0x14, 0x00, 0x45, 0x5f, 0xe1, 0xb7, 0xe0, 0xda, 0x14, 0x74, - 0xdf, 0xb6, 0x2c, 0xca, 0xdc, 0xce, 0xbe, 0x08, 0x3b, 0xb8, 0x55, 0x82, 0x42, 0x5f, 0xcd, 0x52, - 0xfd, 0x10, 0x2a, 0x34, 0x6d, 0xfb, 0x42, 0x9a, 0x1d, 0xd7, 0xb9, 0xf8, 0x23, 0x57, 0x8e, 0xd5, - 0xbf, 0xaa, 0x03, 0x2c, 0xb4, 0x17, 0x27, 0xbe, 0x37, 0x22, 0x5e, 0x39, 0x83, 0x9e, 0x91, 0xbb, - 0xf4, 0xf4, 0xdc, 0xa7, 0xa5, 0x57, 0xff, 0xf5, 0x12, 0x14, 0x1a, 0xfd, 0x3e, 0x86, 0x84, 0x73, - 0x5f, 0x7e, 0x07, 0xf2, 0x7d, 0xcf, 0x3d, 0xb1, 0x07, 0xda, 0x1e, 0xcf, 0x7a, 0x86, 0x9a, 0x0e, - 0x15, 0xee, 0xc4, 0x1e, 0x18, 0x1a, 0x19, 0xc9, 0xf4, 0x7e, 0x92, 0xbb, 0x92, 0x4c, 0x19, 0xd5, - 0x68, 0xfb, 0x78, 0x00, 0x59, 0xdb, 0x3d, 0xf1, 0x74, 0x99, 0xe7, 0xe7, 0x2f, 0x21, 0xa2, 0x5a, - 0x47, 0x42, 0xac, 0xfd, 0x97, 0x14, 0xe4, 0xd5, 0xa7, 0xf9, 0xab, 0xb0, 0x26, 0x5c, 0x5c, 0x4c, - 0xa1, 0x29, 0xd7, 0xab, 0x68, 0x06, 0x8a, 0x4e, 0xab, 0x86, 0x88, 0xe3, 0xc9, 0x40, 0x67, 0x52, - 0x92, 0x20, 0xfe, 0x1e, 0xdc, 0x52, 0xcd, 0x43, 0x5f, 0xf8, 0xc2, 0x11, 0x66, 0x20, 0x9a, 0x43, - 0xd3, 0x75, 0x85, 0xa3, 0x37, 0xf6, 0xcb, 0x5e, 0xf3, 0x3a, 0xac, 0xaa, 0x57, 0xdd, 0xb1, 0xd9, - 0x17, 0x81, 0x3e, 0xbd, 0x9b, 0x82, 0xf1, 0xaf, 0x41, 0x8e, 0xaa, 0x60, 0xab, 0xd6, 0xd5, 0x53, - 0xa9, 0xb0, 0x6a, 0x5e, 0xb4, 0xf3, 0x34, 0x00, 0xd4, 0x30, 0x61, 0xd0, 0xa5, 0x57, 0xff, 0x17, - 0xaf, 0x1c, 0x57, 0x8a, 0xff, 0x12, 0x44, 0x28, 0x9f, 0x25, 0x1c, 0x41, 0xe5, 0x8a, 0xb8, 0x33, - 0xa6, 0xe9, 0x9c, 0x64, 0x0a, 0x56, 0xfb, 0x27, 0x59, 0xc8, 0xe2, 0x08, 0x23, 0xf2, 0xd0, 0x1b, - 0x89, 0x28, 0x5b, 0xac, 0x5c, 0x8d, 0x29, 0x18, 0xba, 0x36, 0xa6, 0x3a, 0xb0, 0x8f, 0xd0, 0x94, - 0xf1, 0x98, 0x05, 0x23, 0xe6, 0xd8, 0xf7, 0x4e, 0x6c, 0x27, 0xc6, 0xd4, 0x4e, 0xd0, 0x0c, 0x98, - 0x7f, 0x1d, 0x6e, 0x8e, 0x4c, 0xff, 0x54, 0x48, 0x5a, 0xdd, 0xcf, 0x3c, 0xff, 0x34, 0xc0, 0x91, - 0x6b, 0x5b, 0x3a, 0xcd, 0x78, 0xc9, 0x5b, 0xfe, 0x3a, 0x6c, 0x3c, 0x0f, 0x9b, 0xd1, 0x37, 0x54, - 0xa2, 0x6f, 0xfe, 0x05, 0x9a, 0x5b, 0x4b, 0x9c, 0xd9, 0xc4, 0xb7, 0xa8, 0x6a, 0x61, 0xc3, 0x36, - 0xaa, 0x92, 0xa9, 0x06, 0xb2, 0xab, 0xbf, 0xac, 0xcf, 0x8b, 0xa6, 0xa1, 0xe8, 0x6d, 0xa9, 0x1a, - 0xa1, 0xa0, 0x6d, 0x51, 0x9e, 0xb4, 0x64, 0xc4, 0x00, 0x54, 0x34, 0xfa, 0xe4, 0x53, 0x65, 0x54, - 0x2b, 0x2a, 0x04, 0x4d, 0x80, 0x10, 0x43, 0x8a, 0xfe, 0x30, 0xfc, 0x88, 0x4a, 0x62, 0x26, 0x41, - 0xfc, 0x0e, 0xc0, 0xc0, 0x94, 0xe2, 0xb9, 0x79, 0xf1, 0xc4, 0x77, 0xaa, 0x42, 0x1d, 0x7c, 0xc4, - 0x10, 0x0c, 0x62, 0x1d, 0xaf, 0x6f, 0x3a, 0x5d, 0xe9, 0xf9, 0xe6, 0x40, 0x1c, 0x9a, 0x72, 0x58, - 0x1d, 0xa8, 0x20, 0x76, 0x16, 0x8e, 0x3d, 0x96, 0xf6, 0x48, 0x7c, 0xe2, 0xb9, 0xa2, 0x3a, 0x54, - 0x3d, 0x0e, 0xdb, 0x28, 0x89, 0xe9, 0x9a, 0xce, 0x85, 0xb4, 0xfb, 0xd8, 0x17, 0x5b, 0x49, 0x92, - 0x00, 0x51, 0xda, 0x40, 0x48, 0x1c, 0xc7, 0xb6, 0x55, 0xfd, 0x9e, 0xea, 0x6b, 0x04, 0xa8, 0x77, - 0x00, 0x62, 0x95, 0x43, 0x3b, 0xde, 0xa0, 0xc3, 0x19, 0xb6, 0xa2, 0xf2, 0x48, 0xae, 0x65, 0xbb, - 0x83, 0x6d, 0xad, 0x65, 0x2c, 0x85, 0x40, 0xca, 0x0f, 0x08, 0x2b, 0x02, 0x92, 0x27, 0x41, 0x2d, - 0x61, 0xb1, 0x4c, 0xfd, 0xff, 0xa6, 0xa0, 0x9c, 0xa8, 0x45, 0xf8, 0x63, 0xac, 0x9f, 0xc0, 0x7d, - 0x16, 0x77, 0x6a, 0x1c, 0x50, 0xa5, 0x81, 0x51, 0x1b, 0x87, 0x5b, 0x97, 0x4a, 0xe0, 0x5b, 0x95, - 0x0d, 0x48, 0x40, 0x3e, 0x53, 0xed, 0x44, 0xfd, 0xa1, 0x4e, 0xa9, 0x94, 0xa1, 0xf0, 0xc4, 0x3d, - 0x75, 0xbd, 0xe7, 0xae, 0xda, 0x40, 0xa9, 0x20, 0x66, 0xea, 0x68, 0x2f, 0xac, 0x59, 0xc9, 0xd4, - 0xff, 0x41, 0x76, 0xa6, 0x76, 0xac, 0x05, 0x79, 0xe5, 0xc7, 0x93, 0x8b, 0x39, 0x5f, 0xec, 0x93, - 0x44, 0xd6, 0xc7, 0x48, 0x09, 0x90, 0xa1, 0x89, 0xd1, 0xc1, 0x8e, 0x2a, 0x2b, 0xd3, 0x0b, 0x8f, - 0xbb, 0xa6, 0x18, 0x85, 0x46, 0x73, 0xaa, 0xb8, 0x38, 0xe2, 0x50, 0xfb, 0x6b, 0x29, 0xb8, 0xbe, - 0x08, 0x25, 0x59, 0x82, 0x9d, 0x9a, 0x2e, 0xc1, 0xee, 0xce, 0x94, 0x34, 0xa7, 0xa9, 0x37, 0x0f, - 0x5e, 0x52, 0x88, 0xe9, 0x02, 0xe7, 0xfa, 0x8f, 0x53, 0xb0, 0x31, 0xd7, 0xe7, 0x84, 0x83, 0x01, - 0x90, 0x57, 0x9a, 0xa5, 0x2a, 0x8e, 0xa2, 0x1a, 0x10, 0x95, 0xc3, 0xa7, 0xad, 0x37, 0x50, 0x87, - 0xea, 0xba, 0x88, 0x5b, 0xf9, 0xaf, 0x38, 0x6b, 0x68, 0xd9, 0x07, 0x42, 0x65, 0x48, 0x95, 0x17, - 0xa4, 0x21, 0x79, 0xe5, 0x63, 0xaa, 0x83, 0x06, 0x56, 0xa0, 0x4a, 0xa6, 0xc9, 0xd8, 0xb1, 0xfb, - 0xd8, 0x2c, 0xf2, 0x1a, 0xdc, 0x54, 0x95, 0xfc, 0x3a, 0x9e, 0x3b, 0xe9, 0x0d, 0x6d, 0x5a, 0x1c, - 0xac, 0x54, 0x37, 0xe0, 0xda, 0x82, 0x3e, 0x91, 0x94, 0x4f, 0xb5, 0xc4, 0x6b, 0x00, 0xdb, 0x4f, - 0x43, 0x39, 0x59, 0x8a, 0x73, 0x58, 0xdb, 0x7e, 0x9a, 0x64, 0xa8, 0xd7, 0xcb, 0x53, 0xb4, 0x24, - 0x01, 0xcb, 0xd4, 0x7f, 0x25, 0x15, 0x56, 0x17, 0xd4, 0xfe, 0x3c, 0x54, 0x94, 0x8c, 0x87, 0xe6, - 0x85, 0xe3, 0x99, 0x16, 0x6f, 0xc1, 0x5a, 0x10, 0x5d, 0x2f, 0x49, 0x6c, 0x1e, 0xb3, 0x9b, 0x72, - 0x77, 0x0a, 0xc9, 0x98, 0x21, 0x0a, 0xc3, 0x92, 0x74, 0x7c, 0x24, 0xc1, 0x29, 0xc0, 0x32, 0x69, - 0x95, 0xad, 0x52, 0xc8, 0x64, 0xd6, 0xbf, 0x06, 0x1b, 0xdd, 0xd8, 0xd0, 0x2a, 0xff, 0x15, 0xf5, - 0x41, 0x59, 0xe9, 0xed, 0x50, 0x1f, 0x74, 0xb3, 0xfe, 0x9f, 0xf2, 0x00, 0xf1, 0xf1, 0xcb, 0x82, - 0x65, 0xbe, 0xa8, 0x9a, 0x60, 0xee, 0x30, 0x34, 0xf3, 0xd2, 0x87, 0xa1, 0xef, 0x45, 0x6e, 0xb4, - 0x4a, 0xe6, 0xce, 0x96, 0x54, 0xc7, 0x32, 0xcd, 0x3a, 0xcf, 0x53, 0xc5, 0x36, 0xb9, 0xd9, 0x62, - 0x9b, 0xbb, 0xf3, 0x95, 0x79, 0x33, 0xf6, 0x27, 0xce, 0x12, 0x14, 0xa6, 0xb2, 0x04, 0x35, 0x28, - 0xfa, 0xc2, 0xb4, 0x3c, 0xd7, 0xb9, 0x08, 0xcf, 0xdc, 0xc2, 0x36, 0x7f, 0x0b, 0x72, 0x92, 0x6e, - 0xc8, 0x14, 0x69, 0xb9, 0xbc, 0x60, 0xe2, 0x14, 0x2e, 0x1a, 0x33, 0x3b, 0xd0, 0xe5, 0x74, 0x6a, - 0x07, 0x2b, 0x1a, 0x09, 0x08, 0xdf, 0x04, 0x6e, 0x63, 0xc8, 0xe4, 0x38, 0xc2, 0xda, 0xba, 0xd8, - 0x56, 0x47, 0x61, 0xb4, 0xc7, 0x16, 0x8d, 0x05, 0x6f, 0xc2, 0xf9, 0x5f, 0x8d, 0xe7, 0x9f, 0x44, - 0x3e, 0xb3, 0x03, 0xec, 0x69, 0x85, 0x5c, 0x89, 0xa8, 0x8d, 0xbb, 0x78, 0xb8, 0x46, 0xd5, 0x58, - 0x92, 0xf6, 0xc6, 0xe7, 0xc9, 0x97, 0xbc, 0xad, 0xff, 0x5e, 0x3a, 0x0a, 0x37, 0x4a, 0x90, 0x3b, - 0x36, 0x03, 0xbb, 0xaf, 0xa2, 0x4f, 0xed, 0x26, 0xa8, 0x90, 0x43, 0x7a, 0x96, 0xc7, 0xd2, 0x18, - 0x39, 0x04, 0x42, 0x1f, 0x71, 0xc4, 0xb7, 0x86, 0x58, 0x16, 0xd7, 0x66, 0x38, 0xdf, 0xaa, 0x2a, - 0x86, 0x48, 0x29, 0x61, 0x65, 0x45, 0xf5, 0x86, 0x14, 0x7a, 0x92, 0xed, 0x67, 0x45, 0xc4, 0x71, - 0x3d, 0x29, 0x54, 0xba, 0x8e, 0xb4, 0x93, 0x01, 0xb2, 0x09, 0xcb, 0xe0, 0x59, 0x19, 0x5d, 0xf9, - 0x90, 0xa9, 0xca, 0xb1, 0x05, 0x14, 0xe8, 0xac, 0xe2, 0xea, 0x9c, 0x7e, 0xc1, 0x2a, 0x28, 0x51, - 0x7c, 0x19, 0x89, 0xad, 0x21, 0x57, 0x93, 0x6a, 0x35, 0xd6, 0xf1, 0xf1, 0x8c, 0x2a, 0x38, 0x18, - 0x7e, 0xd5, 0x42, 0x83, 0xb1, 0x81, 0x92, 0x45, 0xae, 0x01, 0xe3, 0x18, 0xa9, 0x8c, 0x4d, 0x0c, - 0x1b, 0xec, 0xb1, 0xe9, 0x4a, 0x76, 0x0d, 0xbb, 0x3a, 0xb6, 0x4e, 0xd8, 0x75, 0x24, 0xe9, 0x0f, - 0x4d, 0xc9, 0x6e, 0x20, 0x0e, 0x3e, 0x6d, 0x0b, 0x1f, 0xe7, 0x93, 0xdd, 0x44, 0x1c, 0x69, 0x0e, - 0xd8, 0xad, 0xfa, 0x6f, 0xc6, 0x15, 0xbf, 0x6f, 0x44, 0x0e, 0xfd, 0x32, 0x4a, 0x8e, 0x2e, 0xff, - 0xa2, 0x15, 0xd7, 0x82, 0x0d, 0x5f, 0x7c, 0x7f, 0x62, 0x4f, 0xd5, 0xc1, 0x67, 0xae, 0x2e, 0xb4, - 0x98, 0xa7, 0xa8, 0x9f, 0xc1, 0x46, 0xd8, 0x78, 0x66, 0xcb, 0x21, 0xe5, 0x56, 0xf8, 0x5b, 0x89, - 0x42, 0xfd, 0xd4, 0xc2, 0x0b, 0x4e, 0x11, 0xcb, 0xb8, 0x30, 0x3f, 0xca, 0x9d, 0xa7, 0x97, 0xc8, - 0x9d, 0xd7, 0xff, 0x4f, 0x3e, 0x91, 0x5e, 0x51, 0x21, 0x8e, 0x15, 0x85, 0x38, 0xf3, 0x47, 0xad, - 0x71, 0x3a, 0x3c, 0xfd, 0x32, 0xe9, 0xf0, 0x45, 0x65, 0x0b, 0xef, 0xa3, 0xc7, 0x4d, 0xeb, 0xe7, - 0xe9, 0x12, 0xa9, 0xfe, 0x29, 0x5c, 0xbe, 0x45, 0x07, 0xa7, 0x66, 0x57, 0xd5, 0xd4, 0xe4, 0x16, - 0x5e, 0x9b, 0x49, 0x9e, 0x90, 0x6a, 0x4c, 0x23, 0x41, 0x95, 0xb0, 0x36, 0xf9, 0x45, 0xd6, 0x06, - 0xa3, 0x4d, 0x6d, 0x87, 0xa2, 0xb6, 0x3a, 0x19, 0x51, 0xcf, 0x21, 0x7b, 0xf2, 0xa3, 0x8b, 0xc6, - 0x1c, 0x1c, 0xbd, 0xb0, 0xd1, 0xc4, 0x91, 0xb6, 0x4e, 0xfe, 0xab, 0xc6, 0xec, 0xbd, 0xbe, 0xd2, - 0xfc, 0xbd, 0xbe, 0x0f, 0x01, 0x02, 0x81, 0xab, 0x63, 0xdb, 0xee, 0x4b, 0x5d, 0x79, 0x73, 0xe7, - 0xb2, 0xbe, 0xe9, 0x23, 0x8b, 0x04, 0x05, 0xca, 0x3f, 0x32, 0xcf, 0xe9, 0x18, 0x53, 0x97, 0x08, - 0x44, 0xed, 0x59, 0x1b, 0xbc, 0x36, 0x6f, 0x83, 0xdf, 0x82, 0x5c, 0xd0, 0xf7, 0xc6, 0x82, 0xae, - 0xa6, 0x5c, 0x3e, 0xbf, 0x9b, 0x5d, 0x44, 0x32, 0x14, 0x2e, 0x25, 0xf1, 0xd0, 0x4a, 0x79, 0x3e, - 0x5d, 0x4a, 0x29, 0x19, 0x61, 0x73, 0xca, 0x0e, 0xde, 0x9c, 0xb6, 0x83, 0x35, 0x0b, 0xf2, 0x3a, - 0x21, 0x3f, 0x1b, 0x5a, 0x87, 0xa9, 0xbc, 0x74, 0x22, 0x95, 0x17, 0xd5, 0x77, 0x66, 0x92, 0xf5, - 0x9d, 0x33, 0xf7, 0xd6, 0x72, 0x73, 0xf7, 0xd6, 0xea, 0x9f, 0x40, 0x8e, 0x64, 0x45, 0x27, 0x42, - 0x0d, 0xb3, 0xf2, 0x31, 0xb1, 0x53, 0x2c, 0xc5, 0xaf, 0x03, 0x0b, 0x04, 0x39, 0x21, 0xa2, 0x6b, - 0x8e, 0x04, 0x19, 0xc9, 0x34, 0xaf, 0xc2, 0x75, 0x85, 0x1b, 0x4c, 0xbf, 0x21, 0x4f, 0xc8, 0xb1, - 0x8f, 0x7d, 0xd3, 0xbf, 0x60, 0xd9, 0xfa, 0x87, 0x74, 0x1c, 0x1e, 0x2a, 0x54, 0x39, 0xba, 0x27, - 0xa8, 0xcc, 0xb2, 0xa5, 0xad, 0x0f, 0xd5, 0x46, 0xe8, 0xf8, 0x48, 0x55, 0x8c, 0x51, 0x00, 0x42, - 0x19, 0x94, 0xd5, 0xe4, 0x4e, 0xfc, 0xc7, 0xb6, 0xde, 0xea, 0x5b, 0x09, 0x57, 0x6e, 0xba, 0x04, - 0x2c, 0xb5, 0x6c, 0x09, 0x58, 0xfd, 0x31, 0xac, 0x1b, 0xd3, 0x36, 0x9d, 0xbf, 0x07, 0x05, 0x6f, - 0x9c, 0xe4, 0xf3, 0x22, 0xbd, 0x0c, 0xd1, 0xeb, 0x3f, 0x49, 0xc1, 0x6a, 0xdb, 0x95, 0xc2, 0x77, - 0x4d, 0x67, 0xc7, 0x31, 0x07, 0xfc, 0xdd, 0xd0, 0x4a, 0x2d, 0x8e, 0xd6, 0x93, 0xb8, 0xd3, 0x06, - 0xcb, 0xd1, 0x89, 0x67, 0x7e, 0x03, 0x36, 0x84, 0x65, 0x4b, 0xcf, 0x57, 0x0e, 0x6c, 0x58, 0xa9, - 0x77, 0x1d, 0x98, 0x02, 0x77, 0x69, 0x49, 0xf4, 0xd4, 0x34, 0x57, 0xe1, 0xfa, 0x14, 0x34, 0xf4, - 0x4e, 0xd3, 0xfc, 0x36, 0x54, 0xe3, 0xdd, 0x68, 0xdb, 0x73, 0x65, 0xdb, 0xb5, 0xc4, 0x39, 0xb9, - 0x42, 0x2c, 0x53, 0xff, 0xb5, 0x42, 0xe8, 0x84, 0x3d, 0xd5, 0x75, 0x7c, 0xbe, 0xe7, 0xc5, 0x97, - 0x44, 0x75, 0x2b, 0x71, 0x19, 0x39, 0xbd, 0xc4, 0x65, 0xe4, 0x0f, 0xe3, 0x0b, 0xa5, 0x6a, 0xa3, - 0x78, 0x65, 0xe1, 0xee, 0x43, 0xe5, 0x47, 0xda, 0xed, 0xee, 0x8a, 0xc4, 0xed, 0xd2, 0x37, 0x75, - 0xac, 0x95, 0x5d, 0xc6, 0x57, 0x55, 0x67, 0xfb, 0xef, 0xcc, 0xde, 0x62, 0x58, 0xae, 0x0c, 0x70, - 0xce, 0x9d, 0x84, 0x97, 0x76, 0x27, 0xbf, 0x35, 0x13, 0xd6, 0x14, 0x17, 0x26, 0xb0, 0xae, 0xb8, - 0xa3, 0xf9, 0x2d, 0x28, 0x0c, 0xed, 0x40, 0x7a, 0xbe, 0xba, 0x37, 0x3c, 0x7f, 0xcf, 0x29, 0x31, - 0x5a, 0xbb, 0x0a, 0x91, 0x6a, 0xb6, 0x42, 0x2a, 0xfe, 0x5d, 0xd8, 0xa0, 0x81, 0x3f, 0x8c, 0xbd, - 0x86, 0xa0, 0x5a, 0x5e, 0x58, 0x2b, 0x97, 0x60, 0xb5, 0x35, 0x43, 0x62, 0xcc, 0x33, 0xa9, 0x0d, - 0x00, 0xe2, 0xf9, 0x99, 0xb3, 0x62, 0x9f, 0xe1, 0xde, 0xf0, 0x4d, 0xc8, 0x07, 0x93, 0xe3, 0xf8, - 0x84, 0x4a, 0xb7, 0x6a, 0xe7, 0x50, 0x9b, 0xf3, 0x0e, 0x0e, 0x85, 0xaf, 0xc4, 0xbd, 0xf2, 0xf2, - 0xf2, 0x87, 0xc9, 0x89, 0x57, 0xca, 0x79, 0xf7, 0x92, 0xd9, 0x8b, 0x38, 0x27, 0x34, 0xa0, 0xf6, - 0x0e, 0x94, 0x13, 0x83, 0x8a, 0x96, 0x79, 0xe2, 0x5a, 0x5e, 0x98, 0x34, 0xc5, 0x67, 0x75, 0x79, - 0xcb, 0x0a, 0xd3, 0xa6, 0xf4, 0x5c, 0x33, 0x80, 0xcd, 0x0e, 0xe0, 0x15, 0xa1, 0xef, 0x2b, 0x50, - 0x49, 0xb8, 0x74, 0x51, 0x42, 0x6d, 0x1a, 0x58, 0x3f, 0x83, 0xcf, 0x27, 0xd8, 0x1d, 0x0a, 0x7f, - 0x64, 0x07, 0xb8, 0x91, 0xa8, 0x90, 0x8e, 0xb2, 0x17, 0x96, 0x70, 0xa5, 0x2d, 0x43, 0x0b, 0x1a, - 0xb5, 0xf9, 0x2f, 0x40, 0x6e, 0x2c, 0xfc, 0x51, 0xa0, 0xad, 0xe8, 0xac, 0x06, 0x2d, 0x64, 0x1b, - 0x18, 0x8a, 0xa6, 0xfe, 0xf7, 0x52, 0x50, 0xdc, 0x17, 0xd2, 0x44, 0xdf, 0x81, 0xef, 0xcf, 0x7c, - 0x65, 0xfe, 0x54, 0x35, 0x44, 0xdd, 0xd4, 0x41, 0xe6, 0x66, 0x5b, 0xe3, 0xeb, 0xf6, 0xee, 0x4a, - 0x2c, 0x58, 0x6d, 0x0b, 0x0a, 0x1a, 0x5c, 0x7b, 0x17, 0xd6, 0x67, 0x30, 0x69, 0x5c, 0x94, 0x6f, - 0xdf, 0xbd, 0x18, 0x85, 0xa5, 0x3f, 0xab, 0xc6, 0x34, 0x70, 0xab, 0x04, 0x85, 0xb1, 0x22, 0xa8, - 0xff, 0xde, 0x0d, 0x2a, 0x38, 0xb1, 0x4f, 0x30, 0xd8, 0x5e, 0xb4, 0xb3, 0xde, 0x01, 0xa0, 0xad, - 0x59, 0x95, 0x25, 0xa8, 0x24, 0x67, 0x02, 0xc2, 0xdf, 0x8f, 0xb2, 0xd3, 0xd9, 0x85, 0x4e, 0x55, - 0x92, 0xf9, 0x6c, 0x8a, 0xba, 0x0a, 0x05, 0x3b, 0xd8, 0xc3, 0xad, 0x4d, 0x97, 0xf2, 0x84, 0x4d, - 0xfe, 0x4d, 0xc8, 0xdb, 0xa3, 0xb1, 0xe7, 0x4b, 0x9d, 0xbe, 0xbe, 0x92, 0x6b, 0x9b, 0x30, 0x77, - 0x57, 0x0c, 0x4d, 0x83, 0xd4, 0xe2, 0x9c, 0xa8, 0x8b, 0x2f, 0xa6, 0x6e, 0x9d, 0x87, 0xd4, 0x8a, - 0x86, 0x7f, 0x07, 0x2a, 0x03, 0x55, 0x97, 0xa8, 0x18, 0x6b, 0x23, 0xf2, 0x95, 0xab, 0x98, 0x3c, - 0x4a, 0x12, 0xec, 0xae, 0x18, 0xd3, 0x1c, 0x90, 0x25, 0x3a, 0xf0, 0x22, 0x90, 0x3d, 0xef, 0x23, - 0xcf, 0x76, 0x29, 0x28, 0x7d, 0x01, 0x4b, 0x23, 0x49, 0x80, 0x2c, 0xa7, 0x38, 0xf0, 0xaf, 0xa3, - 0xc7, 0x13, 0x48, 0x7d, 0x75, 0xfb, 0xee, 0x55, 0x9c, 0x7a, 0x22, 0xd0, 0x97, 0xae, 0x03, 0xc9, - 0xcf, 0xa1, 0x96, 0x58, 0x24, 0xfa, 0x23, 0x8d, 0xf1, 0xd8, 0xf7, 0x30, 0xb2, 0xad, 0x10, 0xb7, - 0xaf, 0x5f, 0xc5, 0xed, 0xf0, 0x52, 0xea, 0xdd, 0x15, 0xe3, 0x0a, 0xde, 0xbc, 0x87, 0x91, 0x9d, - 0xee, 0xc2, 0x9e, 0x30, 0xcf, 0xc2, 0x8b, 0xdf, 0xf7, 0x97, 0x1a, 0x05, 0xa2, 0xd8, 0x5d, 0x31, - 0x66, 0x78, 0xf0, 0x5f, 0x82, 0x8d, 0xa9, 0x6f, 0xd2, 0x5d, 0x4f, 0x75, 0x2d, 0xfc, 0x6b, 0x4b, - 0x77, 0x03, 0x89, 0x76, 0x57, 0x8c, 0x79, 0x4e, 0x7c, 0x02, 0x9f, 0x9b, 0xef, 0xd2, 0xb6, 0xe8, - 0x3b, 0xb6, 0x2b, 0xf4, 0x0d, 0xf2, 0x77, 0x5e, 0x6e, 0xb4, 0x34, 0xf1, 0xee, 0x8a, 0x71, 0x39, - 0x67, 0xfe, 0x17, 0xe1, 0xf6, 0x78, 0xa1, 0x89, 0x51, 0xa6, 0x4b, 0x5f, 0x40, 0x7f, 0x6f, 0xc9, - 0x2f, 0xcf, 0xd1, 0xef, 0xae, 0x18, 0x57, 0xf2, 0x47, 0xdf, 0x99, 0x22, 0x68, 0x5d, 0x3e, 0xad, - 0x1a, 0xfc, 0x36, 0x94, 0xcc, 0xbe, 0xb3, 0x2b, 0x4c, 0x2b, 0xca, 0xb0, 0xc7, 0x80, 0xda, 0xff, - 0x48, 0x41, 0x5e, 0xeb, 0xfb, 0xed, 0xe8, 0x14, 0x3d, 0x32, 0xdd, 0x31, 0x80, 0x7f, 0x00, 0x25, - 0xe1, 0xfb, 0x9e, 0xdf, 0xf4, 0xac, 0xb0, 0x00, 0x71, 0x36, 0xfd, 0xab, 0xf8, 0x6c, 0xb6, 0x42, - 0x34, 0x23, 0xa6, 0xe0, 0xef, 0x03, 0xa8, 0x75, 0xde, 0x8b, 0x6f, 0xc1, 0xd4, 0x16, 0xd3, 0xab, - 0x43, 0x9b, 0x18, 0x3b, 0x4e, 0x9e, 0x85, 0x27, 0x26, 0x61, 0x33, 0x0a, 0x38, 0x73, 0x89, 0x80, - 0xf3, 0xb6, 0xce, 0x23, 0x1c, 0xe0, 0x0b, 0x7d, 0x17, 0x2c, 0x02, 0xd4, 0xfe, 0x75, 0x0a, 0xf2, - 0xca, 0x78, 0xf0, 0xd6, 0x7c, 0x8f, 0x5e, 0x7b, 0xb1, 0xcd, 0xd9, 0x9c, 0xed, 0xd9, 0x37, 0x01, - 0x94, 0x0d, 0x4a, 0xf4, 0xec, 0xf6, 0x0c, 0x1f, 0x4d, 0x1a, 0x16, 0xf0, 0xc6, 0xf8, 0xf5, 0x87, - 0xea, 0xbe, 0x12, 0xe5, 0x6a, 0x9f, 0xec, 0xed, 0xb1, 0x15, 0xbe, 0x01, 0x95, 0x27, 0x07, 0x8f, - 0x0f, 0x3a, 0xcf, 0x0e, 0x8e, 0x5a, 0x86, 0xd1, 0x31, 0x54, 0xca, 0x76, 0xab, 0xb1, 0x7d, 0xd4, - 0x3e, 0x38, 0x7c, 0xd2, 0x63, 0xe9, 0xda, 0x3f, 0x4b, 0x41, 0x65, 0xca, 0x76, 0xfd, 0xc9, 0x4e, - 0x5d, 0x62, 0xf8, 0x33, 0x8b, 0x87, 0x3f, 0x7b, 0xd9, 0xf0, 0xe7, 0x66, 0x87, 0xff, 0x77, 0x52, - 0x50, 0x99, 0xb2, 0x91, 0x49, 0xee, 0xa9, 0x69, 0xee, 0xc9, 0x9d, 0x3e, 0x3d, 0xb3, 0xd3, 0xd7, - 0x61, 0x35, 0x7c, 0x3e, 0x88, 0x33, 0x0e, 0x53, 0xb0, 0x24, 0x0e, 0x5d, 0x18, 0xc8, 0x4e, 0xe3, - 0xd0, 0xa5, 0x81, 0xab, 0xa5, 0xa5, 0x0b, 0x92, 0x01, 0xdd, 0x1f, 0xaf, 0x5d, 0x6e, 0x41, 0xaf, - 0xe8, 0xc2, 0x23, 0x28, 0x8f, 0xe3, 0x65, 0xfa, 0x72, 0x6e, 0x49, 0x92, 0xf2, 0x05, 0x72, 0xfe, - 0x38, 0x05, 0x6b, 0xd3, 0x36, 0xf7, 0x4f, 0xf5, 0xb0, 0xfe, 0xc3, 0x14, 0x6c, 0xcc, 0x59, 0xf2, - 0x2b, 0x1d, 0xbb, 0x59, 0xb9, 0xd2, 0x4b, 0xc8, 0x95, 0x59, 0x20, 0xd7, 0xe5, 0x96, 0xe4, 0x6a, - 0x89, 0xbb, 0xf0, 0xb9, 0x4b, 0xf7, 0x84, 0x2b, 0x86, 0x7a, 0x8a, 0x69, 0x66, 0x96, 0xe9, 0x6f, - 0xa7, 0xe0, 0xf6, 0x55, 0xf6, 0xfe, 0xff, 0xbb, 0x5e, 0xcd, 0x4a, 0x58, 0x7f, 0x37, 0x3a, 0x7a, - 0x2f, 0x43, 0x41, 0xff, 0x2e, 0x93, 0x2e, 0x6e, 0x1e, 0x7a, 0xcf, 0x5d, 0x95, 0x89, 0x36, 0x84, - 0xa9, 0x6f, 0xae, 0x1b, 0x62, 0xec, 0xd8, 0x74, 0x78, 0x79, 0x0b, 0xa0, 0x41, 0x71, 0x5d, 0x78, - 0x91, 0xa4, 0xb9, 0xd7, 0xe9, 0xb6, 0xd8, 0x4a, 0xd2, 0x89, 0xfd, 0x24, 0x34, 0xc4, 0xf5, 0x43, - 0xc8, 0xc7, 0x97, 0x01, 0xf6, 0x4d, 0xff, 0xd4, 0x52, 0x47, 0x84, 0xab, 0x50, 0x3c, 0xd4, 0x21, - 0x94, 0xfa, 0xd4, 0x47, 0xdd, 0xce, 0x81, 0x4a, 0x7a, 0x6f, 0x77, 0x7a, 0xea, 0x4a, 0x41, 0xf7, - 0xe9, 0x23, 0x75, 0x56, 0xf5, 0xc8, 0x68, 0x1c, 0xee, 0x1e, 0x11, 0x46, 0xae, 0xfe, 0x5b, 0xd9, - 0x70, 0x57, 0xab, 0x1b, 0xfa, 0xf0, 0x11, 0x20, 0x8f, 0xd6, 0xdc, 0xd3, 0x8c, 0xa3, 0xcf, 0x50, - 0x19, 0x6c, 0xeb, 0x5c, 0xe5, 0x21, 0x58, 0x9a, 0xe7, 0x21, 0x7d, 0x78, 0xac, 0x6a, 0x77, 0x76, - 0xe5, 0xc8, 0x51, 0x37, 0x0b, 0x7b, 0xe7, 0x92, 0xe5, 0xf0, 0xa1, 0x19, 0x9c, 0xb1, 0x7c, 0xfd, - 0x5f, 0x64, 0xa0, 0x14, 0x99, 0xca, 0x97, 0x31, 0xdd, 0x9c, 0xc3, 0x5a, 0xfb, 0xa0, 0xd7, 0x32, - 0x0e, 0x1a, 0x7b, 0x1a, 0x25, 0xc3, 0xaf, 0xc1, 0xfa, 0x4e, 0x7b, 0xaf, 0x75, 0xb4, 0xd7, 0x69, - 0x6c, 0x6b, 0x60, 0x91, 0xdf, 0x04, 0xde, 0xde, 0x3f, 0xec, 0x18, 0xbd, 0xa3, 0x76, 0xf7, 0xa8, - 0xd9, 0x38, 0x68, 0xb6, 0xf6, 0x5a, 0xdb, 0x2c, 0xcf, 0x5f, 0x81, 0xbb, 0x07, 0x9d, 0x5e, 0xbb, - 0x73, 0x70, 0x74, 0xd0, 0x39, 0xea, 0x6c, 0x7d, 0xd4, 0x6a, 0xf6, 0xba, 0x47, 0xed, 0x83, 0x23, - 0xe4, 0xfa, 0xc8, 0x68, 0xe0, 0x1b, 0x96, 0xe3, 0x77, 0xe1, 0xb6, 0xc6, 0xea, 0xb6, 0x8c, 0xa7, - 0x2d, 0x03, 0x99, 0x3c, 0x39, 0x68, 0x3c, 0x6d, 0xb4, 0xf7, 0x1a, 0x5b, 0x7b, 0x2d, 0xb6, 0xca, - 0xef, 0x40, 0x4d, 0x63, 0x18, 0x8d, 0x5e, 0xeb, 0x68, 0xaf, 0xbd, 0xdf, 0xee, 0x1d, 0xb5, 0xbe, - 0xdb, 0x6c, 0xb5, 0xb6, 0x5b, 0xdb, 0xac, 0xc2, 0xbf, 0x02, 0x5f, 0x26, 0xa1, 0xb4, 0x10, 0xd3, - 0x1f, 0xfb, 0xa4, 0x7d, 0x78, 0xd4, 0x30, 0x9a, 0xbb, 0xed, 0xa7, 0x2d, 0xb6, 0xc6, 0x5f, 0x83, - 0x2f, 0x5d, 0x8e, 0xba, 0xdd, 0x36, 0x5a, 0xcd, 0x5e, 0xc7, 0xf8, 0x98, 0x6d, 0xf0, 0x2f, 0xc0, - 0xe7, 0x76, 0x7b, 0xfb, 0x7b, 0x47, 0xcf, 0x8c, 0xce, 0xc1, 0xa3, 0x23, 0x7a, 0xec, 0xf6, 0x8c, - 0x27, 0xcd, 0xde, 0x13, 0xa3, 0xc5, 0x80, 0xd7, 0xe0, 0xe6, 0xe1, 0xd6, 0xd1, 0x41, 0xa7, 0x77, - 0xd4, 0x38, 0xf8, 0x78, 0x6b, 0xaf, 0xd3, 0x7c, 0x7c, 0xb4, 0xd3, 0x31, 0xf6, 0x1b, 0x3d, 0x56, - 0xe6, 0x5f, 0x85, 0xd7, 0x9a, 0xdd, 0xa7, 0x5a, 0xcc, 0xce, 0xce, 0x91, 0xd1, 0x79, 0xd6, 0x3d, - 0xea, 0x18, 0x47, 0x46, 0x6b, 0x8f, 0xfa, 0xdc, 0x8d, 0x65, 0x2f, 0xf0, 0xdb, 0x50, 0x6d, 0x1f, - 0x74, 0x9f, 0xec, 0xec, 0xb4, 0x9b, 0xed, 0xd6, 0x41, 0xef, 0xe8, 0xb0, 0x65, 0xec, 0xb7, 0xbb, - 0x5d, 0x44, 0x63, 0xa5, 0xfa, 0xb7, 0x21, 0xdf, 0x76, 0xcf, 0x6c, 0x49, 0xeb, 0x4b, 0x2b, 0xa3, - 0x8e, 0xb8, 0xc2, 0x26, 0x2d, 0x0b, 0x7b, 0xe0, 0xd2, 0x8d, 0x79, 0x5a, 0x5d, 0xab, 0x46, 0x0c, - 0xa8, 0xff, 0xe3, 0x34, 0x54, 0x14, 0x8b, 0x30, 0x82, 0xbb, 0x07, 0xeb, 0x3a, 0x15, 0xda, 0x9e, - 0x36, 0x61, 0xb3, 0x60, 0xfa, 0x29, 0x2a, 0x05, 0x4a, 0x18, 0xb2, 0x24, 0x88, 0x8e, 0xd7, 0x88, - 0x39, 0x46, 0x82, 0xea, 0x60, 0x31, 0x06, 0x7c, 0x56, 0x0b, 0x86, 0xd6, 0x51, 0x21, 0xf6, 0x3d, - 0xb7, 0x19, 0x5d, 0xb6, 0x98, 0x82, 0xf1, 0x4f, 0xe0, 0x56, 0xd4, 0x6e, 0xb9, 0x7d, 0xff, 0x62, - 0x1c, 0xfd, 0x62, 0x5c, 0x61, 0x61, 0x4a, 0x61, 0xc7, 0x76, 0xc4, 0x14, 0xa2, 0x71, 0x19, 0x83, - 0xfa, 0xef, 0xa7, 0x12, 0x71, 0xaf, 0x8a, 0x6b, 0xaf, 0xb4, 0xf8, 0x8b, 0xce, 0x60, 0x30, 0xf2, - 0xd4, 0xe2, 0x6b, 0x47, 0x44, 0x37, 0xf9, 0x21, 0x70, 0x7b, 0x5e, 0xe8, 0xec, 0x92, 0x42, 0x2f, - 0xa0, 0x9d, 0x4d, 0xa1, 0xe7, 0xe6, 0x53, 0xe8, 0x77, 0x00, 0x06, 0x8e, 0x77, 0x6c, 0x3a, 0x09, - 0x47, 0x33, 0x01, 0xa9, 0x3b, 0x50, 0x0c, 0x7f, 0x97, 0x8e, 0xdf, 0x84, 0x3c, 0xfd, 0x32, 0x5d, - 0x94, 0x50, 0x54, 0x2d, 0xbe, 0x0b, 0x6b, 0x62, 0x5a, 0xe6, 0xf4, 0x92, 0x32, 0xcf, 0xd0, 0xd5, - 0xbf, 0x01, 0x1b, 0x73, 0x48, 0x38, 0x88, 0x63, 0x53, 0x46, 0x97, 0xd3, 0xf1, 0x79, 0xfe, 0x10, - 0xbb, 0xfe, 0x1f, 0xd3, 0xb0, 0xba, 0x6f, 0xba, 0xf6, 0x89, 0x08, 0x64, 0x28, 0x6d, 0xd0, 0x1f, - 0x8a, 0x91, 0x19, 0x4a, 0xab, 0x5a, 0x3a, 0xcb, 0x90, 0x4e, 0xe6, 0xef, 0xe7, 0x8e, 0x7b, 0x6e, - 0x42, 0xde, 0x9c, 0xc8, 0x61, 0x54, 0xe1, 0xad, 0x5b, 0x38, 0x77, 0x8e, 0xdd, 0x17, 0x6e, 0x10, - 0xea, 0x66, 0xd8, 0x8c, 0xcb, 0x58, 0xf2, 0x57, 0x94, 0xb1, 0x14, 0xe6, 0xc7, 0xff, 0x2e, 0x94, - 0x83, 0xbe, 0x2f, 0x84, 0x1b, 0x0c, 0x3d, 0x19, 0xfe, 0xa6, 0x61, 0x12, 0x44, 0xc5, 0x5e, 0xde, - 0x73, 0x17, 0x57, 0xe8, 0x9e, 0xed, 0x9e, 0xea, 0x1a, 0xa6, 0x29, 0x18, 0xea, 0x20, 0xe5, 0x58, - 0xec, 0x4f, 0x05, 0xc5, 0xf7, 0x39, 0x23, 0x6a, 0x53, 0x16, 0xc5, 0x94, 0x62, 0xe0, 0xf9, 0xb6, - 0x50, 0xa9, 0xc4, 0x92, 0x91, 0x80, 0x20, 0xad, 0x63, 0xba, 0x83, 0x89, 0x39, 0x10, 0xfa, 0x50, - 0x38, 0x6a, 0xd7, 0xff, 0x67, 0x0e, 0x60, 0x5f, 0x8c, 0x8e, 0x85, 0x1f, 0x0c, 0xed, 0x31, 0x1d, - 0x75, 0xd8, 0xba, 0xae, 0xb5, 0x62, 0xd0, 0x33, 0x7f, 0x6f, 0xaa, 0xe4, 0x7c, 0xfe, 0x70, 0x32, - 0x26, 0x9f, 0x4d, 0xc1, 0xe0, 0xe0, 0x98, 0x52, 0xe8, 0x0a, 0x22, 0x1a, 0xff, 0xac, 0x91, 0x04, - 0x51, 0x71, 0x97, 0x29, 0x45, 0xcb, 0xb5, 0x54, 0x8a, 0x27, 0x6b, 0x44, 0x6d, 0xba, 0xb4, 0x12, - 0x34, 0x26, 0xd2, 0x33, 0x84, 0x2b, 0x9e, 0x47, 0xf7, 0xb1, 0x62, 0x10, 0xdf, 0x87, 0xca, 0xd8, - 0xbc, 0x18, 0x09, 0x57, 0xee, 0x0b, 0x39, 0xf4, 0x2c, 0x5d, 0xee, 0xf3, 0xda, 0xe5, 0x02, 0x1e, - 0x26, 0xd1, 0x8d, 0x69, 0x6a, 0xd4, 0x09, 0x37, 0xa0, 0x55, 0xa2, 0xa6, 0x51, 0xb7, 0xf8, 0x16, - 0x80, 0x7a, 0xa2, 0xc8, 0xa9, 0xb8, 0x38, 0x13, 0x65, 0x8e, 0x44, 0x20, 0xfc, 0x33, 0x5b, 0xd9, - 0x31, 0x15, 0x1b, 0xc6, 0x54, 0x68, 0xf5, 0x26, 0x81, 0xf0, 0x5b, 0x23, 0xd3, 0x76, 0xf4, 0x04, - 0xc7, 0x00, 0xfe, 0x36, 0xdc, 0x08, 0x26, 0xc7, 0xa8, 0x33, 0xc7, 0xa2, 0xe7, 0x1d, 0x88, 0xe7, - 0x81, 0x23, 0xa4, 0x14, 0xbe, 0xae, 0x2f, 0x58, 0xfc, 0xb2, 0x3e, 0x88, 0xdc, 0x1e, 0xfa, 0xfd, - 0x0c, 0x7c, 0x8a, 0xeb, 0x96, 0x22, 0x90, 0x2e, 0xea, 0x62, 0x29, 0xce, 0x60, 0x55, 0x81, 0x74, - 0xcd, 0x57, 0x9a, 0x7f, 0x19, 0xbe, 0x38, 0x85, 0x64, 0xa8, 0x83, 0xe0, 0x60, 0xc7, 0x76, 0x4d, - 0xc7, 0xfe, 0x54, 0x1d, 0xcb, 0x67, 0xea, 0x63, 0xa8, 0x4c, 0x0d, 0x1c, 0x5d, 0x20, 0xa4, 0x27, - 0x5d, 0x05, 0xc3, 0x60, 0x55, 0xb5, 0xbb, 0xd2, 0xb7, 0xe9, 0x84, 0x23, 0x82, 0x34, 0x71, 0x9d, - 0x7b, 0x2c, 0xcd, 0xaf, 0x03, 0x53, 0x90, 0xb6, 0x6b, 0x8e, 0xc7, 0x8d, 0xf1, 0xd8, 0x11, 0x2c, - 0x43, 0x97, 0x33, 0x63, 0xa8, 0x2a, 0x3c, 0x67, 0xd9, 0xfa, 0x77, 0xe1, 0x16, 0x8d, 0xcc, 0x53, - 0xe1, 0x47, 0x81, 0xad, 0xee, 0xeb, 0x0d, 0xd8, 0x50, 0x4f, 0x07, 0x9e, 0x54, 0xaf, 0xc9, 0xd9, - 0xe3, 0xb0, 0xa6, 0xc0, 0xe8, 0xeb, 0x74, 0x05, 0x5d, 0xb9, 0x8c, 0x60, 0x11, 0x5e, 0xba, 0xfe, - 0x93, 0x3c, 0xf0, 0x58, 0x21, 0x7a, 0xb6, 0xf0, 0xb7, 0x4d, 0x69, 0x26, 0x32, 0x93, 0x95, 0x4b, - 0xcf, 0xd6, 0x5f, 0x5c, 0xb2, 0x76, 0x13, 0xf2, 0x76, 0x80, 0xa1, 0x98, 0x2e, 0x28, 0xd5, 0x2d, - 0xbe, 0x07, 0x30, 0x16, 0xbe, 0xed, 0x59, 0xa4, 0x41, 0xb9, 0x85, 0x95, 0xff, 0xf3, 0x42, 0x6d, - 0x1e, 0x46, 0x34, 0x46, 0x82, 0x1e, 0xe5, 0x50, 0x2d, 0x75, 0x52, 0x9d, 0x27, 0xa1, 0x93, 0x20, - 0xfe, 0x06, 0x5c, 0x1b, 0xfb, 0x76, 0x5f, 0xa8, 0xe9, 0x78, 0x12, 0x58, 0x4d, 0xfa, 0xd5, 0xb9, - 0x02, 0x61, 0x2e, 0x7a, 0x85, 0x1a, 0x68, 0xba, 0x14, 0xa0, 0x04, 0x74, 0x36, 0xab, 0xaf, 0x1c, - 0xab, 0x92, 0xcb, 0x8a, 0xb1, 0xf8, 0x25, 0xbf, 0x0f, 0x4c, 0xbf, 0xd8, 0xb7, 0xdd, 0x3d, 0xe1, - 0x0e, 0xe4, 0x90, 0x94, 0xbb, 0x62, 0xcc, 0xc1, 0xc9, 0x82, 0xa9, 0xdf, 0xf6, 0x51, 0xe7, 0x36, - 0x25, 0x23, 0x6a, 0xab, 0x6b, 0xec, 0x8e, 0xe7, 0x77, 0xa5, 0xaf, 0x6b, 0x47, 0xa3, 0x36, 0xfa, - 0x2c, 0x01, 0xc9, 0x7a, 0xe8, 0x7b, 0xd6, 0x84, 0x4e, 0x15, 0x94, 0x11, 0x9b, 0x05, 0xc7, 0x98, - 0xfb, 0xa6, 0xab, 0xeb, 0x06, 0x2b, 0x49, 0xcc, 0x08, 0x4c, 0x31, 0x98, 0x17, 0xc4, 0x0c, 0xd7, - 0x75, 0x0c, 0x96, 0x80, 0x69, 0x9c, 0x98, 0x15, 0x8b, 0x70, 0x62, 0x3e, 0xd4, 0x7f, 0xcb, 0xf7, - 0x6c, 0x2b, 0xe6, 0xb5, 0xa1, 0xaa, 0x3a, 0x67, 0xe1, 0x09, 0xdc, 0x98, 0x27, 0x9f, 0xc2, 0x8d, - 0xe0, 0xf5, 0x1f, 0xa4, 0x00, 0xe2, 0xc9, 0x47, 0x95, 0x8f, 0x5b, 0xf1, 0x12, 0xbf, 0x05, 0xd7, - 0x92, 0x60, 0xba, 0x1c, 0x40, 0x07, 0xbc, 0x1c, 0xd6, 0xe2, 0x17, 0xdb, 0xe6, 0x45, 0xc0, 0xd2, - 0xfa, 0x9a, 0xb0, 0x86, 0x3d, 0x13, 0x82, 0x0a, 0xe9, 0xae, 0x03, 0x8b, 0x81, 0x74, 0xf7, 0x2b, - 0x60, 0xd9, 0x69, 0xd4, 0x8f, 0x85, 0xe9, 0x07, 0x2c, 0x57, 0xdf, 0x85, 0xbc, 0x3a, 0x5c, 0x5a, - 0x70, 0x2c, 0xfc, 0x72, 0x35, 0x1e, 0x7f, 0x3d, 0x05, 0xb0, 0xad, 0x2a, 0x78, 0x71, 0x17, 0x5f, - 0x70, 0xda, 0xbe, 0xc8, 0xa3, 0x32, 0x2d, 0x8b, 0x2a, 0xa1, 0x33, 0xd1, 0x2f, 0xc6, 0x60, 0x13, - 0x35, 0xc7, 0x0c, 0x2b, 0xa7, 0xd4, 0x9a, 0x8b, 0xda, 0x6a, 0x03, 0x69, 0x7a, 0xae, 0x2b, 0xfa, - 0xb8, 0xfd, 0x44, 0x1b, 0x48, 0x04, 0xaa, 0xff, 0xdb, 0x02, 0x94, 0x9b, 0x43, 0x53, 0xee, 0x8b, - 0x20, 0x30, 0x07, 0x62, 0x4e, 0x96, 0x2a, 0x14, 0x3c, 0xdf, 0x12, 0x7e, 0x7c, 0x7f, 0x4b, 0x37, - 0x93, 0x35, 0x06, 0x99, 0xe9, 0x1a, 0x83, 0xdb, 0x50, 0x52, 0x27, 0x18, 0x56, 0x43, 0x99, 0x81, - 0x8c, 0x11, 0x03, 0x70, 0xaf, 0x1e, 0x79, 0x16, 0x19, 0xa3, 0x86, 0x4a, 0xfe, 0x67, 0x8c, 0x04, - 0x44, 0x95, 0x74, 0x8c, 0x9d, 0x8b, 0x9e, 0xa7, 0x65, 0x6a, 0x5b, 0xf1, 0x65, 0xd7, 0x69, 0x38, - 0x6f, 0x42, 0x61, 0xa4, 0x1a, 0xfa, 0x20, 0x63, 0x36, 0xe5, 0x9f, 0xe8, 0xda, 0xa6, 0xfe, 0xab, - 0xef, 0x9b, 0x18, 0x21, 0x25, 0x86, 0xe8, 0xa6, 0x94, 0x66, 0x7f, 0x38, 0xd2, 0x26, 0x22, 0xb3, - 0xe0, 0x4c, 0x33, 0xc9, 0xa8, 0x11, 0x61, 0x1b, 0x49, 0x4a, 0xbe, 0x05, 0x25, 0x5f, 0x98, 0x53, - 0xc7, 0xaa, 0xaf, 0x5c, 0xc1, 0xc6, 0x08, 0x71, 0x8d, 0x98, 0xac, 0xf6, 0xa3, 0x14, 0xac, 0x4d, - 0x0b, 0xfa, 0x27, 0xf1, 0xa3, 0x5f, 0xdf, 0x8c, 0x7f, 0xf4, 0xeb, 0x33, 0xfc, 0x80, 0xd6, 0x6f, - 0xa7, 0x00, 0xe2, 0x31, 0x40, 0x93, 0xaf, 0x7e, 0x9c, 0x28, 0x74, 0x42, 0x55, 0x8b, 0xef, 0x4e, - 0xdd, 0x81, 0x7f, 0x7b, 0xa9, 0x01, 0x4d, 0x3c, 0x26, 0xca, 0x92, 0x1f, 0xc0, 0xda, 0x34, 0x9c, - 0x7e, 0x6e, 0xa8, 0xbd, 0xd7, 0x52, 0x29, 0x8e, 0xf6, 0x7e, 0xe3, 0x51, 0x4b, 0xdf, 0xef, 0x69, - 0x1f, 0x3c, 0x66, 0xe9, 0xda, 0x1f, 0xa4, 0xa0, 0x14, 0x0d, 0x2f, 0xff, 0x4e, 0x72, 0x5e, 0x54, - 0x9d, 0xc4, 0x5b, 0xcb, 0xcc, 0x4b, 0xfc, 0xd4, 0x72, 0xa5, 0x7f, 0x91, 0x9c, 0x26, 0x0f, 0xd6, - 0xa6, 0x5f, 0x2e, 0xb0, 0x09, 0x8f, 0xa6, 0x6d, 0xc2, 0x9b, 0x4b, 0x7d, 0x32, 0x8c, 0xbc, 0xf6, - 0xec, 0x40, 0x6a, 0x73, 0xf1, 0x7e, 0xfa, 0xbd, 0x54, 0xed, 0x2e, 0xac, 0x26, 0x5f, 0xcd, 0x5f, - 0xe2, 0xbb, 0xff, 0x07, 0x19, 0x58, 0x9b, 0x2e, 0x35, 0xa0, 0x2b, 0x43, 0xaa, 0xcc, 0xa5, 0xe3, - 0x58, 0x89, 0x4a, 0x6e, 0xc6, 0xd7, 0xa1, 0xac, 0x63, 0x3b, 0x02, 0x6c, 0x50, 0x12, 0xc5, 0x1b, - 0x09, 0x76, 0x37, 0xf9, 0xc3, 0x86, 0x6f, 0x70, 0x08, 0x2f, 0x73, 0xb1, 0x31, 0x2f, 0xe9, 0x9f, - 0x78, 0xfa, 0xe5, 0x34, 0xaf, 0x24, 0xea, 0x89, 0x7f, 0x88, 0x8e, 0xcd, 0xfa, 0xd6, 0xc4, 0xb5, - 0x1c, 0x61, 0x45, 0xd0, 0x1f, 0x25, 0xa1, 0x51, 0x75, 0xf0, 0x2f, 0x67, 0xf9, 0x1a, 0x94, 0xba, - 0x93, 0x63, 0x5d, 0x19, 0xfc, 0x97, 0xb2, 0xfc, 0x26, 0x6c, 0x68, 0xac, 0xb8, 0xc4, 0x8f, 0xfd, - 0x65, 0x34, 0xc1, 0x6b, 0x0d, 0x35, 0x5e, 0x5a, 0x50, 0xf6, 0x57, 0xb2, 0x28, 0x02, 0xdd, 0x11, - 0xfe, 0xab, 0xc4, 0x27, 0xba, 0x51, 0xc1, 0x7e, 0x25, 0xcb, 0xd7, 0x01, 0xba, 0xbd, 0xe8, 0x43, - 0xbf, 0x96, 0xe5, 0x65, 0xc8, 0x77, 0x7b, 0xc4, 0xed, 0x07, 0x59, 0x7e, 0x03, 0x58, 0xfc, 0x56, - 0x17, 0x3e, 0xfe, 0xba, 0x12, 0x26, 0xaa, 0x64, 0xfc, 0x8d, 0x2c, 0xf6, 0x2b, 0x1c, 0x65, 0xf6, - 0x37, 0xb3, 0x9c, 0x41, 0x39, 0x91, 0x9a, 0x63, 0x7f, 0x2b, 0xcb, 0x39, 0x54, 0xf6, 0xed, 0x20, - 0xb0, 0xdd, 0x81, 0xee, 0xc1, 0xaf, 0xd2, 0x97, 0x77, 0xa2, 0x4b, 0x21, 0xec, 0x37, 0xb3, 0xfc, - 0x16, 0xf0, 0xe4, 0x71, 0x84, 0x7e, 0xf1, 0xb7, 0x89, 0x5a, 0x99, 0xfd, 0x40, 0xc3, 0xfe, 0x0e, - 0x51, 0xa3, 0x26, 0x68, 0xc0, 0x6f, 0xd1, 0x80, 0x34, 0xe3, 0x52, 0x49, 0x0d, 0xff, 0x21, 0x11, - 0x87, 0x93, 0xa9, 0x60, 0x3f, 0xca, 0xde, 0xff, 0x09, 0xa5, 0x93, 0x93, 0x15, 0x47, 0x7c, 0x15, - 0x8a, 0x8e, 0xe7, 0x0e, 0xa4, 0xfa, 0x41, 0xc9, 0x0a, 0x94, 0x82, 0xa1, 0xe7, 0x4b, 0x6a, 0xd2, - 0xad, 0x35, 0x97, 0xee, 0x2f, 0xab, 0x72, 0x72, 0x15, 0xa4, 0xa8, 0xf4, 0x9c, 0x34, 0x07, 0xac, - 0x1c, 0x15, 0x79, 0x66, 0xa3, 0x42, 0x54, 0xba, 0x47, 0x1d, 0xde, 0x53, 0x65, 0x79, 0x44, 0x9d, - 0xf8, 0x8e, 0x2a, 0x48, 0x15, 0xe8, 0xa0, 0xaa, 0x5f, 0x8e, 0x1b, 0x0f, 0xd1, 0x0f, 0x2e, 0x29, - 0xa8, 0xf7, 0x3d, 0x5b, 0xdd, 0x80, 0xd4, 0xf5, 0x5d, 0x16, 0xca, 0x11, 0x95, 0x30, 0x30, 0x71, - 0xff, 0x37, 0x52, 0xb0, 0x1a, 0xde, 0x1e, 0xb6, 0x07, 0xb6, 0xab, 0x4a, 0x5a, 0xc3, 0x9f, 0xe9, - 0xec, 0x3b, 0xf6, 0x38, 0xfc, 0xd9, 0xbb, 0x75, 0x28, 0x5b, 0xbe, 0x39, 0x68, 0xb8, 0xd6, 0xb6, - 0xef, 0x8d, 0x95, 0xd8, 0xea, 0xc0, 0x49, 0x95, 0xd2, 0x3e, 0x17, 0xc7, 0x88, 0x3e, 0x16, 0x3e, - 0xcb, 0x52, 0xed, 0xd8, 0xd0, 0xf4, 0x6d, 0x77, 0xd0, 0x3a, 0x97, 0xc2, 0x0d, 0x54, 0x49, 0x6d, - 0x19, 0x0a, 0x93, 0x40, 0xf4, 0xcd, 0x40, 0xb0, 0x3c, 0x36, 0x8e, 0x27, 0xb6, 0x23, 0x6d, 0x57, - 0xfd, 0xda, 0x5c, 0x54, 0x33, 0x5b, 0xbc, 0xff, 0xbb, 0x29, 0x28, 0x93, 0x36, 0xc4, 0x99, 0xd4, - 0xd8, 0xd3, 0x28, 0x43, 0x61, 0x2f, 0xfa, 0xb5, 0xb1, 0x3c, 0xa4, 0x3b, 0xa7, 0x2a, 0x93, 0xaa, - 0xb5, 0x41, 0xdd, 0xfd, 0x53, 0x3f, 0x3c, 0x96, 0xe5, 0x9f, 0x83, 0x1b, 0x86, 0x18, 0x79, 0x52, - 0x3c, 0x33, 0x6d, 0x99, 0xbc, 0x4e, 0x92, 0xc3, 0xa0, 0x44, 0xbd, 0x0a, 0xef, 0x8f, 0xe4, 0x29, - 0x28, 0xc1, 0xcf, 0x86, 0x90, 0x02, 0x76, 0x9a, 0x20, 0x3a, 0x4a, 0x29, 0x46, 0x28, 0x1f, 0x79, - 0xb6, 0x8b, 0x5f, 0xa3, 0x1b, 0xa7, 0x04, 0xa1, 0x94, 0x3c, 0x82, 0xe0, 0xfe, 0x01, 0xdc, 0x5c, - 0x9c, 0x48, 0x56, 0x77, 0x51, 0xe9, 0x27, 0x6e, 0xe9, 0x82, 0xc1, 0x33, 0xdf, 0x56, 0x57, 0x0a, - 0x4b, 0x90, 0xeb, 0x3c, 0x77, 0x49, 0x1b, 0x36, 0xa0, 0x72, 0xe0, 0x25, 0x68, 0x58, 0xe6, 0x7e, - 0x7f, 0x2a, 0xf7, 0x1f, 0x0f, 0x4a, 0x28, 0xc4, 0x4a, 0xe2, 0xf2, 0x4c, 0x4a, 0x65, 0x95, 0xe9, - 0xbf, 0x14, 0xa8, 0x7b, 0xfa, 0x3a, 0xe7, 0x6e, 0xa9, 0x7b, 0xfa, 0x91, 0x98, 0x59, 0xf5, 0xf3, - 0x43, 0x6e, 0x5f, 0x38, 0xc2, 0x62, 0xb9, 0xfb, 0xef, 0xc1, 0xba, 0xee, 0x6a, 0x5f, 0x04, 0x41, - 0x78, 0xf9, 0xe4, 0xd0, 0xb7, 0xcf, 0xd4, 0x6f, 0x01, 0xac, 0x42, 0xf1, 0x50, 0xf8, 0x81, 0xe7, - 0xd2, 0xef, 0x20, 0x00, 0xe4, 0xbb, 0x43, 0xd3, 0xc7, 0x6f, 0xdc, 0x6f, 0x42, 0x89, 0x2e, 0xa3, - 0x3c, 0xb6, 0x5d, 0x0b, 0x7b, 0xb2, 0xa5, 0xeb, 0xaf, 0xe9, 0x07, 0x67, 0xce, 0xa8, 0x7f, 0x45, - 0xf5, 0x43, 0x9b, 0x2c, 0xcd, 0x6f, 0x02, 0xc7, 0xa0, 0x79, 0x64, 0xd2, 0xed, 0x46, 0xe7, 0x42, - 0xfd, 0x28, 0x6b, 0xe6, 0xfe, 0xb7, 0x80, 0xab, 0xd4, 0x8f, 0x25, 0xce, 0x6d, 0x77, 0x10, 0x5d, - 0x9c, 0x06, 0xfa, 0x15, 0x04, 0x4b, 0x9c, 0x53, 0x64, 0x55, 0x86, 0x42, 0xd8, 0x08, 0x7f, 0x8b, - 0x61, 0xc7, 0x9b, 0xb8, 0x28, 0xc5, 0x53, 0xb8, 0xae, 0x74, 0x06, 0xc5, 0xa2, 0xab, 0x73, 0x97, - 0xc6, 0xa3, 0xea, 0x26, 0x91, 0x9c, 0x04, 0x11, 0x2e, 0x4b, 0xa1, 0x60, 0x51, 0x2c, 0x17, 0xc3, - 0xd3, 0xf7, 0xeb, 0x70, 0x6d, 0x41, 0x40, 0x4d, 0xc6, 0x59, 0x85, 0x15, 0x6c, 0xe5, 0xfe, 0x87, - 0xb0, 0xa1, 0xcc, 0xc9, 0x81, 0xba, 0xdc, 0x14, 0xee, 0x8c, 0xcf, 0xda, 0x3b, 0x6d, 0x35, 0x74, - 0xcd, 0xd6, 0xde, 0xde, 0x93, 0xbd, 0x86, 0xc1, 0x52, 0x34, 0xc1, 0x9d, 0xde, 0x51, 0xb3, 0x73, - 0x70, 0xd0, 0x6a, 0xf6, 0x5a, 0xdb, 0x2c, 0xbd, 0x75, 0xff, 0xdf, 0xfd, 0xec, 0x4e, 0xea, 0xa7, - 0x3f, 0xbb, 0x93, 0xfa, 0xaf, 0x3f, 0xbb, 0x93, 0xfa, 0xc1, 0xcf, 0xef, 0xac, 0xfc, 0xf4, 0xe7, - 0x77, 0x56, 0xfe, 0xf3, 0xcf, 0xef, 0xac, 0x7c, 0xc2, 0x66, 0xff, 0x73, 0xc8, 0x71, 0x9e, 0x3c, - 0xd9, 0xb7, 0xfe, 0x5f, 0x00, 0x00, 0x00, 0xff, 0xff, 0xc3, 0xfd, 0xf9, 0xc4, 0x54, 0x64, 0x00, - 0x00, + // 8935 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xcc, 0x7d, 0x5b, 0x6c, 0x24, 0xc9, + 0x91, 0x18, 0xfb, 0xdd, 0x1d, 0xcd, 0x26, 0x93, 0x39, 0xaf, 0x56, 0x6b, 0x34, 0x1e, 0xb5, 0x56, + 0xbb, 0xa3, 0xd1, 0x8a, 0xb3, 0x3b, 0xbb, 0xab, 0x5d, 0xed, 0x69, 0x57, 0x6a, 0x36, 0x9b, 0xc3, + 0xde, 0x21, 0xd9, 0x54, 0x75, 0xcf, 0x8c, 0x76, 0x71, 0x67, 0xba, 0xd8, 0x95, 0xec, 0x2e, 0xb1, + 0xba, 0xaa, 0x55, 0x95, 0xcd, 0x21, 0x17, 0xb6, 0x71, 0x7e, 0xdd, 0xf9, 0xfe, 0x74, 0xb6, 0xcf, + 0xf6, 0xc1, 0x30, 0x4e, 0xfa, 0x33, 0x7c, 0x82, 0x5f, 0x80, 0xe0, 0x07, 0x7c, 0x80, 0x7d, 0x1f, + 0xb6, 0x01, 0xff, 0xc8, 0xf6, 0x8f, 0xff, 0x6c, 0x48, 0x80, 0x7f, 0x0c, 0xfb, 0x70, 0xf6, 0xcf, + 0xc1, 0xf0, 0x87, 0x11, 0x91, 0x59, 0x8f, 0x7e, 0x90, 0xd3, 0xb3, 0x77, 0x67, 0xdc, 0x17, 0x2b, + 0xa3, 0x22, 0xa2, 0x22, 0x33, 0x23, 0x23, 0x23, 0x22, 0x23, 0x9b, 0xf0, 0xca, 0xf8, 0x74, 0xf0, + 0xc0, 0xb1, 0x8f, 0x1f, 0x8c, 0x8f, 0x1f, 0x8c, 0x3c, 0x4b, 0x38, 0x0f, 0xc6, 0xbe, 0x27, 0xbd, + 0x40, 0x35, 0x82, 0x4d, 0x6a, 0xf1, 0x8a, 0xe9, 0x5e, 0xc8, 0x8b, 0xb1, 0xd8, 0x24, 0x68, 0xed, + 0xf6, 0xc0, 0xf3, 0x06, 0x8e, 0x50, 0xa8, 0xc7, 0x93, 0x93, 0x07, 0x81, 0xf4, 0x27, 0x7d, 0xa9, + 0x90, 0xeb, 0x3f, 0xcd, 0xc2, 0xcd, 0xee, 0xc8, 0xf4, 0xe5, 0x96, 0xe3, 0xf5, 0x4f, 0xbb, 0xae, + 0x39, 0x0e, 0x86, 0x9e, 0xdc, 0x32, 0x03, 0xc1, 0x5f, 0x87, 0xfc, 0x31, 0x02, 0x83, 0x6a, 0xea, + 0x6e, 0xe6, 0x5e, 0xf9, 0xe1, 0xf5, 0xcd, 0x29, 0xc6, 0x9b, 0x44, 0x61, 0x68, 0x1c, 0xfe, 0x26, + 0x14, 0x2c, 0x21, 0x4d, 0xdb, 0x09, 0xaa, 0xe9, 0xbb, 0xa9, 0x7b, 0xe5, 0x87, 0xb7, 0x36, 0xd5, + 0x87, 0x37, 0xc3, 0x0f, 0x6f, 0x76, 0xe9, 0xc3, 0x46, 0x88, 0xc7, 0xdf, 0x85, 0xe2, 0x89, 0xed, + 0x88, 0xc7, 0xe2, 0x22, 0xa8, 0x66, 0xae, 0xa4, 0xd9, 0x4a, 0x57, 0x53, 0x46, 0x84, 0xcc, 0x9b, + 0xb0, 0x26, 0xce, 0xa5, 0x6f, 0x1a, 0xc2, 0x31, 0xa5, 0xed, 0xb9, 0x41, 0x35, 0x4b, 0x12, 0xde, + 0x9a, 0x91, 0x30, 0x7c, 0x4f, 0xe4, 0x33, 0x24, 0xfc, 0x2e, 0x94, 0xbd, 0xe3, 0xef, 0x89, 0xbe, + 0xec, 0x5d, 0x8c, 0x45, 0x50, 0xcd, 0xdd, 0xcd, 0xdc, 0x2b, 0x19, 0x49, 0x10, 0xff, 0x06, 0x94, + 0xfb, 0x9e, 0xe3, 0x88, 0xbe, 0xfa, 0x46, 0xfe, 0xea, 0x6e, 0x25, 0x71, 0xf9, 0xdb, 0x70, 0xc3, + 0x17, 0x23, 0xef, 0x4c, 0x58, 0xcd, 0x08, 0x4a, 0xfd, 0x2c, 0xd2, 0x67, 0x16, 0xbf, 0xe4, 0x0d, + 0xa8, 0xf8, 0x5a, 0xbe, 0x3d, 0xdb, 0x3d, 0x0d, 0xaa, 0x05, 0xea, 0xd6, 0xe7, 0x2f, 0xe9, 0x16, + 0xe2, 0x18, 0xd3, 0x14, 0x9c, 0x41, 0xe6, 0x54, 0x5c, 0x54, 0x4b, 0x77, 0x53, 0xf7, 0x4a, 0x06, + 0x3e, 0xf2, 0xf7, 0xa1, 0xea, 0xf9, 0xf6, 0xc0, 0x76, 0x4d, 0xa7, 0xe9, 0x0b, 0x53, 0x0a, 0xab, + 0x67, 0x8f, 0x44, 0x20, 0xcd, 0xd1, 0xb8, 0x0a, 0x77, 0x53, 0xf7, 0x32, 0xc6, 0xa5, 0xef, 0xf9, + 0x5b, 0x6a, 0x86, 0xda, 0xee, 0x89, 0x57, 0x2d, 0xeb, 0xee, 0x4f, 0xcb, 0xb2, 0xa3, 0x5f, 0x1b, + 0x11, 0x62, 0xfd, 0x0f, 0xd2, 0x90, 0xef, 0x0a, 0xd3, 0xef, 0x0f, 0x6b, 0xbf, 0x9a, 0x82, 0xbc, + 0x21, 0x82, 0x89, 0x23, 0x79, 0x0d, 0x8a, 0x6a, 0x6c, 0xdb, 0x56, 0x35, 0x45, 0xd2, 0x45, 0xed, + 0xcf, 0xa2, 0x3b, 0x9b, 0x90, 0x1d, 0x09, 0x69, 0x56, 0x33, 0x34, 0x42, 0xb5, 0x19, 0xa9, 0xd4, + 0xe7, 0x37, 0xf7, 0x85, 0x34, 0x0d, 0xc2, 0xab, 0xfd, 0x3c, 0x05, 0x59, 0x6c, 0xf2, 0xdb, 0x50, + 0x1a, 0xda, 0x83, 0xa1, 0x63, 0x0f, 0x86, 0x52, 0x0b, 0x12, 0x03, 0xf8, 0x87, 0xb0, 0x1e, 0x35, + 0x0c, 0xd3, 0x1d, 0x08, 0x94, 0x68, 0x91, 0xf2, 0xd3, 0x4b, 0x63, 0x16, 0x99, 0x57, 0xa1, 0x40, + 0xeb, 0xa1, 0x6d, 0x91, 0x46, 0x97, 0x8c, 0xb0, 0x89, 0xea, 0x16, 0xce, 0xd4, 0x63, 0x71, 0x51, + 0xcd, 0xd2, 0xdb, 0x24, 0x88, 0x37, 0x60, 0x3d, 0x6c, 0x6e, 0xeb, 0xd1, 0xc8, 0x5d, 0x3d, 0x1a, + 0xb3, 0xf8, 0xf5, 0x7f, 0xb4, 0x07, 0x39, 0x5a, 0x96, 0x7c, 0x0d, 0xd2, 0x76, 0x38, 0xd0, 0x69, + 0xdb, 0xe2, 0x0f, 0x20, 0x7f, 0x62, 0x0b, 0xc7, 0x7a, 0xe1, 0x08, 0x6b, 0x34, 0xde, 0x82, 0x55, + 0x5f, 0x04, 0xd2, 0xb7, 0xb5, 0xf6, 0xab, 0x05, 0xfa, 0xc5, 0x45, 0x36, 0x60, 0xd3, 0x48, 0x20, + 0x1a, 0x53, 0x64, 0xd8, 0xed, 0xfe, 0xd0, 0x76, 0x2c, 0x5f, 0xb8, 0x6d, 0x4b, 0xad, 0xd3, 0x92, + 0x91, 0x04, 0xf1, 0x7b, 0xb0, 0x7e, 0x6c, 0xf6, 0x4f, 0x07, 0xbe, 0x37, 0x71, 0x71, 0x41, 0x78, + 0x3e, 0x75, 0xbb, 0x64, 0xcc, 0x82, 0xf9, 0x1b, 0x90, 0x33, 0x1d, 0x7b, 0xe0, 0xd2, 0x4a, 0x5c, + 0x9b, 0x9b, 0x74, 0x25, 0x4b, 0x03, 0x31, 0x0c, 0x85, 0xc8, 0x77, 0xa1, 0x72, 0x26, 0x7c, 0x69, + 0xf7, 0x4d, 0x87, 0xe0, 0xd5, 0x02, 0x51, 0xd6, 0x17, 0x52, 0x3e, 0x4d, 0x62, 0x1a, 0xd3, 0x84, + 0xbc, 0x0d, 0x10, 0xa0, 0x99, 0xa4, 0xe9, 0xd4, 0x6b, 0xe1, 0xb5, 0x85, 0x6c, 0x9a, 0x9e, 0x2b, + 0x85, 0x2b, 0x37, 0xbb, 0x11, 0xfa, 0xee, 0x8a, 0x91, 0x20, 0xe6, 0xef, 0x42, 0x56, 0x8a, 0x73, + 0x59, 0x5d, 0xbb, 0x62, 0x44, 0x43, 0x26, 0x3d, 0x71, 0x2e, 0x77, 0x57, 0x0c, 0x22, 0x40, 0x42, + 0x5c, 0x64, 0xd5, 0xf5, 0x25, 0x08, 0x71, 0x5d, 0x22, 0x21, 0x12, 0xf0, 0x0f, 0x20, 0xef, 0x98, + 0x17, 0xde, 0x44, 0x56, 0x19, 0x91, 0x7e, 0xe9, 0x4a, 0xd2, 0x3d, 0x42, 0xdd, 0x5d, 0x31, 0x34, + 0x11, 0x7f, 0x1b, 0x32, 0x96, 0x7d, 0x56, 0xdd, 0x20, 0xda, 0xbb, 0x57, 0xd2, 0x6e, 0xdb, 0x67, + 0xbb, 0x2b, 0x06, 0xa2, 0xf3, 0x26, 0x14, 0x8f, 0x3d, 0xef, 0x74, 0x64, 0xfa, 0xa7, 0x55, 0x4e, + 0xa4, 0x5f, 0xbe, 0x92, 0x74, 0x4b, 0x23, 0xef, 0xae, 0x18, 0x11, 0x21, 0x76, 0xd9, 0xee, 0x7b, + 0x6e, 0xf5, 0xda, 0x12, 0x5d, 0x6e, 0xf7, 0x3d, 0x17, 0xbb, 0x8c, 0x04, 0x48, 0xe8, 0xd8, 0xee, + 0x69, 0xf5, 0xfa, 0x12, 0x84, 0x68, 0x39, 0x91, 0x10, 0x09, 0x50, 0x6c, 0xcb, 0x94, 0xe6, 0x99, + 0x2d, 0x9e, 0x57, 0x6f, 0x2c, 0x21, 0xf6, 0xb6, 0x46, 0x46, 0xb1, 0x43, 0x42, 0x64, 0x12, 0x2e, + 0xcd, 0xea, 0xcd, 0x25, 0x98, 0x84, 0x16, 0x1d, 0x99, 0x84, 0x84, 0xfc, 0x4f, 0xc3, 0xc6, 0x89, + 0x30, 0xe5, 0xc4, 0x17, 0x56, 0xbc, 0xd1, 0xdd, 0x22, 0x6e, 0x9b, 0x57, 0xcf, 0xfd, 0x2c, 0xd5, + 0xee, 0x8a, 0x31, 0xcf, 0x8a, 0xbf, 0x0f, 0x39, 0xc7, 0x94, 0xe2, 0xbc, 0x5a, 0x25, 0x9e, 0xf5, + 0x17, 0x28, 0x85, 0x14, 0xe7, 0xbb, 0x2b, 0x86, 0x22, 0xe1, 0xdf, 0x85, 0x75, 0x69, 0x1e, 0x3b, + 0xa2, 0x73, 0xa2, 0x11, 0x82, 0xea, 0xe7, 0x88, 0xcb, 0xeb, 0x57, 0xab, 0xf3, 0x34, 0xcd, 0xee, + 0x8a, 0x31, 0xcb, 0x06, 0xa5, 0x22, 0x50, 0xb5, 0xb6, 0x84, 0x54, 0xc4, 0x0f, 0xa5, 0x22, 0x12, + 0xbe, 0x07, 0x65, 0x7a, 0x68, 0x7a, 0xce, 0x64, 0xe4, 0x56, 0x3f, 0x4f, 0x1c, 0xee, 0xbd, 0x98, + 0x83, 0xc2, 0xdf, 0x5d, 0x31, 0x92, 0xe4, 0x38, 0x89, 0xd4, 0x34, 0xbc, 0xe7, 0xd5, 0xdb, 0x4b, + 0x4c, 0x62, 0x4f, 0x23, 0xe3, 0x24, 0x86, 0x84, 0xb8, 0xf4, 0x9e, 0xdb, 0xd6, 0x40, 0xc8, 0xea, + 0x17, 0x96, 0x58, 0x7a, 0xcf, 0x08, 0x15, 0x97, 0x9e, 0x22, 0x42, 0x35, 0xee, 0x0f, 0x4d, 0x59, + 0xbd, 0xb3, 0x84, 0x1a, 0x37, 0x87, 0x26, 0xd9, 0x0a, 0x24, 0xa8, 0x7d, 0x0a, 0xab, 0x49, 0xab, + 0xcc, 0x39, 0x64, 0x7d, 0x61, 0xaa, 0x1d, 0xa1, 0x68, 0xd0, 0x33, 0xc2, 0x84, 0x65, 0x4b, 0xda, + 0x11, 0x8a, 0x06, 0x3d, 0xf3, 0x9b, 0x90, 0x57, 0xbe, 0x09, 0x19, 0xfc, 0xa2, 0xa1, 0x5b, 0x88, + 0x6b, 0xf9, 0xe6, 0x80, 0xf6, 0xad, 0xa2, 0x41, 0xcf, 0x88, 0x6b, 0xf9, 0xde, 0xb8, 0xe3, 0x92, + 0xc1, 0x2e, 0x1a, 0xba, 0x55, 0xfb, 0xeb, 0x1f, 0x40, 0x41, 0x0b, 0x55, 0xfb, 0xbb, 0x29, 0xc8, + 0x2b, 0x83, 0xc2, 0xbf, 0x05, 0xb9, 0x40, 0x5e, 0x38, 0x82, 0x64, 0x58, 0x7b, 0xf8, 0x95, 0x25, + 0x8c, 0xd0, 0x66, 0x17, 0x09, 0x0c, 0x45, 0x57, 0x37, 0x20, 0x47, 0x6d, 0x5e, 0x80, 0x8c, 0xe1, + 0x3d, 0x67, 0x2b, 0x1c, 0x20, 0xaf, 0x26, 0x8b, 0xa5, 0x10, 0xb8, 0x6d, 0x9f, 0xb1, 0x34, 0x02, + 0x77, 0x85, 0x69, 0x09, 0x9f, 0x65, 0x78, 0x05, 0x4a, 0xe1, 0xb4, 0x04, 0x2c, 0xcb, 0x19, 0xac, + 0x26, 0x26, 0x3c, 0x60, 0xb9, 0xda, 0xff, 0xca, 0x42, 0x16, 0xd7, 0x3f, 0x7f, 0x05, 0x2a, 0xd2, + 0xf4, 0x07, 0x42, 0x39, 0xc2, 0x91, 0x93, 0x32, 0x0d, 0xe4, 0x1f, 0x84, 0x7d, 0x48, 0x53, 0x1f, + 0x5e, 0x7b, 0xa1, 0x5d, 0x99, 0xea, 0x41, 0x62, 0x17, 0xce, 0x2c, 0xb7, 0x0b, 0xef, 0x40, 0x11, + 0xcd, 0x59, 0xd7, 0xfe, 0x54, 0xd0, 0xd0, 0xaf, 0x3d, 0xbc, 0xff, 0xe2, 0x4f, 0xb6, 0x35, 0x85, + 0x11, 0xd1, 0xf2, 0x36, 0x94, 0xfa, 0xa6, 0x6f, 0x91, 0x30, 0x34, 0x5b, 0x6b, 0x0f, 0xbf, 0xfa, + 0x62, 0x46, 0xcd, 0x90, 0xc4, 0x88, 0xa9, 0x79, 0x07, 0xca, 0x96, 0x08, 0xfa, 0xbe, 0x3d, 0x26, + 0xf3, 0xa6, 0xf6, 0xe2, 0xaf, 0xbd, 0x98, 0xd9, 0x76, 0x4c, 0x64, 0x24, 0x39, 0xa0, 0x47, 0xe6, + 0x47, 0xf6, 0xad, 0x40, 0x0e, 0x42, 0x0c, 0xa8, 0xbf, 0x0b, 0xc5, 0xb0, 0x3f, 0x7c, 0x15, 0x8a, + 0xf8, 0xf7, 0xc0, 0x73, 0x05, 0x5b, 0xc1, 0xb9, 0xc5, 0x56, 0x77, 0x64, 0x3a, 0x0e, 0x4b, 0xf1, + 0x35, 0x00, 0x6c, 0xee, 0x0b, 0xcb, 0x9e, 0x8c, 0x58, 0xba, 0xfe, 0x0b, 0xa1, 0xb6, 0x14, 0x21, + 0x7b, 0x68, 0x0e, 0x90, 0x62, 0x15, 0x8a, 0xa1, 0xb9, 0x66, 0x29, 0xa4, 0xdf, 0x36, 0x83, 0xe1, + 0xb1, 0x67, 0xfa, 0x16, 0x4b, 0xf3, 0x32, 0x14, 0x1a, 0x7e, 0x7f, 0x68, 0x9f, 0x09, 0x96, 0xa9, + 0x3f, 0x80, 0x72, 0x42, 0x5e, 0x64, 0xa1, 0x3f, 0x5a, 0x82, 0x5c, 0xc3, 0xb2, 0x84, 0xc5, 0x52, + 0x48, 0xa0, 0x3b, 0xc8, 0xd2, 0xf5, 0xaf, 0x42, 0x29, 0x1a, 0x2d, 0x44, 0xc7, 0x8d, 0x9b, 0xad, + 0xe0, 0x13, 0x82, 0x59, 0x0a, 0xb5, 0xb2, 0xed, 0x3a, 0xb6, 0x2b, 0x58, 0xba, 0xf6, 0x67, 0x48, + 0x55, 0xf9, 0x37, 0xa7, 0x17, 0xc4, 0xab, 0x2f, 0xda, 0x59, 0xa7, 0x57, 0xc3, 0xe7, 0x13, 0xfd, + 0xdb, 0xb3, 0x49, 0xb8, 0x22, 0x64, 0xb7, 0x3d, 0x19, 0xb0, 0x54, 0xed, 0xbf, 0xa7, 0xa1, 0x18, + 0x6e, 0xa8, 0x18, 0x13, 0x4c, 0x7c, 0x47, 0x2b, 0x34, 0x3e, 0xf2, 0xeb, 0x90, 0x93, 0xb6, 0xd4, + 0x6a, 0x5c, 0x32, 0x54, 0x03, 0x7d, 0xb5, 0xe4, 0xcc, 0x2a, 0x07, 0x76, 0x76, 0xaa, 0xec, 0x91, + 0x39, 0x10, 0xbb, 0x66, 0x30, 0xd4, 0x2e, 0x6c, 0x0c, 0x40, 0xfa, 0x13, 0xf3, 0x0c, 0x75, 0x8e, + 0xde, 0x2b, 0x2f, 0x2e, 0x09, 0xe2, 0x6f, 0x41, 0x16, 0x3b, 0xa8, 0x95, 0xe6, 0x4f, 0xcd, 0x74, + 0x18, 0xd5, 0xe4, 0xd0, 0x17, 0x38, 0x3d, 0x9b, 0x18, 0x81, 0x19, 0x84, 0xcc, 0x5f, 0x85, 0x35, + 0xb5, 0x08, 0x3b, 0x61, 0xfc, 0x50, 0x20, 0xce, 0x33, 0x50, 0xde, 0xc0, 0xe1, 0x34, 0xa5, 0xa8, + 0x16, 0x97, 0xd0, 0xef, 0x70, 0x70, 0x36, 0xbb, 0x48, 0x62, 0x28, 0xca, 0xfa, 0x3b, 0x38, 0xa6, + 0xa6, 0x14, 0x38, 0xcd, 0xad, 0xd1, 0x58, 0x5e, 0x28, 0xa5, 0xd9, 0x11, 0xb2, 0x3f, 0xb4, 0xdd, + 0x01, 0x4b, 0xa9, 0x21, 0xc6, 0x49, 0x24, 0x14, 0xdf, 0xf7, 0x7c, 0x96, 0xa9, 0xd5, 0x20, 0x8b, + 0x3a, 0x8a, 0x46, 0xd2, 0x35, 0x47, 0x42, 0x8f, 0x34, 0x3d, 0xd7, 0xae, 0xc1, 0xc6, 0xdc, 0x7e, + 0x5c, 0xfb, 0xe7, 0x79, 0xa5, 0x21, 0x48, 0x41, 0xbe, 0xa0, 0xa6, 0x20, 0x37, 0xef, 0xa5, 0x6c, + 0x0c, 0x72, 0x99, 0xb6, 0x31, 0x1f, 0x40, 0x0e, 0x3b, 0x16, 0x9a, 0x98, 0x25, 0xc8, 0xf7, 0x11, + 0xdd, 0x50, 0x54, 0x18, 0xc1, 0xf4, 0x87, 0xa2, 0x7f, 0x2a, 0x2c, 0x6d, 0xeb, 0xc3, 0x26, 0x2a, + 0x4d, 0x3f, 0xe1, 0x9e, 0xab, 0x06, 0xa9, 0x44, 0xdf, 0x73, 0x5b, 0x23, 0xef, 0x7b, 0x36, 0xcd, + 0x2b, 0xaa, 0x44, 0x08, 0x08, 0xdf, 0xb6, 0x51, 0x47, 0xf4, 0xb4, 0xc5, 0x80, 0x5a, 0x0b, 0x72, + 0xf4, 0x6d, 0x5c, 0x09, 0x4a, 0x66, 0x95, 0x69, 0x78, 0x75, 0x39, 0x99, 0xb5, 0xc8, 0xb5, 0x1f, + 0xa7, 0x21, 0x8b, 0x6d, 0x7e, 0x1f, 0x72, 0x3e, 0xc6, 0x61, 0x34, 0x9c, 0x97, 0xc5, 0x6c, 0x0a, + 0x85, 0x7f, 0x4b, 0xab, 0x62, 0x7a, 0x09, 0x65, 0x89, 0xbe, 0x98, 0x54, 0xcb, 0xeb, 0x90, 0x1b, + 0x9b, 0xbe, 0x39, 0xd2, 0xeb, 0x44, 0x35, 0xea, 0x3f, 0x4c, 0x41, 0x16, 0x91, 0xf8, 0x06, 0x54, + 0xba, 0xd2, 0xb7, 0x4f, 0x85, 0x1c, 0xfa, 0xde, 0x64, 0x30, 0x54, 0x9a, 0xf4, 0x58, 0x5c, 0x28, + 0x7b, 0xa3, 0x0c, 0x82, 0x34, 0x1d, 0xbb, 0xcf, 0xd2, 0xa8, 0x55, 0x5b, 0x9e, 0x63, 0xb1, 0x0c, + 0x5f, 0x87, 0xf2, 0x13, 0xd7, 0x12, 0x7e, 0xd0, 0xf7, 0x7c, 0x61, 0xb1, 0xac, 0x5e, 0xdd, 0xa7, + 0x2c, 0x47, 0x7b, 0x99, 0x38, 0x97, 0x14, 0x0b, 0xb1, 0x3c, 0xbf, 0x06, 0xeb, 0x5b, 0xd3, 0x01, + 0x12, 0x2b, 0xa0, 0x4d, 0xda, 0x17, 0x2e, 0x2a, 0x19, 0x2b, 0x2a, 0x25, 0xf6, 0xbe, 0x67, 0xb3, + 0x12, 0x7e, 0x4c, 0xad, 0x13, 0x06, 0xf5, 0x7f, 0x99, 0x0a, 0x2d, 0x47, 0x05, 0x4a, 0x87, 0xa6, + 0x6f, 0x0e, 0x7c, 0x73, 0x8c, 0xf2, 0x95, 0xa1, 0xa0, 0x36, 0xce, 0x37, 0x95, 0x75, 0x53, 0x8d, + 0x87, 0xca, 0x36, 0xaa, 0xc6, 0x5b, 0x2c, 0x13, 0x37, 0xde, 0x66, 0x59, 0xfc, 0xc6, 0x77, 0x26, + 0x9e, 0x14, 0x2c, 0x47, 0xb6, 0xce, 0xb3, 0x04, 0xcb, 0x23, 0xb0, 0x87, 0x16, 0x85, 0x15, 0xb0, + 0xcf, 0x4d, 0xd4, 0x9f, 0x63, 0xef, 0x9c, 0x15, 0x51, 0x0c, 0x1c, 0x46, 0x61, 0xb1, 0x12, 0xbe, + 0x39, 0x98, 0x8c, 0x8e, 0x05, 0x76, 0x13, 0xf0, 0x4d, 0xcf, 0x1b, 0x0c, 0x1c, 0xc1, 0xca, 0x38, + 0x06, 0x09, 0xe3, 0xcb, 0x56, 0xc9, 0xd2, 0x9a, 0x8e, 0xe3, 0x4d, 0x24, 0xab, 0xd4, 0xfe, 0x20, + 0x03, 0x59, 0x8c, 0x6e, 0x70, 0xed, 0x0c, 0xd1, 0xce, 0xe8, 0xb5, 0x83, 0xcf, 0xd1, 0x0a, 0x4c, + 0xc7, 0x2b, 0x90, 0xbf, 0xaf, 0x67, 0x3a, 0xb3, 0x84, 0x95, 0x45, 0xc6, 0xc9, 0x49, 0xe6, 0x90, + 0x1d, 0xd9, 0x23, 0xa1, 0x6d, 0x1d, 0x3d, 0x23, 0x2c, 0xc0, 0xfd, 0x38, 0x47, 0xc9, 0x13, 0x7a, + 0xc6, 0x55, 0x63, 0xe2, 0xb6, 0xd0, 0x90, 0xb4, 0x06, 0x32, 0x46, 0xd8, 0x5c, 0x60, 0xbd, 0x4a, + 0x0b, 0xad, 0xd7, 0x07, 0xa1, 0xf5, 0x2a, 0x2c, 0xb1, 0xea, 0x49, 0xcc, 0xa4, 0xe5, 0x8a, 0x8d, + 0x46, 0x71, 0x79, 0xf2, 0xc4, 0x66, 0xb2, 0xad, 0xb5, 0x36, 0xde, 0xe8, 0x8a, 0x6a, 0x94, 0x59, + 0x0a, 0x67, 0x93, 0x96, 0xab, 0xb2, 0x79, 0x4f, 0x6d, 0x4b, 0x78, 0x2c, 0x43, 0x1b, 0xe1, 0xc4, + 0xb2, 0x3d, 0x96, 0x45, 0xcf, 0xeb, 0x70, 0x7b, 0x87, 0xe5, 0xea, 0xaf, 0x26, 0xb6, 0xa4, 0xc6, + 0x44, 0x7a, 0x8a, 0x0d, 0xa9, 0x6f, 0x4a, 0x69, 0xe3, 0xb1, 0xb0, 0x58, 0xba, 0xfe, 0xf5, 0x05, + 0x66, 0xb6, 0x02, 0xa5, 0x27, 0x63, 0xc7, 0x33, 0xad, 0x2b, 0xec, 0xec, 0x2a, 0x40, 0x1c, 0x55, + 0xd7, 0xfe, 0x4d, 0x3d, 0xde, 0xce, 0xd1, 0x17, 0x0d, 0xbc, 0x89, 0xdf, 0x17, 0x64, 0x42, 0x4a, + 0x86, 0x6e, 0xf1, 0x6f, 0x43, 0x0e, 0xdf, 0x87, 0x69, 0x9c, 0xfb, 0x4b, 0xc5, 0x72, 0x9b, 0x4f, + 0x6d, 0xf1, 0xdc, 0x50, 0x84, 0xfc, 0x0e, 0x80, 0xd9, 0x97, 0xf6, 0x99, 0x40, 0xa0, 0x5e, 0xec, + 0x09, 0x08, 0x7f, 0x27, 0xe9, 0xbe, 0x5c, 0x9d, 0x87, 0x4c, 0xf8, 0x35, 0xdc, 0x80, 0x32, 0x2e, + 0xdd, 0x71, 0xc7, 0xc7, 0xd5, 0x5e, 0x5d, 0x25, 0xc2, 0x37, 0x96, 0x13, 0xef, 0x51, 0x44, 0x68, + 0x24, 0x99, 0xf0, 0x27, 0xb0, 0xaa, 0x72, 0x6a, 0x9a, 0x69, 0x85, 0x98, 0xbe, 0xb9, 0x1c, 0xd3, + 0x4e, 0x4c, 0x69, 0x4c, 0xb1, 0x99, 0x4f, 0x4b, 0xe6, 0x5e, 0x3a, 0x2d, 0xf9, 0x2a, 0xac, 0xf5, + 0xa6, 0x57, 0x81, 0xda, 0x2a, 0x66, 0xa0, 0xbc, 0x0e, 0xab, 0x76, 0x10, 0x67, 0x45, 0x29, 0x47, + 0x52, 0x34, 0xa6, 0x60, 0xb5, 0xff, 0x90, 0x87, 0x2c, 0x8d, 0xfc, 0x6c, 0x8e, 0xab, 0x39, 0x65, + 0xd2, 0x1f, 0x2c, 0x3f, 0xd5, 0x33, 0x2b, 0x9e, 0x2c, 0x48, 0x26, 0x61, 0x41, 0xbe, 0x0d, 0xb9, + 0xc0, 0xf3, 0x65, 0x38, 0xbd, 0x4b, 0x2a, 0x51, 0xd7, 0xf3, 0xa5, 0xa1, 0x08, 0xf9, 0x0e, 0x14, + 0x4e, 0x6c, 0x47, 0xe2, 0xa4, 0xa8, 0xc1, 0x7b, 0x7d, 0x39, 0x1e, 0x3b, 0x44, 0x64, 0x84, 0xc4, + 0x7c, 0x2f, 0xa9, 0x6c, 0x79, 0xe2, 0xb4, 0xb9, 0x1c, 0xa7, 0x45, 0x3a, 0x78, 0x1f, 0x58, 0xdf, + 0x3b, 0x13, 0xbe, 0x91, 0x48, 0x4c, 0xaa, 0x4d, 0x7a, 0x0e, 0xce, 0x6b, 0x50, 0x1c, 0xda, 0x96, + 0x40, 0x3f, 0x87, 0x6c, 0x4c, 0xd1, 0x88, 0xda, 0xfc, 0x31, 0x14, 0x29, 0x3e, 0x40, 0xab, 0x58, + 0x7a, 0xe9, 0xc1, 0x57, 0xa1, 0x4a, 0xc8, 0x00, 0x3f, 0x44, 0x1f, 0xdf, 0xb1, 0x25, 0xe5, 0xa7, + 0x8b, 0x46, 0xd4, 0x46, 0x81, 0x49, 0xdf, 0x93, 0x02, 0x97, 0x95, 0xc0, 0xb3, 0x70, 0xfe, 0x36, + 0xdc, 0x20, 0xd8, 0xcc, 0x26, 0x89, 0x4b, 0x0d, 0x99, 0x2e, 0x7e, 0x89, 0x0e, 0xcb, 0xd8, 0x1c, + 0x88, 0x3d, 0x7b, 0x64, 0xcb, 0x6a, 0xe5, 0x6e, 0xea, 0x5e, 0xce, 0x88, 0x01, 0xfc, 0x75, 0xd8, + 0xb0, 0xc4, 0x89, 0x39, 0x71, 0x64, 0x4f, 0x8c, 0xc6, 0x8e, 0x29, 0x45, 0xdb, 0x22, 0x1d, 0x2d, + 0x19, 0xf3, 0x2f, 0xf8, 0x1b, 0x70, 0x4d, 0x03, 0x3b, 0xd1, 0xa9, 0x42, 0xdb, 0xa2, 0xf4, 0x5d, + 0xc9, 0x58, 0xf4, 0xaa, 0xbe, 0xaf, 0xcd, 0x30, 0x6e, 0xa0, 0x18, 0xa7, 0x86, 0x06, 0x34, 0x90, + 0x6a, 0x47, 0x7e, 0x64, 0x3a, 0x8e, 0xf0, 0x2f, 0x54, 0x90, 0xfb, 0xd8, 0x74, 0x8f, 0x4d, 0x97, + 0x65, 0x68, 0x8f, 0x35, 0x1d, 0xe1, 0x5a, 0xa6, 0xaf, 0x76, 0xe4, 0x47, 0xb4, 0xa1, 0xe7, 0xea, + 0xf7, 0x20, 0x4b, 0x43, 0x5a, 0x82, 0x9c, 0x8a, 0x92, 0x28, 0x62, 0xd6, 0x11, 0x12, 0x59, 0xe4, + 0x3d, 0x5c, 0x7e, 0x2c, 0x5d, 0xfb, 0xdf, 0x39, 0x28, 0x86, 0x83, 0x17, 0x9e, 0x21, 0xa4, 0xe2, + 0x33, 0x04, 0x74, 0xe3, 0x82, 0xa7, 0x76, 0x60, 0x1f, 0x6b, 0xb7, 0xb4, 0x68, 0xc4, 0x00, 0xf4, + 0x84, 0x9e, 0xdb, 0x96, 0x1c, 0xd2, 0x9a, 0xc9, 0x19, 0xaa, 0xc1, 0xef, 0xc1, 0xba, 0x85, 0xe3, + 0xe0, 0xf6, 0x9d, 0x89, 0x25, 0x7a, 0xb8, 0x8b, 0xaa, 0x34, 0xc1, 0x2c, 0x98, 0x7f, 0x0c, 0x20, + 0xed, 0x91, 0xd8, 0xf1, 0xfc, 0x91, 0x29, 0x75, 0x6c, 0xf0, 0x8d, 0x97, 0xd3, 0xea, 0xcd, 0x5e, + 0xc4, 0xc0, 0x48, 0x30, 0x43, 0xd6, 0xf8, 0x35, 0xcd, 0xba, 0xf0, 0x99, 0x58, 0x6f, 0x47, 0x0c, + 0x8c, 0x04, 0x33, 0xde, 0x83, 0xc2, 0x89, 0xe7, 0x8f, 0x26, 0x8e, 0xa9, 0xf7, 0xdc, 0xf7, 0x5f, + 0x92, 0xef, 0x8e, 0xa2, 0x26, 0xdb, 0x13, 0xb2, 0xaa, 0xff, 0x22, 0x40, 0xfc, 0x3d, 0x7e, 0x13, + 0xf8, 0xbe, 0xe7, 0xca, 0x61, 0xe3, 0xf8, 0xd8, 0xdf, 0x12, 0x27, 0x9e, 0x2f, 0xb6, 0x4d, 0xdc, + 0x2c, 0x6f, 0xc0, 0x46, 0x04, 0x6f, 0x9c, 0x48, 0xe1, 0x23, 0x98, 0x26, 0xb4, 0x3b, 0xf4, 0x7c, + 0xa9, 0x3c, 0x36, 0x7a, 0x7c, 0xd2, 0x65, 0x19, 0xdc, 0xa0, 0xdb, 0xdd, 0x0e, 0xcb, 0xd6, 0xef, + 0x01, 0xc4, 0x03, 0x45, 0x91, 0x0d, 0x3d, 0xbd, 0xf9, 0x50, 0xc7, 0x39, 0xd4, 0x7a, 0xf8, 0x36, + 0x4b, 0xd5, 0x7f, 0x96, 0x82, 0x72, 0x42, 0xc0, 0xe9, 0x08, 0xb8, 0xe9, 0x4d, 0x5c, 0xa9, 0x42, + 0x6e, 0x7a, 0x7c, 0x6a, 0x3a, 0x13, 0xdc, 0xaa, 0x37, 0xa0, 0x42, 0xed, 0x6d, 0x3b, 0x90, 0xb6, + 0xdb, 0x97, 0x2c, 0x13, 0xa1, 0xa8, 0x6d, 0x3e, 0x1b, 0xa1, 0x1c, 0x78, 0x1a, 0x94, 0xe3, 0x0c, + 0x56, 0x0f, 0x85, 0xdf, 0x17, 0x21, 0x12, 0xb9, 0xb6, 0x1a, 0x12, 0xa1, 0x29, 0xd7, 0xd6, 0x94, + 0xc3, 0xee, 0x64, 0xc4, 0x8a, 0xe8, 0x22, 0x62, 0xa3, 0x71, 0x26, 0x7c, 0xf4, 0x4c, 0x4a, 0xf8, + 0x1d, 0x04, 0xa0, 0x6e, 0x9b, 0x2e, 0x83, 0x10, 0x7b, 0xdf, 0x76, 0x59, 0x39, 0x6a, 0x98, 0xe7, + 0x6c, 0x15, 0xe5, 0xa7, 0x40, 0x80, 0x55, 0x6a, 0xff, 0x2d, 0x03, 0x59, 0xb4, 0xd2, 0x18, 0xb9, + 0x26, 0x4d, 0x8a, 0xd2, 0xfc, 0x24, 0xe8, 0xb3, 0xed, 0x2d, 0xc8, 0x3b, 0xb9, 0xb7, 0xbc, 0x07, + 0xe5, 0xfe, 0x24, 0x90, 0xde, 0x88, 0x36, 0x56, 0x7d, 0x76, 0x75, 0x73, 0x2e, 0x07, 0x44, 0xc3, + 0x69, 0x24, 0x51, 0xf9, 0x3b, 0x90, 0x3f, 0x51, 0x3a, 0xac, 0xb2, 0x40, 0x5f, 0xb8, 0x64, 0xef, + 0xd5, 0x7a, 0xaa, 0x91, 0xb1, 0x5f, 0xf6, 0xdc, 0xfa, 0x4b, 0x82, 0xf4, 0x1e, 0x9a, 0x8f, 0xf6, + 0xd0, 0x5f, 0x84, 0x35, 0x81, 0x03, 0x7e, 0xe8, 0x98, 0x7d, 0x31, 0x12, 0x6e, 0xb8, 0x68, 0xde, + 0x7e, 0x89, 0x1e, 0xd3, 0x8c, 0x51, 0xb7, 0x67, 0x78, 0xa1, 0x1d, 0x71, 0x3d, 0xdc, 0xca, 0xc3, + 0x30, 0xbd, 0x68, 0xc4, 0x80, 0xfa, 0x97, 0xb5, 0xf5, 0x2b, 0x40, 0xa6, 0x11, 0xf4, 0x75, 0x3e, + 0x43, 0x04, 0x7d, 0x15, 0x2c, 0x35, 0x69, 0x38, 0x58, 0xba, 0xfe, 0x26, 0x94, 0xa2, 0x2f, 0xa0, + 0xf2, 0x1c, 0x78, 0xb2, 0x3b, 0x16, 0x7d, 0xfb, 0xc4, 0x16, 0x96, 0xd2, 0xcf, 0xae, 0x34, 0x7d, + 0xa9, 0x52, 0x82, 0x2d, 0xd7, 0x62, 0xe9, 0xda, 0x6f, 0x17, 0x21, 0xaf, 0xb6, 0x52, 0xdd, 0xe1, + 0x52, 0xd4, 0xe1, 0xef, 0x40, 0xd1, 0x1b, 0x0b, 0xdf, 0x94, 0x9e, 0xaf, 0xf3, 0x30, 0xef, 0xbc, + 0xcc, 0xd6, 0xbc, 0xd9, 0xd1, 0xc4, 0x46, 0xc4, 0x66, 0x56, 0x9b, 0xd2, 0xf3, 0xda, 0x74, 0x1f, + 0x58, 0xb8, 0x0b, 0x1f, 0xfa, 0x48, 0x27, 0x2f, 0x74, 0x54, 0x3d, 0x07, 0xe7, 0x3d, 0x28, 0xf5, + 0x3d, 0xd7, 0xb2, 0xa3, 0x9c, 0xcc, 0xda, 0xc3, 0xaf, 0xbf, 0x94, 0x84, 0xcd, 0x90, 0xda, 0x88, + 0x19, 0xf1, 0xd7, 0x21, 0x77, 0x86, 0x6a, 0x46, 0xfa, 0x74, 0xb9, 0x12, 0x2a, 0x24, 0xfe, 0x09, + 0x94, 0xbf, 0x3f, 0xb1, 0xfb, 0xa7, 0x9d, 0x64, 0xce, 0xef, 0xbd, 0x97, 0x92, 0xe2, 0x3b, 0x31, + 0xbd, 0x91, 0x64, 0x96, 0x50, 0xed, 0xc2, 0x1f, 0x42, 0xb5, 0x8b, 0xf3, 0xaa, 0x6d, 0x40, 0xc5, + 0x15, 0x81, 0x14, 0xd6, 0x8e, 0xf6, 0xbc, 0xe0, 0x33, 0x78, 0x5e, 0xd3, 0x2c, 0xea, 0x5f, 0x82, + 0x62, 0x38, 0xe1, 0x3c, 0x0f, 0xe9, 0x03, 0x0c, 0x71, 0xf2, 0x90, 0xee, 0xf8, 0x4a, 0xdb, 0x1a, + 0xa8, 0x6d, 0xf5, 0xdf, 0x4b, 0x41, 0x29, 0x1a, 0xf4, 0x69, 0xcb, 0xd9, 0xfa, 0xfe, 0xc4, 0x74, + 0x58, 0x8a, 0x82, 0x5f, 0x4f, 0xaa, 0x16, 0x19, 0xeb, 0x47, 0x74, 0xf4, 0xee, 0xb3, 0x0c, 0x6d, + 0xf8, 0x22, 0x08, 0x58, 0x96, 0x73, 0x58, 0xd3, 0xe0, 0x8e, 0xaf, 0x50, 0x73, 0x68, 0xf8, 0xf0, + 0x6d, 0x08, 0xc8, 0x2b, 0xff, 0xe0, 0x54, 0x28, 0x03, 0x79, 0xe0, 0x49, 0x6a, 0x14, 0x51, 0xa8, + 0xb6, 0xcb, 0x4a, 0xf8, 0xcd, 0x03, 0x4f, 0xb6, 0xd1, 0x24, 0x46, 0xc1, 0x56, 0x39, 0xfc, 0x3c, + 0xb5, 0xc8, 0x22, 0x36, 0x1c, 0xa7, 0xed, 0xb2, 0x8a, 0x7e, 0xa1, 0x5a, 0x6b, 0xc8, 0xb1, 0x75, + 0x6e, 0xf6, 0x91, 0x7c, 0x1d, 0x2d, 0x2c, 0xd2, 0xe8, 0x36, 0xc3, 0x25, 0xd9, 0x3a, 0xb7, 0x03, + 0x19, 0xb0, 0x8d, 0xfa, 0xbf, 0x4f, 0x41, 0x39, 0x31, 0xc1, 0x18, 0xcc, 0x11, 0x22, 0x6e, 0x65, + 0x2a, 0xb6, 0xfb, 0x18, 0x87, 0xd1, 0xb7, 0xc2, 0x6d, 0xaa, 0xe7, 0xe1, 0x63, 0x1a, 0xbf, 0xd7, + 0xf3, 0x46, 0x9e, 0xef, 0x7b, 0xcf, 0x95, 0x23, 0xb3, 0x67, 0x06, 0xf2, 0x99, 0x10, 0xa7, 0x2c, + 0x8b, 0x5d, 0x6d, 0x4e, 0x7c, 0x5f, 0xb8, 0x0a, 0x90, 0x23, 0xe1, 0xc4, 0xb9, 0x6a, 0xe5, 0x91, + 0x29, 0x22, 0xd3, 0x3e, 0xc8, 0x0a, 0x68, 0x08, 0x34, 0xb6, 0x82, 0x14, 0x11, 0x01, 0xd1, 0x55, + 0xb3, 0x84, 0x9b, 0x8a, 0xca, 0x37, 0x74, 0x4e, 0xb6, 0xcd, 0x8b, 0xa0, 0x31, 0xf0, 0x18, 0xcc, + 0x02, 0x0f, 0xbc, 0xe7, 0xac, 0x5c, 0x9b, 0x00, 0xc4, 0x11, 0x16, 0x46, 0x96, 0xa8, 0x10, 0xd1, + 0x89, 0x80, 0x6e, 0xf1, 0x0e, 0x00, 0x3e, 0x11, 0x66, 0x18, 0x5e, 0xbe, 0x84, 0xdb, 0x4b, 0x74, + 0x46, 0x82, 0x45, 0xed, 0xcf, 0x41, 0x29, 0x7a, 0xc1, 0xab, 0x50, 0x20, 0x07, 0x35, 0xfa, 0x6c, + 0xd8, 0x44, 0x6f, 0xcb, 0x76, 0x2d, 0x71, 0x4e, 0x76, 0x25, 0x67, 0xa8, 0x06, 0x4a, 0x39, 0xb4, + 0x2d, 0x4b, 0xb8, 0xe1, 0xb9, 0x8d, 0x6a, 0x2d, 0x3a, 0x5d, 0xcf, 0x2e, 0x3c, 0x5d, 0xaf, 0xfd, + 0x12, 0x94, 0x13, 0x21, 0xe0, 0xa5, 0xdd, 0x4e, 0x08, 0x96, 0x9e, 0x16, 0xec, 0x36, 0x94, 0xc2, + 0x8a, 0x8e, 0x80, 0xf6, 0xb6, 0x92, 0x11, 0x03, 0x6a, 0xff, 0x34, 0x8d, 0x7e, 0x29, 0x76, 0x6d, + 0x36, 0x6c, 0xdb, 0x81, 0x7c, 0x20, 0x4d, 0x39, 0x09, 0x4b, 0x13, 0x96, 0x5c, 0xa0, 0x5d, 0xa2, + 0xd9, 0x5d, 0x31, 0x34, 0x35, 0xff, 0x00, 0x32, 0xd2, 0x1c, 0xe8, 0xb4, 0xe7, 0x57, 0x96, 0x63, + 0xd2, 0x33, 0x07, 0xbb, 0x2b, 0x06, 0xd2, 0xf1, 0x3d, 0x28, 0xf6, 0x75, 0xa6, 0x4a, 0x1b, 0xc5, + 0x25, 0x23, 0xab, 0x30, 0xbf, 0xb5, 0xbb, 0x62, 0x44, 0x1c, 0xf8, 0xb7, 0x21, 0x8b, 0xbe, 0xa2, + 0xae, 0xe0, 0x58, 0x32, 0x62, 0xc4, 0xe5, 0xb2, 0xbb, 0x62, 0x10, 0xe5, 0x56, 0x01, 0x72, 0x64, + 0x83, 0x6b, 0x55, 0xc8, 0xab, 0xbe, 0xce, 0x8e, 0x5c, 0xed, 0x16, 0x64, 0x7a, 0xe6, 0x00, 0xfd, + 0x75, 0xdb, 0x0a, 0x74, 0xe2, 0x03, 0x1f, 0x6b, 0xaf, 0xc4, 0x59, 0xb7, 0x64, 0x42, 0x37, 0x35, + 0x95, 0xd0, 0xad, 0xe5, 0x21, 0x8b, 0x5f, 0xac, 0xdd, 0xbe, 0xca, 0xf7, 0xaf, 0xfd, 0xfd, 0x0c, + 0x86, 0x09, 0x52, 0x9c, 0x2f, 0x4c, 0x56, 0x7f, 0x04, 0xa5, 0xb1, 0xef, 0xf5, 0x45, 0x10, 0x78, + 0xbe, 0x76, 0x8e, 0x5e, 0x7f, 0xf1, 0x41, 0xf2, 0xe6, 0x61, 0x48, 0x63, 0xc4, 0xe4, 0xf5, 0x7f, + 0x95, 0x86, 0x52, 0xf4, 0x42, 0x45, 0x27, 0x52, 0x9c, 0xab, 0xc4, 0xe4, 0xbe, 0xf0, 0x47, 0xa6, + 0x6d, 0x29, 0xeb, 0xd1, 0x1c, 0x9a, 0xa1, 0x93, 0xfb, 0xb1, 0x37, 0x91, 0x93, 0x63, 0xa1, 0x12, + 0x52, 0x4f, 0xed, 0x91, 0xf0, 0x58, 0x96, 0x8e, 0x82, 0x50, 0xb1, 0xfb, 0x8e, 0x37, 0xb1, 0x58, + 0x0e, 0xdb, 0x8f, 0x68, 0x7b, 0xdb, 0x37, 0xc7, 0x81, 0xb2, 0x99, 0xfb, 0xb6, 0xef, 0xb1, 0x02, + 0x12, 0xed, 0xd8, 0x83, 0x91, 0xc9, 0x8a, 0xc8, 0xac, 0xf7, 0xdc, 0x96, 0x68, 0x84, 0x4b, 0xe8, + 0xa6, 0x76, 0xc6, 0xc2, 0xed, 0x4a, 0x5f, 0x08, 0xb9, 0x6f, 0x8e, 0x55, 0x86, 0xd2, 0x10, 0x96, + 0x65, 0x4b, 0x65, 0x3f, 0x77, 0xcc, 0xbe, 0x38, 0xf6, 0xbc, 0x53, 0xb6, 0x8a, 0x86, 0xa6, 0xed, + 0x06, 0xd2, 0x1c, 0xf8, 0xe6, 0x48, 0xd9, 0xd0, 0x9e, 0x70, 0x04, 0xb5, 0xd6, 0xe8, 0xdb, 0xb6, + 0x1c, 0x4e, 0x8e, 0x1f, 0x61, 0x14, 0xb7, 0xae, 0x4e, 0x8d, 0x2c, 0x31, 0x16, 0x68, 0x43, 0x57, + 0xa1, 0xb8, 0x65, 0x3b, 0xf6, 0xb1, 0xed, 0xd8, 0x6c, 0x03, 0x51, 0x5b, 0xe7, 0x7d, 0xd3, 0xb1, + 0x2d, 0xdf, 0x7c, 0xce, 0x38, 0x0a, 0xf7, 0xd8, 0xf7, 0x4e, 0x6d, 0x76, 0x0d, 0x11, 0x29, 0xa8, + 0x3b, 0xb3, 0x3f, 0x65, 0xd7, 0xe9, 0xe4, 0xeb, 0x54, 0xc8, 0xfe, 0xf0, 0xc4, 0x3c, 0x66, 0x37, + 0xe2, 0x04, 0xdd, 0xcd, 0xda, 0x06, 0xac, 0xcf, 0x9c, 0xb1, 0xd7, 0x0a, 0x3a, 0x96, 0xac, 0x55, + 0xa0, 0x9c, 0x38, 0xfc, 0xac, 0xbd, 0x0a, 0xc5, 0xf0, 0x68, 0x14, 0x63, 0x6e, 0x3b, 0x50, 0x49, + 0x5d, 0xad, 0x24, 0x51, 0xbb, 0xf6, 0x3b, 0x29, 0xc8, 0xab, 0x73, 0x69, 0xbe, 0x15, 0xd5, 0x91, + 0xa4, 0x96, 0x38, 0x8b, 0x54, 0x44, 0xfa, 0x24, 0x37, 0x2a, 0x26, 0xb9, 0x0e, 0x39, 0x87, 0x82, + 0x6b, 0x6d, 0xbe, 0xa8, 0x91, 0xb0, 0x36, 0x99, 0xa4, 0xb5, 0xa9, 0x37, 0xa2, 0xd3, 0xe3, 0x30, + 0x91, 0x48, 0x5e, 0x61, 0xcf, 0x17, 0x42, 0x25, 0x09, 0x29, 0x36, 0x4e, 0xd3, 0x5e, 0xe1, 0x8d, + 0xc6, 0x66, 0x5f, 0x12, 0x80, 0x76, 0x51, 0x34, 0xa6, 0x2c, 0x8b, 0x5a, 0xde, 0x1c, 0x9a, 0xb2, + 0x7e, 0x02, 0xc5, 0x43, 0x2f, 0x98, 0xdd, 0x93, 0x0b, 0x90, 0xe9, 0x79, 0x63, 0xe5, 0x61, 0x6e, + 0x79, 0x92, 0x3c, 0x4c, 0xb5, 0x05, 0x9f, 0x48, 0xa5, 0x54, 0x86, 0x3d, 0x18, 0x4a, 0x15, 0x57, + 0xb7, 0x5d, 0x57, 0xf8, 0x2c, 0x87, 0x73, 0x68, 0x88, 0x31, 0x7a, 0xb5, 0x2c, 0x8f, 0xb3, 0x46, + 0xf0, 0x1d, 0xdb, 0x0f, 0x24, 0x2b, 0xd4, 0xdb, 0xb8, 0x9b, 0xda, 0x03, 0xda, 0x04, 0xe9, 0x81, + 0x58, 0xad, 0xa0, 0x88, 0xd4, 0x6c, 0x0a, 0x17, 0x75, 0x8c, 0xa2, 0x27, 0x55, 0x6a, 0x44, 0x1f, + 0x48, 0xe3, 0x0e, 0x46, 0xed, 0x8f, 0x26, 0x81, 0xb4, 0x4f, 0x2e, 0x58, 0xa6, 0xfe, 0x0c, 0x2a, + 0x53, 0x45, 0x49, 0xfc, 0x3a, 0xb0, 0x29, 0x00, 0x8a, 0xbe, 0xc2, 0x6f, 0xc1, 0xb5, 0x29, 0xe8, + 0xbe, 0x6d, 0x59, 0x94, 0xb9, 0x9d, 0x7d, 0x11, 0x76, 0x70, 0xab, 0x04, 0x85, 0xbe, 0x9a, 0xa5, + 0xfa, 0x21, 0x54, 0x68, 0xda, 0xf6, 0x85, 0x34, 0x3b, 0xae, 0x73, 0xf1, 0x87, 0xae, 0x1c, 0xab, + 0x7f, 0x55, 0x07, 0x58, 0x68, 0x2f, 0x4e, 0x7c, 0x6f, 0x44, 0xbc, 0x72, 0x06, 0x3d, 0x23, 0x77, + 0xe9, 0xe9, 0xb9, 0x4f, 0x4b, 0xaf, 0xfe, 0xeb, 0x25, 0x28, 0x34, 0xfa, 0x7d, 0x0c, 0x09, 0xe7, + 0xbe, 0xfc, 0x0e, 0xe4, 0xfb, 0x9e, 0x7b, 0x62, 0x0f, 0xb4, 0x3d, 0x9e, 0xf5, 0x0c, 0x35, 0x1d, + 0x2a, 0xdc, 0x89, 0x3d, 0x30, 0x34, 0x32, 0x92, 0xe9, 0xfd, 0x24, 0x77, 0x25, 0x99, 0x32, 0xaa, + 0xd1, 0xf6, 0xf1, 0x00, 0xb2, 0xb6, 0x7b, 0xe2, 0xe9, 0x32, 0xcf, 0xcf, 0x5f, 0x42, 0x44, 0xb5, + 0x8e, 0x84, 0x58, 0xfb, 0x2f, 0x29, 0xc8, 0xab, 0x4f, 0xf3, 0x57, 0x61, 0x4d, 0xb8, 0xb8, 0x98, + 0x42, 0x53, 0xae, 0x57, 0xd1, 0x0c, 0x14, 0x9d, 0x56, 0x0d, 0x11, 0xc7, 0x93, 0x81, 0xce, 0xa4, + 0x24, 0x41, 0xfc, 0x3d, 0xb8, 0xa5, 0x9a, 0x87, 0xbe, 0xf0, 0x85, 0x23, 0xcc, 0x40, 0x34, 0x87, + 0xa6, 0xeb, 0x0a, 0x47, 0x6f, 0xec, 0x97, 0xbd, 0xe6, 0x75, 0x58, 0x55, 0xaf, 0xba, 0x63, 0xb3, + 0x2f, 0x02, 0x7d, 0x7a, 0x37, 0x05, 0xe3, 0x5f, 0x83, 0x1c, 0x55, 0xc1, 0x56, 0xad, 0xab, 0xa7, + 0x52, 0x61, 0xd5, 0xbc, 0x68, 0xe7, 0x69, 0x00, 0xa8, 0x61, 0xc2, 0xa0, 0x4b, 0xaf, 0xfe, 0x2f, + 0x5e, 0x39, 0xae, 0x14, 0xff, 0x25, 0x88, 0x50, 0x3e, 0x4b, 0x38, 0x82, 0xca, 0x15, 0x71, 0x67, + 0x4c, 0xd3, 0x39, 0xc9, 0x14, 0xac, 0xf6, 0x4f, 0xb2, 0x90, 0xc5, 0x11, 0x46, 0xe4, 0xa1, 0x37, + 0x12, 0x51, 0xb6, 0x58, 0xb9, 0x1a, 0x53, 0x30, 0x74, 0x6d, 0x4c, 0x75, 0x60, 0x1f, 0xa1, 0x29, + 0xe3, 0x31, 0x0b, 0x46, 0xcc, 0xb1, 0xef, 0x9d, 0xd8, 0x4e, 0x8c, 0xa9, 0x9d, 0xa0, 0x19, 0x30, + 0xff, 0x3a, 0xdc, 0x1c, 0x99, 0xfe, 0xa9, 0x90, 0xb4, 0xba, 0x9f, 0x79, 0xfe, 0x69, 0x80, 0x23, + 0xd7, 0xb6, 0x74, 0x9a, 0xf1, 0x92, 0xb7, 0xfc, 0x75, 0xd8, 0x78, 0x1e, 0x36, 0xa3, 0x6f, 0xa8, + 0x44, 0xdf, 0xfc, 0x0b, 0x34, 0xb7, 0x96, 0x38, 0xb3, 0x89, 0x6f, 0x51, 0xd5, 0xc2, 0x86, 0x6d, + 0x54, 0x25, 0x53, 0x0d, 0x64, 0x57, 0x7f, 0x59, 0x9f, 0x17, 0x4d, 0x43, 0xd1, 0xdb, 0x52, 0x35, + 0x42, 0x41, 0xdb, 0xa2, 0x3c, 0x69, 0xc9, 0x88, 0x01, 0xa8, 0x68, 0xf4, 0xc9, 0xa7, 0xca, 0xa8, + 0x56, 0x54, 0x08, 0x9a, 0x00, 0x21, 0x86, 0x14, 0xfd, 0x61, 0xf8, 0x11, 0x95, 0xc4, 0x4c, 0x82, + 0xf8, 0x1d, 0x80, 0x81, 0x29, 0xc5, 0x73, 0xf3, 0xe2, 0x89, 0xef, 0x54, 0x85, 0x3a, 0xf8, 0x88, + 0x21, 0x18, 0xc4, 0x3a, 0x5e, 0xdf, 0x74, 0xba, 0xd2, 0xf3, 0xcd, 0x81, 0x38, 0x34, 0xe5, 0xb0, + 0x3a, 0x50, 0x41, 0xec, 0x2c, 0x1c, 0x7b, 0x2c, 0xed, 0x91, 0xf8, 0xc4, 0x73, 0x45, 0x75, 0xa8, + 0x7a, 0x1c, 0xb6, 0x51, 0x12, 0xd3, 0x35, 0x9d, 0x0b, 0x69, 0xf7, 0xb1, 0x2f, 0xb6, 0x92, 0x24, + 0x01, 0xa2, 0xb4, 0x81, 0x90, 0x38, 0x8e, 0x6d, 0xab, 0xfa, 0x3d, 0xd5, 0xd7, 0x08, 0x50, 0xef, + 0x00, 0xc4, 0x2a, 0x87, 0x76, 0xbc, 0x41, 0x87, 0x33, 0x6c, 0x45, 0xe5, 0x91, 0x5c, 0xcb, 0x76, + 0x07, 0xdb, 0x5a, 0xcb, 0x58, 0x0a, 0x81, 0x94, 0x1f, 0x10, 0x56, 0x04, 0x24, 0x4f, 0x82, 0x5a, + 0xc2, 0x62, 0x99, 0xfa, 0xff, 0x4d, 0x41, 0x39, 0x51, 0x8b, 0xf0, 0x47, 0x58, 0x3f, 0x81, 0xfb, + 0x2c, 0xee, 0xd4, 0x38, 0xa0, 0x4a, 0x03, 0xa3, 0x36, 0x0e, 0xb7, 0x2e, 0x95, 0xc0, 0xb7, 0x2a, + 0x1b, 0x90, 0x80, 0x7c, 0xa6, 0xda, 0x89, 0xfa, 0x43, 0x9d, 0x52, 0x29, 0x43, 0xe1, 0x89, 0x7b, + 0xea, 0x7a, 0xcf, 0x5d, 0xb5, 0x81, 0x52, 0x41, 0xcc, 0xd4, 0xd1, 0x5e, 0x58, 0xb3, 0x92, 0xa9, + 0xff, 0x83, 0xec, 0x4c, 0xed, 0x58, 0x0b, 0xf2, 0xca, 0x8f, 0x27, 0x17, 0x73, 0xbe, 0xd8, 0x27, + 0x89, 0xac, 0x8f, 0x91, 0x12, 0x20, 0x43, 0x13, 0xa3, 0x83, 0x1d, 0x55, 0x56, 0xa6, 0x17, 0x1e, + 0x77, 0x4d, 0x31, 0x0a, 0x8d, 0xe6, 0x54, 0x71, 0x71, 0xc4, 0xa1, 0xf6, 0x57, 0x52, 0x70, 0x7d, + 0x11, 0x4a, 0xb2, 0x04, 0x3b, 0x35, 0x5d, 0x82, 0xdd, 0x9d, 0x29, 0x69, 0x4e, 0x53, 0x6f, 0x1e, + 0xbc, 0xa4, 0x10, 0xd3, 0x05, 0xce, 0xf5, 0x1f, 0xa7, 0x60, 0x63, 0xae, 0xcf, 0x09, 0x07, 0x03, + 0x20, 0xaf, 0x34, 0x4b, 0x55, 0x1c, 0x45, 0x35, 0x20, 0x2a, 0x87, 0x4f, 0x5b, 0x6f, 0xa0, 0x0e, + 0xd5, 0x75, 0x11, 0xb7, 0xf2, 0x5f, 0x71, 0xd6, 0xd0, 0xb2, 0x0f, 0x84, 0xca, 0x90, 0x2a, 0x2f, + 0x48, 0x43, 0xf2, 0xca, 0xc7, 0x54, 0x07, 0x0d, 0xac, 0x40, 0x95, 0x4c, 0x93, 0xb1, 0x63, 0xf7, + 0xb1, 0x59, 0xe4, 0x35, 0xb8, 0xa9, 0x2a, 0xf9, 0x75, 0x3c, 0x77, 0xd2, 0x1b, 0xda, 0xb4, 0x38, + 0x58, 0xa9, 0x6e, 0xc0, 0xb5, 0x05, 0x7d, 0x22, 0x29, 0x9f, 0x6a, 0x89, 0xd7, 0x00, 0xb6, 0x9f, + 0x86, 0x72, 0xb2, 0x14, 0xe7, 0xb0, 0xb6, 0xfd, 0x34, 0xc9, 0x50, 0xaf, 0x97, 0xa7, 0x68, 0x49, + 0x02, 0x96, 0xa9, 0xff, 0x4a, 0x2a, 0xac, 0x2e, 0xa8, 0xfd, 0x59, 0xa8, 0x28, 0x19, 0x0f, 0xcd, + 0x0b, 0xc7, 0x33, 0x2d, 0xde, 0x82, 0xb5, 0x20, 0xba, 0x5e, 0x92, 0xd8, 0x3c, 0x66, 0x37, 0xe5, + 0xee, 0x14, 0x92, 0x31, 0x43, 0x14, 0x86, 0x25, 0xe9, 0xf8, 0x48, 0x82, 0x53, 0x80, 0x65, 0xd2, + 0x2a, 0x5b, 0xa5, 0x90, 0xc9, 0xac, 0x7f, 0x0d, 0x36, 0xba, 0xb1, 0xa1, 0x55, 0xfe, 0x2b, 0xea, + 0x83, 0xb2, 0xd2, 0xdb, 0xa1, 0x3e, 0xe8, 0x66, 0xfd, 0x3f, 0xe5, 0x01, 0xe2, 0xe3, 0x97, 0x05, + 0xcb, 0x7c, 0x51, 0x35, 0xc1, 0xdc, 0x61, 0x68, 0xe6, 0xa5, 0x0f, 0x43, 0xdf, 0x8b, 0xdc, 0x68, + 0x95, 0xcc, 0x9d, 0x2d, 0xa9, 0x8e, 0x65, 0x9a, 0x75, 0x9e, 0xa7, 0x8a, 0x6d, 0x72, 0xb3, 0xc5, + 0x36, 0x77, 0xe7, 0x2b, 0xf3, 0x66, 0xec, 0x4f, 0x9c, 0x25, 0x28, 0x4c, 0x65, 0x09, 0x6a, 0x50, + 0xf4, 0x85, 0x69, 0x79, 0xae, 0x73, 0x11, 0x9e, 0xb9, 0x85, 0x6d, 0xfe, 0x16, 0xe4, 0x24, 0xdd, + 0x90, 0x29, 0xd2, 0x72, 0x79, 0xc1, 0xc4, 0x29, 0x5c, 0x34, 0x66, 0x76, 0xa0, 0xcb, 0xe9, 0xd4, + 0x0e, 0x56, 0x34, 0x12, 0x10, 0xbe, 0x09, 0xdc, 0xc6, 0x90, 0xc9, 0x71, 0x84, 0xb5, 0x75, 0xb1, + 0xad, 0x8e, 0xc2, 0x68, 0x8f, 0x2d, 0x1a, 0x0b, 0xde, 0x84, 0xf3, 0xbf, 0x1a, 0xcf, 0x3f, 0x89, + 0x7c, 0x66, 0x07, 0xd8, 0xd3, 0x0a, 0xb9, 0x12, 0x51, 0x1b, 0x77, 0xf1, 0x70, 0x8d, 0xaa, 0xb1, + 0x24, 0xed, 0x8d, 0xcf, 0x93, 0x2f, 0x79, 0x5b, 0xff, 0xdd, 0x74, 0x14, 0x6e, 0x94, 0x20, 0x77, + 0x6c, 0x06, 0x76, 0x5f, 0x45, 0x9f, 0xda, 0x4d, 0x50, 0x21, 0x87, 0xf4, 0x2c, 0x8f, 0xa5, 0x31, + 0x72, 0x08, 0x84, 0x3e, 0xe2, 0x88, 0x6f, 0x0d, 0xb1, 0x2c, 0xae, 0xcd, 0x70, 0xbe, 0x55, 0x55, + 0x0c, 0x91, 0x52, 0xc2, 0xca, 0x8a, 0xea, 0x0d, 0x29, 0xf4, 0x24, 0xdb, 0xcf, 0x8a, 0x88, 0xe3, + 0x7a, 0x52, 0xa8, 0x74, 0x1d, 0x69, 0x27, 0x03, 0x64, 0x13, 0x96, 0xc1, 0xb3, 0x32, 0xba, 0xf2, + 0x21, 0x53, 0x95, 0x63, 0x0b, 0x28, 0xd0, 0x59, 0xc5, 0xd5, 0x39, 0xfd, 0x82, 0x55, 0x50, 0xa2, + 0xf8, 0x32, 0x12, 0x5b, 0x43, 0xae, 0x26, 0xd5, 0x6a, 0xac, 0xe3, 0xe3, 0x19, 0x55, 0x70, 0x30, + 0xfc, 0xaa, 0x85, 0x06, 0x63, 0x03, 0x25, 0x8b, 0x5c, 0x03, 0xc6, 0x31, 0x52, 0x19, 0x9b, 0x18, + 0x36, 0xd8, 0x63, 0xd3, 0x95, 0xec, 0x1a, 0x76, 0x75, 0x6c, 0x9d, 0xb0, 0xeb, 0x48, 0xd2, 0x1f, + 0x9a, 0x92, 0xdd, 0x40, 0x1c, 0x7c, 0xda, 0x16, 0x3e, 0xce, 0x27, 0xbb, 0x89, 0x38, 0xd2, 0x1c, + 0xb0, 0x5b, 0xf5, 0xdf, 0x88, 0x2b, 0x7e, 0xdf, 0x88, 0x1c, 0xfa, 0x65, 0x94, 0x1c, 0x5d, 0xfe, + 0x45, 0x2b, 0xae, 0x05, 0x1b, 0xbe, 0xf8, 0xfe, 0xc4, 0x9e, 0xaa, 0x83, 0xcf, 0x5c, 0x5d, 0x68, + 0x31, 0x4f, 0x51, 0x3f, 0x83, 0x8d, 0xb0, 0xf1, 0xcc, 0x96, 0x43, 0xca, 0xad, 0xf0, 0xb7, 0x12, + 0x85, 0xfa, 0xa9, 0x85, 0x17, 0x9c, 0x22, 0x96, 0x71, 0x61, 0x7e, 0x94, 0x3b, 0x4f, 0x2f, 0x91, + 0x3b, 0xaf, 0xff, 0x9f, 0x7c, 0x22, 0xbd, 0xa2, 0x42, 0x1c, 0x2b, 0x0a, 0x71, 0xe6, 0x8f, 0x5a, + 0xe3, 0x74, 0x78, 0xfa, 0x65, 0xd2, 0xe1, 0x8b, 0xca, 0x16, 0xde, 0x47, 0x8f, 0x9b, 0xd6, 0xcf, + 0xd3, 0x25, 0x52, 0xfd, 0x53, 0xb8, 0x7c, 0x8b, 0x0e, 0x4e, 0xcd, 0xae, 0xaa, 0xa9, 0xc9, 0x2d, + 0xbc, 0x36, 0x93, 0x3c, 0x21, 0xd5, 0x98, 0x46, 0x82, 0x2a, 0x61, 0x6d, 0xf2, 0x8b, 0xac, 0x0d, + 0x46, 0x9b, 0xda, 0x0e, 0x45, 0x6d, 0x75, 0x32, 0xa2, 0x9e, 0x43, 0xf6, 0xe4, 0x47, 0x17, 0x8d, + 0x39, 0x38, 0x7a, 0x61, 0xa3, 0x89, 0x23, 0x6d, 0x9d, 0xfc, 0x57, 0x8d, 0xd9, 0x7b, 0x7d, 0xa5, + 0xf9, 0x7b, 0x7d, 0x1f, 0x02, 0x04, 0x02, 0x57, 0xc7, 0xb6, 0xdd, 0x97, 0xba, 0xf2, 0xe6, 0xce, + 0x65, 0x7d, 0xd3, 0x47, 0x16, 0x09, 0x0a, 0x94, 0x7f, 0x64, 0x9e, 0xd3, 0x31, 0xa6, 0x2e, 0x11, + 0x88, 0xda, 0xb3, 0x36, 0x78, 0x6d, 0xde, 0x06, 0xbf, 0x05, 0xb9, 0xa0, 0xef, 0x8d, 0x05, 0x5d, + 0x4d, 0xb9, 0x7c, 0x7e, 0x37, 0xbb, 0x88, 0x64, 0x28, 0x5c, 0x4a, 0xe2, 0xa1, 0x95, 0xf2, 0x7c, + 0xba, 0x94, 0x52, 0x32, 0xc2, 0xe6, 0x94, 0x1d, 0xbc, 0x39, 0x6d, 0x07, 0x6b, 0x16, 0xe4, 0x75, + 0x42, 0x7e, 0x36, 0xb4, 0x0e, 0x53, 0x79, 0xe9, 0x44, 0x2a, 0x2f, 0xaa, 0xef, 0xcc, 0x24, 0xeb, + 0x3b, 0x67, 0xee, 0xad, 0xe5, 0xe6, 0xee, 0xad, 0xd5, 0x3f, 0x81, 0x1c, 0xc9, 0x8a, 0x4e, 0x84, + 0x1a, 0x66, 0xe5, 0x63, 0x62, 0xa7, 0x58, 0x8a, 0x5f, 0x07, 0x16, 0x08, 0x72, 0x42, 0x44, 0xd7, + 0x1c, 0x09, 0x32, 0x92, 0x69, 0x5e, 0x85, 0xeb, 0x0a, 0x37, 0x98, 0x7e, 0x43, 0x9e, 0x90, 0x63, + 0x1f, 0xfb, 0xa6, 0x7f, 0xc1, 0xb2, 0xf5, 0x0f, 0xe9, 0x38, 0x3c, 0x54, 0xa8, 0x72, 0x74, 0x4f, + 0x50, 0x99, 0x65, 0x4b, 0x5b, 0x1f, 0xaa, 0x8d, 0xd0, 0xf1, 0x91, 0xaa, 0x18, 0xa3, 0x00, 0x84, + 0x32, 0x28, 0xab, 0xc9, 0x9d, 0xf8, 0x8f, 0x6c, 0xbd, 0xd5, 0xb7, 0x12, 0xae, 0xdc, 0x74, 0x09, + 0x58, 0x6a, 0xd9, 0x12, 0xb0, 0xfa, 0x63, 0x58, 0x37, 0xa6, 0x6d, 0x3a, 0x7f, 0x0f, 0x0a, 0xde, + 0x38, 0xc9, 0xe7, 0x45, 0x7a, 0x19, 0xa2, 0xd7, 0x7f, 0x92, 0x82, 0xd5, 0xb6, 0x2b, 0x85, 0xef, + 0x9a, 0xce, 0x8e, 0x63, 0x0e, 0xf8, 0xbb, 0xa1, 0x95, 0x5a, 0x1c, 0xad, 0x27, 0x71, 0xa7, 0x0d, + 0x96, 0xa3, 0x13, 0xcf, 0xfc, 0x06, 0x6c, 0x08, 0xcb, 0x96, 0x9e, 0xaf, 0x1c, 0xd8, 0xb0, 0x52, + 0xef, 0x3a, 0x30, 0x05, 0xee, 0xd2, 0x92, 0xe8, 0xa9, 0x69, 0xae, 0xc2, 0xf5, 0x29, 0x68, 0xe8, + 0x9d, 0xa6, 0xf9, 0x6d, 0xa8, 0xc6, 0xbb, 0xd1, 0xb6, 0xe7, 0xca, 0xb6, 0x6b, 0x89, 0x73, 0x72, + 0x85, 0x58, 0xa6, 0xfe, 0x6b, 0x85, 0xd0, 0x09, 0x7b, 0xaa, 0xeb, 0xf8, 0x7c, 0xcf, 0x8b, 0x2f, + 0x89, 0xea, 0x56, 0xe2, 0x32, 0x72, 0x7a, 0x89, 0xcb, 0xc8, 0x1f, 0xc6, 0x17, 0x4a, 0xd5, 0x46, + 0xf1, 0xca, 0xc2, 0xdd, 0x87, 0xca, 0x8f, 0xb4, 0xdb, 0xdd, 0x15, 0x89, 0xdb, 0xa5, 0x6f, 0xea, + 0x58, 0x2b, 0xbb, 0x8c, 0xaf, 0xaa, 0xce, 0xf6, 0xdf, 0x99, 0xbd, 0xc5, 0xb0, 0x5c, 0x19, 0xe0, + 0x9c, 0x3b, 0x09, 0x2f, 0xed, 0x4e, 0x7e, 0x6b, 0x26, 0xac, 0x29, 0x2e, 0x4c, 0x60, 0x5d, 0x71, + 0x47, 0xf3, 0x5b, 0x50, 0x18, 0xda, 0x81, 0xf4, 0x7c, 0x75, 0x6f, 0x78, 0xfe, 0x9e, 0x53, 0x62, + 0xb4, 0x76, 0x15, 0x22, 0xd5, 0x6c, 0x85, 0x54, 0xfc, 0xbb, 0xb0, 0x41, 0x03, 0x7f, 0x18, 0x7b, + 0x0d, 0x41, 0xb5, 0xbc, 0xb0, 0x56, 0x2e, 0xc1, 0x6a, 0x6b, 0x86, 0xc4, 0x98, 0x67, 0x52, 0x1b, + 0x00, 0xc4, 0xf3, 0x33, 0x67, 0xc5, 0x3e, 0xc3, 0xbd, 0xe1, 0x9b, 0x90, 0x0f, 0x26, 0xc7, 0xf1, + 0x09, 0x95, 0x6e, 0xd5, 0xce, 0xa1, 0x36, 0xe7, 0x1d, 0x1c, 0x0a, 0x5f, 0x89, 0x7b, 0xe5, 0xe5, + 0xe5, 0x0f, 0x93, 0x13, 0xaf, 0x94, 0xf3, 0xee, 0x25, 0xb3, 0x17, 0x71, 0x4e, 0x68, 0x40, 0xed, + 0x1d, 0x28, 0x27, 0x06, 0x15, 0x2d, 0xf3, 0xc4, 0xb5, 0xbc, 0x30, 0x69, 0x8a, 0xcf, 0xea, 0xf2, + 0x96, 0x15, 0xa6, 0x4d, 0xe9, 0xb9, 0x66, 0x00, 0x9b, 0x1d, 0xc0, 0x2b, 0x42, 0xdf, 0x57, 0xa0, + 0x92, 0x70, 0xe9, 0xa2, 0x84, 0xda, 0x34, 0xb0, 0x7e, 0x06, 0x9f, 0x4f, 0xb0, 0x3b, 0x14, 0xfe, + 0xc8, 0x0e, 0x70, 0x23, 0x51, 0x21, 0x1d, 0x65, 0x2f, 0x2c, 0xe1, 0x4a, 0x5b, 0x86, 0x16, 0x34, + 0x6a, 0xf3, 0x5f, 0x80, 0xdc, 0x58, 0xf8, 0xa3, 0x40, 0x5b, 0xd1, 0x59, 0x0d, 0x5a, 0xc8, 0x36, + 0x30, 0x14, 0x4d, 0xfd, 0xef, 0xa5, 0xa0, 0xb8, 0x2f, 0xa4, 0x89, 0xbe, 0x03, 0xdf, 0x9f, 0xf9, + 0xca, 0xfc, 0xa9, 0x6a, 0x88, 0xba, 0xa9, 0x83, 0xcc, 0xcd, 0xb6, 0xc6, 0xd7, 0xed, 0xdd, 0x95, + 0x58, 0xb0, 0xda, 0x16, 0x14, 0x34, 0xb8, 0xf6, 0x2e, 0xac, 0xcf, 0x60, 0xd2, 0xb8, 0x28, 0xdf, + 0xbe, 0x7b, 0x31, 0x0a, 0x4b, 0x7f, 0x56, 0x8d, 0x69, 0xe0, 0x56, 0x09, 0x0a, 0x63, 0x45, 0x50, + 0xff, 0xdd, 0x1b, 0x54, 0x70, 0x62, 0x9f, 0x60, 0xb0, 0xbd, 0x68, 0x67, 0xbd, 0x03, 0x40, 0x5b, + 0xb3, 0x2a, 0x4b, 0x50, 0x49, 0xce, 0x04, 0x84, 0xbf, 0x1f, 0x65, 0xa7, 0xb3, 0x0b, 0x9d, 0xaa, + 0x24, 0xf3, 0xd9, 0x14, 0x75, 0x15, 0x0a, 0x76, 0xb0, 0x87, 0x5b, 0x9b, 0x2e, 0xe5, 0x09, 0x9b, + 0xfc, 0x9b, 0x90, 0xb7, 0x47, 0x63, 0xcf, 0x97, 0x3a, 0x7d, 0x7d, 0x25, 0xd7, 0x36, 0x61, 0xee, + 0xae, 0x18, 0x9a, 0x06, 0xa9, 0xc5, 0x39, 0x51, 0x17, 0x5f, 0x4c, 0xdd, 0x3a, 0x0f, 0xa9, 0x15, + 0x0d, 0xff, 0x0e, 0x54, 0x06, 0xaa, 0x2e, 0x51, 0x31, 0xd6, 0x46, 0xe4, 0x2b, 0x57, 0x31, 0x79, + 0x94, 0x24, 0xd8, 0x5d, 0x31, 0xa6, 0x39, 0x20, 0x4b, 0x74, 0xe0, 0x45, 0x20, 0x7b, 0xde, 0x47, + 0x9e, 0xed, 0x52, 0x50, 0xfa, 0x02, 0x96, 0x46, 0x92, 0x00, 0x59, 0x4e, 0x71, 0xe0, 0x5f, 0x47, + 0x8f, 0x27, 0x90, 0xfa, 0xea, 0xf6, 0xdd, 0xab, 0x38, 0xf5, 0x44, 0xa0, 0x2f, 0x5d, 0x07, 0x92, + 0x9f, 0x43, 0x2d, 0xb1, 0x48, 0xf4, 0x47, 0x1a, 0xe3, 0xb1, 0xef, 0x61, 0x64, 0x5b, 0x21, 0x6e, + 0x5f, 0xbf, 0x8a, 0xdb, 0xe1, 0xa5, 0xd4, 0xbb, 0x2b, 0xc6, 0x15, 0xbc, 0x79, 0x0f, 0x23, 0x3b, + 0xdd, 0x85, 0x3d, 0x61, 0x9e, 0x85, 0x17, 0xbf, 0xef, 0x2f, 0x35, 0x0a, 0x44, 0xb1, 0xbb, 0x62, + 0xcc, 0xf0, 0xe0, 0xbf, 0x04, 0x1b, 0x53, 0xdf, 0xa4, 0xbb, 0x9e, 0xea, 0x5a, 0xf8, 0xd7, 0x96, + 0xee, 0x06, 0x12, 0xed, 0xae, 0x18, 0xf3, 0x9c, 0xf8, 0x04, 0x3e, 0x37, 0xdf, 0xa5, 0x6d, 0xd1, + 0x77, 0x6c, 0x57, 0xe8, 0x1b, 0xe4, 0xef, 0xbc, 0xdc, 0x68, 0x69, 0xe2, 0xdd, 0x15, 0xe3, 0x72, + 0xce, 0xfc, 0xcf, 0xc3, 0xed, 0xf1, 0x42, 0x13, 0xa3, 0x4c, 0x97, 0xbe, 0x80, 0xfe, 0xde, 0x92, + 0x5f, 0x9e, 0xa3, 0xdf, 0x5d, 0x31, 0xae, 0xe4, 0x8f, 0xbe, 0x33, 0x45, 0xd0, 0xba, 0x7c, 0x5a, + 0x35, 0xf8, 0x6d, 0x28, 0x99, 0x7d, 0x67, 0x57, 0x98, 0x56, 0x94, 0x61, 0x8f, 0x01, 0xb5, 0xff, + 0x91, 0x82, 0xbc, 0xd6, 0xf7, 0xdb, 0xd1, 0x29, 0x7a, 0x64, 0xba, 0x63, 0x00, 0xff, 0x00, 0x4a, + 0xc2, 0xf7, 0x3d, 0xbf, 0xe9, 0x59, 0x61, 0x01, 0xe2, 0x6c, 0xfa, 0x57, 0xf1, 0xd9, 0x6c, 0x85, + 0x68, 0x46, 0x4c, 0xc1, 0xdf, 0x07, 0x50, 0xeb, 0xbc, 0x17, 0xdf, 0x82, 0xa9, 0x2d, 0xa6, 0x57, + 0x87, 0x36, 0x31, 0x76, 0x9c, 0x3c, 0x0b, 0x4f, 0x4c, 0xc2, 0x66, 0x14, 0x70, 0xe6, 0x12, 0x01, + 0xe7, 0x6d, 0x9d, 0x47, 0x38, 0xc0, 0x17, 0xfa, 0x2e, 0x58, 0x04, 0xa8, 0xfd, 0xeb, 0x14, 0xe4, + 0x95, 0xf1, 0xe0, 0xad, 0xf9, 0x1e, 0xbd, 0xf6, 0x62, 0x9b, 0xb3, 0x39, 0xdb, 0xb3, 0x6f, 0x02, + 0x28, 0x1b, 0x94, 0xe8, 0xd9, 0xed, 0x19, 0x3e, 0x9a, 0x34, 0x2c, 0xe0, 0x8d, 0xf1, 0xeb, 0x0f, + 0xd5, 0x7d, 0x25, 0xca, 0xd5, 0x3e, 0xd9, 0xdb, 0x63, 0x2b, 0x7c, 0x03, 0x2a, 0x4f, 0x0e, 0x1e, + 0x1f, 0x74, 0x9e, 0x1d, 0x1c, 0xb5, 0x0c, 0xa3, 0x63, 0xa8, 0x94, 0xed, 0x56, 0x63, 0xfb, 0xa8, + 0x7d, 0x70, 0xf8, 0xa4, 0xc7, 0xd2, 0xb5, 0x7f, 0x96, 0x82, 0xca, 0x94, 0xed, 0xfa, 0xe3, 0x9d, + 0xba, 0xc4, 0xf0, 0x67, 0x16, 0x0f, 0x7f, 0xf6, 0xb2, 0xe1, 0xcf, 0xcd, 0x0e, 0xff, 0x6f, 0xa7, + 0xa0, 0x32, 0x65, 0x23, 0x93, 0xdc, 0x53, 0xd3, 0xdc, 0x93, 0x3b, 0x7d, 0x7a, 0x66, 0xa7, 0xaf, + 0xc3, 0x6a, 0xf8, 0x7c, 0x10, 0x67, 0x1c, 0xa6, 0x60, 0x49, 0x1c, 0xba, 0x30, 0x90, 0x9d, 0xc6, + 0xa1, 0x4b, 0x03, 0x57, 0x4b, 0x4b, 0x17, 0x24, 0x03, 0xba, 0x3f, 0x5e, 0xbb, 0xdc, 0x82, 0x5e, + 0xd1, 0x85, 0x47, 0x50, 0x1e, 0xc7, 0xcb, 0xf4, 0xe5, 0xdc, 0x92, 0x24, 0xe5, 0x0b, 0xe4, 0xfc, + 0x71, 0x0a, 0xd6, 0xa6, 0x6d, 0xee, 0x9f, 0xe8, 0x61, 0xfd, 0x87, 0x29, 0xd8, 0x98, 0xb3, 0xe4, + 0x57, 0x3a, 0x76, 0xb3, 0x72, 0xa5, 0x97, 0x90, 0x2b, 0xb3, 0x40, 0xae, 0xcb, 0x2d, 0xc9, 0xd5, + 0x12, 0x77, 0xe1, 0x73, 0x97, 0xee, 0x09, 0x57, 0x0c, 0xf5, 0x14, 0xd3, 0xcc, 0x2c, 0xd3, 0xdf, + 0x4a, 0xc1, 0xed, 0xab, 0xec, 0xfd, 0xff, 0x77, 0xbd, 0x9a, 0x95, 0xb0, 0xfe, 0x6e, 0x74, 0xf4, + 0x5e, 0x86, 0x82, 0xfe, 0x5d, 0x26, 0x5d, 0xdc, 0x3c, 0xf4, 0x9e, 0xbb, 0x2a, 0x13, 0x6d, 0x08, + 0x53, 0xdf, 0x5c, 0x37, 0xc4, 0xd8, 0xb1, 0xe9, 0xf0, 0xf2, 0x16, 0x40, 0x83, 0xe2, 0xba, 0xf0, + 0x22, 0x49, 0x73, 0xaf, 0xd3, 0x6d, 0xb1, 0x95, 0xa4, 0x13, 0xfb, 0x49, 0x68, 0x88, 0xeb, 0x87, + 0x90, 0x8f, 0x2f, 0x03, 0xec, 0x9b, 0xfe, 0xa9, 0xa5, 0x8e, 0x08, 0x57, 0xa1, 0x78, 0xa8, 0x43, + 0x28, 0xf5, 0xa9, 0x8f, 0xba, 0x9d, 0x03, 0x95, 0xf4, 0xde, 0xee, 0xf4, 0xd4, 0x95, 0x82, 0xee, + 0xd3, 0x47, 0xea, 0xac, 0xea, 0x91, 0xd1, 0x38, 0xdc, 0x3d, 0x22, 0x8c, 0x5c, 0xfd, 0x37, 0xb3, + 0xe1, 0xae, 0x56, 0x37, 0xf4, 0xe1, 0x23, 0x40, 0x1e, 0xad, 0xb9, 0xa7, 0x19, 0x47, 0x9f, 0xa1, + 0x32, 0xd8, 0xd6, 0xb9, 0xca, 0x43, 0xb0, 0x34, 0xcf, 0x43, 0xfa, 0xf0, 0x58, 0xd5, 0xee, 0xec, + 0xca, 0x91, 0xa3, 0x6e, 0x16, 0xf6, 0xce, 0x25, 0xcb, 0xe1, 0x43, 0x33, 0x38, 0x63, 0xf9, 0xfa, + 0xbf, 0xc8, 0x40, 0x29, 0x32, 0x95, 0x2f, 0x63, 0xba, 0x39, 0x87, 0xb5, 0xf6, 0x41, 0xaf, 0x65, + 0x1c, 0x34, 0xf6, 0x34, 0x4a, 0x86, 0x5f, 0x83, 0xf5, 0x9d, 0xf6, 0x5e, 0xeb, 0x68, 0xaf, 0xd3, + 0xd8, 0xd6, 0xc0, 0x22, 0xbf, 0x09, 0xbc, 0xbd, 0x7f, 0xd8, 0x31, 0x7a, 0x47, 0xed, 0xee, 0x51, + 0xb3, 0x71, 0xd0, 0x6c, 0xed, 0xb5, 0xb6, 0x59, 0x9e, 0xbf, 0x02, 0x77, 0x0f, 0x3a, 0xbd, 0x76, + 0xe7, 0xe0, 0xe8, 0xa0, 0x73, 0xd4, 0xd9, 0xfa, 0xa8, 0xd5, 0xec, 0x75, 0x8f, 0xda, 0x07, 0x47, + 0xc8, 0xf5, 0x91, 0xd1, 0xc0, 0x37, 0x2c, 0xc7, 0xef, 0xc2, 0x6d, 0x8d, 0xd5, 0x6d, 0x19, 0x4f, + 0x5b, 0x06, 0x32, 0x79, 0x72, 0xd0, 0x78, 0xda, 0x68, 0xef, 0x35, 0xb6, 0xf6, 0x5a, 0x6c, 0x95, + 0xdf, 0x81, 0x9a, 0xc6, 0x30, 0x1a, 0xbd, 0xd6, 0xd1, 0x5e, 0x7b, 0xbf, 0xdd, 0x3b, 0x6a, 0x7d, + 0xb7, 0xd9, 0x6a, 0x6d, 0xb7, 0xb6, 0x59, 0x85, 0x7f, 0x05, 0xbe, 0x4c, 0x42, 0x69, 0x21, 0xa6, + 0x3f, 0xf6, 0x49, 0xfb, 0xf0, 0xa8, 0x61, 0x34, 0x77, 0xdb, 0x4f, 0x5b, 0x6c, 0x8d, 0xbf, 0x06, + 0x5f, 0xba, 0x1c, 0x75, 0xbb, 0x6d, 0xb4, 0x9a, 0xbd, 0x8e, 0xf1, 0x31, 0xdb, 0xe0, 0x5f, 0x80, + 0xcf, 0xed, 0xf6, 0xf6, 0xf7, 0x8e, 0x9e, 0x19, 0x9d, 0x83, 0x47, 0x47, 0xf4, 0xd8, 0xed, 0x19, + 0x4f, 0x9a, 0xbd, 0x27, 0x46, 0x8b, 0x01, 0xaf, 0xc1, 0xcd, 0xc3, 0xad, 0xa3, 0x83, 0x4e, 0xef, + 0xa8, 0x71, 0xf0, 0xf1, 0xd6, 0x5e, 0xa7, 0xf9, 0xf8, 0x68, 0xa7, 0x63, 0xec, 0x37, 0x7a, 0xac, + 0xcc, 0xbf, 0x0a, 0xaf, 0x35, 0xbb, 0x4f, 0xb5, 0x98, 0x9d, 0x9d, 0x23, 0xa3, 0xf3, 0xac, 0x7b, + 0xd4, 0x31, 0x8e, 0x8c, 0xd6, 0x1e, 0xf5, 0xb9, 0x1b, 0xcb, 0x5e, 0xe0, 0xb7, 0xa1, 0xda, 0x3e, + 0xe8, 0x3e, 0xd9, 0xd9, 0x69, 0x37, 0xdb, 0xad, 0x83, 0xde, 0xd1, 0x61, 0xcb, 0xd8, 0x6f, 0x77, + 0xbb, 0x88, 0xc6, 0x4a, 0xf5, 0x6f, 0x43, 0xbe, 0xed, 0x9e, 0xd9, 0x92, 0xd6, 0x97, 0x56, 0x46, + 0x1d, 0x71, 0x85, 0x4d, 0x5a, 0x16, 0xf6, 0xc0, 0xa5, 0x1b, 0xf3, 0xb4, 0xba, 0x56, 0x8d, 0x18, + 0x50, 0xff, 0xc7, 0x69, 0xa8, 0x28, 0x16, 0x61, 0x04, 0x77, 0x0f, 0xd6, 0x75, 0x2a, 0xb4, 0x3d, + 0x6d, 0xc2, 0x66, 0xc1, 0xf4, 0x53, 0x54, 0x0a, 0x94, 0x30, 0x64, 0x49, 0x10, 0x1d, 0xaf, 0x11, + 0x73, 0x8c, 0x04, 0xd5, 0xc1, 0x62, 0x0c, 0xf8, 0xac, 0x16, 0x0c, 0xad, 0xa3, 0x42, 0xec, 0x7b, + 0x6e, 0x33, 0xba, 0x6c, 0x31, 0x05, 0xe3, 0x9f, 0xc0, 0xad, 0xa8, 0xdd, 0x72, 0xfb, 0xfe, 0xc5, + 0x38, 0xfa, 0xc5, 0xb8, 0xc2, 0xc2, 0x94, 0xc2, 0x8e, 0xed, 0x88, 0x29, 0x44, 0xe3, 0x32, 0x06, + 0xf5, 0xdf, 0x4b, 0x25, 0xe2, 0x5e, 0x15, 0xd7, 0x5e, 0x69, 0xf1, 0x17, 0x9d, 0xc1, 0x60, 0xe4, + 0xa9, 0xc5, 0xd7, 0x8e, 0x88, 0x6e, 0xf2, 0x43, 0xe0, 0xf6, 0xbc, 0xd0, 0xd9, 0x25, 0x85, 0x5e, + 0x40, 0x3b, 0x9b, 0x42, 0xcf, 0xcd, 0xa7, 0xd0, 0xef, 0x00, 0x0c, 0x1c, 0xef, 0xd8, 0x74, 0x12, + 0x8e, 0x66, 0x02, 0x52, 0x77, 0xa0, 0x18, 0xfe, 0x2e, 0x1d, 0xbf, 0x09, 0x79, 0xfa, 0x65, 0xba, + 0x28, 0xa1, 0xa8, 0x5a, 0x7c, 0x17, 0xd6, 0xc4, 0xb4, 0xcc, 0xe9, 0x25, 0x65, 0x9e, 0xa1, 0xab, + 0x7f, 0x03, 0x36, 0xe6, 0x90, 0x70, 0x10, 0xc7, 0xa6, 0x8c, 0x2e, 0xa7, 0xe3, 0xf3, 0xfc, 0x21, + 0x76, 0xfd, 0x3f, 0xa6, 0x61, 0x75, 0xdf, 0x74, 0xed, 0x13, 0x11, 0xc8, 0x50, 0xda, 0xa0, 0x3f, + 0x14, 0x23, 0x33, 0x94, 0x56, 0xb5, 0x74, 0x96, 0x21, 0x9d, 0xcc, 0xdf, 0xcf, 0x1d, 0xf7, 0xdc, + 0x84, 0xbc, 0x39, 0x91, 0xc3, 0xa8, 0xc2, 0x5b, 0xb7, 0x70, 0xee, 0x1c, 0xbb, 0x2f, 0xdc, 0x20, + 0xd4, 0xcd, 0xb0, 0x19, 0x97, 0xb1, 0xe4, 0xaf, 0x28, 0x63, 0x29, 0xcc, 0x8f, 0xff, 0x5d, 0x28, + 0x07, 0x7d, 0x5f, 0x08, 0x37, 0x18, 0x7a, 0x32, 0xfc, 0x4d, 0xc3, 0x24, 0x88, 0x8a, 0xbd, 0xbc, + 0xe7, 0x2e, 0xae, 0xd0, 0x3d, 0xdb, 0x3d, 0xd5, 0x35, 0x4c, 0x53, 0x30, 0xd4, 0x41, 0xca, 0xb1, + 0xd8, 0x9f, 0x0a, 0x8a, 0xef, 0x73, 0x46, 0xd4, 0xa6, 0x2c, 0x8a, 0x29, 0xc5, 0xc0, 0xf3, 0x6d, + 0xa1, 0x52, 0x89, 0x25, 0x23, 0x01, 0x41, 0x5a, 0xc7, 0x74, 0x07, 0x13, 0x73, 0x20, 0xf4, 0xa1, + 0x70, 0xd4, 0xae, 0xff, 0xcf, 0x1c, 0xc0, 0xbe, 0x18, 0x1d, 0x0b, 0x3f, 0x18, 0xda, 0x63, 0x3a, + 0xea, 0xb0, 0x75, 0x5d, 0x6b, 0xc5, 0xa0, 0x67, 0xfe, 0xde, 0x54, 0xc9, 0xf9, 0xfc, 0xe1, 0x64, + 0x4c, 0x3e, 0x9b, 0x82, 0xc1, 0xc1, 0x31, 0xa5, 0xd0, 0x15, 0x44, 0x34, 0xfe, 0x59, 0x23, 0x09, + 0xa2, 0xe2, 0x2e, 0x53, 0x8a, 0x96, 0x6b, 0xa9, 0x14, 0x4f, 0xd6, 0x88, 0xda, 0x74, 0x69, 0x25, + 0x68, 0x4c, 0xa4, 0x67, 0x08, 0x57, 0x3c, 0x8f, 0xee, 0x63, 0xc5, 0x20, 0xbe, 0x0f, 0x95, 0xb1, + 0x79, 0x31, 0x12, 0xae, 0xdc, 0x17, 0x72, 0xe8, 0x59, 0xba, 0xdc, 0xe7, 0xb5, 0xcb, 0x05, 0x3c, + 0x4c, 0xa2, 0x1b, 0xd3, 0xd4, 0xa8, 0x13, 0x6e, 0x40, 0xab, 0x44, 0x4d, 0xa3, 0x6e, 0xf1, 0x2d, + 0x00, 0xf5, 0x44, 0x91, 0x53, 0x71, 0x71, 0x26, 0xca, 0x1c, 0x89, 0x40, 0xf8, 0x67, 0xb6, 0xb2, + 0x63, 0x2a, 0x36, 0x8c, 0xa9, 0xd0, 0xea, 0x4d, 0x02, 0xe1, 0xb7, 0x46, 0xa6, 0xed, 0xe8, 0x09, + 0x8e, 0x01, 0xfc, 0x6d, 0xb8, 0x11, 0x4c, 0x8e, 0x51, 0x67, 0x8e, 0x45, 0xcf, 0x3b, 0x10, 0xcf, + 0x03, 0x47, 0x48, 0x29, 0x7c, 0x5d, 0x5f, 0xb0, 0xf8, 0x65, 0x7d, 0x10, 0xb9, 0x3d, 0xf4, 0xfb, + 0x19, 0xf8, 0x14, 0xd7, 0x2d, 0x45, 0x20, 0x5d, 0xd4, 0xc5, 0x52, 0x9c, 0xc1, 0xaa, 0x02, 0xe9, + 0x9a, 0xaf, 0x34, 0xff, 0x32, 0x7c, 0x71, 0x0a, 0xc9, 0x50, 0x07, 0xc1, 0xc1, 0x8e, 0xed, 0x9a, + 0x8e, 0xfd, 0xa9, 0x3a, 0x96, 0xcf, 0xd4, 0xc7, 0x50, 0x99, 0x1a, 0x38, 0xba, 0x40, 0x48, 0x4f, + 0xba, 0x0a, 0x86, 0xc1, 0xaa, 0x6a, 0x77, 0xa5, 0x6f, 0xd3, 0x09, 0x47, 0x04, 0x69, 0xe2, 0x3a, + 0xf7, 0x58, 0x9a, 0x5f, 0x07, 0xa6, 0x20, 0x6d, 0xd7, 0x1c, 0x8f, 0x1b, 0xe3, 0xb1, 0x23, 0x58, + 0x86, 0x2e, 0x67, 0xc6, 0x50, 0x55, 0x78, 0xce, 0xb2, 0xf5, 0xef, 0xc2, 0x2d, 0x1a, 0x99, 0xa7, + 0xc2, 0x8f, 0x02, 0x5b, 0xdd, 0xd7, 0x1b, 0xb0, 0xa1, 0x9e, 0x0e, 0x3c, 0xa9, 0x5e, 0x93, 0xb3, + 0xc7, 0x61, 0x4d, 0x81, 0xd1, 0xd7, 0xe9, 0x0a, 0xba, 0x72, 0x19, 0xc1, 0x22, 0xbc, 0x74, 0xfd, + 0x27, 0x79, 0xe0, 0xb1, 0x42, 0xf4, 0x6c, 0xe1, 0x6f, 0x9b, 0xd2, 0x4c, 0x64, 0x26, 0x2b, 0x97, + 0x9e, 0xad, 0xbf, 0xb8, 0x64, 0xed, 0x26, 0xe4, 0xed, 0x00, 0x43, 0x31, 0x5d, 0x50, 0xaa, 0x5b, + 0x7c, 0x0f, 0x60, 0x2c, 0x7c, 0xdb, 0xb3, 0x48, 0x83, 0x72, 0x0b, 0x2b, 0xff, 0xe7, 0x85, 0xda, + 0x3c, 0x8c, 0x68, 0x8c, 0x04, 0x3d, 0xca, 0xa1, 0x5a, 0xea, 0xa4, 0x3a, 0x4f, 0x42, 0x27, 0x41, + 0xfc, 0x0d, 0xb8, 0x36, 0xf6, 0xed, 0xbe, 0x50, 0xd3, 0xf1, 0x24, 0xb0, 0x9a, 0xf4, 0xab, 0x73, + 0x05, 0xc2, 0x5c, 0xf4, 0x0a, 0x35, 0xd0, 0x74, 0x29, 0x40, 0x09, 0xe8, 0x6c, 0x56, 0x5f, 0x39, + 0x56, 0x25, 0x97, 0x15, 0x63, 0xf1, 0x4b, 0x7e, 0x1f, 0x98, 0x7e, 0xb1, 0x6f, 0xbb, 0x7b, 0xc2, + 0x1d, 0xc8, 0x21, 0x29, 0x77, 0xc5, 0x98, 0x83, 0x93, 0x05, 0x53, 0xbf, 0xed, 0xa3, 0xce, 0x6d, + 0x4a, 0x46, 0xd4, 0x56, 0xd7, 0xd8, 0x1d, 0xcf, 0xef, 0x4a, 0x5f, 0xd7, 0x8e, 0x46, 0x6d, 0xf4, + 0x59, 0x02, 0x92, 0xf5, 0xd0, 0xf7, 0xac, 0x09, 0x9d, 0x2a, 0x28, 0x23, 0x36, 0x0b, 0x8e, 0x31, + 0xf7, 0x4d, 0x57, 0xd7, 0x0d, 0x56, 0x92, 0x98, 0x11, 0x98, 0x62, 0x30, 0x2f, 0x88, 0x19, 0xae, + 0xeb, 0x18, 0x2c, 0x01, 0xd3, 0x38, 0x31, 0x2b, 0x16, 0xe1, 0xc4, 0x7c, 0xa8, 0xff, 0x96, 0xef, + 0xd9, 0x56, 0xcc, 0x6b, 0x43, 0x55, 0x75, 0xce, 0xc2, 0x13, 0xb8, 0x31, 0x4f, 0x3e, 0x85, 0x1b, + 0xc1, 0xeb, 0x3f, 0x48, 0x01, 0xc4, 0x93, 0x8f, 0x2a, 0x1f, 0xb7, 0xe2, 0x25, 0x7e, 0x0b, 0xae, + 0x25, 0xc1, 0x74, 0x39, 0x80, 0x0e, 0x78, 0x39, 0xac, 0xc5, 0x2f, 0xb6, 0xcd, 0x8b, 0x80, 0xa5, + 0xf5, 0x35, 0x61, 0x0d, 0x7b, 0x26, 0x04, 0x15, 0xd2, 0x5d, 0x07, 0x16, 0x03, 0xe9, 0xee, 0x57, + 0xc0, 0xb2, 0xd3, 0xa8, 0x1f, 0x0b, 0xd3, 0x0f, 0x58, 0xae, 0xbe, 0x0b, 0x79, 0x75, 0xb8, 0xb4, + 0xe0, 0x58, 0xf8, 0xe5, 0x6a, 0x3c, 0xfe, 0x6a, 0x0a, 0x60, 0x5b, 0x55, 0xf0, 0xe2, 0x2e, 0xbe, + 0xe0, 0xb4, 0x7d, 0x91, 0x47, 0x65, 0x5a, 0x16, 0x55, 0x42, 0x67, 0xa2, 0x5f, 0x8c, 0xc1, 0x26, + 0x6a, 0x8e, 0x19, 0x56, 0x4e, 0xa9, 0x35, 0x17, 0xb5, 0xd5, 0x06, 0xd2, 0xf4, 0x5c, 0x57, 0xf4, + 0x71, 0xfb, 0x89, 0x36, 0x90, 0x08, 0x54, 0xff, 0xb7, 0x05, 0x28, 0x37, 0x87, 0xa6, 0xdc, 0x17, + 0x41, 0x60, 0x0e, 0xc4, 0x9c, 0x2c, 0x55, 0x28, 0x78, 0xbe, 0x25, 0xfc, 0xf8, 0xfe, 0x96, 0x6e, + 0x26, 0x6b, 0x0c, 0x32, 0xd3, 0x35, 0x06, 0xb7, 0xa1, 0xa4, 0x4e, 0x30, 0xac, 0x86, 0x32, 0x03, + 0x19, 0x23, 0x06, 0xe0, 0x5e, 0x3d, 0xf2, 0x2c, 0x32, 0x46, 0x0d, 0x95, 0xfc, 0xcf, 0x18, 0x09, + 0x88, 0x2a, 0xe9, 0x18, 0x3b, 0x17, 0x3d, 0x4f, 0xcb, 0xd4, 0xb6, 0xe2, 0xcb, 0xae, 0xd3, 0x70, + 0xde, 0x84, 0xc2, 0x48, 0x35, 0xf4, 0x41, 0xc6, 0x6c, 0xca, 0x3f, 0xd1, 0xb5, 0x4d, 0xfd, 0x57, + 0xdf, 0x37, 0x31, 0x42, 0x4a, 0x0c, 0xd1, 0x4d, 0x29, 0xcd, 0xfe, 0x70, 0xa4, 0x4d, 0x44, 0x66, + 0xc1, 0x99, 0x66, 0x92, 0x51, 0x23, 0xc2, 0x36, 0x92, 0x94, 0x7c, 0x0b, 0x4a, 0xbe, 0x30, 0xa7, + 0x8e, 0x55, 0x5f, 0xb9, 0x82, 0x8d, 0x11, 0xe2, 0x1a, 0x31, 0x59, 0xed, 0x47, 0x29, 0x58, 0x9b, + 0x16, 0xf4, 0x8f, 0xe3, 0x47, 0xbf, 0xbe, 0x19, 0xff, 0xe8, 0xd7, 0x67, 0xf8, 0x01, 0xad, 0xdf, + 0x4a, 0x01, 0xc4, 0x63, 0x80, 0x26, 0x5f, 0xfd, 0x38, 0x51, 0xe8, 0x84, 0xaa, 0x16, 0xdf, 0x9d, + 0xba, 0x03, 0xff, 0xf6, 0x52, 0x03, 0x9a, 0x78, 0x4c, 0x94, 0x25, 0x3f, 0x80, 0xb5, 0x69, 0x38, + 0xfd, 0xdc, 0x50, 0x7b, 0xaf, 0xa5, 0x52, 0x1c, 0xed, 0xfd, 0xc6, 0xa3, 0x96, 0xbe, 0xdf, 0xd3, + 0x3e, 0x78, 0xcc, 0xd2, 0xb5, 0xdf, 0x4f, 0x41, 0x29, 0x1a, 0x5e, 0xfe, 0x9d, 0xe4, 0xbc, 0xa8, + 0x3a, 0x89, 0xb7, 0x96, 0x99, 0x97, 0xf8, 0xa9, 0xe5, 0x4a, 0xff, 0x22, 0x39, 0x4d, 0x1e, 0xac, + 0x4d, 0xbf, 0x5c, 0x60, 0x13, 0x1e, 0x4d, 0xdb, 0x84, 0x37, 0x97, 0xfa, 0x64, 0x18, 0x79, 0xed, + 0xd9, 0x81, 0xd4, 0xe6, 0xe2, 0xfd, 0xf4, 0x7b, 0xa9, 0xda, 0x5d, 0x58, 0x4d, 0xbe, 0x9a, 0xbf, + 0xc4, 0x77, 0xff, 0xf7, 0x33, 0xb0, 0x36, 0x5d, 0x6a, 0x40, 0x57, 0x86, 0x54, 0x99, 0x4b, 0xc7, + 0xb1, 0x12, 0x95, 0xdc, 0x8c, 0xaf, 0x43, 0x59, 0xc7, 0x76, 0x04, 0xd8, 0xa0, 0x24, 0x8a, 0x37, + 0x12, 0xec, 0x6e, 0xf2, 0x87, 0x0d, 0xdf, 0xe0, 0x10, 0x5e, 0xe6, 0x62, 0x63, 0x5e, 0xd2, 0x3f, + 0xf1, 0xf4, 0xcb, 0x69, 0x5e, 0x49, 0xd4, 0x13, 0xff, 0x10, 0x1d, 0x9b, 0xf5, 0xad, 0x89, 0x6b, + 0x39, 0xc2, 0x8a, 0xa0, 0x3f, 0x4a, 0x42, 0xa3, 0xea, 0xe0, 0x5f, 0xce, 0xf2, 0x35, 0x28, 0x75, + 0x27, 0xc7, 0xba, 0x32, 0xf8, 0x2f, 0x64, 0xf9, 0x4d, 0xd8, 0xd0, 0x58, 0x71, 0x89, 0x1f, 0xfb, + 0x8b, 0x68, 0x82, 0xd7, 0x1a, 0x6a, 0xbc, 0xb4, 0xa0, 0xec, 0x2f, 0x65, 0x51, 0x04, 0xba, 0x23, + 0xfc, 0x97, 0x89, 0x4f, 0x74, 0xa3, 0x82, 0xfd, 0x4a, 0x96, 0xaf, 0x03, 0x74, 0x7b, 0xd1, 0x87, + 0x7e, 0x2d, 0xcb, 0xcb, 0x90, 0xef, 0xf6, 0x88, 0xdb, 0x0f, 0xb2, 0xfc, 0x06, 0xb0, 0xf8, 0xad, + 0x2e, 0x7c, 0xfc, 0x75, 0x25, 0x4c, 0x54, 0xc9, 0xf8, 0xd7, 0xb2, 0xd8, 0xaf, 0x70, 0x94, 0xd9, + 0xdf, 0xc8, 0x72, 0x06, 0xe5, 0x44, 0x6a, 0x8e, 0xfd, 0xcd, 0x2c, 0xe7, 0x50, 0xd9, 0xb7, 0x83, + 0xc0, 0x76, 0x07, 0xba, 0x07, 0xbf, 0x4a, 0x5f, 0xde, 0x89, 0x2e, 0x85, 0xb0, 0xdf, 0xc8, 0xf2, + 0x5b, 0xc0, 0x93, 0xc7, 0x11, 0xfa, 0xc5, 0xdf, 0x22, 0x6a, 0x65, 0xf6, 0x03, 0x0d, 0xfb, 0xdb, + 0x44, 0x8d, 0x9a, 0xa0, 0x01, 0xbf, 0x49, 0x03, 0xd2, 0x8c, 0x4b, 0x25, 0x35, 0xfc, 0x87, 0x44, + 0x1c, 0x4e, 0xa6, 0x82, 0xfd, 0x28, 0x7b, 0xff, 0x27, 0x94, 0x4e, 0x4e, 0x56, 0x1c, 0xf1, 0x55, + 0x28, 0x3a, 0x9e, 0x3b, 0x90, 0xea, 0x07, 0x25, 0x2b, 0x50, 0x0a, 0x86, 0x9e, 0x2f, 0xa9, 0x49, + 0xb7, 0xd6, 0x5c, 0xba, 0xbf, 0xac, 0xca, 0xc9, 0x55, 0x90, 0xa2, 0xd2, 0x73, 0xd2, 0x1c, 0xb0, + 0x72, 0x54, 0xe4, 0x99, 0x8d, 0x0a, 0x51, 0xe9, 0x1e, 0x75, 0x78, 0x4f, 0x95, 0xe5, 0x11, 0x75, + 0xe2, 0x3b, 0xaa, 0x20, 0x55, 0xa0, 0x83, 0xaa, 0x7e, 0x39, 0x6e, 0x3c, 0x44, 0x3f, 0xb8, 0xa4, + 0xa0, 0xde, 0xf7, 0x6c, 0x75, 0x03, 0x52, 0xd7, 0x77, 0x59, 0x28, 0x47, 0x54, 0xc2, 0xc0, 0xc4, + 0xfd, 0xbf, 0x93, 0x82, 0xd5, 0xf0, 0xf6, 0xb0, 0x3d, 0xb0, 0x5d, 0x55, 0xd2, 0x1a, 0xfe, 0x4c, + 0x67, 0xdf, 0xb1, 0xc7, 0xe1, 0xcf, 0xde, 0xad, 0x43, 0xd9, 0xf2, 0xcd, 0x41, 0xc3, 0xb5, 0xb6, + 0x7d, 0x6f, 0xac, 0xc4, 0x56, 0x07, 0x4e, 0xaa, 0x94, 0xf6, 0xb9, 0x38, 0x46, 0xf4, 0xb1, 0xf0, + 0x59, 0x96, 0x6a, 0xc7, 0x86, 0xa6, 0x6f, 0xbb, 0x83, 0xd6, 0xb9, 0x14, 0x6e, 0xa0, 0x4a, 0x6a, + 0xcb, 0x50, 0x98, 0x04, 0xa2, 0x6f, 0x06, 0x82, 0xe5, 0xb1, 0x71, 0x3c, 0xb1, 0x1d, 0x69, 0xbb, + 0xea, 0xd7, 0xe6, 0xa2, 0x9a, 0xd9, 0x22, 0xf6, 0xcc, 0x1c, 0xdb, 0xac, 0x74, 0xff, 0x77, 0x52, + 0x50, 0x26, 0xb5, 0x88, 0x53, 0xaa, 0xb1, 0xcb, 0x51, 0x86, 0xc2, 0x5e, 0xf4, 0xb3, 0x63, 0x79, + 0x48, 0x77, 0x4e, 0x55, 0x4a, 0x55, 0xab, 0x85, 0xba, 0x04, 0xa8, 0x7e, 0x81, 0x2c, 0xcb, 0x3f, + 0x07, 0x37, 0x0c, 0x31, 0xf2, 0xa4, 0x78, 0x66, 0xda, 0x32, 0x79, 0xaf, 0x24, 0x87, 0xd1, 0x89, + 0x7a, 0x15, 0x5e, 0x24, 0xc9, 0x53, 0x74, 0x82, 0x9f, 0x0d, 0x21, 0x05, 0xec, 0x3d, 0x41, 0x74, + 0xb8, 0x52, 0x8c, 0x50, 0x3e, 0xf2, 0x6c, 0x17, 0xbf, 0x46, 0x57, 0x4f, 0x09, 0x42, 0xb9, 0x79, + 0x04, 0xc1, 0xfd, 0x03, 0xb8, 0xb9, 0x38, 0xa3, 0xac, 0x2e, 0xa5, 0xd2, 0x6f, 0xdd, 0xd2, 0x4d, + 0x83, 0x67, 0xbe, 0xad, 0xee, 0x16, 0x96, 0x20, 0xd7, 0x79, 0xee, 0x92, 0x5a, 0x6c, 0x40, 0xe5, + 0xc0, 0x4b, 0xd0, 0xb0, 0xcc, 0xfd, 0xfe, 0xd4, 0x21, 0x40, 0x3c, 0x28, 0xa1, 0x10, 0x2b, 0x89, + 0x5b, 0x34, 0x29, 0x95, 0x5e, 0xa6, 0x7f, 0x57, 0xa0, 0x2e, 0xec, 0xeb, 0xe4, 0xbb, 0xa5, 0x2e, + 0xec, 0x47, 0x62, 0x66, 0xd5, 0xef, 0x10, 0xb9, 0x7d, 0xe1, 0x08, 0x8b, 0xe5, 0xee, 0xbf, 0x07, + 0xeb, 0xba, 0xab, 0x7d, 0x11, 0x04, 0xe1, 0x2d, 0x94, 0x43, 0xdf, 0x3e, 0x53, 0x3f, 0x0a, 0xb0, + 0x0a, 0xc5, 0x43, 0xe1, 0x07, 0x9e, 0x4b, 0x3f, 0x88, 0x00, 0x90, 0xef, 0x0e, 0x4d, 0x1f, 0xbf, + 0x71, 0xbf, 0x09, 0x25, 0xba, 0x95, 0xf2, 0xd8, 0x76, 0x2d, 0xec, 0xc9, 0x96, 0x2e, 0xc4, 0xa6, + 0x5f, 0x9e, 0x39, 0xa3, 0xfe, 0x15, 0xd5, 0x2f, 0x6e, 0xb2, 0x34, 0xbf, 0x09, 0x1c, 0xa3, 0xe7, + 0x91, 0x49, 0xd7, 0x1c, 0x9d, 0x0b, 0xf5, 0xeb, 0xac, 0x99, 0xfb, 0xdf, 0x02, 0xae, 0x72, 0x40, + 0x96, 0x38, 0xb7, 0xdd, 0x41, 0x74, 0x83, 0x1a, 0xe8, 0xe7, 0x10, 0x2c, 0x71, 0x4e, 0x21, 0x56, + 0x19, 0x0a, 0x61, 0x23, 0xfc, 0x51, 0x86, 0x1d, 0x6f, 0xe2, 0xa2, 0x14, 0x4f, 0xe1, 0xba, 0xd2, + 0x19, 0x14, 0x8b, 0xee, 0xd0, 0x5d, 0x1a, 0x98, 0xaa, 0x2b, 0x45, 0x72, 0x12, 0x44, 0xb8, 0x2c, + 0x85, 0x82, 0x45, 0x41, 0x5d, 0x0c, 0x4f, 0xdf, 0xaf, 0xc3, 0xb5, 0x05, 0x91, 0x35, 0x59, 0x69, + 0x15, 0x5f, 0xb0, 0x95, 0xfb, 0x1f, 0xc2, 0x86, 0xb2, 0x2b, 0x07, 0xea, 0x96, 0x53, 0xb8, 0x45, + 0x3e, 0x6b, 0xef, 0xb4, 0xd5, 0xd0, 0x35, 0x5b, 0x7b, 0x7b, 0x4f, 0xf6, 0x1a, 0x06, 0x4b, 0xd1, + 0x04, 0x77, 0x7a, 0x47, 0xcd, 0xce, 0xc1, 0x41, 0xab, 0xd9, 0x6b, 0x6d, 0xb3, 0xf4, 0xd6, 0xfd, + 0x7f, 0xf7, 0xb3, 0x3b, 0xa9, 0x9f, 0xfe, 0xec, 0x4e, 0xea, 0xbf, 0xfe, 0xec, 0x4e, 0xea, 0x07, + 0x3f, 0xbf, 0xb3, 0xf2, 0xd3, 0x9f, 0xdf, 0x59, 0xf9, 0xcf, 0x3f, 0xbf, 0xb3, 0xf2, 0x09, 0x9b, + 0xfd, 0x17, 0x22, 0xc7, 0x79, 0x72, 0x69, 0xdf, 0xfa, 0x7f, 0x01, 0x00, 0x00, 0xff, 0xff, 0x23, + 0xad, 0xc9, 0xa3, 0x5d, 0x64, 0x00, 0x00, } func (m *SmartBlockSnapshotBase) Marshal() (dAtA []byte, err error) { diff --git a/pkg/lib/pb/model/protos/models.proto b/pkg/lib/pb/model/protos/models.proto index 86933635c..f0257f048 100644 --- a/pkg/lib/pb/model/protos/models.proto +++ b/pkg/lib/pb/model/protos/models.proto @@ -883,6 +883,7 @@ enum ObjectOrigin { usecase = 6; builtin = 7; bookmark = 8; + api = 9; } message RelationLink { From 1e0578a88a51ecd43981310d3cfe087898cf2e6a Mon Sep 17 00:00:00 2001 From: Jannis Metrikat <120120832+jmetrikat@users.noreply.github.com> Date: Wed, 15 Jan 2025 13:25:07 +0100 Subject: [PATCH 107/195] GO-4848: Refactor services to use bundled keys everywhere --- core/api/docs/docs.go | 6 ++- core/api/docs/swagger.json | 6 ++- core/api/docs/swagger.yaml | 2 + core/api/services/object/service.go | 62 ++++++++++++++--------------- core/api/services/search/service.go | 5 +-- core/api/services/space/service.go | 32 +++++++-------- core/api/util/util.go | 8 ++-- 7 files changed, 63 insertions(+), 58 deletions(-) diff --git a/core/api/docs/docs.go b/core/api/docs/docs.go index b14d66306..8d08db8c5 100644 --- a/core/api/docs/docs.go +++ b/core/api/docs/docs.go @@ -827,7 +827,8 @@ const docTemplate = `{ "type": "object", "properties": { "align": { - "type": "string" + "type": "string", + "example": "AlignLeft" }, "background_color": { "type": "string" @@ -848,7 +849,8 @@ const docTemplate = `{ "$ref": "#/definitions/object.Text" }, "vertical_align": { - "type": "string" + "type": "string", + "example": "VerticalAlignTop" } } }, diff --git a/core/api/docs/swagger.json b/core/api/docs/swagger.json index 68a3b91e7..8b02fed75 100644 --- a/core/api/docs/swagger.json +++ b/core/api/docs/swagger.json @@ -821,7 +821,8 @@ "type": "object", "properties": { "align": { - "type": "string" + "type": "string", + "example": "AlignLeft" }, "background_color": { "type": "string" @@ -842,7 +843,8 @@ "$ref": "#/definitions/object.Text" }, "vertical_align": { - "type": "string" + "type": "string", + "example": "VerticalAlignTop" } } }, diff --git a/core/api/docs/swagger.yaml b/core/api/docs/swagger.yaml index dc4fdc6dc..34576636a 100644 --- a/core/api/docs/swagger.yaml +++ b/core/api/docs/swagger.yaml @@ -23,6 +23,7 @@ definitions: object.Block: properties: align: + example: AlignLeft type: string background_color: type: string @@ -37,6 +38,7 @@ definitions: text: $ref: '#/definitions/object.Text' vertical_align: + example: VerticalAlignTop type: string type: object object.Detail: diff --git a/core/api/services/object/service.go b/core/api/services/object/service.go index 38bcdf20c..fa6d4ed1a 100644 --- a/core/api/services/object/service.go +++ b/core/api/services/object/service.go @@ -85,7 +85,7 @@ func (s *ObjectService) ListObjects(ctx context.Context, spaceId string, offset Offset: 0, Limit: 0, ObjectTypeFilter: []string{}, - Keys: []string{"id", "name"}, + Keys: []string{string(bundle.RelationKeyId), string(bundle.RelationKeyName)}, }) if resp.Error.Code != pb.RpcObjectSearchResponseError_NULL { @@ -101,7 +101,7 @@ func (s *ObjectService) ListObjects(ctx context.Context, spaceId string, offset objects = make([]Object, 0, len(paginatedObjects)) for _, record := range paginatedObjects { - object, err := s.GetObject(ctx, spaceId, record.Fields["id"].GetStringValue()) + object, err := s.GetObject(ctx, spaceId, record.Fields[string(bundle.RelationKeyId)].GetStringValue()) if err != nil { return nil, 0, false, err } @@ -126,7 +126,7 @@ func (s *ObjectService) GetObject(ctx context.Context, spaceId string, objectId return Object{}, ErrFailedRetrieveObject } - icon := util.GetIconFromEmojiOrImage(s.AccountInfo, resp.ObjectView.Details[0].Details.Fields["iconEmoji"].GetStringValue(), resp.ObjectView.Details[0].Details.Fields["iconImage"].GetStringValue()) + icon := util.GetIconFromEmojiOrImage(s.AccountInfo, resp.ObjectView.Details[0].Details.Fields[string(bundle.RelationKeyIconEmoji)].GetStringValue(), resp.ObjectView.Details[0].Details.Fields[string(bundle.RelationKeyIconImage)].GetStringValue()) objectTypeName, err := util.ResolveTypeToName(s.mw, spaceId, resp.ObjectView.Details[0].Details.Fields["type"].GetStringValue()) if err != nil { return Object{}, err @@ -134,12 +134,12 @@ func (s *ObjectService) GetObject(ctx context.Context, spaceId string, objectId object := Object{ Type: "object", - Id: resp.ObjectView.Details[0].Details.Fields["id"].GetStringValue(), - Name: resp.ObjectView.Details[0].Details.Fields["name"].GetStringValue(), + Id: resp.ObjectView.Details[0].Details.Fields[string(bundle.RelationKeyId)].GetStringValue(), + Name: resp.ObjectView.Details[0].Details.Fields[string(bundle.RelationKeyName)].GetStringValue(), Icon: icon, - Layout: model.ObjectTypeLayout_name[int32(resp.ObjectView.Details[0].Details.Fields["layout"].GetNumberValue())], + Layout: model.ObjectTypeLayout_name[int32(resp.ObjectView.Details[0].Details.Fields[string(bundle.RelationKeyLayout)].GetNumberValue())], ObjectType: objectTypeName, - SpaceId: resp.ObjectView.Details[0].Details.Fields["spaceId"].GetStringValue(), + SpaceId: resp.ObjectView.Details[0].Details.Fields[string(bundle.RelationKeySpaceId)].GetStringValue(), RootId: resp.ObjectView.RootId, Blocks: s.GetBlocks(resp), Details: s.GetDetails(resp), @@ -175,11 +175,11 @@ func (s *ObjectService) CreateObject(ctx context.Context, spaceId string, reques details := &types.Struct{ Fields: map[string]*types.Value{ - "name": pbtypes.String(request.Name), - "iconEmoji": pbtypes.String(request.Icon), - "description": pbtypes.String(request.Description), - "source": pbtypes.String(request.Source), - string(bundle.RelationKeyOrigin): pbtypes.Int64(int64(model.ObjectOrigin_api)), + string(bundle.RelationKeyName): pbtypes.String(request.Name), + string(bundle.RelationKeyIconEmoji): pbtypes.String(request.Icon), + string(bundle.RelationKeyDescription): pbtypes.String(request.Description), + string(bundle.RelationKeySource): pbtypes.String(request.Source), + string(bundle.RelationKeyOrigin): pbtypes.Int64(int64(model.ObjectOrigin_api)), }, } @@ -199,7 +199,7 @@ func (s *ObjectService) CreateObject(ctx context.Context, spaceId string, reques if request.Description != "" { relAddFeatResp := s.mw.ObjectRelationAddFeatured(ctx, &pb.RpcObjectRelationAddFeaturedRequest{ ContextId: resp.ObjectId, - Relations: []string{"description"}, + Relations: []string{string(bundle.RelationKeyDescription)}, }) if relAddFeatResp.Error.Code != pb.RpcObjectRelationAddFeaturedResponseError_NULL { @@ -283,11 +283,11 @@ func (s *ObjectService) ListTypes(ctx context.Context, spaceId string, offset in }, Sorts: []*model.BlockContentDataviewSort{ { - RelationKey: "name", + RelationKey: string(bundle.RelationKeyName), Type: model.BlockContentDataviewSort_Asc, }, }, - Keys: []string{"id", "uniqueKey", "name", "iconEmoji", "recommendedLayout"}, + Keys: []string{string(bundle.RelationKeyId), string(bundle.RelationKeyUniqueKey), string(bundle.RelationKeyName), string(bundle.RelationKeyIconEmoji), string(bundle.RelationKeyRecommendedLayout)}, }) if resp.Error.Code != pb.RpcObjectSearchResponseError_NULL { @@ -305,11 +305,11 @@ func (s *ObjectService) ListTypes(ctx context.Context, spaceId string, offset in for _, record := range paginatedTypes { objectTypes = append(objectTypes, ObjectType{ Type: "object_type", - Id: record.Fields["id"].GetStringValue(), - UniqueKey: record.Fields["uniqueKey"].GetStringValue(), - Name: record.Fields["name"].GetStringValue(), - Icon: record.Fields["iconEmoji"].GetStringValue(), - RecommendedLayout: model.ObjectTypeLayout_name[int32(record.Fields["recommendedLayout"].GetNumberValue())], + Id: record.Fields[string(bundle.RelationKeyId)].GetStringValue(), + UniqueKey: record.Fields[string(bundle.RelationKeyUniqueKey)].GetStringValue(), + Name: record.Fields[string(bundle.RelationKeyName)].GetStringValue(), + Icon: record.Fields[string(bundle.RelationKeyIconEmoji)].GetStringValue(), + RecommendedLayout: model.ObjectTypeLayout_name[int32(record.Fields[string(bundle.RelationKeyRecommendedLayout)].GetNumberValue())], }) } return objectTypes, total, hasMore, nil @@ -327,7 +327,7 @@ func (s *ObjectService) ListTemplates(ctx context.Context, spaceId string, typeI Value: pbtypes.String("ot-template"), }, }, - Keys: []string{"id"}, + Keys: []string{string(bundle.RelationKeyId)}, }) if templateTypeIdResp.Error.Code != pb.RpcObjectSearchResponseError_NULL { @@ -339,7 +339,7 @@ func (s *ObjectService) ListTemplates(ctx context.Context, spaceId string, typeI } // Then, search all objects of the template type and filter by the target object type - templateTypeId := templateTypeIdResp.Records[0].Fields["id"].GetStringValue() + templateTypeId := templateTypeIdResp.Records[0].Fields[string(bundle.RelationKeyId)].GetStringValue() templateObjectsResp := s.mw.ObjectSearch(ctx, &pb.RpcObjectSearchRequest{ SpaceId: spaceId, Filters: []*model.BlockContentDataviewFilter{ @@ -349,7 +349,7 @@ func (s *ObjectService) ListTemplates(ctx context.Context, spaceId string, typeI Value: pbtypes.String(templateTypeId), }, }, - Keys: []string{"id", "targetObjectType", "name", "iconEmoji"}, + Keys: []string{string(bundle.RelationKeyId), string(bundle.RelationKeyTargetObjectType), string(bundle.RelationKeyName), string(bundle.RelationKeyIconEmoji)}, }) if templateObjectsResp.Error.Code != pb.RpcObjectSearchResponseError_NULL { @@ -362,8 +362,8 @@ func (s *ObjectService) ListTemplates(ctx context.Context, spaceId string, typeI templateIds := make([]string, 0) for _, record := range templateObjectsResp.Records { - if record.Fields["targetObjectType"].GetStringValue() == typeId { - templateIds = append(templateIds, record.Fields["id"].GetStringValue()) + if record.Fields[string(bundle.RelationKeyTargetObjectType)].GetStringValue() == typeId { + templateIds = append(templateIds, record.Fields[string(bundle.RelationKeyId)].GetStringValue()) } } @@ -385,8 +385,8 @@ func (s *ObjectService) ListTemplates(ctx context.Context, spaceId string, typeI templates = append(templates, ObjectTemplate{ Type: "object_template", Id: templateId, - Name: templateResp.ObjectView.Details[0].Details.Fields["name"].GetStringValue(), - Icon: templateResp.ObjectView.Details[0].Details.Fields["iconEmoji"].GetStringValue(), + Name: templateResp.ObjectView.Details[0].Details.Fields[string(bundle.RelationKeyName)].GetStringValue(), + Icon: templateResp.ObjectView.Details[0].Details.Fields[string(bundle.RelationKeyIconEmoji)].GetStringValue(), }) } @@ -399,13 +399,13 @@ func (s *ObjectService) GetDetails(resp *pb.RpcObjectShowResponse) []Detail { { Id: "lastModifiedDate", Details: map[string]interface{}{ - "lastModifiedDate": PosixToISO8601(resp.ObjectView.Details[0].Details.Fields["lastModifiedDate"].GetNumberValue()), + "lastModifiedDate": PosixToISO8601(resp.ObjectView.Details[0].Details.Fields[string(bundle.RelationKeyLastModifiedDate)].GetNumberValue()), }, }, { Id: "createdDate", Details: map[string]interface{}{ - "createdDate": PosixToISO8601(resp.ObjectView.Details[0].Details.Fields["createdDate"].GetNumberValue()), + "createdDate": PosixToISO8601(resp.ObjectView.Details[0].Details.Fields[string(bundle.RelationKeyCreatedDate)].GetNumberValue()), }, }, { @@ -432,8 +432,8 @@ func (s *ObjectService) getTags(resp *pb.RpcObjectShowResponse) []Tag { if detail.Id == id { tags = append(tags, Tag{ Id: id, - Name: detail.Details.Fields["name"].GetStringValue(), - Color: detail.Details.Fields["relationOptionColor"].GetStringValue(), + Name: detail.Details.Fields[string(bundle.RelationKeyName)].GetStringValue(), + Color: detail.Details.Fields[string(bundle.RelationKeyRelationOptionColor)].GetStringValue(), }) break } diff --git a/core/api/services/search/service.go b/core/api/services/search/service.go index 20386b8f6..73af6aecd 100644 --- a/core/api/services/search/service.go +++ b/core/api/services/search/service.go @@ -63,7 +63,7 @@ func (s *SearchService) Search(ctx context.Context, searchQuery string, objectTy IncludeTime: true, EmptyPlacement: model.BlockContentDataviewSort_NotSpecified, }}, - Keys: []string{"id", "name"}, + Keys: []string{string(bundle.RelationKeyId), string(bundle.RelationKeyName)}, Limit: int32(limit), // nolint: gosec }) @@ -76,7 +76,7 @@ func (s *SearchService) Search(ctx context.Context, searchQuery string, objectTy } for _, record := range objResp.Records { - object, err := s.objectService.GetObject(ctx, space.Id, record.Fields["id"].GetStringValue()) + object, err := s.objectService.GetObject(ctx, space.Id, record.Fields[string(bundle.RelationKeyId)].GetStringValue()) if err != nil { return nil, 0, false, err } @@ -95,7 +95,6 @@ func (s *SearchService) Search(ctx context.Context, searchQuery string, objectTy return dateStrI > dateStrJ }) - // TODO: solve global pagination vs per space pagination total = len(results) paginatedResults, hasMore := pagination.Paginate(results, offset, limit) return paginatedResults, total, hasMore, nil diff --git a/core/api/services/space/service.go b/core/api/services/space/service.go index 4b84baa5b..c46798285 100644 --- a/core/api/services/space/service.go +++ b/core/api/services/space/service.go @@ -69,13 +69,13 @@ func (s *SpaceService) ListSpaces(ctx context.Context, offset int, limit int) (s }, Sorts: []*model.BlockContentDataviewSort{ { - RelationKey: "spaceOrder", + RelationKey: string(bundle.RelationKeySpaceOrder), Type: model.BlockContentDataviewSort_Asc, NoCollate: true, EmptyPlacement: model.BlockContentDataviewSort_End, }, }, - Keys: []string{"targetSpaceId", "name", "iconEmoji", "iconImage"}, + Keys: []string{string(bundle.RelationKeyTargetSpaceId), string(bundle.RelationKeyName), string(bundle.RelationKeyIconEmoji), string(bundle.RelationKeyIconImage)}, }) if resp.Error.Code != pb.RpcObjectSearchResponseError_NULL { @@ -91,14 +91,14 @@ func (s *SpaceService) ListSpaces(ctx context.Context, offset int, limit int) (s spaces = make([]Space, 0, len(paginatedRecords)) for _, record := range paginatedRecords { - workspace, err := s.getWorkspaceInfo(record.Fields["targetSpaceId"].GetStringValue()) + workspace, err := s.getWorkspaceInfo(record.Fields[string(bundle.RelationKeyTargetSpaceId)].GetStringValue()) if err != nil { return nil, 0, false, err } // TODO: name and icon are only returned here; fix that - workspace.Name = record.Fields["name"].GetStringValue() - workspace.Icon = util.GetIconFromEmojiOrImage(s.AccountInfo, record.Fields["iconEmoji"].GetStringValue(), record.Fields["iconImage"].GetStringValue()) + workspace.Name = record.Fields[string(bundle.RelationKeyName)].GetStringValue() + workspace.Icon = util.GetIconFromEmojiOrImage(s.AccountInfo, record.Fields[string(bundle.RelationKeyIconEmoji)].GetStringValue(), record.Fields[string(bundle.RelationKeyIconImage)].GetStringValue()) spaces = append(spaces, workspace) } @@ -117,9 +117,9 @@ func (s *SpaceService) CreateSpace(ctx context.Context, name string) (Space, err resp := s.mw.WorkspaceCreate(ctx, &pb.RpcWorkspaceCreateRequest{ Details: &types.Struct{ Fields: map[string]*types.Value{ - "iconOption": pbtypes.Float64(float64(iconOption.Int64())), - "name": pbtypes.String(name), - "spaceDashboardId": pbtypes.String("lastOpened"), + string(bundle.RelationKeyIconOption): pbtypes.Float64(float64(iconOption.Int64())), + string(bundle.RelationKeyName): pbtypes.String(name), + string(bundle.RelationKeySpaceDashboardId): pbtypes.String("lastOpened"), }, }, UseCase: pb.RpcObjectImportUseCaseRequest_GET_STARTED, @@ -151,11 +151,11 @@ func (s *SpaceService) ListMembers(ctx context.Context, spaceId string, offset i }, Sorts: []*model.BlockContentDataviewSort{ { - RelationKey: "name", + RelationKey: string(bundle.RelationKeyName), Type: model.BlockContentDataviewSort_Asc, }, }, - Keys: []string{"id", "name", "iconEmoji", "iconImage", "identity", "globalName", "participantPermissions"}, + Keys: []string{string(bundle.RelationKeyId), string(bundle.RelationKeyName), string(bundle.RelationKeyIconEmoji), string(bundle.RelationKeyIconImage), string(bundle.RelationKeyIdentity), string(bundle.RelationKeyGlobalName), string(bundle.RelationKeyParticipantPermissions)}, }) if resp.Error.Code != pb.RpcObjectSearchResponseError_NULL { @@ -171,16 +171,16 @@ func (s *SpaceService) ListMembers(ctx context.Context, spaceId string, offset i members = make([]Member, 0, len(paginatedMembers)) for _, record := range paginatedMembers { - icon := util.GetIconFromEmojiOrImage(s.AccountInfo, record.Fields["iconEmoji"].GetStringValue(), record.Fields["iconImage"].GetStringValue()) + icon := util.GetIconFromEmojiOrImage(s.AccountInfo, record.Fields[string(bundle.RelationKeyIconEmoji)].GetStringValue(), record.Fields[string(bundle.RelationKeyIconImage)].GetStringValue()) member := Member{ Type: "space_member", - Id: record.Fields["id"].GetStringValue(), - Name: record.Fields["name"].GetStringValue(), + Id: record.Fields[string(bundle.RelationKeyId)].GetStringValue(), + Name: record.Fields[string(bundle.RelationKeyName)].GetStringValue(), Icon: icon, - Identity: record.Fields["identity"].GetStringValue(), - GlobalName: record.Fields["globalName"].GetStringValue(), - Role: model.ParticipantPermissions_name[int32(record.Fields["participantPermissions"].GetNumberValue())], + Identity: record.Fields[string(bundle.RelationKeyIdentity)].GetStringValue(), + GlobalName: record.Fields[string(bundle.RelationKeyGlobalName)].GetStringValue(), + Role: model.ParticipantPermissions_name[int32(record.Fields[string(bundle.RelationKeyParticipantPermissions)].GetNumberValue())], } members = append(members, member) diff --git a/core/api/util/util.go b/core/api/util/util.go index 1612897c2..08802d925 100644 --- a/core/api/util/util.go +++ b/core/api/util/util.go @@ -49,7 +49,7 @@ func ResolveTypeToName(mw service.ClientCommandsServer, spaceId string, typeId s Value: pbtypes.String(typeId), }, }, - Keys: []string{"name"}, + Keys: []string{string(bundle.RelationKeyName)}, }) if resp.Error.Code != pb.RpcObjectSearchResponseError_NULL { @@ -60,7 +60,7 @@ func ResolveTypeToName(mw service.ClientCommandsServer, spaceId string, typeId s return "", ErrorTypeNotFound } - return resp.Records[0].Fields["name"].GetStringValue(), nil + return resp.Records[0].Fields[string(bundle.RelationKeyName)].GetStringValue(), nil } func ResolveUniqueKeyToTypeId(mw service.ClientCommandsServer, spaceId string, uniqueKey string) (typeId string, err error) { @@ -74,7 +74,7 @@ func ResolveUniqueKeyToTypeId(mw service.ClientCommandsServer, spaceId string, u Value: pbtypes.String(uniqueKey), }, }, - Keys: []string{"id"}, + Keys: []string{string(bundle.RelationKeyId)}, }) if resp.Error.Code != pb.RpcObjectSearchResponseError_NULL { @@ -85,5 +85,5 @@ func ResolveUniqueKeyToTypeId(mw service.ClientCommandsServer, spaceId string, u return "", ErrorTypeNotFound } - return resp.Records[0].Fields["id"].GetStringValue(), nil + return resp.Records[0].Fields[string(bundle.RelationKeyId)].GetStringValue(), nil } From 1c2e46c7bc846f4d36d62ea4c6a15bd37f3833eb Mon Sep 17 00:00:00 2001 From: Jannis Metrikat <120120832+jmetrikat@users.noreply.github.com> Date: Wed, 15 Jan 2025 19:41:26 +0100 Subject: [PATCH 108/195] GO-4848: Return participants in details --- core/api/server/server.go | 2 +- core/api/services/object/service.go | 39 +++++++++++++++++++++++++---- core/api/services/space/service.go | 39 ++++++++++++++++++++++++++++- 3 files changed, 73 insertions(+), 7 deletions(-) diff --git a/core/api/server/server.go b/core/api/server/server.go index 578162f99..c6846a45c 100644 --- a/core/api/server/server.go +++ b/core/api/server/server.go @@ -28,10 +28,10 @@ func NewServer(a *app.App, mw service.ClientCommandsServer) *Server { s := &Server{ authService: auth.NewService(mw), exportService: export.NewService(mw), - objectService: object.NewService(mw), spaceService: space.NewService(mw), } + s.objectService = object.NewService(mw, s.spaceService) s.searchService = search.NewService(mw, s.spaceService, s.objectService) s.engine = s.NewRouter(a) diff --git a/core/api/services/object/service.go b/core/api/services/object/service.go index fa6d4ed1a..787a94f15 100644 --- a/core/api/services/object/service.go +++ b/core/api/services/object/service.go @@ -8,6 +8,7 @@ import ( "github.com/gogo/protobuf/types" "github.com/anyproto/anytype-heart/core/api/pagination" + "github.com/anyproto/anytype-heart/core/api/services/space" "github.com/anyproto/anytype-heart/core/api/util" "github.com/anyproto/anytype-heart/pb" "github.com/anyproto/anytype-heart/pb/service" @@ -46,12 +47,13 @@ type Service interface { } type ObjectService struct { - mw service.ClientCommandsServer - AccountInfo *model.AccountInfo + mw service.ClientCommandsServer + spaceService *space.SpaceService + AccountInfo *model.AccountInfo } -func NewService(mw service.ClientCommandsServer) *ObjectService { - return &ObjectService{mw: mw} +func NewService(mw service.ClientCommandsServer, spaceService *space.SpaceService) *ObjectService { + return &ObjectService{mw: mw, spaceService: spaceService} } // ListObjects retrieves a paginated list of objects in a specific space. @@ -127,7 +129,7 @@ func (s *ObjectService) GetObject(ctx context.Context, spaceId string, objectId } icon := util.GetIconFromEmojiOrImage(s.AccountInfo, resp.ObjectView.Details[0].Details.Fields[string(bundle.RelationKeyIconEmoji)].GetStringValue(), resp.ObjectView.Details[0].Details.Fields[string(bundle.RelationKeyIconImage)].GetStringValue()) - objectTypeName, err := util.ResolveTypeToName(s.mw, spaceId, resp.ObjectView.Details[0].Details.Fields["type"].GetStringValue()) + objectTypeName, err := util.ResolveTypeToName(s.mw, spaceId, resp.ObjectView.Details[0].Details.Fields[string(bundle.RelationKeyType)].GetStringValue()) if err != nil { return Object{}, err } @@ -395,6 +397,19 @@ func (s *ObjectService) ListTemplates(ctx context.Context, spaceId string, typeI // GetDetails returns the list of details from the ObjectShowResponse. func (s *ObjectService) GetDetails(resp *pb.RpcObjectShowResponse) []Detail { + creator := resp.ObjectView.Details[0].Details.Fields[bundle.RelationKeyCreator.String()].GetStringValue() + lastModifiedBy := resp.ObjectView.Details[0].Details.Fields[bundle.RelationKeyLastModifiedBy.String()].GetStringValue() + + var creatorId, lastModifiedById string + for _, detail := range resp.ObjectView.Details { + if detail.Id == creator { + creatorId = detail.Id + } + if detail.Id == lastModifiedBy { + lastModifiedById = detail.Id + } + } + return []Detail{ { Id: "lastModifiedDate", @@ -408,6 +423,20 @@ func (s *ObjectService) GetDetails(resp *pb.RpcObjectShowResponse) []Detail { "createdDate": PosixToISO8601(resp.ObjectView.Details[0].Details.Fields[string(bundle.RelationKeyCreatedDate)].GetNumberValue()), }, }, + { + Id: "createdBy", + Details: map[string]interface{}{ + "id": creatorId, + "details": s.spaceService.GetParticipantDetails(s.mw, s.AccountInfo, resp.ObjectView.Details[0].Details.Fields[bundle.RelationKeySpaceId.String()].GetStringValue(), creatorId), + }, + }, + { + Id: "lastModifiedBy", + Details: map[string]interface{}{ + "id": lastModifiedById, + "details": s.spaceService.GetParticipantDetails(s.mw, s.AccountInfo, resp.ObjectView.Details[0].Details.Fields[bundle.RelationKeySpaceId.String()].GetStringValue(), lastModifiedById), + }, + }, { Id: "tags", Details: map[string]interface{}{ diff --git a/core/api/services/space/service.go b/core/api/services/space/service.go index c46798285..a5996623a 100644 --- a/core/api/services/space/service.go +++ b/core/api/services/space/service.go @@ -139,11 +139,13 @@ func (s *SpaceService) ListMembers(ctx context.Context, spaceId string, offset i SpaceId: spaceId, Filters: []*model.BlockContentDataviewFilter{ { + Operator: model.BlockContentDataviewFilter_No, RelationKey: bundle.RelationKeyLayout.String(), Condition: model.BlockContentDataviewFilter_Equal, Value: pbtypes.Int64(int64(model.ObjectType_participant)), }, { + Operator: model.BlockContentDataviewFilter_No, RelationKey: bundle.RelationKeyParticipantStatus.String(), Condition: model.BlockContentDataviewFilter_Equal, Value: pbtypes.Int64(int64(model.ParticipantStatus_Active)), @@ -174,7 +176,7 @@ func (s *SpaceService) ListMembers(ctx context.Context, spaceId string, offset i icon := util.GetIconFromEmojiOrImage(s.AccountInfo, record.Fields[string(bundle.RelationKeyIconEmoji)].GetStringValue(), record.Fields[string(bundle.RelationKeyIconImage)].GetStringValue()) member := Member{ - Type: "space_member", + Type: "member", Id: record.Fields[string(bundle.RelationKeyId)].GetStringValue(), Name: record.Fields[string(bundle.RelationKeyName)].GetStringValue(), Icon: icon, @@ -189,6 +191,41 @@ func (s *SpaceService) ListMembers(ctx context.Context, spaceId string, offset i return members, total, hasMore, nil } +func (s *SpaceService) GetParticipantDetails(mw service.ClientCommandsServer, accountInfo *model.AccountInfo, spaceId string, participantId string) Member { + resp := mw.ObjectSearch(context.Background(), &pb.RpcObjectSearchRequest{ + SpaceId: spaceId, + Filters: []*model.BlockContentDataviewFilter{ + { + Operator: model.BlockContentDataviewFilter_No, + RelationKey: bundle.RelationKeyId.String(), + Condition: model.BlockContentDataviewFilter_Equal, + Value: pbtypes.String(participantId), + }, + }, + Keys: []string{string(bundle.RelationKeyId), string(bundle.RelationKeyName), string(bundle.RelationKeyIconEmoji), string(bundle.RelationKeyIconImage), string(bundle.RelationKeyIdentity), string(bundle.RelationKeyGlobalName), string(bundle.RelationKeyParticipantPermissions)}, + }) + + if resp.Error.Code != pb.RpcObjectSearchResponseError_NULL { + return Member{} + } + + if len(resp.Records) == 0 { + return Member{} + } + + icon := util.GetIconFromEmojiOrImage(accountInfo, "", resp.Records[0].Fields[string(bundle.RelationKeyIconImage)].GetStringValue()) + + return Member{ + Type: "member", + Id: resp.Records[0].Fields[string(bundle.RelationKeyId)].GetStringValue(), + Name: resp.Records[0].Fields[string(bundle.RelationKeyName)].GetStringValue(), + Icon: icon, + Identity: resp.Records[0].Fields[string(bundle.RelationKeyIdentity)].GetStringValue(), + GlobalName: resp.Records[0].Fields[string(bundle.RelationKeyGlobalName)].GetStringValue(), + Role: model.ParticipantPermissions_name[int32(resp.Records[0].Fields[string(bundle.RelationKeyParticipantPermissions)].GetNumberValue())], + } +} + // getWorkspaceInfo returns the workspace info for the space with the given ID. func (s *SpaceService) getWorkspaceInfo(spaceId string) (space Space, err error) { workspaceResponse := s.mw.WorkspaceOpen(context.Background(), &pb.RpcWorkspaceOpenRequest{ From 50f6b2819e2d0e095ff87b5f8012a045cd0abddb Mon Sep 17 00:00:00 2001 From: Jannis Metrikat <120120832+jmetrikat@users.noreply.github.com> Date: Wed, 15 Jan 2025 19:58:57 +0100 Subject: [PATCH 109/195] GO-4848: Replace string(RelationKey) with .String() --- core/api/services/object/service.go | 64 ++++++++++++++--------------- core/api/services/search/service.go | 4 +- core/api/services/space/service.go | 46 ++++++++++----------- core/api/util/util.go | 8 ++-- 4 files changed, 61 insertions(+), 61 deletions(-) diff --git a/core/api/services/object/service.go b/core/api/services/object/service.go index 787a94f15..a0214f834 100644 --- a/core/api/services/object/service.go +++ b/core/api/services/object/service.go @@ -87,7 +87,7 @@ func (s *ObjectService) ListObjects(ctx context.Context, spaceId string, offset Offset: 0, Limit: 0, ObjectTypeFilter: []string{}, - Keys: []string{string(bundle.RelationKeyId), string(bundle.RelationKeyName)}, + Keys: []string{bundle.RelationKeyId.String(), bundle.RelationKeyName.String()}, }) if resp.Error.Code != pb.RpcObjectSearchResponseError_NULL { @@ -103,7 +103,7 @@ func (s *ObjectService) ListObjects(ctx context.Context, spaceId string, offset objects = make([]Object, 0, len(paginatedObjects)) for _, record := range paginatedObjects { - object, err := s.GetObject(ctx, spaceId, record.Fields[string(bundle.RelationKeyId)].GetStringValue()) + object, err := s.GetObject(ctx, spaceId, record.Fields[bundle.RelationKeyId.String()].GetStringValue()) if err != nil { return nil, 0, false, err } @@ -128,20 +128,20 @@ func (s *ObjectService) GetObject(ctx context.Context, spaceId string, objectId return Object{}, ErrFailedRetrieveObject } - icon := util.GetIconFromEmojiOrImage(s.AccountInfo, resp.ObjectView.Details[0].Details.Fields[string(bundle.RelationKeyIconEmoji)].GetStringValue(), resp.ObjectView.Details[0].Details.Fields[string(bundle.RelationKeyIconImage)].GetStringValue()) - objectTypeName, err := util.ResolveTypeToName(s.mw, spaceId, resp.ObjectView.Details[0].Details.Fields[string(bundle.RelationKeyType)].GetStringValue()) + icon := util.GetIconFromEmojiOrImage(s.AccountInfo, resp.ObjectView.Details[0].Details.Fields[bundle.RelationKeyIconEmoji.String()].GetStringValue(), resp.ObjectView.Details[0].Details.Fields[bundle.RelationKeyIconImage.String()].GetStringValue()) + objectTypeName, err := util.ResolveTypeToName(s.mw, spaceId, resp.ObjectView.Details[0].Details.Fields[bundle.RelationKeyType.String()].GetStringValue()) if err != nil { return Object{}, err } object := Object{ Type: "object", - Id: resp.ObjectView.Details[0].Details.Fields[string(bundle.RelationKeyId)].GetStringValue(), - Name: resp.ObjectView.Details[0].Details.Fields[string(bundle.RelationKeyName)].GetStringValue(), + Id: resp.ObjectView.Details[0].Details.Fields[bundle.RelationKeyId.String()].GetStringValue(), + Name: resp.ObjectView.Details[0].Details.Fields[bundle.RelationKeyName.String()].GetStringValue(), Icon: icon, - Layout: model.ObjectTypeLayout_name[int32(resp.ObjectView.Details[0].Details.Fields[string(bundle.RelationKeyLayout)].GetNumberValue())], + Layout: model.ObjectTypeLayout_name[int32(resp.ObjectView.Details[0].Details.Fields[bundle.RelationKeyLayout.String()].GetNumberValue())], ObjectType: objectTypeName, - SpaceId: resp.ObjectView.Details[0].Details.Fields[string(bundle.RelationKeySpaceId)].GetStringValue(), + SpaceId: resp.ObjectView.Details[0].Details.Fields[bundle.RelationKeySpaceId.String()].GetStringValue(), RootId: resp.ObjectView.RootId, Blocks: s.GetBlocks(resp), Details: s.GetDetails(resp), @@ -177,11 +177,11 @@ func (s *ObjectService) CreateObject(ctx context.Context, spaceId string, reques details := &types.Struct{ Fields: map[string]*types.Value{ - string(bundle.RelationKeyName): pbtypes.String(request.Name), - string(bundle.RelationKeyIconEmoji): pbtypes.String(request.Icon), - string(bundle.RelationKeyDescription): pbtypes.String(request.Description), - string(bundle.RelationKeySource): pbtypes.String(request.Source), - string(bundle.RelationKeyOrigin): pbtypes.Int64(int64(model.ObjectOrigin_api)), + bundle.RelationKeyName.String(): pbtypes.String(request.Name), + bundle.RelationKeyIconEmoji.String(): pbtypes.String(request.Icon), + bundle.RelationKeyDescription.String(): pbtypes.String(request.Description), + bundle.RelationKeySource.String(): pbtypes.String(request.Source), + bundle.RelationKeyOrigin.String(): pbtypes.Int64(int64(model.ObjectOrigin_api)), }, } @@ -201,7 +201,7 @@ func (s *ObjectService) CreateObject(ctx context.Context, spaceId string, reques if request.Description != "" { relAddFeatResp := s.mw.ObjectRelationAddFeatured(ctx, &pb.RpcObjectRelationAddFeaturedRequest{ ContextId: resp.ObjectId, - Relations: []string{string(bundle.RelationKeyDescription)}, + Relations: []string{bundle.RelationKeyDescription.String()}, }) if relAddFeatResp.Error.Code != pb.RpcObjectRelationAddFeaturedResponseError_NULL { @@ -285,11 +285,11 @@ func (s *ObjectService) ListTypes(ctx context.Context, spaceId string, offset in }, Sorts: []*model.BlockContentDataviewSort{ { - RelationKey: string(bundle.RelationKeyName), + RelationKey: bundle.RelationKeyName.String(), Type: model.BlockContentDataviewSort_Asc, }, }, - Keys: []string{string(bundle.RelationKeyId), string(bundle.RelationKeyUniqueKey), string(bundle.RelationKeyName), string(bundle.RelationKeyIconEmoji), string(bundle.RelationKeyRecommendedLayout)}, + Keys: []string{bundle.RelationKeyId.String(), bundle.RelationKeyUniqueKey.String(), bundle.RelationKeyName.String(), bundle.RelationKeyIconEmoji.String(), bundle.RelationKeyRecommendedLayout.String()}, }) if resp.Error.Code != pb.RpcObjectSearchResponseError_NULL { @@ -307,11 +307,11 @@ func (s *ObjectService) ListTypes(ctx context.Context, spaceId string, offset in for _, record := range paginatedTypes { objectTypes = append(objectTypes, ObjectType{ Type: "object_type", - Id: record.Fields[string(bundle.RelationKeyId)].GetStringValue(), - UniqueKey: record.Fields[string(bundle.RelationKeyUniqueKey)].GetStringValue(), - Name: record.Fields[string(bundle.RelationKeyName)].GetStringValue(), - Icon: record.Fields[string(bundle.RelationKeyIconEmoji)].GetStringValue(), - RecommendedLayout: model.ObjectTypeLayout_name[int32(record.Fields[string(bundle.RelationKeyRecommendedLayout)].GetNumberValue())], + Id: record.Fields[bundle.RelationKeyId.String()].GetStringValue(), + UniqueKey: record.Fields[bundle.RelationKeyUniqueKey.String()].GetStringValue(), + Name: record.Fields[bundle.RelationKeyName.String()].GetStringValue(), + Icon: record.Fields[bundle.RelationKeyIconEmoji.String()].GetStringValue(), + RecommendedLayout: model.ObjectTypeLayout_name[int32(record.Fields[bundle.RelationKeyRecommendedLayout.String()].GetNumberValue())], }) } return objectTypes, total, hasMore, nil @@ -329,7 +329,7 @@ func (s *ObjectService) ListTemplates(ctx context.Context, spaceId string, typeI Value: pbtypes.String("ot-template"), }, }, - Keys: []string{string(bundle.RelationKeyId)}, + Keys: []string{bundle.RelationKeyId.String()}, }) if templateTypeIdResp.Error.Code != pb.RpcObjectSearchResponseError_NULL { @@ -341,7 +341,7 @@ func (s *ObjectService) ListTemplates(ctx context.Context, spaceId string, typeI } // Then, search all objects of the template type and filter by the target object type - templateTypeId := templateTypeIdResp.Records[0].Fields[string(bundle.RelationKeyId)].GetStringValue() + templateTypeId := templateTypeIdResp.Records[0].Fields[bundle.RelationKeyId.String()].GetStringValue() templateObjectsResp := s.mw.ObjectSearch(ctx, &pb.RpcObjectSearchRequest{ SpaceId: spaceId, Filters: []*model.BlockContentDataviewFilter{ @@ -351,7 +351,7 @@ func (s *ObjectService) ListTemplates(ctx context.Context, spaceId string, typeI Value: pbtypes.String(templateTypeId), }, }, - Keys: []string{string(bundle.RelationKeyId), string(bundle.RelationKeyTargetObjectType), string(bundle.RelationKeyName), string(bundle.RelationKeyIconEmoji)}, + Keys: []string{bundle.RelationKeyId.String(), bundle.RelationKeyTargetObjectType.String(), bundle.RelationKeyName.String(), bundle.RelationKeyIconEmoji.String()}, }) if templateObjectsResp.Error.Code != pb.RpcObjectSearchResponseError_NULL { @@ -364,8 +364,8 @@ func (s *ObjectService) ListTemplates(ctx context.Context, spaceId string, typeI templateIds := make([]string, 0) for _, record := range templateObjectsResp.Records { - if record.Fields[string(bundle.RelationKeyTargetObjectType)].GetStringValue() == typeId { - templateIds = append(templateIds, record.Fields[string(bundle.RelationKeyId)].GetStringValue()) + if record.Fields[bundle.RelationKeyTargetObjectType.String()].GetStringValue() == typeId { + templateIds = append(templateIds, record.Fields[bundle.RelationKeyId.String()].GetStringValue()) } } @@ -387,8 +387,8 @@ func (s *ObjectService) ListTemplates(ctx context.Context, spaceId string, typeI templates = append(templates, ObjectTemplate{ Type: "object_template", Id: templateId, - Name: templateResp.ObjectView.Details[0].Details.Fields[string(bundle.RelationKeyName)].GetStringValue(), - Icon: templateResp.ObjectView.Details[0].Details.Fields[string(bundle.RelationKeyIconEmoji)].GetStringValue(), + Name: templateResp.ObjectView.Details[0].Details.Fields[bundle.RelationKeyName.String()].GetStringValue(), + Icon: templateResp.ObjectView.Details[0].Details.Fields[bundle.RelationKeyIconEmoji.String()].GetStringValue(), }) } @@ -414,13 +414,13 @@ func (s *ObjectService) GetDetails(resp *pb.RpcObjectShowResponse) []Detail { { Id: "lastModifiedDate", Details: map[string]interface{}{ - "lastModifiedDate": PosixToISO8601(resp.ObjectView.Details[0].Details.Fields[string(bundle.RelationKeyLastModifiedDate)].GetNumberValue()), + "lastModifiedDate": PosixToISO8601(resp.ObjectView.Details[0].Details.Fields[bundle.RelationKeyLastModifiedDate.String()].GetNumberValue()), }, }, { Id: "createdDate", Details: map[string]interface{}{ - "createdDate": PosixToISO8601(resp.ObjectView.Details[0].Details.Fields[string(bundle.RelationKeyCreatedDate)].GetNumberValue()), + "createdDate": PosixToISO8601(resp.ObjectView.Details[0].Details.Fields[bundle.RelationKeyCreatedDate.String()].GetNumberValue()), }, }, { @@ -461,8 +461,8 @@ func (s *ObjectService) getTags(resp *pb.RpcObjectShowResponse) []Tag { if detail.Id == id { tags = append(tags, Tag{ Id: id, - Name: detail.Details.Fields[string(bundle.RelationKeyName)].GetStringValue(), - Color: detail.Details.Fields[string(bundle.RelationKeyRelationOptionColor)].GetStringValue(), + Name: detail.Details.Fields[bundle.RelationKeyName.String()].GetStringValue(), + Color: detail.Details.Fields[bundle.RelationKeyRelationOptionColor.String()].GetStringValue(), }) break } diff --git a/core/api/services/search/service.go b/core/api/services/search/service.go index 73af6aecd..41db34632 100644 --- a/core/api/services/search/service.go +++ b/core/api/services/search/service.go @@ -63,7 +63,7 @@ func (s *SearchService) Search(ctx context.Context, searchQuery string, objectTy IncludeTime: true, EmptyPlacement: model.BlockContentDataviewSort_NotSpecified, }}, - Keys: []string{string(bundle.RelationKeyId), string(bundle.RelationKeyName)}, + Keys: []string{bundle.RelationKeyId.String(), bundle.RelationKeyName.String()}, Limit: int32(limit), // nolint: gosec }) @@ -76,7 +76,7 @@ func (s *SearchService) Search(ctx context.Context, searchQuery string, objectTy } for _, record := range objResp.Records { - object, err := s.objectService.GetObject(ctx, space.Id, record.Fields[string(bundle.RelationKeyId)].GetStringValue()) + object, err := s.objectService.GetObject(ctx, space.Id, record.Fields[bundle.RelationKeyId.String()].GetStringValue()) if err != nil { return nil, 0, false, err } diff --git a/core/api/services/space/service.go b/core/api/services/space/service.go index a5996623a..fef990bdd 100644 --- a/core/api/services/space/service.go +++ b/core/api/services/space/service.go @@ -69,13 +69,13 @@ func (s *SpaceService) ListSpaces(ctx context.Context, offset int, limit int) (s }, Sorts: []*model.BlockContentDataviewSort{ { - RelationKey: string(bundle.RelationKeySpaceOrder), + RelationKey: bundle.RelationKeySpaceOrder.String(), Type: model.BlockContentDataviewSort_Asc, NoCollate: true, EmptyPlacement: model.BlockContentDataviewSort_End, }, }, - Keys: []string{string(bundle.RelationKeyTargetSpaceId), string(bundle.RelationKeyName), string(bundle.RelationKeyIconEmoji), string(bundle.RelationKeyIconImage)}, + Keys: []string{bundle.RelationKeyTargetSpaceId.String(), bundle.RelationKeyName.String(), bundle.RelationKeyIconEmoji.String(), bundle.RelationKeyIconImage.String()}, }) if resp.Error.Code != pb.RpcObjectSearchResponseError_NULL { @@ -91,14 +91,14 @@ func (s *SpaceService) ListSpaces(ctx context.Context, offset int, limit int) (s spaces = make([]Space, 0, len(paginatedRecords)) for _, record := range paginatedRecords { - workspace, err := s.getWorkspaceInfo(record.Fields[string(bundle.RelationKeyTargetSpaceId)].GetStringValue()) + workspace, err := s.getWorkspaceInfo(record.Fields[bundle.RelationKeyTargetSpaceId.String()].GetStringValue()) if err != nil { return nil, 0, false, err } // TODO: name and icon are only returned here; fix that - workspace.Name = record.Fields[string(bundle.RelationKeyName)].GetStringValue() - workspace.Icon = util.GetIconFromEmojiOrImage(s.AccountInfo, record.Fields[string(bundle.RelationKeyIconEmoji)].GetStringValue(), record.Fields[string(bundle.RelationKeyIconImage)].GetStringValue()) + workspace.Name = record.Fields[bundle.RelationKeyName.String()].GetStringValue() + workspace.Icon = util.GetIconFromEmojiOrImage(s.AccountInfo, record.Fields[bundle.RelationKeyIconEmoji.String()].GetStringValue(), record.Fields[bundle.RelationKeyIconImage.String()].GetStringValue()) spaces = append(spaces, workspace) } @@ -117,9 +117,9 @@ func (s *SpaceService) CreateSpace(ctx context.Context, name string) (Space, err resp := s.mw.WorkspaceCreate(ctx, &pb.RpcWorkspaceCreateRequest{ Details: &types.Struct{ Fields: map[string]*types.Value{ - string(bundle.RelationKeyIconOption): pbtypes.Float64(float64(iconOption.Int64())), - string(bundle.RelationKeyName): pbtypes.String(name), - string(bundle.RelationKeySpaceDashboardId): pbtypes.String("lastOpened"), + bundle.RelationKeyIconOption.String(): pbtypes.Float64(float64(iconOption.Int64())), + bundle.RelationKeyName.String(): pbtypes.String(name), + bundle.RelationKeySpaceDashboardId.String(): pbtypes.String("lastOpened"), }, }, UseCase: pb.RpcObjectImportUseCaseRequest_GET_STARTED, @@ -153,11 +153,11 @@ func (s *SpaceService) ListMembers(ctx context.Context, spaceId string, offset i }, Sorts: []*model.BlockContentDataviewSort{ { - RelationKey: string(bundle.RelationKeyName), + RelationKey: bundle.RelationKeyName.String(), Type: model.BlockContentDataviewSort_Asc, }, }, - Keys: []string{string(bundle.RelationKeyId), string(bundle.RelationKeyName), string(bundle.RelationKeyIconEmoji), string(bundle.RelationKeyIconImage), string(bundle.RelationKeyIdentity), string(bundle.RelationKeyGlobalName), string(bundle.RelationKeyParticipantPermissions)}, + Keys: []string{bundle.RelationKeyId.String(), bundle.RelationKeyName.String(), bundle.RelationKeyIconEmoji.String(), bundle.RelationKeyIconImage.String(), bundle.RelationKeyIdentity.String(), bundle.RelationKeyGlobalName.String(), bundle.RelationKeyParticipantPermissions.String()}, }) if resp.Error.Code != pb.RpcObjectSearchResponseError_NULL { @@ -173,16 +173,16 @@ func (s *SpaceService) ListMembers(ctx context.Context, spaceId string, offset i members = make([]Member, 0, len(paginatedMembers)) for _, record := range paginatedMembers { - icon := util.GetIconFromEmojiOrImage(s.AccountInfo, record.Fields[string(bundle.RelationKeyIconEmoji)].GetStringValue(), record.Fields[string(bundle.RelationKeyIconImage)].GetStringValue()) + icon := util.GetIconFromEmojiOrImage(s.AccountInfo, record.Fields[bundle.RelationKeyIconEmoji.String()].GetStringValue(), record.Fields[bundle.RelationKeyIconImage.String()].GetStringValue()) member := Member{ Type: "member", - Id: record.Fields[string(bundle.RelationKeyId)].GetStringValue(), - Name: record.Fields[string(bundle.RelationKeyName)].GetStringValue(), + Id: record.Fields[bundle.RelationKeyId.String()].GetStringValue(), + Name: record.Fields[bundle.RelationKeyName.String()].GetStringValue(), Icon: icon, - Identity: record.Fields[string(bundle.RelationKeyIdentity)].GetStringValue(), - GlobalName: record.Fields[string(bundle.RelationKeyGlobalName)].GetStringValue(), - Role: model.ParticipantPermissions_name[int32(record.Fields[string(bundle.RelationKeyParticipantPermissions)].GetNumberValue())], + Identity: record.Fields[bundle.RelationKeyIdentity.String()].GetStringValue(), + GlobalName: record.Fields[bundle.RelationKeyGlobalName.String()].GetStringValue(), + Role: model.ParticipantPermissions_name[int32(record.Fields[bundle.RelationKeyParticipantPermissions.String()].GetNumberValue())], } members = append(members, member) @@ -202,7 +202,7 @@ func (s *SpaceService) GetParticipantDetails(mw service.ClientCommandsServer, ac Value: pbtypes.String(participantId), }, }, - Keys: []string{string(bundle.RelationKeyId), string(bundle.RelationKeyName), string(bundle.RelationKeyIconEmoji), string(bundle.RelationKeyIconImage), string(bundle.RelationKeyIdentity), string(bundle.RelationKeyGlobalName), string(bundle.RelationKeyParticipantPermissions)}, + Keys: []string{bundle.RelationKeyId.String(), bundle.RelationKeyName.String(), bundle.RelationKeyIconEmoji.String(), bundle.RelationKeyIconImage.String(), bundle.RelationKeyIdentity.String(), bundle.RelationKeyGlobalName.String(), bundle.RelationKeyParticipantPermissions.String()}, }) if resp.Error.Code != pb.RpcObjectSearchResponseError_NULL { @@ -213,16 +213,16 @@ func (s *SpaceService) GetParticipantDetails(mw service.ClientCommandsServer, ac return Member{} } - icon := util.GetIconFromEmojiOrImage(accountInfo, "", resp.Records[0].Fields[string(bundle.RelationKeyIconImage)].GetStringValue()) + icon := util.GetIconFromEmojiOrImage(accountInfo, "", resp.Records[0].Fields[bundle.RelationKeyIconImage.String()].GetStringValue()) return Member{ Type: "member", - Id: resp.Records[0].Fields[string(bundle.RelationKeyId)].GetStringValue(), - Name: resp.Records[0].Fields[string(bundle.RelationKeyName)].GetStringValue(), + Id: resp.Records[0].Fields[bundle.RelationKeyId.String()].GetStringValue(), + Name: resp.Records[0].Fields[bundle.RelationKeyName.String()].GetStringValue(), Icon: icon, - Identity: resp.Records[0].Fields[string(bundle.RelationKeyIdentity)].GetStringValue(), - GlobalName: resp.Records[0].Fields[string(bundle.RelationKeyGlobalName)].GetStringValue(), - Role: model.ParticipantPermissions_name[int32(resp.Records[0].Fields[string(bundle.RelationKeyParticipantPermissions)].GetNumberValue())], + Identity: resp.Records[0].Fields[bundle.RelationKeyIdentity.String()].GetStringValue(), + GlobalName: resp.Records[0].Fields[bundle.RelationKeyGlobalName.String()].GetStringValue(), + Role: model.ParticipantPermissions_name[int32(resp.Records[0].Fields[bundle.RelationKeyParticipantPermissions.String()].GetNumberValue())], } } diff --git a/core/api/util/util.go b/core/api/util/util.go index 08802d925..5f0cd0742 100644 --- a/core/api/util/util.go +++ b/core/api/util/util.go @@ -49,7 +49,7 @@ func ResolveTypeToName(mw service.ClientCommandsServer, spaceId string, typeId s Value: pbtypes.String(typeId), }, }, - Keys: []string{string(bundle.RelationKeyName)}, + Keys: []string{bundle.RelationKeyName.String()}, }) if resp.Error.Code != pb.RpcObjectSearchResponseError_NULL { @@ -60,7 +60,7 @@ func ResolveTypeToName(mw service.ClientCommandsServer, spaceId string, typeId s return "", ErrorTypeNotFound } - return resp.Records[0].Fields[string(bundle.RelationKeyName)].GetStringValue(), nil + return resp.Records[0].Fields[bundle.RelationKeyName.String()].GetStringValue(), nil } func ResolveUniqueKeyToTypeId(mw service.ClientCommandsServer, spaceId string, uniqueKey string) (typeId string, err error) { @@ -74,7 +74,7 @@ func ResolveUniqueKeyToTypeId(mw service.ClientCommandsServer, spaceId string, u Value: pbtypes.String(uniqueKey), }, }, - Keys: []string{string(bundle.RelationKeyId)}, + Keys: []string{bundle.RelationKeyId.String()}, }) if resp.Error.Code != pb.RpcObjectSearchResponseError_NULL { @@ -85,5 +85,5 @@ func ResolveUniqueKeyToTypeId(mw service.ClientCommandsServer, spaceId string, u return "", ErrorTypeNotFound } - return resp.Records[0].Fields[string(bundle.RelationKeyId)].GetStringValue(), nil + return resp.Records[0].Fields[bundle.RelationKeyId.String()].GetStringValue(), nil } From b40b2817e04c7e20bcf65cadc5b16c791025d7f6 Mon Sep 17 00:00:00 2001 From: Jannis Metrikat <120120832+jmetrikat@users.noreply.github.com> Date: Wed, 15 Jan 2025 21:34:54 +0100 Subject: [PATCH 110/195] GO-4848: Add app_name param to display_code endpoint --- core/api/docs/docs.go | 9 +++++++++ core/api/docs/swagger.json | 9 +++++++++ core/api/docs/swagger.yaml | 6 ++++++ core/api/services/auth/handler.go | 9 ++++++--- 4 files changed, 30 insertions(+), 3 deletions(-) diff --git a/core/api/docs/docs.go b/core/api/docs/docs.go index 8d08db8c5..496e9f7a4 100644 --- a/core/api/docs/docs.go +++ b/core/api/docs/docs.go @@ -36,6 +36,15 @@ const docTemplate = `{ "auth" ], "summary": "Open a modal window with a code in Anytype Desktop app", + "parameters": [ + { + "type": "string", + "description": "The name of the app that requests the code", + "name": "app_name", + "in": "query", + "required": true + } + ], "responses": { "200": { "description": "Challenge ID", diff --git a/core/api/docs/swagger.json b/core/api/docs/swagger.json index 8b02fed75..27e05018d 100644 --- a/core/api/docs/swagger.json +++ b/core/api/docs/swagger.json @@ -30,6 +30,15 @@ "auth" ], "summary": "Open a modal window with a code in Anytype Desktop app", + "parameters": [ + { + "type": "string", + "description": "The name of the app that requests the code", + "name": "app_name", + "in": "query", + "required": true + } + ], "responses": { "200": { "description": "Challenge ID", diff --git a/core/api/docs/swagger.yaml b/core/api/docs/swagger.yaml index 34576636a..413593b1e 100644 --- a/core/api/docs/swagger.yaml +++ b/core/api/docs/swagger.yaml @@ -338,6 +338,12 @@ paths: post: consumes: - application/json + parameters: + - description: The name of the app that requests the code + in: query + name: app_name + required: true + type: string produces: - application/json responses: diff --git a/core/api/services/auth/handler.go b/core/api/services/auth/handler.go index 8193505f7..894626959 100644 --- a/core/api/services/auth/handler.go +++ b/core/api/services/auth/handler.go @@ -14,12 +14,15 @@ import ( // @Tags auth // @Accept json // @Produce json -// @Success 200 {object} DisplayCodeResponse "Challenge ID" -// @Failure 502 {object} util.ServerError "Internal server error" +// @Param app_name query string true "The name of the app that requests the code" +// @Success 200 {object} DisplayCodeResponse "Challenge ID" +// @Failure 502 {object} util.ServerError "Internal server error" // @Router /auth/display_code [post] func DisplayCodeHandler(s *AuthService) gin.HandlerFunc { return func(c *gin.Context) { - challengeId, err := s.GenerateNewChallenge(c.Request.Context(), "api-test") + appName := c.Query("app_name") + + challengeId, err := s.GenerateNewChallenge(c.Request.Context(), appName) code := util.MapErrorCode(err, util.ErrToCode(ErrFailedGenerateChallenge, http.StatusInternalServerError)) if code != http.StatusOK { From d6d3450548d3405158d47c4b53b5b220fb0bbbfb Mon Sep 17 00:00:00 2001 From: Jannis Metrikat <120120832+jmetrikat@users.noreply.github.com> Date: Thu, 16 Jan 2025 00:50:39 +0100 Subject: [PATCH 111/195] GO-4459: Fix bugs --- cmd/grpcserver/grpc.go | 4 +--- core/api/server/middleware.go | 1 - core/api/services/object/service.go | 32 ++++++++++++++--------------- core/api/services/search/service.go | 6 +++--- core/api/services/space/service.go | 6 ------ core/api/util/util.go | 1 + 6 files changed, 20 insertions(+), 30 deletions(-) diff --git a/cmd/grpcserver/grpc.go b/cmd/grpcserver/grpc.go index d9e421a98..827fd3c39 100644 --- a/cmd/grpcserver/grpc.go +++ b/cmd/grpcserver/grpc.go @@ -226,6 +226,7 @@ func main() { }() startReportMemory(mw) + api.SetMiddlewareParams(mw) shutdown := func() { server.Stop() @@ -247,9 +248,6 @@ func main() { } } - // pass mw to api service - api.SetMiddlewareParams(mw) - for { sig := <-signalChan if shouldSaveStack(sig) { diff --git a/core/api/server/middleware.go b/core/api/server/middleware.go index 6f0273545..bc8cb7312 100644 --- a/core/api/server/middleware.go +++ b/core/api/server/middleware.go @@ -48,7 +48,6 @@ func (s *Server) ensureAuthenticated() gin.HandlerFunc { // ensureAccountInfo is a middleware that ensures the account info is available in the services. func (s *Server) ensureAccountInfo(a *app.App) gin.HandlerFunc { return func(c *gin.Context) { - // TODO: consider not fetching account info on every request; currently used to avoid inconsistencies on logout/login if a == nil { c.AbortWithStatusJSON(http.StatusForbidden, gin.H{"error": "failed to get app instance"}) return diff --git a/core/api/services/object/service.go b/core/api/services/object/service.go index a0214f834..ecffe4dc5 100644 --- a/core/api/services/object/service.go +++ b/core/api/services/object/service.go @@ -412,31 +412,29 @@ func (s *ObjectService) GetDetails(resp *pb.RpcObjectShowResponse) []Detail { return []Detail{ { - Id: "lastModifiedDate", + Id: "last_modified_date", Details: map[string]interface{}{ - "lastModifiedDate": PosixToISO8601(resp.ObjectView.Details[0].Details.Fields[bundle.RelationKeyLastModifiedDate.String()].GetNumberValue()), + "last_modified_date": PosixToISO8601(resp.ObjectView.Details[0].Details.Fields[bundle.RelationKeyLastModifiedDate.String()].GetNumberValue()), }, }, { - Id: "createdDate", + Id: "last_modified_by", Details: map[string]interface{}{ - "createdDate": PosixToISO8601(resp.ObjectView.Details[0].Details.Fields[bundle.RelationKeyCreatedDate.String()].GetNumberValue()), - }, - }, - { - Id: "createdBy", - Details: map[string]interface{}{ - "id": creatorId, - "details": s.spaceService.GetParticipantDetails(s.mw, s.AccountInfo, resp.ObjectView.Details[0].Details.Fields[bundle.RelationKeySpaceId.String()].GetStringValue(), creatorId), - }, - }, - { - Id: "lastModifiedBy", - Details: map[string]interface{}{ - "id": lastModifiedById, "details": s.spaceService.GetParticipantDetails(s.mw, s.AccountInfo, resp.ObjectView.Details[0].Details.Fields[bundle.RelationKeySpaceId.String()].GetStringValue(), lastModifiedById), }, }, + { + Id: "created_date", + Details: map[string]interface{}{ + "created_date": PosixToISO8601(resp.ObjectView.Details[0].Details.Fields[bundle.RelationKeyCreatedDate.String()].GetNumberValue()), + }, + }, + { + Id: "created_by", + Details: map[string]interface{}{ + "details": s.spaceService.GetParticipantDetails(s.mw, s.AccountInfo, resp.ObjectView.Details[0].Details.Fields[bundle.RelationKeySpaceId.String()].GetStringValue(), creatorId), + }, + }, { Id: "tags", Details: map[string]interface{}{ diff --git a/core/api/services/search/service.go b/core/api/services/search/service.go index 41db34632..8186758f6 100644 --- a/core/api/services/search/service.go +++ b/core/api/services/search/service.go @@ -88,10 +88,10 @@ func (s *SearchService) Search(ctx context.Context, searchQuery string, objectTy return nil, 0, false, ErrNoObjectsFound } - // sort after ISO 8601 lastModifiedDate to achieve descending sort order across all spaces + // sort after ISO 8601 last_modified_date to achieve descending sort order across all spaces sort.Slice(results, func(i, j int) bool { - dateStrI := results[i].Details[0].Details["lastModifiedDate"].(string) - dateStrJ := results[j].Details[0].Details["lastModifiedDate"].(string) + dateStrI := results[i].Details[0].Details["last_modified_date"].(string) + dateStrJ := results[j].Details[0].Details["last_modified_date"].(string) return dateStrI > dateStrJ }) diff --git a/core/api/services/space/service.go b/core/api/services/space/service.go index fef990bdd..f67cc2df2 100644 --- a/core/api/services/space/service.go +++ b/core/api/services/space/service.go @@ -60,12 +60,6 @@ func (s *SpaceService) ListSpaces(ctx context.Context, offset int, limit int) (s Condition: model.BlockContentDataviewFilter_Equal, Value: pbtypes.Int64(int64(model.SpaceStatus_Ok)), }, - { - Operator: model.BlockContentDataviewFilter_No, - RelationKey: bundle.RelationKeySpaceRemoteStatus.String(), - Condition: model.BlockContentDataviewFilter_Equal, - Value: pbtypes.Int64(int64(model.SpaceStatus_Ok)), - }, }, Sorts: []*model.BlockContentDataviewSort{ { diff --git a/core/api/util/util.go b/core/api/util/util.go index 5f0cd0742..6c5a74eb9 100644 --- a/core/api/util/util.go +++ b/core/api/util/util.go @@ -44,6 +44,7 @@ func ResolveTypeToName(mw service.ClientCommandsServer, spaceId string, typeId s SpaceId: spaceId, Filters: []*model.BlockContentDataviewFilter{ { + Operator: model.BlockContentDataviewFilter_No, RelationKey: relKey, Condition: model.BlockContentDataviewFilter_Equal, Value: pbtypes.String(typeId), From 2eaad095338e5663658177ad5c3b91c9b816a4c4 Mon Sep 17 00:00:00 2001 From: Jannis Metrikat <120120832+jmetrikat@users.noreply.github.com> Date: Thu, 16 Jan 2025 00:51:13 +0100 Subject: [PATCH 112/195] GO-4459: Revive tests --- core/api/services/object/service_test.go | 220 ++++++++++++++++------- core/api/services/search/service_test.go | 185 ++++++++++++++++--- core/api/services/space/service_test.go | 51 +++--- 3 files changed, 339 insertions(+), 117 deletions(-) diff --git a/core/api/services/object/service_test.go b/core/api/services/object/service_test.go index 4b3d42e5b..facee6692 100644 --- a/core/api/services/object/service_test.go +++ b/core/api/services/object/service_test.go @@ -8,6 +8,7 @@ import ( "github.com/stretchr/testify/mock" "github.com/stretchr/testify/require" + "github.com/anyproto/anytype-heart/core/api/services/space" "github.com/anyproto/anytype-heart/pb" "github.com/anyproto/anytype-heart/pb/service/mock_service" "github.com/anyproto/anytype-heart/pkg/lib/bundle" @@ -32,7 +33,9 @@ type fixture struct { func newFixture(t *testing.T) *fixture { mw := mock_service.NewMockClientCommandsServer(t) - objectService := NewService(mw) + + spaceService := space.NewService(mw) + objectService := NewService(mw, spaceService) objectService.AccountInfo = &model.AccountInfo{ TechSpaceId: mockedTechSpaceId, GatewayUrl: gatewayUrl, @@ -79,16 +82,16 @@ func TestObjectService_ListObjects(t *testing.T) { Offset: 0, Limit: 0, ObjectTypeFilter: []string{}, - Keys: []string{"id", "name"}, + Keys: []string{bundle.RelationKeyId.String(), bundle.RelationKeyName.String()}, }).Return(&pb.RpcObjectSearchResponse{ Records: []*types.Struct{ { Fields: map[string]*types.Value{ - "id": pbtypes.String(mockedObjectId), - "name": pbtypes.String("My Object"), - "type": pbtypes.String("ot-page"), - "layout": pbtypes.Float64(float64(model.ObjectType_basic)), - "iconEmoji": pbtypes.String("📄"), + bundle.RelationKeyId.String(): pbtypes.String(mockedObjectId), + bundle.RelationKeyName.String(): pbtypes.String("My Object"), + bundle.RelationKeyType.String(): pbtypes.String("ot-page"), + bundle.RelationKeyLayout.String(): pbtypes.Float64(float64(model.ObjectType_basic)), + bundle.RelationKeyIconEmoji.String(): pbtypes.String("📄"), }, }, }, @@ -106,12 +109,13 @@ func TestObjectService_ListObjects(t *testing.T) { { Details: &types.Struct{ Fields: map[string]*types.Value{ - "id": pbtypes.String(mockedObjectId), - "name": pbtypes.String("My Object"), - "type": pbtypes.String("ot-page"), - "iconEmoji": pbtypes.String("📄"), - "lastModifiedDate": pbtypes.Float64(999999), - "createdDate": pbtypes.Float64(888888), + bundle.RelationKeyId.String(): pbtypes.String(mockedObjectId), + bundle.RelationKeyName.String(): pbtypes.String("My Object"), + bundle.RelationKeyType.String(): pbtypes.String("ot-page"), + bundle.RelationKeyIconEmoji.String(): pbtypes.String("📄"), + bundle.RelationKeyLastModifiedDate.String(): pbtypes.Float64(999999), + bundle.RelationKeyCreatedDate.String(): pbtypes.Float64(888888), + bundle.RelationKeySpaceId.String(): pbtypes.String(mockedSpaceId), }, }, }, @@ -125,23 +129,50 @@ func TestObjectService_ListObjects(t *testing.T) { SpaceId: mockedSpaceId, Filters: []*model.BlockContentDataviewFilter{ { - RelationKey: "uniqueKey", + RelationKey: bundle.RelationKeyUniqueKey.String(), Condition: model.BlockContentDataviewFilter_Equal, Value: pbtypes.String("ot-page"), }, }, - Keys: []string{"name"}, + Keys: []string{bundle.RelationKeyName.String()}, }).Return(&pb.RpcObjectSearchResponse{ Records: []*types.Struct{ { Fields: map[string]*types.Value{ - "name": pbtypes.String("Page"), + bundle.RelationKeyName.String(): pbtypes.String("Page"), }, }, }, Error: &pb.RpcObjectSearchResponseError{Code: pb.RpcObjectSearchResponseError_NULL}, }).Once() + // Mock participant details + fx.mwMock.On("ObjectSearch", mock.Anything, &pb.RpcObjectSearchRequest{ + SpaceId: mockedSpaceId, + Filters: []*model.BlockContentDataviewFilter{ + { + Operator: model.BlockContentDataviewFilter_No, + RelationKey: bundle.RelationKeyId.String(), + Condition: model.BlockContentDataviewFilter_Equal, + Value: pbtypes.String(""), + }, + }, + Keys: []string{ + bundle.RelationKeyId.String(), + bundle.RelationKeyName.String(), + bundle.RelationKeyIconEmoji.String(), + bundle.RelationKeyIconImage.String(), + bundle.RelationKeyIdentity.String(), + bundle.RelationKeyGlobalName.String(), + bundle.RelationKeyParticipantPermissions.String(), + }, + }).Return(&pb.RpcObjectSearchResponse{ + Error: &pb.RpcObjectSearchResponseError{Code: pb.RpcObjectSearchResponseError_NULL}, + Records: []*types.Struct{ + {}, + }, + }).Twice() + // when objects, total, hasMore, err := fx.ListObjects(ctx, mockedSpaceId, offset, limit) @@ -152,13 +183,17 @@ func TestObjectService_ListObjects(t *testing.T) { require.Equal(t, "My Object", objects[0].Name) require.Equal(t, "Page", objects[0].ObjectType) require.Equal(t, "📄", objects[0].Icon) - require.Equal(t, 3, len(objects[0].Details)) + require.Equal(t, 5, len(objects[0].Details)) for _, detail := range objects[0].Details { - if detail.Id == "createdDate" { - require.Equal(t, float64(888888), detail.Details["createdDate"]) - } else if detail.Id == "lastModifiedDate" { - require.Equal(t, float64(999999), detail.Details["lastModifiedDate"]) + if detail.Id == "created_date" { + require.Equal(t, "1970-01-11T06:54:48Z", detail.Details["created_date"]) + } else if detail.Id == "created_by" { + require.Empty(t, detail.Details["created_by"]) + } else if detail.Id == "last_modified_date" { + require.Equal(t, "1970-01-12T13:46:39Z", detail.Details["last_modified_date"]) + } else if detail.Id == "last_modified_by" { + require.Empty(t, detail.Details["last_modified_by"]) } else if detail.Id == "tags" { require.Empty(t, detail.Details["tags"]) } else { @@ -210,12 +245,13 @@ func TestObjectService_GetObject(t *testing.T) { { Details: &types.Struct{ Fields: map[string]*types.Value{ - "id": pbtypes.String(mockedObjectId), - "name": pbtypes.String("Found Object"), - "type": pbtypes.String("ot-page"), - "iconEmoji": pbtypes.String("🔍"), - "lastModifiedDate": pbtypes.Float64(999999), - "createdDate": pbtypes.Float64(888888), + bundle.RelationKeyId.String(): pbtypes.String(mockedObjectId), + bundle.RelationKeyName.String(): pbtypes.String("Found Object"), + bundle.RelationKeyType.String(): pbtypes.String("ot-page"), + bundle.RelationKeyIconEmoji.String(): pbtypes.String("🔍"), + bundle.RelationKeyLastModifiedDate.String(): pbtypes.Float64(999999), + bundle.RelationKeyCreatedDate.String(): pbtypes.Float64(888888), + bundle.RelationKeySpaceId.String(): pbtypes.String(mockedSpaceId), }, }, }, @@ -228,23 +264,50 @@ func TestObjectService_GetObject(t *testing.T) { SpaceId: mockedSpaceId, Filters: []*model.BlockContentDataviewFilter{ { - RelationKey: "uniqueKey", + RelationKey: bundle.RelationKeyUniqueKey.String(), Condition: model.BlockContentDataviewFilter_Equal, Value: pbtypes.String("ot-page"), }, }, - Keys: []string{"name"}, + Keys: []string{bundle.RelationKeyName.String()}, }).Return(&pb.RpcObjectSearchResponse{ Error: &pb.RpcObjectSearchResponseError{Code: pb.RpcObjectSearchResponseError_NULL}, Records: []*types.Struct{ { Fields: map[string]*types.Value{ - "name": pbtypes.String("Page"), + bundle.RelationKeyName.String(): pbtypes.String("Page"), }, }, }, }, nil).Once() + // Mock participant details + fx.mwMock.On("ObjectSearch", mock.Anything, &pb.RpcObjectSearchRequest{ + SpaceId: mockedSpaceId, + Filters: []*model.BlockContentDataviewFilter{ + { + Operator: model.BlockContentDataviewFilter_No, + RelationKey: bundle.RelationKeyId.String(), + Condition: model.BlockContentDataviewFilter_Equal, + Value: pbtypes.String(""), + }, + }, + Keys: []string{ + bundle.RelationKeyId.String(), + bundle.RelationKeyName.String(), + bundle.RelationKeyIconEmoji.String(), + bundle.RelationKeyIconImage.String(), + bundle.RelationKeyIdentity.String(), + bundle.RelationKeyGlobalName.String(), + bundle.RelationKeyParticipantPermissions.String(), + }, + }).Return(&pb.RpcObjectSearchResponse{ + Error: &pb.RpcObjectSearchResponseError{Code: pb.RpcObjectSearchResponseError_NULL}, + Records: []*types.Struct{ + {}, + }, + }).Twice() + // when object, err := fx.GetObject(ctx, mockedSpaceId, mockedObjectId) @@ -254,13 +317,17 @@ func TestObjectService_GetObject(t *testing.T) { require.Equal(t, "Found Object", object.Name) require.Equal(t, "Page", object.ObjectType) require.Equal(t, "🔍", object.Icon) - require.Equal(t, 3, len(object.Details)) + require.Equal(t, 5, len(object.Details)) for _, detail := range object.Details { - if detail.Id == "createdDate" { - require.Equal(t, float64(888888), detail.Details["createdDate"]) - } else if detail.Id == "lastModifiedDate" { - require.Equal(t, float64(999999), detail.Details["lastModifiedDate"]) + if detail.Id == "created_date" { + require.Equal(t, "1970-01-11T06:54:48Z", detail.Details["created_date"]) + } else if detail.Id == "created_by" { + require.Empty(t, detail.Details["created_by"]) + } else if detail.Id == "last_modified_date" { + require.Equal(t, "1970-01-12T13:46:39Z", detail.Details["last_modified_date"]) + } else if detail.Id == "last_modified_by" { + require.Empty(t, detail.Details["last_modified_by"]) } else if detail.Id == "tags" { require.Empty(t, detail.Details["tags"]) } else { @@ -297,22 +364,25 @@ func TestObjectService_CreateObject(t *testing.T) { fx.mwMock.On("ObjectCreate", mock.Anything, &pb.RpcObjectCreateRequest{ Details: &types.Struct{ Fields: map[string]*types.Value{ - "name": pbtypes.String("New Object"), - "iconEmoji": pbtypes.String("🆕"), + bundle.RelationKeyName.String(): pbtypes.String("New Object"), + bundle.RelationKeyIconEmoji.String(): pbtypes.String("🆕"), + bundle.RelationKeyDescription.String(): pbtypes.String(""), + bundle.RelationKeySource.String(): pbtypes.String(""), + bundle.RelationKeyOrigin.String(): pbtypes.Int64(int64(model.ObjectOrigin_api)), }, }, TemplateId: "", SpaceId: mockedSpaceId, - ObjectTypeUniqueKey: "", + ObjectTypeUniqueKey: "ot-page", WithChat: false, }).Return(&pb.RpcObjectCreateResponse{ ObjectId: mockedNewObjectId, Details: &types.Struct{ Fields: map[string]*types.Value{ - "id": pbtypes.String(mockedNewObjectId), - "name": pbtypes.String("New Object"), - "iconEmoji": pbtypes.String("🆕"), - "spaceId": pbtypes.String(mockedSpaceId), + bundle.RelationKeyId.String(): pbtypes.String(mockedNewObjectId), + bundle.RelationKeyName.String(): pbtypes.String("New Object"), + bundle.RelationKeyIconEmoji.String(): pbtypes.String("🆕"), + bundle.RelationKeySpaceId.String(): pbtypes.String(mockedSpaceId), }, }, Error: &pb.RpcObjectCreateResponseError{Code: pb.RpcObjectCreateResponseError_NULL}, @@ -329,11 +399,12 @@ func TestObjectService_CreateObject(t *testing.T) { { Details: &types.Struct{ Fields: map[string]*types.Value{ - "id": pbtypes.String(mockedNewObjectId), - "name": pbtypes.String("New Object"), - "type": pbtypes.String("ot-page"), - "iconEmoji": pbtypes.String("🆕"), - "spaceId": pbtypes.String(mockedSpaceId), + bundle.RelationKeyId.String(): pbtypes.String(mockedNewObjectId), + bundle.RelationKeyName.String(): pbtypes.String("New Object"), + bundle.RelationKeyLayout.String(): pbtypes.Float64(float64(model.ObjectType_basic)), + bundle.RelationKeyType.String(): pbtypes.String("ot-page"), + bundle.RelationKeyIconEmoji.String(): pbtypes.String("🆕"), + bundle.RelationKeySpaceId.String(): pbtypes.String(mockedSpaceId), }, }, }, @@ -347,30 +418,57 @@ func TestObjectService_CreateObject(t *testing.T) { SpaceId: mockedSpaceId, Filters: []*model.BlockContentDataviewFilter{ { - RelationKey: "uniqueKey", + RelationKey: bundle.RelationKeyUniqueKey.String(), Condition: model.BlockContentDataviewFilter_Equal, Value: pbtypes.String("ot-page"), }, }, - Keys: []string{"name"}, + Keys: []string{bundle.RelationKeyName.String()}, }).Return(&pb.RpcObjectSearchResponse{ Error: &pb.RpcObjectSearchResponseError{Code: pb.RpcObjectSearchResponseError_NULL}, Records: []*types.Struct{ { Fields: map[string]*types.Value{ - "name": pbtypes.String("Page"), + bundle.RelationKeyName.String(): pbtypes.String("Page"), }, }, }, }).Once() + // Mock participant details + fx.mwMock.On("ObjectSearch", mock.Anything, &pb.RpcObjectSearchRequest{ + SpaceId: mockedSpaceId, + Filters: []*model.BlockContentDataviewFilter{ + { + Operator: model.BlockContentDataviewFilter_No, + RelationKey: bundle.RelationKeyId.String(), + Condition: model.BlockContentDataviewFilter_Equal, + Value: pbtypes.String(""), + }, + }, + Keys: []string{ + bundle.RelationKeyId.String(), + bundle.RelationKeyName.String(), + bundle.RelationKeyIconEmoji.String(), + bundle.RelationKeyIconImage.String(), + bundle.RelationKeyIdentity.String(), + bundle.RelationKeyGlobalName.String(), + bundle.RelationKeyParticipantPermissions.String(), + }, + }).Return(&pb.RpcObjectSearchResponse{ + Error: &pb.RpcObjectSearchResponseError{Code: pb.RpcObjectSearchResponseError_NULL}, + Records: []*types.Struct{ + {}, + }, + }).Twice() + // when object, err := fx.CreateObject(ctx, mockedSpaceId, CreateObjectRequest{ Name: "New Object", Icon: "🆕", // TODO: use actual values TemplateId: "", - ObjectTypeUniqueKey: "", + ObjectTypeUniqueKey: "ot-page", WithChat: false, }) @@ -416,10 +514,10 @@ func TestObjectService_ListTypes(t *testing.T) { Records: []*types.Struct{ { Fields: map[string]*types.Value{ - "id": pbtypes.String("type-1"), - "name": pbtypes.String("Type One"), - "uniqueKey": pbtypes.String("type-one-key"), - "iconEmoji": pbtypes.String("🗂️"), + bundle.RelationKeyId.String(): pbtypes.String("type-1"), + bundle.RelationKeyName.String(): pbtypes.String("Type One"), + bundle.RelationKeyUniqueKey.String(): pbtypes.String("type-one-key"), + bundle.RelationKeyIconEmoji.String(): pbtypes.String("🗂️"), }, }, }, @@ -473,8 +571,8 @@ func TestObjectService_ListTemplates(t *testing.T) { Records: []*types.Struct{ { Fields: map[string]*types.Value{ - "id": pbtypes.String("template-type-id"), - "uniqueKey": pbtypes.String("ot-template"), + bundle.RelationKeyId.String(): pbtypes.String("template-type-id"), + bundle.RelationKeyUniqueKey.String(): pbtypes.String("ot-template"), }, }, }, @@ -486,8 +584,8 @@ func TestObjectService_ListTemplates(t *testing.T) { Records: []*types.Struct{ { Fields: map[string]*types.Value{ - "id": pbtypes.String("template-1"), - "targetObjectType": pbtypes.String("target-type-id"), + bundle.RelationKeyId.String(): pbtypes.String("template-1"), + bundle.RelationKeyTargetObjectType.String(): pbtypes.String("target-type-id"), }, }, }, @@ -502,8 +600,8 @@ func TestObjectService_ListTemplates(t *testing.T) { { Details: &types.Struct{ Fields: map[string]*types.Value{ - "name": pbtypes.String("Template Name"), - "iconEmoji": pbtypes.String("📝"), + bundle.RelationKeyName.String(): pbtypes.String("Template Name"), + bundle.RelationKeyIconEmoji.String(): pbtypes.String("📝"), }, }, }, diff --git a/core/api/services/search/service_test.go b/core/api/services/search/service_test.go index a54cc68f5..6de749d3e 100644 --- a/core/api/services/search/service_test.go +++ b/core/api/services/search/service_test.go @@ -34,7 +34,7 @@ func newFixture(t *testing.T) *fixture { spaceService := space.NewService(mw) spaceService.AccountInfo = &model.AccountInfo{TechSpaceId: techSpaceId} - objectService := object.NewService(mw) + objectService := object.NewService(mw, spaceService) objectService.AccountInfo = &model.AccountInfo{TechSpaceId: techSpaceId} searchService := NewService(mw, spaceService, objectService) searchService.AccountInfo = &model.AccountInfo{ @@ -59,35 +59,32 @@ func TestSearchService_Search(t *testing.T) { SpaceId: techSpaceId, Filters: []*model.BlockContentDataviewFilter{ { + Operator: model.BlockContentDataviewFilter_No, RelationKey: bundle.RelationKeyLayout.String(), Condition: model.BlockContentDataviewFilter_Equal, Value: pbtypes.Int64(int64(model.ObjectType_spaceView)), }, { + Operator: model.BlockContentDataviewFilter_No, RelationKey: bundle.RelationKeySpaceLocalStatus.String(), Condition: model.BlockContentDataviewFilter_Equal, Value: pbtypes.Int64(int64(model.SpaceStatus_Ok)), }, - { - RelationKey: bundle.RelationKeySpaceRemoteStatus.String(), - Condition: model.BlockContentDataviewFilter_Equal, - Value: pbtypes.Int64(int64(model.SpaceStatus_Ok)), - }, }, Sorts: []*model.BlockContentDataviewSort{ { - RelationKey: "spaceOrder", + RelationKey: bundle.RelationKeySpaceOrder.String(), Type: model.BlockContentDataviewSort_Asc, NoCollate: true, EmptyPlacement: model.BlockContentDataviewSort_End, }, }, - Keys: []string{"targetSpaceId", "name", "iconEmoji", "iconImage"}, + Keys: []string{bundle.RelationKeyTargetSpaceId.String(), bundle.RelationKeyName.String(), bundle.RelationKeyIconEmoji.String(), bundle.RelationKeyIconImage.String()}, }).Return(&pb.RpcObjectSearchResponse{ Records: []*types.Struct{ { Fields: map[string]*types.Value{ - "targetSpaceId": pbtypes.String("space-1"), + bundle.RelationKeyTargetSpaceId.String(): pbtypes.String("space-1"), }, }, }, @@ -106,17 +103,73 @@ func TestSearchService_Search(t *testing.T) { }).Once() // Mock objects in space-1 - fx.mwMock.On("ObjectSearch", mock.Anything, mock.Anything).Return(&pb.RpcObjectSearchResponse{ + fx.mwMock.On("ObjectSearch", mock.Anything, &pb.RpcObjectSearchRequest{ + SpaceId: "space-1", + Filters: []*model.BlockContentDataviewFilter{ + { + Operator: model.BlockContentDataviewFilter_And, + NestedFilters: []*model.BlockContentDataviewFilter{ + { + Operator: model.BlockContentDataviewFilter_No, + RelationKey: bundle.RelationKeyLayout.String(), + Condition: model.BlockContentDataviewFilter_In, + Value: pbtypes.IntList([]int{ + int(model.ObjectType_basic), + int(model.ObjectType_profile), + int(model.ObjectType_todo), + int(model.ObjectType_note), + int(model.ObjectType_bookmark), + int(model.ObjectType_set), + int(model.ObjectType_collection), + int(model.ObjectType_participant), + }...), + }, + { + Operator: model.BlockContentDataviewFilter_No, + RelationKey: bundle.RelationKeyIsHidden.String(), + Condition: model.BlockContentDataviewFilter_NotEqual, + Value: pbtypes.Bool(true), + }, + { + Operator: model.BlockContentDataviewFilter_Or, + NestedFilters: []*model.BlockContentDataviewFilter{ + { + Operator: model.BlockContentDataviewFilter_No, + RelationKey: bundle.RelationKeyName.String(), + Condition: model.BlockContentDataviewFilter_Like, + Value: pbtypes.String("search-term"), + }, + { + Operator: model.BlockContentDataviewFilter_No, + RelationKey: bundle.RelationKeySnippet.String(), + Condition: model.BlockContentDataviewFilter_Like, + Value: pbtypes.String("search-term"), + }, + }, + }, + }, + }, + }, + Sorts: []*model.BlockContentDataviewSort{{ + RelationKey: bundle.RelationKeyLastModifiedDate.String(), + Type: model.BlockContentDataviewSort_Desc, + Format: model.RelationFormat_date, + IncludeTime: true, + EmptyPlacement: model.BlockContentDataviewSort_NotSpecified, + }}, + Keys: []string{bundle.RelationKeyId.String(), bundle.RelationKeyName.String()}, + Limit: int32(limit), + }).Return(&pb.RpcObjectSearchResponse{ Records: []*types.Struct{ { Fields: map[string]*types.Value{ - "id": pbtypes.String("obj-global-1"), - "name": pbtypes.String("Global Object"), + bundle.RelationKeyId.String(): pbtypes.String("obj-global-1"), + bundle.RelationKeyName.String(): pbtypes.String("Global Object"), }, }, }, Error: &pb.RpcObjectSearchResponseError{Code: pb.RpcObjectSearchResponseError_NULL}, - }).Twice() + }).Once() // Mock object show for object blocks and details fx.mwMock.On("ObjectShow", mock.Anything, &pb.RpcObjectShowRequest{ @@ -163,14 +216,25 @@ func TestSearchService_Search(t *testing.T) { Id: "root-123", Details: &types.Struct{ Fields: map[string]*types.Value{ - "id": pbtypes.String("obj-global-1"), - "name": pbtypes.String("Global Object"), - "layout": pbtypes.Int64(int64(model.ObjectType_basic)), - "iconEmoji": pbtypes.String("🌐"), - "lastModifiedDate": pbtypes.Float64(999999), - "createdDate": pbtypes.Float64(888888), - "spaceId": pbtypes.String("space-1"), - "tag": pbtypes.StringList([]string{"tag-1", "tag-2"}), + bundle.RelationKeyId.String(): pbtypes.String("obj-global-1"), + bundle.RelationKeyName.String(): pbtypes.String("Global Object"), + bundle.RelationKeyLayout.String(): pbtypes.Int64(int64(model.ObjectType_basic)), + bundle.RelationKeyIconEmoji.String(): pbtypes.String("🌐"), + bundle.RelationKeyLastModifiedDate.String(): pbtypes.Float64(999999), + bundle.RelationKeyLastModifiedBy.String(): pbtypes.String("participant-id"), + bundle.RelationKeyCreatedDate.String(): pbtypes.Float64(888888), + bundle.RelationKeyCreator.String(): pbtypes.String("participant-id"), + bundle.RelationKeySpaceId.String(): pbtypes.String("space-1"), + bundle.RelationKeyType.String(): pbtypes.String("type-1"), + bundle.RelationKeyTag.String(): pbtypes.StringList([]string{"tag-1", "tag-2"}), + }, + }, + }, + { + Id: "participant-id", + Details: &types.Struct{ + Fields: map[string]*types.Value{ + bundle.RelationKeyId.String(): pbtypes.String("participant-id"), }, }, }, @@ -178,8 +242,8 @@ func TestSearchService_Search(t *testing.T) { Id: "tag-1", Details: &types.Struct{ Fields: map[string]*types.Value{ - "name": pbtypes.String("Important"), - "relationOptionColor": pbtypes.String("red"), + bundle.RelationKeyName.String(): pbtypes.String("Important"), + bundle.RelationKeyRelationOptionColor.String(): pbtypes.String("red"), }, }, }, @@ -187,8 +251,8 @@ func TestSearchService_Search(t *testing.T) { Id: "tag-2", Details: &types.Struct{ Fields: map[string]*types.Value{ - "name": pbtypes.String("Optional"), - "relationOptionColor": pbtypes.String("blue"), + bundle.RelationKeyName.String(): pbtypes.String("Optional"), + bundle.RelationKeyRelationOptionColor.String(): pbtypes.String("blue"), }, }, }, @@ -197,6 +261,65 @@ func TestSearchService_Search(t *testing.T) { Error: &pb.RpcObjectShowResponseError{Code: pb.RpcObjectShowResponseError_NULL}, }, nil).Once() + // Mock type resolution + fx.mwMock.On("ObjectSearch", mock.Anything, &pb.RpcObjectSearchRequest{ + SpaceId: "space-1", + Filters: []*model.BlockContentDataviewFilter{ + { + Operator: model.BlockContentDataviewFilter_No, + RelationKey: bundle.RelationKeyId.String(), + Condition: model.BlockContentDataviewFilter_Equal, + Value: pbtypes.String("type-1"), + }, + }, + Keys: []string{bundle.RelationKeyName.String()}, + }).Return(&pb.RpcObjectSearchResponse{ + Records: []*types.Struct{ + { + Fields: map[string]*types.Value{ + bundle.RelationKeyName.String(): pbtypes.String("object-type-name"), + }, + }, + }, + Error: &pb.RpcObjectSearchResponseError{Code: pb.RpcObjectSearchResponseError_NULL}, + }).Once() + + // Mock participant details + fx.mwMock.On("ObjectSearch", mock.Anything, &pb.RpcObjectSearchRequest{ + SpaceId: "space-1", + Filters: []*model.BlockContentDataviewFilter{ + { + Operator: model.BlockContentDataviewFilter_No, + RelationKey: bundle.RelationKeyId.String(), + Condition: model.BlockContentDataviewFilter_Equal, + Value: pbtypes.String("participant-id"), + }, + }, + Keys: []string{bundle.RelationKeyId.String(), + bundle.RelationKeyName.String(), + bundle.RelationKeyIconEmoji.String(), + bundle.RelationKeyIconImage.String(), + bundle.RelationKeyIdentity.String(), + bundle.RelationKeyGlobalName.String(), + bundle.RelationKeyParticipantPermissions.String(), + }, + }).Return(&pb.RpcObjectSearchResponse{ + Records: []*types.Struct{ + { + Fields: map[string]*types.Value{ + bundle.RelationKeyId.String(): pbtypes.String("participant-id"), + bundle.RelationKeyName.String(): pbtypes.String("Participant Name"), + bundle.RelationKeyIconEmoji.String(): pbtypes.String("emoji"), + bundle.RelationKeyIconImage.String(): pbtypes.String("image-url"), + bundle.RelationKeyIdentity.String(): pbtypes.String("identity"), + bundle.RelationKeyGlobalName.String(): pbtypes.String("global-name"), + bundle.RelationKeyParticipantPermissions.String(): pbtypes.Int64(int64(model.ParticipantPermissions_Reader)), + }, + }, + }, + Error: &pb.RpcObjectSearchResponseError{Code: pb.RpcObjectSearchResponseError_NULL}, + }).Twice() + // when objects, total, hasMore, err := fx.Search(ctx, "search-term", []string{}, offset, limit) @@ -213,10 +336,14 @@ func TestSearchService_Search(t *testing.T) { // check details for _, detail := range objects[0].Details { - if detail.Id == "createdDate" { - require.Equal(t, string("1970-01-11T06:54:48Z"), detail.Details["createdDate"]) - } else if detail.Id == "lastModifiedDate" { - require.Equal(t, string("1970-01-12T13:46:39Z"), detail.Details["lastModifiedDate"]) + if detail.Id == "created_date" { + require.Equal(t, "1970-01-11T06:54:48Z", detail.Details["created_date"]) + } else if detail.Id == "last_modified_date" { + require.Equal(t, "1970-01-12T13:46:39Z", detail.Details["last_modified_date"]) + } else if detail.Id == "created_by" { + require.Equal(t, "participant-id", detail.Details["details"].(space.Member).Id) + } else if detail.Id == "last_modified_by" { + require.Equal(t, "participant-id", detail.Details["details"].(space.Member).Id) } } diff --git a/core/api/services/space/service_test.go b/core/api/services/space/service_test.go index 5d2293b96..96802831b 100644 --- a/core/api/services/space/service_test.go +++ b/core/api/services/space/service_test.go @@ -52,20 +52,17 @@ func TestSpaceService_ListSpaces(t *testing.T) { SpaceId: techSpaceId, Filters: []*model.BlockContentDataviewFilter{ { + Operator: model.BlockContentDataviewFilter_No, RelationKey: bundle.RelationKeyLayout.String(), Condition: model.BlockContentDataviewFilter_Equal, Value: pbtypes.Int64(int64(model.ObjectType_spaceView)), }, { + Operator: model.BlockContentDataviewFilter_No, RelationKey: bundle.RelationKeySpaceLocalStatus.String(), Condition: model.BlockContentDataviewFilter_Equal, Value: pbtypes.Int64(int64(model.SpaceStatus_Ok)), }, - { - RelationKey: bundle.RelationKeySpaceRemoteStatus.String(), - Condition: model.BlockContentDataviewFilter_Equal, - Value: pbtypes.Int64(int64(model.SpaceStatus_Ok)), - }, }, Sorts: []*model.BlockContentDataviewSort{ { @@ -80,18 +77,18 @@ func TestSpaceService_ListSpaces(t *testing.T) { Records: []*types.Struct{ { Fields: map[string]*types.Value{ - "name": pbtypes.String("Another Workspace"), - "targetSpaceId": pbtypes.String("another-space-id"), - "iconEmoji": pbtypes.String(""), - "iconImage": pbtypes.String(iconImage), + bundle.RelationKeyName.String(): pbtypes.String("Another Workspace"), + bundle.RelationKeyTargetSpaceId.String(): pbtypes.String("another-space-id"), + bundle.RelationKeyIconEmoji.String(): pbtypes.String(""), + bundle.RelationKeyIconImage.String(): pbtypes.String(iconImage), }, }, { Fields: map[string]*types.Value{ - "name": pbtypes.String("My Workspace"), - "targetSpaceId": pbtypes.String("my-space-id"), - "iconEmoji": pbtypes.String("🚀"), - "iconImage": pbtypes.String(""), + bundle.RelationKeyName.String(): pbtypes.String("My Workspace"), + bundle.RelationKeyTargetSpaceId.String(): pbtypes.String("my-space-id"), + bundle.RelationKeyIconEmoji.String(): pbtypes.String("🚀"), + bundle.RelationKeyIconImage.String(): pbtypes.String(""), }, }, }, @@ -164,10 +161,10 @@ func TestSpaceService_ListSpaces(t *testing.T) { Records: []*types.Struct{ { Fields: map[string]*types.Value{ - "name": pbtypes.String("My Workspace"), - "targetSpaceId": pbtypes.String("my-space-id"), - "iconEmoji": pbtypes.String("🚀"), - "iconImage": pbtypes.String(""), + bundle.RelationKeyName.String(): pbtypes.String("My Workspace"), + bundle.RelationKeyTargetSpaceId.String(): pbtypes.String("my-space-id"), + bundle.RelationKeyIconEmoji.String(): pbtypes.String("🚀"), + bundle.RelationKeyIconImage.String(): pbtypes.String(""), }, }, }, @@ -256,20 +253,20 @@ func TestSpaceService_ListMembers(t *testing.T) { Records: []*types.Struct{ { Fields: map[string]*types.Value{ - "id": pbtypes.String("member-1"), - "name": pbtypes.String("John Doe"), - "iconEmoji": pbtypes.String("👤"), - "identity": pbtypes.String("AAjEaEwPF4nkEh7AWkqEnzcQ8HziGB4ETjiTpvRCQvWnSMDZ"), - "globalName": pbtypes.String("john.any"), + bundle.RelationKeyId.String(): pbtypes.String("member-1"), + bundle.RelationKeyName.String(): pbtypes.String("John Doe"), + bundle.RelationKeyIconEmoji.String(): pbtypes.String("👤"), + bundle.RelationKeyIdentity.String(): pbtypes.String("AAjEaEwPF4nkEh7AWkqEnzcQ8HziGB4ETjiTpvRCQvWnSMDZ"), + bundle.RelationKeyGlobalName.String(): pbtypes.String("john.any"), }, }, { Fields: map[string]*types.Value{ - "id": pbtypes.String("member-2"), - "name": pbtypes.String("Jane Doe"), - "iconImage": pbtypes.String(iconImage), - "identity": pbtypes.String("AAjLbEwPF4nkEh7AWkqEnzcQ8HziGB4ETjiTpvRCQvWnSMD4"), - "globalName": pbtypes.String("jane.any"), + bundle.RelationKeyId.String(): pbtypes.String("member-2"), + bundle.RelationKeyName.String(): pbtypes.String("Jane Doe"), + bundle.RelationKeyIconImage.String(): pbtypes.String(iconImage), + bundle.RelationKeyIdentity.String(): pbtypes.String("AAjLbEwPF4nkEh7AWkqEnzcQ8HziGB4ETjiTpvRCQvWnSMD4"), + bundle.RelationKeyGlobalName.String(): pbtypes.String("jane.any"), }, }, }, From 16a0117ea9f4790b62956ab5b163d6aa63ba363a Mon Sep 17 00:00:00 2001 From: Jannis Metrikat <120120832+jmetrikat@users.noreply.github.com> Date: Thu, 16 Jan 2025 01:29:04 +0100 Subject: [PATCH 113/195] GO-4459: Add tests for export service --- core/api/services/export/service_test.go | 134 +++++++++++++++++++++++ 1 file changed, 134 insertions(+) create mode 100644 core/api/services/export/service_test.go diff --git a/core/api/services/export/service_test.go b/core/api/services/export/service_test.go new file mode 100644 index 000000000..a57406d6e --- /dev/null +++ b/core/api/services/export/service_test.go @@ -0,0 +1,134 @@ +package export + +import ( + "context" + "testing" + + "github.com/stretchr/testify/mock" + "github.com/stretchr/testify/require" + + "github.com/anyproto/anytype-heart/pb" + "github.com/anyproto/anytype-heart/pb/service/mock_service" + "github.com/anyproto/anytype-heart/pkg/lib/pb/model" +) + +const ( + spaceID = "space-123" + objectID = "obj-456" + exportFormat = "markdown" + unrecognizedFormat = "unrecognized" + exportPath = "/some/dir/myexport" +) + +type fixture struct { + *ExportService + mwMock *mock_service.MockClientCommandsServer +} + +func newFixture(t *testing.T) *fixture { + mw := mock_service.NewMockClientCommandsServer(t) + exportService := NewService(mw) + + return &fixture{ + ExportService: exportService, + mwMock: mw, + } +} + +func TestExportService_GetObjectExport(t *testing.T) { + t.Run("successful export to markdown", func(t *testing.T) { + // Given + ctx := context.Background() + fx := newFixture(t) + + // Mock the ObjectListExport call + fx.mwMock. + On("ObjectListExport", mock.Anything, &pb.RpcObjectListExportRequest{ + SpaceId: spaceID, + Path: exportPath, + ObjectIds: []string{objectID}, + Format: model.Export_Markdown, + Zip: false, + IncludeNested: false, + IncludeFiles: true, + IsJson: false, + IncludeArchived: false, + NoProgress: true, + }). + Return(&pb.RpcObjectListExportResponse{ + Path: exportPath, + Error: &pb.RpcObjectListExportResponseError{ + Code: pb.RpcObjectListExportResponseError_NULL, + }, + }). + Once() + + // When + gotPath, err := fx.GetObjectExport(ctx, spaceID, objectID, exportFormat, exportPath) + + // Then + require.NoError(t, err) + require.Equal(t, exportPath, gotPath) + fx.mwMock.AssertExpectations(t) + }) + + t.Run("failed export returns error", func(t *testing.T) { + // Given + ctx := context.Background() + fx := newFixture(t) + + // Mock the ObjectListExport call to return an error code + fx.mwMock. + On("ObjectListExport", mock.Anything, mock.Anything). + Return(&pb.RpcObjectListExportResponse{ + Path: "", + Error: &pb.RpcObjectListExportResponseError{ + Code: pb.RpcObjectListExportResponseError_UNKNOWN_ERROR, + }, + }). + Once() + + // When + gotPath, err := fx.GetObjectExport(ctx, spaceID, objectID, exportFormat, exportPath) + + // Then + require.Error(t, err) + require.Empty(t, gotPath) + require.ErrorIs(t, err, ErrFailedExportObjectAsMarkdown) + fx.mwMock.AssertExpectations(t) + }) + + t.Run("unrecognized format defaults to markdown", func(t *testing.T) { + ctx := context.Background() + fx := newFixture(t) + + fx.mwMock. + On("ObjectListExport", mock.Anything, &pb.RpcObjectListExportRequest{ + SpaceId: spaceID, + Path: exportPath, + ObjectIds: []string{objectID}, + Format: model.Export_Markdown, // fallback + Zip: false, + IncludeNested: false, + IncludeFiles: true, + IsJson: false, + IncludeArchived: false, + NoProgress: true, + }). + Return(&pb.RpcObjectListExportResponse{ + Path: exportPath, + Error: &pb.RpcObjectListExportResponseError{ + Code: pb.RpcObjectListExportResponseError_NULL, + }, + }). + Once() + + // When + gotPath, err := fx.GetObjectExport(ctx, spaceID, objectID, unrecognizedFormat, exportPath) // + + // Then + require.NoError(t, err) + require.Equal(t, exportPath, gotPath) + fx.mwMock.AssertExpectations(t) + }) +} From d2ed118c04f10c4204b6e34c010234a03caebf25 Mon Sep 17 00:00:00 2001 From: Jannis Metrikat <120120832+jmetrikat@users.noreply.github.com> Date: Thu, 16 Jan 2025 01:55:43 +0100 Subject: [PATCH 114/195] GO-4459: Require app name to generate api key through challenge --- core/api/docs/docs.go | 6 ++++++ core/api/docs/swagger.json | 6 ++++++ core/api/docs/swagger.yaml | 4 ++++ core/api/services/auth/handler.go | 15 +++++++++------ core/api/services/auth/service.go | 15 ++++++++++----- core/api/services/auth/service_test.go | 26 ++++++++++++++++++++------ 6 files changed, 55 insertions(+), 17 deletions(-) diff --git a/core/api/docs/docs.go b/core/api/docs/docs.go index 496e9f7a4..5c812f7a4 100644 --- a/core/api/docs/docs.go +++ b/core/api/docs/docs.go @@ -52,6 +52,12 @@ const docTemplate = `{ "$ref": "#/definitions/auth.DisplayCodeResponse" } }, + "400": { + "description": "Invalid input", + "schema": { + "$ref": "#/definitions/util.ValidationError" + } + }, "502": { "description": "Internal server error", "schema": { diff --git a/core/api/docs/swagger.json b/core/api/docs/swagger.json index 27e05018d..3bdab46ab 100644 --- a/core/api/docs/swagger.json +++ b/core/api/docs/swagger.json @@ -46,6 +46,12 @@ "$ref": "#/definitions/auth.DisplayCodeResponse" } }, + "400": { + "description": "Invalid input", + "schema": { + "$ref": "#/definitions/util.ValidationError" + } + }, "502": { "description": "Internal server error", "schema": { diff --git a/core/api/docs/swagger.yaml b/core/api/docs/swagger.yaml index 413593b1e..dd2a83a1d 100644 --- a/core/api/docs/swagger.yaml +++ b/core/api/docs/swagger.yaml @@ -351,6 +351,10 @@ paths: description: Challenge ID schema: $ref: '#/definitions/auth.DisplayCodeResponse' + "400": + description: Invalid input + schema: + $ref: '#/definitions/util.ValidationError' "502": description: Internal server error schema: diff --git a/core/api/services/auth/handler.go b/core/api/services/auth/handler.go index 894626959..23921af13 100644 --- a/core/api/services/auth/handler.go +++ b/core/api/services/auth/handler.go @@ -14,16 +14,19 @@ import ( // @Tags auth // @Accept json // @Produce json -// @Param app_name query string true "The name of the app that requests the code" -// @Success 200 {object} DisplayCodeResponse "Challenge ID" -// @Failure 502 {object} util.ServerError "Internal server error" +// @Param app_name query string true "The name of the app that requests the code" +// @Success 200 {object} DisplayCodeResponse "Challenge ID" +// @Failure 400 {object} util.ValidationError "Invalid input" +// @Failure 502 {object} util.ServerError "Internal server error" // @Router /auth/display_code [post] func DisplayCodeHandler(s *AuthService) gin.HandlerFunc { return func(c *gin.Context) { appName := c.Query("app_name") - challengeId, err := s.GenerateNewChallenge(c.Request.Context(), appName) - code := util.MapErrorCode(err, util.ErrToCode(ErrFailedGenerateChallenge, http.StatusInternalServerError)) + challengeId, err := s.NewChallenge(c.Request.Context(), appName) + code := util.MapErrorCode(err, + util.ErrToCode(ErrMissingAppName, http.StatusBadRequest), + util.ErrToCode(ErrFailedGenerateChallenge, http.StatusInternalServerError)) if code != http.StatusOK { apiErr := util.CodeToAPIError(code, err.Error()) @@ -52,7 +55,7 @@ func TokenHandler(s *AuthService) gin.HandlerFunc { challengeId := c.Query("challenge_id") code := c.Query("code") - sessionToken, appKey, err := s.SolveChallengeForToken(c.Request.Context(), challengeId, code) + sessionToken, appKey, err := s.SolveChallenge(c.Request.Context(), challengeId, code) errCode := util.MapErrorCode(err, util.ErrToCode(ErrInvalidInput, http.StatusBadRequest), util.ErrToCode(ErrFailedAuthenticate, http.StatusInternalServerError), diff --git a/core/api/services/auth/service.go b/core/api/services/auth/service.go index 87c05bc2e..5d63e6712 100644 --- a/core/api/services/auth/service.go +++ b/core/api/services/auth/service.go @@ -9,14 +9,15 @@ import ( ) var ( + ErrMissingAppName = errors.New("missing app name") ErrFailedGenerateChallenge = errors.New("failed to generate a new challenge") ErrInvalidInput = errors.New("invalid input") ErrFailedAuthenticate = errors.New("failed to authenticate user") ) type Service interface { - GenerateNewChallenge(ctx context.Context, appName string) (string, error) - SolveChallengeForToken(ctx context.Context, challengeId string, code string) (sessionToken, appKey string, err error) + NewChallenge(ctx context.Context, appName string) (string, error) + SolveChallenge(ctx context.Context, challengeId string, code string) (sessionToken, appKey string, err error) } type AuthService struct { @@ -27,8 +28,12 @@ func NewService(mw service.ClientCommandsServer) *AuthService { return &AuthService{mw: mw} } -// GenerateNewChallenge calls AccountLocalLinkNewChallenge and returns the challenge ID, or an error if it fails. -func (s *AuthService) GenerateNewChallenge(ctx context.Context, appName string) (string, error) { +// NewChallenge calls AccountLocalLinkNewChallenge and returns the challenge ID, or an error if it fails. +func (s *AuthService) NewChallenge(ctx context.Context, appName string) (string, error) { + if appName == "" { + return "", ErrMissingAppName + } + resp := s.mw.AccountLocalLinkNewChallenge(ctx, &pb.RpcAccountLocalLinkNewChallengeRequest{AppName: appName}) if resp.Error.Code != pb.RpcAccountLocalLinkNewChallengeResponseError_NULL { @@ -39,7 +44,7 @@ func (s *AuthService) GenerateNewChallenge(ctx context.Context, appName string) } // SolveChallengeForToken calls AccountLocalLinkSolveChallenge and returns the session token + app key, or an error if it fails. -func (s *AuthService) SolveChallengeForToken(ctx context.Context, challengeId string, code string) (sessionToken string, appKey string, err error) { +func (s *AuthService) SolveChallenge(ctx context.Context, challengeId string, code string) (sessionToken string, appKey string, err error) { if challengeId == "" || code == "" { return "", "", ErrInvalidInput } diff --git a/core/api/services/auth/service_test.go b/core/api/services/auth/service_test.go index a78f759e2..4df3bd482 100644 --- a/core/api/services/auth/service_test.go +++ b/core/api/services/auth/service_test.go @@ -47,13 +47,27 @@ func TestAuthService_GenerateNewChallenge(t *testing.T) { }).Once() // when - challengeId, err := fx.GenerateNewChallenge(ctx, mockedAppName) + challengeId, err := fx.NewChallenge(ctx, mockedAppName) // then require.NoError(t, err) require.Equal(t, mockedChallengeId, challengeId) }) + t.Run("bad request - missing app name", func(t *testing.T) { + // given + ctx := context.Background() + fx := newFixture(t) + + // when + challengeId, err := fx.NewChallenge(ctx, "") + + // then + require.Error(t, err) + require.Equal(t, ErrMissingAppName, err) + require.Empty(t, challengeId) + }) + t.Run("failed challenge creation", func(t *testing.T) { // given ctx := context.Background() @@ -65,7 +79,7 @@ func TestAuthService_GenerateNewChallenge(t *testing.T) { }).Once() // when - challengeId, err := fx.GenerateNewChallenge(ctx, mockedAppName) + challengeId, err := fx.NewChallenge(ctx, mockedAppName) // then require.Error(t, err) @@ -91,7 +105,7 @@ func TestAuthService_SolveChallengeForToken(t *testing.T) { }).Once() // when - sessionToken, appKey, err := fx.SolveChallengeForToken(ctx, mockedChallengeId, mockedCode) + sessionToken, appKey, err := fx.SolveChallenge(ctx, mockedChallengeId, mockedCode) // then require.NoError(t, err) @@ -100,13 +114,13 @@ func TestAuthService_SolveChallengeForToken(t *testing.T) { }) - t.Run("bad request", func(t *testing.T) { + t.Run("bad request - missing challenge id or code", func(t *testing.T) { // given ctx := context.Background() fx := newFixture(t) // when - sessionToken, appKey, err := fx.SolveChallengeForToken(ctx, "", "") + sessionToken, appKey, err := fx.SolveChallenge(ctx, "", "") // then require.Error(t, err) @@ -129,7 +143,7 @@ func TestAuthService_SolveChallengeForToken(t *testing.T) { }).Once() // when - sessionToken, appKey, err := fx.SolveChallengeForToken(ctx, mockedChallengeId, mockedCode) + sessionToken, appKey, err := fx.SolveChallenge(ctx, mockedChallengeId, mockedCode) // then require.Error(t, err) From c2eb765e5dbf9be616d9cce2280fa70c3b20e1c7 Mon Sep 17 00:00:00 2001 From: Jannis Metrikat <120120832+jmetrikat@users.noreply.github.com> Date: Fri, 17 Jan 2025 14:11:35 +0100 Subject: [PATCH 115/195] GO-4459: Refactor api service --- core/api.go | 66 +++++++++++++++++---------------------------- core/api/service.go | 4 +-- 2 files changed, 27 insertions(+), 43 deletions(-) diff --git a/core/api.go b/core/api.go index 3a1f21577..2d06e8d0e 100644 --- a/core/api.go +++ b/core/api.go @@ -2,56 +2,40 @@ package core import ( "context" - "fmt" "github.com/anyproto/anytype-heart/core/api" "github.com/anyproto/anytype-heart/pb" ) -func (mw *Middleware) ApiStartServer(cctx context.Context, req *pb.RpcApiStartServerRequest) *pb.RpcApiStartServerResponse { - response := func(err error) *pb.RpcApiStartServerResponse { - m := &pb.RpcApiStartServerResponse{ - Error: &pb.RpcApiStartServerResponseError{ - Code: pb.RpcApiStartServerResponseError_NULL, - }, - } - if err != nil { - m.Error.Code = mapErrorCode(err, - errToCode(api.ErrPortAlreadyUsed, pb.RpcApiStartServerResponseError_PORT_ALREADY_USED), - errToCode(api.ErrServerAlreadyStarted, pb.RpcApiStartServerResponseError_SERVER_ALREADY_STARTED)) - m.Error.Description = getErrorDescription(err) - } - return m - } - - apiService := mw.applicationService.GetApp().Component(api.CName).(api.Api) - if apiService == nil { - return response(fmt.Errorf("node not started")) - } +func (mw *Middleware) ApiStartServer(ctx context.Context, req *pb.RpcApiStartServerRequest) *pb.RpcApiStartServerResponse { + apiService := mustService[api.Service](mw) err := apiService.Start() - return response(err) + code := mapErrorCode(err, + errToCode(api.ErrPortAlreadyUsed, pb.RpcApiStartServerResponseError_PORT_ALREADY_USED), + errToCode(api.ErrServerAlreadyStarted, pb.RpcApiStartServerResponseError_SERVER_ALREADY_STARTED)) + + r := &pb.RpcApiStartServerResponse{ + Error: &pb.RpcApiStartServerResponseError{ + Code: code, + Description: getErrorDescription(err), + }, + } + return r } -func (mw *Middleware) ApiStopServer(cctx context.Context, req *pb.RpcApiStopServerRequest) *pb.RpcApiStopServerResponse { - response := func(err error) *pb.RpcApiStopServerResponse { - m := &pb.RpcApiStopServerResponse{ - Error: &pb.RpcApiStopServerResponseError{ - Code: pb.RpcApiStopServerResponseError_NULL, - }, - } - if err != nil { - m.Error.Code = mapErrorCode(err, errToCode(api.ErrServerNotStarted, pb.RpcApiStopServerResponseError_SERVER_NOT_STARTED)) - m.Error.Description = getErrorDescription(err) - } - return m - } - - apiService := mw.applicationService.GetApp().Component(api.CName).(api.Api) - if apiService == nil { - return response(fmt.Errorf("node not started")) - } +func (mw *Middleware) ApiStopServer(ctx context.Context, req *pb.RpcApiStopServerRequest) *pb.RpcApiStopServerResponse { + apiService := mustService[api.Service](mw) err := apiService.Stop() - return response(err) + code := mapErrorCode(nil, + errToCode(api.ErrServerNotStarted, pb.RpcApiStopServerResponseError_SERVER_NOT_STARTED)) + + r := &pb.RpcApiStopServerResponse{ + Error: &pb.RpcApiStopServerResponseError{ + Code: code, + Description: getErrorDescription(err), + }, + } + return r } diff --git a/core/api/service.go b/core/api/service.go index a14f4861a..0b9cd6ea7 100644 --- a/core/api/service.go +++ b/core/api/service.go @@ -27,7 +27,7 @@ var ( ErrServerNotStarted = fmt.Errorf("server not started") ) -type Api interface { +type Service interface { Start() error Stop() error app.ComponentRunnable @@ -39,7 +39,7 @@ type apiService struct { mw service.ClientCommandsServer } -func New() Api { +func New() Service { return &apiService{ mw: mwSrv, } From c4574258617904cc179142060e6c21347f94647e Mon Sep 17 00:00:00 2001 From: Jannis Metrikat <120120832+jmetrikat@users.noreply.github.com> Date: Fri, 17 Jan 2025 19:01:58 +0100 Subject: [PATCH 116/195] GO-4459: Fix mock interface after merge --- .mockery.yaml | 3 + .../mock_service/mock_ClientCommandsServer.go | 245 ++++++++++++++++++ 2 files changed, 248 insertions(+) diff --git a/.mockery.yaml b/.mockery.yaml index 9923593ed..883c2078c 100644 --- a/.mockery.yaml +++ b/.mockery.yaml @@ -231,3 +231,6 @@ packages: github.com/anyproto/anytype-heart/core/identity: interfaces: Service: + github.com/anyproto/anytype-heart/pb/service: + interfaces: + ClientCommandsServer: diff --git a/pb/service/mock_service/mock_ClientCommandsServer.go b/pb/service/mock_service/mock_ClientCommandsServer.go index 1504906a7..e36161dac 100644 --- a/pb/service/mock_service/mock_ClientCommandsServer.go +++ b/pb/service/mock_service/mock_ClientCommandsServer.go @@ -11426,6 +11426,251 @@ func (_c *MockClientCommandsServer_ProcessUnsubscribe_Call) RunAndReturn(run fun return _c } +// PublishingCreate provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) PublishingCreate(_a0 context.Context, _a1 *pb.RpcPublishingCreateRequest) *pb.RpcPublishingCreateResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for PublishingCreate") + } + + var r0 *pb.RpcPublishingCreateResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcPublishingCreateRequest) *pb.RpcPublishingCreateResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcPublishingCreateResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_PublishingCreate_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'PublishingCreate' +type MockClientCommandsServer_PublishingCreate_Call struct { + *mock.Call +} + +// PublishingCreate is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcPublishingCreateRequest +func (_e *MockClientCommandsServer_Expecter) PublishingCreate(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_PublishingCreate_Call { + return &MockClientCommandsServer_PublishingCreate_Call{Call: _e.mock.On("PublishingCreate", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_PublishingCreate_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcPublishingCreateRequest)) *MockClientCommandsServer_PublishingCreate_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcPublishingCreateRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_PublishingCreate_Call) Return(_a0 *pb.RpcPublishingCreateResponse) *MockClientCommandsServer_PublishingCreate_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_PublishingCreate_Call) RunAndReturn(run func(context.Context, *pb.RpcPublishingCreateRequest) *pb.RpcPublishingCreateResponse) *MockClientCommandsServer_PublishingCreate_Call { + _c.Call.Return(run) + return _c +} + +// PublishingGetStatus provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) PublishingGetStatus(_a0 context.Context, _a1 *pb.RpcPublishingGetStatusRequest) *pb.RpcPublishingGetStatusResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for PublishingGetStatus") + } + + var r0 *pb.RpcPublishingGetStatusResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcPublishingGetStatusRequest) *pb.RpcPublishingGetStatusResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcPublishingGetStatusResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_PublishingGetStatus_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'PublishingGetStatus' +type MockClientCommandsServer_PublishingGetStatus_Call struct { + *mock.Call +} + +// PublishingGetStatus is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcPublishingGetStatusRequest +func (_e *MockClientCommandsServer_Expecter) PublishingGetStatus(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_PublishingGetStatus_Call { + return &MockClientCommandsServer_PublishingGetStatus_Call{Call: _e.mock.On("PublishingGetStatus", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_PublishingGetStatus_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcPublishingGetStatusRequest)) *MockClientCommandsServer_PublishingGetStatus_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcPublishingGetStatusRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_PublishingGetStatus_Call) Return(_a0 *pb.RpcPublishingGetStatusResponse) *MockClientCommandsServer_PublishingGetStatus_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_PublishingGetStatus_Call) RunAndReturn(run func(context.Context, *pb.RpcPublishingGetStatusRequest) *pb.RpcPublishingGetStatusResponse) *MockClientCommandsServer_PublishingGetStatus_Call { + _c.Call.Return(run) + return _c +} + +// PublishingList provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) PublishingList(_a0 context.Context, _a1 *pb.RpcPublishingListRequest) *pb.RpcPublishingListResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for PublishingList") + } + + var r0 *pb.RpcPublishingListResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcPublishingListRequest) *pb.RpcPublishingListResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcPublishingListResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_PublishingList_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'PublishingList' +type MockClientCommandsServer_PublishingList_Call struct { + *mock.Call +} + +// PublishingList is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcPublishingListRequest +func (_e *MockClientCommandsServer_Expecter) PublishingList(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_PublishingList_Call { + return &MockClientCommandsServer_PublishingList_Call{Call: _e.mock.On("PublishingList", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_PublishingList_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcPublishingListRequest)) *MockClientCommandsServer_PublishingList_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcPublishingListRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_PublishingList_Call) Return(_a0 *pb.RpcPublishingListResponse) *MockClientCommandsServer_PublishingList_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_PublishingList_Call) RunAndReturn(run func(context.Context, *pb.RpcPublishingListRequest) *pb.RpcPublishingListResponse) *MockClientCommandsServer_PublishingList_Call { + _c.Call.Return(run) + return _c +} + +// PublishingRemove provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) PublishingRemove(_a0 context.Context, _a1 *pb.RpcPublishingRemoveRequest) *pb.RpcPublishingRemoveResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for PublishingRemove") + } + + var r0 *pb.RpcPublishingRemoveResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcPublishingRemoveRequest) *pb.RpcPublishingRemoveResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcPublishingRemoveResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_PublishingRemove_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'PublishingRemove' +type MockClientCommandsServer_PublishingRemove_Call struct { + *mock.Call +} + +// PublishingRemove is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcPublishingRemoveRequest +func (_e *MockClientCommandsServer_Expecter) PublishingRemove(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_PublishingRemove_Call { + return &MockClientCommandsServer_PublishingRemove_Call{Call: _e.mock.On("PublishingRemove", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_PublishingRemove_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcPublishingRemoveRequest)) *MockClientCommandsServer_PublishingRemove_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcPublishingRemoveRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_PublishingRemove_Call) Return(_a0 *pb.RpcPublishingRemoveResponse) *MockClientCommandsServer_PublishingRemove_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_PublishingRemove_Call) RunAndReturn(run func(context.Context, *pb.RpcPublishingRemoveRequest) *pb.RpcPublishingRemoveResponse) *MockClientCommandsServer_PublishingRemove_Call { + _c.Call.Return(run) + return _c +} + +// PublishingResolveUri provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) PublishingResolveUri(_a0 context.Context, _a1 *pb.RpcPublishingResolveUriRequest) *pb.RpcPublishingResolveUriResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for PublishingResolveUri") + } + + var r0 *pb.RpcPublishingResolveUriResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcPublishingResolveUriRequest) *pb.RpcPublishingResolveUriResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcPublishingResolveUriResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_PublishingResolveUri_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'PublishingResolveUri' +type MockClientCommandsServer_PublishingResolveUri_Call struct { + *mock.Call +} + +// PublishingResolveUri is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcPublishingResolveUriRequest +func (_e *MockClientCommandsServer_Expecter) PublishingResolveUri(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_PublishingResolveUri_Call { + return &MockClientCommandsServer_PublishingResolveUri_Call{Call: _e.mock.On("PublishingResolveUri", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_PublishingResolveUri_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcPublishingResolveUriRequest)) *MockClientCommandsServer_PublishingResolveUri_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcPublishingResolveUriRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_PublishingResolveUri_Call) Return(_a0 *pb.RpcPublishingResolveUriResponse) *MockClientCommandsServer_PublishingResolveUri_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_PublishingResolveUri_Call) RunAndReturn(run func(context.Context, *pb.RpcPublishingResolveUriRequest) *pb.RpcPublishingResolveUriResponse) *MockClientCommandsServer_PublishingResolveUri_Call { + _c.Call.Return(run) + return _c +} + // RelationListRemoveOption provides a mock function with given fields: _a0, _a1 func (_m *MockClientCommandsServer) RelationListRemoveOption(_a0 context.Context, _a1 *pb.RpcRelationListRemoveOptionRequest) *pb.RpcRelationListRemoveOptionResponse { ret := _m.Called(_a0, _a1) From 0a576d85e1a9b5f005583e9d12258f896103ad39 Mon Sep 17 00:00:00 2001 From: Jannis Metrikat <120120832+jmetrikat@users.noreply.github.com> Date: Fri, 17 Jan 2025 19:45:07 +0100 Subject: [PATCH 117/195] GO-4459: Fix type_id typo --- core/api/server/router.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/api/server/router.go b/core/api/server/router.go index 67e1e0592..8927be027 100644 --- a/core/api/server/router.go +++ b/core/api/server/router.go @@ -54,7 +54,7 @@ func (s *Server) NewRouter(a *app.App) *gin.Engine { v1.GET("/spaces/:space_id/objects/:object_id", object.GetObjectHandler(s.objectService)) v1.DELETE("/spaces/:space_id/objects/:object_id", s.rateLimit(maxWriteRequestsPerSecond), object.DeleteObjectHandler(s.objectService)) v1.GET("/spaces/:space_id/object_types", object.GetTypesHandler(s.objectService)) - v1.GET("/spaces/:space_id/object_types/:typeId/templates", object.GetTemplatesHandler(s.objectService)) + v1.GET("/spaces/:space_id/object_types/:type_id/templates", object.GetTemplatesHandler(s.objectService)) v1.POST("/spaces/:space_id/objects", s.rateLimit(maxWriteRequestsPerSecond), object.CreateObjectHandler(s.objectService)) // Search From 776155122d0eb732b44740451cb8e227e9bf4944 Mon Sep 17 00:00:00 2001 From: Roman Khafizianov Date: Fri, 17 Jan 2025 19:58:37 +0100 Subject: [PATCH 118/195] GO-4642 add scope to link challenge --- core/account.go | 2 +- core/application/sessions.go | 21 +- core/auth.go | 26 +- core/grpc_events.go | 13 +- core/session/challenge.go | 26 +- core/session/service.go | 43 +- core/wallet/applink.go | 1 + docs/proto.md | 44 + pb/commands.pb.go | 2505 +++++++++++++------------- pb/events.pb.go | 1081 +++++++---- pb/protos/commands.proto | 1 + pb/protos/events.proto | 6 + pkg/lib/pb/model/models.pb.go | 1272 +++++++------ pkg/lib/pb/model/protos/models.proto | 8 + 14 files changed, 2831 insertions(+), 2218 deletions(-) diff --git a/core/account.go b/core/account.go index 0dd514502..fa243b00e 100644 --- a/core/account.go +++ b/core/account.go @@ -201,7 +201,7 @@ func (mw *Middleware) AccountEnableLocalNetworkSync(_ context.Context, req *pb.R func (mw *Middleware) AccountLocalLinkNewChallenge(ctx context.Context, request *pb.RpcAccountLocalLinkNewChallengeRequest) *pb.RpcAccountLocalLinkNewChallengeResponse { info := getClientInfo(ctx) - challengeId, err := mw.applicationService.LinkLocalStartNewChallenge(&info) + challengeId, err := mw.applicationService.LinkLocalStartNewChallenge(request.Scope, &info) code := mapErrorCode(err, errToCode(session.ErrTooManyChallengeRequests, pb.RpcAccountLocalLinkNewChallengeResponseError_TOO_MANY_REQUESTS), errToCode(application.ErrApplicationIsNotRunning, pb.RpcAccountLocalLinkNewChallengeResponseError_ACCOUNT_IS_NOT_RUNNING), diff --git a/core/application/sessions.go b/core/application/sessions.go index 961d2d8e1..51c2c8d9b 100644 --- a/core/application/sessions.go +++ b/core/application/sessions.go @@ -9,6 +9,7 @@ import ( "github.com/anyproto/anytype-heart/core/session" walletComp "github.com/anyproto/anytype-heart/core/wallet" "github.com/anyproto/anytype-heart/pb" + "github.com/anyproto/anytype-heart/pkg/lib/pb/model" ) func (s *Service) CreateSession(req *pb.RpcWalletCreateSessionRequest) (token string, accountId string, err error) { @@ -31,7 +32,8 @@ func (s *Service) CreateSession(req *pb.RpcWalletCreateSessionRequest) (token st return "", "", err } log.Infof("appLink auth %s", appLink.AppName) - token, err := s.sessions.StartSession(s.sessionSigningKey) + + token, err := s.sessions.StartSession(s.sessionSigningKey, model.AccountAuthLocalApiScope(appLink.Scope)) if err != nil { return "", "", err } @@ -46,7 +48,7 @@ func (s *Service) CreateSession(req *pb.RpcWalletCreateSessionRequest) (token st if s.mnemonic != mnemonic { return "", "", errors.Join(ErrBadInput, fmt.Errorf("incorrect mnemonic")) } - token, err = s.sessions.StartSession(s.sessionSigningKey) + token, err = s.sessions.StartSession(s.sessionSigningKey, model.AccountAuth_Full) if err != nil { return "", "", err } @@ -61,16 +63,16 @@ func (s *Service) CloseSession(req *pb.RpcWalletCloseSessionRequest) error { return s.sessions.CloseSession(req.Token) } -func (s *Service) ValidateSessionToken(token string) error { +func (s *Service) ValidateSessionToken(token string) (model.AccountAuthLocalApiScope, error) { return s.sessions.ValidateToken(s.sessionSigningKey, token) } -func (s *Service) LinkLocalStartNewChallenge(clientInfo *pb.EventAccountLinkChallengeClientInfo) (id string, err error) { +func (s *Service) LinkLocalStartNewChallenge(scope model.AccountAuthLocalApiScope, clientInfo *pb.EventAccountLinkChallengeClientInfo) (id string, err error) { if s.app == nil { return "", ErrApplicationIsNotRunning } - id, value, err := s.sessions.StartNewChallenge(clientInfo) + id, value, err := s.sessions.StartNewChallenge(scope, clientInfo) if err != nil { return "", err } @@ -78,6 +80,7 @@ func (s *Service) LinkLocalStartNewChallenge(clientInfo *pb.EventAccountLinkChal AccountLinkChallenge: &pb.EventAccountLinkChallenge{ Challenge: value, ClientInfo: clientInfo, + Scope: scope, }, })) return id, nil @@ -87,7 +90,7 @@ func (s *Service) LinkLocalSolveChallenge(req *pb.RpcAccountLocalLinkSolveChalle if s.app == nil { return "", "", ErrApplicationIsNotRunning } - clientInfo, token, err := s.sessions.SolveChallenge(req.ChallengeId, req.Answer, s.sessionSigningKey) + clientInfo, token, scope, err := s.sessions.SolveChallenge(req.ChallengeId, req.Answer, s.sessionSigningKey) if err != nil { return "", "", err } @@ -96,7 +99,13 @@ func (s *Service) LinkLocalSolveChallenge(req *pb.RpcAccountLocalLinkSolveChalle AppName: clientInfo.ProcessName, AppPath: clientInfo.ProcessPath, CreatedAt: time.Now().Unix(), + Scope: int(scope), }) + s.eventSender.Broadcast(event.NewEventSingleMessage("", &pb.EventMessageValueOfAccountLinkChallengeHide{ + AccountLinkChallengeHide: &pb.EventAccountLinkChallengeHide{ + Challenge: req.Answer, + }, + })) return } diff --git a/core/auth.go b/core/auth.go index 6d3c0cee4..2dddf9580 100644 --- a/core/auth.go +++ b/core/auth.go @@ -6,6 +6,7 @@ package core import ( "context" "fmt" + "strings" "github.com/gogo/protobuf/proto" "github.com/gogo/protobuf/protoc-gen-gogo/descriptor" @@ -15,8 +16,20 @@ import ( "google.golang.org/grpc/metadata" "github.com/anyproto/anytype-heart/pb" + "github.com/anyproto/anytype-heart/pkg/lib/pb/model" ) +var limitedScopeMethods = map[string]struct{}{ + "ObjectSearch": {}, + "ObjectShow": {}, + "ObjectCreate": {}, + "ObjectCreateFromURL": {}, + "BlockPreview": {}, + "BlockPaste": {}, + "BroadcastPayloadEvent": {}, + "AccountSelect": {}, // need to replace with other method to get info +} + func (mw *Middleware) Authorize(ctx context.Context, req interface{}, info *grpc.UnaryServerInfo, handler grpc.UnaryHandler) (resp interface{}, err error) { _, d := descriptor.ForMessage(req.(descriptor.Message)) noAuth := proto.GetBoolExtension(d.GetOptions(), pb.E_NoAuth, false) @@ -35,11 +48,20 @@ func (mw *Middleware) Authorize(ctx context.Context, req interface{}, info *grpc } tok := v[0] - err = mw.applicationService.ValidateSessionToken(tok) + var scope model.AccountAuthLocalApiScope + scope, err = mw.applicationService.ValidateSessionToken(tok) if err != nil { return nil, status.Error(codes.Unauthenticated, err.Error()) } - + switch scope { + case model.AccountAuth_Full: + case model.AccountAuth_Limited: + if _, ok := limitedScopeMethods[strings.TrimPrefix(info.FullMethod, "/anytype.ClientCommands/")]; !ok { + return nil, status.Error(codes.PermissionDenied, "method not allowed for limited scope") + } + default: + return nil, status.Error(codes.PermissionDenied, fmt.Sprintf("method not allowed for %s scope", scope.String())) + } resp, err = handler(ctx, req) return } diff --git a/core/grpc_events.go b/core/grpc_events.go index 868a3ee1c..8e1150916 100644 --- a/core/grpc_events.go +++ b/core/grpc_events.go @@ -14,14 +14,25 @@ import ( "github.com/anyproto/anytype-heart/core/session" "github.com/anyproto/anytype-heart/pb" lib "github.com/anyproto/anytype-heart/pb/service" + "github.com/anyproto/anytype-heart/pkg/lib/pb/model" ) func (mw *Middleware) ListenSessionEvents(req *pb.StreamRequest, server lib.ClientCommands_ListenSessionEventsServer) { - if err := mw.applicationService.ValidateSessionToken(req.Token); err != nil { + var ( + scope model.AccountAuthLocalApiScope + err error + ) + if scope, err = mw.applicationService.ValidateSessionToken(req.Token); err != nil { log.Errorf("ListenSessionEvents: %s", err) return } + switch scope { + case model.AccountAuth_Full: + default: + log.Errorf("method not allowed for scope %s", scope.String()) + return + } var srv event.SessionServer if sender, ok := mw.applicationService.GetEventSender().(*event.GrpcSender); ok { srv = sender.SetSessionServer(req.Token, server) diff --git a/core/session/challenge.go b/core/session/challenge.go index e236f99cd..4410a5782 100644 --- a/core/session/challenge.go +++ b/core/session/challenge.go @@ -9,6 +9,7 @@ import ( "go.uber.org/atomic" "github.com/anyproto/anytype-heart/pb" + "github.com/anyproto/anytype-heart/pkg/lib/pb/model" ) const ( @@ -21,15 +22,22 @@ var ( ErrChallengeTriesExceeded = fmt.Errorf("challenge tries exceeded") ErrChallengeIdNotFound = fmt.Errorf("challenge id not found") ErrChallengeSolutionWrong = fmt.Errorf("challenge solution is wrong") + ErrInvalidScope = fmt.Errorf("invalid scope") ErrTooManyChallengeRequests = fmt.Errorf("too many challenge requests per session") currentChallengesRequests = atomic.NewInt32(0) ) -func (s *service) StartNewChallenge(info *pb.EventAccountLinkChallengeClientInfo) (challengeId string, challengeValue string, err error) { +func (s *service) StartNewChallenge(scope model.AccountAuthLocalApiScope, info *pb.EventAccountLinkChallengeClientInfo) (challengeId string, challengeValue string, err error) { if currentChallengesRequests.Load() >= maxChallengesRequests { // todo: add limits per process? return "", "", ErrTooManyChallengeRequests } + switch scope { + case model.AccountAuth_Limited, model.AccountAuth_JsonAPI: + // full scope is not allowed via challenge + default: + return "", "", ErrInvalidScope + } // generate random challenge id id := bson.NewObjectId().Hex() s.lock.Lock() @@ -41,45 +49,47 @@ func (s *service) StartNewChallenge(info *pb.EventAccountLinkChallengeClientInfo tries: 0, value: value, clientInfo: info, + scope: scope, } currentChallengesRequests.Inc() return id, value, nil } -func (s *service) SolveChallenge(challengeId string, challengeSolution string, signingKey []byte) (clientInfo *pb.EventAccountLinkChallengeClientInfo, token string, err error) { +func (s *service) SolveChallenge(challengeId string, challengeSolution string, signingKey []byte) (clientInfo *pb.EventAccountLinkChallengeClientInfo, token string, scope model.AccountAuthLocalApiScope, err error) { s.lock.Lock() challenge, ok := s.challenges[challengeId] if !ok { s.lock.Unlock() - return nil, "", ErrChallengeIdNotFound + return nil, "", 0, ErrChallengeIdNotFound } if challenge.tries >= challengeMaxTries { s.lock.Unlock() - return clientInfo, "", ErrChallengeTriesExceeded + return clientInfo, "", 0, ErrChallengeTriesExceeded } if challenge.value != challengeSolution { s.lock.Unlock() challenge.tries++ - return clientInfo, "", ErrChallengeSolutionWrong + return clientInfo, "", 0, ErrChallengeSolutionWrong } delete(s.challenges, challengeId) s.lock.Unlock() - sessionToken, err := s.StartSession(signingKey) + sessionToken, err := s.StartSession(signingKey, scope) if err != nil { - return nil, "", err + return nil, "", 0, err } - return challenge.clientInfo, sessionToken, nil + return challenge.clientInfo, sessionToken, challenge.scope, nil } type challenge struct { tries int value string clientInfo *pb.EventAccountLinkChallengeClientInfo + scope model.AccountAuthLocalApiScope } diff --git a/core/session/service.go b/core/session/service.go index 89c4e41e4..83c6bc954 100644 --- a/core/session/service.go +++ b/core/session/service.go @@ -8,21 +8,23 @@ import ( "github.com/golang-jwt/jwt" "github.com/anyproto/anytype-heart/pb" + "github.com/anyproto/anytype-heart/pkg/lib/pb/model" ) const CName = "session" type Service interface { - StartSession(privKey []byte) (string, error) - ValidateToken(privKey []byte, token string) error - StartNewChallenge(info *pb.EventAccountLinkChallengeClientInfo) (id string, value string, err error) - SolveChallenge(challengeId string, challengeSolution string, signingKey []byte) (clientInfo *pb.EventAccountLinkChallengeClientInfo, token string, err error) + StartSession(privKey []byte, scope model.AccountAuthLocalApiScope) (string, error) + ValidateToken(privKey []byte, token string) (model.AccountAuthLocalApiScope, error) + StartNewChallenge(scope model.AccountAuthLocalApiScope, info *pb.EventAccountLinkChallengeClientInfo) (id string, value string, err error) + SolveChallenge(challengeId string, challengeSolution string, signingKey []byte) (clientInfo *pb.EventAccountLinkChallengeClientInfo, token string, scope model.AccountAuthLocalApiScope, err error) CloseSession(token string) error } type session struct { token string + scope model.AccountAuthLocalApiScope } type service struct { @@ -31,6 +33,10 @@ type service struct { challenges map[string]challenge } +func (s session) Scope() model.AccountAuthLocalApiScope { + return s.scope +} + func New() Service { return &service{ lock: &sync.RWMutex{}, @@ -43,7 +49,11 @@ func (s *service) Name() (name string) { return CName } -func (s *service) StartSession(privKey []byte) (string, error) { +func (s *service) StartSession(privKey []byte, scope model.AccountAuthLocalApiScope) (string, error) { + if _, scopeExists := model.AccountAuthLocalApiScope_name[int32(scope)]; !scopeExists { + return "", ErrInvalidScope + } + token, err := generateToken(privKey) if err != nil { return "", fmt.Errorf("generate token: %w", err) @@ -56,19 +66,32 @@ func (s *service) StartSession(privKey []byte) (string, error) { } s.sessions[token] = session{ token: token, + scope: scope, } return token, nil } -func (s *service) ValidateToken(privKey []byte, token string) error { +type scopeGetter interface { + Scope() model.AccountAuthLocalApiScope +} + +func (s *service) ValidateToken(privKey []byte, token string) (model.AccountAuthLocalApiScope, error) { s.lock.RLock() defer s.lock.RUnlock() - - if _, ok := s.sessions[token]; !ok { - return fmt.Errorf("session is not registered") + var ( + ok bool + scope scopeGetter + ) + if scope, ok = s.sessions[token]; !ok { + return 0, fmt.Errorf("session is not registered") } - return validateToken(privKey, token) + err := validateToken(privKey, token) + if err != nil { + return 0, err + } + + return scope.Scope(), nil } func (s *service) CloseSession(token string) error { diff --git a/core/wallet/applink.go b/core/wallet/applink.go index 5ae1a8d0d..2c51e8c27 100644 --- a/core/wallet/applink.go +++ b/core/wallet/applink.go @@ -27,6 +27,7 @@ type AppLinkPayload struct { AppPath string `json:"app_path"` // for now, it is not verified CreatedAt int64 `json:"created_at"` // unix timestamp ExpireAt int64 `json:"expire_at"` // unix timestamp + Scope int `json:"scope"` } type appLinkFileEncrypted struct { diff --git a/docs/proto.md b/docs/proto.md index 567be75e8..a99d35725 100644 --- a/docs/proto.md +++ b/docs/proto.md @@ -1595,6 +1595,7 @@ - [Event.Account.Details](#anytype-Event-Account-Details) - [Event.Account.LinkChallenge](#anytype-Event-Account-LinkChallenge) - [Event.Account.LinkChallenge.ClientInfo](#anytype-Event-Account-LinkChallenge-ClientInfo) + - [Event.Account.LinkChallengeHide](#anytype-Event-Account-LinkChallengeHide) - [Event.Account.Show](#anytype-Event-Account-Show) - [Event.Account.Update](#anytype-Event-Account-Update) - [Event.Block](#anytype-Event-Block) @@ -1821,6 +1822,7 @@ - [pkg/lib/pb/model/protos/models.proto](#pkg_lib_pb_model_protos_models-proto) - [Account](#anytype-model-Account) + - [Account.Auth](#anytype-model-Account-Auth) - [Account.Config](#anytype-model-Account-Config) - [Account.Info](#anytype-model-Account-Info) - [Account.Status](#anytype-model-Account-Status) @@ -1919,6 +1921,7 @@ - [SmartBlockSnapshotBase](#anytype-model-SmartBlockSnapshotBase) - [SpaceObjectHeader](#anytype-model-SpaceObjectHeader) + - [Account.Auth.LocalApiScope](#anytype-model-Account-Auth-LocalApiScope) - [Account.StatusType](#anytype-model-Account-StatusType) - [Block.Align](#anytype-model-Block-Align) - [Block.Content.Bookmark.State](#anytype-model-Block-Content-Bookmark-State) @@ -3311,6 +3314,7 @@ TODO: Remove this request if we do not need it, GO-1926 | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | | appName | [string](#string) | | just for info, not secure to rely on | +| scope | [model.Account.Auth.LocalApiScope](#anytype-model-Account-Auth-LocalApiScope) | | | @@ -25100,6 +25104,7 @@ Event – type of message, that could be sent from a middleware to the correspon | ----- | ---- | ----- | ----------- | | challenge | [string](#string) | | | | clientInfo | [Event.Account.LinkChallenge.ClientInfo](#anytype-Event-Account-LinkChallenge-ClientInfo) | | | +| scope | [model.Account.Auth.LocalApiScope](#anytype-model-Account-Auth-LocalApiScope) | | | @@ -25123,6 +25128,21 @@ Event – type of message, that could be sent from a middleware to the correspon + + +### Event.Account.LinkChallengeHide + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| challenge | [string](#string) | | verify code before hiding to protect from MITM attacks | + + + + + + ### Event.Account.Show @@ -27405,6 +27425,7 @@ Precondition: user A opened a block | accountConfigUpdate | [Event.Account.Config.Update](#anytype-Event-Account-Config-Update) | | | | accountUpdate | [Event.Account.Update](#anytype-Event-Account-Update) | | | | accountLinkChallenge | [Event.Account.LinkChallenge](#anytype-Event-Account-LinkChallenge) | | | +| accountLinkChallengeHide | [Event.Account.LinkChallengeHide](#anytype-Event-Account-LinkChallengeHide) | | | | objectDetailsSet | [Event.Object.Details.Set](#anytype-Event-Object-Details-Set) | | | | objectDetailsAmend | [Event.Object.Details.Amend](#anytype-Event-Object-Details-Amend) | | | | objectDetailsUnset | [Event.Object.Details.Unset](#anytype-Event-Object-Details-Unset) | | | @@ -28644,6 +28665,16 @@ Contains basic information about a user account + + +### Account.Auth + + + + + + + ### Account.Config @@ -30359,6 +30390,19 @@ stored | + + +### Account.Auth.LocalApiScope + + +| Name | Number | Description | +| ---- | ------ | ----------- | +| Limited | 0 | Used in WebClipper; AccountSelect(to be deprecated), ObjectSearch, ObjectShow, ObjectCreate, ObjectCreateFromURL, BlockPreview, BlockPaste, BroadcastPayloadEvent | +| JsonAPI | 1 | JSON API only, no direct grpc api calls allowed | +| Full | 2 | Full access, not available via LocalLink | + + + ### Account.StatusType diff --git a/pb/commands.pb.go b/pb/commands.pb.go index 2fccfc9ff..b920f26be 100644 --- a/pb/commands.pb.go +++ b/pb/commands.pb.go @@ -16415,7 +16415,8 @@ func (m *RpcAccountLocalLinkNewChallenge) XXX_DiscardUnknown() { var xxx_messageInfo_RpcAccountLocalLinkNewChallenge proto.InternalMessageInfo type RpcAccountLocalLinkNewChallengeRequest struct { - AppName string `protobuf:"bytes,1,opt,name=appName,proto3" json:"appName,omitempty"` + AppName string `protobuf:"bytes,1,opt,name=appName,proto3" json:"appName,omitempty"` + Scope model.AccountAuthLocalApiScope `protobuf:"varint,2,opt,name=scope,proto3,enum=anytype.model.AccountAuthLocalApiScope" json:"scope,omitempty"` } func (m *RpcAccountLocalLinkNewChallengeRequest) Reset() { @@ -16460,6 +16461,13 @@ func (m *RpcAccountLocalLinkNewChallengeRequest) GetAppName() string { return "" } +func (m *RpcAccountLocalLinkNewChallengeRequest) GetScope() model.AccountAuthLocalApiScope { + if m != nil { + return m.Scope + } + return model.AccountAuth_Limited +} + type RpcAccountLocalLinkNewChallengeResponse struct { Error *RpcAccountLocalLinkNewChallengeResponseError `protobuf:"bytes,1,opt,name=error,proto3" json:"error,omitempty"` ChallengeId string `protobuf:"bytes,2,opt,name=challengeId,proto3" json:"challengeId,omitempty"` @@ -72533,1239 +72541,1241 @@ func init() { func init() { proto.RegisterFile("pb/protos/commands.proto", fileDescriptor_8261c968b2e6f45c) } var fileDescriptor_8261c968b2e6f45c = []byte{ - // 19712 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0xfd, 0x7d, 0x9c, 0x23, 0x47, - 0x75, 0x2f, 0x8c, 0xaf, 0xba, 0x25, 0xcd, 0xcc, 0x99, 0x97, 0xd5, 0xb6, 0x77, 0xd7, 0xeb, 0xb2, - 0x59, 0x3b, 0x6b, 0x63, 0x1c, 0x63, 0xc6, 0xc6, 0x10, 0x82, 0x8d, 0x8d, 0xad, 0xd1, 0xf4, 0xcc, - 0xc8, 0x9e, 0x91, 0x26, 0x2d, 0xcd, 0x2e, 0x4e, 0x6e, 0x7e, 0xba, 0xbd, 0x52, 0xcd, 0x4c, 0x7b, - 0x35, 0xdd, 0x4a, 0xab, 0x67, 0xd6, 0xcb, 0xef, 0x73, 0x9f, 0x1b, 0x42, 0x1c, 0x20, 0x84, 0x4b, - 0x08, 0x21, 0x09, 0xef, 0x60, 0x30, 0x5c, 0x48, 0x80, 0xf0, 0x7e, 0x21, 0x09, 0xef, 0x04, 0x42, - 0x08, 0x21, 0x10, 0x5e, 0x42, 0xc2, 0x13, 0x08, 0x84, 0x90, 0xfb, 0x09, 0x97, 0x27, 0x79, 0x6e, - 0x20, 0x24, 0xf0, 0xe4, 0xf9, 0x74, 0x55, 0xf5, 0x4b, 0x69, 0xd4, 0xad, 0x6a, 0x8d, 0x5a, 0x63, - 0xc2, 0xf3, 0x5f, 0x77, 0x75, 0xf5, 0xa9, 0x53, 0xe7, 0x7b, 0xaa, 0xea, 0x54, 0xd5, 0xa9, 0x53, - 0x70, 0xaa, 0x73, 0xfe, 0xe6, 0x8e, 0x6d, 0x39, 0x56, 0xf7, 0xe6, 0xa6, 0xb5, 0xb3, 0xa3, 0x9b, - 0xad, 0xee, 0x3c, 0x79, 0x57, 0x26, 0x74, 0xf3, 0x92, 0x73, 0xa9, 0x83, 0xd1, 0x75, 0x9d, 0x0b, - 0x5b, 0x37, 0xb7, 0x8d, 0xf3, 0x37, 0x77, 0xce, 0xdf, 0xbc, 0x63, 0xb5, 0x70, 0xdb, 0xfb, 0x81, - 0xbc, 0xb0, 0xec, 0xe8, 0x86, 0xa8, 0x5c, 0x6d, 0xab, 0xa9, 0xb7, 0xbb, 0x8e, 0x65, 0x63, 0x96, - 0xf3, 0x64, 0x50, 0x24, 0xde, 0xc3, 0xa6, 0xe3, 0x51, 0xb8, 0x6a, 0xcb, 0xb2, 0xb6, 0xda, 0x98, - 0x7e, 0x3b, 0xbf, 0xbb, 0x79, 0x73, 0xd7, 0xb1, 0x77, 0x9b, 0x0e, 0xfb, 0x7a, 0x4d, 0xef, 0xd7, - 0x16, 0xee, 0x36, 0x6d, 0xa3, 0xe3, 0x58, 0x36, 0xcd, 0x71, 0xe6, 0x25, 0xbf, 0x36, 0x09, 0xb2, - 0xd6, 0x69, 0xa2, 0xef, 0x4c, 0x80, 0x5c, 0xec, 0x74, 0xd0, 0x47, 0x25, 0x80, 0x65, 0xec, 0x9c, - 0xc5, 0x76, 0xd7, 0xb0, 0x4c, 0x74, 0x14, 0x26, 0x34, 0xfc, 0x73, 0xbb, 0xb8, 0xeb, 0xdc, 0x9e, - 0x7d, 0xf6, 0x37, 0xe4, 0x0c, 0x7a, 0x58, 0x82, 0x49, 0x0d, 0x77, 0x3b, 0x96, 0xd9, 0xc5, 0xca, - 0xdd, 0x90, 0xc3, 0xb6, 0x6d, 0xd9, 0xa7, 0x32, 0xd7, 0x64, 0x6e, 0x98, 0xbe, 0xf5, 0xc6, 0x79, - 0x56, 0xfd, 0x79, 0xad, 0xd3, 0x9c, 0x2f, 0x76, 0x3a, 0xf3, 0x01, 0xa5, 0x79, 0xef, 0xa7, 0x79, - 0xd5, 0xfd, 0x43, 0xa3, 0x3f, 0x2a, 0xa7, 0x60, 0x62, 0x8f, 0x66, 0x38, 0x25, 0x5d, 0x93, 0xb9, - 0x61, 0x4a, 0xf3, 0x5e, 0xdd, 0x2f, 0x2d, 0xec, 0xe8, 0x46, 0xbb, 0x7b, 0x4a, 0xa6, 0x5f, 0xd8, - 0x2b, 0x7a, 0x28, 0x03, 0x39, 0x42, 0x44, 0x29, 0x41, 0xb6, 0x69, 0xb5, 0x30, 0x29, 0x7e, 0xee, - 0xd6, 0x9b, 0xc5, 0x8b, 0x9f, 0x2f, 0x59, 0x2d, 0xac, 0x91, 0x9f, 0x95, 0x6b, 0x60, 0xda, 0x13, - 0x4b, 0xc0, 0x46, 0x38, 0xe9, 0xcc, 0xad, 0x90, 0x75, 0xf3, 0x2b, 0x93, 0x90, 0xad, 0x6c, 0xac, - 0xae, 0x16, 0x8e, 0x28, 0xc7, 0x60, 0x76, 0xa3, 0x72, 0x6f, 0xa5, 0x7a, 0xae, 0xd2, 0x50, 0x35, - 0xad, 0xaa, 0x15, 0x32, 0xca, 0x2c, 0x4c, 0x2d, 0x14, 0x17, 0x1b, 0xe5, 0xca, 0xfa, 0x46, 0xbd, - 0x20, 0xa1, 0x57, 0xc8, 0x30, 0x57, 0xc3, 0xce, 0x22, 0xde, 0x33, 0x9a, 0xb8, 0xe6, 0xe8, 0x0e, - 0x46, 0xcf, 0xcf, 0xf8, 0xc2, 0x54, 0x36, 0xdc, 0x42, 0xfd, 0x4f, 0xac, 0x02, 0x4f, 0xd8, 0x57, - 0x01, 0x9e, 0xc2, 0x3c, 0xfb, 0x7b, 0x3e, 0x94, 0xa6, 0x85, 0xe9, 0x9c, 0x79, 0x1c, 0x4c, 0x87, - 0xbe, 0x29, 0x73, 0x00, 0x0b, 0xc5, 0xd2, 0xbd, 0xcb, 0x5a, 0x75, 0xa3, 0xb2, 0x58, 0x38, 0xe2, - 0xbe, 0x2f, 0x55, 0x35, 0x95, 0xbd, 0x67, 0xd0, 0xf7, 0x32, 0x21, 0x30, 0x17, 0x79, 0x30, 0xe7, - 0x07, 0x33, 0xd3, 0x07, 0x50, 0xf4, 0x3a, 0x1f, 0x9c, 0x65, 0x0e, 0x9c, 0x27, 0x24, 0x23, 0x97, - 0x3e, 0x40, 0x0f, 0x4a, 0x30, 0x59, 0xdb, 0xde, 0x75, 0x5a, 0xd6, 0x45, 0x13, 0x4d, 0xf9, 0xc8, - 0xa0, 0x6f, 0x85, 0x65, 0xf2, 0x54, 0x5e, 0x26, 0x37, 0xec, 0xaf, 0x04, 0xa3, 0x10, 0x21, 0x8d, - 0x57, 0xf9, 0xd2, 0x28, 0x72, 0xd2, 0x78, 0x9c, 0x28, 0xa1, 0xf4, 0xe5, 0xf0, 0x92, 0x27, 0x43, - 0xae, 0xd6, 0xd1, 0x9b, 0x18, 0x7d, 0x52, 0x86, 0x99, 0x55, 0xac, 0xef, 0xe1, 0x62, 0xa7, 0x63, - 0x5b, 0x7b, 0x18, 0x95, 0x02, 0x7d, 0x3d, 0x05, 0x13, 0x5d, 0x37, 0x53, 0xb9, 0x45, 0x6a, 0x30, - 0xa5, 0x79, 0xaf, 0xca, 0x69, 0x00, 0xa3, 0x85, 0x4d, 0xc7, 0x70, 0x0c, 0xdc, 0x3d, 0x25, 0x5d, - 0x23, 0xdf, 0x30, 0xa5, 0x85, 0x52, 0xd0, 0x77, 0x24, 0x51, 0x1d, 0x23, 0x5c, 0xcc, 0x87, 0x39, - 0x88, 0x90, 0xea, 0x6b, 0x24, 0x11, 0x1d, 0x1b, 0x48, 0x2e, 0x99, 0x6c, 0xdf, 0x9c, 0x49, 0x2e, - 0x5c, 0x37, 0x47, 0xa5, 0xda, 0xa8, 0x6d, 0x94, 0x56, 0x1a, 0xb5, 0xf5, 0x62, 0x49, 0x2d, 0x60, - 0xe5, 0x38, 0x14, 0xc8, 0x63, 0xa3, 0x5c, 0x6b, 0x2c, 0xaa, 0xab, 0x6a, 0x5d, 0x5d, 0x2c, 0x6c, - 0x2a, 0x0a, 0xcc, 0x69, 0xea, 0x4f, 0x6d, 0xa8, 0xb5, 0x7a, 0x63, 0xa9, 0x58, 0x5e, 0x55, 0x17, - 0x0b, 0x5b, 0xee, 0xcf, 0xab, 0xe5, 0xb5, 0x72, 0xbd, 0xa1, 0xa9, 0xc5, 0xd2, 0x8a, 0xba, 0x58, - 0xd8, 0x56, 0x2e, 0x87, 0xcb, 0x2a, 0xd5, 0x46, 0x71, 0x7d, 0x5d, 0xab, 0x9e, 0x55, 0x1b, 0xec, - 0x8f, 0x5a, 0xc1, 0xa0, 0x05, 0xd5, 0x1b, 0xb5, 0x95, 0xa2, 0xa6, 0x16, 0x17, 0x56, 0xd5, 0xc2, - 0xfd, 0xe8, 0x99, 0x32, 0xcc, 0xae, 0xe9, 0x17, 0x70, 0x6d, 0x5b, 0xb7, 0xb1, 0x7e, 0xbe, 0x8d, - 0xd1, 0xb5, 0x02, 0x78, 0xa2, 0x4f, 0x86, 0xf1, 0x52, 0x79, 0xbc, 0x6e, 0xee, 0x23, 0x60, 0xae, - 0x88, 0x08, 0xc0, 0xfe, 0xc5, 0x6f, 0x06, 0x2b, 0x1c, 0x60, 0x4f, 0x4c, 0x48, 0x2f, 0x19, 0x62, - 0xbf, 0xf0, 0x08, 0x40, 0x0c, 0x7d, 0x59, 0x86, 0xb9, 0xb2, 0xb9, 0x67, 0x38, 0x78, 0x19, 0x9b, - 0xd8, 0x76, 0xc7, 0x01, 0x21, 0x18, 0x1e, 0x96, 0x43, 0x30, 0x2c, 0xf1, 0x30, 0xdc, 0xd2, 0x47, - 0x6c, 0x7c, 0x19, 0x11, 0xa3, 0xed, 0x55, 0x30, 0x65, 0x90, 0x7c, 0x25, 0xa3, 0xc5, 0x24, 0x16, - 0x24, 0x28, 0xd7, 0xc1, 0x2c, 0x7d, 0x59, 0x32, 0xda, 0xf8, 0x5e, 0x7c, 0x89, 0x8d, 0xbb, 0x7c, - 0x22, 0xfa, 0x15, 0xbf, 0xf1, 0x95, 0x39, 0x2c, 0x7f, 0x22, 0x29, 0x53, 0xc9, 0xc0, 0x7c, 0xd1, - 0x23, 0xa1, 0xf9, 0xed, 0x6b, 0x65, 0x06, 0xfa, 0x81, 0x04, 0xd3, 0x35, 0xc7, 0xea, 0xb8, 0x2a, - 0x6b, 0x98, 0x5b, 0x62, 0xe0, 0x7e, 0x3c, 0xdc, 0xc6, 0x4a, 0x3c, 0xb8, 0x8f, 0xeb, 0x23, 0xc7, - 0x50, 0x01, 0x11, 0x2d, 0xec, 0x3b, 0x7e, 0x0b, 0x5b, 0xe2, 0x50, 0xb9, 0x35, 0x11, 0xb5, 0x1f, - 0xc2, 0xf6, 0xf5, 0x22, 0x19, 0x0a, 0x9e, 0x9a, 0x39, 0xa5, 0x5d, 0xdb, 0xc6, 0xa6, 0x23, 0x06, - 0xc2, 0x5f, 0x86, 0x41, 0x58, 0xe1, 0x41, 0xb8, 0x35, 0x46, 0x99, 0xbd, 0x52, 0x52, 0x6c, 0x63, - 0x1f, 0xf0, 0xd1, 0xbc, 0x97, 0x43, 0xf3, 0x27, 0x93, 0xb3, 0x95, 0x0c, 0xd2, 0x95, 0x21, 0x10, - 0x3d, 0x0e, 0x05, 0x77, 0x4c, 0x2a, 0xd5, 0xcb, 0x67, 0xd5, 0x46, 0xb9, 0x72, 0xb6, 0x5c, 0x57, - 0x0b, 0x18, 0xbd, 0x50, 0x86, 0x19, 0xca, 0x9a, 0x86, 0xf7, 0xac, 0x0b, 0x82, 0xbd, 0xde, 0x97, - 0x13, 0x1a, 0x0b, 0xe1, 0x12, 0x22, 0x5a, 0xc6, 0x2f, 0x27, 0x30, 0x16, 0x62, 0xc8, 0x3d, 0x92, - 0x7a, 0xab, 0x7d, 0xcd, 0x60, 0xab, 0x4f, 0x6b, 0xe9, 0xdb, 0x5b, 0xbd, 0x28, 0x0b, 0x40, 0x2b, - 0x79, 0xd6, 0xc0, 0x17, 0xd1, 0x5a, 0x80, 0x09, 0xa7, 0xb6, 0x99, 0x81, 0x6a, 0x2b, 0xf5, 0x53, - 0xdb, 0x77, 0x87, 0xc7, 0xac, 0x05, 0x1e, 0xbd, 0x9b, 0x22, 0xc5, 0xed, 0x72, 0x12, 0x3d, 0x3b, - 0xf4, 0x14, 0x45, 0xe2, 0xad, 0xce, 0xab, 0x60, 0x8a, 0x3c, 0x56, 0xf4, 0x1d, 0xcc, 0xda, 0x50, - 0x90, 0xa0, 0x9c, 0x81, 0x19, 0x9a, 0xb1, 0x69, 0x99, 0x6e, 0x7d, 0xb2, 0x24, 0x03, 0x97, 0xe6, - 0x82, 0xd8, 0xb4, 0xb1, 0xee, 0x58, 0x36, 0xa1, 0x91, 0xa3, 0x20, 0x86, 0x92, 0xd0, 0x37, 0xfd, - 0x56, 0xa8, 0x72, 0x9a, 0xf3, 0xf8, 0x24, 0x55, 0x49, 0xa6, 0x37, 0x7b, 0xc3, 0xb5, 0x3f, 0xda, - 0xea, 0x1a, 0x2e, 0xda, 0x4b, 0x64, 0x6a, 0x87, 0x95, 0x93, 0xa0, 0xb0, 0x54, 0x37, 0x6f, 0xa9, - 0x5a, 0xa9, 0xab, 0x95, 0x7a, 0x61, 0xb3, 0xaf, 0x46, 0x6d, 0xa1, 0xd7, 0x64, 0x21, 0x7b, 0x8f, - 0x65, 0x98, 0xe8, 0xc1, 0x0c, 0xa7, 0x12, 0x26, 0x76, 0x2e, 0x5a, 0xf6, 0x05, 0xbf, 0xa1, 0x06, - 0x09, 0xf1, 0xd8, 0x04, 0xaa, 0x24, 0x0f, 0x54, 0xa5, 0x6c, 0x3f, 0x55, 0xfa, 0xb5, 0xb0, 0x2a, - 0xdd, 0xc1, 0xab, 0xd2, 0xf5, 0x7d, 0xe4, 0xef, 0x32, 0x1f, 0xd1, 0x01, 0x7c, 0xcc, 0xef, 0x00, - 0xee, 0xe2, 0x60, 0x7c, 0xac, 0x18, 0x99, 0x64, 0x00, 0x7e, 0x29, 0xd5, 0x86, 0xdf, 0x0f, 0xea, - 0xad, 0x08, 0xa8, 0xb7, 0xfb, 0xf4, 0x09, 0xc6, 0xfe, 0xae, 0xe3, 0xfe, 0xfd, 0xdd, 0xc4, 0x05, - 0xe5, 0x04, 0x1c, 0x5b, 0x2c, 0x2f, 0x2d, 0xa9, 0x9a, 0x5a, 0xa9, 0x37, 0x2a, 0x6a, 0xfd, 0x5c, - 0x55, 0xbb, 0xb7, 0xd0, 0x46, 0x0f, 0xc9, 0x00, 0xae, 0x84, 0x4a, 0xba, 0xd9, 0xc4, 0x6d, 0xb1, - 0x1e, 0xfd, 0x7f, 0x49, 0xc9, 0xfa, 0x84, 0x80, 0x7e, 0x04, 0x9c, 0x2f, 0x97, 0xc4, 0x5b, 0x65, - 0x24, 0xb1, 0x64, 0xa0, 0xbe, 0xf1, 0x91, 0x60, 0x7b, 0x5e, 0x06, 0x47, 0x3d, 0x7a, 0x2c, 0x7b, - 0xff, 0x69, 0xdf, 0x5b, 0xb2, 0x30, 0xc7, 0x60, 0xf1, 0xe6, 0xf1, 0xcf, 0xce, 0x88, 0x4c, 0xe4, - 0x11, 0x4c, 0xb2, 0x69, 0xbb, 0xd7, 0xbd, 0xfb, 0xef, 0xca, 0x32, 0x4c, 0x77, 0xb0, 0xbd, 0x63, - 0x74, 0xbb, 0x86, 0x65, 0xd2, 0x05, 0xb9, 0xb9, 0x5b, 0x1f, 0xed, 0x4b, 0x9c, 0xac, 0x5d, 0xce, - 0xaf, 0xeb, 0xb6, 0x63, 0x34, 0x8d, 0x8e, 0x6e, 0x3a, 0xeb, 0x41, 0x66, 0x2d, 0xfc, 0x27, 0x7a, - 0x41, 0xc2, 0x69, 0x0d, 0x5f, 0x93, 0x08, 0x95, 0xf8, 0xfd, 0x04, 0x53, 0x92, 0x58, 0x82, 0xc9, - 0xd4, 0xe2, 0xa3, 0xa9, 0xaa, 0x45, 0x1f, 0xbc, 0xb7, 0x94, 0x2b, 0xe0, 0x44, 0xb9, 0x52, 0xaa, - 0x6a, 0x9a, 0x5a, 0xaa, 0x37, 0xd6, 0x55, 0x6d, 0xad, 0x5c, 0xab, 0x95, 0xab, 0x95, 0xda, 0x41, - 0x5a, 0x3b, 0xfa, 0x84, 0xec, 0x6b, 0xcc, 0x22, 0x6e, 0xb6, 0x0d, 0x13, 0xa3, 0xbb, 0x0e, 0xa8, - 0x30, 0xfc, 0xaa, 0x8f, 0x38, 0xce, 0xac, 0xfc, 0x08, 0x9c, 0x5f, 0x9d, 0x1c, 0xe7, 0xfe, 0x04, - 0xff, 0x03, 0x37, 0xff, 0x2f, 0xcb, 0x70, 0x2c, 0xd4, 0x10, 0x35, 0xbc, 0x33, 0xb2, 0x95, 0xbc, - 0x5f, 0x08, 0xb7, 0xdd, 0x32, 0x8f, 0x69, 0x3f, 0x6b, 0x7a, 0x1f, 0x1b, 0x11, 0xb0, 0xbe, 0xd1, - 0x87, 0x75, 0x95, 0x83, 0xf5, 0xc9, 0x43, 0xd0, 0x4c, 0x86, 0xec, 0xef, 0xa6, 0x8a, 0xec, 0x15, - 0x70, 0x62, 0xbd, 0xa8, 0xd5, 0xcb, 0xa5, 0xf2, 0x7a, 0xd1, 0x1d, 0x47, 0x43, 0x43, 0x76, 0x84, - 0xb9, 0xce, 0x83, 0xde, 0x17, 0xdf, 0xf7, 0x67, 0xe1, 0xaa, 0xfe, 0x1d, 0x6d, 0x69, 0x5b, 0x37, - 0xb7, 0x30, 0x32, 0x44, 0xa0, 0x5e, 0x84, 0x89, 0x26, 0xc9, 0x4e, 0x71, 0x0e, 0x6f, 0xdd, 0xc4, - 0xf4, 0xe5, 0xb4, 0x04, 0xcd, 0xfb, 0x15, 0xbd, 0x3d, 0xac, 0x10, 0x75, 0x5e, 0x21, 0x9e, 0x1a, - 0x0f, 0xde, 0x3e, 0xbe, 0x23, 0x74, 0xe3, 0xd3, 0xbe, 0x6e, 0x9c, 0xe3, 0x74, 0xa3, 0x74, 0x30, - 0xf2, 0xc9, 0xd4, 0xe4, 0x8f, 0x1f, 0x09, 0x1d, 0x40, 0xa4, 0x36, 0x19, 0xd1, 0xa3, 0x42, 0xdf, - 0xee, 0xfe, 0x95, 0x32, 0xe4, 0x17, 0x71, 0x1b, 0x8b, 0xae, 0x44, 0x7e, 0x5b, 0x12, 0xdd, 0x10, - 0xa1, 0x30, 0x50, 0xda, 0xd1, 0xab, 0x23, 0x8e, 0xb1, 0x83, 0xbb, 0x8e, 0xbe, 0xd3, 0x21, 0xa2, - 0x96, 0xb5, 0x20, 0x01, 0xfd, 0xa2, 0x24, 0xb2, 0x5d, 0x12, 0x53, 0xcc, 0x7f, 0x8c, 0x35, 0xc5, - 0xcf, 0x4a, 0x30, 0x59, 0xc3, 0x4e, 0xd5, 0x6e, 0x61, 0x1b, 0xd5, 0x02, 0x8c, 0xae, 0x81, 0x69, - 0x02, 0x8a, 0x3b, 0xcd, 0xf4, 0x71, 0x0a, 0x27, 0x29, 0xd7, 0xc3, 0x9c, 0xff, 0x4a, 0x7e, 0x67, - 0xdd, 0x78, 0x4f, 0x2a, 0xfa, 0xc7, 0x8c, 0xe8, 0x2e, 0x2e, 0x5b, 0x32, 0x64, 0xdc, 0x44, 0xb4, - 0x52, 0xb1, 0x1d, 0xd9, 0x58, 0x52, 0xe9, 0x6f, 0x74, 0xbd, 0x55, 0x02, 0xd8, 0x30, 0xbb, 0x9e, - 0x5c, 0x1f, 0x9b, 0x40, 0xae, 0xe8, 0x9f, 0x33, 0xc9, 0x66, 0x31, 0x41, 0x39, 0x11, 0x12, 0x7b, - 0x6d, 0x82, 0xb5, 0x85, 0x48, 0x62, 0xe9, 0xcb, 0xec, 0x6b, 0x73, 0x90, 0x3f, 0xa7, 0xb7, 0xdb, - 0xd8, 0x41, 0x5f, 0x97, 0x20, 0x5f, 0xb2, 0xb1, 0xee, 0xe0, 0xb0, 0xe8, 0x10, 0x4c, 0xda, 0x96, - 0xe5, 0xac, 0xeb, 0xce, 0x36, 0x93, 0x9b, 0xff, 0xce, 0x1c, 0x06, 0x7e, 0x27, 0xdc, 0x7d, 0xdc, - 0xc5, 0x8b, 0xee, 0xc7, 0xb9, 0xda, 0xd2, 0x82, 0xe6, 0x69, 0x21, 0x11, 0xfd, 0x07, 0x82, 0xc9, - 0x1d, 0x13, 0xef, 0x58, 0xa6, 0xd1, 0xf4, 0x6c, 0x4e, 0xef, 0x1d, 0x7d, 0xc8, 0x97, 0xe9, 0x02, - 0x27, 0xd3, 0x79, 0xe1, 0x52, 0x92, 0x09, 0xb4, 0x36, 0x44, 0xef, 0x71, 0x35, 0x5c, 0x49, 0x3b, - 0x83, 0x46, 0xbd, 0xda, 0x28, 0x69, 0x6a, 0xb1, 0xae, 0x36, 0x56, 0xab, 0xa5, 0xe2, 0x6a, 0x43, - 0x53, 0xd7, 0xab, 0x05, 0x8c, 0xfe, 0x4e, 0x72, 0x85, 0xdb, 0xb4, 0xf6, 0xb0, 0x8d, 0x96, 0x85, - 0xe4, 0x1c, 0x27, 0x13, 0x86, 0xc1, 0xaf, 0x09, 0x3b, 0x6d, 0x30, 0xe9, 0x30, 0x0e, 0x22, 0x94, - 0xf7, 0xc3, 0x42, 0xcd, 0x3d, 0x96, 0xd4, 0x23, 0x40, 0xd2, 0xff, 0x5b, 0x82, 0x89, 0x92, 0x65, - 0xee, 0x61, 0xdb, 0x09, 0xcf, 0x77, 0xc2, 0xd2, 0xcc, 0xf0, 0xd2, 0x74, 0x07, 0x49, 0x6c, 0x3a, - 0xb6, 0xd5, 0xf1, 0x26, 0x3c, 0xde, 0x2b, 0x7a, 0x7d, 0x52, 0x09, 0xb3, 0x92, 0xa3, 0x17, 0x3e, - 0xfb, 0x17, 0xc4, 0xb1, 0x27, 0xf7, 0x34, 0x80, 0x87, 0x92, 0xe0, 0xd2, 0x9f, 0x81, 0xf4, 0xbb, - 0x94, 0xaf, 0xc8, 0x30, 0x4b, 0x1b, 0x5f, 0x0d, 0x13, 0x0b, 0x0d, 0x55, 0xc3, 0x4b, 0x8e, 0x3d, - 0xc2, 0x5f, 0x39, 0xc2, 0x89, 0x3f, 0xaf, 0x77, 0x3a, 0xfe, 0xf2, 0xf3, 0xca, 0x11, 0x8d, 0xbd, - 0x53, 0x35, 0x5f, 0xc8, 0x43, 0x56, 0xdf, 0x75, 0xb6, 0xd1, 0x0f, 0x84, 0x27, 0x9f, 0x5c, 0x67, - 0xc0, 0xf8, 0x89, 0x80, 0xe4, 0x38, 0xe4, 0x1c, 0xeb, 0x02, 0xf6, 0xe4, 0x40, 0x5f, 0x5c, 0x38, - 0xf4, 0x4e, 0xa7, 0x4e, 0x3e, 0x30, 0x38, 0xbc, 0x77, 0xd7, 0xd6, 0xd1, 0x9b, 0x4d, 0x6b, 0xd7, - 0x74, 0xca, 0xde, 0x12, 0x74, 0x90, 0x80, 0xbe, 0x98, 0x11, 0x99, 0xcc, 0x0a, 0x30, 0x98, 0x0c, - 0xb2, 0xf3, 0x43, 0x34, 0xa5, 0x79, 0xb8, 0xb1, 0xb8, 0xbe, 0xde, 0xa8, 0x57, 0xef, 0x55, 0x2b, - 0x81, 0xe1, 0xd9, 0x28, 0x57, 0x1a, 0xf5, 0x15, 0xb5, 0x51, 0xda, 0xd0, 0xc8, 0x3a, 0x61, 0xb1, - 0x54, 0xaa, 0x6e, 0x54, 0xea, 0x05, 0x8c, 0xde, 0x24, 0xc1, 0x4c, 0xa9, 0x6d, 0x75, 0x7d, 0x84, - 0xaf, 0x0e, 0x10, 0xf6, 0xc5, 0x98, 0x09, 0x89, 0x11, 0xfd, 0x5b, 0x46, 0xd4, 0xe9, 0xc0, 0x13, - 0x48, 0x88, 0x7c, 0x44, 0x2f, 0xf5, 0x7a, 0x21, 0xa7, 0x83, 0xc1, 0xf4, 0xd2, 0x6f, 0x12, 0x9f, - 0xbd, 0x1d, 0x26, 0x8a, 0x54, 0x31, 0xd0, 0x5f, 0x67, 0x20, 0x5f, 0xb2, 0xcc, 0x4d, 0x63, 0xcb, - 0x35, 0xe6, 0xb0, 0xa9, 0x9f, 0x6f, 0xe3, 0x45, 0xdd, 0xd1, 0xf7, 0x0c, 0x7c, 0x91, 0x54, 0x60, - 0x52, 0xeb, 0x49, 0x75, 0x99, 0x62, 0x29, 0xf8, 0xfc, 0xee, 0x16, 0x61, 0x6a, 0x52, 0x0b, 0x27, - 0x29, 0x4f, 0x86, 0xcb, 0xe9, 0xeb, 0xba, 0x8d, 0x6d, 0xdc, 0xc6, 0x7a, 0x17, 0xbb, 0xd3, 0x22, - 0x13, 0xb7, 0x89, 0xd2, 0x4e, 0x6a, 0x51, 0x9f, 0x95, 0x33, 0x30, 0x43, 0x3f, 0x11, 0x53, 0xa4, - 0x4b, 0xd4, 0x78, 0x52, 0xe3, 0xd2, 0x94, 0xc7, 0x41, 0x0e, 0x3f, 0xe0, 0xd8, 0xfa, 0xa9, 0x16, - 0xc1, 0xeb, 0xf2, 0x79, 0xea, 0x75, 0x38, 0xef, 0x79, 0x1d, 0xce, 0xd7, 0x88, 0x4f, 0xa2, 0x46, - 0x73, 0xa1, 0x97, 0x4d, 0xfa, 0x86, 0xc4, 0xbf, 0x4b, 0x81, 0x62, 0x28, 0x90, 0x35, 0xf5, 0x1d, - 0xcc, 0xf4, 0x82, 0x3c, 0x2b, 0x37, 0xc2, 0x51, 0x7d, 0x4f, 0x77, 0x74, 0x7b, 0xd5, 0x6a, 0xea, - 0x6d, 0x32, 0xf8, 0x79, 0x2d, 0xbf, 0xf7, 0x03, 0xd9, 0x11, 0x72, 0x2c, 0x1b, 0x93, 0x5c, 0xde, - 0x8e, 0x90, 0x97, 0xe0, 0x52, 0x37, 0x9a, 0x96, 0x49, 0xf8, 0x97, 0x35, 0xf2, 0xec, 0x4a, 0xa5, - 0x65, 0x74, 0xdd, 0x8a, 0x10, 0x2a, 0x15, 0xba, 0xb5, 0x51, 0xbb, 0x64, 0x36, 0xc9, 0x6e, 0xd0, - 0xa4, 0x16, 0xf5, 0x59, 0x59, 0x80, 0x69, 0xb6, 0x11, 0xb2, 0xe6, 0xea, 0x55, 0x9e, 0xe8, 0xd5, - 0x35, 0xbc, 0x4f, 0x17, 0xc5, 0x73, 0xbe, 0x12, 0xe4, 0xd3, 0xc2, 0x3f, 0x29, 0x77, 0xc3, 0x95, - 0xec, 0xb5, 0xb4, 0xdb, 0x75, 0xac, 0x1d, 0x0a, 0xfa, 0x92, 0xd1, 0xa6, 0x35, 0x98, 0x20, 0x35, - 0x88, 0xcb, 0xa2, 0xdc, 0x0a, 0xc7, 0x3b, 0x36, 0xde, 0xc4, 0xf6, 0x7d, 0xfa, 0xce, 0xee, 0x03, - 0x75, 0x5b, 0x37, 0xbb, 0x1d, 0xcb, 0x76, 0x4e, 0x4d, 0x12, 0xe6, 0xfb, 0x7e, 0x63, 0x1d, 0xe5, - 0x24, 0xe4, 0xa9, 0xf8, 0xd0, 0xf3, 0x73, 0xc2, 0xee, 0x9c, 0xac, 0x42, 0xb1, 0xe6, 0xd9, 0x2d, - 0x30, 0xc1, 0x7a, 0x38, 0x02, 0xd4, 0xf4, 0xad, 0x27, 0x7b, 0xd6, 0x15, 0x18, 0x15, 0xcd, 0xcb, - 0xa6, 0x3c, 0x01, 0xf2, 0x4d, 0x52, 0x2d, 0x82, 0xd9, 0xf4, 0xad, 0x57, 0xf6, 0x2f, 0x94, 0x64, - 0xd1, 0x58, 0x56, 0xf4, 0x17, 0xb2, 0x90, 0x07, 0x68, 0x1c, 0xc7, 0xc9, 0x5a, 0xf5, 0x37, 0xa5, - 0x21, 0xba, 0xcd, 0x9b, 0xe0, 0x06, 0xd6, 0x27, 0x32, 0xfb, 0x63, 0xb1, 0xb1, 0xb0, 0xe1, 0x4d, - 0x06, 0x5d, 0xab, 0xa4, 0x56, 0x2f, 0x6a, 0xee, 0x4c, 0x7e, 0xd1, 0x9d, 0x44, 0xde, 0x08, 0xd7, - 0x0f, 0xc8, 0xad, 0xd6, 0x1b, 0x95, 0xe2, 0x9a, 0x5a, 0xd8, 0xe4, 0x6d, 0x9b, 0x5a, 0xbd, 0xba, - 0xde, 0xd0, 0x36, 0x2a, 0x95, 0x72, 0x65, 0x99, 0x12, 0x73, 0x4d, 0xc2, 0x93, 0x41, 0x86, 0x73, - 0x5a, 0xb9, 0xae, 0x36, 0x4a, 0xd5, 0xca, 0x52, 0x79, 0xb9, 0x60, 0x0c, 0x32, 0x8c, 0xee, 0x57, - 0xae, 0x81, 0xab, 0x38, 0x4e, 0xca, 0xd5, 0x8a, 0x3b, 0xb3, 0x2d, 0x15, 0x2b, 0x25, 0xd5, 0x9d, - 0xc6, 0x5e, 0x50, 0x10, 0x9c, 0xa0, 0xe4, 0x1a, 0x4b, 0xe5, 0xd5, 0xf0, 0x66, 0xd4, 0xc7, 0x33, - 0xca, 0x29, 0xb8, 0x2c, 0xfc, 0xad, 0x5c, 0x39, 0x5b, 0x5c, 0x2d, 0x2f, 0x16, 0xfe, 0x28, 0xa3, - 0x5c, 0x07, 0x57, 0x73, 0x7f, 0xd1, 0x7d, 0xa5, 0x46, 0x79, 0xb1, 0xb1, 0x56, 0xae, 0xad, 0x15, - 0xeb, 0xa5, 0x95, 0xc2, 0x27, 0xc8, 0x7c, 0xc1, 0x37, 0x80, 0x43, 0x6e, 0x99, 0x2f, 0x0a, 0x8f, - 0xe9, 0x45, 0x5e, 0x51, 0x1f, 0xdb, 0x17, 0xf6, 0x78, 0x1b, 0xf6, 0xa3, 0xfe, 0xe8, 0xb0, 0xc8, - 0xa9, 0xd0, 0x2d, 0x09, 0x68, 0x25, 0xd3, 0xa1, 0xfa, 0x10, 0x2a, 0x74, 0x0d, 0x5c, 0x55, 0x51, - 0x29, 0x52, 0x9a, 0x5a, 0xaa, 0x9e, 0x55, 0xb5, 0xc6, 0xb9, 0xe2, 0xea, 0xaa, 0x5a, 0x6f, 0x2c, - 0x95, 0xb5, 0x5a, 0xbd, 0xb0, 0x89, 0xfe, 0x59, 0xf2, 0x57, 0x73, 0x42, 0xd2, 0xfa, 0x6b, 0x29, - 0x69, 0xb3, 0x8e, 0x5d, 0xb5, 0xf9, 0x09, 0xc8, 0x77, 0x1d, 0xdd, 0xd9, 0xed, 0xb2, 0x56, 0xfd, - 0xa8, 0xfe, 0xad, 0x7a, 0xbe, 0x46, 0x32, 0x69, 0x2c, 0x33, 0xfa, 0x8b, 0x4c, 0x92, 0x66, 0x3a, - 0x82, 0x05, 0x1d, 0x63, 0x08, 0x11, 0x9f, 0x06, 0xe4, 0x69, 0x7b, 0xb9, 0xd6, 0x28, 0xae, 0x6a, - 0x6a, 0x71, 0xf1, 0x3e, 0x7f, 0x19, 0x07, 0x2b, 0x27, 0xe0, 0xd8, 0x46, 0xa5, 0xb8, 0xb0, 0xaa, - 0x92, 0xe6, 0x52, 0xad, 0x54, 0xd4, 0x92, 0x2b, 0xf7, 0x5f, 0x24, 0x9b, 0x26, 0xae, 0x05, 0x4d, - 0xf8, 0x76, 0xad, 0x9c, 0x90, 0xfc, 0xbf, 0x21, 0xec, 0x5b, 0x14, 0x68, 0x58, 0x98, 0xd6, 0x68, - 0x71, 0xf8, 0xa2, 0x90, 0x3b, 0x91, 0x10, 0x27, 0xc9, 0xf0, 0xf8, 0xcf, 0x43, 0xe0, 0x71, 0x02, - 0x8e, 0x85, 0xf1, 0x20, 0x6e, 0x45, 0xd1, 0x30, 0x7c, 0x75, 0x12, 0xf2, 0x35, 0xdc, 0xc6, 0x4d, - 0x07, 0xbd, 0x25, 0x64, 0x4c, 0xcc, 0x81, 0xe4, 0xbb, 0xb1, 0x48, 0x46, 0x8b, 0x9b, 0x3e, 0x4b, - 0x3d, 0xd3, 0xe7, 0x18, 0x33, 0x40, 0x4e, 0x64, 0x06, 0x64, 0x53, 0x30, 0x03, 0x72, 0xc3, 0x9b, - 0x01, 0xf9, 0x41, 0x66, 0x00, 0x7a, 0x6d, 0x3e, 0x69, 0x2f, 0x41, 0x45, 0x7d, 0xb8, 0x83, 0xff, - 0xff, 0xca, 0x26, 0xe9, 0x55, 0xfa, 0x72, 0x9c, 0x4c, 0x8b, 0x7f, 0x20, 0xa7, 0xb0, 0xfc, 0xa0, - 0x5c, 0x0b, 0x57, 0x07, 0xef, 0x0d, 0xf5, 0x69, 0xe5, 0x5a, 0xbd, 0x46, 0x46, 0xfc, 0x52, 0x55, - 0xd3, 0x36, 0xd6, 0xe9, 0x1a, 0xf2, 0x49, 0x50, 0x02, 0x2a, 0xda, 0x46, 0x85, 0x8e, 0xef, 0x5b, - 0x3c, 0xf5, 0xa5, 0x72, 0x65, 0xb1, 0xe1, 0xb7, 0x99, 0xca, 0x52, 0xb5, 0xb0, 0xed, 0x4e, 0xd9, - 0x42, 0xd4, 0xdd, 0x01, 0x9a, 0x95, 0x50, 0xac, 0x2c, 0x36, 0xd6, 0x2a, 0xea, 0x5a, 0xb5, 0x52, - 0x2e, 0x91, 0xf4, 0x9a, 0x5a, 0x2f, 0x18, 0xee, 0x40, 0xd3, 0x63, 0x51, 0xd4, 0xd4, 0xa2, 0x56, - 0x5a, 0x51, 0x35, 0x5a, 0xe4, 0xfd, 0xca, 0xf5, 0x70, 0xa6, 0x58, 0xa9, 0xd6, 0xdd, 0x94, 0x62, - 0xe5, 0xbe, 0xfa, 0x7d, 0xeb, 0x6a, 0x63, 0x5d, 0xab, 0x96, 0xd4, 0x5a, 0xcd, 0x6d, 0xa7, 0xcc, - 0xfe, 0x28, 0xb4, 0x95, 0xa7, 0xc2, 0xed, 0x21, 0xd6, 0xd4, 0x3a, 0xd9, 0xb0, 0x5c, 0xab, 0x12, - 0x9f, 0x95, 0x45, 0xb5, 0xb1, 0x52, 0xac, 0x35, 0xca, 0x95, 0x52, 0x75, 0x6d, 0xbd, 0x58, 0x2f, - 0xbb, 0xcd, 0x79, 0x5d, 0xab, 0xd6, 0xab, 0x8d, 0xb3, 0xaa, 0x56, 0x2b, 0x57, 0x2b, 0x05, 0xd3, - 0xad, 0x72, 0xa8, 0xfd, 0x7b, 0xfd, 0xb0, 0xa5, 0x5c, 0x05, 0xa7, 0xbc, 0xf4, 0xd5, 0xaa, 0x2b, - 0xe8, 0x90, 0x45, 0xd2, 0x49, 0xd5, 0x22, 0xf9, 0x57, 0x09, 0xb2, 0x35, 0xc7, 0xea, 0xa0, 0x1f, - 0x0f, 0x3a, 0x98, 0xd3, 0x00, 0x36, 0xd9, 0x7f, 0x74, 0x67, 0x61, 0x6c, 0x5e, 0x16, 0x4a, 0x41, - 0x7f, 0x28, 0xbc, 0x69, 0x12, 0xf4, 0xd9, 0x56, 0x27, 0xc2, 0x56, 0xf9, 0x9e, 0xd8, 0x29, 0x92, - 0x68, 0x42, 0xc9, 0xf4, 0xfd, 0x97, 0x87, 0xd9, 0x16, 0x41, 0x70, 0x32, 0x04, 0x9b, 0x2b, 0x7f, - 0x4f, 0x25, 0xb0, 0x72, 0x39, 0x5c, 0xd6, 0xa3, 0x5c, 0x44, 0xa7, 0x36, 0x95, 0x1f, 0x83, 0x47, - 0x85, 0xd4, 0x5b, 0x5d, 0xab, 0x9e, 0x55, 0x7d, 0x45, 0x5e, 0x2c, 0xd6, 0x8b, 0x85, 0x2d, 0xf4, - 0x59, 0x19, 0xb2, 0x6b, 0xd6, 0x5e, 0xef, 0x5e, 0x95, 0x89, 0x2f, 0x86, 0xd6, 0x42, 0xbd, 0x57, - 0xde, 0x6b, 0x5e, 0x48, 0xec, 0x6b, 0xd1, 0xfb, 0xd2, 0x5f, 0x94, 0x92, 0x88, 0x7d, 0xed, 0xa0, - 0x9b, 0xd1, 0x7f, 0x3f, 0x8c, 0xd8, 0x23, 0x44, 0x8b, 0x95, 0x33, 0x70, 0x3a, 0xf8, 0x50, 0x5e, - 0x54, 0x2b, 0xf5, 0xf2, 0xd2, 0x7d, 0x81, 0x70, 0xcb, 0x9a, 0x90, 0xf8, 0x07, 0x75, 0x63, 0xf1, - 0x33, 0x8d, 0x53, 0x70, 0x3c, 0xf8, 0xb6, 0xac, 0xd6, 0xbd, 0x2f, 0xf7, 0xa3, 0x07, 0x73, 0x30, - 0x43, 0xbb, 0xf5, 0x8d, 0x4e, 0x4b, 0x77, 0x30, 0x7a, 0x42, 0x80, 0xee, 0x0d, 0x70, 0xb4, 0xbc, - 0xbe, 0x54, 0xab, 0x39, 0x96, 0xad, 0x6f, 0xe1, 0x62, 0xab, 0x65, 0x33, 0x69, 0xf5, 0x26, 0xa3, - 0x77, 0x0a, 0xaf, 0xf3, 0xf1, 0x43, 0x09, 0x2d, 0x33, 0x02, 0xf5, 0xaf, 0x08, 0xad, 0xcb, 0x09, - 0x10, 0x4c, 0x86, 0xfe, 0xfd, 0x23, 0x6e, 0x73, 0xd1, 0xb8, 0x6c, 0x9e, 0x79, 0x96, 0x04, 0x53, - 0x75, 0x63, 0x07, 0x3f, 0xdd, 0x32, 0x71, 0x57, 0x99, 0x00, 0x79, 0x79, 0xad, 0x5e, 0x38, 0xe2, - 0x3e, 0xb8, 0x46, 0x55, 0x86, 0x3c, 0xa8, 0x6e, 0x01, 0xee, 0x43, 0xb1, 0x5e, 0x90, 0xdd, 0x87, - 0x35, 0xb5, 0x5e, 0xc8, 0xba, 0x0f, 0x15, 0xb5, 0x5e, 0xc8, 0xb9, 0x0f, 0xeb, 0xab, 0xf5, 0x42, - 0xde, 0x7d, 0x28, 0xd7, 0xea, 0x85, 0x09, 0xf7, 0x61, 0xa1, 0x56, 0x2f, 0x4c, 0xba, 0x0f, 0x67, - 0x6b, 0xf5, 0xc2, 0x94, 0xfb, 0x50, 0xaa, 0xd7, 0x0b, 0xe0, 0x3e, 0xdc, 0x53, 0xab, 0x17, 0xa6, - 0xdd, 0x87, 0x62, 0xa9, 0x5e, 0x98, 0x21, 0x0f, 0x6a, 0xbd, 0x30, 0xeb, 0x3e, 0xd4, 0x6a, 0xf5, - 0xc2, 0x1c, 0xa1, 0x5c, 0xab, 0x17, 0x8e, 0x92, 0xb2, 0xca, 0xf5, 0x42, 0xc1, 0x7d, 0x58, 0xa9, - 0xd5, 0x0b, 0xc7, 0x48, 0xe6, 0x5a, 0xbd, 0xa0, 0x90, 0x42, 0x6b, 0xf5, 0xc2, 0x65, 0x24, 0x4f, - 0xad, 0x5e, 0x38, 0x4e, 0x8a, 0xa8, 0xd5, 0x0b, 0x27, 0x08, 0x1b, 0x6a, 0xbd, 0x70, 0x92, 0xe4, - 0xd1, 0xea, 0x85, 0xcb, 0xc9, 0xa7, 0x4a, 0xbd, 0x70, 0x8a, 0x30, 0xa6, 0xd6, 0x0b, 0x57, 0x90, - 0x07, 0xad, 0x5e, 0x40, 0xe4, 0x53, 0xb1, 0x5e, 0xb8, 0x12, 0x3d, 0x0a, 0xa6, 0x96, 0xb1, 0x43, - 0x41, 0x44, 0x05, 0x90, 0x97, 0xb1, 0x13, 0x36, 0xe3, 0xbf, 0x26, 0xc3, 0xe5, 0x6c, 0xea, 0xb7, - 0x64, 0x5b, 0x3b, 0xab, 0x78, 0x4b, 0x6f, 0x5e, 0x52, 0x1f, 0x70, 0x4d, 0xa8, 0xf0, 0xbe, 0xac, - 0x02, 0xd9, 0x4e, 0xd0, 0x19, 0x91, 0xe7, 0x58, 0x8b, 0xd3, 0x5b, 0x8c, 0x92, 0x83, 0xc5, 0x28, - 0x66, 0x91, 0xfd, 0x53, 0x58, 0xa3, 0xb9, 0xf5, 0xe3, 0x4c, 0xcf, 0xfa, 0xb1, 0xdb, 0x4c, 0x3a, - 0xd8, 0xee, 0x5a, 0xa6, 0xde, 0xae, 0xb1, 0x8d, 0x7b, 0xba, 0xea, 0xd5, 0x9b, 0xac, 0xfc, 0x94, - 0xd7, 0x32, 0xa8, 0x55, 0xf6, 0x94, 0xb8, 0x19, 0x6e, 0x6f, 0x35, 0x23, 0x1a, 0xc9, 0x27, 0xfc, - 0x46, 0x52, 0xe7, 0x1a, 0xc9, 0xdd, 0x07, 0xa0, 0x9d, 0xac, 0xbd, 0x94, 0x87, 0x9b, 0x5a, 0x04, - 0x6e, 0xad, 0xde, 0x72, 0xb5, 0x8c, 0x3e, 0x2b, 0xc1, 0x49, 0xd5, 0xec, 0x67, 0xe1, 0x87, 0x75, - 0xe1, 0x4d, 0x61, 0x68, 0xd6, 0x79, 0x91, 0xde, 0xde, 0xb7, 0xda, 0xfd, 0x69, 0x46, 0x48, 0xf4, - 0x53, 0xbe, 0x44, 0x6b, 0x9c, 0x44, 0xef, 0x1a, 0x9e, 0x74, 0x32, 0x81, 0x56, 0x46, 0xda, 0x01, - 0x65, 0xd1, 0x37, 0xb3, 0xf0, 0x28, 0xea, 0x7b, 0xc3, 0x38, 0xa4, 0xad, 0xac, 0x68, 0xb6, 0x34, - 0xdc, 0x75, 0x74, 0xdb, 0xe1, 0xce, 0x43, 0xf7, 0x4c, 0xa5, 0x32, 0x29, 0x4c, 0xa5, 0xa4, 0x81, - 0x53, 0x29, 0xf4, 0x8e, 0xb0, 0xf9, 0x70, 0x8e, 0xc7, 0xb8, 0xd8, 0xbf, 0xff, 0x8f, 0xab, 0x61, - 0x14, 0xd4, 0xbe, 0x5d, 0xf1, 0xd3, 0x1c, 0xd4, 0x4b, 0x07, 0x2e, 0x21, 0x19, 0xe2, 0x7f, 0x38, - 0x5a, 0x3b, 0x2f, 0x1b, 0xfe, 0xc6, 0x1b, 0x25, 0x85, 0x56, 0xaa, 0x06, 0xfa, 0xa7, 0x27, 0x60, - 0x8a, 0xb4, 0x85, 0x55, 0xc3, 0xbc, 0x80, 0x1e, 0x92, 0x61, 0xa6, 0x82, 0x2f, 0x96, 0xb6, 0xf5, - 0x76, 0x1b, 0x9b, 0x5b, 0x38, 0x6c, 0xb6, 0x9f, 0x82, 0x09, 0xbd, 0xd3, 0xa9, 0x04, 0xfb, 0x0c, - 0xde, 0x2b, 0xeb, 0x7f, 0xbf, 0xd1, 0xb7, 0x91, 0x67, 0x62, 0x1a, 0xb9, 0x5f, 0xee, 0x7c, 0xb8, - 0xcc, 0x88, 0x19, 0xf2, 0x35, 0x30, 0xdd, 0xf4, 0xb2, 0xf8, 0xe7, 0x26, 0xc2, 0x49, 0xe8, 0x6f, - 0x13, 0x75, 0x03, 0x42, 0x85, 0x27, 0x53, 0x0a, 0x3c, 0x62, 0x3b, 0xe4, 0x04, 0x1c, 0xab, 0x57, - 0xab, 0x8d, 0xb5, 0x62, 0xe5, 0xbe, 0xe0, 0xbc, 0xf2, 0x26, 0x7a, 0x79, 0x16, 0xe6, 0x6a, 0x56, - 0x7b, 0x0f, 0x07, 0x30, 0x95, 0x39, 0x87, 0x9c, 0xb0, 0x9c, 0x32, 0xfb, 0xe4, 0xa4, 0x9c, 0x84, - 0xbc, 0x6e, 0x76, 0x2f, 0x62, 0xcf, 0x36, 0x64, 0x6f, 0x0c, 0xc6, 0xf7, 0x87, 0xdb, 0xb1, 0xc6, - 0xc3, 0x78, 0xc7, 0x00, 0x49, 0xf2, 0x5c, 0x45, 0x00, 0x79, 0x06, 0x66, 0xba, 0x74, 0xb3, 0xb0, - 0x1e, 0xda, 0x13, 0xe6, 0xd2, 0x08, 0x8b, 0x74, 0xb7, 0x5a, 0x66, 0x2c, 0x92, 0x37, 0xf4, 0x90, - 0xdf, 0xfc, 0x37, 0x38, 0x88, 0x8b, 0x07, 0x61, 0x2c, 0x19, 0xc8, 0xaf, 0x1c, 0xf5, 0x0c, 0xef, - 0x14, 0x1c, 0x67, 0xad, 0xb6, 0x51, 0x5a, 0x29, 0xae, 0xae, 0xaa, 0x95, 0x65, 0xb5, 0x51, 0x5e, - 0xa4, 0x5b, 0x15, 0x41, 0x4a, 0xb1, 0x5e, 0x57, 0xd7, 0xd6, 0xeb, 0xb5, 0x86, 0xfa, 0xb4, 0x92, - 0xaa, 0x2e, 0x12, 0x97, 0x38, 0x72, 0xa6, 0xc5, 0x73, 0x5e, 0x2c, 0x56, 0x6a, 0xe7, 0x54, 0xad, - 0xb0, 0x7d, 0xa6, 0x08, 0xd3, 0xa1, 0x7e, 0xde, 0xe5, 0x6e, 0x11, 0x6f, 0xea, 0xbb, 0x6d, 0x66, - 0xab, 0x15, 0x8e, 0xb8, 0xdc, 0x11, 0xd9, 0x54, 0xcd, 0xf6, 0xa5, 0x42, 0x46, 0x29, 0xc0, 0x4c, - 0xb8, 0x4b, 0x2f, 0x48, 0xe8, 0xad, 0x57, 0xc1, 0xd4, 0x39, 0xcb, 0xbe, 0x40, 0xfc, 0xb8, 0xd0, - 0x7b, 0x68, 0x5c, 0x13, 0xef, 0x84, 0x68, 0x68, 0x60, 0x7f, 0xa5, 0xb8, 0xb7, 0x80, 0x47, 0x6d, - 0x7e, 0xe0, 0x29, 0xd0, 0x6b, 0x60, 0xfa, 0xa2, 0x97, 0x3b, 0x68, 0xe9, 0xa1, 0x24, 0xf4, 0xdf, - 0xc5, 0xf6, 0xff, 0x07, 0x17, 0x99, 0xfe, 0xfe, 0xf4, 0x5b, 0x24, 0xc8, 0x2f, 0x63, 0xa7, 0xd8, - 0x6e, 0x87, 0xe5, 0xf6, 0x62, 0xe1, 0x93, 0x3d, 0x5c, 0x25, 0x8a, 0xed, 0x76, 0x74, 0xa3, 0x0a, - 0x09, 0xc8, 0xf3, 0x40, 0xe7, 0xd2, 0x04, 0xfd, 0xe6, 0x06, 0x14, 0x98, 0xbe, 0xc4, 0x3e, 0x24, - 0xfb, 0x7b, 0xdc, 0x0f, 0x87, 0xac, 0x9c, 0xc7, 0x07, 0x31, 0x6d, 0x32, 0xf1, 0x7b, 0xe5, 0x5e, - 0x3e, 0xe5, 0x5e, 0x98, 0xd8, 0xed, 0xe2, 0x92, 0xde, 0xc5, 0x84, 0xb7, 0xde, 0x9a, 0x56, 0xcf, - 0xdf, 0x8f, 0x9b, 0xce, 0x7c, 0x79, 0xc7, 0x35, 0xa8, 0x37, 0x68, 0x46, 0x3f, 0x4c, 0x0c, 0x7b, - 0xd7, 0x3c, 0x0a, 0xee, 0xa4, 0xe4, 0xa2, 0xe1, 0x6c, 0x97, 0xb6, 0x75, 0x87, 0xad, 0x6d, 0xfb, - 0xef, 0xe8, 0xf9, 0x43, 0xc0, 0x19, 0xbb, 0x17, 0x1c, 0x79, 0x40, 0x30, 0x31, 0x88, 0x23, 0xd8, - 0xc0, 0x1d, 0x06, 0xc4, 0x7f, 0x90, 0x20, 0x5b, 0xed, 0x60, 0x53, 0xf8, 0x34, 0x8c, 0x2f, 0x5b, - 0xa9, 0x47, 0xb6, 0x0f, 0x89, 0x7b, 0x87, 0xf9, 0x95, 0x76, 0x4b, 0x8e, 0x90, 0xec, 0xcd, 0x90, - 0x35, 0xcc, 0x4d, 0x8b, 0x19, 0xa6, 0x57, 0x46, 0x6c, 0x02, 0x95, 0xcd, 0x4d, 0x4b, 0x23, 0x19, - 0x45, 0x1d, 0xc3, 0xe2, 0xca, 0x4e, 0x5f, 0xdc, 0xdf, 0x9a, 0x84, 0x3c, 0x55, 0x67, 0xf4, 0x22, - 0x19, 0xe4, 0x62, 0xab, 0x15, 0x21, 0x78, 0x69, 0x9f, 0xe0, 0x2d, 0xf2, 0x9b, 0x8f, 0x89, 0xff, - 0xce, 0x07, 0x33, 0x11, 0xec, 0xdb, 0x59, 0x93, 0x2a, 0xb6, 0x5a, 0xd1, 0x3e, 0xa8, 0x7e, 0x81, - 0x12, 0x5f, 0x60, 0xb8, 0x85, 0xcb, 0x62, 0x2d, 0x3c, 0xf1, 0x40, 0x10, 0xc9, 0x5f, 0xfa, 0x10, - 0xfd, 0x93, 0x04, 0x13, 0xab, 0x46, 0xd7, 0x71, 0xb1, 0x29, 0x8a, 0x60, 0x73, 0x15, 0x4c, 0x79, - 0xa2, 0x71, 0xbb, 0x3c, 0xb7, 0x3f, 0x0f, 0x12, 0xd0, 0x6b, 0xc2, 0xe8, 0xdc, 0xc3, 0xa3, 0xf3, - 0xc4, 0xf8, 0xda, 0x33, 0x2e, 0xa2, 0x4f, 0x19, 0x04, 0xc5, 0x4a, 0xbd, 0xc5, 0xfe, 0x8e, 0x2f, - 0xf0, 0x35, 0x4e, 0xe0, 0xb7, 0x0d, 0x53, 0x64, 0xfa, 0x42, 0xff, 0x9c, 0x04, 0xe0, 0x96, 0xcd, - 0x8e, 0x72, 0x3d, 0x86, 0x3b, 0xa0, 0x1d, 0x23, 0xdd, 0x97, 0x87, 0xa5, 0xbb, 0xc6, 0x4b, 0xf7, - 0x27, 0x07, 0x57, 0x35, 0xee, 0xc8, 0x96, 0x52, 0x00, 0xd9, 0xf0, 0x45, 0xeb, 0x3e, 0xa2, 0xb7, - 0xf8, 0x42, 0x5d, 0xe7, 0x84, 0x7a, 0xc7, 0x90, 0x25, 0xa5, 0x2f, 0xd7, 0xbf, 0x94, 0x60, 0xa2, - 0x86, 0x1d, 0xb7, 0x9b, 0x44, 0x67, 0x45, 0x7a, 0xf8, 0x50, 0xdb, 0x96, 0x04, 0xdb, 0xf6, 0x77, - 0x33, 0xa2, 0x81, 0x5e, 0x02, 0xc9, 0x30, 0x9e, 0x22, 0x16, 0x0f, 0x1e, 0x16, 0x0a, 0xf4, 0x32, - 0x88, 0x5a, 0xfa, 0xd2, 0x7d, 0x93, 0xe4, 0x6f, 0xcc, 0xf3, 0x27, 0x2d, 0xc2, 0x66, 0x71, 0x66, - 0xbf, 0x59, 0x2c, 0x7e, 0xd2, 0x22, 0x5c, 0xc7, 0xe8, 0x5d, 0xe9, 0xc4, 0xc6, 0xc6, 0x08, 0x36, - 0x8c, 0x87, 0x91, 0xd7, 0x33, 0x65, 0xc8, 0xb3, 0x95, 0xe5, 0xbb, 0xe2, 0x57, 0x96, 0x07, 0x4f, - 0x2d, 0xde, 0x3d, 0x84, 0x29, 0x17, 0xb7, 0xdc, 0xeb, 0xb3, 0x21, 0x85, 0xd8, 0xb8, 0x09, 0x72, - 0x24, 0x12, 0x25, 0x1b, 0xe7, 0x82, 0xbd, 0x7e, 0x8f, 0x84, 0xea, 0x7e, 0xd5, 0x68, 0xa6, 0xc4, - 0x28, 0x8c, 0x60, 0x85, 0x78, 0x18, 0x14, 0x7e, 0x53, 0x01, 0x58, 0xdf, 0x3d, 0xdf, 0x36, 0xba, - 0xdb, 0x86, 0xb9, 0x85, 0xbe, 0x9a, 0x81, 0x19, 0xf6, 0x4a, 0x03, 0x2a, 0xc6, 0x9a, 0x7f, 0x91, - 0x46, 0x41, 0x01, 0xe4, 0x5d, 0xdb, 0x60, 0xcb, 0x00, 0xee, 0xa3, 0x72, 0xa7, 0xef, 0xc8, 0x93, - 0xed, 0x39, 0x4a, 0xef, 0x8a, 0x21, 0xe0, 0x60, 0x3e, 0x54, 0x7a, 0xe0, 0xd0, 0x13, 0x8e, 0x9a, - 0x99, 0xe3, 0xa3, 0x66, 0x72, 0xe7, 0xeb, 0xf2, 0x3d, 0xe7, 0xeb, 0x5c, 0x1c, 0xbb, 0xc6, 0xd3, - 0x31, 0x71, 0x2e, 0x95, 0x35, 0xf2, 0x8c, 0x3e, 0x10, 0x4c, 0x55, 0x2c, 0x41, 0x3b, 0x37, 0x41, - 0x45, 0xaf, 0x82, 0xa9, 0xfb, 0x2d, 0xc3, 0x24, 0x5b, 0x11, 0xcc, 0x79, 0x38, 0x48, 0x40, 0x1f, - 0x11, 0x8e, 0x83, 0x15, 0x12, 0x49, 0xec, 0xa4, 0x83, 0x71, 0x20, 0xf9, 0x1c, 0x84, 0xf6, 0xf3, - 0xe2, 0x3a, 0xcc, 0x41, 0xf4, 0x93, 0xa9, 0xde, 0xce, 0x10, 0xcb, 0x2b, 0x0a, 0xcc, 0x79, 0xe7, - 0x0a, 0xab, 0x0b, 0xf7, 0xa8, 0xa5, 0x7a, 0x01, 0xef, 0x3f, 0x6b, 0x48, 0x4e, 0x15, 0xd2, 0x13, - 0x84, 0xc1, 0x12, 0x0a, 0xfa, 0x9f, 0x12, 0xe4, 0x99, 0x75, 0x70, 0xd7, 0x01, 0x21, 0x44, 0xaf, - 0x18, 0x06, 0x92, 0xd8, 0xe3, 0xdd, 0x9f, 0x4c, 0x0a, 0xc0, 0x08, 0xec, 0x81, 0xfb, 0x52, 0x03, - 0x00, 0xfd, 0x8b, 0x04, 0x59, 0xd7, 0x6a, 0x11, 0x3b, 0x3c, 0xfb, 0x09, 0x61, 0xb7, 0xd5, 0x90, - 0x00, 0x5c, 0xf2, 0x11, 0xfa, 0xbd, 0x00, 0x53, 0x1d, 0x9a, 0xd1, 0x3f, 0xba, 0x7d, 0x9d, 0x40, - 0xdf, 0x81, 0xb5, 0xe0, 0x37, 0xf4, 0x2e, 0x21, 0xd7, 0xd7, 0x78, 0x7e, 0x92, 0xc1, 0xa1, 0x8e, - 0xe2, 0x9c, 0xed, 0x26, 0xfa, 0xbe, 0x04, 0xa0, 0xe1, 0xae, 0xd5, 0xde, 0xc3, 0x1b, 0xb6, 0x81, - 0xae, 0x0c, 0x00, 0x60, 0xcd, 0x3e, 0x13, 0x34, 0xfb, 0x4f, 0x87, 0x05, 0xbf, 0xcc, 0x0b, 0xfe, - 0xf1, 0xd1, 0x9a, 0xe7, 0x11, 0x8f, 0x10, 0xff, 0x53, 0x61, 0x82, 0xc9, 0x91, 0x99, 0x80, 0x62, - 0xc2, 0xf7, 0x7e, 0x42, 0xef, 0xf5, 0x45, 0x7f, 0x0f, 0x27, 0xfa, 0x27, 0x25, 0xe6, 0x28, 0x19, - 0x00, 0xa5, 0x21, 0x00, 0x38, 0x0a, 0xd3, 0x1e, 0x00, 0x1b, 0x5a, 0xb9, 0x80, 0xd1, 0xdb, 0x65, - 0xb2, 0x5b, 0x4e, 0xc7, 0xa2, 0x83, 0xf7, 0x34, 0x5f, 0x17, 0x9e, 0x9b, 0x87, 0xe4, 0xe1, 0x97, - 0x9f, 0x12, 0x40, 0x7f, 0x2a, 0x34, 0x19, 0x17, 0x60, 0xe8, 0x91, 0xd2, 0x5f, 0x9d, 0x51, 0x61, - 0x96, 0x33, 0x22, 0x94, 0x53, 0x70, 0x9c, 0x4b, 0xa0, 0xe3, 0x5d, 0xab, 0x70, 0x44, 0x41, 0x70, - 0x92, 0xfb, 0xc2, 0x5e, 0x70, 0xab, 0x90, 0x41, 0x7f, 0xfe, 0xd9, 0x8c, 0xbf, 0x3c, 0xf3, 0xee, - 0x2c, 0x5b, 0x18, 0xfb, 0x18, 0x1f, 0x2d, 0xac, 0x69, 0x99, 0x0e, 0x7e, 0x20, 0xe4, 0xad, 0xe0, - 0x27, 0xc4, 0x5a, 0x0d, 0xa7, 0x60, 0xc2, 0xb1, 0xc3, 0x1e, 0x0c, 0xde, 0x6b, 0x58, 0xb1, 0x72, - 0xbc, 0x62, 0x55, 0xe0, 0x8c, 0x61, 0x36, 0xdb, 0xbb, 0x2d, 0xac, 0xe1, 0xb6, 0xee, 0xca, 0xb0, - 0x5b, 0xec, 0x2e, 0xe2, 0x0e, 0x36, 0x5b, 0xd8, 0x74, 0x28, 0x9f, 0xde, 0x69, 0x25, 0x81, 0x9c, - 0xbc, 0x32, 0xde, 0xc9, 0x2b, 0xe3, 0x63, 0xfa, 0xad, 0xb8, 0xc6, 0x2c, 0xcf, 0xdd, 0x06, 0x40, - 0xeb, 0x76, 0xd6, 0xc0, 0x17, 0x99, 0x1a, 0x5e, 0xd1, 0xb3, 0x48, 0x57, 0xf5, 0x33, 0x68, 0xa1, - 0xcc, 0xe8, 0xcb, 0xbe, 0xfa, 0xdd, 0xcd, 0xa9, 0xdf, 0x4d, 0x82, 0x2c, 0x24, 0xd3, 0xba, 0xce, - 0x10, 0x5a, 0x37, 0x0b, 0x53, 0xc1, 0xde, 0xad, 0xac, 0x5c, 0x01, 0x27, 0x3c, 0x6f, 0xd0, 0x8a, - 0xaa, 0x2e, 0xd6, 0x1a, 0x1b, 0xeb, 0xcb, 0x5a, 0x71, 0x51, 0x2d, 0x80, 0xab, 0x9f, 0x54, 0x2f, - 0x7d, 0x27, 0xce, 0x2c, 0xfa, 0xbc, 0x04, 0x39, 0x72, 0xd4, 0x0e, 0xfd, 0xec, 0x88, 0x34, 0xa7, - 0xcb, 0xf9, 0xbe, 0xf8, 0xe3, 0xae, 0x78, 0x14, 0x6f, 0x26, 0x4c, 0xc2, 0xd5, 0x81, 0xa2, 0x78, - 0xc7, 0x10, 0x4a, 0x7f, 0xe2, 0xe2, 0x36, 0xc9, 0xda, 0xb6, 0x75, 0xf1, 0x47, 0xb9, 0x49, 0xba, - 0xf5, 0x3f, 0xe4, 0x26, 0xd9, 0x87, 0x85, 0xb1, 0x37, 0xc9, 0x3e, 0xed, 0x2e, 0xa6, 0x99, 0xa2, - 0x67, 0xe4, 0xfc, 0xf9, 0xdf, 0xb3, 0xa4, 0x03, 0x6d, 0x55, 0x15, 0x61, 0xd6, 0x30, 0x1d, 0x6c, - 0x9b, 0x7a, 0x7b, 0xa9, 0xad, 0x6f, 0x79, 0xf6, 0x69, 0xef, 0xfe, 0x44, 0x39, 0x94, 0x47, 0xe3, - 0xff, 0x50, 0x4e, 0x03, 0x38, 0x78, 0xa7, 0xd3, 0xd6, 0x9d, 0x40, 0xf5, 0x42, 0x29, 0x61, 0xed, - 0xcb, 0xf2, 0xda, 0x77, 0x0b, 0x5c, 0x46, 0x41, 0xab, 0x5f, 0xea, 0xe0, 0x0d, 0xd3, 0xf8, 0xb9, - 0x5d, 0x12, 0x5c, 0x92, 0xea, 0x68, 0xbf, 0x4f, 0xdc, 0x86, 0x4d, 0xbe, 0x67, 0xc3, 0xe6, 0x1f, - 0x84, 0x83, 0x56, 0x78, 0xad, 0x7e, 0x40, 0xd0, 0x0a, 0xbf, 0xa5, 0xc9, 0x3d, 0x2d, 0xcd, 0x5f, - 0x46, 0xc9, 0x0a, 0x2c, 0xa3, 0x84, 0x51, 0xc9, 0x09, 0x2e, 0x41, 0xbe, 0x5a, 0x28, 0x2a, 0x46, - 0x5c, 0x35, 0xc6, 0xb0, 0xc4, 0x2d, 0xc3, 0x1c, 0x2d, 0x7a, 0xc1, 0xb2, 0x2e, 0xec, 0xe8, 0xf6, - 0x05, 0x64, 0x1f, 0x48, 0x15, 0x63, 0x77, 0x8b, 0x22, 0xb7, 0x40, 0x3f, 0x25, 0x3c, 0x67, 0xe0, - 0xc4, 0xe5, 0xf1, 0x3c, 0x9e, 0xed, 0xa2, 0x37, 0x08, 0x4d, 0x21, 0x44, 0x18, 0x4c, 0x1f, 0xd7, - 0x3f, 0xf6, 0x71, 0xf5, 0x3a, 0xfa, 0xf0, 0x4a, 0xfb, 0x28, 0x71, 0x45, 0x5f, 0x19, 0x0e, 0x3b, - 0x8f, 0xaf, 0x21, 0xb0, 0x2b, 0x80, 0x7c, 0xc1, 0x77, 0xee, 0x71, 0x1f, 0xc3, 0x15, 0xca, 0xa6, - 0x87, 0x66, 0x04, 0xcb, 0x63, 0x41, 0xf3, 0x38, 0xcf, 0x42, 0xb5, 0x93, 0x2a, 0xa6, 0x5f, 0x12, - 0xde, 0xc1, 0xea, 0x2b, 0x20, 0xca, 0xdd, 0x78, 0x5a, 0xa5, 0xd8, 0xf6, 0x97, 0x38, 0x9b, 0xe9, - 0xa3, 0xf9, 0xbc, 0x1c, 0x4c, 0x79, 0x61, 0x45, 0xc8, 0xad, 0x37, 0x3e, 0x86, 0x27, 0x21, 0xdf, - 0xb5, 0x76, 0xed, 0x26, 0x66, 0x7b, 0x8a, 0xec, 0x6d, 0x88, 0xfd, 0xaf, 0x81, 0xe3, 0xf9, 0x3e, - 0x93, 0x21, 0x9b, 0xd8, 0x64, 0x88, 0x36, 0x48, 0xe3, 0x06, 0xf8, 0xe7, 0x0b, 0x87, 0x2a, 0xe7, - 0x30, 0xab, 0x61, 0xe7, 0x91, 0x38, 0xc6, 0x7f, 0x50, 0x68, 0x77, 0x65, 0x40, 0x4d, 0x92, 0xa9, - 0x5c, 0x75, 0x08, 0x43, 0xf5, 0x4a, 0xb8, 0xdc, 0xcb, 0xc1, 0x2c, 0x54, 0x62, 0x91, 0x6e, 0x68, - 0xab, 0x05, 0x19, 0x3d, 0x33, 0x0b, 0x05, 0xca, 0x5a, 0xd5, 0x37, 0xd6, 0xd0, 0x8b, 0x33, 0x87, - 0x6d, 0x91, 0x46, 0x4f, 0x31, 0x3f, 0x23, 0x89, 0x86, 0x43, 0xe5, 0x04, 0x1f, 0xd4, 0x2e, 0x42, - 0x93, 0x86, 0x68, 0x66, 0x31, 0xca, 0x87, 0x7e, 0x3b, 0x23, 0x12, 0x5d, 0x55, 0x8c, 0xc5, 0xf4, - 0x7b, 0xa5, 0x2f, 0x64, 0xbd, 0xe8, 0x50, 0x4b, 0xb6, 0xb5, 0xb3, 0x61, 0xb7, 0xd1, 0xff, 0x29, - 0x14, 0xbc, 0x3a, 0xc2, 0xfc, 0x97, 0xa2, 0xcd, 0x7f, 0xb2, 0x64, 0xdc, 0x0e, 0xf6, 0xaa, 0xda, - 0x43, 0x0c, 0xdf, 0xca, 0xf5, 0x30, 0xa7, 0xb7, 0x5a, 0xeb, 0xfa, 0x16, 0x2e, 0xb9, 0xf3, 0x6a, - 0xd3, 0x61, 0x91, 0x63, 0x7a, 0x52, 0x63, 0xbb, 0x22, 0xf1, 0x75, 0x50, 0x0e, 0x24, 0x26, 0x9f, - 0xb1, 0x0c, 0x6f, 0xee, 0x90, 0xd0, 0xdc, 0xd6, 0x83, 0x38, 0x56, 0xec, 0x4d, 0xd0, 0x77, 0x49, - 0x80, 0xef, 0xf4, 0x35, 0xeb, 0xf7, 0x25, 0x98, 0x70, 0xe5, 0x5d, 0x6c, 0xb5, 0xd0, 0xa3, 0xb9, - 0x70, 0x6f, 0x91, 0xde, 0x63, 0xcf, 0x11, 0x76, 0xdb, 0xf3, 0x6a, 0x48, 0xe9, 0x47, 0x60, 0x12, - 0x08, 0x51, 0xe2, 0x84, 0x28, 0xe6, 0x9d, 0x17, 0x5b, 0x44, 0xfa, 0xe2, 0xfb, 0x84, 0x04, 0xb3, - 0xde, 0x3c, 0x62, 0x09, 0x3b, 0xcd, 0x6d, 0x74, 0x9b, 0xe8, 0x42, 0x13, 0x6b, 0x69, 0xfe, 0x9e, - 0x6c, 0x1b, 0xfd, 0x20, 0x93, 0x50, 0xe5, 0xb9, 0x92, 0x23, 0x56, 0xe9, 0x12, 0xe9, 0x62, 0x1c, - 0xc1, 0xf4, 0x85, 0xf9, 0x65, 0x09, 0xa0, 0x6e, 0xf9, 0x73, 0xdd, 0x03, 0x48, 0xf2, 0x85, 0xc2, - 0xdb, 0xb5, 0xac, 0xe2, 0x41, 0xb1, 0xc9, 0x7b, 0x0e, 0x41, 0xe7, 0xa3, 0x41, 0x25, 0x8d, 0xa5, - 0xad, 0x4f, 0x2d, 0xee, 0x76, 0xda, 0x46, 0x53, 0x77, 0x7a, 0x3d, 0xe6, 0xa2, 0xc5, 0x4b, 0xae, - 0x84, 0x4c, 0x64, 0x14, 0xfa, 0x65, 0x44, 0xc8, 0x92, 0x86, 0x21, 0x91, 0xbc, 0x30, 0x24, 0x82, - 0x5e, 0x30, 0x03, 0x88, 0x8f, 0x41, 0x3d, 0x65, 0x38, 0x5a, 0xed, 0x60, 0x73, 0xc1, 0xc6, 0x7a, - 0xab, 0x69, 0xef, 0xee, 0x9c, 0xef, 0x86, 0xdd, 0x3d, 0xe3, 0x75, 0x34, 0xb4, 0x74, 0x2c, 0x71, - 0x4b, 0xc7, 0xe8, 0x97, 0x64, 0xd1, 0xa0, 0x38, 0xa1, 0x0d, 0x8e, 0x10, 0x0f, 0x43, 0x0c, 0x75, - 0x89, 0x9c, 0x94, 0x7a, 0x56, 0x89, 0xb3, 0x49, 0x56, 0x89, 0xdf, 0x28, 0x14, 0x62, 0x47, 0xa8, - 0x5e, 0x63, 0xf1, 0x35, 0x9b, 0xab, 0x61, 0x27, 0x02, 0xde, 0xeb, 0x60, 0xf6, 0x7c, 0xf0, 0xc5, - 0x87, 0x98, 0x4f, 0xec, 0xe3, 0x01, 0xfa, 0xa6, 0xa4, 0x2b, 0x30, 0x3c, 0x0b, 0x11, 0xe8, 0xfa, - 0x08, 0x4a, 0x22, 0x6e, 0x66, 0x89, 0x96, 0x53, 0x62, 0xcb, 0x4f, 0x1f, 0x85, 0x8f, 0x48, 0x30, - 0x4d, 0x2e, 0xba, 0x5c, 0xb8, 0x44, 0xce, 0x2d, 0x0a, 0x1a, 0x25, 0xcf, 0x0b, 0x8b, 0x59, 0x81, - 0x6c, 0xdb, 0x30, 0x2f, 0x78, 0xfe, 0x81, 0xee, 0x73, 0x70, 0x6d, 0x9a, 0xd4, 0xe7, 0xda, 0x34, - 0x7f, 0x9f, 0xc2, 0x2f, 0xf7, 0x40, 0xf7, 0xf8, 0x0e, 0x24, 0x97, 0xbe, 0x18, 0xff, 0x2e, 0x0b, - 0xf9, 0x1a, 0xd6, 0xed, 0xe6, 0x36, 0x7a, 0xb7, 0xd4, 0x77, 0xaa, 0x30, 0xc9, 0x4f, 0x15, 0x96, - 0x60, 0x62, 0xd3, 0x68, 0x3b, 0xd8, 0xa6, 0x3e, 0xd3, 0xe1, 0xae, 0x9d, 0x36, 0xf1, 0x85, 0xb6, - 0xd5, 0xbc, 0x30, 0xcf, 0x4c, 0xf7, 0x79, 0x2f, 0xcc, 0xe6, 0xfc, 0x12, 0xf9, 0x49, 0xf3, 0x7e, - 0x76, 0x0d, 0xc2, 0xae, 0x65, 0x3b, 0x51, 0x37, 0x28, 0x44, 0x50, 0xa9, 0x59, 0xb6, 0xa3, 0xd1, - 0x1f, 0x5d, 0x98, 0x37, 0x77, 0xdb, 0xed, 0x3a, 0x7e, 0xc0, 0xf1, 0xa6, 0x6d, 0xde, 0xbb, 0x6b, - 0x2c, 0x5a, 0x9b, 0x9b, 0x5d, 0x4c, 0x17, 0x0d, 0x72, 0x1a, 0x7b, 0x53, 0x8e, 0x43, 0xae, 0x6d, - 0xec, 0x18, 0x74, 0xa2, 0x91, 0xd3, 0xe8, 0x8b, 0x72, 0x23, 0x14, 0x82, 0x39, 0x0e, 0x65, 0xf4, - 0x54, 0x9e, 0x34, 0xcd, 0x7d, 0xe9, 0xae, 0xce, 0x5c, 0xc0, 0x97, 0xba, 0xa7, 0x26, 0xc8, 0x77, - 0xf2, 0xcc, 0x1f, 0x50, 0x11, 0xd9, 0xef, 0xa0, 0x12, 0x8f, 0x9e, 0xc1, 0xda, 0xb8, 0x69, 0xd9, - 0x2d, 0x4f, 0x36, 0xd1, 0x13, 0x0c, 0x96, 0x2f, 0xd9, 0x2e, 0x45, 0xdf, 0xc2, 0xd3, 0xd7, 0xb4, - 0x77, 0xe4, 0xdd, 0x6e, 0xd3, 0x2d, 0xfa, 0x9c, 0xe1, 0x6c, 0xaf, 0x61, 0x47, 0x47, 0x7f, 0x27, - 0xf7, 0xd5, 0xb8, 0xe9, 0xff, 0x4f, 0xe3, 0x06, 0x68, 0x1c, 0x0d, 0xa0, 0xe4, 0xec, 0xda, 0xa6, - 0x2b, 0x47, 0x16, 0xb2, 0x34, 0x94, 0xa2, 0xdc, 0x01, 0x57, 0x04, 0x6f, 0xde, 0x52, 0xe9, 0x22, - 0x9b, 0xb6, 0x4e, 0x91, 0xec, 0xd1, 0x19, 0x94, 0x75, 0xb8, 0x96, 0x7e, 0x5c, 0xa9, 0xaf, 0xad, - 0xae, 0x18, 0x5b, 0xdb, 0x6d, 0x63, 0x6b, 0xdb, 0xe9, 0x96, 0xcd, 0xae, 0x83, 0xf5, 0x56, 0x75, - 0x53, 0xa3, 0x77, 0x9f, 0x00, 0xa1, 0x23, 0x92, 0x95, 0xf7, 0xa9, 0x16, 0x1b, 0xdd, 0xc2, 0x9a, - 0x12, 0xd1, 0x52, 0x9e, 0xe4, 0xb6, 0x94, 0xee, 0x6e, 0xdb, 0xc7, 0xf4, 0xaa, 0x1e, 0x4c, 0x03, - 0x55, 0xdf, 0x6d, 0x93, 0xe6, 0x42, 0x32, 0x27, 0x1d, 0xe7, 0x62, 0x38, 0x49, 0xbf, 0xd9, 0xfc, - 0x3f, 0x79, 0xc8, 0x2d, 0xdb, 0x7a, 0x67, 0x1b, 0x3d, 0x33, 0xd4, 0x3f, 0x8f, 0xaa, 0x4d, 0xf8, - 0xda, 0x29, 0x0d, 0xd2, 0x4e, 0x79, 0x80, 0x76, 0x66, 0x43, 0xda, 0x19, 0xbd, 0xa8, 0x7c, 0x06, - 0x66, 0x9a, 0x56, 0xbb, 0x8d, 0x9b, 0xae, 0x3c, 0xca, 0x2d, 0xb2, 0x9a, 0x33, 0xa5, 0x71, 0x69, - 0x24, 0x14, 0x31, 0x76, 0x6a, 0x74, 0x0d, 0x9d, 0x2a, 0x7d, 0x90, 0x80, 0x5e, 0x2c, 0x41, 0x56, - 0x6d, 0x6d, 0x61, 0x6e, 0x9d, 0x3d, 0x13, 0x5a, 0x67, 0x3f, 0x09, 0x79, 0x47, 0xb7, 0xb7, 0xb0, - 0xe3, 0xad, 0x13, 0xd0, 0x37, 0x3f, 0x42, 0xb2, 0x1c, 0x8a, 0x90, 0xfc, 0x93, 0x90, 0x75, 0x65, - 0xc6, 0xdc, 0xc8, 0xaf, 0xed, 0x07, 0x3f, 0x91, 0xfd, 0xbc, 0x5b, 0xe2, 0xbc, 0x5b, 0x6b, 0x8d, - 0xfc, 0xd0, 0x8b, 0x75, 0x6e, 0x1f, 0xd6, 0xe4, 0x1a, 0xc7, 0xa6, 0x65, 0x96, 0x77, 0xf4, 0x2d, - 0xcc, 0xaa, 0x19, 0x24, 0x78, 0x5f, 0xd5, 0x1d, 0xeb, 0x7e, 0x83, 0x05, 0x2b, 0x0e, 0x12, 0xdc, - 0x2a, 0x6c, 0x1b, 0xad, 0x16, 0x36, 0x59, 0xcb, 0x66, 0x6f, 0x67, 0x4e, 0x43, 0xd6, 0xe5, 0xc1, - 0xd5, 0x1f, 0xd7, 0x58, 0x28, 0x1c, 0x51, 0x66, 0xdc, 0x66, 0x45, 0x1b, 0x6f, 0x21, 0xc3, 0xaf, - 0xa9, 0x8a, 0xb8, 0xed, 0xd0, 0xca, 0xf5, 0x6f, 0x5c, 0x8f, 0x83, 0x9c, 0x69, 0xb5, 0xf0, 0xc0, - 0x41, 0x88, 0xe6, 0x52, 0x9e, 0x08, 0x39, 0xdc, 0x72, 0x7b, 0x05, 0x99, 0x64, 0x3f, 0x1d, 0x2f, - 0x4b, 0x8d, 0x66, 0x4e, 0xe6, 0x1b, 0xd4, 0x8f, 0xdb, 0xf4, 0x1b, 0xe0, 0xaf, 0x4c, 0xc0, 0x51, - 0xda, 0x07, 0xd4, 0x76, 0xcf, 0xbb, 0xa4, 0xce, 0x63, 0xf4, 0x70, 0xff, 0x81, 0xeb, 0x28, 0xaf, - 0xec, 0xc7, 0x21, 0xd7, 0xdd, 0x3d, 0xef, 0x1b, 0xa1, 0xf4, 0x25, 0xdc, 0x74, 0xa5, 0x91, 0x0c, - 0x67, 0xf2, 0xb0, 0xc3, 0x19, 0x37, 0x34, 0xc9, 0x5e, 0xe3, 0x0f, 0x06, 0x32, 0x7a, 0x00, 0xc2, - 0x1b, 0xc8, 0xfa, 0x0d, 0x43, 0xa7, 0x60, 0x42, 0xdf, 0x74, 0xb0, 0x1d, 0x98, 0x89, 0xec, 0xd5, - 0x1d, 0x2a, 0xcf, 0xe3, 0x4d, 0xcb, 0x76, 0xc5, 0x32, 0x45, 0x87, 0x4a, 0xef, 0x3d, 0xd4, 0x72, - 0x81, 0xdb, 0x21, 0xbb, 0x09, 0x8e, 0x99, 0xd6, 0x22, 0xee, 0x30, 0x39, 0x53, 0x14, 0x67, 0x49, - 0x0b, 0xd8, 0xff, 0x61, 0x5f, 0x57, 0x32, 0xb7, 0xbf, 0x2b, 0x41, 0x9f, 0x4e, 0x3a, 0x67, 0xee, - 0x01, 0x7a, 0x64, 0x16, 0x9a, 0xf2, 0x14, 0x98, 0x69, 0x31, 0x17, 0xad, 0xa6, 0xe1, 0xb7, 0x92, - 0xc8, 0xff, 0xb8, 0xcc, 0x81, 0x22, 0x65, 0xc3, 0x8a, 0xb4, 0x0c, 0x93, 0xe4, 0xa8, 0xb2, 0xab, - 0x49, 0xb9, 0x1e, 0x97, 0x78, 0x32, 0xad, 0xf3, 0x2b, 0x15, 0x12, 0xdb, 0x7c, 0x89, 0xfd, 0xa2, - 0xf9, 0x3f, 0x27, 0x9b, 0x7d, 0xc7, 0x4b, 0x28, 0xfd, 0xe6, 0xf8, 0x3b, 0x79, 0xb8, 0xa2, 0x64, - 0x5b, 0xdd, 0x2e, 0x39, 0x03, 0xd3, 0xdb, 0x30, 0x5f, 0x2f, 0x71, 0x77, 0x25, 0x3c, 0xa2, 0x9b, - 0x5f, 0xbf, 0x06, 0x35, 0xbe, 0xa6, 0xf1, 0x75, 0xe1, 0x20, 0x2f, 0xfe, 0xfe, 0x43, 0x84, 0xd0, - 0x7f, 0x34, 0x1a, 0xc9, 0x3b, 0x32, 0x22, 0x71, 0x67, 0x12, 0xca, 0x2a, 0xfd, 0xe6, 0xf2, 0x25, - 0x09, 0xae, 0xec, 0xe5, 0x66, 0xc3, 0xec, 0xfa, 0x0d, 0xe6, 0xea, 0x01, 0xed, 0x85, 0x8f, 0x53, - 0x12, 0x7b, 0x4b, 0x61, 0x44, 0xdd, 0x43, 0xa5, 0x45, 0x2c, 0x96, 0x04, 0x27, 0x6a, 0xe2, 0x6e, - 0x29, 0x4c, 0x4c, 0x3e, 0x7d, 0xe1, 0x7e, 0x26, 0x0b, 0x47, 0x97, 0x6d, 0x6b, 0xb7, 0xd3, 0x0d, - 0x7a, 0xa0, 0xbf, 0xee, 0xbf, 0xe1, 0x9a, 0x17, 0x31, 0x0d, 0xae, 0x81, 0x69, 0x9b, 0x59, 0x73, - 0xc1, 0xf6, 0x6b, 0x38, 0x29, 0xdc, 0x7b, 0xc9, 0x07, 0xe9, 0xbd, 0x82, 0x7e, 0x26, 0xcb, 0xf5, - 0x33, 0xbd, 0x3d, 0x47, 0xae, 0x4f, 0xcf, 0xf1, 0x57, 0x52, 0xc2, 0x41, 0xb5, 0x47, 0x44, 0x11, - 0xfd, 0x45, 0x09, 0xf2, 0x5b, 0x24, 0x23, 0xeb, 0x2e, 0x1e, 0x2b, 0x56, 0x33, 0x42, 0x5c, 0x63, - 0xbf, 0x06, 0x72, 0x95, 0xc3, 0x3a, 0x9c, 0x68, 0x80, 0x8b, 0xe7, 0x36, 0x7d, 0xa5, 0x7a, 0x28, - 0x0b, 0x33, 0x7e, 0xe9, 0xe5, 0x56, 0x17, 0x3d, 0xaf, 0xbf, 0x46, 0xcd, 0x8a, 0x68, 0xd4, 0xbe, - 0x75, 0x66, 0x7f, 0xd4, 0x91, 0x43, 0xa3, 0x4e, 0xdf, 0xd1, 0x65, 0x26, 0x62, 0x74, 0x41, 0xcf, - 0x90, 0x45, 0x6f, 0x1b, 0xe2, 0xbb, 0x56, 0x52, 0x9b, 0x47, 0xf2, 0x60, 0x21, 0x78, 0xe7, 0xd1, - 0xe0, 0x5a, 0xa5, 0xaf, 0x24, 0xef, 0x93, 0xe0, 0xd8, 0xfe, 0xce, 0xfc, 0xc7, 0x78, 0x2f, 0x34, - 0xb7, 0x4e, 0x5d, 0xdf, 0x0b, 0x8d, 0xbc, 0xf1, 0x9b, 0x74, 0xb1, 0x41, 0x43, 0x38, 0x7b, 0x6f, - 0x70, 0x27, 0x2e, 0x16, 0x16, 0x44, 0x90, 0x68, 0xfa, 0x02, 0xfc, 0x75, 0x19, 0xa6, 0x6a, 0xd8, - 0x59, 0xd5, 0x2f, 0x59, 0xbb, 0x0e, 0xd2, 0x45, 0xb7, 0xe7, 0x9e, 0x0c, 0xf9, 0x36, 0xf9, 0x85, - 0x5d, 0xe2, 0x7e, 0x4d, 0xdf, 0xfd, 0x2d, 0xe2, 0xfb, 0x43, 0x49, 0x6b, 0x2c, 0x3f, 0x1f, 0xad, - 0x45, 0x64, 0x77, 0xd4, 0xe7, 0x6e, 0x24, 0x5b, 0x3b, 0x89, 0xf6, 0x4e, 0xa3, 0x8a, 0x4e, 0x1f, - 0x96, 0x5f, 0x92, 0x61, 0xb6, 0x86, 0x9d, 0x72, 0x77, 0x49, 0xdf, 0xb3, 0x6c, 0xc3, 0xc1, 0xe1, - 0x5b, 0x1c, 0xe3, 0xa1, 0x39, 0x0d, 0x60, 0xf8, 0xbf, 0xb1, 0x18, 0x52, 0xa1, 0x14, 0xf4, 0xdb, - 0x49, 0x1d, 0x85, 0x38, 0x3e, 0x46, 0x02, 0x42, 0x22, 0x1f, 0x8b, 0xb8, 0xe2, 0xd3, 0x07, 0xe2, - 0x8b, 0x12, 0x03, 0xa2, 0x68, 0x37, 0xb7, 0x8d, 0x3d, 0xdc, 0x4a, 0x08, 0x84, 0xf7, 0x5b, 0x00, - 0x84, 0x4f, 0x28, 0xb1, 0xfb, 0x0a, 0xc7, 0xc7, 0x28, 0xdc, 0x57, 0xe2, 0x08, 0x8e, 0x25, 0x0c, - 0x94, 0xdb, 0xf5, 0xb0, 0xf5, 0xcc, 0xbb, 0x44, 0xc5, 0x1a, 0x98, 0x6c, 0x52, 0xd8, 0x64, 0x1b, - 0xaa, 0x63, 0xa1, 0x65, 0x0f, 0xd2, 0xe9, 0x6c, 0x1a, 0x1d, 0x4b, 0xdf, 0xa2, 0xd3, 0x17, 0xfa, - 0xbb, 0x64, 0x38, 0xe1, 0xc7, 0x47, 0xa9, 0x61, 0x67, 0x51, 0xef, 0x6e, 0x9f, 0xb7, 0x74, 0xbb, - 0x15, 0xbe, 0xdc, 0x7f, 0xe8, 0x13, 0x7f, 0xe8, 0x0b, 0x61, 0x10, 0x2a, 0x3c, 0x08, 0x7d, 0x5d, - 0x45, 0xfb, 0xf2, 0x32, 0x8a, 0x4e, 0x26, 0xd6, 0x9b, 0xf5, 0x77, 0x7d, 0xb0, 0x7e, 0x8a, 0x03, - 0xeb, 0xce, 0x61, 0x59, 0x4c, 0x1f, 0xb8, 0xdf, 0xa2, 0x23, 0x42, 0xc8, 0xab, 0xf9, 0x3e, 0x51, - 0xc0, 0x22, 0xbc, 0x5a, 0xe5, 0x48, 0xaf, 0xd6, 0xa1, 0xc6, 0x88, 0x81, 0x1e, 0xc9, 0xe9, 0x8e, - 0x11, 0x87, 0xe8, 0x6d, 0xfc, 0x36, 0x19, 0x0a, 0x24, 0x40, 0x56, 0xc8, 0xe3, 0x1b, 0xdd, 0x2f, - 0x8a, 0xce, 0x3e, 0xef, 0xf2, 0x89, 0xa4, 0xde, 0xe5, 0xe8, 0xad, 0x49, 0x7d, 0xc8, 0x7b, 0xb9, - 0x1d, 0x09, 0x62, 0x89, 0x5c, 0xc4, 0x07, 0x70, 0x90, 0x3e, 0x68, 0xff, 0x4d, 0x06, 0x70, 0x1b, - 0x34, 0x3b, 0xfb, 0xf0, 0x34, 0x51, 0xb8, 0x6e, 0x0e, 0xfb, 0xd5, 0xbb, 0x40, 0x9d, 0xe8, 0x01, - 0x8a, 0x52, 0x0c, 0x4e, 0x55, 0x3c, 0x9c, 0xd4, 0xb7, 0x32, 0xe0, 0x6a, 0x24, 0xb0, 0x24, 0xf2, - 0xb6, 0x8c, 0x2c, 0x3b, 0x7d, 0x40, 0xfe, 0x87, 0x04, 0xb9, 0xba, 0x55, 0xc3, 0xce, 0xc1, 0x4d, - 0x81, 0xc4, 0xc7, 0xf6, 0x49, 0xb9, 0xa3, 0x38, 0xb6, 0xdf, 0x8f, 0x50, 0xfa, 0xa2, 0x7b, 0xa7, - 0x04, 0x33, 0x75, 0xab, 0xe4, 0x2f, 0x4e, 0x89, 0xfb, 0xaa, 0x8a, 0xdf, 0x98, 0xec, 0x57, 0x30, - 0x28, 0xe6, 0x40, 0x37, 0x26, 0x0f, 0xa6, 0x97, 0xbe, 0xdc, 0x6e, 0x83, 0xa3, 0x1b, 0x66, 0xcb, - 0xd2, 0x70, 0xcb, 0x62, 0x2b, 0xdd, 0x8a, 0x02, 0xd9, 0x5d, 0xb3, 0x65, 0x11, 0x96, 0x73, 0x1a, - 0x79, 0x76, 0xd3, 0x6c, 0xdc, 0xb2, 0x98, 0x6f, 0x00, 0x79, 0x46, 0x5f, 0x97, 0x21, 0xeb, 0xfe, - 0x2b, 0x2e, 0xea, 0xb7, 0xc9, 0x09, 0x03, 0x11, 0xb8, 0xe4, 0x47, 0x62, 0x09, 0xdd, 0x15, 0x5a, - 0xfb, 0xa7, 0x1e, 0xac, 0xd7, 0x46, 0x95, 0x17, 0x12, 0x45, 0xb0, 0xe6, 0xaf, 0x9c, 0x82, 0x89, - 0xf3, 0x6d, 0xab, 0x79, 0x21, 0x38, 0x2f, 0xcf, 0x5e, 0x95, 0x1b, 0x21, 0x67, 0xeb, 0xe6, 0x16, - 0x66, 0x7b, 0x0a, 0xc7, 0x7b, 0xfa, 0x42, 0xe2, 0xf5, 0xa2, 0xd1, 0x2c, 0xe8, 0xad, 0x49, 0x42, - 0x20, 0xf4, 0xa9, 0x7c, 0x32, 0x7d, 0x58, 0x1c, 0xe2, 0x64, 0x59, 0x01, 0x66, 0x4a, 0x45, 0x7a, - 0x37, 0xf9, 0x5a, 0xf5, 0xac, 0x5a, 0x90, 0x09, 0xcc, 0xae, 0x4c, 0x52, 0x84, 0xd9, 0x25, 0xff, - 0x23, 0x0b, 0x73, 0x9f, 0xca, 0x1f, 0x06, 0xcc, 0x9f, 0x90, 0x60, 0x76, 0xd5, 0xe8, 0x3a, 0x51, - 0xde, 0xfe, 0x31, 0xf1, 0x71, 0x9f, 0x9f, 0xd4, 0x54, 0xe6, 0xca, 0x11, 0x0e, 0x8c, 0x9b, 0xc8, - 0x1c, 0x8e, 0x2b, 0x62, 0x3c, 0xc7, 0x52, 0x08, 0x07, 0xf4, 0x3e, 0x61, 0x61, 0x49, 0x26, 0x36, - 0x94, 0x82, 0x42, 0xc6, 0x6f, 0x28, 0x45, 0x96, 0x9d, 0xbe, 0x7c, 0xbf, 0x2e, 0xc1, 0x31, 0xb7, - 0xf8, 0xb8, 0x65, 0xa9, 0x68, 0x31, 0x0f, 0x5c, 0x96, 0x4a, 0xbc, 0x32, 0xbe, 0x8f, 0x97, 0x51, - 0xac, 0x8c, 0x0f, 0x22, 0x3a, 0x66, 0x31, 0x47, 0x2c, 0xc3, 0x0e, 0x12, 0x73, 0xcc, 0x32, 0xec, - 0xf0, 0x62, 0x8e, 0x5f, 0x8a, 0x1d, 0x52, 0xcc, 0x87, 0xb6, 0xc0, 0xfa, 0x5a, 0xd9, 0x17, 0x73, - 0xe4, 0xda, 0x46, 0x8c, 0x98, 0x13, 0x9f, 0xd8, 0x45, 0x6f, 0x1f, 0x52, 0xf0, 0x23, 0x5e, 0xdf, - 0x18, 0x06, 0xa6, 0x43, 0x5c, 0xe3, 0x78, 0x89, 0x0c, 0x73, 0x8c, 0x8b, 0xfe, 0x53, 0xe6, 0x18, - 0x8c, 0x12, 0x4f, 0x99, 0x13, 0x9f, 0x01, 0xe2, 0x39, 0x1b, 0xff, 0x19, 0xa0, 0xd8, 0xf2, 0xd3, - 0x07, 0xe7, 0x1b, 0x59, 0x38, 0xe9, 0xb2, 0xb0, 0x66, 0xb5, 0x8c, 0xcd, 0x4b, 0x94, 0x8b, 0xb3, - 0x7a, 0x7b, 0x17, 0x77, 0xd1, 0x7b, 0x24, 0x51, 0x94, 0xfe, 0x13, 0x80, 0xd5, 0xc1, 0x36, 0x0d, - 0xa4, 0xc6, 0x80, 0xba, 0x23, 0xaa, 0xb2, 0xfb, 0x4b, 0xf2, 0xaf, 0x8b, 0xa9, 0x7a, 0x44, 0xb4, - 0x10, 0x3d, 0xd7, 0x2a, 0x9c, 0xf2, 0xbf, 0xf4, 0x3a, 0x78, 0x64, 0xf6, 0x3b, 0x78, 0xdc, 0x00, - 0xb2, 0xde, 0x6a, 0xf9, 0x50, 0xf5, 0x6e, 0x66, 0x93, 0x32, 0x35, 0x37, 0x8b, 0x9b, 0xb3, 0x8b, - 0x83, 0xa3, 0x79, 0x11, 0x39, 0xbb, 0xd8, 0x51, 0xe6, 0x21, 0x4f, 0xef, 0x56, 0xf6, 0x57, 0xf4, - 0xfb, 0x67, 0x66, 0xb9, 0x78, 0xd3, 0xae, 0xca, 0xab, 0xe1, 0x6d, 0x89, 0x24, 0xd3, 0xaf, 0x9f, - 0x0e, 0xec, 0x64, 0x8d, 0x53, 0xb0, 0xa7, 0x0e, 0x4d, 0x79, 0x3c, 0xbb, 0x61, 0xc5, 0x4e, 0xa7, - 0x7d, 0xa9, 0xce, 0x82, 0xaf, 0x24, 0xda, 0x0d, 0x0b, 0xc5, 0x70, 0x91, 0x7a, 0x63, 0xb8, 0x24, - 0xdf, 0x0d, 0xe3, 0xf8, 0x18, 0xc5, 0x6e, 0x58, 0x1c, 0xc1, 0xf4, 0x45, 0xfb, 0xe6, 0x1c, 0xb5, - 0x9a, 0x59, 0xf4, 0xfe, 0x3f, 0xea, 0x7f, 0x08, 0x0d, 0x78, 0x67, 0x97, 0x7e, 0x81, 0xfd, 0x63, - 0x6f, 0x2d, 0x51, 0x9e, 0x08, 0xf9, 0x4d, 0xcb, 0xde, 0xd1, 0xbd, 0x8d, 0xfb, 0xde, 0x93, 0x22, - 0x2c, 0x62, 0xfe, 0x12, 0xc9, 0xa3, 0xb1, 0xbc, 0xee, 0x7c, 0xe4, 0xe9, 0x46, 0x87, 0x45, 0x5d, - 0x74, 0x1f, 0x95, 0xeb, 0x60, 0x96, 0x05, 0x5f, 0xac, 0xe0, 0xae, 0x83, 0x5b, 0x2c, 0x62, 0x05, - 0x9f, 0xa8, 0x9c, 0x81, 0x19, 0x96, 0xb0, 0x64, 0xb4, 0x71, 0x97, 0x05, 0xad, 0xe0, 0xd2, 0x94, - 0x93, 0x90, 0x37, 0xba, 0xf7, 0x74, 0x2d, 0x93, 0xf8, 0xff, 0x4f, 0x6a, 0xec, 0x4d, 0xb9, 0x01, - 0x8e, 0xb2, 0x7c, 0xbe, 0xb1, 0x4a, 0x0f, 0xec, 0xf4, 0x26, 0xbb, 0xaa, 0x65, 0x5a, 0xeb, 0xb6, - 0xb5, 0x65, 0xe3, 0x6e, 0x97, 0x9c, 0x9a, 0x9a, 0xd4, 0x42, 0x29, 0xe8, 0xb3, 0xc3, 0x4c, 0x2c, - 0x12, 0xdf, 0x64, 0xe0, 0xa2, 0xb4, 0xdb, 0x6c, 0x62, 0xdc, 0x62, 0x27, 0x9f, 0xbc, 0xd7, 0x84, - 0x77, 0x1c, 0x24, 0x9e, 0x86, 0x1c, 0xd2, 0x25, 0x07, 0x1f, 0x3a, 0x01, 0x79, 0x7a, 0x61, 0x18, - 0x7a, 0xd1, 0x5c, 0x5f, 0x65, 0x9d, 0xe3, 0x95, 0x75, 0x03, 0x66, 0x4c, 0xcb, 0x2d, 0x6e, 0x5d, - 0xb7, 0xf5, 0x9d, 0x6e, 0xdc, 0x2a, 0x23, 0xa5, 0xeb, 0x0f, 0x29, 0x95, 0xd0, 0x6f, 0x2b, 0x47, - 0x34, 0x8e, 0x8c, 0xf2, 0xff, 0x83, 0xa3, 0xe7, 0x59, 0x84, 0x80, 0x2e, 0xa3, 0x2c, 0x45, 0xfb, - 0xe0, 0xf5, 0x50, 0x5e, 0xe0, 0xff, 0x5c, 0x39, 0xa2, 0xf5, 0x12, 0x53, 0x7e, 0x06, 0xe6, 0xdc, - 0xd7, 0x96, 0x75, 0xd1, 0x63, 0x5c, 0x8e, 0x36, 0x44, 0x7a, 0xc8, 0xaf, 0x71, 0x3f, 0xae, 0x1c, - 0xd1, 0x7a, 0x48, 0x29, 0x55, 0x80, 0x6d, 0x67, 0xa7, 0xcd, 0x08, 0x67, 0xa3, 0x55, 0xb2, 0x87, - 0xf0, 0x8a, 0xff, 0xd3, 0xca, 0x11, 0x2d, 0x44, 0x42, 0x59, 0x85, 0x29, 0xe7, 0x01, 0x87, 0xd1, - 0xcb, 0x45, 0x6f, 0x7e, 0xf7, 0xd0, 0xab, 0x7b, 0xff, 0xac, 0x1c, 0xd1, 0x02, 0x02, 0x4a, 0x19, - 0x26, 0x3b, 0xe7, 0x19, 0xb1, 0x7c, 0x9f, 0x68, 0xf3, 0xfd, 0x89, 0xad, 0x9f, 0xf7, 0x69, 0xf9, - 0xbf, 0xbb, 0x8c, 0x35, 0xbb, 0x7b, 0x8c, 0xd6, 0x84, 0x30, 0x63, 0x25, 0xef, 0x1f, 0x97, 0x31, - 0x9f, 0x80, 0x52, 0x86, 0xa9, 0xae, 0xa9, 0x77, 0xba, 0xdb, 0x96, 0xd3, 0x3d, 0x35, 0xd9, 0xe3, - 0x27, 0x19, 0x4d, 0xad, 0xc6, 0xfe, 0xd1, 0x82, 0xbf, 0x95, 0x27, 0xc2, 0x89, 0x5d, 0x72, 0xf1, - 0xba, 0xfa, 0x80, 0xd1, 0x75, 0x0c, 0x73, 0xcb, 0x8b, 0x31, 0x4b, 0x7b, 0x9b, 0xfe, 0x1f, 0x95, - 0x79, 0x76, 0x62, 0x0a, 0x48, 0xdb, 0x44, 0xbd, 0x9b, 0x75, 0xb4, 0xd8, 0xd0, 0x41, 0xa9, 0xa7, - 0x40, 0xd6, 0xfd, 0x44, 0x7a, 0xa7, 0xb9, 0xfe, 0x0b, 0x81, 0xbd, 0xba, 0x43, 0x1a, 0xb0, 0xfb, - 0x53, 0x4f, 0x07, 0x37, 0xd3, 0xdb, 0xc1, 0xb9, 0x0d, 0xdc, 0xe8, 0xae, 0x19, 0x5b, 0xd4, 0xba, - 0x62, 0xfe, 0xf0, 0xe1, 0x24, 0x3a, 0x1b, 0xad, 0xe0, 0x8b, 0xf4, 0x06, 0x8d, 0xa3, 0xde, 0x6c, - 0xd4, 0x4b, 0x41, 0xd7, 0xc3, 0x4c, 0xb8, 0x91, 0xd1, 0x5b, 0x47, 0x8d, 0xc0, 0x36, 0x63, 0x6f, - 0xe8, 0x3a, 0x98, 0xe3, 0x75, 0x3a, 0x34, 0x04, 0xc9, 0x5e, 0x57, 0x88, 0xae, 0x85, 0xa3, 0x3d, - 0x0d, 0xcb, 0x8b, 0x39, 0x92, 0x09, 0x62, 0x8e, 0x5c, 0x03, 0x10, 0x68, 0x71, 0x5f, 0x32, 0x57, - 0xc3, 0x94, 0xaf, 0x97, 0x7d, 0x33, 0x7c, 0x35, 0x03, 0x93, 0x9e, 0xb2, 0xf5, 0xcb, 0xe0, 0x8e, - 0x3f, 0x66, 0x68, 0x83, 0x81, 0x4d, 0xc3, 0xb9, 0x34, 0x77, 0x9c, 0x09, 0xdc, 0x7a, 0xeb, 0x86, - 0xd3, 0xf6, 0x8e, 0xc6, 0xf5, 0x26, 0x2b, 0xeb, 0x00, 0x06, 0xc1, 0xa8, 0x1e, 0x9c, 0x95, 0xbb, - 0x25, 0x41, 0x7b, 0xa0, 0xfa, 0x10, 0xa2, 0x71, 0xe6, 0xc7, 0xd8, 0x41, 0xb6, 0x29, 0xc8, 0xd1, - 0x40, 0xeb, 0x47, 0x94, 0x39, 0x00, 0xf5, 0x69, 0xeb, 0xaa, 0x56, 0x56, 0x2b, 0x25, 0xb5, 0x90, - 0x41, 0x2f, 0x95, 0x60, 0xca, 0x6f, 0x04, 0x7d, 0x2b, 0xa9, 0x32, 0xd5, 0x1a, 0x78, 0xb1, 0xe3, - 0xfe, 0x46, 0x15, 0x56, 0xb2, 0x27, 0xc3, 0xe5, 0xbb, 0x5d, 0xbc, 0x64, 0xd8, 0x5d, 0x47, 0xb3, - 0x2e, 0x2e, 0x59, 0xb6, 0x1f, 0x55, 0x99, 0x45, 0x38, 0x8d, 0xfa, 0xec, 0x5a, 0x1c, 0x2d, 0x4c, - 0x0e, 0x4d, 0x61, 0x9b, 0xad, 0x1c, 0x07, 0x09, 0x2e, 0x5d, 0xc7, 0xd6, 0xcd, 0x6e, 0xc7, 0xea, - 0x62, 0xcd, 0xba, 0xd8, 0x2d, 0x9a, 0xad, 0x92, 0xd5, 0xde, 0xdd, 0x31, 0xbb, 0xcc, 0x66, 0x88, - 0xfa, 0xec, 0x4a, 0x87, 0x5c, 0xdb, 0x3a, 0x07, 0x50, 0xaa, 0xae, 0xae, 0xaa, 0xa5, 0x7a, 0xb9, - 0x5a, 0x29, 0x1c, 0x71, 0xa5, 0x55, 0x2f, 0x2e, 0xac, 0xba, 0xd2, 0xf9, 0x59, 0x98, 0xf4, 0xda, - 0x34, 0x0b, 0x93, 0x92, 0xf1, 0xc2, 0xa4, 0x28, 0x45, 0x98, 0xf4, 0x5a, 0x39, 0x1b, 0x11, 0x1e, - 0xdd, 0x7b, 0x2c, 0x76, 0x47, 0xb7, 0x1d, 0xe2, 0x4f, 0xed, 0x11, 0x59, 0xd0, 0xbb, 0x58, 0xf3, - 0x7f, 0x3b, 0xf3, 0x38, 0xc6, 0x81, 0x02, 0x73, 0xc5, 0xd5, 0xd5, 0x46, 0x55, 0x6b, 0x54, 0xaa, - 0xf5, 0x95, 0x72, 0x65, 0x99, 0x8e, 0x90, 0xe5, 0xe5, 0x4a, 0x55, 0x53, 0xe9, 0x00, 0x59, 0x2b, - 0x64, 0xe8, 0xb5, 0xc1, 0x0b, 0x93, 0x90, 0xef, 0x10, 0xe9, 0xa2, 0x2f, 0xc9, 0x09, 0xcf, 0xc3, - 0xfb, 0x38, 0x45, 0x5c, 0x6c, 0xca, 0xf9, 0xa4, 0x4b, 0x7d, 0xce, 0x8c, 0x9e, 0x81, 0x19, 0x6a, - 0xeb, 0x75, 0xc9, 0xf2, 0x3e, 0x41, 0x4e, 0xd6, 0xb8, 0x34, 0xf4, 0x11, 0x29, 0xc1, 0x21, 0xf9, - 0xbe, 0x1c, 0x25, 0x33, 0x2e, 0xfe, 0x3c, 0x33, 0xdc, 0xb5, 0x04, 0xe5, 0x4a, 0x5d, 0xd5, 0x2a, - 0xc5, 0x55, 0x96, 0x45, 0x56, 0x4e, 0xc1, 0xf1, 0x4a, 0x95, 0xc5, 0xfc, 0xab, 0x35, 0xea, 0xd5, - 0x46, 0x79, 0x6d, 0xbd, 0xaa, 0xd5, 0x0b, 0x39, 0xe5, 0x24, 0x28, 0xf4, 0xb9, 0x51, 0xae, 0x35, - 0x4a, 0xc5, 0x4a, 0x49, 0x5d, 0x55, 0x17, 0x0b, 0x79, 0xe5, 0x31, 0x70, 0x2d, 0xbd, 0xe6, 0xa6, - 0xba, 0xd4, 0xd0, 0xaa, 0xe7, 0x6a, 0x2e, 0x82, 0x9a, 0xba, 0x5a, 0x74, 0x15, 0x29, 0x74, 0x7d, - 0xf0, 0x84, 0x72, 0x19, 0x1c, 0x25, 0x57, 0x83, 0xaf, 0x56, 0x8b, 0x8b, 0xac, 0xbc, 0x49, 0xe5, - 0x2a, 0x38, 0x55, 0xae, 0xd4, 0x36, 0x96, 0x96, 0xca, 0xa5, 0xb2, 0x5a, 0xa9, 0x37, 0xd6, 0x55, - 0x6d, 0xad, 0x5c, 0xab, 0xb9, 0xff, 0x16, 0xa6, 0xc8, 0xe5, 0xac, 0xb4, 0xcf, 0x44, 0xef, 0x96, - 0x61, 0xf6, 0xac, 0xde, 0x36, 0xdc, 0x81, 0x82, 0xdc, 0xda, 0xdc, 0x73, 0x9c, 0xc4, 0x21, 0xb7, - 0x3b, 0x33, 0x87, 0x74, 0xf2, 0x82, 0x7e, 0x51, 0x4e, 0x78, 0x9c, 0x84, 0x01, 0x41, 0x4b, 0x9c, - 0xe7, 0x4a, 0x8b, 0x98, 0xfc, 0xbc, 0x5a, 0x4a, 0x70, 0x9c, 0x44, 0x9c, 0x7c, 0x32, 0xf0, 0x5f, - 0x36, 0x2a, 0xf0, 0x0b, 0x30, 0xb3, 0x51, 0x29, 0x6e, 0xd4, 0x57, 0xaa, 0x5a, 0xf9, 0xa7, 0x49, - 0x34, 0xf2, 0x59, 0x98, 0x5a, 0xaa, 0x6a, 0x0b, 0xe5, 0xc5, 0x45, 0xb5, 0x52, 0xc8, 0x29, 0x97, - 0xc3, 0x65, 0x35, 0x55, 0x3b, 0x5b, 0x2e, 0xa9, 0x8d, 0x8d, 0x4a, 0xf1, 0x6c, 0xb1, 0xbc, 0x4a, - 0xfa, 0x88, 0x7c, 0xcc, 0x8d, 0xd3, 0x13, 0xe8, 0xe7, 0xb3, 0x00, 0xb4, 0xea, 0xe4, 0x32, 0x9e, - 0xd0, 0xbd, 0xc4, 0x9f, 0x4f, 0x3a, 0x69, 0x08, 0xc8, 0x44, 0xb4, 0xdf, 0x32, 0x4c, 0xda, 0xec, - 0x03, 0x5b, 0x5e, 0x19, 0x44, 0x87, 0x3e, 0x7a, 0xd4, 0x34, 0xff, 0x77, 0xf4, 0x9e, 0x24, 0x73, - 0x84, 0x48, 0xc6, 0x92, 0x21, 0xb9, 0x34, 0x1a, 0x20, 0xd1, 0xf3, 0x32, 0x30, 0xc7, 0x57, 0xcc, - 0xad, 0x04, 0x31, 0xa6, 0xc4, 0x2a, 0xc1, 0xff, 0x1c, 0x32, 0xb2, 0xce, 0x3c, 0x81, 0x0d, 0xa7, - 0xe0, 0xb5, 0x4c, 0x7a, 0x32, 0xdc, 0xb3, 0x58, 0x0a, 0x19, 0x97, 0x79, 0xd7, 0xe8, 0x28, 0x48, - 0xca, 0x04, 0xc8, 0xf5, 0x07, 0x9c, 0x82, 0x8c, 0xbe, 0x2a, 0xc3, 0x2c, 0x77, 0xf1, 0x31, 0x7a, - 0x75, 0x46, 0xe4, 0x52, 0xd2, 0xd0, 0x95, 0xca, 0x99, 0x83, 0x5e, 0xa9, 0x7c, 0xe6, 0x66, 0x98, - 0x60, 0x69, 0x44, 0xbe, 0xd5, 0x8a, 0x6b, 0x0a, 0x1c, 0x85, 0xe9, 0x65, 0xb5, 0xde, 0xa8, 0xd5, - 0x8b, 0x5a, 0x5d, 0x5d, 0x2c, 0x64, 0xdc, 0x81, 0x4f, 0x5d, 0x5b, 0xaf, 0xdf, 0x57, 0x90, 0x92, - 0x7b, 0xe8, 0xf5, 0x32, 0x32, 0x66, 0x0f, 0xbd, 0xb8, 0xe2, 0xd3, 0x9f, 0xab, 0x7e, 0x5a, 0x86, - 0x02, 0xe5, 0x40, 0x7d, 0xa0, 0x83, 0x6d, 0x03, 0x9b, 0x4d, 0x8c, 0x2e, 0x88, 0x44, 0x04, 0xdd, - 0x17, 0x2b, 0x8f, 0xf4, 0xe7, 0x21, 0x2b, 0x91, 0xbe, 0xf4, 0x18, 0xd8, 0xd9, 0x7d, 0x06, 0xf6, - 0xa7, 0x92, 0xba, 0xe8, 0xf5, 0xb2, 0x3b, 0x12, 0xc8, 0x3e, 0x9e, 0xc4, 0x45, 0x6f, 0x00, 0x07, - 0x63, 0x09, 0xf4, 0x1b, 0x31, 0xfe, 0x16, 0x64, 0xf4, 0x5c, 0x19, 0x8e, 0x2e, 0xea, 0x0e, 0x5e, - 0xb8, 0x54, 0xf7, 0x2e, 0x26, 0x8c, 0xb8, 0x4c, 0x38, 0xb3, 0xef, 0x32, 0xe1, 0xe0, 0x6e, 0x43, - 0xa9, 0xe7, 0x6e, 0x43, 0xf4, 0x8e, 0xa4, 0x87, 0xfa, 0x7a, 0x78, 0x18, 0x59, 0x34, 0xde, 0x64, - 0x87, 0xf5, 0xe2, 0xb9, 0x18, 0xc3, 0xdd, 0xfe, 0x53, 0x50, 0xa0, 0xac, 0x84, 0xbc, 0xd0, 0x7e, - 0x9d, 0xdd, 0xbf, 0xdd, 0x48, 0x10, 0xf4, 0xcf, 0x0b, 0xa3, 0x20, 0xf1, 0x61, 0x14, 0xb8, 0x45, - 0x4d, 0xb9, 0xd7, 0x73, 0x20, 0x69, 0x67, 0x18, 0x72, 0x39, 0x8b, 0x8e, 0xb3, 0x9a, 0x5e, 0x67, - 0x18, 0x5b, 0xfc, 0x78, 0xee, 0x88, 0x65, 0xf7, 0x3c, 0xaa, 0xa2, 0xc8, 0xc4, 0x5f, 0x85, 0x9d, - 0xd4, 0xff, 0x98, 0x73, 0xf9, 0x8b, 0xb9, 0x1f, 0x3a, 0x3d, 0xff, 0xe3, 0x41, 0x1c, 0xa4, 0x8f, - 0xc2, 0x0f, 0x24, 0xc8, 0xd6, 0x2c, 0xdb, 0x19, 0x15, 0x06, 0x49, 0xf7, 0x4c, 0x43, 0x12, 0xa8, - 0x45, 0xcf, 0x39, 0xd3, 0xdb, 0x33, 0x8d, 0x2f, 0x7f, 0x0c, 0x71, 0x13, 0x8f, 0xc2, 0x1c, 0xe5, - 0xc4, 0xbf, 0x54, 0xe4, 0xfb, 0x12, 0xed, 0xaf, 0xee, 0x15, 0x45, 0xe4, 0x0c, 0xcc, 0x84, 0xf6, - 0x2c, 0x3d, 0x50, 0xb8, 0x34, 0xf4, 0xfa, 0x30, 0x2e, 0x8b, 0x3c, 0x2e, 0xfd, 0x66, 0xdc, 0xfe, - 0xbd, 0x1c, 0xa3, 0xea, 0x99, 0x92, 0x84, 0x60, 0x8c, 0x29, 0x3c, 0x7d, 0x44, 0x1e, 0x94, 0x21, - 0xcf, 0x7c, 0xc6, 0x46, 0x8a, 0x40, 0xd2, 0x96, 0xe1, 0x0b, 0x41, 0xcc, 0xb7, 0x4c, 0x1e, 0x75, - 0xcb, 0x88, 0x2f, 0x3f, 0x7d, 0x1c, 0xfe, 0x9d, 0x39, 0x43, 0x16, 0xf7, 0x74, 0xa3, 0xad, 0x9f, - 0x6f, 0x27, 0x08, 0x7d, 0xfc, 0x91, 0x84, 0xc7, 0xbf, 0xfc, 0xaa, 0x72, 0xe5, 0x45, 0x48, 0xfc, - 0x27, 0x60, 0xca, 0xf6, 0x97, 0x24, 0xbd, 0xd3, 0xf1, 0x3d, 0x8e, 0xa8, 0xec, 0xbb, 0x16, 0xe4, - 0x4c, 0x74, 0xd6, 0x4b, 0x88, 0x9f, 0xb1, 0x9c, 0x4d, 0x99, 0x2e, 0xb6, 0x5a, 0x4b, 0x58, 0x77, - 0x76, 0x6d, 0xdc, 0x4a, 0x34, 0x44, 0xf0, 0x22, 0x9a, 0x0a, 0x4b, 0x82, 0x0b, 0x3e, 0xb8, 0xca, - 0xa3, 0xf3, 0xa4, 0x01, 0xbd, 0x81, 0xc7, 0xcb, 0x48, 0xba, 0xa4, 0x37, 0xfb, 0x90, 0x54, 0x39, - 0x48, 0x9e, 0x32, 0x1c, 0x13, 0x63, 0xb8, 0xd0, 0x5d, 0x86, 0x39, 0x6a, 0x27, 0x8c, 0x1a, 0x93, - 0x3f, 0x48, 0xe8, 0x63, 0x12, 0xba, 0xb6, 0x29, 0xcc, 0xce, 0x48, 0x60, 0x49, 0xe2, 0x91, 0x22, - 0xc6, 0x47, 0xfa, 0xc8, 0x7c, 0x36, 0x0f, 0x10, 0xf2, 0x1b, 0xfc, 0x48, 0x3e, 0x08, 0x04, 0x88, - 0xde, 0xca, 0xe6, 0x1f, 0x35, 0x2e, 0x2a, 0x75, 0xc8, 0x27, 0xd0, 0xdf, 0x90, 0xe2, 0x13, 0x85, - 0x46, 0x95, 0x3f, 0x4f, 0x68, 0xf3, 0x32, 0xaf, 0xbd, 0x81, 0x83, 0xfb, 0x90, 0xbd, 0xdc, 0x47, - 0x13, 0x18, 0xbf, 0x83, 0x58, 0x49, 0x86, 0xda, 0xea, 0x10, 0x33, 0xfb, 0x53, 0x70, 0x5c, 0x53, - 0x8b, 0x8b, 0xd5, 0xca, 0xea, 0x7d, 0xe1, 0x3b, 0x7c, 0x0a, 0x72, 0x78, 0x72, 0x92, 0x0a, 0x6c, - 0xaf, 0x49, 0xd8, 0x07, 0xf2, 0xb2, 0x8a, 0xbd, 0xa1, 0xfe, 0xe3, 0x09, 0x7a, 0x35, 0x01, 0xb2, - 0x87, 0x89, 0xc2, 0x83, 0x10, 0x6a, 0x46, 0xcf, 0x91, 0xa1, 0xe0, 0x8e, 0x87, 0x94, 0x4b, 0x76, - 0x59, 0x5b, 0x95, 0x77, 0x2b, 0xec, 0xd0, 0xfd, 0xa7, 0xc0, 0xad, 0xd0, 0x4b, 0x50, 0xae, 0x87, - 0xb9, 0xe6, 0x36, 0x6e, 0x5e, 0x28, 0x9b, 0xde, 0xbe, 0x3a, 0xdd, 0x84, 0xed, 0x49, 0xe5, 0x81, - 0xb9, 0x97, 0x07, 0x86, 0x9f, 0x44, 0x73, 0x83, 0x74, 0x98, 0xa9, 0x08, 0x5c, 0xfe, 0xc8, 0xc7, - 0xa5, 0xc2, 0xe1, 0x72, 0xfb, 0x50, 0x54, 0x93, 0xc1, 0x52, 0x19, 0x02, 0x16, 0x04, 0x27, 0xab, - 0xeb, 0xf5, 0x72, 0xb5, 0xd2, 0xd8, 0xa8, 0xa9, 0x8b, 0x8d, 0x05, 0x0f, 0x9c, 0x5a, 0x41, 0x46, - 0xdf, 0x94, 0x60, 0x82, 0xb2, 0xd5, 0x45, 0x8f, 0x0d, 0x20, 0x18, 0xe8, 0x4f, 0x89, 0xde, 0x22, - 0x1c, 0x1d, 0xc1, 0x17, 0x04, 0x2b, 0x27, 0xa2, 0x9f, 0x7a, 0x32, 0x4c, 0x50, 0x90, 0xbd, 0x15, - 0xad, 0xd3, 0x11, 0xbd, 0x14, 0x23, 0xa3, 0x79, 0xd9, 0x05, 0x23, 0x25, 0x0c, 0x60, 0x23, 0xfd, - 0x91, 0xe5, 0x19, 0x59, 0x6a, 0x06, 0x9f, 0x33, 0x9c, 0x6d, 0xe2, 0x6e, 0x89, 0x7e, 0x4a, 0x64, - 0x79, 0xf1, 0x26, 0xc8, 0xed, 0xb9, 0xb9, 0x07, 0xb8, 0xae, 0xd2, 0x4c, 0xe8, 0x65, 0xc2, 0x81, - 0x39, 0x39, 0xfd, 0xf4, 0x79, 0x8a, 0x00, 0x67, 0x0d, 0xb2, 0x6d, 0xa3, 0xeb, 0xb0, 0xf1, 0xe3, - 0xb6, 0x44, 0x84, 0xbc, 0x87, 0xb2, 0x83, 0x77, 0x34, 0x42, 0x06, 0xdd, 0x03, 0x33, 0xe1, 0x54, - 0x01, 0xf7, 0xdd, 0x53, 0x30, 0xc1, 0x8e, 0x95, 0xb1, 0x25, 0x56, 0xef, 0x55, 0x70, 0x59, 0x53, - 0xa8, 0xb6, 0xe9, 0xeb, 0xc0, 0xff, 0x7d, 0x14, 0x26, 0x56, 0x8c, 0xae, 0x63, 0xd9, 0x97, 0xd0, - 0xc3, 0x19, 0x98, 0x38, 0x8b, 0xed, 0xae, 0x61, 0x99, 0xfb, 0x5c, 0x0d, 0xae, 0x81, 0xe9, 0x8e, - 0x8d, 0xf7, 0x0c, 0x6b, 0xb7, 0x1b, 0x2c, 0xce, 0x84, 0x93, 0x14, 0x04, 0x93, 0xfa, 0xae, 0xb3, - 0x6d, 0xd9, 0x41, 0x34, 0x0a, 0xef, 0x5d, 0x39, 0x0d, 0x40, 0x9f, 0x2b, 0xfa, 0x0e, 0x66, 0x0e, - 0x14, 0xa1, 0x14, 0x45, 0x81, 0xac, 0x63, 0xec, 0x60, 0x16, 0x9e, 0x96, 0x3c, 0xbb, 0x02, 0x26, - 0xa1, 0xde, 0x58, 0x48, 0x3d, 0x59, 0xf3, 0x5e, 0xd1, 0x17, 0x64, 0x98, 0x5e, 0xc6, 0x0e, 0x63, - 0xb5, 0x8b, 0x9e, 0x9f, 0x11, 0xba, 0x11, 0xc2, 0x1d, 0x63, 0xdb, 0x7a, 0xd7, 0xfb, 0xcf, 0x5f, - 0x82, 0xe5, 0x13, 0x83, 0x58, 0xb9, 0x72, 0x38, 0x50, 0x36, 0x09, 0x9c, 0xe6, 0x94, 0xa9, 0x5f, - 0x26, 0xcb, 0xcc, 0x36, 0x41, 0xf6, 0x7f, 0x40, 0xef, 0x94, 0x44, 0x0f, 0x1d, 0x33, 0xd9, 0xcf, - 0x87, 0xea, 0x13, 0xd9, 0x1d, 0x4d, 0xee, 0xb1, 0x1c, 0xfb, 0x62, 0xa0, 0x87, 0x29, 0x31, 0x32, - 0x9a, 0x9f, 0x5b, 0xf0, 0xb8, 0xf2, 0x60, 0x4e, 0xd2, 0xd7, 0xc6, 0xef, 0xca, 0x30, 0x5d, 0xdb, - 0xb6, 0x2e, 0x7a, 0x72, 0xfc, 0x59, 0x31, 0x60, 0xaf, 0x82, 0xa9, 0xbd, 0x1e, 0x50, 0x83, 0x84, - 0xe8, 0x3b, 0xda, 0xd1, 0xb3, 0xe5, 0xa4, 0x30, 0x85, 0x98, 0x1b, 0xf9, 0x0d, 0xea, 0xca, 0x93, - 0x60, 0x82, 0x71, 0xcd, 0x96, 0x5c, 0xe2, 0x01, 0xf6, 0x32, 0x87, 0x2b, 0x98, 0xe5, 0x2b, 0x98, - 0x0c, 0xf9, 0xe8, 0xca, 0xa5, 0x8f, 0xfc, 0x9f, 0x48, 0x24, 0x58, 0x85, 0x07, 0x7c, 0x69, 0x04, - 0xc0, 0xa3, 0xef, 0x65, 0x44, 0x17, 0x26, 0x7d, 0x09, 0xf8, 0x1c, 0x1c, 0xe8, 0xb6, 0x97, 0x81, - 0xe4, 0xd2, 0x97, 0xe7, 0x4b, 0xb3, 0x30, 0xb3, 0x68, 0x6c, 0x6e, 0xfa, 0x9d, 0xe4, 0x0b, 0x04, - 0x3b, 0xc9, 0x68, 0x77, 0x00, 0xd7, 0xce, 0xdd, 0xb5, 0x6d, 0x6c, 0x7a, 0x95, 0x62, 0xcd, 0xa9, - 0x27, 0x55, 0xb9, 0x01, 0x8e, 0x7a, 0xe3, 0x42, 0xb8, 0xa3, 0x9c, 0xd2, 0x7a, 0x93, 0xd1, 0x77, - 0x84, 0x77, 0xb5, 0x3c, 0x89, 0x86, 0xab, 0x14, 0xd1, 0x00, 0xef, 0x80, 0xd9, 0x6d, 0x9a, 0x9b, - 0x4c, 0xfd, 0xbd, 0xce, 0xf2, 0x64, 0x4f, 0x30, 0xe0, 0x35, 0xdc, 0xed, 0xea, 0x5b, 0x58, 0xe3, - 0x33, 0xf7, 0x34, 0x5f, 0x39, 0xc9, 0xd5, 0x56, 0x62, 0x1b, 0x64, 0x02, 0x35, 0x19, 0x83, 0x76, - 0x9c, 0x81, 0xec, 0x92, 0xd1, 0xc6, 0xe8, 0x97, 0x25, 0x98, 0xd2, 0x70, 0xd3, 0x32, 0x9b, 0xee, - 0x5b, 0xc8, 0x39, 0xe8, 0x1f, 0x33, 0xa2, 0x57, 0x3a, 0xba, 0x74, 0xe6, 0x7d, 0x1a, 0x11, 0xed, - 0x46, 0xec, 0xea, 0xc6, 0x58, 0x52, 0x63, 0xb8, 0x80, 0xc3, 0x9d, 0x7a, 0x6c, 0x6e, 0xb6, 0x2d, - 0x9d, 0x5b, 0xfc, 0xea, 0x35, 0x85, 0x6e, 0x84, 0x82, 0x77, 0x06, 0xc4, 0x72, 0xd6, 0x0d, 0xd3, - 0xf4, 0x0f, 0x19, 0xef, 0x4b, 0xe7, 0xf7, 0x6d, 0x63, 0xe3, 0xb4, 0x90, 0xba, 0xb3, 0xd2, 0x23, - 0x34, 0xfb, 0x7a, 0x98, 0x3b, 0x7f, 0xc9, 0xc1, 0x5d, 0x96, 0x8b, 0x15, 0x9b, 0xd5, 0x7a, 0x52, - 0x43, 0x51, 0x96, 0xe3, 0xe2, 0xb9, 0xc4, 0x14, 0x98, 0x4c, 0xd4, 0x2b, 0x43, 0xcc, 0x00, 0x8f, - 0x43, 0xa1, 0x52, 0x5d, 0x54, 0x89, 0xaf, 0x9a, 0xe7, 0xfd, 0xb3, 0x85, 0x5e, 0x28, 0xc3, 0x0c, - 0x71, 0x26, 0xf1, 0x50, 0xb8, 0x56, 0x60, 0x3e, 0x82, 0xbe, 0x2c, 0xec, 0xc7, 0x46, 0xaa, 0x1c, - 0x2e, 0x20, 0x5a, 0xd0, 0x9b, 0x46, 0xbb, 0x57, 0xd0, 0x39, 0xad, 0x27, 0xb5, 0x0f, 0x20, 0x72, - 0x5f, 0x40, 0x7e, 0x4f, 0xc8, 0x99, 0x6d, 0x10, 0x77, 0x87, 0x85, 0xca, 0xef, 0xcb, 0x30, 0xed, - 0x4e, 0x52, 0x3c, 0x50, 0xaa, 0x1c, 0x28, 0x96, 0xd9, 0xbe, 0x14, 0x2c, 0x8b, 0x78, 0xaf, 0x89, - 0x1a, 0xc9, 0x5f, 0x0a, 0xcf, 0xdc, 0x89, 0x88, 0x42, 0xbc, 0x8c, 0x09, 0xbf, 0xf7, 0x0a, 0xcd, - 0xe7, 0x07, 0x30, 0x77, 0x58, 0xf0, 0x7d, 0x3d, 0x07, 0xf9, 0x8d, 0x0e, 0x41, 0xee, 0x65, 0xb2, - 0x48, 0xc4, 0xf2, 0x7d, 0x07, 0x19, 0x5c, 0x33, 0xab, 0x6d, 0x35, 0xf5, 0xf6, 0x7a, 0x70, 0x22, - 0x2c, 0x48, 0x50, 0x6e, 0x67, 0xbe, 0x8d, 0xf4, 0xb8, 0xdd, 0xf5, 0xb1, 0xc1, 0xbc, 0x89, 0x8c, - 0x42, 0x87, 0x46, 0x6e, 0x82, 0x63, 0x2d, 0xa3, 0xab, 0x9f, 0x6f, 0x63, 0xd5, 0x6c, 0xda, 0x97, - 0xa8, 0x38, 0xd8, 0xb4, 0x6a, 0xdf, 0x07, 0xe5, 0x4e, 0xc8, 0x75, 0x9d, 0x4b, 0x6d, 0x3a, 0x4f, - 0x0c, 0x9f, 0x31, 0x89, 0x2c, 0xaa, 0xe6, 0x66, 0xd7, 0xe8, 0x5f, 0x61, 0x17, 0xa5, 0x09, 0xc1, - 0xfb, 0x9c, 0x9f, 0x00, 0x79, 0xcb, 0x36, 0xb6, 0x0c, 0x7a, 0x3f, 0xcf, 0xdc, 0xbe, 0x98, 0x75, - 0xd4, 0x14, 0xa8, 0x92, 0x2c, 0x1a, 0xcb, 0xaa, 0x3c, 0x09, 0xa6, 0x8c, 0x1d, 0x7d, 0x0b, 0xdf, - 0x6b, 0x98, 0xf4, 0x44, 0xdf, 0xdc, 0xad, 0xa7, 0xf6, 0x1d, 0x9f, 0x61, 0xdf, 0xb5, 0x20, 0x2b, - 0x7a, 0xaf, 0x24, 0x1a, 0x58, 0x87, 0xd4, 0x8d, 0x82, 0x3a, 0x96, 0x7b, 0xad, 0xd1, 0x2b, 0x85, - 0x42, 0xde, 0x44, 0xb3, 0x95, 0xfe, 0xe0, 0xfd, 0x39, 0x09, 0x26, 0x17, 0xad, 0x8b, 0x26, 0x51, - 0xf4, 0xdb, 0xc4, 0x6c, 0xdd, 0x3e, 0x87, 0x1c, 0xf9, 0x6b, 0x23, 0x63, 0x4f, 0x34, 0x90, 0xda, - 0x7a, 0x45, 0x46, 0xc0, 0x10, 0xdb, 0x72, 0x04, 0x2f, 0xf3, 0x8b, 0x2b, 0x27, 0x7d, 0xb9, 0xfe, - 0xa9, 0x0c, 0xd9, 0x45, 0xdb, 0xea, 0xa0, 0x37, 0x67, 0x12, 0xb8, 0x2c, 0xb4, 0x6c, 0xab, 0x53, - 0x27, 0xb7, 0x71, 0x05, 0xc7, 0x38, 0xc2, 0x69, 0xca, 0x6d, 0x30, 0xd9, 0xb1, 0xba, 0x86, 0xe3, - 0x4d, 0x23, 0xe6, 0x6e, 0x7d, 0x54, 0xdf, 0xd6, 0xbc, 0xce, 0x32, 0x69, 0x7e, 0x76, 0xb7, 0xd7, - 0x26, 0x22, 0x74, 0xe5, 0xe2, 0x8a, 0xd1, 0xbb, 0x91, 0xac, 0x27, 0x15, 0xbd, 0x28, 0x8c, 0xe4, - 0x53, 0x78, 0x24, 0x1f, 0xdd, 0x47, 0xc2, 0xb6, 0xd5, 0x19, 0xc9, 0x26, 0xe3, 0xcb, 0x7d, 0x54, - 0x9f, 0xca, 0xa1, 0x7a, 0xa3, 0x50, 0x99, 0xe9, 0x23, 0xfa, 0xde, 0x2c, 0x00, 0x31, 0x33, 0x36, - 0xdc, 0x09, 0x90, 0x98, 0x8d, 0xf5, 0x4b, 0xd9, 0x90, 0x2c, 0x8b, 0xbc, 0x2c, 0x1f, 0x1b, 0x61, - 0xc5, 0x10, 0xf2, 0x11, 0x12, 0x2d, 0x42, 0x6e, 0xd7, 0xfd, 0xcc, 0x24, 0x2a, 0x48, 0x82, 0xbc, - 0x6a, 0xf4, 0x4f, 0xf4, 0x27, 0x19, 0xc8, 0x91, 0x04, 0xe5, 0x34, 0x00, 0x19, 0xd8, 0xe9, 0x81, - 0xa0, 0x0c, 0x19, 0xc2, 0x43, 0x29, 0x44, 0x5b, 0x8d, 0x16, 0xfb, 0x4c, 0x4d, 0xe6, 0x20, 0xc1, - 0xfd, 0x9b, 0x0c, 0xf7, 0x84, 0x16, 0x33, 0x00, 0x42, 0x29, 0xee, 0xdf, 0xe4, 0x6d, 0x15, 0x6f, - 0xd2, 0x40, 0xc9, 0x59, 0x2d, 0x48, 0xf0, 0xff, 0x5e, 0xf5, 0xaf, 0xd7, 0xf2, 0xfe, 0x26, 0x29, - 0xee, 0x64, 0x98, 0xa8, 0xe5, 0x42, 0x50, 0x44, 0x9e, 0x64, 0xea, 0x4d, 0x46, 0xaf, 0xf1, 0xd5, - 0x66, 0x91, 0x53, 0x9b, 0x5b, 0x12, 0x88, 0x37, 0x7d, 0xe5, 0xf9, 0x6a, 0x0e, 0xa6, 0x2a, 0x56, - 0x8b, 0xe9, 0x4e, 0x68, 0xc2, 0xf8, 0xf1, 0x5c, 0xa2, 0x09, 0xa3, 0x4f, 0x23, 0x42, 0x41, 0xee, - 0xe6, 0x15, 0x44, 0x8c, 0x42, 0x58, 0x3f, 0x94, 0x05, 0xc8, 0x13, 0xed, 0xdd, 0x7f, 0x6f, 0x53, - 0x1c, 0x09, 0x22, 0x5a, 0x8d, 0xfd, 0xf9, 0x1f, 0x4e, 0xc7, 0xfe, 0x2b, 0xe4, 0x48, 0x05, 0x63, - 0x76, 0x77, 0xf8, 0x8a, 0x4a, 0xf1, 0x15, 0x95, 0xe3, 0x2b, 0x9a, 0xed, 0xad, 0x68, 0x92, 0x75, - 0x80, 0x28, 0x0d, 0x49, 0x5f, 0xc7, 0xff, 0x61, 0x02, 0xa0, 0xa2, 0xef, 0x19, 0x5b, 0x74, 0x77, - 0xf8, 0x0b, 0xde, 0xfc, 0x87, 0xed, 0xe3, 0xfe, 0xb7, 0xd0, 0x40, 0x78, 0x1b, 0x4c, 0xb0, 0x71, - 0x8f, 0x55, 0xe4, 0x6a, 0xae, 0x22, 0x01, 0x15, 0x6a, 0x96, 0x3e, 0xe0, 0x68, 0x5e, 0x7e, 0xee, - 0x8a, 0x59, 0xa9, 0xe7, 0x8a, 0xd9, 0xfe, 0x7b, 0x10, 0x11, 0x17, 0xcf, 0xa2, 0x77, 0x09, 0x7b, - 0xf4, 0x87, 0xf8, 0x09, 0xd5, 0x28, 0xa2, 0x09, 0x3e, 0x01, 0x26, 0x2c, 0x7f, 0x43, 0x5b, 0x8e, - 0x5c, 0x07, 0x2b, 0x9b, 0x9b, 0x96, 0xe6, 0xe5, 0x14, 0xdc, 0xfc, 0x12, 0xe2, 0x63, 0x2c, 0x87, - 0x66, 0x4e, 0x2e, 0x7b, 0x41, 0xa7, 0xdc, 0x7a, 0x9c, 0x33, 0x9c, 0xed, 0x55, 0xc3, 0xbc, 0xd0, - 0x45, 0xff, 0x59, 0xcc, 0x82, 0x0c, 0xe1, 0x2f, 0x25, 0xc3, 0x9f, 0x8f, 0xd9, 0x51, 0xe3, 0x51, - 0xbb, 0x33, 0x8a, 0x4a, 0x7f, 0x6e, 0x23, 0x00, 0xbc, 0x1d, 0xf2, 0x94, 0x51, 0xd6, 0x89, 0x9e, - 0x89, 0xc4, 0xcf, 0xa7, 0xa4, 0xb1, 0x3f, 0xd0, 0x3b, 0x7d, 0x1c, 0xcf, 0x72, 0x38, 0x2e, 0x1c, - 0x88, 0xb3, 0xd4, 0x21, 0x3d, 0xf3, 0x78, 0x98, 0x60, 0x92, 0x56, 0xe6, 0xc2, 0xad, 0xb8, 0x70, - 0x44, 0x01, 0xc8, 0xaf, 0x59, 0x7b, 0xb8, 0x6e, 0x15, 0x32, 0xee, 0xb3, 0xcb, 0x5f, 0xdd, 0x2a, - 0x48, 0xe8, 0x15, 0x93, 0x30, 0xe9, 0x47, 0xfb, 0xf9, 0x9c, 0x04, 0x85, 0x92, 0x8d, 0x75, 0x07, - 0x2f, 0xd9, 0xd6, 0x0e, 0xad, 0x91, 0xb8, 0x77, 0xe8, 0x6f, 0x0a, 0xbb, 0x78, 0xf8, 0x51, 0x78, - 0x7a, 0x0b, 0x8b, 0xc0, 0x92, 0x2e, 0x42, 0x4a, 0xde, 0x22, 0x24, 0x7a, 0x93, 0x90, 0xcb, 0x87, - 0x68, 0x29, 0xe9, 0x37, 0xb5, 0x4f, 0x49, 0x90, 0x2b, 0xb5, 0x2d, 0x13, 0x87, 0x8f, 0x30, 0x0d, - 0x3c, 0x2b, 0xd3, 0x7f, 0x27, 0x02, 0x3d, 0x43, 0x12, 0xb5, 0x35, 0x02, 0x01, 0xb8, 0x65, 0x0b, - 0xca, 0x56, 0x6c, 0x90, 0x8a, 0x25, 0x9d, 0xbe, 0x40, 0xbf, 0x29, 0xc1, 0x14, 0x8d, 0x8b, 0x53, - 0x6c, 0xb7, 0xd1, 0xa3, 0x02, 0xa1, 0xf6, 0x89, 0x98, 0x84, 0x7e, 0x4f, 0xd8, 0x45, 0xdf, 0xaf, - 0x95, 0x4f, 0x3b, 0x41, 0x80, 0xa0, 0x64, 0x1e, 0xe3, 0x62, 0x7b, 0x69, 0x03, 0x19, 0x4a, 0x5f, - 0xd4, 0x9f, 0x97, 0x5c, 0x03, 0xc0, 0xbc, 0xb0, 0x6e, 0xe3, 0x3d, 0x03, 0x5f, 0x44, 0x57, 0x06, - 0xc2, 0xde, 0x1f, 0xf4, 0xe3, 0x0d, 0xc2, 0x8b, 0x38, 0x21, 0x92, 0x91, 0x5b, 0x59, 0xd3, 0xed, - 0x20, 0x13, 0xeb, 0xc5, 0x7b, 0x23, 0xb1, 0x84, 0xc8, 0x68, 0xe1, 0xec, 0x82, 0x6b, 0x36, 0xd1, - 0x5c, 0xa4, 0x2f, 0xd8, 0x0f, 0x4c, 0xc0, 0xe4, 0x86, 0xd9, 0xed, 0xb4, 0xf5, 0xee, 0x36, 0xfa, - 0xbe, 0x0c, 0x79, 0x7a, 0x5b, 0x18, 0xfa, 0x09, 0x2e, 0xb6, 0xc0, 0xcf, 0xed, 0x62, 0xdb, 0x73, - 0xc1, 0xa1, 0x2f, 0xfd, 0x2f, 0x33, 0x47, 0xef, 0x95, 0x45, 0x27, 0xa9, 0x5e, 0xa1, 0xa1, 0x6b, - 0xe3, 0xfb, 0x1f, 0x67, 0xef, 0x18, 0x4d, 0x67, 0xd7, 0xf6, 0xaf, 0xc6, 0x7e, 0x9c, 0x18, 0x95, - 0x75, 0xfa, 0x97, 0xe6, 0xff, 0x8e, 0x74, 0x98, 0x60, 0x89, 0xfb, 0xb6, 0x93, 0xf6, 0x9f, 0xbf, - 0x3d, 0x09, 0x79, 0xdd, 0x76, 0x8c, 0xae, 0xc3, 0x36, 0x58, 0xd9, 0x9b, 0xdb, 0x5d, 0xd2, 0xa7, - 0x0d, 0xbb, 0xed, 0x45, 0x21, 0xf1, 0x13, 0xd0, 0xef, 0x0b, 0xcd, 0x1f, 0xe3, 0x6b, 0x9e, 0x0c, - 0xf2, 0x7b, 0x87, 0x58, 0xa3, 0xbe, 0x1c, 0x2e, 0xd3, 0x8a, 0x75, 0xb5, 0x41, 0x83, 0x56, 0xf8, - 0xf1, 0x29, 0x5a, 0xe8, 0x1d, 0x72, 0x68, 0xfd, 0xee, 0x12, 0x37, 0x46, 0x30, 0x29, 0x06, 0x63, - 0x84, 0x9f, 0x10, 0xb3, 0x5b, 0xcd, 0x2d, 0xc2, 0xca, 0xe2, 0x8b, 0xb0, 0xbf, 0x23, 0xbc, 0x9b, - 0xe4, 0x8b, 0x72, 0xc0, 0x1a, 0x60, 0xdc, 0x6d, 0x42, 0xef, 0x13, 0xda, 0x19, 0x1a, 0x54, 0xd2, - 0x21, 0xc2, 0xf6, 0xfa, 0x09, 0x98, 0x58, 0xd6, 0xdb, 0x6d, 0x6c, 0x5f, 0x72, 0x87, 0xa4, 0x82, - 0xc7, 0xe1, 0x9a, 0x6e, 0x1a, 0x9b, 0xb8, 0xeb, 0xc4, 0x77, 0x96, 0xef, 0x12, 0x8e, 0x54, 0xcb, - 0xca, 0x98, 0xef, 0xa5, 0x1f, 0x21, 0xf3, 0x9b, 0x21, 0x6b, 0x98, 0x9b, 0x16, 0xeb, 0x32, 0x7b, - 0x57, 0xed, 0xbd, 0x9f, 0xc9, 0xd4, 0x85, 0x64, 0x14, 0x0c, 0x56, 0x2b, 0xc8, 0x45, 0xfa, 0x3d, - 0xe7, 0xef, 0x66, 0x61, 0xd6, 0x63, 0xa2, 0x6c, 0xb6, 0xf0, 0x03, 0xe1, 0xa5, 0x98, 0x17, 0x66, - 0x45, 0x8f, 0x83, 0xf5, 0xd6, 0x87, 0x90, 0x8a, 0x10, 0x69, 0x1d, 0xa0, 0xa9, 0x3b, 0x78, 0xcb, - 0xb2, 0x0d, 0xbf, 0x3f, 0x7c, 0x62, 0x12, 0x6a, 0x25, 0xfa, 0xf7, 0x25, 0x2d, 0x44, 0x47, 0xb9, - 0x13, 0xa6, 0xb1, 0x7f, 0xfe, 0xde, 0x5b, 0xaa, 0x89, 0xc5, 0x2b, 0x9c, 0x1f, 0x7d, 0x5e, 0xe8, - 0xd4, 0x99, 0x48, 0x35, 0x93, 0x61, 0xd6, 0x18, 0xae, 0x0d, 0x6d, 0x54, 0xd6, 0x8a, 0x5a, 0x6d, - 0xa5, 0xb8, 0xba, 0x5a, 0xae, 0x2c, 0xfb, 0x81, 0x5f, 0x14, 0x98, 0x5b, 0xac, 0x9e, 0xab, 0x84, - 0x22, 0xf3, 0x64, 0xd1, 0x3a, 0x4c, 0x7a, 0xf2, 0xea, 0xe7, 0x8b, 0x19, 0x96, 0x19, 0xf3, 0xc5, - 0x0c, 0x25, 0xb9, 0xc6, 0x99, 0xd1, 0xf4, 0x1d, 0x74, 0xc8, 0x33, 0xfa, 0x63, 0x1d, 0x72, 0x64, - 0x4d, 0x1d, 0xbd, 0x8d, 0x6c, 0x03, 0x76, 0xda, 0x7a, 0x13, 0xa3, 0x9d, 0x04, 0xd6, 0xb8, 0x77, - 0x75, 0x82, 0xb4, 0xef, 0xea, 0x04, 0xf2, 0xc8, 0xac, 0xbe, 0xe3, 0xfd, 0xd6, 0xf1, 0x35, 0x9a, - 0x85, 0x3f, 0xa0, 0x15, 0xbb, 0xbb, 0x42, 0x97, 0xff, 0x19, 0x9b, 0x11, 0x2a, 0x19, 0xcd, 0x53, - 0x32, 0x4b, 0x54, 0x6c, 0x1f, 0x26, 0x8e, 0xa3, 0x31, 0x5c, 0xef, 0x9d, 0x85, 0x5c, 0xad, 0xd3, - 0x36, 0x1c, 0xf4, 0x12, 0x69, 0x24, 0x98, 0xd1, 0xeb, 0x2e, 0xe4, 0x81, 0xd7, 0x5d, 0x04, 0xbb, - 0xae, 0x59, 0x81, 0x5d, 0xd7, 0x3a, 0x7e, 0xc0, 0xe1, 0x77, 0x5d, 0x6f, 0x63, 0xc1, 0xdb, 0xe8, - 0x9e, 0xed, 0xa3, 0xfb, 0x88, 0x94, 0x54, 0xab, 0x4f, 0x54, 0xc0, 0x33, 0x8f, 0x67, 0xc1, 0xc9, - 0x00, 0xf2, 0x0b, 0xd5, 0x7a, 0xbd, 0xba, 0x56, 0x38, 0x42, 0xa2, 0xda, 0x54, 0xd7, 0x69, 0xa8, - 0x98, 0x72, 0xa5, 0xa2, 0x6a, 0x05, 0x89, 0x84, 0x4b, 0x2b, 0xd7, 0x57, 0xd5, 0x82, 0xcc, 0xc7, - 0x3e, 0x8f, 0x35, 0xbf, 0xf9, 0xb2, 0xd3, 0x54, 0x2f, 0x31, 0x43, 0x3c, 0x9a, 0x9f, 0xf4, 0x95, - 0xeb, 0x37, 0x64, 0xc8, 0xad, 0x61, 0x7b, 0x0b, 0xa3, 0x9f, 0x4b, 0xb0, 0xc9, 0xb7, 0x69, 0xd8, - 0x5d, 0x1a, 0x5c, 0x2e, 0xd8, 0xe4, 0x0b, 0xa7, 0x29, 0xd7, 0xc1, 0x6c, 0x17, 0x37, 0x2d, 0xb3, - 0xe5, 0x65, 0xa2, 0xfd, 0x11, 0x9f, 0xc8, 0xdf, 0x3b, 0x2f, 0x00, 0x19, 0x61, 0x74, 0x24, 0x3b, - 0x75, 0x49, 0x80, 0xe9, 0x57, 0x6a, 0xfa, 0xc0, 0x7c, 0x47, 0x76, 0x7f, 0xea, 0x5c, 0x42, 0x2f, - 0x16, 0xde, 0x7d, 0xbd, 0x09, 0xf2, 0x44, 0x4d, 0xbd, 0x31, 0xba, 0x7f, 0x7f, 0xcc, 0xf2, 0x28, - 0x0b, 0x70, 0xac, 0x8b, 0xdb, 0xb8, 0xe9, 0xe0, 0x96, 0xdb, 0x74, 0xb5, 0x81, 0x9d, 0xc2, 0xfe, - 0xec, 0xe8, 0xcf, 0xc2, 0x00, 0xde, 0xc1, 0x03, 0x78, 0x7d, 0x1f, 0x51, 0xba, 0x15, 0x8a, 0xb6, - 0x95, 0xdd, 0x6a, 0xd4, 0xda, 0x96, 0xbf, 0x28, 0xee, 0xbd, 0xbb, 0xdf, 0xb6, 0x9d, 0x9d, 0x36, - 0xf9, 0xc6, 0x0e, 0x18, 0x78, 0xef, 0xca, 0x3c, 0x4c, 0xe8, 0xe6, 0x25, 0xf2, 0x29, 0x1b, 0x53, - 0x6b, 0x2f, 0x13, 0x7a, 0x85, 0x8f, 0xfc, 0x5d, 0x1c, 0xf2, 0x8f, 0x15, 0x63, 0x37, 0x7d, 0xe0, - 0x7f, 0x71, 0x02, 0x72, 0xeb, 0x7a, 0xd7, 0xc1, 0xe8, 0xff, 0x92, 0x45, 0x91, 0xbf, 0x1e, 0xe6, - 0x36, 0xad, 0xe6, 0x6e, 0x17, 0xb7, 0xf8, 0x46, 0xd9, 0x93, 0x3a, 0x0a, 0xcc, 0x95, 0x1b, 0xa1, - 0xe0, 0x25, 0x32, 0xb2, 0xde, 0x36, 0xfc, 0xbe, 0x74, 0x12, 0x49, 0xbb, 0xbb, 0xae, 0xdb, 0x4e, - 0x75, 0x93, 0xa4, 0xf9, 0x91, 0xb4, 0xc3, 0x89, 0x1c, 0xf4, 0xf9, 0x18, 0xe8, 0x27, 0xa2, 0xa1, - 0x9f, 0x14, 0x80, 0x5e, 0x29, 0xc2, 0xe4, 0xa6, 0xd1, 0xc6, 0xe4, 0x87, 0x29, 0xf2, 0x43, 0xbf, - 0x31, 0x89, 0xc8, 0xde, 0x1f, 0x93, 0x96, 0x8c, 0x36, 0xd6, 0xfc, 0xdf, 0xbc, 0x89, 0x0c, 0x04, - 0x13, 0x99, 0x55, 0xea, 0x4f, 0xeb, 0x1a, 0x5e, 0xa6, 0xbe, 0x83, 0xbd, 0xc5, 0x37, 0x93, 0x1d, - 0x6e, 0x69, 0xe9, 0x8e, 0x4e, 0xc0, 0x98, 0xd1, 0xc8, 0x33, 0xef, 0x17, 0x22, 0xf7, 0xfa, 0x85, - 0x3c, 0x4b, 0x4e, 0xd6, 0x23, 0x7a, 0xcc, 0x46, 0xb4, 0xa8, 0xf3, 0x1e, 0x40, 0xd4, 0x52, 0xf4, - 0xdf, 0x5d, 0x60, 0x9a, 0xba, 0x8d, 0x9d, 0xf5, 0xb0, 0x27, 0x46, 0x4e, 0xe3, 0x13, 0x89, 0x2b, - 0x5f, 0xb7, 0xa6, 0xef, 0x60, 0x52, 0x58, 0xc9, 0xfd, 0xc6, 0x5c, 0xb4, 0xf6, 0xa5, 0x07, 0xfd, - 0x6f, 0x6e, 0xd4, 0xfd, 0x6f, 0xbf, 0x3a, 0xa6, 0xdf, 0x0c, 0x5f, 0x9d, 0x05, 0xb9, 0xb4, 0xeb, - 0x3c, 0xa2, 0xbb, 0xdf, 0x1f, 0x08, 0xfb, 0xb9, 0xb0, 0xfe, 0x2c, 0xf2, 0xa2, 0xf9, 0x31, 0xf5, - 0xbe, 0x09, 0xb5, 0x44, 0xcc, 0x9f, 0x26, 0xaa, 0x6e, 0x63, 0xb8, 0xd7, 0x40, 0xf6, 0x1d, 0x2c, - 0x1f, 0xcc, 0x1c, 0xdc, 0x34, 0x47, 0xb4, 0x7f, 0x0a, 0xf5, 0x0c, 0xfe, 0xbb, 0xd7, 0xf1, 0x64, - 0xb9, 0x58, 0x7d, 0x64, 0x7b, 0x9d, 0x88, 0x72, 0x46, 0xa3, 0x2f, 0xe8, 0xa5, 0xc2, 0x6e, 0xe7, - 0x54, 0x6c, 0xb1, 0xae, 0x84, 0xc9, 0x6c, 0x2a, 0xb1, 0xcb, 0x44, 0x63, 0x8a, 0x4d, 0x1f, 0xb0, - 0x6f, 0x87, 0x5d, 0x05, 0x8b, 0x07, 0x46, 0x0c, 0xbd, 0x52, 0x78, 0x3b, 0x8a, 0x56, 0x7b, 0xc0, - 0x7a, 0x61, 0x32, 0x79, 0x8b, 0x6d, 0x56, 0xc5, 0x16, 0x9c, 0xbe, 0xc4, 0xbf, 0x25, 0x43, 0x9e, - 0x6e, 0x41, 0xa2, 0x37, 0x66, 0x12, 0xdc, 0xc2, 0xee, 0xf0, 0x2e, 0x84, 0xfe, 0x7b, 0x92, 0x35, - 0x07, 0xce, 0xd5, 0x30, 0x9b, 0xc8, 0xd5, 0x90, 0x3f, 0xc7, 0x29, 0xd0, 0x8e, 0x68, 0x1d, 0x53, - 0x9e, 0x4e, 0x26, 0x69, 0x61, 0x7d, 0x19, 0x4a, 0x1f, 0xef, 0xe7, 0xe4, 0x60, 0x86, 0x16, 0x7d, - 0xce, 0x68, 0x6d, 0x61, 0x07, 0xbd, 0x43, 0xfa, 0xe1, 0x41, 0x5d, 0xa9, 0xc0, 0xcc, 0x45, 0xc2, - 0xf6, 0xaa, 0x7e, 0xc9, 0xda, 0x75, 0xd8, 0xca, 0xc5, 0x8d, 0xb1, 0xeb, 0x1e, 0xb4, 0x9e, 0xf3, - 0xf4, 0x0f, 0x8d, 0xfb, 0xdf, 0x95, 0x31, 0x5d, 0xf0, 0xa7, 0x0e, 0x5c, 0x79, 0x62, 0x64, 0x85, - 0x93, 0x94, 0x93, 0x90, 0xdf, 0x33, 0xf0, 0xc5, 0x72, 0x8b, 0x59, 0xb7, 0xec, 0x0d, 0x7d, 0x50, - 0x78, 0xdf, 0x36, 0x0c, 0x37, 0xe3, 0x25, 0x5d, 0x2d, 0x14, 0xdb, 0xbd, 0x1d, 0xc8, 0xd6, 0x18, - 0xce, 0x14, 0xf3, 0x97, 0x75, 0x96, 0x12, 0x28, 0x62, 0x94, 0xe1, 0xcc, 0x87, 0xf2, 0x88, 0x3d, - 0xb1, 0x42, 0x05, 0x30, 0xe2, 0x7b, 0x3c, 0xc5, 0xe2, 0x4b, 0x0c, 0x28, 0x3a, 0x7d, 0xc9, 0xbf, - 0x46, 0x86, 0xa9, 0x1a, 0x76, 0x96, 0x0c, 0xdc, 0x6e, 0x75, 0x91, 0x7d, 0x70, 0xd3, 0xe8, 0x66, - 0xc8, 0x6f, 0x12, 0x62, 0x83, 0xce, 0x2d, 0xb0, 0x6c, 0xe8, 0xd5, 0x92, 0xe8, 0x8e, 0x30, 0x5b, - 0x7d, 0xf3, 0xb8, 0x1d, 0x09, 0x4c, 0x62, 0x1e, 0xbd, 0xf1, 0x25, 0x8f, 0x21, 0xb0, 0xad, 0x0c, - 0x33, 0xec, 0x76, 0xbf, 0x62, 0xdb, 0xd8, 0x32, 0xd1, 0xee, 0x08, 0x5a, 0x88, 0x72, 0x0b, 0xe4, - 0x74, 0x97, 0x1a, 0xdb, 0x7a, 0x45, 0x7d, 0x3b, 0x4f, 0x52, 0x9e, 0x46, 0x33, 0x26, 0x08, 0x23, - 0x19, 0x28, 0xb6, 0xc7, 0xf3, 0x18, 0xc3, 0x48, 0x0e, 0x2c, 0x3c, 0x7d, 0xc4, 0xbe, 0x22, 0xc3, - 0x71, 0xc6, 0xc0, 0x59, 0x6c, 0x3b, 0x46, 0x53, 0x6f, 0x53, 0xe4, 0x9e, 0x97, 0x19, 0x05, 0x74, - 0x2b, 0x30, 0xbb, 0x17, 0x26, 0xcb, 0x20, 0x3c, 0xd3, 0x17, 0x42, 0x8e, 0x01, 0x8d, 0xff, 0x31, - 0x41, 0x38, 0x3e, 0x4e, 0xaa, 0x1c, 0xcd, 0x31, 0x86, 0xe3, 0x13, 0x66, 0x22, 0x7d, 0x88, 0x5f, - 0xc4, 0x42, 0xf3, 0x04, 0xdd, 0xe7, 0x17, 0x84, 0xb1, 0xdd, 0x80, 0x69, 0x82, 0x25, 0xfd, 0x91, - 0x2d, 0x43, 0xc4, 0x28, 0xb1, 0xdf, 0xef, 0xb0, 0x0b, 0xc3, 0xfc, 0x7f, 0xb5, 0x30, 0x1d, 0x74, - 0x0e, 0x20, 0xf8, 0x14, 0xee, 0xa4, 0x33, 0x51, 0x9d, 0xb4, 0x24, 0xd6, 0x49, 0xbf, 0x41, 0x38, - 0x58, 0x4a, 0x7f, 0xb6, 0x0f, 0xae, 0x1e, 0x62, 0x61, 0x32, 0x06, 0x97, 0x9e, 0xbe, 0x5e, 0xbc, - 0x22, 0xdb, 0x7b, 0x8d, 0xfb, 0x47, 0x46, 0x32, 0x9f, 0x0a, 0xf7, 0x07, 0x72, 0x4f, 0x7f, 0x70, - 0x00, 0x4b, 0xfa, 0x06, 0x38, 0x4a, 0x8b, 0x28, 0xf9, 0x6c, 0xe5, 0x68, 0x28, 0x88, 0x9e, 0x64, - 0xf4, 0xd1, 0x21, 0x94, 0x60, 0xd0, 0x1d, 0xf3, 0x71, 0x9d, 0x5c, 0x32, 0x63, 0x37, 0xa9, 0x82, - 0x1c, 0xde, 0xd5, 0xf4, 0xdf, 0xcc, 0x52, 0x6b, 0x77, 0x83, 0xdc, 0xe9, 0x86, 0xfe, 0x22, 0x3b, - 0x8a, 0x11, 0xe1, 0x6e, 0xc8, 0x12, 0x17, 0x77, 0x39, 0x72, 0x49, 0x23, 0x28, 0x32, 0xb8, 0x70, - 0x0f, 0x3f, 0xe0, 0xac, 0x1c, 0xd1, 0xc8, 0x9f, 0xca, 0x8d, 0x70, 0xf4, 0xbc, 0xde, 0xbc, 0xb0, - 0x65, 0x5b, 0xbb, 0xe4, 0xf6, 0x2b, 0x8b, 0x5d, 0xa3, 0x45, 0xae, 0x23, 0xe4, 0x3f, 0x28, 0xb7, - 0x7a, 0xa6, 0x43, 0x6e, 0x90, 0xe9, 0xb0, 0x72, 0x84, 0x19, 0x0f, 0xca, 0xe3, 0xfd, 0x4e, 0x27, - 0x1f, 0xdb, 0xe9, 0xac, 0x1c, 0xf1, 0xba, 0x1d, 0x65, 0x11, 0x26, 0x5b, 0xc6, 0x1e, 0xd9, 0xaa, - 0x26, 0xb3, 0xae, 0x41, 0x47, 0x97, 0x17, 0x8d, 0x3d, 0xba, 0xb1, 0xbd, 0x72, 0x44, 0xf3, 0xff, - 0x54, 0x96, 0x61, 0x8a, 0x6c, 0x0b, 0x10, 0x32, 0x93, 0x89, 0x8e, 0x25, 0xaf, 0x1c, 0xd1, 0x82, - 0x7f, 0x5d, 0xeb, 0x23, 0x4b, 0xce, 0x7e, 0xdc, 0xe5, 0x6d, 0xb7, 0x67, 0x12, 0x6d, 0xb7, 0xbb, - 0xb2, 0xa0, 0x1b, 0xee, 0x27, 0x21, 0xd7, 0x24, 0x12, 0x96, 0x98, 0x84, 0xe9, 0xab, 0x72, 0x07, - 0x64, 0x77, 0x74, 0xdb, 0x9b, 0x3c, 0x5f, 0x3f, 0x98, 0xee, 0x9a, 0x6e, 0x5f, 0x70, 0x11, 0x74, - 0xff, 0x5a, 0x98, 0x80, 0x1c, 0x11, 0x9c, 0xff, 0x80, 0xde, 0x9c, 0xa5, 0x66, 0x48, 0xc9, 0x32, - 0xdd, 0x61, 0xbf, 0x6e, 0x79, 0x07, 0x64, 0x3e, 0x98, 0x19, 0x8d, 0x05, 0xd9, 0xf7, 0xde, 0x73, - 0x39, 0xf2, 0xde, 0xf3, 0x9e, 0x0b, 0x78, 0xb3, 0xbd, 0x17, 0xf0, 0x06, 0xcb, 0x07, 0xb9, 0xc1, - 0x8e, 0x2a, 0x7f, 0x36, 0x84, 0xe9, 0xd2, 0x2b, 0x88, 0xe8, 0x19, 0x78, 0xdb, 0x30, 0x43, 0x75, - 0xf6, 0x5e, 0x13, 0x76, 0x4a, 0x49, 0x8d, 0x9a, 0x01, 0xec, 0xa5, 0xdf, 0x37, 0xfd, 0x76, 0x16, - 0x4e, 0xd1, 0x6b, 0x9e, 0xf7, 0x70, 0xdd, 0xe2, 0xef, 0x9b, 0x44, 0x9f, 0x1c, 0x89, 0xd2, 0xf4, - 0x19, 0x70, 0xe4, 0xbe, 0x03, 0xce, 0xbe, 0x43, 0xca, 0xd9, 0x01, 0x87, 0x94, 0x73, 0xc9, 0x56, - 0x0e, 0xdf, 0x1f, 0xd6, 0x9f, 0x75, 0x5e, 0x7f, 0x6e, 0x8f, 0x00, 0xa8, 0x9f, 0x5c, 0x46, 0x62, - 0xdf, 0xbc, 0xcd, 0xd7, 0x94, 0x1a, 0xa7, 0x29, 0x77, 0x0d, 0xcf, 0x48, 0xfa, 0xda, 0xf2, 0x07, - 0x59, 0xb8, 0x2c, 0x60, 0xa6, 0x82, 0x2f, 0x32, 0x45, 0xf9, 0xdc, 0x48, 0x14, 0x25, 0x79, 0x0c, - 0x84, 0xb4, 0x35, 0xe6, 0x4f, 0x84, 0xcf, 0x0e, 0xf5, 0x02, 0xe5, 0xcb, 0x26, 0x42, 0x59, 0x4e, - 0x42, 0x9e, 0xf6, 0x30, 0x0c, 0x1a, 0xf6, 0x96, 0xb0, 0xbb, 0x11, 0x3b, 0x71, 0x24, 0xca, 0xdb, - 0x18, 0xf4, 0x87, 0xad, 0x6b, 0xd4, 0x77, 0x6d, 0xb3, 0x6c, 0x3a, 0x16, 0xfa, 0x85, 0x91, 0x28, - 0x8e, 0xef, 0x0d, 0x27, 0x0f, 0xe3, 0x0d, 0x37, 0xd4, 0x2a, 0x87, 0x57, 0x83, 0x43, 0x59, 0xe5, - 0x88, 0x28, 0x3c, 0x7d, 0xfc, 0xde, 0x2a, 0xc3, 0x49, 0x36, 0xd9, 0x5a, 0xe0, 0x2d, 0x44, 0x74, - 0xdf, 0x28, 0x80, 0x3c, 0xee, 0x99, 0x49, 0xec, 0x96, 0x33, 0xf2, 0xc2, 0x9f, 0x94, 0x8a, 0xbd, - 0xdf, 0x81, 0x9b, 0x0e, 0xf6, 0x70, 0x38, 0x12, 0xa4, 0xc4, 0xae, 0x75, 0x48, 0xc0, 0x46, 0xfa, - 0x98, 0xbd, 0x40, 0x86, 0x3c, 0xbb, 0xde, 0x7f, 0x23, 0x15, 0x87, 0x09, 0x3e, 0xca, 0xb3, 0xc0, - 0x8e, 0x5c, 0xe2, 0x4b, 0xee, 0xd3, 0xdb, 0x8b, 0x3b, 0xa4, 0x5b, 0xec, 0xbf, 0x23, 0xc1, 0x74, - 0x0d, 0x3b, 0x25, 0xdd, 0xb6, 0x0d, 0x7d, 0x6b, 0x54, 0x1e, 0xdf, 0xa2, 0xde, 0xc3, 0xe8, 0xbb, - 0x19, 0xd1, 0xf3, 0x34, 0xfe, 0x42, 0xb8, 0xc7, 0x6a, 0x44, 0x2c, 0xc1, 0x87, 0x85, 0xce, 0xcc, - 0x0c, 0xa2, 0x36, 0x06, 0x8f, 0x6d, 0x09, 0x26, 0xbc, 0xb3, 0x78, 0x37, 0x73, 0xe7, 0x33, 0xb7, - 0x9d, 0x1d, 0xef, 0x18, 0x0c, 0x79, 0xde, 0x7f, 0x06, 0x0c, 0xbd, 0x3c, 0xa1, 0xa3, 0x7c, 0xfc, - 0x41, 0xc2, 0x64, 0x6d, 0x2c, 0x89, 0x3b, 0xfc, 0x61, 0x1d, 0x1d, 0xfc, 0xbd, 0x09, 0xb6, 0x1c, - 0xb9, 0xaa, 0x3b, 0xf8, 0x01, 0xf4, 0x05, 0x19, 0x26, 0x6a, 0xd8, 0x71, 0xc7, 0x5b, 0xee, 0x72, - 0xd3, 0x61, 0x35, 0x5c, 0x09, 0xad, 0x78, 0x4c, 0xb1, 0x35, 0x8c, 0x7b, 0x60, 0xaa, 0x63, 0x5b, - 0x4d, 0xdc, 0xed, 0xb2, 0xd5, 0x8b, 0xb0, 0xa3, 0x5a, 0xbf, 0xd1, 0x9f, 0xb0, 0x36, 0xbf, 0xee, - 0xfd, 0xa3, 0x05, 0xbf, 0x27, 0x35, 0x03, 0x28, 0x25, 0x56, 0xc1, 0x71, 0x9b, 0x01, 0x71, 0x85, - 0xa7, 0x0f, 0xf4, 0x67, 0x64, 0x98, 0xa9, 0x61, 0xc7, 0x97, 0x62, 0x82, 0x4d, 0x8e, 0x68, 0x78, - 0x39, 0x28, 0xe5, 0x83, 0x41, 0x29, 0x7e, 0x35, 0x20, 0x2f, 0x4d, 0x9f, 0xd8, 0x18, 0xaf, 0x06, - 0x14, 0xe3, 0x60, 0x0c, 0xc7, 0xd7, 0x1e, 0x0d, 0x53, 0x84, 0x17, 0xd2, 0x60, 0x7f, 0x25, 0x1b, - 0x34, 0xde, 0x2f, 0xa6, 0xd4, 0x78, 0xef, 0x84, 0xdc, 0x8e, 0x6e, 0x5f, 0xe8, 0x92, 0x86, 0x3b, - 0x2d, 0x62, 0xb6, 0xaf, 0xb9, 0xd9, 0x35, 0xfa, 0x57, 0x7f, 0x3f, 0xcd, 0x5c, 0x32, 0x3f, 0xcd, - 0x87, 0xa5, 0x44, 0x23, 0x21, 0x9d, 0x3b, 0x8c, 0xb0, 0xc9, 0x27, 0x18, 0x37, 0x63, 0xca, 0x4e, - 0x5f, 0x39, 0x9e, 0x27, 0xc3, 0xa4, 0x3b, 0x6e, 0x13, 0x7b, 0xfc, 0xdc, 0xc1, 0xd5, 0xa1, 0xbf, - 0xa1, 0x9f, 0xb0, 0x07, 0xf6, 0x24, 0x32, 0x3a, 0xf3, 0x3e, 0x41, 0x0f, 0x1c, 0x57, 0x78, 0xfa, - 0x78, 0xbc, 0x9d, 0xe2, 0x41, 0xda, 0x03, 0x7a, 0x9d, 0x0c, 0xf2, 0x32, 0x76, 0xc6, 0x6d, 0x45, - 0xbe, 0x45, 0x38, 0xc4, 0x11, 0x27, 0x30, 0xc2, 0xf3, 0xfc, 0x32, 0x1e, 0x4d, 0x03, 0x12, 0x8b, - 0x6d, 0x24, 0xc4, 0x40, 0xfa, 0xa8, 0xbd, 0x9b, 0xa2, 0x46, 0x37, 0x17, 0x7e, 0x7e, 0x04, 0xbd, - 0xea, 0x78, 0x17, 0x3e, 0x3c, 0x01, 0x12, 0x1a, 0x87, 0xd5, 0xde, 0xfa, 0x15, 0x3e, 0x96, 0xab, - 0xf8, 0xc0, 0x6d, 0xec, 0xdb, 0xb8, 0x79, 0x01, 0xb7, 0xd0, 0xcf, 0x1c, 0x1c, 0xba, 0x53, 0x30, - 0xd1, 0xa4, 0xd4, 0x08, 0x78, 0x93, 0x9a, 0xf7, 0x9a, 0xe0, 0x5e, 0x69, 0xbe, 0x23, 0xa2, 0xbf, - 0x8f, 0xf1, 0x5e, 0x69, 0x81, 0xe2, 0xc7, 0x60, 0xb6, 0xd0, 0x59, 0x46, 0xb9, 0x69, 0x99, 0xe8, - 0xbf, 0x1c, 0x1c, 0x96, 0xab, 0x60, 0xca, 0x68, 0x5a, 0x26, 0x09, 0x43, 0xe1, 0x1d, 0x02, 0xf2, - 0x13, 0xbc, 0xaf, 0xea, 0x8e, 0x75, 0xbf, 0xc1, 0x76, 0xcd, 0x83, 0x84, 0x61, 0x8d, 0x09, 0x97, - 0xf5, 0xc3, 0x32, 0x26, 0xfa, 0x94, 0x9d, 0x3e, 0x64, 0x1f, 0x0d, 0xbc, 0xdb, 0x68, 0x57, 0xf8, - 0x88, 0x58, 0x05, 0x1e, 0x66, 0x38, 0x0b, 0xd7, 0xe2, 0x50, 0x86, 0xb3, 0x18, 0x06, 0xc6, 0x70, - 0x63, 0x45, 0x80, 0x63, 0xea, 0x6b, 0xc0, 0x07, 0x40, 0x67, 0x74, 0xe6, 0xe1, 0x90, 0xe8, 0x1c, - 0x8e, 0x89, 0xf8, 0x3e, 0x16, 0x22, 0x93, 0x59, 0x3c, 0xe8, 0xbf, 0x8e, 0x02, 0x9c, 0xdb, 0x87, - 0xf1, 0x57, 0xa0, 0xde, 0x0a, 0x09, 0x6e, 0xc4, 0xde, 0x27, 0x41, 0x97, 0xca, 0x18, 0xef, 0x8a, - 0x17, 0x29, 0x3f, 0x7d, 0x00, 0x9f, 0x2b, 0xc3, 0x1c, 0xf1, 0x11, 0x68, 0x63, 0xdd, 0xa6, 0x1d, - 0xe5, 0x48, 0x1c, 0xe5, 0xdf, 0x2e, 0x1c, 0xe0, 0x87, 0x97, 0x43, 0xc0, 0xc7, 0x48, 0xa0, 0x10, - 0x8b, 0xee, 0x23, 0xc8, 0xc2, 0x58, 0xb6, 0x51, 0x0a, 0x3e, 0x0b, 0x4c, 0xc5, 0x47, 0x83, 0x47, - 0x42, 0x8f, 0x5c, 0x5e, 0x18, 0x5e, 0x63, 0x1b, 0xb3, 0x47, 0xae, 0x08, 0x13, 0xe9, 0x63, 0xf2, - 0xba, 0x5b, 0xd8, 0x82, 0x73, 0x9d, 0x5c, 0x18, 0xff, 0xca, 0xac, 0x7f, 0xa2, 0xed, 0x33, 0x23, - 0xf1, 0xc0, 0x3c, 0x40, 0x40, 0x7c, 0x05, 0xb2, 0xb6, 0x75, 0x91, 0x2e, 0x6d, 0xcd, 0x6a, 0xe4, - 0x99, 0x5e, 0x4f, 0xd9, 0xde, 0xdd, 0x31, 0xe9, 0xc9, 0xd0, 0x59, 0xcd, 0x7b, 0x55, 0xae, 0x83, - 0xd9, 0x8b, 0x86, 0xb3, 0xbd, 0x82, 0xf5, 0x16, 0xb6, 0x35, 0xeb, 0x22, 0xf1, 0x98, 0x9b, 0xd4, - 0xf8, 0x44, 0xde, 0x7f, 0x45, 0xc0, 0xbe, 0x24, 0xb7, 0xc8, 0x8f, 0xe5, 0xf8, 0x5b, 0x12, 0xcb, - 0x33, 0x9a, 0xab, 0xf4, 0x15, 0xe6, 0x3d, 0x32, 0x4c, 0x69, 0xd6, 0x45, 0xa6, 0x24, 0xff, 0xc7, - 0xe1, 0xea, 0x48, 0xe2, 0x89, 0x1e, 0x91, 0x9c, 0xcf, 0xfe, 0xd8, 0x27, 0x7a, 0xb1, 0xc5, 0x8f, - 0xe5, 0xe4, 0xd2, 0x8c, 0x66, 0x5d, 0xac, 0x61, 0x87, 0xb6, 0x08, 0xd4, 0x18, 0x91, 0x93, 0xb5, - 0xd1, 0xa5, 0x04, 0xd9, 0x3c, 0xdc, 0x7f, 0x4f, 0xba, 0x8b, 0xe0, 0x0b, 0xc8, 0x67, 0x71, 0xdc, - 0xbb, 0x08, 0x03, 0x39, 0x18, 0x43, 0x8c, 0x14, 0x19, 0xa6, 0x35, 0xeb, 0xa2, 0x3b, 0x34, 0x2c, - 0x19, 0xed, 0xf6, 0x68, 0x46, 0xc8, 0xa4, 0xc6, 0xbf, 0x27, 0x06, 0x8f, 0x8b, 0xb1, 0x1b, 0xff, - 0x03, 0x18, 0x48, 0x1f, 0x86, 0x67, 0xd1, 0xc6, 0xe2, 0x8d, 0xd0, 0xe6, 0x68, 0x70, 0x18, 0xb6, - 0x41, 0xf8, 0x6c, 0x1c, 0x5a, 0x83, 0x88, 0xe2, 0x60, 0x2c, 0x3b, 0x27, 0x73, 0x25, 0x32, 0xcc, - 0x8f, 0xb6, 0x4d, 0xbc, 0x33, 0x99, 0x6b, 0x22, 0x1b, 0x76, 0x39, 0x46, 0x46, 0x82, 0x46, 0x02, - 0x17, 0x44, 0x01, 0x1e, 0xd2, 0xc7, 0xe3, 0x43, 0x32, 0xcc, 0x50, 0x16, 0x1e, 0x21, 0x56, 0xc0, - 0x50, 0x8d, 0x2a, 0x5c, 0x83, 0xc3, 0x69, 0x54, 0x31, 0x1c, 0x8c, 0xe5, 0x56, 0x50, 0xd7, 0x8e, - 0x1b, 0xe2, 0xf8, 0x78, 0x14, 0x82, 0x43, 0x1b, 0x63, 0x23, 0x3c, 0x42, 0x3e, 0x8c, 0x31, 0x76, - 0x48, 0xc7, 0xc8, 0x9f, 0xe5, 0xb7, 0xa2, 0x51, 0x62, 0x70, 0x80, 0xa6, 0x30, 0x42, 0x18, 0x86, - 0x6c, 0x0a, 0x87, 0x84, 0xc4, 0x57, 0x65, 0x00, 0xca, 0xc0, 0x9a, 0xb5, 0x47, 0x2e, 0xf3, 0x19, - 0x41, 0x77, 0xd6, 0xeb, 0x56, 0x2f, 0x0f, 0x70, 0xab, 0x4f, 0x18, 0xc2, 0x25, 0xe9, 0x4a, 0x60, - 0x48, 0xca, 0x6e, 0x25, 0xc7, 0xbe, 0x12, 0x18, 0x5f, 0x7e, 0xfa, 0x18, 0x7f, 0x99, 0x5a, 0x73, - 0xc1, 0x01, 0xd3, 0xdf, 0x1a, 0x09, 0xca, 0xa1, 0xd9, 0xbf, 0xcc, 0xcf, 0xfe, 0x0f, 0x80, 0xed, - 0xb0, 0x36, 0xe2, 0xa0, 0x83, 0xa3, 0xe9, 0xdb, 0x88, 0x87, 0x77, 0x40, 0xf4, 0xe7, 0xb3, 0x70, - 0x94, 0x75, 0x22, 0x3f, 0x0c, 0x10, 0x27, 0x3c, 0x87, 0xc7, 0x75, 0x92, 0x03, 0x50, 0x1e, 0xd5, - 0x82, 0x54, 0x92, 0xa5, 0x4c, 0x01, 0xf6, 0xc6, 0xb2, 0xba, 0x91, 0x57, 0x1f, 0xe8, 0xe8, 0x66, - 0x4b, 0x3c, 0xdc, 0xef, 0x00, 0xe0, 0xbd, 0xb5, 0x46, 0x99, 0x5f, 0x6b, 0xec, 0xb3, 0x32, 0x99, - 0x78, 0xe7, 0x9a, 0x88, 0x8c, 0xb2, 0x3b, 0xf6, 0x9d, 0xeb, 0xe8, 0xb2, 0xd3, 0x47, 0xe9, 0x9d, - 0x32, 0x64, 0x6b, 0x96, 0xed, 0xa0, 0x67, 0x27, 0x69, 0x9d, 0x54, 0xf2, 0x01, 0x48, 0xde, 0xbb, - 0x52, 0xe2, 0x6e, 0x69, 0xbe, 0x39, 0xfe, 0xa8, 0xb3, 0xee, 0xe8, 0xc4, 0xab, 0xdb, 0x2d, 0x3f, - 0x74, 0x5d, 0x73, 0xd2, 0x78, 0x3a, 0x54, 0x7e, 0xb5, 0xe8, 0x03, 0x18, 0xa9, 0xc5, 0xd3, 0x89, - 0x2c, 0x39, 0x7d, 0xdc, 0x1e, 0x3a, 0xca, 0x7c, 0x5b, 0x97, 0x8c, 0x36, 0x46, 0xcf, 0xa6, 0x2e, - 0x23, 0x15, 0x7d, 0x07, 0x8b, 0x1f, 0x89, 0x89, 0x75, 0x6d, 0x25, 0xf1, 0x65, 0xe5, 0x20, 0xbe, - 0x6c, 0xd2, 0x06, 0x45, 0x0f, 0xa0, 0x53, 0x96, 0xc6, 0xdd, 0xa0, 0x62, 0xca, 0x1e, 0x4b, 0x9c, - 0xce, 0x63, 0x35, 0xec, 0x50, 0xa3, 0xb2, 0xea, 0xdd, 0xc0, 0xf2, 0xb3, 0x23, 0x89, 0xd8, 0xe9, - 0x5f, 0xf0, 0x22, 0xf7, 0x5c, 0xf0, 0xf2, 0x9e, 0x30, 0x38, 0x6b, 0x3c, 0x38, 0x3f, 0x19, 0x2d, - 0x20, 0x9e, 0xc9, 0x91, 0xc0, 0xf4, 0x16, 0x1f, 0xa6, 0x75, 0x0e, 0xa6, 0x3b, 0x86, 0xe4, 0x22, - 0x7d, 0xc0, 0x7e, 0x35, 0x07, 0x47, 0xe9, 0xa4, 0xbf, 0x68, 0xb6, 0x58, 0x84, 0xd5, 0x37, 0x4a, - 0x87, 0xbc, 0xd9, 0xb6, 0x3f, 0x04, 0x2b, 0x17, 0xcb, 0x39, 0xd7, 0x7b, 0x3b, 0xfe, 0x02, 0x0d, - 0xe7, 0xea, 0x76, 0xa2, 0x64, 0xa7, 0x4d, 0xfc, 0x86, 0x7c, 0xff, 0x3f, 0xfe, 0x2e, 0xa3, 0x09, - 0xf1, 0xbb, 0x8c, 0xfe, 0x34, 0xd9, 0xba, 0x1d, 0x29, 0xba, 0x47, 0xe0, 0x29, 0xdb, 0x4e, 0x09, - 0x56, 0xf4, 0x04, 0xb8, 0xfb, 0xd1, 0x70, 0x27, 0x0b, 0x22, 0x88, 0x0c, 0xe9, 0x4e, 0x46, 0x08, - 0x1c, 0xa6, 0x3b, 0xd9, 0x20, 0x06, 0xc6, 0x70, 0xab, 0x7d, 0x8e, 0xed, 0xe6, 0x93, 0x76, 0x83, - 0xfe, 0x4a, 0x4a, 0x7d, 0x94, 0xfe, 0x5e, 0x26, 0x91, 0xff, 0x33, 0xe1, 0x2b, 0x7e, 0x98, 0x4e, - 0xe2, 0xd1, 0x1c, 0x47, 0x6e, 0x0c, 0xeb, 0x46, 0x12, 0xf1, 0x45, 0x3f, 0x67, 0xb4, 0x9c, 0xed, - 0x11, 0x9d, 0xe8, 0xb8, 0xe8, 0xd2, 0xf2, 0xae, 0x47, 0x26, 0x2f, 0xe8, 0xdf, 0x32, 0x89, 0x42, - 0x48, 0xf9, 0x22, 0x21, 0x6c, 0x45, 0x88, 0x38, 0x41, 0xe0, 0xa7, 0x58, 0x7a, 0x63, 0xd4, 0xe8, - 0xb3, 0x46, 0x0b, 0x5b, 0x8f, 0x40, 0x8d, 0x26, 0x7c, 0x8d, 0x4e, 0xa3, 0xe3, 0xc8, 0xfd, 0x88, - 0x6a, 0xb4, 0x2f, 0x92, 0x11, 0x69, 0x74, 0x2c, 0xbd, 0xf4, 0x65, 0xfc, 0xf2, 0x19, 0x36, 0x91, - 0x5a, 0x35, 0xcc, 0x0b, 0xe8, 0x9f, 0xf3, 0xde, 0xc5, 0xcc, 0xe7, 0x0c, 0x67, 0x9b, 0xc5, 0x82, - 0xf9, 0x03, 0xe1, 0xbb, 0x51, 0x86, 0x88, 0xf7, 0xc2, 0x87, 0x93, 0xca, 0xed, 0x0b, 0x27, 0x55, - 0x84, 0x59, 0xc3, 0x74, 0xb0, 0x6d, 0xea, 0xed, 0xa5, 0xb6, 0xbe, 0xd5, 0x3d, 0x35, 0xd1, 0xf7, - 0xf2, 0xba, 0x72, 0x28, 0x8f, 0xc6, 0xff, 0x11, 0xbe, 0xbe, 0x72, 0x92, 0xbf, 0xbe, 0x32, 0x22, - 0xfa, 0xd5, 0x54, 0x74, 0xf4, 0x2b, 0x3f, 0xba, 0x15, 0x0c, 0x0e, 0x8e, 0x2d, 0x6a, 0x1b, 0x27, - 0x0c, 0xf7, 0x77, 0xb3, 0x60, 0x14, 0x36, 0x3f, 0xf4, 0xe3, 0xab, 0xe4, 0x44, 0xab, 0x7b, 0xae, - 0x22, 0xcc, 0xf7, 0x2a, 0x41, 0x62, 0x0b, 0x35, 0x5c, 0x79, 0xb9, 0xa7, 0xf2, 0xbe, 0xc9, 0x93, - 0x15, 0x30, 0x79, 0xc2, 0x4a, 0x95, 0x13, 0x53, 0xaa, 0x24, 0x8b, 0x85, 0x22, 0xb5, 0x1d, 0xc3, - 0x69, 0xa4, 0x1c, 0x1c, 0xf3, 0xa2, 0xdd, 0x76, 0x3a, 0x58, 0xb7, 0x75, 0xb3, 0x89, 0xd1, 0x47, - 0xa5, 0x51, 0x98, 0xbd, 0x4b, 0x30, 0x69, 0x34, 0x2d, 0xb3, 0x66, 0x3c, 0xdd, 0xbb, 0x5c, 0x2e, - 0x3e, 0xc8, 0x3a, 0x91, 0x48, 0x99, 0xfd, 0xa1, 0xf9, 0xff, 0x2a, 0x65, 0x98, 0x6a, 0xea, 0x76, - 0x8b, 0x06, 0xe1, 0xcb, 0xf5, 0x5c, 0xe4, 0x14, 0x49, 0xa8, 0xe4, 0xfd, 0xa2, 0x05, 0x7f, 0x2b, - 0x55, 0x5e, 0x88, 0xf9, 0x9e, 0x68, 0x1e, 0x91, 0xc4, 0x16, 0x83, 0x9f, 0x38, 0x99, 0xbb, 0xd2, - 0xb1, 0x71, 0x9b, 0xdc, 0x41, 0x4f, 0x7b, 0x88, 0x29, 0x2d, 0x48, 0x48, 0xba, 0x3c, 0x40, 0x8a, - 0xda, 0x87, 0xc6, 0xb8, 0x97, 0x07, 0x84, 0xb8, 0x48, 0x5f, 0x33, 0xdf, 0x96, 0x87, 0x59, 0xda, - 0xab, 0x31, 0x71, 0xa2, 0xe7, 0x92, 0x2b, 0xa4, 0x9d, 0x7b, 0xf1, 0x25, 0x54, 0x3b, 0xf8, 0x98, - 0x5c, 0x00, 0xf9, 0x82, 0x1f, 0x70, 0xd0, 0x7d, 0x4c, 0xba, 0x6f, 0xef, 0xf1, 0x35, 0x4f, 0x79, - 0x1a, 0xf7, 0xbe, 0x7d, 0x7c, 0xf1, 0xe9, 0xe3, 0xf3, 0x6b, 0x32, 0xc8, 0xc5, 0x56, 0x0b, 0x35, - 0x0f, 0x0e, 0xc5, 0x35, 0x30, 0xed, 0xb5, 0x99, 0x20, 0x06, 0x64, 0x38, 0x29, 0xe9, 0x22, 0xa8, - 0x2f, 0x9b, 0x62, 0x6b, 0xec, 0xbb, 0x0a, 0x31, 0x65, 0xa7, 0x0f, 0xca, 0x6f, 0x4d, 0xb0, 0x46, - 0xb3, 0x60, 0x59, 0x17, 0xc8, 0x51, 0x99, 0x67, 0xcb, 0x90, 0x5b, 0xc2, 0x4e, 0x73, 0x7b, 0x44, - 0x6d, 0x66, 0xd7, 0x6e, 0x7b, 0x6d, 0x66, 0xdf, 0x7d, 0xf8, 0x83, 0x6d, 0x58, 0x8f, 0xad, 0x79, - 0xc2, 0xd2, 0xb8, 0xa3, 0x3b, 0xc7, 0x96, 0x9e, 0x3e, 0x38, 0xff, 0x26, 0xc3, 0x9c, 0xbf, 0xc2, - 0x45, 0x31, 0xf9, 0xd5, 0xcc, 0x23, 0x6d, 0xbd, 0x13, 0x7d, 0x2e, 0x59, 0x88, 0x34, 0x5f, 0xa6, - 0x7c, 0xcd, 0x52, 0x5e, 0x58, 0x4c, 0x10, 0x3c, 0x4d, 0x8c, 0xc1, 0x31, 0xcc, 0xe0, 0x65, 0x98, - 0x24, 0x0c, 0x2d, 0x1a, 0x7b, 0xc4, 0x75, 0x90, 0x5b, 0x68, 0x7c, 0xc6, 0x48, 0x16, 0x1a, 0xef, - 0xe0, 0x17, 0x1a, 0x05, 0x23, 0x1e, 0x7b, 0xeb, 0x8c, 0x09, 0x7d, 0x69, 0xdc, 0xff, 0x47, 0xbe, - 0xcc, 0x98, 0xc0, 0x97, 0x66, 0x40, 0xf9, 0xe9, 0x23, 0xfa, 0xaa, 0xff, 0xc4, 0x3a, 0x5b, 0x6f, - 0x43, 0x15, 0xfd, 0xcf, 0x63, 0x90, 0x3d, 0xeb, 0x3e, 0xfc, 0xef, 0xe0, 0x46, 0xac, 0x17, 0x8f, - 0x20, 0x38, 0xc3, 0x53, 0x21, 0xeb, 0xd2, 0x67, 0xd3, 0x96, 0x1b, 0xc5, 0x76, 0x77, 0x5d, 0x46, - 0x34, 0xf2, 0x9f, 0x72, 0x12, 0xf2, 0x5d, 0x6b, 0xd7, 0x6e, 0xba, 0xe6, 0xb3, 0xab, 0x31, 0xec, - 0x2d, 0x69, 0x50, 0x52, 0x8e, 0xf4, 0xfc, 0xe8, 0x5c, 0x46, 0x43, 0x17, 0x24, 0xc9, 0xdc, 0x05, - 0x49, 0x09, 0xf6, 0x0f, 0x04, 0x78, 0x4b, 0x5f, 0x23, 0xfe, 0x8a, 0xdc, 0x15, 0xd8, 0x1a, 0x15, - 0xec, 0x11, 0x62, 0x39, 0xa8, 0x3a, 0x24, 0x75, 0xf8, 0xe6, 0x45, 0xeb, 0xc7, 0x81, 0x1f, 0xab, - 0xc3, 0xb7, 0x00, 0x0f, 0x63, 0x39, 0xa5, 0x9e, 0x67, 0x4e, 0xaa, 0xf7, 0x8d, 0x12, 0xdd, 0x2c, - 0xa7, 0xf4, 0x07, 0x42, 0x67, 0x84, 0xce, 0xab, 0x43, 0xa3, 0x73, 0x48, 0xee, 0xab, 0x7f, 0x28, - 0x93, 0x48, 0x98, 0x9e, 0x91, 0x23, 0x7e, 0xd1, 0x51, 0x62, 0x88, 0xdc, 0x31, 0x98, 0x8b, 0x03, - 0x3d, 0x3b, 0x7c, 0x68, 0x70, 0x5e, 0x74, 0x21, 0xfe, 0xc7, 0x1d, 0x1a, 0x5c, 0x94, 0x91, 0xf4, - 0x81, 0x7c, 0x2d, 0xbd, 0x58, 0xac, 0xd8, 0x74, 0x8c, 0xbd, 0x11, 0xb7, 0x34, 0x7e, 0x78, 0x49, - 0x18, 0x0d, 0x78, 0x9f, 0x84, 0x28, 0x87, 0xe3, 0x8e, 0x06, 0x2c, 0xc6, 0x46, 0xfa, 0x30, 0xfd, - 0x6d, 0xde, 0x95, 0x1e, 0x5b, 0x9b, 0x79, 0x1d, 0x5b, 0x0d, 0xc0, 0x07, 0x47, 0xeb, 0x0c, 0xcc, - 0x84, 0xa6, 0xfe, 0xde, 0x85, 0x35, 0x5c, 0x5a, 0xd2, 0x83, 0xee, 0xbe, 0xc8, 0x46, 0xbe, 0x30, - 0x90, 0x60, 0xc1, 0x57, 0x84, 0x89, 0xb1, 0xdc, 0x07, 0xe7, 0x8d, 0x61, 0x63, 0xc2, 0xea, 0x0f, - 0xc2, 0x58, 0x55, 0x79, 0xac, 0x6e, 0x13, 0x11, 0x93, 0xd8, 0x98, 0x26, 0x34, 0x6f, 0x7c, 0xab, - 0x0f, 0x97, 0xc6, 0xc1, 0xf5, 0xd4, 0xa1, 0xf9, 0x48, 0x1f, 0xb1, 0x97, 0xd0, 0xee, 0xb0, 0x46, - 0x4d, 0xf6, 0xd1, 0x74, 0x87, 0x6c, 0x36, 0x20, 0x73, 0xb3, 0x81, 0x84, 0xfe, 0xf6, 0x81, 0x1b, - 0xa9, 0xc7, 0xdc, 0x20, 0x88, 0xb2, 0x23, 0xf6, 0xb7, 0x1f, 0xc8, 0x41, 0xfa, 0xe0, 0xfc, 0xa3, - 0x0c, 0xb0, 0x6c, 0x5b, 0xbb, 0x9d, 0xaa, 0xdd, 0xc2, 0x36, 0xfa, 0x9b, 0x60, 0x02, 0xf0, 0xc2, - 0x11, 0x4c, 0x00, 0xd6, 0x01, 0xb6, 0x7c, 0xe2, 0x4c, 0xc3, 0x6f, 0x11, 0x33, 0xf7, 0x03, 0xa6, - 0xb4, 0x10, 0x0d, 0xfe, 0xca, 0xd9, 0x9f, 0xe2, 0x31, 0x8e, 0xeb, 0xb3, 0x02, 0x72, 0xa3, 0x9c, - 0x00, 0xbc, 0xdd, 0xc7, 0xba, 0xce, 0x61, 0x7d, 0xf7, 0x01, 0x38, 0x49, 0x1f, 0xf3, 0x7f, 0x9a, - 0x80, 0x69, 0xba, 0x5d, 0x47, 0x65, 0xfa, 0xf7, 0x01, 0xe8, 0xbf, 0x35, 0x02, 0xd0, 0x37, 0x60, - 0xc6, 0x0a, 0xa8, 0xd3, 0x3e, 0x35, 0xbc, 0x00, 0x13, 0x0b, 0x7b, 0x88, 0x2f, 0x8d, 0x23, 0x83, - 0x3e, 0x1c, 0x46, 0x5e, 0xe3, 0x91, 0xbf, 0x23, 0x46, 0xde, 0x21, 0x8a, 0xa3, 0x84, 0xfe, 0x1d, - 0x3e, 0xf4, 0x1b, 0x1c, 0xf4, 0xc5, 0x83, 0xb0, 0x32, 0x86, 0x70, 0xfb, 0x32, 0x64, 0xc9, 0xe9, - 0xb8, 0xdf, 0x4e, 0x71, 0x7e, 0x7f, 0x0a, 0x26, 0x48, 0x93, 0xf5, 0xe7, 0x1d, 0xde, 0xab, 0xfb, - 0x45, 0xdf, 0x74, 0xb0, 0xed, 0x7b, 0x2c, 0x78, 0xaf, 0x2e, 0x0f, 0x9e, 0x57, 0x72, 0xf7, 0x54, - 0x9e, 0x6e, 0x44, 0xfa, 0x09, 0x43, 0x4f, 0x4a, 0xc2, 0x12, 0x1f, 0xd9, 0x79, 0xb9, 0x61, 0x26, - 0x25, 0x03, 0x18, 0x49, 0x1f, 0xf8, 0xbf, 0xc8, 0xc2, 0x29, 0xba, 0xaa, 0xb4, 0x64, 0x5b, 0x3b, - 0x3d, 0xb7, 0x5b, 0x19, 0x07, 0xd7, 0x85, 0xeb, 0x61, 0xce, 0xe1, 0xfc, 0xb1, 0x99, 0x4e, 0xf4, - 0xa4, 0xa2, 0x3f, 0x0b, 0xfb, 0x54, 0x3c, 0x8d, 0x47, 0x72, 0x21, 0x46, 0x80, 0x51, 0xbc, 0x27, - 0x5e, 0xa8, 0x17, 0x64, 0x34, 0xb4, 0x48, 0x25, 0x0f, 0xb5, 0x66, 0xe9, 0xeb, 0x54, 0x4e, 0x44, - 0xa7, 0xde, 0xeb, 0xeb, 0xd4, 0xcf, 0x70, 0x3a, 0xb5, 0x7c, 0x70, 0x91, 0xa4, 0xaf, 0x5b, 0xaf, - 0xf4, 0x37, 0x86, 0xfc, 0x6d, 0xbb, 0x9d, 0x14, 0x36, 0xeb, 0xc2, 0xfe, 0x48, 0x59, 0xce, 0x1f, - 0x89, 0xbf, 0x8f, 0x22, 0xc1, 0x4c, 0x98, 0xe7, 0x3a, 0x42, 0x97, 0xe6, 0x40, 0x32, 0x3c, 0xee, - 0x24, 0xa3, 0x35, 0xd4, 0x5c, 0x37, 0xb6, 0xa0, 0x31, 0xac, 0x2d, 0xcd, 0x41, 0x7e, 0xc9, 0x68, - 0x3b, 0xd8, 0x46, 0x5f, 0x66, 0x33, 0xdd, 0x57, 0xa6, 0x38, 0x00, 0x2c, 0x42, 0x7e, 0x93, 0x94, - 0xc6, 0x4c, 0xe6, 0x9b, 0xc4, 0x5a, 0x0f, 0xe5, 0x50, 0x63, 0xff, 0x26, 0x8d, 0xce, 0xd7, 0x43, - 0x66, 0x64, 0x53, 0xe4, 0x04, 0xd1, 0xf9, 0x06, 0xb3, 0x30, 0x96, 0x8b, 0xa9, 0xf2, 0x1a, 0xde, - 0x71, 0xc7, 0xf8, 0x0b, 0xe9, 0x21, 0x5c, 0x00, 0xd9, 0x68, 0x75, 0x49, 0xe7, 0x38, 0xa5, 0xb9, - 0x8f, 0x49, 0x7d, 0x85, 0x7a, 0x45, 0x45, 0x59, 0x1e, 0xb7, 0xaf, 0x90, 0x10, 0x17, 0xe9, 0x63, - 0xf6, 0x3d, 0xe2, 0x28, 0xda, 0x69, 0xeb, 0x4d, 0xec, 0x72, 0x9f, 0x1a, 0x6a, 0xb4, 0x27, 0xcb, - 0x7a, 0x3d, 0x59, 0xa8, 0x9d, 0xe6, 0x0e, 0xd0, 0x4e, 0x87, 0x5d, 0x86, 0xf4, 0x65, 0x4e, 0x2a, - 0x7e, 0x68, 0xcb, 0x90, 0xb1, 0x6c, 0x8c, 0xe1, 0xda, 0x51, 0xef, 0x20, 0xed, 0x58, 0x5b, 0xeb, - 0xb0, 0x9b, 0x34, 0x4c, 0x58, 0x23, 0x3b, 0x34, 0x3b, 0xcc, 0x26, 0x4d, 0x34, 0x0f, 0x63, 0x40, - 0x6b, 0x8e, 0xa1, 0xf5, 0x59, 0x36, 0x8c, 0xa6, 0xbc, 0x4f, 0xda, 0xb5, 0x6c, 0x27, 0xd9, 0x3e, - 0xa9, 0xcb, 0x9d, 0x46, 0xfe, 0x4b, 0x7a, 0xf0, 0x8a, 0x3f, 0x57, 0x3d, 0xaa, 0xe1, 0x33, 0xc1, - 0xc1, 0xab, 0x41, 0x0c, 0xa4, 0x0f, 0xef, 0x9b, 0x0e, 0x69, 0xf0, 0x1c, 0xb6, 0x39, 0xb2, 0x36, - 0x30, 0xb2, 0xa1, 0x73, 0x98, 0xe6, 0x18, 0xcd, 0x43, 0xfa, 0x78, 0x7d, 0x3b, 0x34, 0x70, 0xbe, - 0x61, 0x8c, 0x03, 0xa7, 0xd7, 0x32, 0x73, 0x43, 0xb6, 0xcc, 0x61, 0xf7, 0x7f, 0x98, 0xac, 0x47, - 0x37, 0x60, 0x0e, 0xb3, 0xff, 0x13, 0xc3, 0x44, 0xfa, 0x88, 0xbf, 0x51, 0x86, 0x5c, 0x6d, 0xfc, - 0xe3, 0xe5, 0xb0, 0x73, 0x11, 0x22, 0xab, 0xda, 0xc8, 0x86, 0xcb, 0x61, 0xe6, 0x22, 0x91, 0x2c, - 0x8c, 0x21, 0xf0, 0xfe, 0x51, 0x98, 0x21, 0x4b, 0x22, 0xde, 0x36, 0xeb, 0xb7, 0xd9, 0xa8, 0xf9, - 0x70, 0x8a, 0x6d, 0xf5, 0x1e, 0x98, 0xf4, 0xf6, 0xef, 0xd8, 0xc8, 0x39, 0x2f, 0xd6, 0x3e, 0x3d, - 0x2e, 0x35, 0xff, 0xff, 0x03, 0x39, 0x43, 0x8c, 0x7c, 0xaf, 0x76, 0x58, 0x67, 0x88, 0x43, 0xdd, - 0xaf, 0xfd, 0xd3, 0x60, 0x44, 0xfd, 0x2f, 0xe9, 0x61, 0xde, 0xbb, 0x8f, 0x9b, 0xed, 0xb3, 0x8f, - 0xfb, 0xd1, 0x30, 0x96, 0x35, 0x1e, 0xcb, 0x3b, 0x45, 0x45, 0x38, 0xc2, 0xb1, 0xf6, 0x9d, 0x3e, - 0x9c, 0x67, 0x39, 0x38, 0x17, 0x0e, 0xc4, 0xcb, 0x18, 0x0e, 0x3e, 0x66, 0x83, 0x31, 0xf7, 0x63, - 0x29, 0xb6, 0xe3, 0x9e, 0x53, 0x15, 0xd9, 0x7d, 0xa7, 0x2a, 0xb8, 0x96, 0x9e, 0x3b, 0x60, 0x4b, - 0xff, 0x58, 0x58, 0x3b, 0xea, 0xbc, 0x76, 0x3c, 0x55, 0x1c, 0x91, 0xd1, 0x8d, 0xcc, 0xef, 0xf2, - 0xd5, 0xe3, 0x1c, 0xa7, 0x1e, 0xa5, 0x83, 0x31, 0x93, 0xbe, 0x7e, 0xfc, 0x91, 0x37, 0xa1, 0x3d, - 0xe4, 0xf6, 0x3e, 0xec, 0x56, 0x31, 0x27, 0xc4, 0x91, 0x8d, 0xdc, 0xc3, 0x6c, 0x15, 0x0f, 0xe2, - 0x64, 0x0c, 0xb1, 0xd8, 0x66, 0x61, 0x9a, 0xf0, 0x74, 0xce, 0x68, 0x6d, 0x61, 0x07, 0xbd, 0x8a, - 0xfa, 0x28, 0x7a, 0x91, 0x2f, 0x47, 0x14, 0x9e, 0x28, 0xea, 0xbc, 0x6b, 0x52, 0x8f, 0x0e, 0xca, - 0xe4, 0x7c, 0x88, 0xc1, 0x71, 0x47, 0x50, 0x1c, 0xc8, 0x41, 0xfa, 0x90, 0x7d, 0x98, 0xba, 0xdb, - 0xac, 0xea, 0x97, 0xac, 0x5d, 0x07, 0x3d, 0x38, 0x82, 0x0e, 0x7a, 0x01, 0xf2, 0x6d, 0x42, 0x8d, - 0x1d, 0xcb, 0x88, 0x9f, 0xee, 0x30, 0x11, 0xd0, 0xf2, 0x35, 0xf6, 0x67, 0xd2, 0xb3, 0x19, 0x81, - 0x1c, 0x29, 0x9d, 0x71, 0x9f, 0xcd, 0x18, 0x50, 0xfe, 0x58, 0xee, 0xd8, 0x99, 0x74, 0x4b, 0x37, - 0x76, 0x0c, 0x67, 0x44, 0x11, 0x1c, 0xda, 0x2e, 0x2d, 0x2f, 0x82, 0x03, 0x79, 0x49, 0x7a, 0x62, - 0x34, 0x24, 0x15, 0xf7, 0xf7, 0x71, 0x9f, 0x18, 0x8d, 0x2f, 0x3e, 0x7d, 0x4c, 0x7e, 0x83, 0xb6, - 0xac, 0xb3, 0xd4, 0xf9, 0x36, 0x45, 0xbf, 0xde, 0xa1, 0x1b, 0x0b, 0x65, 0xed, 0xf0, 0x1a, 0x4b, - 0xdf, 0xf2, 0xd3, 0x07, 0xe6, 0xbf, 0xff, 0x38, 0xe4, 0x16, 0xf1, 0xf9, 0xdd, 0x2d, 0x74, 0x07, - 0x4c, 0xd6, 0x6d, 0x8c, 0xcb, 0xe6, 0xa6, 0xe5, 0x4a, 0xd7, 0x71, 0x9f, 0x3d, 0x48, 0xd8, 0x9b, - 0x8b, 0xc7, 0x36, 0xd6, 0x5b, 0xc1, 0xf9, 0x33, 0xef, 0x15, 0xbd, 0x58, 0x82, 0x6c, 0xcd, 0xd1, - 0x1d, 0x34, 0xe5, 0x63, 0x8b, 0x1e, 0x0c, 0x63, 0x71, 0x07, 0x8f, 0xc5, 0xf5, 0x9c, 0x2c, 0x08, - 0x07, 0xf3, 0xee, 0xff, 0x11, 0x00, 0x20, 0x98, 0xbc, 0xbf, 0x6b, 0x99, 0x6e, 0x0e, 0xef, 0x08, - 0xa4, 0xf7, 0x8e, 0x5e, 0xe1, 0x8b, 0xfb, 0x2e, 0x4e, 0xdc, 0x8f, 0x15, 0x2b, 0x62, 0x0c, 0x2b, - 0x6d, 0x12, 0x4c, 0xb9, 0xa2, 0x5d, 0xc1, 0x7a, 0xab, 0x8b, 0x7e, 0x2c, 0x50, 0xfe, 0x08, 0x31, - 0xa3, 0xf7, 0x09, 0x07, 0xe3, 0xa4, 0xb5, 0xf2, 0x89, 0x47, 0x7b, 0x74, 0x78, 0x9b, 0xff, 0x12, - 0x1f, 0x8c, 0xe4, 0x66, 0xc8, 0x1a, 0xe6, 0xa6, 0xc5, 0xfc, 0x0b, 0xaf, 0x8c, 0xa0, 0xed, 0xea, - 0x84, 0x46, 0x32, 0x0a, 0x46, 0xea, 0x8c, 0x67, 0x6b, 0x2c, 0x97, 0xde, 0x65, 0xdd, 0xd2, 0xd1, - 0xff, 0x7f, 0xa0, 0xb0, 0x15, 0x05, 0xb2, 0x1d, 0xdd, 0xd9, 0x66, 0x45, 0x93, 0x67, 0xd7, 0x46, - 0xde, 0x35, 0x75, 0xd3, 0x32, 0x2f, 0xed, 0x18, 0x4f, 0xf7, 0xef, 0xd6, 0xe5, 0xd2, 0x5c, 0xce, - 0xb7, 0xb0, 0x89, 0x6d, 0xdd, 0xc1, 0xb5, 0xbd, 0x2d, 0x32, 0xc7, 0x9a, 0xd4, 0xc2, 0x49, 0x89, - 0xf5, 0xdf, 0xe5, 0x38, 0x5a, 0xff, 0x37, 0x8d, 0x36, 0x26, 0x91, 0x9a, 0x98, 0xfe, 0x7b, 0xef, - 0x89, 0xf4, 0xbf, 0x4f, 0x11, 0xe9, 0xa3, 0xf1, 0x7d, 0x09, 0x66, 0x6a, 0xae, 0xc2, 0xd5, 0x76, - 0x77, 0x76, 0x74, 0xfb, 0x12, 0xba, 0x36, 0x40, 0x25, 0xa4, 0x9a, 0x19, 0xde, 0x2f, 0xe5, 0x0f, - 0x85, 0xaf, 0x95, 0x66, 0x4d, 0x3b, 0x54, 0x42, 0xe2, 0x76, 0xf0, 0x78, 0xc8, 0xb9, 0xea, 0xed, - 0x79, 0x5c, 0xc6, 0x36, 0x04, 0x9a, 0x53, 0x30, 0xa2, 0xd5, 0x40, 0xde, 0xc6, 0x10, 0x4d, 0x43, - 0x82, 0xa3, 0x35, 0x47, 0x6f, 0x5e, 0x58, 0xb6, 0x6c, 0x6b, 0xd7, 0x31, 0x4c, 0xdc, 0x45, 0x8f, - 0x0a, 0x10, 0xf0, 0xf4, 0x3f, 0x13, 0xe8, 0x3f, 0xfa, 0xf7, 0x8c, 0xe8, 0x28, 0xea, 0x77, 0xab, - 0x61, 0xf2, 0x11, 0x01, 0xaa, 0xc4, 0xc6, 0x45, 0x11, 0x8a, 0xe9, 0x0b, 0xed, 0x0d, 0x32, 0x14, - 0xd4, 0x07, 0x3a, 0x96, 0xed, 0xac, 0x5a, 0x4d, 0xbd, 0xdd, 0x75, 0x2c, 0x1b, 0xa3, 0x6a, 0xac, - 0xd4, 0xdc, 0x1e, 0xa6, 0x65, 0x35, 0x83, 0xc1, 0x91, 0xbd, 0x85, 0xd5, 0x4e, 0xe6, 0x75, 0xfc, - 0xc3, 0xc2, 0xbb, 0x8c, 0x54, 0x2a, 0xbd, 0x1c, 0x45, 0xe8, 0x79, 0xbf, 0x2e, 0x2d, 0xd9, 0x61, - 0x09, 0xb1, 0x9d, 0x47, 0x21, 0xa6, 0xc6, 0xb0, 0x54, 0x2e, 0xc1, 0x6c, 0x6d, 0xf7, 0xbc, 0x4f, - 0xa4, 0x1b, 0x36, 0x42, 0x5e, 0x2d, 0x1c, 0xa5, 0x82, 0x29, 0x5e, 0x98, 0x50, 0x84, 0x7c, 0xaf, - 0x83, 0xd9, 0x6e, 0x38, 0x1b, 0xc3, 0x9b, 0x4f, 0x14, 0x8c, 0x4e, 0x31, 0xb8, 0xd4, 0xf4, 0x05, - 0xf8, 0x2e, 0x09, 0x66, 0xab, 0x1d, 0x6c, 0xe2, 0x16, 0xf5, 0x82, 0xe4, 0x04, 0xf8, 0xe2, 0x84, - 0x02, 0xe4, 0x08, 0x45, 0x08, 0x30, 0xf0, 0x58, 0x5e, 0xf4, 0x84, 0x17, 0x24, 0x24, 0x12, 0x5c, - 0x5c, 0x69, 0xe9, 0x0b, 0xee, 0x4b, 0x12, 0x4c, 0x6b, 0xbb, 0xe6, 0xba, 0x6d, 0xb9, 0xa3, 0xb1, - 0x8d, 0xee, 0x0c, 0x3a, 0x88, 0x9b, 0xe0, 0x58, 0x6b, 0xd7, 0x26, 0xeb, 0x4f, 0x65, 0xb3, 0x86, - 0x9b, 0x96, 0xd9, 0xea, 0x92, 0x7a, 0xe4, 0xb4, 0xfd, 0x1f, 0x6e, 0xcf, 0x3e, 0xfb, 0x1b, 0x72, - 0x06, 0x3d, 0x57, 0x38, 0xd4, 0x0d, 0xad, 0x7c, 0xa8, 0x68, 0xf1, 0x9e, 0x40, 0x30, 0xa0, 0xcd, - 0xa0, 0x12, 0xd2, 0x17, 0xee, 0x67, 0x25, 0x50, 0x8a, 0xcd, 0xa6, 0xb5, 0x6b, 0x3a, 0x35, 0xdc, - 0xc6, 0x4d, 0xa7, 0x6e, 0xeb, 0x4d, 0x1c, 0xb6, 0x9f, 0x0b, 0x20, 0xb7, 0x0c, 0x9b, 0xf5, 0xc1, - 0xee, 0x23, 0x93, 0xe3, 0x8b, 0x85, 0x77, 0x1c, 0x69, 0x2d, 0xf7, 0x97, 0x92, 0x40, 0x9c, 0x62, - 0xfb, 0x8a, 0x82, 0x05, 0xa5, 0x2f, 0xd5, 0x8f, 0x49, 0x30, 0xe5, 0xf5, 0xd8, 0x5b, 0x22, 0xc2, - 0xfc, 0x8d, 0x84, 0x93, 0x11, 0x9f, 0x78, 0x02, 0x19, 0xbe, 0x2d, 0xc1, 0xac, 0x22, 0x8a, 0x7e, - 0x32, 0xd1, 0x15, 0x93, 0x8b, 0xce, 0x7d, 0xad, 0x54, 0x1b, 0x4b, 0xd5, 0xd5, 0x45, 0x55, 0x2b, - 0xc8, 0xe8, 0xcb, 0x12, 0x64, 0xd7, 0x0d, 0x73, 0x2b, 0x1c, 0x5d, 0xe9, 0xb8, 0x6b, 0x47, 0xb6, - 0xf0, 0x03, 0xac, 0xa5, 0xd3, 0x17, 0xe5, 0x56, 0x38, 0x6e, 0xee, 0xee, 0x9c, 0xc7, 0x76, 0x75, - 0x93, 0x8c, 0xb2, 0xdd, 0xba, 0x55, 0xc3, 0x26, 0x35, 0x42, 0x73, 0x5a, 0xdf, 0x6f, 0xbc, 0x09, - 0x26, 0x30, 0x79, 0x70, 0x39, 0x89, 0x90, 0xb8, 0xcf, 0x94, 0x14, 0x62, 0x2a, 0xd1, 0xb4, 0xa1, - 0x0f, 0xf1, 0xf4, 0x35, 0xf5, 0x8f, 0x73, 0x70, 0xa2, 0x68, 0x5e, 0x22, 0x36, 0x05, 0xed, 0xe0, - 0x4b, 0xdb, 0xba, 0xb9, 0x85, 0xc9, 0x00, 0xe1, 0x4b, 0x3c, 0x1c, 0xa2, 0x3f, 0xc3, 0x87, 0xe8, - 0x57, 0x34, 0x98, 0xb0, 0xec, 0x16, 0xb6, 0x17, 0x2e, 0x11, 0x9e, 0x7a, 0x97, 0x9d, 0x59, 0x9b, - 0xec, 0x57, 0xc4, 0x3c, 0x23, 0x3f, 0x5f, 0xa5, 0xff, 0x6b, 0x1e, 0xa1, 0x33, 0x37, 0xc1, 0x04, - 0x4b, 0x53, 0x66, 0x60, 0xb2, 0xaa, 0x2d, 0xaa, 0x5a, 0xa3, 0xbc, 0x58, 0x38, 0xa2, 0x5c, 0x06, - 0x47, 0xcb, 0x75, 0x55, 0x2b, 0xd6, 0xcb, 0xd5, 0x4a, 0x83, 0xa4, 0x17, 0x32, 0xe8, 0x59, 0x59, - 0x51, 0xcf, 0xde, 0x78, 0x66, 0xfa, 0xc1, 0xaa, 0xc1, 0x44, 0x93, 0x66, 0x20, 0x43, 0xe8, 0x74, - 0xa2, 0xda, 0x31, 0x82, 0x34, 0x41, 0xf3, 0x08, 0x29, 0xa7, 0x01, 0x2e, 0xda, 0x96, 0xb9, 0x15, - 0x9c, 0x3a, 0x9c, 0xd4, 0x42, 0x29, 0xe8, 0xc1, 0x0c, 0xe4, 0xe9, 0x3f, 0xe4, 0x4a, 0x12, 0xf2, - 0x14, 0x08, 0xde, 0x7b, 0x77, 0x2d, 0x5e, 0x22, 0xaf, 0x60, 0xa2, 0xc5, 0x5e, 0x5d, 0x5d, 0xa4, - 0x32, 0xa0, 0x96, 0x30, 0xab, 0xca, 0xcd, 0x90, 0xa7, 0xff, 0x32, 0xaf, 0x83, 0xe8, 0xf0, 0xa2, - 0x34, 0x9b, 0xa0, 0x9f, 0xb2, 0xb8, 0x4c, 0xd3, 0xd7, 0xe6, 0xf7, 0x4b, 0x30, 0x59, 0xc1, 0x4e, - 0x69, 0x1b, 0x37, 0x2f, 0xa0, 0xc7, 0xf0, 0x0b, 0xa0, 0x6d, 0x03, 0x9b, 0xce, 0x7d, 0x3b, 0x6d, - 0x7f, 0x01, 0xd4, 0x4b, 0x40, 0xcf, 0x09, 0x77, 0xbe, 0x77, 0xf3, 0xfa, 0x73, 0x63, 0x9f, 0xba, - 0x7a, 0x25, 0x44, 0xa8, 0xcc, 0x49, 0xc8, 0xdb, 0xb8, 0xbb, 0xdb, 0xf6, 0x16, 0xd1, 0xd8, 0x1b, - 0x7a, 0xc8, 0x17, 0x67, 0x89, 0x13, 0xe7, 0xcd, 0xe2, 0x45, 0x8c, 0x21, 0x5e, 0x69, 0x16, 0x26, - 0xca, 0xa6, 0xe1, 0x18, 0x7a, 0x1b, 0x3d, 0x37, 0x0b, 0xb3, 0x35, 0xec, 0xac, 0xeb, 0xb6, 0xbe, - 0x83, 0x1d, 0x6c, 0x77, 0xd1, 0x77, 0xf9, 0x3e, 0xa1, 0xd3, 0xd6, 0x9d, 0x4d, 0xcb, 0xde, 0xf1, - 0x54, 0xd3, 0x7b, 0x77, 0x55, 0x73, 0x0f, 0xdb, 0xdd, 0x80, 0x2f, 0xef, 0xd5, 0xfd, 0x72, 0xd1, - 0xb2, 0x2f, 0xb8, 0x83, 0x20, 0x9b, 0xa6, 0xb1, 0x57, 0x97, 0x5e, 0xdb, 0xda, 0x5a, 0xc5, 0x7b, - 0xd8, 0x0b, 0x97, 0xe6, 0xbf, 0xbb, 0x73, 0x81, 0x96, 0x55, 0xb1, 0x1c, 0xb7, 0xd3, 0x5e, 0xb5, - 0xb6, 0x68, 0xbc, 0xd8, 0x49, 0x8d, 0x4f, 0x0c, 0x72, 0xe9, 0x7b, 0x98, 0xe4, 0xca, 0x87, 0x73, - 0xb1, 0x44, 0x65, 0x1e, 0x14, 0xff, 0xb7, 0x3a, 0x6e, 0xe3, 0x1d, 0xec, 0xd8, 0x97, 0xc8, 0xb5, - 0x10, 0x93, 0x5a, 0x9f, 0x2f, 0x6c, 0x80, 0x16, 0x9f, 0xac, 0x33, 0xe9, 0xcd, 0x73, 0x92, 0x3b, - 0xd0, 0x64, 0x5d, 0x84, 0xe2, 0x58, 0xae, 0xbd, 0x92, 0x5d, 0x6b, 0xe6, 0xa5, 0x32, 0x64, 0xc9, - 0xe0, 0xf9, 0xc6, 0x0c, 0xb7, 0xc2, 0xb4, 0x83, 0xbb, 0x5d, 0x7d, 0x0b, 0x7b, 0x2b, 0x4c, 0xec, - 0x55, 0xb9, 0x0d, 0x72, 0x6d, 0x82, 0x29, 0x1d, 0x1c, 0xae, 0xe5, 0x6a, 0xe6, 0x1a, 0x18, 0x2e, - 0x2d, 0x7f, 0x24, 0x20, 0x70, 0x6b, 0xf4, 0x8f, 0x33, 0xf7, 0x40, 0x8e, 0xc2, 0x3f, 0x05, 0xb9, - 0x45, 0x75, 0x61, 0x63, 0xb9, 0x70, 0xc4, 0x7d, 0xf4, 0xf8, 0x9b, 0x82, 0xdc, 0x52, 0xb1, 0x5e, - 0x5c, 0x2d, 0x48, 0x6e, 0x3d, 0xca, 0x95, 0xa5, 0x6a, 0x41, 0x76, 0x13, 0xd7, 0x8b, 0x95, 0x72, - 0xa9, 0x90, 0x55, 0xa6, 0x61, 0xe2, 0x5c, 0x51, 0xab, 0x94, 0x2b, 0xcb, 0x85, 0x1c, 0xfa, 0xdb, - 0x30, 0x7e, 0xb7, 0xf3, 0xf8, 0x5d, 0x17, 0xc5, 0x53, 0x3f, 0xc8, 0x5e, 0xe6, 0x43, 0x76, 0x27, - 0x07, 0xd9, 0x8f, 0x8b, 0x10, 0x19, 0x83, 0x3b, 0x53, 0x1e, 0x26, 0xd6, 0x6d, 0xab, 0x89, 0xbb, - 0x5d, 0xf4, 0x9b, 0x12, 0xe4, 0x4b, 0xba, 0xd9, 0xc4, 0x6d, 0x74, 0x45, 0x00, 0x15, 0x75, 0x15, - 0xcd, 0xf8, 0xa7, 0xc5, 0xfe, 0x31, 0x23, 0xda, 0xfb, 0x31, 0xba, 0xf3, 0x94, 0x66, 0x84, 0x7c, - 0xc4, 0x7a, 0xb9, 0x58, 0x52, 0x63, 0xb8, 0x1a, 0x47, 0x82, 0x29, 0xb6, 0x1a, 0x70, 0x1e, 0x87, - 0xe7, 0xe1, 0xdf, 0xcd, 0x88, 0x4e, 0x0e, 0xbd, 0x1a, 0xf8, 0x64, 0x22, 0xe4, 0x21, 0x36, 0x11, - 0x1c, 0x44, 0x6d, 0x0c, 0x9b, 0x87, 0x12, 0x4c, 0x6f, 0x98, 0xdd, 0x7e, 0x42, 0x11, 0x8f, 0xa3, - 0xef, 0x55, 0x23, 0x44, 0xe8, 0x40, 0x71, 0xf4, 0x07, 0xd3, 0x4b, 0x5f, 0x30, 0xdf, 0xcd, 0xc0, - 0xf1, 0x65, 0x6c, 0x62, 0xdb, 0x68, 0xd2, 0x1a, 0x78, 0x92, 0xb8, 0x93, 0x97, 0xc4, 0x63, 0x38, - 0xce, 0xfb, 0xfd, 0xc1, 0x4b, 0xe0, 0x95, 0xbe, 0x04, 0xee, 0xe6, 0x24, 0x70, 0x93, 0x20, 0x9d, - 0x31, 0xdc, 0x87, 0x3e, 0x05, 0x33, 0x15, 0xcb, 0x31, 0x36, 0x8d, 0x26, 0xf5, 0x41, 0x7b, 0x89, - 0x0c, 0xd9, 0x55, 0xa3, 0xeb, 0xa0, 0x62, 0xd0, 0x9d, 0x5c, 0x03, 0xd3, 0x86, 0xd9, 0x6c, 0xef, - 0xb6, 0xb0, 0x86, 0x75, 0xda, 0xaf, 0x4c, 0x6a, 0xe1, 0xa4, 0x60, 0x6b, 0xdf, 0x65, 0x4b, 0xf6, - 0xb6, 0xf6, 0x3f, 0x25, 0xbc, 0x0c, 0x13, 0x66, 0x81, 0x04, 0xa4, 0x8c, 0xb0, 0xbb, 0x8a, 0x30, - 0x6b, 0x86, 0xb2, 0x7a, 0x06, 0x7b, 0xef, 0x85, 0x02, 0x61, 0x72, 0x1a, 0xff, 0x07, 0x7a, 0x8f, - 0x50, 0x63, 0x1d, 0xc4, 0x50, 0x32, 0x64, 0x96, 0x86, 0x98, 0x24, 0x2b, 0x30, 0x57, 0xae, 0xd4, - 0x55, 0xad, 0x52, 0x5c, 0x65, 0x59, 0x64, 0xf4, 0x7d, 0x09, 0x72, 0x1a, 0xee, 0xb4, 0x2f, 0x85, - 0x23, 0x46, 0x33, 0x47, 0xf1, 0x8c, 0xef, 0x28, 0xae, 0x2c, 0x01, 0xe8, 0x4d, 0xb7, 0x60, 0x72, - 0xa5, 0x96, 0xd4, 0x37, 0x8e, 0x29, 0x57, 0xc1, 0xa2, 0x9f, 0x5b, 0x0b, 0xfd, 0x89, 0x9e, 0x27, - 0xbc, 0x73, 0xc4, 0x51, 0x23, 0x1c, 0x46, 0xf4, 0x09, 0xef, 0x15, 0xda, 0xec, 0x19, 0x48, 0xee, - 0x70, 0xc4, 0xff, 0x15, 0x09, 0xb2, 0x75, 0xb7, 0xb7, 0x0c, 0x75, 0x9c, 0x9f, 0x1c, 0x4e, 0xc7, - 0x5d, 0x32, 0x11, 0x3a, 0x7e, 0x17, 0xcc, 0x84, 0x35, 0x96, 0xb9, 0x4a, 0xc4, 0xaa, 0x38, 0xf7, - 0xc3, 0x30, 0x1a, 0xde, 0x87, 0x9d, 0xc3, 0x11, 0xf1, 0xc7, 0x1f, 0x0b, 0xb0, 0x86, 0x77, 0xce, - 0x63, 0xbb, 0xbb, 0x6d, 0x74, 0xd0, 0xdf, 0xc9, 0x30, 0xb5, 0x8c, 0x9d, 0x9a, 0xa3, 0x3b, 0xbb, - 0xdd, 0x9e, 0xed, 0x4e, 0xd3, 0x2a, 0xe9, 0xcd, 0x6d, 0xcc, 0xba, 0x23, 0xef, 0x15, 0xbd, 0x43, - 0x16, 0xf5, 0x27, 0x0a, 0xca, 0x99, 0xf7, 0xcb, 0x88, 0xc0, 0xe4, 0x71, 0x90, 0x6d, 0xe9, 0x8e, - 0xce, 0xb0, 0xb8, 0xa2, 0x07, 0x8b, 0x80, 0x90, 0x46, 0xb2, 0xa1, 0xdf, 0x95, 0x44, 0x1c, 0x8a, - 0x04, 0xca, 0x4f, 0x06, 0xc2, 0x7b, 0x32, 0x43, 0xa0, 0x70, 0x0c, 0x66, 0x2b, 0xd5, 0x7a, 0x63, - 0xb5, 0xba, 0xbc, 0xac, 0xba, 0xa9, 0x05, 0x59, 0x39, 0x09, 0xca, 0x7a, 0xf1, 0xbe, 0x35, 0xb5, - 0x52, 0x6f, 0x54, 0xaa, 0x8b, 0x2a, 0xfb, 0x33, 0xab, 0x1c, 0x85, 0xe9, 0x52, 0xb1, 0xb4, 0xe2, - 0x25, 0xe4, 0x94, 0x53, 0x70, 0x7c, 0x4d, 0x5d, 0x5b, 0x50, 0xb5, 0xda, 0x4a, 0x79, 0xbd, 0xe1, - 0x92, 0x59, 0xaa, 0x6e, 0x54, 0x16, 0x0b, 0x79, 0x05, 0xc1, 0xc9, 0xd0, 0x97, 0x73, 0x5a, 0xb5, - 0xb2, 0xdc, 0xa8, 0xd5, 0x8b, 0x75, 0xb5, 0x30, 0xa1, 0x5c, 0x06, 0x47, 0x4b, 0xc5, 0x0a, 0xc9, - 0x5e, 0xaa, 0x56, 0x2a, 0x6a, 0xa9, 0x5e, 0x98, 0x44, 0xff, 0x9e, 0x85, 0xe9, 0x72, 0xb7, 0xa2, - 0xef, 0xe0, 0xb3, 0x7a, 0xdb, 0x68, 0xa1, 0xe7, 0x86, 0x66, 0x1e, 0xd7, 0xc1, 0xac, 0x4d, 0x1f, - 0x71, 0xab, 0x6e, 0x60, 0x8a, 0xe6, 0xac, 0xc6, 0x27, 0xba, 0x73, 0x72, 0x93, 0x10, 0xf0, 0xe6, - 0xe4, 0xf4, 0x4d, 0x59, 0x00, 0xa0, 0x4f, 0xf5, 0xe0, 0x72, 0xd7, 0x33, 0xbd, 0xad, 0x49, 0xdf, - 0xc1, 0x5d, 0x6c, 0xef, 0x19, 0x4d, 0xec, 0xe5, 0xd4, 0x42, 0x7f, 0xa1, 0xaf, 0xca, 0xa2, 0xfb, - 0x8b, 0x21, 0x50, 0x43, 0xd5, 0x89, 0xe8, 0x0d, 0x7f, 0x59, 0x16, 0xd9, 0x1d, 0x14, 0x22, 0x99, - 0x4c, 0x53, 0x5e, 0x20, 0x0d, 0xb7, 0x6c, 0x5b, 0xaf, 0x56, 0x1b, 0xb5, 0x95, 0xaa, 0x56, 0x2f, - 0xc8, 0xca, 0x0c, 0x4c, 0xba, 0xaf, 0xab, 0xd5, 0xca, 0x72, 0x21, 0xab, 0x9c, 0x80, 0x63, 0x2b, - 0xc5, 0x5a, 0xa3, 0x5c, 0x39, 0x5b, 0x5c, 0x2d, 0x2f, 0x36, 0x4a, 0x2b, 0x45, 0xad, 0x56, 0xc8, - 0x29, 0x57, 0xc0, 0x89, 0x7a, 0x59, 0xd5, 0x1a, 0x4b, 0x6a, 0xb1, 0xbe, 0xa1, 0xa9, 0xb5, 0x46, - 0xa5, 0xda, 0xa8, 0x14, 0xd7, 0xd4, 0x42, 0xde, 0x6d, 0xfe, 0xe4, 0x53, 0xa0, 0x36, 0x13, 0xfb, - 0x95, 0x71, 0x32, 0x42, 0x19, 0xa7, 0x7a, 0x95, 0x11, 0xc2, 0x6a, 0xa5, 0xa9, 0x35, 0x55, 0x3b, - 0xab, 0x16, 0xa6, 0xfb, 0xe9, 0xda, 0x8c, 0x72, 0x1c, 0x0a, 0x2e, 0x0f, 0x8d, 0x72, 0xcd, 0xcb, - 0xb9, 0x58, 0x98, 0x45, 0x1f, 0xcb, 0xc3, 0x49, 0x0d, 0x6f, 0x19, 0x5d, 0x07, 0xdb, 0xeb, 0xfa, - 0xa5, 0x1d, 0x6c, 0x3a, 0x5e, 0x27, 0xff, 0x2f, 0x89, 0x95, 0x71, 0x0d, 0x66, 0x3b, 0x94, 0xc6, - 0x1a, 0x76, 0xb6, 0xad, 0x16, 0x1b, 0x85, 0x1f, 0x13, 0xd9, 0x73, 0xcc, 0xaf, 0x87, 0xb3, 0x6b, - 0xfc, 0xdf, 0x21, 0xdd, 0x96, 0x63, 0x74, 0x3b, 0x3b, 0x8c, 0x6e, 0x2b, 0x57, 0xc1, 0xd4, 0x6e, - 0x17, 0xdb, 0xea, 0x8e, 0x6e, 0xb4, 0xbd, 0xcb, 0x39, 0xfd, 0x04, 0xf4, 0xd6, 0xac, 0xe8, 0x89, - 0x95, 0x50, 0x5d, 0xfa, 0x8b, 0x31, 0xa2, 0x6f, 0x3d, 0x0d, 0xc0, 0x2a, 0xbb, 0x61, 0xb7, 0x99, - 0xb2, 0x86, 0x52, 0x5c, 0xfe, 0xce, 0x1b, 0xed, 0xb6, 0x61, 0x6e, 0xf9, 0xfb, 0xfe, 0x41, 0x02, - 0x7a, 0x81, 0x2c, 0x72, 0x82, 0x25, 0x29, 0x6f, 0xc9, 0x5a, 0xd3, 0xf3, 0xa4, 0x31, 0xf7, 0xbb, - 0xfb, 0x9b, 0x4e, 0x5e, 0x29, 0xc0, 0x0c, 0x49, 0x63, 0x2d, 0xb0, 0x30, 0xe1, 0xf6, 0xc1, 0x1e, - 0xb9, 0x35, 0xb5, 0xbe, 0x52, 0x5d, 0xf4, 0xbf, 0x4d, 0xba, 0x24, 0x5d, 0x66, 0x8a, 0x95, 0xfb, - 0x48, 0x6b, 0x9c, 0x52, 0x1e, 0x05, 0x57, 0x84, 0x3a, 0xec, 0xe2, 0xaa, 0xa6, 0x16, 0x17, 0xef, - 0x6b, 0xa8, 0x4f, 0x2b, 0xd7, 0xea, 0x35, 0xbe, 0x71, 0x79, 0xed, 0x68, 0xda, 0xe5, 0x57, 0x5d, - 0x2b, 0x96, 0x57, 0x59, 0xff, 0xbe, 0x54, 0xd5, 0xd6, 0x8a, 0xf5, 0xc2, 0x0c, 0x7a, 0xa9, 0x0c, - 0x85, 0x65, 0xec, 0xac, 0x5b, 0xb6, 0xa3, 0xb7, 0x57, 0x0d, 0xf3, 0xc2, 0x86, 0xdd, 0xe6, 0x26, - 0x9b, 0xc2, 0x61, 0x3a, 0xf8, 0x21, 0x92, 0x23, 0x18, 0xbd, 0x23, 0xde, 0x21, 0xd9, 0x02, 0x65, - 0x0a, 0x12, 0xd0, 0x33, 0x24, 0x91, 0xe5, 0x6e, 0xf1, 0x52, 0x93, 0xe9, 0xc9, 0x33, 0xc7, 0x3d, - 0x3e, 0xf7, 0x41, 0x2d, 0x8f, 0x9e, 0x9d, 0x85, 0xc9, 0x25, 0xc3, 0xd4, 0xdb, 0xc6, 0xd3, 0xb9, - 0xf8, 0xa5, 0x41, 0x1f, 0x93, 0x89, 0xe9, 0x63, 0xa4, 0xa1, 0xc6, 0xcf, 0x5f, 0x97, 0x45, 0x97, - 0x17, 0x42, 0xb2, 0xf7, 0x98, 0x8c, 0x18, 0x3c, 0x3f, 0x20, 0x89, 0x2c, 0x2f, 0x0c, 0xa6, 0x97, - 0x0c, 0xc3, 0x4f, 0xfc, 0x70, 0xd8, 0x58, 0x3d, 0xed, 0x7b, 0xb2, 0x9f, 0x2a, 0x4c, 0xa1, 0x3f, - 0x97, 0x01, 0x2d, 0x63, 0xe7, 0x2c, 0xb6, 0xfd, 0xa9, 0x00, 0xe9, 0xf5, 0x99, 0xbd, 0x1d, 0x6a, - 0xb2, 0x6f, 0x0c, 0x03, 0x78, 0x8e, 0x07, 0xb0, 0x18, 0xd3, 0x78, 0x22, 0x48, 0x47, 0x34, 0xde, - 0x32, 0xe4, 0xbb, 0xe4, 0x3b, 0x53, 0xb3, 0xc7, 0x47, 0x0f, 0x97, 0x84, 0x58, 0x98, 0x3a, 0x25, - 0xac, 0x31, 0x02, 0xe8, 0x7b, 0xfe, 0x24, 0xe8, 0xa7, 0x39, 0xed, 0x58, 0x3a, 0x30, 0xb3, 0xc9, - 0xf4, 0xc5, 0x4e, 0x57, 0x5d, 0xfa, 0xd9, 0x37, 0xe8, 0x03, 0x39, 0x38, 0xde, 0xaf, 0x3a, 0xe8, - 0xf7, 0x32, 0xdc, 0x0e, 0x3b, 0x26, 0x43, 0x7e, 0x86, 0x6d, 0x20, 0xba, 0x2f, 0xca, 0x13, 0xe1, - 0x84, 0xbf, 0x0c, 0x57, 0xb7, 0x2a, 0xf8, 0x62, 0xb7, 0x8d, 0x1d, 0x07, 0xdb, 0xa4, 0x6a, 0x93, - 0x5a, 0xff, 0x8f, 0xca, 0x93, 0xe1, 0x72, 0xc3, 0xec, 0x1a, 0x2d, 0x6c, 0xd7, 0x8d, 0x4e, 0xb7, - 0x68, 0xb6, 0xea, 0xbb, 0x8e, 0x65, 0x1b, 0x3a, 0xbb, 0x4a, 0x72, 0x52, 0x8b, 0xfa, 0xac, 0xdc, - 0x08, 0x05, 0xa3, 0x5b, 0x35, 0xcf, 0x5b, 0xba, 0xdd, 0x32, 0xcc, 0xad, 0x55, 0xa3, 0xeb, 0x30, - 0x0f, 0xe0, 0x7d, 0xe9, 0xe8, 0xef, 0x65, 0xd1, 0xc3, 0x74, 0x03, 0x60, 0x8d, 0xe8, 0x50, 0x9e, - 0x23, 0x8b, 0x1c, 0x8f, 0x4b, 0x46, 0x3b, 0x99, 0xb2, 0x3c, 0x6b, 0xdc, 0x86, 0x44, 0xff, 0x11, - 0x9c, 0x74, 0x2d, 0x34, 0xdd, 0x33, 0x04, 0xce, 0xaa, 0x5a, 0x79, 0xa9, 0xac, 0xba, 0x66, 0xc5, - 0x09, 0x38, 0x16, 0x7c, 0x5b, 0xbc, 0xaf, 0x51, 0x53, 0x2b, 0xf5, 0xc2, 0xa4, 0xdb, 0x4f, 0xd1, - 0xe4, 0xa5, 0x62, 0x79, 0x55, 0x5d, 0x6c, 0xd4, 0xab, 0xee, 0x97, 0xc5, 0xe1, 0x4c, 0x0b, 0xf4, - 0x60, 0x16, 0x8e, 0x12, 0xd9, 0x5e, 0x22, 0x52, 0x75, 0x85, 0xd2, 0xe3, 0x6b, 0xeb, 0x03, 0x34, - 0x45, 0xc5, 0x8b, 0x3e, 0x23, 0x7c, 0x53, 0x66, 0x08, 0xc2, 0x9e, 0x32, 0x22, 0x34, 0xe3, 0xbb, - 0x92, 0x48, 0x84, 0x0a, 0x61, 0xb2, 0xc9, 0x94, 0xe2, 0x5f, 0xc7, 0x3d, 0xe2, 0x44, 0x83, 0x4f, - 0xac, 0xcc, 0x12, 0xf9, 0xf9, 0x69, 0xeb, 0x65, 0x8d, 0xa8, 0xc3, 0x1c, 0x00, 0x49, 0x21, 0x1a, - 0x44, 0xf5, 0xa0, 0xef, 0x78, 0x15, 0xa5, 0x07, 0xc5, 0x52, 0xbd, 0x7c, 0x56, 0x8d, 0xd2, 0x83, - 0x4f, 0xcb, 0x30, 0xb9, 0x8c, 0x1d, 0x77, 0x4e, 0xd5, 0x45, 0x4f, 0x11, 0x58, 0xff, 0x71, 0xcd, - 0x98, 0xb6, 0xd5, 0xd4, 0xdb, 0xfe, 0x32, 0x00, 0x7d, 0x43, 0xbf, 0x34, 0x8c, 0x09, 0xe2, 0x15, - 0x1d, 0x31, 0x5e, 0xfd, 0x24, 0xe4, 0x1c, 0xf7, 0x33, 0x5b, 0x86, 0xfe, 0xb1, 0xc8, 0xe1, 0xca, - 0x25, 0xb2, 0xa8, 0x3b, 0xba, 0x46, 0xf3, 0x87, 0x46, 0x27, 0x41, 0xdb, 0x25, 0x82, 0x91, 0x1f, - 0x46, 0xfb, 0xf3, 0x6f, 0x65, 0x38, 0x41, 0xdb, 0x47, 0xb1, 0xd3, 0xa9, 0x39, 0x96, 0x8d, 0x35, - 0xdc, 0xc4, 0x46, 0xc7, 0xe9, 0x59, 0xdf, 0xb3, 0x69, 0xaa, 0xb7, 0xd9, 0xcc, 0x5e, 0xd1, 0xeb, - 0x64, 0xd1, 0x18, 0xcc, 0xfb, 0xda, 0x63, 0x4f, 0x79, 0x11, 0x8d, 0xfd, 0xa3, 0x92, 0x48, 0x54, - 0xe5, 0x84, 0xc4, 0x93, 0x01, 0xf5, 0xa1, 0x43, 0x00, 0xca, 0x5b, 0xb9, 0xd1, 0xd4, 0x92, 0x5a, - 0x5e, 0x77, 0x07, 0x81, 0xab, 0xe1, 0xca, 0xf5, 0x0d, 0xad, 0xb4, 0x52, 0xac, 0xa9, 0x0d, 0x4d, - 0x5d, 0x2e, 0xd7, 0xea, 0xcc, 0x29, 0x8b, 0xfe, 0x35, 0xa1, 0x5c, 0x05, 0xa7, 0x6a, 0x1b, 0x0b, - 0xb5, 0x92, 0x56, 0x5e, 0x27, 0xe9, 0x9a, 0x5a, 0x51, 0xcf, 0xb1, 0xaf, 0x93, 0xe8, 0x7d, 0x05, - 0x98, 0x76, 0x27, 0x00, 0x35, 0x3a, 0x2f, 0x40, 0xdf, 0xca, 0xc2, 0xb4, 0x86, 0xbb, 0x56, 0x7b, - 0x8f, 0xcc, 0x11, 0xc6, 0x35, 0xf5, 0xf8, 0x8e, 0x2c, 0x7a, 0x7e, 0x3b, 0xc4, 0xec, 0x7c, 0x88, - 0xd1, 0xe8, 0x89, 0xa6, 0xbe, 0xa7, 0x1b, 0x6d, 0xfd, 0x3c, 0xeb, 0x6a, 0x26, 0xb5, 0x20, 0x41, - 0x99, 0x07, 0xc5, 0xba, 0x68, 0x62, 0xbb, 0xd6, 0xbc, 0xa8, 0x3a, 0xdb, 0xc5, 0x56, 0xcb, 0xc6, - 0xdd, 0x2e, 0x5b, 0xbd, 0xe8, 0xf3, 0x45, 0xb9, 0x01, 0x8e, 0x92, 0xd4, 0x50, 0x66, 0xea, 0x20, - 0xd3, 0x9b, 0xec, 0xe7, 0x2c, 0x9a, 0x97, 0xbc, 0x9c, 0xb9, 0x50, 0xce, 0x20, 0x39, 0x7c, 0x5c, - 0x22, 0xcf, 0x9f, 0xd2, 0xb9, 0x06, 0xa6, 0x4d, 0x7d, 0x07, 0xab, 0x0f, 0x74, 0x0c, 0x1b, 0x77, - 0x89, 0x63, 0x8c, 0xac, 0x85, 0x93, 0xd0, 0x07, 0x84, 0xce, 0x9b, 0x8b, 0x49, 0x2c, 0x99, 0xee, - 0x2f, 0x0f, 0xa1, 0xfa, 0x7d, 0xfa, 0x19, 0x19, 0xbd, 0x4f, 0x86, 0x19, 0xc6, 0x54, 0xd1, 0xbc, - 0x54, 0x6e, 0xa1, 0xab, 0x39, 0xe3, 0x57, 0x77, 0xd3, 0x3c, 0xe3, 0x97, 0xbc, 0xa0, 0x5f, 0x91, - 0x45, 0xdd, 0x9d, 0xfb, 0x54, 0x9c, 0x94, 0x11, 0xed, 0x38, 0xba, 0x69, 0xed, 0x32, 0x47, 0xd5, - 0x49, 0x8d, 0xbe, 0xa4, 0xb9, 0xa8, 0x87, 0x3e, 0x28, 0xe4, 0x4c, 0x2d, 0x58, 0x8d, 0x43, 0x02, - 0xf0, 0xe3, 0x32, 0xcc, 0x31, 0xae, 0x6a, 0xec, 0x9c, 0x8f, 0xd0, 0x81, 0xb7, 0x5f, 0x15, 0x36, - 0x04, 0xfb, 0xd4, 0x9f, 0x95, 0xf4, 0x88, 0x01, 0xf2, 0xc3, 0x42, 0xc1, 0xd1, 0x84, 0x2b, 0x72, - 0x48, 0x50, 0xbe, 0x2d, 0x0b, 0xd3, 0x1b, 0x5d, 0x6c, 0x33, 0xbf, 0x7d, 0xf4, 0x50, 0x16, 0xe4, - 0x65, 0xcc, 0x6d, 0xa4, 0x3e, 0x5f, 0xd8, 0xc3, 0x37, 0x5c, 0xd9, 0x10, 0x51, 0xd7, 0x46, 0x8a, - 0x80, 0xed, 0x7a, 0x98, 0xa3, 0x22, 0x2d, 0x3a, 0x8e, 0x6b, 0x24, 0x7a, 0xde, 0xb4, 0x3d, 0xa9, - 0xa3, 0xd8, 0x2a, 0x22, 0x65, 0xb9, 0x59, 0x4a, 0x2e, 0x4f, 0xab, 0x78, 0x93, 0xce, 0x67, 0xb3, - 0x5a, 0x4f, 0xaa, 0x72, 0x0b, 0x5c, 0x66, 0x75, 0x30, 0x3d, 0xbf, 0x12, 0xca, 0x9c, 0x23, 0x99, - 0xfb, 0x7d, 0x42, 0xdf, 0x12, 0xf2, 0xd5, 0x15, 0x97, 0x4e, 0x32, 0x5d, 0xe8, 0x8c, 0xc6, 0x24, - 0x39, 0x0e, 0x05, 0x37, 0x07, 0xd9, 0x7f, 0xd1, 0xd4, 0x5a, 0x75, 0xf5, 0xac, 0xda, 0x7f, 0x19, - 0x23, 0x87, 0x9e, 0x25, 0xc3, 0xd4, 0x82, 0x6d, 0xe9, 0xad, 0xa6, 0xde, 0x75, 0xd0, 0xf7, 0x24, - 0x98, 0x59, 0xd7, 0x2f, 0xb5, 0x2d, 0xbd, 0x45, 0xfc, 0xfb, 0x7b, 0xfa, 0x82, 0x0e, 0xfd, 0xe4, - 0xf5, 0x05, 0xec, 0x95, 0x3f, 0x18, 0xe8, 0x1f, 0xdd, 0xcb, 0x88, 0x5c, 0xa8, 0xe9, 0x6f, 0xf3, - 0x49, 0xfd, 0x82, 0x95, 0x7a, 0x7c, 0xcd, 0x87, 0x79, 0x8a, 0xb0, 0x28, 0xdf, 0x27, 0x16, 0x7e, - 0x54, 0x84, 0xe4, 0xe1, 0xec, 0xca, 0x3f, 0x7b, 0x12, 0xf2, 0x8b, 0x98, 0x58, 0x71, 0xff, 0x43, - 0x82, 0x89, 0x1a, 0x76, 0x88, 0x05, 0x77, 0x1b, 0xe7, 0x29, 0xdc, 0x22, 0x19, 0x02, 0x27, 0x76, - 0xef, 0xdd, 0x9d, 0xac, 0x87, 0xce, 0x5b, 0x93, 0xe7, 0x04, 0x1e, 0x89, 0xb4, 0xdc, 0x79, 0x56, - 0xe6, 0x81, 0x3c, 0x12, 0x63, 0x49, 0xa5, 0xef, 0x6b, 0xf5, 0x0e, 0x89, 0xb9, 0x56, 0x85, 0x7a, - 0xbd, 0x57, 0x85, 0xf5, 0x33, 0xd6, 0xdb, 0x8c, 0x31, 0x1f, 0xe3, 0x1c, 0xf5, 0x04, 0x98, 0xa0, - 0x32, 0xf7, 0xe6, 0xa3, 0xbd, 0x7e, 0x0a, 0x94, 0x04, 0x39, 0x7b, 0xed, 0xe5, 0x14, 0x74, 0x51, - 0x8b, 0x2e, 0x7c, 0x2c, 0x31, 0x08, 0x66, 0x2a, 0xd8, 0xb9, 0x68, 0xd9, 0x17, 0x6a, 0x8e, 0xee, - 0x60, 0xf4, 0xaf, 0x12, 0xc8, 0x35, 0xec, 0x84, 0xa3, 0x9f, 0x54, 0xe0, 0x18, 0xad, 0x10, 0xcb, - 0x48, 0xfa, 0x6f, 0x5a, 0x91, 0x6b, 0xfa, 0x0a, 0x21, 0x94, 0x4f, 0xdb, 0xff, 0x2b, 0xfa, 0xcd, - 0xbe, 0x41, 0x9f, 0xa4, 0x3e, 0x93, 0x06, 0x26, 0x99, 0x30, 0x83, 0xae, 0x82, 0x45, 0xe8, 0xe9, - 0xfb, 0x85, 0xcc, 0x6a, 0x31, 0x9a, 0x87, 0xd3, 0x15, 0x7c, 0xf8, 0x0a, 0xc8, 0x96, 0xb6, 0x75, - 0x07, 0xbd, 0x5d, 0x06, 0x28, 0xb6, 0x5a, 0x6b, 0xd4, 0x07, 0x3c, 0xec, 0x90, 0x76, 0x06, 0x66, - 0x9a, 0xdb, 0x7a, 0x70, 0xb7, 0x09, 0xed, 0x0f, 0xb8, 0x34, 0xe5, 0x89, 0x81, 0x33, 0x39, 0x95, - 0x2a, 0xea, 0x81, 0xc9, 0x2d, 0x83, 0xd1, 0xf6, 0x1d, 0xcd, 0xf9, 0x50, 0x98, 0xb1, 0x47, 0xe8, - 0xdc, 0xdf, 0xe7, 0x03, 0xf6, 0xa2, 0xe7, 0x70, 0x8c, 0xb4, 0x7f, 0xc0, 0x26, 0x48, 0x48, 0x78, - 0xd2, 0x5b, 0x2c, 0xa0, 0x47, 0x3c, 0x5f, 0x63, 0x09, 0x5d, 0xab, 0xa8, 0x2d, 0xc3, 0x13, 0x2d, - 0x0b, 0x98, 0x85, 0x9e, 0x97, 0x49, 0x06, 0x5f, 0xbc, 0xe0, 0xee, 0x86, 0x59, 0xdc, 0x32, 0x1c, - 0xec, 0xd5, 0x92, 0x09, 0x30, 0x0e, 0x62, 0xfe, 0x07, 0xf4, 0x4c, 0xe1, 0xa0, 0x6b, 0x44, 0xa0, - 0xfb, 0x6b, 0x14, 0xd1, 0xfe, 0xc4, 0xc2, 0xa8, 0x89, 0xd1, 0x4c, 0x1f, 0xac, 0x5f, 0x92, 0xe1, - 0x44, 0xdd, 0xda, 0xda, 0x6a, 0x63, 0x4f, 0x4c, 0x98, 0x7a, 0x67, 0x22, 0x7d, 0x94, 0x70, 0x91, - 0x9d, 0x20, 0xeb, 0x7e, 0xc3, 0x3f, 0x4a, 0xe6, 0xbe, 0xf0, 0x27, 0xa6, 0x62, 0x67, 0x51, 0x44, - 0x5c, 0x7d, 0xf9, 0x8c, 0x40, 0x41, 0x2c, 0xe0, 0xb3, 0x30, 0xd9, 0xf4, 0x81, 0xf8, 0xa2, 0x04, - 0xb3, 0xf4, 0xe6, 0x4a, 0x4f, 0x41, 0xef, 0x1d, 0x21, 0x00, 0xe8, 0x7b, 0x19, 0x51, 0x3f, 0x5b, - 0x22, 0x13, 0x8e, 0x93, 0x08, 0x11, 0x8b, 0x05, 0x55, 0x19, 0x48, 0x2e, 0x7d, 0xd1, 0xfe, 0x89, - 0x0c, 0xd3, 0xcb, 0xd8, 0x6b, 0x69, 0xdd, 0xc4, 0x3d, 0xd1, 0x19, 0x98, 0x21, 0xd7, 0xb7, 0x55, - 0xd9, 0x31, 0x49, 0xba, 0x6a, 0xc6, 0xa5, 0x29, 0xd7, 0xc1, 0xec, 0x79, 0xbc, 0x69, 0xd9, 0xb8, - 0xca, 0x9d, 0xa5, 0xe4, 0x13, 0x23, 0xc2, 0xd3, 0x71, 0x71, 0xd0, 0x16, 0x78, 0x6c, 0x6e, 0xda, - 0x2f, 0xcc, 0x50, 0x55, 0x22, 0xc6, 0x9c, 0x27, 0xc1, 0x24, 0x43, 0xde, 0x33, 0xd3, 0xe2, 0xfa, - 0x45, 0x3f, 0x2f, 0x7a, 0xad, 0x8f, 0xa8, 0xca, 0x21, 0xfa, 0xf8, 0x24, 0x4c, 0x8c, 0xe5, 0x7e, - 0xf7, 0x42, 0xa8, 0xfc, 0x85, 0x4b, 0xe5, 0x56, 0x17, 0xad, 0x25, 0xc3, 0xf4, 0x34, 0x80, 0xdf, - 0x38, 0xbc, 0xb0, 0x16, 0xa1, 0x14, 0x3e, 0x72, 0x7d, 0xec, 0x41, 0xbd, 0x5e, 0x71, 0x10, 0x76, - 0x46, 0x0c, 0x8c, 0xd8, 0x01, 0x3f, 0x11, 0x4e, 0xd2, 0x47, 0xe7, 0x53, 0x32, 0x9c, 0xf0, 0xcf, - 0x1f, 0xad, 0xea, 0xdd, 0xa0, 0xdd, 0x95, 0x92, 0x41, 0xc4, 0x1d, 0xf8, 0xf0, 0x1b, 0xcb, 0xb7, - 0x93, 0x8d, 0x19, 0x7d, 0x39, 0x19, 0x2d, 0x3a, 0xca, 0x4d, 0x70, 0xcc, 0xdc, 0xdd, 0xf1, 0xa5, - 0x4e, 0x5a, 0x3c, 0x6b, 0xe1, 0xfb, 0x3f, 0x24, 0x19, 0x99, 0x44, 0x98, 0x1f, 0xcb, 0x9c, 0x92, - 0x3b, 0xd2, 0xf5, 0xb8, 0x44, 0x30, 0xa2, 0x7f, 0xce, 0x24, 0xea, 0xdd, 0x06, 0x9f, 0xf9, 0x4a, - 0xd0, 0x4b, 0x1d, 0xe6, 0x81, 0xaf, 0x6f, 0x67, 0x41, 0x2e, 0x76, 0x0c, 0xf4, 0x41, 0x09, 0xa6, - 0x6b, 0x8e, 0x6e, 0x3b, 0x35, 0x6c, 0xef, 0x61, 0x3b, 0x3c, 0x33, 0x7f, 0x9d, 0xf0, 0x5c, 0xa3, - 0xd8, 0x31, 0xe6, 0x43, 0x44, 0x22, 0x24, 0xf3, 0x79, 0xa1, 0xf9, 0x41, 0x3c, 0xad, 0x64, 0x82, - 0xc1, 0x43, 0x4c, 0xf9, 0x4e, 0xc0, 0xb1, 0xf5, 0xaa, 0x56, 0xf7, 0x77, 0xe7, 0x37, 0x6a, 0xea, - 0x62, 0x41, 0x56, 0x10, 0x9c, 0x24, 0x7e, 0xd2, 0x9a, 0xff, 0xa1, 0x56, 0x2f, 0x6a, 0x75, 0x75, - 0xb1, 0x90, 0x45, 0xaf, 0x91, 0x00, 0x6a, 0x8e, 0xd5, 0xd9, 0x2f, 0x42, 0xf1, 0x43, 0xf7, 0xb4, - 0xda, 0x1e, 0x8d, 0x81, 0x67, 0x87, 0xe2, 0x16, 0x79, 0x62, 0x49, 0x25, 0x13, 0xe0, 0x3d, 0x43, - 0x08, 0xf0, 0x24, 0x28, 0x4c, 0x52, 0x95, 0x6a, 0xdd, 0x97, 0x92, 0x7c, 0x66, 0x02, 0x72, 0xea, - 0x4e, 0xc7, 0xb9, 0x74, 0xe6, 0xd1, 0x30, 0x5b, 0x73, 0x6c, 0xac, 0xef, 0x84, 0xf6, 0xa2, 0x1c, - 0xeb, 0x02, 0x36, 0xbd, 0xbd, 0x28, 0xf2, 0x72, 0xfb, 0x6d, 0x30, 0x61, 0x5a, 0x0d, 0x7d, 0xd7, - 0xd9, 0x56, 0xae, 0xde, 0x17, 0xc4, 0x81, 0x75, 0x37, 0x55, 0x16, 0x35, 0xeb, 0xab, 0x77, 0x90, - 0xdd, 0x88, 0xbc, 0x69, 0x15, 0x77, 0x9d, 0xed, 0x85, 0xab, 0x3e, 0xfe, 0x37, 0xa7, 0x33, 0x9f, - 0xfe, 0x9b, 0xd3, 0x99, 0xaf, 0xfc, 0xcd, 0xe9, 0xcc, 0xaf, 0x7e, 0xed, 0xf4, 0x91, 0x4f, 0x7f, - 0xed, 0xf4, 0x91, 0x2f, 0x7e, 0xed, 0xf4, 0x91, 0x9f, 0x96, 0x3a, 0xe7, 0xcf, 0xe7, 0x09, 0x95, - 0x27, 0xfc, 0xbf, 0x01, 0x00, 0x00, 0xff, 0xff, 0xad, 0xda, 0x7f, 0xc2, 0x7a, 0x0a, 0x02, 0x00, + // 19740 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0xfd, 0x7b, 0x9c, 0x24, 0x47, + 0x75, 0x27, 0x8a, 0x4f, 0x65, 0x56, 0x55, 0x77, 0x9f, 0x7e, 0x4c, 0x4d, 0x6a, 0x66, 0x34, 0x0a, + 0x89, 0x91, 0x3c, 0x12, 0x42, 0x16, 0xa2, 0x25, 0x04, 0xc6, 0x48, 0x48, 0x48, 0xd5, 0xd5, 0xd5, + 0xdd, 0x25, 0x75, 0x57, 0x35, 0x59, 0xd5, 0x33, 0xc8, 0x5e, 0xff, 0x6a, 0x73, 0xaa, 0xa2, 0xbb, + 0x53, 0x53, 0x9d, 0x59, 0xce, 0xcc, 0xee, 0xd1, 0xf0, 0xfb, 0xec, 0x5d, 0x63, 0x2c, 0x1e, 0xc6, + 0x2c, 0xc6, 0x18, 0xdb, 0xbc, 0x9f, 0x82, 0x05, 0x1b, 0x30, 0xef, 0x05, 0xdb, 0xbc, 0x31, 0x18, + 0x63, 0x8c, 0xc1, 0x3c, 0x8c, 0xcd, 0x35, 0x18, 0x8c, 0xf1, 0x7e, 0xcc, 0x72, 0xed, 0xbb, 0x06, + 0x63, 0xc3, 0xf5, 0xfd, 0x64, 0x44, 0xe4, 0x23, 0xaa, 0x2b, 0xb3, 0x22, 0xab, 0x2b, 0xab, 0x85, + 0xb9, 0xff, 0x65, 0x46, 0x46, 0x9e, 0x38, 0x71, 0xbe, 0x27, 0x22, 0x4e, 0x44, 0x9c, 0x38, 0x01, + 0xa7, 0xba, 0xe7, 0x6f, 0xee, 0x5a, 0xa6, 0x63, 0xda, 0x37, 0xb7, 0xcc, 0x9d, 0x1d, 0xcd, 0x68, + 0xdb, 0xf3, 0xe4, 0x5d, 0x99, 0xd0, 0x8c, 0x4b, 0xce, 0xa5, 0x2e, 0x46, 0xd7, 0x75, 0x2f, 0x6c, + 0xdd, 0xdc, 0xd1, 0xcf, 0xdf, 0xdc, 0x3d, 0x7f, 0xf3, 0x8e, 0xd9, 0xc6, 0x1d, 0xef, 0x07, 0xf2, + 0xc2, 0xb2, 0xa3, 0x1b, 0xa2, 0x72, 0x75, 0xcc, 0x96, 0xd6, 0xb1, 0x1d, 0xd3, 0xc2, 0x2c, 0xe7, + 0xc9, 0xa0, 0x48, 0xbc, 0x87, 0x0d, 0xc7, 0xa3, 0x70, 0xd5, 0x96, 0x69, 0x6e, 0x75, 0x30, 0xfd, + 0x76, 0x7e, 0x77, 0xf3, 0x66, 0xdb, 0xb1, 0x76, 0x5b, 0x0e, 0xfb, 0x7a, 0x4d, 0xef, 0xd7, 0x36, + 0xb6, 0x5b, 0x96, 0xde, 0x75, 0x4c, 0x8b, 0xe6, 0x38, 0xf3, 0x97, 0xbf, 0x36, 0x09, 0xb2, 0xda, + 0x6d, 0xa1, 0xef, 0x4e, 0x80, 0x5c, 0xec, 0x76, 0xd1, 0xc7, 0x24, 0x80, 0x65, 0xec, 0x9c, 0xc5, + 0x96, 0xad, 0x9b, 0x06, 0x3a, 0x0a, 0x13, 0x2a, 0xfe, 0xf9, 0x5d, 0x6c, 0x3b, 0xb7, 0x67, 0x9f, + 0xfd, 0x4d, 0x39, 0x83, 0x1e, 0x92, 0x60, 0x52, 0xc5, 0x76, 0xd7, 0x34, 0x6c, 0xac, 0xdc, 0x0d, + 0x39, 0x6c, 0x59, 0xa6, 0x75, 0x2a, 0x73, 0x4d, 0xe6, 0x86, 0xe9, 0x5b, 0x6f, 0x9c, 0x67, 0xd5, + 0x9f, 0x57, 0xbb, 0xad, 0xf9, 0x62, 0xb7, 0x3b, 0x1f, 0x50, 0x9a, 0xf7, 0x7e, 0x9a, 0x2f, 0xbb, + 0x7f, 0xa8, 0xf4, 0x47, 0xe5, 0x14, 0x4c, 0xec, 0xd1, 0x0c, 0xa7, 0xa4, 0x6b, 0x32, 0x37, 0x4c, + 0xa9, 0xde, 0xab, 0xfb, 0xa5, 0x8d, 0x1d, 0x4d, 0xef, 0xd8, 0xa7, 0x64, 0xfa, 0x85, 0xbd, 0xa2, + 0xd7, 0x64, 0x20, 0x47, 0x88, 0x28, 0x25, 0xc8, 0xb6, 0xcc, 0x36, 0x26, 0xc5, 0xcf, 0xdd, 0x7a, + 0xb3, 0x78, 0xf1, 0xf3, 0x25, 0xb3, 0x8d, 0x55, 0xf2, 0xb3, 0x72, 0x0d, 0x4c, 0x7b, 0x62, 0x09, + 0xd8, 0x08, 0x27, 0x9d, 0xb9, 0x15, 0xb2, 0x6e, 0x7e, 0x65, 0x12, 0xb2, 0xd5, 0x8d, 0xd5, 0xd5, + 0xc2, 0x11, 0xe5, 0x18, 0xcc, 0x6e, 0x54, 0xef, 0xad, 0xd6, 0xce, 0x55, 0x9b, 0x65, 0x55, 0xad, + 0xa9, 0x85, 0x8c, 0x32, 0x0b, 0x53, 0x0b, 0xc5, 0xc5, 0x66, 0xa5, 0xba, 0xbe, 0xd1, 0x28, 0x48, + 0xe8, 0x15, 0x32, 0xcc, 0xd5, 0xb1, 0xb3, 0x88, 0xf7, 0xf4, 0x16, 0xae, 0x3b, 0x9a, 0x83, 0xd1, + 0xf3, 0x33, 0xbe, 0x30, 0x95, 0x0d, 0xb7, 0x50, 0xff, 0x13, 0xab, 0xc0, 0xe3, 0xf6, 0x55, 0x80, + 0xa7, 0x30, 0xcf, 0xfe, 0x9e, 0x0f, 0xa5, 0xa9, 0x61, 0x3a, 0x67, 0x1e, 0x03, 0xd3, 0xa1, 0x6f, + 0xca, 0x1c, 0xc0, 0x42, 0xb1, 0x74, 0xef, 0xb2, 0x5a, 0xdb, 0xa8, 0x2e, 0x16, 0x8e, 0xb8, 0xef, + 0x4b, 0x35, 0xb5, 0xcc, 0xde, 0x33, 0xe8, 0xfb, 0x99, 0x10, 0x98, 0x8b, 0x3c, 0x98, 0xf3, 0x83, + 0x99, 0xe9, 0x03, 0x28, 0x7a, 0xbd, 0x0f, 0xce, 0x32, 0x07, 0xce, 0xe3, 0x92, 0x91, 0x4b, 0x1f, + 0xa0, 0x07, 0x25, 0x98, 0xac, 0x6f, 0xef, 0x3a, 0x6d, 0xf3, 0xa2, 0x81, 0xa6, 0x7c, 0x64, 0xd0, + 0xb7, 0xc3, 0x32, 0x79, 0x32, 0x2f, 0x93, 0x1b, 0xf6, 0x57, 0x82, 0x51, 0x88, 0x90, 0xc6, 0xab, + 0x7c, 0x69, 0x14, 0x39, 0x69, 0x3c, 0x46, 0x94, 0x50, 0xfa, 0x72, 0x78, 0xc9, 0x13, 0x21, 0x57, + 0xef, 0x6a, 0x2d, 0x8c, 0x3e, 0x25, 0xc3, 0xcc, 0x2a, 0xd6, 0xf6, 0x70, 0xb1, 0xdb, 0xb5, 0xcc, + 0x3d, 0x8c, 0x4a, 0x81, 0xbe, 0x9e, 0x82, 0x09, 0xdb, 0xcd, 0x54, 0x69, 0x93, 0x1a, 0x4c, 0xa9, + 0xde, 0xab, 0x72, 0x1a, 0x40, 0x6f, 0x63, 0xc3, 0xd1, 0x1d, 0x1d, 0xdb, 0xa7, 0xa4, 0x6b, 0xe4, + 0x1b, 0xa6, 0xd4, 0x50, 0x0a, 0xfa, 0xae, 0x24, 0xaa, 0x63, 0x84, 0x8b, 0xf9, 0x30, 0x07, 0x11, + 0x52, 0x7d, 0xad, 0x24, 0xa2, 0x63, 0x03, 0xc9, 0x25, 0x93, 0xed, 0x5b, 0x32, 0xc9, 0x85, 0xeb, + 0xe6, 0xa8, 0xd6, 0x9a, 0xf5, 0x8d, 0xd2, 0x4a, 0xb3, 0xbe, 0x5e, 0x2c, 0x95, 0x0b, 0x58, 0x39, + 0x0e, 0x05, 0xf2, 0xd8, 0xac, 0xd4, 0x9b, 0x8b, 0xe5, 0xd5, 0x72, 0xa3, 0xbc, 0x58, 0xd8, 0x54, + 0x14, 0x98, 0x53, 0xcb, 0x4f, 0xd9, 0x28, 0xd7, 0x1b, 0xcd, 0xa5, 0x62, 0x65, 0xb5, 0xbc, 0x58, + 0xd8, 0x72, 0x7f, 0x5e, 0xad, 0xac, 0x55, 0x1a, 0x4d, 0xb5, 0x5c, 0x2c, 0xad, 0x94, 0x17, 0x0b, + 0xdb, 0xca, 0xe5, 0x70, 0x59, 0xb5, 0xd6, 0x2c, 0xae, 0xaf, 0xab, 0xb5, 0xb3, 0xe5, 0x26, 0xfb, + 0xa3, 0x5e, 0xd0, 0x69, 0x41, 0x8d, 0x66, 0x7d, 0xa5, 0xa8, 0x96, 0x8b, 0x0b, 0xab, 0xe5, 0xc2, + 0xfd, 0xe8, 0x19, 0x32, 0xcc, 0xae, 0x69, 0x17, 0x70, 0x7d, 0x5b, 0xb3, 0xb0, 0x76, 0xbe, 0x83, + 0xd1, 0xb5, 0x02, 0x78, 0xa2, 0x4f, 0x85, 0xf1, 0x2a, 0xf3, 0x78, 0xdd, 0xdc, 0x47, 0xc0, 0x5c, + 0x11, 0x11, 0x80, 0xfd, 0x8b, 0xdf, 0x0c, 0x56, 0x38, 0xc0, 0x1e, 0x9f, 0x90, 0x5e, 0x32, 0xc4, + 0x7e, 0xf1, 0x61, 0x80, 0x18, 0xfa, 0x8a, 0x0c, 0x73, 0x15, 0x63, 0x4f, 0x77, 0xf0, 0x32, 0x36, + 0xb0, 0xe5, 0x8e, 0x03, 0x42, 0x30, 0x3c, 0x24, 0x87, 0x60, 0x58, 0xe2, 0x61, 0xb8, 0xa5, 0x8f, + 0xd8, 0xf8, 0x32, 0x22, 0x46, 0xdb, 0xab, 0x60, 0x4a, 0x27, 0xf9, 0x4a, 0x7a, 0x9b, 0x49, 0x2c, + 0x48, 0x50, 0xae, 0x83, 0x59, 0xfa, 0xb2, 0xa4, 0x77, 0xf0, 0xbd, 0xf8, 0x12, 0x1b, 0x77, 0xf9, + 0x44, 0xf4, 0x2b, 0x7e, 0xe3, 0xab, 0x70, 0x58, 0xfe, 0x54, 0x52, 0xa6, 0x92, 0x81, 0xf9, 0xa2, + 0x87, 0x43, 0xf3, 0xdb, 0xd7, 0xca, 0x74, 0xf4, 0x43, 0x09, 0xa6, 0xeb, 0x8e, 0xd9, 0x75, 0x55, + 0x56, 0x37, 0xb6, 0xc4, 0xc0, 0xfd, 0x44, 0xb8, 0x8d, 0x95, 0x78, 0x70, 0x1f, 0xd3, 0x47, 0x8e, + 0xa1, 0x02, 0x22, 0x5a, 0xd8, 0x77, 0xfd, 0x16, 0xb6, 0xc4, 0xa1, 0x72, 0x6b, 0x22, 0x6a, 0x3f, + 0x82, 0xed, 0xeb, 0x45, 0x32, 0x14, 0x3c, 0x35, 0x73, 0x4a, 0xbb, 0x96, 0x85, 0x0d, 0x47, 0x0c, + 0x84, 0xbf, 0x0c, 0x83, 0xb0, 0xc2, 0x83, 0x70, 0x6b, 0x8c, 0x32, 0x7b, 0xa5, 0xa4, 0xd8, 0xc6, + 0x3e, 0xe8, 0xa3, 0x79, 0x2f, 0x87, 0xe6, 0x4f, 0x27, 0x67, 0x2b, 0x19, 0xa4, 0x2b, 0x43, 0x20, + 0x7a, 0x1c, 0x0a, 0xee, 0x98, 0x54, 0x6a, 0x54, 0xce, 0x96, 0x9b, 0x95, 0xea, 0xd9, 0x4a, 0xa3, + 0x5c, 0xc0, 0xe8, 0x85, 0x32, 0xcc, 0x50, 0xd6, 0x54, 0xbc, 0x67, 0x5e, 0x10, 0xec, 0xf5, 0xbe, + 0x92, 0xd0, 0x58, 0x08, 0x97, 0x10, 0xd1, 0x32, 0x7e, 0x39, 0x81, 0xb1, 0x10, 0x43, 0xee, 0xe1, + 0xd4, 0x5b, 0xed, 0x6b, 0x06, 0x5b, 0x7d, 0x5a, 0x4b, 0xdf, 0xde, 0xea, 0x45, 0x59, 0x00, 0x5a, + 0xc9, 0xb3, 0x3a, 0xbe, 0x88, 0xd6, 0x02, 0x4c, 0x38, 0xb5, 0xcd, 0x0c, 0x54, 0x5b, 0xa9, 0x9f, + 0xda, 0xbe, 0x27, 0x3c, 0x66, 0x2d, 0xf0, 0xe8, 0xdd, 0x14, 0x29, 0x6e, 0x97, 0x93, 0xe8, 0xd9, + 0xa1, 0xa7, 0x28, 0x12, 0x6f, 0x75, 0x5e, 0x05, 0x53, 0xe4, 0xb1, 0xaa, 0xed, 0x60, 0xd6, 0x86, + 0x82, 0x04, 0xe5, 0x0c, 0xcc, 0xd0, 0x8c, 0x2d, 0xd3, 0x70, 0xeb, 0x93, 0x25, 0x19, 0xb8, 0x34, + 0x17, 0xc4, 0x96, 0x85, 0x35, 0xc7, 0xb4, 0x08, 0x8d, 0x1c, 0x05, 0x31, 0x94, 0x84, 0xbe, 0xe5, + 0xb7, 0xc2, 0x32, 0xa7, 0x39, 0x8f, 0x4d, 0x52, 0x95, 0x64, 0x7a, 0xb3, 0x37, 0x5c, 0xfb, 0xa3, + 0xad, 0xae, 0xe9, 0xa2, 0xbd, 0x44, 0xa6, 0x76, 0x58, 0x39, 0x09, 0x0a, 0x4b, 0x75, 0xf3, 0x96, + 0x6a, 0xd5, 0x46, 0xb9, 0xda, 0x28, 0x6c, 0xf6, 0xd5, 0xa8, 0x2d, 0xf4, 0xda, 0x2c, 0x64, 0xef, + 0x31, 0x75, 0x03, 0x3d, 0x98, 0xe1, 0x54, 0xc2, 0xc0, 0xce, 0x45, 0xd3, 0xba, 0xe0, 0x37, 0xd4, + 0x20, 0x21, 0x1e, 0x9b, 0x40, 0x95, 0xe4, 0x81, 0xaa, 0x94, 0xed, 0xa7, 0x4a, 0xbf, 0x16, 0x56, + 0xa5, 0x3b, 0x78, 0x55, 0xba, 0xbe, 0x8f, 0xfc, 0x5d, 0xe6, 0x23, 0x3a, 0x80, 0x8f, 0xfb, 0x1d, + 0xc0, 0x5d, 0x1c, 0x8c, 0x8f, 0x16, 0x23, 0x93, 0x0c, 0xc0, 0x2f, 0xa7, 0xda, 0xf0, 0xfb, 0x41, + 0xbd, 0x15, 0x01, 0xf5, 0x76, 0x9f, 0x3e, 0x41, 0xdf, 0xdf, 0x75, 0xdc, 0xbf, 0xbf, 0x9b, 0xb8, + 0xa0, 0x9c, 0x80, 0x63, 0x8b, 0x95, 0xa5, 0xa5, 0xb2, 0x5a, 0xae, 0x36, 0x9a, 0xd5, 0x72, 0xe3, + 0x5c, 0x4d, 0xbd, 0xb7, 0xd0, 0x41, 0xaf, 0x91, 0x01, 0x5c, 0x09, 0x95, 0x34, 0xa3, 0x85, 0x3b, + 0x62, 0x3d, 0xfa, 0xff, 0x92, 0x92, 0xf5, 0x09, 0x01, 0xfd, 0x08, 0x38, 0x5f, 0x2e, 0x89, 0xb7, + 0xca, 0x48, 0x62, 0xc9, 0x40, 0x7d, 0xd3, 0xc3, 0xc1, 0xf6, 0xbc, 0x0c, 0x8e, 0x7a, 0xf4, 0x58, + 0xf6, 0xfe, 0xd3, 0xbe, 0xb7, 0x66, 0x61, 0x8e, 0xc1, 0xe2, 0xcd, 0xe3, 0x9f, 0x9d, 0x11, 0x99, + 0xc8, 0x23, 0x98, 0x64, 0xd3, 0x76, 0xaf, 0x7b, 0xf7, 0xdf, 0x95, 0x65, 0x98, 0xee, 0x62, 0x6b, + 0x47, 0xb7, 0x6d, 0xdd, 0x34, 0xe8, 0x82, 0xdc, 0xdc, 0xad, 0x8f, 0xf4, 0x25, 0x4e, 0xd6, 0x2e, + 0xe7, 0xd7, 0x35, 0xcb, 0xd1, 0x5b, 0x7a, 0x57, 0x33, 0x9c, 0xf5, 0x20, 0xb3, 0x1a, 0xfe, 0x13, + 0xbd, 0x20, 0xe1, 0xb4, 0x86, 0xaf, 0x49, 0x84, 0x4a, 0xfc, 0x7e, 0x82, 0x29, 0x49, 0x2c, 0xc1, + 0x64, 0x6a, 0xf1, 0xb1, 0x54, 0xd5, 0xa2, 0x0f, 0xde, 0x5b, 0xca, 0x15, 0x70, 0xa2, 0x52, 0x2d, + 0xd5, 0x54, 0xb5, 0x5c, 0x6a, 0x34, 0xd7, 0xcb, 0xea, 0x5a, 0xa5, 0x5e, 0xaf, 0xd4, 0xaa, 0xf5, + 0x83, 0xb4, 0x76, 0xf4, 0x49, 0xd9, 0xd7, 0x98, 0x45, 0xdc, 0xea, 0xe8, 0x06, 0x46, 0x77, 0x1d, + 0x50, 0x61, 0xf8, 0x55, 0x1f, 0x71, 0x9c, 0x59, 0xf9, 0x11, 0x38, 0xbf, 0x3a, 0x39, 0xce, 0xfd, + 0x09, 0xfe, 0x07, 0x6e, 0xfe, 0x5f, 0x91, 0xe1, 0x58, 0xa8, 0x21, 0xaa, 0x78, 0x67, 0x64, 0x2b, + 0x79, 0xbf, 0x18, 0x6e, 0xbb, 0x15, 0x1e, 0xd3, 0x7e, 0xd6, 0xf4, 0x3e, 0x36, 0x22, 0x60, 0x7d, + 0x93, 0x0f, 0xeb, 0x2a, 0x07, 0xeb, 0x13, 0x87, 0xa0, 0x99, 0x0c, 0xd9, 0xdf, 0x4d, 0x15, 0xd9, + 0x2b, 0xe0, 0xc4, 0x7a, 0x51, 0x6d, 0x54, 0x4a, 0x95, 0xf5, 0xa2, 0x3b, 0x8e, 0x86, 0x86, 0xec, + 0x08, 0x73, 0x9d, 0x07, 0xbd, 0x2f, 0xbe, 0x1f, 0xc8, 0xc2, 0x55, 0xfd, 0x3b, 0xda, 0xd2, 0xb6, + 0x66, 0x6c, 0x61, 0xa4, 0x8b, 0x40, 0xbd, 0x08, 0x13, 0x2d, 0x92, 0x9d, 0xe2, 0x1c, 0xde, 0xba, + 0x89, 0xe9, 0xcb, 0x69, 0x09, 0xaa, 0xf7, 0x2b, 0x7a, 0x47, 0x58, 0x21, 0x1a, 0xbc, 0x42, 0x3c, + 0x39, 0x1e, 0xbc, 0x7d, 0x7c, 0x47, 0xe8, 0xc6, 0x67, 0x7c, 0xdd, 0x38, 0xc7, 0xe9, 0x46, 0xe9, + 0x60, 0xe4, 0x93, 0xa9, 0xc9, 0x1f, 0x3f, 0x1c, 0x3a, 0x80, 0x48, 0x6d, 0xd2, 0xa3, 0x47, 0x85, + 0xbe, 0xdd, 0xfd, 0x2b, 0x65, 0xc8, 0x2f, 0xe2, 0x0e, 0x16, 0x5d, 0x89, 0xfc, 0x8e, 0x24, 0xba, + 0x21, 0x42, 0x61, 0xa0, 0xb4, 0xa3, 0x57, 0x47, 0x1c, 0x7d, 0x07, 0xdb, 0x8e, 0xb6, 0xd3, 0x25, + 0xa2, 0x96, 0xd5, 0x20, 0x01, 0xfd, 0x92, 0x24, 0xb2, 0x5d, 0x12, 0x53, 0xcc, 0x7f, 0x8c, 0x35, + 0xc5, 0xcf, 0x49, 0x30, 0x59, 0xc7, 0x4e, 0xcd, 0x6a, 0x63, 0x0b, 0xd5, 0x03, 0x8c, 0xae, 0x81, + 0x69, 0x02, 0x8a, 0x3b, 0xcd, 0xf4, 0x71, 0x0a, 0x27, 0x29, 0xd7, 0xc3, 0x9c, 0xff, 0x4a, 0x7e, + 0x67, 0xdd, 0x78, 0x4f, 0x2a, 0xfa, 0xc7, 0x8c, 0xe8, 0x2e, 0x2e, 0x5b, 0x32, 0x64, 0xdc, 0x44, + 0xb4, 0x52, 0xb1, 0x1d, 0xd9, 0x58, 0x52, 0xe9, 0x6f, 0x74, 0xbd, 0x4d, 0x02, 0xd8, 0x30, 0x6c, + 0x4f, 0xae, 0x8f, 0x4e, 0x20, 0x57, 0xf4, 0xcf, 0x99, 0x64, 0xb3, 0x98, 0xa0, 0x9c, 0x08, 0x89, + 0xbd, 0x2e, 0xc1, 0xda, 0x42, 0x24, 0xb1, 0xf4, 0x65, 0xf6, 0xf5, 0x39, 0xc8, 0x9f, 0xd3, 0x3a, + 0x1d, 0xec, 0xa0, 0x6f, 0x48, 0x90, 0x2f, 0x59, 0x58, 0x73, 0x70, 0x58, 0x74, 0x08, 0x26, 0x2d, + 0xd3, 0x74, 0xd6, 0x35, 0x67, 0x9b, 0xc9, 0xcd, 0x7f, 0x67, 0x0e, 0x03, 0xbf, 0x13, 0xee, 0x3e, + 0xee, 0xe2, 0x45, 0xf7, 0x93, 0x5c, 0x6d, 0x69, 0x41, 0xf3, 0xb4, 0x90, 0x88, 0xfe, 0x03, 0xc1, + 0xe4, 0x8e, 0x81, 0x77, 0x4c, 0x43, 0x6f, 0x79, 0x36, 0xa7, 0xf7, 0x8e, 0x3e, 0xec, 0xcb, 0x74, + 0x81, 0x93, 0xe9, 0xbc, 0x70, 0x29, 0xc9, 0x04, 0x5a, 0x1f, 0xa2, 0xf7, 0xb8, 0x1a, 0xae, 0xa4, + 0x9d, 0x41, 0xb3, 0x51, 0x6b, 0x96, 0xd4, 0x72, 0xb1, 0x51, 0x6e, 0xae, 0xd6, 0x4a, 0xc5, 0xd5, + 0xa6, 0x5a, 0x5e, 0xaf, 0x15, 0x30, 0xfa, 0x3b, 0xc9, 0x15, 0x6e, 0xcb, 0xdc, 0xc3, 0x16, 0x5a, + 0x16, 0x92, 0x73, 0x9c, 0x4c, 0x18, 0x06, 0xbf, 0x26, 0xec, 0xb4, 0xc1, 0xa4, 0xc3, 0x38, 0x88, + 0x50, 0xde, 0x8f, 0x08, 0x35, 0xf7, 0x58, 0x52, 0x0f, 0x03, 0x49, 0xff, 0x6f, 0x09, 0x26, 0x4a, + 0xa6, 0xb1, 0x87, 0x2d, 0x27, 0x3c, 0xdf, 0x09, 0x4b, 0x33, 0xc3, 0x4b, 0xd3, 0x1d, 0x24, 0xb1, + 0xe1, 0x58, 0x66, 0xd7, 0x9b, 0xf0, 0x78, 0xaf, 0xe8, 0x0d, 0x49, 0x25, 0xcc, 0x4a, 0x8e, 0x5e, + 0xf8, 0xec, 0x5f, 0x10, 0xc7, 0x9e, 0xdc, 0xd3, 0x00, 0x5e, 0x93, 0x04, 0x97, 0xfe, 0x0c, 0xa4, + 0xdf, 0xa5, 0x7c, 0x55, 0x86, 0x59, 0xda, 0xf8, 0xea, 0x98, 0x58, 0x68, 0xa8, 0x16, 0x5e, 0x72, + 0xec, 0x11, 0xfe, 0xca, 0x11, 0x4e, 0xfc, 0x79, 0xad, 0xdb, 0xf5, 0x97, 0x9f, 0x57, 0x8e, 0xa8, + 0xec, 0x9d, 0xaa, 0xf9, 0x42, 0x1e, 0xb2, 0xda, 0xae, 0xb3, 0x8d, 0x7e, 0x28, 0x3c, 0xf9, 0xe4, + 0x3a, 0x03, 0xc6, 0x4f, 0x04, 0x24, 0xc7, 0x21, 0xe7, 0x98, 0x17, 0xb0, 0x27, 0x07, 0xfa, 0xe2, + 0xc2, 0xa1, 0x75, 0xbb, 0x0d, 0xf2, 0x81, 0xc1, 0xe1, 0xbd, 0xbb, 0xb6, 0x8e, 0xd6, 0x6a, 0x99, + 0xbb, 0x86, 0x53, 0xf1, 0x96, 0xa0, 0x83, 0x04, 0xf4, 0xa5, 0x8c, 0xc8, 0x64, 0x56, 0x80, 0xc1, + 0x64, 0x90, 0x9d, 0x1f, 0xa2, 0x29, 0xcd, 0xc3, 0x8d, 0xc5, 0xf5, 0xf5, 0x66, 0xa3, 0x76, 0x6f, + 0xb9, 0x1a, 0x18, 0x9e, 0xcd, 0x4a, 0xb5, 0xd9, 0x58, 0x29, 0x37, 0x4b, 0x1b, 0x2a, 0x59, 0x27, + 0x2c, 0x96, 0x4a, 0xb5, 0x8d, 0x6a, 0xa3, 0x80, 0xd1, 0x9b, 0x25, 0x98, 0x29, 0x75, 0x4c, 0xdb, + 0x47, 0xf8, 0xea, 0x00, 0x61, 0x5f, 0x8c, 0x99, 0x90, 0x18, 0xd1, 0xbf, 0x65, 0x44, 0x9d, 0x0e, + 0x3c, 0x81, 0x84, 0xc8, 0x47, 0xf4, 0x52, 0x6f, 0x10, 0x72, 0x3a, 0x18, 0x4c, 0x2f, 0xfd, 0x26, + 0xf1, 0xeb, 0x4f, 0x82, 0x89, 0x22, 0x55, 0x0c, 0xf4, 0xd7, 0x19, 0xc8, 0x97, 0x4c, 0x63, 0x53, + 0xdf, 0x72, 0x8d, 0x39, 0x6c, 0x68, 0xe7, 0x3b, 0x78, 0x51, 0x73, 0xb4, 0x3d, 0x1d, 0x5f, 0x24, + 0x15, 0x98, 0x54, 0x7b, 0x52, 0x5d, 0xa6, 0x58, 0x0a, 0x3e, 0xbf, 0xbb, 0x45, 0x98, 0x9a, 0x54, + 0xc3, 0x49, 0xca, 0x13, 0xe1, 0x72, 0xfa, 0xba, 0x6e, 0x61, 0x0b, 0x77, 0xb0, 0x66, 0x63, 0x77, + 0x5a, 0x64, 0xe0, 0x0e, 0x51, 0xda, 0x49, 0x35, 0xea, 0xb3, 0x72, 0x06, 0x66, 0xe8, 0x27, 0x62, + 0x8a, 0xd8, 0x44, 0x8d, 0x27, 0x55, 0x2e, 0x4d, 0x79, 0x0c, 0xe4, 0xf0, 0x03, 0x8e, 0xa5, 0x9d, + 0x6a, 0x13, 0xbc, 0x2e, 0x9f, 0xa7, 0x5e, 0x87, 0xf3, 0x9e, 0xd7, 0xe1, 0x7c, 0x9d, 0xf8, 0x24, + 0xaa, 0x34, 0x17, 0x7a, 0xd9, 0xa4, 0x6f, 0x48, 0xfc, 0xbb, 0x14, 0x28, 0x86, 0x02, 0x59, 0x43, + 0xdb, 0xc1, 0x4c, 0x2f, 0xc8, 0xb3, 0x72, 0x23, 0x1c, 0xd5, 0xf6, 0x34, 0x47, 0xb3, 0x56, 0xcd, + 0x96, 0xd6, 0x21, 0x83, 0x9f, 0xd7, 0xf2, 0x7b, 0x3f, 0x90, 0x1d, 0x21, 0xc7, 0xb4, 0x30, 0xc9, + 0xe5, 0xed, 0x08, 0x79, 0x09, 0x2e, 0x75, 0xbd, 0x65, 0x1a, 0x84, 0x7f, 0x59, 0x25, 0xcf, 0xae, + 0x54, 0xda, 0xba, 0xed, 0x56, 0x84, 0x50, 0xa9, 0xd2, 0xad, 0x8d, 0xfa, 0x25, 0xa3, 0x45, 0x76, + 0x83, 0x26, 0xd5, 0xa8, 0xcf, 0xca, 0x02, 0x4c, 0xb3, 0x8d, 0x90, 0x35, 0x57, 0xaf, 0xf2, 0x44, + 0xaf, 0xae, 0xe1, 0x7d, 0xba, 0x28, 0x9e, 0xf3, 0xd5, 0x20, 0x9f, 0x1a, 0xfe, 0x49, 0xb9, 0x1b, + 0xae, 0x64, 0xaf, 0xa5, 0x5d, 0xdb, 0x31, 0x77, 0x28, 0xe8, 0x4b, 0x7a, 0x87, 0xd6, 0x60, 0x82, + 0xd4, 0x20, 0x2e, 0x8b, 0x72, 0x2b, 0x1c, 0xef, 0x5a, 0x78, 0x13, 0x5b, 0xf7, 0x69, 0x3b, 0xbb, + 0x0f, 0x34, 0x2c, 0xcd, 0xb0, 0xbb, 0xa6, 0xe5, 0x9c, 0x9a, 0x24, 0xcc, 0xf7, 0xfd, 0xc6, 0x3a, + 0xca, 0x49, 0xc8, 0x53, 0xf1, 0xa1, 0xe7, 0xe7, 0x84, 0xdd, 0x39, 0x59, 0x85, 0x62, 0xcd, 0xb3, + 0x5b, 0x60, 0x82, 0xf5, 0x70, 0x04, 0xa8, 0xe9, 0x5b, 0x4f, 0xf6, 0xac, 0x2b, 0x30, 0x2a, 0xaa, + 0x97, 0x4d, 0x79, 0x1c, 0xe4, 0x5b, 0xa4, 0x5a, 0x04, 0xb3, 0xe9, 0x5b, 0xaf, 0xec, 0x5f, 0x28, + 0xc9, 0xa2, 0xb2, 0xac, 0xe8, 0x2f, 0x64, 0x21, 0x0f, 0xd0, 0x38, 0x8e, 0x93, 0xb5, 0xea, 0x6f, + 0x49, 0x43, 0x74, 0x9b, 0x37, 0xc1, 0x0d, 0xac, 0x4f, 0x64, 0xf6, 0xc7, 0x62, 0x73, 0x61, 0xc3, + 0x9b, 0x0c, 0xba, 0x56, 0x49, 0xbd, 0x51, 0x54, 0xdd, 0x99, 0xfc, 0xa2, 0x3b, 0x89, 0xbc, 0x11, + 0xae, 0x1f, 0x90, 0xbb, 0xdc, 0x68, 0x56, 0x8b, 0x6b, 0xe5, 0xc2, 0x26, 0x6f, 0xdb, 0xd4, 0x1b, + 0xb5, 0xf5, 0xa6, 0xba, 0x51, 0xad, 0x56, 0xaa, 0xcb, 0x94, 0x98, 0x6b, 0x12, 0x9e, 0x0c, 0x32, + 0x9c, 0x53, 0x2b, 0x8d, 0x72, 0xb3, 0x54, 0xab, 0x2e, 0x55, 0x96, 0x0b, 0xfa, 0x20, 0xc3, 0xe8, + 0x7e, 0xe5, 0x1a, 0xb8, 0x8a, 0xe3, 0xa4, 0x52, 0xab, 0xba, 0x33, 0xdb, 0x52, 0xb1, 0x5a, 0x2a, + 0xbb, 0xd3, 0xd8, 0x0b, 0x0a, 0x82, 0x13, 0x94, 0x5c, 0x73, 0xa9, 0xb2, 0x1a, 0xde, 0x8c, 0xfa, + 0x44, 0x46, 0x39, 0x05, 0x97, 0x85, 0xbf, 0x55, 0xaa, 0x67, 0x8b, 0xab, 0x95, 0xc5, 0xc2, 0x1f, + 0x65, 0x94, 0xeb, 0xe0, 0x6a, 0xee, 0x2f, 0xba, 0xaf, 0xd4, 0xac, 0x2c, 0x36, 0xd7, 0x2a, 0xf5, + 0xb5, 0x62, 0xa3, 0xb4, 0x52, 0xf8, 0x24, 0x99, 0x2f, 0xf8, 0x06, 0x70, 0xc8, 0x2d, 0xf3, 0x45, + 0xe1, 0x31, 0xbd, 0xc8, 0x2b, 0xea, 0xa3, 0xfb, 0xc2, 0x1e, 0x6f, 0xc3, 0x7e, 0xcc, 0x1f, 0x1d, + 0x16, 0x39, 0x15, 0xba, 0x25, 0x01, 0xad, 0x64, 0x3a, 0xd4, 0x18, 0x42, 0x85, 0xae, 0x81, 0xab, + 0xaa, 0x65, 0x8a, 0x94, 0x5a, 0x2e, 0xd5, 0xce, 0x96, 0xd5, 0xe6, 0xb9, 0xe2, 0xea, 0x6a, 0xb9, + 0xd1, 0x5c, 0xaa, 0xa8, 0xf5, 0x46, 0x61, 0x13, 0xfd, 0xb3, 0xe4, 0xaf, 0xe6, 0x84, 0xa4, 0xf5, + 0xd7, 0x52, 0xd2, 0x66, 0x1d, 0xbb, 0x6a, 0xf3, 0x53, 0x90, 0xb7, 0x1d, 0xcd, 0xd9, 0xb5, 0x59, + 0xab, 0x7e, 0x44, 0xff, 0x56, 0x3d, 0x5f, 0x27, 0x99, 0x54, 0x96, 0x19, 0xfd, 0x45, 0x26, 0x49, + 0x33, 0x1d, 0xc1, 0x82, 0x8e, 0x3e, 0x84, 0x88, 0x4f, 0x03, 0xf2, 0xb4, 0xbd, 0x52, 0x6f, 0x16, + 0x57, 0xd5, 0x72, 0x71, 0xf1, 0x3e, 0x7f, 0x19, 0x07, 0x2b, 0x27, 0xe0, 0xd8, 0x46, 0xb5, 0xb8, + 0xb0, 0x5a, 0x26, 0xcd, 0xa5, 0x56, 0xad, 0x96, 0x4b, 0xae, 0xdc, 0x7f, 0x89, 0x6c, 0x9a, 0xb8, + 0x16, 0x34, 0xe1, 0xdb, 0xb5, 0x72, 0x42, 0xf2, 0xff, 0xa6, 0xb0, 0x6f, 0x51, 0xa0, 0x61, 0x61, + 0x5a, 0xa3, 0xc5, 0xe1, 0x4b, 0x42, 0xee, 0x44, 0x42, 0x9c, 0x24, 0xc3, 0xe3, 0x3f, 0x0f, 0x81, + 0xc7, 0x09, 0x38, 0x16, 0xc6, 0x83, 0xb8, 0x15, 0x45, 0xc3, 0xf0, 0xb5, 0x49, 0xc8, 0xd7, 0x71, + 0x07, 0xb7, 0x1c, 0xf4, 0xd6, 0x90, 0x31, 0x31, 0x07, 0x92, 0xef, 0xc6, 0x22, 0xe9, 0x6d, 0x6e, + 0xfa, 0x2c, 0xf5, 0x4c, 0x9f, 0x63, 0xcc, 0x00, 0x39, 0x91, 0x19, 0x90, 0x4d, 0xc1, 0x0c, 0xc8, + 0x0d, 0x6f, 0x06, 0xe4, 0x07, 0x99, 0x01, 0xe8, 0x75, 0xf9, 0xa4, 0xbd, 0x04, 0x15, 0xf5, 0xe1, + 0x0e, 0xfe, 0xff, 0x2b, 0x9b, 0xa4, 0x57, 0xe9, 0xcb, 0x71, 0x32, 0x2d, 0xfe, 0xa1, 0x9c, 0xc2, + 0xf2, 0x83, 0x72, 0x2d, 0x5c, 0x1d, 0xbc, 0x37, 0xcb, 0x4f, 0xad, 0xd4, 0x1b, 0x75, 0x32, 0xe2, + 0x97, 0x6a, 0xaa, 0xba, 0xb1, 0x4e, 0xd7, 0x90, 0x4f, 0x82, 0x12, 0x50, 0x51, 0x37, 0xaa, 0x74, + 0x7c, 0xdf, 0xe2, 0xa9, 0x2f, 0x55, 0xaa, 0x8b, 0x4d, 0xbf, 0xcd, 0x54, 0x97, 0x6a, 0x85, 0x6d, + 0x77, 0xca, 0x16, 0xa2, 0xee, 0x0e, 0xd0, 0xac, 0x84, 0x62, 0x75, 0xb1, 0xb9, 0x56, 0x2d, 0xaf, + 0xd5, 0xaa, 0x95, 0x12, 0x49, 0xaf, 0x97, 0x1b, 0x05, 0xdd, 0x1d, 0x68, 0x7a, 0x2c, 0x8a, 0x7a, + 0xb9, 0xa8, 0x96, 0x56, 0xca, 0x2a, 0x2d, 0xf2, 0x7e, 0xe5, 0x7a, 0x38, 0x53, 0xac, 0xd6, 0x1a, + 0x6e, 0x4a, 0xb1, 0x7a, 0x5f, 0xe3, 0xbe, 0xf5, 0x72, 0x73, 0x5d, 0xad, 0x95, 0xca, 0xf5, 0xba, + 0xdb, 0x4e, 0x99, 0xfd, 0x51, 0xe8, 0x28, 0x4f, 0x86, 0xdb, 0x43, 0xac, 0x95, 0x1b, 0x64, 0xc3, + 0x72, 0xad, 0x46, 0x7c, 0x56, 0x16, 0xcb, 0xcd, 0x95, 0x62, 0xbd, 0x59, 0xa9, 0x96, 0x6a, 0x6b, + 0xeb, 0xc5, 0x46, 0xc5, 0x6d, 0xce, 0xeb, 0x6a, 0xad, 0x51, 0x6b, 0x9e, 0x2d, 0xab, 0xf5, 0x4a, + 0xad, 0x5a, 0x30, 0xdc, 0x2a, 0x87, 0xda, 0xbf, 0xd7, 0x0f, 0x9b, 0xca, 0x55, 0x70, 0xca, 0x4b, + 0x5f, 0xad, 0xb9, 0x82, 0x0e, 0x59, 0x24, 0xdd, 0x54, 0x2d, 0x92, 0x7f, 0x95, 0x20, 0x5b, 0x77, + 0xcc, 0x2e, 0xfa, 0xc9, 0xa0, 0x83, 0x39, 0x0d, 0x60, 0x91, 0xfd, 0x47, 0x77, 0x16, 0xc6, 0xe6, + 0x65, 0xa1, 0x14, 0xf4, 0x87, 0xc2, 0x9b, 0x26, 0x41, 0x9f, 0x6d, 0x76, 0x23, 0x6c, 0x95, 0xef, + 0x8b, 0x9d, 0x22, 0x89, 0x26, 0x94, 0x4c, 0xdf, 0x7f, 0x79, 0x98, 0x6d, 0x11, 0x04, 0x27, 0x43, + 0xb0, 0xb9, 0xf2, 0xf7, 0x54, 0x02, 0x2b, 0x97, 0xc3, 0x65, 0x3d, 0xca, 0x45, 0x74, 0x6a, 0x53, + 0xf9, 0x09, 0x78, 0x44, 0x48, 0xbd, 0xcb, 0x6b, 0xb5, 0xb3, 0x65, 0x5f, 0x91, 0x17, 0x8b, 0x8d, + 0x62, 0x61, 0x0b, 0x7d, 0x4e, 0x86, 0xec, 0x9a, 0xb9, 0xd7, 0xbb, 0x57, 0x65, 0xe0, 0x8b, 0xa1, + 0xb5, 0x50, 0xef, 0x95, 0xf7, 0x9a, 0x17, 0x12, 0xfb, 0x5a, 0xf4, 0xbe, 0xf4, 0x97, 0xa4, 0x24, + 0x62, 0x5f, 0x3b, 0xe8, 0x66, 0xf4, 0xdf, 0x0f, 0x23, 0xf6, 0x08, 0xd1, 0x62, 0xe5, 0x0c, 0x9c, + 0x0e, 0x3e, 0x54, 0x16, 0xcb, 0xd5, 0x46, 0x65, 0xe9, 0xbe, 0x40, 0xb8, 0x15, 0x55, 0x48, 0xfc, + 0x83, 0xba, 0xb1, 0xf8, 0x99, 0xc6, 0x29, 0x38, 0x1e, 0x7c, 0x5b, 0x2e, 0x37, 0xbc, 0x2f, 0xf7, + 0xa3, 0x07, 0x73, 0x30, 0x43, 0xbb, 0xf5, 0x8d, 0x6e, 0x5b, 0x73, 0x30, 0x7a, 0x5c, 0x80, 0xee, + 0x0d, 0x70, 0xb4, 0xb2, 0xbe, 0x54, 0xaf, 0x3b, 0xa6, 0xa5, 0x6d, 0xe1, 0x62, 0xbb, 0x6d, 0x31, + 0x69, 0xf5, 0x26, 0xa3, 0x77, 0x09, 0xaf, 0xf3, 0xf1, 0x43, 0x09, 0x2d, 0x33, 0x02, 0xf5, 0xaf, + 0x0a, 0xad, 0xcb, 0x09, 0x10, 0x4c, 0x86, 0xfe, 0xfd, 0x23, 0x6e, 0x73, 0xd1, 0xb8, 0x6c, 0x9e, + 0x79, 0x96, 0x04, 0x53, 0x0d, 0x7d, 0x07, 0x3f, 0xcd, 0x34, 0xb0, 0xad, 0x4c, 0x80, 0xbc, 0xbc, + 0xd6, 0x28, 0x1c, 0x71, 0x1f, 0x5c, 0xa3, 0x2a, 0x43, 0x1e, 0xca, 0x6e, 0x01, 0xee, 0x43, 0xb1, + 0x51, 0x90, 0xdd, 0x87, 0xb5, 0x72, 0xa3, 0x90, 0x75, 0x1f, 0xaa, 0xe5, 0x46, 0x21, 0xe7, 0x3e, + 0xac, 0xaf, 0x36, 0x0a, 0x79, 0xf7, 0xa1, 0x52, 0x6f, 0x14, 0x26, 0xdc, 0x87, 0x85, 0x7a, 0xa3, + 0x30, 0xe9, 0x3e, 0x9c, 0xad, 0x37, 0x0a, 0x53, 0xee, 0x43, 0xa9, 0xd1, 0x28, 0x80, 0xfb, 0x70, + 0x4f, 0xbd, 0x51, 0x98, 0x76, 0x1f, 0x8a, 0xa5, 0x46, 0x61, 0x86, 0x3c, 0x94, 0x1b, 0x85, 0x59, + 0xf7, 0xa1, 0x5e, 0x6f, 0x14, 0xe6, 0x08, 0xe5, 0x7a, 0xa3, 0x70, 0x94, 0x94, 0x55, 0x69, 0x14, + 0x0a, 0xee, 0xc3, 0x4a, 0xbd, 0x51, 0x38, 0x46, 0x32, 0xd7, 0x1b, 0x05, 0x85, 0x14, 0x5a, 0x6f, + 0x14, 0x2e, 0x23, 0x79, 0xea, 0x8d, 0xc2, 0x71, 0x52, 0x44, 0xbd, 0x51, 0x38, 0x41, 0xd8, 0x28, + 0x37, 0x0a, 0x27, 0x49, 0x1e, 0xb5, 0x51, 0xb8, 0x9c, 0x7c, 0xaa, 0x36, 0x0a, 0xa7, 0x08, 0x63, + 0xe5, 0x46, 0xe1, 0x0a, 0xf2, 0xa0, 0x36, 0x0a, 0x88, 0x7c, 0x2a, 0x36, 0x0a, 0x57, 0xa2, 0x47, + 0xc0, 0xd4, 0x32, 0x76, 0x28, 0x88, 0xa8, 0x00, 0xf2, 0x32, 0x76, 0xc2, 0x66, 0xfc, 0xd7, 0x65, + 0xb8, 0x9c, 0x4d, 0xfd, 0x96, 0x2c, 0x73, 0x67, 0x15, 0x6f, 0x69, 0xad, 0x4b, 0xe5, 0x07, 0x5c, + 0x13, 0x2a, 0xbc, 0x2f, 0xab, 0x40, 0xb6, 0x1b, 0x74, 0x46, 0xe4, 0x39, 0xd6, 0xe2, 0xf4, 0x16, + 0xa3, 0xe4, 0x60, 0x31, 0x8a, 0x59, 0x64, 0xff, 0x14, 0xd6, 0x68, 0x6e, 0xfd, 0x38, 0xd3, 0xb3, + 0x7e, 0xec, 0x36, 0x93, 0x2e, 0xb6, 0x6c, 0xd3, 0xd0, 0x3a, 0x75, 0xb6, 0x71, 0x4f, 0x57, 0xbd, + 0x7a, 0x93, 0x95, 0xa7, 0x78, 0x2d, 0x83, 0x5a, 0x65, 0x4f, 0x8a, 0x9b, 0xe1, 0xf6, 0x56, 0x33, + 0xa2, 0x91, 0x7c, 0xd2, 0x6f, 0x24, 0x0d, 0xae, 0x91, 0xdc, 0x7d, 0x00, 0xda, 0xc9, 0xda, 0x4b, + 0x65, 0xb8, 0xa9, 0x45, 0xe0, 0xd6, 0xea, 0x2d, 0x57, 0xcb, 0xe8, 0x73, 0x12, 0x9c, 0x2c, 0x1b, + 0xfd, 0x2c, 0xfc, 0xb0, 0x2e, 0xbc, 0x39, 0x0c, 0xcd, 0x3a, 0x2f, 0xd2, 0xdb, 0xfb, 0x56, 0xbb, + 0x3f, 0xcd, 0x08, 0x89, 0x7e, 0xda, 0x97, 0x68, 0x9d, 0x93, 0xe8, 0x5d, 0xc3, 0x93, 0x4e, 0x26, + 0xd0, 0xea, 0x48, 0x3b, 0xa0, 0x2c, 0xfa, 0x56, 0x16, 0x1e, 0x41, 0x7d, 0x6f, 0x18, 0x87, 0xb4, + 0x95, 0x15, 0x8d, 0xb6, 0x8a, 0x6d, 0x47, 0xb3, 0x1c, 0xee, 0x3c, 0x74, 0xcf, 0x54, 0x2a, 0x93, + 0xc2, 0x54, 0x4a, 0x1a, 0x38, 0x95, 0x42, 0xef, 0x0c, 0x9b, 0x0f, 0xe7, 0x78, 0x8c, 0x8b, 0xfd, + 0xfb, 0xff, 0xb8, 0x1a, 0x46, 0x41, 0xed, 0xdb, 0x15, 0x3f, 0xc3, 0x41, 0xbd, 0x74, 0xe0, 0x12, + 0x92, 0x21, 0xfe, 0x87, 0xa3, 0xb5, 0xf3, 0xb2, 0xe1, 0x6f, 0xbc, 0x51, 0x52, 0x68, 0xa7, 0x6a, + 0xa0, 0xbf, 0x60, 0x12, 0xa6, 0x48, 0x5b, 0x58, 0xd5, 0x8d, 0x0b, 0x6e, 0xa7, 0x3d, 0x53, 0xc5, + 0x17, 0x4b, 0xdb, 0x5a, 0xa7, 0x83, 0x8d, 0x2d, 0x8c, 0xee, 0xe7, 0x2c, 0x47, 0xad, 0xdb, 0xad, + 0x06, 0xfb, 0x0c, 0xde, 0xab, 0x72, 0x17, 0xe4, 0xec, 0x96, 0xd9, 0xc5, 0x44, 0x50, 0x73, 0x21, + 0xcf, 0x04, 0x7e, 0x65, 0xa5, 0xb8, 0xeb, 0x6c, 0xcf, 0x93, 0xb2, 0x8a, 0x5d, 0xbd, 0xee, 0xfe, + 0xa0, 0xd2, 0xff, 0x58, 0x07, 0xfe, 0xcd, 0xbe, 0xbd, 0x44, 0x26, 0xa6, 0x97, 0xf0, 0x19, 0x9f, + 0x0f, 0x33, 0x1d, 0x31, 0xc5, 0xbe, 0x06, 0xa6, 0x5b, 0x5e, 0x16, 0xff, 0xe0, 0x45, 0x38, 0x09, + 0xfd, 0x6d, 0xa2, 0x7e, 0x44, 0xa8, 0xf0, 0x64, 0x5a, 0x85, 0x47, 0x6c, 0xc8, 0x9c, 0x80, 0x63, + 0x8d, 0x5a, 0xad, 0xb9, 0x56, 0xac, 0xde, 0x17, 0x1c, 0x78, 0xde, 0x44, 0x2f, 0xcf, 0xc2, 0x5c, + 0xdd, 0xec, 0xec, 0xe1, 0x00, 0xe7, 0x0a, 0xe7, 0xd1, 0x13, 0x96, 0x53, 0x66, 0x9f, 0x9c, 0x94, + 0x93, 0x90, 0xd7, 0x0c, 0xfb, 0x22, 0xf6, 0x8c, 0x4b, 0xf6, 0xc6, 0x60, 0xfc, 0x40, 0xb8, 0x23, + 0x50, 0x79, 0x18, 0xef, 0x18, 0x20, 0x49, 0x9e, 0xab, 0x08, 0x20, 0xcf, 0xc0, 0x8c, 0x4d, 0x77, + 0x1b, 0x1b, 0xa1, 0x4d, 0x65, 0x2e, 0x8d, 0xb0, 0x48, 0xb7, 0xbb, 0x65, 0xc6, 0x22, 0x79, 0x43, + 0xaf, 0xf1, 0xfb, 0x8f, 0x0d, 0x0e, 0xe2, 0xe2, 0x41, 0x18, 0x4b, 0x06, 0xf2, 0x2b, 0x47, 0x3d, + 0x45, 0x3c, 0x05, 0xc7, 0x59, 0xb3, 0x6f, 0x96, 0x56, 0x8a, 0xab, 0xab, 0xe5, 0xea, 0x72, 0xb9, + 0x59, 0x59, 0xa4, 0x7b, 0x1d, 0x41, 0x4a, 0xb1, 0xd1, 0x28, 0xaf, 0xad, 0x37, 0xea, 0xcd, 0xf2, + 0x53, 0x4b, 0xe5, 0xf2, 0x22, 0xf1, 0xa9, 0x23, 0x87, 0x62, 0x3c, 0xef, 0xc7, 0x62, 0xb5, 0x7e, + 0xae, 0xac, 0x16, 0xb6, 0xcf, 0x14, 0x61, 0x3a, 0x34, 0x50, 0xb8, 0xdc, 0x2d, 0xe2, 0x4d, 0x6d, + 0xb7, 0xc3, 0x8c, 0xbd, 0xc2, 0x11, 0x97, 0x3b, 0x22, 0x9b, 0x9a, 0xd1, 0xb9, 0x54, 0xc8, 0x28, + 0x05, 0x98, 0x09, 0x8f, 0x09, 0x05, 0x09, 0xbd, 0xed, 0x2a, 0x98, 0x3a, 0x67, 0x5a, 0x17, 0x88, + 0x23, 0x18, 0x7a, 0x2f, 0x0d, 0x8c, 0xe2, 0x1d, 0x31, 0x0d, 0x59, 0x06, 0xaf, 0x14, 0x77, 0x37, + 0xf0, 0xa8, 0xcd, 0x0f, 0x3c, 0x46, 0x7a, 0x0d, 0x4c, 0x5f, 0xf4, 0x72, 0x07, 0x2d, 0x3d, 0x94, + 0x84, 0xfe, 0xbb, 0x98, 0x03, 0xc1, 0xe0, 0x22, 0xd3, 0xdf, 0xe0, 0x7e, 0xab, 0x04, 0xf9, 0x65, + 0xec, 0x14, 0x3b, 0x9d, 0xb0, 0xdc, 0x5e, 0x2c, 0x7c, 0x34, 0x88, 0xab, 0x44, 0xb1, 0xd3, 0x89, + 0x6e, 0x54, 0x21, 0x01, 0x79, 0x2e, 0xec, 0x5c, 0x9a, 0xa0, 0xe3, 0xdd, 0x80, 0x02, 0xd3, 0x97, + 0xd8, 0x87, 0x65, 0x7f, 0x93, 0xfc, 0xa1, 0x90, 0x99, 0xf4, 0xd8, 0x20, 0x28, 0x4e, 0x26, 0x7e, + 0xb3, 0xdd, 0xcb, 0xa7, 0xdc, 0x0b, 0x13, 0xbb, 0x36, 0x2e, 0x69, 0xb6, 0x37, 0xb4, 0xf1, 0x35, + 0xad, 0x9d, 0xbf, 0x1f, 0xb7, 0x9c, 0xf9, 0xca, 0x8e, 0x6b, 0x91, 0x6f, 0xd0, 0x8c, 0x7e, 0x9c, + 0x19, 0xf6, 0xae, 0x7a, 0x14, 0xdc, 0x59, 0xcd, 0x45, 0xdd, 0xd9, 0x2e, 0x6d, 0x6b, 0x0e, 0x5b, + 0x1c, 0xf7, 0xdf, 0xd1, 0xf3, 0x87, 0x80, 0x33, 0x76, 0x33, 0x39, 0xf2, 0x84, 0x61, 0x62, 0x10, + 0x47, 0xb0, 0x03, 0x3c, 0x0c, 0x88, 0xff, 0x20, 0x41, 0xb6, 0xd6, 0xc5, 0x86, 0xf0, 0x71, 0x1a, + 0x5f, 0xb6, 0x52, 0x8f, 0x6c, 0x5f, 0x23, 0xee, 0x5e, 0xe6, 0x57, 0xda, 0x2d, 0x39, 0x42, 0xb2, + 0x37, 0x43, 0x56, 0x37, 0x36, 0x4d, 0x66, 0xd9, 0x5e, 0x19, 0x61, 0xeb, 0x54, 0x8c, 0x4d, 0x53, + 0x25, 0x19, 0x45, 0x3d, 0xcb, 0xe2, 0xca, 0x4e, 0x5f, 0xdc, 0xdf, 0x9e, 0x84, 0x3c, 0x55, 0x67, + 0xf4, 0x22, 0x19, 0xe4, 0x62, 0xbb, 0x1d, 0x21, 0x78, 0x69, 0x9f, 0xe0, 0x4d, 0xf2, 0x9b, 0x8f, + 0x89, 0xff, 0xce, 0x47, 0x43, 0x11, 0xec, 0xdb, 0x59, 0x93, 0x2a, 0xb6, 0xdb, 0xd1, 0x4e, 0xac, + 0x7e, 0x81, 0x12, 0x5f, 0x60, 0xb8, 0x85, 0xcb, 0x62, 0x2d, 0x3c, 0xf1, 0x40, 0x10, 0xc9, 0x5f, + 0xfa, 0x10, 0xfd, 0x93, 0x04, 0x13, 0xab, 0xba, 0xed, 0xb8, 0xd8, 0x14, 0x45, 0xb0, 0xb9, 0x0a, + 0xa6, 0x3c, 0xd1, 0xb8, 0x5d, 0x9e, 0xdb, 0x9f, 0x07, 0x09, 0xe8, 0xb5, 0x61, 0x74, 0xee, 0xe1, + 0xd1, 0x79, 0x7c, 0x7c, 0xed, 0x19, 0x17, 0xd1, 0xc7, 0x14, 0x82, 0x62, 0xa5, 0xde, 0x62, 0x7f, + 0xc7, 0x17, 0xf8, 0x1a, 0x27, 0xf0, 0xdb, 0x86, 0x29, 0x32, 0x7d, 0xa1, 0x7f, 0x5e, 0x02, 0x70, + 0xcb, 0x66, 0x67, 0xc1, 0x1e, 0xc5, 0x9d, 0xf0, 0x8e, 0x91, 0xee, 0xcb, 0xc3, 0xd2, 0x5d, 0xe3, + 0xa5, 0xfb, 0xd3, 0x83, 0xab, 0x1a, 0x77, 0xe6, 0x4b, 0x29, 0x80, 0xac, 0xfb, 0xa2, 0x75, 0x1f, + 0xd1, 0x5b, 0x7d, 0xa1, 0xae, 0x73, 0x42, 0xbd, 0x63, 0xc8, 0x92, 0xd2, 0x97, 0xeb, 0x5f, 0x4a, + 0x30, 0x51, 0xc7, 0x8e, 0xdb, 0x4d, 0xa2, 0xb3, 0x22, 0x3d, 0x7c, 0xa8, 0x6d, 0x4b, 0x82, 0x6d, + 0xfb, 0x7b, 0x19, 0xd1, 0x48, 0x31, 0x81, 0x64, 0x18, 0x4f, 0x11, 0xab, 0x0f, 0x0f, 0x09, 0x45, + 0x8a, 0x19, 0x44, 0x2d, 0x7d, 0xe9, 0xbe, 0x59, 0xf2, 0x77, 0xf6, 0xf9, 0xa3, 0x1a, 0x61, 0xb3, + 0x38, 0xb3, 0xdf, 0x2c, 0x16, 0x3f, 0xaa, 0x11, 0xae, 0x63, 0xf4, 0xb6, 0x76, 0x62, 0x63, 0x63, + 0x04, 0x3b, 0xce, 0xc3, 0xc8, 0xeb, 0x19, 0x32, 0xe4, 0xd9, 0xd2, 0xf4, 0x5d, 0xf1, 0x4b, 0xd3, + 0x83, 0xa7, 0x16, 0xef, 0x19, 0xc2, 0x94, 0x8b, 0x5b, 0x2f, 0xf6, 0xd9, 0x90, 0x42, 0x6c, 0xdc, + 0x04, 0x39, 0x12, 0xca, 0x92, 0x8d, 0x73, 0x81, 0xb3, 0x80, 0x47, 0xa2, 0xec, 0x7e, 0x55, 0x69, + 0xa6, 0xc4, 0x28, 0x8c, 0x60, 0x89, 0x79, 0x18, 0x14, 0x7e, 0x53, 0x01, 0x58, 0xdf, 0x3d, 0xdf, + 0xd1, 0xed, 0x6d, 0xdd, 0xd8, 0x42, 0x5f, 0xcb, 0xc0, 0x0c, 0x7b, 0xa5, 0x11, 0x19, 0x63, 0xcd, + 0xbf, 0x48, 0xa3, 0xa0, 0x00, 0xf2, 0xae, 0xa5, 0xb3, 0x65, 0x00, 0xf7, 0x51, 0xb9, 0xd3, 0xf7, + 0x04, 0xca, 0xf6, 0x9c, 0xc5, 0x77, 0xc5, 0x10, 0x70, 0x30, 0x1f, 0x2a, 0x3d, 0xf0, 0x08, 0x0a, + 0x87, 0xdd, 0xcc, 0xf1, 0x61, 0x37, 0xb9, 0x03, 0x7a, 0xf9, 0x9e, 0x03, 0x7a, 0x2e, 0x8e, 0xb6, + 0xfe, 0x34, 0x4c, 0xbc, 0x53, 0x65, 0x95, 0x3c, 0xa3, 0x0f, 0x06, 0x53, 0x15, 0x53, 0xd0, 0xce, + 0x4d, 0x50, 0xd1, 0xab, 0x60, 0xea, 0x7e, 0x53, 0x37, 0xc8, 0x5e, 0x06, 0xf3, 0x3e, 0x0e, 0x12, + 0xd0, 0x47, 0x85, 0x03, 0x69, 0x85, 0x44, 0x12, 0x3b, 0xe9, 0x60, 0x1c, 0x48, 0x3e, 0x07, 0xa1, + 0x0d, 0xc1, 0xb8, 0x0e, 0x73, 0x10, 0xfd, 0x64, 0xaa, 0xb7, 0x33, 0xc4, 0xf2, 0x8a, 0x02, 0x73, + 0xde, 0xc1, 0xc4, 0xda, 0xc2, 0x3d, 0xe5, 0x52, 0xa3, 0x80, 0xf7, 0x1f, 0x56, 0x24, 0xc7, 0x12, + 0xe9, 0x11, 0xc4, 0x60, 0x09, 0x05, 0xfd, 0x4f, 0x09, 0xf2, 0xcc, 0x3a, 0xb8, 0xeb, 0x80, 0x10, + 0xa2, 0x57, 0x0c, 0x03, 0x49, 0xec, 0xf9, 0xf0, 0x4f, 0x25, 0x05, 0x60, 0x04, 0xf6, 0xc0, 0x7d, + 0xa9, 0x01, 0x80, 0xfe, 0x45, 0x82, 0xac, 0x6b, 0xb5, 0x88, 0x9d, 0xbe, 0xfd, 0xa4, 0xb0, 0xdf, + 0x6b, 0x48, 0x00, 0x2e, 0xf9, 0x08, 0xfd, 0x5e, 0x80, 0xa9, 0x2e, 0xcd, 0xe8, 0x9f, 0xfd, 0xbe, + 0x4e, 0xa0, 0xef, 0xc0, 0x6a, 0xf0, 0x1b, 0x7a, 0xb7, 0x90, 0xef, 0x6c, 0x3c, 0x3f, 0xc9, 0xe0, + 0x28, 0x8f, 0xe2, 0xa0, 0xee, 0x26, 0xfa, 0x81, 0x04, 0xa0, 0x62, 0xdb, 0xec, 0xec, 0xe1, 0x0d, + 0x4b, 0x47, 0x57, 0x06, 0x00, 0xb0, 0x66, 0x9f, 0x09, 0x9a, 0xfd, 0x67, 0xc2, 0x82, 0x5f, 0xe6, + 0x05, 0xff, 0xd8, 0x68, 0xcd, 0xf3, 0x88, 0x47, 0x88, 0xff, 0xc9, 0x30, 0xc1, 0xe4, 0xc8, 0x4c, + 0x40, 0x31, 0xe1, 0x7b, 0x3f, 0xa1, 0xf7, 0xf9, 0xa2, 0xbf, 0x87, 0x13, 0xfd, 0x13, 0x12, 0x73, + 0x94, 0x0c, 0x80, 0xd2, 0x10, 0x00, 0x1c, 0x85, 0x69, 0x0f, 0x80, 0x0d, 0xb5, 0x52, 0xc0, 0xe8, + 0x1d, 0x32, 0xd9, 0x6e, 0xa7, 0x63, 0xd1, 0xc1, 0x7b, 0x9a, 0x6f, 0x08, 0xcf, 0xcd, 0x43, 0xf2, + 0xf0, 0xcb, 0x4f, 0x09, 0xa0, 0x3f, 0x15, 0x9a, 0x8c, 0x0b, 0x30, 0xf4, 0x70, 0xe9, 0xaf, 0xce, + 0x94, 0x61, 0x96, 0x33, 0x22, 0x94, 0x53, 0x70, 0x9c, 0x4b, 0xa0, 0xe3, 0x5d, 0xbb, 0x70, 0x44, + 0x41, 0x70, 0x92, 0xfb, 0xc2, 0x5e, 0x70, 0xbb, 0x90, 0x41, 0x7f, 0xfe, 0xb9, 0x8c, 0xbf, 0x3c, + 0xf3, 0x9e, 0x2c, 0x5b, 0x18, 0xfb, 0x38, 0x1f, 0x6e, 0xac, 0x65, 0x1a, 0x0e, 0x7e, 0x20, 0xe4, + 0xee, 0xe0, 0x27, 0xc4, 0x5a, 0x0d, 0xa7, 0x60, 0xc2, 0xb1, 0xc2, 0x2e, 0x10, 0xde, 0x6b, 0x58, + 0xb1, 0x72, 0xbc, 0x62, 0x55, 0xe1, 0x8c, 0x6e, 0xb4, 0x3a, 0xbb, 0x6d, 0xac, 0xe2, 0x8e, 0xe6, + 0xca, 0xd0, 0x2e, 0xda, 0x8b, 0xb8, 0x8b, 0x8d, 0x36, 0x36, 0x1c, 0xca, 0xa7, 0x77, 0xdc, 0x49, + 0x20, 0x27, 0xaf, 0x8c, 0x77, 0xf2, 0xca, 0xf8, 0xa8, 0x7e, 0x2b, 0xae, 0x31, 0xcb, 0x73, 0xb7, + 0x01, 0xd0, 0xba, 0x9d, 0xd5, 0xf1, 0x45, 0xa6, 0x86, 0x57, 0xf4, 0x2c, 0xd2, 0xd5, 0xfc, 0x0c, + 0x6a, 0x28, 0x33, 0xfa, 0x8a, 0xaf, 0x7e, 0x77, 0x73, 0xea, 0x77, 0x93, 0x20, 0x0b, 0xc9, 0xb4, + 0xae, 0x3b, 0x84, 0xd6, 0xcd, 0xc2, 0x54, 0xb0, 0xf9, 0x2b, 0x2b, 0x57, 0xc0, 0x09, 0xcf, 0x9d, + 0xb4, 0x5a, 0x2e, 0x2f, 0xd6, 0x9b, 0x1b, 0xeb, 0xcb, 0x6a, 0x71, 0xb1, 0x5c, 0x00, 0x57, 0x3f, + 0xa9, 0x5e, 0xfa, 0x5e, 0xa0, 0x59, 0xf4, 0x05, 0x09, 0x72, 0xe4, 0xac, 0x1e, 0xfa, 0xb9, 0x11, + 0x69, 0x8e, 0xcd, 0x39, 0xcf, 0xf8, 0xe3, 0xae, 0x78, 0x18, 0x70, 0x26, 0x4c, 0xc2, 0xd5, 0x81, + 0xc2, 0x80, 0xc7, 0x10, 0x4a, 0x7f, 0xe2, 0xe2, 0x36, 0xc9, 0xfa, 0xb6, 0x79, 0xf1, 0xc7, 0xb9, + 0x49, 0xba, 0xf5, 0x3f, 0xe4, 0x26, 0xd9, 0x87, 0x85, 0xb1, 0x37, 0xc9, 0x3e, 0xed, 0x2e, 0xa6, + 0x99, 0xa2, 0xa7, 0xe7, 0xfc, 0xf9, 0xdf, 0xb3, 0xa4, 0x03, 0x6d, 0x55, 0x15, 0x61, 0x56, 0x37, + 0x1c, 0x6c, 0x19, 0x5a, 0x67, 0xa9, 0xa3, 0x6d, 0x79, 0xf6, 0x69, 0xef, 0xfe, 0x44, 0x25, 0x94, + 0x47, 0xe5, 0xff, 0x50, 0x4e, 0x03, 0x38, 0x78, 0xa7, 0xdb, 0xd1, 0x9c, 0x40, 0xf5, 0x42, 0x29, + 0x61, 0xed, 0xcb, 0xf2, 0xda, 0x77, 0x0b, 0x5c, 0x46, 0x41, 0x6b, 0x5c, 0xea, 0xe2, 0x0d, 0x43, + 0xff, 0xf9, 0x5d, 0x12, 0x9d, 0x92, 0xea, 0x68, 0xbf, 0x4f, 0xdc, 0x86, 0x4d, 0xbe, 0x67, 0xc3, + 0xe6, 0x1f, 0x84, 0xa3, 0x5e, 0x78, 0xad, 0x7e, 0x40, 0xd4, 0x0b, 0xbf, 0xa5, 0xc9, 0x3d, 0x2d, + 0xcd, 0x5f, 0x46, 0xc9, 0x0a, 0x2c, 0xa3, 0x84, 0x51, 0xc9, 0x09, 0x2e, 0x41, 0xbe, 0x5a, 0x28, + 0xac, 0x46, 0x5c, 0x35, 0xc6, 0xb0, 0xc4, 0x2d, 0xc3, 0x1c, 0x2d, 0x7a, 0xc1, 0x34, 0x2f, 0xec, + 0x68, 0xd6, 0x05, 0x64, 0x1d, 0x48, 0x15, 0x63, 0x77, 0x8b, 0x22, 0xb7, 0x40, 0x3f, 0x2d, 0x3c, + 0x67, 0xe0, 0xc4, 0xe5, 0xf1, 0x3c, 0x9e, 0xed, 0xa2, 0x37, 0x0a, 0x4d, 0x21, 0x44, 0x18, 0x4c, + 0x1f, 0xd7, 0x3f, 0xf6, 0x71, 0xf5, 0x3a, 0xfa, 0xf0, 0x4a, 0xfb, 0x28, 0x71, 0x45, 0x5f, 0x1d, + 0x0e, 0x3b, 0x8f, 0xaf, 0x21, 0xb0, 0x2b, 0x80, 0x7c, 0xc1, 0x77, 0xee, 0x71, 0x1f, 0xc3, 0x15, + 0xca, 0xa6, 0x87, 0x66, 0x04, 0xcb, 0x63, 0x41, 0xf3, 0x38, 0xcf, 0x42, 0xad, 0x9b, 0x2a, 0xa6, + 0x5f, 0x16, 0xde, 0xc1, 0xea, 0x2b, 0x20, 0xca, 0xdd, 0x78, 0x5a, 0xa5, 0xd8, 0xf6, 0x97, 0x38, + 0x9b, 0xe9, 0xa3, 0xf9, 0xbc, 0x1c, 0x4c, 0x79, 0x71, 0x49, 0xc8, 0xb5, 0x39, 0x3e, 0x86, 0x27, + 0x21, 0x6f, 0x9b, 0xbb, 0x56, 0x0b, 0xb3, 0x3d, 0x45, 0xf6, 0x36, 0xc4, 0xfe, 0xd7, 0xc0, 0xf1, + 0x7c, 0x9f, 0xc9, 0x90, 0x4d, 0x6c, 0x32, 0x44, 0x1b, 0xa4, 0x71, 0x03, 0xfc, 0xf3, 0x85, 0x63, + 0x9d, 0x73, 0x98, 0xd5, 0xb1, 0xf3, 0x70, 0x1c, 0xe3, 0x3f, 0x24, 0xb4, 0xbb, 0x32, 0xa0, 0x26, + 0xc9, 0x54, 0xae, 0x36, 0x84, 0xa1, 0x7a, 0x25, 0x5c, 0xee, 0xe5, 0x60, 0x16, 0x2a, 0xb1, 0x48, + 0x37, 0xd4, 0xd5, 0x82, 0x8c, 0x9e, 0x91, 0x85, 0x02, 0x65, 0xad, 0xe6, 0x1b, 0x6b, 0xe8, 0xc5, + 0x99, 0xc3, 0xb6, 0x48, 0xa3, 0xa7, 0x98, 0x9f, 0x95, 0x44, 0xe3, 0xa9, 0x72, 0x82, 0x0f, 0x6a, + 0x17, 0xa1, 0x49, 0x43, 0x34, 0xb3, 0x18, 0xe5, 0x43, 0xbf, 0x9d, 0x11, 0x09, 0xcf, 0x2a, 0xc6, + 0x62, 0xfa, 0xbd, 0xd2, 0x17, 0xb3, 0x5e, 0x78, 0xa9, 0x25, 0xcb, 0xdc, 0xd9, 0xb0, 0x3a, 0xe8, + 0xff, 0x14, 0x8a, 0x7e, 0x1d, 0x61, 0xfe, 0x4b, 0xd1, 0xe6, 0x3f, 0x59, 0x32, 0xee, 0x04, 0x7b, + 0x55, 0x9d, 0x21, 0x86, 0x6f, 0xe5, 0x7a, 0x98, 0xd3, 0xda, 0xed, 0x75, 0x6d, 0x0b, 0x97, 0xdc, + 0x79, 0xb5, 0xe1, 0xb0, 0xd0, 0x33, 0x3d, 0xa9, 0xb1, 0x5d, 0x91, 0xf8, 0x3a, 0x28, 0x07, 0x12, + 0x93, 0xcf, 0x58, 0x86, 0x37, 0x77, 0x48, 0x68, 0x6d, 0x6b, 0x41, 0x20, 0x2c, 0xf6, 0x26, 0xe8, + 0xbb, 0x24, 0xc0, 0x77, 0xfa, 0x9a, 0xf5, 0xfb, 0x12, 0x4c, 0xb8, 0xf2, 0x2e, 0xb6, 0xdb, 0xe8, + 0x91, 0x5c, 0xbc, 0xb8, 0x48, 0xef, 0xb1, 0xe7, 0x08, 0xbb, 0xed, 0x79, 0x35, 0xa4, 0xf4, 0x23, + 0x30, 0x09, 0x84, 0x28, 0x71, 0x42, 0x14, 0xf3, 0xce, 0x8b, 0x2d, 0x22, 0x7d, 0xf1, 0x7d, 0x52, + 0x82, 0x59, 0x6f, 0x1e, 0xb1, 0x84, 0x9d, 0xd6, 0x36, 0xba, 0x4d, 0x74, 0xa1, 0x89, 0xb5, 0x34, + 0x7f, 0x4f, 0xb6, 0x83, 0x7e, 0x98, 0x49, 0xa8, 0xf2, 0x5c, 0xc9, 0x11, 0xab, 0x74, 0x89, 0x74, + 0x31, 0x8e, 0x60, 0xfa, 0xc2, 0xfc, 0x8a, 0x04, 0xd0, 0x30, 0xfd, 0xb9, 0xee, 0x01, 0x24, 0xf9, + 0x42, 0xe1, 0xed, 0x5a, 0x56, 0xf1, 0xa0, 0xd8, 0xe4, 0x3d, 0x87, 0xa0, 0xf3, 0xd1, 0xa0, 0x92, + 0xc6, 0xd2, 0xd6, 0xa7, 0x16, 0x77, 0xbb, 0x1d, 0xbd, 0xa5, 0x39, 0xbd, 0x1e, 0x73, 0xd1, 0xe2, + 0x25, 0x77, 0x4a, 0x26, 0x32, 0x0a, 0xfd, 0x32, 0x22, 0x64, 0x49, 0xe3, 0x98, 0x48, 0x5e, 0x1c, + 0x13, 0x41, 0x2f, 0x98, 0x01, 0xc4, 0xc7, 0xa0, 0x9e, 0x32, 0x1c, 0xad, 0x75, 0xb1, 0xb1, 0x60, + 0x61, 0xad, 0xdd, 0xb2, 0x76, 0x77, 0xce, 0xdb, 0x61, 0x77, 0xcf, 0x78, 0x1d, 0x0d, 0x2d, 0x1d, + 0x4b, 0xdc, 0xd2, 0x31, 0x7a, 0xa6, 0x2c, 0x1a, 0x55, 0x27, 0xb4, 0xc1, 0x11, 0xe2, 0x61, 0x88, + 0xa1, 0x2e, 0x91, 0x93, 0x52, 0xcf, 0x2a, 0x71, 0x36, 0xc9, 0x2a, 0xf1, 0x9b, 0x84, 0x62, 0xf4, + 0x08, 0xd5, 0x6b, 0x2c, 0xbe, 0x66, 0x73, 0x75, 0xec, 0x44, 0xc0, 0x7b, 0x1d, 0xcc, 0x9e, 0x0f, + 0xbe, 0xf8, 0x10, 0xf3, 0x89, 0x7d, 0x3c, 0x40, 0xdf, 0x9c, 0x74, 0x05, 0x86, 0x67, 0x21, 0x02, + 0x5d, 0x1f, 0x41, 0x49, 0xc4, 0xcd, 0x2c, 0xd1, 0x72, 0x4a, 0x6c, 0xf9, 0xe9, 0xa3, 0xf0, 0x51, + 0x09, 0xa6, 0xc9, 0x4d, 0x99, 0x0b, 0x97, 0xc8, 0xc1, 0x47, 0x41, 0xa3, 0xe4, 0x79, 0x61, 0x31, + 0x2b, 0x90, 0xed, 0xe8, 0xc6, 0x05, 0xcf, 0x3f, 0xd0, 0x7d, 0x0e, 0xee, 0x5d, 0x93, 0xfa, 0xdc, + 0xbb, 0xe6, 0xef, 0x53, 0xf8, 0xe5, 0x1e, 0xe8, 0x22, 0xe0, 0x81, 0xe4, 0xd2, 0x17, 0xe3, 0xdf, + 0x65, 0x21, 0x5f, 0xc7, 0x9a, 0xd5, 0xda, 0x46, 0xef, 0x91, 0xfa, 0x4e, 0x15, 0x26, 0xf9, 0xa9, + 0xc2, 0x12, 0x4c, 0x6c, 0xea, 0x1d, 0x07, 0x5b, 0xd4, 0x67, 0x3a, 0xdc, 0xb5, 0xd3, 0x26, 0xbe, + 0xd0, 0x31, 0x5b, 0x17, 0xe6, 0x99, 0xe9, 0x3e, 0xef, 0xc5, 0xe9, 0x9c, 0x5f, 0x22, 0x3f, 0xa9, + 0xde, 0xcf, 0xae, 0x41, 0x68, 0x9b, 0x96, 0x13, 0x75, 0x05, 0x43, 0x04, 0x95, 0xba, 0x69, 0x39, + 0x2a, 0xfd, 0xd1, 0x85, 0x79, 0x73, 0xb7, 0xd3, 0x69, 0xe0, 0x07, 0x1c, 0x6f, 0xda, 0xe6, 0xbd, + 0xbb, 0xc6, 0xa2, 0xb9, 0xb9, 0x69, 0x63, 0xba, 0x68, 0x90, 0x53, 0xd9, 0x9b, 0x72, 0x1c, 0x72, + 0x1d, 0x7d, 0x47, 0xa7, 0x13, 0x8d, 0x9c, 0x4a, 0x5f, 0x94, 0x1b, 0xa1, 0x10, 0xcc, 0x71, 0x28, + 0xa3, 0xa7, 0xf2, 0xa4, 0x69, 0xee, 0x4b, 0x77, 0x75, 0xe6, 0x02, 0xbe, 0x64, 0x9f, 0x9a, 0x20, + 0xdf, 0xc9, 0x33, 0x7f, 0x40, 0x45, 0x64, 0xbf, 0x83, 0x4a, 0x3c, 0x7a, 0x06, 0x6b, 0xe1, 0x96, + 0x69, 0xb5, 0x3d, 0xd9, 0x44, 0x4f, 0x30, 0x58, 0xbe, 0x64, 0xbb, 0x14, 0x7d, 0x0b, 0x4f, 0x5f, + 0xd3, 0xde, 0x99, 0x77, 0xbb, 0x4d, 0xb7, 0xe8, 0x73, 0xba, 0xb3, 0xbd, 0x86, 0x1d, 0x0d, 0xfd, + 0x9d, 0xdc, 0x57, 0xe3, 0xa6, 0xff, 0x3f, 0x8d, 0x1b, 0xa0, 0x71, 0x34, 0x02, 0x93, 0xb3, 0x6b, + 0x19, 0xae, 0x1c, 0x59, 0xcc, 0xd3, 0x50, 0x8a, 0x72, 0x07, 0x5c, 0x11, 0xbc, 0x79, 0x4b, 0xa5, + 0x8b, 0x6c, 0xda, 0x3a, 0x45, 0xb2, 0x47, 0x67, 0x50, 0xd6, 0xe1, 0x5a, 0xfa, 0x71, 0xa5, 0xb1, + 0xb6, 0xba, 0xa2, 0x6f, 0x6d, 0x77, 0xf4, 0xad, 0x6d, 0xc7, 0xae, 0x18, 0xb6, 0x83, 0xb5, 0x76, + 0x6d, 0x53, 0xa5, 0x97, 0xa7, 0x00, 0xa1, 0x23, 0x92, 0x95, 0xf7, 0xa9, 0x16, 0x1b, 0xdd, 0xc2, + 0x9a, 0x12, 0xd1, 0x52, 0x9e, 0xe0, 0xb6, 0x14, 0x7b, 0xb7, 0xe3, 0x63, 0x7a, 0x55, 0x0f, 0xa6, + 0x81, 0xaa, 0xef, 0x76, 0x48, 0x73, 0x21, 0x99, 0x93, 0x8e, 0x73, 0x31, 0x9c, 0xa4, 0xdf, 0x6c, + 0xfe, 0x9f, 0x3c, 0xe4, 0x96, 0x2d, 0xad, 0xbb, 0x8d, 0x9e, 0x11, 0xea, 0x9f, 0x47, 0xd5, 0x26, + 0x7c, 0xed, 0x94, 0x06, 0x69, 0xa7, 0x3c, 0x40, 0x3b, 0xb3, 0x21, 0xed, 0x8c, 0x5e, 0x54, 0x3e, + 0x03, 0x33, 0x2d, 0xb3, 0xd3, 0xc1, 0x2d, 0x57, 0x1e, 0x95, 0x36, 0x59, 0xcd, 0x99, 0x52, 0xb9, + 0x34, 0x12, 0xcb, 0x18, 0x3b, 0x75, 0xba, 0x86, 0x4e, 0x95, 0x3e, 0x48, 0x40, 0x2f, 0x96, 0x20, + 0x5b, 0x6e, 0x6f, 0x61, 0x6e, 0x9d, 0x3d, 0x13, 0x5a, 0x67, 0x3f, 0x09, 0x79, 0x47, 0xb3, 0xb6, + 0xb0, 0xe3, 0xad, 0x13, 0xd0, 0x37, 0x3f, 0xc4, 0xb2, 0x1c, 0x0a, 0xb1, 0xfc, 0xd3, 0x90, 0x75, + 0x65, 0xc6, 0xdc, 0xc8, 0xaf, 0xed, 0x07, 0x3f, 0x91, 0xfd, 0xbc, 0x5b, 0xe2, 0xbc, 0x5b, 0x6b, + 0x95, 0xfc, 0xd0, 0x8b, 0x75, 0x6e, 0x1f, 0xd6, 0xe4, 0x1e, 0xc8, 0x96, 0x69, 0x54, 0x76, 0xb4, + 0x2d, 0xcc, 0xaa, 0x19, 0x24, 0x78, 0x5f, 0xcb, 0x3b, 0xe6, 0xfd, 0x3a, 0x8b, 0x76, 0x1c, 0x24, + 0xb8, 0x55, 0xd8, 0xd6, 0xdb, 0x6d, 0x6c, 0xb0, 0x96, 0xcd, 0xde, 0xce, 0x9c, 0x86, 0xac, 0xcb, + 0x83, 0xab, 0x3f, 0xae, 0xb1, 0x50, 0x38, 0xa2, 0xcc, 0xb8, 0xcd, 0x8a, 0x36, 0xde, 0x42, 0x86, + 0x5f, 0x53, 0x15, 0x71, 0xdb, 0xa1, 0x95, 0xeb, 0xdf, 0xb8, 0x1e, 0x03, 0x39, 0xc3, 0x6c, 0xe3, + 0x81, 0x83, 0x10, 0xcd, 0xa5, 0x3c, 0x1e, 0x72, 0xb8, 0xed, 0xf6, 0x0a, 0x32, 0xc9, 0x7e, 0x3a, + 0x5e, 0x96, 0x2a, 0xcd, 0x9c, 0xcc, 0x37, 0xa8, 0x1f, 0xb7, 0xe9, 0x37, 0xc0, 0x5f, 0x99, 0x80, + 0xa3, 0xb4, 0x0f, 0xa8, 0xef, 0x9e, 0x77, 0x49, 0x9d, 0xc7, 0xe8, 0xa1, 0xfe, 0x03, 0xd7, 0x51, + 0x5e, 0xd9, 0x8f, 0x43, 0xce, 0xde, 0x3d, 0xef, 0x1b, 0xa1, 0xf4, 0x25, 0xdc, 0x74, 0xa5, 0x91, + 0x0c, 0x67, 0xf2, 0xb0, 0xc3, 0x19, 0x37, 0x34, 0xc9, 0x5e, 0xe3, 0x0f, 0x06, 0x32, 0x7a, 0x00, + 0xc2, 0x1b, 0xc8, 0xfa, 0x0d, 0x43, 0xa7, 0x60, 0x42, 0xdb, 0x74, 0xb0, 0x15, 0x98, 0x89, 0xec, + 0xd5, 0x1d, 0x2a, 0xcf, 0xe3, 0x4d, 0xd3, 0x72, 0xc5, 0x32, 0x45, 0x87, 0x4a, 0xef, 0x3d, 0xd4, + 0x72, 0x81, 0xdb, 0x21, 0xbb, 0x09, 0x8e, 0x19, 0xe6, 0x22, 0xee, 0x32, 0x39, 0x53, 0x14, 0x67, + 0x49, 0x0b, 0xd8, 0xff, 0x61, 0x5f, 0x57, 0x32, 0xb7, 0xbf, 0x2b, 0x41, 0x9f, 0x49, 0x3a, 0x67, + 0xee, 0x01, 0x7a, 0x64, 0x16, 0x9a, 0xf2, 0x24, 0x98, 0x69, 0x33, 0x17, 0xad, 0x96, 0xee, 0xb7, + 0x92, 0xc8, 0xff, 0xb8, 0xcc, 0x81, 0x22, 0x65, 0xc3, 0x8a, 0xb4, 0x0c, 0x93, 0xe4, 0xa8, 0xb2, + 0xab, 0x49, 0xb9, 0x1e, 0x97, 0x78, 0x32, 0xad, 0xf3, 0x2b, 0x15, 0x12, 0xdb, 0x7c, 0x89, 0xfd, + 0xa2, 0xfa, 0x3f, 0x27, 0x9b, 0x7d, 0xc7, 0x4b, 0x28, 0xfd, 0xe6, 0xf8, 0x3b, 0x79, 0xb8, 0xa2, + 0x64, 0x99, 0xb6, 0x4d, 0xce, 0xc0, 0xf4, 0x36, 0xcc, 0x37, 0x48, 0xdc, 0x65, 0x0b, 0x0f, 0xeb, + 0xe6, 0xd7, 0xaf, 0x41, 0x8d, 0xaf, 0x69, 0x7c, 0x43, 0x38, 0xc8, 0x8b, 0xbf, 0xff, 0x10, 0x21, + 0xf4, 0x1f, 0x8f, 0x46, 0xf2, 0xce, 0x8c, 0x48, 0xdc, 0x99, 0x84, 0xb2, 0x4a, 0xbf, 0xb9, 0x7c, + 0x59, 0x82, 0x2b, 0x7b, 0xb9, 0xd9, 0x30, 0x6c, 0xbf, 0xc1, 0x5c, 0x3d, 0xa0, 0xbd, 0xf0, 0x71, + 0x4a, 0x62, 0xaf, 0x39, 0x8c, 0xa8, 0x7b, 0xa8, 0xb4, 0x88, 0xc5, 0x92, 0xe0, 0x44, 0x4d, 0xdc, + 0x35, 0x87, 0x89, 0xc9, 0xa7, 0x2f, 0xdc, 0xcf, 0x66, 0xe1, 0xe8, 0xb2, 0x65, 0xee, 0x76, 0xed, + 0xa0, 0x07, 0xfa, 0xeb, 0xfe, 0x1b, 0xae, 0x79, 0x11, 0xd3, 0xe0, 0x1a, 0x98, 0xb6, 0x98, 0x35, + 0x17, 0x6c, 0xbf, 0x86, 0x93, 0xc2, 0xbd, 0x97, 0x7c, 0x90, 0xde, 0x2b, 0xe8, 0x67, 0xb2, 0x5c, + 0x3f, 0xd3, 0xdb, 0x73, 0xe4, 0xfa, 0xf4, 0x1c, 0x7f, 0x25, 0x25, 0x1c, 0x54, 0x7b, 0x44, 0x14, + 0xd1, 0x5f, 0x94, 0x20, 0xbf, 0x45, 0x32, 0xb2, 0xee, 0xe2, 0xd1, 0x62, 0x35, 0x23, 0xc4, 0x55, + 0xf6, 0x6b, 0x20, 0x57, 0x39, 0xac, 0xc3, 0x89, 0x06, 0xb8, 0x78, 0x6e, 0xd3, 0x57, 0xaa, 0xd7, + 0x64, 0x61, 0xc6, 0x2f, 0xbd, 0xd2, 0xb6, 0xd1, 0xf3, 0xfa, 0x6b, 0xd4, 0xac, 0x88, 0x46, 0xed, + 0x5b, 0x67, 0xf6, 0x47, 0x1d, 0x39, 0x34, 0xea, 0xf4, 0x1d, 0x5d, 0x66, 0x22, 0x46, 0x17, 0xf4, + 0x74, 0x59, 0xf4, 0xba, 0x22, 0xbe, 0x6b, 0x25, 0xb5, 0x79, 0x38, 0x0f, 0x16, 0x82, 0x97, 0x26, + 0x0d, 0xae, 0x55, 0xfa, 0x4a, 0xf2, 0x7e, 0x09, 0x8e, 0xed, 0xef, 0xcc, 0x7f, 0x82, 0xf7, 0x42, + 0x73, 0xeb, 0x64, 0xfb, 0x5e, 0x68, 0xe4, 0x8d, 0xdf, 0xa4, 0x8b, 0x0d, 0x1a, 0xc2, 0xd9, 0x7b, + 0x83, 0x3b, 0x71, 0xb1, 0xb0, 0x20, 0x82, 0x44, 0xc7, 0x70, 0xeb, 0x94, 0x0c, 0x53, 0x75, 0xec, + 0xac, 0x6a, 0x97, 0xcc, 0x5d, 0x07, 0x69, 0xa2, 0xdb, 0x73, 0x4f, 0x84, 0x7c, 0x87, 0xfc, 0xc2, + 0x6e, 0x81, 0xbf, 0xa6, 0xef, 0xfe, 0x16, 0xf1, 0xfd, 0xa1, 0xa4, 0x55, 0x96, 0x9f, 0x8f, 0xd6, + 0x22, 0xb2, 0x3b, 0xea, 0x73, 0x37, 0x92, 0xad, 0x9d, 0x44, 0x7b, 0xa7, 0x51, 0x45, 0xa7, 0x0f, + 0xcb, 0x33, 0x65, 0x98, 0xad, 0x63, 0xa7, 0x62, 0x2f, 0x69, 0x7b, 0xa6, 0xa5, 0x3b, 0x38, 0x7c, + 0x0d, 0x64, 0x3c, 0x34, 0xa7, 0x01, 0x74, 0xff, 0x37, 0x16, 0x43, 0x2a, 0x94, 0x82, 0x7e, 0x3b, + 0xa9, 0xa3, 0x10, 0xc7, 0xc7, 0x48, 0x40, 0x48, 0xe4, 0x63, 0x11, 0x57, 0x7c, 0xfa, 0x40, 0x7c, + 0x49, 0x62, 0x40, 0x14, 0xad, 0xd6, 0xb6, 0xbe, 0x87, 0xdb, 0x09, 0x81, 0xf0, 0x7e, 0x0b, 0x80, + 0xf0, 0x09, 0x25, 0x76, 0x5f, 0xe1, 0xf8, 0x18, 0x85, 0xfb, 0x4a, 0x1c, 0xc1, 0xb1, 0x84, 0x81, + 0x72, 0xbb, 0x1e, 0xb6, 0x9e, 0x79, 0x97, 0xa8, 0x58, 0x03, 0x93, 0x4d, 0x0a, 0x9b, 0x6c, 0x43, + 0x75, 0x2c, 0xb4, 0xec, 0x41, 0x3a, 0x9d, 0x4d, 0xa3, 0x63, 0xe9, 0x5b, 0x74, 0xfa, 0x42, 0x7f, + 0xb7, 0x0c, 0x27, 0xfc, 0xf8, 0x28, 0x75, 0xec, 0x2c, 0x6a, 0xf6, 0xf6, 0x79, 0x53, 0xb3, 0xda, + 0xa8, 0x34, 0x82, 0x13, 0x7f, 0xe8, 0x8b, 0x61, 0x10, 0xaa, 0x3c, 0x08, 0x7d, 0x5d, 0x45, 0xfb, + 0xf2, 0x32, 0x8a, 0x4e, 0x26, 0xd6, 0x9b, 0xf5, 0x77, 0x7d, 0xb0, 0x9e, 0xc2, 0x81, 0x75, 0xe7, + 0xb0, 0x2c, 0xa6, 0x0f, 0xdc, 0x6f, 0xd1, 0x11, 0x21, 0xe4, 0xd5, 0x7c, 0x9f, 0x28, 0x60, 0x11, + 0x5e, 0xad, 0x72, 0xa4, 0x57, 0xeb, 0x50, 0x63, 0xc4, 0x40, 0x8f, 0xe4, 0x74, 0xc7, 0x88, 0x43, + 0xf4, 0x36, 0x7e, 0xbb, 0x0c, 0x05, 0x12, 0x20, 0x2b, 0xe4, 0xf1, 0x1d, 0x8e, 0x37, 0x1d, 0x8f, + 0xce, 0x3e, 0xef, 0xf2, 0x89, 0xa4, 0xde, 0xe5, 0xe8, 0x6d, 0x49, 0x7d, 0xc8, 0x7b, 0xb9, 0x1d, + 0x09, 0x62, 0x89, 0x5c, 0xc4, 0x07, 0x70, 0x90, 0x3e, 0x68, 0xff, 0x4d, 0x06, 0x70, 0x1b, 0x34, + 0x3b, 0xfb, 0xf0, 0x54, 0x51, 0xb8, 0x6e, 0x0e, 0xfb, 0xd5, 0xbb, 0x40, 0x9d, 0xe8, 0x01, 0x8a, + 0x52, 0x0c, 0x4e, 0x55, 0x3c, 0x94, 0xd4, 0xb7, 0x32, 0xe0, 0x6a, 0x24, 0xb0, 0x24, 0xf2, 0xb6, + 0x8c, 0x2c, 0x3b, 0x7d, 0x40, 0xfe, 0x87, 0x04, 0xb9, 0x86, 0x59, 0xc7, 0xce, 0xc1, 0x4d, 0x81, + 0xc4, 0xc7, 0xf6, 0x49, 0xb9, 0xa3, 0x38, 0xb6, 0xdf, 0x8f, 0x50, 0xfa, 0xa2, 0x7b, 0x97, 0x04, + 0x33, 0x0d, 0xb3, 0xe4, 0x2f, 0x4e, 0x89, 0xfb, 0xaa, 0x8a, 0x5f, 0xb9, 0xec, 0x57, 0x30, 0x28, + 0xe6, 0x40, 0x57, 0x2e, 0x0f, 0xa6, 0x97, 0xbe, 0xdc, 0x6e, 0x83, 0xa3, 0x1b, 0x46, 0xdb, 0x54, + 0x71, 0xdb, 0x64, 0x2b, 0xdd, 0x8a, 0x02, 0xd9, 0x5d, 0xa3, 0x6d, 0x12, 0x96, 0x73, 0x2a, 0x79, + 0x76, 0xd3, 0x2c, 0xdc, 0x36, 0x99, 0x6f, 0x00, 0x79, 0x46, 0xdf, 0x90, 0x21, 0xeb, 0xfe, 0x2b, + 0x2e, 0xea, 0xb7, 0xcb, 0x09, 0x03, 0x11, 0xb8, 0xe4, 0x47, 0x62, 0x09, 0xdd, 0x15, 0x5a, 0xfb, + 0xa7, 0x1e, 0xac, 0xd7, 0x46, 0x95, 0x17, 0x12, 0x45, 0xb0, 0xe6, 0xaf, 0x9c, 0x82, 0x89, 0xf3, + 0x1d, 0xb3, 0x75, 0x21, 0x38, 0x2f, 0xcf, 0x5e, 0x95, 0x1b, 0x21, 0x67, 0x69, 0xc6, 0x16, 0x66, + 0x7b, 0x0a, 0xc7, 0x7b, 0xfa, 0x42, 0xe2, 0xf5, 0xa2, 0xd2, 0x2c, 0xe8, 0x6d, 0x49, 0x42, 0x20, + 0xf4, 0xa9, 0x7c, 0x32, 0x7d, 0x58, 0x1c, 0xe2, 0x64, 0x59, 0x01, 0x66, 0x4a, 0x45, 0x7a, 0xb9, + 0xf9, 0x5a, 0xed, 0x6c, 0xb9, 0x20, 0x13, 0x98, 0x5d, 0x99, 0xa4, 0x08, 0xb3, 0x4b, 0xfe, 0xc7, + 0x16, 0xe6, 0x3e, 0x95, 0x3f, 0x0c, 0x98, 0x3f, 0x29, 0xc1, 0xec, 0xaa, 0x6e, 0x3b, 0x51, 0xde, + 0xfe, 0x31, 0xf1, 0x71, 0x9f, 0x9f, 0xd4, 0x54, 0xe6, 0xca, 0x11, 0x0e, 0x8c, 0x9b, 0xc8, 0x1c, + 0x8e, 0x2b, 0x62, 0x3c, 0xc7, 0x52, 0x08, 0x07, 0xf4, 0x42, 0x62, 0x61, 0x49, 0x26, 0x36, 0x94, + 0x82, 0x42, 0xc6, 0x6f, 0x28, 0x45, 0x96, 0x9d, 0xbe, 0x7c, 0xbf, 0x21, 0xc1, 0x31, 0xb7, 0xf8, + 0xb8, 0x65, 0xa9, 0x68, 0x31, 0x0f, 0x5c, 0x96, 0x4a, 0xbc, 0x32, 0xbe, 0x8f, 0x97, 0x51, 0xac, + 0x8c, 0x0f, 0x22, 0x3a, 0x66, 0x31, 0x47, 0x2c, 0xc3, 0x0e, 0x12, 0x73, 0xcc, 0x32, 0xec, 0xf0, + 0x62, 0x8e, 0x5f, 0x8a, 0x1d, 0x52, 0xcc, 0x87, 0xb6, 0xc0, 0xfa, 0x3a, 0xd9, 0x17, 0x73, 0xe4, + 0xda, 0x46, 0x8c, 0x98, 0x13, 0x9f, 0xd8, 0x45, 0xef, 0x18, 0x52, 0xf0, 0x23, 0x5e, 0xdf, 0x18, + 0x06, 0xa6, 0x43, 0x5c, 0xe3, 0x78, 0x89, 0x0c, 0x73, 0x8c, 0x8b, 0xfe, 0x53, 0xe6, 0x18, 0x8c, + 0x12, 0x4f, 0x99, 0x13, 0x9f, 0x01, 0xe2, 0x39, 0x1b, 0xff, 0x19, 0xa0, 0xd8, 0xf2, 0xd3, 0x07, + 0xe7, 0x9b, 0x59, 0x38, 0xe9, 0xb2, 0xb0, 0x66, 0xb6, 0xf5, 0xcd, 0x4b, 0x94, 0x8b, 0xb3, 0x5a, + 0x67, 0x17, 0xdb, 0xe8, 0xbd, 0x92, 0x28, 0x4a, 0xff, 0x09, 0xc0, 0xec, 0x62, 0x8b, 0x06, 0x52, + 0x63, 0x40, 0xdd, 0x11, 0x55, 0xd9, 0xfd, 0x25, 0xf9, 0xd7, 0xc5, 0xd4, 0x3c, 0x22, 0x6a, 0x88, + 0x9e, 0x6b, 0x15, 0x4e, 0xf9, 0x5f, 0x7a, 0x1d, 0x3c, 0x32, 0xfb, 0x1d, 0x3c, 0x6e, 0x00, 0x59, + 0x6b, 0xb7, 0x7d, 0xa8, 0x7a, 0x37, 0xb3, 0x49, 0x99, 0xaa, 0x9b, 0xc5, 0xcd, 0x69, 0xe3, 0xe0, + 0x68, 0x5e, 0x44, 0x4e, 0x1b, 0x3b, 0xca, 0x3c, 0xe4, 0xe9, 0xe5, 0xcc, 0xfe, 0x8a, 0x7e, 0xff, + 0xcc, 0x2c, 0x17, 0x6f, 0xda, 0xd5, 0x78, 0x35, 0xbc, 0x2d, 0x91, 0x64, 0xfa, 0xf5, 0xd3, 0x81, + 0x9d, 0xac, 0x72, 0x0a, 0xf6, 0xe4, 0xa1, 0x29, 0x8f, 0x67, 0x37, 0xac, 0xd8, 0xed, 0x76, 0x2e, + 0x35, 0x58, 0xf0, 0x95, 0x44, 0xbb, 0x61, 0xa1, 0x18, 0x2e, 0x52, 0x6f, 0x0c, 0x97, 0xe4, 0xbb, + 0x61, 0x1c, 0x1f, 0xa3, 0xd8, 0x0d, 0x8b, 0x23, 0x98, 0xbe, 0x68, 0xdf, 0x92, 0xa3, 0x56, 0x33, + 0x8b, 0xde, 0xff, 0x47, 0xfd, 0x0f, 0xa1, 0x01, 0xef, 0xec, 0xd2, 0x2f, 0xb0, 0x7f, 0xec, 0xad, + 0x25, 0xca, 0xe3, 0x21, 0xbf, 0x69, 0x5a, 0x3b, 0x9a, 0xb7, 0x71, 0xdf, 0x7b, 0x52, 0x84, 0x45, + 0xcc, 0x5f, 0x22, 0x79, 0x54, 0x96, 0xd7, 0x9d, 0x8f, 0x3c, 0x4d, 0xef, 0xb2, 0xa8, 0x8b, 0xee, + 0xa3, 0x72, 0x1d, 0xcc, 0xb2, 0xe0, 0x8b, 0x55, 0x6c, 0x3b, 0xb8, 0xcd, 0x22, 0x56, 0xf0, 0x89, + 0xca, 0x19, 0x98, 0x61, 0x09, 0x4b, 0x7a, 0x07, 0xdb, 0x2c, 0x68, 0x05, 0x97, 0xa6, 0x9c, 0x84, + 0xbc, 0x6e, 0xdf, 0x63, 0x9b, 0x06, 0xf1, 0xff, 0x9f, 0x54, 0xd9, 0x9b, 0x72, 0x03, 0x1c, 0x65, + 0xf9, 0x7c, 0x63, 0x95, 0x1e, 0xd8, 0xe9, 0x4d, 0x76, 0x55, 0xcb, 0x30, 0xd7, 0x2d, 0x73, 0xcb, + 0xc2, 0xb6, 0x4d, 0x4e, 0x4d, 0x4d, 0xaa, 0xa1, 0x14, 0xf4, 0xb9, 0x61, 0x26, 0x16, 0x89, 0x6f, + 0x32, 0x70, 0x51, 0xda, 0x6d, 0xb5, 0x30, 0x6e, 0xb3, 0x93, 0x4f, 0xde, 0x6b, 0xc2, 0x3b, 0x0e, + 0x12, 0x4f, 0x43, 0x0e, 0xe9, 0x92, 0x83, 0x0f, 0x9f, 0x80, 0x3c, 0xbd, 0x30, 0x0c, 0xbd, 0x68, + 0xae, 0xaf, 0xb2, 0xce, 0xf1, 0xca, 0xba, 0x01, 0x33, 0x86, 0xe9, 0x16, 0xb7, 0xae, 0x59, 0xda, + 0x8e, 0x1d, 0xb7, 0xca, 0x48, 0xe9, 0xfa, 0x43, 0x4a, 0x35, 0xf4, 0xdb, 0xca, 0x11, 0x95, 0x23, + 0xa3, 0xfc, 0xff, 0xe0, 0xe8, 0x79, 0x16, 0x21, 0xc0, 0x66, 0x94, 0xa5, 0x68, 0x1f, 0xbc, 0x1e, + 0xca, 0x0b, 0xfc, 0x9f, 0x2b, 0x47, 0xd4, 0x5e, 0x62, 0xca, 0xcf, 0xc2, 0x9c, 0xfb, 0xda, 0x36, + 0x2f, 0x7a, 0x8c, 0xcb, 0xd1, 0x86, 0x48, 0x0f, 0xf9, 0x35, 0xee, 0xc7, 0x95, 0x23, 0x6a, 0x0f, + 0x29, 0xa5, 0x06, 0xb0, 0xed, 0xec, 0x74, 0x18, 0xe1, 0x6c, 0xb4, 0x4a, 0xf6, 0x10, 0x5e, 0xf1, + 0x7f, 0x5a, 0x39, 0xa2, 0x86, 0x48, 0x28, 0xab, 0x30, 0xe5, 0x3c, 0xe0, 0x30, 0x7a, 0xb9, 0xe8, + 0xcd, 0xef, 0x1e, 0x7a, 0x0d, 0xef, 0x9f, 0x95, 0x23, 0x6a, 0x40, 0x40, 0xa9, 0xc0, 0x64, 0xf7, + 0x3c, 0x23, 0x96, 0xef, 0x13, 0x6d, 0xbe, 0x3f, 0xb1, 0xf5, 0xf3, 0x3e, 0x2d, 0xff, 0x77, 0x97, + 0xb1, 0x96, 0xbd, 0xc7, 0x68, 0x4d, 0x08, 0x33, 0x56, 0xf2, 0xfe, 0x71, 0x19, 0xf3, 0x09, 0x28, + 0x15, 0x98, 0xb2, 0x0d, 0xad, 0x6b, 0x6f, 0x9b, 0x8e, 0x7d, 0x6a, 0xb2, 0xc7, 0x4f, 0x32, 0x9a, + 0x5a, 0x9d, 0xfd, 0xa3, 0x06, 0x7f, 0x2b, 0x8f, 0x87, 0x13, 0xbb, 0xe4, 0xe6, 0xf6, 0xf2, 0x03, + 0xba, 0xed, 0xe8, 0xc6, 0x96, 0x17, 0x63, 0x96, 0xf6, 0x36, 0xfd, 0x3f, 0x2a, 0xf3, 0xec, 0xc4, + 0x14, 0x90, 0xb6, 0x89, 0x7a, 0x37, 0xeb, 0x68, 0xb1, 0xa1, 0x83, 0x52, 0x4f, 0x82, 0xac, 0xfb, + 0x89, 0xf4, 0x4e, 0x73, 0xfd, 0x17, 0x02, 0x7b, 0x75, 0x87, 0x34, 0x60, 0xf7, 0xa7, 0x9e, 0x0e, + 0x6e, 0xa6, 0xb7, 0x83, 0x73, 0x1b, 0xb8, 0x6e, 0xaf, 0xe9, 0x5b, 0xd4, 0xba, 0x62, 0xfe, 0xf0, + 0xe1, 0x24, 0x3a, 0x1b, 0xad, 0xe2, 0x8b, 0xf4, 0x06, 0x8d, 0xa3, 0xde, 0x6c, 0xd4, 0x4b, 0x41, + 0xd7, 0xc3, 0x4c, 0xb8, 0x91, 0xd1, 0x5b, 0x47, 0xf5, 0xc0, 0x36, 0x63, 0x6f, 0xe8, 0x3a, 0x98, + 0xe3, 0x75, 0x3a, 0x34, 0x04, 0xc9, 0x5e, 0x57, 0x88, 0xae, 0x85, 0xa3, 0x3d, 0x0d, 0xcb, 0x8b, + 0x39, 0x92, 0x09, 0x62, 0x8e, 0x5c, 0x03, 0x10, 0x68, 0x71, 0x5f, 0x32, 0x57, 0xc3, 0x94, 0xaf, + 0x97, 0x7d, 0x33, 0x7c, 0x2d, 0x03, 0x93, 0x9e, 0xb2, 0xf5, 0xcb, 0xe0, 0x8e, 0x3f, 0x46, 0x68, + 0x83, 0x81, 0x4d, 0xc3, 0xb9, 0x34, 0x77, 0x9c, 0x09, 0xdc, 0x7a, 0x1b, 0xba, 0xd3, 0xf1, 0x8e, + 0xc6, 0xf5, 0x26, 0x2b, 0xeb, 0x00, 0x3a, 0xc1, 0xa8, 0x11, 0x9c, 0x95, 0xbb, 0x25, 0x41, 0x7b, + 0xa0, 0xfa, 0x10, 0xa2, 0x71, 0xe6, 0x27, 0xd8, 0x41, 0xb6, 0x29, 0xc8, 0xd1, 0x40, 0xeb, 0x47, + 0x94, 0x39, 0x80, 0xf2, 0x53, 0xd7, 0xcb, 0x6a, 0xa5, 0x5c, 0x2d, 0x95, 0x0b, 0x19, 0xf4, 0x52, + 0x09, 0xa6, 0xfc, 0x46, 0xd0, 0xb7, 0x92, 0x65, 0xa6, 0x5a, 0x03, 0x2f, 0x76, 0xdc, 0xdf, 0xa8, + 0xc2, 0x4a, 0xf6, 0x44, 0xb8, 0x7c, 0xd7, 0xc6, 0x4b, 0xba, 0x65, 0x3b, 0xaa, 0x79, 0x71, 0xc9, + 0xb4, 0xfc, 0xa8, 0xca, 0x2c, 0xc2, 0x69, 0xd4, 0x67, 0xd7, 0xe2, 0x68, 0x63, 0x72, 0x68, 0x0a, + 0x5b, 0x6c, 0xe5, 0x38, 0x48, 0x70, 0xe9, 0x3a, 0x96, 0x66, 0xd8, 0x5d, 0xd3, 0xc6, 0xaa, 0x79, + 0xd1, 0x2e, 0x1a, 0xed, 0x92, 0xd9, 0xd9, 0xdd, 0x31, 0x6c, 0x66, 0x33, 0x44, 0x7d, 0x76, 0xa5, + 0x43, 0xae, 0x6d, 0x9d, 0x03, 0x28, 0xd5, 0x56, 0x57, 0xcb, 0xa5, 0x46, 0xa5, 0x56, 0x2d, 0x1c, + 0x71, 0xa5, 0xd5, 0x28, 0x2e, 0xac, 0xba, 0xd2, 0xf9, 0x39, 0x98, 0xf4, 0xda, 0x34, 0x0b, 0x93, + 0x92, 0xf1, 0xc2, 0xa4, 0x28, 0x45, 0x98, 0xf4, 0x5a, 0x39, 0x1b, 0x11, 0x1e, 0xd9, 0x7b, 0x2c, + 0x76, 0x47, 0xb3, 0x1c, 0xe2, 0x4f, 0xed, 0x11, 0x59, 0xd0, 0x6c, 0xac, 0xfa, 0xbf, 0x9d, 0x79, + 0x0c, 0xe3, 0x40, 0x81, 0xb9, 0xe2, 0xea, 0x6a, 0xb3, 0xa6, 0x36, 0xab, 0xb5, 0xc6, 0x4a, 0xa5, + 0xba, 0x4c, 0x47, 0xc8, 0xca, 0x72, 0xb5, 0xa6, 0x96, 0xe9, 0x00, 0x59, 0x2f, 0x64, 0xe8, 0xb5, + 0xc1, 0x0b, 0x93, 0x90, 0xef, 0x12, 0xe9, 0xa2, 0x2f, 0xcb, 0x09, 0xcf, 0xc3, 0xfb, 0x38, 0x45, + 0x5c, 0x6c, 0xca, 0xf9, 0xa4, 0x4b, 0x7d, 0xce, 0x8c, 0x9e, 0x81, 0x19, 0x6a, 0xeb, 0xd9, 0x64, + 0x79, 0x9f, 0x20, 0x27, 0xab, 0x5c, 0x1a, 0xfa, 0xa8, 0x94, 0xe0, 0x90, 0x7c, 0x5f, 0x8e, 0x92, + 0x19, 0x17, 0x7f, 0x9e, 0x19, 0xee, 0x5a, 0x82, 0x4a, 0xb5, 0x51, 0x56, 0xab, 0xc5, 0x55, 0x96, + 0x45, 0x56, 0x4e, 0xc1, 0xf1, 0x6a, 0x8d, 0xc5, 0xfc, 0xab, 0x37, 0x1b, 0xb5, 0x66, 0x65, 0x6d, + 0xbd, 0xa6, 0x36, 0x0a, 0x39, 0xe5, 0x24, 0x28, 0xf4, 0xb9, 0x59, 0xa9, 0x37, 0x4b, 0xc5, 0x6a, + 0xa9, 0xbc, 0x5a, 0x5e, 0x2c, 0xe4, 0x95, 0x47, 0xc1, 0xb5, 0xf4, 0x9a, 0x9b, 0xda, 0x52, 0x53, + 0xad, 0x9d, 0xab, 0xbb, 0x08, 0xaa, 0xe5, 0xd5, 0xa2, 0xab, 0x48, 0xa1, 0xeb, 0x83, 0x27, 0x94, + 0xcb, 0xe0, 0x28, 0xb9, 0x5b, 0x7c, 0xb5, 0x56, 0x5c, 0x64, 0xe5, 0x4d, 0x2a, 0x57, 0xc1, 0xa9, + 0x4a, 0xb5, 0xbe, 0xb1, 0xb4, 0x54, 0x29, 0x55, 0xca, 0xd5, 0x46, 0x73, 0xbd, 0xac, 0xae, 0x55, + 0xea, 0x75, 0xf7, 0xdf, 0xc2, 0x14, 0xb9, 0x9c, 0x95, 0xf6, 0x99, 0xe8, 0x3d, 0x32, 0xcc, 0x9e, + 0xd5, 0x3a, 0xba, 0x3b, 0x50, 0x90, 0x5b, 0x9b, 0x7b, 0x8e, 0x93, 0x38, 0xe4, 0x76, 0x67, 0xe6, + 0x90, 0x4e, 0x5e, 0xd0, 0x2f, 0xc9, 0x09, 0x8f, 0x93, 0x30, 0x20, 0x68, 0x89, 0xf3, 0x5c, 0x69, + 0x11, 0x93, 0x9f, 0x57, 0x4b, 0x09, 0x8e, 0x93, 0x88, 0x93, 0x4f, 0x06, 0xfe, 0xcb, 0x46, 0x05, + 0x7e, 0x01, 0x66, 0x36, 0xaa, 0xc5, 0x8d, 0xc6, 0x4a, 0x4d, 0xad, 0xfc, 0x0c, 0x89, 0x46, 0x3e, + 0x0b, 0x53, 0x4b, 0x35, 0x75, 0xa1, 0xb2, 0xb8, 0x58, 0xae, 0x16, 0x72, 0xca, 0xe5, 0x70, 0x59, + 0xbd, 0xac, 0x9e, 0xad, 0x94, 0xca, 0xcd, 0x8d, 0x6a, 0xf1, 0x6c, 0xb1, 0xb2, 0x4a, 0xfa, 0x88, + 0x7c, 0xcc, 0x8d, 0xd3, 0x13, 0xe8, 0x17, 0xb2, 0x00, 0xb4, 0xea, 0xe4, 0x32, 0x9e, 0xd0, 0xbd, + 0xc4, 0x5f, 0x48, 0x3a, 0x69, 0x08, 0xc8, 0x44, 0xb4, 0xdf, 0x0a, 0x4c, 0x5a, 0xec, 0x03, 0x5b, + 0x5e, 0x19, 0x44, 0x87, 0x3e, 0x7a, 0xd4, 0x54, 0xff, 0x77, 0xf4, 0xde, 0x24, 0x73, 0x84, 0x48, + 0xc6, 0x92, 0x21, 0xb9, 0x34, 0x1a, 0x20, 0xd1, 0xf3, 0x32, 0x30, 0xc7, 0x57, 0xcc, 0xad, 0x04, + 0x31, 0xa6, 0xc4, 0x2a, 0xc1, 0xff, 0x1c, 0x32, 0xb2, 0xce, 0x3c, 0x8e, 0x0d, 0xa7, 0xe0, 0xb5, + 0x4c, 0x7a, 0x32, 0xdc, 0xb3, 0x58, 0x0a, 0x19, 0x97, 0x79, 0xd7, 0xe8, 0x28, 0x48, 0xca, 0x04, + 0xc8, 0x8d, 0x07, 0x9c, 0x82, 0x8c, 0xbe, 0x26, 0xc3, 0x2c, 0x77, 0xf1, 0x31, 0x7a, 0x75, 0x46, + 0xe4, 0x52, 0xd2, 0xd0, 0x95, 0xca, 0x99, 0x83, 0x5e, 0xa9, 0x7c, 0xe6, 0x66, 0x98, 0x60, 0x69, + 0x44, 0xbe, 0xb5, 0xaa, 0x6b, 0x0a, 0x1c, 0x85, 0xe9, 0xe5, 0x72, 0xa3, 0x59, 0x6f, 0x14, 0xd5, + 0x46, 0x79, 0xb1, 0x90, 0x71, 0x07, 0xbe, 0xf2, 0xda, 0x7a, 0xe3, 0xbe, 0x82, 0x94, 0xdc, 0x43, + 0xaf, 0x97, 0x91, 0x31, 0x7b, 0xe8, 0xc5, 0x15, 0x9f, 0xfe, 0x5c, 0xf5, 0x33, 0x32, 0x14, 0x28, + 0x07, 0xe5, 0x07, 0xba, 0xd8, 0xd2, 0xb1, 0xd1, 0xc2, 0xe8, 0x82, 0x48, 0x44, 0xd0, 0x7d, 0xb1, + 0xf2, 0x48, 0x7f, 0x1e, 0xb2, 0x12, 0xe9, 0x4b, 0x8f, 0x81, 0x9d, 0xdd, 0x67, 0x60, 0x7f, 0x3a, + 0xa9, 0x8b, 0x5e, 0x2f, 0xbb, 0x23, 0x81, 0xec, 0x13, 0x49, 0x5c, 0xf4, 0x06, 0x70, 0x30, 0x96, + 0x40, 0xbf, 0x11, 0xe3, 0x6f, 0x41, 0x46, 0xcf, 0x95, 0xe1, 0xe8, 0xa2, 0xe6, 0xe0, 0x85, 0x4b, + 0x0d, 0xef, 0x62, 0xc2, 0x88, 0xcb, 0x84, 0x33, 0xfb, 0x2e, 0x13, 0x0e, 0xee, 0x36, 0x94, 0x7a, + 0xee, 0x36, 0x44, 0xef, 0x4c, 0x7a, 0xa8, 0xaf, 0x87, 0x87, 0x91, 0x45, 0xe3, 0x4d, 0x76, 0x58, + 0x2f, 0x9e, 0x8b, 0x31, 0xdc, 0xed, 0x3f, 0x05, 0x05, 0xca, 0x4a, 0xc8, 0x0b, 0xed, 0xd7, 0xd9, + 0xfd, 0xdb, 0xcd, 0x04, 0x41, 0xff, 0xbc, 0x30, 0x0a, 0x12, 0x1f, 0x46, 0x81, 0x5b, 0xd4, 0x94, + 0x7b, 0x3d, 0x07, 0x92, 0x76, 0x86, 0x21, 0x97, 0xb3, 0xe8, 0x38, 0xab, 0xe9, 0x75, 0x86, 0xb1, + 0xc5, 0x8f, 0xe7, 0x8e, 0x58, 0x76, 0xcf, 0x63, 0x59, 0x14, 0x99, 0xf8, 0xab, 0xb0, 0x93, 0xfa, + 0x1f, 0x73, 0x2e, 0x7f, 0x31, 0xf7, 0x43, 0xa7, 0xe7, 0x7f, 0x3c, 0x88, 0x83, 0xf4, 0x51, 0xf8, + 0xa1, 0x04, 0xd9, 0xba, 0x69, 0x39, 0xa3, 0xc2, 0x20, 0xe9, 0x9e, 0x69, 0x48, 0x02, 0xf5, 0xe8, + 0x39, 0x67, 0x7a, 0x7b, 0xa6, 0xf1, 0xe5, 0x8f, 0x21, 0x6e, 0xe2, 0x51, 0x98, 0xa3, 0x9c, 0xf8, + 0x97, 0x8a, 0xfc, 0x40, 0xa2, 0xfd, 0xd5, 0xbd, 0xa2, 0x88, 0x9c, 0x81, 0x99, 0xd0, 0x9e, 0xa5, + 0x07, 0x0a, 0x97, 0x86, 0xde, 0x10, 0xc6, 0x65, 0x91, 0xc7, 0xa5, 0xdf, 0x8c, 0xdb, 0xbf, 0x97, + 0x63, 0x54, 0x3d, 0x53, 0x92, 0x10, 0x8c, 0x31, 0x85, 0xa7, 0x8f, 0xc8, 0x83, 0x32, 0xe4, 0x99, + 0xcf, 0xd8, 0x48, 0x11, 0x48, 0xda, 0x32, 0x7c, 0x21, 0x88, 0xf9, 0x96, 0xc9, 0xa3, 0x6e, 0x19, + 0xf1, 0xe5, 0xa7, 0x8f, 0xc3, 0xbf, 0x33, 0x67, 0xc8, 0xe2, 0x9e, 0xa6, 0x77, 0xb4, 0xf3, 0x9d, + 0x04, 0xa1, 0x8f, 0x3f, 0x9a, 0xf0, 0xf8, 0x97, 0x5f, 0x55, 0xae, 0xbc, 0x08, 0x89, 0xff, 0x14, + 0x4c, 0x59, 0xfe, 0x92, 0xa4, 0x77, 0x3a, 0xbe, 0xc7, 0x11, 0x95, 0x7d, 0x57, 0x83, 0x9c, 0x89, + 0xce, 0x7a, 0x09, 0xf1, 0x33, 0x96, 0xb3, 0x29, 0xd3, 0xc5, 0x76, 0x7b, 0x09, 0x6b, 0xce, 0xae, + 0x85, 0xdb, 0x89, 0x86, 0x08, 0x5e, 0x44, 0x53, 0x61, 0x49, 0x70, 0xc1, 0x07, 0x57, 0x79, 0x74, + 0x9e, 0x30, 0xa0, 0x37, 0xf0, 0x78, 0x19, 0x49, 0x97, 0xf4, 0x16, 0x1f, 0x92, 0x1a, 0x07, 0xc9, + 0x93, 0x86, 0x63, 0x62, 0x0c, 0x17, 0xba, 0xcb, 0x30, 0x47, 0xed, 0x84, 0x51, 0x63, 0xf2, 0x07, + 0x09, 0x7d, 0x4c, 0x42, 0xd7, 0x36, 0x85, 0xd9, 0x19, 0x09, 0x2c, 0x49, 0x3c, 0x52, 0xc4, 0xf8, + 0x48, 0x1f, 0x99, 0xcf, 0xe5, 0x01, 0x42, 0x7e, 0x83, 0x1f, 0xcd, 0x07, 0x81, 0x00, 0xd1, 0xdb, + 0xd8, 0xfc, 0xa3, 0xce, 0x45, 0xa5, 0x0e, 0xf9, 0x04, 0xfa, 0x1b, 0x52, 0x7c, 0xa2, 0xd0, 0xa8, + 0xf2, 0xe7, 0x09, 0x6d, 0x5e, 0xe6, 0xb5, 0x37, 0x70, 0x70, 0x1f, 0xb2, 0x97, 0xfb, 0x58, 0x02, + 0xe3, 0x77, 0x10, 0x2b, 0xc9, 0x50, 0x5b, 0x1d, 0x62, 0x66, 0x7f, 0x0a, 0x8e, 0xab, 0xe5, 0xe2, + 0x62, 0xad, 0xba, 0x7a, 0x5f, 0xf8, 0x0e, 0x9f, 0x82, 0x1c, 0x9e, 0x9c, 0xa4, 0x02, 0xdb, 0x6b, + 0x13, 0xf6, 0x81, 0xbc, 0xac, 0x62, 0x6f, 0xa8, 0xff, 0x44, 0x82, 0x5e, 0x4d, 0x80, 0xec, 0x61, + 0xa2, 0xf0, 0x20, 0x84, 0x9a, 0xd1, 0x73, 0x64, 0x28, 0xb8, 0xe3, 0x21, 0xe5, 0x92, 0x5d, 0xd6, + 0x56, 0xe3, 0xdd, 0x0a, 0xbb, 0x74, 0xff, 0x29, 0x70, 0x2b, 0xf4, 0x12, 0x94, 0xeb, 0x61, 0xae, + 0xb5, 0x8d, 0x5b, 0x17, 0x2a, 0x86, 0xb7, 0xaf, 0x4e, 0x37, 0x61, 0x7b, 0x52, 0x79, 0x60, 0xee, + 0xe5, 0x81, 0xe1, 0x27, 0xd1, 0xdc, 0x20, 0x1d, 0x66, 0x2a, 0x02, 0x97, 0x3f, 0xf2, 0x71, 0xa9, + 0x72, 0xb8, 0xdc, 0x3e, 0x14, 0xd5, 0x64, 0xb0, 0x54, 0x87, 0x80, 0x05, 0xc1, 0xc9, 0xda, 0x7a, + 0xa3, 0x52, 0xab, 0x36, 0x37, 0xea, 0xe5, 0xc5, 0xe6, 0x82, 0x07, 0x4e, 0xbd, 0x20, 0xa3, 0x6f, + 0x49, 0x30, 0x41, 0xd9, 0xb2, 0xd1, 0xa3, 0x03, 0x08, 0x06, 0xfa, 0x53, 0xa2, 0xb7, 0x0a, 0x47, + 0x47, 0xf0, 0x05, 0xc1, 0xca, 0x89, 0xe8, 0xa7, 0x9e, 0x08, 0x13, 0x14, 0x64, 0x6f, 0x45, 0xeb, + 0x74, 0x44, 0x2f, 0xc5, 0xc8, 0xa8, 0x5e, 0x76, 0xc1, 0x48, 0x09, 0x03, 0xd8, 0x48, 0x7f, 0x64, + 0x79, 0x7a, 0x96, 0x9a, 0xc1, 0xe7, 0x74, 0x67, 0x9b, 0xb8, 0x5b, 0xa2, 0xa7, 0x88, 0x2c, 0x2f, + 0xde, 0x04, 0xb9, 0x3d, 0x37, 0xf7, 0x00, 0xd7, 0x55, 0x9a, 0x09, 0xbd, 0x4c, 0x38, 0x30, 0x27, + 0xa7, 0x9f, 0x3e, 0x4f, 0x11, 0xe0, 0xac, 0x41, 0xb6, 0xa3, 0xdb, 0x0e, 0x1b, 0x3f, 0x6e, 0x4b, + 0x44, 0xc8, 0x7b, 0xa8, 0x38, 0x78, 0x47, 0x25, 0x64, 0xd0, 0x3d, 0x30, 0x13, 0x4e, 0x15, 0x70, + 0xdf, 0x3d, 0x05, 0x13, 0xec, 0x58, 0x19, 0x5b, 0x62, 0xf5, 0x5e, 0x05, 0x97, 0x35, 0x85, 0x6a, + 0x9b, 0xbe, 0x0e, 0xfc, 0xdf, 0x47, 0x61, 0x62, 0x45, 0xb7, 0x1d, 0xd3, 0xba, 0x84, 0x1e, 0xca, + 0xc0, 0xc4, 0x59, 0x6c, 0xd9, 0xba, 0x69, 0xec, 0x73, 0x35, 0xb8, 0x06, 0xa6, 0xbb, 0x16, 0xde, + 0xd3, 0xcd, 0x5d, 0x3b, 0x58, 0x9c, 0x09, 0x27, 0x29, 0x08, 0x26, 0xb5, 0x5d, 0x67, 0xdb, 0xb4, + 0x82, 0x68, 0x14, 0xde, 0xbb, 0x72, 0x1a, 0x80, 0x3e, 0x57, 0xb5, 0x1d, 0xcc, 0x1c, 0x28, 0x42, + 0x29, 0x8a, 0x02, 0x59, 0x47, 0xdf, 0xc1, 0x2c, 0x3c, 0x2d, 0x79, 0x76, 0x05, 0x4c, 0x42, 0xbd, + 0xb1, 0x90, 0x7a, 0xb2, 0xea, 0xbd, 0xa2, 0x2f, 0xca, 0x30, 0xbd, 0x8c, 0x1d, 0xc6, 0xaa, 0x8d, + 0x9e, 0x9f, 0x11, 0xba, 0x11, 0xc2, 0x1d, 0x63, 0x3b, 0x9a, 0xed, 0xfd, 0xe7, 0x2f, 0xc1, 0xf2, + 0x89, 0x41, 0xac, 0x5c, 0x39, 0x1c, 0x28, 0x9b, 0x04, 0x4e, 0x73, 0x2a, 0xd4, 0x2f, 0x93, 0x65, + 0x66, 0x9b, 0x20, 0xfb, 0x3f, 0xa0, 0x77, 0x49, 0xa2, 0x87, 0x8e, 0x99, 0xec, 0xe7, 0x43, 0xf5, + 0x89, 0xec, 0x8e, 0x26, 0xf7, 0x58, 0x8e, 0x7d, 0x31, 0xd0, 0xc3, 0x94, 0x18, 0x19, 0xd5, 0xcf, + 0x2d, 0x78, 0x5c, 0x79, 0x30, 0x27, 0xe9, 0x6b, 0xe3, 0xf7, 0x64, 0x98, 0xae, 0x6f, 0x9b, 0x17, + 0x3d, 0x39, 0xfe, 0x9c, 0x18, 0xb0, 0x57, 0xc1, 0xd4, 0x5e, 0x0f, 0xa8, 0x41, 0x42, 0xf4, 0x1d, + 0xed, 0xe8, 0xd9, 0x72, 0x52, 0x98, 0x42, 0xcc, 0x8d, 0xfc, 0x06, 0x75, 0xe5, 0x09, 0x30, 0xc1, + 0xb8, 0x66, 0x4b, 0x2e, 0xf1, 0x00, 0x7b, 0x99, 0xc3, 0x15, 0xcc, 0xf2, 0x15, 0x4c, 0x86, 0x7c, + 0x74, 0xe5, 0xd2, 0x47, 0xfe, 0x4f, 0x24, 0x12, 0xac, 0xc2, 0x03, 0xbe, 0x34, 0x02, 0xe0, 0xd1, + 0xf7, 0x33, 0xa2, 0x0b, 0x93, 0xbe, 0x04, 0x7c, 0x0e, 0x0e, 0x74, 0xdb, 0xcb, 0x40, 0x72, 0xe9, + 0xcb, 0xf3, 0xa5, 0x59, 0x98, 0x59, 0xd4, 0x37, 0x37, 0xfd, 0x4e, 0xf2, 0x05, 0x82, 0x9d, 0x64, + 0xb4, 0x3b, 0x80, 0x6b, 0xe7, 0xee, 0x5a, 0x16, 0x36, 0xbc, 0x4a, 0xb1, 0xe6, 0xd4, 0x93, 0xaa, + 0xdc, 0x00, 0x47, 0xbd, 0x71, 0x21, 0xdc, 0x51, 0x4e, 0xa9, 0xbd, 0xc9, 0xe8, 0xbb, 0xc2, 0xbb, + 0x5a, 0x9e, 0x44, 0xc3, 0x55, 0x8a, 0x68, 0x80, 0x77, 0xc0, 0xec, 0x36, 0xcd, 0x4d, 0xa6, 0xfe, + 0x5e, 0x67, 0x79, 0xb2, 0x27, 0x18, 0xf0, 0x1a, 0xb6, 0x6d, 0x6d, 0x0b, 0xab, 0x7c, 0xe6, 0x9e, + 0xe6, 0x2b, 0x27, 0xb9, 0xda, 0x4a, 0x6c, 0x83, 0x4c, 0xa0, 0x26, 0x63, 0xd0, 0x8e, 0x33, 0x90, + 0x5d, 0xd2, 0x3b, 0x18, 0xfd, 0xb2, 0x04, 0x53, 0x2a, 0x6e, 0x99, 0x46, 0xcb, 0x7d, 0x0b, 0x39, + 0x07, 0xfd, 0x63, 0x46, 0xf4, 0x4a, 0x47, 0x97, 0xce, 0xbc, 0x4f, 0x23, 0xa2, 0xdd, 0x88, 0x5d, + 0xdd, 0x18, 0x4b, 0x6a, 0x0c, 0x17, 0x70, 0xb8, 0x53, 0x8f, 0xcd, 0xcd, 0x8e, 0xa9, 0x71, 0x8b, + 0x5f, 0xbd, 0xa6, 0xd0, 0x8d, 0x50, 0xf0, 0xce, 0x80, 0x98, 0xce, 0xba, 0x6e, 0x18, 0xfe, 0x21, + 0xe3, 0x7d, 0xe9, 0xfc, 0xbe, 0x6d, 0x6c, 0x9c, 0x16, 0x52, 0x77, 0x56, 0x7a, 0x84, 0x66, 0x5f, + 0x0f, 0x73, 0xe7, 0x2f, 0x39, 0xd8, 0x66, 0xb9, 0x58, 0xb1, 0x59, 0xb5, 0x27, 0x35, 0x14, 0x65, + 0x39, 0x2e, 0x9e, 0x4b, 0x4c, 0x81, 0xc9, 0x44, 0xbd, 0x32, 0xc4, 0x0c, 0xf0, 0x38, 0x14, 0xaa, + 0xb5, 0xc5, 0x32, 0xf1, 0x55, 0xf3, 0xbc, 0x7f, 0xb6, 0xd0, 0x0b, 0x65, 0x98, 0x21, 0xce, 0x24, + 0x1e, 0x0a, 0xd7, 0x0a, 0xcc, 0x47, 0xd0, 0x57, 0x84, 0xfd, 0xd8, 0x48, 0x95, 0xc3, 0x05, 0x44, + 0x0b, 0x7a, 0x53, 0xef, 0xf4, 0x0a, 0x3a, 0xa7, 0xf6, 0xa4, 0xf6, 0x01, 0x44, 0xee, 0x0b, 0xc8, + 0xef, 0x09, 0x39, 0xb3, 0x0d, 0xe2, 0xee, 0xb0, 0x50, 0xf9, 0x7d, 0x19, 0xa6, 0xdd, 0x49, 0x8a, + 0x07, 0x4a, 0x8d, 0x03, 0xc5, 0x34, 0x3a, 0x97, 0x82, 0x65, 0x11, 0xef, 0x35, 0x51, 0x23, 0xf9, + 0x4b, 0xe1, 0x99, 0x3b, 0x11, 0x51, 0x88, 0x97, 0x31, 0xe1, 0xf7, 0x3e, 0xa1, 0xf9, 0xfc, 0x00, + 0xe6, 0x0e, 0x0b, 0xbe, 0x6f, 0xe4, 0x20, 0xbf, 0xd1, 0x25, 0xc8, 0xbd, 0x4c, 0x16, 0x89, 0x58, + 0xbe, 0xef, 0x20, 0x83, 0x6b, 0x66, 0x75, 0xcc, 0x96, 0xd6, 0x59, 0x0f, 0x4e, 0x84, 0x05, 0x09, + 0xca, 0xed, 0xcc, 0xb7, 0x91, 0x1e, 0xb7, 0xbb, 0x3e, 0x36, 0x98, 0x37, 0x91, 0x51, 0xe8, 0xd0, + 0xc8, 0x4d, 0x70, 0xac, 0xad, 0xdb, 0xda, 0xf9, 0x0e, 0x2e, 0x1b, 0x2d, 0xeb, 0x12, 0x15, 0x07, + 0x9b, 0x56, 0xed, 0xfb, 0xa0, 0xdc, 0x09, 0x39, 0xdb, 0xb9, 0xd4, 0xa1, 0xf3, 0xc4, 0xf0, 0x19, + 0x93, 0xc8, 0xa2, 0xea, 0x6e, 0x76, 0x95, 0xfe, 0x15, 0x76, 0x51, 0x9a, 0x10, 0xbc, 0xcf, 0xf9, + 0x71, 0x90, 0x37, 0x2d, 0x7d, 0x4b, 0xa7, 0xf7, 0xf3, 0xcc, 0xed, 0x8b, 0x59, 0x47, 0x4d, 0x81, + 0x1a, 0xc9, 0xa2, 0xb2, 0xac, 0xca, 0x13, 0x60, 0x4a, 0xdf, 0xd1, 0xb6, 0xf0, 0xbd, 0xba, 0x41, + 0x4f, 0xf4, 0xcd, 0xdd, 0x7a, 0x6a, 0xdf, 0xf1, 0x19, 0xf6, 0x5d, 0x0d, 0xb2, 0xa2, 0xf7, 0x49, + 0xa2, 0x81, 0x75, 0x48, 0xdd, 0x28, 0xa8, 0x63, 0xb9, 0xd7, 0x1a, 0xbd, 0x52, 0x28, 0xe4, 0x4d, + 0x34, 0x5b, 0xe9, 0x0f, 0xde, 0x9f, 0x97, 0x60, 0x72, 0xd1, 0xbc, 0x68, 0x10, 0x45, 0xbf, 0x4d, + 0xcc, 0xd6, 0xed, 0x73, 0xc8, 0x91, 0xbf, 0x36, 0x32, 0xf6, 0x44, 0x03, 0xa9, 0xad, 0x57, 0x64, + 0x04, 0x0c, 0xb1, 0x2d, 0x47, 0xf0, 0x32, 0xbf, 0xb8, 0x72, 0xd2, 0x97, 0xeb, 0x9f, 0xca, 0x90, + 0x5d, 0xb4, 0xcc, 0x2e, 0x7a, 0x4b, 0x26, 0x81, 0xcb, 0x42, 0xdb, 0x32, 0xbb, 0x0d, 0x72, 0x1b, + 0x57, 0x70, 0x8c, 0x23, 0x9c, 0xa6, 0xdc, 0x06, 0x93, 0x5d, 0xd3, 0xd6, 0x1d, 0x6f, 0x1a, 0x31, + 0x77, 0xeb, 0x23, 0xfa, 0xb6, 0xe6, 0x75, 0x96, 0x49, 0xf5, 0xb3, 0xbb, 0xbd, 0x36, 0x11, 0xa1, + 0x2b, 0x17, 0x57, 0x8c, 0xde, 0x8d, 0x64, 0x3d, 0xa9, 0xe8, 0x45, 0x61, 0x24, 0x9f, 0xc4, 0x23, + 0xf9, 0xc8, 0x3e, 0x12, 0xb6, 0xcc, 0xee, 0x48, 0x36, 0x19, 0x5f, 0xee, 0xa3, 0xfa, 0x64, 0x0e, + 0xd5, 0x1b, 0x85, 0xca, 0x4c, 0x1f, 0xd1, 0xf7, 0x65, 0x01, 0x88, 0x99, 0xb1, 0xe1, 0x4e, 0x80, + 0xc4, 0x6c, 0xac, 0x67, 0x66, 0x43, 0xb2, 0x2c, 0xf2, 0xb2, 0x7c, 0x74, 0x84, 0x15, 0x43, 0xc8, + 0x47, 0x48, 0xb4, 0x08, 0xb9, 0x5d, 0xf7, 0x33, 0x93, 0xa8, 0x20, 0x09, 0xf2, 0xaa, 0xd2, 0x3f, + 0xd1, 0x9f, 0x64, 0x20, 0x47, 0x12, 0x94, 0xd3, 0x00, 0x64, 0x60, 0xa7, 0x07, 0x82, 0x32, 0x64, + 0x08, 0x0f, 0xa5, 0x10, 0x6d, 0xd5, 0xdb, 0xec, 0x33, 0x35, 0x99, 0x83, 0x04, 0xf7, 0x6f, 0x32, + 0xdc, 0x13, 0x5a, 0xcc, 0x00, 0x08, 0xa5, 0xb8, 0x7f, 0x93, 0xb7, 0x55, 0xbc, 0x49, 0x03, 0x25, + 0x67, 0xd5, 0x20, 0xc1, 0xff, 0x7b, 0xd5, 0xbf, 0x5e, 0xcb, 0xfb, 0x9b, 0xa4, 0xb8, 0x93, 0x61, + 0xa2, 0x96, 0x0b, 0x41, 0x11, 0x79, 0x92, 0xa9, 0x37, 0x19, 0xbd, 0xd6, 0x57, 0x9b, 0x45, 0x4e, + 0x6d, 0x6e, 0x49, 0x20, 0xde, 0xf4, 0x95, 0xe7, 0x6b, 0x39, 0x98, 0xaa, 0x9a, 0x6d, 0xa6, 0x3b, + 0xa1, 0x09, 0xe3, 0x27, 0x72, 0x89, 0x26, 0x8c, 0x3e, 0x8d, 0x08, 0x05, 0xb9, 0x9b, 0x57, 0x10, + 0x31, 0x0a, 0x61, 0xfd, 0x50, 0x16, 0x20, 0x4f, 0xb4, 0x77, 0xff, 0xbd, 0x4d, 0x71, 0x24, 0x88, + 0x68, 0x55, 0xf6, 0xe7, 0x7f, 0x38, 0x1d, 0xfb, 0xaf, 0x90, 0x23, 0x15, 0x8c, 0xd9, 0xdd, 0xe1, + 0x2b, 0x2a, 0xc5, 0x57, 0x54, 0x8e, 0xaf, 0x68, 0xb6, 0xb7, 0xa2, 0x49, 0xd6, 0x01, 0xa2, 0x34, + 0x24, 0x7d, 0x1d, 0xff, 0x87, 0x09, 0x80, 0xaa, 0xb6, 0xa7, 0x6f, 0xd1, 0xdd, 0xe1, 0x2f, 0x7a, + 0xf3, 0x1f, 0xb6, 0x8f, 0xfb, 0xdf, 0x42, 0x03, 0xe1, 0x6d, 0x30, 0xc1, 0xc6, 0x3d, 0x56, 0x91, + 0xab, 0xb9, 0x8a, 0x04, 0x54, 0xa8, 0x59, 0xfa, 0x80, 0xa3, 0x7a, 0xf9, 0xb9, 0x2b, 0x66, 0xa5, + 0x9e, 0x2b, 0x66, 0xfb, 0xef, 0x41, 0x44, 0x5c, 0x3c, 0x8b, 0xde, 0x2d, 0xec, 0xd1, 0x1f, 0xe2, + 0x27, 0x54, 0xa3, 0x88, 0x26, 0xf8, 0x38, 0x98, 0x30, 0xfd, 0x0d, 0x6d, 0x39, 0x72, 0x1d, 0xac, + 0x62, 0x6c, 0x9a, 0xaa, 0x97, 0x53, 0x70, 0xf3, 0x4b, 0x88, 0x8f, 0xb1, 0x1c, 0x9a, 0x39, 0xb9, + 0xec, 0x05, 0x9d, 0x72, 0xeb, 0x71, 0x4e, 0x77, 0xb6, 0x57, 0x75, 0xe3, 0x82, 0x8d, 0xfe, 0xb3, + 0x98, 0x05, 0x19, 0xc2, 0x5f, 0x4a, 0x86, 0x3f, 0x1f, 0xb3, 0xa3, 0xce, 0xa3, 0x76, 0x67, 0x14, + 0x95, 0xfe, 0xdc, 0x46, 0x00, 0x78, 0x3b, 0xe4, 0x29, 0xa3, 0xac, 0x13, 0x3d, 0x13, 0x89, 0x9f, + 0x4f, 0x49, 0x65, 0x7f, 0xa0, 0x77, 0xf9, 0x38, 0x9e, 0xe5, 0x70, 0x5c, 0x38, 0x10, 0x67, 0xa9, + 0x43, 0x7a, 0xe6, 0xb1, 0x30, 0xc1, 0x24, 0xad, 0xcc, 0x85, 0x5b, 0x71, 0xe1, 0x88, 0x02, 0x90, + 0x5f, 0x33, 0xf7, 0x70, 0xc3, 0x2c, 0x64, 0xdc, 0x67, 0x97, 0xbf, 0x86, 0x59, 0x90, 0xd0, 0x2b, + 0x26, 0x61, 0xd2, 0x8f, 0xf6, 0xf3, 0x79, 0x09, 0x0a, 0x25, 0x0b, 0x6b, 0x0e, 0x5e, 0xb2, 0xcc, + 0x1d, 0x5a, 0x23, 0x71, 0xef, 0xd0, 0xdf, 0x14, 0x76, 0xf1, 0xf0, 0xa3, 0xf0, 0xf4, 0x16, 0x16, + 0x81, 0x25, 0x5d, 0x84, 0x94, 0xbc, 0x45, 0x48, 0xf4, 0x66, 0x21, 0x97, 0x0f, 0xd1, 0x52, 0xd2, + 0x6f, 0x6a, 0x9f, 0x96, 0x20, 0x57, 0xea, 0x98, 0x06, 0x0e, 0x1f, 0x61, 0x1a, 0x78, 0x56, 0xa6, + 0xff, 0x4e, 0x04, 0x7a, 0xba, 0x24, 0x6a, 0x6b, 0x04, 0x02, 0x70, 0xcb, 0x16, 0x94, 0xad, 0xd8, + 0x20, 0x15, 0x4b, 0x3a, 0x7d, 0x81, 0x7e, 0x4b, 0x82, 0x29, 0x1a, 0x17, 0xa7, 0xd8, 0xe9, 0xa0, + 0x47, 0x04, 0x42, 0xed, 0x13, 0x31, 0x09, 0xfd, 0x9e, 0xb0, 0x8b, 0xbe, 0x5f, 0x2b, 0x9f, 0x76, + 0x82, 0x00, 0x41, 0xc9, 0x3c, 0xc6, 0xc5, 0xf6, 0xd2, 0x06, 0x32, 0x94, 0xbe, 0xa8, 0xbf, 0x20, + 0xb9, 0x06, 0x80, 0x71, 0x61, 0xdd, 0xc2, 0x7b, 0x3a, 0xbe, 0x88, 0xae, 0x0c, 0x84, 0xbd, 0x3f, + 0xe8, 0xc7, 0x1b, 0x85, 0x17, 0x71, 0x42, 0x24, 0x23, 0xb7, 0xb2, 0xa6, 0x3b, 0x41, 0x26, 0xd6, + 0x8b, 0xf7, 0x46, 0x62, 0x09, 0x91, 0x51, 0xc3, 0xd9, 0x05, 0xd7, 0x6c, 0xa2, 0xb9, 0x48, 0x5f, + 0xb0, 0x1f, 0x9c, 0x80, 0xc9, 0x0d, 0xc3, 0xee, 0x76, 0x34, 0x7b, 0x1b, 0xfd, 0x40, 0x86, 0x3c, + 0xbd, 0x2d, 0x0c, 0xfd, 0x14, 0x17, 0x5b, 0xe0, 0xe7, 0x77, 0xb1, 0xe5, 0xb9, 0xe0, 0xd0, 0x97, + 0xfe, 0x97, 0x99, 0xa3, 0xf7, 0xc9, 0xa2, 0x93, 0x54, 0xaf, 0xd0, 0xd0, 0xb5, 0xf1, 0xfd, 0x8f, + 0xb3, 0x77, 0xf5, 0x96, 0xb3, 0x6b, 0xf9, 0x57, 0x63, 0x3f, 0x46, 0x8c, 0xca, 0x3a, 0xfd, 0x4b, + 0xf5, 0x7f, 0x47, 0x1a, 0x4c, 0xb0, 0xc4, 0x7d, 0xdb, 0x49, 0xfb, 0xcf, 0xdf, 0x9e, 0x84, 0xbc, + 0x66, 0x39, 0xba, 0xed, 0xb0, 0x0d, 0x56, 0xf6, 0xe6, 0x76, 0x97, 0xf4, 0x69, 0xc3, 0xea, 0x78, + 0x51, 0x48, 0xfc, 0x04, 0xf4, 0xfb, 0x42, 0xf3, 0xc7, 0xf8, 0x9a, 0x27, 0x83, 0xfc, 0xde, 0x21, + 0xd6, 0xa8, 0x2f, 0x87, 0xcb, 0xd4, 0x62, 0xa3, 0xdc, 0xa4, 0x41, 0x2b, 0xfc, 0xf8, 0x14, 0x6d, + 0xf4, 0x4e, 0x39, 0xb4, 0x7e, 0x77, 0x89, 0x1b, 0x23, 0x98, 0x14, 0x83, 0x31, 0xc2, 0x4f, 0x88, + 0xd9, 0xad, 0xe6, 0x16, 0x61, 0x65, 0xf1, 0x45, 0xd8, 0xdf, 0x11, 0xde, 0x4d, 0xf2, 0x45, 0x39, + 0x60, 0x0d, 0x30, 0xee, 0x36, 0xa1, 0xf7, 0x0b, 0xed, 0x0c, 0x0d, 0x2a, 0xe9, 0x10, 0x61, 0x7b, + 0xc3, 0x04, 0x4c, 0x2c, 0x6b, 0x9d, 0x0e, 0xb6, 0x2e, 0xb9, 0x43, 0x52, 0xc1, 0xe3, 0x70, 0x4d, + 0x33, 0xf4, 0x4d, 0x6c, 0x3b, 0xf1, 0x9d, 0xe5, 0xbb, 0x85, 0x23, 0xd5, 0xb2, 0x32, 0xe6, 0x7b, + 0xe9, 0x47, 0xc8, 0xfc, 0x66, 0xc8, 0xea, 0xc6, 0xa6, 0xc9, 0xba, 0xcc, 0xde, 0x55, 0x7b, 0xef, + 0x67, 0x32, 0x75, 0x21, 0x19, 0x05, 0x83, 0xd5, 0x0a, 0x72, 0x91, 0x7e, 0xcf, 0xf9, 0xbb, 0x59, + 0x98, 0xf5, 0x98, 0xa8, 0x18, 0x6d, 0xfc, 0x40, 0x78, 0x29, 0xe6, 0x85, 0x59, 0xd1, 0xe3, 0x60, + 0xbd, 0xf5, 0x21, 0xa4, 0x22, 0x44, 0xda, 0x00, 0x68, 0x69, 0x0e, 0xde, 0x32, 0x2d, 0xdd, 0xef, + 0x0f, 0x1f, 0x9f, 0x84, 0x5a, 0x89, 0xfe, 0x7d, 0x49, 0x0d, 0xd1, 0x51, 0xee, 0x84, 0x69, 0xec, + 0x9f, 0xbf, 0xf7, 0x96, 0x6a, 0x62, 0xf1, 0x0a, 0xe7, 0x47, 0x5f, 0x10, 0x3a, 0x75, 0x26, 0x52, + 0xcd, 0x64, 0x98, 0x35, 0x87, 0x6b, 0x43, 0x1b, 0xd5, 0xb5, 0xa2, 0x5a, 0x5f, 0x29, 0xae, 0xae, + 0x56, 0xaa, 0xcb, 0x7e, 0xe0, 0x17, 0x05, 0xe6, 0x16, 0x6b, 0xe7, 0xaa, 0xa1, 0xc8, 0x3c, 0x59, + 0xb4, 0x0e, 0x93, 0x9e, 0xbc, 0xfa, 0xf9, 0x62, 0x86, 0x65, 0xc6, 0x7c, 0x31, 0x43, 0x49, 0xae, + 0x71, 0xa6, 0xb7, 0x7c, 0x07, 0x1d, 0xf2, 0x8c, 0xfe, 0x58, 0x83, 0x1c, 0x59, 0x53, 0x47, 0x6f, + 0x27, 0xdb, 0x80, 0xdd, 0x8e, 0xd6, 0xc2, 0x68, 0x27, 0x81, 0x35, 0xee, 0x5d, 0x9d, 0x20, 0xed, + 0xbb, 0x3a, 0x81, 0x3c, 0x32, 0xab, 0xef, 0x78, 0xbf, 0x75, 0x7c, 0x95, 0x66, 0xe1, 0x0f, 0x68, + 0xc5, 0xee, 0xae, 0xd0, 0xe5, 0x7f, 0xc6, 0x66, 0x84, 0x4a, 0x46, 0xf3, 0x94, 0xcc, 0x12, 0x15, + 0xdb, 0x87, 0x89, 0xe3, 0x68, 0x0c, 0xd7, 0x7b, 0x67, 0x21, 0x57, 0xef, 0x76, 0x74, 0x07, 0xbd, + 0x44, 0x1a, 0x09, 0x66, 0xf4, 0xba, 0x0b, 0x79, 0xe0, 0x75, 0x17, 0xc1, 0xae, 0x6b, 0x56, 0x60, + 0xd7, 0xb5, 0x81, 0x1f, 0x70, 0xf8, 0x5d, 0xd7, 0xdb, 0x58, 0xf0, 0x36, 0xba, 0x67, 0xfb, 0xc8, + 0x3e, 0x22, 0x25, 0xd5, 0xea, 0x13, 0x15, 0xf0, 0xcc, 0x63, 0x59, 0x70, 0x32, 0x80, 0xfc, 0x42, + 0xad, 0xd1, 0xa8, 0xad, 0x15, 0x8e, 0x90, 0xa8, 0x36, 0xb5, 0x75, 0x1a, 0x2a, 0xa6, 0x52, 0xad, + 0x96, 0xd5, 0x82, 0x44, 0xc2, 0xa5, 0x55, 0x1a, 0xab, 0xe5, 0x82, 0xcc, 0xc7, 0x3e, 0x8f, 0x35, + 0xbf, 0xf9, 0xb2, 0xd3, 0x54, 0x2f, 0x31, 0x43, 0x3c, 0x9a, 0x9f, 0xf4, 0x95, 0xeb, 0x37, 0x64, + 0xc8, 0xad, 0x61, 0x6b, 0x0b, 0xa3, 0x9f, 0x4f, 0xb0, 0xc9, 0xb7, 0xa9, 0x5b, 0x36, 0x0d, 0x2e, + 0x17, 0x6c, 0xf2, 0x85, 0xd3, 0x94, 0xeb, 0x60, 0xd6, 0xc6, 0x2d, 0xd3, 0x68, 0x7b, 0x99, 0x68, + 0x7f, 0xc4, 0x27, 0xf2, 0xf7, 0xce, 0x0b, 0x40, 0x46, 0x18, 0x1d, 0xc9, 0x4e, 0x5d, 0x12, 0x60, + 0xfa, 0x95, 0x9a, 0x3e, 0x30, 0xdf, 0x95, 0xdd, 0x9f, 0xba, 0x97, 0xd0, 0x8b, 0x85, 0x77, 0x5f, + 0x6f, 0x82, 0x3c, 0x51, 0x53, 0x6f, 0x8c, 0xee, 0xdf, 0x1f, 0xb3, 0x3c, 0xca, 0x02, 0x1c, 0xb3, + 0x71, 0x07, 0xb7, 0x1c, 0xdc, 0x76, 0x9b, 0xae, 0x3a, 0xb0, 0x53, 0xd8, 0x9f, 0x1d, 0xfd, 0x59, + 0x18, 0xc0, 0x3b, 0x78, 0x00, 0xaf, 0xef, 0x23, 0x4a, 0xb7, 0x42, 0xd1, 0xb6, 0xb2, 0x5b, 0x8d, + 0x7a, 0xc7, 0xf4, 0x17, 0xc5, 0xbd, 0x77, 0xf7, 0xdb, 0xb6, 0xb3, 0xd3, 0x21, 0xdf, 0xd8, 0x01, + 0x03, 0xef, 0x5d, 0x99, 0x87, 0x09, 0xcd, 0xb8, 0x44, 0x3e, 0x65, 0x63, 0x6a, 0xed, 0x65, 0x42, + 0xaf, 0xf0, 0x91, 0xbf, 0x8b, 0x43, 0xfe, 0xd1, 0x62, 0xec, 0xa6, 0x0f, 0xfc, 0x2f, 0x4d, 0x40, + 0x6e, 0x5d, 0xb3, 0x1d, 0x8c, 0xfe, 0x2f, 0x59, 0x14, 0xf9, 0xeb, 0x61, 0x6e, 0xd3, 0x6c, 0xed, + 0xda, 0xb8, 0xcd, 0x37, 0xca, 0x9e, 0xd4, 0x51, 0x60, 0xae, 0xdc, 0x08, 0x05, 0x2f, 0x91, 0x91, + 0xf5, 0xb6, 0xe1, 0xf7, 0xa5, 0x93, 0x48, 0xda, 0xf6, 0xba, 0x66, 0x39, 0xb5, 0x4d, 0x92, 0xe6, + 0x47, 0xd2, 0x0e, 0x27, 0x72, 0xd0, 0xe7, 0x63, 0xa0, 0x9f, 0x88, 0x86, 0x7e, 0x52, 0x00, 0x7a, + 0xa5, 0x08, 0x93, 0x9b, 0x7a, 0x07, 0x93, 0x1f, 0xa6, 0xc8, 0x0f, 0xfd, 0xc6, 0x24, 0x22, 0x7b, + 0x7f, 0x4c, 0x5a, 0xd2, 0x3b, 0x58, 0xf5, 0x7f, 0xf3, 0x26, 0x32, 0x10, 0x4c, 0x64, 0x56, 0xa9, + 0x3f, 0xad, 0x6b, 0x78, 0x19, 0xda, 0x0e, 0xf6, 0x16, 0xdf, 0x0c, 0x76, 0xb8, 0xa5, 0xad, 0x39, + 0x1a, 0x01, 0x63, 0x46, 0x25, 0xcf, 0xbc, 0x5f, 0x88, 0xdc, 0xeb, 0x17, 0xf2, 0x2c, 0x39, 0x59, + 0x8f, 0xe8, 0x31, 0x1b, 0xd1, 0xa2, 0xce, 0x7b, 0x00, 0x51, 0x4b, 0xd1, 0x7f, 0x77, 0x81, 0x69, + 0x69, 0x16, 0x76, 0xd6, 0xc3, 0x9e, 0x18, 0x39, 0x95, 0x4f, 0x24, 0xae, 0x7c, 0x76, 0x5d, 0xdb, + 0xc1, 0xa4, 0xb0, 0x92, 0xfb, 0x8d, 0xb9, 0x68, 0xed, 0x4b, 0x0f, 0xfa, 0xdf, 0xdc, 0xa8, 0xfb, + 0xdf, 0x7e, 0x75, 0x4c, 0xbf, 0x19, 0xbe, 0x3a, 0x0b, 0x72, 0x69, 0xd7, 0x79, 0x58, 0x77, 0xbf, + 0x3f, 0x14, 0xf6, 0x73, 0x61, 0xfd, 0x59, 0xe4, 0x45, 0xf3, 0x63, 0xea, 0x7d, 0x13, 0x6a, 0x89, + 0x98, 0x3f, 0x4d, 0x54, 0xdd, 0xc6, 0x70, 0xaf, 0x81, 0xec, 0x3b, 0x58, 0x3e, 0x98, 0x39, 0xb8, + 0x69, 0x8e, 0x68, 0xff, 0x14, 0xea, 0x19, 0xfc, 0x77, 0xaf, 0xe3, 0xc9, 0x72, 0xb1, 0xfa, 0xc8, + 0xf6, 0x3a, 0x11, 0xe5, 0x8c, 0x4a, 0x5f, 0xd0, 0x4b, 0x85, 0xdd, 0xce, 0xa9, 0xd8, 0x62, 0x5d, + 0x09, 0x93, 0xd9, 0x54, 0x62, 0x97, 0x89, 0xc6, 0x14, 0x9b, 0x3e, 0x60, 0xdf, 0x09, 0xbb, 0x0a, + 0x16, 0x0f, 0x8c, 0x18, 0x7a, 0xa5, 0xf0, 0x76, 0x14, 0xad, 0xf6, 0x80, 0xf5, 0xc2, 0x64, 0xf2, + 0x16, 0xdb, 0xac, 0x8a, 0x2d, 0x38, 0x7d, 0x89, 0x7f, 0x5b, 0x86, 0x3c, 0xdd, 0x82, 0x44, 0x6f, + 0xca, 0x24, 0xb8, 0x85, 0xdd, 0xe1, 0x5d, 0x08, 0xfd, 0xf7, 0x24, 0x6b, 0x0e, 0x9c, 0xab, 0x61, + 0x36, 0x91, 0xab, 0x21, 0x7f, 0x8e, 0x53, 0xa0, 0x1d, 0xd1, 0x3a, 0xa6, 0x3c, 0x9d, 0x4c, 0xd2, + 0xc2, 0xfa, 0x32, 0x94, 0x3e, 0xde, 0xcf, 0xc9, 0xc1, 0x0c, 0x2d, 0xfa, 0x9c, 0xde, 0xde, 0xc2, + 0x0e, 0x7a, 0xa7, 0xf4, 0xa3, 0x83, 0xba, 0x52, 0x85, 0x99, 0x8b, 0x84, 0xed, 0x55, 0xed, 0x92, + 0xb9, 0xeb, 0xb0, 0x95, 0x8b, 0x1b, 0x63, 0xd7, 0x3d, 0x68, 0x3d, 0xe7, 0xe9, 0x1f, 0x2a, 0xf7, + 0xbf, 0x2b, 0x63, 0xba, 0xe0, 0x4f, 0x1d, 0xb8, 0xf2, 0xc4, 0xc8, 0x0a, 0x27, 0x29, 0x27, 0x21, + 0xbf, 0xa7, 0xe3, 0x8b, 0x95, 0x36, 0xb3, 0x6e, 0xd9, 0x1b, 0xfa, 0x90, 0xf0, 0xbe, 0x6d, 0x18, + 0x6e, 0xc6, 0x4b, 0xba, 0x5a, 0x28, 0xb6, 0x7b, 0x3b, 0x90, 0xad, 0x31, 0x9c, 0x29, 0xe6, 0x2f, + 0xeb, 0x2c, 0x25, 0x50, 0xc4, 0x28, 0xc3, 0x99, 0x0f, 0xe5, 0x11, 0x7b, 0x62, 0x85, 0x0a, 0x60, + 0xc4, 0xf7, 0x78, 0x8a, 0xc5, 0x97, 0x18, 0x50, 0x74, 0xfa, 0x92, 0x7f, 0xad, 0x0c, 0x53, 0x75, + 0xec, 0x2c, 0xe9, 0xb8, 0xd3, 0xb6, 0x91, 0x75, 0x70, 0xd3, 0xe8, 0x66, 0xc8, 0x6f, 0x12, 0x62, + 0x83, 0xce, 0x2d, 0xb0, 0x6c, 0xe8, 0xd5, 0x92, 0xe8, 0x8e, 0x30, 0x5b, 0x7d, 0xf3, 0xb8, 0x1d, + 0x09, 0x4c, 0x62, 0x1e, 0xbd, 0xf1, 0x25, 0x8f, 0x21, 0xb0, 0xad, 0x0c, 0x33, 0xec, 0x76, 0xbf, + 0x62, 0x47, 0xdf, 0x32, 0xd0, 0xee, 0x08, 0x5a, 0x88, 0x72, 0x0b, 0xe4, 0x34, 0x97, 0x1a, 0xdb, + 0x7a, 0x45, 0x7d, 0x3b, 0x4f, 0x52, 0x9e, 0x4a, 0x33, 0x26, 0x08, 0x23, 0x19, 0x28, 0xb6, 0xc7, + 0xf3, 0x18, 0xc3, 0x48, 0x0e, 0x2c, 0x3c, 0x7d, 0xc4, 0xbe, 0x2a, 0xc3, 0x71, 0xc6, 0xc0, 0x59, + 0x6c, 0x39, 0x7a, 0x4b, 0xeb, 0x50, 0xe4, 0x9e, 0x97, 0x19, 0x05, 0x74, 0x2b, 0x30, 0xbb, 0x17, + 0x26, 0xcb, 0x20, 0x3c, 0xd3, 0x17, 0x42, 0x8e, 0x01, 0x95, 0xff, 0x31, 0x41, 0x38, 0x3e, 0x4e, + 0xaa, 0x1c, 0xcd, 0x31, 0x86, 0xe3, 0x13, 0x66, 0x22, 0x7d, 0x88, 0x5f, 0xc4, 0x42, 0xf3, 0x04, + 0xdd, 0xe7, 0x17, 0x85, 0xb1, 0xdd, 0x80, 0x69, 0x82, 0x25, 0xfd, 0x91, 0x2d, 0x43, 0xc4, 0x28, + 0xb1, 0xdf, 0xef, 0xb0, 0x0b, 0xc3, 0xfc, 0x7f, 0xd5, 0x30, 0x1d, 0x74, 0x0e, 0x20, 0xf8, 0x14, + 0xee, 0xa4, 0x33, 0x51, 0x9d, 0xb4, 0x24, 0xd6, 0x49, 0xbf, 0x51, 0x38, 0x58, 0x4a, 0x7f, 0xb6, + 0x0f, 0xae, 0x1e, 0x62, 0x61, 0x32, 0x06, 0x97, 0x9e, 0xbe, 0x5e, 0xbc, 0x22, 0xdb, 0x7b, 0x8d, + 0xfb, 0x47, 0x47, 0x32, 0x9f, 0x0a, 0xf7, 0x07, 0x72, 0x4f, 0x7f, 0x70, 0x00, 0x4b, 0xfa, 0x06, + 0x38, 0x4a, 0x8b, 0x28, 0xf9, 0x6c, 0xe5, 0x68, 0x28, 0x88, 0x9e, 0x64, 0xf4, 0xb1, 0x21, 0x94, + 0x60, 0xd0, 0x1d, 0xf3, 0x71, 0x9d, 0x5c, 0x32, 0x63, 0x37, 0xa9, 0x82, 0x1c, 0xde, 0xd5, 0xf4, + 0xdf, 0xca, 0x52, 0x6b, 0x77, 0x83, 0xdc, 0xe9, 0x86, 0xfe, 0x22, 0x3b, 0x8a, 0x11, 0xe1, 0x6e, + 0xc8, 0x12, 0x17, 0x77, 0x39, 0x72, 0x49, 0x23, 0x28, 0x32, 0xb8, 0x70, 0x0f, 0x3f, 0xe0, 0xac, + 0x1c, 0x51, 0xc9, 0x9f, 0xca, 0x8d, 0x70, 0xf4, 0xbc, 0xd6, 0xba, 0xb0, 0x65, 0x99, 0xbb, 0xe4, + 0xf6, 0x2b, 0x93, 0x5d, 0xa3, 0x45, 0xae, 0x23, 0xe4, 0x3f, 0x28, 0xb7, 0x7a, 0xa6, 0x43, 0x6e, + 0x90, 0xe9, 0xb0, 0x72, 0x84, 0x19, 0x0f, 0xca, 0x63, 0xfd, 0x4e, 0x27, 0x1f, 0xdb, 0xe9, 0xac, + 0x1c, 0xf1, 0xba, 0x1d, 0x65, 0x11, 0x26, 0xdb, 0xfa, 0x1e, 0xd9, 0xaa, 0x26, 0xb3, 0xae, 0x41, + 0x47, 0x97, 0x17, 0xf5, 0x3d, 0xba, 0xb1, 0xbd, 0x72, 0x44, 0xf5, 0xff, 0x54, 0x96, 0x61, 0x8a, + 0x6c, 0x0b, 0x10, 0x32, 0x93, 0x89, 0x8e, 0x25, 0xaf, 0x1c, 0x51, 0x83, 0x7f, 0x5d, 0xeb, 0x23, + 0x4b, 0xce, 0x7e, 0xdc, 0xe5, 0x6d, 0xb7, 0x67, 0x12, 0x6d, 0xb7, 0xbb, 0xb2, 0xa0, 0x1b, 0xee, + 0x27, 0x21, 0xd7, 0x22, 0x12, 0x96, 0x98, 0x84, 0xe9, 0xab, 0x72, 0x07, 0x64, 0x77, 0x34, 0xcb, + 0x9b, 0x3c, 0x5f, 0x3f, 0x98, 0xee, 0x9a, 0x66, 0x5d, 0x70, 0x11, 0x74, 0xff, 0x5a, 0x98, 0x80, + 0x1c, 0x11, 0x9c, 0xff, 0x80, 0xde, 0x92, 0xa5, 0x66, 0x48, 0xc9, 0x34, 0xdc, 0x61, 0xbf, 0x61, + 0x7a, 0x07, 0x64, 0x3e, 0x94, 0x19, 0x8d, 0x05, 0xd9, 0xf7, 0xde, 0x73, 0x39, 0xf2, 0xde, 0xf3, + 0x9e, 0x0b, 0x78, 0xb3, 0xbd, 0x17, 0xf0, 0x06, 0xcb, 0x07, 0xb9, 0xc1, 0x8e, 0x2a, 0x7f, 0x36, + 0x84, 0xe9, 0xd2, 0x2b, 0x88, 0xe8, 0x19, 0x78, 0x47, 0x37, 0x42, 0x75, 0xf6, 0x5e, 0x13, 0x76, + 0x4a, 0x49, 0x8d, 0x9a, 0x01, 0xec, 0xa5, 0xdf, 0x37, 0xfd, 0x76, 0x16, 0x4e, 0xd1, 0x6b, 0x9e, + 0xf7, 0x70, 0xc3, 0xe4, 0xef, 0x9b, 0x44, 0x9f, 0x1a, 0x89, 0xd2, 0xf4, 0x19, 0x70, 0xe4, 0xbe, + 0x03, 0xce, 0xbe, 0x43, 0xca, 0xd9, 0x01, 0x87, 0x94, 0x73, 0xc9, 0x56, 0x0e, 0x3f, 0x10, 0xd6, + 0x9f, 0x75, 0x5e, 0x7f, 0x6e, 0x8f, 0x00, 0xa8, 0x9f, 0x5c, 0x46, 0x62, 0xdf, 0xbc, 0xdd, 0xd7, + 0x94, 0x3a, 0xa7, 0x29, 0x77, 0x0d, 0xcf, 0x48, 0xfa, 0xda, 0xf2, 0x07, 0x59, 0xb8, 0x2c, 0x60, + 0xa6, 0x8a, 0x2f, 0x32, 0x45, 0xf9, 0xfc, 0x48, 0x14, 0x25, 0x79, 0x0c, 0x84, 0xb4, 0x35, 0xe6, + 0x4f, 0x84, 0xcf, 0x0e, 0xf5, 0x02, 0xe5, 0xcb, 0x26, 0x42, 0x59, 0x4e, 0x42, 0x9e, 0xf6, 0x30, + 0x0c, 0x1a, 0xf6, 0x96, 0xb0, 0xbb, 0x11, 0x3b, 0x71, 0x24, 0xca, 0xdb, 0x18, 0xf4, 0x87, 0xad, + 0x6b, 0x34, 0x76, 0x2d, 0xa3, 0x62, 0x38, 0x26, 0xfa, 0xc5, 0x91, 0x28, 0x8e, 0xef, 0x0d, 0x27, + 0x0f, 0xe3, 0x0d, 0x37, 0xd4, 0x2a, 0x87, 0x57, 0x83, 0x43, 0x59, 0xe5, 0x88, 0x28, 0x3c, 0x7d, + 0xfc, 0xde, 0x26, 0xc3, 0x49, 0x36, 0xd9, 0x5a, 0xe0, 0x2d, 0x44, 0x74, 0xdf, 0x28, 0x80, 0x3c, + 0xee, 0x99, 0x49, 0xec, 0x96, 0x33, 0xf2, 0xc2, 0x9f, 0x94, 0x8a, 0xbd, 0xdf, 0x81, 0x9b, 0x0e, + 0xf6, 0x70, 0x38, 0x12, 0xa4, 0xc4, 0xae, 0x75, 0x48, 0xc0, 0x46, 0xfa, 0x98, 0xbd, 0x40, 0x86, + 0x3c, 0xbb, 0xde, 0x7f, 0x23, 0x15, 0x87, 0x09, 0x3e, 0xca, 0xb3, 0xc0, 0x8e, 0x5c, 0xe2, 0x4b, + 0xee, 0xd3, 0xdb, 0x8b, 0x3b, 0xa4, 0x5b, 0xec, 0xbf, 0x2b, 0xc1, 0x74, 0x1d, 0x3b, 0x25, 0xcd, + 0xb2, 0x74, 0x6d, 0x6b, 0x54, 0x1e, 0xdf, 0xa2, 0xde, 0xc3, 0xe8, 0x7b, 0x19, 0xd1, 0xf3, 0x34, + 0xfe, 0x42, 0xb8, 0xc7, 0x6a, 0x44, 0x2c, 0xc1, 0x87, 0x84, 0xce, 0xcc, 0x0c, 0xa2, 0x36, 0x06, + 0x8f, 0x6d, 0x09, 0x26, 0xbc, 0xb3, 0x78, 0x37, 0x73, 0xe7, 0x33, 0xb7, 0x9d, 0x1d, 0xef, 0x18, + 0x0c, 0x79, 0xde, 0x7f, 0x06, 0x0c, 0xbd, 0x3c, 0xa1, 0xa3, 0x7c, 0xfc, 0x41, 0xc2, 0x64, 0x6d, + 0x2c, 0x89, 0x3b, 0xfc, 0x61, 0x1d, 0x1d, 0xfc, 0xbd, 0x09, 0xb6, 0x1c, 0xb9, 0xaa, 0x39, 0xf8, + 0x01, 0xf4, 0x45, 0x19, 0x26, 0xea, 0xd8, 0x71, 0xc7, 0x5b, 0xee, 0x72, 0xd3, 0x61, 0x35, 0x5c, + 0x09, 0xad, 0x78, 0x4c, 0xb1, 0x35, 0x8c, 0x7b, 0x60, 0xaa, 0x6b, 0x99, 0x2d, 0x6c, 0xdb, 0x6c, + 0xf5, 0x22, 0xec, 0xa8, 0xd6, 0x6f, 0xf4, 0x27, 0xac, 0xcd, 0xaf, 0x7b, 0xff, 0xa8, 0xc1, 0xef, + 0x49, 0xcd, 0x00, 0x4a, 0x89, 0x55, 0x70, 0xdc, 0x66, 0x40, 0x5c, 0xe1, 0xe9, 0x03, 0xfd, 0x59, + 0x19, 0x66, 0xea, 0xd8, 0xf1, 0xa5, 0x98, 0x60, 0x93, 0x23, 0x1a, 0x5e, 0x0e, 0x4a, 0xf9, 0x60, + 0x50, 0x8a, 0x5f, 0x0d, 0xc8, 0x4b, 0xd3, 0x27, 0x36, 0xc6, 0xab, 0x01, 0xc5, 0x38, 0x18, 0xc3, + 0xf1, 0xb5, 0x47, 0xc2, 0x14, 0xe1, 0x85, 0x34, 0xd8, 0x5f, 0xc9, 0x06, 0x8d, 0xf7, 0x4b, 0x29, + 0x35, 0xde, 0x3b, 0x21, 0xb7, 0xa3, 0x59, 0x17, 0x6c, 0xd2, 0x70, 0xa7, 0x45, 0xcc, 0xf6, 0x35, + 0x37, 0xbb, 0x4a, 0xff, 0xea, 0xef, 0xa7, 0x99, 0x4b, 0xe6, 0xa7, 0xf9, 0x90, 0x94, 0x68, 0x24, + 0xa4, 0x73, 0x87, 0x11, 0x36, 0xf9, 0x04, 0xe3, 0x66, 0x4c, 0xd9, 0xe9, 0x2b, 0xc7, 0xf3, 0x64, + 0x98, 0x74, 0xc7, 0x6d, 0x62, 0x8f, 0x9f, 0x3b, 0xb8, 0x3a, 0xf4, 0x37, 0xf4, 0x13, 0xf6, 0xc0, + 0x9e, 0x44, 0x46, 0x67, 0xde, 0x27, 0xe8, 0x81, 0xe3, 0x0a, 0x4f, 0x1f, 0x8f, 0x77, 0x50, 0x3c, + 0x48, 0x7b, 0x40, 0xaf, 0x97, 0x41, 0x5e, 0xc6, 0xce, 0xb8, 0xad, 0xc8, 0xb7, 0x0a, 0x87, 0x38, + 0xe2, 0x04, 0x46, 0x78, 0x9e, 0x5f, 0xc6, 0xa3, 0x69, 0x40, 0x62, 0xb1, 0x8d, 0x84, 0x18, 0x48, + 0x1f, 0xb5, 0xf7, 0x50, 0xd4, 0xe8, 0xe6, 0xc2, 0x2f, 0x8c, 0xa0, 0x57, 0x1d, 0xef, 0xc2, 0x87, + 0x27, 0x40, 0x42, 0xe3, 0xb0, 0xda, 0x5b, 0xbf, 0xc2, 0xc7, 0x72, 0x15, 0x1f, 0xb8, 0x8d, 0x7d, + 0x1b, 0xb7, 0x2e, 0xe0, 0x36, 0xfa, 0xd9, 0x83, 0x43, 0x77, 0x0a, 0x26, 0x5a, 0x94, 0x1a, 0x01, + 0x6f, 0x52, 0xf5, 0x5e, 0x13, 0xdc, 0x2b, 0xcd, 0x77, 0x44, 0xf4, 0xf7, 0x31, 0xde, 0x2b, 0x2d, + 0x50, 0xfc, 0x18, 0xcc, 0x16, 0x3a, 0xcb, 0xa8, 0xb4, 0x4c, 0x03, 0xfd, 0x97, 0x83, 0xc3, 0x72, + 0x15, 0x4c, 0xe9, 0x2d, 0xd3, 0x20, 0x61, 0x28, 0xbc, 0x43, 0x40, 0x7e, 0x82, 0xf7, 0xb5, 0xbc, + 0x63, 0xde, 0xaf, 0xb3, 0x5d, 0xf3, 0x20, 0x61, 0x58, 0x63, 0xc2, 0x65, 0xfd, 0xb0, 0x8c, 0x89, + 0x3e, 0x65, 0xa7, 0x0f, 0xd9, 0xc7, 0x02, 0xef, 0x36, 0xda, 0x15, 0x3e, 0x2c, 0x56, 0x81, 0x87, + 0x19, 0xce, 0xc2, 0xb5, 0x38, 0x94, 0xe1, 0x2c, 0x86, 0x81, 0x31, 0xdc, 0x58, 0x11, 0xe0, 0x98, + 0xfa, 0x1a, 0xf0, 0x01, 0xd0, 0x19, 0x9d, 0x79, 0x38, 0x24, 0x3a, 0x87, 0x63, 0x22, 0xbe, 0x9f, + 0x85, 0xc8, 0x64, 0x16, 0x0f, 0xfa, 0xaf, 0xa3, 0x00, 0xe7, 0xf6, 0x61, 0xfc, 0x15, 0xa8, 0xb7, + 0x42, 0x82, 0x1b, 0xb1, 0xf7, 0x49, 0xd0, 0xa5, 0x32, 0xc6, 0xbb, 0xe2, 0x45, 0xca, 0x4f, 0x1f, + 0xc0, 0xe7, 0xca, 0x30, 0x47, 0x7c, 0x04, 0x3a, 0x58, 0xb3, 0x68, 0x47, 0x39, 0x12, 0x47, 0xf9, + 0x77, 0x08, 0x07, 0xf8, 0xe1, 0xe5, 0x10, 0xf0, 0x31, 0x12, 0x28, 0xc4, 0xa2, 0xfb, 0x08, 0xb2, + 0x30, 0x96, 0x6d, 0x94, 0x82, 0xcf, 0x02, 0x53, 0xf1, 0xd1, 0xe0, 0x91, 0xd0, 0x23, 0x97, 0x17, + 0x86, 0xd7, 0xd8, 0xc6, 0xec, 0x91, 0x2b, 0xc2, 0x44, 0xfa, 0x98, 0xbc, 0xfe, 0x16, 0xb6, 0xe0, + 0xdc, 0x20, 0x17, 0xc6, 0xbf, 0x32, 0xeb, 0x9f, 0x68, 0xfb, 0xec, 0x48, 0x3c, 0x30, 0x0f, 0x10, + 0x10, 0x5f, 0x81, 0xac, 0x65, 0x5e, 0xa4, 0x4b, 0x5b, 0xb3, 0x2a, 0x79, 0xa6, 0xd7, 0x53, 0x76, + 0x76, 0x77, 0x0c, 0x7a, 0x32, 0x74, 0x56, 0xf5, 0x5e, 0x95, 0xeb, 0x60, 0xf6, 0xa2, 0xee, 0x6c, + 0xaf, 0x60, 0xad, 0x8d, 0x2d, 0xd5, 0xbc, 0x48, 0x3c, 0xe6, 0x26, 0x55, 0x3e, 0x91, 0xf7, 0x5f, + 0x11, 0xb0, 0x2f, 0xc9, 0x2d, 0xf2, 0x63, 0x39, 0xfe, 0x96, 0xc4, 0xf2, 0x8c, 0xe6, 0x2a, 0x7d, + 0x85, 0x79, 0xaf, 0x0c, 0x53, 0xaa, 0x79, 0x91, 0x29, 0xc9, 0xff, 0x71, 0xb8, 0x3a, 0x92, 0x78, + 0xa2, 0x47, 0x24, 0xe7, 0xb3, 0x3f, 0xf6, 0x89, 0x5e, 0x6c, 0xf1, 0x63, 0x39, 0xb9, 0x34, 0xa3, + 0x9a, 0x17, 0xeb, 0xd8, 0xa1, 0x2d, 0x02, 0x35, 0x47, 0xe4, 0x64, 0xad, 0xdb, 0x94, 0x20, 0x9b, + 0x87, 0xfb, 0xef, 0x49, 0x77, 0x11, 0x7c, 0x01, 0xf9, 0x2c, 0x8e, 0x7b, 0x17, 0x61, 0x20, 0x07, + 0x63, 0x88, 0x91, 0x22, 0xc3, 0xb4, 0x6a, 0x5e, 0x74, 0x87, 0x86, 0x25, 0xbd, 0xd3, 0x19, 0xcd, + 0x08, 0x99, 0xd4, 0xf8, 0xf7, 0xc4, 0xe0, 0x71, 0x31, 0x76, 0xe3, 0x7f, 0x00, 0x03, 0xe9, 0xc3, + 0xf0, 0x2c, 0xda, 0x58, 0xbc, 0x11, 0xda, 0x18, 0x0d, 0x0e, 0xc3, 0x36, 0x08, 0x9f, 0x8d, 0x43, + 0x6b, 0x10, 0x51, 0x1c, 0x8c, 0x65, 0xe7, 0x64, 0xae, 0x44, 0x86, 0xf9, 0xd1, 0xb6, 0x89, 0x77, + 0x25, 0x73, 0x4d, 0x64, 0xc3, 0x2e, 0xc7, 0xc8, 0x48, 0xd0, 0x48, 0xe0, 0x82, 0x28, 0xc0, 0x43, + 0xfa, 0x78, 0x7c, 0x58, 0x86, 0x19, 0xca, 0xc2, 0xc3, 0xc4, 0x0a, 0x18, 0xaa, 0x51, 0x85, 0x6b, + 0x70, 0x38, 0x8d, 0x2a, 0x86, 0x83, 0xb1, 0xdc, 0x0a, 0xea, 0xda, 0x71, 0x43, 0x1c, 0x1f, 0x8f, + 0x42, 0x70, 0x68, 0x63, 0x6c, 0x84, 0x47, 0xc8, 0x87, 0x31, 0xc6, 0x0e, 0xe9, 0x18, 0xf9, 0xb3, + 0xfc, 0x56, 0x34, 0x4a, 0x0c, 0x0e, 0xd0, 0x14, 0x46, 0x08, 0xc3, 0x90, 0x4d, 0xe1, 0x90, 0x90, + 0xf8, 0x9a, 0x0c, 0x40, 0x19, 0x58, 0x33, 0xf7, 0xc8, 0x65, 0x3e, 0x23, 0xe8, 0xce, 0x7a, 0xdd, + 0xea, 0xe5, 0x01, 0x6e, 0xf5, 0x09, 0x43, 0xb8, 0x24, 0x5d, 0x09, 0x0c, 0x49, 0xd9, 0xad, 0xe4, + 0xd8, 0x57, 0x02, 0xe3, 0xcb, 0x4f, 0x1f, 0xe3, 0xaf, 0x50, 0x6b, 0x2e, 0x38, 0x60, 0xfa, 0x5b, + 0x23, 0x41, 0x39, 0x34, 0xfb, 0x97, 0xf9, 0xd9, 0xff, 0x01, 0xb0, 0x1d, 0xd6, 0x46, 0x1c, 0x74, + 0x70, 0x34, 0x7d, 0x1b, 0xf1, 0xf0, 0x0e, 0x88, 0xfe, 0x42, 0x16, 0x8e, 0xb2, 0x4e, 0xe4, 0x47, + 0x01, 0xe2, 0x84, 0xe7, 0xf0, 0xb8, 0x4e, 0x72, 0x00, 0xca, 0xa3, 0x5a, 0x90, 0x4a, 0xb2, 0x94, + 0x29, 0xc0, 0xde, 0x58, 0x56, 0x37, 0xf2, 0xe5, 0x07, 0xba, 0x9a, 0xd1, 0x16, 0x0f, 0xf7, 0x3b, + 0x00, 0x78, 0x6f, 0xad, 0x51, 0xe6, 0xd7, 0x1a, 0xfb, 0xac, 0x4c, 0x26, 0xde, 0xb9, 0x26, 0x22, + 0xa3, 0xec, 0x8e, 0x7d, 0xe7, 0x3a, 0xba, 0xec, 0xf4, 0x51, 0x7a, 0x97, 0x0c, 0xd9, 0xba, 0x69, + 0x39, 0xe8, 0xd9, 0x49, 0x5a, 0x27, 0x95, 0x7c, 0x00, 0x92, 0xf7, 0xae, 0x94, 0xb8, 0x5b, 0x9a, + 0x6f, 0x8e, 0x3f, 0xea, 0xac, 0x39, 0x1a, 0xf1, 0xea, 0x76, 0xcb, 0x0f, 0x5d, 0xd7, 0x9c, 0x34, + 0x9e, 0x0e, 0x95, 0x5f, 0x3d, 0xfa, 0x00, 0x46, 0x6a, 0xf1, 0x74, 0x22, 0x4b, 0x4e, 0x1f, 0xb7, + 0xd7, 0x1c, 0x65, 0xbe, 0xad, 0x4b, 0x7a, 0x07, 0xa3, 0x67, 0x53, 0x97, 0x91, 0xaa, 0xb6, 0x83, + 0xc5, 0x8f, 0xc4, 0xc4, 0xba, 0xb6, 0x92, 0xf8, 0xb2, 0x72, 0x10, 0x5f, 0x36, 0x69, 0x83, 0xa2, + 0x07, 0xd0, 0x29, 0x4b, 0xe3, 0x6e, 0x50, 0x31, 0x65, 0x8f, 0x25, 0x4e, 0xe7, 0xb1, 0x3a, 0x76, + 0xa8, 0x51, 0x59, 0xf3, 0x6e, 0x60, 0xf9, 0xb9, 0x91, 0x44, 0xec, 0xf4, 0x2f, 0x78, 0x91, 0x7b, + 0x2e, 0x78, 0x79, 0x6f, 0x18, 0x9c, 0x35, 0x1e, 0x9c, 0x9f, 0x8e, 0x16, 0x10, 0xcf, 0xe4, 0x48, + 0x60, 0x7a, 0xab, 0x0f, 0xd3, 0x3a, 0x07, 0xd3, 0x1d, 0x43, 0x72, 0x91, 0x3e, 0x60, 0xbf, 0x9a, + 0x83, 0xa3, 0x74, 0xd2, 0x5f, 0x34, 0xda, 0x2c, 0xc2, 0xea, 0x9b, 0xa4, 0x43, 0xde, 0x6c, 0xdb, + 0x1f, 0x82, 0x95, 0x8b, 0xe5, 0x9c, 0xeb, 0xbd, 0x1d, 0x7f, 0x81, 0x86, 0x73, 0x75, 0x3b, 0x51, + 0xb2, 0xd3, 0x26, 0x7e, 0x43, 0xbe, 0xff, 0x1f, 0x7f, 0x97, 0xd1, 0x84, 0xf8, 0x5d, 0x46, 0x7f, + 0x9a, 0x6c, 0xdd, 0x8e, 0x14, 0xdd, 0x23, 0xf0, 0x94, 0x6d, 0xa7, 0x04, 0x2b, 0x7a, 0x02, 0xdc, + 0xfd, 0x78, 0xb8, 0x93, 0x05, 0x11, 0x44, 0x86, 0x74, 0x27, 0x23, 0x04, 0x0e, 0xd3, 0x9d, 0x6c, + 0x10, 0x03, 0x63, 0xb8, 0xd5, 0x3e, 0xc7, 0x76, 0xf3, 0x49, 0xbb, 0x41, 0x7f, 0x25, 0xa5, 0x3e, + 0x4a, 0x7f, 0x3f, 0x93, 0xc8, 0xff, 0x99, 0xf0, 0x15, 0x3f, 0x4c, 0x27, 0xf1, 0x68, 0x8e, 0x23, + 0x37, 0x86, 0x75, 0x23, 0x89, 0xf8, 0xa2, 0x9f, 0xd3, 0xdb, 0xce, 0xf6, 0x88, 0x4e, 0x74, 0x5c, + 0x74, 0x69, 0x79, 0xd7, 0x23, 0x93, 0x17, 0xf4, 0x6f, 0x99, 0x44, 0x21, 0xa4, 0x7c, 0x91, 0x10, + 0xb6, 0x22, 0x44, 0x9c, 0x20, 0xf0, 0x53, 0x2c, 0xbd, 0x31, 0x6a, 0xf4, 0x59, 0xbd, 0x8d, 0xcd, + 0x87, 0xa1, 0x46, 0x13, 0xbe, 0x46, 0xa7, 0xd1, 0x71, 0xe4, 0x7e, 0x4c, 0x35, 0xda, 0x17, 0xc9, + 0x88, 0x34, 0x3a, 0x96, 0x5e, 0xfa, 0x32, 0x7e, 0xf9, 0x0c, 0x9b, 0x48, 0xad, 0xea, 0xc6, 0x05, + 0xf4, 0xcf, 0x79, 0xef, 0x62, 0xe6, 0x73, 0xba, 0xb3, 0xcd, 0x62, 0xc1, 0xfc, 0x81, 0xf0, 0xdd, + 0x28, 0x43, 0xc4, 0x7b, 0xe1, 0xc3, 0x49, 0xe5, 0xf6, 0x85, 0x93, 0x2a, 0xc2, 0xac, 0x6e, 0x38, + 0xd8, 0x32, 0xb4, 0xce, 0x52, 0x47, 0xdb, 0xb2, 0x4f, 0x4d, 0xf4, 0xbd, 0xbc, 0xae, 0x12, 0xca, + 0xa3, 0xf2, 0x7f, 0x84, 0xaf, 0xaf, 0x9c, 0xe4, 0xaf, 0xaf, 0x8c, 0x88, 0x7e, 0x35, 0x15, 0x1d, + 0xfd, 0xca, 0x8f, 0x6e, 0x05, 0x83, 0x83, 0x63, 0x8b, 0xda, 0xc6, 0x09, 0xc3, 0xfd, 0xdd, 0x2c, + 0x18, 0x85, 0xcd, 0x0f, 0xfd, 0xf8, 0x2a, 0x39, 0xd1, 0xea, 0x9e, 0xab, 0x08, 0xf3, 0xbd, 0x4a, + 0x90, 0xd8, 0x42, 0x0d, 0x57, 0x5e, 0xee, 0xa9, 0xbc, 0x6f, 0xf2, 0x64, 0x05, 0x4c, 0x9e, 0xb0, + 0x52, 0xe5, 0xc4, 0x94, 0x2a, 0xc9, 0x62, 0xa1, 0x48, 0x6d, 0xc7, 0x70, 0x1a, 0x29, 0x07, 0xc7, + 0xbc, 0x68, 0xb7, 0xdd, 0x2e, 0xd6, 0x2c, 0xcd, 0x68, 0x61, 0xf4, 0x31, 0x69, 0x14, 0x66, 0xef, + 0x12, 0x4c, 0xea, 0x2d, 0xd3, 0xa8, 0xeb, 0x4f, 0xf3, 0x2e, 0x97, 0x8b, 0x0f, 0xb2, 0x4e, 0x24, + 0x52, 0x61, 0x7f, 0xa8, 0xfe, 0xbf, 0x4a, 0x05, 0xa6, 0x5a, 0x9a, 0xd5, 0xa6, 0x41, 0xf8, 0x72, + 0x3d, 0x17, 0x39, 0x45, 0x12, 0x2a, 0x79, 0xbf, 0xa8, 0xc1, 0xdf, 0x4a, 0x8d, 0x17, 0x62, 0xbe, + 0x27, 0x9a, 0x47, 0x24, 0xb1, 0xc5, 0xe0, 0x27, 0x4e, 0xe6, 0xae, 0x74, 0x2c, 0xdc, 0x21, 0x77, + 0xd0, 0xd3, 0x1e, 0x62, 0x4a, 0x0d, 0x12, 0x92, 0x2e, 0x0f, 0x90, 0xa2, 0xf6, 0xa1, 0x31, 0xee, + 0xe5, 0x01, 0x21, 0x2e, 0xd2, 0xd7, 0xcc, 0xb7, 0xe7, 0x61, 0x96, 0xf6, 0x6a, 0x4c, 0x9c, 0xe8, + 0xb9, 0xe4, 0x0a, 0x69, 0xe7, 0x5e, 0x7c, 0x09, 0xd5, 0x0f, 0x3e, 0x26, 0x17, 0x40, 0xbe, 0xe0, + 0x07, 0x1c, 0x74, 0x1f, 0x93, 0xee, 0xdb, 0x7b, 0x7c, 0xcd, 0x53, 0x9e, 0xc6, 0xbd, 0x6f, 0x1f, + 0x5f, 0x7c, 0xfa, 0xf8, 0xfc, 0x9a, 0x0c, 0x72, 0xb1, 0xdd, 0x46, 0xad, 0x83, 0x43, 0x71, 0x0d, + 0x4c, 0x7b, 0x6d, 0x26, 0x88, 0x01, 0x19, 0x4e, 0x4a, 0xba, 0x08, 0xea, 0xcb, 0xa6, 0xd8, 0x1e, + 0xfb, 0xae, 0x42, 0x4c, 0xd9, 0xe9, 0x83, 0xf2, 0x5b, 0x13, 0xac, 0xd1, 0x2c, 0x98, 0xe6, 0x05, + 0x72, 0x54, 0xe6, 0xd9, 0x32, 0xe4, 0x96, 0xb0, 0xd3, 0xda, 0x1e, 0x51, 0x9b, 0xd9, 0xb5, 0x3a, + 0x5e, 0x9b, 0xd9, 0x77, 0x1f, 0xfe, 0x60, 0x1b, 0xd6, 0x63, 0x6b, 0x9e, 0xb0, 0x34, 0xee, 0xe8, + 0xce, 0xb1, 0xa5, 0xa7, 0x0f, 0xce, 0xbf, 0xc9, 0x30, 0xe7, 0xaf, 0x70, 0x51, 0x4c, 0x7e, 0x35, + 0xf3, 0x70, 0x5b, 0xef, 0x44, 0x9f, 0x4f, 0x16, 0x22, 0xcd, 0x97, 0x29, 0x5f, 0xb3, 0x94, 0x17, + 0x16, 0x13, 0x04, 0x4f, 0x13, 0x63, 0x70, 0x0c, 0x33, 0x78, 0x19, 0x26, 0x09, 0x43, 0x8b, 0xfa, + 0x1e, 0x71, 0x1d, 0xe4, 0x16, 0x1a, 0x9f, 0x3e, 0x92, 0x85, 0xc6, 0x3b, 0xf8, 0x85, 0x46, 0xc1, + 0x88, 0xc7, 0xde, 0x3a, 0x63, 0x42, 0x5f, 0x1a, 0xf7, 0xff, 0x91, 0x2f, 0x33, 0x26, 0xf0, 0xa5, + 0x19, 0x50, 0x7e, 0xfa, 0x88, 0xbe, 0xea, 0x3f, 0xb1, 0xce, 0xd6, 0xdb, 0x50, 0x45, 0xff, 0xf3, + 0x18, 0x64, 0xcf, 0xba, 0x0f, 0xff, 0x3b, 0xb8, 0x11, 0xeb, 0xc5, 0x23, 0x08, 0xce, 0xf0, 0x64, + 0xc8, 0xba, 0xf4, 0xd9, 0xb4, 0xe5, 0x46, 0xb1, 0xdd, 0x5d, 0x97, 0x11, 0x95, 0xfc, 0xa7, 0x9c, + 0x84, 0xbc, 0x6d, 0xee, 0x5a, 0x2d, 0xd7, 0x7c, 0x76, 0x35, 0x86, 0xbd, 0x25, 0x0d, 0x4a, 0xca, + 0x91, 0x9e, 0x1f, 0x9d, 0xcb, 0x68, 0xe8, 0x82, 0x24, 0x99, 0xbb, 0x20, 0x29, 0xc1, 0xfe, 0x81, + 0x00, 0x6f, 0xe9, 0x6b, 0xc4, 0x5f, 0x91, 0xbb, 0x02, 0xdb, 0xa3, 0x82, 0x3d, 0x42, 0x2c, 0x07, + 0x55, 0x87, 0xa4, 0x0e, 0xdf, 0xbc, 0x68, 0xfd, 0x38, 0xf0, 0x63, 0x75, 0xf8, 0x16, 0xe0, 0x61, + 0x2c, 0xa7, 0xd4, 0xf3, 0xcc, 0x49, 0xf5, 0xbe, 0x51, 0xa2, 0x9b, 0xe5, 0x94, 0xfe, 0x40, 0xe8, + 0x8c, 0xd0, 0x79, 0x75, 0x68, 0x74, 0x0e, 0xc9, 0x7d, 0xf5, 0x0f, 0x65, 0x12, 0x09, 0xd3, 0x33, + 0x72, 0xc4, 0x2f, 0x3a, 0x4a, 0x0c, 0x91, 0x3b, 0x06, 0x73, 0x71, 0xa0, 0x67, 0x87, 0x0f, 0x0d, + 0xce, 0x8b, 0x2e, 0xc4, 0xff, 0xb8, 0x43, 0x83, 0x8b, 0x32, 0x92, 0x3e, 0x90, 0xaf, 0xa3, 0x17, + 0x8b, 0x15, 0x5b, 0x8e, 0xbe, 0x37, 0xe2, 0x96, 0xc6, 0x0f, 0x2f, 0x09, 0xa3, 0x01, 0xef, 0x93, + 0x10, 0xe5, 0x70, 0xdc, 0xd1, 0x80, 0xc5, 0xd8, 0x48, 0x1f, 0xa6, 0xbf, 0xcd, 0xbb, 0xd2, 0x63, + 0x6b, 0x33, 0xaf, 0x67, 0xab, 0x01, 0xf8, 0xe0, 0x68, 0x9d, 0x81, 0x99, 0xd0, 0xd4, 0xdf, 0xbb, + 0xb0, 0x86, 0x4b, 0x4b, 0x7a, 0xd0, 0xdd, 0x17, 0xd9, 0xc8, 0x17, 0x06, 0x12, 0x2c, 0xf8, 0x8a, + 0x30, 0x31, 0x96, 0xfb, 0xe0, 0xbc, 0x31, 0x6c, 0x4c, 0x58, 0xfd, 0x41, 0x18, 0xab, 0x1a, 0x8f, + 0xd5, 0x6d, 0x22, 0x62, 0x12, 0x1b, 0xd3, 0x84, 0xe6, 0x8d, 0x6f, 0xf3, 0xe1, 0x52, 0x39, 0xb8, + 0x9e, 0x3c, 0x34, 0x1f, 0xe9, 0x23, 0xf6, 0x12, 0xda, 0x1d, 0xd6, 0xa9, 0xc9, 0x3e, 0x9a, 0xee, + 0x90, 0xcd, 0x06, 0x64, 0x6e, 0x36, 0x90, 0xd0, 0xdf, 0x3e, 0x70, 0x23, 0xf5, 0x98, 0x1b, 0x04, + 0x51, 0x76, 0xc4, 0xfe, 0xf6, 0x03, 0x39, 0x48, 0x1f, 0x9c, 0x7f, 0x94, 0x01, 0x96, 0x2d, 0x73, + 0xb7, 0x5b, 0xb3, 0xda, 0xd8, 0x42, 0x7f, 0x13, 0x4c, 0x00, 0x5e, 0x38, 0x82, 0x09, 0xc0, 0x3a, + 0xc0, 0x96, 0x4f, 0x9c, 0x69, 0xf8, 0x2d, 0x62, 0xe6, 0x7e, 0xc0, 0x94, 0x1a, 0xa2, 0xc1, 0x5f, + 0x39, 0xfb, 0x14, 0x1e, 0xe3, 0xb8, 0x3e, 0x2b, 0x20, 0x37, 0xca, 0x09, 0xc0, 0x3b, 0x7c, 0xac, + 0x1b, 0x1c, 0xd6, 0x77, 0x1f, 0x80, 0x93, 0xf4, 0x31, 0xff, 0xa7, 0x09, 0x98, 0xa6, 0xdb, 0x75, + 0x54, 0xa6, 0x7f, 0x1f, 0x80, 0xfe, 0x5b, 0x23, 0x00, 0x7d, 0x03, 0x66, 0xcc, 0x80, 0x3a, 0xed, + 0x53, 0xc3, 0x0b, 0x30, 0xb1, 0xb0, 0x87, 0xf8, 0x52, 0x39, 0x32, 0xe8, 0x23, 0x61, 0xe4, 0x55, + 0x1e, 0xf9, 0x3b, 0x62, 0xe4, 0x1d, 0xa2, 0x38, 0x4a, 0xe8, 0xdf, 0xe9, 0x43, 0xbf, 0xc1, 0x41, + 0x5f, 0x3c, 0x08, 0x2b, 0x63, 0x08, 0xb7, 0x2f, 0x43, 0x96, 0x9c, 0x8e, 0xfb, 0xed, 0x14, 0xe7, + 0xf7, 0xa7, 0x60, 0x82, 0x34, 0x59, 0x7f, 0xde, 0xe1, 0xbd, 0xba, 0x5f, 0xb4, 0x4d, 0x07, 0x5b, + 0xbe, 0xc7, 0x82, 0xf7, 0xea, 0xf2, 0xe0, 0x79, 0x25, 0xdb, 0xa7, 0xf2, 0x74, 0x23, 0xd2, 0x4f, + 0x18, 0x7a, 0x52, 0x12, 0x96, 0xf8, 0xc8, 0xce, 0xcb, 0x0d, 0x33, 0x29, 0x19, 0xc0, 0x48, 0xfa, + 0xc0, 0xff, 0x45, 0x16, 0x4e, 0xd1, 0x55, 0xa5, 0x25, 0xcb, 0xdc, 0xe9, 0xb9, 0xdd, 0x4a, 0x3f, + 0xb8, 0x2e, 0x5c, 0x0f, 0x73, 0x0e, 0xe7, 0x8f, 0xcd, 0x74, 0xa2, 0x27, 0x15, 0xfd, 0x59, 0xd8, + 0xa7, 0xe2, 0xa9, 0x3c, 0x92, 0x0b, 0x31, 0x02, 0x8c, 0xe2, 0x3d, 0xf1, 0x42, 0xbd, 0x20, 0xa3, + 0xa1, 0x45, 0x2a, 0x79, 0xa8, 0x35, 0x4b, 0x5f, 0xa7, 0x72, 0x22, 0x3a, 0xf5, 0x3e, 0x5f, 0xa7, + 0x7e, 0x96, 0xd3, 0xa9, 0xe5, 0x83, 0x8b, 0x24, 0x7d, 0xdd, 0x7a, 0xa5, 0xbf, 0x31, 0xe4, 0x6f, + 0xdb, 0xed, 0xa4, 0xb0, 0x59, 0x17, 0xf6, 0x47, 0xca, 0x72, 0xfe, 0x48, 0xfc, 0x7d, 0x14, 0x09, + 0x66, 0xc2, 0x3c, 0xd7, 0x11, 0xba, 0x34, 0x07, 0x92, 0xee, 0x71, 0x27, 0xe9, 0xed, 0xa1, 0xe6, + 0xba, 0xb1, 0x05, 0x8d, 0x61, 0x6d, 0x69, 0x0e, 0xf2, 0x4b, 0x7a, 0xc7, 0xc1, 0x16, 0xfa, 0x0a, + 0x9b, 0xe9, 0xbe, 0x32, 0xc5, 0x01, 0x60, 0x11, 0xf2, 0x9b, 0xa4, 0x34, 0x66, 0x32, 0xdf, 0x24, + 0xd6, 0x7a, 0x28, 0x87, 0x2a, 0xfb, 0x37, 0x69, 0x74, 0xbe, 0x1e, 0x32, 0x23, 0x9b, 0x22, 0x27, + 0x88, 0xce, 0x37, 0x98, 0x85, 0xb1, 0x5c, 0x4c, 0x95, 0x57, 0xf1, 0x8e, 0x3b, 0xc6, 0x5f, 0x48, + 0x0f, 0xe1, 0x02, 0xc8, 0x7a, 0xdb, 0x26, 0x9d, 0xe3, 0x94, 0xea, 0x3e, 0x26, 0xf5, 0x15, 0xea, + 0x15, 0x15, 0x65, 0x79, 0xdc, 0xbe, 0x42, 0x42, 0x5c, 0xa4, 0x8f, 0xd9, 0xf7, 0x89, 0xa3, 0x68, + 0xb7, 0xa3, 0xb5, 0xb0, 0xcb, 0x7d, 0x6a, 0xa8, 0xd1, 0x9e, 0x2c, 0xeb, 0xf5, 0x64, 0xa1, 0x76, + 0x9a, 0x3b, 0x40, 0x3b, 0x1d, 0x76, 0x19, 0xd2, 0x97, 0x39, 0xa9, 0xf8, 0xa1, 0x2d, 0x43, 0xc6, + 0xb2, 0x31, 0x86, 0x6b, 0x47, 0xbd, 0x83, 0xb4, 0x63, 0x6d, 0xad, 0xc3, 0x6e, 0xd2, 0x30, 0x61, + 0x8d, 0xec, 0xd0, 0xec, 0x30, 0x9b, 0x34, 0xd1, 0x3c, 0x8c, 0x01, 0xad, 0x39, 0x86, 0xd6, 0xe7, + 0xd8, 0x30, 0x9a, 0xf2, 0x3e, 0xa9, 0x6d, 0x5a, 0x4e, 0xb2, 0x7d, 0x52, 0x97, 0x3b, 0x95, 0xfc, + 0x97, 0xf4, 0xe0, 0x15, 0x7f, 0xae, 0x7a, 0x54, 0xc3, 0x67, 0x82, 0x83, 0x57, 0x83, 0x18, 0x48, + 0x1f, 0xde, 0x37, 0x1f, 0xd2, 0xe0, 0x39, 0x6c, 0x73, 0x64, 0x6d, 0x60, 0x64, 0x43, 0xe7, 0x30, + 0xcd, 0x31, 0x9a, 0x87, 0xf4, 0xf1, 0xfa, 0x4e, 0x68, 0xe0, 0x7c, 0xe3, 0x18, 0x07, 0x4e, 0xaf, + 0x65, 0xe6, 0x86, 0x6c, 0x99, 0xc3, 0xee, 0xff, 0x30, 0x59, 0x8f, 0x6e, 0xc0, 0x1c, 0x66, 0xff, + 0x27, 0x86, 0x89, 0xf4, 0x11, 0x7f, 0x93, 0x0c, 0xb9, 0xfa, 0xf8, 0xc7, 0xcb, 0x61, 0xe7, 0x22, + 0x44, 0x56, 0xf5, 0x91, 0x0d, 0x97, 0xc3, 0xcc, 0x45, 0x22, 0x59, 0x18, 0x43, 0xe0, 0xfd, 0xa3, + 0x30, 0x43, 0x96, 0x44, 0xbc, 0x6d, 0xd6, 0xef, 0xb0, 0x51, 0xf3, 0xa1, 0x14, 0xdb, 0xea, 0x3d, + 0x30, 0xe9, 0xed, 0xdf, 0xb1, 0x91, 0x73, 0x5e, 0xac, 0x7d, 0x7a, 0x5c, 0xaa, 0xfe, 0xff, 0x07, + 0x72, 0x86, 0x18, 0xf9, 0x5e, 0xed, 0xb0, 0xce, 0x10, 0x87, 0xba, 0x5f, 0xfb, 0xa7, 0xc1, 0x88, + 0xfa, 0x5f, 0xd2, 0xc3, 0xbc, 0x77, 0x1f, 0x37, 0xdb, 0x67, 0x1f, 0xf7, 0x63, 0x61, 0x2c, 0xeb, + 0x3c, 0x96, 0x77, 0x8a, 0x8a, 0x70, 0x84, 0x63, 0xed, 0xbb, 0x7c, 0x38, 0xcf, 0x72, 0x70, 0x2e, + 0x1c, 0x88, 0x97, 0x31, 0x1c, 0x7c, 0xcc, 0x06, 0x63, 0xee, 0xc7, 0x53, 0x6c, 0xc7, 0x3d, 0xa7, + 0x2a, 0xb2, 0xfb, 0x4e, 0x55, 0x70, 0x2d, 0x3d, 0x77, 0xc0, 0x96, 0xfe, 0xf1, 0xb0, 0x76, 0x34, + 0x78, 0xed, 0x78, 0xb2, 0x38, 0x22, 0xa3, 0x1b, 0x99, 0xdf, 0xed, 0xab, 0xc7, 0x39, 0x4e, 0x3d, + 0x4a, 0x07, 0x63, 0x26, 0x7d, 0xfd, 0xf8, 0x23, 0x6f, 0x42, 0x7b, 0xc8, 0xed, 0x7d, 0xd8, 0xad, + 0x62, 0x4e, 0x88, 0x23, 0x1b, 0xb9, 0x87, 0xd9, 0x2a, 0x1e, 0xc4, 0xc9, 0x18, 0x62, 0xb1, 0xcd, + 0xc2, 0x34, 0xe1, 0xe9, 0x9c, 0xde, 0xde, 0xc2, 0x0e, 0x7a, 0x15, 0xf5, 0x51, 0xf4, 0x22, 0x5f, + 0x8e, 0x28, 0x3c, 0x51, 0xd4, 0x79, 0xd7, 0xa4, 0x1e, 0x1d, 0x94, 0xc9, 0xf9, 0x10, 0x83, 0xe3, + 0x8e, 0xa0, 0x38, 0x90, 0x83, 0xf4, 0x21, 0xfb, 0x08, 0x75, 0xb7, 0x59, 0xd5, 0x2e, 0x99, 0xbb, + 0x0e, 0x7a, 0x70, 0x04, 0x1d, 0xf4, 0x02, 0xe4, 0x3b, 0x84, 0x1a, 0x3b, 0x96, 0x11, 0x3f, 0xdd, + 0x61, 0x22, 0xa0, 0xe5, 0xab, 0xec, 0xcf, 0xa4, 0x67, 0x33, 0x02, 0x39, 0x52, 0x3a, 0xe3, 0x3e, + 0x9b, 0x31, 0xa0, 0xfc, 0xb1, 0xdc, 0xb1, 0x33, 0xe9, 0x96, 0xae, 0xef, 0xe8, 0xce, 0x88, 0x22, + 0x38, 0x74, 0x5c, 0x5a, 0x5e, 0x04, 0x07, 0xf2, 0x92, 0xf4, 0xc4, 0x68, 0x48, 0x2a, 0xee, 0xef, + 0xe3, 0x3e, 0x31, 0x1a, 0x5f, 0x7c, 0xfa, 0x98, 0xfc, 0x06, 0x6d, 0x59, 0x67, 0xa9, 0xf3, 0x6d, + 0x8a, 0x7e, 0xbd, 0x43, 0x37, 0x16, 0xca, 0xda, 0xe1, 0x35, 0x96, 0xbe, 0xe5, 0xa7, 0x0f, 0xcc, + 0x7f, 0xff, 0x49, 0xc8, 0x2d, 0xe2, 0xf3, 0xbb, 0x5b, 0xe8, 0x0e, 0x98, 0x6c, 0x58, 0x18, 0x57, + 0x8c, 0x4d, 0xd3, 0x95, 0xae, 0xe3, 0x3e, 0x7b, 0x90, 0xb0, 0x37, 0x17, 0x8f, 0x6d, 0xac, 0xb5, + 0x83, 0xf3, 0x67, 0xde, 0x2b, 0x7a, 0xb1, 0x04, 0xd9, 0xba, 0xa3, 0x39, 0x68, 0xca, 0xc7, 0x16, + 0x3d, 0x18, 0xc6, 0xe2, 0x0e, 0x1e, 0x8b, 0xeb, 0x39, 0x59, 0x10, 0x0e, 0xe6, 0xdd, 0xff, 0x23, + 0x00, 0x40, 0x30, 0x79, 0xbf, 0x6d, 0x1a, 0x6e, 0x0e, 0xef, 0x08, 0xa4, 0xf7, 0x8e, 0x5e, 0xe1, + 0x8b, 0xfb, 0x2e, 0x4e, 0xdc, 0x8f, 0x16, 0x2b, 0x62, 0x0c, 0x2b, 0x6d, 0x12, 0x4c, 0xb9, 0xa2, + 0x5d, 0xc1, 0x5a, 0xdb, 0x46, 0x3f, 0x11, 0x28, 0x7f, 0x84, 0x98, 0xd1, 0xfb, 0x85, 0x83, 0x71, + 0xd2, 0x5a, 0xf9, 0xc4, 0xa3, 0x3d, 0x3a, 0xbc, 0xcd, 0x7f, 0x89, 0x0f, 0x46, 0x72, 0x33, 0x64, + 0x75, 0x63, 0xd3, 0x64, 0xfe, 0x85, 0x57, 0x46, 0xd0, 0x76, 0x75, 0x42, 0x25, 0x19, 0x05, 0x23, + 0x75, 0xc6, 0xb3, 0x35, 0x96, 0x4b, 0xef, 0xb2, 0x6e, 0xe9, 0xe8, 0xff, 0x3f, 0x50, 0xd8, 0x8a, + 0x02, 0xd9, 0xae, 0xe6, 0x6c, 0xb3, 0xa2, 0xc9, 0xb3, 0x6b, 0x23, 0xef, 0x1a, 0x9a, 0x61, 0x1a, + 0x97, 0x76, 0xf4, 0xa7, 0xf9, 0x77, 0xeb, 0x72, 0x69, 0x2e, 0xe7, 0x5b, 0xd8, 0xc0, 0x96, 0xe6, + 0xe0, 0xfa, 0xde, 0x16, 0x99, 0x63, 0x4d, 0xaa, 0xe1, 0xa4, 0xc4, 0xfa, 0xef, 0x72, 0x1c, 0xad, + 0xff, 0x9b, 0x7a, 0x07, 0x93, 0x48, 0x4d, 0x4c, 0xff, 0xbd, 0xf7, 0x44, 0xfa, 0xdf, 0xa7, 0x88, + 0xf4, 0xd1, 0xf8, 0x81, 0x04, 0x33, 0x75, 0x57, 0xe1, 0xea, 0xbb, 0x3b, 0x3b, 0x9a, 0x75, 0x09, + 0x5d, 0x1b, 0xa0, 0x12, 0x52, 0xcd, 0x0c, 0xef, 0x97, 0xf2, 0x87, 0xc2, 0xd7, 0x4a, 0xb3, 0xa6, + 0x1d, 0x2a, 0x21, 0x71, 0x3b, 0x78, 0x2c, 0xe4, 0x5c, 0xf5, 0xf6, 0x3c, 0x2e, 0x63, 0x1b, 0x02, + 0xcd, 0x29, 0x18, 0xd1, 0x6a, 0x20, 0x6f, 0x63, 0x88, 0xa6, 0x21, 0xc1, 0xd1, 0xba, 0xa3, 0xb5, + 0x2e, 0x2c, 0x9b, 0x96, 0xb9, 0xeb, 0xe8, 0x06, 0xb6, 0xd1, 0x23, 0x02, 0x04, 0x3c, 0xfd, 0xcf, + 0x04, 0xfa, 0x8f, 0xfe, 0x3d, 0x23, 0x3a, 0x8a, 0xfa, 0xdd, 0x6a, 0x98, 0x7c, 0x44, 0x80, 0x2a, + 0xb1, 0x71, 0x51, 0x84, 0x62, 0xfa, 0x42, 0x7b, 0xa3, 0x0c, 0x85, 0xf2, 0x03, 0x5d, 0xd3, 0x72, + 0x56, 0xcd, 0x96, 0xd6, 0xb1, 0x1d, 0xd3, 0xc2, 0xa8, 0x16, 0x2b, 0x35, 0xb7, 0x87, 0x69, 0x9b, + 0xad, 0x60, 0x70, 0x64, 0x6f, 0x61, 0xb5, 0x93, 0x79, 0x1d, 0xff, 0x88, 0xf0, 0x2e, 0x23, 0x95, + 0x4a, 0x2f, 0x47, 0x11, 0x7a, 0xde, 0xaf, 0x4b, 0x4b, 0x76, 0x58, 0x42, 0x6c, 0xe7, 0x51, 0x88, + 0xa9, 0x31, 0x2c, 0x95, 0x4b, 0x30, 0x5b, 0xdf, 0x3d, 0xef, 0x13, 0xb1, 0xc3, 0x46, 0xc8, 0xab, + 0x85, 0xa3, 0x54, 0x30, 0xc5, 0x0b, 0x13, 0x8a, 0x90, 0xef, 0x75, 0x30, 0x6b, 0x87, 0xb3, 0x31, + 0xbc, 0xf9, 0x44, 0xc1, 0xe8, 0x14, 0x83, 0x4b, 0x4d, 0x5f, 0x80, 0xef, 0x96, 0x60, 0xb6, 0xd6, + 0xc5, 0x06, 0x6e, 0x53, 0x2f, 0x48, 0x4e, 0x80, 0x2f, 0x4e, 0x28, 0x40, 0x8e, 0x50, 0x84, 0x00, + 0x03, 0x8f, 0xe5, 0x45, 0x4f, 0x78, 0x41, 0x42, 0x22, 0xc1, 0xc5, 0x95, 0x96, 0xbe, 0xe0, 0xbe, + 0x2c, 0xc1, 0xb4, 0xba, 0x6b, 0xac, 0x5b, 0xa6, 0x3b, 0x1a, 0x5b, 0xe8, 0xce, 0xa0, 0x83, 0xb8, + 0x09, 0x8e, 0xb5, 0x77, 0x2d, 0xb2, 0xfe, 0x54, 0x31, 0xea, 0xb8, 0x65, 0x1a, 0x6d, 0x9b, 0xd4, + 0x23, 0xa7, 0xee, 0xff, 0x70, 0x7b, 0xf6, 0xd9, 0xdf, 0x94, 0x33, 0xe8, 0xb9, 0xc2, 0xa1, 0x6e, + 0x68, 0xe5, 0x43, 0x45, 0x8b, 0xf7, 0x04, 0x82, 0x01, 0x6d, 0x06, 0x95, 0x90, 0xbe, 0x70, 0x3f, + 0x27, 0x81, 0x52, 0x6c, 0xb5, 0xcc, 0x5d, 0xc3, 0xa9, 0xe3, 0x0e, 0x6e, 0x39, 0x0d, 0x4b, 0x6b, + 0xe1, 0xb0, 0xfd, 0x5c, 0x00, 0xb9, 0xad, 0x5b, 0xac, 0x0f, 0x76, 0x1f, 0x99, 0x1c, 0x5f, 0x2c, + 0xbc, 0xe3, 0x48, 0x6b, 0xb9, 0xbf, 0x94, 0x04, 0xe2, 0x14, 0xdb, 0x57, 0x14, 0x2c, 0x28, 0x7d, + 0xa9, 0x7e, 0x5c, 0x82, 0x29, 0xaf, 0xc7, 0xde, 0x12, 0x11, 0xe6, 0x6f, 0x24, 0x9c, 0x8c, 0xf8, + 0xc4, 0x13, 0xc8, 0xf0, 0xed, 0x09, 0x66, 0x15, 0x51, 0xf4, 0x93, 0x89, 0xae, 0x98, 0x5c, 0x74, + 0xee, 0x6b, 0xb5, 0xd6, 0x5c, 0xaa, 0xad, 0x2e, 0x96, 0xd5, 0x82, 0x8c, 0xbe, 0x22, 0x41, 0x76, + 0x5d, 0x37, 0xb6, 0xc2, 0xd1, 0x95, 0x8e, 0xbb, 0x76, 0x64, 0x1b, 0x3f, 0xc0, 0x5a, 0x3a, 0x7d, + 0x51, 0x6e, 0x85, 0xe3, 0xc6, 0xee, 0xce, 0x79, 0x6c, 0xd5, 0x36, 0xc9, 0x28, 0x6b, 0x37, 0xcc, + 0x3a, 0x36, 0xa8, 0x11, 0x9a, 0x53, 0xfb, 0x7e, 0xe3, 0x4d, 0x30, 0x81, 0xc9, 0x83, 0xcb, 0x49, + 0x84, 0xc4, 0x7d, 0xa6, 0xa4, 0x10, 0x53, 0x89, 0xa6, 0x0d, 0x7d, 0x88, 0xa7, 0xaf, 0xa9, 0x7f, + 0x9c, 0x83, 0x13, 0x45, 0xe3, 0x12, 0xb1, 0x29, 0x68, 0x07, 0x5f, 0xda, 0xd6, 0x8c, 0x2d, 0x4c, + 0x06, 0x08, 0x5f, 0xe2, 0xe1, 0x10, 0xfd, 0x19, 0x3e, 0x44, 0xbf, 0xa2, 0xc2, 0x84, 0x69, 0xb5, + 0xb1, 0xb5, 0x70, 0x89, 0xf0, 0xd4, 0xbb, 0xec, 0xcc, 0xda, 0x64, 0xbf, 0x22, 0xe6, 0x19, 0xf9, + 0xf9, 0x1a, 0xfd, 0x5f, 0xf5, 0x08, 0x9d, 0xb9, 0x09, 0x26, 0x58, 0x9a, 0x32, 0x03, 0x93, 0x35, + 0x75, 0xb1, 0xac, 0x36, 0x2b, 0x8b, 0x85, 0x23, 0xca, 0x65, 0x70, 0xb4, 0xd2, 0x28, 0xab, 0xc5, + 0x46, 0xa5, 0x56, 0x6d, 0x92, 0xf4, 0x42, 0x06, 0x3d, 0x2b, 0x2b, 0xea, 0xd9, 0x1b, 0xcf, 0x4c, + 0x3f, 0x58, 0x55, 0x98, 0x68, 0xd1, 0x0c, 0x64, 0x08, 0x9d, 0x4e, 0x54, 0x3b, 0x46, 0x90, 0x26, + 0xa8, 0x1e, 0x21, 0xe5, 0x34, 0xc0, 0x45, 0xcb, 0x34, 0xb6, 0x82, 0x53, 0x87, 0x93, 0x6a, 0x28, + 0x05, 0x3d, 0x98, 0x81, 0x3c, 0xfd, 0x87, 0x5c, 0x49, 0x42, 0x9e, 0x02, 0xc1, 0x7b, 0xef, 0xae, + 0xc5, 0x4b, 0xe4, 0x15, 0x4c, 0xb4, 0xd8, 0xab, 0xab, 0x8b, 0x54, 0x06, 0xd4, 0x12, 0x66, 0x55, + 0xb9, 0x19, 0xf2, 0xf4, 0x5f, 0xe6, 0x75, 0x10, 0x1d, 0x5e, 0x94, 0x66, 0x13, 0xf4, 0x53, 0x16, + 0x97, 0x69, 0xfa, 0xda, 0xfc, 0x01, 0x09, 0x26, 0xab, 0xd8, 0x29, 0x6d, 0xe3, 0xd6, 0x05, 0xf4, + 0x28, 0x7e, 0x01, 0xb4, 0xa3, 0x63, 0xc3, 0xb9, 0x6f, 0xa7, 0xe3, 0x2f, 0x80, 0x7a, 0x09, 0xe8, + 0x39, 0xe1, 0xce, 0xf7, 0x6e, 0x5e, 0x7f, 0x6e, 0xec, 0x53, 0x57, 0xaf, 0x84, 0x08, 0x95, 0x39, + 0x09, 0x79, 0x0b, 0xdb, 0xbb, 0x1d, 0x6f, 0x11, 0x8d, 0xbd, 0xa1, 0xd7, 0xf8, 0xe2, 0x2c, 0x71, + 0xe2, 0xbc, 0x59, 0xbc, 0x88, 0x31, 0xc4, 0x2b, 0xcd, 0xc2, 0x44, 0xc5, 0xd0, 0x1d, 0x5d, 0xeb, + 0xa0, 0xe7, 0x66, 0x61, 0xb6, 0x8e, 0x9d, 0x75, 0xcd, 0xd2, 0x76, 0xb0, 0x83, 0x2d, 0x1b, 0x7d, + 0x8f, 0xef, 0x13, 0xba, 0x1d, 0xcd, 0xd9, 0x34, 0xad, 0x1d, 0x4f, 0x35, 0xbd, 0x77, 0x57, 0x35, + 0xf7, 0xb0, 0x65, 0x07, 0x7c, 0x79, 0xaf, 0xee, 0x97, 0x8b, 0xa6, 0x75, 0xc1, 0x1d, 0x04, 0xd9, + 0x34, 0x8d, 0xbd, 0xba, 0xf4, 0x3a, 0xe6, 0xd6, 0x2a, 0xde, 0xc3, 0x5e, 0xb8, 0x34, 0xff, 0xdd, + 0x9d, 0x0b, 0xb4, 0xcd, 0xaa, 0xe9, 0xb8, 0x9d, 0xf6, 0xaa, 0xb9, 0x45, 0xe3, 0xc5, 0x4e, 0xaa, + 0x7c, 0x62, 0x90, 0x4b, 0xdb, 0xc3, 0x24, 0x57, 0x3e, 0x9c, 0x8b, 0x25, 0x2a, 0xf3, 0xa0, 0xf8, + 0xbf, 0x35, 0x70, 0x07, 0xef, 0x60, 0xc7, 0xba, 0x44, 0xae, 0x85, 0x98, 0x54, 0xfb, 0x7c, 0x61, + 0x03, 0xb4, 0xf8, 0x64, 0x9d, 0x49, 0x6f, 0x9e, 0x93, 0xdc, 0x81, 0x26, 0xeb, 0x22, 0x14, 0xc7, + 0x72, 0xed, 0x95, 0xec, 0x5a, 0x33, 0x2f, 0x95, 0x21, 0x4b, 0x06, 0xcf, 0x37, 0x65, 0xb8, 0x15, + 0xa6, 0x1d, 0x6c, 0xdb, 0xda, 0x16, 0xf6, 0x56, 0x98, 0xd8, 0xab, 0x72, 0x1b, 0xe4, 0x3a, 0x04, + 0x53, 0x3a, 0x38, 0x5c, 0xcb, 0xd5, 0xcc, 0x35, 0x30, 0x5c, 0x5a, 0xfe, 0x48, 0x40, 0xe0, 0x56, + 0xe9, 0x1f, 0x67, 0xee, 0x81, 0x1c, 0x85, 0x7f, 0x0a, 0x72, 0x8b, 0xe5, 0x85, 0x8d, 0xe5, 0xc2, + 0x11, 0xf7, 0xd1, 0xe3, 0x6f, 0x0a, 0x72, 0x4b, 0xc5, 0x46, 0x71, 0xb5, 0x20, 0xb9, 0xf5, 0xa8, + 0x54, 0x97, 0x6a, 0x05, 0xd9, 0x4d, 0x5c, 0x2f, 0x56, 0x2b, 0xa5, 0x42, 0x56, 0x99, 0x86, 0x89, + 0x73, 0x45, 0xb5, 0x5a, 0xa9, 0x2e, 0x17, 0x72, 0xe8, 0x6f, 0xc3, 0xf8, 0xdd, 0xce, 0xe3, 0x77, + 0x5d, 0x14, 0x4f, 0xfd, 0x20, 0x7b, 0x99, 0x0f, 0xd9, 0x9d, 0x1c, 0x64, 0x3f, 0x29, 0x42, 0x64, + 0x0c, 0xee, 0x4c, 0x79, 0x98, 0x58, 0xb7, 0xcc, 0x16, 0xb6, 0x6d, 0xf4, 0x9b, 0x12, 0xe4, 0x4b, + 0x9a, 0xd1, 0xc2, 0x1d, 0x74, 0x45, 0x00, 0x15, 0x75, 0x15, 0xcd, 0xf8, 0xa7, 0xc5, 0xfe, 0x31, + 0x23, 0xda, 0xfb, 0x31, 0xba, 0xf3, 0x94, 0x66, 0x84, 0x7c, 0xc4, 0x7a, 0xb9, 0x58, 0x52, 0x63, + 0xb8, 0x1a, 0x47, 0x82, 0x29, 0xb6, 0x1a, 0x70, 0x1e, 0x87, 0xe7, 0xe1, 0xdf, 0xcb, 0x88, 0x4e, + 0x0e, 0xbd, 0x1a, 0xf8, 0x64, 0x22, 0xe4, 0x21, 0x36, 0x11, 0x1c, 0x44, 0x6d, 0x0c, 0x9b, 0x87, + 0x12, 0x4c, 0x6f, 0x18, 0x76, 0x3f, 0xa1, 0x88, 0xc7, 0xd1, 0xf7, 0xaa, 0x11, 0x22, 0x74, 0xa0, + 0x38, 0xfa, 0x83, 0xe9, 0xa5, 0x2f, 0x98, 0xef, 0x65, 0xe0, 0xf8, 0x32, 0x36, 0xb0, 0xa5, 0xb7, + 0x68, 0x0d, 0x3c, 0x49, 0xdc, 0xc9, 0x4b, 0xe2, 0x51, 0x1c, 0xe7, 0xfd, 0xfe, 0xe0, 0x25, 0xf0, + 0x4a, 0x5f, 0x02, 0x77, 0x73, 0x12, 0xb8, 0x49, 0x90, 0xce, 0x18, 0xee, 0x43, 0x9f, 0x82, 0x99, + 0xaa, 0xe9, 0xe8, 0x9b, 0x7a, 0x8b, 0xfa, 0xa0, 0xbd, 0x44, 0x86, 0xec, 0xaa, 0x6e, 0x3b, 0xa8, + 0x18, 0x74, 0x27, 0xd7, 0xc0, 0xb4, 0x6e, 0xb4, 0x3a, 0xbb, 0x6d, 0xac, 0x62, 0x8d, 0xf6, 0x2b, + 0x93, 0x6a, 0x38, 0x29, 0xd8, 0xda, 0x77, 0xd9, 0x92, 0xbd, 0xad, 0xfd, 0x4f, 0x0b, 0x2f, 0xc3, + 0x84, 0x59, 0x20, 0x01, 0x29, 0x23, 0xec, 0xae, 0x22, 0xcc, 0x1a, 0xa1, 0xac, 0x9e, 0xc1, 0xde, + 0x7b, 0xa1, 0x40, 0x98, 0x9c, 0xca, 0xff, 0x81, 0xde, 0x2b, 0xd4, 0x58, 0x07, 0x31, 0x94, 0x0c, + 0x99, 0xa5, 0x21, 0x26, 0xc9, 0x0a, 0xcc, 0x55, 0xaa, 0x8d, 0xb2, 0x5a, 0x2d, 0xae, 0xb2, 0x2c, + 0x32, 0xfa, 0x81, 0x04, 0x39, 0x15, 0x77, 0x3b, 0x97, 0xc2, 0x11, 0xa3, 0x99, 0xa3, 0x78, 0xc6, + 0x77, 0x14, 0x57, 0x96, 0x00, 0xb4, 0x96, 0x5b, 0x30, 0xb9, 0x52, 0x4b, 0xea, 0x1b, 0xc7, 0x94, + 0xab, 0x60, 0xd1, 0xcf, 0xad, 0x86, 0xfe, 0x44, 0xcf, 0x13, 0xde, 0x39, 0xe2, 0xa8, 0x11, 0x0e, + 0x23, 0xfa, 0x84, 0xf7, 0x09, 0x6d, 0xf6, 0x0c, 0x24, 0x77, 0x38, 0xe2, 0xff, 0xaa, 0x04, 0xd9, + 0x86, 0xdb, 0x5b, 0x86, 0x3a, 0xce, 0x4f, 0x0d, 0xa7, 0xe3, 0x2e, 0x99, 0x08, 0x1d, 0xbf, 0x0b, + 0x66, 0xc2, 0x1a, 0xcb, 0x5c, 0x25, 0x62, 0x55, 0x9c, 0xfb, 0x61, 0x18, 0x0d, 0xef, 0xc3, 0xce, + 0xe1, 0x88, 0xf8, 0x13, 0x8f, 0x06, 0x58, 0xc3, 0x3b, 0xe7, 0xb1, 0x65, 0x6f, 0xeb, 0x5d, 0xf4, + 0x77, 0x32, 0x4c, 0x2d, 0x63, 0xa7, 0xee, 0x68, 0xce, 0xae, 0xdd, 0xb3, 0xdd, 0x69, 0x98, 0x25, + 0xad, 0xb5, 0x8d, 0x59, 0x77, 0xe4, 0xbd, 0xa2, 0x77, 0xca, 0xa2, 0xfe, 0x44, 0x41, 0x39, 0xf3, + 0x7e, 0x19, 0x11, 0x98, 0x3c, 0x06, 0xb2, 0x6d, 0xcd, 0xd1, 0x18, 0x16, 0x57, 0xf4, 0x60, 0x11, + 0x10, 0x52, 0x49, 0x36, 0xf4, 0xbb, 0x92, 0x88, 0x43, 0x91, 0x40, 0xf9, 0xc9, 0x40, 0x78, 0x6f, + 0x66, 0x08, 0x14, 0x8e, 0xc1, 0x6c, 0xb5, 0xd6, 0x68, 0xae, 0xd6, 0x96, 0x97, 0xcb, 0x6e, 0x6a, + 0x41, 0x56, 0x4e, 0x82, 0xb2, 0x5e, 0xbc, 0x6f, 0xad, 0x5c, 0x6d, 0x34, 0xab, 0xb5, 0xc5, 0x32, + 0xfb, 0x33, 0xab, 0x1c, 0x85, 0xe9, 0x52, 0xb1, 0xb4, 0xe2, 0x25, 0xe4, 0x94, 0x53, 0x70, 0x7c, + 0xad, 0xbc, 0xb6, 0x50, 0x56, 0xeb, 0x2b, 0x95, 0xf5, 0xa6, 0x4b, 0x66, 0xa9, 0xb6, 0x51, 0x5d, + 0x2c, 0xe4, 0x15, 0x04, 0x27, 0x43, 0x5f, 0xce, 0xa9, 0xb5, 0xea, 0x72, 0xb3, 0xde, 0x28, 0x36, + 0xca, 0x85, 0x09, 0xe5, 0x32, 0x38, 0x5a, 0x2a, 0x56, 0x49, 0xf6, 0x52, 0xad, 0x5a, 0x2d, 0x97, + 0x1a, 0x85, 0x49, 0xf4, 0xef, 0x59, 0x98, 0xae, 0xd8, 0x55, 0x6d, 0x07, 0x9f, 0xd5, 0x3a, 0x7a, + 0x1b, 0x3d, 0x37, 0x34, 0xf3, 0xb8, 0x0e, 0x66, 0x2d, 0xfa, 0x88, 0xdb, 0x0d, 0x1d, 0x53, 0x34, + 0x67, 0x55, 0x3e, 0xd1, 0x9d, 0x93, 0x1b, 0x84, 0x80, 0x37, 0x27, 0xa7, 0x6f, 0xca, 0x02, 0x00, + 0x7d, 0x6a, 0x04, 0x97, 0xbb, 0x9e, 0xe9, 0x6d, 0x4d, 0xda, 0x0e, 0xb6, 0xb1, 0xb5, 0xa7, 0xb7, + 0xb0, 0x97, 0x53, 0x0d, 0xfd, 0x85, 0xbe, 0x26, 0x8b, 0xee, 0x2f, 0x86, 0x40, 0x0d, 0x55, 0x27, + 0xa2, 0x37, 0xfc, 0x65, 0x59, 0x64, 0x77, 0x50, 0x88, 0x64, 0x32, 0x4d, 0x79, 0x81, 0x34, 0xdc, + 0xb2, 0x6d, 0xa3, 0x56, 0x6b, 0xd6, 0x57, 0x6a, 0x6a, 0xa3, 0x20, 0x2b, 0x33, 0x30, 0xe9, 0xbe, + 0xae, 0xd6, 0xaa, 0xcb, 0x85, 0xac, 0x72, 0x02, 0x8e, 0xad, 0x14, 0xeb, 0xcd, 0x4a, 0xf5, 0x6c, + 0x71, 0xb5, 0xb2, 0xd8, 0x2c, 0xad, 0x14, 0xd5, 0x7a, 0x21, 0xa7, 0x5c, 0x01, 0x27, 0x1a, 0x95, + 0xb2, 0xda, 0x5c, 0x2a, 0x17, 0x1b, 0x1b, 0x6a, 0xb9, 0xde, 0xac, 0xd6, 0x9a, 0xd5, 0xe2, 0x5a, + 0xb9, 0x90, 0x77, 0x9b, 0x3f, 0xf9, 0x14, 0xa8, 0xcd, 0xc4, 0x7e, 0x65, 0x9c, 0x8c, 0x50, 0xc6, + 0xa9, 0x5e, 0x65, 0x84, 0xb0, 0x5a, 0xa9, 0xe5, 0x7a, 0x59, 0x3d, 0x5b, 0x2e, 0x4c, 0xf7, 0xd3, + 0xb5, 0x19, 0xe5, 0x38, 0x14, 0x5c, 0x1e, 0x9a, 0x95, 0xba, 0x97, 0x73, 0xb1, 0x30, 0x8b, 0x3e, + 0x9e, 0x87, 0x93, 0x2a, 0xde, 0xd2, 0x6d, 0x07, 0x5b, 0xeb, 0xda, 0xa5, 0x1d, 0x6c, 0x38, 0x5e, + 0x27, 0xff, 0x2f, 0x89, 0x95, 0x71, 0x0d, 0x66, 0xbb, 0x94, 0xc6, 0x1a, 0x76, 0xb6, 0xcd, 0x36, + 0x1b, 0x85, 0x1f, 0x15, 0xd9, 0x73, 0xcc, 0xaf, 0x87, 0xb3, 0xab, 0xfc, 0xdf, 0x21, 0xdd, 0x96, + 0x63, 0x74, 0x3b, 0x3b, 0x8c, 0x6e, 0x2b, 0x57, 0xc1, 0xd4, 0xae, 0x8d, 0xad, 0xf2, 0x8e, 0xa6, + 0x77, 0xbc, 0xcb, 0x39, 0xfd, 0x04, 0xf4, 0xb6, 0xac, 0xe8, 0x89, 0x95, 0x50, 0x5d, 0xfa, 0x8b, + 0x31, 0xa2, 0x6f, 0x3d, 0x0d, 0xc0, 0x2a, 0xbb, 0x61, 0x75, 0x98, 0xb2, 0x86, 0x52, 0x5c, 0xfe, + 0xce, 0xeb, 0x9d, 0x8e, 0x6e, 0x6c, 0xf9, 0xfb, 0xfe, 0x41, 0x02, 0x7a, 0x81, 0x2c, 0x72, 0x82, + 0x25, 0x29, 0x6f, 0xc9, 0x5a, 0xd3, 0xf3, 0xa4, 0x31, 0xf7, 0xbb, 0xfb, 0x9b, 0x4e, 0x5e, 0x29, + 0xc0, 0x0c, 0x49, 0x63, 0x2d, 0xb0, 0x30, 0xe1, 0xf6, 0xc1, 0x1e, 0xb9, 0xb5, 0x72, 0x63, 0xa5, + 0xb6, 0xe8, 0x7f, 0x9b, 0x74, 0x49, 0xba, 0xcc, 0x14, 0xab, 0xf7, 0x91, 0xd6, 0x38, 0xa5, 0x3c, + 0x02, 0xae, 0x08, 0x75, 0xd8, 0xc5, 0x55, 0xb5, 0x5c, 0x5c, 0xbc, 0xaf, 0x59, 0x7e, 0x6a, 0xa5, + 0xde, 0xa8, 0xf3, 0x8d, 0xcb, 0x6b, 0x47, 0xd3, 0x2e, 0xbf, 0xe5, 0xb5, 0x62, 0x65, 0x95, 0xf5, + 0xef, 0x4b, 0x35, 0x75, 0xad, 0xd8, 0x28, 0xcc, 0xa0, 0x97, 0xca, 0x50, 0x58, 0xc6, 0xce, 0xba, + 0x69, 0x39, 0x5a, 0x67, 0x55, 0x37, 0x2e, 0x6c, 0x58, 0x1d, 0x6e, 0xb2, 0x29, 0x1c, 0xa6, 0x83, + 0x1f, 0x22, 0x39, 0x82, 0xd1, 0x3b, 0xe2, 0x5d, 0x92, 0x2d, 0x50, 0xa6, 0x20, 0x01, 0x3d, 0x5d, + 0x12, 0x59, 0xee, 0x16, 0x2f, 0x35, 0x99, 0x9e, 0x3c, 0x63, 0xdc, 0xe3, 0x73, 0x1f, 0xd4, 0xf2, + 0xe8, 0xd9, 0x59, 0x98, 0x5c, 0xd2, 0x0d, 0xad, 0xa3, 0x3f, 0x8d, 0x8b, 0x5f, 0x1a, 0xf4, 0x31, + 0x99, 0x98, 0x3e, 0x46, 0x1a, 0x6a, 0xfc, 0xfc, 0x75, 0x59, 0x74, 0x79, 0x21, 0x24, 0x7b, 0x8f, + 0xc9, 0x88, 0xc1, 0xf3, 0x83, 0x92, 0xc8, 0xf2, 0xc2, 0x60, 0x7a, 0xc9, 0x30, 0xfc, 0xe4, 0x8f, + 0x86, 0x8d, 0xd5, 0xd3, 0xbe, 0x27, 0xfb, 0xa9, 0xc2, 0x14, 0xfa, 0x73, 0x19, 0xd0, 0x32, 0x76, + 0xce, 0x62, 0xcb, 0x9f, 0x0a, 0x90, 0x5e, 0x9f, 0xd9, 0xdb, 0xa1, 0x26, 0xfb, 0xa6, 0x30, 0x80, + 0xe7, 0x78, 0x00, 0x8b, 0x31, 0x8d, 0x27, 0x82, 0x74, 0x44, 0xe3, 0xad, 0x40, 0xde, 0x26, 0xdf, + 0x99, 0x9a, 0x3d, 0x36, 0x7a, 0xb8, 0x24, 0xc4, 0xc2, 0xd4, 0x29, 0x61, 0x95, 0x11, 0x40, 0xdf, + 0xf7, 0x27, 0x41, 0x3f, 0xc3, 0x69, 0xc7, 0xd2, 0x81, 0x99, 0x4d, 0xa6, 0x2f, 0x56, 0xba, 0xea, + 0xd2, 0xcf, 0xbe, 0x41, 0x1f, 0xcc, 0xc1, 0xf1, 0x7e, 0xd5, 0x41, 0xbf, 0x97, 0xe1, 0x76, 0xd8, + 0x31, 0x19, 0xf2, 0x33, 0x6c, 0x03, 0xd1, 0x7d, 0x51, 0x1e, 0x0f, 0x27, 0xfc, 0x65, 0xb8, 0x86, + 0x59, 0xc5, 0x17, 0xed, 0x0e, 0x76, 0x1c, 0x6c, 0x91, 0xaa, 0x4d, 0xaa, 0xfd, 0x3f, 0x2a, 0x4f, + 0x84, 0xcb, 0x75, 0xc3, 0xd6, 0xdb, 0xd8, 0x6a, 0xe8, 0x5d, 0xbb, 0x68, 0xb4, 0x1b, 0xbb, 0x8e, + 0x69, 0xe9, 0x1a, 0xbb, 0x4a, 0x72, 0x52, 0x8d, 0xfa, 0xac, 0xdc, 0x08, 0x05, 0xdd, 0xae, 0x19, + 0xe7, 0x4d, 0xcd, 0x6a, 0xeb, 0xc6, 0xd6, 0xaa, 0x6e, 0x3b, 0xcc, 0x03, 0x78, 0x5f, 0x3a, 0xfa, + 0x7b, 0x59, 0xf4, 0x30, 0xdd, 0x00, 0x58, 0x23, 0x3a, 0x94, 0xe7, 0xc8, 0x22, 0xc7, 0xe3, 0x92, + 0xd1, 0x4e, 0xa6, 0x2c, 0xcf, 0x1a, 0xb7, 0x21, 0xd1, 0x7f, 0x04, 0x27, 0x5d, 0x0b, 0x4d, 0xf7, + 0x0c, 0x81, 0xb3, 0x65, 0xb5, 0xb2, 0x54, 0x29, 0xbb, 0x66, 0xc5, 0x09, 0x38, 0x16, 0x7c, 0x5b, + 0xbc, 0xaf, 0x59, 0x2f, 0x57, 0x1b, 0x85, 0x49, 0xb7, 0x9f, 0xa2, 0xc9, 0x4b, 0xc5, 0xca, 0x6a, + 0x79, 0xb1, 0xd9, 0xa8, 0xb9, 0x5f, 0x16, 0x87, 0x33, 0x2d, 0xd0, 0x83, 0x59, 0x38, 0x4a, 0x64, + 0x7b, 0x89, 0x48, 0xd5, 0x15, 0x4a, 0x8f, 0xaf, 0xad, 0x0f, 0xd0, 0x14, 0x15, 0x2f, 0xfa, 0xac, + 0xf0, 0x4d, 0x99, 0x21, 0x08, 0x7b, 0xca, 0x88, 0xd0, 0x8c, 0xef, 0x49, 0x22, 0x11, 0x2a, 0x84, + 0xc9, 0x26, 0x53, 0x8a, 0x7f, 0x1d, 0xf7, 0x88, 0x13, 0x0d, 0x3e, 0xb1, 0x32, 0x4b, 0xe4, 0xe7, + 0xa7, 0xae, 0x57, 0x54, 0xa2, 0x0e, 0x73, 0x00, 0x24, 0x85, 0x68, 0x10, 0xd5, 0x83, 0xbe, 0xe3, + 0x55, 0x94, 0x1e, 0x14, 0x4b, 0x8d, 0xca, 0xd9, 0x72, 0x94, 0x1e, 0x7c, 0x46, 0x86, 0xc9, 0x65, + 0xec, 0xb8, 0x73, 0x2a, 0x1b, 0x3d, 0x49, 0x60, 0xfd, 0xc7, 0x35, 0x63, 0x3a, 0x66, 0x4b, 0xeb, + 0xf8, 0xcb, 0x00, 0xf4, 0x0d, 0x3d, 0x73, 0x18, 0x13, 0xc4, 0x2b, 0x3a, 0x62, 0xbc, 0xfa, 0x69, + 0xc8, 0x39, 0xee, 0x67, 0xb6, 0x0c, 0xfd, 0x13, 0x91, 0xc3, 0x95, 0x4b, 0x64, 0x51, 0x73, 0x34, + 0x95, 0xe6, 0x0f, 0x8d, 0x4e, 0x82, 0xb6, 0x4b, 0x04, 0x23, 0x3f, 0x8a, 0xf6, 0xe7, 0xdf, 0xca, + 0x70, 0x82, 0xb6, 0x8f, 0x62, 0xb7, 0x5b, 0x77, 0x4c, 0x0b, 0xab, 0xb8, 0x85, 0xf5, 0xae, 0xd3, + 0xb3, 0xbe, 0x67, 0xd1, 0x54, 0x6f, 0xb3, 0x99, 0xbd, 0xa2, 0xd7, 0xcb, 0xa2, 0x31, 0x98, 0xf7, + 0xb5, 0xc7, 0x9e, 0xf2, 0x22, 0x1a, 0xfb, 0xc7, 0x24, 0x91, 0xa8, 0xca, 0x09, 0x89, 0x27, 0x03, + 0xea, 0xc3, 0x87, 0x00, 0x94, 0xb7, 0x72, 0xa3, 0x96, 0x4b, 0xe5, 0xca, 0xba, 0x3b, 0x08, 0x5c, + 0x0d, 0x57, 0xae, 0x6f, 0xa8, 0xa5, 0x95, 0x62, 0xbd, 0xdc, 0x54, 0xcb, 0xcb, 0x95, 0x7a, 0x83, + 0x39, 0x65, 0xd1, 0xbf, 0x26, 0x94, 0xab, 0xe0, 0x54, 0x7d, 0x63, 0xa1, 0x5e, 0x52, 0x2b, 0xeb, + 0x24, 0x5d, 0x2d, 0x57, 0xcb, 0xe7, 0xd8, 0xd7, 0x49, 0xf4, 0xfe, 0x02, 0x4c, 0xbb, 0x13, 0x80, + 0x3a, 0x9d, 0x17, 0xa0, 0x6f, 0x67, 0x61, 0x5a, 0xc5, 0xb6, 0xd9, 0xd9, 0x23, 0x73, 0x84, 0x71, + 0x4d, 0x3d, 0xbe, 0x2b, 0x8b, 0x9e, 0xdf, 0x0e, 0x31, 0x3b, 0x1f, 0x62, 0x34, 0x7a, 0xa2, 0xa9, + 0xed, 0x69, 0x7a, 0x47, 0x3b, 0xcf, 0xba, 0x9a, 0x49, 0x35, 0x48, 0x50, 0xe6, 0x41, 0x31, 0x2f, + 0x1a, 0xd8, 0xaa, 0xb7, 0x2e, 0x96, 0x9d, 0xed, 0x62, 0xbb, 0x6d, 0x61, 0xdb, 0x66, 0xab, 0x17, + 0x7d, 0xbe, 0x28, 0x37, 0xc0, 0x51, 0x92, 0x1a, 0xca, 0x4c, 0x1d, 0x64, 0x7a, 0x93, 0xfd, 0x9c, + 0x45, 0xe3, 0x92, 0x97, 0x33, 0x17, 0xca, 0x19, 0x24, 0x87, 0x8f, 0x4b, 0xe4, 0xf9, 0x53, 0x3a, + 0xd7, 0xc0, 0xb4, 0xa1, 0xed, 0xe0, 0xf2, 0x03, 0x5d, 0xdd, 0xc2, 0x36, 0x71, 0x8c, 0x91, 0xd5, + 0x70, 0x12, 0xfa, 0xa0, 0xd0, 0x79, 0x73, 0x31, 0x89, 0x25, 0xd3, 0xfd, 0xe5, 0x21, 0x54, 0xbf, + 0x4f, 0x3f, 0x23, 0xa3, 0xf7, 0xcb, 0x30, 0xc3, 0x98, 0x2a, 0x1a, 0x97, 0x2a, 0x6d, 0x74, 0x35, + 0x67, 0xfc, 0x6a, 0x6e, 0x9a, 0x67, 0xfc, 0x92, 0x17, 0xf4, 0x2b, 0xb2, 0xa8, 0xbb, 0x73, 0x9f, + 0x8a, 0x93, 0x32, 0xa2, 0x1d, 0x47, 0x37, 0xcd, 0x5d, 0xe6, 0xa8, 0x3a, 0xa9, 0xd2, 0x97, 0x34, + 0x17, 0xf5, 0xd0, 0x87, 0x84, 0x9c, 0xa9, 0x05, 0xab, 0x71, 0x48, 0x00, 0x7e, 0x42, 0x86, 0x39, + 0xc6, 0x55, 0x9d, 0x9d, 0xf3, 0x11, 0x3a, 0xf0, 0xf6, 0xab, 0xc2, 0x86, 0x60, 0x9f, 0xfa, 0xb3, + 0x92, 0x1e, 0x36, 0x40, 0x7e, 0x44, 0x28, 0x38, 0x9a, 0x70, 0x45, 0x0e, 0x09, 0xca, 0xb7, 0x67, + 0x61, 0x7a, 0xc3, 0xc6, 0x16, 0xf3, 0xdb, 0x47, 0xaf, 0xc9, 0x82, 0xbc, 0x8c, 0xb9, 0x8d, 0xd4, + 0xe7, 0x0b, 0x7b, 0xf8, 0x86, 0x2b, 0x1b, 0x22, 0xea, 0xda, 0x48, 0x11, 0xb0, 0x5d, 0x0f, 0x73, + 0x54, 0xa4, 0x45, 0xc7, 0x71, 0x8d, 0x44, 0xcf, 0x9b, 0xb6, 0x27, 0x75, 0x14, 0x5b, 0x45, 0xa4, + 0x2c, 0x37, 0x4b, 0xc9, 0xe5, 0x69, 0x15, 0x6f, 0xd2, 0xf9, 0x6c, 0x56, 0xed, 0x49, 0x55, 0x6e, + 0x81, 0xcb, 0xcc, 0x2e, 0xa6, 0xe7, 0x57, 0x42, 0x99, 0x73, 0x24, 0x73, 0xbf, 0x4f, 0xe8, 0xdb, + 0x42, 0xbe, 0xba, 0xe2, 0xd2, 0x49, 0xa6, 0x0b, 0xdd, 0xd1, 0x98, 0x24, 0xc7, 0xa1, 0xe0, 0xe6, + 0x20, 0xfb, 0x2f, 0x6a, 0xb9, 0x5e, 0x5b, 0x3d, 0x5b, 0xee, 0xbf, 0x8c, 0x91, 0x43, 0xcf, 0x92, + 0x61, 0x6a, 0xc1, 0x32, 0xb5, 0x76, 0x4b, 0xb3, 0x1d, 0xf4, 0x7d, 0x09, 0x66, 0xd6, 0xb5, 0x4b, + 0x1d, 0x53, 0x6b, 0x13, 0xff, 0xfe, 0x9e, 0xbe, 0xa0, 0x4b, 0x3f, 0x79, 0x7d, 0x01, 0x7b, 0xe5, + 0x0f, 0x06, 0xfa, 0x47, 0xf7, 0x32, 0x22, 0x17, 0x6a, 0xfa, 0xdb, 0x7c, 0x52, 0xbf, 0x60, 0xa5, + 0x1e, 0x5f, 0xf3, 0x61, 0x9e, 0x22, 0x2c, 0xca, 0xf7, 0x8b, 0x85, 0x1f, 0x15, 0x21, 0x79, 0x38, + 0xbb, 0xf2, 0xcf, 0x9e, 0x84, 0xfc, 0x22, 0x26, 0x56, 0xdc, 0xff, 0x90, 0x60, 0xa2, 0x8e, 0x1d, + 0x62, 0xc1, 0xdd, 0xc6, 0x79, 0x0a, 0xb7, 0x49, 0x86, 0xc0, 0x89, 0xdd, 0x7b, 0x77, 0x27, 0xeb, + 0xa1, 0xf3, 0xd6, 0xe4, 0x39, 0x81, 0x47, 0x22, 0x2d, 0x77, 0x9e, 0x95, 0x79, 0x20, 0x8f, 0xc4, + 0x58, 0x52, 0xe9, 0xfb, 0x5a, 0xbd, 0x53, 0x62, 0xae, 0x55, 0xa1, 0x5e, 0xef, 0x55, 0x61, 0xfd, + 0x8c, 0xf5, 0x36, 0x63, 0xcc, 0xc7, 0x38, 0x47, 0x3d, 0x0e, 0x26, 0xa8, 0xcc, 0xbd, 0xf9, 0x68, + 0xaf, 0x9f, 0x02, 0x25, 0x41, 0xce, 0x5e, 0x7b, 0x39, 0x05, 0x5d, 0xd4, 0xa2, 0x0b, 0x1f, 0x4b, + 0x0c, 0x82, 0x99, 0x2a, 0x76, 0x2e, 0x9a, 0xd6, 0x85, 0xba, 0xa3, 0x39, 0x18, 0xfd, 0xab, 0x04, + 0x72, 0x1d, 0x3b, 0xe1, 0xe8, 0x27, 0x55, 0x38, 0x46, 0x2b, 0xc4, 0x32, 0x92, 0xfe, 0x9b, 0x56, + 0xe4, 0x9a, 0xbe, 0x42, 0x08, 0xe5, 0x53, 0xf7, 0xff, 0x8a, 0x7e, 0xb3, 0x6f, 0xd0, 0x27, 0xa9, + 0xcf, 0xa4, 0x81, 0x49, 0x26, 0xcc, 0xa0, 0xab, 0x60, 0x11, 0x7a, 0xfa, 0x01, 0x21, 0xb3, 0x5a, + 0x8c, 0xe6, 0xe1, 0x74, 0x05, 0x1f, 0xb9, 0x02, 0xb2, 0xa5, 0x6d, 0xcd, 0x41, 0xef, 0x90, 0x01, + 0x8a, 0xed, 0xf6, 0x1a, 0xf5, 0x01, 0x0f, 0x3b, 0xa4, 0x9d, 0x81, 0x99, 0xd6, 0xb6, 0x16, 0xdc, + 0x6d, 0x42, 0xfb, 0x03, 0x2e, 0x4d, 0x79, 0x7c, 0xe0, 0x4c, 0x4e, 0xa5, 0x8a, 0x7a, 0x60, 0x72, + 0xcb, 0x60, 0xb4, 0x7d, 0x47, 0x73, 0x3e, 0x14, 0x66, 0xec, 0x11, 0x3a, 0xf7, 0xf7, 0xf9, 0x80, + 0xbd, 0xe8, 0x39, 0x1c, 0x23, 0xed, 0x1f, 0xb0, 0x09, 0x12, 0x12, 0x9e, 0xf4, 0x16, 0x0b, 0xe8, + 0x11, 0xcf, 0xd7, 0x58, 0x42, 0xd7, 0x2a, 0xe5, 0xb6, 0xee, 0x89, 0x96, 0x05, 0xcc, 0x42, 0xcf, + 0xcb, 0x24, 0x83, 0x2f, 0x5e, 0x70, 0x77, 0xc3, 0x2c, 0x6e, 0xeb, 0x0e, 0xf6, 0x6a, 0xc9, 0x04, + 0x18, 0x07, 0x31, 0xff, 0x03, 0x7a, 0x86, 0x70, 0xd0, 0x35, 0x22, 0xd0, 0xfd, 0x35, 0x8a, 0x68, + 0x7f, 0x62, 0x61, 0xd4, 0xc4, 0x68, 0xa6, 0x0f, 0xd6, 0x33, 0x65, 0x38, 0xd1, 0x30, 0xb7, 0xb6, + 0x3a, 0xd8, 0x13, 0x13, 0xa6, 0xde, 0x99, 0x48, 0x1b, 0x25, 0x5c, 0x64, 0x27, 0xc8, 0xbc, 0x5f, + 0xf7, 0x8f, 0x92, 0xb9, 0x2f, 0xfc, 0x89, 0xa9, 0xd8, 0x59, 0x14, 0x11, 0x57, 0x5f, 0x3e, 0x23, + 0x50, 0x10, 0x0b, 0xf8, 0x2c, 0x4c, 0x36, 0x7d, 0x20, 0xbe, 0x24, 0xc1, 0x2c, 0xbd, 0xb9, 0xd2, + 0x53, 0xd0, 0x7b, 0x47, 0x08, 0x00, 0xfa, 0x7e, 0x46, 0xd4, 0xcf, 0x96, 0xc8, 0x84, 0xe3, 0x24, + 0x42, 0xc4, 0x62, 0x41, 0x55, 0x06, 0x92, 0x4b, 0x5f, 0xb4, 0x7f, 0x22, 0xc3, 0xf4, 0x32, 0xf6, + 0x5a, 0x9a, 0x9d, 0xb8, 0x27, 0x3a, 0x03, 0x33, 0xe4, 0xfa, 0xb6, 0x1a, 0x3b, 0x26, 0x49, 0x57, + 0xcd, 0xb8, 0x34, 0xe5, 0x3a, 0x98, 0x3d, 0x8f, 0x37, 0x4d, 0x0b, 0xd7, 0xb8, 0xb3, 0x94, 0x7c, + 0x62, 0x44, 0x78, 0x3a, 0x2e, 0x0e, 0xda, 0x02, 0x8f, 0xcd, 0x4d, 0xfb, 0x85, 0x19, 0xaa, 0x4a, + 0xc4, 0x98, 0xf3, 0x04, 0x98, 0x64, 0xc8, 0x7b, 0x66, 0x5a, 0x5c, 0xbf, 0xe8, 0xe7, 0x45, 0xaf, + 0xf3, 0x11, 0x2d, 0x73, 0x88, 0x3e, 0x36, 0x09, 0x13, 0x63, 0xb9, 0xdf, 0xbd, 0x10, 0x2a, 0x7f, + 0xe1, 0x52, 0xa5, 0x6d, 0xa3, 0xb5, 0x64, 0x98, 0x9e, 0x06, 0xf0, 0x1b, 0x87, 0x17, 0xd6, 0x22, + 0x94, 0xc2, 0x47, 0xae, 0x8f, 0x3d, 0xa8, 0xd7, 0x2b, 0x0e, 0xc2, 0xce, 0x88, 0x81, 0x11, 0x3b, + 0xe0, 0x27, 0xc2, 0x49, 0xfa, 0xe8, 0x7c, 0x5a, 0x86, 0x13, 0xfe, 0xf9, 0xa3, 0x55, 0xcd, 0x0e, + 0xda, 0x5d, 0x29, 0x19, 0x44, 0xdc, 0x81, 0x0f, 0xbf, 0xb1, 0x7c, 0x27, 0xd9, 0x98, 0xd1, 0x97, + 0x93, 0xd1, 0xa2, 0xa3, 0xdc, 0x04, 0xc7, 0x8c, 0xdd, 0x1d, 0x5f, 0xea, 0xa4, 0xc5, 0xb3, 0x16, + 0xbe, 0xff, 0x43, 0x92, 0x91, 0x49, 0x84, 0xf9, 0xb1, 0xcc, 0x29, 0xb9, 0x23, 0x5d, 0x8f, 0x49, + 0x04, 0x23, 0xfa, 0xe7, 0x4c, 0xa2, 0xde, 0x6d, 0xf0, 0x99, 0xaf, 0x04, 0xbd, 0xd4, 0x61, 0x1e, + 0xf8, 0xfa, 0x4e, 0x16, 0xe4, 0x62, 0x57, 0x47, 0x1f, 0x92, 0x60, 0xba, 0xee, 0x68, 0x96, 0x53, + 0xc7, 0xd6, 0x1e, 0xb6, 0xc2, 0x33, 0xf3, 0xd7, 0x0b, 0xcf, 0x35, 0x8a, 0x5d, 0x7d, 0x3e, 0x44, + 0x24, 0x42, 0x32, 0x5f, 0x10, 0x9a, 0x1f, 0xc4, 0xd3, 0x4a, 0x26, 0x18, 0x3c, 0xc4, 0x94, 0xef, + 0x04, 0x1c, 0x5b, 0xaf, 0xa9, 0x0d, 0x7f, 0x77, 0x7e, 0xa3, 0x5e, 0x5e, 0x2c, 0xc8, 0x0a, 0x82, + 0x93, 0xc4, 0x4f, 0x5a, 0xf5, 0x3f, 0xd4, 0x1b, 0x45, 0xb5, 0x51, 0x5e, 0x2c, 0x64, 0xd1, 0x6b, + 0x25, 0x80, 0xba, 0x63, 0x76, 0xf7, 0x8b, 0x50, 0xfc, 0xd0, 0x3d, 0xad, 0xb6, 0x47, 0x63, 0xe0, + 0xd9, 0xa1, 0xb8, 0x45, 0x9e, 0x58, 0x52, 0xc9, 0x04, 0x78, 0xcf, 0x10, 0x02, 0x3c, 0x09, 0x0a, + 0x93, 0x54, 0xb5, 0xd6, 0xf0, 0xa5, 0x24, 0x9f, 0x99, 0x80, 0x5c, 0x79, 0xa7, 0xeb, 0x5c, 0x3a, + 0xf3, 0x48, 0x98, 0xad, 0x3b, 0x16, 0xd6, 0x76, 0x42, 0x7b, 0x51, 0x8e, 0x79, 0x01, 0x1b, 0xde, + 0x5e, 0x14, 0x79, 0xb9, 0xfd, 0x36, 0x98, 0x30, 0xcc, 0xa6, 0xb6, 0xeb, 0x6c, 0x2b, 0x57, 0xef, + 0x0b, 0xe2, 0xc0, 0xba, 0x9b, 0x1a, 0x8b, 0x9a, 0xf5, 0xb5, 0x3b, 0xc8, 0x6e, 0x44, 0xde, 0x30, + 0x8b, 0xbb, 0xce, 0xf6, 0xc2, 0x55, 0x9f, 0xf8, 0x9b, 0xd3, 0x99, 0xcf, 0xfc, 0xcd, 0xe9, 0xcc, + 0x57, 0xff, 0xe6, 0x74, 0xe6, 0x57, 0xbf, 0x7e, 0xfa, 0xc8, 0x67, 0xbe, 0x7e, 0xfa, 0xc8, 0x97, + 0xbe, 0x7e, 0xfa, 0xc8, 0xcf, 0x48, 0xdd, 0xf3, 0xe7, 0xf3, 0x84, 0xca, 0xe3, 0xfe, 0xdf, 0x00, + 0x00, 0x00, 0xff, 0xff, 0xc8, 0x6b, 0x41, 0xeb, 0xbb, 0x0a, 0x02, 0x00, } func (m *Rpc) Marshal() (dAtA []byte, err error) { @@ -78817,6 +78827,11 @@ func (m *RpcAccountLocalLinkNewChallengeRequest) MarshalToSizedBuffer(dAtA []byt _ = i var l int _ = l + if m.Scope != 0 { + i = encodeVarintCommands(dAtA, i, uint64(m.Scope)) + i-- + dAtA[i] = 0x10 + } if len(m.AppName) > 0 { i -= len(m.AppName) copy(dAtA[i:], m.AppName) @@ -121321,6 +121336,9 @@ func (m *RpcAccountLocalLinkNewChallengeRequest) Size() (n int) { if l > 0 { n += 1 + l + sovCommands(uint64(l)) } + if m.Scope != 0 { + n += 1 + sovCommands(uint64(m.Scope)) + } return n } @@ -151763,6 +151781,25 @@ func (m *RpcAccountLocalLinkNewChallengeRequest) Unmarshal(dAtA []byte) error { } m.AppName = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex + case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Scope", wireType) + } + m.Scope = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowCommands + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Scope |= model.AccountAuthLocalApiScope(b&0x7F) << shift + if b < 0x80 { + break + } + } default: iNdEx = preIndex skippy, err := skipCommands(dAtA[iNdEx:]) diff --git a/pb/events.pb.go b/pb/events.pb.go index ac161eca4..c0d64043a 100644 --- a/pb/events.pb.go +++ b/pb/events.pb.go @@ -333,6 +333,7 @@ type EventMessage struct { // *EventMessageValueOfAccountConfigUpdate // *EventMessageValueOfAccountUpdate // *EventMessageValueOfAccountLinkChallenge + // *EventMessageValueOfAccountLinkChallengeHide // *EventMessageValueOfObjectDetailsSet // *EventMessageValueOfObjectDetailsAmend // *EventMessageValueOfObjectDetailsUnset @@ -459,6 +460,9 @@ type EventMessageValueOfAccountUpdate struct { type EventMessageValueOfAccountLinkChallenge struct { AccountLinkChallenge *EventAccountLinkChallenge `protobuf:"bytes,204,opt,name=accountLinkChallenge,proto3,oneof" json:"accountLinkChallenge,omitempty"` } +type EventMessageValueOfAccountLinkChallengeHide struct { + AccountLinkChallengeHide *EventAccountLinkChallengeHide `protobuf:"bytes,205,opt,name=accountLinkChallengeHide,proto3,oneof" json:"accountLinkChallengeHide,omitempty"` +} type EventMessageValueOfObjectDetailsSet struct { ObjectDetailsSet *EventObjectDetailsSet `protobuf:"bytes,16,opt,name=objectDetailsSet,proto3,oneof" json:"objectDetailsSet,omitempty"` } @@ -672,6 +676,7 @@ func (*EventMessageValueOfAccountDetails) IsEventMessageValue() func (*EventMessageValueOfAccountConfigUpdate) IsEventMessageValue() {} func (*EventMessageValueOfAccountUpdate) IsEventMessageValue() {} func (*EventMessageValueOfAccountLinkChallenge) IsEventMessageValue() {} +func (*EventMessageValueOfAccountLinkChallengeHide) IsEventMessageValue() {} func (*EventMessageValueOfObjectDetailsSet) IsEventMessageValue() {} func (*EventMessageValueOfObjectDetailsAmend) IsEventMessageValue() {} func (*EventMessageValueOfObjectDetailsUnset) IsEventMessageValue() {} @@ -791,6 +796,13 @@ func (m *EventMessage) GetAccountLinkChallenge() *EventAccountLinkChallenge { return nil } +func (m *EventMessage) GetAccountLinkChallengeHide() *EventAccountLinkChallengeHide { + if x, ok := m.GetValue().(*EventMessageValueOfAccountLinkChallengeHide); ok { + return x.AccountLinkChallengeHide + } + return nil +} + func (m *EventMessage) GetObjectDetailsSet() *EventObjectDetailsSet { if x, ok := m.GetValue().(*EventMessageValueOfObjectDetailsSet); ok { return x.ObjectDetailsSet @@ -1282,6 +1294,7 @@ func (*EventMessage) XXX_OneofWrappers() []interface{} { (*EventMessageValueOfAccountConfigUpdate)(nil), (*EventMessageValueOfAccountUpdate)(nil), (*EventMessageValueOfAccountLinkChallenge)(nil), + (*EventMessageValueOfAccountLinkChallengeHide)(nil), (*EventMessageValueOfObjectDetailsSet)(nil), (*EventMessageValueOfObjectDetailsAmend)(nil), (*EventMessageValueOfObjectDetailsUnset)(nil), @@ -1883,6 +1896,7 @@ func (m *EventAccountUpdate) GetStatus() *model.AccountStatus { type EventAccountLinkChallenge struct { Challenge string `protobuf:"bytes,1,opt,name=challenge,proto3" json:"challenge,omitempty"` ClientInfo *EventAccountLinkChallengeClientInfo `protobuf:"bytes,2,opt,name=clientInfo,proto3" json:"clientInfo,omitempty"` + Scope model.AccountAuthLocalApiScope `protobuf:"varint,3,opt,name=scope,proto3,enum=anytype.model.AccountAuthLocalApiScope" json:"scope,omitempty"` } func (m *EventAccountLinkChallenge) Reset() { *m = EventAccountLinkChallenge{} } @@ -1932,6 +1946,13 @@ func (m *EventAccountLinkChallenge) GetClientInfo() *EventAccountLinkChallengeCl return nil } +func (m *EventAccountLinkChallenge) GetScope() model.AccountAuthLocalApiScope { + if m != nil { + return m.Scope + } + return model.AccountAuth_Limited +} + type EventAccountLinkChallengeClientInfo struct { ProcessName string `protobuf:"bytes,1,opt,name=processName,proto3" json:"processName,omitempty"` ProcessPath string `protobuf:"bytes,2,opt,name=processPath,proto3" json:"processPath,omitempty"` @@ -1992,6 +2013,50 @@ func (m *EventAccountLinkChallengeClientInfo) GetSignatureVerified() bool { return false } +type EventAccountLinkChallengeHide struct { + Challenge string `protobuf:"bytes,1,opt,name=challenge,proto3" json:"challenge,omitempty"` +} + +func (m *EventAccountLinkChallengeHide) Reset() { *m = EventAccountLinkChallengeHide{} } +func (m *EventAccountLinkChallengeHide) String() string { return proto.CompactTextString(m) } +func (*EventAccountLinkChallengeHide) ProtoMessage() {} +func (*EventAccountLinkChallengeHide) Descriptor() ([]byte, []int) { + return fileDescriptor_a966342d378ae5f5, []int{0, 2, 5} +} +func (m *EventAccountLinkChallengeHide) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *EventAccountLinkChallengeHide) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_EventAccountLinkChallengeHide.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 *EventAccountLinkChallengeHide) XXX_Merge(src proto.Message) { + xxx_messageInfo_EventAccountLinkChallengeHide.Merge(m, src) +} +func (m *EventAccountLinkChallengeHide) XXX_Size() int { + return m.Size() +} +func (m *EventAccountLinkChallengeHide) XXX_DiscardUnknown() { + xxx_messageInfo_EventAccountLinkChallengeHide.DiscardUnknown(m) +} + +var xxx_messageInfo_EventAccountLinkChallengeHide proto.InternalMessageInfo + +func (m *EventAccountLinkChallengeHide) GetChallenge() string { + if m != nil { + return m.Challenge + } + return "" +} + type EventObject struct { } @@ -12070,6 +12135,7 @@ func init() { proto.RegisterType((*EventAccountUpdate)(nil), "anytype.Event.Account.Update") proto.RegisterType((*EventAccountLinkChallenge)(nil), "anytype.Event.Account.LinkChallenge") proto.RegisterType((*EventAccountLinkChallengeClientInfo)(nil), "anytype.Event.Account.LinkChallenge.ClientInfo") + proto.RegisterType((*EventAccountLinkChallengeHide)(nil), "anytype.Event.Account.LinkChallengeHide") proto.RegisterType((*EventObject)(nil), "anytype.Event.Object") proto.RegisterType((*EventObjectDetails)(nil), "anytype.Event.Object.Details") proto.RegisterType((*EventObjectDetailsAmend)(nil), "anytype.Event.Object.Details.Amend") @@ -12268,392 +12334,395 @@ func init() { func init() { proto.RegisterFile("pb/protos/events.proto", fileDescriptor_a966342d378ae5f5) } var fileDescriptor_a966342d378ae5f5 = []byte{ - // 6151 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x5c, 0x4b, 0x8c, 0x1c, 0xc7, - 0x79, 0x9e, 0xf7, 0xe3, 0x5f, 0x72, 0x39, 0x2c, 0x52, 0x54, 0xab, 0x45, 0x51, 0xd4, 0x8a, 0xa4, - 0x68, 0x89, 0x1a, 0x52, 0x24, 0x45, 0xca, 0xb4, 0xf8, 0xd8, 0x17, 0x35, 0xc3, 0xc7, 0x72, 0x5d, - 0x4b, 0xd2, 0xb2, 0x6c, 0x04, 0xee, 0x9d, 0xae, 0x9d, 0x6d, 0x73, 0xb6, 0x7b, 0xdc, 0xdd, 0xbb, - 0xe4, 0xda, 0x8e, 0xe3, 0xd8, 0x0e, 0x82, 0x00, 0x09, 0x92, 0x43, 0x90, 0x04, 0xb9, 0x04, 0x08, - 0x12, 0x20, 0x87, 0x20, 0x48, 0x90, 0x4b, 0x72, 0x88, 0x11, 0x20, 0x08, 0xf2, 0x3c, 0xd8, 0xb7, - 0x5c, 0x02, 0x1b, 0xf2, 0x25, 0x87, 0xe4, 0xe0, 0x04, 0x08, 0x72, 0x0a, 0x82, 0x7a, 0x74, 0x75, - 0x55, 0x3f, 0xa6, 0x67, 0x2c, 0x39, 0x0f, 0xc4, 0xa7, 0x99, 0xaa, 0xfa, 0xff, 0xef, 0xaf, 0xc7, - 0xff, 0xff, 0x55, 0xf5, 0x57, 0x75, 0xc1, 0xb1, 0xf1, 0xe6, 0xf9, 0xb1, 0xef, 0x85, 0x5e, 0x70, - 0x9e, 0xec, 0x11, 0x37, 0x0c, 0xba, 0x2c, 0x85, 0x9a, 0x96, 0xbb, 0x1f, 0xee, 0x8f, 0x89, 0x79, - 0x6a, 0xfc, 0x64, 0x78, 0x7e, 0xe4, 0x6c, 0x9e, 0x1f, 0x6f, 0x9e, 0xdf, 0xf1, 0x6c, 0x32, 0x8a, - 0xc8, 0x59, 0x42, 0x90, 0x9b, 0xc7, 0x87, 0x9e, 0x37, 0x1c, 0x11, 0x5e, 0xb6, 0xb9, 0xbb, 0x75, - 0x3e, 0x08, 0xfd, 0xdd, 0x41, 0xc8, 0x4b, 0x17, 0xfe, 0xec, 0xdb, 0x65, 0xa8, 0xaf, 0x52, 0x78, - 0x74, 0x11, 0x5a, 0x3b, 0x24, 0x08, 0xac, 0x21, 0x09, 0x8c, 0xf2, 0xc9, 0xea, 0xd9, 0xb9, 0x8b, - 0xc7, 0xba, 0x42, 0x54, 0x97, 0x51, 0x74, 0xef, 0xf3, 0x62, 0x2c, 0xe9, 0xd0, 0x71, 0x68, 0x0f, - 0x3c, 0x37, 0x24, 0xcf, 0xc2, 0xbe, 0x6d, 0x54, 0x4e, 0x96, 0xcf, 0xb6, 0x71, 0x9c, 0x81, 0x2e, - 0x43, 0xdb, 0x71, 0x9d, 0xd0, 0xb1, 0x42, 0xcf, 0x37, 0xaa, 0x27, 0xcb, 0x1a, 0x24, 0xab, 0x64, - 0x77, 0x71, 0x30, 0xf0, 0x76, 0xdd, 0x10, 0xc7, 0x84, 0xc8, 0x80, 0x66, 0xe8, 0x5b, 0x03, 0xd2, - 0xb7, 0x8d, 0x1a, 0x43, 0x8c, 0x92, 0xe6, 0xf7, 0x2f, 0x40, 0x53, 0xd4, 0x01, 0xbd, 0x00, 0xcd, - 0x60, 0xcc, 0xa9, 0xbe, 0x55, 0xe6, 0x64, 0x22, 0x8d, 0x6e, 0xc2, 0x9c, 0xc5, 0x61, 0x37, 0xb6, - 0xbd, 0xa7, 0x46, 0x99, 0x09, 0x7e, 0x31, 0xd1, 0x16, 0x21, 0xb8, 0x4b, 0x49, 0x7a, 0x25, 0xac, - 0x72, 0xa0, 0x3e, 0xcc, 0x8b, 0xe4, 0x0a, 0x09, 0x2d, 0x67, 0x14, 0x18, 0x7f, 0xc3, 0x41, 0x4e, - 0xe4, 0x80, 0x08, 0xb2, 0x5e, 0x09, 0x27, 0x18, 0xd1, 0x67, 0xe1, 0x88, 0xc8, 0x59, 0xf6, 0xdc, - 0x2d, 0x67, 0xf8, 0x68, 0x6c, 0x5b, 0x21, 0x31, 0xfe, 0x96, 0xe3, 0x9d, 0xca, 0xc1, 0xe3, 0xb4, - 0x5d, 0x4e, 0xdc, 0x2b, 0xe1, 0x2c, 0x0c, 0x74, 0x1b, 0x0e, 0x8a, 0x6c, 0x01, 0xfa, 0x77, 0x1c, - 0xf4, 0xa5, 0x1c, 0x50, 0x89, 0xa6, 0xb3, 0xa1, 0xcf, 0xc1, 0x51, 0x91, 0x71, 0xcf, 0x71, 0x9f, - 0x2c, 0x6f, 0x5b, 0xa3, 0x11, 0x71, 0x87, 0xc4, 0xf8, 0xfb, 0xc9, 0x75, 0xd4, 0x88, 0x7b, 0x25, - 0x9c, 0x09, 0x82, 0x1e, 0x40, 0xc7, 0xdb, 0xfc, 0x22, 0x19, 0x44, 0x1d, 0xb2, 0x41, 0x42, 0xa3, - 0xc3, 0x70, 0x5f, 0x49, 0xe0, 0x3e, 0x60, 0x64, 0x51, 0x57, 0x76, 0x37, 0x48, 0xd8, 0x2b, 0xe1, - 0x14, 0x33, 0x7a, 0x04, 0x48, 0xcb, 0x5b, 0xdc, 0x21, 0xae, 0x6d, 0x5c, 0x64, 0x90, 0xaf, 0x4e, - 0x86, 0x64, 0xa4, 0xbd, 0x12, 0xce, 0x00, 0x48, 0xc1, 0x3e, 0x72, 0x03, 0x12, 0x1a, 0x97, 0xa6, - 0x81, 0x65, 0xa4, 0x29, 0x58, 0x96, 0x4b, 0xfb, 0x96, 0xe7, 0x62, 0x32, 0xb2, 0x42, 0xc7, 0x73, - 0x45, 0x7d, 0x2f, 0x33, 0xe0, 0xd3, 0xd9, 0xc0, 0x92, 0x56, 0xd6, 0x38, 0x13, 0x04, 0xfd, 0x14, - 0x3c, 0x97, 0xc8, 0xc7, 0x64, 0xc7, 0xdb, 0x23, 0xc6, 0xdb, 0x0c, 0xfd, 0x4c, 0x11, 0x3a, 0xa7, - 0xee, 0x95, 0x70, 0x36, 0x0c, 0x5a, 0x82, 0x03, 0x51, 0x01, 0x83, 0xbd, 0xc2, 0x60, 0x8f, 0xe7, - 0xc1, 0x0a, 0x30, 0x8d, 0x87, 0xda, 0x22, 0x4f, 0x2f, 0x8f, 0xbc, 0x80, 0x18, 0x8b, 0x99, 0xb6, - 0x28, 0x20, 0x18, 0x09, 0xb5, 0x45, 0x85, 0x43, 0x6d, 0x64, 0x10, 0xfa, 0xce, 0x80, 0x55, 0x90, - 0x6a, 0xd1, 0xd5, 0xc9, 0x8d, 0x8c, 0x89, 0x85, 0x2a, 0x65, 0xc3, 0x20, 0x0c, 0x87, 0x82, 0xdd, - 0xcd, 0x60, 0xe0, 0x3b, 0x63, 0x9a, 0xb7, 0x68, 0xdb, 0xc6, 0xbb, 0x93, 0x90, 0x37, 0x14, 0xe2, - 0xee, 0xa2, 0x4d, 0x47, 0x27, 0x09, 0x80, 0x3e, 0x07, 0x48, 0xcd, 0x12, 0xdd, 0x77, 0x9d, 0xc1, - 0x7e, 0x62, 0x0a, 0x58, 0xd9, 0x97, 0x19, 0x30, 0xc8, 0x82, 0xa3, 0x6a, 0xee, 0xba, 0x17, 0x38, - 0xf4, 0xd7, 0xb8, 0xc1, 0xe0, 0xdf, 0x98, 0x02, 0x3e, 0x62, 0xa1, 0x8a, 0x95, 0x05, 0x95, 0x14, - 0xb1, 0x4c, 0xcd, 0x9a, 0xf8, 0x81, 0x71, 0x73, 0x6a, 0x11, 0x11, 0x4b, 0x52, 0x44, 0x94, 0x9f, - 0xec, 0xa2, 0xf7, 0x7c, 0x6f, 0x77, 0x1c, 0x18, 0xb7, 0xa6, 0xee, 0x22, 0xce, 0x90, 0xec, 0x22, - 0x9e, 0x8b, 0xae, 0x40, 0x6b, 0x73, 0xe4, 0x0d, 0x9e, 0xd0, 0xc1, 0xac, 0x30, 0x48, 0x23, 0x01, - 0xb9, 0x44, 0x8b, 0xc5, 0xf0, 0x49, 0x5a, 0xaa, 0xac, 0xec, 0xff, 0x0a, 0x19, 0x91, 0x90, 0x88, - 0x19, 0xeb, 0xc5, 0x4c, 0x56, 0x4e, 0x42, 0x95, 0x55, 0xe1, 0x40, 0x2b, 0x30, 0xb7, 0xe5, 0x8c, - 0x48, 0xf0, 0x68, 0x3c, 0xf2, 0x2c, 0x3e, 0x7d, 0xcd, 0x5d, 0x3c, 0x99, 0x09, 0x70, 0x3b, 0xa6, - 0xa3, 0x28, 0x0a, 0x1b, 0xba, 0x01, 0xed, 0x1d, 0xcb, 0x7f, 0x12, 0xf4, 0xdd, 0x2d, 0xcf, 0xa8, - 0x67, 0x4e, 0x3c, 0x1c, 0xe3, 0x7e, 0x44, 0xd5, 0x2b, 0xe1, 0x98, 0x85, 0x4e, 0x5f, 0xac, 0x52, - 0x1b, 0x24, 0xbc, 0xed, 0x90, 0x91, 0x1d, 0x18, 0x0d, 0x06, 0xf2, 0x72, 0x26, 0xc8, 0x06, 0x09, - 0xbb, 0x9c, 0x8c, 0x4e, 0x5f, 0x3a, 0x23, 0x7a, 0x1f, 0x8e, 0x44, 0x39, 0xcb, 0xdb, 0xce, 0xc8, - 0xf6, 0x89, 0xdb, 0xb7, 0x03, 0xa3, 0x99, 0x39, 0x33, 0xc4, 0x78, 0x0a, 0x2d, 0x9d, 0xbd, 0x32, - 0x20, 0xa8, 0x67, 0x8c, 0xb2, 0x55, 0x93, 0x34, 0x5a, 0x99, 0x9e, 0x31, 0x86, 0x56, 0x89, 0xa9, - 0x76, 0x65, 0x81, 0x20, 0x1b, 0x9e, 0x8f, 0xf2, 0x97, 0xac, 0xc1, 0x93, 0xa1, 0xef, 0xed, 0xba, - 0xf6, 0xb2, 0x37, 0xf2, 0x7c, 0xa3, 0xcd, 0xf0, 0xcf, 0xe6, 0xe2, 0x27, 0xe8, 0x7b, 0x25, 0x9c, - 0x07, 0x85, 0x96, 0xe1, 0x40, 0x54, 0xf4, 0x90, 0x3c, 0x0b, 0x0d, 0xc8, 0x9c, 0x7e, 0x63, 0x68, - 0x4a, 0x44, 0x1d, 0xa4, 0xca, 0xa4, 0x82, 0x50, 0x95, 0x30, 0xe6, 0x0a, 0x40, 0x28, 0x91, 0x0a, - 0x42, 0xd3, 0x2a, 0x08, 0x9d, 0x7e, 0x8d, 0x83, 0x05, 0x20, 0x94, 0x48, 0x05, 0xa1, 0x69, 0x3a, - 0x55, 0xcb, 0x96, 0x7a, 0xde, 0x13, 0xaa, 0x4f, 0xc6, 0x7c, 0xe6, 0x54, 0xad, 0xf4, 0x96, 0x20, - 0xa4, 0x53, 0x75, 0x92, 0x99, 0x2e, 0x50, 0xa2, 0xbc, 0xc5, 0x91, 0x33, 0x74, 0x8d, 0x43, 0x13, - 0x74, 0x99, 0xa2, 0x31, 0x2a, 0xba, 0x40, 0xd1, 0xd8, 0xd0, 0x2d, 0x61, 0x96, 0x1b, 0x24, 0x5c, - 0x71, 0xf6, 0x8c, 0xc3, 0x99, 0xd3, 0x50, 0x8c, 0xb2, 0xe2, 0xec, 0x49, 0xbb, 0xe4, 0x2c, 0x6a, - 0xd3, 0xa2, 0x49, 0xce, 0x78, 0xae, 0xa0, 0x69, 0x11, 0xa1, 0xda, 0xb4, 0x28, 0x4f, 0x6d, 0xda, - 0x3d, 0x2b, 0x24, 0xcf, 0x8c, 0x17, 0x0a, 0x9a, 0xc6, 0xa8, 0xd4, 0xa6, 0xb1, 0x0c, 0x3a, 0xbb, - 0x45, 0x19, 0x8f, 0x89, 0x1f, 0x3a, 0x03, 0x6b, 0xc4, 0xbb, 0xea, 0x54, 0xe6, 0x1c, 0x14, 0xe3, - 0x69, 0xd4, 0x74, 0x76, 0xcb, 0x84, 0x51, 0x1b, 0xfe, 0xd0, 0xda, 0x1c, 0x11, 0xec, 0x3d, 0x35, - 0x4e, 0x17, 0x34, 0x3c, 0x22, 0x54, 0x1b, 0x1e, 0xe5, 0xa9, 0xbe, 0xe5, 0x33, 0x8e, 0x3d, 0x24, - 0xa1, 0x71, 0xb6, 0xc0, 0xb7, 0x70, 0x32, 0xd5, 0xb7, 0xf0, 0x1c, 0xe9, 0x01, 0x56, 0xac, 0xd0, - 0xda, 0x73, 0xc8, 0xd3, 0xc7, 0x0e, 0x79, 0x4a, 0x27, 0xf6, 0x23, 0x13, 0x3c, 0x40, 0x44, 0xdb, - 0x15, 0xc4, 0xd2, 0x03, 0x24, 0x40, 0xa4, 0x07, 0x50, 0xf3, 0x85, 0x5b, 0x3f, 0x3a, 0xc1, 0x03, - 0x68, 0xf8, 0xd2, 0xc7, 0xe7, 0x41, 0x21, 0x0b, 0x8e, 0xa5, 0x8a, 0x1e, 0xf8, 0x36, 0xf1, 0x8d, - 0x97, 0x98, 0x90, 0xd7, 0x8a, 0x85, 0x30, 0xf2, 0x5e, 0x09, 0xe7, 0x00, 0xa5, 0x44, 0x6c, 0x78, - 0xbb, 0xfe, 0x80, 0xd0, 0x7e, 0x7a, 0x75, 0x1a, 0x11, 0x92, 0x3c, 0x25, 0x42, 0x96, 0xa0, 0x3d, - 0x78, 0x49, 0x96, 0x50, 0xc1, 0x6c, 0x16, 0x65, 0xd2, 0xc5, 0xc6, 0xe2, 0x0c, 0x93, 0xd4, 0x9d, - 0x2c, 0x29, 0xc9, 0xd5, 0x2b, 0xe1, 0xc9, 0xb0, 0x68, 0x1f, 0x4e, 0x68, 0x04, 0x7c, 0x9e, 0x57, - 0x05, 0xbf, 0xc6, 0x04, 0x9f, 0x9f, 0x2c, 0x38, 0xc5, 0xd6, 0x2b, 0xe1, 0x02, 0x60, 0x34, 0x86, - 0x17, 0xb5, 0xce, 0x88, 0x0c, 0x5b, 0xa8, 0xc8, 0x57, 0x99, 0xdc, 0x73, 0x93, 0xe5, 0xea, 0x3c, - 0xbd, 0x12, 0x9e, 0x04, 0x89, 0x86, 0x60, 0x64, 0x16, 0xd3, 0x91, 0xfc, 0x4a, 0xe6, 0xb2, 0x27, - 0x47, 0x1c, 0x1f, 0xcb, 0x5c, 0xb0, 0x4c, 0xcd, 0x17, 0xdd, 0xf9, 0xd3, 0xd3, 0x6a, 0xbe, 0xec, - 0xc7, 0x3c, 0x28, 0x6d, 0xec, 0x68, 0xd1, 0x43, 0xcb, 0x1f, 0x92, 0x90, 0x77, 0x74, 0xdf, 0xa6, - 0x8d, 0xfa, 0xda, 0x34, 0x63, 0x97, 0x62, 0xd3, 0xc6, 0x2e, 0x13, 0x18, 0x05, 0x70, 0x5c, 0xa3, - 0xe8, 0x07, 0xcb, 0xde, 0x68, 0x44, 0x06, 0x51, 0x6f, 0xfe, 0x0c, 0x13, 0xfc, 0xe6, 0x64, 0xc1, - 0x09, 0xa6, 0x5e, 0x09, 0x4f, 0x04, 0x4d, 0xb5, 0xf7, 0xc1, 0xc8, 0x4e, 0xe8, 0x8c, 0x31, 0x95, - 0xae, 0x26, 0xd9, 0x52, 0xed, 0x4d, 0x51, 0xa4, 0x74, 0x55, 0xa1, 0xa0, 0xcd, 0x7d, 0x7e, 0x1a, - 0x5d, 0xd5, 0x79, 0x52, 0xba, 0xaa, 0x17, 0xd3, 0xd9, 0x6d, 0x37, 0x20, 0x3e, 0xc3, 0xb8, 0xe3, - 0x39, 0xae, 0xf1, 0x72, 0xe6, 0xec, 0xf6, 0x28, 0x20, 0xbe, 0x10, 0x44, 0xa9, 0xe8, 0xec, 0xa6, - 0xb1, 0x69, 0x38, 0xf7, 0xc8, 0x56, 0x68, 0x9c, 0x2c, 0xc2, 0xa1, 0x54, 0x1a, 0x0e, 0xcd, 0xa0, - 0x33, 0x85, 0xcc, 0xd8, 0x20, 0x74, 0x54, 0xb0, 0xe5, 0x0e, 0x89, 0xf1, 0x4a, 0xe6, 0x4c, 0xa1, - 0xc0, 0x29, 0xc4, 0x74, 0xa6, 0xc8, 0x02, 0xa1, 0x3b, 0x7f, 0x99, 0x4f, 0x57, 0x64, 0x1c, 0x7a, - 0x21, 0x73, 0xe7, 0xaf, 0x40, 0x4b, 0x52, 0xba, 0x07, 0x49, 0x03, 0xa0, 0x4f, 0x40, 0x6d, 0xec, - 0xb8, 0x43, 0xc3, 0x66, 0x40, 0x47, 0x12, 0x40, 0xeb, 0x8e, 0x3b, 0xec, 0x95, 0x30, 0x23, 0x41, - 0xef, 0x02, 0x8c, 0x7d, 0x6f, 0x40, 0x82, 0x60, 0x8d, 0x3c, 0x35, 0x08, 0x63, 0x30, 0x93, 0x0c, - 0x9c, 0xa0, 0xbb, 0x46, 0xe8, 0xbc, 0xac, 0xd0, 0xa3, 0x55, 0x38, 0x28, 0x52, 0xc2, 0xca, 0xb7, - 0x32, 0x17, 0x7f, 0x11, 0x40, 0x1c, 0x05, 0xd2, 0xb8, 0xe8, 0xde, 0x47, 0x64, 0xac, 0x78, 0x2e, - 0x31, 0x86, 0x99, 0x7b, 0x9f, 0x08, 0x84, 0x92, 0xd0, 0x35, 0x96, 0xc2, 0x81, 0x96, 0xe0, 0x40, - 0xb8, 0xed, 0x13, 0xcb, 0xde, 0x08, 0xad, 0x70, 0x37, 0x30, 0xdc, 0xcc, 0x65, 0x1a, 0x2f, 0xec, - 0x3e, 0x64, 0x94, 0x74, 0x09, 0xaa, 0xf2, 0xa0, 0x35, 0xe8, 0xd0, 0x8d, 0xd0, 0x3d, 0x67, 0xc7, - 0x09, 0x31, 0xb1, 0x06, 0xdb, 0xc4, 0x36, 0xbc, 0xcc, 0x4d, 0x14, 0x5d, 0xf6, 0x76, 0x55, 0x3a, - 0xba, 0x5a, 0x49, 0xf2, 0xa2, 0x1e, 0xcc, 0xd3, 0xbc, 0x8d, 0xb1, 0x35, 0x20, 0x8f, 0x02, 0x6b, - 0x48, 0x8c, 0x71, 0xa6, 0x06, 0x32, 0xb4, 0x98, 0x8a, 0x2e, 0x56, 0x74, 0xbe, 0x08, 0xe9, 0x9e, - 0x37, 0xb0, 0x46, 0x1c, 0xe9, 0x4b, 0xf9, 0x48, 0x31, 0x55, 0x84, 0x14, 0xe7, 0x68, 0x6d, 0xe4, - 0x7d, 0x6f, 0x1b, 0x7b, 0x05, 0x6d, 0x14, 0x74, 0x5a, 0x1b, 0x45, 0x1e, 0xc5, 0x73, 0xbd, 0xd0, - 0xd9, 0x72, 0x06, 0xc2, 0x7e, 0x5d, 0xdb, 0xf0, 0x33, 0xf1, 0xd6, 0x14, 0xb2, 0xee, 0x06, 0x8f, - 0x2c, 0xa5, 0x78, 0xd1, 0x43, 0x40, 0x6a, 0x9e, 0x50, 0xaa, 0x80, 0x21, 0x2e, 0x4c, 0x42, 0x94, - 0x9a, 0x95, 0xc1, 0x4f, 0x6b, 0x39, 0xb6, 0xf6, 0xe9, 0xf6, 0x76, 0xc9, 0xf7, 0x2c, 0x7b, 0x60, - 0x05, 0xa1, 0x11, 0x66, 0xd6, 0x72, 0x9d, 0x93, 0x75, 0x25, 0x1d, 0xad, 0x65, 0x92, 0x97, 0xe2, - 0xed, 0x90, 0x9d, 0x4d, 0xe2, 0x07, 0xdb, 0xce, 0x58, 0xd4, 0x71, 0x37, 0x13, 0xef, 0xbe, 0x24, - 0x8b, 0x6b, 0x98, 0xe2, 0xa5, 0x0b, 0x71, 0x16, 0x3e, 0xde, 0xd8, 0x77, 0x07, 0x5c, 0x19, 0x05, - 0xe8, 0xd3, 0xcc, 0x85, 0x38, 0xd3, 0x8c, 0x6e, 0x4c, 0x1c, 0x43, 0x67, 0xc3, 0xa0, 0xbb, 0x70, - 0x68, 0x7c, 0x71, 0xac, 0x21, 0x3f, 0xcb, 0x5c, 0x38, 0xaf, 0x5f, 0x5c, 0x4f, 0x42, 0x26, 0x39, - 0xa9, 0xa9, 0x39, 0x3b, 0x63, 0xcf, 0x0f, 0x6f, 0x3b, 0xae, 0x13, 0x6c, 0x1b, 0xfb, 0x99, 0xa6, - 0xd6, 0x67, 0x24, 0x5d, 0x4e, 0x43, 0x4d, 0x4d, 0xe5, 0x41, 0x97, 0xa1, 0x39, 0xd8, 0xb6, 0xc2, - 0x45, 0xdb, 0x36, 0xbe, 0xce, 0x03, 0xbd, 0xcf, 0x27, 0xf8, 0x97, 0xb7, 0xad, 0x50, 0x84, 0x48, - 0x22, 0x52, 0x74, 0x1d, 0x80, 0xfe, 0x15, 0x2d, 0xf8, 0xd9, 0x72, 0xa6, 0xaf, 0x62, 0x8c, 0xb2, - 0xf6, 0x0a, 0x03, 0x7a, 0x1f, 0x8e, 0xc4, 0x29, 0x6a, 0xa4, 0x7c, 0xcf, 0xff, 0x8d, 0x72, 0xa6, - 0xb7, 0x55, 0x70, 0x24, 0x6d, 0xaf, 0x84, 0xb3, 0x20, 0xa2, 0x8a, 0x89, 0xb9, 0xf8, 0x9b, 0x13, - 0x2a, 0x26, 0xe7, 0x5d, 0x85, 0x61, 0xa9, 0x09, 0xf5, 0x3d, 0x6b, 0xb4, 0x4b, 0xcc, 0x6f, 0x57, - 0xa0, 0x46, 0xc9, 0x4c, 0x02, 0x55, 0xda, 0xe0, 0x79, 0xa8, 0x38, 0xb6, 0xc1, 0x0f, 0x18, 0x2a, - 0x8e, 0x8d, 0x0c, 0x68, 0x7a, 0x74, 0x1d, 0x29, 0x8f, 0x3b, 0xa2, 0x24, 0xed, 0x50, 0x71, 0x2c, - 0x22, 0x02, 0x47, 0x66, 0xe2, 0xa8, 0x83, 0xc2, 0x46, 0x27, 0x28, 0x11, 0xa9, 0x69, 0x40, 0x43, - 0x4c, 0xf3, 0x09, 0x49, 0xe6, 0x1a, 0x34, 0x44, 0xaf, 0x25, 0xeb, 0xa0, 0x48, 0xaa, 0x4c, 0x2f, - 0x89, 0xc0, 0xa1, 0x64, 0xa7, 0x25, 0x81, 0x97, 0xa0, 0xed, 0xcb, 0x41, 0xa9, 0x24, 0x62, 0x3c, - 0x29, 0xe8, 0xae, 0x04, 0xc2, 0x31, 0x9b, 0xf9, 0x47, 0x75, 0x68, 0x8a, 0x23, 0x02, 0x73, 0x0d, - 0x6a, 0xec, 0x3c, 0xe5, 0x28, 0xd4, 0x1d, 0xd7, 0x26, 0xcf, 0x98, 0xa8, 0x3a, 0xe6, 0x09, 0x74, - 0x01, 0x9a, 0xe2, 0xc8, 0x40, 0xc8, 0xca, 0x3b, 0x1b, 0x8a, 0xc8, 0xcc, 0x0f, 0xa0, 0x19, 0x9d, - 0xab, 0x1c, 0x87, 0xf6, 0xd8, 0xf7, 0xa8, 0x33, 0xec, 0x47, 0x2d, 0x88, 0x33, 0xd0, 0x5b, 0xd0, - 0xb4, 0xc5, 0xc9, 0x4d, 0x45, 0xe8, 0x36, 0x3f, 0x05, 0xeb, 0x46, 0xa7, 0x60, 0xdd, 0x0d, 0x76, - 0x0a, 0x86, 0x23, 0x3a, 0xf3, 0xeb, 0x65, 0x68, 0xf0, 0xe3, 0x15, 0x73, 0x4f, 0xf6, 0xfc, 0xdb, - 0xd0, 0x18, 0xb0, 0x3c, 0x23, 0x79, 0xb4, 0xa2, 0xd5, 0x50, 0x9c, 0xd7, 0x60, 0x41, 0x4c, 0xd9, - 0x02, 0x3e, 0x09, 0x56, 0x26, 0xb2, 0x71, 0xa3, 0xc6, 0x82, 0xf8, 0x7f, 0x4c, 0xee, 0x7f, 0x96, - 0xe1, 0xa0, 0x7e, 0x6a, 0x73, 0x1c, 0xda, 0x03, 0x79, 0x0e, 0x24, 0x7a, 0x77, 0xa0, 0x9c, 0xe9, - 0xc0, 0x60, 0xe4, 0x10, 0x37, 0x64, 0x01, 0xca, 0x4a, 0xe6, 0xba, 0x37, 0xf3, 0x94, 0xa8, 0xbb, - 0x2c, 0xd9, 0xb0, 0x02, 0x61, 0x7e, 0x0d, 0x20, 0x2e, 0x41, 0x27, 0xe5, 0x4a, 0x64, 0xcd, 0xda, - 0x89, 0xc4, 0xab, 0x59, 0x0a, 0xc5, 0xba, 0x15, 0x6e, 0x0b, 0x43, 0x54, 0xb3, 0xd0, 0x39, 0x38, - 0x1c, 0x38, 0x43, 0xd7, 0x0a, 0x77, 0x7d, 0xf2, 0x98, 0xf8, 0xce, 0x96, 0x43, 0x6c, 0x66, 0x96, - 0x2d, 0x9c, 0x2e, 0x30, 0x7f, 0xa1, 0x0d, 0x0d, 0xbe, 0xc3, 0x30, 0xff, 0xbd, 0x22, 0x75, 0xcc, - 0xfc, 0x8b, 0x32, 0xd4, 0xf9, 0x49, 0x4b, 0xd2, 0x50, 0x6e, 0xab, 0xfa, 0x55, 0xcd, 0x58, 0x7e, - 0x67, 0x9d, 0x3c, 0x75, 0xef, 0x92, 0xfd, 0xc7, 0xd4, 0xc9, 0x48, 0xa5, 0x43, 0xc7, 0xa0, 0x11, - 0xec, 0x6e, 0xf6, 0xed, 0xc0, 0xa8, 0x9e, 0xac, 0x9e, 0x6d, 0x63, 0x91, 0x32, 0xef, 0x40, 0x2b, - 0x22, 0x46, 0x1d, 0xa8, 0x3e, 0x21, 0xfb, 0x42, 0x38, 0xfd, 0x8b, 0xce, 0x09, 0x67, 0x25, 0xcd, - 0x26, 0xa9, 0xdb, 0x5c, 0x8a, 0xf0, 0x68, 0x5f, 0x80, 0x2a, 0x5d, 0xd3, 0x27, 0x9b, 0x30, 0xbb, - 0x89, 0xe4, 0xd6, 0x76, 0x19, 0xea, 0xfc, 0xb4, 0x2b, 0x29, 0x03, 0x41, 0xed, 0x09, 0xd9, 0xe7, - 0x7d, 0xd4, 0xc6, 0xec, 0x7f, 0x2e, 0xc8, 0x9f, 0x57, 0xe1, 0x80, 0x1a, 0xe1, 0x37, 0x57, 0x73, - 0x1d, 0xb0, 0xb5, 0x15, 0xaa, 0x0e, 0x58, 0x24, 0xa9, 0x97, 0x61, 0x58, 0x6c, 0x9c, 0xdb, 0x98, - 0x27, 0xcc, 0x2e, 0x34, 0xc4, 0xc1, 0x49, 0x12, 0x49, 0xd2, 0x57, 0x54, 0xfa, 0x3b, 0xd0, 0x92, - 0xe7, 0x20, 0x1f, 0x55, 0xb6, 0x0f, 0x2d, 0x79, 0xe0, 0x71, 0x14, 0xea, 0xa1, 0x17, 0x5a, 0x23, - 0x06, 0x57, 0xc5, 0x3c, 0x41, 0x0d, 0xcd, 0x25, 0xcf, 0xc2, 0x65, 0xe9, 0x05, 0xab, 0x38, 0xce, - 0xe0, 0x4e, 0x8e, 0xec, 0xf1, 0xd2, 0x2a, 0x2f, 0x95, 0x19, 0xb1, 0xcc, 0x9a, 0x2a, 0x73, 0x1f, - 0x1a, 0xe2, 0x14, 0x44, 0x96, 0x97, 0x95, 0x72, 0xb4, 0x08, 0xf5, 0x21, 0x2d, 0x17, 0xa3, 0xfe, - 0x46, 0xc2, 0x45, 0xf0, 0xcd, 0xcd, 0xb2, 0xe7, 0x86, 0x54, 0x8d, 0xf5, 0xe0, 0x0e, 0xe6, 0x9c, - 0x74, 0x08, 0x7d, 0x7e, 0xa4, 0xc5, 0x2d, 0x4a, 0xa4, 0xcc, 0xdf, 0x2d, 0x43, 0x5b, 0x9e, 0x21, - 0x9a, 0x1f, 0xe4, 0x19, 0xcf, 0x22, 0x1c, 0xf4, 0x05, 0x15, 0xf5, 0x0e, 0x91, 0x09, 0xbd, 0x98, - 0xa8, 0x09, 0x56, 0x68, 0xb0, 0xce, 0x61, 0xbe, 0x9b, 0x3b, 0xa8, 0x0b, 0x70, 0x20, 0x22, 0xbd, - 0x1b, 0xab, 0x9e, 0x96, 0x67, 0x9a, 0x92, 0xbb, 0x03, 0x55, 0xc7, 0xe6, 0xb7, 0x1d, 0xda, 0x98, - 0xfe, 0x35, 0xb7, 0xe0, 0x80, 0x7a, 0x92, 0x60, 0x3e, 0xce, 0xb6, 0x9e, 0x9b, 0x54, 0x8c, 0x72, - 0x6a, 0x51, 0x49, 0x6c, 0x97, 0xa2, 0x26, 0xc4, 0x24, 0x58, 0x63, 0x30, 0x9f, 0x87, 0x3a, 0x3f, - 0xdf, 0x4c, 0x4e, 0xfb, 0xbf, 0x39, 0x80, 0x3a, 0x1b, 0x04, 0xf3, 0x12, 0x37, 0x80, 0x73, 0xd0, - 0x60, 0x7b, 0xf5, 0xe8, 0x52, 0xc6, 0xd1, 0xac, 0x11, 0xc3, 0x82, 0xc6, 0x5c, 0x86, 0x39, 0xe5, - 0x64, 0x89, 0x6a, 0x2c, 0x2b, 0x90, 0x5a, 0x10, 0x25, 0x91, 0x09, 0x2d, 0x3a, 0x59, 0x0a, 0x07, - 0x4a, 0xdb, 0x2f, 0xd3, 0xe6, 0x29, 0xb9, 0x28, 0x31, 0xc5, 0x49, 0x5a, 0x5f, 0xf6, 0x92, 0x4c, - 0x9b, 0x9f, 0x87, 0xb6, 0x3c, 0x80, 0x42, 0x0f, 0xe0, 0x80, 0x38, 0x80, 0xe2, 0xfb, 0x67, 0x4a, - 0x3c, 0x5f, 0xa0, 0x5d, 0x74, 0xb3, 0xcc, 0xce, 0xb0, 0xba, 0x0f, 0xf7, 0xc7, 0x04, 0x6b, 0x00, - 0xe6, 0xcf, 0x9d, 0x65, 0x3d, 0x6f, 0x8e, 0xa1, 0x25, 0xa3, 0xee, 0xc9, 0x51, 0xb8, 0xca, 0x5d, - 0x63, 0xa5, 0xf0, 0xc8, 0x88, 0xf3, 0x53, 0x07, 0xcc, 0x3c, 0xa8, 0xf9, 0x22, 0x54, 0xef, 0x92, - 0x7d, 0x6a, 0x21, 0xdc, 0x91, 0x0a, 0x0b, 0xe1, 0x0e, 0xb3, 0x0f, 0x0d, 0x71, 0xfa, 0x95, 0x94, - 0x77, 0x1e, 0x1a, 0x5b, 0xfc, 0x40, 0xad, 0xc0, 0x65, 0x0a, 0x32, 0xf3, 0x26, 0xcc, 0xa9, 0x67, - 0x5e, 0x49, 0xbc, 0x93, 0x30, 0x37, 0x50, 0x4e, 0xd5, 0xf8, 0x30, 0xa8, 0x59, 0x26, 0xd1, 0xd5, - 0x31, 0x85, 0xb0, 0x9a, 0xa9, 0x87, 0xaf, 0x64, 0x76, 0xfb, 0x04, 0x6d, 0xbc, 0x0b, 0x87, 0x92, - 0x87, 0x5b, 0x49, 0x49, 0x67, 0xe1, 0xd0, 0x66, 0xe2, 0x28, 0x8d, 0xfb, 0xc0, 0x64, 0xb6, 0xd9, - 0x87, 0x3a, 0x3f, 0x7c, 0x48, 0x42, 0x5c, 0x80, 0xba, 0xc5, 0x0e, 0x37, 0x28, 0xe3, 0x7c, 0x6a, - 0xd5, 0x2a, 0xce, 0x64, 0x29, 0x05, 0xe6, 0x84, 0xa6, 0x03, 0x07, 0xf5, 0xf3, 0x8c, 0x24, 0x64, - 0x0f, 0x0e, 0xee, 0x69, 0xe7, 0x26, 0x1c, 0x7a, 0x21, 0x13, 0x5a, 0x83, 0xc2, 0x3a, 0xa3, 0xf9, - 0x8d, 0x06, 0xd4, 0xd8, 0x81, 0x5c, 0x52, 0xc4, 0x15, 0xa8, 0x85, 0xe4, 0x59, 0xb4, 0x46, 0x5d, - 0x98, 0x78, 0xba, 0xc7, 0xa3, 0x42, 0x8c, 0x1e, 0x7d, 0x12, 0xea, 0x41, 0xb8, 0x3f, 0x8a, 0x76, - 0x03, 0xaf, 0x4e, 0x66, 0xdc, 0xa0, 0xa4, 0x98, 0x73, 0x50, 0x56, 0x66, 0x0b, 0xe2, 0x00, 0xb9, - 0x80, 0x95, 0x19, 0x21, 0xe6, 0x1c, 0xe8, 0x26, 0xdd, 0xd6, 0x91, 0xc1, 0x13, 0x62, 0x8b, 0x93, - 0xe3, 0xd3, 0x93, 0x99, 0x97, 0x39, 0x31, 0x8e, 0xb8, 0xa8, 0xec, 0x01, 0x1b, 0xdd, 0xc6, 0x34, - 0xb2, 0xd9, 0x88, 0x63, 0xce, 0x81, 0x56, 0xa1, 0xed, 0x0c, 0x3c, 0x77, 0x75, 0xc7, 0xfb, 0xa2, - 0x23, 0x8e, 0x88, 0x5f, 0x9b, 0xcc, 0xde, 0x8f, 0xc8, 0x71, 0xcc, 0x19, 0xc1, 0xf4, 0x77, 0xe8, - 0x06, 0xa7, 0x35, 0x2d, 0x0c, 0x23, 0xc7, 0x31, 0xa7, 0x79, 0x5c, 0x8c, 0x67, 0xb6, 0x91, 0xdf, - 0x86, 0x3a, 0xeb, 0x72, 0x74, 0x5d, 0x2d, 0x9e, 0x57, 0x24, 0xe5, 0x7a, 0x2c, 0x31, 0x54, 0x12, - 0x87, 0xf5, 0xbf, 0x8e, 0x33, 0x37, 0x0d, 0x8e, 0x18, 0x37, 0x8e, 0xf3, 0x32, 0x34, 0xc5, 0x50, - 0xe8, 0x15, 0x6e, 0x45, 0x04, 0x2f, 0x41, 0x9d, 0x1b, 0x66, 0x76, 0x7b, 0x5e, 0x81, 0xb6, 0xec, - 0xcc, 0xc9, 0x24, 0xac, 0x77, 0x72, 0x48, 0x7e, 0xbe, 0x02, 0x75, 0x7e, 0x30, 0x99, 0x76, 0xb5, - 0xaa, 0x15, 0xbc, 0x3a, 0xf9, 0x9c, 0x53, 0x35, 0x83, 0xdb, 0x6c, 0xa3, 0x46, 0x17, 0xe6, 0xf2, - 0x0e, 0xe0, 0xd9, 0x02, 0xee, 0xf5, 0x88, 0x1e, 0xc7, 0xac, 0x05, 0xc3, 0xf9, 0x00, 0xda, 0x92, - 0x0b, 0x2d, 0xe9, 0x43, 0x7a, 0x6e, 0xe2, 0x50, 0x24, 0x45, 0x0a, 0xc0, 0x5f, 0x2b, 0x43, 0x75, - 0xc5, 0xd9, 0x4b, 0xf5, 0xc3, 0x3b, 0x91, 0x55, 0x17, 0xb9, 0x83, 0x15, 0x67, 0x4f, 0x33, 0x6a, - 0x73, 0x35, 0xd2, 0xb8, 0x77, 0xf5, 0xea, 0x9d, 0x99, 0xbc, 0x02, 0x8b, 0x61, 0x78, 0xc5, 0x7e, - 0xb9, 0x09, 0x35, 0x76, 0xe6, 0x9f, 0xe5, 0xa7, 0xf6, 0xc7, 0xc5, 0x15, 0x63, 0x51, 0x45, 0x36, - 0xe1, 0x32, 0x7a, 0xee, 0xa7, 0xac, 0xb0, 0xd8, 0x4f, 0xf1, 0x20, 0x29, 0x25, 0xc5, 0x9c, 0x83, - 0x8a, 0xdc, 0x71, 0x76, 0x88, 0x70, 0x53, 0x05, 0x22, 0xef, 0x3b, 0x3b, 0x04, 0x33, 0x7a, 0xca, - 0xb7, 0x6d, 0x05, 0xdb, 0xc2, 0x43, 0x15, 0xf0, 0xf5, 0xac, 0x60, 0x1b, 0x33, 0x7a, 0xca, 0xe7, - 0xd2, 0x2d, 0x61, 0x63, 0x1a, 0x3e, 0xba, 0x53, 0xc4, 0x8c, 0x9e, 0xf2, 0x05, 0xce, 0x97, 0x89, - 0xf0, 0x49, 0x05, 0x7c, 0x1b, 0xce, 0x97, 0x09, 0x66, 0xf4, 0xb1, 0x0b, 0x6f, 0x4d, 0xd7, 0x35, - 0x8a, 0x0b, 0x7f, 0x08, 0xf3, 0xa1, 0x76, 0x72, 0x25, 0x2e, 0x9e, 0x9c, 0x2b, 0x18, 0x17, 0x8d, - 0x07, 0x27, 0x30, 0xa8, 0x11, 0xb0, 0x0d, 0x70, 0xb6, 0x11, 0xbc, 0x04, 0xf5, 0xcf, 0x38, 0x76, - 0xb8, 0xad, 0x17, 0xd7, 0x35, 0x97, 0x47, 0x87, 0x6d, 0x26, 0x97, 0xa7, 0x8e, 0x3a, 0xc7, 0x59, - 0x81, 0x1a, 0x55, 0x9f, 0xd9, 0xf4, 0x38, 0xd6, 0xba, 0x8f, 0xe4, 0x80, 0xd5, 0x8e, 0xe6, 0x38, - 0xc7, 0xa1, 0x46, 0x35, 0x24, 0xa7, 0x4b, 0x8e, 0x43, 0x8d, 0xea, 0x5d, 0x7e, 0x29, 0x1d, 0x6d, - 0xbd, 0xb4, 0x1a, 0x95, 0x9e, 0x81, 0x79, 0x7d, 0x38, 0x72, 0x50, 0xbe, 0xdd, 0x84, 0x1a, 0xbb, - 0x40, 0x93, 0xb4, 0xc8, 0x4f, 0xc3, 0x41, 0x3e, 0x7e, 0x4b, 0x62, 0x09, 0x5e, 0xc9, 0xbc, 0x3f, - 0xa7, 0x5f, 0xcb, 0x11, 0x2a, 0x20, 0x58, 0xb0, 0x8e, 0x30, 0xfd, 0xa2, 0x82, 0x41, 0x69, 0x1a, - 0xf9, 0xae, 0x5c, 0xbc, 0xd6, 0x0a, 0x6e, 0x6f, 0x31, 0x5e, 0xbe, 0x04, 0x8e, 0x56, 0xb2, 0x68, - 0x09, 0x5a, 0x74, 0x6a, 0xa5, 0xdd, 0x25, 0xcc, 0xf6, 0xcc, 0x64, 0xfe, 0xbe, 0xa0, 0xc6, 0x92, - 0x8f, 0x4e, 0xec, 0x03, 0xcb, 0xb7, 0x59, 0xad, 0x84, 0x0d, 0xbf, 0x36, 0x19, 0x64, 0x39, 0x22, - 0xc7, 0x31, 0x27, 0xba, 0x0b, 0x73, 0x36, 0x91, 0x71, 0x02, 0x61, 0xd4, 0x9f, 0x98, 0x0c, 0xb4, - 0x12, 0x33, 0x60, 0x95, 0x9b, 0xd6, 0x29, 0xda, 0x1b, 0x06, 0x85, 0x8b, 0x0d, 0x06, 0x15, 0xdf, - 0x92, 0x8d, 0x39, 0xcd, 0xd3, 0x70, 0x50, 0x1b, 0xb7, 0x8f, 0x75, 0xd5, 0xa1, 0x8e, 0x25, 0xc7, - 0xb9, 0x2a, 0xb7, 0x28, 0x6f, 0xea, 0xcb, 0x8e, 0xdc, 0x1d, 0x89, 0x60, 0xbc, 0x07, 0xad, 0x68, - 0x60, 0xd0, 0x2d, 0xbd, 0x0e, 0xaf, 0x17, 0xd7, 0x41, 0x8e, 0xa9, 0x40, 0x5b, 0x83, 0xb6, 0x1c, - 0x21, 0xb4, 0xa8, 0xc3, 0xbd, 0x51, 0x0c, 0x17, 0x8f, 0xae, 0xc0, 0xc3, 0x30, 0xa7, 0x0c, 0x14, - 0x5a, 0xd6, 0x11, 0xdf, 0x2c, 0x46, 0x54, 0x87, 0x39, 0x5e, 0xf5, 0xc8, 0x11, 0x53, 0x47, 0xa5, - 0x1a, 0x8f, 0xca, 0x1f, 0x36, 0xa1, 0x25, 0x2f, 0xad, 0x65, 0xec, 0x31, 0x77, 0xfd, 0x51, 0xe1, - 0x1e, 0x33, 0xe2, 0xef, 0x3e, 0xf2, 0x47, 0x98, 0x72, 0xd0, 0x21, 0x0e, 0x9d, 0x50, 0x9a, 0xea, - 0x6b, 0xc5, 0xac, 0x0f, 0x29, 0x39, 0xe6, 0x5c, 0xe8, 0x81, 0xae, 0xe5, 0xb5, 0x09, 0x97, 0x1a, - 0x34, 0x90, 0x5c, 0x4d, 0xef, 0x43, 0xdb, 0xa1, 0x4b, 0xbf, 0x5e, 0x3c, 0xf3, 0xbe, 0x51, 0x0c, - 0xd7, 0x8f, 0x58, 0x70, 0xcc, 0x4d, 0xeb, 0xb6, 0x65, 0xed, 0x51, 0xbb, 0x66, 0x60, 0x8d, 0x69, - 0xeb, 0x76, 0x3b, 0x66, 0xc2, 0x2a, 0x02, 0xba, 0x26, 0xd6, 0x2e, 0xcd, 0x02, 0xcf, 0x12, 0x77, - 0x55, 0xbc, 0x7e, 0x79, 0x3f, 0x35, 0xd3, 0x72, 0x33, 0xbe, 0x30, 0x05, 0xca, 0xc4, 0xd9, 0x96, - 0x8e, 0x20, 0x5f, 0x19, 0xb5, 0xa7, 0x1d, 0x41, 0x75, 0x75, 0x64, 0xbe, 0x08, 0xd5, 0x47, 0xfe, - 0x28, 0x7f, 0xae, 0x66, 0xc3, 0x9d, 0x53, 0xfc, 0xaa, 0x6e, 0x09, 0xf9, 0x0b, 0x7a, 0x39, 0x26, - 0xb9, 0x38, 0x4a, 0xa7, 0xe7, 0x10, 0x5d, 0x17, 0x13, 0xfa, 0xdb, 0xba, 0xbd, 0xbd, 0x9c, 0xb0, - 0x37, 0x6a, 0x61, 0xeb, 0x3e, 0xe1, 0xf7, 0x76, 0x94, 0x99, 0x7c, 0xda, 0x79, 0xf2, 0x4e, 0xb4, - 0xfe, 0x98, 0xc9, 0x53, 0x24, 0xfb, 0x96, 0x63, 0x7d, 0xab, 0x0c, 0x2d, 0x79, 0x27, 0x31, 0x1d, - 0x9d, 0x6f, 0x39, 0x41, 0x8f, 0x58, 0x36, 0xf1, 0x85, 0xdd, 0xbe, 0x5e, 0x78, 0xd9, 0xb1, 0xdb, - 0x17, 0x1c, 0x58, 0xf2, 0x9a, 0x27, 0xa1, 0x15, 0xe5, 0xe6, 0x6c, 0xca, 0xbe, 0x5f, 0x81, 0x86, - 0xb8, 0xcd, 0x98, 0xac, 0xc4, 0x0d, 0x68, 0x8c, 0xac, 0x7d, 0x6f, 0x37, 0xda, 0x32, 0x9d, 0x29, - 0xb8, 0x20, 0xd9, 0xbd, 0xc7, 0xa8, 0xb1, 0xe0, 0x42, 0x9f, 0x82, 0xfa, 0xc8, 0xd9, 0x71, 0x42, - 0xe1, 0x3e, 0x4e, 0x17, 0xb2, 0xb3, 0x7b, 0x0f, 0x9c, 0x87, 0x0a, 0x67, 0x97, 0x98, 0xa2, 0x2b, - 0xe8, 0x85, 0xc2, 0x1f, 0x33, 0x6a, 0x2c, 0xb8, 0xcc, 0x3b, 0xd0, 0xe0, 0xd5, 0x99, 0x6d, 0x92, - 0xd0, 0x5b, 0x12, 0x6b, 0x3a, 0xab, 0x5b, 0xce, 0xaa, 0xf4, 0x04, 0x34, 0xb8, 0xf0, 0x1c, 0xad, - 0xf9, 0xde, 0x0b, 0x6c, 0xbf, 0x33, 0x32, 0xef, 0xc5, 0x87, 0x7f, 0x1f, 0xfd, 0x2c, 0xc3, 0x7c, - 0x08, 0x87, 0x56, 0xac, 0xd0, 0xda, 0xb4, 0x02, 0x82, 0xc9, 0xc0, 0xf3, 0xed, 0x4c, 0x54, 0x9f, - 0x17, 0x89, 0x08, 0x75, 0x3e, 0xaa, 0xa0, 0xfb, 0x49, 0xe8, 0xf0, 0x7f, 0x4f, 0xe8, 0xf0, 0x8f, - 0x6b, 0x39, 0xf1, 0xbc, 0x69, 0x22, 0x19, 0x54, 0xe1, 0x52, 0x01, 0xbd, 0x6b, 0xfa, 0xda, 0xfb, - 0x54, 0x01, 0xa7, 0xb6, 0xf8, 0xbe, 0xa6, 0x47, 0xf4, 0x8a, 0x78, 0xb5, 0x90, 0xde, 0xad, 0x64, - 0x48, 0xef, 0x4c, 0x01, 0x77, 0x2a, 0xa6, 0x77, 0x4d, 0x8f, 0xe9, 0x15, 0x49, 0x57, 0x83, 0x7a, - 0xff, 0xcf, 0xc2, 0x68, 0xbf, 0x9e, 0x13, 0xf6, 0xf9, 0xa4, 0x1e, 0xf6, 0x99, 0xa0, 0x35, 0x3f, - 0xae, 0xb8, 0xcf, 0x6f, 0x34, 0x72, 0xe2, 0x3e, 0x57, 0xb5, 0xb8, 0xcf, 0x84, 0x9a, 0x25, 0x03, - 0x3f, 0xd7, 0xf4, 0xc0, 0xcf, 0xa9, 0x02, 0x4e, 0x2d, 0xf2, 0x73, 0x55, 0x8b, 0xfc, 0x14, 0x09, - 0x55, 0x42, 0x3f, 0x57, 0xb5, 0xd0, 0x4f, 0x11, 0xa3, 0x12, 0xfb, 0xb9, 0xaa, 0xc5, 0x7e, 0x8a, - 0x18, 0x95, 0xe0, 0xcf, 0x55, 0x2d, 0xf8, 0x53, 0xc4, 0xa8, 0x44, 0x7f, 0xae, 0xe9, 0xd1, 0x9f, - 0xe2, 0xfe, 0x51, 0x06, 0xfd, 0x27, 0x81, 0x9a, 0xff, 0xc6, 0x40, 0xcd, 0x2f, 0x55, 0x73, 0x02, - 0x30, 0x38, 0x3b, 0x00, 0x73, 0x2e, 0x7f, 0x24, 0x8b, 0x23, 0x30, 0xd3, 0xcf, 0x02, 0xe9, 0x10, - 0xcc, 0xf5, 0x44, 0x08, 0xe6, 0x74, 0x01, 0xb3, 0x1e, 0x83, 0xf9, 0x3f, 0x13, 0x64, 0xf8, 0xfd, - 0xc6, 0x84, 0xfd, 0xf4, 0x3b, 0xea, 0x7e, 0x7a, 0xc2, 0x4c, 0x96, 0xde, 0x50, 0xdf, 0xd0, 0x37, - 0xd4, 0x67, 0xa7, 0xe0, 0xd5, 0x76, 0xd4, 0xeb, 0x59, 0x3b, 0xea, 0xee, 0x14, 0x28, 0xb9, 0x5b, - 0xea, 0x3b, 0xe9, 0x2d, 0xf5, 0xb9, 0x29, 0xf0, 0x32, 0xf7, 0xd4, 0xeb, 0x59, 0x7b, 0xea, 0x69, - 0x6a, 0x97, 0xbb, 0xa9, 0xfe, 0x94, 0xb6, 0xa9, 0x7e, 0x6d, 0x9a, 0xee, 0x8a, 0x27, 0x87, 0xcf, - 0xe6, 0xec, 0xaa, 0xdf, 0x9a, 0x06, 0x66, 0x72, 0x10, 0xfb, 0x27, 0xfb, 0x62, 0x5d, 0xcc, 0xef, - 0xbd, 0x0c, 0xad, 0xe8, 0xa2, 0x8d, 0xf9, 0x25, 0x68, 0x46, 0x9f, 0xb0, 0x25, 0x2d, 0xe7, 0x98, - 0xdc, 0xd4, 0xf1, 0xd5, 0xb3, 0x48, 0xa1, 0x1b, 0x50, 0xa3, 0xff, 0x84, 0x59, 0xbc, 0x3e, 0xdd, - 0x85, 0x1e, 0x2a, 0x04, 0x33, 0x3e, 0xf3, 0xdf, 0x8e, 0x02, 0x28, 0x5f, 0xf6, 0x4c, 0x2b, 0xf6, - 0x3d, 0xea, 0xcc, 0x46, 0x21, 0xf1, 0xd9, 0x45, 0xae, 0xc2, 0x2f, 0x5f, 0x62, 0x09, 0x54, 0x5b, - 0x42, 0xe2, 0x63, 0xc1, 0x8e, 0xee, 0x43, 0x2b, 0x0a, 0xa4, 0x1a, 0x35, 0x06, 0xf5, 0xd6, 0xd4, - 0x50, 0x51, 0x68, 0x0f, 0x4b, 0x08, 0xb4, 0x08, 0xb5, 0xc0, 0xf3, 0x43, 0xa3, 0xce, 0xa0, 0xde, - 0x9c, 0x1a, 0x6a, 0xc3, 0xf3, 0x43, 0xcc, 0x58, 0x79, 0xd3, 0x94, 0x0f, 0xa7, 0x67, 0x69, 0x9a, - 0xe6, 0xb1, 0xff, 0xb5, 0x2a, 0x7d, 0xe8, 0xb2, 0xb0, 0x46, 0xae, 0x43, 0xe7, 0xa7, 0x1f, 0x25, - 0xd5, 0x2a, 0x91, 0x58, 0x04, 0xf1, 0x91, 0xe0, 0xeb, 0x9b, 0xd7, 0xa1, 0x33, 0xf0, 0xf6, 0x88, - 0x8f, 0xe3, 0x2b, 0x4e, 0xe2, 0x16, 0x5a, 0x2a, 0x1f, 0x99, 0xd0, 0xda, 0x76, 0x6c, 0xd2, 0x1f, - 0x08, 0xff, 0xd7, 0xc2, 0x32, 0x8d, 0xee, 0x42, 0x8b, 0xc5, 0xd8, 0xa3, 0x08, 0xff, 0x6c, 0x95, - 0xe4, 0xa1, 0xfe, 0x08, 0x80, 0x0a, 0x62, 0xc2, 0x6f, 0x3b, 0x21, 0xeb, 0xc3, 0x16, 0x96, 0x69, - 0x5a, 0x61, 0x76, 0x8f, 0x4c, 0xad, 0x70, 0x93, 0x57, 0x38, 0x99, 0x8f, 0x2e, 0xc3, 0x73, 0x2c, - 0x2f, 0xb1, 0xc5, 0xe4, 0xa1, 0xfa, 0x16, 0xce, 0x2e, 0x64, 0xf7, 0xe6, 0xac, 0x21, 0xff, 0x4c, - 0x82, 0x05, 0xef, 0xea, 0x38, 0xce, 0x40, 0xe7, 0xe0, 0xb0, 0x4d, 0xb6, 0xac, 0xdd, 0x51, 0xf8, - 0x90, 0xec, 0x8c, 0x47, 0x56, 0x48, 0xfa, 0x36, 0xfb, 0x76, 0xbb, 0x8d, 0xd3, 0x05, 0xe8, 0x02, - 0x1c, 0x11, 0x99, 0xdc, 0x8c, 0xe9, 0x68, 0xf4, 0x6d, 0xf6, 0x29, 0x73, 0x1b, 0x67, 0x15, 0x99, - 0xdf, 0xab, 0xd1, 0x41, 0x67, 0xaa, 0xfd, 0x1e, 0x54, 0x2d, 0xdb, 0x16, 0xd3, 0xe6, 0xa5, 0x19, - 0x0d, 0x44, 0xdc, 0xbd, 0xa7, 0x08, 0x68, 0x5d, 0x5e, 0xb9, 0xe3, 0x13, 0xe7, 0x95, 0x59, 0xb1, - 0xe4, 0x93, 0x12, 0x02, 0x87, 0x22, 0xee, 0xf2, 0x5b, 0xfc, 0xd5, 0x1f, 0x0d, 0x51, 0x5e, 0xf0, - 0x17, 0x38, 0xe8, 0x0e, 0xd4, 0x58, 0x0d, 0xf9, 0xc4, 0x7a, 0x79, 0x56, 0xbc, 0xfb, 0xbc, 0x7e, - 0x0c, 0xc3, 0x1c, 0xf0, 0xbb, 0x6f, 0xca, 0x85, 0xcb, 0xb2, 0x7e, 0xe1, 0x72, 0x09, 0xea, 0x4e, - 0x48, 0x76, 0xd2, 0xf7, 0x6f, 0x27, 0xaa, 0xaa, 0xf0, 0x3c, 0x9c, 0x75, 0xe2, 0x3d, 0xc0, 0x0f, - 0x72, 0x6f, 0xdf, 0xdf, 0x82, 0x1a, 0x65, 0x4f, 0xad, 0x25, 0xa7, 0x11, 0xcc, 0x38, 0xcd, 0x8b, - 0x50, 0xa3, 0x8d, 0x9d, 0xd0, 0x3a, 0x51, 0x9f, 0x8a, 0xac, 0xcf, 0xd2, 0x1c, 0xb4, 0xbd, 0x31, - 0xf1, 0x99, 0x61, 0x98, 0xff, 0x52, 0x53, 0x2e, 0xc5, 0xf5, 0x55, 0x1d, 0x7b, 0x7b, 0x66, 0xcf, - 0xa9, 0x6a, 0x19, 0x4e, 0x68, 0xd9, 0x3b, 0xb3, 0xa3, 0xa5, 0xf4, 0x0c, 0x27, 0xf4, 0xec, 0x47, - 0xc0, 0x4c, 0x69, 0xda, 0x3d, 0x4d, 0xd3, 0xae, 0xcc, 0x8e, 0xa8, 0xe9, 0x1a, 0x29, 0xd2, 0xb5, - 0x15, 0x5d, 0xd7, 0xba, 0xd3, 0x0d, 0xb9, 0x9c, 0x9a, 0xa6, 0xd0, 0xb6, 0xcf, 0xe7, 0x6a, 0xdb, - 0x92, 0xa6, 0x6d, 0xb3, 0x8a, 0xfe, 0x98, 0xf4, 0xed, 0xbb, 0x35, 0xa8, 0xd1, 0xe9, 0x11, 0xad, - 0xaa, 0xba, 0xf6, 0xd6, 0x4c, 0x53, 0xab, 0xaa, 0x67, 0x6b, 0x09, 0x3d, 0xbb, 0x3c, 0x1b, 0x52, - 0x4a, 0xc7, 0xd6, 0x12, 0x3a, 0x36, 0x23, 0x5e, 0x4a, 0xbf, 0x7a, 0x9a, 0x7e, 0x5d, 0x9c, 0x0d, - 0x4d, 0xd3, 0x2d, 0xab, 0x48, 0xb7, 0x6e, 0xe9, 0xba, 0x35, 0xe5, 0xea, 0x8d, 0xad, 0x55, 0xa6, - 0xd0, 0xab, 0xf7, 0x73, 0xf5, 0xea, 0x86, 0xa6, 0x57, 0xb3, 0x88, 0xfd, 0x98, 0x74, 0xea, 0x32, - 0x5f, 0x74, 0x66, 0x7f, 0xfc, 0x94, 0xb7, 0xe8, 0x34, 0xdf, 0x86, 0x76, 0xfc, 0x34, 0x42, 0xc6, - 0xf5, 0x7c, 0x4e, 0x16, 0x49, 0x8d, 0x92, 0xe6, 0x25, 0x68, 0xc7, 0xcf, 0x1d, 0x64, 0xc8, 0x0a, - 0x58, 0xa1, 0xe0, 0x12, 0x29, 0x73, 0x15, 0x0e, 0xa7, 0x3f, 0xc6, 0xce, 0x88, 0xc3, 0x2b, 0x77, - 0xcb, 0xa3, 0x4f, 0x51, 0x94, 0x2c, 0xf3, 0x29, 0xcc, 0x27, 0x3e, 0xaf, 0x9e, 0x19, 0x03, 0x5d, - 0x52, 0x96, 0xc8, 0xd5, 0xc4, 0xc7, 0x7a, 0xfa, 0x6d, 0xf9, 0x78, 0x21, 0x6c, 0xae, 0xc0, 0x7c, - 0x41, 0xe5, 0xa7, 0xb9, 0x2c, 0xff, 0x05, 0x98, 0x9b, 0x54, 0xf7, 0x8f, 0xe1, 0x32, 0x7f, 0x08, - 0x9d, 0xd4, 0xd3, 0x10, 0x49, 0x31, 0xeb, 0x00, 0x43, 0x49, 0x23, 0x94, 0xf6, 0xc2, 0x0c, 0x9f, - 0x2e, 0x30, 0x3e, 0xac, 0x60, 0x98, 0xbf, 0x53, 0x86, 0xc3, 0xe9, 0x77, 0x21, 0xa6, 0xdd, 0xfc, - 0x18, 0xd0, 0x64, 0x58, 0xf2, 0x8b, 0x8f, 0x28, 0x89, 0xee, 0xc3, 0x81, 0x60, 0xe4, 0x0c, 0xc8, - 0xf2, 0xb6, 0xe5, 0x0e, 0x49, 0x20, 0x76, 0x34, 0x05, 0x6f, 0x3b, 0x6c, 0xc4, 0x1c, 0x58, 0x63, - 0x37, 0x9f, 0xc2, 0x9c, 0x52, 0x88, 0xde, 0x85, 0x8a, 0x37, 0x4e, 0xdd, 0x6b, 0xcc, 0xc7, 0x7c, - 0x10, 0xd9, 0x1b, 0xae, 0x78, 0xe3, 0xb4, 0x49, 0xaa, 0xe6, 0x5b, 0xd5, 0xcc, 0xd7, 0xbc, 0x0b, - 0x87, 0xd3, 0x4f, 0x2f, 0x24, 0xbb, 0xe7, 0x4c, 0x2a, 0x4a, 0xc0, 0xbb, 0x29, 0xb9, 0xe5, 0xbf, - 0x0a, 0x87, 0x92, 0x0f, 0x2a, 0x64, 0x7c, 0x8d, 0x13, 0x7f, 0xd4, 0x14, 0x85, 0xeb, 0x17, 0x7e, - 0xb1, 0x0c, 0xf3, 0x7a, 0x43, 0xd0, 0x31, 0x40, 0x7a, 0xce, 0x9a, 0xe7, 0x92, 0x4e, 0x09, 0x3d, - 0x07, 0x87, 0xf5, 0xfc, 0x45, 0xdb, 0xee, 0x94, 0xd3, 0xe4, 0xd4, 0x6d, 0x75, 0x2a, 0xc8, 0x80, - 0xa3, 0x89, 0x1e, 0x62, 0x4e, 0xb4, 0x53, 0x45, 0x2f, 0xc0, 0x73, 0xc9, 0x92, 0xf1, 0xc8, 0x1a, - 0x90, 0x4e, 0xcd, 0xfc, 0x61, 0x05, 0x6a, 0x8f, 0x02, 0xe2, 0x9b, 0xff, 0x54, 0x89, 0xbe, 0xd2, - 0x78, 0x07, 0x6a, 0xec, 0xad, 0x03, 0xe5, 0x6b, 0xc6, 0x72, 0xe2, 0x6b, 0x46, 0xed, 0x8b, 0xb8, - 0xf8, 0x6b, 0xc6, 0x77, 0xa0, 0xc6, 0x5e, 0x37, 0x98, 0x9d, 0xf3, 0x9b, 0x65, 0x68, 0xc7, 0x2f, - 0x0d, 0xcc, 0xcc, 0xaf, 0x7e, 0x15, 0x52, 0xd1, 0xbf, 0x0a, 0x79, 0x1d, 0xea, 0x3e, 0xfb, 0x7e, - 0x83, 0x7b, 0x99, 0xe4, 0xb7, 0x26, 0x4c, 0x20, 0xe6, 0x24, 0x26, 0x81, 0x39, 0xf5, 0x1d, 0x85, - 0xd9, 0xab, 0x71, 0x4a, 0x3c, 0xa2, 0xd4, 0xb7, 0x83, 0x45, 0xdf, 0xb7, 0xf6, 0x85, 0x62, 0xea, - 0x99, 0xe6, 0x71, 0xa8, 0xad, 0x3b, 0xee, 0x30, 0xfb, 0x23, 0x52, 0xf3, 0x4f, 0xca, 0xd0, 0x14, - 0x97, 0x77, 0xcd, 0xab, 0x50, 0x5d, 0x23, 0x4f, 0x69, 0x45, 0xc4, 0xb5, 0xe1, 0x54, 0x45, 0xee, - 0xb3, 0x56, 0x08, 0x7a, 0x1c, 0x91, 0x99, 0xd7, 0xe4, 0x34, 0x39, 0x3b, 0xef, 0x3b, 0x50, 0x63, - 0xcf, 0x1f, 0xcc, 0xce, 0xf9, 0xa7, 0x2d, 0x68, 0xf0, 0x2f, 0x31, 0xcd, 0x3f, 0x68, 0x41, 0x83, - 0x3f, 0x89, 0x80, 0x6e, 0x40, 0x33, 0xd8, 0xdd, 0xd9, 0xb1, 0xfc, 0x7d, 0x23, 0xfb, 0xfd, 0x4d, - 0xed, 0x05, 0x85, 0xee, 0x06, 0xa7, 0xc5, 0x11, 0x13, 0x7a, 0x1b, 0x6a, 0x03, 0x6b, 0x8b, 0xa4, - 0x8e, 0x73, 0xb3, 0x98, 0x97, 0xad, 0x2d, 0x82, 0x19, 0x39, 0xba, 0x05, 0x2d, 0x31, 0x2c, 0x81, - 0x88, 0xe7, 0x4c, 0x96, 0x1b, 0x0d, 0xa6, 0xe4, 0x32, 0xef, 0x40, 0x53, 0x54, 0x06, 0xdd, 0x94, - 0xdf, 0xa1, 0x26, 0x23, 0xcf, 0x99, 0x4d, 0x90, 0xdf, 0xca, 0xcb, 0x2f, 0x52, 0xff, 0xb2, 0x02, - 0x35, 0x5a, 0xb9, 0x8f, 0x8c, 0x84, 0x4e, 0x00, 0x8c, 0xac, 0x20, 0x5c, 0xdf, 0x1d, 0x8d, 0x88, - 0x2d, 0xbe, 0xb0, 0x53, 0x72, 0xd0, 0x59, 0x38, 0xc4, 0x53, 0xc1, 0xf6, 0xc6, 0xee, 0x60, 0x40, - 0xe4, 0x67, 0xa2, 0xc9, 0x6c, 0xb4, 0x08, 0x75, 0xf6, 0x48, 0x9f, 0x58, 0x15, 0xbe, 0x51, 0xd8, - 0xb3, 0xdd, 0x75, 0xc7, 0x15, 0xb5, 0xe1, 0x9c, 0xa6, 0x07, 0x6d, 0x99, 0x47, 0x8d, 0x70, 0xec, - 0xb8, 0xae, 0xe3, 0x0e, 0x85, 0x46, 0x47, 0x49, 0x3a, 0xe9, 0xd0, 0xbf, 0xa2, 0xbe, 0x75, 0x2c, - 0x52, 0x34, 0x7f, 0xcb, 0x72, 0x46, 0xa2, 0x8a, 0x75, 0x2c, 0x52, 0x14, 0x69, 0x57, 0x3c, 0x24, - 0x51, 0x63, 0x0d, 0x8c, 0x92, 0xe6, 0x87, 0x65, 0xf9, 0x31, 0x76, 0xd6, 0xc7, 0x99, 0xa9, 0x58, - 0xd2, 0x71, 0x35, 0xa0, 0xcd, 0x27, 0x04, 0x25, 0x44, 0x7d, 0x0c, 0x1a, 0x9e, 0x3b, 0x72, 0x5c, - 0x22, 0x62, 0x47, 0x22, 0x95, 0xe8, 0xe3, 0x7a, 0xaa, 0x8f, 0x45, 0xf9, 0xaa, 0xed, 0xd0, 0x2a, - 0x36, 0xe2, 0x72, 0x9e, 0x83, 0xae, 0x43, 0xd3, 0x26, 0x7b, 0xce, 0x80, 0x04, 0x46, 0x93, 0xa9, - 0xde, 0xab, 0x13, 0xfb, 0x76, 0x85, 0xd1, 0xe2, 0x88, 0xc7, 0x0c, 0xa1, 0xc1, 0xb3, 0x64, 0x93, - 0xca, 0x4a, 0x93, 0xe2, 0x4a, 0x57, 0x26, 0x54, 0xba, 0x5a, 0x50, 0xe9, 0x5a, 0xb2, 0xd2, 0x0b, - 0x5f, 0x05, 0x88, 0xd5, 0x0d, 0xcd, 0x41, 0xf3, 0x91, 0xfb, 0xc4, 0xf5, 0x9e, 0xba, 0x9d, 0x12, - 0x4d, 0x3c, 0xd8, 0xda, 0xa2, 0x52, 0x3a, 0x65, 0x9a, 0xa0, 0x74, 0x8e, 0x3b, 0xec, 0x54, 0x10, - 0x40, 0x83, 0x26, 0x88, 0xdd, 0xa9, 0xd2, 0xff, 0xb7, 0xd9, 0xf8, 0x75, 0x6a, 0xe8, 0x79, 0x38, - 0xd2, 0x77, 0x07, 0xde, 0xce, 0xd8, 0x0a, 0x9d, 0xcd, 0x11, 0x79, 0x4c, 0xfc, 0xc0, 0xf1, 0xdc, - 0x4e, 0x9d, 0xce, 0x5e, 0x6b, 0x24, 0x7c, 0xea, 0xf9, 0x4f, 0xd6, 0x08, 0xb1, 0xc5, 0xfb, 0x0f, - 0x9d, 0x86, 0xf9, 0x1f, 0x65, 0x7e, 0x1a, 0x6c, 0xde, 0x82, 0x03, 0xda, 0x8b, 0x27, 0x46, 0xfc, - 0x2c, 0x72, 0xe2, 0x55, 0xe4, 0x63, 0x2c, 0x5e, 0x4b, 0xe2, 0xa5, 0x0c, 0x4f, 0x99, 0xb7, 0x01, - 0x94, 0x77, 0x4e, 0x4e, 0x00, 0x6c, 0xee, 0x87, 0x24, 0xe0, 0x6f, 0x9c, 0x50, 0x88, 0x1a, 0x56, - 0x72, 0x54, 0xfc, 0x8a, 0x86, 0x6f, 0x5e, 0x01, 0x50, 0x5e, 0x39, 0xa1, 0x76, 0x45, 0x53, 0x4b, - 0x49, 0xb0, 0x64, 0xb6, 0xd9, 0x15, 0x2d, 0x88, 0xde, 0x33, 0x89, 0x6a, 0xc0, 0xa3, 0x77, 0x6a, - 0x0d, 0x58, 0x8e, 0xb9, 0x0a, 0x10, 0x3f, 0xe9, 0x61, 0x5e, 0x95, 0xae, 0xfb, 0x4d, 0xa8, 0xd9, - 0x56, 0x68, 0x09, 0xaf, 0xf9, 0x42, 0x62, 0xe6, 0x8a, 0x59, 0x30, 0x23, 0x33, 0x7f, 0xbb, 0x0c, - 0x07, 0xd4, 0xe7, 0x4b, 0xcc, 0xf7, 0xa0, 0xc6, 0xde, 0x3f, 0xb9, 0x09, 0x07, 0xd4, 0xf7, 0x4b, - 0x52, 0xcf, 0x47, 0x73, 0x3c, 0x95, 0x15, 0x6b, 0x0c, 0x66, 0x5f, 0x56, 0xe9, 0x23, 0x43, 0x5d, - 0x80, 0xa6, 0x78, 0x0e, 0xc5, 0x3c, 0x0d, 0xed, 0xf8, 0xf5, 0x13, 0xea, 0x3b, 0x78, 0x7e, 0x34, - 0xca, 0x22, 0x69, 0xfe, 0x73, 0x15, 0xea, 0x6c, 0x38, 0xcd, 0xaf, 0x57, 0x54, 0x0d, 0x35, 0x7f, - 0x58, 0xce, 0xdd, 0x0b, 0x5e, 0xd2, 0x9e, 0x0d, 0x98, 0x4f, 0xbd, 0xfa, 0x23, 0x1e, 0x3b, 0xd1, - 0x1d, 0xeb, 0x15, 0x68, 0xba, 0x5c, 0x33, 0x99, 0xf1, 0xcc, 0xa7, 0x5f, 0xfa, 0x61, 0x5c, 0x42, - 0x7b, 0x71, 0x44, 0x8c, 0x2e, 0x43, 0x9d, 0xf8, 0xbe, 0xe7, 0x33, 0x93, 0x9a, 0x4f, 0xbd, 0x9f, - 0x13, 0x3f, 0xac, 0xb2, 0x4a, 0xa9, 0x30, 0x27, 0x46, 0x97, 0xe1, 0xb9, 0x80, 0x5b, 0x11, 0x5f, - 0x53, 0x06, 0xe2, 0xbb, 0x6a, 0xe1, 0x6d, 0xb2, 0x0b, 0x17, 0x3e, 0x1d, 0x4d, 0xb0, 0x8a, 0xe1, - 0x95, 0x54, 0x8b, 0x2c, 0xa3, 0x36, 0xd4, 0x99, 0xa0, 0x4e, 0x45, 0x35, 0xdb, 0x6a, 0x8e, 0xe1, - 0xd5, 0x16, 0x2e, 0x41, 0x53, 0xe4, 0x53, 0xfa, 0x45, 0x5e, 0xf7, 0x4e, 0x09, 0x1d, 0x80, 0xd6, - 0x06, 0x19, 0x6d, 0xf5, 0xbc, 0x20, 0xec, 0x94, 0xd1, 0x41, 0x68, 0x33, 0x5b, 0x78, 0xe0, 0x8e, - 0xf6, 0x3b, 0x95, 0x85, 0xf7, 0xa1, 0x2d, 0x5b, 0x84, 0x5a, 0x50, 0x5b, 0xdb, 0x1d, 0x8d, 0x3a, - 0x25, 0xb6, 0x34, 0x0d, 0x3d, 0x3f, 0x0a, 0x4c, 0xaf, 0x3e, 0xa3, 0xf3, 0x4c, 0xa7, 0x9c, 0xe7, - 0x0d, 0x2a, 0xa8, 0x03, 0x07, 0x84, 0x70, 0x5e, 0xe7, 0xaa, 0xf9, 0x8f, 0x65, 0x68, 0xcb, 0x17, - 0x63, 0xe8, 0xba, 0x30, 0x1a, 0xe3, 0x7c, 0x3f, 0x70, 0x35, 0x31, 0xda, 0xf9, 0x0f, 0xd0, 0x24, - 0x46, 0xfc, 0x0c, 0xcc, 0x0b, 0x97, 0x1b, 0x75, 0x3e, 0xf7, 0x9a, 0x89, 0xdc, 0x85, 0x3b, 0xb2, - 0xd7, 0x3b, 0xcc, 0xc4, 0x96, 0x3d, 0xd7, 0x25, 0x83, 0x90, 0xf5, 0xfd, 0x21, 0x98, 0x5b, 0xf3, - 0xc2, 0x75, 0x2f, 0x08, 0x68, 0xcb, 0x78, 0x4f, 0xc5, 0xe5, 0x15, 0x34, 0x0f, 0x10, 0xdd, 0x35, - 0xa3, 0x4e, 0xd2, 0xfc, 0xad, 0x32, 0x34, 0xf8, 0x3b, 0x36, 0xe6, 0xaf, 0x96, 0xa1, 0x21, 0xde, - 0xae, 0x79, 0x1d, 0x3a, 0xbe, 0x47, 0x81, 0xa3, 0x0d, 0x45, 0x7f, 0x45, 0xb4, 0x32, 0x95, 0x4f, - 0xf7, 0xb8, 0x9e, 0xa2, 0x15, 0x62, 0x09, 0xa0, 0xe5, 0xa1, 0x6b, 0x00, 0xfc, 0x6d, 0x9c, 0x87, - 0xfb, 0x63, 0x22, 0xd4, 0x39, 0x79, 0xc5, 0x4c, 0xbc, 0xa6, 0xc3, 0x0e, 0x63, 0x14, 0xea, 0x85, - 0xaf, 0xc0, 0x41, 0x4c, 0x82, 0xb1, 0xe7, 0x06, 0xe4, 0xc7, 0xf5, 0x8c, 0x7e, 0xee, 0x83, 0xf8, - 0x0b, 0xdf, 0xad, 0x43, 0x9d, 0xad, 0x2e, 0xcd, 0xbf, 0xaa, 0xcb, 0x75, 0x70, 0xca, 0xbe, 0x2f, - 0xaa, 0x17, 0x7d, 0x54, 0x43, 0xd5, 0x16, 0xa6, 0xfa, 0x05, 0x9f, 0x4f, 0x41, 0x6b, 0xec, 0x7b, - 0x43, 0x9f, 0xae, 0x67, 0x6b, 0x89, 0x87, 0x8a, 0x74, 0xb6, 0x75, 0x41, 0x86, 0x25, 0x83, 0xaa, - 0x7c, 0x75, 0x5d, 0xf9, 0x6e, 0x41, 0xdb, 0xf6, 0xbd, 0x31, 0xfb, 0x44, 0x5d, 0x1c, 0xae, 0x9d, - 0xcc, 0xc1, 0x5d, 0x89, 0xe8, 0x7a, 0x25, 0x1c, 0x33, 0x51, 0xf5, 0xe5, 0xbd, 0x2f, 0xce, 0xb5, - 0x5f, 0xca, 0x61, 0xe7, 0xe3, 0xd5, 0x2b, 0x61, 0x41, 0x4e, 0x19, 0xc9, 0x33, 0xc6, 0xd8, 0x9a, - 0xc8, 0xb8, 0xfa, 0x2c, 0x62, 0xe4, 0xe4, 0xe8, 0x3a, 0xb4, 0x02, 0x6b, 0x8f, 0xb0, 0xd7, 0x79, - 0xdb, 0x13, 0xbb, 0x62, 0x43, 0x90, 0xf5, 0x4a, 0x58, 0xb2, 0xd0, 0x26, 0xef, 0x38, 0x43, 0xbe, - 0x93, 0x14, 0x4f, 0x04, 0xe7, 0x35, 0xf9, 0x7e, 0x44, 0xc7, 0xde, 0x73, 0x8e, 0x12, 0x74, 0xe7, - 0xc3, 0x5d, 0xe6, 0x1c, 0x3f, 0x36, 0x66, 0x09, 0x73, 0x0e, 0xda, 0xb2, 0x8b, 0xcc, 0x96, 0x34, - 0x93, 0x16, 0x34, 0x78, 0x0b, 0x4c, 0x80, 0x56, 0x54, 0x21, 0x4a, 0x2c, 0xc1, 0xcd, 0x35, 0x68, - 0x45, 0x83, 0x96, 0xf3, 0x2c, 0x05, 0x82, 0x9a, 0xed, 0x89, 0x25, 0x53, 0x15, 0xb3, 0xff, 0x74, - 0x50, 0xd5, 0xf7, 0x8d, 0xda, 0xf2, 0x65, 0xa1, 0x85, 0xc5, 0xe8, 0xbe, 0x12, 0x75, 0x6d, 0x7c, - 0x33, 0x3e, 0x07, 0x4d, 0xbc, 0xcb, 0x56, 0xb3, 0x9d, 0x32, 0xcd, 0xa6, 0x5b, 0xa4, 0x4e, 0x85, - 0x7a, 0xc9, 0x65, 0xcb, 0x1d, 0x90, 0x11, 0x5b, 0x01, 0x49, 0xdf, 0x5b, 0x5b, 0x6a, 0x4b, 0xf0, - 0xa5, 0xe3, 0x7f, 0xfd, 0xe1, 0x89, 0xf2, 0x77, 0x3e, 0x3c, 0x51, 0xfe, 0xfe, 0x87, 0x27, 0xca, - 0xbf, 0xf2, 0x83, 0x13, 0xa5, 0xef, 0xfc, 0xe0, 0x44, 0xe9, 0x1f, 0x7e, 0x70, 0xa2, 0xf4, 0x41, - 0x65, 0xbc, 0xb9, 0xd9, 0x60, 0x77, 0x4e, 0x2e, 0xfd, 0x57, 0x00, 0x00, 0x00, 0xff, 0xff, 0x9a, - 0xe0, 0x31, 0x2b, 0x1d, 0x63, 0x00, 0x00, + // 6206 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x7d, 0x4b, 0x8c, 0x1c, 0xc7, + 0x79, 0xff, 0xbc, 0x1f, 0xdf, 0x92, 0xcb, 0x61, 0x91, 0xa2, 0x5a, 0x2d, 0x8a, 0xa2, 0x56, 0x24, + 0x45, 0x4b, 0xd4, 0x50, 0x22, 0x29, 0x52, 0xa6, 0xc5, 0xc7, 0xbe, 0xa8, 0x19, 0x3e, 0x96, 0xeb, + 0x5a, 0x92, 0x96, 0x65, 0xe3, 0x0f, 0xf7, 0x4e, 0xd7, 0xce, 0xb6, 0x39, 0xdb, 0x3d, 0xee, 0xee, + 0x5d, 0x72, 0x6d, 0xff, 0x1d, 0xc7, 0x76, 0x10, 0x04, 0x48, 0x90, 0x1c, 0x82, 0x24, 0xf0, 0x25, + 0x40, 0x10, 0x03, 0x39, 0x04, 0x41, 0x80, 0x5c, 0x92, 0x8b, 0x63, 0x20, 0x08, 0x12, 0xe7, 0x01, + 0xd8, 0xb7, 0x5c, 0x02, 0x1b, 0xf2, 0x25, 0x87, 0xe4, 0xe0, 0x04, 0x08, 0x72, 0x0c, 0xea, 0xd1, + 0xd5, 0x55, 0xfd, 0x98, 0x9e, 0xb1, 0xe4, 0x3c, 0x10, 0x9d, 0x76, 0xaa, 0xfa, 0xfb, 0x7e, 0x5f, + 0x3d, 0xbe, 0xef, 0xab, 0xaa, 0xaf, 0x1e, 0x0b, 0xc7, 0xc6, 0x9b, 0xe7, 0xc7, 0xbe, 0x17, 0x7a, + 0xc1, 0x79, 0xb2, 0x47, 0xdc, 0x30, 0xe8, 0xb2, 0x14, 0x6a, 0x5a, 0xee, 0x7e, 0xb8, 0x3f, 0x26, + 0xe6, 0xa9, 0xf1, 0xe3, 0xe1, 0xf9, 0x91, 0xb3, 0x79, 0x7e, 0xbc, 0x79, 0x7e, 0xc7, 0xb3, 0xc9, + 0x28, 0x22, 0x67, 0x09, 0x41, 0x6e, 0x1e, 0x1f, 0x7a, 0xde, 0x70, 0x44, 0xf8, 0xb7, 0xcd, 0xdd, + 0xad, 0xf3, 0x41, 0xe8, 0xef, 0x0e, 0x42, 0xfe, 0x75, 0xe1, 0xdb, 0xdf, 0x2b, 0x43, 0x7d, 0x95, + 0xc2, 0xa3, 0x0b, 0xd0, 0xda, 0x21, 0x41, 0x60, 0x0d, 0x49, 0x60, 0x94, 0x4f, 0x56, 0xcf, 0xce, + 0x5d, 0x38, 0xd6, 0x15, 0xa2, 0xba, 0x8c, 0xa2, 0x7b, 0x8f, 0x7f, 0xc6, 0x92, 0x0e, 0x1d, 0x87, + 0xf6, 0xc0, 0x73, 0x43, 0xf2, 0x34, 0xec, 0xdb, 0x46, 0xe5, 0x64, 0xf9, 0x6c, 0x1b, 0xc7, 0x19, + 0xe8, 0x12, 0xb4, 0x1d, 0xd7, 0x09, 0x1d, 0x2b, 0xf4, 0x7c, 0xa3, 0x7a, 0xb2, 0xac, 0x41, 0xb2, + 0x42, 0x76, 0x17, 0x07, 0x03, 0x6f, 0xd7, 0x0d, 0x71, 0x4c, 0x88, 0x0c, 0x68, 0x86, 0xbe, 0x35, + 0x20, 0x7d, 0xdb, 0xa8, 0x31, 0xc4, 0x28, 0x69, 0x7e, 0xff, 0x4d, 0x68, 0x8a, 0x32, 0xa0, 0xe7, + 0xa0, 0x19, 0x8c, 0x39, 0xd5, 0xb7, 0xca, 0x9c, 0x4c, 0xa4, 0xd1, 0x0d, 0x98, 0xb3, 0x38, 0xec, + 0xc6, 0xb6, 0xf7, 0xc4, 0x28, 0x33, 0xc1, 0xcf, 0x27, 0xea, 0x22, 0x04, 0x77, 0x29, 0x49, 0xaf, + 0x84, 0x55, 0x0e, 0xd4, 0x87, 0x79, 0x91, 0x5c, 0x21, 0xa1, 0xe5, 0x8c, 0x02, 0xe3, 0xfb, 0x1c, + 0xe4, 0x44, 0x0e, 0x88, 0x20, 0xeb, 0x95, 0x70, 0x82, 0x11, 0x7d, 0x16, 0x8e, 0x88, 0x9c, 0x65, + 0xcf, 0xdd, 0x72, 0x86, 0x0f, 0xc7, 0xb6, 0x15, 0x12, 0xe3, 0x6f, 0x38, 0xde, 0xa9, 0x1c, 0x3c, + 0x4e, 0xdb, 0xe5, 0xc4, 0xbd, 0x12, 0xce, 0xc2, 0x40, 0xb7, 0xe0, 0xa0, 0xc8, 0x16, 0xa0, 0x7f, + 0xcb, 0x41, 0x5f, 0xc8, 0x01, 0x95, 0x68, 0x3a, 0x1b, 0xfa, 0x1c, 0x1c, 0x15, 0x19, 0x77, 0x1d, + 0xf7, 0xf1, 0xf2, 0xb6, 0x35, 0x1a, 0x11, 0x77, 0x48, 0x8c, 0xbf, 0x9b, 0x5c, 0x46, 0x8d, 0xb8, + 0x57, 0xc2, 0x99, 0x20, 0x68, 0x08, 0x46, 0x56, 0x7e, 0xcf, 0xb1, 0x89, 0xf1, 0xf7, 0x5c, 0xc0, + 0xd9, 0xa9, 0x04, 0x38, 0x36, 0x15, 0x92, 0x0b, 0x86, 0xee, 0x43, 0xc7, 0xdb, 0xfc, 0x22, 0x19, + 0x44, 0x2d, 0xbf, 0x41, 0x42, 0xa3, 0xc3, 0xf0, 0x5f, 0x4a, 0xe0, 0xdf, 0x67, 0x64, 0x51, 0x9f, + 0x75, 0x37, 0x48, 0xd8, 0x2b, 0xe1, 0x14, 0x33, 0x7a, 0x08, 0x48, 0xcb, 0x5b, 0xdc, 0x21, 0xae, + 0x6d, 0x5c, 0x60, 0x90, 0x2f, 0x4f, 0x86, 0x64, 0xa4, 0xbd, 0x12, 0xce, 0x00, 0x48, 0xc1, 0x3e, + 0x74, 0x03, 0x12, 0x1a, 0x17, 0xa7, 0x81, 0x65, 0xa4, 0x29, 0x58, 0x96, 0x4b, 0x3b, 0x91, 0xe7, + 0x62, 0x32, 0xb2, 0x42, 0xc7, 0x73, 0x45, 0x79, 0x2f, 0x31, 0xe0, 0xd3, 0xd9, 0xc0, 0x92, 0x56, + 0x96, 0x38, 0x13, 0x04, 0xfd, 0x3f, 0x78, 0x26, 0x91, 0x8f, 0xc9, 0x8e, 0xb7, 0x47, 0x8c, 0xb7, + 0x18, 0xfa, 0x99, 0x22, 0x74, 0x4e, 0xdd, 0x2b, 0xe1, 0x6c, 0x18, 0xb4, 0x04, 0x07, 0xa2, 0x0f, + 0x0c, 0xf6, 0x32, 0x83, 0x3d, 0x9e, 0x07, 0x2b, 0xc0, 0x34, 0x1e, 0x6a, 0xf4, 0x3c, 0xbd, 0x3c, + 0xf2, 0x02, 0x62, 0x2c, 0x66, 0x1a, 0xbd, 0x80, 0x60, 0x24, 0xd4, 0xe8, 0x15, 0x0e, 0xb5, 0x92, + 0x41, 0xe8, 0x3b, 0x03, 0x56, 0x40, 0xaa, 0x45, 0x57, 0x26, 0x57, 0x32, 0x26, 0x16, 0xaa, 0x94, + 0x0d, 0x83, 0x30, 0x1c, 0x0a, 0x76, 0x37, 0x83, 0x81, 0xef, 0x8c, 0x69, 0xde, 0xa2, 0x6d, 0x1b, + 0xef, 0x4c, 0x42, 0xde, 0x50, 0x88, 0xbb, 0x8b, 0x36, 0xed, 0x9d, 0x24, 0x00, 0xfa, 0x1c, 0x20, + 0x35, 0x4b, 0x34, 0xdf, 0x35, 0x06, 0xfb, 0x89, 0x29, 0x60, 0x65, 0x5b, 0x66, 0xc0, 0x20, 0x0b, + 0x8e, 0xaa, 0xb9, 0xeb, 0x5e, 0xe0, 0xd0, 0xbf, 0xc6, 0x75, 0x06, 0xff, 0xda, 0x14, 0xf0, 0x11, + 0x0b, 0x55, 0xac, 0x2c, 0xa8, 0xa4, 0x88, 0x65, 0x6a, 0xda, 0xc4, 0x0f, 0x8c, 0x1b, 0x53, 0x8b, + 0x88, 0x58, 0x92, 0x22, 0xa2, 0xfc, 0x64, 0x13, 0xbd, 0xeb, 0x7b, 0xbb, 0xe3, 0xc0, 0xb8, 0x39, + 0x75, 0x13, 0x71, 0x86, 0x64, 0x13, 0xf1, 0x5c, 0x74, 0x19, 0x5a, 0x9b, 0x23, 0x6f, 0xf0, 0x98, + 0x76, 0x66, 0x85, 0x41, 0x1a, 0x09, 0xc8, 0x25, 0xfa, 0x59, 0x74, 0x9f, 0xa4, 0xa5, 0xca, 0xca, + 0x7e, 0xaf, 0x90, 0x11, 0x09, 0x89, 0x18, 0x1a, 0x9f, 0xcf, 0x64, 0xe5, 0x24, 0x54, 0x59, 0x15, + 0x0e, 0xb4, 0x02, 0x73, 0x5b, 0xce, 0x88, 0x04, 0x0f, 0xc7, 0x23, 0xcf, 0xe2, 0xe3, 0xe4, 0xdc, + 0x85, 0x93, 0x99, 0x00, 0xb7, 0x62, 0x3a, 0x8a, 0xa2, 0xb0, 0xa1, 0xeb, 0xd0, 0xde, 0xb1, 0xfc, + 0xc7, 0x41, 0xdf, 0xdd, 0xf2, 0x8c, 0x7a, 0xe6, 0x08, 0xc7, 0x31, 0xee, 0x45, 0x54, 0xbd, 0x12, + 0x8e, 0x59, 0xe8, 0x38, 0xc9, 0x0a, 0xb5, 0x41, 0xc2, 0x5b, 0x0e, 0x19, 0xd9, 0x81, 0xd1, 0x60, + 0x20, 0x2f, 0x66, 0x82, 0x6c, 0x90, 0xb0, 0xcb, 0xc9, 0xe8, 0x38, 0xa9, 0x33, 0xa2, 0xf7, 0xe0, + 0x48, 0x94, 0xb3, 0xbc, 0xed, 0x8c, 0x6c, 0x9f, 0xb8, 0x7d, 0x3b, 0x30, 0x9a, 0x99, 0x43, 0x50, + 0x8c, 0xa7, 0xd0, 0xd2, 0x61, 0x32, 0x03, 0x82, 0x7a, 0xc6, 0x28, 0x5b, 0x35, 0x49, 0xa3, 0x95, + 0xe9, 0x19, 0x63, 0x68, 0x95, 0x98, 0x6a, 0x57, 0x16, 0x08, 0xb2, 0xe1, 0xd9, 0x28, 0x7f, 0xc9, + 0x1a, 0x3c, 0x1e, 0xfa, 0xde, 0xae, 0x6b, 0x2f, 0x7b, 0x23, 0xcf, 0x37, 0xda, 0x99, 0x83, 0x5b, + 0x8c, 0x9f, 0xa0, 0xef, 0x95, 0x70, 0x1e, 0x14, 0x5a, 0x86, 0x03, 0xd1, 0xa7, 0x07, 0xe4, 0x69, + 0x68, 0x40, 0xe6, 0x38, 0x1f, 0x43, 0x53, 0x22, 0xea, 0x20, 0x55, 0x26, 0x15, 0x84, 0xaa, 0x84, + 0x31, 0x57, 0x00, 0x42, 0x89, 0x54, 0x10, 0x9a, 0x56, 0x41, 0xe8, 0x10, 0x6c, 0x1c, 0x2c, 0x00, + 0xa1, 0x44, 0x2a, 0x08, 0x4d, 0xd3, 0xa1, 0x5a, 0xd6, 0xd4, 0xf3, 0x1e, 0x53, 0x7d, 0x32, 0xe6, + 0x33, 0x87, 0x6a, 0xa5, 0xb5, 0x04, 0x21, 0x1d, 0xaa, 0x93, 0xcc, 0x74, 0x26, 0x14, 0xe5, 0x2d, + 0x8e, 0x9c, 0xa1, 0x6b, 0x1c, 0x9a, 0xa0, 0xcb, 0x14, 0x8d, 0x51, 0xd1, 0x99, 0x90, 0xc6, 0x86, + 0x6e, 0x0a, 0xb3, 0xdc, 0x20, 0xe1, 0x8a, 0xb3, 0x67, 0x1c, 0xce, 0x1c, 0x86, 0x62, 0x94, 0x15, + 0x67, 0x4f, 0xda, 0x25, 0x67, 0x51, 0xab, 0x16, 0x0d, 0x72, 0xc6, 0x33, 0x05, 0x55, 0x8b, 0x08, + 0xd5, 0xaa, 0x45, 0x79, 0x6a, 0xd5, 0xee, 0x5a, 0x21, 0x79, 0x6a, 0x3c, 0x57, 0x50, 0x35, 0x46, + 0xa5, 0x56, 0x8d, 0x65, 0xd0, 0xd1, 0x2d, 0xca, 0x78, 0x44, 0xfc, 0xd0, 0x19, 0x58, 0x23, 0xde, + 0x54, 0xa7, 0x32, 0xc7, 0xa0, 0x18, 0x4f, 0xa3, 0xa6, 0xa3, 0x5b, 0x26, 0x8c, 0x5a, 0xf1, 0x07, + 0xd6, 0xe6, 0x88, 0x60, 0xef, 0x89, 0x71, 0xba, 0xa0, 0xe2, 0x11, 0xa1, 0x5a, 0xf1, 0x28, 0x4f, + 0xf5, 0x2d, 0x9f, 0x71, 0xec, 0x21, 0x09, 0x8d, 0xb3, 0x05, 0xbe, 0x85, 0x93, 0xa9, 0xbe, 0x85, + 0xe7, 0x48, 0x0f, 0xb0, 0x62, 0x85, 0xd6, 0x9e, 0x43, 0x9e, 0x3c, 0x72, 0xc8, 0x13, 0x3a, 0xb0, + 0x1f, 0x99, 0xe0, 0x01, 0x22, 0xda, 0xae, 0x20, 0x96, 0x1e, 0x20, 0x01, 0x22, 0x3d, 0x80, 0x9a, + 0x2f, 0xdc, 0xfa, 0xd1, 0x09, 0x1e, 0x40, 0xc3, 0x97, 0x3e, 0x3e, 0x0f, 0x0a, 0x59, 0x70, 0x2c, + 0xf5, 0xe9, 0xbe, 0x6f, 0x13, 0xdf, 0x78, 0x81, 0x09, 0x79, 0xa5, 0x58, 0x08, 0x23, 0xef, 0x95, + 0x70, 0x0e, 0x50, 0x4a, 0xc4, 0x86, 0xb7, 0xeb, 0x0f, 0x08, 0x6d, 0xa7, 0x97, 0xa7, 0x11, 0x21, + 0xc9, 0x53, 0x22, 0xe4, 0x17, 0xb4, 0x07, 0x2f, 0xc8, 0x2f, 0x54, 0x30, 0x1b, 0x45, 0x99, 0x74, + 0xb1, 0x82, 0x39, 0xc3, 0x24, 0x75, 0x27, 0x4b, 0x4a, 0x72, 0xf5, 0x4a, 0x78, 0x32, 0x2c, 0xda, + 0x87, 0x13, 0x1a, 0x01, 0x1f, 0xe7, 0x55, 0xc1, 0xaf, 0x30, 0xc1, 0xe7, 0x27, 0x0b, 0x4e, 0xb1, + 0xf5, 0x4a, 0xb8, 0x00, 0x18, 0x8d, 0xe1, 0x79, 0xad, 0x31, 0x22, 0xc3, 0x16, 0x2a, 0xf2, 0x55, + 0x26, 0xf7, 0xdc, 0x64, 0xb9, 0x3a, 0x4f, 0xaf, 0x84, 0x27, 0x41, 0xd2, 0x15, 0x57, 0xe6, 0x67, + 0xda, 0x93, 0x5f, 0xc9, 0x9c, 0xf6, 0xe4, 0x88, 0xe3, 0x7d, 0x99, 0x0b, 0x96, 0xa9, 0xf9, 0xa2, + 0x39, 0xff, 0xff, 0xb4, 0x9a, 0x2f, 0xdb, 0x31, 0x0f, 0x4a, 0xeb, 0x3b, 0xfa, 0xe9, 0x81, 0xe5, + 0x0f, 0x49, 0xc8, 0x1b, 0xba, 0x6f, 0xd3, 0x4a, 0x7d, 0x6d, 0x9a, 0xbe, 0x4b, 0xb1, 0x69, 0x7d, + 0x97, 0x09, 0x8c, 0x02, 0x38, 0xae, 0x51, 0xf4, 0x83, 0x65, 0x6f, 0x34, 0x22, 0x83, 0xa8, 0x35, + 0x7f, 0x81, 0x09, 0x7e, 0x7d, 0xb2, 0xe0, 0x04, 0x53, 0xaf, 0x84, 0x27, 0x82, 0xa6, 0xea, 0x7b, + 0x7f, 0x64, 0x27, 0x74, 0xc6, 0x98, 0x4a, 0x57, 0x93, 0x6c, 0xa9, 0xfa, 0xa6, 0x28, 0x52, 0xba, + 0xaa, 0x50, 0xd0, 0xea, 0x3e, 0x3b, 0x8d, 0xae, 0xea, 0x3c, 0x29, 0x5d, 0xd5, 0x3f, 0xd3, 0xd1, + 0x6d, 0x37, 0x20, 0x3e, 0xc3, 0xb8, 0xed, 0x39, 0xae, 0xf1, 0x62, 0xe6, 0xe8, 0xf6, 0x30, 0x20, + 0xbe, 0x10, 0x44, 0xa9, 0xe8, 0xe8, 0xa6, 0xb1, 0x69, 0x38, 0x77, 0xc9, 0x56, 0x68, 0x9c, 0x2c, + 0xc2, 0xa1, 0x54, 0x1a, 0x0e, 0xcd, 0xa0, 0x23, 0x85, 0xcc, 0xd8, 0x20, 0xb4, 0x57, 0xb0, 0xe5, + 0x0e, 0x89, 0xf1, 0x52, 0xe6, 0x48, 0xa1, 0xc0, 0x29, 0xc4, 0x74, 0xa4, 0xc8, 0x02, 0xa1, 0x2b, + 0x7f, 0x99, 0x4f, 0x67, 0x64, 0x1c, 0x7a, 0x21, 0x73, 0xe5, 0xaf, 0x40, 0x4b, 0x52, 0xba, 0x06, + 0x49, 0x03, 0xa0, 0x4f, 0x40, 0x6d, 0xec, 0xb8, 0x43, 0xc3, 0x66, 0x40, 0x47, 0x12, 0x40, 0xeb, + 0x8e, 0x3b, 0xec, 0x95, 0x30, 0x23, 0x41, 0xef, 0x00, 0x8c, 0x7d, 0x6f, 0x40, 0x82, 0x60, 0x8d, + 0x3c, 0x31, 0x08, 0x63, 0x30, 0x93, 0x0c, 0x9c, 0xa0, 0xbb, 0x46, 0xe8, 0xb8, 0xac, 0xd0, 0xa3, + 0x55, 0x38, 0x28, 0x52, 0xc2, 0xca, 0xb7, 0x32, 0x27, 0x7f, 0x11, 0x40, 0x1c, 0x6e, 0xd2, 0xb8, + 0xe8, 0xda, 0x47, 0x64, 0xac, 0x78, 0x2e, 0x31, 0x86, 0x99, 0x6b, 0x9f, 0x08, 0x84, 0x92, 0xd0, + 0x39, 0x96, 0xc2, 0x81, 0x96, 0xe0, 0x40, 0xb8, 0xed, 0x13, 0xcb, 0xde, 0x08, 0xad, 0x70, 0x37, + 0x30, 0xdc, 0xcc, 0x69, 0x1a, 0xff, 0xd8, 0x7d, 0xc0, 0x28, 0xe9, 0x14, 0x54, 0xe5, 0x41, 0x6b, + 0xd0, 0xa1, 0x0b, 0xa1, 0xbb, 0xce, 0x8e, 0x13, 0x62, 0x62, 0x0d, 0xb6, 0x89, 0x6d, 0x78, 0x99, + 0x8b, 0x28, 0x3a, 0xed, 0xed, 0xaa, 0x74, 0x74, 0xb6, 0x92, 0xe4, 0x45, 0x3d, 0x98, 0xa7, 0x79, + 0x1b, 0x63, 0x6b, 0x40, 0x1e, 0x06, 0xd6, 0x90, 0x18, 0xe3, 0x4c, 0x0d, 0x64, 0x68, 0x31, 0x15, + 0x9d, 0xac, 0xe8, 0x7c, 0x11, 0xd2, 0x5d, 0x6f, 0x60, 0x8d, 0x38, 0xd2, 0x97, 0xf2, 0x91, 0x62, + 0xaa, 0x08, 0x29, 0xce, 0xd1, 0xea, 0xc8, 0xdb, 0xde, 0x36, 0xf6, 0x0a, 0xea, 0x28, 0xe8, 0xb4, + 0x3a, 0x8a, 0x3c, 0x8a, 0xe7, 0x7a, 0xa1, 0xb3, 0xe5, 0x0c, 0x84, 0xfd, 0xba, 0xb6, 0xe1, 0x67, + 0xe2, 0xad, 0x29, 0x64, 0xdd, 0x0d, 0x1e, 0x59, 0x4a, 0xf1, 0xa2, 0x07, 0x80, 0xd4, 0x3c, 0xa1, + 0x54, 0x01, 0x43, 0x5c, 0x98, 0x84, 0x28, 0x35, 0x2b, 0x83, 0x9f, 0x96, 0x72, 0x6c, 0xed, 0xd3, + 0xe5, 0xed, 0x92, 0xef, 0x59, 0xf6, 0xc0, 0x0a, 0x42, 0x23, 0xcc, 0x2c, 0xe5, 0x3a, 0x27, 0xeb, + 0x4a, 0x3a, 0x5a, 0xca, 0x24, 0x2f, 0xc5, 0xdb, 0x21, 0x3b, 0x9b, 0xc4, 0x0f, 0xb6, 0x9d, 0xb1, + 0x28, 0xe3, 0x6e, 0x26, 0xde, 0x3d, 0x49, 0x16, 0x97, 0x30, 0xc5, 0x4b, 0x27, 0xe2, 0x2c, 0x4e, + 0xbd, 0xb1, 0xef, 0x0e, 0xb8, 0x32, 0x0a, 0xd0, 0x27, 0x99, 0x13, 0x71, 0xa6, 0x19, 0xdd, 0x98, + 0x38, 0x86, 0xce, 0x86, 0x41, 0x77, 0xe0, 0xd0, 0xf8, 0xc2, 0x58, 0x43, 0x7e, 0x9a, 0x39, 0x71, + 0x5e, 0xbf, 0xb0, 0x9e, 0x84, 0x4c, 0x72, 0x52, 0x53, 0x73, 0x76, 0xc6, 0x9e, 0x1f, 0xde, 0x72, + 0x5c, 0x27, 0xd8, 0x36, 0xf6, 0x33, 0x4d, 0xad, 0xcf, 0x48, 0xba, 0x9c, 0x86, 0x9a, 0x9a, 0xca, + 0x83, 0x2e, 0x41, 0x73, 0xb0, 0x6d, 0x85, 0x8b, 0xb6, 0x6d, 0x7c, 0x9d, 0x07, 0x7c, 0x9f, 0x4d, + 0xf0, 0x2f, 0x6f, 0x5b, 0xa1, 0x08, 0x91, 0x44, 0xa4, 0xe8, 0x1a, 0x00, 0xfd, 0x29, 0x6a, 0xf0, + 0x8b, 0xe5, 0x4c, 0x5f, 0xc5, 0x18, 0x65, 0xe9, 0x15, 0x06, 0xf4, 0x1e, 0x1c, 0x89, 0x53, 0xd4, + 0x48, 0xf9, 0x9a, 0xff, 0x1b, 0xe5, 0x4c, 0x6f, 0xab, 0xe0, 0x48, 0xda, 0x5e, 0x09, 0x67, 0x41, + 0x44, 0x05, 0x13, 0x63, 0xf1, 0x37, 0x27, 0x14, 0x4c, 0x8e, 0xbb, 0x0a, 0xc3, 0x52, 0x13, 0xea, + 0x7b, 0xd6, 0x68, 0x97, 0x98, 0xdf, 0xad, 0x40, 0x8d, 0x92, 0x99, 0x04, 0xaa, 0xb4, 0xc2, 0xf3, + 0x50, 0x71, 0x6c, 0x83, 0xef, 0x64, 0x54, 0x1c, 0x1b, 0x19, 0xd0, 0xf4, 0xe8, 0x3c, 0x52, 0xee, + 0xab, 0x44, 0x49, 0xda, 0xa0, 0x62, 0xff, 0x45, 0x04, 0x8e, 0xcc, 0xc4, 0x9e, 0x0a, 0x85, 0x8d, + 0xb6, 0x6a, 0x22, 0x52, 0xd3, 0x80, 0x86, 0x18, 0xe6, 0x13, 0x92, 0xcc, 0x35, 0x68, 0x88, 0x56, + 0x4b, 0x96, 0x41, 0x91, 0x54, 0x99, 0x5e, 0x12, 0x81, 0x43, 0xc9, 0x46, 0x4b, 0x02, 0x2f, 0x41, + 0xdb, 0x97, 0x9d, 0x52, 0x49, 0xc4, 0x78, 0x52, 0xd0, 0x5d, 0x09, 0x84, 0x63, 0x36, 0xf3, 0x3b, + 0x0d, 0x68, 0x8a, 0xad, 0x02, 0x73, 0x0d, 0x6a, 0x6c, 0xe3, 0xe6, 0x28, 0xd4, 0x1d, 0xd7, 0x26, + 0x4f, 0x99, 0xa8, 0x3a, 0xe6, 0x09, 0xf4, 0x06, 0x34, 0xc5, 0xb6, 0x81, 0x90, 0x95, 0xb7, 0x09, + 0x15, 0x91, 0x99, 0xef, 0x43, 0x33, 0xda, 0xc0, 0x39, 0x0e, 0xed, 0xb1, 0xef, 0x51, 0x67, 0xd8, + 0x8f, 0x6a, 0x10, 0x67, 0xa0, 0x37, 0xa1, 0x69, 0x8b, 0x2d, 0xa2, 0x8a, 0xd0, 0x6d, 0xbe, 0xdd, + 0xd6, 0x8d, 0xb6, 0xdb, 0xba, 0x1b, 0x6c, 0xbb, 0x0d, 0x47, 0x74, 0xe6, 0xd7, 0xcb, 0xd0, 0xe0, + 0xfb, 0x38, 0xe6, 0x9e, 0x6c, 0xf9, 0xb7, 0xa0, 0x31, 0x60, 0x79, 0x46, 0x72, 0x0f, 0x47, 0x2b, + 0xa1, 0xd8, 0x18, 0xc2, 0x82, 0x98, 0xb2, 0x05, 0x7c, 0x10, 0xac, 0x4c, 0x64, 0xe3, 0x46, 0x8d, + 0x05, 0xf1, 0x7f, 0x9b, 0xdc, 0x3f, 0xaf, 0xc0, 0x41, 0x7d, 0x7b, 0xe8, 0x38, 0xb4, 0x07, 0x72, + 0xc3, 0x49, 0xb4, 0xae, 0xcc, 0x40, 0xf7, 0x01, 0x06, 0x23, 0x87, 0xb8, 0x21, 0x0b, 0x50, 0x56, + 0x32, 0xe7, 0xbd, 0x99, 0xbb, 0x45, 0xdd, 0x65, 0xc9, 0x86, 0x15, 0x08, 0x74, 0x03, 0xea, 0xc1, + 0xc0, 0x1b, 0x73, 0xc3, 0x99, 0x57, 0x16, 0x42, 0x7a, 0xb1, 0x17, 0x77, 0xc3, 0x6d, 0x3e, 0xb6, + 0x2e, 0x8e, 0x9d, 0x0d, 0xca, 0x80, 0x39, 0x9f, 0xf9, 0x35, 0x80, 0x18, 0x1a, 0x9d, 0x94, 0x53, + 0x99, 0x35, 0x6b, 0x27, 0x2a, 0xbf, 0x9a, 0xa5, 0x50, 0xac, 0x5b, 0xe1, 0xb6, 0xb0, 0x64, 0x35, + 0x0b, 0x9d, 0x83, 0xc3, 0x81, 0x33, 0x74, 0xad, 0x70, 0xd7, 0x27, 0x8f, 0x88, 0xef, 0x6c, 0x39, + 0xc4, 0x66, 0xc5, 0x6b, 0xe1, 0xf4, 0x07, 0xf3, 0x4d, 0x38, 0x9c, 0xde, 0xfa, 0x9a, 0xd8, 0x88, + 0xe6, 0xaf, 0xb4, 0xa1, 0xc1, 0x57, 0x35, 0xe6, 0xbf, 0x57, 0xa4, 0x5e, 0x9b, 0x7f, 0x51, 0x86, + 0x3a, 0xdf, 0xdd, 0x49, 0x1a, 0xe7, 0x2d, 0x55, 0xa7, 0xab, 0x19, 0x53, 0xfe, 0xac, 0xdd, 0xae, + 0xee, 0x1d, 0xb2, 0xff, 0x88, 0x3a, 0x36, 0xa9, 0xe8, 0xe8, 0x18, 0x34, 0x82, 0xdd, 0xcd, 0xbe, + 0x1d, 0x18, 0xd5, 0x93, 0xd5, 0xb3, 0x6d, 0x2c, 0x52, 0xe6, 0x6d, 0x68, 0x45, 0xc4, 0xa8, 0x03, + 0xd5, 0xc7, 0x64, 0x5f, 0x08, 0xa7, 0x3f, 0xd1, 0x39, 0xe1, 0x20, 0xa5, 0xa9, 0x26, 0xed, 0x89, + 0x4b, 0x11, 0x5e, 0xf4, 0x0b, 0x50, 0xa5, 0xeb, 0x88, 0x64, 0x15, 0x66, 0x37, 0xcb, 0xdc, 0xd2, + 0x2e, 0x43, 0x9d, 0xef, 0xb0, 0x25, 0x65, 0x20, 0xa8, 0x3d, 0x26, 0xfb, 0xbc, 0x8d, 0xda, 0x98, + 0xfd, 0xce, 0x05, 0xf9, 0x5e, 0x15, 0x0e, 0xa8, 0xbb, 0x0a, 0xe6, 0x6a, 0xae, 0xd3, 0xb7, 0xb6, + 0x42, 0xd5, 0xe9, 0x8b, 0x24, 0xf5, 0x6c, 0x0c, 0x8b, 0xa9, 0x46, 0x1b, 0xf3, 0x84, 0xd9, 0x85, + 0x86, 0xd8, 0xac, 0x49, 0x22, 0x49, 0xfa, 0x8a, 0x4a, 0x7f, 0x1b, 0x5a, 0x72, 0xef, 0xe5, 0xc3, + 0xca, 0xf6, 0xa1, 0x25, 0x37, 0x59, 0x8e, 0x42, 0x3d, 0xf4, 0x42, 0x6b, 0xc4, 0xe0, 0xaa, 0x98, + 0x27, 0xa8, 0x5e, 0xba, 0xe4, 0x69, 0xb8, 0x2c, 0x3d, 0x6f, 0x15, 0xc7, 0x19, 0xdc, 0xb1, 0x92, + 0x3d, 0xfe, 0xb5, 0xca, 0xbf, 0xca, 0x8c, 0x58, 0x66, 0x4d, 0x95, 0xb9, 0x0f, 0x0d, 0xb1, 0xf3, + 0x22, 0xbf, 0x97, 0x95, 0xef, 0x68, 0x11, 0xea, 0x43, 0xfa, 0x5d, 0xf4, 0xfa, 0x6b, 0x09, 0xfb, + 0xe6, 0x0b, 0xaa, 0x65, 0xcf, 0x0d, 0xa9, 0x1a, 0xeb, 0x01, 0x25, 0xcc, 0x39, 0x69, 0x17, 0xfa, + 0x7c, 0x1b, 0x8d, 0x1b, 0xa1, 0x48, 0x99, 0xdf, 0x29, 0x43, 0x5b, 0xee, 0x5b, 0x9a, 0xef, 0xe7, + 0x19, 0xcf, 0x22, 0x1c, 0xf4, 0x05, 0x15, 0x35, 0xd4, 0xc8, 0x84, 0x9e, 0x4f, 0x94, 0x04, 0x2b, + 0x34, 0x58, 0xe7, 0x30, 0xdf, 0xc9, 0xed, 0xd4, 0x05, 0x38, 0x10, 0x91, 0xde, 0x89, 0x55, 0x4f, + 0xcb, 0x33, 0x4d, 0xc9, 0xdd, 0x81, 0xaa, 0x63, 0xf3, 0xa3, 0x1c, 0x6d, 0x4c, 0x7f, 0x9a, 0x5b, + 0x70, 0x40, 0xdd, 0xbd, 0x30, 0x1f, 0x65, 0x5b, 0xcf, 0x0d, 0x2a, 0x46, 0xd9, 0x29, 0xa9, 0x24, + 0x96, 0x68, 0x51, 0x15, 0x62, 0x12, 0xac, 0x31, 0x98, 0xcf, 0x42, 0x9d, 0xef, 0xa9, 0x26, 0xa7, + 0x1a, 0xdf, 0x1e, 0x40, 0x9d, 0x75, 0x82, 0x79, 0x91, 0x1b, 0xc0, 0x39, 0x68, 0xb0, 0xf8, 0x40, + 0x74, 0xe2, 0xe4, 0x68, 0x56, 0x8f, 0x61, 0x41, 0x63, 0x2e, 0xc3, 0x9c, 0xb2, 0x9b, 0x45, 0x35, + 0x96, 0x7d, 0x90, 0x5a, 0x10, 0x25, 0x91, 0x09, 0x2d, 0x3a, 0x40, 0x0b, 0x9f, 0x4b, 0xeb, 0x2f, + 0xd3, 0xe6, 0x29, 0x39, 0x11, 0x32, 0xc5, 0xee, 0x5d, 0x5f, 0xb6, 0x92, 0x4c, 0x9b, 0x9f, 0x87, + 0xb6, 0xdc, 0xf4, 0x42, 0xf7, 0xe1, 0x80, 0xd8, 0xf4, 0xe2, 0x6b, 0x76, 0x4a, 0x3c, 0x5f, 0xa0, + 0x5d, 0x74, 0x81, 0xce, 0xf6, 0xcd, 0xba, 0x0f, 0xf6, 0xc7, 0x04, 0x6b, 0x00, 0xe6, 0x2f, 0x9d, + 0x65, 0x2d, 0x6f, 0x8e, 0xa1, 0x25, 0x23, 0xfd, 0xc9, 0x5e, 0xb8, 0xc2, 0x5d, 0x63, 0xa5, 0x70, + 0x9b, 0x8a, 0xf3, 0x53, 0x07, 0xcc, 0x3c, 0xa8, 0xf9, 0x3c, 0x54, 0xef, 0x90, 0x7d, 0x6a, 0x21, + 0xdc, 0x91, 0x0a, 0x0b, 0xe1, 0x0e, 0xb3, 0x0f, 0x0d, 0xb1, 0xe3, 0x96, 0x94, 0x77, 0x1e, 0x1a, + 0x5b, 0x7c, 0x13, 0xaf, 0xc0, 0x65, 0x0a, 0x32, 0xf3, 0x06, 0xcc, 0xa9, 0xfb, 0x6c, 0x49, 0xbc, + 0x93, 0x30, 0x37, 0x50, 0x76, 0xf2, 0x78, 0x37, 0xa8, 0x59, 0x26, 0xd1, 0xd5, 0x31, 0x85, 0xb0, + 0x9a, 0xa9, 0x87, 0x2f, 0x65, 0x36, 0xfb, 0x04, 0x6d, 0xbc, 0x03, 0x87, 0x92, 0x1b, 0x6a, 0x49, + 0x49, 0x67, 0xe1, 0xd0, 0x66, 0x62, 0xfb, 0x8e, 0xfb, 0xc0, 0x64, 0xb6, 0xd9, 0x87, 0x3a, 0xdf, + 0xf0, 0x48, 0x42, 0xbc, 0x01, 0x75, 0x8b, 0x6d, 0xa8, 0x54, 0xd8, 0xd4, 0xc2, 0xcc, 0x2c, 0x25, + 0x63, 0xc5, 0x9c, 0xd0, 0x74, 0xe0, 0xa0, 0xbe, 0x87, 0x92, 0x84, 0xec, 0xc1, 0xc1, 0x3d, 0x6d, + 0xaf, 0x86, 0x43, 0x2f, 0x64, 0x42, 0x6b, 0x50, 0x58, 0x67, 0x34, 0xbf, 0xd1, 0x80, 0x1a, 0xdb, + 0x04, 0x4c, 0x8a, 0xb8, 0x0c, 0xb5, 0x90, 0x3c, 0x8d, 0xe6, 0xc5, 0x0b, 0x13, 0x77, 0x14, 0x79, + 0x24, 0x8a, 0xd1, 0xa3, 0x4f, 0x42, 0x3d, 0x08, 0xf7, 0x47, 0xd1, 0x0a, 0xe4, 0xe5, 0xc9, 0x8c, + 0x1b, 0x94, 0x14, 0x73, 0x0e, 0xca, 0xca, 0x6c, 0x41, 0x6c, 0x5a, 0x17, 0xb0, 0x32, 0x23, 0xc4, + 0x9c, 0x03, 0xdd, 0xa0, 0x4b, 0x49, 0x32, 0x78, 0x4c, 0x6c, 0xb1, 0x5b, 0x7d, 0x7a, 0x32, 0xf3, + 0x32, 0x27, 0xc6, 0x11, 0x17, 0x95, 0x3d, 0x60, 0xbd, 0xdb, 0x98, 0x46, 0x36, 0xeb, 0x71, 0xcc, + 0x39, 0xd0, 0x2a, 0xb4, 0x9d, 0x81, 0xe7, 0xae, 0xee, 0x78, 0x5f, 0x74, 0xc4, 0xb6, 0xf4, 0x2b, + 0x93, 0xd9, 0xfb, 0x11, 0x39, 0x8e, 0x39, 0x23, 0x98, 0xfe, 0x0e, 0x5d, 0x54, 0xb5, 0xa6, 0x85, + 0x61, 0xe4, 0x38, 0xe6, 0x34, 0x8f, 0x8b, 0xfe, 0xcc, 0x36, 0xf2, 0x5b, 0x50, 0x67, 0x4d, 0x8e, + 0xae, 0xa9, 0x9f, 0xe7, 0x15, 0x49, 0xb9, 0x1e, 0x4b, 0x74, 0x95, 0xc4, 0x61, 0xed, 0xaf, 0xe3, + 0xcc, 0x4d, 0x83, 0x23, 0xfa, 0x8d, 0xe3, 0xbc, 0x08, 0x4d, 0xd1, 0x15, 0x7a, 0x81, 0x5b, 0x11, + 0xc1, 0x0b, 0x50, 0xe7, 0x86, 0x99, 0x5d, 0x9f, 0x97, 0xa0, 0x2d, 0x1b, 0x73, 0x32, 0x09, 0x6b, + 0x9d, 0x1c, 0x92, 0x5f, 0xae, 0x40, 0x9d, 0x6f, 0x86, 0xa6, 0x5d, 0xad, 0x6a, 0x05, 0x2f, 0x4f, + 0xde, 0x5b, 0x55, 0xcd, 0xe0, 0x16, 0x5b, 0x1c, 0xd2, 0xb9, 0xbc, 0x3c, 0xe0, 0x78, 0xb6, 0x80, + 0x7b, 0x3d, 0xa2, 0xc7, 0x31, 0x6b, 0x41, 0x77, 0xde, 0x87, 0xb6, 0xe4, 0x42, 0x4b, 0x7a, 0x97, + 0x9e, 0x9b, 0xd8, 0x15, 0x49, 0x91, 0x02, 0xf0, 0xb7, 0xca, 0x50, 0x5d, 0x71, 0xf6, 0x52, 0xed, + 0xf0, 0x76, 0x64, 0xd5, 0x45, 0xee, 0x60, 0xc5, 0xd9, 0xd3, 0x8c, 0xda, 0x5c, 0x8d, 0x34, 0xee, + 0x1d, 0xbd, 0x78, 0x67, 0x26, 0xcf, 0xc0, 0x62, 0x18, 0x5e, 0xb0, 0x5f, 0x6f, 0x42, 0x8d, 0x9d, + 0x33, 0xc8, 0xf2, 0x53, 0xfb, 0xe3, 0xe2, 0x82, 0xb1, 0x48, 0x26, 0x1b, 0x70, 0x19, 0x3d, 0xf7, + 0x53, 0x56, 0x58, 0xec, 0xa7, 0x78, 0x60, 0x96, 0x92, 0x62, 0xce, 0x41, 0x45, 0xee, 0x38, 0x3b, + 0x44, 0xb8, 0xa9, 0x02, 0x91, 0xf7, 0x9c, 0x1d, 0x82, 0x19, 0x3d, 0xe5, 0xdb, 0xb6, 0x82, 0x6d, + 0xe1, 0xa1, 0x0a, 0xf8, 0x7a, 0x56, 0xb0, 0x8d, 0x19, 0x3d, 0xe5, 0x73, 0xe9, 0x2a, 0xb2, 0x31, + 0x0d, 0x1f, 0x5d, 0x5c, 0x62, 0x46, 0x4f, 0xf9, 0x02, 0xe7, 0xcb, 0x44, 0xf8, 0xa4, 0x02, 0xbe, + 0x0d, 0xe7, 0xcb, 0x04, 0x33, 0xfa, 0xd8, 0x85, 0xb7, 0xa6, 0x6b, 0x1a, 0xc5, 0x85, 0x3f, 0x80, + 0xf9, 0x50, 0xdb, 0x2d, 0x13, 0x87, 0x5d, 0xce, 0x15, 0xf4, 0x8b, 0xc6, 0x83, 0x13, 0x18, 0xd4, + 0x08, 0xd8, 0x9a, 0x39, 0xdb, 0x08, 0x5e, 0x80, 0xfa, 0x67, 0x1c, 0x3b, 0xdc, 0xd6, 0x3f, 0xd7, + 0x35, 0x97, 0x47, 0xbb, 0x6d, 0x26, 0x97, 0xa7, 0xf6, 0x3a, 0xc7, 0x59, 0x81, 0x1a, 0x55, 0x9f, + 0xd9, 0xf4, 0x38, 0xd6, 0xba, 0x0f, 0xe5, 0x80, 0xd5, 0x86, 0xe6, 0x38, 0xc7, 0xa1, 0x46, 0x35, + 0x24, 0xa7, 0x49, 0x8e, 0x43, 0x8d, 0xea, 0x5d, 0xfe, 0x57, 0xda, 0xdb, 0xfa, 0xd7, 0x6a, 0xf4, + 0xf5, 0x0c, 0xcc, 0xeb, 0xdd, 0x91, 0x83, 0xf2, 0xdd, 0x26, 0xd4, 0xd8, 0xa1, 0x9d, 0xa4, 0x45, + 0x7e, 0x1a, 0x0e, 0xf2, 0xfe, 0x5b, 0x12, 0x53, 0xf0, 0x4a, 0xe6, 0x99, 0x3d, 0xfd, 0x28, 0x90, + 0x50, 0x01, 0xc1, 0x82, 0x75, 0x84, 0xe9, 0x27, 0x15, 0x0c, 0x4a, 0xd3, 0xc8, 0x77, 0xe4, 0xe4, + 0xb5, 0x56, 0x70, 0x62, 0x8c, 0xf1, 0xf2, 0x29, 0x70, 0x34, 0x93, 0x45, 0x4b, 0xd0, 0xa2, 0x43, + 0x2b, 0x6d, 0x2e, 0x61, 0xb6, 0x67, 0x26, 0xf3, 0xf7, 0x05, 0x35, 0x96, 0x7c, 0x74, 0x60, 0x1f, + 0x58, 0xbe, 0xcd, 0x4a, 0x25, 0x6c, 0xf8, 0x95, 0xc9, 0x20, 0xcb, 0x11, 0x39, 0x8e, 0x39, 0xd1, + 0x1d, 0x98, 0xb3, 0x89, 0x8c, 0x13, 0x08, 0xa3, 0xfe, 0xc4, 0x64, 0xa0, 0x95, 0x98, 0x01, 0xab, + 0xdc, 0xb4, 0x4c, 0xd1, 0xda, 0x30, 0x28, 0x9c, 0x6c, 0x30, 0xa8, 0xf8, 0x64, 0x6e, 0xcc, 0x69, + 0x9e, 0x86, 0x83, 0x5a, 0xbf, 0x7d, 0xa4, 0xb3, 0x0e, 0xb5, 0x2f, 0x39, 0xce, 0x15, 0xb9, 0x44, + 0x79, 0x5d, 0x9f, 0x76, 0xe4, 0xae, 0x48, 0x04, 0xe3, 0x5d, 0x68, 0x45, 0x1d, 0x83, 0x6e, 0xea, + 0x65, 0x78, 0xb5, 0xb8, 0x0c, 0xb2, 0x4f, 0x05, 0xda, 0x1a, 0xb4, 0x65, 0x0f, 0xa1, 0x45, 0x1d, + 0xee, 0xb5, 0x62, 0xb8, 0xb8, 0x77, 0x05, 0x1e, 0x86, 0x39, 0xa5, 0xa3, 0xd0, 0xb2, 0x8e, 0xf8, + 0x7a, 0x31, 0xa2, 0xda, 0xcd, 0xf1, 0xac, 0x47, 0xf6, 0x98, 0xda, 0x2b, 0xd5, 0xb8, 0x57, 0xfe, + 0xb8, 0x09, 0x2d, 0x79, 0x50, 0x2e, 0x63, 0x8d, 0xb9, 0xeb, 0x8f, 0x0a, 0xd7, 0x98, 0x11, 0x7f, + 0xf7, 0xa1, 0x3f, 0xc2, 0x94, 0x83, 0x76, 0x71, 0xe8, 0x84, 0xd2, 0x54, 0x5f, 0x29, 0x66, 0x7d, + 0x40, 0xc9, 0x31, 0xe7, 0x42, 0xf7, 0x75, 0x2d, 0xaf, 0x4d, 0x38, 0x48, 0xa1, 0x81, 0xe4, 0x6a, + 0x7a, 0x1f, 0xda, 0x0e, 0x9d, 0xfa, 0xf5, 0xe2, 0x91, 0xf7, 0xb5, 0x62, 0xb8, 0x7e, 0xc4, 0x82, + 0x63, 0x6e, 0x5a, 0xb6, 0x2d, 0x6b, 0x8f, 0xda, 0x35, 0x03, 0x6b, 0x4c, 0x5b, 0xb6, 0x5b, 0x31, + 0x13, 0x56, 0x11, 0xd0, 0x55, 0x31, 0x77, 0x69, 0x16, 0x78, 0x96, 0xb8, 0xa9, 0xe2, 0xf9, 0xcb, + 0x7b, 0xa9, 0x91, 0x96, 0x9b, 0xf1, 0x1b, 0x53, 0xa0, 0x4c, 0x1c, 0x6d, 0x69, 0x0f, 0xf2, 0x99, + 0x51, 0x7b, 0xda, 0x1e, 0x54, 0x67, 0x47, 0xe6, 0xf3, 0x50, 0x7d, 0xe8, 0x8f, 0xf2, 0xc7, 0x6a, + 0xd6, 0xdd, 0x39, 0x9f, 0x5f, 0xd6, 0x2d, 0x21, 0x7f, 0x42, 0x2f, 0xfb, 0x24, 0x17, 0x47, 0x69, + 0xf4, 0x1c, 0xa2, 0x6b, 0x62, 0x40, 0x7f, 0x4b, 0xb7, 0xb7, 0x17, 0x13, 0xf6, 0x46, 0x2d, 0x6c, + 0xdd, 0x27, 0xfc, 0xac, 0x90, 0x32, 0x92, 0x4f, 0x3b, 0x4e, 0xde, 0x8e, 0xe6, 0x1f, 0x33, 0x79, + 0x8a, 0x64, 0xdb, 0x72, 0xac, 0x6f, 0x95, 0xa1, 0x25, 0xcf, 0x41, 0xa6, 0xa3, 0xf3, 0x2d, 0x27, + 0xe8, 0x11, 0xcb, 0x26, 0xbe, 0xb0, 0xdb, 0x57, 0x0b, 0x0f, 0x58, 0x76, 0xfb, 0x82, 0x03, 0x4b, + 0x5e, 0xf3, 0x24, 0xb4, 0xa2, 0xdc, 0x9c, 0x45, 0xd9, 0x8f, 0x2b, 0xd0, 0x10, 0x27, 0x28, 0x93, + 0x85, 0xb8, 0x0e, 0x8d, 0x91, 0xb5, 0xef, 0xed, 0x46, 0x4b, 0xa6, 0x33, 0x05, 0x87, 0x32, 0xbb, + 0x77, 0x19, 0x35, 0x16, 0x5c, 0xe8, 0x53, 0x50, 0x1f, 0x39, 0x3b, 0x4e, 0x28, 0xdc, 0xc7, 0xe9, + 0x42, 0x76, 0x76, 0xd6, 0x82, 0xf3, 0x50, 0xe1, 0xec, 0xe0, 0x54, 0x74, 0xec, 0xbd, 0x50, 0xf8, + 0x23, 0x46, 0x8d, 0x05, 0x97, 0x79, 0x1b, 0x1a, 0xbc, 0x38, 0xb3, 0x0d, 0x12, 0x7a, 0x4d, 0x62, + 0x4d, 0x67, 0x65, 0xcb, 0x99, 0x95, 0x9e, 0x80, 0x06, 0x17, 0x9e, 0xa3, 0x35, 0x3f, 0x7a, 0x8e, + 0xad, 0x77, 0x46, 0xe6, 0xdd, 0x78, 0xc3, 0xf1, 0xc3, 0xef, 0x65, 0x98, 0x0f, 0xe0, 0xd0, 0x8a, + 0x15, 0x5a, 0x9b, 0x56, 0x40, 0x30, 0x19, 0x78, 0xbe, 0x9d, 0x89, 0xea, 0xf3, 0x4f, 0x22, 0x42, + 0x9d, 0x8f, 0x2a, 0xe8, 0x3e, 0x0e, 0x1d, 0xfe, 0xcf, 0x09, 0x1d, 0xfe, 0x49, 0x2d, 0x27, 0x9e, + 0x37, 0x4d, 0x24, 0x83, 0x2a, 0x5c, 0x2a, 0xa0, 0x77, 0x55, 0x9f, 0x7b, 0x9f, 0x2a, 0xe0, 0xd4, + 0x26, 0xdf, 0x57, 0xf5, 0x88, 0x5e, 0x11, 0xaf, 0x16, 0xd2, 0xbb, 0x99, 0x0c, 0xe9, 0x9d, 0x29, + 0xe0, 0x4e, 0xc5, 0xf4, 0xae, 0xea, 0x31, 0xbd, 0x22, 0xe9, 0x6a, 0x50, 0xef, 0xff, 0x58, 0x18, + 0xed, 0xb7, 0x73, 0xc2, 0x3e, 0x9f, 0xd4, 0xc3, 0x3e, 0x13, 0xb4, 0xe6, 0xe7, 0x15, 0xf7, 0xf9, + 0x9d, 0x46, 0x4e, 0xdc, 0xe7, 0x8a, 0x16, 0xf7, 0x99, 0x50, 0xb2, 0x64, 0xe0, 0xe7, 0xaa, 0x1e, + 0xf8, 0x39, 0x55, 0xc0, 0xa9, 0x45, 0x7e, 0xae, 0x68, 0x91, 0x9f, 0x22, 0xa1, 0x4a, 0xe8, 0xe7, + 0x8a, 0x16, 0xfa, 0x29, 0x62, 0x54, 0x62, 0x3f, 0x57, 0xb4, 0xd8, 0x4f, 0x11, 0xa3, 0x12, 0xfc, + 0xb9, 0xa2, 0x05, 0x7f, 0x8a, 0x18, 0x95, 0xe8, 0xcf, 0x55, 0x3d, 0xfa, 0x53, 0xdc, 0x3e, 0x4a, + 0xa7, 0x7f, 0x1c, 0xa8, 0xf9, 0x2f, 0x0c, 0xd4, 0xfc, 0x5a, 0x35, 0x27, 0x00, 0x83, 0xb3, 0x03, + 0x30, 0xe7, 0xf2, 0x7b, 0xb2, 0x38, 0x02, 0x33, 0xfd, 0x28, 0x90, 0x0e, 0xc1, 0x5c, 0x4b, 0x84, + 0x60, 0x4e, 0x17, 0x30, 0xeb, 0x31, 0x98, 0xff, 0x35, 0x41, 0x86, 0x3f, 0x6c, 0x4c, 0x58, 0x4f, + 0xbf, 0xad, 0xae, 0xa7, 0x27, 0x8c, 0x64, 0xe9, 0x05, 0xf5, 0x75, 0x7d, 0x41, 0x7d, 0x76, 0x0a, + 0x5e, 0x6d, 0x45, 0xbd, 0x9e, 0xb5, 0xa2, 0xee, 0x4e, 0x81, 0x92, 0xbb, 0xa4, 0xbe, 0x9d, 0x5e, + 0x52, 0x9f, 0x9b, 0x02, 0x2f, 0x73, 0x4d, 0xbd, 0x9e, 0xb5, 0xa6, 0x9e, 0xa6, 0x74, 0xb9, 0x8b, + 0xea, 0x4f, 0x69, 0x8b, 0xea, 0x57, 0xa6, 0x69, 0xae, 0x78, 0x70, 0xf8, 0x6c, 0xce, 0xaa, 0xfa, + 0xcd, 0x69, 0x60, 0x26, 0x07, 0xb1, 0x3f, 0x5e, 0x17, 0xeb, 0x62, 0xfe, 0xe0, 0x45, 0x68, 0x45, + 0x07, 0x6d, 0xcc, 0x2f, 0x41, 0x33, 0xba, 0x36, 0x97, 0xb4, 0x9c, 0x63, 0x72, 0x51, 0xc7, 0x67, + 0xcf, 0x22, 0x85, 0xae, 0x43, 0x8d, 0xfe, 0x12, 0x66, 0xf1, 0xea, 0x74, 0x07, 0x7a, 0xa8, 0x10, + 0xcc, 0xf8, 0xcc, 0x7f, 0x3b, 0x0a, 0xa0, 0xdc, 0x26, 0x9a, 0x56, 0xec, 0xbb, 0xd4, 0x99, 0x8d, + 0x42, 0xe2, 0xb3, 0x83, 0x5c, 0x85, 0xb7, 0x6d, 0x62, 0x09, 0x54, 0x5b, 0x42, 0xe2, 0x63, 0xc1, + 0x8e, 0xee, 0x41, 0x2b, 0x0a, 0xa4, 0x1a, 0x35, 0x06, 0xf5, 0xe6, 0xd4, 0x50, 0x51, 0x68, 0x0f, + 0x4b, 0x08, 0xb4, 0x08, 0xb5, 0xc0, 0xf3, 0x43, 0xa3, 0xce, 0xa0, 0x5e, 0x9f, 0x1a, 0x6a, 0xc3, + 0xf3, 0x43, 0xcc, 0x58, 0x79, 0xd5, 0x94, 0xcb, 0xda, 0xb3, 0x54, 0x4d, 0xf3, 0xd8, 0xff, 0x5a, + 0x95, 0x3e, 0x74, 0x59, 0x58, 0x23, 0xd7, 0xa1, 0xf3, 0xd3, 0xf7, 0x92, 0x6a, 0x95, 0x48, 0x4c, + 0x82, 0x78, 0x4f, 0xf0, 0xf9, 0xcd, 0xab, 0xd0, 0x19, 0x78, 0x7b, 0xc4, 0xc7, 0xf1, 0x11, 0x27, + 0x71, 0x0a, 0x2d, 0x95, 0x8f, 0x4c, 0x68, 0x6d, 0x3b, 0x36, 0xe9, 0x0f, 0x84, 0xff, 0x6b, 0x61, + 0x99, 0x46, 0x77, 0xa0, 0xc5, 0x62, 0xec, 0x51, 0x84, 0x7f, 0xb6, 0x42, 0xf2, 0x50, 0x7f, 0x04, + 0x40, 0x05, 0x31, 0xe1, 0xb7, 0x9c, 0x90, 0xb5, 0x61, 0x0b, 0xcb, 0x34, 0x2d, 0x30, 0x3b, 0x47, + 0xa6, 0x16, 0xb8, 0xc9, 0x0b, 0x9c, 0xcc, 0x47, 0x97, 0xe0, 0x19, 0x96, 0x97, 0x58, 0x62, 0xf2, + 0x50, 0x7d, 0x0b, 0x67, 0x7f, 0x64, 0xe7, 0xe6, 0xac, 0x21, 0xbf, 0x9a, 0xc1, 0x82, 0x77, 0x75, + 0x1c, 0x67, 0xa0, 0x73, 0x70, 0xd8, 0x26, 0x5b, 0xd6, 0xee, 0x28, 0x7c, 0x40, 0x76, 0xc6, 0x23, + 0x2b, 0x24, 0x7d, 0x9b, 0xdd, 0x17, 0x6f, 0xe3, 0xf4, 0x07, 0xf4, 0x06, 0x1c, 0x11, 0x99, 0xdc, + 0x8c, 0x69, 0x6f, 0xf4, 0x6d, 0x76, 0x7d, 0xba, 0x8d, 0xb3, 0x3e, 0x99, 0x3f, 0xaa, 0xd1, 0x4e, + 0x67, 0xaa, 0xfd, 0x2e, 0x54, 0x2d, 0xdb, 0x16, 0xc3, 0xe6, 0xc5, 0x19, 0x0d, 0x44, 0x9c, 0xf7, + 0xa7, 0x08, 0x68, 0x5d, 0x1e, 0xb9, 0xe3, 0x03, 0xe7, 0xe5, 0x59, 0xb1, 0xe4, 0x33, 0x16, 0x02, + 0x87, 0x22, 0xee, 0xf2, 0x9b, 0x03, 0xd5, 0x9f, 0x0d, 0x51, 0x5e, 0x2a, 0x10, 0x38, 0xe8, 0x36, + 0xd4, 0x58, 0x09, 0xf9, 0xc0, 0x7a, 0x69, 0x56, 0xbc, 0x7b, 0xbc, 0x7c, 0x0c, 0xc3, 0x1c, 0xf0, + 0xb3, 0x6f, 0xca, 0x81, 0xcb, 0xb2, 0x7e, 0xe0, 0x72, 0x09, 0xea, 0x4e, 0x48, 0x76, 0xd2, 0xe7, + 0x6f, 0x27, 0xaa, 0xaa, 0xf0, 0x3c, 0x9c, 0x75, 0xe2, 0x39, 0xc0, 0xf7, 0x73, 0x4f, 0xfc, 0xdf, + 0x84, 0x1a, 0x65, 0x4f, 0xcd, 0x25, 0xa7, 0x11, 0xcc, 0x38, 0xcd, 0x0b, 0x50, 0xa3, 0x95, 0x9d, + 0x50, 0x3b, 0x51, 0x9e, 0x8a, 0x2c, 0xcf, 0xd2, 0x1c, 0xb4, 0xbd, 0x31, 0xf1, 0x99, 0x61, 0x98, + 0xff, 0x52, 0x53, 0x0e, 0xc5, 0xf5, 0x55, 0x1d, 0x7b, 0x6b, 0x66, 0xcf, 0xa9, 0x6a, 0x19, 0x4e, + 0x68, 0xd9, 0xdb, 0xb3, 0xa3, 0xa5, 0xf4, 0x0c, 0x27, 0xf4, 0xec, 0x67, 0xc0, 0x4c, 0x69, 0xda, + 0x5d, 0x4d, 0xd3, 0x2e, 0xcf, 0x8e, 0xa8, 0xe9, 0x1a, 0x29, 0xd2, 0xb5, 0x15, 0x5d, 0xd7, 0xba, + 0xd3, 0x75, 0xb9, 0x1c, 0x9a, 0xa6, 0xd0, 0xb6, 0xcf, 0xe7, 0x6a, 0xdb, 0x92, 0xa6, 0x6d, 0xb3, + 0x8a, 0xfe, 0x88, 0xf4, 0xed, 0x87, 0x35, 0xa8, 0xd1, 0xe1, 0x11, 0xad, 0xaa, 0xba, 0xf6, 0xe6, + 0x4c, 0x43, 0xab, 0xaa, 0x67, 0x6b, 0x09, 0x3d, 0xbb, 0x34, 0x1b, 0x52, 0x4a, 0xc7, 0xd6, 0x12, + 0x3a, 0x36, 0x23, 0x5e, 0x4a, 0xbf, 0x7a, 0x9a, 0x7e, 0x5d, 0x98, 0x0d, 0x4d, 0xd3, 0x2d, 0xab, + 0x48, 0xb7, 0x6e, 0xea, 0xba, 0x35, 0xe5, 0xec, 0x8d, 0xcd, 0x55, 0xa6, 0xd0, 0xab, 0xf7, 0x72, + 0xf5, 0xea, 0xba, 0xa6, 0x57, 0xb3, 0x88, 0xfd, 0x88, 0x74, 0xea, 0x12, 0x9f, 0x74, 0x66, 0x5f, + 0xb8, 0xca, 0x9b, 0x74, 0x9a, 0x6f, 0x41, 0x3b, 0x7e, 0x8e, 0x21, 0xe3, 0x78, 0x3e, 0x27, 0x8b, + 0xa4, 0x46, 0x49, 0xf3, 0x22, 0xb4, 0xe3, 0x27, 0x16, 0x32, 0x64, 0x05, 0xec, 0xa3, 0xe0, 0x12, + 0x29, 0x73, 0x15, 0x0e, 0xa7, 0x2f, 0x80, 0x67, 0xc4, 0xe1, 0x95, 0xb3, 0xe5, 0xd1, 0xed, 0x15, + 0x25, 0xcb, 0x7c, 0x02, 0xf3, 0x89, 0x2b, 0xdd, 0x33, 0x63, 0xa0, 0x8b, 0xca, 0x14, 0xb9, 0x9a, + 0xb8, 0x20, 0xa8, 0x9f, 0x96, 0x8f, 0x27, 0xc2, 0xe6, 0x0a, 0xcc, 0x17, 0x14, 0x7e, 0x9a, 0xc3, + 0xf2, 0x5f, 0x80, 0xb9, 0x49, 0x65, 0xff, 0x08, 0x0e, 0xf3, 0x87, 0xd0, 0x49, 0x3d, 0x47, 0x91, + 0x14, 0xb3, 0x0e, 0x30, 0x94, 0x34, 0x42, 0x69, 0xdf, 0x98, 0xe1, 0xea, 0x02, 0xe3, 0xc3, 0x0a, + 0x86, 0xf9, 0xfb, 0x65, 0x38, 0x9c, 0x7e, 0x8b, 0x62, 0xda, 0xc5, 0x8f, 0x01, 0x4d, 0x86, 0x25, + 0x6f, 0x7c, 0x44, 0x49, 0x74, 0x0f, 0x0e, 0x04, 0x23, 0x67, 0x40, 0x96, 0xb7, 0x2d, 0x77, 0x48, + 0x02, 0xb1, 0xa2, 0x29, 0x78, 0x4f, 0x62, 0x23, 0xe6, 0xc0, 0x1a, 0xbb, 0xf9, 0x04, 0xe6, 0x94, + 0x8f, 0xe8, 0x1d, 0xa8, 0x78, 0xe3, 0xd4, 0xb9, 0xc6, 0x7c, 0xcc, 0xfb, 0x91, 0xbd, 0xe1, 0x8a, + 0x37, 0x4e, 0x9b, 0xa4, 0x6a, 0xbe, 0x55, 0xcd, 0x7c, 0xcd, 0x3b, 0x70, 0x38, 0xfd, 0xdc, 0x43, + 0xb2, 0x79, 0xce, 0xa4, 0xa2, 0x04, 0xbc, 0x99, 0x92, 0x4b, 0xfe, 0x2b, 0x70, 0x28, 0xf9, 0x88, + 0x43, 0xc6, 0x6d, 0x9c, 0xf8, 0x52, 0x53, 0x14, 0xae, 0x5f, 0xf8, 0xd5, 0x32, 0xcc, 0xeb, 0x15, + 0x41, 0xc7, 0x00, 0xe9, 0x39, 0x6b, 0x9e, 0x4b, 0x3a, 0x25, 0xf4, 0x0c, 0x1c, 0xd6, 0xf3, 0x17, + 0x6d, 0xbb, 0x53, 0x4e, 0x93, 0x53, 0xb7, 0xd5, 0xa9, 0x20, 0x03, 0x8e, 0x26, 0x5a, 0x88, 0x39, + 0xd1, 0x4e, 0x15, 0x3d, 0x07, 0xcf, 0x24, 0xbf, 0x8c, 0x47, 0xd6, 0x80, 0x74, 0x6a, 0xe6, 0x4f, + 0x2b, 0x50, 0x7b, 0x18, 0x10, 0xdf, 0xfc, 0xa7, 0x4a, 0x74, 0x4b, 0xe3, 0x6d, 0xa8, 0xb1, 0xf7, + 0x15, 0x94, 0x1b, 0x94, 0xe5, 0xc4, 0x0d, 0x4a, 0xed, 0x16, 0x5e, 0x7c, 0x83, 0xf2, 0x6d, 0xa8, + 0xb1, 0x17, 0x15, 0x66, 0xe7, 0xfc, 0x66, 0x19, 0xda, 0xf1, 0xeb, 0x06, 0x33, 0xf3, 0xab, 0xb7, + 0x42, 0x2a, 0xfa, 0xad, 0x90, 0x57, 0xa1, 0xee, 0xb3, 0xfb, 0x1b, 0xdc, 0xcb, 0x24, 0xef, 0x9a, + 0x30, 0x81, 0x98, 0x93, 0x98, 0x04, 0xe6, 0xd4, 0xb7, 0x1b, 0x66, 0x2f, 0xc6, 0x29, 0xf1, 0x70, + 0x53, 0xdf, 0x0e, 0x16, 0x7d, 0xdf, 0xda, 0x17, 0x8a, 0xa9, 0x67, 0x9a, 0xc7, 0xa1, 0xb6, 0xee, + 0xb8, 0xc3, 0xec, 0x8b, 0xab, 0xe6, 0x9f, 0x96, 0xa1, 0x29, 0x0e, 0xef, 0x9a, 0x57, 0xa0, 0xba, + 0x46, 0x9e, 0xd0, 0x82, 0x88, 0x63, 0xc3, 0xa9, 0x82, 0xdc, 0x63, 0xb5, 0x10, 0xf4, 0x38, 0x22, + 0x33, 0xaf, 0xca, 0x61, 0x72, 0x76, 0xde, 0xb7, 0xa1, 0xc6, 0x9e, 0x5c, 0x98, 0x9d, 0xf3, 0xcf, + 0x5a, 0xd0, 0xe0, 0xb7, 0x3f, 0xcd, 0x3f, 0x6a, 0x41, 0x83, 0x3f, 0xc3, 0x80, 0xae, 0x43, 0x33, + 0xd8, 0xdd, 0xd9, 0xb1, 0xfc, 0x7d, 0x23, 0xfb, 0x71, 0x51, 0xed, 0xd5, 0x86, 0xee, 0x06, 0xa7, + 0xc5, 0x11, 0x13, 0x7a, 0x0b, 0x6a, 0x03, 0x6b, 0x8b, 0xa4, 0xb6, 0x73, 0xb3, 0x98, 0x97, 0xad, + 0x2d, 0x82, 0x19, 0x39, 0xba, 0x09, 0x2d, 0xd1, 0x2d, 0x81, 0x88, 0xe7, 0x4c, 0x96, 0x1b, 0x75, + 0xa6, 0xe4, 0x32, 0x6f, 0x43, 0x53, 0x14, 0x06, 0xdd, 0x90, 0x77, 0x5f, 0x93, 0x91, 0xe7, 0xcc, + 0x2a, 0xc8, 0xfb, 0xf9, 0xf2, 0x16, 0xec, 0x5f, 0x56, 0xa0, 0x46, 0x0b, 0xf7, 0xa1, 0x91, 0xd0, + 0x09, 0x80, 0x91, 0x15, 0x84, 0xeb, 0xbb, 0xa3, 0x11, 0xb1, 0xc5, 0x0d, 0x3b, 0x25, 0x07, 0x9d, + 0x85, 0x43, 0x3c, 0x15, 0x6c, 0x6f, 0xec, 0x0e, 0x06, 0x44, 0xde, 0x2c, 0x4d, 0x66, 0xa3, 0x45, + 0xa8, 0xb3, 0x87, 0x01, 0xc5, 0xac, 0xf0, 0xb5, 0xc2, 0x96, 0xed, 0xae, 0x3b, 0xae, 0x28, 0x0d, + 0xe7, 0x34, 0x3d, 0x68, 0xcb, 0x3c, 0x6a, 0x84, 0x63, 0xc7, 0x75, 0x1d, 0x77, 0x28, 0x34, 0x3a, + 0x4a, 0xd2, 0x41, 0x87, 0xfe, 0x14, 0xe5, 0xad, 0x63, 0x91, 0xa2, 0xf9, 0x5b, 0x96, 0x33, 0x12, + 0x45, 0xac, 0x63, 0x91, 0xa2, 0x48, 0xbb, 0xe2, 0xf1, 0x8a, 0x1a, 0xab, 0x60, 0x94, 0x34, 0x3f, + 0x28, 0xcb, 0x0b, 0xe0, 0x59, 0x97, 0x33, 0x53, 0xb1, 0xa4, 0xe3, 0x6a, 0x40, 0x9b, 0x0f, 0x08, + 0x4a, 0x88, 0xfa, 0x18, 0x34, 0x3c, 0x77, 0xe4, 0xb8, 0x44, 0xc4, 0x8e, 0x44, 0x2a, 0xd1, 0xc6, + 0xf5, 0x54, 0x1b, 0x8b, 0xef, 0xab, 0xb6, 0x43, 0x8b, 0xd8, 0x88, 0xbf, 0xf3, 0x1c, 0x74, 0x0d, + 0x9a, 0x36, 0xd9, 0x73, 0x06, 0x24, 0x30, 0x9a, 0x4c, 0xf5, 0x5e, 0x9e, 0xd8, 0xb6, 0x2b, 0x8c, + 0x16, 0x47, 0x3c, 0x66, 0x08, 0x0d, 0x9e, 0x25, 0xab, 0x54, 0x56, 0xaa, 0x14, 0x17, 0xba, 0x32, + 0xa1, 0xd0, 0xd5, 0x82, 0x42, 0xd7, 0x92, 0x85, 0x5e, 0xf8, 0x2a, 0x40, 0xac, 0x6e, 0x68, 0x0e, + 0x9a, 0x0f, 0xdd, 0xc7, 0xae, 0xf7, 0xc4, 0xed, 0x94, 0x68, 0xe2, 0xfe, 0xd6, 0x16, 0x95, 0xd2, + 0x29, 0xd3, 0x04, 0xa5, 0x73, 0xdc, 0x61, 0xa7, 0x82, 0x00, 0x1a, 0x34, 0x41, 0xec, 0x4e, 0x95, + 0xfe, 0xbe, 0xc5, 0xfa, 0xaf, 0x53, 0x43, 0xcf, 0xc2, 0x91, 0xbe, 0x3b, 0xf0, 0x76, 0xc6, 0x56, + 0xe8, 0x6c, 0x8e, 0xc8, 0x23, 0xe2, 0x07, 0x8e, 0xe7, 0x76, 0xea, 0x74, 0xf4, 0x5a, 0x23, 0xe1, + 0x13, 0xcf, 0x7f, 0xbc, 0x46, 0x88, 0x2d, 0xde, 0x9c, 0xe8, 0x34, 0xcc, 0xff, 0x28, 0xf3, 0xdd, + 0x60, 0xf3, 0x26, 0x1c, 0xd0, 0x5e, 0x59, 0x31, 0xe2, 0x37, 0x9f, 0x13, 0x4f, 0x3e, 0x1f, 0x63, + 0xf1, 0x5a, 0x12, 0x4f, 0x65, 0x78, 0xca, 0xbc, 0x05, 0xa0, 0xbc, 0xad, 0x72, 0x02, 0x60, 0x73, + 0x3f, 0x24, 0x01, 0x7f, 0x57, 0x85, 0x42, 0xd4, 0xb0, 0x92, 0xa3, 0xe2, 0x57, 0x34, 0x7c, 0xf3, + 0x32, 0x80, 0xf2, 0xb2, 0x0a, 0xb5, 0x2b, 0x9a, 0x5a, 0x4a, 0x82, 0x25, 0xb3, 0xcd, 0xae, 0xa8, + 0x41, 0xf4, 0x86, 0x4a, 0x54, 0x02, 0x1e, 0xbd, 0x53, 0x4b, 0xc0, 0x72, 0xcc, 0x55, 0x80, 0xf8, + 0x19, 0x11, 0xf3, 0x8a, 0x74, 0xdd, 0xaf, 0x43, 0xcd, 0xb6, 0x42, 0x4b, 0x78, 0xcd, 0xe7, 0x12, + 0x23, 0x57, 0xcc, 0x82, 0x19, 0x99, 0xf9, 0x7b, 0x65, 0x38, 0xa0, 0x3e, 0x99, 0x62, 0xbe, 0x0b, + 0x35, 0xf6, 0xe6, 0xca, 0x0d, 0x38, 0xa0, 0xbe, 0x99, 0x92, 0x7a, 0x1b, 0x9b, 0xe3, 0xa9, 0xac, + 0x58, 0x63, 0x30, 0xfb, 0xb2, 0x48, 0x1f, 0x1a, 0xea, 0x0d, 0x68, 0x8a, 0x27, 0x58, 0xcc, 0xd3, + 0xd0, 0x8e, 0x5f, 0x5c, 0xa1, 0xbe, 0x83, 0xe7, 0x47, 0xbd, 0x2c, 0x92, 0xe6, 0x3f, 0x57, 0xa1, + 0xce, 0xba, 0xd3, 0xfc, 0x7a, 0x45, 0xd5, 0x50, 0xf3, 0xa7, 0xe5, 0xdc, 0xb5, 0xe0, 0x45, 0xed, + 0xa9, 0x82, 0xf9, 0xd4, 0x4b, 0x43, 0xe2, 0x81, 0x15, 0xdd, 0xb1, 0x5e, 0x86, 0xa6, 0xcb, 0x35, + 0x53, 0xbc, 0x14, 0x70, 0x3c, 0x93, 0x4b, 0x68, 0x2f, 0x8e, 0x88, 0xd1, 0x25, 0xa8, 0x13, 0xdf, + 0xf7, 0x7c, 0x66, 0x52, 0xf3, 0xa9, 0x37, 0x7b, 0xe2, 0xc7, 0x5c, 0x56, 0x29, 0x15, 0xe6, 0xc4, + 0xe8, 0x12, 0x3c, 0x13, 0x70, 0x2b, 0xe2, 0x73, 0xca, 0x40, 0xdc, 0xab, 0x16, 0xde, 0x26, 0xfb, + 0xe3, 0xc2, 0xa7, 0xa3, 0x01, 0x56, 0x31, 0xbc, 0x92, 0x6a, 0x91, 0x65, 0xd4, 0x86, 0x3a, 0x13, + 0xd4, 0xa9, 0xa8, 0x66, 0x5b, 0xcd, 0x31, 0xbc, 0xda, 0xc2, 0x45, 0x68, 0x8a, 0x7c, 0x4a, 0xbf, + 0xc8, 0xcb, 0xde, 0x29, 0xa1, 0x03, 0xd0, 0xda, 0x20, 0xa3, 0xad, 0x9e, 0x17, 0x84, 0x9d, 0x32, + 0x3a, 0x08, 0x6d, 0x66, 0x0b, 0xf7, 0xdd, 0xd1, 0x7e, 0xa7, 0xb2, 0xf0, 0x1e, 0xb4, 0x65, 0x8d, + 0x50, 0x0b, 0x6a, 0x6b, 0xbb, 0xa3, 0x51, 0xa7, 0xc4, 0xa6, 0xa6, 0xa1, 0xe7, 0x47, 0x81, 0xe9, + 0xd5, 0xa7, 0x74, 0x9c, 0xe9, 0x94, 0xf3, 0xbc, 0x41, 0x05, 0x75, 0xe0, 0x80, 0x10, 0xce, 0xcb, + 0x5c, 0x35, 0xff, 0xb1, 0x0c, 0x6d, 0xf9, 0x4a, 0x0d, 0x9d, 0x17, 0x46, 0x7d, 0x9c, 0xef, 0x07, + 0xae, 0x24, 0x7a, 0x3b, 0xff, 0xd1, 0x9b, 0x44, 0x8f, 0x9f, 0x81, 0x79, 0xe1, 0x72, 0xa3, 0xc6, + 0xe7, 0x5e, 0x33, 0x91, 0xbb, 0x70, 0x5b, 0xb6, 0x7a, 0x87, 0x99, 0xd8, 0xb2, 0xe7, 0xba, 0x64, + 0x10, 0xb2, 0xb6, 0x3f, 0x04, 0x73, 0x6b, 0x5e, 0xb8, 0xee, 0x05, 0x01, 0xad, 0x19, 0x6f, 0xa9, + 0xf8, 0x7b, 0x05, 0xcd, 0x03, 0x44, 0x67, 0xcd, 0xa8, 0x93, 0x34, 0x7f, 0xb7, 0x0c, 0x0d, 0xfe, + 0x76, 0x8e, 0xf9, 0x9b, 0x65, 0x68, 0x88, 0xf7, 0x72, 0x5e, 0x85, 0x8e, 0xef, 0x51, 0xe0, 0x68, + 0x41, 0xd1, 0x5f, 0x11, 0xb5, 0x4c, 0xe5, 0xd3, 0x35, 0xae, 0xa7, 0x68, 0x85, 0x98, 0x02, 0x68, + 0x79, 0xe8, 0x2a, 0x00, 0x7f, 0x8f, 0xe7, 0xc1, 0xbe, 0x7c, 0xf8, 0x22, 0x79, 0xc4, 0x4c, 0xbc, + 0xe0, 0xc3, 0x36, 0x63, 0x14, 0xea, 0x85, 0xaf, 0xc0, 0x41, 0x4c, 0x82, 0xb1, 0xe7, 0x06, 0xe4, + 0xe7, 0xf5, 0x3f, 0x02, 0x72, 0x5f, 0xfb, 0x5f, 0xf8, 0x61, 0x1d, 0xea, 0x6c, 0x76, 0x69, 0xfe, + 0x55, 0x5d, 0xce, 0x83, 0x53, 0xf6, 0x7d, 0x41, 0x3d, 0xe8, 0xa3, 0x1a, 0xaa, 0x36, 0x31, 0xd5, + 0x0f, 0xf8, 0x7c, 0x0a, 0x5a, 0x63, 0xdf, 0x1b, 0xfa, 0x74, 0x3e, 0x5b, 0x4b, 0x3c, 0x8e, 0xa4, + 0xb3, 0xad, 0x0b, 0x32, 0x2c, 0x19, 0x54, 0xe5, 0xab, 0xeb, 0xca, 0x77, 0x13, 0xda, 0xb6, 0xef, + 0x8d, 0xd9, 0x15, 0x75, 0xb1, 0xb9, 0x76, 0x32, 0x07, 0x77, 0x25, 0xa2, 0xeb, 0x95, 0x70, 0xcc, + 0x44, 0xd5, 0x97, 0xb7, 0xbe, 0xd8, 0xd7, 0x7e, 0x21, 0x87, 0x9d, 0xf7, 0x57, 0xaf, 0x84, 0x05, + 0x39, 0x65, 0x24, 0x4f, 0x19, 0x63, 0x6b, 0x22, 0xe3, 0xea, 0xd3, 0x88, 0x91, 0x93, 0xa3, 0x6b, + 0xd0, 0x0a, 0xac, 0x3d, 0xc2, 0x5e, 0x04, 0x6e, 0x4f, 0x6c, 0x8a, 0x0d, 0x41, 0xd6, 0x2b, 0x61, + 0xc9, 0x42, 0xab, 0xbc, 0xe3, 0x0c, 0xf9, 0x4a, 0x52, 0x3c, 0x4b, 0x9c, 0x57, 0xe5, 0x7b, 0x11, + 0x1d, 0x7b, 0x43, 0x3a, 0x4a, 0xd0, 0x95, 0x0f, 0x77, 0x99, 0x73, 0x7c, 0xdb, 0x98, 0x25, 0xcc, + 0x39, 0x68, 0xcb, 0x26, 0x32, 0x5b, 0xd2, 0x4c, 0x5a, 0xd0, 0xe0, 0x35, 0x30, 0x01, 0x5a, 0x51, + 0x81, 0x28, 0xb1, 0x04, 0x37, 0xd7, 0xa0, 0x15, 0x75, 0x5a, 0xce, 0xb3, 0x14, 0x08, 0x6a, 0xb6, + 0x27, 0xa6, 0x4c, 0x55, 0xcc, 0x7e, 0xd3, 0x4e, 0x55, 0xdf, 0x54, 0x6a, 0xcb, 0xd7, 0x8c, 0x16, + 0x16, 0xa3, 0xf3, 0x4a, 0xd4, 0xb5, 0xf1, 0xc5, 0xf8, 0x1c, 0x34, 0xf1, 0x2e, 0x9b, 0xcd, 0x76, + 0xca, 0x34, 0x9b, 0x2e, 0x91, 0x3a, 0x15, 0xea, 0x25, 0x97, 0x2d, 0x77, 0x40, 0x46, 0x6c, 0x06, + 0x24, 0x7d, 0x6f, 0x6d, 0xa9, 0x2d, 0xc1, 0x97, 0x8e, 0xff, 0xf5, 0x07, 0x27, 0xca, 0x3f, 0xf8, + 0xe0, 0x44, 0xf9, 0xc7, 0x1f, 0x9c, 0x28, 0xff, 0xc6, 0x4f, 0x4e, 0x94, 0x7e, 0xf0, 0x93, 0x13, + 0xa5, 0x7f, 0xf8, 0xc9, 0x89, 0xd2, 0xfb, 0x95, 0xf1, 0xe6, 0x66, 0x83, 0x9d, 0x39, 0xb9, 0xf8, + 0x9f, 0x01, 0x00, 0x00, 0xff, 0xff, 0xb5, 0x54, 0x80, 0x8a, 0xfa, 0x63, 0x00, 0x00, } func (m *Event) Marshal() (dAtA []byte, err error) { @@ -14434,6 +14503,29 @@ func (m *EventMessageValueOfAccountLinkChallenge) MarshalToSizedBuffer(dAtA []by } return len(dAtA) - i, nil } +func (m *EventMessageValueOfAccountLinkChallengeHide) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *EventMessageValueOfAccountLinkChallengeHide) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + if m.AccountLinkChallengeHide != nil { + { + size, err := m.AccountLinkChallengeHide.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintEvents(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xc + i-- + dAtA[i] = 0xea + } + return len(dAtA) - i, nil +} func (m *EventChat) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -14862,6 +14954,11 @@ func (m *EventAccountLinkChallenge) MarshalToSizedBuffer(dAtA []byte) (int, erro _ = i var l int _ = l + if m.Scope != 0 { + i = encodeVarintEvents(dAtA, i, uint64(m.Scope)) + i-- + dAtA[i] = 0x18 + } if m.ClientInfo != nil { { size, err := m.ClientInfo.MarshalToSizedBuffer(dAtA[:i]) @@ -14931,6 +15028,36 @@ func (m *EventAccountLinkChallengeClientInfo) MarshalToSizedBuffer(dAtA []byte) return len(dAtA) - i, nil } +func (m *EventAccountLinkChallengeHide) 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 *EventAccountLinkChallengeHide) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *EventAccountLinkChallengeHide) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.Challenge) > 0 { + i -= len(m.Challenge) + copy(dAtA[i:], m.Challenge) + i = encodeVarintEvents(dAtA, i, uint64(len(m.Challenge))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + func (m *EventObject) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -15801,20 +15928,20 @@ func (m *EventBlockMarksInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { var l int _ = l if len(m.MarksInRange) > 0 { - dAtA91 := make([]byte, len(m.MarksInRange)*10) - var j90 int + dAtA92 := make([]byte, len(m.MarksInRange)*10) + var j91 int for _, num := range m.MarksInRange { for num >= 1<<7 { - dAtA91[j90] = uint8(uint64(num)&0x7f | 0x80) + dAtA92[j91] = uint8(uint64(num)&0x7f | 0x80) num >>= 7 - j90++ + j91++ } - dAtA91[j90] = uint8(num) - j90++ + dAtA92[j91] = uint8(num) + j91++ } - i -= j90 - copy(dAtA[i:], dAtA91[:j90]) - i = encodeVarintEvents(dAtA, i, uint64(j90)) + i -= j91 + copy(dAtA[i:], dAtA92[:j91]) + i = encodeVarintEvents(dAtA, i, uint64(j91)) i-- dAtA[i] = 0xa } @@ -23622,6 +23749,18 @@ func (m *EventMessageValueOfAccountLinkChallenge) Size() (n int) { } return n } +func (m *EventMessageValueOfAccountLinkChallengeHide) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.AccountLinkChallengeHide != nil { + l = m.AccountLinkChallengeHide.Size() + n += 2 + l + sovEvents(uint64(l)) + } + return n +} func (m *EventChat) Size() (n int) { if m == nil { return 0 @@ -23798,6 +23937,9 @@ func (m *EventAccountLinkChallenge) Size() (n int) { l = m.ClientInfo.Size() n += 1 + l + sovEvents(uint64(l)) } + if m.Scope != 0 { + n += 1 + sovEvents(uint64(m.Scope)) + } return n } @@ -23821,6 +23963,19 @@ func (m *EventAccountLinkChallengeClientInfo) Size() (n int) { return n } +func (m *EventAccountLinkChallengeHide) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Challenge) + if l > 0 { + n += 1 + l + sovEvents(uint64(l)) + } + return n +} + func (m *EventObject) Size() (n int) { if m == nil { return 0 @@ -29972,6 +30127,41 @@ func (m *EventMessage) Unmarshal(dAtA []byte) error { } m.Value = &EventMessageValueOfAccountLinkChallenge{v} iNdEx = postIndex + case 205: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field AccountLinkChallengeHide", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvents + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthEvents + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthEvents + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + v := &EventAccountLinkChallengeHide{} + if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + m.Value = &EventMessageValueOfAccountLinkChallengeHide{v} + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipEvents(dAtA[iNdEx:]) @@ -31175,6 +31365,25 @@ func (m *EventAccountLinkChallenge) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex + case 3: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Scope", wireType) + } + m.Scope = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvents + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Scope |= model.AccountAuthLocalApiScope(b&0x7F) << shift + if b < 0x80 { + break + } + } default: iNdEx = preIndex skippy, err := skipEvents(dAtA[iNdEx:]) @@ -31330,6 +31539,88 @@ func (m *EventAccountLinkChallengeClientInfo) Unmarshal(dAtA []byte) error { } return nil } +func (m *EventAccountLinkChallengeHide) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvents + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: LinkChallengeHide: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: LinkChallengeHide: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Challenge", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvents + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthEvents + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthEvents + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Challenge = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipEvents(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthEvents + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} func (m *EventObject) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 diff --git a/pb/protos/commands.proto b/pb/protos/commands.proto index 6825d5430..5534cc794 100644 --- a/pb/protos/commands.proto +++ b/pb/protos/commands.proto @@ -1073,6 +1073,7 @@ message Rpc { message Request { option (no_auth) = true; string appName = 1; // just for info, not secure to rely on + model.Account.Auth.LocalApiScope scope = 2; } message Response { diff --git a/pb/protos/events.proto b/pb/protos/events.proto index d4397dc89..821eb694c 100644 --- a/pb/protos/events.proto +++ b/pb/protos/events.proto @@ -22,6 +22,7 @@ message Event { Account.Config.Update accountConfigUpdate = 202; Account.Update accountUpdate = 203; Account.LinkChallenge accountLinkChallenge = 204; + Account.LinkChallengeHide accountLinkChallengeHide = 205; Object.Details.Set objectDetailsSet = 16; Object.Details.Amend objectDetailsAmend = 50; @@ -172,6 +173,11 @@ message Event { } string challenge = 1; ClientInfo clientInfo = 2; + model.Account.Auth.LocalApiScope scope = 3; + } + + message LinkChallengeHide { + string challenge = 1; // verify code before hiding to protect from MITM attacks } } diff --git a/pkg/lib/pb/model/models.pb.go b/pkg/lib/pb/model/models.pb.go index 6f67f943e..fdab917ab 100644 --- a/pkg/lib/pb/model/models.pb.go +++ b/pkg/lib/pb/model/models.pb.go @@ -1610,6 +1610,34 @@ func (AccountStatusType) EnumDescriptor() ([]byte, []int) { return fileDescriptor_98a910b73321e591, []int{5, 0} } +type AccountAuthLocalApiScope int32 + +const ( + AccountAuth_Limited AccountAuthLocalApiScope = 0 + AccountAuth_JsonAPI AccountAuthLocalApiScope = 1 + AccountAuth_Full AccountAuthLocalApiScope = 2 +) + +var AccountAuthLocalApiScope_name = map[int32]string{ + 0: "Limited", + 1: "JsonAPI", + 2: "Full", +} + +var AccountAuthLocalApiScope_value = map[string]int32{ + "Limited": 0, + "JsonAPI": 1, + "Full": 2, +} + +func (x AccountAuthLocalApiScope) String() string { + return proto.EnumName(AccountAuthLocalApiScope_name, int32(x)) +} + +func (AccountAuthLocalApiScope) EnumDescriptor() ([]byte, []int) { + return fileDescriptor_98a910b73321e591, []int{5, 3, 0} +} + type LinkPreviewType int32 const ( @@ -5640,6 +5668,42 @@ func (m *AccountInfo) GetNetworkId() string { return "" } +type AccountAuth struct { +} + +func (m *AccountAuth) Reset() { *m = AccountAuth{} } +func (m *AccountAuth) String() string { return proto.CompactTextString(m) } +func (*AccountAuth) ProtoMessage() {} +func (*AccountAuth) Descriptor() ([]byte, []int) { + return fileDescriptor_98a910b73321e591, []int{5, 3} +} +func (m *AccountAuth) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *AccountAuth) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_AccountAuth.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 *AccountAuth) XXX_Merge(src proto.Message) { + xxx_messageInfo_AccountAuth.Merge(m, src) +} +func (m *AccountAuth) XXX_Size() int { + return m.Size() +} +func (m *AccountAuth) XXX_DiscardUnknown() { + xxx_messageInfo_AccountAuth.DiscardUnknown(m) +} + +var xxx_messageInfo_AccountAuth proto.InternalMessageInfo + type LinkPreview struct { Url string `protobuf:"bytes,1,opt,name=url,proto3" json:"url,omitempty"` Title string `protobuf:"bytes,2,opt,name=title,proto3" json:"title,omitempty"` @@ -9399,6 +9463,7 @@ func init() { proto.RegisterEnum("anytype.model.BlockContentLatexProcessor", BlockContentLatexProcessor_name, BlockContentLatexProcessor_value) proto.RegisterEnum("anytype.model.BlockContentWidgetLayout", BlockContentWidgetLayout_name, BlockContentWidgetLayout_value) proto.RegisterEnum("anytype.model.AccountStatusType", AccountStatusType_name, AccountStatusType_value) + proto.RegisterEnum("anytype.model.AccountAuthLocalApiScope", AccountAuthLocalApiScope_name, AccountAuthLocalApiScope_value) proto.RegisterEnum("anytype.model.LinkPreviewType", LinkPreviewType_name, LinkPreviewType_value) proto.RegisterEnum("anytype.model.RestrictionsObjectRestriction", RestrictionsObjectRestriction_name, RestrictionsObjectRestriction_value) proto.RegisterEnum("anytype.model.RestrictionsDataviewRestriction", RestrictionsDataviewRestriction_name, RestrictionsDataviewRestriction_value) @@ -9462,6 +9527,7 @@ func init() { proto.RegisterType((*AccountConfig)(nil), "anytype.model.Account.Config") proto.RegisterType((*AccountStatus)(nil), "anytype.model.Account.Status") proto.RegisterType((*AccountInfo)(nil), "anytype.model.Account.Info") + proto.RegisterType((*AccountAuth)(nil), "anytype.model.Account.Auth") proto.RegisterType((*LinkPreview)(nil), "anytype.model.LinkPreview") proto.RegisterType((*Restrictions)(nil), "anytype.model.Restrictions") proto.RegisterType((*RestrictionsDataviewRestrictions)(nil), "anytype.model.Restrictions.DataviewRestrictions") @@ -9522,567 +9588,569 @@ func init() { } var fileDescriptor_98a910b73321e591 = []byte{ - // 8951 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xcc, 0x7d, 0x5b, 0x6c, 0x24, 0xc9, - 0x91, 0x18, 0xfb, 0xdd, 0x1d, 0xcd, 0x26, 0x93, 0x39, 0xaf, 0x56, 0x6b, 0x6e, 0x3c, 0x6a, 0xad, - 0x76, 0x47, 0xa3, 0x15, 0x67, 0x77, 0x76, 0x57, 0xbb, 0xda, 0xd3, 0xae, 0xd4, 0x6c, 0x36, 0x87, - 0xbd, 0x43, 0xb2, 0xa9, 0xea, 0x9e, 0x19, 0xed, 0xe2, 0xce, 0x74, 0xb1, 0x2b, 0xd9, 0x5d, 0x62, - 0x75, 0x55, 0xab, 0x2a, 0x9b, 0x43, 0x2e, 0x6c, 0xe3, 0xfc, 0xba, 0xf3, 0xfd, 0xe9, 0x0c, 0x9f, - 0xed, 0x83, 0x61, 0x9c, 0xf4, 0x61, 0xc0, 0xf0, 0x1d, 0x60, 0xd8, 0x80, 0x60, 0x9f, 0xed, 0x03, - 0xec, 0x03, 0x0c, 0x1b, 0xf0, 0x8f, 0x6c, 0xff, 0xf8, 0xcf, 0xc6, 0x0a, 0xf0, 0x8f, 0x61, 0x1f, - 0xce, 0x5f, 0x82, 0xe1, 0x0f, 0x23, 0x22, 0xb3, 0x1e, 0xfd, 0x20, 0xa7, 0x67, 0xef, 0xce, 0xf0, - 0x17, 0x2b, 0xa3, 0x22, 0xa2, 0x22, 0x33, 0x23, 0x23, 0x23, 0x22, 0x23, 0x9b, 0xf0, 0xca, 0xf8, - 0x74, 0xf0, 0xc0, 0xb1, 0x8f, 0x1f, 0x8c, 0x8f, 0x1f, 0x8c, 0x3c, 0x4b, 0x38, 0x0f, 0xc6, 0xbe, - 0x27, 0xbd, 0x40, 0x35, 0x82, 0x4d, 0x6a, 0xf1, 0x8a, 0xe9, 0x5e, 0xc8, 0x8b, 0xb1, 0xd8, 0x24, - 0x68, 0xed, 0xf6, 0xc0, 0xf3, 0x06, 0x8e, 0x50, 0xa8, 0xc7, 0x93, 0x93, 0x07, 0x81, 0xf4, 0x27, - 0x7d, 0xa9, 0x90, 0xeb, 0x3f, 0xcd, 0xc2, 0xcd, 0xee, 0xc8, 0xf4, 0xe5, 0x96, 0xe3, 0xf5, 0x4f, - 0xbb, 0xae, 0x39, 0x0e, 0x86, 0x9e, 0xdc, 0x32, 0x03, 0xc1, 0x5f, 0x87, 0xfc, 0x31, 0x02, 0x83, - 0x6a, 0xea, 0x6e, 0xe6, 0x5e, 0xf9, 0xe1, 0xf5, 0xcd, 0x29, 0xc6, 0x9b, 0x44, 0x61, 0x68, 0x1c, - 0xfe, 0x26, 0x14, 0x2c, 0x21, 0x4d, 0xdb, 0x09, 0xaa, 0xe9, 0xbb, 0xa9, 0x7b, 0xe5, 0x87, 0xb7, - 0x36, 0xd5, 0x87, 0x37, 0xc3, 0x0f, 0x6f, 0x76, 0xe9, 0xc3, 0x46, 0x88, 0xc7, 0xdf, 0x85, 0xe2, - 0x89, 0xed, 0x88, 0xc7, 0xe2, 0x22, 0xa8, 0x66, 0xae, 0xa4, 0xd9, 0x4a, 0x57, 0x53, 0x46, 0x84, - 0xcc, 0x9b, 0xb0, 0x26, 0xce, 0xa5, 0x6f, 0x1a, 0xc2, 0x31, 0xa5, 0xed, 0xb9, 0x41, 0x35, 0x4b, - 0x12, 0xde, 0x9a, 0x91, 0x30, 0x7c, 0x4f, 0xe4, 0x33, 0x24, 0xfc, 0x2e, 0x94, 0xbd, 0xe3, 0xef, - 0x8b, 0xbe, 0xec, 0x5d, 0x8c, 0x45, 0x50, 0xcd, 0xdd, 0xcd, 0xdc, 0x2b, 0x19, 0x49, 0x10, 0xff, - 0x26, 0x94, 0xfb, 0x9e, 0xe3, 0x88, 0xbe, 0xfa, 0x46, 0xfe, 0xea, 0x6e, 0x25, 0x71, 0xf9, 0xdb, - 0x70, 0xc3, 0x17, 0x23, 0xef, 0x4c, 0x58, 0xcd, 0x08, 0x4a, 0xfd, 0x2c, 0xd2, 0x67, 0x16, 0xbf, - 0xe4, 0x0d, 0xa8, 0xf8, 0x5a, 0xbe, 0x3d, 0xdb, 0x3d, 0x0d, 0xaa, 0x05, 0xea, 0xd6, 0x17, 0x2f, - 0xe9, 0x16, 0xe2, 0x18, 0xd3, 0x14, 0x9c, 0x41, 0xe6, 0x54, 0x5c, 0x54, 0x4b, 0x77, 0x53, 0xf7, - 0x4a, 0x06, 0x3e, 0xf2, 0xf7, 0xa1, 0xea, 0xf9, 0xf6, 0xc0, 0x76, 0x4d, 0xa7, 0xe9, 0x0b, 0x53, - 0x0a, 0xab, 0x67, 0x8f, 0x44, 0x20, 0xcd, 0xd1, 0xb8, 0x0a, 0x77, 0x53, 0xf7, 0x32, 0xc6, 0xa5, - 0xef, 0xf9, 0x5b, 0x6a, 0x86, 0xda, 0xee, 0x89, 0x57, 0x2d, 0xeb, 0xee, 0x4f, 0xcb, 0xb2, 0xa3, - 0x5f, 0x1b, 0x11, 0x62, 0xfd, 0xe7, 0x69, 0xc8, 0x77, 0x85, 0xe9, 0xf7, 0x87, 0xb5, 0x5f, 0x4b, - 0x41, 0xde, 0x10, 0xc1, 0xc4, 0x91, 0xbc, 0x06, 0x45, 0x35, 0xb6, 0x6d, 0xab, 0x9a, 0x22, 0xe9, - 0xa2, 0xf6, 0xe7, 0xd1, 0x9d, 0x4d, 0xc8, 0x8e, 0x84, 0x34, 0xab, 0x19, 0x1a, 0xa1, 0xda, 0x8c, - 0x54, 0xea, 0xf3, 0x9b, 0xfb, 0x42, 0x9a, 0x06, 0xe1, 0xd5, 0x7e, 0x96, 0x82, 0x2c, 0x36, 0xf9, - 0x6d, 0x28, 0x0d, 0xed, 0xc1, 0xd0, 0xb1, 0x07, 0x43, 0xa9, 0x05, 0x89, 0x01, 0xfc, 0x43, 0x58, - 0x8f, 0x1a, 0x86, 0xe9, 0x0e, 0x04, 0x4a, 0xb4, 0x48, 0xf9, 0xe9, 0xa5, 0x31, 0x8b, 0xcc, 0xab, - 0x50, 0xa0, 0xf5, 0xd0, 0xb6, 0x48, 0xa3, 0x4b, 0x46, 0xd8, 0x44, 0x75, 0x0b, 0x67, 0xea, 0xb1, - 0xb8, 0xa8, 0x66, 0xe9, 0x6d, 0x12, 0xc4, 0x1b, 0xb0, 0x1e, 0x36, 0xb7, 0xf5, 0x68, 0xe4, 0xae, - 0x1e, 0x8d, 0x59, 0xfc, 0xfa, 0x67, 0x7b, 0x90, 0xa3, 0x65, 0xc9, 0xd7, 0x20, 0x6d, 0x87, 0x03, - 0x9d, 0xb6, 0x2d, 0xfe, 0x00, 0xf2, 0x27, 0xb6, 0x70, 0xac, 0x17, 0x8e, 0xb0, 0x46, 0xe3, 0x2d, - 0x58, 0xf5, 0x45, 0x20, 0x7d, 0x5b, 0x6b, 0xbf, 0x5a, 0xa0, 0x5f, 0x5a, 0x64, 0x03, 0x36, 0x8d, - 0x04, 0xa2, 0x31, 0x45, 0x86, 0xdd, 0xee, 0x0f, 0x6d, 0xc7, 0xf2, 0x85, 0xdb, 0xb6, 0xd4, 0x3a, - 0x2d, 0x19, 0x49, 0x10, 0xbf, 0x07, 0xeb, 0xc7, 0x66, 0xff, 0x74, 0xe0, 0x7b, 0x13, 0x17, 0x17, - 0x84, 0xe7, 0x53, 0xb7, 0x4b, 0xc6, 0x2c, 0x98, 0xbf, 0x01, 0x39, 0xd3, 0xb1, 0x07, 0x2e, 0xad, - 0xc4, 0xb5, 0xb9, 0x49, 0x57, 0xb2, 0x34, 0x10, 0xc3, 0x50, 0x88, 0x7c, 0x17, 0x2a, 0x67, 0xc2, - 0x97, 0x76, 0xdf, 0x74, 0x08, 0x5e, 0x2d, 0x10, 0x65, 0x7d, 0x21, 0xe5, 0xd3, 0x24, 0xa6, 0x31, - 0x4d, 0xc8, 0xdb, 0x00, 0x01, 0x9a, 0x49, 0x9a, 0x4e, 0xbd, 0x16, 0x5e, 0x5b, 0xc8, 0xa6, 0xe9, - 0xb9, 0x52, 0xb8, 0x72, 0xb3, 0x1b, 0xa1, 0xef, 0xae, 0x18, 0x09, 0x62, 0xfe, 0x2e, 0x64, 0xa5, - 0x38, 0x97, 0xd5, 0xb5, 0x2b, 0x46, 0x34, 0x64, 0xd2, 0x13, 0xe7, 0x72, 0x77, 0xc5, 0x20, 0x02, - 0x24, 0xc4, 0x45, 0x56, 0x5d, 0x5f, 0x82, 0x10, 0xd7, 0x25, 0x12, 0x22, 0x01, 0xff, 0x00, 0xf2, - 0x8e, 0x79, 0xe1, 0x4d, 0x64, 0x95, 0x11, 0xe9, 0x97, 0xaf, 0x24, 0xdd, 0x23, 0xd4, 0xdd, 0x15, - 0x43, 0x13, 0xf1, 0xb7, 0x21, 0x63, 0xd9, 0x67, 0xd5, 0x0d, 0xa2, 0xbd, 0x7b, 0x25, 0xed, 0xb6, - 0x7d, 0xb6, 0xbb, 0x62, 0x20, 0x3a, 0x6f, 0x42, 0xf1, 0xd8, 0xf3, 0x4e, 0x47, 0xa6, 0x7f, 0x5a, - 0xe5, 0x44, 0xfa, 0x95, 0x2b, 0x49, 0xb7, 0x34, 0xf2, 0xee, 0x8a, 0x11, 0x11, 0x62, 0x97, 0xed, - 0xbe, 0xe7, 0x56, 0xaf, 0x2d, 0xd1, 0xe5, 0x76, 0xdf, 0x73, 0xb1, 0xcb, 0x48, 0x80, 0x84, 0x8e, - 0xed, 0x9e, 0x56, 0xaf, 0x2f, 0x41, 0x88, 0x96, 0x13, 0x09, 0x91, 0x00, 0xc5, 0xb6, 0x4c, 0x69, - 0x9e, 0xd9, 0xe2, 0x79, 0xf5, 0xc6, 0x12, 0x62, 0x6f, 0x6b, 0x64, 0x14, 0x3b, 0x24, 0x44, 0x26, - 0xe1, 0xd2, 0xac, 0xde, 0x5c, 0x82, 0x49, 0x68, 0xd1, 0x91, 0x49, 0x48, 0xc8, 0xff, 0x2c, 0x6c, - 0x9c, 0x08, 0x53, 0x4e, 0x7c, 0x61, 0xc5, 0x1b, 0xdd, 0x2d, 0xe2, 0xb6, 0x79, 0xf5, 0xdc, 0xcf, - 0x52, 0xed, 0xae, 0x18, 0xf3, 0xac, 0xf8, 0xfb, 0x90, 0x73, 0x4c, 0x29, 0xce, 0xab, 0x55, 0xe2, - 0x59, 0x7f, 0x81, 0x52, 0x48, 0x71, 0xbe, 0xbb, 0x62, 0x28, 0x12, 0xfe, 0x3d, 0x58, 0x97, 0xe6, - 0xb1, 0x23, 0x3a, 0x27, 0x1a, 0x21, 0xa8, 0x7e, 0x81, 0xb8, 0xbc, 0x7e, 0xb5, 0x3a, 0x4f, 0xd3, - 0xec, 0xae, 0x18, 0xb3, 0x6c, 0x50, 0x2a, 0x02, 0x55, 0x6b, 0x4b, 0x48, 0x45, 0xfc, 0x50, 0x2a, - 0x22, 0xe1, 0x7b, 0x50, 0xa6, 0x87, 0xa6, 0xe7, 0x4c, 0x46, 0x6e, 0xf5, 0x8b, 0xc4, 0xe1, 0xde, - 0x8b, 0x39, 0x28, 0xfc, 0xdd, 0x15, 0x23, 0x49, 0x8e, 0x93, 0x48, 0x4d, 0xc3, 0x7b, 0x5e, 0xbd, - 0xbd, 0xc4, 0x24, 0xf6, 0x34, 0x32, 0x4e, 0x62, 0x48, 0x88, 0x4b, 0xef, 0xb9, 0x6d, 0x0d, 0x84, - 0xac, 0xfe, 0xc2, 0x12, 0x4b, 0xef, 0x19, 0xa1, 0xe2, 0xd2, 0x53, 0x44, 0xa8, 0xc6, 0xfd, 0xa1, - 0x29, 0xab, 0x77, 0x96, 0x50, 0xe3, 0xe6, 0xd0, 0x24, 0x5b, 0x81, 0x04, 0xb5, 0x4f, 0x61, 0x35, - 0x69, 0x95, 0x39, 0x87, 0xac, 0x2f, 0x4c, 0xb5, 0x23, 0x14, 0x0d, 0x7a, 0x46, 0x98, 0xb0, 0x6c, - 0x49, 0x3b, 0x42, 0xd1, 0xa0, 0x67, 0x7e, 0x13, 0xf2, 0xca, 0x37, 0x21, 0x83, 0x5f, 0x34, 0x74, - 0x0b, 0x71, 0x2d, 0xdf, 0x1c, 0xd0, 0xbe, 0x55, 0x34, 0xe8, 0x19, 0x71, 0x2d, 0xdf, 0x1b, 0x77, - 0x5c, 0x32, 0xd8, 0x45, 0x43, 0xb7, 0x6a, 0xff, 0xe6, 0x03, 0x28, 0x68, 0xa1, 0x6a, 0x7f, 0x2f, - 0x05, 0x79, 0x65, 0x50, 0xf8, 0xb7, 0x21, 0x17, 0xc8, 0x0b, 0x47, 0x90, 0x0c, 0x6b, 0x0f, 0xbf, - 0xba, 0x84, 0x11, 0xda, 0xec, 0x22, 0x81, 0xa1, 0xe8, 0xea, 0x06, 0xe4, 0xa8, 0xcd, 0x0b, 0x90, - 0x31, 0xbc, 0xe7, 0x6c, 0x85, 0x03, 0xe4, 0xd5, 0x64, 0xb1, 0x14, 0x02, 0xb7, 0xed, 0x33, 0x96, - 0x46, 0xe0, 0xae, 0x30, 0x2d, 0xe1, 0xb3, 0x0c, 0xaf, 0x40, 0x29, 0x9c, 0x96, 0x80, 0x65, 0x39, - 0x83, 0xd5, 0xc4, 0x84, 0x07, 0x2c, 0x57, 0xfb, 0x5f, 0x59, 0xc8, 0xe2, 0xfa, 0xe7, 0xaf, 0x40, - 0x45, 0x9a, 0xfe, 0x40, 0x28, 0x47, 0x38, 0x72, 0x52, 0xa6, 0x81, 0xfc, 0x83, 0xb0, 0x0f, 0x69, - 0xea, 0xc3, 0x6b, 0x2f, 0xb4, 0x2b, 0x53, 0x3d, 0x48, 0xec, 0xc2, 0x99, 0xe5, 0x76, 0xe1, 0x1d, - 0x28, 0xa2, 0x39, 0xeb, 0xda, 0x9f, 0x0a, 0x1a, 0xfa, 0xb5, 0x87, 0xf7, 0x5f, 0xfc, 0xc9, 0xb6, - 0xa6, 0x30, 0x22, 0x5a, 0xde, 0x86, 0x52, 0xdf, 0xf4, 0x2d, 0x12, 0x86, 0x66, 0x6b, 0xed, 0xe1, - 0xd7, 0x5e, 0xcc, 0xa8, 0x19, 0x92, 0x18, 0x31, 0x35, 0xef, 0x40, 0xd9, 0x12, 0x41, 0xdf, 0xb7, - 0xc7, 0x64, 0xde, 0xd4, 0x5e, 0xfc, 0xf5, 0x17, 0x33, 0xdb, 0x8e, 0x89, 0x8c, 0x24, 0x07, 0xf4, - 0xc8, 0xfc, 0xc8, 0xbe, 0x15, 0xc8, 0x41, 0x88, 0x01, 0xf5, 0x77, 0xa1, 0x18, 0xf6, 0x87, 0xaf, - 0x42, 0x11, 0xff, 0x1e, 0x78, 0xae, 0x60, 0x2b, 0x38, 0xb7, 0xd8, 0xea, 0x8e, 0x4c, 0xc7, 0x61, - 0x29, 0xbe, 0x06, 0x80, 0xcd, 0x7d, 0x61, 0xd9, 0x93, 0x11, 0x4b, 0xd7, 0x7f, 0x31, 0xd4, 0x96, - 0x22, 0x64, 0x0f, 0xcd, 0x01, 0x52, 0xac, 0x42, 0x31, 0x34, 0xd7, 0x2c, 0x85, 0xf4, 0xdb, 0x66, - 0x30, 0x3c, 0xf6, 0x4c, 0xdf, 0x62, 0x69, 0x5e, 0x86, 0x42, 0xc3, 0xef, 0x0f, 0xed, 0x33, 0xc1, - 0x32, 0xf5, 0x07, 0x50, 0x4e, 0xc8, 0x8b, 0x2c, 0xf4, 0x47, 0x4b, 0x90, 0x6b, 0x58, 0x96, 0xb0, - 0x58, 0x0a, 0x09, 0x74, 0x07, 0x59, 0xba, 0xfe, 0x35, 0x28, 0x45, 0xa3, 0x85, 0xe8, 0xb8, 0x71, - 0xb3, 0x15, 0x7c, 0x42, 0x30, 0x4b, 0xa1, 0x56, 0xb6, 0x5d, 0xc7, 0x76, 0x05, 0x4b, 0xd7, 0xfe, - 0x1c, 0xa9, 0x2a, 0xff, 0xd6, 0xf4, 0x82, 0x78, 0xf5, 0x45, 0x3b, 0xeb, 0xf4, 0x6a, 0xf8, 0x62, - 0xa2, 0x7f, 0x7b, 0x36, 0x09, 0x57, 0x84, 0xec, 0xb6, 0x27, 0x03, 0x96, 0xaa, 0xfd, 0xf7, 0x34, - 0x14, 0xc3, 0x0d, 0x15, 0x63, 0x82, 0x89, 0xef, 0x68, 0x85, 0xc6, 0x47, 0x7e, 0x1d, 0x72, 0xd2, - 0x96, 0x5a, 0x8d, 0x4b, 0x86, 0x6a, 0xa0, 0xaf, 0x96, 0x9c, 0x59, 0xe5, 0xc0, 0xce, 0x4e, 0x95, - 0x3d, 0x32, 0x07, 0x62, 0xd7, 0x0c, 0x86, 0xda, 0x85, 0x8d, 0x01, 0x48, 0x7f, 0x62, 0x9e, 0xa1, - 0xce, 0xd1, 0x7b, 0xe5, 0xc5, 0x25, 0x41, 0xfc, 0x2d, 0xc8, 0x62, 0x07, 0xb5, 0xd2, 0xfc, 0x99, - 0x99, 0x0e, 0xa3, 0x9a, 0x1c, 0xfa, 0x02, 0xa7, 0x67, 0x13, 0x23, 0x30, 0x83, 0x90, 0xf9, 0xab, - 0xb0, 0xa6, 0x16, 0x61, 0x27, 0x8c, 0x1f, 0x0a, 0xc4, 0x79, 0x06, 0xca, 0x1b, 0x38, 0x9c, 0xa6, - 0x14, 0xd5, 0xe2, 0x12, 0xfa, 0x1d, 0x0e, 0xce, 0x66, 0x17, 0x49, 0x0c, 0x45, 0x59, 0x7f, 0x07, - 0xc7, 0xd4, 0x94, 0x02, 0xa7, 0xb9, 0x35, 0x1a, 0xcb, 0x0b, 0xa5, 0x34, 0x3b, 0x42, 0xf6, 0x87, - 0xb6, 0x3b, 0x60, 0x29, 0x35, 0xc4, 0x38, 0x89, 0x84, 0xe2, 0xfb, 0x9e, 0xcf, 0x32, 0xb5, 0x1a, - 0x64, 0x51, 0x47, 0xd1, 0x48, 0xba, 0xe6, 0x48, 0xe8, 0x91, 0xa6, 0xe7, 0xda, 0x35, 0xd8, 0x98, - 0xdb, 0x8f, 0x6b, 0xbf, 0x97, 0x57, 0x1a, 0x82, 0x14, 0xe4, 0x0b, 0x6a, 0x0a, 0x72, 0xf3, 0x5e, - 0xca, 0xc6, 0x20, 0x97, 0x69, 0x1b, 0xf3, 0x01, 0xe4, 0xb0, 0x63, 0xa1, 0x89, 0x59, 0x82, 0x7c, - 0x1f, 0xd1, 0x0d, 0x45, 0x85, 0x11, 0x4c, 0x7f, 0x28, 0xfa, 0xa7, 0xc2, 0xd2, 0xb6, 0x3e, 0x6c, - 0xa2, 0xd2, 0xf4, 0x13, 0xee, 0xb9, 0x6a, 0x90, 0x4a, 0xf4, 0x3d, 0xb7, 0x35, 0xf2, 0xbe, 0x6f, - 0xd3, 0xbc, 0xa2, 0x4a, 0x84, 0x80, 0xf0, 0x6d, 0x1b, 0x75, 0x44, 0x4f, 0x5b, 0x0c, 0xa8, 0xb5, - 0x20, 0x47, 0xdf, 0xc6, 0x95, 0xa0, 0x64, 0x56, 0x99, 0x86, 0x57, 0x97, 0x93, 0x59, 0x8b, 0x5c, - 0xfb, 0xdd, 0x34, 0x64, 0xb1, 0xcd, 0xef, 0x43, 0xce, 0xc7, 0x38, 0x8c, 0x86, 0xf3, 0xb2, 0x98, - 0x4d, 0xa1, 0xf0, 0x6f, 0x6b, 0x55, 0x4c, 0x2f, 0xa1, 0x2c, 0xd1, 0x17, 0x93, 0x6a, 0x79, 0x1d, - 0x72, 0x63, 0xd3, 0x37, 0x47, 0x7a, 0x9d, 0xa8, 0x46, 0xfd, 0x47, 0x29, 0xc8, 0x22, 0x12, 0xdf, - 0x80, 0x4a, 0x57, 0xfa, 0xf6, 0xa9, 0x90, 0x43, 0xdf, 0x9b, 0x0c, 0x86, 0x4a, 0x93, 0x1e, 0x8b, - 0x0b, 0x65, 0x6f, 0x94, 0x41, 0x90, 0xa6, 0x63, 0xf7, 0x59, 0x1a, 0xb5, 0x6a, 0xcb, 0x73, 0x2c, - 0x96, 0xe1, 0xeb, 0x50, 0x7e, 0xe2, 0x5a, 0xc2, 0x0f, 0xfa, 0x9e, 0x2f, 0x2c, 0x96, 0xd5, 0xab, - 0xfb, 0x94, 0xe5, 0x68, 0x2f, 0x13, 0xe7, 0x92, 0x62, 0x21, 0x96, 0xe7, 0xd7, 0x60, 0x7d, 0x6b, - 0x3a, 0x40, 0x62, 0x05, 0xb4, 0x49, 0xfb, 0xc2, 0x45, 0x25, 0x63, 0x45, 0xa5, 0xc4, 0xde, 0xf7, - 0x6d, 0x56, 0xc2, 0x8f, 0xa9, 0x75, 0xc2, 0xa0, 0xfe, 0x2f, 0x53, 0xa1, 0xe5, 0xa8, 0x40, 0xe9, - 0xd0, 0xf4, 0xcd, 0x81, 0x6f, 0x8e, 0x51, 0xbe, 0x32, 0x14, 0xd4, 0xc6, 0xf9, 0xa6, 0xb2, 0x6e, - 0xaa, 0xf1, 0x50, 0xd9, 0x46, 0xd5, 0x78, 0x8b, 0x65, 0xe2, 0xc6, 0xdb, 0x2c, 0x8b, 0xdf, 0xf8, - 0xee, 0xc4, 0x93, 0x82, 0xe5, 0xc8, 0xd6, 0x79, 0x96, 0x60, 0x79, 0x04, 0xf6, 0xd0, 0xa2, 0xb0, - 0x02, 0xf6, 0xb9, 0x89, 0xfa, 0x73, 0xec, 0x9d, 0xb3, 0x22, 0x8a, 0x81, 0xc3, 0x28, 0x2c, 0x56, - 0xc2, 0x37, 0x07, 0x93, 0xd1, 0xb1, 0xc0, 0x6e, 0x02, 0xbe, 0xe9, 0x79, 0x83, 0x81, 0x23, 0x58, - 0x19, 0xc7, 0x20, 0x61, 0x7c, 0xd9, 0x2a, 0x59, 0x5a, 0xd3, 0x71, 0xbc, 0x89, 0x64, 0x95, 0xda, - 0xcf, 0x33, 0x90, 0xc5, 0xe8, 0x06, 0xd7, 0xce, 0x10, 0xed, 0x8c, 0x5e, 0x3b, 0xf8, 0x1c, 0xad, - 0xc0, 0x74, 0xbc, 0x02, 0xf9, 0xfb, 0x7a, 0xa6, 0x33, 0x4b, 0x58, 0x59, 0x64, 0x9c, 0x9c, 0x64, - 0x0e, 0xd9, 0x91, 0x3d, 0x12, 0xda, 0xd6, 0xd1, 0x33, 0xc2, 0x02, 0xdc, 0x8f, 0x73, 0x94, 0x3c, - 0xa1, 0x67, 0x5c, 0x35, 0x26, 0x6e, 0x0b, 0x0d, 0x49, 0x6b, 0x20, 0x63, 0x84, 0xcd, 0x05, 0xd6, - 0xab, 0xb4, 0xd0, 0x7a, 0x7d, 0x10, 0x5a, 0xaf, 0xc2, 0x12, 0xab, 0x9e, 0xc4, 0x4c, 0x5a, 0xae, - 0xd8, 0x68, 0x14, 0x97, 0x27, 0x4f, 0x6c, 0x26, 0xdb, 0x5a, 0x6b, 0xe3, 0x8d, 0xae, 0xa8, 0x46, - 0x99, 0xa5, 0x70, 0x36, 0x69, 0xb9, 0x2a, 0x9b, 0xf7, 0xd4, 0xb6, 0x84, 0xc7, 0x32, 0xb4, 0x11, - 0x4e, 0x2c, 0xdb, 0x63, 0x59, 0xf4, 0xbc, 0x0e, 0xb7, 0x77, 0x58, 0xae, 0xfe, 0x6a, 0x62, 0x4b, - 0x6a, 0x4c, 0xa4, 0xa7, 0xd8, 0x90, 0xfa, 0xa6, 0x94, 0x36, 0x1e, 0x0b, 0x8b, 0xa5, 0xeb, 0xdf, - 0x58, 0x60, 0x66, 0x2b, 0x50, 0x7a, 0x32, 0x76, 0x3c, 0xd3, 0xba, 0xc2, 0xce, 0xae, 0x02, 0xc4, - 0x51, 0x75, 0xed, 0xe7, 0xf5, 0x78, 0x3b, 0x47, 0x5f, 0x34, 0xf0, 0x26, 0x7e, 0x5f, 0x90, 0x09, - 0x29, 0x19, 0xba, 0xc5, 0xbf, 0x03, 0x39, 0x7c, 0x1f, 0xa6, 0x71, 0xee, 0x2f, 0x15, 0xcb, 0x6d, - 0x3e, 0xb5, 0xc5, 0x73, 0x43, 0x11, 0xf2, 0x3b, 0x00, 0x66, 0x5f, 0xda, 0x67, 0x02, 0x81, 0x7a, - 0xb1, 0x27, 0x20, 0xfc, 0x9d, 0xa4, 0xfb, 0x72, 0x75, 0x1e, 0x32, 0xe1, 0xd7, 0x70, 0x03, 0xca, - 0xb8, 0x74, 0xc7, 0x1d, 0x1f, 0x57, 0x7b, 0x75, 0x95, 0x08, 0xdf, 0x58, 0x4e, 0xbc, 0x47, 0x11, - 0xa1, 0x91, 0x64, 0xc2, 0x9f, 0xc0, 0xaa, 0xca, 0xa9, 0x69, 0xa6, 0x15, 0x62, 0xfa, 0xe6, 0x72, - 0x4c, 0x3b, 0x31, 0xa5, 0x31, 0xc5, 0x66, 0x3e, 0x2d, 0x99, 0x7b, 0xe9, 0xb4, 0xe4, 0xab, 0xb0, - 0xd6, 0x9b, 0x5e, 0x05, 0x6a, 0xab, 0x98, 0x81, 0xf2, 0x3a, 0xac, 0xda, 0x41, 0x9c, 0x15, 0xa5, - 0x1c, 0x49, 0xd1, 0x98, 0x82, 0xd5, 0xfe, 0x43, 0x1e, 0xb2, 0x34, 0xf2, 0xb3, 0x39, 0xae, 0xe6, - 0x94, 0x49, 0x7f, 0xb0, 0xfc, 0x54, 0xcf, 0xac, 0x78, 0xb2, 0x20, 0x99, 0x84, 0x05, 0xf9, 0x0e, - 0xe4, 0x02, 0xcf, 0x97, 0xe1, 0xf4, 0x2e, 0xa9, 0x44, 0x5d, 0xcf, 0x97, 0x86, 0x22, 0xe4, 0x3b, - 0x50, 0x38, 0xb1, 0x1d, 0x89, 0x93, 0xa2, 0x06, 0xef, 0xf5, 0xe5, 0x78, 0xec, 0x10, 0x91, 0x11, - 0x12, 0xf3, 0xbd, 0xa4, 0xb2, 0xe5, 0x89, 0xd3, 0xe6, 0x72, 0x9c, 0x16, 0xe9, 0xe0, 0x7d, 0x60, - 0x7d, 0xef, 0x4c, 0xf8, 0x46, 0x22, 0x31, 0xa9, 0x36, 0xe9, 0x39, 0x38, 0xaf, 0x41, 0x71, 0x68, - 0x5b, 0x02, 0xfd, 0x1c, 0xb2, 0x31, 0x45, 0x23, 0x6a, 0xf3, 0xc7, 0x50, 0xa4, 0xf8, 0x00, 0xad, - 0x62, 0xe9, 0xa5, 0x07, 0x5f, 0x85, 0x2a, 0x21, 0x03, 0xfc, 0x10, 0x7d, 0x7c, 0xc7, 0x96, 0x94, - 0x9f, 0x2e, 0x1a, 0x51, 0x1b, 0x05, 0x26, 0x7d, 0x4f, 0x0a, 0x5c, 0x56, 0x02, 0xcf, 0xc2, 0xf9, - 0xdb, 0x70, 0x83, 0x60, 0x33, 0x9b, 0x24, 0x2e, 0x35, 0x64, 0xba, 0xf8, 0x25, 0x3a, 0x2c, 0x63, - 0x73, 0x20, 0xf6, 0xec, 0x91, 0x2d, 0xab, 0x95, 0xbb, 0xa9, 0x7b, 0x39, 0x23, 0x06, 0xf0, 0xd7, - 0x61, 0xc3, 0x12, 0x27, 0xe6, 0xc4, 0x91, 0x3d, 0x31, 0x1a, 0x3b, 0xa6, 0x14, 0x6d, 0x8b, 0x74, - 0xb4, 0x64, 0xcc, 0xbf, 0xe0, 0x6f, 0xc0, 0x35, 0x0d, 0xec, 0x44, 0xa7, 0x0a, 0x6d, 0x8b, 0xd2, - 0x77, 0x25, 0x63, 0xd1, 0xab, 0xfa, 0xbe, 0x36, 0xc3, 0xb8, 0x81, 0x62, 0x9c, 0x1a, 0x1a, 0xd0, - 0x40, 0xaa, 0x1d, 0xf9, 0x91, 0xe9, 0x38, 0xc2, 0xbf, 0x50, 0x41, 0xee, 0x63, 0xd3, 0x3d, 0x36, - 0x5d, 0x96, 0xa1, 0x3d, 0xd6, 0x74, 0x84, 0x6b, 0x99, 0xbe, 0xda, 0x91, 0x1f, 0xd1, 0x86, 0x9e, - 0xab, 0xdf, 0x83, 0x2c, 0x0d, 0x69, 0x09, 0x72, 0x2a, 0x4a, 0xa2, 0x88, 0x59, 0x47, 0x48, 0x64, - 0x91, 0xf7, 0x70, 0xf9, 0xb1, 0x74, 0xed, 0xef, 0xe7, 0xa1, 0x18, 0x0e, 0x5e, 0x78, 0x86, 0x90, - 0x8a, 0xcf, 0x10, 0xd0, 0x8d, 0x0b, 0x9e, 0xda, 0x81, 0x7d, 0xac, 0xdd, 0xd2, 0xa2, 0x11, 0x03, - 0xd0, 0x13, 0x7a, 0x6e, 0x5b, 0x72, 0x48, 0x6b, 0x26, 0x67, 0xa8, 0x06, 0xbf, 0x07, 0xeb, 0x16, - 0x8e, 0x83, 0xdb, 0x77, 0x26, 0x96, 0xe8, 0xe1, 0x2e, 0xaa, 0xd2, 0x04, 0xb3, 0x60, 0xfe, 0x31, - 0x80, 0xb4, 0x47, 0x62, 0xc7, 0xf3, 0x47, 0xa6, 0xd4, 0xb1, 0xc1, 0x37, 0x5f, 0x4e, 0xab, 0x37, - 0x7b, 0x11, 0x03, 0x23, 0xc1, 0x0c, 0x59, 0xe3, 0xd7, 0x34, 0xeb, 0xc2, 0xe7, 0x62, 0xbd, 0x1d, - 0x31, 0x30, 0x12, 0xcc, 0x78, 0x0f, 0x0a, 0x27, 0x9e, 0x3f, 0x9a, 0x38, 0xa6, 0xde, 0x73, 0xdf, - 0x7f, 0x49, 0xbe, 0x3b, 0x8a, 0x9a, 0x6c, 0x4f, 0xc8, 0x2a, 0xce, 0x71, 0x97, 0x96, 0xcc, 0x71, - 0xd7, 0x7f, 0x09, 0x20, 0x96, 0x90, 0xdf, 0x04, 0xbe, 0xef, 0xb9, 0x72, 0xd8, 0x38, 0x3e, 0xf6, - 0xb7, 0xc4, 0x89, 0xe7, 0x8b, 0x6d, 0x13, 0xb7, 0xd7, 0x1b, 0xb0, 0x11, 0xc1, 0x1b, 0x27, 0x52, - 0xf8, 0x08, 0x26, 0x15, 0xe8, 0x0e, 0x3d, 0x5f, 0x2a, 0x1f, 0x8f, 0x1e, 0x9f, 0x74, 0x59, 0x06, - 0xb7, 0xf4, 0x76, 0xb7, 0xc3, 0xb2, 0xf5, 0x7b, 0x00, 0xf1, 0xd0, 0x52, 0x2c, 0x44, 0x4f, 0x6f, - 0x3e, 0xd4, 0x91, 0x11, 0xb5, 0x1e, 0xbe, 0xcd, 0x52, 0xf5, 0xcf, 0x52, 0x50, 0x4e, 0x74, 0x69, - 0x3a, 0x66, 0x6e, 0x7a, 0x13, 0x57, 0xaa, 0x20, 0x9d, 0x1e, 0x9f, 0x9a, 0xce, 0x04, 0x37, 0xf7, - 0x0d, 0xa8, 0x50, 0x7b, 0xdb, 0x0e, 0xa4, 0xed, 0xf6, 0x25, 0xcb, 0x44, 0x28, 0xca, 0x31, 0xc8, - 0x46, 0x28, 0x07, 0x9e, 0x06, 0xe5, 0x38, 0x83, 0xd5, 0x43, 0xe1, 0xf7, 0x45, 0x88, 0x44, 0xce, - 0xb0, 0x86, 0x44, 0x68, 0xca, 0x19, 0x36, 0xe5, 0xb0, 0x3b, 0x19, 0xb1, 0x22, 0x3a, 0x95, 0xd8, - 0x68, 0x9c, 0x09, 0x1f, 0x7d, 0x99, 0x12, 0x7e, 0x07, 0x01, 0xb8, 0x1a, 0x4c, 0x97, 0x41, 0x88, - 0xbd, 0x6f, 0xbb, 0xac, 0x1c, 0x35, 0xcc, 0x73, 0xb6, 0x8a, 0xf2, 0x53, 0xe8, 0xc0, 0x2a, 0xb5, - 0xff, 0x96, 0x81, 0x2c, 0xda, 0x75, 0x8c, 0x75, 0x93, 0x46, 0x48, 0xad, 0x95, 0x24, 0xe8, 0xf3, - 0xed, 0x46, 0xc8, 0x3b, 0xb9, 0x1b, 0xbd, 0x07, 0xe5, 0xfe, 0x24, 0x90, 0xde, 0x88, 0xb6, 0x62, - 0x7d, 0xda, 0x75, 0x73, 0x2e, 0x6b, 0x44, 0xc3, 0x69, 0x24, 0x51, 0xf9, 0x3b, 0x90, 0x3f, 0x51, - 0x5a, 0xaf, 0xf2, 0x46, 0xbf, 0x70, 0xc9, 0x6e, 0xad, 0x35, 0x5b, 0x23, 0x63, 0xbf, 0xec, 0xb9, - 0x15, 0x9b, 0x04, 0xe9, 0x5d, 0x37, 0x1f, 0xed, 0xba, 0xbf, 0x04, 0x6b, 0x02, 0x07, 0xfc, 0xd0, - 0x31, 0xfb, 0x62, 0x24, 0xdc, 0x70, 0x99, 0xbd, 0xfd, 0x12, 0x3d, 0xa6, 0x19, 0xa3, 0x6e, 0xcf, - 0xf0, 0x42, 0xcb, 0xe3, 0x7a, 0xb8, 0xf9, 0x87, 0x81, 0x7d, 0xd1, 0x88, 0x01, 0xf5, 0xaf, 0x68, - 0x7b, 0x59, 0x80, 0x4c, 0x23, 0xe8, 0xeb, 0x0c, 0x88, 0x08, 0xfa, 0x2a, 0xbc, 0x6a, 0xd2, 0x70, - 0xb0, 0x74, 0xfd, 0x4d, 0x28, 0x45, 0x5f, 0x40, 0xe5, 0x39, 0xf0, 0x64, 0x77, 0x2c, 0xfa, 0xf6, - 0x89, 0x2d, 0x2c, 0xa5, 0x9f, 0x5d, 0x69, 0xfa, 0x52, 0x25, 0x11, 0x5b, 0xae, 0xc5, 0xd2, 0xb5, - 0xdf, 0x29, 0x42, 0x5e, 0x6d, 0xbe, 0xba, 0xc3, 0xa5, 0xa8, 0xc3, 0xdf, 0x85, 0xa2, 0x37, 0x16, - 0xbe, 0x29, 0x3d, 0x5f, 0x67, 0x6e, 0xde, 0x79, 0x99, 0xcd, 0x7c, 0xb3, 0xa3, 0x89, 0x8d, 0x88, - 0xcd, 0xac, 0x36, 0xa5, 0xe7, 0xb5, 0xe9, 0x3e, 0xb0, 0x70, 0xdf, 0x3e, 0xf4, 0x91, 0x4e, 0x5e, - 0xe8, 0x38, 0x7c, 0x0e, 0xce, 0x7b, 0x50, 0xea, 0x7b, 0xae, 0x65, 0x47, 0x59, 0x9c, 0xb5, 0x87, - 0xdf, 0x78, 0x29, 0x09, 0x9b, 0x21, 0xb5, 0x11, 0x33, 0xe2, 0xaf, 0x43, 0xee, 0x0c, 0xd5, 0x8c, - 0xf4, 0xe9, 0x72, 0x25, 0x54, 0x48, 0xfc, 0x13, 0x28, 0xff, 0x60, 0x62, 0xf7, 0x4f, 0x3b, 0xc9, - 0x2c, 0xe1, 0x7b, 0x2f, 0x25, 0xc5, 0x77, 0x63, 0x7a, 0x23, 0xc9, 0x2c, 0xa1, 0xda, 0x85, 0x3f, - 0x86, 0x6a, 0x17, 0xe7, 0x55, 0xdb, 0x80, 0x8a, 0x2b, 0x02, 0x29, 0xac, 0x1d, 0xed, 0xab, 0xc1, - 0xe7, 0xf0, 0xd5, 0xa6, 0x59, 0xd4, 0xbf, 0x0c, 0xc5, 0x70, 0xc2, 0x79, 0x1e, 0xd2, 0x07, 0x18, - 0x14, 0xe5, 0x21, 0xdd, 0xf1, 0x95, 0xb6, 0x35, 0x50, 0xdb, 0xea, 0x7f, 0x98, 0x82, 0x52, 0x34, - 0xe8, 0xd3, 0x96, 0xb3, 0xf5, 0x83, 0x89, 0xe9, 0xb0, 0x14, 0x85, 0xcb, 0x9e, 0x54, 0x2d, 0x32, - 0xd6, 0x8f, 0xe8, 0xb0, 0xde, 0x67, 0x19, 0x72, 0x11, 0x44, 0x10, 0xb0, 0x2c, 0xe7, 0xb0, 0xa6, - 0xc1, 0x1d, 0x5f, 0xa1, 0xe6, 0xd0, 0xf0, 0xe1, 0xdb, 0x10, 0x90, 0x57, 0x1e, 0xc5, 0xa9, 0x50, - 0x06, 0xf2, 0xc0, 0x93, 0xd4, 0x28, 0xa2, 0x50, 0x6d, 0x97, 0x95, 0xf0, 0x9b, 0x07, 0x9e, 0x6c, - 0xa3, 0x49, 0x8c, 0xc2, 0xb3, 0x72, 0xf8, 0x79, 0x6a, 0x91, 0x45, 0x6c, 0x38, 0x4e, 0xdb, 0x65, - 0x15, 0xfd, 0x42, 0xb5, 0xd6, 0x90, 0x63, 0xeb, 0xdc, 0xec, 0x23, 0xf9, 0x3a, 0x5a, 0x58, 0xa4, - 0xd1, 0x6d, 0x86, 0x4b, 0xb2, 0x75, 0x6e, 0x07, 0x32, 0x60, 0x1b, 0xf5, 0x7f, 0x9f, 0x82, 0x72, - 0x62, 0x82, 0x31, 0xfc, 0x23, 0x44, 0xdc, 0xca, 0x54, 0x34, 0xf8, 0x31, 0x0e, 0xa3, 0x6f, 0x85, - 0xdb, 0x54, 0xcf, 0xc3, 0xc7, 0x34, 0x7e, 0xaf, 0xe7, 0x8d, 0x3c, 0xdf, 0xf7, 0x9e, 0x2b, 0xd7, - 0x67, 0xcf, 0x0c, 0xe4, 0x33, 0x21, 0x4e, 0x59, 0x16, 0xbb, 0xda, 0x9c, 0xf8, 0xbe, 0x70, 0x15, - 0x20, 0x47, 0xc2, 0x89, 0x73, 0xd5, 0xca, 0x23, 0x53, 0x44, 0xa6, 0x7d, 0x90, 0x15, 0xd0, 0x10, - 0x68, 0x6c, 0x05, 0x29, 0x22, 0x02, 0xa2, 0xab, 0x66, 0x09, 0x37, 0x15, 0x95, 0xa1, 0xe8, 0x9c, - 0x6c, 0x9b, 0x17, 0x41, 0x63, 0xe0, 0x31, 0x98, 0x05, 0x1e, 0x78, 0xcf, 0x59, 0xb9, 0x36, 0x01, - 0x88, 0x63, 0x32, 0x8c, 0x45, 0x51, 0x21, 0xa2, 0x33, 0x04, 0xdd, 0xe2, 0x1d, 0x00, 0x7c, 0x22, - 0xcc, 0x30, 0x20, 0x7d, 0x09, 0x47, 0x99, 0xe8, 0x8c, 0x04, 0x8b, 0xda, 0x5f, 0x80, 0x52, 0xf4, - 0x82, 0x57, 0xa1, 0x40, 0x2e, 0x6d, 0xf4, 0xd9, 0xb0, 0x89, 0xfe, 0x99, 0xed, 0x5a, 0xe2, 0x9c, - 0xec, 0x4a, 0xce, 0x50, 0x0d, 0x94, 0x72, 0x68, 0x5b, 0x96, 0x70, 0xc3, 0x93, 0x1e, 0xd5, 0x5a, - 0x74, 0x1e, 0x9f, 0x5d, 0x78, 0x1e, 0x5f, 0xfb, 0x65, 0x28, 0x27, 0x82, 0xc6, 0x4b, 0xbb, 0x9d, - 0x10, 0x2c, 0x3d, 0x2d, 0xd8, 0x6d, 0x28, 0x85, 0x35, 0x20, 0x01, 0xed, 0x6d, 0x25, 0x23, 0x06, - 0xd4, 0xfe, 0x69, 0x1a, 0x3d, 0x59, 0xec, 0xda, 0x6c, 0xa0, 0xb7, 0x03, 0xf9, 0x40, 0x9a, 0x72, - 0x12, 0x16, 0x33, 0x2c, 0xb9, 0x40, 0xbb, 0x44, 0xb3, 0xbb, 0x62, 0x68, 0x6a, 0xfe, 0x01, 0x64, - 0xa4, 0x39, 0xd0, 0x89, 0xd2, 0xaf, 0x2e, 0xc7, 0xa4, 0x67, 0x0e, 0x76, 0x57, 0x0c, 0xa4, 0xe3, - 0x7b, 0x50, 0xec, 0xeb, 0xdc, 0x96, 0x36, 0x8a, 0x4b, 0xc6, 0x62, 0x61, 0x46, 0x6c, 0x77, 0xc5, - 0x88, 0x38, 0xf0, 0xef, 0x40, 0x16, 0xbd, 0x4b, 0x5d, 0xf3, 0xb1, 0x64, 0x8c, 0x89, 0xcb, 0x65, - 0x77, 0xc5, 0x20, 0xca, 0xad, 0x02, 0xe4, 0xc8, 0x06, 0xd7, 0xaa, 0x90, 0x57, 0x7d, 0x9d, 0x1d, - 0xb9, 0xda, 0x2d, 0xc8, 0xf4, 0xcc, 0x01, 0x7a, 0xf8, 0xb6, 0x15, 0xe8, 0x54, 0x09, 0x3e, 0xd6, - 0x5e, 0x89, 0xf3, 0x74, 0xc9, 0x14, 0x70, 0x6a, 0x2a, 0x05, 0x5c, 0xcb, 0x43, 0x16, 0xbf, 0x58, - 0xbb, 0x7d, 0x55, 0xb4, 0x50, 0xfb, 0x87, 0x19, 0x0c, 0x2c, 0xa4, 0x38, 0x5f, 0x98, 0xde, 0xfe, - 0x08, 0x4a, 0x63, 0xdf, 0xeb, 0x8b, 0x20, 0xf0, 0x7c, 0xed, 0x1c, 0xbd, 0xfe, 0xe2, 0xa3, 0xe7, - 0xcd, 0xc3, 0x90, 0xc6, 0x88, 0xc9, 0xeb, 0xff, 0x2a, 0x0d, 0xa5, 0xe8, 0x85, 0x8a, 0x67, 0xa4, - 0x38, 0x57, 0xa9, 0xcc, 0x7d, 0xe1, 0x8f, 0x4c, 0xdb, 0x52, 0xd6, 0xa3, 0x39, 0x34, 0x43, 0x27, - 0xf7, 0x63, 0x6f, 0x22, 0x27, 0xc7, 0x42, 0xa5, 0xb0, 0x9e, 0xda, 0x23, 0xe1, 0xb1, 0x2c, 0x1d, - 0x1e, 0xa1, 0x62, 0xf7, 0x1d, 0x6f, 0x62, 0xb1, 0x1c, 0xb6, 0x1f, 0xd1, 0xf6, 0xb6, 0x6f, 0x8e, - 0x03, 0x65, 0x33, 0xf7, 0x6d, 0xdf, 0x63, 0x05, 0x24, 0xda, 0xb1, 0x07, 0x23, 0x93, 0x15, 0x91, - 0x59, 0xef, 0xb9, 0x2d, 0xd1, 0x08, 0x97, 0xd0, 0x4d, 0xed, 0x8c, 0x85, 0xdb, 0x95, 0xbe, 0x10, - 0x72, 0xdf, 0x1c, 0xab, 0x9c, 0xa6, 0x21, 0x2c, 0xcb, 0x96, 0xca, 0x7e, 0xee, 0x98, 0x7d, 0x71, - 0xec, 0x79, 0xa7, 0x6c, 0x15, 0x0d, 0x4d, 0xdb, 0x0d, 0xa4, 0x39, 0xf0, 0xcd, 0x91, 0xb2, 0xa1, - 0x3d, 0xe1, 0x08, 0x6a, 0xad, 0xd1, 0xb7, 0x6d, 0x39, 0x9c, 0x1c, 0x3f, 0xc2, 0xb8, 0x6f, 0x5d, - 0x9d, 0x33, 0x59, 0x62, 0x2c, 0xd0, 0x86, 0xae, 0x42, 0x71, 0xcb, 0x76, 0xec, 0x63, 0xdb, 0xb1, - 0xd9, 0x06, 0xa2, 0xb6, 0xce, 0xfb, 0xa6, 0x63, 0x5b, 0xbe, 0xf9, 0x9c, 0x71, 0x14, 0xee, 0xb1, - 0xef, 0x9d, 0xda, 0xec, 0x1a, 0x22, 0x52, 0x18, 0x78, 0x66, 0x7f, 0xca, 0xae, 0xd3, 0x59, 0xd9, - 0xa9, 0x90, 0xfd, 0xe1, 0x89, 0x79, 0xcc, 0x6e, 0xc4, 0x29, 0xbd, 0x9b, 0xb5, 0x0d, 0x58, 0x9f, - 0x39, 0x95, 0xaf, 0x15, 0x74, 0xf4, 0x59, 0xab, 0x40, 0x39, 0x71, 0x5c, 0x5a, 0x7b, 0x15, 0x8a, - 0xe1, 0x61, 0x2a, 0x46, 0xe9, 0x76, 0xa0, 0xd2, 0xc0, 0x5a, 0x49, 0xa2, 0x76, 0xed, 0xf7, 0x53, - 0x90, 0x57, 0x27, 0xd9, 0x7c, 0x2b, 0xaa, 0x3c, 0x49, 0x2d, 0x71, 0x7a, 0xa9, 0x88, 0xf4, 0xd9, - 0x6f, 0x54, 0x7e, 0x72, 0x1d, 0x72, 0x0e, 0x85, 0xe3, 0xda, 0x7c, 0x51, 0x23, 0x61, 0x6d, 0x32, - 0x49, 0x6b, 0x53, 0x6f, 0x44, 0xe7, 0xcd, 0x61, 0xea, 0x91, 0xbc, 0xc2, 0x9e, 0x2f, 0x84, 0x4a, - 0x2b, 0x52, 0x34, 0x9d, 0xa6, 0xbd, 0xc2, 0x1b, 0x8d, 0xcd, 0xbe, 0x24, 0x00, 0xed, 0xa2, 0x68, - 0x4c, 0x59, 0x16, 0xb5, 0xbc, 0x39, 0x34, 0x65, 0xfd, 0x04, 0x8a, 0x87, 0x5e, 0x30, 0xbb, 0x27, - 0x17, 0x20, 0xd3, 0xf3, 0xc6, 0xca, 0xc3, 0xdc, 0xf2, 0x24, 0x79, 0x98, 0x6a, 0x0b, 0x3e, 0x91, - 0x4a, 0xa9, 0x0c, 0x7b, 0x30, 0x94, 0x2a, 0x12, 0x6f, 0xbb, 0xae, 0xf0, 0x59, 0x0e, 0xe7, 0xd0, - 0x10, 0x63, 0xf4, 0x6a, 0x59, 0x1e, 0x67, 0x8d, 0xe0, 0x3b, 0xb6, 0x1f, 0x48, 0x56, 0xa8, 0xb7, - 0x71, 0x37, 0xb5, 0x07, 0xb4, 0x09, 0xd2, 0x03, 0xb1, 0x5a, 0x41, 0x11, 0xa9, 0xd9, 0x14, 0x2e, - 0xea, 0x18, 0x45, 0x4f, 0x2a, 0xf4, 0xa3, 0x0f, 0xa4, 0x71, 0x07, 0xa3, 0xf6, 0x47, 0x93, 0x40, - 0xda, 0x27, 0x17, 0x2c, 0x53, 0x7f, 0x06, 0x95, 0xa9, 0x32, 0x26, 0x7e, 0x1d, 0xd8, 0x14, 0x00, - 0x45, 0x5f, 0xe1, 0xb7, 0xe0, 0xda, 0x14, 0x74, 0xdf, 0xb6, 0x2c, 0xca, 0xf5, 0xce, 0xbe, 0x08, - 0x3b, 0xb8, 0x55, 0x82, 0x42, 0x5f, 0xcd, 0x52, 0xfd, 0x10, 0x2a, 0x34, 0x6d, 0xfb, 0x42, 0x9a, - 0x1d, 0xd7, 0xb9, 0xf8, 0x63, 0xd7, 0x9a, 0xd5, 0xbf, 0xa6, 0x03, 0x2c, 0xb4, 0x17, 0x27, 0xbe, - 0x37, 0x22, 0x5e, 0x39, 0x83, 0x9e, 0x91, 0xbb, 0xf4, 0xf4, 0xdc, 0xa7, 0xa5, 0x57, 0xff, 0x8d, - 0x12, 0x14, 0x1a, 0xfd, 0x3e, 0x86, 0x84, 0x73, 0x5f, 0x7e, 0x07, 0xf2, 0x7d, 0xcf, 0x3d, 0xb1, - 0x07, 0xda, 0x1e, 0xcf, 0x7a, 0x86, 0x9a, 0x0e, 0x15, 0xee, 0xc4, 0x1e, 0x18, 0x1a, 0x19, 0xc9, - 0xf4, 0x7e, 0x92, 0xbb, 0x92, 0x4c, 0x19, 0xd5, 0x68, 0xfb, 0x78, 0x00, 0x59, 0xdb, 0x3d, 0xf1, - 0x74, 0x61, 0xe8, 0x17, 0x2f, 0x21, 0xa2, 0xea, 0x48, 0x42, 0xac, 0xfd, 0x97, 0x14, 0xe4, 0xd5, - 0xa7, 0xf9, 0xab, 0xb0, 0x26, 0x5c, 0x5c, 0x4c, 0xa1, 0x29, 0xd7, 0xab, 0x68, 0x06, 0x8a, 0x4e, - 0xab, 0x86, 0x88, 0xe3, 0xc9, 0x40, 0xe7, 0x5e, 0x92, 0x20, 0xfe, 0x1e, 0xdc, 0x52, 0xcd, 0x43, - 0x5f, 0xf8, 0xc2, 0x11, 0x66, 0x20, 0x9a, 0x43, 0xd3, 0x75, 0x85, 0xa3, 0x37, 0xf6, 0xcb, 0x5e, - 0xf3, 0x3a, 0xac, 0xaa, 0x57, 0xdd, 0xb1, 0xd9, 0x17, 0x81, 0x3e, 0xef, 0x9b, 0x82, 0xf1, 0xaf, - 0x43, 0x8e, 0xea, 0x66, 0xab, 0xd6, 0xd5, 0x53, 0xa9, 0xb0, 0x6a, 0x5e, 0xb4, 0xf3, 0x34, 0x00, - 0xd4, 0x30, 0x61, 0xd0, 0xa5, 0x57, 0xff, 0x97, 0xae, 0x1c, 0x57, 0x8a, 0xff, 0x12, 0x44, 0x28, - 0x9f, 0x25, 0x1c, 0x41, 0x05, 0x8e, 0xb8, 0x33, 0xa6, 0xe9, 0x64, 0x65, 0x0a, 0x56, 0xfb, 0x27, - 0x59, 0xc8, 0xe2, 0x08, 0x23, 0xf2, 0xd0, 0x1b, 0x89, 0x28, 0xbf, 0xac, 0x5c, 0x8d, 0x29, 0x18, - 0xba, 0x36, 0xa6, 0x3a, 0xe2, 0x8f, 0xd0, 0x94, 0xf1, 0x98, 0x05, 0x23, 0xe6, 0xd8, 0xf7, 0x4e, - 0x6c, 0x27, 0xc6, 0xd4, 0x4e, 0xd0, 0x0c, 0x98, 0x7f, 0x03, 0x6e, 0x8e, 0x4c, 0xff, 0x54, 0x48, - 0x5a, 0xdd, 0xcf, 0x3c, 0xff, 0x34, 0xc0, 0x91, 0x6b, 0x5b, 0x3a, 0x31, 0x79, 0xc9, 0x5b, 0xfe, - 0x3a, 0x6c, 0x3c, 0x0f, 0x9b, 0xd1, 0x37, 0x54, 0x6a, 0x70, 0xfe, 0x05, 0x9a, 0x5b, 0x4b, 0x9c, - 0xd9, 0xc4, 0xb7, 0xa8, 0xaa, 0x67, 0xc3, 0x36, 0xaa, 0x92, 0xa9, 0x06, 0xb2, 0xab, 0xbf, 0xac, - 0x4f, 0x98, 0xa6, 0xa1, 0xe8, 0x6d, 0xa9, 0xaa, 0xa2, 0xa0, 0x6d, 0x51, 0x66, 0xb5, 0x64, 0xc4, - 0x00, 0x54, 0x34, 0xfa, 0xe4, 0x53, 0x65, 0x54, 0x2b, 0x2a, 0x04, 0x4d, 0x80, 0x10, 0x43, 0x8a, - 0xfe, 0x30, 0xfc, 0x88, 0x4a, 0x7b, 0x26, 0x41, 0xfc, 0x0e, 0xc0, 0xc0, 0x94, 0xe2, 0xb9, 0x79, - 0xf1, 0xc4, 0x77, 0xaa, 0x42, 0x1d, 0x95, 0xc4, 0x10, 0x0c, 0x62, 0x1d, 0xaf, 0x6f, 0x3a, 0x5d, - 0xe9, 0xf9, 0xe6, 0x40, 0x1c, 0x9a, 0x72, 0x58, 0x1d, 0xa8, 0x20, 0x76, 0x16, 0x8e, 0x3d, 0x96, - 0xf6, 0x48, 0x7c, 0xe2, 0xb9, 0xa2, 0x3a, 0x54, 0x3d, 0x0e, 0xdb, 0x28, 0x89, 0xe9, 0x9a, 0xce, - 0x85, 0xb4, 0xfb, 0xd8, 0x17, 0x5b, 0x49, 0x92, 0x00, 0x51, 0xda, 0x40, 0x48, 0x1c, 0xc7, 0xb6, - 0x55, 0xfd, 0xbe, 0xea, 0x6b, 0x04, 0xa8, 0x77, 0x00, 0x62, 0x95, 0x43, 0x3b, 0xde, 0xa0, 0xe3, - 0x1c, 0xb6, 0xa2, 0xf2, 0x48, 0xae, 0x65, 0xbb, 0x83, 0x6d, 0xad, 0x65, 0x2c, 0x85, 0x40, 0xca, - 0x0f, 0x08, 0x2b, 0x02, 0x92, 0x27, 0x41, 0x2d, 0x61, 0xb1, 0x4c, 0xfd, 0xff, 0xa4, 0xa0, 0x9c, - 0xa8, 0x5e, 0xf8, 0x13, 0xac, 0xb8, 0xc0, 0x7d, 0x16, 0x77, 0x6a, 0x1c, 0x50, 0xa5, 0x81, 0x51, - 0x1b, 0x87, 0x5b, 0x17, 0x57, 0xe0, 0x5b, 0x95, 0x0d, 0x48, 0x40, 0x3e, 0x57, 0xb5, 0x45, 0xfd, - 0xa1, 0x4e, 0xa9, 0x94, 0xa1, 0xf0, 0xc4, 0x3d, 0x75, 0xbd, 0xe7, 0xae, 0xda, 0x40, 0xa9, 0x84, - 0x66, 0xea, 0x30, 0x30, 0xac, 0x72, 0xc9, 0xd4, 0xff, 0x45, 0x76, 0xa6, 0xda, 0xac, 0x05, 0x79, - 0xe5, 0xc7, 0x93, 0x8b, 0x39, 0x5f, 0x1e, 0x94, 0x44, 0xd6, 0x07, 0x4f, 0x09, 0x90, 0xa1, 0x89, - 0xd1, 0xc1, 0x8e, 0x6a, 0x31, 0xd3, 0x0b, 0x0f, 0xc8, 0xa6, 0x18, 0x85, 0x46, 0x73, 0xaa, 0x1c, - 0x39, 0xe2, 0x50, 0xfb, 0x6b, 0x29, 0xb8, 0xbe, 0x08, 0x25, 0x59, 0xb4, 0x9d, 0x9a, 0x2e, 0xda, - 0xee, 0xce, 0x14, 0x41, 0xa7, 0xa9, 0x37, 0x0f, 0x5e, 0x52, 0x88, 0xe9, 0x92, 0xe8, 0xfa, 0xef, - 0xa5, 0x60, 0x63, 0xae, 0xcf, 0x09, 0x07, 0x03, 0x20, 0xaf, 0x34, 0x4b, 0xd5, 0x28, 0x45, 0x55, - 0x23, 0x2a, 0xeb, 0x4f, 0x5b, 0x6f, 0xa0, 0x8e, 0xe1, 0x75, 0xd9, 0xb7, 0xf2, 0x5f, 0x71, 0xd6, - 0xd0, 0xb2, 0x0f, 0x84, 0xca, 0x90, 0x2a, 0x2f, 0x48, 0x43, 0xf2, 0xca, 0xc7, 0x54, 0x47, 0x13, - 0xac, 0x40, 0xb5, 0x4f, 0x93, 0xb1, 0x63, 0xf7, 0xb1, 0x59, 0xe4, 0x35, 0xb8, 0xa9, 0x6a, 0xff, - 0x75, 0x3c, 0x77, 0xd2, 0x1b, 0xda, 0xb4, 0x38, 0x58, 0x09, 0xbf, 0x73, 0x38, 0x39, 0x76, 0xec, - 0x60, 0xc8, 0xa0, 0x6e, 0xc0, 0xb5, 0x05, 0x1d, 0x24, 0x91, 0x9f, 0x6a, 0xf1, 0xd7, 0x00, 0xb6, - 0x9f, 0x86, 0x42, 0xb3, 0x14, 0xe7, 0xb0, 0xb6, 0xfd, 0x34, 0xc9, 0x5d, 0x2f, 0x9e, 0xa7, 0x68, - 0x56, 0x02, 0x96, 0xa9, 0xff, 0x6a, 0x2a, 0x2c, 0x4e, 0xa8, 0xfd, 0x79, 0xa8, 0x28, 0x81, 0x0f, - 0xcd, 0x0b, 0xc7, 0x33, 0x2d, 0xde, 0x82, 0xb5, 0x20, 0xba, 0x9d, 0x92, 0xd8, 0x49, 0x66, 0x77, - 0xe8, 0xee, 0x14, 0x92, 0x31, 0x43, 0x14, 0xc6, 0x28, 0xe9, 0xf8, 0x44, 0x83, 0x53, 0xb4, 0x65, - 0xd2, 0x92, 0x5b, 0xa5, 0xf8, 0xc9, 0xac, 0x7f, 0x1d, 0x36, 0xba, 0xb1, 0xd5, 0x55, 0xce, 0x2c, - 0x2a, 0x87, 0x32, 0xd9, 0xdb, 0xa1, 0x72, 0xe8, 0x66, 0xfd, 0x3f, 0xe5, 0x01, 0xe2, 0xd3, 0x9b, - 0x05, 0x6b, 0x7e, 0x51, 0x31, 0xc2, 0xdc, 0x59, 0x6a, 0xe6, 0xa5, 0xcf, 0x52, 0xdf, 0x8b, 0x7c, - 0x6a, 0x95, 0xd9, 0x9d, 0xad, 0xc8, 0x8e, 0x65, 0x9a, 0xf5, 0xa4, 0xa7, 0x6a, 0x75, 0x72, 0xb3, - 0xb5, 0x3a, 0x77, 0xe7, 0x0b, 0xfb, 0x66, 0x8c, 0x51, 0x9c, 0x32, 0x28, 0x4c, 0xa5, 0x0c, 0x6a, - 0x50, 0xf4, 0x85, 0x69, 0x79, 0xae, 0x73, 0x11, 0x1e, 0xd9, 0x85, 0x6d, 0xfe, 0x16, 0xe4, 0x24, - 0x5d, 0xb0, 0x29, 0xd2, 0xda, 0x79, 0xc1, 0xc4, 0x29, 0x5c, 0xb4, 0x6c, 0x76, 0xa0, 0xab, 0xf1, - 0xd4, 0x76, 0x56, 0x34, 0x12, 0x10, 0xbe, 0x09, 0xdc, 0xc6, 0xf8, 0xc9, 0x71, 0x84, 0xb5, 0x75, - 0xb1, 0xad, 0x4e, 0xd2, 0x68, 0xc3, 0x2d, 0x1a, 0x0b, 0xde, 0x84, 0xf3, 0xbf, 0x1a, 0xcf, 0x3f, - 0x89, 0x7c, 0x66, 0x07, 0xd8, 0xd3, 0x0a, 0xf9, 0x15, 0x51, 0x1b, 0xb7, 0xf4, 0x70, 0xc1, 0xaa, - 0xb1, 0x24, 0xed, 0x8d, 0x8f, 0xa3, 0x2f, 0x79, 0x5b, 0xff, 0x83, 0x74, 0x14, 0x7b, 0x94, 0x20, - 0x77, 0x6c, 0x06, 0x76, 0x5f, 0x85, 0xa2, 0xda, 0x67, 0x50, 0xf1, 0x87, 0xf4, 0x2c, 0x8f, 0xa5, - 0x31, 0x8c, 0x08, 0x84, 0x3e, 0xef, 0x88, 0x2f, 0x1d, 0xb1, 0x2c, 0x2e, 0xd4, 0x70, 0xbe, 0x55, - 0x51, 0x0d, 0x91, 0x52, 0xf6, 0xca, 0x8a, 0xca, 0x15, 0x29, 0x0e, 0xa5, 0x8d, 0x80, 0x15, 0x11, - 0xc7, 0xf5, 0xa4, 0x50, 0xb9, 0x3b, 0xd2, 0x4e, 0x06, 0xc8, 0x26, 0xac, 0xa2, 0x67, 0x65, 0xf4, - 0xeb, 0x43, 0xa6, 0x2a, 0xe1, 0x16, 0x50, 0xd4, 0xb3, 0x8a, 0xab, 0x73, 0xfa, 0x05, 0xab, 0xa0, - 0x44, 0xf1, 0x5d, 0x26, 0xb6, 0x86, 0x5c, 0x4d, 0x2a, 0xf5, 0x58, 0xc7, 0xc7, 0x33, 0x2a, 0x00, - 0x61, 0xf8, 0x55, 0x0b, 0xad, 0xc7, 0x06, 0x4a, 0x16, 0xf9, 0x09, 0x8c, 0x63, 0xd8, 0x32, 0x36, - 0x31, 0x86, 0xb0, 0xc7, 0xa6, 0x2b, 0xd9, 0x35, 0xec, 0xea, 0xd8, 0x3a, 0x61, 0xd7, 0x91, 0xa4, - 0x3f, 0x34, 0x25, 0xbb, 0x81, 0x38, 0xf8, 0xb4, 0x2d, 0x7c, 0x9c, 0x4f, 0x76, 0x13, 0x71, 0xa4, - 0x39, 0x60, 0xb7, 0xea, 0xbf, 0x19, 0x17, 0x0c, 0xbf, 0x11, 0x79, 0xf7, 0xcb, 0x28, 0x39, 0xfa, - 0xff, 0x8b, 0x56, 0x5c, 0x0b, 0x36, 0x7c, 0xf1, 0x83, 0x89, 0x3d, 0x55, 0x46, 0x9f, 0xb9, 0xba, - 0x4e, 0x63, 0x9e, 0xa2, 0x7e, 0x06, 0x1b, 0x61, 0xe3, 0x99, 0x2d, 0x87, 0x94, 0x68, 0xe1, 0x6f, - 0x25, 0xea, 0xfc, 0x53, 0x0b, 0xef, 0x47, 0x45, 0x2c, 0xe3, 0xba, 0xfe, 0x28, 0x91, 0x9e, 0x5e, - 0x22, 0x91, 0x5e, 0xff, 0xdf, 0xc9, 0x93, 0x59, 0x15, 0xef, 0x58, 0x51, 0xbc, 0x33, 0x7f, 0x52, - 0x1b, 0xe7, 0xc6, 0xd3, 0x2f, 0x93, 0x1b, 0x5f, 0x54, 0xf5, 0xf0, 0x3e, 0xba, 0xdf, 0xb4, 0x7e, - 0x9e, 0x2e, 0x91, 0xf7, 0x9f, 0xc2, 0xe5, 0x5b, 0x74, 0xee, 0x6a, 0x76, 0x55, 0x49, 0x4e, 0x6e, - 0xe1, 0xad, 0x9b, 0xe4, 0x01, 0xab, 0xc6, 0x34, 0x12, 0x54, 0x09, 0x6b, 0x93, 0x5f, 0x64, 0x6d, - 0x30, 0xf4, 0xd4, 0x76, 0x28, 0x6a, 0xab, 0x63, 0x12, 0xf5, 0x1c, 0xb2, 0x27, 0xa7, 0xba, 0x68, - 0xcc, 0xc1, 0xd1, 0x25, 0x1b, 0x4d, 0x1c, 0x69, 0xeb, 0x93, 0x00, 0xd5, 0x98, 0xbd, 0x16, 0x58, - 0x9a, 0xbf, 0x16, 0xf8, 0x21, 0x40, 0x20, 0x70, 0x75, 0x6c, 0xdb, 0x7d, 0xa9, 0x0b, 0x77, 0xee, - 0x5c, 0xd6, 0x37, 0x7d, 0x7e, 0x91, 0xa0, 0x40, 0xf9, 0x47, 0xe6, 0x39, 0x9d, 0x69, 0xea, 0x0a, - 0x83, 0xa8, 0x3d, 0x6b, 0x83, 0xd7, 0xe6, 0x6d, 0xf0, 0x5b, 0x90, 0x0b, 0xfa, 0xde, 0x58, 0xd0, - 0xcd, 0x96, 0xcb, 0xe7, 0x77, 0xb3, 0x8b, 0x48, 0x86, 0xc2, 0xa5, 0x8c, 0x1e, 0x5a, 0x29, 0xcf, - 0xa7, 0x3b, 0x2d, 0x25, 0x23, 0x6c, 0x4e, 0xd9, 0xc1, 0x9b, 0xd3, 0x76, 0xb0, 0x66, 0x41, 0x5e, - 0x67, 0xe7, 0x67, 0xe3, 0xec, 0x30, 0xaf, 0x97, 0x4e, 0xe4, 0xf5, 0xa2, 0xf2, 0xd0, 0x4c, 0xb2, - 0x3c, 0x74, 0xe6, 0xda, 0x5b, 0x6e, 0xee, 0xda, 0x5b, 0xfd, 0x13, 0xc8, 0x91, 0xac, 0xe8, 0x44, - 0xa8, 0x61, 0x56, 0x0e, 0x27, 0x76, 0x8a, 0xa5, 0xf8, 0x75, 0x60, 0x81, 0x20, 0x8f, 0x44, 0x74, - 0xcd, 0x91, 0x20, 0x23, 0x99, 0xe6, 0x55, 0xb8, 0xae, 0x70, 0x83, 0xe9, 0x37, 0xe4, 0x16, 0x39, - 0xf6, 0xb1, 0x6f, 0xfa, 0x17, 0x2c, 0x5b, 0xff, 0x90, 0xce, 0xc6, 0x43, 0x85, 0x2a, 0x47, 0xd7, - 0x0c, 0x95, 0x59, 0xb6, 0xb4, 0xf5, 0xa1, 0xd2, 0x0a, 0x1d, 0x2c, 0xa9, 0x82, 0x33, 0x8a, 0x46, - 0x28, 0x9d, 0xb2, 0x9a, 0xdc, 0x89, 0xff, 0xc4, 0xd6, 0x5b, 0x7d, 0x2b, 0xe1, 0xd7, 0x4d, 0x57, - 0x90, 0xa5, 0x96, 0xad, 0x20, 0xab, 0x3f, 0x86, 0x75, 0x63, 0xda, 0xa6, 0xf3, 0xf7, 0xa0, 0xe0, - 0x8d, 0x93, 0x7c, 0x5e, 0xa4, 0x97, 0x21, 0x7a, 0xfd, 0x27, 0x29, 0x58, 0x6d, 0xbb, 0x52, 0xf8, - 0xae, 0xe9, 0xec, 0x38, 0xe6, 0x80, 0xbf, 0x1b, 0x5a, 0xa9, 0xc5, 0xa1, 0x7b, 0x12, 0x77, 0xda, - 0x60, 0x39, 0x3a, 0x0b, 0xcd, 0x6f, 0xc0, 0x86, 0xb0, 0x6c, 0xe9, 0xf9, 0xca, 0x9b, 0x0d, 0x0b, - 0xfd, 0xae, 0x03, 0x53, 0xe0, 0x2e, 0x2d, 0x89, 0x9e, 0x9a, 0xe6, 0x2a, 0x5c, 0x9f, 0x82, 0x86, - 0xae, 0x6a, 0x9a, 0xdf, 0x86, 0x6a, 0xbc, 0x1b, 0x6d, 0x7b, 0xae, 0x6c, 0xbb, 0x96, 0x38, 0x27, - 0x57, 0x88, 0x65, 0xea, 0xbf, 0x5e, 0x08, 0x9d, 0xb0, 0xa7, 0xba, 0x0c, 0xd0, 0xf7, 0xbc, 0xf8, - 0x8e, 0xa9, 0x6e, 0x25, 0xee, 0x32, 0xa7, 0x97, 0xb8, 0xcb, 0xfc, 0x61, 0x7c, 0x1f, 0x55, 0x6d, - 0x14, 0xaf, 0x2c, 0xdc, 0x7d, 0xa8, 0x7a, 0x49, 0xfb, 0xe0, 0x5d, 0x91, 0xb8, 0x9c, 0xfa, 0xa6, - 0x0e, 0xbc, 0xb2, 0xcb, 0xf8, 0xaa, 0xea, 0xa0, 0xff, 0x9d, 0xd9, 0x4b, 0x10, 0xcb, 0x55, 0x11, - 0xce, 0xb9, 0x93, 0xf0, 0xd2, 0xee, 0xe4, 0xb7, 0x67, 0x62, 0x9c, 0xe2, 0xc2, 0x6c, 0xd6, 0x15, - 0x57, 0x3c, 0xbf, 0x0d, 0x85, 0xa1, 0x1d, 0x48, 0xcf, 0x57, 0xd7, 0x8e, 0xe7, 0xaf, 0x49, 0x25, - 0x46, 0x6b, 0x57, 0x21, 0x52, 0xc9, 0x57, 0x48, 0xc5, 0xbf, 0x07, 0x1b, 0x34, 0xf0, 0x87, 0xb1, - 0xd7, 0x10, 0x54, 0xcb, 0x0b, 0x4b, 0xed, 0x12, 0xac, 0xb6, 0x66, 0x48, 0x8c, 0x79, 0x26, 0xb5, - 0x01, 0x40, 0x3c, 0x3f, 0x73, 0x56, 0xec, 0x73, 0x5c, 0x3b, 0xbe, 0x09, 0xf9, 0x60, 0x72, 0x1c, - 0x1f, 0x57, 0xe9, 0x56, 0xed, 0x1c, 0x6a, 0x73, 0xde, 0xc1, 0xa1, 0xf0, 0x95, 0xb8, 0x57, 0xde, - 0x7d, 0xfe, 0x30, 0x39, 0xf1, 0x4a, 0x39, 0xef, 0x5e, 0x32, 0x7b, 0x11, 0xe7, 0x84, 0x06, 0xd4, - 0xde, 0x81, 0x72, 0x62, 0x50, 0xd1, 0x32, 0x4f, 0x5c, 0xcb, 0x0b, 0x33, 0xa8, 0xf8, 0xac, 0xee, - 0x7e, 0x59, 0x61, 0x0e, 0x95, 0x9e, 0x6b, 0x06, 0xb0, 0xd9, 0x01, 0xbc, 0x22, 0x0e, 0x7e, 0x05, - 0x2a, 0x09, 0x97, 0x2e, 0xca, 0xae, 0x4d, 0x03, 0xeb, 0x67, 0xf0, 0xc5, 0x04, 0xbb, 0x43, 0xe1, - 0x8f, 0xec, 0x00, 0x37, 0x12, 0x15, 0xd2, 0x51, 0x2a, 0xc3, 0x12, 0xae, 0xb4, 0x65, 0x68, 0x41, - 0xa3, 0x36, 0xff, 0x45, 0xc8, 0x8d, 0x85, 0x3f, 0x0a, 0xb4, 0x15, 0x9d, 0xd5, 0xa0, 0x85, 0x6c, - 0x03, 0x43, 0xd1, 0xd4, 0xff, 0x41, 0x0a, 0x8a, 0xfb, 0x42, 0x9a, 0xe8, 0x3b, 0xf0, 0xfd, 0x99, - 0xaf, 0xcc, 0x1f, 0xb1, 0x86, 0xa8, 0x9b, 0x3a, 0xc8, 0xdc, 0x6c, 0x6b, 0x7c, 0xdd, 0xde, 0x5d, - 0x89, 0x05, 0xab, 0x6d, 0x41, 0x41, 0x83, 0x6b, 0xef, 0xc2, 0xfa, 0x0c, 0x26, 0x8d, 0x8b, 0xf2, - 0xed, 0xbb, 0x17, 0xa3, 0xb0, 0x0e, 0x68, 0xd5, 0x98, 0x06, 0x6e, 0x95, 0xa0, 0x30, 0x56, 0x04, - 0xf5, 0x3f, 0xb8, 0x41, 0xd5, 0x27, 0xf6, 0x09, 0x46, 0xde, 0x8b, 0x76, 0xd6, 0x3b, 0x00, 0xb4, - 0x35, 0xab, 0x1a, 0x05, 0x95, 0xf1, 0x4c, 0x40, 0xf8, 0xfb, 0x51, 0xaa, 0x3a, 0xbb, 0xd0, 0xa9, - 0x4a, 0x32, 0x9f, 0xcd, 0x57, 0x57, 0xa1, 0x60, 0x07, 0x7b, 0xb8, 0xb5, 0xe9, 0xba, 0x9e, 0xb0, - 0xc9, 0xbf, 0x05, 0x79, 0x7b, 0x34, 0xf6, 0x7c, 0xa9, 0x73, 0xd9, 0x57, 0x72, 0x6d, 0x13, 0xe6, - 0xee, 0x8a, 0xa1, 0x69, 0x90, 0x5a, 0x9c, 0x13, 0x75, 0xf1, 0xc5, 0xd4, 0xad, 0xf3, 0x90, 0x5a, - 0xd1, 0xf0, 0xef, 0x42, 0x65, 0xa0, 0xca, 0x1a, 0x15, 0x63, 0x6d, 0x44, 0xbe, 0x7a, 0x15, 0x93, - 0x47, 0x49, 0x82, 0xdd, 0x15, 0x63, 0x9a, 0x03, 0xb2, 0x44, 0x07, 0x5e, 0x04, 0xb2, 0xe7, 0x7d, - 0xe4, 0xd9, 0x2e, 0x05, 0xa5, 0x2f, 0x60, 0x69, 0x24, 0x09, 0x90, 0xe5, 0x14, 0x07, 0xfe, 0x0d, - 0xf4, 0x78, 0x02, 0xa9, 0x6f, 0x7e, 0xdf, 0xbd, 0x8a, 0x53, 0x4f, 0x04, 0xfa, 0xce, 0x76, 0x20, - 0xf9, 0x39, 0xd4, 0x12, 0x8b, 0x44, 0x7f, 0xa4, 0x31, 0x1e, 0xfb, 0x1e, 0x46, 0xb6, 0x15, 0xe2, - 0xf6, 0x8d, 0xab, 0xb8, 0x1d, 0x5e, 0x4a, 0xbd, 0xbb, 0x62, 0x5c, 0xc1, 0x9b, 0xf7, 0x30, 0xb2, - 0xd3, 0x5d, 0xd8, 0x13, 0xe6, 0x59, 0x78, 0x6f, 0xfc, 0xfe, 0x52, 0xa3, 0x40, 0x14, 0xbb, 0x2b, - 0xc6, 0x0c, 0x0f, 0xfe, 0xcb, 0xb0, 0x31, 0xf5, 0x4d, 0xba, 0x2a, 0xaa, 0x6e, 0x95, 0x7f, 0x7d, - 0xe9, 0x6e, 0x20, 0xd1, 0xee, 0x8a, 0x31, 0xcf, 0x89, 0x4f, 0xe0, 0x0b, 0xf3, 0x5d, 0xda, 0x16, - 0x7d, 0xc7, 0x76, 0x85, 0xbe, 0x80, 0xfe, 0xce, 0xcb, 0x8d, 0x96, 0x26, 0xde, 0x5d, 0x31, 0x2e, - 0xe7, 0xcc, 0xff, 0x22, 0xdc, 0x1e, 0x2f, 0x34, 0x31, 0xca, 0x74, 0xe9, 0xfb, 0xeb, 0xef, 0x2d, - 0xf9, 0xe5, 0x39, 0xfa, 0xdd, 0x15, 0xe3, 0x4a, 0xfe, 0xe8, 0x3b, 0x53, 0x04, 0xad, 0xab, 0xaf, - 0x55, 0x83, 0xdf, 0x86, 0x92, 0xd9, 0x77, 0x76, 0x85, 0x69, 0x45, 0xe9, 0xf6, 0x18, 0x50, 0xfb, - 0x1f, 0x29, 0xc8, 0x6b, 0x7d, 0xbf, 0x1d, 0x1d, 0xa9, 0x47, 0xa6, 0x3b, 0x06, 0xf0, 0x0f, 0xa0, - 0x24, 0x7c, 0xdf, 0xf3, 0x9b, 0x9e, 0x15, 0x56, 0x23, 0xce, 0xe6, 0x82, 0x15, 0x9f, 0xcd, 0x56, - 0x88, 0x66, 0xc4, 0x14, 0xfc, 0x7d, 0x00, 0xb5, 0xce, 0x7b, 0xf1, 0x25, 0x9a, 0xda, 0x62, 0x7a, - 0x75, 0x82, 0x13, 0x63, 0xc7, 0xc9, 0xb3, 0xf0, 0xf8, 0x24, 0x6c, 0x46, 0x01, 0x67, 0x2e, 0x11, - 0x70, 0xde, 0xd6, 0x79, 0x84, 0x03, 0x7c, 0xa1, 0xaf, 0x92, 0x45, 0x80, 0xda, 0xbf, 0x4e, 0x41, - 0x5e, 0x19, 0x0f, 0xde, 0x9a, 0xef, 0xd1, 0x6b, 0x2f, 0xb6, 0x39, 0x9b, 0xb3, 0x3d, 0xfb, 0x16, - 0x80, 0xb2, 0x41, 0x89, 0x9e, 0xdd, 0x9e, 0xe1, 0xa3, 0x49, 0xc3, 0xfa, 0xdf, 0x18, 0xbf, 0xfe, - 0x50, 0x5d, 0x77, 0xa2, 0xc4, 0xed, 0x93, 0xbd, 0x3d, 0xb6, 0xc2, 0x37, 0xa0, 0xf2, 0xe4, 0xe0, - 0xf1, 0x41, 0xe7, 0xd9, 0xc1, 0x51, 0xcb, 0x30, 0x3a, 0x86, 0xca, 0xdf, 0x6e, 0x35, 0xb6, 0x8f, - 0xda, 0x07, 0x87, 0x4f, 0x7a, 0x2c, 0x5d, 0xfb, 0x67, 0x29, 0xa8, 0x4c, 0xd9, 0xae, 0x3f, 0xdd, - 0xa9, 0x4b, 0x0c, 0x7f, 0x66, 0xf1, 0xf0, 0x67, 0x2f, 0x1b, 0xfe, 0xdc, 0xec, 0xf0, 0xff, 0x4e, - 0x0a, 0x2a, 0x53, 0x36, 0x32, 0xc9, 0x3d, 0x35, 0xcd, 0x3d, 0xb9, 0xd3, 0xa7, 0x67, 0x76, 0xfa, - 0x3a, 0xac, 0x86, 0xcf, 0x07, 0x71, 0xc6, 0x61, 0x0a, 0x96, 0xc4, 0xa1, 0xfb, 0x06, 0xd9, 0x69, - 0x1c, 0xba, 0x73, 0x70, 0xb5, 0xb4, 0x74, 0xbf, 0x32, 0xa0, 0xeb, 0xe7, 0xb5, 0xcb, 0x2d, 0xe8, - 0x15, 0x5d, 0x78, 0x04, 0xe5, 0x71, 0xbc, 0x4c, 0x5f, 0xce, 0x2d, 0x49, 0x52, 0xbe, 0x40, 0xce, - 0xdf, 0x4d, 0xc1, 0xda, 0xb4, 0xcd, 0xfd, 0xff, 0x7a, 0x58, 0xff, 0x51, 0x0a, 0x36, 0xe6, 0x2c, - 0xf9, 0x95, 0x8e, 0xdd, 0xac, 0x5c, 0xe9, 0x25, 0xe4, 0xca, 0x2c, 0x90, 0xeb, 0x72, 0x4b, 0x72, - 0xb5, 0xc4, 0x5d, 0xf8, 0xc2, 0xa5, 0x7b, 0xc2, 0x15, 0x43, 0x3d, 0xc5, 0x34, 0x33, 0xcb, 0xf4, - 0xb7, 0x53, 0x70, 0xfb, 0x2a, 0x7b, 0xff, 0xff, 0x5c, 0xaf, 0x66, 0x25, 0xac, 0xbf, 0x1b, 0x9d, - 0xc3, 0x97, 0xa1, 0xa0, 0x7f, 0xd6, 0x49, 0x57, 0x3a, 0x0f, 0xbd, 0xe7, 0xae, 0xca, 0x44, 0x1b, - 0xc2, 0xd4, 0x17, 0xdf, 0x0d, 0x31, 0x76, 0x6c, 0x3a, 0xc9, 0xbc, 0x05, 0xd0, 0xa0, 0xb8, 0x2e, - 0xbc, 0x87, 0xd2, 0xdc, 0xeb, 0x74, 0x5b, 0x6c, 0x25, 0xe9, 0xc4, 0x7e, 0x12, 0x1a, 0xe2, 0xfa, - 0x21, 0xe4, 0xe3, 0x9b, 0x01, 0xfb, 0xa6, 0x7f, 0x6a, 0xa9, 0xf3, 0xc2, 0x55, 0x28, 0x1e, 0xea, - 0x10, 0x4a, 0x7d, 0xea, 0xa3, 0x6e, 0xe7, 0x40, 0x25, 0xbd, 0xb7, 0x3b, 0x3d, 0x75, 0xbf, 0xa0, - 0xfb, 0xf4, 0x91, 0x3a, 0xb8, 0x7a, 0x64, 0x34, 0x0e, 0x77, 0x8f, 0x08, 0x23, 0x57, 0xff, 0xad, - 0x6c, 0xb8, 0xab, 0xd5, 0x0d, 0x7d, 0x12, 0x09, 0x90, 0x47, 0x6b, 0xee, 0x69, 0xc6, 0xd1, 0x67, - 0xa8, 0x26, 0xb6, 0x75, 0xae, 0xf2, 0x10, 0x2c, 0xcd, 0xf3, 0x90, 0x3e, 0x3c, 0x56, 0x85, 0x3c, - 0xbb, 0x72, 0xe4, 0xa8, 0x8b, 0x89, 0xbd, 0x73, 0xc9, 0x72, 0xf8, 0xd0, 0x0c, 0xce, 0x58, 0xbe, - 0xfe, 0xcf, 0x33, 0x50, 0x8a, 0x4c, 0xe5, 0xcb, 0x98, 0x6e, 0xce, 0x61, 0xad, 0x7d, 0xd0, 0x6b, - 0x19, 0x07, 0x8d, 0x3d, 0x8d, 0x92, 0xe1, 0xd7, 0x60, 0x7d, 0xa7, 0xbd, 0xd7, 0x3a, 0xda, 0xeb, - 0x34, 0xb6, 0x35, 0xb0, 0xc8, 0x6f, 0x02, 0x6f, 0xef, 0x1f, 0x76, 0x8c, 0xde, 0x51, 0xbb, 0x7b, - 0xd4, 0x6c, 0x1c, 0x34, 0x5b, 0x7b, 0xad, 0x6d, 0x96, 0xe7, 0xaf, 0xc0, 0xdd, 0x83, 0x4e, 0xaf, - 0xdd, 0x39, 0x38, 0x3a, 0xe8, 0x1c, 0x75, 0xb6, 0x3e, 0x6a, 0x35, 0x7b, 0xdd, 0xa3, 0xf6, 0xc1, - 0x11, 0x72, 0x7d, 0x64, 0x34, 0xf0, 0x0d, 0xcb, 0xf1, 0xbb, 0x70, 0x5b, 0x63, 0x75, 0x5b, 0xc6, - 0xd3, 0x96, 0x81, 0x4c, 0x9e, 0x1c, 0x34, 0x9e, 0x36, 0xda, 0x7b, 0x8d, 0xad, 0xbd, 0x16, 0x5b, - 0xe5, 0x77, 0xa0, 0xa6, 0x31, 0x8c, 0x46, 0xaf, 0x75, 0xb4, 0xd7, 0xde, 0x6f, 0xf7, 0x8e, 0x5a, - 0xdf, 0x6b, 0xb6, 0x5a, 0xdb, 0xad, 0x6d, 0x56, 0xe1, 0x5f, 0x85, 0xaf, 0x90, 0x50, 0x5a, 0x88, - 0xe9, 0x8f, 0x7d, 0xd2, 0x3e, 0x3c, 0x6a, 0x18, 0xcd, 0xdd, 0xf6, 0xd3, 0x16, 0x5b, 0xe3, 0xaf, - 0xc1, 0x97, 0x2f, 0x47, 0xdd, 0x6e, 0x1b, 0xad, 0x66, 0xaf, 0x63, 0x7c, 0xcc, 0x36, 0xf8, 0x2f, - 0xc0, 0x17, 0x76, 0x7b, 0xfb, 0x7b, 0x47, 0xcf, 0x8c, 0xce, 0xc1, 0xa3, 0x23, 0x7a, 0xec, 0xf6, - 0x8c, 0x27, 0xcd, 0xde, 0x13, 0xa3, 0xc5, 0x80, 0xd7, 0xe0, 0xe6, 0xe1, 0xd6, 0xd1, 0x41, 0xa7, - 0x77, 0xd4, 0x38, 0xf8, 0x78, 0x6b, 0xaf, 0xd3, 0x7c, 0x7c, 0xb4, 0xd3, 0x31, 0xf6, 0x1b, 0x3d, - 0x56, 0xe6, 0x5f, 0x83, 0xd7, 0x9a, 0xdd, 0xa7, 0x5a, 0xcc, 0xce, 0xce, 0x91, 0xd1, 0x79, 0xd6, - 0x3d, 0xea, 0x18, 0x47, 0x46, 0x6b, 0x8f, 0xfa, 0xdc, 0x8d, 0x65, 0x2f, 0xf0, 0xdb, 0x50, 0x6d, - 0x1f, 0x74, 0x9f, 0xec, 0xec, 0xb4, 0x9b, 0xed, 0xd6, 0x41, 0xef, 0xe8, 0xb0, 0x65, 0xec, 0xb7, - 0xbb, 0x5d, 0x44, 0x63, 0xa5, 0xfa, 0x77, 0x20, 0xdf, 0x76, 0xcf, 0x6c, 0x49, 0xeb, 0x4b, 0x2b, - 0xa3, 0x8e, 0xb8, 0xc2, 0x26, 0x2d, 0x0b, 0x7b, 0xe0, 0xd2, 0x85, 0x7b, 0x5a, 0x5d, 0xab, 0x46, - 0x0c, 0xa8, 0xff, 0xe3, 0x34, 0x54, 0x14, 0x8b, 0x30, 0x82, 0xbb, 0x07, 0xeb, 0x3a, 0x15, 0xda, - 0x9e, 0x36, 0x61, 0xb3, 0x60, 0xfa, 0x25, 0x2b, 0x05, 0x4a, 0x18, 0xb2, 0x24, 0x88, 0x8e, 0xd7, - 0x88, 0x39, 0x46, 0x82, 0xea, 0x60, 0x31, 0x06, 0x7c, 0x5e, 0x0b, 0x86, 0xd6, 0x51, 0x21, 0xf6, - 0x3d, 0xb7, 0x19, 0xdd, 0xbc, 0x98, 0x82, 0xf1, 0x4f, 0xe0, 0x56, 0xd4, 0x6e, 0xb9, 0x7d, 0xff, - 0x62, 0x1c, 0xfd, 0xe0, 0x5c, 0x61, 0x61, 0x4a, 0x61, 0xc7, 0x76, 0xc4, 0x14, 0xa2, 0x71, 0x19, - 0x83, 0xfa, 0x1f, 0xa6, 0x12, 0x71, 0xaf, 0x8a, 0x6b, 0xaf, 0xb4, 0xf8, 0x8b, 0xce, 0x60, 0x30, - 0xf2, 0xd4, 0xe2, 0x6b, 0x47, 0x44, 0x37, 0xf9, 0x21, 0x70, 0x7b, 0x5e, 0xe8, 0xec, 0x92, 0x42, - 0x2f, 0xa0, 0x9d, 0x4d, 0xa1, 0xe7, 0xe6, 0x53, 0xe8, 0x77, 0x00, 0x06, 0x8e, 0x77, 0x6c, 0x3a, - 0x09, 0x47, 0x33, 0x01, 0xa9, 0x3b, 0x50, 0x0c, 0x7f, 0xd6, 0x8e, 0xdf, 0x84, 0x3c, 0xfd, 0xb0, - 0x5d, 0x94, 0x50, 0x54, 0x2d, 0xbe, 0x0b, 0x6b, 0x62, 0x5a, 0xe6, 0xf4, 0x92, 0x32, 0xcf, 0xd0, - 0xd5, 0xbf, 0x09, 0x1b, 0x73, 0x48, 0x38, 0x88, 0x63, 0x53, 0x46, 0x77, 0xdb, 0xf1, 0x79, 0xfe, - 0x10, 0xbb, 0xfe, 0x1f, 0xd3, 0xb0, 0xba, 0x6f, 0xba, 0xf6, 0x89, 0x08, 0x64, 0x28, 0x6d, 0xd0, - 0x1f, 0x8a, 0x91, 0x19, 0x4a, 0xab, 0x5a, 0x3a, 0xcb, 0x90, 0x4e, 0xe6, 0xef, 0xe7, 0x8e, 0x7b, - 0x6e, 0x42, 0xde, 0x9c, 0xc8, 0x61, 0x54, 0xee, 0xad, 0x5b, 0x38, 0x77, 0x8e, 0xdd, 0x17, 0x6e, - 0x10, 0xea, 0x66, 0xd8, 0x8c, 0x6b, 0x5a, 0xf2, 0x57, 0xd4, 0xb4, 0x14, 0xe6, 0xc7, 0xff, 0x2e, - 0x94, 0x83, 0xbe, 0x2f, 0x84, 0x1b, 0x0c, 0x3d, 0x19, 0xfe, 0x24, 0x62, 0x12, 0x44, 0x95, 0x5f, - 0xde, 0x73, 0x17, 0x57, 0xe8, 0x9e, 0xed, 0x9e, 0xea, 0x82, 0xa6, 0x29, 0x18, 0xea, 0x20, 0xe5, - 0x58, 0xec, 0x4f, 0x05, 0xc5, 0xf7, 0x39, 0x23, 0x6a, 0x53, 0x16, 0xc5, 0x94, 0x62, 0xe0, 0xf9, - 0xb6, 0x50, 0xa9, 0xc4, 0x92, 0x91, 0x80, 0x20, 0xad, 0x63, 0xba, 0x83, 0x89, 0x39, 0x10, 0xfa, - 0x50, 0x38, 0x6a, 0xd7, 0xff, 0x67, 0x0e, 0x60, 0x5f, 0x8c, 0x8e, 0x85, 0x1f, 0x0c, 0xed, 0x31, - 0x1d, 0x75, 0xd8, 0xba, 0xc8, 0xb5, 0x62, 0xd0, 0x33, 0x7f, 0x6f, 0xaa, 0xfe, 0x7c, 0xfe, 0x70, - 0x32, 0x26, 0x9f, 0x4d, 0xc1, 0xe0, 0xe0, 0x98, 0x52, 0xe8, 0x72, 0x22, 0x1a, 0xff, 0xac, 0x91, - 0x04, 0x51, 0xa5, 0x97, 0x29, 0x45, 0xcb, 0xb5, 0x54, 0x8a, 0x27, 0x6b, 0x44, 0x6d, 0xba, 0xc1, - 0x12, 0x34, 0x26, 0xd2, 0x33, 0x84, 0x2b, 0x9e, 0x47, 0x97, 0xb3, 0x62, 0x10, 0xdf, 0x87, 0xca, - 0xd8, 0xbc, 0x18, 0x09, 0x57, 0xee, 0x0b, 0x39, 0xf4, 0x2c, 0x5d, 0xfb, 0xf3, 0xda, 0xe5, 0x02, - 0x1e, 0x26, 0xd1, 0x8d, 0x69, 0x6a, 0xd4, 0x09, 0x37, 0xa0, 0x55, 0xa2, 0xa6, 0x51, 0xb7, 0xf8, - 0x16, 0x80, 0x7a, 0xa2, 0xc8, 0xa9, 0xb8, 0x38, 0x13, 0x65, 0x8e, 0x44, 0x20, 0xfc, 0x33, 0x5b, - 0xd9, 0x31, 0x15, 0x1b, 0xc6, 0x54, 0x68, 0xf5, 0x26, 0x81, 0xf0, 0x5b, 0x23, 0xd3, 0x76, 0xf4, - 0x04, 0xc7, 0x00, 0xfe, 0x36, 0xdc, 0x08, 0x26, 0xc7, 0xa8, 0x33, 0xc7, 0xa2, 0xe7, 0x1d, 0x88, - 0xe7, 0x81, 0x23, 0xa4, 0x14, 0xbe, 0xae, 0x2f, 0x58, 0xfc, 0xb2, 0x3e, 0x88, 0xdc, 0x1e, 0xfa, - 0xf9, 0x0d, 0x7c, 0x8a, 0x8b, 0x98, 0x22, 0x90, 0xae, 0xf0, 0x62, 0x29, 0xce, 0x60, 0x55, 0x81, - 0x74, 0x01, 0x58, 0x9a, 0x7f, 0x05, 0xbe, 0x34, 0x85, 0x64, 0xa8, 0x83, 0xe0, 0x60, 0xc7, 0x76, - 0x4d, 0xc7, 0xfe, 0x54, 0x1d, 0xcb, 0x67, 0xea, 0x63, 0xa8, 0x4c, 0x0d, 0x1c, 0xdd, 0x26, 0xa4, - 0x27, 0x5d, 0x05, 0xc3, 0x60, 0x55, 0xb5, 0xbb, 0xd2, 0xb7, 0xe9, 0x84, 0x23, 0x82, 0x34, 0x71, - 0x9d, 0x7b, 0x2c, 0xcd, 0xaf, 0x03, 0x53, 0x90, 0xb6, 0x6b, 0x8e, 0xc7, 0x8d, 0xf1, 0xd8, 0x11, - 0x2c, 0x43, 0x37, 0x35, 0x63, 0xa8, 0xaa, 0x42, 0x67, 0xd9, 0xfa, 0xf7, 0xe0, 0x16, 0x8d, 0xcc, - 0x53, 0xe1, 0x47, 0x81, 0xad, 0xee, 0xeb, 0x0d, 0xd8, 0x50, 0x4f, 0x07, 0x9e, 0x54, 0xaf, 0xc9, - 0xd9, 0xe3, 0xb0, 0xa6, 0xc0, 0xe8, 0xeb, 0x74, 0x05, 0xdd, 0xbf, 0x8c, 0x60, 0x11, 0x5e, 0xba, - 0xfe, 0x93, 0x3c, 0xf0, 0x58, 0x21, 0x7a, 0xb6, 0xf0, 0xb7, 0x4d, 0x69, 0x26, 0x32, 0x93, 0x95, - 0x4b, 0xcf, 0xd6, 0x5f, 0x5c, 0xbf, 0x76, 0x13, 0xf2, 0x76, 0x80, 0xa1, 0x98, 0xae, 0x2e, 0xd5, - 0x2d, 0xbe, 0x07, 0x30, 0x16, 0xbe, 0xed, 0x59, 0xa4, 0x41, 0xb9, 0x85, 0xd7, 0x00, 0xe6, 0x85, - 0xda, 0x3c, 0x8c, 0x68, 0x8c, 0x04, 0x3d, 0xca, 0xa1, 0x5a, 0xea, 0xa4, 0x3a, 0x4f, 0x42, 0x27, - 0x41, 0xfc, 0x0d, 0xb8, 0x36, 0xf6, 0xed, 0xbe, 0x50, 0xd3, 0xf1, 0x24, 0xb0, 0x9a, 0xf4, 0xa3, - 0x75, 0x05, 0xc2, 0x5c, 0xf4, 0x0a, 0x35, 0xd0, 0x74, 0x29, 0x40, 0x09, 0xe8, 0x6c, 0x56, 0xdf, - 0x58, 0x56, 0xf5, 0x97, 0x15, 0x63, 0xf1, 0x4b, 0x7e, 0x1f, 0x98, 0x7e, 0xb1, 0x6f, 0xbb, 0x7b, - 0xc2, 0x1d, 0xc8, 0x21, 0x29, 0x77, 0xc5, 0x98, 0x83, 0x93, 0x05, 0x53, 0x3f, 0x0d, 0xa4, 0xce, - 0x6d, 0x4a, 0x46, 0xd4, 0x56, 0xb7, 0xe0, 0x1d, 0xcf, 0xef, 0x4a, 0x5f, 0x17, 0x92, 0x46, 0x6d, - 0xf4, 0x59, 0x02, 0x92, 0xf5, 0xd0, 0xf7, 0xac, 0x09, 0x9d, 0x2a, 0x28, 0x23, 0x36, 0x0b, 0x8e, - 0x31, 0xf7, 0x4d, 0x57, 0x17, 0x11, 0x56, 0x92, 0x98, 0x11, 0x98, 0x62, 0x30, 0x2f, 0x88, 0x19, - 0xae, 0xeb, 0x18, 0x2c, 0x01, 0xd3, 0x38, 0x31, 0x2b, 0x16, 0xe1, 0xc4, 0x7c, 0xa8, 0xff, 0x96, - 0xef, 0xd9, 0x56, 0xcc, 0x6b, 0x43, 0x95, 0x78, 0xce, 0xc2, 0x13, 0xb8, 0x31, 0x4f, 0x3e, 0x85, - 0x1b, 0xc1, 0xeb, 0x3f, 0x4c, 0x01, 0xc4, 0x93, 0x8f, 0x2a, 0x1f, 0xb7, 0xe2, 0x25, 0x7e, 0x0b, - 0xae, 0x25, 0xc1, 0x74, 0x53, 0x80, 0x0e, 0x78, 0x39, 0xac, 0xc5, 0x2f, 0xb6, 0xcd, 0x8b, 0x80, - 0xa5, 0xf5, 0x9d, 0x61, 0x0d, 0x7b, 0x26, 0x04, 0x55, 0xd5, 0x5d, 0x07, 0x16, 0x03, 0xe9, 0x22, - 0x58, 0xc0, 0xb2, 0xd3, 0xa8, 0x1f, 0x0b, 0xd3, 0x0f, 0x58, 0xae, 0xbe, 0x0b, 0x79, 0x75, 0xb8, - 0xb4, 0xe0, 0x58, 0xf8, 0xe5, 0x6a, 0x3c, 0xfe, 0x7a, 0x0a, 0x60, 0x5b, 0x95, 0xf3, 0xe2, 0x2e, - 0xbe, 0xe0, 0xb4, 0x7d, 0x91, 0x47, 0x65, 0x5a, 0x16, 0x95, 0x45, 0x67, 0xa2, 0x1f, 0x9c, 0xc1, - 0x26, 0x6a, 0x8e, 0x19, 0x56, 0x4e, 0xa9, 0x35, 0x17, 0xb5, 0xd5, 0x06, 0xd2, 0xf4, 0x5c, 0x57, - 0xf4, 0x71, 0xfb, 0x89, 0x36, 0x90, 0x08, 0x54, 0xff, 0xb7, 0x05, 0x28, 0x37, 0x87, 0xa6, 0xdc, - 0x17, 0x41, 0x60, 0x0e, 0xc4, 0x9c, 0x2c, 0x55, 0x28, 0x78, 0xbe, 0x25, 0xfc, 0xf8, 0x32, 0x97, - 0x6e, 0x26, 0x6b, 0x0c, 0x32, 0xd3, 0x35, 0x06, 0xb7, 0xa1, 0xa4, 0x4e, 0x30, 0xac, 0x86, 0x32, - 0x03, 0x19, 0x23, 0x06, 0xe0, 0x5e, 0x3d, 0xf2, 0x2c, 0x32, 0x46, 0x0d, 0x95, 0xfc, 0xcf, 0x18, - 0x09, 0x88, 0x2a, 0xe9, 0x18, 0x3b, 0x17, 0x3d, 0x4f, 0xcb, 0xd4, 0xb6, 0xe2, 0x9b, 0xaf, 0xd3, - 0x70, 0xde, 0x84, 0xc2, 0x48, 0x35, 0xf4, 0x41, 0xc6, 0x6c, 0xca, 0x3f, 0xd1, 0xb5, 0x4d, 0xfd, - 0x57, 0x5f, 0x3e, 0x31, 0x42, 0x4a, 0x0c, 0xd1, 0x4d, 0x29, 0xcd, 0xfe, 0x70, 0xa4, 0x4d, 0x44, - 0x66, 0xc1, 0x99, 0x66, 0x92, 0x51, 0x23, 0xc2, 0x36, 0x92, 0x94, 0x7c, 0x0b, 0x4a, 0xbe, 0x30, - 0xa7, 0x8e, 0x55, 0x5f, 0xb9, 0x82, 0x8d, 0x11, 0xe2, 0x1a, 0x31, 0x59, 0xed, 0xc7, 0x29, 0x58, - 0x9b, 0x16, 0xf4, 0x4f, 0xe3, 0x37, 0xc3, 0xbe, 0x15, 0xff, 0x66, 0xd8, 0xe7, 0xf8, 0xfd, 0xad, - 0xdf, 0x4e, 0x01, 0xc4, 0x63, 0x80, 0x26, 0x5f, 0xfd, 0xb6, 0x51, 0xe8, 0x84, 0xaa, 0x16, 0xdf, - 0x9d, 0xba, 0x10, 0xff, 0xf6, 0x52, 0x03, 0x9a, 0x78, 0x4c, 0xd4, 0x28, 0x3f, 0x80, 0xb5, 0x69, - 0x38, 0xfd, 0x5a, 0x51, 0x7b, 0xaf, 0xa5, 0x52, 0x1c, 0xed, 0xfd, 0xc6, 0xa3, 0x96, 0xbe, 0xec, - 0xd3, 0x3e, 0x78, 0xcc, 0xd2, 0xb5, 0x3f, 0x4a, 0x41, 0x29, 0x1a, 0x5e, 0xfe, 0xdd, 0xe4, 0xbc, - 0xa8, 0x3a, 0x89, 0xb7, 0x96, 0x99, 0x97, 0xf8, 0xa9, 0xe5, 0x4a, 0xff, 0x22, 0x39, 0x4d, 0x1e, - 0xac, 0x4d, 0xbf, 0x5c, 0x60, 0x13, 0x1e, 0x4d, 0xdb, 0x84, 0x37, 0x97, 0xfa, 0x64, 0x18, 0x79, - 0xed, 0xd9, 0x81, 0xd4, 0xe6, 0xe2, 0xfd, 0xf4, 0x7b, 0xa9, 0xda, 0x5d, 0x58, 0x4d, 0xbe, 0x9a, - 0xbf, 0xd1, 0x77, 0xff, 0x8f, 0x32, 0xb0, 0x36, 0x5d, 0x6a, 0x40, 0xf7, 0x87, 0x54, 0x99, 0x4b, - 0xc7, 0xb1, 0x12, 0x65, 0xdd, 0x8c, 0xaf, 0x43, 0x59, 0xc7, 0x76, 0x04, 0xd8, 0xa0, 0x24, 0x8a, - 0x37, 0x12, 0xec, 0x6e, 0xf2, 0x77, 0x11, 0xdf, 0xe0, 0x10, 0xde, 0xec, 0x62, 0x63, 0x5e, 0xd2, - 0xbf, 0x10, 0xf5, 0x2b, 0x69, 0x5e, 0x49, 0x14, 0x17, 0xff, 0x08, 0x1d, 0x9b, 0xf5, 0xad, 0x89, - 0x6b, 0x39, 0xc2, 0x8a, 0xa0, 0x3f, 0x4e, 0x42, 0xa3, 0xea, 0xe0, 0x5f, 0xc9, 0xf2, 0x35, 0x28, - 0x75, 0x27, 0xc7, 0xba, 0x32, 0xf8, 0x2f, 0x65, 0xf9, 0x4d, 0xd8, 0xd0, 0x58, 0x71, 0x89, 0x1f, - 0xfb, 0xcb, 0x68, 0x82, 0xd7, 0x1a, 0x6a, 0xbc, 0xb4, 0xa0, 0xec, 0xaf, 0x64, 0x51, 0x04, 0xba, - 0x30, 0xfc, 0x57, 0x89, 0x4f, 0x74, 0xbd, 0x82, 0xfd, 0x6a, 0x96, 0xaf, 0x03, 0x74, 0x7b, 0xd1, - 0x87, 0x7e, 0x3d, 0xcb, 0xcb, 0x90, 0xef, 0xf6, 0x88, 0xdb, 0x0f, 0xb3, 0xfc, 0x06, 0xb0, 0xf8, - 0xad, 0x2e, 0x7c, 0xfc, 0x0d, 0x25, 0x4c, 0x54, 0xc9, 0xf8, 0x37, 0xb2, 0xd8, 0xaf, 0x70, 0x94, - 0xd9, 0xdf, 0xcc, 0x72, 0x06, 0xe5, 0x44, 0x6a, 0x8e, 0xfd, 0xad, 0x2c, 0xe7, 0x50, 0xd9, 0xb7, - 0x83, 0xc0, 0x76, 0x07, 0xba, 0x07, 0xbf, 0x46, 0x5f, 0xde, 0x89, 0x6e, 0x88, 0xb0, 0xdf, 0xcc, - 0xf2, 0x5b, 0xc0, 0x93, 0xc7, 0x11, 0xfa, 0xc5, 0xdf, 0x26, 0x6a, 0x65, 0xf6, 0x03, 0x0d, 0xfb, - 0x3b, 0x44, 0x8d, 0x9a, 0xa0, 0x01, 0xbf, 0x45, 0x03, 0xd2, 0x8c, 0x4b, 0x25, 0x35, 0xfc, 0x47, - 0x44, 0x1c, 0x4e, 0xa6, 0x82, 0xfd, 0x38, 0x7b, 0xff, 0x27, 0x94, 0x4e, 0x4e, 0x56, 0x1c, 0xf1, - 0x55, 0x28, 0x3a, 0x9e, 0x3b, 0x90, 0xea, 0xf7, 0x28, 0x2b, 0x50, 0x0a, 0x86, 0x9e, 0x2f, 0xa9, - 0x49, 0x57, 0xd8, 0x5c, 0xba, 0xcc, 0xac, 0x6a, 0xcb, 0x55, 0x90, 0xa2, 0xd2, 0x73, 0xd2, 0x1c, - 0xb0, 0x72, 0x54, 0xe4, 0x99, 0x8d, 0x0a, 0x51, 0xe9, 0x52, 0x75, 0x78, 0x69, 0x95, 0xe5, 0x11, - 0x75, 0xe2, 0x3b, 0xaa, 0x20, 0x55, 0xa0, 0x83, 0xaa, 0x7e, 0x78, 0x6e, 0x3c, 0x44, 0x3f, 0xb8, - 0xa4, 0xa0, 0xde, 0xf7, 0x6d, 0x75, 0x1d, 0x52, 0xd7, 0x77, 0x59, 0x28, 0x47, 0x54, 0xc2, 0xc0, - 0xc4, 0xfd, 0xbf, 0x9b, 0x82, 0xd5, 0xf0, 0x2a, 0xb1, 0x3d, 0xb0, 0x5d, 0x55, 0xd2, 0x1a, 0xfe, - 0xca, 0x67, 0xdf, 0xb1, 0xc7, 0xe1, 0xaf, 0xe6, 0xad, 0x43, 0xd9, 0xf2, 0xcd, 0x41, 0xc3, 0xb5, - 0xb6, 0x7d, 0x6f, 0xac, 0xc4, 0x56, 0x07, 0x4e, 0xaa, 0x94, 0xf6, 0xb9, 0x38, 0x46, 0xf4, 0xb1, - 0xf0, 0x59, 0x96, 0x6a, 0xc7, 0x86, 0xa6, 0x6f, 0xbb, 0x83, 0xd6, 0xb9, 0x14, 0x6e, 0xa0, 0x4a, - 0x6a, 0xcb, 0x50, 0x98, 0x04, 0xa2, 0x6f, 0x06, 0x82, 0xe5, 0xb1, 0x71, 0x3c, 0xb1, 0x1d, 0x69, - 0xbb, 0xea, 0xc7, 0xea, 0xa2, 0x9a, 0xd9, 0x22, 0xf6, 0xcc, 0x1c, 0xdb, 0xac, 0x74, 0xff, 0xf7, - 0x53, 0x50, 0x26, 0xb5, 0x88, 0x53, 0xaa, 0xb1, 0xcb, 0x51, 0x86, 0xc2, 0x5e, 0xf4, 0xab, 0x65, - 0x79, 0x48, 0x77, 0x4e, 0x55, 0x4a, 0x55, 0xab, 0x85, 0xba, 0x11, 0xa8, 0x7e, 0xc0, 0x2c, 0xcb, - 0xbf, 0x00, 0x37, 0x0c, 0x31, 0xf2, 0xa4, 0x78, 0x66, 0xda, 0x32, 0x79, 0xc9, 0x24, 0x87, 0xd1, - 0x89, 0x7a, 0x15, 0xde, 0x2a, 0xc9, 0x53, 0x74, 0x82, 0x9f, 0x0d, 0x21, 0x05, 0xec, 0x3d, 0x41, - 0x74, 0xb8, 0x52, 0x8c, 0x50, 0x3e, 0xf2, 0x6c, 0x17, 0xbf, 0x46, 0xf7, 0x50, 0x09, 0x42, 0xb9, - 0x79, 0x04, 0xc1, 0xfd, 0x03, 0xb8, 0xb9, 0x38, 0xa3, 0xac, 0x6e, 0xa8, 0xd2, 0x4f, 0xe5, 0xd2, - 0xb5, 0x83, 0x67, 0xbe, 0xad, 0x2e, 0x1a, 0x96, 0x20, 0xd7, 0x79, 0xee, 0x92, 0x5a, 0x6c, 0x40, - 0xe5, 0xc0, 0x4b, 0xd0, 0xb0, 0xcc, 0xfd, 0xfe, 0xd4, 0x21, 0x40, 0x3c, 0x28, 0xa1, 0x10, 0x2b, - 0x89, 0x2b, 0x35, 0x29, 0x95, 0x5e, 0xa6, 0xff, 0x76, 0xa0, 0x6e, 0xef, 0xeb, 0xe4, 0xbb, 0xa5, - 0x6e, 0xef, 0x47, 0x62, 0x66, 0xd5, 0xcf, 0x18, 0xb9, 0x7d, 0xe1, 0x08, 0x8b, 0xe5, 0xee, 0xbf, - 0x07, 0xeb, 0xba, 0xab, 0x7d, 0x11, 0x04, 0xe1, 0x95, 0x94, 0x43, 0xdf, 0x3e, 0x53, 0xbf, 0x10, - 0xb0, 0x0a, 0xc5, 0x43, 0xe1, 0x07, 0x9e, 0x4b, 0xbf, 0x8e, 0x00, 0x90, 0xef, 0x0e, 0x4d, 0x1f, - 0xbf, 0x71, 0xbf, 0x09, 0x25, 0xba, 0xa2, 0xf2, 0xd8, 0x76, 0x2d, 0xec, 0xc9, 0x96, 0x2e, 0xc4, - 0xa6, 0x9f, 0xa1, 0x39, 0xa3, 0xfe, 0x15, 0xd5, 0x0f, 0x76, 0xb2, 0x34, 0xbf, 0x09, 0x1c, 0xa3, - 0xe7, 0x91, 0x49, 0x77, 0x1e, 0x9d, 0x0b, 0xf5, 0xe3, 0xae, 0x99, 0xfb, 0xdf, 0x06, 0xae, 0x72, - 0x40, 0x96, 0x38, 0xb7, 0xdd, 0x41, 0x74, 0x9d, 0x1a, 0xe8, 0xb7, 0x11, 0x2c, 0x71, 0x4e, 0x21, - 0x56, 0x19, 0x0a, 0x61, 0x23, 0xfc, 0x85, 0x86, 0x1d, 0x6f, 0xe2, 0xa2, 0x14, 0x4f, 0xe1, 0xba, - 0xd2, 0x19, 0x14, 0x8b, 0x2e, 0xd4, 0x5d, 0x1a, 0x98, 0xaa, 0xfb, 0x45, 0x72, 0x12, 0x44, 0xb8, - 0x2c, 0x85, 0x82, 0x45, 0x41, 0x5d, 0x0c, 0x4f, 0xdf, 0xaf, 0xc3, 0xb5, 0x05, 0x91, 0x35, 0x59, - 0x69, 0x15, 0x5f, 0xb0, 0x95, 0xfb, 0x1f, 0xc2, 0x86, 0xb2, 0x2b, 0x07, 0xea, 0xca, 0x53, 0xb8, - 0x45, 0x3e, 0x6b, 0xef, 0xb4, 0xd5, 0xd0, 0x35, 0x5b, 0x7b, 0x7b, 0x4f, 0xf6, 0x1a, 0x06, 0x4b, - 0xd1, 0x04, 0x77, 0x7a, 0x47, 0xcd, 0xce, 0xc1, 0x41, 0xab, 0xd9, 0x6b, 0x6d, 0xb3, 0xf4, 0xd6, - 0xfd, 0x7f, 0xf7, 0xd9, 0x9d, 0xd4, 0x4f, 0x3f, 0xbb, 0x93, 0xfa, 0xaf, 0x9f, 0xdd, 0x49, 0xfd, - 0xf0, 0x67, 0x77, 0x56, 0x7e, 0xfa, 0xb3, 0x3b, 0x2b, 0xff, 0xf9, 0x67, 0x77, 0x56, 0x3e, 0x61, - 0xb3, 0xff, 0x81, 0xe4, 0x38, 0x4f, 0x2e, 0xed, 0x5b, 0xff, 0x37, 0x00, 0x00, 0xff, 0xff, 0x50, - 0x1f, 0x4c, 0x66, 0x9c, 0x64, 0x00, 0x00, + // 8986 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xcc, 0x7d, 0x5b, 0x8c, 0x64, 0xd9, + 0x91, 0x50, 0xe5, 0x3b, 0x33, 0xb2, 0xb2, 0xea, 0xd4, 0xe9, 0x57, 0x3a, 0xdd, 0x6e, 0xda, 0xe9, + 0xf1, 0x4c, 0xbb, 0x3d, 0xae, 0x9e, 0xe9, 0x99, 0xf1, 0x8c, 0xc7, 0x9e, 0xb1, 0xb3, 0xb2, 0xb2, + 0xba, 0x72, 0xba, 0xaa, 0xb2, 0x7c, 0x33, 0xbb, 0xdb, 0x33, 0xda, 0xa5, 0xb8, 0x95, 0xf7, 0x54, + 0xe6, 0x75, 0xdd, 0xbc, 0x37, 0x7d, 0xef, 0xc9, 0xea, 0x2a, 0x0b, 0xd0, 0xf2, 0xda, 0x65, 0xff, + 0x0c, 0x62, 0x81, 0x15, 0x42, 0x6b, 0x7f, 0x20, 0x21, 0x76, 0x25, 0x04, 0x92, 0x05, 0x0b, 0xac, + 0x04, 0x2b, 0x21, 0x90, 0x90, 0x90, 0x81, 0x1f, 0xfe, 0x40, 0x63, 0x89, 0x1f, 0x04, 0xab, 0xe5, + 0xcb, 0x42, 0x7c, 0xa0, 0x88, 0x73, 0xee, 0x23, 0x1f, 0x55, 0x9d, 0x3d, 0xbb, 0x8b, 0xf8, 0xaa, + 0x7b, 0xe2, 0x46, 0xc4, 0x3d, 0x8f, 0x38, 0x71, 0x22, 0xe2, 0x44, 0x64, 0xc1, 0x2b, 0xe3, 0xd3, + 0xc1, 0x03, 0xc7, 0x3e, 0x7e, 0x30, 0x3e, 0x7e, 0x30, 0xf2, 0x2c, 0xe1, 0x3c, 0x18, 0xfb, 0x9e, + 0xf4, 0x02, 0xd5, 0x08, 0x36, 0xa9, 0xc5, 0x2b, 0xa6, 0x7b, 0x21, 0x2f, 0xc6, 0x62, 0x93, 0xa0, + 0xb5, 0xdb, 0x03, 0xcf, 0x1b, 0x38, 0x42, 0xa1, 0x1e, 0x4f, 0x4e, 0x1e, 0x04, 0xd2, 0x9f, 0xf4, + 0xa5, 0x42, 0xae, 0xff, 0x2c, 0x0b, 0x37, 0xbb, 0x23, 0xd3, 0x97, 0x5b, 0x8e, 0xd7, 0x3f, 0xed, + 0xba, 0xe6, 0x38, 0x18, 0x7a, 0x72, 0xcb, 0x0c, 0x04, 0x7f, 0x1d, 0xf2, 0xc7, 0x08, 0x0c, 0xaa, + 0xa9, 0xbb, 0x99, 0x7b, 0xe5, 0x87, 0xd7, 0x37, 0xa7, 0x18, 0x6f, 0x12, 0x85, 0xa1, 0x71, 0xf8, + 0x9b, 0x50, 0xb0, 0x84, 0x34, 0x6d, 0x27, 0xa8, 0xa6, 0xef, 0xa6, 0xee, 0x95, 0x1f, 0xde, 0xda, + 0x54, 0x1f, 0xde, 0x0c, 0x3f, 0xbc, 0xd9, 0xa5, 0x0f, 0x1b, 0x21, 0x1e, 0x7f, 0x17, 0x8a, 0x27, + 0xb6, 0x23, 0x1e, 0x8b, 0x8b, 0xa0, 0x9a, 0xb9, 0x92, 0x66, 0x2b, 0x5d, 0x4d, 0x19, 0x11, 0x32, + 0x6f, 0xc2, 0x9a, 0x38, 0x97, 0xbe, 0x69, 0x08, 0xc7, 0x94, 0xb6, 0xe7, 0x06, 0xd5, 0x2c, 0xf5, + 0xf0, 0xd6, 0x4c, 0x0f, 0xc3, 0xf7, 0x44, 0x3e, 0x43, 0xc2, 0xef, 0x42, 0xd9, 0x3b, 0xfe, 0xbe, + 0xe8, 0xcb, 0xde, 0xc5, 0x58, 0x04, 0xd5, 0xdc, 0xdd, 0xcc, 0xbd, 0x92, 0x91, 0x04, 0xf1, 0x6f, + 0x40, 0xb9, 0xef, 0x39, 0x8e, 0xe8, 0xab, 0x6f, 0xe4, 0xaf, 0x1e, 0x56, 0x12, 0x97, 0xbf, 0x0d, + 0x37, 0x7c, 0x31, 0xf2, 0xce, 0x84, 0xd5, 0x8c, 0xa0, 0x34, 0xce, 0x22, 0x7d, 0x66, 0xf1, 0x4b, + 0xde, 0x80, 0x8a, 0xaf, 0xfb, 0xb7, 0x67, 0xbb, 0xa7, 0x41, 0xb5, 0x40, 0xc3, 0xfa, 0xfc, 0x25, + 0xc3, 0x42, 0x1c, 0x63, 0x9a, 0x82, 0x33, 0xc8, 0x9c, 0x8a, 0x8b, 0x6a, 0xe9, 0x6e, 0xea, 0x5e, + 0xc9, 0xc0, 0x47, 0xfe, 0x3e, 0x54, 0x3d, 0xdf, 0x1e, 0xd8, 0xae, 0xe9, 0x34, 0x7d, 0x61, 0x4a, + 0x61, 0xf5, 0xec, 0x91, 0x08, 0xa4, 0x39, 0x1a, 0x57, 0xe1, 0x6e, 0xea, 0x5e, 0xc6, 0xb8, 0xf4, + 0x3d, 0x7f, 0x4b, 0xad, 0x50, 0xdb, 0x3d, 0xf1, 0xaa, 0x65, 0x3d, 0xfc, 0xe9, 0xbe, 0xec, 0xe8, + 0xd7, 0x46, 0x84, 0x58, 0xff, 0x45, 0x1a, 0xf2, 0x5d, 0x61, 0xfa, 0xfd, 0x61, 0xed, 0xd7, 0x52, + 0x90, 0x37, 0x44, 0x30, 0x71, 0x24, 0xaf, 0x41, 0x51, 0xcd, 0x6d, 0xdb, 0xaa, 0xa6, 0xa8, 0x77, + 0x51, 0xfb, 0xb3, 0xc8, 0xce, 0x26, 0x64, 0x47, 0x42, 0x9a, 0xd5, 0x0c, 0xcd, 0x50, 0x6d, 0xa6, + 0x57, 0xea, 0xf3, 0x9b, 0xfb, 0x42, 0x9a, 0x06, 0xe1, 0xd5, 0x7e, 0x9e, 0x82, 0x2c, 0x36, 0xf9, + 0x6d, 0x28, 0x0d, 0xed, 0xc1, 0xd0, 0xb1, 0x07, 0x43, 0xa9, 0x3b, 0x12, 0x03, 0xf8, 0x87, 0xb0, + 0x1e, 0x35, 0x0c, 0xd3, 0x1d, 0x08, 0xec, 0xd1, 0x22, 0xe1, 0xa7, 0x97, 0xc6, 0x2c, 0x32, 0xaf, + 0x42, 0x81, 0xf6, 0x43, 0xdb, 0x22, 0x89, 0x2e, 0x19, 0x61, 0x13, 0xc5, 0x2d, 0x5c, 0xa9, 0xc7, + 0xe2, 0xa2, 0x9a, 0xa5, 0xb7, 0x49, 0x10, 0x6f, 0xc0, 0x7a, 0xd8, 0xdc, 0xd6, 0xb3, 0x91, 0xbb, + 0x7a, 0x36, 0x66, 0xf1, 0xeb, 0x9f, 0xee, 0x41, 0x8e, 0xb6, 0x25, 0x5f, 0x83, 0xb4, 0x1d, 0x4e, + 0x74, 0xda, 0xb6, 0xf8, 0x03, 0xc8, 0x9f, 0xd8, 0xc2, 0xb1, 0x5e, 0x38, 0xc3, 0x1a, 0x8d, 0xb7, + 0x60, 0xd5, 0x17, 0x81, 0xf4, 0x6d, 0x2d, 0xfd, 0x6a, 0x83, 0x7e, 0x71, 0x91, 0x0e, 0xd8, 0x34, + 0x12, 0x88, 0xc6, 0x14, 0x19, 0x0e, 0xbb, 0x3f, 0xb4, 0x1d, 0xcb, 0x17, 0x6e, 0xdb, 0x52, 0xfb, + 0xb4, 0x64, 0x24, 0x41, 0xfc, 0x1e, 0xac, 0x1f, 0x9b, 0xfd, 0xd3, 0x81, 0xef, 0x4d, 0x5c, 0xdc, + 0x10, 0x9e, 0x4f, 0xc3, 0x2e, 0x19, 0xb3, 0x60, 0xfe, 0x06, 0xe4, 0x4c, 0xc7, 0x1e, 0xb8, 0xb4, + 0x13, 0xd7, 0xe6, 0x16, 0x5d, 0xf5, 0xa5, 0x81, 0x18, 0x86, 0x42, 0xe4, 0xbb, 0x50, 0x39, 0x13, + 0xbe, 0xb4, 0xfb, 0xa6, 0x43, 0xf0, 0x6a, 0x81, 0x28, 0xeb, 0x0b, 0x29, 0x9f, 0x26, 0x31, 0x8d, + 0x69, 0x42, 0xde, 0x06, 0x08, 0x50, 0x4d, 0xd2, 0x72, 0xea, 0xbd, 0xf0, 0xda, 0x42, 0x36, 0x4d, + 0xcf, 0x95, 0xc2, 0x95, 0x9b, 0xdd, 0x08, 0x7d, 0x77, 0xc5, 0x48, 0x10, 0xf3, 0x77, 0x21, 0x2b, + 0xc5, 0xb9, 0xac, 0xae, 0x5d, 0x31, 0xa3, 0x21, 0x93, 0x9e, 0x38, 0x97, 0xbb, 0x2b, 0x06, 0x11, + 0x20, 0x21, 0x6e, 0xb2, 0xea, 0xfa, 0x12, 0x84, 0xb8, 0x2f, 0x91, 0x10, 0x09, 0xf8, 0x07, 0x90, + 0x77, 0xcc, 0x0b, 0x6f, 0x22, 0xab, 0x8c, 0x48, 0xbf, 0x74, 0x25, 0xe9, 0x1e, 0xa1, 0xee, 0xae, + 0x18, 0x9a, 0x88, 0xbf, 0x0d, 0x19, 0xcb, 0x3e, 0xab, 0x6e, 0x10, 0xed, 0xdd, 0x2b, 0x69, 0xb7, + 0xed, 0xb3, 0xdd, 0x15, 0x03, 0xd1, 0x79, 0x13, 0x8a, 0xc7, 0x9e, 0x77, 0x3a, 0x32, 0xfd, 0xd3, + 0x2a, 0x27, 0xd2, 0x2f, 0x5f, 0x49, 0xba, 0xa5, 0x91, 0x77, 0x57, 0x8c, 0x88, 0x10, 0x87, 0x6c, + 0xf7, 0x3d, 0xb7, 0x7a, 0x6d, 0x89, 0x21, 0xb7, 0xfb, 0x9e, 0x8b, 0x43, 0x46, 0x02, 0x24, 0x74, + 0x6c, 0xf7, 0xb4, 0x7a, 0x7d, 0x09, 0x42, 0xd4, 0x9c, 0x48, 0x88, 0x04, 0xd8, 0x6d, 0xcb, 0x94, + 0xe6, 0x99, 0x2d, 0x9e, 0x57, 0x6f, 0x2c, 0xd1, 0xed, 0x6d, 0x8d, 0x8c, 0xdd, 0x0e, 0x09, 0x91, + 0x49, 0xb8, 0x35, 0xab, 0x37, 0x97, 0x60, 0x12, 0x6a, 0x74, 0x64, 0x12, 0x12, 0xf2, 0x3f, 0x0d, + 0x1b, 0x27, 0xc2, 0x94, 0x13, 0x5f, 0x58, 0xf1, 0x41, 0x77, 0x8b, 0xb8, 0x6d, 0x5e, 0xbd, 0xf6, + 0xb3, 0x54, 0xbb, 0x2b, 0xc6, 0x3c, 0x2b, 0xfe, 0x3e, 0xe4, 0x1c, 0x53, 0x8a, 0xf3, 0x6a, 0x95, + 0x78, 0xd6, 0x5f, 0x20, 0x14, 0x52, 0x9c, 0xef, 0xae, 0x18, 0x8a, 0x84, 0x7f, 0x0f, 0xd6, 0xa5, + 0x79, 0xec, 0x88, 0xce, 0x89, 0x46, 0x08, 0xaa, 0x9f, 0x23, 0x2e, 0xaf, 0x5f, 0x2d, 0xce, 0xd3, + 0x34, 0xbb, 0x2b, 0xc6, 0x2c, 0x1b, 0xec, 0x15, 0x81, 0xaa, 0xb5, 0x25, 0x7a, 0x45, 0xfc, 0xb0, + 0x57, 0x44, 0xc2, 0xf7, 0xa0, 0x4c, 0x0f, 0x4d, 0xcf, 0x99, 0x8c, 0xdc, 0xea, 0xe7, 0x89, 0xc3, + 0xbd, 0x17, 0x73, 0x50, 0xf8, 0xbb, 0x2b, 0x46, 0x92, 0x1c, 0x17, 0x91, 0x9a, 0x86, 0xf7, 0xbc, + 0x7a, 0x7b, 0x89, 0x45, 0xec, 0x69, 0x64, 0x5c, 0xc4, 0x90, 0x10, 0xb7, 0xde, 0x73, 0xdb, 0x1a, + 0x08, 0x59, 0xfd, 0xc2, 0x12, 0x5b, 0xef, 0x19, 0xa1, 0xe2, 0xd6, 0x53, 0x44, 0x28, 0xc6, 0xfd, + 0xa1, 0x29, 0xab, 0x77, 0x96, 0x10, 0xe3, 0xe6, 0xd0, 0x24, 0x5d, 0x81, 0x04, 0xb5, 0x1f, 0xc2, + 0x6a, 0x52, 0x2b, 0x73, 0x0e, 0x59, 0x5f, 0x98, 0xea, 0x44, 0x28, 0x1a, 0xf4, 0x8c, 0x30, 0x61, + 0xd9, 0x92, 0x4e, 0x84, 0xa2, 0x41, 0xcf, 0xfc, 0x26, 0xe4, 0x95, 0x6d, 0x42, 0x0a, 0xbf, 0x68, + 0xe8, 0x16, 0xe2, 0x5a, 0xbe, 0x39, 0xa0, 0x73, 0xab, 0x68, 0xd0, 0x33, 0xe2, 0x5a, 0xbe, 0x37, + 0xee, 0xb8, 0xa4, 0xb0, 0x8b, 0x86, 0x6e, 0xd5, 0xfe, 0xf5, 0x07, 0x50, 0xd0, 0x9d, 0xaa, 0xfd, + 0xdd, 0x14, 0xe4, 0x95, 0x42, 0xe1, 0xdf, 0x86, 0x5c, 0x20, 0x2f, 0x1c, 0x41, 0x7d, 0x58, 0x7b, + 0xf8, 0x95, 0x25, 0x94, 0xd0, 0x66, 0x17, 0x09, 0x0c, 0x45, 0x57, 0x37, 0x20, 0x47, 0x6d, 0x5e, + 0x80, 0x8c, 0xe1, 0x3d, 0x67, 0x2b, 0x1c, 0x20, 0xaf, 0x16, 0x8b, 0xa5, 0x10, 0xb8, 0x6d, 0x9f, + 0xb1, 0x34, 0x02, 0x77, 0x85, 0x69, 0x09, 0x9f, 0x65, 0x78, 0x05, 0x4a, 0xe1, 0xb2, 0x04, 0x2c, + 0xcb, 0x19, 0xac, 0x26, 0x16, 0x3c, 0x60, 0xb9, 0xda, 0xff, 0xca, 0x42, 0x16, 0xf7, 0x3f, 0x7f, + 0x05, 0x2a, 0xd2, 0xf4, 0x07, 0x42, 0x19, 0xc2, 0x91, 0x91, 0x32, 0x0d, 0xe4, 0x1f, 0x84, 0x63, + 0x48, 0xd3, 0x18, 0x5e, 0x7b, 0xa1, 0x5e, 0x99, 0x1a, 0x41, 0xe2, 0x14, 0xce, 0x2c, 0x77, 0x0a, + 0xef, 0x40, 0x11, 0xd5, 0x59, 0xd7, 0xfe, 0xa1, 0xa0, 0xa9, 0x5f, 0x7b, 0x78, 0xff, 0xc5, 0x9f, + 0x6c, 0x6b, 0x0a, 0x23, 0xa2, 0xe5, 0x6d, 0x28, 0xf5, 0x4d, 0xdf, 0xa2, 0xce, 0xd0, 0x6a, 0xad, + 0x3d, 0xfc, 0xea, 0x8b, 0x19, 0x35, 0x43, 0x12, 0x23, 0xa6, 0xe6, 0x1d, 0x28, 0x5b, 0x22, 0xe8, + 0xfb, 0xf6, 0x98, 0xd4, 0x9b, 0x3a, 0x8b, 0xbf, 0xf6, 0x62, 0x66, 0xdb, 0x31, 0x91, 0x91, 0xe4, + 0x80, 0x16, 0x99, 0x1f, 0xe9, 0xb7, 0x02, 0x19, 0x08, 0x31, 0xa0, 0xfe, 0x2e, 0x14, 0xc3, 0xf1, + 0xf0, 0x55, 0x28, 0xe2, 0xdf, 0x03, 0xcf, 0x15, 0x6c, 0x05, 0xd7, 0x16, 0x5b, 0xdd, 0x91, 0xe9, + 0x38, 0x2c, 0xc5, 0xd7, 0x00, 0xb0, 0xb9, 0x2f, 0x2c, 0x7b, 0x32, 0x62, 0xe9, 0xfa, 0x37, 0x43, + 0x69, 0x29, 0x42, 0xf6, 0xd0, 0x1c, 0x20, 0xc5, 0x2a, 0x14, 0x43, 0x75, 0xcd, 0x52, 0x48, 0xbf, + 0x6d, 0x06, 0xc3, 0x63, 0xcf, 0xf4, 0x2d, 0x96, 0xe6, 0x65, 0x28, 0x34, 0xfc, 0xfe, 0xd0, 0x3e, + 0x13, 0x2c, 0x53, 0x7f, 0x00, 0xe5, 0x44, 0x7f, 0x91, 0x85, 0xfe, 0x68, 0x09, 0x72, 0x0d, 0xcb, + 0x12, 0x16, 0x4b, 0x21, 0x81, 0x1e, 0x20, 0x4b, 0xd7, 0xbf, 0x0a, 0xa5, 0x68, 0xb6, 0x10, 0x1d, + 0x0f, 0x6e, 0xb6, 0x82, 0x4f, 0x08, 0x66, 0x29, 0x94, 0xca, 0xb6, 0xeb, 0xd8, 0xae, 0x60, 0xe9, + 0xda, 0x9f, 0x21, 0x51, 0xe5, 0xdf, 0x9a, 0xde, 0x10, 0xaf, 0xbe, 0xe8, 0x64, 0x9d, 0xde, 0x0d, + 0x9f, 0x4f, 0x8c, 0x6f, 0xcf, 0xa6, 0xce, 0x15, 0x21, 0xbb, 0xed, 0xc9, 0x80, 0xa5, 0x6a, 0xff, + 0x3d, 0x0d, 0xc5, 0xf0, 0x40, 0x45, 0x9f, 0x60, 0xe2, 0x3b, 0x5a, 0xa0, 0xf1, 0x91, 0x5f, 0x87, + 0x9c, 0xb4, 0xa5, 0x16, 0xe3, 0x92, 0xa1, 0x1a, 0x68, 0xab, 0x25, 0x57, 0x56, 0x19, 0xb0, 0xb3, + 0x4b, 0x65, 0x8f, 0xcc, 0x81, 0xd8, 0x35, 0x83, 0xa1, 0x36, 0x61, 0x63, 0x00, 0xd2, 0x9f, 0x98, + 0x67, 0x28, 0x73, 0xf4, 0x5e, 0x59, 0x71, 0x49, 0x10, 0x7f, 0x0b, 0xb2, 0x38, 0x40, 0x2d, 0x34, + 0x7f, 0x6a, 0x66, 0xc0, 0x28, 0x26, 0x87, 0xbe, 0xc0, 0xe5, 0xd9, 0x44, 0x0f, 0xcc, 0x20, 0x64, + 0xfe, 0x2a, 0xac, 0xa9, 0x4d, 0xd8, 0x09, 0xfd, 0x87, 0x02, 0x71, 0x9e, 0x81, 0xf2, 0x06, 0x4e, + 0xa7, 0x29, 0x45, 0xb5, 0xb8, 0x84, 0x7c, 0x87, 0x93, 0xb3, 0xd9, 0x45, 0x12, 0x43, 0x51, 0xd6, + 0xdf, 0xc1, 0x39, 0x35, 0xa5, 0xc0, 0x65, 0x6e, 0x8d, 0xc6, 0xf2, 0x42, 0x09, 0xcd, 0x8e, 0x90, + 0xfd, 0xa1, 0xed, 0x0e, 0x58, 0x4a, 0x4d, 0x31, 0x2e, 0x22, 0xa1, 0xf8, 0xbe, 0xe7, 0xb3, 0x4c, + 0xad, 0x06, 0x59, 0x94, 0x51, 0x54, 0x92, 0xae, 0x39, 0x12, 0x7a, 0xa6, 0xe9, 0xb9, 0x76, 0x0d, + 0x36, 0xe6, 0xce, 0xe3, 0xda, 0xef, 0xe6, 0x95, 0x84, 0x20, 0x05, 0xd9, 0x82, 0x9a, 0x82, 0xcc, + 0xbc, 0x97, 0xd2, 0x31, 0xc8, 0x65, 0x5a, 0xc7, 0x7c, 0x00, 0x39, 0x1c, 0x58, 0xa8, 0x62, 0x96, + 0x20, 0xdf, 0x47, 0x74, 0x43, 0x51, 0xa1, 0x07, 0xd3, 0x1f, 0x8a, 0xfe, 0xa9, 0xb0, 0xb4, 0xae, + 0x0f, 0x9b, 0x28, 0x34, 0xfd, 0x84, 0x79, 0xae, 0x1a, 0x24, 0x12, 0x7d, 0xcf, 0x6d, 0x8d, 0xbc, + 0xef, 0xdb, 0xb4, 0xae, 0x28, 0x12, 0x21, 0x20, 0x7c, 0xdb, 0x46, 0x19, 0xd1, 0xcb, 0x16, 0x03, + 0x6a, 0x2d, 0xc8, 0xd1, 0xb7, 0x71, 0x27, 0xa8, 0x3e, 0xab, 0x48, 0xc3, 0xab, 0xcb, 0xf5, 0x59, + 0x77, 0xb9, 0xf6, 0x3b, 0x69, 0xc8, 0x62, 0x9b, 0xdf, 0x87, 0x9c, 0x8f, 0x7e, 0x18, 0x4d, 0xe7, + 0x65, 0x3e, 0x9b, 0x42, 0xe1, 0xdf, 0xd6, 0xa2, 0x98, 0x5e, 0x42, 0x58, 0xa2, 0x2f, 0x26, 0xc5, + 0xf2, 0x3a, 0xe4, 0xc6, 0xa6, 0x6f, 0x8e, 0xf4, 0x3e, 0x51, 0x8d, 0xfa, 0x8f, 0x53, 0x90, 0x45, + 0x24, 0xbe, 0x01, 0x95, 0xae, 0xf4, 0xed, 0x53, 0x21, 0x87, 0xbe, 0x37, 0x19, 0x0c, 0x95, 0x24, + 0x3d, 0x16, 0x17, 0x4a, 0xdf, 0x28, 0x85, 0x20, 0x4d, 0xc7, 0xee, 0xb3, 0x34, 0x4a, 0xd5, 0x96, + 0xe7, 0x58, 0x2c, 0xc3, 0xd7, 0xa1, 0xfc, 0xc4, 0xb5, 0x84, 0x1f, 0xf4, 0x3d, 0x5f, 0x58, 0x2c, + 0xab, 0x77, 0xf7, 0x29, 0xcb, 0xd1, 0x59, 0x26, 0xce, 0x25, 0xf9, 0x42, 0x2c, 0xcf, 0xaf, 0xc1, + 0xfa, 0xd6, 0xb4, 0x83, 0xc4, 0x0a, 0xa8, 0x93, 0xf6, 0x85, 0x8b, 0x42, 0xc6, 0x8a, 0x4a, 0x88, + 0xbd, 0xef, 0xdb, 0xac, 0x84, 0x1f, 0x53, 0xfb, 0x84, 0x41, 0xfd, 0x5f, 0xa4, 0x42, 0xcd, 0x51, + 0x81, 0xd2, 0xa1, 0xe9, 0x9b, 0x03, 0xdf, 0x1c, 0x63, 0xff, 0xca, 0x50, 0x50, 0x07, 0xe7, 0x9b, + 0x4a, 0xbb, 0xa9, 0xc6, 0x43, 0xa5, 0x1b, 0x55, 0xe3, 0x2d, 0x96, 0x89, 0x1b, 0x6f, 0xb3, 0x2c, + 0x7e, 0xe3, 0xbb, 0x13, 0x4f, 0x0a, 0x96, 0x23, 0x5d, 0xe7, 0x59, 0x82, 0xe5, 0x11, 0xd8, 0x43, + 0x8d, 0xc2, 0x0a, 0x38, 0xe6, 0x26, 0xca, 0xcf, 0xb1, 0x77, 0xce, 0x8a, 0xd8, 0x0d, 0x9c, 0x46, + 0x61, 0xb1, 0x12, 0xbe, 0x39, 0x98, 0x8c, 0x8e, 0x05, 0x0e, 0x13, 0xf0, 0x4d, 0xcf, 0x1b, 0x0c, + 0x1c, 0xc1, 0xca, 0x38, 0x07, 0x09, 0xe5, 0xcb, 0x56, 0x49, 0xd3, 0x9a, 0x8e, 0xe3, 0x4d, 0x24, + 0xab, 0xd4, 0x7e, 0x91, 0x81, 0x2c, 0x7a, 0x37, 0xb8, 0x77, 0x86, 0xa8, 0x67, 0xf4, 0xde, 0xc1, + 0xe7, 0x68, 0x07, 0xa6, 0xe3, 0x1d, 0xc8, 0xdf, 0xd7, 0x2b, 0x9d, 0x59, 0x42, 0xcb, 0x22, 0xe3, + 0xe4, 0x22, 0x73, 0xc8, 0x8e, 0xec, 0x91, 0xd0, 0xba, 0x8e, 0x9e, 0x11, 0x16, 0xe0, 0x79, 0x9c, + 0xa3, 0xe0, 0x09, 0x3d, 0xe3, 0xae, 0x31, 0xf1, 0x58, 0x68, 0x48, 0xda, 0x03, 0x19, 0x23, 0x6c, + 0x2e, 0xd0, 0x5e, 0xa5, 0x85, 0xda, 0xeb, 0x83, 0x50, 0x7b, 0x15, 0x96, 0xd8, 0xf5, 0xd4, 0xcd, + 0xa4, 0xe6, 0x8a, 0x95, 0x46, 0x71, 0x79, 0xf2, 0xc4, 0x61, 0xb2, 0xad, 0xa5, 0x36, 0x3e, 0xe8, + 0x8a, 0x6a, 0x96, 0x59, 0x0a, 0x57, 0x93, 0xb6, 0xab, 0xd2, 0x79, 0x4f, 0x6d, 0x4b, 0x78, 0x2c, + 0x43, 0x07, 0xe1, 0xc4, 0xb2, 0x3d, 0x96, 0x45, 0xcb, 0xeb, 0x70, 0x7b, 0x87, 0xe5, 0xea, 0xaf, + 0x26, 0x8e, 0xa4, 0xc6, 0x44, 0x7a, 0x8a, 0x0d, 0x89, 0x6f, 0x4a, 0x49, 0xe3, 0xb1, 0xb0, 0x58, + 0xba, 0xfe, 0xf5, 0x05, 0x6a, 0xb6, 0x02, 0xa5, 0x27, 0x63, 0xc7, 0x33, 0xad, 0x2b, 0xf4, 0xec, + 0x2a, 0x40, 0xec, 0x55, 0xd7, 0x7e, 0x51, 0x8f, 0x8f, 0x73, 0xb4, 0x45, 0x03, 0x6f, 0xe2, 0xf7, + 0x05, 0xa9, 0x90, 0x92, 0xa1, 0x5b, 0xfc, 0x3b, 0x90, 0xc3, 0xf7, 0x61, 0x18, 0xe7, 0xfe, 0x52, + 0xbe, 0xdc, 0xe6, 0x53, 0x5b, 0x3c, 0x37, 0x14, 0x21, 0xbf, 0x03, 0x60, 0xf6, 0xa5, 0x7d, 0x26, + 0x10, 0xa8, 0x37, 0x7b, 0x02, 0xc2, 0xdf, 0x49, 0x9a, 0x2f, 0x57, 0xc7, 0x21, 0x13, 0x76, 0x0d, + 0x37, 0xa0, 0x8c, 0x5b, 0x77, 0xdc, 0xf1, 0x71, 0xb7, 0x57, 0x57, 0x89, 0xf0, 0x8d, 0xe5, 0xba, + 0xf7, 0x28, 0x22, 0x34, 0x92, 0x4c, 0xf8, 0x13, 0x58, 0x55, 0x31, 0x35, 0xcd, 0xb4, 0x42, 0x4c, + 0xdf, 0x5c, 0x8e, 0x69, 0x27, 0xa6, 0x34, 0xa6, 0xd8, 0xcc, 0x87, 0x25, 0x73, 0x2f, 0x1d, 0x96, + 0x7c, 0x15, 0xd6, 0x7a, 0xd3, 0xbb, 0x40, 0x1d, 0x15, 0x33, 0x50, 0x5e, 0x87, 0x55, 0x3b, 0x88, + 0xa3, 0xa2, 0x14, 0x23, 0x29, 0x1a, 0x53, 0xb0, 0xda, 0x7f, 0xc8, 0x43, 0x96, 0x66, 0x7e, 0x36, + 0xc6, 0xd5, 0x9c, 0x52, 0xe9, 0x0f, 0x96, 0x5f, 0xea, 0x99, 0x1d, 0x4f, 0x1a, 0x24, 0x93, 0xd0, + 0x20, 0xdf, 0x81, 0x5c, 0xe0, 0xf9, 0x32, 0x5c, 0xde, 0x25, 0x85, 0xa8, 0xeb, 0xf9, 0xd2, 0x50, + 0x84, 0x7c, 0x07, 0x0a, 0x27, 0xb6, 0x23, 0x71, 0x51, 0xd4, 0xe4, 0xbd, 0xbe, 0x1c, 0x8f, 0x1d, + 0x22, 0x32, 0x42, 0x62, 0xbe, 0x97, 0x14, 0xb6, 0x3c, 0x71, 0xda, 0x5c, 0x8e, 0xd3, 0x22, 0x19, + 0xbc, 0x0f, 0xac, 0xef, 0x9d, 0x09, 0xdf, 0x48, 0x04, 0x26, 0xd5, 0x21, 0x3d, 0x07, 0xe7, 0x35, + 0x28, 0x0e, 0x6d, 0x4b, 0xa0, 0x9d, 0x43, 0x3a, 0xa6, 0x68, 0x44, 0x6d, 0xfe, 0x18, 0x8a, 0xe4, + 0x1f, 0xa0, 0x56, 0x2c, 0xbd, 0xf4, 0xe4, 0x2b, 0x57, 0x25, 0x64, 0x80, 0x1f, 0xa2, 0x8f, 0xef, + 0xd8, 0x92, 0xe2, 0xd3, 0x45, 0x23, 0x6a, 0x63, 0x87, 0x49, 0xde, 0x93, 0x1d, 0x2e, 0xab, 0x0e, + 0xcf, 0xc2, 0xf9, 0xdb, 0x70, 0x83, 0x60, 0x33, 0x87, 0x24, 0x6e, 0x35, 0x64, 0xba, 0xf8, 0x25, + 0x1a, 0x2c, 0x63, 0x73, 0x20, 0xf6, 0xec, 0x91, 0x2d, 0xab, 0x95, 0xbb, 0xa9, 0x7b, 0x39, 0x23, + 0x06, 0xf0, 0xd7, 0x61, 0xc3, 0x12, 0x27, 0xe6, 0xc4, 0x91, 0x3d, 0x31, 0x1a, 0x3b, 0xa6, 0x14, + 0x6d, 0x8b, 0x64, 0xb4, 0x64, 0xcc, 0xbf, 0xe0, 0x6f, 0xc0, 0x35, 0x0d, 0xec, 0x44, 0xb7, 0x0a, + 0x6d, 0x8b, 0xc2, 0x77, 0x25, 0x63, 0xd1, 0xab, 0xfa, 0xbe, 0x56, 0xc3, 0x78, 0x80, 0xa2, 0x9f, + 0x1a, 0x2a, 0xd0, 0x40, 0xaa, 0x13, 0xf9, 0x91, 0xe9, 0x38, 0xc2, 0xbf, 0x50, 0x4e, 0xee, 0x63, + 0xd3, 0x3d, 0x36, 0x5d, 0x96, 0xa1, 0x33, 0xd6, 0x74, 0x84, 0x6b, 0x99, 0xbe, 0x3a, 0x91, 0x1f, + 0xd1, 0x81, 0x9e, 0xab, 0xdf, 0x83, 0x2c, 0x4d, 0x69, 0x09, 0x72, 0xca, 0x4b, 0x22, 0x8f, 0x59, + 0x7b, 0x48, 0xa4, 0x91, 0xf7, 0x70, 0xfb, 0xb1, 0x74, 0xed, 0xef, 0xe5, 0xa1, 0x18, 0x4e, 0x5e, + 0x78, 0x87, 0x90, 0x8a, 0xef, 0x10, 0xd0, 0x8c, 0x0b, 0x9e, 0xda, 0x81, 0x7d, 0xac, 0xcd, 0xd2, + 0xa2, 0x11, 0x03, 0xd0, 0x12, 0x7a, 0x6e, 0x5b, 0x72, 0x48, 0x7b, 0x26, 0x67, 0xa8, 0x06, 0xbf, + 0x07, 0xeb, 0x16, 0xce, 0x83, 0xdb, 0x77, 0x26, 0x96, 0xe8, 0xe1, 0x29, 0xaa, 0xc2, 0x04, 0xb3, + 0x60, 0xfe, 0x31, 0x80, 0xb4, 0x47, 0x62, 0xc7, 0xf3, 0x47, 0xa6, 0xd4, 0xbe, 0xc1, 0x37, 0x5e, + 0x4e, 0xaa, 0x37, 0x7b, 0x11, 0x03, 0x23, 0xc1, 0x0c, 0x59, 0xe3, 0xd7, 0x34, 0xeb, 0xc2, 0x67, + 0x62, 0xbd, 0x1d, 0x31, 0x30, 0x12, 0xcc, 0x78, 0x0f, 0x0a, 0x27, 0x9e, 0x3f, 0x9a, 0x38, 0xa6, + 0x3e, 0x73, 0xdf, 0x7f, 0x49, 0xbe, 0x3b, 0x8a, 0x9a, 0x74, 0x4f, 0xc8, 0x2a, 0x8e, 0x71, 0x97, + 0x96, 0x8c, 0x71, 0xd7, 0x7f, 0x09, 0x20, 0xee, 0x21, 0xbf, 0x09, 0x7c, 0xdf, 0x73, 0xe5, 0xb0, + 0x71, 0x7c, 0xec, 0x6f, 0x89, 0x13, 0xcf, 0x17, 0xdb, 0x26, 0x1e, 0xaf, 0x37, 0x60, 0x23, 0x82, + 0x37, 0x4e, 0xa4, 0xf0, 0x11, 0x4c, 0x22, 0xd0, 0x1d, 0x7a, 0xbe, 0x54, 0x36, 0x1e, 0x3d, 0x3e, + 0xe9, 0xb2, 0x0c, 0x1e, 0xe9, 0xed, 0x6e, 0x87, 0x65, 0xeb, 0xf7, 0x00, 0xe2, 0xa9, 0x25, 0x5f, + 0x88, 0x9e, 0xde, 0x7c, 0xa8, 0x3d, 0x23, 0x6a, 0x3d, 0x7c, 0x9b, 0xa5, 0xea, 0x9f, 0xa6, 0xa0, + 0x9c, 0x18, 0xd2, 0xb4, 0xcf, 0xdc, 0xf4, 0x26, 0xae, 0x54, 0x4e, 0x3a, 0x3d, 0x3e, 0x35, 0x9d, + 0x09, 0x1e, 0xee, 0x1b, 0x50, 0xa1, 0xf6, 0xb6, 0x1d, 0x48, 0xdb, 0xed, 0x4b, 0x96, 0x89, 0x50, + 0x94, 0x61, 0x90, 0x8d, 0x50, 0x0e, 0x3c, 0x0d, 0xca, 0x71, 0x06, 0xab, 0x87, 0xc2, 0xef, 0x8b, + 0x10, 0x89, 0x8c, 0x61, 0x0d, 0x89, 0xd0, 0x94, 0x31, 0x6c, 0xca, 0x61, 0x77, 0x32, 0x62, 0x45, + 0x34, 0x2a, 0xb1, 0xd1, 0x38, 0x13, 0x3e, 0xda, 0x32, 0x25, 0xfc, 0x0e, 0x02, 0x70, 0x37, 0x98, + 0x2e, 0x83, 0x10, 0x7b, 0xdf, 0x76, 0x59, 0x39, 0x6a, 0x98, 0xe7, 0x6c, 0x15, 0xfb, 0x4f, 0xae, + 0x03, 0xab, 0xd4, 0xfe, 0x5b, 0x06, 0xb2, 0xa8, 0xd7, 0xd1, 0xd7, 0x4d, 0x2a, 0x21, 0xb5, 0x57, + 0x92, 0xa0, 0xcf, 0x76, 0x1a, 0x21, 0xef, 0xe4, 0x69, 0xf4, 0x1e, 0x94, 0xfb, 0x93, 0x40, 0x7a, + 0x23, 0x3a, 0x8a, 0xf5, 0x6d, 0xd7, 0xcd, 0xb9, 0xa8, 0x11, 0x4d, 0xa7, 0x91, 0x44, 0xe5, 0xef, + 0x40, 0xfe, 0x44, 0x49, 0xbd, 0x8a, 0x1b, 0x7d, 0xe1, 0x92, 0xd3, 0x5a, 0x4b, 0xb6, 0x46, 0xc6, + 0x71, 0xd9, 0x73, 0x3b, 0x36, 0x09, 0xd2, 0xa7, 0x6e, 0x3e, 0x3a, 0x75, 0x7f, 0x09, 0xd6, 0x04, + 0x4e, 0xf8, 0xa1, 0x63, 0xf6, 0xc5, 0x48, 0xb8, 0xe1, 0x36, 0x7b, 0xfb, 0x25, 0x46, 0x4c, 0x2b, + 0x46, 0xc3, 0x9e, 0xe1, 0x85, 0x9a, 0xc7, 0xf5, 0xf0, 0xf0, 0x0f, 0x1d, 0xfb, 0xa2, 0x11, 0x03, + 0xea, 0x5f, 0xd6, 0xfa, 0xb2, 0x00, 0x99, 0x46, 0xd0, 0xd7, 0x11, 0x10, 0x11, 0xf4, 0x95, 0x7b, + 0xd5, 0xa4, 0xe9, 0x60, 0xe9, 0xfa, 0x9b, 0x50, 0x8a, 0xbe, 0x80, 0xc2, 0x73, 0xe0, 0xc9, 0xee, + 0x58, 0xf4, 0xed, 0x13, 0x5b, 0x58, 0x4a, 0x3e, 0xbb, 0xd2, 0xf4, 0xa5, 0x0a, 0x22, 0xb6, 0x5c, + 0x8b, 0xa5, 0x6b, 0xbf, 0x5d, 0x84, 0xbc, 0x3a, 0x7c, 0xf5, 0x80, 0x4b, 0xd1, 0x80, 0xbf, 0x0b, + 0x45, 0x6f, 0x2c, 0x7c, 0x53, 0x7a, 0xbe, 0x8e, 0xdc, 0xbc, 0xf3, 0x32, 0x87, 0xf9, 0x66, 0x47, + 0x13, 0x1b, 0x11, 0x9b, 0x59, 0x69, 0x4a, 0xcf, 0x4b, 0xd3, 0x7d, 0x60, 0xe1, 0xb9, 0x7d, 0xe8, + 0x23, 0x9d, 0xbc, 0xd0, 0x7e, 0xf8, 0x1c, 0x9c, 0xf7, 0xa0, 0xd4, 0xf7, 0x5c, 0xcb, 0x8e, 0xa2, + 0x38, 0x6b, 0x0f, 0xbf, 0xfe, 0x52, 0x3d, 0x6c, 0x86, 0xd4, 0x46, 0xcc, 0x88, 0xbf, 0x0e, 0xb9, + 0x33, 0x14, 0x33, 0x92, 0xa7, 0xcb, 0x85, 0x50, 0x21, 0xf1, 0x4f, 0xa0, 0xfc, 0x83, 0x89, 0xdd, + 0x3f, 0xed, 0x24, 0xa3, 0x84, 0xef, 0xbd, 0x54, 0x2f, 0xbe, 0x1b, 0xd3, 0x1b, 0x49, 0x66, 0x09, + 0xd1, 0x2e, 0xfc, 0x11, 0x44, 0xbb, 0x38, 0x2f, 0xda, 0x06, 0x54, 0x5c, 0x11, 0x48, 0x61, 0xed, + 0x68, 0x5b, 0x0d, 0x3e, 0x83, 0xad, 0x36, 0xcd, 0xa2, 0xfe, 0x25, 0x28, 0x86, 0x0b, 0xce, 0xf3, + 0x90, 0x3e, 0x40, 0xa7, 0x28, 0x0f, 0xe9, 0x8e, 0xaf, 0xa4, 0xad, 0x81, 0xd2, 0x56, 0xff, 0x83, + 0x14, 0x94, 0xa2, 0x49, 0x9f, 0xd6, 0x9c, 0xad, 0x1f, 0x4c, 0x4c, 0x87, 0xa5, 0xc8, 0x5d, 0xf6, + 0xa4, 0x6a, 0x91, 0xb2, 0x7e, 0x44, 0x97, 0xf5, 0x3e, 0xcb, 0x90, 0x89, 0x20, 0x82, 0x80, 0x65, + 0x39, 0x87, 0x35, 0x0d, 0xee, 0xf8, 0x0a, 0x35, 0x87, 0x8a, 0x0f, 0xdf, 0x86, 0x80, 0xbc, 0xb2, + 0x28, 0x4e, 0x85, 0x52, 0x90, 0x07, 0x9e, 0xa4, 0x46, 0x11, 0x3b, 0xd5, 0x76, 0x59, 0x09, 0xbf, + 0x79, 0xe0, 0xc9, 0x36, 0xaa, 0xc4, 0xc8, 0x3d, 0x2b, 0x87, 0x9f, 0xa7, 0x16, 0x69, 0xc4, 0x86, + 0xe3, 0xb4, 0x5d, 0x56, 0xd1, 0x2f, 0x54, 0x6b, 0x0d, 0x39, 0xb6, 0xce, 0xcd, 0x3e, 0x92, 0xaf, + 0xa3, 0x86, 0x45, 0x1a, 0xdd, 0x66, 0xb8, 0x25, 0x5b, 0xe7, 0x76, 0x20, 0x03, 0xb6, 0x51, 0xff, + 0x77, 0x29, 0x28, 0x27, 0x16, 0x18, 0xdd, 0x3f, 0x42, 0xc4, 0xa3, 0x4c, 0x79, 0x83, 0x1f, 0xe3, + 0x34, 0xfa, 0x56, 0x78, 0x4c, 0xf5, 0x3c, 0x7c, 0x4c, 0xe3, 0xf7, 0x7a, 0xde, 0xc8, 0xf3, 0x7d, + 0xef, 0xb9, 0x32, 0x7d, 0xf6, 0xcc, 0x40, 0x3e, 0x13, 0xe2, 0x94, 0x65, 0x71, 0xa8, 0xcd, 0x89, + 0xef, 0x0b, 0x57, 0x01, 0x72, 0xd4, 0x39, 0x71, 0xae, 0x5a, 0x79, 0x64, 0x8a, 0xc8, 0x74, 0x0e, + 0xb2, 0x02, 0x2a, 0x02, 0x8d, 0xad, 0x20, 0x45, 0x44, 0x40, 0x74, 0xd5, 0x2c, 0xe1, 0xa1, 0xa2, + 0x22, 0x14, 0x9d, 0x93, 0x6d, 0xf3, 0x22, 0x68, 0x0c, 0x3c, 0x06, 0xb3, 0xc0, 0x03, 0xef, 0x39, + 0x2b, 0xd7, 0x26, 0x00, 0xb1, 0x4f, 0x86, 0xbe, 0x28, 0x0a, 0x44, 0x74, 0x87, 0xa0, 0x5b, 0xbc, + 0x03, 0x80, 0x4f, 0x84, 0x19, 0x3a, 0xa4, 0x2f, 0x61, 0x28, 0x13, 0x9d, 0x91, 0x60, 0x51, 0xfb, + 0x73, 0x50, 0x8a, 0x5e, 0xf0, 0x2a, 0x14, 0xc8, 0xa4, 0x8d, 0x3e, 0x1b, 0x36, 0xd1, 0x3e, 0xb3, + 0x5d, 0x4b, 0x9c, 0x93, 0x5e, 0xc9, 0x19, 0xaa, 0x81, 0xbd, 0x1c, 0xda, 0x96, 0x25, 0xdc, 0xf0, + 0xa6, 0x47, 0xb5, 0x16, 0xdd, 0xc7, 0x67, 0x17, 0xde, 0xc7, 0xd7, 0x7e, 0x19, 0xca, 0x09, 0xa7, + 0xf1, 0xd2, 0x61, 0x27, 0x3a, 0x96, 0x9e, 0xee, 0xd8, 0x6d, 0x28, 0x85, 0x39, 0x20, 0x01, 0x9d, + 0x6d, 0x25, 0x23, 0x06, 0xd4, 0xfe, 0x49, 0x1a, 0x2d, 0x59, 0x1c, 0xda, 0xac, 0xa3, 0xb7, 0x03, + 0xf9, 0x40, 0x9a, 0x72, 0x12, 0x26, 0x33, 0x2c, 0xb9, 0x41, 0xbb, 0x44, 0xb3, 0xbb, 0x62, 0x68, + 0x6a, 0xfe, 0x01, 0x64, 0xa4, 0x39, 0xd0, 0x81, 0xd2, 0xaf, 0x2c, 0xc7, 0xa4, 0x67, 0x0e, 0x76, + 0x57, 0x0c, 0xa4, 0xe3, 0x7b, 0x50, 0xec, 0xeb, 0xd8, 0x96, 0x56, 0x8a, 0x4b, 0xfa, 0x62, 0x61, + 0x44, 0x6c, 0x77, 0xc5, 0x88, 0x38, 0xf0, 0xef, 0x40, 0x16, 0xad, 0x4b, 0x9d, 0xf3, 0xb1, 0xa4, + 0x8f, 0x89, 0xdb, 0x65, 0x77, 0xc5, 0x20, 0xca, 0xad, 0x02, 0xe4, 0x48, 0x07, 0xd7, 0xaa, 0x90, + 0x57, 0x63, 0x9d, 0x9d, 0xb9, 0xda, 0x2d, 0xc8, 0xf4, 0xcc, 0x01, 0x5a, 0xf8, 0xb6, 0x15, 0xe8, + 0x50, 0x09, 0x3e, 0xd6, 0x5e, 0x89, 0xe3, 0x74, 0xc9, 0x10, 0x70, 0x6a, 0x2a, 0x04, 0x5c, 0xcb, + 0x43, 0x16, 0xbf, 0x58, 0xbb, 0x7d, 0x95, 0xb7, 0x50, 0xfb, 0x07, 0x19, 0x74, 0x2c, 0xa4, 0x38, + 0x5f, 0x18, 0xde, 0xfe, 0x08, 0x4a, 0x63, 0xdf, 0xeb, 0x8b, 0x20, 0xf0, 0x7c, 0x6d, 0x1c, 0xbd, + 0xfe, 0xe2, 0xab, 0xe7, 0xcd, 0xc3, 0x90, 0xc6, 0x88, 0xc9, 0xeb, 0xff, 0x32, 0x0d, 0xa5, 0xe8, + 0x85, 0xf2, 0x67, 0xa4, 0x38, 0x57, 0xa1, 0xcc, 0x7d, 0xe1, 0x8f, 0x4c, 0xdb, 0x52, 0xda, 0xa3, + 0x39, 0x34, 0x43, 0x23, 0xf7, 0x63, 0x6f, 0x22, 0x27, 0xc7, 0x42, 0x85, 0xb0, 0x9e, 0xda, 0x23, + 0xe1, 0xb1, 0x2c, 0x5d, 0x1e, 0xa1, 0x60, 0xf7, 0x1d, 0x6f, 0x62, 0xb1, 0x1c, 0xb6, 0x1f, 0xd1, + 0xf1, 0xb6, 0x6f, 0x8e, 0x03, 0xa5, 0x33, 0xf7, 0x6d, 0xdf, 0x63, 0x05, 0x24, 0xda, 0xb1, 0x07, + 0x23, 0x93, 0x15, 0x91, 0x59, 0xef, 0xb9, 0x2d, 0x51, 0x09, 0x97, 0xd0, 0x4c, 0xed, 0x8c, 0x85, + 0xdb, 0x95, 0xbe, 0x10, 0x72, 0xdf, 0x1c, 0xab, 0x98, 0xa6, 0x21, 0x2c, 0xcb, 0x96, 0x4a, 0x7f, + 0xee, 0x98, 0x7d, 0x71, 0xec, 0x79, 0xa7, 0x6c, 0x15, 0x15, 0x4d, 0xdb, 0x0d, 0xa4, 0x39, 0xf0, + 0xcd, 0x91, 0xd2, 0xa1, 0x3d, 0xe1, 0x08, 0x6a, 0xad, 0xd1, 0xb7, 0x6d, 0x39, 0x9c, 0x1c, 0x3f, + 0x42, 0xbf, 0x6f, 0x5d, 0xdd, 0x33, 0x59, 0x62, 0x2c, 0x50, 0x87, 0xae, 0x42, 0x71, 0xcb, 0x76, + 0xec, 0x63, 0xdb, 0xb1, 0xd9, 0x06, 0xa2, 0xb6, 0xce, 0xfb, 0xa6, 0x63, 0x5b, 0xbe, 0xf9, 0x9c, + 0x71, 0xec, 0xdc, 0x63, 0xdf, 0x3b, 0xb5, 0xd9, 0x35, 0x44, 0x24, 0x37, 0xf0, 0xcc, 0xfe, 0x21, + 0xbb, 0x4e, 0x77, 0x65, 0xa7, 0x42, 0xf6, 0x87, 0x27, 0xe6, 0x31, 0xbb, 0x11, 0x87, 0xf4, 0x6e, + 0xd6, 0x36, 0x60, 0x7d, 0xe6, 0x56, 0xbe, 0x56, 0xd0, 0xde, 0x67, 0xad, 0x02, 0xe5, 0xc4, 0x75, + 0x69, 0xed, 0x55, 0x28, 0x86, 0x97, 0xa9, 0xe8, 0xa5, 0xdb, 0x81, 0x0a, 0x03, 0x6b, 0x21, 0x89, + 0xda, 0xb5, 0xdf, 0x4b, 0x41, 0x5e, 0xdd, 0x64, 0xf3, 0xad, 0x28, 0xf3, 0x24, 0xb5, 0xc4, 0xed, + 0xa5, 0x22, 0xd2, 0x77, 0xbf, 0x51, 0xfa, 0xc9, 0x75, 0xc8, 0x39, 0xe4, 0x8e, 0x6b, 0xf5, 0x45, + 0x8d, 0x84, 0xb6, 0xc9, 0x24, 0xb5, 0x4d, 0xbd, 0x11, 0xdd, 0x37, 0x87, 0xa1, 0x47, 0xb2, 0x0a, + 0x7b, 0xbe, 0x10, 0x2a, 0xac, 0x48, 0xde, 0x74, 0x9a, 0xce, 0x0a, 0x6f, 0x34, 0x36, 0xfb, 0x92, + 0x00, 0x74, 0x8a, 0xa2, 0x32, 0x65, 0x59, 0x94, 0xf2, 0xe6, 0xd0, 0x94, 0xf5, 0x13, 0x28, 0x1e, + 0x7a, 0xc1, 0xec, 0x99, 0x5c, 0x80, 0x4c, 0xcf, 0x1b, 0x2b, 0x0b, 0x73, 0xcb, 0x93, 0x64, 0x61, + 0xaa, 0x23, 0xf8, 0x44, 0x2a, 0xa1, 0x32, 0xec, 0xc1, 0x50, 0x2a, 0x4f, 0xbc, 0xed, 0xba, 0xc2, + 0x67, 0x39, 0x5c, 0x43, 0x43, 0x8c, 0xd1, 0xaa, 0x65, 0x79, 0x5c, 0x35, 0x82, 0xef, 0xd8, 0x7e, + 0x20, 0x59, 0xa1, 0xde, 0xc6, 0xd3, 0xd4, 0x1e, 0xd0, 0x21, 0x48, 0x0f, 0xc4, 0x6a, 0x05, 0xbb, + 0x48, 0xcd, 0xa6, 0x70, 0x51, 0xc6, 0xc8, 0x7b, 0x52, 0xae, 0x1f, 0x7d, 0x20, 0x8d, 0x27, 0x18, + 0xb5, 0x3f, 0x9a, 0x04, 0xd2, 0x3e, 0xb9, 0x60, 0x99, 0xfa, 0x33, 0xa8, 0x4c, 0xa5, 0x31, 0xf1, + 0xeb, 0xc0, 0xa6, 0x00, 0xd8, 0xf5, 0x15, 0x7e, 0x0b, 0xae, 0x4d, 0x41, 0xf7, 0x6d, 0xcb, 0xa2, + 0x58, 0xef, 0xec, 0x8b, 0x70, 0x80, 0x5b, 0x25, 0x28, 0xf4, 0xd5, 0x2a, 0xd5, 0x0f, 0xa1, 0x42, + 0xcb, 0xb6, 0x2f, 0xa4, 0xd9, 0x71, 0x9d, 0x8b, 0x3f, 0x72, 0xae, 0x59, 0xfd, 0xab, 0xda, 0xc1, + 0x42, 0x7d, 0x71, 0xe2, 0x7b, 0x23, 0xe2, 0x95, 0x33, 0xe8, 0x19, 0xb9, 0x4b, 0x4f, 0xaf, 0x7d, + 0x5a, 0x7a, 0xf5, 0x7f, 0x5f, 0x82, 0x42, 0xa3, 0xdf, 0x47, 0x97, 0x70, 0xee, 0xcb, 0xef, 0x40, + 0xbe, 0xef, 0xb9, 0x27, 0xf6, 0x40, 0xeb, 0xe3, 0x59, 0xcb, 0x50, 0xd3, 0xa1, 0xc0, 0x9d, 0xd8, + 0x03, 0x43, 0x23, 0x23, 0x99, 0x3e, 0x4f, 0x72, 0x57, 0x92, 0x29, 0xa5, 0x1a, 0x1d, 0x1f, 0x0f, + 0x20, 0x6b, 0xbb, 0x27, 0x9e, 0x4e, 0x0c, 0xfd, 0xfc, 0x25, 0x44, 0x94, 0x1d, 0x49, 0x88, 0xb5, + 0xff, 0x92, 0x82, 0xbc, 0xfa, 0x34, 0x7f, 0x15, 0xd6, 0x84, 0x8b, 0x9b, 0x29, 0x54, 0xe5, 0x7a, + 0x17, 0xcd, 0x40, 0xd1, 0x68, 0xd5, 0x10, 0x71, 0x3c, 0x19, 0xe8, 0xd8, 0x4b, 0x12, 0xc4, 0xdf, + 0x83, 0x5b, 0xaa, 0x79, 0xe8, 0x0b, 0x5f, 0x38, 0xc2, 0x0c, 0x44, 0x73, 0x68, 0xba, 0xae, 0x70, + 0xf4, 0xc1, 0x7e, 0xd9, 0x6b, 0x5e, 0x87, 0x55, 0xf5, 0xaa, 0x3b, 0x36, 0xfb, 0x22, 0xd0, 0xf7, + 0x7d, 0x53, 0x30, 0xfe, 0x35, 0xc8, 0x51, 0xde, 0x6c, 0xd5, 0xba, 0x7a, 0x29, 0x15, 0x56, 0xcd, + 0x8b, 0x4e, 0x9e, 0x06, 0x80, 0x9a, 0x26, 0x74, 0xba, 0xf4, 0xee, 0xff, 0xe2, 0x95, 0xf3, 0x4a, + 0xfe, 0x5f, 0x82, 0x08, 0xfb, 0x67, 0x09, 0x47, 0x50, 0x82, 0x23, 0x9e, 0x8c, 0x69, 0xba, 0x59, + 0x99, 0x82, 0xd5, 0xfe, 0x71, 0x16, 0xb2, 0x38, 0xc3, 0x88, 0x3c, 0xf4, 0x46, 0x22, 0x8a, 0x2f, + 0x2b, 0x53, 0x63, 0x0a, 0x86, 0xa6, 0x8d, 0xa9, 0xae, 0xf8, 0x23, 0x34, 0xa5, 0x3c, 0x66, 0xc1, + 0x88, 0x39, 0xf6, 0xbd, 0x13, 0xdb, 0x89, 0x31, 0xb5, 0x11, 0x34, 0x03, 0xe6, 0x5f, 0x87, 0x9b, + 0x23, 0xd3, 0x3f, 0x15, 0x92, 0x76, 0xf7, 0x33, 0xcf, 0x3f, 0x0d, 0x70, 0xe6, 0xda, 0x96, 0x0e, + 0x4c, 0x5e, 0xf2, 0x96, 0xbf, 0x0e, 0x1b, 0xcf, 0xc3, 0x66, 0xf4, 0x0d, 0x15, 0x1a, 0x9c, 0x7f, + 0x81, 0xea, 0xd6, 0x12, 0x67, 0x36, 0xf1, 0x2d, 0xaa, 0xec, 0xd9, 0xb0, 0x8d, 0xa2, 0x64, 0xaa, + 0x89, 0xec, 0xea, 0x2f, 0xeb, 0x1b, 0xa6, 0x69, 0x28, 0x5a, 0x5b, 0x2a, 0xab, 0x28, 0x68, 0x5b, + 0x14, 0x59, 0x2d, 0x19, 0x31, 0x00, 0x05, 0x8d, 0x3e, 0xf9, 0x54, 0x29, 0xd5, 0x8a, 0x72, 0x41, + 0x13, 0x20, 0xc4, 0x90, 0xa2, 0x3f, 0x0c, 0x3f, 0xa2, 0xc2, 0x9e, 0x49, 0x10, 0xbf, 0x03, 0x30, + 0x30, 0xa5, 0x78, 0x6e, 0x5e, 0x3c, 0xf1, 0x9d, 0xaa, 0x50, 0x57, 0x25, 0x31, 0x04, 0x9d, 0x58, + 0xc7, 0xeb, 0x9b, 0x4e, 0x57, 0x7a, 0xbe, 0x39, 0x10, 0x87, 0xa6, 0x1c, 0x56, 0x07, 0xca, 0x89, + 0x9d, 0x85, 0xe3, 0x88, 0xa5, 0x3d, 0x12, 0x9f, 0x78, 0xae, 0xa8, 0x0e, 0xd5, 0x88, 0xc3, 0x36, + 0xf6, 0xc4, 0x74, 0x4d, 0xe7, 0x42, 0xda, 0x7d, 0x1c, 0x8b, 0xad, 0x7a, 0x92, 0x00, 0x51, 0xd8, + 0x40, 0x48, 0x9c, 0xc7, 0xb6, 0x55, 0xfd, 0xbe, 0x1a, 0x6b, 0x04, 0xa8, 0x7d, 0x93, 0xae, 0xa7, + 0x86, 0xf5, 0xb7, 0xa0, 0xb2, 0x87, 0xdf, 0x6d, 0x8c, 0xed, 0x6e, 0xdf, 0x1b, 0x0b, 0x54, 0xd3, + 0x14, 0xe8, 0xa5, 0xb0, 0x40, 0x19, 0x0a, 0x1f, 0x05, 0x9e, 0xdb, 0x38, 0x6c, 0xab, 0x83, 0x63, + 0x67, 0xe2, 0x38, 0x2c, 0x5d, 0xef, 0x00, 0xc4, 0xf2, 0x8a, 0x87, 0x40, 0x83, 0xee, 0x82, 0xd8, + 0x8a, 0x0a, 0x42, 0xb9, 0x96, 0xed, 0x0e, 0xb6, 0xb5, 0x88, 0xb2, 0x14, 0x02, 0x29, 0xb8, 0x20, + 0xac, 0x08, 0x48, 0x66, 0x08, 0xb5, 0x84, 0xc5, 0x32, 0xf5, 0xff, 0x93, 0x82, 0x72, 0x22, 0xf5, + 0xe1, 0x8f, 0x31, 0x5d, 0x03, 0x0f, 0x69, 0x3c, 0xe6, 0x71, 0x35, 0x94, 0xf8, 0x46, 0x6d, 0x5c, + 0x2b, 0x9d, 0x99, 0x81, 0x6f, 0x55, 0x28, 0x21, 0x01, 0xf9, 0x4c, 0xa9, 0x1a, 0xf5, 0x87, 0x3a, + 0x1e, 0x53, 0x86, 0xc2, 0x13, 0xf7, 0xd4, 0xf5, 0x9e, 0xbb, 0xea, 0xf4, 0xa5, 0xfc, 0x9b, 0xa9, + 0x9b, 0xc4, 0x30, 0x45, 0x26, 0x53, 0xff, 0xe7, 0xd9, 0x99, 0x54, 0xb5, 0x16, 0xe4, 0x95, 0x13, + 0x40, 0xf6, 0xe9, 0x7c, 0x6e, 0x51, 0x12, 0x59, 0xdf, 0x5a, 0x25, 0x40, 0x86, 0x26, 0x46, 0xeb, + 0x3c, 0x4a, 0xe4, 0x4c, 0x2f, 0xbc, 0x5d, 0x9b, 0x62, 0x14, 0x6a, 0xdc, 0xa9, 0x5c, 0xe6, 0x88, + 0x43, 0xed, 0xaf, 0xa4, 0xe0, 0xfa, 0x22, 0x94, 0x64, 0xc6, 0x77, 0x6a, 0x3a, 0xe3, 0xbb, 0x3b, + 0x93, 0x41, 0x9d, 0xa6, 0xd1, 0x3c, 0x78, 0xc9, 0x4e, 0x4c, 0xe7, 0x53, 0xd7, 0x7f, 0x37, 0x05, + 0x1b, 0x73, 0x63, 0x4e, 0x58, 0x27, 0x00, 0x79, 0x25, 0x59, 0x2a, 0xc1, 0x29, 0x4a, 0x39, 0x51, + 0x57, 0x06, 0x74, 0x6e, 0x07, 0xea, 0x0e, 0x5f, 0xe7, 0x8c, 0x2b, 0xe3, 0x17, 0x57, 0x0d, 0x8f, + 0x85, 0x81, 0x50, 0xe1, 0x55, 0x65, 0x42, 0x69, 0x48, 0x5e, 0x19, 0xa8, 0xea, 0x5e, 0x83, 0x15, + 0x28, 0x71, 0x6a, 0x32, 0x76, 0xec, 0x3e, 0x36, 0x8b, 0xbc, 0x06, 0x37, 0x55, 0xe1, 0x80, 0x76, + 0x06, 0x4f, 0x7a, 0x43, 0x9b, 0x36, 0x07, 0x2b, 0xe1, 0x77, 0x0e, 0x27, 0xc7, 0x8e, 0x1d, 0x0c, + 0x19, 0xd4, 0x0d, 0xb8, 0xb6, 0x60, 0x80, 0xd4, 0xe5, 0xa7, 0xba, 0xfb, 0x6b, 0x00, 0xdb, 0x4f, + 0xc3, 0x4e, 0xb3, 0x14, 0xe7, 0xb0, 0xb6, 0xfd, 0x34, 0xc9, 0x5d, 0x6f, 0x9e, 0xa7, 0xa8, 0x93, + 0x02, 0x96, 0xa9, 0xff, 0x6a, 0x2a, 0xcc, 0x6c, 0xa8, 0xfd, 0x59, 0xa8, 0xa8, 0x0e, 0x1f, 0x9a, + 0x17, 0x8e, 0x67, 0x5a, 0xbc, 0x05, 0x6b, 0x41, 0x54, 0xda, 0x92, 0x38, 0x86, 0x66, 0x8f, 0xf7, + 0xee, 0x14, 0x92, 0x31, 0x43, 0x14, 0x3a, 0x38, 0xe9, 0xf8, 0x3a, 0x84, 0x93, 0xab, 0x66, 0xd2, + 0x96, 0x5b, 0x25, 0xe7, 0xcb, 0xac, 0x7f, 0x0d, 0x36, 0xba, 0xb1, 0xca, 0x56, 0x96, 0x30, 0x0a, + 0x87, 0xd2, 0xf7, 0xdb, 0xa1, 0x70, 0xe8, 0x66, 0xfd, 0x3f, 0xe5, 0x01, 0xe2, 0xab, 0x9f, 0x05, + 0x7b, 0x7e, 0x51, 0x26, 0xc3, 0xdc, 0x45, 0x6c, 0xe6, 0xa5, 0x2f, 0x62, 0xdf, 0x8b, 0x0c, 0x72, + 0x15, 0x16, 0x9e, 0x4d, 0xe7, 0x8e, 0xfb, 0x34, 0x6b, 0x86, 0x4f, 0x25, 0xfa, 0xe4, 0x66, 0x13, + 0x7d, 0xee, 0xce, 0x67, 0x05, 0xce, 0x28, 0xa3, 0x38, 0xde, 0x50, 0x98, 0x8a, 0x37, 0xd4, 0xa0, + 0xe8, 0x0b, 0xd3, 0xf2, 0x5c, 0xe7, 0x22, 0xbc, 0xef, 0x0b, 0xdb, 0xfc, 0x2d, 0xc8, 0x49, 0xaa, + 0xce, 0x29, 0xd2, 0xde, 0x79, 0xc1, 0xc2, 0x29, 0x5c, 0xd4, 0x6c, 0x76, 0xa0, 0x53, 0xf9, 0xd4, + 0x59, 0x58, 0x34, 0x12, 0x10, 0xbe, 0x09, 0xdc, 0x46, 0xe7, 0xcb, 0x71, 0x84, 0xb5, 0x75, 0xb1, + 0xad, 0xae, 0xe1, 0xe8, 0xb4, 0x2e, 0x1a, 0x0b, 0xde, 0x84, 0xeb, 0xbf, 0x1a, 0xaf, 0x3f, 0x75, + 0xf9, 0xcc, 0x0e, 0x70, 0xa4, 0x15, 0x32, 0x4a, 0xa2, 0x36, 0xda, 0x03, 0xe1, 0x86, 0x55, 0x73, + 0x49, 0xd2, 0x1b, 0xdf, 0x65, 0x5f, 0xf2, 0xb6, 0xfe, 0xfb, 0xe9, 0xc8, 0x71, 0x29, 0x41, 0xee, + 0xd8, 0x0c, 0xec, 0xbe, 0x3a, 0x83, 0xb4, 0xc1, 0xa1, 0xce, 0x20, 0xe9, 0x59, 0x1e, 0x4b, 0xa3, + 0x0f, 0x12, 0x08, 0x7d, 0x59, 0x12, 0x57, 0x2c, 0xb1, 0x2c, 0x6e, 0xd4, 0x70, 0xbd, 0x55, 0x46, + 0x0e, 0x91, 0x52, 0xe8, 0xcb, 0x8a, 0x72, 0x1d, 0xc9, 0x89, 0xa5, 0x83, 0x80, 0x15, 0x11, 0xc7, + 0xf5, 0xa4, 0x50, 0x81, 0x3f, 0x92, 0x4e, 0x06, 0xc8, 0x26, 0x4c, 0xc1, 0x67, 0x65, 0x74, 0x0a, + 0x42, 0xa6, 0x2a, 0x5a, 0x17, 0x90, 0xcb, 0xb4, 0x8a, 0xbb, 0x73, 0xfa, 0x05, 0xab, 0x60, 0x8f, + 0xe2, 0x42, 0x28, 0xb6, 0x86, 0x5c, 0x4d, 0xca, 0x13, 0x59, 0xc7, 0xc7, 0x33, 0xca, 0x1e, 0x61, + 0xf8, 0x55, 0x0b, 0xb5, 0xc7, 0x06, 0xf6, 0x2c, 0x32, 0x32, 0x18, 0x47, 0x9f, 0x67, 0x6c, 0xa2, + 0x03, 0x62, 0x8f, 0x4d, 0x57, 0xb2, 0x6b, 0x38, 0xd4, 0xb1, 0x75, 0xc2, 0xae, 0x23, 0x49, 0x7f, + 0x68, 0x4a, 0x76, 0x03, 0x71, 0xf0, 0x69, 0x5b, 0xf8, 0xb8, 0x9e, 0xec, 0x26, 0xe2, 0x48, 0x73, + 0xc0, 0x6e, 0xd5, 0x7f, 0x23, 0xce, 0x36, 0x7e, 0x23, 0x72, 0x0d, 0x96, 0x11, 0x72, 0x74, 0x1e, + 0x16, 0xed, 0xb8, 0x16, 0x6c, 0xf8, 0xe2, 0x07, 0x13, 0x7b, 0x2a, 0x07, 0x3f, 0x73, 0x75, 0x92, + 0xc7, 0x3c, 0x45, 0xfd, 0x0c, 0x36, 0xc2, 0xc6, 0x33, 0x5b, 0x0e, 0x29, 0x4a, 0xc3, 0xdf, 0x4a, + 0x14, 0x09, 0xa4, 0x16, 0x16, 0x57, 0x45, 0x2c, 0xe3, 0xa2, 0x80, 0x28, 0x0a, 0x9f, 0x5e, 0x22, + 0x0a, 0x5f, 0xff, 0xdf, 0xc9, 0x6b, 0x5d, 0xe5, 0x2c, 0x59, 0x91, 0xb3, 0x34, 0x7f, 0xcd, 0x1b, + 0x07, 0xd6, 0xd3, 0x2f, 0x13, 0x58, 0x5f, 0x94, 0x32, 0xf1, 0x3e, 0xda, 0xee, 0xb4, 0x7f, 0x9e, + 0x2e, 0x71, 0x69, 0x30, 0x85, 0xcb, 0xb7, 0xe8, 0xd2, 0xd6, 0xec, 0xaa, 0x7c, 0x9e, 0xdc, 0xc2, + 0x92, 0x9d, 0xe4, 0xed, 0xac, 0xc6, 0x34, 0x12, 0x54, 0x09, 0x6d, 0x93, 0x5f, 0xa4, 0x6d, 0xd0, + 0x6f, 0xd5, 0x7a, 0x28, 0x6a, 0xab, 0x3b, 0x16, 0xf5, 0x1c, 0xb2, 0x27, 0x8b, 0xbc, 0x68, 0xcc, + 0xc1, 0xd1, 0x24, 0x1b, 0x4d, 0x1c, 0x69, 0xeb, 0x6b, 0x04, 0xd5, 0x98, 0xad, 0x29, 0x2c, 0xcd, + 0xd7, 0x14, 0x7e, 0x08, 0x10, 0x08, 0xdc, 0x1d, 0xdb, 0x76, 0x5f, 0xea, 0xac, 0x9f, 0x3b, 0x97, + 0x8d, 0x4d, 0x5f, 0x7e, 0x24, 0x28, 0xb0, 0xff, 0x23, 0xf3, 0x9c, 0x2e, 0x44, 0x75, 0x7a, 0x42, + 0xd4, 0x9e, 0xd5, 0xc1, 0x6b, 0xf3, 0x3a, 0xf8, 0x2d, 0xc8, 0x05, 0x68, 0xe8, 0x52, 0x59, 0xcc, + 0xe5, 0xeb, 0xbb, 0x49, 0xd6, 0xb0, 0xa1, 0x70, 0x29, 0x1c, 0x88, 0x5a, 0xca, 0xf3, 0xa9, 0x20, + 0xa6, 0x64, 0x84, 0xcd, 0x29, 0x3d, 0x78, 0x73, 0x5a, 0x0f, 0xd6, 0x2c, 0xc8, 0xeb, 0xd0, 0xfe, + 0xac, 0x93, 0x1e, 0x06, 0x05, 0xd3, 0x89, 0xa0, 0x60, 0x94, 0x5b, 0x9a, 0x49, 0xe6, 0x96, 0xce, + 0xd4, 0xcc, 0xe5, 0xe6, 0x6a, 0xe6, 0xea, 0x9f, 0x40, 0x4e, 0x59, 0xee, 0x10, 0x1a, 0x8d, 0xca, + 0xe0, 0xc4, 0x41, 0xb1, 0x14, 0xbf, 0x0e, 0x2c, 0x10, 0x64, 0x91, 0x88, 0xae, 0x39, 0x12, 0xa4, + 0x24, 0xd3, 0xbc, 0x0a, 0xd7, 0x15, 0x6e, 0x30, 0xfd, 0x86, 0xcc, 0x22, 0xc7, 0x3e, 0xf6, 0x4d, + 0xff, 0x82, 0x65, 0xeb, 0x1f, 0xd2, 0xc5, 0x7a, 0x28, 0x50, 0xe5, 0xa8, 0x46, 0x51, 0xa9, 0x65, + 0x4b, 0x6b, 0x1f, 0xca, 0xcb, 0xd0, 0x9e, 0x96, 0xca, 0x56, 0x23, 0x57, 0x86, 0x62, 0x31, 0xab, + 0xc9, 0x93, 0xf8, 0x8f, 0x6d, 0xbf, 0xd5, 0xb7, 0x12, 0x76, 0xdd, 0x74, 0xfa, 0x59, 0x6a, 0xd9, + 0xf4, 0xb3, 0xfa, 0x63, 0x58, 0x37, 0xa6, 0x75, 0x3a, 0x7f, 0x0f, 0x0a, 0xde, 0x38, 0xc9, 0xe7, + 0x45, 0x72, 0x19, 0xa2, 0xd7, 0x7f, 0x9a, 0x82, 0xd5, 0xb6, 0x2b, 0x85, 0xef, 0x9a, 0xce, 0x8e, + 0x63, 0x0e, 0xf8, 0xbb, 0xa1, 0x96, 0x5a, 0xec, 0xf7, 0x27, 0x71, 0xa7, 0x15, 0x96, 0xa3, 0x43, + 0xd8, 0xfc, 0x06, 0x6c, 0x08, 0xcb, 0x96, 0x9e, 0xaf, 0xac, 0xd9, 0x30, 0x4b, 0xf0, 0x3a, 0x30, + 0x05, 0xee, 0xd2, 0x96, 0xe8, 0xa9, 0x65, 0xae, 0xc2, 0xf5, 0x29, 0x68, 0x68, 0xaa, 0xa6, 0xf9, + 0x6d, 0xa8, 0xc6, 0xa7, 0xd1, 0xb6, 0xe7, 0xca, 0xb6, 0x6b, 0x89, 0x73, 0x32, 0x85, 0x58, 0xa6, + 0xfe, 0xeb, 0x85, 0xd0, 0x08, 0x7b, 0xaa, 0x73, 0x08, 0x7d, 0xcf, 0x8b, 0x0b, 0x54, 0x75, 0x2b, + 0x51, 0x08, 0x9d, 0x5e, 0xa2, 0x10, 0xfa, 0xc3, 0xb8, 0x98, 0x55, 0x1d, 0x14, 0xaf, 0x2c, 0x3c, + 0x7d, 0x28, 0xf5, 0x49, 0xdb, 0xe0, 0x5d, 0x91, 0xa8, 0x6c, 0x7d, 0x53, 0x3b, 0x5e, 0xd9, 0x65, + 0x6c, 0x55, 0x95, 0x25, 0xf0, 0xce, 0x6c, 0x05, 0xc5, 0x72, 0x29, 0x88, 0x73, 0xe6, 0x24, 0xbc, + 0xb4, 0x39, 0xf9, 0xed, 0x19, 0x1f, 0xa7, 0xb8, 0x30, 0x14, 0x76, 0x45, 0x7d, 0xe8, 0xb7, 0xa1, + 0x30, 0xb4, 0x03, 0xe9, 0xf9, 0xaa, 0x66, 0x79, 0xbe, 0xc6, 0x2a, 0x31, 0x5b, 0xbb, 0x0a, 0x91, + 0xf2, 0xc5, 0x42, 0x2a, 0xfe, 0x3d, 0xd8, 0xa0, 0x89, 0x3f, 0x8c, 0xad, 0x86, 0xa0, 0x5a, 0x5e, + 0x98, 0xa7, 0x97, 0x60, 0xb5, 0x35, 0x43, 0x62, 0xcc, 0x33, 0xa9, 0x0d, 0x00, 0xe2, 0xf5, 0x99, + 0xd3, 0x62, 0x9f, 0xa1, 0x66, 0xf9, 0x26, 0xe4, 0x83, 0xc9, 0x71, 0x7c, 0xd7, 0xa5, 0x5b, 0xb5, + 0x73, 0xa8, 0xcd, 0x59, 0x07, 0x87, 0xc2, 0x57, 0xdd, 0xbd, 0xb2, 0x70, 0xfa, 0xc3, 0xe4, 0xc2, + 0x2b, 0xe1, 0xbc, 0x7b, 0xc9, 0xea, 0x45, 0x9c, 0x13, 0x12, 0x50, 0x7b, 0x07, 0xca, 0x89, 0x49, + 0x45, 0xcd, 0x3c, 0x71, 0x2d, 0x2f, 0x0c, 0xbf, 0xe2, 0xb3, 0x2a, 0x1c, 0xb3, 0xc2, 0x00, 0x2c, + 0x3d, 0xd7, 0x0c, 0x60, 0xb3, 0x13, 0x78, 0x85, 0x1f, 0xfc, 0x0a, 0x54, 0x12, 0x26, 0x5d, 0x14, + 0x9a, 0x9b, 0x06, 0xd6, 0xcf, 0xe0, 0xf3, 0x09, 0x76, 0x87, 0xc2, 0x1f, 0xd9, 0x01, 0x1e, 0x24, + 0xca, 0xa5, 0xa3, 0x50, 0x86, 0x25, 0x5c, 0x69, 0xcb, 0x50, 0x83, 0x46, 0x6d, 0xfe, 0x4d, 0xc8, + 0x8d, 0x85, 0x3f, 0x0a, 0xb4, 0x16, 0x9d, 0x95, 0xa0, 0x85, 0x6c, 0x03, 0x43, 0xd1, 0xd4, 0xff, + 0x7e, 0x0a, 0x8a, 0xfb, 0x42, 0x9a, 0x68, 0x3b, 0xf0, 0xfd, 0x99, 0xaf, 0xcc, 0xdf, 0xcf, 0x86, + 0xa8, 0x9b, 0xda, 0xc9, 0xdc, 0x6c, 0x6b, 0x7c, 0xdd, 0xde, 0x5d, 0x89, 0x3b, 0x56, 0xdb, 0x82, + 0x82, 0x06, 0xd7, 0xde, 0x85, 0xf5, 0x19, 0x4c, 0x9a, 0x17, 0x65, 0xdb, 0x77, 0x2f, 0x46, 0x61, + 0x12, 0xd1, 0xaa, 0x31, 0x0d, 0xdc, 0x2a, 0x41, 0x61, 0xac, 0x08, 0xea, 0xbf, 0x7f, 0x83, 0x52, + 0x57, 0xec, 0x13, 0xf4, 0xbc, 0x17, 0x9d, 0xac, 0x77, 0x00, 0xe8, 0x68, 0x56, 0x09, 0x0e, 0x2a, + 0x5c, 0x9a, 0x80, 0xf0, 0xf7, 0xa3, 0x38, 0x77, 0x76, 0xa1, 0x51, 0x95, 0x64, 0x3e, 0x1b, 0xec, + 0xae, 0x42, 0xc1, 0x0e, 0x28, 0x5a, 0xa6, 0x93, 0x82, 0xc2, 0x26, 0xff, 0x16, 0xe4, 0xed, 0xd1, + 0xd8, 0xf3, 0xa5, 0x0e, 0x84, 0x5f, 0xc9, 0xb5, 0x4d, 0x98, 0xbb, 0x2b, 0x86, 0xa6, 0x41, 0x6a, + 0x71, 0x4e, 0xd4, 0xc5, 0x17, 0x53, 0xb7, 0xce, 0x43, 0x6a, 0x45, 0xc3, 0xbf, 0x0b, 0x95, 0x81, + 0xca, 0x89, 0x54, 0x8c, 0xb5, 0x12, 0xf9, 0xca, 0x55, 0x4c, 0x1e, 0x25, 0x09, 0x76, 0x57, 0x8c, + 0x69, 0x0e, 0xc8, 0x12, 0x0d, 0x78, 0x11, 0xc8, 0x9e, 0xf7, 0x91, 0x67, 0xbb, 0xe4, 0x94, 0xbe, + 0x80, 0xa5, 0x91, 0x24, 0x40, 0x96, 0x53, 0x1c, 0xf8, 0xd7, 0xd1, 0xe2, 0x09, 0xa4, 0x2e, 0x1b, + 0xbf, 0x7b, 0x15, 0xa7, 0x9e, 0x08, 0x74, 0xc1, 0x77, 0x20, 0xf9, 0x39, 0xd4, 0x12, 0x9b, 0x44, + 0x7f, 0xa4, 0x31, 0x1e, 0xfb, 0x1e, 0x7a, 0xb6, 0x15, 0xe2, 0xf6, 0xf5, 0xab, 0xb8, 0x1d, 0x5e, + 0x4a, 0xbd, 0xbb, 0x62, 0x5c, 0xc1, 0x9b, 0xf7, 0xd0, 0xb3, 0xd3, 0x43, 0xd8, 0x13, 0xe6, 0x59, + 0x58, 0x74, 0x7e, 0x7f, 0xa9, 0x59, 0x20, 0x8a, 0xdd, 0x15, 0x63, 0x86, 0x07, 0xff, 0x65, 0xd8, + 0x98, 0xfa, 0x26, 0xd5, 0x99, 0xaa, 0x92, 0xf4, 0xaf, 0x2d, 0x3d, 0x0c, 0x24, 0xda, 0x5d, 0x31, + 0xe6, 0x39, 0xf1, 0x09, 0x7c, 0x6e, 0x7e, 0x48, 0xdb, 0xa2, 0xef, 0xd8, 0xae, 0xd0, 0xd5, 0xeb, + 0xef, 0xbc, 0xdc, 0x6c, 0x69, 0xe2, 0xdd, 0x15, 0xe3, 0x72, 0xce, 0xfc, 0xcf, 0xc3, 0xed, 0xf1, + 0x42, 0x15, 0xa3, 0x54, 0x97, 0x2e, 0x7e, 0x7f, 0x6f, 0xc9, 0x2f, 0xcf, 0xd1, 0xef, 0xae, 0x18, + 0x57, 0xf2, 0x47, 0xdb, 0x99, 0x3c, 0x68, 0x9d, 0xba, 0xad, 0x1a, 0xfc, 0x36, 0x94, 0xcc, 0xbe, + 0xb3, 0x2b, 0x4c, 0x2b, 0x8a, 0xd5, 0xc7, 0x80, 0xda, 0xff, 0x48, 0x41, 0x5e, 0xcb, 0xfb, 0xed, + 0xe8, 0x3e, 0x3e, 0x52, 0xdd, 0x31, 0x80, 0x7f, 0x00, 0x25, 0xe1, 0xfb, 0x9e, 0xdf, 0xf4, 0xac, + 0x30, 0x95, 0x71, 0x36, 0x16, 0xac, 0xf8, 0x6c, 0xb6, 0x42, 0x34, 0x23, 0xa6, 0xe0, 0xef, 0x03, + 0xa8, 0x7d, 0xde, 0x8b, 0x2b, 0x70, 0x6a, 0x8b, 0xe9, 0xd5, 0xf5, 0x4f, 0x8c, 0x1d, 0x07, 0xcf, + 0xc2, 0xbb, 0x97, 0xb0, 0x19, 0x39, 0x9c, 0xb9, 0x84, 0xc3, 0x79, 0x5b, 0xc7, 0x11, 0x0e, 0xf0, + 0x85, 0xae, 0x43, 0x8b, 0x00, 0xb5, 0x7f, 0x95, 0x82, 0xbc, 0x52, 0x1e, 0xbc, 0x35, 0x3f, 0xa2, + 0xd7, 0x5e, 0xac, 0x73, 0x36, 0x67, 0x47, 0xf6, 0x2d, 0x00, 0xa5, 0x83, 0x12, 0x23, 0xbb, 0x3d, + 0xc3, 0x47, 0x93, 0x86, 0xc9, 0xc3, 0x31, 0x7e, 0xfd, 0xa1, 0xaa, 0x95, 0xa2, 0xc0, 0xed, 0x93, + 0xbd, 0x3d, 0xb6, 0xc2, 0x37, 0xa0, 0xf2, 0xe4, 0xe0, 0xf1, 0x41, 0xe7, 0xd9, 0xc1, 0x51, 0xcb, + 0x30, 0x3a, 0x86, 0x8a, 0xdf, 0x6e, 0x35, 0xb6, 0x8f, 0xda, 0x07, 0x87, 0x4f, 0x7a, 0x2c, 0x5d, + 0xfb, 0xa7, 0x29, 0xa8, 0x4c, 0xe9, 0xae, 0x3f, 0xd9, 0xa5, 0x4b, 0x4c, 0x7f, 0x66, 0xf1, 0xf4, + 0x67, 0x2f, 0x9b, 0xfe, 0xdc, 0xec, 0xf4, 0xff, 0x76, 0x0a, 0x2a, 0x53, 0x3a, 0x32, 0xc9, 0x3d, + 0x35, 0xcd, 0x3d, 0x79, 0xd2, 0xa7, 0x67, 0x4e, 0xfa, 0x3a, 0xac, 0x86, 0xcf, 0x07, 0x71, 0xc4, + 0x61, 0x0a, 0x96, 0xc4, 0xa1, 0x62, 0x85, 0xec, 0x34, 0x0e, 0x15, 0x2c, 0x5c, 0xdd, 0x5b, 0x2a, + 0xce, 0x0c, 0xa8, 0x76, 0xbd, 0x76, 0xb9, 0x06, 0xbd, 0x62, 0x08, 0x8f, 0xa0, 0x3c, 0x8e, 0xb7, + 0xe9, 0xcb, 0x99, 0x25, 0x49, 0xca, 0x17, 0xf4, 0xf3, 0x77, 0x52, 0xb0, 0x36, 0xad, 0x73, 0xff, + 0xbf, 0x9e, 0xd6, 0x7f, 0x98, 0x82, 0x8d, 0x39, 0x4d, 0x7e, 0xa5, 0x61, 0x37, 0xdb, 0xaf, 0xf4, + 0x12, 0xfd, 0xca, 0x2c, 0xe8, 0xd7, 0xe5, 0x9a, 0xe4, 0xea, 0x1e, 0x77, 0xe1, 0x73, 0x97, 0x9e, + 0x09, 0x57, 0x4c, 0xf5, 0x14, 0xd3, 0xcc, 0x2c, 0xd3, 0xdf, 0x4a, 0xc1, 0xed, 0xab, 0xf4, 0xfd, + 0xff, 0x73, 0xb9, 0x9a, 0xed, 0x61, 0xfd, 0xdd, 0xe8, 0x12, 0xbf, 0x0c, 0x05, 0xfd, 0x9b, 0x50, + 0x3a, 0x4d, 0x7a, 0xe8, 0x3d, 0x77, 0x55, 0x24, 0xda, 0x10, 0xa6, 0xae, 0x9a, 0x37, 0xc4, 0xd8, + 0xb1, 0xe9, 0x26, 0xf3, 0x16, 0x40, 0x83, 0xfc, 0xba, 0xb0, 0x88, 0xa5, 0xb9, 0xd7, 0xe9, 0xb6, + 0xd8, 0x4a, 0xd2, 0x88, 0xfd, 0x24, 0x54, 0xc4, 0xf5, 0x43, 0xc8, 0xc7, 0x65, 0x05, 0xfb, 0xa6, + 0x7f, 0x6a, 0xa9, 0xfb, 0xc2, 0x55, 0x28, 0x1e, 0x6a, 0x17, 0x4a, 0x7d, 0xea, 0xa3, 0x6e, 0xe7, + 0x40, 0x05, 0xbd, 0xb7, 0x3b, 0x3d, 0x55, 0x9c, 0xd0, 0x7d, 0xfa, 0x48, 0x5d, 0x5c, 0x3d, 0x32, + 0x1a, 0x87, 0xbb, 0x47, 0x84, 0x91, 0xab, 0xff, 0x66, 0x36, 0x3c, 0xd5, 0xea, 0x86, 0xbe, 0x89, + 0x04, 0xc8, 0xa3, 0x36, 0xf7, 0x34, 0xe3, 0xe8, 0x33, 0x94, 0x50, 0xdb, 0x3a, 0x57, 0x71, 0x08, + 0x96, 0xe6, 0x79, 0x48, 0x1f, 0x1e, 0xab, 0x2c, 0xa0, 0x5d, 0x39, 0x72, 0x54, 0x55, 0x63, 0xef, + 0x5c, 0xb2, 0x1c, 0x3e, 0x34, 0x83, 0x33, 0x96, 0xaf, 0xff, 0xb3, 0x0c, 0x94, 0x22, 0x55, 0xf9, + 0x32, 0xaa, 0x9b, 0x73, 0x58, 0x6b, 0x1f, 0xf4, 0x5a, 0xc6, 0x41, 0x63, 0x4f, 0xa3, 0x64, 0xf8, + 0x35, 0x58, 0xdf, 0x69, 0xef, 0xb5, 0x8e, 0xf6, 0x3a, 0x8d, 0x6d, 0x0d, 0x2c, 0xf2, 0x9b, 0xc0, + 0xdb, 0xfb, 0x87, 0x1d, 0xa3, 0x77, 0xd4, 0xee, 0x1e, 0x35, 0x1b, 0x07, 0xcd, 0xd6, 0x5e, 0x6b, + 0x9b, 0xe5, 0xf9, 0x2b, 0x70, 0xf7, 0xa0, 0xd3, 0x6b, 0x77, 0x0e, 0x8e, 0x0e, 0x3a, 0x47, 0x9d, + 0xad, 0x8f, 0x5a, 0xcd, 0x5e, 0xf7, 0xa8, 0x7d, 0x70, 0x84, 0x5c, 0x1f, 0x19, 0x0d, 0x7c, 0xc3, + 0x72, 0xfc, 0x2e, 0xdc, 0xd6, 0x58, 0xdd, 0x96, 0xf1, 0xb4, 0x65, 0x20, 0x93, 0x27, 0x07, 0x8d, + 0xa7, 0x8d, 0xf6, 0x5e, 0x63, 0x6b, 0xaf, 0xc5, 0x56, 0xf9, 0x1d, 0xa8, 0x69, 0x0c, 0xa3, 0xd1, + 0x6b, 0x1d, 0xed, 0xb5, 0xf7, 0xdb, 0xbd, 0xa3, 0xd6, 0xf7, 0x9a, 0xad, 0xd6, 0x76, 0x6b, 0x9b, + 0x55, 0xf8, 0x57, 0xe0, 0xcb, 0xd4, 0x29, 0xdd, 0x89, 0xe9, 0x8f, 0x7d, 0xd2, 0x3e, 0x3c, 0x6a, + 0x18, 0xcd, 0xdd, 0xf6, 0xd3, 0x16, 0x5b, 0xe3, 0xaf, 0xc1, 0x97, 0x2e, 0x47, 0xdd, 0x6e, 0x1b, + 0xad, 0x66, 0xaf, 0x63, 0x7c, 0xcc, 0x36, 0xf8, 0x17, 0xe0, 0x73, 0xbb, 0xbd, 0xfd, 0xbd, 0xa3, + 0x67, 0x46, 0xe7, 0xe0, 0xd1, 0x11, 0x3d, 0x76, 0x7b, 0xc6, 0x93, 0x66, 0xef, 0x89, 0xd1, 0x62, + 0xc0, 0x6b, 0x70, 0xf3, 0x70, 0xeb, 0xe8, 0xa0, 0xd3, 0x3b, 0x6a, 0x1c, 0x7c, 0xbc, 0xb5, 0xd7, + 0x69, 0x3e, 0x3e, 0xda, 0xe9, 0x18, 0xfb, 0x8d, 0x1e, 0x2b, 0xf3, 0xaf, 0xc2, 0x6b, 0xcd, 0xee, + 0x53, 0xdd, 0xcd, 0xce, 0xce, 0x91, 0xd1, 0x79, 0xd6, 0x3d, 0xea, 0x18, 0x47, 0x46, 0x6b, 0x8f, + 0xc6, 0xdc, 0x8d, 0xfb, 0x5e, 0xe0, 0xb7, 0xa1, 0xda, 0x3e, 0xe8, 0x3e, 0xd9, 0xd9, 0x69, 0x37, + 0xdb, 0xad, 0x83, 0xde, 0xd1, 0x61, 0xcb, 0xd8, 0x6f, 0x77, 0xbb, 0x88, 0xc6, 0x4a, 0xf5, 0xef, + 0x40, 0xbe, 0xed, 0x9e, 0xd9, 0x92, 0xf6, 0x97, 0x16, 0x46, 0xed, 0x71, 0x85, 0x4d, 0xda, 0x16, + 0xf6, 0xc0, 0xa5, 0x6a, 0x7d, 0xda, 0x5d, 0xab, 0x46, 0x0c, 0xa8, 0xff, 0xa3, 0x34, 0x54, 0x14, + 0x8b, 0xd0, 0x83, 0xbb, 0x07, 0xeb, 0x3a, 0x14, 0xda, 0x9e, 0x56, 0x61, 0xb3, 0x60, 0xfa, 0x19, + 0x2c, 0x05, 0x4a, 0x28, 0xb2, 0x24, 0x88, 0xae, 0xd7, 0x88, 0x39, 0x7a, 0x82, 0xea, 0x62, 0x31, + 0x06, 0x7c, 0x56, 0x0d, 0x86, 0xda, 0x51, 0x21, 0xf6, 0x3d, 0xb7, 0x19, 0x95, 0x6d, 0x4c, 0xc1, + 0xf8, 0x27, 0x70, 0x2b, 0x6a, 0xb7, 0xdc, 0xbe, 0x7f, 0x31, 0x8e, 0x7e, 0xad, 0xae, 0xb0, 0x30, + 0xa4, 0xb0, 0x63, 0x3b, 0x62, 0x0a, 0xd1, 0xb8, 0x8c, 0x41, 0xfd, 0x0f, 0x52, 0x09, 0xbf, 0x57, + 0xf9, 0xb5, 0x57, 0x6a, 0xfc, 0x45, 0x77, 0x30, 0xe8, 0x79, 0xea, 0xee, 0x6b, 0x43, 0x44, 0x37, + 0xf9, 0x21, 0x70, 0x7b, 0xbe, 0xd3, 0xd9, 0x25, 0x3b, 0xbd, 0x80, 0x76, 0x36, 0x84, 0x9e, 0x9b, + 0x0f, 0xa1, 0xdf, 0x01, 0x18, 0x38, 0xde, 0xb1, 0xe9, 0x24, 0x0c, 0xcd, 0x04, 0xa4, 0xee, 0x40, + 0x31, 0xfc, 0x4d, 0x3c, 0x7e, 0x13, 0xf2, 0xf4, 0xab, 0x78, 0x51, 0x40, 0x51, 0xb5, 0xf8, 0x2e, + 0xac, 0x89, 0xe9, 0x3e, 0xa7, 0x97, 0xec, 0xf3, 0x0c, 0x5d, 0xfd, 0x1b, 0xb0, 0x31, 0x87, 0x84, + 0x93, 0x38, 0x36, 0x65, 0x54, 0x18, 0x8f, 0xcf, 0xf3, 0x97, 0xd8, 0xf5, 0xff, 0x98, 0x86, 0xd5, + 0x7d, 0xd3, 0xb5, 0x4f, 0x44, 0x20, 0xc3, 0xde, 0x06, 0xfd, 0xa1, 0x18, 0x99, 0x61, 0x6f, 0x55, + 0x4b, 0x47, 0x19, 0xd2, 0xc9, 0xf8, 0xfd, 0xdc, 0x75, 0xcf, 0x4d, 0xc8, 0x9b, 0x13, 0x39, 0x8c, + 0x72, 0xc5, 0x75, 0x0b, 0xd7, 0xce, 0xb1, 0xfb, 0xc2, 0x0d, 0x42, 0xd9, 0x0c, 0x9b, 0x71, 0x4e, + 0x4b, 0xfe, 0x8a, 0x9c, 0x96, 0xc2, 0xfc, 0xfc, 0xdf, 0x85, 0x72, 0xd0, 0xf7, 0x85, 0x70, 0x83, + 0xa1, 0x27, 0xc3, 0xdf, 0x53, 0x4c, 0x82, 0x28, 0x6d, 0xcc, 0x7b, 0xee, 0xe2, 0x0e, 0xdd, 0xb3, + 0xdd, 0x53, 0x9d, 0x0d, 0x35, 0x05, 0x43, 0x19, 0xa4, 0x18, 0x8b, 0xfd, 0x43, 0x41, 0xfe, 0x7d, + 0xce, 0x88, 0xda, 0x14, 0x45, 0x31, 0xa5, 0x18, 0x78, 0xbe, 0x2d, 0x54, 0x28, 0xb1, 0x64, 0x24, + 0x20, 0x48, 0xeb, 0x98, 0xee, 0x60, 0x62, 0x0e, 0x84, 0xbe, 0x14, 0x8e, 0xda, 0xf5, 0xff, 0x99, + 0x03, 0xd8, 0x17, 0xa3, 0x63, 0xe1, 0x07, 0x43, 0x7b, 0x4c, 0x57, 0x1d, 0xb6, 0xce, 0x90, 0xad, + 0x18, 0xf4, 0xcc, 0xdf, 0x9b, 0x4a, 0x5e, 0x9f, 0xbf, 0x9c, 0x8c, 0xc9, 0x67, 0x43, 0x30, 0x38, + 0x39, 0xa6, 0x14, 0x3a, 0x9d, 0x88, 0xe6, 0x3f, 0x6b, 0x24, 0x41, 0x94, 0x26, 0x66, 0x4a, 0xd1, + 0x72, 0x2d, 0x15, 0xe2, 0xc9, 0x1a, 0x51, 0x9b, 0xca, 0x5f, 0x82, 0xc6, 0x44, 0x7a, 0x86, 0x70, + 0xc5, 0xf3, 0xa8, 0xb2, 0x2b, 0x06, 0xf1, 0x7d, 0xa8, 0x8c, 0xcd, 0x8b, 0x91, 0x70, 0xe5, 0xbe, + 0x90, 0x43, 0xcf, 0xd2, 0xb9, 0x3f, 0xaf, 0x5d, 0xde, 0xc1, 0xc3, 0x24, 0xba, 0x31, 0x4d, 0x8d, + 0x32, 0xe1, 0x06, 0xb4, 0x4b, 0xd4, 0x32, 0xea, 0x16, 0xdf, 0x02, 0x50, 0x4f, 0xe4, 0x39, 0x15, + 0x17, 0x47, 0xa2, 0xcc, 0x91, 0x08, 0x84, 0x7f, 0x66, 0x2b, 0x3d, 0xa6, 0x7c, 0xc3, 0x98, 0x0a, + 0xb5, 0xde, 0x24, 0x10, 0x7e, 0x6b, 0x64, 0xda, 0x8e, 0x5e, 0xe0, 0x18, 0xc0, 0xdf, 0x86, 0x1b, + 0xc1, 0xe4, 0x18, 0x65, 0xe6, 0x58, 0xf4, 0xbc, 0x03, 0xf1, 0x3c, 0x70, 0x84, 0x94, 0xc2, 0xd7, + 0xf9, 0x05, 0x8b, 0x5f, 0xd6, 0x07, 0x91, 0xd9, 0x43, 0xbf, 0xdd, 0x81, 0x4f, 0x71, 0x12, 0x53, + 0x04, 0xd2, 0x19, 0x5e, 0x2c, 0xc5, 0x19, 0xac, 0x2a, 0x90, 0x4e, 0x00, 0x4b, 0xf3, 0x2f, 0xc3, + 0x17, 0xa7, 0x90, 0x0c, 0x75, 0x11, 0x1c, 0xec, 0xd8, 0xae, 0xe9, 0xd8, 0x3f, 0x54, 0xd7, 0xf2, + 0x99, 0xfa, 0x18, 0x2a, 0x53, 0x13, 0x47, 0xa5, 0x88, 0xf4, 0xa4, 0xb3, 0x60, 0x18, 0xac, 0xaa, + 0x76, 0x57, 0xfa, 0x36, 0xdd, 0x70, 0x44, 0x90, 0x26, 0xee, 0x73, 0x8f, 0xa5, 0xf9, 0x75, 0x60, + 0x0a, 0xd2, 0x76, 0xcd, 0xf1, 0xb8, 0x31, 0x1e, 0x3b, 0x82, 0x65, 0xa8, 0xcc, 0x33, 0x86, 0xaa, + 0x14, 0x76, 0x96, 0xad, 0x7f, 0x0f, 0x6e, 0xd1, 0xcc, 0x3c, 0x15, 0x7e, 0xe4, 0xd8, 0xea, 0xb1, + 0xde, 0x80, 0x0d, 0xf5, 0x74, 0xe0, 0x49, 0xf5, 0x9a, 0x8c, 0x3d, 0x0e, 0x6b, 0x0a, 0x8c, 0xb6, + 0x4e, 0x57, 0x50, 0xf1, 0x66, 0x04, 0x8b, 0xf0, 0xd2, 0xf5, 0x9f, 0xe6, 0x81, 0xc7, 0x02, 0xd1, + 0xb3, 0x85, 0xbf, 0x6d, 0x4a, 0x33, 0x11, 0x99, 0xac, 0x5c, 0x7a, 0xb7, 0xfe, 0xe2, 0xfc, 0xb5, + 0x9b, 0x90, 0xb7, 0x03, 0x74, 0xc5, 0x74, 0x6a, 0xaa, 0x6e, 0xf1, 0x3d, 0x80, 0xb1, 0xf0, 0x6d, + 0xcf, 0x22, 0x09, 0xca, 0x2d, 0xac, 0x21, 0x98, 0xef, 0xd4, 0xe6, 0x61, 0x44, 0x63, 0x24, 0xe8, + 0xb1, 0x1f, 0xaa, 0xa5, 0x6e, 0xaa, 0xf3, 0xd4, 0xe9, 0x24, 0x88, 0xbf, 0x01, 0xd7, 0xc6, 0xbe, + 0xdd, 0x17, 0x6a, 0x39, 0x9e, 0x04, 0x56, 0x93, 0x7e, 0xf1, 0xae, 0x40, 0x98, 0x8b, 0x5e, 0xa1, + 0x04, 0x9a, 0x2e, 0x39, 0x28, 0x01, 0xdd, 0xcd, 0xea, 0x72, 0x67, 0x95, 0xbc, 0x59, 0x31, 0x16, + 0xbf, 0xe4, 0xf7, 0x81, 0xe9, 0x17, 0xfb, 0xb6, 0xbb, 0x27, 0xdc, 0x81, 0x1c, 0x92, 0x70, 0x57, + 0x8c, 0x39, 0x38, 0x69, 0x30, 0xf5, 0xbb, 0x42, 0xea, 0xde, 0xa6, 0x64, 0x44, 0x6d, 0x55, 0x42, + 0xef, 0x78, 0x7e, 0x57, 0xfa, 0x3a, 0x0b, 0x35, 0x6a, 0xa3, 0xcd, 0x12, 0x50, 0x5f, 0x0f, 0x7d, + 0xcf, 0x9a, 0xd0, 0xad, 0x82, 0x52, 0x62, 0xb3, 0xe0, 0x18, 0x73, 0xdf, 0x74, 0x75, 0x12, 0x61, + 0x25, 0x89, 0x19, 0x81, 0xc9, 0x07, 0xf3, 0x82, 0x98, 0xe1, 0xba, 0xf6, 0xc1, 0x12, 0x30, 0x8d, + 0x13, 0xb3, 0x62, 0x11, 0x4e, 0xcc, 0x87, 0xc6, 0x6f, 0xf9, 0x9e, 0x6d, 0xc5, 0xbc, 0x36, 0x54, + 0x7e, 0xe8, 0x2c, 0x3c, 0x81, 0x1b, 0xf3, 0xe4, 0x53, 0xb8, 0x11, 0xbc, 0xfe, 0xa3, 0x14, 0x40, + 0xbc, 0xf8, 0x28, 0xf2, 0x71, 0x2b, 0xde, 0xe2, 0xb7, 0xe0, 0x5a, 0x12, 0xec, 0xe8, 0x44, 0x50, + 0x92, 0xfb, 0xf8, 0xc5, 0xb6, 0x79, 0x11, 0xb0, 0xb4, 0x2e, 0x38, 0xd6, 0xb0, 0x67, 0x42, 0x50, + 0x56, 0xdd, 0x75, 0x60, 0x31, 0x90, 0xaa, 0xc8, 0x02, 0x96, 0x9d, 0x46, 0xfd, 0x58, 0x98, 0x7e, + 0xc0, 0x72, 0xf5, 0x5d, 0xc8, 0xab, 0xcb, 0xa5, 0x05, 0xd7, 0xc2, 0x2f, 0x97, 0xe3, 0xf1, 0x57, + 0x53, 0x00, 0xdb, 0x2a, 0x17, 0x18, 0x4f, 0xf1, 0x05, 0xb7, 0xed, 0x8b, 0x2c, 0x2a, 0xd3, 0xb2, + 0x28, 0xa7, 0x3a, 0x13, 0xfd, 0x5a, 0x0d, 0x36, 0x51, 0x72, 0xcc, 0x30, 0x73, 0x4a, 0xed, 0xb9, + 0xa8, 0xad, 0x0e, 0x90, 0xa6, 0xe7, 0xba, 0xa2, 0x8f, 0xc7, 0x4f, 0x74, 0x80, 0x44, 0xa0, 0xfa, + 0xbf, 0x29, 0x40, 0xb9, 0x39, 0x34, 0xe5, 0xbe, 0x08, 0x02, 0x73, 0x20, 0xe6, 0xfa, 0x52, 0x85, + 0x82, 0xe7, 0x5b, 0xc2, 0x8f, 0x2b, 0xc1, 0x74, 0x33, 0x99, 0x63, 0x90, 0x99, 0xce, 0x31, 0xb8, + 0x0d, 0x25, 0x75, 0x83, 0x61, 0x35, 0x94, 0x1a, 0xc8, 0x18, 0x31, 0x00, 0xcf, 0xea, 0x91, 0x67, + 0x91, 0x32, 0x6a, 0xa8, 0xe0, 0x7f, 0xc6, 0x48, 0x40, 0x54, 0x4a, 0xc7, 0xd8, 0xb9, 0xe8, 0x79, + 0xba, 0x4f, 0x6d, 0x2b, 0x2e, 0x9b, 0x9d, 0x86, 0xf3, 0x26, 0x14, 0x46, 0xaa, 0xa1, 0x2f, 0x32, + 0x66, 0x43, 0xfe, 0x89, 0xa1, 0x6d, 0xea, 0xbf, 0xba, 0x72, 0xc5, 0x08, 0x29, 0xd1, 0x45, 0x37, + 0xa5, 0x34, 0xfb, 0xc3, 0x91, 0x56, 0x11, 0x99, 0x05, 0x77, 0x9a, 0x49, 0x46, 0x8d, 0x08, 0xdb, + 0x48, 0x52, 0xf2, 0x2d, 0x28, 0xf9, 0xc2, 0x9c, 0xba, 0x56, 0x7d, 0xe5, 0x0a, 0x36, 0x46, 0x88, + 0x6b, 0xc4, 0x64, 0xb5, 0x9f, 0xa4, 0x60, 0x6d, 0xba, 0xa3, 0x7f, 0x12, 0x3f, 0x38, 0xf6, 0xad, + 0xf8, 0x07, 0xc7, 0x3e, 0xc3, 0x8f, 0x77, 0xfd, 0x56, 0x0a, 0x20, 0x9e, 0x03, 0x54, 0xf9, 0xea, + 0x87, 0x91, 0x42, 0x23, 0x54, 0xb5, 0xf8, 0xee, 0x54, 0x35, 0xfd, 0xdb, 0x4b, 0x4d, 0x68, 0xe2, + 0x31, 0x91, 0xa3, 0xfc, 0x00, 0xd6, 0xa6, 0xe1, 0x94, 0xdb, 0xdd, 0xde, 0x6b, 0xa9, 0x10, 0x47, + 0x7b, 0xbf, 0xf1, 0xa8, 0xa5, 0x2b, 0x85, 0xda, 0x07, 0x8f, 0x59, 0xba, 0xf6, 0x87, 0x29, 0x28, + 0x45, 0xd3, 0xcb, 0xbf, 0x9b, 0x5c, 0x17, 0x95, 0x27, 0xf1, 0xd6, 0x32, 0xeb, 0x12, 0x3f, 0xb5, + 0x5c, 0xe9, 0x5f, 0x24, 0x97, 0xc9, 0x83, 0xb5, 0xe9, 0x97, 0x0b, 0x74, 0xc2, 0xa3, 0x69, 0x9d, + 0xf0, 0xe6, 0x52, 0x9f, 0x0c, 0x3d, 0xaf, 0x3d, 0x3b, 0x90, 0x5a, 0x5d, 0xbc, 0x9f, 0x7e, 0x2f, + 0x55, 0xbb, 0x0b, 0xab, 0xc9, 0x57, 0xf3, 0xe5, 0x80, 0xf7, 0xff, 0x30, 0x03, 0x6b, 0xd3, 0xa9, + 0x06, 0x54, 0x7c, 0xa4, 0xd2, 0x5c, 0x3a, 0x8e, 0x95, 0x48, 0xeb, 0x66, 0x7c, 0x1d, 0xca, 0xda, + 0xb7, 0x23, 0xc0, 0x06, 0x05, 0x51, 0xbc, 0x91, 0x60, 0x77, 0x93, 0x3f, 0xaa, 0xf8, 0x06, 0x87, + 0xb0, 0x2c, 0x8c, 0x8d, 0x79, 0x49, 0xff, 0xbc, 0xd4, 0xaf, 0xa4, 0x79, 0x25, 0x91, 0x5c, 0xfc, + 0x63, 0x34, 0x6c, 0xd6, 0xb7, 0x26, 0xae, 0xe5, 0x08, 0x2b, 0x82, 0xfe, 0x24, 0x09, 0x8d, 0xb2, + 0x83, 0x7f, 0x25, 0xcb, 0xd7, 0xa0, 0xd4, 0x9d, 0x1c, 0xeb, 0xcc, 0xe0, 0xbf, 0x90, 0xe5, 0x37, + 0x61, 0x43, 0x63, 0xc5, 0x29, 0x7e, 0xec, 0x2f, 0xa2, 0x0a, 0x5e, 0x6b, 0xa8, 0xf9, 0xd2, 0x1d, + 0x65, 0x7f, 0x29, 0x8b, 0x5d, 0xa0, 0x6a, 0xe3, 0xbf, 0x4c, 0x7c, 0xa2, 0xda, 0x0c, 0xf6, 0xab, + 0x59, 0xbe, 0x0e, 0xd0, 0xed, 0x45, 0x1f, 0xfa, 0xf5, 0x2c, 0x2f, 0x43, 0xbe, 0xdb, 0x23, 0x6e, + 0x3f, 0xca, 0xf2, 0x1b, 0xc0, 0xe2, 0xb7, 0x3a, 0xf1, 0xf1, 0xaf, 0xa9, 0xce, 0x44, 0x99, 0x8c, + 0x7f, 0x3d, 0x8b, 0xe3, 0x0a, 0x67, 0x99, 0xfd, 0x8d, 0x2c, 0x67, 0x50, 0x4e, 0x84, 0xe6, 0xd8, + 0xdf, 0xcc, 0x72, 0x0e, 0x95, 0x7d, 0x3b, 0x08, 0x6c, 0x77, 0xa0, 0x47, 0xf0, 0x6b, 0xf4, 0xe5, + 0x9d, 0xa8, 0xbc, 0x84, 0xfd, 0x46, 0x96, 0xdf, 0x02, 0x9e, 0xbc, 0x8e, 0xd0, 0x2f, 0xfe, 0x16, + 0x51, 0x2b, 0xb5, 0x1f, 0x68, 0xd8, 0xdf, 0x26, 0x6a, 0x94, 0x04, 0x0d, 0xf8, 0x4d, 0x9a, 0x90, + 0x66, 0x9c, 0x2a, 0xa9, 0xe1, 0x3f, 0x26, 0xe2, 0x70, 0x31, 0x15, 0xec, 0x27, 0xd9, 0xfb, 0x3f, + 0xa5, 0x70, 0x72, 0x32, 0xe3, 0x88, 0xaf, 0x42, 0xd1, 0xf1, 0xdc, 0x81, 0x54, 0x3f, 0x66, 0x59, + 0x81, 0x52, 0x30, 0xf4, 0x7c, 0x49, 0x4d, 0xaa, 0x7f, 0x73, 0xa9, 0x12, 0x5a, 0xe5, 0x96, 0x2b, + 0x27, 0x45, 0x85, 0xe7, 0xa4, 0x39, 0x60, 0xe5, 0x28, 0xc9, 0x33, 0x1b, 0x25, 0xa2, 0x52, 0x45, + 0x76, 0x58, 0xf1, 0xca, 0xf2, 0x88, 0x3a, 0xf1, 0x1d, 0x95, 0x90, 0x2a, 0xd0, 0x40, 0x55, 0xbf, + 0x5a, 0x37, 0x1e, 0xa2, 0x1d, 0x5c, 0x52, 0x50, 0xef, 0xfb, 0xb6, 0xaa, 0xa5, 0xd4, 0xf9, 0x5d, + 0x16, 0xf6, 0x23, 0x4a, 0x61, 0x60, 0xe2, 0xfe, 0xdf, 0x49, 0xc1, 0x6a, 0x58, 0x87, 0x6c, 0x0f, + 0x6c, 0x57, 0xa5, 0xb4, 0x86, 0x3f, 0x11, 0xda, 0x77, 0xec, 0x71, 0xf8, 0x93, 0x7b, 0xeb, 0x50, + 0xb6, 0x7c, 0x73, 0xd0, 0x70, 0xad, 0x6d, 0xdf, 0x1b, 0xab, 0x6e, 0xab, 0x0b, 0x27, 0x95, 0x4a, + 0xfb, 0x5c, 0x1c, 0x23, 0xfa, 0x58, 0xf8, 0x2c, 0x4b, 0xb9, 0x63, 0x43, 0xd3, 0xb7, 0xdd, 0x41, + 0xeb, 0x5c, 0x0a, 0x37, 0x50, 0x29, 0xb5, 0x65, 0x28, 0x4c, 0x02, 0xd1, 0x37, 0x03, 0xc1, 0xf2, + 0xd8, 0x38, 0x9e, 0xd8, 0x8e, 0xb4, 0x5d, 0xf5, 0x4b, 0x77, 0x51, 0xce, 0x6c, 0x11, 0x47, 0x66, + 0x8e, 0x6d, 0x56, 0xba, 0xff, 0x7b, 0x29, 0x28, 0x93, 0x58, 0xc4, 0x21, 0xd5, 0xd8, 0xe4, 0x28, + 0x43, 0x61, 0x2f, 0xfa, 0xc9, 0xb3, 0x3c, 0xa4, 0x3b, 0xa7, 0x2a, 0xa4, 0xaa, 0xc5, 0x42, 0x95, + 0x13, 0xaa, 0x5f, 0x3f, 0xcb, 0xf2, 0xcf, 0xc1, 0x0d, 0x43, 0x8c, 0x3c, 0x29, 0x9e, 0x99, 0xb6, + 0x4c, 0x16, 0x99, 0xe4, 0xd0, 0x3b, 0x51, 0xaf, 0xc2, 0xaa, 0x92, 0x3c, 0x79, 0x27, 0xf8, 0xd9, + 0x10, 0x52, 0xc0, 0xd1, 0x13, 0x44, 0xbb, 0x2b, 0xc5, 0x08, 0xe5, 0x23, 0xcf, 0x76, 0xf1, 0x6b, + 0x54, 0xc4, 0x4a, 0x10, 0x8a, 0xcd, 0x23, 0x08, 0xee, 0x1f, 0xc0, 0xcd, 0xc5, 0x11, 0x65, 0x55, + 0xde, 0x4a, 0xbf, 0xb3, 0x4b, 0x65, 0x07, 0xcf, 0x7c, 0x5b, 0x55, 0x29, 0x96, 0x20, 0xd7, 0x79, + 0xee, 0x92, 0x58, 0x6c, 0x40, 0xe5, 0xc0, 0x4b, 0xd0, 0xb0, 0xcc, 0xfd, 0xfe, 0xd4, 0x25, 0x40, + 0x3c, 0x29, 0x61, 0x27, 0x56, 0x12, 0x25, 0x35, 0x29, 0x15, 0x5e, 0xa6, 0x7f, 0x95, 0xa0, 0x4a, + 0xff, 0x75, 0xf0, 0xdd, 0x52, 0xa5, 0xff, 0x51, 0x37, 0xb3, 0xea, 0x37, 0x90, 0xdc, 0xbe, 0x70, + 0x84, 0xc5, 0x72, 0xf7, 0xdf, 0x83, 0x75, 0x3d, 0xd4, 0xbe, 0x08, 0x82, 0xb0, 0x24, 0xe5, 0xd0, + 0xb7, 0xcf, 0xd4, 0xcf, 0x0b, 0xac, 0x42, 0xf1, 0x50, 0xf8, 0x81, 0xe7, 0xd2, 0x4f, 0x2b, 0x00, + 0xe4, 0xbb, 0x43, 0xd3, 0xc7, 0x6f, 0xdc, 0x6f, 0x42, 0x89, 0x4a, 0x54, 0x1e, 0xdb, 0xae, 0x85, + 0x23, 0xd9, 0xd2, 0x89, 0xd8, 0xf4, 0x1b, 0x36, 0x67, 0x34, 0xbe, 0xa2, 0xfa, 0xb5, 0x4f, 0x96, + 0xe6, 0x37, 0x81, 0xa3, 0xf7, 0x3c, 0x32, 0xa9, 0x60, 0xd2, 0xb9, 0x50, 0xbf, 0x0c, 0x9b, 0xb9, + 0xff, 0x6d, 0xe0, 0x2a, 0x06, 0x64, 0x89, 0x73, 0xdb, 0x1d, 0x44, 0xb5, 0xd8, 0x40, 0x3f, 0xac, + 0x60, 0x89, 0xf3, 0xb0, 0xbe, 0x28, 0x6c, 0x84, 0x3f, 0xef, 0xb0, 0xe3, 0x4d, 0x5c, 0xec, 0xc5, + 0x53, 0xb8, 0xae, 0x64, 0x06, 0xbb, 0x45, 0xd5, 0x78, 0x97, 0x3a, 0xa6, 0xaa, 0xbe, 0x48, 0x4e, + 0x82, 0x08, 0x97, 0xa5, 0xb0, 0x63, 0x91, 0x53, 0x17, 0xc3, 0xd3, 0xf7, 0xeb, 0x70, 0x6d, 0x81, + 0x67, 0x4d, 0x5a, 0x5a, 0xf9, 0x17, 0x6c, 0xe5, 0xfe, 0x87, 0xb0, 0xa1, 0xf4, 0xca, 0x81, 0xaa, + 0x97, 0x0a, 0x8f, 0xc8, 0x67, 0xed, 0x9d, 0xb6, 0x9a, 0xba, 0x66, 0x6b, 0x6f, 0xef, 0xc9, 0x5e, + 0xc3, 0x60, 0x29, 0x5a, 0xe0, 0x4e, 0xef, 0xa8, 0xd9, 0x39, 0x38, 0x68, 0x35, 0x7b, 0xad, 0x6d, + 0x96, 0xde, 0xba, 0xff, 0x6f, 0x3f, 0xbd, 0x93, 0xfa, 0xd9, 0xa7, 0x77, 0x52, 0xff, 0xf5, 0xd3, + 0x3b, 0xa9, 0x1f, 0xfd, 0xfc, 0xce, 0xca, 0xcf, 0x7e, 0x7e, 0x67, 0xe5, 0x3f, 0xff, 0xfc, 0xce, + 0xca, 0x27, 0x6c, 0xf6, 0xdf, 0x97, 0x1c, 0xe7, 0xc9, 0xa4, 0x7d, 0xeb, 0xff, 0x06, 0x00, 0x00, + 0xff, 0xff, 0xb5, 0x87, 0x64, 0x2b, 0xd9, 0x64, 0x00, 0x00, } func (m *SmartBlockSnapshotBase) Marshal() (dAtA []byte, err error) { @@ -13027,6 +13095,29 @@ func (m *AccountInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } +func (m *AccountAuth) 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 *AccountAuth) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *AccountAuth) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + return len(dAtA) - i, nil +} + func (m *LinkPreview) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -17447,6 +17538,15 @@ func (m *AccountInfo) Size() (n int) { return n } +func (m *AccountAuth) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + return n +} + func (m *LinkPreview) Size() (n int) { if m == nil { return 0 @@ -26610,6 +26710,56 @@ func (m *AccountInfo) Unmarshal(dAtA []byte) error { } return nil } +func (m *AccountAuth) 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 ErrIntOverflowModels + } + 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: Auth: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Auth: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + default: + iNdEx = preIndex + skippy, err := skipModels(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthModels + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} func (m *LinkPreview) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 diff --git a/pkg/lib/pb/model/protos/models.proto b/pkg/lib/pb/model/protos/models.proto index 509f9045c..955f6546b 100644 --- a/pkg/lib/pb/model/protos/models.proto +++ b/pkg/lib/pb/model/protos/models.proto @@ -674,6 +674,14 @@ message Account { string networkId = 106; // network id to which anytype is connected } + message Auth { + enum LocalApiScope { + Limited = 0; // Used in WebClipper; AccountSelect(to be deprecated), ObjectSearch, ObjectShow, ObjectCreate, ObjectCreateFromURL, BlockPreview, BlockPaste, BroadcastPayloadEvent + JsonAPI = 1; // JSON API only, no direct grpc api calls allowed + Full = 2; // Full access, not available via LocalLink + } + } + } message LinkPreview { From 24ce41a310c7bbc1531568d35eac1ed2a550cbc9 Mon Sep 17 00:00:00 2001 From: Jannis Metrikat <120120832+jmetrikat@users.noreply.github.com> Date: Sun, 19 Jan 2025 13:16:15 +0100 Subject: [PATCH 119/195] GO-4642: Check token validity in ensureAuthenticated --- cmd/grpcserver/grpc.go | 2 +- core/api/server/middleware.go | 39 ++++++++++++++++++++++++------ core/api/server/router.go | 17 ++++++++----- core/api/server/server.go | 8 ++++-- core/api/service.go | 9 +++++-- core/core.go | 9 +++++++ core/interfaces/token_validator.go | 8 ++++++ 7 files changed, 74 insertions(+), 18 deletions(-) create mode 100644 core/interfaces/token_validator.go diff --git a/cmd/grpcserver/grpc.go b/cmd/grpcserver/grpc.go index 827fd3c39..085cf0ebe 100644 --- a/cmd/grpcserver/grpc.go +++ b/cmd/grpcserver/grpc.go @@ -226,7 +226,7 @@ func main() { }() startReportMemory(mw) - api.SetMiddlewareParams(mw) + api.SetMiddlewareParams(mw, mw) shutdown := func() { server.Stop() diff --git a/core/api/server/middleware.go b/core/api/server/middleware.go index bc8cb7312..9ff0aef53 100644 --- a/core/api/server/middleware.go +++ b/core/api/server/middleware.go @@ -4,6 +4,7 @@ import ( "context" "fmt" "net/http" + "strings" "github.com/anyproto/any-sync/app" "github.com/didip/tollbooth/v8" @@ -11,6 +12,9 @@ import ( "github.com/gin-gonic/gin" "github.com/anyproto/anytype-heart/core/anytype/account" + "github.com/anyproto/anytype-heart/core/interfaces" + "github.com/anyproto/anytype-heart/pb" + "github.com/anyproto/anytype-heart/pb/service" ) // rateLimit is a middleware that limits the number of requests per second. @@ -32,15 +36,36 @@ func (s *Server) rateLimit(max float64) gin.HandlerFunc { } // ensureAuthenticated is a middleware that ensures the request is authenticated. -func (s *Server) ensureAuthenticated() gin.HandlerFunc { +func (s *Server) ensureAuthenticated(mw service.ClientCommandsServer, tv interfaces.TokenValidator) gin.HandlerFunc { return func(c *gin.Context) { - // token := c.GetHeader("Authorization") - // if token == "" { - // c.AbortWithStatusJSON(http.StatusUnauthorized, gin.H{"error": "Unauthorized"}) - // return - // } + authHeader := c.GetHeader("Authorization") + if authHeader == "" { + c.AbortWithStatusJSON(http.StatusUnauthorized, gin.H{"error": "Missing Authorization header"}) + return + } + + if !strings.HasPrefix(authHeader, "Bearer ") { + c.AbortWithStatusJSON(http.StatusUnauthorized, gin.H{"error": "Invalid Authorization header format"}) + return + } + + key := strings.TrimPrefix(authHeader, "Bearer ") + token, exists := s.KeyToToken[key] + if !exists { + response := mw.WalletCreateSession(context.Background(), &pb.RpcWalletCreateSessionRequest{Auth: &pb.RpcWalletCreateSessionRequestAuthOfAppKey{AppKey: key}}) + if response.Error.Code != pb.RpcWalletCreateSessionResponseError_NULL { + c.AbortWithStatusJSON(http.StatusUnauthorized, gin.H{"error": "Failed to create session"}) + return + } + s.KeyToToken[key] = response.Token + } else { + _, err := tv.ValidateApiToken(token) + if err != nil { + c.AbortWithStatusJSON(http.StatusUnauthorized, gin.H{"error": "Invalid token"}) + return + } + } - // TODO: Validate the token and retrieve user information; this is mock example c.Next() } } diff --git a/core/api/server/router.go b/core/api/server/router.go index 67e1e0592..cbff45028 100644 --- a/core/api/server/router.go +++ b/core/api/server/router.go @@ -12,6 +12,8 @@ import ( "github.com/anyproto/anytype-heart/core/api/services/object" "github.com/anyproto/anytype-heart/core/api/services/search" "github.com/anyproto/anytype-heart/core/api/services/space" + "github.com/anyproto/anytype-heart/core/interfaces" + "github.com/anyproto/anytype-heart/pb/service" ) const ( @@ -23,7 +25,7 @@ const ( ) // NewRouter builds and returns a *gin.Engine with all routes configured. -func (s *Server) NewRouter(a *app.App) *gin.Engine { +func (s *Server) NewRouter(a *app.App, mw service.ClientCommandsServer, tv interfaces.TokenValidator) *gin.Engine { router := gin.Default() paginator := pagination.New(pagination.Config{ @@ -36,16 +38,19 @@ func (s *Server) NewRouter(a *app.App) *gin.Engine { // Swagger route router.GET("/swagger/*any", ginSwagger.WrapHandler(swaggerFiles.Handler)) + // Auth routes (no authentication required) + authGroup := router.Group("/v1/auth") + { + authGroup.POST("/display_code", auth.DisplayCodeHandler(s.authService)) + authGroup.POST("/token", auth.TokenHandler(s.authService)) + } + // API routes v1 := router.Group("/v1") v1.Use(paginator) - v1.Use(s.ensureAuthenticated()) + v1.Use(s.ensureAuthenticated(mw, tv)) v1.Use(s.ensureAccountInfo(a)) { - // Auth - v1.POST("/auth/display_code", auth.DisplayCodeHandler(s.authService)) - v1.POST("/auth/token", auth.TokenHandler(s.authService)) - // Export v1.POST("/spaces/:space_id/objects/:object_id/export/:format", export.GetObjectExportHandler(s.exportService)) diff --git a/core/api/server/server.go b/core/api/server/server.go index c6846a45c..ec096ce72 100644 --- a/core/api/server/server.go +++ b/core/api/server/server.go @@ -9,6 +9,7 @@ import ( "github.com/anyproto/anytype-heart/core/api/services/object" "github.com/anyproto/anytype-heart/core/api/services/search" "github.com/anyproto/anytype-heart/core/api/services/space" + "github.com/anyproto/anytype-heart/core/interfaces" "github.com/anyproto/anytype-heart/pb/service" ) @@ -21,10 +22,12 @@ type Server struct { objectService *object.ObjectService spaceService *space.SpaceService searchService *search.SearchService + + KeyToToken map[string]string // appKey -> token } // NewServer constructs a new Server with default config and sets up the routes. -func NewServer(a *app.App, mw service.ClientCommandsServer) *Server { +func NewServer(a *app.App, mw service.ClientCommandsServer, tv interfaces.TokenValidator) *Server { s := &Server{ authService: auth.NewService(mw), exportService: export.NewService(mw), @@ -33,7 +36,8 @@ func NewServer(a *app.App, mw service.ClientCommandsServer) *Server { s.objectService = object.NewService(mw, s.spaceService) s.searchService = search.NewService(mw, s.spaceService, s.objectService) - s.engine = s.NewRouter(a) + s.engine = s.NewRouter(a, mw, tv) + s.KeyToToken = make(map[string]string) return s } diff --git a/core/api/service.go b/core/api/service.go index 0b9cd6ea7..1aeaccacb 100644 --- a/core/api/service.go +++ b/core/api/service.go @@ -11,6 +11,7 @@ import ( "github.com/anyproto/any-sync/app" "github.com/anyproto/anytype-heart/core/api/server" + "github.com/anyproto/anytype-heart/core/interfaces" "github.com/anyproto/anytype-heart/pb/service" ) @@ -22,6 +23,7 @@ const ( var ( mwSrv service.ClientCommandsServer + tvInterface interfaces.TokenValidator ErrPortAlreadyUsed = fmt.Errorf("port %s is already in use", httpPort) ErrServerAlreadyStarted = fmt.Errorf("server already started") ErrServerNotStarted = fmt.Errorf("server not started") @@ -37,11 +39,13 @@ type apiService struct { srv *server.Server httpSrv *http.Server mw service.ClientCommandsServer + tv interfaces.TokenValidator } func New() Service { return &apiService{ mw: mwSrv, + tv: tvInterface, } } @@ -66,7 +70,7 @@ func (s *apiService) Name() (name string) { // @externalDocs.description OpenAPI // @externalDocs.url https://swagger.io/resources/open-api/ func (s *apiService) Init(a *app.App) (err error) { - s.srv = server.NewServer(a, s.mw) + s.srv = server.NewServer(a, s.mw, s.tv) return nil } @@ -151,6 +155,7 @@ func (s *apiService) Stop() error { return nil } -func SetMiddlewareParams(mw service.ClientCommandsServer) { +func SetMiddlewareParams(mw service.ClientCommandsServer, tv interfaces.TokenValidator) { mwSrv = mw + tvInterface = tv } diff --git a/core/core.go b/core/core.go index 394167770..563f6a2e7 100644 --- a/core/core.go +++ b/core/core.go @@ -11,9 +11,11 @@ import ( "github.com/anyproto/anytype-heart/core/block" "github.com/anyproto/anytype-heart/core/block/collection" "github.com/anyproto/anytype-heart/core/event" + "github.com/anyproto/anytype-heart/core/interfaces" "github.com/anyproto/anytype-heart/core/wallet" "github.com/anyproto/anytype-heart/pb" "github.com/anyproto/anytype-heart/pkg/lib/logging" + "github.com/anyproto/anytype-heart/pkg/lib/pb/model" utildebug "github.com/anyproto/anytype-heart/util/debug" ) @@ -126,3 +128,10 @@ func (mw *Middleware) SaveGoroutinesStack(path string) (err error) { } return utildebug.SaveStackToRepo(path, true) } + +// ValidateApiToken exposes ValidateToken logic from core to the JSON API +func (mw *Middleware) ValidateApiToken(token string) (model.AccountAuthLocalApiScope, error) { + return mw.applicationService.ValidateSessionToken(token) +} + +var _ interfaces.TokenValidator = (*Middleware)(nil) diff --git a/core/interfaces/token_validator.go b/core/interfaces/token_validator.go new file mode 100644 index 000000000..5248d2ff9 --- /dev/null +++ b/core/interfaces/token_validator.go @@ -0,0 +1,8 @@ +package interfaces + +import "github.com/anyproto/anytype-heart/pkg/lib/pb/model" + +// TokenValidator is an interface that exposes ValidateApiToken from core to avoid circular dependencies. +type TokenValidator interface { + ValidateApiToken(token string) (model.AccountAuthLocalApiScope, error) +} From 71494bc555e5e0e8883eec3bac769d98f23fb535 Mon Sep 17 00:00:00 2001 From: Jannis Metrikat <120120832+jmetrikat@users.noreply.github.com> Date: Sun, 19 Jan 2025 13:16:24 +0100 Subject: [PATCH 120/195] GO-4642: Limit the scope of tokens created through api endpoint --- core/api/services/auth/service.go | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/core/api/services/auth/service.go b/core/api/services/auth/service.go index 5d63e6712..33b3aecd6 100644 --- a/core/api/services/auth/service.go +++ b/core/api/services/auth/service.go @@ -6,6 +6,7 @@ import ( "github.com/anyproto/anytype-heart/pb" "github.com/anyproto/anytype-heart/pb/service" + "github.com/anyproto/anytype-heart/pkg/lib/pb/model" ) var ( @@ -34,7 +35,10 @@ func (s *AuthService) NewChallenge(ctx context.Context, appName string) (string, return "", ErrMissingAppName } - resp := s.mw.AccountLocalLinkNewChallenge(ctx, &pb.RpcAccountLocalLinkNewChallengeRequest{AppName: appName}) + resp := s.mw.AccountLocalLinkNewChallenge(ctx, &pb.RpcAccountLocalLinkNewChallengeRequest{ + AppName: appName, + Scope: model.AccountAuth_JsonAPI, + }) if resp.Error.Code != pb.RpcAccountLocalLinkNewChallengeResponseError_NULL { return "", ErrFailedGenerateChallenge @@ -43,7 +47,7 @@ func (s *AuthService) NewChallenge(ctx context.Context, appName string) (string, return resp.ChallengeId, nil } -// SolveChallengeForToken calls AccountLocalLinkSolveChallenge and returns the session token + app key, or an error if it fails. +// SolveChallenge calls AccountLocalLinkSolveChallenge and returns the session token + app key, or an error if it fails. func (s *AuthService) SolveChallenge(ctx context.Context, challengeId string, code string) (sessionToken string, appKey string, err error) { if challengeId == "" || code == "" { return "", "", ErrInvalidInput From b25dafeeefbd4a66ae95f016dcecaec1204c368a Mon Sep 17 00:00:00 2001 From: Jannis Metrikat <120120832+jmetrikat@users.noreply.github.com> Date: Sun, 19 Jan 2025 13:34:14 +0100 Subject: [PATCH 121/195] GO-4459: Remove rpc to start and stop api server --- clientlibrary/service/service.pb.go | 752 ++-- core/api.go | 41 - core/api/service.go | 69 +- docs/proto.md | 154 - pb/commands.pb.go | 3887 ++++++----------- pb/protos/commands.proto | 47 - pb/protos/service/service.proto | 5 - .../mock_service/mock_ClientCommandsServer.go | 98 - pb/service/service.pb.go | 752 ++-- 9 files changed, 1904 insertions(+), 3901 deletions(-) delete mode 100644 core/api.go diff --git a/clientlibrary/service/service.pb.go b/clientlibrary/service/service.pb.go index 3d84fcfeb..cbd21b09e 100644 --- a/clientlibrary/service/service.pb.go +++ b/clientlibrary/service/service.pb.go @@ -25,345 +25,343 @@ const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package func init() { proto.RegisterFile("pb/protos/service/service.proto", fileDescriptor_93a29dc403579097) } var fileDescriptor_93a29dc403579097 = []byte{ - // 5406 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x9d, 0xdf, 0x6f, 0x1d, 0x49, - 0x56, 0xf8, 0xc7, 0x2f, 0xdf, 0xf9, 0xd2, 0xcb, 0x0e, 0x70, 0x07, 0x86, 0xd9, 0x61, 0x37, 0xc9, - 0x64, 0x12, 0x3b, 0x89, 0xe3, 0xeb, 0x4c, 0x32, 0x3f, 0x56, 0xbb, 0x48, 0xc8, 0xb1, 0x13, 0x8f, - 0x59, 0xdb, 0x31, 0xbe, 0xd7, 0x89, 0x34, 0x12, 0x12, 0xe5, 0x7b, 0xcb, 0xd7, 0x8d, 0xfb, 0x76, - 0xf5, 0x76, 0xd7, 0xbd, 0xce, 0x5d, 0x04, 0x02, 0x81, 0x40, 0x20, 0x10, 0x2b, 0x7e, 0xbd, 0x22, - 0xf1, 0xc4, 0x9f, 0xc2, 0xe3, 0x3e, 0xf2, 0x88, 0x66, 0xfe, 0x00, 0xfe, 0x05, 0xd4, 0xd5, 0xf5, - 0xf3, 0xf4, 0x39, 0xd5, 0xed, 0x7d, 0x4a, 0xe4, 0xf3, 0x39, 0xe7, 0x54, 0x75, 0x55, 0x9d, 0x3a, - 0x55, 0x5d, 0x5d, 0x37, 0xb9, 0x5d, 0x9c, 0x6f, 0x17, 0xa5, 0x90, 0xa2, 0xda, 0xae, 0x78, 0xb9, - 0x4c, 0x27, 0xdc, 0xfc, 0x3b, 0x54, 0x7f, 0x1e, 0xbc, 0xcb, 0xf2, 0x95, 0x5c, 0x15, 0xfc, 0xa3, - 0x0f, 0x1d, 0x39, 0x11, 0xf3, 0x39, 0xcb, 0xa7, 0x55, 0x83, 0x7c, 0xf4, 0x81, 0x93, 0xf0, 0x25, - 0xcf, 0xa5, 0xfe, 0xfb, 0xd3, 0xff, 0xfc, 0xdf, 0xb5, 0xe4, 0xbd, 0xdd, 0x2c, 0xe5, 0xb9, 0xdc, - 0xd5, 0x1a, 0x83, 0xaf, 0x93, 0xef, 0xee, 0x14, 0xc5, 0x3e, 0x97, 0xaf, 0x79, 0x59, 0xa5, 0x22, - 0x1f, 0x7c, 0x32, 0xd4, 0x0e, 0x86, 0xa7, 0xc5, 0x64, 0xb8, 0x53, 0x14, 0x43, 0x27, 0x1c, 0x9e, - 0xf2, 0x9f, 0x2e, 0x78, 0x25, 0x3f, 0xba, 0x17, 0x87, 0xaa, 0x42, 0xe4, 0x15, 0x1f, 0x5c, 0x24, - 0xbf, 0xb1, 0x53, 0x14, 0x23, 0x2e, 0xf7, 0x78, 0x5d, 0x81, 0x91, 0x64, 0x92, 0x0f, 0x36, 0x5a, - 0xaa, 0x21, 0x60, 0x7d, 0x3c, 0xe8, 0x06, 0xb5, 0x9f, 0x71, 0xf2, 0x9d, 0xda, 0xcf, 0xe5, 0x42, - 0x4e, 0xc5, 0x75, 0x3e, 0xf8, 0xb8, 0xad, 0xa8, 0x45, 0xd6, 0xf6, 0xdd, 0x18, 0xa2, 0xad, 0xbe, - 0x49, 0x7e, 0xf5, 0x0d, 0xcb, 0x32, 0x2e, 0x77, 0x4b, 0x5e, 0x17, 0x3c, 0xd4, 0x69, 0x44, 0xc3, - 0x46, 0x66, 0xed, 0x7e, 0x12, 0x65, 0xb4, 0xe1, 0xaf, 0x93, 0xef, 0x36, 0x92, 0x53, 0x3e, 0x11, - 0x4b, 0x5e, 0x0e, 0x50, 0x2d, 0x2d, 0x24, 0x1e, 0x79, 0x0b, 0x82, 0xb6, 0x77, 0x45, 0xbe, 0xe4, - 0xa5, 0xc4, 0x6d, 0x6b, 0x61, 0xdc, 0xb6, 0x83, 0xb4, 0xed, 0xbf, 0x5d, 0x4b, 0xbe, 0xbf, 0x33, - 0x99, 0x88, 0x45, 0x2e, 0x0f, 0xc5, 0x84, 0x65, 0x87, 0x69, 0x7e, 0x75, 0xcc, 0xaf, 0x77, 0x2f, - 0x6b, 0x3e, 0x9f, 0xf1, 0xc1, 0xb3, 0xf0, 0xa9, 0x36, 0xe8, 0xd0, 0xb2, 0x43, 0x1f, 0xb6, 0xbe, - 0x3f, 0xbb, 0x99, 0x92, 0x2e, 0xcb, 0x3f, 0xae, 0x25, 0xb7, 0x60, 0x59, 0x46, 0x22, 0x5b, 0x72, - 0x57, 0x9a, 0xcf, 0x3b, 0x0c, 0x87, 0xb8, 0x2d, 0xcf, 0x17, 0x37, 0x55, 0xd3, 0x25, 0xca, 0x92, - 0xf7, 0xfd, 0xee, 0x32, 0xe2, 0x95, 0x1a, 0x4e, 0x0f, 0xe9, 0x1e, 0xa1, 0x11, 0xeb, 0xf9, 0x51, - 0x1f, 0x54, 0x7b, 0x4b, 0x93, 0x81, 0xf6, 0x96, 0x89, 0xca, 0x3a, 0x7b, 0x80, 0x5a, 0xf0, 0x08, - 0xeb, 0xeb, 0x61, 0x0f, 0x52, 0xbb, 0xfa, 0xa3, 0xe4, 0xd7, 0xde, 0x88, 0xf2, 0xaa, 0x2a, 0xd8, - 0x84, 0xeb, 0xa1, 0x70, 0x3f, 0xd4, 0x36, 0x52, 0x38, 0x1a, 0xd6, 0xbb, 0x30, 0xaf, 0xd3, 0x1a, - 0xe1, 0xab, 0x82, 0xc3, 0x18, 0xe4, 0x14, 0x6b, 0x21, 0xd5, 0x69, 0x21, 0xa4, 0x6d, 0x5f, 0x25, - 0x03, 0x67, 0xfb, 0xfc, 0x8f, 0xf9, 0x44, 0xee, 0x4c, 0xa7, 0xb0, 0x55, 0x9c, 0xae, 0x22, 0x86, - 0x3b, 0xd3, 0x29, 0xd5, 0x2a, 0x38, 0xaa, 0x9d, 0x5d, 0x27, 0x1f, 0x00, 0x67, 0x87, 0x69, 0xa5, - 0x1c, 0x6e, 0xc5, 0xad, 0x68, 0xcc, 0x3a, 0x1d, 0xf6, 0xc5, 0xb5, 0xe3, 0x3f, 0x5f, 0x4b, 0xbe, - 0x87, 0x78, 0x3e, 0xe5, 0x73, 0xb1, 0xe4, 0x83, 0x27, 0xdd, 0xd6, 0x1a, 0xd2, 0xfa, 0xff, 0xf4, - 0x06, 0x1a, 0x48, 0x37, 0x19, 0xf1, 0x8c, 0x4f, 0x24, 0xd9, 0x4d, 0x1a, 0x71, 0x67, 0x37, 0xb1, - 0x98, 0x37, 0xc2, 0x8c, 0x70, 0x9f, 0xcb, 0xdd, 0x45, 0x59, 0xf2, 0x5c, 0x92, 0x6d, 0xe9, 0x90, - 0xce, 0xb6, 0x0c, 0x50, 0xa4, 0x3e, 0xfb, 0x5c, 0xee, 0x64, 0x19, 0x59, 0x9f, 0x46, 0xdc, 0x59, - 0x1f, 0x8b, 0x69, 0x0f, 0x93, 0xe4, 0xd7, 0xbd, 0x27, 0x26, 0x0f, 0xf2, 0x0b, 0x31, 0xa0, 0x9f, - 0x85, 0x92, 0x5b, 0x1f, 0x1b, 0x9d, 0x1c, 0x52, 0x8d, 0x17, 0x6f, 0x0b, 0x51, 0xd2, 0xcd, 0xd2, - 0x88, 0x3b, 0xab, 0x61, 0x31, 0xed, 0xe1, 0x0f, 0x93, 0xf7, 0x74, 0x94, 0x34, 0xf3, 0xd9, 0x3d, - 0x34, 0x84, 0xc2, 0x09, 0xed, 0x7e, 0x07, 0xe5, 0x82, 0x83, 0x96, 0xe9, 0xe0, 0xf3, 0x09, 0xaa, - 0x07, 0x42, 0xcf, 0xbd, 0x38, 0xd4, 0xb2, 0xbd, 0xc7, 0x33, 0x4e, 0xda, 0x6e, 0x84, 0x1d, 0xb6, - 0x2d, 0xa4, 0x6d, 0x97, 0xc9, 0x6f, 0xd9, 0xc7, 0x52, 0xcf, 0xa3, 0x4a, 0x5e, 0x07, 0xe9, 0x4d, - 0xa2, 0xde, 0x3e, 0x64, 0x7d, 0x3d, 0xee, 0x07, 0xb7, 0xea, 0xa3, 0x47, 0x20, 0x5e, 0x1f, 0x30, - 0xfe, 0xee, 0xc5, 0x21, 0x6d, 0xfb, 0xef, 0xd6, 0x92, 0x1f, 0x68, 0xd9, 0x8b, 0x9c, 0x9d, 0x67, - 0x5c, 0x4d, 0x89, 0xc7, 0x5c, 0x5e, 0x8b, 0xf2, 0x6a, 0xb4, 0xca, 0x27, 0xc4, 0xf4, 0x8f, 0xc3, - 0x1d, 0xd3, 0x3f, 0xa9, 0xe4, 0x65, 0x7c, 0xba, 0xa2, 0x52, 0x14, 0x30, 0xe3, 0x33, 0x35, 0x90, - 0xa2, 0xa0, 0x32, 0xbe, 0x10, 0x69, 0x59, 0x3d, 0xaa, 0xc3, 0x26, 0x6e, 0xf5, 0xc8, 0x8f, 0x93, - 0x77, 0x63, 0x88, 0x0b, 0x5b, 0xa6, 0x03, 0x8b, 0xfc, 0x22, 0x9d, 0x9d, 0x15, 0xd3, 0xba, 0x1b, - 0x3f, 0xc4, 0x7b, 0xa8, 0x87, 0x10, 0x61, 0x8b, 0x40, 0xb5, 0xb7, 0x7f, 0x70, 0x89, 0x91, 0x1e, - 0x4a, 0x2f, 0x4b, 0x31, 0x3f, 0xe4, 0x33, 0x36, 0x59, 0xe9, 0xf1, 0xff, 0x59, 0x6c, 0xe0, 0x41, - 0xda, 0x16, 0xe2, 0xf3, 0x1b, 0x6a, 0xe9, 0xf2, 0xfc, 0xfb, 0x5a, 0x72, 0xcf, 0x54, 0xff, 0x92, - 0xe5, 0x33, 0xae, 0xdb, 0xb3, 0x29, 0xfd, 0x4e, 0x3e, 0x3d, 0xe5, 0x95, 0x64, 0xa5, 0x1c, 0xfc, - 0x08, 0xaf, 0x64, 0x4c, 0xc7, 0x96, 0xed, 0xc7, 0xbf, 0x94, 0xae, 0x6b, 0xf5, 0x51, 0x1d, 0xd8, - 0x74, 0x08, 0x08, 0x5b, 0x5d, 0x49, 0x60, 0x00, 0xb8, 0x1b, 0x43, 0x5c, 0xab, 0x2b, 0xc1, 0x41, - 0xbe, 0x4c, 0x25, 0xdf, 0xe7, 0x39, 0x2f, 0xdb, 0xad, 0xde, 0xa8, 0x86, 0x08, 0xd1, 0xea, 0x04, - 0xea, 0x82, 0x4d, 0xe0, 0xcd, 0x4e, 0x8e, 0x9b, 0x11, 0x23, 0xad, 0xe9, 0xf1, 0x71, 0x3f, 0xd8, - 0xad, 0xee, 0x3c, 0x9f, 0xa7, 0x7c, 0x29, 0xae, 0xe0, 0xea, 0xce, 0x37, 0xd1, 0x00, 0xc4, 0xea, - 0x0e, 0x05, 0xdd, 0x0c, 0xe6, 0xf9, 0x79, 0x9d, 0xf2, 0x6b, 0x30, 0x83, 0xf9, 0xca, 0xb5, 0x98, - 0x98, 0xc1, 0x10, 0x4c, 0x7b, 0x38, 0x4e, 0x7e, 0x45, 0x09, 0x7f, 0x5f, 0xa4, 0xf9, 0xe0, 0x36, - 0xa2, 0x54, 0x0b, 0xac, 0xd5, 0x3b, 0x34, 0x00, 0x4a, 0x5c, 0xff, 0x75, 0x97, 0xe5, 0x13, 0x9e, - 0xa1, 0x25, 0x76, 0xe2, 0x68, 0x89, 0x03, 0xcc, 0xa5, 0x0e, 0x4a, 0x58, 0xc7, 0xaf, 0xd1, 0x25, - 0x2b, 0xd3, 0x7c, 0x36, 0xc0, 0x74, 0x3d, 0x39, 0x91, 0x3a, 0x60, 0x1c, 0xe8, 0xc2, 0x5a, 0x71, - 0xa7, 0x28, 0xca, 0x3a, 0x2c, 0x62, 0x5d, 0x38, 0x44, 0xa2, 0x5d, 0xb8, 0x85, 0xe2, 0xde, 0xf6, - 0xf8, 0x24, 0x4b, 0xf3, 0xa8, 0x37, 0x8d, 0xf4, 0xf1, 0xe6, 0x50, 0xd0, 0x79, 0x0f, 0x39, 0x5b, - 0x72, 0x53, 0x33, 0xec, 0xc9, 0xf8, 0x40, 0xb4, 0xf3, 0x02, 0xd0, 0xad, 0xd3, 0x94, 0xf8, 0x88, - 0x5d, 0xf1, 0xfa, 0x01, 0xf3, 0x7a, 0x5e, 0x1b, 0x60, 0xfa, 0x01, 0x41, 0xac, 0xd3, 0x70, 0x52, - 0xbb, 0x5a, 0x24, 0x1f, 0x28, 0xf9, 0x09, 0x2b, 0x65, 0x3a, 0x49, 0x0b, 0x96, 0x9b, 0xfc, 0x1f, - 0x1b, 0xd7, 0x2d, 0xca, 0xba, 0xdc, 0xea, 0x49, 0x6b, 0xb7, 0xff, 0xb6, 0x96, 0x7c, 0x0c, 0xfd, - 0x9e, 0xf0, 0x72, 0x9e, 0xaa, 0x65, 0x64, 0xd5, 0x04, 0xe1, 0xc1, 0x97, 0x71, 0xa3, 0x2d, 0x05, - 0x5b, 0x9a, 0x1f, 0xde, 0x5c, 0xd1, 0x25, 0x43, 0x23, 0x9d, 0x5a, 0xbf, 0x2a, 0xa7, 0xad, 0x6d, - 0x96, 0x91, 0xc9, 0x97, 0x95, 0x90, 0x48, 0x86, 0x5a, 0x10, 0x18, 0xe1, 0x67, 0x79, 0x65, 0xac, - 0x63, 0x23, 0xdc, 0x89, 0xa3, 0x23, 0x3c, 0xc0, 0xdc, 0x08, 0x3f, 0x59, 0x9c, 0x67, 0x69, 0x75, - 0x99, 0xe6, 0x33, 0x9d, 0xf9, 0x86, 0xba, 0x4e, 0x0c, 0x93, 0xdf, 0x8d, 0x4e, 0x0e, 0x73, 0xa2, - 0x3b, 0x0b, 0xe9, 0x04, 0x74, 0x93, 0x8d, 0x4e, 0xce, 0xad, 0x0f, 0x9c, 0xb4, 0x5e, 0x39, 0x82, - 0xf5, 0x81, 0xa7, 0x5a, 0x4b, 0x89, 0xf5, 0x41, 0x9b, 0xd2, 0xe6, 0x45, 0xf2, 0x9b, 0x7e, 0x1d, - 0x2a, 0x91, 0x2d, 0xf9, 0x59, 0x99, 0x0e, 0x1e, 0xd1, 0xe5, 0x33, 0x8c, 0x75, 0xb5, 0xd9, 0x8b, - 0x75, 0x81, 0xca, 0x11, 0xfb, 0x5c, 0x8e, 0x24, 0x93, 0x8b, 0x0a, 0x04, 0x2a, 0xcf, 0x86, 0x45, - 0x88, 0x40, 0x45, 0xa0, 0xda, 0xdb, 0x1f, 0x24, 0x49, 0xb3, 0xe8, 0x56, 0x1b, 0x23, 0xe1, 0xdc, - 0xa3, 0x57, 0xe3, 0xc1, 0xae, 0xc8, 0xc7, 0x11, 0xc2, 0x25, 0x3c, 0xcd, 0xdf, 0xd5, 0x7e, 0xcf, - 0x00, 0xd5, 0x50, 0x22, 0x22, 0xe1, 0x01, 0x08, 0x2c, 0xe8, 0xe8, 0x52, 0x5c, 0xe3, 0x05, 0xad, - 0x25, 0xf1, 0x82, 0x6a, 0xc2, 0xed, 0xc0, 0xea, 0x82, 0x62, 0x3b, 0xb0, 0xa6, 0x18, 0xb1, 0x1d, - 0x58, 0xc8, 0xb8, 0x3e, 0xe3, 0x1b, 0x7e, 0x2e, 0xc4, 0xd5, 0x9c, 0x95, 0x57, 0xa0, 0xcf, 0x04, - 0xca, 0x86, 0x21, 0xfa, 0x0c, 0xc5, 0xba, 0x3e, 0xe3, 0x3b, 0xac, 0xd3, 0xe5, 0xb3, 0x32, 0x03, - 0x7d, 0x26, 0xb0, 0xa1, 0x11, 0xa2, 0xcf, 0x10, 0xa8, 0x8b, 0x4e, 0xbe, 0xb7, 0x11, 0x87, 0x6b, - 0xfe, 0x40, 0x7d, 0xc4, 0xa9, 0x35, 0x3f, 0x82, 0xc1, 0x2e, 0xb4, 0x5f, 0xb2, 0xe2, 0x12, 0xef, - 0x42, 0x4a, 0x14, 0xef, 0x42, 0x06, 0x81, 0xed, 0x3d, 0xe2, 0xac, 0x9c, 0x5c, 0xe2, 0xed, 0xdd, - 0xc8, 0xe2, 0xed, 0x6d, 0x19, 0xd8, 0xde, 0x8d, 0xe0, 0x4d, 0x2a, 0x2f, 0x8f, 0xb8, 0x64, 0x78, - 0x7b, 0x87, 0x4c, 0xbc, 0xbd, 0x5b, 0xac, 0xcb, 0xc7, 0x7d, 0x87, 0xa3, 0xc5, 0x79, 0x35, 0x29, - 0xd3, 0x73, 0x3e, 0x88, 0x58, 0xb1, 0x10, 0x91, 0x8f, 0x93, 0xb0, 0xf6, 0xf9, 0xf3, 0xb5, 0xe4, - 0xb6, 0x69, 0x76, 0x51, 0x55, 0x7a, 0xee, 0x0b, 0xdd, 0x7f, 0x8e, 0xb7, 0x2f, 0x81, 0x13, 0x7b, - 0xe2, 0x3d, 0xd4, 0xbc, 0xdc, 0x00, 0x2f, 0xd2, 0x59, 0x5e, 0xd9, 0x42, 0x7d, 0xd9, 0xc7, 0xba, - 0xa7, 0x40, 0xe4, 0x06, 0xbd, 0x14, 0x5d, 0x5a, 0xa6, 0xdb, 0xc7, 0xc8, 0x0e, 0xa6, 0x15, 0x48, - 0xcb, 0xcc, 0xf3, 0xf6, 0x08, 0x22, 0x2d, 0xc3, 0x49, 0xd8, 0x15, 0xf6, 0x4b, 0xb1, 0x28, 0xaa, - 0x8e, 0xae, 0x00, 0xa0, 0x78, 0x57, 0x68, 0xc3, 0xda, 0xe7, 0xdb, 0xe4, 0xb7, 0xfd, 0xee, 0xe7, - 0x3f, 0xec, 0x2d, 0xba, 0x4f, 0x61, 0x8f, 0x78, 0xd8, 0x17, 0x77, 0x19, 0x85, 0xf1, 0x2c, 0xf7, - 0xb8, 0x64, 0x69, 0x56, 0x0d, 0xd6, 0x71, 0x1b, 0x46, 0x4e, 0x64, 0x14, 0x18, 0x07, 0xe3, 0xdb, - 0xde, 0xa2, 0xc8, 0xd2, 0x49, 0xfb, 0x8d, 0x84, 0xd6, 0xb5, 0xe2, 0x78, 0x7c, 0xf3, 0x31, 0x18, - 0xaf, 0xeb, 0xd4, 0x4f, 0xfd, 0x67, 0xbc, 0x2a, 0x38, 0x1e, 0xaf, 0x03, 0x24, 0x1e, 0xaf, 0x21, - 0x0a, 0xeb, 0x33, 0xe2, 0xf2, 0x90, 0xad, 0xc4, 0x82, 0x88, 0xd7, 0x56, 0x1c, 0xaf, 0x8f, 0x8f, - 0xb9, 0xb5, 0x81, 0xf5, 0x70, 0x90, 0x4b, 0x5e, 0xe6, 0x2c, 0x7b, 0x99, 0xb1, 0x59, 0x35, 0x20, - 0x62, 0x4c, 0x48, 0x11, 0x6b, 0x03, 0x9a, 0x46, 0x1e, 0xe3, 0x41, 0xf5, 0x92, 0x2d, 0x45, 0x99, - 0x4a, 0xfa, 0x31, 0x3a, 0xa4, 0xf3, 0x31, 0x06, 0x28, 0xea, 0x6d, 0xa7, 0x9c, 0x5c, 0xa6, 0x4b, - 0x3e, 0x8d, 0x78, 0x33, 0x48, 0x0f, 0x6f, 0x1e, 0x8a, 0x34, 0xda, 0x48, 0x2c, 0xca, 0x09, 0x27, - 0x1b, 0xad, 0x11, 0x77, 0x36, 0x9a, 0xc5, 0xb4, 0x87, 0xbf, 0x5a, 0x4b, 0x7e, 0xa7, 0x91, 0xfa, - 0xaf, 0x09, 0xf6, 0x58, 0x75, 0x79, 0x2e, 0x58, 0x39, 0x1d, 0x7c, 0x8a, 0xd9, 0x41, 0x51, 0xeb, - 0xfa, 0xe9, 0x4d, 0x54, 0xe0, 0x63, 0xad, 0xf3, 0x6e, 0x37, 0xe2, 0xd0, 0xc7, 0x1a, 0x20, 0xf1, - 0xc7, 0x0a, 0x51, 0x18, 0x40, 0x94, 0xbc, 0xd9, 0x92, 0x5b, 0x27, 0xf5, 0xc3, 0x7d, 0xb9, 0x8d, - 0x4e, 0x0e, 0xc6, 0xc7, 0x5a, 0x18, 0xf6, 0x96, 0x2d, 0xca, 0x06, 0xde, 0x63, 0x86, 0x7d, 0x71, - 0xd2, 0xb3, 0x1d, 0x15, 0x71, 0xcf, 0xad, 0x91, 0x31, 0xec, 0x8b, 0x13, 0x9e, 0xbd, 0xb0, 0x16, - 0xf3, 0x8c, 0x84, 0xb6, 0x61, 0x5f, 0x1c, 0x66, 0x5f, 0x9a, 0x31, 0xf3, 0xc2, 0xa3, 0x88, 0x1d, - 0x38, 0x37, 0x6c, 0xf6, 0x62, 0xb5, 0xc3, 0xbf, 0x59, 0x4b, 0xbe, 0xef, 0x3c, 0x1e, 0x89, 0x69, - 0x7a, 0xb1, 0x6a, 0xa0, 0xd7, 0x2c, 0x5b, 0xf0, 0x6a, 0xf0, 0x94, 0xb2, 0xd6, 0x66, 0x6d, 0x09, - 0x9e, 0xdd, 0x48, 0x07, 0x8e, 0x9d, 0x9d, 0xa2, 0xc8, 0x56, 0x63, 0x3e, 0x2f, 0x32, 0x72, 0xec, - 0x04, 0x48, 0x7c, 0xec, 0x40, 0x14, 0x66, 0xe5, 0x63, 0x51, 0xe7, 0xfc, 0x68, 0x56, 0xae, 0x44, - 0xf1, 0xac, 0xdc, 0x20, 0x30, 0x57, 0x1a, 0x8b, 0x5d, 0x91, 0x65, 0x7c, 0x22, 0xdb, 0x47, 0x0d, - 0xac, 0xa6, 0x23, 0xe2, 0xb9, 0x12, 0x20, 0xdd, 0xae, 0x9c, 0x59, 0x43, 0xb2, 0x92, 0x3f, 0x5f, - 0x1d, 0xa6, 0xf9, 0xd5, 0x00, 0x4f, 0x0b, 0x1c, 0x40, 0xec, 0xca, 0xa1, 0x20, 0x5c, 0xab, 0x9e, - 0xe5, 0x53, 0x81, 0xaf, 0x55, 0x6b, 0x49, 0x7c, 0xad, 0xaa, 0x09, 0x68, 0xf2, 0x94, 0x53, 0x26, - 0x6b, 0x49, 0xdc, 0xa4, 0x26, 0xb0, 0x50, 0xa8, 0xdf, 0xdd, 0x90, 0xa1, 0x10, 0xbc, 0xad, 0xd9, - 0xe8, 0xe4, 0x60, 0x0f, 0x35, 0x8b, 0xd6, 0x97, 0x5c, 0x4e, 0x2e, 0xf1, 0x1e, 0x1a, 0x20, 0xf1, - 0x1e, 0x0a, 0x51, 0x58, 0xa5, 0xb1, 0xb0, 0x8b, 0xee, 0x75, 0xbc, 0x7f, 0xb4, 0x16, 0xdc, 0x1b, - 0x9d, 0x1c, 0x5c, 0x46, 0x1e, 0xcc, 0xd5, 0x33, 0x43, 0x3b, 0x79, 0x23, 0x8b, 0x2f, 0x23, 0x2d, - 0x03, 0x4b, 0xdf, 0x08, 0xd4, 0x5e, 0xd6, 0x3a, 0xad, 0x18, 0xec, 0x66, 0x6d, 0x74, 0x72, 0xda, - 0xc9, 0xbf, 0xd8, 0x65, 0x5c, 0x23, 0x3d, 0x16, 0xf5, 0x18, 0x79, 0xcd, 0xb2, 0x74, 0xca, 0x24, - 0x1f, 0x8b, 0x2b, 0x9e, 0xe3, 0x2b, 0x26, 0x5d, 0xda, 0x86, 0x1f, 0x06, 0x0a, 0xf1, 0x15, 0x53, - 0x5c, 0x11, 0xf6, 0x93, 0x86, 0x3e, 0xab, 0xf8, 0x2e, 0xab, 0x88, 0x48, 0x16, 0x20, 0xf1, 0x7e, - 0x02, 0x51, 0x98, 0xaf, 0x36, 0xf2, 0x17, 0x6f, 0x0b, 0x5e, 0xa6, 0x3c, 0x9f, 0x70, 0x3c, 0x5f, - 0x85, 0x54, 0x3c, 0x5f, 0x45, 0x68, 0xb8, 0x56, 0xdb, 0x63, 0x92, 0x3f, 0x5f, 0x8d, 0xd3, 0x39, - 0xaf, 0x24, 0x9b, 0x17, 0xf8, 0x5a, 0x0d, 0x40, 0xf1, 0xb5, 0x5a, 0x1b, 0x6e, 0x6d, 0x0d, 0xd9, - 0x80, 0xd8, 0x3e, 0xa1, 0x04, 0x89, 0xc8, 0x09, 0x25, 0x02, 0x85, 0x0f, 0xd6, 0x01, 0xe8, 0x4b, - 0x82, 0x96, 0x95, 0xe8, 0x4b, 0x02, 0x9a, 0x6e, 0x6d, 0xb8, 0x59, 0x66, 0x54, 0x0f, 0xcd, 0x8e, - 0xa2, 0x8f, 0xfc, 0x21, 0xba, 0xd9, 0x8b, 0xc5, 0x77, 0xf8, 0x4e, 0x79, 0xc6, 0xd4, 0xb4, 0x15, - 0xd9, 0x46, 0x33, 0x4c, 0x9f, 0x1d, 0x3e, 0x8f, 0xd5, 0x0e, 0xff, 0x62, 0x2d, 0xf9, 0x08, 0xf3, - 0xf8, 0xaa, 0x50, 0x7e, 0x9f, 0x74, 0xdb, 0x6a, 0x48, 0xe2, 0x08, 0x56, 0x5c, 0x43, 0x97, 0xe1, - 0x4f, 0x92, 0x0f, 0x8d, 0xc8, 0x9d, 0xd0, 0xd2, 0x05, 0x08, 0x93, 0x36, 0x5b, 0x7e, 0xc8, 0x59, - 0xf7, 0xdb, 0xbd, 0x79, 0xb7, 0x1e, 0x0a, 0xcb, 0x55, 0x81, 0xf5, 0x90, 0xb5, 0xa1, 0xc5, 0xc4, - 0x7a, 0x08, 0xc1, 0xdc, 0xe8, 0xf4, 0xab, 0xf7, 0x26, 0x95, 0x97, 0x2a, 0xdf, 0x02, 0xa3, 0x33, - 0x28, 0xab, 0x85, 0x88, 0xd1, 0x49, 0xc2, 0x30, 0x23, 0x31, 0x60, 0x3d, 0x36, 0xb1, 0x58, 0x6e, - 0x0d, 0xf9, 0x23, 0xf3, 0x41, 0x37, 0x08, 0xfb, 0xab, 0x11, 0xeb, 0xa5, 0xcf, 0xa3, 0x98, 0x05, - 0xb0, 0xfc, 0xd9, 0xec, 0xc5, 0x6a, 0x87, 0x7f, 0x96, 0x7c, 0xaf, 0x55, 0xb1, 0x97, 0x9c, 0xc9, - 0x45, 0xc9, 0xa7, 0x83, 0xed, 0x8e, 0x72, 0x1b, 0xd0, 0xba, 0x7e, 0xd2, 0x5f, 0xa1, 0x95, 0xa3, - 0x1b, 0xae, 0xe9, 0x56, 0xb6, 0x0c, 0x4f, 0x63, 0x26, 0x43, 0x36, 0x9a, 0xa3, 0xd3, 0x3a, 0xad, - 0x65, 0xb6, 0xdf, 0xbb, 0x76, 0x96, 0x2c, 0xcd, 0xd4, 0xcb, 0xda, 0x4f, 0x63, 0x46, 0x03, 0x34, - 0xba, 0xcc, 0x26, 0x55, 0x5a, 0x91, 0x59, 0x8d, 0x71, 0x6f, 0x79, 0xf6, 0x98, 0x8e, 0x04, 0xc8, - 0xea, 0x6c, 0xab, 0x27, 0xad, 0xdd, 0x4a, 0x33, 0xe5, 0xd5, 0x7f, 0xf6, 0x3b, 0x39, 0xe6, 0x55, - 0xab, 0x22, 0x3d, 0x7d, 0xab, 0x27, 0xad, 0xbd, 0xfe, 0x69, 0xf2, 0x61, 0xdb, 0xab, 0x9e, 0x88, - 0xb6, 0x3b, 0x4d, 0x81, 0xb9, 0xe8, 0x49, 0x7f, 0x05, 0xb7, 0xa4, 0xf9, 0x2a, 0xad, 0xa4, 0x28, - 0x57, 0xa3, 0x4b, 0x71, 0x6d, 0xbe, 0x7c, 0x08, 0x47, 0xab, 0x06, 0x86, 0x1e, 0x41, 0x2c, 0x69, - 0x70, 0xb2, 0xe5, 0xca, 0x7d, 0x21, 0x51, 0x11, 0xae, 0x3c, 0xa2, 0xc3, 0x55, 0x48, 0xba, 0x58, - 0x65, 0x6a, 0xe5, 0x3e, 0xe7, 0xd8, 0xc0, 0x8b, 0xda, 0xfe, 0xa4, 0xe3, 0x41, 0x37, 0xe8, 0x32, - 0x16, 0x2d, 0xde, 0x4b, 0x2f, 0x2e, 0x6c, 0x9d, 0xf0, 0x92, 0xfa, 0x08, 0x91, 0xb1, 0x10, 0xa8, - 0x4b, 0xba, 0x5f, 0xa6, 0x19, 0x57, 0x3b, 0xfa, 0xaf, 0x2e, 0x2e, 0x32, 0xc1, 0xa6, 0x20, 0xe9, - 0xae, 0xc5, 0x43, 0x5f, 0x4e, 0x24, 0xdd, 0x18, 0xe7, 0xce, 0x0a, 0xd4, 0xd2, 0x53, 0x3e, 0x11, - 0xf9, 0x24, 0xcd, 0xe0, 0x41, 0x50, 0xa5, 0x69, 0x85, 0xc4, 0x59, 0x81, 0x16, 0xe4, 0x26, 0xc6, - 0x5a, 0x54, 0x0f, 0x7b, 0x53, 0xfe, 0xfb, 0x6d, 0x45, 0x4f, 0x4c, 0x4c, 0x8c, 0x08, 0xe6, 0xd6, - 0x9e, 0xb5, 0xf0, 0xac, 0x50, 0xc6, 0xef, 0xb4, 0xb5, 0x1a, 0x09, 0xb1, 0xf6, 0x0c, 0x09, 0xb7, - 0x86, 0xaa, 0xff, 0xbe, 0x27, 0xae, 0x73, 0x65, 0xf4, 0x6e, 0x5b, 0xc5, 0xc8, 0x88, 0x35, 0x14, - 0x64, 0xb4, 0xe1, 0x9f, 0x24, 0xff, 0x5f, 0x19, 0x2e, 0x45, 0x31, 0xb8, 0x85, 0x28, 0x94, 0xde, - 0x99, 0xcd, 0xdb, 0xa4, 0xdc, 0x1d, 0x2d, 0xb0, 0x7d, 0xe3, 0xac, 0x62, 0x33, 0x3e, 0xb8, 0x47, - 0xb4, 0xb8, 0x92, 0x12, 0x47, 0x0b, 0xda, 0x54, 0xd8, 0x2b, 0x8e, 0xc5, 0x54, 0x5b, 0x47, 0x6a, - 0x68, 0x85, 0xb1, 0x5e, 0xe1, 0x43, 0x2e, 0x99, 0x39, 0x66, 0xcb, 0x74, 0x66, 0x27, 0x9c, 0x26, - 0x6e, 0x55, 0x20, 0x99, 0x71, 0xcc, 0xd0, 0x83, 0x88, 0x64, 0x86, 0x84, 0xb5, 0xcf, 0x7f, 0x5e, - 0x4b, 0xee, 0x38, 0x66, 0xdf, 0xec, 0xd6, 0x1d, 0xe4, 0x17, 0xa2, 0x4e, 0x7d, 0x0e, 0xd3, 0xfc, - 0xaa, 0x1a, 0x7c, 0x41, 0x99, 0xc4, 0x79, 0x5b, 0x94, 0x2f, 0x6f, 0xac, 0xe7, 0xb2, 0x56, 0xb3, - 0x95, 0xe5, 0xde, 0x67, 0x37, 0x1a, 0x20, 0x6b, 0xb5, 0x3b, 0x5e, 0x90, 0x23, 0xb2, 0xd6, 0x18, - 0xef, 0x9a, 0xd8, 0x3a, 0xcf, 0x44, 0x0e, 0x9b, 0xd8, 0x59, 0xa8, 0x85, 0x44, 0x13, 0xb7, 0x20, - 0x17, 0x8f, 0x8d, 0xa8, 0xd9, 0x75, 0xd9, 0xc9, 0x32, 0x10, 0x8f, 0xad, 0xaa, 0x05, 0x88, 0x78, - 0x8c, 0x82, 0xda, 0xcf, 0x69, 0xf2, 0x9d, 0xfa, 0x91, 0x9e, 0x94, 0x7c, 0x99, 0x72, 0x78, 0xf4, - 0xc2, 0x93, 0x10, 0xe3, 0x3f, 0x24, 0xdc, 0xc8, 0x3a, 0xcb, 0xab, 0x22, 0x63, 0xd5, 0xa5, 0x7e, - 0x19, 0x1f, 0xd6, 0xd9, 0x08, 0xe1, 0xeb, 0xf8, 0xfb, 0x1d, 0x94, 0x0b, 0xea, 0x46, 0x66, 0x43, - 0xcc, 0x3a, 0xae, 0xda, 0x0a, 0x33, 0x1b, 0x9d, 0x9c, 0xdb, 0xf1, 0xde, 0x67, 0x59, 0xc6, 0xcb, - 0x95, 0x91, 0x1d, 0xb1, 0x3c, 0xbd, 0xe0, 0x95, 0x04, 0x3b, 0xde, 0x9a, 0x1a, 0x42, 0x8c, 0xd8, - 0xf1, 0x8e, 0xe0, 0x2e, 0x9b, 0x07, 0x9e, 0x0f, 0xf2, 0x29, 0x7f, 0x0b, 0xb2, 0x79, 0x68, 0x47, - 0x31, 0x44, 0x36, 0x4f, 0xb1, 0x6e, 0xe7, 0xf7, 0x79, 0x26, 0x26, 0x57, 0x7a, 0x0a, 0x08, 0x1b, - 0x58, 0x49, 0xe0, 0x1c, 0x70, 0x37, 0x86, 0xb8, 0x49, 0x40, 0x09, 0x4e, 0x79, 0x91, 0xb1, 0x09, - 0x3c, 0x7f, 0xd3, 0xe8, 0x68, 0x19, 0x31, 0x09, 0x40, 0x06, 0x14, 0x57, 0x9f, 0xeb, 0xc1, 0x8a, - 0x0b, 0x8e, 0xf5, 0xdc, 0x8d, 0x21, 0x6e, 0x1a, 0x54, 0x82, 0x51, 0x91, 0xa5, 0x12, 0x0c, 0x83, - 0x46, 0x43, 0x49, 0x88, 0x61, 0x10, 0x12, 0xc0, 0xe4, 0x11, 0x2f, 0x67, 0x1c, 0x35, 0xa9, 0x24, - 0x51, 0x93, 0x86, 0x70, 0x87, 0x8d, 0x9b, 0xba, 0x8b, 0x62, 0x05, 0x0e, 0x1b, 0xeb, 0x6a, 0x89, - 0x62, 0x45, 0x1c, 0x36, 0x0e, 0x00, 0x50, 0xc4, 0x13, 0x56, 0x49, 0xbc, 0x88, 0x4a, 0x12, 0x2d, - 0xa2, 0x21, 0xdc, 0x1c, 0xdd, 0x14, 0x71, 0x21, 0xc1, 0x1c, 0xad, 0x0b, 0xe0, 0xbd, 0x81, 0xbe, - 0x4d, 0xca, 0x5d, 0x24, 0x69, 0x5a, 0x85, 0xcb, 0x97, 0x29, 0xcf, 0xa6, 0x15, 0x88, 0x24, 0xfa, - 0xb9, 0x1b, 0x29, 0x11, 0x49, 0xda, 0x14, 0xe8, 0x4a, 0x7a, 0x7f, 0x1c, 0xab, 0x1d, 0xd8, 0x1a, - 0xbf, 0x1b, 0x43, 0x5c, 0x7c, 0x32, 0x85, 0xde, 0x65, 0x65, 0x99, 0xd6, 0x93, 0xff, 0x3a, 0x5e, - 0x20, 0x23, 0x27, 0xe2, 0x13, 0xc6, 0x81, 0xe1, 0x65, 0x02, 0x37, 0x56, 0x30, 0x18, 0xba, 0x3f, - 0x89, 0x32, 0x2e, 0xe3, 0x54, 0x12, 0xef, 0x15, 0x2a, 0xf6, 0x34, 0x91, 0x37, 0xa8, 0xeb, 0x5d, - 0x98, 0xf7, 0x31, 0x90, 0x75, 0x71, 0x24, 0x96, 0x7c, 0x2c, 0x5e, 0xbc, 0x4d, 0x2b, 0x99, 0xe6, - 0x33, 0x3d, 0x73, 0x3f, 0x23, 0x2c, 0x61, 0x30, 0xf1, 0x31, 0x50, 0xa7, 0x92, 0x4b, 0x20, 0x40, - 0x59, 0x8e, 0xf9, 0x35, 0x9a, 0x40, 0x40, 0x8b, 0x96, 0x23, 0x12, 0x88, 0x18, 0xef, 0xf6, 0x51, - 0xac, 0x73, 0xfd, 0xc5, 0xf4, 0x58, 0x98, 0x5c, 0x8e, 0xb2, 0x06, 0x41, 0x62, 0x29, 0x1b, 0x55, - 0x70, 0xeb, 0x4b, 0xeb, 0xdf, 0x0d, 0xb1, 0x07, 0x84, 0x9d, 0xf6, 0x30, 0x7b, 0xd8, 0x83, 0x44, - 0x5c, 0xb9, 0x73, 0x00, 0x94, 0xab, 0xf6, 0x31, 0x80, 0x87, 0x3d, 0x48, 0x6f, 0x4f, 0xc6, 0xaf, - 0xd6, 0x73, 0x36, 0xb9, 0x9a, 0x95, 0x62, 0x91, 0x4f, 0x77, 0x45, 0x26, 0x4a, 0xb0, 0x27, 0x13, - 0x94, 0x1a, 0xa0, 0xc4, 0x9e, 0x4c, 0x87, 0x8a, 0xcb, 0xe0, 0xfc, 0x52, 0xec, 0x64, 0xe9, 0x0c, - 0xae, 0xa8, 0x03, 0x43, 0x0a, 0x20, 0x32, 0x38, 0x14, 0x44, 0x3a, 0x51, 0xb3, 0xe2, 0x96, 0xe9, - 0x84, 0x65, 0x8d, 0xbf, 0x6d, 0xda, 0x4c, 0x00, 0x76, 0x76, 0x22, 0x44, 0x01, 0xa9, 0xe7, 0x78, - 0x51, 0xe6, 0x07, 0xb9, 0x14, 0x64, 0x3d, 0x0d, 0xd0, 0x59, 0x4f, 0x0f, 0x04, 0x61, 0x75, 0xcc, - 0xdf, 0xd6, 0xa5, 0xa9, 0xff, 0xc1, 0xc2, 0x6a, 0xfd, 0xf7, 0xa1, 0x96, 0xc7, 0xc2, 0x2a, 0xe0, - 0x40, 0x65, 0xb4, 0x93, 0xa6, 0xc3, 0x44, 0xb4, 0xc3, 0x6e, 0xf2, 0xa0, 0x1b, 0xc4, 0xfd, 0x8c, - 0xe4, 0x2a, 0xe3, 0x31, 0x3f, 0x0a, 0xe8, 0xe3, 0xc7, 0x80, 0x6e, 0xbb, 0x25, 0xa8, 0xcf, 0x25, - 0x9f, 0x5c, 0xb5, 0x8e, 0x35, 0x85, 0x05, 0x6d, 0x10, 0x62, 0xbb, 0x85, 0x40, 0xf1, 0x26, 0x3a, - 0x98, 0x88, 0x3c, 0xd6, 0x44, 0xb5, 0xbc, 0x4f, 0x13, 0x69, 0xce, 0x2d, 0x7e, 0xad, 0x54, 0xf7, - 0xcc, 0xa6, 0x99, 0x36, 0x09, 0x0b, 0x3e, 0x44, 0x2c, 0x7e, 0x49, 0xd8, 0xe5, 0xe4, 0xd0, 0xe7, - 0x51, 0xfb, 0xcc, 0x77, 0xcb, 0xca, 0x11, 0x7d, 0xe6, 0x9b, 0x62, 0xe9, 0x4a, 0x36, 0x7d, 0xa4, - 0xc3, 0x4a, 0xd8, 0x4f, 0x1e, 0xf7, 0x83, 0xdd, 0x92, 0x27, 0xf0, 0xb9, 0x9b, 0x71, 0x56, 0x36, - 0x5e, 0xb7, 0x22, 0x86, 0x1c, 0x46, 0x2c, 0x79, 0x22, 0x38, 0x08, 0x61, 0x81, 0xe7, 0x5d, 0x91, - 0x4b, 0x9e, 0x4b, 0x2c, 0x84, 0x85, 0xc6, 0x34, 0x18, 0x0b, 0x61, 0x94, 0x02, 0xe8, 0xb7, 0x6a, - 0x3f, 0x88, 0xcb, 0x63, 0x36, 0x47, 0x33, 0xb6, 0x66, 0xaf, 0xa7, 0x91, 0xc7, 0xfa, 0x2d, 0xe0, - 0xbc, 0x97, 0x7c, 0xbe, 0x97, 0x31, 0x2b, 0x67, 0x76, 0x77, 0x63, 0x3a, 0x78, 0x42, 0xdb, 0x09, - 0x49, 0xe2, 0x25, 0x5f, 0x5c, 0x03, 0x84, 0x9d, 0x83, 0x39, 0x9b, 0xd9, 0x9a, 0x22, 0x35, 0x50, - 0xf2, 0x56, 0x55, 0x1f, 0x74, 0x83, 0xc0, 0xcf, 0xeb, 0x74, 0xca, 0x45, 0xc4, 0x8f, 0x92, 0xf7, - 0xf1, 0x03, 0x41, 0x90, 0xbd, 0xd5, 0xf5, 0x6e, 0x56, 0x74, 0x3b, 0xf9, 0x54, 0xaf, 0x63, 0x87, - 0xc4, 0xe3, 0x01, 0x5c, 0x2c, 0x7b, 0x23, 0x78, 0x30, 0x46, 0xcd, 0x06, 0x6d, 0x6c, 0x8c, 0xda, - 0xfd, 0xd7, 0x3e, 0x63, 0x14, 0x83, 0xb5, 0xcf, 0x9f, 0xe9, 0x31, 0xba, 0xc7, 0x24, 0xab, 0xf3, - 0xf6, 0xd7, 0x29, 0xbf, 0xd6, 0x0b, 0x61, 0xa4, 0xbe, 0x86, 0x1a, 0xaa, 0x4f, 0x56, 0xc1, 0xaa, - 0x78, 0xbb, 0x37, 0x1f, 0xf1, 0xad, 0x57, 0x08, 0x9d, 0xbe, 0xc1, 0x52, 0x61, 0xbb, 0x37, 0x1f, - 0xf1, 0xad, 0xbf, 0x85, 0xef, 0xf4, 0x0d, 0x3e, 0x88, 0xdf, 0xee, 0xcd, 0x6b, 0xdf, 0x7f, 0x69, - 0x06, 0xae, 0xef, 0xbc, 0xce, 0xc3, 0x26, 0x32, 0x5d, 0x72, 0x2c, 0x9d, 0x0c, 0xed, 0x59, 0x34, - 0x96, 0x4e, 0xd2, 0x2a, 0xde, 0x05, 0x4a, 0x58, 0x29, 0x4e, 0x44, 0x95, 0xaa, 0x97, 0xf4, 0xcf, - 0x7a, 0x18, 0x35, 0x70, 0x6c, 0xd1, 0x14, 0x53, 0x72, 0xaf, 0x1b, 0x03, 0xd4, 0x9d, 0x62, 0x7e, - 0x1c, 0xb1, 0xd7, 0x3e, 0xcc, 0xbc, 0xd5, 0x93, 0x76, 0x2f, 0xfe, 0x02, 0xc6, 0x7f, 0xe3, 0x18, - 0x6b, 0x55, 0xf4, 0xa5, 0xe3, 0x93, 0xfe, 0x0a, 0xda, 0xfd, 0x5f, 0x9b, 0x75, 0x05, 0xf4, 0xaf, - 0x07, 0xc1, 0xd3, 0x3e, 0x16, 0xc1, 0x40, 0x78, 0x76, 0x23, 0x1d, 0x5d, 0x90, 0xbf, 0x37, 0x0b, - 0x68, 0x83, 0xaa, 0x6f, 0x39, 0xd4, 0x37, 0xa0, 0x7a, 0x4c, 0xc4, 0x9a, 0xd5, 0xc1, 0x70, 0x64, - 0x7c, 0x7e, 0x43, 0x2d, 0xef, 0x3a, 0xad, 0x00, 0xd6, 0xdf, 0x1c, 0x7a, 0xe5, 0x89, 0x59, 0xf6, - 0x68, 0x58, 0xa0, 0x2f, 0x6e, 0xaa, 0x46, 0x8d, 0x15, 0x0f, 0x56, 0xb7, 0x73, 0x3c, 0xeb, 0x69, - 0x38, 0xb8, 0xaf, 0xe3, 0xb3, 0x9b, 0x29, 0xe9, 0xb2, 0xfc, 0xc7, 0x5a, 0x72, 0x3f, 0x60, 0xdd, - 0xfb, 0x04, 0xb0, 0xeb, 0xf1, 0xe3, 0x88, 0x7d, 0x4a, 0xc9, 0x16, 0xee, 0x77, 0x7f, 0x39, 0x65, - 0x77, 0xf7, 0x54, 0xa0, 0xf2, 0x32, 0xcd, 0x24, 0x2f, 0xdb, 0x77, 0x4f, 0x85, 0x76, 0x1b, 0x6a, - 0x48, 0xdf, 0x3d, 0x15, 0xc1, 0xbd, 0xbb, 0xa7, 0x10, 0xcf, 0xe8, 0xdd, 0x53, 0xa8, 0xb5, 0xe8, - 0xdd, 0x53, 0x71, 0x0d, 0x2a, 0xbc, 0x9b, 0x22, 0x34, 0xfb, 0xd6, 0xbd, 0x2c, 0x86, 0xdb, 0xd8, - 0x4f, 0x6f, 0xa2, 0x42, 0x4c, 0x70, 0x0d, 0xa7, 0xce, 0xb9, 0xf5, 0x78, 0xa6, 0xc1, 0x59, 0xb7, - 0xed, 0xde, 0xbc, 0xf6, 0xfd, 0x53, 0xbd, 0xba, 0xb1, 0xe1, 0x5c, 0x94, 0xea, 0xde, 0xb1, 0xcd, - 0x58, 0x78, 0xae, 0x2d, 0xf8, 0x2d, 0xff, 0xb8, 0x1f, 0x4c, 0x54, 0xb7, 0x26, 0x74, 0xa3, 0x0f, - 0xbb, 0x0c, 0x81, 0x26, 0xdf, 0xee, 0xcd, 0x13, 0xd3, 0x48, 0xe3, 0xbb, 0x69, 0xed, 0x1e, 0xc6, - 0xc2, 0xb6, 0x7e, 0xd2, 0x5f, 0x41, 0xbb, 0x5f, 0xea, 0xb4, 0xd1, 0x77, 0xaf, 0xda, 0x79, 0xab, - 0xcb, 0xd4, 0x28, 0x68, 0xe6, 0x61, 0x5f, 0x3c, 0x96, 0x40, 0xf8, 0x53, 0x68, 0x57, 0x02, 0x81, - 0x4e, 0xa3, 0x9f, 0xdd, 0x4c, 0x49, 0x97, 0xe5, 0x9f, 0xd6, 0x92, 0xdb, 0x64, 0x59, 0x74, 0x3f, - 0xf8, 0xa2, 0xaf, 0x65, 0xd0, 0x1f, 0xbe, 0xbc, 0xb1, 0x9e, 0x2e, 0xd4, 0xbf, 0xae, 0x25, 0x77, - 0x22, 0x85, 0x6a, 0x3a, 0xc8, 0x0d, 0xac, 0x87, 0x1d, 0xe5, 0x87, 0x37, 0x57, 0xa4, 0xa6, 0x7b, - 0x1f, 0x1f, 0xb5, 0x2f, 0x65, 0x8a, 0xd8, 0x1e, 0xd1, 0x97, 0x32, 0x75, 0x6b, 0xc1, 0x4d, 0x1e, - 0x76, 0x6e, 0x16, 0x5d, 0xe8, 0x26, 0x8f, 0x3a, 0xa1, 0x16, 0xbd, 0x5c, 0x02, 0xe3, 0x30, 0x27, - 0x2f, 0xde, 0x16, 0x2c, 0x9f, 0xd2, 0x4e, 0x1a, 0x79, 0xb7, 0x13, 0xcb, 0xc1, 0xcd, 0xb1, 0x5a, - 0x7a, 0x2a, 0xcc, 0x42, 0xea, 0x21, 0xa5, 0x6f, 0x91, 0xe8, 0xe6, 0x58, 0x0b, 0x25, 0xbc, 0xe9, - 0xac, 0x31, 0xe6, 0x0d, 0x24, 0x8b, 0x8f, 0xfa, 0xa0, 0x20, 0x45, 0xb7, 0xde, 0xec, 0x9e, 0xfb, - 0xe3, 0x98, 0x95, 0xd6, 0xbe, 0xfb, 0x56, 0x4f, 0x9a, 0x70, 0x3b, 0xe2, 0xf2, 0x2b, 0xce, 0xa6, - 0xbc, 0x8c, 0xba, 0xb5, 0x54, 0x2f, 0xb7, 0x3e, 0x8d, 0xb9, 0xdd, 0x15, 0xd9, 0x62, 0x9e, 0xeb, - 0xc6, 0x24, 0xdd, 0xfa, 0x54, 0xb7, 0x5b, 0x40, 0xc3, 0x6d, 0x41, 0xe7, 0x56, 0xa5, 0x97, 0x8f, - 0xe2, 0x66, 0x82, 0xac, 0x72, 0xb3, 0x17, 0x4b, 0xd7, 0x53, 0x77, 0xa3, 0x8e, 0x7a, 0x82, 0x9e, - 0xb4, 0xd5, 0x93, 0x86, 0xfb, 0x73, 0x9e, 0x5b, 0xdb, 0x9f, 0xb6, 0x3b, 0x6c, 0xb5, 0xba, 0xd4, - 0x93, 0xfe, 0x0a, 0x70, 0x37, 0x54, 0xf7, 0xaa, 0xc3, 0xb4, 0x92, 0x2f, 0xd3, 0x2c, 0x1b, 0x6c, - 0x46, 0xba, 0x89, 0x81, 0xa2, 0xbb, 0xa1, 0x08, 0x4c, 0xf4, 0x64, 0xb3, 0x7b, 0x98, 0x0f, 0xba, - 0xec, 0x28, 0xaa, 0x57, 0x4f, 0xf6, 0x69, 0xb0, 0xa3, 0xe5, 0x3d, 0x6a, 0x5b, 0xdb, 0x61, 0xfc, - 0xc1, 0xb5, 0x2a, 0xbc, 0xdd, 0x9b, 0x07, 0xaf, 0xdb, 0x15, 0xa5, 0x66, 0x96, 0x7b, 0x94, 0x89, - 0x60, 0x26, 0xb9, 0xdf, 0x41, 0x81, 0x5d, 0xc1, 0x66, 0x18, 0xbd, 0x49, 0xa7, 0x33, 0x2e, 0xd1, - 0x37, 0x45, 0x3e, 0x10, 0x7d, 0x53, 0x04, 0x40, 0xd0, 0x74, 0xcd, 0xdf, 0xed, 0x76, 0xe8, 0xc1, - 0x14, 0x6b, 0x3a, 0xad, 0xec, 0x51, 0xb1, 0xa6, 0x43, 0x69, 0x10, 0x0d, 0xac, 0x5b, 0xfd, 0x39, - 0xfe, 0xa3, 0x98, 0x19, 0xf0, 0x4d, 0xfe, 0x66, 0x2f, 0x16, 0xcc, 0x28, 0xce, 0x61, 0x3a, 0x4f, - 0x25, 0x36, 0xa3, 0x78, 0x36, 0x6a, 0x24, 0x36, 0xa3, 0xb4, 0x51, 0xaa, 0x7a, 0x75, 0x8e, 0x70, - 0x30, 0x8d, 0x57, 0xaf, 0x61, 0xfa, 0x55, 0xcf, 0xb2, 0xad, 0x17, 0x9b, 0xb9, 0xed, 0x32, 0xf2, - 0x52, 0x2f, 0x96, 0x91, 0xbe, 0xad, 0x3e, 0xd3, 0x84, 0x60, 0x2c, 0xea, 0x50, 0x0a, 0x70, 0xc3, - 0xbe, 0xe6, 0xcc, 0xbb, 0xd7, 0xa2, 0xe0, 0xac, 0x64, 0xf9, 0x04, 0x5d, 0x9c, 0x2a, 0x83, 0x2d, - 0x32, 0xb6, 0x38, 0x25, 0x35, 0xc0, 0x6b, 0xf3, 0xf0, 0x03, 0x4b, 0x64, 0x28, 0xd8, 0x2f, 0x19, - 0xc3, 0xef, 0x2b, 0x1f, 0xf6, 0x20, 0xe1, 0x6b, 0x73, 0x03, 0xd8, 0x8d, 0xef, 0xc6, 0xe9, 0xa7, - 0x11, 0x53, 0x21, 0x1a, 0x5b, 0x08, 0xd3, 0x2a, 0xa0, 0x53, 0xdb, 0x04, 0x97, 0xcb, 0x9f, 0xf0, - 0x15, 0xd6, 0xa9, 0x5d, 0x7e, 0xaa, 0x90, 0x58, 0xa7, 0x6e, 0xa3, 0x20, 0xcf, 0xf4, 0xd7, 0x41, - 0xeb, 0x11, 0x7d, 0x7f, 0xe9, 0xb3, 0xd1, 0xc9, 0x81, 0x91, 0xb3, 0x97, 0x2e, 0x83, 0xf7, 0x04, - 0x48, 0x41, 0xf7, 0xd2, 0x25, 0xfe, 0x9a, 0x60, 0xb3, 0x17, 0x0b, 0x5f, 0xc9, 0x33, 0xc9, 0xdf, - 0x9a, 0x77, 0xe5, 0x48, 0x71, 0x95, 0xbc, 0xf5, 0xb2, 0xfc, 0x41, 0x37, 0xe8, 0x0e, 0xc0, 0x9e, - 0x94, 0x62, 0xc2, 0xab, 0x4a, 0xdf, 0x54, 0x19, 0x9e, 0x30, 0xd2, 0xb2, 0x21, 0xb8, 0xa7, 0xf2, - 0x5e, 0x1c, 0xf2, 0xae, 0x97, 0x6b, 0x44, 0xee, 0xd6, 0x9b, 0x75, 0x54, 0xb3, 0x7d, 0xe1, 0xcd, - 0x46, 0x27, 0xe7, 0x86, 0x97, 0x96, 0xfa, 0xd7, 0xdc, 0x3c, 0x40, 0xd5, 0xb1, 0x1b, 0x6e, 0x1e, - 0xf6, 0x20, 0xb5, 0xab, 0xaf, 0x92, 0x77, 0x0f, 0xc5, 0x6c, 0xc4, 0xf3, 0xe9, 0xe0, 0x07, 0xe1, - 0x11, 0x5a, 0x31, 0x1b, 0xd6, 0x7f, 0xb6, 0x46, 0x6f, 0x51, 0x62, 0x77, 0x08, 0x70, 0x8f, 0x9f, - 0x2f, 0x66, 0x23, 0xc9, 0x24, 0x38, 0x04, 0xa8, 0xfe, 0x3e, 0xac, 0x05, 0xc4, 0x21, 0xc0, 0x00, - 0x00, 0xf6, 0xc6, 0x25, 0xe7, 0xa8, 0xbd, 0x5a, 0x10, 0xb5, 0xa7, 0x01, 0x97, 0x45, 0x58, 0x7b, - 0x75, 0xa2, 0x0e, 0x0f, 0xed, 0x39, 0x1d, 0x25, 0x25, 0xb2, 0x88, 0x36, 0xe5, 0x3a, 0x77, 0x53, - 0x7d, 0x75, 0xeb, 0xc8, 0x62, 0x3e, 0x67, 0xe5, 0x0a, 0x74, 0x6e, 0x5d, 0x4b, 0x0f, 0x20, 0x3a, - 0x37, 0x0a, 0xba, 0x51, 0x6b, 0x1e, 0xf3, 0xe4, 0x6a, 0x5f, 0x94, 0x62, 0x21, 0xd3, 0x9c, 0xc3, - 0x9b, 0x27, 0xec, 0x03, 0xf5, 0x19, 0x62, 0xd4, 0x52, 0xac, 0xcb, 0x72, 0x15, 0xd1, 0x9c, 0x27, - 0x54, 0xf7, 0x57, 0x57, 0x52, 0x94, 0xf0, 0x7d, 0x62, 0x63, 0x05, 0x42, 0x44, 0x96, 0x4b, 0xc2, - 0xa0, 0xed, 0x4f, 0xd2, 0x7c, 0x86, 0xb6, 0xfd, 0x89, 0x7f, 0xfb, 0xeb, 0x1d, 0x1a, 0x70, 0x03, - 0xaa, 0x79, 0x68, 0xcd, 0x00, 0xd0, 0xdf, 0x72, 0xa2, 0x0f, 0xdd, 0x27, 0x88, 0x01, 0x85, 0x93, - 0xc0, 0xd5, 0xab, 0x82, 0xe7, 0x7c, 0x6a, 0x4e, 0xcd, 0x61, 0xae, 0x02, 0x22, 0xea, 0x0a, 0x92, - 0x2e, 0x16, 0x29, 0xf9, 0xe9, 0x22, 0x3f, 0x29, 0xc5, 0x45, 0x9a, 0xf1, 0x12, 0xc4, 0xa2, 0x46, - 0xdd, 0x93, 0x13, 0xb1, 0x08, 0xe3, 0xdc, 0xf1, 0x0b, 0x25, 0x0d, 0x2e, 0x61, 0x1f, 0x97, 0x6c, - 0x02, 0x8f, 0x5f, 0x34, 0x36, 0xda, 0x18, 0xb1, 0x33, 0x18, 0xc1, 0xbd, 0x44, 0xa7, 0x71, 0x9d, - 0xaf, 0x54, 0xff, 0xd0, 0xdf, 0x12, 0xaa, 0x3b, 0x51, 0x2b, 0x90, 0xe8, 0x68, 0x73, 0x18, 0x49, - 0x24, 0x3a, 0x71, 0x0d, 0x37, 0x95, 0x28, 0xee, 0x58, 0x1f, 0x2b, 0x02, 0x53, 0x49, 0x63, 0xc3, - 0x08, 0x89, 0xa9, 0xa4, 0x05, 0x81, 0x80, 0x64, 0x86, 0xc1, 0x0c, 0x0d, 0x48, 0x56, 0x1a, 0x0d, - 0x48, 0x3e, 0xe5, 0x02, 0xc5, 0x41, 0x9e, 0xca, 0x94, 0x65, 0x23, 0x2e, 0x4f, 0x58, 0xc9, 0xe6, - 0x5c, 0xf2, 0x12, 0x06, 0x0a, 0x8d, 0x0c, 0x03, 0x86, 0x08, 0x14, 0x14, 0xab, 0x1d, 0xfe, 0x5e, - 0xf2, 0x7e, 0x3d, 0xef, 0xf3, 0x5c, 0xff, 0xdc, 0xca, 0x0b, 0xf5, 0x3b, 0x4d, 0x83, 0x0f, 0xac, - 0x8d, 0x91, 0x2c, 0x39, 0x9b, 0x1b, 0xdb, 0xef, 0xd9, 0xbf, 0x2b, 0xf0, 0xc9, 0x5a, 0xdd, 0x9f, - 0x8f, 0x85, 0x4c, 0x2f, 0xea, 0x65, 0xb6, 0xfe, 0x82, 0x08, 0xf4, 0x67, 0x5f, 0x3c, 0x8c, 0xdc, - 0x45, 0x81, 0x71, 0x2e, 0x4e, 0xfb, 0xd2, 0x53, 0x5e, 0x64, 0x30, 0x4e, 0x07, 0xda, 0x0a, 0x20, - 0xe2, 0x34, 0x0a, 0xba, 0xc1, 0xe9, 0x8b, 0xc7, 0x3c, 0x5e, 0x99, 0x31, 0xef, 0x57, 0x99, 0x71, - 0xf0, 0x51, 0x46, 0x96, 0xbc, 0x7f, 0xc4, 0xe7, 0xe7, 0xbc, 0xac, 0x2e, 0xd3, 0x82, 0xba, 0xb7, - 0xd5, 0x11, 0x9d, 0xf7, 0xb6, 0x12, 0xa8, 0x9b, 0x09, 0x1c, 0x70, 0x50, 0x1d, 0xb3, 0x39, 0x57, - 0x37, 0x6b, 0x80, 0x99, 0xc0, 0x33, 0xe2, 0x41, 0xc4, 0x4c, 0x40, 0xc2, 0xde, 0xf7, 0x5d, 0x8e, - 0x39, 0xe5, 0xb3, 0xba, 0x87, 0x95, 0x27, 0x6c, 0x35, 0xe7, 0xb9, 0xd4, 0x26, 0xc1, 0x9e, 0xbc, - 0x67, 0x12, 0xe7, 0x89, 0x3d, 0xf9, 0x3e, 0x7a, 0x5e, 0x68, 0x0a, 0x1e, 0xfc, 0x89, 0x28, 0x65, - 0xf3, 0x63, 0x4a, 0x67, 0x65, 0x06, 0x42, 0x53, 0xf8, 0x50, 0x03, 0x92, 0x08, 0x4d, 0x71, 0x0d, - 0xef, 0x57, 0x08, 0x82, 0x32, 0xbc, 0xe6, 0xa5, 0xed, 0x27, 0x2f, 0xe6, 0x2c, 0xcd, 0x74, 0x6f, - 0xf8, 0x51, 0xc4, 0x36, 0xa1, 0x43, 0xfc, 0x0a, 0x41, 0x5f, 0x5d, 0xef, 0x77, 0x1b, 0xe2, 0x25, - 0x04, 0xaf, 0x08, 0x3a, 0xec, 0x13, 0xaf, 0x08, 0xba, 0xb5, 0xdc, 0xca, 0xdd, 0xb1, 0x8a, 0x5b, - 0x29, 0x62, 0x57, 0x4c, 0xe1, 0x7e, 0xa1, 0x67, 0x13, 0x80, 0xc4, 0xca, 0x3d, 0xaa, 0xe0, 0x52, - 0x03, 0x87, 0xbd, 0x4c, 0x73, 0x96, 0xa5, 0x3f, 0x83, 0x69, 0xbd, 0x67, 0xc7, 0x10, 0x44, 0x6a, - 0x80, 0x93, 0x98, 0xab, 0x7d, 0x2e, 0xc7, 0x69, 0x1d, 0xfa, 0x1f, 0x44, 0x9e, 0x9b, 0x22, 0xba, - 0x5d, 0x79, 0xa4, 0x77, 0x47, 0x2b, 0x7c, 0xac, 0x3b, 0x45, 0x31, 0xaa, 0x67, 0xd5, 0x53, 0x3e, - 0xe1, 0x69, 0x21, 0x07, 0x9f, 0xc7, 0x9f, 0x15, 0xc0, 0x89, 0x83, 0x16, 0x3d, 0xd4, 0xbc, 0xd7, - 0xf7, 0x75, 0x2c, 0x19, 0x35, 0xbf, 0x32, 0x78, 0x56, 0xf1, 0x52, 0x27, 0x1a, 0xfb, 0x5c, 0x82, - 0xd1, 0xe9, 0x71, 0x43, 0x0f, 0xac, 0x2b, 0x4a, 0x8c, 0xce, 0xb8, 0x86, 0xdb, 0xec, 0xf3, 0x38, - 0x7d, 0xe7, 0xb6, 0x3a, 0x6f, 0xf8, 0x98, 0x34, 0xe6, 0x51, 0xc4, 0x66, 0x1f, 0x4d, 0xbb, 0x6c, - 0xad, 0xed, 0x76, 0x27, 0x5f, 0x1d, 0xc0, 0x23, 0x13, 0x88, 0x25, 0x85, 0x11, 0xd9, 0x5a, 0x04, - 0xf7, 0x36, 0xc3, 0x4b, 0xc1, 0xa6, 0x13, 0x56, 0xc9, 0x13, 0xb6, 0xca, 0x04, 0x9b, 0xaa, 0x79, - 0x1d, 0x6e, 0x86, 0x1b, 0x66, 0xe8, 0x43, 0xd4, 0x66, 0x38, 0x05, 0xfb, 0xd9, 0x99, 0xfa, 0xf1, - 0x44, 0x7d, 0x96, 0x13, 0x66, 0x67, 0xaa, 0xbc, 0xf0, 0x1c, 0xe7, 0xbd, 0x38, 0xe4, 0xbe, 0x41, - 0x6b, 0x44, 0x2a, 0x0d, 0xb9, 0x83, 0xe9, 0x04, 0x09, 0xc8, 0xc7, 0x11, 0xc2, 0xdd, 0x4b, 0xd1, - 0xfc, 0xdd, 0xfc, 0xfe, 0x8f, 0xd4, 0x37, 0x59, 0x3f, 0xc6, 0x74, 0x7d, 0x68, 0xe8, 0x5f, 0x70, - 0xb7, 0xd5, 0x93, 0x76, 0x69, 0xe6, 0xee, 0x25, 0x93, 0x3b, 0xd3, 0xe9, 0x11, 0xaf, 0x90, 0x0f, - 0xca, 0x6b, 0xe1, 0xd0, 0x49, 0x89, 0x34, 0xb3, 0x4d, 0xb9, 0x8e, 0x5e, 0xcb, 0x5e, 0x4c, 0x53, - 0xa9, 0x65, 0xe6, 0x84, 0xf4, 0xe3, 0xb6, 0x81, 0x36, 0x45, 0xd4, 0x8a, 0xa6, 0x5d, 0x2c, 0xaf, - 0x99, 0xb1, 0x98, 0xcd, 0x32, 0xae, 0xa1, 0x53, 0xce, 0x9a, 0x8b, 0xfc, 0xb6, 0xdb, 0xb6, 0x50, - 0x90, 0x88, 0xe5, 0x51, 0x05, 0x97, 0x46, 0xd6, 0x58, 0xf3, 0x4a, 0xca, 0x3c, 0xd8, 0x8d, 0xb6, - 0x99, 0x00, 0x20, 0xd2, 0x48, 0x14, 0x74, 0xdf, 0xbd, 0xd5, 0xe2, 0x7d, 0x6e, 0x9e, 0x04, 0xbc, - 0x82, 0x48, 0x29, 0x7b, 0x62, 0xe2, 0xbb, 0x37, 0x04, 0x73, 0xeb, 0x04, 0xe0, 0xe1, 0xf9, 0xea, - 0x60, 0x0a, 0xd7, 0x09, 0x50, 0x5f, 0x31, 0xc4, 0x3a, 0x81, 0x62, 0xc3, 0xa6, 0xb3, 0xfb, 0x5e, - 0x87, 0xac, 0x72, 0x95, 0x43, 0x9a, 0x0e, 0x05, 0x63, 0x4d, 0x47, 0x29, 0x84, 0x8f, 0xd4, 0xdf, - 0x5a, 0x43, 0x1e, 0x29, 0xb6, 0xaf, 0xb6, 0xde, 0x85, 0xb9, 0xb8, 0x64, 0xd7, 0x93, 0xea, 0xc8, - 0x12, 0x7e, 0x83, 0x7f, 0x23, 0x24, 0xe2, 0x52, 0x0b, 0xf2, 0x7e, 0x9a, 0xae, 0x48, 0x47, 0x92, - 0x95, 0xb2, 0x0e, 0xc8, 0xed, 0x9f, 0xa6, 0x2b, 0xd2, 0xa1, 0x27, 0xa5, 0x7e, 0x9a, 0xae, 0x45, - 0x79, 0x3f, 0xb7, 0x56, 0x9b, 0x17, 0x85, 0xb6, 0xfe, 0x09, 0xa2, 0x67, 0x84, 0xe4, 0x6f, 0xe7, - 0x02, 0xa8, 0xb1, 0xfd, 0xfc, 0xe3, 0xff, 0xfa, 0xe6, 0xd6, 0xda, 0x2f, 0xbe, 0xb9, 0xb5, 0xf6, - 0x3f, 0xdf, 0xdc, 0x5a, 0xfb, 0xf9, 0xb7, 0xb7, 0xde, 0xf9, 0xc5, 0xb7, 0xb7, 0xde, 0xf9, 0xef, - 0x6f, 0x6f, 0xbd, 0xf3, 0xf5, 0xbb, 0xfa, 0xf7, 0x80, 0xcf, 0xff, 0x9f, 0xfa, 0x55, 0xdf, 0x67, - 0xff, 0x17, 0x00, 0x00, 0xff, 0xff, 0x79, 0x20, 0x3d, 0xb9, 0x33, 0x78, 0x00, 0x00, + // 5364 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x9d, 0xdf, 0x6f, 0x24, 0x49, + 0x52, 0xf8, 0xd7, 0x2f, 0xdf, 0xfd, 0x52, 0xc7, 0x2d, 0xd0, 0x0b, 0xcb, 0xde, 0x72, 0x37, 0xbf, + 0x76, 0xc6, 0xf6, 0x8c, 0xed, 0xf6, 0xec, 0xcc, 0xce, 0xee, 0xe9, 0x0e, 0x09, 0x79, 0xec, 0xb1, + 0xd7, 0x9c, 0xed, 0x31, 0xee, 0xf6, 0x8c, 0xb4, 0x12, 0x12, 0xe9, 0xea, 0x74, 0xbb, 0x70, 0x75, + 0x65, 0x5d, 0x55, 0x76, 0x7b, 0xfa, 0x10, 0x08, 0x04, 0x02, 0x81, 0x40, 0x9c, 0xf8, 0xf5, 0x8a, + 0xc4, 0x5f, 0xc3, 0xe3, 0x3d, 0xf2, 0x88, 0x76, 0x9f, 0xef, 0x7f, 0x40, 0x95, 0x95, 0x95, 0x3f, + 0xa2, 0x22, 0xb2, 0xca, 0xf7, 0x34, 0xa3, 0x8e, 0x4f, 0x44, 0x64, 0x56, 0x66, 0x46, 0x46, 0x66, + 0x65, 0xa5, 0xa3, 0xbb, 0xf9, 0xc5, 0x76, 0x5e, 0x08, 0x29, 0xca, 0xed, 0x92, 0x17, 0x8b, 0x24, + 0xe6, 0xcd, 0xbf, 0x43, 0xf5, 0xf3, 0xe0, 0x7d, 0x96, 0x2d, 0xe5, 0x32, 0xe7, 0x9f, 0x7c, 0x6c, + 0xc9, 0x58, 0xcc, 0x66, 0x2c, 0x9b, 0x94, 0x35, 0xf2, 0xc9, 0x47, 0x56, 0xc2, 0x17, 0x3c, 0x93, + 0xfa, 0xf7, 0x67, 0xbf, 0xfc, 0xe5, 0x4a, 0xf4, 0xc1, 0x6e, 0x9a, 0xf0, 0x4c, 0xee, 0x6a, 0x8d, + 0xc1, 0xd7, 0xd1, 0x77, 0x77, 0xf2, 0xfc, 0x80, 0xcb, 0x37, 0xbc, 0x28, 0x13, 0x91, 0x0d, 0x3e, + 0x1d, 0x6a, 0x07, 0xc3, 0xb3, 0x3c, 0x1e, 0xee, 0xe4, 0xf9, 0xd0, 0x0a, 0x87, 0x67, 0xfc, 0xa7, + 0x73, 0x5e, 0xca, 0x4f, 0x1e, 0x86, 0xa1, 0x32, 0x17, 0x59, 0xc9, 0x07, 0x97, 0xd1, 0x6f, 0xed, + 0xe4, 0xf9, 0x88, 0xcb, 0x3d, 0x5e, 0x55, 0x60, 0x24, 0x99, 0xe4, 0x83, 0xb5, 0x96, 0xaa, 0x0f, + 0x18, 0x1f, 0xeb, 0xdd, 0xa0, 0xf6, 0x33, 0x8e, 0xbe, 0x53, 0xf9, 0xb9, 0x9a, 0xcb, 0x89, 0xb8, + 0xc9, 0x06, 0xf7, 0xdb, 0x8a, 0x5a, 0x64, 0x6c, 0x3f, 0x08, 0x21, 0xda, 0xea, 0xdb, 0xe8, 0xd7, + 0xdf, 0xb2, 0x34, 0xe5, 0x72, 0xb7, 0xe0, 0x55, 0xc1, 0x7d, 0x9d, 0x5a, 0x34, 0xac, 0x65, 0xc6, + 0xee, 0xa7, 0x41, 0x46, 0x1b, 0xfe, 0x3a, 0xfa, 0x6e, 0x2d, 0x39, 0xe3, 0xb1, 0x58, 0xf0, 0x62, + 0x80, 0x6a, 0x69, 0x21, 0xf1, 0xc8, 0x5b, 0x10, 0xb4, 0xbd, 0x2b, 0xb2, 0x05, 0x2f, 0x24, 0x6e, + 0x5b, 0x0b, 0xc3, 0xb6, 0x2d, 0xa4, 0x6d, 0xff, 0xfd, 0x4a, 0xf4, 0xfd, 0x9d, 0x38, 0x16, 0xf3, + 0x4c, 0x1e, 0x89, 0x98, 0xa5, 0x47, 0x49, 0x76, 0x7d, 0xc2, 0x6f, 0x76, 0xaf, 0x2a, 0x3e, 0x9b, + 0xf2, 0xc1, 0x73, 0xff, 0xa9, 0xd6, 0xe8, 0xd0, 0xb0, 0x43, 0x17, 0x36, 0xbe, 0x3f, 0xbf, 0x9d, + 0x92, 0x2e, 0xcb, 0x3f, 0xaf, 0x44, 0x77, 0x60, 0x59, 0x46, 0x22, 0x5d, 0x70, 0x5b, 0x9a, 0x17, + 0x1d, 0x86, 0x7d, 0xdc, 0x94, 0xe7, 0x8b, 0xdb, 0xaa, 0xe9, 0x12, 0xa5, 0xd1, 0x87, 0x6e, 0x77, + 0x19, 0xf1, 0x52, 0x0d, 0xa7, 0xc7, 0x74, 0x8f, 0xd0, 0x88, 0xf1, 0xfc, 0xa4, 0x0f, 0xaa, 0xbd, + 0x25, 0xd1, 0x40, 0x7b, 0x4b, 0x45, 0x69, 0x9c, 0xad, 0xa3, 0x16, 0x1c, 0xc2, 0xf8, 0x7a, 0xdc, + 0x83, 0xd4, 0xae, 0xfe, 0x24, 0xfa, 0x8d, 0xb7, 0xa2, 0xb8, 0x2e, 0x73, 0x16, 0x73, 0x3d, 0x14, + 0x1e, 0xf9, 0xda, 0x8d, 0x14, 0x8e, 0x86, 0xd5, 0x2e, 0xcc, 0xe9, 0xb4, 0x8d, 0xf0, 0x75, 0xce, + 0x61, 0x0c, 0xb2, 0x8a, 0x95, 0x90, 0xea, 0xb4, 0x10, 0xd2, 0xb6, 0xaf, 0xa3, 0x81, 0xb5, 0x7d, + 0xf1, 0xa7, 0x3c, 0x96, 0x3b, 0x93, 0x09, 0x6c, 0x15, 0xab, 0xab, 0x88, 0xe1, 0xce, 0x64, 0x42, + 0xb5, 0x0a, 0x8e, 0x6a, 0x67, 0x37, 0xd1, 0x47, 0xc0, 0xd9, 0x51, 0x52, 0x2a, 0x87, 0x5b, 0x61, + 0x2b, 0x1a, 0x33, 0x4e, 0x87, 0x7d, 0x71, 0xed, 0xf8, 0x2f, 0x57, 0xa2, 0xef, 0x21, 0x9e, 0xcf, + 0xf8, 0x4c, 0x2c, 0xf8, 0xe0, 0x69, 0xb7, 0xb5, 0x9a, 0x34, 0xfe, 0x3f, 0xbb, 0x85, 0x06, 0xd2, + 0x4d, 0x46, 0x3c, 0xe5, 0xb1, 0x24, 0xbb, 0x49, 0x2d, 0xee, 0xec, 0x26, 0x06, 0x73, 0x46, 0x58, + 0x23, 0x3c, 0xe0, 0x72, 0x77, 0x5e, 0x14, 0x3c, 0x93, 0x64, 0x5b, 0x5a, 0xa4, 0xb3, 0x2d, 0x3d, + 0x14, 0xa9, 0xcf, 0x01, 0x97, 0x3b, 0x69, 0x4a, 0xd6, 0xa7, 0x16, 0x77, 0xd6, 0xc7, 0x60, 0xda, + 0x43, 0x1c, 0xfd, 0xa6, 0xf3, 0xc4, 0xe4, 0x61, 0x76, 0x29, 0x06, 0xf4, 0xb3, 0x50, 0x72, 0xe3, + 0x63, 0xad, 0x93, 0x43, 0xaa, 0xf1, 0xea, 0x5d, 0x2e, 0x0a, 0xba, 0x59, 0x6a, 0x71, 0x67, 0x35, + 0x0c, 0xa6, 0x3d, 0xfc, 0x71, 0xf4, 0x81, 0x8e, 0x92, 0xcd, 0x7c, 0xf6, 0x10, 0x0d, 0xa1, 0x70, + 0x42, 0x7b, 0xd4, 0x41, 0xd9, 0xe0, 0xa0, 0x65, 0x3a, 0xf8, 0x7c, 0x8a, 0xea, 0x81, 0xd0, 0xf3, + 0x30, 0x0c, 0xb5, 0x6c, 0xef, 0xf1, 0x94, 0x93, 0xb6, 0x6b, 0x61, 0x87, 0x6d, 0x03, 0x69, 0xdb, + 0x45, 0xf4, 0x3b, 0xe6, 0xb1, 0x54, 0xf3, 0xa8, 0x92, 0x57, 0x41, 0x7a, 0x83, 0xa8, 0xb7, 0x0b, + 0x19, 0x5f, 0x9b, 0xfd, 0xe0, 0x56, 0x7d, 0xf4, 0x08, 0xc4, 0xeb, 0x03, 0xc6, 0xdf, 0xc3, 0x30, + 0xa4, 0x6d, 0xff, 0xc3, 0x4a, 0xf4, 0x03, 0x2d, 0x7b, 0x95, 0xb1, 0x8b, 0x94, 0xab, 0x29, 0xf1, + 0x84, 0xcb, 0x1b, 0x51, 0x5c, 0x8f, 0x96, 0x59, 0x4c, 0x4c, 0xff, 0x38, 0xdc, 0x31, 0xfd, 0x93, + 0x4a, 0x4e, 0xc6, 0xa7, 0x2b, 0x2a, 0x45, 0x0e, 0x33, 0xbe, 0xa6, 0x06, 0x52, 0xe4, 0x54, 0xc6, + 0xe7, 0x23, 0x2d, 0xab, 0xc7, 0x55, 0xd8, 0xc4, 0xad, 0x1e, 0xbb, 0x71, 0xf2, 0x41, 0x08, 0xb1, + 0x61, 0xab, 0xe9, 0xc0, 0x22, 0xbb, 0x4c, 0xa6, 0xe7, 0xf9, 0xa4, 0xea, 0xc6, 0x8f, 0xf1, 0x1e, + 0xea, 0x20, 0x44, 0xd8, 0x22, 0x50, 0xed, 0xed, 0x9f, 0x6c, 0x62, 0xa4, 0x87, 0xd2, 0x7e, 0x21, + 0x66, 0x47, 0x7c, 0xca, 0xe2, 0xa5, 0x1e, 0xff, 0x9f, 0x87, 0x06, 0x1e, 0xa4, 0x4d, 0x21, 0x5e, + 0xdc, 0x52, 0x4b, 0x97, 0xe7, 0x3f, 0x57, 0xa2, 0x87, 0x4d, 0xf5, 0xaf, 0x58, 0x36, 0xe5, 0xba, + 0x3d, 0xeb, 0xd2, 0xef, 0x64, 0x93, 0x33, 0x5e, 0x4a, 0x56, 0xc8, 0xc1, 0x8f, 0xf0, 0x4a, 0x86, + 0x74, 0x4c, 0xd9, 0x7e, 0xfc, 0x2b, 0xe9, 0xda, 0x56, 0x1f, 0x55, 0x81, 0x4d, 0x87, 0x00, 0xbf, + 0xd5, 0x95, 0x04, 0x06, 0x80, 0x07, 0x21, 0xc4, 0xb6, 0xba, 0x12, 0x1c, 0x66, 0x8b, 0x44, 0xf2, + 0x03, 0x9e, 0xf1, 0xa2, 0xdd, 0xea, 0xb5, 0xaa, 0x8f, 0x10, 0xad, 0x4e, 0xa0, 0x36, 0xd8, 0x78, + 0xde, 0xcc, 0xe4, 0xb8, 0x11, 0x30, 0xd2, 0x9a, 0x1e, 0x37, 0xfb, 0xc1, 0x76, 0x75, 0xe7, 0xf8, + 0x3c, 0xe3, 0x0b, 0x71, 0x0d, 0x57, 0x77, 0xae, 0x89, 0x1a, 0x20, 0x56, 0x77, 0x28, 0x68, 0x67, + 0x30, 0xc7, 0xcf, 0x9b, 0x84, 0xdf, 0x80, 0x19, 0xcc, 0x55, 0xae, 0xc4, 0xc4, 0x0c, 0x86, 0x60, + 0xda, 0xc3, 0x49, 0xf4, 0x6b, 0x4a, 0xf8, 0x87, 0x22, 0xc9, 0x06, 0x77, 0x11, 0xa5, 0x4a, 0x60, + 0xac, 0xde, 0xa3, 0x01, 0x50, 0xe2, 0xea, 0xd7, 0x5d, 0x96, 0xc5, 0x3c, 0x45, 0x4b, 0x6c, 0xc5, + 0xc1, 0x12, 0x7b, 0x98, 0x4d, 0x1d, 0x94, 0xb0, 0x8a, 0x5f, 0xa3, 0x2b, 0x56, 0x24, 0xd9, 0x74, + 0x80, 0xe9, 0x3a, 0x72, 0x22, 0x75, 0xc0, 0x38, 0xd0, 0x85, 0xb5, 0xe2, 0x4e, 0x9e, 0x17, 0x55, + 0x58, 0xc4, 0xba, 0xb0, 0x8f, 0x04, 0xbb, 0x70, 0x0b, 0xc5, 0xbd, 0xed, 0xf1, 0x38, 0x4d, 0xb2, + 0xa0, 0x37, 0x8d, 0xf4, 0xf1, 0x66, 0x51, 0xd0, 0x79, 0x8f, 0x38, 0x5b, 0xf0, 0xa6, 0x66, 0xd8, + 0x93, 0x71, 0x81, 0x60, 0xe7, 0x05, 0xa0, 0x5d, 0xa7, 0x29, 0xf1, 0x31, 0xbb, 0xe6, 0xd5, 0x03, + 0xe6, 0xd5, 0xbc, 0x36, 0xc0, 0xf4, 0x3d, 0x82, 0x58, 0xa7, 0xe1, 0xa4, 0x76, 0x35, 0x8f, 0x3e, + 0x52, 0xf2, 0x53, 0x56, 0xc8, 0x24, 0x4e, 0x72, 0x96, 0x35, 0xf9, 0x3f, 0x36, 0xae, 0x5b, 0x94, + 0x71, 0xb9, 0xd5, 0x93, 0xd6, 0x6e, 0xff, 0x63, 0x25, 0xba, 0x0f, 0xfd, 0x9e, 0xf2, 0x62, 0x96, + 0xa8, 0x65, 0x64, 0x59, 0x07, 0xe1, 0xc1, 0x97, 0x61, 0xa3, 0x2d, 0x05, 0x53, 0x9a, 0x1f, 0xde, + 0x5e, 0xd1, 0x26, 0x43, 0x23, 0x9d, 0x5a, 0xbf, 0x2e, 0x26, 0xad, 0x6d, 0x96, 0x51, 0x93, 0x2f, + 0x2b, 0x21, 0x91, 0x0c, 0xb5, 0x20, 0x30, 0xc2, 0xcf, 0xb3, 0xb2, 0xb1, 0x8e, 0x8d, 0x70, 0x2b, + 0x0e, 0x8e, 0x70, 0x0f, 0xb3, 0x23, 0xfc, 0x74, 0x7e, 0x91, 0x26, 0xe5, 0x55, 0x92, 0x4d, 0x75, + 0xe6, 0xeb, 0xeb, 0x5a, 0x31, 0x4c, 0x7e, 0xd7, 0x3a, 0x39, 0xcc, 0x89, 0xee, 0x2c, 0xa4, 0x13, + 0xd0, 0x4d, 0xd6, 0x3a, 0x39, 0xbb, 0x3e, 0xb0, 0xd2, 0x6a, 0xe5, 0x08, 0xd6, 0x07, 0x8e, 0x6a, + 0x25, 0x25, 0xd6, 0x07, 0x6d, 0x4a, 0x9b, 0x17, 0xd1, 0x6f, 0xbb, 0x75, 0x28, 0x45, 0xba, 0xe0, + 0xe7, 0x45, 0x32, 0x78, 0x42, 0x97, 0xaf, 0x61, 0x8c, 0xab, 0x8d, 0x5e, 0xac, 0x0d, 0x54, 0x96, + 0x38, 0xe0, 0x72, 0x24, 0x99, 0x9c, 0x97, 0x20, 0x50, 0x39, 0x36, 0x0c, 0x42, 0x04, 0x2a, 0x02, + 0xd5, 0xde, 0xfe, 0x28, 0x8a, 0xea, 0x45, 0xb7, 0xda, 0x18, 0xf1, 0xe7, 0x1e, 0xbd, 0x1a, 0xf7, + 0x76, 0x45, 0xee, 0x07, 0x08, 0x9b, 0xf0, 0xd4, 0xbf, 0xab, 0xfd, 0x9e, 0x01, 0xaa, 0xa1, 0x44, + 0x44, 0xc2, 0x03, 0x10, 0x58, 0xd0, 0xd1, 0x95, 0xb8, 0xc1, 0x0b, 0x5a, 0x49, 0xc2, 0x05, 0xd5, + 0x84, 0xdd, 0x81, 0xd5, 0x05, 0xc5, 0x76, 0x60, 0x9b, 0x62, 0x84, 0x76, 0x60, 0x21, 0x63, 0xfb, + 0x8c, 0x6b, 0xf8, 0xa5, 0x10, 0xd7, 0x33, 0x56, 0x5c, 0x83, 0x3e, 0xe3, 0x29, 0x37, 0x0c, 0xd1, + 0x67, 0x28, 0xd6, 0xf6, 0x19, 0xd7, 0x61, 0x95, 0x2e, 0x9f, 0x17, 0x29, 0xe8, 0x33, 0x9e, 0x0d, + 0x8d, 0x10, 0x7d, 0x86, 0x40, 0x6d, 0x74, 0x72, 0xbd, 0x8d, 0x38, 0x5c, 0xf3, 0x7b, 0xea, 0x23, + 0x4e, 0xad, 0xf9, 0x11, 0x0c, 0x76, 0xa1, 0x83, 0x82, 0xe5, 0x57, 0x78, 0x17, 0x52, 0xa2, 0x70, + 0x17, 0x6a, 0x10, 0xd8, 0xde, 0x23, 0xce, 0x8a, 0xf8, 0x0a, 0x6f, 0xef, 0x5a, 0x16, 0x6e, 0x6f, + 0xc3, 0xc0, 0xf6, 0xae, 0x05, 0x6f, 0x13, 0x79, 0x75, 0xcc, 0x25, 0xc3, 0xdb, 0xdb, 0x67, 0xc2, + 0xed, 0xdd, 0x62, 0x6d, 0x3e, 0xee, 0x3a, 0x1c, 0xcd, 0x2f, 0xca, 0xb8, 0x48, 0x2e, 0xf8, 0x20, + 0x60, 0xc5, 0x40, 0x44, 0x3e, 0x4e, 0xc2, 0xda, 0xe7, 0xcf, 0x57, 0xa2, 0xbb, 0x4d, 0xb3, 0x8b, + 0xb2, 0xd4, 0x73, 0x9f, 0xef, 0xfe, 0x05, 0xde, 0xbe, 0x04, 0x4e, 0xec, 0x89, 0xf7, 0x50, 0x73, + 0x72, 0x03, 0xbc, 0x48, 0xe7, 0x59, 0x69, 0x0a, 0xf5, 0x65, 0x1f, 0xeb, 0x8e, 0x02, 0x91, 0x1b, + 0xf4, 0x52, 0xb4, 0x69, 0x99, 0x6e, 0x9f, 0x46, 0x76, 0x38, 0x29, 0x41, 0x5a, 0xd6, 0x3c, 0x6f, + 0x87, 0x20, 0xd2, 0x32, 0x9c, 0x84, 0x5d, 0xe1, 0xa0, 0x10, 0xf3, 0xbc, 0xec, 0xe8, 0x0a, 0x00, + 0x0a, 0x77, 0x85, 0x36, 0xac, 0x7d, 0xbe, 0x8b, 0x7e, 0xd7, 0xed, 0x7e, 0xee, 0xc3, 0xde, 0xa2, + 0xfb, 0x14, 0xf6, 0x88, 0x87, 0x7d, 0x71, 0x9b, 0x51, 0x34, 0x9e, 0xe5, 0x1e, 0x97, 0x2c, 0x49, + 0xcb, 0xc1, 0x2a, 0x6e, 0xa3, 0x91, 0x13, 0x19, 0x05, 0xc6, 0xc1, 0xf8, 0xb6, 0x37, 0xcf, 0xd3, + 0x24, 0x6e, 0xbf, 0x91, 0xd0, 0xba, 0x46, 0x1c, 0x8e, 0x6f, 0x2e, 0x06, 0xe3, 0x75, 0x95, 0xfa, + 0xa9, 0xff, 0x8c, 0x97, 0x39, 0xc7, 0xe3, 0xb5, 0x87, 0x84, 0xe3, 0x35, 0x44, 0x61, 0x7d, 0x46, + 0x5c, 0x1e, 0xb1, 0xa5, 0x98, 0x13, 0xf1, 0xda, 0x88, 0xc3, 0xf5, 0x71, 0x31, 0xbb, 0x36, 0x30, + 0x1e, 0x0e, 0x33, 0xc9, 0x8b, 0x8c, 0xa5, 0xfb, 0x29, 0x9b, 0x96, 0x03, 0x22, 0xc6, 0xf8, 0x14, + 0xb1, 0x36, 0xa0, 0x69, 0xe4, 0x31, 0x1e, 0x96, 0xfb, 0x6c, 0x21, 0x8a, 0x44, 0xd2, 0x8f, 0xd1, + 0x22, 0x9d, 0x8f, 0xd1, 0x43, 0x51, 0x6f, 0x3b, 0x45, 0x7c, 0x95, 0x2c, 0xf8, 0x24, 0xe0, 0xad, + 0x41, 0x7a, 0x78, 0x73, 0x50, 0xa4, 0xd1, 0x46, 0x62, 0x5e, 0xc4, 0x9c, 0x6c, 0xb4, 0x5a, 0xdc, + 0xd9, 0x68, 0x06, 0xd3, 0x1e, 0xfe, 0x66, 0x25, 0xfa, 0xbd, 0x5a, 0xea, 0xbe, 0x26, 0xd8, 0x63, + 0xe5, 0xd5, 0x85, 0x60, 0xc5, 0x64, 0xf0, 0x19, 0x66, 0x07, 0x45, 0x8d, 0xeb, 0x67, 0xb7, 0x51, + 0x81, 0x8f, 0xb5, 0xca, 0xbb, 0xed, 0x88, 0x43, 0x1f, 0xab, 0x87, 0x84, 0x1f, 0x2b, 0x44, 0x61, + 0x00, 0x51, 0xf2, 0x7a, 0x4b, 0x6e, 0x95, 0xd4, 0xf7, 0xf7, 0xe5, 0xd6, 0x3a, 0x39, 0x18, 0x1f, + 0x2b, 0xa1, 0xdf, 0x5b, 0xb6, 0x28, 0x1b, 0x78, 0x8f, 0x19, 0xf6, 0xc5, 0x49, 0xcf, 0x66, 0x54, + 0x84, 0x3d, 0xb7, 0x46, 0xc6, 0xb0, 0x2f, 0x4e, 0x78, 0x76, 0xc2, 0x5a, 0xc8, 0x33, 0x12, 0xda, + 0x86, 0x7d, 0x71, 0x98, 0x7d, 0x69, 0xa6, 0x99, 0x17, 0x9e, 0x04, 0xec, 0xc0, 0xb9, 0x61, 0xa3, + 0x17, 0xab, 0x1d, 0xfe, 0xdd, 0x4a, 0xf4, 0x7d, 0xeb, 0xf1, 0x58, 0x4c, 0x92, 0xcb, 0x65, 0x0d, + 0xbd, 0x61, 0xe9, 0x9c, 0x97, 0x83, 0x67, 0x94, 0xb5, 0x36, 0x6b, 0x4a, 0xf0, 0xfc, 0x56, 0x3a, + 0x70, 0xec, 0xec, 0xe4, 0x79, 0xba, 0x1c, 0xf3, 0x59, 0x9e, 0x92, 0x63, 0xc7, 0x43, 0xc2, 0x63, + 0x07, 0xa2, 0x30, 0x2b, 0x1f, 0x8b, 0x2a, 0xe7, 0x47, 0xb3, 0x72, 0x25, 0x0a, 0x67, 0xe5, 0x0d, + 0x02, 0x73, 0xa5, 0xb1, 0xd8, 0x15, 0x69, 0xca, 0x63, 0xd9, 0x3e, 0x6a, 0x60, 0x34, 0x2d, 0x11, + 0xce, 0x95, 0x00, 0x69, 0x77, 0xe5, 0x9a, 0x35, 0x24, 0x2b, 0xf8, 0xcb, 0xe5, 0x51, 0x92, 0x5d, + 0x0f, 0xf0, 0xb4, 0xc0, 0x02, 0xc4, 0xae, 0x1c, 0x0a, 0xc2, 0xb5, 0xea, 0x79, 0x36, 0x11, 0xf8, + 0x5a, 0xb5, 0x92, 0x84, 0xd7, 0xaa, 0x9a, 0x80, 0x26, 0xcf, 0x38, 0x65, 0xb2, 0x92, 0x84, 0x4d, + 0x6a, 0x02, 0x0b, 0x85, 0xfa, 0xdd, 0x0d, 0x19, 0x0a, 0xc1, 0xdb, 0x9a, 0xb5, 0x4e, 0x0e, 0xf6, + 0xd0, 0x66, 0xd1, 0xba, 0xcf, 0x65, 0x7c, 0x85, 0xf7, 0x50, 0x0f, 0x09, 0xf7, 0x50, 0x88, 0xc2, + 0x2a, 0x8d, 0x85, 0x59, 0x74, 0xaf, 0xe2, 0xfd, 0xa3, 0xb5, 0xe0, 0x5e, 0xeb, 0xe4, 0xe0, 0x32, + 0xf2, 0x70, 0xa6, 0x9e, 0x19, 0xda, 0xc9, 0x6b, 0x59, 0x78, 0x19, 0x69, 0x18, 0x58, 0xfa, 0x5a, + 0xa0, 0xf6, 0xb2, 0x56, 0x69, 0x45, 0x6f, 0x37, 0x6b, 0xad, 0x93, 0xd3, 0x4e, 0xfe, 0xcd, 0x2c, + 0xe3, 0x6a, 0xe9, 0x89, 0xa8, 0xc6, 0xc8, 0x1b, 0x96, 0x26, 0x13, 0x26, 0xf9, 0x58, 0x5c, 0xf3, + 0x0c, 0x5f, 0x31, 0xe9, 0xd2, 0xd6, 0xfc, 0xd0, 0x53, 0x08, 0xaf, 0x98, 0xc2, 0x8a, 0xb0, 0x9f, + 0xd4, 0xf4, 0x79, 0xc9, 0x77, 0x59, 0x49, 0x44, 0x32, 0x0f, 0x09, 0xf7, 0x13, 0x88, 0xc2, 0x7c, + 0xb5, 0x96, 0xbf, 0x7a, 0x97, 0xf3, 0x22, 0xe1, 0x59, 0xcc, 0xf1, 0x7c, 0x15, 0x52, 0xe1, 0x7c, + 0x15, 0xa1, 0xe1, 0x5a, 0x6d, 0x8f, 0x49, 0xfe, 0x72, 0x39, 0x4e, 0x66, 0xbc, 0x94, 0x6c, 0x96, + 0xe3, 0x6b, 0x35, 0x00, 0x85, 0xd7, 0x6a, 0x6d, 0xb8, 0xb5, 0x35, 0x64, 0x02, 0x62, 0xfb, 0x84, + 0x12, 0x24, 0x02, 0x27, 0x94, 0x08, 0x14, 0x3e, 0x58, 0x0b, 0xa0, 0x2f, 0x09, 0x5a, 0x56, 0x82, + 0x2f, 0x09, 0x68, 0xba, 0xb5, 0xe1, 0x66, 0x98, 0x51, 0x35, 0x34, 0x3b, 0x8a, 0x3e, 0x72, 0x87, + 0xe8, 0x46, 0x2f, 0x16, 0xdf, 0xe1, 0x3b, 0xe3, 0x29, 0x53, 0xd3, 0x56, 0x60, 0x1b, 0xad, 0x61, + 0xfa, 0xec, 0xf0, 0x39, 0xac, 0x76, 0xf8, 0x57, 0x2b, 0xd1, 0x27, 0x98, 0xc7, 0xd7, 0xb9, 0xf2, + 0xfb, 0xb4, 0xdb, 0x56, 0x4d, 0x12, 0x47, 0xb0, 0xc2, 0x1a, 0xba, 0x0c, 0x7f, 0x16, 0x7d, 0xdc, + 0x88, 0xec, 0x09, 0x2d, 0x5d, 0x00, 0x3f, 0x69, 0x33, 0xe5, 0x87, 0x9c, 0x71, 0xbf, 0xdd, 0x9b, + 0xb7, 0xeb, 0x21, 0xbf, 0x5c, 0x25, 0x58, 0x0f, 0x19, 0x1b, 0x5a, 0x4c, 0xac, 0x87, 0x10, 0xcc, + 0x8e, 0x4e, 0xb7, 0x7a, 0x6f, 0x13, 0x79, 0xa5, 0xf2, 0x2d, 0x30, 0x3a, 0xbd, 0xb2, 0x1a, 0x88, + 0x18, 0x9d, 0x24, 0x0c, 0x33, 0x92, 0x06, 0xac, 0xc6, 0x26, 0x16, 0xcb, 0x8d, 0x21, 0x77, 0x64, + 0xae, 0x77, 0x83, 0xb0, 0xbf, 0x36, 0x62, 0xbd, 0xf4, 0x79, 0x12, 0xb2, 0x00, 0x96, 0x3f, 0x1b, + 0xbd, 0x58, 0xed, 0xf0, 0x2f, 0xa2, 0xef, 0xb5, 0x2a, 0xb6, 0xcf, 0x99, 0x9c, 0x17, 0x7c, 0x32, + 0xd8, 0xee, 0x28, 0x77, 0x03, 0x1a, 0xd7, 0x4f, 0xfb, 0x2b, 0xb4, 0x72, 0xf4, 0x86, 0xab, 0xbb, + 0x95, 0x29, 0xc3, 0xb3, 0x90, 0x49, 0x9f, 0x0d, 0xe6, 0xe8, 0xb4, 0x4e, 0x6b, 0x99, 0xed, 0xf6, + 0xae, 0x9d, 0x05, 0x4b, 0x52, 0xf5, 0xb2, 0xf6, 0xb3, 0x90, 0x51, 0x0f, 0x0d, 0x2e, 0xb3, 0x49, + 0x95, 0x56, 0x64, 0x56, 0x63, 0xdc, 0x59, 0x9e, 0x6d, 0xd2, 0x91, 0x00, 0x59, 0x9d, 0x6d, 0xf5, + 0xa4, 0xb5, 0x5b, 0xd9, 0x4c, 0x79, 0xd5, 0xcf, 0x6e, 0x27, 0xc7, 0xbc, 0x6a, 0x55, 0xa4, 0xa7, + 0x6f, 0xf5, 0xa4, 0xb5, 0xd7, 0x3f, 0x8f, 0x3e, 0x6e, 0x7b, 0xd5, 0x13, 0xd1, 0x76, 0xa7, 0x29, + 0x30, 0x17, 0x3d, 0xed, 0xaf, 0x60, 0x97, 0x34, 0x5f, 0x25, 0xa5, 0x14, 0xc5, 0x72, 0x74, 0x25, + 0x6e, 0x9a, 0x2f, 0x1f, 0xfc, 0xd1, 0xaa, 0x81, 0xa1, 0x43, 0x10, 0x4b, 0x1a, 0x9c, 0x6c, 0xb9, + 0xb2, 0x5f, 0x48, 0x94, 0x84, 0x2b, 0x87, 0xe8, 0x70, 0xe5, 0x93, 0x36, 0x56, 0x35, 0xb5, 0xb2, + 0x9f, 0x73, 0xac, 0xe1, 0x45, 0x6d, 0x7f, 0xd2, 0xb1, 0xde, 0x0d, 0xda, 0x8c, 0x45, 0x8b, 0xf7, + 0x92, 0xcb, 0x4b, 0x53, 0x27, 0xbc, 0xa4, 0x2e, 0x42, 0x64, 0x2c, 0x04, 0x6a, 0x93, 0xee, 0xfd, + 0x24, 0xe5, 0x6a, 0x47, 0xff, 0xf5, 0xe5, 0x65, 0x2a, 0xd8, 0x04, 0x24, 0xdd, 0x95, 0x78, 0xe8, + 0xca, 0x89, 0xa4, 0x1b, 0xe3, 0xec, 0x59, 0x81, 0x4a, 0x7a, 0xc6, 0x63, 0x91, 0xc5, 0x49, 0x0a, + 0x0f, 0x82, 0x2a, 0x4d, 0x23, 0x24, 0xce, 0x0a, 0xb4, 0x20, 0x3b, 0x31, 0x56, 0xa2, 0x6a, 0xd8, + 0x37, 0xe5, 0x7f, 0xd4, 0x56, 0x74, 0xc4, 0xc4, 0xc4, 0x88, 0x60, 0x76, 0xed, 0x59, 0x09, 0xcf, + 0x73, 0x65, 0xfc, 0x5e, 0x5b, 0xab, 0x96, 0x10, 0x6b, 0x4f, 0x9f, 0xb0, 0x6b, 0xa8, 0xea, 0xf7, + 0x3d, 0x71, 0x93, 0x29, 0xa3, 0x0f, 0xda, 0x2a, 0x8d, 0x8c, 0x58, 0x43, 0x41, 0x46, 0x1b, 0xfe, + 0x49, 0xf4, 0xff, 0x95, 0xe1, 0x42, 0xe4, 0x83, 0x3b, 0x88, 0x42, 0xe1, 0x9c, 0xd9, 0xbc, 0x4b, + 0xca, 0xed, 0xd1, 0x02, 0xd3, 0x37, 0xce, 0x4b, 0x36, 0xe5, 0x83, 0x87, 0x44, 0x8b, 0x2b, 0x29, + 0x71, 0xb4, 0xa0, 0x4d, 0xf9, 0xbd, 0xe2, 0x44, 0x4c, 0xb4, 0x75, 0xa4, 0x86, 0x46, 0x18, 0xea, + 0x15, 0x2e, 0x64, 0x93, 0x99, 0x13, 0xb6, 0x48, 0xa6, 0x66, 0xc2, 0xa9, 0xe3, 0x56, 0x09, 0x92, + 0x19, 0xcb, 0x0c, 0x1d, 0x88, 0x48, 0x66, 0x48, 0x58, 0xfb, 0xfc, 0xd7, 0x95, 0xe8, 0x9e, 0x65, + 0x0e, 0x9a, 0xdd, 0xba, 0xc3, 0xec, 0x52, 0x54, 0xa9, 0xcf, 0x51, 0x92, 0x5d, 0x97, 0x83, 0x2f, + 0x28, 0x93, 0x38, 0x6f, 0x8a, 0xf2, 0xe5, 0xad, 0xf5, 0x6c, 0xd6, 0xda, 0x6c, 0x65, 0xd9, 0xf7, + 0xd9, 0xb5, 0x06, 0xc8, 0x5a, 0xcd, 0x8e, 0x17, 0xe4, 0x88, 0xac, 0x35, 0xc4, 0xdb, 0x26, 0x36, + 0xce, 0x53, 0x91, 0xc1, 0x26, 0xb6, 0x16, 0x2a, 0x21, 0xd1, 0xc4, 0x2d, 0xc8, 0xc6, 0xe3, 0x46, + 0x54, 0xef, 0xba, 0xec, 0xa4, 0x29, 0x88, 0xc7, 0x46, 0xd5, 0x00, 0x44, 0x3c, 0x46, 0x41, 0xed, + 0xe7, 0x2c, 0xfa, 0x4e, 0xf5, 0x48, 0x4f, 0x0b, 0xbe, 0x48, 0x38, 0x3c, 0x7a, 0xe1, 0x48, 0x88, + 0xf1, 0xef, 0x13, 0x76, 0x64, 0x9d, 0x67, 0x65, 0x9e, 0xb2, 0xf2, 0x4a, 0xbf, 0x8c, 0xf7, 0xeb, + 0xdc, 0x08, 0xe1, 0xeb, 0xf8, 0x47, 0x1d, 0x94, 0x0d, 0xea, 0x8d, 0xcc, 0x84, 0x98, 0x55, 0x5c, + 0xb5, 0x15, 0x66, 0xd6, 0x3a, 0x39, 0xbb, 0xe3, 0x7d, 0xc0, 0xd2, 0x94, 0x17, 0xcb, 0x46, 0x76, + 0xcc, 0xb2, 0xe4, 0x92, 0x97, 0x12, 0xec, 0x78, 0x6b, 0x6a, 0x08, 0x31, 0x62, 0xc7, 0x3b, 0x80, + 0xdb, 0x6c, 0x1e, 0x78, 0x3e, 0xcc, 0x26, 0xfc, 0x1d, 0xc8, 0xe6, 0xa1, 0x1d, 0xc5, 0x10, 0xd9, + 0x3c, 0xc5, 0xda, 0x9d, 0xdf, 0x97, 0xa9, 0x88, 0xaf, 0xf5, 0x14, 0xe0, 0x37, 0xb0, 0x92, 0xc0, + 0x39, 0xe0, 0x41, 0x08, 0xb1, 0x93, 0x80, 0x12, 0x9c, 0xf1, 0x3c, 0x65, 0x31, 0x3c, 0x7f, 0x53, + 0xeb, 0x68, 0x19, 0x31, 0x09, 0x40, 0x06, 0x14, 0x57, 0x9f, 0xeb, 0xc1, 0x8a, 0x0b, 0x8e, 0xf5, + 0x3c, 0x08, 0x21, 0x76, 0x1a, 0x54, 0x82, 0x51, 0x9e, 0x26, 0x12, 0x0c, 0x83, 0x5a, 0x43, 0x49, + 0x88, 0x61, 0xe0, 0x13, 0xc0, 0xe4, 0x31, 0x2f, 0xa6, 0x1c, 0x35, 0xa9, 0x24, 0x41, 0x93, 0x0d, + 0x61, 0x0f, 0x1b, 0xd7, 0x75, 0x17, 0xf9, 0x12, 0x1c, 0x36, 0xd6, 0xd5, 0x12, 0xf9, 0x92, 0x38, + 0x6c, 0xec, 0x01, 0xa0, 0x88, 0xa7, 0xac, 0x94, 0x78, 0x11, 0x95, 0x24, 0x58, 0xc4, 0x86, 0xb0, + 0x73, 0x74, 0x5d, 0xc4, 0xb9, 0x04, 0x73, 0xb4, 0x2e, 0x80, 0xf3, 0x06, 0xfa, 0x2e, 0x29, 0xb7, + 0x91, 0xa4, 0x6e, 0x15, 0x2e, 0xf7, 0x13, 0x9e, 0x4e, 0x4a, 0x10, 0x49, 0xf4, 0x73, 0x6f, 0xa4, + 0x44, 0x24, 0x69, 0x53, 0xa0, 0x2b, 0xe9, 0xfd, 0x71, 0xac, 0x76, 0x60, 0x6b, 0xfc, 0x41, 0x08, + 0xb1, 0xf1, 0xa9, 0x29, 0xf4, 0x2e, 0x2b, 0x8a, 0xa4, 0x9a, 0xfc, 0x57, 0xf1, 0x02, 0x35, 0x72, + 0x22, 0x3e, 0x61, 0x1c, 0x18, 0x5e, 0x4d, 0xe0, 0xc6, 0x0a, 0x06, 0x43, 0xf7, 0xa7, 0x41, 0xc6, + 0x66, 0x9c, 0x4a, 0xe2, 0xbc, 0x42, 0xc5, 0x9e, 0x26, 0xf2, 0x06, 0x75, 0xb5, 0x0b, 0x73, 0x3e, + 0x06, 0x32, 0x2e, 0x8e, 0xc5, 0x82, 0x8f, 0xc5, 0xab, 0x77, 0x49, 0x29, 0x93, 0x6c, 0xaa, 0x67, + 0xee, 0xe7, 0x84, 0x25, 0x0c, 0x26, 0x3e, 0x06, 0xea, 0x54, 0xb2, 0x09, 0x04, 0x28, 0xcb, 0x09, + 0xbf, 0x41, 0x13, 0x08, 0x68, 0xd1, 0x70, 0x44, 0x02, 0x11, 0xe2, 0xed, 0x3e, 0x8a, 0x71, 0xae, + 0xbf, 0x98, 0x1e, 0x8b, 0x26, 0x97, 0xa3, 0xac, 0x41, 0x90, 0x58, 0xca, 0x06, 0x15, 0xec, 0xfa, + 0xd2, 0xf8, 0xb7, 0x43, 0x6c, 0x9d, 0xb0, 0xd3, 0x1e, 0x66, 0x8f, 0x7b, 0x90, 0x88, 0x2b, 0x7b, + 0x0e, 0x80, 0x72, 0xd5, 0x3e, 0x06, 0xf0, 0xb8, 0x07, 0xe9, 0xec, 0xc9, 0xb8, 0xd5, 0x7a, 0xc9, + 0xe2, 0xeb, 0x69, 0x21, 0xe6, 0xd9, 0x64, 0x57, 0xa4, 0xa2, 0x00, 0x7b, 0x32, 0x5e, 0xa9, 0x01, + 0x4a, 0xec, 0xc9, 0x74, 0xa8, 0xd8, 0x0c, 0xce, 0x2d, 0xc5, 0x4e, 0x9a, 0x4c, 0xe1, 0x8a, 0xda, + 0x33, 0xa4, 0x00, 0x22, 0x83, 0x43, 0x41, 0xa4, 0x13, 0xd5, 0x2b, 0x6e, 0x99, 0xc4, 0x2c, 0xad, + 0xfd, 0x6d, 0xd3, 0x66, 0x3c, 0xb0, 0xb3, 0x13, 0x21, 0x0a, 0x48, 0x3d, 0xc7, 0xf3, 0x22, 0x3b, + 0xcc, 0xa4, 0x20, 0xeb, 0xd9, 0x00, 0x9d, 0xf5, 0x74, 0x40, 0x10, 0x56, 0xc7, 0xfc, 0x5d, 0x55, + 0x9a, 0xea, 0x1f, 0x2c, 0xac, 0x56, 0xbf, 0x0f, 0xb5, 0x3c, 0x14, 0x56, 0x01, 0x07, 0x2a, 0xa3, + 0x9d, 0xd4, 0x1d, 0x26, 0xa0, 0xed, 0x77, 0x93, 0xf5, 0x6e, 0x10, 0xf7, 0x33, 0x92, 0xcb, 0x94, + 0x87, 0xfc, 0x28, 0xa0, 0x8f, 0x9f, 0x06, 0xb4, 0xdb, 0x2d, 0x5e, 0x7d, 0xae, 0x78, 0x7c, 0xdd, + 0x3a, 0xd6, 0xe4, 0x17, 0xb4, 0x46, 0x88, 0xed, 0x16, 0x02, 0xc5, 0x9b, 0xe8, 0x30, 0x16, 0x59, + 0xa8, 0x89, 0x2a, 0x79, 0x9f, 0x26, 0xd2, 0x9c, 0x5d, 0xfc, 0x1a, 0xa9, 0xee, 0x99, 0x75, 0x33, + 0x6d, 0x10, 0x16, 0x5c, 0x88, 0x58, 0xfc, 0x92, 0xb0, 0xcd, 0xc9, 0xa1, 0xcf, 0xe3, 0xf6, 0x99, + 0xef, 0x96, 0x95, 0x63, 0xfa, 0xcc, 0x37, 0xc5, 0xd2, 0x95, 0xac, 0xfb, 0x48, 0x87, 0x15, 0xbf, + 0x9f, 0x6c, 0xf6, 0x83, 0xed, 0x92, 0xc7, 0xf3, 0xb9, 0x9b, 0x72, 0x56, 0xd4, 0x5e, 0xb7, 0x02, + 0x86, 0x2c, 0x46, 0x2c, 0x79, 0x02, 0x38, 0x08, 0x61, 0x9e, 0xe7, 0x5d, 0x91, 0x49, 0x9e, 0x49, + 0x2c, 0x84, 0xf9, 0xc6, 0x34, 0x18, 0x0a, 0x61, 0x94, 0x02, 0xe8, 0xb7, 0x6a, 0x3f, 0x88, 0xcb, + 0x13, 0x36, 0x43, 0x33, 0xb6, 0x7a, 0xaf, 0xa7, 0x96, 0x87, 0xfa, 0x2d, 0xe0, 0x9c, 0x97, 0x7c, + 0xae, 0x97, 0x31, 0x2b, 0xa6, 0x66, 0x77, 0x63, 0x32, 0x78, 0x4a, 0xdb, 0xf1, 0x49, 0xe2, 0x25, + 0x5f, 0x58, 0x03, 0x84, 0x9d, 0xc3, 0x19, 0x9b, 0x9a, 0x9a, 0x22, 0x35, 0x50, 0xf2, 0x56, 0x55, + 0xd7, 0xbb, 0x41, 0xe0, 0xe7, 0x4d, 0x32, 0xe1, 0x22, 0xe0, 0x47, 0xc9, 0xfb, 0xf8, 0x81, 0x20, + 0xc8, 0xde, 0xaa, 0x7a, 0xd7, 0x2b, 0xba, 0x9d, 0x6c, 0xa2, 0xd7, 0xb1, 0x43, 0xe2, 0xf1, 0x00, + 0x2e, 0x94, 0xbd, 0x11, 0x3c, 0x18, 0xa3, 0xcd, 0x06, 0x6d, 0x68, 0x8c, 0x9a, 0xfd, 0xd7, 0x3e, + 0x63, 0x14, 0x83, 0xb5, 0xcf, 0x9f, 0xe9, 0x31, 0xba, 0xc7, 0x24, 0xab, 0xf2, 0xf6, 0x37, 0x09, + 0xbf, 0xd1, 0x0b, 0x61, 0xa4, 0xbe, 0x0d, 0x35, 0x54, 0x9f, 0xac, 0x82, 0x55, 0xf1, 0x76, 0x6f, + 0x3e, 0xe0, 0x5b, 0xaf, 0x10, 0x3a, 0x7d, 0x83, 0xa5, 0xc2, 0x76, 0x6f, 0x3e, 0xe0, 0x5b, 0x7f, + 0x0b, 0xdf, 0xe9, 0x1b, 0x7c, 0x10, 0xbf, 0xdd, 0x9b, 0xd7, 0xbe, 0xff, 0xba, 0x19, 0xb8, 0xae, + 0xf3, 0x2a, 0x0f, 0x8b, 0x65, 0xb2, 0xe0, 0x58, 0x3a, 0xe9, 0xdb, 0x33, 0x68, 0x28, 0x9d, 0xa4, + 0x55, 0x9c, 0x0b, 0x94, 0xb0, 0x52, 0x9c, 0x8a, 0x32, 0x51, 0x2f, 0xe9, 0x9f, 0xf7, 0x30, 0xda, + 0xc0, 0xa1, 0x45, 0x53, 0x48, 0xc9, 0xbe, 0x6e, 0xf4, 0x50, 0x7b, 0x8a, 0x79, 0x33, 0x60, 0xaf, + 0x7d, 0x98, 0x79, 0xab, 0x27, 0x6d, 0x5f, 0xfc, 0x79, 0x8c, 0xfb, 0xc6, 0x31, 0xd4, 0xaa, 0xe8, + 0x4b, 0xc7, 0xa7, 0xfd, 0x15, 0xb4, 0xfb, 0xbf, 0x6d, 0xd6, 0x15, 0xd0, 0xbf, 0x1e, 0x04, 0xcf, + 0xfa, 0x58, 0x04, 0x03, 0xe1, 0xf9, 0xad, 0x74, 0x74, 0x41, 0xfe, 0xb1, 0x59, 0x40, 0x37, 0xa8, + 0xfa, 0x96, 0x43, 0x7d, 0x03, 0xaa, 0xc7, 0x44, 0xa8, 0x59, 0x2d, 0x0c, 0x47, 0xc6, 0x8b, 0x5b, + 0x6a, 0x39, 0xd7, 0x69, 0x79, 0xb0, 0xfe, 0xe6, 0xd0, 0x29, 0x4f, 0xc8, 0xb2, 0x43, 0xc3, 0x02, + 0x7d, 0x71, 0x5b, 0x35, 0x6a, 0xac, 0x38, 0xb0, 0xba, 0x9d, 0xe3, 0x79, 0x4f, 0xc3, 0xde, 0x7d, + 0x1d, 0x9f, 0xdf, 0x4e, 0x49, 0x97, 0xe5, 0xbf, 0x56, 0xa2, 0x47, 0x1e, 0x6b, 0xdf, 0x27, 0x80, + 0x5d, 0x8f, 0x1f, 0x07, 0xec, 0x53, 0x4a, 0xa6, 0x70, 0xbf, 0xff, 0xab, 0x29, 0xdb, 0xbb, 0xa7, + 0x3c, 0x95, 0xfd, 0x24, 0x95, 0xbc, 0x68, 0xdf, 0x3d, 0xe5, 0xdb, 0xad, 0xa9, 0x21, 0x7d, 0xf7, + 0x54, 0x00, 0x77, 0xee, 0x9e, 0x42, 0x3c, 0xa3, 0x77, 0x4f, 0xa1, 0xd6, 0x82, 0x77, 0x4f, 0x85, + 0x35, 0xa8, 0xf0, 0xde, 0x14, 0xa1, 0xde, 0xb7, 0xee, 0x65, 0xd1, 0xdf, 0xc6, 0x7e, 0x76, 0x1b, + 0x15, 0x62, 0x82, 0xab, 0x39, 0x75, 0xce, 0xad, 0xc7, 0x33, 0xf5, 0xce, 0xba, 0x6d, 0xf7, 0xe6, + 0xb5, 0xef, 0x9f, 0xea, 0xd5, 0x8d, 0x09, 0xe7, 0xa2, 0x50, 0xf7, 0x8e, 0x6d, 0x84, 0xc2, 0x73, + 0x65, 0xc1, 0x6d, 0xf9, 0xcd, 0x7e, 0x30, 0x51, 0xdd, 0x8a, 0xd0, 0x8d, 0x3e, 0xec, 0x32, 0x04, + 0x9a, 0x7c, 0xbb, 0x37, 0x4f, 0x4c, 0x23, 0xb5, 0xef, 0xba, 0xb5, 0x7b, 0x18, 0xf3, 0xdb, 0xfa, + 0x69, 0x7f, 0x05, 0xed, 0x7e, 0xa1, 0xd3, 0x46, 0xd7, 0xbd, 0x6a, 0xe7, 0xad, 0x2e, 0x53, 0x23, + 0xaf, 0x99, 0x87, 0x7d, 0xf1, 0x50, 0x02, 0xe1, 0x4e, 0xa1, 0x5d, 0x09, 0x04, 0x3a, 0x8d, 0x7e, + 0x7e, 0x3b, 0x25, 0x5d, 0x96, 0x7f, 0x59, 0x89, 0xee, 0x92, 0x65, 0xd1, 0xfd, 0xe0, 0x8b, 0xbe, + 0x96, 0x41, 0x7f, 0xf8, 0xf2, 0xd6, 0x7a, 0xba, 0x50, 0xff, 0xbe, 0x12, 0xdd, 0x0b, 0x14, 0xaa, + 0xee, 0x20, 0xb7, 0xb0, 0xee, 0x77, 0x94, 0x1f, 0xde, 0x5e, 0x91, 0x9a, 0xee, 0x5d, 0x7c, 0xd4, + 0xbe, 0x94, 0x29, 0x60, 0x7b, 0x44, 0x5f, 0xca, 0xd4, 0xad, 0x05, 0x37, 0x79, 0xd8, 0x45, 0xb3, + 0xe8, 0x42, 0x37, 0x79, 0xd4, 0x09, 0xb5, 0xe0, 0xe5, 0x12, 0x18, 0x87, 0x39, 0x79, 0xf5, 0x2e, + 0x67, 0xd9, 0x84, 0x76, 0x52, 0xcb, 0xbb, 0x9d, 0x18, 0x0e, 0x6e, 0x8e, 0x55, 0xd2, 0x33, 0xd1, + 0x2c, 0xa4, 0x1e, 0x53, 0xfa, 0x06, 0x09, 0x6e, 0x8e, 0xb5, 0x50, 0xc2, 0x9b, 0xce, 0x1a, 0x43, + 0xde, 0x40, 0xb2, 0xf8, 0xa4, 0x0f, 0x0a, 0x52, 0x74, 0xe3, 0xcd, 0xec, 0xb9, 0x6f, 0x86, 0xac, + 0xb4, 0xf6, 0xdd, 0xb7, 0x7a, 0xd2, 0x84, 0xdb, 0x11, 0x97, 0x5f, 0x71, 0x36, 0xe1, 0x45, 0xd0, + 0xad, 0xa1, 0x7a, 0xb9, 0x75, 0x69, 0xcc, 0xed, 0xae, 0x48, 0xe7, 0xb3, 0x4c, 0x37, 0x26, 0xe9, + 0xd6, 0xa5, 0xba, 0xdd, 0x02, 0x1a, 0x6e, 0x0b, 0x5a, 0xb7, 0x2a, 0xbd, 0x7c, 0x12, 0x36, 0xe3, + 0x65, 0x95, 0x1b, 0xbd, 0x58, 0xba, 0x9e, 0xba, 0x1b, 0x75, 0xd4, 0x13, 0xf4, 0xa4, 0xad, 0x9e, + 0x34, 0xdc, 0x9f, 0x73, 0xdc, 0x9a, 0xfe, 0xb4, 0xdd, 0x61, 0xab, 0xd5, 0xa5, 0x9e, 0xf6, 0x57, + 0x80, 0xbb, 0xa1, 0xba, 0x57, 0x1d, 0x25, 0xa5, 0xdc, 0x4f, 0xd2, 0x74, 0xb0, 0x11, 0xe8, 0x26, + 0x0d, 0x14, 0xdc, 0x0d, 0x45, 0x60, 0xa2, 0x27, 0x37, 0xbb, 0x87, 0xd9, 0xa0, 0xcb, 0x8e, 0xa2, + 0x7a, 0xf5, 0x64, 0x97, 0x06, 0x3b, 0x5a, 0xce, 0xa3, 0x36, 0xb5, 0x1d, 0x86, 0x1f, 0x5c, 0xab, + 0xc2, 0xdb, 0xbd, 0x79, 0xf0, 0xba, 0x5d, 0x51, 0x6a, 0x66, 0x79, 0x48, 0x99, 0xf0, 0x66, 0x92, + 0x47, 0x1d, 0x14, 0xd8, 0x15, 0xac, 0x87, 0xd1, 0xdb, 0x64, 0x32, 0xe5, 0x12, 0x7d, 0x53, 0xe4, + 0x02, 0xc1, 0x37, 0x45, 0x00, 0x04, 0x4d, 0x57, 0xff, 0x6e, 0xb6, 0x43, 0x0f, 0x27, 0x58, 0xd3, + 0x69, 0x65, 0x87, 0x0a, 0x35, 0x1d, 0x4a, 0x83, 0x68, 0x60, 0xdc, 0xea, 0xcf, 0xf1, 0x9f, 0x84, + 0xcc, 0x80, 0x6f, 0xf2, 0x37, 0x7a, 0xb1, 0x60, 0x46, 0xb1, 0x0e, 0x93, 0x59, 0x22, 0xb1, 0x19, + 0xc5, 0xb1, 0x51, 0x21, 0xa1, 0x19, 0xa5, 0x8d, 0x52, 0xd5, 0xab, 0x72, 0x84, 0xc3, 0x49, 0xb8, + 0x7a, 0x35, 0xd3, 0xaf, 0x7a, 0x86, 0x6d, 0xbd, 0xd8, 0xcc, 0x4c, 0x97, 0x91, 0x57, 0x7a, 0xb1, + 0x8c, 0xf4, 0x6d, 0xf5, 0x99, 0x26, 0x04, 0x43, 0x51, 0x87, 0x52, 0x80, 0x1b, 0xf6, 0x15, 0xd7, + 0xbc, 0x7b, 0xcd, 0x73, 0xce, 0x0a, 0x96, 0xc5, 0xe8, 0xe2, 0x54, 0x19, 0x6c, 0x91, 0xa1, 0xc5, + 0x29, 0xa9, 0x01, 0x5e, 0x9b, 0xfb, 0x1f, 0x58, 0x22, 0x43, 0xc1, 0x7c, 0xc9, 0xe8, 0x7f, 0x5f, + 0xf9, 0xb8, 0x07, 0x09, 0x5f, 0x9b, 0x37, 0x80, 0xd9, 0xf8, 0xae, 0x9d, 0x7e, 0x16, 0x30, 0xe5, + 0xa3, 0xa1, 0x85, 0x30, 0xad, 0x02, 0x3a, 0xb5, 0x49, 0x70, 0xb9, 0xfc, 0x09, 0x5f, 0x62, 0x9d, + 0xda, 0xe6, 0xa7, 0x0a, 0x09, 0x75, 0xea, 0x36, 0x0a, 0xf2, 0x4c, 0x77, 0x1d, 0xb4, 0x1a, 0xd0, + 0x77, 0x97, 0x3e, 0x6b, 0x9d, 0x1c, 0x18, 0x39, 0x7b, 0xc9, 0xc2, 0x7b, 0x4f, 0x80, 0x14, 0x74, + 0x2f, 0x59, 0xe0, 0xaf, 0x09, 0x36, 0x7a, 0xb1, 0xf0, 0x95, 0x3c, 0x93, 0xfc, 0x5d, 0xf3, 0xae, + 0x1c, 0x29, 0xae, 0x92, 0xb7, 0x5e, 0x96, 0xaf, 0x77, 0x83, 0xf6, 0x00, 0xec, 0x69, 0x21, 0x62, + 0x5e, 0x96, 0xfa, 0xa6, 0x4a, 0xff, 0x84, 0x91, 0x96, 0x0d, 0xc1, 0x3d, 0x95, 0x0f, 0xc3, 0x90, + 0x73, 0xbd, 0x5c, 0x2d, 0xb2, 0xb7, 0xde, 0xac, 0xa2, 0x9a, 0xed, 0x0b, 0x6f, 0xd6, 0x3a, 0x39, + 0x3b, 0xbc, 0xb4, 0xd4, 0xbd, 0xe6, 0x66, 0x1d, 0x55, 0xc7, 0x6e, 0xb8, 0x79, 0xdc, 0x83, 0xd4, + 0xae, 0xbe, 0x8a, 0xde, 0x3f, 0x12, 0xd3, 0x11, 0xcf, 0x26, 0x83, 0x1f, 0xf8, 0x47, 0x68, 0xc5, + 0x74, 0x58, 0xfd, 0x6c, 0x8c, 0xde, 0xa1, 0xc4, 0xf6, 0x10, 0xe0, 0x1e, 0xbf, 0x98, 0x4f, 0x47, + 0x92, 0x49, 0x70, 0x08, 0x50, 0xfd, 0x3e, 0xac, 0x04, 0xc4, 0x21, 0x40, 0x0f, 0x00, 0xf6, 0xc6, + 0x05, 0xe7, 0xa8, 0xbd, 0x4a, 0x10, 0xb4, 0xa7, 0x01, 0x9b, 0x45, 0x18, 0x7b, 0x55, 0xa2, 0x0e, + 0x0f, 0xed, 0x59, 0x1d, 0x25, 0x25, 0xb2, 0x88, 0x36, 0x65, 0x3b, 0x77, 0x5d, 0x7d, 0x75, 0xeb, + 0xc8, 0x7c, 0x36, 0x63, 0xc5, 0x12, 0x74, 0x6e, 0x5d, 0x4b, 0x07, 0x20, 0x3a, 0x37, 0x0a, 0xda, + 0x51, 0xdb, 0x3c, 0xe6, 0xf8, 0xfa, 0x40, 0x14, 0x62, 0x2e, 0x93, 0x8c, 0xc3, 0x9b, 0x27, 0xcc, + 0x03, 0x75, 0x19, 0x62, 0xd4, 0x52, 0xac, 0xcd, 0x72, 0x15, 0x51, 0x9f, 0x27, 0x54, 0xf7, 0x57, + 0x97, 0x52, 0x14, 0xf0, 0x7d, 0x62, 0x6d, 0x05, 0x42, 0x44, 0x96, 0x4b, 0xc2, 0xa0, 0xed, 0x4f, + 0x93, 0x6c, 0x8a, 0xb6, 0xfd, 0xa9, 0x7b, 0xfb, 0xeb, 0x3d, 0x1a, 0xb0, 0x03, 0xaa, 0x7e, 0x68, + 0xf5, 0x00, 0xd0, 0xdf, 0x72, 0xa2, 0x0f, 0xdd, 0x25, 0x88, 0x01, 0x85, 0x93, 0xc0, 0xd5, 0xeb, + 0x9c, 0x67, 0x7c, 0xd2, 0x9c, 0x9a, 0xc3, 0x5c, 0x79, 0x44, 0xd0, 0x15, 0x24, 0x6d, 0x2c, 0x52, + 0xf2, 0xb3, 0x79, 0x76, 0x5a, 0x88, 0xcb, 0x24, 0xe5, 0x05, 0x88, 0x45, 0xb5, 0xba, 0x23, 0x27, + 0x62, 0x11, 0xc6, 0xd9, 0xe3, 0x17, 0x4a, 0xea, 0x5d, 0xc2, 0x3e, 0x2e, 0x58, 0x0c, 0x8f, 0x5f, + 0xd4, 0x36, 0xda, 0x18, 0xb1, 0x33, 0x18, 0xc0, 0x9d, 0x44, 0xa7, 0x76, 0x9d, 0x2d, 0x55, 0xff, + 0xd0, 0xdf, 0x12, 0xaa, 0x3b, 0x51, 0x4b, 0x90, 0xe8, 0x68, 0x73, 0x18, 0x49, 0x24, 0x3a, 0x61, + 0x0d, 0x3b, 0x95, 0x28, 0xee, 0x44, 0x1f, 0x2b, 0x02, 0x53, 0x49, 0x6d, 0xa3, 0x11, 0x12, 0x53, + 0x49, 0x0b, 0x02, 0x01, 0xa9, 0x19, 0x06, 0x53, 0x34, 0x20, 0x19, 0x69, 0x30, 0x20, 0xb9, 0x94, + 0x0d, 0x14, 0x87, 0x59, 0x22, 0x13, 0x96, 0x8e, 0xb8, 0x3c, 0x65, 0x05, 0x9b, 0x71, 0xc9, 0x0b, + 0x18, 0x28, 0x34, 0x32, 0xf4, 0x18, 0x22, 0x50, 0x50, 0xac, 0x76, 0xf8, 0x07, 0xd1, 0x87, 0xd5, + 0xbc, 0xcf, 0x33, 0xfd, 0xe7, 0x56, 0x5e, 0xa9, 0xbf, 0xd3, 0x34, 0xf8, 0xc8, 0xd8, 0x18, 0xc9, + 0x82, 0xb3, 0x59, 0x63, 0xfb, 0x03, 0xf3, 0xbb, 0x02, 0x9f, 0xae, 0x54, 0xfd, 0xf9, 0x44, 0xc8, + 0xe4, 0xb2, 0x5a, 0x66, 0xeb, 0x2f, 0x88, 0x40, 0x7f, 0x76, 0xc5, 0xc3, 0xc0, 0x5d, 0x14, 0x18, + 0x67, 0xe3, 0xb4, 0x2b, 0x3d, 0xe3, 0x79, 0x0a, 0xe3, 0xb4, 0xa7, 0xad, 0x00, 0x22, 0x4e, 0xa3, + 0xa0, 0x1d, 0x9c, 0xae, 0x78, 0xcc, 0xc3, 0x95, 0x19, 0xf3, 0x7e, 0x95, 0x19, 0x7b, 0x1f, 0x65, + 0xa4, 0xd1, 0x87, 0xc7, 0x7c, 0x76, 0xc1, 0x8b, 0xf2, 0x2a, 0xc9, 0xa9, 0x7b, 0x5b, 0x2d, 0xd1, + 0x79, 0x6f, 0x2b, 0x81, 0xda, 0x99, 0xc0, 0x02, 0x87, 0xe5, 0x09, 0x9b, 0x71, 0x75, 0xb3, 0x06, + 0x98, 0x09, 0x1c, 0x23, 0x0e, 0x44, 0xcc, 0x04, 0x24, 0xec, 0x7c, 0xdf, 0x65, 0x99, 0x33, 0x3e, + 0xad, 0x7a, 0x58, 0x71, 0xca, 0x96, 0x33, 0x9e, 0x49, 0x6d, 0x12, 0xec, 0xc9, 0x3b, 0x26, 0x71, + 0x9e, 0xd8, 0x93, 0xef, 0xa3, 0xe7, 0x84, 0x26, 0xef, 0xc1, 0x9f, 0x8a, 0x42, 0xd6, 0x7f, 0x4c, + 0xe9, 0xbc, 0x48, 0x41, 0x68, 0xf2, 0x1f, 0xaa, 0x47, 0x12, 0xa1, 0x29, 0xac, 0xe1, 0xfc, 0x15, + 0x02, 0xaf, 0x0c, 0x6f, 0x78, 0x61, 0xfa, 0xc9, 0xab, 0x19, 0x4b, 0x52, 0xdd, 0x1b, 0x7e, 0x14, + 0xb0, 0x4d, 0xe8, 0x10, 0x7f, 0x85, 0xa0, 0xaf, 0xae, 0xf3, 0x77, 0x1b, 0xc2, 0x25, 0x04, 0xaf, + 0x08, 0x3a, 0xec, 0x13, 0xaf, 0x08, 0xba, 0xb5, 0xec, 0xca, 0xdd, 0xb2, 0x8a, 0x5b, 0x2a, 0x62, + 0x57, 0x4c, 0xe0, 0x7e, 0xa1, 0x63, 0x13, 0x80, 0xc4, 0xca, 0x3d, 0xa8, 0x60, 0x53, 0x03, 0x8b, + 0xed, 0x27, 0x19, 0x4b, 0x93, 0x9f, 0xc1, 0xb4, 0xde, 0xb1, 0xd3, 0x10, 0x44, 0x6a, 0x80, 0x93, + 0x98, 0xab, 0x03, 0x2e, 0xc7, 0x49, 0x15, 0xfa, 0xd7, 0x03, 0xcf, 0x4d, 0x11, 0xdd, 0xae, 0x1c, + 0xd2, 0xb9, 0xa3, 0x15, 0x3e, 0xd6, 0x9d, 0x3c, 0x1f, 0x55, 0xb3, 0xea, 0x19, 0x8f, 0x79, 0x92, + 0xcb, 0xc1, 0x8b, 0xf0, 0xb3, 0x02, 0x38, 0x71, 0xd0, 0xa2, 0x87, 0x9a, 0xf3, 0xfa, 0xbe, 0x8a, + 0x25, 0xa3, 0xfa, 0xaf, 0x0c, 0x9e, 0x97, 0xbc, 0xd0, 0x89, 0xc6, 0x01, 0x97, 0x60, 0x74, 0x3a, + 0xdc, 0xd0, 0x01, 0xab, 0x8a, 0x12, 0xa3, 0x33, 0xac, 0x61, 0x37, 0xfb, 0x1c, 0x4e, 0xdf, 0xb9, + 0xad, 0xce, 0x1b, 0x6e, 0x92, 0xc6, 0x1c, 0x8a, 0xd8, 0xec, 0xa3, 0x69, 0x9b, 0xad, 0xb5, 0xdd, + 0xee, 0x64, 0xcb, 0x43, 0x78, 0x64, 0x02, 0xb1, 0xa4, 0x30, 0x22, 0x5b, 0x0b, 0xe0, 0xce, 0x66, + 0x78, 0x21, 0xd8, 0x24, 0x66, 0xa5, 0x3c, 0x65, 0xcb, 0x54, 0xb0, 0x89, 0x9a, 0xd7, 0xe1, 0x66, + 0x78, 0xc3, 0x0c, 0x5d, 0x88, 0xda, 0x0c, 0xa7, 0x60, 0x37, 0x3b, 0x53, 0x7f, 0x3c, 0x51, 0x9f, + 0xe5, 0x84, 0xd9, 0x99, 0x2a, 0x2f, 0x3c, 0xc7, 0xf9, 0x30, 0x0c, 0xd9, 0x6f, 0xd0, 0x6a, 0x91, + 0x4a, 0x43, 0xee, 0x61, 0x3a, 0x5e, 0x02, 0x72, 0x3f, 0x40, 0xd8, 0x7b, 0x29, 0xea, 0xdf, 0x9b, + 0xbf, 0xff, 0x23, 0xf5, 0x4d, 0xd6, 0x9b, 0x98, 0xae, 0x0b, 0x0d, 0xdd, 0x0b, 0xee, 0xb6, 0x7a, + 0xd2, 0x36, 0xcd, 0xdc, 0xbd, 0x62, 0x72, 0x67, 0x32, 0x39, 0xe6, 0x25, 0xf2, 0x41, 0x79, 0x25, + 0x1c, 0x5a, 0x29, 0x91, 0x66, 0xb6, 0x29, 0xdb, 0xd1, 0x2b, 0xd9, 0xab, 0x49, 0x22, 0xb5, 0xac, + 0x39, 0x21, 0xbd, 0xd9, 0x36, 0xd0, 0xa6, 0x88, 0x5a, 0xd1, 0xb4, 0x8d, 0xe5, 0x15, 0x33, 0x16, + 0xd3, 0x69, 0xca, 0x35, 0x74, 0xc6, 0x59, 0x7d, 0x91, 0xdf, 0x76, 0xdb, 0x16, 0x0a, 0x12, 0xb1, + 0x3c, 0xa8, 0x60, 0xd3, 0xc8, 0x0a, 0xab, 0x5f, 0x49, 0x35, 0x0f, 0x76, 0xad, 0x6d, 0xc6, 0x03, + 0x88, 0x34, 0x12, 0x05, 0xed, 0x77, 0x6f, 0x95, 0xf8, 0x80, 0x37, 0x4f, 0x02, 0x5e, 0x41, 0xa4, + 0x94, 0x1d, 0x31, 0xf1, 0xdd, 0x1b, 0x82, 0xd9, 0x75, 0x02, 0xf0, 0xf0, 0x72, 0x79, 0x38, 0x81, + 0xeb, 0x04, 0xa8, 0xaf, 0x18, 0x62, 0x9d, 0x40, 0xb1, 0x7e, 0xd3, 0x99, 0x7d, 0xaf, 0x23, 0x56, + 0xda, 0xca, 0x21, 0x4d, 0x87, 0x82, 0xa1, 0xa6, 0xa3, 0x14, 0xfc, 0x47, 0xea, 0x6e, 0xad, 0x21, + 0x8f, 0x14, 0xdb, 0x57, 0x5b, 0xed, 0xc2, 0x6c, 0x5c, 0x32, 0xeb, 0x49, 0x75, 0x64, 0x09, 0xbf, + 0xc1, 0xbf, 0x16, 0x12, 0x71, 0xa9, 0x05, 0xd5, 0xb6, 0x5f, 0xde, 0xff, 0xef, 0x6f, 0xee, 0xac, + 0xfc, 0xe2, 0x9b, 0x3b, 0x2b, 0xff, 0xfb, 0xcd, 0x9d, 0x95, 0x9f, 0x7f, 0x7b, 0xe7, 0xbd, 0x5f, + 0x7c, 0x7b, 0xe7, 0xbd, 0xff, 0xf9, 0xf6, 0xce, 0x7b, 0x5f, 0xbf, 0xaf, 0xff, 0xa8, 0xee, 0xc5, + 0xff, 0x53, 0x7f, 0x1a, 0xf7, 0xf9, 0xff, 0x05, 0x00, 0x00, 0xff, 0xff, 0xb2, 0x7c, 0x4b, 0xdb, + 0x78, 0x77, 0x00, 0x00, } // This is a compile-time assertion to ensure that this generated file @@ -711,10 +709,6 @@ type ClientCommandsHandler interface { ChatSubscribeLastMessages(context.Context, *pb.RpcChatSubscribeLastMessagesRequest) *pb.RpcChatSubscribeLastMessagesResponse ChatUnsubscribe(context.Context, *pb.RpcChatUnsubscribeRequest) *pb.RpcChatUnsubscribeResponse ObjectChatAdd(context.Context, *pb.RpcObjectChatAddRequest) *pb.RpcObjectChatAddResponse - // API - // *** - ApiStartServer(context.Context, *pb.RpcApiStartServerRequest) *pb.RpcApiStartServerResponse - ApiStopServer(context.Context, *pb.RpcApiStopServerRequest) *pb.RpcApiStopServerResponse } func registerClientCommandsHandler(srv ClientCommandsHandler) { @@ -6201,46 +6195,6 @@ func ObjectChatAdd(b []byte) (resp []byte) { return resp } -func ApiStartServer(b []byte) (resp []byte) { - defer func() { - if PanicHandler != nil { - if r := recover(); r != nil { - resp, _ = (&pb.RpcApiStartServerResponse{Error: &pb.RpcApiStartServerResponseError{Code: pb.RpcApiStartServerResponseError_UNKNOWN_ERROR, Description: "panic recovered"}}).Marshal() - PanicHandler(r) - } - } - }() - - in := new(pb.RpcApiStartServerRequest) - if err := in.Unmarshal(b); err != nil { - resp, _ = (&pb.RpcApiStartServerResponse{Error: &pb.RpcApiStartServerResponseError{Code: pb.RpcApiStartServerResponseError_BAD_INPUT, Description: err.Error()}}).Marshal() - return resp - } - - resp, _ = clientCommandsHandler.ApiStartServer(context.Background(), in).Marshal() - return resp -} - -func ApiStopServer(b []byte) (resp []byte) { - defer func() { - if PanicHandler != nil { - if r := recover(); r != nil { - resp, _ = (&pb.RpcApiStopServerResponse{Error: &pb.RpcApiStopServerResponseError{Code: pb.RpcApiStopServerResponseError_UNKNOWN_ERROR, Description: "panic recovered"}}).Marshal() - PanicHandler(r) - } - } - }() - - in := new(pb.RpcApiStopServerRequest) - if err := in.Unmarshal(b); err != nil { - resp, _ = (&pb.RpcApiStopServerResponse{Error: &pb.RpcApiStopServerResponseError{Code: pb.RpcApiStopServerResponseError_BAD_INPUT, Description: err.Error()}}).Marshal() - return resp - } - - resp, _ = clientCommandsHandler.ApiStopServer(context.Background(), in).Marshal() - return resp -} - var PanicHandler func(v interface{}) func CommandAsync(cmd string, data []byte, callback func(data []byte)) { @@ -6795,10 +6749,6 @@ func CommandAsync(cmd string, data []byte, callback func(data []byte)) { cd = ChatUnsubscribe(data) case "ObjectChatAdd": cd = ObjectChatAdd(data) - case "ApiStartServer": - cd = ApiStartServer(data) - case "ApiStopServer": - cd = ApiStopServer(data) default: log.Errorf("unknown command type: %s\n", cmd) } @@ -10657,31 +10607,3 @@ func (h *ClientCommandsHandlerProxy) ObjectChatAdd(ctx context.Context, req *pb. call, _ := actualCall(ctx, req) return call.(*pb.RpcObjectChatAddResponse) } -func (h *ClientCommandsHandlerProxy) ApiStartServer(ctx context.Context, req *pb.RpcApiStartServerRequest) *pb.RpcApiStartServerResponse { - actualCall := func(ctx context.Context, req any) (any, error) { - return h.client.ApiStartServer(ctx, req.(*pb.RpcApiStartServerRequest)), nil - } - for _, interceptor := range h.interceptors { - toCall := actualCall - currentInterceptor := interceptor - actualCall = func(ctx context.Context, req any) (any, error) { - return currentInterceptor(ctx, req, "ApiStartServer", toCall) - } - } - call, _ := actualCall(ctx, req) - return call.(*pb.RpcApiStartServerResponse) -} -func (h *ClientCommandsHandlerProxy) ApiStopServer(ctx context.Context, req *pb.RpcApiStopServerRequest) *pb.RpcApiStopServerResponse { - actualCall := func(ctx context.Context, req any) (any, error) { - return h.client.ApiStopServer(ctx, req.(*pb.RpcApiStopServerRequest)), nil - } - for _, interceptor := range h.interceptors { - toCall := actualCall - currentInterceptor := interceptor - actualCall = func(ctx context.Context, req any) (any, error) { - return currentInterceptor(ctx, req, "ApiStopServer", toCall) - } - } - call, _ := actualCall(ctx, req) - return call.(*pb.RpcApiStopServerResponse) -} diff --git a/core/api.go b/core/api.go deleted file mode 100644 index 2d06e8d0e..000000000 --- a/core/api.go +++ /dev/null @@ -1,41 +0,0 @@ -package core - -import ( - "context" - - "github.com/anyproto/anytype-heart/core/api" - "github.com/anyproto/anytype-heart/pb" -) - -func (mw *Middleware) ApiStartServer(ctx context.Context, req *pb.RpcApiStartServerRequest) *pb.RpcApiStartServerResponse { - apiService := mustService[api.Service](mw) - - err := apiService.Start() - code := mapErrorCode(err, - errToCode(api.ErrPortAlreadyUsed, pb.RpcApiStartServerResponseError_PORT_ALREADY_USED), - errToCode(api.ErrServerAlreadyStarted, pb.RpcApiStartServerResponseError_SERVER_ALREADY_STARTED)) - - r := &pb.RpcApiStartServerResponse{ - Error: &pb.RpcApiStartServerResponseError{ - Code: code, - Description: getErrorDescription(err), - }, - } - return r -} - -func (mw *Middleware) ApiStopServer(ctx context.Context, req *pb.RpcApiStopServerRequest) *pb.RpcApiStopServerResponse { - apiService := mustService[api.Service](mw) - - err := apiService.Stop() - code := mapErrorCode(nil, - errToCode(api.ErrServerNotStarted, pb.RpcApiStopServerResponseError_SERVER_NOT_STARTED)) - - r := &pb.RpcApiStopServerResponse{ - Error: &pb.RpcApiStopServerResponseError{ - Code: code, - Description: getErrorDescription(err), - }, - } - return r -} diff --git a/core/api/service.go b/core/api/service.go index 0b9cd6ea7..08296bcce 100644 --- a/core/api/service.go +++ b/core/api/service.go @@ -5,7 +5,6 @@ import ( "errors" "fmt" "net/http" - "strings" "time" "github.com/anyproto/any-sync/app" @@ -21,15 +20,10 @@ const ( ) var ( - mwSrv service.ClientCommandsServer - ErrPortAlreadyUsed = fmt.Errorf("port %s is already in use", httpPort) - ErrServerAlreadyStarted = fmt.Errorf("server already started") - ErrServerNotStarted = fmt.Errorf("server not started") + mwSrv service.ClientCommandsServer ) type Service interface { - Start() error - Stop() error app.ComponentRunnable } @@ -67,26 +61,20 @@ func (s *apiService) Name() (name string) { // @externalDocs.url https://swagger.io/resources/open-api/ func (s *apiService) Init(a *app.App) (err error) { s.srv = server.NewServer(a, s.mw) - return nil -} - -func (s *apiService) Run(ctx context.Context) (err error) { - // TODO: remove once client takes responsibility s.httpSrv = &http.Server{ Addr: httpPort, Handler: s.srv.Engine(), ReadHeaderTimeout: timeout, } + return nil +} +func (s *apiService) Run(ctx context.Context) (err error) { fmt.Printf("Starting API server on %s\n", s.httpSrv.Addr) go func() { if err := s.httpSrv.ListenAndServe(); err != nil && !errors.Is(err, http.ErrServerClosed) { - if strings.Contains(err.Error(), "address already in use") { - fmt.Printf("API server ListenAndServe error: %v\n", ErrPortAlreadyUsed) - } else { - fmt.Printf("API server ListenAndServe error: %v\n", err) - } + fmt.Printf("API server ListenAndServe error: %v\n", err) } }() @@ -94,10 +82,6 @@ func (s *apiService) Run(ctx context.Context) (err error) { } func (s *apiService) Close(ctx context.Context) (err error) { - if s.httpSrv == nil { - return nil - } - shutdownCtx, cancel := context.WithTimeout(ctx, timeout) defer cancel() @@ -108,49 +92,6 @@ func (s *apiService) Close(ctx context.Context) (err error) { return nil } -func (s *apiService) Start() error { - if s.httpSrv != nil { - return ErrServerAlreadyStarted - } - - s.httpSrv = &http.Server{ - Addr: httpPort, - Handler: s.srv.Engine(), - ReadHeaderTimeout: timeout, - } - - fmt.Printf("Starting API server on %s\n", s.httpSrv.Addr) - - go func() { - if err := s.httpSrv.ListenAndServe(); err != nil && !errors.Is(err, http.ErrServerClosed) { - if strings.Contains(err.Error(), "address already in use") { - fmt.Printf("API server ListenAndServe error: %v\n", ErrPortAlreadyUsed) - } else { - fmt.Printf("API server ListenAndServe error: %v\n", err) - } - } - }() - - return nil -} - -func (s *apiService) Stop() error { - if s.httpSrv == nil { - return ErrServerNotStarted - } - - shutdownCtx, cancel := context.WithTimeout(context.Background(), timeout) - defer cancel() - - if err := s.httpSrv.Shutdown(shutdownCtx); err != nil { - return err - } - - // Clear the server reference to allow reinitialization - s.httpSrv = nil - return nil -} - func SetMiddlewareParams(mw service.ClientCommandsServer) { mwSrv = mw } diff --git a/docs/proto.md b/docs/proto.md index 567be75e8..102b27a0b 100644 --- a/docs/proto.md +++ b/docs/proto.md @@ -107,15 +107,6 @@ - [Rpc.Account.Stop.Request](#anytype-Rpc-Account-Stop-Request) - [Rpc.Account.Stop.Response](#anytype-Rpc-Account-Stop-Response) - [Rpc.Account.Stop.Response.Error](#anytype-Rpc-Account-Stop-Response-Error) - - [Rpc.Api](#anytype-Rpc-Api) - - [Rpc.Api.StartServer](#anytype-Rpc-Api-StartServer) - - [Rpc.Api.StartServer.Request](#anytype-Rpc-Api-StartServer-Request) - - [Rpc.Api.StartServer.Response](#anytype-Rpc-Api-StartServer-Response) - - [Rpc.Api.StartServer.Response.Error](#anytype-Rpc-Api-StartServer-Response-Error) - - [Rpc.Api.StopServer](#anytype-Rpc-Api-StopServer) - - [Rpc.Api.StopServer.Request](#anytype-Rpc-Api-StopServer-Request) - - [Rpc.Api.StopServer.Response](#anytype-Rpc-Api-StopServer-Response) - - [Rpc.Api.StopServer.Response.Error](#anytype-Rpc-Api-StopServer-Response-Error) - [Rpc.App](#anytype-Rpc-App) - [Rpc.App.GetVersion](#anytype-Rpc-App-GetVersion) - [Rpc.App.GetVersion.Request](#anytype-Rpc-App-GetVersion-Request) @@ -1298,8 +1289,6 @@ - [Rpc.Account.RevertDeletion.Response.Error.Code](#anytype-Rpc-Account-RevertDeletion-Response-Error-Code) - [Rpc.Account.Select.Response.Error.Code](#anytype-Rpc-Account-Select-Response-Error-Code) - [Rpc.Account.Stop.Response.Error.Code](#anytype-Rpc-Account-Stop-Response-Error-Code) - - [Rpc.Api.StartServer.Response.Error.Code](#anytype-Rpc-Api-StartServer-Response-Error-Code) - - [Rpc.Api.StopServer.Response.Error.Code](#anytype-Rpc-Api-StopServer-Response-Error-Code) - [Rpc.App.GetVersion.Response.Error.Code](#anytype-Rpc-App-GetVersion-Response-Error-Code) - [Rpc.App.SetDeviceState.Request.DeviceState](#anytype-Rpc-App-SetDeviceState-Request-DeviceState) - [Rpc.App.SetDeviceState.Response.Error.Code](#anytype-Rpc-App-SetDeviceState-Response-Error-Code) @@ -2277,8 +2266,6 @@ | ChatSubscribeLastMessages | [Rpc.Chat.SubscribeLastMessages.Request](#anytype-Rpc-Chat-SubscribeLastMessages-Request) | [Rpc.Chat.SubscribeLastMessages.Response](#anytype-Rpc-Chat-SubscribeLastMessages-Response) | | | ChatUnsubscribe | [Rpc.Chat.Unsubscribe.Request](#anytype-Rpc-Chat-Unsubscribe-Request) | [Rpc.Chat.Unsubscribe.Response](#anytype-Rpc-Chat-Unsubscribe-Response) | | | ObjectChatAdd | [Rpc.Object.ChatAdd.Request](#anytype-Rpc-Object-ChatAdd-Request) | [Rpc.Object.ChatAdd.Response](#anytype-Rpc-Object-ChatAdd-Response) | | -| ApiStartServer | [Rpc.Api.StartServer.Request](#anytype-Rpc-Api-StartServer-Request) | [Rpc.Api.StartServer.Response](#anytype-Rpc-Api-StartServer-Response) | API *** | -| ApiStopServer | [Rpc.Api.StopServer.Request](#anytype-Rpc-Api-StopServer-Request) | [Rpc.Api.StopServer.Response](#anytype-Rpc-Api-StopServer-Response) | | @@ -3748,118 +3735,6 @@ Middleware-to-front-end response for an account stop request - - -### Rpc.Api - - - - - - - - - -### Rpc.Api.StartServer - - - - - - - - - -### Rpc.Api.StartServer.Request -empty - - - - - - - - -### Rpc.Api.StartServer.Response - - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| error | [Rpc.Api.StartServer.Response.Error](#anytype-Rpc-Api-StartServer-Response-Error) | | | - - - - - - - - -### Rpc.Api.StartServer.Response.Error - - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| code | [Rpc.Api.StartServer.Response.Error.Code](#anytype-Rpc-Api-StartServer-Response-Error-Code) | | | -| description | [string](#string) | | | - - - - - - - - -### Rpc.Api.StopServer - - - - - - - - - -### Rpc.Api.StopServer.Request -empty - - - - - - - - -### Rpc.Api.StopServer.Response - - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| error | [Rpc.Api.StopServer.Response.Error](#anytype-Rpc-Api-StopServer-Response-Error) | | | - - - - - - - - -### Rpc.Api.StopServer.Response.Error - - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| code | [Rpc.Api.StopServer.Response.Error.Code](#anytype-Rpc-Api-StopServer-Response-Error-Code) | | | -| description | [string](#string) | | | - - - - - - ### Rpc.App @@ -21081,35 +20956,6 @@ Middleware-to-front-end response, that can contain a NULL error or a non-NULL er - - -### Rpc.Api.StartServer.Response.Error.Code - - -| Name | Number | Description | -| ---- | ------ | ----------- | -| NULL | 0 | | -| UNKNOWN_ERROR | 1 | | -| BAD_INPUT | 2 | | -| PORT_ALREADY_USED | 3 | | -| SERVER_ALREADY_STARTED | 4 | | - - - - - -### Rpc.Api.StopServer.Response.Error.Code - - -| Name | Number | Description | -| ---- | ------ | ----------- | -| NULL | 0 | | -| UNKNOWN_ERROR | 1 | | -| BAD_INPUT | 2 | | -| SERVER_NOT_STARTED | 3 | | - - - ### Rpc.App.GetVersion.Response.Error.Code diff --git a/pb/commands.pb.go b/pb/commands.pb.go index 2fccfc9ff..865ccff76 100644 --- a/pb/commands.pb.go +++ b/pb/commands.pb.go @@ -9228,71 +9228,6 @@ func (RpcChatUnsubscribeResponseErrorCode) EnumDescriptor() ([]byte, []int) { return fileDescriptor_8261c968b2e6f45c, []int{0, 41, 7, 1, 0, 0} } -type RpcApiStartServerResponseErrorCode int32 - -const ( - RpcApiStartServerResponseError_NULL RpcApiStartServerResponseErrorCode = 0 - RpcApiStartServerResponseError_UNKNOWN_ERROR RpcApiStartServerResponseErrorCode = 1 - RpcApiStartServerResponseError_BAD_INPUT RpcApiStartServerResponseErrorCode = 2 - RpcApiStartServerResponseError_PORT_ALREADY_USED RpcApiStartServerResponseErrorCode = 3 - RpcApiStartServerResponseError_SERVER_ALREADY_STARTED RpcApiStartServerResponseErrorCode = 4 -) - -var RpcApiStartServerResponseErrorCode_name = map[int32]string{ - 0: "NULL", - 1: "UNKNOWN_ERROR", - 2: "BAD_INPUT", - 3: "PORT_ALREADY_USED", - 4: "SERVER_ALREADY_STARTED", -} - -var RpcApiStartServerResponseErrorCode_value = map[string]int32{ - "NULL": 0, - "UNKNOWN_ERROR": 1, - "BAD_INPUT": 2, - "PORT_ALREADY_USED": 3, - "SERVER_ALREADY_STARTED": 4, -} - -func (x RpcApiStartServerResponseErrorCode) String() string { - return proto.EnumName(RpcApiStartServerResponseErrorCode_name, int32(x)) -} - -func (RpcApiStartServerResponseErrorCode) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 42, 0, 1, 0, 0} -} - -type RpcApiStopServerResponseErrorCode int32 - -const ( - RpcApiStopServerResponseError_NULL RpcApiStopServerResponseErrorCode = 0 - RpcApiStopServerResponseError_UNKNOWN_ERROR RpcApiStopServerResponseErrorCode = 1 - RpcApiStopServerResponseError_BAD_INPUT RpcApiStopServerResponseErrorCode = 2 - RpcApiStopServerResponseError_SERVER_NOT_STARTED RpcApiStopServerResponseErrorCode = 3 -) - -var RpcApiStopServerResponseErrorCode_name = map[int32]string{ - 0: "NULL", - 1: "UNKNOWN_ERROR", - 2: "BAD_INPUT", - 3: "SERVER_NOT_STARTED", -} - -var RpcApiStopServerResponseErrorCode_value = map[string]int32{ - "NULL": 0, - "UNKNOWN_ERROR": 1, - "BAD_INPUT": 2, - "SERVER_NOT_STARTED": 3, -} - -func (x RpcApiStopServerResponseErrorCode) String() string { - return proto.EnumName(RpcApiStopServerResponseErrorCode_name, int32(x)) -} - -func (RpcApiStopServerResponseErrorCode) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 42, 1, 1, 0, 0} -} - // Rpc is a namespace, that agregates all of the service commands between client and middleware. // Structure: Topic > Subtopic > Subsub... > Action > (Request, Response). // Request – message from a client. @@ -70529,378 +70464,6 @@ func (m *RpcChatUnsubscribeResponseError) GetDescription() string { return "" } -type RpcApi struct { -} - -func (m *RpcApi) Reset() { *m = RpcApi{} } -func (m *RpcApi) String() string { return proto.CompactTextString(m) } -func (*RpcApi) ProtoMessage() {} -func (*RpcApi) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 42} -} -func (m *RpcApi) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *RpcApi) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_RpcApi.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 *RpcApi) XXX_Merge(src proto.Message) { - xxx_messageInfo_RpcApi.Merge(m, src) -} -func (m *RpcApi) XXX_Size() int { - return m.Size() -} -func (m *RpcApi) XXX_DiscardUnknown() { - xxx_messageInfo_RpcApi.DiscardUnknown(m) -} - -var xxx_messageInfo_RpcApi proto.InternalMessageInfo - -type RpcApiStartServer struct { -} - -func (m *RpcApiStartServer) Reset() { *m = RpcApiStartServer{} } -func (m *RpcApiStartServer) String() string { return proto.CompactTextString(m) } -func (*RpcApiStartServer) ProtoMessage() {} -func (*RpcApiStartServer) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 42, 0} -} -func (m *RpcApiStartServer) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *RpcApiStartServer) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_RpcApiStartServer.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 *RpcApiStartServer) XXX_Merge(src proto.Message) { - xxx_messageInfo_RpcApiStartServer.Merge(m, src) -} -func (m *RpcApiStartServer) XXX_Size() int { - return m.Size() -} -func (m *RpcApiStartServer) XXX_DiscardUnknown() { - xxx_messageInfo_RpcApiStartServer.DiscardUnknown(m) -} - -var xxx_messageInfo_RpcApiStartServer proto.InternalMessageInfo - -type RpcApiStartServerRequest struct { -} - -func (m *RpcApiStartServerRequest) Reset() { *m = RpcApiStartServerRequest{} } -func (m *RpcApiStartServerRequest) String() string { return proto.CompactTextString(m) } -func (*RpcApiStartServerRequest) ProtoMessage() {} -func (*RpcApiStartServerRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 42, 0, 0} -} -func (m *RpcApiStartServerRequest) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *RpcApiStartServerRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_RpcApiStartServerRequest.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 *RpcApiStartServerRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_RpcApiStartServerRequest.Merge(m, src) -} -func (m *RpcApiStartServerRequest) XXX_Size() int { - return m.Size() -} -func (m *RpcApiStartServerRequest) XXX_DiscardUnknown() { - xxx_messageInfo_RpcApiStartServerRequest.DiscardUnknown(m) -} - -var xxx_messageInfo_RpcApiStartServerRequest proto.InternalMessageInfo - -type RpcApiStartServerResponse struct { - Error *RpcApiStartServerResponseError `protobuf:"bytes,1,opt,name=error,proto3" json:"error,omitempty"` -} - -func (m *RpcApiStartServerResponse) Reset() { *m = RpcApiStartServerResponse{} } -func (m *RpcApiStartServerResponse) String() string { return proto.CompactTextString(m) } -func (*RpcApiStartServerResponse) ProtoMessage() {} -func (*RpcApiStartServerResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 42, 0, 1} -} -func (m *RpcApiStartServerResponse) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *RpcApiStartServerResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_RpcApiStartServerResponse.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 *RpcApiStartServerResponse) XXX_Merge(src proto.Message) { - xxx_messageInfo_RpcApiStartServerResponse.Merge(m, src) -} -func (m *RpcApiStartServerResponse) XXX_Size() int { - return m.Size() -} -func (m *RpcApiStartServerResponse) XXX_DiscardUnknown() { - xxx_messageInfo_RpcApiStartServerResponse.DiscardUnknown(m) -} - -var xxx_messageInfo_RpcApiStartServerResponse proto.InternalMessageInfo - -func (m *RpcApiStartServerResponse) GetError() *RpcApiStartServerResponseError { - if m != nil { - return m.Error - } - return nil -} - -type RpcApiStartServerResponseError struct { - Code RpcApiStartServerResponseErrorCode `protobuf:"varint,1,opt,name=code,proto3,enum=anytype.RpcApiStartServerResponseErrorCode" json:"code,omitempty"` - Description string `protobuf:"bytes,2,opt,name=description,proto3" json:"description,omitempty"` -} - -func (m *RpcApiStartServerResponseError) Reset() { *m = RpcApiStartServerResponseError{} } -func (m *RpcApiStartServerResponseError) String() string { return proto.CompactTextString(m) } -func (*RpcApiStartServerResponseError) ProtoMessage() {} -func (*RpcApiStartServerResponseError) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 42, 0, 1, 0} -} -func (m *RpcApiStartServerResponseError) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *RpcApiStartServerResponseError) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_RpcApiStartServerResponseError.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 *RpcApiStartServerResponseError) XXX_Merge(src proto.Message) { - xxx_messageInfo_RpcApiStartServerResponseError.Merge(m, src) -} -func (m *RpcApiStartServerResponseError) XXX_Size() int { - return m.Size() -} -func (m *RpcApiStartServerResponseError) XXX_DiscardUnknown() { - xxx_messageInfo_RpcApiStartServerResponseError.DiscardUnknown(m) -} - -var xxx_messageInfo_RpcApiStartServerResponseError proto.InternalMessageInfo - -func (m *RpcApiStartServerResponseError) GetCode() RpcApiStartServerResponseErrorCode { - if m != nil { - return m.Code - } - return RpcApiStartServerResponseError_NULL -} - -func (m *RpcApiStartServerResponseError) GetDescription() string { - if m != nil { - return m.Description - } - return "" -} - -type RpcApiStopServer struct { -} - -func (m *RpcApiStopServer) Reset() { *m = RpcApiStopServer{} } -func (m *RpcApiStopServer) String() string { return proto.CompactTextString(m) } -func (*RpcApiStopServer) ProtoMessage() {} -func (*RpcApiStopServer) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 42, 1} -} -func (m *RpcApiStopServer) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *RpcApiStopServer) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_RpcApiStopServer.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 *RpcApiStopServer) XXX_Merge(src proto.Message) { - xxx_messageInfo_RpcApiStopServer.Merge(m, src) -} -func (m *RpcApiStopServer) XXX_Size() int { - return m.Size() -} -func (m *RpcApiStopServer) XXX_DiscardUnknown() { - xxx_messageInfo_RpcApiStopServer.DiscardUnknown(m) -} - -var xxx_messageInfo_RpcApiStopServer proto.InternalMessageInfo - -type RpcApiStopServerRequest struct { -} - -func (m *RpcApiStopServerRequest) Reset() { *m = RpcApiStopServerRequest{} } -func (m *RpcApiStopServerRequest) String() string { return proto.CompactTextString(m) } -func (*RpcApiStopServerRequest) ProtoMessage() {} -func (*RpcApiStopServerRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 42, 1, 0} -} -func (m *RpcApiStopServerRequest) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *RpcApiStopServerRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_RpcApiStopServerRequest.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 *RpcApiStopServerRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_RpcApiStopServerRequest.Merge(m, src) -} -func (m *RpcApiStopServerRequest) XXX_Size() int { - return m.Size() -} -func (m *RpcApiStopServerRequest) XXX_DiscardUnknown() { - xxx_messageInfo_RpcApiStopServerRequest.DiscardUnknown(m) -} - -var xxx_messageInfo_RpcApiStopServerRequest proto.InternalMessageInfo - -type RpcApiStopServerResponse struct { - Error *RpcApiStopServerResponseError `protobuf:"bytes,1,opt,name=error,proto3" json:"error,omitempty"` -} - -func (m *RpcApiStopServerResponse) Reset() { *m = RpcApiStopServerResponse{} } -func (m *RpcApiStopServerResponse) String() string { return proto.CompactTextString(m) } -func (*RpcApiStopServerResponse) ProtoMessage() {} -func (*RpcApiStopServerResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 42, 1, 1} -} -func (m *RpcApiStopServerResponse) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *RpcApiStopServerResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_RpcApiStopServerResponse.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 *RpcApiStopServerResponse) XXX_Merge(src proto.Message) { - xxx_messageInfo_RpcApiStopServerResponse.Merge(m, src) -} -func (m *RpcApiStopServerResponse) XXX_Size() int { - return m.Size() -} -func (m *RpcApiStopServerResponse) XXX_DiscardUnknown() { - xxx_messageInfo_RpcApiStopServerResponse.DiscardUnknown(m) -} - -var xxx_messageInfo_RpcApiStopServerResponse proto.InternalMessageInfo - -func (m *RpcApiStopServerResponse) GetError() *RpcApiStopServerResponseError { - if m != nil { - return m.Error - } - return nil -} - -type RpcApiStopServerResponseError struct { - Code RpcApiStopServerResponseErrorCode `protobuf:"varint,1,opt,name=code,proto3,enum=anytype.RpcApiStopServerResponseErrorCode" json:"code,omitempty"` - Description string `protobuf:"bytes,2,opt,name=description,proto3" json:"description,omitempty"` -} - -func (m *RpcApiStopServerResponseError) Reset() { *m = RpcApiStopServerResponseError{} } -func (m *RpcApiStopServerResponseError) String() string { return proto.CompactTextString(m) } -func (*RpcApiStopServerResponseError) ProtoMessage() {} -func (*RpcApiStopServerResponseError) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 42, 1, 1, 0} -} -func (m *RpcApiStopServerResponseError) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *RpcApiStopServerResponseError) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_RpcApiStopServerResponseError.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 *RpcApiStopServerResponseError) XXX_Merge(src proto.Message) { - xxx_messageInfo_RpcApiStopServerResponseError.Merge(m, src) -} -func (m *RpcApiStopServerResponseError) XXX_Size() int { - return m.Size() -} -func (m *RpcApiStopServerResponseError) XXX_DiscardUnknown() { - xxx_messageInfo_RpcApiStopServerResponseError.DiscardUnknown(m) -} - -var xxx_messageInfo_RpcApiStopServerResponseError proto.InternalMessageInfo - -func (m *RpcApiStopServerResponseError) GetCode() RpcApiStopServerResponseErrorCode { - if m != nil { - return m.Code - } - return RpcApiStopServerResponseError_NULL -} - -func (m *RpcApiStopServerResponseError) GetDescription() string { - if m != nil { - return m.Description - } - return "" -} - type Empty struct { } @@ -71290,8 +70853,6 @@ func init() { proto.RegisterEnum("anytype.RpcChatGetMessagesByIdsResponseErrorCode", RpcChatGetMessagesByIdsResponseErrorCode_name, RpcChatGetMessagesByIdsResponseErrorCode_value) proto.RegisterEnum("anytype.RpcChatSubscribeLastMessagesResponseErrorCode", RpcChatSubscribeLastMessagesResponseErrorCode_name, RpcChatSubscribeLastMessagesResponseErrorCode_value) proto.RegisterEnum("anytype.RpcChatUnsubscribeResponseErrorCode", RpcChatUnsubscribeResponseErrorCode_name, RpcChatUnsubscribeResponseErrorCode_value) - proto.RegisterEnum("anytype.RpcApiStartServerResponseErrorCode", RpcApiStartServerResponseErrorCode_name, RpcApiStartServerResponseErrorCode_value) - proto.RegisterEnum("anytype.RpcApiStopServerResponseErrorCode", RpcApiStopServerResponseErrorCode_name, RpcApiStopServerResponseErrorCode_value) proto.RegisterType((*Rpc)(nil), "anytype.Rpc") proto.RegisterType((*RpcApp)(nil), "anytype.Rpc.App") proto.RegisterType((*RpcAppGetVersion)(nil), "anytype.Rpc.App.GetVersion") @@ -72516,15 +72077,6 @@ func init() { proto.RegisterType((*RpcChatUnsubscribeRequest)(nil), "anytype.Rpc.Chat.Unsubscribe.Request") proto.RegisterType((*RpcChatUnsubscribeResponse)(nil), "anytype.Rpc.Chat.Unsubscribe.Response") proto.RegisterType((*RpcChatUnsubscribeResponseError)(nil), "anytype.Rpc.Chat.Unsubscribe.Response.Error") - proto.RegisterType((*RpcApi)(nil), "anytype.Rpc.Api") - proto.RegisterType((*RpcApiStartServer)(nil), "anytype.Rpc.Api.StartServer") - proto.RegisterType((*RpcApiStartServerRequest)(nil), "anytype.Rpc.Api.StartServer.Request") - proto.RegisterType((*RpcApiStartServerResponse)(nil), "anytype.Rpc.Api.StartServer.Response") - proto.RegisterType((*RpcApiStartServerResponseError)(nil), "anytype.Rpc.Api.StartServer.Response.Error") - proto.RegisterType((*RpcApiStopServer)(nil), "anytype.Rpc.Api.StopServer") - proto.RegisterType((*RpcApiStopServerRequest)(nil), "anytype.Rpc.Api.StopServer.Request") - proto.RegisterType((*RpcApiStopServerResponse)(nil), "anytype.Rpc.Api.StopServer.Response") - proto.RegisterType((*RpcApiStopServerResponseError)(nil), "anytype.Rpc.Api.StopServer.Response.Error") proto.RegisterType((*Empty)(nil), "anytype.Empty") proto.RegisterType((*StreamRequest)(nil), "anytype.StreamRequest") proto.RegisterExtension(E_NoAuth) @@ -72533,1239 +72085,1232 @@ func init() { func init() { proto.RegisterFile("pb/protos/commands.proto", fileDescriptor_8261c968b2e6f45c) } var fileDescriptor_8261c968b2e6f45c = []byte{ - // 19712 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0xfd, 0x7d, 0x9c, 0x23, 0x47, - 0x75, 0x2f, 0x8c, 0xaf, 0xba, 0x25, 0xcd, 0xcc, 0x99, 0x97, 0xd5, 0xb6, 0x77, 0xd7, 0xeb, 0xb2, - 0x59, 0x3b, 0x6b, 0x63, 0x1c, 0x63, 0xc6, 0xc6, 0x10, 0x82, 0x8d, 0x8d, 0xad, 0xd1, 0xf4, 0xcc, - 0xc8, 0x9e, 0x91, 0x26, 0x2d, 0xcd, 0x2e, 0x4e, 0x6e, 0x7e, 0xba, 0xbd, 0x52, 0xcd, 0x4c, 0x7b, - 0x35, 0xdd, 0x4a, 0xab, 0x67, 0xd6, 0xcb, 0xef, 0x73, 0x9f, 0x1b, 0x42, 0x1c, 0x20, 0x84, 0x4b, - 0x08, 0x21, 0x09, 0xef, 0x60, 0x30, 0x5c, 0x48, 0x80, 0xf0, 0x7e, 0x21, 0x09, 0xef, 0x04, 0x42, - 0x08, 0x21, 0x10, 0x5e, 0x42, 0xc2, 0x13, 0x08, 0x84, 0x90, 0xfb, 0x09, 0x97, 0x27, 0x79, 0x6e, - 0x20, 0x24, 0xf0, 0xe4, 0xf9, 0x74, 0x55, 0xf5, 0x4b, 0x69, 0xd4, 0xad, 0x6a, 0x8d, 0x5a, 0x63, - 0xc2, 0xf3, 0x5f, 0x77, 0x75, 0xf5, 0xa9, 0x53, 0xe7, 0x7b, 0xaa, 0xea, 0x54, 0xd5, 0xa9, 0x53, - 0x70, 0xaa, 0x73, 0xfe, 0xe6, 0x8e, 0x6d, 0x39, 0x56, 0xf7, 0xe6, 0xa6, 0xb5, 0xb3, 0xa3, 0x9b, - 0xad, 0xee, 0x3c, 0x79, 0x57, 0x26, 0x74, 0xf3, 0x92, 0x73, 0xa9, 0x83, 0xd1, 0x75, 0x9d, 0x0b, - 0x5b, 0x37, 0xb7, 0x8d, 0xf3, 0x37, 0x77, 0xce, 0xdf, 0xbc, 0x63, 0xb5, 0x70, 0xdb, 0xfb, 0x81, - 0xbc, 0xb0, 0xec, 0xe8, 0x86, 0xa8, 0x5c, 0x6d, 0xab, 0xa9, 0xb7, 0xbb, 0x8e, 0x65, 0x63, 0x96, - 0xf3, 0x64, 0x50, 0x24, 0xde, 0xc3, 0xa6, 0xe3, 0x51, 0xb8, 0x6a, 0xcb, 0xb2, 0xb6, 0xda, 0x98, - 0x7e, 0x3b, 0xbf, 0xbb, 0x79, 0x73, 0xd7, 0xb1, 0x77, 0x9b, 0x0e, 0xfb, 0x7a, 0x4d, 0xef, 0xd7, - 0x16, 0xee, 0x36, 0x6d, 0xa3, 0xe3, 0x58, 0x36, 0xcd, 0x71, 0xe6, 0x25, 0xbf, 0x36, 0x09, 0xb2, - 0xd6, 0x69, 0xa2, 0xef, 0x4c, 0x80, 0x5c, 0xec, 0x74, 0xd0, 0x47, 0x25, 0x80, 0x65, 0xec, 0x9c, - 0xc5, 0x76, 0xd7, 0xb0, 0x4c, 0x74, 0x14, 0x26, 0x34, 0xfc, 0x73, 0xbb, 0xb8, 0xeb, 0xdc, 0x9e, - 0x7d, 0xf6, 0x37, 0xe4, 0x0c, 0x7a, 0x58, 0x82, 0x49, 0x0d, 0x77, 0x3b, 0x96, 0xd9, 0xc5, 0xca, - 0xdd, 0x90, 0xc3, 0xb6, 0x6d, 0xd9, 0xa7, 0x32, 0xd7, 0x64, 0x6e, 0x98, 0xbe, 0xf5, 0xc6, 0x79, - 0x56, 0xfd, 0x79, 0xad, 0xd3, 0x9c, 0x2f, 0x76, 0x3a, 0xf3, 0x01, 0xa5, 0x79, 0xef, 0xa7, 0x79, - 0xd5, 0xfd, 0x43, 0xa3, 0x3f, 0x2a, 0xa7, 0x60, 0x62, 0x8f, 0x66, 0x38, 0x25, 0x5d, 0x93, 0xb9, - 0x61, 0x4a, 0xf3, 0x5e, 0xdd, 0x2f, 0x2d, 0xec, 0xe8, 0x46, 0xbb, 0x7b, 0x4a, 0xa6, 0x5f, 0xd8, - 0x2b, 0x7a, 0x28, 0x03, 0x39, 0x42, 0x44, 0x29, 0x41, 0xb6, 0x69, 0xb5, 0x30, 0x29, 0x7e, 0xee, - 0xd6, 0x9b, 0xc5, 0x8b, 0x9f, 0x2f, 0x59, 0x2d, 0xac, 0x91, 0x9f, 0x95, 0x6b, 0x60, 0xda, 0x13, - 0x4b, 0xc0, 0x46, 0x38, 0xe9, 0xcc, 0xad, 0x90, 0x75, 0xf3, 0x2b, 0x93, 0x90, 0xad, 0x6c, 0xac, - 0xae, 0x16, 0x8e, 0x28, 0xc7, 0x60, 0x76, 0xa3, 0x72, 0x6f, 0xa5, 0x7a, 0xae, 0xd2, 0x50, 0x35, - 0xad, 0xaa, 0x15, 0x32, 0xca, 0x2c, 0x4c, 0x2d, 0x14, 0x17, 0x1b, 0xe5, 0xca, 0xfa, 0x46, 0xbd, - 0x20, 0xa1, 0x57, 0xc8, 0x30, 0x57, 0xc3, 0xce, 0x22, 0xde, 0x33, 0x9a, 0xb8, 0xe6, 0xe8, 0x0e, - 0x46, 0xcf, 0xcf, 0xf8, 0xc2, 0x54, 0x36, 0xdc, 0x42, 0xfd, 0x4f, 0xac, 0x02, 0x4f, 0xd8, 0x57, - 0x01, 0x9e, 0xc2, 0x3c, 0xfb, 0x7b, 0x3e, 0x94, 0xa6, 0x85, 0xe9, 0x9c, 0x79, 0x1c, 0x4c, 0x87, - 0xbe, 0x29, 0x73, 0x00, 0x0b, 0xc5, 0xd2, 0xbd, 0xcb, 0x5a, 0x75, 0xa3, 0xb2, 0x58, 0x38, 0xe2, - 0xbe, 0x2f, 0x55, 0x35, 0x95, 0xbd, 0x67, 0xd0, 0xf7, 0x32, 0x21, 0x30, 0x17, 0x79, 0x30, 0xe7, - 0x07, 0x33, 0xd3, 0x07, 0x50, 0xf4, 0x3a, 0x1f, 0x9c, 0x65, 0x0e, 0x9c, 0x27, 0x24, 0x23, 0x97, - 0x3e, 0x40, 0x0f, 0x4a, 0x30, 0x59, 0xdb, 0xde, 0x75, 0x5a, 0xd6, 0x45, 0x13, 0x4d, 0xf9, 0xc8, - 0xa0, 0x6f, 0x85, 0x65, 0xf2, 0x54, 0x5e, 0x26, 0x37, 0xec, 0xaf, 0x04, 0xa3, 0x10, 0x21, 0x8d, - 0x57, 0xf9, 0xd2, 0x28, 0x72, 0xd2, 0x78, 0x9c, 0x28, 0xa1, 0xf4, 0xe5, 0xf0, 0x92, 0x27, 0x43, - 0xae, 0xd6, 0xd1, 0x9b, 0x18, 0x7d, 0x52, 0x86, 0x99, 0x55, 0xac, 0xef, 0xe1, 0x62, 0xa7, 0x63, - 0x5b, 0x7b, 0x18, 0x95, 0x02, 0x7d, 0x3d, 0x05, 0x13, 0x5d, 0x37, 0x53, 0xb9, 0x45, 0x6a, 0x30, - 0xa5, 0x79, 0xaf, 0xca, 0x69, 0x00, 0xa3, 0x85, 0x4d, 0xc7, 0x70, 0x0c, 0xdc, 0x3d, 0x25, 0x5d, - 0x23, 0xdf, 0x30, 0xa5, 0x85, 0x52, 0xd0, 0x77, 0x24, 0x51, 0x1d, 0x23, 0x5c, 0xcc, 0x87, 0x39, - 0x88, 0x90, 0xea, 0x6b, 0x24, 0x11, 0x1d, 0x1b, 0x48, 0x2e, 0x99, 0x6c, 0xdf, 0x9c, 0x49, 0x2e, - 0x5c, 0x37, 0x47, 0xa5, 0xda, 0xa8, 0x6d, 0x94, 0x56, 0x1a, 0xb5, 0xf5, 0x62, 0x49, 0x2d, 0x60, - 0xe5, 0x38, 0x14, 0xc8, 0x63, 0xa3, 0x5c, 0x6b, 0x2c, 0xaa, 0xab, 0x6a, 0x5d, 0x5d, 0x2c, 0x6c, - 0x2a, 0x0a, 0xcc, 0x69, 0xea, 0x4f, 0x6d, 0xa8, 0xb5, 0x7a, 0x63, 0xa9, 0x58, 0x5e, 0x55, 0x17, - 0x0b, 0x5b, 0xee, 0xcf, 0xab, 0xe5, 0xb5, 0x72, 0xbd, 0xa1, 0xa9, 0xc5, 0xd2, 0x8a, 0xba, 0x58, - 0xd8, 0x56, 0x2e, 0x87, 0xcb, 0x2a, 0xd5, 0x46, 0x71, 0x7d, 0x5d, 0xab, 0x9e, 0x55, 0x1b, 0xec, - 0x8f, 0x5a, 0xc1, 0xa0, 0x05, 0xd5, 0x1b, 0xb5, 0x95, 0xa2, 0xa6, 0x16, 0x17, 0x56, 0xd5, 0xc2, - 0xfd, 0xe8, 0x99, 0x32, 0xcc, 0xae, 0xe9, 0x17, 0x70, 0x6d, 0x5b, 0xb7, 0xb1, 0x7e, 0xbe, 0x8d, - 0xd1, 0xb5, 0x02, 0x78, 0xa2, 0x4f, 0x86, 0xf1, 0x52, 0x79, 0xbc, 0x6e, 0xee, 0x23, 0x60, 0xae, - 0x88, 0x08, 0xc0, 0xfe, 0xc5, 0x6f, 0x06, 0x2b, 0x1c, 0x60, 0x4f, 0x4c, 0x48, 0x2f, 0x19, 0x62, - 0xbf, 0xf0, 0x08, 0x40, 0x0c, 0x7d, 0x59, 0x86, 0xb9, 0xb2, 0xb9, 0x67, 0x38, 0x78, 0x19, 0x9b, - 0xd8, 0x76, 0xc7, 0x01, 0x21, 0x18, 0x1e, 0x96, 0x43, 0x30, 0x2c, 0xf1, 0x30, 0xdc, 0xd2, 0x47, - 0x6c, 0x7c, 0x19, 0x11, 0xa3, 0xed, 0x55, 0x30, 0x65, 0x90, 0x7c, 0x25, 0xa3, 0xc5, 0x24, 0x16, - 0x24, 0x28, 0xd7, 0xc1, 0x2c, 0x7d, 0x59, 0x32, 0xda, 0xf8, 0x5e, 0x7c, 0x89, 0x8d, 0xbb, 0x7c, - 0x22, 0xfa, 0x15, 0xbf, 0xf1, 0x95, 0x39, 0x2c, 0x7f, 0x22, 0x29, 0x53, 0xc9, 0xc0, 0x7c, 0xd1, - 0x23, 0xa1, 0xf9, 0xed, 0x6b, 0x65, 0x06, 0xfa, 0x81, 0x04, 0xd3, 0x35, 0xc7, 0xea, 0xb8, 0x2a, - 0x6b, 0x98, 0x5b, 0x62, 0xe0, 0x7e, 0x3c, 0xdc, 0xc6, 0x4a, 0x3c, 0xb8, 0x8f, 0xeb, 0x23, 0xc7, - 0x50, 0x01, 0x11, 0x2d, 0xec, 0x3b, 0x7e, 0x0b, 0x5b, 0xe2, 0x50, 0xb9, 0x35, 0x11, 0xb5, 0x1f, - 0xc2, 0xf6, 0xf5, 0x22, 0x19, 0x0a, 0x9e, 0x9a, 0x39, 0xa5, 0x5d, 0xdb, 0xc6, 0xa6, 0x23, 0x06, - 0xc2, 0x5f, 0x86, 0x41, 0x58, 0xe1, 0x41, 0xb8, 0x35, 0x46, 0x99, 0xbd, 0x52, 0x52, 0x6c, 0x63, - 0x1f, 0xf0, 0xd1, 0xbc, 0x97, 0x43, 0xf3, 0x27, 0x93, 0xb3, 0x95, 0x0c, 0xd2, 0x95, 0x21, 0x10, - 0x3d, 0x0e, 0x05, 0x77, 0x4c, 0x2a, 0xd5, 0xcb, 0x67, 0xd5, 0x46, 0xb9, 0x72, 0xb6, 0x5c, 0x57, - 0x0b, 0x18, 0xbd, 0x50, 0x86, 0x19, 0xca, 0x9a, 0x86, 0xf7, 0xac, 0x0b, 0x82, 0xbd, 0xde, 0x97, - 0x13, 0x1a, 0x0b, 0xe1, 0x12, 0x22, 0x5a, 0xc6, 0x2f, 0x27, 0x30, 0x16, 0x62, 0xc8, 0x3d, 0x92, - 0x7a, 0xab, 0x7d, 0xcd, 0x60, 0xab, 0x4f, 0x6b, 0xe9, 0xdb, 0x5b, 0xbd, 0x28, 0x0b, 0x40, 0x2b, - 0x79, 0xd6, 0xc0, 0x17, 0xd1, 0x5a, 0x80, 0x09, 0xa7, 0xb6, 0x99, 0x81, 0x6a, 0x2b, 0xf5, 0x53, - 0xdb, 0x77, 0x87, 0xc7, 0xac, 0x05, 0x1e, 0xbd, 0x9b, 0x22, 0xc5, 0xed, 0x72, 0x12, 0x3d, 0x3b, - 0xf4, 0x14, 0x45, 0xe2, 0xad, 0xce, 0xab, 0x60, 0x8a, 0x3c, 0x56, 0xf4, 0x1d, 0xcc, 0xda, 0x50, - 0x90, 0xa0, 0x9c, 0x81, 0x19, 0x9a, 0xb1, 0x69, 0x99, 0x6e, 0x7d, 0xb2, 0x24, 0x03, 0x97, 0xe6, - 0x82, 0xd8, 0xb4, 0xb1, 0xee, 0x58, 0x36, 0xa1, 0x91, 0xa3, 0x20, 0x86, 0x92, 0xd0, 0x37, 0xfd, - 0x56, 0xa8, 0x72, 0x9a, 0xf3, 0xf8, 0x24, 0x55, 0x49, 0xa6, 0x37, 0x7b, 0xc3, 0xb5, 0x3f, 0xda, - 0xea, 0x1a, 0x2e, 0xda, 0x4b, 0x64, 0x6a, 0x87, 0x95, 0x93, 0xa0, 0xb0, 0x54, 0x37, 0x6f, 0xa9, - 0x5a, 0xa9, 0xab, 0x95, 0x7a, 0x61, 0xb3, 0xaf, 0x46, 0x6d, 0xa1, 0xd7, 0x64, 0x21, 0x7b, 0x8f, - 0x65, 0x98, 0xe8, 0xc1, 0x0c, 0xa7, 0x12, 0x26, 0x76, 0x2e, 0x5a, 0xf6, 0x05, 0xbf, 0xa1, 0x06, - 0x09, 0xf1, 0xd8, 0x04, 0xaa, 0x24, 0x0f, 0x54, 0xa5, 0x6c, 0x3f, 0x55, 0xfa, 0xb5, 0xb0, 0x2a, - 0xdd, 0xc1, 0xab, 0xd2, 0xf5, 0x7d, 0xe4, 0xef, 0x32, 0x1f, 0xd1, 0x01, 0x7c, 0xcc, 0xef, 0x00, - 0xee, 0xe2, 0x60, 0x7c, 0xac, 0x18, 0x99, 0x64, 0x00, 0x7e, 0x29, 0xd5, 0x86, 0xdf, 0x0f, 0xea, - 0xad, 0x08, 0xa8, 0xb7, 0xfb, 0xf4, 0x09, 0xc6, 0xfe, 0xae, 0xe3, 0xfe, 0xfd, 0xdd, 0xc4, 0x05, - 0xe5, 0x04, 0x1c, 0x5b, 0x2c, 0x2f, 0x2d, 0xa9, 0x9a, 0x5a, 0xa9, 0x37, 0x2a, 0x6a, 0xfd, 0x5c, - 0x55, 0xbb, 0xb7, 0xd0, 0x46, 0x0f, 0xc9, 0x00, 0xae, 0x84, 0x4a, 0xba, 0xd9, 0xc4, 0x6d, 0xb1, - 0x1e, 0xfd, 0x7f, 0x49, 0xc9, 0xfa, 0x84, 0x80, 0x7e, 0x04, 0x9c, 0x2f, 0x97, 0xc4, 0x5b, 0x65, - 0x24, 0xb1, 0x64, 0xa0, 0xbe, 0xf1, 0x91, 0x60, 0x7b, 0x5e, 0x06, 0x47, 0x3d, 0x7a, 0x2c, 0x7b, - 0xff, 0x69, 0xdf, 0x5b, 0xb2, 0x30, 0xc7, 0x60, 0xf1, 0xe6, 0xf1, 0xcf, 0xce, 0x88, 0x4c, 0xe4, - 0x11, 0x4c, 0xb2, 0x69, 0xbb, 0xd7, 0xbd, 0xfb, 0xef, 0xca, 0x32, 0x4c, 0x77, 0xb0, 0xbd, 0x63, - 0x74, 0xbb, 0x86, 0x65, 0xd2, 0x05, 0xb9, 0xb9, 0x5b, 0x1f, 0xed, 0x4b, 0x9c, 0xac, 0x5d, 0xce, - 0xaf, 0xeb, 0xb6, 0x63, 0x34, 0x8d, 0x8e, 0x6e, 0x3a, 0xeb, 0x41, 0x66, 0x2d, 0xfc, 0x27, 0x7a, - 0x41, 0xc2, 0x69, 0x0d, 0x5f, 0x93, 0x08, 0x95, 0xf8, 0xfd, 0x04, 0x53, 0x92, 0x58, 0x82, 0xc9, - 0xd4, 0xe2, 0xa3, 0xa9, 0xaa, 0x45, 0x1f, 0xbc, 0xb7, 0x94, 0x2b, 0xe0, 0x44, 0xb9, 0x52, 0xaa, - 0x6a, 0x9a, 0x5a, 0xaa, 0x37, 0xd6, 0x55, 0x6d, 0xad, 0x5c, 0xab, 0x95, 0xab, 0x95, 0xda, 0x41, - 0x5a, 0x3b, 0xfa, 0x84, 0xec, 0x6b, 0xcc, 0x22, 0x6e, 0xb6, 0x0d, 0x13, 0xa3, 0xbb, 0x0e, 0xa8, - 0x30, 0xfc, 0xaa, 0x8f, 0x38, 0xce, 0xac, 0xfc, 0x08, 0x9c, 0x5f, 0x9d, 0x1c, 0xe7, 0xfe, 0x04, - 0xff, 0x03, 0x37, 0xff, 0x2f, 0xcb, 0x70, 0x2c, 0xd4, 0x10, 0x35, 0xbc, 0x33, 0xb2, 0x95, 0xbc, - 0x5f, 0x08, 0xb7, 0xdd, 0x32, 0x8f, 0x69, 0x3f, 0x6b, 0x7a, 0x1f, 0x1b, 0x11, 0xb0, 0xbe, 0xd1, - 0x87, 0x75, 0x95, 0x83, 0xf5, 0xc9, 0x43, 0xd0, 0x4c, 0x86, 0xec, 0xef, 0xa6, 0x8a, 0xec, 0x15, - 0x70, 0x62, 0xbd, 0xa8, 0xd5, 0xcb, 0xa5, 0xf2, 0x7a, 0xd1, 0x1d, 0x47, 0x43, 0x43, 0x76, 0x84, - 0xb9, 0xce, 0x83, 0xde, 0x17, 0xdf, 0xf7, 0x67, 0xe1, 0xaa, 0xfe, 0x1d, 0x6d, 0x69, 0x5b, 0x37, - 0xb7, 0x30, 0x32, 0x44, 0xa0, 0x5e, 0x84, 0x89, 0x26, 0xc9, 0x4e, 0x71, 0x0e, 0x6f, 0xdd, 0xc4, - 0xf4, 0xe5, 0xb4, 0x04, 0xcd, 0xfb, 0x15, 0xbd, 0x3d, 0xac, 0x10, 0x75, 0x5e, 0x21, 0x9e, 0x1a, - 0x0f, 0xde, 0x3e, 0xbe, 0x23, 0x74, 0xe3, 0xd3, 0xbe, 0x6e, 0x9c, 0xe3, 0x74, 0xa3, 0x74, 0x30, - 0xf2, 0xc9, 0xd4, 0xe4, 0x8f, 0x1f, 0x09, 0x1d, 0x40, 0xa4, 0x36, 0x19, 0xd1, 0xa3, 0x42, 0xdf, - 0xee, 0xfe, 0x95, 0x32, 0xe4, 0x17, 0x71, 0x1b, 0x8b, 0xae, 0x44, 0x7e, 0x5b, 0x12, 0xdd, 0x10, - 0xa1, 0x30, 0x50, 0xda, 0xd1, 0xab, 0x23, 0x8e, 0xb1, 0x83, 0xbb, 0x8e, 0xbe, 0xd3, 0x21, 0xa2, - 0x96, 0xb5, 0x20, 0x01, 0xfd, 0xa2, 0x24, 0xb2, 0x5d, 0x12, 0x53, 0xcc, 0x7f, 0x8c, 0x35, 0xc5, - 0xcf, 0x4a, 0x30, 0x59, 0xc3, 0x4e, 0xd5, 0x6e, 0x61, 0x1b, 0xd5, 0x02, 0x8c, 0xae, 0x81, 0x69, - 0x02, 0x8a, 0x3b, 0xcd, 0xf4, 0x71, 0x0a, 0x27, 0x29, 0xd7, 0xc3, 0x9c, 0xff, 0x4a, 0x7e, 0x67, - 0xdd, 0x78, 0x4f, 0x2a, 0xfa, 0xc7, 0x8c, 0xe8, 0x2e, 0x2e, 0x5b, 0x32, 0x64, 0xdc, 0x44, 0xb4, - 0x52, 0xb1, 0x1d, 0xd9, 0x58, 0x52, 0xe9, 0x6f, 0x74, 0xbd, 0x55, 0x02, 0xd8, 0x30, 0xbb, 0x9e, - 0x5c, 0x1f, 0x9b, 0x40, 0xae, 0xe8, 0x9f, 0x33, 0xc9, 0x66, 0x31, 0x41, 0x39, 0x11, 0x12, 0x7b, - 0x6d, 0x82, 0xb5, 0x85, 0x48, 0x62, 0xe9, 0xcb, 0xec, 0x6b, 0x73, 0x90, 0x3f, 0xa7, 0xb7, 0xdb, - 0xd8, 0x41, 0x5f, 0x97, 0x20, 0x5f, 0xb2, 0xb1, 0xee, 0xe0, 0xb0, 0xe8, 0x10, 0x4c, 0xda, 0x96, - 0xe5, 0xac, 0xeb, 0xce, 0x36, 0x93, 0x9b, 0xff, 0xce, 0x1c, 0x06, 0x7e, 0x27, 0xdc, 0x7d, 0xdc, - 0xc5, 0x8b, 0xee, 0xc7, 0xb9, 0xda, 0xd2, 0x82, 0xe6, 0x69, 0x21, 0x11, 0xfd, 0x07, 0x82, 0xc9, - 0x1d, 0x13, 0xef, 0x58, 0xa6, 0xd1, 0xf4, 0x6c, 0x4e, 0xef, 0x1d, 0x7d, 0xc8, 0x97, 0xe9, 0x02, - 0x27, 0xd3, 0x79, 0xe1, 0x52, 0x92, 0x09, 0xb4, 0x36, 0x44, 0xef, 0x71, 0x35, 0x5c, 0x49, 0x3b, - 0x83, 0x46, 0xbd, 0xda, 0x28, 0x69, 0x6a, 0xb1, 0xae, 0x36, 0x56, 0xab, 0xa5, 0xe2, 0x6a, 0x43, - 0x53, 0xd7, 0xab, 0x05, 0x8c, 0xfe, 0x4e, 0x72, 0x85, 0xdb, 0xb4, 0xf6, 0xb0, 0x8d, 0x96, 0x85, - 0xe4, 0x1c, 0x27, 0x13, 0x86, 0xc1, 0xaf, 0x09, 0x3b, 0x6d, 0x30, 0xe9, 0x30, 0x0e, 0x22, 0x94, - 0xf7, 0xc3, 0x42, 0xcd, 0x3d, 0x96, 0xd4, 0x23, 0x40, 0xd2, 0xff, 0x5b, 0x82, 0x89, 0x92, 0x65, - 0xee, 0x61, 0xdb, 0x09, 0xcf, 0x77, 0xc2, 0xd2, 0xcc, 0xf0, 0xd2, 0x74, 0x07, 0x49, 0x6c, 0x3a, - 0xb6, 0xd5, 0xf1, 0x26, 0x3c, 0xde, 0x2b, 0x7a, 0x7d, 0x52, 0x09, 0xb3, 0x92, 0xa3, 0x17, 0x3e, - 0xfb, 0x17, 0xc4, 0xb1, 0x27, 0xf7, 0x34, 0x80, 0x87, 0x92, 0xe0, 0xd2, 0x9f, 0x81, 0xf4, 0xbb, - 0x94, 0xaf, 0xc8, 0x30, 0x4b, 0x1b, 0x5f, 0x0d, 0x13, 0x0b, 0x0d, 0x55, 0xc3, 0x4b, 0x8e, 0x3d, - 0xc2, 0x5f, 0x39, 0xc2, 0x89, 0x3f, 0xaf, 0x77, 0x3a, 0xfe, 0xf2, 0xf3, 0xca, 0x11, 0x8d, 0xbd, - 0x53, 0x35, 0x5f, 0xc8, 0x43, 0x56, 0xdf, 0x75, 0xb6, 0xd1, 0x0f, 0x84, 0x27, 0x9f, 0x5c, 0x67, - 0xc0, 0xf8, 0x89, 0x80, 0xe4, 0x38, 0xe4, 0x1c, 0xeb, 0x02, 0xf6, 0xe4, 0x40, 0x5f, 0x5c, 0x38, - 0xf4, 0x4e, 0xa7, 0x4e, 0x3e, 0x30, 0x38, 0xbc, 0x77, 0xd7, 0xd6, 0xd1, 0x9b, 0x4d, 0x6b, 0xd7, - 0x74, 0xca, 0xde, 0x12, 0x74, 0x90, 0x80, 0xbe, 0x98, 0x11, 0x99, 0xcc, 0x0a, 0x30, 0x98, 0x0c, - 0xb2, 0xf3, 0x43, 0x34, 0xa5, 0x79, 0xb8, 0xb1, 0xb8, 0xbe, 0xde, 0xa8, 0x57, 0xef, 0x55, 0x2b, - 0x81, 0xe1, 0xd9, 0x28, 0x57, 0x1a, 0xf5, 0x15, 0xb5, 0x51, 0xda, 0xd0, 0xc8, 0x3a, 0x61, 0xb1, - 0x54, 0xaa, 0x6e, 0x54, 0xea, 0x05, 0x8c, 0xde, 0x24, 0xc1, 0x4c, 0xa9, 0x6d, 0x75, 0x7d, 0x84, - 0xaf, 0x0e, 0x10, 0xf6, 0xc5, 0x98, 0x09, 0x89, 0x11, 0xfd, 0x5b, 0x46, 0xd4, 0xe9, 0xc0, 0x13, - 0x48, 0x88, 0x7c, 0x44, 0x2f, 0xf5, 0x7a, 0x21, 0xa7, 0x83, 0xc1, 0xf4, 0xd2, 0x6f, 0x12, 0x9f, - 0xbd, 0x1d, 0x26, 0x8a, 0x54, 0x31, 0xd0, 0x5f, 0x67, 0x20, 0x5f, 0xb2, 0xcc, 0x4d, 0x63, 0xcb, - 0x35, 0xe6, 0xb0, 0xa9, 0x9f, 0x6f, 0xe3, 0x45, 0xdd, 0xd1, 0xf7, 0x0c, 0x7c, 0x91, 0x54, 0x60, - 0x52, 0xeb, 0x49, 0x75, 0x99, 0x62, 0x29, 0xf8, 0xfc, 0xee, 0x16, 0x61, 0x6a, 0x52, 0x0b, 0x27, - 0x29, 0x4f, 0x86, 0xcb, 0xe9, 0xeb, 0xba, 0x8d, 0x6d, 0xdc, 0xc6, 0x7a, 0x17, 0xbb, 0xd3, 0x22, - 0x13, 0xb7, 0x89, 0xd2, 0x4e, 0x6a, 0x51, 0x9f, 0x95, 0x33, 0x30, 0x43, 0x3f, 0x11, 0x53, 0xa4, - 0x4b, 0xd4, 0x78, 0x52, 0xe3, 0xd2, 0x94, 0xc7, 0x41, 0x0e, 0x3f, 0xe0, 0xd8, 0xfa, 0xa9, 0x16, - 0xc1, 0xeb, 0xf2, 0x79, 0xea, 0x75, 0x38, 0xef, 0x79, 0x1d, 0xce, 0xd7, 0x88, 0x4f, 0xa2, 0x46, - 0x73, 0xa1, 0x97, 0x4d, 0xfa, 0x86, 0xc4, 0xbf, 0x4b, 0x81, 0x62, 0x28, 0x90, 0x35, 0xf5, 0x1d, - 0xcc, 0xf4, 0x82, 0x3c, 0x2b, 0x37, 0xc2, 0x51, 0x7d, 0x4f, 0x77, 0x74, 0x7b, 0xd5, 0x6a, 0xea, - 0x6d, 0x32, 0xf8, 0x79, 0x2d, 0xbf, 0xf7, 0x03, 0xd9, 0x11, 0x72, 0x2c, 0x1b, 0x93, 0x5c, 0xde, - 0x8e, 0x90, 0x97, 0xe0, 0x52, 0x37, 0x9a, 0x96, 0x49, 0xf8, 0x97, 0x35, 0xf2, 0xec, 0x4a, 0xa5, - 0x65, 0x74, 0xdd, 0x8a, 0x10, 0x2a, 0x15, 0xba, 0xb5, 0x51, 0xbb, 0x64, 0x36, 0xc9, 0x6e, 0xd0, - 0xa4, 0x16, 0xf5, 0x59, 0x59, 0x80, 0x69, 0xb6, 0x11, 0xb2, 0xe6, 0xea, 0x55, 0x9e, 0xe8, 0xd5, - 0x35, 0xbc, 0x4f, 0x17, 0xc5, 0x73, 0xbe, 0x12, 0xe4, 0xd3, 0xc2, 0x3f, 0x29, 0x77, 0xc3, 0x95, - 0xec, 0xb5, 0xb4, 0xdb, 0x75, 0xac, 0x1d, 0x0a, 0xfa, 0x92, 0xd1, 0xa6, 0x35, 0x98, 0x20, 0x35, - 0x88, 0xcb, 0xa2, 0xdc, 0x0a, 0xc7, 0x3b, 0x36, 0xde, 0xc4, 0xf6, 0x7d, 0xfa, 0xce, 0xee, 0x03, - 0x75, 0x5b, 0x37, 0xbb, 0x1d, 0xcb, 0x76, 0x4e, 0x4d, 0x12, 0xe6, 0xfb, 0x7e, 0x63, 0x1d, 0xe5, - 0x24, 0xe4, 0xa9, 0xf8, 0xd0, 0xf3, 0x73, 0xc2, 0xee, 0x9c, 0xac, 0x42, 0xb1, 0xe6, 0xd9, 0x2d, - 0x30, 0xc1, 0x7a, 0x38, 0x02, 0xd4, 0xf4, 0xad, 0x27, 0x7b, 0xd6, 0x15, 0x18, 0x15, 0xcd, 0xcb, - 0xa6, 0x3c, 0x01, 0xf2, 0x4d, 0x52, 0x2d, 0x82, 0xd9, 0xf4, 0xad, 0x57, 0xf6, 0x2f, 0x94, 0x64, - 0xd1, 0x58, 0x56, 0xf4, 0x17, 0xb2, 0x90, 0x07, 0x68, 0x1c, 0xc7, 0xc9, 0x5a, 0xf5, 0x37, 0xa5, - 0x21, 0xba, 0xcd, 0x9b, 0xe0, 0x06, 0xd6, 0x27, 0x32, 0xfb, 0x63, 0xb1, 0xb1, 0xb0, 0xe1, 0x4d, - 0x06, 0x5d, 0xab, 0xa4, 0x56, 0x2f, 0x6a, 0xee, 0x4c, 0x7e, 0xd1, 0x9d, 0x44, 0xde, 0x08, 0xd7, - 0x0f, 0xc8, 0xad, 0xd6, 0x1b, 0x95, 0xe2, 0x9a, 0x5a, 0xd8, 0xe4, 0x6d, 0x9b, 0x5a, 0xbd, 0xba, - 0xde, 0xd0, 0x36, 0x2a, 0x95, 0x72, 0x65, 0x99, 0x12, 0x73, 0x4d, 0xc2, 0x93, 0x41, 0x86, 0x73, - 0x5a, 0xb9, 0xae, 0x36, 0x4a, 0xd5, 0xca, 0x52, 0x79, 0xb9, 0x60, 0x0c, 0x32, 0x8c, 0xee, 0x57, - 0xae, 0x81, 0xab, 0x38, 0x4e, 0xca, 0xd5, 0x8a, 0x3b, 0xb3, 0x2d, 0x15, 0x2b, 0x25, 0xd5, 0x9d, - 0xc6, 0x5e, 0x50, 0x10, 0x9c, 0xa0, 0xe4, 0x1a, 0x4b, 0xe5, 0xd5, 0xf0, 0x66, 0xd4, 0xc7, 0x33, - 0xca, 0x29, 0xb8, 0x2c, 0xfc, 0xad, 0x5c, 0x39, 0x5b, 0x5c, 0x2d, 0x2f, 0x16, 0xfe, 0x28, 0xa3, - 0x5c, 0x07, 0x57, 0x73, 0x7f, 0xd1, 0x7d, 0xa5, 0x46, 0x79, 0xb1, 0xb1, 0x56, 0xae, 0xad, 0x15, - 0xeb, 0xa5, 0x95, 0xc2, 0x27, 0xc8, 0x7c, 0xc1, 0x37, 0x80, 0x43, 0x6e, 0x99, 0x2f, 0x0a, 0x8f, - 0xe9, 0x45, 0x5e, 0x51, 0x1f, 0xdb, 0x17, 0xf6, 0x78, 0x1b, 0xf6, 0xa3, 0xfe, 0xe8, 0xb0, 0xc8, - 0xa9, 0xd0, 0x2d, 0x09, 0x68, 0x25, 0xd3, 0xa1, 0xfa, 0x10, 0x2a, 0x74, 0x0d, 0x5c, 0x55, 0x51, - 0x29, 0x52, 0x9a, 0x5a, 0xaa, 0x9e, 0x55, 0xb5, 0xc6, 0xb9, 0xe2, 0xea, 0xaa, 0x5a, 0x6f, 0x2c, - 0x95, 0xb5, 0x5a, 0xbd, 0xb0, 0x89, 0xfe, 0x59, 0xf2, 0x57, 0x73, 0x42, 0xd2, 0xfa, 0x6b, 0x29, - 0x69, 0xb3, 0x8e, 0x5d, 0xb5, 0xf9, 0x09, 0xc8, 0x77, 0x1d, 0xdd, 0xd9, 0xed, 0xb2, 0x56, 0xfd, - 0xa8, 0xfe, 0xad, 0x7a, 0xbe, 0x46, 0x32, 0x69, 0x2c, 0x33, 0xfa, 0x8b, 0x4c, 0x92, 0x66, 0x3a, - 0x82, 0x05, 0x1d, 0x63, 0x08, 0x11, 0x9f, 0x06, 0xe4, 0x69, 0x7b, 0xb9, 0xd6, 0x28, 0xae, 0x6a, - 0x6a, 0x71, 0xf1, 0x3e, 0x7f, 0x19, 0x07, 0x2b, 0x27, 0xe0, 0xd8, 0x46, 0xa5, 0xb8, 0xb0, 0xaa, - 0x92, 0xe6, 0x52, 0xad, 0x54, 0xd4, 0x92, 0x2b, 0xf7, 0x5f, 0x24, 0x9b, 0x26, 0xae, 0x05, 0x4d, - 0xf8, 0x76, 0xad, 0x9c, 0x90, 0xfc, 0xbf, 0x21, 0xec, 0x5b, 0x14, 0x68, 0x58, 0x98, 0xd6, 0x68, - 0x71, 0xf8, 0xa2, 0x90, 0x3b, 0x91, 0x10, 0x27, 0xc9, 0xf0, 0xf8, 0xcf, 0x43, 0xe0, 0x71, 0x02, - 0x8e, 0x85, 0xf1, 0x20, 0x6e, 0x45, 0xd1, 0x30, 0x7c, 0x75, 0x12, 0xf2, 0x35, 0xdc, 0xc6, 0x4d, - 0x07, 0xbd, 0x25, 0x64, 0x4c, 0xcc, 0x81, 0xe4, 0xbb, 0xb1, 0x48, 0x46, 0x8b, 0x9b, 0x3e, 0x4b, - 0x3d, 0xd3, 0xe7, 0x18, 0x33, 0x40, 0x4e, 0x64, 0x06, 0x64, 0x53, 0x30, 0x03, 0x72, 0xc3, 0x9b, - 0x01, 0xf9, 0x41, 0x66, 0x00, 0x7a, 0x6d, 0x3e, 0x69, 0x2f, 0x41, 0x45, 0x7d, 0xb8, 0x83, 0xff, - 0xff, 0xca, 0x26, 0xe9, 0x55, 0xfa, 0x72, 0x9c, 0x4c, 0x8b, 0x7f, 0x20, 0xa7, 0xb0, 0xfc, 0xa0, - 0x5c, 0x0b, 0x57, 0x07, 0xef, 0x0d, 0xf5, 0x69, 0xe5, 0x5a, 0xbd, 0x46, 0x46, 0xfc, 0x52, 0x55, - 0xd3, 0x36, 0xd6, 0xe9, 0x1a, 0xf2, 0x49, 0x50, 0x02, 0x2a, 0xda, 0x46, 0x85, 0x8e, 0xef, 0x5b, - 0x3c, 0xf5, 0xa5, 0x72, 0x65, 0xb1, 0xe1, 0xb7, 0x99, 0xca, 0x52, 0xb5, 0xb0, 0xed, 0x4e, 0xd9, - 0x42, 0xd4, 0xdd, 0x01, 0x9a, 0x95, 0x50, 0xac, 0x2c, 0x36, 0xd6, 0x2a, 0xea, 0x5a, 0xb5, 0x52, - 0x2e, 0x91, 0xf4, 0x9a, 0x5a, 0x2f, 0x18, 0xee, 0x40, 0xd3, 0x63, 0x51, 0xd4, 0xd4, 0xa2, 0x56, - 0x5a, 0x51, 0x35, 0x5a, 0xe4, 0xfd, 0xca, 0xf5, 0x70, 0xa6, 0x58, 0xa9, 0xd6, 0xdd, 0x94, 0x62, - 0xe5, 0xbe, 0xfa, 0x7d, 0xeb, 0x6a, 0x63, 0x5d, 0xab, 0x96, 0xd4, 0x5a, 0xcd, 0x6d, 0xa7, 0xcc, - 0xfe, 0x28, 0xb4, 0x95, 0xa7, 0xc2, 0xed, 0x21, 0xd6, 0xd4, 0x3a, 0xd9, 0xb0, 0x5c, 0xab, 0x12, - 0x9f, 0x95, 0x45, 0xb5, 0xb1, 0x52, 0xac, 0x35, 0xca, 0x95, 0x52, 0x75, 0x6d, 0xbd, 0x58, 0x2f, - 0xbb, 0xcd, 0x79, 0x5d, 0xab, 0xd6, 0xab, 0x8d, 0xb3, 0xaa, 0x56, 0x2b, 0x57, 0x2b, 0x05, 0xd3, - 0xad, 0x72, 0xa8, 0xfd, 0x7b, 0xfd, 0xb0, 0xa5, 0x5c, 0x05, 0xa7, 0xbc, 0xf4, 0xd5, 0xaa, 0x2b, - 0xe8, 0x90, 0x45, 0xd2, 0x49, 0xd5, 0x22, 0xf9, 0x57, 0x09, 0xb2, 0x35, 0xc7, 0xea, 0xa0, 0x1f, - 0x0f, 0x3a, 0x98, 0xd3, 0x00, 0x36, 0xd9, 0x7f, 0x74, 0x67, 0x61, 0x6c, 0x5e, 0x16, 0x4a, 0x41, - 0x7f, 0x28, 0xbc, 0x69, 0x12, 0xf4, 0xd9, 0x56, 0x27, 0xc2, 0x56, 0xf9, 0x9e, 0xd8, 0x29, 0x92, - 0x68, 0x42, 0xc9, 0xf4, 0xfd, 0x97, 0x87, 0xd9, 0x16, 0x41, 0x70, 0x32, 0x04, 0x9b, 0x2b, 0x7f, - 0x4f, 0x25, 0xb0, 0x72, 0x39, 0x5c, 0xd6, 0xa3, 0x5c, 0x44, 0xa7, 0x36, 0x95, 0x1f, 0x83, 0x47, - 0x85, 0xd4, 0x5b, 0x5d, 0xab, 0x9e, 0x55, 0x7d, 0x45, 0x5e, 0x2c, 0xd6, 0x8b, 0x85, 0x2d, 0xf4, - 0x59, 0x19, 0xb2, 0x6b, 0xd6, 0x5e, 0xef, 0x5e, 0x95, 0x89, 0x2f, 0x86, 0xd6, 0x42, 0xbd, 0x57, - 0xde, 0x6b, 0x5e, 0x48, 0xec, 0x6b, 0xd1, 0xfb, 0xd2, 0x5f, 0x94, 0x92, 0x88, 0x7d, 0xed, 0xa0, - 0x9b, 0xd1, 0x7f, 0x3f, 0x8c, 0xd8, 0x23, 0x44, 0x8b, 0x95, 0x33, 0x70, 0x3a, 0xf8, 0x50, 0x5e, - 0x54, 0x2b, 0xf5, 0xf2, 0xd2, 0x7d, 0x81, 0x70, 0xcb, 0x9a, 0x90, 0xf8, 0x07, 0x75, 0x63, 0xf1, - 0x33, 0x8d, 0x53, 0x70, 0x3c, 0xf8, 0xb6, 0xac, 0xd6, 0xbd, 0x2f, 0xf7, 0xa3, 0x07, 0x73, 0x30, - 0x43, 0xbb, 0xf5, 0x8d, 0x4e, 0x4b, 0x77, 0x30, 0x7a, 0x42, 0x80, 0xee, 0x0d, 0x70, 0xb4, 0xbc, - 0xbe, 0x54, 0xab, 0x39, 0x96, 0xad, 0x6f, 0xe1, 0x62, 0xab, 0x65, 0x33, 0x69, 0xf5, 0x26, 0xa3, - 0x77, 0x0a, 0xaf, 0xf3, 0xf1, 0x43, 0x09, 0x2d, 0x33, 0x02, 0xf5, 0xaf, 0x08, 0xad, 0xcb, 0x09, - 0x10, 0x4c, 0x86, 0xfe, 0xfd, 0x23, 0x6e, 0x73, 0xd1, 0xb8, 0x6c, 0x9e, 0x79, 0x96, 0x04, 0x53, - 0x75, 0x63, 0x07, 0x3f, 0xdd, 0x32, 0x71, 0x57, 0x99, 0x00, 0x79, 0x79, 0xad, 0x5e, 0x38, 0xe2, - 0x3e, 0xb8, 0x46, 0x55, 0x86, 0x3c, 0xa8, 0x6e, 0x01, 0xee, 0x43, 0xb1, 0x5e, 0x90, 0xdd, 0x87, - 0x35, 0xb5, 0x5e, 0xc8, 0xba, 0x0f, 0x15, 0xb5, 0x5e, 0xc8, 0xb9, 0x0f, 0xeb, 0xab, 0xf5, 0x42, - 0xde, 0x7d, 0x28, 0xd7, 0xea, 0x85, 0x09, 0xf7, 0x61, 0xa1, 0x56, 0x2f, 0x4c, 0xba, 0x0f, 0x67, - 0x6b, 0xf5, 0xc2, 0x94, 0xfb, 0x50, 0xaa, 0xd7, 0x0b, 0xe0, 0x3e, 0xdc, 0x53, 0xab, 0x17, 0xa6, - 0xdd, 0x87, 0x62, 0xa9, 0x5e, 0x98, 0x21, 0x0f, 0x6a, 0xbd, 0x30, 0xeb, 0x3e, 0xd4, 0x6a, 0xf5, - 0xc2, 0x1c, 0xa1, 0x5c, 0xab, 0x17, 0x8e, 0x92, 0xb2, 0xca, 0xf5, 0x42, 0xc1, 0x7d, 0x58, 0xa9, - 0xd5, 0x0b, 0xc7, 0x48, 0xe6, 0x5a, 0xbd, 0xa0, 0x90, 0x42, 0x6b, 0xf5, 0xc2, 0x65, 0x24, 0x4f, - 0xad, 0x5e, 0x38, 0x4e, 0x8a, 0xa8, 0xd5, 0x0b, 0x27, 0x08, 0x1b, 0x6a, 0xbd, 0x70, 0x92, 0xe4, - 0xd1, 0xea, 0x85, 0xcb, 0xc9, 0xa7, 0x4a, 0xbd, 0x70, 0x8a, 0x30, 0xa6, 0xd6, 0x0b, 0x57, 0x90, - 0x07, 0xad, 0x5e, 0x40, 0xe4, 0x53, 0xb1, 0x5e, 0xb8, 0x12, 0x3d, 0x0a, 0xa6, 0x96, 0xb1, 0x43, - 0x41, 0x44, 0x05, 0x90, 0x97, 0xb1, 0x13, 0x36, 0xe3, 0xbf, 0x26, 0xc3, 0xe5, 0x6c, 0xea, 0xb7, - 0x64, 0x5b, 0x3b, 0xab, 0x78, 0x4b, 0x6f, 0x5e, 0x52, 0x1f, 0x70, 0x4d, 0xa8, 0xf0, 0xbe, 0xac, - 0x02, 0xd9, 0x4e, 0xd0, 0x19, 0x91, 0xe7, 0x58, 0x8b, 0xd3, 0x5b, 0x8c, 0x92, 0x83, 0xc5, 0x28, - 0x66, 0x91, 0xfd, 0x53, 0x58, 0xa3, 0xb9, 0xf5, 0xe3, 0x4c, 0xcf, 0xfa, 0xb1, 0xdb, 0x4c, 0x3a, - 0xd8, 0xee, 0x5a, 0xa6, 0xde, 0xae, 0xb1, 0x8d, 0x7b, 0xba, 0xea, 0xd5, 0x9b, 0xac, 0xfc, 0x94, - 0xd7, 0x32, 0xa8, 0x55, 0xf6, 0x94, 0xb8, 0x19, 0x6e, 0x6f, 0x35, 0x23, 0x1a, 0xc9, 0x27, 0xfc, - 0x46, 0x52, 0xe7, 0x1a, 0xc9, 0xdd, 0x07, 0xa0, 0x9d, 0xac, 0xbd, 0x94, 0x87, 0x9b, 0x5a, 0x04, - 0x6e, 0xad, 0xde, 0x72, 0xb5, 0x8c, 0x3e, 0x2b, 0xc1, 0x49, 0xd5, 0xec, 0x67, 0xe1, 0x87, 0x75, - 0xe1, 0x4d, 0x61, 0x68, 0xd6, 0x79, 0x91, 0xde, 0xde, 0xb7, 0xda, 0xfd, 0x69, 0x46, 0x48, 0xf4, - 0x53, 0xbe, 0x44, 0x6b, 0x9c, 0x44, 0xef, 0x1a, 0x9e, 0x74, 0x32, 0x81, 0x56, 0x46, 0xda, 0x01, - 0x65, 0xd1, 0x37, 0xb3, 0xf0, 0x28, 0xea, 0x7b, 0xc3, 0x38, 0xa4, 0xad, 0xac, 0x68, 0xb6, 0x34, - 0xdc, 0x75, 0x74, 0xdb, 0xe1, 0xce, 0x43, 0xf7, 0x4c, 0xa5, 0x32, 0x29, 0x4c, 0xa5, 0xa4, 0x81, - 0x53, 0x29, 0xf4, 0x8e, 0xb0, 0xf9, 0x70, 0x8e, 0xc7, 0xb8, 0xd8, 0xbf, 0xff, 0x8f, 0xab, 0x61, - 0x14, 0xd4, 0xbe, 0x5d, 0xf1, 0xd3, 0x1c, 0xd4, 0x4b, 0x07, 0x2e, 0x21, 0x19, 0xe2, 0x7f, 0x38, - 0x5a, 0x3b, 0x2f, 0x1b, 0xfe, 0xc6, 0x1b, 0x25, 0x85, 0x56, 0xaa, 0x06, 0xfa, 0xa7, 0x27, 0x60, - 0x8a, 0xb4, 0x85, 0x55, 0xc3, 0xbc, 0x80, 0x1e, 0x92, 0x61, 0xa6, 0x82, 0x2f, 0x96, 0xb6, 0xf5, - 0x76, 0x1b, 0x9b, 0x5b, 0x38, 0x6c, 0xb6, 0x9f, 0x82, 0x09, 0xbd, 0xd3, 0xa9, 0x04, 0xfb, 0x0c, - 0xde, 0x2b, 0xeb, 0x7f, 0xbf, 0xd1, 0xb7, 0x91, 0x67, 0x62, 0x1a, 0xb9, 0x5f, 0xee, 0x7c, 0xb8, - 0xcc, 0x88, 0x19, 0xf2, 0x35, 0x30, 0xdd, 0xf4, 0xb2, 0xf8, 0xe7, 0x26, 0xc2, 0x49, 0xe8, 0x6f, - 0x13, 0x75, 0x03, 0x42, 0x85, 0x27, 0x53, 0x0a, 0x3c, 0x62, 0x3b, 0xe4, 0x04, 0x1c, 0xab, 0x57, - 0xab, 0x8d, 0xb5, 0x62, 0xe5, 0xbe, 0xe0, 0xbc, 0xf2, 0x26, 0x7a, 0x79, 0x16, 0xe6, 0x6a, 0x56, - 0x7b, 0x0f, 0x07, 0x30, 0x95, 0x39, 0x87, 0x9c, 0xb0, 0x9c, 0x32, 0xfb, 0xe4, 0xa4, 0x9c, 0x84, - 0xbc, 0x6e, 0x76, 0x2f, 0x62, 0xcf, 0x36, 0x64, 0x6f, 0x0c, 0xc6, 0xf7, 0x87, 0xdb, 0xb1, 0xc6, - 0xc3, 0x78, 0xc7, 0x00, 0x49, 0xf2, 0x5c, 0x45, 0x00, 0x79, 0x06, 0x66, 0xba, 0x74, 0xb3, 0xb0, - 0x1e, 0xda, 0x13, 0xe6, 0xd2, 0x08, 0x8b, 0x74, 0xb7, 0x5a, 0x66, 0x2c, 0x92, 0x37, 0xf4, 0x90, - 0xdf, 0xfc, 0x37, 0x38, 0x88, 0x8b, 0x07, 0x61, 0x2c, 0x19, 0xc8, 0xaf, 0x1c, 0xf5, 0x0c, 0xef, - 0x14, 0x1c, 0x67, 0xad, 0xb6, 0x51, 0x5a, 0x29, 0xae, 0xae, 0xaa, 0x95, 0x65, 0xb5, 0x51, 0x5e, - 0xa4, 0x5b, 0x15, 0x41, 0x4a, 0xb1, 0x5e, 0x57, 0xd7, 0xd6, 0xeb, 0xb5, 0x86, 0xfa, 0xb4, 0x92, - 0xaa, 0x2e, 0x12, 0x97, 0x38, 0x72, 0xa6, 0xc5, 0x73, 0x5e, 0x2c, 0x56, 0x6a, 0xe7, 0x54, 0xad, - 0xb0, 0x7d, 0xa6, 0x08, 0xd3, 0xa1, 0x7e, 0xde, 0xe5, 0x6e, 0x11, 0x6f, 0xea, 0xbb, 0x6d, 0x66, - 0xab, 0x15, 0x8e, 0xb8, 0xdc, 0x11, 0xd9, 0x54, 0xcd, 0xf6, 0xa5, 0x42, 0x46, 0x29, 0xc0, 0x4c, - 0xb8, 0x4b, 0x2f, 0x48, 0xe8, 0xad, 0x57, 0xc1, 0xd4, 0x39, 0xcb, 0xbe, 0x40, 0xfc, 0xb8, 0xd0, - 0x7b, 0x68, 0x5c, 0x13, 0xef, 0x84, 0x68, 0x68, 0x60, 0x7f, 0xa5, 0xb8, 0xb7, 0x80, 0x47, 0x6d, - 0x7e, 0xe0, 0x29, 0xd0, 0x6b, 0x60, 0xfa, 0xa2, 0x97, 0x3b, 0x68, 0xe9, 0xa1, 0x24, 0xf4, 0xdf, - 0xc5, 0xf6, 0xff, 0x07, 0x17, 0x99, 0xfe, 0xfe, 0xf4, 0x5b, 0x24, 0xc8, 0x2f, 0x63, 0xa7, 0xd8, - 0x6e, 0x87, 0xe5, 0xf6, 0x62, 0xe1, 0x93, 0x3d, 0x5c, 0x25, 0x8a, 0xed, 0x76, 0x74, 0xa3, 0x0a, - 0x09, 0xc8, 0xf3, 0x40, 0xe7, 0xd2, 0x04, 0xfd, 0xe6, 0x06, 0x14, 0x98, 0xbe, 0xc4, 0x3e, 0x24, - 0xfb, 0x7b, 0xdc, 0x0f, 0x87, 0xac, 0x9c, 0xc7, 0x07, 0x31, 0x6d, 0x32, 0xf1, 0x7b, 0xe5, 0x5e, - 0x3e, 0xe5, 0x5e, 0x98, 0xd8, 0xed, 0xe2, 0x92, 0xde, 0xc5, 0x84, 0xb7, 0xde, 0x9a, 0x56, 0xcf, - 0xdf, 0x8f, 0x9b, 0xce, 0x7c, 0x79, 0xc7, 0x35, 0xa8, 0x37, 0x68, 0x46, 0x3f, 0x4c, 0x0c, 0x7b, - 0xd7, 0x3c, 0x0a, 0xee, 0xa4, 0xe4, 0xa2, 0xe1, 0x6c, 0x97, 0xb6, 0x75, 0x87, 0xad, 0x6d, 0xfb, - 0xef, 0xe8, 0xf9, 0x43, 0xc0, 0x19, 0xbb, 0x17, 0x1c, 0x79, 0x40, 0x30, 0x31, 0x88, 0x23, 0xd8, - 0xc0, 0x1d, 0x06, 0xc4, 0x7f, 0x90, 0x20, 0x5b, 0xed, 0x60, 0x53, 0xf8, 0x34, 0x8c, 0x2f, 0x5b, - 0xa9, 0x47, 0xb6, 0x0f, 0x89, 0x7b, 0x87, 0xf9, 0x95, 0x76, 0x4b, 0x8e, 0x90, 0xec, 0xcd, 0x90, - 0x35, 0xcc, 0x4d, 0x8b, 0x19, 0xa6, 0x57, 0x46, 0x6c, 0x02, 0x95, 0xcd, 0x4d, 0x4b, 0x23, 0x19, - 0x45, 0x1d, 0xc3, 0xe2, 0xca, 0x4e, 0x5f, 0xdc, 0xdf, 0x9a, 0x84, 0x3c, 0x55, 0x67, 0xf4, 0x22, - 0x19, 0xe4, 0x62, 0xab, 0x15, 0x21, 0x78, 0x69, 0x9f, 0xe0, 0x2d, 0xf2, 0x9b, 0x8f, 0x89, 0xff, - 0xce, 0x07, 0x33, 0x11, 0xec, 0xdb, 0x59, 0x93, 0x2a, 0xb6, 0x5a, 0xd1, 0x3e, 0xa8, 0x7e, 0x81, - 0x12, 0x5f, 0x60, 0xb8, 0x85, 0xcb, 0x62, 0x2d, 0x3c, 0xf1, 0x40, 0x10, 0xc9, 0x5f, 0xfa, 0x10, - 0xfd, 0x93, 0x04, 0x13, 0xab, 0x46, 0xd7, 0x71, 0xb1, 0x29, 0x8a, 0x60, 0x73, 0x15, 0x4c, 0x79, - 0xa2, 0x71, 0xbb, 0x3c, 0xb7, 0x3f, 0x0f, 0x12, 0xd0, 0x6b, 0xc2, 0xe8, 0xdc, 0xc3, 0xa3, 0xf3, - 0xc4, 0xf8, 0xda, 0x33, 0x2e, 0xa2, 0x4f, 0x19, 0x04, 0xc5, 0x4a, 0xbd, 0xc5, 0xfe, 0x8e, 0x2f, - 0xf0, 0x35, 0x4e, 0xe0, 0xb7, 0x0d, 0x53, 0x64, 0xfa, 0x42, 0xff, 0x9c, 0x04, 0xe0, 0x96, 0xcd, - 0x8e, 0x72, 0x3d, 0x86, 0x3b, 0xa0, 0x1d, 0x23, 0xdd, 0x97, 0x87, 0xa5, 0xbb, 0xc6, 0x4b, 0xf7, - 0x27, 0x07, 0x57, 0x35, 0xee, 0xc8, 0x96, 0x52, 0x00, 0xd9, 0xf0, 0x45, 0xeb, 0x3e, 0xa2, 0xb7, - 0xf8, 0x42, 0x5d, 0xe7, 0x84, 0x7a, 0xc7, 0x90, 0x25, 0xa5, 0x2f, 0xd7, 0xbf, 0x94, 0x60, 0xa2, - 0x86, 0x1d, 0xb7, 0x9b, 0x44, 0x67, 0x45, 0x7a, 0xf8, 0x50, 0xdb, 0x96, 0x04, 0xdb, 0xf6, 0x77, - 0x33, 0xa2, 0x81, 0x5e, 0x02, 0xc9, 0x30, 0x9e, 0x22, 0x16, 0x0f, 0x1e, 0x16, 0x0a, 0xf4, 0x32, - 0x88, 0x5a, 0xfa, 0xd2, 0x7d, 0x93, 0xe4, 0x6f, 0xcc, 0xf3, 0x27, 0x2d, 0xc2, 0x66, 0x71, 0x66, - 0xbf, 0x59, 0x2c, 0x7e, 0xd2, 0x22, 0x5c, 0xc7, 0xe8, 0x5d, 0xe9, 0xc4, 0xc6, 0xc6, 0x08, 0x36, - 0x8c, 0x87, 0x91, 0xd7, 0x33, 0x65, 0xc8, 0xb3, 0x95, 0xe5, 0xbb, 0xe2, 0x57, 0x96, 0x07, 0x4f, - 0x2d, 0xde, 0x3d, 0x84, 0x29, 0x17, 0xb7, 0xdc, 0xeb, 0xb3, 0x21, 0x85, 0xd8, 0xb8, 0x09, 0x72, - 0x24, 0x12, 0x25, 0x1b, 0xe7, 0x82, 0xbd, 0x7e, 0x8f, 0x84, 0xea, 0x7e, 0xd5, 0x68, 0xa6, 0xc4, - 0x28, 0x8c, 0x60, 0x85, 0x78, 0x18, 0x14, 0x7e, 0x53, 0x01, 0x58, 0xdf, 0x3d, 0xdf, 0x36, 0xba, - 0xdb, 0x86, 0xb9, 0x85, 0xbe, 0x9a, 0x81, 0x19, 0xf6, 0x4a, 0x03, 0x2a, 0xc6, 0x9a, 0x7f, 0x91, - 0x46, 0x41, 0x01, 0xe4, 0x5d, 0xdb, 0x60, 0xcb, 0x00, 0xee, 0xa3, 0x72, 0xa7, 0xef, 0xc8, 0x93, - 0xed, 0x39, 0x4a, 0xef, 0x8a, 0x21, 0xe0, 0x60, 0x3e, 0x54, 0x7a, 0xe0, 0xd0, 0x13, 0x8e, 0x9a, - 0x99, 0xe3, 0xa3, 0x66, 0x72, 0xe7, 0xeb, 0xf2, 0x3d, 0xe7, 0xeb, 0x5c, 0x1c, 0xbb, 0xc6, 0xd3, - 0x31, 0x71, 0x2e, 0x95, 0x35, 0xf2, 0x8c, 0x3e, 0x10, 0x4c, 0x55, 0x2c, 0x41, 0x3b, 0x37, 0x41, - 0x45, 0xaf, 0x82, 0xa9, 0xfb, 0x2d, 0xc3, 0x24, 0x5b, 0x11, 0xcc, 0x79, 0x38, 0x48, 0x40, 0x1f, - 0x11, 0x8e, 0x83, 0x15, 0x12, 0x49, 0xec, 0xa4, 0x83, 0x71, 0x20, 0xf9, 0x1c, 0x84, 0xf6, 0xf3, - 0xe2, 0x3a, 0xcc, 0x41, 0xf4, 0x93, 0xa9, 0xde, 0xce, 0x10, 0xcb, 0x2b, 0x0a, 0xcc, 0x79, 0xe7, - 0x0a, 0xab, 0x0b, 0xf7, 0xa8, 0xa5, 0x7a, 0x01, 0xef, 0x3f, 0x6b, 0x48, 0x4e, 0x15, 0xd2, 0x13, - 0x84, 0xc1, 0x12, 0x0a, 0xfa, 0x9f, 0x12, 0xe4, 0x99, 0x75, 0x70, 0xd7, 0x01, 0x21, 0x44, 0xaf, - 0x18, 0x06, 0x92, 0xd8, 0xe3, 0xdd, 0x9f, 0x4c, 0x0a, 0xc0, 0x08, 0xec, 0x81, 0xfb, 0x52, 0x03, - 0x00, 0xfd, 0x8b, 0x04, 0x59, 0xd7, 0x6a, 0x11, 0x3b, 0x3c, 0xfb, 0x09, 0x61, 0xb7, 0xd5, 0x90, - 0x00, 0x5c, 0xf2, 0x11, 0xfa, 0xbd, 0x00, 0x53, 0x1d, 0x9a, 0xd1, 0x3f, 0xba, 0x7d, 0x9d, 0x40, - 0xdf, 0x81, 0xb5, 0xe0, 0x37, 0xf4, 0x2e, 0x21, 0xd7, 0xd7, 0x78, 0x7e, 0x92, 0xc1, 0xa1, 0x8e, - 0xe2, 0x9c, 0xed, 0x26, 0xfa, 0xbe, 0x04, 0xa0, 0xe1, 0xae, 0xd5, 0xde, 0xc3, 0x1b, 0xb6, 0x81, - 0xae, 0x0c, 0x00, 0x60, 0xcd, 0x3e, 0x13, 0x34, 0xfb, 0x4f, 0x87, 0x05, 0xbf, 0xcc, 0x0b, 0xfe, - 0xf1, 0xd1, 0x9a, 0xe7, 0x11, 0x8f, 0x10, 0xff, 0x53, 0x61, 0x82, 0xc9, 0x91, 0x99, 0x80, 0x62, - 0xc2, 0xf7, 0x7e, 0x42, 0xef, 0xf5, 0x45, 0x7f, 0x0f, 0x27, 0xfa, 0x27, 0x25, 0xe6, 0x28, 0x19, - 0x00, 0xa5, 0x21, 0x00, 0x38, 0x0a, 0xd3, 0x1e, 0x00, 0x1b, 0x5a, 0xb9, 0x80, 0xd1, 0xdb, 0x65, - 0xb2, 0x5b, 0x4e, 0xc7, 0xa2, 0x83, 0xf7, 0x34, 0x5f, 0x17, 0x9e, 0x9b, 0x87, 0xe4, 0xe1, 0x97, - 0x9f, 0x12, 0x40, 0x7f, 0x2a, 0x34, 0x19, 0x17, 0x60, 0xe8, 0x91, 0xd2, 0x5f, 0x9d, 0x51, 0x61, - 0x96, 0x33, 0x22, 0x94, 0x53, 0x70, 0x9c, 0x4b, 0xa0, 0xe3, 0x5d, 0xab, 0x70, 0x44, 0x41, 0x70, - 0x92, 0xfb, 0xc2, 0x5e, 0x70, 0xab, 0x90, 0x41, 0x7f, 0xfe, 0xd9, 0x8c, 0xbf, 0x3c, 0xf3, 0xee, - 0x2c, 0x5b, 0x18, 0xfb, 0x18, 0x1f, 0x2d, 0xac, 0x69, 0x99, 0x0e, 0x7e, 0x20, 0xe4, 0xad, 0xe0, - 0x27, 0xc4, 0x5a, 0x0d, 0xa7, 0x60, 0xc2, 0xb1, 0xc3, 0x1e, 0x0c, 0xde, 0x6b, 0x58, 0xb1, 0x72, - 0xbc, 0x62, 0x55, 0xe0, 0x8c, 0x61, 0x36, 0xdb, 0xbb, 0x2d, 0xac, 0xe1, 0xb6, 0xee, 0xca, 0xb0, - 0x5b, 0xec, 0x2e, 0xe2, 0x0e, 0x36, 0x5b, 0xd8, 0x74, 0x28, 0x9f, 0xde, 0x69, 0x25, 0x81, 0x9c, - 0xbc, 0x32, 0xde, 0xc9, 0x2b, 0xe3, 0x63, 0xfa, 0xad, 0xb8, 0xc6, 0x2c, 0xcf, 0xdd, 0x06, 0x40, - 0xeb, 0x76, 0xd6, 0xc0, 0x17, 0x99, 0x1a, 0x5e, 0xd1, 0xb3, 0x48, 0x57, 0xf5, 0x33, 0x68, 0xa1, - 0xcc, 0xe8, 0xcb, 0xbe, 0xfa, 0xdd, 0xcd, 0xa9, 0xdf, 0x4d, 0x82, 0x2c, 0x24, 0xd3, 0xba, 0xce, - 0x10, 0x5a, 0x37, 0x0b, 0x53, 0xc1, 0xde, 0xad, 0xac, 0x5c, 0x01, 0x27, 0x3c, 0x6f, 0xd0, 0x8a, - 0xaa, 0x2e, 0xd6, 0x1a, 0x1b, 0xeb, 0xcb, 0x5a, 0x71, 0x51, 0x2d, 0x80, 0xab, 0x9f, 0x54, 0x2f, - 0x7d, 0x27, 0xce, 0x2c, 0xfa, 0xbc, 0x04, 0x39, 0x72, 0xd4, 0x0e, 0xfd, 0xec, 0x88, 0x34, 0xa7, - 0xcb, 0xf9, 0xbe, 0xf8, 0xe3, 0xae, 0x78, 0x14, 0x6f, 0x26, 0x4c, 0xc2, 0xd5, 0x81, 0xa2, 0x78, - 0xc7, 0x10, 0x4a, 0x7f, 0xe2, 0xe2, 0x36, 0xc9, 0xda, 0xb6, 0x75, 0xf1, 0x47, 0xb9, 0x49, 0xba, - 0xf5, 0x3f, 0xe4, 0x26, 0xd9, 0x87, 0x85, 0xb1, 0x37, 0xc9, 0x3e, 0xed, 0x2e, 0xa6, 0x99, 0xa2, - 0x67, 0xe4, 0xfc, 0xf9, 0xdf, 0xb3, 0xa4, 0x03, 0x6d, 0x55, 0x15, 0x61, 0xd6, 0x30, 0x1d, 0x6c, - 0x9b, 0x7a, 0x7b, 0xa9, 0xad, 0x6f, 0x79, 0xf6, 0x69, 0xef, 0xfe, 0x44, 0x39, 0x94, 0x47, 0xe3, - 0xff, 0x50, 0x4e, 0x03, 0x38, 0x78, 0xa7, 0xd3, 0xd6, 0x9d, 0x40, 0xf5, 0x42, 0x29, 0x61, 0xed, - 0xcb, 0xf2, 0xda, 0x77, 0x0b, 0x5c, 0x46, 0x41, 0xab, 0x5f, 0xea, 0xe0, 0x0d, 0xd3, 0xf8, 0xb9, - 0x5d, 0x12, 0x5c, 0x92, 0xea, 0x68, 0xbf, 0x4f, 0xdc, 0x86, 0x4d, 0xbe, 0x67, 0xc3, 0xe6, 0x1f, - 0x84, 0x83, 0x56, 0x78, 0xad, 0x7e, 0x40, 0xd0, 0x0a, 0xbf, 0xa5, 0xc9, 0x3d, 0x2d, 0xcd, 0x5f, - 0x46, 0xc9, 0x0a, 0x2c, 0xa3, 0x84, 0x51, 0xc9, 0x09, 0x2e, 0x41, 0xbe, 0x5a, 0x28, 0x2a, 0x46, - 0x5c, 0x35, 0xc6, 0xb0, 0xc4, 0x2d, 0xc3, 0x1c, 0x2d, 0x7a, 0xc1, 0xb2, 0x2e, 0xec, 0xe8, 0xf6, - 0x05, 0x64, 0x1f, 0x48, 0x15, 0x63, 0x77, 0x8b, 0x22, 0xb7, 0x40, 0x3f, 0x25, 0x3c, 0x67, 0xe0, - 0xc4, 0xe5, 0xf1, 0x3c, 0x9e, 0xed, 0xa2, 0x37, 0x08, 0x4d, 0x21, 0x44, 0x18, 0x4c, 0x1f, 0xd7, - 0x3f, 0xf6, 0x71, 0xf5, 0x3a, 0xfa, 0xf0, 0x4a, 0xfb, 0x28, 0x71, 0x45, 0x5f, 0x19, 0x0e, 0x3b, - 0x8f, 0xaf, 0x21, 0xb0, 0x2b, 0x80, 0x7c, 0xc1, 0x77, 0xee, 0x71, 0x1f, 0xc3, 0x15, 0xca, 0xa6, - 0x87, 0x66, 0x04, 0xcb, 0x63, 0x41, 0xf3, 0x38, 0xcf, 0x42, 0xb5, 0x93, 0x2a, 0xa6, 0x5f, 0x12, - 0xde, 0xc1, 0xea, 0x2b, 0x20, 0xca, 0xdd, 0x78, 0x5a, 0xa5, 0xd8, 0xf6, 0x97, 0x38, 0x9b, 0xe9, - 0xa3, 0xf9, 0xbc, 0x1c, 0x4c, 0x79, 0x61, 0x45, 0xc8, 0xad, 0x37, 0x3e, 0x86, 0x27, 0x21, 0xdf, - 0xb5, 0x76, 0xed, 0x26, 0x66, 0x7b, 0x8a, 0xec, 0x6d, 0x88, 0xfd, 0xaf, 0x81, 0xe3, 0xf9, 0x3e, - 0x93, 0x21, 0x9b, 0xd8, 0x64, 0x88, 0x36, 0x48, 0xe3, 0x06, 0xf8, 0xe7, 0x0b, 0x87, 0x2a, 0xe7, - 0x30, 0xab, 0x61, 0xe7, 0x91, 0x38, 0xc6, 0x7f, 0x50, 0x68, 0x77, 0x65, 0x40, 0x4d, 0x92, 0xa9, - 0x5c, 0x75, 0x08, 0x43, 0xf5, 0x4a, 0xb8, 0xdc, 0xcb, 0xc1, 0x2c, 0x54, 0x62, 0x91, 0x6e, 0x68, - 0xab, 0x05, 0x19, 0x3d, 0x33, 0x0b, 0x05, 0xca, 0x5a, 0xd5, 0x37, 0xd6, 0xd0, 0x8b, 0x33, 0x87, - 0x6d, 0x91, 0x46, 0x4f, 0x31, 0x3f, 0x23, 0x89, 0x86, 0x43, 0xe5, 0x04, 0x1f, 0xd4, 0x2e, 0x42, - 0x93, 0x86, 0x68, 0x66, 0x31, 0xca, 0x87, 0x7e, 0x3b, 0x23, 0x12, 0x5d, 0x55, 0x8c, 0xc5, 0xf4, - 0x7b, 0xa5, 0x2f, 0x64, 0xbd, 0xe8, 0x50, 0x4b, 0xb6, 0xb5, 0xb3, 0x61, 0xb7, 0xd1, 0xff, 0x29, - 0x14, 0xbc, 0x3a, 0xc2, 0xfc, 0x97, 0xa2, 0xcd, 0x7f, 0xb2, 0x64, 0xdc, 0x0e, 0xf6, 0xaa, 0xda, - 0x43, 0x0c, 0xdf, 0xca, 0xf5, 0x30, 0xa7, 0xb7, 0x5a, 0xeb, 0xfa, 0x16, 0x2e, 0xb9, 0xf3, 0x6a, - 0xd3, 0x61, 0x91, 0x63, 0x7a, 0x52, 0x63, 0xbb, 0x22, 0xf1, 0x75, 0x50, 0x0e, 0x24, 0x26, 0x9f, - 0xb1, 0x0c, 0x6f, 0xee, 0x90, 0xd0, 0xdc, 0xd6, 0x83, 0x38, 0x56, 0xec, 0x4d, 0xd0, 0x77, 0x49, - 0x80, 0xef, 0xf4, 0x35, 0xeb, 0xf7, 0x25, 0x98, 0x70, 0xe5, 0x5d, 0x6c, 0xb5, 0xd0, 0xa3, 0xb9, - 0x70, 0x6f, 0x91, 0xde, 0x63, 0xcf, 0x11, 0x76, 0xdb, 0xf3, 0x6a, 0x48, 0xe9, 0x47, 0x60, 0x12, - 0x08, 0x51, 0xe2, 0x84, 0x28, 0xe6, 0x9d, 0x17, 0x5b, 0x44, 0xfa, 0xe2, 0xfb, 0x84, 0x04, 0xb3, - 0xde, 0x3c, 0x62, 0x09, 0x3b, 0xcd, 0x6d, 0x74, 0x9b, 0xe8, 0x42, 0x13, 0x6b, 0x69, 0xfe, 0x9e, - 0x6c, 0x1b, 0xfd, 0x20, 0x93, 0x50, 0xe5, 0xb9, 0x92, 0x23, 0x56, 0xe9, 0x12, 0xe9, 0x62, 0x1c, - 0xc1, 0xf4, 0x85, 0xf9, 0x65, 0x09, 0xa0, 0x6e, 0xf9, 0x73, 0xdd, 0x03, 0x48, 0xf2, 0x85, 0xc2, - 0xdb, 0xb5, 0xac, 0xe2, 0x41, 0xb1, 0xc9, 0x7b, 0x0e, 0x41, 0xe7, 0xa3, 0x41, 0x25, 0x8d, 0xa5, - 0xad, 0x4f, 0x2d, 0xee, 0x76, 0xda, 0x46, 0x53, 0x77, 0x7a, 0x3d, 0xe6, 0xa2, 0xc5, 0x4b, 0xae, - 0x84, 0x4c, 0x64, 0x14, 0xfa, 0x65, 0x44, 0xc8, 0x92, 0x86, 0x21, 0x91, 0xbc, 0x30, 0x24, 0x82, - 0x5e, 0x30, 0x03, 0x88, 0x8f, 0x41, 0x3d, 0x65, 0x38, 0x5a, 0xed, 0x60, 0x73, 0xc1, 0xc6, 0x7a, - 0xab, 0x69, 0xef, 0xee, 0x9c, 0xef, 0x86, 0xdd, 0x3d, 0xe3, 0x75, 0x34, 0xb4, 0x74, 0x2c, 0x71, - 0x4b, 0xc7, 0xe8, 0x97, 0x64, 0xd1, 0xa0, 0x38, 0xa1, 0x0d, 0x8e, 0x10, 0x0f, 0x43, 0x0c, 0x75, - 0x89, 0x9c, 0x94, 0x7a, 0x56, 0x89, 0xb3, 0x49, 0x56, 0x89, 0xdf, 0x28, 0x14, 0x62, 0x47, 0xa8, - 0x5e, 0x63, 0xf1, 0x35, 0x9b, 0xab, 0x61, 0x27, 0x02, 0xde, 0xeb, 0x60, 0xf6, 0x7c, 0xf0, 0xc5, - 0x87, 0x98, 0x4f, 0xec, 0xe3, 0x01, 0xfa, 0xa6, 0xa4, 0x2b, 0x30, 0x3c, 0x0b, 0x11, 0xe8, 0xfa, - 0x08, 0x4a, 0x22, 0x6e, 0x66, 0x89, 0x96, 0x53, 0x62, 0xcb, 0x4f, 0x1f, 0x85, 0x8f, 0x48, 0x30, - 0x4d, 0x2e, 0xba, 0x5c, 0xb8, 0x44, 0xce, 0x2d, 0x0a, 0x1a, 0x25, 0xcf, 0x0b, 0x8b, 0x59, 0x81, - 0x6c, 0xdb, 0x30, 0x2f, 0x78, 0xfe, 0x81, 0xee, 0x73, 0x70, 0x6d, 0x9a, 0xd4, 0xe7, 0xda, 0x34, - 0x7f, 0x9f, 0xc2, 0x2f, 0xf7, 0x40, 0xf7, 0xf8, 0x0e, 0x24, 0x97, 0xbe, 0x18, 0xff, 0x2e, 0x0b, - 0xf9, 0x1a, 0xd6, 0xed, 0xe6, 0x36, 0x7a, 0xb7, 0xd4, 0x77, 0xaa, 0x30, 0xc9, 0x4f, 0x15, 0x96, - 0x60, 0x62, 0xd3, 0x68, 0x3b, 0xd8, 0xa6, 0x3e, 0xd3, 0xe1, 0xae, 0x9d, 0x36, 0xf1, 0x85, 0xb6, - 0xd5, 0xbc, 0x30, 0xcf, 0x4c, 0xf7, 0x79, 0x2f, 0xcc, 0xe6, 0xfc, 0x12, 0xf9, 0x49, 0xf3, 0x7e, - 0x76, 0x0d, 0xc2, 0xae, 0x65, 0x3b, 0x51, 0x37, 0x28, 0x44, 0x50, 0xa9, 0x59, 0xb6, 0xa3, 0xd1, - 0x1f, 0x5d, 0x98, 0x37, 0x77, 0xdb, 0xed, 0x3a, 0x7e, 0xc0, 0xf1, 0xa6, 0x6d, 0xde, 0xbb, 0x6b, - 0x2c, 0x5a, 0x9b, 0x9b, 0x5d, 0x4c, 0x17, 0x0d, 0x72, 0x1a, 0x7b, 0x53, 0x8e, 0x43, 0xae, 0x6d, - 0xec, 0x18, 0x74, 0xa2, 0x91, 0xd3, 0xe8, 0x8b, 0x72, 0x23, 0x14, 0x82, 0x39, 0x0e, 0x65, 0xf4, - 0x54, 0x9e, 0x34, 0xcd, 0x7d, 0xe9, 0xae, 0xce, 0x5c, 0xc0, 0x97, 0xba, 0xa7, 0x26, 0xc8, 0x77, - 0xf2, 0xcc, 0x1f, 0x50, 0x11, 0xd9, 0xef, 0xa0, 0x12, 0x8f, 0x9e, 0xc1, 0xda, 0xb8, 0x69, 0xd9, - 0x2d, 0x4f, 0x36, 0xd1, 0x13, 0x0c, 0x96, 0x2f, 0xd9, 0x2e, 0x45, 0xdf, 0xc2, 0xd3, 0xd7, 0xb4, - 0x77, 0xe4, 0xdd, 0x6e, 0xd3, 0x2d, 0xfa, 0x9c, 0xe1, 0x6c, 0xaf, 0x61, 0x47, 0x47, 0x7f, 0x27, - 0xf7, 0xd5, 0xb8, 0xe9, 0xff, 0x4f, 0xe3, 0x06, 0x68, 0x1c, 0x0d, 0xa0, 0xe4, 0xec, 0xda, 0xa6, - 0x2b, 0x47, 0x16, 0xb2, 0x34, 0x94, 0xa2, 0xdc, 0x01, 0x57, 0x04, 0x6f, 0xde, 0x52, 0xe9, 0x22, - 0x9b, 0xb6, 0x4e, 0x91, 0xec, 0xd1, 0x19, 0x94, 0x75, 0xb8, 0x96, 0x7e, 0x5c, 0xa9, 0xaf, 0xad, - 0xae, 0x18, 0x5b, 0xdb, 0x6d, 0x63, 0x6b, 0xdb, 0xe9, 0x96, 0xcd, 0xae, 0x83, 0xf5, 0x56, 0x75, - 0x53, 0xa3, 0x77, 0x9f, 0x00, 0xa1, 0x23, 0x92, 0x95, 0xf7, 0xa9, 0x16, 0x1b, 0xdd, 0xc2, 0x9a, - 0x12, 0xd1, 0x52, 0x9e, 0xe4, 0xb6, 0x94, 0xee, 0x6e, 0xdb, 0xc7, 0xf4, 0xaa, 0x1e, 0x4c, 0x03, - 0x55, 0xdf, 0x6d, 0x93, 0xe6, 0x42, 0x32, 0x27, 0x1d, 0xe7, 0x62, 0x38, 0x49, 0xbf, 0xd9, 0xfc, - 0x3f, 0x79, 0xc8, 0x2d, 0xdb, 0x7a, 0x67, 0x1b, 0x3d, 0x33, 0xd4, 0x3f, 0x8f, 0xaa, 0x4d, 0xf8, - 0xda, 0x29, 0x0d, 0xd2, 0x4e, 0x79, 0x80, 0x76, 0x66, 0x43, 0xda, 0x19, 0xbd, 0xa8, 0x7c, 0x06, - 0x66, 0x9a, 0x56, 0xbb, 0x8d, 0x9b, 0xae, 0x3c, 0xca, 0x2d, 0xb2, 0x9a, 0x33, 0xa5, 0x71, 0x69, - 0x24, 0x14, 0x31, 0x76, 0x6a, 0x74, 0x0d, 0x9d, 0x2a, 0x7d, 0x90, 0x80, 0x5e, 0x2c, 0x41, 0x56, - 0x6d, 0x6d, 0x61, 0x6e, 0x9d, 0x3d, 0x13, 0x5a, 0x67, 0x3f, 0x09, 0x79, 0x47, 0xb7, 0xb7, 0xb0, - 0xe3, 0xad, 0x13, 0xd0, 0x37, 0x3f, 0x42, 0xb2, 0x1c, 0x8a, 0x90, 0xfc, 0x93, 0x90, 0x75, 0x65, - 0xc6, 0xdc, 0xc8, 0xaf, 0xed, 0x07, 0x3f, 0x91, 0xfd, 0xbc, 0x5b, 0xe2, 0xbc, 0x5b, 0x6b, 0x8d, - 0xfc, 0xd0, 0x8b, 0x75, 0x6e, 0x1f, 0xd6, 0xe4, 0x1a, 0xc7, 0xa6, 0x65, 0x96, 0x77, 0xf4, 0x2d, - 0xcc, 0xaa, 0x19, 0x24, 0x78, 0x5f, 0xd5, 0x1d, 0xeb, 0x7e, 0x83, 0x05, 0x2b, 0x0e, 0x12, 0xdc, - 0x2a, 0x6c, 0x1b, 0xad, 0x16, 0x36, 0x59, 0xcb, 0x66, 0x6f, 0x67, 0x4e, 0x43, 0xd6, 0xe5, 0xc1, - 0xd5, 0x1f, 0xd7, 0x58, 0x28, 0x1c, 0x51, 0x66, 0xdc, 0x66, 0x45, 0x1b, 0x6f, 0x21, 0xc3, 0xaf, - 0xa9, 0x8a, 0xb8, 0xed, 0xd0, 0xca, 0xf5, 0x6f, 0x5c, 0x8f, 0x83, 0x9c, 0x69, 0xb5, 0xf0, 0xc0, - 0x41, 0x88, 0xe6, 0x52, 0x9e, 0x08, 0x39, 0xdc, 0x72, 0x7b, 0x05, 0x99, 0x64, 0x3f, 0x1d, 0x2f, - 0x4b, 0x8d, 0x66, 0x4e, 0xe6, 0x1b, 0xd4, 0x8f, 0xdb, 0xf4, 0x1b, 0xe0, 0xaf, 0x4c, 0xc0, 0x51, - 0xda, 0x07, 0xd4, 0x76, 0xcf, 0xbb, 0xa4, 0xce, 0x63, 0xf4, 0x70, 0xff, 0x81, 0xeb, 0x28, 0xaf, - 0xec, 0xc7, 0x21, 0xd7, 0xdd, 0x3d, 0xef, 0x1b, 0xa1, 0xf4, 0x25, 0xdc, 0x74, 0xa5, 0x91, 0x0c, - 0x67, 0xf2, 0xb0, 0xc3, 0x19, 0x37, 0x34, 0xc9, 0x5e, 0xe3, 0x0f, 0x06, 0x32, 0x7a, 0x00, 0xc2, - 0x1b, 0xc8, 0xfa, 0x0d, 0x43, 0xa7, 0x60, 0x42, 0xdf, 0x74, 0xb0, 0x1d, 0x98, 0x89, 0xec, 0xd5, - 0x1d, 0x2a, 0xcf, 0xe3, 0x4d, 0xcb, 0x76, 0xc5, 0x32, 0x45, 0x87, 0x4a, 0xef, 0x3d, 0xd4, 0x72, - 0x81, 0xdb, 0x21, 0xbb, 0x09, 0x8e, 0x99, 0xd6, 0x22, 0xee, 0x30, 0x39, 0x53, 0x14, 0x67, 0x49, - 0x0b, 0xd8, 0xff, 0x61, 0x5f, 0x57, 0x32, 0xb7, 0xbf, 0x2b, 0x41, 0x9f, 0x4e, 0x3a, 0x67, 0xee, - 0x01, 0x7a, 0x64, 0x16, 0x9a, 0xf2, 0x14, 0x98, 0x69, 0x31, 0x17, 0xad, 0xa6, 0xe1, 0xb7, 0x92, - 0xc8, 0xff, 0xb8, 0xcc, 0x81, 0x22, 0x65, 0xc3, 0x8a, 0xb4, 0x0c, 0x93, 0xe4, 0xa8, 0xb2, 0xab, - 0x49, 0xb9, 0x1e, 0x97, 0x78, 0x32, 0xad, 0xf3, 0x2b, 0x15, 0x12, 0xdb, 0x7c, 0x89, 0xfd, 0xa2, - 0xf9, 0x3f, 0x27, 0x9b, 0x7d, 0xc7, 0x4b, 0x28, 0xfd, 0xe6, 0xf8, 0x3b, 0x79, 0xb8, 0xa2, 0x64, - 0x5b, 0xdd, 0x2e, 0x39, 0x03, 0xd3, 0xdb, 0x30, 0x5f, 0x2f, 0x71, 0x77, 0x25, 0x3c, 0xa2, 0x9b, - 0x5f, 0xbf, 0x06, 0x35, 0xbe, 0xa6, 0xf1, 0x75, 0xe1, 0x20, 0x2f, 0xfe, 0xfe, 0x43, 0x84, 0xd0, - 0x7f, 0x34, 0x1a, 0xc9, 0x3b, 0x32, 0x22, 0x71, 0x67, 0x12, 0xca, 0x2a, 0xfd, 0xe6, 0xf2, 0x25, - 0x09, 0xae, 0xec, 0xe5, 0x66, 0xc3, 0xec, 0xfa, 0x0d, 0xe6, 0xea, 0x01, 0xed, 0x85, 0x8f, 0x53, - 0x12, 0x7b, 0x4b, 0x61, 0x44, 0xdd, 0x43, 0xa5, 0x45, 0x2c, 0x96, 0x04, 0x27, 0x6a, 0xe2, 0x6e, - 0x29, 0x4c, 0x4c, 0x3e, 0x7d, 0xe1, 0x7e, 0x26, 0x0b, 0x47, 0x97, 0x6d, 0x6b, 0xb7, 0xd3, 0x0d, - 0x7a, 0xa0, 0xbf, 0xee, 0xbf, 0xe1, 0x9a, 0x17, 0x31, 0x0d, 0xae, 0x81, 0x69, 0x9b, 0x59, 0x73, - 0xc1, 0xf6, 0x6b, 0x38, 0x29, 0xdc, 0x7b, 0xc9, 0x07, 0xe9, 0xbd, 0x82, 0x7e, 0x26, 0xcb, 0xf5, - 0x33, 0xbd, 0x3d, 0x47, 0xae, 0x4f, 0xcf, 0xf1, 0x57, 0x52, 0xc2, 0x41, 0xb5, 0x47, 0x44, 0x11, - 0xfd, 0x45, 0x09, 0xf2, 0x5b, 0x24, 0x23, 0xeb, 0x2e, 0x1e, 0x2b, 0x56, 0x33, 0x42, 0x5c, 0x63, - 0xbf, 0x06, 0x72, 0x95, 0xc3, 0x3a, 0x9c, 0x68, 0x80, 0x8b, 0xe7, 0x36, 0x7d, 0xa5, 0x7a, 0x28, - 0x0b, 0x33, 0x7e, 0xe9, 0xe5, 0x56, 0x17, 0x3d, 0xaf, 0xbf, 0x46, 0xcd, 0x8a, 0x68, 0xd4, 0xbe, - 0x75, 0x66, 0x7f, 0xd4, 0x91, 0x43, 0xa3, 0x4e, 0xdf, 0xd1, 0x65, 0x26, 0x62, 0x74, 0x41, 0xcf, - 0x90, 0x45, 0x6f, 0x1b, 0xe2, 0xbb, 0x56, 0x52, 0x9b, 0x47, 0xf2, 0x60, 0x21, 0x78, 0xe7, 0xd1, - 0xe0, 0x5a, 0xa5, 0xaf, 0x24, 0xef, 0x93, 0xe0, 0xd8, 0xfe, 0xce, 0xfc, 0xc7, 0x78, 0x2f, 0x34, - 0xb7, 0x4e, 0x5d, 0xdf, 0x0b, 0x8d, 0xbc, 0xf1, 0x9b, 0x74, 0xb1, 0x41, 0x43, 0x38, 0x7b, 0x6f, - 0x70, 0x27, 0x2e, 0x16, 0x16, 0x44, 0x90, 0x68, 0xfa, 0x02, 0xfc, 0x75, 0x19, 0xa6, 0x6a, 0xd8, - 0x59, 0xd5, 0x2f, 0x59, 0xbb, 0x0e, 0xd2, 0x45, 0xb7, 0xe7, 0x9e, 0x0c, 0xf9, 0x36, 0xf9, 0x85, - 0x5d, 0xe2, 0x7e, 0x4d, 0xdf, 0xfd, 0x2d, 0xe2, 0xfb, 0x43, 0x49, 0x6b, 0x2c, 0x3f, 0x1f, 0xad, - 0x45, 0x64, 0x77, 0xd4, 0xe7, 0x6e, 0x24, 0x5b, 0x3b, 0x89, 0xf6, 0x4e, 0xa3, 0x8a, 0x4e, 0x1f, - 0x96, 0x5f, 0x92, 0x61, 0xb6, 0x86, 0x9d, 0x72, 0x77, 0x49, 0xdf, 0xb3, 0x6c, 0xc3, 0xc1, 0xe1, - 0x5b, 0x1c, 0xe3, 0xa1, 0x39, 0x0d, 0x60, 0xf8, 0xbf, 0xb1, 0x18, 0x52, 0xa1, 0x14, 0xf4, 0xdb, - 0x49, 0x1d, 0x85, 0x38, 0x3e, 0x46, 0x02, 0x42, 0x22, 0x1f, 0x8b, 0xb8, 0xe2, 0xd3, 0x07, 0xe2, - 0x8b, 0x12, 0x03, 0xa2, 0x68, 0x37, 0xb7, 0x8d, 0x3d, 0xdc, 0x4a, 0x08, 0x84, 0xf7, 0x5b, 0x00, - 0x84, 0x4f, 0x28, 0xb1, 0xfb, 0x0a, 0xc7, 0xc7, 0x28, 0xdc, 0x57, 0xe2, 0x08, 0x8e, 0x25, 0x0c, - 0x94, 0xdb, 0xf5, 0xb0, 0xf5, 0xcc, 0xbb, 0x44, 0xc5, 0x1a, 0x98, 0x6c, 0x52, 0xd8, 0x64, 0x1b, - 0xaa, 0x63, 0xa1, 0x65, 0x0f, 0xd2, 0xe9, 0x6c, 0x1a, 0x1d, 0x4b, 0xdf, 0xa2, 0xd3, 0x17, 0xfa, - 0xbb, 0x64, 0x38, 0xe1, 0xc7, 0x47, 0xa9, 0x61, 0x67, 0x51, 0xef, 0x6e, 0x9f, 0xb7, 0x74, 0xbb, - 0x15, 0xbe, 0xdc, 0x7f, 0xe8, 0x13, 0x7f, 0xe8, 0x0b, 0x61, 0x10, 0x2a, 0x3c, 0x08, 0x7d, 0x5d, - 0x45, 0xfb, 0xf2, 0x32, 0x8a, 0x4e, 0x26, 0xd6, 0x9b, 0xf5, 0x77, 0x7d, 0xb0, 0x7e, 0x8a, 0x03, - 0xeb, 0xce, 0x61, 0x59, 0x4c, 0x1f, 0xb8, 0xdf, 0xa2, 0x23, 0x42, 0xc8, 0xab, 0xf9, 0x3e, 0x51, - 0xc0, 0x22, 0xbc, 0x5a, 0xe5, 0x48, 0xaf, 0xd6, 0xa1, 0xc6, 0x88, 0x81, 0x1e, 0xc9, 0xe9, 0x8e, - 0x11, 0x87, 0xe8, 0x6d, 0xfc, 0x36, 0x19, 0x0a, 0x24, 0x40, 0x56, 0xc8, 0xe3, 0x1b, 0xdd, 0x2f, - 0x8a, 0xce, 0x3e, 0xef, 0xf2, 0x89, 0xa4, 0xde, 0xe5, 0xe8, 0xad, 0x49, 0x7d, 0xc8, 0x7b, 0xb9, - 0x1d, 0x09, 0x62, 0x89, 0x5c, 0xc4, 0x07, 0x70, 0x90, 0x3e, 0x68, 0xff, 0x4d, 0x06, 0x70, 0x1b, - 0x34, 0x3b, 0xfb, 0xf0, 0x34, 0x51, 0xb8, 0x6e, 0x0e, 0xfb, 0xd5, 0xbb, 0x40, 0x9d, 0xe8, 0x01, - 0x8a, 0x52, 0x0c, 0x4e, 0x55, 0x3c, 0x9c, 0xd4, 0xb7, 0x32, 0xe0, 0x6a, 0x24, 0xb0, 0x24, 0xf2, - 0xb6, 0x8c, 0x2c, 0x3b, 0x7d, 0x40, 0xfe, 0x87, 0x04, 0xb9, 0xba, 0x55, 0xc3, 0xce, 0xc1, 0x4d, - 0x81, 0xc4, 0xc7, 0xf6, 0x49, 0xb9, 0xa3, 0x38, 0xb6, 0xdf, 0x8f, 0x50, 0xfa, 0xa2, 0x7b, 0xa7, - 0x04, 0x33, 0x75, 0xab, 0xe4, 0x2f, 0x4e, 0x89, 0xfb, 0xaa, 0x8a, 0xdf, 0x98, 0xec, 0x57, 0x30, - 0x28, 0xe6, 0x40, 0x37, 0x26, 0x0f, 0xa6, 0x97, 0xbe, 0xdc, 0x6e, 0x83, 0xa3, 0x1b, 0x66, 0xcb, - 0xd2, 0x70, 0xcb, 0x62, 0x2b, 0xdd, 0x8a, 0x02, 0xd9, 0x5d, 0xb3, 0x65, 0x11, 0x96, 0x73, 0x1a, - 0x79, 0x76, 0xd3, 0x6c, 0xdc, 0xb2, 0x98, 0x6f, 0x00, 0x79, 0x46, 0x5f, 0x97, 0x21, 0xeb, 0xfe, - 0x2b, 0x2e, 0xea, 0xb7, 0xc9, 0x09, 0x03, 0x11, 0xb8, 0xe4, 0x47, 0x62, 0x09, 0xdd, 0x15, 0x5a, - 0xfb, 0xa7, 0x1e, 0xac, 0xd7, 0x46, 0x95, 0x17, 0x12, 0x45, 0xb0, 0xe6, 0xaf, 0x9c, 0x82, 0x89, - 0xf3, 0x6d, 0xab, 0x79, 0x21, 0x38, 0x2f, 0xcf, 0x5e, 0x95, 0x1b, 0x21, 0x67, 0xeb, 0xe6, 0x16, - 0x66, 0x7b, 0x0a, 0xc7, 0x7b, 0xfa, 0x42, 0xe2, 0xf5, 0xa2, 0xd1, 0x2c, 0xe8, 0xad, 0x49, 0x42, - 0x20, 0xf4, 0xa9, 0x7c, 0x32, 0x7d, 0x58, 0x1c, 0xe2, 0x64, 0x59, 0x01, 0x66, 0x4a, 0x45, 0x7a, - 0x37, 0xf9, 0x5a, 0xf5, 0xac, 0x5a, 0x90, 0x09, 0xcc, 0xae, 0x4c, 0x52, 0x84, 0xd9, 0x25, 0xff, - 0x23, 0x0b, 0x73, 0x9f, 0xca, 0x1f, 0x06, 0xcc, 0x9f, 0x90, 0x60, 0x76, 0xd5, 0xe8, 0x3a, 0x51, - 0xde, 0xfe, 0x31, 0xf1, 0x71, 0x9f, 0x9f, 0xd4, 0x54, 0xe6, 0xca, 0x11, 0x0e, 0x8c, 0x9b, 0xc8, - 0x1c, 0x8e, 0x2b, 0x62, 0x3c, 0xc7, 0x52, 0x08, 0x07, 0xf4, 0x3e, 0x61, 0x61, 0x49, 0x26, 0x36, - 0x94, 0x82, 0x42, 0xc6, 0x6f, 0x28, 0x45, 0x96, 0x9d, 0xbe, 0x7c, 0xbf, 0x2e, 0xc1, 0x31, 0xb7, - 0xf8, 0xb8, 0x65, 0xa9, 0x68, 0x31, 0x0f, 0x5c, 0x96, 0x4a, 0xbc, 0x32, 0xbe, 0x8f, 0x97, 0x51, - 0xac, 0x8c, 0x0f, 0x22, 0x3a, 0x66, 0x31, 0x47, 0x2c, 0xc3, 0x0e, 0x12, 0x73, 0xcc, 0x32, 0xec, - 0xf0, 0x62, 0x8e, 0x5f, 0x8a, 0x1d, 0x52, 0xcc, 0x87, 0xb6, 0xc0, 0xfa, 0x5a, 0xd9, 0x17, 0x73, - 0xe4, 0xda, 0x46, 0x8c, 0x98, 0x13, 0x9f, 0xd8, 0x45, 0x6f, 0x1f, 0x52, 0xf0, 0x23, 0x5e, 0xdf, - 0x18, 0x06, 0xa6, 0x43, 0x5c, 0xe3, 0x78, 0x89, 0x0c, 0x73, 0x8c, 0x8b, 0xfe, 0x53, 0xe6, 0x18, - 0x8c, 0x12, 0x4f, 0x99, 0x13, 0x9f, 0x01, 0xe2, 0x39, 0x1b, 0xff, 0x19, 0xa0, 0xd8, 0xf2, 0xd3, - 0x07, 0xe7, 0x1b, 0x59, 0x38, 0xe9, 0xb2, 0xb0, 0x66, 0xb5, 0x8c, 0xcd, 0x4b, 0x94, 0x8b, 0xb3, - 0x7a, 0x7b, 0x17, 0x77, 0xd1, 0x7b, 0x24, 0x51, 0x94, 0xfe, 0x13, 0x80, 0xd5, 0xc1, 0x36, 0x0d, - 0xa4, 0xc6, 0x80, 0xba, 0x23, 0xaa, 0xb2, 0xfb, 0x4b, 0xf2, 0xaf, 0x8b, 0xa9, 0x7a, 0x44, 0xb4, - 0x10, 0x3d, 0xd7, 0x2a, 0x9c, 0xf2, 0xbf, 0xf4, 0x3a, 0x78, 0x64, 0xf6, 0x3b, 0x78, 0xdc, 0x00, - 0xb2, 0xde, 0x6a, 0xf9, 0x50, 0xf5, 0x6e, 0x66, 0x93, 0x32, 0x35, 0x37, 0x8b, 0x9b, 0xb3, 0x8b, - 0x83, 0xa3, 0x79, 0x11, 0x39, 0xbb, 0xd8, 0x51, 0xe6, 0x21, 0x4f, 0xef, 0x56, 0xf6, 0x57, 0xf4, - 0xfb, 0x67, 0x66, 0xb9, 0x78, 0xd3, 0xae, 0xca, 0xab, 0xe1, 0x6d, 0x89, 0x24, 0xd3, 0xaf, 0x9f, - 0x0e, 0xec, 0x64, 0x8d, 0x53, 0xb0, 0xa7, 0x0e, 0x4d, 0x79, 0x3c, 0xbb, 0x61, 0xc5, 0x4e, 0xa7, - 0x7d, 0xa9, 0xce, 0x82, 0xaf, 0x24, 0xda, 0x0d, 0x0b, 0xc5, 0x70, 0x91, 0x7a, 0x63, 0xb8, 0x24, - 0xdf, 0x0d, 0xe3, 0xf8, 0x18, 0xc5, 0x6e, 0x58, 0x1c, 0xc1, 0xf4, 0x45, 0xfb, 0xe6, 0x1c, 0xb5, - 0x9a, 0x59, 0xf4, 0xfe, 0x3f, 0xea, 0x7f, 0x08, 0x0d, 0x78, 0x67, 0x97, 0x7e, 0x81, 0xfd, 0x63, - 0x6f, 0x2d, 0x51, 0x9e, 0x08, 0xf9, 0x4d, 0xcb, 0xde, 0xd1, 0xbd, 0x8d, 0xfb, 0xde, 0x93, 0x22, - 0x2c, 0x62, 0xfe, 0x12, 0xc9, 0xa3, 0xb1, 0xbc, 0xee, 0x7c, 0xe4, 0xe9, 0x46, 0x87, 0x45, 0x5d, - 0x74, 0x1f, 0x95, 0xeb, 0x60, 0x96, 0x05, 0x5f, 0xac, 0xe0, 0xae, 0x83, 0x5b, 0x2c, 0x62, 0x05, - 0x9f, 0xa8, 0x9c, 0x81, 0x19, 0x96, 0xb0, 0x64, 0xb4, 0x71, 0x97, 0x05, 0xad, 0xe0, 0xd2, 0x94, - 0x93, 0x90, 0x37, 0xba, 0xf7, 0x74, 0x2d, 0x93, 0xf8, 0xff, 0x4f, 0x6a, 0xec, 0x4d, 0xb9, 0x01, - 0x8e, 0xb2, 0x7c, 0xbe, 0xb1, 0x4a, 0x0f, 0xec, 0xf4, 0x26, 0xbb, 0xaa, 0x65, 0x5a, 0xeb, 0xb6, - 0xb5, 0x65, 0xe3, 0x6e, 0x97, 0x9c, 0x9a, 0x9a, 0xd4, 0x42, 0x29, 0xe8, 0xb3, 0xc3, 0x4c, 0x2c, - 0x12, 0xdf, 0x64, 0xe0, 0xa2, 0xb4, 0xdb, 0x6c, 0x62, 0xdc, 0x62, 0x27, 0x9f, 0xbc, 0xd7, 0x84, - 0x77, 0x1c, 0x24, 0x9e, 0x86, 0x1c, 0xd2, 0x25, 0x07, 0x1f, 0x3a, 0x01, 0x79, 0x7a, 0x61, 0x18, - 0x7a, 0xd1, 0x5c, 0x5f, 0x65, 0x9d, 0xe3, 0x95, 0x75, 0x03, 0x66, 0x4c, 0xcb, 0x2d, 0x6e, 0x5d, - 0xb7, 0xf5, 0x9d, 0x6e, 0xdc, 0x2a, 0x23, 0xa5, 0xeb, 0x0f, 0x29, 0x95, 0xd0, 0x6f, 0x2b, 0x47, - 0x34, 0x8e, 0x8c, 0xf2, 0xff, 0x83, 0xa3, 0xe7, 0x59, 0x84, 0x80, 0x2e, 0xa3, 0x2c, 0x45, 0xfb, - 0xe0, 0xf5, 0x50, 0x5e, 0xe0, 0xff, 0x5c, 0x39, 0xa2, 0xf5, 0x12, 0x53, 0x7e, 0x06, 0xe6, 0xdc, - 0xd7, 0x96, 0x75, 0xd1, 0x63, 0x5c, 0x8e, 0x36, 0x44, 0x7a, 0xc8, 0xaf, 0x71, 0x3f, 0xae, 0x1c, - 0xd1, 0x7a, 0x48, 0x29, 0x55, 0x80, 0x6d, 0x67, 0xa7, 0xcd, 0x08, 0x67, 0xa3, 0x55, 0xb2, 0x87, - 0xf0, 0x8a, 0xff, 0xd3, 0xca, 0x11, 0x2d, 0x44, 0x42, 0x59, 0x85, 0x29, 0xe7, 0x01, 0x87, 0xd1, - 0xcb, 0x45, 0x6f, 0x7e, 0xf7, 0xd0, 0xab, 0x7b, 0xff, 0xac, 0x1c, 0xd1, 0x02, 0x02, 0x4a, 0x19, - 0x26, 0x3b, 0xe7, 0x19, 0xb1, 0x7c, 0x9f, 0x68, 0xf3, 0xfd, 0x89, 0xad, 0x9f, 0xf7, 0x69, 0xf9, - 0xbf, 0xbb, 0x8c, 0x35, 0xbb, 0x7b, 0x8c, 0xd6, 0x84, 0x30, 0x63, 0x25, 0xef, 0x1f, 0x97, 0x31, - 0x9f, 0x80, 0x52, 0x86, 0xa9, 0xae, 0xa9, 0x77, 0xba, 0xdb, 0x96, 0xd3, 0x3d, 0x35, 0xd9, 0xe3, - 0x27, 0x19, 0x4d, 0xad, 0xc6, 0xfe, 0xd1, 0x82, 0xbf, 0x95, 0x27, 0xc2, 0x89, 0x5d, 0x72, 0xf1, - 0xba, 0xfa, 0x80, 0xd1, 0x75, 0x0c, 0x73, 0xcb, 0x8b, 0x31, 0x4b, 0x7b, 0x9b, 0xfe, 0x1f, 0x95, - 0x79, 0x76, 0x62, 0x0a, 0x48, 0xdb, 0x44, 0xbd, 0x9b, 0x75, 0xb4, 0xd8, 0xd0, 0x41, 0xa9, 0xa7, - 0x40, 0xd6, 0xfd, 0x44, 0x7a, 0xa7, 0xb9, 0xfe, 0x0b, 0x81, 0xbd, 0xba, 0x43, 0x1a, 0xb0, 0xfb, - 0x53, 0x4f, 0x07, 0x37, 0xd3, 0xdb, 0xc1, 0xb9, 0x0d, 0xdc, 0xe8, 0xae, 0x19, 0x5b, 0xd4, 0xba, - 0x62, 0xfe, 0xf0, 0xe1, 0x24, 0x3a, 0x1b, 0xad, 0xe0, 0x8b, 0xf4, 0x06, 0x8d, 0xa3, 0xde, 0x6c, - 0xd4, 0x4b, 0x41, 0xd7, 0xc3, 0x4c, 0xb8, 0x91, 0xd1, 0x5b, 0x47, 0x8d, 0xc0, 0x36, 0x63, 0x6f, - 0xe8, 0x3a, 0x98, 0xe3, 0x75, 0x3a, 0x34, 0x04, 0xc9, 0x5e, 0x57, 0x88, 0xae, 0x85, 0xa3, 0x3d, - 0x0d, 0xcb, 0x8b, 0x39, 0x92, 0x09, 0x62, 0x8e, 0x5c, 0x03, 0x10, 0x68, 0x71, 0x5f, 0x32, 0x57, - 0xc3, 0x94, 0xaf, 0x97, 0x7d, 0x33, 0x7c, 0x35, 0x03, 0x93, 0x9e, 0xb2, 0xf5, 0xcb, 0xe0, 0x8e, - 0x3f, 0x66, 0x68, 0x83, 0x81, 0x4d, 0xc3, 0xb9, 0x34, 0x77, 0x9c, 0x09, 0xdc, 0x7a, 0xeb, 0x86, - 0xd3, 0xf6, 0x8e, 0xc6, 0xf5, 0x26, 0x2b, 0xeb, 0x00, 0x06, 0xc1, 0xa8, 0x1e, 0x9c, 0x95, 0xbb, - 0x25, 0x41, 0x7b, 0xa0, 0xfa, 0x10, 0xa2, 0x71, 0xe6, 0xc7, 0xd8, 0x41, 0xb6, 0x29, 0xc8, 0xd1, - 0x40, 0xeb, 0x47, 0x94, 0x39, 0x00, 0xf5, 0x69, 0xeb, 0xaa, 0x56, 0x56, 0x2b, 0x25, 0xb5, 0x90, - 0x41, 0x2f, 0x95, 0x60, 0xca, 0x6f, 0x04, 0x7d, 0x2b, 0xa9, 0x32, 0xd5, 0x1a, 0x78, 0xb1, 0xe3, - 0xfe, 0x46, 0x15, 0x56, 0xb2, 0x27, 0xc3, 0xe5, 0xbb, 0x5d, 0xbc, 0x64, 0xd8, 0x5d, 0x47, 0xb3, - 0x2e, 0x2e, 0x59, 0xb6, 0x1f, 0x55, 0x99, 0x45, 0x38, 0x8d, 0xfa, 0xec, 0x5a, 0x1c, 0x2d, 0x4c, - 0x0e, 0x4d, 0x61, 0x9b, 0xad, 0x1c, 0x07, 0x09, 0x2e, 0x5d, 0xc7, 0xd6, 0xcd, 0x6e, 0xc7, 0xea, - 0x62, 0xcd, 0xba, 0xd8, 0x2d, 0x9a, 0xad, 0x92, 0xd5, 0xde, 0xdd, 0x31, 0xbb, 0xcc, 0x66, 0x88, - 0xfa, 0xec, 0x4a, 0x87, 0x5c, 0xdb, 0x3a, 0x07, 0x50, 0xaa, 0xae, 0xae, 0xaa, 0xa5, 0x7a, 0xb9, - 0x5a, 0x29, 0x1c, 0x71, 0xa5, 0x55, 0x2f, 0x2e, 0xac, 0xba, 0xd2, 0xf9, 0x59, 0x98, 0xf4, 0xda, - 0x34, 0x0b, 0x93, 0x92, 0xf1, 0xc2, 0xa4, 0x28, 0x45, 0x98, 0xf4, 0x5a, 0x39, 0x1b, 0x11, 0x1e, - 0xdd, 0x7b, 0x2c, 0x76, 0x47, 0xb7, 0x1d, 0xe2, 0x4f, 0xed, 0x11, 0x59, 0xd0, 0xbb, 0x58, 0xf3, - 0x7f, 0x3b, 0xf3, 0x38, 0xc6, 0x81, 0x02, 0x73, 0xc5, 0xd5, 0xd5, 0x46, 0x55, 0x6b, 0x54, 0xaa, - 0xf5, 0x95, 0x72, 0x65, 0x99, 0x8e, 0x90, 0xe5, 0xe5, 0x4a, 0x55, 0x53, 0xe9, 0x00, 0x59, 0x2b, - 0x64, 0xe8, 0xb5, 0xc1, 0x0b, 0x93, 0x90, 0xef, 0x10, 0xe9, 0xa2, 0x2f, 0xc9, 0x09, 0xcf, 0xc3, - 0xfb, 0x38, 0x45, 0x5c, 0x6c, 0xca, 0xf9, 0xa4, 0x4b, 0x7d, 0xce, 0x8c, 0x9e, 0x81, 0x19, 0x6a, - 0xeb, 0x75, 0xc9, 0xf2, 0x3e, 0x41, 0x4e, 0xd6, 0xb8, 0x34, 0xf4, 0x11, 0x29, 0xc1, 0x21, 0xf9, - 0xbe, 0x1c, 0x25, 0x33, 0x2e, 0xfe, 0x3c, 0x33, 0xdc, 0xb5, 0x04, 0xe5, 0x4a, 0x5d, 0xd5, 0x2a, - 0xc5, 0x55, 0x96, 0x45, 0x56, 0x4e, 0xc1, 0xf1, 0x4a, 0x95, 0xc5, 0xfc, 0xab, 0x35, 0xea, 0xd5, - 0x46, 0x79, 0x6d, 0xbd, 0xaa, 0xd5, 0x0b, 0x39, 0xe5, 0x24, 0x28, 0xf4, 0xb9, 0x51, 0xae, 0x35, - 0x4a, 0xc5, 0x4a, 0x49, 0x5d, 0x55, 0x17, 0x0b, 0x79, 0xe5, 0x31, 0x70, 0x2d, 0xbd, 0xe6, 0xa6, - 0xba, 0xd4, 0xd0, 0xaa, 0xe7, 0x6a, 0x2e, 0x82, 0x9a, 0xba, 0x5a, 0x74, 0x15, 0x29, 0x74, 0x7d, - 0xf0, 0x84, 0x72, 0x19, 0x1c, 0x25, 0x57, 0x83, 0xaf, 0x56, 0x8b, 0x8b, 0xac, 0xbc, 0x49, 0xe5, - 0x2a, 0x38, 0x55, 0xae, 0xd4, 0x36, 0x96, 0x96, 0xca, 0xa5, 0xb2, 0x5a, 0xa9, 0x37, 0xd6, 0x55, - 0x6d, 0xad, 0x5c, 0xab, 0xb9, 0xff, 0x16, 0xa6, 0xc8, 0xe5, 0xac, 0xb4, 0xcf, 0x44, 0xef, 0x96, - 0x61, 0xf6, 0xac, 0xde, 0x36, 0xdc, 0x81, 0x82, 0xdc, 0xda, 0xdc, 0x73, 0x9c, 0xc4, 0x21, 0xb7, - 0x3b, 0x33, 0x87, 0x74, 0xf2, 0x82, 0x7e, 0x51, 0x4e, 0x78, 0x9c, 0x84, 0x01, 0x41, 0x4b, 0x9c, - 0xe7, 0x4a, 0x8b, 0x98, 0xfc, 0xbc, 0x5a, 0x4a, 0x70, 0x9c, 0x44, 0x9c, 0x7c, 0x32, 0xf0, 0x5f, - 0x36, 0x2a, 0xf0, 0x0b, 0x30, 0xb3, 0x51, 0x29, 0x6e, 0xd4, 0x57, 0xaa, 0x5a, 0xf9, 0xa7, 0x49, - 0x34, 0xf2, 0x59, 0x98, 0x5a, 0xaa, 0x6a, 0x0b, 0xe5, 0xc5, 0x45, 0xb5, 0x52, 0xc8, 0x29, 0x97, - 0xc3, 0x65, 0x35, 0x55, 0x3b, 0x5b, 0x2e, 0xa9, 0x8d, 0x8d, 0x4a, 0xf1, 0x6c, 0xb1, 0xbc, 0x4a, - 0xfa, 0x88, 0x7c, 0xcc, 0x8d, 0xd3, 0x13, 0xe8, 0xe7, 0xb3, 0x00, 0xb4, 0xea, 0xe4, 0x32, 0x9e, - 0xd0, 0xbd, 0xc4, 0x9f, 0x4f, 0x3a, 0x69, 0x08, 0xc8, 0x44, 0xb4, 0xdf, 0x32, 0x4c, 0xda, 0xec, - 0x03, 0x5b, 0x5e, 0x19, 0x44, 0x87, 0x3e, 0x7a, 0xd4, 0x34, 0xff, 0x77, 0xf4, 0x9e, 0x24, 0x73, - 0x84, 0x48, 0xc6, 0x92, 0x21, 0xb9, 0x34, 0x1a, 0x20, 0xd1, 0xf3, 0x32, 0x30, 0xc7, 0x57, 0xcc, - 0xad, 0x04, 0x31, 0xa6, 0xc4, 0x2a, 0xc1, 0xff, 0x1c, 0x32, 0xb2, 0xce, 0x3c, 0x81, 0x0d, 0xa7, - 0xe0, 0xb5, 0x4c, 0x7a, 0x32, 0xdc, 0xb3, 0x58, 0x0a, 0x19, 0x97, 0x79, 0xd7, 0xe8, 0x28, 0x48, - 0xca, 0x04, 0xc8, 0xf5, 0x07, 0x9c, 0x82, 0x8c, 0xbe, 0x2a, 0xc3, 0x2c, 0x77, 0xf1, 0x31, 0x7a, - 0x75, 0x46, 0xe4, 0x52, 0xd2, 0xd0, 0x95, 0xca, 0x99, 0x83, 0x5e, 0xa9, 0x7c, 0xe6, 0x66, 0x98, - 0x60, 0x69, 0x44, 0xbe, 0xd5, 0x8a, 0x6b, 0x0a, 0x1c, 0x85, 0xe9, 0x65, 0xb5, 0xde, 0xa8, 0xd5, - 0x8b, 0x5a, 0x5d, 0x5d, 0x2c, 0x64, 0xdc, 0x81, 0x4f, 0x5d, 0x5b, 0xaf, 0xdf, 0x57, 0x90, 0x92, - 0x7b, 0xe8, 0xf5, 0x32, 0x32, 0x66, 0x0f, 0xbd, 0xb8, 0xe2, 0xd3, 0x9f, 0xab, 0x7e, 0x5a, 0x86, - 0x02, 0xe5, 0x40, 0x7d, 0xa0, 0x83, 0x6d, 0x03, 0x9b, 0x4d, 0x8c, 0x2e, 0x88, 0x44, 0x04, 0xdd, - 0x17, 0x2b, 0x8f, 0xf4, 0xe7, 0x21, 0x2b, 0x91, 0xbe, 0xf4, 0x18, 0xd8, 0xd9, 0x7d, 0x06, 0xf6, - 0xa7, 0x92, 0xba, 0xe8, 0xf5, 0xb2, 0x3b, 0x12, 0xc8, 0x3e, 0x9e, 0xc4, 0x45, 0x6f, 0x00, 0x07, - 0x63, 0x09, 0xf4, 0x1b, 0x31, 0xfe, 0x16, 0x64, 0xf4, 0x5c, 0x19, 0x8e, 0x2e, 0xea, 0x0e, 0x5e, - 0xb8, 0x54, 0xf7, 0x2e, 0x26, 0x8c, 0xb8, 0x4c, 0x38, 0xb3, 0xef, 0x32, 0xe1, 0xe0, 0x6e, 0x43, - 0xa9, 0xe7, 0x6e, 0x43, 0xf4, 0x8e, 0xa4, 0x87, 0xfa, 0x7a, 0x78, 0x18, 0x59, 0x34, 0xde, 0x64, - 0x87, 0xf5, 0xe2, 0xb9, 0x18, 0xc3, 0xdd, 0xfe, 0x53, 0x50, 0xa0, 0xac, 0x84, 0xbc, 0xd0, 0x7e, - 0x9d, 0xdd, 0xbf, 0xdd, 0x48, 0x10, 0xf4, 0xcf, 0x0b, 0xa3, 0x20, 0xf1, 0x61, 0x14, 0xb8, 0x45, - 0x4d, 0xb9, 0xd7, 0x73, 0x20, 0x69, 0x67, 0x18, 0x72, 0x39, 0x8b, 0x8e, 0xb3, 0x9a, 0x5e, 0x67, - 0x18, 0x5b, 0xfc, 0x78, 0xee, 0x88, 0x65, 0xf7, 0x3c, 0xaa, 0xa2, 0xc8, 0xc4, 0x5f, 0x85, 0x9d, - 0xd4, 0xff, 0x98, 0x73, 0xf9, 0x8b, 0xb9, 0x1f, 0x3a, 0x3d, 0xff, 0xe3, 0x41, 0x1c, 0xa4, 0x8f, - 0xc2, 0x0f, 0x24, 0xc8, 0xd6, 0x2c, 0xdb, 0x19, 0x15, 0x06, 0x49, 0xf7, 0x4c, 0x43, 0x12, 0xa8, - 0x45, 0xcf, 0x39, 0xd3, 0xdb, 0x33, 0x8d, 0x2f, 0x7f, 0x0c, 0x71, 0x13, 0x8f, 0xc2, 0x1c, 0xe5, - 0xc4, 0xbf, 0x54, 0xe4, 0xfb, 0x12, 0xed, 0xaf, 0xee, 0x15, 0x45, 0xe4, 0x0c, 0xcc, 0x84, 0xf6, - 0x2c, 0x3d, 0x50, 0xb8, 0x34, 0xf4, 0xfa, 0x30, 0x2e, 0x8b, 0x3c, 0x2e, 0xfd, 0x66, 0xdc, 0xfe, - 0xbd, 0x1c, 0xa3, 0xea, 0x99, 0x92, 0x84, 0x60, 0x8c, 0x29, 0x3c, 0x7d, 0x44, 0x1e, 0x94, 0x21, - 0xcf, 0x7c, 0xc6, 0x46, 0x8a, 0x40, 0xd2, 0x96, 0xe1, 0x0b, 0x41, 0xcc, 0xb7, 0x4c, 0x1e, 0x75, - 0xcb, 0x88, 0x2f, 0x3f, 0x7d, 0x1c, 0xfe, 0x9d, 0x39, 0x43, 0x16, 0xf7, 0x74, 0xa3, 0xad, 0x9f, - 0x6f, 0x27, 0x08, 0x7d, 0xfc, 0x91, 0x84, 0xc7, 0xbf, 0xfc, 0xaa, 0x72, 0xe5, 0x45, 0x48, 0xfc, - 0x27, 0x60, 0xca, 0xf6, 0x97, 0x24, 0xbd, 0xd3, 0xf1, 0x3d, 0x8e, 0xa8, 0xec, 0xbb, 0x16, 0xe4, - 0x4c, 0x74, 0xd6, 0x4b, 0x88, 0x9f, 0xb1, 0x9c, 0x4d, 0x99, 0x2e, 0xb6, 0x5a, 0x4b, 0x58, 0x77, - 0x76, 0x6d, 0xdc, 0x4a, 0x34, 0x44, 0xf0, 0x22, 0x9a, 0x0a, 0x4b, 0x82, 0x0b, 0x3e, 0xb8, 0xca, - 0xa3, 0xf3, 0xa4, 0x01, 0xbd, 0x81, 0xc7, 0xcb, 0x48, 0xba, 0xa4, 0x37, 0xfb, 0x90, 0x54, 0x39, - 0x48, 0x9e, 0x32, 0x1c, 0x13, 0x63, 0xb8, 0xd0, 0x5d, 0x86, 0x39, 0x6a, 0x27, 0x8c, 0x1a, 0x93, - 0x3f, 0x48, 0xe8, 0x63, 0x12, 0xba, 0xb6, 0x29, 0xcc, 0xce, 0x48, 0x60, 0x49, 0xe2, 0x91, 0x22, - 0xc6, 0x47, 0xfa, 0xc8, 0x7c, 0x36, 0x0f, 0x10, 0xf2, 0x1b, 0xfc, 0x48, 0x3e, 0x08, 0x04, 0x88, - 0xde, 0xca, 0xe6, 0x1f, 0x35, 0x2e, 0x2a, 0x75, 0xc8, 0x27, 0xd0, 0xdf, 0x90, 0xe2, 0x13, 0x85, - 0x46, 0x95, 0x3f, 0x4f, 0x68, 0xf3, 0x32, 0xaf, 0xbd, 0x81, 0x83, 0xfb, 0x90, 0xbd, 0xdc, 0x47, - 0x13, 0x18, 0xbf, 0x83, 0x58, 0x49, 0x86, 0xda, 0xea, 0x10, 0x33, 0xfb, 0x53, 0x70, 0x5c, 0x53, - 0x8b, 0x8b, 0xd5, 0xca, 0xea, 0x7d, 0xe1, 0x3b, 0x7c, 0x0a, 0x72, 0x78, 0x72, 0x92, 0x0a, 0x6c, - 0xaf, 0x49, 0xd8, 0x07, 0xf2, 0xb2, 0x8a, 0xbd, 0xa1, 0xfe, 0xe3, 0x09, 0x7a, 0x35, 0x01, 0xb2, - 0x87, 0x89, 0xc2, 0x83, 0x10, 0x6a, 0x46, 0xcf, 0x91, 0xa1, 0xe0, 0x8e, 0x87, 0x94, 0x4b, 0x76, - 0x59, 0x5b, 0x95, 0x77, 0x2b, 0xec, 0xd0, 0xfd, 0xa7, 0xc0, 0xad, 0xd0, 0x4b, 0x50, 0xae, 0x87, - 0xb9, 0xe6, 0x36, 0x6e, 0x5e, 0x28, 0x9b, 0xde, 0xbe, 0x3a, 0xdd, 0x84, 0xed, 0x49, 0xe5, 0x81, - 0xb9, 0x97, 0x07, 0x86, 0x9f, 0x44, 0x73, 0x83, 0x74, 0x98, 0xa9, 0x08, 0x5c, 0xfe, 0xc8, 0xc7, - 0xa5, 0xc2, 0xe1, 0x72, 0xfb, 0x50, 0x54, 0x93, 0xc1, 0x52, 0x19, 0x02, 0x16, 0x04, 0x27, 0xab, - 0xeb, 0xf5, 0x72, 0xb5, 0xd2, 0xd8, 0xa8, 0xa9, 0x8b, 0x8d, 0x05, 0x0f, 0x9c, 0x5a, 0x41, 0x46, - 0xdf, 0x94, 0x60, 0x82, 0xb2, 0xd5, 0x45, 0x8f, 0x0d, 0x20, 0x18, 0xe8, 0x4f, 0x89, 0xde, 0x22, - 0x1c, 0x1d, 0xc1, 0x17, 0x04, 0x2b, 0x27, 0xa2, 0x9f, 0x7a, 0x32, 0x4c, 0x50, 0x90, 0xbd, 0x15, - 0xad, 0xd3, 0x11, 0xbd, 0x14, 0x23, 0xa3, 0x79, 0xd9, 0x05, 0x23, 0x25, 0x0c, 0x60, 0x23, 0xfd, - 0x91, 0xe5, 0x19, 0x59, 0x6a, 0x06, 0x9f, 0x33, 0x9c, 0x6d, 0xe2, 0x6e, 0x89, 0x7e, 0x4a, 0x64, - 0x79, 0xf1, 0x26, 0xc8, 0xed, 0xb9, 0xb9, 0x07, 0xb8, 0xae, 0xd2, 0x4c, 0xe8, 0x65, 0xc2, 0x81, - 0x39, 0x39, 0xfd, 0xf4, 0x79, 0x8a, 0x00, 0x67, 0x0d, 0xb2, 0x6d, 0xa3, 0xeb, 0xb0, 0xf1, 0xe3, - 0xb6, 0x44, 0x84, 0xbc, 0x87, 0xb2, 0x83, 0x77, 0x34, 0x42, 0x06, 0xdd, 0x03, 0x33, 0xe1, 0x54, - 0x01, 0xf7, 0xdd, 0x53, 0x30, 0xc1, 0x8e, 0x95, 0xb1, 0x25, 0x56, 0xef, 0x55, 0x70, 0x59, 0x53, - 0xa8, 0xb6, 0xe9, 0xeb, 0xc0, 0xff, 0x7d, 0x14, 0x26, 0x56, 0x8c, 0xae, 0x63, 0xd9, 0x97, 0xd0, - 0xc3, 0x19, 0x98, 0x38, 0x8b, 0xed, 0xae, 0x61, 0x99, 0xfb, 0x5c, 0x0d, 0xae, 0x81, 0xe9, 0x8e, - 0x8d, 0xf7, 0x0c, 0x6b, 0xb7, 0x1b, 0x2c, 0xce, 0x84, 0x93, 0x14, 0x04, 0x93, 0xfa, 0xae, 0xb3, - 0x6d, 0xd9, 0x41, 0x34, 0x0a, 0xef, 0x5d, 0x39, 0x0d, 0x40, 0x9f, 0x2b, 0xfa, 0x0e, 0x66, 0x0e, - 0x14, 0xa1, 0x14, 0x45, 0x81, 0xac, 0x63, 0xec, 0x60, 0x16, 0x9e, 0x96, 0x3c, 0xbb, 0x02, 0x26, - 0xa1, 0xde, 0x58, 0x48, 0x3d, 0x59, 0xf3, 0x5e, 0xd1, 0x17, 0x64, 0x98, 0x5e, 0xc6, 0x0e, 0x63, - 0xb5, 0x8b, 0x9e, 0x9f, 0x11, 0xba, 0x11, 0xc2, 0x1d, 0x63, 0xdb, 0x7a, 0xd7, 0xfb, 0xcf, 0x5f, - 0x82, 0xe5, 0x13, 0x83, 0x58, 0xb9, 0x72, 0x38, 0x50, 0x36, 0x09, 0x9c, 0xe6, 0x94, 0xa9, 0x5f, - 0x26, 0xcb, 0xcc, 0x36, 0x41, 0xf6, 0x7f, 0x40, 0xef, 0x94, 0x44, 0x0f, 0x1d, 0x33, 0xd9, 0xcf, - 0x87, 0xea, 0x13, 0xd9, 0x1d, 0x4d, 0xee, 0xb1, 0x1c, 0xfb, 0x62, 0xa0, 0x87, 0x29, 0x31, 0x32, - 0x9a, 0x9f, 0x5b, 0xf0, 0xb8, 0xf2, 0x60, 0x4e, 0xd2, 0xd7, 0xc6, 0xef, 0xca, 0x30, 0x5d, 0xdb, - 0xb6, 0x2e, 0x7a, 0x72, 0xfc, 0x59, 0x31, 0x60, 0xaf, 0x82, 0xa9, 0xbd, 0x1e, 0x50, 0x83, 0x84, - 0xe8, 0x3b, 0xda, 0xd1, 0xb3, 0xe5, 0xa4, 0x30, 0x85, 0x98, 0x1b, 0xf9, 0x0d, 0xea, 0xca, 0x93, - 0x60, 0x82, 0x71, 0xcd, 0x96, 0x5c, 0xe2, 0x01, 0xf6, 0x32, 0x87, 0x2b, 0x98, 0xe5, 0x2b, 0x98, - 0x0c, 0xf9, 0xe8, 0xca, 0xa5, 0x8f, 0xfc, 0x9f, 0x48, 0x24, 0x58, 0x85, 0x07, 0x7c, 0x69, 0x04, - 0xc0, 0xa3, 0xef, 0x65, 0x44, 0x17, 0x26, 0x7d, 0x09, 0xf8, 0x1c, 0x1c, 0xe8, 0xb6, 0x97, 0x81, - 0xe4, 0xd2, 0x97, 0xe7, 0x4b, 0xb3, 0x30, 0xb3, 0x68, 0x6c, 0x6e, 0xfa, 0x9d, 0xe4, 0x0b, 0x04, - 0x3b, 0xc9, 0x68, 0x77, 0x00, 0xd7, 0xce, 0xdd, 0xb5, 0x6d, 0x6c, 0x7a, 0x95, 0x62, 0xcd, 0xa9, - 0x27, 0x55, 0xb9, 0x01, 0x8e, 0x7a, 0xe3, 0x42, 0xb8, 0xa3, 0x9c, 0xd2, 0x7a, 0x93, 0xd1, 0x77, - 0x84, 0x77, 0xb5, 0x3c, 0x89, 0x86, 0xab, 0x14, 0xd1, 0x00, 0xef, 0x80, 0xd9, 0x6d, 0x9a, 0x9b, - 0x4c, 0xfd, 0xbd, 0xce, 0xf2, 0x64, 0x4f, 0x30, 0xe0, 0x35, 0xdc, 0xed, 0xea, 0x5b, 0x58, 0xe3, - 0x33, 0xf7, 0x34, 0x5f, 0x39, 0xc9, 0xd5, 0x56, 0x62, 0x1b, 0x64, 0x02, 0x35, 0x19, 0x83, 0x76, - 0x9c, 0x81, 0xec, 0x92, 0xd1, 0xc6, 0xe8, 0x97, 0x25, 0x98, 0xd2, 0x70, 0xd3, 0x32, 0x9b, 0xee, - 0x5b, 0xc8, 0x39, 0xe8, 0x1f, 0x33, 0xa2, 0x57, 0x3a, 0xba, 0x74, 0xe6, 0x7d, 0x1a, 0x11, 0xed, - 0x46, 0xec, 0xea, 0xc6, 0x58, 0x52, 0x63, 0xb8, 0x80, 0xc3, 0x9d, 0x7a, 0x6c, 0x6e, 0xb6, 0x2d, - 0x9d, 0x5b, 0xfc, 0xea, 0x35, 0x85, 0x6e, 0x84, 0x82, 0x77, 0x06, 0xc4, 0x72, 0xd6, 0x0d, 0xd3, - 0xf4, 0x0f, 0x19, 0xef, 0x4b, 0xe7, 0xf7, 0x6d, 0x63, 0xe3, 0xb4, 0x90, 0xba, 0xb3, 0xd2, 0x23, - 0x34, 0xfb, 0x7a, 0x98, 0x3b, 0x7f, 0xc9, 0xc1, 0x5d, 0x96, 0x8b, 0x15, 0x9b, 0xd5, 0x7a, 0x52, - 0x43, 0x51, 0x96, 0xe3, 0xe2, 0xb9, 0xc4, 0x14, 0x98, 0x4c, 0xd4, 0x2b, 0x43, 0xcc, 0x00, 0x8f, - 0x43, 0xa1, 0x52, 0x5d, 0x54, 0x89, 0xaf, 0x9a, 0xe7, 0xfd, 0xb3, 0x85, 0x5e, 0x28, 0xc3, 0x0c, - 0x71, 0x26, 0xf1, 0x50, 0xb8, 0x56, 0x60, 0x3e, 0x82, 0xbe, 0x2c, 0xec, 0xc7, 0x46, 0xaa, 0x1c, - 0x2e, 0x20, 0x5a, 0xd0, 0x9b, 0x46, 0xbb, 0x57, 0xd0, 0x39, 0xad, 0x27, 0xb5, 0x0f, 0x20, 0x72, - 0x5f, 0x40, 0x7e, 0x4f, 0xc8, 0x99, 0x6d, 0x10, 0x77, 0x87, 0x85, 0xca, 0xef, 0xcb, 0x30, 0xed, - 0x4e, 0x52, 0x3c, 0x50, 0xaa, 0x1c, 0x28, 0x96, 0xd9, 0xbe, 0x14, 0x2c, 0x8b, 0x78, 0xaf, 0x89, - 0x1a, 0xc9, 0x5f, 0x0a, 0xcf, 0xdc, 0x89, 0x88, 0x42, 0xbc, 0x8c, 0x09, 0xbf, 0xf7, 0x0a, 0xcd, - 0xe7, 0x07, 0x30, 0x77, 0x58, 0xf0, 0x7d, 0x3d, 0x07, 0xf9, 0x8d, 0x0e, 0x41, 0xee, 0x65, 0xb2, - 0x48, 0xc4, 0xf2, 0x7d, 0x07, 0x19, 0x5c, 0x33, 0xab, 0x6d, 0x35, 0xf5, 0xf6, 0x7a, 0x70, 0x22, - 0x2c, 0x48, 0x50, 0x6e, 0x67, 0xbe, 0x8d, 0xf4, 0xb8, 0xdd, 0xf5, 0xb1, 0xc1, 0xbc, 0x89, 0x8c, - 0x42, 0x87, 0x46, 0x6e, 0x82, 0x63, 0x2d, 0xa3, 0xab, 0x9f, 0x6f, 0x63, 0xd5, 0x6c, 0xda, 0x97, - 0xa8, 0x38, 0xd8, 0xb4, 0x6a, 0xdf, 0x07, 0xe5, 0x4e, 0xc8, 0x75, 0x9d, 0x4b, 0x6d, 0x3a, 0x4f, - 0x0c, 0x9f, 0x31, 0x89, 0x2c, 0xaa, 0xe6, 0x66, 0xd7, 0xe8, 0x5f, 0x61, 0x17, 0xa5, 0x09, 0xc1, - 0xfb, 0x9c, 0x9f, 0x00, 0x79, 0xcb, 0x36, 0xb6, 0x0c, 0x7a, 0x3f, 0xcf, 0xdc, 0xbe, 0x98, 0x75, - 0xd4, 0x14, 0xa8, 0x92, 0x2c, 0x1a, 0xcb, 0xaa, 0x3c, 0x09, 0xa6, 0x8c, 0x1d, 0x7d, 0x0b, 0xdf, - 0x6b, 0x98, 0xf4, 0x44, 0xdf, 0xdc, 0xad, 0xa7, 0xf6, 0x1d, 0x9f, 0x61, 0xdf, 0xb5, 0x20, 0x2b, - 0x7a, 0xaf, 0x24, 0x1a, 0x58, 0x87, 0xd4, 0x8d, 0x82, 0x3a, 0x96, 0x7b, 0xad, 0xd1, 0x2b, 0x85, - 0x42, 0xde, 0x44, 0xb3, 0x95, 0xfe, 0xe0, 0xfd, 0x39, 0x09, 0x26, 0x17, 0xad, 0x8b, 0x26, 0x51, - 0xf4, 0xdb, 0xc4, 0x6c, 0xdd, 0x3e, 0x87, 0x1c, 0xf9, 0x6b, 0x23, 0x63, 0x4f, 0x34, 0x90, 0xda, - 0x7a, 0x45, 0x46, 0xc0, 0x10, 0xdb, 0x72, 0x04, 0x2f, 0xf3, 0x8b, 0x2b, 0x27, 0x7d, 0xb9, 0xfe, - 0xa9, 0x0c, 0xd9, 0x45, 0xdb, 0xea, 0xa0, 0x37, 0x67, 0x12, 0xb8, 0x2c, 0xb4, 0x6c, 0xab, 0x53, - 0x27, 0xb7, 0x71, 0x05, 0xc7, 0x38, 0xc2, 0x69, 0xca, 0x6d, 0x30, 0xd9, 0xb1, 0xba, 0x86, 0xe3, - 0x4d, 0x23, 0xe6, 0x6e, 0x7d, 0x54, 0xdf, 0xd6, 0xbc, 0xce, 0x32, 0x69, 0x7e, 0x76, 0xb7, 0xd7, - 0x26, 0x22, 0x74, 0xe5, 0xe2, 0x8a, 0xd1, 0xbb, 0x91, 0xac, 0x27, 0x15, 0xbd, 0x28, 0x8c, 0xe4, - 0x53, 0x78, 0x24, 0x1f, 0xdd, 0x47, 0xc2, 0xb6, 0xd5, 0x19, 0xc9, 0x26, 0xe3, 0xcb, 0x7d, 0x54, - 0x9f, 0xca, 0xa1, 0x7a, 0xa3, 0x50, 0x99, 0xe9, 0x23, 0xfa, 0xde, 0x2c, 0x00, 0x31, 0x33, 0x36, - 0xdc, 0x09, 0x90, 0x98, 0x8d, 0xf5, 0x4b, 0xd9, 0x90, 0x2c, 0x8b, 0xbc, 0x2c, 0x1f, 0x1b, 0x61, - 0xc5, 0x10, 0xf2, 0x11, 0x12, 0x2d, 0x42, 0x6e, 0xd7, 0xfd, 0xcc, 0x24, 0x2a, 0x48, 0x82, 0xbc, - 0x6a, 0xf4, 0x4f, 0xf4, 0x27, 0x19, 0xc8, 0x91, 0x04, 0xe5, 0x34, 0x00, 0x19, 0xd8, 0xe9, 0x81, - 0xa0, 0x0c, 0x19, 0xc2, 0x43, 0x29, 0x44, 0x5b, 0x8d, 0x16, 0xfb, 0x4c, 0x4d, 0xe6, 0x20, 0xc1, - 0xfd, 0x9b, 0x0c, 0xf7, 0x84, 0x16, 0x33, 0x00, 0x42, 0x29, 0xee, 0xdf, 0xe4, 0x6d, 0x15, 0x6f, - 0xd2, 0x40, 0xc9, 0x59, 0x2d, 0x48, 0xf0, 0xff, 0x5e, 0xf5, 0xaf, 0xd7, 0xf2, 0xfe, 0x26, 0x29, - 0xee, 0x64, 0x98, 0xa8, 0xe5, 0x42, 0x50, 0x44, 0x9e, 0x64, 0xea, 0x4d, 0x46, 0xaf, 0xf1, 0xd5, - 0x66, 0x91, 0x53, 0x9b, 0x5b, 0x12, 0x88, 0x37, 0x7d, 0xe5, 0xf9, 0x6a, 0x0e, 0xa6, 0x2a, 0x56, - 0x8b, 0xe9, 0x4e, 0x68, 0xc2, 0xf8, 0xf1, 0x5c, 0xa2, 0x09, 0xa3, 0x4f, 0x23, 0x42, 0x41, 0xee, - 0xe6, 0x15, 0x44, 0x8c, 0x42, 0x58, 0x3f, 0x94, 0x05, 0xc8, 0x13, 0xed, 0xdd, 0x7f, 0x6f, 0x53, - 0x1c, 0x09, 0x22, 0x5a, 0x8d, 0xfd, 0xf9, 0x1f, 0x4e, 0xc7, 0xfe, 0x2b, 0xe4, 0x48, 0x05, 0x63, - 0x76, 0x77, 0xf8, 0x8a, 0x4a, 0xf1, 0x15, 0x95, 0xe3, 0x2b, 0x9a, 0xed, 0xad, 0x68, 0x92, 0x75, - 0x80, 0x28, 0x0d, 0x49, 0x5f, 0xc7, 0xff, 0x61, 0x02, 0xa0, 0xa2, 0xef, 0x19, 0x5b, 0x74, 0x77, - 0xf8, 0x0b, 0xde, 0xfc, 0x87, 0xed, 0xe3, 0xfe, 0xb7, 0xd0, 0x40, 0x78, 0x1b, 0x4c, 0xb0, 0x71, - 0x8f, 0x55, 0xe4, 0x6a, 0xae, 0x22, 0x01, 0x15, 0x6a, 0x96, 0x3e, 0xe0, 0x68, 0x5e, 0x7e, 0xee, - 0x8a, 0x59, 0xa9, 0xe7, 0x8a, 0xd9, 0xfe, 0x7b, 0x10, 0x11, 0x17, 0xcf, 0xa2, 0x77, 0x09, 0x7b, - 0xf4, 0x87, 0xf8, 0x09, 0xd5, 0x28, 0xa2, 0x09, 0x3e, 0x01, 0x26, 0x2c, 0x7f, 0x43, 0x5b, 0x8e, - 0x5c, 0x07, 0x2b, 0x9b, 0x9b, 0x96, 0xe6, 0xe5, 0x14, 0xdc, 0xfc, 0x12, 0xe2, 0x63, 0x2c, 0x87, - 0x66, 0x4e, 0x2e, 0x7b, 0x41, 0xa7, 0xdc, 0x7a, 0x9c, 0x33, 0x9c, 0xed, 0x55, 0xc3, 0xbc, 0xd0, - 0x45, 0xff, 0x59, 0xcc, 0x82, 0x0c, 0xe1, 0x2f, 0x25, 0xc3, 0x9f, 0x8f, 0xd9, 0x51, 0xe3, 0x51, - 0xbb, 0x33, 0x8a, 0x4a, 0x7f, 0x6e, 0x23, 0x00, 0xbc, 0x1d, 0xf2, 0x94, 0x51, 0xd6, 0x89, 0x9e, - 0x89, 0xc4, 0xcf, 0xa7, 0xa4, 0xb1, 0x3f, 0xd0, 0x3b, 0x7d, 0x1c, 0xcf, 0x72, 0x38, 0x2e, 0x1c, - 0x88, 0xb3, 0xd4, 0x21, 0x3d, 0xf3, 0x78, 0x98, 0x60, 0x92, 0x56, 0xe6, 0xc2, 0xad, 0xb8, 0x70, - 0x44, 0x01, 0xc8, 0xaf, 0x59, 0x7b, 0xb8, 0x6e, 0x15, 0x32, 0xee, 0xb3, 0xcb, 0x5f, 0xdd, 0x2a, - 0x48, 0xe8, 0x15, 0x93, 0x30, 0xe9, 0x47, 0xfb, 0xf9, 0x9c, 0x04, 0x85, 0x92, 0x8d, 0x75, 0x07, - 0x2f, 0xd9, 0xd6, 0x0e, 0xad, 0x91, 0xb8, 0x77, 0xe8, 0x6f, 0x0a, 0xbb, 0x78, 0xf8, 0x51, 0x78, - 0x7a, 0x0b, 0x8b, 0xc0, 0x92, 0x2e, 0x42, 0x4a, 0xde, 0x22, 0x24, 0x7a, 0x93, 0x90, 0xcb, 0x87, - 0x68, 0x29, 0xe9, 0x37, 0xb5, 0x4f, 0x49, 0x90, 0x2b, 0xb5, 0x2d, 0x13, 0x87, 0x8f, 0x30, 0x0d, - 0x3c, 0x2b, 0xd3, 0x7f, 0x27, 0x02, 0x3d, 0x43, 0x12, 0xb5, 0x35, 0x02, 0x01, 0xb8, 0x65, 0x0b, - 0xca, 0x56, 0x6c, 0x90, 0x8a, 0x25, 0x9d, 0xbe, 0x40, 0xbf, 0x29, 0xc1, 0x14, 0x8d, 0x8b, 0x53, - 0x6c, 0xb7, 0xd1, 0xa3, 0x02, 0xa1, 0xf6, 0x89, 0x98, 0x84, 0x7e, 0x4f, 0xd8, 0x45, 0xdf, 0xaf, - 0x95, 0x4f, 0x3b, 0x41, 0x80, 0xa0, 0x64, 0x1e, 0xe3, 0x62, 0x7b, 0x69, 0x03, 0x19, 0x4a, 0x5f, - 0xd4, 0x9f, 0x97, 0x5c, 0x03, 0xc0, 0xbc, 0xb0, 0x6e, 0xe3, 0x3d, 0x03, 0x5f, 0x44, 0x57, 0x06, - 0xc2, 0xde, 0x1f, 0xf4, 0xe3, 0x0d, 0xc2, 0x8b, 0x38, 0x21, 0x92, 0x91, 0x5b, 0x59, 0xd3, 0xed, - 0x20, 0x13, 0xeb, 0xc5, 0x7b, 0x23, 0xb1, 0x84, 0xc8, 0x68, 0xe1, 0xec, 0x82, 0x6b, 0x36, 0xd1, - 0x5c, 0xa4, 0x2f, 0xd8, 0x0f, 0x4c, 0xc0, 0xe4, 0x86, 0xd9, 0xed, 0xb4, 0xf5, 0xee, 0x36, 0xfa, - 0xbe, 0x0c, 0x79, 0x7a, 0x5b, 0x18, 0xfa, 0x09, 0x2e, 0xb6, 0xc0, 0xcf, 0xed, 0x62, 0xdb, 0x73, - 0xc1, 0xa1, 0x2f, 0xfd, 0x2f, 0x33, 0x47, 0xef, 0x95, 0x45, 0x27, 0xa9, 0x5e, 0xa1, 0xa1, 0x6b, - 0xe3, 0xfb, 0x1f, 0x67, 0xef, 0x18, 0x4d, 0x67, 0xd7, 0xf6, 0xaf, 0xc6, 0x7e, 0x9c, 0x18, 0x95, - 0x75, 0xfa, 0x97, 0xe6, 0xff, 0x8e, 0x74, 0x98, 0x60, 0x89, 0xfb, 0xb6, 0x93, 0xf6, 0x9f, 0xbf, - 0x3d, 0x09, 0x79, 0xdd, 0x76, 0x8c, 0xae, 0xc3, 0x36, 0x58, 0xd9, 0x9b, 0xdb, 0x5d, 0xd2, 0xa7, - 0x0d, 0xbb, 0xed, 0x45, 0x21, 0xf1, 0x13, 0xd0, 0xef, 0x0b, 0xcd, 0x1f, 0xe3, 0x6b, 0x9e, 0x0c, - 0xf2, 0x7b, 0x87, 0x58, 0xa3, 0xbe, 0x1c, 0x2e, 0xd3, 0x8a, 0x75, 0xb5, 0x41, 0x83, 0x56, 0xf8, - 0xf1, 0x29, 0x5a, 0xe8, 0x1d, 0x72, 0x68, 0xfd, 0xee, 0x12, 0x37, 0x46, 0x30, 0x29, 0x06, 0x63, - 0x84, 0x9f, 0x10, 0xb3, 0x5b, 0xcd, 0x2d, 0xc2, 0xca, 0xe2, 0x8b, 0xb0, 0xbf, 0x23, 0xbc, 0x9b, - 0xe4, 0x8b, 0x72, 0xc0, 0x1a, 0x60, 0xdc, 0x6d, 0x42, 0xef, 0x13, 0xda, 0x19, 0x1a, 0x54, 0xd2, - 0x21, 0xc2, 0xf6, 0xfa, 0x09, 0x98, 0x58, 0xd6, 0xdb, 0x6d, 0x6c, 0x5f, 0x72, 0x87, 0xa4, 0x82, - 0xc7, 0xe1, 0x9a, 0x6e, 0x1a, 0x9b, 0xb8, 0xeb, 0xc4, 0x77, 0x96, 0xef, 0x12, 0x8e, 0x54, 0xcb, - 0xca, 0x98, 0xef, 0xa5, 0x1f, 0x21, 0xf3, 0x9b, 0x21, 0x6b, 0x98, 0x9b, 0x16, 0xeb, 0x32, 0x7b, + // 19593 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0xbd, 0x7f, 0x9c, 0x2c, 0x47, + 0x59, 0x2f, 0x7c, 0xa6, 0x7b, 0x66, 0x76, 0xf7, 0xd9, 0x1f, 0x67, 0x4e, 0xe7, 0x9c, 0x93, 0x93, + 0x4a, 0x38, 0x89, 0x27, 0x21, 0xc4, 0x10, 0x36, 0x21, 0x20, 0x92, 0x90, 0x90, 0xcc, 0xce, 0xce, + 0xee, 0x4e, 0xb2, 0x3b, 0xb3, 0xf6, 0xcc, 0x9e, 0x43, 0xf4, 0xfa, 0xce, 0xed, 0x33, 0x53, 0xbb, + 0xdb, 0x39, 0xb3, 0xdd, 0x63, 0x77, 0xef, 0x9e, 0x1c, 0xde, 0xcf, 0x7d, 0xaf, 0x88, 0x11, 0x14, + 0x73, 0x11, 0x11, 0x95, 0xdf, 0x10, 0x08, 0x08, 0x0a, 0xc8, 0xef, 0x0b, 0x2a, 0x20, 0x3f, 0x04, + 0x11, 0x11, 0x41, 0x04, 0x51, 0x5e, 0x41, 0x10, 0xf1, 0x7e, 0xe4, 0xf2, 0xea, 0x7b, 0x05, 0x51, + 0x78, 0x7d, 0x3f, 0x5d, 0x55, 0xfd, 0xa3, 0x66, 0xa7, 0x7b, 0xaa, 0x67, 0xa7, 0x67, 0x83, 0xdc, + 0xff, 0xba, 0xab, 0xab, 0x9f, 0x7a, 0xea, 0xf9, 0x3e, 0x55, 0xf5, 0x54, 0xd5, 0x53, 0x4f, 0xc1, + 0xa9, 0xee, 0xf9, 0x9b, 0xbb, 0x96, 0xe9, 0x98, 0xf6, 0xcd, 0x2d, 0x73, 0x67, 0x47, 0x33, 0xda, + 0xf6, 0x3c, 0x79, 0x57, 0x26, 0x34, 0xe3, 0x92, 0x73, 0xa9, 0x8b, 0xd1, 0x75, 0xdd, 0x0b, 0x5b, + 0x37, 0x77, 0xf4, 0xf3, 0x37, 0x77, 0xcf, 0xdf, 0xbc, 0x63, 0xb6, 0x71, 0xc7, 0xfb, 0x81, 0xbc, + 0xb0, 0xec, 0xe8, 0x86, 0xa8, 0x5c, 0x1d, 0xb3, 0xa5, 0x75, 0x6c, 0xc7, 0xb4, 0x30, 0xcb, 0x79, + 0x32, 0x28, 0x12, 0xef, 0x61, 0xc3, 0xf1, 0x28, 0x5c, 0xb5, 0x65, 0x9a, 0x5b, 0x1d, 0x4c, 0xbf, + 0x9d, 0xdf, 0xdd, 0xbc, 0xd9, 0x76, 0xac, 0xdd, 0x96, 0xc3, 0xbe, 0x5e, 0xd3, 0xfb, 0xb5, 0x8d, + 0xed, 0x96, 0xa5, 0x77, 0x1d, 0xd3, 0xa2, 0x39, 0xce, 0xfc, 0xc6, 0x43, 0x93, 0x20, 0xab, 0xdd, + 0x16, 0xfa, 0xd6, 0x04, 0xc8, 0xc5, 0x6e, 0x17, 0x7d, 0x44, 0x02, 0x58, 0xc6, 0xce, 0x59, 0x6c, + 0xd9, 0xba, 0x69, 0xa0, 0xa3, 0x30, 0xa1, 0xe2, 0x9f, 0xda, 0xc5, 0xb6, 0x73, 0x7b, 0xf6, 0xb9, + 0x5f, 0x93, 0x33, 0xe8, 0x11, 0x09, 0x26, 0x55, 0x6c, 0x77, 0x4d, 0xc3, 0xc6, 0xca, 0xdd, 0x90, + 0xc3, 0x96, 0x65, 0x5a, 0xa7, 0x32, 0xd7, 0x64, 0x6e, 0x98, 0xbe, 0xf5, 0xc6, 0x79, 0x56, 0xfd, + 0x79, 0xb5, 0xdb, 0x9a, 0x2f, 0x76, 0xbb, 0xf3, 0x01, 0xa5, 0x79, 0xef, 0xa7, 0xf9, 0xb2, 0xfb, + 0x87, 0x4a, 0x7f, 0x54, 0x4e, 0xc1, 0xc4, 0x1e, 0xcd, 0x70, 0x4a, 0xba, 0x26, 0x73, 0xc3, 0x94, + 0xea, 0xbd, 0xba, 0x5f, 0xda, 0xd8, 0xd1, 0xf4, 0x8e, 0x7d, 0x4a, 0xa6, 0x5f, 0xd8, 0x2b, 0x7a, + 0x38, 0x03, 0x39, 0x42, 0x44, 0x29, 0x41, 0xb6, 0x65, 0xb6, 0x31, 0x29, 0x7e, 0xee, 0xd6, 0x9b, + 0xc5, 0x8b, 0x9f, 0x2f, 0x99, 0x6d, 0xac, 0x92, 0x9f, 0x95, 0x6b, 0x60, 0xda, 0x13, 0x4b, 0xc0, + 0x46, 0x38, 0xe9, 0xcc, 0xad, 0x90, 0x75, 0xf3, 0x2b, 0x93, 0x90, 0xad, 0x6e, 0xac, 0xae, 0x16, + 0x8e, 0x28, 0xc7, 0x60, 0x76, 0xa3, 0x7a, 0x6f, 0xb5, 0x76, 0xae, 0xda, 0x2c, 0xab, 0x6a, 0x4d, + 0x2d, 0x64, 0x94, 0x59, 0x98, 0x5a, 0x28, 0x2e, 0x36, 0x2b, 0xd5, 0xf5, 0x8d, 0x46, 0x41, 0x42, + 0xaf, 0x90, 0x61, 0xae, 0x8e, 0x9d, 0x45, 0xbc, 0xa7, 0xb7, 0x70, 0xdd, 0xd1, 0x1c, 0x8c, 0x9e, + 0x9f, 0xf1, 0x85, 0xa9, 0x6c, 0xb8, 0x85, 0xfa, 0x9f, 0x58, 0x05, 0x9e, 0xb4, 0xaf, 0x02, 0x3c, + 0x85, 0x79, 0xf6, 0xf7, 0x7c, 0x28, 0x4d, 0x0d, 0xd3, 0x39, 0xf3, 0x04, 0x98, 0x0e, 0x7d, 0x53, + 0xe6, 0x00, 0x16, 0x8a, 0xa5, 0x7b, 0x97, 0xd5, 0xda, 0x46, 0x75, 0xb1, 0x70, 0xc4, 0x7d, 0x5f, + 0xaa, 0xa9, 0x65, 0xf6, 0x9e, 0x41, 0xdf, 0xc9, 0x84, 0xc0, 0x5c, 0xe4, 0xc1, 0x9c, 0x1f, 0xcc, + 0x4c, 0x1f, 0x40, 0xd1, 0xeb, 0x7c, 0x70, 0x96, 0x39, 0x70, 0x9e, 0x94, 0x8c, 0x5c, 0xfa, 0x00, + 0x3d, 0x28, 0xc1, 0x64, 0x7d, 0x7b, 0xd7, 0x69, 0x9b, 0x17, 0x0d, 0x34, 0xe5, 0x23, 0x83, 0xbe, + 0x11, 0x96, 0xc9, 0xd3, 0x79, 0x99, 0xdc, 0xb0, 0xbf, 0x12, 0x8c, 0x42, 0x84, 0x34, 0x5e, 0xe5, + 0x4b, 0xa3, 0xc8, 0x49, 0xe3, 0x09, 0xa2, 0x84, 0xd2, 0x97, 0xc3, 0x4b, 0x9e, 0x0a, 0xb9, 0x7a, + 0x57, 0x6b, 0x61, 0xf4, 0x09, 0x19, 0x66, 0x56, 0xb1, 0xb6, 0x87, 0x8b, 0xdd, 0xae, 0x65, 0xee, + 0x61, 0x54, 0x0a, 0xf4, 0xf5, 0x14, 0x4c, 0xd8, 0x6e, 0xa6, 0x4a, 0x9b, 0xd4, 0x60, 0x4a, 0xf5, + 0x5e, 0x95, 0xd3, 0x00, 0x7a, 0x1b, 0x1b, 0x8e, 0xee, 0xe8, 0xd8, 0x3e, 0x25, 0x5d, 0x23, 0xdf, + 0x30, 0xa5, 0x86, 0x52, 0xd0, 0xb7, 0x24, 0x51, 0x1d, 0x23, 0x5c, 0xcc, 0x87, 0x39, 0x88, 0x90, + 0xea, 0x6b, 0x24, 0x11, 0x1d, 0x1b, 0x48, 0x2e, 0x99, 0x6c, 0xdf, 0x9c, 0x49, 0x2e, 0x5c, 0x37, + 0x47, 0xb5, 0xd6, 0xac, 0x6f, 0x94, 0x56, 0x9a, 0xf5, 0xf5, 0x62, 0xa9, 0x5c, 0xc0, 0xca, 0x71, + 0x28, 0x90, 0xc7, 0x66, 0xa5, 0xde, 0x5c, 0x2c, 0xaf, 0x96, 0x1b, 0xe5, 0xc5, 0xc2, 0xa6, 0xa2, + 0xc0, 0x9c, 0x5a, 0xfe, 0xb1, 0x8d, 0x72, 0xbd, 0xd1, 0x5c, 0x2a, 0x56, 0x56, 0xcb, 0x8b, 0x85, + 0x2d, 0xf7, 0xe7, 0xd5, 0xca, 0x5a, 0xa5, 0xd1, 0x54, 0xcb, 0xc5, 0xd2, 0x4a, 0x79, 0xb1, 0xb0, + 0xad, 0x5c, 0x0e, 0x97, 0x55, 0x6b, 0xcd, 0xe2, 0xfa, 0xba, 0x5a, 0x3b, 0x5b, 0x6e, 0xb2, 0x3f, + 0xea, 0x05, 0x9d, 0x16, 0xd4, 0x68, 0xd6, 0x57, 0x8a, 0x6a, 0xb9, 0xb8, 0xb0, 0x5a, 0x2e, 0xdc, + 0x8f, 0x9e, 0x2d, 0xc3, 0xec, 0x9a, 0x76, 0x01, 0xd7, 0xb7, 0x35, 0x0b, 0x6b, 0xe7, 0x3b, 0x18, + 0x5d, 0x2b, 0x80, 0x27, 0xfa, 0x44, 0x18, 0xaf, 0x32, 0x8f, 0xd7, 0xcd, 0x7d, 0x04, 0xcc, 0x15, + 0x11, 0x01, 0xd8, 0xbf, 0xf8, 0xcd, 0x60, 0x85, 0x03, 0xec, 0xc9, 0x09, 0xe9, 0x25, 0x43, 0xec, + 0x67, 0x1e, 0x05, 0x88, 0xa1, 0x2f, 0xca, 0x30, 0x57, 0x31, 0xf6, 0x74, 0x07, 0x2f, 0x63, 0x03, + 0x5b, 0xee, 0x38, 0x20, 0x04, 0xc3, 0x23, 0x72, 0x08, 0x86, 0x25, 0x1e, 0x86, 0x5b, 0xfa, 0x88, + 0x8d, 0x2f, 0x23, 0x62, 0xb4, 0xbd, 0x0a, 0xa6, 0x74, 0x92, 0xaf, 0xa4, 0xb7, 0x99, 0xc4, 0x82, + 0x04, 0xe5, 0x3a, 0x98, 0xa5, 0x2f, 0x4b, 0x7a, 0x07, 0xdf, 0x8b, 0x2f, 0xb1, 0x71, 0x97, 0x4f, + 0x44, 0xbf, 0xe8, 0x37, 0xbe, 0x0a, 0x87, 0xe5, 0x8f, 0x24, 0x65, 0x2a, 0x19, 0x98, 0x2f, 0x7a, + 0x34, 0x34, 0xbf, 0x7d, 0xad, 0x4c, 0x47, 0xdf, 0x93, 0x60, 0xba, 0xee, 0x98, 0x5d, 0x57, 0x65, + 0x75, 0x63, 0x4b, 0x0c, 0xdc, 0x8f, 0x85, 0xdb, 0x58, 0x89, 0x07, 0xf7, 0x09, 0x7d, 0xe4, 0x18, + 0x2a, 0x20, 0xa2, 0x85, 0x7d, 0xcb, 0x6f, 0x61, 0x4b, 0x1c, 0x2a, 0xb7, 0x26, 0xa2, 0xf6, 0x7d, + 0xd8, 0xbe, 0x5e, 0x24, 0x43, 0xc1, 0x53, 0x33, 0xa7, 0xb4, 0x6b, 0x59, 0xd8, 0x70, 0xc4, 0x40, + 0xf8, 0xcb, 0x30, 0x08, 0x2b, 0x3c, 0x08, 0xb7, 0xc6, 0x28, 0xb3, 0x57, 0x4a, 0x8a, 0x6d, 0xec, + 0x03, 0x3e, 0x9a, 0xf7, 0x72, 0x68, 0xfe, 0x68, 0x72, 0xb6, 0x92, 0x41, 0xba, 0x32, 0x04, 0xa2, + 0xc7, 0xa1, 0xe0, 0x8e, 0x49, 0xa5, 0x46, 0xe5, 0x6c, 0xb9, 0x59, 0xa9, 0x9e, 0xad, 0x34, 0xca, + 0x05, 0x8c, 0x5e, 0x28, 0xc3, 0x0c, 0x65, 0x4d, 0xc5, 0x7b, 0xe6, 0x05, 0xc1, 0x5e, 0xef, 0x8b, + 0x09, 0x8d, 0x85, 0x70, 0x09, 0x11, 0x2d, 0xe3, 0x17, 0x12, 0x18, 0x0b, 0x31, 0xe4, 0x1e, 0x4d, + 0xbd, 0xd5, 0xbe, 0x66, 0xb0, 0xd5, 0xa7, 0xb5, 0xf4, 0xed, 0xad, 0x5e, 0x94, 0x05, 0xa0, 0x95, + 0x3c, 0xab, 0xe3, 0x8b, 0x68, 0x2d, 0xc0, 0x84, 0x53, 0xdb, 0xcc, 0x40, 0xb5, 0x95, 0xfa, 0xa9, + 0xed, 0xbb, 0xc3, 0x63, 0xd6, 0x02, 0x8f, 0xde, 0x4d, 0x91, 0xe2, 0x76, 0x39, 0x89, 0x9e, 0x1d, + 0x7a, 0x8a, 0x22, 0xf1, 0x56, 0xe7, 0x55, 0x30, 0x45, 0x1e, 0xab, 0xda, 0x0e, 0x66, 0x6d, 0x28, + 0x48, 0x50, 0xce, 0xc0, 0x0c, 0xcd, 0xd8, 0x32, 0x0d, 0xb7, 0x3e, 0x59, 0x92, 0x81, 0x4b, 0x73, + 0x41, 0x6c, 0x59, 0x58, 0x73, 0x4c, 0x8b, 0xd0, 0xc8, 0x51, 0x10, 0x43, 0x49, 0xe8, 0xeb, 0x7e, + 0x2b, 0x2c, 0x73, 0x9a, 0xf3, 0xc4, 0x24, 0x55, 0x49, 0xa6, 0x37, 0x7b, 0xc3, 0xb5, 0x3f, 0xda, + 0xea, 0x9a, 0x2e, 0xda, 0x4b, 0x64, 0x6a, 0x87, 0x95, 0x93, 0xa0, 0xb0, 0x54, 0x37, 0x6f, 0xa9, + 0x56, 0x6d, 0x94, 0xab, 0x8d, 0xc2, 0x66, 0x5f, 0x8d, 0xda, 0x42, 0xaf, 0xc9, 0x42, 0xf6, 0x1e, + 0x53, 0x37, 0xd0, 0x83, 0x19, 0x4e, 0x25, 0x0c, 0xec, 0x5c, 0x34, 0xad, 0x0b, 0x7e, 0x43, 0x0d, + 0x12, 0xe2, 0xb1, 0x09, 0x54, 0x49, 0x1e, 0xa8, 0x4a, 0xd9, 0x7e, 0xaa, 0xf4, 0xcb, 0x61, 0x55, + 0xba, 0x83, 0x57, 0xa5, 0xeb, 0xfb, 0xc8, 0xdf, 0x65, 0x3e, 0xa2, 0x03, 0xf8, 0xa8, 0xdf, 0x01, + 0xdc, 0xc5, 0xc1, 0xf8, 0x78, 0x31, 0x32, 0xc9, 0x00, 0xfc, 0x42, 0xaa, 0x0d, 0xbf, 0x1f, 0xd4, + 0x5b, 0x11, 0x50, 0x6f, 0xf7, 0xe9, 0x13, 0xf4, 0xfd, 0x5d, 0xc7, 0xfd, 0xfb, 0xbb, 0x89, 0x0b, + 0xca, 0x09, 0x38, 0xb6, 0x58, 0x59, 0x5a, 0x2a, 0xab, 0xe5, 0x6a, 0xa3, 0x59, 0x2d, 0x37, 0xce, + 0xd5, 0xd4, 0x7b, 0x0b, 0x1d, 0xf4, 0xb0, 0x0c, 0xe0, 0x4a, 0xa8, 0xa4, 0x19, 0x2d, 0xdc, 0x11, + 0xeb, 0xd1, 0xff, 0xa7, 0x94, 0xac, 0x4f, 0x08, 0xe8, 0x47, 0xc0, 0xf9, 0x72, 0x49, 0xbc, 0x55, + 0x46, 0x12, 0x4b, 0x06, 0xea, 0x1b, 0x1f, 0x0d, 0xb6, 0xe7, 0x65, 0x70, 0xd4, 0xa3, 0xc7, 0xb2, + 0xf7, 0x9f, 0xf6, 0xbd, 0x25, 0x0b, 0x73, 0x0c, 0x16, 0x6f, 0x1e, 0xff, 0xdc, 0x8c, 0xc8, 0x44, + 0x1e, 0xc1, 0x24, 0x9b, 0xb6, 0x7b, 0xdd, 0xbb, 0xff, 0xae, 0x2c, 0xc3, 0x74, 0x17, 0x5b, 0x3b, + 0xba, 0x6d, 0xeb, 0xa6, 0x41, 0x17, 0xe4, 0xe6, 0x6e, 0x7d, 0xac, 0x2f, 0x71, 0xb2, 0x76, 0x39, + 0xbf, 0xae, 0x59, 0x8e, 0xde, 0xd2, 0xbb, 0x9a, 0xe1, 0xac, 0x07, 0x99, 0xd5, 0xf0, 0x9f, 0xe8, + 0x05, 0x09, 0xa7, 0x35, 0x7c, 0x4d, 0x22, 0x54, 0xe2, 0x77, 0x13, 0x4c, 0x49, 0x62, 0x09, 0x26, + 0x53, 0x8b, 0x8f, 0xa4, 0xaa, 0x16, 0x7d, 0xf0, 0xde, 0x52, 0xae, 0x80, 0x13, 0x95, 0x6a, 0xa9, + 0xa6, 0xaa, 0xe5, 0x52, 0xa3, 0xb9, 0x5e, 0x56, 0xd7, 0x2a, 0xf5, 0x7a, 0xa5, 0x56, 0xad, 0x1f, + 0xa4, 0xb5, 0xa3, 0x8f, 0xcb, 0xbe, 0xc6, 0x2c, 0xe2, 0x56, 0x47, 0x37, 0x30, 0xba, 0xeb, 0x80, + 0x0a, 0xc3, 0xaf, 0xfa, 0x88, 0xe3, 0xcc, 0xca, 0x8f, 0xc0, 0xf9, 0xd5, 0xc9, 0x71, 0xee, 0x4f, + 0xf0, 0x3f, 0x70, 0xf3, 0xff, 0xa2, 0x0c, 0xc7, 0x42, 0x0d, 0x51, 0xc5, 0x3b, 0x23, 0x5b, 0xc9, + 0xfb, 0x99, 0x70, 0xdb, 0xad, 0xf0, 0x98, 0xf6, 0xb3, 0xa6, 0xf7, 0xb1, 0x11, 0x01, 0xeb, 0x1b, + 0x7d, 0x58, 0x57, 0x39, 0x58, 0x9f, 0x3a, 0x04, 0xcd, 0x64, 0xc8, 0xfe, 0x76, 0xaa, 0xc8, 0x5e, + 0x01, 0x27, 0xd6, 0x8b, 0x6a, 0xa3, 0x52, 0xaa, 0xac, 0x17, 0xdd, 0x71, 0x34, 0x34, 0x64, 0x47, + 0x98, 0xeb, 0x3c, 0xe8, 0x7d, 0xf1, 0x7d, 0x7f, 0x16, 0xae, 0xea, 0xdf, 0xd1, 0x96, 0xb6, 0x35, + 0x63, 0x0b, 0x23, 0x5d, 0x04, 0xea, 0x45, 0x98, 0x68, 0x91, 0xec, 0x14, 0xe7, 0xf0, 0xd6, 0x4d, + 0x4c, 0x5f, 0x4e, 0x4b, 0x50, 0xbd, 0x5f, 0xd1, 0xdb, 0xc3, 0x0a, 0xd1, 0xe0, 0x15, 0xe2, 0xe9, + 0xf1, 0xe0, 0xed, 0xe3, 0x3b, 0x42, 0x37, 0x3e, 0xe5, 0xeb, 0xc6, 0x39, 0x4e, 0x37, 0x4a, 0x07, + 0x23, 0x9f, 0x4c, 0x4d, 0xfe, 0xe8, 0xd1, 0xd0, 0x01, 0x44, 0x6a, 0x93, 0x1e, 0x3d, 0x2a, 0xf4, + 0xed, 0xee, 0x5f, 0x29, 0x43, 0x7e, 0x11, 0x77, 0xb0, 0xe8, 0x4a, 0xe4, 0x37, 0x25, 0xd1, 0x0d, + 0x11, 0x0a, 0x03, 0xa5, 0x1d, 0xbd, 0x3a, 0xe2, 0xe8, 0x3b, 0xd8, 0x76, 0xb4, 0x9d, 0x2e, 0x11, + 0xb5, 0xac, 0x06, 0x09, 0xe8, 0x67, 0x25, 0x91, 0xed, 0x92, 0x98, 0x62, 0xfe, 0x63, 0xac, 0x29, + 0x7e, 0x46, 0x82, 0xc9, 0x3a, 0x76, 0x6a, 0x56, 0x1b, 0x5b, 0xa8, 0x1e, 0x60, 0x74, 0x0d, 0x4c, + 0x13, 0x50, 0xdc, 0x69, 0xa6, 0x8f, 0x53, 0x38, 0x49, 0xb9, 0x1e, 0xe6, 0xfc, 0x57, 0xf2, 0x3b, + 0xeb, 0xc6, 0x7b, 0x52, 0xd1, 0x3f, 0x66, 0x44, 0x77, 0x71, 0xd9, 0x92, 0x21, 0xe3, 0x26, 0xa2, + 0x95, 0x8a, 0xed, 0xc8, 0xc6, 0x92, 0x4a, 0x7f, 0xa3, 0xeb, 0xad, 0x12, 0xc0, 0x86, 0x61, 0x7b, + 0x72, 0x7d, 0x7c, 0x02, 0xb9, 0xa2, 0x7f, 0xce, 0x24, 0x9b, 0xc5, 0x04, 0xe5, 0x44, 0x48, 0xec, + 0xb5, 0x09, 0xd6, 0x16, 0x22, 0x89, 0xa5, 0x2f, 0xb3, 0xaf, 0xcc, 0x41, 0xfe, 0x9c, 0xd6, 0xe9, + 0x60, 0x07, 0x7d, 0x55, 0x82, 0x7c, 0xc9, 0xc2, 0x9a, 0x83, 0xc3, 0xa2, 0x43, 0x30, 0x69, 0x99, + 0xa6, 0xb3, 0xae, 0x39, 0xdb, 0x4c, 0x6e, 0xfe, 0x3b, 0x73, 0x18, 0xf8, 0xad, 0x70, 0xf7, 0x71, + 0x17, 0x2f, 0xba, 0x1f, 0xe6, 0x6a, 0x4b, 0x0b, 0x9a, 0xa7, 0x85, 0x44, 0xf4, 0x1f, 0x08, 0x26, + 0x77, 0x0c, 0xbc, 0x63, 0x1a, 0x7a, 0xcb, 0xb3, 0x39, 0xbd, 0x77, 0xf4, 0x41, 0x5f, 0xa6, 0x0b, + 0x9c, 0x4c, 0xe7, 0x85, 0x4b, 0x49, 0x26, 0xd0, 0xfa, 0x10, 0xbd, 0xc7, 0xd5, 0x70, 0x25, 0xed, + 0x0c, 0x9a, 0x8d, 0x5a, 0xb3, 0xa4, 0x96, 0x8b, 0x8d, 0x72, 0x73, 0xb5, 0x56, 0x2a, 0xae, 0x36, + 0xd5, 0xf2, 0x7a, 0xad, 0x80, 0xd1, 0xdf, 0x49, 0xae, 0x70, 0x5b, 0xe6, 0x1e, 0xb6, 0xd0, 0xb2, + 0x90, 0x9c, 0xe3, 0x64, 0xc2, 0x30, 0xf8, 0x65, 0x61, 0xa7, 0x0d, 0x26, 0x1d, 0xc6, 0x41, 0x84, + 0xf2, 0x7e, 0x48, 0xa8, 0xb9, 0xc7, 0x92, 0x7a, 0x14, 0x48, 0xfa, 0x7f, 0x49, 0x30, 0x51, 0x32, + 0x8d, 0x3d, 0x6c, 0x39, 0xe1, 0xf9, 0x4e, 0x58, 0x9a, 0x19, 0x5e, 0x9a, 0xee, 0x20, 0x89, 0x0d, + 0xc7, 0x32, 0xbb, 0xde, 0x84, 0xc7, 0x7b, 0x45, 0xaf, 0x4f, 0x2a, 0x61, 0x56, 0x72, 0xf4, 0xc2, + 0x67, 0xff, 0x82, 0x38, 0xf6, 0xe4, 0x9e, 0x06, 0xf0, 0x70, 0x12, 0x5c, 0xfa, 0x33, 0x90, 0x7e, + 0x97, 0xf2, 0x25, 0x19, 0x66, 0x69, 0xe3, 0xab, 0x63, 0x62, 0xa1, 0xa1, 0x5a, 0x78, 0xc9, 0xb1, + 0x47, 0xf8, 0x2b, 0x47, 0x38, 0xf1, 0xe7, 0xb5, 0x6e, 0xd7, 0x5f, 0x7e, 0x5e, 0x39, 0xa2, 0xb2, + 0x77, 0xaa, 0xe6, 0x0b, 0x79, 0xc8, 0x6a, 0xbb, 0xce, 0x36, 0xfa, 0x9e, 0xf0, 0xe4, 0x93, 0xeb, + 0x0c, 0x18, 0x3f, 0x11, 0x90, 0x1c, 0x87, 0x9c, 0x63, 0x5e, 0xc0, 0x9e, 0x1c, 0xe8, 0x8b, 0x0b, + 0x87, 0xd6, 0xed, 0x36, 0xc8, 0x07, 0x06, 0x87, 0xf7, 0xee, 0xda, 0x3a, 0x5a, 0xab, 0x65, 0xee, + 0x1a, 0x4e, 0xc5, 0x5b, 0x82, 0x0e, 0x12, 0xd0, 0xe7, 0x33, 0x22, 0x93, 0x59, 0x01, 0x06, 0x93, + 0x41, 0x76, 0x7e, 0x88, 0xa6, 0x34, 0x0f, 0x37, 0x16, 0xd7, 0xd7, 0x9b, 0x8d, 0xda, 0xbd, 0xe5, + 0x6a, 0x60, 0x78, 0x36, 0x2b, 0xd5, 0x66, 0x63, 0xa5, 0xdc, 0x2c, 0x6d, 0xa8, 0x64, 0x9d, 0xb0, + 0x58, 0x2a, 0xd5, 0x36, 0xaa, 0x8d, 0x02, 0x46, 0x6f, 0x92, 0x60, 0xa6, 0xd4, 0x31, 0x6d, 0x1f, + 0xe1, 0xab, 0x03, 0x84, 0x7d, 0x31, 0x66, 0x42, 0x62, 0x44, 0xff, 0x96, 0x11, 0x75, 0x3a, 0xf0, + 0x04, 0x12, 0x22, 0x1f, 0xd1, 0x4b, 0xbd, 0x5e, 0xc8, 0xe9, 0x60, 0x30, 0xbd, 0xf4, 0x9b, 0xc4, + 0x67, 0x6e, 0x87, 0x89, 0x22, 0x55, 0x0c, 0xf4, 0xd7, 0x19, 0xc8, 0x97, 0x4c, 0x63, 0x53, 0xdf, + 0x72, 0x8d, 0x39, 0x6c, 0x68, 0xe7, 0x3b, 0x78, 0x51, 0x73, 0xb4, 0x3d, 0x1d, 0x5f, 0x24, 0x15, + 0x98, 0x54, 0x7b, 0x52, 0x5d, 0xa6, 0x58, 0x0a, 0x3e, 0xbf, 0xbb, 0x45, 0x98, 0x9a, 0x54, 0xc3, + 0x49, 0xca, 0x53, 0xe1, 0x72, 0xfa, 0xba, 0x6e, 0x61, 0x0b, 0x77, 0xb0, 0x66, 0x63, 0x77, 0x5a, + 0x64, 0xe0, 0x0e, 0x51, 0xda, 0x49, 0x35, 0xea, 0xb3, 0x72, 0x06, 0x66, 0xe8, 0x27, 0x62, 0x8a, + 0xd8, 0x44, 0x8d, 0x27, 0x55, 0x2e, 0x4d, 0x79, 0x02, 0xe4, 0xf0, 0x03, 0x8e, 0xa5, 0x9d, 0x6a, + 0x13, 0xbc, 0x2e, 0x9f, 0xa7, 0x5e, 0x87, 0xf3, 0x9e, 0xd7, 0xe1, 0x7c, 0x9d, 0xf8, 0x24, 0xaa, + 0x34, 0x17, 0x7a, 0xd9, 0xa4, 0x6f, 0x48, 0xfc, 0xbb, 0x14, 0x28, 0x86, 0x02, 0x59, 0x43, 0xdb, + 0xc1, 0x4c, 0x2f, 0xc8, 0xb3, 0x72, 0x23, 0x1c, 0xd5, 0xf6, 0x34, 0x47, 0xb3, 0x56, 0xcd, 0x96, + 0xd6, 0x21, 0x83, 0x9f, 0xd7, 0xf2, 0x7b, 0x3f, 0x90, 0x1d, 0x21, 0xc7, 0xb4, 0x30, 0xc9, 0xe5, + 0xed, 0x08, 0x79, 0x09, 0x2e, 0x75, 0xbd, 0x65, 0x1a, 0x84, 0x7f, 0x59, 0x25, 0xcf, 0xae, 0x54, + 0xda, 0xba, 0xed, 0x56, 0x84, 0x50, 0xa9, 0xd2, 0xad, 0x8d, 0xfa, 0x25, 0xa3, 0x45, 0x76, 0x83, + 0x26, 0xd5, 0xa8, 0xcf, 0xca, 0x02, 0x4c, 0xb3, 0x8d, 0x90, 0x35, 0x57, 0xaf, 0xf2, 0x44, 0xaf, + 0xae, 0xe1, 0x7d, 0xba, 0x28, 0x9e, 0xf3, 0xd5, 0x20, 0x9f, 0x1a, 0xfe, 0x49, 0xb9, 0x1b, 0xae, + 0x64, 0xaf, 0xa5, 0x5d, 0xdb, 0x31, 0x77, 0x28, 0xe8, 0x4b, 0x7a, 0x87, 0xd6, 0x60, 0x82, 0xd4, + 0x20, 0x2e, 0x8b, 0x72, 0x2b, 0x1c, 0xef, 0x5a, 0x78, 0x13, 0x5b, 0xf7, 0x69, 0x3b, 0xbb, 0x0f, + 0x34, 0x2c, 0xcd, 0xb0, 0xbb, 0xa6, 0xe5, 0x9c, 0x9a, 0x24, 0xcc, 0xf7, 0xfd, 0xc6, 0x3a, 0xca, + 0x49, 0xc8, 0x53, 0xf1, 0xa1, 0xe7, 0xe7, 0x84, 0xdd, 0x39, 0x59, 0x85, 0x62, 0xcd, 0xb3, 0x5b, + 0x60, 0x82, 0xf5, 0x70, 0x04, 0xa8, 0xe9, 0x5b, 0x4f, 0xf6, 0xac, 0x2b, 0x30, 0x2a, 0xaa, 0x97, + 0x4d, 0x79, 0x12, 0xe4, 0x5b, 0xa4, 0x5a, 0x04, 0xb3, 0xe9, 0x5b, 0xaf, 0xec, 0x5f, 0x28, 0xc9, + 0xa2, 0xb2, 0xac, 0xe8, 0x2f, 0x64, 0x21, 0x0f, 0xd0, 0x38, 0x8e, 0x93, 0xb5, 0xea, 0xaf, 0x4b, + 0x43, 0x74, 0x9b, 0x37, 0xc1, 0x0d, 0xac, 0x4f, 0x64, 0xf6, 0xc7, 0x62, 0x73, 0x61, 0xc3, 0x9b, + 0x0c, 0xba, 0x56, 0x49, 0xbd, 0x51, 0x54, 0xdd, 0x99, 0xfc, 0xa2, 0x3b, 0x89, 0xbc, 0x11, 0xae, + 0x1f, 0x90, 0xbb, 0xdc, 0x68, 0x56, 0x8b, 0x6b, 0xe5, 0xc2, 0x26, 0x6f, 0xdb, 0xd4, 0x1b, 0xb5, + 0xf5, 0xa6, 0xba, 0x51, 0xad, 0x56, 0xaa, 0xcb, 0x94, 0x98, 0x6b, 0x12, 0x9e, 0x0c, 0x32, 0x9c, + 0x53, 0x2b, 0x8d, 0x72, 0xb3, 0x54, 0xab, 0x2e, 0x55, 0x96, 0x0b, 0xfa, 0x20, 0xc3, 0xe8, 0x7e, + 0xe5, 0x1a, 0xb8, 0x8a, 0xe3, 0xa4, 0x52, 0xab, 0xba, 0x33, 0xdb, 0x52, 0xb1, 0x5a, 0x2a, 0xbb, + 0xd3, 0xd8, 0x0b, 0x0a, 0x82, 0x13, 0x94, 0x5c, 0x73, 0xa9, 0xb2, 0x1a, 0xde, 0x8c, 0xfa, 0x58, + 0x46, 0x39, 0x05, 0x97, 0x85, 0xbf, 0x55, 0xaa, 0x67, 0x8b, 0xab, 0x95, 0xc5, 0xc2, 0x1f, 0x66, + 0x94, 0xeb, 0xe0, 0x6a, 0xee, 0x2f, 0xba, 0xaf, 0xd4, 0xac, 0x2c, 0x36, 0xd7, 0x2a, 0xf5, 0xb5, + 0x62, 0xa3, 0xb4, 0x52, 0xf8, 0x38, 0x99, 0x2f, 0xf8, 0x06, 0x70, 0xc8, 0x2d, 0xf3, 0x45, 0xe1, + 0x31, 0xbd, 0xc8, 0x2b, 0xea, 0xe3, 0xfb, 0xc2, 0x1e, 0x6f, 0xc3, 0x7e, 0xc4, 0x1f, 0x1d, 0x16, + 0x39, 0x15, 0xba, 0x25, 0x01, 0xad, 0x64, 0x3a, 0xd4, 0x18, 0x42, 0x85, 0xae, 0x81, 0xab, 0xaa, + 0x65, 0x8a, 0x94, 0x5a, 0x2e, 0xd5, 0xce, 0x96, 0xd5, 0xe6, 0xb9, 0xe2, 0xea, 0x6a, 0xb9, 0xd1, + 0x5c, 0xaa, 0xa8, 0xf5, 0x46, 0x61, 0x13, 0xfd, 0xb3, 0xe4, 0xaf, 0xe6, 0x84, 0xa4, 0xf5, 0xd7, + 0x52, 0xd2, 0x66, 0x1d, 0xbb, 0x6a, 0xf3, 0x23, 0x90, 0xb7, 0x1d, 0xcd, 0xd9, 0xb5, 0x59, 0xab, + 0x7e, 0x4c, 0xff, 0x56, 0x3d, 0x5f, 0x27, 0x99, 0x54, 0x96, 0x19, 0xfd, 0x45, 0x26, 0x49, 0x33, + 0x1d, 0xc1, 0x82, 0x8e, 0x3e, 0x84, 0x88, 0x4f, 0x03, 0xf2, 0xb4, 0xbd, 0x52, 0x6f, 0x16, 0x57, + 0xd5, 0x72, 0x71, 0xf1, 0x3e, 0x7f, 0x19, 0x07, 0x2b, 0x27, 0xe0, 0xd8, 0x46, 0xb5, 0xb8, 0xb0, + 0x5a, 0x26, 0xcd, 0xa5, 0x56, 0xad, 0x96, 0x4b, 0xae, 0xdc, 0x7f, 0x96, 0x6c, 0x9a, 0xb8, 0x16, + 0x34, 0xe1, 0xdb, 0xb5, 0x72, 0x42, 0xf2, 0xff, 0x9a, 0xb0, 0x6f, 0x51, 0xa0, 0x61, 0x61, 0x5a, + 0xa3, 0xc5, 0xe1, 0xf3, 0x42, 0xee, 0x44, 0x42, 0x9c, 0x24, 0xc3, 0xe3, 0x3f, 0x0f, 0x81, 0xc7, + 0x09, 0x38, 0x16, 0xc6, 0x83, 0xb8, 0x15, 0x45, 0xc3, 0xf0, 0xe5, 0x49, 0xc8, 0xd7, 0x71, 0x07, + 0xb7, 0x1c, 0xf4, 0x96, 0x90, 0x31, 0x31, 0x07, 0x92, 0xef, 0xc6, 0x22, 0xe9, 0x6d, 0x6e, 0xfa, + 0x2c, 0xf5, 0x4c, 0x9f, 0x63, 0xcc, 0x00, 0x39, 0x91, 0x19, 0x90, 0x4d, 0xc1, 0x0c, 0xc8, 0x0d, + 0x6f, 0x06, 0xe4, 0x07, 0x99, 0x01, 0xe8, 0xb5, 0xf9, 0xa4, 0xbd, 0x04, 0x15, 0xf5, 0xe1, 0x0e, + 0xfe, 0xff, 0x33, 0x9b, 0xa4, 0x57, 0xe9, 0xcb, 0x71, 0x32, 0x2d, 0xfe, 0x9e, 0x9c, 0xc2, 0xf2, + 0x83, 0x72, 0x2d, 0x5c, 0x1d, 0xbc, 0x37, 0xcb, 0xcf, 0xa8, 0xd4, 0x1b, 0x75, 0x32, 0xe2, 0x97, + 0x6a, 0xaa, 0xba, 0xb1, 0x4e, 0xd7, 0x90, 0x4f, 0x82, 0x12, 0x50, 0x51, 0x37, 0xaa, 0x74, 0x7c, + 0xdf, 0xe2, 0xa9, 0x2f, 0x55, 0xaa, 0x8b, 0x4d, 0xbf, 0xcd, 0x54, 0x97, 0x6a, 0x85, 0x6d, 0x77, + 0xca, 0x16, 0xa2, 0xee, 0x0e, 0xd0, 0xac, 0x84, 0x62, 0x75, 0xb1, 0xb9, 0x56, 0x2d, 0xaf, 0xd5, + 0xaa, 0x95, 0x12, 0x49, 0xaf, 0x97, 0x1b, 0x05, 0xdd, 0x1d, 0x68, 0x7a, 0x2c, 0x8a, 0x7a, 0xb9, + 0xa8, 0x96, 0x56, 0xca, 0x2a, 0x2d, 0xf2, 0x7e, 0xe5, 0x7a, 0x38, 0x53, 0xac, 0xd6, 0x1a, 0x6e, + 0x4a, 0xb1, 0x7a, 0x5f, 0xe3, 0xbe, 0xf5, 0x72, 0x73, 0x5d, 0xad, 0x95, 0xca, 0xf5, 0xba, 0xdb, + 0x4e, 0x99, 0xfd, 0x51, 0xe8, 0x28, 0x4f, 0x87, 0xdb, 0x43, 0xac, 0x95, 0x1b, 0x64, 0xc3, 0x72, + 0xad, 0x46, 0x7c, 0x56, 0x16, 0xcb, 0xcd, 0x95, 0x62, 0xbd, 0x59, 0xa9, 0x96, 0x6a, 0x6b, 0xeb, + 0xc5, 0x46, 0xc5, 0x6d, 0xce, 0xeb, 0x6a, 0xad, 0x51, 0x6b, 0x9e, 0x2d, 0xab, 0xf5, 0x4a, 0xad, + 0x5a, 0x30, 0xdc, 0x2a, 0x87, 0xda, 0xbf, 0xd7, 0x0f, 0x9b, 0xca, 0x55, 0x70, 0xca, 0x4b, 0x5f, + 0xad, 0xb9, 0x82, 0x0e, 0x59, 0x24, 0xdd, 0x54, 0x2d, 0x92, 0x7f, 0x95, 0x20, 0x5b, 0x77, 0xcc, + 0x2e, 0xfa, 0xe1, 0xa0, 0x83, 0x39, 0x0d, 0x60, 0x91, 0xfd, 0x47, 0x77, 0x16, 0xc6, 0xe6, 0x65, + 0xa1, 0x14, 0xf4, 0x07, 0xc2, 0x9b, 0x26, 0x41, 0x9f, 0x6d, 0x76, 0x23, 0x6c, 0x95, 0xef, 0x88, + 0x9d, 0x22, 0x89, 0x26, 0x94, 0x4c, 0xdf, 0x7f, 0x61, 0x98, 0x6d, 0x11, 0x04, 0x27, 0x43, 0xb0, + 0xb9, 0xf2, 0xf7, 0x54, 0x02, 0x2b, 0x97, 0xc3, 0x65, 0x3d, 0xca, 0x45, 0x74, 0x6a, 0x53, 0xf9, + 0x21, 0x78, 0x4c, 0x48, 0xbd, 0xcb, 0x6b, 0xb5, 0xb3, 0x65, 0x5f, 0x91, 0x17, 0x8b, 0x8d, 0x62, + 0x61, 0x0b, 0x7d, 0x46, 0x86, 0xec, 0x9a, 0xb9, 0xd7, 0xbb, 0x57, 0x65, 0xe0, 0x8b, 0xa1, 0xb5, + 0x50, 0xef, 0x95, 0xf7, 0x9a, 0x17, 0x12, 0xfb, 0x5a, 0xf4, 0xbe, 0xf4, 0xe7, 0xa5, 0x24, 0x62, + 0x5f, 0x3b, 0xe8, 0x66, 0xf4, 0xdf, 0x0f, 0x23, 0xf6, 0x08, 0xd1, 0x62, 0xe5, 0x0c, 0x9c, 0x0e, + 0x3e, 0x54, 0x16, 0xcb, 0xd5, 0x46, 0x65, 0xe9, 0xbe, 0x40, 0xb8, 0x15, 0x55, 0x48, 0xfc, 0x83, + 0xba, 0xb1, 0xf8, 0x99, 0xc6, 0x29, 0x38, 0x1e, 0x7c, 0x5b, 0x2e, 0x37, 0xbc, 0x2f, 0xf7, 0xa3, + 0x07, 0x73, 0x30, 0x43, 0xbb, 0xf5, 0x8d, 0x6e, 0x5b, 0x73, 0x30, 0x7a, 0x52, 0x80, 0xee, 0x0d, + 0x70, 0xb4, 0xb2, 0xbe, 0x54, 0xaf, 0x3b, 0xa6, 0xa5, 0x6d, 0xe1, 0x62, 0xbb, 0x6d, 0x31, 0x69, + 0xf5, 0x26, 0xa3, 0x77, 0x0a, 0xaf, 0xf3, 0xf1, 0x43, 0x09, 0x2d, 0x33, 0x02, 0xf5, 0x2f, 0x09, + 0xad, 0xcb, 0x09, 0x10, 0x4c, 0x86, 0xfe, 0xfd, 0x23, 0x6e, 0x73, 0xd1, 0xb8, 0x6c, 0x9e, 0x79, + 0x8e, 0x04, 0x53, 0x0d, 0x7d, 0x07, 0x3f, 0xd3, 0x34, 0xb0, 0xad, 0x4c, 0x80, 0xbc, 0xbc, 0xd6, + 0x28, 0x1c, 0x71, 0x1f, 0x5c, 0xa3, 0x2a, 0x43, 0x1e, 0xca, 0x6e, 0x01, 0xee, 0x43, 0xb1, 0x51, + 0x90, 0xdd, 0x87, 0xb5, 0x72, 0xa3, 0x90, 0x75, 0x1f, 0xaa, 0xe5, 0x46, 0x21, 0xe7, 0x3e, 0xac, + 0xaf, 0x36, 0x0a, 0x79, 0xf7, 0xa1, 0x52, 0x6f, 0x14, 0x26, 0xdc, 0x87, 0x85, 0x7a, 0xa3, 0x30, + 0xe9, 0x3e, 0x9c, 0xad, 0x37, 0x0a, 0x53, 0xee, 0x43, 0xa9, 0xd1, 0x28, 0x80, 0xfb, 0x70, 0x4f, + 0xbd, 0x51, 0x98, 0x76, 0x1f, 0x8a, 0xa5, 0x46, 0x61, 0x86, 0x3c, 0x94, 0x1b, 0x85, 0x59, 0xf7, + 0xa1, 0x5e, 0x6f, 0x14, 0xe6, 0x08, 0xe5, 0x7a, 0xa3, 0x70, 0x94, 0x94, 0x55, 0x69, 0x14, 0x0a, + 0xee, 0xc3, 0x4a, 0xbd, 0x51, 0x38, 0x46, 0x32, 0xd7, 0x1b, 0x05, 0x85, 0x14, 0x5a, 0x6f, 0x14, + 0x2e, 0x23, 0x79, 0xea, 0x8d, 0xc2, 0x71, 0x52, 0x44, 0xbd, 0x51, 0x38, 0x41, 0xd8, 0x28, 0x37, + 0x0a, 0x27, 0x49, 0x1e, 0xb5, 0x51, 0xb8, 0x9c, 0x7c, 0xaa, 0x36, 0x0a, 0xa7, 0x08, 0x63, 0xe5, + 0x46, 0xe1, 0x0a, 0xf2, 0xa0, 0x36, 0x0a, 0x88, 0x7c, 0x2a, 0x36, 0x0a, 0x57, 0xa2, 0xc7, 0xc0, + 0xd4, 0x32, 0x76, 0x28, 0x88, 0xa8, 0x00, 0xf2, 0x32, 0x76, 0xc2, 0x66, 0xfc, 0x57, 0x64, 0xb8, + 0x9c, 0x4d, 0xfd, 0x96, 0x2c, 0x73, 0x67, 0x15, 0x6f, 0x69, 0xad, 0x4b, 0xe5, 0x07, 0x5c, 0x13, + 0x2a, 0xbc, 0x2f, 0xab, 0x40, 0xb6, 0x1b, 0x74, 0x46, 0xe4, 0x39, 0xd6, 0xe2, 0xf4, 0x16, 0xa3, + 0xe4, 0x60, 0x31, 0x8a, 0x59, 0x64, 0xff, 0x14, 0xd6, 0x68, 0x6e, 0xfd, 0x38, 0xd3, 0xb3, 0x7e, + 0xec, 0x36, 0x93, 0x2e, 0xb6, 0x6c, 0xd3, 0xd0, 0x3a, 0x75, 0xb6, 0x71, 0x4f, 0x57, 0xbd, 0x7a, + 0x93, 0x95, 0x1f, 0xf3, 0x5a, 0x06, 0xb5, 0xca, 0x9e, 0x16, 0x37, 0xc3, 0xed, 0xad, 0x66, 0x44, + 0x23, 0xf9, 0xb8, 0xdf, 0x48, 0x1a, 0x5c, 0x23, 0xb9, 0xfb, 0x00, 0xb4, 0x93, 0xb5, 0x97, 0xca, + 0x70, 0x53, 0x8b, 0xc0, 0xad, 0xd5, 0x5b, 0xae, 0x96, 0xd1, 0x67, 0x24, 0x38, 0x59, 0x36, 0xfa, + 0x59, 0xf8, 0x61, 0x5d, 0x78, 0x53, 0x18, 0x9a, 0x75, 0x5e, 0xa4, 0xb7, 0xf7, 0xad, 0x76, 0x7f, + 0x9a, 0x11, 0x12, 0xfd, 0xa4, 0x2f, 0xd1, 0x3a, 0x27, 0xd1, 0xbb, 0x86, 0x27, 0x9d, 0x4c, 0xa0, + 0xd5, 0x91, 0x76, 0x40, 0x59, 0xf4, 0xf5, 0x2c, 0x3c, 0x86, 0xfa, 0xde, 0x30, 0x0e, 0x69, 0x2b, + 0x2b, 0x1a, 0x6d, 0x15, 0xdb, 0x8e, 0x66, 0x39, 0xdc, 0x79, 0xe8, 0x9e, 0xa9, 0x54, 0x26, 0x85, + 0xa9, 0x94, 0x34, 0x70, 0x2a, 0x85, 0xde, 0x11, 0x36, 0x1f, 0xce, 0xf1, 0x18, 0x17, 0xfb, 0xf7, + 0xff, 0x71, 0x35, 0x8c, 0x82, 0xda, 0xb7, 0x2b, 0x7e, 0x9c, 0x83, 0x7a, 0xe9, 0xc0, 0x25, 0x24, + 0x43, 0xfc, 0x0f, 0x46, 0x6b, 0xe7, 0x65, 0xc3, 0xdf, 0x78, 0xa3, 0xa4, 0xd0, 0x4e, 0xd5, 0x40, + 0xff, 0xd4, 0x04, 0x4c, 0x91, 0xb6, 0xb0, 0xaa, 0x1b, 0x17, 0xd0, 0xc3, 0x32, 0xcc, 0x54, 0xf1, + 0xc5, 0xd2, 0xb6, 0xd6, 0xe9, 0x60, 0x63, 0x0b, 0x87, 0xcd, 0xf6, 0x53, 0x30, 0xa1, 0x75, 0xbb, + 0xd5, 0x60, 0x9f, 0xc1, 0x7b, 0x65, 0xfd, 0xef, 0xd7, 0xfa, 0x36, 0xf2, 0x4c, 0x4c, 0x23, 0xf7, + 0xcb, 0x9d, 0x0f, 0x97, 0x19, 0x31, 0x43, 0xbe, 0x06, 0xa6, 0x5b, 0x5e, 0x16, 0xff, 0xdc, 0x44, + 0x38, 0x09, 0xfd, 0x6d, 0xa2, 0x6e, 0x40, 0xa8, 0xf0, 0x64, 0x4a, 0x81, 0x47, 0x6c, 0x87, 0x9c, + 0x80, 0x63, 0x8d, 0x5a, 0xad, 0xb9, 0x56, 0xac, 0xde, 0x17, 0x9c, 0x57, 0xde, 0x44, 0x2f, 0xcf, + 0xc2, 0x5c, 0xdd, 0xec, 0xec, 0xe1, 0x00, 0xa6, 0x0a, 0xe7, 0x90, 0x13, 0x96, 0x53, 0x66, 0x9f, + 0x9c, 0x94, 0x93, 0x90, 0xd7, 0x0c, 0xfb, 0x22, 0xf6, 0x6c, 0x43, 0xf6, 0xc6, 0x60, 0x7c, 0x7f, + 0xb8, 0x1d, 0xab, 0x3c, 0x8c, 0x77, 0x0c, 0x90, 0x24, 0xcf, 0x55, 0x04, 0x90, 0x67, 0x60, 0xc6, + 0xa6, 0x9b, 0x85, 0x8d, 0xd0, 0x9e, 0x30, 0x97, 0x46, 0x58, 0xa4, 0xbb, 0xd5, 0x32, 0x63, 0x91, + 0xbc, 0xa1, 0x87, 0xfd, 0xe6, 0xbf, 0xc1, 0x41, 0x5c, 0x3c, 0x08, 0x63, 0xc9, 0x40, 0x7e, 0xe5, + 0xa8, 0x67, 0x78, 0xa7, 0xe0, 0x38, 0x6b, 0xb5, 0xcd, 0xd2, 0x4a, 0x71, 0x75, 0xb5, 0x5c, 0x5d, + 0x2e, 0x37, 0x2b, 0x8b, 0x74, 0xab, 0x22, 0x48, 0x29, 0x36, 0x1a, 0xe5, 0xb5, 0xf5, 0x46, 0xbd, + 0x59, 0x7e, 0x46, 0xa9, 0x5c, 0x5e, 0x24, 0x2e, 0x71, 0xe4, 0x4c, 0x8b, 0xe7, 0xbc, 0x58, 0xac, + 0xd6, 0xcf, 0x95, 0xd5, 0xc2, 0xf6, 0x99, 0x22, 0x4c, 0x87, 0xfa, 0x79, 0x97, 0xbb, 0x45, 0xbc, + 0xa9, 0xed, 0x76, 0x98, 0xad, 0x56, 0x38, 0xe2, 0x72, 0x47, 0x64, 0x53, 0x33, 0x3a, 0x97, 0x0a, + 0x19, 0xa5, 0x00, 0x33, 0xe1, 0x2e, 0xbd, 0x20, 0xa1, 0xb7, 0x5e, 0x05, 0x53, 0xe7, 0x4c, 0xeb, + 0x02, 0xf1, 0xe3, 0x42, 0xef, 0xa1, 0x71, 0x4d, 0xbc, 0x13, 0xa2, 0xa1, 0x81, 0xfd, 0x95, 0xe2, + 0xde, 0x02, 0x1e, 0xb5, 0xf9, 0x81, 0xa7, 0x40, 0xaf, 0x81, 0xe9, 0x8b, 0x5e, 0xee, 0xa0, 0xa5, + 0x87, 0x92, 0xd0, 0x6f, 0x88, 0xed, 0xff, 0x0f, 0x2e, 0x32, 0xfd, 0xfd, 0xe9, 0xb7, 0x48, 0x90, + 0x5f, 0xc6, 0x4e, 0xb1, 0xd3, 0x09, 0xcb, 0xed, 0xc5, 0xc2, 0x27, 0x7b, 0xb8, 0x4a, 0x14, 0x3b, + 0x9d, 0xe8, 0x46, 0x15, 0x12, 0x90, 0xe7, 0x81, 0xce, 0xa5, 0x09, 0xfa, 0xcd, 0x0d, 0x28, 0x30, + 0x7d, 0x89, 0x7d, 0x50, 0xf6, 0xf7, 0xb8, 0x1f, 0x09, 0x59, 0x39, 0x4f, 0x0c, 0x62, 0xda, 0x64, + 0xe2, 0xf7, 0xca, 0xbd, 0x7c, 0xca, 0xbd, 0x30, 0xb1, 0x6b, 0xe3, 0x92, 0x66, 0x63, 0xc2, 0x5b, + 0x6f, 0x4d, 0x6b, 0xe7, 0xef, 0xc7, 0x2d, 0x67, 0xbe, 0xb2, 0xe3, 0x1a, 0xd4, 0x1b, 0x34, 0xa3, + 0x1f, 0x26, 0x86, 0xbd, 0xab, 0x1e, 0x05, 0x77, 0x52, 0x72, 0x51, 0x77, 0xb6, 0x4b, 0xdb, 0x9a, + 0xc3, 0xd6, 0xb6, 0xfd, 0x77, 0xf4, 0xfc, 0x21, 0xe0, 0x8c, 0xdd, 0x0b, 0x8e, 0x3c, 0x20, 0x98, + 0x18, 0xc4, 0x11, 0x6c, 0xe0, 0x0e, 0x03, 0xe2, 0x3f, 0x48, 0x90, 0xad, 0x75, 0xb1, 0x21, 0x7c, + 0x1a, 0xc6, 0x97, 0xad, 0xd4, 0x23, 0xdb, 0x87, 0xc5, 0xbd, 0xc3, 0xfc, 0x4a, 0xbb, 0x25, 0x47, + 0x48, 0xf6, 0x66, 0xc8, 0xea, 0xc6, 0xa6, 0xc9, 0x0c, 0xd3, 0x2b, 0x23, 0x36, 0x81, 0x2a, 0xc6, + 0xa6, 0xa9, 0x92, 0x8c, 0xa2, 0x8e, 0x61, 0x71, 0x65, 0xa7, 0x2f, 0xee, 0x6f, 0x4c, 0x42, 0x9e, + 0xaa, 0x33, 0x7a, 0x91, 0x0c, 0x72, 0xb1, 0xdd, 0x8e, 0x10, 0xbc, 0xb4, 0x4f, 0xf0, 0x26, 0xf9, + 0xcd, 0xc7, 0xc4, 0x7f, 0xe7, 0x83, 0x99, 0x08, 0xf6, 0xed, 0xac, 0x49, 0x15, 0xdb, 0xed, 0x68, + 0x1f, 0x54, 0xbf, 0x40, 0x89, 0x2f, 0x30, 0xdc, 0xc2, 0x65, 0xb1, 0x16, 0x9e, 0x78, 0x20, 0x88, + 0xe4, 0x2f, 0x7d, 0x88, 0xfe, 0x49, 0x82, 0x89, 0x55, 0xdd, 0x76, 0x5c, 0x6c, 0x8a, 0x22, 0xd8, + 0x5c, 0x05, 0x53, 0x9e, 0x68, 0xdc, 0x2e, 0xcf, 0xed, 0xcf, 0x83, 0x04, 0xf4, 0x9a, 0x30, 0x3a, + 0xf7, 0xf0, 0xe8, 0x3c, 0x39, 0xbe, 0xf6, 0x8c, 0x8b, 0xe8, 0x53, 0x06, 0x41, 0xb1, 0x52, 0x6f, + 0xb1, 0xbf, 0xe5, 0x0b, 0x7c, 0x8d, 0x13, 0xf8, 0x6d, 0xc3, 0x14, 0x99, 0xbe, 0xd0, 0x3f, 0x2b, + 0x01, 0xb8, 0x65, 0xb3, 0xa3, 0x5c, 0x8f, 0xe3, 0x0e, 0x68, 0xc7, 0x48, 0xf7, 0xe5, 0x61, 0xe9, + 0xae, 0xf1, 0xd2, 0xfd, 0xd1, 0xc1, 0x55, 0x8d, 0x3b, 0xb2, 0xa5, 0x14, 0x40, 0xd6, 0x7d, 0xd1, + 0xba, 0x8f, 0xe8, 0x2d, 0xbe, 0x50, 0xd7, 0x39, 0xa1, 0xde, 0x31, 0x64, 0x49, 0xe9, 0xcb, 0xf5, + 0x2f, 0x25, 0x98, 0xa8, 0x63, 0xc7, 0xed, 0x26, 0xd1, 0x59, 0x91, 0x1e, 0x3e, 0xd4, 0xb6, 0x25, + 0xc1, 0xb6, 0xfd, 0xed, 0x8c, 0x68, 0xa0, 0x97, 0x40, 0x32, 0x8c, 0xa7, 0x88, 0xc5, 0x83, 0x47, + 0x84, 0x02, 0xbd, 0x0c, 0xa2, 0x96, 0xbe, 0x74, 0xdf, 0x24, 0xf9, 0x1b, 0xf3, 0xfc, 0x49, 0x8b, + 0xb0, 0x59, 0x9c, 0xd9, 0x6f, 0x16, 0x8b, 0x9f, 0xb4, 0x08, 0xd7, 0x31, 0x7a, 0x57, 0x3a, 0xb1, + 0xb1, 0x31, 0x82, 0x0d, 0xe3, 0x61, 0xe4, 0xf5, 0x6c, 0x19, 0xf2, 0x6c, 0x65, 0xf9, 0xae, 0xf8, + 0x95, 0xe5, 0xc1, 0x53, 0x8b, 0x77, 0x0f, 0x61, 0xca, 0xc5, 0x2d, 0xf7, 0xfa, 0x6c, 0x48, 0x21, + 0x36, 0x6e, 0x82, 0x1c, 0x89, 0x44, 0xc9, 0xc6, 0xb9, 0x60, 0xaf, 0xdf, 0x23, 0x51, 0x76, 0xbf, + 0xaa, 0x34, 0x53, 0x62, 0x14, 0x46, 0xb0, 0x42, 0x3c, 0x0c, 0x0a, 0xbf, 0xa6, 0x00, 0xac, 0xef, + 0x9e, 0xef, 0xe8, 0xf6, 0xb6, 0x6e, 0x6c, 0xa1, 0x2f, 0x67, 0x60, 0x86, 0xbd, 0xd2, 0x80, 0x8a, + 0xb1, 0xe6, 0x5f, 0xa4, 0x51, 0x50, 0x00, 0x79, 0xd7, 0xd2, 0xd9, 0x32, 0x80, 0xfb, 0xa8, 0xdc, + 0xe9, 0x3b, 0xf2, 0x64, 0x7b, 0x8e, 0xd2, 0xbb, 0x62, 0x08, 0x38, 0x98, 0x0f, 0x95, 0x1e, 0x38, + 0xf4, 0x84, 0xa3, 0x66, 0xe6, 0xf8, 0xa8, 0x99, 0xdc, 0xf9, 0xba, 0x7c, 0xcf, 0xf9, 0x3a, 0x17, + 0x47, 0x5b, 0x7f, 0x26, 0x26, 0xce, 0xa5, 0xb2, 0x4a, 0x9e, 0xd1, 0x07, 0x82, 0xa9, 0x8a, 0x29, + 0x68, 0xe7, 0x26, 0xa8, 0xe8, 0x55, 0x30, 0x75, 0xbf, 0xa9, 0x1b, 0x64, 0x2b, 0x82, 0x39, 0x0f, + 0x07, 0x09, 0xe8, 0xc3, 0xc2, 0x71, 0xb0, 0x42, 0x22, 0x89, 0x9d, 0x74, 0x30, 0x0e, 0x24, 0x9f, + 0x83, 0xd0, 0x7e, 0x5e, 0x5c, 0x87, 0x39, 0x88, 0x7e, 0x32, 0xd5, 0xdb, 0x19, 0x62, 0x79, 0x45, + 0x81, 0x39, 0xef, 0x5c, 0x61, 0x6d, 0xe1, 0x9e, 0x72, 0xa9, 0x51, 0xc0, 0xfb, 0xcf, 0x1a, 0x92, + 0x53, 0x85, 0xf4, 0x04, 0x61, 0xb0, 0x84, 0x82, 0xfe, 0x87, 0x04, 0x79, 0x66, 0x1d, 0xdc, 0x75, + 0x40, 0x08, 0xd1, 0x2b, 0x86, 0x81, 0x24, 0xf6, 0x78, 0xf7, 0x27, 0x92, 0x02, 0x30, 0x02, 0x7b, + 0xe0, 0xbe, 0xd4, 0x00, 0x40, 0xff, 0x22, 0x41, 0xd6, 0xb5, 0x5a, 0xc4, 0x0e, 0xcf, 0x7e, 0x5c, + 0xd8, 0x6d, 0x35, 0x24, 0x00, 0x97, 0x7c, 0x84, 0x7e, 0x2f, 0xc0, 0x54, 0x97, 0x66, 0xf4, 0x8f, + 0x6e, 0x5f, 0x27, 0xd0, 0x77, 0x60, 0x35, 0xf8, 0x0d, 0xbd, 0x4b, 0xc8, 0xf5, 0x35, 0x9e, 0x9f, + 0x64, 0x70, 0x94, 0x47, 0x71, 0xce, 0x76, 0x13, 0x7d, 0x57, 0x02, 0x50, 0xb1, 0x6d, 0x76, 0xf6, + 0xf0, 0x86, 0xa5, 0xa3, 0x2b, 0x03, 0x00, 0x58, 0xb3, 0xcf, 0x04, 0xcd, 0xfe, 0x53, 0x61, 0xc1, + 0x2f, 0xf3, 0x82, 0x7f, 0x62, 0xb4, 0xe6, 0x79, 0xc4, 0x23, 0xc4, 0xff, 0x74, 0x98, 0x60, 0x72, + 0x64, 0x26, 0xa0, 0x98, 0xf0, 0xbd, 0x9f, 0xd0, 0x7b, 0x7d, 0xd1, 0xdf, 0xc3, 0x89, 0xfe, 0x29, + 0x89, 0x39, 0x4a, 0x06, 0x40, 0x69, 0x08, 0x00, 0x8e, 0xc2, 0xb4, 0x07, 0xc0, 0x86, 0x5a, 0x29, + 0x60, 0xf4, 0x76, 0x99, 0xec, 0x96, 0xd3, 0xb1, 0xe8, 0xe0, 0x3d, 0xcd, 0x57, 0x85, 0xe7, 0xe6, + 0x21, 0x79, 0xf8, 0xe5, 0xa7, 0x04, 0xd0, 0x9f, 0x08, 0x4d, 0xc6, 0x05, 0x18, 0x7a, 0xb4, 0xf4, + 0x57, 0x67, 0xca, 0x30, 0xcb, 0x19, 0x11, 0xca, 0x29, 0x38, 0xce, 0x25, 0xd0, 0xf1, 0xae, 0x5d, + 0x38, 0xa2, 0x20, 0x38, 0xc9, 0x7d, 0x61, 0x2f, 0xb8, 0x5d, 0xc8, 0xa0, 0x3f, 0xfb, 0x4c, 0xc6, + 0x5f, 0x9e, 0x79, 0x77, 0x96, 0x2d, 0x8c, 0x7d, 0x94, 0x8f, 0x16, 0xd6, 0x32, 0x0d, 0x07, 0x3f, + 0x10, 0xf2, 0x56, 0xf0, 0x13, 0x62, 0xad, 0x86, 0x53, 0x30, 0xe1, 0x58, 0x61, 0x0f, 0x06, 0xef, + 0x35, 0xac, 0x58, 0x39, 0x5e, 0xb1, 0xaa, 0x70, 0x46, 0x37, 0x5a, 0x9d, 0xdd, 0x36, 0x56, 0x71, + 0x47, 0x73, 0x65, 0x68, 0x17, 0xed, 0x45, 0xdc, 0xc5, 0x46, 0x1b, 0x1b, 0x0e, 0xe5, 0xd3, 0x3b, + 0xad, 0x24, 0x90, 0x93, 0x57, 0xc6, 0x3b, 0x79, 0x65, 0x7c, 0x5c, 0xbf, 0x15, 0xd7, 0x98, 0xe5, + 0xb9, 0xdb, 0x00, 0x68, 0xdd, 0xce, 0xea, 0xf8, 0x22, 0x53, 0xc3, 0x2b, 0x7a, 0x16, 0xe9, 0x6a, + 0x7e, 0x06, 0x35, 0x94, 0x19, 0x7d, 0xd1, 0x57, 0xbf, 0xbb, 0x39, 0xf5, 0xbb, 0x49, 0x90, 0x85, + 0x64, 0x5a, 0xd7, 0x1d, 0x42, 0xeb, 0x66, 0x61, 0x2a, 0xd8, 0xbb, 0x95, 0x95, 0x2b, 0xe0, 0x84, + 0xe7, 0x0d, 0x5a, 0x2d, 0x97, 0x17, 0xeb, 0xcd, 0x8d, 0xf5, 0x65, 0xb5, 0xb8, 0x58, 0x2e, 0x80, + 0xab, 0x9f, 0x54, 0x2f, 0x7d, 0x27, 0xce, 0x2c, 0xfa, 0x73, 0x09, 0x72, 0xe4, 0xa8, 0x1d, 0xfa, + 0xc9, 0x11, 0x69, 0x8e, 0xcd, 0xf9, 0xbe, 0xf8, 0xe3, 0xae, 0x78, 0x14, 0x6f, 0x26, 0x4c, 0xc2, + 0xd5, 0x81, 0xa2, 0x78, 0xc7, 0x10, 0x4a, 0x7f, 0xe2, 0xe2, 0x36, 0xc9, 0xfa, 0xb6, 0x79, 0xf1, + 0x07, 0xb9, 0x49, 0xba, 0xf5, 0x3f, 0xe4, 0x26, 0xd9, 0x87, 0x85, 0xb1, 0x37, 0xc9, 0x3e, 0xed, + 0x2e, 0xa6, 0x99, 0xa2, 0x67, 0xe5, 0xfc, 0xf9, 0xdf, 0x73, 0xa4, 0x03, 0x6d, 0x55, 0x15, 0x61, + 0x56, 0x37, 0x1c, 0x6c, 0x19, 0x5a, 0x67, 0xa9, 0xa3, 0x6d, 0x79, 0xf6, 0x69, 0xef, 0xfe, 0x44, + 0x25, 0x94, 0x47, 0xe5, 0xff, 0x50, 0x4e, 0x03, 0x38, 0x78, 0xa7, 0xdb, 0xd1, 0x9c, 0x40, 0xf5, + 0x42, 0x29, 0x61, 0xed, 0xcb, 0xf2, 0xda, 0x77, 0x0b, 0x5c, 0x46, 0x41, 0x6b, 0x5c, 0xea, 0xe2, + 0x0d, 0x43, 0xff, 0xa9, 0x5d, 0x12, 0x5c, 0x92, 0xea, 0x68, 0xbf, 0x4f, 0xdc, 0x86, 0x4d, 0xbe, + 0x67, 0xc3, 0xe6, 0x1f, 0x84, 0x83, 0x56, 0x78, 0xad, 0x7e, 0x40, 0xd0, 0x0a, 0xbf, 0xa5, 0xc9, + 0x3d, 0x2d, 0xcd, 0x5f, 0x46, 0xc9, 0x0a, 0x2c, 0xa3, 0x84, 0x51, 0xc9, 0x09, 0x2e, 0x41, 0xbe, + 0x5a, 0x28, 0x2a, 0x46, 0x5c, 0x35, 0xc6, 0xb0, 0xc4, 0x2d, 0xc3, 0x1c, 0x2d, 0x7a, 0xc1, 0x34, + 0x2f, 0xec, 0x68, 0xd6, 0x05, 0x64, 0x1d, 0x48, 0x15, 0x63, 0x77, 0x8b, 0x22, 0xb7, 0x40, 0x3f, + 0x29, 0x3c, 0x67, 0xe0, 0xc4, 0xe5, 0xf1, 0x3c, 0x9e, 0xed, 0xa2, 0x37, 0x08, 0x4d, 0x21, 0x44, + 0x18, 0x4c, 0x1f, 0xd7, 0x3f, 0xf2, 0x71, 0xf5, 0x3a, 0xfa, 0xf0, 0x4a, 0xfb, 0x28, 0x71, 0x45, + 0x5f, 0x1a, 0x0e, 0x3b, 0x8f, 0xaf, 0x21, 0xb0, 0x2b, 0x80, 0x7c, 0xc1, 0x77, 0xee, 0x71, 0x1f, + 0xc3, 0x15, 0xca, 0xa6, 0x87, 0x66, 0x04, 0xcb, 0x63, 0x41, 0xf3, 0x38, 0xcf, 0x42, 0xad, 0x9b, + 0x2a, 0xa6, 0x5f, 0x10, 0xde, 0xc1, 0xea, 0x2b, 0x20, 0xca, 0xdd, 0x78, 0x5a, 0xa5, 0xd8, 0xf6, + 0x97, 0x38, 0x9b, 0xe9, 0xa3, 0xf9, 0x50, 0x0e, 0xa6, 0xbc, 0xb0, 0x22, 0xe4, 0xd6, 0x1b, 0x1f, + 0xc3, 0x93, 0x90, 0xb7, 0xcd, 0x5d, 0xab, 0x85, 0xd9, 0x9e, 0x22, 0x7b, 0x1b, 0x62, 0xff, 0x6b, + 0xe0, 0x78, 0xbe, 0xcf, 0x64, 0xc8, 0x26, 0x36, 0x19, 0xa2, 0x0d, 0xd2, 0xb8, 0x01, 0xfe, 0xf9, + 0xc2, 0xa1, 0xca, 0x39, 0xcc, 0xea, 0xd8, 0x79, 0x34, 0x8e, 0xf1, 0xbf, 0x2f, 0xb4, 0xbb, 0x32, + 0xa0, 0x26, 0xc9, 0x54, 0xae, 0x36, 0x84, 0xa1, 0x7a, 0x25, 0x5c, 0xee, 0xe5, 0x60, 0x16, 0x2a, + 0xb1, 0x48, 0x37, 0xd4, 0xd5, 0x82, 0x8c, 0x9e, 0x9d, 0x85, 0x02, 0x65, 0xad, 0xe6, 0x1b, 0x6b, + 0xe8, 0xc5, 0x99, 0xc3, 0xb6, 0x48, 0xa3, 0xa7, 0x98, 0x9f, 0x96, 0x44, 0xc3, 0xa1, 0x72, 0x82, + 0x0f, 0x6a, 0x17, 0xa1, 0x49, 0x43, 0x34, 0xb3, 0x18, 0xe5, 0x43, 0xbf, 0x99, 0x11, 0x89, 0xae, + 0x2a, 0xc6, 0x62, 0xfa, 0xbd, 0xd2, 0xe7, 0xb2, 0x5e, 0x74, 0xa8, 0x25, 0xcb, 0xdc, 0xd9, 0xb0, + 0x3a, 0xe8, 0xff, 0x16, 0x0a, 0x5e, 0x1d, 0x61, 0xfe, 0x4b, 0xd1, 0xe6, 0x3f, 0x59, 0x32, 0xee, + 0x04, 0x7b, 0x55, 0x9d, 0x21, 0x86, 0x6f, 0xe5, 0x7a, 0x98, 0xd3, 0xda, 0xed, 0x75, 0x6d, 0x0b, + 0x97, 0xdc, 0x79, 0xb5, 0xe1, 0xb0, 0xc8, 0x31, 0x3d, 0xa9, 0xb1, 0x5d, 0x91, 0xf8, 0x3a, 0x28, + 0x07, 0x12, 0x93, 0xcf, 0x58, 0x86, 0x37, 0x77, 0x48, 0x68, 0x6d, 0x6b, 0x41, 0x1c, 0x2b, 0xf6, + 0x26, 0xe8, 0xbb, 0x24, 0xc0, 0x77, 0xfa, 0x9a, 0xf5, 0xbb, 0x12, 0x4c, 0xb8, 0xf2, 0x2e, 0xb6, + 0xdb, 0xe8, 0xb1, 0x5c, 0xb8, 0xb7, 0x48, 0xef, 0xb1, 0x9f, 0x17, 0x76, 0xdb, 0xf3, 0x6a, 0x48, + 0xe9, 0x47, 0x60, 0x12, 0x08, 0x51, 0xe2, 0x84, 0x28, 0xe6, 0x9d, 0x17, 0x5b, 0x44, 0xfa, 0xe2, + 0xfb, 0xb8, 0x04, 0xb3, 0xde, 0x3c, 0x62, 0x09, 0x3b, 0xad, 0x6d, 0x74, 0x9b, 0xe8, 0x42, 0x13, + 0x6b, 0x69, 0xfe, 0x9e, 0x6c, 0x07, 0x7d, 0x2f, 0x93, 0x50, 0xe5, 0xb9, 0x92, 0x23, 0x56, 0xe9, + 0x12, 0xe9, 0x62, 0x1c, 0xc1, 0xf4, 0x85, 0xf9, 0x45, 0x09, 0xa0, 0x61, 0xfa, 0x73, 0xdd, 0x03, + 0x48, 0xf2, 0x85, 0xc2, 0xdb, 0xb5, 0xac, 0xe2, 0x41, 0xb1, 0xc9, 0x7b, 0x0e, 0x41, 0xe7, 0xa3, + 0x41, 0x25, 0x8d, 0xa5, 0xad, 0x4f, 0x2d, 0xee, 0x76, 0x3b, 0x7a, 0x4b, 0x73, 0x7a, 0x3d, 0xe6, + 0xa2, 0xc5, 0x4b, 0xae, 0x84, 0x4c, 0x64, 0x14, 0xfa, 0x65, 0x44, 0xc8, 0x92, 0x86, 0x21, 0x91, + 0xbc, 0x30, 0x24, 0x82, 0x5e, 0x30, 0x03, 0x88, 0x8f, 0x41, 0x3d, 0x65, 0x38, 0x5a, 0xeb, 0x62, + 0x63, 0xc1, 0xc2, 0x5a, 0xbb, 0x65, 0xed, 0xee, 0x9c, 0xb7, 0xc3, 0xee, 0x9e, 0xf1, 0x3a, 0x1a, + 0x5a, 0x3a, 0x96, 0xb8, 0xa5, 0x63, 0xf4, 0x73, 0xb2, 0x68, 0x50, 0x9c, 0xd0, 0x06, 0x47, 0x88, + 0x87, 0x21, 0x86, 0xba, 0x44, 0x4e, 0x4a, 0x3d, 0xab, 0xc4, 0xd9, 0x24, 0xab, 0xc4, 0x6f, 0x14, + 0x0a, 0xb1, 0x23, 0x54, 0xaf, 0xb1, 0xf8, 0x9a, 0xcd, 0xd5, 0xb1, 0x13, 0x01, 0xef, 0x75, 0x30, + 0x7b, 0x3e, 0xf8, 0xe2, 0x43, 0xcc, 0x27, 0xf6, 0xf1, 0x00, 0x7d, 0x53, 0xd2, 0x15, 0x18, 0x9e, + 0x85, 0x08, 0x74, 0x7d, 0x04, 0x25, 0x11, 0x37, 0xb3, 0x44, 0xcb, 0x29, 0xb1, 0xe5, 0xa7, 0x8f, + 0xc2, 0x87, 0x25, 0x98, 0x26, 0x17, 0x5d, 0x2e, 0x5c, 0x22, 0xe7, 0x16, 0x05, 0x8d, 0x92, 0x87, + 0xc2, 0x62, 0x56, 0x20, 0xdb, 0xd1, 0x8d, 0x0b, 0x9e, 0x7f, 0xa0, 0xfb, 0x1c, 0x5c, 0x9b, 0x26, + 0xf5, 0xb9, 0x36, 0xcd, 0xdf, 0xa7, 0xf0, 0xcb, 0x3d, 0xd0, 0x3d, 0xbe, 0x03, 0xc9, 0xa5, 0x2f, + 0xc6, 0xbf, 0xcb, 0x42, 0xbe, 0x8e, 0x35, 0xab, 0xb5, 0x8d, 0xde, 0x2d, 0xf5, 0x9d, 0x2a, 0x4c, + 0xf2, 0x53, 0x85, 0x25, 0x98, 0xd8, 0xd4, 0x3b, 0x0e, 0xb6, 0xa8, 0xcf, 0x74, 0xb8, 0x6b, 0xa7, + 0x4d, 0x7c, 0xa1, 0x63, 0xb6, 0x2e, 0xcc, 0x33, 0xd3, 0x7d, 0xde, 0x0b, 0xb3, 0x39, 0xbf, 0x44, + 0x7e, 0x52, 0xbd, 0x9f, 0x5d, 0x83, 0xd0, 0x36, 0x2d, 0x27, 0xea, 0x06, 0x85, 0x08, 0x2a, 0x75, + 0xd3, 0x72, 0x54, 0xfa, 0xa3, 0x0b, 0xf3, 0xe6, 0x6e, 0xa7, 0xd3, 0xc0, 0x0f, 0x38, 0xde, 0xb4, + 0xcd, 0x7b, 0x77, 0x8d, 0x45, 0x73, 0x73, 0xd3, 0xc6, 0x74, 0xd1, 0x20, 0xa7, 0xb2, 0x37, 0xe5, + 0x38, 0xe4, 0x3a, 0xfa, 0x8e, 0x4e, 0x27, 0x1a, 0x39, 0x95, 0xbe, 0x28, 0x37, 0x42, 0x21, 0x98, + 0xe3, 0x50, 0x46, 0x4f, 0xe5, 0x49, 0xd3, 0xdc, 0x97, 0xee, 0xea, 0xcc, 0x05, 0x7c, 0xc9, 0x3e, + 0x35, 0x41, 0xbe, 0x93, 0x67, 0xfe, 0x80, 0x8a, 0xc8, 0x7e, 0x07, 0x95, 0x78, 0xf4, 0x0c, 0xd6, + 0xc2, 0x2d, 0xd3, 0x6a, 0x7b, 0xb2, 0x89, 0x9e, 0x60, 0xb0, 0x7c, 0xc9, 0x76, 0x29, 0xfa, 0x16, + 0x9e, 0xbe, 0xa6, 0xbd, 0x23, 0xef, 0x76, 0x9b, 0x6e, 0xd1, 0xe7, 0x74, 0x67, 0x7b, 0x0d, 0x3b, + 0x1a, 0xfa, 0x3b, 0xb9, 0xaf, 0xc6, 0x4d, 0xff, 0x6f, 0x8d, 0x1b, 0xa0, 0x71, 0x34, 0x80, 0x92, + 0xb3, 0x6b, 0x19, 0xae, 0x1c, 0x59, 0xc8, 0xd2, 0x50, 0x8a, 0x72, 0x07, 0x5c, 0x11, 0xbc, 0x79, + 0x4b, 0xa5, 0x8b, 0x6c, 0xda, 0x3a, 0x45, 0xb2, 0x47, 0x67, 0x50, 0xd6, 0xe1, 0x5a, 0xfa, 0x71, + 0xa5, 0xb1, 0xb6, 0xba, 0xa2, 0x6f, 0x6d, 0x77, 0xf4, 0xad, 0x6d, 0xc7, 0xae, 0x18, 0xb6, 0x83, + 0xb5, 0x76, 0x6d, 0x53, 0xa5, 0x77, 0x9f, 0x00, 0xa1, 0x23, 0x92, 0x95, 0xf7, 0xa9, 0x16, 0x1b, + 0xdd, 0xc2, 0x9a, 0x12, 0xd1, 0x52, 0x9e, 0xe2, 0xb6, 0x14, 0x7b, 0xb7, 0xe3, 0x63, 0x7a, 0x55, + 0x0f, 0xa6, 0x81, 0xaa, 0xef, 0x76, 0x48, 0x73, 0x21, 0x99, 0x93, 0x8e, 0x73, 0x31, 0x9c, 0xa4, + 0xdf, 0x6c, 0xfe, 0xbf, 0x3c, 0xe4, 0x96, 0x2d, 0xad, 0xbb, 0x8d, 0x9e, 0x1d, 0xea, 0x9f, 0x47, + 0xd5, 0x26, 0x7c, 0xed, 0x94, 0x06, 0x69, 0xa7, 0x3c, 0x40, 0x3b, 0xb3, 0x21, 0xed, 0x8c, 0x5e, + 0x54, 0x3e, 0x03, 0x33, 0x2d, 0xb3, 0xd3, 0xc1, 0x2d, 0x57, 0x1e, 0x95, 0x36, 0x59, 0xcd, 0x99, + 0x52, 0xb9, 0x34, 0x12, 0x8a, 0x18, 0x3b, 0x75, 0xba, 0x86, 0x4e, 0x95, 0x3e, 0x48, 0x40, 0x2f, + 0x96, 0x20, 0x5b, 0x6e, 0x6f, 0x61, 0x6e, 0x9d, 0x3d, 0x13, 0x5a, 0x67, 0x3f, 0x09, 0x79, 0x47, + 0xb3, 0xb6, 0xb0, 0xe3, 0xad, 0x13, 0xd0, 0x37, 0x3f, 0x42, 0xb2, 0x1c, 0x8a, 0x90, 0xfc, 0xa3, + 0x90, 0x75, 0x65, 0xc6, 0xdc, 0xc8, 0xaf, 0xed, 0x07, 0x3f, 0x91, 0xfd, 0xbc, 0x5b, 0xe2, 0xbc, + 0x5b, 0x6b, 0x95, 0xfc, 0xd0, 0x8b, 0x75, 0x6e, 0x1f, 0xd6, 0xe4, 0x1a, 0xc7, 0x96, 0x69, 0x54, + 0x76, 0xb4, 0x2d, 0xcc, 0xaa, 0x19, 0x24, 0x78, 0x5f, 0xcb, 0x3b, 0xe6, 0xfd, 0x3a, 0x0b, 0x56, + 0x1c, 0x24, 0xb8, 0x55, 0xd8, 0xd6, 0xdb, 0x6d, 0x6c, 0xb0, 0x96, 0xcd, 0xde, 0xce, 0x9c, 0x86, + 0xac, 0xcb, 0x83, 0xab, 0x3f, 0xae, 0xb1, 0x50, 0x38, 0xa2, 0xcc, 0xb8, 0xcd, 0x8a, 0x36, 0xde, + 0x42, 0x86, 0x5f, 0x53, 0x15, 0x71, 0xdb, 0xa1, 0x95, 0xeb, 0xdf, 0xb8, 0x9e, 0x00, 0x39, 0xc3, + 0x6c, 0xe3, 0x81, 0x83, 0x10, 0xcd, 0xa5, 0x3c, 0x19, 0x72, 0xb8, 0xed, 0xf6, 0x0a, 0x32, 0xc9, + 0x7e, 0x3a, 0x5e, 0x96, 0x2a, 0xcd, 0x9c, 0xcc, 0x37, 0xa8, 0x1f, 0xb7, 0xe9, 0x37, 0xc0, 0x5f, + 0x9c, 0x80, 0xa3, 0xb4, 0x0f, 0xa8, 0xef, 0x9e, 0x77, 0x49, 0x9d, 0xc7, 0xe8, 0x91, 0xfe, 0x03, + 0xd7, 0x51, 0x5e, 0xd9, 0x8f, 0x43, 0xce, 0xde, 0x3d, 0xef, 0x1b, 0xa1, 0xf4, 0x25, 0xdc, 0x74, + 0xa5, 0x91, 0x0c, 0x67, 0xf2, 0xb0, 0xc3, 0x19, 0x37, 0x34, 0xc9, 0x5e, 0xe3, 0x0f, 0x06, 0x32, + 0x7a, 0x00, 0xc2, 0x1b, 0xc8, 0xfa, 0x0d, 0x43, 0xa7, 0x60, 0x42, 0xdb, 0x74, 0xb0, 0x15, 0x98, + 0x89, 0xec, 0xd5, 0x1d, 0x2a, 0xcf, 0xe3, 0x4d, 0xd3, 0x72, 0xc5, 0x32, 0x45, 0x87, 0x4a, 0xef, + 0x3d, 0xd4, 0x72, 0x81, 0xdb, 0x21, 0xbb, 0x09, 0x8e, 0x19, 0xe6, 0x22, 0xee, 0x32, 0x39, 0x53, + 0x14, 0x67, 0x49, 0x0b, 0xd8, 0xff, 0x61, 0x5f, 0x57, 0x32, 0xb7, 0xbf, 0x2b, 0x41, 0x9f, 0x4a, + 0x3a, 0x67, 0xee, 0x01, 0x7a, 0x64, 0x16, 0x9a, 0xf2, 0x34, 0x98, 0x69, 0x33, 0x17, 0xad, 0x96, + 0xee, 0xb7, 0x92, 0xc8, 0xff, 0xb8, 0xcc, 0x81, 0x22, 0x65, 0xc3, 0x8a, 0xb4, 0x0c, 0x93, 0xe4, + 0xa8, 0xb2, 0xab, 0x49, 0xb9, 0x1e, 0x97, 0x78, 0x32, 0xad, 0xf3, 0x2b, 0x15, 0x12, 0xdb, 0x7c, + 0x89, 0xfd, 0xa2, 0xfa, 0x3f, 0x27, 0x9b, 0x7d, 0xc7, 0x4b, 0x28, 0xfd, 0xe6, 0xf8, 0x5b, 0x79, + 0xb8, 0xa2, 0x64, 0x99, 0xb6, 0x4d, 0xce, 0xc0, 0xf4, 0x36, 0xcc, 0xd7, 0x4b, 0xdc, 0x5d, 0x09, + 0x8f, 0xea, 0xe6, 0xd7, 0xaf, 0x41, 0x8d, 0xaf, 0x69, 0x7c, 0x55, 0x38, 0xc8, 0x8b, 0xbf, 0xff, + 0x10, 0x21, 0xf4, 0x1f, 0x8c, 0x46, 0xf2, 0x8e, 0x8c, 0x48, 0xdc, 0x99, 0x84, 0xb2, 0x4a, 0xbf, + 0xb9, 0x7c, 0x41, 0x82, 0x2b, 0x7b, 0xb9, 0xd9, 0x30, 0x6c, 0xbf, 0xc1, 0x5c, 0x3d, 0xa0, 0xbd, + 0xf0, 0x71, 0x4a, 0x62, 0x6f, 0x29, 0x8c, 0xa8, 0x7b, 0xa8, 0xb4, 0x88, 0xc5, 0x92, 0xe0, 0x44, + 0x4d, 0xdc, 0x2d, 0x85, 0x89, 0xc9, 0xa7, 0x2f, 0xdc, 0x4f, 0x67, 0xe1, 0xe8, 0xb2, 0x65, 0xee, + 0x76, 0xed, 0xa0, 0x07, 0xfa, 0xeb, 0xfe, 0x1b, 0xae, 0x79, 0x11, 0xd3, 0xe0, 0x1a, 0x98, 0xb6, + 0x98, 0x35, 0x17, 0x6c, 0xbf, 0x86, 0x93, 0xc2, 0xbd, 0x97, 0x7c, 0x90, 0xde, 0x2b, 0xe8, 0x67, + 0xb2, 0x5c, 0x3f, 0xd3, 0xdb, 0x73, 0xe4, 0xfa, 0xf4, 0x1c, 0x7f, 0x25, 0x25, 0x1c, 0x54, 0x7b, + 0x44, 0x14, 0xd1, 0x5f, 0x94, 0x20, 0xbf, 0x45, 0x32, 0xb2, 0xee, 0xe2, 0xf1, 0x62, 0x35, 0x23, + 0xc4, 0x55, 0xf6, 0x6b, 0x20, 0x57, 0x39, 0xac, 0xc3, 0x89, 0x06, 0xb8, 0x78, 0x6e, 0xd3, 0x57, + 0xaa, 0x87, 0xb3, 0x30, 0xe3, 0x97, 0x5e, 0x69, 0xdb, 0xe8, 0xa1, 0xfe, 0x1a, 0x35, 0x2b, 0xa2, + 0x51, 0xfb, 0xd6, 0x99, 0xfd, 0x51, 0x47, 0x0e, 0x8d, 0x3a, 0x7d, 0x47, 0x97, 0x99, 0x88, 0xd1, + 0x05, 0x3d, 0x4b, 0x16, 0xbd, 0x6d, 0x88, 0xef, 0x5a, 0x49, 0x6d, 0x1e, 0xcd, 0x83, 0x85, 0xe0, + 0x9d, 0x47, 0x83, 0x6b, 0x95, 0xbe, 0x92, 0xbc, 0x4f, 0x82, 0x63, 0xfb, 0x3b, 0xf3, 0x1f, 0xe2, + 0xbd, 0xd0, 0xdc, 0x3a, 0xd9, 0xbe, 0x17, 0x1a, 0x79, 0xe3, 0x37, 0xe9, 0x62, 0x83, 0x86, 0x70, + 0xf6, 0xde, 0xe0, 0x4e, 0x5c, 0x2c, 0x2c, 0x88, 0x20, 0xd1, 0xf4, 0x05, 0xf8, 0x2b, 0x32, 0x4c, + 0xd5, 0xb1, 0xb3, 0xaa, 0x5d, 0x32, 0x77, 0x1d, 0xa4, 0x89, 0x6e, 0xcf, 0x3d, 0x15, 0xf2, 0x1d, + 0xf2, 0x0b, 0xbb, 0xc4, 0xfd, 0x9a, 0xbe, 0xfb, 0x5b, 0xc4, 0xf7, 0x87, 0x92, 0x56, 0x59, 0x7e, + 0x3e, 0x5a, 0x8b, 0xc8, 0xee, 0xa8, 0xcf, 0xdd, 0x48, 0xb6, 0x76, 0x12, 0xed, 0x9d, 0x46, 0x15, + 0x9d, 0x3e, 0x2c, 0x3f, 0x27, 0xc3, 0x6c, 0x1d, 0x3b, 0x15, 0x7b, 0x49, 0xdb, 0x33, 0x2d, 0xdd, + 0xc1, 0xe1, 0x5b, 0x1c, 0xe3, 0xa1, 0x39, 0x0d, 0xa0, 0xfb, 0xbf, 0xb1, 0x18, 0x52, 0xa1, 0x14, + 0xf4, 0x9b, 0x49, 0x1d, 0x85, 0x38, 0x3e, 0x46, 0x02, 0x42, 0x22, 0x1f, 0x8b, 0xb8, 0xe2, 0xd3, + 0x07, 0xe2, 0xf3, 0x12, 0x03, 0xa2, 0x68, 0xb5, 0xb6, 0xf5, 0x3d, 0xdc, 0x4e, 0x08, 0x84, 0xf7, + 0x5b, 0x00, 0x84, 0x4f, 0x28, 0xb1, 0xfb, 0x0a, 0xc7, 0xc7, 0x28, 0xdc, 0x57, 0xe2, 0x08, 0x8e, + 0x25, 0x0c, 0x94, 0xdb, 0xf5, 0xb0, 0xf5, 0xcc, 0xbb, 0x44, 0xc5, 0x1a, 0x98, 0x6c, 0x52, 0xd8, + 0x64, 0x1b, 0xaa, 0x63, 0xa1, 0x65, 0x0f, 0xd2, 0xe9, 0x6c, 0x1a, 0x1d, 0x4b, 0xdf, 0xa2, 0xd3, + 0x17, 0xfa, 0xbb, 0x64, 0x38, 0xe1, 0xc7, 0x47, 0xa9, 0x63, 0x67, 0x51, 0xb3, 0xb7, 0xcf, 0x9b, + 0x9a, 0xd5, 0x0e, 0x5f, 0xee, 0x3f, 0xf4, 0x89, 0x3f, 0xf4, 0xb9, 0x30, 0x08, 0x55, 0x1e, 0x84, + 0xbe, 0xae, 0xa2, 0x7d, 0x79, 0x19, 0x45, 0x27, 0x13, 0xeb, 0xcd, 0xfa, 0xdb, 0x3e, 0x58, 0x3f, + 0xc6, 0x81, 0x75, 0xe7, 0xb0, 0x2c, 0xa6, 0x0f, 0xdc, 0xaf, 0xd3, 0x11, 0x21, 0xe4, 0xd5, 0x7c, + 0x9f, 0x28, 0x60, 0x11, 0x5e, 0xad, 0x72, 0xa4, 0x57, 0xeb, 0x50, 0x63, 0xc4, 0x40, 0x8f, 0xe4, + 0x74, 0xc7, 0x88, 0x43, 0xf4, 0x36, 0x7e, 0x9b, 0x0c, 0x05, 0x12, 0x20, 0x2b, 0xe4, 0xf1, 0x8d, + 0xee, 0x17, 0x45, 0x67, 0x9f, 0x77, 0xf9, 0x44, 0x52, 0xef, 0x72, 0xf4, 0xd6, 0xa4, 0x3e, 0xe4, + 0xbd, 0xdc, 0x8e, 0x04, 0xb1, 0x44, 0x2e, 0xe2, 0x03, 0x38, 0x48, 0x1f, 0xb4, 0xff, 0x26, 0x03, + 0xb8, 0x0d, 0x9a, 0x9d, 0x7d, 0x78, 0x86, 0x28, 0x5c, 0x37, 0x87, 0xfd, 0xea, 0x5d, 0xa0, 0x4e, + 0xf4, 0x00, 0x45, 0x29, 0x06, 0xa7, 0x2a, 0x1e, 0x49, 0xea, 0x5b, 0x19, 0x70, 0x35, 0x12, 0x58, + 0x12, 0x79, 0x5b, 0x46, 0x96, 0x9d, 0x3e, 0x20, 0xff, 0x5d, 0x82, 0x5c, 0xc3, 0xac, 0x63, 0xe7, + 0xe0, 0xa6, 0x40, 0xe2, 0x63, 0xfb, 0xa4, 0xdc, 0x51, 0x1c, 0xdb, 0xef, 0x47, 0x28, 0x7d, 0xd1, + 0xbd, 0x53, 0x82, 0x99, 0x86, 0x59, 0xf2, 0x17, 0xa7, 0xc4, 0x7d, 0x55, 0xc5, 0x6f, 0x4c, 0xf6, + 0x2b, 0x18, 0x14, 0x73, 0xa0, 0x1b, 0x93, 0x07, 0xd3, 0x4b, 0x5f, 0x6e, 0xb7, 0xc1, 0xd1, 0x0d, + 0xa3, 0x6d, 0xaa, 0xb8, 0x6d, 0xb2, 0x95, 0x6e, 0x45, 0x81, 0xec, 0xae, 0xd1, 0x36, 0x09, 0xcb, + 0x39, 0x95, 0x3c, 0xbb, 0x69, 0x16, 0x6e, 0x9b, 0xcc, 0x37, 0x80, 0x3c, 0xa3, 0xaf, 0xca, 0x90, + 0x75, 0xff, 0x15, 0x17, 0xf5, 0xdb, 0xe4, 0x84, 0x81, 0x08, 0x5c, 0xf2, 0x23, 0xb1, 0x84, 0xee, + 0x0a, 0xad, 0xfd, 0x53, 0x0f, 0xd6, 0x6b, 0xa3, 0xca, 0x0b, 0x89, 0x22, 0x58, 0xf3, 0x57, 0x4e, + 0xc1, 0xc4, 0xf9, 0x8e, 0xd9, 0xba, 0x10, 0x9c, 0x97, 0x67, 0xaf, 0xca, 0x8d, 0x90, 0xb3, 0x34, + 0x63, 0x0b, 0xb3, 0x3d, 0x85, 0xe3, 0x3d, 0x7d, 0x21, 0xf1, 0x7a, 0x51, 0x69, 0x16, 0xf4, 0xd6, + 0x24, 0x21, 0x10, 0xfa, 0x54, 0x3e, 0x99, 0x3e, 0x2c, 0x0e, 0x71, 0xb2, 0xac, 0x00, 0x33, 0xa5, + 0x22, 0xbd, 0x9b, 0x7c, 0xad, 0x76, 0xb6, 0x5c, 0x90, 0x09, 0xcc, 0xae, 0x4c, 0x52, 0x84, 0xd9, + 0x25, 0xff, 0x03, 0x0b, 0x73, 0x9f, 0xca, 0x1f, 0x06, 0xcc, 0x1f, 0x97, 0x60, 0x76, 0x55, 0xb7, + 0x9d, 0x28, 0x6f, 0xff, 0x98, 0xf8, 0xb8, 0xcf, 0x4f, 0x6a, 0x2a, 0x73, 0xe5, 0x08, 0x07, 0xc6, + 0x4d, 0x64, 0x0e, 0xc7, 0x15, 0x31, 0x9e, 0x63, 0x29, 0x84, 0x03, 0x7a, 0x9f, 0xb0, 0xb0, 0x24, + 0x13, 0x1b, 0x4a, 0x41, 0x21, 0xe3, 0x37, 0x94, 0x22, 0xcb, 0x4e, 0x5f, 0xbe, 0x5f, 0x95, 0xe0, + 0x98, 0x5b, 0x7c, 0xdc, 0xb2, 0x54, 0xb4, 0x98, 0x07, 0x2e, 0x4b, 0x25, 0x5e, 0x19, 0xdf, 0xc7, + 0xcb, 0x28, 0x56, 0xc6, 0x07, 0x11, 0x1d, 0xb3, 0x98, 0x23, 0x96, 0x61, 0x07, 0x89, 0x39, 0x66, + 0x19, 0x76, 0x78, 0x31, 0xc7, 0x2f, 0xc5, 0x0e, 0x29, 0xe6, 0x43, 0x5b, 0x60, 0x7d, 0xad, 0xec, + 0x8b, 0x39, 0x72, 0x6d, 0x23, 0x46, 0xcc, 0x89, 0x4f, 0xec, 0xa2, 0xb7, 0x0f, 0x29, 0xf8, 0x11, + 0xaf, 0x6f, 0x0c, 0x03, 0xd3, 0x21, 0xae, 0x71, 0xbc, 0x44, 0x86, 0x39, 0xc6, 0x45, 0xff, 0x29, + 0x73, 0x0c, 0x46, 0x89, 0xa7, 0xcc, 0x89, 0xcf, 0x00, 0xf1, 0x9c, 0x8d, 0xff, 0x0c, 0x50, 0x6c, + 0xf9, 0xe9, 0x83, 0xf3, 0xb5, 0x2c, 0x9c, 0x74, 0x59, 0x58, 0x33, 0xdb, 0xfa, 0xe6, 0x25, 0xca, + 0xc5, 0x59, 0xad, 0xb3, 0x8b, 0x6d, 0xf4, 0x1e, 0x49, 0x14, 0xa5, 0xff, 0x04, 0x60, 0x76, 0xb1, + 0x45, 0x03, 0xa9, 0x31, 0xa0, 0xee, 0x88, 0xaa, 0xec, 0xfe, 0x92, 0xfc, 0xeb, 0x62, 0x6a, 0x1e, + 0x11, 0x35, 0x44, 0xcf, 0xb5, 0x0a, 0xa7, 0xfc, 0x2f, 0xbd, 0x0e, 0x1e, 0x99, 0xfd, 0x0e, 0x1e, + 0x37, 0x80, 0xac, 0xb5, 0xdb, 0x3e, 0x54, 0xbd, 0x9b, 0xd9, 0xa4, 0x4c, 0xd5, 0xcd, 0xe2, 0xe6, + 0xb4, 0x71, 0x70, 0x34, 0x2f, 0x22, 0xa7, 0x8d, 0x1d, 0x65, 0x1e, 0xf2, 0xf4, 0x6e, 0x65, 0x7f, + 0x45, 0xbf, 0x7f, 0x66, 0x96, 0x8b, 0x37, 0xed, 0x6a, 0xbc, 0x1a, 0xde, 0x96, 0x48, 0x32, 0xfd, + 0xfa, 0xe9, 0xc0, 0x4e, 0x56, 0x39, 0x05, 0x7b, 0xfa, 0xd0, 0x94, 0xc7, 0xb3, 0x1b, 0x56, 0xec, + 0x76, 0x3b, 0x97, 0x1a, 0x2c, 0xf8, 0x4a, 0xa2, 0xdd, 0xb0, 0x50, 0x0c, 0x17, 0xa9, 0x37, 0x86, + 0x4b, 0xf2, 0xdd, 0x30, 0x8e, 0x8f, 0x51, 0xec, 0x86, 0xc5, 0x11, 0x4c, 0x5f, 0xb4, 0x6f, 0xce, + 0x51, 0xab, 0x99, 0x45, 0xef, 0xff, 0xc3, 0xfe, 0x87, 0xd0, 0x80, 0x77, 0x76, 0xe9, 0x17, 0xd8, + 0x3f, 0xf6, 0xd6, 0x12, 0xe5, 0xc9, 0x90, 0xdf, 0x34, 0xad, 0x1d, 0xcd, 0xdb, 0xb8, 0xef, 0x3d, + 0x29, 0xc2, 0x22, 0xe6, 0x2f, 0x91, 0x3c, 0x2a, 0xcb, 0xeb, 0xce, 0x47, 0x9e, 0xa9, 0x77, 0x59, + 0xd4, 0x45, 0xf7, 0x51, 0xb9, 0x0e, 0x66, 0x59, 0xf0, 0xc5, 0x2a, 0xb6, 0x1d, 0xdc, 0x66, 0x11, + 0x2b, 0xf8, 0x44, 0xe5, 0x0c, 0xcc, 0xb0, 0x84, 0x25, 0xbd, 0x83, 0x6d, 0x16, 0xb4, 0x82, 0x4b, + 0x53, 0x4e, 0x42, 0x5e, 0xb7, 0xef, 0xb1, 0x4d, 0x83, 0xf8, 0xff, 0x4f, 0xaa, 0xec, 0x4d, 0xb9, + 0x01, 0x8e, 0xb2, 0x7c, 0xbe, 0xb1, 0x4a, 0x0f, 0xec, 0xf4, 0x26, 0xbb, 0xaa, 0x65, 0x98, 0xeb, + 0x96, 0xb9, 0x65, 0x61, 0xdb, 0x26, 0xa7, 0xa6, 0x26, 0xd5, 0x50, 0x0a, 0xfa, 0xcc, 0x30, 0x13, + 0x8b, 0xc4, 0x37, 0x19, 0xb8, 0x28, 0xed, 0xb6, 0x5a, 0x18, 0xb7, 0xd9, 0xc9, 0x27, 0xef, 0x35, + 0xe1, 0x1d, 0x07, 0x89, 0xa7, 0x21, 0x87, 0x74, 0xc9, 0xc1, 0x07, 0x4f, 0x40, 0x9e, 0x5e, 0x18, + 0x86, 0x5e, 0x34, 0xd7, 0x57, 0x59, 0xe7, 0x78, 0x65, 0xdd, 0x80, 0x19, 0xc3, 0x74, 0x8b, 0x5b, + 0xd7, 0x2c, 0x6d, 0xc7, 0x8e, 0x5b, 0x65, 0xa4, 0x74, 0xfd, 0x21, 0xa5, 0x1a, 0xfa, 0x6d, 0xe5, + 0x88, 0xca, 0x91, 0x51, 0xfe, 0x0f, 0x38, 0x7a, 0x9e, 0x45, 0x08, 0xb0, 0x19, 0x65, 0x29, 0xda, + 0x07, 0xaf, 0x87, 0xf2, 0x02, 0xff, 0xe7, 0xca, 0x11, 0xb5, 0x97, 0x98, 0xf2, 0x13, 0x30, 0xe7, + 0xbe, 0xb6, 0xcd, 0x8b, 0x1e, 0xe3, 0x72, 0xb4, 0x21, 0xd2, 0x43, 0x7e, 0x8d, 0xfb, 0x71, 0xe5, + 0x88, 0xda, 0x43, 0x4a, 0xa9, 0x01, 0x6c, 0x3b, 0x3b, 0x1d, 0x46, 0x38, 0x1b, 0xad, 0x92, 0x3d, + 0x84, 0x57, 0xfc, 0x9f, 0x56, 0x8e, 0xa8, 0x21, 0x12, 0xca, 0x2a, 0x4c, 0x39, 0x0f, 0x38, 0x8c, + 0x5e, 0x2e, 0x7a, 0xf3, 0xbb, 0x87, 0x5e, 0xc3, 0xfb, 0x67, 0xe5, 0x88, 0x1a, 0x10, 0x50, 0x2a, + 0x30, 0xd9, 0x3d, 0xcf, 0x88, 0xe5, 0xfb, 0x44, 0x9b, 0xef, 0x4f, 0x6c, 0xfd, 0xbc, 0x4f, 0xcb, + 0xff, 0xdd, 0x65, 0xac, 0x65, 0xef, 0x31, 0x5a, 0x13, 0xc2, 0x8c, 0x95, 0xbc, 0x7f, 0x5c, 0xc6, + 0x7c, 0x02, 0x4a, 0x05, 0xa6, 0x6c, 0x43, 0xeb, 0xda, 0xdb, 0xa6, 0x63, 0x9f, 0x9a, 0xec, 0xf1, + 0x93, 0x8c, 0xa6, 0x56, 0x67, 0xff, 0xa8, 0xc1, 0xdf, 0xca, 0x93, 0xe1, 0xc4, 0x2e, 0xb9, 0x78, + 0xbd, 0xfc, 0x80, 0x6e, 0x3b, 0xba, 0xb1, 0xe5, 0xc5, 0x98, 0xa5, 0xbd, 0x4d, 0xff, 0x8f, 0xca, + 0x3c, 0x3b, 0x31, 0x05, 0xa4, 0x6d, 0xa2, 0xde, 0xcd, 0x3a, 0x5a, 0x6c, 0xe8, 0xa0, 0xd4, 0xd3, + 0x20, 0xeb, 0x7e, 0x22, 0xbd, 0xd3, 0x5c, 0xff, 0x85, 0xc0, 0x5e, 0xdd, 0x21, 0x0d, 0xd8, 0xfd, + 0xa9, 0xa7, 0x83, 0x9b, 0xe9, 0xed, 0xe0, 0xdc, 0x06, 0xae, 0xdb, 0x6b, 0xfa, 0x16, 0xb5, 0xae, + 0x98, 0x3f, 0x7c, 0x38, 0x89, 0xce, 0x46, 0xab, 0xf8, 0x22, 0xbd, 0x41, 0xe3, 0xa8, 0x37, 0x1b, + 0xf5, 0x52, 0xd0, 0xf5, 0x30, 0x13, 0x6e, 0x64, 0xf4, 0xd6, 0x51, 0x3d, 0xb0, 0xcd, 0xd8, 0x1b, + 0xba, 0x0e, 0xe6, 0x78, 0x9d, 0x0e, 0x0d, 0x41, 0xb2, 0xd7, 0x15, 0xa2, 0x6b, 0xe1, 0x68, 0x4f, + 0xc3, 0xf2, 0x62, 0x8e, 0x64, 0x82, 0x98, 0x23, 0xd7, 0x00, 0x04, 0x5a, 0xdc, 0x97, 0xcc, 0xd5, + 0x30, 0xe5, 0xeb, 0x65, 0xdf, 0x0c, 0x5f, 0xce, 0xc0, 0xa4, 0xa7, 0x6c, 0xfd, 0x32, 0xb8, 0xe3, + 0x8f, 0x11, 0xda, 0x60, 0x60, 0xd3, 0x70, 0x2e, 0xcd, 0x1d, 0x67, 0x02, 0xb7, 0xde, 0x86, 0xee, + 0x74, 0xbc, 0xa3, 0x71, 0xbd, 0xc9, 0xca, 0x3a, 0x80, 0x4e, 0x30, 0x6a, 0x04, 0x67, 0xe5, 0x6e, + 0x49, 0xd0, 0x1e, 0xa8, 0x3e, 0x84, 0x68, 0x9c, 0xf9, 0x21, 0x76, 0x90, 0x6d, 0x0a, 0x72, 0x34, + 0xd0, 0xfa, 0x11, 0x65, 0x0e, 0xa0, 0xfc, 0x8c, 0xf5, 0xb2, 0x5a, 0x29, 0x57, 0x4b, 0xe5, 0x42, + 0x06, 0xbd, 0x54, 0x82, 0x29, 0xbf, 0x11, 0xf4, 0xad, 0x64, 0x99, 0xa9, 0xd6, 0xc0, 0x8b, 0x1d, + 0xf7, 0x37, 0xaa, 0xb0, 0x92, 0x3d, 0x15, 0x2e, 0xdf, 0xb5, 0xf1, 0x92, 0x6e, 0xd9, 0x8e, 0x6a, + 0x5e, 0x5c, 0x32, 0x2d, 0x3f, 0xaa, 0x32, 0x8b, 0x70, 0x1a, 0xf5, 0xd9, 0xb5, 0x38, 0xda, 0x98, + 0x1c, 0x9a, 0xc2, 0x16, 0x5b, 0x39, 0x0e, 0x12, 0x5c, 0xba, 0x8e, 0xa5, 0x19, 0x76, 0xd7, 0xb4, + 0xb1, 0x6a, 0x5e, 0xb4, 0x8b, 0x46, 0xbb, 0x64, 0x76, 0x76, 0x77, 0x0c, 0x9b, 0xd9, 0x0c, 0x51, + 0x9f, 0x5d, 0xe9, 0x90, 0x6b, 0x5b, 0xe7, 0x00, 0x4a, 0xb5, 0xd5, 0xd5, 0x72, 0xa9, 0x51, 0xa9, + 0x55, 0x0b, 0x47, 0x5c, 0x69, 0x35, 0x8a, 0x0b, 0xab, 0xae, 0x74, 0x7e, 0x12, 0x26, 0xbd, 0x36, + 0xcd, 0xc2, 0xa4, 0x64, 0xbc, 0x30, 0x29, 0x4a, 0x11, 0x26, 0xbd, 0x56, 0xce, 0x46, 0x84, 0xc7, + 0xf6, 0x1e, 0x8b, 0xdd, 0xd1, 0x2c, 0x87, 0xf8, 0x53, 0x7b, 0x44, 0x16, 0x34, 0x1b, 0xab, 0xfe, + 0x6f, 0x67, 0x9e, 0xc0, 0x38, 0x50, 0x60, 0xae, 0xb8, 0xba, 0xda, 0xac, 0xa9, 0xcd, 0x6a, 0xad, + 0xb1, 0x52, 0xa9, 0x2e, 0xd3, 0x11, 0xb2, 0xb2, 0x5c, 0xad, 0xa9, 0x65, 0x3a, 0x40, 0xd6, 0x0b, + 0x19, 0x7a, 0x6d, 0xf0, 0xc2, 0x24, 0xe4, 0xbb, 0x44, 0xba, 0xe8, 0x0b, 0x72, 0xc2, 0xf3, 0xf0, + 0x3e, 0x4e, 0x11, 0x17, 0x9b, 0x72, 0x3e, 0xe9, 0x52, 0x9f, 0x33, 0xa3, 0x67, 0x60, 0x86, 0xda, + 0x7a, 0x36, 0x59, 0xde, 0x27, 0xc8, 0xc9, 0x2a, 0x97, 0x86, 0x3e, 0x2c, 0x25, 0x38, 0x24, 0xdf, + 0x97, 0xa3, 0x64, 0xc6, 0xc5, 0x9f, 0x65, 0x86, 0xbb, 0x96, 0xa0, 0x52, 0x6d, 0x94, 0xd5, 0x6a, + 0x71, 0x95, 0x65, 0x91, 0x95, 0x53, 0x70, 0xbc, 0x5a, 0x63, 0x31, 0xff, 0xea, 0xcd, 0x46, 0xad, + 0x59, 0x59, 0x5b, 0xaf, 0xa9, 0x8d, 0x42, 0x4e, 0x39, 0x09, 0x0a, 0x7d, 0x6e, 0x56, 0xea, 0xcd, + 0x52, 0xb1, 0x5a, 0x2a, 0xaf, 0x96, 0x17, 0x0b, 0x79, 0xe5, 0x71, 0x70, 0x2d, 0xbd, 0xe6, 0xa6, + 0xb6, 0xd4, 0x54, 0x6b, 0xe7, 0xea, 0x2e, 0x82, 0x6a, 0x79, 0xb5, 0xe8, 0x2a, 0x52, 0xe8, 0xfa, + 0xe0, 0x09, 0xe5, 0x32, 0x38, 0x4a, 0xae, 0x06, 0x5f, 0xad, 0x15, 0x17, 0x59, 0x79, 0x93, 0xca, + 0x55, 0x70, 0xaa, 0x52, 0xad, 0x6f, 0x2c, 0x2d, 0x55, 0x4a, 0x95, 0x72, 0xb5, 0xd1, 0x5c, 0x2f, + 0xab, 0x6b, 0x95, 0x7a, 0xdd, 0xfd, 0xb7, 0x30, 0x45, 0x2e, 0x67, 0xa5, 0x7d, 0x26, 0x7a, 0xb7, + 0x0c, 0xb3, 0x67, 0xb5, 0x8e, 0xee, 0x0e, 0x14, 0xe4, 0xd6, 0xe6, 0x9e, 0xe3, 0x24, 0x0e, 0xb9, + 0xdd, 0x99, 0x39, 0xa4, 0x93, 0x17, 0xf4, 0xb3, 0x72, 0xc2, 0xe3, 0x24, 0x0c, 0x08, 0x5a, 0xe2, + 0x3c, 0x57, 0x5a, 0xc4, 0xe4, 0xe7, 0xd5, 0x52, 0x82, 0xe3, 0x24, 0xe2, 0xe4, 0x93, 0x81, 0xff, + 0xb2, 0x51, 0x81, 0x5f, 0x80, 0x99, 0x8d, 0x6a, 0x71, 0xa3, 0xb1, 0x52, 0x53, 0x2b, 0x3f, 0x4e, + 0xa2, 0x91, 0xcf, 0xc2, 0xd4, 0x52, 0x4d, 0x5d, 0xa8, 0x2c, 0x2e, 0x96, 0xab, 0x85, 0x9c, 0x72, + 0x39, 0x5c, 0x56, 0x2f, 0xab, 0x67, 0x2b, 0xa5, 0x72, 0x73, 0xa3, 0x5a, 0x3c, 0x5b, 0xac, 0xac, + 0x92, 0x3e, 0x22, 0x1f, 0x73, 0xe3, 0xf4, 0x04, 0xfa, 0xe9, 0x2c, 0x00, 0xad, 0x3a, 0xb9, 0x8c, + 0x27, 0x74, 0x2f, 0xf1, 0x9f, 0x27, 0x9d, 0x34, 0x04, 0x64, 0x22, 0xda, 0x6f, 0x05, 0x26, 0x2d, + 0xf6, 0x81, 0x2d, 0xaf, 0x0c, 0xa2, 0x43, 0x1f, 0x3d, 0x6a, 0xaa, 0xff, 0x3b, 0x7a, 0x4f, 0x92, + 0x39, 0x42, 0x24, 0x63, 0xc9, 0x90, 0x5c, 0x1a, 0x0d, 0x90, 0xe8, 0xa1, 0x0c, 0xcc, 0xf1, 0x15, + 0x73, 0x2b, 0x41, 0x8c, 0x29, 0xb1, 0x4a, 0xf0, 0x3f, 0x87, 0x8c, 0xac, 0x33, 0x4f, 0x62, 0xc3, + 0x29, 0x78, 0x2d, 0x93, 0x9e, 0x0c, 0xf7, 0x2c, 0x96, 0x42, 0xc6, 0x65, 0xde, 0x35, 0x3a, 0x0a, + 0x92, 0x32, 0x01, 0x72, 0xe3, 0x01, 0xa7, 0x20, 0xa3, 0x2f, 0xcb, 0x30, 0xcb, 0x5d, 0x7c, 0x8c, + 0x5e, 0x9d, 0x11, 0xb9, 0x94, 0x34, 0x74, 0xa5, 0x72, 0xe6, 0xa0, 0x57, 0x2a, 0x9f, 0xb9, 0x19, + 0x26, 0x58, 0x1a, 0x91, 0x6f, 0xad, 0xea, 0x9a, 0x02, 0x47, 0x61, 0x7a, 0xb9, 0xdc, 0x68, 0xd6, + 0x1b, 0x45, 0xb5, 0x51, 0x5e, 0x2c, 0x64, 0xdc, 0x81, 0xaf, 0xbc, 0xb6, 0xde, 0xb8, 0xaf, 0x20, + 0x25, 0xf7, 0xd0, 0xeb, 0x65, 0x64, 0xcc, 0x1e, 0x7a, 0x71, 0xc5, 0xa7, 0x3f, 0x57, 0xfd, 0x94, + 0x0c, 0x05, 0xca, 0x41, 0xf9, 0x81, 0x2e, 0xb6, 0x74, 0x6c, 0xb4, 0x30, 0xba, 0x20, 0x12, 0x11, + 0x74, 0x5f, 0xac, 0x3c, 0xd2, 0x9f, 0x87, 0xac, 0x44, 0xfa, 0xd2, 0x63, 0x60, 0x67, 0xf7, 0x19, + 0xd8, 0x9f, 0x4c, 0xea, 0xa2, 0xd7, 0xcb, 0xee, 0x48, 0x20, 0xfb, 0x58, 0x12, 0x17, 0xbd, 0x01, + 0x1c, 0x8c, 0x25, 0xd0, 0x6f, 0xc4, 0xf8, 0x5b, 0x90, 0xd1, 0xf3, 0x64, 0x38, 0xba, 0xa8, 0x39, + 0x78, 0xe1, 0x52, 0xc3, 0xbb, 0x98, 0x30, 0xe2, 0x32, 0xe1, 0xcc, 0xbe, 0xcb, 0x84, 0x83, 0xbb, + 0x0d, 0xa5, 0x9e, 0xbb, 0x0d, 0xd1, 0x3b, 0x92, 0x1e, 0xea, 0xeb, 0xe1, 0x61, 0x64, 0xd1, 0x78, + 0x93, 0x1d, 0xd6, 0x8b, 0xe7, 0x62, 0x0c, 0x77, 0xfb, 0x4f, 0x41, 0x81, 0xb2, 0x12, 0xf2, 0x42, + 0xfb, 0x15, 0x76, 0xff, 0x76, 0x33, 0x41, 0xd0, 0x3f, 0x2f, 0x8c, 0x82, 0xc4, 0x87, 0x51, 0xe0, + 0x16, 0x35, 0xe5, 0x5e, 0xcf, 0x81, 0xa4, 0x9d, 0x61, 0xc8, 0xe5, 0x2c, 0x3a, 0xce, 0x6a, 0x7a, + 0x9d, 0x61, 0x6c, 0xf1, 0xe3, 0xb9, 0x23, 0x96, 0xdd, 0xf3, 0x58, 0x16, 0x45, 0x26, 0xfe, 0x2a, + 0xec, 0xa4, 0xfe, 0xc7, 0x9c, 0xcb, 0x5f, 0xcc, 0xfd, 0xd0, 0xe9, 0xf9, 0x1f, 0x0f, 0xe2, 0x20, + 0x7d, 0x14, 0xbe, 0x27, 0x41, 0xb6, 0x6e, 0x5a, 0xce, 0xa8, 0x30, 0x48, 0xba, 0x67, 0x1a, 0x92, + 0x40, 0x3d, 0x7a, 0xce, 0x99, 0xde, 0x9e, 0x69, 0x7c, 0xf9, 0x63, 0x88, 0x9b, 0x78, 0x14, 0xe6, + 0x28, 0x27, 0xfe, 0xa5, 0x22, 0xdf, 0x95, 0x68, 0x7f, 0x75, 0xaf, 0x28, 0x22, 0x67, 0x60, 0x26, + 0xb4, 0x67, 0xe9, 0x81, 0xc2, 0xa5, 0xa1, 0xd7, 0x87, 0x71, 0x59, 0xe4, 0x71, 0xe9, 0x37, 0xe3, + 0xf6, 0xef, 0xe5, 0x18, 0x55, 0xcf, 0x94, 0x24, 0x04, 0x63, 0x4c, 0xe1, 0xe9, 0x23, 0xf2, 0xa0, + 0x0c, 0x79, 0xe6, 0x33, 0x36, 0x52, 0x04, 0x92, 0xb6, 0x0c, 0x5f, 0x08, 0x62, 0xbe, 0x65, 0xf2, + 0xa8, 0x5b, 0x46, 0x7c, 0xf9, 0xe9, 0xe3, 0xf0, 0xef, 0xcc, 0x19, 0xb2, 0xb8, 0xa7, 0xe9, 0x1d, + 0xed, 0x7c, 0x27, 0x41, 0xe8, 0xe3, 0x0f, 0x27, 0x3c, 0xfe, 0xe5, 0x57, 0x95, 0x2b, 0x2f, 0x42, + 0xe2, 0x3f, 0x02, 0x53, 0x96, 0xbf, 0x24, 0xe9, 0x9d, 0x8e, 0xef, 0x71, 0x44, 0x65, 0xdf, 0xd5, + 0x20, 0x67, 0xa2, 0xb3, 0x5e, 0x42, 0xfc, 0x8c, 0xe5, 0x6c, 0xca, 0x74, 0xb1, 0xdd, 0x5e, 0xc2, + 0x9a, 0xb3, 0x6b, 0xe1, 0x76, 0xa2, 0x21, 0x82, 0x17, 0xd1, 0x54, 0x58, 0x12, 0x5c, 0xf0, 0xc1, + 0x55, 0x1e, 0x9d, 0xa7, 0x0c, 0xe8, 0x0d, 0x3c, 0x5e, 0x46, 0xd2, 0x25, 0xbd, 0xd9, 0x87, 0xa4, + 0xc6, 0x41, 0xf2, 0xb4, 0xe1, 0x98, 0x18, 0xc3, 0x85, 0xee, 0x32, 0xcc, 0x51, 0x3b, 0x61, 0xd4, + 0x98, 0xfc, 0x5e, 0x42, 0x1f, 0x93, 0xd0, 0xb5, 0x4d, 0x61, 0x76, 0x46, 0x02, 0x4b, 0x12, 0x8f, + 0x14, 0x31, 0x3e, 0xd2, 0x47, 0xe6, 0x33, 0x79, 0x80, 0x90, 0xdf, 0xe0, 0x87, 0xf3, 0x41, 0x20, + 0x40, 0xf4, 0x56, 0x36, 0xff, 0xa8, 0x73, 0x51, 0xa9, 0x43, 0x3e, 0x81, 0xfe, 0x86, 0x14, 0x9f, + 0x28, 0x34, 0xaa, 0xfc, 0x59, 0x42, 0x9b, 0x97, 0x79, 0xed, 0x0d, 0x1c, 0xdc, 0x87, 0xec, 0xe5, + 0x3e, 0x92, 0xc0, 0xf8, 0x1d, 0xc4, 0x4a, 0x32, 0xd4, 0x56, 0x87, 0x98, 0xd9, 0x9f, 0x82, 0xe3, + 0x6a, 0xb9, 0xb8, 0x58, 0xab, 0xae, 0xde, 0x17, 0xbe, 0xc3, 0xa7, 0x20, 0x87, 0x27, 0x27, 0xa9, + 0xc0, 0xf6, 0x9a, 0x84, 0x7d, 0x20, 0x2f, 0xab, 0xd8, 0x1b, 0xea, 0x3f, 0x96, 0xa0, 0x57, 0x13, + 0x20, 0x7b, 0x98, 0x28, 0x3c, 0x08, 0xa1, 0x66, 0xf4, 0xf3, 0x32, 0x14, 0xdc, 0xf1, 0x90, 0x72, + 0xc9, 0x2e, 0x6b, 0xab, 0xf1, 0x6e, 0x85, 0x5d, 0xba, 0xff, 0x14, 0xb8, 0x15, 0x7a, 0x09, 0xca, + 0xf5, 0x30, 0xd7, 0xda, 0xc6, 0xad, 0x0b, 0x15, 0xc3, 0xdb, 0x57, 0xa7, 0x9b, 0xb0, 0x3d, 0xa9, + 0x3c, 0x30, 0xf7, 0xf2, 0xc0, 0xf0, 0x93, 0x68, 0x6e, 0x90, 0x0e, 0x33, 0x15, 0x81, 0xcb, 0x1f, + 0xfa, 0xb8, 0x54, 0x39, 0x5c, 0x6e, 0x1f, 0x8a, 0x6a, 0x32, 0x58, 0xaa, 0x43, 0xc0, 0x82, 0xe0, + 0x64, 0x6d, 0xbd, 0x51, 0xa9, 0x55, 0x9b, 0x1b, 0xf5, 0xf2, 0x62, 0x73, 0xc1, 0x03, 0xa7, 0x5e, + 0x90, 0xd1, 0xd7, 0x25, 0x98, 0xa0, 0x6c, 0xd9, 0xe8, 0xf1, 0x01, 0x04, 0x03, 0xfd, 0x29, 0xd1, + 0x5b, 0x84, 0xa3, 0x23, 0xf8, 0x82, 0x60, 0xe5, 0x44, 0xf4, 0x53, 0x4f, 0x85, 0x09, 0x0a, 0xb2, + 0xb7, 0xa2, 0x75, 0x3a, 0xa2, 0x97, 0x62, 0x64, 0x54, 0x2f, 0xbb, 0x60, 0xa4, 0x84, 0x01, 0x6c, + 0xa4, 0x3f, 0xb2, 0x3c, 0x2b, 0x4b, 0xcd, 0xe0, 0x73, 0xba, 0xb3, 0x4d, 0xdc, 0x2d, 0xd1, 0x8f, + 0x89, 0x2c, 0x2f, 0xde, 0x04, 0xb9, 0x3d, 0x37, 0xf7, 0x00, 0xd7, 0x55, 0x9a, 0x09, 0xbd, 0x4c, + 0x38, 0x30, 0x27, 0xa7, 0x9f, 0x3e, 0x4f, 0x11, 0xe0, 0xac, 0x41, 0xb6, 0xa3, 0xdb, 0x0e, 0x1b, + 0x3f, 0x6e, 0x4b, 0x44, 0xc8, 0x7b, 0xa8, 0x38, 0x78, 0x47, 0x25, 0x64, 0xd0, 0x3d, 0x30, 0x13, + 0x4e, 0x15, 0x70, 0xdf, 0x3d, 0x05, 0x13, 0xec, 0x58, 0x19, 0x5b, 0x62, 0xf5, 0x5e, 0x05, 0x97, + 0x35, 0x85, 0x6a, 0x9b, 0xbe, 0x0e, 0xfc, 0xbf, 0x47, 0x61, 0x62, 0x45, 0xb7, 0x1d, 0xd3, 0xba, + 0x84, 0x1e, 0xc9, 0xc0, 0xc4, 0x59, 0x6c, 0xd9, 0xba, 0x69, 0xec, 0x73, 0x35, 0xb8, 0x06, 0xa6, + 0xbb, 0x16, 0xde, 0xd3, 0xcd, 0x5d, 0x3b, 0x58, 0x9c, 0x09, 0x27, 0x29, 0x08, 0x26, 0xb5, 0x5d, + 0x67, 0xdb, 0xb4, 0x82, 0x68, 0x14, 0xde, 0xbb, 0x72, 0x1a, 0x80, 0x3e, 0x57, 0xb5, 0x1d, 0xcc, + 0x1c, 0x28, 0x42, 0x29, 0x8a, 0x02, 0x59, 0x47, 0xdf, 0xc1, 0x2c, 0x3c, 0x2d, 0x79, 0x76, 0x05, + 0x4c, 0x42, 0xbd, 0xb1, 0x90, 0x7a, 0xb2, 0xea, 0xbd, 0xa2, 0xcf, 0xc9, 0x30, 0xbd, 0x8c, 0x1d, + 0xc6, 0xaa, 0x8d, 0x9e, 0x9f, 0x11, 0xba, 0x11, 0xc2, 0x1d, 0x63, 0x3b, 0x9a, 0xed, 0xfd, 0xe7, + 0x2f, 0xc1, 0xf2, 0x89, 0x41, 0xac, 0x5c, 0x39, 0x1c, 0x28, 0x9b, 0x04, 0x4e, 0x73, 0x2a, 0xd4, + 0x2f, 0x93, 0x65, 0x66, 0x9b, 0x20, 0xfb, 0x3f, 0xa0, 0x77, 0x4a, 0xa2, 0x87, 0x8e, 0x99, 0xec, + 0xe7, 0x43, 0xf5, 0x89, 0xec, 0x8e, 0x26, 0xf7, 0x58, 0x8e, 0x7d, 0x31, 0xd0, 0xc3, 0x94, 0x18, + 0x19, 0xd5, 0xcf, 0x2d, 0x78, 0x5c, 0x79, 0x30, 0x27, 0xe9, 0x6b, 0xe3, 0xb7, 0x65, 0x98, 0xae, + 0x6f, 0x9b, 0x17, 0x3d, 0x39, 0xfe, 0xa4, 0x18, 0xb0, 0x57, 0xc1, 0xd4, 0x5e, 0x0f, 0xa8, 0x41, + 0x42, 0xf4, 0x1d, 0xed, 0xe8, 0xb9, 0x72, 0x52, 0x98, 0x42, 0xcc, 0x8d, 0xfc, 0x06, 0x75, 0xe5, + 0x29, 0x30, 0xc1, 0xb8, 0x66, 0x4b, 0x2e, 0xf1, 0x00, 0x7b, 0x99, 0xc3, 0x15, 0xcc, 0xf2, 0x15, + 0x4c, 0x86, 0x7c, 0x74, 0xe5, 0xd2, 0x47, 0xfe, 0x8f, 0x25, 0x12, 0xac, 0xc2, 0x03, 0xbe, 0x34, + 0x02, 0xe0, 0xd1, 0x77, 0x32, 0xa2, 0x0b, 0x93, 0xbe, 0x04, 0x7c, 0x0e, 0x0e, 0x74, 0xdb, 0xcb, + 0x40, 0x72, 0xe9, 0xcb, 0xf3, 0xa5, 0x59, 0x98, 0x59, 0xd4, 0x37, 0x37, 0xfd, 0x4e, 0xf2, 0x05, + 0x82, 0x9d, 0x64, 0xb4, 0x3b, 0x80, 0x6b, 0xe7, 0xee, 0x5a, 0x16, 0x36, 0xbc, 0x4a, 0xb1, 0xe6, + 0xd4, 0x93, 0xaa, 0xdc, 0x00, 0x47, 0xbd, 0x71, 0x21, 0xdc, 0x51, 0x4e, 0xa9, 0xbd, 0xc9, 0xe8, + 0x5b, 0xc2, 0xbb, 0x5a, 0x9e, 0x44, 0xc3, 0x55, 0x8a, 0x68, 0x80, 0x77, 0xc0, 0xec, 0x36, 0xcd, + 0x4d, 0xa6, 0xfe, 0x5e, 0x67, 0x79, 0xb2, 0x27, 0x18, 0xf0, 0x1a, 0xb6, 0x6d, 0x6d, 0x0b, 0xab, + 0x7c, 0xe6, 0x9e, 0xe6, 0x2b, 0x27, 0xb9, 0xda, 0x4a, 0x6c, 0x83, 0x4c, 0xa0, 0x26, 0x63, 0xd0, + 0x8e, 0x33, 0x90, 0x5d, 0xd2, 0x3b, 0x18, 0xfd, 0x82, 0x04, 0x53, 0x2a, 0x6e, 0x99, 0x46, 0xcb, + 0x7d, 0x0b, 0x39, 0x07, 0xfd, 0x63, 0x46, 0xf4, 0x4a, 0x47, 0x97, 0xce, 0xbc, 0x4f, 0x23, 0xa2, + 0xdd, 0x88, 0x5d, 0xdd, 0x18, 0x4b, 0x6a, 0x0c, 0x17, 0x70, 0xb8, 0x53, 0x8f, 0xcd, 0xcd, 0x8e, + 0xa9, 0x71, 0x8b, 0x5f, 0xbd, 0xa6, 0xd0, 0x8d, 0x50, 0xf0, 0xce, 0x80, 0x98, 0xce, 0xba, 0x6e, + 0x18, 0xfe, 0x21, 0xe3, 0x7d, 0xe9, 0xfc, 0xbe, 0x6d, 0x6c, 0x9c, 0x16, 0x52, 0x77, 0x56, 0x7a, + 0x84, 0x66, 0x5f, 0x0f, 0x73, 0xe7, 0x2f, 0x39, 0xd8, 0x66, 0xb9, 0x58, 0xb1, 0x59, 0xb5, 0x27, + 0x35, 0x14, 0x65, 0x39, 0x2e, 0x9e, 0x4b, 0x4c, 0x81, 0xc9, 0x44, 0xbd, 0x32, 0xc4, 0x0c, 0xf0, + 0x38, 0x14, 0xaa, 0xb5, 0xc5, 0x32, 0xf1, 0x55, 0xf3, 0xbc, 0x7f, 0xb6, 0xd0, 0x0b, 0x65, 0x98, + 0x21, 0xce, 0x24, 0x1e, 0x0a, 0xd7, 0x0a, 0xcc, 0x47, 0xd0, 0x17, 0x85, 0xfd, 0xd8, 0x48, 0x95, + 0xc3, 0x05, 0x44, 0x0b, 0x7a, 0x53, 0xef, 0xf4, 0x0a, 0x3a, 0xa7, 0xf6, 0xa4, 0xf6, 0x01, 0x44, + 0xee, 0x0b, 0xc8, 0xef, 0x08, 0x39, 0xb3, 0x0d, 0xe2, 0xee, 0xb0, 0x50, 0xf9, 0x5d, 0x19, 0xa6, + 0xdd, 0x49, 0x8a, 0x07, 0x4a, 0x8d, 0x03, 0xc5, 0x34, 0x3a, 0x97, 0x82, 0x65, 0x11, 0xef, 0x35, + 0x51, 0x23, 0xf9, 0x4b, 0xe1, 0x99, 0x3b, 0x11, 0x51, 0x88, 0x97, 0x31, 0xe1, 0xf7, 0x5e, 0xa1, + 0xf9, 0xfc, 0x00, 0xe6, 0x0e, 0x0b, 0xbe, 0xaf, 0xe6, 0x20, 0xbf, 0xd1, 0x25, 0xc8, 0xbd, 0x4c, + 0x16, 0x89, 0x58, 0xbe, 0xef, 0x20, 0x83, 0x6b, 0x66, 0x75, 0xcc, 0x96, 0xd6, 0x59, 0x0f, 0x4e, + 0x84, 0x05, 0x09, 0xca, 0xed, 0xcc, 0xb7, 0x91, 0x1e, 0xb7, 0xbb, 0x3e, 0x36, 0x98, 0x37, 0x91, + 0x51, 0xe8, 0xd0, 0xc8, 0x4d, 0x70, 0xac, 0xad, 0xdb, 0xda, 0xf9, 0x0e, 0x2e, 0x1b, 0x2d, 0xeb, + 0x12, 0x15, 0x07, 0x9b, 0x56, 0xed, 0xfb, 0xa0, 0xdc, 0x09, 0x39, 0xdb, 0xb9, 0xd4, 0xa1, 0xf3, + 0xc4, 0xf0, 0x19, 0x93, 0xc8, 0xa2, 0xea, 0x6e, 0x76, 0x95, 0xfe, 0x15, 0x76, 0x51, 0x9a, 0x10, + 0xbc, 0xcf, 0xf9, 0x49, 0x90, 0x37, 0x2d, 0x7d, 0x4b, 0xa7, 0xf7, 0xf3, 0xcc, 0xed, 0x8b, 0x59, + 0x47, 0x4d, 0x81, 0x1a, 0xc9, 0xa2, 0xb2, 0xac, 0xca, 0x53, 0x60, 0x4a, 0xdf, 0xd1, 0xb6, 0xf0, + 0xbd, 0xba, 0x41, 0x4f, 0xf4, 0xcd, 0xdd, 0x7a, 0x6a, 0xdf, 0xf1, 0x19, 0xf6, 0x5d, 0x0d, 0xb2, + 0xa2, 0xf7, 0x4a, 0xa2, 0x81, 0x75, 0x48, 0xdd, 0x28, 0xa8, 0x63, 0xb9, 0xd7, 0x1a, 0xbd, 0x52, + 0x28, 0xe4, 0x4d, 0x34, 0x5b, 0xe9, 0x0f, 0xde, 0x9f, 0x95, 0x60, 0x72, 0xd1, 0xbc, 0x68, 0x10, + 0x45, 0xbf, 0x4d, 0xcc, 0xd6, 0xed, 0x73, 0xc8, 0x91, 0xbf, 0x36, 0x32, 0xf6, 0x44, 0x03, 0xa9, + 0xad, 0x57, 0x64, 0x04, 0x0c, 0xb1, 0x2d, 0x47, 0xf0, 0x32, 0xbf, 0xb8, 0x72, 0xd2, 0x97, 0xeb, + 0x9f, 0xc8, 0x90, 0x5d, 0xb4, 0xcc, 0x2e, 0x7a, 0x73, 0x26, 0x81, 0xcb, 0x42, 0xdb, 0x32, 0xbb, + 0x0d, 0x72, 0x1b, 0x57, 0x70, 0x8c, 0x23, 0x9c, 0xa6, 0xdc, 0x06, 0x93, 0x5d, 0xd3, 0xd6, 0x1d, + 0x6f, 0x1a, 0x31, 0x77, 0xeb, 0x63, 0xfa, 0xb6, 0xe6, 0x75, 0x96, 0x49, 0xf5, 0xb3, 0xbb, 0xbd, + 0x36, 0x11, 0xa1, 0x2b, 0x17, 0x57, 0x8c, 0xde, 0x8d, 0x64, 0x3d, 0xa9, 0xe8, 0x45, 0x61, 0x24, + 0x9f, 0xc6, 0x23, 0xf9, 0xd8, 0x3e, 0x12, 0xb6, 0xcc, 0xee, 0x48, 0x36, 0x19, 0x5f, 0xee, 0xa3, + 0xfa, 0x74, 0x0e, 0xd5, 0x1b, 0x85, 0xca, 0x4c, 0x1f, 0xd1, 0xf7, 0x66, 0x01, 0x88, 0x99, 0xb1, + 0xe1, 0x4e, 0x80, 0xc4, 0x6c, 0xac, 0x9f, 0xcb, 0x86, 0x64, 0x59, 0xe4, 0x65, 0xf9, 0xf8, 0x08, + 0x2b, 0x86, 0x90, 0x8f, 0x90, 0x68, 0x11, 0x72, 0xbb, 0xee, 0x67, 0x26, 0x51, 0x41, 0x12, 0xe4, + 0x55, 0xa5, 0x7f, 0xa2, 0x3f, 0xce, 0x40, 0x8e, 0x24, 0x28, 0xa7, 0x01, 0xc8, 0xc0, 0x4e, 0x0f, + 0x04, 0x65, 0xc8, 0x10, 0x1e, 0x4a, 0x21, 0xda, 0xaa, 0xb7, 0xd9, 0x67, 0x6a, 0x32, 0x07, 0x09, + 0xee, 0xdf, 0x64, 0xb8, 0x27, 0xb4, 0x98, 0x01, 0x10, 0x4a, 0x71, 0xff, 0x26, 0x6f, 0xab, 0x78, + 0x93, 0x06, 0x4a, 0xce, 0xaa, 0x41, 0x82, 0xff, 0xf7, 0xaa, 0x7f, 0xbd, 0x96, 0xf7, 0x37, 0x49, + 0x71, 0x27, 0xc3, 0x44, 0x2d, 0x17, 0x82, 0x22, 0xf2, 0x24, 0x53, 0x6f, 0x32, 0x7a, 0x8d, 0xaf, + 0x36, 0x8b, 0x9c, 0xda, 0xdc, 0x92, 0x40, 0xbc, 0xe9, 0x2b, 0xcf, 0x97, 0x73, 0x30, 0x55, 0x35, + 0xdb, 0x4c, 0x77, 0x42, 0x13, 0xc6, 0x8f, 0xe5, 0x12, 0x4d, 0x18, 0x7d, 0x1a, 0x11, 0x0a, 0x72, + 0x37, 0xaf, 0x20, 0x62, 0x14, 0xc2, 0xfa, 0xa1, 0x2c, 0x40, 0x9e, 0x68, 0xef, 0xfe, 0x7b, 0x9b, + 0xe2, 0x48, 0x10, 0xd1, 0xaa, 0xec, 0xcf, 0xff, 0x70, 0x3a, 0xf6, 0x5f, 0x21, 0x47, 0x2a, 0x18, + 0xb3, 0xbb, 0xc3, 0x57, 0x54, 0x8a, 0xaf, 0xa8, 0x1c, 0x5f, 0xd1, 0x6c, 0x6f, 0x45, 0x93, 0xac, + 0x03, 0x44, 0x69, 0x48, 0xfa, 0x3a, 0xfe, 0x0f, 0x13, 0x00, 0x55, 0x6d, 0x4f, 0xdf, 0xa2, 0xbb, + 0xc3, 0x9f, 0xf3, 0xe6, 0x3f, 0x6c, 0x1f, 0xf7, 0xbf, 0x85, 0x06, 0xc2, 0xdb, 0x60, 0x82, 0x8d, + 0x7b, 0xac, 0x22, 0x57, 0x73, 0x15, 0x09, 0xa8, 0x50, 0xb3, 0xf4, 0x01, 0x47, 0xf5, 0xf2, 0x73, + 0x57, 0xcc, 0x4a, 0x3d, 0x57, 0xcc, 0xf6, 0xdf, 0x83, 0x88, 0xb8, 0x78, 0x16, 0xbd, 0x4b, 0xd8, + 0xa3, 0x3f, 0xc4, 0x4f, 0xa8, 0x46, 0x11, 0x4d, 0xf0, 0x49, 0x30, 0x61, 0xfa, 0x1b, 0xda, 0x72, + 0xe4, 0x3a, 0x58, 0xc5, 0xd8, 0x34, 0x55, 0x2f, 0xa7, 0xe0, 0xe6, 0x97, 0x10, 0x1f, 0x63, 0x39, + 0x34, 0x73, 0x72, 0xd9, 0x0b, 0x3a, 0xe5, 0xd6, 0xe3, 0x9c, 0xee, 0x6c, 0xaf, 0xea, 0xc6, 0x05, + 0x1b, 0xfd, 0x67, 0x31, 0x0b, 0x32, 0x84, 0xbf, 0x94, 0x0c, 0x7f, 0x3e, 0x66, 0x47, 0x9d, 0x47, + 0xed, 0xce, 0x28, 0x2a, 0xfd, 0xb9, 0x8d, 0x00, 0xf0, 0x76, 0xc8, 0x53, 0x46, 0x59, 0x27, 0x7a, + 0x26, 0x12, 0x3f, 0x9f, 0x92, 0xca, 0xfe, 0x40, 0xef, 0xf4, 0x71, 0x3c, 0xcb, 0xe1, 0xb8, 0x70, + 0x20, 0xce, 0x52, 0x87, 0xf4, 0xcc, 0x13, 0x61, 0x82, 0x49, 0x5a, 0x99, 0x0b, 0xb7, 0xe2, 0xc2, + 0x11, 0x05, 0x20, 0xbf, 0x66, 0xee, 0xe1, 0x86, 0x59, 0xc8, 0xb8, 0xcf, 0x2e, 0x7f, 0x0d, 0xb3, + 0x20, 0xa1, 0x57, 0x4c, 0xc2, 0xa4, 0x1f, 0xed, 0xe7, 0xb3, 0x12, 0x14, 0x4a, 0x16, 0xd6, 0x1c, + 0xbc, 0x64, 0x99, 0x3b, 0xb4, 0x46, 0xe2, 0xde, 0xa1, 0xbf, 0x26, 0xec, 0xe2, 0xe1, 0x47, 0xe1, + 0xe9, 0x2d, 0x2c, 0x02, 0x4b, 0xba, 0x08, 0x29, 0x79, 0x8b, 0x90, 0xe8, 0x4d, 0x42, 0x2e, 0x1f, + 0xa2, 0xa5, 0xa4, 0xdf, 0xd4, 0x3e, 0x29, 0x41, 0xae, 0xd4, 0x31, 0x0d, 0x1c, 0x3e, 0xc2, 0x34, + 0xf0, 0xac, 0x4c, 0xff, 0x9d, 0x08, 0xf4, 0x2c, 0x49, 0xd4, 0xd6, 0x08, 0x04, 0xe0, 0x96, 0x2d, + 0x28, 0x5b, 0xb1, 0x41, 0x2a, 0x96, 0x74, 0xfa, 0x02, 0xfd, 0xba, 0x04, 0x53, 0x34, 0x2e, 0x4e, + 0xb1, 0xd3, 0x41, 0x8f, 0x09, 0x84, 0xda, 0x27, 0x62, 0x12, 0xfa, 0x1d, 0x61, 0x17, 0x7d, 0xbf, + 0x56, 0x3e, 0xed, 0x04, 0x01, 0x82, 0x92, 0x79, 0x8c, 0x8b, 0xed, 0xa5, 0x0d, 0x64, 0x28, 0x7d, + 0x51, 0xff, 0xb9, 0xe4, 0x1a, 0x00, 0xc6, 0x85, 0x75, 0x0b, 0xef, 0xe9, 0xf8, 0x22, 0xba, 0x32, + 0x10, 0xf6, 0xfe, 0xa0, 0x1f, 0x6f, 0x10, 0x5e, 0xc4, 0x09, 0x91, 0x8c, 0xdc, 0xca, 0x9a, 0xee, + 0x04, 0x99, 0x58, 0x2f, 0xde, 0x1b, 0x89, 0x25, 0x44, 0x46, 0x0d, 0x67, 0x17, 0x5c, 0xb3, 0x89, + 0xe6, 0x22, 0x7d, 0xc1, 0x7e, 0x60, 0x02, 0x26, 0x37, 0x0c, 0xbb, 0xdb, 0xd1, 0xec, 0x6d, 0xf4, + 0x5d, 0x19, 0xf2, 0xf4, 0xb6, 0x30, 0xf4, 0x23, 0x5c, 0x6c, 0x81, 0x9f, 0xda, 0xc5, 0x96, 0xe7, + 0x82, 0x43, 0x5f, 0xfa, 0x5f, 0x66, 0x8e, 0xde, 0x2b, 0x8b, 0x4e, 0x52, 0xbd, 0x42, 0x43, 0xd7, + 0xc6, 0xf7, 0x3f, 0xce, 0xde, 0xd5, 0x5b, 0xce, 0xae, 0xe5, 0x5f, 0x8d, 0xfd, 0x04, 0x31, 0x2a, + 0xeb, 0xf4, 0x2f, 0xd5, 0xff, 0x1d, 0x69, 0x30, 0xc1, 0x12, 0xf7, 0x6d, 0x27, 0xed, 0x3f, 0x7f, + 0x7b, 0x12, 0xf2, 0x9a, 0xe5, 0xe8, 0xb6, 0xc3, 0x36, 0x58, 0xd9, 0x9b, 0xdb, 0x5d, 0xd2, 0xa7, + 0x0d, 0xab, 0xe3, 0x45, 0x21, 0xf1, 0x13, 0xd0, 0xef, 0x0a, 0xcd, 0x1f, 0xe3, 0x6b, 0x9e, 0x0c, + 0xf2, 0x7b, 0x87, 0x58, 0xa3, 0xbe, 0x1c, 0x2e, 0x53, 0x8b, 0x8d, 0x72, 0x93, 0x06, 0xad, 0xf0, + 0xe3, 0x53, 0xb4, 0xd1, 0x3b, 0xe4, 0xd0, 0xfa, 0xdd, 0x25, 0x6e, 0x8c, 0x60, 0x52, 0x0c, 0xc6, + 0x08, 0x3f, 0x21, 0x66, 0xb7, 0x9a, 0x5b, 0x84, 0x95, 0xc5, 0x17, 0x61, 0x7f, 0x4b, 0x78, 0x37, + 0xc9, 0x17, 0xe5, 0x80, 0x35, 0xc0, 0xb8, 0xdb, 0x84, 0xde, 0x27, 0xb4, 0x33, 0x34, 0xa8, 0xa4, + 0x43, 0x84, 0xed, 0xf5, 0x13, 0x30, 0xb1, 0xac, 0x75, 0x3a, 0xd8, 0xba, 0xe4, 0x0e, 0x49, 0x05, + 0x8f, 0xc3, 0x35, 0xcd, 0xd0, 0x37, 0xb1, 0xed, 0xc4, 0x77, 0x96, 0xef, 0x12, 0x8e, 0x54, 0xcb, + 0xca, 0x98, 0xef, 0xa5, 0x1f, 0x21, 0xf3, 0x9b, 0x21, 0xab, 0x1b, 0x9b, 0x26, 0xeb, 0x32, 0x7b, 0x57, 0xed, 0xbd, 0x9f, 0xc9, 0xd4, 0x85, 0x64, 0x14, 0x0c, 0x56, 0x2b, 0xc8, 0x45, 0xfa, 0x3d, - 0xe7, 0xef, 0x66, 0x61, 0xd6, 0x63, 0xa2, 0x6c, 0xb6, 0xf0, 0x03, 0xe1, 0xa5, 0x98, 0x17, 0x66, - 0x45, 0x8f, 0x83, 0xf5, 0xd6, 0x87, 0x90, 0x8a, 0x10, 0x69, 0x1d, 0xa0, 0xa9, 0x3b, 0x78, 0xcb, - 0xb2, 0x0d, 0xbf, 0x3f, 0x7c, 0x62, 0x12, 0x6a, 0x25, 0xfa, 0xf7, 0x25, 0x2d, 0x44, 0x47, 0xb9, - 0x13, 0xa6, 0xb1, 0x7f, 0xfe, 0xde, 0x5b, 0xaa, 0x89, 0xc5, 0x2b, 0x9c, 0x1f, 0x7d, 0x5e, 0xe8, - 0xd4, 0x99, 0x48, 0x35, 0x93, 0x61, 0xd6, 0x18, 0xae, 0x0d, 0x6d, 0x54, 0xd6, 0x8a, 0x5a, 0x6d, - 0xa5, 0xb8, 0xba, 0x5a, 0xae, 0x2c, 0xfb, 0x81, 0x5f, 0x14, 0x98, 0x5b, 0xac, 0x9e, 0xab, 0x84, - 0x22, 0xf3, 0x64, 0xd1, 0x3a, 0x4c, 0x7a, 0xf2, 0xea, 0xe7, 0x8b, 0x19, 0x96, 0x19, 0xf3, 0xc5, - 0x0c, 0x25, 0xb9, 0xc6, 0x99, 0xd1, 0xf4, 0x1d, 0x74, 0xc8, 0x33, 0xfa, 0x63, 0x1d, 0x72, 0x64, - 0x4d, 0x1d, 0xbd, 0x8d, 0x6c, 0x03, 0x76, 0xda, 0x7a, 0x13, 0xa3, 0x9d, 0x04, 0xd6, 0xb8, 0x77, - 0x75, 0x82, 0xb4, 0xef, 0xea, 0x04, 0xf2, 0xc8, 0xac, 0xbe, 0xe3, 0xfd, 0xd6, 0xf1, 0x35, 0x9a, - 0x85, 0x3f, 0xa0, 0x15, 0xbb, 0xbb, 0x42, 0x97, 0xff, 0x19, 0x9b, 0x11, 0x2a, 0x19, 0xcd, 0x53, - 0x32, 0x4b, 0x54, 0x6c, 0x1f, 0x26, 0x8e, 0xa3, 0x31, 0x5c, 0xef, 0x9d, 0x85, 0x5c, 0xad, 0xd3, - 0x36, 0x1c, 0xf4, 0x12, 0x69, 0x24, 0x98, 0xd1, 0xeb, 0x2e, 0xe4, 0x81, 0xd7, 0x5d, 0x04, 0xbb, - 0xae, 0x59, 0x81, 0x5d, 0xd7, 0x3a, 0x7e, 0xc0, 0xe1, 0x77, 0x5d, 0x6f, 0x63, 0xc1, 0xdb, 0xe8, - 0x9e, 0xed, 0xa3, 0xfb, 0x88, 0x94, 0x54, 0xab, 0x4f, 0x54, 0xc0, 0x33, 0x8f, 0x67, 0xc1, 0xc9, - 0x00, 0xf2, 0x0b, 0xd5, 0x7a, 0xbd, 0xba, 0x56, 0x38, 0x42, 0xa2, 0xda, 0x54, 0xd7, 0x69, 0xa8, - 0x98, 0x72, 0xa5, 0xa2, 0x6a, 0x05, 0x89, 0x84, 0x4b, 0x2b, 0xd7, 0x57, 0xd5, 0x82, 0xcc, 0xc7, - 0x3e, 0x8f, 0x35, 0xbf, 0xf9, 0xb2, 0xd3, 0x54, 0x2f, 0x31, 0x43, 0x3c, 0x9a, 0x9f, 0xf4, 0x95, - 0xeb, 0x37, 0x64, 0xc8, 0xad, 0x61, 0x7b, 0x0b, 0xa3, 0x9f, 0x4b, 0xb0, 0xc9, 0xb7, 0x69, 0xd8, - 0x5d, 0x1a, 0x5c, 0x2e, 0xd8, 0xe4, 0x0b, 0xa7, 0x29, 0xd7, 0xc1, 0x6c, 0x17, 0x37, 0x2d, 0xb3, - 0xe5, 0x65, 0xa2, 0xfd, 0x11, 0x9f, 0xc8, 0xdf, 0x3b, 0x2f, 0x00, 0x19, 0x61, 0x74, 0x24, 0x3b, - 0x75, 0x49, 0x80, 0xe9, 0x57, 0x6a, 0xfa, 0xc0, 0x7c, 0x47, 0x76, 0x7f, 0xea, 0x5c, 0x42, 0x2f, - 0x16, 0xde, 0x7d, 0xbd, 0x09, 0xf2, 0x44, 0x4d, 0xbd, 0x31, 0xba, 0x7f, 0x7f, 0xcc, 0xf2, 0x28, - 0x0b, 0x70, 0xac, 0x8b, 0xdb, 0xb8, 0xe9, 0xe0, 0x96, 0xdb, 0x74, 0xb5, 0x81, 0x9d, 0xc2, 0xfe, - 0xec, 0xe8, 0xcf, 0xc2, 0x00, 0xde, 0xc1, 0x03, 0x78, 0x7d, 0x1f, 0x51, 0xba, 0x15, 0x8a, 0xb6, - 0x95, 0xdd, 0x6a, 0xd4, 0xda, 0x96, 0xbf, 0x28, 0xee, 0xbd, 0xbb, 0xdf, 0xb6, 0x9d, 0x9d, 0x36, - 0xf9, 0xc6, 0x0e, 0x18, 0x78, 0xef, 0xca, 0x3c, 0x4c, 0xe8, 0xe6, 0x25, 0xf2, 0x29, 0x1b, 0x53, - 0x6b, 0x2f, 0x13, 0x7a, 0x85, 0x8f, 0xfc, 0x5d, 0x1c, 0xf2, 0x8f, 0x15, 0x63, 0x37, 0x7d, 0xe0, - 0x7f, 0x71, 0x02, 0x72, 0xeb, 0x7a, 0xd7, 0xc1, 0xe8, 0xff, 0x92, 0x45, 0x91, 0xbf, 0x1e, 0xe6, - 0x36, 0xad, 0xe6, 0x6e, 0x17, 0xb7, 0xf8, 0x46, 0xd9, 0x93, 0x3a, 0x0a, 0xcc, 0x95, 0x1b, 0xa1, - 0xe0, 0x25, 0x32, 0xb2, 0xde, 0x36, 0xfc, 0xbe, 0x74, 0x12, 0x49, 0xbb, 0xbb, 0xae, 0xdb, 0x4e, - 0x75, 0x93, 0xa4, 0xf9, 0x91, 0xb4, 0xc3, 0x89, 0x1c, 0xf4, 0xf9, 0x18, 0xe8, 0x27, 0xa2, 0xa1, - 0x9f, 0x14, 0x80, 0x5e, 0x29, 0xc2, 0xe4, 0xa6, 0xd1, 0xc6, 0xe4, 0x87, 0x29, 0xf2, 0x43, 0xbf, - 0x31, 0x89, 0xc8, 0xde, 0x1f, 0x93, 0x96, 0x8c, 0x36, 0xd6, 0xfc, 0xdf, 0xbc, 0x89, 0x0c, 0x04, - 0x13, 0x99, 0x55, 0xea, 0x4f, 0xeb, 0x1a, 0x5e, 0xa6, 0xbe, 0x83, 0xbd, 0xc5, 0x37, 0x93, 0x1d, - 0x6e, 0x69, 0xe9, 0x8e, 0x4e, 0xc0, 0x98, 0xd1, 0xc8, 0x33, 0xef, 0x17, 0x22, 0xf7, 0xfa, 0x85, - 0x3c, 0x4b, 0x4e, 0xd6, 0x23, 0x7a, 0xcc, 0x46, 0xb4, 0xa8, 0xf3, 0x1e, 0x40, 0xd4, 0x52, 0xf4, - 0xdf, 0x5d, 0x60, 0x9a, 0xba, 0x8d, 0x9d, 0xf5, 0xb0, 0x27, 0x46, 0x4e, 0xe3, 0x13, 0x89, 0x2b, - 0x5f, 0xb7, 0xa6, 0xef, 0x60, 0x52, 0x58, 0xc9, 0xfd, 0xc6, 0x5c, 0xb4, 0xf6, 0xa5, 0x07, 0xfd, - 0x6f, 0x6e, 0xd4, 0xfd, 0x6f, 0xbf, 0x3a, 0xa6, 0xdf, 0x0c, 0x5f, 0x9d, 0x05, 0xb9, 0xb4, 0xeb, - 0x3c, 0xa2, 0xbb, 0xdf, 0x1f, 0x08, 0xfb, 0xb9, 0xb0, 0xfe, 0x2c, 0xf2, 0xa2, 0xf9, 0x31, 0xf5, - 0xbe, 0x09, 0xb5, 0x44, 0xcc, 0x9f, 0x26, 0xaa, 0x6e, 0x63, 0xb8, 0xd7, 0x40, 0xf6, 0x1d, 0x2c, - 0x1f, 0xcc, 0x1c, 0xdc, 0x34, 0x47, 0xb4, 0x7f, 0x0a, 0xf5, 0x0c, 0xfe, 0xbb, 0xd7, 0xf1, 0x64, - 0xb9, 0x58, 0x7d, 0x64, 0x7b, 0x9d, 0x88, 0x72, 0x46, 0xa3, 0x2f, 0xe8, 0xa5, 0xc2, 0x6e, 0xe7, - 0x54, 0x6c, 0xb1, 0xae, 0x84, 0xc9, 0x6c, 0x2a, 0xb1, 0xcb, 0x44, 0x63, 0x8a, 0x4d, 0x1f, 0xb0, - 0x6f, 0x87, 0x5d, 0x05, 0x8b, 0x07, 0x46, 0x0c, 0xbd, 0x52, 0x78, 0x3b, 0x8a, 0x56, 0x7b, 0xc0, - 0x7a, 0x61, 0x32, 0x79, 0x8b, 0x6d, 0x56, 0xc5, 0x16, 0x9c, 0xbe, 0xc4, 0xbf, 0x25, 0x43, 0x9e, - 0x6e, 0x41, 0xa2, 0x37, 0x66, 0x12, 0xdc, 0xc2, 0xee, 0xf0, 0x2e, 0x84, 0xfe, 0x7b, 0x92, 0x35, - 0x07, 0xce, 0xd5, 0x30, 0x9b, 0xc8, 0xd5, 0x90, 0x3f, 0xc7, 0x29, 0xd0, 0x8e, 0x68, 0x1d, 0x53, - 0x9e, 0x4e, 0x26, 0x69, 0x61, 0x7d, 0x19, 0x4a, 0x1f, 0xef, 0xe7, 0xe4, 0x60, 0x86, 0x16, 0x7d, - 0xce, 0x68, 0x6d, 0x61, 0x07, 0xbd, 0x43, 0xfa, 0xe1, 0x41, 0x5d, 0xa9, 0xc0, 0xcc, 0x45, 0xc2, - 0xf6, 0xaa, 0x7e, 0xc9, 0xda, 0x75, 0xd8, 0xca, 0xc5, 0x8d, 0xb1, 0xeb, 0x1e, 0xb4, 0x9e, 0xf3, - 0xf4, 0x0f, 0x8d, 0xfb, 0xdf, 0x95, 0x31, 0x5d, 0xf0, 0xa7, 0x0e, 0x5c, 0x79, 0x62, 0x64, 0x85, - 0x93, 0x94, 0x93, 0x90, 0xdf, 0x33, 0xf0, 0xc5, 0x72, 0x8b, 0x59, 0xb7, 0xec, 0x0d, 0x7d, 0x50, - 0x78, 0xdf, 0x36, 0x0c, 0x37, 0xe3, 0x25, 0x5d, 0x2d, 0x14, 0xdb, 0xbd, 0x1d, 0xc8, 0xd6, 0x18, - 0xce, 0x14, 0xf3, 0x97, 0x75, 0x96, 0x12, 0x28, 0x62, 0x94, 0xe1, 0xcc, 0x87, 0xf2, 0x88, 0x3d, - 0xb1, 0x42, 0x05, 0x30, 0xe2, 0x7b, 0x3c, 0xc5, 0xe2, 0x4b, 0x0c, 0x28, 0x3a, 0x7d, 0xc9, 0xbf, - 0x46, 0x86, 0xa9, 0x1a, 0x76, 0x96, 0x0c, 0xdc, 0x6e, 0x75, 0x91, 0x7d, 0x70, 0xd3, 0xe8, 0x66, - 0xc8, 0x6f, 0x12, 0x62, 0x83, 0xce, 0x2d, 0xb0, 0x6c, 0xe8, 0xd5, 0x92, 0xe8, 0x8e, 0x30, 0x5b, - 0x7d, 0xf3, 0xb8, 0x1d, 0x09, 0x4c, 0x62, 0x1e, 0xbd, 0xf1, 0x25, 0x8f, 0x21, 0xb0, 0xad, 0x0c, - 0x33, 0xec, 0x76, 0xbf, 0x62, 0xdb, 0xd8, 0x32, 0xd1, 0xee, 0x08, 0x5a, 0x88, 0x72, 0x0b, 0xe4, - 0x74, 0x97, 0x1a, 0xdb, 0x7a, 0x45, 0x7d, 0x3b, 0x4f, 0x52, 0x9e, 0x46, 0x33, 0x26, 0x08, 0x23, - 0x19, 0x28, 0xb6, 0xc7, 0xf3, 0x18, 0xc3, 0x48, 0x0e, 0x2c, 0x3c, 0x7d, 0xc4, 0xbe, 0x22, 0xc3, - 0x71, 0xc6, 0xc0, 0x59, 0x6c, 0x3b, 0x46, 0x53, 0x6f, 0x53, 0xe4, 0x9e, 0x97, 0x19, 0x05, 0x74, - 0x2b, 0x30, 0xbb, 0x17, 0x26, 0xcb, 0x20, 0x3c, 0xd3, 0x17, 0x42, 0x8e, 0x01, 0x8d, 0xff, 0x31, - 0x41, 0x38, 0x3e, 0x4e, 0xaa, 0x1c, 0xcd, 0x31, 0x86, 0xe3, 0x13, 0x66, 0x22, 0x7d, 0x88, 0x5f, - 0xc4, 0x42, 0xf3, 0x04, 0xdd, 0xe7, 0x17, 0x84, 0xb1, 0xdd, 0x80, 0x69, 0x82, 0x25, 0xfd, 0x91, - 0x2d, 0x43, 0xc4, 0x28, 0xb1, 0xdf, 0xef, 0xb0, 0x0b, 0xc3, 0xfc, 0x7f, 0xb5, 0x30, 0x1d, 0x74, - 0x0e, 0x20, 0xf8, 0x14, 0xee, 0xa4, 0x33, 0x51, 0x9d, 0xb4, 0x24, 0xd6, 0x49, 0xbf, 0x41, 0x38, - 0x58, 0x4a, 0x7f, 0xb6, 0x0f, 0xae, 0x1e, 0x62, 0x61, 0x32, 0x06, 0x97, 0x9e, 0xbe, 0x5e, 0xbc, - 0x22, 0xdb, 0x7b, 0x8d, 0xfb, 0x47, 0x46, 0x32, 0x9f, 0x0a, 0xf7, 0x07, 0x72, 0x4f, 0x7f, 0x70, - 0x00, 0x4b, 0xfa, 0x06, 0x38, 0x4a, 0x8b, 0x28, 0xf9, 0x6c, 0xe5, 0x68, 0x28, 0x88, 0x9e, 0x64, - 0xf4, 0xd1, 0x21, 0x94, 0x60, 0xd0, 0x1d, 0xf3, 0x71, 0x9d, 0x5c, 0x32, 0x63, 0x37, 0xa9, 0x82, - 0x1c, 0xde, 0xd5, 0xf4, 0xdf, 0xcc, 0x52, 0x6b, 0x77, 0x83, 0xdc, 0xe9, 0x86, 0xfe, 0x22, 0x3b, - 0x8a, 0x11, 0xe1, 0x6e, 0xc8, 0x12, 0x17, 0x77, 0x39, 0x72, 0x49, 0x23, 0x28, 0x32, 0xb8, 0x70, - 0x0f, 0x3f, 0xe0, 0xac, 0x1c, 0xd1, 0xc8, 0x9f, 0xca, 0x8d, 0x70, 0xf4, 0xbc, 0xde, 0xbc, 0xb0, - 0x65, 0x5b, 0xbb, 0xe4, 0xf6, 0x2b, 0x8b, 0x5d, 0xa3, 0x45, 0xae, 0x23, 0xe4, 0x3f, 0x28, 0xb7, - 0x7a, 0xa6, 0x43, 0x6e, 0x90, 0xe9, 0xb0, 0x72, 0x84, 0x19, 0x0f, 0xca, 0xe3, 0xfd, 0x4e, 0x27, - 0x1f, 0xdb, 0xe9, 0xac, 0x1c, 0xf1, 0xba, 0x1d, 0x65, 0x11, 0x26, 0x5b, 0xc6, 0x1e, 0xd9, 0xaa, - 0x26, 0xb3, 0xae, 0x41, 0x47, 0x97, 0x17, 0x8d, 0x3d, 0xba, 0xb1, 0xbd, 0x72, 0x44, 0xf3, 0xff, - 0x54, 0x96, 0x61, 0x8a, 0x6c, 0x0b, 0x10, 0x32, 0x93, 0x89, 0x8e, 0x25, 0xaf, 0x1c, 0xd1, 0x82, - 0x7f, 0x5d, 0xeb, 0x23, 0x4b, 0xce, 0x7e, 0xdc, 0xe5, 0x6d, 0xb7, 0x67, 0x12, 0x6d, 0xb7, 0xbb, - 0xb2, 0xa0, 0x1b, 0xee, 0x27, 0x21, 0xd7, 0x24, 0x12, 0x96, 0x98, 0x84, 0xe9, 0xab, 0x72, 0x07, - 0x64, 0x77, 0x74, 0xdb, 0x9b, 0x3c, 0x5f, 0x3f, 0x98, 0xee, 0x9a, 0x6e, 0x5f, 0x70, 0x11, 0x74, - 0xff, 0x5a, 0x98, 0x80, 0x1c, 0x11, 0x9c, 0xff, 0x80, 0xde, 0x9c, 0xa5, 0x66, 0x48, 0xc9, 0x32, - 0xdd, 0x61, 0xbf, 0x6e, 0x79, 0x07, 0x64, 0x3e, 0x98, 0x19, 0x8d, 0x05, 0xd9, 0xf7, 0xde, 0x73, - 0x39, 0xf2, 0xde, 0xf3, 0x9e, 0x0b, 0x78, 0xb3, 0xbd, 0x17, 0xf0, 0x06, 0xcb, 0x07, 0xb9, 0xc1, - 0x8e, 0x2a, 0x7f, 0x36, 0x84, 0xe9, 0xd2, 0x2b, 0x88, 0xe8, 0x19, 0x78, 0xdb, 0x30, 0x43, 0x75, - 0xf6, 0x5e, 0x13, 0x76, 0x4a, 0x49, 0x8d, 0x9a, 0x01, 0xec, 0xa5, 0xdf, 0x37, 0xfd, 0x76, 0x16, - 0x4e, 0xd1, 0x6b, 0x9e, 0xf7, 0x70, 0xdd, 0xe2, 0xef, 0x9b, 0x44, 0x9f, 0x1c, 0x89, 0xd2, 0xf4, - 0x19, 0x70, 0xe4, 0xbe, 0x03, 0xce, 0xbe, 0x43, 0xca, 0xd9, 0x01, 0x87, 0x94, 0x73, 0xc9, 0x56, - 0x0e, 0xdf, 0x1f, 0xd6, 0x9f, 0x75, 0x5e, 0x7f, 0x6e, 0x8f, 0x00, 0xa8, 0x9f, 0x5c, 0x46, 0x62, - 0xdf, 0xbc, 0xcd, 0xd7, 0x94, 0x1a, 0xa7, 0x29, 0x77, 0x0d, 0xcf, 0x48, 0xfa, 0xda, 0xf2, 0x07, - 0x59, 0xb8, 0x2c, 0x60, 0xa6, 0x82, 0x2f, 0x32, 0x45, 0xf9, 0xdc, 0x48, 0x14, 0x25, 0x79, 0x0c, - 0x84, 0xb4, 0x35, 0xe6, 0x4f, 0x84, 0xcf, 0x0e, 0xf5, 0x02, 0xe5, 0xcb, 0x26, 0x42, 0x59, 0x4e, - 0x42, 0x9e, 0xf6, 0x30, 0x0c, 0x1a, 0xf6, 0x96, 0xb0, 0xbb, 0x11, 0x3b, 0x71, 0x24, 0xca, 0xdb, - 0x18, 0xf4, 0x87, 0xad, 0x6b, 0xd4, 0x77, 0x6d, 0xb3, 0x6c, 0x3a, 0x16, 0xfa, 0x85, 0x91, 0x28, - 0x8e, 0xef, 0x0d, 0x27, 0x0f, 0xe3, 0x0d, 0x37, 0xd4, 0x2a, 0x87, 0x57, 0x83, 0x43, 0x59, 0xe5, - 0x88, 0x28, 0x3c, 0x7d, 0xfc, 0xde, 0x2a, 0xc3, 0x49, 0x36, 0xd9, 0x5a, 0xe0, 0x2d, 0x44, 0x74, - 0xdf, 0x28, 0x80, 0x3c, 0xee, 0x99, 0x49, 0xec, 0x96, 0x33, 0xf2, 0xc2, 0x9f, 0x94, 0x8a, 0xbd, - 0xdf, 0x81, 0x9b, 0x0e, 0xf6, 0x70, 0x38, 0x12, 0xa4, 0xc4, 0xae, 0x75, 0x48, 0xc0, 0x46, 0xfa, - 0x98, 0xbd, 0x40, 0x86, 0x3c, 0xbb, 0xde, 0x7f, 0x23, 0x15, 0x87, 0x09, 0x3e, 0xca, 0xb3, 0xc0, - 0x8e, 0x5c, 0xe2, 0x4b, 0xee, 0xd3, 0xdb, 0x8b, 0x3b, 0xa4, 0x5b, 0xec, 0xbf, 0x23, 0xc1, 0x74, - 0x0d, 0x3b, 0x25, 0xdd, 0xb6, 0x0d, 0x7d, 0x6b, 0x54, 0x1e, 0xdf, 0xa2, 0xde, 0xc3, 0xe8, 0xbb, - 0x19, 0xd1, 0xf3, 0x34, 0xfe, 0x42, 0xb8, 0xc7, 0x6a, 0x44, 0x2c, 0xc1, 0x87, 0x85, 0xce, 0xcc, - 0x0c, 0xa2, 0x36, 0x06, 0x8f, 0x6d, 0x09, 0x26, 0xbc, 0xb3, 0x78, 0x37, 0x73, 0xe7, 0x33, 0xb7, - 0x9d, 0x1d, 0xef, 0x18, 0x0c, 0x79, 0xde, 0x7f, 0x06, 0x0c, 0xbd, 0x3c, 0xa1, 0xa3, 0x7c, 0xfc, - 0x41, 0xc2, 0x64, 0x6d, 0x2c, 0x89, 0x3b, 0xfc, 0x61, 0x1d, 0x1d, 0xfc, 0xbd, 0x09, 0xb6, 0x1c, - 0xb9, 0xaa, 0x3b, 0xf8, 0x01, 0xf4, 0x05, 0x19, 0x26, 0x6a, 0xd8, 0x71, 0xc7, 0x5b, 0xee, 0x72, - 0xd3, 0x61, 0x35, 0x5c, 0x09, 0xad, 0x78, 0x4c, 0xb1, 0x35, 0x8c, 0x7b, 0x60, 0xaa, 0x63, 0x5b, - 0x4d, 0xdc, 0xed, 0xb2, 0xd5, 0x8b, 0xb0, 0xa3, 0x5a, 0xbf, 0xd1, 0x9f, 0xb0, 0x36, 0xbf, 0xee, - 0xfd, 0xa3, 0x05, 0xbf, 0x27, 0x35, 0x03, 0x28, 0x25, 0x56, 0xc1, 0x71, 0x9b, 0x01, 0x71, 0x85, - 0xa7, 0x0f, 0xf4, 0x67, 0x64, 0x98, 0xa9, 0x61, 0xc7, 0x97, 0x62, 0x82, 0x4d, 0x8e, 0x68, 0x78, - 0x39, 0x28, 0xe5, 0x83, 0x41, 0x29, 0x7e, 0x35, 0x20, 0x2f, 0x4d, 0x9f, 0xd8, 0x18, 0xaf, 0x06, - 0x14, 0xe3, 0x60, 0x0c, 0xc7, 0xd7, 0x1e, 0x0d, 0x53, 0x84, 0x17, 0xd2, 0x60, 0x7f, 0x25, 0x1b, - 0x34, 0xde, 0x2f, 0xa6, 0xd4, 0x78, 0xef, 0x84, 0xdc, 0x8e, 0x6e, 0x5f, 0xe8, 0x92, 0x86, 0x3b, - 0x2d, 0x62, 0xb6, 0xaf, 0xb9, 0xd9, 0x35, 0xfa, 0x57, 0x7f, 0x3f, 0xcd, 0x5c, 0x32, 0x3f, 0xcd, - 0x87, 0xa5, 0x44, 0x23, 0x21, 0x9d, 0x3b, 0x8c, 0xb0, 0xc9, 0x27, 0x18, 0x37, 0x63, 0xca, 0x4e, - 0x5f, 0x39, 0x9e, 0x27, 0xc3, 0xa4, 0x3b, 0x6e, 0x13, 0x7b, 0xfc, 0xdc, 0xc1, 0xd5, 0xa1, 0xbf, - 0xa1, 0x9f, 0xb0, 0x07, 0xf6, 0x24, 0x32, 0x3a, 0xf3, 0x3e, 0x41, 0x0f, 0x1c, 0x57, 0x78, 0xfa, - 0x78, 0xbc, 0x9d, 0xe2, 0x41, 0xda, 0x03, 0x7a, 0x9d, 0x0c, 0xf2, 0x32, 0x76, 0xc6, 0x6d, 0x45, - 0xbe, 0x45, 0x38, 0xc4, 0x11, 0x27, 0x30, 0xc2, 0xf3, 0xfc, 0x32, 0x1e, 0x4d, 0x03, 0x12, 0x8b, - 0x6d, 0x24, 0xc4, 0x40, 0xfa, 0xa8, 0xbd, 0x9b, 0xa2, 0x46, 0x37, 0x17, 0x7e, 0x7e, 0x04, 0xbd, - 0xea, 0x78, 0x17, 0x3e, 0x3c, 0x01, 0x12, 0x1a, 0x87, 0xd5, 0xde, 0xfa, 0x15, 0x3e, 0x96, 0xab, - 0xf8, 0xc0, 0x6d, 0xec, 0xdb, 0xb8, 0x79, 0x01, 0xb7, 0xd0, 0xcf, 0x1c, 0x1c, 0xba, 0x53, 0x30, - 0xd1, 0xa4, 0xd4, 0x08, 0x78, 0x93, 0x9a, 0xf7, 0x9a, 0xe0, 0x5e, 0x69, 0xbe, 0x23, 0xa2, 0xbf, - 0x8f, 0xf1, 0x5e, 0x69, 0x81, 0xe2, 0xc7, 0x60, 0xb6, 0xd0, 0x59, 0x46, 0xb9, 0x69, 0x99, 0xe8, - 0xbf, 0x1c, 0x1c, 0x96, 0xab, 0x60, 0xca, 0x68, 0x5a, 0x26, 0x09, 0x43, 0xe1, 0x1d, 0x02, 0xf2, - 0x13, 0xbc, 0xaf, 0xea, 0x8e, 0x75, 0xbf, 0xc1, 0x76, 0xcd, 0x83, 0x84, 0x61, 0x8d, 0x09, 0x97, - 0xf5, 0xc3, 0x32, 0x26, 0xfa, 0x94, 0x9d, 0x3e, 0x64, 0x1f, 0x0d, 0xbc, 0xdb, 0x68, 0x57, 0xf8, - 0x88, 0x58, 0x05, 0x1e, 0x66, 0x38, 0x0b, 0xd7, 0xe2, 0x50, 0x86, 0xb3, 0x18, 0x06, 0xc6, 0x70, - 0x63, 0x45, 0x80, 0x63, 0xea, 0x6b, 0xc0, 0x07, 0x40, 0x67, 0x74, 0xe6, 0xe1, 0x90, 0xe8, 0x1c, - 0x8e, 0x89, 0xf8, 0x3e, 0x16, 0x22, 0x93, 0x59, 0x3c, 0xe8, 0xbf, 0x8e, 0x02, 0x9c, 0xdb, 0x87, - 0xf1, 0x57, 0xa0, 0xde, 0x0a, 0x09, 0x6e, 0xc4, 0xde, 0x27, 0x41, 0x97, 0xca, 0x18, 0xef, 0x8a, - 0x17, 0x29, 0x3f, 0x7d, 0x00, 0x9f, 0x2b, 0xc3, 0x1c, 0xf1, 0x11, 0x68, 0x63, 0xdd, 0xa6, 0x1d, - 0xe5, 0x48, 0x1c, 0xe5, 0xdf, 0x2e, 0x1c, 0xe0, 0x87, 0x97, 0x43, 0xc0, 0xc7, 0x48, 0xa0, 0x10, - 0x8b, 0xee, 0x23, 0xc8, 0xc2, 0x58, 0xb6, 0x51, 0x0a, 0x3e, 0x0b, 0x4c, 0xc5, 0x47, 0x83, 0x47, - 0x42, 0x8f, 0x5c, 0x5e, 0x18, 0x5e, 0x63, 0x1b, 0xb3, 0x47, 0xae, 0x08, 0x13, 0xe9, 0x63, 0xf2, - 0xba, 0x5b, 0xd8, 0x82, 0x73, 0x9d, 0x5c, 0x18, 0xff, 0xca, 0xac, 0x7f, 0xa2, 0xed, 0x33, 0x23, - 0xf1, 0xc0, 0x3c, 0x40, 0x40, 0x7c, 0x05, 0xb2, 0xb6, 0x75, 0x91, 0x2e, 0x6d, 0xcd, 0x6a, 0xe4, - 0x99, 0x5e, 0x4f, 0xd9, 0xde, 0xdd, 0x31, 0xe9, 0xc9, 0xd0, 0x59, 0xcd, 0x7b, 0x55, 0xae, 0x83, - 0xd9, 0x8b, 0x86, 0xb3, 0xbd, 0x82, 0xf5, 0x16, 0xb6, 0x35, 0xeb, 0x22, 0xf1, 0x98, 0x9b, 0xd4, - 0xf8, 0x44, 0xde, 0x7f, 0x45, 0xc0, 0xbe, 0x24, 0xb7, 0xc8, 0x8f, 0xe5, 0xf8, 0x5b, 0x12, 0xcb, - 0x33, 0x9a, 0xab, 0xf4, 0x15, 0xe6, 0x3d, 0x32, 0x4c, 0x69, 0xd6, 0x45, 0xa6, 0x24, 0xff, 0xc7, - 0xe1, 0xea, 0x48, 0xe2, 0x89, 0x1e, 0x91, 0x9c, 0xcf, 0xfe, 0xd8, 0x27, 0x7a, 0xb1, 0xc5, 0x8f, - 0xe5, 0xe4, 0xd2, 0x8c, 0x66, 0x5d, 0xac, 0x61, 0x87, 0xb6, 0x08, 0xd4, 0x18, 0x91, 0x93, 0xb5, - 0xd1, 0xa5, 0x04, 0xd9, 0x3c, 0xdc, 0x7f, 0x4f, 0xba, 0x8b, 0xe0, 0x0b, 0xc8, 0x67, 0x71, 0xdc, - 0xbb, 0x08, 0x03, 0x39, 0x18, 0x43, 0x8c, 0x14, 0x19, 0xa6, 0x35, 0xeb, 0xa2, 0x3b, 0x34, 0x2c, - 0x19, 0xed, 0xf6, 0x68, 0x46, 0xc8, 0xa4, 0xc6, 0xbf, 0x27, 0x06, 0x8f, 0x8b, 0xb1, 0x1b, 0xff, - 0x03, 0x18, 0x48, 0x1f, 0x86, 0x67, 0xd1, 0xc6, 0xe2, 0x8d, 0xd0, 0xe6, 0x68, 0x70, 0x18, 0xb6, - 0x41, 0xf8, 0x6c, 0x1c, 0x5a, 0x83, 0x88, 0xe2, 0x60, 0x2c, 0x3b, 0x27, 0x73, 0x25, 0x32, 0xcc, - 0x8f, 0xb6, 0x4d, 0xbc, 0x33, 0x99, 0x6b, 0x22, 0x1b, 0x76, 0x39, 0x46, 0x46, 0x82, 0x46, 0x02, - 0x17, 0x44, 0x01, 0x1e, 0xd2, 0xc7, 0xe3, 0x43, 0x32, 0xcc, 0x50, 0x16, 0x1e, 0x21, 0x56, 0xc0, - 0x50, 0x8d, 0x2a, 0x5c, 0x83, 0xc3, 0x69, 0x54, 0x31, 0x1c, 0x8c, 0xe5, 0x56, 0x50, 0xd7, 0x8e, - 0x1b, 0xe2, 0xf8, 0x78, 0x14, 0x82, 0x43, 0x1b, 0x63, 0x23, 0x3c, 0x42, 0x3e, 0x8c, 0x31, 0x76, - 0x48, 0xc7, 0xc8, 0x9f, 0xe5, 0xb7, 0xa2, 0x51, 0x62, 0x70, 0x80, 0xa6, 0x30, 0x42, 0x18, 0x86, - 0x6c, 0x0a, 0x87, 0x84, 0xc4, 0x57, 0x65, 0x00, 0xca, 0xc0, 0x9a, 0xb5, 0x47, 0x2e, 0xf3, 0x19, - 0x41, 0x77, 0xd6, 0xeb, 0x56, 0x2f, 0x0f, 0x70, 0xab, 0x4f, 0x18, 0xc2, 0x25, 0xe9, 0x4a, 0x60, - 0x48, 0xca, 0x6e, 0x25, 0xc7, 0xbe, 0x12, 0x18, 0x5f, 0x7e, 0xfa, 0x18, 0x7f, 0x99, 0x5a, 0x73, - 0xc1, 0x01, 0xd3, 0xdf, 0x1a, 0x09, 0xca, 0xa1, 0xd9, 0xbf, 0xcc, 0xcf, 0xfe, 0x0f, 0x80, 0xed, - 0xb0, 0x36, 0xe2, 0xa0, 0x83, 0xa3, 0xe9, 0xdb, 0x88, 0x87, 0x77, 0x40, 0xf4, 0xe7, 0xb3, 0x70, - 0x94, 0x75, 0x22, 0x3f, 0x0c, 0x10, 0x27, 0x3c, 0x87, 0xc7, 0x75, 0x92, 0x03, 0x50, 0x1e, 0xd5, - 0x82, 0x54, 0x92, 0xa5, 0x4c, 0x01, 0xf6, 0xc6, 0xb2, 0xba, 0x91, 0x57, 0x1f, 0xe8, 0xe8, 0x66, - 0x4b, 0x3c, 0xdc, 0xef, 0x00, 0xe0, 0xbd, 0xb5, 0x46, 0x99, 0x5f, 0x6b, 0xec, 0xb3, 0x32, 0x99, - 0x78, 0xe7, 0x9a, 0x88, 0x8c, 0xb2, 0x3b, 0xf6, 0x9d, 0xeb, 0xe8, 0xb2, 0xd3, 0x47, 0xe9, 0x9d, - 0x32, 0x64, 0x6b, 0x96, 0xed, 0xa0, 0x67, 0x27, 0x69, 0x9d, 0x54, 0xf2, 0x01, 0x48, 0xde, 0xbb, - 0x52, 0xe2, 0x6e, 0x69, 0xbe, 0x39, 0xfe, 0xa8, 0xb3, 0xee, 0xe8, 0xc4, 0xab, 0xdb, 0x2d, 0x3f, - 0x74, 0x5d, 0x73, 0xd2, 0x78, 0x3a, 0x54, 0x7e, 0xb5, 0xe8, 0x03, 0x18, 0xa9, 0xc5, 0xd3, 0x89, - 0x2c, 0x39, 0x7d, 0xdc, 0x1e, 0x3a, 0xca, 0x7c, 0x5b, 0x97, 0x8c, 0x36, 0x46, 0xcf, 0xa6, 0x2e, - 0x23, 0x15, 0x7d, 0x07, 0x8b, 0x1f, 0x89, 0x89, 0x75, 0x6d, 0x25, 0xf1, 0x65, 0xe5, 0x20, 0xbe, - 0x6c, 0xd2, 0x06, 0x45, 0x0f, 0xa0, 0x53, 0x96, 0xc6, 0xdd, 0xa0, 0x62, 0xca, 0x1e, 0x4b, 0x9c, - 0xce, 0x63, 0x35, 0xec, 0x50, 0xa3, 0xb2, 0xea, 0xdd, 0xc0, 0xf2, 0xb3, 0x23, 0x89, 0xd8, 0xe9, - 0x5f, 0xf0, 0x22, 0xf7, 0x5c, 0xf0, 0xf2, 0x9e, 0x30, 0x38, 0x6b, 0x3c, 0x38, 0x3f, 0x19, 0x2d, - 0x20, 0x9e, 0xc9, 0x91, 0xc0, 0xf4, 0x16, 0x1f, 0xa6, 0x75, 0x0e, 0xa6, 0x3b, 0x86, 0xe4, 0x22, - 0x7d, 0xc0, 0x7e, 0x35, 0x07, 0x47, 0xe9, 0xa4, 0xbf, 0x68, 0xb6, 0x58, 0x84, 0xd5, 0x37, 0x4a, - 0x87, 0xbc, 0xd9, 0xb6, 0x3f, 0x04, 0x2b, 0x17, 0xcb, 0x39, 0xd7, 0x7b, 0x3b, 0xfe, 0x02, 0x0d, - 0xe7, 0xea, 0x76, 0xa2, 0x64, 0xa7, 0x4d, 0xfc, 0x86, 0x7c, 0xff, 0x3f, 0xfe, 0x2e, 0xa3, 0x09, - 0xf1, 0xbb, 0x8c, 0xfe, 0x34, 0xd9, 0xba, 0x1d, 0x29, 0xba, 0x47, 0xe0, 0x29, 0xdb, 0x4e, 0x09, - 0x56, 0xf4, 0x04, 0xb8, 0xfb, 0xd1, 0x70, 0x27, 0x0b, 0x22, 0x88, 0x0c, 0xe9, 0x4e, 0x46, 0x08, - 0x1c, 0xa6, 0x3b, 0xd9, 0x20, 0x06, 0xc6, 0x70, 0xab, 0x7d, 0x8e, 0xed, 0xe6, 0x93, 0x76, 0x83, - 0xfe, 0x4a, 0x4a, 0x7d, 0x94, 0xfe, 0x5e, 0x26, 0x91, 0xff, 0x33, 0xe1, 0x2b, 0x7e, 0x98, 0x4e, - 0xe2, 0xd1, 0x1c, 0x47, 0x6e, 0x0c, 0xeb, 0x46, 0x12, 0xf1, 0x45, 0x3f, 0x67, 0xb4, 0x9c, 0xed, - 0x11, 0x9d, 0xe8, 0xb8, 0xe8, 0xd2, 0xf2, 0xae, 0x47, 0x26, 0x2f, 0xe8, 0xdf, 0x32, 0x89, 0x42, - 0x48, 0xf9, 0x22, 0x21, 0x6c, 0x45, 0x88, 0x38, 0x41, 0xe0, 0xa7, 0x58, 0x7a, 0x63, 0xd4, 0xe8, - 0xb3, 0x46, 0x0b, 0x5b, 0x8f, 0x40, 0x8d, 0x26, 0x7c, 0x8d, 0x4e, 0xa3, 0xe3, 0xc8, 0xfd, 0x88, - 0x6a, 0xb4, 0x2f, 0x92, 0x11, 0x69, 0x74, 0x2c, 0xbd, 0xf4, 0x65, 0xfc, 0xf2, 0x19, 0x36, 0x91, - 0x5a, 0x35, 0xcc, 0x0b, 0xe8, 0x9f, 0xf3, 0xde, 0xc5, 0xcc, 0xe7, 0x0c, 0x67, 0x9b, 0xc5, 0x82, - 0xf9, 0x03, 0xe1, 0xbb, 0x51, 0x86, 0x88, 0xf7, 0xc2, 0x87, 0x93, 0xca, 0xed, 0x0b, 0x27, 0x55, - 0x84, 0x59, 0xc3, 0x74, 0xb0, 0x6d, 0xea, 0xed, 0xa5, 0xb6, 0xbe, 0xd5, 0x3d, 0x35, 0xd1, 0xf7, - 0xf2, 0xba, 0x72, 0x28, 0x8f, 0xc6, 0xff, 0x11, 0xbe, 0xbe, 0x72, 0x92, 0xbf, 0xbe, 0x32, 0x22, - 0xfa, 0xd5, 0x54, 0x74, 0xf4, 0x2b, 0x3f, 0xba, 0x15, 0x0c, 0x0e, 0x8e, 0x2d, 0x6a, 0x1b, 0x27, - 0x0c, 0xf7, 0x77, 0xb3, 0x60, 0x14, 0x36, 0x3f, 0xf4, 0xe3, 0xab, 0xe4, 0x44, 0xab, 0x7b, 0xae, - 0x22, 0xcc, 0xf7, 0x2a, 0x41, 0x62, 0x0b, 0x35, 0x5c, 0x79, 0xb9, 0xa7, 0xf2, 0xbe, 0xc9, 0x93, - 0x15, 0x30, 0x79, 0xc2, 0x4a, 0x95, 0x13, 0x53, 0xaa, 0x24, 0x8b, 0x85, 0x22, 0xb5, 0x1d, 0xc3, - 0x69, 0xa4, 0x1c, 0x1c, 0xf3, 0xa2, 0xdd, 0x76, 0x3a, 0x58, 0xb7, 0x75, 0xb3, 0x89, 0xd1, 0x47, - 0xa5, 0x51, 0x98, 0xbd, 0x4b, 0x30, 0x69, 0x34, 0x2d, 0xb3, 0x66, 0x3c, 0xdd, 0xbb, 0x5c, 0x2e, - 0x3e, 0xc8, 0x3a, 0x91, 0x48, 0x99, 0xfd, 0xa1, 0xf9, 0xff, 0x2a, 0x65, 0x98, 0x6a, 0xea, 0x76, - 0x8b, 0x06, 0xe1, 0xcb, 0xf5, 0x5c, 0xe4, 0x14, 0x49, 0xa8, 0xe4, 0xfd, 0xa2, 0x05, 0x7f, 0x2b, - 0x55, 0x5e, 0x88, 0xf9, 0x9e, 0x68, 0x1e, 0x91, 0xc4, 0x16, 0x83, 0x9f, 0x38, 0x99, 0xbb, 0xd2, - 0xb1, 0x71, 0x9b, 0xdc, 0x41, 0x4f, 0x7b, 0x88, 0x29, 0x2d, 0x48, 0x48, 0xba, 0x3c, 0x40, 0x8a, - 0xda, 0x87, 0xc6, 0xb8, 0x97, 0x07, 0x84, 0xb8, 0x48, 0x5f, 0x33, 0xdf, 0x96, 0x87, 0x59, 0xda, - 0xab, 0x31, 0x71, 0xa2, 0xe7, 0x92, 0x2b, 0xa4, 0x9d, 0x7b, 0xf1, 0x25, 0x54, 0x3b, 0xf8, 0x98, - 0x5c, 0x00, 0xf9, 0x82, 0x1f, 0x70, 0xd0, 0x7d, 0x4c, 0xba, 0x6f, 0xef, 0xf1, 0x35, 0x4f, 0x79, - 0x1a, 0xf7, 0xbe, 0x7d, 0x7c, 0xf1, 0xe9, 0xe3, 0xf3, 0x6b, 0x32, 0xc8, 0xc5, 0x56, 0x0b, 0x35, - 0x0f, 0x0e, 0xc5, 0x35, 0x30, 0xed, 0xb5, 0x99, 0x20, 0x06, 0x64, 0x38, 0x29, 0xe9, 0x22, 0xa8, - 0x2f, 0x9b, 0x62, 0x6b, 0xec, 0xbb, 0x0a, 0x31, 0x65, 0xa7, 0x0f, 0xca, 0x6f, 0x4d, 0xb0, 0x46, - 0xb3, 0x60, 0x59, 0x17, 0xc8, 0x51, 0x99, 0x67, 0xcb, 0x90, 0x5b, 0xc2, 0x4e, 0x73, 0x7b, 0x44, - 0x6d, 0x66, 0xd7, 0x6e, 0x7b, 0x6d, 0x66, 0xdf, 0x7d, 0xf8, 0x83, 0x6d, 0x58, 0x8f, 0xad, 0x79, - 0xc2, 0xd2, 0xb8, 0xa3, 0x3b, 0xc7, 0x96, 0x9e, 0x3e, 0x38, 0xff, 0x26, 0xc3, 0x9c, 0xbf, 0xc2, - 0x45, 0x31, 0xf9, 0xd5, 0xcc, 0x23, 0x6d, 0xbd, 0x13, 0x7d, 0x2e, 0x59, 0x88, 0x34, 0x5f, 0xa6, - 0x7c, 0xcd, 0x52, 0x5e, 0x58, 0x4c, 0x10, 0x3c, 0x4d, 0x8c, 0xc1, 0x31, 0xcc, 0xe0, 0x65, 0x98, - 0x24, 0x0c, 0x2d, 0x1a, 0x7b, 0xc4, 0x75, 0x90, 0x5b, 0x68, 0x7c, 0xc6, 0x48, 0x16, 0x1a, 0xef, - 0xe0, 0x17, 0x1a, 0x05, 0x23, 0x1e, 0x7b, 0xeb, 0x8c, 0x09, 0x7d, 0x69, 0xdc, 0xff, 0x47, 0xbe, - 0xcc, 0x98, 0xc0, 0x97, 0x66, 0x40, 0xf9, 0xe9, 0x23, 0xfa, 0xaa, 0xff, 0xc4, 0x3a, 0x5b, 0x6f, - 0x43, 0x15, 0xfd, 0xcf, 0x63, 0x90, 0x3d, 0xeb, 0x3e, 0xfc, 0xef, 0xe0, 0x46, 0xac, 0x17, 0x8f, - 0x20, 0x38, 0xc3, 0x53, 0x21, 0xeb, 0xd2, 0x67, 0xd3, 0x96, 0x1b, 0xc5, 0x76, 0x77, 0x5d, 0x46, - 0x34, 0xf2, 0x9f, 0x72, 0x12, 0xf2, 0x5d, 0x6b, 0xd7, 0x6e, 0xba, 0xe6, 0xb3, 0xab, 0x31, 0xec, - 0x2d, 0x69, 0x50, 0x52, 0x8e, 0xf4, 0xfc, 0xe8, 0x5c, 0x46, 0x43, 0x17, 0x24, 0xc9, 0xdc, 0x05, - 0x49, 0x09, 0xf6, 0x0f, 0x04, 0x78, 0x4b, 0x5f, 0x23, 0xfe, 0x8a, 0xdc, 0x15, 0xd8, 0x1a, 0x15, - 0xec, 0x11, 0x62, 0x39, 0xa8, 0x3a, 0x24, 0x75, 0xf8, 0xe6, 0x45, 0xeb, 0xc7, 0x81, 0x1f, 0xab, - 0xc3, 0xb7, 0x00, 0x0f, 0x63, 0x39, 0xa5, 0x9e, 0x67, 0x4e, 0xaa, 0xf7, 0x8d, 0x12, 0xdd, 0x2c, - 0xa7, 0xf4, 0x07, 0x42, 0x67, 0x84, 0xce, 0xab, 0x43, 0xa3, 0x73, 0x48, 0xee, 0xab, 0x7f, 0x28, - 0x93, 0x48, 0x98, 0x9e, 0x91, 0x23, 0x7e, 0xd1, 0x51, 0x62, 0x88, 0xdc, 0x31, 0x98, 0x8b, 0x03, - 0x3d, 0x3b, 0x7c, 0x68, 0x70, 0x5e, 0x74, 0x21, 0xfe, 0xc7, 0x1d, 0x1a, 0x5c, 0x94, 0x91, 0xf4, - 0x81, 0x7c, 0x2d, 0xbd, 0x58, 0xac, 0xd8, 0x74, 0x8c, 0xbd, 0x11, 0xb7, 0x34, 0x7e, 0x78, 0x49, - 0x18, 0x0d, 0x78, 0x9f, 0x84, 0x28, 0x87, 0xe3, 0x8e, 0x06, 0x2c, 0xc6, 0x46, 0xfa, 0x30, 0xfd, - 0x6d, 0xde, 0x95, 0x1e, 0x5b, 0x9b, 0x79, 0x1d, 0x5b, 0x0d, 0xc0, 0x07, 0x47, 0xeb, 0x0c, 0xcc, - 0x84, 0xa6, 0xfe, 0xde, 0x85, 0x35, 0x5c, 0x5a, 0xd2, 0x83, 0xee, 0xbe, 0xc8, 0x46, 0xbe, 0x30, - 0x90, 0x60, 0xc1, 0x57, 0x84, 0x89, 0xb1, 0xdc, 0x07, 0xe7, 0x8d, 0x61, 0x63, 0xc2, 0xea, 0x0f, - 0xc2, 0x58, 0x55, 0x79, 0xac, 0x6e, 0x13, 0x11, 0x93, 0xd8, 0x98, 0x26, 0x34, 0x6f, 0x7c, 0xab, - 0x0f, 0x97, 0xc6, 0xc1, 0xf5, 0xd4, 0xa1, 0xf9, 0x48, 0x1f, 0xb1, 0x97, 0xd0, 0xee, 0xb0, 0x46, - 0x4d, 0xf6, 0xd1, 0x74, 0x87, 0x6c, 0x36, 0x20, 0x73, 0xb3, 0x81, 0x84, 0xfe, 0xf6, 0x81, 0x1b, - 0xa9, 0xc7, 0xdc, 0x20, 0x88, 0xb2, 0x23, 0xf6, 0xb7, 0x1f, 0xc8, 0x41, 0xfa, 0xe0, 0xfc, 0xa3, - 0x0c, 0xb0, 0x6c, 0x5b, 0xbb, 0x9d, 0xaa, 0xdd, 0xc2, 0x36, 0xfa, 0x9b, 0x60, 0x02, 0xf0, 0xc2, - 0x11, 0x4c, 0x00, 0xd6, 0x01, 0xb6, 0x7c, 0xe2, 0x4c, 0xc3, 0x6f, 0x11, 0x33, 0xf7, 0x03, 0xa6, - 0xb4, 0x10, 0x0d, 0xfe, 0xca, 0xd9, 0x9f, 0xe2, 0x31, 0x8e, 0xeb, 0xb3, 0x02, 0x72, 0xa3, 0x9c, - 0x00, 0xbc, 0xdd, 0xc7, 0xba, 0xce, 0x61, 0x7d, 0xf7, 0x01, 0x38, 0x49, 0x1f, 0xf3, 0x7f, 0x9a, - 0x80, 0x69, 0xba, 0x5d, 0x47, 0x65, 0xfa, 0xf7, 0x01, 0xe8, 0xbf, 0x35, 0x02, 0xd0, 0x37, 0x60, - 0xc6, 0x0a, 0xa8, 0xd3, 0x3e, 0x35, 0xbc, 0x00, 0x13, 0x0b, 0x7b, 0x88, 0x2f, 0x8d, 0x23, 0x83, - 0x3e, 0x1c, 0x46, 0x5e, 0xe3, 0x91, 0xbf, 0x23, 0x46, 0xde, 0x21, 0x8a, 0xa3, 0x84, 0xfe, 0x1d, - 0x3e, 0xf4, 0x1b, 0x1c, 0xf4, 0xc5, 0x83, 0xb0, 0x32, 0x86, 0x70, 0xfb, 0x32, 0x64, 0xc9, 0xe9, - 0xb8, 0xdf, 0x4e, 0x71, 0x7e, 0x7f, 0x0a, 0x26, 0x48, 0x93, 0xf5, 0xe7, 0x1d, 0xde, 0xab, 0xfb, - 0x45, 0xdf, 0x74, 0xb0, 0xed, 0x7b, 0x2c, 0x78, 0xaf, 0x2e, 0x0f, 0x9e, 0x57, 0x72, 0xf7, 0x54, - 0x9e, 0x6e, 0x44, 0xfa, 0x09, 0x43, 0x4f, 0x4a, 0xc2, 0x12, 0x1f, 0xd9, 0x79, 0xb9, 0x61, 0x26, - 0x25, 0x03, 0x18, 0x49, 0x1f, 0xf8, 0xbf, 0xc8, 0xc2, 0x29, 0xba, 0xaa, 0xb4, 0x64, 0x5b, 0x3b, - 0x3d, 0xb7, 0x5b, 0x19, 0x07, 0xd7, 0x85, 0xeb, 0x61, 0xce, 0xe1, 0xfc, 0xb1, 0x99, 0x4e, 0xf4, - 0xa4, 0xa2, 0x3f, 0x0b, 0xfb, 0x54, 0x3c, 0x8d, 0x47, 0x72, 0x21, 0x46, 0x80, 0x51, 0xbc, 0x27, - 0x5e, 0xa8, 0x17, 0x64, 0x34, 0xb4, 0x48, 0x25, 0x0f, 0xb5, 0x66, 0xe9, 0xeb, 0x54, 0x4e, 0x44, - 0xa7, 0xde, 0xeb, 0xeb, 0xd4, 0xcf, 0x70, 0x3a, 0xb5, 0x7c, 0x70, 0x91, 0xa4, 0xaf, 0x5b, 0xaf, - 0xf4, 0x37, 0x86, 0xfc, 0x6d, 0xbb, 0x9d, 0x14, 0x36, 0xeb, 0xc2, 0xfe, 0x48, 0x59, 0xce, 0x1f, - 0x89, 0xbf, 0x8f, 0x22, 0xc1, 0x4c, 0x98, 0xe7, 0x3a, 0x42, 0x97, 0xe6, 0x40, 0x32, 0x3c, 0xee, - 0x24, 0xa3, 0x35, 0xd4, 0x5c, 0x37, 0xb6, 0xa0, 0x31, 0xac, 0x2d, 0xcd, 0x41, 0x7e, 0xc9, 0x68, - 0x3b, 0xd8, 0x46, 0x5f, 0x66, 0x33, 0xdd, 0x57, 0xa6, 0x38, 0x00, 0x2c, 0x42, 0x7e, 0x93, 0x94, - 0xc6, 0x4c, 0xe6, 0x9b, 0xc4, 0x5a, 0x0f, 0xe5, 0x50, 0x63, 0xff, 0x26, 0x8d, 0xce, 0xd7, 0x43, - 0x66, 0x64, 0x53, 0xe4, 0x04, 0xd1, 0xf9, 0x06, 0xb3, 0x30, 0x96, 0x8b, 0xa9, 0xf2, 0x1a, 0xde, - 0x71, 0xc7, 0xf8, 0x0b, 0xe9, 0x21, 0x5c, 0x00, 0xd9, 0x68, 0x75, 0x49, 0xe7, 0x38, 0xa5, 0xb9, - 0x8f, 0x49, 0x7d, 0x85, 0x7a, 0x45, 0x45, 0x59, 0x1e, 0xb7, 0xaf, 0x90, 0x10, 0x17, 0xe9, 0x63, - 0xf6, 0x3d, 0xe2, 0x28, 0xda, 0x69, 0xeb, 0x4d, 0xec, 0x72, 0x9f, 0x1a, 0x6a, 0xb4, 0x27, 0xcb, - 0x7a, 0x3d, 0x59, 0xa8, 0x9d, 0xe6, 0x0e, 0xd0, 0x4e, 0x87, 0x5d, 0x86, 0xf4, 0x65, 0x4e, 0x2a, - 0x7e, 0x68, 0xcb, 0x90, 0xb1, 0x6c, 0x8c, 0xe1, 0xda, 0x51, 0xef, 0x20, 0xed, 0x58, 0x5b, 0xeb, - 0xb0, 0x9b, 0x34, 0x4c, 0x58, 0x23, 0x3b, 0x34, 0x3b, 0xcc, 0x26, 0x4d, 0x34, 0x0f, 0x63, 0x40, - 0x6b, 0x8e, 0xa1, 0xf5, 0x59, 0x36, 0x8c, 0xa6, 0xbc, 0x4f, 0xda, 0xb5, 0x6c, 0x27, 0xd9, 0x3e, - 0xa9, 0xcb, 0x9d, 0x46, 0xfe, 0x4b, 0x7a, 0xf0, 0x8a, 0x3f, 0x57, 0x3d, 0xaa, 0xe1, 0x33, 0xc1, - 0xc1, 0xab, 0x41, 0x0c, 0xa4, 0x0f, 0xef, 0x9b, 0x0e, 0x69, 0xf0, 0x1c, 0xb6, 0x39, 0xb2, 0x36, - 0x30, 0xb2, 0xa1, 0x73, 0x98, 0xe6, 0x18, 0xcd, 0x43, 0xfa, 0x78, 0x7d, 0x3b, 0x34, 0x70, 0xbe, - 0x61, 0x8c, 0x03, 0xa7, 0xd7, 0x32, 0x73, 0x43, 0xb6, 0xcc, 0x61, 0xf7, 0x7f, 0x98, 0xac, 0x47, - 0x37, 0x60, 0x0e, 0xb3, 0xff, 0x13, 0xc3, 0x44, 0xfa, 0x88, 0xbf, 0x51, 0x86, 0x5c, 0x6d, 0xfc, - 0xe3, 0xe5, 0xb0, 0x73, 0x11, 0x22, 0xab, 0xda, 0xc8, 0x86, 0xcb, 0x61, 0xe6, 0x22, 0x91, 0x2c, - 0x8c, 0x21, 0xf0, 0xfe, 0x51, 0x98, 0x21, 0x4b, 0x22, 0xde, 0x36, 0xeb, 0xb7, 0xd9, 0xa8, 0xf9, - 0x70, 0x8a, 0x6d, 0xf5, 0x1e, 0x98, 0xf4, 0xf6, 0xef, 0xd8, 0xc8, 0x39, 0x2f, 0xd6, 0x3e, 0x3d, - 0x2e, 0x35, 0xff, 0xff, 0x03, 0x39, 0x43, 0x8c, 0x7c, 0xaf, 0x76, 0x58, 0x67, 0x88, 0x43, 0xdd, - 0xaf, 0xfd, 0xd3, 0x60, 0x44, 0xfd, 0x2f, 0xe9, 0x61, 0xde, 0xbb, 0x8f, 0x9b, 0xed, 0xb3, 0x8f, - 0xfb, 0xd1, 0x30, 0x96, 0x35, 0x1e, 0xcb, 0x3b, 0x45, 0x45, 0x38, 0xc2, 0xb1, 0xf6, 0x9d, 0x3e, - 0x9c, 0x67, 0x39, 0x38, 0x17, 0x0e, 0xc4, 0xcb, 0x18, 0x0e, 0x3e, 0x66, 0x83, 0x31, 0xf7, 0x63, - 0x29, 0xb6, 0xe3, 0x9e, 0x53, 0x15, 0xd9, 0x7d, 0xa7, 0x2a, 0xb8, 0x96, 0x9e, 0x3b, 0x60, 0x4b, - 0xff, 0x58, 0x58, 0x3b, 0xea, 0xbc, 0x76, 0x3c, 0x55, 0x1c, 0x91, 0xd1, 0x8d, 0xcc, 0xef, 0xf2, - 0xd5, 0xe3, 0x1c, 0xa7, 0x1e, 0xa5, 0x83, 0x31, 0x93, 0xbe, 0x7e, 0xfc, 0x91, 0x37, 0xa1, 0x3d, - 0xe4, 0xf6, 0x3e, 0xec, 0x56, 0x31, 0x27, 0xc4, 0x91, 0x8d, 0xdc, 0xc3, 0x6c, 0x15, 0x0f, 0xe2, - 0x64, 0x0c, 0xb1, 0xd8, 0x66, 0x61, 0x9a, 0xf0, 0x74, 0xce, 0x68, 0x6d, 0x61, 0x07, 0xbd, 0x8a, - 0xfa, 0x28, 0x7a, 0x91, 0x2f, 0x47, 0x14, 0x9e, 0x28, 0xea, 0xbc, 0x6b, 0x52, 0x8f, 0x0e, 0xca, - 0xe4, 0x7c, 0x88, 0xc1, 0x71, 0x47, 0x50, 0x1c, 0xc8, 0x41, 0xfa, 0x90, 0x7d, 0x98, 0xba, 0xdb, - 0xac, 0xea, 0x97, 0xac, 0x5d, 0x07, 0x3d, 0x38, 0x82, 0x0e, 0x7a, 0x01, 0xf2, 0x6d, 0x42, 0x8d, - 0x1d, 0xcb, 0x88, 0x9f, 0xee, 0x30, 0x11, 0xd0, 0xf2, 0x35, 0xf6, 0x67, 0xd2, 0xb3, 0x19, 0x81, - 0x1c, 0x29, 0x9d, 0x71, 0x9f, 0xcd, 0x18, 0x50, 0xfe, 0x58, 0xee, 0xd8, 0x99, 0x74, 0x4b, 0x37, - 0x76, 0x0c, 0x67, 0x44, 0x11, 0x1c, 0xda, 0x2e, 0x2d, 0x2f, 0x82, 0x03, 0x79, 0x49, 0x7a, 0x62, - 0x34, 0x24, 0x15, 0xf7, 0xf7, 0x71, 0x9f, 0x18, 0x8d, 0x2f, 0x3e, 0x7d, 0x4c, 0x7e, 0x83, 0xb6, - 0xac, 0xb3, 0xd4, 0xf9, 0x36, 0x45, 0xbf, 0xde, 0xa1, 0x1b, 0x0b, 0x65, 0xed, 0xf0, 0x1a, 0x4b, - 0xdf, 0xf2, 0xd3, 0x07, 0xe6, 0xbf, 0xff, 0x38, 0xe4, 0x16, 0xf1, 0xf9, 0xdd, 0x2d, 0x74, 0x07, - 0x4c, 0xd6, 0x6d, 0x8c, 0xcb, 0xe6, 0xa6, 0xe5, 0x4a, 0xd7, 0x71, 0x9f, 0x3d, 0x48, 0xd8, 0x9b, - 0x8b, 0xc7, 0x36, 0xd6, 0x5b, 0xc1, 0xf9, 0x33, 0xef, 0x15, 0xbd, 0x58, 0x82, 0x6c, 0xcd, 0xd1, - 0x1d, 0x34, 0xe5, 0x63, 0x8b, 0x1e, 0x0c, 0x63, 0x71, 0x07, 0x8f, 0xc5, 0xf5, 0x9c, 0x2c, 0x08, - 0x07, 0xf3, 0xee, 0xff, 0x11, 0x00, 0x20, 0x98, 0xbc, 0xbf, 0x6b, 0x99, 0x6e, 0x0e, 0xef, 0x08, - 0xa4, 0xf7, 0x8e, 0x5e, 0xe1, 0x8b, 0xfb, 0x2e, 0x4e, 0xdc, 0x8f, 0x15, 0x2b, 0x62, 0x0c, 0x2b, - 0x6d, 0x12, 0x4c, 0xb9, 0xa2, 0x5d, 0xc1, 0x7a, 0xab, 0x8b, 0x7e, 0x2c, 0x50, 0xfe, 0x08, 0x31, - 0xa3, 0xf7, 0x09, 0x07, 0xe3, 0xa4, 0xb5, 0xf2, 0x89, 0x47, 0x7b, 0x74, 0x78, 0x9b, 0xff, 0x12, - 0x1f, 0x8c, 0xe4, 0x66, 0xc8, 0x1a, 0xe6, 0xa6, 0xc5, 0xfc, 0x0b, 0xaf, 0x8c, 0xa0, 0xed, 0xea, - 0x84, 0x46, 0x32, 0x0a, 0x46, 0xea, 0x8c, 0x67, 0x6b, 0x2c, 0x97, 0xde, 0x65, 0xdd, 0xd2, 0xd1, - 0xff, 0x7f, 0xa0, 0xb0, 0x15, 0x05, 0xb2, 0x1d, 0xdd, 0xd9, 0x66, 0x45, 0x93, 0x67, 0xd7, 0x46, - 0xde, 0x35, 0x75, 0xd3, 0x32, 0x2f, 0xed, 0x18, 0x4f, 0xf7, 0xef, 0xd6, 0xe5, 0xd2, 0x5c, 0xce, - 0xb7, 0xb0, 0x89, 0x6d, 0xdd, 0xc1, 0xb5, 0xbd, 0x2d, 0x32, 0xc7, 0x9a, 0xd4, 0xc2, 0x49, 0x89, - 0xf5, 0xdf, 0xe5, 0x38, 0x5a, 0xff, 0x37, 0x8d, 0x36, 0x26, 0x91, 0x9a, 0x98, 0xfe, 0x7b, 0xef, - 0x89, 0xf4, 0xbf, 0x4f, 0x11, 0xe9, 0xa3, 0xf1, 0x7d, 0x09, 0x66, 0x6a, 0xae, 0xc2, 0xd5, 0x76, - 0x77, 0x76, 0x74, 0xfb, 0x12, 0xba, 0x36, 0x40, 0x25, 0xa4, 0x9a, 0x19, 0xde, 0x2f, 0xe5, 0x0f, - 0x85, 0xaf, 0x95, 0x66, 0x4d, 0x3b, 0x54, 0x42, 0xe2, 0x76, 0xf0, 0x78, 0xc8, 0xb9, 0xea, 0xed, - 0x79, 0x5c, 0xc6, 0x36, 0x04, 0x9a, 0x53, 0x30, 0xa2, 0xd5, 0x40, 0xde, 0xc6, 0x10, 0x4d, 0x43, - 0x82, 0xa3, 0x35, 0x47, 0x6f, 0x5e, 0x58, 0xb6, 0x6c, 0x6b, 0xd7, 0x31, 0x4c, 0xdc, 0x45, 0x8f, - 0x0a, 0x10, 0xf0, 0xf4, 0x3f, 0x13, 0xe8, 0x3f, 0xfa, 0xf7, 0x8c, 0xe8, 0x28, 0xea, 0x77, 0xab, - 0x61, 0xf2, 0x11, 0x01, 0xaa, 0xc4, 0xc6, 0x45, 0x11, 0x8a, 0xe9, 0x0b, 0xed, 0x0d, 0x32, 0x14, - 0xd4, 0x07, 0x3a, 0x96, 0xed, 0xac, 0x5a, 0x4d, 0xbd, 0xdd, 0x75, 0x2c, 0x1b, 0xa3, 0x6a, 0xac, - 0xd4, 0xdc, 0x1e, 0xa6, 0x65, 0x35, 0x83, 0xc1, 0x91, 0xbd, 0x85, 0xd5, 0x4e, 0xe6, 0x75, 0xfc, - 0xc3, 0xc2, 0xbb, 0x8c, 0x54, 0x2a, 0xbd, 0x1c, 0x45, 0xe8, 0x79, 0xbf, 0x2e, 0x2d, 0xd9, 0x61, - 0x09, 0xb1, 0x9d, 0x47, 0x21, 0xa6, 0xc6, 0xb0, 0x54, 0x2e, 0xc1, 0x6c, 0x6d, 0xf7, 0xbc, 0x4f, - 0xa4, 0x1b, 0x36, 0x42, 0x5e, 0x2d, 0x1c, 0xa5, 0x82, 0x29, 0x5e, 0x98, 0x50, 0x84, 0x7c, 0xaf, - 0x83, 0xd9, 0x6e, 0x38, 0x1b, 0xc3, 0x9b, 0x4f, 0x14, 0x8c, 0x4e, 0x31, 0xb8, 0xd4, 0xf4, 0x05, - 0xf8, 0x2e, 0x09, 0x66, 0xab, 0x1d, 0x6c, 0xe2, 0x16, 0xf5, 0x82, 0xe4, 0x04, 0xf8, 0xe2, 0x84, - 0x02, 0xe4, 0x08, 0x45, 0x08, 0x30, 0xf0, 0x58, 0x5e, 0xf4, 0x84, 0x17, 0x24, 0x24, 0x12, 0x5c, - 0x5c, 0x69, 0xe9, 0x0b, 0xee, 0x4b, 0x12, 0x4c, 0x6b, 0xbb, 0xe6, 0xba, 0x6d, 0xb9, 0xa3, 0xb1, - 0x8d, 0xee, 0x0c, 0x3a, 0x88, 0x9b, 0xe0, 0x58, 0x6b, 0xd7, 0x26, 0xeb, 0x4f, 0x65, 0xb3, 0x86, - 0x9b, 0x96, 0xd9, 0xea, 0x92, 0x7a, 0xe4, 0xb4, 0xfd, 0x1f, 0x6e, 0xcf, 0x3e, 0xfb, 0x1b, 0x72, - 0x06, 0x3d, 0x57, 0x38, 0xd4, 0x0d, 0xad, 0x7c, 0xa8, 0x68, 0xf1, 0x9e, 0x40, 0x30, 0xa0, 0xcd, - 0xa0, 0x12, 0xd2, 0x17, 0xee, 0x67, 0x25, 0x50, 0x8a, 0xcd, 0xa6, 0xb5, 0x6b, 0x3a, 0x35, 0xdc, - 0xc6, 0x4d, 0xa7, 0x6e, 0xeb, 0x4d, 0x1c, 0xb6, 0x9f, 0x0b, 0x20, 0xb7, 0x0c, 0x9b, 0xf5, 0xc1, - 0xee, 0x23, 0x93, 0xe3, 0x8b, 0x85, 0x77, 0x1c, 0x69, 0x2d, 0xf7, 0x97, 0x92, 0x40, 0x9c, 0x62, - 0xfb, 0x8a, 0x82, 0x05, 0xa5, 0x2f, 0xd5, 0x8f, 0x49, 0x30, 0xe5, 0xf5, 0xd8, 0x5b, 0x22, 0xc2, - 0xfc, 0x8d, 0x84, 0x93, 0x11, 0x9f, 0x78, 0x02, 0x19, 0xbe, 0x2d, 0xc1, 0xac, 0x22, 0x8a, 0x7e, - 0x32, 0xd1, 0x15, 0x93, 0x8b, 0xce, 0x7d, 0xad, 0x54, 0x1b, 0x4b, 0xd5, 0xd5, 0x45, 0x55, 0x2b, - 0xc8, 0xe8, 0xcb, 0x12, 0x64, 0xd7, 0x0d, 0x73, 0x2b, 0x1c, 0x5d, 0xe9, 0xb8, 0x6b, 0x47, 0xb6, - 0xf0, 0x03, 0xac, 0xa5, 0xd3, 0x17, 0xe5, 0x56, 0x38, 0x6e, 0xee, 0xee, 0x9c, 0xc7, 0x76, 0x75, - 0x93, 0x8c, 0xb2, 0xdd, 0xba, 0x55, 0xc3, 0x26, 0x35, 0x42, 0x73, 0x5a, 0xdf, 0x6f, 0xbc, 0x09, - 0x26, 0x30, 0x79, 0x70, 0x39, 0x89, 0x90, 0xb8, 0xcf, 0x94, 0x14, 0x62, 0x2a, 0xd1, 0xb4, 0xa1, - 0x0f, 0xf1, 0xf4, 0x35, 0xf5, 0x8f, 0x73, 0x70, 0xa2, 0x68, 0x5e, 0x22, 0x36, 0x05, 0xed, 0xe0, - 0x4b, 0xdb, 0xba, 0xb9, 0x85, 0xc9, 0x00, 0xe1, 0x4b, 0x3c, 0x1c, 0xa2, 0x3f, 0xc3, 0x87, 0xe8, - 0x57, 0x34, 0x98, 0xb0, 0xec, 0x16, 0xb6, 0x17, 0x2e, 0x11, 0x9e, 0x7a, 0x97, 0x9d, 0x59, 0x9b, - 0xec, 0x57, 0xc4, 0x3c, 0x23, 0x3f, 0x5f, 0xa5, 0xff, 0x6b, 0x1e, 0xa1, 0x33, 0x37, 0xc1, 0x04, - 0x4b, 0x53, 0x66, 0x60, 0xb2, 0xaa, 0x2d, 0xaa, 0x5a, 0xa3, 0xbc, 0x58, 0x38, 0xa2, 0x5c, 0x06, - 0x47, 0xcb, 0x75, 0x55, 0x2b, 0xd6, 0xcb, 0xd5, 0x4a, 0x83, 0xa4, 0x17, 0x32, 0xe8, 0x59, 0x59, - 0x51, 0xcf, 0xde, 0x78, 0x66, 0xfa, 0xc1, 0xaa, 0xc1, 0x44, 0x93, 0x66, 0x20, 0x43, 0xe8, 0x74, - 0xa2, 0xda, 0x31, 0x82, 0x34, 0x41, 0xf3, 0x08, 0x29, 0xa7, 0x01, 0x2e, 0xda, 0x96, 0xb9, 0x15, - 0x9c, 0x3a, 0x9c, 0xd4, 0x42, 0x29, 0xe8, 0xc1, 0x0c, 0xe4, 0xe9, 0x3f, 0xe4, 0x4a, 0x12, 0xf2, - 0x14, 0x08, 0xde, 0x7b, 0x77, 0x2d, 0x5e, 0x22, 0xaf, 0x60, 0xa2, 0xc5, 0x5e, 0x5d, 0x5d, 0xa4, - 0x32, 0xa0, 0x96, 0x30, 0xab, 0xca, 0xcd, 0x90, 0xa7, 0xff, 0x32, 0xaf, 0x83, 0xe8, 0xf0, 0xa2, - 0x34, 0x9b, 0xa0, 0x9f, 0xb2, 0xb8, 0x4c, 0xd3, 0xd7, 0xe6, 0xf7, 0x4b, 0x30, 0x59, 0xc1, 0x4e, - 0x69, 0x1b, 0x37, 0x2f, 0xa0, 0xc7, 0xf0, 0x0b, 0xa0, 0x6d, 0x03, 0x9b, 0xce, 0x7d, 0x3b, 0x6d, - 0x7f, 0x01, 0xd4, 0x4b, 0x40, 0xcf, 0x09, 0x77, 0xbe, 0x77, 0xf3, 0xfa, 0x73, 0x63, 0x9f, 0xba, - 0x7a, 0x25, 0x44, 0xa8, 0xcc, 0x49, 0xc8, 0xdb, 0xb8, 0xbb, 0xdb, 0xf6, 0x16, 0xd1, 0xd8, 0x1b, - 0x7a, 0xc8, 0x17, 0x67, 0x89, 0x13, 0xe7, 0xcd, 0xe2, 0x45, 0x8c, 0x21, 0x5e, 0x69, 0x16, 0x26, - 0xca, 0xa6, 0xe1, 0x18, 0x7a, 0x1b, 0x3d, 0x37, 0x0b, 0xb3, 0x35, 0xec, 0xac, 0xeb, 0xb6, 0xbe, - 0x83, 0x1d, 0x6c, 0x77, 0xd1, 0x77, 0xf9, 0x3e, 0xa1, 0xd3, 0xd6, 0x9d, 0x4d, 0xcb, 0xde, 0xf1, - 0x54, 0xd3, 0x7b, 0x77, 0x55, 0x73, 0x0f, 0xdb, 0xdd, 0x80, 0x2f, 0xef, 0xd5, 0xfd, 0x72, 0xd1, - 0xb2, 0x2f, 0xb8, 0x83, 0x20, 0x9b, 0xa6, 0xb1, 0x57, 0x97, 0x5e, 0xdb, 0xda, 0x5a, 0xc5, 0x7b, - 0xd8, 0x0b, 0x97, 0xe6, 0xbf, 0xbb, 0x73, 0x81, 0x96, 0x55, 0xb1, 0x1c, 0xb7, 0xd3, 0x5e, 0xb5, - 0xb6, 0x68, 0xbc, 0xd8, 0x49, 0x8d, 0x4f, 0x0c, 0x72, 0xe9, 0x7b, 0x98, 0xe4, 0xca, 0x87, 0x73, - 0xb1, 0x44, 0x65, 0x1e, 0x14, 0xff, 0xb7, 0x3a, 0x6e, 0xe3, 0x1d, 0xec, 0xd8, 0x97, 0xc8, 0xb5, - 0x10, 0x93, 0x5a, 0x9f, 0x2f, 0x6c, 0x80, 0x16, 0x9f, 0xac, 0x33, 0xe9, 0xcd, 0x73, 0x92, 0x3b, - 0xd0, 0x64, 0x5d, 0x84, 0xe2, 0x58, 0xae, 0xbd, 0x92, 0x5d, 0x6b, 0xe6, 0xa5, 0x32, 0x64, 0xc9, - 0xe0, 0xf9, 0xc6, 0x0c, 0xb7, 0xc2, 0xb4, 0x83, 0xbb, 0x5d, 0x7d, 0x0b, 0x7b, 0x2b, 0x4c, 0xec, - 0x55, 0xb9, 0x0d, 0x72, 0x6d, 0x82, 0x29, 0x1d, 0x1c, 0xae, 0xe5, 0x6a, 0xe6, 0x1a, 0x18, 0x2e, - 0x2d, 0x7f, 0x24, 0x20, 0x70, 0x6b, 0xf4, 0x8f, 0x33, 0xf7, 0x40, 0x8e, 0xc2, 0x3f, 0x05, 0xb9, - 0x45, 0x75, 0x61, 0x63, 0xb9, 0x70, 0xc4, 0x7d, 0xf4, 0xf8, 0x9b, 0x82, 0xdc, 0x52, 0xb1, 0x5e, - 0x5c, 0x2d, 0x48, 0x6e, 0x3d, 0xca, 0x95, 0xa5, 0x6a, 0x41, 0x76, 0x13, 0xd7, 0x8b, 0x95, 0x72, - 0xa9, 0x90, 0x55, 0xa6, 0x61, 0xe2, 0x5c, 0x51, 0xab, 0x94, 0x2b, 0xcb, 0x85, 0x1c, 0xfa, 0xdb, - 0x30, 0x7e, 0xb7, 0xf3, 0xf8, 0x5d, 0x17, 0xc5, 0x53, 0x3f, 0xc8, 0x5e, 0xe6, 0x43, 0x76, 0x27, - 0x07, 0xd9, 0x8f, 0x8b, 0x10, 0x19, 0x83, 0x3b, 0x53, 0x1e, 0x26, 0xd6, 0x6d, 0xab, 0x89, 0xbb, - 0x5d, 0xf4, 0x9b, 0x12, 0xe4, 0x4b, 0xba, 0xd9, 0xc4, 0x6d, 0x74, 0x45, 0x00, 0x15, 0x75, 0x15, - 0xcd, 0xf8, 0xa7, 0xc5, 0xfe, 0x31, 0x23, 0xda, 0xfb, 0x31, 0xba, 0xf3, 0x94, 0x66, 0x84, 0x7c, - 0xc4, 0x7a, 0xb9, 0x58, 0x52, 0x63, 0xb8, 0x1a, 0x47, 0x82, 0x29, 0xb6, 0x1a, 0x70, 0x1e, 0x87, - 0xe7, 0xe1, 0xdf, 0xcd, 0x88, 0x4e, 0x0e, 0xbd, 0x1a, 0xf8, 0x64, 0x22, 0xe4, 0x21, 0x36, 0x11, - 0x1c, 0x44, 0x6d, 0x0c, 0x9b, 0x87, 0x12, 0x4c, 0x6f, 0x98, 0xdd, 0x7e, 0x42, 0x11, 0x8f, 0xa3, - 0xef, 0x55, 0x23, 0x44, 0xe8, 0x40, 0x71, 0xf4, 0x07, 0xd3, 0x4b, 0x5f, 0x30, 0xdf, 0xcd, 0xc0, - 0xf1, 0x65, 0x6c, 0x62, 0xdb, 0x68, 0xd2, 0x1a, 0x78, 0x92, 0xb8, 0x93, 0x97, 0xc4, 0x63, 0x38, - 0xce, 0xfb, 0xfd, 0xc1, 0x4b, 0xe0, 0x95, 0xbe, 0x04, 0xee, 0xe6, 0x24, 0x70, 0x93, 0x20, 0x9d, - 0x31, 0xdc, 0x87, 0x3e, 0x05, 0x33, 0x15, 0xcb, 0x31, 0x36, 0x8d, 0x26, 0xf5, 0x41, 0x7b, 0x89, - 0x0c, 0xd9, 0x55, 0xa3, 0xeb, 0xa0, 0x62, 0xd0, 0x9d, 0x5c, 0x03, 0xd3, 0x86, 0xd9, 0x6c, 0xef, - 0xb6, 0xb0, 0x86, 0x75, 0xda, 0xaf, 0x4c, 0x6a, 0xe1, 0xa4, 0x60, 0x6b, 0xdf, 0x65, 0x4b, 0xf6, - 0xb6, 0xf6, 0x3f, 0x25, 0xbc, 0x0c, 0x13, 0x66, 0x81, 0x04, 0xa4, 0x8c, 0xb0, 0xbb, 0x8a, 0x30, - 0x6b, 0x86, 0xb2, 0x7a, 0x06, 0x7b, 0xef, 0x85, 0x02, 0x61, 0x72, 0x1a, 0xff, 0x07, 0x7a, 0x8f, - 0x50, 0x63, 0x1d, 0xc4, 0x50, 0x32, 0x64, 0x96, 0x86, 0x98, 0x24, 0x2b, 0x30, 0x57, 0xae, 0xd4, - 0x55, 0xad, 0x52, 0x5c, 0x65, 0x59, 0x64, 0xf4, 0x7d, 0x09, 0x72, 0x1a, 0xee, 0xb4, 0x2f, 0x85, - 0x23, 0x46, 0x33, 0x47, 0xf1, 0x8c, 0xef, 0x28, 0xae, 0x2c, 0x01, 0xe8, 0x4d, 0xb7, 0x60, 0x72, - 0xa5, 0x96, 0xd4, 0x37, 0x8e, 0x29, 0x57, 0xc1, 0xa2, 0x9f, 0x5b, 0x0b, 0xfd, 0x89, 0x9e, 0x27, - 0xbc, 0x73, 0xc4, 0x51, 0x23, 0x1c, 0x46, 0xf4, 0x09, 0xef, 0x15, 0xda, 0xec, 0x19, 0x48, 0xee, - 0x70, 0xc4, 0xff, 0x15, 0x09, 0xb2, 0x75, 0xb7, 0xb7, 0x0c, 0x75, 0x9c, 0x9f, 0x1c, 0x4e, 0xc7, - 0x5d, 0x32, 0x11, 0x3a, 0x7e, 0x17, 0xcc, 0x84, 0x35, 0x96, 0xb9, 0x4a, 0xc4, 0xaa, 0x38, 0xf7, - 0xc3, 0x30, 0x1a, 0xde, 0x87, 0x9d, 0xc3, 0x11, 0xf1, 0xc7, 0x1f, 0x0b, 0xb0, 0x86, 0x77, 0xce, - 0x63, 0xbb, 0xbb, 0x6d, 0x74, 0xd0, 0xdf, 0xc9, 0x30, 0xb5, 0x8c, 0x9d, 0x9a, 0xa3, 0x3b, 0xbb, - 0xdd, 0x9e, 0xed, 0x4e, 0xd3, 0x2a, 0xe9, 0xcd, 0x6d, 0xcc, 0xba, 0x23, 0xef, 0x15, 0xbd, 0x43, - 0x16, 0xf5, 0x27, 0x0a, 0xca, 0x99, 0xf7, 0xcb, 0x88, 0xc0, 0xe4, 0x71, 0x90, 0x6d, 0xe9, 0x8e, - 0xce, 0xb0, 0xb8, 0xa2, 0x07, 0x8b, 0x80, 0x90, 0x46, 0xb2, 0xa1, 0xdf, 0x95, 0x44, 0x1c, 0x8a, - 0x04, 0xca, 0x4f, 0x06, 0xc2, 0x7b, 0x32, 0x43, 0xa0, 0x70, 0x0c, 0x66, 0x2b, 0xd5, 0x7a, 0x63, - 0xb5, 0xba, 0xbc, 0xac, 0xba, 0xa9, 0x05, 0x59, 0x39, 0x09, 0xca, 0x7a, 0xf1, 0xbe, 0x35, 0xb5, - 0x52, 0x6f, 0x54, 0xaa, 0x8b, 0x2a, 0xfb, 0x33, 0xab, 0x1c, 0x85, 0xe9, 0x52, 0xb1, 0xb4, 0xe2, - 0x25, 0xe4, 0x94, 0x53, 0x70, 0x7c, 0x4d, 0x5d, 0x5b, 0x50, 0xb5, 0xda, 0x4a, 0x79, 0xbd, 0xe1, - 0x92, 0x59, 0xaa, 0x6e, 0x54, 0x16, 0x0b, 0x79, 0x05, 0xc1, 0xc9, 0xd0, 0x97, 0x73, 0x5a, 0xb5, - 0xb2, 0xdc, 0xa8, 0xd5, 0x8b, 0x75, 0xb5, 0x30, 0xa1, 0x5c, 0x06, 0x47, 0x4b, 0xc5, 0x0a, 0xc9, - 0x5e, 0xaa, 0x56, 0x2a, 0x6a, 0xa9, 0x5e, 0x98, 0x44, 0xff, 0x9e, 0x85, 0xe9, 0x72, 0xb7, 0xa2, - 0xef, 0xe0, 0xb3, 0x7a, 0xdb, 0x68, 0xa1, 0xe7, 0x86, 0x66, 0x1e, 0xd7, 0xc1, 0xac, 0x4d, 0x1f, - 0x71, 0xab, 0x6e, 0x60, 0x8a, 0xe6, 0xac, 0xc6, 0x27, 0xba, 0x73, 0x72, 0x93, 0x10, 0xf0, 0xe6, - 0xe4, 0xf4, 0x4d, 0x59, 0x00, 0xa0, 0x4f, 0xf5, 0xe0, 0x72, 0xd7, 0x33, 0xbd, 0xad, 0x49, 0xdf, - 0xc1, 0x5d, 0x6c, 0xef, 0x19, 0x4d, 0xec, 0xe5, 0xd4, 0x42, 0x7f, 0xa1, 0xaf, 0xca, 0xa2, 0xfb, - 0x8b, 0x21, 0x50, 0x43, 0xd5, 0x89, 0xe8, 0x0d, 0x7f, 0x59, 0x16, 0xd9, 0x1d, 0x14, 0x22, 0x99, - 0x4c, 0x53, 0x5e, 0x20, 0x0d, 0xb7, 0x6c, 0x5b, 0xaf, 0x56, 0x1b, 0xb5, 0x95, 0xaa, 0x56, 0x2f, - 0xc8, 0xca, 0x0c, 0x4c, 0xba, 0xaf, 0xab, 0xd5, 0xca, 0x72, 0x21, 0xab, 0x9c, 0x80, 0x63, 0x2b, - 0xc5, 0x5a, 0xa3, 0x5c, 0x39, 0x5b, 0x5c, 0x2d, 0x2f, 0x36, 0x4a, 0x2b, 0x45, 0xad, 0x56, 0xc8, - 0x29, 0x57, 0xc0, 0x89, 0x7a, 0x59, 0xd5, 0x1a, 0x4b, 0x6a, 0xb1, 0xbe, 0xa1, 0xa9, 0xb5, 0x46, - 0xa5, 0xda, 0xa8, 0x14, 0xd7, 0xd4, 0x42, 0xde, 0x6d, 0xfe, 0xe4, 0x53, 0xa0, 0x36, 0x13, 0xfb, - 0x95, 0x71, 0x32, 0x42, 0x19, 0xa7, 0x7a, 0x95, 0x11, 0xc2, 0x6a, 0xa5, 0xa9, 0x35, 0x55, 0x3b, - 0xab, 0x16, 0xa6, 0xfb, 0xe9, 0xda, 0x8c, 0x72, 0x1c, 0x0a, 0x2e, 0x0f, 0x8d, 0x72, 0xcd, 0xcb, - 0xb9, 0x58, 0x98, 0x45, 0x1f, 0xcb, 0xc3, 0x49, 0x0d, 0x6f, 0x19, 0x5d, 0x07, 0xdb, 0xeb, 0xfa, - 0xa5, 0x1d, 0x6c, 0x3a, 0x5e, 0x27, 0xff, 0x2f, 0x89, 0x95, 0x71, 0x0d, 0x66, 0x3b, 0x94, 0xc6, - 0x1a, 0x76, 0xb6, 0xad, 0x16, 0x1b, 0x85, 0x1f, 0x13, 0xd9, 0x73, 0xcc, 0xaf, 0x87, 0xb3, 0x6b, - 0xfc, 0xdf, 0x21, 0xdd, 0x96, 0x63, 0x74, 0x3b, 0x3b, 0x8c, 0x6e, 0x2b, 0x57, 0xc1, 0xd4, 0x6e, - 0x17, 0xdb, 0xea, 0x8e, 0x6e, 0xb4, 0xbd, 0xcb, 0x39, 0xfd, 0x04, 0xf4, 0xd6, 0xac, 0xe8, 0x89, - 0x95, 0x50, 0x5d, 0xfa, 0x8b, 0x31, 0xa2, 0x6f, 0x3d, 0x0d, 0xc0, 0x2a, 0xbb, 0x61, 0xb7, 0x99, - 0xb2, 0x86, 0x52, 0x5c, 0xfe, 0xce, 0x1b, 0xed, 0xb6, 0x61, 0x6e, 0xf9, 0xfb, 0xfe, 0x41, 0x02, - 0x7a, 0x81, 0x2c, 0x72, 0x82, 0x25, 0x29, 0x6f, 0xc9, 0x5a, 0xd3, 0xf3, 0xa4, 0x31, 0xf7, 0xbb, - 0xfb, 0x9b, 0x4e, 0x5e, 0x29, 0xc0, 0x0c, 0x49, 0x63, 0x2d, 0xb0, 0x30, 0xe1, 0xf6, 0xc1, 0x1e, - 0xb9, 0x35, 0xb5, 0xbe, 0x52, 0x5d, 0xf4, 0xbf, 0x4d, 0xba, 0x24, 0x5d, 0x66, 0x8a, 0x95, 0xfb, - 0x48, 0x6b, 0x9c, 0x52, 0x1e, 0x05, 0x57, 0x84, 0x3a, 0xec, 0xe2, 0xaa, 0xa6, 0x16, 0x17, 0xef, - 0x6b, 0xa8, 0x4f, 0x2b, 0xd7, 0xea, 0x35, 0xbe, 0x71, 0x79, 0xed, 0x68, 0xda, 0xe5, 0x57, 0x5d, - 0x2b, 0x96, 0x57, 0x59, 0xff, 0xbe, 0x54, 0xd5, 0xd6, 0x8a, 0xf5, 0xc2, 0x0c, 0x7a, 0xa9, 0x0c, - 0x85, 0x65, 0xec, 0xac, 0x5b, 0xb6, 0xa3, 0xb7, 0x57, 0x0d, 0xf3, 0xc2, 0x86, 0xdd, 0xe6, 0x26, - 0x9b, 0xc2, 0x61, 0x3a, 0xf8, 0x21, 0x92, 0x23, 0x18, 0xbd, 0x23, 0xde, 0x21, 0xd9, 0x02, 0x65, - 0x0a, 0x12, 0xd0, 0x33, 0x24, 0x91, 0xe5, 0x6e, 0xf1, 0x52, 0x93, 0xe9, 0xc9, 0x33, 0xc7, 0x3d, - 0x3e, 0xf7, 0x41, 0x2d, 0x8f, 0x9e, 0x9d, 0x85, 0xc9, 0x25, 0xc3, 0xd4, 0xdb, 0xc6, 0xd3, 0xb9, - 0xf8, 0xa5, 0x41, 0x1f, 0x93, 0x89, 0xe9, 0x63, 0xa4, 0xa1, 0xc6, 0xcf, 0x5f, 0x97, 0x45, 0x97, - 0x17, 0x42, 0xb2, 0xf7, 0x98, 0x8c, 0x18, 0x3c, 0x3f, 0x20, 0x89, 0x2c, 0x2f, 0x0c, 0xa6, 0x97, - 0x0c, 0xc3, 0x4f, 0xfc, 0x70, 0xd8, 0x58, 0x3d, 0xed, 0x7b, 0xb2, 0x9f, 0x2a, 0x4c, 0xa1, 0x3f, - 0x97, 0x01, 0x2d, 0x63, 0xe7, 0x2c, 0xb6, 0xfd, 0xa9, 0x00, 0xe9, 0xf5, 0x99, 0xbd, 0x1d, 0x6a, - 0xb2, 0x6f, 0x0c, 0x03, 0x78, 0x8e, 0x07, 0xb0, 0x18, 0xd3, 0x78, 0x22, 0x48, 0x47, 0x34, 0xde, - 0x32, 0xe4, 0xbb, 0xe4, 0x3b, 0x53, 0xb3, 0xc7, 0x47, 0x0f, 0x97, 0x84, 0x58, 0x98, 0x3a, 0x25, - 0xac, 0x31, 0x02, 0xe8, 0x7b, 0xfe, 0x24, 0xe8, 0xa7, 0x39, 0xed, 0x58, 0x3a, 0x30, 0xb3, 0xc9, - 0xf4, 0xc5, 0x4e, 0x57, 0x5d, 0xfa, 0xd9, 0x37, 0xe8, 0x03, 0x39, 0x38, 0xde, 0xaf, 0x3a, 0xe8, - 0xf7, 0x32, 0xdc, 0x0e, 0x3b, 0x26, 0x43, 0x7e, 0x86, 0x6d, 0x20, 0xba, 0x2f, 0xca, 0x13, 0xe1, - 0x84, 0xbf, 0x0c, 0x57, 0xb7, 0x2a, 0xf8, 0x62, 0xb7, 0x8d, 0x1d, 0x07, 0xdb, 0xa4, 0x6a, 0x93, - 0x5a, 0xff, 0x8f, 0xca, 0x93, 0xe1, 0x72, 0xc3, 0xec, 0x1a, 0x2d, 0x6c, 0xd7, 0x8d, 0x4e, 0xb7, - 0x68, 0xb6, 0xea, 0xbb, 0x8e, 0x65, 0x1b, 0x3a, 0xbb, 0x4a, 0x72, 0x52, 0x8b, 0xfa, 0xac, 0xdc, - 0x08, 0x05, 0xa3, 0x5b, 0x35, 0xcf, 0x5b, 0xba, 0xdd, 0x32, 0xcc, 0xad, 0x55, 0xa3, 0xeb, 0x30, - 0x0f, 0xe0, 0x7d, 0xe9, 0xe8, 0xef, 0x65, 0xd1, 0xc3, 0x74, 0x03, 0x60, 0x8d, 0xe8, 0x50, 0x9e, - 0x23, 0x8b, 0x1c, 0x8f, 0x4b, 0x46, 0x3b, 0x99, 0xb2, 0x3c, 0x6b, 0xdc, 0x86, 0x44, 0xff, 0x11, - 0x9c, 0x74, 0x2d, 0x34, 0xdd, 0x33, 0x04, 0xce, 0xaa, 0x5a, 0x79, 0xa9, 0xac, 0xba, 0x66, 0xc5, - 0x09, 0x38, 0x16, 0x7c, 0x5b, 0xbc, 0xaf, 0x51, 0x53, 0x2b, 0xf5, 0xc2, 0xa4, 0xdb, 0x4f, 0xd1, - 0xe4, 0xa5, 0x62, 0x79, 0x55, 0x5d, 0x6c, 0xd4, 0xab, 0xee, 0x97, 0xc5, 0xe1, 0x4c, 0x0b, 0xf4, - 0x60, 0x16, 0x8e, 0x12, 0xd9, 0x5e, 0x22, 0x52, 0x75, 0x85, 0xd2, 0xe3, 0x6b, 0xeb, 0x03, 0x34, - 0x45, 0xc5, 0x8b, 0x3e, 0x23, 0x7c, 0x53, 0x66, 0x08, 0xc2, 0x9e, 0x32, 0x22, 0x34, 0xe3, 0xbb, - 0x92, 0x48, 0x84, 0x0a, 0x61, 0xb2, 0xc9, 0x94, 0xe2, 0x5f, 0xc7, 0x3d, 0xe2, 0x44, 0x83, 0x4f, - 0xac, 0xcc, 0x12, 0xf9, 0xf9, 0x69, 0xeb, 0x65, 0x8d, 0xa8, 0xc3, 0x1c, 0x00, 0x49, 0x21, 0x1a, - 0x44, 0xf5, 0xa0, 0xef, 0x78, 0x15, 0xa5, 0x07, 0xc5, 0x52, 0xbd, 0x7c, 0x56, 0x8d, 0xd2, 0x83, - 0x4f, 0xcb, 0x30, 0xb9, 0x8c, 0x1d, 0x77, 0x4e, 0xd5, 0x45, 0x4f, 0x11, 0x58, 0xff, 0x71, 0xcd, - 0x98, 0xb6, 0xd5, 0xd4, 0xdb, 0xfe, 0x32, 0x00, 0x7d, 0x43, 0xbf, 0x34, 0x8c, 0x09, 0xe2, 0x15, - 0x1d, 0x31, 0x5e, 0xfd, 0x24, 0xe4, 0x1c, 0xf7, 0x33, 0x5b, 0x86, 0xfe, 0xb1, 0xc8, 0xe1, 0xca, - 0x25, 0xb2, 0xa8, 0x3b, 0xba, 0x46, 0xf3, 0x87, 0x46, 0x27, 0x41, 0xdb, 0x25, 0x82, 0x91, 0x1f, - 0x46, 0xfb, 0xf3, 0x6f, 0x65, 0x38, 0x41, 0xdb, 0x47, 0xb1, 0xd3, 0xa9, 0x39, 0x96, 0x8d, 0x35, - 0xdc, 0xc4, 0x46, 0xc7, 0xe9, 0x59, 0xdf, 0xb3, 0x69, 0xaa, 0xb7, 0xd9, 0xcc, 0x5e, 0xd1, 0xeb, - 0x64, 0xd1, 0x18, 0xcc, 0xfb, 0xda, 0x63, 0x4f, 0x79, 0x11, 0x8d, 0xfd, 0xa3, 0x92, 0x48, 0x54, - 0xe5, 0x84, 0xc4, 0x93, 0x01, 0xf5, 0xa1, 0x43, 0x00, 0xca, 0x5b, 0xb9, 0xd1, 0xd4, 0x92, 0x5a, - 0x5e, 0x77, 0x07, 0x81, 0xab, 0xe1, 0xca, 0xf5, 0x0d, 0xad, 0xb4, 0x52, 0xac, 0xa9, 0x0d, 0x4d, - 0x5d, 0x2e, 0xd7, 0xea, 0xcc, 0x29, 0x8b, 0xfe, 0x35, 0xa1, 0x5c, 0x05, 0xa7, 0x6a, 0x1b, 0x0b, - 0xb5, 0x92, 0x56, 0x5e, 0x27, 0xe9, 0x9a, 0x5a, 0x51, 0xcf, 0xb1, 0xaf, 0x93, 0xe8, 0x7d, 0x05, - 0x98, 0x76, 0x27, 0x00, 0x35, 0x3a, 0x2f, 0x40, 0xdf, 0xca, 0xc2, 0xb4, 0x86, 0xbb, 0x56, 0x7b, - 0x8f, 0xcc, 0x11, 0xc6, 0x35, 0xf5, 0xf8, 0x8e, 0x2c, 0x7a, 0x7e, 0x3b, 0xc4, 0xec, 0x7c, 0x88, - 0xd1, 0xe8, 0x89, 0xa6, 0xbe, 0xa7, 0x1b, 0x6d, 0xfd, 0x3c, 0xeb, 0x6a, 0x26, 0xb5, 0x20, 0x41, - 0x99, 0x07, 0xc5, 0xba, 0x68, 0x62, 0xbb, 0xd6, 0xbc, 0xa8, 0x3a, 0xdb, 0xc5, 0x56, 0xcb, 0xc6, - 0xdd, 0x2e, 0x5b, 0xbd, 0xe8, 0xf3, 0x45, 0xb9, 0x01, 0x8e, 0x92, 0xd4, 0x50, 0x66, 0xea, 0x20, - 0xd3, 0x9b, 0xec, 0xe7, 0x2c, 0x9a, 0x97, 0xbc, 0x9c, 0xb9, 0x50, 0xce, 0x20, 0x39, 0x7c, 0x5c, - 0x22, 0xcf, 0x9f, 0xd2, 0xb9, 0x06, 0xa6, 0x4d, 0x7d, 0x07, 0xab, 0x0f, 0x74, 0x0c, 0x1b, 0x77, - 0x89, 0x63, 0x8c, 0xac, 0x85, 0x93, 0xd0, 0x07, 0x84, 0xce, 0x9b, 0x8b, 0x49, 0x2c, 0x99, 0xee, - 0x2f, 0x0f, 0xa1, 0xfa, 0x7d, 0xfa, 0x19, 0x19, 0xbd, 0x4f, 0x86, 0x19, 0xc6, 0x54, 0xd1, 0xbc, - 0x54, 0x6e, 0xa1, 0xab, 0x39, 0xe3, 0x57, 0x77, 0xd3, 0x3c, 0xe3, 0x97, 0xbc, 0xa0, 0x5f, 0x91, - 0x45, 0xdd, 0x9d, 0xfb, 0x54, 0x9c, 0x94, 0x11, 0xed, 0x38, 0xba, 0x69, 0xed, 0x32, 0x47, 0xd5, - 0x49, 0x8d, 0xbe, 0xa4, 0xb9, 0xa8, 0x87, 0x3e, 0x28, 0xe4, 0x4c, 0x2d, 0x58, 0x8d, 0x43, 0x02, - 0xf0, 0xe3, 0x32, 0xcc, 0x31, 0xae, 0x6a, 0xec, 0x9c, 0x8f, 0xd0, 0x81, 0xb7, 0x5f, 0x15, 0x36, - 0x04, 0xfb, 0xd4, 0x9f, 0x95, 0xf4, 0x88, 0x01, 0xf2, 0xc3, 0x42, 0xc1, 0xd1, 0x84, 0x2b, 0x72, - 0x48, 0x50, 0xbe, 0x2d, 0x0b, 0xd3, 0x1b, 0x5d, 0x6c, 0x33, 0xbf, 0x7d, 0xf4, 0x50, 0x16, 0xe4, - 0x65, 0xcc, 0x6d, 0xa4, 0x3e, 0x5f, 0xd8, 0xc3, 0x37, 0x5c, 0xd9, 0x10, 0x51, 0xd7, 0x46, 0x8a, - 0x80, 0xed, 0x7a, 0x98, 0xa3, 0x22, 0x2d, 0x3a, 0x8e, 0x6b, 0x24, 0x7a, 0xde, 0xb4, 0x3d, 0xa9, - 0xa3, 0xd8, 0x2a, 0x22, 0x65, 0xb9, 0x59, 0x4a, 0x2e, 0x4f, 0xab, 0x78, 0x93, 0xce, 0x67, 0xb3, - 0x5a, 0x4f, 0xaa, 0x72, 0x0b, 0x5c, 0x66, 0x75, 0x30, 0x3d, 0xbf, 0x12, 0xca, 0x9c, 0x23, 0x99, - 0xfb, 0x7d, 0x42, 0xdf, 0x12, 0xf2, 0xd5, 0x15, 0x97, 0x4e, 0x32, 0x5d, 0xe8, 0x8c, 0xc6, 0x24, - 0x39, 0x0e, 0x05, 0x37, 0x07, 0xd9, 0x7f, 0xd1, 0xd4, 0x5a, 0x75, 0xf5, 0xac, 0xda, 0x7f, 0x19, - 0x23, 0x87, 0x9e, 0x25, 0xc3, 0xd4, 0x82, 0x6d, 0xe9, 0xad, 0xa6, 0xde, 0x75, 0xd0, 0xf7, 0x24, - 0x98, 0x59, 0xd7, 0x2f, 0xb5, 0x2d, 0xbd, 0x45, 0xfc, 0xfb, 0x7b, 0xfa, 0x82, 0x0e, 0xfd, 0xe4, - 0xf5, 0x05, 0xec, 0x95, 0x3f, 0x18, 0xe8, 0x1f, 0xdd, 0xcb, 0x88, 0x5c, 0xa8, 0xe9, 0x6f, 0xf3, - 0x49, 0xfd, 0x82, 0x95, 0x7a, 0x7c, 0xcd, 0x87, 0x79, 0x8a, 0xb0, 0x28, 0xdf, 0x27, 0x16, 0x7e, - 0x54, 0x84, 0xe4, 0xe1, 0xec, 0xca, 0x3f, 0x7b, 0x12, 0xf2, 0x8b, 0x98, 0x58, 0x71, 0xff, 0x43, - 0x82, 0x89, 0x1a, 0x76, 0x88, 0x05, 0x77, 0x1b, 0xe7, 0x29, 0xdc, 0x22, 0x19, 0x02, 0x27, 0x76, - 0xef, 0xdd, 0x9d, 0xac, 0x87, 0xce, 0x5b, 0x93, 0xe7, 0x04, 0x1e, 0x89, 0xb4, 0xdc, 0x79, 0x56, - 0xe6, 0x81, 0x3c, 0x12, 0x63, 0x49, 0xa5, 0xef, 0x6b, 0xf5, 0x0e, 0x89, 0xb9, 0x56, 0x85, 0x7a, - 0xbd, 0x57, 0x85, 0xf5, 0x33, 0xd6, 0xdb, 0x8c, 0x31, 0x1f, 0xe3, 0x1c, 0xf5, 0x04, 0x98, 0xa0, - 0x32, 0xf7, 0xe6, 0xa3, 0xbd, 0x7e, 0x0a, 0x94, 0x04, 0x39, 0x7b, 0xed, 0xe5, 0x14, 0x74, 0x51, - 0x8b, 0x2e, 0x7c, 0x2c, 0x31, 0x08, 0x66, 0x2a, 0xd8, 0xb9, 0x68, 0xd9, 0x17, 0x6a, 0x8e, 0xee, - 0x60, 0xf4, 0xaf, 0x12, 0xc8, 0x35, 0xec, 0x84, 0xa3, 0x9f, 0x54, 0xe0, 0x18, 0xad, 0x10, 0xcb, - 0x48, 0xfa, 0x6f, 0x5a, 0x91, 0x6b, 0xfa, 0x0a, 0x21, 0x94, 0x4f, 0xdb, 0xff, 0x2b, 0xfa, 0xcd, - 0xbe, 0x41, 0x9f, 0xa4, 0x3e, 0x93, 0x06, 0x26, 0x99, 0x30, 0x83, 0xae, 0x82, 0x45, 0xe8, 0xe9, - 0xfb, 0x85, 0xcc, 0x6a, 0x31, 0x9a, 0x87, 0xd3, 0x15, 0x7c, 0xf8, 0x0a, 0xc8, 0x96, 0xb6, 0x75, - 0x07, 0xbd, 0x5d, 0x06, 0x28, 0xb6, 0x5a, 0x6b, 0xd4, 0x07, 0x3c, 0xec, 0x90, 0x76, 0x06, 0x66, - 0x9a, 0xdb, 0x7a, 0x70, 0xb7, 0x09, 0xed, 0x0f, 0xb8, 0x34, 0xe5, 0x89, 0x81, 0x33, 0x39, 0x95, - 0x2a, 0xea, 0x81, 0xc9, 0x2d, 0x83, 0xd1, 0xf6, 0x1d, 0xcd, 0xf9, 0x50, 0x98, 0xb1, 0x47, 0xe8, - 0xdc, 0xdf, 0xe7, 0x03, 0xf6, 0xa2, 0xe7, 0x70, 0x8c, 0xb4, 0x7f, 0xc0, 0x26, 0x48, 0x48, 0x78, - 0xd2, 0x5b, 0x2c, 0xa0, 0x47, 0x3c, 0x5f, 0x63, 0x09, 0x5d, 0xab, 0xa8, 0x2d, 0xc3, 0x13, 0x2d, - 0x0b, 0x98, 0x85, 0x9e, 0x97, 0x49, 0x06, 0x5f, 0xbc, 0xe0, 0xee, 0x86, 0x59, 0xdc, 0x32, 0x1c, - 0xec, 0xd5, 0x92, 0x09, 0x30, 0x0e, 0x62, 0xfe, 0x07, 0xf4, 0x4c, 0xe1, 0xa0, 0x6b, 0x44, 0xa0, - 0xfb, 0x6b, 0x14, 0xd1, 0xfe, 0xc4, 0xc2, 0xa8, 0x89, 0xd1, 0x4c, 0x1f, 0xac, 0x5f, 0x92, 0xe1, - 0x44, 0xdd, 0xda, 0xda, 0x6a, 0x63, 0x4f, 0x4c, 0x98, 0x7a, 0x67, 0x22, 0x7d, 0x94, 0x70, 0x91, - 0x9d, 0x20, 0xeb, 0x7e, 0xc3, 0x3f, 0x4a, 0xe6, 0xbe, 0xf0, 0x27, 0xa6, 0x62, 0x67, 0x51, 0x44, - 0x5c, 0x7d, 0xf9, 0x8c, 0x40, 0x41, 0x2c, 0xe0, 0xb3, 0x30, 0xd9, 0xf4, 0x81, 0xf8, 0xa2, 0x04, - 0xb3, 0xf4, 0xe6, 0x4a, 0x4f, 0x41, 0xef, 0x1d, 0x21, 0x00, 0xe8, 0x7b, 0x19, 0x51, 0x3f, 0x5b, - 0x22, 0x13, 0x8e, 0x93, 0x08, 0x11, 0x8b, 0x05, 0x55, 0x19, 0x48, 0x2e, 0x7d, 0xd1, 0xfe, 0x89, - 0x0c, 0xd3, 0xcb, 0xd8, 0x6b, 0x69, 0xdd, 0xc4, 0x3d, 0xd1, 0x19, 0x98, 0x21, 0xd7, 0xb7, 0x55, - 0xd9, 0x31, 0x49, 0xba, 0x6a, 0xc6, 0xa5, 0x29, 0xd7, 0xc1, 0xec, 0x79, 0xbc, 0x69, 0xd9, 0xb8, - 0xca, 0x9d, 0xa5, 0xe4, 0x13, 0x23, 0xc2, 0xd3, 0x71, 0x71, 0xd0, 0x16, 0x78, 0x6c, 0x6e, 0xda, - 0x2f, 0xcc, 0x50, 0x55, 0x22, 0xc6, 0x9c, 0x27, 0xc1, 0x24, 0x43, 0xde, 0x33, 0xd3, 0xe2, 0xfa, - 0x45, 0x3f, 0x2f, 0x7a, 0xad, 0x8f, 0xa8, 0xca, 0x21, 0xfa, 0xf8, 0x24, 0x4c, 0x8c, 0xe5, 0x7e, - 0xf7, 0x42, 0xa8, 0xfc, 0x85, 0x4b, 0xe5, 0x56, 0x17, 0xad, 0x25, 0xc3, 0xf4, 0x34, 0x80, 0xdf, - 0x38, 0xbc, 0xb0, 0x16, 0xa1, 0x14, 0x3e, 0x72, 0x7d, 0xec, 0x41, 0xbd, 0x5e, 0x71, 0x10, 0x76, - 0x46, 0x0c, 0x8c, 0xd8, 0x01, 0x3f, 0x11, 0x4e, 0xd2, 0x47, 0xe7, 0x53, 0x32, 0x9c, 0xf0, 0xcf, - 0x1f, 0xad, 0xea, 0xdd, 0xa0, 0xdd, 0x95, 0x92, 0x41, 0xc4, 0x1d, 0xf8, 0xf0, 0x1b, 0xcb, 0xb7, - 0x93, 0x8d, 0x19, 0x7d, 0x39, 0x19, 0x2d, 0x3a, 0xca, 0x4d, 0x70, 0xcc, 0xdc, 0xdd, 0xf1, 0xa5, - 0x4e, 0x5a, 0x3c, 0x6b, 0xe1, 0xfb, 0x3f, 0x24, 0x19, 0x99, 0x44, 0x98, 0x1f, 0xcb, 0x9c, 0x92, - 0x3b, 0xd2, 0xf5, 0xb8, 0x44, 0x30, 0xa2, 0x7f, 0xce, 0x24, 0xea, 0xdd, 0x06, 0x9f, 0xf9, 0x4a, - 0xd0, 0x4b, 0x1d, 0xe6, 0x81, 0xaf, 0x6f, 0x67, 0x41, 0x2e, 0x76, 0x0c, 0xf4, 0x41, 0x09, 0xa6, - 0x6b, 0x8e, 0x6e, 0x3b, 0x35, 0x6c, 0xef, 0x61, 0x3b, 0x3c, 0x33, 0x7f, 0x9d, 0xf0, 0x5c, 0xa3, - 0xd8, 0x31, 0xe6, 0x43, 0x44, 0x22, 0x24, 0xf3, 0x79, 0xa1, 0xf9, 0x41, 0x3c, 0xad, 0x64, 0x82, - 0xc1, 0x43, 0x4c, 0xf9, 0x4e, 0xc0, 0xb1, 0xf5, 0xaa, 0x56, 0xf7, 0x77, 0xe7, 0x37, 0x6a, 0xea, - 0x62, 0x41, 0x56, 0x10, 0x9c, 0x24, 0x7e, 0xd2, 0x9a, 0xff, 0xa1, 0x56, 0x2f, 0x6a, 0x75, 0x75, - 0xb1, 0x90, 0x45, 0xaf, 0x91, 0x00, 0x6a, 0x8e, 0xd5, 0xd9, 0x2f, 0x42, 0xf1, 0x43, 0xf7, 0xb4, - 0xda, 0x1e, 0x8d, 0x81, 0x67, 0x87, 0xe2, 0x16, 0x79, 0x62, 0x49, 0x25, 0x13, 0xe0, 0x3d, 0x43, - 0x08, 0xf0, 0x24, 0x28, 0x4c, 0x52, 0x95, 0x6a, 0xdd, 0x97, 0x92, 0x7c, 0x66, 0x02, 0x72, 0xea, - 0x4e, 0xc7, 0xb9, 0x74, 0xe6, 0xd1, 0x30, 0x5b, 0x73, 0x6c, 0xac, 0xef, 0x84, 0xf6, 0xa2, 0x1c, - 0xeb, 0x02, 0x36, 0xbd, 0xbd, 0x28, 0xf2, 0x72, 0xfb, 0x6d, 0x30, 0x61, 0x5a, 0x0d, 0x7d, 0xd7, - 0xd9, 0x56, 0xae, 0xde, 0x17, 0xc4, 0x81, 0x75, 0x37, 0x55, 0x16, 0x35, 0xeb, 0xab, 0x77, 0x90, - 0xdd, 0x88, 0xbc, 0x69, 0x15, 0x77, 0x9d, 0xed, 0x85, 0xab, 0x3e, 0xfe, 0x37, 0xa7, 0x33, 0x9f, - 0xfe, 0x9b, 0xd3, 0x99, 0xaf, 0xfc, 0xcd, 0xe9, 0xcc, 0xaf, 0x7e, 0xed, 0xf4, 0x91, 0x4f, 0x7f, - 0xed, 0xf4, 0x91, 0x2f, 0x7e, 0xed, 0xf4, 0x91, 0x9f, 0x96, 0x3a, 0xe7, 0xcf, 0xe7, 0x09, 0x95, - 0x27, 0xfc, 0xbf, 0x01, 0x00, 0x00, 0xff, 0xff, 0xad, 0xda, 0x7f, 0xc2, 0x7a, 0x0a, 0x02, 0x00, + 0xe7, 0x6f, 0x67, 0x61, 0xd6, 0x63, 0xa2, 0x62, 0xb4, 0xf1, 0x03, 0xe1, 0xa5, 0x98, 0x17, 0x66, + 0x45, 0x8f, 0x83, 0xf5, 0xd6, 0x87, 0x90, 0x8a, 0x10, 0x69, 0x03, 0xa0, 0xa5, 0x39, 0x78, 0xcb, + 0xb4, 0x74, 0xbf, 0x3f, 0x7c, 0x72, 0x12, 0x6a, 0x25, 0xfa, 0xf7, 0x25, 0x35, 0x44, 0x47, 0xb9, + 0x13, 0xa6, 0xb1, 0x7f, 0xfe, 0xde, 0x5b, 0xaa, 0x89, 0xc5, 0x2b, 0x9c, 0x1f, 0xfd, 0xb9, 0xd0, + 0xa9, 0x33, 0x91, 0x6a, 0x26, 0xc3, 0xac, 0x39, 0x5c, 0x1b, 0xda, 0xa8, 0xae, 0x15, 0xd5, 0xfa, + 0x4a, 0x71, 0x75, 0xb5, 0x52, 0x5d, 0xf6, 0x03, 0xbf, 0x28, 0x30, 0xb7, 0x58, 0x3b, 0x57, 0x0d, + 0x45, 0xe6, 0xc9, 0xa2, 0x75, 0x98, 0xf4, 0xe4, 0xd5, 0xcf, 0x17, 0x33, 0x2c, 0x33, 0xe6, 0x8b, + 0x19, 0x4a, 0x72, 0x8d, 0x33, 0xbd, 0xe5, 0x3b, 0xe8, 0x90, 0x67, 0xf4, 0x47, 0x1a, 0xe4, 0xc8, + 0x9a, 0x3a, 0x7a, 0x1b, 0xd9, 0x06, 0xec, 0x76, 0xb4, 0x16, 0x46, 0x3b, 0x09, 0xac, 0x71, 0xef, + 0xea, 0x04, 0x69, 0xdf, 0xd5, 0x09, 0xe4, 0x91, 0x59, 0x7d, 0xc7, 0xfb, 0xad, 0xe3, 0xab, 0x34, + 0x0b, 0x7f, 0x40, 0x2b, 0x76, 0x77, 0x85, 0x2e, 0xff, 0x33, 0x36, 0x23, 0x54, 0x32, 0x9a, 0xa7, + 0x64, 0x96, 0xa8, 0xd8, 0x3e, 0x4c, 0x1c, 0x47, 0x63, 0xb8, 0xde, 0x3b, 0x0b, 0xb9, 0x7a, 0xb7, + 0xa3, 0x3b, 0xe8, 0x25, 0xd2, 0x48, 0x30, 0xa3, 0xd7, 0x5d, 0xc8, 0x03, 0xaf, 0xbb, 0x08, 0x76, + 0x5d, 0xb3, 0x02, 0xbb, 0xae, 0x0d, 0xfc, 0x80, 0xc3, 0xef, 0xba, 0xde, 0xc6, 0x82, 0xb7, 0xd1, + 0x3d, 0xdb, 0xc7, 0xf6, 0x11, 0x29, 0xa9, 0x56, 0x9f, 0xa8, 0x80, 0x67, 0x9e, 0xc8, 0x82, 0x93, + 0x01, 0xe4, 0x17, 0x6a, 0x8d, 0x46, 0x6d, 0xad, 0x70, 0x84, 0x44, 0xb5, 0xa9, 0xad, 0xd3, 0x50, + 0x31, 0x95, 0x6a, 0xb5, 0xac, 0x16, 0x24, 0x12, 0x2e, 0xad, 0xd2, 0x58, 0x2d, 0x17, 0x64, 0x3e, + 0xf6, 0x79, 0xac, 0xf9, 0xcd, 0x97, 0x9d, 0xa6, 0x7a, 0x89, 0x19, 0xe2, 0xd1, 0xfc, 0xa4, 0xaf, + 0x5c, 0xbf, 0x2a, 0x43, 0x6e, 0x0d, 0x5b, 0x5b, 0x18, 0xfd, 0x54, 0x82, 0x4d, 0xbe, 0x4d, 0xdd, + 0xb2, 0x69, 0x70, 0xb9, 0x60, 0x93, 0x2f, 0x9c, 0xa6, 0x5c, 0x07, 0xb3, 0x36, 0x6e, 0x99, 0x46, + 0xdb, 0xcb, 0x44, 0xfb, 0x23, 0x3e, 0x91, 0xbf, 0x77, 0x5e, 0x00, 0x32, 0xc2, 0xe8, 0x48, 0x76, + 0xea, 0x92, 0x00, 0xd3, 0xaf, 0xd4, 0xf4, 0x81, 0xf9, 0x96, 0xec, 0xfe, 0xd4, 0xbd, 0x84, 0x5e, + 0x2c, 0xbc, 0xfb, 0x7a, 0x13, 0xe4, 0x89, 0x9a, 0x7a, 0x63, 0x74, 0xff, 0xfe, 0x98, 0xe5, 0x51, + 0x16, 0xe0, 0x98, 0x8d, 0x3b, 0xb8, 0xe5, 0xe0, 0xb6, 0xdb, 0x74, 0xd5, 0x81, 0x9d, 0xc2, 0xfe, + 0xec, 0xe8, 0x4f, 0xc3, 0x00, 0xde, 0xc1, 0x03, 0x78, 0x7d, 0x1f, 0x51, 0xba, 0x15, 0x8a, 0xb6, + 0x95, 0xdd, 0x6a, 0xd4, 0x3b, 0xa6, 0xbf, 0x28, 0xee, 0xbd, 0xbb, 0xdf, 0xb6, 0x9d, 0x9d, 0x0e, + 0xf9, 0xc6, 0x0e, 0x18, 0x78, 0xef, 0xca, 0x3c, 0x4c, 0x68, 0xc6, 0x25, 0xf2, 0x29, 0x1b, 0x53, + 0x6b, 0x2f, 0x13, 0x7a, 0x85, 0x8f, 0xfc, 0x5d, 0x1c, 0xf2, 0x8f, 0x17, 0x63, 0x37, 0x7d, 0xe0, + 0x7f, 0x76, 0x02, 0x72, 0xeb, 0x9a, 0xed, 0x60, 0xf4, 0xff, 0xc8, 0xa2, 0xc8, 0x5f, 0x0f, 0x73, + 0x9b, 0x66, 0x6b, 0xd7, 0xc6, 0x6d, 0xbe, 0x51, 0xf6, 0xa4, 0x8e, 0x02, 0x73, 0xe5, 0x46, 0x28, + 0x78, 0x89, 0x8c, 0xac, 0xb7, 0x0d, 0xbf, 0x2f, 0x9d, 0x44, 0xd2, 0xb6, 0xd7, 0x35, 0xcb, 0xa9, + 0x6d, 0x92, 0x34, 0x3f, 0x92, 0x76, 0x38, 0x91, 0x83, 0x3e, 0x1f, 0x03, 0xfd, 0x44, 0x34, 0xf4, + 0x93, 0x02, 0xd0, 0x2b, 0x45, 0x98, 0xdc, 0xd4, 0x3b, 0x98, 0xfc, 0x30, 0x45, 0x7e, 0xe8, 0x37, + 0x26, 0x11, 0xd9, 0xfb, 0x63, 0xd2, 0x92, 0xde, 0xc1, 0xaa, 0xff, 0x9b, 0x37, 0x91, 0x81, 0x60, + 0x22, 0xb3, 0x4a, 0xfd, 0x69, 0x5d, 0xc3, 0xcb, 0xd0, 0x76, 0xb0, 0xb7, 0xf8, 0x66, 0xb0, 0xc3, + 0x2d, 0x6d, 0xcd, 0xd1, 0x08, 0x18, 0x33, 0x2a, 0x79, 0xe6, 0xfd, 0x42, 0xe4, 0x5e, 0xbf, 0x90, + 0xe7, 0xc8, 0xc9, 0x7a, 0x44, 0x8f, 0xd9, 0x88, 0x16, 0x75, 0xde, 0x03, 0x88, 0x5a, 0x8a, 0xfe, + 0xbb, 0x0b, 0x4c, 0x4b, 0xb3, 0xb0, 0xb3, 0x1e, 0xf6, 0xc4, 0xc8, 0xa9, 0x7c, 0x22, 0x71, 0xe5, + 0xb3, 0xeb, 0xda, 0x0e, 0x26, 0x85, 0x95, 0xdc, 0x6f, 0xcc, 0x45, 0x6b, 0x5f, 0x7a, 0xd0, 0xff, + 0xe6, 0x46, 0xdd, 0xff, 0xf6, 0xab, 0x63, 0xfa, 0xcd, 0xf0, 0xd5, 0x59, 0x90, 0x4b, 0xbb, 0xce, + 0xa3, 0xba, 0xfb, 0xfd, 0x9e, 0xb0, 0x9f, 0x0b, 0xeb, 0xcf, 0x22, 0x2f, 0x9a, 0x1f, 0x53, 0xef, + 0x9b, 0x50, 0x4b, 0xc4, 0xfc, 0x69, 0xa2, 0xea, 0x36, 0x86, 0x7b, 0x0d, 0x64, 0xdf, 0xc1, 0xf2, + 0xc1, 0xcc, 0xc1, 0x4d, 0x73, 0x44, 0xfb, 0xa7, 0x50, 0xcf, 0xe0, 0xbf, 0x7b, 0x1d, 0x4f, 0x96, + 0x8b, 0xd5, 0x47, 0xb6, 0xd7, 0x89, 0x28, 0x67, 0x54, 0xfa, 0x82, 0x5e, 0x2a, 0xec, 0x76, 0x4e, + 0xc5, 0x16, 0xeb, 0x4a, 0x98, 0xcc, 0xa6, 0x12, 0xbb, 0x4c, 0x34, 0xa6, 0xd8, 0xf4, 0x01, 0xfb, + 0x66, 0xd8, 0x55, 0xb0, 0x78, 0x60, 0xc4, 0xd0, 0x2b, 0x85, 0xb7, 0xa3, 0x68, 0xb5, 0x07, 0xac, + 0x17, 0x26, 0x93, 0xb7, 0xd8, 0x66, 0x55, 0x6c, 0xc1, 0xe9, 0x4b, 0xfc, 0x1b, 0x32, 0xe4, 0xe9, + 0x16, 0x24, 0x7a, 0x63, 0x26, 0xc1, 0x2d, 0xec, 0x0e, 0xef, 0x42, 0xe8, 0xbf, 0x27, 0x59, 0x73, + 0xe0, 0x5c, 0x0d, 0xb3, 0x89, 0x5c, 0x0d, 0xf9, 0x73, 0x9c, 0x02, 0xed, 0x88, 0xd6, 0x31, 0xe5, + 0xe9, 0x64, 0x92, 0x16, 0xd6, 0x97, 0xa1, 0xf4, 0xf1, 0xfe, 0xf9, 0x1c, 0xcc, 0xd0, 0xa2, 0xcf, + 0xe9, 0xed, 0x2d, 0xec, 0xa0, 0x77, 0x48, 0xdf, 0x3f, 0xa8, 0x2b, 0x55, 0x98, 0xb9, 0x48, 0xd8, + 0x5e, 0xd5, 0x2e, 0x99, 0xbb, 0x0e, 0x5b, 0xb9, 0xb8, 0x31, 0x76, 0xdd, 0x83, 0xd6, 0x73, 0x9e, + 0xfe, 0xa1, 0x72, 0xff, 0xbb, 0x32, 0xa6, 0x0b, 0xfe, 0xd4, 0x81, 0x2b, 0x4f, 0x8c, 0xac, 0x70, + 0x92, 0x72, 0x12, 0xf2, 0x7b, 0x3a, 0xbe, 0x58, 0x69, 0x33, 0xeb, 0x96, 0xbd, 0xa1, 0xdf, 0x17, + 0xde, 0xb7, 0x0d, 0xc3, 0xcd, 0x78, 0x49, 0x57, 0x0b, 0xc5, 0x76, 0x6f, 0x07, 0xb2, 0x35, 0x86, + 0x33, 0xc5, 0xfc, 0x65, 0x9d, 0xa5, 0x04, 0x8a, 0x18, 0x65, 0x38, 0xf3, 0xa1, 0x3c, 0x62, 0x4f, + 0xac, 0x50, 0x01, 0x8c, 0xf8, 0x1e, 0x4f, 0xb1, 0xf8, 0x12, 0x03, 0x8a, 0x4e, 0x5f, 0xf2, 0xaf, + 0x91, 0x61, 0xaa, 0x8e, 0x9d, 0x25, 0x1d, 0x77, 0xda, 0x36, 0xb2, 0x0e, 0x6e, 0x1a, 0xdd, 0x0c, + 0xf9, 0x4d, 0x42, 0x6c, 0xd0, 0xb9, 0x05, 0x96, 0x0d, 0xbd, 0x5a, 0x12, 0xdd, 0x11, 0x66, 0xab, + 0x6f, 0x1e, 0xb7, 0x23, 0x81, 0x49, 0xcc, 0xa3, 0x37, 0xbe, 0xe4, 0x31, 0x04, 0xb6, 0x95, 0x61, + 0x86, 0xdd, 0xee, 0x57, 0xec, 0xe8, 0x5b, 0x06, 0xda, 0x1d, 0x41, 0x0b, 0x51, 0x6e, 0x81, 0x9c, + 0xe6, 0x52, 0x63, 0x5b, 0xaf, 0xa8, 0x6f, 0xe7, 0x49, 0xca, 0x53, 0x69, 0xc6, 0x04, 0x61, 0x24, + 0x03, 0xc5, 0xf6, 0x78, 0x1e, 0x63, 0x18, 0xc9, 0x81, 0x85, 0xa7, 0x8f, 0xd8, 0x97, 0x64, 0x38, + 0xce, 0x18, 0x38, 0x8b, 0x2d, 0x47, 0x6f, 0x69, 0x1d, 0x8a, 0xdc, 0x43, 0x99, 0x51, 0x40, 0xb7, + 0x02, 0xb3, 0x7b, 0x61, 0xb2, 0x0c, 0xc2, 0x33, 0x7d, 0x21, 0xe4, 0x18, 0x50, 0xf9, 0x1f, 0x13, + 0x84, 0xe3, 0xe3, 0xa4, 0xca, 0xd1, 0x1c, 0x63, 0x38, 0x3e, 0x61, 0x26, 0xd2, 0x87, 0xf8, 0x45, + 0x2c, 0x34, 0x4f, 0xd0, 0x7d, 0x7e, 0x4e, 0x18, 0xdb, 0x0d, 0x98, 0x26, 0x58, 0xd2, 0x1f, 0xd9, + 0x32, 0x44, 0x8c, 0x12, 0xfb, 0xfd, 0x0e, 0xbb, 0x30, 0xcc, 0xff, 0x57, 0x0d, 0xd3, 0x41, 0xe7, + 0x00, 0x82, 0x4f, 0xe1, 0x4e, 0x3a, 0x13, 0xd5, 0x49, 0x4b, 0x62, 0x9d, 0xf4, 0x1b, 0x84, 0x83, + 0xa5, 0xf4, 0x67, 0xfb, 0xe0, 0xea, 0x21, 0x16, 0x26, 0x63, 0x70, 0xe9, 0xe9, 0xeb, 0xc5, 0x2b, + 0xb2, 0xbd, 0xd7, 0xb8, 0x7f, 0x78, 0x24, 0xf3, 0xa9, 0x70, 0x7f, 0x20, 0xf7, 0xf4, 0x07, 0x07, + 0xb0, 0xa4, 0x6f, 0x80, 0xa3, 0xb4, 0x88, 0x92, 0xcf, 0x56, 0x8e, 0x86, 0x82, 0xe8, 0x49, 0x46, + 0x1f, 0x19, 0x42, 0x09, 0x06, 0xdd, 0x31, 0x1f, 0xd7, 0xc9, 0x25, 0x33, 0x76, 0x93, 0x2a, 0xc8, + 0xe1, 0x5d, 0x4d, 0xff, 0xf5, 0x2c, 0xb5, 0x76, 0x37, 0xc8, 0x9d, 0x6e, 0xe8, 0x2f, 0xb2, 0xa3, + 0x18, 0x11, 0xee, 0x86, 0x2c, 0x71, 0x71, 0x97, 0x23, 0x97, 0x34, 0x82, 0x22, 0x83, 0x0b, 0xf7, + 0xf0, 0x03, 0xce, 0xca, 0x11, 0x95, 0xfc, 0xa9, 0xdc, 0x08, 0x47, 0xcf, 0x6b, 0xad, 0x0b, 0x5b, + 0x96, 0xb9, 0x4b, 0x6e, 0xbf, 0x32, 0xd9, 0x35, 0x5a, 0xe4, 0x3a, 0x42, 0xfe, 0x83, 0x72, 0xab, + 0x67, 0x3a, 0xe4, 0x06, 0x99, 0x0e, 0x2b, 0x47, 0x98, 0xf1, 0xa0, 0x3c, 0xd1, 0xef, 0x74, 0xf2, + 0xb1, 0x9d, 0xce, 0xca, 0x11, 0xaf, 0xdb, 0x51, 0x16, 0x61, 0xb2, 0xad, 0xef, 0x91, 0xad, 0x6a, + 0x32, 0xeb, 0x1a, 0x74, 0x74, 0x79, 0x51, 0xdf, 0xa3, 0x1b, 0xdb, 0x2b, 0x47, 0x54, 0xff, 0x4f, + 0x65, 0x19, 0xa6, 0xc8, 0xb6, 0x00, 0x21, 0x33, 0x99, 0xe8, 0x58, 0xf2, 0xca, 0x11, 0x35, 0xf8, + 0xd7, 0xb5, 0x3e, 0xb2, 0xe4, 0xec, 0xc7, 0x5d, 0xde, 0x76, 0x7b, 0x26, 0xd1, 0x76, 0xbb, 0x2b, + 0x0b, 0xba, 0xe1, 0x7e, 0x12, 0x72, 0x2d, 0x22, 0x61, 0x89, 0x49, 0x98, 0xbe, 0x2a, 0x77, 0x40, + 0x76, 0x47, 0xb3, 0xbc, 0xc9, 0xf3, 0xf5, 0x83, 0xe9, 0xae, 0x69, 0xd6, 0x05, 0x17, 0x41, 0xf7, + 0xaf, 0x85, 0x09, 0xc8, 0x11, 0xc1, 0xf9, 0x0f, 0xe8, 0xcd, 0x59, 0x6a, 0x86, 0x94, 0x4c, 0xc3, + 0x1d, 0xf6, 0x1b, 0xa6, 0x77, 0x40, 0xe6, 0xf7, 0x33, 0xa3, 0xb1, 0x20, 0xfb, 0xde, 0x7b, 0x2e, + 0x47, 0xde, 0x7b, 0xde, 0x73, 0x01, 0x6f, 0xb6, 0xf7, 0x02, 0xde, 0x60, 0xf9, 0x20, 0x37, 0xd8, + 0x51, 0xe5, 0x4f, 0x87, 0x30, 0x5d, 0x7a, 0x05, 0x11, 0x3d, 0x03, 0xef, 0xe8, 0x46, 0xa8, 0xce, + 0xde, 0x6b, 0xc2, 0x4e, 0x29, 0xa9, 0x51, 0x33, 0x80, 0xbd, 0xf4, 0xfb, 0xa6, 0xdf, 0xcc, 0xc2, + 0x29, 0x7a, 0xcd, 0xf3, 0x1e, 0x6e, 0x98, 0xfc, 0x7d, 0x93, 0xe8, 0x13, 0x23, 0x51, 0x9a, 0x3e, + 0x03, 0x8e, 0xdc, 0x77, 0xc0, 0xd9, 0x77, 0x48, 0x39, 0x3b, 0xe0, 0x90, 0x72, 0x2e, 0xd9, 0xca, + 0xe1, 0xfb, 0xc3, 0xfa, 0xb3, 0xce, 0xeb, 0xcf, 0xed, 0x11, 0x00, 0xf5, 0x93, 0xcb, 0x48, 0xec, + 0x9b, 0xb7, 0xf9, 0x9a, 0x52, 0xe7, 0x34, 0xe5, 0xae, 0xe1, 0x19, 0x49, 0x5f, 0x5b, 0x7e, 0x2f, + 0x0b, 0x97, 0x05, 0xcc, 0x54, 0xf1, 0x45, 0xa6, 0x28, 0x9f, 0x1d, 0x89, 0xa2, 0x24, 0x8f, 0x81, + 0x90, 0xb6, 0xc6, 0xfc, 0xb1, 0xf0, 0xd9, 0xa1, 0x5e, 0xa0, 0x7c, 0xd9, 0x44, 0x28, 0xcb, 0x49, + 0xc8, 0xd3, 0x1e, 0x86, 0x41, 0xc3, 0xde, 0x12, 0x76, 0x37, 0x62, 0x27, 0x8e, 0x44, 0x79, 0x1b, + 0x83, 0xfe, 0xb0, 0x75, 0x8d, 0xc6, 0xae, 0x65, 0x54, 0x0c, 0xc7, 0x44, 0x3f, 0x33, 0x12, 0xc5, + 0xf1, 0xbd, 0xe1, 0xe4, 0x61, 0xbc, 0xe1, 0x86, 0x5a, 0xe5, 0xf0, 0x6a, 0x70, 0x28, 0xab, 0x1c, + 0x11, 0x85, 0xa7, 0x8f, 0xdf, 0x5b, 0x65, 0x38, 0xc9, 0x26, 0x5b, 0x0b, 0xbc, 0x85, 0x88, 0xee, + 0x1b, 0x05, 0x90, 0xc7, 0x3d, 0x33, 0x89, 0xdd, 0x72, 0x46, 0x5e, 0xf8, 0x93, 0x52, 0xb1, 0xf7, + 0x3b, 0x70, 0xd3, 0xc1, 0x1e, 0x0e, 0x47, 0x82, 0x94, 0xd8, 0xb5, 0x0e, 0x09, 0xd8, 0x48, 0x1f, + 0xb3, 0x17, 0xc8, 0x90, 0x67, 0xd7, 0xfb, 0x6f, 0xa4, 0xe2, 0x30, 0xc1, 0x47, 0x79, 0x16, 0xd8, + 0x91, 0x4b, 0x7c, 0xc9, 0x7d, 0x7a, 0x7b, 0x71, 0x87, 0x74, 0x8b, 0xfd, 0xb7, 0x24, 0x98, 0xae, + 0x63, 0xa7, 0xa4, 0x59, 0x96, 0xae, 0x6d, 0x8d, 0xca, 0xe3, 0x5b, 0xd4, 0x7b, 0x18, 0x7d, 0x3b, + 0x23, 0x7a, 0x9e, 0xc6, 0x5f, 0x08, 0xf7, 0x58, 0x8d, 0x88, 0x25, 0xf8, 0x88, 0xd0, 0x99, 0x99, + 0x41, 0xd4, 0xc6, 0xe0, 0xb1, 0x2d, 0xc1, 0x84, 0x77, 0x16, 0xef, 0x66, 0xee, 0x7c, 0xe6, 0xb6, + 0xb3, 0xe3, 0x1d, 0x83, 0x21, 0xcf, 0xfb, 0xcf, 0x80, 0xa1, 0x97, 0x27, 0x74, 0x94, 0x8f, 0x3f, + 0x48, 0x98, 0xac, 0x8d, 0x25, 0x71, 0x87, 0x3f, 0xac, 0xa3, 0x83, 0xbf, 0x33, 0xc1, 0x96, 0x23, + 0x57, 0x35, 0x07, 0x3f, 0x80, 0x3e, 0x27, 0xc3, 0x44, 0x1d, 0x3b, 0xee, 0x78, 0xcb, 0x5d, 0x6e, + 0x3a, 0xac, 0x86, 0x2b, 0xa1, 0x15, 0x8f, 0x29, 0xb6, 0x86, 0x71, 0x0f, 0x4c, 0x75, 0x2d, 0xb3, + 0x85, 0x6d, 0x9b, 0xad, 0x5e, 0x84, 0x1d, 0xd5, 0xfa, 0x8d, 0xfe, 0x84, 0xb5, 0xf9, 0x75, 0xef, + 0x1f, 0x35, 0xf8, 0x3d, 0xa9, 0x19, 0x40, 0x29, 0xb1, 0x0a, 0x8e, 0xdb, 0x0c, 0x88, 0x2b, 0x3c, + 0x7d, 0xa0, 0x3f, 0x2d, 0xc3, 0x4c, 0x1d, 0x3b, 0xbe, 0x14, 0x13, 0x6c, 0x72, 0x44, 0xc3, 0xcb, + 0x41, 0x29, 0x1f, 0x0c, 0x4a, 0xf1, 0xab, 0x01, 0x79, 0x69, 0xfa, 0xc4, 0xc6, 0x78, 0x35, 0xa0, + 0x18, 0x07, 0x63, 0x38, 0xbe, 0xf6, 0x58, 0x98, 0x22, 0xbc, 0x90, 0x06, 0xfb, 0x8b, 0xd9, 0xa0, + 0xf1, 0x7e, 0x3e, 0xa5, 0xc6, 0x7b, 0x27, 0xe4, 0x76, 0x34, 0xeb, 0x82, 0x4d, 0x1a, 0xee, 0xb4, + 0x88, 0xd9, 0xbe, 0xe6, 0x66, 0x57, 0xe9, 0x5f, 0xfd, 0xfd, 0x34, 0x73, 0xc9, 0xfc, 0x34, 0x1f, + 0x91, 0x12, 0x8d, 0x84, 0x74, 0xee, 0x30, 0xc2, 0x26, 0x9f, 0x60, 0xdc, 0x8c, 0x29, 0x3b, 0x7d, + 0xe5, 0x78, 0x48, 0x86, 0x49, 0x77, 0xdc, 0x26, 0xf6, 0xf8, 0xb9, 0x83, 0xab, 0x43, 0x7f, 0x43, + 0x3f, 0x61, 0x0f, 0xec, 0x49, 0x64, 0x74, 0xe6, 0x7d, 0x82, 0x1e, 0x38, 0xae, 0xf0, 0xf4, 0xf1, + 0x78, 0x3b, 0xc5, 0x83, 0xb4, 0x07, 0xf4, 0x3a, 0x19, 0xe4, 0x65, 0xec, 0x8c, 0xdb, 0x8a, 0x7c, + 0x8b, 0x70, 0x88, 0x23, 0x4e, 0x60, 0x84, 0xe7, 0xf9, 0x65, 0x3c, 0x9a, 0x06, 0x24, 0x16, 0xdb, + 0x48, 0x88, 0x81, 0xf4, 0x51, 0x7b, 0x37, 0x45, 0x8d, 0x6e, 0x2e, 0xfc, 0xf4, 0x08, 0x7a, 0xd5, + 0xf1, 0x2e, 0x7c, 0x78, 0x02, 0x24, 0x34, 0x0e, 0xab, 0xbd, 0xf5, 0x2b, 0x7c, 0x2c, 0x57, 0xf1, + 0x81, 0xdb, 0xd8, 0xb7, 0x71, 0xeb, 0x02, 0x6e, 0xa3, 0x9f, 0x38, 0x38, 0x74, 0xa7, 0x60, 0xa2, + 0x45, 0xa9, 0x11, 0xf0, 0x26, 0x55, 0xef, 0x35, 0xc1, 0xbd, 0xd2, 0x7c, 0x47, 0x44, 0x7f, 0x1f, + 0xe3, 0xbd, 0xd2, 0x02, 0xc5, 0x8f, 0xc1, 0x6c, 0xa1, 0xb3, 0x8c, 0x4a, 0xcb, 0x34, 0xd0, 0x7f, + 0x39, 0x38, 0x2c, 0x57, 0xc1, 0x94, 0xde, 0x32, 0x0d, 0x12, 0x86, 0xc2, 0x3b, 0x04, 0xe4, 0x27, + 0x78, 0x5f, 0xcb, 0x3b, 0xe6, 0xfd, 0x3a, 0xdb, 0x35, 0x0f, 0x12, 0x86, 0x35, 0x26, 0x5c, 0xd6, + 0x0f, 0xcb, 0x98, 0xe8, 0x53, 0x76, 0xfa, 0x90, 0x7d, 0x24, 0xf0, 0x6e, 0xa3, 0x5d, 0xe1, 0xa3, + 0x62, 0x15, 0x78, 0x98, 0xe1, 0x2c, 0x5c, 0x8b, 0x43, 0x19, 0xce, 0x62, 0x18, 0x18, 0xc3, 0x8d, + 0x15, 0x01, 0x8e, 0xa9, 0xaf, 0x01, 0x1f, 0x00, 0x9d, 0xd1, 0x99, 0x87, 0x43, 0xa2, 0x73, 0x38, + 0x26, 0xe2, 0xfb, 0x58, 0x88, 0x4c, 0x66, 0xf1, 0xa0, 0xff, 0x3a, 0x0a, 0x70, 0x6e, 0x1f, 0xc6, + 0x5f, 0x81, 0x7a, 0x2b, 0x24, 0xb8, 0x11, 0x7b, 0x9f, 0x04, 0x5d, 0x2a, 0x63, 0xbc, 0x2b, 0x5e, + 0xa4, 0xfc, 0xf4, 0x01, 0x7c, 0x9e, 0x0c, 0x73, 0xc4, 0x47, 0xa0, 0x83, 0x35, 0x8b, 0x76, 0x94, + 0x23, 0x71, 0x94, 0x7f, 0xbb, 0x70, 0x80, 0x1f, 0x5e, 0x0e, 0x01, 0x1f, 0x23, 0x81, 0x42, 0x2c, + 0xba, 0x8f, 0x20, 0x0b, 0x63, 0xd9, 0x46, 0x29, 0xf8, 0x2c, 0x30, 0x15, 0x1f, 0x0d, 0x1e, 0x09, + 0x3d, 0x72, 0x79, 0x61, 0x78, 0x8d, 0x6d, 0xcc, 0x1e, 0xb9, 0x22, 0x4c, 0xa4, 0x8f, 0xc9, 0xeb, + 0x6e, 0x61, 0x0b, 0xce, 0x0d, 0x72, 0x61, 0xfc, 0x2b, 0xb3, 0xfe, 0x89, 0xb6, 0x4f, 0x8f, 0xc4, + 0x03, 0xf3, 0x00, 0x01, 0xf1, 0x15, 0xc8, 0x5a, 0xe6, 0x45, 0xba, 0xb4, 0x35, 0xab, 0x92, 0x67, + 0x7a, 0x3d, 0x65, 0x67, 0x77, 0xc7, 0xa0, 0x27, 0x43, 0x67, 0x55, 0xef, 0x55, 0xb9, 0x0e, 0x66, + 0x2f, 0xea, 0xce, 0xf6, 0x0a, 0xd6, 0xda, 0xd8, 0x52, 0xcd, 0x8b, 0xc4, 0x63, 0x6e, 0x52, 0xe5, + 0x13, 0x79, 0xff, 0x15, 0x01, 0xfb, 0x92, 0xdc, 0x22, 0x3f, 0x96, 0xe3, 0x6f, 0x49, 0x2c, 0xcf, + 0x68, 0xae, 0xd2, 0x57, 0x98, 0xf7, 0xc8, 0x30, 0xa5, 0x9a, 0x17, 0x99, 0x92, 0xfc, 0x5f, 0x87, + 0xab, 0x23, 0x89, 0x27, 0x7a, 0x44, 0x72, 0x3e, 0xfb, 0x63, 0x9f, 0xe8, 0xc5, 0x16, 0x3f, 0x96, + 0x93, 0x4b, 0x33, 0xaa, 0x79, 0xb1, 0x8e, 0x1d, 0xda, 0x22, 0x50, 0x73, 0x44, 0x4e, 0xd6, 0xba, + 0x4d, 0x09, 0xb2, 0x79, 0xb8, 0xff, 0x9e, 0x74, 0x17, 0xc1, 0x17, 0x90, 0xcf, 0xe2, 0xb8, 0x77, + 0x11, 0x06, 0x72, 0x30, 0x86, 0x18, 0x29, 0x32, 0x4c, 0xab, 0xe6, 0x45, 0x77, 0x68, 0x58, 0xd2, + 0x3b, 0x9d, 0xd1, 0x8c, 0x90, 0x49, 0x8d, 0x7f, 0x4f, 0x0c, 0x1e, 0x17, 0x63, 0x37, 0xfe, 0x07, + 0x30, 0x90, 0x3e, 0x0c, 0xcf, 0xa1, 0x8d, 0xc5, 0x1b, 0xa1, 0x8d, 0xd1, 0xe0, 0x30, 0x6c, 0x83, + 0xf0, 0xd9, 0x38, 0xb4, 0x06, 0x11, 0xc5, 0xc1, 0x58, 0x76, 0x4e, 0xe6, 0x4a, 0x64, 0x98, 0x1f, + 0x6d, 0x9b, 0x78, 0x67, 0x32, 0xd7, 0x44, 0x36, 0xec, 0x72, 0x8c, 0x8c, 0x04, 0x8d, 0x04, 0x2e, + 0x88, 0x02, 0x3c, 0xa4, 0x8f, 0xc7, 0x07, 0x65, 0x98, 0xa1, 0x2c, 0x3c, 0x4a, 0xac, 0x80, 0xa1, + 0x1a, 0x55, 0xb8, 0x06, 0x87, 0xd3, 0xa8, 0x62, 0x38, 0x18, 0xcb, 0xad, 0xa0, 0xae, 0x1d, 0x37, + 0xc4, 0xf1, 0xf1, 0x28, 0x04, 0x87, 0x36, 0xc6, 0x46, 0x78, 0x84, 0x7c, 0x18, 0x63, 0xec, 0x90, + 0x8e, 0x91, 0x3f, 0xc7, 0x6f, 0x45, 0xa3, 0xc4, 0xe0, 0x00, 0x4d, 0x61, 0x84, 0x30, 0x0c, 0xd9, + 0x14, 0x0e, 0x09, 0x89, 0x2f, 0xcb, 0x00, 0x94, 0x81, 0x35, 0x73, 0x8f, 0x5c, 0xe6, 0x33, 0x82, + 0xee, 0xac, 0xd7, 0xad, 0x5e, 0x1e, 0xe0, 0x56, 0x9f, 0x30, 0x84, 0x4b, 0xd2, 0x95, 0xc0, 0x90, + 0x94, 0xdd, 0x4a, 0x8e, 0x7d, 0x25, 0x30, 0xbe, 0xfc, 0xf4, 0x31, 0xfe, 0x22, 0xb5, 0xe6, 0x82, + 0x03, 0xa6, 0xbf, 0x3e, 0x12, 0x94, 0x43, 0xb3, 0x7f, 0x99, 0x9f, 0xfd, 0x1f, 0x00, 0xdb, 0x61, + 0x6d, 0xc4, 0x41, 0x07, 0x47, 0xd3, 0xb7, 0x11, 0x0f, 0xef, 0x80, 0xe8, 0x4f, 0x67, 0xe1, 0x28, + 0xeb, 0x44, 0xbe, 0x1f, 0x20, 0x4e, 0x78, 0x0e, 0x8f, 0xeb, 0x24, 0x07, 0xa0, 0x3c, 0xaa, 0x05, + 0xa9, 0x24, 0x4b, 0x99, 0x02, 0xec, 0x8d, 0x65, 0x75, 0x23, 0x5f, 0x7e, 0xa0, 0xab, 0x19, 0x6d, + 0xf1, 0x70, 0xbf, 0x03, 0x80, 0xf7, 0xd6, 0x1a, 0x65, 0x7e, 0xad, 0xb1, 0xcf, 0xca, 0x64, 0xe2, + 0x9d, 0x6b, 0x22, 0x32, 0xca, 0xee, 0xd8, 0x77, 0xae, 0xa3, 0xcb, 0x4e, 0x1f, 0xa5, 0x77, 0xca, + 0x90, 0xad, 0x9b, 0x96, 0x83, 0x9e, 0x9b, 0xa4, 0x75, 0x52, 0xc9, 0x07, 0x20, 0x79, 0xef, 0x4a, + 0x89, 0xbb, 0xa5, 0xf9, 0xe6, 0xf8, 0xa3, 0xce, 0x9a, 0xa3, 0x11, 0xaf, 0x6e, 0xb7, 0xfc, 0xd0, + 0x75, 0xcd, 0x49, 0xe3, 0xe9, 0x50, 0xf9, 0xd5, 0xa3, 0x0f, 0x60, 0xa4, 0x16, 0x4f, 0x27, 0xb2, + 0xe4, 0xf4, 0x71, 0x7b, 0xf8, 0x28, 0xf3, 0x6d, 0x5d, 0xd2, 0x3b, 0x18, 0x3d, 0x97, 0xba, 0x8c, + 0x54, 0xb5, 0x1d, 0x2c, 0x7e, 0x24, 0x26, 0xd6, 0xb5, 0x95, 0xc4, 0x97, 0x95, 0x83, 0xf8, 0xb2, + 0x49, 0x1b, 0x14, 0x3d, 0x80, 0x4e, 0x59, 0x1a, 0x77, 0x83, 0x8a, 0x29, 0x7b, 0x2c, 0x71, 0x3a, + 0x8f, 0xd5, 0xb1, 0x43, 0x8d, 0xca, 0x9a, 0x77, 0x03, 0xcb, 0x4f, 0x8e, 0x24, 0x62, 0xa7, 0x7f, + 0xc1, 0x8b, 0xdc, 0x73, 0xc1, 0xcb, 0x7b, 0xc2, 0xe0, 0xac, 0xf1, 0xe0, 0xfc, 0x68, 0xb4, 0x80, + 0x78, 0x26, 0x47, 0x02, 0xd3, 0x5b, 0x7c, 0x98, 0xd6, 0x39, 0x98, 0xee, 0x18, 0x92, 0x8b, 0xf4, + 0x01, 0xfb, 0xa5, 0x1c, 0x1c, 0xa5, 0x93, 0xfe, 0xa2, 0xd1, 0x66, 0x11, 0x56, 0xdf, 0x28, 0x1d, + 0xf2, 0x66, 0xdb, 0xfe, 0x10, 0xac, 0x5c, 0x2c, 0xe7, 0x5c, 0xef, 0xed, 0xf8, 0x0b, 0x34, 0x9c, + 0xab, 0xdb, 0x89, 0x92, 0x9d, 0x36, 0xf1, 0x1b, 0xf2, 0xfd, 0xff, 0xf8, 0xbb, 0x8c, 0x26, 0xc4, + 0xef, 0x32, 0xfa, 0x93, 0x64, 0xeb, 0x76, 0xa4, 0xe8, 0x1e, 0x81, 0xa7, 0x6c, 0x3b, 0x25, 0x58, + 0xd1, 0x13, 0xe0, 0xee, 0x07, 0xc3, 0x9d, 0x2c, 0x88, 0x20, 0x32, 0xa4, 0x3b, 0x19, 0x21, 0x70, + 0x98, 0xee, 0x64, 0x83, 0x18, 0x18, 0xc3, 0xad, 0xf6, 0x39, 0xb6, 0x9b, 0x4f, 0xda, 0x0d, 0xfa, + 0x2b, 0x29, 0xf5, 0x51, 0xfa, 0x3b, 0x99, 0x44, 0xfe, 0xcf, 0x84, 0xaf, 0xf8, 0x61, 0x3a, 0x89, + 0x47, 0x73, 0x1c, 0xb9, 0x31, 0xac, 0x1b, 0x49, 0xc4, 0x17, 0xfd, 0x9c, 0xde, 0x76, 0xb6, 0x47, + 0x74, 0xa2, 0xe3, 0xa2, 0x4b, 0xcb, 0xbb, 0x1e, 0x99, 0xbc, 0xa0, 0x7f, 0xcb, 0x24, 0x0a, 0x21, + 0xe5, 0x8b, 0x84, 0xb0, 0x15, 0x21, 0xe2, 0x04, 0x81, 0x9f, 0x62, 0xe9, 0x8d, 0x51, 0xa3, 0xcf, + 0xea, 0x6d, 0x6c, 0x3e, 0x0a, 0x35, 0x9a, 0xf0, 0x35, 0x3a, 0x8d, 0x8e, 0x23, 0xf7, 0x03, 0xaa, + 0xd1, 0xbe, 0x48, 0x46, 0xa4, 0xd1, 0xb1, 0xf4, 0xd2, 0x97, 0xf1, 0xcb, 0x67, 0xd8, 0x44, 0x6a, + 0x55, 0x37, 0x2e, 0xa0, 0x7f, 0xce, 0x7b, 0x17, 0x33, 0x9f, 0xd3, 0x9d, 0x6d, 0x16, 0x0b, 0xe6, + 0xf7, 0x84, 0xef, 0x46, 0x19, 0x22, 0xde, 0x0b, 0x1f, 0x4e, 0x2a, 0xb7, 0x2f, 0x9c, 0x54, 0x11, + 0x66, 0x75, 0xc3, 0xc1, 0x96, 0xa1, 0x75, 0x96, 0x3a, 0xda, 0x96, 0x7d, 0x6a, 0xa2, 0xef, 0xe5, + 0x75, 0x95, 0x50, 0x1e, 0x95, 0xff, 0x23, 0x7c, 0x7d, 0xe5, 0x24, 0x7f, 0x7d, 0x65, 0x44, 0xf4, + 0xab, 0xa9, 0xe8, 0xe8, 0x57, 0x7e, 0x74, 0x2b, 0x18, 0x1c, 0x1c, 0x5b, 0xd4, 0x36, 0x4e, 0x18, + 0xee, 0xef, 0x66, 0xc1, 0x28, 0x6c, 0x7e, 0xe8, 0xc7, 0x57, 0xc9, 0x89, 0x56, 0xf7, 0x5c, 0x45, + 0x98, 0xef, 0x55, 0x82, 0xc4, 0x16, 0x6a, 0xb8, 0xf2, 0x72, 0x4f, 0xe5, 0x7d, 0x93, 0x27, 0x2b, + 0x60, 0xf2, 0x84, 0x95, 0x2a, 0x27, 0xa6, 0x54, 0x49, 0x16, 0x0b, 0x45, 0x6a, 0x3b, 0x86, 0xd3, + 0x48, 0x39, 0x38, 0xe6, 0x45, 0xbb, 0xed, 0x76, 0xb1, 0x66, 0x69, 0x46, 0x0b, 0xa3, 0x8f, 0x48, + 0xa3, 0x30, 0x7b, 0x97, 0x60, 0x52, 0x6f, 0x99, 0x46, 0x5d, 0x7f, 0xa6, 0x77, 0xb9, 0x5c, 0x7c, + 0x90, 0x75, 0x22, 0x91, 0x0a, 0xfb, 0x43, 0xf5, 0xff, 0x55, 0x2a, 0x30, 0xd5, 0xd2, 0xac, 0x36, + 0x0d, 0xc2, 0x97, 0xeb, 0xb9, 0xc8, 0x29, 0x92, 0x50, 0xc9, 0xfb, 0x45, 0x0d, 0xfe, 0x56, 0x6a, + 0xbc, 0x10, 0xf3, 0x3d, 0xd1, 0x3c, 0x22, 0x89, 0x2d, 0x06, 0x3f, 0x71, 0x32, 0x77, 0xa5, 0x63, + 0xe1, 0x0e, 0xb9, 0x83, 0x9e, 0xf6, 0x10, 0x53, 0x6a, 0x90, 0x90, 0x74, 0x79, 0x80, 0x14, 0xb5, + 0x0f, 0x8d, 0x71, 0x2f, 0x0f, 0x08, 0x71, 0x91, 0xbe, 0x66, 0xbe, 0x2d, 0x0f, 0xb3, 0xb4, 0x57, + 0x63, 0xe2, 0x44, 0xcf, 0x23, 0x57, 0x48, 0x3b, 0xf7, 0xe2, 0x4b, 0xa8, 0x7e, 0xf0, 0x31, 0xb9, + 0x00, 0xf2, 0x05, 0x3f, 0xe0, 0xa0, 0xfb, 0x98, 0x74, 0xdf, 0xde, 0xe3, 0x6b, 0x9e, 0xf2, 0x34, + 0xee, 0x7d, 0xfb, 0xf8, 0xe2, 0xd3, 0xc7, 0xe7, 0x97, 0x65, 0x90, 0x8b, 0xed, 0x36, 0x6a, 0x1d, + 0x1c, 0x8a, 0x6b, 0x60, 0xda, 0x6b, 0x33, 0x41, 0x0c, 0xc8, 0x70, 0x52, 0xd2, 0x45, 0x50, 0x5f, + 0x36, 0xc5, 0xf6, 0xd8, 0x77, 0x15, 0x62, 0xca, 0x4e, 0x1f, 0x94, 0x5f, 0x9f, 0x60, 0x8d, 0x66, + 0xc1, 0x34, 0x2f, 0x90, 0xa3, 0x32, 0xcf, 0x95, 0x21, 0xb7, 0x84, 0x9d, 0xd6, 0xf6, 0x88, 0xda, + 0xcc, 0xae, 0xd5, 0xf1, 0xda, 0xcc, 0xbe, 0xfb, 0xf0, 0x07, 0xdb, 0xb0, 0x1e, 0x5b, 0xf3, 0x84, + 0xa5, 0x71, 0x47, 0x77, 0x8e, 0x2d, 0x3d, 0x7d, 0x70, 0xfe, 0x4d, 0x86, 0x39, 0x7f, 0x85, 0x8b, + 0x62, 0xf2, 0x4b, 0x99, 0x47, 0xdb, 0x7a, 0x27, 0xfa, 0x6c, 0xb2, 0x10, 0x69, 0xbe, 0x4c, 0xf9, + 0x9a, 0xa5, 0xbc, 0xb0, 0x98, 0x20, 0x78, 0x9a, 0x18, 0x83, 0x63, 0x98, 0xc1, 0xcb, 0x30, 0x49, + 0x18, 0x5a, 0xd4, 0xf7, 0x88, 0xeb, 0x20, 0xb7, 0xd0, 0xf8, 0xac, 0x91, 0x2c, 0x34, 0xde, 0xc1, + 0x2f, 0x34, 0x0a, 0x46, 0x3c, 0xf6, 0xd6, 0x19, 0x13, 0xfa, 0xd2, 0xb8, 0xff, 0x8f, 0x7c, 0x99, + 0x31, 0x81, 0x2f, 0xcd, 0x80, 0xf2, 0xd3, 0x47, 0xf4, 0x55, 0xff, 0x89, 0x75, 0xb6, 0xde, 0x86, + 0x2a, 0xfa, 0x1f, 0xc7, 0x20, 0x7b, 0xd6, 0x7d, 0xf8, 0x5f, 0xc1, 0x8d, 0x58, 0x2f, 0x1e, 0x41, + 0x70, 0x86, 0xa7, 0x43, 0xd6, 0xa5, 0xcf, 0xa6, 0x2d, 0x37, 0x8a, 0xed, 0xee, 0xba, 0x8c, 0xa8, + 0xe4, 0x3f, 0xe5, 0x24, 0xe4, 0x6d, 0x73, 0xd7, 0x6a, 0xb9, 0xe6, 0xb3, 0xab, 0x31, 0xec, 0x2d, + 0x69, 0x50, 0x52, 0x8e, 0xf4, 0xfc, 0xe8, 0x5c, 0x46, 0x43, 0x17, 0x24, 0xc9, 0xdc, 0x05, 0x49, + 0x09, 0xf6, 0x0f, 0x04, 0x78, 0x4b, 0x5f, 0x23, 0xfe, 0x8a, 0xdc, 0x15, 0xd8, 0x1e, 0x15, 0xec, + 0x11, 0x62, 0x39, 0xa8, 0x3a, 0x24, 0x75, 0xf8, 0xe6, 0x45, 0xeb, 0xc7, 0x81, 0x1f, 0xab, 0xc3, + 0xb7, 0x00, 0x0f, 0x63, 0x39, 0xa5, 0x9e, 0x67, 0x4e, 0xaa, 0xf7, 0x8d, 0x12, 0xdd, 0x2c, 0xa7, + 0xf4, 0x07, 0x42, 0x67, 0x84, 0xce, 0xab, 0x43, 0xa3, 0x73, 0x48, 0xee, 0xab, 0x7f, 0x20, 0x93, + 0x48, 0x98, 0x9e, 0x91, 0x23, 0x7e, 0xd1, 0x51, 0x62, 0x88, 0xdc, 0x31, 0x98, 0x8b, 0x03, 0x3d, + 0x3b, 0x7c, 0x68, 0x70, 0x5e, 0x74, 0x21, 0xfe, 0xc7, 0x1d, 0x1a, 0x5c, 0x94, 0x91, 0xf4, 0x81, + 0x7c, 0x2d, 0xbd, 0x58, 0xac, 0xd8, 0x72, 0xf4, 0xbd, 0x11, 0xb7, 0x34, 0x7e, 0x78, 0x49, 0x18, + 0x0d, 0x78, 0x9f, 0x84, 0x28, 0x87, 0xe3, 0x8e, 0x06, 0x2c, 0xc6, 0x46, 0xfa, 0x30, 0xfd, 0x6d, + 0xde, 0x95, 0x1e, 0x5b, 0x9b, 0x79, 0x1d, 0x5b, 0x0d, 0xc0, 0x07, 0x47, 0xeb, 0x0c, 0xcc, 0x84, + 0xa6, 0xfe, 0xde, 0x85, 0x35, 0x5c, 0x5a, 0xd2, 0x83, 0xee, 0xbe, 0xc8, 0x46, 0xbe, 0x30, 0x90, + 0x60, 0xc1, 0x57, 0x84, 0x89, 0xb1, 0xdc, 0x07, 0xe7, 0x8d, 0x61, 0x63, 0xc2, 0xea, 0xf7, 0xc2, + 0x58, 0xd5, 0x78, 0xac, 0x6e, 0x13, 0x11, 0x93, 0xd8, 0x98, 0x26, 0x34, 0x6f, 0x7c, 0xab, 0x0f, + 0x97, 0xca, 0xc1, 0xf5, 0xf4, 0xa1, 0xf9, 0x48, 0x1f, 0xb1, 0x97, 0xd0, 0xee, 0xb0, 0x4e, 0x4d, + 0xf6, 0xd1, 0x74, 0x87, 0x6c, 0x36, 0x20, 0x73, 0xb3, 0x81, 0x84, 0xfe, 0xf6, 0x81, 0x1b, 0xa9, + 0xc7, 0xdc, 0x20, 0x88, 0xb2, 0x23, 0xf6, 0xb7, 0x1f, 0xc8, 0x41, 0xfa, 0xe0, 0xfc, 0xa3, 0x0c, + 0xb0, 0x6c, 0x99, 0xbb, 0xdd, 0x9a, 0xd5, 0xc6, 0x16, 0xfa, 0x9b, 0x60, 0x02, 0xf0, 0xc2, 0x11, + 0x4c, 0x00, 0xd6, 0x01, 0xb6, 0x7c, 0xe2, 0x4c, 0xc3, 0x6f, 0x11, 0x33, 0xf7, 0x03, 0xa6, 0xd4, + 0x10, 0x0d, 0xfe, 0xca, 0xd9, 0x1f, 0xe3, 0x31, 0x8e, 0xeb, 0xb3, 0x02, 0x72, 0xa3, 0x9c, 0x00, + 0xbc, 0xdd, 0xc7, 0xba, 0xc1, 0x61, 0x7d, 0xf7, 0x01, 0x38, 0x49, 0x1f, 0xf3, 0x7f, 0x9a, 0x80, + 0x69, 0xba, 0x5d, 0x47, 0x65, 0xfa, 0xf7, 0x01, 0xe8, 0xbf, 0x3e, 0x02, 0xd0, 0x37, 0x60, 0xc6, + 0x0c, 0xa8, 0xd3, 0x3e, 0x35, 0xbc, 0x00, 0x13, 0x0b, 0x7b, 0x88, 0x2f, 0x95, 0x23, 0x83, 0x3e, + 0x14, 0x46, 0x5e, 0xe5, 0x91, 0xbf, 0x23, 0x46, 0xde, 0x21, 0x8a, 0xa3, 0x84, 0xfe, 0x1d, 0x3e, + 0xf4, 0x1b, 0x1c, 0xf4, 0xc5, 0x83, 0xb0, 0x32, 0x86, 0x70, 0xfb, 0x32, 0x64, 0xc9, 0xe9, 0xb8, + 0xdf, 0x4c, 0x71, 0x7e, 0x7f, 0x0a, 0x26, 0x48, 0x93, 0xf5, 0xe7, 0x1d, 0xde, 0xab, 0xfb, 0x45, + 0xdb, 0x74, 0xb0, 0xe5, 0x7b, 0x2c, 0x78, 0xaf, 0x2e, 0x0f, 0x9e, 0x57, 0xb2, 0x7d, 0x2a, 0x4f, + 0x37, 0x22, 0xfd, 0x84, 0xa1, 0x27, 0x25, 0x61, 0x89, 0x8f, 0xec, 0xbc, 0xdc, 0x30, 0x93, 0x92, + 0x01, 0x8c, 0xa4, 0x0f, 0xfc, 0x5f, 0x64, 0xe1, 0x14, 0x5d, 0x55, 0x5a, 0xb2, 0xcc, 0x9d, 0x9e, + 0xdb, 0xad, 0xf4, 0x83, 0xeb, 0xc2, 0xf5, 0x30, 0xe7, 0x70, 0xfe, 0xd8, 0x4c, 0x27, 0x7a, 0x52, + 0xd1, 0x9f, 0x86, 0x7d, 0x2a, 0x9e, 0xc1, 0x23, 0xb9, 0x10, 0x23, 0xc0, 0x28, 0xde, 0x13, 0x2f, + 0xd4, 0x0b, 0x32, 0x1a, 0x5a, 0xa4, 0x92, 0x87, 0x5a, 0xb3, 0xf4, 0x75, 0x2a, 0x27, 0xa2, 0x53, + 0xef, 0xf5, 0x75, 0xea, 0x27, 0x38, 0x9d, 0x5a, 0x3e, 0xb8, 0x48, 0xd2, 0xd7, 0xad, 0x57, 0xfa, + 0x1b, 0x43, 0xfe, 0xb6, 0xdd, 0x4e, 0x0a, 0x9b, 0x75, 0x61, 0x7f, 0xa4, 0x2c, 0xe7, 0x8f, 0xc4, + 0xdf, 0x47, 0x91, 0x60, 0x26, 0xcc, 0x73, 0x1d, 0xa1, 0x4b, 0x73, 0x20, 0xe9, 0x1e, 0x77, 0x92, + 0xde, 0x1e, 0x6a, 0xae, 0x1b, 0x5b, 0xd0, 0x18, 0xd6, 0x96, 0xe6, 0x20, 0xbf, 0xa4, 0x77, 0x1c, + 0x6c, 0xa1, 0x2f, 0xb2, 0x99, 0xee, 0x2b, 0x53, 0x1c, 0x00, 0x16, 0x21, 0xbf, 0x49, 0x4a, 0x63, + 0x26, 0xf3, 0x4d, 0x62, 0xad, 0x87, 0x72, 0xa8, 0xb2, 0x7f, 0x93, 0x46, 0xe7, 0xeb, 0x21, 0x33, + 0xb2, 0x29, 0x72, 0x82, 0xe8, 0x7c, 0x83, 0x59, 0x18, 0xcb, 0xc5, 0x54, 0x79, 0x15, 0xef, 0xb8, + 0x63, 0xfc, 0x85, 0xf4, 0x10, 0x2e, 0x80, 0xac, 0xb7, 0x6d, 0xd2, 0x39, 0x4e, 0xa9, 0xee, 0x63, + 0x52, 0x5f, 0xa1, 0x5e, 0x51, 0x51, 0x96, 0xc7, 0xed, 0x2b, 0x24, 0xc4, 0x45, 0xfa, 0x98, 0x7d, + 0x87, 0x38, 0x8a, 0x76, 0x3b, 0x5a, 0x0b, 0xbb, 0xdc, 0xa7, 0x86, 0x1a, 0xed, 0xc9, 0xb2, 0x5e, + 0x4f, 0x16, 0x6a, 0xa7, 0xb9, 0x03, 0xb4, 0xd3, 0x61, 0x97, 0x21, 0x7d, 0x99, 0x93, 0x8a, 0x1f, + 0xda, 0x32, 0x64, 0x2c, 0x1b, 0x63, 0xb8, 0x76, 0xd4, 0x3b, 0x48, 0x3b, 0xd6, 0xd6, 0x3a, 0xec, + 0x26, 0x0d, 0x13, 0xd6, 0xc8, 0x0e, 0xcd, 0x0e, 0xb3, 0x49, 0x13, 0xcd, 0xc3, 0x18, 0xd0, 0x9a, + 0x63, 0x68, 0x7d, 0x86, 0x0d, 0xa3, 0x29, 0xef, 0x93, 0xda, 0xa6, 0xe5, 0x24, 0xdb, 0x27, 0x75, + 0xb9, 0x53, 0xc9, 0x7f, 0x49, 0x0f, 0x5e, 0xf1, 0xe7, 0xaa, 0x47, 0x35, 0x7c, 0x26, 0x38, 0x78, + 0x35, 0x88, 0x81, 0xf4, 0xe1, 0x7d, 0xd3, 0x21, 0x0d, 0x9e, 0xc3, 0x36, 0x47, 0xd6, 0x06, 0x46, + 0x36, 0x74, 0x0e, 0xd3, 0x1c, 0xa3, 0x79, 0x48, 0x1f, 0xaf, 0x6f, 0x86, 0x06, 0xce, 0x37, 0x8c, + 0x71, 0xe0, 0xf4, 0x5a, 0x66, 0x6e, 0xc8, 0x96, 0x39, 0xec, 0xfe, 0x0f, 0x93, 0xf5, 0xe8, 0x06, + 0xcc, 0x61, 0xf6, 0x7f, 0x62, 0x98, 0x48, 0x1f, 0xf1, 0x37, 0xca, 0x90, 0xab, 0x8f, 0x7f, 0xbc, + 0x1c, 0x76, 0x2e, 0x42, 0x64, 0x55, 0x1f, 0xd9, 0x70, 0x39, 0xcc, 0x5c, 0x24, 0x92, 0x85, 0x31, + 0x04, 0xde, 0x3f, 0x0a, 0x33, 0x64, 0x49, 0xc4, 0xdb, 0x66, 0xfd, 0x26, 0x1b, 0x35, 0x1f, 0x49, + 0xb1, 0xad, 0xde, 0x03, 0x93, 0xde, 0xfe, 0x1d, 0x1b, 0x39, 0xe7, 0xc5, 0xda, 0xa7, 0xc7, 0xa5, + 0xea, 0xff, 0x7f, 0x20, 0x67, 0x88, 0x91, 0xef, 0xd5, 0x0e, 0xeb, 0x0c, 0x71, 0xa8, 0xfb, 0xb5, + 0x7f, 0x12, 0x8c, 0xa8, 0xff, 0x25, 0x3d, 0xcc, 0x7b, 0xf7, 0x71, 0xb3, 0x7d, 0xf6, 0x71, 0x3f, + 0x12, 0xc6, 0xb2, 0xce, 0x63, 0x79, 0xa7, 0xa8, 0x08, 0x47, 0x38, 0xd6, 0xbe, 0xd3, 0x87, 0xf3, + 0x2c, 0x07, 0xe7, 0xc2, 0x81, 0x78, 0x19, 0xc3, 0xc1, 0xc7, 0x6c, 0x30, 0xe6, 0x7e, 0x34, 0xc5, + 0x76, 0xdc, 0x73, 0xaa, 0x22, 0xbb, 0xef, 0x54, 0x05, 0xd7, 0xd2, 0x73, 0x07, 0x6c, 0xe9, 0x1f, + 0x0d, 0x6b, 0x47, 0x83, 0xd7, 0x8e, 0xa7, 0x8b, 0x23, 0x32, 0xba, 0x91, 0xf9, 0x5d, 0xbe, 0x7a, + 0x9c, 0xe3, 0xd4, 0xa3, 0x74, 0x30, 0x66, 0xd2, 0xd7, 0x8f, 0x3f, 0xf4, 0x26, 0xb4, 0x87, 0xdc, + 0xde, 0x87, 0xdd, 0x2a, 0xe6, 0x84, 0x38, 0xb2, 0x91, 0x7b, 0x98, 0xad, 0xe2, 0x41, 0x9c, 0x8c, + 0x21, 0x16, 0xdb, 0x2c, 0x4c, 0x13, 0x9e, 0xce, 0xe9, 0xed, 0x2d, 0xec, 0xa0, 0x57, 0x51, 0x1f, + 0x45, 0x2f, 0xf2, 0xe5, 0x88, 0xc2, 0x13, 0x45, 0x9d, 0x77, 0x4d, 0xea, 0xd1, 0x41, 0x99, 0x9c, + 0x0f, 0x31, 0x38, 0xee, 0x08, 0x8a, 0x03, 0x39, 0x48, 0x1f, 0xb2, 0x0f, 0x51, 0x77, 0x9b, 0x55, + 0xed, 0x92, 0xb9, 0xeb, 0xa0, 0x07, 0x47, 0xd0, 0x41, 0x2f, 0x40, 0xbe, 0x43, 0xa8, 0xb1, 0x63, + 0x19, 0xf1, 0xd3, 0x1d, 0x26, 0x02, 0x5a, 0xbe, 0xca, 0xfe, 0x4c, 0x7a, 0x36, 0x23, 0x90, 0x23, + 0xa5, 0x33, 0xee, 0xb3, 0x19, 0x03, 0xca, 0x1f, 0xcb, 0x1d, 0x3b, 0x93, 0x6e, 0xe9, 0xfa, 0x8e, + 0xee, 0x8c, 0x28, 0x82, 0x43, 0xc7, 0xa5, 0xe5, 0x45, 0x70, 0x20, 0x2f, 0x49, 0x4f, 0x8c, 0x86, + 0xa4, 0xe2, 0xfe, 0x3e, 0xee, 0x13, 0xa3, 0xf1, 0xc5, 0xa7, 0x8f, 0xc9, 0xaf, 0xd2, 0x96, 0x75, + 0x96, 0x3a, 0xdf, 0xa6, 0xe8, 0xd7, 0x3b, 0x74, 0x63, 0xa1, 0xac, 0x1d, 0x5e, 0x63, 0xe9, 0x5b, + 0x7e, 0xfa, 0xc0, 0xfc, 0xc6, 0x0f, 0x43, 0x6e, 0x11, 0x9f, 0xdf, 0xdd, 0x42, 0x77, 0xc0, 0x64, + 0xc3, 0xc2, 0xb8, 0x62, 0x6c, 0x9a, 0xae, 0x74, 0x1d, 0xf7, 0xd9, 0x83, 0x84, 0xbd, 0xb9, 0x78, + 0x6c, 0x63, 0xad, 0x1d, 0x9c, 0x3f, 0xf3, 0x5e, 0xd1, 0x8b, 0x25, 0xc8, 0xd6, 0x1d, 0xcd, 0x41, + 0x53, 0x3e, 0xb6, 0xe8, 0xc1, 0x30, 0x16, 0x77, 0xf0, 0x58, 0x5c, 0xcf, 0xc9, 0x82, 0x70, 0x30, + 0xef, 0xfe, 0x1f, 0x01, 0x00, 0x82, 0xc9, 0xfb, 0x6d, 0xd3, 0x70, 0x73, 0x78, 0x47, 0x20, 0xbd, + 0x77, 0xf4, 0x0a, 0x5f, 0xdc, 0x77, 0x71, 0xe2, 0x7e, 0xbc, 0x58, 0x11, 0x63, 0x58, 0x69, 0x93, + 0x60, 0xca, 0x15, 0xed, 0x0a, 0xd6, 0xda, 0x36, 0xfa, 0xa1, 0x40, 0xf9, 0x23, 0xc4, 0x8c, 0xde, + 0x27, 0x1c, 0x8c, 0x93, 0xd6, 0xca, 0x27, 0x1e, 0xed, 0xd1, 0xe1, 0x6d, 0xfe, 0x4b, 0x7c, 0x30, + 0x92, 0x9b, 0x21, 0xab, 0x1b, 0x9b, 0x26, 0xf3, 0x2f, 0xbc, 0x32, 0x82, 0xb6, 0xab, 0x13, 0x2a, + 0xc9, 0x28, 0x18, 0xa9, 0x33, 0x9e, 0xad, 0xb1, 0x5c, 0x7a, 0x97, 0x75, 0x4b, 0x47, 0xff, 0xe7, + 0x40, 0x61, 0x2b, 0x0a, 0x64, 0xbb, 0x9a, 0xb3, 0xcd, 0x8a, 0x26, 0xcf, 0xae, 0x8d, 0xbc, 0x6b, + 0x68, 0x86, 0x69, 0x5c, 0xda, 0xd1, 0x9f, 0xe9, 0xdf, 0xad, 0xcb, 0xa5, 0xb9, 0x9c, 0x6f, 0x61, + 0x03, 0x5b, 0x9a, 0x83, 0xeb, 0x7b, 0x5b, 0x64, 0x8e, 0x35, 0xa9, 0x86, 0x93, 0x12, 0xeb, 0xbf, + 0xcb, 0x71, 0xb4, 0xfe, 0x6f, 0xea, 0x1d, 0x4c, 0x22, 0x35, 0x31, 0xfd, 0xf7, 0xde, 0x13, 0xe9, + 0x7f, 0x9f, 0x22, 0xd2, 0x47, 0xe3, 0xbb, 0x12, 0xcc, 0xd4, 0x5d, 0x85, 0xab, 0xef, 0xee, 0xec, + 0x68, 0xd6, 0x25, 0x74, 0x6d, 0x80, 0x4a, 0x48, 0x35, 0x33, 0xbc, 0x5f, 0xca, 0x1f, 0x08, 0x5f, + 0x2b, 0xcd, 0x9a, 0x76, 0xa8, 0x84, 0xc4, 0xed, 0xe0, 0x89, 0x90, 0x73, 0xd5, 0xdb, 0xf3, 0xb8, + 0x8c, 0x6d, 0x08, 0x34, 0xa7, 0x60, 0x44, 0xab, 0x81, 0xbc, 0x8d, 0x21, 0x9a, 0x86, 0x04, 0x47, + 0xeb, 0x8e, 0xd6, 0xba, 0xb0, 0x6c, 0x5a, 0xe6, 0xae, 0xa3, 0x1b, 0xd8, 0x46, 0x8f, 0x09, 0x10, + 0xf0, 0xf4, 0x3f, 0x13, 0xe8, 0x3f, 0xfa, 0xf7, 0x8c, 0xe8, 0x28, 0xea, 0x77, 0xab, 0x61, 0xf2, + 0x11, 0x01, 0xaa, 0xc4, 0xc6, 0x45, 0x11, 0x8a, 0xe9, 0x0b, 0xed, 0x0d, 0x32, 0x14, 0xca, 0x0f, + 0x74, 0x4d, 0xcb, 0x59, 0x35, 0x5b, 0x5a, 0xc7, 0x76, 0x4c, 0x0b, 0xa3, 0x5a, 0xac, 0xd4, 0xdc, + 0x1e, 0xa6, 0x6d, 0xb6, 0x82, 0xc1, 0x91, 0xbd, 0x85, 0xd5, 0x4e, 0xe6, 0x75, 0xfc, 0x43, 0xc2, + 0xbb, 0x8c, 0x54, 0x2a, 0xbd, 0x1c, 0x45, 0xe8, 0x79, 0xbf, 0x2e, 0x2d, 0xd9, 0x61, 0x09, 0xb1, + 0x9d, 0x47, 0x21, 0xa6, 0xc6, 0xb0, 0x54, 0x2e, 0xc1, 0x6c, 0x7d, 0xf7, 0xbc, 0x4f, 0xc4, 0x0e, + 0x1b, 0x21, 0xaf, 0x16, 0x8e, 0x52, 0xc1, 0x14, 0x2f, 0x4c, 0x28, 0x42, 0xbe, 0xd7, 0xc1, 0xac, + 0x1d, 0xce, 0xc6, 0xf0, 0xe6, 0x13, 0x05, 0xa3, 0x53, 0x0c, 0x2e, 0x35, 0x7d, 0x01, 0xbe, 0x4b, + 0x82, 0xd9, 0x5a, 0x17, 0x1b, 0xb8, 0x4d, 0xbd, 0x20, 0x39, 0x01, 0xbe, 0x38, 0xa1, 0x00, 0x39, + 0x42, 0x11, 0x02, 0x0c, 0x3c, 0x96, 0x17, 0x3d, 0xe1, 0x05, 0x09, 0x89, 0x04, 0x17, 0x57, 0x5a, + 0xfa, 0x82, 0xfb, 0x82, 0x04, 0xd3, 0xea, 0xae, 0xb1, 0x6e, 0x99, 0xee, 0x68, 0x6c, 0xa1, 0x3b, + 0x83, 0x0e, 0xe2, 0x26, 0x38, 0xd6, 0xde, 0xb5, 0xc8, 0xfa, 0x53, 0xc5, 0xa8, 0xe3, 0x96, 0x69, + 0xb4, 0x6d, 0x52, 0x8f, 0x9c, 0xba, 0xff, 0xc3, 0xed, 0xd9, 0xe7, 0x7e, 0x4d, 0xce, 0xa0, 0xe7, + 0x09, 0x87, 0xba, 0xa1, 0x95, 0x0f, 0x15, 0x2d, 0xde, 0x13, 0x08, 0x06, 0xb4, 0x19, 0x54, 0x42, + 0xfa, 0xc2, 0xfd, 0x8c, 0x04, 0x4a, 0xb1, 0xd5, 0x32, 0x77, 0x0d, 0xa7, 0x8e, 0x3b, 0xb8, 0xe5, + 0x34, 0x2c, 0xad, 0x85, 0xc3, 0xf6, 0x73, 0x01, 0xe4, 0xb6, 0x6e, 0xb1, 0x3e, 0xd8, 0x7d, 0x64, + 0x72, 0x7c, 0xb1, 0xf0, 0x8e, 0x23, 0xad, 0xe5, 0xfe, 0x52, 0x12, 0x88, 0x53, 0x6c, 0x5f, 0x51, + 0xb0, 0xa0, 0xf4, 0xa5, 0xfa, 0x51, 0x09, 0xa6, 0xbc, 0x1e, 0x7b, 0x4b, 0x44, 0x98, 0xbf, 0x9a, + 0x70, 0x32, 0xe2, 0x13, 0x4f, 0x20, 0xc3, 0xb7, 0x25, 0x98, 0x55, 0x44, 0xd1, 0x4f, 0x26, 0xba, + 0x62, 0x72, 0xd1, 0xb9, 0xaf, 0xd5, 0x5a, 0x73, 0xa9, 0xb6, 0xba, 0x58, 0x56, 0x0b, 0x32, 0xfa, + 0xa2, 0x04, 0xd9, 0x75, 0xdd, 0xd8, 0x0a, 0x47, 0x57, 0x3a, 0xee, 0xda, 0x91, 0x6d, 0xfc, 0x00, + 0x6b, 0xe9, 0xf4, 0x45, 0xb9, 0x15, 0x8e, 0x1b, 0xbb, 0x3b, 0xe7, 0xb1, 0x55, 0xdb, 0x24, 0xa3, + 0xac, 0xdd, 0x30, 0xeb, 0xd8, 0xa0, 0x46, 0x68, 0x4e, 0xed, 0xfb, 0x8d, 0x37, 0xc1, 0x04, 0x26, + 0x0f, 0x2e, 0x27, 0x11, 0x12, 0xf7, 0x99, 0x92, 0x42, 0x4c, 0x25, 0x9a, 0x36, 0xf4, 0x21, 0x9e, + 0xbe, 0xa6, 0xfe, 0x51, 0x0e, 0x4e, 0x14, 0x8d, 0x4b, 0xc4, 0xa6, 0xa0, 0x1d, 0x7c, 0x69, 0x5b, + 0x33, 0xb6, 0x30, 0x19, 0x20, 0x7c, 0x89, 0x87, 0x43, 0xf4, 0x67, 0xf8, 0x10, 0xfd, 0x8a, 0x0a, + 0x13, 0xa6, 0xd5, 0xc6, 0xd6, 0xc2, 0x25, 0xc2, 0x53, 0xef, 0xb2, 0x33, 0x6b, 0x93, 0xfd, 0x8a, + 0x98, 0x67, 0xe4, 0xe7, 0x6b, 0xf4, 0x7f, 0xd5, 0x23, 0x74, 0xe6, 0x26, 0x98, 0x60, 0x69, 0xca, + 0x0c, 0x4c, 0xd6, 0xd4, 0xc5, 0xb2, 0xda, 0xac, 0x2c, 0x16, 0x8e, 0x28, 0x97, 0xc1, 0xd1, 0x4a, + 0xa3, 0xac, 0x16, 0x1b, 0x95, 0x5a, 0xb5, 0x49, 0xd2, 0x0b, 0x19, 0xf4, 0x9c, 0xac, 0xa8, 0x67, + 0x6f, 0x3c, 0x33, 0xfd, 0x60, 0x55, 0x61, 0xa2, 0x45, 0x33, 0x90, 0x21, 0x74, 0x3a, 0x51, 0xed, + 0x18, 0x41, 0x9a, 0xa0, 0x7a, 0x84, 0x94, 0xd3, 0x00, 0x17, 0x2d, 0xd3, 0xd8, 0x0a, 0x4e, 0x1d, + 0x4e, 0xaa, 0xa1, 0x14, 0xf4, 0x60, 0x06, 0xf2, 0xf4, 0x1f, 0x72, 0x25, 0x09, 0x79, 0x0a, 0x04, + 0xef, 0xbd, 0xbb, 0x16, 0x2f, 0x91, 0x57, 0x30, 0xd1, 0x62, 0xaf, 0xae, 0x2e, 0x52, 0x19, 0x50, + 0x4b, 0x98, 0x55, 0xe5, 0x66, 0xc8, 0xd3, 0x7f, 0x99, 0xd7, 0x41, 0x74, 0x78, 0x51, 0x9a, 0x4d, + 0xd0, 0x4f, 0x59, 0x5c, 0xa6, 0xe9, 0x6b, 0xf3, 0xfb, 0x25, 0x98, 0xac, 0x62, 0xa7, 0xb4, 0x8d, + 0x5b, 0x17, 0xd0, 0xe3, 0xf8, 0x05, 0xd0, 0x8e, 0x8e, 0x0d, 0xe7, 0xbe, 0x9d, 0x8e, 0xbf, 0x00, + 0xea, 0x25, 0xa0, 0x9f, 0x0f, 0x77, 0xbe, 0x77, 0xf3, 0xfa, 0x73, 0x63, 0x9f, 0xba, 0x7a, 0x25, + 0x44, 0xa8, 0xcc, 0x49, 0xc8, 0x5b, 0xd8, 0xde, 0xed, 0x78, 0x8b, 0x68, 0xec, 0x0d, 0x3d, 0xec, + 0x8b, 0xb3, 0xc4, 0x89, 0xf3, 0x66, 0xf1, 0x22, 0xc6, 0x10, 0xaf, 0x34, 0x0b, 0x13, 0x15, 0x43, + 0x77, 0x74, 0xad, 0x83, 0x9e, 0x97, 0x85, 0xd9, 0x3a, 0x76, 0xd6, 0x35, 0x4b, 0xdb, 0xc1, 0x0e, + 0xb6, 0x6c, 0xf4, 0x6d, 0xbe, 0x4f, 0xe8, 0x76, 0x34, 0x67, 0xd3, 0xb4, 0x76, 0x3c, 0xd5, 0xf4, + 0xde, 0x5d, 0xd5, 0xdc, 0xc3, 0x96, 0x1d, 0xf0, 0xe5, 0xbd, 0xba, 0x5f, 0x2e, 0x9a, 0xd6, 0x05, + 0x77, 0x10, 0x64, 0xd3, 0x34, 0xf6, 0xea, 0xd2, 0xeb, 0x98, 0x5b, 0xab, 0x78, 0x0f, 0x7b, 0xe1, + 0xd2, 0xfc, 0x77, 0x77, 0x2e, 0xd0, 0x36, 0xab, 0xa6, 0xe3, 0x76, 0xda, 0xab, 0xe6, 0x16, 0x8d, + 0x17, 0x3b, 0xa9, 0xf2, 0x89, 0x41, 0x2e, 0x6d, 0x0f, 0x93, 0x5c, 0xf9, 0x70, 0x2e, 0x96, 0xa8, + 0xcc, 0x83, 0xe2, 0xff, 0xd6, 0xc0, 0x1d, 0xbc, 0x83, 0x1d, 0xeb, 0x12, 0xb9, 0x16, 0x62, 0x52, + 0xed, 0xf3, 0x85, 0x0d, 0xd0, 0xe2, 0x93, 0x75, 0x26, 0xbd, 0x79, 0x4e, 0x72, 0x07, 0x9a, 0xac, + 0x8b, 0x50, 0x1c, 0xcb, 0xb5, 0x57, 0xb2, 0x6b, 0xcd, 0xbc, 0x54, 0x86, 0x2c, 0x19, 0x3c, 0xdf, + 0x98, 0xe1, 0x56, 0x98, 0x76, 0xb0, 0x6d, 0x6b, 0x5b, 0xd8, 0x5b, 0x61, 0x62, 0xaf, 0xca, 0x6d, + 0x90, 0xeb, 0x10, 0x4c, 0xe9, 0xe0, 0x70, 0x2d, 0x57, 0x33, 0xd7, 0xc0, 0x70, 0x69, 0xf9, 0x23, + 0x01, 0x81, 0x5b, 0xa5, 0x7f, 0x9c, 0xb9, 0x07, 0x72, 0x14, 0xfe, 0x29, 0xc8, 0x2d, 0x96, 0x17, + 0x36, 0x96, 0x0b, 0x47, 0xdc, 0x47, 0x8f, 0xbf, 0x29, 0xc8, 0x2d, 0x15, 0x1b, 0xc5, 0xd5, 0x82, + 0xe4, 0xd6, 0xa3, 0x52, 0x5d, 0xaa, 0x15, 0x64, 0x37, 0x71, 0xbd, 0x58, 0xad, 0x94, 0x0a, 0x59, + 0x65, 0x1a, 0x26, 0xce, 0x15, 0xd5, 0x6a, 0xa5, 0xba, 0x5c, 0xc8, 0xa1, 0xbf, 0x0d, 0xe3, 0x77, + 0x3b, 0x8f, 0xdf, 0x75, 0x51, 0x3c, 0xf5, 0x83, 0xec, 0x65, 0x3e, 0x64, 0x77, 0x72, 0x90, 0xfd, + 0xb0, 0x08, 0x91, 0x31, 0xb8, 0x33, 0xe5, 0x61, 0x62, 0xdd, 0x32, 0x5b, 0xd8, 0xb6, 0xd1, 0xaf, + 0x49, 0x90, 0x2f, 0x69, 0x46, 0x0b, 0x77, 0xd0, 0x15, 0x01, 0x54, 0xd4, 0x55, 0x34, 0xe3, 0x9f, + 0x16, 0xfb, 0xc7, 0x8c, 0x68, 0xef, 0xc7, 0xe8, 0xce, 0x53, 0x9a, 0x11, 0xf2, 0x11, 0xeb, 0xe5, + 0x62, 0x49, 0x8d, 0xe1, 0x6a, 0x1c, 0x09, 0xa6, 0xd8, 0x6a, 0xc0, 0x79, 0x1c, 0x9e, 0x87, 0x7f, + 0x3b, 0x23, 0x3a, 0x39, 0xf4, 0x6a, 0xe0, 0x93, 0x89, 0x90, 0x87, 0xd8, 0x44, 0x70, 0x10, 0xb5, + 0x31, 0x6c, 0x1e, 0x4a, 0x30, 0xbd, 0x61, 0xd8, 0xfd, 0x84, 0x22, 0x1e, 0x47, 0xdf, 0xab, 0x46, + 0x88, 0xd0, 0x81, 0xe2, 0xe8, 0x0f, 0xa6, 0x97, 0xbe, 0x60, 0xbe, 0x9d, 0x81, 0xe3, 0xcb, 0xd8, + 0xc0, 0x96, 0xde, 0xa2, 0x35, 0xf0, 0x24, 0x71, 0x27, 0x2f, 0x89, 0xc7, 0x71, 0x9c, 0xf7, 0xfb, + 0x83, 0x97, 0xc0, 0x2b, 0x7d, 0x09, 0xdc, 0xcd, 0x49, 0xe0, 0x26, 0x41, 0x3a, 0x63, 0xb8, 0x0f, + 0x7d, 0x0a, 0x66, 0xaa, 0xa6, 0xa3, 0x6f, 0xea, 0x2d, 0xea, 0x83, 0xf6, 0x12, 0x19, 0xb2, 0xab, + 0xba, 0xed, 0xa0, 0x62, 0xd0, 0x9d, 0x5c, 0x03, 0xd3, 0xba, 0xd1, 0xea, 0xec, 0xb6, 0xb1, 0x8a, + 0x35, 0xda, 0xaf, 0x4c, 0xaa, 0xe1, 0xa4, 0x60, 0x6b, 0xdf, 0x65, 0x4b, 0xf6, 0xb6, 0xf6, 0x3f, + 0x29, 0xbc, 0x0c, 0x13, 0x66, 0x81, 0x04, 0xa4, 0x8c, 0xb0, 0xbb, 0x8a, 0x30, 0x6b, 0x84, 0xb2, + 0x7a, 0x06, 0x7b, 0xef, 0x85, 0x02, 0x61, 0x72, 0x2a, 0xff, 0x07, 0x7a, 0x8f, 0x50, 0x63, 0x1d, + 0xc4, 0x50, 0x32, 0x64, 0x96, 0x86, 0x98, 0x24, 0x2b, 0x30, 0x57, 0xa9, 0x36, 0xca, 0x6a, 0xb5, + 0xb8, 0xca, 0xb2, 0xc8, 0xe8, 0xbb, 0x12, 0xe4, 0x54, 0xdc, 0xed, 0x5c, 0x0a, 0x47, 0x8c, 0x66, + 0x8e, 0xe2, 0x19, 0xdf, 0x51, 0x5c, 0x59, 0x02, 0xd0, 0x5a, 0x6e, 0xc1, 0xe4, 0x4a, 0x2d, 0xa9, + 0x6f, 0x1c, 0x53, 0xae, 0x82, 0x45, 0x3f, 0xb7, 0x1a, 0xfa, 0x13, 0x3d, 0x24, 0xbc, 0x73, 0xc4, + 0x51, 0x23, 0x1c, 0x46, 0xf4, 0x09, 0xef, 0x15, 0xda, 0xec, 0x19, 0x48, 0xee, 0x70, 0xc4, 0xff, + 0x25, 0x09, 0xb2, 0x0d, 0xb7, 0xb7, 0x0c, 0x75, 0x9c, 0x9f, 0x18, 0x4e, 0xc7, 0x5d, 0x32, 0x11, + 0x3a, 0x7e, 0x17, 0xcc, 0x84, 0x35, 0x96, 0xb9, 0x4a, 0xc4, 0xaa, 0x38, 0xf7, 0xc3, 0x30, 0x1a, + 0xde, 0x87, 0x9d, 0xc3, 0x11, 0xf1, 0xc7, 0x1e, 0x0f, 0xb0, 0x86, 0x77, 0xce, 0x63, 0xcb, 0xde, + 0xd6, 0xbb, 0xe8, 0xef, 0x64, 0x98, 0x5a, 0xc6, 0x4e, 0xdd, 0xd1, 0x9c, 0x5d, 0xbb, 0x67, 0xbb, + 0xd3, 0x30, 0x4b, 0x5a, 0x6b, 0x1b, 0xb3, 0xee, 0xc8, 0x7b, 0x45, 0xef, 0x90, 0x45, 0xfd, 0x89, + 0x82, 0x72, 0xe6, 0xfd, 0x32, 0x22, 0x30, 0x79, 0x02, 0x64, 0xdb, 0x9a, 0xa3, 0x31, 0x2c, 0xae, + 0xe8, 0xc1, 0x22, 0x20, 0xa4, 0x92, 0x6c, 0xe8, 0xb7, 0x25, 0x11, 0x87, 0x22, 0x81, 0xf2, 0x93, + 0x81, 0xf0, 0x9e, 0xcc, 0x10, 0x28, 0x1c, 0x83, 0xd9, 0x6a, 0xad, 0xd1, 0x5c, 0xad, 0x2d, 0x2f, + 0x97, 0xdd, 0xd4, 0x82, 0xac, 0x9c, 0x04, 0x65, 0xbd, 0x78, 0xdf, 0x5a, 0xb9, 0xda, 0x68, 0x56, + 0x6b, 0x8b, 0x65, 0xf6, 0x67, 0x56, 0x39, 0x0a, 0xd3, 0xa5, 0x62, 0x69, 0xc5, 0x4b, 0xc8, 0x29, + 0xa7, 0xe0, 0xf8, 0x5a, 0x79, 0x6d, 0xa1, 0xac, 0xd6, 0x57, 0x2a, 0xeb, 0x4d, 0x97, 0xcc, 0x52, + 0x6d, 0xa3, 0xba, 0x58, 0xc8, 0x2b, 0x08, 0x4e, 0x86, 0xbe, 0x9c, 0x53, 0x6b, 0xd5, 0xe5, 0x66, + 0xbd, 0x51, 0x6c, 0x94, 0x0b, 0x13, 0xca, 0x65, 0x70, 0xb4, 0x54, 0xac, 0x92, 0xec, 0xa5, 0x5a, + 0xb5, 0x5a, 0x2e, 0x35, 0x0a, 0x93, 0xe8, 0xdf, 0xb3, 0x30, 0x5d, 0xb1, 0xab, 0xda, 0x0e, 0x3e, + 0xab, 0x75, 0xf4, 0x36, 0x7a, 0x5e, 0x68, 0xe6, 0x71, 0x1d, 0xcc, 0x5a, 0xf4, 0x11, 0xb7, 0x1b, + 0x3a, 0xa6, 0x68, 0xce, 0xaa, 0x7c, 0xa2, 0x3b, 0x27, 0x37, 0x08, 0x01, 0x6f, 0x4e, 0x4e, 0xdf, + 0x94, 0x05, 0x00, 0xfa, 0xd4, 0x08, 0x2e, 0x77, 0x3d, 0xd3, 0xdb, 0x9a, 0xb4, 0x1d, 0x6c, 0x63, + 0x6b, 0x4f, 0x6f, 0x61, 0x2f, 0xa7, 0x1a, 0xfa, 0x0b, 0x7d, 0x59, 0x16, 0xdd, 0x5f, 0x0c, 0x81, + 0x1a, 0xaa, 0x4e, 0x44, 0x6f, 0xf8, 0x0b, 0xb2, 0xc8, 0xee, 0xa0, 0x10, 0xc9, 0x64, 0x9a, 0xf2, + 0x02, 0x69, 0xb8, 0x65, 0xdb, 0x46, 0xad, 0xd6, 0xac, 0xaf, 0xd4, 0xd4, 0x46, 0x41, 0x56, 0x66, + 0x60, 0xd2, 0x7d, 0x5d, 0xad, 0x55, 0x97, 0x0b, 0x59, 0xe5, 0x04, 0x1c, 0x5b, 0x29, 0xd6, 0x9b, + 0x95, 0xea, 0xd9, 0xe2, 0x6a, 0x65, 0xb1, 0x59, 0x5a, 0x29, 0xaa, 0xf5, 0x42, 0x4e, 0xb9, 0x02, + 0x4e, 0x34, 0x2a, 0x65, 0xb5, 0xb9, 0x54, 0x2e, 0x36, 0x36, 0xd4, 0x72, 0xbd, 0x59, 0xad, 0x35, + 0xab, 0xc5, 0xb5, 0x72, 0x21, 0xef, 0x36, 0x7f, 0xf2, 0x29, 0x50, 0x9b, 0x89, 0xfd, 0xca, 0x38, + 0x19, 0xa1, 0x8c, 0x53, 0xbd, 0xca, 0x08, 0x61, 0xb5, 0x52, 0xcb, 0xf5, 0xb2, 0x7a, 0xb6, 0x5c, + 0x98, 0xee, 0xa7, 0x6b, 0x33, 0xca, 0x71, 0x28, 0xb8, 0x3c, 0x34, 0x2b, 0x75, 0x2f, 0xe7, 0x62, + 0x61, 0x16, 0x7d, 0x34, 0x0f, 0x27, 0x55, 0xbc, 0xa5, 0xdb, 0x0e, 0xb6, 0xd6, 0xb5, 0x4b, 0x3b, + 0xd8, 0x70, 0xbc, 0x4e, 0xfe, 0x5f, 0x12, 0x2b, 0xe3, 0x1a, 0xcc, 0x76, 0x29, 0x8d, 0x35, 0xec, + 0x6c, 0x9b, 0x6d, 0x36, 0x0a, 0x3f, 0x2e, 0xb2, 0xe7, 0x98, 0x5f, 0x0f, 0x67, 0x57, 0xf9, 0xbf, + 0x43, 0xba, 0x2d, 0xc7, 0xe8, 0x76, 0x76, 0x18, 0xdd, 0x56, 0xae, 0x82, 0xa9, 0x5d, 0x1b, 0x5b, + 0xe5, 0x1d, 0x4d, 0xef, 0x78, 0x97, 0x73, 0xfa, 0x09, 0xe8, 0xad, 0x59, 0xd1, 0x13, 0x2b, 0xa1, + 0xba, 0xf4, 0x17, 0x63, 0x44, 0xdf, 0x7a, 0x1a, 0x80, 0x55, 0x76, 0xc3, 0xea, 0x30, 0x65, 0x0d, + 0xa5, 0xb8, 0xfc, 0x9d, 0xd7, 0x3b, 0x1d, 0xdd, 0xd8, 0xf2, 0xf7, 0xfd, 0x83, 0x04, 0xf4, 0x02, + 0x59, 0xe4, 0x04, 0x4b, 0x52, 0xde, 0x92, 0xb5, 0xa6, 0x87, 0xa4, 0x31, 0xf7, 0xbb, 0xfb, 0x9b, + 0x4e, 0x5e, 0x29, 0xc0, 0x0c, 0x49, 0x63, 0x2d, 0xb0, 0x30, 0xe1, 0xf6, 0xc1, 0x1e, 0xb9, 0xb5, + 0x72, 0x63, 0xa5, 0xb6, 0xe8, 0x7f, 0x9b, 0x74, 0x49, 0xba, 0xcc, 0x14, 0xab, 0xf7, 0x91, 0xd6, + 0x38, 0xa5, 0x3c, 0x06, 0xae, 0x08, 0x75, 0xd8, 0xc5, 0x55, 0xb5, 0x5c, 0x5c, 0xbc, 0xaf, 0x59, + 0x7e, 0x46, 0xa5, 0xde, 0xa8, 0xf3, 0x8d, 0xcb, 0x6b, 0x47, 0xd3, 0x2e, 0xbf, 0xe5, 0xb5, 0x62, + 0x65, 0x95, 0xf5, 0xef, 0x4b, 0x35, 0x75, 0xad, 0xd8, 0x28, 0xcc, 0xa0, 0x97, 0xca, 0x50, 0x58, + 0xc6, 0xce, 0xba, 0x69, 0x39, 0x5a, 0x67, 0x55, 0x37, 0x2e, 0x6c, 0x58, 0x1d, 0x6e, 0xb2, 0x29, + 0x1c, 0xa6, 0x83, 0x1f, 0x22, 0x39, 0x82, 0xd1, 0x3b, 0xe2, 0x5d, 0x92, 0x2d, 0x50, 0xa6, 0x20, + 0x01, 0x3d, 0x4b, 0x12, 0x59, 0xee, 0x16, 0x2f, 0x35, 0x99, 0x9e, 0x3c, 0x7b, 0xdc, 0xe3, 0x73, + 0x1f, 0xd4, 0xf2, 0xe8, 0xb9, 0x59, 0x98, 0x5c, 0xd2, 0x0d, 0xad, 0xa3, 0x3f, 0x93, 0x8b, 0x5f, + 0x1a, 0xf4, 0x31, 0x99, 0x98, 0x3e, 0x46, 0x1a, 0x6a, 0xfc, 0xfc, 0x15, 0x59, 0x74, 0x79, 0x21, + 0x24, 0x7b, 0x8f, 0xc9, 0x88, 0xc1, 0xf3, 0x03, 0x92, 0xc8, 0xf2, 0xc2, 0x60, 0x7a, 0xc9, 0x30, + 0xfc, 0xf8, 0xf7, 0x87, 0x8d, 0xd5, 0xd3, 0xbe, 0x27, 0xfb, 0xa9, 0xc2, 0x14, 0xfa, 0x33, 0x19, + 0xd0, 0x32, 0x76, 0xce, 0x62, 0xcb, 0x9f, 0x0a, 0x90, 0x5e, 0x9f, 0xd9, 0xdb, 0xa1, 0x26, 0xfb, + 0xc6, 0x30, 0x80, 0xe7, 0x78, 0x00, 0x8b, 0x31, 0x8d, 0x27, 0x82, 0x74, 0x44, 0xe3, 0xad, 0x40, + 0xde, 0x26, 0xdf, 0x99, 0x9a, 0x3d, 0x31, 0x7a, 0xb8, 0x24, 0xc4, 0xc2, 0xd4, 0x29, 0x61, 0x95, + 0x11, 0x40, 0xdf, 0xf1, 0x27, 0x41, 0x3f, 0xce, 0x69, 0xc7, 0xd2, 0x81, 0x99, 0x4d, 0xa6, 0x2f, + 0x56, 0xba, 0xea, 0xd2, 0xcf, 0xbe, 0x41, 0x1f, 0xc8, 0xc1, 0xf1, 0x7e, 0xd5, 0x41, 0xbf, 0x93, + 0xe1, 0x76, 0xd8, 0x31, 0x19, 0xf2, 0x33, 0x6c, 0x03, 0xd1, 0x7d, 0x51, 0x9e, 0x0c, 0x27, 0xfc, + 0x65, 0xb8, 0x86, 0x59, 0xc5, 0x17, 0xed, 0x0e, 0x76, 0x1c, 0x6c, 0x91, 0xaa, 0x4d, 0xaa, 0xfd, + 0x3f, 0x2a, 0x4f, 0x85, 0xcb, 0x75, 0xc3, 0xd6, 0xdb, 0xd8, 0x6a, 0xe8, 0x5d, 0xbb, 0x68, 0xb4, + 0x1b, 0xbb, 0x8e, 0x69, 0xe9, 0x1a, 0xbb, 0x4a, 0x72, 0x52, 0x8d, 0xfa, 0xac, 0xdc, 0x08, 0x05, + 0xdd, 0xae, 0x19, 0xe7, 0x4d, 0xcd, 0x6a, 0xeb, 0xc6, 0xd6, 0xaa, 0x6e, 0x3b, 0xcc, 0x03, 0x78, + 0x5f, 0x3a, 0xfa, 0x7b, 0x59, 0xf4, 0x30, 0xdd, 0x00, 0x58, 0x23, 0x3a, 0x94, 0x9f, 0x97, 0x45, + 0x8e, 0xc7, 0x25, 0xa3, 0x9d, 0x4c, 0x59, 0x9e, 0x33, 0x6e, 0x43, 0xa2, 0xff, 0x08, 0x4e, 0xba, + 0x16, 0x9a, 0xee, 0x19, 0x02, 0x67, 0xcb, 0x6a, 0x65, 0xa9, 0x52, 0x76, 0xcd, 0x8a, 0x13, 0x70, + 0x2c, 0xf8, 0xb6, 0x78, 0x5f, 0xb3, 0x5e, 0xae, 0x36, 0x0a, 0x93, 0x6e, 0x3f, 0x45, 0x93, 0x97, + 0x8a, 0x95, 0xd5, 0xf2, 0x62, 0xb3, 0x51, 0x73, 0xbf, 0x2c, 0x0e, 0x67, 0x5a, 0xa0, 0x07, 0xb3, + 0x70, 0x94, 0xc8, 0xf6, 0x12, 0x91, 0xaa, 0x2b, 0x94, 0x1e, 0x5f, 0x5b, 0x1f, 0xa0, 0x29, 0x2a, + 0x5e, 0xf4, 0x69, 0xe1, 0x9b, 0x32, 0x43, 0x10, 0xf6, 0x94, 0x11, 0xa1, 0x19, 0xdf, 0x96, 0x44, + 0x22, 0x54, 0x08, 0x93, 0x4d, 0xa6, 0x14, 0xff, 0x3a, 0xee, 0x11, 0x27, 0x1a, 0x7c, 0x62, 0x65, + 0x96, 0xc8, 0xcf, 0xcf, 0x58, 0xaf, 0xa8, 0x44, 0x1d, 0xe6, 0x00, 0x48, 0x0a, 0xd1, 0x20, 0xaa, + 0x07, 0x7d, 0xc7, 0xab, 0x28, 0x3d, 0x28, 0x96, 0x1a, 0x95, 0xb3, 0xe5, 0x28, 0x3d, 0xf8, 0x94, + 0x0c, 0x93, 0xcb, 0xd8, 0x71, 0xe7, 0x54, 0x36, 0x7a, 0x9a, 0xc0, 0xfa, 0x8f, 0x6b, 0xc6, 0x74, + 0xcc, 0x96, 0xd6, 0xf1, 0x97, 0x01, 0xe8, 0x1b, 0xfa, 0xb9, 0x61, 0x4c, 0x10, 0xaf, 0xe8, 0x88, + 0xf1, 0xea, 0x47, 0x21, 0xe7, 0xb8, 0x9f, 0xd9, 0x32, 0xf4, 0x0f, 0x45, 0x0e, 0x57, 0x2e, 0x91, + 0x45, 0xcd, 0xd1, 0x54, 0x9a, 0x3f, 0x34, 0x3a, 0x09, 0xda, 0x2e, 0x11, 0x8c, 0x7c, 0x3f, 0xda, + 0x9f, 0x7f, 0x2b, 0xc3, 0x09, 0xda, 0x3e, 0x8a, 0xdd, 0x6e, 0xdd, 0x31, 0x2d, 0xac, 0xe2, 0x16, + 0xd6, 0xbb, 0x4e, 0xcf, 0xfa, 0x9e, 0x45, 0x53, 0xbd, 0xcd, 0x66, 0xf6, 0x8a, 0x5e, 0x27, 0x8b, + 0xc6, 0x60, 0xde, 0xd7, 0x1e, 0x7b, 0xca, 0x8b, 0x68, 0xec, 0x1f, 0x91, 0x44, 0xa2, 0x2a, 0x27, + 0x24, 0x9e, 0x0c, 0xa8, 0x0f, 0x1e, 0x02, 0x50, 0xde, 0xca, 0x8d, 0x5a, 0x2e, 0x95, 0x2b, 0xeb, + 0xee, 0x20, 0x70, 0x35, 0x5c, 0xb9, 0xbe, 0xa1, 0x96, 0x56, 0x8a, 0xf5, 0x72, 0x53, 0x2d, 0x2f, + 0x57, 0xea, 0x0d, 0xe6, 0x94, 0x45, 0xff, 0x9a, 0x50, 0xae, 0x82, 0x53, 0xf5, 0x8d, 0x85, 0x7a, + 0x49, 0xad, 0xac, 0x93, 0x74, 0xb5, 0x5c, 0x2d, 0x9f, 0x63, 0x5f, 0x27, 0xd1, 0xfb, 0x0a, 0x30, + 0xed, 0x4e, 0x00, 0xea, 0x74, 0x5e, 0x80, 0xbe, 0x91, 0x85, 0x69, 0x15, 0xdb, 0x66, 0x67, 0x8f, + 0xcc, 0x11, 0xc6, 0x35, 0xf5, 0xf8, 0x96, 0x2c, 0x7a, 0x7e, 0x3b, 0xc4, 0xec, 0x7c, 0x88, 0xd1, + 0xe8, 0x89, 0xa6, 0xb6, 0xa7, 0xe9, 0x1d, 0xed, 0x3c, 0xeb, 0x6a, 0x26, 0xd5, 0x20, 0x41, 0x99, + 0x07, 0xc5, 0xbc, 0x68, 0x60, 0xab, 0xde, 0xba, 0x58, 0x76, 0xb6, 0x8b, 0xed, 0xb6, 0x85, 0x6d, + 0x9b, 0xad, 0x5e, 0xf4, 0xf9, 0xa2, 0xdc, 0x00, 0x47, 0x49, 0x6a, 0x28, 0x33, 0x75, 0x90, 0xe9, + 0x4d, 0xf6, 0x73, 0x16, 0x8d, 0x4b, 0x5e, 0xce, 0x5c, 0x28, 0x67, 0x90, 0x1c, 0x3e, 0x2e, 0x91, + 0xe7, 0x4f, 0xe9, 0x5c, 0x03, 0xd3, 0x86, 0xb6, 0x83, 0xcb, 0x0f, 0x74, 0x75, 0x0b, 0xdb, 0xc4, + 0x31, 0x46, 0x56, 0xc3, 0x49, 0xe8, 0x03, 0x42, 0xe7, 0xcd, 0xc5, 0x24, 0x96, 0x4c, 0xf7, 0x97, + 0x87, 0x50, 0xfd, 0x3e, 0xfd, 0x8c, 0x8c, 0xde, 0x27, 0xc3, 0x0c, 0x63, 0xaa, 0x68, 0x5c, 0xaa, + 0xb4, 0xd1, 0xd5, 0x9c, 0xf1, 0xab, 0xb9, 0x69, 0x9e, 0xf1, 0x4b, 0x5e, 0xd0, 0x2f, 0xca, 0xa2, + 0xee, 0xce, 0x7d, 0x2a, 0x4e, 0xca, 0x88, 0x76, 0x1c, 0xdd, 0x34, 0x77, 0x99, 0xa3, 0xea, 0xa4, + 0x4a, 0x5f, 0xd2, 0x5c, 0xd4, 0x43, 0xbf, 0x2f, 0xe4, 0x4c, 0x2d, 0x58, 0x8d, 0x43, 0x02, 0xf0, + 0x63, 0x32, 0xcc, 0x31, 0xae, 0xea, 0xec, 0x9c, 0x8f, 0xd0, 0x81, 0xb7, 0x5f, 0x12, 0x36, 0x04, + 0xfb, 0xd4, 0x9f, 0x95, 0xf4, 0xa8, 0x01, 0xf2, 0x43, 0x42, 0xc1, 0xd1, 0x84, 0x2b, 0x72, 0x48, + 0x50, 0xbe, 0x2d, 0x0b, 0xd3, 0x1b, 0x36, 0xb6, 0x98, 0xdf, 0x3e, 0x7a, 0x38, 0x0b, 0xf2, 0x32, + 0xe6, 0x36, 0x52, 0x9f, 0x2f, 0xec, 0xe1, 0x1b, 0xae, 0x6c, 0x88, 0xa8, 0x6b, 0x23, 0x45, 0xc0, + 0x76, 0x3d, 0xcc, 0x51, 0x91, 0x16, 0x1d, 0xc7, 0x35, 0x12, 0x3d, 0x6f, 0xda, 0x9e, 0xd4, 0x51, + 0x6c, 0x15, 0x91, 0xb2, 0xdc, 0x2c, 0x25, 0x97, 0xa7, 0x55, 0xbc, 0x49, 0xe7, 0xb3, 0x59, 0xb5, + 0x27, 0x55, 0xb9, 0x05, 0x2e, 0x33, 0xbb, 0x98, 0x9e, 0x5f, 0x09, 0x65, 0xce, 0x91, 0xcc, 0xfd, + 0x3e, 0xa1, 0x6f, 0x08, 0xf9, 0xea, 0x8a, 0x4b, 0x27, 0x99, 0x2e, 0x74, 0x47, 0x63, 0x92, 0x1c, + 0x87, 0x82, 0x9b, 0x83, 0xec, 0xbf, 0xa8, 0xe5, 0x7a, 0x6d, 0xf5, 0x6c, 0xb9, 0xff, 0x32, 0x46, + 0x0e, 0x3d, 0x47, 0x86, 0xa9, 0x05, 0xcb, 0xd4, 0xda, 0x2d, 0xcd, 0x76, 0xd0, 0x77, 0x24, 0x98, + 0x59, 0xd7, 0x2e, 0x75, 0x4c, 0xad, 0x4d, 0xfc, 0xfb, 0x7b, 0xfa, 0x82, 0x2e, 0xfd, 0xe4, 0xf5, + 0x05, 0xec, 0x95, 0x3f, 0x18, 0xe8, 0x1f, 0xdd, 0xcb, 0x88, 0x5c, 0xa8, 0xe9, 0x6f, 0xf3, 0x49, + 0xfd, 0x82, 0x95, 0x7a, 0x7c, 0xcd, 0x87, 0x79, 0x8a, 0xb0, 0x28, 0xdf, 0x27, 0x16, 0x7e, 0x54, + 0x84, 0xe4, 0xe1, 0xec, 0xca, 0x3f, 0x77, 0x12, 0xf2, 0x8b, 0x98, 0x58, 0x71, 0xff, 0x5d, 0x82, + 0x89, 0x3a, 0x76, 0x88, 0x05, 0x77, 0x1b, 0xe7, 0x29, 0xdc, 0x26, 0x19, 0x02, 0x27, 0x76, 0xef, + 0xdd, 0x9d, 0xac, 0x87, 0xce, 0x5b, 0x93, 0xe7, 0x04, 0x1e, 0x89, 0xb4, 0xdc, 0x79, 0x56, 0xe6, + 0x81, 0x3c, 0x12, 0x63, 0x49, 0xa5, 0xef, 0x6b, 0xf5, 0x0e, 0x89, 0xb9, 0x56, 0x85, 0x7a, 0xbd, + 0x57, 0x85, 0xf5, 0x33, 0xd6, 0xdb, 0x8c, 0x31, 0x1f, 0xe3, 0x1c, 0xf5, 0x24, 0x98, 0xa0, 0x32, + 0xf7, 0xe6, 0xa3, 0xbd, 0x7e, 0x0a, 0x94, 0x04, 0x39, 0x7b, 0xed, 0xe5, 0x14, 0x74, 0x51, 0x8b, + 0x2e, 0x7c, 0x2c, 0x31, 0x08, 0x66, 0xaa, 0xd8, 0xb9, 0x68, 0x5a, 0x17, 0xea, 0x8e, 0xe6, 0x60, + 0xf4, 0xaf, 0x12, 0xc8, 0x75, 0xec, 0x84, 0xa3, 0x9f, 0x54, 0xe1, 0x18, 0xad, 0x10, 0xcb, 0x48, + 0xfa, 0x6f, 0x5a, 0x91, 0x6b, 0xfa, 0x0a, 0x21, 0x94, 0x4f, 0xdd, 0xff, 0x2b, 0xfa, 0xb5, 0xbe, + 0x41, 0x9f, 0xa4, 0x3e, 0x93, 0x06, 0x26, 0x99, 0x30, 0x83, 0xae, 0x82, 0x45, 0xe8, 0xe9, 0xfb, + 0x85, 0xcc, 0x6a, 0x31, 0x9a, 0x87, 0xd3, 0x15, 0x7c, 0xe8, 0x0a, 0xc8, 0x96, 0xb6, 0x35, 0x07, + 0xbd, 0x5d, 0x06, 0x28, 0xb6, 0xdb, 0x6b, 0xd4, 0x07, 0x3c, 0xec, 0x90, 0x76, 0x06, 0x66, 0x5a, + 0xdb, 0x5a, 0x70, 0xb7, 0x09, 0xed, 0x0f, 0xb8, 0x34, 0xe5, 0xc9, 0x81, 0x33, 0x39, 0x95, 0x2a, + 0xea, 0x81, 0xc9, 0x2d, 0x83, 0xd1, 0xf6, 0x1d, 0xcd, 0xf9, 0x50, 0x98, 0xb1, 0x47, 0xe8, 0xdc, + 0xdf, 0xe7, 0x03, 0xf6, 0xa2, 0xe7, 0x70, 0x8c, 0xb4, 0x7f, 0xc0, 0x26, 0x48, 0x48, 0x78, 0xd2, + 0x5b, 0x2c, 0xa0, 0x47, 0x3c, 0x5f, 0x63, 0x09, 0x5d, 0xab, 0x94, 0xdb, 0xba, 0x27, 0x5a, 0x16, + 0x30, 0x0b, 0x3d, 0x94, 0x49, 0x06, 0x5f, 0xbc, 0xe0, 0xee, 0x86, 0x59, 0xdc, 0xd6, 0x1d, 0xec, + 0xd5, 0x92, 0x09, 0x30, 0x0e, 0x62, 0xfe, 0x07, 0xf4, 0x6c, 0xe1, 0xa0, 0x6b, 0x44, 0xa0, 0xfb, + 0x6b, 0x14, 0xd1, 0xfe, 0xc4, 0xc2, 0xa8, 0x89, 0xd1, 0x4c, 0x1f, 0xac, 0x9f, 0x93, 0xe1, 0x44, + 0xc3, 0xdc, 0xda, 0xea, 0x60, 0x4f, 0x4c, 0x98, 0x7a, 0x67, 0x22, 0x6d, 0x94, 0x70, 0x91, 0x9d, + 0x20, 0xf3, 0x7e, 0xdd, 0x3f, 0x4a, 0xe6, 0xbe, 0xf0, 0x27, 0xa6, 0x62, 0x67, 0x51, 0x44, 0x5c, + 0x7d, 0xf9, 0x8c, 0x40, 0x41, 0x2c, 0xe0, 0xb3, 0x30, 0xd9, 0xf4, 0x81, 0xf8, 0xbc, 0x04, 0xb3, + 0xf4, 0xe6, 0x4a, 0x4f, 0x41, 0xef, 0x1d, 0x21, 0x00, 0xe8, 0x3b, 0x19, 0x51, 0x3f, 0x5b, 0x22, + 0x13, 0x8e, 0x93, 0x08, 0x11, 0x8b, 0x05, 0x55, 0x19, 0x48, 0x2e, 0x7d, 0xd1, 0xfe, 0xb1, 0x0c, + 0xd3, 0xcb, 0xd8, 0x6b, 0x69, 0x76, 0xe2, 0x9e, 0xe8, 0x0c, 0xcc, 0x90, 0xeb, 0xdb, 0x6a, 0xec, + 0x98, 0x24, 0x5d, 0x35, 0xe3, 0xd2, 0x94, 0xeb, 0x60, 0xf6, 0x3c, 0xde, 0x34, 0x2d, 0x5c, 0xe3, + 0xce, 0x52, 0xf2, 0x89, 0x11, 0xe1, 0xe9, 0xb8, 0x38, 0x68, 0x0b, 0x3c, 0x36, 0x37, 0xed, 0x17, + 0x66, 0xa8, 0x2a, 0x11, 0x63, 0xce, 0x53, 0x60, 0x92, 0x21, 0xef, 0x99, 0x69, 0x71, 0xfd, 0xa2, + 0x9f, 0x17, 0xbd, 0xd6, 0x47, 0xb4, 0xcc, 0x21, 0xfa, 0xc4, 0x24, 0x4c, 0x8c, 0xe5, 0x7e, 0xf7, + 0x42, 0xa8, 0xfc, 0x85, 0x4b, 0x95, 0xb6, 0x8d, 0xd6, 0x92, 0x61, 0x7a, 0x1a, 0xc0, 0x6f, 0x1c, + 0x5e, 0x58, 0x8b, 0x50, 0x0a, 0x1f, 0xb9, 0x3e, 0xf6, 0xa0, 0x5e, 0xaf, 0x38, 0x08, 0x3b, 0x23, + 0x06, 0x46, 0xec, 0x80, 0x9f, 0x08, 0x27, 0xe9, 0xa3, 0xf3, 0x49, 0x19, 0x4e, 0xf8, 0xe7, 0x8f, + 0x56, 0x35, 0x3b, 0x68, 0x77, 0xa5, 0x64, 0x10, 0x71, 0x07, 0x3e, 0xfc, 0xc6, 0xf2, 0xcd, 0x64, + 0x63, 0x46, 0x5f, 0x4e, 0x46, 0x8b, 0x8e, 0x72, 0x13, 0x1c, 0x33, 0x76, 0x77, 0x7c, 0xa9, 0x93, + 0x16, 0xcf, 0x5a, 0xf8, 0xfe, 0x0f, 0x49, 0x46, 0x26, 0x11, 0xe6, 0xc7, 0x32, 0xa7, 0xe4, 0x8e, + 0x74, 0x3d, 0x21, 0x11, 0x8c, 0xe8, 0x9f, 0x33, 0x89, 0x7a, 0xb7, 0xc1, 0x67, 0xbe, 0x12, 0xf4, + 0x52, 0x87, 0x78, 0xe0, 0xeb, 0xcc, 0x04, 0xe4, 0xca, 0x3b, 0x5d, 0xe7, 0xd2, 0x99, 0xc7, 0xc2, + 0x6c, 0xdd, 0xb1, 0xb0, 0xb6, 0x13, 0xda, 0x19, 0x70, 0xcc, 0x0b, 0xd8, 0xf0, 0x76, 0x06, 0xc8, + 0xcb, 0xed, 0xb7, 0xc1, 0x84, 0x61, 0x36, 0xb5, 0x5d, 0x67, 0x5b, 0xb9, 0x7a, 0xdf, 0x91, 0x7a, + 0x06, 0x7e, 0x8d, 0xc5, 0x30, 0xfa, 0xf2, 0x1d, 0x64, 0x6d, 0x38, 0x6f, 0x98, 0xc5, 0x5d, 0x67, + 0x7b, 0xe1, 0xaa, 0x8f, 0xfd, 0xcd, 0xe9, 0xcc, 0xa7, 0xfe, 0xe6, 0x74, 0xe6, 0x4b, 0x7f, 0x73, + 0x3a, 0xf3, 0x4b, 0x5f, 0x39, 0x7d, 0xe4, 0x53, 0x5f, 0x39, 0x7d, 0xe4, 0xf3, 0x5f, 0x39, 0x7d, + 0xe4, 0xc7, 0xa5, 0xee, 0xf9, 0xf3, 0x79, 0x42, 0xe5, 0x49, 0xff, 0x7f, 0x00, 0x00, 0x00, 0xff, + 0xff, 0xd9, 0x46, 0xa2, 0x63, 0x08, 0x08, 0x02, 0x00, } func (m *Rpc) Marshal() (dAtA []byte, err error) { @@ -118881,261 +118426,6 @@ func (m *RpcChatUnsubscribeResponseError) MarshalToSizedBuffer(dAtA []byte) (int return len(dAtA) - i, nil } -func (m *RpcApi) 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 *RpcApi) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *RpcApi) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - return len(dAtA) - i, nil -} - -func (m *RpcApiStartServer) 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 *RpcApiStartServer) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *RpcApiStartServer) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - return len(dAtA) - i, nil -} - -func (m *RpcApiStartServerRequest) 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 *RpcApiStartServerRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *RpcApiStartServerRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - return len(dAtA) - i, nil -} - -func (m *RpcApiStartServerResponse) 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 *RpcApiStartServerResponse) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *RpcApiStartServerResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.Error != nil { - { - size, err := m.Error.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintCommands(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *RpcApiStartServerResponseError) 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 *RpcApiStartServerResponseError) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *RpcApiStartServerResponseError) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if len(m.Description) > 0 { - i -= len(m.Description) - copy(dAtA[i:], m.Description) - i = encodeVarintCommands(dAtA, i, uint64(len(m.Description))) - i-- - dAtA[i] = 0x12 - } - if m.Code != 0 { - i = encodeVarintCommands(dAtA, i, uint64(m.Code)) - i-- - dAtA[i] = 0x8 - } - return len(dAtA) - i, nil -} - -func (m *RpcApiStopServer) 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 *RpcApiStopServer) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *RpcApiStopServer) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - return len(dAtA) - i, nil -} - -func (m *RpcApiStopServerRequest) 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 *RpcApiStopServerRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *RpcApiStopServerRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - return len(dAtA) - i, nil -} - -func (m *RpcApiStopServerResponse) 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 *RpcApiStopServerResponse) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *RpcApiStopServerResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.Error != nil { - { - size, err := m.Error.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintCommands(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *RpcApiStopServerResponseError) 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 *RpcApiStopServerResponseError) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *RpcApiStopServerResponseError) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if len(m.Description) > 0 { - i -= len(m.Description) - copy(dAtA[i:], m.Description) - i = encodeVarintCommands(dAtA, i, uint64(len(m.Description))) - i-- - dAtA[i] = 0x12 - } - if m.Code != 0 { - i = encodeVarintCommands(dAtA, i, uint64(m.Code)) - i-- - dAtA[i] = 0x8 - } - return len(dAtA) - i, nil -} - func (m *Empty) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -138342,109 +137632,6 @@ func (m *RpcChatUnsubscribeResponseError) Size() (n int) { return n } -func (m *RpcApi) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - return n -} - -func (m *RpcApiStartServer) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - return n -} - -func (m *RpcApiStartServerRequest) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - return n -} - -func (m *RpcApiStartServerResponse) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.Error != nil { - l = m.Error.Size() - n += 1 + l + sovCommands(uint64(l)) - } - return n -} - -func (m *RpcApiStartServerResponseError) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.Code != 0 { - n += 1 + sovCommands(uint64(m.Code)) - } - l = len(m.Description) - if l > 0 { - n += 1 + l + sovCommands(uint64(l)) - } - return n -} - -func (m *RpcApiStopServer) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - return n -} - -func (m *RpcApiStopServerRequest) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - return n -} - -func (m *RpcApiStopServerResponse) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.Error != nil { - l = m.Error.Size() - n += 1 + l + sovCommands(uint64(l)) - } - return n -} - -func (m *RpcApiStopServerResponseError) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.Code != 0 { - n += 1 + sovCommands(uint64(m.Code)) - } - l = len(m.Description) - if l > 0 { - n += 1 + l + sovCommands(uint64(l)) - } - return n -} - func (m *Empty) Size() (n int) { if m == nil { return 0 @@ -260653,630 +259840,6 @@ func (m *RpcChatUnsubscribeResponseError) Unmarshal(dAtA []byte) error { } return nil } -func (m *RpcApi) 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 ErrIntOverflowCommands - } - 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: Api: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: Api: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - default: - iNdEx = preIndex - skippy, err := skipCommands(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthCommands - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *RpcApiStartServer) 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 ErrIntOverflowCommands - } - 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: StartServer: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: StartServer: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - default: - iNdEx = preIndex - skippy, err := skipCommands(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthCommands - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *RpcApiStartServerRequest) 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 ErrIntOverflowCommands - } - 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: Request: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: Request: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - default: - iNdEx = preIndex - skippy, err := skipCommands(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthCommands - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *RpcApiStartServerResponse) 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 ErrIntOverflowCommands - } - 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: Response: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: Response: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Error", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowCommands - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthCommands - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthCommands - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.Error == nil { - m.Error = &RpcApiStartServerResponseError{} - } - if err := m.Error.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipCommands(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthCommands - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *RpcApiStartServerResponseError) 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 ErrIntOverflowCommands - } - 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: Error: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: Error: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Code", wireType) - } - m.Code = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowCommands - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.Code |= RpcApiStartServerResponseErrorCode(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Description", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowCommands - } - 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 ErrInvalidLengthCommands - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthCommands - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Description = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipCommands(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthCommands - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *RpcApiStopServer) 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 ErrIntOverflowCommands - } - 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: StopServer: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: StopServer: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - default: - iNdEx = preIndex - skippy, err := skipCommands(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthCommands - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *RpcApiStopServerRequest) 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 ErrIntOverflowCommands - } - 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: Request: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: Request: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - default: - iNdEx = preIndex - skippy, err := skipCommands(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthCommands - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *RpcApiStopServerResponse) 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 ErrIntOverflowCommands - } - 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: Response: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: Response: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Error", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowCommands - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthCommands - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthCommands - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.Error == nil { - m.Error = &RpcApiStopServerResponseError{} - } - if err := m.Error.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipCommands(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthCommands - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *RpcApiStopServerResponseError) 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 ErrIntOverflowCommands - } - 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: Error: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: Error: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Code", wireType) - } - m.Code = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowCommands - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.Code |= RpcApiStopServerResponseErrorCode(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Description", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowCommands - } - 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 ErrInvalidLengthCommands - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthCommands - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Description = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipCommands(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthCommands - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} func (m *Empty) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 diff --git a/pb/protos/commands.proto b/pb/protos/commands.proto index 6825d5430..1673c990e 100644 --- a/pb/protos/commands.proto +++ b/pb/protos/commands.proto @@ -7849,55 +7849,8 @@ message Rpc { } } } - message Api { - message StartServer { - message Request { - // empty - } - - message Response { - Error error = 1; - - message Error { - Code code = 1; - string description = 2; - - enum Code { - NULL = 0; - UNKNOWN_ERROR = 1; - BAD_INPUT = 2; - PORT_ALREADY_USED = 3; - SERVER_ALREADY_STARTED = 4; - } - } - } - } - message StopServer { - message Request{ - // empty - } - - message Response { - Error error = 1; - - message Error { - Code code = 1; - string description = 2; - - enum Code { - NULL = 0; - UNKNOWN_ERROR = 1; - BAD_INPUT = 2; - SERVER_NOT_STARTED = 3; - } - } - } - } - } } - - message Empty { } diff --git a/pb/protos/service/service.proto b/pb/protos/service/service.proto index 101d48af2..36579a606 100644 --- a/pb/protos/service/service.proto +++ b/pb/protos/service/service.proto @@ -388,9 +388,4 @@ service ClientCommands { rpc ChatSubscribeLastMessages (anytype.Rpc.Chat.SubscribeLastMessages.Request) returns (anytype.Rpc.Chat.SubscribeLastMessages.Response); rpc ChatUnsubscribe (anytype.Rpc.Chat.Unsubscribe.Request) returns (anytype.Rpc.Chat.Unsubscribe.Response); rpc ObjectChatAdd (anytype.Rpc.Object.ChatAdd.Request) returns (anytype.Rpc.Object.ChatAdd.Response); - - // API - // *** - rpc ApiStartServer (anytype.Rpc.Api.StartServer.Request) returns (anytype.Rpc.Api.StartServer.Response); - rpc ApiStopServer (anytype.Rpc.Api.StopServer.Request) returns (anytype.Rpc.Api.StopServer.Response); } diff --git a/pb/service/mock_service/mock_ClientCommandsServer.go b/pb/service/mock_service/mock_ClientCommandsServer.go index e36161dac..a4b00d152 100644 --- a/pb/service/mock_service/mock_ClientCommandsServer.go +++ b/pb/service/mock_service/mock_ClientCommandsServer.go @@ -661,104 +661,6 @@ func (_c *MockClientCommandsServer_AccountStop_Call) RunAndReturn(run func(conte return _c } -// ApiStartServer provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) ApiStartServer(_a0 context.Context, _a1 *pb.RpcApiStartServerRequest) *pb.RpcApiStartServerResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for ApiStartServer") - } - - var r0 *pb.RpcApiStartServerResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcApiStartServerRequest) *pb.RpcApiStartServerResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcApiStartServerResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_ApiStartServer_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ApiStartServer' -type MockClientCommandsServer_ApiStartServer_Call struct { - *mock.Call -} - -// ApiStartServer is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcApiStartServerRequest -func (_e *MockClientCommandsServer_Expecter) ApiStartServer(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_ApiStartServer_Call { - return &MockClientCommandsServer_ApiStartServer_Call{Call: _e.mock.On("ApiStartServer", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_ApiStartServer_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcApiStartServerRequest)) *MockClientCommandsServer_ApiStartServer_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcApiStartServerRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_ApiStartServer_Call) Return(_a0 *pb.RpcApiStartServerResponse) *MockClientCommandsServer_ApiStartServer_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_ApiStartServer_Call) RunAndReturn(run func(context.Context, *pb.RpcApiStartServerRequest) *pb.RpcApiStartServerResponse) *MockClientCommandsServer_ApiStartServer_Call { - _c.Call.Return(run) - return _c -} - -// ApiStopServer provides a mock function with given fields: _a0, _a1 -func (_m *MockClientCommandsServer) ApiStopServer(_a0 context.Context, _a1 *pb.RpcApiStopServerRequest) *pb.RpcApiStopServerResponse { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for ApiStopServer") - } - - var r0 *pb.RpcApiStopServerResponse - if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcApiStopServerRequest) *pb.RpcApiStopServerResponse); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pb.RpcApiStopServerResponse) - } - } - - return r0 -} - -// MockClientCommandsServer_ApiStopServer_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ApiStopServer' -type MockClientCommandsServer_ApiStopServer_Call struct { - *mock.Call -} - -// ApiStopServer is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *pb.RpcApiStopServerRequest -func (_e *MockClientCommandsServer_Expecter) ApiStopServer(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_ApiStopServer_Call { - return &MockClientCommandsServer_ApiStopServer_Call{Call: _e.mock.On("ApiStopServer", _a0, _a1)} -} - -func (_c *MockClientCommandsServer_ApiStopServer_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcApiStopServerRequest)) *MockClientCommandsServer_ApiStopServer_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*pb.RpcApiStopServerRequest)) - }) - return _c -} - -func (_c *MockClientCommandsServer_ApiStopServer_Call) Return(_a0 *pb.RpcApiStopServerResponse) *MockClientCommandsServer_ApiStopServer_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockClientCommandsServer_ApiStopServer_Call) RunAndReturn(run func(context.Context, *pb.RpcApiStopServerRequest) *pb.RpcApiStopServerResponse) *MockClientCommandsServer_ApiStopServer_Call { - _c.Call.Return(run) - return _c -} - // AppGetVersion provides a mock function with given fields: _a0, _a1 func (_m *MockClientCommandsServer) AppGetVersion(_a0 context.Context, _a1 *pb.RpcAppGetVersionRequest) *pb.RpcAppGetVersionResponse { ret := _m.Called(_a0, _a1) diff --git a/pb/service/service.pb.go b/pb/service/service.pb.go index e2e4f2103..8adc4974b 100644 --- a/pb/service/service.pb.go +++ b/pb/service/service.pb.go @@ -26,345 +26,343 @@ const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package func init() { proto.RegisterFile("pb/protos/service/service.proto", fileDescriptor_93a29dc403579097) } var fileDescriptor_93a29dc403579097 = []byte{ - // 5406 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x9d, 0xdf, 0x6f, 0x1d, 0x49, - 0x56, 0xf8, 0xc7, 0x2f, 0xdf, 0xf9, 0xd2, 0xcb, 0x0e, 0x70, 0x07, 0x86, 0xd9, 0x61, 0x37, 0xc9, - 0x64, 0x12, 0x3b, 0x89, 0xe3, 0xeb, 0x4c, 0x32, 0x3f, 0x56, 0xbb, 0x48, 0xc8, 0xb1, 0x13, 0x8f, - 0x59, 0xdb, 0x31, 0xbe, 0xd7, 0x89, 0x34, 0x12, 0x12, 0xe5, 0x7b, 0xcb, 0xd7, 0x8d, 0xfb, 0x76, - 0xf5, 0x76, 0xd7, 0xbd, 0xce, 0x5d, 0x04, 0x02, 0x81, 0x40, 0x20, 0x10, 0x2b, 0x7e, 0xbd, 0x22, - 0xf1, 0xc4, 0x9f, 0xc2, 0xe3, 0x3e, 0xf2, 0x88, 0x66, 0xfe, 0x00, 0xfe, 0x05, 0xd4, 0xd5, 0xf5, - 0xf3, 0xf4, 0x39, 0xd5, 0xed, 0x7d, 0x4a, 0xe4, 0xf3, 0x39, 0xe7, 0x54, 0x75, 0x55, 0x9d, 0x3a, - 0x55, 0x5d, 0x5d, 0x37, 0xb9, 0x5d, 0x9c, 0x6f, 0x17, 0xa5, 0x90, 0xa2, 0xda, 0xae, 0x78, 0xb9, - 0x4c, 0x27, 0xdc, 0xfc, 0x3b, 0x54, 0x7f, 0x1e, 0xbc, 0xcb, 0xf2, 0x95, 0x5c, 0x15, 0xfc, 0xa3, - 0x0f, 0x1d, 0x39, 0x11, 0xf3, 0x39, 0xcb, 0xa7, 0x55, 0x83, 0x7c, 0xf4, 0x81, 0x93, 0xf0, 0x25, - 0xcf, 0xa5, 0xfe, 0xfb, 0xd3, 0xff, 0xfc, 0xdf, 0xb5, 0xe4, 0xbd, 0xdd, 0x2c, 0xe5, 0xb9, 0xdc, - 0xd5, 0x1a, 0x83, 0xaf, 0x93, 0xef, 0xee, 0x14, 0xc5, 0x3e, 0x97, 0xaf, 0x79, 0x59, 0xa5, 0x22, - 0x1f, 0x7c, 0x32, 0xd4, 0x0e, 0x86, 0xa7, 0xc5, 0x64, 0xb8, 0x53, 0x14, 0x43, 0x27, 0x1c, 0x9e, - 0xf2, 0x9f, 0x2e, 0x78, 0x25, 0x3f, 0xba, 0x17, 0x87, 0xaa, 0x42, 0xe4, 0x15, 0x1f, 0x5c, 0x24, - 0xbf, 0xb1, 0x53, 0x14, 0x23, 0x2e, 0xf7, 0x78, 0x5d, 0x81, 0x91, 0x64, 0x92, 0x0f, 0x36, 0x5a, - 0xaa, 0x21, 0x60, 0x7d, 0x3c, 0xe8, 0x06, 0xb5, 0x9f, 0x71, 0xf2, 0x9d, 0xda, 0xcf, 0xe5, 0x42, - 0x4e, 0xc5, 0x75, 0x3e, 0xf8, 0xb8, 0xad, 0xa8, 0x45, 0xd6, 0xf6, 0xdd, 0x18, 0xa2, 0xad, 0xbe, - 0x49, 0x7e, 0xf5, 0x0d, 0xcb, 0x32, 0x2e, 0x77, 0x4b, 0x5e, 0x17, 0x3c, 0xd4, 0x69, 0x44, 0xc3, - 0x46, 0x66, 0xed, 0x7e, 0x12, 0x65, 0xb4, 0xe1, 0xaf, 0x93, 0xef, 0x36, 0x92, 0x53, 0x3e, 0x11, - 0x4b, 0x5e, 0x0e, 0x50, 0x2d, 0x2d, 0x24, 0x1e, 0x79, 0x0b, 0x82, 0xb6, 0x77, 0x45, 0xbe, 0xe4, - 0xa5, 0xc4, 0x6d, 0x6b, 0x61, 0xdc, 0xb6, 0x83, 0xb4, 0xed, 0xbf, 0x5d, 0x4b, 0xbe, 0xbf, 0x33, - 0x99, 0x88, 0x45, 0x2e, 0x0f, 0xc5, 0x84, 0x65, 0x87, 0x69, 0x7e, 0x75, 0xcc, 0xaf, 0x77, 0x2f, - 0x6b, 0x3e, 0x9f, 0xf1, 0xc1, 0xb3, 0xf0, 0xa9, 0x36, 0xe8, 0xd0, 0xb2, 0x43, 0x1f, 0xb6, 0xbe, - 0x3f, 0xbb, 0x99, 0x92, 0x2e, 0xcb, 0x3f, 0xae, 0x25, 0xb7, 0x60, 0x59, 0x46, 0x22, 0x5b, 0x72, - 0x57, 0x9a, 0xcf, 0x3b, 0x0c, 0x87, 0xb8, 0x2d, 0xcf, 0x17, 0x37, 0x55, 0xd3, 0x25, 0xca, 0x92, - 0xf7, 0xfd, 0xee, 0x32, 0xe2, 0x95, 0x1a, 0x4e, 0x0f, 0xe9, 0x1e, 0xa1, 0x11, 0xeb, 0xf9, 0x51, - 0x1f, 0x54, 0x7b, 0x4b, 0x93, 0x81, 0xf6, 0x96, 0x89, 0xca, 0x3a, 0x7b, 0x80, 0x5a, 0xf0, 0x08, - 0xeb, 0xeb, 0x61, 0x0f, 0x52, 0xbb, 0xfa, 0xa3, 0xe4, 0xd7, 0xde, 0x88, 0xf2, 0xaa, 0x2a, 0xd8, - 0x84, 0xeb, 0xa1, 0x70, 0x3f, 0xd4, 0x36, 0x52, 0x38, 0x1a, 0xd6, 0xbb, 0x30, 0xaf, 0xd3, 0x1a, - 0xe1, 0xab, 0x82, 0xc3, 0x18, 0xe4, 0x14, 0x6b, 0x21, 0xd5, 0x69, 0x21, 0xa4, 0x6d, 0x5f, 0x25, - 0x03, 0x67, 0xfb, 0xfc, 0x8f, 0xf9, 0x44, 0xee, 0x4c, 0xa7, 0xb0, 0x55, 0x9c, 0xae, 0x22, 0x86, - 0x3b, 0xd3, 0x29, 0xd5, 0x2a, 0x38, 0xaa, 0x9d, 0x5d, 0x27, 0x1f, 0x00, 0x67, 0x87, 0x69, 0xa5, - 0x1c, 0x6e, 0xc5, 0xad, 0x68, 0xcc, 0x3a, 0x1d, 0xf6, 0xc5, 0xb5, 0xe3, 0x3f, 0x5f, 0x4b, 0xbe, - 0x87, 0x78, 0x3e, 0xe5, 0x73, 0xb1, 0xe4, 0x83, 0x27, 0xdd, 0xd6, 0x1a, 0xd2, 0xfa, 0xff, 0xf4, - 0x06, 0x1a, 0x48, 0x37, 0x19, 0xf1, 0x8c, 0x4f, 0x24, 0xd9, 0x4d, 0x1a, 0x71, 0x67, 0x37, 0xb1, - 0x98, 0x37, 0xc2, 0x8c, 0x70, 0x9f, 0xcb, 0xdd, 0x45, 0x59, 0xf2, 0x5c, 0x92, 0x6d, 0xe9, 0x90, - 0xce, 0xb6, 0x0c, 0x50, 0xa4, 0x3e, 0xfb, 0x5c, 0xee, 0x64, 0x19, 0x59, 0x9f, 0x46, 0xdc, 0x59, - 0x1f, 0x8b, 0x69, 0x0f, 0x93, 0xe4, 0xd7, 0xbd, 0x27, 0x26, 0x0f, 0xf2, 0x0b, 0x31, 0xa0, 0x9f, - 0x85, 0x92, 0x5b, 0x1f, 0x1b, 0x9d, 0x1c, 0x52, 0x8d, 0x17, 0x6f, 0x0b, 0x51, 0xd2, 0xcd, 0xd2, - 0x88, 0x3b, 0xab, 0x61, 0x31, 0xed, 0xe1, 0x0f, 0x93, 0xf7, 0x74, 0x94, 0x34, 0xf3, 0xd9, 0x3d, - 0x34, 0x84, 0xc2, 0x09, 0xed, 0x7e, 0x07, 0xe5, 0x82, 0x83, 0x96, 0xe9, 0xe0, 0xf3, 0x09, 0xaa, - 0x07, 0x42, 0xcf, 0xbd, 0x38, 0xd4, 0xb2, 0xbd, 0xc7, 0x33, 0x4e, 0xda, 0x6e, 0x84, 0x1d, 0xb6, - 0x2d, 0xa4, 0x6d, 0x97, 0xc9, 0x6f, 0xd9, 0xc7, 0x52, 0xcf, 0xa3, 0x4a, 0x5e, 0x07, 0xe9, 0x4d, - 0xa2, 0xde, 0x3e, 0x64, 0x7d, 0x3d, 0xee, 0x07, 0xb7, 0xea, 0xa3, 0x47, 0x20, 0x5e, 0x1f, 0x30, - 0xfe, 0xee, 0xc5, 0x21, 0x6d, 0xfb, 0xef, 0xd6, 0x92, 0x1f, 0x68, 0xd9, 0x8b, 0x9c, 0x9d, 0x67, - 0x5c, 0x4d, 0x89, 0xc7, 0x5c, 0x5e, 0x8b, 0xf2, 0x6a, 0xb4, 0xca, 0x27, 0xc4, 0xf4, 0x8f, 0xc3, - 0x1d, 0xd3, 0x3f, 0xa9, 0xe4, 0x65, 0x7c, 0xba, 0xa2, 0x52, 0x14, 0x30, 0xe3, 0x33, 0x35, 0x90, - 0xa2, 0xa0, 0x32, 0xbe, 0x10, 0x69, 0x59, 0x3d, 0xaa, 0xc3, 0x26, 0x6e, 0xf5, 0xc8, 0x8f, 0x93, - 0x77, 0x63, 0x88, 0x0b, 0x5b, 0xa6, 0x03, 0x8b, 0xfc, 0x22, 0x9d, 0x9d, 0x15, 0xd3, 0xba, 0x1b, - 0x3f, 0xc4, 0x7b, 0xa8, 0x87, 0x10, 0x61, 0x8b, 0x40, 0xb5, 0xb7, 0x7f, 0x70, 0x89, 0x91, 0x1e, - 0x4a, 0x2f, 0x4b, 0x31, 0x3f, 0xe4, 0x33, 0x36, 0x59, 0xe9, 0xf1, 0xff, 0x59, 0x6c, 0xe0, 0x41, - 0xda, 0x16, 0xe2, 0xf3, 0x1b, 0x6a, 0xe9, 0xf2, 0xfc, 0xfb, 0x5a, 0x72, 0xcf, 0x54, 0xff, 0x92, - 0xe5, 0x33, 0xae, 0xdb, 0xb3, 0x29, 0xfd, 0x4e, 0x3e, 0x3d, 0xe5, 0x95, 0x64, 0xa5, 0x1c, 0xfc, - 0x08, 0xaf, 0x64, 0x4c, 0xc7, 0x96, 0xed, 0xc7, 0xbf, 0x94, 0xae, 0x6b, 0xf5, 0x51, 0x1d, 0xd8, - 0x74, 0x08, 0x08, 0x5b, 0x5d, 0x49, 0x60, 0x00, 0xb8, 0x1b, 0x43, 0x5c, 0xab, 0x2b, 0xc1, 0x41, - 0xbe, 0x4c, 0x25, 0xdf, 0xe7, 0x39, 0x2f, 0xdb, 0xad, 0xde, 0xa8, 0x86, 0x08, 0xd1, 0xea, 0x04, - 0xea, 0x82, 0x4d, 0xe0, 0xcd, 0x4e, 0x8e, 0x9b, 0x11, 0x23, 0xad, 0xe9, 0xf1, 0x71, 0x3f, 0xd8, - 0xad, 0xee, 0x3c, 0x9f, 0xa7, 0x7c, 0x29, 0xae, 0xe0, 0xea, 0xce, 0x37, 0xd1, 0x00, 0xc4, 0xea, - 0x0e, 0x05, 0xdd, 0x0c, 0xe6, 0xf9, 0x79, 0x9d, 0xf2, 0x6b, 0x30, 0x83, 0xf9, 0xca, 0xb5, 0x98, - 0x98, 0xc1, 0x10, 0x4c, 0x7b, 0x38, 0x4e, 0x7e, 0x45, 0x09, 0x7f, 0x5f, 0xa4, 0xf9, 0xe0, 0x36, - 0xa2, 0x54, 0x0b, 0xac, 0xd5, 0x3b, 0x34, 0x00, 0x4a, 0x5c, 0xff, 0x75, 0x97, 0xe5, 0x13, 0x9e, - 0xa1, 0x25, 0x76, 0xe2, 0x68, 0x89, 0x03, 0xcc, 0xa5, 0x0e, 0x4a, 0x58, 0xc7, 0xaf, 0xd1, 0x25, - 0x2b, 0xd3, 0x7c, 0x36, 0xc0, 0x74, 0x3d, 0x39, 0x91, 0x3a, 0x60, 0x1c, 0xe8, 0xc2, 0x5a, 0x71, - 0xa7, 0x28, 0xca, 0x3a, 0x2c, 0x62, 0x5d, 0x38, 0x44, 0xa2, 0x5d, 0xb8, 0x85, 0xe2, 0xde, 0xf6, - 0xf8, 0x24, 0x4b, 0xf3, 0xa8, 0x37, 0x8d, 0xf4, 0xf1, 0xe6, 0x50, 0xd0, 0x79, 0x0f, 0x39, 0x5b, - 0x72, 0x53, 0x33, 0xec, 0xc9, 0xf8, 0x40, 0xb4, 0xf3, 0x02, 0xd0, 0xad, 0xd3, 0x94, 0xf8, 0x88, - 0x5d, 0xf1, 0xfa, 0x01, 0xf3, 0x7a, 0x5e, 0x1b, 0x60, 0xfa, 0x01, 0x41, 0xac, 0xd3, 0x70, 0x52, - 0xbb, 0x5a, 0x24, 0x1f, 0x28, 0xf9, 0x09, 0x2b, 0x65, 0x3a, 0x49, 0x0b, 0x96, 0x9b, 0xfc, 0x1f, - 0x1b, 0xd7, 0x2d, 0xca, 0xba, 0xdc, 0xea, 0x49, 0x6b, 0xb7, 0xff, 0xb6, 0x96, 0x7c, 0x0c, 0xfd, - 0x9e, 0xf0, 0x72, 0x9e, 0xaa, 0x65, 0x64, 0xd5, 0x04, 0xe1, 0xc1, 0x97, 0x71, 0xa3, 0x2d, 0x05, - 0x5b, 0x9a, 0x1f, 0xde, 0x5c, 0xd1, 0x25, 0x43, 0x23, 0x9d, 0x5a, 0xbf, 0x2a, 0xa7, 0xad, 0x6d, - 0x96, 0x91, 0xc9, 0x97, 0x95, 0x90, 0x48, 0x86, 0x5a, 0x10, 0x18, 0xe1, 0x67, 0x79, 0x65, 0xac, - 0x63, 0x23, 0xdc, 0x89, 0xa3, 0x23, 0x3c, 0xc0, 0xdc, 0x08, 0x3f, 0x59, 0x9c, 0x67, 0x69, 0x75, - 0x99, 0xe6, 0x33, 0x9d, 0xf9, 0x86, 0xba, 0x4e, 0x0c, 0x93, 0xdf, 0x8d, 0x4e, 0x0e, 0x73, 0xa2, - 0x3b, 0x0b, 0xe9, 0x04, 0x74, 0x93, 0x8d, 0x4e, 0xce, 0xad, 0x0f, 0x9c, 0xb4, 0x5e, 0x39, 0x82, - 0xf5, 0x81, 0xa7, 0x5a, 0x4b, 0x89, 0xf5, 0x41, 0x9b, 0xd2, 0xe6, 0x45, 0xf2, 0x9b, 0x7e, 0x1d, - 0x2a, 0x91, 0x2d, 0xf9, 0x59, 0x99, 0x0e, 0x1e, 0xd1, 0xe5, 0x33, 0x8c, 0x75, 0xb5, 0xd9, 0x8b, - 0x75, 0x81, 0xca, 0x11, 0xfb, 0x5c, 0x8e, 0x24, 0x93, 0x8b, 0x0a, 0x04, 0x2a, 0xcf, 0x86, 0x45, - 0x88, 0x40, 0x45, 0xa0, 0xda, 0xdb, 0x1f, 0x24, 0x49, 0xb3, 0xe8, 0x56, 0x1b, 0x23, 0xe1, 0xdc, - 0xa3, 0x57, 0xe3, 0xc1, 0xae, 0xc8, 0xc7, 0x11, 0xc2, 0x25, 0x3c, 0xcd, 0xdf, 0xd5, 0x7e, 0xcf, - 0x00, 0xd5, 0x50, 0x22, 0x22, 0xe1, 0x01, 0x08, 0x2c, 0xe8, 0xe8, 0x52, 0x5c, 0xe3, 0x05, 0xad, - 0x25, 0xf1, 0x82, 0x6a, 0xc2, 0xed, 0xc0, 0xea, 0x82, 0x62, 0x3b, 0xb0, 0xa6, 0x18, 0xb1, 0x1d, - 0x58, 0xc8, 0xb8, 0x3e, 0xe3, 0x1b, 0x7e, 0x2e, 0xc4, 0xd5, 0x9c, 0x95, 0x57, 0xa0, 0xcf, 0x04, - 0xca, 0x86, 0x21, 0xfa, 0x0c, 0xc5, 0xba, 0x3e, 0xe3, 0x3b, 0xac, 0xd3, 0xe5, 0xb3, 0x32, 0x03, - 0x7d, 0x26, 0xb0, 0xa1, 0x11, 0xa2, 0xcf, 0x10, 0xa8, 0x8b, 0x4e, 0xbe, 0xb7, 0x11, 0x87, 0x6b, - 0xfe, 0x40, 0x7d, 0xc4, 0xa9, 0x35, 0x3f, 0x82, 0xc1, 0x2e, 0xb4, 0x5f, 0xb2, 0xe2, 0x12, 0xef, - 0x42, 0x4a, 0x14, 0xef, 0x42, 0x06, 0x81, 0xed, 0x3d, 0xe2, 0xac, 0x9c, 0x5c, 0xe2, 0xed, 0xdd, - 0xc8, 0xe2, 0xed, 0x6d, 0x19, 0xd8, 0xde, 0x8d, 0xe0, 0x4d, 0x2a, 0x2f, 0x8f, 0xb8, 0x64, 0x78, - 0x7b, 0x87, 0x4c, 0xbc, 0xbd, 0x5b, 0xac, 0xcb, 0xc7, 0x7d, 0x87, 0xa3, 0xc5, 0x79, 0x35, 0x29, - 0xd3, 0x73, 0x3e, 0x88, 0x58, 0xb1, 0x10, 0x91, 0x8f, 0x93, 0xb0, 0xf6, 0xf9, 0xf3, 0xb5, 0xe4, - 0xb6, 0x69, 0x76, 0x51, 0x55, 0x7a, 0xee, 0x0b, 0xdd, 0x7f, 0x8e, 0xb7, 0x2f, 0x81, 0x13, 0x7b, - 0xe2, 0x3d, 0xd4, 0xbc, 0xdc, 0x00, 0x2f, 0xd2, 0x59, 0x5e, 0xd9, 0x42, 0x7d, 0xd9, 0xc7, 0xba, - 0xa7, 0x40, 0xe4, 0x06, 0xbd, 0x14, 0x5d, 0x5a, 0xa6, 0xdb, 0xc7, 0xc8, 0x0e, 0xa6, 0x15, 0x48, - 0xcb, 0xcc, 0xf3, 0xf6, 0x08, 0x22, 0x2d, 0xc3, 0x49, 0xd8, 0x15, 0xf6, 0x4b, 0xb1, 0x28, 0xaa, - 0x8e, 0xae, 0x00, 0xa0, 0x78, 0x57, 0x68, 0xc3, 0xda, 0xe7, 0xdb, 0xe4, 0xb7, 0xfd, 0xee, 0xe7, - 0x3f, 0xec, 0x2d, 0xba, 0x4f, 0x61, 0x8f, 0x78, 0xd8, 0x17, 0x77, 0x19, 0x85, 0xf1, 0x2c, 0xf7, - 0xb8, 0x64, 0x69, 0x56, 0x0d, 0xd6, 0x71, 0x1b, 0x46, 0x4e, 0x64, 0x14, 0x18, 0x07, 0xe3, 0xdb, - 0xde, 0xa2, 0xc8, 0xd2, 0x49, 0xfb, 0x8d, 0x84, 0xd6, 0xb5, 0xe2, 0x78, 0x7c, 0xf3, 0x31, 0x18, - 0xaf, 0xeb, 0xd4, 0x4f, 0xfd, 0x67, 0xbc, 0x2a, 0x38, 0x1e, 0xaf, 0x03, 0x24, 0x1e, 0xaf, 0x21, - 0x0a, 0xeb, 0x33, 0xe2, 0xf2, 0x90, 0xad, 0xc4, 0x82, 0x88, 0xd7, 0x56, 0x1c, 0xaf, 0x8f, 0x8f, - 0xb9, 0xb5, 0x81, 0xf5, 0x70, 0x90, 0x4b, 0x5e, 0xe6, 0x2c, 0x7b, 0x99, 0xb1, 0x59, 0x35, 0x20, - 0x62, 0x4c, 0x48, 0x11, 0x6b, 0x03, 0x9a, 0x46, 0x1e, 0xe3, 0x41, 0xf5, 0x92, 0x2d, 0x45, 0x99, - 0x4a, 0xfa, 0x31, 0x3a, 0xa4, 0xf3, 0x31, 0x06, 0x28, 0xea, 0x6d, 0xa7, 0x9c, 0x5c, 0xa6, 0x4b, - 0x3e, 0x8d, 0x78, 0x33, 0x48, 0x0f, 0x6f, 0x1e, 0x8a, 0x34, 0xda, 0x48, 0x2c, 0xca, 0x09, 0x27, - 0x1b, 0xad, 0x11, 0x77, 0x36, 0x9a, 0xc5, 0xb4, 0x87, 0xbf, 0x5a, 0x4b, 0x7e, 0xa7, 0x91, 0xfa, - 0xaf, 0x09, 0xf6, 0x58, 0x75, 0x79, 0x2e, 0x58, 0x39, 0x1d, 0x7c, 0x8a, 0xd9, 0x41, 0x51, 0xeb, - 0xfa, 0xe9, 0x4d, 0x54, 0xe0, 0x63, 0xad, 0xf3, 0x6e, 0x37, 0xe2, 0xd0, 0xc7, 0x1a, 0x20, 0xf1, - 0xc7, 0x0a, 0x51, 0x18, 0x40, 0x94, 0xbc, 0xd9, 0x92, 0x5b, 0x27, 0xf5, 0xc3, 0x7d, 0xb9, 0x8d, - 0x4e, 0x0e, 0xc6, 0xc7, 0x5a, 0x18, 0xf6, 0x96, 0x2d, 0xca, 0x06, 0xde, 0x63, 0x86, 0x7d, 0x71, - 0xd2, 0xb3, 0x1d, 0x15, 0x71, 0xcf, 0xad, 0x91, 0x31, 0xec, 0x8b, 0x13, 0x9e, 0xbd, 0xb0, 0x16, - 0xf3, 0x8c, 0x84, 0xb6, 0x61, 0x5f, 0x1c, 0x66, 0x5f, 0x9a, 0x31, 0xf3, 0xc2, 0xa3, 0x88, 0x1d, - 0x38, 0x37, 0x6c, 0xf6, 0x62, 0xb5, 0xc3, 0xbf, 0x59, 0x4b, 0xbe, 0xef, 0x3c, 0x1e, 0x89, 0x69, - 0x7a, 0xb1, 0x6a, 0xa0, 0xd7, 0x2c, 0x5b, 0xf0, 0x6a, 0xf0, 0x94, 0xb2, 0xd6, 0x66, 0x6d, 0x09, - 0x9e, 0xdd, 0x48, 0x07, 0x8e, 0x9d, 0x9d, 0xa2, 0xc8, 0x56, 0x63, 0x3e, 0x2f, 0x32, 0x72, 0xec, - 0x04, 0x48, 0x7c, 0xec, 0x40, 0x14, 0x66, 0xe5, 0x63, 0x51, 0xe7, 0xfc, 0x68, 0x56, 0xae, 0x44, - 0xf1, 0xac, 0xdc, 0x20, 0x30, 0x57, 0x1a, 0x8b, 0x5d, 0x91, 0x65, 0x7c, 0x22, 0xdb, 0x47, 0x0d, - 0xac, 0xa6, 0x23, 0xe2, 0xb9, 0x12, 0x20, 0xdd, 0xae, 0x9c, 0x59, 0x43, 0xb2, 0x92, 0x3f, 0x5f, - 0x1d, 0xa6, 0xf9, 0xd5, 0x00, 0x4f, 0x0b, 0x1c, 0x40, 0xec, 0xca, 0xa1, 0x20, 0x5c, 0xab, 0x9e, - 0xe5, 0x53, 0x81, 0xaf, 0x55, 0x6b, 0x49, 0x7c, 0xad, 0xaa, 0x09, 0x68, 0xf2, 0x94, 0x53, 0x26, - 0x6b, 0x49, 0xdc, 0xa4, 0x26, 0xb0, 0x50, 0xa8, 0xdf, 0xdd, 0x90, 0xa1, 0x10, 0xbc, 0xad, 0xd9, - 0xe8, 0xe4, 0x60, 0x0f, 0x35, 0x8b, 0xd6, 0x97, 0x5c, 0x4e, 0x2e, 0xf1, 0x1e, 0x1a, 0x20, 0xf1, - 0x1e, 0x0a, 0x51, 0x58, 0xa5, 0xb1, 0xb0, 0x8b, 0xee, 0x75, 0xbc, 0x7f, 0xb4, 0x16, 0xdc, 0x1b, - 0x9d, 0x1c, 0x5c, 0x46, 0x1e, 0xcc, 0xd5, 0x33, 0x43, 0x3b, 0x79, 0x23, 0x8b, 0x2f, 0x23, 0x2d, - 0x03, 0x4b, 0xdf, 0x08, 0xd4, 0x5e, 0xd6, 0x3a, 0xad, 0x18, 0xec, 0x66, 0x6d, 0x74, 0x72, 0xda, - 0xc9, 0xbf, 0xd8, 0x65, 0x5c, 0x23, 0x3d, 0x16, 0xf5, 0x18, 0x79, 0xcd, 0xb2, 0x74, 0xca, 0x24, - 0x1f, 0x8b, 0x2b, 0x9e, 0xe3, 0x2b, 0x26, 0x5d, 0xda, 0x86, 0x1f, 0x06, 0x0a, 0xf1, 0x15, 0x53, - 0x5c, 0x11, 0xf6, 0x93, 0x86, 0x3e, 0xab, 0xf8, 0x2e, 0xab, 0x88, 0x48, 0x16, 0x20, 0xf1, 0x7e, - 0x02, 0x51, 0x98, 0xaf, 0x36, 0xf2, 0x17, 0x6f, 0x0b, 0x5e, 0xa6, 0x3c, 0x9f, 0x70, 0x3c, 0x5f, - 0x85, 0x54, 0x3c, 0x5f, 0x45, 0x68, 0xb8, 0x56, 0xdb, 0x63, 0x92, 0x3f, 0x5f, 0x8d, 0xd3, 0x39, - 0xaf, 0x24, 0x9b, 0x17, 0xf8, 0x5a, 0x0d, 0x40, 0xf1, 0xb5, 0x5a, 0x1b, 0x6e, 0x6d, 0x0d, 0xd9, - 0x80, 0xd8, 0x3e, 0xa1, 0x04, 0x89, 0xc8, 0x09, 0x25, 0x02, 0x85, 0x0f, 0xd6, 0x01, 0xe8, 0x4b, - 0x82, 0x96, 0x95, 0xe8, 0x4b, 0x02, 0x9a, 0x6e, 0x6d, 0xb8, 0x59, 0x66, 0x54, 0x0f, 0xcd, 0x8e, - 0xa2, 0x8f, 0xfc, 0x21, 0xba, 0xd9, 0x8b, 0xc5, 0x77, 0xf8, 0x4e, 0x79, 0xc6, 0xd4, 0xb4, 0x15, - 0xd9, 0x46, 0x33, 0x4c, 0x9f, 0x1d, 0x3e, 0x8f, 0xd5, 0x0e, 0xff, 0x62, 0x2d, 0xf9, 0x08, 0xf3, - 0xf8, 0xaa, 0x50, 0x7e, 0x9f, 0x74, 0xdb, 0x6a, 0x48, 0xe2, 0x08, 0x56, 0x5c, 0x43, 0x97, 0xe1, - 0x4f, 0x92, 0x0f, 0x8d, 0xc8, 0x9d, 0xd0, 0xd2, 0x05, 0x08, 0x93, 0x36, 0x5b, 0x7e, 0xc8, 0x59, - 0xf7, 0xdb, 0xbd, 0x79, 0xb7, 0x1e, 0x0a, 0xcb, 0x55, 0x81, 0xf5, 0x90, 0xb5, 0xa1, 0xc5, 0xc4, - 0x7a, 0x08, 0xc1, 0xdc, 0xe8, 0xf4, 0xab, 0xf7, 0x26, 0x95, 0x97, 0x2a, 0xdf, 0x02, 0xa3, 0x33, - 0x28, 0xab, 0x85, 0x88, 0xd1, 0x49, 0xc2, 0x30, 0x23, 0x31, 0x60, 0x3d, 0x36, 0xb1, 0x58, 0x6e, - 0x0d, 0xf9, 0x23, 0xf3, 0x41, 0x37, 0x08, 0xfb, 0xab, 0x11, 0xeb, 0xa5, 0xcf, 0xa3, 0x98, 0x05, - 0xb0, 0xfc, 0xd9, 0xec, 0xc5, 0x6a, 0x87, 0x7f, 0x96, 0x7c, 0xaf, 0x55, 0xb1, 0x97, 0x9c, 0xc9, - 0x45, 0xc9, 0xa7, 0x83, 0xed, 0x8e, 0x72, 0x1b, 0xd0, 0xba, 0x7e, 0xd2, 0x5f, 0xa1, 0x95, 0xa3, - 0x1b, 0xae, 0xe9, 0x56, 0xb6, 0x0c, 0x4f, 0x63, 0x26, 0x43, 0x36, 0x9a, 0xa3, 0xd3, 0x3a, 0xad, - 0x65, 0xb6, 0xdf, 0xbb, 0x76, 0x96, 0x2c, 0xcd, 0xd4, 0xcb, 0xda, 0x4f, 0x63, 0x46, 0x03, 0x34, - 0xba, 0xcc, 0x26, 0x55, 0x5a, 0x91, 0x59, 0x8d, 0x71, 0x6f, 0x79, 0xf6, 0x98, 0x8e, 0x04, 0xc8, - 0xea, 0x6c, 0xab, 0x27, 0xad, 0xdd, 0x4a, 0x33, 0xe5, 0xd5, 0x7f, 0xf6, 0x3b, 0x39, 0xe6, 0x55, - 0xab, 0x22, 0x3d, 0x7d, 0xab, 0x27, 0xad, 0xbd, 0xfe, 0x69, 0xf2, 0x61, 0xdb, 0xab, 0x9e, 0x88, - 0xb6, 0x3b, 0x4d, 0x81, 0xb9, 0xe8, 0x49, 0x7f, 0x05, 0xb7, 0xa4, 0xf9, 0x2a, 0xad, 0xa4, 0x28, - 0x57, 0xa3, 0x4b, 0x71, 0x6d, 0xbe, 0x7c, 0x08, 0x47, 0xab, 0x06, 0x86, 0x1e, 0x41, 0x2c, 0x69, - 0x70, 0xb2, 0xe5, 0xca, 0x7d, 0x21, 0x51, 0x11, 0xae, 0x3c, 0xa2, 0xc3, 0x55, 0x48, 0xba, 0x58, - 0x65, 0x6a, 0xe5, 0x3e, 0xe7, 0xd8, 0xc0, 0x8b, 0xda, 0xfe, 0xa4, 0xe3, 0x41, 0x37, 0xe8, 0x32, - 0x16, 0x2d, 0xde, 0x4b, 0x2f, 0x2e, 0x6c, 0x9d, 0xf0, 0x92, 0xfa, 0x08, 0x91, 0xb1, 0x10, 0xa8, - 0x4b, 0xba, 0x5f, 0xa6, 0x19, 0x57, 0x3b, 0xfa, 0xaf, 0x2e, 0x2e, 0x32, 0xc1, 0xa6, 0x20, 0xe9, - 0xae, 0xc5, 0x43, 0x5f, 0x4e, 0x24, 0xdd, 0x18, 0xe7, 0xce, 0x0a, 0xd4, 0xd2, 0x53, 0x3e, 0x11, - 0xf9, 0x24, 0xcd, 0xe0, 0x41, 0x50, 0xa5, 0x69, 0x85, 0xc4, 0x59, 0x81, 0x16, 0xe4, 0x26, 0xc6, - 0x5a, 0x54, 0x0f, 0x7b, 0x53, 0xfe, 0xfb, 0x6d, 0x45, 0x4f, 0x4c, 0x4c, 0x8c, 0x08, 0xe6, 0xd6, - 0x9e, 0xb5, 0xf0, 0xac, 0x50, 0xc6, 0xef, 0xb4, 0xb5, 0x1a, 0x09, 0xb1, 0xf6, 0x0c, 0x09, 0xb7, - 0x86, 0xaa, 0xff, 0xbe, 0x27, 0xae, 0x73, 0x65, 0xf4, 0x6e, 0x5b, 0xc5, 0xc8, 0x88, 0x35, 0x14, - 0x64, 0xb4, 0xe1, 0x9f, 0x24, 0xff, 0x5f, 0x19, 0x2e, 0x45, 0x31, 0xb8, 0x85, 0x28, 0x94, 0xde, - 0x99, 0xcd, 0xdb, 0xa4, 0xdc, 0x1d, 0x2d, 0xb0, 0x7d, 0xe3, 0xac, 0x62, 0x33, 0x3e, 0xb8, 0x47, - 0xb4, 0xb8, 0x92, 0x12, 0x47, 0x0b, 0xda, 0x54, 0xd8, 0x2b, 0x8e, 0xc5, 0x54, 0x5b, 0x47, 0x6a, - 0x68, 0x85, 0xb1, 0x5e, 0xe1, 0x43, 0x2e, 0x99, 0x39, 0x66, 0xcb, 0x74, 0x66, 0x27, 0x9c, 0x26, - 0x6e, 0x55, 0x20, 0x99, 0x71, 0xcc, 0xd0, 0x83, 0x88, 0x64, 0x86, 0x84, 0xb5, 0xcf, 0x7f, 0x5e, - 0x4b, 0xee, 0x38, 0x66, 0xdf, 0xec, 0xd6, 0x1d, 0xe4, 0x17, 0xa2, 0x4e, 0x7d, 0x0e, 0xd3, 0xfc, - 0xaa, 0x1a, 0x7c, 0x41, 0x99, 0xc4, 0x79, 0x5b, 0x94, 0x2f, 0x6f, 0xac, 0xe7, 0xb2, 0x56, 0xb3, - 0x95, 0xe5, 0xde, 0x67, 0x37, 0x1a, 0x20, 0x6b, 0xb5, 0x3b, 0x5e, 0x90, 0x23, 0xb2, 0xd6, 0x18, - 0xef, 0x9a, 0xd8, 0x3a, 0xcf, 0x44, 0x0e, 0x9b, 0xd8, 0x59, 0xa8, 0x85, 0x44, 0x13, 0xb7, 0x20, - 0x17, 0x8f, 0x8d, 0xa8, 0xd9, 0x75, 0xd9, 0xc9, 0x32, 0x10, 0x8f, 0xad, 0xaa, 0x05, 0x88, 0x78, - 0x8c, 0x82, 0xda, 0xcf, 0x69, 0xf2, 0x9d, 0xfa, 0x91, 0x9e, 0x94, 0x7c, 0x99, 0x72, 0x78, 0xf4, - 0xc2, 0x93, 0x10, 0xe3, 0x3f, 0x24, 0xdc, 0xc8, 0x3a, 0xcb, 0xab, 0x22, 0x63, 0xd5, 0xa5, 0x7e, - 0x19, 0x1f, 0xd6, 0xd9, 0x08, 0xe1, 0xeb, 0xf8, 0xfb, 0x1d, 0x94, 0x0b, 0xea, 0x46, 0x66, 0x43, - 0xcc, 0x3a, 0xae, 0xda, 0x0a, 0x33, 0x1b, 0x9d, 0x9c, 0xdb, 0xf1, 0xde, 0x67, 0x59, 0xc6, 0xcb, - 0x95, 0x91, 0x1d, 0xb1, 0x3c, 0xbd, 0xe0, 0x95, 0x04, 0x3b, 0xde, 0x9a, 0x1a, 0x42, 0x8c, 0xd8, - 0xf1, 0x8e, 0xe0, 0x2e, 0x9b, 0x07, 0x9e, 0x0f, 0xf2, 0x29, 0x7f, 0x0b, 0xb2, 0x79, 0x68, 0x47, - 0x31, 0x44, 0x36, 0x4f, 0xb1, 0x6e, 0xe7, 0xf7, 0x79, 0x26, 0x26, 0x57, 0x7a, 0x0a, 0x08, 0x1b, - 0x58, 0x49, 0xe0, 0x1c, 0x70, 0x37, 0x86, 0xb8, 0x49, 0x40, 0x09, 0x4e, 0x79, 0x91, 0xb1, 0x09, - 0x3c, 0x7f, 0xd3, 0xe8, 0x68, 0x19, 0x31, 0x09, 0x40, 0x06, 0x14, 0x57, 0x9f, 0xeb, 0xc1, 0x8a, - 0x0b, 0x8e, 0xf5, 0xdc, 0x8d, 0x21, 0x6e, 0x1a, 0x54, 0x82, 0x51, 0x91, 0xa5, 0x12, 0x0c, 0x83, - 0x46, 0x43, 0x49, 0x88, 0x61, 0x10, 0x12, 0xc0, 0xe4, 0x11, 0x2f, 0x67, 0x1c, 0x35, 0xa9, 0x24, - 0x51, 0x93, 0x86, 0x70, 0x87, 0x8d, 0x9b, 0xba, 0x8b, 0x62, 0x05, 0x0e, 0x1b, 0xeb, 0x6a, 0x89, - 0x62, 0x45, 0x1c, 0x36, 0x0e, 0x00, 0x50, 0xc4, 0x13, 0x56, 0x49, 0xbc, 0x88, 0x4a, 0x12, 0x2d, - 0xa2, 0x21, 0xdc, 0x1c, 0xdd, 0x14, 0x71, 0x21, 0xc1, 0x1c, 0xad, 0x0b, 0xe0, 0xbd, 0x81, 0xbe, - 0x4d, 0xca, 0x5d, 0x24, 0x69, 0x5a, 0x85, 0xcb, 0x97, 0x29, 0xcf, 0xa6, 0x15, 0x88, 0x24, 0xfa, - 0xb9, 0x1b, 0x29, 0x11, 0x49, 0xda, 0x14, 0xe8, 0x4a, 0x7a, 0x7f, 0x1c, 0xab, 0x1d, 0xd8, 0x1a, - 0xbf, 0x1b, 0x43, 0x5c, 0x7c, 0x32, 0x85, 0xde, 0x65, 0x65, 0x99, 0xd6, 0x93, 0xff, 0x3a, 0x5e, - 0x20, 0x23, 0x27, 0xe2, 0x13, 0xc6, 0x81, 0xe1, 0x65, 0x02, 0x37, 0x56, 0x30, 0x18, 0xba, 0x3f, - 0x89, 0x32, 0x2e, 0xe3, 0x54, 0x12, 0xef, 0x15, 0x2a, 0xf6, 0x34, 0x91, 0x37, 0xa8, 0xeb, 0x5d, - 0x98, 0xf7, 0x31, 0x90, 0x75, 0x71, 0x24, 0x96, 0x7c, 0x2c, 0x5e, 0xbc, 0x4d, 0x2b, 0x99, 0xe6, - 0x33, 0x3d, 0x73, 0x3f, 0x23, 0x2c, 0x61, 0x30, 0xf1, 0x31, 0x50, 0xa7, 0x92, 0x4b, 0x20, 0x40, - 0x59, 0x8e, 0xf9, 0x35, 0x9a, 0x40, 0x40, 0x8b, 0x96, 0x23, 0x12, 0x88, 0x18, 0xef, 0xf6, 0x51, - 0xac, 0x73, 0xfd, 0xc5, 0xf4, 0x58, 0x98, 0x5c, 0x8e, 0xb2, 0x06, 0x41, 0x62, 0x29, 0x1b, 0x55, - 0x70, 0xeb, 0x4b, 0xeb, 0xdf, 0x0d, 0xb1, 0x07, 0x84, 0x9d, 0xf6, 0x30, 0x7b, 0xd8, 0x83, 0x44, - 0x5c, 0xb9, 0x73, 0x00, 0x94, 0xab, 0xf6, 0x31, 0x80, 0x87, 0x3d, 0x48, 0x6f, 0x4f, 0xc6, 0xaf, - 0xd6, 0x73, 0x36, 0xb9, 0x9a, 0x95, 0x62, 0x91, 0x4f, 0x77, 0x45, 0x26, 0x4a, 0xb0, 0x27, 0x13, - 0x94, 0x1a, 0xa0, 0xc4, 0x9e, 0x4c, 0x87, 0x8a, 0xcb, 0xe0, 0xfc, 0x52, 0xec, 0x64, 0xe9, 0x0c, - 0xae, 0xa8, 0x03, 0x43, 0x0a, 0x20, 0x32, 0x38, 0x14, 0x44, 0x3a, 0x51, 0xb3, 0xe2, 0x96, 0xe9, - 0x84, 0x65, 0x8d, 0xbf, 0x6d, 0xda, 0x4c, 0x00, 0x76, 0x76, 0x22, 0x44, 0x01, 0xa9, 0xe7, 0x78, - 0x51, 0xe6, 0x07, 0xb9, 0x14, 0x64, 0x3d, 0x0d, 0xd0, 0x59, 0x4f, 0x0f, 0x04, 0x61, 0x75, 0xcc, - 0xdf, 0xd6, 0xa5, 0xa9, 0xff, 0xc1, 0xc2, 0x6a, 0xfd, 0xf7, 0xa1, 0x96, 0xc7, 0xc2, 0x2a, 0xe0, - 0x40, 0x65, 0xb4, 0x93, 0xa6, 0xc3, 0x44, 0xb4, 0xc3, 0x6e, 0xf2, 0xa0, 0x1b, 0xc4, 0xfd, 0x8c, - 0xe4, 0x2a, 0xe3, 0x31, 0x3f, 0x0a, 0xe8, 0xe3, 0xc7, 0x80, 0x6e, 0xbb, 0x25, 0xa8, 0xcf, 0x25, - 0x9f, 0x5c, 0xb5, 0x8e, 0x35, 0x85, 0x05, 0x6d, 0x10, 0x62, 0xbb, 0x85, 0x40, 0xf1, 0x26, 0x3a, - 0x98, 0x88, 0x3c, 0xd6, 0x44, 0xb5, 0xbc, 0x4f, 0x13, 0x69, 0xce, 0x2d, 0x7e, 0xad, 0x54, 0xf7, - 0xcc, 0xa6, 0x99, 0x36, 0x09, 0x0b, 0x3e, 0x44, 0x2c, 0x7e, 0x49, 0xd8, 0xe5, 0xe4, 0xd0, 0xe7, - 0x51, 0xfb, 0xcc, 0x77, 0xcb, 0xca, 0x11, 0x7d, 0xe6, 0x9b, 0x62, 0xe9, 0x4a, 0x36, 0x7d, 0xa4, - 0xc3, 0x4a, 0xd8, 0x4f, 0x1e, 0xf7, 0x83, 0xdd, 0x92, 0x27, 0xf0, 0xb9, 0x9b, 0x71, 0x56, 0x36, - 0x5e, 0xb7, 0x22, 0x86, 0x1c, 0x46, 0x2c, 0x79, 0x22, 0x38, 0x08, 0x61, 0x81, 0xe7, 0x5d, 0x91, - 0x4b, 0x9e, 0x4b, 0x2c, 0x84, 0x85, 0xc6, 0x34, 0x18, 0x0b, 0x61, 0x94, 0x02, 0xe8, 0xb7, 0x6a, - 0x3f, 0x88, 0xcb, 0x63, 0x36, 0x47, 0x33, 0xb6, 0x66, 0xaf, 0xa7, 0x91, 0xc7, 0xfa, 0x2d, 0xe0, - 0xbc, 0x97, 0x7c, 0xbe, 0x97, 0x31, 0x2b, 0x67, 0x76, 0x77, 0x63, 0x3a, 0x78, 0x42, 0xdb, 0x09, - 0x49, 0xe2, 0x25, 0x5f, 0x5c, 0x03, 0x84, 0x9d, 0x83, 0x39, 0x9b, 0xd9, 0x9a, 0x22, 0x35, 0x50, - 0xf2, 0x56, 0x55, 0x1f, 0x74, 0x83, 0xc0, 0xcf, 0xeb, 0x74, 0xca, 0x45, 0xc4, 0x8f, 0x92, 0xf7, - 0xf1, 0x03, 0x41, 0x90, 0xbd, 0xd5, 0xf5, 0x6e, 0x56, 0x74, 0x3b, 0xf9, 0x54, 0xaf, 0x63, 0x87, - 0xc4, 0xe3, 0x01, 0x5c, 0x2c, 0x7b, 0x23, 0x78, 0x30, 0x46, 0xcd, 0x06, 0x6d, 0x6c, 0x8c, 0xda, - 0xfd, 0xd7, 0x3e, 0x63, 0x14, 0x83, 0xb5, 0xcf, 0x9f, 0xe9, 0x31, 0xba, 0xc7, 0x24, 0xab, 0xf3, - 0xf6, 0xd7, 0x29, 0xbf, 0xd6, 0x0b, 0x61, 0xa4, 0xbe, 0x86, 0x1a, 0xaa, 0x4f, 0x56, 0xc1, 0xaa, - 0x78, 0xbb, 0x37, 0x1f, 0xf1, 0xad, 0x57, 0x08, 0x9d, 0xbe, 0xc1, 0x52, 0x61, 0xbb, 0x37, 0x1f, - 0xf1, 0xad, 0xbf, 0x85, 0xef, 0xf4, 0x0d, 0x3e, 0x88, 0xdf, 0xee, 0xcd, 0x6b, 0xdf, 0x7f, 0x69, - 0x06, 0xae, 0xef, 0xbc, 0xce, 0xc3, 0x26, 0x32, 0x5d, 0x72, 0x2c, 0x9d, 0x0c, 0xed, 0x59, 0x34, - 0x96, 0x4e, 0xd2, 0x2a, 0xde, 0x05, 0x4a, 0x58, 0x29, 0x4e, 0x44, 0x95, 0xaa, 0x97, 0xf4, 0xcf, - 0x7a, 0x18, 0x35, 0x70, 0x6c, 0xd1, 0x14, 0x53, 0x72, 0xaf, 0x1b, 0x03, 0xd4, 0x9d, 0x62, 0x7e, - 0x1c, 0xb1, 0xd7, 0x3e, 0xcc, 0xbc, 0xd5, 0x93, 0x76, 0x2f, 0xfe, 0x02, 0xc6, 0x7f, 0xe3, 0x18, - 0x6b, 0x55, 0xf4, 0xa5, 0xe3, 0x93, 0xfe, 0x0a, 0xda, 0xfd, 0x5f, 0x9b, 0x75, 0x05, 0xf4, 0xaf, - 0x07, 0xc1, 0xd3, 0x3e, 0x16, 0xc1, 0x40, 0x78, 0x76, 0x23, 0x1d, 0x5d, 0x90, 0xbf, 0x37, 0x0b, - 0x68, 0x83, 0xaa, 0x6f, 0x39, 0xd4, 0x37, 0xa0, 0x7a, 0x4c, 0xc4, 0x9a, 0xd5, 0xc1, 0x70, 0x64, - 0x7c, 0x7e, 0x43, 0x2d, 0xef, 0x3a, 0xad, 0x00, 0xd6, 0xdf, 0x1c, 0x7a, 0xe5, 0x89, 0x59, 0xf6, - 0x68, 0x58, 0xa0, 0x2f, 0x6e, 0xaa, 0x46, 0x8d, 0x15, 0x0f, 0x56, 0xb7, 0x73, 0x3c, 0xeb, 0x69, - 0x38, 0xb8, 0xaf, 0xe3, 0xb3, 0x9b, 0x29, 0xe9, 0xb2, 0xfc, 0xc7, 0x5a, 0x72, 0x3f, 0x60, 0xdd, - 0xfb, 0x04, 0xb0, 0xeb, 0xf1, 0xe3, 0x88, 0x7d, 0x4a, 0xc9, 0x16, 0xee, 0x77, 0x7f, 0x39, 0x65, - 0x77, 0xf7, 0x54, 0xa0, 0xf2, 0x32, 0xcd, 0x24, 0x2f, 0xdb, 0x77, 0x4f, 0x85, 0x76, 0x1b, 0x6a, - 0x48, 0xdf, 0x3d, 0x15, 0xc1, 0xbd, 0xbb, 0xa7, 0x10, 0xcf, 0xe8, 0xdd, 0x53, 0xa8, 0xb5, 0xe8, - 0xdd, 0x53, 0x71, 0x0d, 0x2a, 0xbc, 0x9b, 0x22, 0x34, 0xfb, 0xd6, 0xbd, 0x2c, 0x86, 0xdb, 0xd8, - 0x4f, 0x6f, 0xa2, 0x42, 0x4c, 0x70, 0x0d, 0xa7, 0xce, 0xb9, 0xf5, 0x78, 0xa6, 0xc1, 0x59, 0xb7, - 0xed, 0xde, 0xbc, 0xf6, 0xfd, 0x53, 0xbd, 0xba, 0xb1, 0xe1, 0x5c, 0x94, 0xea, 0xde, 0xb1, 0xcd, - 0x58, 0x78, 0xae, 0x2d, 0xf8, 0x2d, 0xff, 0xb8, 0x1f, 0x4c, 0x54, 0xb7, 0x26, 0x74, 0xa3, 0x0f, - 0xbb, 0x0c, 0x81, 0x26, 0xdf, 0xee, 0xcd, 0x13, 0xd3, 0x48, 0xe3, 0xbb, 0x69, 0xed, 0x1e, 0xc6, - 0xc2, 0xb6, 0x7e, 0xd2, 0x5f, 0x41, 0xbb, 0x5f, 0xea, 0xb4, 0xd1, 0x77, 0xaf, 0xda, 0x79, 0xab, - 0xcb, 0xd4, 0x28, 0x68, 0xe6, 0x61, 0x5f, 0x3c, 0x96, 0x40, 0xf8, 0x53, 0x68, 0x57, 0x02, 0x81, - 0x4e, 0xa3, 0x9f, 0xdd, 0x4c, 0x49, 0x97, 0xe5, 0x9f, 0xd6, 0x92, 0xdb, 0x64, 0x59, 0x74, 0x3f, - 0xf8, 0xa2, 0xaf, 0x65, 0xd0, 0x1f, 0xbe, 0xbc, 0xb1, 0x9e, 0x2e, 0xd4, 0xbf, 0xae, 0x25, 0x77, - 0x22, 0x85, 0x6a, 0x3a, 0xc8, 0x0d, 0xac, 0x87, 0x1d, 0xe5, 0x87, 0x37, 0x57, 0xa4, 0xa6, 0x7b, - 0x1f, 0x1f, 0xb5, 0x2f, 0x65, 0x8a, 0xd8, 0x1e, 0xd1, 0x97, 0x32, 0x75, 0x6b, 0xc1, 0x4d, 0x1e, - 0x76, 0x6e, 0x16, 0x5d, 0xe8, 0x26, 0x8f, 0x3a, 0xa1, 0x16, 0xbd, 0x5c, 0x02, 0xe3, 0x30, 0x27, - 0x2f, 0xde, 0x16, 0x2c, 0x9f, 0xd2, 0x4e, 0x1a, 0x79, 0xb7, 0x13, 0xcb, 0xc1, 0xcd, 0xb1, 0x5a, - 0x7a, 0x2a, 0xcc, 0x42, 0xea, 0x21, 0xa5, 0x6f, 0x91, 0xe8, 0xe6, 0x58, 0x0b, 0x25, 0xbc, 0xe9, - 0xac, 0x31, 0xe6, 0x0d, 0x24, 0x8b, 0x8f, 0xfa, 0xa0, 0x20, 0x45, 0xb7, 0xde, 0xec, 0x9e, 0xfb, - 0xe3, 0x98, 0x95, 0xd6, 0xbe, 0xfb, 0x56, 0x4f, 0x9a, 0x70, 0x3b, 0xe2, 0xf2, 0x2b, 0xce, 0xa6, - 0xbc, 0x8c, 0xba, 0xb5, 0x54, 0x2f, 0xb7, 0x3e, 0x8d, 0xb9, 0xdd, 0x15, 0xd9, 0x62, 0x9e, 0xeb, - 0xc6, 0x24, 0xdd, 0xfa, 0x54, 0xb7, 0x5b, 0x40, 0xc3, 0x6d, 0x41, 0xe7, 0x56, 0xa5, 0x97, 0x8f, - 0xe2, 0x66, 0x82, 0xac, 0x72, 0xb3, 0x17, 0x4b, 0xd7, 0x53, 0x77, 0xa3, 0x8e, 0x7a, 0x82, 0x9e, - 0xb4, 0xd5, 0x93, 0x86, 0xfb, 0x73, 0x9e, 0x5b, 0xdb, 0x9f, 0xb6, 0x3b, 0x6c, 0xb5, 0xba, 0xd4, - 0x93, 0xfe, 0x0a, 0x70, 0x37, 0x54, 0xf7, 0xaa, 0xc3, 0xb4, 0x92, 0x2f, 0xd3, 0x2c, 0x1b, 0x6c, - 0x46, 0xba, 0x89, 0x81, 0xa2, 0xbb, 0xa1, 0x08, 0x4c, 0xf4, 0x64, 0xb3, 0x7b, 0x98, 0x0f, 0xba, - 0xec, 0x28, 0xaa, 0x57, 0x4f, 0xf6, 0x69, 0xb0, 0xa3, 0xe5, 0x3d, 0x6a, 0x5b, 0xdb, 0x61, 0xfc, - 0xc1, 0xb5, 0x2a, 0xbc, 0xdd, 0x9b, 0x07, 0xaf, 0xdb, 0x15, 0xa5, 0x66, 0x96, 0x7b, 0x94, 0x89, - 0x60, 0x26, 0xb9, 0xdf, 0x41, 0x81, 0x5d, 0xc1, 0x66, 0x18, 0xbd, 0x49, 0xa7, 0x33, 0x2e, 0xd1, - 0x37, 0x45, 0x3e, 0x10, 0x7d, 0x53, 0x04, 0x40, 0xd0, 0x74, 0xcd, 0xdf, 0xed, 0x76, 0xe8, 0xc1, - 0x14, 0x6b, 0x3a, 0xad, 0xec, 0x51, 0xb1, 0xa6, 0x43, 0x69, 0x10, 0x0d, 0xac, 0x5b, 0xfd, 0x39, - 0xfe, 0xa3, 0x98, 0x19, 0xf0, 0x4d, 0xfe, 0x66, 0x2f, 0x16, 0xcc, 0x28, 0xce, 0x61, 0x3a, 0x4f, - 0x25, 0x36, 0xa3, 0x78, 0x36, 0x6a, 0x24, 0x36, 0xa3, 0xb4, 0x51, 0xaa, 0x7a, 0x75, 0x8e, 0x70, - 0x30, 0x8d, 0x57, 0xaf, 0x61, 0xfa, 0x55, 0xcf, 0xb2, 0xad, 0x17, 0x9b, 0xb9, 0xed, 0x32, 0xf2, - 0x52, 0x2f, 0x96, 0x91, 0xbe, 0xad, 0x3e, 0xd3, 0x84, 0x60, 0x2c, 0xea, 0x50, 0x0a, 0x70, 0xc3, - 0xbe, 0xe6, 0xcc, 0xbb, 0xd7, 0xa2, 0xe0, 0xac, 0x64, 0xf9, 0x04, 0x5d, 0x9c, 0x2a, 0x83, 0x2d, - 0x32, 0xb6, 0x38, 0x25, 0x35, 0xc0, 0x6b, 0xf3, 0xf0, 0x03, 0x4b, 0x64, 0x28, 0xd8, 0x2f, 0x19, - 0xc3, 0xef, 0x2b, 0x1f, 0xf6, 0x20, 0xe1, 0x6b, 0x73, 0x03, 0xd8, 0x8d, 0xef, 0xc6, 0xe9, 0xa7, - 0x11, 0x53, 0x21, 0x1a, 0x5b, 0x08, 0xd3, 0x2a, 0xa0, 0x53, 0xdb, 0x04, 0x97, 0xcb, 0x9f, 0xf0, - 0x15, 0xd6, 0xa9, 0x5d, 0x7e, 0xaa, 0x90, 0x58, 0xa7, 0x6e, 0xa3, 0x20, 0xcf, 0xf4, 0xd7, 0x41, - 0xeb, 0x11, 0x7d, 0x7f, 0xe9, 0xb3, 0xd1, 0xc9, 0x81, 0x91, 0xb3, 0x97, 0x2e, 0x83, 0xf7, 0x04, - 0x48, 0x41, 0xf7, 0xd2, 0x25, 0xfe, 0x9a, 0x60, 0xb3, 0x17, 0x0b, 0x5f, 0xc9, 0x33, 0xc9, 0xdf, - 0x9a, 0x77, 0xe5, 0x48, 0x71, 0x95, 0xbc, 0xf5, 0xb2, 0xfc, 0x41, 0x37, 0xe8, 0x0e, 0xc0, 0x9e, - 0x94, 0x62, 0xc2, 0xab, 0x4a, 0xdf, 0x54, 0x19, 0x9e, 0x30, 0xd2, 0xb2, 0x21, 0xb8, 0xa7, 0xf2, - 0x5e, 0x1c, 0xf2, 0xae, 0x97, 0x6b, 0x44, 0xee, 0xd6, 0x9b, 0x75, 0x54, 0xb3, 0x7d, 0xe1, 0xcd, - 0x46, 0x27, 0xe7, 0x86, 0x97, 0x96, 0xfa, 0xd7, 0xdc, 0x3c, 0x40, 0xd5, 0xb1, 0x1b, 0x6e, 0x1e, - 0xf6, 0x20, 0xb5, 0xab, 0xaf, 0x92, 0x77, 0x0f, 0xc5, 0x6c, 0xc4, 0xf3, 0xe9, 0xe0, 0x07, 0xe1, - 0x11, 0x5a, 0x31, 0x1b, 0xd6, 0x7f, 0xb6, 0x46, 0x6f, 0x51, 0x62, 0x77, 0x08, 0x70, 0x8f, 0x9f, - 0x2f, 0x66, 0x23, 0xc9, 0x24, 0x38, 0x04, 0xa8, 0xfe, 0x3e, 0xac, 0x05, 0xc4, 0x21, 0xc0, 0x00, - 0x00, 0xf6, 0xc6, 0x25, 0xe7, 0xa8, 0xbd, 0x5a, 0x10, 0xb5, 0xa7, 0x01, 0x97, 0x45, 0x58, 0x7b, - 0x75, 0xa2, 0x0e, 0x0f, 0xed, 0x39, 0x1d, 0x25, 0x25, 0xb2, 0x88, 0x36, 0xe5, 0x3a, 0x77, 0x53, - 0x7d, 0x75, 0xeb, 0xc8, 0x62, 0x3e, 0x67, 0xe5, 0x0a, 0x74, 0x6e, 0x5d, 0x4b, 0x0f, 0x20, 0x3a, - 0x37, 0x0a, 0xba, 0x51, 0x6b, 0x1e, 0xf3, 0xe4, 0x6a, 0x5f, 0x94, 0x62, 0x21, 0xd3, 0x9c, 0xc3, - 0x9b, 0x27, 0xec, 0x03, 0xf5, 0x19, 0x62, 0xd4, 0x52, 0xac, 0xcb, 0x72, 0x15, 0xd1, 0x9c, 0x27, - 0x54, 0xf7, 0x57, 0x57, 0x52, 0x94, 0xf0, 0x7d, 0x62, 0x63, 0x05, 0x42, 0x44, 0x96, 0x4b, 0xc2, - 0xa0, 0xed, 0x4f, 0xd2, 0x7c, 0x86, 0xb6, 0xfd, 0x89, 0x7f, 0xfb, 0xeb, 0x1d, 0x1a, 0x70, 0x03, - 0xaa, 0x79, 0x68, 0xcd, 0x00, 0xd0, 0xdf, 0x72, 0xa2, 0x0f, 0xdd, 0x27, 0x88, 0x01, 0x85, 0x93, - 0xc0, 0xd5, 0xab, 0x82, 0xe7, 0x7c, 0x6a, 0x4e, 0xcd, 0x61, 0xae, 0x02, 0x22, 0xea, 0x0a, 0x92, - 0x2e, 0x16, 0x29, 0xf9, 0xe9, 0x22, 0x3f, 0x29, 0xc5, 0x45, 0x9a, 0xf1, 0x12, 0xc4, 0xa2, 0x46, - 0xdd, 0x93, 0x13, 0xb1, 0x08, 0xe3, 0xdc, 0xf1, 0x0b, 0x25, 0x0d, 0x2e, 0x61, 0x1f, 0x97, 0x6c, - 0x02, 0x8f, 0x5f, 0x34, 0x36, 0xda, 0x18, 0xb1, 0x33, 0x18, 0xc1, 0xbd, 0x44, 0xa7, 0x71, 0x9d, - 0xaf, 0x54, 0xff, 0xd0, 0xdf, 0x12, 0xaa, 0x3b, 0x51, 0x2b, 0x90, 0xe8, 0x68, 0x73, 0x18, 0x49, - 0x24, 0x3a, 0x71, 0x0d, 0x37, 0x95, 0x28, 0xee, 0x58, 0x1f, 0x2b, 0x02, 0x53, 0x49, 0x63, 0xc3, - 0x08, 0x89, 0xa9, 0xa4, 0x05, 0x81, 0x80, 0x64, 0x86, 0xc1, 0x0c, 0x0d, 0x48, 0x56, 0x1a, 0x0d, - 0x48, 0x3e, 0xe5, 0x02, 0xc5, 0x41, 0x9e, 0xca, 0x94, 0x65, 0x23, 0x2e, 0x4f, 0x58, 0xc9, 0xe6, - 0x5c, 0xf2, 0x12, 0x06, 0x0a, 0x8d, 0x0c, 0x03, 0x86, 0x08, 0x14, 0x14, 0xab, 0x1d, 0xfe, 0x5e, - 0xf2, 0x7e, 0x3d, 0xef, 0xf3, 0x5c, 0xff, 0xdc, 0xca, 0x0b, 0xf5, 0x3b, 0x4d, 0x83, 0x0f, 0xac, - 0x8d, 0x91, 0x2c, 0x39, 0x9b, 0x1b, 0xdb, 0xef, 0xd9, 0xbf, 0x2b, 0xf0, 0xc9, 0x5a, 0xdd, 0x9f, - 0x8f, 0x85, 0x4c, 0x2f, 0xea, 0x65, 0xb6, 0xfe, 0x82, 0x08, 0xf4, 0x67, 0x5f, 0x3c, 0x8c, 0xdc, - 0x45, 0x81, 0x71, 0x2e, 0x4e, 0xfb, 0xd2, 0x53, 0x5e, 0x64, 0x30, 0x4e, 0x07, 0xda, 0x0a, 0x20, - 0xe2, 0x34, 0x0a, 0xba, 0xc1, 0xe9, 0x8b, 0xc7, 0x3c, 0x5e, 0x99, 0x31, 0xef, 0x57, 0x99, 0x71, - 0xf0, 0x51, 0x46, 0x96, 0xbc, 0x7f, 0xc4, 0xe7, 0xe7, 0xbc, 0xac, 0x2e, 0xd3, 0x82, 0xba, 0xb7, - 0xd5, 0x11, 0x9d, 0xf7, 0xb6, 0x12, 0xa8, 0x9b, 0x09, 0x1c, 0x70, 0x50, 0x1d, 0xb3, 0x39, 0x57, - 0x37, 0x6b, 0x80, 0x99, 0xc0, 0x33, 0xe2, 0x41, 0xc4, 0x4c, 0x40, 0xc2, 0xde, 0xf7, 0x5d, 0x8e, - 0x39, 0xe5, 0xb3, 0xba, 0x87, 0x95, 0x27, 0x6c, 0x35, 0xe7, 0xb9, 0xd4, 0x26, 0xc1, 0x9e, 0xbc, - 0x67, 0x12, 0xe7, 0x89, 0x3d, 0xf9, 0x3e, 0x7a, 0x5e, 0x68, 0x0a, 0x1e, 0xfc, 0x89, 0x28, 0x65, - 0xf3, 0x63, 0x4a, 0x67, 0x65, 0x06, 0x42, 0x53, 0xf8, 0x50, 0x03, 0x92, 0x08, 0x4d, 0x71, 0x0d, - 0xef, 0x57, 0x08, 0x82, 0x32, 0xbc, 0xe6, 0xa5, 0xed, 0x27, 0x2f, 0xe6, 0x2c, 0xcd, 0x74, 0x6f, - 0xf8, 0x51, 0xc4, 0x36, 0xa1, 0x43, 0xfc, 0x0a, 0x41, 0x5f, 0x5d, 0xef, 0x77, 0x1b, 0xe2, 0x25, - 0x04, 0xaf, 0x08, 0x3a, 0xec, 0x13, 0xaf, 0x08, 0xba, 0xb5, 0xdc, 0xca, 0xdd, 0xb1, 0x8a, 0x5b, - 0x29, 0x62, 0x57, 0x4c, 0xe1, 0x7e, 0xa1, 0x67, 0x13, 0x80, 0xc4, 0xca, 0x3d, 0xaa, 0xe0, 0x52, - 0x03, 0x87, 0xbd, 0x4c, 0x73, 0x96, 0xa5, 0x3f, 0x83, 0x69, 0xbd, 0x67, 0xc7, 0x10, 0x44, 0x6a, - 0x80, 0x93, 0x98, 0xab, 0x7d, 0x2e, 0xc7, 0x69, 0x1d, 0xfa, 0x1f, 0x44, 0x9e, 0x9b, 0x22, 0xba, - 0x5d, 0x79, 0xa4, 0x77, 0x47, 0x2b, 0x7c, 0xac, 0x3b, 0x45, 0x31, 0xaa, 0x67, 0xd5, 0x53, 0x3e, - 0xe1, 0x69, 0x21, 0x07, 0x9f, 0xc7, 0x9f, 0x15, 0xc0, 0x89, 0x83, 0x16, 0x3d, 0xd4, 0xbc, 0xd7, - 0xf7, 0x75, 0x2c, 0x19, 0x35, 0xbf, 0x32, 0x78, 0x56, 0xf1, 0x52, 0x27, 0x1a, 0xfb, 0x5c, 0x82, - 0xd1, 0xe9, 0x71, 0x43, 0x0f, 0xac, 0x2b, 0x4a, 0x8c, 0xce, 0xb8, 0x86, 0xdb, 0xec, 0xf3, 0x38, - 0x7d, 0xe7, 0xb6, 0x3a, 0x6f, 0xf8, 0x98, 0x34, 0xe6, 0x51, 0xc4, 0x66, 0x1f, 0x4d, 0xbb, 0x6c, - 0xad, 0xed, 0x76, 0x27, 0x5f, 0x1d, 0xc0, 0x23, 0x13, 0x88, 0x25, 0x85, 0x11, 0xd9, 0x5a, 0x04, - 0xf7, 0x36, 0xc3, 0x4b, 0xc1, 0xa6, 0x13, 0x56, 0xc9, 0x13, 0xb6, 0xca, 0x04, 0x9b, 0xaa, 0x79, - 0x1d, 0x6e, 0x86, 0x1b, 0x66, 0xe8, 0x43, 0xd4, 0x66, 0x38, 0x05, 0xfb, 0xd9, 0x99, 0xfa, 0xf1, - 0x44, 0x7d, 0x96, 0x13, 0x66, 0x67, 0xaa, 0xbc, 0xf0, 0x1c, 0xe7, 0xbd, 0x38, 0xe4, 0xbe, 0x41, - 0x6b, 0x44, 0x2a, 0x0d, 0xb9, 0x83, 0xe9, 0x04, 0x09, 0xc8, 0xc7, 0x11, 0xc2, 0xdd, 0x4b, 0xd1, - 0xfc, 0xdd, 0xfc, 0xfe, 0x8f, 0xd4, 0x37, 0x59, 0x3f, 0xc6, 0x74, 0x7d, 0x68, 0xe8, 0x5f, 0x70, - 0xb7, 0xd5, 0x93, 0x76, 0x69, 0xe6, 0xee, 0x25, 0x93, 0x3b, 0xd3, 0xe9, 0x11, 0xaf, 0x90, 0x0f, - 0xca, 0x6b, 0xe1, 0xd0, 0x49, 0x89, 0x34, 0xb3, 0x4d, 0xb9, 0x8e, 0x5e, 0xcb, 0x5e, 0x4c, 0x53, - 0xa9, 0x65, 0xe6, 0x84, 0xf4, 0xe3, 0xb6, 0x81, 0x36, 0x45, 0xd4, 0x8a, 0xa6, 0x5d, 0x2c, 0xaf, - 0x99, 0xb1, 0x98, 0xcd, 0x32, 0xae, 0xa1, 0x53, 0xce, 0x9a, 0x8b, 0xfc, 0xb6, 0xdb, 0xb6, 0x50, - 0x90, 0x88, 0xe5, 0x51, 0x05, 0x97, 0x46, 0xd6, 0x58, 0xf3, 0x4a, 0xca, 0x3c, 0xd8, 0x8d, 0xb6, - 0x99, 0x00, 0x20, 0xd2, 0x48, 0x14, 0x74, 0xdf, 0xbd, 0xd5, 0xe2, 0x7d, 0x6e, 0x9e, 0x04, 0xbc, - 0x82, 0x48, 0x29, 0x7b, 0x62, 0xe2, 0xbb, 0x37, 0x04, 0x73, 0xeb, 0x04, 0xe0, 0xe1, 0xf9, 0xea, - 0x60, 0x0a, 0xd7, 0x09, 0x50, 0x5f, 0x31, 0xc4, 0x3a, 0x81, 0x62, 0xc3, 0xa6, 0xb3, 0xfb, 0x5e, - 0x87, 0xac, 0x72, 0x95, 0x43, 0x9a, 0x0e, 0x05, 0x63, 0x4d, 0x47, 0x29, 0x84, 0x8f, 0xd4, 0xdf, - 0x5a, 0x43, 0x1e, 0x29, 0xb6, 0xaf, 0xb6, 0xde, 0x85, 0xb9, 0xb8, 0x64, 0xd7, 0x93, 0xea, 0xc8, - 0x12, 0x7e, 0x83, 0x7f, 0x23, 0x24, 0xe2, 0x52, 0x0b, 0xf2, 0x7e, 0x9a, 0xae, 0x48, 0x47, 0x92, - 0x95, 0xb2, 0x0e, 0xc8, 0xed, 0x9f, 0xa6, 0x2b, 0xd2, 0xa1, 0x27, 0xa5, 0x7e, 0x9a, 0xae, 0x45, - 0x79, 0x3f, 0xb7, 0x56, 0x9b, 0x17, 0x85, 0xb6, 0xfe, 0x09, 0xa2, 0x67, 0x84, 0xe4, 0x6f, 0xe7, - 0x02, 0xa8, 0xb1, 0xfd, 0xfc, 0xe3, 0xff, 0xfa, 0xe6, 0xd6, 0xda, 0x2f, 0xbe, 0xb9, 0xb5, 0xf6, - 0x3f, 0xdf, 0xdc, 0x5a, 0xfb, 0xf9, 0xb7, 0xb7, 0xde, 0xf9, 0xc5, 0xb7, 0xb7, 0xde, 0xf9, 0xef, - 0x6f, 0x6f, 0xbd, 0xf3, 0xf5, 0xbb, 0xfa, 0xf7, 0x80, 0xcf, 0xff, 0x9f, 0xfa, 0x55, 0xdf, 0x67, - 0xff, 0x17, 0x00, 0x00, 0xff, 0xff, 0x79, 0x20, 0x3d, 0xb9, 0x33, 0x78, 0x00, 0x00, + // 5364 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x9d, 0xdf, 0x6f, 0x24, 0x49, + 0x52, 0xf8, 0xd7, 0x2f, 0xdf, 0xfd, 0x52, 0xc7, 0x2d, 0xd0, 0x0b, 0xcb, 0xde, 0x72, 0x37, 0xbf, + 0x76, 0xc6, 0xf6, 0x8c, 0xed, 0xf6, 0xec, 0xcc, 0xce, 0xee, 0xe9, 0x0e, 0x09, 0x79, 0xec, 0xb1, + 0xd7, 0x9c, 0xed, 0x31, 0xee, 0xf6, 0x8c, 0xb4, 0x12, 0x12, 0xe9, 0xea, 0x74, 0xbb, 0x70, 0x75, + 0x65, 0x5d, 0x55, 0x76, 0x7b, 0xfa, 0x10, 0x08, 0x04, 0x02, 0x81, 0x40, 0x9c, 0xf8, 0xf5, 0x8a, + 0xc4, 0x5f, 0xc3, 0xe3, 0x3d, 0xf2, 0x88, 0x76, 0x9f, 0xef, 0x7f, 0x40, 0x95, 0x95, 0x95, 0x3f, + 0xa2, 0x22, 0xb2, 0xca, 0xf7, 0x34, 0xa3, 0x8e, 0x4f, 0x44, 0x64, 0x56, 0x66, 0x46, 0x46, 0x66, + 0x65, 0xa5, 0xa3, 0xbb, 0xf9, 0xc5, 0x76, 0x5e, 0x08, 0x29, 0xca, 0xed, 0x92, 0x17, 0x8b, 0x24, + 0xe6, 0xcd, 0xbf, 0x43, 0xf5, 0xf3, 0xe0, 0x7d, 0x96, 0x2d, 0xe5, 0x32, 0xe7, 0x9f, 0x7c, 0x6c, + 0xc9, 0x58, 0xcc, 0x66, 0x2c, 0x9b, 0x94, 0x35, 0xf2, 0xc9, 0x47, 0x56, 0xc2, 0x17, 0x3c, 0x93, + 0xfa, 0xf7, 0x67, 0xbf, 0xfc, 0xe5, 0x4a, 0xf4, 0xc1, 0x6e, 0x9a, 0xf0, 0x4c, 0xee, 0x6a, 0x8d, + 0xc1, 0xd7, 0xd1, 0x77, 0x77, 0xf2, 0xfc, 0x80, 0xcb, 0x37, 0xbc, 0x28, 0x13, 0x91, 0x0d, 0x3e, + 0x1d, 0x6a, 0x07, 0xc3, 0xb3, 0x3c, 0x1e, 0xee, 0xe4, 0xf9, 0xd0, 0x0a, 0x87, 0x67, 0xfc, 0xa7, + 0x73, 0x5e, 0xca, 0x4f, 0x1e, 0x86, 0xa1, 0x32, 0x17, 0x59, 0xc9, 0x07, 0x97, 0xd1, 0x6f, 0xed, + 0xe4, 0xf9, 0x88, 0xcb, 0x3d, 0x5e, 0x55, 0x60, 0x24, 0x99, 0xe4, 0x83, 0xb5, 0x96, 0xaa, 0x0f, + 0x18, 0x1f, 0xeb, 0xdd, 0xa0, 0xf6, 0x33, 0x8e, 0xbe, 0x53, 0xf9, 0xb9, 0x9a, 0xcb, 0x89, 0xb8, + 0xc9, 0x06, 0xf7, 0xdb, 0x8a, 0x5a, 0x64, 0x6c, 0x3f, 0x08, 0x21, 0xda, 0xea, 0xdb, 0xe8, 0xd7, + 0xdf, 0xb2, 0x34, 0xe5, 0x72, 0xb7, 0xe0, 0x55, 0xc1, 0x7d, 0x9d, 0x5a, 0x34, 0xac, 0x65, 0xc6, + 0xee, 0xa7, 0x41, 0x46, 0x1b, 0xfe, 0x3a, 0xfa, 0x6e, 0x2d, 0x39, 0xe3, 0xb1, 0x58, 0xf0, 0x62, + 0x80, 0x6a, 0x69, 0x21, 0xf1, 0xc8, 0x5b, 0x10, 0xb4, 0xbd, 0x2b, 0xb2, 0x05, 0x2f, 0x24, 0x6e, + 0x5b, 0x0b, 0xc3, 0xb6, 0x2d, 0xa4, 0x6d, 0xff, 0xfd, 0x4a, 0xf4, 0xfd, 0x9d, 0x38, 0x16, 0xf3, + 0x4c, 0x1e, 0x89, 0x98, 0xa5, 0x47, 0x49, 0x76, 0x7d, 0xc2, 0x6f, 0x76, 0xaf, 0x2a, 0x3e, 0x9b, + 0xf2, 0xc1, 0x73, 0xff, 0xa9, 0xd6, 0xe8, 0xd0, 0xb0, 0x43, 0x17, 0x36, 0xbe, 0x3f, 0xbf, 0x9d, + 0x92, 0x2e, 0xcb, 0x3f, 0xaf, 0x44, 0x77, 0x60, 0x59, 0x46, 0x22, 0x5d, 0x70, 0x5b, 0x9a, 0x17, + 0x1d, 0x86, 0x7d, 0xdc, 0x94, 0xe7, 0x8b, 0xdb, 0xaa, 0xe9, 0x12, 0xa5, 0xd1, 0x87, 0x6e, 0x77, + 0x19, 0xf1, 0x52, 0x0d, 0xa7, 0xc7, 0x74, 0x8f, 0xd0, 0x88, 0xf1, 0xfc, 0xa4, 0x0f, 0xaa, 0xbd, + 0x25, 0xd1, 0x40, 0x7b, 0x4b, 0x45, 0x69, 0x9c, 0xad, 0xa3, 0x16, 0x1c, 0xc2, 0xf8, 0x7a, 0xdc, + 0x83, 0xd4, 0xae, 0xfe, 0x24, 0xfa, 0x8d, 0xb7, 0xa2, 0xb8, 0x2e, 0x73, 0x16, 0x73, 0x3d, 0x14, + 0x1e, 0xf9, 0xda, 0x8d, 0x14, 0x8e, 0x86, 0xd5, 0x2e, 0xcc, 0xe9, 0xb4, 0x8d, 0xf0, 0x75, 0xce, + 0x61, 0x0c, 0xb2, 0x8a, 0x95, 0x90, 0xea, 0xb4, 0x10, 0xd2, 0xb6, 0xaf, 0xa3, 0x81, 0xb5, 0x7d, + 0xf1, 0xa7, 0x3c, 0x96, 0x3b, 0x93, 0x09, 0x6c, 0x15, 0xab, 0xab, 0x88, 0xe1, 0xce, 0x64, 0x42, + 0xb5, 0x0a, 0x8e, 0x6a, 0x67, 0x37, 0xd1, 0x47, 0xc0, 0xd9, 0x51, 0x52, 0x2a, 0x87, 0x5b, 0x61, + 0x2b, 0x1a, 0x33, 0x4e, 0x87, 0x7d, 0x71, 0xed, 0xf8, 0x2f, 0x57, 0xa2, 0xef, 0x21, 0x9e, 0xcf, + 0xf8, 0x4c, 0x2c, 0xf8, 0xe0, 0x69, 0xb7, 0xb5, 0x9a, 0x34, 0xfe, 0x3f, 0xbb, 0x85, 0x06, 0xd2, + 0x4d, 0x46, 0x3c, 0xe5, 0xb1, 0x24, 0xbb, 0x49, 0x2d, 0xee, 0xec, 0x26, 0x06, 0x73, 0x46, 0x58, + 0x23, 0x3c, 0xe0, 0x72, 0x77, 0x5e, 0x14, 0x3c, 0x93, 0x64, 0x5b, 0x5a, 0xa4, 0xb3, 0x2d, 0x3d, + 0x14, 0xa9, 0xcf, 0x01, 0x97, 0x3b, 0x69, 0x4a, 0xd6, 0xa7, 0x16, 0x77, 0xd6, 0xc7, 0x60, 0xda, + 0x43, 0x1c, 0xfd, 0xa6, 0xf3, 0xc4, 0xe4, 0x61, 0x76, 0x29, 0x06, 0xf4, 0xb3, 0x50, 0x72, 0xe3, + 0x63, 0xad, 0x93, 0x43, 0xaa, 0xf1, 0xea, 0x5d, 0x2e, 0x0a, 0xba, 0x59, 0x6a, 0x71, 0x67, 0x35, + 0x0c, 0xa6, 0x3d, 0xfc, 0x71, 0xf4, 0x81, 0x8e, 0x92, 0xcd, 0x7c, 0xf6, 0x10, 0x0d, 0xa1, 0x70, + 0x42, 0x7b, 0xd4, 0x41, 0xd9, 0xe0, 0xa0, 0x65, 0x3a, 0xf8, 0x7c, 0x8a, 0xea, 0x81, 0xd0, 0xf3, + 0x30, 0x0c, 0xb5, 0x6c, 0xef, 0xf1, 0x94, 0x93, 0xb6, 0x6b, 0x61, 0x87, 0x6d, 0x03, 0x69, 0xdb, + 0x45, 0xf4, 0x3b, 0xe6, 0xb1, 0x54, 0xf3, 0xa8, 0x92, 0x57, 0x41, 0x7a, 0x83, 0xa8, 0xb7, 0x0b, + 0x19, 0x5f, 0x9b, 0xfd, 0xe0, 0x56, 0x7d, 0xf4, 0x08, 0xc4, 0xeb, 0x03, 0xc6, 0xdf, 0xc3, 0x30, + 0xa4, 0x6d, 0xff, 0xc3, 0x4a, 0xf4, 0x03, 0x2d, 0x7b, 0x95, 0xb1, 0x8b, 0x94, 0xab, 0x29, 0xf1, + 0x84, 0xcb, 0x1b, 0x51, 0x5c, 0x8f, 0x96, 0x59, 0x4c, 0x4c, 0xff, 0x38, 0xdc, 0x31, 0xfd, 0x93, + 0x4a, 0x4e, 0xc6, 0xa7, 0x2b, 0x2a, 0x45, 0x0e, 0x33, 0xbe, 0xa6, 0x06, 0x52, 0xe4, 0x54, 0xc6, + 0xe7, 0x23, 0x2d, 0xab, 0xc7, 0x55, 0xd8, 0xc4, 0xad, 0x1e, 0xbb, 0x71, 0xf2, 0x41, 0x08, 0xb1, + 0x61, 0xab, 0xe9, 0xc0, 0x22, 0xbb, 0x4c, 0xa6, 0xe7, 0xf9, 0xa4, 0xea, 0xc6, 0x8f, 0xf1, 0x1e, + 0xea, 0x20, 0x44, 0xd8, 0x22, 0x50, 0xed, 0xed, 0x9f, 0x6c, 0x62, 0xa4, 0x87, 0xd2, 0x7e, 0x21, + 0x66, 0x47, 0x7c, 0xca, 0xe2, 0xa5, 0x1e, 0xff, 0x9f, 0x87, 0x06, 0x1e, 0xa4, 0x4d, 0x21, 0x5e, + 0xdc, 0x52, 0x4b, 0x97, 0xe7, 0x3f, 0x57, 0xa2, 0x87, 0x4d, 0xf5, 0xaf, 0x58, 0x36, 0xe5, 0xba, + 0x3d, 0xeb, 0xd2, 0xef, 0x64, 0x93, 0x33, 0x5e, 0x4a, 0x56, 0xc8, 0xc1, 0x8f, 0xf0, 0x4a, 0x86, + 0x74, 0x4c, 0xd9, 0x7e, 0xfc, 0x2b, 0xe9, 0xda, 0x56, 0x1f, 0x55, 0x81, 0x4d, 0x87, 0x00, 0xbf, + 0xd5, 0x95, 0x04, 0x06, 0x80, 0x07, 0x21, 0xc4, 0xb6, 0xba, 0x12, 0x1c, 0x66, 0x8b, 0x44, 0xf2, + 0x03, 0x9e, 0xf1, 0xa2, 0xdd, 0xea, 0xb5, 0xaa, 0x8f, 0x10, 0xad, 0x4e, 0xa0, 0x36, 0xd8, 0x78, + 0xde, 0xcc, 0xe4, 0xb8, 0x11, 0x30, 0xd2, 0x9a, 0x1e, 0x37, 0xfb, 0xc1, 0x76, 0x75, 0xe7, 0xf8, + 0x3c, 0xe3, 0x0b, 0x71, 0x0d, 0x57, 0x77, 0xae, 0x89, 0x1a, 0x20, 0x56, 0x77, 0x28, 0x68, 0x67, + 0x30, 0xc7, 0xcf, 0x9b, 0x84, 0xdf, 0x80, 0x19, 0xcc, 0x55, 0xae, 0xc4, 0xc4, 0x0c, 0x86, 0x60, + 0xda, 0xc3, 0x49, 0xf4, 0x6b, 0x4a, 0xf8, 0x87, 0x22, 0xc9, 0x06, 0x77, 0x11, 0xa5, 0x4a, 0x60, + 0xac, 0xde, 0xa3, 0x01, 0x50, 0xe2, 0xea, 0xd7, 0x5d, 0x96, 0xc5, 0x3c, 0x45, 0x4b, 0x6c, 0xc5, + 0xc1, 0x12, 0x7b, 0x98, 0x4d, 0x1d, 0x94, 0xb0, 0x8a, 0x5f, 0xa3, 0x2b, 0x56, 0x24, 0xd9, 0x74, + 0x80, 0xe9, 0x3a, 0x72, 0x22, 0x75, 0xc0, 0x38, 0xd0, 0x85, 0xb5, 0xe2, 0x4e, 0x9e, 0x17, 0x55, + 0x58, 0xc4, 0xba, 0xb0, 0x8f, 0x04, 0xbb, 0x70, 0x0b, 0xc5, 0xbd, 0xed, 0xf1, 0x38, 0x4d, 0xb2, + 0xa0, 0x37, 0x8d, 0xf4, 0xf1, 0x66, 0x51, 0xd0, 0x79, 0x8f, 0x38, 0x5b, 0xf0, 0xa6, 0x66, 0xd8, + 0x93, 0x71, 0x81, 0x60, 0xe7, 0x05, 0xa0, 0x5d, 0xa7, 0x29, 0xf1, 0x31, 0xbb, 0xe6, 0xd5, 0x03, + 0xe6, 0xd5, 0xbc, 0x36, 0xc0, 0xf4, 0x3d, 0x82, 0x58, 0xa7, 0xe1, 0xa4, 0x76, 0x35, 0x8f, 0x3e, + 0x52, 0xf2, 0x53, 0x56, 0xc8, 0x24, 0x4e, 0x72, 0x96, 0x35, 0xf9, 0x3f, 0x36, 0xae, 0x5b, 0x94, + 0x71, 0xb9, 0xd5, 0x93, 0xd6, 0x6e, 0xff, 0x63, 0x25, 0xba, 0x0f, 0xfd, 0x9e, 0xf2, 0x62, 0x96, + 0xa8, 0x65, 0x64, 0x59, 0x07, 0xe1, 0xc1, 0x97, 0x61, 0xa3, 0x2d, 0x05, 0x53, 0x9a, 0x1f, 0xde, + 0x5e, 0xd1, 0x26, 0x43, 0x23, 0x9d, 0x5a, 0xbf, 0x2e, 0x26, 0xad, 0x6d, 0x96, 0x51, 0x93, 0x2f, + 0x2b, 0x21, 0x91, 0x0c, 0xb5, 0x20, 0x30, 0xc2, 0xcf, 0xb3, 0xb2, 0xb1, 0x8e, 0x8d, 0x70, 0x2b, + 0x0e, 0x8e, 0x70, 0x0f, 0xb3, 0x23, 0xfc, 0x74, 0x7e, 0x91, 0x26, 0xe5, 0x55, 0x92, 0x4d, 0x75, + 0xe6, 0xeb, 0xeb, 0x5a, 0x31, 0x4c, 0x7e, 0xd7, 0x3a, 0x39, 0xcc, 0x89, 0xee, 0x2c, 0xa4, 0x13, + 0xd0, 0x4d, 0xd6, 0x3a, 0x39, 0xbb, 0x3e, 0xb0, 0xd2, 0x6a, 0xe5, 0x08, 0xd6, 0x07, 0x8e, 0x6a, + 0x25, 0x25, 0xd6, 0x07, 0x6d, 0x4a, 0x9b, 0x17, 0xd1, 0x6f, 0xbb, 0x75, 0x28, 0x45, 0xba, 0xe0, + 0xe7, 0x45, 0x32, 0x78, 0x42, 0x97, 0xaf, 0x61, 0x8c, 0xab, 0x8d, 0x5e, 0xac, 0x0d, 0x54, 0x96, + 0x38, 0xe0, 0x72, 0x24, 0x99, 0x9c, 0x97, 0x20, 0x50, 0x39, 0x36, 0x0c, 0x42, 0x04, 0x2a, 0x02, + 0xd5, 0xde, 0xfe, 0x28, 0x8a, 0xea, 0x45, 0xb7, 0xda, 0x18, 0xf1, 0xe7, 0x1e, 0xbd, 0x1a, 0xf7, + 0x76, 0x45, 0xee, 0x07, 0x08, 0x9b, 0xf0, 0xd4, 0xbf, 0xab, 0xfd, 0x9e, 0x01, 0xaa, 0xa1, 0x44, + 0x44, 0xc2, 0x03, 0x10, 0x58, 0xd0, 0xd1, 0x95, 0xb8, 0xc1, 0x0b, 0x5a, 0x49, 0xc2, 0x05, 0xd5, + 0x84, 0xdd, 0x81, 0xd5, 0x05, 0xc5, 0x76, 0x60, 0x9b, 0x62, 0x84, 0x76, 0x60, 0x21, 0x63, 0xfb, + 0x8c, 0x6b, 0xf8, 0xa5, 0x10, 0xd7, 0x33, 0x56, 0x5c, 0x83, 0x3e, 0xe3, 0x29, 0x37, 0x0c, 0xd1, + 0x67, 0x28, 0xd6, 0xf6, 0x19, 0xd7, 0x61, 0x95, 0x2e, 0x9f, 0x17, 0x29, 0xe8, 0x33, 0x9e, 0x0d, + 0x8d, 0x10, 0x7d, 0x86, 0x40, 0x6d, 0x74, 0x72, 0xbd, 0x8d, 0x38, 0x5c, 0xf3, 0x7b, 0xea, 0x23, + 0x4e, 0xad, 0xf9, 0x11, 0x0c, 0x76, 0xa1, 0x83, 0x82, 0xe5, 0x57, 0x78, 0x17, 0x52, 0xa2, 0x70, + 0x17, 0x6a, 0x10, 0xd8, 0xde, 0x23, 0xce, 0x8a, 0xf8, 0x0a, 0x6f, 0xef, 0x5a, 0x16, 0x6e, 0x6f, + 0xc3, 0xc0, 0xf6, 0xae, 0x05, 0x6f, 0x13, 0x79, 0x75, 0xcc, 0x25, 0xc3, 0xdb, 0xdb, 0x67, 0xc2, + 0xed, 0xdd, 0x62, 0x6d, 0x3e, 0xee, 0x3a, 0x1c, 0xcd, 0x2f, 0xca, 0xb8, 0x48, 0x2e, 0xf8, 0x20, + 0x60, 0xc5, 0x40, 0x44, 0x3e, 0x4e, 0xc2, 0xda, 0xe7, 0xcf, 0x57, 0xa2, 0xbb, 0x4d, 0xb3, 0x8b, + 0xb2, 0xd4, 0x73, 0x9f, 0xef, 0xfe, 0x05, 0xde, 0xbe, 0x04, 0x4e, 0xec, 0x89, 0xf7, 0x50, 0x73, + 0x72, 0x03, 0xbc, 0x48, 0xe7, 0x59, 0x69, 0x0a, 0xf5, 0x65, 0x1f, 0xeb, 0x8e, 0x02, 0x91, 0x1b, + 0xf4, 0x52, 0xb4, 0x69, 0x99, 0x6e, 0x9f, 0x46, 0x76, 0x38, 0x29, 0x41, 0x5a, 0xd6, 0x3c, 0x6f, + 0x87, 0x20, 0xd2, 0x32, 0x9c, 0x84, 0x5d, 0xe1, 0xa0, 0x10, 0xf3, 0xbc, 0xec, 0xe8, 0x0a, 0x00, + 0x0a, 0x77, 0x85, 0x36, 0xac, 0x7d, 0xbe, 0x8b, 0x7e, 0xd7, 0xed, 0x7e, 0xee, 0xc3, 0xde, 0xa2, + 0xfb, 0x14, 0xf6, 0x88, 0x87, 0x7d, 0x71, 0x9b, 0x51, 0x34, 0x9e, 0xe5, 0x1e, 0x97, 0x2c, 0x49, + 0xcb, 0xc1, 0x2a, 0x6e, 0xa3, 0x91, 0x13, 0x19, 0x05, 0xc6, 0xc1, 0xf8, 0xb6, 0x37, 0xcf, 0xd3, + 0x24, 0x6e, 0xbf, 0x91, 0xd0, 0xba, 0x46, 0x1c, 0x8e, 0x6f, 0x2e, 0x06, 0xe3, 0x75, 0x95, 0xfa, + 0xa9, 0xff, 0x8c, 0x97, 0x39, 0xc7, 0xe3, 0xb5, 0x87, 0x84, 0xe3, 0x35, 0x44, 0x61, 0x7d, 0x46, + 0x5c, 0x1e, 0xb1, 0xa5, 0x98, 0x13, 0xf1, 0xda, 0x88, 0xc3, 0xf5, 0x71, 0x31, 0xbb, 0x36, 0x30, + 0x1e, 0x0e, 0x33, 0xc9, 0x8b, 0x8c, 0xa5, 0xfb, 0x29, 0x9b, 0x96, 0x03, 0x22, 0xc6, 0xf8, 0x14, + 0xb1, 0x36, 0xa0, 0x69, 0xe4, 0x31, 0x1e, 0x96, 0xfb, 0x6c, 0x21, 0x8a, 0x44, 0xd2, 0x8f, 0xd1, + 0x22, 0x9d, 0x8f, 0xd1, 0x43, 0x51, 0x6f, 0x3b, 0x45, 0x7c, 0x95, 0x2c, 0xf8, 0x24, 0xe0, 0xad, + 0x41, 0x7a, 0x78, 0x73, 0x50, 0xa4, 0xd1, 0x46, 0x62, 0x5e, 0xc4, 0x9c, 0x6c, 0xb4, 0x5a, 0xdc, + 0xd9, 0x68, 0x06, 0xd3, 0x1e, 0xfe, 0x66, 0x25, 0xfa, 0xbd, 0x5a, 0xea, 0xbe, 0x26, 0xd8, 0x63, + 0xe5, 0xd5, 0x85, 0x60, 0xc5, 0x64, 0xf0, 0x19, 0x66, 0x07, 0x45, 0x8d, 0xeb, 0x67, 0xb7, 0x51, + 0x81, 0x8f, 0xb5, 0xca, 0xbb, 0xed, 0x88, 0x43, 0x1f, 0xab, 0x87, 0x84, 0x1f, 0x2b, 0x44, 0x61, + 0x00, 0x51, 0xf2, 0x7a, 0x4b, 0x6e, 0x95, 0xd4, 0xf7, 0xf7, 0xe5, 0xd6, 0x3a, 0x39, 0x18, 0x1f, + 0x2b, 0xa1, 0xdf, 0x5b, 0xb6, 0x28, 0x1b, 0x78, 0x8f, 0x19, 0xf6, 0xc5, 0x49, 0xcf, 0x66, 0x54, + 0x84, 0x3d, 0xb7, 0x46, 0xc6, 0xb0, 0x2f, 0x4e, 0x78, 0x76, 0xc2, 0x5a, 0xc8, 0x33, 0x12, 0xda, + 0x86, 0x7d, 0x71, 0x98, 0x7d, 0x69, 0xa6, 0x99, 0x17, 0x9e, 0x04, 0xec, 0xc0, 0xb9, 0x61, 0xa3, + 0x17, 0xab, 0x1d, 0xfe, 0xdd, 0x4a, 0xf4, 0x7d, 0xeb, 0xf1, 0x58, 0x4c, 0x92, 0xcb, 0x65, 0x0d, + 0xbd, 0x61, 0xe9, 0x9c, 0x97, 0x83, 0x67, 0x94, 0xb5, 0x36, 0x6b, 0x4a, 0xf0, 0xfc, 0x56, 0x3a, + 0x70, 0xec, 0xec, 0xe4, 0x79, 0xba, 0x1c, 0xf3, 0x59, 0x9e, 0x92, 0x63, 0xc7, 0x43, 0xc2, 0x63, + 0x07, 0xa2, 0x30, 0x2b, 0x1f, 0x8b, 0x2a, 0xe7, 0x47, 0xb3, 0x72, 0x25, 0x0a, 0x67, 0xe5, 0x0d, + 0x02, 0x73, 0xa5, 0xb1, 0xd8, 0x15, 0x69, 0xca, 0x63, 0xd9, 0x3e, 0x6a, 0x60, 0x34, 0x2d, 0x11, + 0xce, 0x95, 0x00, 0x69, 0x77, 0xe5, 0x9a, 0x35, 0x24, 0x2b, 0xf8, 0xcb, 0xe5, 0x51, 0x92, 0x5d, + 0x0f, 0xf0, 0xb4, 0xc0, 0x02, 0xc4, 0xae, 0x1c, 0x0a, 0xc2, 0xb5, 0xea, 0x79, 0x36, 0x11, 0xf8, + 0x5a, 0xb5, 0x92, 0x84, 0xd7, 0xaa, 0x9a, 0x80, 0x26, 0xcf, 0x38, 0x65, 0xb2, 0x92, 0x84, 0x4d, + 0x6a, 0x02, 0x0b, 0x85, 0xfa, 0xdd, 0x0d, 0x19, 0x0a, 0xc1, 0xdb, 0x9a, 0xb5, 0x4e, 0x0e, 0xf6, + 0xd0, 0x66, 0xd1, 0xba, 0xcf, 0x65, 0x7c, 0x85, 0xf7, 0x50, 0x0f, 0x09, 0xf7, 0x50, 0x88, 0xc2, + 0x2a, 0x8d, 0x85, 0x59, 0x74, 0xaf, 0xe2, 0xfd, 0xa3, 0xb5, 0xe0, 0x5e, 0xeb, 0xe4, 0xe0, 0x32, + 0xf2, 0x70, 0xa6, 0x9e, 0x19, 0xda, 0xc9, 0x6b, 0x59, 0x78, 0x19, 0x69, 0x18, 0x58, 0xfa, 0x5a, + 0xa0, 0xf6, 0xb2, 0x56, 0x69, 0x45, 0x6f, 0x37, 0x6b, 0xad, 0x93, 0xd3, 0x4e, 0xfe, 0xcd, 0x2c, + 0xe3, 0x6a, 0xe9, 0x89, 0xa8, 0xc6, 0xc8, 0x1b, 0x96, 0x26, 0x13, 0x26, 0xf9, 0x58, 0x5c, 0xf3, + 0x0c, 0x5f, 0x31, 0xe9, 0xd2, 0xd6, 0xfc, 0xd0, 0x53, 0x08, 0xaf, 0x98, 0xc2, 0x8a, 0xb0, 0x9f, + 0xd4, 0xf4, 0x79, 0xc9, 0x77, 0x59, 0x49, 0x44, 0x32, 0x0f, 0x09, 0xf7, 0x13, 0x88, 0xc2, 0x7c, + 0xb5, 0x96, 0xbf, 0x7a, 0x97, 0xf3, 0x22, 0xe1, 0x59, 0xcc, 0xf1, 0x7c, 0x15, 0x52, 0xe1, 0x7c, + 0x15, 0xa1, 0xe1, 0x5a, 0x6d, 0x8f, 0x49, 0xfe, 0x72, 0x39, 0x4e, 0x66, 0xbc, 0x94, 0x6c, 0x96, + 0xe3, 0x6b, 0x35, 0x00, 0x85, 0xd7, 0x6a, 0x6d, 0xb8, 0xb5, 0x35, 0x64, 0x02, 0x62, 0xfb, 0x84, + 0x12, 0x24, 0x02, 0x27, 0x94, 0x08, 0x14, 0x3e, 0x58, 0x0b, 0xa0, 0x2f, 0x09, 0x5a, 0x56, 0x82, + 0x2f, 0x09, 0x68, 0xba, 0xb5, 0xe1, 0x66, 0x98, 0x51, 0x35, 0x34, 0x3b, 0x8a, 0x3e, 0x72, 0x87, + 0xe8, 0x46, 0x2f, 0x16, 0xdf, 0xe1, 0x3b, 0xe3, 0x29, 0x53, 0xd3, 0x56, 0x60, 0x1b, 0xad, 0x61, + 0xfa, 0xec, 0xf0, 0x39, 0xac, 0x76, 0xf8, 0x57, 0x2b, 0xd1, 0x27, 0x98, 0xc7, 0xd7, 0xb9, 0xf2, + 0xfb, 0xb4, 0xdb, 0x56, 0x4d, 0x12, 0x47, 0xb0, 0xc2, 0x1a, 0xba, 0x0c, 0x7f, 0x16, 0x7d, 0xdc, + 0x88, 0xec, 0x09, 0x2d, 0x5d, 0x00, 0x3f, 0x69, 0x33, 0xe5, 0x87, 0x9c, 0x71, 0xbf, 0xdd, 0x9b, + 0xb7, 0xeb, 0x21, 0xbf, 0x5c, 0x25, 0x58, 0x0f, 0x19, 0x1b, 0x5a, 0x4c, 0xac, 0x87, 0x10, 0xcc, + 0x8e, 0x4e, 0xb7, 0x7a, 0x6f, 0x13, 0x79, 0xa5, 0xf2, 0x2d, 0x30, 0x3a, 0xbd, 0xb2, 0x1a, 0x88, + 0x18, 0x9d, 0x24, 0x0c, 0x33, 0x92, 0x06, 0xac, 0xc6, 0x26, 0x16, 0xcb, 0x8d, 0x21, 0x77, 0x64, + 0xae, 0x77, 0x83, 0xb0, 0xbf, 0x36, 0x62, 0xbd, 0xf4, 0x79, 0x12, 0xb2, 0x00, 0x96, 0x3f, 0x1b, + 0xbd, 0x58, 0xed, 0xf0, 0x2f, 0xa2, 0xef, 0xb5, 0x2a, 0xb6, 0xcf, 0x99, 0x9c, 0x17, 0x7c, 0x32, + 0xd8, 0xee, 0x28, 0x77, 0x03, 0x1a, 0xd7, 0x4f, 0xfb, 0x2b, 0xb4, 0x72, 0xf4, 0x86, 0xab, 0xbb, + 0x95, 0x29, 0xc3, 0xb3, 0x90, 0x49, 0x9f, 0x0d, 0xe6, 0xe8, 0xb4, 0x4e, 0x6b, 0x99, 0xed, 0xf6, + 0xae, 0x9d, 0x05, 0x4b, 0x52, 0xf5, 0xb2, 0xf6, 0xb3, 0x90, 0x51, 0x0f, 0x0d, 0x2e, 0xb3, 0x49, + 0x95, 0x56, 0x64, 0x56, 0x63, 0xdc, 0x59, 0x9e, 0x6d, 0xd2, 0x91, 0x00, 0x59, 0x9d, 0x6d, 0xf5, + 0xa4, 0xb5, 0x5b, 0xd9, 0x4c, 0x79, 0xd5, 0xcf, 0x6e, 0x27, 0xc7, 0xbc, 0x6a, 0x55, 0xa4, 0xa7, + 0x6f, 0xf5, 0xa4, 0xb5, 0xd7, 0x3f, 0x8f, 0x3e, 0x6e, 0x7b, 0xd5, 0x13, 0xd1, 0x76, 0xa7, 0x29, + 0x30, 0x17, 0x3d, 0xed, 0xaf, 0x60, 0x97, 0x34, 0x5f, 0x25, 0xa5, 0x14, 0xc5, 0x72, 0x74, 0x25, + 0x6e, 0x9a, 0x2f, 0x1f, 0xfc, 0xd1, 0xaa, 0x81, 0xa1, 0x43, 0x10, 0x4b, 0x1a, 0x9c, 0x6c, 0xb9, + 0xb2, 0x5f, 0x48, 0x94, 0x84, 0x2b, 0x87, 0xe8, 0x70, 0xe5, 0x93, 0x36, 0x56, 0x35, 0xb5, 0xb2, + 0x9f, 0x73, 0xac, 0xe1, 0x45, 0x6d, 0x7f, 0xd2, 0xb1, 0xde, 0x0d, 0xda, 0x8c, 0x45, 0x8b, 0xf7, + 0x92, 0xcb, 0x4b, 0x53, 0x27, 0xbc, 0xa4, 0x2e, 0x42, 0x64, 0x2c, 0x04, 0x6a, 0x93, 0xee, 0xfd, + 0x24, 0xe5, 0x6a, 0x47, 0xff, 0xf5, 0xe5, 0x65, 0x2a, 0xd8, 0x04, 0x24, 0xdd, 0x95, 0x78, 0xe8, + 0xca, 0x89, 0xa4, 0x1b, 0xe3, 0xec, 0x59, 0x81, 0x4a, 0x7a, 0xc6, 0x63, 0x91, 0xc5, 0x49, 0x0a, + 0x0f, 0x82, 0x2a, 0x4d, 0x23, 0x24, 0xce, 0x0a, 0xb4, 0x20, 0x3b, 0x31, 0x56, 0xa2, 0x6a, 0xd8, + 0x37, 0xe5, 0x7f, 0xd4, 0x56, 0x74, 0xc4, 0xc4, 0xc4, 0x88, 0x60, 0x76, 0xed, 0x59, 0x09, 0xcf, + 0x73, 0x65, 0xfc, 0x5e, 0x5b, 0xab, 0x96, 0x10, 0x6b, 0x4f, 0x9f, 0xb0, 0x6b, 0xa8, 0xea, 0xf7, + 0x3d, 0x71, 0x93, 0x29, 0xa3, 0x0f, 0xda, 0x2a, 0x8d, 0x8c, 0x58, 0x43, 0x41, 0x46, 0x1b, 0xfe, + 0x49, 0xf4, 0xff, 0x95, 0xe1, 0x42, 0xe4, 0x83, 0x3b, 0x88, 0x42, 0xe1, 0x9c, 0xd9, 0xbc, 0x4b, + 0xca, 0xed, 0xd1, 0x02, 0xd3, 0x37, 0xce, 0x4b, 0x36, 0xe5, 0x83, 0x87, 0x44, 0x8b, 0x2b, 0x29, + 0x71, 0xb4, 0xa0, 0x4d, 0xf9, 0xbd, 0xe2, 0x44, 0x4c, 0xb4, 0x75, 0xa4, 0x86, 0x46, 0x18, 0xea, + 0x15, 0x2e, 0x64, 0x93, 0x99, 0x13, 0xb6, 0x48, 0xa6, 0x66, 0xc2, 0xa9, 0xe3, 0x56, 0x09, 0x92, + 0x19, 0xcb, 0x0c, 0x1d, 0x88, 0x48, 0x66, 0x48, 0x58, 0xfb, 0xfc, 0xd7, 0x95, 0xe8, 0x9e, 0x65, + 0x0e, 0x9a, 0xdd, 0xba, 0xc3, 0xec, 0x52, 0x54, 0xa9, 0xcf, 0x51, 0x92, 0x5d, 0x97, 0x83, 0x2f, + 0x28, 0x93, 0x38, 0x6f, 0x8a, 0xf2, 0xe5, 0xad, 0xf5, 0x6c, 0xd6, 0xda, 0x6c, 0x65, 0xd9, 0xf7, + 0xd9, 0xb5, 0x06, 0xc8, 0x5a, 0xcd, 0x8e, 0x17, 0xe4, 0x88, 0xac, 0x35, 0xc4, 0xdb, 0x26, 0x36, + 0xce, 0x53, 0x91, 0xc1, 0x26, 0xb6, 0x16, 0x2a, 0x21, 0xd1, 0xc4, 0x2d, 0xc8, 0xc6, 0xe3, 0x46, + 0x54, 0xef, 0xba, 0xec, 0xa4, 0x29, 0x88, 0xc7, 0x46, 0xd5, 0x00, 0x44, 0x3c, 0x46, 0x41, 0xed, + 0xe7, 0x2c, 0xfa, 0x4e, 0xf5, 0x48, 0x4f, 0x0b, 0xbe, 0x48, 0x38, 0x3c, 0x7a, 0xe1, 0x48, 0x88, + 0xf1, 0xef, 0x13, 0x76, 0x64, 0x9d, 0x67, 0x65, 0x9e, 0xb2, 0xf2, 0x4a, 0xbf, 0x8c, 0xf7, 0xeb, + 0xdc, 0x08, 0xe1, 0xeb, 0xf8, 0x47, 0x1d, 0x94, 0x0d, 0xea, 0x8d, 0xcc, 0x84, 0x98, 0x55, 0x5c, + 0xb5, 0x15, 0x66, 0xd6, 0x3a, 0x39, 0xbb, 0xe3, 0x7d, 0xc0, 0xd2, 0x94, 0x17, 0xcb, 0x46, 0x76, + 0xcc, 0xb2, 0xe4, 0x92, 0x97, 0x12, 0xec, 0x78, 0x6b, 0x6a, 0x08, 0x31, 0x62, 0xc7, 0x3b, 0x80, + 0xdb, 0x6c, 0x1e, 0x78, 0x3e, 0xcc, 0x26, 0xfc, 0x1d, 0xc8, 0xe6, 0xa1, 0x1d, 0xc5, 0x10, 0xd9, + 0x3c, 0xc5, 0xda, 0x9d, 0xdf, 0x97, 0xa9, 0x88, 0xaf, 0xf5, 0x14, 0xe0, 0x37, 0xb0, 0x92, 0xc0, + 0x39, 0xe0, 0x41, 0x08, 0xb1, 0x93, 0x80, 0x12, 0x9c, 0xf1, 0x3c, 0x65, 0x31, 0x3c, 0x7f, 0x53, + 0xeb, 0x68, 0x19, 0x31, 0x09, 0x40, 0x06, 0x14, 0x57, 0x9f, 0xeb, 0xc1, 0x8a, 0x0b, 0x8e, 0xf5, + 0x3c, 0x08, 0x21, 0x76, 0x1a, 0x54, 0x82, 0x51, 0x9e, 0x26, 0x12, 0x0c, 0x83, 0x5a, 0x43, 0x49, + 0x88, 0x61, 0xe0, 0x13, 0xc0, 0xe4, 0x31, 0x2f, 0xa6, 0x1c, 0x35, 0xa9, 0x24, 0x41, 0x93, 0x0d, + 0x61, 0x0f, 0x1b, 0xd7, 0x75, 0x17, 0xf9, 0x12, 0x1c, 0x36, 0xd6, 0xd5, 0x12, 0xf9, 0x92, 0x38, + 0x6c, 0xec, 0x01, 0xa0, 0x88, 0xa7, 0xac, 0x94, 0x78, 0x11, 0x95, 0x24, 0x58, 0xc4, 0x86, 0xb0, + 0x73, 0x74, 0x5d, 0xc4, 0xb9, 0x04, 0x73, 0xb4, 0x2e, 0x80, 0xf3, 0x06, 0xfa, 0x2e, 0x29, 0xb7, + 0x91, 0xa4, 0x6e, 0x15, 0x2e, 0xf7, 0x13, 0x9e, 0x4e, 0x4a, 0x10, 0x49, 0xf4, 0x73, 0x6f, 0xa4, + 0x44, 0x24, 0x69, 0x53, 0xa0, 0x2b, 0xe9, 0xfd, 0x71, 0xac, 0x76, 0x60, 0x6b, 0xfc, 0x41, 0x08, + 0xb1, 0xf1, 0xa9, 0x29, 0xf4, 0x2e, 0x2b, 0x8a, 0xa4, 0x9a, 0xfc, 0x57, 0xf1, 0x02, 0x35, 0x72, + 0x22, 0x3e, 0x61, 0x1c, 0x18, 0x5e, 0x4d, 0xe0, 0xc6, 0x0a, 0x06, 0x43, 0xf7, 0xa7, 0x41, 0xc6, + 0x66, 0x9c, 0x4a, 0xe2, 0xbc, 0x42, 0xc5, 0x9e, 0x26, 0xf2, 0x06, 0x75, 0xb5, 0x0b, 0x73, 0x3e, + 0x06, 0x32, 0x2e, 0x8e, 0xc5, 0x82, 0x8f, 0xc5, 0xab, 0x77, 0x49, 0x29, 0x93, 0x6c, 0xaa, 0x67, + 0xee, 0xe7, 0x84, 0x25, 0x0c, 0x26, 0x3e, 0x06, 0xea, 0x54, 0xb2, 0x09, 0x04, 0x28, 0xcb, 0x09, + 0xbf, 0x41, 0x13, 0x08, 0x68, 0xd1, 0x70, 0x44, 0x02, 0x11, 0xe2, 0xed, 0x3e, 0x8a, 0x71, 0xae, + 0xbf, 0x98, 0x1e, 0x8b, 0x26, 0x97, 0xa3, 0xac, 0x41, 0x90, 0x58, 0xca, 0x06, 0x15, 0xec, 0xfa, + 0xd2, 0xf8, 0xb7, 0x43, 0x6c, 0x9d, 0xb0, 0xd3, 0x1e, 0x66, 0x8f, 0x7b, 0x90, 0x88, 0x2b, 0x7b, + 0x0e, 0x80, 0x72, 0xd5, 0x3e, 0x06, 0xf0, 0xb8, 0x07, 0xe9, 0xec, 0xc9, 0xb8, 0xd5, 0x7a, 0xc9, + 0xe2, 0xeb, 0x69, 0x21, 0xe6, 0xd9, 0x64, 0x57, 0xa4, 0xa2, 0x00, 0x7b, 0x32, 0x5e, 0xa9, 0x01, + 0x4a, 0xec, 0xc9, 0x74, 0xa8, 0xd8, 0x0c, 0xce, 0x2d, 0xc5, 0x4e, 0x9a, 0x4c, 0xe1, 0x8a, 0xda, + 0x33, 0xa4, 0x00, 0x22, 0x83, 0x43, 0x41, 0xa4, 0x13, 0xd5, 0x2b, 0x6e, 0x99, 0xc4, 0x2c, 0xad, + 0xfd, 0x6d, 0xd3, 0x66, 0x3c, 0xb0, 0xb3, 0x13, 0x21, 0x0a, 0x48, 0x3d, 0xc7, 0xf3, 0x22, 0x3b, + 0xcc, 0xa4, 0x20, 0xeb, 0xd9, 0x00, 0x9d, 0xf5, 0x74, 0x40, 0x10, 0x56, 0xc7, 0xfc, 0x5d, 0x55, + 0x9a, 0xea, 0x1f, 0x2c, 0xac, 0x56, 0xbf, 0x0f, 0xb5, 0x3c, 0x14, 0x56, 0x01, 0x07, 0x2a, 0xa3, + 0x9d, 0xd4, 0x1d, 0x26, 0xa0, 0xed, 0x77, 0x93, 0xf5, 0x6e, 0x10, 0xf7, 0x33, 0x92, 0xcb, 0x94, + 0x87, 0xfc, 0x28, 0xa0, 0x8f, 0x9f, 0x06, 0xb4, 0xdb, 0x2d, 0x5e, 0x7d, 0xae, 0x78, 0x7c, 0xdd, + 0x3a, 0xd6, 0xe4, 0x17, 0xb4, 0x46, 0x88, 0xed, 0x16, 0x02, 0xc5, 0x9b, 0xe8, 0x30, 0x16, 0x59, + 0xa8, 0x89, 0x2a, 0x79, 0x9f, 0x26, 0xd2, 0x9c, 0x5d, 0xfc, 0x1a, 0xa9, 0xee, 0x99, 0x75, 0x33, + 0x6d, 0x10, 0x16, 0x5c, 0x88, 0x58, 0xfc, 0x92, 0xb0, 0xcd, 0xc9, 0xa1, 0xcf, 0xe3, 0xf6, 0x99, + 0xef, 0x96, 0x95, 0x63, 0xfa, 0xcc, 0x37, 0xc5, 0xd2, 0x95, 0xac, 0xfb, 0x48, 0x87, 0x15, 0xbf, + 0x9f, 0x6c, 0xf6, 0x83, 0xed, 0x92, 0xc7, 0xf3, 0xb9, 0x9b, 0x72, 0x56, 0xd4, 0x5e, 0xb7, 0x02, + 0x86, 0x2c, 0x46, 0x2c, 0x79, 0x02, 0x38, 0x08, 0x61, 0x9e, 0xe7, 0x5d, 0x91, 0x49, 0x9e, 0x49, + 0x2c, 0x84, 0xf9, 0xc6, 0x34, 0x18, 0x0a, 0x61, 0x94, 0x02, 0xe8, 0xb7, 0x6a, 0x3f, 0x88, 0xcb, + 0x13, 0x36, 0x43, 0x33, 0xb6, 0x7a, 0xaf, 0xa7, 0x96, 0x87, 0xfa, 0x2d, 0xe0, 0x9c, 0x97, 0x7c, + 0xae, 0x97, 0x31, 0x2b, 0xa6, 0x66, 0x77, 0x63, 0x32, 0x78, 0x4a, 0xdb, 0xf1, 0x49, 0xe2, 0x25, + 0x5f, 0x58, 0x03, 0x84, 0x9d, 0xc3, 0x19, 0x9b, 0x9a, 0x9a, 0x22, 0x35, 0x50, 0xf2, 0x56, 0x55, + 0xd7, 0xbb, 0x41, 0xe0, 0xe7, 0x4d, 0x32, 0xe1, 0x22, 0xe0, 0x47, 0xc9, 0xfb, 0xf8, 0x81, 0x20, + 0xc8, 0xde, 0xaa, 0x7a, 0xd7, 0x2b, 0xba, 0x9d, 0x6c, 0xa2, 0xd7, 0xb1, 0x43, 0xe2, 0xf1, 0x00, + 0x2e, 0x94, 0xbd, 0x11, 0x3c, 0x18, 0xa3, 0xcd, 0x06, 0x6d, 0x68, 0x8c, 0x9a, 0xfd, 0xd7, 0x3e, + 0x63, 0x14, 0x83, 0xb5, 0xcf, 0x9f, 0xe9, 0x31, 0xba, 0xc7, 0x24, 0xab, 0xf2, 0xf6, 0x37, 0x09, + 0xbf, 0xd1, 0x0b, 0x61, 0xa4, 0xbe, 0x0d, 0x35, 0x54, 0x9f, 0xac, 0x82, 0x55, 0xf1, 0x76, 0x6f, + 0x3e, 0xe0, 0x5b, 0xaf, 0x10, 0x3a, 0x7d, 0x83, 0xa5, 0xc2, 0x76, 0x6f, 0x3e, 0xe0, 0x5b, 0x7f, + 0x0b, 0xdf, 0xe9, 0x1b, 0x7c, 0x10, 0xbf, 0xdd, 0x9b, 0xd7, 0xbe, 0xff, 0xba, 0x19, 0xb8, 0xae, + 0xf3, 0x2a, 0x0f, 0x8b, 0x65, 0xb2, 0xe0, 0x58, 0x3a, 0xe9, 0xdb, 0x33, 0x68, 0x28, 0x9d, 0xa4, + 0x55, 0x9c, 0x0b, 0x94, 0xb0, 0x52, 0x9c, 0x8a, 0x32, 0x51, 0x2f, 0xe9, 0x9f, 0xf7, 0x30, 0xda, + 0xc0, 0xa1, 0x45, 0x53, 0x48, 0xc9, 0xbe, 0x6e, 0xf4, 0x50, 0x7b, 0x8a, 0x79, 0x33, 0x60, 0xaf, + 0x7d, 0x98, 0x79, 0xab, 0x27, 0x6d, 0x5f, 0xfc, 0x79, 0x8c, 0xfb, 0xc6, 0x31, 0xd4, 0xaa, 0xe8, + 0x4b, 0xc7, 0xa7, 0xfd, 0x15, 0xb4, 0xfb, 0xbf, 0x6d, 0xd6, 0x15, 0xd0, 0xbf, 0x1e, 0x04, 0xcf, + 0xfa, 0x58, 0x04, 0x03, 0xe1, 0xf9, 0xad, 0x74, 0x74, 0x41, 0xfe, 0xb1, 0x59, 0x40, 0x37, 0xa8, + 0xfa, 0x96, 0x43, 0x7d, 0x03, 0xaa, 0xc7, 0x44, 0xa8, 0x59, 0x2d, 0x0c, 0x47, 0xc6, 0x8b, 0x5b, + 0x6a, 0x39, 0xd7, 0x69, 0x79, 0xb0, 0xfe, 0xe6, 0xd0, 0x29, 0x4f, 0xc8, 0xb2, 0x43, 0xc3, 0x02, + 0x7d, 0x71, 0x5b, 0x35, 0x6a, 0xac, 0x38, 0xb0, 0xba, 0x9d, 0xe3, 0x79, 0x4f, 0xc3, 0xde, 0x7d, + 0x1d, 0x9f, 0xdf, 0x4e, 0x49, 0x97, 0xe5, 0xbf, 0x56, 0xa2, 0x47, 0x1e, 0x6b, 0xdf, 0x27, 0x80, + 0x5d, 0x8f, 0x1f, 0x07, 0xec, 0x53, 0x4a, 0xa6, 0x70, 0xbf, 0xff, 0xab, 0x29, 0xdb, 0xbb, 0xa7, + 0x3c, 0x95, 0xfd, 0x24, 0x95, 0xbc, 0x68, 0xdf, 0x3d, 0xe5, 0xdb, 0xad, 0xa9, 0x21, 0x7d, 0xf7, + 0x54, 0x00, 0x77, 0xee, 0x9e, 0x42, 0x3c, 0xa3, 0x77, 0x4f, 0xa1, 0xd6, 0x82, 0x77, 0x4f, 0x85, + 0x35, 0xa8, 0xf0, 0xde, 0x14, 0xa1, 0xde, 0xb7, 0xee, 0x65, 0xd1, 0xdf, 0xc6, 0x7e, 0x76, 0x1b, + 0x15, 0x62, 0x82, 0xab, 0x39, 0x75, 0xce, 0xad, 0xc7, 0x33, 0xf5, 0xce, 0xba, 0x6d, 0xf7, 0xe6, + 0xb5, 0xef, 0x9f, 0xea, 0xd5, 0x8d, 0x09, 0xe7, 0xa2, 0x50, 0xf7, 0x8e, 0x6d, 0x84, 0xc2, 0x73, + 0x65, 0xc1, 0x6d, 0xf9, 0xcd, 0x7e, 0x30, 0x51, 0xdd, 0x8a, 0xd0, 0x8d, 0x3e, 0xec, 0x32, 0x04, + 0x9a, 0x7c, 0xbb, 0x37, 0x4f, 0x4c, 0x23, 0xb5, 0xef, 0xba, 0xb5, 0x7b, 0x18, 0xf3, 0xdb, 0xfa, + 0x69, 0x7f, 0x05, 0xed, 0x7e, 0xa1, 0xd3, 0x46, 0xd7, 0xbd, 0x6a, 0xe7, 0xad, 0x2e, 0x53, 0x23, + 0xaf, 0x99, 0x87, 0x7d, 0xf1, 0x50, 0x02, 0xe1, 0x4e, 0xa1, 0x5d, 0x09, 0x04, 0x3a, 0x8d, 0x7e, + 0x7e, 0x3b, 0x25, 0x5d, 0x96, 0x7f, 0x59, 0x89, 0xee, 0x92, 0x65, 0xd1, 0xfd, 0xe0, 0x8b, 0xbe, + 0x96, 0x41, 0x7f, 0xf8, 0xf2, 0xd6, 0x7a, 0xba, 0x50, 0xff, 0xbe, 0x12, 0xdd, 0x0b, 0x14, 0xaa, + 0xee, 0x20, 0xb7, 0xb0, 0xee, 0x77, 0x94, 0x1f, 0xde, 0x5e, 0x91, 0x9a, 0xee, 0x5d, 0x7c, 0xd4, + 0xbe, 0x94, 0x29, 0x60, 0x7b, 0x44, 0x5f, 0xca, 0xd4, 0xad, 0x05, 0x37, 0x79, 0xd8, 0x45, 0xb3, + 0xe8, 0x42, 0x37, 0x79, 0xd4, 0x09, 0xb5, 0xe0, 0xe5, 0x12, 0x18, 0x87, 0x39, 0x79, 0xf5, 0x2e, + 0x67, 0xd9, 0x84, 0x76, 0x52, 0xcb, 0xbb, 0x9d, 0x18, 0x0e, 0x6e, 0x8e, 0x55, 0xd2, 0x33, 0xd1, + 0x2c, 0xa4, 0x1e, 0x53, 0xfa, 0x06, 0x09, 0x6e, 0x8e, 0xb5, 0x50, 0xc2, 0x9b, 0xce, 0x1a, 0x43, + 0xde, 0x40, 0xb2, 0xf8, 0xa4, 0x0f, 0x0a, 0x52, 0x74, 0xe3, 0xcd, 0xec, 0xb9, 0x6f, 0x86, 0xac, + 0xb4, 0xf6, 0xdd, 0xb7, 0x7a, 0xd2, 0x84, 0xdb, 0x11, 0x97, 0x5f, 0x71, 0x36, 0xe1, 0x45, 0xd0, + 0xad, 0xa1, 0x7a, 0xb9, 0x75, 0x69, 0xcc, 0xed, 0xae, 0x48, 0xe7, 0xb3, 0x4c, 0x37, 0x26, 0xe9, + 0xd6, 0xa5, 0xba, 0xdd, 0x02, 0x1a, 0x6e, 0x0b, 0x5a, 0xb7, 0x2a, 0xbd, 0x7c, 0x12, 0x36, 0xe3, + 0x65, 0x95, 0x1b, 0xbd, 0x58, 0xba, 0x9e, 0xba, 0x1b, 0x75, 0xd4, 0x13, 0xf4, 0xa4, 0xad, 0x9e, + 0x34, 0xdc, 0x9f, 0x73, 0xdc, 0x9a, 0xfe, 0xb4, 0xdd, 0x61, 0xab, 0xd5, 0xa5, 0x9e, 0xf6, 0x57, + 0x80, 0xbb, 0xa1, 0xba, 0x57, 0x1d, 0x25, 0xa5, 0xdc, 0x4f, 0xd2, 0x74, 0xb0, 0x11, 0xe8, 0x26, + 0x0d, 0x14, 0xdc, 0x0d, 0x45, 0x60, 0xa2, 0x27, 0x37, 0xbb, 0x87, 0xd9, 0xa0, 0xcb, 0x8e, 0xa2, + 0x7a, 0xf5, 0x64, 0x97, 0x06, 0x3b, 0x5a, 0xce, 0xa3, 0x36, 0xb5, 0x1d, 0x86, 0x1f, 0x5c, 0xab, + 0xc2, 0xdb, 0xbd, 0x79, 0xf0, 0xba, 0x5d, 0x51, 0x6a, 0x66, 0x79, 0x48, 0x99, 0xf0, 0x66, 0x92, + 0x47, 0x1d, 0x14, 0xd8, 0x15, 0xac, 0x87, 0xd1, 0xdb, 0x64, 0x32, 0xe5, 0x12, 0x7d, 0x53, 0xe4, + 0x02, 0xc1, 0x37, 0x45, 0x00, 0x04, 0x4d, 0x57, 0xff, 0x6e, 0xb6, 0x43, 0x0f, 0x27, 0x58, 0xd3, + 0x69, 0x65, 0x87, 0x0a, 0x35, 0x1d, 0x4a, 0x83, 0x68, 0x60, 0xdc, 0xea, 0xcf, 0xf1, 0x9f, 0x84, + 0xcc, 0x80, 0x6f, 0xf2, 0x37, 0x7a, 0xb1, 0x60, 0x46, 0xb1, 0x0e, 0x93, 0x59, 0x22, 0xb1, 0x19, + 0xc5, 0xb1, 0x51, 0x21, 0xa1, 0x19, 0xa5, 0x8d, 0x52, 0xd5, 0xab, 0x72, 0x84, 0xc3, 0x49, 0xb8, + 0x7a, 0x35, 0xd3, 0xaf, 0x7a, 0x86, 0x6d, 0xbd, 0xd8, 0xcc, 0x4c, 0x97, 0x91, 0x57, 0x7a, 0xb1, + 0x8c, 0xf4, 0x6d, 0xf5, 0x99, 0x26, 0x04, 0x43, 0x51, 0x87, 0x52, 0x80, 0x1b, 0xf6, 0x15, 0xd7, + 0xbc, 0x7b, 0xcd, 0x73, 0xce, 0x0a, 0x96, 0xc5, 0xe8, 0xe2, 0x54, 0x19, 0x6c, 0x91, 0xa1, 0xc5, + 0x29, 0xa9, 0x01, 0x5e, 0x9b, 0xfb, 0x1f, 0x58, 0x22, 0x43, 0xc1, 0x7c, 0xc9, 0xe8, 0x7f, 0x5f, + 0xf9, 0xb8, 0x07, 0x09, 0x5f, 0x9b, 0x37, 0x80, 0xd9, 0xf8, 0xae, 0x9d, 0x7e, 0x16, 0x30, 0xe5, + 0xa3, 0xa1, 0x85, 0x30, 0xad, 0x02, 0x3a, 0xb5, 0x49, 0x70, 0xb9, 0xfc, 0x09, 0x5f, 0x62, 0x9d, + 0xda, 0xe6, 0xa7, 0x0a, 0x09, 0x75, 0xea, 0x36, 0x0a, 0xf2, 0x4c, 0x77, 0x1d, 0xb4, 0x1a, 0xd0, + 0x77, 0x97, 0x3e, 0x6b, 0x9d, 0x1c, 0x18, 0x39, 0x7b, 0xc9, 0xc2, 0x7b, 0x4f, 0x80, 0x14, 0x74, + 0x2f, 0x59, 0xe0, 0xaf, 0x09, 0x36, 0x7a, 0xb1, 0xf0, 0x95, 0x3c, 0x93, 0xfc, 0x5d, 0xf3, 0xae, + 0x1c, 0x29, 0xae, 0x92, 0xb7, 0x5e, 0x96, 0xaf, 0x77, 0x83, 0xf6, 0x00, 0xec, 0x69, 0x21, 0x62, + 0x5e, 0x96, 0xfa, 0xa6, 0x4a, 0xff, 0x84, 0x91, 0x96, 0x0d, 0xc1, 0x3d, 0x95, 0x0f, 0xc3, 0x90, + 0x73, 0xbd, 0x5c, 0x2d, 0xb2, 0xb7, 0xde, 0xac, 0xa2, 0x9a, 0xed, 0x0b, 0x6f, 0xd6, 0x3a, 0x39, + 0x3b, 0xbc, 0xb4, 0xd4, 0xbd, 0xe6, 0x66, 0x1d, 0x55, 0xc7, 0x6e, 0xb8, 0x79, 0xdc, 0x83, 0xd4, + 0xae, 0xbe, 0x8a, 0xde, 0x3f, 0x12, 0xd3, 0x11, 0xcf, 0x26, 0x83, 0x1f, 0xf8, 0x47, 0x68, 0xc5, + 0x74, 0x58, 0xfd, 0x6c, 0x8c, 0xde, 0xa1, 0xc4, 0xf6, 0x10, 0xe0, 0x1e, 0xbf, 0x98, 0x4f, 0x47, + 0x92, 0x49, 0x70, 0x08, 0x50, 0xfd, 0x3e, 0xac, 0x04, 0xc4, 0x21, 0x40, 0x0f, 0x00, 0xf6, 0xc6, + 0x05, 0xe7, 0xa8, 0xbd, 0x4a, 0x10, 0xb4, 0xa7, 0x01, 0x9b, 0x45, 0x18, 0x7b, 0x55, 0xa2, 0x0e, + 0x0f, 0xed, 0x59, 0x1d, 0x25, 0x25, 0xb2, 0x88, 0x36, 0x65, 0x3b, 0x77, 0x5d, 0x7d, 0x75, 0xeb, + 0xc8, 0x7c, 0x36, 0x63, 0xc5, 0x12, 0x74, 0x6e, 0x5d, 0x4b, 0x07, 0x20, 0x3a, 0x37, 0x0a, 0xda, + 0x51, 0xdb, 0x3c, 0xe6, 0xf8, 0xfa, 0x40, 0x14, 0x62, 0x2e, 0x93, 0x8c, 0xc3, 0x9b, 0x27, 0xcc, + 0x03, 0x75, 0x19, 0x62, 0xd4, 0x52, 0xac, 0xcd, 0x72, 0x15, 0x51, 0x9f, 0x27, 0x54, 0xf7, 0x57, + 0x97, 0x52, 0x14, 0xf0, 0x7d, 0x62, 0x6d, 0x05, 0x42, 0x44, 0x96, 0x4b, 0xc2, 0xa0, 0xed, 0x4f, + 0x93, 0x6c, 0x8a, 0xb6, 0xfd, 0xa9, 0x7b, 0xfb, 0xeb, 0x3d, 0x1a, 0xb0, 0x03, 0xaa, 0x7e, 0x68, + 0xf5, 0x00, 0xd0, 0xdf, 0x72, 0xa2, 0x0f, 0xdd, 0x25, 0x88, 0x01, 0x85, 0x93, 0xc0, 0xd5, 0xeb, + 0x9c, 0x67, 0x7c, 0xd2, 0x9c, 0x9a, 0xc3, 0x5c, 0x79, 0x44, 0xd0, 0x15, 0x24, 0x6d, 0x2c, 0x52, + 0xf2, 0xb3, 0x79, 0x76, 0x5a, 0x88, 0xcb, 0x24, 0xe5, 0x05, 0x88, 0x45, 0xb5, 0xba, 0x23, 0x27, + 0x62, 0x11, 0xc6, 0xd9, 0xe3, 0x17, 0x4a, 0xea, 0x5d, 0xc2, 0x3e, 0x2e, 0x58, 0x0c, 0x8f, 0x5f, + 0xd4, 0x36, 0xda, 0x18, 0xb1, 0x33, 0x18, 0xc0, 0x9d, 0x44, 0xa7, 0x76, 0x9d, 0x2d, 0x55, 0xff, + 0xd0, 0xdf, 0x12, 0xaa, 0x3b, 0x51, 0x4b, 0x90, 0xe8, 0x68, 0x73, 0x18, 0x49, 0x24, 0x3a, 0x61, + 0x0d, 0x3b, 0x95, 0x28, 0xee, 0x44, 0x1f, 0x2b, 0x02, 0x53, 0x49, 0x6d, 0xa3, 0x11, 0x12, 0x53, + 0x49, 0x0b, 0x02, 0x01, 0xa9, 0x19, 0x06, 0x53, 0x34, 0x20, 0x19, 0x69, 0x30, 0x20, 0xb9, 0x94, + 0x0d, 0x14, 0x87, 0x59, 0x22, 0x13, 0x96, 0x8e, 0xb8, 0x3c, 0x65, 0x05, 0x9b, 0x71, 0xc9, 0x0b, + 0x18, 0x28, 0x34, 0x32, 0xf4, 0x18, 0x22, 0x50, 0x50, 0xac, 0x76, 0xf8, 0x07, 0xd1, 0x87, 0xd5, + 0xbc, 0xcf, 0x33, 0xfd, 0xe7, 0x56, 0x5e, 0xa9, 0xbf, 0xd3, 0x34, 0xf8, 0xc8, 0xd8, 0x18, 0xc9, + 0x82, 0xb3, 0x59, 0x63, 0xfb, 0x03, 0xf3, 0xbb, 0x02, 0x9f, 0xae, 0x54, 0xfd, 0xf9, 0x44, 0xc8, + 0xe4, 0xb2, 0x5a, 0x66, 0xeb, 0x2f, 0x88, 0x40, 0x7f, 0x76, 0xc5, 0xc3, 0xc0, 0x5d, 0x14, 0x18, + 0x67, 0xe3, 0xb4, 0x2b, 0x3d, 0xe3, 0x79, 0x0a, 0xe3, 0xb4, 0xa7, 0xad, 0x00, 0x22, 0x4e, 0xa3, + 0xa0, 0x1d, 0x9c, 0xae, 0x78, 0xcc, 0xc3, 0x95, 0x19, 0xf3, 0x7e, 0x95, 0x19, 0x7b, 0x1f, 0x65, + 0xa4, 0xd1, 0x87, 0xc7, 0x7c, 0x76, 0xc1, 0x8b, 0xf2, 0x2a, 0xc9, 0xa9, 0x7b, 0x5b, 0x2d, 0xd1, + 0x79, 0x6f, 0x2b, 0x81, 0xda, 0x99, 0xc0, 0x02, 0x87, 0xe5, 0x09, 0x9b, 0x71, 0x75, 0xb3, 0x06, + 0x98, 0x09, 0x1c, 0x23, 0x0e, 0x44, 0xcc, 0x04, 0x24, 0xec, 0x7c, 0xdf, 0x65, 0x99, 0x33, 0x3e, + 0xad, 0x7a, 0x58, 0x71, 0xca, 0x96, 0x33, 0x9e, 0x49, 0x6d, 0x12, 0xec, 0xc9, 0x3b, 0x26, 0x71, + 0x9e, 0xd8, 0x93, 0xef, 0xa3, 0xe7, 0x84, 0x26, 0xef, 0xc1, 0x9f, 0x8a, 0x42, 0xd6, 0x7f, 0x4c, + 0xe9, 0xbc, 0x48, 0x41, 0x68, 0xf2, 0x1f, 0xaa, 0x47, 0x12, 0xa1, 0x29, 0xac, 0xe1, 0xfc, 0x15, + 0x02, 0xaf, 0x0c, 0x6f, 0x78, 0x61, 0xfa, 0xc9, 0xab, 0x19, 0x4b, 0x52, 0xdd, 0x1b, 0x7e, 0x14, + 0xb0, 0x4d, 0xe8, 0x10, 0x7f, 0x85, 0xa0, 0xaf, 0xae, 0xf3, 0x77, 0x1b, 0xc2, 0x25, 0x04, 0xaf, + 0x08, 0x3a, 0xec, 0x13, 0xaf, 0x08, 0xba, 0xb5, 0xec, 0xca, 0xdd, 0xb2, 0x8a, 0x5b, 0x2a, 0x62, + 0x57, 0x4c, 0xe0, 0x7e, 0xa1, 0x63, 0x13, 0x80, 0xc4, 0xca, 0x3d, 0xa8, 0x60, 0x53, 0x03, 0x8b, + 0xed, 0x27, 0x19, 0x4b, 0x93, 0x9f, 0xc1, 0xb4, 0xde, 0xb1, 0xd3, 0x10, 0x44, 0x6a, 0x80, 0x93, + 0x98, 0xab, 0x03, 0x2e, 0xc7, 0x49, 0x15, 0xfa, 0xd7, 0x03, 0xcf, 0x4d, 0x11, 0xdd, 0xae, 0x1c, + 0xd2, 0xb9, 0xa3, 0x15, 0x3e, 0xd6, 0x9d, 0x3c, 0x1f, 0x55, 0xb3, 0xea, 0x19, 0x8f, 0x79, 0x92, + 0xcb, 0xc1, 0x8b, 0xf0, 0xb3, 0x02, 0x38, 0x71, 0xd0, 0xa2, 0x87, 0x9a, 0xf3, 0xfa, 0xbe, 0x8a, + 0x25, 0xa3, 0xfa, 0xaf, 0x0c, 0x9e, 0x97, 0xbc, 0xd0, 0x89, 0xc6, 0x01, 0x97, 0x60, 0x74, 0x3a, + 0xdc, 0xd0, 0x01, 0xab, 0x8a, 0x12, 0xa3, 0x33, 0xac, 0x61, 0x37, 0xfb, 0x1c, 0x4e, 0xdf, 0xb9, + 0xad, 0xce, 0x1b, 0x6e, 0x92, 0xc6, 0x1c, 0x8a, 0xd8, 0xec, 0xa3, 0x69, 0x9b, 0xad, 0xb5, 0xdd, + 0xee, 0x64, 0xcb, 0x43, 0x78, 0x64, 0x02, 0xb1, 0xa4, 0x30, 0x22, 0x5b, 0x0b, 0xe0, 0xce, 0x66, + 0x78, 0x21, 0xd8, 0x24, 0x66, 0xa5, 0x3c, 0x65, 0xcb, 0x54, 0xb0, 0x89, 0x9a, 0xd7, 0xe1, 0x66, + 0x78, 0xc3, 0x0c, 0x5d, 0x88, 0xda, 0x0c, 0xa7, 0x60, 0x37, 0x3b, 0x53, 0x7f, 0x3c, 0x51, 0x9f, + 0xe5, 0x84, 0xd9, 0x99, 0x2a, 0x2f, 0x3c, 0xc7, 0xf9, 0x30, 0x0c, 0xd9, 0x6f, 0xd0, 0x6a, 0x91, + 0x4a, 0x43, 0xee, 0x61, 0x3a, 0x5e, 0x02, 0x72, 0x3f, 0x40, 0xd8, 0x7b, 0x29, 0xea, 0xdf, 0x9b, + 0xbf, 0xff, 0x23, 0xf5, 0x4d, 0xd6, 0x9b, 0x98, 0xae, 0x0b, 0x0d, 0xdd, 0x0b, 0xee, 0xb6, 0x7a, + 0xd2, 0x36, 0xcd, 0xdc, 0xbd, 0x62, 0x72, 0x67, 0x32, 0x39, 0xe6, 0x25, 0xf2, 0x41, 0x79, 0x25, + 0x1c, 0x5a, 0x29, 0x91, 0x66, 0xb6, 0x29, 0xdb, 0xd1, 0x2b, 0xd9, 0xab, 0x49, 0x22, 0xb5, 0xac, + 0x39, 0x21, 0xbd, 0xd9, 0x36, 0xd0, 0xa6, 0x88, 0x5a, 0xd1, 0xb4, 0x8d, 0xe5, 0x15, 0x33, 0x16, + 0xd3, 0x69, 0xca, 0x35, 0x74, 0xc6, 0x59, 0x7d, 0x91, 0xdf, 0x76, 0xdb, 0x16, 0x0a, 0x12, 0xb1, + 0x3c, 0xa8, 0x60, 0xd3, 0xc8, 0x0a, 0xab, 0x5f, 0x49, 0x35, 0x0f, 0x76, 0xad, 0x6d, 0xc6, 0x03, + 0x88, 0x34, 0x12, 0x05, 0xed, 0x77, 0x6f, 0x95, 0xf8, 0x80, 0x37, 0x4f, 0x02, 0x5e, 0x41, 0xa4, + 0x94, 0x1d, 0x31, 0xf1, 0xdd, 0x1b, 0x82, 0xd9, 0x75, 0x02, 0xf0, 0xf0, 0x72, 0x79, 0x38, 0x81, + 0xeb, 0x04, 0xa8, 0xaf, 0x18, 0x62, 0x9d, 0x40, 0xb1, 0x7e, 0xd3, 0x99, 0x7d, 0xaf, 0x23, 0x56, + 0xda, 0xca, 0x21, 0x4d, 0x87, 0x82, 0xa1, 0xa6, 0xa3, 0x14, 0xfc, 0x47, 0xea, 0x6e, 0xad, 0x21, + 0x8f, 0x14, 0xdb, 0x57, 0x5b, 0xed, 0xc2, 0x6c, 0x5c, 0x32, 0xeb, 0x49, 0x75, 0x64, 0x09, 0xbf, + 0xc1, 0xbf, 0x16, 0x12, 0x71, 0xa9, 0x05, 0xd5, 0xb6, 0x5f, 0xde, 0xff, 0xef, 0x6f, 0xee, 0xac, + 0xfc, 0xe2, 0x9b, 0x3b, 0x2b, 0xff, 0xfb, 0xcd, 0x9d, 0x95, 0x9f, 0x7f, 0x7b, 0xe7, 0xbd, 0x5f, + 0x7c, 0x7b, 0xe7, 0xbd, 0xff, 0xf9, 0xf6, 0xce, 0x7b, 0x5f, 0xbf, 0xaf, 0xff, 0xa8, 0xee, 0xc5, + 0xff, 0x53, 0x7f, 0x1a, 0xf7, 0xf9, 0xff, 0x05, 0x00, 0x00, 0xff, 0xff, 0xb2, 0x7c, 0x4b, 0xdb, + 0x78, 0x77, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -717,10 +715,6 @@ type ClientCommandsClient interface { ChatSubscribeLastMessages(ctx context.Context, in *pb.RpcChatSubscribeLastMessagesRequest, opts ...grpc.CallOption) (*pb.RpcChatSubscribeLastMessagesResponse, error) ChatUnsubscribe(ctx context.Context, in *pb.RpcChatUnsubscribeRequest, opts ...grpc.CallOption) (*pb.RpcChatUnsubscribeResponse, error) ObjectChatAdd(ctx context.Context, in *pb.RpcObjectChatAddRequest, opts ...grpc.CallOption) (*pb.RpcObjectChatAddResponse, error) - // API - // *** - ApiStartServer(ctx context.Context, in *pb.RpcApiStartServerRequest, opts ...grpc.CallOption) (*pb.RpcApiStartServerResponse, error) - ApiStopServer(ctx context.Context, in *pb.RpcApiStopServerRequest, opts ...grpc.CallOption) (*pb.RpcApiStopServerResponse, error) } type clientCommandsClient struct { @@ -3229,24 +3223,6 @@ func (c *clientCommandsClient) ObjectChatAdd(ctx context.Context, in *pb.RpcObje return out, nil } -func (c *clientCommandsClient) ApiStartServer(ctx context.Context, in *pb.RpcApiStartServerRequest, opts ...grpc.CallOption) (*pb.RpcApiStartServerResponse, error) { - out := new(pb.RpcApiStartServerResponse) - err := c.cc.Invoke(ctx, "/anytype.ClientCommands/ApiStartServer", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *clientCommandsClient) ApiStopServer(ctx context.Context, in *pb.RpcApiStopServerRequest, opts ...grpc.CallOption) (*pb.RpcApiStopServerResponse, error) { - out := new(pb.RpcApiStopServerResponse) - err := c.cc.Invoke(ctx, "/anytype.ClientCommands/ApiStopServer", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - // ClientCommandsServer is the server API for ClientCommands service. type ClientCommandsServer interface { AppGetVersion(context.Context, *pb.RpcAppGetVersionRequest) *pb.RpcAppGetVersionResponse @@ -3587,10 +3563,6 @@ type ClientCommandsServer interface { ChatSubscribeLastMessages(context.Context, *pb.RpcChatSubscribeLastMessagesRequest) *pb.RpcChatSubscribeLastMessagesResponse ChatUnsubscribe(context.Context, *pb.RpcChatUnsubscribeRequest) *pb.RpcChatUnsubscribeResponse ObjectChatAdd(context.Context, *pb.RpcObjectChatAddRequest) *pb.RpcObjectChatAddResponse - // API - // *** - ApiStartServer(context.Context, *pb.RpcApiStartServerRequest) *pb.RpcApiStartServerResponse - ApiStopServer(context.Context, *pb.RpcApiStopServerRequest) *pb.RpcApiStopServerResponse } // UnimplementedClientCommandsServer can be embedded to have forward compatible implementations. @@ -4422,12 +4394,6 @@ func (*UnimplementedClientCommandsServer) ChatUnsubscribe(ctx context.Context, r func (*UnimplementedClientCommandsServer) ObjectChatAdd(ctx context.Context, req *pb.RpcObjectChatAddRequest) *pb.RpcObjectChatAddResponse { return nil } -func (*UnimplementedClientCommandsServer) ApiStartServer(ctx context.Context, req *pb.RpcApiStartServerRequest) *pb.RpcApiStartServerResponse { - return nil -} -func (*UnimplementedClientCommandsServer) ApiStopServer(ctx context.Context, req *pb.RpcApiStopServerRequest) *pb.RpcApiStopServerResponse { - return nil -} func RegisterClientCommandsServer(s *grpc.Server, srv ClientCommandsServer) { s.RegisterService(&_ClientCommands_serviceDesc, srv) @@ -9387,42 +9353,6 @@ func _ClientCommands_ObjectChatAdd_Handler(srv interface{}, ctx context.Context, return interceptor(ctx, in, info, handler) } -func _ClientCommands_ApiStartServer_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(pb.RpcApiStartServerRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ClientCommandsServer).ApiStartServer(ctx, in), nil - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/anytype.ClientCommands/ApiStartServer", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ClientCommandsServer).ApiStartServer(ctx, req.(*pb.RpcApiStartServerRequest)), nil - } - return interceptor(ctx, in, info, handler) -} - -func _ClientCommands_ApiStopServer_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(pb.RpcApiStopServerRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ClientCommandsServer).ApiStopServer(ctx, in), nil - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/anytype.ClientCommands/ApiStopServer", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ClientCommandsServer).ApiStopServer(ctx, req.(*pb.RpcApiStopServerRequest)), nil - } - return interceptor(ctx, in, info, handler) -} - var _ClientCommands_serviceDesc = grpc.ServiceDesc{ ServiceName: "anytype.ClientCommands", HandlerType: (*ClientCommandsServer)(nil), @@ -10523,14 +10453,6 @@ var _ClientCommands_serviceDesc = grpc.ServiceDesc{ MethodName: "ObjectChatAdd", Handler: _ClientCommands_ObjectChatAdd_Handler, }, - { - MethodName: "ApiStartServer", - Handler: _ClientCommands_ApiStartServer_Handler, - }, - { - MethodName: "ApiStopServer", - Handler: _ClientCommands_ApiStopServer_Handler, - }, }, Streams: []grpc.StreamDesc{ { From 43212520d489a3c288324eac69eddd4bef520ff7 Mon Sep 17 00:00:00 2001 From: Jannis Metrikat <120120832+jmetrikat@users.noreply.github.com> Date: Sun, 19 Jan 2025 17:37:11 +0100 Subject: [PATCH 122/195] GO-4642: Fix concurrent map writes --- core/api/server/middleware.go | 4 ++++ core/api/server/server.go | 3 +++ 2 files changed, 7 insertions(+) diff --git a/core/api/server/middleware.go b/core/api/server/middleware.go index 9ff0aef53..5309142a0 100644 --- a/core/api/server/middleware.go +++ b/core/api/server/middleware.go @@ -50,14 +50,18 @@ func (s *Server) ensureAuthenticated(mw service.ClientCommandsServer, tv interfa } key := strings.TrimPrefix(authHeader, "Bearer ") + s.mu.Lock() token, exists := s.KeyToToken[key] + s.mu.Unlock() if !exists { response := mw.WalletCreateSession(context.Background(), &pb.RpcWalletCreateSessionRequest{Auth: &pb.RpcWalletCreateSessionRequestAuthOfAppKey{AppKey: key}}) if response.Error.Code != pb.RpcWalletCreateSessionResponseError_NULL { c.AbortWithStatusJSON(http.StatusUnauthorized, gin.H{"error": "Failed to create session"}) return } + s.mu.Lock() s.KeyToToken[key] = response.Token + s.mu.Unlock() } else { _, err := tv.ValidateApiToken(token) if err != nil { diff --git a/core/api/server/server.go b/core/api/server/server.go index ec096ce72..152def492 100644 --- a/core/api/server/server.go +++ b/core/api/server/server.go @@ -1,6 +1,8 @@ package server import ( + "sync" + "github.com/anyproto/any-sync/app" "github.com/gin-gonic/gin" @@ -23,6 +25,7 @@ type Server struct { spaceService *space.SpaceService searchService *search.SearchService + mu sync.Mutex KeyToToken map[string]string // appKey -> token } From 430cc41778715bbdbc91d15e802f0ddb309413e7 Mon Sep 17 00:00:00 2001 From: Jannis Metrikat <120120832+jmetrikat@users.noreply.github.com> Date: Sun, 19 Jan 2025 19:15:03 +0100 Subject: [PATCH 123/195] GO-4459: Refactor swagger docs --- core/api/docs/docs.go | 309 ++++++++++++----------- core/api/docs/swagger.json | 309 ++++++++++++----------- core/api/docs/swagger.yaml | 246 +++++++++--------- core/api/service.go | 2 +- core/api/services/auth/handler.go | 16 +- core/api/services/export/handler.go | 11 +- core/api/services/object/handler.go | 103 ++++---- core/api/services/object/model.go | 3 +- core/api/services/object/service.go | 31 +-- core/api/services/object/service_test.go | 5 +- core/api/services/search/handler.go | 14 +- core/api/services/search/service.go | 5 - core/api/services/space/handler.go | 26 +- core/api/services/space/service.go | 11 - core/api/services/space/service_test.go | 4 +- core/api/util/error.go | 23 +- 16 files changed, 576 insertions(+), 542 deletions(-) diff --git a/core/api/docs/docs.go b/core/api/docs/docs.go index 5c812f7a4..2bdf7117e 100644 --- a/core/api/docs/docs.go +++ b/core/api/docs/docs.go @@ -35,11 +35,11 @@ const docTemplate = `{ "tags": [ "auth" ], - "summary": "Open a modal window with a code in Anytype Desktop app", + "summary": "Start a new challenge", "parameters": [ { "type": "string", - "description": "The name of the app that requests the code", + "description": "App name requesting the challenge", "name": "app_name", "in": "query", "required": true @@ -58,7 +58,7 @@ const docTemplate = `{ "$ref": "#/definitions/util.ValidationError" } }, - "502": { + "500": { "description": "Internal server error", "schema": { "$ref": "#/definitions/util.ServerError" @@ -78,18 +78,18 @@ const docTemplate = `{ "tags": [ "auth" ], - "summary": "Retrieve an authentication token using a code", + "summary": "Retrieve a token", "parameters": [ { "type": "string", - "description": "The challenge ID", + "description": "Challenge ID", "name": "challenge_id", "in": "query", "required": true }, { "type": "string", - "description": "The 4-digit code retrieved from Anytype Desktop app", + "description": "4-digit code retrieved from Anytype Desktop app", "name": "code", "in": "query", "required": true @@ -108,7 +108,7 @@ const docTemplate = `{ "$ref": "#/definitions/util.ValidationError" } }, - "502": { + "500": { "description": "Internal server error", "schema": { "$ref": "#/definitions/util.ServerError" @@ -128,11 +128,11 @@ const docTemplate = `{ "tags": [ "search" ], - "summary": "Search and retrieve objects across all the spaces", + "summary": "Search objects across all spaces", "parameters": [ { "type": "string", - "description": "The search term to filter objects by name", + "description": "Search query", "name": "query", "in": "query" }, @@ -142,7 +142,7 @@ const docTemplate = `{ "type": "string" }, "collectionFormat": "csv", - "description": "Specify object types for search", + "description": "Types to filter objects by", "name": "object_types", "in": "query" }, @@ -173,19 +173,13 @@ const docTemplate = `{ } } }, - "403": { + "401": { "description": "Unauthorized", "schema": { "$ref": "#/definitions/util.UnauthorizedError" } }, - "404": { - "description": "Resource not found", - "schema": { - "$ref": "#/definitions/util.NotFoundError" - } - }, - "502": { + "500": { "description": "Internal server error", "schema": { "$ref": "#/definitions/util.ServerError" @@ -205,7 +199,7 @@ const docTemplate = `{ "tags": [ "spaces" ], - "summary": "Retrieve a list of spaces", + "summary": "List spaces", "parameters": [ { "type": "integer", @@ -228,19 +222,13 @@ const docTemplate = `{ "$ref": "#/definitions/pagination.PaginatedResponse-space_Space" } }, - "403": { + "401": { "description": "Unauthorized", "schema": { "$ref": "#/definitions/util.UnauthorizedError" } }, - "404": { - "description": "Resource not found", - "schema": { - "$ref": "#/definitions/util.NotFoundError" - } - }, - "502": { + "500": { "description": "Internal server error", "schema": { "$ref": "#/definitions/util.ServerError" @@ -258,7 +246,7 @@ const docTemplate = `{ "tags": [ "spaces" ], - "summary": "Create a new Space", + "summary": "Create space", "parameters": [ { "description": "Space Name", @@ -283,13 +271,13 @@ const docTemplate = `{ "$ref": "#/definitions/util.ValidationError" } }, - "403": { + "401": { "description": "Unauthorized", "schema": { "$ref": "#/definitions/util.UnauthorizedError" } }, - "502": { + "500": { "description": "Internal server error", "schema": { "$ref": "#/definitions/util.ServerError" @@ -309,11 +297,11 @@ const docTemplate = `{ "tags": [ "spaces" ], - "summary": "Retrieve a list of members for the specified Space", + "summary": "List members", "parameters": [ { "type": "string", - "description": "The ID of the space", + "description": "Space ID", "name": "space_id", "in": "path", "required": true @@ -339,19 +327,13 @@ const docTemplate = `{ "$ref": "#/definitions/pagination.PaginatedResponse-space_Member" } }, - "403": { + "401": { "description": "Unauthorized", "schema": { "$ref": "#/definitions/util.UnauthorizedError" } }, - "404": { - "description": "Resource not found", - "schema": { - "$ref": "#/definitions/util.NotFoundError" - } - }, - "502": { + "500": { "description": "Internal server error", "schema": { "$ref": "#/definitions/util.ServerError" @@ -371,11 +353,11 @@ const docTemplate = `{ "tags": [ "objects" ], - "summary": "Retrieve object types in a specific space", + "summary": "List types", "parameters": [ { "type": "string", - "description": "The ID of the space", + "description": "Space ID", "name": "space_id", "in": "path", "required": true @@ -396,27 +378,18 @@ const docTemplate = `{ ], "responses": { "200": { - "description": "List of object types", + "description": "List of types", "schema": { - "type": "object", - "additionalProperties": { - "$ref": "#/definitions/object.ObjectType" - } + "$ref": "#/definitions/pagination.PaginatedResponse-object_ObjectType" } }, - "403": { + "401": { "description": "Unauthorized", "schema": { "$ref": "#/definitions/util.UnauthorizedError" } }, - "404": { - "description": "Resource not found", - "schema": { - "$ref": "#/definitions/util.NotFoundError" - } - }, - "502": { + "500": { "description": "Internal server error", "schema": { "$ref": "#/definitions/util.ServerError" @@ -436,18 +409,18 @@ const docTemplate = `{ "tags": [ "objects" ], - "summary": "Retrieve a list of templates for a specific object type in a space", + "summary": "List templates", "parameters": [ { "type": "string", - "description": "The ID of the space", + "description": "Space ID", "name": "space_id", "in": "path", "required": true }, { "type": "string", - "description": "The ID of the object type", + "description": "Type ID", "name": "type_id", "in": "path", "required": true @@ -470,28 +443,16 @@ const docTemplate = `{ "200": { "description": "List of templates", "schema": { - "type": "object", - "additionalProperties": { - "type": "array", - "items": { - "$ref": "#/definitions/object.ObjectTemplate" - } - } + "$ref": "#/definitions/pagination.PaginatedResponse-object_Template" } }, - "403": { + "401": { "description": "Unauthorized", "schema": { "$ref": "#/definitions/util.UnauthorizedError" } }, - "404": { - "description": "Resource not found", - "schema": { - "$ref": "#/definitions/util.NotFoundError" - } - }, - "502": { + "500": { "description": "Internal server error", "schema": { "$ref": "#/definitions/util.ServerError" @@ -511,11 +472,11 @@ const docTemplate = `{ "tags": [ "objects" ], - "summary": "Retrieve objects in a specific space", + "summary": "List objects", "parameters": [ { "type": "string", - "description": "The ID of the space", + "description": "Space ID", "name": "space_id", "in": "path", "required": true @@ -538,28 +499,16 @@ const docTemplate = `{ "200": { "description": "List of objects", "schema": { - "type": "object", - "additionalProperties": { - "type": "array", - "items": { - "$ref": "#/definitions/object.Object" - } - } + "$ref": "#/definitions/pagination.PaginatedResponse-object_Object" } }, - "403": { + "401": { "description": "Unauthorized", "schema": { "$ref": "#/definitions/util.UnauthorizedError" } }, - "404": { - "description": "Resource not found", - "schema": { - "$ref": "#/definitions/util.NotFoundError" - } - }, - "502": { + "500": { "description": "Internal server error", "schema": { "$ref": "#/definitions/util.ServerError" @@ -577,25 +526,22 @@ const docTemplate = `{ "tags": [ "objects" ], - "summary": "Create a new object in a specific space", + "summary": "Create object", "parameters": [ { "type": "string", - "description": "The ID of the space", + "description": "Space ID", "name": "space_id", "in": "path", "required": true }, { - "description": "Object details (e.g., name)", + "description": "Object to create", "name": "object", "in": "body", "required": true, "schema": { - "type": "object", - "additionalProperties": { - "type": "string" - } + "$ref": "#/definitions/object.CreateObjectRequest" } } ], @@ -612,13 +558,13 @@ const docTemplate = `{ "$ref": "#/definitions/util.ValidationError" } }, - "403": { + "401": { "description": "Unauthorized", "schema": { "$ref": "#/definitions/util.UnauthorizedError" } }, - "502": { + "500": { "description": "Internal server error", "schema": { "$ref": "#/definitions/util.ServerError" @@ -638,18 +584,18 @@ const docTemplate = `{ "tags": [ "objects" ], - "summary": "Retrieve a specific object in a space", + "summary": "Get object", "parameters": [ { "type": "string", - "description": "The ID of the space", + "description": "Space ID", "name": "space_id", "in": "path", "required": true }, { "type": "string", - "description": "The ID of the object", + "description": "Object ID", "name": "object_id", "in": "path", "required": true @@ -662,7 +608,7 @@ const docTemplate = `{ "$ref": "#/definitions/object.ObjectResponse" } }, - "403": { + "401": { "description": "Unauthorized", "schema": { "$ref": "#/definitions/util.UnauthorizedError" @@ -674,7 +620,7 @@ const docTemplate = `{ "$ref": "#/definitions/util.NotFoundError" } }, - "502": { + "500": { "description": "Internal server error", "schema": { "$ref": "#/definitions/util.ServerError" @@ -692,18 +638,18 @@ const docTemplate = `{ "tags": [ "objects" ], - "summary": "Delete a specific object in a space", + "summary": "Delete object", "parameters": [ { "type": "string", - "description": "The ID of the space", + "description": "Space ID", "name": "space_id", "in": "path", "required": true }, { "type": "string", - "description": "The ID of the object", + "description": "Object ID", "name": "object_id", "in": "path", "required": true @@ -716,19 +662,25 @@ const docTemplate = `{ "$ref": "#/definitions/object.ObjectResponse" } }, - "403": { + "401": { "description": "Unauthorized", "schema": { "$ref": "#/definitions/util.UnauthorizedError" } }, + "403": { + "description": "Forbidden", + "schema": { + "$ref": "#/definitions/util.ForbiddenError" + } + }, "404": { "description": "Resource not found", "schema": { "$ref": "#/definitions/util.NotFoundError" } }, - "502": { + "500": { "description": "Internal server error", "schema": { "$ref": "#/definitions/util.ServerError" @@ -748,7 +700,7 @@ const docTemplate = `{ "tags": [ "export" ], - "summary": "Export an object", + "summary": "Export object", "parameters": [ { "type": "string", @@ -768,7 +720,7 @@ const docTemplate = `{ "type": "string", "description": "Export format", "name": "format", - "in": "query", + "in": "path", "required": true } ], @@ -785,19 +737,13 @@ const docTemplate = `{ "$ref": "#/definitions/util.ValidationError" } }, - "403": { + "401": { "description": "Unauthorized", "schema": { "$ref": "#/definitions/util.UnauthorizedError" } }, - "404": { - "description": "Resource not found", - "schema": { - "$ref": "#/definitions/util.NotFoundError" - } - }, - "502": { + "500": { "description": "Internal server error", "schema": { "$ref": "#/definitions/util.ServerError" @@ -869,6 +815,32 @@ const docTemplate = `{ } } }, + "object.CreateObjectRequest": { + "type": "object", + "properties": { + "body": { + "type": "string" + }, + "description": { + "type": "string" + }, + "icon": { + "type": "string" + }, + "name": { + "type": "string" + }, + "object_type_unique_key": { + "type": "string" + }, + "source": { + "type": "string" + }, + "template_id": { + "type": "string" + } + } + }, "object.Detail": { "type": "object", "properties": { @@ -969,27 +941,6 @@ const docTemplate = `{ } } }, - "object.ObjectTemplate": { - "type": "object", - "properties": { - "icon": { - "type": "string", - "example": "📄" - }, - "id": { - "type": "string", - "example": "bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5uutge" - }, - "name": { - "type": "string", - "example": "Object Template Name" - }, - "type": { - "type": "string", - "example": "object_template" - } - } - }, "object.ObjectType": { "type": "object", "properties": { @@ -1019,6 +970,27 @@ const docTemplate = `{ } } }, + "object.Template": { + "type": "object", + "properties": { + "icon": { + "type": "string", + "example": "📄" + }, + "id": { + "type": "string", + "example": "bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5uutge" + }, + "name": { + "type": "string", + "example": "Object Template Name" + }, + "type": { + "type": "string", + "example": "object_template" + } + } + }, "object.Text": { "type": "object", "properties": { @@ -1039,6 +1011,48 @@ const docTemplate = `{ } } }, + "pagination.PaginatedResponse-object_Object": { + "type": "object", + "properties": { + "data": { + "type": "array", + "items": { + "$ref": "#/definitions/object.Object" + } + }, + "pagination": { + "$ref": "#/definitions/pagination.PaginationMeta" + } + } + }, + "pagination.PaginatedResponse-object_ObjectType": { + "type": "object", + "properties": { + "data": { + "type": "array", + "items": { + "$ref": "#/definitions/object.ObjectType" + } + }, + "pagination": { + "$ref": "#/definitions/pagination.PaginationMeta" + } + } + }, + "pagination.PaginatedResponse-object_Template": { + "type": "object", + "properties": { + "data": { + "type": "array", + "items": { + "$ref": "#/definitions/object.Template" + } + }, + "pagination": { + "$ref": "#/definitions/pagination.PaginationMeta" + } + } + }, "pagination.PaginatedResponse-space_Member": { "type": "object", "properties": { @@ -1214,6 +1228,19 @@ const docTemplate = `{ } } }, + "util.ForbiddenError": { + "type": "object", + "properties": { + "error": { + "type": "object", + "properties": { + "message": { + "type": "string" + } + } + } + } + }, "util.NotFoundError": { "type": "object", "properties": { @@ -1285,7 +1312,7 @@ var SwaggerInfo = &swag.Spec{ BasePath: "/v1", Schemes: []string{}, Title: "Anytype API", - Description: "This API allows interaction with Anytype resources such as spaces, objects, and object types.", + Description: "This API allows interaction with Anytype resources such as spaces, objects and types.", InfoInstanceName: "swagger", SwaggerTemplate: docTemplate, LeftDelim: "{{", diff --git a/core/api/docs/swagger.json b/core/api/docs/swagger.json index 3bdab46ab..9097f49b4 100644 --- a/core/api/docs/swagger.json +++ b/core/api/docs/swagger.json @@ -1,7 +1,7 @@ { "swagger": "2.0", "info": { - "description": "This API allows interaction with Anytype resources such as spaces, objects, and object types.", + "description": "This API allows interaction with Anytype resources such as spaces, objects and types.", "title": "Anytype API", "termsOfService": "https://anytype.io/terms_of_use", "contact": { @@ -29,11 +29,11 @@ "tags": [ "auth" ], - "summary": "Open a modal window with a code in Anytype Desktop app", + "summary": "Start a new challenge", "parameters": [ { "type": "string", - "description": "The name of the app that requests the code", + "description": "App name requesting the challenge", "name": "app_name", "in": "query", "required": true @@ -52,7 +52,7 @@ "$ref": "#/definitions/util.ValidationError" } }, - "502": { + "500": { "description": "Internal server error", "schema": { "$ref": "#/definitions/util.ServerError" @@ -72,18 +72,18 @@ "tags": [ "auth" ], - "summary": "Retrieve an authentication token using a code", + "summary": "Retrieve a token", "parameters": [ { "type": "string", - "description": "The challenge ID", + "description": "Challenge ID", "name": "challenge_id", "in": "query", "required": true }, { "type": "string", - "description": "The 4-digit code retrieved from Anytype Desktop app", + "description": "4-digit code retrieved from Anytype Desktop app", "name": "code", "in": "query", "required": true @@ -102,7 +102,7 @@ "$ref": "#/definitions/util.ValidationError" } }, - "502": { + "500": { "description": "Internal server error", "schema": { "$ref": "#/definitions/util.ServerError" @@ -122,11 +122,11 @@ "tags": [ "search" ], - "summary": "Search and retrieve objects across all the spaces", + "summary": "Search objects across all spaces", "parameters": [ { "type": "string", - "description": "The search term to filter objects by name", + "description": "Search query", "name": "query", "in": "query" }, @@ -136,7 +136,7 @@ "type": "string" }, "collectionFormat": "csv", - "description": "Specify object types for search", + "description": "Types to filter objects by", "name": "object_types", "in": "query" }, @@ -167,19 +167,13 @@ } } }, - "403": { + "401": { "description": "Unauthorized", "schema": { "$ref": "#/definitions/util.UnauthorizedError" } }, - "404": { - "description": "Resource not found", - "schema": { - "$ref": "#/definitions/util.NotFoundError" - } - }, - "502": { + "500": { "description": "Internal server error", "schema": { "$ref": "#/definitions/util.ServerError" @@ -199,7 +193,7 @@ "tags": [ "spaces" ], - "summary": "Retrieve a list of spaces", + "summary": "List spaces", "parameters": [ { "type": "integer", @@ -222,19 +216,13 @@ "$ref": "#/definitions/pagination.PaginatedResponse-space_Space" } }, - "403": { + "401": { "description": "Unauthorized", "schema": { "$ref": "#/definitions/util.UnauthorizedError" } }, - "404": { - "description": "Resource not found", - "schema": { - "$ref": "#/definitions/util.NotFoundError" - } - }, - "502": { + "500": { "description": "Internal server error", "schema": { "$ref": "#/definitions/util.ServerError" @@ -252,7 +240,7 @@ "tags": [ "spaces" ], - "summary": "Create a new Space", + "summary": "Create space", "parameters": [ { "description": "Space Name", @@ -277,13 +265,13 @@ "$ref": "#/definitions/util.ValidationError" } }, - "403": { + "401": { "description": "Unauthorized", "schema": { "$ref": "#/definitions/util.UnauthorizedError" } }, - "502": { + "500": { "description": "Internal server error", "schema": { "$ref": "#/definitions/util.ServerError" @@ -303,11 +291,11 @@ "tags": [ "spaces" ], - "summary": "Retrieve a list of members for the specified Space", + "summary": "List members", "parameters": [ { "type": "string", - "description": "The ID of the space", + "description": "Space ID", "name": "space_id", "in": "path", "required": true @@ -333,19 +321,13 @@ "$ref": "#/definitions/pagination.PaginatedResponse-space_Member" } }, - "403": { + "401": { "description": "Unauthorized", "schema": { "$ref": "#/definitions/util.UnauthorizedError" } }, - "404": { - "description": "Resource not found", - "schema": { - "$ref": "#/definitions/util.NotFoundError" - } - }, - "502": { + "500": { "description": "Internal server error", "schema": { "$ref": "#/definitions/util.ServerError" @@ -365,11 +347,11 @@ "tags": [ "objects" ], - "summary": "Retrieve object types in a specific space", + "summary": "List types", "parameters": [ { "type": "string", - "description": "The ID of the space", + "description": "Space ID", "name": "space_id", "in": "path", "required": true @@ -390,27 +372,18 @@ ], "responses": { "200": { - "description": "List of object types", + "description": "List of types", "schema": { - "type": "object", - "additionalProperties": { - "$ref": "#/definitions/object.ObjectType" - } + "$ref": "#/definitions/pagination.PaginatedResponse-object_ObjectType" } }, - "403": { + "401": { "description": "Unauthorized", "schema": { "$ref": "#/definitions/util.UnauthorizedError" } }, - "404": { - "description": "Resource not found", - "schema": { - "$ref": "#/definitions/util.NotFoundError" - } - }, - "502": { + "500": { "description": "Internal server error", "schema": { "$ref": "#/definitions/util.ServerError" @@ -430,18 +403,18 @@ "tags": [ "objects" ], - "summary": "Retrieve a list of templates for a specific object type in a space", + "summary": "List templates", "parameters": [ { "type": "string", - "description": "The ID of the space", + "description": "Space ID", "name": "space_id", "in": "path", "required": true }, { "type": "string", - "description": "The ID of the object type", + "description": "Type ID", "name": "type_id", "in": "path", "required": true @@ -464,28 +437,16 @@ "200": { "description": "List of templates", "schema": { - "type": "object", - "additionalProperties": { - "type": "array", - "items": { - "$ref": "#/definitions/object.ObjectTemplate" - } - } + "$ref": "#/definitions/pagination.PaginatedResponse-object_Template" } }, - "403": { + "401": { "description": "Unauthorized", "schema": { "$ref": "#/definitions/util.UnauthorizedError" } }, - "404": { - "description": "Resource not found", - "schema": { - "$ref": "#/definitions/util.NotFoundError" - } - }, - "502": { + "500": { "description": "Internal server error", "schema": { "$ref": "#/definitions/util.ServerError" @@ -505,11 +466,11 @@ "tags": [ "objects" ], - "summary": "Retrieve objects in a specific space", + "summary": "List objects", "parameters": [ { "type": "string", - "description": "The ID of the space", + "description": "Space ID", "name": "space_id", "in": "path", "required": true @@ -532,28 +493,16 @@ "200": { "description": "List of objects", "schema": { - "type": "object", - "additionalProperties": { - "type": "array", - "items": { - "$ref": "#/definitions/object.Object" - } - } + "$ref": "#/definitions/pagination.PaginatedResponse-object_Object" } }, - "403": { + "401": { "description": "Unauthorized", "schema": { "$ref": "#/definitions/util.UnauthorizedError" } }, - "404": { - "description": "Resource not found", - "schema": { - "$ref": "#/definitions/util.NotFoundError" - } - }, - "502": { + "500": { "description": "Internal server error", "schema": { "$ref": "#/definitions/util.ServerError" @@ -571,25 +520,22 @@ "tags": [ "objects" ], - "summary": "Create a new object in a specific space", + "summary": "Create object", "parameters": [ { "type": "string", - "description": "The ID of the space", + "description": "Space ID", "name": "space_id", "in": "path", "required": true }, { - "description": "Object details (e.g., name)", + "description": "Object to create", "name": "object", "in": "body", "required": true, "schema": { - "type": "object", - "additionalProperties": { - "type": "string" - } + "$ref": "#/definitions/object.CreateObjectRequest" } } ], @@ -606,13 +552,13 @@ "$ref": "#/definitions/util.ValidationError" } }, - "403": { + "401": { "description": "Unauthorized", "schema": { "$ref": "#/definitions/util.UnauthorizedError" } }, - "502": { + "500": { "description": "Internal server error", "schema": { "$ref": "#/definitions/util.ServerError" @@ -632,18 +578,18 @@ "tags": [ "objects" ], - "summary": "Retrieve a specific object in a space", + "summary": "Get object", "parameters": [ { "type": "string", - "description": "The ID of the space", + "description": "Space ID", "name": "space_id", "in": "path", "required": true }, { "type": "string", - "description": "The ID of the object", + "description": "Object ID", "name": "object_id", "in": "path", "required": true @@ -656,7 +602,7 @@ "$ref": "#/definitions/object.ObjectResponse" } }, - "403": { + "401": { "description": "Unauthorized", "schema": { "$ref": "#/definitions/util.UnauthorizedError" @@ -668,7 +614,7 @@ "$ref": "#/definitions/util.NotFoundError" } }, - "502": { + "500": { "description": "Internal server error", "schema": { "$ref": "#/definitions/util.ServerError" @@ -686,18 +632,18 @@ "tags": [ "objects" ], - "summary": "Delete a specific object in a space", + "summary": "Delete object", "parameters": [ { "type": "string", - "description": "The ID of the space", + "description": "Space ID", "name": "space_id", "in": "path", "required": true }, { "type": "string", - "description": "The ID of the object", + "description": "Object ID", "name": "object_id", "in": "path", "required": true @@ -710,19 +656,25 @@ "$ref": "#/definitions/object.ObjectResponse" } }, - "403": { + "401": { "description": "Unauthorized", "schema": { "$ref": "#/definitions/util.UnauthorizedError" } }, + "403": { + "description": "Forbidden", + "schema": { + "$ref": "#/definitions/util.ForbiddenError" + } + }, "404": { "description": "Resource not found", "schema": { "$ref": "#/definitions/util.NotFoundError" } }, - "502": { + "500": { "description": "Internal server error", "schema": { "$ref": "#/definitions/util.ServerError" @@ -742,7 +694,7 @@ "tags": [ "export" ], - "summary": "Export an object", + "summary": "Export object", "parameters": [ { "type": "string", @@ -762,7 +714,7 @@ "type": "string", "description": "Export format", "name": "format", - "in": "query", + "in": "path", "required": true } ], @@ -779,19 +731,13 @@ "$ref": "#/definitions/util.ValidationError" } }, - "403": { + "401": { "description": "Unauthorized", "schema": { "$ref": "#/definitions/util.UnauthorizedError" } }, - "404": { - "description": "Resource not found", - "schema": { - "$ref": "#/definitions/util.NotFoundError" - } - }, - "502": { + "500": { "description": "Internal server error", "schema": { "$ref": "#/definitions/util.ServerError" @@ -863,6 +809,32 @@ } } }, + "object.CreateObjectRequest": { + "type": "object", + "properties": { + "body": { + "type": "string" + }, + "description": { + "type": "string" + }, + "icon": { + "type": "string" + }, + "name": { + "type": "string" + }, + "object_type_unique_key": { + "type": "string" + }, + "source": { + "type": "string" + }, + "template_id": { + "type": "string" + } + } + }, "object.Detail": { "type": "object", "properties": { @@ -963,27 +935,6 @@ } } }, - "object.ObjectTemplate": { - "type": "object", - "properties": { - "icon": { - "type": "string", - "example": "📄" - }, - "id": { - "type": "string", - "example": "bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5uutge" - }, - "name": { - "type": "string", - "example": "Object Template Name" - }, - "type": { - "type": "string", - "example": "object_template" - } - } - }, "object.ObjectType": { "type": "object", "properties": { @@ -1013,6 +964,27 @@ } } }, + "object.Template": { + "type": "object", + "properties": { + "icon": { + "type": "string", + "example": "📄" + }, + "id": { + "type": "string", + "example": "bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5uutge" + }, + "name": { + "type": "string", + "example": "Object Template Name" + }, + "type": { + "type": "string", + "example": "object_template" + } + } + }, "object.Text": { "type": "object", "properties": { @@ -1033,6 +1005,48 @@ } } }, + "pagination.PaginatedResponse-object_Object": { + "type": "object", + "properties": { + "data": { + "type": "array", + "items": { + "$ref": "#/definitions/object.Object" + } + }, + "pagination": { + "$ref": "#/definitions/pagination.PaginationMeta" + } + } + }, + "pagination.PaginatedResponse-object_ObjectType": { + "type": "object", + "properties": { + "data": { + "type": "array", + "items": { + "$ref": "#/definitions/object.ObjectType" + } + }, + "pagination": { + "$ref": "#/definitions/pagination.PaginationMeta" + } + } + }, + "pagination.PaginatedResponse-object_Template": { + "type": "object", + "properties": { + "data": { + "type": "array", + "items": { + "$ref": "#/definitions/object.Template" + } + }, + "pagination": { + "$ref": "#/definitions/pagination.PaginationMeta" + } + } + }, "pagination.PaginatedResponse-space_Member": { "type": "object", "properties": { @@ -1208,6 +1222,19 @@ } } }, + "util.ForbiddenError": { + "type": "object", + "properties": { + "error": { + "type": "object", + "properties": { + "message": { + "type": "string" + } + } + } + } + }, "util.NotFoundError": { "type": "object", "properties": { diff --git a/core/api/docs/swagger.yaml b/core/api/docs/swagger.yaml index dd2a83a1d..a77e2874e 100644 --- a/core/api/docs/swagger.yaml +++ b/core/api/docs/swagger.yaml @@ -41,6 +41,23 @@ definitions: example: VerticalAlignTop type: string type: object + object.CreateObjectRequest: + properties: + body: + type: string + description: + type: string + icon: + type: string + name: + type: string + object_type_unique_key: + type: string + source: + type: string + template_id: + type: string + type: object object.Detail: properties: details: @@ -109,21 +126,6 @@ definitions: object: $ref: '#/definitions/object.Object' type: object - object.ObjectTemplate: - properties: - icon: - example: "\U0001F4C4" - type: string - id: - example: bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5uutge - type: string - name: - example: Object Template Name - type: string - type: - example: object_template - type: string - type: object object.ObjectType: properties: icon: @@ -145,6 +147,21 @@ definitions: example: ot-page type: string type: object + object.Template: + properties: + icon: + example: "\U0001F4C4" + type: string + id: + example: bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5uutge + type: string + name: + example: Object Template Name + type: string + type: + example: object_template + type: string + type: object object.Text: properties: checked: @@ -158,6 +175,33 @@ definitions: text: type: string type: object + pagination.PaginatedResponse-object_Object: + properties: + data: + items: + $ref: '#/definitions/object.Object' + type: array + pagination: + $ref: '#/definitions/pagination.PaginationMeta' + type: object + pagination.PaginatedResponse-object_ObjectType: + properties: + data: + items: + $ref: '#/definitions/object.ObjectType' + type: array + pagination: + $ref: '#/definitions/pagination.PaginationMeta' + type: object + pagination.PaginatedResponse-object_Template: + properties: + data: + items: + $ref: '#/definitions/object.Template' + type: array + pagination: + $ref: '#/definitions/pagination.PaginationMeta' + type: object pagination.PaginatedResponse-space_Member: properties: data: @@ -284,6 +328,14 @@ definitions: example: bafyreiapey2g6e6za4zfxvlgwdy4hbbfu676gmwrhnqvjbxvrchr7elr3y type: string type: object + util.ForbiddenError: + properties: + error: + properties: + message: + type: string + type: object + type: object util.NotFoundError: properties: error: @@ -326,7 +378,7 @@ info: name: Anytype Support url: https://anytype.io/contact description: This API allows interaction with Anytype resources such as spaces, - objects, and object types. + objects and types. license: name: Any Source Available License 1.0 url: https://github.com/anyproto/anytype-ts/blob/main/LICENSE.md @@ -339,7 +391,7 @@ paths: consumes: - application/json parameters: - - description: The name of the app that requests the code + - description: App name requesting the challenge in: query name: app_name required: true @@ -355,11 +407,11 @@ paths: description: Invalid input schema: $ref: '#/definitions/util.ValidationError' - "502": + "500": description: Internal server error schema: $ref: '#/definitions/util.ServerError' - summary: Open a modal window with a code in Anytype Desktop app + summary: Start a new challenge tags: - auth /auth/token: @@ -367,12 +419,12 @@ paths: consumes: - application/json parameters: - - description: The challenge ID + - description: Challenge ID in: query name: challenge_id required: true type: string - - description: The 4-digit code retrieved from Anytype Desktop app + - description: 4-digit code retrieved from Anytype Desktop app in: query name: code required: true @@ -388,11 +440,11 @@ paths: description: Invalid input schema: $ref: '#/definitions/util.ValidationError' - "502": + "500": description: Internal server error schema: $ref: '#/definitions/util.ServerError' - summary: Retrieve an authentication token using a code + summary: Retrieve a token tags: - auth /search: @@ -400,12 +452,12 @@ paths: consumes: - application/json parameters: - - description: The search term to filter objects by name + - description: Search query in: query name: query type: string - collectionFormat: csv - description: Specify object types for search + description: Types to filter objects by in: query items: type: string @@ -432,19 +484,15 @@ paths: $ref: '#/definitions/object.Object' type: array type: object - "403": + "401": description: Unauthorized schema: $ref: '#/definitions/util.UnauthorizedError' - "404": - description: Resource not found - schema: - $ref: '#/definitions/util.NotFoundError' - "502": + "500": description: Internal server error schema: $ref: '#/definitions/util.ServerError' - summary: Search and retrieve objects across all the spaces + summary: Search objects across all spaces tags: - search /spaces: @@ -469,19 +517,15 @@ paths: description: List of spaces schema: $ref: '#/definitions/pagination.PaginatedResponse-space_Space' - "403": + "401": description: Unauthorized schema: $ref: '#/definitions/util.UnauthorizedError' - "404": - description: Resource not found - schema: - $ref: '#/definitions/util.NotFoundError' - "502": + "500": description: Internal server error schema: $ref: '#/definitions/util.ServerError' - summary: Retrieve a list of spaces + summary: List spaces tags: - spaces post: @@ -505,15 +549,15 @@ paths: description: Bad request schema: $ref: '#/definitions/util.ValidationError' - "403": + "401": description: Unauthorized schema: $ref: '#/definitions/util.UnauthorizedError' - "502": + "500": description: Internal server error schema: $ref: '#/definitions/util.ServerError' - summary: Create a new Space + summary: Create space tags: - spaces /spaces/{space_id}/members: @@ -521,7 +565,7 @@ paths: consumes: - application/json parameters: - - description: The ID of the space + - description: Space ID in: path name: space_id required: true @@ -543,19 +587,15 @@ paths: description: List of members schema: $ref: '#/definitions/pagination.PaginatedResponse-space_Member' - "403": + "401": description: Unauthorized schema: $ref: '#/definitions/util.UnauthorizedError' - "404": - description: Resource not found - schema: - $ref: '#/definitions/util.NotFoundError' - "502": + "500": description: Internal server error schema: $ref: '#/definitions/util.ServerError' - summary: Retrieve a list of members for the specified Space + summary: List members tags: - spaces /spaces/{space_id}/object_types: @@ -563,7 +603,7 @@ paths: consumes: - application/json parameters: - - description: The ID of the space + - description: Space ID in: path name: space_id required: true @@ -582,24 +622,18 @@ paths: - application/json responses: "200": - description: List of object types + description: List of types schema: - additionalProperties: - $ref: '#/definitions/object.ObjectType' - type: object - "403": + $ref: '#/definitions/pagination.PaginatedResponse-object_ObjectType' + "401": description: Unauthorized schema: $ref: '#/definitions/util.UnauthorizedError' - "404": - description: Resource not found - schema: - $ref: '#/definitions/util.NotFoundError' - "502": + "500": description: Internal server error schema: $ref: '#/definitions/util.ServerError' - summary: Retrieve object types in a specific space + summary: List types tags: - objects /spaces/{space_id}/object_types/{type_id}/templates: @@ -607,12 +641,12 @@ paths: consumes: - application/json parameters: - - description: The ID of the space + - description: Space ID in: path name: space_id required: true type: string - - description: The ID of the object type + - description: Type ID in: path name: type_id required: true @@ -633,24 +667,16 @@ paths: "200": description: List of templates schema: - additionalProperties: - items: - $ref: '#/definitions/object.ObjectTemplate' - type: array - type: object - "403": + $ref: '#/definitions/pagination.PaginatedResponse-object_Template' + "401": description: Unauthorized schema: $ref: '#/definitions/util.UnauthorizedError' - "404": - description: Resource not found - schema: - $ref: '#/definitions/util.NotFoundError' - "502": + "500": description: Internal server error schema: $ref: '#/definitions/util.ServerError' - summary: Retrieve a list of templates for a specific object type in a space + summary: List templates tags: - objects /spaces/{space_id}/objects: @@ -658,7 +684,7 @@ paths: consumes: - application/json parameters: - - description: The ID of the space + - description: Space ID in: path name: space_id required: true @@ -679,43 +705,33 @@ paths: "200": description: List of objects schema: - additionalProperties: - items: - $ref: '#/definitions/object.Object' - type: array - type: object - "403": + $ref: '#/definitions/pagination.PaginatedResponse-object_Object' + "401": description: Unauthorized schema: $ref: '#/definitions/util.UnauthorizedError' - "404": - description: Resource not found - schema: - $ref: '#/definitions/util.NotFoundError' - "502": + "500": description: Internal server error schema: $ref: '#/definitions/util.ServerError' - summary: Retrieve objects in a specific space + summary: List objects tags: - objects post: consumes: - application/json parameters: - - description: The ID of the space + - description: Space ID in: path name: space_id required: true type: string - - description: Object details (e.g., name) + - description: Object to create in: body name: object required: true schema: - additionalProperties: - type: string - type: object + $ref: '#/definitions/object.CreateObjectRequest' produces: - application/json responses: @@ -727,15 +743,15 @@ paths: description: Bad request schema: $ref: '#/definitions/util.ValidationError' - "403": + "401": description: Unauthorized schema: $ref: '#/definitions/util.UnauthorizedError' - "502": + "500": description: Internal server error schema: $ref: '#/definitions/util.ServerError' - summary: Create a new object in a specific space + summary: Create object tags: - objects /spaces/{space_id}/objects/{object_id}: @@ -743,12 +759,12 @@ paths: consumes: - application/json parameters: - - description: The ID of the space + - description: Space ID in: path name: space_id required: true type: string - - description: The ID of the object + - description: Object ID in: path name: object_id required: true @@ -760,31 +776,35 @@ paths: description: The deleted object schema: $ref: '#/definitions/object.ObjectResponse' - "403": + "401": description: Unauthorized schema: $ref: '#/definitions/util.UnauthorizedError' + "403": + description: Forbidden + schema: + $ref: '#/definitions/util.ForbiddenError' "404": description: Resource not found schema: $ref: '#/definitions/util.NotFoundError' - "502": + "500": description: Internal server error schema: $ref: '#/definitions/util.ServerError' - summary: Delete a specific object in a space + summary: Delete object tags: - objects get: consumes: - application/json parameters: - - description: The ID of the space + - description: Space ID in: path name: space_id required: true type: string - - description: The ID of the object + - description: Object ID in: path name: object_id required: true @@ -796,7 +816,7 @@ paths: description: The requested object schema: $ref: '#/definitions/object.ObjectResponse' - "403": + "401": description: Unauthorized schema: $ref: '#/definitions/util.UnauthorizedError' @@ -804,11 +824,11 @@ paths: description: Resource not found schema: $ref: '#/definitions/util.NotFoundError' - "502": + "500": description: Internal server error schema: $ref: '#/definitions/util.ServerError' - summary: Retrieve a specific object in a space + summary: Get object tags: - objects /spaces/{space_id}/objects/{object_id}/export/{format}: @@ -827,7 +847,7 @@ paths: required: true type: string - description: Export format - in: query + in: path name: format required: true type: string @@ -842,19 +862,15 @@ paths: description: Bad request schema: $ref: '#/definitions/util.ValidationError' - "403": + "401": description: Unauthorized schema: $ref: '#/definitions/util.UnauthorizedError' - "404": - description: Resource not found - schema: - $ref: '#/definitions/util.NotFoundError' - "502": + "500": description: Internal server error schema: $ref: '#/definitions/util.ServerError' - summary: Export an object + summary: Export object tags: - export securityDefinitions: diff --git a/core/api/service.go b/core/api/service.go index 08296bcce..0da7396ba 100644 --- a/core/api/service.go +++ b/core/api/service.go @@ -47,7 +47,7 @@ func (s *apiService) Name() (name string) { // // @title Anytype API // @version 1.0 -// @description This API allows interaction with Anytype resources such as spaces, objects, and object types. +// @description This API allows interaction with Anytype resources such as spaces, objects and types. // @termsOfService https://anytype.io/terms_of_use // @contact.name Anytype Support // @contact.url https://anytype.io/contact diff --git a/core/api/services/auth/handler.go b/core/api/services/auth/handler.go index 23921af13..5bc8b93db 100644 --- a/core/api/services/auth/handler.go +++ b/core/api/services/auth/handler.go @@ -8,16 +8,16 @@ import ( "github.com/anyproto/anytype-heart/core/api/util" ) -// DisplayCodeHandler generates a new challenge and returns the challenge ID +// DisplayCodeHandler starts a new challenge and returns the challenge ID // -// @Summary Open a modal window with a code in Anytype Desktop app +// @Summary Start a new challenge // @Tags auth // @Accept json // @Produce json -// @Param app_name query string true "The name of the app that requests the code" +// @Param app_name query string true "App name requesting the challenge" // @Success 200 {object} DisplayCodeResponse "Challenge ID" // @Failure 400 {object} util.ValidationError "Invalid input" -// @Failure 502 {object} util.ServerError "Internal server error" +// @Failure 500 {object} util.ServerError "Internal server error" // @Router /auth/display_code [post] func DisplayCodeHandler(s *AuthService) gin.HandlerFunc { return func(c *gin.Context) { @@ -40,15 +40,15 @@ func DisplayCodeHandler(s *AuthService) gin.HandlerFunc { // TokenHandler retrieves an authentication token using a code and challenge ID // -// @Summary Retrieve an authentication token using a code +// @Summary Retrieve a token // @Tags auth // @Accept json // @Produce json -// @Param challenge_id query string true "The challenge ID" -// @Param code query string true "The 4-digit code retrieved from Anytype Desktop app" +// @Param challenge_id query string true "Challenge ID" +// @Param code query string true "4-digit code retrieved from Anytype Desktop app" // @Success 200 {object} TokenResponse "Authentication token" // @Failure 400 {object} util.ValidationError "Invalid input" -// @Failure 502 {object} util.ServerError "Internal server error" +// @Failure 500 {object} util.ServerError "Internal server error" // @Router /auth/token [post] func TokenHandler(s *AuthService) gin.HandlerFunc { return func(c *gin.Context) { diff --git a/core/api/services/export/handler.go b/core/api/services/export/handler.go index aa1017c9b..ee259630e 100644 --- a/core/api/services/export/handler.go +++ b/core/api/services/export/handler.go @@ -8,20 +8,19 @@ import ( "github.com/anyproto/anytype-heart/core/api/util" ) -// GetObjectExportHandler exports an object to the specified format +// GetObjectExportHandler exports an object in specified format // -// @Summary Export an object +// @Summary Export object // @Tags export // @Accept json // @Produce json // @Param space_id path string true "Space ID" // @Param object_id path string true "Object ID" -// @Param format query string true "Export format" +// @Param format path string true "Export format" // @Success 200 {object} ObjectExportResponse "Object exported successfully" // @Failure 400 {object} util.ValidationError "Bad request" -// @Failure 403 {object} util.UnauthorizedError "Unauthorized" -// @Failure 404 {object} util.NotFoundError "Resource not found" -// @Failure 502 {object} util.ServerError "Internal server error" +// @Failure 401 {object} util.UnauthorizedError "Unauthorized" +// @Failure 500 {object} util.ServerError "Internal server error" // @Router /spaces/{space_id}/objects/{object_id}/export/{format} [post] func GetObjectExportHandler(s *ExportService) gin.HandlerFunc { return func(c *gin.Context) { diff --git a/core/api/services/object/handler.go b/core/api/services/object/handler.go index 9f835d14d..342ac89d4 100644 --- a/core/api/services/object/handler.go +++ b/core/api/services/object/handler.go @@ -9,19 +9,18 @@ import ( "github.com/anyproto/anytype-heart/core/api/util" ) -// GetObjectsHandler retrieves objects in a specific space +// GetObjectsHandler retrieves a list of objects in a space // -// @Summary Retrieve objects in a specific space +// @Summary List objects // @Tags objects // @Accept json // @Produce json -// @Param space_id path string true "The ID of the space" -// @Param offset query int false "The number of items to skip before starting to collect the result set" -// @Param limit query int false "The number of items to return" default(100) -// @Success 200 {object} map[string][]Object "List of objects" -// @Failure 403 {object} util.UnauthorizedError "Unauthorized" -// @Failure 404 {object} util.NotFoundError "Resource not found" -// @Failure 502 {object} util.ServerError "Internal server error" +// @Param space_id path string true "Space ID" +// @Param offset query int false "The number of items to skip before starting to collect the result set" +// @Param limit query int false "The number of items to return" default(100) +// @Success 200 {object} pagination.PaginatedResponse[Object] "List of objects" +// @Failure 401 {object} util.UnauthorizedError "Unauthorized" +// @Failure 500 {object} util.ServerError "Internal server error" // @Router /spaces/{space_id}/objects [get] func GetObjectsHandler(s *ObjectService) gin.HandlerFunc { return func(c *gin.Context) { @@ -31,9 +30,8 @@ func GetObjectsHandler(s *ObjectService) gin.HandlerFunc { objects, total, hasMore, err := s.ListObjects(c.Request.Context(), spaceId, offset, limit) code := util.MapErrorCode(err, - util.ErrToCode(ErrorFailedRetrieveObjects, http.StatusInternalServerError), - util.ErrToCode(ErrNoObjectsFound, http.StatusNotFound), - util.ErrToCode(ErrObjectNotFound, http.StatusNotFound), + util.ErrToCode(ErrFailedRetrieveObjects, http.StatusInternalServerError), + util.ErrToCode(ErrObjectNotFound, http.StatusInternalServerError), util.ErrToCode(ErrFailedRetrieveObject, http.StatusInternalServerError), ) @@ -47,18 +45,18 @@ func GetObjectsHandler(s *ObjectService) gin.HandlerFunc { } } -// GetObjectHandler retrieves a specific object in a space +// GetObjectHandler retrieves an object in a space // -// @Summary Retrieve a specific object in a space +// @Summary Get object // @Tags objects // @Accept json // @Produce json -// @Param space_id path string true "The ID of the space" -// @Param object_id path string true "The ID of the object" +// @Param space_id path string true "Space ID" +// @Param object_id path string true "Object ID" // @Success 200 {object} ObjectResponse "The requested object" -// @Failure 403 {object} util.UnauthorizedError "Unauthorized" +// @Failure 401 {object} util.UnauthorizedError "Unauthorized" // @Failure 404 {object} util.NotFoundError "Resource not found" -// @Failure 502 {object} util.ServerError "Internal server error" +// @Failure 500 {object} util.ServerError "Internal server error" // @Router /spaces/{space_id}/objects/{object_id} [get] func GetObjectHandler(s *ObjectService) gin.HandlerFunc { return func(c *gin.Context) { @@ -81,18 +79,19 @@ func GetObjectHandler(s *ObjectService) gin.HandlerFunc { } } -// DeleteObjectHandler deletes a specific object in a space +// DeleteObjectHandler deletes an object in a space // -// @Summary Delete a specific object in a space +// @Summary Delete object // @Tags objects // @Accept json // @Produce json -// @Param space_id path string true "The ID of the space" -// @Param object_id path string true "The ID of the object" +// @Param space_id path string true "Space ID" +// @Param object_id path string true "Object ID" // @Success 200 {object} ObjectResponse "The deleted object" -// @Failure 403 {object} util.UnauthorizedError "Unauthorized" +// @Failure 401 {object} util.UnauthorizedError "Unauthorized" +// @Failure 403 {object} util.ForbiddenError "Forbidden" // @Failure 404 {object} util.NotFoundError "Resource not found" -// @Failure 502 {object} util.ServerError "Internal server error" +// @Failure 500 {object} util.ServerError "Internal server error" // @Router /spaces/{space_id}/objects/{object_id} [delete] func DeleteObjectHandler(s *ObjectService) gin.HandlerFunc { return func(c *gin.Context) { @@ -102,8 +101,8 @@ func DeleteObjectHandler(s *ObjectService) gin.HandlerFunc { object, err := s.DeleteObject(c.Request.Context(), spaceId, objectId) code := util.MapErrorCode(err, util.ErrToCode(ErrObjectNotFound, http.StatusNotFound), - util.ErrToCode(ErrFailedRetrieveObject, http.StatusInternalServerError), util.ErrToCode(ErrFailedDeleteObject, http.StatusForbidden), + util.ErrToCode(ErrFailedRetrieveObject, http.StatusInternalServerError), ) if code != http.StatusOK { @@ -116,18 +115,18 @@ func DeleteObjectHandler(s *ObjectService) gin.HandlerFunc { } } -// CreateObjectHandler creates a new object in a specific space +// CreateObjectHandler creates a new object in a space // -// @Summary Create a new object in a specific space +// @Summary Create object // @Tags objects // @Accept json // @Produce json -// @Param space_id path string true "The ID of the space" -// @Param object body map[string]string true "Object details (e.g., name)" +// @Param space_id path string true "Space ID" +// @Param object body CreateObjectRequest true "Object to create" // @Success 200 {object} ObjectResponse "The created object" // @Failure 400 {object} util.ValidationError "Bad request" -// @Failure 403 {object} util.UnauthorizedError "Unauthorized" -// @Failure 502 {object} util.ServerError "Internal server error" +// @Failure 401 {object} util.UnauthorizedError "Unauthorized" +// @Failure 500 {object} util.ServerError "Internal server error" // @Router /spaces/{space_id}/objects [post] func CreateObjectHandler(s *ObjectService) gin.HandlerFunc { return func(c *gin.Context) { @@ -146,7 +145,7 @@ func CreateObjectHandler(s *ObjectService) gin.HandlerFunc { util.ErrToCode(ErrFailedCreateObject, http.StatusInternalServerError), util.ErrToCode(ErrFailedSetRelationFeatured, http.StatusInternalServerError), util.ErrToCode(ErrFailedFetchBookmark, http.StatusInternalServerError), - util.ErrToCode(ErrObjectNotFound, http.StatusNotFound), + util.ErrToCode(ErrObjectNotFound, http.StatusInternalServerError), util.ErrToCode(ErrFailedRetrieveObject, http.StatusInternalServerError), ) @@ -160,19 +159,18 @@ func CreateObjectHandler(s *ObjectService) gin.HandlerFunc { } } -// GetTypesHandler retrieves object types in a specific space +// GetTypesHandler retrieves a list of types in a space // -// @Summary Retrieve object types in a specific space +// @Summary List types // @Tags objects // @Accept json // @Produce json -// @Param space_id path string true "The ID of the space" -// @Param offset query int false "The number of items to skip before starting to collect the result set" -// @Param limit query int false "The number of items to return" default(100) -// @Success 200 {object} map[string]ObjectType "List of object types" -// @Failure 403 {object} util.UnauthorizedError "Unauthorized" -// @Failure 404 {object} util.NotFoundError "Resource not found" -// @Failure 502 {object} util.ServerError "Internal server error" +// @Param space_id path string true "Space ID" +// @Param offset query int false "The number of items to skip before starting to collect the result set" +// @Param limit query int false "The number of items to return" default(100) +// @Success 200 {object} pagination.PaginatedResponse[ObjectType] "List of types" +// @Failure 401 {object} util.UnauthorizedError "Unauthorized" +// @Failure 500 {object} util.ServerError "Internal server error" // @Router /spaces/{space_id}/object_types [get] func GetTypesHandler(s *ObjectService) gin.HandlerFunc { return func(c *gin.Context) { @@ -183,7 +181,6 @@ func GetTypesHandler(s *ObjectService) gin.HandlerFunc { types, total, hasMore, err := s.ListTypes(c.Request.Context(), spaceId, offset, limit) code := util.MapErrorCode(err, util.ErrToCode(ErrFailedRetrieveTypes, http.StatusInternalServerError), - util.ErrToCode(ErrNoTypesFound, http.StatusNotFound), ) if code != http.StatusOK { @@ -196,20 +193,19 @@ func GetTypesHandler(s *ObjectService) gin.HandlerFunc { } } -// GetTemplatesHandler retrieves a list of templates for a specific object type in a space +// GetTemplatesHandler retrieves a list of templates for a type in a space // -// @Summary Retrieve a list of templates for a specific object type in a space +// @Summary List templates // @Tags objects // @Accept json // @Produce json -// @Param space_id path string true "The ID of the space" -// @Param type_id path string true "The ID of the object type" -// @Param offset query int false "The number of items to skip before starting to collect the result set" -// @Param limit query int false "The number of items to return" default(100) -// @Success 200 {object} map[string][]ObjectTemplate "List of templates" -// @Failure 403 {object} util.UnauthorizedError "Unauthorized" -// @Failure 404 {object} util.NotFoundError "Resource not found" -// @Failure 502 {object} util.ServerError "Internal server error" +// @Param space_id path string true "Space ID" +// @Param type_id path string true "Type ID" +// @Param offset query int false "The number of items to skip before starting to collect the result set" +// @Param limit query int false "The number of items to return" default(100) +// @Success 200 {object} pagination.PaginatedResponse[Template] "List of templates" +// @Failure 401 {object} util.UnauthorizedError "Unauthorized" +// @Failure 500 {object} util.ServerError "Internal server error" // @Router /spaces/{space_id}/object_types/{type_id}/templates [get] func GetTemplatesHandler(s *ObjectService) gin.HandlerFunc { return func(c *gin.Context) { @@ -221,10 +217,9 @@ func GetTemplatesHandler(s *ObjectService) gin.HandlerFunc { templates, total, hasMore, err := s.ListTemplates(c.Request.Context(), spaceId, typeId, offset, limit) code := util.MapErrorCode(err, util.ErrToCode(ErrFailedRetrieveTemplateType, http.StatusInternalServerError), - util.ErrToCode(ErrTemplateTypeNotFound, http.StatusNotFound), + util.ErrToCode(ErrTemplateTypeNotFound, http.StatusInternalServerError), util.ErrToCode(ErrFailedRetrieveTemplates, http.StatusInternalServerError), util.ErrToCode(ErrFailedRetrieveTemplate, http.StatusInternalServerError), - util.ErrToCode(ErrNoTemplatesFound, http.StatusNotFound), ) if code != http.StatusOK { diff --git a/core/api/services/object/model.go b/core/api/services/object/model.go index 3f8b8219c..bff10c927 100644 --- a/core/api/services/object/model.go +++ b/core/api/services/object/model.go @@ -8,7 +8,6 @@ type CreateObjectRequest struct { Source string `json:"source"` TemplateId string `json:"template_id"` ObjectTypeUniqueKey string `json:"object_type_unique_key"` - WithChat bool `json:"with_chat"` } type ObjectResponse struct { @@ -78,7 +77,7 @@ type ObjectType struct { RecommendedLayout string `json:"recommended_layout" example:"todo"` } -type ObjectTemplate struct { +type Template struct { Type string `json:"type" example:"object_template"` Id string `json:"id" example:"bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5uutge"` Name string `json:"name" example:"Object Template Name"` diff --git a/core/api/services/object/service.go b/core/api/services/object/service.go index ecffe4dc5..50ee8a6e3 100644 --- a/core/api/services/object/service.go +++ b/core/api/services/object/service.go @@ -20,8 +20,7 @@ import ( var ( ErrObjectNotFound = errors.New("object not found") ErrFailedRetrieveObject = errors.New("failed to retrieve object") - ErrorFailedRetrieveObjects = errors.New("failed to retrieve list of objects") - ErrNoObjectsFound = errors.New("no objects found") + ErrFailedRetrieveObjects = errors.New("failed to retrieve list of objects") ErrFailedDeleteObject = errors.New("failed to delete object") ErrFailedCreateObject = errors.New("failed to create object") ErrInputMissingSource = errors.New("source is missing for bookmark") @@ -29,21 +28,19 @@ var ( ErrFailedFetchBookmark = errors.New("failed to fetch bookmark") ErrFailedPasteBody = errors.New("failed to paste body") ErrFailedRetrieveTypes = errors.New("failed to retrieve types") - ErrNoTypesFound = errors.New("no types found") ErrFailedRetrieveTemplateType = errors.New("failed to retrieve template type") ErrTemplateTypeNotFound = errors.New("template type not found") ErrFailedRetrieveTemplate = errors.New("failed to retrieve template") ErrFailedRetrieveTemplates = errors.New("failed to retrieve templates") - ErrNoTemplatesFound = errors.New("no templates found") ) type Service interface { ListObjects(ctx context.Context, spaceId string, offset int, limit int) ([]Object, int, bool, error) GetObject(ctx context.Context, spaceId string, objectId string) (Object, error) - DeleteObject(ctx context.Context, spaceId string, objectId string) error + DeleteObject(ctx context.Context, spaceId string, objectId string) (Object, error) CreateObject(ctx context.Context, spaceId string, request CreateObjectRequest) (Object, error) ListTypes(ctx context.Context, spaceId string, offset int, limit int) ([]ObjectType, int, bool, error) - ListTemplates(ctx context.Context, spaceId string, typeId string, offset int, limit int) ([]ObjectTemplate, int, bool, error) + ListTemplates(ctx context.Context, spaceId string, typeId string, offset int, limit int) ([]Template, int, bool, error) } type ObjectService struct { @@ -91,11 +88,7 @@ func (s *ObjectService) ListObjects(ctx context.Context, spaceId string, offset }) if resp.Error.Code != pb.RpcObjectSearchResponseError_NULL { - return nil, 0, false, ErrorFailedRetrieveObjects - } - - if len(resp.Records) == 0 { - return nil, 0, false, ErrNoObjectsFound + return nil, 0, false, ErrFailedRetrieveObjects } total = len(resp.Records) @@ -190,7 +183,7 @@ func (s *ObjectService) CreateObject(ctx context.Context, spaceId string, reques TemplateId: request.TemplateId, SpaceId: spaceId, ObjectTypeUniqueKey: request.ObjectTypeUniqueKey, - WithChat: request.WithChat, + WithChat: false, }) if resp.Error.Code != pb.RpcObjectCreateResponseError_NULL { @@ -296,10 +289,6 @@ func (s *ObjectService) ListTypes(ctx context.Context, spaceId string, offset in return nil, 0, false, ErrFailedRetrieveTypes } - if len(resp.Records) == 0 { - return nil, 0, false, ErrNoTypesFound - } - total = len(resp.Records) paginatedTypes, hasMore := pagination.Paginate(resp.Records, offset, limit) objectTypes := make([]ObjectType, 0, len(paginatedTypes)) @@ -318,7 +307,7 @@ func (s *ObjectService) ListTypes(ctx context.Context, spaceId string, offset in } // ListTemplates returns a paginated list of templates in a specific space. -func (s *ObjectService) ListTemplates(ctx context.Context, spaceId string, typeId string, offset int, limit int) (templates []ObjectTemplate, total int, hasMore bool, err error) { +func (s *ObjectService) ListTemplates(ctx context.Context, spaceId string, typeId string, offset int, limit int) (templates []Template, total int, hasMore bool, err error) { // First, determine the type ID of "ot-template" in the space templateTypeIdResp := s.mw.ObjectSearch(ctx, &pb.RpcObjectSearchRequest{ SpaceId: spaceId, @@ -358,10 +347,6 @@ func (s *ObjectService) ListTemplates(ctx context.Context, spaceId string, typeI return nil, 0, false, ErrFailedRetrieveTemplates } - if len(templateObjectsResp.Records) == 0 { - return nil, 0, false, ErrNoTemplatesFound - } - templateIds := make([]string, 0) for _, record := range templateObjectsResp.Records { if record.Fields[bundle.RelationKeyTargetObjectType.String()].GetStringValue() == typeId { @@ -371,7 +356,7 @@ func (s *ObjectService) ListTemplates(ctx context.Context, spaceId string, typeI total = len(templateIds) paginatedTemplates, hasMore := pagination.Paginate(templateIds, offset, limit) - templates = make([]ObjectTemplate, 0, len(paginatedTemplates)) + templates = make([]Template, 0, len(paginatedTemplates)) // Finally, open each template and populate the response for _, templateId := range paginatedTemplates { @@ -384,7 +369,7 @@ func (s *ObjectService) ListTemplates(ctx context.Context, spaceId string, typeI return nil, 0, false, ErrFailedRetrieveTemplate } - templates = append(templates, ObjectTemplate{ + templates = append(templates, Template{ Type: "object_template", Id: templateId, Name: templateResp.ObjectView.Details[0].Details.Fields[bundle.RelationKeyName.String()].GetStringValue(), diff --git a/core/api/services/object/service_test.go b/core/api/services/object/service_test.go index facee6692..ade0ecaca 100644 --- a/core/api/services/object/service_test.go +++ b/core/api/services/object/service_test.go @@ -220,7 +220,7 @@ func TestObjectService_ListObjects(t *testing.T) { objects, total, hasMore, err := fx.ListObjects(ctx, "empty-space", offset, limit) // then - require.ErrorIs(t, err, ErrNoObjectsFound) + require.NoError(t, err) require.Len(t, objects, 0) require.Equal(t, 0, total) require.False(t, hasMore) @@ -469,7 +469,6 @@ func TestObjectService_CreateObject(t *testing.T) { // TODO: use actual values TemplateId: "", ObjectTypeUniqueKey: "ot-page", - WithChat: false, }) // then @@ -553,7 +552,7 @@ func TestObjectService_ListTypes(t *testing.T) { types, total, hasMore, err := fx.ListTypes(ctx, "empty-space", offset, limit) // then - require.ErrorIs(t, err, ErrNoTypesFound) + require.NoError(t, err) require.Len(t, types, 0) require.Equal(t, 0, total) require.False(t, hasMore) diff --git a/core/api/services/search/handler.go b/core/api/services/search/handler.go index eb4528e94..d42c81a0b 100644 --- a/core/api/services/search/handler.go +++ b/core/api/services/search/handler.go @@ -6,24 +6,22 @@ import ( "github.com/gin-gonic/gin" "github.com/anyproto/anytype-heart/core/api/pagination" - "github.com/anyproto/anytype-heart/core/api/services/space" "github.com/anyproto/anytype-heart/core/api/util" ) // SearchHandler searches and retrieves objects across all the spaces // -// @Summary Search and retrieve objects across all the spaces +// @Summary Search objects across all spaces // @Tags search // @Accept json // @Produce json -// @Param query query string false "The search term to filter objects by name" -// @Param object_types query []string false "Specify object types for search" +// @Param query query string false "Search query" +// @Param object_types query []string false "Types to filter objects by" // @Param offset query int false "The number of items to skip before starting to collect the result set" // @Param limit query int false "The number of items to return" default(100) // @Success 200 {object} map[string][]object.Object "List of objects" -// @Failure 403 {object} util.UnauthorizedError "Unauthorized" -// @Failure 404 {object} util.NotFoundError "Resource not found" -// @Failure 502 {object} util.ServerError "Internal server error" +// @Failure 401 {object} util.UnauthorizedError "Unauthorized" +// @Failure 500 {object} util.ServerError "Internal server error" // @Router /search [get] func SearchHandler(s *SearchService) gin.HandlerFunc { return func(c *gin.Context) { @@ -34,9 +32,7 @@ func SearchHandler(s *SearchService) gin.HandlerFunc { objects, total, hasMore, err := s.Search(c, searchQuery, objectTypes, offset, limit) code := util.MapErrorCode(err, - util.ErrToCode(ErrNoObjectsFound, http.StatusNotFound), util.ErrToCode(ErrFailedSearchObjects, http.StatusInternalServerError), - util.ErrToCode(space.ErrNoSpacesFound, http.StatusNotFound), ) if code != http.StatusOK { diff --git a/core/api/services/search/service.go b/core/api/services/search/service.go index 8186758f6..a890bc032 100644 --- a/core/api/services/search/service.go +++ b/core/api/services/search/service.go @@ -19,7 +19,6 @@ import ( var ( ErrFailedSearchObjects = errors.New("failed to retrieve objects from space") - ErrNoObjectsFound = errors.New("no objects found") ) type Service interface { @@ -84,10 +83,6 @@ func (s *SearchService) Search(ctx context.Context, searchQuery string, objectTy } } - if len(results) == 0 { - return nil, 0, false, ErrNoObjectsFound - } - // sort after ISO 8601 last_modified_date to achieve descending sort order across all spaces sort.Slice(results, func(i, j int) bool { dateStrI := results[i].Details[0].Details["last_modified_date"].(string) diff --git a/core/api/services/space/handler.go b/core/api/services/space/handler.go index 54679d78f..394dd87ac 100644 --- a/core/api/services/space/handler.go +++ b/core/api/services/space/handler.go @@ -11,16 +11,15 @@ import ( // GetSpacesHandler retrieves a list of spaces // -// @Summary Retrieve a list of spaces +// @Summary List spaces // @Tags spaces // @Accept json // @Produce json // @Param offset query int false "The number of items to skip before starting to collect the result set" // @Param limit query int false "The number of items to return" default(100) // @Success 200 {object} pagination.PaginatedResponse[Space] "List of spaces" -// @Failure 403 {object} util.UnauthorizedError "Unauthorized" -// @Failure 404 {object} util.NotFoundError "Resource not found" -// @Failure 502 {object} util.ServerError "Internal server error" +// @Failure 401 {object} util.UnauthorizedError "Unauthorized" +// @Failure 500 {object} util.ServerError "Internal server error" // @Router /spaces [get] func GetSpacesHandler(s *SpaceService) gin.HandlerFunc { return func(c *gin.Context) { @@ -29,7 +28,6 @@ func GetSpacesHandler(s *SpaceService) gin.HandlerFunc { spaces, total, hasMore, err := s.ListSpaces(c.Request.Context(), offset, limit) code := util.MapErrorCode(err, - util.ErrToCode(ErrNoSpacesFound, http.StatusNotFound), util.ErrToCode(ErrFailedListSpaces, http.StatusInternalServerError), util.ErrToCode(ErrFailedOpenWorkspace, http.StatusInternalServerError), ) @@ -46,15 +44,15 @@ func GetSpacesHandler(s *SpaceService) gin.HandlerFunc { // CreateSpaceHandler creates a new space // -// @Summary Create a new Space +// @Summary Create space // @Tags spaces // @Accept json // @Produce json // @Param name body string true "Space Name" // @Success 200 {object} CreateSpaceResponse "Space created successfully" // @Failure 400 {object} util.ValidationError "Bad request" -// @Failure 403 {object} util.UnauthorizedError "Unauthorized" -// @Failure 502 {object} util.ServerError "Internal server error" +// @Failure 401 {object} util.UnauthorizedError "Unauthorized" +// @Failure 500 {object} util.ServerError "Internal server error" // @Router /spaces [post] func CreateSpaceHandler(s *SpaceService) gin.HandlerFunc { return func(c *gin.Context) { @@ -80,19 +78,18 @@ func CreateSpaceHandler(s *SpaceService) gin.HandlerFunc { } } -// GetMembersHandler retrieves a list of members for the specified space +// GetMembersHandler retrieves a list of members in a space // -// @Summary Retrieve a list of members for the specified Space +// @Summary List members // @Tags spaces // @Accept json // @Produce json -// @Param space_id path string true "The ID of the space" +// @Param space_id path string true "Space ID" // @Param offset query int false "The number of items to skip before starting to collect the result set" // @Param limit query int false "The number of items to return" default(100) // @Success 200 {object} pagination.PaginatedResponse[Member] "List of members" -// @Failure 403 {object} util.UnauthorizedError "Unauthorized" -// @Failure 404 {object} util.NotFoundError "Resource not found" -// @Failure 502 {object} util.ServerError "Internal server error" +// @Failure 401 {object} util.UnauthorizedError "Unauthorized" +// @Failure 500 {object} util.ServerError "Internal server error" // @Router /spaces/{space_id}/members [get] func GetMembersHandler(s *SpaceService) gin.HandlerFunc { return func(c *gin.Context) { @@ -102,7 +99,6 @@ func GetMembersHandler(s *SpaceService) gin.HandlerFunc { members, total, hasMore, err := s.ListMembers(c.Request.Context(), spaceId, offset, limit) code := util.MapErrorCode(err, - util.ErrToCode(ErrNoMembersFound, http.StatusNotFound), util.ErrToCode(ErrFailedListMembers, http.StatusInternalServerError), ) diff --git a/core/api/services/space/service.go b/core/api/services/space/service.go index f67cc2df2..9aff17913 100644 --- a/core/api/services/space/service.go +++ b/core/api/services/space/service.go @@ -18,13 +18,10 @@ import ( ) var ( - ErrNoSpacesFound = errors.New("no spaces found") ErrFailedListSpaces = errors.New("failed to retrieve list of spaces") ErrFailedOpenWorkspace = errors.New("failed to open workspace") ErrFailedGenerateRandomIcon = errors.New("failed to generate random icon") ErrFailedCreateSpace = errors.New("failed to create space") - ErrBadInput = errors.New("bad input") - ErrNoMembersFound = errors.New("no members found") ErrFailedListMembers = errors.New("failed to retrieve list of members") ) @@ -76,10 +73,6 @@ func (s *SpaceService) ListSpaces(ctx context.Context, offset int, limit int) (s return nil, 0, false, ErrFailedListSpaces } - if len(resp.Records) == 0 { - return nil, 0, false, ErrNoSpacesFound - } - total = len(resp.Records) paginatedRecords, hasMore := pagination.Paginate(resp.Records, offset, limit) spaces = make([]Space, 0, len(paginatedRecords)) @@ -158,10 +151,6 @@ func (s *SpaceService) ListMembers(ctx context.Context, spaceId string, offset i return nil, 0, false, ErrFailedListMembers } - if len(resp.Records) == 0 { - return nil, 0, false, ErrNoMembersFound - } - total = len(resp.Records) paginatedMembers, hasMore := pagination.Paginate(resp.Records, offset, limit) members = make([]Member, 0, len(paginatedMembers)) diff --git a/core/api/services/space/service_test.go b/core/api/services/space/service_test.go index 96802831b..d68a3cdce 100644 --- a/core/api/services/space/service_test.go +++ b/core/api/services/space/service_test.go @@ -146,7 +146,7 @@ func TestSpaceService_ListSpaces(t *testing.T) { spaces, total, hasMore, err := fx.ListSpaces(nil, offset, limit) // then - require.ErrorIs(t, err, ErrNoSpacesFound) + require.NoError(t, err) require.Len(t, spaces, 0) require.Equal(t, 0, total) require.False(t, hasMore) @@ -305,7 +305,7 @@ func TestSpaceService_ListMembers(t *testing.T) { members, total, hasMore, err := fx.ListMembers(nil, "space-id", offset, limit) // then - require.ErrorIs(t, err, ErrNoMembersFound) + require.NoError(t, err) require.Len(t, members, 0) require.Equal(t, 0, total) require.False(t, hasMore) diff --git a/core/api/util/error.go b/core/api/util/error.go index 543c81eb9..b7553f3fd 100644 --- a/core/api/util/error.go +++ b/core/api/util/error.go @@ -5,30 +5,41 @@ import ( "net/http" ) -type ServerError struct { - Error struct { - Message string `json:"message"` - } `json:"error"` -} - +// 400 type ValidationError struct { Error struct { Message string `json:"message"` } `json:"error"` } +// 401 type UnauthorizedError struct { Error struct { Message string `json:"message"` } `json:"error"` } +// 403 +type ForbiddenError struct { + Error struct { + Message string `json:"message"` + } `json:"error"` +} + +// 404 type NotFoundError struct { Error struct { Message string `json:"message"` } `json:"error"` } +// 500 +type ServerError struct { + Error struct { + Message string `json:"message"` + } `json:"error"` +} + type errCodeMapping struct { target error code int From 02aa30fa78dd1f6143e3a87353bf5ffdfcf318af Mon Sep 17 00:00:00 2001 From: Jannis Metrikat <120120832+jmetrikat@users.noreply.github.com> Date: Sun, 19 Jan 2025 19:37:29 +0100 Subject: [PATCH 124/195] GO-4459: Refactor object types --- core/api/docs/docs.go | 334 ++++++++++++++-------------- core/api/docs/swagger.json | 334 ++++++++++++++-------------- core/api/docs/swagger.yaml | 232 +++++++++---------- core/api/server/router.go | 4 +- core/api/services/auth/handler.go | 4 +- core/api/services/object/handler.go | 16 +- core/api/services/object/model.go | 8 +- core/api/services/object/service.go | 14 +- core/api/services/search/handler.go | 18 +- 9 files changed, 482 insertions(+), 482 deletions(-) diff --git a/core/api/docs/docs.go b/core/api/docs/docs.go index 2bdf7117e..410bc2b35 100644 --- a/core/api/docs/docs.go +++ b/core/api/docs/docs.go @@ -35,7 +35,7 @@ const docTemplate = `{ "tags": [ "auth" ], - "summary": "Start a new challenge", + "summary": "Start new challenge", "parameters": [ { "type": "string", @@ -78,7 +78,7 @@ const docTemplate = `{ "tags": [ "auth" ], - "summary": "Retrieve a token", + "summary": "Retrieve token", "parameters": [ { "type": "string", @@ -143,7 +143,7 @@ const docTemplate = `{ }, "collectionFormat": "csv", "description": "Types to filter objects by", - "name": "object_types", + "name": "types", "in": "query" }, { @@ -342,125 +342,6 @@ const docTemplate = `{ } } }, - "/spaces/{space_id}/object_types": { - "get": { - "consumes": [ - "application/json" - ], - "produces": [ - "application/json" - ], - "tags": [ - "objects" - ], - "summary": "List types", - "parameters": [ - { - "type": "string", - "description": "Space ID", - "name": "space_id", - "in": "path", - "required": true - }, - { - "type": "integer", - "description": "The number of items to skip before starting to collect the result set", - "name": "offset", - "in": "query" - }, - { - "type": "integer", - "default": 100, - "description": "The number of items to return", - "name": "limit", - "in": "query" - } - ], - "responses": { - "200": { - "description": "List of types", - "schema": { - "$ref": "#/definitions/pagination.PaginatedResponse-object_ObjectType" - } - }, - "401": { - "description": "Unauthorized", - "schema": { - "$ref": "#/definitions/util.UnauthorizedError" - } - }, - "500": { - "description": "Internal server error", - "schema": { - "$ref": "#/definitions/util.ServerError" - } - } - } - } - }, - "/spaces/{space_id}/object_types/{type_id}/templates": { - "get": { - "consumes": [ - "application/json" - ], - "produces": [ - "application/json" - ], - "tags": [ - "objects" - ], - "summary": "List templates", - "parameters": [ - { - "type": "string", - "description": "Space ID", - "name": "space_id", - "in": "path", - "required": true - }, - { - "type": "string", - "description": "Type ID", - "name": "type_id", - "in": "path", - "required": true - }, - { - "type": "integer", - "description": "The number of items to skip before starting to collect the result set", - "name": "offset", - "in": "query" - }, - { - "type": "integer", - "default": 100, - "description": "The number of items to return", - "name": "limit", - "in": "query" - } - ], - "responses": { - "200": { - "description": "List of templates", - "schema": { - "$ref": "#/definitions/pagination.PaginatedResponse-object_Template" - } - }, - "401": { - "description": "Unauthorized", - "schema": { - "$ref": "#/definitions/util.UnauthorizedError" - } - }, - "500": { - "description": "Internal server error", - "schema": { - "$ref": "#/definitions/util.ServerError" - } - } - } - } - }, "/spaces/{space_id}/objects": { "get": { "consumes": [ @@ -751,6 +632,125 @@ const docTemplate = `{ } } } + }, + "/spaces/{space_id}/types": { + "get": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "objects" + ], + "summary": "List types", + "parameters": [ + { + "type": "string", + "description": "Space ID", + "name": "space_id", + "in": "path", + "required": true + }, + { + "type": "integer", + "description": "The number of items to skip before starting to collect the result set", + "name": "offset", + "in": "query" + }, + { + "type": "integer", + "default": 100, + "description": "The number of items to return", + "name": "limit", + "in": "query" + } + ], + "responses": { + "200": { + "description": "List of types", + "schema": { + "$ref": "#/definitions/pagination.PaginatedResponse-object_Type" + } + }, + "401": { + "description": "Unauthorized", + "schema": { + "$ref": "#/definitions/util.UnauthorizedError" + } + }, + "500": { + "description": "Internal server error", + "schema": { + "$ref": "#/definitions/util.ServerError" + } + } + } + } + }, + "/spaces/{space_id}/types/{type_id}/templates": { + "get": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "objects" + ], + "summary": "List templates", + "parameters": [ + { + "type": "string", + "description": "Space ID", + "name": "space_id", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "Type ID", + "name": "type_id", + "in": "path", + "required": true + }, + { + "type": "integer", + "description": "The number of items to skip before starting to collect the result set", + "name": "offset", + "in": "query" + }, + { + "type": "integer", + "default": 100, + "description": "The number of items to return", + "name": "limit", + "in": "query" + } + ], + "responses": { + "200": { + "description": "List of templates", + "schema": { + "$ref": "#/definitions/pagination.PaginatedResponse-object_Template" + } + }, + "401": { + "description": "Unauthorized", + "schema": { + "$ref": "#/definitions/util.UnauthorizedError" + } + }, + "500": { + "description": "Internal server error", + "schema": { + "$ref": "#/definitions/util.ServerError" + } + } + } + } } }, "definitions": { @@ -941,35 +941,6 @@ const docTemplate = `{ } } }, - "object.ObjectType": { - "type": "object", - "properties": { - "icon": { - "type": "string", - "example": "📄" - }, - "id": { - "type": "string", - "example": "bafyreigyb6l5szohs32ts26ku2j42yd65e6hqy2u3gtzgdwqv6hzftsetu" - }, - "name": { - "type": "string", - "example": "Page" - }, - "recommended_layout": { - "type": "string", - "example": "todo" - }, - "type": { - "type": "string", - "example": "object_type" - }, - "unique_key": { - "type": "string", - "example": "ot-page" - } - } - }, "object.Template": { "type": "object", "properties": { @@ -983,11 +954,11 @@ const docTemplate = `{ }, "name": { "type": "string", - "example": "Object Template Name" + "example": "Template Name" }, "type": { "type": "string", - "example": "object_template" + "example": "template" } } }, @@ -1011,6 +982,35 @@ const docTemplate = `{ } } }, + "object.Type": { + "type": "object", + "properties": { + "icon": { + "type": "string", + "example": "📄" + }, + "id": { + "type": "string", + "example": "bafyreigyb6l5szohs32ts26ku2j42yd65e6hqy2u3gtzgdwqv6hzftsetu" + }, + "name": { + "type": "string", + "example": "Page" + }, + "recommended_layout": { + "type": "string", + "example": "todo" + }, + "type": { + "type": "string", + "example": "type" + }, + "unique_key": { + "type": "string", + "example": "ot-page" + } + } + }, "pagination.PaginatedResponse-object_Object": { "type": "object", "properties": { @@ -1025,20 +1025,6 @@ const docTemplate = `{ } } }, - "pagination.PaginatedResponse-object_ObjectType": { - "type": "object", - "properties": { - "data": { - "type": "array", - "items": { - "$ref": "#/definitions/object.ObjectType" - } - }, - "pagination": { - "$ref": "#/definitions/pagination.PaginationMeta" - } - } - }, "pagination.PaginatedResponse-object_Template": { "type": "object", "properties": { @@ -1053,6 +1039,20 @@ const docTemplate = `{ } } }, + "pagination.PaginatedResponse-object_Type": { + "type": "object", + "properties": { + "data": { + "type": "array", + "items": { + "$ref": "#/definitions/object.Type" + } + }, + "pagination": { + "$ref": "#/definitions/pagination.PaginationMeta" + } + } + }, "pagination.PaginatedResponse-space_Member": { "type": "object", "properties": { diff --git a/core/api/docs/swagger.json b/core/api/docs/swagger.json index 9097f49b4..7b10f8788 100644 --- a/core/api/docs/swagger.json +++ b/core/api/docs/swagger.json @@ -29,7 +29,7 @@ "tags": [ "auth" ], - "summary": "Start a new challenge", + "summary": "Start new challenge", "parameters": [ { "type": "string", @@ -72,7 +72,7 @@ "tags": [ "auth" ], - "summary": "Retrieve a token", + "summary": "Retrieve token", "parameters": [ { "type": "string", @@ -137,7 +137,7 @@ }, "collectionFormat": "csv", "description": "Types to filter objects by", - "name": "object_types", + "name": "types", "in": "query" }, { @@ -336,125 +336,6 @@ } } }, - "/spaces/{space_id}/object_types": { - "get": { - "consumes": [ - "application/json" - ], - "produces": [ - "application/json" - ], - "tags": [ - "objects" - ], - "summary": "List types", - "parameters": [ - { - "type": "string", - "description": "Space ID", - "name": "space_id", - "in": "path", - "required": true - }, - { - "type": "integer", - "description": "The number of items to skip before starting to collect the result set", - "name": "offset", - "in": "query" - }, - { - "type": "integer", - "default": 100, - "description": "The number of items to return", - "name": "limit", - "in": "query" - } - ], - "responses": { - "200": { - "description": "List of types", - "schema": { - "$ref": "#/definitions/pagination.PaginatedResponse-object_ObjectType" - } - }, - "401": { - "description": "Unauthorized", - "schema": { - "$ref": "#/definitions/util.UnauthorizedError" - } - }, - "500": { - "description": "Internal server error", - "schema": { - "$ref": "#/definitions/util.ServerError" - } - } - } - } - }, - "/spaces/{space_id}/object_types/{type_id}/templates": { - "get": { - "consumes": [ - "application/json" - ], - "produces": [ - "application/json" - ], - "tags": [ - "objects" - ], - "summary": "List templates", - "parameters": [ - { - "type": "string", - "description": "Space ID", - "name": "space_id", - "in": "path", - "required": true - }, - { - "type": "string", - "description": "Type ID", - "name": "type_id", - "in": "path", - "required": true - }, - { - "type": "integer", - "description": "The number of items to skip before starting to collect the result set", - "name": "offset", - "in": "query" - }, - { - "type": "integer", - "default": 100, - "description": "The number of items to return", - "name": "limit", - "in": "query" - } - ], - "responses": { - "200": { - "description": "List of templates", - "schema": { - "$ref": "#/definitions/pagination.PaginatedResponse-object_Template" - } - }, - "401": { - "description": "Unauthorized", - "schema": { - "$ref": "#/definitions/util.UnauthorizedError" - } - }, - "500": { - "description": "Internal server error", - "schema": { - "$ref": "#/definitions/util.ServerError" - } - } - } - } - }, "/spaces/{space_id}/objects": { "get": { "consumes": [ @@ -745,6 +626,125 @@ } } } + }, + "/spaces/{space_id}/types": { + "get": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "objects" + ], + "summary": "List types", + "parameters": [ + { + "type": "string", + "description": "Space ID", + "name": "space_id", + "in": "path", + "required": true + }, + { + "type": "integer", + "description": "The number of items to skip before starting to collect the result set", + "name": "offset", + "in": "query" + }, + { + "type": "integer", + "default": 100, + "description": "The number of items to return", + "name": "limit", + "in": "query" + } + ], + "responses": { + "200": { + "description": "List of types", + "schema": { + "$ref": "#/definitions/pagination.PaginatedResponse-object_Type" + } + }, + "401": { + "description": "Unauthorized", + "schema": { + "$ref": "#/definitions/util.UnauthorizedError" + } + }, + "500": { + "description": "Internal server error", + "schema": { + "$ref": "#/definitions/util.ServerError" + } + } + } + } + }, + "/spaces/{space_id}/types/{type_id}/templates": { + "get": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "objects" + ], + "summary": "List templates", + "parameters": [ + { + "type": "string", + "description": "Space ID", + "name": "space_id", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "Type ID", + "name": "type_id", + "in": "path", + "required": true + }, + { + "type": "integer", + "description": "The number of items to skip before starting to collect the result set", + "name": "offset", + "in": "query" + }, + { + "type": "integer", + "default": 100, + "description": "The number of items to return", + "name": "limit", + "in": "query" + } + ], + "responses": { + "200": { + "description": "List of templates", + "schema": { + "$ref": "#/definitions/pagination.PaginatedResponse-object_Template" + } + }, + "401": { + "description": "Unauthorized", + "schema": { + "$ref": "#/definitions/util.UnauthorizedError" + } + }, + "500": { + "description": "Internal server error", + "schema": { + "$ref": "#/definitions/util.ServerError" + } + } + } + } } }, "definitions": { @@ -935,35 +935,6 @@ } } }, - "object.ObjectType": { - "type": "object", - "properties": { - "icon": { - "type": "string", - "example": "📄" - }, - "id": { - "type": "string", - "example": "bafyreigyb6l5szohs32ts26ku2j42yd65e6hqy2u3gtzgdwqv6hzftsetu" - }, - "name": { - "type": "string", - "example": "Page" - }, - "recommended_layout": { - "type": "string", - "example": "todo" - }, - "type": { - "type": "string", - "example": "object_type" - }, - "unique_key": { - "type": "string", - "example": "ot-page" - } - } - }, "object.Template": { "type": "object", "properties": { @@ -977,11 +948,11 @@ }, "name": { "type": "string", - "example": "Object Template Name" + "example": "Template Name" }, "type": { "type": "string", - "example": "object_template" + "example": "template" } } }, @@ -1005,6 +976,35 @@ } } }, + "object.Type": { + "type": "object", + "properties": { + "icon": { + "type": "string", + "example": "📄" + }, + "id": { + "type": "string", + "example": "bafyreigyb6l5szohs32ts26ku2j42yd65e6hqy2u3gtzgdwqv6hzftsetu" + }, + "name": { + "type": "string", + "example": "Page" + }, + "recommended_layout": { + "type": "string", + "example": "todo" + }, + "type": { + "type": "string", + "example": "type" + }, + "unique_key": { + "type": "string", + "example": "ot-page" + } + } + }, "pagination.PaginatedResponse-object_Object": { "type": "object", "properties": { @@ -1019,20 +1019,6 @@ } } }, - "pagination.PaginatedResponse-object_ObjectType": { - "type": "object", - "properties": { - "data": { - "type": "array", - "items": { - "$ref": "#/definitions/object.ObjectType" - } - }, - "pagination": { - "$ref": "#/definitions/pagination.PaginationMeta" - } - } - }, "pagination.PaginatedResponse-object_Template": { "type": "object", "properties": { @@ -1047,6 +1033,20 @@ } } }, + "pagination.PaginatedResponse-object_Type": { + "type": "object", + "properties": { + "data": { + "type": "array", + "items": { + "$ref": "#/definitions/object.Type" + } + }, + "pagination": { + "$ref": "#/definitions/pagination.PaginationMeta" + } + } + }, "pagination.PaginatedResponse-space_Member": { "type": "object", "properties": { diff --git a/core/api/docs/swagger.yaml b/core/api/docs/swagger.yaml index a77e2874e..02ee8d3c0 100644 --- a/core/api/docs/swagger.yaml +++ b/core/api/docs/swagger.yaml @@ -126,27 +126,6 @@ definitions: object: $ref: '#/definitions/object.Object' type: object - object.ObjectType: - properties: - icon: - example: "\U0001F4C4" - type: string - id: - example: bafyreigyb6l5szohs32ts26ku2j42yd65e6hqy2u3gtzgdwqv6hzftsetu - type: string - name: - example: Page - type: string - recommended_layout: - example: todo - type: string - type: - example: object_type - type: string - unique_key: - example: ot-page - type: string - type: object object.Template: properties: icon: @@ -156,10 +135,10 @@ definitions: example: bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5uutge type: string name: - example: Object Template Name + example: Template Name type: string type: - example: object_template + example: template type: string type: object object.Text: @@ -175,6 +154,27 @@ definitions: text: type: string type: object + object.Type: + properties: + icon: + example: "\U0001F4C4" + type: string + id: + example: bafyreigyb6l5szohs32ts26ku2j42yd65e6hqy2u3gtzgdwqv6hzftsetu + type: string + name: + example: Page + type: string + recommended_layout: + example: todo + type: string + type: + example: type + type: string + unique_key: + example: ot-page + type: string + type: object pagination.PaginatedResponse-object_Object: properties: data: @@ -184,15 +184,6 @@ definitions: pagination: $ref: '#/definitions/pagination.PaginationMeta' type: object - pagination.PaginatedResponse-object_ObjectType: - properties: - data: - items: - $ref: '#/definitions/object.ObjectType' - type: array - pagination: - $ref: '#/definitions/pagination.PaginationMeta' - type: object pagination.PaginatedResponse-object_Template: properties: data: @@ -202,6 +193,15 @@ definitions: pagination: $ref: '#/definitions/pagination.PaginationMeta' type: object + pagination.PaginatedResponse-object_Type: + properties: + data: + items: + $ref: '#/definitions/object.Type' + type: array + pagination: + $ref: '#/definitions/pagination.PaginationMeta' + type: object pagination.PaginatedResponse-space_Member: properties: data: @@ -411,7 +411,7 @@ paths: description: Internal server error schema: $ref: '#/definitions/util.ServerError' - summary: Start a new challenge + summary: Start new challenge tags: - auth /auth/token: @@ -444,7 +444,7 @@ paths: description: Internal server error schema: $ref: '#/definitions/util.ServerError' - summary: Retrieve a token + summary: Retrieve token tags: - auth /search: @@ -461,7 +461,7 @@ paths: in: query items: type: string - name: object_types + name: types type: array - description: The number of items to skip before starting to collect the result set @@ -598,87 +598,6 @@ paths: summary: List members tags: - spaces - /spaces/{space_id}/object_types: - get: - consumes: - - application/json - parameters: - - description: Space ID - in: path - name: space_id - required: true - type: string - - description: The number of items to skip before starting to collect the result - set - in: query - name: offset - type: integer - - default: 100 - description: The number of items to return - in: query - name: limit - type: integer - produces: - - application/json - responses: - "200": - description: List of types - schema: - $ref: '#/definitions/pagination.PaginatedResponse-object_ObjectType' - "401": - description: Unauthorized - schema: - $ref: '#/definitions/util.UnauthorizedError' - "500": - description: Internal server error - schema: - $ref: '#/definitions/util.ServerError' - summary: List types - tags: - - objects - /spaces/{space_id}/object_types/{type_id}/templates: - get: - consumes: - - application/json - parameters: - - description: Space ID - in: path - name: space_id - required: true - type: string - - description: Type ID - in: path - name: type_id - required: true - type: string - - description: The number of items to skip before starting to collect the result - set - in: query - name: offset - type: integer - - default: 100 - description: The number of items to return - in: query - name: limit - type: integer - produces: - - application/json - responses: - "200": - description: List of templates - schema: - $ref: '#/definitions/pagination.PaginatedResponse-object_Template' - "401": - description: Unauthorized - schema: - $ref: '#/definitions/util.UnauthorizedError' - "500": - description: Internal server error - schema: - $ref: '#/definitions/util.ServerError' - summary: List templates - tags: - - objects /spaces/{space_id}/objects: get: consumes: @@ -873,6 +792,87 @@ paths: summary: Export object tags: - export + /spaces/{space_id}/types: + get: + consumes: + - application/json + parameters: + - description: Space ID + in: path + name: space_id + required: true + type: string + - description: The number of items to skip before starting to collect the result + set + in: query + name: offset + type: integer + - default: 100 + description: The number of items to return + in: query + name: limit + type: integer + produces: + - application/json + responses: + "200": + description: List of types + schema: + $ref: '#/definitions/pagination.PaginatedResponse-object_Type' + "401": + description: Unauthorized + schema: + $ref: '#/definitions/util.UnauthorizedError' + "500": + description: Internal server error + schema: + $ref: '#/definitions/util.ServerError' + summary: List types + tags: + - objects + /spaces/{space_id}/types/{type_id}/templates: + get: + consumes: + - application/json + parameters: + - description: Space ID + in: path + name: space_id + required: true + type: string + - description: Type ID + in: path + name: type_id + required: true + type: string + - description: The number of items to skip before starting to collect the result + set + in: query + name: offset + type: integer + - default: 100 + description: The number of items to return + in: query + name: limit + type: integer + produces: + - application/json + responses: + "200": + description: List of templates + schema: + $ref: '#/definitions/pagination.PaginatedResponse-object_Template' + "401": + description: Unauthorized + schema: + $ref: '#/definitions/util.UnauthorizedError' + "500": + description: Internal server error + schema: + $ref: '#/definitions/util.ServerError' + summary: List templates + tags: + - objects securityDefinitions: BasicAuth: type: basic diff --git a/core/api/server/router.go b/core/api/server/router.go index 8927be027..8241b3643 100644 --- a/core/api/server/router.go +++ b/core/api/server/router.go @@ -53,8 +53,8 @@ func (s *Server) NewRouter(a *app.App) *gin.Engine { v1.GET("/spaces/:space_id/objects", object.GetObjectsHandler(s.objectService)) v1.GET("/spaces/:space_id/objects/:object_id", object.GetObjectHandler(s.objectService)) v1.DELETE("/spaces/:space_id/objects/:object_id", s.rateLimit(maxWriteRequestsPerSecond), object.DeleteObjectHandler(s.objectService)) - v1.GET("/spaces/:space_id/object_types", object.GetTypesHandler(s.objectService)) - v1.GET("/spaces/:space_id/object_types/:type_id/templates", object.GetTemplatesHandler(s.objectService)) + v1.GET("/spaces/:space_id/types", object.GetTypesHandler(s.objectService)) + v1.GET("/spaces/:space_id/types/:type_id/templates", object.GetTemplatesHandler(s.objectService)) v1.POST("/spaces/:space_id/objects", s.rateLimit(maxWriteRequestsPerSecond), object.CreateObjectHandler(s.objectService)) // Search diff --git a/core/api/services/auth/handler.go b/core/api/services/auth/handler.go index 5bc8b93db..21900c994 100644 --- a/core/api/services/auth/handler.go +++ b/core/api/services/auth/handler.go @@ -10,7 +10,7 @@ import ( // DisplayCodeHandler starts a new challenge and returns the challenge ID // -// @Summary Start a new challenge +// @Summary Start new challenge // @Tags auth // @Accept json // @Produce json @@ -40,7 +40,7 @@ func DisplayCodeHandler(s *AuthService) gin.HandlerFunc { // TokenHandler retrieves an authentication token using a code and challenge ID // -// @Summary Retrieve a token +// @Summary Retrieve token // @Tags auth // @Accept json // @Produce json diff --git a/core/api/services/object/handler.go b/core/api/services/object/handler.go index 342ac89d4..6951c6090 100644 --- a/core/api/services/object/handler.go +++ b/core/api/services/object/handler.go @@ -165,13 +165,13 @@ func CreateObjectHandler(s *ObjectService) gin.HandlerFunc { // @Tags objects // @Accept json // @Produce json -// @Param space_id path string true "Space ID" -// @Param offset query int false "The number of items to skip before starting to collect the result set" -// @Param limit query int false "The number of items to return" default(100) -// @Success 200 {object} pagination.PaginatedResponse[ObjectType] "List of types" -// @Failure 401 {object} util.UnauthorizedError "Unauthorized" -// @Failure 500 {object} util.ServerError "Internal server error" -// @Router /spaces/{space_id}/object_types [get] +// @Param space_id path string true "Space ID" +// @Param offset query int false "The number of items to skip before starting to collect the result set" +// @Param limit query int false "The number of items to return" default(100) +// @Success 200 {object} pagination.PaginatedResponse[Type] "List of types" +// @Failure 401 {object} util.UnauthorizedError "Unauthorized" +// @Failure 500 {object} util.ServerError "Internal server error" +// @Router /spaces/{space_id}/types [get] func GetTypesHandler(s *ObjectService) gin.HandlerFunc { return func(c *gin.Context) { spaceId := c.Param("space_id") @@ -206,7 +206,7 @@ func GetTypesHandler(s *ObjectService) gin.HandlerFunc { // @Success 200 {object} pagination.PaginatedResponse[Template] "List of templates" // @Failure 401 {object} util.UnauthorizedError "Unauthorized" // @Failure 500 {object} util.ServerError "Internal server error" -// @Router /spaces/{space_id}/object_types/{type_id}/templates [get] +// @Router /spaces/{space_id}/types/{type_id}/templates [get] func GetTemplatesHandler(s *ObjectService) gin.HandlerFunc { return func(c *gin.Context) { spaceId := c.Param("space_id") diff --git a/core/api/services/object/model.go b/core/api/services/object/model.go index bff10c927..0ecb4e98b 100644 --- a/core/api/services/object/model.go +++ b/core/api/services/object/model.go @@ -68,8 +68,8 @@ type Tag struct { Color string `json:"color" example:"yellow"` } -type ObjectType struct { - Type string `json:"type" example:"object_type"` +type Type struct { + Type string `json:"type" example:"type"` Id string `json:"id" example:"bafyreigyb6l5szohs32ts26ku2j42yd65e6hqy2u3gtzgdwqv6hzftsetu"` UniqueKey string `json:"unique_key" example:"ot-page"` Name string `json:"name" example:"Page"` @@ -78,8 +78,8 @@ type ObjectType struct { } type Template struct { - Type string `json:"type" example:"object_template"` + Type string `json:"type" example:"template"` Id string `json:"id" example:"bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5uutge"` - Name string `json:"name" example:"Object Template Name"` + Name string `json:"name" example:"Template Name"` Icon string `json:"icon" example:"📄"` } diff --git a/core/api/services/object/service.go b/core/api/services/object/service.go index 50ee8a6e3..87d5b6a4b 100644 --- a/core/api/services/object/service.go +++ b/core/api/services/object/service.go @@ -39,7 +39,7 @@ type Service interface { GetObject(ctx context.Context, spaceId string, objectId string) (Object, error) DeleteObject(ctx context.Context, spaceId string, objectId string) (Object, error) CreateObject(ctx context.Context, spaceId string, request CreateObjectRequest) (Object, error) - ListTypes(ctx context.Context, spaceId string, offset int, limit int) ([]ObjectType, int, bool, error) + ListTypes(ctx context.Context, spaceId string, offset int, limit int) ([]Type, int, bool, error) ListTemplates(ctx context.Context, spaceId string, typeId string, offset int, limit int) ([]Template, int, bool, error) } @@ -261,7 +261,7 @@ func (s *ObjectService) CreateObject(ctx context.Context, spaceId string, reques } // ListTypes returns a paginated list of types in a specific space. -func (s *ObjectService) ListTypes(ctx context.Context, spaceId string, offset int, limit int) (types []ObjectType, total int, hasMore bool, err error) { +func (s *ObjectService) ListTypes(ctx context.Context, spaceId string, offset int, limit int) (types []Type, total int, hasMore bool, err error) { resp := s.mw.ObjectSearch(ctx, &pb.RpcObjectSearchRequest{ SpaceId: spaceId, Filters: []*model.BlockContentDataviewFilter{ @@ -291,11 +291,11 @@ func (s *ObjectService) ListTypes(ctx context.Context, spaceId string, offset in total = len(resp.Records) paginatedTypes, hasMore := pagination.Paginate(resp.Records, offset, limit) - objectTypes := make([]ObjectType, 0, len(paginatedTypes)) + types = make([]Type, 0, len(paginatedTypes)) for _, record := range paginatedTypes { - objectTypes = append(objectTypes, ObjectType{ - Type: "object_type", + types = append(types, Type{ + Type: "type", Id: record.Fields[bundle.RelationKeyId.String()].GetStringValue(), UniqueKey: record.Fields[bundle.RelationKeyUniqueKey.String()].GetStringValue(), Name: record.Fields[bundle.RelationKeyName.String()].GetStringValue(), @@ -303,7 +303,7 @@ func (s *ObjectService) ListTypes(ctx context.Context, spaceId string, offset in RecommendedLayout: model.ObjectTypeLayout_name[int32(record.Fields[bundle.RelationKeyRecommendedLayout.String()].GetNumberValue())], }) } - return objectTypes, total, hasMore, nil + return types, total, hasMore, nil } // ListTemplates returns a paginated list of templates in a specific space. @@ -370,7 +370,7 @@ func (s *ObjectService) ListTemplates(ctx context.Context, spaceId string, typeI } templates = append(templates, Template{ - Type: "object_template", + Type: "template", Id: templateId, Name: templateResp.ObjectView.Details[0].Details.Fields[bundle.RelationKeyName.String()].GetStringValue(), Icon: templateResp.ObjectView.Details[0].Details.Fields[bundle.RelationKeyIconEmoji.String()].GetStringValue(), diff --git a/core/api/services/search/handler.go b/core/api/services/search/handler.go index d42c81a0b..ee331c843 100644 --- a/core/api/services/search/handler.go +++ b/core/api/services/search/handler.go @@ -9,24 +9,24 @@ import ( "github.com/anyproto/anytype-heart/core/api/util" ) -// SearchHandler searches and retrieves objects across all the spaces +// SearchHandler searches and retrieves objects across all spaces // // @Summary Search objects across all spaces // @Tags search // @Accept json // @Produce json -// @Param query query string false "Search query" -// @Param object_types query []string false "Types to filter objects by" -// @Param offset query int false "The number of items to skip before starting to collect the result set" -// @Param limit query int false "The number of items to return" default(100) -// @Success 200 {object} map[string][]object.Object "List of objects" -// @Failure 401 {object} util.UnauthorizedError "Unauthorized" -// @Failure 500 {object} util.ServerError "Internal server error" +// @Param query query string false "Search query" +// @Param types query []string false "Types to filter objects by" +// @Param offset query int false "The number of items to skip before starting to collect the result set" +// @Param limit query int false "The number of items to return" default(100) +// @Success 200 {object} map[string][]object.Object "List of objects" +// @Failure 401 {object} util.UnauthorizedError "Unauthorized" +// @Failure 500 {object} util.ServerError "Internal server error" // @Router /search [get] func SearchHandler(s *SearchService) gin.HandlerFunc { return func(c *gin.Context) { searchQuery := c.Query("query") - objectTypes := c.QueryArray("object_types") + objectTypes := c.QueryArray("types") offset := c.GetInt("offset") limit := c.GetInt("limit") From 7cfea102b1b0fcd673c14a0a129f43ed4f880013 Mon Sep 17 00:00:00 2001 From: Jannis Metrikat <120120832+jmetrikat@users.noreply.github.com> Date: Mon, 20 Jan 2025 00:35:03 +0100 Subject: [PATCH 125/195] GO-4459: Improve search performance --- core/api/services/object/service.go | 6 +-- core/api/services/search/service.go | 66 +++++++++++++++--------- core/api/services/search/service_test.go | 9 ++-- 3 files changed, 48 insertions(+), 33 deletions(-) diff --git a/core/api/services/object/service.go b/core/api/services/object/service.go index 87d5b6a4b..2956900b9 100644 --- a/core/api/services/object/service.go +++ b/core/api/services/object/service.go @@ -80,11 +80,7 @@ func (s *ObjectService) ListObjects(ctx context.Context, spaceId string, offset IncludeTime: true, EmptyPlacement: model.BlockContentDataviewSort_NotSpecified, }}, - FullText: "", - Offset: 0, - Limit: 0, - ObjectTypeFilter: []string{}, - Keys: []string{bundle.RelationKeyId.String(), bundle.RelationKeyName.String()}, + Keys: []string{bundle.RelationKeyId.String(), bundle.RelationKeyName.String()}, }) if resp.Error.Code != pb.RpcObjectSearchResponseError_NULL { diff --git a/core/api/services/search/service.go b/core/api/services/search/service.go index a890bc032..3fe671b54 100644 --- a/core/api/services/search/service.go +++ b/core/api/services/search/service.go @@ -18,11 +18,12 @@ import ( ) var ( + spaceLimit = 64 ErrFailedSearchObjects = errors.New("failed to retrieve objects from space") ) type Service interface { - Search(ctx context.Context, searchQuery string, objectTypes []string, offset, limit int) (objects []object.Object, total int, hasMore bool, err error) + Search(ctx context.Context, searchQuery string, types []string, offset, limit int) (objects []object.Object, total int, hasMore bool, err error) } type SearchService struct { @@ -37,8 +38,8 @@ func NewService(mw service.ClientCommandsServer, spaceService *space.SpaceServic } // Search retrieves a paginated list of objects from all spaces that match the search parameters. -func (s *SearchService) Search(ctx context.Context, searchQuery string, objectTypes []string, offset, limit int) (objects []object.Object, total int, hasMore bool, err error) { - spaces, _, _, err := s.spaceService.ListSpaces(ctx, 0, 100) +func (s *SearchService) Search(ctx context.Context, searchQuery string, types []string, offset, limit int) (objects []object.Object, total int, hasMore bool, err error) { + spaces, _, _, err := s.spaceService.ListSpaces(ctx, 0, spaceLimit) if err != nil { return nil, 0, false, err } @@ -46,11 +47,11 @@ func (s *SearchService) Search(ctx context.Context, searchQuery string, objectTy baseFilters := s.prepareBaseFilters() queryFilters := s.prepareQueryFilter(searchQuery) - results := make([]object.Object, 0) + allResponses := make([]*pb.RpcObjectSearchResponse, 0, len(spaces)) for _, space := range spaces { // Resolve object type IDs per space, as they are unique per space - objectTypeFilters := s.prepareObjectTypeFilters(space.Id, objectTypes) - filters := s.combineFilters(model.BlockContentDataviewFilter_And, baseFilters, queryFilters, objectTypeFilters) + typeFilters := s.prepareObjectTypeFilters(space.Id, types) + filters := s.combineFilters(model.BlockContentDataviewFilter_And, baseFilters, queryFilters, typeFilters) objResp := s.mw.ObjectSearch(ctx, &pb.RpcObjectSearchRequest{ SpaceId: space.Id, @@ -62,37 +63,54 @@ func (s *SearchService) Search(ctx context.Context, searchQuery string, objectTy IncludeTime: true, EmptyPlacement: model.BlockContentDataviewSort_NotSpecified, }}, - Keys: []string{bundle.RelationKeyId.String(), bundle.RelationKeyName.String()}, - Limit: int32(limit), // nolint: gosec + Keys: []string{bundle.RelationKeyId.String(), bundle.RelationKeyLastModifiedDate.String(), bundle.RelationKeySpaceId.String()}, + Limit: int32(offset + limit), // nolint: gosec }) if objResp.Error.Code != pb.RpcObjectSearchResponseError_NULL { return nil, 0, false, ErrFailedSearchObjects } - if len(objResp.Records) == 0 { - continue - } + allResponses = append(allResponses, objResp) + } + combinedRecords := make([]struct { + Id string + SpaceId string + LastModifiedDate float64 + }, 0) + for _, objResp := range allResponses { for _, record := range objResp.Records { - object, err := s.objectService.GetObject(ctx, space.Id, record.Fields[bundle.RelationKeyId.String()].GetStringValue()) - if err != nil { - return nil, 0, false, err - } - results = append(results, object) + combinedRecords = append(combinedRecords, struct { + Id string + SpaceId string + LastModifiedDate float64 + }{ + Id: record.Fields[bundle.RelationKeyId.String()].GetStringValue(), + SpaceId: record.Fields[bundle.RelationKeySpaceId.String()].GetStringValue(), + LastModifiedDate: record.Fields[bundle.RelationKeyLastModifiedDate.String()].GetNumberValue(), + }) } } - // sort after ISO 8601 last_modified_date to achieve descending sort order across all spaces - sort.Slice(results, func(i, j int) bool { - dateStrI := results[i].Details[0].Details["last_modified_date"].(string) - dateStrJ := results[j].Details[0].Details["last_modified_date"].(string) - return dateStrI > dateStrJ + // sort after posix last_modified_date to achieve descending sort order across all spaces + sort.Slice(combinedRecords, func(i, j int) bool { + return combinedRecords[i].LastModifiedDate > combinedRecords[j].LastModifiedDate }) - total = len(results) - paginatedResults, hasMore := pagination.Paginate(results, offset, limit) - return paginatedResults, total, hasMore, nil + total = len(combinedRecords) + paginatedRecords, hasMore := pagination.Paginate(combinedRecords, offset, limit) + + results := make([]object.Object, 0, len(paginatedRecords)) + for _, record := range paginatedRecords { + object, err := s.objectService.GetObject(ctx, record.SpaceId, record.Id) + if err != nil { + return nil, 0, false, err + } + results = append(results, object) + } + + return results, total, hasMore, nil } // makeAndCondition combines multiple filter groups with the given operator. diff --git a/core/api/services/search/service_test.go b/core/api/services/search/service_test.go index 6de749d3e..338cfc614 100644 --- a/core/api/services/search/service_test.go +++ b/core/api/services/search/service_test.go @@ -157,14 +157,15 @@ func TestSearchService_Search(t *testing.T) { IncludeTime: true, EmptyPlacement: model.BlockContentDataviewSort_NotSpecified, }}, - Keys: []string{bundle.RelationKeyId.String(), bundle.RelationKeyName.String()}, - Limit: int32(limit), + Keys: []string{bundle.RelationKeyId.String(), bundle.RelationKeyLastModifiedDate.String(), bundle.RelationKeySpaceId.String()}, + Limit: int32(offset + limit), }).Return(&pb.RpcObjectSearchResponse{ Records: []*types.Struct{ { Fields: map[string]*types.Value{ - bundle.RelationKeyId.String(): pbtypes.String("obj-global-1"), - bundle.RelationKeyName.String(): pbtypes.String("Global Object"), + bundle.RelationKeyId.String(): pbtypes.String("obj-global-1"), + bundle.RelationKeyName.String(): pbtypes.String("Global Object"), + bundle.RelationKeySpaceId.String(): pbtypes.String("space-1"), }, }, }, From 388655cdb89e7500f737eefc617f3dd3304a5235 Mon Sep 17 00:00:00 2001 From: Jannis Metrikat <120120832+jmetrikat@users.noreply.github.com> Date: Mon, 20 Jan 2025 00:49:16 +0100 Subject: [PATCH 126/195] GO-4459: Fix test --- core/api/services/object/service_test.go | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/core/api/services/object/service_test.go b/core/api/services/object/service_test.go index ade0ecaca..f5ec97b8a 100644 --- a/core/api/services/object/service_test.go +++ b/core/api/services/object/service_test.go @@ -78,11 +78,7 @@ func TestObjectService_ListObjects(t *testing.T) { IncludeTime: true, EmptyPlacement: model.BlockContentDataviewSort_NotSpecified, }}, - FullText: "", - Offset: 0, - Limit: 0, - ObjectTypeFilter: []string{}, - Keys: []string{bundle.RelationKeyId.String(), bundle.RelationKeyName.String()}, + Keys: []string{bundle.RelationKeyId.String(), bundle.RelationKeyName.String()}, }).Return(&pb.RpcObjectSearchResponse{ Records: []*types.Struct{ { From 063d400b35e565c190700da7db65853053d55130 Mon Sep 17 00:00:00 2001 From: AnastasiaShemyakinskaya Date: Mon, 20 Jan 2025 11:24:02 +0100 Subject: [PATCH 127/195] GO-3189: set checkbox relation as false Signed-off-by: AnastasiaShemyakinskaya --- core/block/editor/state/state.go | 3 --- core/block/editor/state/state_test.go | 39 --------------------------- core/details.go | 27 ++++++++++++++++++- 3 files changed, 26 insertions(+), 43 deletions(-) diff --git a/core/block/editor/state/state.go b/core/block/editor/state/state.go index 48206f9fc..c6e9cdcf2 100644 --- a/core/block/editor/state/state.go +++ b/core/block/editor/state/state.go @@ -1701,9 +1701,6 @@ func (s *State) AddRelationLinks(links ...*model.RelationLink) { for _, l := range links { if !relLinks.Has(l.Key) { relLinks = append(relLinks, l) - if l.Format == model.RelationFormat_checkbox { - s.SetDetail(domain.RelationKey(l.Key), domain.Bool(false)) - } } } s.relationLinks = relLinks diff --git a/core/block/editor/state/state_test.go b/core/block/editor/state/state_test.go index 03f942e15..c99f9dd4c 100644 --- a/core/block/editor/state/state_test.go +++ b/core/block/editor/state/state_test.go @@ -2976,43 +2976,4 @@ func TestState_AddRelationLinks(t *testing.T) { assert.True(t, s.GetRelationLinks().Has("existingLink")) assert.Len(t, s.GetRelationLinks(), 1) }) - t.Run("add checkbox link", func(t *testing.T) { - // given - s := &State{} - checkboxLink := &model.RelationLink{ - Key: "checkboxLink", - Format: model.RelationFormat_checkbox, - } - - // when - s.AddRelationLinks(checkboxLink) - - // then - relLinks := s.GetRelationLinks() - assert.Equal(t, 1, len(relLinks)) - assert.True(t, relLinks.Has("checkboxLink")) - detailValue := s.Details().Get("checkboxLink") - assert.Equal(t, domain.Bool(false), detailValue) - }) - t.Run("multi links", func(t *testing.T) { - // given - s := &State{} - link1 := &model.RelationLink{ - Key: "link1", - Format: model.RelationFormat_shorttext, - } - link2 := &model.RelationLink{ - Key: "link2", - Format: model.RelationFormat_checkbox, - } - - // when - s.AddRelationLinks(link1, link2) - - // then - relLinks := s.GetRelationLinks() - assert.Equal(t, 2, len(relLinks)) - assert.True(t, relLinks.Has("link1")) - assert.True(t, relLinks.Has("link2")) - }) } diff --git a/core/details.go b/core/details.go index 3c25c76f7..aae747771 100644 --- a/core/details.go +++ b/core/details.go @@ -7,6 +7,9 @@ import ( "github.com/anyproto/anytype-heart/core/block/detailservice" "github.com/anyproto/anytype-heart/core/domain" "github.com/anyproto/anytype-heart/pb" + "github.com/anyproto/anytype-heart/pkg/lib/bundle" + "github.com/anyproto/anytype-heart/pkg/lib/localstore/objectstore" + "github.com/anyproto/anytype-heart/pkg/lib/pb/model" "github.com/anyproto/anytype-heart/util/internalflag" ) @@ -177,12 +180,21 @@ func (mw *Middleware) ObjectRelationAdd(cctx context.Context, req *pb.RpcObjectR } detailsService := mustService[detailservice.Service](mw) + objectStore := mustService[objectstore.ObjectStore](mw) err := detailsService.ModifyDetails(ctx, req.ContextId, func(current *domain.Details) (*domain.Details, error) { for _, key := range req.RelationKeys { if current.Has(domain.RelationKey(key)) { continue } - current.Set(domain.RelationKey(key), domain.Null()) + format, err := mw.extractRelationFormat(current, objectStore, key) + if err != nil { + continue + } + if format == model.RelationFormat_checkbox { + current.Set(domain.RelationKey(key), domain.Bool(false)) + } else { + current.Set(domain.RelationKey(key), domain.Null()) + } } return current, nil }) @@ -198,3 +210,16 @@ func (mw *Middleware) ObjectRelationAdd(cctx context.Context, req *pb.RpcObjectR Event: mw.getResponseEvent(ctx), } } + +func (mw *Middleware) extractRelationFormat(current *domain.Details, objectStore objectstore.ObjectStore, key string) (model.RelationFormat, error) { + spaceId := current.GetString(bundle.RelationKeySpaceId) + relation, err := objectStore.SpaceIndex(spaceId).FetchRelationByKeys(domain.RelationKey(key)) + if err != nil { + return 0, err + } + var format model.RelationFormat + if len(relation) != 0 { + format = relation[0].Format + } + return format, nil +} From b51809c2760a2fd8f67626de4ada80acaf5a60c2 Mon Sep 17 00:00:00 2001 From: AnastasiaShemyakinskaya Date: Mon, 20 Jan 2025 12:46:09 +0100 Subject: [PATCH 128/195] GO-4406: merge main Signed-off-by: AnastasiaShemyakinskaya --- core/block/object/objectcreator/installer.go | 3 --- 1 file changed, 3 deletions(-) diff --git a/core/block/object/objectcreator/installer.go b/core/block/object/objectcreator/installer.go index ca71571a2..5eb3fcb92 100644 --- a/core/block/object/objectcreator/installer.go +++ b/core/block/object/objectcreator/installer.go @@ -257,9 +257,6 @@ func (s *service) prepareDetailsForInstallingObject( details.SetBool(bundle.RelationKeyIsReadonly, false) details.SetInt64(bundle.RelationKeyCreatedDate, time.Now().Unix()) - // we should delete old createdDate as it belongs to source object from marketplace - details.Delete(bundle.RelationKeyCreatedDate) - if isNewSpace { lastused.SetLastUsedDateForInitialObjectType(sourceId, details) } From 3d75992e3cab0f0d2396c4a5572f9d7f8ccccb64 Mon Sep 17 00:00:00 2001 From: AnastasiaShemyakinskaya Date: Mon, 20 Jan 2025 14:06:51 +0100 Subject: [PATCH 129/195] GO-3189: fix comments Signed-off-by: AnastasiaShemyakinskaya --- core/details.go | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/core/details.go b/core/details.go index aae747771..6a15ab746 100644 --- a/core/details.go +++ b/core/details.go @@ -188,11 +188,13 @@ func (mw *Middleware) ObjectRelationAdd(cctx context.Context, req *pb.RpcObjectR } format, err := mw.extractRelationFormat(current, objectStore, key) if err != nil { + current.Set(domain.RelationKey(key), domain.Null()) continue } - if format == model.RelationFormat_checkbox { + switch format { + case model.RelationFormat_checkbox: current.Set(domain.RelationKey(key), domain.Bool(false)) - } else { + default: current.Set(domain.RelationKey(key), domain.Null()) } } From c74ec63d6a01b0f158a065cffd036dd55ea7650b Mon Sep 17 00:00:00 2001 From: AnastasiaShemyakinskaya Date: Mon, 20 Jan 2025 14:44:42 +0100 Subject: [PATCH 130/195] GO-3189: fix comments Signed-off-by: AnastasiaShemyakinskaya --- core/details.go | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/core/details.go b/core/details.go index 6a15ab746..cbd980462 100644 --- a/core/details.go +++ b/core/details.go @@ -188,8 +188,7 @@ func (mw *Middleware) ObjectRelationAdd(cctx context.Context, req *pb.RpcObjectR } format, err := mw.extractRelationFormat(current, objectStore, key) if err != nil { - current.Set(domain.RelationKey(key), domain.Null()) - continue + log.Errorf("failed to fetch relation from store to get format %s, falling back to basic", err) } switch format { case model.RelationFormat_checkbox: @@ -217,7 +216,7 @@ func (mw *Middleware) extractRelationFormat(current *domain.Details, objectStore spaceId := current.GetString(bundle.RelationKeySpaceId) relation, err := objectStore.SpaceIndex(spaceId).FetchRelationByKeys(domain.RelationKey(key)) if err != nil { - return 0, err + return model.RelationFormat_longtext, err } var format model.RelationFormat if len(relation) != 0 { From df7039896e3110e1bfdbc814bc1ff35efd1fc1b2 Mon Sep 17 00:00:00 2001 From: Sergey Date: Mon, 20 Jan 2025 16:03:28 +0100 Subject: [PATCH 131/195] Object store: fix missing transaction --- pkg/lib/localstore/objectstore/spaceindex/links.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pkg/lib/localstore/objectstore/spaceindex/links.go b/pkg/lib/localstore/objectstore/spaceindex/links.go index 38bcdc787..e5e641d64 100644 --- a/pkg/lib/localstore/objectstore/spaceindex/links.go +++ b/pkg/lib/localstore/objectstore/spaceindex/links.go @@ -41,12 +41,12 @@ func (s *dsObjectStore) GetWithLinksInfoById(id string) (*model.ObjectInfoWithLi return nil, commit(fmt.Errorf("find outbound links: %w", err)) } - inbound, err := s.getObjectsInfo(s.componentCtx, inboundIds) + inbound, err := s.getObjectsInfo(txn.Context(), inboundIds) if err != nil { return nil, commit(err) } - outbound, err := s.getObjectsInfo(s.componentCtx, outboundsIds) + outbound, err := s.getObjectsInfo(txn.Context(), outboundsIds) if err != nil { return nil, commit(err) } From b92cd74593ea46eada38a48d230299cbf5369cd9 Mon Sep 17 00:00:00 2001 From: AnastasiaShemyakinskaya Date: Mon, 20 Jan 2025 16:29:26 +0100 Subject: [PATCH 132/195] GO-4406: set creation date for newly created objects Signed-off-by: AnastasiaShemyakinskaya --- core/block/object/objectcreator/object_type.go | 4 ++++ core/block/object/objectcreator/relation.go | 4 ++++ core/block/object/objectcreator/relation_option.go | 5 ++++- 3 files changed, 12 insertions(+), 1 deletion(-) diff --git a/core/block/object/objectcreator/object_type.go b/core/block/object/objectcreator/object_type.go index 4356358f8..ce5fdb7b5 100644 --- a/core/block/object/objectcreator/object_type.go +++ b/core/block/object/objectcreator/object_type.go @@ -3,6 +3,7 @@ package objectcreator import ( "context" "fmt" + "time" "golang.org/x/exp/slices" @@ -35,6 +36,9 @@ func (s *service) createObjectType(ctx context.Context, space clientspace.Space, return "", nil, fmt.Errorf("fill recommended relations: %w", err) } } + if !object.Has(bundle.RelationKeyCreatedDate) { + object.SetInt64(bundle.RelationKeyCreatedDate, time.Now().Unix()) + } object.SetString(bundle.RelationKeyId, id) object.SetInt64(bundle.RelationKeyLayout, int64(model.ObjectType_objectType)) diff --git a/core/block/object/objectcreator/relation.go b/core/block/object/objectcreator/relation.go index 395296e2d..46874743d 100644 --- a/core/block/object/objectcreator/relation.go +++ b/core/block/object/objectcreator/relation.go @@ -3,6 +3,7 @@ package objectcreator import ( "context" "fmt" + "time" "github.com/globalsign/mgo/bson" @@ -31,6 +32,9 @@ func (s *service) createRelation(ctx context.Context, space clientspace.Space, d if details.GetString(bundle.RelationKeyName) == "" { return "", nil, fmt.Errorf("missing relation name") } + if !details.Has(bundle.RelationKeyCreatedDate) { + details.SetInt64(bundle.RelationKeyCreatedDate, time.Now().Unix()) + } object = details.Copy() key := domain.RelationKey(details.GetString(bundle.RelationKeyRelationKey)) diff --git a/core/block/object/objectcreator/relation_option.go b/core/block/object/objectcreator/relation_option.go index 42724ab7b..c7156594e 100644 --- a/core/block/object/objectcreator/relation_option.go +++ b/core/block/object/objectcreator/relation_option.go @@ -3,6 +3,7 @@ package objectcreator import ( "context" "fmt" + "time" "github.com/globalsign/mgo/bson" @@ -25,7 +26,9 @@ func (s *service) createRelationOption(ctx context.Context, space clientspace.Sp if details.GetString(bundle.RelationKeyRelationKey) == "" { return "", nil, fmt.Errorf("relation key is empty") } - + if !details.Has(bundle.RelationKeyCreatedDate) { + details.SetInt64(bundle.RelationKeyCreatedDate, time.Now().Unix()) + } uniqueKey, err := getUniqueKeyOrGenerate(coresb.SmartBlockTypeRelationOption, details) if err != nil { return "", nil, fmt.Errorf("getUniqueKeyOrGenerate: %w", err) From 2c9739b5711478233732ddb7e0d84e60ce96e297 Mon Sep 17 00:00:00 2001 From: Jannis Metrikat <120120832+jmetrikat@users.noreply.github.com> Date: Mon, 20 Jan 2025 20:00:12 +0100 Subject: [PATCH 133/195] GO-4642: Fix lint and tests --- core/api/services/auth/service_test.go | 11 +++++++++-- core/application/sessions.go | 2 +- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/core/api/services/auth/service_test.go b/core/api/services/auth/service_test.go index 4df3bd482..85c6605d3 100644 --- a/core/api/services/auth/service_test.go +++ b/core/api/services/auth/service_test.go @@ -9,6 +9,7 @@ import ( "github.com/anyproto/anytype-heart/pb" "github.com/anyproto/anytype-heart/pb/service/mock_service" + "github.com/anyproto/anytype-heart/pkg/lib/pb/model" ) const ( @@ -40,7 +41,10 @@ func TestAuthService_GenerateNewChallenge(t *testing.T) { ctx := context.Background() fx := newFixture(t) - fx.mwMock.On("AccountLocalLinkNewChallenge", mock.Anything, &pb.RpcAccountLocalLinkNewChallengeRequest{AppName: mockedAppName}). + fx.mwMock.On("AccountLocalLinkNewChallenge", mock.Anything, &pb.RpcAccountLocalLinkNewChallengeRequest{ + AppName: mockedAppName, + Scope: model.AccountAuth_JsonAPI, + }). Return(&pb.RpcAccountLocalLinkNewChallengeResponse{ ChallengeId: mockedChallengeId, Error: &pb.RpcAccountLocalLinkNewChallengeResponseError{Code: pb.RpcAccountLocalLinkNewChallengeResponseError_NULL}, @@ -73,7 +77,10 @@ func TestAuthService_GenerateNewChallenge(t *testing.T) { ctx := context.Background() fx := newFixture(t) - fx.mwMock.On("AccountLocalLinkNewChallenge", mock.Anything, &pb.RpcAccountLocalLinkNewChallengeRequest{AppName: mockedAppName}). + fx.mwMock.On("AccountLocalLinkNewChallenge", mock.Anything, &pb.RpcAccountLocalLinkNewChallengeRequest{ + AppName: mockedAppName, + Scope: model.AccountAuth_JsonAPI, + }). Return(&pb.RpcAccountLocalLinkNewChallengeResponse{ Error: &pb.RpcAccountLocalLinkNewChallengeResponseError{Code: pb.RpcAccountLocalLinkNewChallengeResponseError_UNKNOWN_ERROR}, }).Once() diff --git a/core/application/sessions.go b/core/application/sessions.go index 51c2c8d9b..f9e492108 100644 --- a/core/application/sessions.go +++ b/core/application/sessions.go @@ -33,7 +33,7 @@ func (s *Service) CreateSession(req *pb.RpcWalletCreateSessionRequest) (token st } log.Infof("appLink auth %s", appLink.AppName) - token, err := s.sessions.StartSession(s.sessionSigningKey, model.AccountAuthLocalApiScope(appLink.Scope)) + token, err := s.sessions.StartSession(s.sessionSigningKey, model.AccountAuthLocalApiScope(appLink.Scope)) // nolint:gosec if err != nil { return "", "", err } From f237211e84d57cb3aaa9034a96520a2e5255b671 Mon Sep 17 00:00:00 2001 From: Jannis Metrikat <120120832+jmetrikat@users.noreply.github.com> Date: Mon, 20 Jan 2025 20:38:44 +0100 Subject: [PATCH 134/195] GO-4642: Refactor auth key check --- cmd/grpcserver/grpc.go | 2 +- core/api/server/middleware.go | 24 ++++++++++++------------ core/api/server/router.go | 5 ++--- core/api/server/server.go | 5 ++--- core/api/service.go | 15 ++++----------- core/core.go | 9 --------- core/interfaces/token_validator.go | 8 -------- 7 files changed, 21 insertions(+), 47 deletions(-) delete mode 100644 core/interfaces/token_validator.go diff --git a/cmd/grpcserver/grpc.go b/cmd/grpcserver/grpc.go index 085cf0ebe..827fd3c39 100644 --- a/cmd/grpcserver/grpc.go +++ b/cmd/grpcserver/grpc.go @@ -226,7 +226,7 @@ func main() { }() startReportMemory(mw) - api.SetMiddlewareParams(mw, mw) + api.SetMiddlewareParams(mw) shutdown := func() { server.Stop() diff --git a/core/api/server/middleware.go b/core/api/server/middleware.go index 5309142a0..b1604a6a2 100644 --- a/core/api/server/middleware.go +++ b/core/api/server/middleware.go @@ -12,7 +12,6 @@ import ( "github.com/gin-gonic/gin" "github.com/anyproto/anytype-heart/core/anytype/account" - "github.com/anyproto/anytype-heart/core/interfaces" "github.com/anyproto/anytype-heart/pb" "github.com/anyproto/anytype-heart/pb/service" ) @@ -36,7 +35,7 @@ func (s *Server) rateLimit(max float64) gin.HandlerFunc { } // ensureAuthenticated is a middleware that ensures the request is authenticated. -func (s *Server) ensureAuthenticated(mw service.ClientCommandsServer, tv interfaces.TokenValidator) gin.HandlerFunc { +func (s *Server) ensureAuthenticated(mw service.ClientCommandsServer) gin.HandlerFunc { return func(c *gin.Context) { authHeader := c.GetHeader("Authorization") if authHeader == "" { @@ -48,28 +47,29 @@ func (s *Server) ensureAuthenticated(mw service.ClientCommandsServer, tv interfa c.AbortWithStatusJSON(http.StatusUnauthorized, gin.H{"error": "Invalid Authorization header format"}) return } - key := strings.TrimPrefix(authHeader, "Bearer ") + + // Validate the key - if the key exists in the KeyToToken map, it is considered valid. + // Otherwise, attempt to create a new session using the key and add it to the map upon successful validation. s.mu.Lock() token, exists := s.KeyToToken[key] s.mu.Unlock() + if !exists { response := mw.WalletCreateSession(context.Background(), &pb.RpcWalletCreateSessionRequest{Auth: &pb.RpcWalletCreateSessionRequestAuthOfAppKey{AppKey: key}}) if response.Error.Code != pb.RpcWalletCreateSessionResponseError_NULL { - c.AbortWithStatusJSON(http.StatusUnauthorized, gin.H{"error": "Failed to create session"}) - return - } - s.mu.Lock() - s.KeyToToken[key] = response.Token - s.mu.Unlock() - } else { - _, err := tv.ValidateApiToken(token) - if err != nil { c.AbortWithStatusJSON(http.StatusUnauthorized, gin.H{"error": "Invalid token"}) return } + token = response.Token + + s.mu.Lock() + s.KeyToToken[key] = token + s.mu.Unlock() } + // Add token to request context for downstream services (subscriptions, events, etc.) + c.Set("token", token) c.Next() } } diff --git a/core/api/server/router.go b/core/api/server/router.go index a0a3c6647..0cacec0d4 100644 --- a/core/api/server/router.go +++ b/core/api/server/router.go @@ -12,7 +12,6 @@ import ( "github.com/anyproto/anytype-heart/core/api/services/object" "github.com/anyproto/anytype-heart/core/api/services/search" "github.com/anyproto/anytype-heart/core/api/services/space" - "github.com/anyproto/anytype-heart/core/interfaces" "github.com/anyproto/anytype-heart/pb/service" ) @@ -25,7 +24,7 @@ const ( ) // NewRouter builds and returns a *gin.Engine with all routes configured. -func (s *Server) NewRouter(a *app.App, mw service.ClientCommandsServer, tv interfaces.TokenValidator) *gin.Engine { +func (s *Server) NewRouter(a *app.App, mw service.ClientCommandsServer) *gin.Engine { router := gin.Default() paginator := pagination.New(pagination.Config{ @@ -48,7 +47,7 @@ func (s *Server) NewRouter(a *app.App, mw service.ClientCommandsServer, tv inter // API routes v1 := router.Group("/v1") v1.Use(paginator) - v1.Use(s.ensureAuthenticated(mw, tv)) + v1.Use(s.ensureAuthenticated(mw)) v1.Use(s.ensureAccountInfo(a)) { // Export diff --git a/core/api/server/server.go b/core/api/server/server.go index 152def492..ae69f8204 100644 --- a/core/api/server/server.go +++ b/core/api/server/server.go @@ -11,7 +11,6 @@ import ( "github.com/anyproto/anytype-heart/core/api/services/object" "github.com/anyproto/anytype-heart/core/api/services/search" "github.com/anyproto/anytype-heart/core/api/services/space" - "github.com/anyproto/anytype-heart/core/interfaces" "github.com/anyproto/anytype-heart/pb/service" ) @@ -30,7 +29,7 @@ type Server struct { } // NewServer constructs a new Server with default config and sets up the routes. -func NewServer(a *app.App, mw service.ClientCommandsServer, tv interfaces.TokenValidator) *Server { +func NewServer(a *app.App, mw service.ClientCommandsServer) *Server { s := &Server{ authService: auth.NewService(mw), exportService: export.NewService(mw), @@ -39,7 +38,7 @@ func NewServer(a *app.App, mw service.ClientCommandsServer, tv interfaces.TokenV s.objectService = object.NewService(mw, s.spaceService) s.searchService = search.NewService(mw, s.spaceService, s.objectService) - s.engine = s.NewRouter(a, mw, tv) + s.engine = s.NewRouter(a, mw) s.KeyToToken = make(map[string]string) return s diff --git a/core/api/service.go b/core/api/service.go index 60f588dc3..1becdd27d 100644 --- a/core/api/service.go +++ b/core/api/service.go @@ -10,7 +10,6 @@ import ( "github.com/anyproto/any-sync/app" "github.com/anyproto/anytype-heart/core/api/server" - "github.com/anyproto/anytype-heart/core/interfaces" "github.com/anyproto/anytype-heart/pb/service" ) @@ -21,8 +20,7 @@ const ( ) var ( - mwSrv service.ClientCommandsServer - tvInterface interfaces.TokenValidator + mwSrv service.ClientCommandsServer ) type Service interface { @@ -33,14 +31,10 @@ type apiService struct { srv *server.Server httpSrv *http.Server mw service.ClientCommandsServer - tv interfaces.TokenValidator } func New() Service { - return &apiService{ - mw: mwSrv, - tv: tvInterface, - } + return &apiService{mw: mwSrv} } func (s *apiService) Name() (name string) { @@ -64,7 +58,7 @@ func (s *apiService) Name() (name string) { // @externalDocs.description OpenAPI // @externalDocs.url https://swagger.io/resources/open-api/ func (s *apiService) Init(a *app.App) (err error) { - s.srv = server.NewServer(a, s.mw, s.tv) + s.srv = server.NewServer(a, s.mw) s.httpSrv = &http.Server{ Addr: httpPort, Handler: s.srv.Engine(), @@ -96,7 +90,6 @@ func (s *apiService) Close(ctx context.Context) (err error) { return nil } -func SetMiddlewareParams(mw service.ClientCommandsServer, tv interfaces.TokenValidator) { +func SetMiddlewareParams(mw service.ClientCommandsServer) { mwSrv = mw - tvInterface = tv } diff --git a/core/core.go b/core/core.go index 563f6a2e7..394167770 100644 --- a/core/core.go +++ b/core/core.go @@ -11,11 +11,9 @@ import ( "github.com/anyproto/anytype-heart/core/block" "github.com/anyproto/anytype-heart/core/block/collection" "github.com/anyproto/anytype-heart/core/event" - "github.com/anyproto/anytype-heart/core/interfaces" "github.com/anyproto/anytype-heart/core/wallet" "github.com/anyproto/anytype-heart/pb" "github.com/anyproto/anytype-heart/pkg/lib/logging" - "github.com/anyproto/anytype-heart/pkg/lib/pb/model" utildebug "github.com/anyproto/anytype-heart/util/debug" ) @@ -128,10 +126,3 @@ func (mw *Middleware) SaveGoroutinesStack(path string) (err error) { } return utildebug.SaveStackToRepo(path, true) } - -// ValidateApiToken exposes ValidateToken logic from core to the JSON API -func (mw *Middleware) ValidateApiToken(token string) (model.AccountAuthLocalApiScope, error) { - return mw.applicationService.ValidateSessionToken(token) -} - -var _ interfaces.TokenValidator = (*Middleware)(nil) diff --git a/core/interfaces/token_validator.go b/core/interfaces/token_validator.go deleted file mode 100644 index 5248d2ff9..000000000 --- a/core/interfaces/token_validator.go +++ /dev/null @@ -1,8 +0,0 @@ -package interfaces - -import "github.com/anyproto/anytype-heart/pkg/lib/pb/model" - -// TokenValidator is an interface that exposes ValidateApiToken from core to avoid circular dependencies. -type TokenValidator interface { - ValidateApiToken(token string) (model.AccountAuthLocalApiScope, error) -} From 7e8edea0db679c1a86df5235ff0453d1914c9844 Mon Sep 17 00:00:00 2001 From: AnastasiaShemyakinskaya Date: Mon, 20 Jan 2025 22:12:36 +0100 Subject: [PATCH 135/195] GO-4886: save joinSpace in PublishState Signed-off-by: AnastasiaShemyakinskaya --- core/publish/service.go | 29 +- core/publish/service_test.go | 85 +- docs/proto.md | 1 + pb/commands.pb.go | 2493 +++++++++++++++++----------------- pb/protos/commands.proto | 1 + 5 files changed, 1371 insertions(+), 1238 deletions(-) diff --git a/core/publish/service.go b/core/publish/service.go index b4a8374f2..65826b257 100644 --- a/core/publish/service.go +++ b/core/publish/service.go @@ -59,8 +59,9 @@ type PublishingUberSnapshotMeta struct { InviteLink string `json:"inviteLink,omitempty"` } -type Heads struct { - Heads []string `json:"heads"` +type Version struct { + Heads []string `json:"heads"` + JoinSpace bool `json:"joinSpace"` } // Contains all publishing .pb files @@ -177,7 +178,7 @@ func (s *service) publishToPublishServer(ctx context.Context, spaceId, pageId, u return err } - version, err := s.evaluateDocumentVersion(spc, pageId) + version, err := s.evaluateDocumentVersion(spc, pageId, joinSpace) if err != nil { return err } @@ -191,6 +192,9 @@ func (s *service) publishToPublishServer(ctx context.Context, spaceId, pageId, u func (s *service) applyInviteLink(ctx context.Context, spc clientspace.Space, snapshot *PublishingUberSnapshot, joinSpace bool) error { inviteLink, err := s.extractInviteLink(ctx, spc.Id(), joinSpace, spc.IsPersonal()) + if err != nil && errors.Is(err, ErrLimitExceeded) { + return nil + } if err != nil { return err } @@ -356,7 +360,7 @@ func (s *service) extractInviteLink(ctx context.Context, spaceId string, joinSpa return inviteLink, nil } -func (s *service) evaluateDocumentVersion(spc clientspace.Space, pageId string) (string, error) { +func (s *service) evaluateDocumentVersion(spc clientspace.Space, pageId string, joinSpace bool) (string, error) { treeStorage, err := spc.Storage().TreeStorage(pageId) if err != nil { return "", err @@ -366,7 +370,7 @@ func (s *service) evaluateDocumentVersion(spc clientspace.Space, pageId string) return "", err } slices.Sort(heads) - h := &Heads{Heads: heads} + h := &Version{Heads: heads, JoinSpace: joinSpace} jsonData, err := json.Marshal(h) if err != nil { return "", err @@ -423,6 +427,7 @@ func (s *service) PublishList(ctx context.Context, spaceId string) ([]*pb.RpcPub } pbPublishes := make([]*pb.RpcPublishingPublishState, 0, len(publishes)) for _, publish := range publishes { + version := s.retrieveVersion(publish) pbPublishes = append(pbPublishes, &pb.RpcPublishingPublishState{ SpaceId: publish.SpaceId, ObjectId: publish.ObjectId, @@ -431,16 +436,27 @@ func (s *service) PublishList(ctx context.Context, spaceId string) ([]*pb.RpcPub Version: publish.Version, Timestamp: publish.Timestamp, Size_: publish.Size_, + JoinSpace: version.JoinSpace, }) } return pbPublishes, nil } +func (s *service) retrieveVersion(publish *publishapi.Publish) *Version { + version := &Version{} + err := json.Unmarshal([]byte(publish.Version), version) + if err != nil { + log.Error("failed to unmarshal publish version", zap.Error(err)) + } + return version +} + func (s *service) ResolveUri(ctx context.Context, uri string) (*pb.RpcPublishingPublishState, error) { publish, err := s.publishClientService.ResolveUri(ctx, uri) if err != nil { return nil, err } + version := s.retrieveVersion(publish) return &pb.RpcPublishingPublishState{ SpaceId: publish.SpaceId, ObjectId: publish.ObjectId, @@ -449,6 +465,7 @@ func (s *service) ResolveUri(ctx context.Context, uri string) (*pb.RpcPublishing Version: publish.Version, Timestamp: publish.Timestamp, Size_: publish.Size_, + JoinSpace: version.JoinSpace, }, nil } @@ -457,6 +474,7 @@ func (s *service) GetStatus(ctx context.Context, spaceId string, objectId string if err != nil { return nil, err } + version := s.retrieveVersion(status) return &pb.RpcPublishingPublishState{ SpaceId: status.SpaceId, ObjectId: status.ObjectId, @@ -465,5 +483,6 @@ func (s *service) GetStatus(ctx context.Context, spaceId string, objectId string Version: status.Version, Timestamp: status.Timestamp, Size_: status.Size_, + JoinSpace: version.JoinSpace, }, nil } diff --git a/core/publish/service_test.go b/core/publish/service_test.go index 854282c40..12d4e9c9a 100644 --- a/core/publish/service_test.go +++ b/core/publish/service_test.go @@ -34,6 +34,7 @@ import ( "github.com/anyproto/anytype-heart/core/inviteservice" "github.com/anyproto/anytype-heart/core/inviteservice/mock_inviteservice" "github.com/anyproto/anytype-heart/core/notifications/mock_notifications" + "github.com/anyproto/anytype-heart/pb" "github.com/anyproto/anytype-heart/pkg/lib/bundle" "github.com/anyproto/anytype-heart/pkg/lib/core/smartblock" "github.com/anyproto/anytype-heart/pkg/lib/localstore/addr" @@ -63,6 +64,7 @@ type mockPublishClient struct { expectedInvite string expectedObject string expectedPbFiles map[string]struct{} + expectedResult []*publishapi.Publish } func (m *mockPublishClient) Init(a *app.App) (err error) { @@ -78,7 +80,7 @@ func (m *mockPublishClient) ResolveUri(ctx context.Context, uri string) (publish } func (m *mockPublishClient) GetPublishStatus(ctx context.Context, spaceId, objectId string) (publish *publishapi.Publish, err error) { - return + return m.expectedResult[0], nil } func (m *mockPublishClient) Publish(ctx context.Context, req *publishapi.PublishRequest) (uploadUrl string, err error) { @@ -91,7 +93,7 @@ func (m *mockPublishClient) UnPublish(ctx context.Context, req *publishapi.UnPub } func (m *mockPublishClient) ListPublishes(ctx context.Context, spaceId string) (publishes []*publishapi.Publish, err error) { - return + return m.expectedResult, nil } func (m *mockPublishClient) UploadDir(ctx context.Context, uploadUrl, dir string) (err error) { @@ -165,7 +167,7 @@ func TestPublish(t *testing.T) { // then assert.NoError(t, err) assert.Equal(t, expected, publish.Url) - assert.Equal(t, "{\"heads\":[\"heads\"]}", publishClient.expectedRequest.Version) + assert.Equal(t, "{\"heads\":[\"heads\"],\"joinSpace\":false}", publishClient.expectedRequest.Version) assert.Equal(t, objectId, publishClient.expectedRequest.ObjectId) assert.Equal(t, spaceId, publishClient.expectedRequest.SpaceId) assert.Equal(t, expectedUri, publishClient.expectedRequest.Uri) @@ -219,7 +221,7 @@ func TestPublish(t *testing.T) { // then assert.NoError(t, err) assert.Equal(t, expected, publish.Url) - assert.Equal(t, "{\"heads\":[\"heads\"]}", publishClient.expectedRequest.Version) + assert.Equal(t, "{\"heads\":[\"heads\"],\"joinSpace\":true}", publishClient.expectedRequest.Version) assert.Equal(t, objectId, publishClient.expectedRequest.ObjectId) assert.Equal(t, spaceId, publishClient.expectedRequest.SpaceId) assert.Equal(t, expectedUri, publishClient.expectedRequest.Uri) @@ -266,7 +268,7 @@ func TestPublish(t *testing.T) { // then assert.NoError(t, err) assert.Equal(t, expected, publish.Url) - assert.Equal(t, "{\"heads\":[\"heads\"]}", publishClient.expectedRequest.Version) + assert.Equal(t, "{\"heads\":[\"heads\"],\"joinSpace\":true}", publishClient.expectedRequest.Version) assert.Equal(t, objectId, publishClient.expectedRequest.ObjectId) assert.Equal(t, spaceId, publishClient.expectedRequest.SpaceId) assert.Equal(t, expectedUri, publishClient.expectedRequest.Uri) @@ -324,7 +326,7 @@ func TestPublish(t *testing.T) { // then assert.NoError(t, err) assert.Equal(t, expectedUrl, publish.Url) - assert.Equal(t, "{\"heads\":[\"heads\"]}", publishClient.expectedRequest.Version) + assert.Equal(t, "{\"heads\":[\"heads\"],\"joinSpace\":true}", publishClient.expectedRequest.Version) assert.Equal(t, objectId, publishClient.expectedRequest.ObjectId) assert.Equal(t, spaceId, publishClient.expectedRequest.SpaceId) assert.Equal(t, expectedUri, publishClient.expectedRequest.Uri) @@ -369,7 +371,7 @@ func TestPublish(t *testing.T) { // then assert.Error(t, err) assert.Equal(t, "", publish.Url) - assert.Equal(t, "{\"heads\":[\"heads\"]}", publishClient.expectedRequest.Version) + assert.Equal(t, "{\"heads\":[\"heads\"],\"joinSpace\":true}", publishClient.expectedRequest.Version) assert.Equal(t, objectId, publishClient.expectedRequest.ObjectId) assert.Equal(t, spaceId, publishClient.expectedRequest.SpaceId) assert.Equal(t, expectedUri, publishClient.expectedRequest.Uri) @@ -451,6 +453,75 @@ func TestPublish(t *testing.T) { }) } +func TestService_PublishList(t *testing.T) { + t.Run("success", func(t *testing.T) { + // given + publishClientService := &mockPublishClient{ + t: t, + expectedResult: []*publishapi.Publish{ + { + SpaceId: spaceId, + ObjectId: objectId, + Uri: "test", + Version: "{\"heads\":[\"heads\"],\"joinSpace\":true}", + }, + }, + } + svc := &service{ + publishClientService: publishClientService, + } + + // when + publishes, err := svc.PublishList(context.Background(), spaceId) + + // then + expectedModel := &pb.RpcPublishingPublishState{ + SpaceId: spaceId, + ObjectId: objectId, + Uri: "test", + Version: "{\"heads\":[\"heads\"],\"joinSpace\":true}", + JoinSpace: true, + } + assert.NoError(t, err) + assert.Len(t, publishes, 1) + assert.Equal(t, expectedModel, publishes[0]) + }) +} + +func TestService_GetStatus(t *testing.T) { + t.Run("success", func(t *testing.T) { + // given + publishClientService := &mockPublishClient{ + t: t, + expectedResult: []*publishapi.Publish{ + { + SpaceId: spaceId, + ObjectId: objectId, + Uri: "test", + Version: "{\"heads\":[\"heads\"],\"joinSpace\":false}", + }, + }, + } + svc := &service{ + publishClientService: publishClientService, + } + + // when + publish, err := svc.GetStatus(context.Background(), spaceId, objectId) + + // then + expectedModel := &pb.RpcPublishingPublishState{ + SpaceId: spaceId, + ObjectId: objectId, + Uri: "test", + Version: "{\"heads\":[\"heads\"],\"joinSpace\":false}", + JoinSpace: false, + } + assert.NoError(t, err) + assert.Equal(t, expectedModel, publish) + }) +} + func prepaeSpaceService(t *testing.T, isPersonal bool) (*mock_space.MockService, error) { spaceService := mock_space.NewMockService(t) space := mock_clientspace.NewMockSpace(t) diff --git a/docs/proto.md b/docs/proto.md index 015c066fd..bfba4db14 100644 --- a/docs/proto.md +++ b/docs/proto.md @@ -18210,6 +18210,7 @@ Available undo/redo operations | version | [string](#string) | | | | timestamp | [int64](#int64) | | | | size | [int64](#int64) | | | +| joinSpace | [bool](#bool) | | | diff --git a/pb/commands.pb.go b/pb/commands.pb.go index 865ccff76..556b69779 100644 --- a/pb/commands.pb.go +++ b/pb/commands.pb.go @@ -18718,6 +18718,7 @@ type RpcPublishingPublishState struct { Version string `protobuf:"bytes,5,opt,name=version,proto3" json:"version,omitempty"` Timestamp int64 `protobuf:"varint,6,opt,name=timestamp,proto3" json:"timestamp,omitempty"` Size_ int64 `protobuf:"varint,7,opt,name=size,proto3" json:"size,omitempty"` + JoinSpace bool `protobuf:"varint,8,opt,name=joinSpace,proto3" json:"joinSpace,omitempty"` } func (m *RpcPublishingPublishState) Reset() { *m = RpcPublishingPublishState{} } @@ -18802,6 +18803,13 @@ func (m *RpcPublishingPublishState) GetSize_() int64 { return 0 } +func (m *RpcPublishingPublishState) GetJoinSpace() bool { + if m != nil { + return m.JoinSpace + } + return false +} + type RpcPublishingCreate struct { } @@ -72085,1232 +72093,1232 @@ func init() { func init() { proto.RegisterFile("pb/protos/commands.proto", fileDescriptor_8261c968b2e6f45c) } var fileDescriptor_8261c968b2e6f45c = []byte{ - // 19593 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0xbd, 0x7f, 0x9c, 0x2c, 0x47, - 0x59, 0x2f, 0x7c, 0xa6, 0x7b, 0x66, 0x76, 0xf7, 0xd9, 0x1f, 0x67, 0x4e, 0xe7, 0x9c, 0x93, 0x93, - 0x4a, 0x38, 0x89, 0x27, 0x21, 0xc4, 0x10, 0x36, 0x21, 0x20, 0x92, 0x90, 0x90, 0xcc, 0xce, 0xce, - 0xee, 0x4e, 0xb2, 0x3b, 0xb3, 0xf6, 0xcc, 0x9e, 0x43, 0xf4, 0xfa, 0xce, 0xed, 0x33, 0x53, 0xbb, - 0xdb, 0x39, 0xb3, 0xdd, 0x63, 0x77, 0xef, 0x9e, 0x1c, 0xde, 0xcf, 0x7d, 0xaf, 0x88, 0x11, 0x14, - 0x73, 0x11, 0x11, 0x95, 0xdf, 0x10, 0x08, 0x08, 0x0a, 0xc8, 0xef, 0x0b, 0x2a, 0x20, 0x3f, 0x04, - 0x11, 0x11, 0x41, 0x04, 0x51, 0x5e, 0x41, 0x10, 0xf1, 0x7e, 0xe4, 0xf2, 0xea, 0x7b, 0x05, 0x51, - 0x78, 0x7d, 0x3f, 0x5d, 0x55, 0xfd, 0xa3, 0x66, 0xa7, 0x7b, 0xaa, 0x67, 0xa7, 0x67, 0x83, 0xdc, - 0xff, 0xba, 0xab, 0xab, 0x9f, 0x7a, 0xea, 0xf9, 0x3e, 0x55, 0xf5, 0x54, 0xd5, 0x53, 0x4f, 0xc1, - 0xa9, 0xee, 0xf9, 0x9b, 0xbb, 0x96, 0xe9, 0x98, 0xf6, 0xcd, 0x2d, 0x73, 0x67, 0x47, 0x33, 0xda, - 0xf6, 0x3c, 0x79, 0x57, 0x26, 0x34, 0xe3, 0x92, 0x73, 0xa9, 0x8b, 0xd1, 0x75, 0xdd, 0x0b, 0x5b, - 0x37, 0x77, 0xf4, 0xf3, 0x37, 0x77, 0xcf, 0xdf, 0xbc, 0x63, 0xb6, 0x71, 0xc7, 0xfb, 0x81, 0xbc, - 0xb0, 0xec, 0xe8, 0x86, 0xa8, 0x5c, 0x1d, 0xb3, 0xa5, 0x75, 0x6c, 0xc7, 0xb4, 0x30, 0xcb, 0x79, - 0x32, 0x28, 0x12, 0xef, 0x61, 0xc3, 0xf1, 0x28, 0x5c, 0xb5, 0x65, 0x9a, 0x5b, 0x1d, 0x4c, 0xbf, - 0x9d, 0xdf, 0xdd, 0xbc, 0xd9, 0x76, 0xac, 0xdd, 0x96, 0xc3, 0xbe, 0x5e, 0xd3, 0xfb, 0xb5, 0x8d, - 0xed, 0x96, 0xa5, 0x77, 0x1d, 0xd3, 0xa2, 0x39, 0xce, 0xfc, 0xc6, 0x43, 0x93, 0x20, 0xab, 0xdd, - 0x16, 0xfa, 0xd6, 0x04, 0xc8, 0xc5, 0x6e, 0x17, 0x7d, 0x44, 0x02, 0x58, 0xc6, 0xce, 0x59, 0x6c, - 0xd9, 0xba, 0x69, 0xa0, 0xa3, 0x30, 0xa1, 0xe2, 0x9f, 0xda, 0xc5, 0xb6, 0x73, 0x7b, 0xf6, 0xb9, - 0x5f, 0x93, 0x33, 0xe8, 0x11, 0x09, 0x26, 0x55, 0x6c, 0x77, 0x4d, 0xc3, 0xc6, 0xca, 0xdd, 0x90, - 0xc3, 0x96, 0x65, 0x5a, 0xa7, 0x32, 0xd7, 0x64, 0x6e, 0x98, 0xbe, 0xf5, 0xc6, 0x79, 0x56, 0xfd, - 0x79, 0xb5, 0xdb, 0x9a, 0x2f, 0x76, 0xbb, 0xf3, 0x01, 0xa5, 0x79, 0xef, 0xa7, 0xf9, 0xb2, 0xfb, - 0x87, 0x4a, 0x7f, 0x54, 0x4e, 0xc1, 0xc4, 0x1e, 0xcd, 0x70, 0x4a, 0xba, 0x26, 0x73, 0xc3, 0x94, - 0xea, 0xbd, 0xba, 0x5f, 0xda, 0xd8, 0xd1, 0xf4, 0x8e, 0x7d, 0x4a, 0xa6, 0x5f, 0xd8, 0x2b, 0x7a, - 0x38, 0x03, 0x39, 0x42, 0x44, 0x29, 0x41, 0xb6, 0x65, 0xb6, 0x31, 0x29, 0x7e, 0xee, 0xd6, 0x9b, - 0xc5, 0x8b, 0x9f, 0x2f, 0x99, 0x6d, 0xac, 0x92, 0x9f, 0x95, 0x6b, 0x60, 0xda, 0x13, 0x4b, 0xc0, - 0x46, 0x38, 0xe9, 0xcc, 0xad, 0x90, 0x75, 0xf3, 0x2b, 0x93, 0x90, 0xad, 0x6e, 0xac, 0xae, 0x16, - 0x8e, 0x28, 0xc7, 0x60, 0x76, 0xa3, 0x7a, 0x6f, 0xb5, 0x76, 0xae, 0xda, 0x2c, 0xab, 0x6a, 0x4d, - 0x2d, 0x64, 0x94, 0x59, 0x98, 0x5a, 0x28, 0x2e, 0x36, 0x2b, 0xd5, 0xf5, 0x8d, 0x46, 0x41, 0x42, - 0xaf, 0x90, 0x61, 0xae, 0x8e, 0x9d, 0x45, 0xbc, 0xa7, 0xb7, 0x70, 0xdd, 0xd1, 0x1c, 0x8c, 0x9e, - 0x9f, 0xf1, 0x85, 0xa9, 0x6c, 0xb8, 0x85, 0xfa, 0x9f, 0x58, 0x05, 0x9e, 0xb4, 0xaf, 0x02, 0x3c, - 0x85, 0x79, 0xf6, 0xf7, 0x7c, 0x28, 0x4d, 0x0d, 0xd3, 0x39, 0xf3, 0x04, 0x98, 0x0e, 0x7d, 0x53, - 0xe6, 0x00, 0x16, 0x8a, 0xa5, 0x7b, 0x97, 0xd5, 0xda, 0x46, 0x75, 0xb1, 0x70, 0xc4, 0x7d, 0x5f, - 0xaa, 0xa9, 0x65, 0xf6, 0x9e, 0x41, 0xdf, 0xc9, 0x84, 0xc0, 0x5c, 0xe4, 0xc1, 0x9c, 0x1f, 0xcc, - 0x4c, 0x1f, 0x40, 0xd1, 0xeb, 0x7c, 0x70, 0x96, 0x39, 0x70, 0x9e, 0x94, 0x8c, 0x5c, 0xfa, 0x00, - 0x3d, 0x28, 0xc1, 0x64, 0x7d, 0x7b, 0xd7, 0x69, 0x9b, 0x17, 0x0d, 0x34, 0xe5, 0x23, 0x83, 0xbe, - 0x11, 0x96, 0xc9, 0xd3, 0x79, 0x99, 0xdc, 0xb0, 0xbf, 0x12, 0x8c, 0x42, 0x84, 0x34, 0x5e, 0xe5, - 0x4b, 0xa3, 0xc8, 0x49, 0xe3, 0x09, 0xa2, 0x84, 0xd2, 0x97, 0xc3, 0x4b, 0x9e, 0x0a, 0xb9, 0x7a, - 0x57, 0x6b, 0x61, 0xf4, 0x09, 0x19, 0x66, 0x56, 0xb1, 0xb6, 0x87, 0x8b, 0xdd, 0xae, 0x65, 0xee, - 0x61, 0x54, 0x0a, 0xf4, 0xf5, 0x14, 0x4c, 0xd8, 0x6e, 0xa6, 0x4a, 0x9b, 0xd4, 0x60, 0x4a, 0xf5, - 0x5e, 0x95, 0xd3, 0x00, 0x7a, 0x1b, 0x1b, 0x8e, 0xee, 0xe8, 0xd8, 0x3e, 0x25, 0x5d, 0x23, 0xdf, - 0x30, 0xa5, 0x86, 0x52, 0xd0, 0xb7, 0x24, 0x51, 0x1d, 0x23, 0x5c, 0xcc, 0x87, 0x39, 0x88, 0x90, - 0xea, 0x6b, 0x24, 0x11, 0x1d, 0x1b, 0x48, 0x2e, 0x99, 0x6c, 0xdf, 0x9c, 0x49, 0x2e, 0x5c, 0x37, - 0x47, 0xb5, 0xd6, 0xac, 0x6f, 0x94, 0x56, 0x9a, 0xf5, 0xf5, 0x62, 0xa9, 0x5c, 0xc0, 0xca, 0x71, - 0x28, 0x90, 0xc7, 0x66, 0xa5, 0xde, 0x5c, 0x2c, 0xaf, 0x96, 0x1b, 0xe5, 0xc5, 0xc2, 0xa6, 0xa2, - 0xc0, 0x9c, 0x5a, 0xfe, 0xb1, 0x8d, 0x72, 0xbd, 0xd1, 0x5c, 0x2a, 0x56, 0x56, 0xcb, 0x8b, 0x85, - 0x2d, 0xf7, 0xe7, 0xd5, 0xca, 0x5a, 0xa5, 0xd1, 0x54, 0xcb, 0xc5, 0xd2, 0x4a, 0x79, 0xb1, 0xb0, - 0xad, 0x5c, 0x0e, 0x97, 0x55, 0x6b, 0xcd, 0xe2, 0xfa, 0xba, 0x5a, 0x3b, 0x5b, 0x6e, 0xb2, 0x3f, - 0xea, 0x05, 0x9d, 0x16, 0xd4, 0x68, 0xd6, 0x57, 0x8a, 0x6a, 0xb9, 0xb8, 0xb0, 0x5a, 0x2e, 0xdc, - 0x8f, 0x9e, 0x2d, 0xc3, 0xec, 0x9a, 0x76, 0x01, 0xd7, 0xb7, 0x35, 0x0b, 0x6b, 0xe7, 0x3b, 0x18, - 0x5d, 0x2b, 0x80, 0x27, 0xfa, 0x44, 0x18, 0xaf, 0x32, 0x8f, 0xd7, 0xcd, 0x7d, 0x04, 0xcc, 0x15, - 0x11, 0x01, 0xd8, 0xbf, 0xf8, 0xcd, 0x60, 0x85, 0x03, 0xec, 0xc9, 0x09, 0xe9, 0x25, 0x43, 0xec, - 0x67, 0x1e, 0x05, 0x88, 0xa1, 0x2f, 0xca, 0x30, 0x57, 0x31, 0xf6, 0x74, 0x07, 0x2f, 0x63, 0x03, - 0x5b, 0xee, 0x38, 0x20, 0x04, 0xc3, 0x23, 0x72, 0x08, 0x86, 0x25, 0x1e, 0x86, 0x5b, 0xfa, 0x88, - 0x8d, 0x2f, 0x23, 0x62, 0xb4, 0xbd, 0x0a, 0xa6, 0x74, 0x92, 0xaf, 0xa4, 0xb7, 0x99, 0xc4, 0x82, - 0x04, 0xe5, 0x3a, 0x98, 0xa5, 0x2f, 0x4b, 0x7a, 0x07, 0xdf, 0x8b, 0x2f, 0xb1, 0x71, 0x97, 0x4f, - 0x44, 0xbf, 0xe8, 0x37, 0xbe, 0x0a, 0x87, 0xe5, 0x8f, 0x24, 0x65, 0x2a, 0x19, 0x98, 0x2f, 0x7a, - 0x34, 0x34, 0xbf, 0x7d, 0xad, 0x4c, 0x47, 0xdf, 0x93, 0x60, 0xba, 0xee, 0x98, 0x5d, 0x57, 0x65, - 0x75, 0x63, 0x4b, 0x0c, 0xdc, 0x8f, 0x85, 0xdb, 0x58, 0x89, 0x07, 0xf7, 0x09, 0x7d, 0xe4, 0x18, - 0x2a, 0x20, 0xa2, 0x85, 0x7d, 0xcb, 0x6f, 0x61, 0x4b, 0x1c, 0x2a, 0xb7, 0x26, 0xa2, 0xf6, 0x7d, - 0xd8, 0xbe, 0x5e, 0x24, 0x43, 0xc1, 0x53, 0x33, 0xa7, 0xb4, 0x6b, 0x59, 0xd8, 0x70, 0xc4, 0x40, - 0xf8, 0xcb, 0x30, 0x08, 0x2b, 0x3c, 0x08, 0xb7, 0xc6, 0x28, 0xb3, 0x57, 0x4a, 0x8a, 0x6d, 0xec, - 0x03, 0x3e, 0x9a, 0xf7, 0x72, 0x68, 0xfe, 0x68, 0x72, 0xb6, 0x92, 0x41, 0xba, 0x32, 0x04, 0xa2, - 0xc7, 0xa1, 0xe0, 0x8e, 0x49, 0xa5, 0x46, 0xe5, 0x6c, 0xb9, 0x59, 0xa9, 0x9e, 0xad, 0x34, 0xca, - 0x05, 0x8c, 0x5e, 0x28, 0xc3, 0x0c, 0x65, 0x4d, 0xc5, 0x7b, 0xe6, 0x05, 0xc1, 0x5e, 0xef, 0x8b, - 0x09, 0x8d, 0x85, 0x70, 0x09, 0x11, 0x2d, 0xe3, 0x17, 0x12, 0x18, 0x0b, 0x31, 0xe4, 0x1e, 0x4d, - 0xbd, 0xd5, 0xbe, 0x66, 0xb0, 0xd5, 0xa7, 0xb5, 0xf4, 0xed, 0xad, 0x5e, 0x94, 0x05, 0xa0, 0x95, - 0x3c, 0xab, 0xe3, 0x8b, 0x68, 0x2d, 0xc0, 0x84, 0x53, 0xdb, 0xcc, 0x40, 0xb5, 0x95, 0xfa, 0xa9, - 0xed, 0xbb, 0xc3, 0x63, 0xd6, 0x02, 0x8f, 0xde, 0x4d, 0x91, 0xe2, 0x76, 0x39, 0x89, 0x9e, 0x1d, - 0x7a, 0x8a, 0x22, 0xf1, 0x56, 0xe7, 0x55, 0x30, 0x45, 0x1e, 0xab, 0xda, 0x0e, 0x66, 0x6d, 0x28, - 0x48, 0x50, 0xce, 0xc0, 0x0c, 0xcd, 0xd8, 0x32, 0x0d, 0xb7, 0x3e, 0x59, 0x92, 0x81, 0x4b, 0x73, - 0x41, 0x6c, 0x59, 0x58, 0x73, 0x4c, 0x8b, 0xd0, 0xc8, 0x51, 0x10, 0x43, 0x49, 0xe8, 0xeb, 0x7e, - 0x2b, 0x2c, 0x73, 0x9a, 0xf3, 0xc4, 0x24, 0x55, 0x49, 0xa6, 0x37, 0x7b, 0xc3, 0xb5, 0x3f, 0xda, - 0xea, 0x9a, 0x2e, 0xda, 0x4b, 0x64, 0x6a, 0x87, 0x95, 0x93, 0xa0, 0xb0, 0x54, 0x37, 0x6f, 0xa9, - 0x56, 0x6d, 0x94, 0xab, 0x8d, 0xc2, 0x66, 0x5f, 0x8d, 0xda, 0x42, 0xaf, 0xc9, 0x42, 0xf6, 0x1e, - 0x53, 0x37, 0xd0, 0x83, 0x19, 0x4e, 0x25, 0x0c, 0xec, 0x5c, 0x34, 0xad, 0x0b, 0x7e, 0x43, 0x0d, - 0x12, 0xe2, 0xb1, 0x09, 0x54, 0x49, 0x1e, 0xa8, 0x4a, 0xd9, 0x7e, 0xaa, 0xf4, 0xcb, 0x61, 0x55, - 0xba, 0x83, 0x57, 0xa5, 0xeb, 0xfb, 0xc8, 0xdf, 0x65, 0x3e, 0xa2, 0x03, 0xf8, 0xa8, 0xdf, 0x01, - 0xdc, 0xc5, 0xc1, 0xf8, 0x78, 0x31, 0x32, 0xc9, 0x00, 0xfc, 0x42, 0xaa, 0x0d, 0xbf, 0x1f, 0xd4, - 0x5b, 0x11, 0x50, 0x6f, 0xf7, 0xe9, 0x13, 0xf4, 0xfd, 0x5d, 0xc7, 0xfd, 0xfb, 0xbb, 0x89, 0x0b, - 0xca, 0x09, 0x38, 0xb6, 0x58, 0x59, 0x5a, 0x2a, 0xab, 0xe5, 0x6a, 0xa3, 0x59, 0x2d, 0x37, 0xce, - 0xd5, 0xd4, 0x7b, 0x0b, 0x1d, 0xf4, 0xb0, 0x0c, 0xe0, 0x4a, 0xa8, 0xa4, 0x19, 0x2d, 0xdc, 0x11, - 0xeb, 0xd1, 0xff, 0xa7, 0x94, 0xac, 0x4f, 0x08, 0xe8, 0x47, 0xc0, 0xf9, 0x72, 0x49, 0xbc, 0x55, - 0x46, 0x12, 0x4b, 0x06, 0xea, 0x1b, 0x1f, 0x0d, 0xb6, 0xe7, 0x65, 0x70, 0xd4, 0xa3, 0xc7, 0xb2, - 0xf7, 0x9f, 0xf6, 0xbd, 0x25, 0x0b, 0x73, 0x0c, 0x16, 0x6f, 0x1e, 0xff, 0xdc, 0x8c, 0xc8, 0x44, - 0x1e, 0xc1, 0x24, 0x9b, 0xb6, 0x7b, 0xdd, 0xbb, 0xff, 0xae, 0x2c, 0xc3, 0x74, 0x17, 0x5b, 0x3b, - 0xba, 0x6d, 0xeb, 0xa6, 0x41, 0x17, 0xe4, 0xe6, 0x6e, 0x7d, 0xac, 0x2f, 0x71, 0xb2, 0x76, 0x39, - 0xbf, 0xae, 0x59, 0x8e, 0xde, 0xd2, 0xbb, 0x9a, 0xe1, 0xac, 0x07, 0x99, 0xd5, 0xf0, 0x9f, 0xe8, - 0x05, 0x09, 0xa7, 0x35, 0x7c, 0x4d, 0x22, 0x54, 0xe2, 0x77, 0x13, 0x4c, 0x49, 0x62, 0x09, 0x26, - 0x53, 0x8b, 0x8f, 0xa4, 0xaa, 0x16, 0x7d, 0xf0, 0xde, 0x52, 0xae, 0x80, 0x13, 0x95, 0x6a, 0xa9, - 0xa6, 0xaa, 0xe5, 0x52, 0xa3, 0xb9, 0x5e, 0x56, 0xd7, 0x2a, 0xf5, 0x7a, 0xa5, 0x56, 0xad, 0x1f, - 0xa4, 0xb5, 0xa3, 0x8f, 0xcb, 0xbe, 0xc6, 0x2c, 0xe2, 0x56, 0x47, 0x37, 0x30, 0xba, 0xeb, 0x80, - 0x0a, 0xc3, 0xaf, 0xfa, 0x88, 0xe3, 0xcc, 0xca, 0x8f, 0xc0, 0xf9, 0xd5, 0xc9, 0x71, 0xee, 0x4f, - 0xf0, 0x3f, 0x70, 0xf3, 0xff, 0xa2, 0x0c, 0xc7, 0x42, 0x0d, 0x51, 0xc5, 0x3b, 0x23, 0x5b, 0xc9, - 0xfb, 0x99, 0x70, 0xdb, 0xad, 0xf0, 0x98, 0xf6, 0xb3, 0xa6, 0xf7, 0xb1, 0x11, 0x01, 0xeb, 0x1b, - 0x7d, 0x58, 0x57, 0x39, 0x58, 0x9f, 0x3a, 0x04, 0xcd, 0x64, 0xc8, 0xfe, 0x76, 0xaa, 0xc8, 0x5e, - 0x01, 0x27, 0xd6, 0x8b, 0x6a, 0xa3, 0x52, 0xaa, 0xac, 0x17, 0xdd, 0x71, 0x34, 0x34, 0x64, 0x47, - 0x98, 0xeb, 0x3c, 0xe8, 0x7d, 0xf1, 0x7d, 0x7f, 0x16, 0xae, 0xea, 0xdf, 0xd1, 0x96, 0xb6, 0x35, - 0x63, 0x0b, 0x23, 0x5d, 0x04, 0xea, 0x45, 0x98, 0x68, 0x91, 0xec, 0x14, 0xe7, 0xf0, 0xd6, 0x4d, - 0x4c, 0x5f, 0x4e, 0x4b, 0x50, 0xbd, 0x5f, 0xd1, 0xdb, 0xc3, 0x0a, 0xd1, 0xe0, 0x15, 0xe2, 0xe9, - 0xf1, 0xe0, 0xed, 0xe3, 0x3b, 0x42, 0x37, 0x3e, 0xe5, 0xeb, 0xc6, 0x39, 0x4e, 0x37, 0x4a, 0x07, - 0x23, 0x9f, 0x4c, 0x4d, 0xfe, 0xe8, 0xd1, 0xd0, 0x01, 0x44, 0x6a, 0x93, 0x1e, 0x3d, 0x2a, 0xf4, - 0xed, 0xee, 0x5f, 0x29, 0x43, 0x7e, 0x11, 0x77, 0xb0, 0xe8, 0x4a, 0xe4, 0x37, 0x25, 0xd1, 0x0d, - 0x11, 0x0a, 0x03, 0xa5, 0x1d, 0xbd, 0x3a, 0xe2, 0xe8, 0x3b, 0xd8, 0x76, 0xb4, 0x9d, 0x2e, 0x11, - 0xb5, 0xac, 0x06, 0x09, 0xe8, 0x67, 0x25, 0x91, 0xed, 0x92, 0x98, 0x62, 0xfe, 0x63, 0xac, 0x29, - 0x7e, 0x46, 0x82, 0xc9, 0x3a, 0x76, 0x6a, 0x56, 0x1b, 0x5b, 0xa8, 0x1e, 0x60, 0x74, 0x0d, 0x4c, - 0x13, 0x50, 0xdc, 0x69, 0xa6, 0x8f, 0x53, 0x38, 0x49, 0xb9, 0x1e, 0xe6, 0xfc, 0x57, 0xf2, 0x3b, - 0xeb, 0xc6, 0x7b, 0x52, 0xd1, 0x3f, 0x66, 0x44, 0x77, 0x71, 0xd9, 0x92, 0x21, 0xe3, 0x26, 0xa2, - 0x95, 0x8a, 0xed, 0xc8, 0xc6, 0x92, 0x4a, 0x7f, 0xa3, 0xeb, 0xad, 0x12, 0xc0, 0x86, 0x61, 0x7b, - 0x72, 0x7d, 0x7c, 0x02, 0xb9, 0xa2, 0x7f, 0xce, 0x24, 0x9b, 0xc5, 0x04, 0xe5, 0x44, 0x48, 0xec, - 0xb5, 0x09, 0xd6, 0x16, 0x22, 0x89, 0xa5, 0x2f, 0xb3, 0xaf, 0xcc, 0x41, 0xfe, 0x9c, 0xd6, 0xe9, - 0x60, 0x07, 0x7d, 0x55, 0x82, 0x7c, 0xc9, 0xc2, 0x9a, 0x83, 0xc3, 0xa2, 0x43, 0x30, 0x69, 0x99, - 0xa6, 0xb3, 0xae, 0x39, 0xdb, 0x4c, 0x6e, 0xfe, 0x3b, 0x73, 0x18, 0xf8, 0xad, 0x70, 0xf7, 0x71, - 0x17, 0x2f, 0xba, 0x1f, 0xe6, 0x6a, 0x4b, 0x0b, 0x9a, 0xa7, 0x85, 0x44, 0xf4, 0x1f, 0x08, 0x26, - 0x77, 0x0c, 0xbc, 0x63, 0x1a, 0x7a, 0xcb, 0xb3, 0x39, 0xbd, 0x77, 0xf4, 0x41, 0x5f, 0xa6, 0x0b, - 0x9c, 0x4c, 0xe7, 0x85, 0x4b, 0x49, 0x26, 0xd0, 0xfa, 0x10, 0xbd, 0xc7, 0xd5, 0x70, 0x25, 0xed, - 0x0c, 0x9a, 0x8d, 0x5a, 0xb3, 0xa4, 0x96, 0x8b, 0x8d, 0x72, 0x73, 0xb5, 0x56, 0x2a, 0xae, 0x36, - 0xd5, 0xf2, 0x7a, 0xad, 0x80, 0xd1, 0xdf, 0x49, 0xae, 0x70, 0x5b, 0xe6, 0x1e, 0xb6, 0xd0, 0xb2, - 0x90, 0x9c, 0xe3, 0x64, 0xc2, 0x30, 0xf8, 0x65, 0x61, 0xa7, 0x0d, 0x26, 0x1d, 0xc6, 0x41, 0x84, - 0xf2, 0x7e, 0x48, 0xa8, 0xb9, 0xc7, 0x92, 0x7a, 0x14, 0x48, 0xfa, 0x7f, 0x49, 0x30, 0x51, 0x32, - 0x8d, 0x3d, 0x6c, 0x39, 0xe1, 0xf9, 0x4e, 0x58, 0x9a, 0x19, 0x5e, 0x9a, 0xee, 0x20, 0x89, 0x0d, - 0xc7, 0x32, 0xbb, 0xde, 0x84, 0xc7, 0x7b, 0x45, 0xaf, 0x4f, 0x2a, 0x61, 0x56, 0x72, 0xf4, 0xc2, - 0x67, 0xff, 0x82, 0x38, 0xf6, 0xe4, 0x9e, 0x06, 0xf0, 0x70, 0x12, 0x5c, 0xfa, 0x33, 0x90, 0x7e, - 0x97, 0xf2, 0x25, 0x19, 0x66, 0x69, 0xe3, 0xab, 0x63, 0x62, 0xa1, 0xa1, 0x5a, 0x78, 0xc9, 0xb1, - 0x47, 0xf8, 0x2b, 0x47, 0x38, 0xf1, 0xe7, 0xb5, 0x6e, 0xd7, 0x5f, 0x7e, 0x5e, 0x39, 0xa2, 0xb2, - 0x77, 0xaa, 0xe6, 0x0b, 0x79, 0xc8, 0x6a, 0xbb, 0xce, 0x36, 0xfa, 0x9e, 0xf0, 0xe4, 0x93, 0xeb, - 0x0c, 0x18, 0x3f, 0x11, 0x90, 0x1c, 0x87, 0x9c, 0x63, 0x5e, 0xc0, 0x9e, 0x1c, 0xe8, 0x8b, 0x0b, - 0x87, 0xd6, 0xed, 0x36, 0xc8, 0x07, 0x06, 0x87, 0xf7, 0xee, 0xda, 0x3a, 0x5a, 0xab, 0x65, 0xee, - 0x1a, 0x4e, 0xc5, 0x5b, 0x82, 0x0e, 0x12, 0xd0, 0xe7, 0x33, 0x22, 0x93, 0x59, 0x01, 0x06, 0x93, - 0x41, 0x76, 0x7e, 0x88, 0xa6, 0x34, 0x0f, 0x37, 0x16, 0xd7, 0xd7, 0x9b, 0x8d, 0xda, 0xbd, 0xe5, - 0x6a, 0x60, 0x78, 0x36, 0x2b, 0xd5, 0x66, 0x63, 0xa5, 0xdc, 0x2c, 0x6d, 0xa8, 0x64, 0x9d, 0xb0, - 0x58, 0x2a, 0xd5, 0x36, 0xaa, 0x8d, 0x02, 0x46, 0x6f, 0x92, 0x60, 0xa6, 0xd4, 0x31, 0x6d, 0x1f, - 0xe1, 0xab, 0x03, 0x84, 0x7d, 0x31, 0x66, 0x42, 0x62, 0x44, 0xff, 0x96, 0x11, 0x75, 0x3a, 0xf0, - 0x04, 0x12, 0x22, 0x1f, 0xd1, 0x4b, 0xbd, 0x5e, 0xc8, 0xe9, 0x60, 0x30, 0xbd, 0xf4, 0x9b, 0xc4, - 0x67, 0x6e, 0x87, 0x89, 0x22, 0x55, 0x0c, 0xf4, 0xd7, 0x19, 0xc8, 0x97, 0x4c, 0x63, 0x53, 0xdf, - 0x72, 0x8d, 0x39, 0x6c, 0x68, 0xe7, 0x3b, 0x78, 0x51, 0x73, 0xb4, 0x3d, 0x1d, 0x5f, 0x24, 0x15, - 0x98, 0x54, 0x7b, 0x52, 0x5d, 0xa6, 0x58, 0x0a, 0x3e, 0xbf, 0xbb, 0x45, 0x98, 0x9a, 0x54, 0xc3, - 0x49, 0xca, 0x53, 0xe1, 0x72, 0xfa, 0xba, 0x6e, 0x61, 0x0b, 0x77, 0xb0, 0x66, 0x63, 0x77, 0x5a, - 0x64, 0xe0, 0x0e, 0x51, 0xda, 0x49, 0x35, 0xea, 0xb3, 0x72, 0x06, 0x66, 0xe8, 0x27, 0x62, 0x8a, - 0xd8, 0x44, 0x8d, 0x27, 0x55, 0x2e, 0x4d, 0x79, 0x02, 0xe4, 0xf0, 0x03, 0x8e, 0xa5, 0x9d, 0x6a, - 0x13, 0xbc, 0x2e, 0x9f, 0xa7, 0x5e, 0x87, 0xf3, 0x9e, 0xd7, 0xe1, 0x7c, 0x9d, 0xf8, 0x24, 0xaa, - 0x34, 0x17, 0x7a, 0xd9, 0xa4, 0x6f, 0x48, 0xfc, 0xbb, 0x14, 0x28, 0x86, 0x02, 0x59, 0x43, 0xdb, - 0xc1, 0x4c, 0x2f, 0xc8, 0xb3, 0x72, 0x23, 0x1c, 0xd5, 0xf6, 0x34, 0x47, 0xb3, 0x56, 0xcd, 0x96, - 0xd6, 0x21, 0x83, 0x9f, 0xd7, 0xf2, 0x7b, 0x3f, 0x90, 0x1d, 0x21, 0xc7, 0xb4, 0x30, 0xc9, 0xe5, - 0xed, 0x08, 0x79, 0x09, 0x2e, 0x75, 0xbd, 0x65, 0x1a, 0x84, 0x7f, 0x59, 0x25, 0xcf, 0xae, 0x54, - 0xda, 0xba, 0xed, 0x56, 0x84, 0x50, 0xa9, 0xd2, 0xad, 0x8d, 0xfa, 0x25, 0xa3, 0x45, 0x76, 0x83, - 0x26, 0xd5, 0xa8, 0xcf, 0xca, 0x02, 0x4c, 0xb3, 0x8d, 0x90, 0x35, 0x57, 0xaf, 0xf2, 0x44, 0xaf, - 0xae, 0xe1, 0x7d, 0xba, 0x28, 0x9e, 0xf3, 0xd5, 0x20, 0x9f, 0x1a, 0xfe, 0x49, 0xb9, 0x1b, 0xae, - 0x64, 0xaf, 0xa5, 0x5d, 0xdb, 0x31, 0x77, 0x28, 0xe8, 0x4b, 0x7a, 0x87, 0xd6, 0x60, 0x82, 0xd4, - 0x20, 0x2e, 0x8b, 0x72, 0x2b, 0x1c, 0xef, 0x5a, 0x78, 0x13, 0x5b, 0xf7, 0x69, 0x3b, 0xbb, 0x0f, - 0x34, 0x2c, 0xcd, 0xb0, 0xbb, 0xa6, 0xe5, 0x9c, 0x9a, 0x24, 0xcc, 0xf7, 0xfd, 0xc6, 0x3a, 0xca, - 0x49, 0xc8, 0x53, 0xf1, 0xa1, 0xe7, 0xe7, 0x84, 0xdd, 0x39, 0x59, 0x85, 0x62, 0xcd, 0xb3, 0x5b, - 0x60, 0x82, 0xf5, 0x70, 0x04, 0xa8, 0xe9, 0x5b, 0x4f, 0xf6, 0xac, 0x2b, 0x30, 0x2a, 0xaa, 0x97, - 0x4d, 0x79, 0x12, 0xe4, 0x5b, 0xa4, 0x5a, 0x04, 0xb3, 0xe9, 0x5b, 0xaf, 0xec, 0x5f, 0x28, 0xc9, - 0xa2, 0xb2, 0xac, 0xe8, 0x2f, 0x64, 0x21, 0x0f, 0xd0, 0x38, 0x8e, 0x93, 0xb5, 0xea, 0xaf, 0x4b, - 0x43, 0x74, 0x9b, 0x37, 0xc1, 0x0d, 0xac, 0x4f, 0x64, 0xf6, 0xc7, 0x62, 0x73, 0x61, 0xc3, 0x9b, - 0x0c, 0xba, 0x56, 0x49, 0xbd, 0x51, 0x54, 0xdd, 0x99, 0xfc, 0xa2, 0x3b, 0x89, 0xbc, 0x11, 0xae, - 0x1f, 0x90, 0xbb, 0xdc, 0x68, 0x56, 0x8b, 0x6b, 0xe5, 0xc2, 0x26, 0x6f, 0xdb, 0xd4, 0x1b, 0xb5, - 0xf5, 0xa6, 0xba, 0x51, 0xad, 0x56, 0xaa, 0xcb, 0x94, 0x98, 0x6b, 0x12, 0x9e, 0x0c, 0x32, 0x9c, - 0x53, 0x2b, 0x8d, 0x72, 0xb3, 0x54, 0xab, 0x2e, 0x55, 0x96, 0x0b, 0xfa, 0x20, 0xc3, 0xe8, 0x7e, - 0xe5, 0x1a, 0xb8, 0x8a, 0xe3, 0xa4, 0x52, 0xab, 0xba, 0x33, 0xdb, 0x52, 0xb1, 0x5a, 0x2a, 0xbb, - 0xd3, 0xd8, 0x0b, 0x0a, 0x82, 0x13, 0x94, 0x5c, 0x73, 0xa9, 0xb2, 0x1a, 0xde, 0x8c, 0xfa, 0x58, - 0x46, 0x39, 0x05, 0x97, 0x85, 0xbf, 0x55, 0xaa, 0x67, 0x8b, 0xab, 0x95, 0xc5, 0xc2, 0x1f, 0x66, - 0x94, 0xeb, 0xe0, 0x6a, 0xee, 0x2f, 0xba, 0xaf, 0xd4, 0xac, 0x2c, 0x36, 0xd7, 0x2a, 0xf5, 0xb5, - 0x62, 0xa3, 0xb4, 0x52, 0xf8, 0x38, 0x99, 0x2f, 0xf8, 0x06, 0x70, 0xc8, 0x2d, 0xf3, 0x45, 0xe1, - 0x31, 0xbd, 0xc8, 0x2b, 0xea, 0xe3, 0xfb, 0xc2, 0x1e, 0x6f, 0xc3, 0x7e, 0xc4, 0x1f, 0x1d, 0x16, - 0x39, 0x15, 0xba, 0x25, 0x01, 0xad, 0x64, 0x3a, 0xd4, 0x18, 0x42, 0x85, 0xae, 0x81, 0xab, 0xaa, - 0x65, 0x8a, 0x94, 0x5a, 0x2e, 0xd5, 0xce, 0x96, 0xd5, 0xe6, 0xb9, 0xe2, 0xea, 0x6a, 0xb9, 0xd1, - 0x5c, 0xaa, 0xa8, 0xf5, 0x46, 0x61, 0x13, 0xfd, 0xb3, 0xe4, 0xaf, 0xe6, 0x84, 0xa4, 0xf5, 0xd7, - 0x52, 0xd2, 0x66, 0x1d, 0xbb, 0x6a, 0xf3, 0x23, 0x90, 0xb7, 0x1d, 0xcd, 0xd9, 0xb5, 0x59, 0xab, - 0x7e, 0x4c, 0xff, 0x56, 0x3d, 0x5f, 0x27, 0x99, 0x54, 0x96, 0x19, 0xfd, 0x45, 0x26, 0x49, 0x33, - 0x1d, 0xc1, 0x82, 0x8e, 0x3e, 0x84, 0x88, 0x4f, 0x03, 0xf2, 0xb4, 0xbd, 0x52, 0x6f, 0x16, 0x57, - 0xd5, 0x72, 0x71, 0xf1, 0x3e, 0x7f, 0x19, 0x07, 0x2b, 0x27, 0xe0, 0xd8, 0x46, 0xb5, 0xb8, 0xb0, - 0x5a, 0x26, 0xcd, 0xa5, 0x56, 0xad, 0x96, 0x4b, 0xae, 0xdc, 0x7f, 0x96, 0x6c, 0x9a, 0xb8, 0x16, - 0x34, 0xe1, 0xdb, 0xb5, 0x72, 0x42, 0xf2, 0xff, 0x9a, 0xb0, 0x6f, 0x51, 0xa0, 0x61, 0x61, 0x5a, - 0xa3, 0xc5, 0xe1, 0xf3, 0x42, 0xee, 0x44, 0x42, 0x9c, 0x24, 0xc3, 0xe3, 0x3f, 0x0f, 0x81, 0xc7, - 0x09, 0x38, 0x16, 0xc6, 0x83, 0xb8, 0x15, 0x45, 0xc3, 0xf0, 0xe5, 0x49, 0xc8, 0xd7, 0x71, 0x07, - 0xb7, 0x1c, 0xf4, 0x96, 0x90, 0x31, 0x31, 0x07, 0x92, 0xef, 0xc6, 0x22, 0xe9, 0x6d, 0x6e, 0xfa, - 0x2c, 0xf5, 0x4c, 0x9f, 0x63, 0xcc, 0x00, 0x39, 0x91, 0x19, 0x90, 0x4d, 0xc1, 0x0c, 0xc8, 0x0d, - 0x6f, 0x06, 0xe4, 0x07, 0x99, 0x01, 0xe8, 0xb5, 0xf9, 0xa4, 0xbd, 0x04, 0x15, 0xf5, 0xe1, 0x0e, - 0xfe, 0xff, 0x33, 0x9b, 0xa4, 0x57, 0xe9, 0xcb, 0x71, 0x32, 0x2d, 0xfe, 0x9e, 0x9c, 0xc2, 0xf2, - 0x83, 0x72, 0x2d, 0x5c, 0x1d, 0xbc, 0x37, 0xcb, 0xcf, 0xa8, 0xd4, 0x1b, 0x75, 0x32, 0xe2, 0x97, - 0x6a, 0xaa, 0xba, 0xb1, 0x4e, 0xd7, 0x90, 0x4f, 0x82, 0x12, 0x50, 0x51, 0x37, 0xaa, 0x74, 0x7c, - 0xdf, 0xe2, 0xa9, 0x2f, 0x55, 0xaa, 0x8b, 0x4d, 0xbf, 0xcd, 0x54, 0x97, 0x6a, 0x85, 0x6d, 0x77, - 0xca, 0x16, 0xa2, 0xee, 0x0e, 0xd0, 0xac, 0x84, 0x62, 0x75, 0xb1, 0xb9, 0x56, 0x2d, 0xaf, 0xd5, - 0xaa, 0x95, 0x12, 0x49, 0xaf, 0x97, 0x1b, 0x05, 0xdd, 0x1d, 0x68, 0x7a, 0x2c, 0x8a, 0x7a, 0xb9, - 0xa8, 0x96, 0x56, 0xca, 0x2a, 0x2d, 0xf2, 0x7e, 0xe5, 0x7a, 0x38, 0x53, 0xac, 0xd6, 0x1a, 0x6e, - 0x4a, 0xb1, 0x7a, 0x5f, 0xe3, 0xbe, 0xf5, 0x72, 0x73, 0x5d, 0xad, 0x95, 0xca, 0xf5, 0xba, 0xdb, - 0x4e, 0x99, 0xfd, 0x51, 0xe8, 0x28, 0x4f, 0x87, 0xdb, 0x43, 0xac, 0x95, 0x1b, 0x64, 0xc3, 0x72, - 0xad, 0x46, 0x7c, 0x56, 0x16, 0xcb, 0xcd, 0x95, 0x62, 0xbd, 0x59, 0xa9, 0x96, 0x6a, 0x6b, 0xeb, - 0xc5, 0x46, 0xc5, 0x6d, 0xce, 0xeb, 0x6a, 0xad, 0x51, 0x6b, 0x9e, 0x2d, 0xab, 0xf5, 0x4a, 0xad, - 0x5a, 0x30, 0xdc, 0x2a, 0x87, 0xda, 0xbf, 0xd7, 0x0f, 0x9b, 0xca, 0x55, 0x70, 0xca, 0x4b, 0x5f, - 0xad, 0xb9, 0x82, 0x0e, 0x59, 0x24, 0xdd, 0x54, 0x2d, 0x92, 0x7f, 0x95, 0x20, 0x5b, 0x77, 0xcc, - 0x2e, 0xfa, 0xe1, 0xa0, 0x83, 0x39, 0x0d, 0x60, 0x91, 0xfd, 0x47, 0x77, 0x16, 0xc6, 0xe6, 0x65, - 0xa1, 0x14, 0xf4, 0x07, 0xc2, 0x9b, 0x26, 0x41, 0x9f, 0x6d, 0x76, 0x23, 0x6c, 0x95, 0xef, 0x88, - 0x9d, 0x22, 0x89, 0x26, 0x94, 0x4c, 0xdf, 0x7f, 0x61, 0x98, 0x6d, 0x11, 0x04, 0x27, 0x43, 0xb0, - 0xb9, 0xf2, 0xf7, 0x54, 0x02, 0x2b, 0x97, 0xc3, 0x65, 0x3d, 0xca, 0x45, 0x74, 0x6a, 0x53, 0xf9, - 0x21, 0x78, 0x4c, 0x48, 0xbd, 0xcb, 0x6b, 0xb5, 0xb3, 0x65, 0x5f, 0x91, 0x17, 0x8b, 0x8d, 0x62, - 0x61, 0x0b, 0x7d, 0x46, 0x86, 0xec, 0x9a, 0xb9, 0xd7, 0xbb, 0x57, 0x65, 0xe0, 0x8b, 0xa1, 0xb5, - 0x50, 0xef, 0x95, 0xf7, 0x9a, 0x17, 0x12, 0xfb, 0x5a, 0xf4, 0xbe, 0xf4, 0xe7, 0xa5, 0x24, 0x62, - 0x5f, 0x3b, 0xe8, 0x66, 0xf4, 0xdf, 0x0f, 0x23, 0xf6, 0x08, 0xd1, 0x62, 0xe5, 0x0c, 0x9c, 0x0e, - 0x3e, 0x54, 0x16, 0xcb, 0xd5, 0x46, 0x65, 0xe9, 0xbe, 0x40, 0xb8, 0x15, 0x55, 0x48, 0xfc, 0x83, - 0xba, 0xb1, 0xf8, 0x99, 0xc6, 0x29, 0x38, 0x1e, 0x7c, 0x5b, 0x2e, 0x37, 0xbc, 0x2f, 0xf7, 0xa3, - 0x07, 0x73, 0x30, 0x43, 0xbb, 0xf5, 0x8d, 0x6e, 0x5b, 0x73, 0x30, 0x7a, 0x52, 0x80, 0xee, 0x0d, - 0x70, 0xb4, 0xb2, 0xbe, 0x54, 0xaf, 0x3b, 0xa6, 0xa5, 0x6d, 0xe1, 0x62, 0xbb, 0x6d, 0x31, 0x69, - 0xf5, 0x26, 0xa3, 0x77, 0x0a, 0xaf, 0xf3, 0xf1, 0x43, 0x09, 0x2d, 0x33, 0x02, 0xf5, 0x2f, 0x09, - 0xad, 0xcb, 0x09, 0x10, 0x4c, 0x86, 0xfe, 0xfd, 0x23, 0x6e, 0x73, 0xd1, 0xb8, 0x6c, 0x9e, 0x79, - 0x8e, 0x04, 0x53, 0x0d, 0x7d, 0x07, 0x3f, 0xd3, 0x34, 0xb0, 0xad, 0x4c, 0x80, 0xbc, 0xbc, 0xd6, - 0x28, 0x1c, 0x71, 0x1f, 0x5c, 0xa3, 0x2a, 0x43, 0x1e, 0xca, 0x6e, 0x01, 0xee, 0x43, 0xb1, 0x51, - 0x90, 0xdd, 0x87, 0xb5, 0x72, 0xa3, 0x90, 0x75, 0x1f, 0xaa, 0xe5, 0x46, 0x21, 0xe7, 0x3e, 0xac, - 0xaf, 0x36, 0x0a, 0x79, 0xf7, 0xa1, 0x52, 0x6f, 0x14, 0x26, 0xdc, 0x87, 0x85, 0x7a, 0xa3, 0x30, - 0xe9, 0x3e, 0x9c, 0xad, 0x37, 0x0a, 0x53, 0xee, 0x43, 0xa9, 0xd1, 0x28, 0x80, 0xfb, 0x70, 0x4f, - 0xbd, 0x51, 0x98, 0x76, 0x1f, 0x8a, 0xa5, 0x46, 0x61, 0x86, 0x3c, 0x94, 0x1b, 0x85, 0x59, 0xf7, - 0xa1, 0x5e, 0x6f, 0x14, 0xe6, 0x08, 0xe5, 0x7a, 0xa3, 0x70, 0x94, 0x94, 0x55, 0x69, 0x14, 0x0a, - 0xee, 0xc3, 0x4a, 0xbd, 0x51, 0x38, 0x46, 0x32, 0xd7, 0x1b, 0x05, 0x85, 0x14, 0x5a, 0x6f, 0x14, - 0x2e, 0x23, 0x79, 0xea, 0x8d, 0xc2, 0x71, 0x52, 0x44, 0xbd, 0x51, 0x38, 0x41, 0xd8, 0x28, 0x37, - 0x0a, 0x27, 0x49, 0x1e, 0xb5, 0x51, 0xb8, 0x9c, 0x7c, 0xaa, 0x36, 0x0a, 0xa7, 0x08, 0x63, 0xe5, - 0x46, 0xe1, 0x0a, 0xf2, 0xa0, 0x36, 0x0a, 0x88, 0x7c, 0x2a, 0x36, 0x0a, 0x57, 0xa2, 0xc7, 0xc0, - 0xd4, 0x32, 0x76, 0x28, 0x88, 0xa8, 0x00, 0xf2, 0x32, 0x76, 0xc2, 0x66, 0xfc, 0x57, 0x64, 0xb8, - 0x9c, 0x4d, 0xfd, 0x96, 0x2c, 0x73, 0x67, 0x15, 0x6f, 0x69, 0xad, 0x4b, 0xe5, 0x07, 0x5c, 0x13, - 0x2a, 0xbc, 0x2f, 0xab, 0x40, 0xb6, 0x1b, 0x74, 0x46, 0xe4, 0x39, 0xd6, 0xe2, 0xf4, 0x16, 0xa3, - 0xe4, 0x60, 0x31, 0x8a, 0x59, 0x64, 0xff, 0x14, 0xd6, 0x68, 0x6e, 0xfd, 0x38, 0xd3, 0xb3, 0x7e, - 0xec, 0x36, 0x93, 0x2e, 0xb6, 0x6c, 0xd3, 0xd0, 0x3a, 0x75, 0xb6, 0x71, 0x4f, 0x57, 0xbd, 0x7a, - 0x93, 0x95, 0x1f, 0xf3, 0x5a, 0x06, 0xb5, 0xca, 0x9e, 0x16, 0x37, 0xc3, 0xed, 0xad, 0x66, 0x44, - 0x23, 0xf9, 0xb8, 0xdf, 0x48, 0x1a, 0x5c, 0x23, 0xb9, 0xfb, 0x00, 0xb4, 0x93, 0xb5, 0x97, 0xca, - 0x70, 0x53, 0x8b, 0xc0, 0xad, 0xd5, 0x5b, 0xae, 0x96, 0xd1, 0x67, 0x24, 0x38, 0x59, 0x36, 0xfa, - 0x59, 0xf8, 0x61, 0x5d, 0x78, 0x53, 0x18, 0x9a, 0x75, 0x5e, 0xa4, 0xb7, 0xf7, 0xad, 0x76, 0x7f, - 0x9a, 0x11, 0x12, 0xfd, 0xa4, 0x2f, 0xd1, 0x3a, 0x27, 0xd1, 0xbb, 0x86, 0x27, 0x9d, 0x4c, 0xa0, - 0xd5, 0x91, 0x76, 0x40, 0x59, 0xf4, 0xf5, 0x2c, 0x3c, 0x86, 0xfa, 0xde, 0x30, 0x0e, 0x69, 0x2b, - 0x2b, 0x1a, 0x6d, 0x15, 0xdb, 0x8e, 0x66, 0x39, 0xdc, 0x79, 0xe8, 0x9e, 0xa9, 0x54, 0x26, 0x85, - 0xa9, 0x94, 0x34, 0x70, 0x2a, 0x85, 0xde, 0x11, 0x36, 0x1f, 0xce, 0xf1, 0x18, 0x17, 0xfb, 0xf7, - 0xff, 0x71, 0x35, 0x8c, 0x82, 0xda, 0xb7, 0x2b, 0x7e, 0x9c, 0x83, 0x7a, 0xe9, 0xc0, 0x25, 0x24, - 0x43, 0xfc, 0x0f, 0x46, 0x6b, 0xe7, 0x65, 0xc3, 0xdf, 0x78, 0xa3, 0xa4, 0xd0, 0x4e, 0xd5, 0x40, - 0xff, 0xd4, 0x04, 0x4c, 0x91, 0xb6, 0xb0, 0xaa, 0x1b, 0x17, 0xd0, 0xc3, 0x32, 0xcc, 0x54, 0xf1, - 0xc5, 0xd2, 0xb6, 0xd6, 0xe9, 0x60, 0x63, 0x0b, 0x87, 0xcd, 0xf6, 0x53, 0x30, 0xa1, 0x75, 0xbb, - 0xd5, 0x60, 0x9f, 0xc1, 0x7b, 0x65, 0xfd, 0xef, 0xd7, 0xfa, 0x36, 0xf2, 0x4c, 0x4c, 0x23, 0xf7, - 0xcb, 0x9d, 0x0f, 0x97, 0x19, 0x31, 0x43, 0xbe, 0x06, 0xa6, 0x5b, 0x5e, 0x16, 0xff, 0xdc, 0x44, - 0x38, 0x09, 0xfd, 0x6d, 0xa2, 0x6e, 0x40, 0xa8, 0xf0, 0x64, 0x4a, 0x81, 0x47, 0x6c, 0x87, 0x9c, - 0x80, 0x63, 0x8d, 0x5a, 0xad, 0xb9, 0x56, 0xac, 0xde, 0x17, 0x9c, 0x57, 0xde, 0x44, 0x2f, 0xcf, - 0xc2, 0x5c, 0xdd, 0xec, 0xec, 0xe1, 0x00, 0xa6, 0x0a, 0xe7, 0x90, 0x13, 0x96, 0x53, 0x66, 0x9f, - 0x9c, 0x94, 0x93, 0x90, 0xd7, 0x0c, 0xfb, 0x22, 0xf6, 0x6c, 0x43, 0xf6, 0xc6, 0x60, 0x7c, 0x7f, - 0xb8, 0x1d, 0xab, 0x3c, 0x8c, 0x77, 0x0c, 0x90, 0x24, 0xcf, 0x55, 0x04, 0x90, 0x67, 0x60, 0xc6, - 0xa6, 0x9b, 0x85, 0x8d, 0xd0, 0x9e, 0x30, 0x97, 0x46, 0x58, 0xa4, 0xbb, 0xd5, 0x32, 0x63, 0x91, - 0xbc, 0xa1, 0x87, 0xfd, 0xe6, 0xbf, 0xc1, 0x41, 0x5c, 0x3c, 0x08, 0x63, 0xc9, 0x40, 0x7e, 0xe5, - 0xa8, 0x67, 0x78, 0xa7, 0xe0, 0x38, 0x6b, 0xb5, 0xcd, 0xd2, 0x4a, 0x71, 0x75, 0xb5, 0x5c, 0x5d, - 0x2e, 0x37, 0x2b, 0x8b, 0x74, 0xab, 0x22, 0x48, 0x29, 0x36, 0x1a, 0xe5, 0xb5, 0xf5, 0x46, 0xbd, - 0x59, 0x7e, 0x46, 0xa9, 0x5c, 0x5e, 0x24, 0x2e, 0x71, 0xe4, 0x4c, 0x8b, 0xe7, 0xbc, 0x58, 0xac, - 0xd6, 0xcf, 0x95, 0xd5, 0xc2, 0xf6, 0x99, 0x22, 0x4c, 0x87, 0xfa, 0x79, 0x97, 0xbb, 0x45, 0xbc, - 0xa9, 0xed, 0x76, 0x98, 0xad, 0x56, 0x38, 0xe2, 0x72, 0x47, 0x64, 0x53, 0x33, 0x3a, 0x97, 0x0a, - 0x19, 0xa5, 0x00, 0x33, 0xe1, 0x2e, 0xbd, 0x20, 0xa1, 0xb7, 0x5e, 0x05, 0x53, 0xe7, 0x4c, 0xeb, - 0x02, 0xf1, 0xe3, 0x42, 0xef, 0xa1, 0x71, 0x4d, 0xbc, 0x13, 0xa2, 0xa1, 0x81, 0xfd, 0x95, 0xe2, - 0xde, 0x02, 0x1e, 0xb5, 0xf9, 0x81, 0xa7, 0x40, 0xaf, 0x81, 0xe9, 0x8b, 0x5e, 0xee, 0xa0, 0xa5, - 0x87, 0x92, 0xd0, 0x6f, 0x88, 0xed, 0xff, 0x0f, 0x2e, 0x32, 0xfd, 0xfd, 0xe9, 0xb7, 0x48, 0x90, - 0x5f, 0xc6, 0x4e, 0xb1, 0xd3, 0x09, 0xcb, 0xed, 0xc5, 0xc2, 0x27, 0x7b, 0xb8, 0x4a, 0x14, 0x3b, - 0x9d, 0xe8, 0x46, 0x15, 0x12, 0x90, 0xe7, 0x81, 0xce, 0xa5, 0x09, 0xfa, 0xcd, 0x0d, 0x28, 0x30, - 0x7d, 0x89, 0x7d, 0x50, 0xf6, 0xf7, 0xb8, 0x1f, 0x09, 0x59, 0x39, 0x4f, 0x0c, 0x62, 0xda, 0x64, - 0xe2, 0xf7, 0xca, 0xbd, 0x7c, 0xca, 0xbd, 0x30, 0xb1, 0x6b, 0xe3, 0x92, 0x66, 0x63, 0xc2, 0x5b, - 0x6f, 0x4d, 0x6b, 0xe7, 0xef, 0xc7, 0x2d, 0x67, 0xbe, 0xb2, 0xe3, 0x1a, 0xd4, 0x1b, 0x34, 0xa3, - 0x1f, 0x26, 0x86, 0xbd, 0xab, 0x1e, 0x05, 0x77, 0x52, 0x72, 0x51, 0x77, 0xb6, 0x4b, 0xdb, 0x9a, - 0xc3, 0xd6, 0xb6, 0xfd, 0x77, 0xf4, 0xfc, 0x21, 0xe0, 0x8c, 0xdd, 0x0b, 0x8e, 0x3c, 0x20, 0x98, - 0x18, 0xc4, 0x11, 0x6c, 0xe0, 0x0e, 0x03, 0xe2, 0x3f, 0x48, 0x90, 0xad, 0x75, 0xb1, 0x21, 0x7c, - 0x1a, 0xc6, 0x97, 0xad, 0xd4, 0x23, 0xdb, 0x87, 0xc5, 0xbd, 0xc3, 0xfc, 0x4a, 0xbb, 0x25, 0x47, - 0x48, 0xf6, 0x66, 0xc8, 0xea, 0xc6, 0xa6, 0xc9, 0x0c, 0xd3, 0x2b, 0x23, 0x36, 0x81, 0x2a, 0xc6, - 0xa6, 0xa9, 0x92, 0x8c, 0xa2, 0x8e, 0x61, 0x71, 0x65, 0xa7, 0x2f, 0xee, 0x6f, 0x4c, 0x42, 0x9e, - 0xaa, 0x33, 0x7a, 0x91, 0x0c, 0x72, 0xb1, 0xdd, 0x8e, 0x10, 0xbc, 0xb4, 0x4f, 0xf0, 0x26, 0xf9, - 0xcd, 0xc7, 0xc4, 0x7f, 0xe7, 0x83, 0x99, 0x08, 0xf6, 0xed, 0xac, 0x49, 0x15, 0xdb, 0xed, 0x68, - 0x1f, 0x54, 0xbf, 0x40, 0x89, 0x2f, 0x30, 0xdc, 0xc2, 0x65, 0xb1, 0x16, 0x9e, 0x78, 0x20, 0x88, - 0xe4, 0x2f, 0x7d, 0x88, 0xfe, 0x49, 0x82, 0x89, 0x55, 0xdd, 0x76, 0x5c, 0x6c, 0x8a, 0x22, 0xd8, - 0x5c, 0x05, 0x53, 0x9e, 0x68, 0xdc, 0x2e, 0xcf, 0xed, 0xcf, 0x83, 0x04, 0xf4, 0x9a, 0x30, 0x3a, - 0xf7, 0xf0, 0xe8, 0x3c, 0x39, 0xbe, 0xf6, 0x8c, 0x8b, 0xe8, 0x53, 0x06, 0x41, 0xb1, 0x52, 0x6f, - 0xb1, 0xbf, 0xe5, 0x0b, 0x7c, 0x8d, 0x13, 0xf8, 0x6d, 0xc3, 0x14, 0x99, 0xbe, 0xd0, 0x3f, 0x2b, - 0x01, 0xb8, 0x65, 0xb3, 0xa3, 0x5c, 0x8f, 0xe3, 0x0e, 0x68, 0xc7, 0x48, 0xf7, 0xe5, 0x61, 0xe9, - 0xae, 0xf1, 0xd2, 0xfd, 0xd1, 0xc1, 0x55, 0x8d, 0x3b, 0xb2, 0xa5, 0x14, 0x40, 0xd6, 0x7d, 0xd1, - 0xba, 0x8f, 0xe8, 0x2d, 0xbe, 0x50, 0xd7, 0x39, 0xa1, 0xde, 0x31, 0x64, 0x49, 0xe9, 0xcb, 0xf5, - 0x2f, 0x25, 0x98, 0xa8, 0x63, 0xc7, 0xed, 0x26, 0xd1, 0x59, 0x91, 0x1e, 0x3e, 0xd4, 0xb6, 0x25, - 0xc1, 0xb6, 0xfd, 0xed, 0x8c, 0x68, 0xa0, 0x97, 0x40, 0x32, 0x8c, 0xa7, 0x88, 0xc5, 0x83, 0x47, - 0x84, 0x02, 0xbd, 0x0c, 0xa2, 0x96, 0xbe, 0x74, 0xdf, 0x24, 0xf9, 0x1b, 0xf3, 0xfc, 0x49, 0x8b, - 0xb0, 0x59, 0x9c, 0xd9, 0x6f, 0x16, 0x8b, 0x9f, 0xb4, 0x08, 0xd7, 0x31, 0x7a, 0x57, 0x3a, 0xb1, - 0xb1, 0x31, 0x82, 0x0d, 0xe3, 0x61, 0xe4, 0xf5, 0x6c, 0x19, 0xf2, 0x6c, 0x65, 0xf9, 0xae, 0xf8, - 0x95, 0xe5, 0xc1, 0x53, 0x8b, 0x77, 0x0f, 0x61, 0xca, 0xc5, 0x2d, 0xf7, 0xfa, 0x6c, 0x48, 0x21, - 0x36, 0x6e, 0x82, 0x1c, 0x89, 0x44, 0xc9, 0xc6, 0xb9, 0x60, 0xaf, 0xdf, 0x23, 0x51, 0x76, 0xbf, - 0xaa, 0x34, 0x53, 0x62, 0x14, 0x46, 0xb0, 0x42, 0x3c, 0x0c, 0x0a, 0xbf, 0xa6, 0x00, 0xac, 0xef, - 0x9e, 0xef, 0xe8, 0xf6, 0xb6, 0x6e, 0x6c, 0xa1, 0x2f, 0x67, 0x60, 0x86, 0xbd, 0xd2, 0x80, 0x8a, - 0xb1, 0xe6, 0x5f, 0xa4, 0x51, 0x50, 0x00, 0x79, 0xd7, 0xd2, 0xd9, 0x32, 0x80, 0xfb, 0xa8, 0xdc, - 0xe9, 0x3b, 0xf2, 0x64, 0x7b, 0x8e, 0xd2, 0xbb, 0x62, 0x08, 0x38, 0x98, 0x0f, 0x95, 0x1e, 0x38, - 0xf4, 0x84, 0xa3, 0x66, 0xe6, 0xf8, 0xa8, 0x99, 0xdc, 0xf9, 0xba, 0x7c, 0xcf, 0xf9, 0x3a, 0x17, - 0x47, 0x5b, 0x7f, 0x26, 0x26, 0xce, 0xa5, 0xb2, 0x4a, 0x9e, 0xd1, 0x07, 0x82, 0xa9, 0x8a, 0x29, - 0x68, 0xe7, 0x26, 0xa8, 0xe8, 0x55, 0x30, 0x75, 0xbf, 0xa9, 0x1b, 0x64, 0x2b, 0x82, 0x39, 0x0f, - 0x07, 0x09, 0xe8, 0xc3, 0xc2, 0x71, 0xb0, 0x42, 0x22, 0x89, 0x9d, 0x74, 0x30, 0x0e, 0x24, 0x9f, - 0x83, 0xd0, 0x7e, 0x5e, 0x5c, 0x87, 0x39, 0x88, 0x7e, 0x32, 0xd5, 0xdb, 0x19, 0x62, 0x79, 0x45, - 0x81, 0x39, 0xef, 0x5c, 0x61, 0x6d, 0xe1, 0x9e, 0x72, 0xa9, 0x51, 0xc0, 0xfb, 0xcf, 0x1a, 0x92, - 0x53, 0x85, 0xf4, 0x04, 0x61, 0xb0, 0x84, 0x82, 0xfe, 0x87, 0x04, 0x79, 0x66, 0x1d, 0xdc, 0x75, - 0x40, 0x08, 0xd1, 0x2b, 0x86, 0x81, 0x24, 0xf6, 0x78, 0xf7, 0x27, 0x92, 0x02, 0x30, 0x02, 0x7b, - 0xe0, 0xbe, 0xd4, 0x00, 0x40, 0xff, 0x22, 0x41, 0xd6, 0xb5, 0x5a, 0xc4, 0x0e, 0xcf, 0x7e, 0x5c, - 0xd8, 0x6d, 0x35, 0x24, 0x00, 0x97, 0x7c, 0x84, 0x7e, 0x2f, 0xc0, 0x54, 0x97, 0x66, 0xf4, 0x8f, - 0x6e, 0x5f, 0x27, 0xd0, 0x77, 0x60, 0x35, 0xf8, 0x0d, 0xbd, 0x4b, 0xc8, 0xf5, 0x35, 0x9e, 0x9f, - 0x64, 0x70, 0x94, 0x47, 0x71, 0xce, 0x76, 0x13, 0x7d, 0x57, 0x02, 0x50, 0xb1, 0x6d, 0x76, 0xf6, - 0xf0, 0x86, 0xa5, 0xa3, 0x2b, 0x03, 0x00, 0x58, 0xb3, 0xcf, 0x04, 0xcd, 0xfe, 0x53, 0x61, 0xc1, - 0x2f, 0xf3, 0x82, 0x7f, 0x62, 0xb4, 0xe6, 0x79, 0xc4, 0x23, 0xc4, 0xff, 0x74, 0x98, 0x60, 0x72, - 0x64, 0x26, 0xa0, 0x98, 0xf0, 0xbd, 0x9f, 0xd0, 0x7b, 0x7d, 0xd1, 0xdf, 0xc3, 0x89, 0xfe, 0x29, - 0x89, 0x39, 0x4a, 0x06, 0x40, 0x69, 0x08, 0x00, 0x8e, 0xc2, 0xb4, 0x07, 0xc0, 0x86, 0x5a, 0x29, - 0x60, 0xf4, 0x76, 0x99, 0xec, 0x96, 0xd3, 0xb1, 0xe8, 0xe0, 0x3d, 0xcd, 0x57, 0x85, 0xe7, 0xe6, - 0x21, 0x79, 0xf8, 0xe5, 0xa7, 0x04, 0xd0, 0x9f, 0x08, 0x4d, 0xc6, 0x05, 0x18, 0x7a, 0xb4, 0xf4, - 0x57, 0x67, 0xca, 0x30, 0xcb, 0x19, 0x11, 0xca, 0x29, 0x38, 0xce, 0x25, 0xd0, 0xf1, 0xae, 0x5d, - 0x38, 0xa2, 0x20, 0x38, 0xc9, 0x7d, 0x61, 0x2f, 0xb8, 0x5d, 0xc8, 0xa0, 0x3f, 0xfb, 0x4c, 0xc6, - 0x5f, 0x9e, 0x79, 0x77, 0x96, 0x2d, 0x8c, 0x7d, 0x94, 0x8f, 0x16, 0xd6, 0x32, 0x0d, 0x07, 0x3f, - 0x10, 0xf2, 0x56, 0xf0, 0x13, 0x62, 0xad, 0x86, 0x53, 0x30, 0xe1, 0x58, 0x61, 0x0f, 0x06, 0xef, - 0x35, 0xac, 0x58, 0x39, 0x5e, 0xb1, 0xaa, 0x70, 0x46, 0x37, 0x5a, 0x9d, 0xdd, 0x36, 0x56, 0x71, - 0x47, 0x73, 0x65, 0x68, 0x17, 0xed, 0x45, 0xdc, 0xc5, 0x46, 0x1b, 0x1b, 0x0e, 0xe5, 0xd3, 0x3b, - 0xad, 0x24, 0x90, 0x93, 0x57, 0xc6, 0x3b, 0x79, 0x65, 0x7c, 0x5c, 0xbf, 0x15, 0xd7, 0x98, 0xe5, - 0xb9, 0xdb, 0x00, 0x68, 0xdd, 0xce, 0xea, 0xf8, 0x22, 0x53, 0xc3, 0x2b, 0x7a, 0x16, 0xe9, 0x6a, - 0x7e, 0x06, 0x35, 0x94, 0x19, 0x7d, 0xd1, 0x57, 0xbf, 0xbb, 0x39, 0xf5, 0xbb, 0x49, 0x90, 0x85, - 0x64, 0x5a, 0xd7, 0x1d, 0x42, 0xeb, 0x66, 0x61, 0x2a, 0xd8, 0xbb, 0x95, 0x95, 0x2b, 0xe0, 0x84, - 0xe7, 0x0d, 0x5a, 0x2d, 0x97, 0x17, 0xeb, 0xcd, 0x8d, 0xf5, 0x65, 0xb5, 0xb8, 0x58, 0x2e, 0x80, - 0xab, 0x9f, 0x54, 0x2f, 0x7d, 0x27, 0xce, 0x2c, 0xfa, 0x73, 0x09, 0x72, 0xe4, 0xa8, 0x1d, 0xfa, - 0xc9, 0x11, 0x69, 0x8e, 0xcd, 0xf9, 0xbe, 0xf8, 0xe3, 0xae, 0x78, 0x14, 0x6f, 0x26, 0x4c, 0xc2, - 0xd5, 0x81, 0xa2, 0x78, 0xc7, 0x10, 0x4a, 0x7f, 0xe2, 0xe2, 0x36, 0xc9, 0xfa, 0xb6, 0x79, 0xf1, - 0x07, 0xb9, 0x49, 0xba, 0xf5, 0x3f, 0xe4, 0x26, 0xd9, 0x87, 0x85, 0xb1, 0x37, 0xc9, 0x3e, 0xed, - 0x2e, 0xa6, 0x99, 0xa2, 0x67, 0xe5, 0xfc, 0xf9, 0xdf, 0x73, 0xa4, 0x03, 0x6d, 0x55, 0x15, 0x61, - 0x56, 0x37, 0x1c, 0x6c, 0x19, 0x5a, 0x67, 0xa9, 0xa3, 0x6d, 0x79, 0xf6, 0x69, 0xef, 0xfe, 0x44, - 0x25, 0x94, 0x47, 0xe5, 0xff, 0x50, 0x4e, 0x03, 0x38, 0x78, 0xa7, 0xdb, 0xd1, 0x9c, 0x40, 0xf5, - 0x42, 0x29, 0x61, 0xed, 0xcb, 0xf2, 0xda, 0x77, 0x0b, 0x5c, 0x46, 0x41, 0x6b, 0x5c, 0xea, 0xe2, - 0x0d, 0x43, 0xff, 0xa9, 0x5d, 0x12, 0x5c, 0x92, 0xea, 0x68, 0xbf, 0x4f, 0xdc, 0x86, 0x4d, 0xbe, - 0x67, 0xc3, 0xe6, 0x1f, 0x84, 0x83, 0x56, 0x78, 0xad, 0x7e, 0x40, 0xd0, 0x0a, 0xbf, 0xa5, 0xc9, - 0x3d, 0x2d, 0xcd, 0x5f, 0x46, 0xc9, 0x0a, 0x2c, 0xa3, 0x84, 0x51, 0xc9, 0x09, 0x2e, 0x41, 0xbe, - 0x5a, 0x28, 0x2a, 0x46, 0x5c, 0x35, 0xc6, 0xb0, 0xc4, 0x2d, 0xc3, 0x1c, 0x2d, 0x7a, 0xc1, 0x34, - 0x2f, 0xec, 0x68, 0xd6, 0x05, 0x64, 0x1d, 0x48, 0x15, 0x63, 0x77, 0x8b, 0x22, 0xb7, 0x40, 0x3f, - 0x29, 0x3c, 0x67, 0xe0, 0xc4, 0xe5, 0xf1, 0x3c, 0x9e, 0xed, 0xa2, 0x37, 0x08, 0x4d, 0x21, 0x44, - 0x18, 0x4c, 0x1f, 0xd7, 0x3f, 0xf2, 0x71, 0xf5, 0x3a, 0xfa, 0xf0, 0x4a, 0xfb, 0x28, 0x71, 0x45, - 0x5f, 0x1a, 0x0e, 0x3b, 0x8f, 0xaf, 0x21, 0xb0, 0x2b, 0x80, 0x7c, 0xc1, 0x77, 0xee, 0x71, 0x1f, - 0xc3, 0x15, 0xca, 0xa6, 0x87, 0x66, 0x04, 0xcb, 0x63, 0x41, 0xf3, 0x38, 0xcf, 0x42, 0xad, 0x9b, - 0x2a, 0xa6, 0x5f, 0x10, 0xde, 0xc1, 0xea, 0x2b, 0x20, 0xca, 0xdd, 0x78, 0x5a, 0xa5, 0xd8, 0xf6, - 0x97, 0x38, 0x9b, 0xe9, 0xa3, 0xf9, 0x50, 0x0e, 0xa6, 0xbc, 0xb0, 0x22, 0xe4, 0xd6, 0x1b, 0x1f, - 0xc3, 0x93, 0x90, 0xb7, 0xcd, 0x5d, 0xab, 0x85, 0xd9, 0x9e, 0x22, 0x7b, 0x1b, 0x62, 0xff, 0x6b, - 0xe0, 0x78, 0xbe, 0xcf, 0x64, 0xc8, 0x26, 0x36, 0x19, 0xa2, 0x0d, 0xd2, 0xb8, 0x01, 0xfe, 0xf9, - 0xc2, 0xa1, 0xca, 0x39, 0xcc, 0xea, 0xd8, 0x79, 0x34, 0x8e, 0xf1, 0xbf, 0x2f, 0xb4, 0xbb, 0x32, - 0xa0, 0x26, 0xc9, 0x54, 0xae, 0x36, 0x84, 0xa1, 0x7a, 0x25, 0x5c, 0xee, 0xe5, 0x60, 0x16, 0x2a, - 0xb1, 0x48, 0x37, 0xd4, 0xd5, 0x82, 0x8c, 0x9e, 0x9d, 0x85, 0x02, 0x65, 0xad, 0xe6, 0x1b, 0x6b, - 0xe8, 0xc5, 0x99, 0xc3, 0xb6, 0x48, 0xa3, 0xa7, 0x98, 0x9f, 0x96, 0x44, 0xc3, 0xa1, 0x72, 0x82, - 0x0f, 0x6a, 0x17, 0xa1, 0x49, 0x43, 0x34, 0xb3, 0x18, 0xe5, 0x43, 0xbf, 0x99, 0x11, 0x89, 0xae, - 0x2a, 0xc6, 0x62, 0xfa, 0xbd, 0xd2, 0xe7, 0xb2, 0x5e, 0x74, 0xa8, 0x25, 0xcb, 0xdc, 0xd9, 0xb0, - 0x3a, 0xe8, 0xff, 0x16, 0x0a, 0x5e, 0x1d, 0x61, 0xfe, 0x4b, 0xd1, 0xe6, 0x3f, 0x59, 0x32, 0xee, - 0x04, 0x7b, 0x55, 0x9d, 0x21, 0x86, 0x6f, 0xe5, 0x7a, 0x98, 0xd3, 0xda, 0xed, 0x75, 0x6d, 0x0b, - 0x97, 0xdc, 0x79, 0xb5, 0xe1, 0xb0, 0xc8, 0x31, 0x3d, 0xa9, 0xb1, 0x5d, 0x91, 0xf8, 0x3a, 0x28, - 0x07, 0x12, 0x93, 0xcf, 0x58, 0x86, 0x37, 0x77, 0x48, 0x68, 0x6d, 0x6b, 0x41, 0x1c, 0x2b, 0xf6, - 0x26, 0xe8, 0xbb, 0x24, 0xc0, 0x77, 0xfa, 0x9a, 0xf5, 0xbb, 0x12, 0x4c, 0xb8, 0xf2, 0x2e, 0xb6, - 0xdb, 0xe8, 0xb1, 0x5c, 0xb8, 0xb7, 0x48, 0xef, 0xb1, 0x9f, 0x17, 0x76, 0xdb, 0xf3, 0x6a, 0x48, - 0xe9, 0x47, 0x60, 0x12, 0x08, 0x51, 0xe2, 0x84, 0x28, 0xe6, 0x9d, 0x17, 0x5b, 0x44, 0xfa, 0xe2, - 0xfb, 0xb8, 0x04, 0xb3, 0xde, 0x3c, 0x62, 0x09, 0x3b, 0xad, 0x6d, 0x74, 0x9b, 0xe8, 0x42, 0x13, - 0x6b, 0x69, 0xfe, 0x9e, 0x6c, 0x07, 0x7d, 0x2f, 0x93, 0x50, 0xe5, 0xb9, 0x92, 0x23, 0x56, 0xe9, - 0x12, 0xe9, 0x62, 0x1c, 0xc1, 0xf4, 0x85, 0xf9, 0x45, 0x09, 0xa0, 0x61, 0xfa, 0x73, 0xdd, 0x03, - 0x48, 0xf2, 0x85, 0xc2, 0xdb, 0xb5, 0xac, 0xe2, 0x41, 0xb1, 0xc9, 0x7b, 0x0e, 0x41, 0xe7, 0xa3, - 0x41, 0x25, 0x8d, 0xa5, 0xad, 0x4f, 0x2d, 0xee, 0x76, 0x3b, 0x7a, 0x4b, 0x73, 0x7a, 0x3d, 0xe6, - 0xa2, 0xc5, 0x4b, 0xae, 0x84, 0x4c, 0x64, 0x14, 0xfa, 0x65, 0x44, 0xc8, 0x92, 0x86, 0x21, 0x91, - 0xbc, 0x30, 0x24, 0x82, 0x5e, 0x30, 0x03, 0x88, 0x8f, 0x41, 0x3d, 0x65, 0x38, 0x5a, 0xeb, 0x62, - 0x63, 0xc1, 0xc2, 0x5a, 0xbb, 0x65, 0xed, 0xee, 0x9c, 0xb7, 0xc3, 0xee, 0x9e, 0xf1, 0x3a, 0x1a, - 0x5a, 0x3a, 0x96, 0xb8, 0xa5, 0x63, 0xf4, 0x73, 0xb2, 0x68, 0x50, 0x9c, 0xd0, 0x06, 0x47, 0x88, - 0x87, 0x21, 0x86, 0xba, 0x44, 0x4e, 0x4a, 0x3d, 0xab, 0xc4, 0xd9, 0x24, 0xab, 0xc4, 0x6f, 0x14, - 0x0a, 0xb1, 0x23, 0x54, 0xaf, 0xb1, 0xf8, 0x9a, 0xcd, 0xd5, 0xb1, 0x13, 0x01, 0xef, 0x75, 0x30, - 0x7b, 0x3e, 0xf8, 0xe2, 0x43, 0xcc, 0x27, 0xf6, 0xf1, 0x00, 0x7d, 0x53, 0xd2, 0x15, 0x18, 0x9e, - 0x85, 0x08, 0x74, 0x7d, 0x04, 0x25, 0x11, 0x37, 0xb3, 0x44, 0xcb, 0x29, 0xb1, 0xe5, 0xa7, 0x8f, - 0xc2, 0x87, 0x25, 0x98, 0x26, 0x17, 0x5d, 0x2e, 0x5c, 0x22, 0xe7, 0x16, 0x05, 0x8d, 0x92, 0x87, - 0xc2, 0x62, 0x56, 0x20, 0xdb, 0xd1, 0x8d, 0x0b, 0x9e, 0x7f, 0xa0, 0xfb, 0x1c, 0x5c, 0x9b, 0x26, - 0xf5, 0xb9, 0x36, 0xcd, 0xdf, 0xa7, 0xf0, 0xcb, 0x3d, 0xd0, 0x3d, 0xbe, 0x03, 0xc9, 0xa5, 0x2f, - 0xc6, 0xbf, 0xcb, 0x42, 0xbe, 0x8e, 0x35, 0xab, 0xb5, 0x8d, 0xde, 0x2d, 0xf5, 0x9d, 0x2a, 0x4c, - 0xf2, 0x53, 0x85, 0x25, 0x98, 0xd8, 0xd4, 0x3b, 0x0e, 0xb6, 0xa8, 0xcf, 0x74, 0xb8, 0x6b, 0xa7, - 0x4d, 0x7c, 0xa1, 0x63, 0xb6, 0x2e, 0xcc, 0x33, 0xd3, 0x7d, 0xde, 0x0b, 0xb3, 0x39, 0xbf, 0x44, - 0x7e, 0x52, 0xbd, 0x9f, 0x5d, 0x83, 0xd0, 0x36, 0x2d, 0x27, 0xea, 0x06, 0x85, 0x08, 0x2a, 0x75, - 0xd3, 0x72, 0x54, 0xfa, 0xa3, 0x0b, 0xf3, 0xe6, 0x6e, 0xa7, 0xd3, 0xc0, 0x0f, 0x38, 0xde, 0xb4, - 0xcd, 0x7b, 0x77, 0x8d, 0x45, 0x73, 0x73, 0xd3, 0xc6, 0x74, 0xd1, 0x20, 0xa7, 0xb2, 0x37, 0xe5, - 0x38, 0xe4, 0x3a, 0xfa, 0x8e, 0x4e, 0x27, 0x1a, 0x39, 0x95, 0xbe, 0x28, 0x37, 0x42, 0x21, 0x98, - 0xe3, 0x50, 0x46, 0x4f, 0xe5, 0x49, 0xd3, 0xdc, 0x97, 0xee, 0xea, 0xcc, 0x05, 0x7c, 0xc9, 0x3e, - 0x35, 0x41, 0xbe, 0x93, 0x67, 0xfe, 0x80, 0x8a, 0xc8, 0x7e, 0x07, 0x95, 0x78, 0xf4, 0x0c, 0xd6, - 0xc2, 0x2d, 0xd3, 0x6a, 0x7b, 0xb2, 0x89, 0x9e, 0x60, 0xb0, 0x7c, 0xc9, 0x76, 0x29, 0xfa, 0x16, - 0x9e, 0xbe, 0xa6, 0xbd, 0x23, 0xef, 0x76, 0x9b, 0x6e, 0xd1, 0xe7, 0x74, 0x67, 0x7b, 0x0d, 0x3b, - 0x1a, 0xfa, 0x3b, 0xb9, 0xaf, 0xc6, 0x4d, 0xff, 0x6f, 0x8d, 0x1b, 0xa0, 0x71, 0x34, 0x80, 0x92, - 0xb3, 0x6b, 0x19, 0xae, 0x1c, 0x59, 0xc8, 0xd2, 0x50, 0x8a, 0x72, 0x07, 0x5c, 0x11, 0xbc, 0x79, - 0x4b, 0xa5, 0x8b, 0x6c, 0xda, 0x3a, 0x45, 0xb2, 0x47, 0x67, 0x50, 0xd6, 0xe1, 0x5a, 0xfa, 0x71, - 0xa5, 0xb1, 0xb6, 0xba, 0xa2, 0x6f, 0x6d, 0x77, 0xf4, 0xad, 0x6d, 0xc7, 0xae, 0x18, 0xb6, 0x83, - 0xb5, 0x76, 0x6d, 0x53, 0xa5, 0x77, 0x9f, 0x00, 0xa1, 0x23, 0x92, 0x95, 0xf7, 0xa9, 0x16, 0x1b, - 0xdd, 0xc2, 0x9a, 0x12, 0xd1, 0x52, 0x9e, 0xe2, 0xb6, 0x14, 0x7b, 0xb7, 0xe3, 0x63, 0x7a, 0x55, - 0x0f, 0xa6, 0x81, 0xaa, 0xef, 0x76, 0x48, 0x73, 0x21, 0x99, 0x93, 0x8e, 0x73, 0x31, 0x9c, 0xa4, - 0xdf, 0x6c, 0xfe, 0xbf, 0x3c, 0xe4, 0x96, 0x2d, 0xad, 0xbb, 0x8d, 0x9e, 0x1d, 0xea, 0x9f, 0x47, - 0xd5, 0x26, 0x7c, 0xed, 0x94, 0x06, 0x69, 0xa7, 0x3c, 0x40, 0x3b, 0xb3, 0x21, 0xed, 0x8c, 0x5e, - 0x54, 0x3e, 0x03, 0x33, 0x2d, 0xb3, 0xd3, 0xc1, 0x2d, 0x57, 0x1e, 0x95, 0x36, 0x59, 0xcd, 0x99, - 0x52, 0xb9, 0x34, 0x12, 0x8a, 0x18, 0x3b, 0x75, 0xba, 0x86, 0x4e, 0x95, 0x3e, 0x48, 0x40, 0x2f, - 0x96, 0x20, 0x5b, 0x6e, 0x6f, 0x61, 0x6e, 0x9d, 0x3d, 0x13, 0x5a, 0x67, 0x3f, 0x09, 0x79, 0x47, - 0xb3, 0xb6, 0xb0, 0xe3, 0xad, 0x13, 0xd0, 0x37, 0x3f, 0x42, 0xb2, 0x1c, 0x8a, 0x90, 0xfc, 0xa3, - 0x90, 0x75, 0x65, 0xc6, 0xdc, 0xc8, 0xaf, 0xed, 0x07, 0x3f, 0x91, 0xfd, 0xbc, 0x5b, 0xe2, 0xbc, - 0x5b, 0x6b, 0x95, 0xfc, 0xd0, 0x8b, 0x75, 0x6e, 0x1f, 0xd6, 0xe4, 0x1a, 0xc7, 0x96, 0x69, 0x54, - 0x76, 0xb4, 0x2d, 0xcc, 0xaa, 0x19, 0x24, 0x78, 0x5f, 0xcb, 0x3b, 0xe6, 0xfd, 0x3a, 0x0b, 0x56, - 0x1c, 0x24, 0xb8, 0x55, 0xd8, 0xd6, 0xdb, 0x6d, 0x6c, 0xb0, 0x96, 0xcd, 0xde, 0xce, 0x9c, 0x86, - 0xac, 0xcb, 0x83, 0xab, 0x3f, 0xae, 0xb1, 0x50, 0x38, 0xa2, 0xcc, 0xb8, 0xcd, 0x8a, 0x36, 0xde, - 0x42, 0x86, 0x5f, 0x53, 0x15, 0x71, 0xdb, 0xa1, 0x95, 0xeb, 0xdf, 0xb8, 0x9e, 0x00, 0x39, 0xc3, - 0x6c, 0xe3, 0x81, 0x83, 0x10, 0xcd, 0xa5, 0x3c, 0x19, 0x72, 0xb8, 0xed, 0xf6, 0x0a, 0x32, 0xc9, - 0x7e, 0x3a, 0x5e, 0x96, 0x2a, 0xcd, 0x9c, 0xcc, 0x37, 0xa8, 0x1f, 0xb7, 0xe9, 0x37, 0xc0, 0x5f, - 0x9c, 0x80, 0xa3, 0xb4, 0x0f, 0xa8, 0xef, 0x9e, 0x77, 0x49, 0x9d, 0xc7, 0xe8, 0x91, 0xfe, 0x03, - 0xd7, 0x51, 0x5e, 0xd9, 0x8f, 0x43, 0xce, 0xde, 0x3d, 0xef, 0x1b, 0xa1, 0xf4, 0x25, 0xdc, 0x74, - 0xa5, 0x91, 0x0c, 0x67, 0xf2, 0xb0, 0xc3, 0x19, 0x37, 0x34, 0xc9, 0x5e, 0xe3, 0x0f, 0x06, 0x32, - 0x7a, 0x00, 0xc2, 0x1b, 0xc8, 0xfa, 0x0d, 0x43, 0xa7, 0x60, 0x42, 0xdb, 0x74, 0xb0, 0x15, 0x98, - 0x89, 0xec, 0xd5, 0x1d, 0x2a, 0xcf, 0xe3, 0x4d, 0xd3, 0x72, 0xc5, 0x32, 0x45, 0x87, 0x4a, 0xef, - 0x3d, 0xd4, 0x72, 0x81, 0xdb, 0x21, 0xbb, 0x09, 0x8e, 0x19, 0xe6, 0x22, 0xee, 0x32, 0x39, 0x53, - 0x14, 0x67, 0x49, 0x0b, 0xd8, 0xff, 0x61, 0x5f, 0x57, 0x32, 0xb7, 0xbf, 0x2b, 0x41, 0x9f, 0x4a, - 0x3a, 0x67, 0xee, 0x01, 0x7a, 0x64, 0x16, 0x9a, 0xf2, 0x34, 0x98, 0x69, 0x33, 0x17, 0xad, 0x96, - 0xee, 0xb7, 0x92, 0xc8, 0xff, 0xb8, 0xcc, 0x81, 0x22, 0x65, 0xc3, 0x8a, 0xb4, 0x0c, 0x93, 0xe4, - 0xa8, 0xb2, 0xab, 0x49, 0xb9, 0x1e, 0x97, 0x78, 0x32, 0xad, 0xf3, 0x2b, 0x15, 0x12, 0xdb, 0x7c, - 0x89, 0xfd, 0xa2, 0xfa, 0x3f, 0x27, 0x9b, 0x7d, 0xc7, 0x4b, 0x28, 0xfd, 0xe6, 0xf8, 0x5b, 0x79, - 0xb8, 0xa2, 0x64, 0x99, 0xb6, 0x4d, 0xce, 0xc0, 0xf4, 0x36, 0xcc, 0xd7, 0x4b, 0xdc, 0x5d, 0x09, - 0x8f, 0xea, 0xe6, 0xd7, 0xaf, 0x41, 0x8d, 0xaf, 0x69, 0x7c, 0x55, 0x38, 0xc8, 0x8b, 0xbf, 0xff, - 0x10, 0x21, 0xf4, 0x1f, 0x8c, 0x46, 0xf2, 0x8e, 0x8c, 0x48, 0xdc, 0x99, 0x84, 0xb2, 0x4a, 0xbf, - 0xb9, 0x7c, 0x41, 0x82, 0x2b, 0x7b, 0xb9, 0xd9, 0x30, 0x6c, 0xbf, 0xc1, 0x5c, 0x3d, 0xa0, 0xbd, - 0xf0, 0x71, 0x4a, 0x62, 0x6f, 0x29, 0x8c, 0xa8, 0x7b, 0xa8, 0xb4, 0x88, 0xc5, 0x92, 0xe0, 0x44, - 0x4d, 0xdc, 0x2d, 0x85, 0x89, 0xc9, 0xa7, 0x2f, 0xdc, 0x4f, 0x67, 0xe1, 0xe8, 0xb2, 0x65, 0xee, - 0x76, 0xed, 0xa0, 0x07, 0xfa, 0xeb, 0xfe, 0x1b, 0xae, 0x79, 0x11, 0xd3, 0xe0, 0x1a, 0x98, 0xb6, - 0x98, 0x35, 0x17, 0x6c, 0xbf, 0x86, 0x93, 0xc2, 0xbd, 0x97, 0x7c, 0x90, 0xde, 0x2b, 0xe8, 0x67, - 0xb2, 0x5c, 0x3f, 0xd3, 0xdb, 0x73, 0xe4, 0xfa, 0xf4, 0x1c, 0x7f, 0x25, 0x25, 0x1c, 0x54, 0x7b, - 0x44, 0x14, 0xd1, 0x5f, 0x94, 0x20, 0xbf, 0x45, 0x32, 0xb2, 0xee, 0xe2, 0xf1, 0x62, 0x35, 0x23, - 0xc4, 0x55, 0xf6, 0x6b, 0x20, 0x57, 0x39, 0xac, 0xc3, 0x89, 0x06, 0xb8, 0x78, 0x6e, 0xd3, 0x57, - 0xaa, 0x87, 0xb3, 0x30, 0xe3, 0x97, 0x5e, 0x69, 0xdb, 0xe8, 0xa1, 0xfe, 0x1a, 0x35, 0x2b, 0xa2, - 0x51, 0xfb, 0xd6, 0x99, 0xfd, 0x51, 0x47, 0x0e, 0x8d, 0x3a, 0x7d, 0x47, 0x97, 0x99, 0x88, 0xd1, - 0x05, 0x3d, 0x4b, 0x16, 0xbd, 0x6d, 0x88, 0xef, 0x5a, 0x49, 0x6d, 0x1e, 0xcd, 0x83, 0x85, 0xe0, - 0x9d, 0x47, 0x83, 0x6b, 0x95, 0xbe, 0x92, 0xbc, 0x4f, 0x82, 0x63, 0xfb, 0x3b, 0xf3, 0x1f, 0xe2, - 0xbd, 0xd0, 0xdc, 0x3a, 0xd9, 0xbe, 0x17, 0x1a, 0x79, 0xe3, 0x37, 0xe9, 0x62, 0x83, 0x86, 0x70, - 0xf6, 0xde, 0xe0, 0x4e, 0x5c, 0x2c, 0x2c, 0x88, 0x20, 0xd1, 0xf4, 0x05, 0xf8, 0x2b, 0x32, 0x4c, - 0xd5, 0xb1, 0xb3, 0xaa, 0x5d, 0x32, 0x77, 0x1d, 0xa4, 0x89, 0x6e, 0xcf, 0x3d, 0x15, 0xf2, 0x1d, - 0xf2, 0x0b, 0xbb, 0xc4, 0xfd, 0x9a, 0xbe, 0xfb, 0x5b, 0xc4, 0xf7, 0x87, 0x92, 0x56, 0x59, 0x7e, - 0x3e, 0x5a, 0x8b, 0xc8, 0xee, 0xa8, 0xcf, 0xdd, 0x48, 0xb6, 0x76, 0x12, 0xed, 0x9d, 0x46, 0x15, - 0x9d, 0x3e, 0x2c, 0x3f, 0x27, 0xc3, 0x6c, 0x1d, 0x3b, 0x15, 0x7b, 0x49, 0xdb, 0x33, 0x2d, 0xdd, - 0xc1, 0xe1, 0x5b, 0x1c, 0xe3, 0xa1, 0x39, 0x0d, 0xa0, 0xfb, 0xbf, 0xb1, 0x18, 0x52, 0xa1, 0x14, - 0xf4, 0x9b, 0x49, 0x1d, 0x85, 0x38, 0x3e, 0x46, 0x02, 0x42, 0x22, 0x1f, 0x8b, 0xb8, 0xe2, 0xd3, - 0x07, 0xe2, 0xf3, 0x12, 0x03, 0xa2, 0x68, 0xb5, 0xb6, 0xf5, 0x3d, 0xdc, 0x4e, 0x08, 0x84, 0xf7, - 0x5b, 0x00, 0x84, 0x4f, 0x28, 0xb1, 0xfb, 0x0a, 0xc7, 0xc7, 0x28, 0xdc, 0x57, 0xe2, 0x08, 0x8e, - 0x25, 0x0c, 0x94, 0xdb, 0xf5, 0xb0, 0xf5, 0xcc, 0xbb, 0x44, 0xc5, 0x1a, 0x98, 0x6c, 0x52, 0xd8, - 0x64, 0x1b, 0xaa, 0x63, 0xa1, 0x65, 0x0f, 0xd2, 0xe9, 0x6c, 0x1a, 0x1d, 0x4b, 0xdf, 0xa2, 0xd3, - 0x17, 0xfa, 0xbb, 0x64, 0x38, 0xe1, 0xc7, 0x47, 0xa9, 0x63, 0x67, 0x51, 0xb3, 0xb7, 0xcf, 0x9b, - 0x9a, 0xd5, 0x0e, 0x5f, 0xee, 0x3f, 0xf4, 0x89, 0x3f, 0xf4, 0xb9, 0x30, 0x08, 0x55, 0x1e, 0x84, - 0xbe, 0xae, 0xa2, 0x7d, 0x79, 0x19, 0x45, 0x27, 0x13, 0xeb, 0xcd, 0xfa, 0xdb, 0x3e, 0x58, 0x3f, - 0xc6, 0x81, 0x75, 0xe7, 0xb0, 0x2c, 0xa6, 0x0f, 0xdc, 0xaf, 0xd3, 0x11, 0x21, 0xe4, 0xd5, 0x7c, - 0x9f, 0x28, 0x60, 0x11, 0x5e, 0xad, 0x72, 0xa4, 0x57, 0xeb, 0x50, 0x63, 0xc4, 0x40, 0x8f, 0xe4, - 0x74, 0xc7, 0x88, 0x43, 0xf4, 0x36, 0x7e, 0x9b, 0x0c, 0x05, 0x12, 0x20, 0x2b, 0xe4, 0xf1, 0x8d, - 0xee, 0x17, 0x45, 0x67, 0x9f, 0x77, 0xf9, 0x44, 0x52, 0xef, 0x72, 0xf4, 0xd6, 0xa4, 0x3e, 0xe4, - 0xbd, 0xdc, 0x8e, 0x04, 0xb1, 0x44, 0x2e, 0xe2, 0x03, 0x38, 0x48, 0x1f, 0xb4, 0xff, 0x26, 0x03, - 0xb8, 0x0d, 0x9a, 0x9d, 0x7d, 0x78, 0x86, 0x28, 0x5c, 0x37, 0x87, 0xfd, 0xea, 0x5d, 0xa0, 0x4e, - 0xf4, 0x00, 0x45, 0x29, 0x06, 0xa7, 0x2a, 0x1e, 0x49, 0xea, 0x5b, 0x19, 0x70, 0x35, 0x12, 0x58, - 0x12, 0x79, 0x5b, 0x46, 0x96, 0x9d, 0x3e, 0x20, 0xff, 0x5d, 0x82, 0x5c, 0xc3, 0xac, 0x63, 0xe7, - 0xe0, 0xa6, 0x40, 0xe2, 0x63, 0xfb, 0xa4, 0xdc, 0x51, 0x1c, 0xdb, 0xef, 0x47, 0x28, 0x7d, 0xd1, - 0xbd, 0x53, 0x82, 0x99, 0x86, 0x59, 0xf2, 0x17, 0xa7, 0xc4, 0x7d, 0x55, 0xc5, 0x6f, 0x4c, 0xf6, - 0x2b, 0x18, 0x14, 0x73, 0xa0, 0x1b, 0x93, 0x07, 0xd3, 0x4b, 0x5f, 0x6e, 0xb7, 0xc1, 0xd1, 0x0d, - 0xa3, 0x6d, 0xaa, 0xb8, 0x6d, 0xb2, 0x95, 0x6e, 0x45, 0x81, 0xec, 0xae, 0xd1, 0x36, 0x09, 0xcb, - 0x39, 0x95, 0x3c, 0xbb, 0x69, 0x16, 0x6e, 0x9b, 0xcc, 0x37, 0x80, 0x3c, 0xa3, 0xaf, 0xca, 0x90, - 0x75, 0xff, 0x15, 0x17, 0xf5, 0xdb, 0xe4, 0x84, 0x81, 0x08, 0x5c, 0xf2, 0x23, 0xb1, 0x84, 0xee, - 0x0a, 0xad, 0xfd, 0x53, 0x0f, 0xd6, 0x6b, 0xa3, 0xca, 0x0b, 0x89, 0x22, 0x58, 0xf3, 0x57, 0x4e, - 0xc1, 0xc4, 0xf9, 0x8e, 0xd9, 0xba, 0x10, 0x9c, 0x97, 0x67, 0xaf, 0xca, 0x8d, 0x90, 0xb3, 0x34, - 0x63, 0x0b, 0xb3, 0x3d, 0x85, 0xe3, 0x3d, 0x7d, 0x21, 0xf1, 0x7a, 0x51, 0x69, 0x16, 0xf4, 0xd6, - 0x24, 0x21, 0x10, 0xfa, 0x54, 0x3e, 0x99, 0x3e, 0x2c, 0x0e, 0x71, 0xb2, 0xac, 0x00, 0x33, 0xa5, - 0x22, 0xbd, 0x9b, 0x7c, 0xad, 0x76, 0xb6, 0x5c, 0x90, 0x09, 0xcc, 0xae, 0x4c, 0x52, 0x84, 0xd9, - 0x25, 0xff, 0x03, 0x0b, 0x73, 0x9f, 0xca, 0x1f, 0x06, 0xcc, 0x1f, 0x97, 0x60, 0x76, 0x55, 0xb7, - 0x9d, 0x28, 0x6f, 0xff, 0x98, 0xf8, 0xb8, 0xcf, 0x4f, 0x6a, 0x2a, 0x73, 0xe5, 0x08, 0x07, 0xc6, - 0x4d, 0x64, 0x0e, 0xc7, 0x15, 0x31, 0x9e, 0x63, 0x29, 0x84, 0x03, 0x7a, 0x9f, 0xb0, 0xb0, 0x24, - 0x13, 0x1b, 0x4a, 0x41, 0x21, 0xe3, 0x37, 0x94, 0x22, 0xcb, 0x4e, 0x5f, 0xbe, 0x5f, 0x95, 0xe0, - 0x98, 0x5b, 0x7c, 0xdc, 0xb2, 0x54, 0xb4, 0x98, 0x07, 0x2e, 0x4b, 0x25, 0x5e, 0x19, 0xdf, 0xc7, - 0xcb, 0x28, 0x56, 0xc6, 0x07, 0x11, 0x1d, 0xb3, 0x98, 0x23, 0x96, 0x61, 0x07, 0x89, 0x39, 0x66, - 0x19, 0x76, 0x78, 0x31, 0xc7, 0x2f, 0xc5, 0x0e, 0x29, 0xe6, 0x43, 0x5b, 0x60, 0x7d, 0xad, 0xec, - 0x8b, 0x39, 0x72, 0x6d, 0x23, 0x46, 0xcc, 0x89, 0x4f, 0xec, 0xa2, 0xb7, 0x0f, 0x29, 0xf8, 0x11, - 0xaf, 0x6f, 0x0c, 0x03, 0xd3, 0x21, 0xae, 0x71, 0xbc, 0x44, 0x86, 0x39, 0xc6, 0x45, 0xff, 0x29, - 0x73, 0x0c, 0x46, 0x89, 0xa7, 0xcc, 0x89, 0xcf, 0x00, 0xf1, 0x9c, 0x8d, 0xff, 0x0c, 0x50, 0x6c, - 0xf9, 0xe9, 0x83, 0xf3, 0xb5, 0x2c, 0x9c, 0x74, 0x59, 0x58, 0x33, 0xdb, 0xfa, 0xe6, 0x25, 0xca, - 0xc5, 0x59, 0xad, 0xb3, 0x8b, 0x6d, 0xf4, 0x1e, 0x49, 0x14, 0xa5, 0xff, 0x04, 0x60, 0x76, 0xb1, - 0x45, 0x03, 0xa9, 0x31, 0xa0, 0xee, 0x88, 0xaa, 0xec, 0xfe, 0x92, 0xfc, 0xeb, 0x62, 0x6a, 0x1e, - 0x11, 0x35, 0x44, 0xcf, 0xb5, 0x0a, 0xa7, 0xfc, 0x2f, 0xbd, 0x0e, 0x1e, 0x99, 0xfd, 0x0e, 0x1e, - 0x37, 0x80, 0xac, 0xb5, 0xdb, 0x3e, 0x54, 0xbd, 0x9b, 0xd9, 0xa4, 0x4c, 0xd5, 0xcd, 0xe2, 0xe6, - 0xb4, 0x71, 0x70, 0x34, 0x2f, 0x22, 0xa7, 0x8d, 0x1d, 0x65, 0x1e, 0xf2, 0xf4, 0x6e, 0x65, 0x7f, - 0x45, 0xbf, 0x7f, 0x66, 0x96, 0x8b, 0x37, 0xed, 0x6a, 0xbc, 0x1a, 0xde, 0x96, 0x48, 0x32, 0xfd, - 0xfa, 0xe9, 0xc0, 0x4e, 0x56, 0x39, 0x05, 0x7b, 0xfa, 0xd0, 0x94, 0xc7, 0xb3, 0x1b, 0x56, 0xec, - 0x76, 0x3b, 0x97, 0x1a, 0x2c, 0xf8, 0x4a, 0xa2, 0xdd, 0xb0, 0x50, 0x0c, 0x17, 0xa9, 0x37, 0x86, - 0x4b, 0xf2, 0xdd, 0x30, 0x8e, 0x8f, 0x51, 0xec, 0x86, 0xc5, 0x11, 0x4c, 0x5f, 0xb4, 0x6f, 0xce, - 0x51, 0xab, 0x99, 0x45, 0xef, 0xff, 0xc3, 0xfe, 0x87, 0xd0, 0x80, 0x77, 0x76, 0xe9, 0x17, 0xd8, - 0x3f, 0xf6, 0xd6, 0x12, 0xe5, 0xc9, 0x90, 0xdf, 0x34, 0xad, 0x1d, 0xcd, 0xdb, 0xb8, 0xef, 0x3d, - 0x29, 0xc2, 0x22, 0xe6, 0x2f, 0x91, 0x3c, 0x2a, 0xcb, 0xeb, 0xce, 0x47, 0x9e, 0xa9, 0x77, 0x59, - 0xd4, 0x45, 0xf7, 0x51, 0xb9, 0x0e, 0x66, 0x59, 0xf0, 0xc5, 0x2a, 0xb6, 0x1d, 0xdc, 0x66, 0x11, - 0x2b, 0xf8, 0x44, 0xe5, 0x0c, 0xcc, 0xb0, 0x84, 0x25, 0xbd, 0x83, 0x6d, 0x16, 0xb4, 0x82, 0x4b, - 0x53, 0x4e, 0x42, 0x5e, 0xb7, 0xef, 0xb1, 0x4d, 0x83, 0xf8, 0xff, 0x4f, 0xaa, 0xec, 0x4d, 0xb9, - 0x01, 0x8e, 0xb2, 0x7c, 0xbe, 0xb1, 0x4a, 0x0f, 0xec, 0xf4, 0x26, 0xbb, 0xaa, 0x65, 0x98, 0xeb, - 0x96, 0xb9, 0x65, 0x61, 0xdb, 0x26, 0xa7, 0xa6, 0x26, 0xd5, 0x50, 0x0a, 0xfa, 0xcc, 0x30, 0x13, - 0x8b, 0xc4, 0x37, 0x19, 0xb8, 0x28, 0xed, 0xb6, 0x5a, 0x18, 0xb7, 0xd9, 0xc9, 0x27, 0xef, 0x35, - 0xe1, 0x1d, 0x07, 0x89, 0xa7, 0x21, 0x87, 0x74, 0xc9, 0xc1, 0x07, 0x4f, 0x40, 0x9e, 0x5e, 0x18, - 0x86, 0x5e, 0x34, 0xd7, 0x57, 0x59, 0xe7, 0x78, 0x65, 0xdd, 0x80, 0x19, 0xc3, 0x74, 0x8b, 0x5b, - 0xd7, 0x2c, 0x6d, 0xc7, 0x8e, 0x5b, 0x65, 0xa4, 0x74, 0xfd, 0x21, 0xa5, 0x1a, 0xfa, 0x6d, 0xe5, - 0x88, 0xca, 0x91, 0x51, 0xfe, 0x0f, 0x38, 0x7a, 0x9e, 0x45, 0x08, 0xb0, 0x19, 0x65, 0x29, 0xda, - 0x07, 0xaf, 0x87, 0xf2, 0x02, 0xff, 0xe7, 0xca, 0x11, 0xb5, 0x97, 0x98, 0xf2, 0x13, 0x30, 0xe7, - 0xbe, 0xb6, 0xcd, 0x8b, 0x1e, 0xe3, 0x72, 0xb4, 0x21, 0xd2, 0x43, 0x7e, 0x8d, 0xfb, 0x71, 0xe5, - 0x88, 0xda, 0x43, 0x4a, 0xa9, 0x01, 0x6c, 0x3b, 0x3b, 0x1d, 0x46, 0x38, 0x1b, 0xad, 0x92, 0x3d, - 0x84, 0x57, 0xfc, 0x9f, 0x56, 0x8e, 0xa8, 0x21, 0x12, 0xca, 0x2a, 0x4c, 0x39, 0x0f, 0x38, 0x8c, - 0x5e, 0x2e, 0x7a, 0xf3, 0xbb, 0x87, 0x5e, 0xc3, 0xfb, 0x67, 0xe5, 0x88, 0x1a, 0x10, 0x50, 0x2a, - 0x30, 0xd9, 0x3d, 0xcf, 0x88, 0xe5, 0xfb, 0x44, 0x9b, 0xef, 0x4f, 0x6c, 0xfd, 0xbc, 0x4f, 0xcb, - 0xff, 0xdd, 0x65, 0xac, 0x65, 0xef, 0x31, 0x5a, 0x13, 0xc2, 0x8c, 0x95, 0xbc, 0x7f, 0x5c, 0xc6, - 0x7c, 0x02, 0x4a, 0x05, 0xa6, 0x6c, 0x43, 0xeb, 0xda, 0xdb, 0xa6, 0x63, 0x9f, 0x9a, 0xec, 0xf1, - 0x93, 0x8c, 0xa6, 0x56, 0x67, 0xff, 0xa8, 0xc1, 0xdf, 0xca, 0x93, 0xe1, 0xc4, 0x2e, 0xb9, 0x78, - 0xbd, 0xfc, 0x80, 0x6e, 0x3b, 0xba, 0xb1, 0xe5, 0xc5, 0x98, 0xa5, 0xbd, 0x4d, 0xff, 0x8f, 0xca, - 0x3c, 0x3b, 0x31, 0x05, 0xa4, 0x6d, 0xa2, 0xde, 0xcd, 0x3a, 0x5a, 0x6c, 0xe8, 0xa0, 0xd4, 0xd3, - 0x20, 0xeb, 0x7e, 0x22, 0xbd, 0xd3, 0x5c, 0xff, 0x85, 0xc0, 0x5e, 0xdd, 0x21, 0x0d, 0xd8, 0xfd, - 0xa9, 0xa7, 0x83, 0x9b, 0xe9, 0xed, 0xe0, 0xdc, 0x06, 0xae, 0xdb, 0x6b, 0xfa, 0x16, 0xb5, 0xae, - 0x98, 0x3f, 0x7c, 0x38, 0x89, 0xce, 0x46, 0xab, 0xf8, 0x22, 0xbd, 0x41, 0xe3, 0xa8, 0x37, 0x1b, - 0xf5, 0x52, 0xd0, 0xf5, 0x30, 0x13, 0x6e, 0x64, 0xf4, 0xd6, 0x51, 0x3d, 0xb0, 0xcd, 0xd8, 0x1b, - 0xba, 0x0e, 0xe6, 0x78, 0x9d, 0x0e, 0x0d, 0x41, 0xb2, 0xd7, 0x15, 0xa2, 0x6b, 0xe1, 0x68, 0x4f, - 0xc3, 0xf2, 0x62, 0x8e, 0x64, 0x82, 0x98, 0x23, 0xd7, 0x00, 0x04, 0x5a, 0xdc, 0x97, 0xcc, 0xd5, - 0x30, 0xe5, 0xeb, 0x65, 0xdf, 0x0c, 0x5f, 0xce, 0xc0, 0xa4, 0xa7, 0x6c, 0xfd, 0x32, 0xb8, 0xe3, - 0x8f, 0x11, 0xda, 0x60, 0x60, 0xd3, 0x70, 0x2e, 0xcd, 0x1d, 0x67, 0x02, 0xb7, 0xde, 0x86, 0xee, - 0x74, 0xbc, 0xa3, 0x71, 0xbd, 0xc9, 0xca, 0x3a, 0x80, 0x4e, 0x30, 0x6a, 0x04, 0x67, 0xe5, 0x6e, - 0x49, 0xd0, 0x1e, 0xa8, 0x3e, 0x84, 0x68, 0x9c, 0xf9, 0x21, 0x76, 0x90, 0x6d, 0x0a, 0x72, 0x34, - 0xd0, 0xfa, 0x11, 0x65, 0x0e, 0xa0, 0xfc, 0x8c, 0xf5, 0xb2, 0x5a, 0x29, 0x57, 0x4b, 0xe5, 0x42, - 0x06, 0xbd, 0x54, 0x82, 0x29, 0xbf, 0x11, 0xf4, 0xad, 0x64, 0x99, 0xa9, 0xd6, 0xc0, 0x8b, 0x1d, - 0xf7, 0x37, 0xaa, 0xb0, 0x92, 0x3d, 0x15, 0x2e, 0xdf, 0xb5, 0xf1, 0x92, 0x6e, 0xd9, 0x8e, 0x6a, - 0x5e, 0x5c, 0x32, 0x2d, 0x3f, 0xaa, 0x32, 0x8b, 0x70, 0x1a, 0xf5, 0xd9, 0xb5, 0x38, 0xda, 0x98, - 0x1c, 0x9a, 0xc2, 0x16, 0x5b, 0x39, 0x0e, 0x12, 0x5c, 0xba, 0x8e, 0xa5, 0x19, 0x76, 0xd7, 0xb4, - 0xb1, 0x6a, 0x5e, 0xb4, 0x8b, 0x46, 0xbb, 0x64, 0x76, 0x76, 0x77, 0x0c, 0x9b, 0xd9, 0x0c, 0x51, - 0x9f, 0x5d, 0xe9, 0x90, 0x6b, 0x5b, 0xe7, 0x00, 0x4a, 0xb5, 0xd5, 0xd5, 0x72, 0xa9, 0x51, 0xa9, - 0x55, 0x0b, 0x47, 0x5c, 0x69, 0x35, 0x8a, 0x0b, 0xab, 0xae, 0x74, 0x7e, 0x12, 0x26, 0xbd, 0x36, - 0xcd, 0xc2, 0xa4, 0x64, 0xbc, 0x30, 0x29, 0x4a, 0x11, 0x26, 0xbd, 0x56, 0xce, 0x46, 0x84, 0xc7, - 0xf6, 0x1e, 0x8b, 0xdd, 0xd1, 0x2c, 0x87, 0xf8, 0x53, 0x7b, 0x44, 0x16, 0x34, 0x1b, 0xab, 0xfe, - 0x6f, 0x67, 0x9e, 0xc0, 0x38, 0x50, 0x60, 0xae, 0xb8, 0xba, 0xda, 0xac, 0xa9, 0xcd, 0x6a, 0xad, - 0xb1, 0x52, 0xa9, 0x2e, 0xd3, 0x11, 0xb2, 0xb2, 0x5c, 0xad, 0xa9, 0x65, 0x3a, 0x40, 0xd6, 0x0b, - 0x19, 0x7a, 0x6d, 0xf0, 0xc2, 0x24, 0xe4, 0xbb, 0x44, 0xba, 0xe8, 0x0b, 0x72, 0xc2, 0xf3, 0xf0, - 0x3e, 0x4e, 0x11, 0x17, 0x9b, 0x72, 0x3e, 0xe9, 0x52, 0x9f, 0x33, 0xa3, 0x67, 0x60, 0x86, 0xda, - 0x7a, 0x36, 0x59, 0xde, 0x27, 0xc8, 0xc9, 0x2a, 0x97, 0x86, 0x3e, 0x2c, 0x25, 0x38, 0x24, 0xdf, - 0x97, 0xa3, 0x64, 0xc6, 0xc5, 0x9f, 0x65, 0x86, 0xbb, 0x96, 0xa0, 0x52, 0x6d, 0x94, 0xd5, 0x6a, - 0x71, 0x95, 0x65, 0x91, 0x95, 0x53, 0x70, 0xbc, 0x5a, 0x63, 0x31, 0xff, 0xea, 0xcd, 0x46, 0xad, - 0x59, 0x59, 0x5b, 0xaf, 0xa9, 0x8d, 0x42, 0x4e, 0x39, 0x09, 0x0a, 0x7d, 0x6e, 0x56, 0xea, 0xcd, - 0x52, 0xb1, 0x5a, 0x2a, 0xaf, 0x96, 0x17, 0x0b, 0x79, 0xe5, 0x71, 0x70, 0x2d, 0xbd, 0xe6, 0xa6, - 0xb6, 0xd4, 0x54, 0x6b, 0xe7, 0xea, 0x2e, 0x82, 0x6a, 0x79, 0xb5, 0xe8, 0x2a, 0x52, 0xe8, 0xfa, - 0xe0, 0x09, 0xe5, 0x32, 0x38, 0x4a, 0xae, 0x06, 0x5f, 0xad, 0x15, 0x17, 0x59, 0x79, 0x93, 0xca, - 0x55, 0x70, 0xaa, 0x52, 0xad, 0x6f, 0x2c, 0x2d, 0x55, 0x4a, 0x95, 0x72, 0xb5, 0xd1, 0x5c, 0x2f, - 0xab, 0x6b, 0x95, 0x7a, 0xdd, 0xfd, 0xb7, 0x30, 0x45, 0x2e, 0x67, 0xa5, 0x7d, 0x26, 0x7a, 0xb7, - 0x0c, 0xb3, 0x67, 0xb5, 0x8e, 0xee, 0x0e, 0x14, 0xe4, 0xd6, 0xe6, 0x9e, 0xe3, 0x24, 0x0e, 0xb9, - 0xdd, 0x99, 0x39, 0xa4, 0x93, 0x17, 0xf4, 0xb3, 0x72, 0xc2, 0xe3, 0x24, 0x0c, 0x08, 0x5a, 0xe2, - 0x3c, 0x57, 0x5a, 0xc4, 0xe4, 0xe7, 0xd5, 0x52, 0x82, 0xe3, 0x24, 0xe2, 0xe4, 0x93, 0x81, 0xff, - 0xb2, 0x51, 0x81, 0x5f, 0x80, 0x99, 0x8d, 0x6a, 0x71, 0xa3, 0xb1, 0x52, 0x53, 0x2b, 0x3f, 0x4e, - 0xa2, 0x91, 0xcf, 0xc2, 0xd4, 0x52, 0x4d, 0x5d, 0xa8, 0x2c, 0x2e, 0x96, 0xab, 0x85, 0x9c, 0x72, - 0x39, 0x5c, 0x56, 0x2f, 0xab, 0x67, 0x2b, 0xa5, 0x72, 0x73, 0xa3, 0x5a, 0x3c, 0x5b, 0xac, 0xac, - 0x92, 0x3e, 0x22, 0x1f, 0x73, 0xe3, 0xf4, 0x04, 0xfa, 0xe9, 0x2c, 0x00, 0xad, 0x3a, 0xb9, 0x8c, - 0x27, 0x74, 0x2f, 0xf1, 0x9f, 0x27, 0x9d, 0x34, 0x04, 0x64, 0x22, 0xda, 0x6f, 0x05, 0x26, 0x2d, - 0xf6, 0x81, 0x2d, 0xaf, 0x0c, 0xa2, 0x43, 0x1f, 0x3d, 0x6a, 0xaa, 0xff, 0x3b, 0x7a, 0x4f, 0x92, - 0x39, 0x42, 0x24, 0x63, 0xc9, 0x90, 0x5c, 0x1a, 0x0d, 0x90, 0xe8, 0xa1, 0x0c, 0xcc, 0xf1, 0x15, - 0x73, 0x2b, 0x41, 0x8c, 0x29, 0xb1, 0x4a, 0xf0, 0x3f, 0x87, 0x8c, 0xac, 0x33, 0x4f, 0x62, 0xc3, - 0x29, 0x78, 0x2d, 0x93, 0x9e, 0x0c, 0xf7, 0x2c, 0x96, 0x42, 0xc6, 0x65, 0xde, 0x35, 0x3a, 0x0a, - 0x92, 0x32, 0x01, 0x72, 0xe3, 0x01, 0xa7, 0x20, 0xa3, 0x2f, 0xcb, 0x30, 0xcb, 0x5d, 0x7c, 0x8c, - 0x5e, 0x9d, 0x11, 0xb9, 0x94, 0x34, 0x74, 0xa5, 0x72, 0xe6, 0xa0, 0x57, 0x2a, 0x9f, 0xb9, 0x19, - 0x26, 0x58, 0x1a, 0x91, 0x6f, 0xad, 0xea, 0x9a, 0x02, 0x47, 0x61, 0x7a, 0xb9, 0xdc, 0x68, 0xd6, - 0x1b, 0x45, 0xb5, 0x51, 0x5e, 0x2c, 0x64, 0xdc, 0x81, 0xaf, 0xbc, 0xb6, 0xde, 0xb8, 0xaf, 0x20, - 0x25, 0xf7, 0xd0, 0xeb, 0x65, 0x64, 0xcc, 0x1e, 0x7a, 0x71, 0xc5, 0xa7, 0x3f, 0x57, 0xfd, 0x94, - 0x0c, 0x05, 0xca, 0x41, 0xf9, 0x81, 0x2e, 0xb6, 0x74, 0x6c, 0xb4, 0x30, 0xba, 0x20, 0x12, 0x11, - 0x74, 0x5f, 0xac, 0x3c, 0xd2, 0x9f, 0x87, 0xac, 0x44, 0xfa, 0xd2, 0x63, 0x60, 0x67, 0xf7, 0x19, - 0xd8, 0x9f, 0x4c, 0xea, 0xa2, 0xd7, 0xcb, 0xee, 0x48, 0x20, 0xfb, 0x58, 0x12, 0x17, 0xbd, 0x01, - 0x1c, 0x8c, 0x25, 0xd0, 0x6f, 0xc4, 0xf8, 0x5b, 0x90, 0xd1, 0xf3, 0x64, 0x38, 0xba, 0xa8, 0x39, - 0x78, 0xe1, 0x52, 0xc3, 0xbb, 0x98, 0x30, 0xe2, 0x32, 0xe1, 0xcc, 0xbe, 0xcb, 0x84, 0x83, 0xbb, - 0x0d, 0xa5, 0x9e, 0xbb, 0x0d, 0xd1, 0x3b, 0x92, 0x1e, 0xea, 0xeb, 0xe1, 0x61, 0x64, 0xd1, 0x78, - 0x93, 0x1d, 0xd6, 0x8b, 0xe7, 0x62, 0x0c, 0x77, 0xfb, 0x4f, 0x41, 0x81, 0xb2, 0x12, 0xf2, 0x42, - 0xfb, 0x15, 0x76, 0xff, 0x76, 0x33, 0x41, 0xd0, 0x3f, 0x2f, 0x8c, 0x82, 0xc4, 0x87, 0x51, 0xe0, - 0x16, 0x35, 0xe5, 0x5e, 0xcf, 0x81, 0xa4, 0x9d, 0x61, 0xc8, 0xe5, 0x2c, 0x3a, 0xce, 0x6a, 0x7a, - 0x9d, 0x61, 0x6c, 0xf1, 0xe3, 0xb9, 0x23, 0x96, 0xdd, 0xf3, 0x58, 0x16, 0x45, 0x26, 0xfe, 0x2a, - 0xec, 0xa4, 0xfe, 0xc7, 0x9c, 0xcb, 0x5f, 0xcc, 0xfd, 0xd0, 0xe9, 0xf9, 0x1f, 0x0f, 0xe2, 0x20, - 0x7d, 0x14, 0xbe, 0x27, 0x41, 0xb6, 0x6e, 0x5a, 0xce, 0xa8, 0x30, 0x48, 0xba, 0x67, 0x1a, 0x92, - 0x40, 0x3d, 0x7a, 0xce, 0x99, 0xde, 0x9e, 0x69, 0x7c, 0xf9, 0x63, 0x88, 0x9b, 0x78, 0x14, 0xe6, - 0x28, 0x27, 0xfe, 0xa5, 0x22, 0xdf, 0x95, 0x68, 0x7f, 0x75, 0xaf, 0x28, 0x22, 0x67, 0x60, 0x26, - 0xb4, 0x67, 0xe9, 0x81, 0xc2, 0xa5, 0xa1, 0xd7, 0x87, 0x71, 0x59, 0xe4, 0x71, 0xe9, 0x37, 0xe3, - 0xf6, 0xef, 0xe5, 0x18, 0x55, 0xcf, 0x94, 0x24, 0x04, 0x63, 0x4c, 0xe1, 0xe9, 0x23, 0xf2, 0xa0, - 0x0c, 0x79, 0xe6, 0x33, 0x36, 0x52, 0x04, 0x92, 0xb6, 0x0c, 0x5f, 0x08, 0x62, 0xbe, 0x65, 0xf2, - 0xa8, 0x5b, 0x46, 0x7c, 0xf9, 0xe9, 0xe3, 0xf0, 0xef, 0xcc, 0x19, 0xb2, 0xb8, 0xa7, 0xe9, 0x1d, - 0xed, 0x7c, 0x27, 0x41, 0xe8, 0xe3, 0x0f, 0x27, 0x3c, 0xfe, 0xe5, 0x57, 0x95, 0x2b, 0x2f, 0x42, - 0xe2, 0x3f, 0x02, 0x53, 0x96, 0xbf, 0x24, 0xe9, 0x9d, 0x8e, 0xef, 0x71, 0x44, 0x65, 0xdf, 0xd5, - 0x20, 0x67, 0xa2, 0xb3, 0x5e, 0x42, 0xfc, 0x8c, 0xe5, 0x6c, 0xca, 0x74, 0xb1, 0xdd, 0x5e, 0xc2, - 0x9a, 0xb3, 0x6b, 0xe1, 0x76, 0xa2, 0x21, 0x82, 0x17, 0xd1, 0x54, 0x58, 0x12, 0x5c, 0xf0, 0xc1, - 0x55, 0x1e, 0x9d, 0xa7, 0x0c, 0xe8, 0x0d, 0x3c, 0x5e, 0x46, 0xd2, 0x25, 0xbd, 0xd9, 0x87, 0xa4, - 0xc6, 0x41, 0xf2, 0xb4, 0xe1, 0x98, 0x18, 0xc3, 0x85, 0xee, 0x32, 0xcc, 0x51, 0x3b, 0x61, 0xd4, - 0x98, 0xfc, 0x5e, 0x42, 0x1f, 0x93, 0xd0, 0xb5, 0x4d, 0x61, 0x76, 0x46, 0x02, 0x4b, 0x12, 0x8f, - 0x14, 0x31, 0x3e, 0xd2, 0x47, 0xe6, 0x33, 0x79, 0x80, 0x90, 0xdf, 0xe0, 0x87, 0xf3, 0x41, 0x20, - 0x40, 0xf4, 0x56, 0x36, 0xff, 0xa8, 0x73, 0x51, 0xa9, 0x43, 0x3e, 0x81, 0xfe, 0x86, 0x14, 0x9f, - 0x28, 0x34, 0xaa, 0xfc, 0x59, 0x42, 0x9b, 0x97, 0x79, 0xed, 0x0d, 0x1c, 0xdc, 0x87, 0xec, 0xe5, - 0x3e, 0x92, 0xc0, 0xf8, 0x1d, 0xc4, 0x4a, 0x32, 0xd4, 0x56, 0x87, 0x98, 0xd9, 0x9f, 0x82, 0xe3, - 0x6a, 0xb9, 0xb8, 0x58, 0xab, 0xae, 0xde, 0x17, 0xbe, 0xc3, 0xa7, 0x20, 0x87, 0x27, 0x27, 0xa9, - 0xc0, 0xf6, 0x9a, 0x84, 0x7d, 0x20, 0x2f, 0xab, 0xd8, 0x1b, 0xea, 0x3f, 0x96, 0xa0, 0x57, 0x13, - 0x20, 0x7b, 0x98, 0x28, 0x3c, 0x08, 0xa1, 0x66, 0xf4, 0xf3, 0x32, 0x14, 0xdc, 0xf1, 0x90, 0x72, - 0xc9, 0x2e, 0x6b, 0xab, 0xf1, 0x6e, 0x85, 0x5d, 0xba, 0xff, 0x14, 0xb8, 0x15, 0x7a, 0x09, 0xca, - 0xf5, 0x30, 0xd7, 0xda, 0xc6, 0xad, 0x0b, 0x15, 0xc3, 0xdb, 0x57, 0xa7, 0x9b, 0xb0, 0x3d, 0xa9, - 0x3c, 0x30, 0xf7, 0xf2, 0xc0, 0xf0, 0x93, 0x68, 0x6e, 0x90, 0x0e, 0x33, 0x15, 0x81, 0xcb, 0x1f, - 0xfa, 0xb8, 0x54, 0x39, 0x5c, 0x6e, 0x1f, 0x8a, 0x6a, 0x32, 0x58, 0xaa, 0x43, 0xc0, 0x82, 0xe0, - 0x64, 0x6d, 0xbd, 0x51, 0xa9, 0x55, 0x9b, 0x1b, 0xf5, 0xf2, 0x62, 0x73, 0xc1, 0x03, 0xa7, 0x5e, - 0x90, 0xd1, 0xd7, 0x25, 0x98, 0xa0, 0x6c, 0xd9, 0xe8, 0xf1, 0x01, 0x04, 0x03, 0xfd, 0x29, 0xd1, - 0x5b, 0x84, 0xa3, 0x23, 0xf8, 0x82, 0x60, 0xe5, 0x44, 0xf4, 0x53, 0x4f, 0x85, 0x09, 0x0a, 0xb2, - 0xb7, 0xa2, 0x75, 0x3a, 0xa2, 0x97, 0x62, 0x64, 0x54, 0x2f, 0xbb, 0x60, 0xa4, 0x84, 0x01, 0x6c, - 0xa4, 0x3f, 0xb2, 0x3c, 0x2b, 0x4b, 0xcd, 0xe0, 0x73, 0xba, 0xb3, 0x4d, 0xdc, 0x2d, 0xd1, 0x8f, - 0x89, 0x2c, 0x2f, 0xde, 0x04, 0xb9, 0x3d, 0x37, 0xf7, 0x00, 0xd7, 0x55, 0x9a, 0x09, 0xbd, 0x4c, - 0x38, 0x30, 0x27, 0xa7, 0x9f, 0x3e, 0x4f, 0x11, 0xe0, 0xac, 0x41, 0xb6, 0xa3, 0xdb, 0x0e, 0x1b, - 0x3f, 0x6e, 0x4b, 0x44, 0xc8, 0x7b, 0xa8, 0x38, 0x78, 0x47, 0x25, 0x64, 0xd0, 0x3d, 0x30, 0x13, - 0x4e, 0x15, 0x70, 0xdf, 0x3d, 0x05, 0x13, 0xec, 0x58, 0x19, 0x5b, 0x62, 0xf5, 0x5e, 0x05, 0x97, - 0x35, 0x85, 0x6a, 0x9b, 0xbe, 0x0e, 0xfc, 0xbf, 0x47, 0x61, 0x62, 0x45, 0xb7, 0x1d, 0xd3, 0xba, - 0x84, 0x1e, 0xc9, 0xc0, 0xc4, 0x59, 0x6c, 0xd9, 0xba, 0x69, 0xec, 0x73, 0x35, 0xb8, 0x06, 0xa6, - 0xbb, 0x16, 0xde, 0xd3, 0xcd, 0x5d, 0x3b, 0x58, 0x9c, 0x09, 0x27, 0x29, 0x08, 0x26, 0xb5, 0x5d, - 0x67, 0xdb, 0xb4, 0x82, 0x68, 0x14, 0xde, 0xbb, 0x72, 0x1a, 0x80, 0x3e, 0x57, 0xb5, 0x1d, 0xcc, - 0x1c, 0x28, 0x42, 0x29, 0x8a, 0x02, 0x59, 0x47, 0xdf, 0xc1, 0x2c, 0x3c, 0x2d, 0x79, 0x76, 0x05, - 0x4c, 0x42, 0xbd, 0xb1, 0x90, 0x7a, 0xb2, 0xea, 0xbd, 0xa2, 0xcf, 0xc9, 0x30, 0xbd, 0x8c, 0x1d, - 0xc6, 0xaa, 0x8d, 0x9e, 0x9f, 0x11, 0xba, 0x11, 0xc2, 0x1d, 0x63, 0x3b, 0x9a, 0xed, 0xfd, 0xe7, - 0x2f, 0xc1, 0xf2, 0x89, 0x41, 0xac, 0x5c, 0x39, 0x1c, 0x28, 0x9b, 0x04, 0x4e, 0x73, 0x2a, 0xd4, - 0x2f, 0x93, 0x65, 0x66, 0x9b, 0x20, 0xfb, 0x3f, 0xa0, 0x77, 0x4a, 0xa2, 0x87, 0x8e, 0x99, 0xec, - 0xe7, 0x43, 0xf5, 0x89, 0xec, 0x8e, 0x26, 0xf7, 0x58, 0x8e, 0x7d, 0x31, 0xd0, 0xc3, 0x94, 0x18, - 0x19, 0xd5, 0xcf, 0x2d, 0x78, 0x5c, 0x79, 0x30, 0x27, 0xe9, 0x6b, 0xe3, 0xb7, 0x65, 0x98, 0xae, - 0x6f, 0x9b, 0x17, 0x3d, 0x39, 0xfe, 0xa4, 0x18, 0xb0, 0x57, 0xc1, 0xd4, 0x5e, 0x0f, 0xa8, 0x41, - 0x42, 0xf4, 0x1d, 0xed, 0xe8, 0xb9, 0x72, 0x52, 0x98, 0x42, 0xcc, 0x8d, 0xfc, 0x06, 0x75, 0xe5, - 0x29, 0x30, 0xc1, 0xb8, 0x66, 0x4b, 0x2e, 0xf1, 0x00, 0x7b, 0x99, 0xc3, 0x15, 0xcc, 0xf2, 0x15, - 0x4c, 0x86, 0x7c, 0x74, 0xe5, 0xd2, 0x47, 0xfe, 0x8f, 0x25, 0x12, 0xac, 0xc2, 0x03, 0xbe, 0x34, - 0x02, 0xe0, 0xd1, 0x77, 0x32, 0xa2, 0x0b, 0x93, 0xbe, 0x04, 0x7c, 0x0e, 0x0e, 0x74, 0xdb, 0xcb, - 0x40, 0x72, 0xe9, 0xcb, 0xf3, 0xa5, 0x59, 0x98, 0x59, 0xd4, 0x37, 0x37, 0xfd, 0x4e, 0xf2, 0x05, - 0x82, 0x9d, 0x64, 0xb4, 0x3b, 0x80, 0x6b, 0xe7, 0xee, 0x5a, 0x16, 0x36, 0xbc, 0x4a, 0xb1, 0xe6, - 0xd4, 0x93, 0xaa, 0xdc, 0x00, 0x47, 0xbd, 0x71, 0x21, 0xdc, 0x51, 0x4e, 0xa9, 0xbd, 0xc9, 0xe8, - 0x5b, 0xc2, 0xbb, 0x5a, 0x9e, 0x44, 0xc3, 0x55, 0x8a, 0x68, 0x80, 0x77, 0xc0, 0xec, 0x36, 0xcd, - 0x4d, 0xa6, 0xfe, 0x5e, 0x67, 0x79, 0xb2, 0x27, 0x18, 0xf0, 0x1a, 0xb6, 0x6d, 0x6d, 0x0b, 0xab, - 0x7c, 0xe6, 0x9e, 0xe6, 0x2b, 0x27, 0xb9, 0xda, 0x4a, 0x6c, 0x83, 0x4c, 0xa0, 0x26, 0x63, 0xd0, - 0x8e, 0x33, 0x90, 0x5d, 0xd2, 0x3b, 0x18, 0xfd, 0x82, 0x04, 0x53, 0x2a, 0x6e, 0x99, 0x46, 0xcb, - 0x7d, 0x0b, 0x39, 0x07, 0xfd, 0x63, 0x46, 0xf4, 0x4a, 0x47, 0x97, 0xce, 0xbc, 0x4f, 0x23, 0xa2, - 0xdd, 0x88, 0x5d, 0xdd, 0x18, 0x4b, 0x6a, 0x0c, 0x17, 0x70, 0xb8, 0x53, 0x8f, 0xcd, 0xcd, 0x8e, - 0xa9, 0x71, 0x8b, 0x5f, 0xbd, 0xa6, 0xd0, 0x8d, 0x50, 0xf0, 0xce, 0x80, 0x98, 0xce, 0xba, 0x6e, - 0x18, 0xfe, 0x21, 0xe3, 0x7d, 0xe9, 0xfc, 0xbe, 0x6d, 0x6c, 0x9c, 0x16, 0x52, 0x77, 0x56, 0x7a, - 0x84, 0x66, 0x5f, 0x0f, 0x73, 0xe7, 0x2f, 0x39, 0xd8, 0x66, 0xb9, 0x58, 0xb1, 0x59, 0xb5, 0x27, - 0x35, 0x14, 0x65, 0x39, 0x2e, 0x9e, 0x4b, 0x4c, 0x81, 0xc9, 0x44, 0xbd, 0x32, 0xc4, 0x0c, 0xf0, - 0x38, 0x14, 0xaa, 0xb5, 0xc5, 0x32, 0xf1, 0x55, 0xf3, 0xbc, 0x7f, 0xb6, 0xd0, 0x0b, 0x65, 0x98, - 0x21, 0xce, 0x24, 0x1e, 0x0a, 0xd7, 0x0a, 0xcc, 0x47, 0xd0, 0x17, 0x85, 0xfd, 0xd8, 0x48, 0x95, - 0xc3, 0x05, 0x44, 0x0b, 0x7a, 0x53, 0xef, 0xf4, 0x0a, 0x3a, 0xa7, 0xf6, 0xa4, 0xf6, 0x01, 0x44, - 0xee, 0x0b, 0xc8, 0xef, 0x08, 0x39, 0xb3, 0x0d, 0xe2, 0xee, 0xb0, 0x50, 0xf9, 0x5d, 0x19, 0xa6, - 0xdd, 0x49, 0x8a, 0x07, 0x4a, 0x8d, 0x03, 0xc5, 0x34, 0x3a, 0x97, 0x82, 0x65, 0x11, 0xef, 0x35, - 0x51, 0x23, 0xf9, 0x4b, 0xe1, 0x99, 0x3b, 0x11, 0x51, 0x88, 0x97, 0x31, 0xe1, 0xf7, 0x5e, 0xa1, - 0xf9, 0xfc, 0x00, 0xe6, 0x0e, 0x0b, 0xbe, 0xaf, 0xe6, 0x20, 0xbf, 0xd1, 0x25, 0xc8, 0xbd, 0x4c, - 0x16, 0x89, 0x58, 0xbe, 0xef, 0x20, 0x83, 0x6b, 0x66, 0x75, 0xcc, 0x96, 0xd6, 0x59, 0x0f, 0x4e, - 0x84, 0x05, 0x09, 0xca, 0xed, 0xcc, 0xb7, 0x91, 0x1e, 0xb7, 0xbb, 0x3e, 0x36, 0x98, 0x37, 0x91, - 0x51, 0xe8, 0xd0, 0xc8, 0x4d, 0x70, 0xac, 0xad, 0xdb, 0xda, 0xf9, 0x0e, 0x2e, 0x1b, 0x2d, 0xeb, - 0x12, 0x15, 0x07, 0x9b, 0x56, 0xed, 0xfb, 0xa0, 0xdc, 0x09, 0x39, 0xdb, 0xb9, 0xd4, 0xa1, 0xf3, - 0xc4, 0xf0, 0x19, 0x93, 0xc8, 0xa2, 0xea, 0x6e, 0x76, 0x95, 0xfe, 0x15, 0x76, 0x51, 0x9a, 0x10, - 0xbc, 0xcf, 0xf9, 0x49, 0x90, 0x37, 0x2d, 0x7d, 0x4b, 0xa7, 0xf7, 0xf3, 0xcc, 0xed, 0x8b, 0x59, - 0x47, 0x4d, 0x81, 0x1a, 0xc9, 0xa2, 0xb2, 0xac, 0xca, 0x53, 0x60, 0x4a, 0xdf, 0xd1, 0xb6, 0xf0, - 0xbd, 0xba, 0x41, 0x4f, 0xf4, 0xcd, 0xdd, 0x7a, 0x6a, 0xdf, 0xf1, 0x19, 0xf6, 0x5d, 0x0d, 0xb2, - 0xa2, 0xf7, 0x4a, 0xa2, 0x81, 0x75, 0x48, 0xdd, 0x28, 0xa8, 0x63, 0xb9, 0xd7, 0x1a, 0xbd, 0x52, - 0x28, 0xe4, 0x4d, 0x34, 0x5b, 0xe9, 0x0f, 0xde, 0x9f, 0x95, 0x60, 0x72, 0xd1, 0xbc, 0x68, 0x10, - 0x45, 0xbf, 0x4d, 0xcc, 0xd6, 0xed, 0x73, 0xc8, 0x91, 0xbf, 0x36, 0x32, 0xf6, 0x44, 0x03, 0xa9, - 0xad, 0x57, 0x64, 0x04, 0x0c, 0xb1, 0x2d, 0x47, 0xf0, 0x32, 0xbf, 0xb8, 0x72, 0xd2, 0x97, 0xeb, - 0x9f, 0xc8, 0x90, 0x5d, 0xb4, 0xcc, 0x2e, 0x7a, 0x73, 0x26, 0x81, 0xcb, 0x42, 0xdb, 0x32, 0xbb, - 0x0d, 0x72, 0x1b, 0x57, 0x70, 0x8c, 0x23, 0x9c, 0xa6, 0xdc, 0x06, 0x93, 0x5d, 0xd3, 0xd6, 0x1d, - 0x6f, 0x1a, 0x31, 0x77, 0xeb, 0x63, 0xfa, 0xb6, 0xe6, 0x75, 0x96, 0x49, 0xf5, 0xb3, 0xbb, 0xbd, - 0x36, 0x11, 0xa1, 0x2b, 0x17, 0x57, 0x8c, 0xde, 0x8d, 0x64, 0x3d, 0xa9, 0xe8, 0x45, 0x61, 0x24, - 0x9f, 0xc6, 0x23, 0xf9, 0xd8, 0x3e, 0x12, 0xb6, 0xcc, 0xee, 0x48, 0x36, 0x19, 0x5f, 0xee, 0xa3, - 0xfa, 0x74, 0x0e, 0xd5, 0x1b, 0x85, 0xca, 0x4c, 0x1f, 0xd1, 0xf7, 0x66, 0x01, 0x88, 0x99, 0xb1, - 0xe1, 0x4e, 0x80, 0xc4, 0x6c, 0xac, 0x9f, 0xcb, 0x86, 0x64, 0x59, 0xe4, 0x65, 0xf9, 0xf8, 0x08, - 0x2b, 0x86, 0x90, 0x8f, 0x90, 0x68, 0x11, 0x72, 0xbb, 0xee, 0x67, 0x26, 0x51, 0x41, 0x12, 0xe4, - 0x55, 0xa5, 0x7f, 0xa2, 0x3f, 0xce, 0x40, 0x8e, 0x24, 0x28, 0xa7, 0x01, 0xc8, 0xc0, 0x4e, 0x0f, - 0x04, 0x65, 0xc8, 0x10, 0x1e, 0x4a, 0x21, 0xda, 0xaa, 0xb7, 0xd9, 0x67, 0x6a, 0x32, 0x07, 0x09, - 0xee, 0xdf, 0x64, 0xb8, 0x27, 0xb4, 0x98, 0x01, 0x10, 0x4a, 0x71, 0xff, 0x26, 0x6f, 0xab, 0x78, - 0x93, 0x06, 0x4a, 0xce, 0xaa, 0x41, 0x82, 0xff, 0xf7, 0xaa, 0x7f, 0xbd, 0x96, 0xf7, 0x37, 0x49, - 0x71, 0x27, 0xc3, 0x44, 0x2d, 0x17, 0x82, 0x22, 0xf2, 0x24, 0x53, 0x6f, 0x32, 0x7a, 0x8d, 0xaf, - 0x36, 0x8b, 0x9c, 0xda, 0xdc, 0x92, 0x40, 0xbc, 0xe9, 0x2b, 0xcf, 0x97, 0x73, 0x30, 0x55, 0x35, - 0xdb, 0x4c, 0x77, 0x42, 0x13, 0xc6, 0x8f, 0xe5, 0x12, 0x4d, 0x18, 0x7d, 0x1a, 0x11, 0x0a, 0x72, - 0x37, 0xaf, 0x20, 0x62, 0x14, 0xc2, 0xfa, 0xa1, 0x2c, 0x40, 0x9e, 0x68, 0xef, 0xfe, 0x7b, 0x9b, - 0xe2, 0x48, 0x10, 0xd1, 0xaa, 0xec, 0xcf, 0xff, 0x70, 0x3a, 0xf6, 0x5f, 0x21, 0x47, 0x2a, 0x18, - 0xb3, 0xbb, 0xc3, 0x57, 0x54, 0x8a, 0xaf, 0xa8, 0x1c, 0x5f, 0xd1, 0x6c, 0x6f, 0x45, 0x93, 0xac, - 0x03, 0x44, 0x69, 0x48, 0xfa, 0x3a, 0xfe, 0x0f, 0x13, 0x00, 0x55, 0x6d, 0x4f, 0xdf, 0xa2, 0xbb, - 0xc3, 0x9f, 0xf3, 0xe6, 0x3f, 0x6c, 0x1f, 0xf7, 0xbf, 0x85, 0x06, 0xc2, 0xdb, 0x60, 0x82, 0x8d, - 0x7b, 0xac, 0x22, 0x57, 0x73, 0x15, 0x09, 0xa8, 0x50, 0xb3, 0xf4, 0x01, 0x47, 0xf5, 0xf2, 0x73, - 0x57, 0xcc, 0x4a, 0x3d, 0x57, 0xcc, 0xf6, 0xdf, 0x83, 0x88, 0xb8, 0x78, 0x16, 0xbd, 0x4b, 0xd8, - 0xa3, 0x3f, 0xc4, 0x4f, 0xa8, 0x46, 0x11, 0x4d, 0xf0, 0x49, 0x30, 0x61, 0xfa, 0x1b, 0xda, 0x72, - 0xe4, 0x3a, 0x58, 0xc5, 0xd8, 0x34, 0x55, 0x2f, 0xa7, 0xe0, 0xe6, 0x97, 0x10, 0x1f, 0x63, 0x39, - 0x34, 0x73, 0x72, 0xd9, 0x0b, 0x3a, 0xe5, 0xd6, 0xe3, 0x9c, 0xee, 0x6c, 0xaf, 0xea, 0xc6, 0x05, - 0x1b, 0xfd, 0x67, 0x31, 0x0b, 0x32, 0x84, 0xbf, 0x94, 0x0c, 0x7f, 0x3e, 0x66, 0x47, 0x9d, 0x47, - 0xed, 0xce, 0x28, 0x2a, 0xfd, 0xb9, 0x8d, 0x00, 0xf0, 0x76, 0xc8, 0x53, 0x46, 0x59, 0x27, 0x7a, - 0x26, 0x12, 0x3f, 0x9f, 0x92, 0xca, 0xfe, 0x40, 0xef, 0xf4, 0x71, 0x3c, 0xcb, 0xe1, 0xb8, 0x70, - 0x20, 0xce, 0x52, 0x87, 0xf4, 0xcc, 0x13, 0x61, 0x82, 0x49, 0x5a, 0x99, 0x0b, 0xb7, 0xe2, 0xc2, - 0x11, 0x05, 0x20, 0xbf, 0x66, 0xee, 0xe1, 0x86, 0x59, 0xc8, 0xb8, 0xcf, 0x2e, 0x7f, 0x0d, 0xb3, - 0x20, 0xa1, 0x57, 0x4c, 0xc2, 0xa4, 0x1f, 0xed, 0xe7, 0xb3, 0x12, 0x14, 0x4a, 0x16, 0xd6, 0x1c, - 0xbc, 0x64, 0x99, 0x3b, 0xb4, 0x46, 0xe2, 0xde, 0xa1, 0xbf, 0x26, 0xec, 0xe2, 0xe1, 0x47, 0xe1, - 0xe9, 0x2d, 0x2c, 0x02, 0x4b, 0xba, 0x08, 0x29, 0x79, 0x8b, 0x90, 0xe8, 0x4d, 0x42, 0x2e, 0x1f, - 0xa2, 0xa5, 0xa4, 0xdf, 0xd4, 0x3e, 0x29, 0x41, 0xae, 0xd4, 0x31, 0x0d, 0x1c, 0x3e, 0xc2, 0x34, - 0xf0, 0xac, 0x4c, 0xff, 0x9d, 0x08, 0xf4, 0x2c, 0x49, 0xd4, 0xd6, 0x08, 0x04, 0xe0, 0x96, 0x2d, - 0x28, 0x5b, 0xb1, 0x41, 0x2a, 0x96, 0x74, 0xfa, 0x02, 0xfd, 0xba, 0x04, 0x53, 0x34, 0x2e, 0x4e, - 0xb1, 0xd3, 0x41, 0x8f, 0x09, 0x84, 0xda, 0x27, 0x62, 0x12, 0xfa, 0x1d, 0x61, 0x17, 0x7d, 0xbf, - 0x56, 0x3e, 0xed, 0x04, 0x01, 0x82, 0x92, 0x79, 0x8c, 0x8b, 0xed, 0xa5, 0x0d, 0x64, 0x28, 0x7d, - 0x51, 0xff, 0xb9, 0xe4, 0x1a, 0x00, 0xc6, 0x85, 0x75, 0x0b, 0xef, 0xe9, 0xf8, 0x22, 0xba, 0x32, - 0x10, 0xf6, 0xfe, 0xa0, 0x1f, 0x6f, 0x10, 0x5e, 0xc4, 0x09, 0x91, 0x8c, 0xdc, 0xca, 0x9a, 0xee, - 0x04, 0x99, 0x58, 0x2f, 0xde, 0x1b, 0x89, 0x25, 0x44, 0x46, 0x0d, 0x67, 0x17, 0x5c, 0xb3, 0x89, - 0xe6, 0x22, 0x7d, 0xc1, 0x7e, 0x60, 0x02, 0x26, 0x37, 0x0c, 0xbb, 0xdb, 0xd1, 0xec, 0x6d, 0xf4, - 0x5d, 0x19, 0xf2, 0xf4, 0xb6, 0x30, 0xf4, 0x23, 0x5c, 0x6c, 0x81, 0x9f, 0xda, 0xc5, 0x96, 0xe7, - 0x82, 0x43, 0x5f, 0xfa, 0x5f, 0x66, 0x8e, 0xde, 0x2b, 0x8b, 0x4e, 0x52, 0xbd, 0x42, 0x43, 0xd7, - 0xc6, 0xf7, 0x3f, 0xce, 0xde, 0xd5, 0x5b, 0xce, 0xae, 0xe5, 0x5f, 0x8d, 0xfd, 0x04, 0x31, 0x2a, - 0xeb, 0xf4, 0x2f, 0xd5, 0xff, 0x1d, 0x69, 0x30, 0xc1, 0x12, 0xf7, 0x6d, 0x27, 0xed, 0x3f, 0x7f, - 0x7b, 0x12, 0xf2, 0x9a, 0xe5, 0xe8, 0xb6, 0xc3, 0x36, 0x58, 0xd9, 0x9b, 0xdb, 0x5d, 0xd2, 0xa7, - 0x0d, 0xab, 0xe3, 0x45, 0x21, 0xf1, 0x13, 0xd0, 0xef, 0x0a, 0xcd, 0x1f, 0xe3, 0x6b, 0x9e, 0x0c, - 0xf2, 0x7b, 0x87, 0x58, 0xa3, 0xbe, 0x1c, 0x2e, 0x53, 0x8b, 0x8d, 0x72, 0x93, 0x06, 0xad, 0xf0, - 0xe3, 0x53, 0xb4, 0xd1, 0x3b, 0xe4, 0xd0, 0xfa, 0xdd, 0x25, 0x6e, 0x8c, 0x60, 0x52, 0x0c, 0xc6, - 0x08, 0x3f, 0x21, 0x66, 0xb7, 0x9a, 0x5b, 0x84, 0x95, 0xc5, 0x17, 0x61, 0x7f, 0x4b, 0x78, 0x37, - 0xc9, 0x17, 0xe5, 0x80, 0x35, 0xc0, 0xb8, 0xdb, 0x84, 0xde, 0x27, 0xb4, 0x33, 0x34, 0xa8, 0xa4, - 0x43, 0x84, 0xed, 0xf5, 0x13, 0x30, 0xb1, 0xac, 0x75, 0x3a, 0xd8, 0xba, 0xe4, 0x0e, 0x49, 0x05, - 0x8f, 0xc3, 0x35, 0xcd, 0xd0, 0x37, 0xb1, 0xed, 0xc4, 0x77, 0x96, 0xef, 0x12, 0x8e, 0x54, 0xcb, - 0xca, 0x98, 0xef, 0xa5, 0x1f, 0x21, 0xf3, 0x9b, 0x21, 0xab, 0x1b, 0x9b, 0x26, 0xeb, 0x32, 0x7b, - 0x57, 0xed, 0xbd, 0x9f, 0xc9, 0xd4, 0x85, 0x64, 0x14, 0x0c, 0x56, 0x2b, 0xc8, 0x45, 0xfa, 0x3d, - 0xe7, 0x6f, 0x67, 0x61, 0xd6, 0x63, 0xa2, 0x62, 0xb4, 0xf1, 0x03, 0xe1, 0xa5, 0x98, 0x17, 0x66, - 0x45, 0x8f, 0x83, 0xf5, 0xd6, 0x87, 0x90, 0x8a, 0x10, 0x69, 0x03, 0xa0, 0xa5, 0x39, 0x78, 0xcb, - 0xb4, 0x74, 0xbf, 0x3f, 0x7c, 0x72, 0x12, 0x6a, 0x25, 0xfa, 0xf7, 0x25, 0x35, 0x44, 0x47, 0xb9, - 0x13, 0xa6, 0xb1, 0x7f, 0xfe, 0xde, 0x5b, 0xaa, 0x89, 0xc5, 0x2b, 0x9c, 0x1f, 0xfd, 0xb9, 0xd0, - 0xa9, 0x33, 0x91, 0x6a, 0x26, 0xc3, 0xac, 0x39, 0x5c, 0x1b, 0xda, 0xa8, 0xae, 0x15, 0xd5, 0xfa, - 0x4a, 0x71, 0x75, 0xb5, 0x52, 0x5d, 0xf6, 0x03, 0xbf, 0x28, 0x30, 0xb7, 0x58, 0x3b, 0x57, 0x0d, - 0x45, 0xe6, 0xc9, 0xa2, 0x75, 0x98, 0xf4, 0xe4, 0xd5, 0xcf, 0x17, 0x33, 0x2c, 0x33, 0xe6, 0x8b, - 0x19, 0x4a, 0x72, 0x8d, 0x33, 0xbd, 0xe5, 0x3b, 0xe8, 0x90, 0x67, 0xf4, 0x47, 0x1a, 0xe4, 0xc8, - 0x9a, 0x3a, 0x7a, 0x1b, 0xd9, 0x06, 0xec, 0x76, 0xb4, 0x16, 0x46, 0x3b, 0x09, 0xac, 0x71, 0xef, - 0xea, 0x04, 0x69, 0xdf, 0xd5, 0x09, 0xe4, 0x91, 0x59, 0x7d, 0xc7, 0xfb, 0xad, 0xe3, 0xab, 0x34, - 0x0b, 0x7f, 0x40, 0x2b, 0x76, 0x77, 0x85, 0x2e, 0xff, 0x33, 0x36, 0x23, 0x54, 0x32, 0x9a, 0xa7, - 0x64, 0x96, 0xa8, 0xd8, 0x3e, 0x4c, 0x1c, 0x47, 0x63, 0xb8, 0xde, 0x3b, 0x0b, 0xb9, 0x7a, 0xb7, - 0xa3, 0x3b, 0xe8, 0x25, 0xd2, 0x48, 0x30, 0xa3, 0xd7, 0x5d, 0xc8, 0x03, 0xaf, 0xbb, 0x08, 0x76, - 0x5d, 0xb3, 0x02, 0xbb, 0xae, 0x0d, 0xfc, 0x80, 0xc3, 0xef, 0xba, 0xde, 0xc6, 0x82, 0xb7, 0xd1, - 0x3d, 0xdb, 0xc7, 0xf6, 0x11, 0x29, 0xa9, 0x56, 0x9f, 0xa8, 0x80, 0x67, 0x9e, 0xc8, 0x82, 0x93, - 0x01, 0xe4, 0x17, 0x6a, 0x8d, 0x46, 0x6d, 0xad, 0x70, 0x84, 0x44, 0xb5, 0xa9, 0xad, 0xd3, 0x50, - 0x31, 0x95, 0x6a, 0xb5, 0xac, 0x16, 0x24, 0x12, 0x2e, 0xad, 0xd2, 0x58, 0x2d, 0x17, 0x64, 0x3e, - 0xf6, 0x79, 0xac, 0xf9, 0xcd, 0x97, 0x9d, 0xa6, 0x7a, 0x89, 0x19, 0xe2, 0xd1, 0xfc, 0xa4, 0xaf, - 0x5c, 0xbf, 0x2a, 0x43, 0x6e, 0x0d, 0x5b, 0x5b, 0x18, 0xfd, 0x54, 0x82, 0x4d, 0xbe, 0x4d, 0xdd, - 0xb2, 0x69, 0x70, 0xb9, 0x60, 0x93, 0x2f, 0x9c, 0xa6, 0x5c, 0x07, 0xb3, 0x36, 0x6e, 0x99, 0x46, - 0xdb, 0xcb, 0x44, 0xfb, 0x23, 0x3e, 0x91, 0xbf, 0x77, 0x5e, 0x00, 0x32, 0xc2, 0xe8, 0x48, 0x76, - 0xea, 0x92, 0x00, 0xd3, 0xaf, 0xd4, 0xf4, 0x81, 0xf9, 0x96, 0xec, 0xfe, 0xd4, 0xbd, 0x84, 0x5e, - 0x2c, 0xbc, 0xfb, 0x7a, 0x13, 0xe4, 0x89, 0x9a, 0x7a, 0x63, 0x74, 0xff, 0xfe, 0x98, 0xe5, 0x51, - 0x16, 0xe0, 0x98, 0x8d, 0x3b, 0xb8, 0xe5, 0xe0, 0xb6, 0xdb, 0x74, 0xd5, 0x81, 0x9d, 0xc2, 0xfe, - 0xec, 0xe8, 0x4f, 0xc3, 0x00, 0xde, 0xc1, 0x03, 0x78, 0x7d, 0x1f, 0x51, 0xba, 0x15, 0x8a, 0xb6, - 0x95, 0xdd, 0x6a, 0xd4, 0x3b, 0xa6, 0xbf, 0x28, 0xee, 0xbd, 0xbb, 0xdf, 0xb6, 0x9d, 0x9d, 0x0e, - 0xf9, 0xc6, 0x0e, 0x18, 0x78, 0xef, 0xca, 0x3c, 0x4c, 0x68, 0xc6, 0x25, 0xf2, 0x29, 0x1b, 0x53, - 0x6b, 0x2f, 0x13, 0x7a, 0x85, 0x8f, 0xfc, 0x5d, 0x1c, 0xf2, 0x8f, 0x17, 0x63, 0x37, 0x7d, 0xe0, - 0x7f, 0x76, 0x02, 0x72, 0xeb, 0x9a, 0xed, 0x60, 0xf4, 0xff, 0xc8, 0xa2, 0xc8, 0x5f, 0x0f, 0x73, - 0x9b, 0x66, 0x6b, 0xd7, 0xc6, 0x6d, 0xbe, 0x51, 0xf6, 0xa4, 0x8e, 0x02, 0x73, 0xe5, 0x46, 0x28, - 0x78, 0x89, 0x8c, 0xac, 0xb7, 0x0d, 0xbf, 0x2f, 0x9d, 0x44, 0xd2, 0xb6, 0xd7, 0x35, 0xcb, 0xa9, - 0x6d, 0x92, 0x34, 0x3f, 0x92, 0x76, 0x38, 0x91, 0x83, 0x3e, 0x1f, 0x03, 0xfd, 0x44, 0x34, 0xf4, - 0x93, 0x02, 0xd0, 0x2b, 0x45, 0x98, 0xdc, 0xd4, 0x3b, 0x98, 0xfc, 0x30, 0x45, 0x7e, 0xe8, 0x37, - 0x26, 0x11, 0xd9, 0xfb, 0x63, 0xd2, 0x92, 0xde, 0xc1, 0xaa, 0xff, 0x9b, 0x37, 0x91, 0x81, 0x60, - 0x22, 0xb3, 0x4a, 0xfd, 0x69, 0x5d, 0xc3, 0xcb, 0xd0, 0x76, 0xb0, 0xb7, 0xf8, 0x66, 0xb0, 0xc3, - 0x2d, 0x6d, 0xcd, 0xd1, 0x08, 0x18, 0x33, 0x2a, 0x79, 0xe6, 0xfd, 0x42, 0xe4, 0x5e, 0xbf, 0x90, - 0xe7, 0xc8, 0xc9, 0x7a, 0x44, 0x8f, 0xd9, 0x88, 0x16, 0x75, 0xde, 0x03, 0x88, 0x5a, 0x8a, 0xfe, - 0xbb, 0x0b, 0x4c, 0x4b, 0xb3, 0xb0, 0xb3, 0x1e, 0xf6, 0xc4, 0xc8, 0xa9, 0x7c, 0x22, 0x71, 0xe5, - 0xb3, 0xeb, 0xda, 0x0e, 0x26, 0x85, 0x95, 0xdc, 0x6f, 0xcc, 0x45, 0x6b, 0x5f, 0x7a, 0xd0, 0xff, - 0xe6, 0x46, 0xdd, 0xff, 0xf6, 0xab, 0x63, 0xfa, 0xcd, 0xf0, 0xd5, 0x59, 0x90, 0x4b, 0xbb, 0xce, - 0xa3, 0xba, 0xfb, 0xfd, 0x9e, 0xb0, 0x9f, 0x0b, 0xeb, 0xcf, 0x22, 0x2f, 0x9a, 0x1f, 0x53, 0xef, - 0x9b, 0x50, 0x4b, 0xc4, 0xfc, 0x69, 0xa2, 0xea, 0x36, 0x86, 0x7b, 0x0d, 0x64, 0xdf, 0xc1, 0xf2, - 0xc1, 0xcc, 0xc1, 0x4d, 0x73, 0x44, 0xfb, 0xa7, 0x50, 0xcf, 0xe0, 0xbf, 0x7b, 0x1d, 0x4f, 0x96, - 0x8b, 0xd5, 0x47, 0xb6, 0xd7, 0x89, 0x28, 0x67, 0x54, 0xfa, 0x82, 0x5e, 0x2a, 0xec, 0x76, 0x4e, - 0xc5, 0x16, 0xeb, 0x4a, 0x98, 0xcc, 0xa6, 0x12, 0xbb, 0x4c, 0x34, 0xa6, 0xd8, 0xf4, 0x01, 0xfb, - 0x66, 0xd8, 0x55, 0xb0, 0x78, 0x60, 0xc4, 0xd0, 0x2b, 0x85, 0xb7, 0xa3, 0x68, 0xb5, 0x07, 0xac, - 0x17, 0x26, 0x93, 0xb7, 0xd8, 0x66, 0x55, 0x6c, 0xc1, 0xe9, 0x4b, 0xfc, 0x1b, 0x32, 0xe4, 0xe9, - 0x16, 0x24, 0x7a, 0x63, 0x26, 0xc1, 0x2d, 0xec, 0x0e, 0xef, 0x42, 0xe8, 0xbf, 0x27, 0x59, 0x73, - 0xe0, 0x5c, 0x0d, 0xb3, 0x89, 0x5c, 0x0d, 0xf9, 0x73, 0x9c, 0x02, 0xed, 0x88, 0xd6, 0x31, 0xe5, - 0xe9, 0x64, 0x92, 0x16, 0xd6, 0x97, 0xa1, 0xf4, 0xf1, 0xfe, 0xf9, 0x1c, 0xcc, 0xd0, 0xa2, 0xcf, - 0xe9, 0xed, 0x2d, 0xec, 0xa0, 0x77, 0x48, 0xdf, 0x3f, 0xa8, 0x2b, 0x55, 0x98, 0xb9, 0x48, 0xd8, - 0x5e, 0xd5, 0x2e, 0x99, 0xbb, 0x0e, 0x5b, 0xb9, 0xb8, 0x31, 0x76, 0xdd, 0x83, 0xd6, 0x73, 0x9e, - 0xfe, 0xa1, 0x72, 0xff, 0xbb, 0x32, 0xa6, 0x0b, 0xfe, 0xd4, 0x81, 0x2b, 0x4f, 0x8c, 0xac, 0x70, - 0x92, 0x72, 0x12, 0xf2, 0x7b, 0x3a, 0xbe, 0x58, 0x69, 0x33, 0xeb, 0x96, 0xbd, 0xa1, 0xdf, 0x17, - 0xde, 0xb7, 0x0d, 0xc3, 0xcd, 0x78, 0x49, 0x57, 0x0b, 0xc5, 0x76, 0x6f, 0x07, 0xb2, 0x35, 0x86, - 0x33, 0xc5, 0xfc, 0x65, 0x9d, 0xa5, 0x04, 0x8a, 0x18, 0x65, 0x38, 0xf3, 0xa1, 0x3c, 0x62, 0x4f, - 0xac, 0x50, 0x01, 0x8c, 0xf8, 0x1e, 0x4f, 0xb1, 0xf8, 0x12, 0x03, 0x8a, 0x4e, 0x5f, 0xf2, 0xaf, - 0x91, 0x61, 0xaa, 0x8e, 0x9d, 0x25, 0x1d, 0x77, 0xda, 0x36, 0xb2, 0x0e, 0x6e, 0x1a, 0xdd, 0x0c, - 0xf9, 0x4d, 0x42, 0x6c, 0xd0, 0xb9, 0x05, 0x96, 0x0d, 0xbd, 0x5a, 0x12, 0xdd, 0x11, 0x66, 0xab, - 0x6f, 0x1e, 0xb7, 0x23, 0x81, 0x49, 0xcc, 0xa3, 0x37, 0xbe, 0xe4, 0x31, 0x04, 0xb6, 0x95, 0x61, - 0x86, 0xdd, 0xee, 0x57, 0xec, 0xe8, 0x5b, 0x06, 0xda, 0x1d, 0x41, 0x0b, 0x51, 0x6e, 0x81, 0x9c, - 0xe6, 0x52, 0x63, 0x5b, 0xaf, 0xa8, 0x6f, 0xe7, 0x49, 0xca, 0x53, 0x69, 0xc6, 0x04, 0x61, 0x24, - 0x03, 0xc5, 0xf6, 0x78, 0x1e, 0x63, 0x18, 0xc9, 0x81, 0x85, 0xa7, 0x8f, 0xd8, 0x97, 0x64, 0x38, - 0xce, 0x18, 0x38, 0x8b, 0x2d, 0x47, 0x6f, 0x69, 0x1d, 0x8a, 0xdc, 0x43, 0x99, 0x51, 0x40, 0xb7, - 0x02, 0xb3, 0x7b, 0x61, 0xb2, 0x0c, 0xc2, 0x33, 0x7d, 0x21, 0xe4, 0x18, 0x50, 0xf9, 0x1f, 0x13, - 0x84, 0xe3, 0xe3, 0xa4, 0xca, 0xd1, 0x1c, 0x63, 0x38, 0x3e, 0x61, 0x26, 0xd2, 0x87, 0xf8, 0x45, - 0x2c, 0x34, 0x4f, 0xd0, 0x7d, 0x7e, 0x4e, 0x18, 0xdb, 0x0d, 0x98, 0x26, 0x58, 0xd2, 0x1f, 0xd9, - 0x32, 0x44, 0x8c, 0x12, 0xfb, 0xfd, 0x0e, 0xbb, 0x30, 0xcc, 0xff, 0x57, 0x0d, 0xd3, 0x41, 0xe7, - 0x00, 0x82, 0x4f, 0xe1, 0x4e, 0x3a, 0x13, 0xd5, 0x49, 0x4b, 0x62, 0x9d, 0xf4, 0x1b, 0x84, 0x83, - 0xa5, 0xf4, 0x67, 0xfb, 0xe0, 0xea, 0x21, 0x16, 0x26, 0x63, 0x70, 0xe9, 0xe9, 0xeb, 0xc5, 0x2b, - 0xb2, 0xbd, 0xd7, 0xb8, 0x7f, 0x78, 0x24, 0xf3, 0xa9, 0x70, 0x7f, 0x20, 0xf7, 0xf4, 0x07, 0x07, - 0xb0, 0xa4, 0x6f, 0x80, 0xa3, 0xb4, 0x88, 0x92, 0xcf, 0x56, 0x8e, 0x86, 0x82, 0xe8, 0x49, 0x46, - 0x1f, 0x19, 0x42, 0x09, 0x06, 0xdd, 0x31, 0x1f, 0xd7, 0xc9, 0x25, 0x33, 0x76, 0x93, 0x2a, 0xc8, - 0xe1, 0x5d, 0x4d, 0xff, 0xf5, 0x2c, 0xb5, 0x76, 0x37, 0xc8, 0x9d, 0x6e, 0xe8, 0x2f, 0xb2, 0xa3, - 0x18, 0x11, 0xee, 0x86, 0x2c, 0x71, 0x71, 0x97, 0x23, 0x97, 0x34, 0x82, 0x22, 0x83, 0x0b, 0xf7, - 0xf0, 0x03, 0xce, 0xca, 0x11, 0x95, 0xfc, 0xa9, 0xdc, 0x08, 0x47, 0xcf, 0x6b, 0xad, 0x0b, 0x5b, - 0x96, 0xb9, 0x4b, 0x6e, 0xbf, 0x32, 0xd9, 0x35, 0x5a, 0xe4, 0x3a, 0x42, 0xfe, 0x83, 0x72, 0xab, - 0x67, 0x3a, 0xe4, 0x06, 0x99, 0x0e, 0x2b, 0x47, 0x98, 0xf1, 0xa0, 0x3c, 0xd1, 0xef, 0x74, 0xf2, - 0xb1, 0x9d, 0xce, 0xca, 0x11, 0xaf, 0xdb, 0x51, 0x16, 0x61, 0xb2, 0xad, 0xef, 0x91, 0xad, 0x6a, - 0x32, 0xeb, 0x1a, 0x74, 0x74, 0x79, 0x51, 0xdf, 0xa3, 0x1b, 0xdb, 0x2b, 0x47, 0x54, 0xff, 0x4f, - 0x65, 0x19, 0xa6, 0xc8, 0xb6, 0x00, 0x21, 0x33, 0x99, 0xe8, 0x58, 0xf2, 0xca, 0x11, 0x35, 0xf8, - 0xd7, 0xb5, 0x3e, 0xb2, 0xe4, 0xec, 0xc7, 0x5d, 0xde, 0x76, 0x7b, 0x26, 0xd1, 0x76, 0xbb, 0x2b, - 0x0b, 0xba, 0xe1, 0x7e, 0x12, 0x72, 0x2d, 0x22, 0x61, 0x89, 0x49, 0x98, 0xbe, 0x2a, 0x77, 0x40, - 0x76, 0x47, 0xb3, 0xbc, 0xc9, 0xf3, 0xf5, 0x83, 0xe9, 0xae, 0x69, 0xd6, 0x05, 0x17, 0x41, 0xf7, - 0xaf, 0x85, 0x09, 0xc8, 0x11, 0xc1, 0xf9, 0x0f, 0xe8, 0xcd, 0x59, 0x6a, 0x86, 0x94, 0x4c, 0xc3, - 0x1d, 0xf6, 0x1b, 0xa6, 0x77, 0x40, 0xe6, 0xf7, 0x33, 0xa3, 0xb1, 0x20, 0xfb, 0xde, 0x7b, 0x2e, - 0x47, 0xde, 0x7b, 0xde, 0x73, 0x01, 0x6f, 0xb6, 0xf7, 0x02, 0xde, 0x60, 0xf9, 0x20, 0x37, 0xd8, - 0x51, 0xe5, 0x4f, 0x87, 0x30, 0x5d, 0x7a, 0x05, 0x11, 0x3d, 0x03, 0xef, 0xe8, 0x46, 0xa8, 0xce, - 0xde, 0x6b, 0xc2, 0x4e, 0x29, 0xa9, 0x51, 0x33, 0x80, 0xbd, 0xf4, 0xfb, 0xa6, 0xdf, 0xcc, 0xc2, - 0x29, 0x7a, 0xcd, 0xf3, 0x1e, 0x6e, 0x98, 0xfc, 0x7d, 0x93, 0xe8, 0x13, 0x23, 0x51, 0x9a, 0x3e, - 0x03, 0x8e, 0xdc, 0x77, 0xc0, 0xd9, 0x77, 0x48, 0x39, 0x3b, 0xe0, 0x90, 0x72, 0x2e, 0xd9, 0xca, - 0xe1, 0xfb, 0xc3, 0xfa, 0xb3, 0xce, 0xeb, 0xcf, 0xed, 0x11, 0x00, 0xf5, 0x93, 0xcb, 0x48, 0xec, - 0x9b, 0xb7, 0xf9, 0x9a, 0x52, 0xe7, 0x34, 0xe5, 0xae, 0xe1, 0x19, 0x49, 0x5f, 0x5b, 0x7e, 0x2f, - 0x0b, 0x97, 0x05, 0xcc, 0x54, 0xf1, 0x45, 0xa6, 0x28, 0x9f, 0x1d, 0x89, 0xa2, 0x24, 0x8f, 0x81, - 0x90, 0xb6, 0xc6, 0xfc, 0xb1, 0xf0, 0xd9, 0xa1, 0x5e, 0xa0, 0x7c, 0xd9, 0x44, 0x28, 0xcb, 0x49, - 0xc8, 0xd3, 0x1e, 0x86, 0x41, 0xc3, 0xde, 0x12, 0x76, 0x37, 0x62, 0x27, 0x8e, 0x44, 0x79, 0x1b, - 0x83, 0xfe, 0xb0, 0x75, 0x8d, 0xc6, 0xae, 0x65, 0x54, 0x0c, 0xc7, 0x44, 0x3f, 0x33, 0x12, 0xc5, - 0xf1, 0xbd, 0xe1, 0xe4, 0x61, 0xbc, 0xe1, 0x86, 0x5a, 0xe5, 0xf0, 0x6a, 0x70, 0x28, 0xab, 0x1c, - 0x11, 0x85, 0xa7, 0x8f, 0xdf, 0x5b, 0x65, 0x38, 0xc9, 0x26, 0x5b, 0x0b, 0xbc, 0x85, 0x88, 0xee, - 0x1b, 0x05, 0x90, 0xc7, 0x3d, 0x33, 0x89, 0xdd, 0x72, 0x46, 0x5e, 0xf8, 0x93, 0x52, 0xb1, 0xf7, - 0x3b, 0x70, 0xd3, 0xc1, 0x1e, 0x0e, 0x47, 0x82, 0x94, 0xd8, 0xb5, 0x0e, 0x09, 0xd8, 0x48, 0x1f, - 0xb3, 0x17, 0xc8, 0x90, 0x67, 0xd7, 0xfb, 0x6f, 0xa4, 0xe2, 0x30, 0xc1, 0x47, 0x79, 0x16, 0xd8, - 0x91, 0x4b, 0x7c, 0xc9, 0x7d, 0x7a, 0x7b, 0x71, 0x87, 0x74, 0x8b, 0xfd, 0xb7, 0x24, 0x98, 0xae, - 0x63, 0xa7, 0xa4, 0x59, 0x96, 0xae, 0x6d, 0x8d, 0xca, 0xe3, 0x5b, 0xd4, 0x7b, 0x18, 0x7d, 0x3b, - 0x23, 0x7a, 0x9e, 0xc6, 0x5f, 0x08, 0xf7, 0x58, 0x8d, 0x88, 0x25, 0xf8, 0x88, 0xd0, 0x99, 0x99, - 0x41, 0xd4, 0xc6, 0xe0, 0xb1, 0x2d, 0xc1, 0x84, 0x77, 0x16, 0xef, 0x66, 0xee, 0x7c, 0xe6, 0xb6, - 0xb3, 0xe3, 0x1d, 0x83, 0x21, 0xcf, 0xfb, 0xcf, 0x80, 0xa1, 0x97, 0x27, 0x74, 0x94, 0x8f, 0x3f, - 0x48, 0x98, 0xac, 0x8d, 0x25, 0x71, 0x87, 0x3f, 0xac, 0xa3, 0x83, 0xbf, 0x33, 0xc1, 0x96, 0x23, - 0x57, 0x35, 0x07, 0x3f, 0x80, 0x3e, 0x27, 0xc3, 0x44, 0x1d, 0x3b, 0xee, 0x78, 0xcb, 0x5d, 0x6e, - 0x3a, 0xac, 0x86, 0x2b, 0xa1, 0x15, 0x8f, 0x29, 0xb6, 0x86, 0x71, 0x0f, 0x4c, 0x75, 0x2d, 0xb3, - 0x85, 0x6d, 0x9b, 0xad, 0x5e, 0x84, 0x1d, 0xd5, 0xfa, 0x8d, 0xfe, 0x84, 0xb5, 0xf9, 0x75, 0xef, - 0x1f, 0x35, 0xf8, 0x3d, 0xa9, 0x19, 0x40, 0x29, 0xb1, 0x0a, 0x8e, 0xdb, 0x0c, 0x88, 0x2b, 0x3c, - 0x7d, 0xa0, 0x3f, 0x2d, 0xc3, 0x4c, 0x1d, 0x3b, 0xbe, 0x14, 0x13, 0x6c, 0x72, 0x44, 0xc3, 0xcb, - 0x41, 0x29, 0x1f, 0x0c, 0x4a, 0xf1, 0xab, 0x01, 0x79, 0x69, 0xfa, 0xc4, 0xc6, 0x78, 0x35, 0xa0, - 0x18, 0x07, 0x63, 0x38, 0xbe, 0xf6, 0x58, 0x98, 0x22, 0xbc, 0x90, 0x06, 0xfb, 0x8b, 0xd9, 0xa0, - 0xf1, 0x7e, 0x3e, 0xa5, 0xc6, 0x7b, 0x27, 0xe4, 0x76, 0x34, 0xeb, 0x82, 0x4d, 0x1a, 0xee, 0xb4, - 0x88, 0xd9, 0xbe, 0xe6, 0x66, 0x57, 0xe9, 0x5f, 0xfd, 0xfd, 0x34, 0x73, 0xc9, 0xfc, 0x34, 0x1f, - 0x91, 0x12, 0x8d, 0x84, 0x74, 0xee, 0x30, 0xc2, 0x26, 0x9f, 0x60, 0xdc, 0x8c, 0x29, 0x3b, 0x7d, - 0xe5, 0x78, 0x48, 0x86, 0x49, 0x77, 0xdc, 0x26, 0xf6, 0xf8, 0xb9, 0x83, 0xab, 0x43, 0x7f, 0x43, - 0x3f, 0x61, 0x0f, 0xec, 0x49, 0x64, 0x74, 0xe6, 0x7d, 0x82, 0x1e, 0x38, 0xae, 0xf0, 0xf4, 0xf1, - 0x78, 0x3b, 0xc5, 0x83, 0xb4, 0x07, 0xf4, 0x3a, 0x19, 0xe4, 0x65, 0xec, 0x8c, 0xdb, 0x8a, 0x7c, - 0x8b, 0x70, 0x88, 0x23, 0x4e, 0x60, 0x84, 0xe7, 0xf9, 0x65, 0x3c, 0x9a, 0x06, 0x24, 0x16, 0xdb, - 0x48, 0x88, 0x81, 0xf4, 0x51, 0x7b, 0x37, 0x45, 0x8d, 0x6e, 0x2e, 0xfc, 0xf4, 0x08, 0x7a, 0xd5, - 0xf1, 0x2e, 0x7c, 0x78, 0x02, 0x24, 0x34, 0x0e, 0xab, 0xbd, 0xf5, 0x2b, 0x7c, 0x2c, 0x57, 0xf1, - 0x81, 0xdb, 0xd8, 0xb7, 0x71, 0xeb, 0x02, 0x6e, 0xa3, 0x9f, 0x38, 0x38, 0x74, 0xa7, 0x60, 0xa2, - 0x45, 0xa9, 0x11, 0xf0, 0x26, 0x55, 0xef, 0x35, 0xc1, 0xbd, 0xd2, 0x7c, 0x47, 0x44, 0x7f, 0x1f, - 0xe3, 0xbd, 0xd2, 0x02, 0xc5, 0x8f, 0xc1, 0x6c, 0xa1, 0xb3, 0x8c, 0x4a, 0xcb, 0x34, 0xd0, 0x7f, - 0x39, 0x38, 0x2c, 0x57, 0xc1, 0x94, 0xde, 0x32, 0x0d, 0x12, 0x86, 0xc2, 0x3b, 0x04, 0xe4, 0x27, - 0x78, 0x5f, 0xcb, 0x3b, 0xe6, 0xfd, 0x3a, 0xdb, 0x35, 0x0f, 0x12, 0x86, 0x35, 0x26, 0x5c, 0xd6, - 0x0f, 0xcb, 0x98, 0xe8, 0x53, 0x76, 0xfa, 0x90, 0x7d, 0x24, 0xf0, 0x6e, 0xa3, 0x5d, 0xe1, 0xa3, - 0x62, 0x15, 0x78, 0x98, 0xe1, 0x2c, 0x5c, 0x8b, 0x43, 0x19, 0xce, 0x62, 0x18, 0x18, 0xc3, 0x8d, - 0x15, 0x01, 0x8e, 0xa9, 0xaf, 0x01, 0x1f, 0x00, 0x9d, 0xd1, 0x99, 0x87, 0x43, 0xa2, 0x73, 0x38, - 0x26, 0xe2, 0xfb, 0x58, 0x88, 0x4c, 0x66, 0xf1, 0xa0, 0xff, 0x3a, 0x0a, 0x70, 0x6e, 0x1f, 0xc6, - 0x5f, 0x81, 0x7a, 0x2b, 0x24, 0xb8, 0x11, 0x7b, 0x9f, 0x04, 0x5d, 0x2a, 0x63, 0xbc, 0x2b, 0x5e, - 0xa4, 0xfc, 0xf4, 0x01, 0x7c, 0x9e, 0x0c, 0x73, 0xc4, 0x47, 0xa0, 0x83, 0x35, 0x8b, 0x76, 0x94, - 0x23, 0x71, 0x94, 0x7f, 0xbb, 0x70, 0x80, 0x1f, 0x5e, 0x0e, 0x01, 0x1f, 0x23, 0x81, 0x42, 0x2c, - 0xba, 0x8f, 0x20, 0x0b, 0x63, 0xd9, 0x46, 0x29, 0xf8, 0x2c, 0x30, 0x15, 0x1f, 0x0d, 0x1e, 0x09, - 0x3d, 0x72, 0x79, 0x61, 0x78, 0x8d, 0x6d, 0xcc, 0x1e, 0xb9, 0x22, 0x4c, 0xa4, 0x8f, 0xc9, 0xeb, - 0x6e, 0x61, 0x0b, 0xce, 0x0d, 0x72, 0x61, 0xfc, 0x2b, 0xb3, 0xfe, 0x89, 0xb6, 0x4f, 0x8f, 0xc4, - 0x03, 0xf3, 0x00, 0x01, 0xf1, 0x15, 0xc8, 0x5a, 0xe6, 0x45, 0xba, 0xb4, 0x35, 0xab, 0x92, 0x67, - 0x7a, 0x3d, 0x65, 0x67, 0x77, 0xc7, 0xa0, 0x27, 0x43, 0x67, 0x55, 0xef, 0x55, 0xb9, 0x0e, 0x66, - 0x2f, 0xea, 0xce, 0xf6, 0x0a, 0xd6, 0xda, 0xd8, 0x52, 0xcd, 0x8b, 0xc4, 0x63, 0x6e, 0x52, 0xe5, - 0x13, 0x79, 0xff, 0x15, 0x01, 0xfb, 0x92, 0xdc, 0x22, 0x3f, 0x96, 0xe3, 0x6f, 0x49, 0x2c, 0xcf, - 0x68, 0xae, 0xd2, 0x57, 0x98, 0xf7, 0xc8, 0x30, 0xa5, 0x9a, 0x17, 0x99, 0x92, 0xfc, 0x5f, 0x87, - 0xab, 0x23, 0x89, 0x27, 0x7a, 0x44, 0x72, 0x3e, 0xfb, 0x63, 0x9f, 0xe8, 0xc5, 0x16, 0x3f, 0x96, - 0x93, 0x4b, 0x33, 0xaa, 0x79, 0xb1, 0x8e, 0x1d, 0xda, 0x22, 0x50, 0x73, 0x44, 0x4e, 0xd6, 0xba, - 0x4d, 0x09, 0xb2, 0x79, 0xb8, 0xff, 0x9e, 0x74, 0x17, 0xc1, 0x17, 0x90, 0xcf, 0xe2, 0xb8, 0x77, - 0x11, 0x06, 0x72, 0x30, 0x86, 0x18, 0x29, 0x32, 0x4c, 0xab, 0xe6, 0x45, 0x77, 0x68, 0x58, 0xd2, - 0x3b, 0x9d, 0xd1, 0x8c, 0x90, 0x49, 0x8d, 0x7f, 0x4f, 0x0c, 0x1e, 0x17, 0x63, 0x37, 0xfe, 0x07, - 0x30, 0x90, 0x3e, 0x0c, 0xcf, 0xa1, 0x8d, 0xc5, 0x1b, 0xa1, 0x8d, 0xd1, 0xe0, 0x30, 0x6c, 0x83, - 0xf0, 0xd9, 0x38, 0xb4, 0x06, 0x11, 0xc5, 0xc1, 0x58, 0x76, 0x4e, 0xe6, 0x4a, 0x64, 0x98, 0x1f, - 0x6d, 0x9b, 0x78, 0x67, 0x32, 0xd7, 0x44, 0x36, 0xec, 0x72, 0x8c, 0x8c, 0x04, 0x8d, 0x04, 0x2e, - 0x88, 0x02, 0x3c, 0xa4, 0x8f, 0xc7, 0x07, 0x65, 0x98, 0xa1, 0x2c, 0x3c, 0x4a, 0xac, 0x80, 0xa1, - 0x1a, 0x55, 0xb8, 0x06, 0x87, 0xd3, 0xa8, 0x62, 0x38, 0x18, 0xcb, 0xad, 0xa0, 0xae, 0x1d, 0x37, - 0xc4, 0xf1, 0xf1, 0x28, 0x04, 0x87, 0x36, 0xc6, 0x46, 0x78, 0x84, 0x7c, 0x18, 0x63, 0xec, 0x90, - 0x8e, 0x91, 0x3f, 0xc7, 0x6f, 0x45, 0xa3, 0xc4, 0xe0, 0x00, 0x4d, 0x61, 0x84, 0x30, 0x0c, 0xd9, - 0x14, 0x0e, 0x09, 0x89, 0x2f, 0xcb, 0x00, 0x94, 0x81, 0x35, 0x73, 0x8f, 0x5c, 0xe6, 0x33, 0x82, - 0xee, 0xac, 0xd7, 0xad, 0x5e, 0x1e, 0xe0, 0x56, 0x9f, 0x30, 0x84, 0x4b, 0xd2, 0x95, 0xc0, 0x90, - 0x94, 0xdd, 0x4a, 0x8e, 0x7d, 0x25, 0x30, 0xbe, 0xfc, 0xf4, 0x31, 0xfe, 0x22, 0xb5, 0xe6, 0x82, - 0x03, 0xa6, 0xbf, 0x3e, 0x12, 0x94, 0x43, 0xb3, 0x7f, 0x99, 0x9f, 0xfd, 0x1f, 0x00, 0xdb, 0x61, - 0x6d, 0xc4, 0x41, 0x07, 0x47, 0xd3, 0xb7, 0x11, 0x0f, 0xef, 0x80, 0xe8, 0x4f, 0x67, 0xe1, 0x28, - 0xeb, 0x44, 0xbe, 0x1f, 0x20, 0x4e, 0x78, 0x0e, 0x8f, 0xeb, 0x24, 0x07, 0xa0, 0x3c, 0xaa, 0x05, - 0xa9, 0x24, 0x4b, 0x99, 0x02, 0xec, 0x8d, 0x65, 0x75, 0x23, 0x5f, 0x7e, 0xa0, 0xab, 0x19, 0x6d, - 0xf1, 0x70, 0xbf, 0x03, 0x80, 0xf7, 0xd6, 0x1a, 0x65, 0x7e, 0xad, 0xb1, 0xcf, 0xca, 0x64, 0xe2, - 0x9d, 0x6b, 0x22, 0x32, 0xca, 0xee, 0xd8, 0x77, 0xae, 0xa3, 0xcb, 0x4e, 0x1f, 0xa5, 0x77, 0xca, - 0x90, 0xad, 0x9b, 0x96, 0x83, 0x9e, 0x9b, 0xa4, 0x75, 0x52, 0xc9, 0x07, 0x20, 0x79, 0xef, 0x4a, - 0x89, 0xbb, 0xa5, 0xf9, 0xe6, 0xf8, 0xa3, 0xce, 0x9a, 0xa3, 0x11, 0xaf, 0x6e, 0xb7, 0xfc, 0xd0, - 0x75, 0xcd, 0x49, 0xe3, 0xe9, 0x50, 0xf9, 0xd5, 0xa3, 0x0f, 0x60, 0xa4, 0x16, 0x4f, 0x27, 0xb2, - 0xe4, 0xf4, 0x71, 0x7b, 0xf8, 0x28, 0xf3, 0x6d, 0x5d, 0xd2, 0x3b, 0x18, 0x3d, 0x97, 0xba, 0x8c, - 0x54, 0xb5, 0x1d, 0x2c, 0x7e, 0x24, 0x26, 0xd6, 0xb5, 0x95, 0xc4, 0x97, 0x95, 0x83, 0xf8, 0xb2, - 0x49, 0x1b, 0x14, 0x3d, 0x80, 0x4e, 0x59, 0x1a, 0x77, 0x83, 0x8a, 0x29, 0x7b, 0x2c, 0x71, 0x3a, - 0x8f, 0xd5, 0xb1, 0x43, 0x8d, 0xca, 0x9a, 0x77, 0x03, 0xcb, 0x4f, 0x8e, 0x24, 0x62, 0xa7, 0x7f, - 0xc1, 0x8b, 0xdc, 0x73, 0xc1, 0xcb, 0x7b, 0xc2, 0xe0, 0xac, 0xf1, 0xe0, 0xfc, 0x68, 0xb4, 0x80, - 0x78, 0x26, 0x47, 0x02, 0xd3, 0x5b, 0x7c, 0x98, 0xd6, 0x39, 0x98, 0xee, 0x18, 0x92, 0x8b, 0xf4, - 0x01, 0xfb, 0xa5, 0x1c, 0x1c, 0xa5, 0x93, 0xfe, 0xa2, 0xd1, 0x66, 0x11, 0x56, 0xdf, 0x28, 0x1d, - 0xf2, 0x66, 0xdb, 0xfe, 0x10, 0xac, 0x5c, 0x2c, 0xe7, 0x5c, 0xef, 0xed, 0xf8, 0x0b, 0x34, 0x9c, - 0xab, 0xdb, 0x89, 0x92, 0x9d, 0x36, 0xf1, 0x1b, 0xf2, 0xfd, 0xff, 0xf8, 0xbb, 0x8c, 0x26, 0xc4, - 0xef, 0x32, 0xfa, 0x93, 0x64, 0xeb, 0x76, 0xa4, 0xe8, 0x1e, 0x81, 0xa7, 0x6c, 0x3b, 0x25, 0x58, - 0xd1, 0x13, 0xe0, 0xee, 0x07, 0xc3, 0x9d, 0x2c, 0x88, 0x20, 0x32, 0xa4, 0x3b, 0x19, 0x21, 0x70, - 0x98, 0xee, 0x64, 0x83, 0x18, 0x18, 0xc3, 0xad, 0xf6, 0x39, 0xb6, 0x9b, 0x4f, 0xda, 0x0d, 0xfa, - 0x2b, 0x29, 0xf5, 0x51, 0xfa, 0x3b, 0x99, 0x44, 0xfe, 0xcf, 0x84, 0xaf, 0xf8, 0x61, 0x3a, 0x89, - 0x47, 0x73, 0x1c, 0xb9, 0x31, 0xac, 0x1b, 0x49, 0xc4, 0x17, 0xfd, 0x9c, 0xde, 0x76, 0xb6, 0x47, - 0x74, 0xa2, 0xe3, 0xa2, 0x4b, 0xcb, 0xbb, 0x1e, 0x99, 0xbc, 0xa0, 0x7f, 0xcb, 0x24, 0x0a, 0x21, - 0xe5, 0x8b, 0x84, 0xb0, 0x15, 0x21, 0xe2, 0x04, 0x81, 0x9f, 0x62, 0xe9, 0x8d, 0x51, 0xa3, 0xcf, - 0xea, 0x6d, 0x6c, 0x3e, 0x0a, 0x35, 0x9a, 0xf0, 0x35, 0x3a, 0x8d, 0x8e, 0x23, 0xf7, 0x03, 0xaa, - 0xd1, 0xbe, 0x48, 0x46, 0xa4, 0xd1, 0xb1, 0xf4, 0xd2, 0x97, 0xf1, 0xcb, 0x67, 0xd8, 0x44, 0x6a, - 0x55, 0x37, 0x2e, 0xa0, 0x7f, 0xce, 0x7b, 0x17, 0x33, 0x9f, 0xd3, 0x9d, 0x6d, 0x16, 0x0b, 0xe6, - 0xf7, 0x84, 0xef, 0x46, 0x19, 0x22, 0xde, 0x0b, 0x1f, 0x4e, 0x2a, 0xb7, 0x2f, 0x9c, 0x54, 0x11, - 0x66, 0x75, 0xc3, 0xc1, 0x96, 0xa1, 0x75, 0x96, 0x3a, 0xda, 0x96, 0x7d, 0x6a, 0xa2, 0xef, 0xe5, - 0x75, 0x95, 0x50, 0x1e, 0x95, 0xff, 0x23, 0x7c, 0x7d, 0xe5, 0x24, 0x7f, 0x7d, 0x65, 0x44, 0xf4, - 0xab, 0xa9, 0xe8, 0xe8, 0x57, 0x7e, 0x74, 0x2b, 0x18, 0x1c, 0x1c, 0x5b, 0xd4, 0x36, 0x4e, 0x18, - 0xee, 0xef, 0x66, 0xc1, 0x28, 0x6c, 0x7e, 0xe8, 0xc7, 0x57, 0xc9, 0x89, 0x56, 0xf7, 0x5c, 0x45, - 0x98, 0xef, 0x55, 0x82, 0xc4, 0x16, 0x6a, 0xb8, 0xf2, 0x72, 0x4f, 0xe5, 0x7d, 0x93, 0x27, 0x2b, - 0x60, 0xf2, 0x84, 0x95, 0x2a, 0x27, 0xa6, 0x54, 0x49, 0x16, 0x0b, 0x45, 0x6a, 0x3b, 0x86, 0xd3, - 0x48, 0x39, 0x38, 0xe6, 0x45, 0xbb, 0xed, 0x76, 0xb1, 0x66, 0x69, 0x46, 0x0b, 0xa3, 0x8f, 0x48, - 0xa3, 0x30, 0x7b, 0x97, 0x60, 0x52, 0x6f, 0x99, 0x46, 0x5d, 0x7f, 0xa6, 0x77, 0xb9, 0x5c, 0x7c, - 0x90, 0x75, 0x22, 0x91, 0x0a, 0xfb, 0x43, 0xf5, 0xff, 0x55, 0x2a, 0x30, 0xd5, 0xd2, 0xac, 0x36, - 0x0d, 0xc2, 0x97, 0xeb, 0xb9, 0xc8, 0x29, 0x92, 0x50, 0xc9, 0xfb, 0x45, 0x0d, 0xfe, 0x56, 0x6a, - 0xbc, 0x10, 0xf3, 0x3d, 0xd1, 0x3c, 0x22, 0x89, 0x2d, 0x06, 0x3f, 0x71, 0x32, 0x77, 0xa5, 0x63, - 0xe1, 0x0e, 0xb9, 0x83, 0x9e, 0xf6, 0x10, 0x53, 0x6a, 0x90, 0x90, 0x74, 0x79, 0x80, 0x14, 0xb5, - 0x0f, 0x8d, 0x71, 0x2f, 0x0f, 0x08, 0x71, 0x91, 0xbe, 0x66, 0xbe, 0x2d, 0x0f, 0xb3, 0xb4, 0x57, - 0x63, 0xe2, 0x44, 0xcf, 0x23, 0x57, 0x48, 0x3b, 0xf7, 0xe2, 0x4b, 0xa8, 0x7e, 0xf0, 0x31, 0xb9, - 0x00, 0xf2, 0x05, 0x3f, 0xe0, 0xa0, 0xfb, 0x98, 0x74, 0xdf, 0xde, 0xe3, 0x6b, 0x9e, 0xf2, 0x34, - 0xee, 0x7d, 0xfb, 0xf8, 0xe2, 0xd3, 0xc7, 0xe7, 0x97, 0x65, 0x90, 0x8b, 0xed, 0x36, 0x6a, 0x1d, - 0x1c, 0x8a, 0x6b, 0x60, 0xda, 0x6b, 0x33, 0x41, 0x0c, 0xc8, 0x70, 0x52, 0xd2, 0x45, 0x50, 0x5f, - 0x36, 0xc5, 0xf6, 0xd8, 0x77, 0x15, 0x62, 0xca, 0x4e, 0x1f, 0x94, 0x5f, 0x9f, 0x60, 0x8d, 0x66, - 0xc1, 0x34, 0x2f, 0x90, 0xa3, 0x32, 0xcf, 0x95, 0x21, 0xb7, 0x84, 0x9d, 0xd6, 0xf6, 0x88, 0xda, - 0xcc, 0xae, 0xd5, 0xf1, 0xda, 0xcc, 0xbe, 0xfb, 0xf0, 0x07, 0xdb, 0xb0, 0x1e, 0x5b, 0xf3, 0x84, - 0xa5, 0x71, 0x47, 0x77, 0x8e, 0x2d, 0x3d, 0x7d, 0x70, 0xfe, 0x4d, 0x86, 0x39, 0x7f, 0x85, 0x8b, - 0x62, 0xf2, 0x4b, 0x99, 0x47, 0xdb, 0x7a, 0x27, 0xfa, 0x6c, 0xb2, 0x10, 0x69, 0xbe, 0x4c, 0xf9, - 0x9a, 0xa5, 0xbc, 0xb0, 0x98, 0x20, 0x78, 0x9a, 0x18, 0x83, 0x63, 0x98, 0xc1, 0xcb, 0x30, 0x49, - 0x18, 0x5a, 0xd4, 0xf7, 0x88, 0xeb, 0x20, 0xb7, 0xd0, 0xf8, 0xac, 0x91, 0x2c, 0x34, 0xde, 0xc1, - 0x2f, 0x34, 0x0a, 0x46, 0x3c, 0xf6, 0xd6, 0x19, 0x13, 0xfa, 0xd2, 0xb8, 0xff, 0x8f, 0x7c, 0x99, - 0x31, 0x81, 0x2f, 0xcd, 0x80, 0xf2, 0xd3, 0x47, 0xf4, 0x55, 0xff, 0x89, 0x75, 0xb6, 0xde, 0x86, - 0x2a, 0xfa, 0x1f, 0xc7, 0x20, 0x7b, 0xd6, 0x7d, 0xf8, 0x5f, 0xc1, 0x8d, 0x58, 0x2f, 0x1e, 0x41, - 0x70, 0x86, 0xa7, 0x43, 0xd6, 0xa5, 0xcf, 0xa6, 0x2d, 0x37, 0x8a, 0xed, 0xee, 0xba, 0x8c, 0xa8, - 0xe4, 0x3f, 0xe5, 0x24, 0xe4, 0x6d, 0x73, 0xd7, 0x6a, 0xb9, 0xe6, 0xb3, 0xab, 0x31, 0xec, 0x2d, - 0x69, 0x50, 0x52, 0x8e, 0xf4, 0xfc, 0xe8, 0x5c, 0x46, 0x43, 0x17, 0x24, 0xc9, 0xdc, 0x05, 0x49, - 0x09, 0xf6, 0x0f, 0x04, 0x78, 0x4b, 0x5f, 0x23, 0xfe, 0x8a, 0xdc, 0x15, 0xd8, 0x1e, 0x15, 0xec, - 0x11, 0x62, 0x39, 0xa8, 0x3a, 0x24, 0x75, 0xf8, 0xe6, 0x45, 0xeb, 0xc7, 0x81, 0x1f, 0xab, 0xc3, - 0xb7, 0x00, 0x0f, 0x63, 0x39, 0xa5, 0x9e, 0x67, 0x4e, 0xaa, 0xf7, 0x8d, 0x12, 0xdd, 0x2c, 0xa7, - 0xf4, 0x07, 0x42, 0x67, 0x84, 0xce, 0xab, 0x43, 0xa3, 0x73, 0x48, 0xee, 0xab, 0x7f, 0x20, 0x93, - 0x48, 0x98, 0x9e, 0x91, 0x23, 0x7e, 0xd1, 0x51, 0x62, 0x88, 0xdc, 0x31, 0x98, 0x8b, 0x03, 0x3d, - 0x3b, 0x7c, 0x68, 0x70, 0x5e, 0x74, 0x21, 0xfe, 0xc7, 0x1d, 0x1a, 0x5c, 0x94, 0x91, 0xf4, 0x81, - 0x7c, 0x2d, 0xbd, 0x58, 0xac, 0xd8, 0x72, 0xf4, 0xbd, 0x11, 0xb7, 0x34, 0x7e, 0x78, 0x49, 0x18, - 0x0d, 0x78, 0x9f, 0x84, 0x28, 0x87, 0xe3, 0x8e, 0x06, 0x2c, 0xc6, 0x46, 0xfa, 0x30, 0xfd, 0x6d, - 0xde, 0x95, 0x1e, 0x5b, 0x9b, 0x79, 0x1d, 0x5b, 0x0d, 0xc0, 0x07, 0x47, 0xeb, 0x0c, 0xcc, 0x84, - 0xa6, 0xfe, 0xde, 0x85, 0x35, 0x5c, 0x5a, 0xd2, 0x83, 0xee, 0xbe, 0xc8, 0x46, 0xbe, 0x30, 0x90, - 0x60, 0xc1, 0x57, 0x84, 0x89, 0xb1, 0xdc, 0x07, 0xe7, 0x8d, 0x61, 0x63, 0xc2, 0xea, 0xf7, 0xc2, - 0x58, 0xd5, 0x78, 0xac, 0x6e, 0x13, 0x11, 0x93, 0xd8, 0x98, 0x26, 0x34, 0x6f, 0x7c, 0xab, 0x0f, - 0x97, 0xca, 0xc1, 0xf5, 0xf4, 0xa1, 0xf9, 0x48, 0x1f, 0xb1, 0x97, 0xd0, 0xee, 0xb0, 0x4e, 0x4d, - 0xf6, 0xd1, 0x74, 0x87, 0x6c, 0x36, 0x20, 0x73, 0xb3, 0x81, 0x84, 0xfe, 0xf6, 0x81, 0x1b, 0xa9, - 0xc7, 0xdc, 0x20, 0x88, 0xb2, 0x23, 0xf6, 0xb7, 0x1f, 0xc8, 0x41, 0xfa, 0xe0, 0xfc, 0xa3, 0x0c, - 0xb0, 0x6c, 0x99, 0xbb, 0xdd, 0x9a, 0xd5, 0xc6, 0x16, 0xfa, 0x9b, 0x60, 0x02, 0xf0, 0xc2, 0x11, - 0x4c, 0x00, 0xd6, 0x01, 0xb6, 0x7c, 0xe2, 0x4c, 0xc3, 0x6f, 0x11, 0x33, 0xf7, 0x03, 0xa6, 0xd4, - 0x10, 0x0d, 0xfe, 0xca, 0xd9, 0x1f, 0xe3, 0x31, 0x8e, 0xeb, 0xb3, 0x02, 0x72, 0xa3, 0x9c, 0x00, - 0xbc, 0xdd, 0xc7, 0xba, 0xc1, 0x61, 0x7d, 0xf7, 0x01, 0x38, 0x49, 0x1f, 0xf3, 0x7f, 0x9a, 0x80, - 0x69, 0xba, 0x5d, 0x47, 0x65, 0xfa, 0xf7, 0x01, 0xe8, 0xbf, 0x3e, 0x02, 0xd0, 0x37, 0x60, 0xc6, - 0x0c, 0xa8, 0xd3, 0x3e, 0x35, 0xbc, 0x00, 0x13, 0x0b, 0x7b, 0x88, 0x2f, 0x95, 0x23, 0x83, 0x3e, - 0x14, 0x46, 0x5e, 0xe5, 0x91, 0xbf, 0x23, 0x46, 0xde, 0x21, 0x8a, 0xa3, 0x84, 0xfe, 0x1d, 0x3e, - 0xf4, 0x1b, 0x1c, 0xf4, 0xc5, 0x83, 0xb0, 0x32, 0x86, 0x70, 0xfb, 0x32, 0x64, 0xc9, 0xe9, 0xb8, - 0xdf, 0x4c, 0x71, 0x7e, 0x7f, 0x0a, 0x26, 0x48, 0x93, 0xf5, 0xe7, 0x1d, 0xde, 0xab, 0xfb, 0x45, - 0xdb, 0x74, 0xb0, 0xe5, 0x7b, 0x2c, 0x78, 0xaf, 0x2e, 0x0f, 0x9e, 0x57, 0xb2, 0x7d, 0x2a, 0x4f, - 0x37, 0x22, 0xfd, 0x84, 0xa1, 0x27, 0x25, 0x61, 0x89, 0x8f, 0xec, 0xbc, 0xdc, 0x30, 0x93, 0x92, - 0x01, 0x8c, 0xa4, 0x0f, 0xfc, 0x5f, 0x64, 0xe1, 0x14, 0x5d, 0x55, 0x5a, 0xb2, 0xcc, 0x9d, 0x9e, - 0xdb, 0xad, 0xf4, 0x83, 0xeb, 0xc2, 0xf5, 0x30, 0xe7, 0x70, 0xfe, 0xd8, 0x4c, 0x27, 0x7a, 0x52, - 0xd1, 0x9f, 0x86, 0x7d, 0x2a, 0x9e, 0xc1, 0x23, 0xb9, 0x10, 0x23, 0xc0, 0x28, 0xde, 0x13, 0x2f, - 0xd4, 0x0b, 0x32, 0x1a, 0x5a, 0xa4, 0x92, 0x87, 0x5a, 0xb3, 0xf4, 0x75, 0x2a, 0x27, 0xa2, 0x53, - 0xef, 0xf5, 0x75, 0xea, 0x27, 0x38, 0x9d, 0x5a, 0x3e, 0xb8, 0x48, 0xd2, 0xd7, 0xad, 0x57, 0xfa, - 0x1b, 0x43, 0xfe, 0xb6, 0xdd, 0x4e, 0x0a, 0x9b, 0x75, 0x61, 0x7f, 0xa4, 0x2c, 0xe7, 0x8f, 0xc4, - 0xdf, 0x47, 0x91, 0x60, 0x26, 0xcc, 0x73, 0x1d, 0xa1, 0x4b, 0x73, 0x20, 0xe9, 0x1e, 0x77, 0x92, - 0xde, 0x1e, 0x6a, 0xae, 0x1b, 0x5b, 0xd0, 0x18, 0xd6, 0x96, 0xe6, 0x20, 0xbf, 0xa4, 0x77, 0x1c, - 0x6c, 0xa1, 0x2f, 0xb2, 0x99, 0xee, 0x2b, 0x53, 0x1c, 0x00, 0x16, 0x21, 0xbf, 0x49, 0x4a, 0x63, - 0x26, 0xf3, 0x4d, 0x62, 0xad, 0x87, 0x72, 0xa8, 0xb2, 0x7f, 0x93, 0x46, 0xe7, 0xeb, 0x21, 0x33, - 0xb2, 0x29, 0x72, 0x82, 0xe8, 0x7c, 0x83, 0x59, 0x18, 0xcb, 0xc5, 0x54, 0x79, 0x15, 0xef, 0xb8, - 0x63, 0xfc, 0x85, 0xf4, 0x10, 0x2e, 0x80, 0xac, 0xb7, 0x6d, 0xd2, 0x39, 0x4e, 0xa9, 0xee, 0x63, - 0x52, 0x5f, 0xa1, 0x5e, 0x51, 0x51, 0x96, 0xc7, 0xed, 0x2b, 0x24, 0xc4, 0x45, 0xfa, 0x98, 0x7d, - 0x87, 0x38, 0x8a, 0x76, 0x3b, 0x5a, 0x0b, 0xbb, 0xdc, 0xa7, 0x86, 0x1a, 0xed, 0xc9, 0xb2, 0x5e, - 0x4f, 0x16, 0x6a, 0xa7, 0xb9, 0x03, 0xb4, 0xd3, 0x61, 0x97, 0x21, 0x7d, 0x99, 0x93, 0x8a, 0x1f, - 0xda, 0x32, 0x64, 0x2c, 0x1b, 0x63, 0xb8, 0x76, 0xd4, 0x3b, 0x48, 0x3b, 0xd6, 0xd6, 0x3a, 0xec, - 0x26, 0x0d, 0x13, 0xd6, 0xc8, 0x0e, 0xcd, 0x0e, 0xb3, 0x49, 0x13, 0xcd, 0xc3, 0x18, 0xd0, 0x9a, - 0x63, 0x68, 0x7d, 0x86, 0x0d, 0xa3, 0x29, 0xef, 0x93, 0xda, 0xa6, 0xe5, 0x24, 0xdb, 0x27, 0x75, - 0xb9, 0x53, 0xc9, 0x7f, 0x49, 0x0f, 0x5e, 0xf1, 0xe7, 0xaa, 0x47, 0x35, 0x7c, 0x26, 0x38, 0x78, - 0x35, 0x88, 0x81, 0xf4, 0xe1, 0x7d, 0xd3, 0x21, 0x0d, 0x9e, 0xc3, 0x36, 0x47, 0xd6, 0x06, 0x46, - 0x36, 0x74, 0x0e, 0xd3, 0x1c, 0xa3, 0x79, 0x48, 0x1f, 0xaf, 0x6f, 0x86, 0x06, 0xce, 0x37, 0x8c, - 0x71, 0xe0, 0xf4, 0x5a, 0x66, 0x6e, 0xc8, 0x96, 0x39, 0xec, 0xfe, 0x0f, 0x93, 0xf5, 0xe8, 0x06, - 0xcc, 0x61, 0xf6, 0x7f, 0x62, 0x98, 0x48, 0x1f, 0xf1, 0x37, 0xca, 0x90, 0xab, 0x8f, 0x7f, 0xbc, - 0x1c, 0x76, 0x2e, 0x42, 0x64, 0x55, 0x1f, 0xd9, 0x70, 0x39, 0xcc, 0x5c, 0x24, 0x92, 0x85, 0x31, - 0x04, 0xde, 0x3f, 0x0a, 0x33, 0x64, 0x49, 0xc4, 0xdb, 0x66, 0xfd, 0x26, 0x1b, 0x35, 0x1f, 0x49, - 0xb1, 0xad, 0xde, 0x03, 0x93, 0xde, 0xfe, 0x1d, 0x1b, 0x39, 0xe7, 0xc5, 0xda, 0xa7, 0xc7, 0xa5, - 0xea, 0xff, 0x7f, 0x20, 0x67, 0x88, 0x91, 0xef, 0xd5, 0x0e, 0xeb, 0x0c, 0x71, 0xa8, 0xfb, 0xb5, - 0x7f, 0x12, 0x8c, 0xa8, 0xff, 0x25, 0x3d, 0xcc, 0x7b, 0xf7, 0x71, 0xb3, 0x7d, 0xf6, 0x71, 0x3f, - 0x12, 0xc6, 0xb2, 0xce, 0x63, 0x79, 0xa7, 0xa8, 0x08, 0x47, 0x38, 0xd6, 0xbe, 0xd3, 0x87, 0xf3, - 0x2c, 0x07, 0xe7, 0xc2, 0x81, 0x78, 0x19, 0xc3, 0xc1, 0xc7, 0x6c, 0x30, 0xe6, 0x7e, 0x34, 0xc5, - 0x76, 0xdc, 0x73, 0xaa, 0x22, 0xbb, 0xef, 0x54, 0x05, 0xd7, 0xd2, 0x73, 0x07, 0x6c, 0xe9, 0x1f, - 0x0d, 0x6b, 0x47, 0x83, 0xd7, 0x8e, 0xa7, 0x8b, 0x23, 0x32, 0xba, 0x91, 0xf9, 0x5d, 0xbe, 0x7a, - 0x9c, 0xe3, 0xd4, 0xa3, 0x74, 0x30, 0x66, 0xd2, 0xd7, 0x8f, 0x3f, 0xf4, 0x26, 0xb4, 0x87, 0xdc, - 0xde, 0x87, 0xdd, 0x2a, 0xe6, 0x84, 0x38, 0xb2, 0x91, 0x7b, 0x98, 0xad, 0xe2, 0x41, 0x9c, 0x8c, - 0x21, 0x16, 0xdb, 0x2c, 0x4c, 0x13, 0x9e, 0xce, 0xe9, 0xed, 0x2d, 0xec, 0xa0, 0x57, 0x51, 0x1f, - 0x45, 0x2f, 0xf2, 0xe5, 0x88, 0xc2, 0x13, 0x45, 0x9d, 0x77, 0x4d, 0xea, 0xd1, 0x41, 0x99, 0x9c, - 0x0f, 0x31, 0x38, 0xee, 0x08, 0x8a, 0x03, 0x39, 0x48, 0x1f, 0xb2, 0x0f, 0x51, 0x77, 0x9b, 0x55, - 0xed, 0x92, 0xb9, 0xeb, 0xa0, 0x07, 0x47, 0xd0, 0x41, 0x2f, 0x40, 0xbe, 0x43, 0xa8, 0xb1, 0x63, - 0x19, 0xf1, 0xd3, 0x1d, 0x26, 0x02, 0x5a, 0xbe, 0xca, 0xfe, 0x4c, 0x7a, 0x36, 0x23, 0x90, 0x23, - 0xa5, 0x33, 0xee, 0xb3, 0x19, 0x03, 0xca, 0x1f, 0xcb, 0x1d, 0x3b, 0x93, 0x6e, 0xe9, 0xfa, 0x8e, - 0xee, 0x8c, 0x28, 0x82, 0x43, 0xc7, 0xa5, 0xe5, 0x45, 0x70, 0x20, 0x2f, 0x49, 0x4f, 0x8c, 0x86, - 0xa4, 0xe2, 0xfe, 0x3e, 0xee, 0x13, 0xa3, 0xf1, 0xc5, 0xa7, 0x8f, 0xc9, 0xaf, 0xd2, 0x96, 0x75, - 0x96, 0x3a, 0xdf, 0xa6, 0xe8, 0xd7, 0x3b, 0x74, 0x63, 0xa1, 0xac, 0x1d, 0x5e, 0x63, 0xe9, 0x5b, - 0x7e, 0xfa, 0xc0, 0xfc, 0xc6, 0x0f, 0x43, 0x6e, 0x11, 0x9f, 0xdf, 0xdd, 0x42, 0x77, 0xc0, 0x64, - 0xc3, 0xc2, 0xb8, 0x62, 0x6c, 0x9a, 0xae, 0x74, 0x1d, 0xf7, 0xd9, 0x83, 0x84, 0xbd, 0xb9, 0x78, - 0x6c, 0x63, 0xad, 0x1d, 0x9c, 0x3f, 0xf3, 0x5e, 0xd1, 0x8b, 0x25, 0xc8, 0xd6, 0x1d, 0xcd, 0x41, - 0x53, 0x3e, 0xb6, 0xe8, 0xc1, 0x30, 0x16, 0x77, 0xf0, 0x58, 0x5c, 0xcf, 0xc9, 0x82, 0x70, 0x30, - 0xef, 0xfe, 0x1f, 0x01, 0x00, 0x82, 0xc9, 0xfb, 0x6d, 0xd3, 0x70, 0x73, 0x78, 0x47, 0x20, 0xbd, - 0x77, 0xf4, 0x0a, 0x5f, 0xdc, 0x77, 0x71, 0xe2, 0x7e, 0xbc, 0x58, 0x11, 0x63, 0x58, 0x69, 0x93, - 0x60, 0xca, 0x15, 0xed, 0x0a, 0xd6, 0xda, 0x36, 0xfa, 0xa1, 0x40, 0xf9, 0x23, 0xc4, 0x8c, 0xde, - 0x27, 0x1c, 0x8c, 0x93, 0xd6, 0xca, 0x27, 0x1e, 0xed, 0xd1, 0xe1, 0x6d, 0xfe, 0x4b, 0x7c, 0x30, - 0x92, 0x9b, 0x21, 0xab, 0x1b, 0x9b, 0x26, 0xf3, 0x2f, 0xbc, 0x32, 0x82, 0xb6, 0xab, 0x13, 0x2a, - 0xc9, 0x28, 0x18, 0xa9, 0x33, 0x9e, 0xad, 0xb1, 0x5c, 0x7a, 0x97, 0x75, 0x4b, 0x47, 0xff, 0xe7, - 0x40, 0x61, 0x2b, 0x0a, 0x64, 0xbb, 0x9a, 0xb3, 0xcd, 0x8a, 0x26, 0xcf, 0xae, 0x8d, 0xbc, 0x6b, - 0x68, 0x86, 0x69, 0x5c, 0xda, 0xd1, 0x9f, 0xe9, 0xdf, 0xad, 0xcb, 0xa5, 0xb9, 0x9c, 0x6f, 0x61, - 0x03, 0x5b, 0x9a, 0x83, 0xeb, 0x7b, 0x5b, 0x64, 0x8e, 0x35, 0xa9, 0x86, 0x93, 0x12, 0xeb, 0xbf, - 0xcb, 0x71, 0xb4, 0xfe, 0x6f, 0xea, 0x1d, 0x4c, 0x22, 0x35, 0x31, 0xfd, 0xf7, 0xde, 0x13, 0xe9, - 0x7f, 0x9f, 0x22, 0xd2, 0x47, 0xe3, 0xbb, 0x12, 0xcc, 0xd4, 0x5d, 0x85, 0xab, 0xef, 0xee, 0xec, - 0x68, 0xd6, 0x25, 0x74, 0x6d, 0x80, 0x4a, 0x48, 0x35, 0x33, 0xbc, 0x5f, 0xca, 0x1f, 0x08, 0x5f, - 0x2b, 0xcd, 0x9a, 0x76, 0xa8, 0x84, 0xc4, 0xed, 0xe0, 0x89, 0x90, 0x73, 0xd5, 0xdb, 0xf3, 0xb8, - 0x8c, 0x6d, 0x08, 0x34, 0xa7, 0x60, 0x44, 0xab, 0x81, 0xbc, 0x8d, 0x21, 0x9a, 0x86, 0x04, 0x47, - 0xeb, 0x8e, 0xd6, 0xba, 0xb0, 0x6c, 0x5a, 0xe6, 0xae, 0xa3, 0x1b, 0xd8, 0x46, 0x8f, 0x09, 0x10, - 0xf0, 0xf4, 0x3f, 0x13, 0xe8, 0x3f, 0xfa, 0xf7, 0x8c, 0xe8, 0x28, 0xea, 0x77, 0xab, 0x61, 0xf2, - 0x11, 0x01, 0xaa, 0xc4, 0xc6, 0x45, 0x11, 0x8a, 0xe9, 0x0b, 0xed, 0x0d, 0x32, 0x14, 0xca, 0x0f, - 0x74, 0x4d, 0xcb, 0x59, 0x35, 0x5b, 0x5a, 0xc7, 0x76, 0x4c, 0x0b, 0xa3, 0x5a, 0xac, 0xd4, 0xdc, - 0x1e, 0xa6, 0x6d, 0xb6, 0x82, 0xc1, 0x91, 0xbd, 0x85, 0xd5, 0x4e, 0xe6, 0x75, 0xfc, 0x43, 0xc2, - 0xbb, 0x8c, 0x54, 0x2a, 0xbd, 0x1c, 0x45, 0xe8, 0x79, 0xbf, 0x2e, 0x2d, 0xd9, 0x61, 0x09, 0xb1, - 0x9d, 0x47, 0x21, 0xa6, 0xc6, 0xb0, 0x54, 0x2e, 0xc1, 0x6c, 0x7d, 0xf7, 0xbc, 0x4f, 0xc4, 0x0e, - 0x1b, 0x21, 0xaf, 0x16, 0x8e, 0x52, 0xc1, 0x14, 0x2f, 0x4c, 0x28, 0x42, 0xbe, 0xd7, 0xc1, 0xac, - 0x1d, 0xce, 0xc6, 0xf0, 0xe6, 0x13, 0x05, 0xa3, 0x53, 0x0c, 0x2e, 0x35, 0x7d, 0x01, 0xbe, 0x4b, - 0x82, 0xd9, 0x5a, 0x17, 0x1b, 0xb8, 0x4d, 0xbd, 0x20, 0x39, 0x01, 0xbe, 0x38, 0xa1, 0x00, 0x39, - 0x42, 0x11, 0x02, 0x0c, 0x3c, 0x96, 0x17, 0x3d, 0xe1, 0x05, 0x09, 0x89, 0x04, 0x17, 0x57, 0x5a, - 0xfa, 0x82, 0xfb, 0x82, 0x04, 0xd3, 0xea, 0xae, 0xb1, 0x6e, 0x99, 0xee, 0x68, 0x6c, 0xa1, 0x3b, - 0x83, 0x0e, 0xe2, 0x26, 0x38, 0xd6, 0xde, 0xb5, 0xc8, 0xfa, 0x53, 0xc5, 0xa8, 0xe3, 0x96, 0x69, - 0xb4, 0x6d, 0x52, 0x8f, 0x9c, 0xba, 0xff, 0xc3, 0xed, 0xd9, 0xe7, 0x7e, 0x4d, 0xce, 0xa0, 0xe7, - 0x09, 0x87, 0xba, 0xa1, 0x95, 0x0f, 0x15, 0x2d, 0xde, 0x13, 0x08, 0x06, 0xb4, 0x19, 0x54, 0x42, - 0xfa, 0xc2, 0xfd, 0x8c, 0x04, 0x4a, 0xb1, 0xd5, 0x32, 0x77, 0x0d, 0xa7, 0x8e, 0x3b, 0xb8, 0xe5, - 0x34, 0x2c, 0xad, 0x85, 0xc3, 0xf6, 0x73, 0x01, 0xe4, 0xb6, 0x6e, 0xb1, 0x3e, 0xd8, 0x7d, 0x64, - 0x72, 0x7c, 0xb1, 0xf0, 0x8e, 0x23, 0xad, 0xe5, 0xfe, 0x52, 0x12, 0x88, 0x53, 0x6c, 0x5f, 0x51, - 0xb0, 0xa0, 0xf4, 0xa5, 0xfa, 0x51, 0x09, 0xa6, 0xbc, 0x1e, 0x7b, 0x4b, 0x44, 0x98, 0xbf, 0x9a, - 0x70, 0x32, 0xe2, 0x13, 0x4f, 0x20, 0xc3, 0xb7, 0x25, 0x98, 0x55, 0x44, 0xd1, 0x4f, 0x26, 0xba, - 0x62, 0x72, 0xd1, 0xb9, 0xaf, 0xd5, 0x5a, 0x73, 0xa9, 0xb6, 0xba, 0x58, 0x56, 0x0b, 0x32, 0xfa, - 0xa2, 0x04, 0xd9, 0x75, 0xdd, 0xd8, 0x0a, 0x47, 0x57, 0x3a, 0xee, 0xda, 0x91, 0x6d, 0xfc, 0x00, - 0x6b, 0xe9, 0xf4, 0x45, 0xb9, 0x15, 0x8e, 0x1b, 0xbb, 0x3b, 0xe7, 0xb1, 0x55, 0xdb, 0x24, 0xa3, - 0xac, 0xdd, 0x30, 0xeb, 0xd8, 0xa0, 0x46, 0x68, 0x4e, 0xed, 0xfb, 0x8d, 0x37, 0xc1, 0x04, 0x26, - 0x0f, 0x2e, 0x27, 0x11, 0x12, 0xf7, 0x99, 0x92, 0x42, 0x4c, 0x25, 0x9a, 0x36, 0xf4, 0x21, 0x9e, - 0xbe, 0xa6, 0xfe, 0x51, 0x0e, 0x4e, 0x14, 0x8d, 0x4b, 0xc4, 0xa6, 0xa0, 0x1d, 0x7c, 0x69, 0x5b, - 0x33, 0xb6, 0x30, 0x19, 0x20, 0x7c, 0x89, 0x87, 0x43, 0xf4, 0x67, 0xf8, 0x10, 0xfd, 0x8a, 0x0a, - 0x13, 0xa6, 0xd5, 0xc6, 0xd6, 0xc2, 0x25, 0xc2, 0x53, 0xef, 0xb2, 0x33, 0x6b, 0x93, 0xfd, 0x8a, - 0x98, 0x67, 0xe4, 0xe7, 0x6b, 0xf4, 0x7f, 0xd5, 0x23, 0x74, 0xe6, 0x26, 0x98, 0x60, 0x69, 0xca, - 0x0c, 0x4c, 0xd6, 0xd4, 0xc5, 0xb2, 0xda, 0xac, 0x2c, 0x16, 0x8e, 0x28, 0x97, 0xc1, 0xd1, 0x4a, - 0xa3, 0xac, 0x16, 0x1b, 0x95, 0x5a, 0xb5, 0x49, 0xd2, 0x0b, 0x19, 0xf4, 0x9c, 0xac, 0xa8, 0x67, - 0x6f, 0x3c, 0x33, 0xfd, 0x60, 0x55, 0x61, 0xa2, 0x45, 0x33, 0x90, 0x21, 0x74, 0x3a, 0x51, 0xed, - 0x18, 0x41, 0x9a, 0xa0, 0x7a, 0x84, 0x94, 0xd3, 0x00, 0x17, 0x2d, 0xd3, 0xd8, 0x0a, 0x4e, 0x1d, - 0x4e, 0xaa, 0xa1, 0x14, 0xf4, 0x60, 0x06, 0xf2, 0xf4, 0x1f, 0x72, 0x25, 0x09, 0x79, 0x0a, 0x04, - 0xef, 0xbd, 0xbb, 0x16, 0x2f, 0x91, 0x57, 0x30, 0xd1, 0x62, 0xaf, 0xae, 0x2e, 0x52, 0x19, 0x50, - 0x4b, 0x98, 0x55, 0xe5, 0x66, 0xc8, 0xd3, 0x7f, 0x99, 0xd7, 0x41, 0x74, 0x78, 0x51, 0x9a, 0x4d, - 0xd0, 0x4f, 0x59, 0x5c, 0xa6, 0xe9, 0x6b, 0xf3, 0xfb, 0x25, 0x98, 0xac, 0x62, 0xa7, 0xb4, 0x8d, - 0x5b, 0x17, 0xd0, 0xe3, 0xf8, 0x05, 0xd0, 0x8e, 0x8e, 0x0d, 0xe7, 0xbe, 0x9d, 0x8e, 0xbf, 0x00, - 0xea, 0x25, 0xa0, 0x9f, 0x0f, 0x77, 0xbe, 0x77, 0xf3, 0xfa, 0x73, 0x63, 0x9f, 0xba, 0x7a, 0x25, - 0x44, 0xa8, 0xcc, 0x49, 0xc8, 0x5b, 0xd8, 0xde, 0xed, 0x78, 0x8b, 0x68, 0xec, 0x0d, 0x3d, 0xec, - 0x8b, 0xb3, 0xc4, 0x89, 0xf3, 0x66, 0xf1, 0x22, 0xc6, 0x10, 0xaf, 0x34, 0x0b, 0x13, 0x15, 0x43, - 0x77, 0x74, 0xad, 0x83, 0x9e, 0x97, 0x85, 0xd9, 0x3a, 0x76, 0xd6, 0x35, 0x4b, 0xdb, 0xc1, 0x0e, - 0xb6, 0x6c, 0xf4, 0x6d, 0xbe, 0x4f, 0xe8, 0x76, 0x34, 0x67, 0xd3, 0xb4, 0x76, 0x3c, 0xd5, 0xf4, - 0xde, 0x5d, 0xd5, 0xdc, 0xc3, 0x96, 0x1d, 0xf0, 0xe5, 0xbd, 0xba, 0x5f, 0x2e, 0x9a, 0xd6, 0x05, - 0x77, 0x10, 0x64, 0xd3, 0x34, 0xf6, 0xea, 0xd2, 0xeb, 0x98, 0x5b, 0xab, 0x78, 0x0f, 0x7b, 0xe1, - 0xd2, 0xfc, 0x77, 0x77, 0x2e, 0xd0, 0x36, 0xab, 0xa6, 0xe3, 0x76, 0xda, 0xab, 0xe6, 0x16, 0x8d, - 0x17, 0x3b, 0xa9, 0xf2, 0x89, 0x41, 0x2e, 0x6d, 0x0f, 0x93, 0x5c, 0xf9, 0x70, 0x2e, 0x96, 0xa8, - 0xcc, 0x83, 0xe2, 0xff, 0xd6, 0xc0, 0x1d, 0xbc, 0x83, 0x1d, 0xeb, 0x12, 0xb9, 0x16, 0x62, 0x52, - 0xed, 0xf3, 0x85, 0x0d, 0xd0, 0xe2, 0x93, 0x75, 0x26, 0xbd, 0x79, 0x4e, 0x72, 0x07, 0x9a, 0xac, - 0x8b, 0x50, 0x1c, 0xcb, 0xb5, 0x57, 0xb2, 0x6b, 0xcd, 0xbc, 0x54, 0x86, 0x2c, 0x19, 0x3c, 0xdf, - 0x98, 0xe1, 0x56, 0x98, 0x76, 0xb0, 0x6d, 0x6b, 0x5b, 0xd8, 0x5b, 0x61, 0x62, 0xaf, 0xca, 0x6d, - 0x90, 0xeb, 0x10, 0x4c, 0xe9, 0xe0, 0x70, 0x2d, 0x57, 0x33, 0xd7, 0xc0, 0x70, 0x69, 0xf9, 0x23, - 0x01, 0x81, 0x5b, 0xa5, 0x7f, 0x9c, 0xb9, 0x07, 0x72, 0x14, 0xfe, 0x29, 0xc8, 0x2d, 0x96, 0x17, - 0x36, 0x96, 0x0b, 0x47, 0xdc, 0x47, 0x8f, 0xbf, 0x29, 0xc8, 0x2d, 0x15, 0x1b, 0xc5, 0xd5, 0x82, - 0xe4, 0xd6, 0xa3, 0x52, 0x5d, 0xaa, 0x15, 0x64, 0x37, 0x71, 0xbd, 0x58, 0xad, 0x94, 0x0a, 0x59, - 0x65, 0x1a, 0x26, 0xce, 0x15, 0xd5, 0x6a, 0xa5, 0xba, 0x5c, 0xc8, 0xa1, 0xbf, 0x0d, 0xe3, 0x77, - 0x3b, 0x8f, 0xdf, 0x75, 0x51, 0x3c, 0xf5, 0x83, 0xec, 0x65, 0x3e, 0x64, 0x77, 0x72, 0x90, 0xfd, - 0xb0, 0x08, 0x91, 0x31, 0xb8, 0x33, 0xe5, 0x61, 0x62, 0xdd, 0x32, 0x5b, 0xd8, 0xb6, 0xd1, 0xaf, - 0x49, 0x90, 0x2f, 0x69, 0x46, 0x0b, 0x77, 0xd0, 0x15, 0x01, 0x54, 0xd4, 0x55, 0x34, 0xe3, 0x9f, - 0x16, 0xfb, 0xc7, 0x8c, 0x68, 0xef, 0xc7, 0xe8, 0xce, 0x53, 0x9a, 0x11, 0xf2, 0x11, 0xeb, 0xe5, - 0x62, 0x49, 0x8d, 0xe1, 0x6a, 0x1c, 0x09, 0xa6, 0xd8, 0x6a, 0xc0, 0x79, 0x1c, 0x9e, 0x87, 0x7f, - 0x3b, 0x23, 0x3a, 0x39, 0xf4, 0x6a, 0xe0, 0x93, 0x89, 0x90, 0x87, 0xd8, 0x44, 0x70, 0x10, 0xb5, - 0x31, 0x6c, 0x1e, 0x4a, 0x30, 0xbd, 0x61, 0xd8, 0xfd, 0x84, 0x22, 0x1e, 0x47, 0xdf, 0xab, 0x46, - 0x88, 0xd0, 0x81, 0xe2, 0xe8, 0x0f, 0xa6, 0x97, 0xbe, 0x60, 0xbe, 0x9d, 0x81, 0xe3, 0xcb, 0xd8, - 0xc0, 0x96, 0xde, 0xa2, 0x35, 0xf0, 0x24, 0x71, 0x27, 0x2f, 0x89, 0xc7, 0x71, 0x9c, 0xf7, 0xfb, - 0x83, 0x97, 0xc0, 0x2b, 0x7d, 0x09, 0xdc, 0xcd, 0x49, 0xe0, 0x26, 0x41, 0x3a, 0x63, 0xb8, 0x0f, - 0x7d, 0x0a, 0x66, 0xaa, 0xa6, 0xa3, 0x6f, 0xea, 0x2d, 0xea, 0x83, 0xf6, 0x12, 0x19, 0xb2, 0xab, - 0xba, 0xed, 0xa0, 0x62, 0xd0, 0x9d, 0x5c, 0x03, 0xd3, 0xba, 0xd1, 0xea, 0xec, 0xb6, 0xb1, 0x8a, - 0x35, 0xda, 0xaf, 0x4c, 0xaa, 0xe1, 0xa4, 0x60, 0x6b, 0xdf, 0x65, 0x4b, 0xf6, 0xb6, 0xf6, 0x3f, - 0x29, 0xbc, 0x0c, 0x13, 0x66, 0x81, 0x04, 0xa4, 0x8c, 0xb0, 0xbb, 0x8a, 0x30, 0x6b, 0x84, 0xb2, - 0x7a, 0x06, 0x7b, 0xef, 0x85, 0x02, 0x61, 0x72, 0x2a, 0xff, 0x07, 0x7a, 0x8f, 0x50, 0x63, 0x1d, - 0xc4, 0x50, 0x32, 0x64, 0x96, 0x86, 0x98, 0x24, 0x2b, 0x30, 0x57, 0xa9, 0x36, 0xca, 0x6a, 0xb5, - 0xb8, 0xca, 0xb2, 0xc8, 0xe8, 0xbb, 0x12, 0xe4, 0x54, 0xdc, 0xed, 0x5c, 0x0a, 0x47, 0x8c, 0x66, - 0x8e, 0xe2, 0x19, 0xdf, 0x51, 0x5c, 0x59, 0x02, 0xd0, 0x5a, 0x6e, 0xc1, 0xe4, 0x4a, 0x2d, 0xa9, - 0x6f, 0x1c, 0x53, 0xae, 0x82, 0x45, 0x3f, 0xb7, 0x1a, 0xfa, 0x13, 0x3d, 0x24, 0xbc, 0x73, 0xc4, - 0x51, 0x23, 0x1c, 0x46, 0xf4, 0x09, 0xef, 0x15, 0xda, 0xec, 0x19, 0x48, 0xee, 0x70, 0xc4, 0xff, - 0x25, 0x09, 0xb2, 0x0d, 0xb7, 0xb7, 0x0c, 0x75, 0x9c, 0x9f, 0x18, 0x4e, 0xc7, 0x5d, 0x32, 0x11, - 0x3a, 0x7e, 0x17, 0xcc, 0x84, 0x35, 0x96, 0xb9, 0x4a, 0xc4, 0xaa, 0x38, 0xf7, 0xc3, 0x30, 0x1a, - 0xde, 0x87, 0x9d, 0xc3, 0x11, 0xf1, 0xc7, 0x1e, 0x0f, 0xb0, 0x86, 0x77, 0xce, 0x63, 0xcb, 0xde, - 0xd6, 0xbb, 0xe8, 0xef, 0x64, 0x98, 0x5a, 0xc6, 0x4e, 0xdd, 0xd1, 0x9c, 0x5d, 0xbb, 0x67, 0xbb, - 0xd3, 0x30, 0x4b, 0x5a, 0x6b, 0x1b, 0xb3, 0xee, 0xc8, 0x7b, 0x45, 0xef, 0x90, 0x45, 0xfd, 0x89, - 0x82, 0x72, 0xe6, 0xfd, 0x32, 0x22, 0x30, 0x79, 0x02, 0x64, 0xdb, 0x9a, 0xa3, 0x31, 0x2c, 0xae, - 0xe8, 0xc1, 0x22, 0x20, 0xa4, 0x92, 0x6c, 0xe8, 0xb7, 0x25, 0x11, 0x87, 0x22, 0x81, 0xf2, 0x93, - 0x81, 0xf0, 0x9e, 0xcc, 0x10, 0x28, 0x1c, 0x83, 0xd9, 0x6a, 0xad, 0xd1, 0x5c, 0xad, 0x2d, 0x2f, - 0x97, 0xdd, 0xd4, 0x82, 0xac, 0x9c, 0x04, 0x65, 0xbd, 0x78, 0xdf, 0x5a, 0xb9, 0xda, 0x68, 0x56, - 0x6b, 0x8b, 0x65, 0xf6, 0x67, 0x56, 0x39, 0x0a, 0xd3, 0xa5, 0x62, 0x69, 0xc5, 0x4b, 0xc8, 0x29, - 0xa7, 0xe0, 0xf8, 0x5a, 0x79, 0x6d, 0xa1, 0xac, 0xd6, 0x57, 0x2a, 0xeb, 0x4d, 0x97, 0xcc, 0x52, - 0x6d, 0xa3, 0xba, 0x58, 0xc8, 0x2b, 0x08, 0x4e, 0x86, 0xbe, 0x9c, 0x53, 0x6b, 0xd5, 0xe5, 0x66, - 0xbd, 0x51, 0x6c, 0x94, 0x0b, 0x13, 0xca, 0x65, 0x70, 0xb4, 0x54, 0xac, 0x92, 0xec, 0xa5, 0x5a, - 0xb5, 0x5a, 0x2e, 0x35, 0x0a, 0x93, 0xe8, 0xdf, 0xb3, 0x30, 0x5d, 0xb1, 0xab, 0xda, 0x0e, 0x3e, - 0xab, 0x75, 0xf4, 0x36, 0x7a, 0x5e, 0x68, 0xe6, 0x71, 0x1d, 0xcc, 0x5a, 0xf4, 0x11, 0xb7, 0x1b, - 0x3a, 0xa6, 0x68, 0xce, 0xaa, 0x7c, 0xa2, 0x3b, 0x27, 0x37, 0x08, 0x01, 0x6f, 0x4e, 0x4e, 0xdf, - 0x94, 0x05, 0x00, 0xfa, 0xd4, 0x08, 0x2e, 0x77, 0x3d, 0xd3, 0xdb, 0x9a, 0xb4, 0x1d, 0x6c, 0x63, - 0x6b, 0x4f, 0x6f, 0x61, 0x2f, 0xa7, 0x1a, 0xfa, 0x0b, 0x7d, 0x59, 0x16, 0xdd, 0x5f, 0x0c, 0x81, - 0x1a, 0xaa, 0x4e, 0x44, 0x6f, 0xf8, 0x0b, 0xb2, 0xc8, 0xee, 0xa0, 0x10, 0xc9, 0x64, 0x9a, 0xf2, - 0x02, 0x69, 0xb8, 0x65, 0xdb, 0x46, 0xad, 0xd6, 0xac, 0xaf, 0xd4, 0xd4, 0x46, 0x41, 0x56, 0x66, - 0x60, 0xd2, 0x7d, 0x5d, 0xad, 0x55, 0x97, 0x0b, 0x59, 0xe5, 0x04, 0x1c, 0x5b, 0x29, 0xd6, 0x9b, - 0x95, 0xea, 0xd9, 0xe2, 0x6a, 0x65, 0xb1, 0x59, 0x5a, 0x29, 0xaa, 0xf5, 0x42, 0x4e, 0xb9, 0x02, - 0x4e, 0x34, 0x2a, 0x65, 0xb5, 0xb9, 0x54, 0x2e, 0x36, 0x36, 0xd4, 0x72, 0xbd, 0x59, 0xad, 0x35, - 0xab, 0xc5, 0xb5, 0x72, 0x21, 0xef, 0x36, 0x7f, 0xf2, 0x29, 0x50, 0x9b, 0x89, 0xfd, 0xca, 0x38, - 0x19, 0xa1, 0x8c, 0x53, 0xbd, 0xca, 0x08, 0x61, 0xb5, 0x52, 0xcb, 0xf5, 0xb2, 0x7a, 0xb6, 0x5c, - 0x98, 0xee, 0xa7, 0x6b, 0x33, 0xca, 0x71, 0x28, 0xb8, 0x3c, 0x34, 0x2b, 0x75, 0x2f, 0xe7, 0x62, - 0x61, 0x16, 0x7d, 0x34, 0x0f, 0x27, 0x55, 0xbc, 0xa5, 0xdb, 0x0e, 0xb6, 0xd6, 0xb5, 0x4b, 0x3b, - 0xd8, 0x70, 0xbc, 0x4e, 0xfe, 0x5f, 0x12, 0x2b, 0xe3, 0x1a, 0xcc, 0x76, 0x29, 0x8d, 0x35, 0xec, - 0x6c, 0x9b, 0x6d, 0x36, 0x0a, 0x3f, 0x2e, 0xb2, 0xe7, 0x98, 0x5f, 0x0f, 0x67, 0x57, 0xf9, 0xbf, - 0x43, 0xba, 0x2d, 0xc7, 0xe8, 0x76, 0x76, 0x18, 0xdd, 0x56, 0xae, 0x82, 0xa9, 0x5d, 0x1b, 0x5b, - 0xe5, 0x1d, 0x4d, 0xef, 0x78, 0x97, 0x73, 0xfa, 0x09, 0xe8, 0xad, 0x59, 0xd1, 0x13, 0x2b, 0xa1, - 0xba, 0xf4, 0x17, 0x63, 0x44, 0xdf, 0x7a, 0x1a, 0x80, 0x55, 0x76, 0xc3, 0xea, 0x30, 0x65, 0x0d, - 0xa5, 0xb8, 0xfc, 0x9d, 0xd7, 0x3b, 0x1d, 0xdd, 0xd8, 0xf2, 0xf7, 0xfd, 0x83, 0x04, 0xf4, 0x02, - 0x59, 0xe4, 0x04, 0x4b, 0x52, 0xde, 0x92, 0xb5, 0xa6, 0x87, 0xa4, 0x31, 0xf7, 0xbb, 0xfb, 0x9b, - 0x4e, 0x5e, 0x29, 0xc0, 0x0c, 0x49, 0x63, 0x2d, 0xb0, 0x30, 0xe1, 0xf6, 0xc1, 0x1e, 0xb9, 0xb5, - 0x72, 0x63, 0xa5, 0xb6, 0xe8, 0x7f, 0x9b, 0x74, 0x49, 0xba, 0xcc, 0x14, 0xab, 0xf7, 0x91, 0xd6, - 0x38, 0xa5, 0x3c, 0x06, 0xae, 0x08, 0x75, 0xd8, 0xc5, 0x55, 0xb5, 0x5c, 0x5c, 0xbc, 0xaf, 0x59, - 0x7e, 0x46, 0xa5, 0xde, 0xa8, 0xf3, 0x8d, 0xcb, 0x6b, 0x47, 0xd3, 0x2e, 0xbf, 0xe5, 0xb5, 0x62, - 0x65, 0x95, 0xf5, 0xef, 0x4b, 0x35, 0x75, 0xad, 0xd8, 0x28, 0xcc, 0xa0, 0x97, 0xca, 0x50, 0x58, - 0xc6, 0xce, 0xba, 0x69, 0x39, 0x5a, 0x67, 0x55, 0x37, 0x2e, 0x6c, 0x58, 0x1d, 0x6e, 0xb2, 0x29, - 0x1c, 0xa6, 0x83, 0x1f, 0x22, 0x39, 0x82, 0xd1, 0x3b, 0xe2, 0x5d, 0x92, 0x2d, 0x50, 0xa6, 0x20, - 0x01, 0x3d, 0x4b, 0x12, 0x59, 0xee, 0x16, 0x2f, 0x35, 0x99, 0x9e, 0x3c, 0x7b, 0xdc, 0xe3, 0x73, - 0x1f, 0xd4, 0xf2, 0xe8, 0xb9, 0x59, 0x98, 0x5c, 0xd2, 0x0d, 0xad, 0xa3, 0x3f, 0x93, 0x8b, 0x5f, - 0x1a, 0xf4, 0x31, 0x99, 0x98, 0x3e, 0x46, 0x1a, 0x6a, 0xfc, 0xfc, 0x15, 0x59, 0x74, 0x79, 0x21, - 0x24, 0x7b, 0x8f, 0xc9, 0x88, 0xc1, 0xf3, 0x03, 0x92, 0xc8, 0xf2, 0xc2, 0x60, 0x7a, 0xc9, 0x30, - 0xfc, 0xf8, 0xf7, 0x87, 0x8d, 0xd5, 0xd3, 0xbe, 0x27, 0xfb, 0xa9, 0xc2, 0x14, 0xfa, 0x33, 0x19, - 0xd0, 0x32, 0x76, 0xce, 0x62, 0xcb, 0x9f, 0x0a, 0x90, 0x5e, 0x9f, 0xd9, 0xdb, 0xa1, 0x26, 0xfb, - 0xc6, 0x30, 0x80, 0xe7, 0x78, 0x00, 0x8b, 0x31, 0x8d, 0x27, 0x82, 0x74, 0x44, 0xe3, 0xad, 0x40, - 0xde, 0x26, 0xdf, 0x99, 0x9a, 0x3d, 0x31, 0x7a, 0xb8, 0x24, 0xc4, 0xc2, 0xd4, 0x29, 0x61, 0x95, - 0x11, 0x40, 0xdf, 0xf1, 0x27, 0x41, 0x3f, 0xce, 0x69, 0xc7, 0xd2, 0x81, 0x99, 0x4d, 0xa6, 0x2f, - 0x56, 0xba, 0xea, 0xd2, 0xcf, 0xbe, 0x41, 0x1f, 0xc8, 0xc1, 0xf1, 0x7e, 0xd5, 0x41, 0xbf, 0x93, - 0xe1, 0x76, 0xd8, 0x31, 0x19, 0xf2, 0x33, 0x6c, 0x03, 0xd1, 0x7d, 0x51, 0x9e, 0x0c, 0x27, 0xfc, - 0x65, 0xb8, 0x86, 0x59, 0xc5, 0x17, 0xed, 0x0e, 0x76, 0x1c, 0x6c, 0x91, 0xaa, 0x4d, 0xaa, 0xfd, - 0x3f, 0x2a, 0x4f, 0x85, 0xcb, 0x75, 0xc3, 0xd6, 0xdb, 0xd8, 0x6a, 0xe8, 0x5d, 0xbb, 0x68, 0xb4, - 0x1b, 0xbb, 0x8e, 0x69, 0xe9, 0x1a, 0xbb, 0x4a, 0x72, 0x52, 0x8d, 0xfa, 0xac, 0xdc, 0x08, 0x05, - 0xdd, 0xae, 0x19, 0xe7, 0x4d, 0xcd, 0x6a, 0xeb, 0xc6, 0xd6, 0xaa, 0x6e, 0x3b, 0xcc, 0x03, 0x78, - 0x5f, 0x3a, 0xfa, 0x7b, 0x59, 0xf4, 0x30, 0xdd, 0x00, 0x58, 0x23, 0x3a, 0x94, 0x9f, 0x97, 0x45, - 0x8e, 0xc7, 0x25, 0xa3, 0x9d, 0x4c, 0x59, 0x9e, 0x33, 0x6e, 0x43, 0xa2, 0xff, 0x08, 0x4e, 0xba, - 0x16, 0x9a, 0xee, 0x19, 0x02, 0x67, 0xcb, 0x6a, 0x65, 0xa9, 0x52, 0x76, 0xcd, 0x8a, 0x13, 0x70, - 0x2c, 0xf8, 0xb6, 0x78, 0x5f, 0xb3, 0x5e, 0xae, 0x36, 0x0a, 0x93, 0x6e, 0x3f, 0x45, 0x93, 0x97, - 0x8a, 0x95, 0xd5, 0xf2, 0x62, 0xb3, 0x51, 0x73, 0xbf, 0x2c, 0x0e, 0x67, 0x5a, 0xa0, 0x07, 0xb3, - 0x70, 0x94, 0xc8, 0xf6, 0x12, 0x91, 0xaa, 0x2b, 0x94, 0x1e, 0x5f, 0x5b, 0x1f, 0xa0, 0x29, 0x2a, - 0x5e, 0xf4, 0x69, 0xe1, 0x9b, 0x32, 0x43, 0x10, 0xf6, 0x94, 0x11, 0xa1, 0x19, 0xdf, 0x96, 0x44, - 0x22, 0x54, 0x08, 0x93, 0x4d, 0xa6, 0x14, 0xff, 0x3a, 0xee, 0x11, 0x27, 0x1a, 0x7c, 0x62, 0x65, - 0x96, 0xc8, 0xcf, 0xcf, 0x58, 0xaf, 0xa8, 0x44, 0x1d, 0xe6, 0x00, 0x48, 0x0a, 0xd1, 0x20, 0xaa, - 0x07, 0x7d, 0xc7, 0xab, 0x28, 0x3d, 0x28, 0x96, 0x1a, 0x95, 0xb3, 0xe5, 0x28, 0x3d, 0xf8, 0x94, - 0x0c, 0x93, 0xcb, 0xd8, 0x71, 0xe7, 0x54, 0x36, 0x7a, 0x9a, 0xc0, 0xfa, 0x8f, 0x6b, 0xc6, 0x74, - 0xcc, 0x96, 0xd6, 0xf1, 0x97, 0x01, 0xe8, 0x1b, 0xfa, 0xb9, 0x61, 0x4c, 0x10, 0xaf, 0xe8, 0x88, - 0xf1, 0xea, 0x47, 0x21, 0xe7, 0xb8, 0x9f, 0xd9, 0x32, 0xf4, 0x0f, 0x45, 0x0e, 0x57, 0x2e, 0x91, - 0x45, 0xcd, 0xd1, 0x54, 0x9a, 0x3f, 0x34, 0x3a, 0x09, 0xda, 0x2e, 0x11, 0x8c, 0x7c, 0x3f, 0xda, - 0x9f, 0x7f, 0x2b, 0xc3, 0x09, 0xda, 0x3e, 0x8a, 0xdd, 0x6e, 0xdd, 0x31, 0x2d, 0xac, 0xe2, 0x16, - 0xd6, 0xbb, 0x4e, 0xcf, 0xfa, 0x9e, 0x45, 0x53, 0xbd, 0xcd, 0x66, 0xf6, 0x8a, 0x5e, 0x27, 0x8b, - 0xc6, 0x60, 0xde, 0xd7, 0x1e, 0x7b, 0xca, 0x8b, 0x68, 0xec, 0x1f, 0x91, 0x44, 0xa2, 0x2a, 0x27, - 0x24, 0x9e, 0x0c, 0xa8, 0x0f, 0x1e, 0x02, 0x50, 0xde, 0xca, 0x8d, 0x5a, 0x2e, 0x95, 0x2b, 0xeb, - 0xee, 0x20, 0x70, 0x35, 0x5c, 0xb9, 0xbe, 0xa1, 0x96, 0x56, 0x8a, 0xf5, 0x72, 0x53, 0x2d, 0x2f, - 0x57, 0xea, 0x0d, 0xe6, 0x94, 0x45, 0xff, 0x9a, 0x50, 0xae, 0x82, 0x53, 0xf5, 0x8d, 0x85, 0x7a, - 0x49, 0xad, 0xac, 0x93, 0x74, 0xb5, 0x5c, 0x2d, 0x9f, 0x63, 0x5f, 0x27, 0xd1, 0xfb, 0x0a, 0x30, - 0xed, 0x4e, 0x00, 0xea, 0x74, 0x5e, 0x80, 0xbe, 0x91, 0x85, 0x69, 0x15, 0xdb, 0x66, 0x67, 0x8f, - 0xcc, 0x11, 0xc6, 0x35, 0xf5, 0xf8, 0x96, 0x2c, 0x7a, 0x7e, 0x3b, 0xc4, 0xec, 0x7c, 0x88, 0xd1, - 0xe8, 0x89, 0xa6, 0xb6, 0xa7, 0xe9, 0x1d, 0xed, 0x3c, 0xeb, 0x6a, 0x26, 0xd5, 0x20, 0x41, 0x99, - 0x07, 0xc5, 0xbc, 0x68, 0x60, 0xab, 0xde, 0xba, 0x58, 0x76, 0xb6, 0x8b, 0xed, 0xb6, 0x85, 0x6d, - 0x9b, 0xad, 0x5e, 0xf4, 0xf9, 0xa2, 0xdc, 0x00, 0x47, 0x49, 0x6a, 0x28, 0x33, 0x75, 0x90, 0xe9, - 0x4d, 0xf6, 0x73, 0x16, 0x8d, 0x4b, 0x5e, 0xce, 0x5c, 0x28, 0x67, 0x90, 0x1c, 0x3e, 0x2e, 0x91, - 0xe7, 0x4f, 0xe9, 0x5c, 0x03, 0xd3, 0x86, 0xb6, 0x83, 0xcb, 0x0f, 0x74, 0x75, 0x0b, 0xdb, 0xc4, - 0x31, 0x46, 0x56, 0xc3, 0x49, 0xe8, 0x03, 0x42, 0xe7, 0xcd, 0xc5, 0x24, 0x96, 0x4c, 0xf7, 0x97, - 0x87, 0x50, 0xfd, 0x3e, 0xfd, 0x8c, 0x8c, 0xde, 0x27, 0xc3, 0x0c, 0x63, 0xaa, 0x68, 0x5c, 0xaa, - 0xb4, 0xd1, 0xd5, 0x9c, 0xf1, 0xab, 0xb9, 0x69, 0x9e, 0xf1, 0x4b, 0x5e, 0xd0, 0x2f, 0xca, 0xa2, - 0xee, 0xce, 0x7d, 0x2a, 0x4e, 0xca, 0x88, 0x76, 0x1c, 0xdd, 0x34, 0x77, 0x99, 0xa3, 0xea, 0xa4, - 0x4a, 0x5f, 0xd2, 0x5c, 0xd4, 0x43, 0xbf, 0x2f, 0xe4, 0x4c, 0x2d, 0x58, 0x8d, 0x43, 0x02, 0xf0, - 0x63, 0x32, 0xcc, 0x31, 0xae, 0xea, 0xec, 0x9c, 0x8f, 0xd0, 0x81, 0xb7, 0x5f, 0x12, 0x36, 0x04, - 0xfb, 0xd4, 0x9f, 0x95, 0xf4, 0xa8, 0x01, 0xf2, 0x43, 0x42, 0xc1, 0xd1, 0x84, 0x2b, 0x72, 0x48, - 0x50, 0xbe, 0x2d, 0x0b, 0xd3, 0x1b, 0x36, 0xb6, 0x98, 0xdf, 0x3e, 0x7a, 0x38, 0x0b, 0xf2, 0x32, - 0xe6, 0x36, 0x52, 0x9f, 0x2f, 0xec, 0xe1, 0x1b, 0xae, 0x6c, 0x88, 0xa8, 0x6b, 0x23, 0x45, 0xc0, - 0x76, 0x3d, 0xcc, 0x51, 0x91, 0x16, 0x1d, 0xc7, 0x35, 0x12, 0x3d, 0x6f, 0xda, 0x9e, 0xd4, 0x51, - 0x6c, 0x15, 0x91, 0xb2, 0xdc, 0x2c, 0x25, 0x97, 0xa7, 0x55, 0xbc, 0x49, 0xe7, 0xb3, 0x59, 0xb5, - 0x27, 0x55, 0xb9, 0x05, 0x2e, 0x33, 0xbb, 0x98, 0x9e, 0x5f, 0x09, 0x65, 0xce, 0x91, 0xcc, 0xfd, - 0x3e, 0xa1, 0x6f, 0x08, 0xf9, 0xea, 0x8a, 0x4b, 0x27, 0x99, 0x2e, 0x74, 0x47, 0x63, 0x92, 0x1c, - 0x87, 0x82, 0x9b, 0x83, 0xec, 0xbf, 0xa8, 0xe5, 0x7a, 0x6d, 0xf5, 0x6c, 0xb9, 0xff, 0x32, 0x46, - 0x0e, 0x3d, 0x47, 0x86, 0xa9, 0x05, 0xcb, 0xd4, 0xda, 0x2d, 0xcd, 0x76, 0xd0, 0x77, 0x24, 0x98, - 0x59, 0xd7, 0x2e, 0x75, 0x4c, 0xad, 0x4d, 0xfc, 0xfb, 0x7b, 0xfa, 0x82, 0x2e, 0xfd, 0xe4, 0xf5, - 0x05, 0xec, 0x95, 0x3f, 0x18, 0xe8, 0x1f, 0xdd, 0xcb, 0x88, 0x5c, 0xa8, 0xe9, 0x6f, 0xf3, 0x49, - 0xfd, 0x82, 0x95, 0x7a, 0x7c, 0xcd, 0x87, 0x79, 0x8a, 0xb0, 0x28, 0xdf, 0x27, 0x16, 0x7e, 0x54, - 0x84, 0xe4, 0xe1, 0xec, 0xca, 0x3f, 0x77, 0x12, 0xf2, 0x8b, 0x98, 0x58, 0x71, 0xff, 0x5d, 0x82, - 0x89, 0x3a, 0x76, 0x88, 0x05, 0x77, 0x1b, 0xe7, 0x29, 0xdc, 0x26, 0x19, 0x02, 0x27, 0x76, 0xef, - 0xdd, 0x9d, 0xac, 0x87, 0xce, 0x5b, 0x93, 0xe7, 0x04, 0x1e, 0x89, 0xb4, 0xdc, 0x79, 0x56, 0xe6, - 0x81, 0x3c, 0x12, 0x63, 0x49, 0xa5, 0xef, 0x6b, 0xf5, 0x0e, 0x89, 0xb9, 0x56, 0x85, 0x7a, 0xbd, - 0x57, 0x85, 0xf5, 0x33, 0xd6, 0xdb, 0x8c, 0x31, 0x1f, 0xe3, 0x1c, 0xf5, 0x24, 0x98, 0xa0, 0x32, - 0xf7, 0xe6, 0xa3, 0xbd, 0x7e, 0x0a, 0x94, 0x04, 0x39, 0x7b, 0xed, 0xe5, 0x14, 0x74, 0x51, 0x8b, - 0x2e, 0x7c, 0x2c, 0x31, 0x08, 0x66, 0xaa, 0xd8, 0xb9, 0x68, 0x5a, 0x17, 0xea, 0x8e, 0xe6, 0x60, - 0xf4, 0xaf, 0x12, 0xc8, 0x75, 0xec, 0x84, 0xa3, 0x9f, 0x54, 0xe1, 0x18, 0xad, 0x10, 0xcb, 0x48, - 0xfa, 0x6f, 0x5a, 0x91, 0x6b, 0xfa, 0x0a, 0x21, 0x94, 0x4f, 0xdd, 0xff, 0x2b, 0xfa, 0xb5, 0xbe, - 0x41, 0x9f, 0xa4, 0x3e, 0x93, 0x06, 0x26, 0x99, 0x30, 0x83, 0xae, 0x82, 0x45, 0xe8, 0xe9, 0xfb, - 0x85, 0xcc, 0x6a, 0x31, 0x9a, 0x87, 0xd3, 0x15, 0x7c, 0xe8, 0x0a, 0xc8, 0x96, 0xb6, 0x35, 0x07, - 0xbd, 0x5d, 0x06, 0x28, 0xb6, 0xdb, 0x6b, 0xd4, 0x07, 0x3c, 0xec, 0x90, 0x76, 0x06, 0x66, 0x5a, - 0xdb, 0x5a, 0x70, 0xb7, 0x09, 0xed, 0x0f, 0xb8, 0x34, 0xe5, 0xc9, 0x81, 0x33, 0x39, 0x95, 0x2a, - 0xea, 0x81, 0xc9, 0x2d, 0x83, 0xd1, 0xf6, 0x1d, 0xcd, 0xf9, 0x50, 0x98, 0xb1, 0x47, 0xe8, 0xdc, - 0xdf, 0xe7, 0x03, 0xf6, 0xa2, 0xe7, 0x70, 0x8c, 0xb4, 0x7f, 0xc0, 0x26, 0x48, 0x48, 0x78, 0xd2, - 0x5b, 0x2c, 0xa0, 0x47, 0x3c, 0x5f, 0x63, 0x09, 0x5d, 0xab, 0x94, 0xdb, 0xba, 0x27, 0x5a, 0x16, - 0x30, 0x0b, 0x3d, 0x94, 0x49, 0x06, 0x5f, 0xbc, 0xe0, 0xee, 0x86, 0x59, 0xdc, 0xd6, 0x1d, 0xec, - 0xd5, 0x92, 0x09, 0x30, 0x0e, 0x62, 0xfe, 0x07, 0xf4, 0x6c, 0xe1, 0xa0, 0x6b, 0x44, 0xa0, 0xfb, - 0x6b, 0x14, 0xd1, 0xfe, 0xc4, 0xc2, 0xa8, 0x89, 0xd1, 0x4c, 0x1f, 0xac, 0x9f, 0x93, 0xe1, 0x44, - 0xc3, 0xdc, 0xda, 0xea, 0x60, 0x4f, 0x4c, 0x98, 0x7a, 0x67, 0x22, 0x6d, 0x94, 0x70, 0x91, 0x9d, - 0x20, 0xf3, 0x7e, 0xdd, 0x3f, 0x4a, 0xe6, 0xbe, 0xf0, 0x27, 0xa6, 0x62, 0x67, 0x51, 0x44, 0x5c, - 0x7d, 0xf9, 0x8c, 0x40, 0x41, 0x2c, 0xe0, 0xb3, 0x30, 0xd9, 0xf4, 0x81, 0xf8, 0xbc, 0x04, 0xb3, - 0xf4, 0xe6, 0x4a, 0x4f, 0x41, 0xef, 0x1d, 0x21, 0x00, 0xe8, 0x3b, 0x19, 0x51, 0x3f, 0x5b, 0x22, - 0x13, 0x8e, 0x93, 0x08, 0x11, 0x8b, 0x05, 0x55, 0x19, 0x48, 0x2e, 0x7d, 0xd1, 0xfe, 0xb1, 0x0c, - 0xd3, 0xcb, 0xd8, 0x6b, 0x69, 0x76, 0xe2, 0x9e, 0xe8, 0x0c, 0xcc, 0x90, 0xeb, 0xdb, 0x6a, 0xec, - 0x98, 0x24, 0x5d, 0x35, 0xe3, 0xd2, 0x94, 0xeb, 0x60, 0xf6, 0x3c, 0xde, 0x34, 0x2d, 0x5c, 0xe3, - 0xce, 0x52, 0xf2, 0x89, 0x11, 0xe1, 0xe9, 0xb8, 0x38, 0x68, 0x0b, 0x3c, 0x36, 0x37, 0xed, 0x17, - 0x66, 0xa8, 0x2a, 0x11, 0x63, 0xce, 0x53, 0x60, 0x92, 0x21, 0xef, 0x99, 0x69, 0x71, 0xfd, 0xa2, - 0x9f, 0x17, 0xbd, 0xd6, 0x47, 0xb4, 0xcc, 0x21, 0xfa, 0xc4, 0x24, 0x4c, 0x8c, 0xe5, 0x7e, 0xf7, - 0x42, 0xa8, 0xfc, 0x85, 0x4b, 0x95, 0xb6, 0x8d, 0xd6, 0x92, 0x61, 0x7a, 0x1a, 0xc0, 0x6f, 0x1c, - 0x5e, 0x58, 0x8b, 0x50, 0x0a, 0x1f, 0xb9, 0x3e, 0xf6, 0xa0, 0x5e, 0xaf, 0x38, 0x08, 0x3b, 0x23, - 0x06, 0x46, 0xec, 0x80, 0x9f, 0x08, 0x27, 0xe9, 0xa3, 0xf3, 0x49, 0x19, 0x4e, 0xf8, 0xe7, 0x8f, - 0x56, 0x35, 0x3b, 0x68, 0x77, 0xa5, 0x64, 0x10, 0x71, 0x07, 0x3e, 0xfc, 0xc6, 0xf2, 0xcd, 0x64, - 0x63, 0x46, 0x5f, 0x4e, 0x46, 0x8b, 0x8e, 0x72, 0x13, 0x1c, 0x33, 0x76, 0x77, 0x7c, 0xa9, 0x93, - 0x16, 0xcf, 0x5a, 0xf8, 0xfe, 0x0f, 0x49, 0x46, 0x26, 0x11, 0xe6, 0xc7, 0x32, 0xa7, 0xe4, 0x8e, - 0x74, 0x3d, 0x21, 0x11, 0x8c, 0xe8, 0x9f, 0x33, 0x89, 0x7a, 0xb7, 0xc1, 0x67, 0xbe, 0x12, 0xf4, - 0x52, 0x87, 0x78, 0xe0, 0xeb, 0xcc, 0x04, 0xe4, 0xca, 0x3b, 0x5d, 0xe7, 0xd2, 0x99, 0xc7, 0xc2, - 0x6c, 0xdd, 0xb1, 0xb0, 0xb6, 0x13, 0xda, 0x19, 0x70, 0xcc, 0x0b, 0xd8, 0xf0, 0x76, 0x06, 0xc8, - 0xcb, 0xed, 0xb7, 0xc1, 0x84, 0x61, 0x36, 0xb5, 0x5d, 0x67, 0x5b, 0xb9, 0x7a, 0xdf, 0x91, 0x7a, - 0x06, 0x7e, 0x8d, 0xc5, 0x30, 0xfa, 0xf2, 0x1d, 0x64, 0x6d, 0x38, 0x6f, 0x98, 0xc5, 0x5d, 0x67, - 0x7b, 0xe1, 0xaa, 0x8f, 0xfd, 0xcd, 0xe9, 0xcc, 0xa7, 0xfe, 0xe6, 0x74, 0xe6, 0x4b, 0x7f, 0x73, - 0x3a, 0xf3, 0x4b, 0x5f, 0x39, 0x7d, 0xe4, 0x53, 0x5f, 0x39, 0x7d, 0xe4, 0xf3, 0x5f, 0x39, 0x7d, - 0xe4, 0xc7, 0xa5, 0xee, 0xf9, 0xf3, 0x79, 0x42, 0xe5, 0x49, 0xff, 0x7f, 0x00, 0x00, 0x00, 0xff, - 0xff, 0xd9, 0x46, 0xa2, 0x63, 0x08, 0x08, 0x02, 0x00, + // 19597 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0xfd, 0x7d, 0x9c, 0x23, 0x47, + 0x75, 0x2f, 0x8c, 0xaf, 0xba, 0x25, 0xcd, 0xcc, 0x99, 0x97, 0xd5, 0xb6, 0x77, 0xd7, 0xeb, 0xb2, + 0x59, 0x3b, 0x6b, 0x63, 0x1c, 0x63, 0xc6, 0xc6, 0x10, 0x82, 0x8d, 0x8d, 0xad, 0xd1, 0x68, 0x66, + 0x64, 0xcf, 0x48, 0x93, 0x96, 0x66, 0x17, 0x27, 0x37, 0x3f, 0xdd, 0x5e, 0xa9, 0x66, 0xa6, 0xbd, + 0x9a, 0x6e, 0xa5, 0xbb, 0x67, 0xd6, 0xcb, 0xef, 0x73, 0x9f, 0x1b, 0x42, 0x1c, 0x48, 0x88, 0x2f, + 0x49, 0x08, 0x49, 0x78, 0x07, 0x83, 0xe1, 0x42, 0x02, 0x84, 0xf7, 0x0b, 0x49, 0x80, 0xf0, 0x1e, + 0x42, 0x08, 0x81, 0x10, 0x08, 0x09, 0x4f, 0x20, 0x10, 0x42, 0xee, 0x27, 0x5c, 0x9e, 0xe4, 0xb9, + 0x81, 0x90, 0xc0, 0xc3, 0xf3, 0xe9, 0xaa, 0xea, 0x97, 0xd2, 0xa8, 0x5b, 0xd5, 0x1a, 0xb5, 0xc6, + 0x84, 0xe7, 0xbf, 0xee, 0xea, 0xea, 0x53, 0xa7, 0xce, 0xf7, 0x54, 0xd5, 0xa9, 0xaa, 0x53, 0xa7, + 0xe0, 0x54, 0xf7, 0xfc, 0xcd, 0x5d, 0xcb, 0x74, 0x4c, 0xfb, 0xe6, 0x96, 0xb9, 0xb3, 0xa3, 0x19, + 0x6d, 0x7b, 0x9e, 0xbc, 0x2b, 0x13, 0x9a, 0x71, 0xc9, 0xb9, 0xd4, 0xc5, 0xe8, 0xba, 0xee, 0x85, + 0xad, 0x9b, 0x3b, 0xfa, 0xf9, 0x9b, 0xbb, 0xe7, 0x6f, 0xde, 0x31, 0xdb, 0xb8, 0xe3, 0xfd, 0x40, + 0x5e, 0x58, 0x76, 0x74, 0x43, 0x54, 0xae, 0x8e, 0xd9, 0xd2, 0x3a, 0xb6, 0x63, 0x5a, 0x98, 0xe5, + 0x3c, 0x19, 0x14, 0x89, 0xf7, 0xb0, 0xe1, 0x78, 0x14, 0xae, 0xda, 0x32, 0xcd, 0xad, 0x0e, 0xa6, + 0xdf, 0xce, 0xef, 0x6e, 0xde, 0x6c, 0x3b, 0xd6, 0x6e, 0xcb, 0x61, 0x5f, 0xaf, 0xe9, 0xfd, 0xda, + 0xc6, 0x76, 0xcb, 0xd2, 0xbb, 0x8e, 0x69, 0xd1, 0x1c, 0x67, 0x3e, 0xf2, 0xd0, 0x24, 0xc8, 0x6a, + 0xb7, 0x85, 0xbe, 0x35, 0x01, 0x72, 0xb1, 0xdb, 0x45, 0x1f, 0x96, 0x00, 0x96, 0xb1, 0x73, 0x16, + 0x5b, 0xb6, 0x6e, 0x1a, 0xe8, 0x28, 0x4c, 0xa8, 0xf8, 0x67, 0x76, 0xb1, 0xed, 0xdc, 0x9e, 0x7d, + 0xee, 0xd7, 0xe4, 0x0c, 0x7a, 0x44, 0x82, 0x49, 0x15, 0xdb, 0x5d, 0xd3, 0xb0, 0xb1, 0x72, 0x37, + 0xe4, 0xb0, 0x65, 0x99, 0xd6, 0xa9, 0xcc, 0x35, 0x99, 0x1b, 0xa6, 0x6f, 0xbd, 0x71, 0x9e, 0x55, + 0x7f, 0x5e, 0xed, 0xb6, 0xe6, 0x8b, 0xdd, 0xee, 0x7c, 0x40, 0x69, 0xde, 0xfb, 0x69, 0xbe, 0xec, + 0xfe, 0xa1, 0xd2, 0x1f, 0x95, 0x53, 0x30, 0xb1, 0x47, 0x33, 0x9c, 0x92, 0xae, 0xc9, 0xdc, 0x30, + 0xa5, 0x7a, 0xaf, 0xee, 0x97, 0x36, 0x76, 0x34, 0xbd, 0x63, 0x9f, 0x92, 0xe9, 0x17, 0xf6, 0x8a, + 0x1e, 0xce, 0x40, 0x8e, 0x10, 0x51, 0x4a, 0x90, 0x6d, 0x99, 0x6d, 0x4c, 0x8a, 0x9f, 0xbb, 0xf5, + 0x66, 0xf1, 0xe2, 0xe7, 0x4b, 0x66, 0x1b, 0xab, 0xe4, 0x67, 0xe5, 0x1a, 0x98, 0xf6, 0xc4, 0x12, + 0xb0, 0x11, 0x4e, 0x3a, 0x73, 0x2b, 0x64, 0xdd, 0xfc, 0xca, 0x24, 0x64, 0xab, 0x1b, 0xab, 0xab, + 0x85, 0x23, 0xca, 0x31, 0x98, 0xdd, 0xa8, 0xde, 0x5b, 0xad, 0x9d, 0xab, 0x36, 0xcb, 0xaa, 0x5a, + 0x53, 0x0b, 0x19, 0x65, 0x16, 0xa6, 0x16, 0x8a, 0x8b, 0xcd, 0x4a, 0x75, 0x7d, 0xa3, 0x51, 0x90, + 0xd0, 0xcb, 0x65, 0x98, 0xab, 0x63, 0x67, 0x11, 0xef, 0xe9, 0x2d, 0x5c, 0x77, 0x34, 0x07, 0xa3, + 0xe7, 0x67, 0x7c, 0x61, 0x2a, 0x1b, 0x6e, 0xa1, 0xfe, 0x27, 0x56, 0x81, 0x27, 0xed, 0xab, 0x00, + 0x4f, 0x61, 0x9e, 0xfd, 0x3d, 0x1f, 0x4a, 0x53, 0xc3, 0x74, 0xce, 0x3c, 0x01, 0xa6, 0x43, 0xdf, + 0x94, 0x39, 0x80, 0x85, 0x62, 0xe9, 0xde, 0x65, 0xb5, 0xb6, 0x51, 0x5d, 0x2c, 0x1c, 0x71, 0xdf, + 0x97, 0x6a, 0x6a, 0x99, 0xbd, 0x67, 0xd0, 0x77, 0x32, 0x21, 0x30, 0x17, 0x79, 0x30, 0xe7, 0x07, + 0x33, 0xd3, 0x07, 0x50, 0xf4, 0x5a, 0x1f, 0x9c, 0x65, 0x0e, 0x9c, 0x27, 0x25, 0x23, 0x97, 0x3e, + 0x40, 0x0f, 0x4a, 0x30, 0x59, 0xdf, 0xde, 0x75, 0xda, 0xe6, 0x45, 0x03, 0x4d, 0xf9, 0xc8, 0xa0, + 0x6f, 0x84, 0x65, 0xf2, 0x74, 0x5e, 0x26, 0x37, 0xec, 0xaf, 0x04, 0xa3, 0x10, 0x21, 0x8d, 0x57, + 0xfa, 0xd2, 0x28, 0x72, 0xd2, 0x78, 0x82, 0x28, 0xa1, 0xf4, 0xe5, 0xf0, 0xe2, 0xa7, 0x42, 0xae, + 0xde, 0xd5, 0x5a, 0x18, 0x7d, 0x42, 0x86, 0x99, 0x55, 0xac, 0xed, 0xe1, 0x62, 0xb7, 0x6b, 0x99, + 0x7b, 0x18, 0x95, 0x02, 0x7d, 0x3d, 0x05, 0x13, 0xb6, 0x9b, 0xa9, 0xd2, 0x26, 0x35, 0x98, 0x52, + 0xbd, 0x57, 0xe5, 0x34, 0x80, 0xde, 0xc6, 0x86, 0xa3, 0x3b, 0x3a, 0xb6, 0x4f, 0x49, 0xd7, 0xc8, + 0x37, 0x4c, 0xa9, 0xa1, 0x14, 0xf4, 0x2d, 0x49, 0x54, 0xc7, 0x08, 0x17, 0xf3, 0x61, 0x0e, 0x22, + 0xa4, 0xfa, 0x6a, 0x49, 0x44, 0xc7, 0x06, 0x92, 0x4b, 0x26, 0xdb, 0x37, 0x65, 0x92, 0x0b, 0xd7, + 0xcd, 0x51, 0xad, 0x35, 0xeb, 0x1b, 0xa5, 0x95, 0x66, 0x7d, 0xbd, 0x58, 0x2a, 0x17, 0xb0, 0x72, + 0x1c, 0x0a, 0xe4, 0xb1, 0x59, 0xa9, 0x37, 0x17, 0xcb, 0xab, 0xe5, 0x46, 0x79, 0xb1, 0xb0, 0xa9, + 0x28, 0x30, 0xa7, 0x96, 0x7f, 0x62, 0xa3, 0x5c, 0x6f, 0x34, 0x97, 0x8a, 0x95, 0xd5, 0xf2, 0x62, + 0x61, 0xcb, 0xfd, 0x79, 0xb5, 0xb2, 0x56, 0x69, 0x34, 0xd5, 0x72, 0xb1, 0xb4, 0x52, 0x5e, 0x2c, + 0x6c, 0x2b, 0x97, 0xc3, 0x65, 0xd5, 0x5a, 0xb3, 0xb8, 0xbe, 0xae, 0xd6, 0xce, 0x96, 0x9b, 0xec, + 0x8f, 0x7a, 0x41, 0xa7, 0x05, 0x35, 0x9a, 0xf5, 0x95, 0xa2, 0x5a, 0x2e, 0x2e, 0xac, 0x96, 0x0b, + 0xf7, 0xa3, 0x67, 0xcb, 0x30, 0xbb, 0xa6, 0x5d, 0xc0, 0xf5, 0x6d, 0xcd, 0xc2, 0xda, 0xf9, 0x0e, + 0x46, 0xd7, 0x0a, 0xe0, 0x89, 0x3e, 0x11, 0xc6, 0xab, 0xcc, 0xe3, 0x75, 0x73, 0x1f, 0x01, 0x73, + 0x45, 0x44, 0x00, 0xf6, 0xaf, 0x7e, 0x33, 0x58, 0xe1, 0x00, 0x7b, 0x72, 0x42, 0x7a, 0xc9, 0x10, + 0xfb, 0xb9, 0x47, 0x01, 0x62, 0xe8, 0x8b, 0x32, 0xcc, 0x55, 0x8c, 0x3d, 0xdd, 0xc1, 0xcb, 0xd8, + 0xc0, 0x96, 0x3b, 0x0e, 0x08, 0xc1, 0xf0, 0x88, 0x1c, 0x82, 0x61, 0x89, 0x87, 0xe1, 0x96, 0x3e, + 0x62, 0xe3, 0xcb, 0x88, 0x18, 0x6d, 0xaf, 0x82, 0x29, 0x9d, 0xe4, 0x2b, 0xe9, 0x6d, 0x26, 0xb1, + 0x20, 0x41, 0xb9, 0x0e, 0x66, 0xe9, 0xcb, 0x92, 0xde, 0xc1, 0xf7, 0xe2, 0x4b, 0x6c, 0xdc, 0xe5, + 0x13, 0xd1, 0x2f, 0xfb, 0x8d, 0xaf, 0xc2, 0x61, 0xf9, 0x63, 0x49, 0x99, 0x4a, 0x06, 0xe6, 0x0b, + 0x1f, 0x0d, 0xcd, 0x6f, 0x5f, 0x2b, 0xd3, 0xd1, 0xf7, 0x24, 0x98, 0xae, 0x3b, 0x66, 0xd7, 0x55, + 0x59, 0xdd, 0xd8, 0x12, 0x03, 0xf7, 0x63, 0xe1, 0x36, 0x56, 0xe2, 0xc1, 0x7d, 0x42, 0x1f, 0x39, + 0x86, 0x0a, 0x88, 0x68, 0x61, 0xdf, 0xf2, 0x5b, 0xd8, 0x12, 0x87, 0xca, 0xad, 0x89, 0xa8, 0xfd, + 0x00, 0xb6, 0xaf, 0x17, 0xca, 0x50, 0xf0, 0xd4, 0xcc, 0x29, 0xed, 0x5a, 0x16, 0x36, 0x1c, 0x31, + 0x10, 0xfe, 0x2a, 0x0c, 0xc2, 0x0a, 0x0f, 0xc2, 0xad, 0x31, 0xca, 0xec, 0x95, 0x92, 0x62, 0x1b, + 0x7b, 0xbf, 0x8f, 0xe6, 0xbd, 0x1c, 0x9a, 0x3f, 0x9e, 0x9c, 0xad, 0x64, 0x90, 0xae, 0x0c, 0x81, + 0xe8, 0x71, 0x28, 0xb8, 0x63, 0x52, 0xa9, 0x51, 0x39, 0x5b, 0x6e, 0x56, 0xaa, 0x67, 0x2b, 0x8d, + 0x72, 0x01, 0xa3, 0x17, 0xc8, 0x30, 0x43, 0x59, 0x53, 0xf1, 0x9e, 0x79, 0x41, 0xb0, 0xd7, 0xfb, + 0x62, 0x42, 0x63, 0x21, 0x5c, 0x42, 0x44, 0xcb, 0xf8, 0xa5, 0x04, 0xc6, 0x42, 0x0c, 0xb9, 0x47, + 0x53, 0x6f, 0xb5, 0xaf, 0x19, 0x6c, 0xf5, 0x69, 0x2d, 0x7d, 0x7b, 0xab, 0x17, 0x66, 0x01, 0x68, + 0x25, 0xcf, 0xea, 0xf8, 0x22, 0x5a, 0x0b, 0x30, 0xe1, 0xd4, 0x36, 0x33, 0x50, 0x6d, 0xa5, 0x7e, + 0x6a, 0xfb, 0xae, 0xf0, 0x98, 0xb5, 0xc0, 0xa3, 0x77, 0x53, 0xa4, 0xb8, 0x5d, 0x4e, 0xa2, 0x67, + 0x87, 0x9e, 0xa2, 0x48, 0xbc, 0xd5, 0x79, 0x15, 0x4c, 0x91, 0xc7, 0xaa, 0xb6, 0x83, 0x59, 0x1b, + 0x0a, 0x12, 0x94, 0x33, 0x30, 0x43, 0x33, 0xb6, 0x4c, 0xc3, 0xad, 0x4f, 0x96, 0x64, 0xe0, 0xd2, + 0x5c, 0x10, 0x5b, 0x16, 0xd6, 0x1c, 0xd3, 0x22, 0x34, 0x72, 0x14, 0xc4, 0x50, 0x12, 0xfa, 0xba, + 0xdf, 0x0a, 0xcb, 0x9c, 0xe6, 0x3c, 0x31, 0x49, 0x55, 0x92, 0xe9, 0xcd, 0xde, 0x70, 0xed, 0x8f, + 0xb6, 0xba, 0xa6, 0x8b, 0xf6, 0x12, 0x99, 0xda, 0x61, 0xe5, 0x24, 0x28, 0x2c, 0xd5, 0xcd, 0x5b, + 0xaa, 0x55, 0x1b, 0xe5, 0x6a, 0xa3, 0xb0, 0xd9, 0x57, 0xa3, 0xb6, 0xd0, 0xab, 0xb3, 0x90, 0xbd, + 0xc7, 0xd4, 0x0d, 0xf4, 0x60, 0x86, 0x53, 0x09, 0x03, 0x3b, 0x17, 0x4d, 0xeb, 0x82, 0xdf, 0x50, + 0x83, 0x84, 0x78, 0x6c, 0x02, 0x55, 0x92, 0x07, 0xaa, 0x52, 0xb6, 0x9f, 0x2a, 0xfd, 0x5a, 0x58, + 0x95, 0xee, 0xe0, 0x55, 0xe9, 0xfa, 0x3e, 0xf2, 0x77, 0x99, 0x8f, 0xe8, 0x00, 0x3e, 0xea, 0x77, + 0x00, 0x77, 0x71, 0x30, 0x3e, 0x5e, 0x8c, 0x4c, 0x32, 0x00, 0xbf, 0x90, 0x6a, 0xc3, 0xef, 0x07, + 0xf5, 0x56, 0x04, 0xd4, 0xdb, 0x7d, 0xfa, 0x04, 0x7d, 0x7f, 0xd7, 0x71, 0xff, 0xfe, 0x6e, 0xe2, + 0x82, 0x72, 0x02, 0x8e, 0x2d, 0x56, 0x96, 0x96, 0xca, 0x6a, 0xb9, 0xda, 0x68, 0x56, 0xcb, 0x8d, + 0x73, 0x35, 0xf5, 0xde, 0x42, 0x07, 0x3d, 0x2c, 0x03, 0xb8, 0x12, 0x2a, 0x69, 0x46, 0x0b, 0x77, + 0xc4, 0x7a, 0xf4, 0xff, 0x25, 0x25, 0xeb, 0x13, 0x02, 0xfa, 0x11, 0x70, 0xbe, 0x4c, 0x12, 0x6f, + 0x95, 0x91, 0xc4, 0x92, 0x81, 0xfa, 0x86, 0x47, 0x83, 0xed, 0x79, 0x19, 0x1c, 0xf5, 0xe8, 0xb1, + 0xec, 0xfd, 0xa7, 0x7d, 0x6f, 0xce, 0xc2, 0x1c, 0x83, 0xc5, 0x9b, 0xc7, 0x3f, 0x37, 0x23, 0x32, + 0x91, 0x47, 0x30, 0xc9, 0xa6, 0xed, 0x5e, 0xf7, 0xee, 0xbf, 0x2b, 0xcb, 0x30, 0xdd, 0xc5, 0xd6, + 0x8e, 0x6e, 0xdb, 0xba, 0x69, 0xd0, 0x05, 0xb9, 0xb9, 0x5b, 0x1f, 0xeb, 0x4b, 0x9c, 0xac, 0x5d, + 0xce, 0xaf, 0x6b, 0x96, 0xa3, 0xb7, 0xf4, 0xae, 0x66, 0x38, 0xeb, 0x41, 0x66, 0x35, 0xfc, 0x27, + 0xfa, 0xd5, 0x84, 0xd3, 0x1a, 0xbe, 0x26, 0x11, 0x2a, 0xf1, 0xfb, 0x09, 0xa6, 0x24, 0xb1, 0x04, + 0x93, 0xa9, 0xc5, 0x87, 0x53, 0x55, 0x8b, 0x3e, 0x78, 0x6f, 0x29, 0x57, 0xc0, 0x89, 0x4a, 0xb5, + 0x54, 0x53, 0xd5, 0x72, 0xa9, 0xd1, 0x5c, 0x2f, 0xab, 0x6b, 0x95, 0x7a, 0xbd, 0x52, 0xab, 0xd6, + 0x0f, 0xd2, 0xda, 0xd1, 0xc7, 0x65, 0x5f, 0x63, 0x16, 0x71, 0xab, 0xa3, 0x1b, 0x18, 0xdd, 0x75, + 0x40, 0x85, 0xe1, 0x57, 0x7d, 0xc4, 0x71, 0x66, 0xe5, 0x47, 0xe0, 0xfc, 0xaa, 0xe4, 0x38, 0xf7, + 0x27, 0xf8, 0x1f, 0xb8, 0xf9, 0x7f, 0x51, 0x86, 0x63, 0xa1, 0x86, 0xa8, 0xe2, 0x9d, 0x91, 0xad, + 0xe4, 0xfd, 0x5c, 0xb8, 0xed, 0x56, 0x78, 0x4c, 0xfb, 0x59, 0xd3, 0xfb, 0xd8, 0x88, 0x80, 0xf5, + 0x0d, 0x3e, 0xac, 0xab, 0x1c, 0xac, 0x4f, 0x1d, 0x82, 0x66, 0x32, 0x64, 0x7f, 0x37, 0x55, 0x64, + 0xaf, 0x80, 0x13, 0xeb, 0x45, 0xb5, 0x51, 0x29, 0x55, 0xd6, 0x8b, 0xee, 0x38, 0x1a, 0x1a, 0xb2, + 0x23, 0xcc, 0x75, 0x1e, 0xf4, 0xbe, 0xf8, 0xbe, 0x2f, 0x0b, 0x57, 0xf5, 0xef, 0x68, 0x4b, 0xdb, + 0x9a, 0xb1, 0x85, 0x91, 0x2e, 0x02, 0xf5, 0x22, 0x4c, 0xb4, 0x48, 0x76, 0x8a, 0x73, 0x78, 0xeb, + 0x26, 0xa6, 0x2f, 0xa7, 0x25, 0xa8, 0xde, 0xaf, 0xe8, 0x6d, 0x61, 0x85, 0x68, 0xf0, 0x0a, 0xf1, + 0xf4, 0x78, 0xf0, 0xf6, 0xf1, 0x1d, 0xa1, 0x1b, 0x9f, 0xf2, 0x75, 0xe3, 0x1c, 0xa7, 0x1b, 0xa5, + 0x83, 0x91, 0x4f, 0xa6, 0x26, 0x7f, 0xfc, 0x68, 0xe8, 0x00, 0x22, 0xb5, 0x49, 0x8f, 0x1e, 0x15, + 0xfa, 0x76, 0xf7, 0xaf, 0x90, 0x21, 0xbf, 0x88, 0x3b, 0x58, 0x74, 0x25, 0xf2, 0x9b, 0x92, 0xe8, + 0x86, 0x08, 0x85, 0x81, 0xd2, 0x8e, 0x5e, 0x1d, 0x71, 0xf4, 0x1d, 0x6c, 0x3b, 0xda, 0x4e, 0x97, + 0x88, 0x5a, 0x56, 0x83, 0x04, 0xf4, 0xf3, 0x92, 0xc8, 0x76, 0x49, 0x4c, 0x31, 0xff, 0x31, 0xd6, + 0x14, 0x3f, 0x23, 0xc1, 0x64, 0x1d, 0x3b, 0x35, 0xab, 0x8d, 0x2d, 0x54, 0x0f, 0x30, 0xba, 0x06, + 0xa6, 0x09, 0x28, 0xee, 0x34, 0xd3, 0xc7, 0x29, 0x9c, 0xa4, 0x5c, 0x0f, 0x73, 0xfe, 0x2b, 0xf9, + 0x9d, 0x75, 0xe3, 0x3d, 0xa9, 0xe8, 0x9f, 0x32, 0xa2, 0xbb, 0xb8, 0x6c, 0xc9, 0x90, 0x71, 0x13, + 0xd1, 0x4a, 0xc5, 0x76, 0x64, 0x63, 0x49, 0xa5, 0xbf, 0xd1, 0xf5, 0x16, 0x09, 0x60, 0xc3, 0xb0, + 0x3d, 0xb9, 0x3e, 0x3e, 0x81, 0x5c, 0xd1, 0xbf, 0x64, 0x92, 0xcd, 0x62, 0x82, 0x72, 0x22, 0x24, + 0xf6, 0x9a, 0x04, 0x6b, 0x0b, 0x91, 0xc4, 0xd2, 0x97, 0xd9, 0x57, 0xe6, 0x20, 0x7f, 0x4e, 0xeb, + 0x74, 0xb0, 0x83, 0xbe, 0x2a, 0x41, 0xbe, 0x64, 0x61, 0xcd, 0xc1, 0x61, 0xd1, 0x21, 0x98, 0xb4, + 0x4c, 0xd3, 0x59, 0xd7, 0x9c, 0x6d, 0x26, 0x37, 0xff, 0x9d, 0x39, 0x0c, 0xfc, 0x4e, 0xb8, 0xfb, + 0xb8, 0x8b, 0x17, 0xdd, 0x8f, 0x72, 0xb5, 0xa5, 0x05, 0xcd, 0xd3, 0x42, 0x22, 0xfa, 0x0f, 0x04, + 0x93, 0x3b, 0x06, 0xde, 0x31, 0x0d, 0xbd, 0xe5, 0xd9, 0x9c, 0xde, 0x3b, 0xfa, 0x80, 0x2f, 0xd3, + 0x05, 0x4e, 0xa6, 0xf3, 0xc2, 0xa5, 0x24, 0x13, 0x68, 0x7d, 0x88, 0xde, 0xe3, 0x6a, 0xb8, 0x92, + 0x76, 0x06, 0xcd, 0x46, 0xad, 0x59, 0x52, 0xcb, 0xc5, 0x46, 0xb9, 0xb9, 0x5a, 0x2b, 0x15, 0x57, + 0x9b, 0x6a, 0x79, 0xbd, 0x56, 0xc0, 0xe8, 0xef, 0x25, 0x57, 0xb8, 0x2d, 0x73, 0x0f, 0x5b, 0x68, + 0x59, 0x48, 0xce, 0x71, 0x32, 0x61, 0x18, 0xfc, 0x9a, 0xb0, 0xd3, 0x06, 0x93, 0x0e, 0xe3, 0x20, + 0x42, 0x79, 0x3f, 0x28, 0xd4, 0xdc, 0x63, 0x49, 0x3d, 0x0a, 0x24, 0xfd, 0xbf, 0x25, 0x98, 0x28, + 0x99, 0xc6, 0x1e, 0xb6, 0x9c, 0xf0, 0x7c, 0x27, 0x2c, 0xcd, 0x0c, 0x2f, 0x4d, 0x77, 0x90, 0xc4, + 0x86, 0x63, 0x99, 0x5d, 0x6f, 0xc2, 0xe3, 0xbd, 0xa2, 0xd7, 0x25, 0x95, 0x30, 0x2b, 0x39, 0x7a, + 0xe1, 0xb3, 0x7f, 0x41, 0x1c, 0x7b, 0x72, 0x4f, 0x03, 0x78, 0x38, 0x09, 0x2e, 0xfd, 0x19, 0x48, + 0xbf, 0x4b, 0xf9, 0x92, 0x0c, 0xb3, 0xb4, 0xf1, 0xd5, 0x31, 0xb1, 0xd0, 0x50, 0x2d, 0xbc, 0xe4, + 0xd8, 0x23, 0xfc, 0x95, 0x23, 0x9c, 0xf8, 0xf3, 0x5a, 0xb7, 0xeb, 0x2f, 0x3f, 0xaf, 0x1c, 0x51, + 0xd9, 0x3b, 0x55, 0xf3, 0x85, 0x3c, 0x64, 0xb5, 0x5d, 0x67, 0x1b, 0x7d, 0x4f, 0x78, 0xf2, 0xc9, + 0x75, 0x06, 0x8c, 0x9f, 0x08, 0x48, 0x8e, 0x43, 0xce, 0x31, 0x2f, 0x60, 0x4f, 0x0e, 0xf4, 0xc5, + 0x85, 0x43, 0xeb, 0x76, 0x1b, 0xe4, 0x03, 0x83, 0xc3, 0x7b, 0x77, 0x6d, 0x1d, 0xad, 0xd5, 0x32, + 0x77, 0x0d, 0xa7, 0xe2, 0x2d, 0x41, 0x07, 0x09, 0xe8, 0xf3, 0x19, 0x91, 0xc9, 0xac, 0x00, 0x83, + 0xc9, 0x20, 0x3b, 0x3f, 0x44, 0x53, 0x9a, 0x87, 0x1b, 0x8b, 0xeb, 0xeb, 0xcd, 0x46, 0xed, 0xde, + 0x72, 0x35, 0x30, 0x3c, 0x9b, 0x95, 0x6a, 0xb3, 0xb1, 0x52, 0x6e, 0x96, 0x36, 0x54, 0xb2, 0x4e, + 0x58, 0x2c, 0x95, 0x6a, 0x1b, 0xd5, 0x46, 0x01, 0xa3, 0x37, 0x4a, 0x30, 0x53, 0xea, 0x98, 0xb6, + 0x8f, 0xf0, 0xd5, 0x01, 0xc2, 0xbe, 0x18, 0x33, 0x21, 0x31, 0xa2, 0x7f, 0xcf, 0x88, 0x3a, 0x1d, + 0x78, 0x02, 0x09, 0x91, 0x8f, 0xe8, 0xa5, 0x5e, 0x27, 0xe4, 0x74, 0x30, 0x98, 0x5e, 0xfa, 0x4d, + 0xe2, 0x33, 0xb7, 0xc3, 0x44, 0x91, 0x2a, 0x06, 0xfa, 0x9b, 0x0c, 0xe4, 0x4b, 0xa6, 0xb1, 0xa9, + 0x6f, 0xb9, 0xc6, 0x1c, 0x36, 0xb4, 0xf3, 0x1d, 0xbc, 0xa8, 0x39, 0xda, 0x9e, 0x8e, 0x2f, 0x92, + 0x0a, 0x4c, 0xaa, 0x3d, 0xa9, 0x2e, 0x53, 0x2c, 0x05, 0x9f, 0xdf, 0xdd, 0x22, 0x4c, 0x4d, 0xaa, + 0xe1, 0x24, 0xe5, 0xa9, 0x70, 0x39, 0x7d, 0x5d, 0xb7, 0xb0, 0x85, 0x3b, 0x58, 0xb3, 0xb1, 0x3b, + 0x2d, 0x32, 0x70, 0x87, 0x28, 0xed, 0xa4, 0x1a, 0xf5, 0x59, 0x39, 0x03, 0x33, 0xf4, 0x13, 0x31, + 0x45, 0x6c, 0xa2, 0xc6, 0x93, 0x2a, 0x97, 0xa6, 0x3c, 0x01, 0x72, 0xf8, 0x01, 0xc7, 0xd2, 0x4e, + 0xb5, 0x09, 0x5e, 0x97, 0xcf, 0x53, 0xaf, 0xc3, 0x79, 0xcf, 0xeb, 0x70, 0xbe, 0x4e, 0x7c, 0x12, + 0x55, 0x9a, 0x0b, 0xbd, 0x74, 0xd2, 0x37, 0x24, 0xbe, 0x2f, 0x05, 0x8a, 0xa1, 0x40, 0xd6, 0xd0, + 0x76, 0x30, 0xd3, 0x0b, 0xf2, 0xac, 0xdc, 0x08, 0x47, 0xb5, 0x3d, 0xcd, 0xd1, 0xac, 0x55, 0xb3, + 0xa5, 0x75, 0xc8, 0xe0, 0xe7, 0xb5, 0xfc, 0xde, 0x0f, 0x64, 0x47, 0xc8, 0x31, 0x2d, 0x4c, 0x72, + 0x79, 0x3b, 0x42, 0x5e, 0x82, 0x4b, 0x5d, 0x6f, 0x99, 0x06, 0xe1, 0x5f, 0x56, 0xc9, 0xb3, 0x2b, + 0x95, 0xb6, 0x6e, 0xbb, 0x15, 0x21, 0x54, 0xaa, 0x74, 0x6b, 0xa3, 0x7e, 0xc9, 0x68, 0x91, 0xdd, + 0xa0, 0x49, 0x35, 0xea, 0xb3, 0xb2, 0x00, 0xd3, 0x6c, 0x23, 0x64, 0xcd, 0xd5, 0xab, 0x3c, 0xd1, + 0xab, 0x6b, 0x78, 0x9f, 0x2e, 0x8a, 0xe7, 0x7c, 0x35, 0xc8, 0xa7, 0x86, 0x7f, 0x52, 0xee, 0x86, + 0x2b, 0xd9, 0x6b, 0x69, 0xd7, 0x76, 0xcc, 0x1d, 0x0a, 0xfa, 0x92, 0xde, 0xa1, 0x35, 0x98, 0x20, + 0x35, 0x88, 0xcb, 0xa2, 0xdc, 0x0a, 0xc7, 0xbb, 0x16, 0xde, 0xc4, 0xd6, 0x7d, 0xda, 0xce, 0xee, + 0x03, 0x0d, 0x4b, 0x33, 0xec, 0xae, 0x69, 0x39, 0xa7, 0x26, 0x09, 0xf3, 0x7d, 0xbf, 0xb1, 0x8e, + 0x72, 0x12, 0xf2, 0x54, 0x7c, 0xe8, 0xf9, 0x39, 0x61, 0x77, 0x4e, 0x56, 0xa1, 0x58, 0xf3, 0xec, + 0x16, 0x98, 0x60, 0x3d, 0x1c, 0x01, 0x6a, 0xfa, 0xd6, 0x93, 0x3d, 0xeb, 0x0a, 0x8c, 0x8a, 0xea, + 0x65, 0x53, 0x9e, 0x04, 0xf9, 0x16, 0xa9, 0x16, 0xc1, 0x6c, 0xfa, 0xd6, 0x2b, 0xfb, 0x17, 0x4a, + 0xb2, 0xa8, 0x2c, 0x2b, 0xfa, 0x4b, 0x59, 0xc8, 0x03, 0x34, 0x8e, 0xe3, 0x64, 0xad, 0xfa, 0xeb, + 0xd2, 0x10, 0xdd, 0xe6, 0x4d, 0x70, 0x03, 0xeb, 0x13, 0x99, 0xfd, 0xb1, 0xd8, 0x5c, 0xd8, 0xf0, + 0x26, 0x83, 0xae, 0x55, 0x52, 0x6f, 0x14, 0x55, 0x77, 0x26, 0xbf, 0xe8, 0x4e, 0x22, 0x6f, 0x84, + 0xeb, 0x07, 0xe4, 0x2e, 0x37, 0x9a, 0xd5, 0xe2, 0x5a, 0xb9, 0xb0, 0xc9, 0xdb, 0x36, 0xf5, 0x46, + 0x6d, 0xbd, 0xa9, 0x6e, 0x54, 0xab, 0x95, 0xea, 0x32, 0x25, 0xe6, 0x9a, 0x84, 0x27, 0x83, 0x0c, + 0xe7, 0xd4, 0x4a, 0xa3, 0xdc, 0x2c, 0xd5, 0xaa, 0x4b, 0x95, 0xe5, 0x82, 0x3e, 0xc8, 0x30, 0xba, + 0x5f, 0xb9, 0x06, 0xae, 0xe2, 0x38, 0xa9, 0xd4, 0xaa, 0xee, 0xcc, 0xb6, 0x54, 0xac, 0x96, 0xca, + 0xee, 0x34, 0xf6, 0x82, 0x82, 0xe0, 0x04, 0x25, 0xd7, 0x5c, 0xaa, 0xac, 0x86, 0x37, 0xa3, 0x3e, + 0x96, 0x51, 0x4e, 0xc1, 0x65, 0xe1, 0x6f, 0x95, 0xea, 0xd9, 0xe2, 0x6a, 0x65, 0xb1, 0xf0, 0x47, + 0x19, 0xe5, 0x3a, 0xb8, 0x9a, 0xfb, 0x8b, 0xee, 0x2b, 0x35, 0x2b, 0x8b, 0xcd, 0xb5, 0x4a, 0x7d, + 0xad, 0xd8, 0x28, 0xad, 0x14, 0x3e, 0x4e, 0xe6, 0x0b, 0xbe, 0x01, 0x1c, 0x72, 0xcb, 0x7c, 0x61, + 0x78, 0x4c, 0x2f, 0xf2, 0x8a, 0xfa, 0xf8, 0xbe, 0xb0, 0xc7, 0xdb, 0xb0, 0x1f, 0xf6, 0x47, 0x87, + 0x45, 0x4e, 0x85, 0x6e, 0x49, 0x40, 0x2b, 0x99, 0x0e, 0x35, 0x86, 0x50, 0xa1, 0x6b, 0xe0, 0xaa, + 0x6a, 0x99, 0x22, 0xa5, 0x96, 0x4b, 0xb5, 0xb3, 0x65, 0xb5, 0x79, 0xae, 0xb8, 0xba, 0x5a, 0x6e, + 0x34, 0x97, 0x2a, 0x6a, 0xbd, 0x51, 0xd8, 0x44, 0xff, 0x22, 0xf9, 0xab, 0x39, 0x21, 0x69, 0xfd, + 0x8d, 0x94, 0xb4, 0x59, 0xc7, 0xae, 0xda, 0xfc, 0x18, 0xe4, 0x6d, 0x47, 0x73, 0x76, 0x6d, 0xd6, + 0xaa, 0x1f, 0xd3, 0xbf, 0x55, 0xcf, 0xd7, 0x49, 0x26, 0x95, 0x65, 0x46, 0x7f, 0x99, 0x49, 0xd2, + 0x4c, 0x47, 0xb0, 0xa0, 0xa3, 0x0f, 0x21, 0xe2, 0xd3, 0x80, 0x3c, 0x6d, 0xaf, 0xd4, 0x9b, 0xc5, + 0x55, 0xb5, 0x5c, 0x5c, 0xbc, 0xcf, 0x5f, 0xc6, 0xc1, 0xca, 0x09, 0x38, 0xb6, 0x51, 0x2d, 0x2e, + 0xac, 0x96, 0x49, 0x73, 0xa9, 0x55, 0xab, 0xe5, 0x92, 0x2b, 0xf7, 0x9f, 0x27, 0x9b, 0x26, 0xae, + 0x05, 0x4d, 0xf8, 0x76, 0xad, 0x9c, 0x90, 0xfc, 0xbf, 0x26, 0xec, 0x5b, 0x14, 0x68, 0x58, 0x98, + 0xd6, 0x68, 0x71, 0xf8, 0xbc, 0x90, 0x3b, 0x91, 0x10, 0x27, 0xc9, 0xf0, 0xf8, 0xcf, 0x43, 0xe0, + 0x71, 0x02, 0x8e, 0x85, 0xf1, 0x20, 0x6e, 0x45, 0xd1, 0x30, 0x7c, 0x79, 0x12, 0xf2, 0x75, 0xdc, + 0xc1, 0x2d, 0x07, 0xbd, 0x39, 0x64, 0x4c, 0xcc, 0x81, 0xe4, 0xbb, 0xb1, 0x48, 0x7a, 0x9b, 0x9b, + 0x3e, 0x4b, 0x3d, 0xd3, 0xe7, 0x18, 0x33, 0x40, 0x4e, 0x64, 0x06, 0x64, 0x53, 0x30, 0x03, 0x72, + 0xc3, 0x9b, 0x01, 0xf9, 0x41, 0x66, 0x00, 0x7a, 0x4d, 0x3e, 0x69, 0x2f, 0x41, 0x45, 0x7d, 0xb8, + 0x83, 0xff, 0xff, 0xca, 0x26, 0xe9, 0x55, 0xfa, 0x72, 0x9c, 0x4c, 0x8b, 0xbf, 0x27, 0xa7, 0xb0, + 0xfc, 0xa0, 0x5c, 0x0b, 0x57, 0x07, 0xef, 0xcd, 0xf2, 0x33, 0x2a, 0xf5, 0x46, 0x9d, 0x8c, 0xf8, + 0xa5, 0x9a, 0xaa, 0x6e, 0xac, 0xd3, 0x35, 0xe4, 0x93, 0xa0, 0x04, 0x54, 0xd4, 0x8d, 0x2a, 0x1d, + 0xdf, 0xb7, 0x78, 0xea, 0x4b, 0x95, 0xea, 0x62, 0xd3, 0x6f, 0x33, 0xd5, 0xa5, 0x5a, 0x61, 0xdb, + 0x9d, 0xb2, 0x85, 0xa8, 0xbb, 0x03, 0x34, 0x2b, 0xa1, 0x58, 0x5d, 0x6c, 0xae, 0x55, 0xcb, 0x6b, + 0xb5, 0x6a, 0xa5, 0x44, 0xd2, 0xeb, 0xe5, 0x46, 0x41, 0x77, 0x07, 0x9a, 0x1e, 0x8b, 0xa2, 0x5e, + 0x2e, 0xaa, 0xa5, 0x95, 0xb2, 0x4a, 0x8b, 0xbc, 0x5f, 0xb9, 0x1e, 0xce, 0x14, 0xab, 0xb5, 0x86, + 0x9b, 0x52, 0xac, 0xde, 0xd7, 0xb8, 0x6f, 0xbd, 0xdc, 0x5c, 0x57, 0x6b, 0xa5, 0x72, 0xbd, 0xee, + 0xb6, 0x53, 0x66, 0x7f, 0x14, 0x3a, 0xca, 0xd3, 0xe1, 0xf6, 0x10, 0x6b, 0xe5, 0x06, 0xd9, 0xb0, + 0x5c, 0xab, 0x11, 0x9f, 0x95, 0xc5, 0x72, 0x73, 0xa5, 0x58, 0x6f, 0x56, 0xaa, 0xa5, 0xda, 0xda, + 0x7a, 0xb1, 0x51, 0x71, 0x9b, 0xf3, 0xba, 0x5a, 0x6b, 0xd4, 0x9a, 0x67, 0xcb, 0x6a, 0xbd, 0x52, + 0xab, 0x16, 0x0c, 0xb7, 0xca, 0xa1, 0xf6, 0xef, 0xf5, 0xc3, 0xa6, 0x72, 0x15, 0x9c, 0xf2, 0xd2, + 0x57, 0x6b, 0xae, 0xa0, 0x43, 0x16, 0x49, 0x37, 0x55, 0x8b, 0xe4, 0xdf, 0x24, 0xc8, 0xd6, 0x1d, + 0xb3, 0x8b, 0x7e, 0x34, 0xe8, 0x60, 0x4e, 0x03, 0x58, 0x64, 0xff, 0xd1, 0x9d, 0x85, 0xb1, 0x79, + 0x59, 0x28, 0x05, 0x7d, 0x44, 0x78, 0xd3, 0x24, 0xe8, 0xb3, 0xcd, 0x6e, 0x84, 0xad, 0xf2, 0x1d, + 0xb1, 0x53, 0x24, 0xd1, 0x84, 0x92, 0xe9, 0xfb, 0x2f, 0x0d, 0xb3, 0x2d, 0x82, 0xe0, 0x64, 0x08, + 0x36, 0x57, 0xfe, 0x9e, 0x4a, 0x60, 0xe5, 0x72, 0xb8, 0xac, 0x47, 0xb9, 0x88, 0x4e, 0x6d, 0x2a, + 0x3f, 0x02, 0x8f, 0x09, 0xa9, 0x77, 0x79, 0xad, 0x76, 0xb6, 0xec, 0x2b, 0xf2, 0x62, 0xb1, 0x51, + 0x2c, 0x6c, 0xa1, 0xcf, 0xc8, 0x90, 0x5d, 0x33, 0xf7, 0x7a, 0xf7, 0xaa, 0x0c, 0x7c, 0x31, 0xb4, + 0x16, 0xea, 0xbd, 0xf2, 0x5e, 0xf3, 0x42, 0x62, 0x5f, 0x8b, 0xde, 0x97, 0xfe, 0xbc, 0x94, 0x44, + 0xec, 0x6b, 0x07, 0xdd, 0x8c, 0xfe, 0x87, 0x61, 0xc4, 0x1e, 0x21, 0x5a, 0xac, 0x9c, 0x81, 0xd3, + 0xc1, 0x87, 0xca, 0x62, 0xb9, 0xda, 0xa8, 0x2c, 0xdd, 0x17, 0x08, 0xb7, 0xa2, 0x0a, 0x89, 0x7f, + 0x50, 0x37, 0x16, 0x3f, 0xd3, 0x38, 0x05, 0xc7, 0x83, 0x6f, 0xcb, 0xe5, 0x86, 0xf7, 0xe5, 0x7e, + 0xf4, 0x60, 0x0e, 0x66, 0x68, 0xb7, 0xbe, 0xd1, 0x6d, 0x6b, 0x0e, 0x46, 0x4f, 0x0a, 0xd0, 0xbd, + 0x01, 0x8e, 0x56, 0xd6, 0x97, 0xea, 0x75, 0xc7, 0xb4, 0xb4, 0x2d, 0x5c, 0x6c, 0xb7, 0x2d, 0x26, + 0xad, 0xde, 0x64, 0xf4, 0x0e, 0xe1, 0x75, 0x3e, 0x7e, 0x28, 0xa1, 0x65, 0x46, 0xa0, 0xfe, 0x25, + 0xa1, 0x75, 0x39, 0x01, 0x82, 0xc9, 0xd0, 0xbf, 0x7f, 0xc4, 0x6d, 0x2e, 0x1a, 0x97, 0xcd, 0x33, + 0xcf, 0x91, 0x60, 0xaa, 0xa1, 0xef, 0xe0, 0x67, 0x9a, 0x06, 0xb6, 0x95, 0x09, 0x90, 0x97, 0xd7, + 0x1a, 0x85, 0x23, 0xee, 0x83, 0x6b, 0x54, 0x65, 0xc8, 0x43, 0xd9, 0x2d, 0xc0, 0x7d, 0x28, 0x36, + 0x0a, 0xb2, 0xfb, 0xb0, 0x56, 0x6e, 0x14, 0xb2, 0xee, 0x43, 0xb5, 0xdc, 0x28, 0xe4, 0xdc, 0x87, + 0xf5, 0xd5, 0x46, 0x21, 0xef, 0x3e, 0x54, 0xea, 0x8d, 0xc2, 0x84, 0xfb, 0xb0, 0x50, 0x6f, 0x14, + 0x26, 0xdd, 0x87, 0xb3, 0xf5, 0x46, 0x61, 0xca, 0x7d, 0x28, 0x35, 0x1a, 0x05, 0x70, 0x1f, 0xee, + 0xa9, 0x37, 0x0a, 0xd3, 0xee, 0x43, 0xb1, 0xd4, 0x28, 0xcc, 0x90, 0x87, 0x72, 0xa3, 0x30, 0xeb, + 0x3e, 0xd4, 0xeb, 0x8d, 0xc2, 0x1c, 0xa1, 0x5c, 0x6f, 0x14, 0x8e, 0x92, 0xb2, 0x2a, 0x8d, 0x42, + 0xc1, 0x7d, 0x58, 0xa9, 0x37, 0x0a, 0xc7, 0x48, 0xe6, 0x7a, 0xa3, 0xa0, 0x90, 0x42, 0xeb, 0x8d, + 0xc2, 0x65, 0x24, 0x4f, 0xbd, 0x51, 0x38, 0x4e, 0x8a, 0xa8, 0x37, 0x0a, 0x27, 0x08, 0x1b, 0xe5, + 0x46, 0xe1, 0x24, 0xc9, 0xa3, 0x36, 0x0a, 0x97, 0x93, 0x4f, 0xd5, 0x46, 0xe1, 0x14, 0x61, 0xac, + 0xdc, 0x28, 0x5c, 0x41, 0x1e, 0xd4, 0x46, 0x01, 0x91, 0x4f, 0xc5, 0x46, 0xe1, 0x4a, 0xf4, 0x18, + 0x98, 0x5a, 0xc6, 0x0e, 0x05, 0x11, 0x15, 0x40, 0x5e, 0xc6, 0x4e, 0xd8, 0x8c, 0xff, 0x8a, 0x0c, + 0x97, 0xb3, 0xa9, 0xdf, 0x92, 0x65, 0xee, 0xac, 0xe2, 0x2d, 0xad, 0x75, 0xa9, 0xfc, 0x80, 0x6b, + 0x42, 0x85, 0xf7, 0x65, 0x15, 0xc8, 0x76, 0x83, 0xce, 0x88, 0x3c, 0xc7, 0x5a, 0x9c, 0xde, 0x62, + 0x94, 0x1c, 0x2c, 0x46, 0x31, 0x8b, 0xec, 0x9f, 0xc3, 0x1a, 0xcd, 0xad, 0x1f, 0x67, 0x7a, 0xd6, + 0x8f, 0xdd, 0x66, 0xd2, 0xc5, 0x96, 0x6d, 0x1a, 0x5a, 0xa7, 0xce, 0x36, 0xee, 0xe9, 0xaa, 0x57, + 0x6f, 0xb2, 0xf2, 0x13, 0x5e, 0xcb, 0xa0, 0x56, 0xd9, 0xd3, 0xe2, 0x66, 0xb8, 0xbd, 0xd5, 0x8c, + 0x68, 0x24, 0x1f, 0xf7, 0x1b, 0x49, 0x83, 0x6b, 0x24, 0x77, 0x1f, 0x80, 0x76, 0xb2, 0xf6, 0x52, + 0x19, 0x6e, 0x6a, 0x11, 0xb8, 0xb5, 0x7a, 0xcb, 0xd5, 0x32, 0xfa, 0x8c, 0x04, 0x27, 0xcb, 0x46, + 0x3f, 0x0b, 0x3f, 0xac, 0x0b, 0x6f, 0x0c, 0x43, 0xb3, 0xce, 0x8b, 0xf4, 0xf6, 0xbe, 0xd5, 0xee, + 0x4f, 0x33, 0x42, 0xa2, 0x9f, 0xf4, 0x25, 0x5a, 0xe7, 0x24, 0x7a, 0xd7, 0xf0, 0xa4, 0x93, 0x09, + 0xb4, 0x3a, 0xd2, 0x0e, 0x28, 0x8b, 0xbe, 0x9e, 0x85, 0xc7, 0x50, 0xdf, 0x1b, 0xc6, 0x21, 0x6d, + 0x65, 0x45, 0xa3, 0xad, 0x62, 0xdb, 0xd1, 0x2c, 0x87, 0x3b, 0x0f, 0xdd, 0x33, 0x95, 0xca, 0xa4, + 0x30, 0x95, 0x92, 0x06, 0x4e, 0xa5, 0xd0, 0xdb, 0xc3, 0xe6, 0xc3, 0x39, 0x1e, 0xe3, 0x62, 0xff, + 0xfe, 0x3f, 0xae, 0x86, 0x51, 0x50, 0xfb, 0x76, 0xc5, 0x4f, 0x72, 0x50, 0x2f, 0x1d, 0xb8, 0x84, + 0x64, 0x88, 0x7f, 0x64, 0xb4, 0x76, 0x5e, 0x36, 0xfc, 0x8d, 0x37, 0x4a, 0x0a, 0xed, 0x54, 0x0d, + 0xf4, 0x4f, 0x4d, 0xc0, 0x14, 0x69, 0x0b, 0xab, 0xba, 0x71, 0x01, 0x3d, 0x2c, 0xc3, 0x4c, 0x15, + 0x5f, 0x2c, 0x6d, 0x6b, 0x9d, 0x0e, 0x36, 0xb6, 0x70, 0xd8, 0x6c, 0x3f, 0x05, 0x13, 0x5a, 0xb7, + 0x5b, 0x0d, 0xf6, 0x19, 0xbc, 0x57, 0xd6, 0xff, 0x7e, 0xad, 0x6f, 0x23, 0xcf, 0xc4, 0x34, 0x72, + 0xbf, 0xdc, 0xf9, 0x70, 0x99, 0x11, 0x33, 0xe4, 0x6b, 0x60, 0xba, 0xe5, 0x65, 0xf1, 0xcf, 0x4d, + 0x84, 0x93, 0xd0, 0xdf, 0x25, 0xea, 0x06, 0x84, 0x0a, 0x4f, 0xa6, 0x14, 0x78, 0xc4, 0x76, 0xc8, + 0x09, 0x38, 0xd6, 0xa8, 0xd5, 0x9a, 0x6b, 0xc5, 0xea, 0x7d, 0xc1, 0x79, 0xe5, 0x4d, 0xf4, 0xb2, + 0x2c, 0xcc, 0xd5, 0xcd, 0xce, 0x1e, 0x0e, 0x60, 0xaa, 0x70, 0x0e, 0x39, 0x61, 0x39, 0x65, 0xf6, + 0xc9, 0x49, 0x39, 0x09, 0x79, 0xcd, 0xb0, 0x2f, 0x62, 0xcf, 0x36, 0x64, 0x6f, 0x0c, 0xc6, 0xf7, + 0x85, 0xdb, 0xb1, 0xca, 0xc3, 0x78, 0xc7, 0x00, 0x49, 0xf2, 0x5c, 0x45, 0x00, 0x79, 0x06, 0x66, + 0x6c, 0xba, 0x59, 0xd8, 0x08, 0xed, 0x09, 0x73, 0x69, 0x84, 0x45, 0xba, 0x5b, 0x2d, 0x33, 0x16, + 0xc9, 0x1b, 0x7a, 0xd8, 0x6f, 0xfe, 0x1b, 0x1c, 0xc4, 0xc5, 0x83, 0x30, 0x96, 0x0c, 0xe4, 0x57, + 0x8c, 0x7a, 0x86, 0x77, 0x0a, 0x8e, 0xb3, 0x56, 0xdb, 0x2c, 0xad, 0x14, 0x57, 0x57, 0xcb, 0xd5, + 0xe5, 0x72, 0xb3, 0xb2, 0x48, 0xb7, 0x2a, 0x82, 0x94, 0x62, 0xa3, 0x51, 0x5e, 0x5b, 0x6f, 0xd4, + 0x9b, 0xe5, 0x67, 0x94, 0xca, 0xe5, 0x45, 0xe2, 0x12, 0x47, 0xce, 0xb4, 0x78, 0xce, 0x8b, 0xc5, + 0x6a, 0xfd, 0x5c, 0x59, 0x2d, 0x6c, 0x9f, 0x29, 0xc2, 0x74, 0xa8, 0x9f, 0x77, 0xb9, 0x5b, 0xc4, + 0x9b, 0xda, 0x6e, 0x87, 0xd9, 0x6a, 0x85, 0x23, 0x2e, 0x77, 0x44, 0x36, 0x35, 0xa3, 0x73, 0xa9, + 0x90, 0x51, 0x0a, 0x30, 0x13, 0xee, 0xd2, 0x0b, 0x12, 0x7a, 0xcb, 0x55, 0x30, 0x75, 0xce, 0xb4, + 0x2e, 0x10, 0x3f, 0x2e, 0xf4, 0x6e, 0x1a, 0xd7, 0xc4, 0x3b, 0x21, 0x1a, 0x1a, 0xd8, 0x5f, 0x21, + 0xee, 0x2d, 0xe0, 0x51, 0x9b, 0x1f, 0x78, 0x0a, 0xf4, 0x1a, 0x98, 0xbe, 0xe8, 0xe5, 0x0e, 0x5a, + 0x7a, 0x28, 0x09, 0xfd, 0x77, 0xb1, 0xfd, 0xff, 0xc1, 0x45, 0xa6, 0xbf, 0x3f, 0xfd, 0x66, 0x09, + 0xf2, 0xcb, 0xd8, 0x29, 0x76, 0x3a, 0x61, 0xb9, 0xbd, 0x48, 0xf8, 0x64, 0x0f, 0x57, 0x89, 0x62, + 0xa7, 0x13, 0xdd, 0xa8, 0x42, 0x02, 0xf2, 0x3c, 0xd0, 0xb9, 0x34, 0x41, 0xbf, 0xb9, 0x01, 0x05, + 0xa6, 0x2f, 0xb1, 0x0f, 0xc8, 0xfe, 0x1e, 0xf7, 0x23, 0x21, 0x2b, 0xe7, 0x89, 0x41, 0x4c, 0x9b, + 0x4c, 0xfc, 0x5e, 0xb9, 0x97, 0x4f, 0xb9, 0x17, 0x26, 0x76, 0x6d, 0x5c, 0xd2, 0x6c, 0x4c, 0x78, + 0xeb, 0xad, 0x69, 0xed, 0xfc, 0xfd, 0xb8, 0xe5, 0xcc, 0x57, 0x76, 0x5c, 0x83, 0x7a, 0x83, 0x66, + 0xf4, 0xc3, 0xc4, 0xb0, 0x77, 0xd5, 0xa3, 0xe0, 0x4e, 0x4a, 0x2e, 0xea, 0xce, 0x76, 0x69, 0x5b, + 0x73, 0xd8, 0xda, 0xb6, 0xff, 0x8e, 0x9e, 0x3f, 0x04, 0x9c, 0xb1, 0x7b, 0xc1, 0x91, 0x07, 0x04, + 0x13, 0x83, 0x38, 0x82, 0x0d, 0xdc, 0x61, 0x40, 0xfc, 0x47, 0x09, 0xb2, 0xb5, 0x2e, 0x36, 0x84, + 0x4f, 0xc3, 0xf8, 0xb2, 0x95, 0x7a, 0x64, 0xfb, 0xb0, 0xb8, 0x77, 0x98, 0x5f, 0x69, 0xb7, 0xe4, + 0x08, 0xc9, 0xde, 0x0c, 0x59, 0xdd, 0xd8, 0x34, 0x99, 0x61, 0x7a, 0x65, 0xc4, 0x26, 0x50, 0xc5, + 0xd8, 0x34, 0x55, 0x92, 0x51, 0xd4, 0x31, 0x2c, 0xae, 0xec, 0xf4, 0xc5, 0xfd, 0x8d, 0x49, 0xc8, + 0x53, 0x75, 0x46, 0x2f, 0x94, 0x41, 0x2e, 0xb6, 0xdb, 0x11, 0x82, 0x97, 0xf6, 0x09, 0xde, 0x24, + 0xbf, 0xf9, 0x98, 0xf8, 0xef, 0x7c, 0x30, 0x13, 0xc1, 0xbe, 0x9d, 0x35, 0xa9, 0x62, 0xbb, 0x1d, + 0xed, 0x83, 0xea, 0x17, 0x28, 0xf1, 0x05, 0x86, 0x5b, 0xb8, 0x2c, 0xd6, 0xc2, 0x13, 0x0f, 0x04, + 0x91, 0xfc, 0xa5, 0x0f, 0xd1, 0x3f, 0x4b, 0x30, 0xb1, 0xaa, 0xdb, 0x8e, 0x8b, 0x4d, 0x51, 0x04, + 0x9b, 0xab, 0x60, 0xca, 0x13, 0x8d, 0xdb, 0xe5, 0xb9, 0xfd, 0x79, 0x90, 0x80, 0x5e, 0x1d, 0x46, + 0xe7, 0x1e, 0x1e, 0x9d, 0x27, 0xc7, 0xd7, 0x9e, 0x71, 0x11, 0x7d, 0xca, 0x20, 0x28, 0x56, 0xea, + 0x2d, 0xf6, 0x77, 0x7c, 0x81, 0xaf, 0x71, 0x02, 0xbf, 0x6d, 0x98, 0x22, 0xd3, 0x17, 0xfa, 0x67, + 0x25, 0x00, 0xb7, 0x6c, 0x76, 0x94, 0xeb, 0x71, 0xdc, 0x01, 0xed, 0x18, 0xe9, 0xbe, 0x2c, 0x2c, + 0xdd, 0x35, 0x5e, 0xba, 0x3f, 0x3e, 0xb8, 0xaa, 0x71, 0x47, 0xb6, 0x94, 0x02, 0xc8, 0xba, 0x2f, + 0x5a, 0xf7, 0x11, 0xbd, 0xd9, 0x17, 0xea, 0x3a, 0x27, 0xd4, 0x3b, 0x86, 0x2c, 0x29, 0x7d, 0xb9, + 0xfe, 0x95, 0x04, 0x13, 0x75, 0xec, 0xb8, 0xdd, 0x24, 0x3a, 0x2b, 0xd2, 0xc3, 0x87, 0xda, 0xb6, + 0x24, 0xd8, 0xb6, 0xbf, 0x9d, 0x11, 0x0d, 0xf4, 0x12, 0x48, 0x86, 0xf1, 0x14, 0xb1, 0x78, 0xf0, + 0x88, 0x50, 0xa0, 0x97, 0x41, 0xd4, 0xd2, 0x97, 0xee, 0x1b, 0x25, 0x7f, 0x63, 0x9e, 0x3f, 0x69, + 0x11, 0x36, 0x8b, 0x33, 0xfb, 0xcd, 0x62, 0xf1, 0x93, 0x16, 0xe1, 0x3a, 0x46, 0xef, 0x4a, 0x27, + 0x36, 0x36, 0x46, 0xb0, 0x61, 0x3c, 0x8c, 0xbc, 0x9e, 0x2d, 0x43, 0x9e, 0xad, 0x2c, 0xdf, 0x15, + 0xbf, 0xb2, 0x3c, 0x78, 0x6a, 0xf1, 0xae, 0x21, 0x4c, 0xb9, 0xb8, 0xe5, 0x5e, 0x9f, 0x0d, 0x29, + 0xc4, 0xc6, 0x4d, 0x90, 0x23, 0x91, 0x28, 0xd9, 0x38, 0x17, 0xec, 0xf5, 0x7b, 0x24, 0xca, 0xee, + 0x57, 0x95, 0x66, 0x4a, 0x8c, 0xc2, 0x08, 0x56, 0x88, 0x87, 0x41, 0xe1, 0x1d, 0x0a, 0xc0, 0xfa, + 0xee, 0xf9, 0x8e, 0x6e, 0x6f, 0xeb, 0xc6, 0x16, 0xfa, 0x7e, 0x06, 0x66, 0xd8, 0x2b, 0x0d, 0xa8, + 0x18, 0x6b, 0xfe, 0x45, 0x1a, 0x05, 0x05, 0x90, 0x77, 0x2d, 0x9d, 0x2d, 0x03, 0xb8, 0x8f, 0xca, + 0x9d, 0xbe, 0x23, 0x4f, 0xb6, 0xe7, 0x28, 0xbd, 0x2b, 0x86, 0x80, 0x83, 0xf9, 0x50, 0xe9, 0x81, + 0x43, 0x4f, 0x38, 0x6a, 0x66, 0x8e, 0x8f, 0x9a, 0xc9, 0x9d, 0xaf, 0xcb, 0xf7, 0x9c, 0xaf, 0x73, + 0x71, 0xb4, 0xf5, 0x67, 0x62, 0xe2, 0x5c, 0x2a, 0xab, 0xe4, 0xd9, 0xfd, 0xe3, 0x7e, 0x53, 0x37, + 0xc8, 0x66, 0x01, 0x73, 0x1d, 0x0d, 0x12, 0xd0, 0xfb, 0x83, 0x89, 0x8c, 0x29, 0x68, 0x05, 0x27, + 0x10, 0x03, 0x57, 0x76, 0xb6, 0xb7, 0xec, 0x0f, 0x09, 0x47, 0xc9, 0x0a, 0x09, 0x2c, 0x76, 0x4a, + 0xc2, 0x38, 0x90, 0x7c, 0x0e, 0x42, 0xbb, 0x7d, 0x71, 0xdd, 0xe9, 0x20, 0xfa, 0xc9, 0x14, 0x73, + 0x67, 0x88, 0xc5, 0x17, 0x05, 0xe6, 0xbc, 0x53, 0x87, 0xb5, 0x85, 0x7b, 0xca, 0xa5, 0x46, 0x01, + 0xef, 0x3f, 0x89, 0x48, 0xce, 0x1c, 0xd2, 0xf3, 0x85, 0xc1, 0x02, 0x0b, 0xfa, 0x9f, 0x12, 0xe4, + 0x99, 0xed, 0x70, 0xd7, 0x01, 0x21, 0x44, 0x2f, 0x1f, 0x06, 0x92, 0xd8, 0xc3, 0xdf, 0x9f, 0x48, + 0x0a, 0xc0, 0x08, 0xac, 0x85, 0xfb, 0x52, 0x03, 0x00, 0xfd, 0xab, 0x04, 0x59, 0xd7, 0xa6, 0x11, + 0x3b, 0x5a, 0xfb, 0x71, 0x61, 0xa7, 0xd6, 0x90, 0x00, 0x5c, 0xf2, 0x11, 0xfa, 0xbd, 0x00, 0x53, + 0x5d, 0x9a, 0xd1, 0x3f, 0xd8, 0x7d, 0x9d, 0x40, 0xcf, 0x82, 0xd5, 0xe0, 0x37, 0xf4, 0x4e, 0x21, + 0xc7, 0xd8, 0x78, 0x7e, 0x92, 0xc1, 0x51, 0x1e, 0xc5, 0x29, 0xdc, 0x4d, 0xf4, 0x5d, 0x09, 0x40, + 0xc5, 0xb6, 0xd9, 0xd9, 0xc3, 0x1b, 0x96, 0x8e, 0xae, 0x0c, 0x00, 0x60, 0xcd, 0x3e, 0x13, 0x34, + 0xfb, 0x4f, 0x85, 0x05, 0xbf, 0xcc, 0x0b, 0xfe, 0x89, 0xd1, 0x9a, 0xe7, 0x11, 0x8f, 0x10, 0xff, + 0xd3, 0x61, 0x82, 0xc9, 0x91, 0x19, 0x88, 0x62, 0xc2, 0xf7, 0x7e, 0x42, 0xef, 0xf1, 0x45, 0x7f, + 0x0f, 0x27, 0xfa, 0xa7, 0x24, 0xe6, 0x28, 0x19, 0x00, 0xa5, 0x21, 0x00, 0x38, 0x0a, 0xd3, 0x1e, + 0x00, 0x1b, 0x6a, 0xa5, 0x80, 0xd1, 0xdb, 0x64, 0xb2, 0x97, 0x4e, 0x47, 0xaa, 0x83, 0xf7, 0x34, + 0x5f, 0x15, 0x9e, 0xb9, 0x87, 0xe4, 0xe1, 0x97, 0x9f, 0x12, 0x40, 0x7f, 0x2a, 0x34, 0x55, 0x17, + 0x60, 0xe8, 0xd1, 0xd2, 0x5f, 0x9d, 0x29, 0xc3, 0x2c, 0x67, 0x62, 0x28, 0xa7, 0xe0, 0x38, 0x97, + 0x40, 0xc7, 0xbb, 0x76, 0xe1, 0x88, 0x82, 0xe0, 0x24, 0xf7, 0x85, 0xbd, 0xe0, 0x76, 0x21, 0x83, + 0xfe, 0xfc, 0x33, 0x19, 0x7f, 0xf1, 0xe6, 0x5d, 0x59, 0xb6, 0x6c, 0xf6, 0x51, 0x3e, 0x96, 0x58, + 0xcb, 0x34, 0x1c, 0xfc, 0x40, 0xc8, 0x97, 0xc1, 0x4f, 0x88, 0xb5, 0x1a, 0x4e, 0xc1, 0x84, 0x63, + 0x85, 0xfd, 0x1b, 0xbc, 0xd7, 0xb0, 0x62, 0xe5, 0x78, 0xc5, 0xaa, 0xc2, 0x19, 0xdd, 0x68, 0x75, + 0x76, 0xdb, 0x58, 0xc5, 0x1d, 0xcd, 0x95, 0xa1, 0x5d, 0xb4, 0x17, 0x71, 0x17, 0x1b, 0x6d, 0x6c, + 0x38, 0x94, 0x4f, 0xef, 0x2c, 0x93, 0x40, 0x4e, 0x5e, 0x19, 0xef, 0xe4, 0x95, 0xf1, 0x71, 0xfd, + 0xd6, 0x63, 0x63, 0x16, 0xef, 0x6e, 0x03, 0xa0, 0x75, 0x3b, 0xab, 0xe3, 0x8b, 0x4c, 0x0d, 0xaf, + 0xe8, 0x59, 0xc2, 0xab, 0xf9, 0x19, 0xd4, 0x50, 0x66, 0xf4, 0x45, 0x5f, 0xfd, 0xee, 0xe6, 0xd4, + 0xef, 0x26, 0x41, 0x16, 0x92, 0x69, 0x5d, 0x77, 0x08, 0xad, 0x9b, 0x85, 0xa9, 0x60, 0x67, 0x57, + 0x56, 0xae, 0x80, 0x13, 0x9e, 0xaf, 0x68, 0xb5, 0x5c, 0x5e, 0xac, 0x37, 0x37, 0xd6, 0x97, 0xd5, + 0xe2, 0x62, 0xb9, 0x00, 0xae, 0x7e, 0x52, 0xbd, 0xf4, 0x5d, 0x3c, 0xb3, 0xe8, 0x2f, 0x24, 0xc8, + 0x91, 0x83, 0x78, 0xe8, 0xa7, 0x47, 0xa4, 0x39, 0x36, 0xe7, 0x19, 0xe3, 0x8f, 0xbb, 0xe2, 0x31, + 0xbe, 0x99, 0x30, 0x09, 0x57, 0x07, 0x8a, 0xf1, 0x1d, 0x43, 0x28, 0xfd, 0x69, 0x8d, 0xdb, 0x24, + 0xeb, 0xdb, 0xe6, 0xc5, 0x1f, 0xe6, 0x26, 0xe9, 0xd6, 0xff, 0x90, 0x9b, 0x64, 0x1f, 0x16, 0xc6, + 0xde, 0x24, 0xfb, 0xb4, 0xbb, 0x98, 0x66, 0x8a, 0x9e, 0x95, 0xf3, 0xe7, 0x7f, 0xcf, 0x91, 0x0e, + 0xb4, 0x91, 0x55, 0x84, 0x59, 0xdd, 0x70, 0xb0, 0x65, 0x68, 0x9d, 0xa5, 0x8e, 0xb6, 0xe5, 0xd9, + 0xa7, 0xbd, 0xbb, 0x17, 0x95, 0x50, 0x1e, 0x95, 0xff, 0x43, 0x39, 0x0d, 0xe0, 0xe0, 0x9d, 0x6e, + 0x47, 0x73, 0x02, 0xd5, 0x0b, 0xa5, 0x84, 0xb5, 0x2f, 0xcb, 0x6b, 0xdf, 0x2d, 0x70, 0x19, 0x05, + 0xad, 0x71, 0xa9, 0x8b, 0x37, 0x0c, 0xfd, 0x67, 0x76, 0x49, 0xe8, 0x49, 0xaa, 0xa3, 0xfd, 0x3e, + 0x71, 0xdb, 0x39, 0xf9, 0x9e, 0xed, 0x9c, 0x7f, 0x14, 0x0e, 0x69, 0xe1, 0xb5, 0xfa, 0x01, 0x21, + 0x2d, 0xfc, 0x96, 0x26, 0xf7, 0xb4, 0x34, 0x7f, 0x91, 0x25, 0x2b, 0xb0, 0xc8, 0x12, 0x46, 0x25, + 0x27, 0xb8, 0x40, 0xf9, 0x2a, 0xa1, 0x98, 0x19, 0x71, 0xd5, 0x18, 0xc3, 0x02, 0xb8, 0x0c, 0x73, + 0xb4, 0xe8, 0x05, 0xd3, 0xbc, 0xb0, 0xa3, 0x59, 0x17, 0x90, 0x75, 0x20, 0x55, 0x8c, 0xdd, 0x4b, + 0x8a, 0xdc, 0x20, 0xfd, 0xa4, 0xf0, 0x9c, 0x81, 0x13, 0x97, 0xc7, 0xf3, 0x78, 0x36, 0x93, 0x5e, + 0x2f, 0x34, 0x85, 0x10, 0x61, 0x30, 0x7d, 0x5c, 0xff, 0xd8, 0xc7, 0xd5, 0xeb, 0xe8, 0xc3, 0xeb, + 0xf0, 0xa3, 0xc4, 0x15, 0x7d, 0x69, 0x38, 0xec, 0x3c, 0xbe, 0x86, 0xc0, 0xae, 0x00, 0xf2, 0x05, + 0xdf, 0xf5, 0xc7, 0x7d, 0x0c, 0x57, 0x28, 0x9b, 0x1e, 0x9a, 0x11, 0x2c, 0x8f, 0x05, 0xcd, 0xe3, + 0x3c, 0x0b, 0xb5, 0x6e, 0xaa, 0x98, 0x7e, 0x41, 0x78, 0x7f, 0xab, 0xaf, 0x80, 0x28, 0x77, 0xe3, + 0x69, 0x95, 0x62, 0x9b, 0x63, 0xe2, 0x6c, 0xa6, 0x8f, 0xe6, 0x43, 0x39, 0x98, 0xf2, 0x82, 0x8e, + 0x90, 0x3b, 0x71, 0x7c, 0x0c, 0x4f, 0x42, 0xde, 0x36, 0x77, 0xad, 0x16, 0x66, 0x3b, 0x8e, 0xec, + 0x6d, 0x88, 0xdd, 0xb1, 0x81, 0xe3, 0xf9, 0x3e, 0x93, 0x21, 0x9b, 0xd8, 0x64, 0x88, 0x36, 0x48, + 0xe3, 0x06, 0xf8, 0xe7, 0x0b, 0x07, 0x32, 0xe7, 0x30, 0xab, 0x63, 0xe7, 0xd1, 0x38, 0xc6, 0xff, + 0xa1, 0xd0, 0xde, 0xcb, 0x80, 0x9a, 0x24, 0x53, 0xb9, 0xda, 0x10, 0x86, 0xea, 0x95, 0x70, 0xb9, + 0x97, 0x83, 0x59, 0xa8, 0xc4, 0x22, 0xdd, 0x50, 0x57, 0x0b, 0x32, 0x7a, 0x76, 0x16, 0x0a, 0x94, + 0xb5, 0x9a, 0x6f, 0xac, 0xa1, 0x17, 0x65, 0x0e, 0xdb, 0x22, 0x8d, 0x9e, 0x62, 0x7e, 0x5a, 0x12, + 0x0d, 0x96, 0xca, 0x09, 0x3e, 0xa8, 0x5d, 0x84, 0x26, 0x0d, 0xd1, 0xcc, 0x62, 0x94, 0x0f, 0xfd, + 0x76, 0x46, 0x24, 0xf6, 0xaa, 0x18, 0x8b, 0xe9, 0xf7, 0x4a, 0x9f, 0xcb, 0x7a, 0xb1, 0xa3, 0x96, + 0x2c, 0x73, 0x67, 0xc3, 0xea, 0xa0, 0xff, 0x53, 0x28, 0xb4, 0x75, 0x84, 0xf9, 0x2f, 0x45, 0x9b, + 0xff, 0x64, 0xc9, 0xb8, 0x13, 0xec, 0x55, 0x75, 0x86, 0x18, 0xbe, 0x95, 0xeb, 0x61, 0x4e, 0x6b, + 0xb7, 0xd7, 0xb5, 0x2d, 0x5c, 0x72, 0xe7, 0xd5, 0x86, 0xc3, 0xe2, 0xca, 0xf4, 0xa4, 0xc6, 0x76, + 0x45, 0xe2, 0xeb, 0xa0, 0x1c, 0x48, 0x4c, 0x3e, 0x63, 0x19, 0xde, 0xdc, 0x21, 0xa1, 0xb5, 0xad, + 0x05, 0x51, 0xae, 0xd8, 0x9b, 0xa0, 0x67, 0x93, 0x00, 0xdf, 0xe9, 0x6b, 0xd6, 0xef, 0x4b, 0x30, + 0xe1, 0xca, 0xbb, 0xd8, 0x6e, 0xa3, 0xc7, 0x72, 0xc1, 0xe0, 0x22, 0x7d, 0xcb, 0x7e, 0x51, 0xd8, + 0xa9, 0xcf, 0xab, 0x21, 0xa5, 0x1f, 0x81, 0x49, 0x20, 0x44, 0x89, 0x13, 0xa2, 0x98, 0xef, 0x5e, + 0x6c, 0x11, 0xe9, 0x8b, 0xef, 0xe3, 0x12, 0xcc, 0x7a, 0xf3, 0x88, 0x25, 0xec, 0xb4, 0xb6, 0xd1, + 0x6d, 0xa2, 0x0b, 0x4d, 0xac, 0xa5, 0xf9, 0x7b, 0xb2, 0x1d, 0xf4, 0xbd, 0x4c, 0x42, 0x95, 0xe7, + 0x4a, 0x8e, 0x58, 0xa5, 0x4b, 0xa4, 0x8b, 0x71, 0x04, 0xd3, 0x17, 0xe6, 0x17, 0x25, 0x80, 0x86, + 0xe9, 0xcf, 0x75, 0x0f, 0x20, 0xc9, 0x17, 0x08, 0x6f, 0xd7, 0xb2, 0x8a, 0x07, 0xc5, 0x26, 0xef, + 0x39, 0x04, 0x5d, 0x93, 0x06, 0x95, 0x34, 0x96, 0xb6, 0x3e, 0xb5, 0xb8, 0xdb, 0xed, 0xe8, 0x2d, + 0xcd, 0xe9, 0xf5, 0xa7, 0x8b, 0x16, 0x2f, 0xb9, 0x30, 0x32, 0x91, 0x51, 0xe8, 0x97, 0x11, 0x21, + 0x4b, 0x1a, 0xa4, 0x44, 0xf2, 0x82, 0x94, 0x08, 0xfa, 0xc8, 0x0c, 0x20, 0x3e, 0x06, 0xf5, 0x94, + 0xe1, 0x68, 0xad, 0x8b, 0x8d, 0x05, 0x0b, 0x6b, 0xed, 0x96, 0xb5, 0xbb, 0x73, 0xde, 0x0e, 0x3b, + 0x83, 0xc6, 0xeb, 0x68, 0x68, 0xe9, 0x58, 0xe2, 0x96, 0x8e, 0xd1, 0x2f, 0xc8, 0xa2, 0x21, 0x73, + 0x42, 0x1b, 0x1c, 0x21, 0x1e, 0x86, 0x18, 0xea, 0x12, 0xb9, 0x30, 0xf5, 0xac, 0x12, 0x67, 0x93, + 0xac, 0x12, 0xbf, 0x41, 0x28, 0x00, 0x8f, 0x50, 0xbd, 0xc6, 0xe2, 0x89, 0x36, 0x57, 0xc7, 0x4e, + 0x04, 0xbc, 0xd7, 0xc1, 0xec, 0xf9, 0xe0, 0x8b, 0x0f, 0x31, 0x9f, 0xd8, 0xc7, 0x3f, 0xf4, 0x8d, + 0x49, 0x57, 0x60, 0x78, 0x16, 0x22, 0xd0, 0xf5, 0x11, 0x94, 0x44, 0x9c, 0xd0, 0x12, 0x2d, 0xa7, + 0xc4, 0x96, 0x9f, 0x3e, 0x0a, 0x1f, 0x92, 0x60, 0x9a, 0x5c, 0x83, 0xb9, 0x70, 0x89, 0x9c, 0x6a, + 0x14, 0x34, 0x4a, 0x1e, 0x0a, 0x8b, 0x59, 0x81, 0x6c, 0x47, 0x37, 0x2e, 0x78, 0xde, 0x83, 0xee, + 0x73, 0x70, 0xa9, 0x9a, 0xd4, 0xe7, 0x52, 0x35, 0x7f, 0x9f, 0xc2, 0x2f, 0xf7, 0x40, 0xb7, 0xfc, + 0x0e, 0x24, 0x97, 0xbe, 0x18, 0xff, 0x3e, 0x0b, 0xf9, 0x3a, 0xd6, 0xac, 0xd6, 0x36, 0x7a, 0x97, + 0xd4, 0x77, 0xaa, 0x30, 0xc9, 0x4f, 0x15, 0x96, 0x60, 0x62, 0x53, 0xef, 0x38, 0xd8, 0xa2, 0x1e, + 0xd5, 0xe1, 0xae, 0x9d, 0x36, 0xf1, 0x85, 0x8e, 0xd9, 0xba, 0x30, 0xcf, 0x4c, 0xf7, 0x79, 0x2f, + 0x08, 0xe7, 0xfc, 0x12, 0xf9, 0x49, 0xf5, 0x7e, 0x76, 0x0d, 0x42, 0xdb, 0xb4, 0x9c, 0xa8, 0xfb, + 0x15, 0x22, 0xa8, 0xd4, 0x4d, 0xcb, 0x51, 0xe9, 0x8f, 0x2e, 0xcc, 0x9b, 0xbb, 0x9d, 0x4e, 0x03, + 0x3f, 0xe0, 0x78, 0xd3, 0x36, 0xef, 0xdd, 0x35, 0x16, 0xcd, 0xcd, 0x4d, 0x1b, 0xd3, 0x45, 0x83, + 0x9c, 0xca, 0xde, 0x94, 0xe3, 0x90, 0xeb, 0xe8, 0x3b, 0x3a, 0x9d, 0x68, 0xe4, 0x54, 0xfa, 0xa2, + 0xdc, 0x08, 0x85, 0x60, 0x8e, 0x43, 0x19, 0x3d, 0x95, 0x27, 0x4d, 0x73, 0x5f, 0xba, 0xab, 0x33, + 0x17, 0xf0, 0x25, 0xfb, 0xd4, 0x04, 0xf9, 0x4e, 0x9e, 0xf9, 0xe3, 0x2b, 0x22, 0xfb, 0x1d, 0x54, + 0xe2, 0xd1, 0x33, 0x58, 0x0b, 0xb7, 0x4c, 0xab, 0xed, 0xc9, 0x26, 0x7a, 0x82, 0xc1, 0xf2, 0x25, + 0xdb, 0xa5, 0xe8, 0x5b, 0x78, 0xfa, 0x9a, 0xf6, 0xf6, 0xbc, 0xdb, 0x6d, 0xba, 0x45, 0x9f, 0xd3, + 0x9d, 0xed, 0x35, 0xec, 0x68, 0xe8, 0xef, 0xe5, 0xbe, 0x1a, 0x37, 0xfd, 0xff, 0x69, 0xdc, 0x00, + 0x8d, 0xa3, 0xe1, 0x95, 0x9c, 0x5d, 0xcb, 0x70, 0xe5, 0xc8, 0xbc, 0x52, 0x43, 0x29, 0xca, 0x1d, + 0x70, 0x45, 0xf0, 0xe6, 0x2d, 0x95, 0x2e, 0xb2, 0x69, 0xeb, 0x14, 0xc9, 0x1e, 0x9d, 0x41, 0x59, + 0x87, 0x6b, 0xe9, 0xc7, 0x95, 0xc6, 0xda, 0xea, 0x8a, 0xbe, 0xb5, 0xdd, 0xd1, 0xb7, 0xb6, 0x1d, + 0xbb, 0x62, 0xd8, 0x0e, 0xd6, 0xda, 0xb5, 0x4d, 0x95, 0xde, 0x8c, 0x02, 0x84, 0x8e, 0x48, 0x56, + 0xde, 0xe3, 0x5a, 0x6c, 0x74, 0x0b, 0x6b, 0x4a, 0x44, 0x4b, 0x79, 0x8a, 0xdb, 0x52, 0xec, 0xdd, + 0x8e, 0x8f, 0xe9, 0x55, 0x3d, 0x98, 0x06, 0xaa, 0xbe, 0xdb, 0x21, 0xcd, 0x85, 0x64, 0x4e, 0x3a, + 0xce, 0xc5, 0x70, 0x92, 0x7e, 0xb3, 0xf9, 0x7f, 0xf2, 0x90, 0x5b, 0xb6, 0xb4, 0xee, 0x36, 0x7a, + 0x76, 0xa8, 0x7f, 0x1e, 0x55, 0x9b, 0xf0, 0xb5, 0x53, 0x1a, 0xa4, 0x9d, 0xf2, 0x00, 0xed, 0xcc, + 0x86, 0xb4, 0x33, 0x7a, 0x51, 0xf9, 0x0c, 0xcc, 0xb4, 0xcc, 0x4e, 0x07, 0xb7, 0x5c, 0x79, 0x54, + 0xda, 0x64, 0x35, 0x67, 0x4a, 0xe5, 0xd2, 0x48, 0xa0, 0x62, 0xec, 0xd4, 0xe9, 0x1a, 0x3a, 0x55, + 0xfa, 0x20, 0x01, 0xbd, 0x48, 0x82, 0x6c, 0xb9, 0xbd, 0x85, 0xb9, 0x75, 0xf6, 0x4c, 0x68, 0x9d, + 0xfd, 0x24, 0xe4, 0x1d, 0xcd, 0xda, 0xc2, 0x8e, 0xb7, 0x4e, 0x40, 0xdf, 0xfc, 0xf8, 0xc9, 0x72, + 0x28, 0x7e, 0xf2, 0x8f, 0x43, 0xd6, 0x95, 0x19, 0x73, 0x32, 0xbf, 0xb6, 0x1f, 0xfc, 0x44, 0xf6, + 0xf3, 0x6e, 0x89, 0xf3, 0x6e, 0xad, 0x55, 0xf2, 0x43, 0x2f, 0xd6, 0xb9, 0x7d, 0x58, 0x93, 0x4b, + 0x1e, 0x5b, 0xa6, 0x51, 0xd9, 0xd1, 0xb6, 0x30, 0xab, 0x66, 0x90, 0xe0, 0x7d, 0x2d, 0xef, 0x98, + 0xf7, 0xeb, 0x2c, 0x94, 0x71, 0x90, 0xe0, 0x56, 0x61, 0x5b, 0x6f, 0xb7, 0xb1, 0xc1, 0x5a, 0x36, + 0x7b, 0x3b, 0x73, 0x1a, 0xb2, 0x2e, 0x0f, 0xae, 0xfe, 0xb8, 0xc6, 0x42, 0xe1, 0x88, 0x32, 0xe3, + 0x36, 0x2b, 0xda, 0x78, 0x0b, 0x19, 0x7e, 0x4d, 0x55, 0xc4, 0x6d, 0x87, 0x56, 0xae, 0x7f, 0xe3, + 0x7a, 0x02, 0xe4, 0x0c, 0xb3, 0x8d, 0x07, 0x0e, 0x42, 0x34, 0x97, 0xf2, 0x64, 0xc8, 0xe1, 0xb6, + 0xdb, 0x2b, 0xc8, 0x24, 0xfb, 0xe9, 0x78, 0x59, 0xaa, 0x34, 0x73, 0x32, 0xdf, 0xa0, 0x7e, 0xdc, + 0xa6, 0xdf, 0x00, 0x7f, 0x79, 0x02, 0x8e, 0xd2, 0x3e, 0xa0, 0xbe, 0x7b, 0xde, 0x25, 0x75, 0x1e, + 0xa3, 0x47, 0xfa, 0x0f, 0x5c, 0x47, 0x79, 0x65, 0x3f, 0x0e, 0x39, 0x7b, 0xf7, 0xbc, 0x6f, 0x84, + 0xd2, 0x97, 0x70, 0xd3, 0x95, 0x46, 0x32, 0x9c, 0xc9, 0xc3, 0x0e, 0x67, 0xdc, 0xd0, 0x24, 0x7b, + 0x8d, 0x3f, 0x18, 0xc8, 0xe8, 0xf1, 0x08, 0x6f, 0x20, 0xeb, 0x37, 0x0c, 0x9d, 0x82, 0x09, 0x6d, + 0xd3, 0xc1, 0x56, 0x60, 0x26, 0xb2, 0x57, 0x77, 0xa8, 0x3c, 0x8f, 0x37, 0x4d, 0xcb, 0x15, 0xcb, + 0x14, 0x1d, 0x2a, 0xbd, 0xf7, 0x50, 0xcb, 0x05, 0x6e, 0x87, 0xec, 0x26, 0x38, 0x66, 0x98, 0x8b, + 0xb8, 0xcb, 0xe4, 0x4c, 0x51, 0x9c, 0x25, 0x2d, 0x60, 0xff, 0x87, 0x7d, 0x5d, 0xc9, 0xdc, 0xfe, + 0xae, 0x04, 0x7d, 0x2a, 0xe9, 0x9c, 0xb9, 0x07, 0xe8, 0x91, 0x59, 0x68, 0xca, 0xd3, 0x60, 0xa6, + 0xcd, 0x5c, 0xb4, 0x5a, 0xba, 0xdf, 0x4a, 0x22, 0xff, 0xe3, 0x32, 0x07, 0x8a, 0x94, 0x0d, 0x2b, + 0xd2, 0x32, 0x4c, 0x92, 0x83, 0xcc, 0xae, 0x26, 0xe5, 0x7a, 0x5c, 0xe2, 0xc9, 0xb4, 0xce, 0xaf, + 0x54, 0x48, 0x6c, 0xf3, 0x25, 0xf6, 0x8b, 0xea, 0xff, 0x9c, 0x6c, 0xf6, 0x1d, 0x2f, 0xa1, 0xf4, + 0x9b, 0xe3, 0xef, 0xe4, 0xe1, 0x8a, 0x92, 0x65, 0xda, 0x36, 0x39, 0x03, 0xd3, 0xdb, 0x30, 0x5f, + 0x27, 0x71, 0x37, 0x29, 0x3c, 0xaa, 0x9b, 0x5f, 0xbf, 0x06, 0x35, 0xbe, 0xa6, 0xf1, 0x55, 0xe1, + 0x10, 0x30, 0xfe, 0xfe, 0x43, 0x84, 0xd0, 0x7f, 0x38, 0x1a, 0xc9, 0xdb, 0x33, 0x22, 0x51, 0x69, + 0x12, 0xca, 0x2a, 0xfd, 0xe6, 0xf2, 0x05, 0x09, 0xae, 0xec, 0xe5, 0x66, 0xc3, 0xb0, 0xfd, 0x06, + 0x73, 0xf5, 0x80, 0xf6, 0xc2, 0x47, 0x31, 0x89, 0xbd, 0xc3, 0x30, 0xa2, 0xee, 0xa1, 0xd2, 0x22, + 0x16, 0x4b, 0x82, 0x13, 0x35, 0x71, 0x77, 0x18, 0x26, 0x26, 0x9f, 0xbe, 0x70, 0x3f, 0x9d, 0x85, + 0xa3, 0xcb, 0x96, 0xb9, 0xdb, 0xb5, 0x83, 0x1e, 0xe8, 0x6f, 0xfa, 0x6f, 0xb8, 0xe6, 0x45, 0x4c, + 0x83, 0x6b, 0x60, 0xda, 0x62, 0xd6, 0x5c, 0xb0, 0xfd, 0x1a, 0x4e, 0x0a, 0xf7, 0x5e, 0xf2, 0x41, + 0x7a, 0xaf, 0xa0, 0x9f, 0xc9, 0x72, 0xfd, 0x4c, 0x6f, 0xcf, 0x91, 0xeb, 0xd3, 0x73, 0xfc, 0xb5, + 0x94, 0x70, 0x50, 0xed, 0x11, 0x51, 0x44, 0x7f, 0x51, 0x82, 0xfc, 0x16, 0xc9, 0xc8, 0xba, 0x8b, + 0xc7, 0x8b, 0xd5, 0x8c, 0x10, 0x57, 0xd9, 0xaf, 0x81, 0x5c, 0xe5, 0xb0, 0x0e, 0x27, 0x1a, 0xe0, + 0xe2, 0xb9, 0x4d, 0x5f, 0xa9, 0x1e, 0xce, 0xc2, 0x8c, 0x5f, 0x7a, 0xa5, 0x6d, 0xa3, 0x87, 0xfa, + 0x6b, 0xd4, 0xac, 0x88, 0x46, 0xed, 0x5b, 0x67, 0xf6, 0x47, 0x1d, 0x39, 0x34, 0xea, 0xf4, 0x1d, + 0x5d, 0x66, 0x22, 0x46, 0x17, 0xf4, 0x2c, 0x59, 0xf4, 0x2e, 0x22, 0xbe, 0x6b, 0x25, 0xb5, 0x79, + 0x34, 0x0f, 0x16, 0x82, 0x37, 0x22, 0x0d, 0xae, 0x55, 0xfa, 0x4a, 0xf2, 0x5e, 0x09, 0x8e, 0xed, + 0xef, 0xcc, 0x7f, 0x84, 0xf7, 0x42, 0x73, 0xeb, 0x64, 0xfb, 0x5e, 0x68, 0xe4, 0x8d, 0xdf, 0xa4, + 0x8b, 0x0d, 0x29, 0xc2, 0xd9, 0x7b, 0x83, 0x3b, 0x71, 0xb1, 0xa0, 0x21, 0x82, 0x44, 0xd3, 0x17, + 0xe0, 0xaf, 0xcb, 0x30, 0x55, 0xc7, 0xce, 0xaa, 0x76, 0xc9, 0xdc, 0x75, 0x90, 0x26, 0xba, 0x3d, + 0xf7, 0x54, 0xc8, 0x77, 0xc8, 0x2f, 0xec, 0x8a, 0xf7, 0x6b, 0xfa, 0xee, 0x6f, 0x11, 0xdf, 0x1f, + 0x4a, 0x5a, 0x65, 0xf9, 0xf9, 0x58, 0x2e, 0x22, 0xbb, 0xa3, 0x3e, 0x77, 0x23, 0xd9, 0xda, 0x49, + 0xb4, 0x77, 0x1a, 0x55, 0x74, 0xfa, 0xb0, 0xfc, 0x82, 0x0c, 0xb3, 0x75, 0xec, 0x54, 0xec, 0x25, + 0x6d, 0xcf, 0xb4, 0x74, 0x07, 0x87, 0xef, 0x78, 0x8c, 0x87, 0xe6, 0x34, 0x80, 0xee, 0xff, 0xc6, + 0x22, 0x4c, 0x85, 0x52, 0xd0, 0x6f, 0x27, 0x75, 0x14, 0xe2, 0xf8, 0x18, 0x09, 0x08, 0x89, 0x7c, + 0x2c, 0xe2, 0x8a, 0x4f, 0x1f, 0x88, 0xcf, 0x4b, 0x0c, 0x88, 0xa2, 0xd5, 0xda, 0xd6, 0xf7, 0x70, + 0x3b, 0x21, 0x10, 0xde, 0x6f, 0x01, 0x10, 0x3e, 0xa1, 0xc4, 0xee, 0x2b, 0x1c, 0x1f, 0xa3, 0x70, + 0x5f, 0x89, 0x23, 0x38, 0x96, 0x20, 0x51, 0x6e, 0xd7, 0xc3, 0xd6, 0x33, 0xef, 0x12, 0x15, 0x6b, + 0x60, 0xb2, 0x49, 0x61, 0x93, 0x6d, 0xa8, 0x8e, 0x85, 0x96, 0x3d, 0x48, 0xa7, 0xb3, 0x69, 0x74, + 0x2c, 0x7d, 0x8b, 0x4e, 0x5f, 0xe8, 0xef, 0x94, 0xe1, 0x84, 0x1f, 0x3d, 0xa5, 0x8e, 0x9d, 0x45, + 0xcd, 0xde, 0x3e, 0x6f, 0x6a, 0x56, 0x3b, 0x7c, 0xf5, 0xff, 0xd0, 0x27, 0xfe, 0xd0, 0xe7, 0xc2, + 0x20, 0x54, 0x79, 0x10, 0xfa, 0xba, 0x8a, 0xf6, 0xe5, 0x65, 0x14, 0x9d, 0x4c, 0xac, 0x37, 0xeb, + 0xef, 0xfa, 0x60, 0xfd, 0x04, 0x07, 0xd6, 0x9d, 0xc3, 0xb2, 0x98, 0x3e, 0x70, 0xbf, 0x45, 0x47, + 0x84, 0x90, 0x57, 0xf3, 0x7d, 0xa2, 0x80, 0x45, 0x78, 0xb5, 0xca, 0x91, 0x5e, 0xad, 0x43, 0x8d, + 0x11, 0x03, 0x3d, 0x92, 0xd3, 0x1d, 0x23, 0x0e, 0xd1, 0xdb, 0xf8, 0xad, 0x32, 0x14, 0x48, 0xf8, + 0xac, 0x90, 0xc7, 0x37, 0xba, 0x5f, 0x14, 0x9d, 0x7d, 0xde, 0xe5, 0x13, 0x49, 0xbd, 0xcb, 0xd1, + 0x5b, 0x92, 0xfa, 0x90, 0xf7, 0x72, 0x3b, 0x12, 0xc4, 0x12, 0xb9, 0x88, 0x0f, 0xe0, 0x20, 0x7d, + 0xd0, 0xfe, 0x9b, 0x0c, 0xe0, 0x36, 0x68, 0x76, 0xf6, 0xe1, 0x19, 0xa2, 0x70, 0xdd, 0x1c, 0xf6, + 0xab, 0x77, 0x81, 0x3a, 0xd1, 0x03, 0x14, 0xa5, 0x18, 0x9c, 0xaa, 0x78, 0x24, 0xa9, 0x6f, 0x65, + 0xc0, 0xd5, 0x48, 0x60, 0x49, 0xe4, 0x6d, 0x19, 0x59, 0x76, 0xfa, 0x80, 0xfc, 0x0f, 0x09, 0x72, + 0x0d, 0xb3, 0x8e, 0x9d, 0x83, 0x9b, 0x02, 0x89, 0x8f, 0xed, 0x93, 0x72, 0x47, 0x71, 0x6c, 0xbf, + 0x1f, 0xa1, 0x31, 0x44, 0x23, 0x93, 0x60, 0xa6, 0x61, 0x96, 0xfc, 0xc5, 0x29, 0x71, 0x5f, 0x55, + 0xf1, 0xfb, 0x94, 0xfd, 0x0a, 0x06, 0xc5, 0x1c, 0xe8, 0x3e, 0xe5, 0xc1, 0xf4, 0xd2, 0x97, 0xdb, + 0x6d, 0x70, 0x74, 0xc3, 0x68, 0x9b, 0x2a, 0x6e, 0x9b, 0x6c, 0xa5, 0x5b, 0x51, 0x20, 0xbb, 0x6b, + 0xb4, 0x4d, 0xc2, 0x72, 0x4e, 0x25, 0xcf, 0x6e, 0x9a, 0x85, 0xdb, 0x26, 0xf3, 0x0d, 0x20, 0xcf, + 0xe8, 0xab, 0x32, 0x64, 0xdd, 0x7f, 0xc5, 0x45, 0xfd, 0x56, 0x39, 0x61, 0x20, 0x02, 0x97, 0xfc, + 0x48, 0x2c, 0xa1, 0xbb, 0x42, 0x6b, 0xff, 0xd4, 0x83, 0xf5, 0xda, 0xa8, 0xf2, 0x42, 0xa2, 0x08, + 0xd6, 0xfc, 0x95, 0x53, 0x30, 0x71, 0xbe, 0x63, 0xb6, 0x2e, 0x04, 0xe7, 0xe5, 0xd9, 0xab, 0x72, + 0x23, 0xe4, 0x2c, 0xcd, 0xd8, 0xc2, 0x6c, 0x4f, 0xe1, 0x78, 0x4f, 0x5f, 0x48, 0xbc, 0x5e, 0x54, + 0x9a, 0x05, 0xbd, 0x25, 0x49, 0x08, 0x84, 0x3e, 0x95, 0x4f, 0xa6, 0x0f, 0x8b, 0x43, 0x9c, 0x2c, + 0x2b, 0xc0, 0x4c, 0xa9, 0x48, 0x6f, 0x2e, 0x5f, 0xab, 0x9d, 0x2d, 0x17, 0x64, 0x02, 0xb3, 0x2b, + 0x93, 0x14, 0x61, 0x76, 0xc9, 0xff, 0xd0, 0xc2, 0xdc, 0xa7, 0xf2, 0x87, 0x01, 0xf3, 0xc7, 0x25, + 0x98, 0x5d, 0xd5, 0x6d, 0x27, 0xca, 0xdb, 0x3f, 0x26, 0x7a, 0xee, 0xf3, 0x93, 0x9a, 0xca, 0x5c, + 0x39, 0xc2, 0x61, 0x73, 0x13, 0x99, 0xc3, 0x71, 0x45, 0x8c, 0xe7, 0x58, 0x0a, 0xe1, 0x80, 0xde, + 0x36, 0x2c, 0x2c, 0xc9, 0xc4, 0x86, 0x52, 0x50, 0xc8, 0xf8, 0x0d, 0xa5, 0xc8, 0xb2, 0xd3, 0x97, + 0xef, 0x57, 0x25, 0x38, 0xe6, 0x16, 0x1f, 0xb7, 0x2c, 0x15, 0x2d, 0xe6, 0x81, 0xcb, 0x52, 0x89, + 0x57, 0xc6, 0xf7, 0xf1, 0x32, 0x8a, 0x95, 0xf1, 0x41, 0x44, 0xc7, 0x2c, 0xe6, 0x88, 0x65, 0xd8, + 0x41, 0x62, 0x8e, 0x59, 0x86, 0x1d, 0x5e, 0xcc, 0xf1, 0x4b, 0xb1, 0x43, 0x8a, 0xf9, 0xd0, 0x16, + 0x58, 0x5f, 0x23, 0xfb, 0x62, 0x8e, 0x5c, 0xdb, 0x88, 0x11, 0x73, 0xe2, 0x13, 0xbb, 0xe8, 0x6d, + 0x43, 0x0a, 0x7e, 0xc4, 0xeb, 0x1b, 0xc3, 0xc0, 0x74, 0x88, 0x6b, 0x1c, 0x2f, 0x96, 0x61, 0x8e, + 0x71, 0xd1, 0x7f, 0xca, 0x1c, 0x83, 0x51, 0xe2, 0x29, 0x73, 0xe2, 0x33, 0x40, 0x3c, 0x67, 0xe3, + 0x3f, 0x03, 0x14, 0x5b, 0x7e, 0xfa, 0xe0, 0x7c, 0x2d, 0x0b, 0x27, 0x5d, 0x16, 0xd6, 0xcc, 0xb6, + 0xbe, 0x79, 0x89, 0x72, 0x71, 0x56, 0xeb, 0xec, 0x62, 0x1b, 0xbd, 0x5b, 0x12, 0x45, 0xe9, 0x3f, + 0x01, 0x98, 0x5d, 0x6c, 0xd1, 0x40, 0x6a, 0x0c, 0xa8, 0x3b, 0xa2, 0x2a, 0xbb, 0xbf, 0x24, 0xff, + 0x32, 0x99, 0x9a, 0x47, 0x44, 0x0d, 0xd1, 0x73, 0xad, 0xc2, 0x29, 0xff, 0x4b, 0xaf, 0x83, 0x47, + 0x66, 0xbf, 0x83, 0xc7, 0x0d, 0x20, 0x6b, 0xed, 0xb6, 0x0f, 0x55, 0xef, 0x66, 0x36, 0x29, 0x53, + 0x75, 0xb3, 0xb8, 0x39, 0x6d, 0x1c, 0x1c, 0xcd, 0x8b, 0xc8, 0x69, 0x63, 0x47, 0x99, 0x87, 0x3c, + 0xbd, 0x79, 0xd9, 0x5f, 0xd1, 0xef, 0x9f, 0x99, 0xe5, 0xe2, 0x4d, 0xbb, 0x1a, 0xaf, 0x86, 0xb7, + 0x25, 0x92, 0x4c, 0xbf, 0x7e, 0x3a, 0xb0, 0x93, 0x55, 0x4e, 0xc1, 0x9e, 0x3e, 0x34, 0xe5, 0xf1, + 0xec, 0x86, 0x15, 0xbb, 0xdd, 0xce, 0xa5, 0x06, 0x0b, 0xbe, 0x92, 0x68, 0x37, 0x2c, 0x14, 0xc3, + 0x45, 0xea, 0x8d, 0xe1, 0x92, 0x7c, 0x37, 0x8c, 0xe3, 0x63, 0x14, 0xbb, 0x61, 0x71, 0x04, 0xd3, + 0x17, 0xed, 0x9b, 0x72, 0xd4, 0x6a, 0x66, 0xb1, 0xfd, 0xff, 0xa8, 0xff, 0x21, 0x34, 0xe0, 0x9d, + 0x5d, 0xfa, 0x85, 0xfd, 0x8f, 0xbd, 0xd3, 0x44, 0x79, 0x32, 0xe4, 0x37, 0x4d, 0x6b, 0x47, 0xf3, + 0x36, 0xee, 0x7b, 0x4f, 0x8a, 0xb0, 0x78, 0xfa, 0x4b, 0x24, 0x8f, 0xca, 0xf2, 0xba, 0xf3, 0x91, + 0x67, 0xea, 0x5d, 0x16, 0x75, 0xd1, 0x7d, 0x54, 0xae, 0x83, 0x59, 0x16, 0x7c, 0xb1, 0x8a, 0x6d, + 0x07, 0xb7, 0x59, 0xc4, 0x0a, 0x3e, 0x51, 0x39, 0x03, 0x33, 0x2c, 0x61, 0x49, 0xef, 0x60, 0x9b, + 0x05, 0xad, 0xe0, 0xd2, 0x94, 0x93, 0x90, 0xd7, 0xed, 0x7b, 0x6c, 0xd3, 0x20, 0xfe, 0xff, 0x93, + 0x2a, 0x7b, 0x53, 0x6e, 0x80, 0xa3, 0x2c, 0x9f, 0x6f, 0xac, 0xd2, 0x03, 0x3b, 0xbd, 0xc9, 0xae, + 0x6a, 0x19, 0xe6, 0xba, 0x65, 0x6e, 0x59, 0xd8, 0xb6, 0xc9, 0xa9, 0xa9, 0x49, 0x35, 0x94, 0x82, + 0x3e, 0x33, 0xcc, 0xc4, 0x22, 0xf1, 0x3d, 0x07, 0x2e, 0x4a, 0xbb, 0xad, 0x16, 0xc6, 0x6d, 0x76, + 0xf2, 0xc9, 0x7b, 0x4d, 0x78, 0x03, 0x42, 0xe2, 0x69, 0xc8, 0x21, 0x5d, 0x81, 0xf0, 0x81, 0x13, + 0x90, 0xa7, 0xd7, 0x89, 0xa1, 0x17, 0xce, 0xf5, 0x55, 0xd6, 0x39, 0x5e, 0x59, 0x37, 0x60, 0xc6, + 0x30, 0xdd, 0xe2, 0xd6, 0x35, 0x4b, 0xdb, 0xb1, 0xe3, 0x56, 0x19, 0x29, 0x5d, 0x7f, 0x48, 0xa9, + 0x86, 0x7e, 0x5b, 0x39, 0xa2, 0x72, 0x64, 0x94, 0xff, 0x1f, 0x1c, 0x3d, 0xcf, 0x22, 0x04, 0xd8, + 0x8c, 0xb2, 0x14, 0xed, 0x83, 0xd7, 0x43, 0x79, 0x81, 0xff, 0x73, 0xe5, 0x88, 0xda, 0x4b, 0x4c, + 0xf9, 0x29, 0x98, 0x73, 0x5f, 0xdb, 0xe6, 0x45, 0x8f, 0x71, 0x39, 0xda, 0x10, 0xe9, 0x21, 0xbf, + 0xc6, 0xfd, 0xb8, 0x72, 0x44, 0xed, 0x21, 0xa5, 0xd4, 0x00, 0xb6, 0x9d, 0x9d, 0x0e, 0x23, 0x9c, + 0x8d, 0x56, 0xc9, 0x1e, 0xc2, 0x2b, 0xfe, 0x4f, 0x2b, 0x47, 0xd4, 0x10, 0x09, 0x65, 0x15, 0xa6, + 0x9c, 0x07, 0x1c, 0x46, 0x2f, 0x17, 0xbd, 0xf9, 0xdd, 0x43, 0xaf, 0xe1, 0xfd, 0xb3, 0x72, 0x44, + 0x0d, 0x08, 0x28, 0x15, 0x98, 0xec, 0x9e, 0x67, 0xc4, 0xf2, 0x7d, 0xa2, 0xcd, 0xf7, 0x27, 0xb6, + 0x7e, 0xde, 0xa7, 0xe5, 0xff, 0xee, 0x32, 0xd6, 0xb2, 0xf7, 0x18, 0xad, 0x09, 0x61, 0xc6, 0x4a, + 0xde, 0x3f, 0x2e, 0x63, 0x3e, 0x01, 0xa5, 0x02, 0x53, 0xb6, 0xa1, 0x75, 0xed, 0x6d, 0xd3, 0xb1, + 0x4f, 0x4d, 0xf6, 0xf8, 0x49, 0x46, 0x53, 0xab, 0xb3, 0x7f, 0xd4, 0xe0, 0x6f, 0xe5, 0xc9, 0x70, + 0x62, 0x97, 0x5c, 0xcb, 0x5e, 0x7e, 0x40, 0xb7, 0x1d, 0xdd, 0xd8, 0xf2, 0x62, 0xcc, 0xd2, 0xde, + 0xa6, 0xff, 0x47, 0x65, 0x9e, 0x9d, 0x98, 0x02, 0xd2, 0x36, 0x51, 0xef, 0x66, 0x1d, 0x2d, 0x36, + 0x74, 0x50, 0xea, 0x69, 0x90, 0x75, 0x3f, 0x91, 0xde, 0x69, 0xae, 0xff, 0x42, 0x60, 0xaf, 0xee, + 0x90, 0x06, 0xec, 0xfe, 0xd4, 0xd3, 0xc1, 0xcd, 0xf4, 0x76, 0x70, 0x6e, 0x03, 0xd7, 0xed, 0x35, + 0x7d, 0x8b, 0x5a, 0x57, 0xcc, 0x1f, 0x3e, 0x9c, 0x44, 0x67, 0xa3, 0x55, 0x7c, 0x91, 0xde, 0xa0, + 0x71, 0xd4, 0x9b, 0x8d, 0x7a, 0x29, 0xe8, 0x7a, 0x98, 0x09, 0x37, 0x32, 0x7a, 0x27, 0xa9, 0x1e, + 0xd8, 0x66, 0xec, 0x0d, 0x5d, 0x07, 0x73, 0xbc, 0x4e, 0x87, 0x86, 0x20, 0xd9, 0xeb, 0x0a, 0xd1, + 0xb5, 0x70, 0xb4, 0xa7, 0x61, 0x79, 0x31, 0x47, 0x32, 0x41, 0xcc, 0x91, 0x6b, 0x00, 0x02, 0x2d, + 0xee, 0x4b, 0xe6, 0x6a, 0x98, 0xf2, 0xf5, 0xb2, 0x6f, 0x86, 0x2f, 0x67, 0x60, 0xd2, 0x53, 0xb6, + 0x7e, 0x19, 0xdc, 0xf1, 0xc7, 0x08, 0x6d, 0x30, 0xb0, 0x69, 0x38, 0x97, 0xe6, 0x8e, 0x33, 0x81, + 0x5b, 0x6f, 0x43, 0x77, 0x3a, 0xde, 0xd1, 0xb8, 0xde, 0x64, 0x65, 0x1d, 0x40, 0x27, 0x18, 0x35, + 0x82, 0xb3, 0x72, 0xb7, 0x24, 0x68, 0x0f, 0x54, 0x1f, 0x42, 0x34, 0xce, 0xfc, 0x08, 0x3b, 0xc8, + 0x36, 0x05, 0x39, 0x1a, 0x68, 0xfd, 0x88, 0x32, 0x07, 0x50, 0x7e, 0xc6, 0x7a, 0x59, 0xad, 0x94, + 0xab, 0xa5, 0x72, 0x21, 0x83, 0x5e, 0x22, 0xc1, 0x94, 0xdf, 0x08, 0xfa, 0x56, 0xb2, 0xcc, 0x54, + 0x6b, 0xe0, 0xb5, 0x8f, 0xfb, 0x1b, 0x55, 0x58, 0xc9, 0x9e, 0x0a, 0x97, 0xef, 0xda, 0x78, 0x49, + 0xb7, 0x6c, 0x47, 0x35, 0x2f, 0x2e, 0x99, 0x96, 0x1f, 0x55, 0x99, 0x45, 0x38, 0x8d, 0xfa, 0xec, + 0x5a, 0x1c, 0x6d, 0x4c, 0x0e, 0x4d, 0x61, 0x8b, 0xad, 0x1c, 0x07, 0x09, 0x2e, 0x5d, 0xc7, 0xd2, + 0x0c, 0xbb, 0x6b, 0xda, 0x58, 0x35, 0x2f, 0xda, 0x45, 0xa3, 0x5d, 0x32, 0x3b, 0xbb, 0x3b, 0x86, + 0xcd, 0x6c, 0x86, 0xa8, 0xcf, 0xae, 0x74, 0xc8, 0xa5, 0xae, 0x73, 0x00, 0xa5, 0xda, 0xea, 0x6a, + 0xb9, 0xd4, 0xa8, 0xd4, 0xaa, 0x85, 0x23, 0xae, 0xb4, 0x1a, 0xc5, 0x85, 0x55, 0x57, 0x3a, 0x3f, + 0x0d, 0x93, 0x5e, 0x9b, 0x66, 0x61, 0x52, 0x32, 0x5e, 0x98, 0x14, 0xa5, 0x08, 0x93, 0x5e, 0x2b, + 0x67, 0x23, 0xc2, 0x63, 0x7b, 0x8f, 0xc5, 0xee, 0x68, 0x96, 0x43, 0xfc, 0xa9, 0x3d, 0x22, 0x0b, + 0x9a, 0x8d, 0x55, 0xff, 0xb7, 0x33, 0x4f, 0x60, 0x1c, 0x28, 0x30, 0x57, 0x5c, 0x5d, 0x6d, 0xd6, + 0xd4, 0x66, 0xb5, 0xd6, 0x58, 0xa9, 0x54, 0x97, 0xe9, 0x08, 0x59, 0x59, 0xae, 0xd6, 0xd4, 0x32, + 0x1d, 0x20, 0xeb, 0x85, 0x0c, 0xbd, 0x54, 0x78, 0x61, 0x12, 0xf2, 0x5d, 0x22, 0x5d, 0xf4, 0x05, + 0x39, 0xe1, 0x79, 0x78, 0x1f, 0xa7, 0x88, 0x6b, 0x4f, 0x39, 0x9f, 0x74, 0xa9, 0xcf, 0x99, 0xd1, + 0x33, 0x30, 0x43, 0x6d, 0x3d, 0x9b, 0x2c, 0xef, 0x13, 0xe4, 0x64, 0x95, 0x4b, 0x43, 0x1f, 0x92, + 0x12, 0x1c, 0x92, 0xef, 0xcb, 0x51, 0x32, 0xe3, 0xe2, 0xcf, 0x33, 0xc3, 0x5d, 0x4b, 0x50, 0xa9, + 0x36, 0xca, 0x6a, 0xb5, 0xb8, 0xca, 0xb2, 0xc8, 0xca, 0x29, 0x38, 0x5e, 0xad, 0xb1, 0x98, 0x7f, + 0xf5, 0x66, 0xa3, 0xd6, 0xac, 0xac, 0xad, 0xd7, 0xd4, 0x46, 0x21, 0xa7, 0x9c, 0x04, 0x85, 0x3e, + 0x37, 0x2b, 0xf5, 0x66, 0xa9, 0x58, 0x2d, 0x95, 0x57, 0xcb, 0x8b, 0x85, 0xbc, 0xf2, 0x38, 0xb8, + 0x96, 0x5e, 0x73, 0x53, 0x5b, 0x6a, 0xaa, 0xb5, 0x73, 0x75, 0x17, 0x41, 0xb5, 0xbc, 0x5a, 0x74, + 0x15, 0x29, 0x74, 0xb9, 0xf0, 0x84, 0x72, 0x19, 0x1c, 0x25, 0x17, 0x87, 0xaf, 0xd6, 0x8a, 0x8b, + 0xac, 0xbc, 0x49, 0xe5, 0x2a, 0x38, 0x55, 0xa9, 0xd6, 0x37, 0x96, 0x96, 0x2a, 0xa5, 0x4a, 0xb9, + 0xda, 0x68, 0xae, 0x97, 0xd5, 0xb5, 0x4a, 0xbd, 0xee, 0xfe, 0x5b, 0x98, 0x22, 0x57, 0xb7, 0xd2, + 0x3e, 0x13, 0xbd, 0x4b, 0x86, 0xd9, 0xb3, 0x5a, 0x47, 0x77, 0x07, 0x0a, 0x72, 0xa7, 0x73, 0xcf, + 0x71, 0x12, 0x87, 0xdc, 0xfd, 0xcc, 0x1c, 0xd2, 0xc9, 0x0b, 0xfa, 0x79, 0x39, 0xe1, 0x71, 0x12, + 0x06, 0x04, 0x2d, 0x71, 0x9e, 0x2b, 0x2d, 0x62, 0xf2, 0xf3, 0x2a, 0x29, 0xc1, 0x71, 0x12, 0x71, + 0xf2, 0xc9, 0xc0, 0x7f, 0xe9, 0xa8, 0xc0, 0x2f, 0xc0, 0xcc, 0x46, 0xb5, 0xb8, 0xd1, 0x58, 0xa9, + 0xa9, 0x95, 0x9f, 0x24, 0xd1, 0xc8, 0x67, 0x61, 0x6a, 0xa9, 0xa6, 0x2e, 0x54, 0x16, 0x17, 0xcb, + 0xd5, 0x42, 0x4e, 0xb9, 0x1c, 0x2e, 0xab, 0x97, 0xd5, 0xb3, 0x95, 0x52, 0xb9, 0xb9, 0x51, 0x2d, + 0x9e, 0x2d, 0x56, 0x56, 0x49, 0x1f, 0x91, 0x8f, 0xb9, 0x8f, 0x7a, 0x02, 0xfd, 0x6c, 0x16, 0x80, + 0x56, 0x9d, 0x5c, 0xc6, 0x13, 0xba, 0xb5, 0xf8, 0x2f, 0x92, 0x4e, 0x1a, 0x02, 0x32, 0x11, 0xed, + 0xb7, 0x02, 0x93, 0x16, 0xfb, 0xc0, 0x96, 0x57, 0x06, 0xd1, 0xa1, 0x8f, 0x1e, 0x35, 0xd5, 0xff, + 0x1d, 0xbd, 0x3b, 0xc9, 0x1c, 0x21, 0x92, 0xb1, 0x64, 0x48, 0x2e, 0x8d, 0x06, 0x48, 0xf4, 0x50, + 0x06, 0xe6, 0xf8, 0x8a, 0xb9, 0x95, 0x20, 0xc6, 0x94, 0x58, 0x25, 0xf8, 0x9f, 0x43, 0x46, 0xd6, + 0x99, 0x27, 0xb1, 0xe1, 0x14, 0xbc, 0x96, 0x49, 0x4f, 0x86, 0x7b, 0x16, 0x4b, 0x21, 0xe3, 0x32, + 0xef, 0x1a, 0x1d, 0x05, 0x49, 0x99, 0x00, 0xb9, 0xf1, 0x80, 0x53, 0x90, 0xd1, 0x97, 0x65, 0x98, + 0xe5, 0xae, 0x45, 0x46, 0xaf, 0xca, 0x88, 0x5c, 0x59, 0x1a, 0xba, 0x70, 0x39, 0x73, 0xd0, 0x0b, + 0x97, 0xcf, 0xdc, 0x0c, 0x13, 0x2c, 0x8d, 0xc8, 0xb7, 0x56, 0x75, 0x4d, 0x81, 0xa3, 0x30, 0xbd, + 0x5c, 0x6e, 0x34, 0xeb, 0x8d, 0xa2, 0xda, 0x28, 0x2f, 0x16, 0x32, 0xee, 0xc0, 0x57, 0x5e, 0x5b, + 0x6f, 0xdc, 0x57, 0x90, 0x92, 0x7b, 0xe8, 0xf5, 0x32, 0x32, 0x66, 0x0f, 0xbd, 0xb8, 0xe2, 0xd3, + 0x9f, 0xab, 0x7e, 0x4a, 0x86, 0x02, 0xe5, 0xa0, 0xfc, 0x40, 0x17, 0x5b, 0x3a, 0x36, 0x5a, 0x18, + 0x5d, 0x10, 0x89, 0x08, 0xba, 0x2f, 0x56, 0x1e, 0xe9, 0xcf, 0x43, 0x56, 0x22, 0x7d, 0xe9, 0x31, + 0xb0, 0xb3, 0xfb, 0x0c, 0xec, 0x4f, 0x26, 0x75, 0xd1, 0xeb, 0x65, 0x77, 0x24, 0x90, 0x7d, 0x2c, + 0x89, 0x8b, 0xde, 0x00, 0x0e, 0xc6, 0x12, 0xe8, 0x37, 0x62, 0xfc, 0x2d, 0xc8, 0xe8, 0x79, 0x32, + 0x1c, 0x5d, 0xd4, 0x1c, 0xbc, 0x70, 0xa9, 0xe1, 0x5d, 0x5b, 0x18, 0x71, 0xd5, 0x70, 0x66, 0xdf, + 0x55, 0xc3, 0xc1, 0xcd, 0x87, 0x52, 0xcf, 0xcd, 0x87, 0xe8, 0xed, 0x49, 0x0f, 0xf5, 0xf5, 0xf0, + 0x30, 0xb2, 0x68, 0xbc, 0xc9, 0x0e, 0xeb, 0xc5, 0x73, 0x31, 0x86, 0x9b, 0xff, 0xa7, 0xa0, 0x40, + 0x59, 0x09, 0x79, 0xa1, 0xfd, 0x3a, 0xbb, 0x9d, 0xbb, 0x99, 0x20, 0xe8, 0x9f, 0x17, 0x46, 0x41, + 0xe2, 0xc3, 0x28, 0x70, 0x8b, 0x9a, 0x72, 0xaf, 0xe7, 0x40, 0xd2, 0xce, 0x30, 0xe4, 0x72, 0x16, + 0x1d, 0x67, 0x35, 0xbd, 0xce, 0x30, 0xb6, 0xf8, 0xf1, 0xdc, 0x20, 0xcb, 0xee, 0x79, 0x2c, 0x8b, + 0x22, 0x13, 0x7f, 0x51, 0x76, 0x52, 0xff, 0x63, 0xce, 0xe5, 0x2f, 0xe6, 0xf6, 0xe8, 0xf4, 0xfc, + 0x8f, 0x07, 0x71, 0x90, 0x3e, 0x0a, 0xdf, 0x93, 0x20, 0x5b, 0x37, 0x2d, 0x67, 0x54, 0x18, 0x24, + 0xdd, 0x33, 0x0d, 0x49, 0xa0, 0x1e, 0x3d, 0xe7, 0x4c, 0x6f, 0xcf, 0x34, 0xbe, 0xfc, 0x31, 0xc4, + 0x4d, 0x3c, 0x0a, 0x73, 0x94, 0x13, 0xff, 0x52, 0x91, 0xef, 0x4a, 0xb4, 0xbf, 0xba, 0x57, 0x14, + 0x91, 0x33, 0x30, 0x13, 0xda, 0xb3, 0xf4, 0x40, 0xe1, 0xd2, 0xd0, 0xeb, 0xc2, 0xb8, 0x2c, 0xf2, + 0xb8, 0xf4, 0x9b, 0x71, 0xfb, 0xf7, 0x72, 0x8c, 0xaa, 0x67, 0x4a, 0x12, 0x82, 0x31, 0xa6, 0xf0, + 0xf4, 0x11, 0x79, 0x50, 0x86, 0x3c, 0xf3, 0x19, 0x1b, 0x29, 0x02, 0x49, 0x5b, 0x86, 0x2f, 0x04, + 0x31, 0xdf, 0x32, 0x79, 0xd4, 0x2d, 0x23, 0xbe, 0xfc, 0xf4, 0x71, 0xf8, 0x3e, 0x73, 0x86, 0x2c, + 0xee, 0x69, 0x7a, 0x47, 0x3b, 0xdf, 0x49, 0x10, 0xfa, 0xf8, 0x43, 0x09, 0x8f, 0x7f, 0xf9, 0x55, + 0xe5, 0xca, 0x8b, 0x90, 0xf8, 0x8f, 0xc1, 0x94, 0xe5, 0x2f, 0x49, 0x7a, 0xa7, 0xe3, 0x7b, 0x1c, + 0x51, 0xd9, 0x77, 0x35, 0xc8, 0x99, 0xe8, 0xac, 0x97, 0x10, 0x3f, 0x63, 0x39, 0x9b, 0x32, 0x5d, + 0x6c, 0xb7, 0x97, 0xb0, 0xe6, 0xec, 0x5a, 0xb8, 0x9d, 0x68, 0x88, 0xe0, 0x45, 0x34, 0x15, 0x96, + 0x04, 0x17, 0x7c, 0x70, 0x95, 0x47, 0xe7, 0x29, 0x03, 0x7a, 0x03, 0x8f, 0x97, 0x91, 0x74, 0x49, + 0x6f, 0xf2, 0x21, 0xa9, 0x71, 0x90, 0x3c, 0x6d, 0x38, 0x26, 0xd2, 0x07, 0xe4, 0x37, 0x65, 0x98, + 0xa3, 0x76, 0xc2, 0xa8, 0x31, 0xf9, 0x83, 0x84, 0x3e, 0x26, 0xa1, 0x6b, 0x9b, 0xc2, 0xec, 0x8c, + 0x04, 0x96, 0x24, 0x1e, 0x29, 0x62, 0x7c, 0xa4, 0x8f, 0xcc, 0x67, 0xf2, 0x00, 0x21, 0xbf, 0xc1, + 0x0f, 0xe5, 0x83, 0x40, 0x80, 0xe8, 0x2d, 0x6c, 0xfe, 0x51, 0xe7, 0xa2, 0x52, 0x87, 0x7c, 0x02, + 0xfd, 0x0d, 0x29, 0x3e, 0x51, 0x68, 0x54, 0xf9, 0xf3, 0x84, 0x36, 0x2f, 0xf3, 0xda, 0x1b, 0x38, + 0xb8, 0x0f, 0xd9, 0xcb, 0x7d, 0x38, 0x81, 0xf1, 0x3b, 0x88, 0x95, 0x64, 0xa8, 0xad, 0x0e, 0x31, + 0xb3, 0x3f, 0x05, 0xc7, 0xd5, 0x72, 0x71, 0xb1, 0x56, 0x5d, 0xbd, 0x2f, 0x7c, 0x87, 0x4f, 0x41, + 0x0e, 0x4f, 0x4e, 0x52, 0x81, 0xed, 0xd5, 0x09, 0xfb, 0x40, 0x5e, 0x56, 0xb1, 0x37, 0xd4, 0x7f, + 0x2c, 0x41, 0xaf, 0x26, 0x40, 0xf6, 0x30, 0x51, 0x78, 0x10, 0x42, 0xcd, 0xe8, 0x17, 0x65, 0x28, + 0xb8, 0xe3, 0x21, 0xe5, 0x92, 0x5d, 0xd6, 0x56, 0xe3, 0xdd, 0x0a, 0xbb, 0x74, 0xff, 0x29, 0x70, + 0x2b, 0xf4, 0x12, 0x94, 0xeb, 0x61, 0xae, 0xb5, 0x8d, 0x5b, 0x17, 0x2a, 0x86, 0xb7, 0xaf, 0x4e, + 0x37, 0x61, 0x7b, 0x52, 0x79, 0x60, 0xee, 0xe5, 0x81, 0xe1, 0x27, 0xd1, 0xdc, 0x20, 0x1d, 0x66, + 0x2a, 0x02, 0x97, 0x3f, 0xf2, 0x71, 0xa9, 0x72, 0xb8, 0xdc, 0x3e, 0x14, 0xd5, 0x64, 0xb0, 0x54, + 0x87, 0x80, 0x05, 0xc1, 0xc9, 0xda, 0x7a, 0xa3, 0x52, 0xab, 0x36, 0x37, 0xea, 0xe5, 0xc5, 0xe6, + 0x82, 0x07, 0x4e, 0xbd, 0x20, 0xa3, 0xaf, 0x4b, 0x30, 0x41, 0xd9, 0xb2, 0xd1, 0xe3, 0x03, 0x08, + 0x06, 0xfa, 0x53, 0xa2, 0x37, 0x0b, 0x47, 0x47, 0xf0, 0x05, 0xc1, 0xca, 0x89, 0xe8, 0xa7, 0x9e, + 0x0a, 0x13, 0x14, 0x64, 0x6f, 0x45, 0xeb, 0x74, 0x44, 0x2f, 0xc5, 0xc8, 0xa8, 0x5e, 0x76, 0xc1, + 0x48, 0x09, 0x03, 0xd8, 0x48, 0x7f, 0x64, 0x79, 0x56, 0x96, 0x9a, 0xc1, 0xe7, 0x74, 0x67, 0x9b, + 0xb8, 0x5b, 0xa2, 0x9f, 0x10, 0x59, 0x5e, 0xbc, 0x09, 0x72, 0x7b, 0x6e, 0xee, 0x01, 0xae, 0xab, + 0x34, 0x13, 0x7a, 0xa9, 0x70, 0x60, 0x4e, 0x4e, 0x3f, 0x7d, 0x9e, 0x22, 0xc0, 0x59, 0x83, 0x6c, + 0x47, 0xb7, 0x1d, 0x36, 0x7e, 0xdc, 0x96, 0x88, 0x90, 0xf7, 0x50, 0x71, 0xf0, 0x8e, 0x4a, 0xc8, + 0xa0, 0x7b, 0x60, 0x26, 0x9c, 0x2a, 0xe0, 0xbe, 0x7b, 0x0a, 0x26, 0xd8, 0xb1, 0x32, 0xb6, 0xc4, + 0xea, 0xbd, 0x0a, 0x2e, 0x6b, 0x0a, 0xd5, 0x36, 0x7d, 0x1d, 0xf8, 0xbf, 0x8f, 0xc2, 0xc4, 0x8a, + 0x6e, 0x3b, 0xa6, 0x75, 0x09, 0x3d, 0x92, 0x81, 0x89, 0xb3, 0xd8, 0xb2, 0x75, 0xd3, 0xd8, 0xe7, + 0x6a, 0x70, 0x0d, 0x4c, 0x77, 0x2d, 0xbc, 0xa7, 0x9b, 0xbb, 0x76, 0xb0, 0x38, 0x13, 0x4e, 0x52, + 0x10, 0x4c, 0x6a, 0xbb, 0xce, 0xb6, 0x69, 0x05, 0xd1, 0x28, 0xbc, 0x77, 0xe5, 0x34, 0x00, 0x7d, + 0xae, 0x6a, 0x3b, 0x98, 0x39, 0x50, 0x84, 0x52, 0x14, 0x05, 0xb2, 0x8e, 0xbe, 0x83, 0x59, 0x78, + 0x5a, 0xf2, 0xec, 0x0a, 0x98, 0x84, 0x7a, 0x63, 0x21, 0xf5, 0x64, 0xd5, 0x7b, 0x45, 0x9f, 0x93, + 0x61, 0x7a, 0x19, 0x3b, 0x8c, 0x55, 0x1b, 0x3d, 0x3f, 0x23, 0x74, 0x23, 0x84, 0x3b, 0xc6, 0x76, + 0x34, 0xdb, 0xfb, 0xcf, 0x5f, 0x82, 0xe5, 0x13, 0x83, 0x58, 0xb9, 0x72, 0x38, 0x50, 0x36, 0x09, + 0x9c, 0xe6, 0x54, 0xa8, 0x5f, 0x26, 0xcb, 0xcc, 0x36, 0x41, 0xf6, 0x7f, 0x40, 0xef, 0x90, 0x44, + 0x0f, 0x1d, 0x33, 0xd9, 0xcf, 0x87, 0xea, 0x13, 0xd9, 0x1d, 0x4d, 0xee, 0xb1, 0x1c, 0xfb, 0x62, + 0xa0, 0x87, 0x29, 0x31, 0x32, 0xaa, 0x9f, 0x5b, 0xf0, 0xb8, 0xf2, 0x60, 0x4e, 0xd2, 0xd7, 0xc6, + 0x6f, 0xcb, 0x30, 0x5d, 0xdf, 0x36, 0x2f, 0x7a, 0x72, 0xfc, 0x69, 0x31, 0x60, 0xaf, 0x82, 0xa9, + 0xbd, 0x1e, 0x50, 0x83, 0x84, 0xe8, 0x3b, 0xda, 0xd1, 0x73, 0xe5, 0xa4, 0x30, 0x85, 0x98, 0x1b, + 0xf9, 0x0d, 0xea, 0xca, 0x53, 0x60, 0x82, 0x71, 0xcd, 0x96, 0x5c, 0xe2, 0x01, 0xf6, 0x32, 0x87, + 0x2b, 0x98, 0xe5, 0x2b, 0x98, 0x0c, 0xf9, 0xe8, 0xca, 0xa5, 0x8f, 0xfc, 0x9f, 0x48, 0x24, 0x58, + 0x85, 0x07, 0x7c, 0x69, 0x04, 0xc0, 0xa3, 0xef, 0x64, 0x44, 0x17, 0x26, 0x7d, 0x09, 0xf8, 0x1c, + 0x1c, 0xe8, 0xb6, 0x97, 0x81, 0xe4, 0xd2, 0x97, 0xe7, 0x4b, 0xb2, 0x30, 0xb3, 0xa8, 0x6f, 0x6e, + 0xfa, 0x9d, 0xe4, 0xaf, 0x0a, 0x76, 0x92, 0xd1, 0xee, 0x00, 0xae, 0x9d, 0xbb, 0x6b, 0x59, 0xd8, + 0xf0, 0x2a, 0xc5, 0x9a, 0x53, 0x4f, 0xaa, 0x72, 0x03, 0x1c, 0xf5, 0xc6, 0x85, 0x70, 0x47, 0x39, + 0xa5, 0xf6, 0x26, 0xa3, 0x6f, 0x09, 0xef, 0x6a, 0x79, 0x12, 0x0d, 0x57, 0x29, 0xa2, 0x01, 0xde, + 0x01, 0xb3, 0xdb, 0x34, 0x37, 0x99, 0xfa, 0x7b, 0x9d, 0xe5, 0xc9, 0x9e, 0x60, 0xc0, 0x6b, 0xd8, + 0xb6, 0xb5, 0x2d, 0xac, 0xf2, 0x99, 0x7b, 0x9a, 0xaf, 0x9c, 0xe4, 0x6a, 0x2b, 0xb1, 0x0d, 0x32, + 0x81, 0x9a, 0x8c, 0x41, 0x3b, 0xce, 0x40, 0x76, 0x49, 0xef, 0x60, 0xf4, 0x4b, 0x12, 0x4c, 0xa9, + 0xb8, 0x65, 0x1a, 0x2d, 0xf7, 0x2d, 0xe4, 0x1c, 0xf4, 0x4f, 0x19, 0xd1, 0x2b, 0x1d, 0x5d, 0x3a, + 0xf3, 0x3e, 0x8d, 0x88, 0x76, 0x23, 0x76, 0x75, 0x63, 0x2c, 0xa9, 0x31, 0x5c, 0xc0, 0xe1, 0x4e, + 0x3d, 0x36, 0x37, 0x3b, 0xa6, 0xc6, 0x2d, 0x7e, 0xf5, 0x9a, 0x42, 0x37, 0x42, 0xc1, 0x3b, 0x03, + 0x62, 0x3a, 0xeb, 0xba, 0x61, 0xf8, 0x87, 0x8c, 0xf7, 0xa5, 0xf3, 0xfb, 0xb6, 0xb1, 0x71, 0x5a, + 0x48, 0xdd, 0x59, 0xe9, 0x11, 0x9a, 0x7d, 0x3d, 0xcc, 0x9d, 0xbf, 0xe4, 0x60, 0x9b, 0xe5, 0x62, + 0xc5, 0x66, 0xd5, 0x9e, 0xd4, 0x50, 0x94, 0xe5, 0xb8, 0x78, 0x2e, 0x31, 0x05, 0x26, 0x13, 0xf5, + 0xca, 0x10, 0x33, 0xc0, 0xe3, 0x50, 0xa8, 0xd6, 0x16, 0xcb, 0xc4, 0x57, 0xcd, 0xf3, 0xfe, 0xd9, + 0x42, 0x2f, 0x90, 0x61, 0x86, 0x38, 0x93, 0x78, 0x28, 0x5c, 0x2b, 0x30, 0x1f, 0x41, 0x5f, 0x14, + 0xf6, 0x63, 0x23, 0x55, 0x0e, 0x17, 0x10, 0x2d, 0xe8, 0x4d, 0xbd, 0xd3, 0x2b, 0xe8, 0x9c, 0xda, + 0x93, 0xda, 0x07, 0x10, 0xb9, 0x2f, 0x20, 0xbf, 0x27, 0xe4, 0xcc, 0x36, 0x88, 0xbb, 0xc3, 0x42, + 0xe5, 0xf7, 0x65, 0x98, 0x76, 0x27, 0x29, 0x1e, 0x28, 0x35, 0x0e, 0x14, 0xd3, 0xe8, 0x5c, 0x0a, + 0x96, 0x45, 0xbc, 0xd7, 0x44, 0x8d, 0xe4, 0xaf, 0x84, 0x67, 0xee, 0x44, 0x44, 0x21, 0x5e, 0xc6, + 0x84, 0xdf, 0x7b, 0x84, 0xe6, 0xf3, 0x03, 0x98, 0x3b, 0x2c, 0xf8, 0xbe, 0x9a, 0x83, 0xfc, 0x46, + 0x97, 0x20, 0xf7, 0x52, 0x59, 0x24, 0x62, 0xf9, 0xbe, 0x83, 0x0c, 0xae, 0x99, 0xd5, 0x31, 0x5b, + 0x5a, 0x67, 0x3d, 0x38, 0x11, 0x16, 0x24, 0x28, 0xb7, 0x33, 0xdf, 0x46, 0x7a, 0xdc, 0xee, 0xfa, + 0xd8, 0x60, 0xde, 0x44, 0x46, 0xa1, 0x43, 0x23, 0x37, 0xc1, 0xb1, 0xb6, 0x6e, 0x6b, 0xe7, 0x3b, + 0xb8, 0x6c, 0xb4, 0xac, 0x4b, 0x54, 0x1c, 0x6c, 0x5a, 0xb5, 0xef, 0x83, 0x72, 0x27, 0xe4, 0x6c, + 0xe7, 0x52, 0x87, 0xce, 0x13, 0xc3, 0x67, 0x4c, 0x22, 0x8b, 0xaa, 0xbb, 0xd9, 0x55, 0xfa, 0x57, + 0xd8, 0x45, 0x69, 0x42, 0xf0, 0x3e, 0xe7, 0x27, 0x41, 0xde, 0xb4, 0xf4, 0x2d, 0x9d, 0xde, 0xcf, + 0x33, 0xb7, 0x2f, 0x66, 0x1d, 0x35, 0x05, 0x6a, 0x24, 0x8b, 0xca, 0xb2, 0x2a, 0x4f, 0x81, 0x29, + 0x7d, 0x47, 0xdb, 0xc2, 0xf7, 0xea, 0x06, 0x3d, 0xd1, 0x37, 0x77, 0xeb, 0xa9, 0x7d, 0xc7, 0x67, + 0xd8, 0x77, 0x35, 0xc8, 0x8a, 0xde, 0x23, 0x89, 0x06, 0xd6, 0x21, 0x75, 0xa3, 0xa0, 0x8e, 0xe5, + 0x5e, 0x6b, 0xf4, 0x0a, 0xa1, 0x90, 0x37, 0xd1, 0x6c, 0xa5, 0x3f, 0x78, 0x7f, 0x56, 0x82, 0xc9, + 0x45, 0xf3, 0xa2, 0x41, 0x14, 0xfd, 0x36, 0x31, 0x5b, 0xb7, 0xcf, 0x21, 0x47, 0xfe, 0xda, 0xc8, + 0xd8, 0x13, 0x0d, 0xa4, 0xb6, 0x5e, 0x91, 0x11, 0x30, 0xc4, 0xb6, 0x1c, 0xc1, 0xcb, 0xfc, 0xe2, + 0xca, 0x49, 0x5f, 0xae, 0x7f, 0x2a, 0x43, 0x76, 0xd1, 0x32, 0xbb, 0xe8, 0x4d, 0x99, 0x04, 0x2e, + 0x0b, 0x6d, 0xcb, 0xec, 0x36, 0xc8, 0x6d, 0x5c, 0xc1, 0x31, 0x8e, 0x70, 0x9a, 0x72, 0x1b, 0x4c, + 0x76, 0x4d, 0x5b, 0x77, 0xbc, 0x69, 0xc4, 0xdc, 0xad, 0x8f, 0xe9, 0xdb, 0x9a, 0xd7, 0x59, 0x26, + 0xd5, 0xcf, 0xee, 0xf6, 0xda, 0x44, 0x84, 0xae, 0x5c, 0x5c, 0x31, 0x7a, 0x37, 0x92, 0xf5, 0xa4, + 0xa2, 0x17, 0x86, 0x91, 0x7c, 0x1a, 0x8f, 0xe4, 0x63, 0xfb, 0x48, 0xd8, 0x32, 0xbb, 0x23, 0xd9, + 0x64, 0x7c, 0x99, 0x8f, 0xea, 0xd3, 0x39, 0x54, 0x6f, 0x14, 0x2a, 0x33, 0x7d, 0x44, 0xdf, 0x93, + 0x05, 0x20, 0x66, 0xc6, 0x86, 0x3b, 0x01, 0x12, 0xb3, 0xb1, 0x7e, 0x21, 0x1b, 0x92, 0x65, 0x91, + 0x97, 0xe5, 0xe3, 0x23, 0xac, 0x18, 0x42, 0x3e, 0x42, 0xa2, 0x45, 0xc8, 0xed, 0xba, 0x9f, 0x99, + 0x44, 0x05, 0x49, 0x90, 0x57, 0x95, 0xfe, 0x89, 0xfe, 0x24, 0x03, 0x39, 0x92, 0xa0, 0x9c, 0x06, + 0x20, 0x03, 0x3b, 0x3d, 0x10, 0x94, 0x21, 0x43, 0x78, 0x28, 0x85, 0x68, 0xab, 0xde, 0x66, 0x9f, + 0xa9, 0xc9, 0x1c, 0x24, 0xb8, 0x7f, 0x93, 0xe1, 0x9e, 0xd0, 0x62, 0x06, 0x40, 0x28, 0xc5, 0xfd, + 0x9b, 0xbc, 0xad, 0xe2, 0x4d, 0x1a, 0x28, 0x39, 0xab, 0x06, 0x09, 0xfe, 0xdf, 0xab, 0xfe, 0xf5, + 0x5a, 0xde, 0xdf, 0x24, 0xc5, 0x9d, 0x0c, 0x13, 0xb5, 0x5c, 0x08, 0x8a, 0xc8, 0x93, 0x4c, 0xbd, + 0xc9, 0xe8, 0xd5, 0xbe, 0xda, 0x2c, 0x72, 0x6a, 0x73, 0x4b, 0x02, 0xf1, 0xa6, 0xaf, 0x3c, 0x5f, + 0xce, 0xc1, 0x54, 0xd5, 0x6c, 0x33, 0xdd, 0x09, 0x4d, 0x18, 0x3f, 0x96, 0x4b, 0x34, 0x61, 0xf4, + 0x69, 0x44, 0x28, 0xc8, 0xdd, 0xbc, 0x82, 0x88, 0x51, 0x08, 0xeb, 0x87, 0xb2, 0x00, 0x79, 0xa2, + 0xbd, 0xfb, 0xef, 0x6d, 0x8a, 0x23, 0x41, 0x44, 0xab, 0xb2, 0x3f, 0xff, 0xc3, 0xe9, 0xd8, 0x7f, + 0x85, 0x1c, 0xa9, 0x60, 0xcc, 0xee, 0x0e, 0x5f, 0x51, 0x29, 0xbe, 0xa2, 0x72, 0x7c, 0x45, 0xb3, + 0xbd, 0x15, 0x4d, 0xb2, 0x0e, 0x10, 0xa5, 0x21, 0xe9, 0xeb, 0xf8, 0x3f, 0x4e, 0x00, 0x54, 0xb5, + 0x3d, 0x7d, 0x8b, 0xee, 0x0e, 0x7f, 0xce, 0x9b, 0xff, 0xb0, 0x7d, 0xdc, 0xff, 0x16, 0x1a, 0x08, + 0x6f, 0x83, 0x09, 0x36, 0xee, 0xb1, 0x8a, 0x5c, 0xcd, 0x55, 0x24, 0xa0, 0x42, 0xcd, 0xd2, 0x07, + 0x1c, 0xd5, 0xcb, 0xcf, 0x5d, 0x31, 0x2b, 0xf5, 0x5c, 0x31, 0xdb, 0x7f, 0x0f, 0x22, 0xe2, 0xe2, + 0x59, 0xf4, 0x4e, 0x61, 0x8f, 0xfe, 0x10, 0x3f, 0xa1, 0x1a, 0x45, 0x34, 0xc1, 0x27, 0xc1, 0x84, + 0xe9, 0x6f, 0x68, 0xcb, 0x91, 0xeb, 0x60, 0x15, 0x63, 0xd3, 0x54, 0xbd, 0x9c, 0x82, 0x9b, 0x5f, + 0x42, 0x7c, 0x8c, 0xe5, 0xd0, 0xcc, 0xc9, 0x65, 0x2f, 0xe8, 0x94, 0x5b, 0x8f, 0x73, 0xba, 0xb3, + 0xbd, 0xaa, 0x1b, 0x17, 0x6c, 0xf4, 0x9f, 0xc5, 0x2c, 0xc8, 0x10, 0xfe, 0x52, 0x32, 0xfc, 0xf9, + 0x98, 0x1d, 0x75, 0x1e, 0xb5, 0x3b, 0xa3, 0xa8, 0xf4, 0xe7, 0x36, 0x02, 0xc0, 0xdb, 0x21, 0x4f, + 0x19, 0x65, 0x9d, 0xe8, 0x99, 0x48, 0xfc, 0x7c, 0x4a, 0x2a, 0xfb, 0x03, 0xbd, 0xc3, 0xc7, 0xf1, + 0x2c, 0x87, 0xe3, 0xc2, 0x81, 0x38, 0x4b, 0x1d, 0xd2, 0x33, 0x4f, 0x84, 0x09, 0x26, 0x69, 0x65, + 0x2e, 0xdc, 0x8a, 0x0b, 0x47, 0x14, 0x80, 0xfc, 0x9a, 0xb9, 0x87, 0x1b, 0x66, 0x21, 0xe3, 0x3e, + 0xbb, 0xfc, 0x35, 0xcc, 0x82, 0x84, 0x5e, 0x3e, 0x09, 0x93, 0x7e, 0xb4, 0x9f, 0xcf, 0x4a, 0x50, + 0x28, 0x59, 0x58, 0x73, 0xf0, 0x92, 0x65, 0xee, 0xd0, 0x1a, 0x89, 0x7b, 0x87, 0xfe, 0xa6, 0xb0, + 0x8b, 0x87, 0x1f, 0x85, 0xa7, 0xb7, 0xb0, 0x08, 0x2c, 0xe9, 0x22, 0xa4, 0xe4, 0x2d, 0x42, 0xa2, + 0x37, 0x0a, 0xb9, 0x7c, 0x88, 0x96, 0x92, 0x7e, 0x53, 0xfb, 0xa4, 0x04, 0xb9, 0x52, 0xc7, 0x34, + 0x70, 0xf8, 0x08, 0xd3, 0xc0, 0xb3, 0x32, 0xfd, 0x77, 0x22, 0xd0, 0xb3, 0x24, 0x51, 0x5b, 0x23, + 0x10, 0x80, 0x5b, 0xb6, 0xa0, 0x6c, 0xc5, 0x06, 0xa9, 0x58, 0xd2, 0xe9, 0x0b, 0xf4, 0xeb, 0x12, + 0x4c, 0xd1, 0xb8, 0x38, 0xc5, 0x4e, 0x07, 0x3d, 0x26, 0x10, 0x6a, 0x9f, 0x88, 0x49, 0xe8, 0xf7, + 0x84, 0x5d, 0xf4, 0xfd, 0x5a, 0xf9, 0xb4, 0x13, 0x04, 0x08, 0x4a, 0xe6, 0x31, 0x2e, 0xb6, 0x97, + 0x36, 0x90, 0xa1, 0xf4, 0x45, 0xfd, 0x17, 0x92, 0x6b, 0x00, 0x18, 0x17, 0xd6, 0x2d, 0xbc, 0xa7, + 0xe3, 0x8b, 0xe8, 0xca, 0x40, 0xd8, 0xfb, 0x83, 0x7e, 0xbc, 0x5e, 0x78, 0x11, 0x27, 0x44, 0x32, + 0x72, 0x2b, 0x6b, 0xba, 0x13, 0x64, 0x62, 0xbd, 0x78, 0x6f, 0x24, 0x96, 0x10, 0x19, 0x35, 0x9c, + 0x5d, 0x70, 0xcd, 0x26, 0x9a, 0x8b, 0xf4, 0x05, 0xfb, 0xfe, 0x09, 0x98, 0xdc, 0x30, 0xec, 0x6e, + 0x47, 0xb3, 0xb7, 0xd1, 0x77, 0x65, 0xc8, 0xd3, 0xdb, 0xc2, 0xd0, 0x8f, 0x71, 0xb1, 0x05, 0x7e, + 0x66, 0x17, 0x5b, 0x9e, 0x0b, 0x0e, 0x7d, 0xe9, 0x7f, 0x99, 0x39, 0x7a, 0x8f, 0x2c, 0x3a, 0x49, + 0xf5, 0x0a, 0x0d, 0x5d, 0x1b, 0xdf, 0xff, 0x38, 0x7b, 0x57, 0x6f, 0x39, 0xbb, 0x96, 0x7f, 0x35, + 0xf6, 0x13, 0xc4, 0xa8, 0xac, 0xd3, 0xbf, 0x54, 0xff, 0x77, 0xa4, 0xc1, 0x04, 0x4b, 0xdc, 0xb7, + 0x9d, 0xb4, 0xff, 0xfc, 0xed, 0x49, 0xc8, 0x6b, 0x96, 0xa3, 0xdb, 0x0e, 0xdb, 0x60, 0x65, 0x6f, + 0x6e, 0x77, 0x49, 0x9f, 0x36, 0xac, 0x8e, 0x17, 0x85, 0xc4, 0x4f, 0x40, 0xbf, 0x2f, 0x34, 0x7f, + 0x8c, 0xaf, 0x79, 0x32, 0xc8, 0xef, 0x1d, 0x62, 0x8d, 0xfa, 0x72, 0xb8, 0x4c, 0x2d, 0x36, 0xca, + 0x4d, 0x1a, 0xb4, 0xc2, 0x8f, 0x4f, 0xd1, 0x46, 0x6f, 0x97, 0x43, 0xeb, 0x77, 0x97, 0xb8, 0x31, + 0x82, 0x49, 0x31, 0x18, 0x23, 0xfc, 0x84, 0x98, 0xdd, 0x6a, 0x6e, 0x11, 0x56, 0x16, 0x5f, 0x84, + 0xfd, 0x1d, 0xe1, 0xdd, 0x24, 0x5f, 0x94, 0x03, 0xd6, 0x00, 0xe3, 0x6e, 0x13, 0x7a, 0xaf, 0xd0, + 0xce, 0xd0, 0xa0, 0x92, 0x0e, 0x11, 0xb6, 0xd7, 0x4d, 0xc0, 0xc4, 0xb2, 0xd6, 0xe9, 0x60, 0xeb, + 0x92, 0x3b, 0x24, 0x15, 0x3c, 0x0e, 0xd7, 0x34, 0x43, 0xdf, 0xc4, 0xb6, 0x13, 0xdf, 0x59, 0xbe, + 0x53, 0x38, 0x52, 0x2d, 0x2b, 0x63, 0xbe, 0x97, 0x7e, 0x84, 0xcc, 0x6f, 0x86, 0xac, 0x6e, 0x6c, + 0x9a, 0xac, 0xcb, 0xec, 0x5d, 0xb5, 0xf7, 0x7e, 0x26, 0x53, 0x17, 0x92, 0x51, 0x30, 0x58, 0xad, + 0x20, 0x17, 0xe9, 0xf7, 0x9c, 0xbf, 0x9b, 0x85, 0x59, 0x8f, 0x89, 0x8a, 0xd1, 0xc6, 0x0f, 0x84, + 0x97, 0x62, 0x5e, 0x90, 0x15, 0x3d, 0x0e, 0xd6, 0x5b, 0x1f, 0x42, 0x2a, 0x42, 0xa4, 0x0d, 0x80, + 0x96, 0xe6, 0xe0, 0x2d, 0xd3, 0xd2, 0xfd, 0xfe, 0xf0, 0xc9, 0x49, 0xa8, 0x95, 0xe8, 0xdf, 0x97, + 0xd4, 0x10, 0x1d, 0xe5, 0x4e, 0x98, 0xc6, 0xfe, 0xf9, 0x7b, 0x6f, 0xa9, 0x26, 0x16, 0xaf, 0x70, + 0x7e, 0xf4, 0x17, 0x42, 0xa7, 0xce, 0x44, 0xaa, 0x99, 0x0c, 0xb3, 0xe6, 0x70, 0x6d, 0x68, 0xa3, + 0xba, 0x56, 0x54, 0xeb, 0x2b, 0xc5, 0xd5, 0xd5, 0x4a, 0x75, 0xd9, 0x0f, 0xfc, 0xa2, 0xc0, 0xdc, + 0x62, 0xed, 0x5c, 0x35, 0x14, 0x99, 0x27, 0x8b, 0xd6, 0x61, 0xd2, 0x93, 0x57, 0x3f, 0x5f, 0xcc, + 0xb0, 0xcc, 0x98, 0x2f, 0x66, 0x28, 0xc9, 0x35, 0xce, 0xf4, 0x96, 0xef, 0xa0, 0x43, 0x9e, 0xd1, + 0x1f, 0x6b, 0x90, 0x23, 0x6b, 0xea, 0xe8, 0xad, 0x64, 0x1b, 0xb0, 0xdb, 0xd1, 0x5a, 0x18, 0xed, + 0x24, 0xb0, 0xc6, 0xbd, 0xab, 0x13, 0xa4, 0x7d, 0x57, 0x27, 0x90, 0x47, 0x66, 0xf5, 0x1d, 0xef, + 0xb7, 0x8e, 0xaf, 0xd2, 0x2c, 0xfc, 0x01, 0xad, 0xd8, 0xdd, 0x15, 0xba, 0xfc, 0xcf, 0xd8, 0x8c, + 0x50, 0xc9, 0x68, 0x9e, 0x92, 0x59, 0xa2, 0x62, 0xfb, 0x30, 0x71, 0x1c, 0x8d, 0xe1, 0x7a, 0xef, + 0x2c, 0xe4, 0xea, 0xdd, 0x8e, 0xee, 0xa0, 0x17, 0x4b, 0x23, 0xc1, 0x8c, 0x5e, 0x77, 0x21, 0x0f, + 0xbc, 0xee, 0x22, 0xd8, 0x75, 0xcd, 0x0a, 0xec, 0xba, 0x36, 0xf0, 0x03, 0x0e, 0xbf, 0xeb, 0x7a, + 0x1b, 0x0b, 0xde, 0x46, 0xf7, 0x6c, 0x1f, 0xdb, 0x47, 0xa4, 0xa4, 0x5a, 0x7d, 0xa2, 0x02, 0x9e, + 0x79, 0x22, 0x0b, 0x4e, 0x06, 0x90, 0x5f, 0xa8, 0x35, 0x1a, 0xb5, 0xb5, 0xc2, 0x11, 0x12, 0xd5, + 0xa6, 0xb6, 0x4e, 0x43, 0xc5, 0x54, 0xaa, 0xd5, 0xb2, 0x5a, 0x90, 0x48, 0xb8, 0xb4, 0x4a, 0x63, + 0xb5, 0x5c, 0x90, 0xf9, 0xd8, 0xe7, 0xb1, 0xe6, 0x37, 0x5f, 0x76, 0x9a, 0xea, 0x25, 0x66, 0x88, + 0x47, 0xf3, 0x93, 0xbe, 0x72, 0xfd, 0x86, 0x0c, 0xb9, 0x35, 0x6c, 0x6d, 0x61, 0xf4, 0x33, 0x09, + 0x36, 0xf9, 0x36, 0x75, 0xcb, 0xa6, 0xc1, 0xe5, 0x82, 0x4d, 0xbe, 0x70, 0x9a, 0x72, 0x1d, 0xcc, + 0xda, 0xb8, 0x65, 0x1a, 0x6d, 0x2f, 0x13, 0xed, 0x8f, 0xf8, 0x44, 0xfe, 0xde, 0x79, 0x01, 0xc8, + 0x08, 0xa3, 0x23, 0xd9, 0xa9, 0x4b, 0x02, 0x4c, 0xbf, 0x52, 0xd3, 0x07, 0xe6, 0x5b, 0xb2, 0xfb, + 0x53, 0xf7, 0x12, 0x7a, 0x91, 0xf0, 0xee, 0xeb, 0x4d, 0x90, 0x27, 0x6a, 0xea, 0x8d, 0xd1, 0xfd, + 0xfb, 0x63, 0x96, 0x47, 0x59, 0x80, 0x63, 0x36, 0xee, 0xe0, 0x96, 0x83, 0xdb, 0x6e, 0xd3, 0x55, + 0x07, 0x76, 0x0a, 0xfb, 0xb3, 0xa3, 0x3f, 0x0b, 0x03, 0x78, 0x07, 0x0f, 0xe0, 0xf5, 0x7d, 0x44, + 0xe9, 0x56, 0x28, 0xda, 0x56, 0x76, 0xab, 0x51, 0xef, 0x98, 0xfe, 0xa2, 0xb8, 0xf7, 0xee, 0x7e, + 0xdb, 0x76, 0x76, 0x3a, 0xe4, 0x1b, 0x3b, 0x60, 0xe0, 0xbd, 0x2b, 0xf3, 0x30, 0xa1, 0x19, 0x97, + 0xc8, 0xa7, 0x6c, 0x4c, 0xad, 0xbd, 0x4c, 0xe8, 0xe5, 0x3e, 0xf2, 0x77, 0x71, 0xc8, 0x3f, 0x5e, + 0x8c, 0xdd, 0xf4, 0x81, 0xff, 0xf9, 0x09, 0xc8, 0xad, 0x6b, 0xb6, 0x83, 0xd1, 0xff, 0x25, 0x8b, + 0x22, 0x7f, 0x3d, 0xcc, 0x6d, 0x9a, 0xad, 0x5d, 0x1b, 0xb7, 0xf9, 0x46, 0xd9, 0x93, 0x3a, 0x0a, + 0xcc, 0x95, 0x1b, 0xa1, 0xe0, 0x25, 0x32, 0xb2, 0xde, 0x36, 0xfc, 0xbe, 0x74, 0x12, 0x49, 0xdb, + 0x5e, 0xd7, 0x2c, 0xa7, 0xb6, 0x49, 0xd2, 0xfc, 0x48, 0xda, 0xe1, 0x44, 0x0e, 0xfa, 0x7c, 0x0c, + 0xf4, 0x13, 0xd1, 0xd0, 0x4f, 0x0a, 0x40, 0xaf, 0x14, 0x61, 0x72, 0x53, 0xef, 0x60, 0xf2, 0xc3, + 0x14, 0xf9, 0xa1, 0xdf, 0x98, 0x44, 0x64, 0xef, 0x8f, 0x49, 0x4b, 0x7a, 0x07, 0xab, 0xfe, 0x6f, + 0xde, 0x44, 0x06, 0x82, 0x89, 0xcc, 0x2a, 0xf5, 0xa7, 0x75, 0x0d, 0x2f, 0x43, 0xdb, 0xc1, 0xde, + 0xe2, 0x9b, 0xc1, 0x0e, 0xb7, 0xb4, 0x35, 0x47, 0x23, 0x60, 0xcc, 0xa8, 0xe4, 0x99, 0xf7, 0x0b, + 0x91, 0x7b, 0xfd, 0x42, 0x9e, 0x23, 0x27, 0xeb, 0x11, 0x3d, 0x66, 0x23, 0x5a, 0xd4, 0x79, 0x0f, + 0x20, 0x6a, 0x29, 0xfa, 0xef, 0x2e, 0x30, 0x2d, 0xcd, 0xc2, 0xce, 0x7a, 0xd8, 0x13, 0x23, 0xa7, + 0xf2, 0x89, 0xc4, 0x95, 0xcf, 0xae, 0x6b, 0x3b, 0x98, 0x14, 0x56, 0x72, 0xbf, 0x31, 0x17, 0xad, + 0x7d, 0xe9, 0x41, 0xff, 0x9b, 0x1b, 0x75, 0xff, 0xdb, 0xaf, 0x8e, 0xe9, 0x37, 0xc3, 0x57, 0x65, + 0x41, 0x2e, 0xed, 0x3a, 0x8f, 0xea, 0xee, 0xf7, 0x7b, 0xc2, 0x7e, 0x2e, 0xac, 0x3f, 0x8b, 0xbc, + 0x68, 0x7e, 0x4c, 0xbd, 0x6f, 0x42, 0x2d, 0x11, 0xf3, 0xa7, 0x89, 0xaa, 0xdb, 0x18, 0xee, 0x35, + 0x90, 0x7d, 0x07, 0xcb, 0x07, 0x33, 0x07, 0x37, 0xcd, 0x11, 0xed, 0x9f, 0x42, 0x3d, 0x83, 0xff, + 0xee, 0x75, 0x3c, 0x59, 0x2e, 0x56, 0x1f, 0xd9, 0x5e, 0x27, 0xa2, 0x9c, 0x51, 0xe9, 0x0b, 0x7a, + 0x89, 0xb0, 0xdb, 0x39, 0x15, 0x5b, 0xac, 0x2b, 0x61, 0x32, 0x9b, 0x4a, 0xec, 0x32, 0xd1, 0x98, + 0x62, 0xd3, 0x07, 0xec, 0x9b, 0x61, 0x57, 0xc1, 0xe2, 0x81, 0x11, 0x43, 0xaf, 0x10, 0xde, 0x8e, + 0xa2, 0xd5, 0x1e, 0xb0, 0x5e, 0x98, 0x4c, 0xde, 0x62, 0x9b, 0x55, 0xb1, 0x05, 0xa7, 0x2f, 0xf1, + 0x6f, 0xc8, 0x90, 0xa7, 0x5b, 0x90, 0xe8, 0x0d, 0x99, 0x04, 0xb7, 0xb0, 0x3b, 0xbc, 0x0b, 0xa1, + 0xff, 0x9e, 0x64, 0xcd, 0x81, 0x73, 0x35, 0xcc, 0x26, 0x72, 0x35, 0xe4, 0xcf, 0x71, 0x0a, 0xb4, + 0x23, 0x5a, 0xc7, 0x94, 0xa7, 0x93, 0x49, 0x5a, 0x58, 0x5f, 0x86, 0xd2, 0xc7, 0xfb, 0x17, 0x73, + 0x30, 0x43, 0x8b, 0x3e, 0xa7, 0xb7, 0xb7, 0xb0, 0x83, 0xde, 0x2e, 0xfd, 0xe0, 0xa0, 0xae, 0x54, + 0x61, 0xe6, 0x22, 0x61, 0x7b, 0x55, 0xbb, 0x64, 0xee, 0x3a, 0x6c, 0xe5, 0xe2, 0xc6, 0xd8, 0x75, + 0x0f, 0x5a, 0xcf, 0x79, 0xfa, 0x87, 0xca, 0xfd, 0xef, 0xca, 0x98, 0x2e, 0xf8, 0x53, 0x07, 0xae, + 0x3c, 0x31, 0xb2, 0xc2, 0x49, 0xca, 0x49, 0xc8, 0xef, 0xe9, 0xf8, 0x62, 0xa5, 0xcd, 0xac, 0x5b, + 0xf6, 0x86, 0xfe, 0x50, 0x78, 0xdf, 0x36, 0x0c, 0x37, 0xe3, 0x25, 0x5d, 0x2d, 0x14, 0xdb, 0xbd, + 0x1d, 0xc8, 0xd6, 0x18, 0xce, 0x14, 0xf3, 0x97, 0x75, 0x96, 0x12, 0x28, 0x62, 0x94, 0xe1, 0xcc, + 0x87, 0xf2, 0x88, 0x3d, 0xb1, 0x42, 0x05, 0x30, 0xe2, 0x7b, 0x3c, 0xc5, 0xe2, 0x4b, 0x0c, 0x28, + 0x3a, 0x7d, 0xc9, 0xbf, 0x5a, 0x86, 0xa9, 0x3a, 0x76, 0x96, 0x74, 0xdc, 0x69, 0xdb, 0xc8, 0x3a, + 0xb8, 0x69, 0x74, 0x33, 0xe4, 0x37, 0x09, 0xb1, 0x41, 0xe7, 0x16, 0x58, 0x36, 0xf4, 0x2a, 0x49, + 0x74, 0x47, 0x98, 0xad, 0xbe, 0x79, 0xdc, 0x8e, 0x04, 0x26, 0x31, 0x8f, 0xde, 0xf8, 0x92, 0xc7, + 0x10, 0xd8, 0x56, 0x86, 0x19, 0x76, 0xbb, 0x5f, 0xb1, 0xa3, 0x6f, 0x19, 0x68, 0x77, 0x04, 0x2d, + 0x44, 0xb9, 0x05, 0x72, 0x9a, 0x4b, 0x8d, 0x6d, 0xbd, 0xa2, 0xbe, 0x9d, 0x27, 0x29, 0x4f, 0xa5, + 0x19, 0x13, 0x84, 0x91, 0x0c, 0x14, 0xdb, 0xe3, 0x79, 0x8c, 0x61, 0x24, 0x07, 0x16, 0x9e, 0x3e, + 0x62, 0x5f, 0x92, 0xe1, 0x38, 0x63, 0xe0, 0x2c, 0xb6, 0x1c, 0xbd, 0xa5, 0x75, 0x28, 0x72, 0x0f, + 0x65, 0x46, 0x01, 0xdd, 0x0a, 0xcc, 0xee, 0x85, 0xc9, 0x32, 0x08, 0xcf, 0xf4, 0x85, 0x90, 0x63, + 0x40, 0xe5, 0x7f, 0x4c, 0x10, 0x8e, 0x8f, 0x93, 0x2a, 0x47, 0x73, 0x8c, 0xe1, 0xf8, 0x84, 0x99, + 0x48, 0x1f, 0xe2, 0x17, 0xb2, 0xd0, 0x3c, 0x41, 0xf7, 0xf9, 0x39, 0x61, 0x6c, 0x37, 0x60, 0x9a, + 0x60, 0x49, 0x7f, 0x64, 0xcb, 0x10, 0x31, 0x4a, 0xec, 0xf7, 0x3b, 0xec, 0xc2, 0x30, 0xff, 0x5f, + 0x35, 0x4c, 0x07, 0x9d, 0x03, 0x08, 0x3e, 0x85, 0x3b, 0xe9, 0x4c, 0x54, 0x27, 0x2d, 0x89, 0x75, + 0xd2, 0xaf, 0x17, 0x0e, 0x96, 0xd2, 0x9f, 0xed, 0x83, 0xab, 0x87, 0x58, 0x98, 0x8c, 0xc1, 0xa5, + 0xa7, 0xaf, 0x17, 0x2f, 0xcf, 0xf6, 0x5e, 0xe3, 0xfe, 0xa1, 0x91, 0xcc, 0xa7, 0xc2, 0xfd, 0x81, + 0xdc, 0xd3, 0x1f, 0x1c, 0xc0, 0x92, 0xbe, 0x01, 0x8e, 0xd2, 0x22, 0x4a, 0x3e, 0x5b, 0x39, 0x1a, + 0x0a, 0xa2, 0x27, 0x19, 0x7d, 0x78, 0x08, 0x25, 0x18, 0x74, 0xc7, 0x7c, 0x5c, 0x27, 0x97, 0xcc, + 0xd8, 0x4d, 0xaa, 0x20, 0x87, 0x77, 0x35, 0xfd, 0xd7, 0xb3, 0xd4, 0xda, 0xdd, 0x20, 0x77, 0xba, + 0xa1, 0xbf, 0xcc, 0x8e, 0x62, 0x44, 0xb8, 0x1b, 0xb2, 0xc4, 0xc5, 0x5d, 0x8e, 0x5c, 0xd2, 0x08, + 0x8a, 0x0c, 0x2e, 0xdc, 0xc3, 0x0f, 0x38, 0x2b, 0x47, 0x54, 0xf2, 0xa7, 0x72, 0x23, 0x1c, 0x3d, + 0xaf, 0xb5, 0x2e, 0x6c, 0x59, 0xe6, 0x2e, 0xb9, 0xfd, 0xca, 0x64, 0xd7, 0x68, 0x91, 0xeb, 0x08, + 0xf9, 0x0f, 0xca, 0xad, 0x9e, 0xe9, 0x90, 0x1b, 0x64, 0x3a, 0xac, 0x1c, 0x61, 0xc6, 0x83, 0xf2, + 0x44, 0xbf, 0xd3, 0xc9, 0xc7, 0x76, 0x3a, 0x2b, 0x47, 0xbc, 0x6e, 0x47, 0x59, 0x84, 0xc9, 0xb6, + 0xbe, 0x47, 0xb6, 0xaa, 0xc9, 0xac, 0x6b, 0xd0, 0xd1, 0xe5, 0x45, 0x7d, 0x8f, 0x6e, 0x6c, 0xaf, + 0x1c, 0x51, 0xfd, 0x3f, 0x95, 0x65, 0x98, 0x22, 0xdb, 0x02, 0x84, 0xcc, 0x64, 0xa2, 0x63, 0xc9, + 0x2b, 0x47, 0xd4, 0xe0, 0x5f, 0xd7, 0xfa, 0xc8, 0x92, 0xb3, 0x1f, 0x77, 0x79, 0xdb, 0xed, 0x99, + 0x44, 0xdb, 0xed, 0xae, 0x2c, 0xe8, 0x86, 0xfb, 0x49, 0xc8, 0xb5, 0x88, 0x84, 0x25, 0x26, 0x61, + 0xfa, 0xaa, 0xdc, 0x01, 0xd9, 0x1d, 0xcd, 0xf2, 0x26, 0xcf, 0xd7, 0x0f, 0xa6, 0xbb, 0xa6, 0x59, + 0x17, 0x5c, 0x04, 0xdd, 0xbf, 0x16, 0x26, 0x20, 0x47, 0x04, 0xe7, 0x3f, 0xa0, 0x37, 0x65, 0xa9, + 0x19, 0x52, 0x32, 0x0d, 0x77, 0xd8, 0x6f, 0x98, 0xde, 0x01, 0x99, 0x3f, 0xcc, 0x8c, 0xc6, 0x82, + 0xec, 0x7b, 0xef, 0xb9, 0x1c, 0x79, 0xef, 0x79, 0xcf, 0x05, 0xbc, 0xd9, 0xde, 0x0b, 0x78, 0x83, + 0xe5, 0x83, 0xdc, 0x60, 0x47, 0x95, 0x3f, 0x1b, 0xc2, 0x74, 0xe9, 0x15, 0x44, 0xf4, 0x0c, 0xbc, + 0xa3, 0x1b, 0xa1, 0x3a, 0x7b, 0xaf, 0x09, 0x3b, 0xa5, 0xa4, 0x46, 0xcd, 0x00, 0xf6, 0xd2, 0xef, + 0x9b, 0x7e, 0x3b, 0x0b, 0xa7, 0xe8, 0x35, 0xcf, 0x7b, 0xb8, 0x61, 0xf2, 0xf7, 0x4d, 0xa2, 0x4f, + 0x8c, 0x44, 0x69, 0xfa, 0x0c, 0x38, 0x72, 0xdf, 0x01, 0x67, 0xdf, 0x21, 0xe5, 0xec, 0x80, 0x43, + 0xca, 0xb9, 0x64, 0x2b, 0x87, 0xef, 0x0b, 0xeb, 0xcf, 0x3a, 0xaf, 0x3f, 0xb7, 0x47, 0x00, 0xd4, + 0x4f, 0x2e, 0x23, 0xb1, 0x6f, 0xde, 0xea, 0x6b, 0x4a, 0x9d, 0xd3, 0x94, 0xbb, 0x86, 0x67, 0x24, + 0x7d, 0x6d, 0xf9, 0x83, 0x2c, 0x5c, 0x16, 0x30, 0x53, 0xc5, 0x17, 0x99, 0xa2, 0x7c, 0x76, 0x24, + 0x8a, 0x92, 0x3c, 0x06, 0x42, 0xda, 0x1a, 0xf3, 0x27, 0xc2, 0x67, 0x87, 0x7a, 0x81, 0xf2, 0x65, + 0x13, 0xa1, 0x2c, 0x27, 0x21, 0x4f, 0x7b, 0x18, 0x06, 0x0d, 0x7b, 0x4b, 0xd8, 0xdd, 0x88, 0x9d, + 0x38, 0x12, 0xe5, 0x6d, 0x0c, 0xfa, 0xc3, 0xd6, 0x35, 0x1a, 0xbb, 0x96, 0x51, 0x31, 0x1c, 0x13, + 0xfd, 0xdc, 0x48, 0x14, 0xc7, 0xf7, 0x86, 0x93, 0x87, 0xf1, 0x86, 0x1b, 0x6a, 0x95, 0xc3, 0xab, + 0xc1, 0xa1, 0xac, 0x72, 0x44, 0x14, 0x9e, 0x3e, 0x7e, 0x6f, 0x91, 0xe1, 0x24, 0x9b, 0x6c, 0x2d, + 0xf0, 0x16, 0x22, 0xba, 0x6f, 0x14, 0x40, 0x1e, 0xf7, 0xcc, 0x24, 0x76, 0xcb, 0x19, 0x79, 0xe1, + 0x4f, 0x4a, 0xc5, 0xde, 0xef, 0xc0, 0x4d, 0x07, 0x7b, 0x38, 0x1c, 0x09, 0x52, 0x62, 0xd7, 0x3a, + 0x24, 0x60, 0x23, 0x7d, 0xcc, 0x7e, 0x55, 0x86, 0x3c, 0xbb, 0xde, 0x7f, 0x23, 0x15, 0x87, 0x09, + 0x3e, 0xca, 0xb3, 0xc0, 0x8e, 0x5c, 0xe2, 0x4b, 0xee, 0xd3, 0xdb, 0x8b, 0x3b, 0xa4, 0x5b, 0xec, + 0xbf, 0x25, 0xc1, 0x74, 0x1d, 0x3b, 0x25, 0xcd, 0xb2, 0x74, 0x6d, 0x6b, 0x54, 0x1e, 0xdf, 0xa2, + 0xde, 0xc3, 0xe8, 0xdb, 0x19, 0xd1, 0xf3, 0x34, 0xfe, 0x42, 0xb8, 0xc7, 0x6a, 0x44, 0x2c, 0xc1, + 0x47, 0x84, 0xce, 0xcc, 0x0c, 0xa2, 0x36, 0x06, 0x8f, 0x6d, 0x09, 0x26, 0xbc, 0xb3, 0x78, 0x37, + 0x73, 0xe7, 0x33, 0xb7, 0x9d, 0x1d, 0xef, 0x18, 0x0c, 0x79, 0xde, 0x7f, 0x06, 0x0c, 0xbd, 0x2c, + 0xa1, 0xa3, 0x7c, 0xfc, 0x41, 0xc2, 0x64, 0x6d, 0x2c, 0x89, 0x3b, 0xfc, 0x61, 0x1d, 0x1d, 0xfc, + 0xbd, 0x09, 0xb6, 0x1c, 0xb9, 0xaa, 0x39, 0xf8, 0x01, 0xf4, 0x39, 0x19, 0x26, 0xea, 0xd8, 0x71, + 0xc7, 0x5b, 0xee, 0x72, 0xd3, 0x61, 0x35, 0x5c, 0x09, 0xad, 0x78, 0x4c, 0xb1, 0x35, 0x8c, 0x7b, + 0x60, 0xaa, 0x6b, 0x99, 0x2d, 0x6c, 0xdb, 0x6c, 0xf5, 0x22, 0xec, 0xa8, 0xd6, 0x6f, 0xf4, 0x27, + 0xac, 0xcd, 0xaf, 0x7b, 0xff, 0xa8, 0xc1, 0xef, 0x49, 0xcd, 0x00, 0x4a, 0x89, 0x55, 0x70, 0xdc, + 0x66, 0x40, 0x5c, 0xe1, 0xe9, 0x03, 0xfd, 0x69, 0x19, 0x66, 0xea, 0xd8, 0xf1, 0xa5, 0x98, 0x60, + 0x93, 0x23, 0x1a, 0x5e, 0x0e, 0x4a, 0xf9, 0x60, 0x50, 0x8a, 0x5f, 0x0d, 0xc8, 0x4b, 0xd3, 0x27, + 0x36, 0xc6, 0xab, 0x01, 0xc5, 0x38, 0x18, 0xc3, 0xf1, 0xb5, 0xc7, 0xc2, 0x14, 0xe1, 0x85, 0x34, + 0xd8, 0x5f, 0xce, 0x06, 0x8d, 0xf7, 0xf3, 0x29, 0x35, 0xde, 0x3b, 0x21, 0xb7, 0xa3, 0x59, 0x17, + 0x6c, 0xd2, 0x70, 0xa7, 0x45, 0xcc, 0xf6, 0x35, 0x37, 0xbb, 0x4a, 0xff, 0xea, 0xef, 0xa7, 0x99, + 0x4b, 0xe6, 0xa7, 0xf9, 0x88, 0x94, 0x68, 0x24, 0xa4, 0x73, 0x87, 0x11, 0x36, 0xf9, 0x04, 0xe3, + 0x66, 0x4c, 0xd9, 0xe9, 0x2b, 0xc7, 0x43, 0x32, 0x4c, 0xba, 0xe3, 0x36, 0xb1, 0xc7, 0xcf, 0x1d, + 0x5c, 0x1d, 0xfa, 0x1b, 0xfa, 0x09, 0x7b, 0x60, 0x4f, 0x22, 0xa3, 0x33, 0xef, 0x13, 0xf4, 0xc0, + 0x71, 0x85, 0xa7, 0x8f, 0xc7, 0xdb, 0x28, 0x1e, 0xa4, 0x3d, 0xa0, 0xd7, 0xca, 0x20, 0x2f, 0x63, + 0x67, 0xdc, 0x56, 0xe4, 0x9b, 0x85, 0x43, 0x1c, 0x71, 0x02, 0x23, 0x3c, 0xcf, 0x2f, 0xe3, 0xd1, + 0x34, 0x20, 0xb1, 0xd8, 0x46, 0x42, 0x0c, 0xa4, 0x8f, 0xda, 0xbb, 0x28, 0x6a, 0x74, 0x73, 0xe1, + 0x67, 0x47, 0xd0, 0xab, 0x8e, 0x77, 0xe1, 0xc3, 0x13, 0x20, 0xa1, 0x71, 0x58, 0xed, 0xad, 0x5f, + 0xe1, 0x63, 0xb9, 0x8a, 0x0f, 0xdc, 0xc6, 0xbe, 0x8d, 0x5b, 0x17, 0x70, 0x1b, 0xfd, 0xd4, 0xc1, + 0xa1, 0x3b, 0x05, 0x13, 0x2d, 0x4a, 0x8d, 0x80, 0x37, 0xa9, 0x7a, 0xaf, 0x09, 0xee, 0x95, 0xe6, + 0x3b, 0x22, 0xfa, 0xfb, 0x18, 0xef, 0x95, 0x16, 0x28, 0x7e, 0x0c, 0x66, 0x0b, 0x9d, 0x65, 0x54, + 0x5a, 0xa6, 0x81, 0xfe, 0xcb, 0xc1, 0x61, 0xb9, 0x0a, 0xa6, 0xf4, 0x96, 0x69, 0x90, 0x30, 0x14, + 0xde, 0x21, 0x20, 0x3f, 0xc1, 0xfb, 0x5a, 0xde, 0x31, 0xef, 0xd7, 0xd9, 0xae, 0x79, 0x90, 0x30, + 0xac, 0x31, 0xe1, 0xb2, 0x7e, 0x58, 0xc6, 0x44, 0x9f, 0xb2, 0xd3, 0x87, 0xec, 0xc3, 0x81, 0x77, + 0x1b, 0xed, 0x0a, 0x1f, 0x15, 0xab, 0xc0, 0xc3, 0x0c, 0x67, 0xe1, 0x5a, 0x1c, 0xca, 0x70, 0x16, + 0xc3, 0xc0, 0x18, 0x6e, 0xac, 0x08, 0x70, 0x4c, 0x7d, 0x0d, 0xf8, 0x00, 0xe8, 0x8c, 0xce, 0x3c, + 0x1c, 0x12, 0x9d, 0xc3, 0x31, 0x11, 0xdf, 0xcb, 0x42, 0x64, 0x32, 0x8b, 0x07, 0xfd, 0xd7, 0x51, + 0x80, 0x73, 0xfb, 0x30, 0xfe, 0x0a, 0xd4, 0x5b, 0x21, 0xc1, 0x8d, 0xd8, 0xfb, 0x24, 0xe8, 0x52, + 0x19, 0xe3, 0x5d, 0xf1, 0x22, 0xe5, 0xa7, 0x0f, 0xe0, 0xf3, 0x64, 0x98, 0x23, 0x3e, 0x02, 0x1d, + 0xac, 0x59, 0xb4, 0xa3, 0x1c, 0x89, 0xa3, 0xfc, 0xdb, 0x84, 0x03, 0xfc, 0xf0, 0x72, 0x08, 0xf8, + 0x18, 0x09, 0x14, 0x62, 0xd1, 0x7d, 0x04, 0x59, 0x18, 0xcb, 0x36, 0x4a, 0xc1, 0x67, 0x81, 0xa9, + 0xf8, 0x68, 0xf0, 0x48, 0xe8, 0x91, 0xcb, 0x0b, 0xc3, 0x6b, 0x6c, 0x63, 0xf6, 0xc8, 0x15, 0x61, + 0x22, 0x7d, 0x4c, 0x5e, 0x7b, 0x0b, 0x5b, 0x70, 0x6e, 0x90, 0x0b, 0xe3, 0x5f, 0x91, 0xf5, 0x4f, + 0xb4, 0x7d, 0x7a, 0x24, 0x1e, 0x98, 0x07, 0x08, 0x88, 0xaf, 0x40, 0xd6, 0x32, 0x2f, 0xd2, 0xa5, + 0xad, 0x59, 0x95, 0x3c, 0xd3, 0xeb, 0x29, 0x3b, 0xbb, 0x3b, 0x06, 0x3d, 0x19, 0x3a, 0xab, 0x7a, + 0xaf, 0xca, 0x75, 0x30, 0x7b, 0x51, 0x77, 0xb6, 0x57, 0xb0, 0xd6, 0xc6, 0x96, 0x6a, 0x5e, 0x24, + 0x1e, 0x73, 0x93, 0x2a, 0x9f, 0xc8, 0xfb, 0xaf, 0x08, 0xd8, 0x97, 0xe4, 0x16, 0xf9, 0xb1, 0x1c, + 0x7f, 0x4b, 0x62, 0x79, 0x46, 0x73, 0x95, 0xbe, 0xc2, 0xbc, 0x5b, 0x86, 0x29, 0xd5, 0xbc, 0xc8, + 0x94, 0xe4, 0xff, 0x38, 0x5c, 0x1d, 0x49, 0x3c, 0xd1, 0x23, 0x92, 0xf3, 0xd9, 0x1f, 0xfb, 0x44, + 0x2f, 0xb6, 0xf8, 0xb1, 0x9c, 0x5c, 0x9a, 0x51, 0xcd, 0x8b, 0x75, 0xec, 0xd0, 0x16, 0x81, 0x9a, + 0x23, 0x72, 0xb2, 0xd6, 0x6d, 0x4a, 0x90, 0xcd, 0xc3, 0xfd, 0xf7, 0xa4, 0xbb, 0x08, 0xbe, 0x80, + 0x7c, 0x16, 0xc7, 0xbd, 0x8b, 0x30, 0x90, 0x83, 0x31, 0xc4, 0x48, 0x91, 0x61, 0x5a, 0x35, 0x2f, + 0xba, 0x43, 0xc3, 0x92, 0xde, 0xe9, 0x8c, 0x66, 0x84, 0x4c, 0x6a, 0xfc, 0x7b, 0x62, 0xf0, 0xb8, + 0x18, 0xbb, 0xf1, 0x3f, 0x80, 0x81, 0xf4, 0x61, 0x78, 0x0e, 0x6d, 0x2c, 0xde, 0x08, 0x6d, 0x8c, + 0x06, 0x87, 0x61, 0x1b, 0x84, 0xcf, 0xc6, 0xa1, 0x35, 0x88, 0x28, 0x0e, 0xc6, 0xb2, 0x73, 0x32, + 0x57, 0x22, 0xc3, 0xfc, 0x68, 0xdb, 0xc4, 0x3b, 0x92, 0xb9, 0x26, 0xb2, 0x61, 0x97, 0x63, 0x64, + 0x24, 0x68, 0x24, 0x70, 0x41, 0x14, 0xe0, 0x21, 0x7d, 0x3c, 0x3e, 0x20, 0xc3, 0x0c, 0x65, 0xe1, + 0x51, 0x62, 0x05, 0x0c, 0xd5, 0xa8, 0xc2, 0x35, 0x38, 0x9c, 0x46, 0x15, 0xc3, 0xc1, 0x58, 0x6e, + 0x05, 0x75, 0xed, 0xb8, 0x21, 0x8e, 0x8f, 0x47, 0x21, 0x38, 0xb4, 0x31, 0x36, 0xc2, 0x23, 0xe4, + 0xc3, 0x18, 0x63, 0x87, 0x74, 0x8c, 0xfc, 0x39, 0x7e, 0x2b, 0x1a, 0x25, 0x06, 0x07, 0x68, 0x0a, + 0x23, 0x84, 0x61, 0xc8, 0xa6, 0x70, 0x48, 0x48, 0x7c, 0x59, 0x06, 0xa0, 0x0c, 0xac, 0x99, 0x7b, + 0xe4, 0x32, 0x9f, 0x11, 0x74, 0x67, 0xbd, 0x6e, 0xf5, 0xf2, 0x00, 0xb7, 0xfa, 0x84, 0x21, 0x5c, + 0x92, 0xae, 0x04, 0x86, 0xa4, 0xec, 0x56, 0x72, 0xec, 0x2b, 0x81, 0xf1, 0xe5, 0xa7, 0x8f, 0xf1, + 0x17, 0xa9, 0x35, 0x17, 0x1c, 0x30, 0xfd, 0xad, 0x91, 0xa0, 0x1c, 0x9a, 0xfd, 0xcb, 0xfc, 0xec, + 0xff, 0x00, 0xd8, 0x0e, 0x6b, 0x23, 0x0e, 0x3a, 0x38, 0x9a, 0xbe, 0x8d, 0x78, 0x78, 0x07, 0x44, + 0x7f, 0x36, 0x0b, 0x47, 0x59, 0x27, 0xf2, 0x83, 0x00, 0x71, 0xc2, 0x73, 0x78, 0x5c, 0x27, 0x39, + 0x00, 0xe5, 0x51, 0x2d, 0x48, 0x25, 0x59, 0xca, 0x14, 0x60, 0x6f, 0x2c, 0xab, 0x1b, 0xf9, 0xf2, + 0x03, 0x5d, 0xcd, 0x68, 0x8b, 0x87, 0xfb, 0x1d, 0x00, 0xbc, 0xb7, 0xd6, 0x28, 0xf3, 0x6b, 0x8d, + 0x7d, 0x56, 0x26, 0x13, 0xef, 0x5c, 0x13, 0x91, 0x51, 0x76, 0xc7, 0xbe, 0x73, 0x1d, 0x5d, 0x76, + 0xfa, 0x28, 0xbd, 0x43, 0x86, 0x6c, 0xdd, 0xb4, 0x1c, 0xf4, 0xdc, 0x24, 0xad, 0x93, 0x4a, 0x3e, + 0x00, 0xc9, 0x7b, 0x57, 0x4a, 0xdc, 0x2d, 0xcd, 0x37, 0xc7, 0x1f, 0x75, 0xd6, 0x1c, 0x8d, 0x78, + 0x75, 0xbb, 0xe5, 0x87, 0xae, 0x6b, 0x4e, 0x1a, 0x4f, 0x87, 0xca, 0xaf, 0x1e, 0x7d, 0x00, 0x23, + 0xb5, 0x78, 0x3a, 0x91, 0x25, 0xa7, 0x8f, 0xdb, 0xc3, 0x47, 0x99, 0x6f, 0xeb, 0x92, 0xde, 0xc1, + 0xe8, 0xb9, 0xd4, 0x65, 0xa4, 0xaa, 0xed, 0x60, 0xf1, 0x23, 0x31, 0xb1, 0xae, 0xad, 0x24, 0xbe, + 0xac, 0x1c, 0xc4, 0x97, 0x4d, 0xda, 0xa0, 0xe8, 0x01, 0x74, 0xca, 0xd2, 0xb8, 0x1b, 0x54, 0x4c, + 0xd9, 0x63, 0x89, 0xd3, 0x79, 0xac, 0x8e, 0x1d, 0x6a, 0x54, 0xd6, 0xbc, 0x1b, 0x58, 0x7e, 0x7a, + 0x24, 0x11, 0x3b, 0xfd, 0x0b, 0x5e, 0xe4, 0x9e, 0x0b, 0x5e, 0xde, 0x1d, 0x06, 0x67, 0x8d, 0x07, + 0xe7, 0xc7, 0xa3, 0x05, 0xc4, 0x33, 0x39, 0x12, 0x98, 0xde, 0xec, 0xc3, 0xb4, 0xce, 0xc1, 0x74, + 0xc7, 0x90, 0x5c, 0xa4, 0x0f, 0xd8, 0xaf, 0xe4, 0xe0, 0x28, 0x9d, 0xf4, 0x17, 0x8d, 0x36, 0x8b, + 0xb0, 0xfa, 0x06, 0xe9, 0x90, 0x37, 0xdb, 0xf6, 0x87, 0x60, 0xe5, 0x62, 0x39, 0xe7, 0x7a, 0x6f, + 0xc7, 0x5f, 0xa0, 0xe1, 0x5c, 0xdd, 0x4e, 0x94, 0xec, 0xb4, 0x89, 0xdf, 0x90, 0xef, 0xff, 0xc7, + 0xdf, 0x65, 0x34, 0x21, 0x7e, 0x97, 0xd1, 0x9f, 0x26, 0x5b, 0xb7, 0x23, 0x45, 0xf7, 0x08, 0x3c, + 0x65, 0xdb, 0x29, 0xc1, 0x8a, 0x9e, 0x00, 0x77, 0x3f, 0x1c, 0xee, 0x64, 0x41, 0x04, 0x91, 0x21, + 0xdd, 0xc9, 0x08, 0x81, 0xc3, 0x74, 0x27, 0x1b, 0xc4, 0xc0, 0x18, 0x6e, 0xb5, 0xcf, 0xb1, 0xdd, + 0x7c, 0xd2, 0x6e, 0xd0, 0x5f, 0x4b, 0xa9, 0x8f, 0xd2, 0xdf, 0xc9, 0x24, 0xf2, 0x7f, 0x26, 0x7c, + 0xc5, 0x0f, 0xd3, 0x49, 0x3c, 0x9a, 0xe3, 0xc8, 0x8d, 0x61, 0xdd, 0x48, 0x22, 0xbe, 0xe8, 0xe7, + 0xf4, 0xb6, 0xb3, 0x3d, 0xa2, 0x13, 0x1d, 0x17, 0x5d, 0x5a, 0xde, 0xf5, 0xc8, 0xe4, 0x05, 0xfd, + 0x7b, 0x26, 0x51, 0x08, 0x29, 0x5f, 0x24, 0x84, 0xad, 0x08, 0x11, 0x27, 0x08, 0xfc, 0x14, 0x4b, + 0x6f, 0x8c, 0x1a, 0x7d, 0x56, 0x6f, 0x63, 0xf3, 0x51, 0xa8, 0xd1, 0x84, 0xaf, 0xd1, 0x69, 0x74, + 0x1c, 0xb9, 0x1f, 0x52, 0x8d, 0xf6, 0x45, 0x32, 0x22, 0x8d, 0x8e, 0xa5, 0x97, 0xbe, 0x8c, 0x5f, + 0x36, 0xc3, 0x26, 0x52, 0xab, 0xba, 0x71, 0x01, 0xfd, 0x4b, 0xde, 0xbb, 0x98, 0xf9, 0x9c, 0xee, + 0x6c, 0xb3, 0x58, 0x30, 0x7f, 0x20, 0x7c, 0x37, 0xca, 0x10, 0xf1, 0x5e, 0xf8, 0x70, 0x52, 0xb9, + 0x7d, 0xe1, 0xa4, 0x8a, 0x30, 0xab, 0x1b, 0x0e, 0xb6, 0x0c, 0xad, 0xb3, 0xd4, 0xd1, 0xb6, 0xec, + 0x53, 0x13, 0x7d, 0x2f, 0xaf, 0xab, 0x84, 0xf2, 0xa8, 0xfc, 0x1f, 0xe1, 0xeb, 0x2b, 0x27, 0xf9, + 0xeb, 0x2b, 0x23, 0xa2, 0x5f, 0x4d, 0x45, 0x47, 0xbf, 0xf2, 0xa3, 0x5b, 0xc1, 0xe0, 0xe0, 0xd8, + 0xa2, 0xb6, 0x71, 0xc2, 0x70, 0x7f, 0x37, 0x0b, 0x46, 0x61, 0xf3, 0x43, 0x3f, 0xbe, 0x52, 0x4e, + 0xb4, 0xba, 0xe7, 0x2a, 0xc2, 0x7c, 0xaf, 0x12, 0x24, 0xb6, 0x50, 0xc3, 0x95, 0x97, 0x7b, 0x2a, + 0xef, 0x9b, 0x3c, 0x59, 0x01, 0x93, 0x27, 0xac, 0x54, 0x39, 0x31, 0xa5, 0x4a, 0xb2, 0x58, 0x28, + 0x52, 0xdb, 0x31, 0x9c, 0x46, 0xca, 0xc1, 0x31, 0x2f, 0xda, 0x6d, 0xb7, 0x8b, 0x35, 0x4b, 0x33, + 0x5a, 0x18, 0x7d, 0x58, 0x1a, 0x85, 0xd9, 0xbb, 0x04, 0x93, 0x7a, 0xcb, 0x34, 0xea, 0xfa, 0x33, + 0xbd, 0xcb, 0xe5, 0xe2, 0x83, 0xac, 0x13, 0x89, 0x54, 0xd8, 0x1f, 0xaa, 0xff, 0xaf, 0x52, 0x81, + 0xa9, 0x96, 0x66, 0xb5, 0x69, 0x10, 0xbe, 0x5c, 0xcf, 0x45, 0x4e, 0x91, 0x84, 0x4a, 0xde, 0x2f, + 0x6a, 0xf0, 0xb7, 0x52, 0xe3, 0x85, 0x98, 0xef, 0x89, 0xe6, 0x11, 0x49, 0x6c, 0x31, 0xf8, 0x89, + 0x93, 0xb9, 0x2b, 0x1d, 0x0b, 0x77, 0xc8, 0x1d, 0xf4, 0xb4, 0x87, 0x98, 0x52, 0x83, 0x84, 0xa4, + 0xcb, 0x03, 0xa4, 0xa8, 0x7d, 0x68, 0x8c, 0x7b, 0x79, 0x40, 0x88, 0x8b, 0xf4, 0x35, 0xf3, 0xad, + 0x79, 0x98, 0xa5, 0xbd, 0x1a, 0x13, 0x27, 0x7a, 0x1e, 0xb9, 0x42, 0xda, 0xb9, 0x17, 0x5f, 0x42, + 0xf5, 0x83, 0x8f, 0xc9, 0x05, 0x90, 0x2f, 0xf8, 0x01, 0x07, 0xdd, 0xc7, 0xa4, 0xfb, 0xf6, 0x1e, + 0x5f, 0xf3, 0x94, 0xa7, 0x71, 0xef, 0xdb, 0xc7, 0x17, 0x9f, 0x3e, 0x3e, 0xbf, 0x26, 0x83, 0x5c, + 0x6c, 0xb7, 0x51, 0xeb, 0xe0, 0x50, 0x5c, 0x03, 0xd3, 0x5e, 0x9b, 0x09, 0x62, 0x40, 0x86, 0x93, + 0x92, 0x2e, 0x82, 0xfa, 0xb2, 0x29, 0xb6, 0xc7, 0xbe, 0xab, 0x10, 0x53, 0x76, 0xfa, 0xa0, 0xfc, + 0xd6, 0x04, 0x6b, 0x34, 0x0b, 0xa6, 0x79, 0x81, 0x1c, 0x95, 0x79, 0xae, 0x0c, 0xb9, 0x25, 0xec, + 0xb4, 0xb6, 0x47, 0xd4, 0x66, 0x76, 0xad, 0x8e, 0xd7, 0x66, 0xf6, 0xdd, 0x87, 0x3f, 0xd8, 0x86, + 0xf5, 0xd8, 0x9a, 0x27, 0x2c, 0x8d, 0x3b, 0xba, 0x73, 0x6c, 0xe9, 0xe9, 0x83, 0xf3, 0xef, 0x32, + 0xcc, 0xf9, 0x2b, 0x5c, 0x14, 0x93, 0x5f, 0xc9, 0x3c, 0xda, 0xd6, 0x3b, 0xd1, 0x67, 0x93, 0x85, + 0x48, 0xf3, 0x65, 0xca, 0xd7, 0x2c, 0xe5, 0x85, 0xc5, 0x04, 0xc1, 0xd3, 0xc4, 0x18, 0x1c, 0xc3, + 0x0c, 0x5e, 0x86, 0x49, 0xc2, 0xd0, 0xa2, 0xbe, 0x47, 0x5c, 0x07, 0xb9, 0x85, 0xc6, 0x67, 0x8d, + 0x64, 0xa1, 0xf1, 0x0e, 0x7e, 0xa1, 0x51, 0x30, 0xe2, 0xb1, 0xb7, 0xce, 0x98, 0xd0, 0x97, 0xc6, + 0xfd, 0x7f, 0xe4, 0xcb, 0x8c, 0x09, 0x7c, 0x69, 0x06, 0x94, 0x9f, 0x3e, 0xa2, 0xaf, 0xfc, 0x4f, + 0xac, 0xb3, 0xf5, 0x36, 0x54, 0xd1, 0xff, 0x3c, 0x06, 0xd9, 0xb3, 0xee, 0xc3, 0xff, 0x0e, 0x6e, + 0xc4, 0x7a, 0xd1, 0x08, 0x82, 0x33, 0x3c, 0x1d, 0xb2, 0x2e, 0x7d, 0x36, 0x6d, 0xb9, 0x51, 0x6c, + 0x77, 0xd7, 0x65, 0x44, 0x25, 0xff, 0x29, 0x27, 0x21, 0x6f, 0x9b, 0xbb, 0x56, 0xcb, 0x35, 0x9f, + 0x5d, 0x8d, 0x61, 0x6f, 0x49, 0x83, 0x92, 0x72, 0xa4, 0xe7, 0x47, 0xe7, 0x32, 0x1a, 0xba, 0x20, + 0x49, 0xe6, 0x2e, 0x48, 0x4a, 0xb0, 0x7f, 0x20, 0xc0, 0x5b, 0xfa, 0x1a, 0xf1, 0xd7, 0xe4, 0xae, + 0xc0, 0xf6, 0xa8, 0x60, 0x8f, 0x10, 0xcb, 0x41, 0xd5, 0x21, 0xa9, 0xc3, 0x37, 0x2f, 0x5a, 0x3f, + 0x0e, 0xfc, 0x58, 0x1d, 0xbe, 0x05, 0x78, 0x18, 0xcb, 0x29, 0xf5, 0x3c, 0x73, 0x52, 0xbd, 0x6f, + 0x94, 0xe8, 0x66, 0x39, 0xa5, 0x3f, 0x10, 0x3a, 0x23, 0x74, 0x5e, 0x1d, 0x1a, 0x9d, 0x43, 0x72, + 0x5f, 0xfd, 0x88, 0x4c, 0x22, 0x61, 0x7a, 0x46, 0x8e, 0xf8, 0x45, 0x47, 0x89, 0x21, 0x72, 0xc7, + 0x60, 0x2e, 0x0e, 0xf4, 0xec, 0xf0, 0xa1, 0xc1, 0x79, 0xd1, 0x85, 0xf8, 0x1f, 0x77, 0x68, 0x70, + 0x51, 0x46, 0xd2, 0x07, 0xf2, 0x35, 0xf4, 0x62, 0xb1, 0x62, 0xcb, 0xd1, 0xf7, 0x46, 0xdc, 0xd2, + 0xf8, 0xe1, 0x25, 0x61, 0x34, 0xe0, 0x7d, 0x12, 0xa2, 0x1c, 0x8e, 0x3b, 0x1a, 0xb0, 0x18, 0x1b, + 0xe9, 0xc3, 0xf4, 0x77, 0x79, 0x57, 0x7a, 0x6c, 0x6d, 0xe6, 0xb5, 0x6c, 0x35, 0x00, 0x1f, 0x1c, + 0xad, 0x33, 0x30, 0x13, 0x9a, 0xfa, 0x7b, 0x17, 0xd6, 0x70, 0x69, 0x49, 0x0f, 0xba, 0xfb, 0x22, + 0x1b, 0xf9, 0xc2, 0x40, 0x82, 0x05, 0x5f, 0x11, 0x26, 0xc6, 0x72, 0x1f, 0x9c, 0x37, 0x86, 0x8d, + 0x09, 0xab, 0x3f, 0x08, 0x63, 0x55, 0xe3, 0xb1, 0xba, 0x4d, 0x44, 0x4c, 0x62, 0x63, 0x9a, 0xd0, + 0xbc, 0xf1, 0x2d, 0x3e, 0x5c, 0x2a, 0x07, 0xd7, 0xd3, 0x87, 0xe6, 0x23, 0x7d, 0xc4, 0x5e, 0x4c, + 0xbb, 0xc3, 0x3a, 0x35, 0xd9, 0x47, 0xd3, 0x1d, 0xb2, 0xd9, 0x80, 0xcc, 0xcd, 0x06, 0x12, 0xfa, + 0xdb, 0x07, 0x6e, 0xa4, 0x1e, 0x73, 0x83, 0x20, 0xca, 0x8e, 0xd8, 0xdf, 0x7e, 0x20, 0x07, 0xe9, + 0x83, 0xf3, 0x4f, 0x32, 0xc0, 0xb2, 0x65, 0xee, 0x76, 0x6b, 0x56, 0x1b, 0x5b, 0xe8, 0x6f, 0x83, + 0x09, 0xc0, 0x0b, 0x46, 0x30, 0x01, 0x58, 0x07, 0xd8, 0xf2, 0x89, 0x33, 0x0d, 0xbf, 0x45, 0xcc, + 0xdc, 0x0f, 0x98, 0x52, 0x43, 0x34, 0xf8, 0x2b, 0x67, 0x7f, 0x82, 0xc7, 0x38, 0xae, 0xcf, 0x0a, + 0xc8, 0x8d, 0x72, 0x02, 0xf0, 0x36, 0x1f, 0xeb, 0x06, 0x87, 0xf5, 0xdd, 0x07, 0xe0, 0x24, 0x7d, + 0xcc, 0xff, 0x79, 0x02, 0xa6, 0xe9, 0x76, 0x1d, 0x95, 0xe9, 0x3f, 0x04, 0xa0, 0xff, 0xd6, 0x08, + 0x40, 0xdf, 0x80, 0x19, 0x33, 0xa0, 0x4e, 0xfb, 0xd4, 0xf0, 0x02, 0x4c, 0x2c, 0xec, 0x21, 0xbe, + 0x54, 0x8e, 0x0c, 0xfa, 0x60, 0x18, 0x79, 0x95, 0x47, 0xfe, 0x8e, 0x18, 0x79, 0x87, 0x28, 0x8e, + 0x12, 0xfa, 0xb7, 0xfb, 0xd0, 0x6f, 0x70, 0xd0, 0x17, 0x0f, 0xc2, 0xca, 0x18, 0xc2, 0xed, 0xcb, + 0x90, 0x25, 0xa7, 0xe3, 0x7e, 0x3b, 0xc5, 0xf9, 0xfd, 0x29, 0x98, 0x20, 0x4d, 0xd6, 0x9f, 0x77, + 0x78, 0xaf, 0xee, 0x17, 0x6d, 0xd3, 0xc1, 0x96, 0xef, 0xb1, 0xe0, 0xbd, 0xba, 0x3c, 0x78, 0x5e, + 0xc9, 0xf6, 0xa9, 0x3c, 0xdd, 0x88, 0xf4, 0x13, 0x86, 0x9e, 0x94, 0x84, 0x25, 0x3e, 0xb2, 0xf3, + 0x72, 0xc3, 0x4c, 0x4a, 0x06, 0x30, 0x92, 0x3e, 0xf0, 0x7f, 0x99, 0x85, 0x53, 0x74, 0x55, 0x69, + 0xc9, 0x32, 0x77, 0x7a, 0x6e, 0xb7, 0xd2, 0x0f, 0xae, 0x0b, 0xd7, 0xc3, 0x9c, 0xc3, 0xf9, 0x63, + 0x33, 0x9d, 0xe8, 0x49, 0x45, 0x7f, 0x16, 0xf6, 0xa9, 0x78, 0x06, 0x8f, 0xe4, 0x42, 0x8c, 0x00, + 0xa3, 0x78, 0x4f, 0xbc, 0x50, 0x2f, 0xc8, 0x68, 0x68, 0x91, 0x4a, 0x1e, 0x6a, 0xcd, 0xd2, 0xd7, + 0xa9, 0x9c, 0x88, 0x4e, 0xbd, 0xc7, 0xd7, 0xa9, 0x9f, 0xe2, 0x74, 0x6a, 0xf9, 0xe0, 0x22, 0x49, + 0x5f, 0xb7, 0x5e, 0xe1, 0x6f, 0x0c, 0xf9, 0xdb, 0x76, 0x3b, 0x29, 0x6c, 0xd6, 0x85, 0xfd, 0x91, + 0xb2, 0x9c, 0x3f, 0x12, 0x7f, 0x1f, 0x45, 0x82, 0x99, 0x30, 0xcf, 0x75, 0x84, 0x2e, 0xcd, 0x81, + 0xa4, 0x7b, 0xdc, 0x49, 0x7a, 0x7b, 0xa8, 0xb9, 0x6e, 0x6c, 0x41, 0x63, 0x58, 0x5b, 0x9a, 0x83, + 0xfc, 0x92, 0xde, 0x71, 0xb0, 0x85, 0xbe, 0xc8, 0x66, 0xba, 0xaf, 0x48, 0x71, 0x00, 0x58, 0x84, + 0xfc, 0x26, 0x29, 0x8d, 0x99, 0xcc, 0x37, 0x89, 0xb5, 0x1e, 0xca, 0xa1, 0xca, 0xfe, 0x4d, 0x1a, + 0x9d, 0xaf, 0x87, 0xcc, 0xc8, 0xa6, 0xc8, 0x09, 0xa2, 0xf3, 0x0d, 0x66, 0x61, 0x2c, 0x17, 0x53, + 0xe5, 0x55, 0xbc, 0xe3, 0x8e, 0xf1, 0x17, 0xd2, 0x43, 0xb8, 0x00, 0xb2, 0xde, 0xb6, 0x49, 0xe7, + 0x38, 0xa5, 0xba, 0x8f, 0x49, 0x7d, 0x85, 0x7a, 0x45, 0x45, 0x59, 0x1e, 0xb7, 0xaf, 0x90, 0x10, + 0x17, 0xe9, 0x63, 0xf6, 0x1d, 0xe2, 0x28, 0xda, 0xed, 0x68, 0x2d, 0xec, 0x72, 0x9f, 0x1a, 0x6a, + 0xb4, 0x27, 0xcb, 0x7a, 0x3d, 0x59, 0xa8, 0x9d, 0xe6, 0x0e, 0xd0, 0x4e, 0x87, 0x5d, 0x86, 0xf4, + 0x65, 0x4e, 0x2a, 0x7e, 0x68, 0xcb, 0x90, 0xb1, 0x6c, 0x8c, 0xe1, 0xda, 0x51, 0xef, 0x20, 0xed, + 0x58, 0x5b, 0xeb, 0xb0, 0x9b, 0x34, 0x4c, 0x58, 0x23, 0x3b, 0x34, 0x3b, 0xcc, 0x26, 0x4d, 0x34, + 0x0f, 0x63, 0x40, 0x6b, 0x8e, 0xa1, 0xf5, 0x19, 0x36, 0x8c, 0xa6, 0xbc, 0x4f, 0x6a, 0x9b, 0x96, + 0x93, 0x6c, 0x9f, 0xd4, 0xe5, 0x4e, 0x25, 0xff, 0x25, 0x3d, 0x78, 0xc5, 0x9f, 0xab, 0x1e, 0xd5, + 0xf0, 0x99, 0xe0, 0xe0, 0xd5, 0x20, 0x06, 0xd2, 0x87, 0xf7, 0x8d, 0x87, 0x34, 0x78, 0x0e, 0xdb, + 0x1c, 0x59, 0x1b, 0x18, 0xd9, 0xd0, 0x39, 0x4c, 0x73, 0x8c, 0xe6, 0x21, 0x7d, 0xbc, 0xbe, 0x19, + 0x1a, 0x38, 0x5f, 0x3f, 0xc6, 0x81, 0xd3, 0x6b, 0x99, 0xb9, 0x21, 0x5b, 0xe6, 0xb0, 0xfb, 0x3f, + 0x4c, 0xd6, 0xa3, 0x1b, 0x30, 0x87, 0xd9, 0xff, 0x89, 0x61, 0x22, 0x7d, 0xc4, 0xdf, 0x20, 0x43, + 0xae, 0x3e, 0xfe, 0xf1, 0x72, 0xd8, 0xb9, 0x08, 0x91, 0x55, 0x7d, 0x64, 0xc3, 0xe5, 0x30, 0x73, + 0x91, 0x48, 0x16, 0xc6, 0x10, 0x78, 0xff, 0x28, 0xcc, 0x90, 0x25, 0x11, 0x6f, 0x9b, 0xf5, 0x9b, + 0x6c, 0xd4, 0x7c, 0x24, 0xc5, 0xb6, 0x7a, 0x0f, 0x4c, 0x7a, 0xfb, 0x77, 0x6c, 0xe4, 0x9c, 0x17, + 0x6b, 0x9f, 0x1e, 0x97, 0xaa, 0xff, 0xff, 0x81, 0x9c, 0x21, 0x46, 0xbe, 0x57, 0x3b, 0xac, 0x33, + 0xc4, 0xa1, 0xee, 0xd7, 0xfe, 0x69, 0x30, 0xa2, 0xfe, 0x97, 0xf4, 0x30, 0xef, 0xdd, 0xc7, 0xcd, + 0xf6, 0xd9, 0xc7, 0xfd, 0x70, 0x18, 0xcb, 0x3a, 0x8f, 0xe5, 0x9d, 0xa2, 0x22, 0x1c, 0xe1, 0x58, + 0xfb, 0x0e, 0x1f, 0xce, 0xb3, 0x1c, 0x9c, 0x0b, 0x07, 0xe2, 0x65, 0x0c, 0x07, 0x1f, 0xb3, 0xc1, + 0x98, 0xfb, 0xd1, 0x14, 0xdb, 0x71, 0xcf, 0xa9, 0x8a, 0xec, 0xbe, 0x53, 0x15, 0x5c, 0x4b, 0xcf, + 0x1d, 0xb0, 0xa5, 0x7f, 0x34, 0xac, 0x1d, 0x0d, 0x5e, 0x3b, 0x9e, 0x2e, 0x8e, 0xc8, 0xe8, 0x46, + 0xe6, 0x77, 0xfa, 0xea, 0x71, 0x8e, 0x53, 0x8f, 0xd2, 0xc1, 0x98, 0x49, 0x5f, 0x3f, 0xfe, 0xc8, + 0x9b, 0xd0, 0x1e, 0x72, 0x7b, 0x1f, 0x76, 0xab, 0x98, 0x13, 0xe2, 0xc8, 0x46, 0xee, 0x61, 0xb6, + 0x8a, 0x07, 0x71, 0x32, 0x86, 0x58, 0x6c, 0xb3, 0x30, 0x4d, 0x78, 0x3a, 0xa7, 0xb7, 0xb7, 0xb0, + 0x83, 0x5e, 0x49, 0x7d, 0x14, 0xbd, 0xc8, 0x97, 0x23, 0x0a, 0x4f, 0x14, 0x75, 0xde, 0x35, 0xa9, + 0x47, 0x07, 0x65, 0x72, 0x3e, 0xc4, 0xe0, 0xb8, 0x23, 0x28, 0x0e, 0xe4, 0x20, 0x7d, 0xc8, 0x3e, + 0x48, 0xdd, 0x6d, 0x56, 0xb5, 0x4b, 0xe6, 0xae, 0x83, 0x1e, 0x1c, 0x41, 0x07, 0xbd, 0x00, 0xf9, + 0x0e, 0xa1, 0xc6, 0x8e, 0x65, 0xc4, 0x4f, 0x77, 0x98, 0x08, 0x68, 0xf9, 0x2a, 0xfb, 0x33, 0xe9, + 0xd9, 0x8c, 0x40, 0x8e, 0x94, 0xce, 0xb8, 0xcf, 0x66, 0x0c, 0x28, 0x7f, 0x2c, 0x77, 0xec, 0x4c, + 0xba, 0xa5, 0xeb, 0x3b, 0xba, 0x33, 0xa2, 0x08, 0x0e, 0x1d, 0x97, 0x96, 0x17, 0xc1, 0x81, 0xbc, + 0x24, 0x3d, 0x31, 0x1a, 0x92, 0x8a, 0xfb, 0xfb, 0xb8, 0x4f, 0x8c, 0xc6, 0x17, 0x9f, 0x3e, 0x26, + 0xbf, 0x41, 0x5b, 0xd6, 0x59, 0xea, 0x7c, 0x9b, 0xa2, 0x5f, 0xef, 0xd0, 0x8d, 0x85, 0xb2, 0x76, + 0x78, 0x8d, 0xa5, 0x6f, 0xf9, 0xe9, 0x03, 0xf3, 0xdf, 0x7f, 0x14, 0x72, 0x8b, 0xf8, 0xfc, 0xee, + 0x16, 0xba, 0x03, 0x26, 0x1b, 0x16, 0xc6, 0x15, 0x63, 0xd3, 0x74, 0xa5, 0xeb, 0xb8, 0xcf, 0x1e, + 0x24, 0xec, 0xcd, 0xc5, 0x63, 0x1b, 0x6b, 0xed, 0xe0, 0xfc, 0x99, 0xf7, 0x8a, 0x5e, 0x24, 0x41, + 0xb6, 0xee, 0x68, 0x0e, 0x9a, 0xf2, 0xb1, 0x45, 0x0f, 0x86, 0xb1, 0xb8, 0x83, 0xc7, 0xe2, 0x7a, + 0x4e, 0x16, 0x84, 0x83, 0x79, 0xf7, 0xff, 0x08, 0x00, 0x10, 0x4c, 0xde, 0x6f, 0x9b, 0x86, 0x9b, + 0xc3, 0x3b, 0x02, 0xe9, 0xbd, 0xa3, 0x97, 0xfb, 0xe2, 0xbe, 0x8b, 0x13, 0xf7, 0xe3, 0xc5, 0x8a, + 0x18, 0xc3, 0x4a, 0x9b, 0x04, 0x53, 0xae, 0x68, 0x57, 0xb0, 0xd6, 0xb6, 0xd1, 0x8f, 0x04, 0xca, + 0x1f, 0x21, 0x66, 0xf4, 0x5e, 0xe1, 0x60, 0x9c, 0xb4, 0x56, 0x3e, 0xf1, 0x68, 0x8f, 0x0e, 0x6f, + 0xf3, 0x5f, 0xe2, 0x83, 0x91, 0xdc, 0x0c, 0x59, 0xdd, 0xd8, 0x34, 0x99, 0x7f, 0xe1, 0x95, 0x11, + 0xb4, 0x5d, 0x9d, 0x50, 0x49, 0x46, 0xc1, 0x48, 0x9d, 0xf1, 0x6c, 0x8d, 0xe5, 0xd2, 0xbb, 0xac, + 0x5b, 0x3a, 0xfa, 0xff, 0x0f, 0x14, 0xb6, 0xa2, 0x40, 0xb6, 0xab, 0x39, 0xdb, 0xac, 0x68, 0xf2, + 0xec, 0xda, 0xc8, 0xbb, 0x86, 0x66, 0x98, 0xc6, 0xa5, 0x1d, 0xfd, 0x99, 0xfe, 0xdd, 0xba, 0x5c, + 0x9a, 0xcb, 0xf9, 0x16, 0x36, 0xb0, 0xa5, 0x39, 0xb8, 0xbe, 0xb7, 0x45, 0xe6, 0x58, 0x93, 0x6a, + 0x38, 0x29, 0xb1, 0xfe, 0xbb, 0x1c, 0x47, 0xeb, 0xff, 0xa6, 0xde, 0xc1, 0x24, 0x52, 0x13, 0xd3, + 0x7f, 0xef, 0x3d, 0x91, 0xfe, 0xf7, 0x29, 0x22, 0x7d, 0x34, 0xbe, 0x2b, 0xc1, 0x4c, 0xdd, 0x55, + 0xb8, 0xfa, 0xee, 0xce, 0x8e, 0x66, 0x5d, 0x42, 0xd7, 0x06, 0xa8, 0x84, 0x54, 0x33, 0xc3, 0xfb, + 0xa5, 0x7c, 0x44, 0xf8, 0x5a, 0x69, 0xd6, 0xb4, 0x43, 0x25, 0x24, 0x6e, 0x07, 0x4f, 0x84, 0x9c, + 0xab, 0xde, 0x9e, 0xc7, 0x65, 0x6c, 0x43, 0xa0, 0x39, 0x05, 0x23, 0x5a, 0x0d, 0xe4, 0x6d, 0x0c, + 0xd1, 0x34, 0x24, 0x38, 0x5a, 0x77, 0xb4, 0xd6, 0x85, 0x65, 0xd3, 0x32, 0x77, 0x1d, 0xdd, 0xc0, + 0x36, 0x7a, 0x4c, 0x80, 0x80, 0xa7, 0xff, 0x99, 0x40, 0xff, 0xd1, 0xf7, 0x33, 0xa2, 0xa3, 0xa8, + 0xdf, 0xad, 0x86, 0xc9, 0x47, 0x04, 0xa8, 0x12, 0x1b, 0x17, 0x45, 0x28, 0xa6, 0x2f, 0xb4, 0xd7, + 0xcb, 0x50, 0x28, 0x3f, 0xd0, 0x35, 0x2d, 0x67, 0xd5, 0x6c, 0x69, 0x1d, 0xdb, 0x31, 0x2d, 0x8c, + 0x6a, 0xb1, 0x52, 0x73, 0x7b, 0x98, 0xb6, 0xd9, 0x0a, 0x06, 0x47, 0xf6, 0x16, 0x56, 0x3b, 0x99, + 0xd7, 0xf1, 0x0f, 0x0a, 0xef, 0x32, 0x52, 0xa9, 0xf4, 0x72, 0x14, 0xa1, 0xe7, 0xfd, 0xba, 0xb4, + 0x64, 0x87, 0x25, 0xc4, 0x76, 0x1e, 0x85, 0x98, 0x1a, 0xc3, 0x52, 0xb9, 0x04, 0xb3, 0xf5, 0xdd, + 0xf3, 0x3e, 0x11, 0x3b, 0x6c, 0x84, 0xbc, 0x4a, 0x38, 0x4a, 0x05, 0x53, 0xbc, 0x30, 0xa1, 0x08, + 0xf9, 0x5e, 0x07, 0xb3, 0x76, 0x38, 0x1b, 0xc3, 0x9b, 0x4f, 0x14, 0x8c, 0x4e, 0x31, 0xb8, 0xd4, + 0xf4, 0x05, 0xf8, 0x4e, 0x09, 0x66, 0x6b, 0x5d, 0x6c, 0xe0, 0x36, 0xf5, 0x82, 0xe4, 0x04, 0xf8, + 0xa2, 0x84, 0x02, 0xe4, 0x08, 0x45, 0x08, 0x30, 0xf0, 0x58, 0x5e, 0xf4, 0x84, 0x17, 0x24, 0x24, + 0x12, 0x5c, 0x5c, 0x69, 0xe9, 0x0b, 0xee, 0x0b, 0x12, 0x4c, 0xab, 0xbb, 0xc6, 0xba, 0x65, 0xba, + 0xa3, 0xb1, 0x85, 0xee, 0x0c, 0x3a, 0x88, 0x9b, 0xe0, 0x58, 0x7b, 0xd7, 0x22, 0xeb, 0x4f, 0x15, + 0xa3, 0x8e, 0x5b, 0xa6, 0xd1, 0xb6, 0x49, 0x3d, 0x72, 0xea, 0xfe, 0x0f, 0xb7, 0x67, 0x9f, 0xfb, + 0x35, 0x39, 0x83, 0x9e, 0x27, 0x1c, 0xea, 0x86, 0x56, 0x3e, 0x54, 0xb4, 0x78, 0x4f, 0x20, 0x18, + 0xd0, 0x66, 0x50, 0x09, 0xe9, 0x0b, 0xf7, 0x33, 0x12, 0x28, 0xc5, 0x56, 0xcb, 0xdc, 0x35, 0x9c, + 0x3a, 0xee, 0xe0, 0x96, 0xd3, 0xb0, 0xb4, 0x16, 0x0e, 0xdb, 0xcf, 0x05, 0x90, 0xdb, 0xba, 0xc5, + 0xfa, 0x60, 0xf7, 0x91, 0xc9, 0xf1, 0x45, 0xc2, 0x3b, 0x8e, 0xb4, 0x96, 0xfb, 0x4b, 0x49, 0x20, + 0x4e, 0xb1, 0x7d, 0x45, 0xc1, 0x82, 0xd2, 0x97, 0xea, 0x47, 0x25, 0x98, 0xf2, 0x7a, 0xec, 0x2d, + 0x11, 0x61, 0xfe, 0x46, 0xc2, 0xc9, 0x88, 0x4f, 0x3c, 0x81, 0x0c, 0xdf, 0x9a, 0x60, 0x56, 0x11, + 0x45, 0x3f, 0x99, 0xe8, 0x8a, 0xc9, 0x45, 0xe7, 0xbe, 0x56, 0x6b, 0xcd, 0xa5, 0xda, 0xea, 0x62, + 0x59, 0x2d, 0xc8, 0xe8, 0x8b, 0x12, 0x64, 0xd7, 0x75, 0x63, 0x2b, 0x1c, 0x5d, 0xe9, 0xb8, 0x6b, + 0x47, 0xb6, 0xf1, 0x03, 0xac, 0xa5, 0xd3, 0x17, 0xe5, 0x56, 0x38, 0x6e, 0xec, 0xee, 0x9c, 0xc7, + 0x56, 0x6d, 0x93, 0x8c, 0xb2, 0x76, 0xc3, 0xac, 0x63, 0x83, 0x1a, 0xa1, 0x39, 0xb5, 0xef, 0x37, + 0xde, 0x04, 0x13, 0x98, 0x3c, 0xb8, 0x9c, 0x44, 0x48, 0xdc, 0x67, 0x4a, 0x0a, 0x31, 0x95, 0x68, + 0xda, 0xd0, 0x87, 0x78, 0xfa, 0x9a, 0xfa, 0xc7, 0x39, 0x38, 0x51, 0x34, 0x2e, 0x11, 0x9b, 0x82, + 0x76, 0xf0, 0xa5, 0x6d, 0xcd, 0xd8, 0xc2, 0x64, 0x80, 0xf0, 0x25, 0x1e, 0x0e, 0xd1, 0x9f, 0xe1, + 0x43, 0xf4, 0x2b, 0x2a, 0x4c, 0x98, 0x56, 0x1b, 0x5b, 0x0b, 0x97, 0x08, 0x4f, 0xbd, 0xcb, 0xce, + 0xac, 0x4d, 0xf6, 0x2b, 0x62, 0x9e, 0x91, 0x9f, 0xaf, 0xd1, 0xff, 0x55, 0x8f, 0xd0, 0x99, 0x9b, + 0x60, 0x82, 0xa5, 0x29, 0x33, 0x30, 0x59, 0x53, 0x17, 0xcb, 0x6a, 0xb3, 0xb2, 0x58, 0x38, 0xa2, + 0x5c, 0x06, 0x47, 0x2b, 0x8d, 0xb2, 0x5a, 0x6c, 0x54, 0x6a, 0xd5, 0x26, 0x49, 0x2f, 0x64, 0xd0, + 0x73, 0xb2, 0xa2, 0x9e, 0xbd, 0xf1, 0xcc, 0xf4, 0x83, 0x55, 0x85, 0x89, 0x16, 0xcd, 0x40, 0x86, + 0xd0, 0xe9, 0x44, 0xb5, 0x63, 0x04, 0x69, 0x82, 0xea, 0x11, 0x52, 0x4e, 0x03, 0x5c, 0xb4, 0x4c, + 0x63, 0x2b, 0x38, 0x75, 0x38, 0xa9, 0x86, 0x52, 0xd0, 0x83, 0x19, 0xc8, 0xd3, 0x7f, 0xc8, 0x95, + 0x24, 0xe4, 0x29, 0x10, 0xbc, 0xf7, 0xee, 0x5a, 0xbc, 0x44, 0x5e, 0xc1, 0x44, 0x8b, 0xbd, 0xba, + 0xba, 0x48, 0x65, 0x40, 0x2d, 0x61, 0x56, 0x95, 0x9b, 0x21, 0x4f, 0xff, 0x65, 0x5e, 0x07, 0xd1, + 0xe1, 0x45, 0x69, 0x36, 0x41, 0x3f, 0x65, 0x71, 0x99, 0xa6, 0xaf, 0xcd, 0xef, 0x93, 0x60, 0xb2, + 0x8a, 0x9d, 0xd2, 0x36, 0x6e, 0x5d, 0x40, 0x8f, 0xe3, 0x17, 0x40, 0x3b, 0x3a, 0x36, 0x9c, 0xfb, + 0x76, 0x3a, 0xfe, 0x02, 0xa8, 0x97, 0x80, 0x7e, 0x31, 0xdc, 0xf9, 0xde, 0xcd, 0xeb, 0xcf, 0x8d, + 0x7d, 0xea, 0xea, 0x95, 0x10, 0xa1, 0x32, 0x27, 0x21, 0x6f, 0x61, 0x7b, 0xb7, 0xe3, 0x2d, 0xa2, + 0xb1, 0x37, 0xf4, 0xb0, 0x2f, 0xce, 0x12, 0x27, 0xce, 0x9b, 0xc5, 0x8b, 0x18, 0x43, 0xbc, 0xd2, + 0x2c, 0x4c, 0x54, 0x0c, 0xdd, 0xd1, 0xb5, 0x0e, 0x7a, 0x5e, 0x16, 0x66, 0xeb, 0xd8, 0x59, 0xd7, + 0x2c, 0x6d, 0x07, 0x3b, 0xd8, 0xb2, 0xd1, 0xb7, 0xf9, 0x3e, 0xa1, 0xdb, 0xd1, 0x9c, 0x4d, 0xd3, + 0xda, 0xf1, 0x54, 0xd3, 0x7b, 0x77, 0x55, 0x73, 0x0f, 0x5b, 0x76, 0xc0, 0x97, 0xf7, 0xea, 0x7e, + 0xb9, 0x68, 0x5a, 0x17, 0xdc, 0x41, 0x90, 0x4d, 0xd3, 0xd8, 0xab, 0x4b, 0xaf, 0x63, 0x6e, 0xad, + 0xe2, 0x3d, 0xec, 0x85, 0x4b, 0xf3, 0xdf, 0xdd, 0xb9, 0x40, 0xdb, 0xac, 0x9a, 0x8e, 0xdb, 0x69, + 0xaf, 0x9a, 0x5b, 0x34, 0x5e, 0xec, 0xa4, 0xca, 0x27, 0x06, 0xb9, 0xb4, 0x3d, 0x4c, 0x72, 0xe5, + 0xc3, 0xb9, 0x58, 0xa2, 0x32, 0x0f, 0x8a, 0xff, 0x5b, 0x03, 0x77, 0xf0, 0x0e, 0x76, 0xac, 0x4b, + 0xe4, 0x5a, 0x88, 0x49, 0xb5, 0xcf, 0x17, 0x36, 0x40, 0x8b, 0x4f, 0xd6, 0x99, 0xf4, 0xe6, 0x39, + 0xc9, 0x1d, 0x68, 0xb2, 0x2e, 0x42, 0x71, 0x2c, 0xd7, 0x5e, 0xc9, 0xae, 0x35, 0xf3, 0x12, 0x19, + 0xb2, 0x64, 0xf0, 0x7c, 0x43, 0x86, 0x5b, 0x61, 0xda, 0xc1, 0xb6, 0xad, 0x6d, 0x61, 0x6f, 0x85, + 0x89, 0xbd, 0x2a, 0xb7, 0x41, 0xae, 0x43, 0x30, 0xa5, 0x83, 0xc3, 0xb5, 0x5c, 0xcd, 0x5c, 0x03, + 0xc3, 0xa5, 0xe5, 0x8f, 0x04, 0x04, 0x6e, 0x95, 0xfe, 0x71, 0xe6, 0x1e, 0xc8, 0x51, 0xf8, 0xa7, + 0x20, 0xb7, 0x58, 0x5e, 0xd8, 0x58, 0x2e, 0x1c, 0x71, 0x1f, 0x3d, 0xfe, 0xa6, 0x20, 0xb7, 0x54, + 0x6c, 0x14, 0x57, 0x0b, 0x92, 0x5b, 0x8f, 0x4a, 0x75, 0xa9, 0x56, 0x90, 0xdd, 0xc4, 0xf5, 0x62, + 0xb5, 0x52, 0x2a, 0x64, 0x95, 0x69, 0x98, 0x38, 0x57, 0x54, 0xab, 0x95, 0xea, 0x72, 0x21, 0x87, + 0xfe, 0x2e, 0x8c, 0xdf, 0xed, 0x3c, 0x7e, 0xd7, 0x45, 0xf1, 0xd4, 0x0f, 0xb2, 0x97, 0xfa, 0x90, + 0xdd, 0xc9, 0x41, 0xf6, 0xa3, 0x22, 0x44, 0xc6, 0xe0, 0xce, 0x94, 0x87, 0x89, 0x75, 0xcb, 0x6c, + 0x61, 0xdb, 0x46, 0xbf, 0x29, 0x41, 0xbe, 0xa4, 0x19, 0x2d, 0xdc, 0x41, 0x57, 0x04, 0x50, 0x51, + 0x57, 0xd1, 0x8c, 0x7f, 0x5a, 0xec, 0x9f, 0x32, 0xa2, 0xbd, 0x1f, 0xa3, 0x3b, 0x4f, 0x69, 0x46, + 0xc8, 0x47, 0xac, 0x97, 0x8b, 0x25, 0x35, 0x86, 0xab, 0x71, 0x24, 0x98, 0x62, 0xab, 0x01, 0xe7, + 0x71, 0x78, 0x1e, 0xfe, 0xed, 0x8c, 0xe8, 0xe4, 0xd0, 0xab, 0x81, 0x4f, 0x26, 0x42, 0x1e, 0x62, + 0x13, 0xc1, 0x41, 0xd4, 0xc6, 0xb0, 0x79, 0x28, 0xc1, 0xf4, 0x86, 0x61, 0xf7, 0x13, 0x8a, 0x78, + 0x1c, 0x7d, 0xaf, 0x1a, 0x21, 0x42, 0x07, 0x8a, 0xa3, 0x3f, 0x98, 0x5e, 0xfa, 0x82, 0xf9, 0x76, + 0x06, 0x8e, 0x2f, 0x63, 0x03, 0x5b, 0x7a, 0x8b, 0xd6, 0xc0, 0x93, 0xc4, 0x9d, 0xbc, 0x24, 0x1e, + 0xc7, 0x71, 0xde, 0xef, 0x0f, 0x5e, 0x02, 0xaf, 0xf0, 0x25, 0x70, 0x37, 0x27, 0x81, 0x9b, 0x04, + 0xe9, 0x8c, 0xe1, 0x3e, 0xf4, 0x29, 0x98, 0xa9, 0x9a, 0x8e, 0xbe, 0xa9, 0xb7, 0xa8, 0x0f, 0xda, + 0x8b, 0x65, 0xc8, 0xae, 0xea, 0xb6, 0x83, 0x8a, 0x41, 0x77, 0x72, 0x0d, 0x4c, 0xeb, 0x46, 0xab, + 0xb3, 0xdb, 0xc6, 0x2a, 0xd6, 0x68, 0xbf, 0x32, 0xa9, 0x86, 0x93, 0x82, 0xad, 0x7d, 0x97, 0x2d, + 0xd9, 0xdb, 0xda, 0xff, 0xa4, 0xf0, 0x32, 0x4c, 0x98, 0x05, 0x12, 0x90, 0x32, 0xc2, 0xee, 0x2a, + 0xc2, 0xac, 0x11, 0xca, 0xea, 0x19, 0xec, 0xbd, 0x17, 0x0a, 0x84, 0xc9, 0xa9, 0xfc, 0x1f, 0xe8, + 0xdd, 0x42, 0x8d, 0x75, 0x10, 0x43, 0xc9, 0x90, 0x59, 0x1a, 0x62, 0x92, 0xac, 0xc0, 0x5c, 0xa5, + 0xda, 0x28, 0xab, 0xd5, 0xe2, 0x2a, 0xcb, 0x22, 0xa3, 0xef, 0x4a, 0x90, 0x53, 0x71, 0xb7, 0x73, + 0x29, 0x1c, 0x31, 0x9a, 0x39, 0x8a, 0x67, 0x7c, 0x47, 0x71, 0x65, 0x09, 0x40, 0x6b, 0xb9, 0x05, + 0x93, 0x2b, 0xb5, 0xa4, 0xbe, 0x71, 0x4c, 0xb9, 0x0a, 0x16, 0xfd, 0xdc, 0x6a, 0xe8, 0x4f, 0xf4, + 0x90, 0xf0, 0xce, 0x11, 0x47, 0x8d, 0x70, 0x18, 0xd1, 0x27, 0xbc, 0x47, 0x68, 0xb3, 0x67, 0x20, + 0xb9, 0xc3, 0x11, 0xff, 0x97, 0x24, 0xc8, 0x36, 0xdc, 0xde, 0x32, 0xd4, 0x71, 0x7e, 0x62, 0x38, + 0x1d, 0x77, 0xc9, 0x44, 0xe8, 0xf8, 0x5d, 0x30, 0x13, 0xd6, 0x58, 0xe6, 0x2a, 0x11, 0xab, 0xe2, + 0xdc, 0x0f, 0xc3, 0x68, 0x78, 0x1f, 0x76, 0x0e, 0x47, 0xc4, 0x1f, 0x7b, 0x3c, 0xc0, 0x1a, 0xde, + 0x39, 0x8f, 0x2d, 0x7b, 0x5b, 0xef, 0xa2, 0xbf, 0x97, 0x61, 0x6a, 0x19, 0x3b, 0x75, 0x47, 0x73, + 0x76, 0xed, 0x9e, 0xed, 0x4e, 0xc3, 0x2c, 0x69, 0xad, 0x6d, 0xcc, 0xba, 0x23, 0xef, 0x15, 0xbd, + 0x5d, 0x16, 0xf5, 0x27, 0x0a, 0xca, 0x99, 0xf7, 0xcb, 0x88, 0xc0, 0xe4, 0x09, 0x90, 0x6d, 0x6b, + 0x8e, 0xc6, 0xb0, 0xb8, 0xa2, 0x07, 0x8b, 0x80, 0x90, 0x4a, 0xb2, 0xa1, 0xdf, 0x95, 0x44, 0x1c, + 0x8a, 0x04, 0xca, 0x4f, 0x06, 0xc2, 0xbb, 0x33, 0x43, 0xa0, 0x70, 0x0c, 0x66, 0xab, 0xb5, 0x46, + 0x73, 0xb5, 0xb6, 0xbc, 0x5c, 0x76, 0x53, 0x0b, 0xb2, 0x72, 0x12, 0x94, 0xf5, 0xe2, 0x7d, 0x6b, + 0xe5, 0x6a, 0xa3, 0x59, 0xad, 0x2d, 0x96, 0xd9, 0x9f, 0x59, 0xe5, 0x28, 0x4c, 0x97, 0x8a, 0xa5, + 0x15, 0x2f, 0x21, 0xa7, 0x9c, 0x82, 0xe3, 0x6b, 0xe5, 0xb5, 0x85, 0xb2, 0x5a, 0x5f, 0xa9, 0xac, + 0x37, 0x5d, 0x32, 0x4b, 0xb5, 0x8d, 0xea, 0x62, 0x21, 0xaf, 0x20, 0x38, 0x19, 0xfa, 0x72, 0x4e, + 0xad, 0x55, 0x97, 0x9b, 0xf5, 0x46, 0xb1, 0x51, 0x2e, 0x4c, 0x28, 0x97, 0xc1, 0xd1, 0x52, 0xb1, + 0x4a, 0xb2, 0x97, 0x6a, 0xd5, 0x6a, 0xb9, 0xd4, 0x28, 0x4c, 0xa2, 0xef, 0x67, 0x61, 0xba, 0x62, + 0x57, 0xb5, 0x1d, 0x7c, 0x56, 0xeb, 0xe8, 0x6d, 0xf4, 0xbc, 0xd0, 0xcc, 0xe3, 0x3a, 0x98, 0xb5, + 0xe8, 0x23, 0x6e, 0x37, 0x74, 0x4c, 0xd1, 0x9c, 0x55, 0xf9, 0x44, 0x77, 0x4e, 0x6e, 0x10, 0x02, + 0xde, 0x9c, 0x9c, 0xbe, 0x29, 0x0b, 0x00, 0xf4, 0xa9, 0x11, 0x5c, 0xee, 0x7a, 0xa6, 0xb7, 0x35, + 0x69, 0x3b, 0xd8, 0xc6, 0xd6, 0x9e, 0xde, 0xc2, 0x5e, 0x4e, 0x35, 0xf4, 0x17, 0xfa, 0xb2, 0x2c, + 0xba, 0xbf, 0x18, 0x02, 0x35, 0x54, 0x9d, 0x88, 0xde, 0xf0, 0x97, 0x64, 0x91, 0xdd, 0x41, 0x21, + 0x92, 0xc9, 0x34, 0xe5, 0x57, 0xa5, 0xe1, 0x96, 0x6d, 0x1b, 0xb5, 0x5a, 0xb3, 0xbe, 0x52, 0x53, + 0x1b, 0x05, 0x59, 0x99, 0x81, 0x49, 0xf7, 0x75, 0xb5, 0x56, 0x5d, 0x2e, 0x64, 0x95, 0x13, 0x70, + 0x6c, 0xa5, 0x58, 0x6f, 0x56, 0xaa, 0x67, 0x8b, 0xab, 0x95, 0xc5, 0x66, 0x69, 0xa5, 0xa8, 0xd6, + 0x0b, 0x39, 0xe5, 0x0a, 0x38, 0xd1, 0xa8, 0x94, 0xd5, 0xe6, 0x52, 0xb9, 0xd8, 0xd8, 0x50, 0xcb, + 0xf5, 0x66, 0xb5, 0xd6, 0xac, 0x16, 0xd7, 0xca, 0x85, 0xbc, 0xdb, 0xfc, 0xc9, 0xa7, 0x40, 0x6d, + 0x26, 0xf6, 0x2b, 0xe3, 0x64, 0x84, 0x32, 0x4e, 0xf5, 0x2a, 0x23, 0x84, 0xd5, 0x4a, 0x2d, 0xd7, + 0xcb, 0xea, 0xd9, 0x72, 0x61, 0xba, 0x9f, 0xae, 0xcd, 0x28, 0xc7, 0xa1, 0xe0, 0xf2, 0xd0, 0xac, + 0xd4, 0xbd, 0x9c, 0x8b, 0x85, 0x59, 0xf4, 0xd1, 0x3c, 0x9c, 0x54, 0xf1, 0x96, 0x6e, 0x3b, 0xd8, + 0x5a, 0xd7, 0x2e, 0xed, 0x60, 0xc3, 0xf1, 0x3a, 0xf9, 0x7f, 0x4d, 0xac, 0x8c, 0x6b, 0x30, 0xdb, + 0xa5, 0x34, 0xd6, 0xb0, 0xb3, 0x6d, 0xb6, 0xd9, 0x28, 0xfc, 0xb8, 0xc8, 0x9e, 0x63, 0x7e, 0x3d, + 0x9c, 0x5d, 0xe5, 0xff, 0x0e, 0xe9, 0xb6, 0x1c, 0xa3, 0xdb, 0xd9, 0x61, 0x74, 0x5b, 0xb9, 0x0a, + 0xa6, 0x76, 0x6d, 0x6c, 0x95, 0x77, 0x34, 0xbd, 0xe3, 0x5d, 0xce, 0xe9, 0x27, 0xa0, 0xb7, 0x64, + 0x45, 0x4f, 0xac, 0x84, 0xea, 0xd2, 0x5f, 0x8c, 0x11, 0x7d, 0xeb, 0x69, 0x00, 0x56, 0xd9, 0x0d, + 0xab, 0xc3, 0x94, 0x35, 0x94, 0xe2, 0xf2, 0x77, 0x5e, 0xef, 0x74, 0x74, 0x63, 0xcb, 0xdf, 0xf7, + 0x0f, 0x12, 0xd0, 0xaf, 0xca, 0x22, 0x27, 0x58, 0x92, 0xf2, 0x96, 0xac, 0x35, 0x3d, 0x24, 0x8d, + 0xb9, 0xdf, 0xdd, 0xdf, 0x74, 0xf2, 0x4a, 0x01, 0x66, 0x48, 0x1a, 0x6b, 0x81, 0x85, 0x09, 0xb7, + 0x0f, 0xf6, 0xc8, 0xad, 0x95, 0x1b, 0x2b, 0xb5, 0x45, 0xff, 0xdb, 0xa4, 0x4b, 0xd2, 0x65, 0xa6, + 0x58, 0xbd, 0x8f, 0xb4, 0xc6, 0x29, 0xe5, 0x31, 0x70, 0x45, 0xa8, 0xc3, 0x2e, 0xae, 0xaa, 0xe5, + 0xe2, 0xe2, 0x7d, 0xcd, 0xf2, 0x33, 0x2a, 0xf5, 0x46, 0x9d, 0x6f, 0x5c, 0x5e, 0x3b, 0x9a, 0x76, + 0xf9, 0x2d, 0xaf, 0x15, 0x2b, 0xab, 0xac, 0x7f, 0x5f, 0xaa, 0xa9, 0x6b, 0xc5, 0x46, 0x61, 0x06, + 0xbd, 0x44, 0x86, 0xc2, 0x32, 0x76, 0xd6, 0x4d, 0xcb, 0xd1, 0x3a, 0xab, 0xba, 0x71, 0x61, 0xc3, + 0xea, 0x70, 0x93, 0x4d, 0xe1, 0x30, 0x1d, 0xfc, 0x10, 0xc9, 0x11, 0x8c, 0xde, 0x11, 0xef, 0x92, + 0x6c, 0x81, 0x32, 0x05, 0x09, 0xe8, 0x59, 0x92, 0xc8, 0x72, 0xb7, 0x78, 0xa9, 0xc9, 0xf4, 0xe4, + 0xd9, 0xe3, 0x1e, 0x9f, 0xfb, 0xa0, 0x96, 0x47, 0xcf, 0xcd, 0xc2, 0xe4, 0x92, 0x6e, 0x68, 0x1d, + 0xfd, 0x99, 0x5c, 0xfc, 0xd2, 0xa0, 0x8f, 0xc9, 0xc4, 0xf4, 0x31, 0xd2, 0x50, 0xe3, 0xe7, 0xaf, + 0xcb, 0xa2, 0xcb, 0x0b, 0x21, 0xd9, 0x7b, 0x4c, 0x46, 0x0c, 0x9e, 0xef, 0x97, 0x44, 0x96, 0x17, + 0x06, 0xd3, 0x4b, 0x86, 0xe1, 0xc7, 0x7f, 0x30, 0x6c, 0xac, 0x9e, 0xf6, 0x3d, 0xd9, 0x4f, 0x15, + 0xa6, 0xd0, 0x9f, 0xcb, 0x80, 0x96, 0xb1, 0x73, 0x16, 0x5b, 0xfe, 0x54, 0x80, 0xf4, 0xfa, 0xcc, + 0xde, 0x0e, 0x35, 0xd9, 0x37, 0x84, 0x01, 0x3c, 0xc7, 0x03, 0x58, 0x8c, 0x69, 0x3c, 0x11, 0xa4, + 0x23, 0x1a, 0x6f, 0x05, 0xf2, 0x36, 0xf9, 0xce, 0xd4, 0xec, 0x89, 0xd1, 0xc3, 0x25, 0x21, 0x16, + 0xa6, 0x4e, 0x09, 0xab, 0x8c, 0x00, 0xfa, 0x8e, 0x3f, 0x09, 0xfa, 0x49, 0x4e, 0x3b, 0x96, 0x0e, + 0xcc, 0x6c, 0x32, 0x7d, 0xb1, 0xd2, 0x55, 0x97, 0x7e, 0xf6, 0x0d, 0x7a, 0x7f, 0x0e, 0x8e, 0xf7, + 0xab, 0x0e, 0xfa, 0xbd, 0x0c, 0xb7, 0xc3, 0x8e, 0xc9, 0x90, 0x9f, 0x61, 0x1b, 0x88, 0xee, 0x8b, + 0xf2, 0x64, 0x38, 0xe1, 0x2f, 0xc3, 0x35, 0xcc, 0x2a, 0xbe, 0x68, 0x77, 0xb0, 0xe3, 0x60, 0x8b, + 0x54, 0x6d, 0x52, 0xed, 0xff, 0x51, 0x79, 0x2a, 0x5c, 0xae, 0x1b, 0xb6, 0xde, 0xc6, 0x56, 0x43, + 0xef, 0xda, 0x45, 0xa3, 0xdd, 0xd8, 0x75, 0x4c, 0x4b, 0xd7, 0xd8, 0x55, 0x92, 0x93, 0x6a, 0xd4, + 0x67, 0xe5, 0x46, 0x28, 0xe8, 0x76, 0xcd, 0x38, 0x6f, 0x6a, 0x56, 0x5b, 0x37, 0xb6, 0x56, 0x75, + 0xdb, 0x61, 0x1e, 0xc0, 0xfb, 0xd2, 0xd1, 0x3f, 0xc8, 0xa2, 0x87, 0xe9, 0x06, 0xc0, 0x1a, 0xd1, + 0xa1, 0xfc, 0xa2, 0x2c, 0x72, 0x3c, 0x2e, 0x19, 0xed, 0x64, 0xca, 0xf2, 0x9c, 0x71, 0x1b, 0x12, + 0xfd, 0x47, 0x70, 0xd2, 0xb5, 0xd0, 0x74, 0xcf, 0x10, 0x38, 0x5b, 0x56, 0x2b, 0x4b, 0x95, 0xb2, + 0x6b, 0x56, 0x9c, 0x80, 0x63, 0xc1, 0xb7, 0xc5, 0xfb, 0x9a, 0xf5, 0x72, 0xb5, 0x51, 0x98, 0x74, + 0xfb, 0x29, 0x9a, 0xbc, 0x54, 0xac, 0xac, 0x96, 0x17, 0x9b, 0x8d, 0x9a, 0xfb, 0x65, 0x71, 0x38, + 0xd3, 0x02, 0x3d, 0x98, 0x85, 0xa3, 0x44, 0xb6, 0x97, 0x88, 0x54, 0x5d, 0xa1, 0xf4, 0xf8, 0xda, + 0xfa, 0x00, 0x4d, 0x51, 0xf1, 0xa2, 0x4f, 0x0b, 0xdf, 0x94, 0x19, 0x82, 0xb0, 0xa7, 0x8c, 0x08, + 0xcd, 0xf8, 0xb6, 0x24, 0x12, 0xa1, 0x42, 0x98, 0x6c, 0x32, 0xa5, 0xf8, 0xb7, 0x71, 0x8f, 0x38, + 0xd1, 0xe0, 0x13, 0x2b, 0xb3, 0x44, 0x7e, 0x7e, 0xc6, 0x7a, 0x45, 0x25, 0xea, 0x30, 0x07, 0x40, + 0x52, 0x88, 0x06, 0x51, 0x3d, 0xe8, 0x3b, 0x5e, 0x45, 0xe9, 0x41, 0xb1, 0xd4, 0xa8, 0x9c, 0x2d, + 0x47, 0xe9, 0xc1, 0xa7, 0x64, 0x98, 0x5c, 0xc6, 0x8e, 0x3b, 0xa7, 0xb2, 0xd1, 0xd3, 0x04, 0xd6, + 0x7f, 0x5c, 0x33, 0xa6, 0x63, 0xb6, 0xb4, 0x8e, 0xbf, 0x0c, 0x40, 0xdf, 0xd0, 0x2f, 0x0c, 0x63, + 0x82, 0x78, 0x45, 0x47, 0x8c, 0x57, 0x3f, 0x0e, 0x39, 0xc7, 0xfd, 0xcc, 0x96, 0xa1, 0x7f, 0x24, + 0x72, 0xb8, 0x72, 0x89, 0x2c, 0x6a, 0x8e, 0xa6, 0xd2, 0xfc, 0xa1, 0xd1, 0x49, 0xd0, 0x76, 0x89, + 0x60, 0xe4, 0x07, 0xd1, 0xfe, 0xfc, 0x3b, 0x19, 0x4e, 0xd0, 0xf6, 0x51, 0xec, 0x76, 0xeb, 0x8e, + 0x69, 0x61, 0x15, 0xb7, 0xb0, 0xde, 0x75, 0x7a, 0xd6, 0xf7, 0x2c, 0x9a, 0xea, 0x6d, 0x36, 0xb3, + 0x57, 0xf4, 0x5a, 0x59, 0x34, 0x06, 0xf3, 0xbe, 0xf6, 0xd8, 0x53, 0x5e, 0x44, 0x63, 0xff, 0xb0, + 0x24, 0x12, 0x55, 0x39, 0x21, 0xf1, 0x64, 0x40, 0x7d, 0xe0, 0x10, 0x80, 0xf2, 0x56, 0x6e, 0xd4, + 0x72, 0xa9, 0x5c, 0x59, 0x77, 0x07, 0x81, 0xab, 0xe1, 0xca, 0xf5, 0x0d, 0xb5, 0xb4, 0x52, 0xac, + 0x97, 0x9b, 0x6a, 0x79, 0xb9, 0x52, 0x6f, 0x30, 0xa7, 0x2c, 0xfa, 0xd7, 0x84, 0x72, 0x15, 0x9c, + 0xaa, 0x6f, 0x2c, 0xd4, 0x4b, 0x6a, 0x65, 0x9d, 0xa4, 0xab, 0xe5, 0x6a, 0xf9, 0x1c, 0xfb, 0x3a, + 0x89, 0xde, 0x5b, 0x80, 0x69, 0x77, 0x02, 0x50, 0xa7, 0xf3, 0x02, 0xf4, 0x8d, 0x2c, 0x4c, 0xab, + 0xd8, 0x36, 0x3b, 0x7b, 0x64, 0x8e, 0x30, 0xae, 0xa9, 0xc7, 0xb7, 0x64, 0xd1, 0xf3, 0xdb, 0x21, + 0x66, 0xe7, 0x43, 0x8c, 0x46, 0x4f, 0x34, 0xb5, 0x3d, 0x4d, 0xef, 0x68, 0xe7, 0x59, 0x57, 0x33, + 0xa9, 0x06, 0x09, 0xca, 0x3c, 0x28, 0xe6, 0x45, 0x03, 0x5b, 0xf5, 0xd6, 0xc5, 0xb2, 0xb3, 0x5d, + 0x6c, 0xb7, 0x2d, 0x6c, 0xdb, 0x6c, 0xf5, 0xa2, 0xcf, 0x17, 0xe5, 0x06, 0x38, 0x4a, 0x52, 0x43, + 0x99, 0xa9, 0x83, 0x4c, 0x6f, 0xb2, 0x9f, 0xb3, 0x68, 0x5c, 0xf2, 0x72, 0xe6, 0x42, 0x39, 0x83, + 0xe4, 0xf0, 0x71, 0x89, 0x3c, 0x7f, 0x4a, 0xe7, 0x1a, 0x98, 0x36, 0xb4, 0x1d, 0x5c, 0x7e, 0xa0, + 0xab, 0x5b, 0xd8, 0x26, 0x8e, 0x31, 0xb2, 0x1a, 0x4e, 0x42, 0xef, 0x17, 0x3a, 0x6f, 0x2e, 0x26, + 0xb1, 0x64, 0xba, 0xbf, 0x3c, 0x84, 0xea, 0xf7, 0xe9, 0x67, 0x64, 0xf4, 0x5e, 0x19, 0x66, 0x18, + 0x53, 0x45, 0xe3, 0x52, 0xa5, 0x8d, 0xae, 0xe6, 0x8c, 0x5f, 0xcd, 0x4d, 0xf3, 0x8c, 0x5f, 0xf2, + 0x82, 0x7e, 0x59, 0x16, 0x75, 0x77, 0xee, 0x53, 0x71, 0x52, 0x46, 0xb4, 0xe3, 0xe8, 0xa6, 0xb9, + 0xcb, 0x1c, 0x55, 0x27, 0x55, 0xfa, 0x92, 0xe6, 0xa2, 0x1e, 0xfa, 0x43, 0x21, 0x67, 0x6a, 0xc1, + 0x6a, 0x1c, 0x12, 0x80, 0x1f, 0x93, 0x61, 0x8e, 0x71, 0x55, 0x67, 0xe7, 0x7c, 0x84, 0x0e, 0xbc, + 0xfd, 0x8a, 0xb0, 0x21, 0xd8, 0xa7, 0xfe, 0xac, 0xa4, 0x47, 0x0d, 0x90, 0x1f, 0x14, 0x0a, 0x8e, + 0x26, 0x5c, 0x91, 0x43, 0x82, 0xf2, 0xad, 0x59, 0x98, 0xde, 0xb0, 0xb1, 0xc5, 0xfc, 0xf6, 0xd1, + 0xc3, 0x59, 0x90, 0x97, 0x31, 0xb7, 0x91, 0xfa, 0x7c, 0x61, 0x0f, 0xdf, 0x70, 0x65, 0x43, 0x44, + 0x5d, 0x1b, 0x29, 0x02, 0xb6, 0xeb, 0x61, 0x8e, 0x8a, 0xb4, 0xe8, 0x38, 0xae, 0x91, 0xe8, 0x79, + 0xd3, 0xf6, 0xa4, 0x8e, 0x62, 0xab, 0x88, 0x94, 0xe5, 0x66, 0x29, 0xb9, 0x3c, 0xad, 0xe2, 0x4d, + 0x3a, 0x9f, 0xcd, 0xaa, 0x3d, 0xa9, 0xca, 0x2d, 0x70, 0x99, 0xd9, 0xc5, 0xf4, 0xfc, 0x4a, 0x28, + 0x73, 0x8e, 0x64, 0xee, 0xf7, 0x09, 0x7d, 0x43, 0xc8, 0x57, 0x57, 0x5c, 0x3a, 0xc9, 0x74, 0xa1, + 0x3b, 0x1a, 0x93, 0xe4, 0x38, 0x14, 0xdc, 0x1c, 0x64, 0xff, 0x45, 0x2d, 0xd7, 0x6b, 0xab, 0x67, + 0xcb, 0xfd, 0x97, 0x31, 0x72, 0xe8, 0x39, 0x32, 0x4c, 0x2d, 0x58, 0xa6, 0xd6, 0x6e, 0x69, 0xb6, + 0x83, 0xbe, 0x23, 0xc1, 0xcc, 0xba, 0x76, 0xa9, 0x63, 0x6a, 0x6d, 0xe2, 0xdf, 0xdf, 0xd3, 0x17, + 0x74, 0xe9, 0x27, 0xaf, 0x2f, 0x60, 0xaf, 0xfc, 0xc1, 0x40, 0xff, 0xe8, 0x5e, 0x46, 0xe4, 0x42, + 0x4d, 0x7f, 0x9b, 0x4f, 0xea, 0x17, 0xac, 0xd4, 0xe3, 0x6b, 0x3e, 0xcc, 0x53, 0x84, 0x45, 0xf9, + 0x5e, 0xb1, 0xf0, 0xa3, 0x22, 0x24, 0x0f, 0x67, 0x57, 0xfe, 0xb9, 0x93, 0x90, 0x5f, 0xc4, 0xc4, + 0x8a, 0xfb, 0x1f, 0x12, 0x4c, 0xd4, 0xb1, 0x43, 0x2c, 0xb8, 0xdb, 0x38, 0x4f, 0xe1, 0x36, 0xc9, + 0x10, 0x38, 0xb1, 0x7b, 0xef, 0xee, 0x64, 0x3d, 0x74, 0xde, 0x9a, 0x3c, 0x27, 0xf0, 0x48, 0xa4, + 0xe5, 0xce, 0xb3, 0x32, 0x0f, 0xe4, 0x91, 0x18, 0x4b, 0x2a, 0x7d, 0x5f, 0xab, 0xb7, 0x4b, 0xcc, + 0xb5, 0x2a, 0xd4, 0xeb, 0xbd, 0x32, 0xac, 0x9f, 0xb1, 0xde, 0x66, 0x8c, 0xf9, 0x18, 0xe7, 0xa8, + 0x27, 0xc1, 0x04, 0x95, 0xb9, 0x37, 0x1f, 0xed, 0xf5, 0x53, 0xa0, 0x24, 0xc8, 0xd9, 0x6b, 0x2f, + 0xa7, 0xa0, 0x8b, 0x5a, 0x74, 0xe1, 0x63, 0x89, 0x41, 0x30, 0x53, 0xc5, 0xce, 0x45, 0xd3, 0xba, + 0x50, 0x77, 0x34, 0x07, 0xa3, 0x7f, 0x93, 0x40, 0xae, 0x63, 0x27, 0x1c, 0xfd, 0xa4, 0x0a, 0xc7, + 0x68, 0x85, 0x58, 0x46, 0xd2, 0x7f, 0xd3, 0x8a, 0x5c, 0xd3, 0x57, 0x08, 0xa1, 0x7c, 0xea, 0xfe, + 0x5f, 0xd1, 0x6f, 0xf6, 0x0d, 0xfa, 0x24, 0xf5, 0x99, 0x34, 0x30, 0xc9, 0x84, 0x19, 0x74, 0x15, + 0x2c, 0x42, 0x4f, 0xdf, 0x27, 0x64, 0x56, 0x8b, 0xd1, 0x3c, 0x9c, 0xae, 0xe0, 0x83, 0x57, 0x40, + 0xb6, 0xb4, 0xad, 0x39, 0xe8, 0x6d, 0x32, 0x40, 0xb1, 0xdd, 0x5e, 0xa3, 0x3e, 0xe0, 0x61, 0x87, + 0xb4, 0x33, 0x30, 0xd3, 0xda, 0xd6, 0x82, 0xbb, 0x4d, 0x68, 0x7f, 0xc0, 0xa5, 0x29, 0x4f, 0x0e, + 0x9c, 0xc9, 0xa9, 0x54, 0x51, 0x0f, 0x4c, 0x6e, 0x19, 0x8c, 0xb6, 0xef, 0x68, 0xce, 0x87, 0xc2, + 0x8c, 0x3d, 0x42, 0xe7, 0xfe, 0x3e, 0x1f, 0xb0, 0x17, 0x3d, 0x87, 0x63, 0xa4, 0xfd, 0x03, 0x36, + 0x41, 0x42, 0xc2, 0x93, 0xde, 0x62, 0x01, 0x3d, 0xe2, 0xf9, 0x1a, 0x4b, 0xe8, 0x5a, 0xa5, 0xdc, + 0xd6, 0x3d, 0xd1, 0xb2, 0x80, 0x59, 0xe8, 0xa1, 0x4c, 0x32, 0xf8, 0xe2, 0x05, 0x77, 0x37, 0xcc, + 0xe2, 0xb6, 0xee, 0x60, 0xaf, 0x96, 0x4c, 0x80, 0x71, 0x10, 0xf3, 0x3f, 0xa0, 0x67, 0x0b, 0x07, + 0x5d, 0x23, 0x02, 0xdd, 0x5f, 0xa3, 0x88, 0xf6, 0x27, 0x16, 0x46, 0x4d, 0x8c, 0x66, 0xfa, 0x60, + 0xfd, 0x82, 0x0c, 0x27, 0x1a, 0xe6, 0xd6, 0x56, 0x07, 0x7b, 0x62, 0xc2, 0xd4, 0x3b, 0x13, 0x69, + 0xa3, 0x84, 0x8b, 0xec, 0x04, 0x99, 0xf7, 0xeb, 0xfe, 0x51, 0x32, 0xf7, 0x85, 0x3f, 0x31, 0x15, + 0x3b, 0x8b, 0x22, 0xe2, 0xea, 0xcb, 0x67, 0x04, 0x0a, 0x62, 0x01, 0x9f, 0x85, 0xc9, 0xa6, 0x0f, + 0xc4, 0xe7, 0x25, 0x98, 0xa5, 0x37, 0x57, 0x7a, 0x0a, 0x7a, 0xef, 0x08, 0x01, 0x40, 0xdf, 0xc9, + 0x88, 0xfa, 0xd9, 0x12, 0x99, 0x70, 0x9c, 0x44, 0x88, 0x58, 0x2c, 0xa8, 0xca, 0x40, 0x72, 0xe9, + 0x8b, 0xf6, 0x4f, 0x64, 0x98, 0x5e, 0xc6, 0x5e, 0x4b, 0xb3, 0x13, 0xf7, 0x44, 0x67, 0x60, 0x86, + 0x5c, 0xdf, 0x56, 0x63, 0xc7, 0x24, 0xe9, 0xaa, 0x19, 0x97, 0xa6, 0x5c, 0x07, 0xb3, 0xe7, 0xf1, + 0xa6, 0x69, 0xe1, 0x1a, 0x77, 0x96, 0x92, 0x4f, 0x8c, 0x08, 0x4f, 0xc7, 0xc5, 0x41, 0x5b, 0xe0, + 0xb1, 0xb9, 0x69, 0xbf, 0x30, 0x43, 0x55, 0x89, 0x18, 0x73, 0x9e, 0x02, 0x93, 0x0c, 0x79, 0xcf, + 0x4c, 0x8b, 0xeb, 0x17, 0xfd, 0xbc, 0xe8, 0x35, 0x3e, 0xa2, 0x65, 0x0e, 0xd1, 0x27, 0x26, 0x61, + 0x62, 0x2c, 0xf7, 0xbb, 0x17, 0x42, 0xe5, 0x2f, 0x5c, 0xaa, 0xb4, 0x6d, 0xb4, 0x96, 0x0c, 0xd3, + 0xd3, 0x00, 0x7e, 0xe3, 0xf0, 0xc2, 0x5a, 0x84, 0x52, 0xf8, 0xc8, 0xf5, 0xb1, 0x07, 0xf5, 0x7a, + 0xc5, 0x41, 0xd8, 0x19, 0x31, 0x30, 0x62, 0x07, 0xfc, 0x44, 0x38, 0x49, 0x1f, 0x9d, 0x4f, 0xca, + 0x70, 0xc2, 0x3f, 0x7f, 0xb4, 0xaa, 0xd9, 0x41, 0xbb, 0x2b, 0x25, 0x83, 0x88, 0x3b, 0xf0, 0xe1, + 0x37, 0x96, 0x6f, 0x26, 0x1b, 0x33, 0xfa, 0x72, 0x32, 0x5a, 0x74, 0x94, 0x9b, 0xe0, 0x98, 0xb1, + 0xbb, 0xe3, 0x4b, 0x9d, 0xb4, 0x78, 0xd6, 0xc2, 0xf7, 0x7f, 0x48, 0x32, 0x32, 0x89, 0x30, 0x3f, + 0x96, 0x39, 0x25, 0x77, 0xa4, 0xeb, 0x09, 0x89, 0x60, 0x44, 0xff, 0x92, 0x49, 0xd4, 0xbb, 0x0d, + 0x3e, 0xf3, 0x95, 0xa0, 0x97, 0x3a, 0xc4, 0x03, 0x5f, 0x67, 0x26, 0x20, 0x57, 0xde, 0xe9, 0x3a, + 0x97, 0xce, 0x3c, 0x16, 0x66, 0xeb, 0x8e, 0x85, 0xb5, 0x9d, 0xd0, 0xce, 0x80, 0x63, 0x5e, 0xc0, + 0x86, 0xb7, 0x33, 0x40, 0x5e, 0x6e, 0xbf, 0x0d, 0x26, 0x0c, 0xb3, 0xa9, 0xed, 0x3a, 0xdb, 0xca, + 0xd5, 0xfb, 0x8e, 0xd4, 0x33, 0xf0, 0x6b, 0x2c, 0x86, 0xd1, 0x97, 0xef, 0x20, 0x6b, 0xc3, 0x79, + 0xc3, 0x2c, 0xee, 0x3a, 0xdb, 0x0b, 0x57, 0x7d, 0xec, 0x6f, 0x4f, 0x67, 0x3e, 0xf5, 0xb7, 0xa7, + 0x33, 0x5f, 0xfa, 0xdb, 0xd3, 0x99, 0x5f, 0xf9, 0xca, 0xe9, 0x23, 0x9f, 0xfa, 0xca, 0xe9, 0x23, + 0x9f, 0xff, 0xca, 0xe9, 0x23, 0x3f, 0x29, 0x75, 0xcf, 0x9f, 0xcf, 0x13, 0x2a, 0x4f, 0xfa, 0x7f, + 0x03, 0x00, 0x00, 0xff, 0xff, 0x26, 0x07, 0x39, 0x30, 0x26, 0x08, 0x02, 0x00, } func (m *Rpc) Marshal() (dAtA []byte, err error) { @@ -80056,6 +80064,16 @@ func (m *RpcPublishingPublishState) MarshalToSizedBuffer(dAtA []byte) (int, erro _ = i var l int _ = l + if m.JoinSpace { + i-- + if m.JoinSpace { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x40 + } if m.Size_ != 0 { i = encodeVarintCommands(dAtA, i, uint64(m.Size_)) i-- @@ -121345,6 +121363,9 @@ func (m *RpcPublishingPublishState) Size() (n int) { if m.Size_ != 0 { n += 1 + sovCommands(uint64(m.Size_)) } + if m.JoinSpace { + n += 2 + } return n } @@ -155622,6 +155643,26 @@ func (m *RpcPublishingPublishState) Unmarshal(dAtA []byte) error { break } } + case 8: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field JoinSpace", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowCommands + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.JoinSpace = bool(v != 0) default: iNdEx = preIndex skippy, err := skipCommands(dAtA[iNdEx:]) diff --git a/pb/protos/commands.proto b/pb/protos/commands.proto index 2e0f8e5e1..d7288830a 100644 --- a/pb/protos/commands.proto +++ b/pb/protos/commands.proto @@ -1374,6 +1374,7 @@ message Rpc { string version = 5; int64 timestamp = 6; int64 size = 7; + bool joinSpace = 8; } message Create { From 6ea0a7face80799d6de31de5449336e4c30bb2c7 Mon Sep 17 00:00:00 2001 From: AnastasiaShemyakinskaya Date: Mon, 20 Jan 2025 22:15:02 +0100 Subject: [PATCH 136/195] GO-4886: use right error Signed-off-by: AnastasiaShemyakinskaya --- core/publish/service.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/publish/service.go b/core/publish/service.go index 65826b257..2d6e010b7 100644 --- a/core/publish/service.go +++ b/core/publish/service.go @@ -192,7 +192,7 @@ func (s *service) publishToPublishServer(ctx context.Context, spaceId, pageId, u func (s *service) applyInviteLink(ctx context.Context, spc clientspace.Space, snapshot *PublishingUberSnapshot, joinSpace bool) error { inviteLink, err := s.extractInviteLink(ctx, spc.Id(), joinSpace, spc.IsPersonal()) - if err != nil && errors.Is(err, ErrLimitExceeded) { + if err != nil && errors.Is(err, inviteservice.ErrInviteNotExists) { return nil } if err != nil { From c6093173965e512d658bd6cfed74fec01f08d726 Mon Sep 17 00:00:00 2001 From: Jannis Metrikat <120120832+jmetrikat@users.noreply.github.com> Date: Tue, 21 Jan 2025 01:45:09 +0100 Subject: [PATCH 137/195] GO-4459: Fix crash on empty tags list --- core/api/services/object/service.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/api/services/object/service.go b/core/api/services/object/service.go index 2956900b9..f8a7eb109 100644 --- a/core/api/services/object/service.go +++ b/core/api/services/object/service.go @@ -430,7 +430,7 @@ func (s *ObjectService) getTags(resp *pb.RpcObjectShowResponse) []Tag { tags := []Tag{} tagField, ok := resp.ObjectView.Details[0].Details.Fields["tag"] - if !ok { + if !ok || tagField.GetListValue() == nil { return tags } From 94a36593263de7a305e6139cfe582be3c440c544 Mon Sep 17 00:00:00 2001 From: AnastasiaShemyakinskaya Date: Tue, 21 Jan 2025 11:08:48 +0100 Subject: [PATCH 138/195] GO-4886: remove not needed check Signed-off-by: AnastasiaShemyakinskaya --- core/publish/service.go | 3 --- 1 file changed, 3 deletions(-) diff --git a/core/publish/service.go b/core/publish/service.go index 2d6e010b7..dc1c9f702 100644 --- a/core/publish/service.go +++ b/core/publish/service.go @@ -192,9 +192,6 @@ func (s *service) publishToPublishServer(ctx context.Context, spaceId, pageId, u func (s *service) applyInviteLink(ctx context.Context, spc clientspace.Space, snapshot *PublishingUberSnapshot, joinSpace bool) error { inviteLink, err := s.extractInviteLink(ctx, spc.Id(), joinSpace, spc.IsPersonal()) - if err != nil && errors.Is(err, inviteservice.ErrInviteNotExists) { - return nil - } if err != nil { return err } From bbc4c63ca36e752774d065804bd3ebd01095a696 Mon Sep 17 00:00:00 2001 From: AnastasiaShemyakinskaya Date: Tue, 21 Jan 2025 13:09:32 +0100 Subject: [PATCH 139/195] GO-4418: fix comments Signed-off-by: AnastasiaShemyakinskaya --- core/block/import/common/source/directory.go | 22 ++++++++++--------- .../import/common/source/directory_test.go | 6 ++--- core/block/import/common/source/zip.go | 5 ++--- core/block/import/common/source/zip_test.go | 6 ++--- 4 files changed, 20 insertions(+), 19 deletions(-) diff --git a/core/block/import/common/source/directory.go b/core/block/import/common/source/directory.go index 07fc805c6..329996b59 100644 --- a/core/block/import/common/source/directory.go +++ b/core/block/import/common/source/directory.go @@ -4,7 +4,6 @@ import ( "io" "os" "path/filepath" - "slices" "sort" "strings" @@ -16,7 +15,7 @@ import ( type Directory struct { fileReaders map[string]struct{} importPath string - rootDirs []string + rootDirs map[string]bool } func NewDirectory() *Directory { @@ -89,37 +88,40 @@ func (d *Directory) CountFilesWithGivenExtensions(extension []string) int { func (d *Directory) IsRootFile(fileName string) bool { fileDir := filepath.Dir(fileName) - return fileDir == d.importPath || slices.Contains(d.rootDirs, fileDir) + return fileDir == d.importPath || d.rootDirs[fileDir] } func (d *Directory) Close() {} -func findNonEmptyDirs(files map[string]struct{}) []string { +func findNonEmptyDirs(files map[string]struct{}) map[string]bool { dirs := make([]string, 0, len(files)) for file := range files { dir := filepath.Dir(file) if dir == "." { - return []string{dir} + return map[string]bool{dir: true} } dirs = append(dirs, dir) } sort.Strings(dirs) - var result []string + result := make(map[string]bool) visited := make(map[string]bool) for _, dir := range dirs { + if _, ok := visited[dir]; ok { + continue + } + visited[dir] = true if isSubdirectoryOfAny(dir, result) { continue } - result = lo.Union(result, []string{dir}) - visited[dir] = true + result[dir] = true } return result } -func isSubdirectoryOfAny(dir string, directories []string) bool { - for _, base := range directories { +func isSubdirectoryOfAny(dir string, directories map[string]bool) bool { + for base := range directories { if strings.HasPrefix(dir, base+string(filepath.Separator)) { return true } diff --git a/core/block/import/common/source/directory_test.go b/core/block/import/common/source/directory_test.go index f4d33c7e0..5554abe3b 100644 --- a/core/block/import/common/source/directory_test.go +++ b/core/block/import/common/source/directory_test.go @@ -47,7 +47,7 @@ func TestDirectory_Initialize(t *testing.T) { assert.NoError(t, err) assert.Equal(t, tempDir, directory.importPath) assert.Len(t, directory.fileReaders, 2) - expectedRoots := []string{tempDir} + expectedRoots := map[string]bool{tempDir: true} assert.Equal(t, expectedRoots, directory.rootDirs) }) t.Run("directory with another dir inside", func(t *testing.T) { @@ -72,7 +72,7 @@ func TestDirectory_Initialize(t *testing.T) { assert.Equal(t, tempDir, directory.importPath) assert.Len(t, directory.fileReaders, 3) - expectedRoots := []string{filepath.Join(tempDir, "folder")} + expectedRoots := map[string]bool{filepath.Join(tempDir, "folder"): true} assert.Equal(t, expectedRoots, directory.rootDirs) }) t.Run("directory with 2 dirs inside", func(t *testing.T) { @@ -96,7 +96,7 @@ func TestDirectory_Initialize(t *testing.T) { assert.Equal(t, tempDir, directory.importPath) assert.Len(t, directory.fileReaders, 2) - expectedRoots := []string{filepath.Join(tempDir, "folder"), filepath.Join(tempDir, "folder1", "folder2")} + expectedRoots := map[string]bool{filepath.Join(tempDir, "folder"): true, filepath.Join(tempDir, "folder1", "folder2"): true} assert.Equal(t, expectedRoots, directory.rootDirs) }) } diff --git a/core/block/import/common/source/zip.go b/core/block/import/common/source/zip.go index 3c7103f9e..a6c43964e 100644 --- a/core/block/import/common/source/zip.go +++ b/core/block/import/common/source/zip.go @@ -5,7 +5,6 @@ import ( "fmt" "io" "path/filepath" - "slices" "strings" "github.com/samber/lo" @@ -21,7 +20,7 @@ type Zip struct { archiveReader *zip.ReadCloser fileReaders map[string]*zip.File originalToNormalizedNames map[string]string - rootDirs []string + rootDirs map[string]bool } func NewZip() *Zip { @@ -108,7 +107,7 @@ func (z *Zip) Close() { func (z *Zip) IsRootFile(fileName string) bool { fileDir := filepath.Dir(fileName) - return fileDir == "." || slices.Contains(z.rootDirs, fileDir) + return fileDir == "." || z.rootDirs[fileDir] } func (z *Zip) GetFileOriginalName(fileName string) string { diff --git a/core/block/import/common/source/zip_test.go b/core/block/import/common/source/zip_test.go index 6578715f8..5c3b20395 100644 --- a/core/block/import/common/source/zip_test.go +++ b/core/block/import/common/source/zip_test.go @@ -56,7 +56,7 @@ func TestZip_Initialize(t *testing.T) { assert.NotNil(t, zipInstance.archiveReader) assert.Len(t, zipInstance.fileReaders, 2) - expectedRoots := []string{"."} + expectedRoots := map[string]bool{".": true} assert.Equal(t, expectedRoots, zipInstance.rootDirs) }) t.Run("zip files with dir inside", func(t *testing.T) { @@ -80,7 +80,7 @@ func TestZip_Initialize(t *testing.T) { assert.NotNil(t, zipInstance.archiveReader) assert.Len(t, zipInstance.fileReaders, 3) - expectedRoots := []string{"folder"} + expectedRoots := map[string]bool{"folder": true} assert.Equal(t, expectedRoots, zipInstance.rootDirs) }) t.Run("zip files with 2 dirs inside", func(t *testing.T) { @@ -103,7 +103,7 @@ func TestZip_Initialize(t *testing.T) { assert.NotNil(t, zipInstance.archiveReader) assert.Len(t, zipInstance.fileReaders, 2) - expectedRoots := []string{"folder", filepath.Join("folder1", "folder2")} + expectedRoots := map[string]bool{"folder": true, filepath.Join("folder1", "folder2"): true} assert.Equal(t, expectedRoots, zipInstance.rootDirs) }) t.Run("invalid path", func(t *testing.T) { From 1d3ee527cfa7303e7bf4db8124ecb319f52af84a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 22 Jan 2025 13:45:08 +0100 Subject: [PATCH 140/195] Bump github.com/anyproto/any-store from 0.1.3 to 0.1.4 (#2030) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 10 +++++----- go.sum | 44 ++++++++++++++++++++++---------------------- 2 files changed, 27 insertions(+), 27 deletions(-) diff --git a/go.mod b/go.mod index 8b8d069ca..061ce6110 100644 --- a/go.mod +++ b/go.mod @@ -7,7 +7,7 @@ require ( github.com/PuerkitoBio/goquery v1.10.1 github.com/VividCortex/ewma v1.2.0 github.com/adrium/goheif v0.0.0-20230113233934-ca402e77a786 - github.com/anyproto/any-store v0.1.3 + github.com/anyproto/any-store v0.1.4 github.com/anyproto/any-sync v0.5.25 github.com/anyproto/anytype-publish-server/publishclient v0.0.0-20241223184559-a5cacfe0950a github.com/anyproto/go-chash v0.1.0 @@ -263,10 +263,10 @@ require ( gopkg.in/ini.v1 v1.67.0 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect lukechampine.com/blake3 v1.3.0 // indirect - modernc.org/libc v1.61.0 // indirect - modernc.org/mathutil v1.6.0 // indirect - modernc.org/memory v1.8.0 // indirect - modernc.org/sqlite v1.33.1 // indirect + modernc.org/libc v1.61.9 // indirect + modernc.org/mathutil v1.7.1 // indirect + modernc.org/memory v1.8.2 // indirect + modernc.org/sqlite v1.34.5 // indirect nhooyr.io/websocket v1.8.7 // indirect ) diff --git a/go.sum b/go.sum index 888393e93..d8a1d787c 100644 --- a/go.sum +++ b/go.sum @@ -76,8 +76,8 @@ github.com/alexbrainman/goissue34681 v0.0.0-20191006012335-3fc7a47baff5/go.mod h github.com/andybalholm/cascadia v1.3.1/go.mod h1:R4bJ1UQfqADjvDa4P6HZHLh/3OxWWEqc0Sk8XGwHqvA= github.com/andybalholm/cascadia v1.3.3 h1:AG2YHrzJIm4BZ19iwJ/DAua6Btl3IwJX+VI4kktS1LM= github.com/andybalholm/cascadia v1.3.3/go.mod h1:xNd9bqTn98Ln4DwST8/nG+H0yuB8Hmgu1YHNnWw0GeA= -github.com/anyproto/any-store v0.1.3 h1:onWLP8tuWiUvYOyV3DoRODscTxAiGEjwQPm+NMxeq3M= -github.com/anyproto/any-store v0.1.3/go.mod h1:6/0OUKgSMWF/vYGoGYzQOl2CII5OdiuXbQlGDXYcNYc= +github.com/anyproto/any-store v0.1.4 h1:rIxMA2XugPtdHl2S/XWnNFAMxdBysFMT9ORoJWdWQwM= +github.com/anyproto/any-store v0.1.4/go.mod h1:nbyRoJYOlvSWU1xDOrmgPP96UeoTf4eYZ9k+qqLK9k8= github.com/anyproto/any-sync v0.5.25 h1:v59eQ+C7YOKC18G1PVql17fuc42Mvgb7c7Ju855tc0Q= github.com/anyproto/any-sync v0.5.25/go.mod h1:NKQZqnU7NzOOjDQc/rKmiRmRDCrARdlEnVLYwWqTcfM= github.com/anyproto/anytype-publish-server/publishclient v0.0.0-20241223184559-a5cacfe0950a h1:kSNyLHsZ40JxlRAglr85YXH2ik2LH3AH5Hd3JL42KGo= @@ -1624,28 +1624,28 @@ honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9 honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= lukechampine.com/blake3 v1.3.0 h1:sJ3XhFINmHSrYCgl958hscfIa3bw8x4DqMP3u1YvoYE= lukechampine.com/blake3 v1.3.0/go.mod h1:0OFRp7fBtAylGVCO40o87sbupkyIGgbpv1+M1k1LM6k= -modernc.org/cc/v4 v4.21.4 h1:3Be/Rdo1fpr8GrQ7IVw9OHtplU4gWbb+wNgeoBMmGLQ= -modernc.org/cc/v4 v4.21.4/go.mod h1:HM7VJTZbUCR3rV8EYBi9wxnJ0ZBRiGE5OeGXNA0IsLQ= -modernc.org/ccgo/v4 v4.21.0 h1:kKPI3dF7RIag8YcToh5ZwDcVMIv6VGa0ED5cvh0LMW4= -modernc.org/ccgo/v4 v4.21.0/go.mod h1:h6kt6H/A2+ew/3MW/p6KEoQmrq/i3pr0J/SiwiaF/g0= +modernc.org/cc/v4 v4.24.4 h1:TFkx1s6dCkQpd6dKurBNmpo+G8Zl4Sq/ztJ+2+DEsh0= +modernc.org/cc/v4 v4.24.4/go.mod h1:uVtb5OGqUKpoLWhqwNQo/8LwvoiEBLvZXIQ/SmO6mL0= +modernc.org/ccgo/v4 v4.23.13 h1:PFiaemQwE/jdwi8XEHyEV+qYWoIuikLP3T4rvDeJb00= +modernc.org/ccgo/v4 v4.23.13/go.mod h1:vdN4h2WR5aEoNondUx26K7G8X+nuBscYnAEWSRmN2/0= modernc.org/fileutil v1.3.0 h1:gQ5SIzK3H9kdfai/5x41oQiKValumqNTDXMvKo62HvE= modernc.org/fileutil v1.3.0/go.mod h1:XatxS8fZi3pS8/hKG2GH/ArUogfxjpEKs3Ku3aK4JyQ= -modernc.org/gc/v2 v2.5.0 h1:bJ9ChznK1L1mUtAQtxi0wi5AtAs5jQuw4PrPHO5pb6M= -modernc.org/gc/v2 v2.5.0/go.mod h1:wzN5dK1AzVGoH6XOzc3YZ+ey/jPgYHLuVckd62P0GYU= -modernc.org/libc v1.61.0 h1:eGFcvWpqlnoGwzZeZe3PWJkkKbM/3SUGyk1DVZQ0TpE= -modernc.org/libc v1.61.0/go.mod h1:DvxVX89wtGTu+r72MLGhygpfi3aUGgZRdAYGCAVVud0= -modernc.org/mathutil v1.6.0 h1:fRe9+AmYlaej+64JsEEhoWuAYBkOtQiMEU7n/XgfYi4= -modernc.org/mathutil v1.6.0/go.mod h1:Ui5Q9q1TR2gFm0AQRqQUaBWFLAhQpCwNcuhBOSedWPo= -modernc.org/memory v1.8.0 h1:IqGTL6eFMaDZZhEWwcREgeMXYwmW83LYW8cROZYkg+E= -modernc.org/memory v1.8.0/go.mod h1:XPZ936zp5OMKGWPqbD3JShgd/ZoQ7899TUuQqxY+peU= -modernc.org/opt v0.1.3 h1:3XOZf2yznlhC+ibLltsDGzABUGVx8J6pnFMS3E4dcq4= -modernc.org/opt v0.1.3/go.mod h1:WdSiB5evDcignE70guQKxYUl14mgWtbClRi5wmkkTX0= -modernc.org/sortutil v1.2.0 h1:jQiD3PfS2REGJNzNCMMaLSp/wdMNieTbKX920Cqdgqc= -modernc.org/sortutil v1.2.0/go.mod h1:TKU2s7kJMf1AE84OoiGppNHJwvB753OYfNl2WRb++Ss= -modernc.org/sqlite v1.33.1 h1:trb6Z3YYoeM9eDL1O8do81kP+0ejv+YzgyFo+Gwy0nM= -modernc.org/sqlite v1.33.1/go.mod h1:pXV2xHxhzXZsgT/RtTFAPY6JJDEvOTcTdwADQCCWD4k= -modernc.org/strutil v1.2.0 h1:agBi9dp1I+eOnxXeiZawM8F4LawKv4NzGWSaLfyeNZA= -modernc.org/strutil v1.2.0/go.mod h1:/mdcBmfOibveCTBxUl5B5l6W+TTH1FXPLHZE6bTosX0= +modernc.org/gc/v2 v2.6.1 h1:+Qf6xdG8l7B27TQ8D8lw/iFMUj1RXRBOuMUWziJOsk8= +modernc.org/gc/v2 v2.6.1/go.mod h1:YgIahr1ypgfe7chRuJi2gD7DBQiKSLMPgBQe9oIiito= +modernc.org/libc v1.61.9 h1:PLSBXVkifXGELtJ5BOnBUyAHr7lsatNwFU/RRo4kfJM= +modernc.org/libc v1.61.9/go.mod h1:61xrnzk/aR8gr5bR7Uj/lLFLuXu2/zMpIjcry63Eumk= +modernc.org/mathutil v1.7.1 h1:GCZVGXdaN8gTqB1Mf/usp1Y/hSqgI2vAGGP4jZMCxOU= +modernc.org/mathutil v1.7.1/go.mod h1:4p5IwJITfppl0G4sUEDtCr4DthTaT47/N3aT6MhfgJg= +modernc.org/memory v1.8.2 h1:cL9L4bcoAObu4NkxOlKWBWtNHIsnnACGF/TbqQ6sbcI= +modernc.org/memory v1.8.2/go.mod h1:ZbjSvMO5NQ1A2i3bWeDiVMxIorXwdClKE/0SZ+BMotU= +modernc.org/opt v0.1.4 h1:2kNGMRiUjrp4LcaPuLY2PzUfqM/w9N23quVwhKt5Qm8= +modernc.org/opt v0.1.4/go.mod h1:03fq9lsNfvkYSfxrfUhZCWPk1lm4cq4N+Bh//bEtgns= +modernc.org/sortutil v1.2.1 h1:+xyoGf15mM3NMlPDnFqrteY07klSFxLElE2PVuWIJ7w= +modernc.org/sortutil v1.2.1/go.mod h1:7ZI3a3REbai7gzCLcotuw9AC4VZVpYMjDzETGsSMqJE= +modernc.org/sqlite v1.34.5 h1:Bb6SR13/fjp15jt70CL4f18JIN7p7dnMExd+UFnF15g= +modernc.org/sqlite v1.34.5/go.mod h1:YLuNmX9NKs8wRNK2ko1LW1NGYcc9FkBO69JOt1AR9JE= +modernc.org/strutil v1.2.1 h1:UneZBkQA+DX2Rp35KcM69cSsNES9ly8mQWD71HKlOA0= +modernc.org/strutil v1.2.1/go.mod h1:EHkiggD70koQxjVdSBM3JKM7k6L0FbGE5eymy9i3B9A= modernc.org/token v1.1.0 h1:Xl7Ap9dKaEs5kLoOQeQmPWevfnk/DM5qcLcYlA8ys6Y= modernc.org/token v1.1.0/go.mod h1:UGzOrNV1mAFSEB63lOFHIpNRUVMvYTc6yu1SMY/XTDM= nhooyr.io/websocket v1.8.6/go.mod h1:B70DZP8IakI65RVQ51MsWP/8jndNma26DVA/nFSCgW0= From bbee43dae82fa021a5f25c870bda32da9f869106 Mon Sep 17 00:00:00 2001 From: AnastasiaShemyakinskaya Date: Wed, 22 Jan 2025 15:29:46 +0100 Subject: [PATCH 141/195] GO-4889: add dependency details Signed-off-by: AnastasiaShemyakinskaya --- core/block/export/export.go | 66 +- core/converter/pbc/pbc.go | 28 +- core/converter/pbc/pbc_test.go | 2 +- core/publish/service.go | 17 +- docs/proto.md | 19 + pb/commands.pb.go | 2495 ++++++++++++++++---------------- pb/protos/commands.proto | 2 + pb/protos/snapshot.proto | 6 + pb/snapshot.pb.go | 346 ++++- 9 files changed, 1692 insertions(+), 1289 deletions(-) diff --git a/core/block/export/export.go b/core/block/export/export.go index 9a0302621..b99c06a13 100644 --- a/core/block/export/export.go +++ b/core/block/export/export.go @@ -135,33 +135,35 @@ func (e *export) finishWithNotification(spaceId string, exportFormat model.Expor } type exportContext struct { - spaceId string - docs map[string]*domain.Details - includeArchive bool - includeNested bool - includeFiles bool - format model.ExportFormat - isJson bool - reqIds []string - zip bool - path string + spaceId string + docs map[string]*domain.Details + includeArchive bool + includeNested bool + includeFiles bool + format model.ExportFormat + isJson bool + reqIds []string + zip bool + path string + includeDependentDetails bool *export } func newExportContext(e *export, req pb.RpcObjectListExportRequest) *exportContext { return &exportContext{ - path: req.Path, - spaceId: req.SpaceId, - docs: map[string]*domain.Details{}, - includeArchive: req.IncludeArchived, - includeNested: req.IncludeNested, - includeFiles: req.IncludeFiles, - format: req.Format, - isJson: req.IsJson, - reqIds: req.ObjectIds, - zip: req.Zip, - export: e, + path: req.Path, + spaceId: req.SpaceId, + docs: map[string]*domain.Details{}, + includeArchive: req.IncludeArchived, + includeNested: req.IncludeNested, + includeFiles: req.IncludeFiles, + format: req.Format, + isJson: req.IsJson, + reqIds: req.ObjectIds, + zip: req.Zip, + includeDependentDetails: req.IncludeDependentDetails, + export: e, } } @@ -969,12 +971,16 @@ func (e *exportContext) writeDoc(ctx context.Context, wr writer, docId string) ( } } + dependentDetails, err := e.getDependentDetails(b, st, err) + if err != nil { + return err + } var conv converter.Converter switch e.format { case model.Export_Markdown: conv = md.NewMDConverter(st, wr.Namer()) case model.Export_Protobuf: - conv = pbc.NewConverter(st, e.isJson) + conv = pbc.NewConverter(st, e.isJson, dependentDetails) case model.Export_JSON: conv = pbjson.NewConverter(st) } @@ -996,6 +1002,22 @@ func (e *exportContext) writeDoc(ctx context.Context, wr writer, docId string) ( }) } +func (e *exportContext) getDependentDetails(b sb.SmartBlock, st *state.State, err error) ([]database.Record, error) { + var dependentDetails []database.Record + if e.includeDependentDetails { + dependentObjectIDs := objectlink.DependentObjectIDs(st, b.Space(), objectlink.Flags{ + Blocks: true, + Details: true, + Types: true, + }) + dependentDetails, err = e.objectStore.SpaceIndex(b.SpaceID()).QueryByIds(dependentObjectIDs) + if err != nil { + return nil, err + } + } + return dependentDetails, nil +} + func (e *exportContext) saveFile(ctx context.Context, wr writer, fileObject sb.SmartBlock, exportAllSpaces bool) (fileName string, err error) { fullId := domain.FullFileId{ SpaceId: fileObject.Space().Id(), diff --git a/core/converter/pbc/pbc.go b/core/converter/pbc/pbc.go index 112d4fa92..020febbdc 100644 --- a/core/converter/pbc/pbc.go +++ b/core/converter/pbc/pbc.go @@ -7,22 +7,26 @@ import ( "github.com/anyproto/anytype-heart/core/converter" "github.com/anyproto/anytype-heart/core/domain" "github.com/anyproto/anytype-heart/pb" + "github.com/anyproto/anytype-heart/pkg/lib/bundle" + "github.com/anyproto/anytype-heart/pkg/lib/database" "github.com/anyproto/anytype-heart/pkg/lib/logging" "github.com/anyproto/anytype-heart/pkg/lib/pb/model" ) var log = logging.Logger("pb-converter") -func NewConverter(s state.Doc, isJSON bool) converter.Converter { +func NewConverter(s state.Doc, isJSON bool, dependentDetails []database.Record) converter.Converter { return &pbc{ - s: s, - isJSON: isJSON, + s: s, + isJSON: isJSON, + dependentDetails: dependentDetails, } } type pbc struct { - s state.Doc - isJSON bool + s state.Doc + isJSON bool + dependentDetails []database.Record } func (p *pbc) Convert(sbType model.SmartBlockType) []byte { @@ -38,12 +42,20 @@ func (p *pbc) Convert(sbType model.SmartBlockType) []byte { FileInfo: st.GetFileInfo().ToModel(), }, } + dependentDetails := make([]*pb.DependantDetail, 0, len(p.dependentDetails)) + for _, detail := range p.dependentDetails { + dependentDetails = append(dependentDetails, &pb.DependantDetail{ + Id: detail.Details.GetString(bundle.RelationKeyId), + Details: detail.Details.ToProto(), + }) + } mo := &pb.SnapshotWithType{ - SbType: sbType, - Snapshot: snapshot, + SbType: sbType, + Snapshot: snapshot, + DependantDetails: dependentDetails, } if p.isJSON { - m := jsonpb.Marshaler{Indent: " ", EmitDefaults: true} + m := jsonpb.Marshaler{Indent: " "} result, err := m.MarshalToString(mo) if err != nil { log.Errorf("failed to convert object to json: %s", err) diff --git a/core/converter/pbc/pbc_test.go b/core/converter/pbc/pbc_test.go index 66d74d210..420043f7d 100644 --- a/core/converter/pbc/pbc_test.go +++ b/core/converter/pbc/pbc_test.go @@ -13,7 +13,7 @@ import ( func TestPbc_Convert(t *testing.T) { s := state.NewDoc("root", nil).(*state.State) template.InitTemplate(s, template.WithTitle) - c := NewConverter(s, false) + c := NewConverter(s, false, nil) result := c.Convert(model.SmartBlockType_Page) assert.NotEmpty(t, result) } diff --git a/core/publish/service.go b/core/publish/service.go index dc1c9f702..e95bfcb96 100644 --- a/core/publish/service.go +++ b/core/publish/service.go @@ -122,14 +122,15 @@ func uniqName() string { func (s *service) exportToDir(ctx context.Context, spaceId, pageId string) (dirEntries []fs.DirEntry, exportPath string, err error) { tempDir := os.TempDir() exportPath, _, err = s.exportService.Export(ctx, pb.RpcObjectListExportRequest{ - SpaceId: spaceId, - Format: model.Export_Protobuf, - IncludeFiles: true, - IsJson: false, - Zip: false, - Path: tempDir, - ObjectIds: []string{pageId}, - NoProgress: true, + SpaceId: spaceId, + Format: model.Export_Protobuf, + IncludeFiles: true, + IsJson: false, + Zip: false, + Path: tempDir, + ObjectIds: []string{pageId}, + NoProgress: true, + IncludeDependentDetails: true, }) if err != nil { return diff --git a/docs/proto.md b/docs/proto.md index bfba4db14..2fae09a17 100644 --- a/docs/proto.md +++ b/docs/proto.md @@ -1795,6 +1795,7 @@ - [Model.Process.State](#anytype-Model-Process-State) - [pb/protos/snapshot.proto](#pb_protos_snapshot-proto) + - [DependantDetail](#anytype-DependantDetail) - [Profile](#anytype-Profile) - [SnapshotWithType](#anytype-SnapshotWithType) @@ -15485,6 +15486,7 @@ Deletes the object, keys from the local store and unsubscribe from remote change | isJson | [bool](#bool) | | for protobuf export | | includeArchived | [bool](#bool) | | for migration | | noProgress | [bool](#bool) | | for integrations like raycast and web publishing | +| includeDependentDetails | [bool](#bool) | | for web publising, just add details of dependent objects in result snapshot | @@ -28257,6 +28259,22 @@ Precondition: user A and user B opened the same block + + +### DependantDetail + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| id | [string](#string) | | | +| details | [google.protobuf.Struct](#google-protobuf-Struct) | | | + + + + + + ### Profile @@ -28287,6 +28305,7 @@ Precondition: user A and user B opened the same block | ----- | ---- | ----- | ----------- | | sbType | [model.SmartBlockType](#anytype-model-SmartBlockType) | | | | snapshot | [Change.Snapshot](#anytype-Change-Snapshot) | | | +| dependantDetails | [DependantDetail](#anytype-DependantDetail) | repeated | | diff --git a/pb/commands.pb.go b/pb/commands.pb.go index 556b69779..19779b4e2 100644 --- a/pb/commands.pb.go +++ b/pb/commands.pb.go @@ -29575,6 +29575,8 @@ type RpcObjectListExportRequest struct { IncludeArchived bool `protobuf:"varint,9,opt,name=includeArchived,proto3" json:"includeArchived,omitempty"` // for integrations like raycast and web publishing NoProgress bool `protobuf:"varint,11,opt,name=noProgress,proto3" json:"noProgress,omitempty"` + // for web publising, just add details of dependent objects in result snapshot + IncludeDependentDetails bool `protobuf:"varint,12,opt,name=includeDependentDetails,proto3" json:"includeDependentDetails,omitempty"` } func (m *RpcObjectListExportRequest) Reset() { *m = RpcObjectListExportRequest{} } @@ -29680,6 +29682,13 @@ func (m *RpcObjectListExportRequest) GetNoProgress() bool { return false } +func (m *RpcObjectListExportRequest) GetIncludeDependentDetails() bool { + if m != nil { + return m.IncludeDependentDetails + } + return false +} + type RpcObjectListExportResponse struct { Error *RpcObjectListExportResponseError `protobuf:"bytes,1,opt,name=error,proto3" json:"error,omitempty"` Path string `protobuf:"bytes,2,opt,name=path,proto3" json:"path,omitempty"` @@ -72093,1232 +72102,1233 @@ func init() { func init() { proto.RegisterFile("pb/protos/commands.proto", fileDescriptor_8261c968b2e6f45c) } var fileDescriptor_8261c968b2e6f45c = []byte{ - // 19597 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0xfd, 0x7d, 0x9c, 0x23, 0x47, - 0x75, 0x2f, 0x8c, 0xaf, 0xba, 0x25, 0xcd, 0xcc, 0x99, 0x97, 0xd5, 0xb6, 0x77, 0xd7, 0xeb, 0xb2, - 0x59, 0x3b, 0x6b, 0x63, 0x1c, 0x63, 0xc6, 0xc6, 0x10, 0x82, 0x8d, 0x8d, 0xad, 0xd1, 0x68, 0x66, - 0x64, 0xcf, 0x48, 0x93, 0x96, 0x66, 0x17, 0x27, 0x37, 0x3f, 0xdd, 0x5e, 0xa9, 0x66, 0xa6, 0xbd, - 0x9a, 0x6e, 0xa5, 0xbb, 0x67, 0xd6, 0xcb, 0xef, 0x73, 0x9f, 0x1b, 0x42, 0x1c, 0x48, 0x88, 0x2f, - 0x49, 0x08, 0x49, 0x78, 0x07, 0x83, 0xe1, 0x42, 0x02, 0x84, 0xf7, 0x0b, 0x49, 0x80, 0xf0, 0x1e, - 0x42, 0x08, 0x81, 0x10, 0x08, 0x09, 0x4f, 0x20, 0x10, 0x42, 0xee, 0x27, 0x5c, 0x9e, 0xe4, 0xb9, - 0x81, 0x90, 0xc0, 0xc3, 0xf3, 0xe9, 0xaa, 0xea, 0x97, 0xd2, 0xa8, 0x5b, 0xd5, 0x1a, 0xb5, 0xc6, - 0x84, 0xe7, 0xbf, 0xee, 0xea, 0xea, 0x53, 0xa7, 0xce, 0xf7, 0x54, 0xd5, 0xa9, 0xaa, 0x53, 0xa7, - 0xe0, 0x54, 0xf7, 0xfc, 0xcd, 0x5d, 0xcb, 0x74, 0x4c, 0xfb, 0xe6, 0x96, 0xb9, 0xb3, 0xa3, 0x19, - 0x6d, 0x7b, 0x9e, 0xbc, 0x2b, 0x13, 0x9a, 0x71, 0xc9, 0xb9, 0xd4, 0xc5, 0xe8, 0xba, 0xee, 0x85, - 0xad, 0x9b, 0x3b, 0xfa, 0xf9, 0x9b, 0xbb, 0xe7, 0x6f, 0xde, 0x31, 0xdb, 0xb8, 0xe3, 0xfd, 0x40, - 0x5e, 0x58, 0x76, 0x74, 0x43, 0x54, 0xae, 0x8e, 0xd9, 0xd2, 0x3a, 0xb6, 0x63, 0x5a, 0x98, 0xe5, - 0x3c, 0x19, 0x14, 0x89, 0xf7, 0xb0, 0xe1, 0x78, 0x14, 0xae, 0xda, 0x32, 0xcd, 0xad, 0x0e, 0xa6, - 0xdf, 0xce, 0xef, 0x6e, 0xde, 0x6c, 0x3b, 0xd6, 0x6e, 0xcb, 0x61, 0x5f, 0xaf, 0xe9, 0xfd, 0xda, - 0xc6, 0x76, 0xcb, 0xd2, 0xbb, 0x8e, 0x69, 0xd1, 0x1c, 0x67, 0x3e, 0xf2, 0xd0, 0x24, 0xc8, 0x6a, - 0xb7, 0x85, 0xbe, 0x35, 0x01, 0x72, 0xb1, 0xdb, 0x45, 0x1f, 0x96, 0x00, 0x96, 0xb1, 0x73, 0x16, - 0x5b, 0xb6, 0x6e, 0x1a, 0xe8, 0x28, 0x4c, 0xa8, 0xf8, 0x67, 0x76, 0xb1, 0xed, 0xdc, 0x9e, 0x7d, - 0xee, 0xd7, 0xe4, 0x0c, 0x7a, 0x44, 0x82, 0x49, 0x15, 0xdb, 0x5d, 0xd3, 0xb0, 0xb1, 0x72, 0x37, - 0xe4, 0xb0, 0x65, 0x99, 0xd6, 0xa9, 0xcc, 0x35, 0x99, 0x1b, 0xa6, 0x6f, 0xbd, 0x71, 0x9e, 0x55, - 0x7f, 0x5e, 0xed, 0xb6, 0xe6, 0x8b, 0xdd, 0xee, 0x7c, 0x40, 0x69, 0xde, 0xfb, 0x69, 0xbe, 0xec, - 0xfe, 0xa1, 0xd2, 0x1f, 0x95, 0x53, 0x30, 0xb1, 0x47, 0x33, 0x9c, 0x92, 0xae, 0xc9, 0xdc, 0x30, - 0xa5, 0x7a, 0xaf, 0xee, 0x97, 0x36, 0x76, 0x34, 0xbd, 0x63, 0x9f, 0x92, 0xe9, 0x17, 0xf6, 0x8a, - 0x1e, 0xce, 0x40, 0x8e, 0x10, 0x51, 0x4a, 0x90, 0x6d, 0x99, 0x6d, 0x4c, 0x8a, 0x9f, 0xbb, 0xf5, - 0x66, 0xf1, 0xe2, 0xe7, 0x4b, 0x66, 0x1b, 0xab, 0xe4, 0x67, 0xe5, 0x1a, 0x98, 0xf6, 0xc4, 0x12, - 0xb0, 0x11, 0x4e, 0x3a, 0x73, 0x2b, 0x64, 0xdd, 0xfc, 0xca, 0x24, 0x64, 0xab, 0x1b, 0xab, 0xab, - 0x85, 0x23, 0xca, 0x31, 0x98, 0xdd, 0xa8, 0xde, 0x5b, 0xad, 0x9d, 0xab, 0x36, 0xcb, 0xaa, 0x5a, - 0x53, 0x0b, 0x19, 0x65, 0x16, 0xa6, 0x16, 0x8a, 0x8b, 0xcd, 0x4a, 0x75, 0x7d, 0xa3, 0x51, 0x90, - 0xd0, 0xcb, 0x65, 0x98, 0xab, 0x63, 0x67, 0x11, 0xef, 0xe9, 0x2d, 0x5c, 0x77, 0x34, 0x07, 0xa3, - 0xe7, 0x67, 0x7c, 0x61, 0x2a, 0x1b, 0x6e, 0xa1, 0xfe, 0x27, 0x56, 0x81, 0x27, 0xed, 0xab, 0x00, - 0x4f, 0x61, 0x9e, 0xfd, 0x3d, 0x1f, 0x4a, 0x53, 0xc3, 0x74, 0xce, 0x3c, 0x01, 0xa6, 0x43, 0xdf, - 0x94, 0x39, 0x80, 0x85, 0x62, 0xe9, 0xde, 0x65, 0xb5, 0xb6, 0x51, 0x5d, 0x2c, 0x1c, 0x71, 0xdf, - 0x97, 0x6a, 0x6a, 0x99, 0xbd, 0x67, 0xd0, 0x77, 0x32, 0x21, 0x30, 0x17, 0x79, 0x30, 0xe7, 0x07, - 0x33, 0xd3, 0x07, 0x50, 0xf4, 0x5a, 0x1f, 0x9c, 0x65, 0x0e, 0x9c, 0x27, 0x25, 0x23, 0x97, 0x3e, - 0x40, 0x0f, 0x4a, 0x30, 0x59, 0xdf, 0xde, 0x75, 0xda, 0xe6, 0x45, 0x03, 0x4d, 0xf9, 0xc8, 0xa0, - 0x6f, 0x84, 0x65, 0xf2, 0x74, 0x5e, 0x26, 0x37, 0xec, 0xaf, 0x04, 0xa3, 0x10, 0x21, 0x8d, 0x57, - 0xfa, 0xd2, 0x28, 0x72, 0xd2, 0x78, 0x82, 0x28, 0xa1, 0xf4, 0xe5, 0xf0, 0xe2, 0xa7, 0x42, 0xae, - 0xde, 0xd5, 0x5a, 0x18, 0x7d, 0x42, 0x86, 0x99, 0x55, 0xac, 0xed, 0xe1, 0x62, 0xb7, 0x6b, 0x99, - 0x7b, 0x18, 0x95, 0x02, 0x7d, 0x3d, 0x05, 0x13, 0xb6, 0x9b, 0xa9, 0xd2, 0x26, 0x35, 0x98, 0x52, - 0xbd, 0x57, 0xe5, 0x34, 0x80, 0xde, 0xc6, 0x86, 0xa3, 0x3b, 0x3a, 0xb6, 0x4f, 0x49, 0xd7, 0xc8, - 0x37, 0x4c, 0xa9, 0xa1, 0x14, 0xf4, 0x2d, 0x49, 0x54, 0xc7, 0x08, 0x17, 0xf3, 0x61, 0x0e, 0x22, - 0xa4, 0xfa, 0x6a, 0x49, 0x44, 0xc7, 0x06, 0x92, 0x4b, 0x26, 0xdb, 0x37, 0x65, 0x92, 0x0b, 0xd7, - 0xcd, 0x51, 0xad, 0x35, 0xeb, 0x1b, 0xa5, 0x95, 0x66, 0x7d, 0xbd, 0x58, 0x2a, 0x17, 0xb0, 0x72, - 0x1c, 0x0a, 0xe4, 0xb1, 0x59, 0xa9, 0x37, 0x17, 0xcb, 0xab, 0xe5, 0x46, 0x79, 0xb1, 0xb0, 0xa9, - 0x28, 0x30, 0xa7, 0x96, 0x7f, 0x62, 0xa3, 0x5c, 0x6f, 0x34, 0x97, 0x8a, 0x95, 0xd5, 0xf2, 0x62, - 0x61, 0xcb, 0xfd, 0x79, 0xb5, 0xb2, 0x56, 0x69, 0x34, 0xd5, 0x72, 0xb1, 0xb4, 0x52, 0x5e, 0x2c, - 0x6c, 0x2b, 0x97, 0xc3, 0x65, 0xd5, 0x5a, 0xb3, 0xb8, 0xbe, 0xae, 0xd6, 0xce, 0x96, 0x9b, 0xec, - 0x8f, 0x7a, 0x41, 0xa7, 0x05, 0x35, 0x9a, 0xf5, 0x95, 0xa2, 0x5a, 0x2e, 0x2e, 0xac, 0x96, 0x0b, - 0xf7, 0xa3, 0x67, 0xcb, 0x30, 0xbb, 0xa6, 0x5d, 0xc0, 0xf5, 0x6d, 0xcd, 0xc2, 0xda, 0xf9, 0x0e, - 0x46, 0xd7, 0x0a, 0xe0, 0x89, 0x3e, 0x11, 0xc6, 0xab, 0xcc, 0xe3, 0x75, 0x73, 0x1f, 0x01, 0x73, - 0x45, 0x44, 0x00, 0xf6, 0xaf, 0x7e, 0x33, 0x58, 0xe1, 0x00, 0x7b, 0x72, 0x42, 0x7a, 0xc9, 0x10, - 0xfb, 0xb9, 0x47, 0x01, 0x62, 0xe8, 0x8b, 0x32, 0xcc, 0x55, 0x8c, 0x3d, 0xdd, 0xc1, 0xcb, 0xd8, - 0xc0, 0x96, 0x3b, 0x0e, 0x08, 0xc1, 0xf0, 0x88, 0x1c, 0x82, 0x61, 0x89, 0x87, 0xe1, 0x96, 0x3e, - 0x62, 0xe3, 0xcb, 0x88, 0x18, 0x6d, 0xaf, 0x82, 0x29, 0x9d, 0xe4, 0x2b, 0xe9, 0x6d, 0x26, 0xb1, - 0x20, 0x41, 0xb9, 0x0e, 0x66, 0xe9, 0xcb, 0x92, 0xde, 0xc1, 0xf7, 0xe2, 0x4b, 0x6c, 0xdc, 0xe5, - 0x13, 0xd1, 0x2f, 0xfb, 0x8d, 0xaf, 0xc2, 0x61, 0xf9, 0x63, 0x49, 0x99, 0x4a, 0x06, 0xe6, 0x0b, - 0x1f, 0x0d, 0xcd, 0x6f, 0x5f, 0x2b, 0xd3, 0xd1, 0xf7, 0x24, 0x98, 0xae, 0x3b, 0x66, 0xd7, 0x55, - 0x59, 0xdd, 0xd8, 0x12, 0x03, 0xf7, 0x63, 0xe1, 0x36, 0x56, 0xe2, 0xc1, 0x7d, 0x42, 0x1f, 0x39, - 0x86, 0x0a, 0x88, 0x68, 0x61, 0xdf, 0xf2, 0x5b, 0xd8, 0x12, 0x87, 0xca, 0xad, 0x89, 0xa8, 0xfd, - 0x00, 0xb6, 0xaf, 0x17, 0xca, 0x50, 0xf0, 0xd4, 0xcc, 0x29, 0xed, 0x5a, 0x16, 0x36, 0x1c, 0x31, - 0x10, 0xfe, 0x2a, 0x0c, 0xc2, 0x0a, 0x0f, 0xc2, 0xad, 0x31, 0xca, 0xec, 0x95, 0x92, 0x62, 0x1b, - 0x7b, 0xbf, 0x8f, 0xe6, 0xbd, 0x1c, 0x9a, 0x3f, 0x9e, 0x9c, 0xad, 0x64, 0x90, 0xae, 0x0c, 0x81, - 0xe8, 0x71, 0x28, 0xb8, 0x63, 0x52, 0xa9, 0x51, 0x39, 0x5b, 0x6e, 0x56, 0xaa, 0x67, 0x2b, 0x8d, - 0x72, 0x01, 0xa3, 0x17, 0xc8, 0x30, 0x43, 0x59, 0x53, 0xf1, 0x9e, 0x79, 0x41, 0xb0, 0xd7, 0xfb, - 0x62, 0x42, 0x63, 0x21, 0x5c, 0x42, 0x44, 0xcb, 0xf8, 0xa5, 0x04, 0xc6, 0x42, 0x0c, 0xb9, 0x47, - 0x53, 0x6f, 0xb5, 0xaf, 0x19, 0x6c, 0xf5, 0x69, 0x2d, 0x7d, 0x7b, 0xab, 0x17, 0x66, 0x01, 0x68, - 0x25, 0xcf, 0xea, 0xf8, 0x22, 0x5a, 0x0b, 0x30, 0xe1, 0xd4, 0x36, 0x33, 0x50, 0x6d, 0xa5, 0x7e, - 0x6a, 0xfb, 0xae, 0xf0, 0x98, 0xb5, 0xc0, 0xa3, 0x77, 0x53, 0xa4, 0xb8, 0x5d, 0x4e, 0xa2, 0x67, - 0x87, 0x9e, 0xa2, 0x48, 0xbc, 0xd5, 0x79, 0x15, 0x4c, 0x91, 0xc7, 0xaa, 0xb6, 0x83, 0x59, 0x1b, - 0x0a, 0x12, 0x94, 0x33, 0x30, 0x43, 0x33, 0xb6, 0x4c, 0xc3, 0xad, 0x4f, 0x96, 0x64, 0xe0, 0xd2, - 0x5c, 0x10, 0x5b, 0x16, 0xd6, 0x1c, 0xd3, 0x22, 0x34, 0x72, 0x14, 0xc4, 0x50, 0x12, 0xfa, 0xba, - 0xdf, 0x0a, 0xcb, 0x9c, 0xe6, 0x3c, 0x31, 0x49, 0x55, 0x92, 0xe9, 0xcd, 0xde, 0x70, 0xed, 0x8f, - 0xb6, 0xba, 0xa6, 0x8b, 0xf6, 0x12, 0x99, 0xda, 0x61, 0xe5, 0x24, 0x28, 0x2c, 0xd5, 0xcd, 0x5b, - 0xaa, 0x55, 0x1b, 0xe5, 0x6a, 0xa3, 0xb0, 0xd9, 0x57, 0xa3, 0xb6, 0xd0, 0xab, 0xb3, 0x90, 0xbd, - 0xc7, 0xd4, 0x0d, 0xf4, 0x60, 0x86, 0x53, 0x09, 0x03, 0x3b, 0x17, 0x4d, 0xeb, 0x82, 0xdf, 0x50, - 0x83, 0x84, 0x78, 0x6c, 0x02, 0x55, 0x92, 0x07, 0xaa, 0x52, 0xb6, 0x9f, 0x2a, 0xfd, 0x5a, 0x58, - 0x95, 0xee, 0xe0, 0x55, 0xe9, 0xfa, 0x3e, 0xf2, 0x77, 0x99, 0x8f, 0xe8, 0x00, 0x3e, 0xea, 0x77, - 0x00, 0x77, 0x71, 0x30, 0x3e, 0x5e, 0x8c, 0x4c, 0x32, 0x00, 0xbf, 0x90, 0x6a, 0xc3, 0xef, 0x07, - 0xf5, 0x56, 0x04, 0xd4, 0xdb, 0x7d, 0xfa, 0x04, 0x7d, 0x7f, 0xd7, 0x71, 0xff, 0xfe, 0x6e, 0xe2, - 0x82, 0x72, 0x02, 0x8e, 0x2d, 0x56, 0x96, 0x96, 0xca, 0x6a, 0xb9, 0xda, 0x68, 0x56, 0xcb, 0x8d, - 0x73, 0x35, 0xf5, 0xde, 0x42, 0x07, 0x3d, 0x2c, 0x03, 0xb8, 0x12, 0x2a, 0x69, 0x46, 0x0b, 0x77, - 0xc4, 0x7a, 0xf4, 0xff, 0x25, 0x25, 0xeb, 0x13, 0x02, 0xfa, 0x11, 0x70, 0xbe, 0x4c, 0x12, 0x6f, - 0x95, 0x91, 0xc4, 0x92, 0x81, 0xfa, 0x86, 0x47, 0x83, 0xed, 0x79, 0x19, 0x1c, 0xf5, 0xe8, 0xb1, - 0xec, 0xfd, 0xa7, 0x7d, 0x6f, 0xce, 0xc2, 0x1c, 0x83, 0xc5, 0x9b, 0xc7, 0x3f, 0x37, 0x23, 0x32, - 0x91, 0x47, 0x30, 0xc9, 0xa6, 0xed, 0x5e, 0xf7, 0xee, 0xbf, 0x2b, 0xcb, 0x30, 0xdd, 0xc5, 0xd6, - 0x8e, 0x6e, 0xdb, 0xba, 0x69, 0xd0, 0x05, 0xb9, 0xb9, 0x5b, 0x1f, 0xeb, 0x4b, 0x9c, 0xac, 0x5d, - 0xce, 0xaf, 0x6b, 0x96, 0xa3, 0xb7, 0xf4, 0xae, 0x66, 0x38, 0xeb, 0x41, 0x66, 0x35, 0xfc, 0x27, - 0xfa, 0xd5, 0x84, 0xd3, 0x1a, 0xbe, 0x26, 0x11, 0x2a, 0xf1, 0xfb, 0x09, 0xa6, 0x24, 0xb1, 0x04, - 0x93, 0xa9, 0xc5, 0x87, 0x53, 0x55, 0x8b, 0x3e, 0x78, 0x6f, 0x29, 0x57, 0xc0, 0x89, 0x4a, 0xb5, - 0x54, 0x53, 0xd5, 0x72, 0xa9, 0xd1, 0x5c, 0x2f, 0xab, 0x6b, 0x95, 0x7a, 0xbd, 0x52, 0xab, 0xd6, - 0x0f, 0xd2, 0xda, 0xd1, 0xc7, 0x65, 0x5f, 0x63, 0x16, 0x71, 0xab, 0xa3, 0x1b, 0x18, 0xdd, 0x75, - 0x40, 0x85, 0xe1, 0x57, 0x7d, 0xc4, 0x71, 0x66, 0xe5, 0x47, 0xe0, 0xfc, 0xaa, 0xe4, 0x38, 0xf7, - 0x27, 0xf8, 0x1f, 0xb8, 0xf9, 0x7f, 0x51, 0x86, 0x63, 0xa1, 0x86, 0xa8, 0xe2, 0x9d, 0x91, 0xad, - 0xe4, 0xfd, 0x5c, 0xb8, 0xed, 0x56, 0x78, 0x4c, 0xfb, 0x59, 0xd3, 0xfb, 0xd8, 0x88, 0x80, 0xf5, - 0x0d, 0x3e, 0xac, 0xab, 0x1c, 0xac, 0x4f, 0x1d, 0x82, 0x66, 0x32, 0x64, 0x7f, 0x37, 0x55, 0x64, - 0xaf, 0x80, 0x13, 0xeb, 0x45, 0xb5, 0x51, 0x29, 0x55, 0xd6, 0x8b, 0xee, 0x38, 0x1a, 0x1a, 0xb2, - 0x23, 0xcc, 0x75, 0x1e, 0xf4, 0xbe, 0xf8, 0xbe, 0x2f, 0x0b, 0x57, 0xf5, 0xef, 0x68, 0x4b, 0xdb, - 0x9a, 0xb1, 0x85, 0x91, 0x2e, 0x02, 0xf5, 0x22, 0x4c, 0xb4, 0x48, 0x76, 0x8a, 0x73, 0x78, 0xeb, - 0x26, 0xa6, 0x2f, 0xa7, 0x25, 0xa8, 0xde, 0xaf, 0xe8, 0x6d, 0x61, 0x85, 0x68, 0xf0, 0x0a, 0xf1, - 0xf4, 0x78, 0xf0, 0xf6, 0xf1, 0x1d, 0xa1, 0x1b, 0x9f, 0xf2, 0x75, 0xe3, 0x1c, 0xa7, 0x1b, 0xa5, - 0x83, 0x91, 0x4f, 0xa6, 0x26, 0x7f, 0xfc, 0x68, 0xe8, 0x00, 0x22, 0xb5, 0x49, 0x8f, 0x1e, 0x15, - 0xfa, 0x76, 0xf7, 0xaf, 0x90, 0x21, 0xbf, 0x88, 0x3b, 0x58, 0x74, 0x25, 0xf2, 0x9b, 0x92, 0xe8, - 0x86, 0x08, 0x85, 0x81, 0xd2, 0x8e, 0x5e, 0x1d, 0x71, 0xf4, 0x1d, 0x6c, 0x3b, 0xda, 0x4e, 0x97, - 0x88, 0x5a, 0x56, 0x83, 0x04, 0xf4, 0xf3, 0x92, 0xc8, 0x76, 0x49, 0x4c, 0x31, 0xff, 0x31, 0xd6, - 0x14, 0x3f, 0x23, 0xc1, 0x64, 0x1d, 0x3b, 0x35, 0xab, 0x8d, 0x2d, 0x54, 0x0f, 0x30, 0xba, 0x06, - 0xa6, 0x09, 0x28, 0xee, 0x34, 0xd3, 0xc7, 0x29, 0x9c, 0xa4, 0x5c, 0x0f, 0x73, 0xfe, 0x2b, 0xf9, - 0x9d, 0x75, 0xe3, 0x3d, 0xa9, 0xe8, 0x9f, 0x32, 0xa2, 0xbb, 0xb8, 0x6c, 0xc9, 0x90, 0x71, 0x13, - 0xd1, 0x4a, 0xc5, 0x76, 0x64, 0x63, 0x49, 0xa5, 0xbf, 0xd1, 0xf5, 0x16, 0x09, 0x60, 0xc3, 0xb0, - 0x3d, 0xb9, 0x3e, 0x3e, 0x81, 0x5c, 0xd1, 0xbf, 0x64, 0x92, 0xcd, 0x62, 0x82, 0x72, 0x22, 0x24, - 0xf6, 0x9a, 0x04, 0x6b, 0x0b, 0x91, 0xc4, 0xd2, 0x97, 0xd9, 0x57, 0xe6, 0x20, 0x7f, 0x4e, 0xeb, - 0x74, 0xb0, 0x83, 0xbe, 0x2a, 0x41, 0xbe, 0x64, 0x61, 0xcd, 0xc1, 0x61, 0xd1, 0x21, 0x98, 0xb4, - 0x4c, 0xd3, 0x59, 0xd7, 0x9c, 0x6d, 0x26, 0x37, 0xff, 0x9d, 0x39, 0x0c, 0xfc, 0x4e, 0xb8, 0xfb, - 0xb8, 0x8b, 0x17, 0xdd, 0x8f, 0x72, 0xb5, 0xa5, 0x05, 0xcd, 0xd3, 0x42, 0x22, 0xfa, 0x0f, 0x04, - 0x93, 0x3b, 0x06, 0xde, 0x31, 0x0d, 0xbd, 0xe5, 0xd9, 0x9c, 0xde, 0x3b, 0xfa, 0x80, 0x2f, 0xd3, - 0x05, 0x4e, 0xa6, 0xf3, 0xc2, 0xa5, 0x24, 0x13, 0x68, 0x7d, 0x88, 0xde, 0xe3, 0x6a, 0xb8, 0x92, - 0x76, 0x06, 0xcd, 0x46, 0xad, 0x59, 0x52, 0xcb, 0xc5, 0x46, 0xb9, 0xb9, 0x5a, 0x2b, 0x15, 0x57, - 0x9b, 0x6a, 0x79, 0xbd, 0x56, 0xc0, 0xe8, 0xef, 0x25, 0x57, 0xb8, 0x2d, 0x73, 0x0f, 0x5b, 0x68, - 0x59, 0x48, 0xce, 0x71, 0x32, 0x61, 0x18, 0xfc, 0x9a, 0xb0, 0xd3, 0x06, 0x93, 0x0e, 0xe3, 0x20, - 0x42, 0x79, 0x3f, 0x28, 0xd4, 0xdc, 0x63, 0x49, 0x3d, 0x0a, 0x24, 0xfd, 0xbf, 0x25, 0x98, 0x28, - 0x99, 0xc6, 0x1e, 0xb6, 0x9c, 0xf0, 0x7c, 0x27, 0x2c, 0xcd, 0x0c, 0x2f, 0x4d, 0x77, 0x90, 0xc4, - 0x86, 0x63, 0x99, 0x5d, 0x6f, 0xc2, 0xe3, 0xbd, 0xa2, 0xd7, 0x25, 0x95, 0x30, 0x2b, 0x39, 0x7a, - 0xe1, 0xb3, 0x7f, 0x41, 0x1c, 0x7b, 0x72, 0x4f, 0x03, 0x78, 0x38, 0x09, 0x2e, 0xfd, 0x19, 0x48, - 0xbf, 0x4b, 0xf9, 0x92, 0x0c, 0xb3, 0xb4, 0xf1, 0xd5, 0x31, 0xb1, 0xd0, 0x50, 0x2d, 0xbc, 0xe4, - 0xd8, 0x23, 0xfc, 0x95, 0x23, 0x9c, 0xf8, 0xf3, 0x5a, 0xb7, 0xeb, 0x2f, 0x3f, 0xaf, 0x1c, 0x51, - 0xd9, 0x3b, 0x55, 0xf3, 0x85, 0x3c, 0x64, 0xb5, 0x5d, 0x67, 0x1b, 0x7d, 0x4f, 0x78, 0xf2, 0xc9, - 0x75, 0x06, 0x8c, 0x9f, 0x08, 0x48, 0x8e, 0x43, 0xce, 0x31, 0x2f, 0x60, 0x4f, 0x0e, 0xf4, 0xc5, - 0x85, 0x43, 0xeb, 0x76, 0x1b, 0xe4, 0x03, 0x83, 0xc3, 0x7b, 0x77, 0x6d, 0x1d, 0xad, 0xd5, 0x32, - 0x77, 0x0d, 0xa7, 0xe2, 0x2d, 0x41, 0x07, 0x09, 0xe8, 0xf3, 0x19, 0x91, 0xc9, 0xac, 0x00, 0x83, - 0xc9, 0x20, 0x3b, 0x3f, 0x44, 0x53, 0x9a, 0x87, 0x1b, 0x8b, 0xeb, 0xeb, 0xcd, 0x46, 0xed, 0xde, - 0x72, 0x35, 0x30, 0x3c, 0x9b, 0x95, 0x6a, 0xb3, 0xb1, 0x52, 0x6e, 0x96, 0x36, 0x54, 0xb2, 0x4e, - 0x58, 0x2c, 0x95, 0x6a, 0x1b, 0xd5, 0x46, 0x01, 0xa3, 0x37, 0x4a, 0x30, 0x53, 0xea, 0x98, 0xb6, - 0x8f, 0xf0, 0xd5, 0x01, 0xc2, 0xbe, 0x18, 0x33, 0x21, 0x31, 0xa2, 0x7f, 0xcf, 0x88, 0x3a, 0x1d, - 0x78, 0x02, 0x09, 0x91, 0x8f, 0xe8, 0xa5, 0x5e, 0x27, 0xe4, 0x74, 0x30, 0x98, 0x5e, 0xfa, 0x4d, - 0xe2, 0x33, 0xb7, 0xc3, 0x44, 0x91, 0x2a, 0x06, 0xfa, 0x9b, 0x0c, 0xe4, 0x4b, 0xa6, 0xb1, 0xa9, - 0x6f, 0xb9, 0xc6, 0x1c, 0x36, 0xb4, 0xf3, 0x1d, 0xbc, 0xa8, 0x39, 0xda, 0x9e, 0x8e, 0x2f, 0x92, - 0x0a, 0x4c, 0xaa, 0x3d, 0xa9, 0x2e, 0x53, 0x2c, 0x05, 0x9f, 0xdf, 0xdd, 0x22, 0x4c, 0x4d, 0xaa, - 0xe1, 0x24, 0xe5, 0xa9, 0x70, 0x39, 0x7d, 0x5d, 0xb7, 0xb0, 0x85, 0x3b, 0x58, 0xb3, 0xb1, 0x3b, - 0x2d, 0x32, 0x70, 0x87, 0x28, 0xed, 0xa4, 0x1a, 0xf5, 0x59, 0x39, 0x03, 0x33, 0xf4, 0x13, 0x31, - 0x45, 0x6c, 0xa2, 0xc6, 0x93, 0x2a, 0x97, 0xa6, 0x3c, 0x01, 0x72, 0xf8, 0x01, 0xc7, 0xd2, 0x4e, - 0xb5, 0x09, 0x5e, 0x97, 0xcf, 0x53, 0xaf, 0xc3, 0x79, 0xcf, 0xeb, 0x70, 0xbe, 0x4e, 0x7c, 0x12, - 0x55, 0x9a, 0x0b, 0xbd, 0x74, 0xd2, 0x37, 0x24, 0xbe, 0x2f, 0x05, 0x8a, 0xa1, 0x40, 0xd6, 0xd0, - 0x76, 0x30, 0xd3, 0x0b, 0xf2, 0xac, 0xdc, 0x08, 0x47, 0xb5, 0x3d, 0xcd, 0xd1, 0xac, 0x55, 0xb3, - 0xa5, 0x75, 0xc8, 0xe0, 0xe7, 0xb5, 0xfc, 0xde, 0x0f, 0x64, 0x47, 0xc8, 0x31, 0x2d, 0x4c, 0x72, - 0x79, 0x3b, 0x42, 0x5e, 0x82, 0x4b, 0x5d, 0x6f, 0x99, 0x06, 0xe1, 0x5f, 0x56, 0xc9, 0xb3, 0x2b, - 0x95, 0xb6, 0x6e, 0xbb, 0x15, 0x21, 0x54, 0xaa, 0x74, 0x6b, 0xa3, 0x7e, 0xc9, 0x68, 0x91, 0xdd, - 0xa0, 0x49, 0x35, 0xea, 0xb3, 0xb2, 0x00, 0xd3, 0x6c, 0x23, 0x64, 0xcd, 0xd5, 0xab, 0x3c, 0xd1, - 0xab, 0x6b, 0x78, 0x9f, 0x2e, 0x8a, 0xe7, 0x7c, 0x35, 0xc8, 0xa7, 0x86, 0x7f, 0x52, 0xee, 0x86, - 0x2b, 0xd9, 0x6b, 0x69, 0xd7, 0x76, 0xcc, 0x1d, 0x0a, 0xfa, 0x92, 0xde, 0xa1, 0x35, 0x98, 0x20, - 0x35, 0x88, 0xcb, 0xa2, 0xdc, 0x0a, 0xc7, 0xbb, 0x16, 0xde, 0xc4, 0xd6, 0x7d, 0xda, 0xce, 0xee, - 0x03, 0x0d, 0x4b, 0x33, 0xec, 0xae, 0x69, 0x39, 0xa7, 0x26, 0x09, 0xf3, 0x7d, 0xbf, 0xb1, 0x8e, - 0x72, 0x12, 0xf2, 0x54, 0x7c, 0xe8, 0xf9, 0x39, 0x61, 0x77, 0x4e, 0x56, 0xa1, 0x58, 0xf3, 0xec, - 0x16, 0x98, 0x60, 0x3d, 0x1c, 0x01, 0x6a, 0xfa, 0xd6, 0x93, 0x3d, 0xeb, 0x0a, 0x8c, 0x8a, 0xea, - 0x65, 0x53, 0x9e, 0x04, 0xf9, 0x16, 0xa9, 0x16, 0xc1, 0x6c, 0xfa, 0xd6, 0x2b, 0xfb, 0x17, 0x4a, - 0xb2, 0xa8, 0x2c, 0x2b, 0xfa, 0x4b, 0x59, 0xc8, 0x03, 0x34, 0x8e, 0xe3, 0x64, 0xad, 0xfa, 0xeb, - 0xd2, 0x10, 0xdd, 0xe6, 0x4d, 0x70, 0x03, 0xeb, 0x13, 0x99, 0xfd, 0xb1, 0xd8, 0x5c, 0xd8, 0xf0, - 0x26, 0x83, 0xae, 0x55, 0x52, 0x6f, 0x14, 0x55, 0x77, 0x26, 0xbf, 0xe8, 0x4e, 0x22, 0x6f, 0x84, - 0xeb, 0x07, 0xe4, 0x2e, 0x37, 0x9a, 0xd5, 0xe2, 0x5a, 0xb9, 0xb0, 0xc9, 0xdb, 0x36, 0xf5, 0x46, - 0x6d, 0xbd, 0xa9, 0x6e, 0x54, 0xab, 0x95, 0xea, 0x32, 0x25, 0xe6, 0x9a, 0x84, 0x27, 0x83, 0x0c, - 0xe7, 0xd4, 0x4a, 0xa3, 0xdc, 0x2c, 0xd5, 0xaa, 0x4b, 0x95, 0xe5, 0x82, 0x3e, 0xc8, 0x30, 0xba, - 0x5f, 0xb9, 0x06, 0xae, 0xe2, 0x38, 0xa9, 0xd4, 0xaa, 0xee, 0xcc, 0xb6, 0x54, 0xac, 0x96, 0xca, - 0xee, 0x34, 0xf6, 0x82, 0x82, 0xe0, 0x04, 0x25, 0xd7, 0x5c, 0xaa, 0xac, 0x86, 0x37, 0xa3, 0x3e, - 0x96, 0x51, 0x4e, 0xc1, 0x65, 0xe1, 0x6f, 0x95, 0xea, 0xd9, 0xe2, 0x6a, 0x65, 0xb1, 0xf0, 0x47, - 0x19, 0xe5, 0x3a, 0xb8, 0x9a, 0xfb, 0x8b, 0xee, 0x2b, 0x35, 0x2b, 0x8b, 0xcd, 0xb5, 0x4a, 0x7d, - 0xad, 0xd8, 0x28, 0xad, 0x14, 0x3e, 0x4e, 0xe6, 0x0b, 0xbe, 0x01, 0x1c, 0x72, 0xcb, 0x7c, 0x61, - 0x78, 0x4c, 0x2f, 0xf2, 0x8a, 0xfa, 0xf8, 0xbe, 0xb0, 0xc7, 0xdb, 0xb0, 0x1f, 0xf6, 0x47, 0x87, - 0x45, 0x4e, 0x85, 0x6e, 0x49, 0x40, 0x2b, 0x99, 0x0e, 0x35, 0x86, 0x50, 0xa1, 0x6b, 0xe0, 0xaa, - 0x6a, 0x99, 0x22, 0xa5, 0x96, 0x4b, 0xb5, 0xb3, 0x65, 0xb5, 0x79, 0xae, 0xb8, 0xba, 0x5a, 0x6e, - 0x34, 0x97, 0x2a, 0x6a, 0xbd, 0x51, 0xd8, 0x44, 0xff, 0x22, 0xf9, 0xab, 0x39, 0x21, 0x69, 0xfd, - 0x8d, 0x94, 0xb4, 0x59, 0xc7, 0xae, 0xda, 0xfc, 0x18, 0xe4, 0x6d, 0x47, 0x73, 0x76, 0x6d, 0xd6, - 0xaa, 0x1f, 0xd3, 0xbf, 0x55, 0xcf, 0xd7, 0x49, 0x26, 0x95, 0x65, 0x46, 0x7f, 0x99, 0x49, 0xd2, - 0x4c, 0x47, 0xb0, 0xa0, 0xa3, 0x0f, 0x21, 0xe2, 0xd3, 0x80, 0x3c, 0x6d, 0xaf, 0xd4, 0x9b, 0xc5, - 0x55, 0xb5, 0x5c, 0x5c, 0xbc, 0xcf, 0x5f, 0xc6, 0xc1, 0xca, 0x09, 0x38, 0xb6, 0x51, 0x2d, 0x2e, - 0xac, 0x96, 0x49, 0x73, 0xa9, 0x55, 0xab, 0xe5, 0x92, 0x2b, 0xf7, 0x9f, 0x27, 0x9b, 0x26, 0xae, - 0x05, 0x4d, 0xf8, 0x76, 0xad, 0x9c, 0x90, 0xfc, 0xbf, 0x26, 0xec, 0x5b, 0x14, 0x68, 0x58, 0x98, - 0xd6, 0x68, 0x71, 0xf8, 0xbc, 0x90, 0x3b, 0x91, 0x10, 0x27, 0xc9, 0xf0, 0xf8, 0xcf, 0x43, 0xe0, - 0x71, 0x02, 0x8e, 0x85, 0xf1, 0x20, 0x6e, 0x45, 0xd1, 0x30, 0x7c, 0x79, 0x12, 0xf2, 0x75, 0xdc, - 0xc1, 0x2d, 0x07, 0xbd, 0x39, 0x64, 0x4c, 0xcc, 0x81, 0xe4, 0xbb, 0xb1, 0x48, 0x7a, 0x9b, 0x9b, - 0x3e, 0x4b, 0x3d, 0xd3, 0xe7, 0x18, 0x33, 0x40, 0x4e, 0x64, 0x06, 0x64, 0x53, 0x30, 0x03, 0x72, - 0xc3, 0x9b, 0x01, 0xf9, 0x41, 0x66, 0x00, 0x7a, 0x4d, 0x3e, 0x69, 0x2f, 0x41, 0x45, 0x7d, 0xb8, - 0x83, 0xff, 0xff, 0xca, 0x26, 0xe9, 0x55, 0xfa, 0x72, 0x9c, 0x4c, 0x8b, 0xbf, 0x27, 0xa7, 0xb0, - 0xfc, 0xa0, 0x5c, 0x0b, 0x57, 0x07, 0xef, 0xcd, 0xf2, 0x33, 0x2a, 0xf5, 0x46, 0x9d, 0x8c, 0xf8, - 0xa5, 0x9a, 0xaa, 0x6e, 0xac, 0xd3, 0x35, 0xe4, 0x93, 0xa0, 0x04, 0x54, 0xd4, 0x8d, 0x2a, 0x1d, - 0xdf, 0xb7, 0x78, 0xea, 0x4b, 0x95, 0xea, 0x62, 0xd3, 0x6f, 0x33, 0xd5, 0xa5, 0x5a, 0x61, 0xdb, - 0x9d, 0xb2, 0x85, 0xa8, 0xbb, 0x03, 0x34, 0x2b, 0xa1, 0x58, 0x5d, 0x6c, 0xae, 0x55, 0xcb, 0x6b, - 0xb5, 0x6a, 0xa5, 0x44, 0xd2, 0xeb, 0xe5, 0x46, 0x41, 0x77, 0x07, 0x9a, 0x1e, 0x8b, 0xa2, 0x5e, - 0x2e, 0xaa, 0xa5, 0x95, 0xb2, 0x4a, 0x8b, 0xbc, 0x5f, 0xb9, 0x1e, 0xce, 0x14, 0xab, 0xb5, 0x86, - 0x9b, 0x52, 0xac, 0xde, 0xd7, 0xb8, 0x6f, 0xbd, 0xdc, 0x5c, 0x57, 0x6b, 0xa5, 0x72, 0xbd, 0xee, - 0xb6, 0x53, 0x66, 0x7f, 0x14, 0x3a, 0xca, 0xd3, 0xe1, 0xf6, 0x10, 0x6b, 0xe5, 0x06, 0xd9, 0xb0, - 0x5c, 0xab, 0x11, 0x9f, 0x95, 0xc5, 0x72, 0x73, 0xa5, 0x58, 0x6f, 0x56, 0xaa, 0xa5, 0xda, 0xda, - 0x7a, 0xb1, 0x51, 0x71, 0x9b, 0xf3, 0xba, 0x5a, 0x6b, 0xd4, 0x9a, 0x67, 0xcb, 0x6a, 0xbd, 0x52, - 0xab, 0x16, 0x0c, 0xb7, 0xca, 0xa1, 0xf6, 0xef, 0xf5, 0xc3, 0xa6, 0x72, 0x15, 0x9c, 0xf2, 0xd2, - 0x57, 0x6b, 0xae, 0xa0, 0x43, 0x16, 0x49, 0x37, 0x55, 0x8b, 0xe4, 0xdf, 0x24, 0xc8, 0xd6, 0x1d, - 0xb3, 0x8b, 0x7e, 0x34, 0xe8, 0x60, 0x4e, 0x03, 0x58, 0x64, 0xff, 0xd1, 0x9d, 0x85, 0xb1, 0x79, - 0x59, 0x28, 0x05, 0x7d, 0x44, 0x78, 0xd3, 0x24, 0xe8, 0xb3, 0xcd, 0x6e, 0x84, 0xad, 0xf2, 0x1d, - 0xb1, 0x53, 0x24, 0xd1, 0x84, 0x92, 0xe9, 0xfb, 0x2f, 0x0d, 0xb3, 0x2d, 0x82, 0xe0, 0x64, 0x08, - 0x36, 0x57, 0xfe, 0x9e, 0x4a, 0x60, 0xe5, 0x72, 0xb8, 0xac, 0x47, 0xb9, 0x88, 0x4e, 0x6d, 0x2a, - 0x3f, 0x02, 0x8f, 0x09, 0xa9, 0x77, 0x79, 0xad, 0x76, 0xb6, 0xec, 0x2b, 0xf2, 0x62, 0xb1, 0x51, - 0x2c, 0x6c, 0xa1, 0xcf, 0xc8, 0x90, 0x5d, 0x33, 0xf7, 0x7a, 0xf7, 0xaa, 0x0c, 0x7c, 0x31, 0xb4, - 0x16, 0xea, 0xbd, 0xf2, 0x5e, 0xf3, 0x42, 0x62, 0x5f, 0x8b, 0xde, 0x97, 0xfe, 0xbc, 0x94, 0x44, - 0xec, 0x6b, 0x07, 0xdd, 0x8c, 0xfe, 0x87, 0x61, 0xc4, 0x1e, 0x21, 0x5a, 0xac, 0x9c, 0x81, 0xd3, - 0xc1, 0x87, 0xca, 0x62, 0xb9, 0xda, 0xa8, 0x2c, 0xdd, 0x17, 0x08, 0xb7, 0xa2, 0x0a, 0x89, 0x7f, - 0x50, 0x37, 0x16, 0x3f, 0xd3, 0x38, 0x05, 0xc7, 0x83, 0x6f, 0xcb, 0xe5, 0x86, 0xf7, 0xe5, 0x7e, - 0xf4, 0x60, 0x0e, 0x66, 0x68, 0xb7, 0xbe, 0xd1, 0x6d, 0x6b, 0x0e, 0x46, 0x4f, 0x0a, 0xd0, 0xbd, - 0x01, 0x8e, 0x56, 0xd6, 0x97, 0xea, 0x75, 0xc7, 0xb4, 0xb4, 0x2d, 0x5c, 0x6c, 0xb7, 0x2d, 0x26, - 0xad, 0xde, 0x64, 0xf4, 0x0e, 0xe1, 0x75, 0x3e, 0x7e, 0x28, 0xa1, 0x65, 0x46, 0xa0, 0xfe, 0x25, - 0xa1, 0x75, 0x39, 0x01, 0x82, 0xc9, 0xd0, 0xbf, 0x7f, 0xc4, 0x6d, 0x2e, 0x1a, 0x97, 0xcd, 0x33, - 0xcf, 0x91, 0x60, 0xaa, 0xa1, 0xef, 0xe0, 0x67, 0x9a, 0x06, 0xb6, 0x95, 0x09, 0x90, 0x97, 0xd7, - 0x1a, 0x85, 0x23, 0xee, 0x83, 0x6b, 0x54, 0x65, 0xc8, 0x43, 0xd9, 0x2d, 0xc0, 0x7d, 0x28, 0x36, - 0x0a, 0xb2, 0xfb, 0xb0, 0x56, 0x6e, 0x14, 0xb2, 0xee, 0x43, 0xb5, 0xdc, 0x28, 0xe4, 0xdc, 0x87, - 0xf5, 0xd5, 0x46, 0x21, 0xef, 0x3e, 0x54, 0xea, 0x8d, 0xc2, 0x84, 0xfb, 0xb0, 0x50, 0x6f, 0x14, - 0x26, 0xdd, 0x87, 0xb3, 0xf5, 0x46, 0x61, 0xca, 0x7d, 0x28, 0x35, 0x1a, 0x05, 0x70, 0x1f, 0xee, - 0xa9, 0x37, 0x0a, 0xd3, 0xee, 0x43, 0xb1, 0xd4, 0x28, 0xcc, 0x90, 0x87, 0x72, 0xa3, 0x30, 0xeb, - 0x3e, 0xd4, 0xeb, 0x8d, 0xc2, 0x1c, 0xa1, 0x5c, 0x6f, 0x14, 0x8e, 0x92, 0xb2, 0x2a, 0x8d, 0x42, - 0xc1, 0x7d, 0x58, 0xa9, 0x37, 0x0a, 0xc7, 0x48, 0xe6, 0x7a, 0xa3, 0xa0, 0x90, 0x42, 0xeb, 0x8d, - 0xc2, 0x65, 0x24, 0x4f, 0xbd, 0x51, 0x38, 0x4e, 0x8a, 0xa8, 0x37, 0x0a, 0x27, 0x08, 0x1b, 0xe5, - 0x46, 0xe1, 0x24, 0xc9, 0xa3, 0x36, 0x0a, 0x97, 0x93, 0x4f, 0xd5, 0x46, 0xe1, 0x14, 0x61, 0xac, - 0xdc, 0x28, 0x5c, 0x41, 0x1e, 0xd4, 0x46, 0x01, 0x91, 0x4f, 0xc5, 0x46, 0xe1, 0x4a, 0xf4, 0x18, - 0x98, 0x5a, 0xc6, 0x0e, 0x05, 0x11, 0x15, 0x40, 0x5e, 0xc6, 0x4e, 0xd8, 0x8c, 0xff, 0x8a, 0x0c, - 0x97, 0xb3, 0xa9, 0xdf, 0x92, 0x65, 0xee, 0xac, 0xe2, 0x2d, 0xad, 0x75, 0xa9, 0xfc, 0x80, 0x6b, - 0x42, 0x85, 0xf7, 0x65, 0x15, 0xc8, 0x76, 0x83, 0xce, 0x88, 0x3c, 0xc7, 0x5a, 0x9c, 0xde, 0x62, - 0x94, 0x1c, 0x2c, 0x46, 0x31, 0x8b, 0xec, 0x9f, 0xc3, 0x1a, 0xcd, 0xad, 0x1f, 0x67, 0x7a, 0xd6, - 0x8f, 0xdd, 0x66, 0xd2, 0xc5, 0x96, 0x6d, 0x1a, 0x5a, 0xa7, 0xce, 0x36, 0xee, 0xe9, 0xaa, 0x57, - 0x6f, 0xb2, 0xf2, 0x13, 0x5e, 0xcb, 0xa0, 0x56, 0xd9, 0xd3, 0xe2, 0x66, 0xb8, 0xbd, 0xd5, 0x8c, - 0x68, 0x24, 0x1f, 0xf7, 0x1b, 0x49, 0x83, 0x6b, 0x24, 0x77, 0x1f, 0x80, 0x76, 0xb2, 0xf6, 0x52, - 0x19, 0x6e, 0x6a, 0x11, 0xb8, 0xb5, 0x7a, 0xcb, 0xd5, 0x32, 0xfa, 0x8c, 0x04, 0x27, 0xcb, 0x46, - 0x3f, 0x0b, 0x3f, 0xac, 0x0b, 0x6f, 0x0c, 0x43, 0xb3, 0xce, 0x8b, 0xf4, 0xf6, 0xbe, 0xd5, 0xee, - 0x4f, 0x33, 0x42, 0xa2, 0x9f, 0xf4, 0x25, 0x5a, 0xe7, 0x24, 0x7a, 0xd7, 0xf0, 0xa4, 0x93, 0x09, - 0xb4, 0x3a, 0xd2, 0x0e, 0x28, 0x8b, 0xbe, 0x9e, 0x85, 0xc7, 0x50, 0xdf, 0x1b, 0xc6, 0x21, 0x6d, - 0x65, 0x45, 0xa3, 0xad, 0x62, 0xdb, 0xd1, 0x2c, 0x87, 0x3b, 0x0f, 0xdd, 0x33, 0x95, 0xca, 0xa4, - 0x30, 0x95, 0x92, 0x06, 0x4e, 0xa5, 0xd0, 0xdb, 0xc3, 0xe6, 0xc3, 0x39, 0x1e, 0xe3, 0x62, 0xff, - 0xfe, 0x3f, 0xae, 0x86, 0x51, 0x50, 0xfb, 0x76, 0xc5, 0x4f, 0x72, 0x50, 0x2f, 0x1d, 0xb8, 0x84, - 0x64, 0x88, 0x7f, 0x64, 0xb4, 0x76, 0x5e, 0x36, 0xfc, 0x8d, 0x37, 0x4a, 0x0a, 0xed, 0x54, 0x0d, - 0xf4, 0x4f, 0x4d, 0xc0, 0x14, 0x69, 0x0b, 0xab, 0xba, 0x71, 0x01, 0x3d, 0x2c, 0xc3, 0x4c, 0x15, - 0x5f, 0x2c, 0x6d, 0x6b, 0x9d, 0x0e, 0x36, 0xb6, 0x70, 0xd8, 0x6c, 0x3f, 0x05, 0x13, 0x5a, 0xb7, - 0x5b, 0x0d, 0xf6, 0x19, 0xbc, 0x57, 0xd6, 0xff, 0x7e, 0xad, 0x6f, 0x23, 0xcf, 0xc4, 0x34, 0x72, - 0xbf, 0xdc, 0xf9, 0x70, 0x99, 0x11, 0x33, 0xe4, 0x6b, 0x60, 0xba, 0xe5, 0x65, 0xf1, 0xcf, 0x4d, - 0x84, 0x93, 0xd0, 0xdf, 0x25, 0xea, 0x06, 0x84, 0x0a, 0x4f, 0xa6, 0x14, 0x78, 0xc4, 0x76, 0xc8, - 0x09, 0x38, 0xd6, 0xa8, 0xd5, 0x9a, 0x6b, 0xc5, 0xea, 0x7d, 0xc1, 0x79, 0xe5, 0x4d, 0xf4, 0xb2, - 0x2c, 0xcc, 0xd5, 0xcd, 0xce, 0x1e, 0x0e, 0x60, 0xaa, 0x70, 0x0e, 0x39, 0x61, 0x39, 0x65, 0xf6, - 0xc9, 0x49, 0x39, 0x09, 0x79, 0xcd, 0xb0, 0x2f, 0x62, 0xcf, 0x36, 0x64, 0x6f, 0x0c, 0xc6, 0xf7, - 0x85, 0xdb, 0xb1, 0xca, 0xc3, 0x78, 0xc7, 0x00, 0x49, 0xf2, 0x5c, 0x45, 0x00, 0x79, 0x06, 0x66, - 0x6c, 0xba, 0x59, 0xd8, 0x08, 0xed, 0x09, 0x73, 0x69, 0x84, 0x45, 0xba, 0x5b, 0x2d, 0x33, 0x16, - 0xc9, 0x1b, 0x7a, 0xd8, 0x6f, 0xfe, 0x1b, 0x1c, 0xc4, 0xc5, 0x83, 0x30, 0x96, 0x0c, 0xe4, 0x57, - 0x8c, 0x7a, 0x86, 0x77, 0x0a, 0x8e, 0xb3, 0x56, 0xdb, 0x2c, 0xad, 0x14, 0x57, 0x57, 0xcb, 0xd5, - 0xe5, 0x72, 0xb3, 0xb2, 0x48, 0xb7, 0x2a, 0x82, 0x94, 0x62, 0xa3, 0x51, 0x5e, 0x5b, 0x6f, 0xd4, - 0x9b, 0xe5, 0x67, 0x94, 0xca, 0xe5, 0x45, 0xe2, 0x12, 0x47, 0xce, 0xb4, 0x78, 0xce, 0x8b, 0xc5, - 0x6a, 0xfd, 0x5c, 0x59, 0x2d, 0x6c, 0x9f, 0x29, 0xc2, 0x74, 0xa8, 0x9f, 0x77, 0xb9, 0x5b, 0xc4, - 0x9b, 0xda, 0x6e, 0x87, 0xd9, 0x6a, 0x85, 0x23, 0x2e, 0x77, 0x44, 0x36, 0x35, 0xa3, 0x73, 0xa9, - 0x90, 0x51, 0x0a, 0x30, 0x13, 0xee, 0xd2, 0x0b, 0x12, 0x7a, 0xcb, 0x55, 0x30, 0x75, 0xce, 0xb4, - 0x2e, 0x10, 0x3f, 0x2e, 0xf4, 0x6e, 0x1a, 0xd7, 0xc4, 0x3b, 0x21, 0x1a, 0x1a, 0xd8, 0x5f, 0x21, - 0xee, 0x2d, 0xe0, 0x51, 0x9b, 0x1f, 0x78, 0x0a, 0xf4, 0x1a, 0x98, 0xbe, 0xe8, 0xe5, 0x0e, 0x5a, - 0x7a, 0x28, 0x09, 0xfd, 0x77, 0xb1, 0xfd, 0xff, 0xc1, 0x45, 0xa6, 0xbf, 0x3f, 0xfd, 0x66, 0x09, - 0xf2, 0xcb, 0xd8, 0x29, 0x76, 0x3a, 0x61, 0xb9, 0xbd, 0x48, 0xf8, 0x64, 0x0f, 0x57, 0x89, 0x62, - 0xa7, 0x13, 0xdd, 0xa8, 0x42, 0x02, 0xf2, 0x3c, 0xd0, 0xb9, 0x34, 0x41, 0xbf, 0xb9, 0x01, 0x05, - 0xa6, 0x2f, 0xb1, 0x0f, 0xc8, 0xfe, 0x1e, 0xf7, 0x23, 0x21, 0x2b, 0xe7, 0x89, 0x41, 0x4c, 0x9b, - 0x4c, 0xfc, 0x5e, 0xb9, 0x97, 0x4f, 0xb9, 0x17, 0x26, 0x76, 0x6d, 0x5c, 0xd2, 0x6c, 0x4c, 0x78, - 0xeb, 0xad, 0x69, 0xed, 0xfc, 0xfd, 0xb8, 0xe5, 0xcc, 0x57, 0x76, 0x5c, 0x83, 0x7a, 0x83, 0x66, - 0xf4, 0xc3, 0xc4, 0xb0, 0x77, 0xd5, 0xa3, 0xe0, 0x4e, 0x4a, 0x2e, 0xea, 0xce, 0x76, 0x69, 0x5b, - 0x73, 0xd8, 0xda, 0xb6, 0xff, 0x8e, 0x9e, 0x3f, 0x04, 0x9c, 0xb1, 0x7b, 0xc1, 0x91, 0x07, 0x04, - 0x13, 0x83, 0x38, 0x82, 0x0d, 0xdc, 0x61, 0x40, 0xfc, 0x47, 0x09, 0xb2, 0xb5, 0x2e, 0x36, 0x84, - 0x4f, 0xc3, 0xf8, 0xb2, 0x95, 0x7a, 0x64, 0xfb, 0xb0, 0xb8, 0x77, 0x98, 0x5f, 0x69, 0xb7, 0xe4, - 0x08, 0xc9, 0xde, 0x0c, 0x59, 0xdd, 0xd8, 0x34, 0x99, 0x61, 0x7a, 0x65, 0xc4, 0x26, 0x50, 0xc5, - 0xd8, 0x34, 0x55, 0x92, 0x51, 0xd4, 0x31, 0x2c, 0xae, 0xec, 0xf4, 0xc5, 0xfd, 0x8d, 0x49, 0xc8, - 0x53, 0x75, 0x46, 0x2f, 0x94, 0x41, 0x2e, 0xb6, 0xdb, 0x11, 0x82, 0x97, 0xf6, 0x09, 0xde, 0x24, - 0xbf, 0xf9, 0x98, 0xf8, 0xef, 0x7c, 0x30, 0x13, 0xc1, 0xbe, 0x9d, 0x35, 0xa9, 0x62, 0xbb, 0x1d, - 0xed, 0x83, 0xea, 0x17, 0x28, 0xf1, 0x05, 0x86, 0x5b, 0xb8, 0x2c, 0xd6, 0xc2, 0x13, 0x0f, 0x04, - 0x91, 0xfc, 0xa5, 0x0f, 0xd1, 0x3f, 0x4b, 0x30, 0xb1, 0xaa, 0xdb, 0x8e, 0x8b, 0x4d, 0x51, 0x04, - 0x9b, 0xab, 0x60, 0xca, 0x13, 0x8d, 0xdb, 0xe5, 0xb9, 0xfd, 0x79, 0x90, 0x80, 0x5e, 0x1d, 0x46, - 0xe7, 0x1e, 0x1e, 0x9d, 0x27, 0xc7, 0xd7, 0x9e, 0x71, 0x11, 0x7d, 0xca, 0x20, 0x28, 0x56, 0xea, - 0x2d, 0xf6, 0x77, 0x7c, 0x81, 0xaf, 0x71, 0x02, 0xbf, 0x6d, 0x98, 0x22, 0xd3, 0x17, 0xfa, 0x67, - 0x25, 0x00, 0xb7, 0x6c, 0x76, 0x94, 0xeb, 0x71, 0xdc, 0x01, 0xed, 0x18, 0xe9, 0xbe, 0x2c, 0x2c, - 0xdd, 0x35, 0x5e, 0xba, 0x3f, 0x3e, 0xb8, 0xaa, 0x71, 0x47, 0xb6, 0x94, 0x02, 0xc8, 0xba, 0x2f, - 0x5a, 0xf7, 0x11, 0xbd, 0xd9, 0x17, 0xea, 0x3a, 0x27, 0xd4, 0x3b, 0x86, 0x2c, 0x29, 0x7d, 0xb9, - 0xfe, 0x95, 0x04, 0x13, 0x75, 0xec, 0xb8, 0xdd, 0x24, 0x3a, 0x2b, 0xd2, 0xc3, 0x87, 0xda, 0xb6, - 0x24, 0xd8, 0xb6, 0xbf, 0x9d, 0x11, 0x0d, 0xf4, 0x12, 0x48, 0x86, 0xf1, 0x14, 0xb1, 0x78, 0xf0, - 0x88, 0x50, 0xa0, 0x97, 0x41, 0xd4, 0xd2, 0x97, 0xee, 0x1b, 0x25, 0x7f, 0x63, 0x9e, 0x3f, 0x69, - 0x11, 0x36, 0x8b, 0x33, 0xfb, 0xcd, 0x62, 0xf1, 0x93, 0x16, 0xe1, 0x3a, 0x46, 0xef, 0x4a, 0x27, - 0x36, 0x36, 0x46, 0xb0, 0x61, 0x3c, 0x8c, 0xbc, 0x9e, 0x2d, 0x43, 0x9e, 0xad, 0x2c, 0xdf, 0x15, - 0xbf, 0xb2, 0x3c, 0x78, 0x6a, 0xf1, 0xae, 0x21, 0x4c, 0xb9, 0xb8, 0xe5, 0x5e, 0x9f, 0x0d, 0x29, - 0xc4, 0xc6, 0x4d, 0x90, 0x23, 0x91, 0x28, 0xd9, 0x38, 0x17, 0xec, 0xf5, 0x7b, 0x24, 0xca, 0xee, - 0x57, 0x95, 0x66, 0x4a, 0x8c, 0xc2, 0x08, 0x56, 0x88, 0x87, 0x41, 0xe1, 0x1d, 0x0a, 0xc0, 0xfa, - 0xee, 0xf9, 0x8e, 0x6e, 0x6f, 0xeb, 0xc6, 0x16, 0xfa, 0x7e, 0x06, 0x66, 0xd8, 0x2b, 0x0d, 0xa8, - 0x18, 0x6b, 0xfe, 0x45, 0x1a, 0x05, 0x05, 0x90, 0x77, 0x2d, 0x9d, 0x2d, 0x03, 0xb8, 0x8f, 0xca, - 0x9d, 0xbe, 0x23, 0x4f, 0xb6, 0xe7, 0x28, 0xbd, 0x2b, 0x86, 0x80, 0x83, 0xf9, 0x50, 0xe9, 0x81, - 0x43, 0x4f, 0x38, 0x6a, 0x66, 0x8e, 0x8f, 0x9a, 0xc9, 0x9d, 0xaf, 0xcb, 0xf7, 0x9c, 0xaf, 0x73, - 0x71, 0xb4, 0xf5, 0x67, 0x62, 0xe2, 0x5c, 0x2a, 0xab, 0xe4, 0xd9, 0xfd, 0xe3, 0x7e, 0x53, 0x37, - 0xc8, 0x66, 0x01, 0x73, 0x1d, 0x0d, 0x12, 0xd0, 0xfb, 0x83, 0x89, 0x8c, 0x29, 0x68, 0x05, 0x27, - 0x10, 0x03, 0x57, 0x76, 0xb6, 0xb7, 0xec, 0x0f, 0x09, 0x47, 0xc9, 0x0a, 0x09, 0x2c, 0x76, 0x4a, - 0xc2, 0x38, 0x90, 0x7c, 0x0e, 0x42, 0xbb, 0x7d, 0x71, 0xdd, 0xe9, 0x20, 0xfa, 0xc9, 0x14, 0x73, - 0x67, 0x88, 0xc5, 0x17, 0x05, 0xe6, 0xbc, 0x53, 0x87, 0xb5, 0x85, 0x7b, 0xca, 0xa5, 0x46, 0x01, - 0xef, 0x3f, 0x89, 0x48, 0xce, 0x1c, 0xd2, 0xf3, 0x85, 0xc1, 0x02, 0x0b, 0xfa, 0x9f, 0x12, 0xe4, - 0x99, 0xed, 0x70, 0xd7, 0x01, 0x21, 0x44, 0x2f, 0x1f, 0x06, 0x92, 0xd8, 0xc3, 0xdf, 0x9f, 0x48, - 0x0a, 0xc0, 0x08, 0xac, 0x85, 0xfb, 0x52, 0x03, 0x00, 0xfd, 0xab, 0x04, 0x59, 0xd7, 0xa6, 0x11, - 0x3b, 0x5a, 0xfb, 0x71, 0x61, 0xa7, 0xd6, 0x90, 0x00, 0x5c, 0xf2, 0x11, 0xfa, 0xbd, 0x00, 0x53, - 0x5d, 0x9a, 0xd1, 0x3f, 0xd8, 0x7d, 0x9d, 0x40, 0xcf, 0x82, 0xd5, 0xe0, 0x37, 0xf4, 0x4e, 0x21, - 0xc7, 0xd8, 0x78, 0x7e, 0x92, 0xc1, 0x51, 0x1e, 0xc5, 0x29, 0xdc, 0x4d, 0xf4, 0x5d, 0x09, 0x40, - 0xc5, 0xb6, 0xd9, 0xd9, 0xc3, 0x1b, 0x96, 0x8e, 0xae, 0x0c, 0x00, 0x60, 0xcd, 0x3e, 0x13, 0x34, - 0xfb, 0x4f, 0x85, 0x05, 0xbf, 0xcc, 0x0b, 0xfe, 0x89, 0xd1, 0x9a, 0xe7, 0x11, 0x8f, 0x10, 0xff, - 0xd3, 0x61, 0x82, 0xc9, 0x91, 0x19, 0x88, 0x62, 0xc2, 0xf7, 0x7e, 0x42, 0xef, 0xf1, 0x45, 0x7f, - 0x0f, 0x27, 0xfa, 0xa7, 0x24, 0xe6, 0x28, 0x19, 0x00, 0xa5, 0x21, 0x00, 0x38, 0x0a, 0xd3, 0x1e, - 0x00, 0x1b, 0x6a, 0xa5, 0x80, 0xd1, 0xdb, 0x64, 0xb2, 0x97, 0x4e, 0x47, 0xaa, 0x83, 0xf7, 0x34, - 0x5f, 0x15, 0x9e, 0xb9, 0x87, 0xe4, 0xe1, 0x97, 0x9f, 0x12, 0x40, 0x7f, 0x2a, 0x34, 0x55, 0x17, - 0x60, 0xe8, 0xd1, 0xd2, 0x5f, 0x9d, 0x29, 0xc3, 0x2c, 0x67, 0x62, 0x28, 0xa7, 0xe0, 0x38, 0x97, - 0x40, 0xc7, 0xbb, 0x76, 0xe1, 0x88, 0x82, 0xe0, 0x24, 0xf7, 0x85, 0xbd, 0xe0, 0x76, 0x21, 0x83, - 0xfe, 0xfc, 0x33, 0x19, 0x7f, 0xf1, 0xe6, 0x5d, 0x59, 0xb6, 0x6c, 0xf6, 0x51, 0x3e, 0x96, 0x58, - 0xcb, 0x34, 0x1c, 0xfc, 0x40, 0xc8, 0x97, 0xc1, 0x4f, 0x88, 0xb5, 0x1a, 0x4e, 0xc1, 0x84, 0x63, - 0x85, 0xfd, 0x1b, 0xbc, 0xd7, 0xb0, 0x62, 0xe5, 0x78, 0xc5, 0xaa, 0xc2, 0x19, 0xdd, 0x68, 0x75, - 0x76, 0xdb, 0x58, 0xc5, 0x1d, 0xcd, 0x95, 0xa1, 0x5d, 0xb4, 0x17, 0x71, 0x17, 0x1b, 0x6d, 0x6c, - 0x38, 0x94, 0x4f, 0xef, 0x2c, 0x93, 0x40, 0x4e, 0x5e, 0x19, 0xef, 0xe4, 0x95, 0xf1, 0x71, 0xfd, - 0xd6, 0x63, 0x63, 0x16, 0xef, 0x6e, 0x03, 0xa0, 0x75, 0x3b, 0xab, 0xe3, 0x8b, 0x4c, 0x0d, 0xaf, - 0xe8, 0x59, 0xc2, 0xab, 0xf9, 0x19, 0xd4, 0x50, 0x66, 0xf4, 0x45, 0x5f, 0xfd, 0xee, 0xe6, 0xd4, - 0xef, 0x26, 0x41, 0x16, 0x92, 0x69, 0x5d, 0x77, 0x08, 0xad, 0x9b, 0x85, 0xa9, 0x60, 0x67, 0x57, - 0x56, 0xae, 0x80, 0x13, 0x9e, 0xaf, 0x68, 0xb5, 0x5c, 0x5e, 0xac, 0x37, 0x37, 0xd6, 0x97, 0xd5, - 0xe2, 0x62, 0xb9, 0x00, 0xae, 0x7e, 0x52, 0xbd, 0xf4, 0x5d, 0x3c, 0xb3, 0xe8, 0x2f, 0x24, 0xc8, - 0x91, 0x83, 0x78, 0xe8, 0xa7, 0x47, 0xa4, 0x39, 0x36, 0xe7, 0x19, 0xe3, 0x8f, 0xbb, 0xe2, 0x31, - 0xbe, 0x99, 0x30, 0x09, 0x57, 0x07, 0x8a, 0xf1, 0x1d, 0x43, 0x28, 0xfd, 0x69, 0x8d, 0xdb, 0x24, - 0xeb, 0xdb, 0xe6, 0xc5, 0x1f, 0xe6, 0x26, 0xe9, 0xd6, 0xff, 0x90, 0x9b, 0x64, 0x1f, 0x16, 0xc6, - 0xde, 0x24, 0xfb, 0xb4, 0xbb, 0x98, 0x66, 0x8a, 0x9e, 0x95, 0xf3, 0xe7, 0x7f, 0xcf, 0x91, 0x0e, - 0xb4, 0x91, 0x55, 0x84, 0x59, 0xdd, 0x70, 0xb0, 0x65, 0x68, 0x9d, 0xa5, 0x8e, 0xb6, 0xe5, 0xd9, - 0xa7, 0xbd, 0xbb, 0x17, 0x95, 0x50, 0x1e, 0x95, 0xff, 0x43, 0x39, 0x0d, 0xe0, 0xe0, 0x9d, 0x6e, - 0x47, 0x73, 0x02, 0xd5, 0x0b, 0xa5, 0x84, 0xb5, 0x2f, 0xcb, 0x6b, 0xdf, 0x2d, 0x70, 0x19, 0x05, - 0xad, 0x71, 0xa9, 0x8b, 0x37, 0x0c, 0xfd, 0x67, 0x76, 0x49, 0xe8, 0x49, 0xaa, 0xa3, 0xfd, 0x3e, - 0x71, 0xdb, 0x39, 0xf9, 0x9e, 0xed, 0x9c, 0x7f, 0x14, 0x0e, 0x69, 0xe1, 0xb5, 0xfa, 0x01, 0x21, - 0x2d, 0xfc, 0x96, 0x26, 0xf7, 0xb4, 0x34, 0x7f, 0x91, 0x25, 0x2b, 0xb0, 0xc8, 0x12, 0x46, 0x25, - 0x27, 0xb8, 0x40, 0xf9, 0x2a, 0xa1, 0x98, 0x19, 0x71, 0xd5, 0x18, 0xc3, 0x02, 0xb8, 0x0c, 0x73, - 0xb4, 0xe8, 0x05, 0xd3, 0xbc, 0xb0, 0xa3, 0x59, 0x17, 0x90, 0x75, 0x20, 0x55, 0x8c, 0xdd, 0x4b, - 0x8a, 0xdc, 0x20, 0xfd, 0xa4, 0xf0, 0x9c, 0x81, 0x13, 0x97, 0xc7, 0xf3, 0x78, 0x36, 0x93, 0x5e, - 0x2f, 0x34, 0x85, 0x10, 0x61, 0x30, 0x7d, 0x5c, 0xff, 0xd8, 0xc7, 0xd5, 0xeb, 0xe8, 0xc3, 0xeb, - 0xf0, 0xa3, 0xc4, 0x15, 0x7d, 0x69, 0x38, 0xec, 0x3c, 0xbe, 0x86, 0xc0, 0xae, 0x00, 0xf2, 0x05, - 0xdf, 0xf5, 0xc7, 0x7d, 0x0c, 0x57, 0x28, 0x9b, 0x1e, 0x9a, 0x11, 0x2c, 0x8f, 0x05, 0xcd, 0xe3, - 0x3c, 0x0b, 0xb5, 0x6e, 0xaa, 0x98, 0x7e, 0x41, 0x78, 0x7f, 0xab, 0xaf, 0x80, 0x28, 0x77, 0xe3, - 0x69, 0x95, 0x62, 0x9b, 0x63, 0xe2, 0x6c, 0xa6, 0x8f, 0xe6, 0x43, 0x39, 0x98, 0xf2, 0x82, 0x8e, - 0x90, 0x3b, 0x71, 0x7c, 0x0c, 0x4f, 0x42, 0xde, 0x36, 0x77, 0xad, 0x16, 0x66, 0x3b, 0x8e, 0xec, - 0x6d, 0x88, 0xdd, 0xb1, 0x81, 0xe3, 0xf9, 0x3e, 0x93, 0x21, 0x9b, 0xd8, 0x64, 0x88, 0x36, 0x48, - 0xe3, 0x06, 0xf8, 0xe7, 0x0b, 0x07, 0x32, 0xe7, 0x30, 0xab, 0x63, 0xe7, 0xd1, 0x38, 0xc6, 0xff, - 0xa1, 0xd0, 0xde, 0xcb, 0x80, 0x9a, 0x24, 0x53, 0xb9, 0xda, 0x10, 0x86, 0xea, 0x95, 0x70, 0xb9, - 0x97, 0x83, 0x59, 0xa8, 0xc4, 0x22, 0xdd, 0x50, 0x57, 0x0b, 0x32, 0x7a, 0x76, 0x16, 0x0a, 0x94, - 0xb5, 0x9a, 0x6f, 0xac, 0xa1, 0x17, 0x65, 0x0e, 0xdb, 0x22, 0x8d, 0x9e, 0x62, 0x7e, 0x5a, 0x12, - 0x0d, 0x96, 0xca, 0x09, 0x3e, 0xa8, 0x5d, 0x84, 0x26, 0x0d, 0xd1, 0xcc, 0x62, 0x94, 0x0f, 0xfd, - 0x76, 0x46, 0x24, 0xf6, 0xaa, 0x18, 0x8b, 0xe9, 0xf7, 0x4a, 0x9f, 0xcb, 0x7a, 0xb1, 0xa3, 0x96, - 0x2c, 0x73, 0x67, 0xc3, 0xea, 0xa0, 0xff, 0x53, 0x28, 0xb4, 0x75, 0x84, 0xf9, 0x2f, 0x45, 0x9b, - 0xff, 0x64, 0xc9, 0xb8, 0x13, 0xec, 0x55, 0x75, 0x86, 0x18, 0xbe, 0x95, 0xeb, 0x61, 0x4e, 0x6b, - 0xb7, 0xd7, 0xb5, 0x2d, 0x5c, 0x72, 0xe7, 0xd5, 0x86, 0xc3, 0xe2, 0xca, 0xf4, 0xa4, 0xc6, 0x76, - 0x45, 0xe2, 0xeb, 0xa0, 0x1c, 0x48, 0x4c, 0x3e, 0x63, 0x19, 0xde, 0xdc, 0x21, 0xa1, 0xb5, 0xad, - 0x05, 0x51, 0xae, 0xd8, 0x9b, 0xa0, 0x67, 0x93, 0x00, 0xdf, 0xe9, 0x6b, 0xd6, 0xef, 0x4b, 0x30, - 0xe1, 0xca, 0xbb, 0xd8, 0x6e, 0xa3, 0xc7, 0x72, 0xc1, 0xe0, 0x22, 0x7d, 0xcb, 0x7e, 0x51, 0xd8, - 0xa9, 0xcf, 0xab, 0x21, 0xa5, 0x1f, 0x81, 0x49, 0x20, 0x44, 0x89, 0x13, 0xa2, 0x98, 0xef, 0x5e, - 0x6c, 0x11, 0xe9, 0x8b, 0xef, 0xe3, 0x12, 0xcc, 0x7a, 0xf3, 0x88, 0x25, 0xec, 0xb4, 0xb6, 0xd1, - 0x6d, 0xa2, 0x0b, 0x4d, 0xac, 0xa5, 0xf9, 0x7b, 0xb2, 0x1d, 0xf4, 0xbd, 0x4c, 0x42, 0x95, 0xe7, - 0x4a, 0x8e, 0x58, 0xa5, 0x4b, 0xa4, 0x8b, 0x71, 0x04, 0xd3, 0x17, 0xe6, 0x17, 0x25, 0x80, 0x86, - 0xe9, 0xcf, 0x75, 0x0f, 0x20, 0xc9, 0x17, 0x08, 0x6f, 0xd7, 0xb2, 0x8a, 0x07, 0xc5, 0x26, 0xef, - 0x39, 0x04, 0x5d, 0x93, 0x06, 0x95, 0x34, 0x96, 0xb6, 0x3e, 0xb5, 0xb8, 0xdb, 0xed, 0xe8, 0x2d, - 0xcd, 0xe9, 0xf5, 0xa7, 0x8b, 0x16, 0x2f, 0xb9, 0x30, 0x32, 0x91, 0x51, 0xe8, 0x97, 0x11, 0x21, - 0x4b, 0x1a, 0xa4, 0x44, 0xf2, 0x82, 0x94, 0x08, 0xfa, 0xc8, 0x0c, 0x20, 0x3e, 0x06, 0xf5, 0x94, - 0xe1, 0x68, 0xad, 0x8b, 0x8d, 0x05, 0x0b, 0x6b, 0xed, 0x96, 0xb5, 0xbb, 0x73, 0xde, 0x0e, 0x3b, - 0x83, 0xc6, 0xeb, 0x68, 0x68, 0xe9, 0x58, 0xe2, 0x96, 0x8e, 0xd1, 0x2f, 0xc8, 0xa2, 0x21, 0x73, - 0x42, 0x1b, 0x1c, 0x21, 0x1e, 0x86, 0x18, 0xea, 0x12, 0xb9, 0x30, 0xf5, 0xac, 0x12, 0x67, 0x93, - 0xac, 0x12, 0xbf, 0x41, 0x28, 0x00, 0x8f, 0x50, 0xbd, 0xc6, 0xe2, 0x89, 0x36, 0x57, 0xc7, 0x4e, - 0x04, 0xbc, 0xd7, 0xc1, 0xec, 0xf9, 0xe0, 0x8b, 0x0f, 0x31, 0x9f, 0xd8, 0xc7, 0x3f, 0xf4, 0x8d, - 0x49, 0x57, 0x60, 0x78, 0x16, 0x22, 0xd0, 0xf5, 0x11, 0x94, 0x44, 0x9c, 0xd0, 0x12, 0x2d, 0xa7, - 0xc4, 0x96, 0x9f, 0x3e, 0x0a, 0x1f, 0x92, 0x60, 0x9a, 0x5c, 0x83, 0xb9, 0x70, 0x89, 0x9c, 0x6a, - 0x14, 0x34, 0x4a, 0x1e, 0x0a, 0x8b, 0x59, 0x81, 0x6c, 0x47, 0x37, 0x2e, 0x78, 0xde, 0x83, 0xee, - 0x73, 0x70, 0xa9, 0x9a, 0xd4, 0xe7, 0x52, 0x35, 0x7f, 0x9f, 0xc2, 0x2f, 0xf7, 0x40, 0xb7, 0xfc, - 0x0e, 0x24, 0x97, 0xbe, 0x18, 0xff, 0x3e, 0x0b, 0xf9, 0x3a, 0xd6, 0xac, 0xd6, 0x36, 0x7a, 0x97, - 0xd4, 0x77, 0xaa, 0x30, 0xc9, 0x4f, 0x15, 0x96, 0x60, 0x62, 0x53, 0xef, 0x38, 0xd8, 0xa2, 0x1e, - 0xd5, 0xe1, 0xae, 0x9d, 0x36, 0xf1, 0x85, 0x8e, 0xd9, 0xba, 0x30, 0xcf, 0x4c, 0xf7, 0x79, 0x2f, - 0x08, 0xe7, 0xfc, 0x12, 0xf9, 0x49, 0xf5, 0x7e, 0x76, 0x0d, 0x42, 0xdb, 0xb4, 0x9c, 0xa8, 0xfb, - 0x15, 0x22, 0xa8, 0xd4, 0x4d, 0xcb, 0x51, 0xe9, 0x8f, 0x2e, 0xcc, 0x9b, 0xbb, 0x9d, 0x4e, 0x03, - 0x3f, 0xe0, 0x78, 0xd3, 0x36, 0xef, 0xdd, 0x35, 0x16, 0xcd, 0xcd, 0x4d, 0x1b, 0xd3, 0x45, 0x83, - 0x9c, 0xca, 0xde, 0x94, 0xe3, 0x90, 0xeb, 0xe8, 0x3b, 0x3a, 0x9d, 0x68, 0xe4, 0x54, 0xfa, 0xa2, - 0xdc, 0x08, 0x85, 0x60, 0x8e, 0x43, 0x19, 0x3d, 0x95, 0x27, 0x4d, 0x73, 0x5f, 0xba, 0xab, 0x33, - 0x17, 0xf0, 0x25, 0xfb, 0xd4, 0x04, 0xf9, 0x4e, 0x9e, 0xf9, 0xe3, 0x2b, 0x22, 0xfb, 0x1d, 0x54, - 0xe2, 0xd1, 0x33, 0x58, 0x0b, 0xb7, 0x4c, 0xab, 0xed, 0xc9, 0x26, 0x7a, 0x82, 0xc1, 0xf2, 0x25, - 0xdb, 0xa5, 0xe8, 0x5b, 0x78, 0xfa, 0x9a, 0xf6, 0xf6, 0xbc, 0xdb, 0x6d, 0xba, 0x45, 0x9f, 0xd3, - 0x9d, 0xed, 0x35, 0xec, 0x68, 0xe8, 0xef, 0xe5, 0xbe, 0x1a, 0x37, 0xfd, 0xff, 0x69, 0xdc, 0x00, - 0x8d, 0xa3, 0xe1, 0x95, 0x9c, 0x5d, 0xcb, 0x70, 0xe5, 0xc8, 0xbc, 0x52, 0x43, 0x29, 0xca, 0x1d, - 0x70, 0x45, 0xf0, 0xe6, 0x2d, 0x95, 0x2e, 0xb2, 0x69, 0xeb, 0x14, 0xc9, 0x1e, 0x9d, 0x41, 0x59, - 0x87, 0x6b, 0xe9, 0xc7, 0x95, 0xc6, 0xda, 0xea, 0x8a, 0xbe, 0xb5, 0xdd, 0xd1, 0xb7, 0xb6, 0x1d, - 0xbb, 0x62, 0xd8, 0x0e, 0xd6, 0xda, 0xb5, 0x4d, 0x95, 0xde, 0x8c, 0x02, 0x84, 0x8e, 0x48, 0x56, - 0xde, 0xe3, 0x5a, 0x6c, 0x74, 0x0b, 0x6b, 0x4a, 0x44, 0x4b, 0x79, 0x8a, 0xdb, 0x52, 0xec, 0xdd, - 0x8e, 0x8f, 0xe9, 0x55, 0x3d, 0x98, 0x06, 0xaa, 0xbe, 0xdb, 0x21, 0xcd, 0x85, 0x64, 0x4e, 0x3a, - 0xce, 0xc5, 0x70, 0x92, 0x7e, 0xb3, 0xf9, 0x7f, 0xf2, 0x90, 0x5b, 0xb6, 0xb4, 0xee, 0x36, 0x7a, - 0x76, 0xa8, 0x7f, 0x1e, 0x55, 0x9b, 0xf0, 0xb5, 0x53, 0x1a, 0xa4, 0x9d, 0xf2, 0x00, 0xed, 0xcc, - 0x86, 0xb4, 0x33, 0x7a, 0x51, 0xf9, 0x0c, 0xcc, 0xb4, 0xcc, 0x4e, 0x07, 0xb7, 0x5c, 0x79, 0x54, - 0xda, 0x64, 0x35, 0x67, 0x4a, 0xe5, 0xd2, 0x48, 0xa0, 0x62, 0xec, 0xd4, 0xe9, 0x1a, 0x3a, 0x55, - 0xfa, 0x20, 0x01, 0xbd, 0x48, 0x82, 0x6c, 0xb9, 0xbd, 0x85, 0xb9, 0x75, 0xf6, 0x4c, 0x68, 0x9d, - 0xfd, 0x24, 0xe4, 0x1d, 0xcd, 0xda, 0xc2, 0x8e, 0xb7, 0x4e, 0x40, 0xdf, 0xfc, 0xf8, 0xc9, 0x72, - 0x28, 0x7e, 0xf2, 0x8f, 0x43, 0xd6, 0x95, 0x19, 0x73, 0x32, 0xbf, 0xb6, 0x1f, 0xfc, 0x44, 0xf6, - 0xf3, 0x6e, 0x89, 0xf3, 0x6e, 0xad, 0x55, 0xf2, 0x43, 0x2f, 0xd6, 0xb9, 0x7d, 0x58, 0x93, 0x4b, - 0x1e, 0x5b, 0xa6, 0x51, 0xd9, 0xd1, 0xb6, 0x30, 0xab, 0x66, 0x90, 0xe0, 0x7d, 0x2d, 0xef, 0x98, - 0xf7, 0xeb, 0x2c, 0x94, 0x71, 0x90, 0xe0, 0x56, 0x61, 0x5b, 0x6f, 0xb7, 0xb1, 0xc1, 0x5a, 0x36, - 0x7b, 0x3b, 0x73, 0x1a, 0xb2, 0x2e, 0x0f, 0xae, 0xfe, 0xb8, 0xc6, 0x42, 0xe1, 0x88, 0x32, 0xe3, - 0x36, 0x2b, 0xda, 0x78, 0x0b, 0x19, 0x7e, 0x4d, 0x55, 0xc4, 0x6d, 0x87, 0x56, 0xae, 0x7f, 0xe3, - 0x7a, 0x02, 0xe4, 0x0c, 0xb3, 0x8d, 0x07, 0x0e, 0x42, 0x34, 0x97, 0xf2, 0x64, 0xc8, 0xe1, 0xb6, - 0xdb, 0x2b, 0xc8, 0x24, 0xfb, 0xe9, 0x78, 0x59, 0xaa, 0x34, 0x73, 0x32, 0xdf, 0xa0, 0x7e, 0xdc, - 0xa6, 0xdf, 0x00, 0x7f, 0x79, 0x02, 0x8e, 0xd2, 0x3e, 0xa0, 0xbe, 0x7b, 0xde, 0x25, 0x75, 0x1e, - 0xa3, 0x47, 0xfa, 0x0f, 0x5c, 0x47, 0x79, 0x65, 0x3f, 0x0e, 0x39, 0x7b, 0xf7, 0xbc, 0x6f, 0x84, - 0xd2, 0x97, 0x70, 0xd3, 0x95, 0x46, 0x32, 0x9c, 0xc9, 0xc3, 0x0e, 0x67, 0xdc, 0xd0, 0x24, 0x7b, - 0x8d, 0x3f, 0x18, 0xc8, 0xe8, 0xf1, 0x08, 0x6f, 0x20, 0xeb, 0x37, 0x0c, 0x9d, 0x82, 0x09, 0x6d, - 0xd3, 0xc1, 0x56, 0x60, 0x26, 0xb2, 0x57, 0x77, 0xa8, 0x3c, 0x8f, 0x37, 0x4d, 0xcb, 0x15, 0xcb, - 0x14, 0x1d, 0x2a, 0xbd, 0xf7, 0x50, 0xcb, 0x05, 0x6e, 0x87, 0xec, 0x26, 0x38, 0x66, 0x98, 0x8b, - 0xb8, 0xcb, 0xe4, 0x4c, 0x51, 0x9c, 0x25, 0x2d, 0x60, 0xff, 0x87, 0x7d, 0x5d, 0xc9, 0xdc, 0xfe, - 0xae, 0x04, 0x7d, 0x2a, 0xe9, 0x9c, 0xb9, 0x07, 0xe8, 0x91, 0x59, 0x68, 0xca, 0xd3, 0x60, 0xa6, - 0xcd, 0x5c, 0xb4, 0x5a, 0xba, 0xdf, 0x4a, 0x22, 0xff, 0xe3, 0x32, 0x07, 0x8a, 0x94, 0x0d, 0x2b, - 0xd2, 0x32, 0x4c, 0x92, 0x83, 0xcc, 0xae, 0x26, 0xe5, 0x7a, 0x5c, 0xe2, 0xc9, 0xb4, 0xce, 0xaf, - 0x54, 0x48, 0x6c, 0xf3, 0x25, 0xf6, 0x8b, 0xea, 0xff, 0x9c, 0x6c, 0xf6, 0x1d, 0x2f, 0xa1, 0xf4, - 0x9b, 0xe3, 0xef, 0xe4, 0xe1, 0x8a, 0x92, 0x65, 0xda, 0x36, 0x39, 0x03, 0xd3, 0xdb, 0x30, 0x5f, - 0x27, 0x71, 0x37, 0x29, 0x3c, 0xaa, 0x9b, 0x5f, 0xbf, 0x06, 0x35, 0xbe, 0xa6, 0xf1, 0x55, 0xe1, - 0x10, 0x30, 0xfe, 0xfe, 0x43, 0x84, 0xd0, 0x7f, 0x38, 0x1a, 0xc9, 0xdb, 0x33, 0x22, 0x51, 0x69, - 0x12, 0xca, 0x2a, 0xfd, 0xe6, 0xf2, 0x05, 0x09, 0xae, 0xec, 0xe5, 0x66, 0xc3, 0xb0, 0xfd, 0x06, - 0x73, 0xf5, 0x80, 0xf6, 0xc2, 0x47, 0x31, 0x89, 0xbd, 0xc3, 0x30, 0xa2, 0xee, 0xa1, 0xd2, 0x22, - 0x16, 0x4b, 0x82, 0x13, 0x35, 0x71, 0x77, 0x18, 0x26, 0x26, 0x9f, 0xbe, 0x70, 0x3f, 0x9d, 0x85, - 0xa3, 0xcb, 0x96, 0xb9, 0xdb, 0xb5, 0x83, 0x1e, 0xe8, 0x6f, 0xfa, 0x6f, 0xb8, 0xe6, 0x45, 0x4c, - 0x83, 0x6b, 0x60, 0xda, 0x62, 0xd6, 0x5c, 0xb0, 0xfd, 0x1a, 0x4e, 0x0a, 0xf7, 0x5e, 0xf2, 0x41, - 0x7a, 0xaf, 0xa0, 0x9f, 0xc9, 0x72, 0xfd, 0x4c, 0x6f, 0xcf, 0x91, 0xeb, 0xd3, 0x73, 0xfc, 0xb5, - 0x94, 0x70, 0x50, 0xed, 0x11, 0x51, 0x44, 0x7f, 0x51, 0x82, 0xfc, 0x16, 0xc9, 0xc8, 0xba, 0x8b, - 0xc7, 0x8b, 0xd5, 0x8c, 0x10, 0x57, 0xd9, 0xaf, 0x81, 0x5c, 0xe5, 0xb0, 0x0e, 0x27, 0x1a, 0xe0, - 0xe2, 0xb9, 0x4d, 0x5f, 0xa9, 0x1e, 0xce, 0xc2, 0x8c, 0x5f, 0x7a, 0xa5, 0x6d, 0xa3, 0x87, 0xfa, - 0x6b, 0xd4, 0xac, 0x88, 0x46, 0xed, 0x5b, 0x67, 0xf6, 0x47, 0x1d, 0x39, 0x34, 0xea, 0xf4, 0x1d, - 0x5d, 0x66, 0x22, 0x46, 0x17, 0xf4, 0x2c, 0x59, 0xf4, 0x2e, 0x22, 0xbe, 0x6b, 0x25, 0xb5, 0x79, - 0x34, 0x0f, 0x16, 0x82, 0x37, 0x22, 0x0d, 0xae, 0x55, 0xfa, 0x4a, 0xf2, 0x5e, 0x09, 0x8e, 0xed, - 0xef, 0xcc, 0x7f, 0x84, 0xf7, 0x42, 0x73, 0xeb, 0x64, 0xfb, 0x5e, 0x68, 0xe4, 0x8d, 0xdf, 0xa4, - 0x8b, 0x0d, 0x29, 0xc2, 0xd9, 0x7b, 0x83, 0x3b, 0x71, 0xb1, 0xa0, 0x21, 0x82, 0x44, 0xd3, 0x17, - 0xe0, 0xaf, 0xcb, 0x30, 0x55, 0xc7, 0xce, 0xaa, 0x76, 0xc9, 0xdc, 0x75, 0x90, 0x26, 0xba, 0x3d, - 0xf7, 0x54, 0xc8, 0x77, 0xc8, 0x2f, 0xec, 0x8a, 0xf7, 0x6b, 0xfa, 0xee, 0x6f, 0x11, 0xdf, 0x1f, - 0x4a, 0x5a, 0x65, 0xf9, 0xf9, 0x58, 0x2e, 0x22, 0xbb, 0xa3, 0x3e, 0x77, 0x23, 0xd9, 0xda, 0x49, - 0xb4, 0x77, 0x1a, 0x55, 0x74, 0xfa, 0xb0, 0xfc, 0x82, 0x0c, 0xb3, 0x75, 0xec, 0x54, 0xec, 0x25, - 0x6d, 0xcf, 0xb4, 0x74, 0x07, 0x87, 0xef, 0x78, 0x8c, 0x87, 0xe6, 0x34, 0x80, 0xee, 0xff, 0xc6, - 0x22, 0x4c, 0x85, 0x52, 0xd0, 0x6f, 0x27, 0x75, 0x14, 0xe2, 0xf8, 0x18, 0x09, 0x08, 0x89, 0x7c, - 0x2c, 0xe2, 0x8a, 0x4f, 0x1f, 0x88, 0xcf, 0x4b, 0x0c, 0x88, 0xa2, 0xd5, 0xda, 0xd6, 0xf7, 0x70, - 0x3b, 0x21, 0x10, 0xde, 0x6f, 0x01, 0x10, 0x3e, 0xa1, 0xc4, 0xee, 0x2b, 0x1c, 0x1f, 0xa3, 0x70, - 0x5f, 0x89, 0x23, 0x38, 0x96, 0x20, 0x51, 0x6e, 0xd7, 0xc3, 0xd6, 0x33, 0xef, 0x12, 0x15, 0x6b, - 0x60, 0xb2, 0x49, 0x61, 0x93, 0x6d, 0xa8, 0x8e, 0x85, 0x96, 0x3d, 0x48, 0xa7, 0xb3, 0x69, 0x74, - 0x2c, 0x7d, 0x8b, 0x4e, 0x5f, 0xe8, 0xef, 0x94, 0xe1, 0x84, 0x1f, 0x3d, 0xa5, 0x8e, 0x9d, 0x45, - 0xcd, 0xde, 0x3e, 0x6f, 0x6a, 0x56, 0x3b, 0x7c, 0xf5, 0xff, 0xd0, 0x27, 0xfe, 0xd0, 0xe7, 0xc2, - 0x20, 0x54, 0x79, 0x10, 0xfa, 0xba, 0x8a, 0xf6, 0xe5, 0x65, 0x14, 0x9d, 0x4c, 0xac, 0x37, 0xeb, - 0xef, 0xfa, 0x60, 0xfd, 0x04, 0x07, 0xd6, 0x9d, 0xc3, 0xb2, 0x98, 0x3e, 0x70, 0xbf, 0x45, 0x47, - 0x84, 0x90, 0x57, 0xf3, 0x7d, 0xa2, 0x80, 0x45, 0x78, 0xb5, 0xca, 0x91, 0x5e, 0xad, 0x43, 0x8d, - 0x11, 0x03, 0x3d, 0x92, 0xd3, 0x1d, 0x23, 0x0e, 0xd1, 0xdb, 0xf8, 0xad, 0x32, 0x14, 0x48, 0xf8, - 0xac, 0x90, 0xc7, 0x37, 0xba, 0x5f, 0x14, 0x9d, 0x7d, 0xde, 0xe5, 0x13, 0x49, 0xbd, 0xcb, 0xd1, - 0x5b, 0x92, 0xfa, 0x90, 0xf7, 0x72, 0x3b, 0x12, 0xc4, 0x12, 0xb9, 0x88, 0x0f, 0xe0, 0x20, 0x7d, - 0xd0, 0xfe, 0x9b, 0x0c, 0xe0, 0x36, 0x68, 0x76, 0xf6, 0xe1, 0x19, 0xa2, 0x70, 0xdd, 0x1c, 0xf6, - 0xab, 0x77, 0x81, 0x3a, 0xd1, 0x03, 0x14, 0xa5, 0x18, 0x9c, 0xaa, 0x78, 0x24, 0xa9, 0x6f, 0x65, - 0xc0, 0xd5, 0x48, 0x60, 0x49, 0xe4, 0x6d, 0x19, 0x59, 0x76, 0xfa, 0x80, 0xfc, 0x0f, 0x09, 0x72, - 0x0d, 0xb3, 0x8e, 0x9d, 0x83, 0x9b, 0x02, 0x89, 0x8f, 0xed, 0x93, 0x72, 0x47, 0x71, 0x6c, 0xbf, - 0x1f, 0xa1, 0x31, 0x44, 0x23, 0x93, 0x60, 0xa6, 0x61, 0x96, 0xfc, 0xc5, 0x29, 0x71, 0x5f, 0x55, - 0xf1, 0xfb, 0x94, 0xfd, 0x0a, 0x06, 0xc5, 0x1c, 0xe8, 0x3e, 0xe5, 0xc1, 0xf4, 0xd2, 0x97, 0xdb, - 0x6d, 0x70, 0x74, 0xc3, 0x68, 0x9b, 0x2a, 0x6e, 0x9b, 0x6c, 0xa5, 0x5b, 0x51, 0x20, 0xbb, 0x6b, - 0xb4, 0x4d, 0xc2, 0x72, 0x4e, 0x25, 0xcf, 0x6e, 0x9a, 0x85, 0xdb, 0x26, 0xf3, 0x0d, 0x20, 0xcf, - 0xe8, 0xab, 0x32, 0x64, 0xdd, 0x7f, 0xc5, 0x45, 0xfd, 0x56, 0x39, 0x61, 0x20, 0x02, 0x97, 0xfc, - 0x48, 0x2c, 0xa1, 0xbb, 0x42, 0x6b, 0xff, 0xd4, 0x83, 0xf5, 0xda, 0xa8, 0xf2, 0x42, 0xa2, 0x08, - 0xd6, 0xfc, 0x95, 0x53, 0x30, 0x71, 0xbe, 0x63, 0xb6, 0x2e, 0x04, 0xe7, 0xe5, 0xd9, 0xab, 0x72, - 0x23, 0xe4, 0x2c, 0xcd, 0xd8, 0xc2, 0x6c, 0x4f, 0xe1, 0x78, 0x4f, 0x5f, 0x48, 0xbc, 0x5e, 0x54, - 0x9a, 0x05, 0xbd, 0x25, 0x49, 0x08, 0x84, 0x3e, 0x95, 0x4f, 0xa6, 0x0f, 0x8b, 0x43, 0x9c, 0x2c, - 0x2b, 0xc0, 0x4c, 0xa9, 0x48, 0x6f, 0x2e, 0x5f, 0xab, 0x9d, 0x2d, 0x17, 0x64, 0x02, 0xb3, 0x2b, - 0x93, 0x14, 0x61, 0x76, 0xc9, 0xff, 0xd0, 0xc2, 0xdc, 0xa7, 0xf2, 0x87, 0x01, 0xf3, 0xc7, 0x25, - 0x98, 0x5d, 0xd5, 0x6d, 0x27, 0xca, 0xdb, 0x3f, 0x26, 0x7a, 0xee, 0xf3, 0x93, 0x9a, 0xca, 0x5c, - 0x39, 0xc2, 0x61, 0x73, 0x13, 0x99, 0xc3, 0x71, 0x45, 0x8c, 0xe7, 0x58, 0x0a, 0xe1, 0x80, 0xde, - 0x36, 0x2c, 0x2c, 0xc9, 0xc4, 0x86, 0x52, 0x50, 0xc8, 0xf8, 0x0d, 0xa5, 0xc8, 0xb2, 0xd3, 0x97, - 0xef, 0x57, 0x25, 0x38, 0xe6, 0x16, 0x1f, 0xb7, 0x2c, 0x15, 0x2d, 0xe6, 0x81, 0xcb, 0x52, 0x89, - 0x57, 0xc6, 0xf7, 0xf1, 0x32, 0x8a, 0x95, 0xf1, 0x41, 0x44, 0xc7, 0x2c, 0xe6, 0x88, 0x65, 0xd8, - 0x41, 0x62, 0x8e, 0x59, 0x86, 0x1d, 0x5e, 0xcc, 0xf1, 0x4b, 0xb1, 0x43, 0x8a, 0xf9, 0xd0, 0x16, - 0x58, 0x5f, 0x23, 0xfb, 0x62, 0x8e, 0x5c, 0xdb, 0x88, 0x11, 0x73, 0xe2, 0x13, 0xbb, 0xe8, 0x6d, - 0x43, 0x0a, 0x7e, 0xc4, 0xeb, 0x1b, 0xc3, 0xc0, 0x74, 0x88, 0x6b, 0x1c, 0x2f, 0x96, 0x61, 0x8e, - 0x71, 0xd1, 0x7f, 0xca, 0x1c, 0x83, 0x51, 0xe2, 0x29, 0x73, 0xe2, 0x33, 0x40, 0x3c, 0x67, 0xe3, - 0x3f, 0x03, 0x14, 0x5b, 0x7e, 0xfa, 0xe0, 0x7c, 0x2d, 0x0b, 0x27, 0x5d, 0x16, 0xd6, 0xcc, 0xb6, - 0xbe, 0x79, 0x89, 0x72, 0x71, 0x56, 0xeb, 0xec, 0x62, 0x1b, 0xbd, 0x5b, 0x12, 0x45, 0xe9, 0x3f, - 0x01, 0x98, 0x5d, 0x6c, 0xd1, 0x40, 0x6a, 0x0c, 0xa8, 0x3b, 0xa2, 0x2a, 0xbb, 0xbf, 0x24, 0xff, - 0x32, 0x99, 0x9a, 0x47, 0x44, 0x0d, 0xd1, 0x73, 0xad, 0xc2, 0x29, 0xff, 0x4b, 0xaf, 0x83, 0x47, - 0x66, 0xbf, 0x83, 0xc7, 0x0d, 0x20, 0x6b, 0xed, 0xb6, 0x0f, 0x55, 0xef, 0x66, 0x36, 0x29, 0x53, - 0x75, 0xb3, 0xb8, 0x39, 0x6d, 0x1c, 0x1c, 0xcd, 0x8b, 0xc8, 0x69, 0x63, 0x47, 0x99, 0x87, 0x3c, - 0xbd, 0x79, 0xd9, 0x5f, 0xd1, 0xef, 0x9f, 0x99, 0xe5, 0xe2, 0x4d, 0xbb, 0x1a, 0xaf, 0x86, 0xb7, - 0x25, 0x92, 0x4c, 0xbf, 0x7e, 0x3a, 0xb0, 0x93, 0x55, 0x4e, 0xc1, 0x9e, 0x3e, 0x34, 0xe5, 0xf1, - 0xec, 0x86, 0x15, 0xbb, 0xdd, 0xce, 0xa5, 0x06, 0x0b, 0xbe, 0x92, 0x68, 0x37, 0x2c, 0x14, 0xc3, - 0x45, 0xea, 0x8d, 0xe1, 0x92, 0x7c, 0x37, 0x8c, 0xe3, 0x63, 0x14, 0xbb, 0x61, 0x71, 0x04, 0xd3, - 0x17, 0xed, 0x9b, 0x72, 0xd4, 0x6a, 0x66, 0xb1, 0xfd, 0xff, 0xa8, 0xff, 0x21, 0x34, 0xe0, 0x9d, - 0x5d, 0xfa, 0x85, 0xfd, 0x8f, 0xbd, 0xd3, 0x44, 0x79, 0x32, 0xe4, 0x37, 0x4d, 0x6b, 0x47, 0xf3, - 0x36, 0xee, 0x7b, 0x4f, 0x8a, 0xb0, 0x78, 0xfa, 0x4b, 0x24, 0x8f, 0xca, 0xf2, 0xba, 0xf3, 0x91, - 0x67, 0xea, 0x5d, 0x16, 0x75, 0xd1, 0x7d, 0x54, 0xae, 0x83, 0x59, 0x16, 0x7c, 0xb1, 0x8a, 0x6d, - 0x07, 0xb7, 0x59, 0xc4, 0x0a, 0x3e, 0x51, 0x39, 0x03, 0x33, 0x2c, 0x61, 0x49, 0xef, 0x60, 0x9b, - 0x05, 0xad, 0xe0, 0xd2, 0x94, 0x93, 0x90, 0xd7, 0xed, 0x7b, 0x6c, 0xd3, 0x20, 0xfe, 0xff, 0x93, - 0x2a, 0x7b, 0x53, 0x6e, 0x80, 0xa3, 0x2c, 0x9f, 0x6f, 0xac, 0xd2, 0x03, 0x3b, 0xbd, 0xc9, 0xae, - 0x6a, 0x19, 0xe6, 0xba, 0x65, 0x6e, 0x59, 0xd8, 0xb6, 0xc9, 0xa9, 0xa9, 0x49, 0x35, 0x94, 0x82, - 0x3e, 0x33, 0xcc, 0xc4, 0x22, 0xf1, 0x3d, 0x07, 0x2e, 0x4a, 0xbb, 0xad, 0x16, 0xc6, 0x6d, 0x76, - 0xf2, 0xc9, 0x7b, 0x4d, 0x78, 0x03, 0x42, 0xe2, 0x69, 0xc8, 0x21, 0x5d, 0x81, 0xf0, 0x81, 0x13, - 0x90, 0xa7, 0xd7, 0x89, 0xa1, 0x17, 0xce, 0xf5, 0x55, 0xd6, 0x39, 0x5e, 0x59, 0x37, 0x60, 0xc6, - 0x30, 0xdd, 0xe2, 0xd6, 0x35, 0x4b, 0xdb, 0xb1, 0xe3, 0x56, 0x19, 0x29, 0x5d, 0x7f, 0x48, 0xa9, - 0x86, 0x7e, 0x5b, 0x39, 0xa2, 0x72, 0x64, 0x94, 0xff, 0x1f, 0x1c, 0x3d, 0xcf, 0x22, 0x04, 0xd8, - 0x8c, 0xb2, 0x14, 0xed, 0x83, 0xd7, 0x43, 0x79, 0x81, 0xff, 0x73, 0xe5, 0x88, 0xda, 0x4b, 0x4c, - 0xf9, 0x29, 0x98, 0x73, 0x5f, 0xdb, 0xe6, 0x45, 0x8f, 0x71, 0x39, 0xda, 0x10, 0xe9, 0x21, 0xbf, - 0xc6, 0xfd, 0xb8, 0x72, 0x44, 0xed, 0x21, 0xa5, 0xd4, 0x00, 0xb6, 0x9d, 0x9d, 0x0e, 0x23, 0x9c, - 0x8d, 0x56, 0xc9, 0x1e, 0xc2, 0x2b, 0xfe, 0x4f, 0x2b, 0x47, 0xd4, 0x10, 0x09, 0x65, 0x15, 0xa6, - 0x9c, 0x07, 0x1c, 0x46, 0x2f, 0x17, 0xbd, 0xf9, 0xdd, 0x43, 0xaf, 0xe1, 0xfd, 0xb3, 0x72, 0x44, - 0x0d, 0x08, 0x28, 0x15, 0x98, 0xec, 0x9e, 0x67, 0xc4, 0xf2, 0x7d, 0xa2, 0xcd, 0xf7, 0x27, 0xb6, - 0x7e, 0xde, 0xa7, 0xe5, 0xff, 0xee, 0x32, 0xd6, 0xb2, 0xf7, 0x18, 0xad, 0x09, 0x61, 0xc6, 0x4a, - 0xde, 0x3f, 0x2e, 0x63, 0x3e, 0x01, 0xa5, 0x02, 0x53, 0xb6, 0xa1, 0x75, 0xed, 0x6d, 0xd3, 0xb1, - 0x4f, 0x4d, 0xf6, 0xf8, 0x49, 0x46, 0x53, 0xab, 0xb3, 0x7f, 0xd4, 0xe0, 0x6f, 0xe5, 0xc9, 0x70, - 0x62, 0x97, 0x5c, 0xcb, 0x5e, 0x7e, 0x40, 0xb7, 0x1d, 0xdd, 0xd8, 0xf2, 0x62, 0xcc, 0xd2, 0xde, - 0xa6, 0xff, 0x47, 0x65, 0x9e, 0x9d, 0x98, 0x02, 0xd2, 0x36, 0x51, 0xef, 0x66, 0x1d, 0x2d, 0x36, - 0x74, 0x50, 0xea, 0x69, 0x90, 0x75, 0x3f, 0x91, 0xde, 0x69, 0xae, 0xff, 0x42, 0x60, 0xaf, 0xee, - 0x90, 0x06, 0xec, 0xfe, 0xd4, 0xd3, 0xc1, 0xcd, 0xf4, 0x76, 0x70, 0x6e, 0x03, 0xd7, 0xed, 0x35, - 0x7d, 0x8b, 0x5a, 0x57, 0xcc, 0x1f, 0x3e, 0x9c, 0x44, 0x67, 0xa3, 0x55, 0x7c, 0x91, 0xde, 0xa0, - 0x71, 0xd4, 0x9b, 0x8d, 0x7a, 0x29, 0xe8, 0x7a, 0x98, 0x09, 0x37, 0x32, 0x7a, 0x27, 0xa9, 0x1e, - 0xd8, 0x66, 0xec, 0x0d, 0x5d, 0x07, 0x73, 0xbc, 0x4e, 0x87, 0x86, 0x20, 0xd9, 0xeb, 0x0a, 0xd1, - 0xb5, 0x70, 0xb4, 0xa7, 0x61, 0x79, 0x31, 0x47, 0x32, 0x41, 0xcc, 0x91, 0x6b, 0x00, 0x02, 0x2d, - 0xee, 0x4b, 0xe6, 0x6a, 0x98, 0xf2, 0xf5, 0xb2, 0x6f, 0x86, 0x2f, 0x67, 0x60, 0xd2, 0x53, 0xb6, - 0x7e, 0x19, 0xdc, 0xf1, 0xc7, 0x08, 0x6d, 0x30, 0xb0, 0x69, 0x38, 0x97, 0xe6, 0x8e, 0x33, 0x81, - 0x5b, 0x6f, 0x43, 0x77, 0x3a, 0xde, 0xd1, 0xb8, 0xde, 0x64, 0x65, 0x1d, 0x40, 0x27, 0x18, 0x35, - 0x82, 0xb3, 0x72, 0xb7, 0x24, 0x68, 0x0f, 0x54, 0x1f, 0x42, 0x34, 0xce, 0xfc, 0x08, 0x3b, 0xc8, - 0x36, 0x05, 0x39, 0x1a, 0x68, 0xfd, 0x88, 0x32, 0x07, 0x50, 0x7e, 0xc6, 0x7a, 0x59, 0xad, 0x94, - 0xab, 0xa5, 0x72, 0x21, 0x83, 0x5e, 0x22, 0xc1, 0x94, 0xdf, 0x08, 0xfa, 0x56, 0xb2, 0xcc, 0x54, - 0x6b, 0xe0, 0xb5, 0x8f, 0xfb, 0x1b, 0x55, 0x58, 0xc9, 0x9e, 0x0a, 0x97, 0xef, 0xda, 0x78, 0x49, - 0xb7, 0x6c, 0x47, 0x35, 0x2f, 0x2e, 0x99, 0x96, 0x1f, 0x55, 0x99, 0x45, 0x38, 0x8d, 0xfa, 0xec, - 0x5a, 0x1c, 0x6d, 0x4c, 0x0e, 0x4d, 0x61, 0x8b, 0xad, 0x1c, 0x07, 0x09, 0x2e, 0x5d, 0xc7, 0xd2, - 0x0c, 0xbb, 0x6b, 0xda, 0x58, 0x35, 0x2f, 0xda, 0x45, 0xa3, 0x5d, 0x32, 0x3b, 0xbb, 0x3b, 0x86, - 0xcd, 0x6c, 0x86, 0xa8, 0xcf, 0xae, 0x74, 0xc8, 0xa5, 0xae, 0x73, 0x00, 0xa5, 0xda, 0xea, 0x6a, - 0xb9, 0xd4, 0xa8, 0xd4, 0xaa, 0x85, 0x23, 0xae, 0xb4, 0x1a, 0xc5, 0x85, 0x55, 0x57, 0x3a, 0x3f, - 0x0d, 0x93, 0x5e, 0x9b, 0x66, 0x61, 0x52, 0x32, 0x5e, 0x98, 0x14, 0xa5, 0x08, 0x93, 0x5e, 0x2b, - 0x67, 0x23, 0xc2, 0x63, 0x7b, 0x8f, 0xc5, 0xee, 0x68, 0x96, 0x43, 0xfc, 0xa9, 0x3d, 0x22, 0x0b, - 0x9a, 0x8d, 0x55, 0xff, 0xb7, 0x33, 0x4f, 0x60, 0x1c, 0x28, 0x30, 0x57, 0x5c, 0x5d, 0x6d, 0xd6, - 0xd4, 0x66, 0xb5, 0xd6, 0x58, 0xa9, 0x54, 0x97, 0xe9, 0x08, 0x59, 0x59, 0xae, 0xd6, 0xd4, 0x32, - 0x1d, 0x20, 0xeb, 0x85, 0x0c, 0xbd, 0x54, 0x78, 0x61, 0x12, 0xf2, 0x5d, 0x22, 0x5d, 0xf4, 0x05, - 0x39, 0xe1, 0x79, 0x78, 0x1f, 0xa7, 0x88, 0x6b, 0x4f, 0x39, 0x9f, 0x74, 0xa9, 0xcf, 0x99, 0xd1, - 0x33, 0x30, 0x43, 0x6d, 0x3d, 0x9b, 0x2c, 0xef, 0x13, 0xe4, 0x64, 0x95, 0x4b, 0x43, 0x1f, 0x92, - 0x12, 0x1c, 0x92, 0xef, 0xcb, 0x51, 0x32, 0xe3, 0xe2, 0xcf, 0x33, 0xc3, 0x5d, 0x4b, 0x50, 0xa9, - 0x36, 0xca, 0x6a, 0xb5, 0xb8, 0xca, 0xb2, 0xc8, 0xca, 0x29, 0x38, 0x5e, 0xad, 0xb1, 0x98, 0x7f, - 0xf5, 0x66, 0xa3, 0xd6, 0xac, 0xac, 0xad, 0xd7, 0xd4, 0x46, 0x21, 0xa7, 0x9c, 0x04, 0x85, 0x3e, - 0x37, 0x2b, 0xf5, 0x66, 0xa9, 0x58, 0x2d, 0x95, 0x57, 0xcb, 0x8b, 0x85, 0xbc, 0xf2, 0x38, 0xb8, - 0x96, 0x5e, 0x73, 0x53, 0x5b, 0x6a, 0xaa, 0xb5, 0x73, 0x75, 0x17, 0x41, 0xb5, 0xbc, 0x5a, 0x74, - 0x15, 0x29, 0x74, 0xb9, 0xf0, 0x84, 0x72, 0x19, 0x1c, 0x25, 0x17, 0x87, 0xaf, 0xd6, 0x8a, 0x8b, - 0xac, 0xbc, 0x49, 0xe5, 0x2a, 0x38, 0x55, 0xa9, 0xd6, 0x37, 0x96, 0x96, 0x2a, 0xa5, 0x4a, 0xb9, - 0xda, 0x68, 0xae, 0x97, 0xd5, 0xb5, 0x4a, 0xbd, 0xee, 0xfe, 0x5b, 0x98, 0x22, 0x57, 0xb7, 0xd2, - 0x3e, 0x13, 0xbd, 0x4b, 0x86, 0xd9, 0xb3, 0x5a, 0x47, 0x77, 0x07, 0x0a, 0x72, 0xa7, 0x73, 0xcf, - 0x71, 0x12, 0x87, 0xdc, 0xfd, 0xcc, 0x1c, 0xd2, 0xc9, 0x0b, 0xfa, 0x79, 0x39, 0xe1, 0x71, 0x12, - 0x06, 0x04, 0x2d, 0x71, 0x9e, 0x2b, 0x2d, 0x62, 0xf2, 0xf3, 0x2a, 0x29, 0xc1, 0x71, 0x12, 0x71, - 0xf2, 0xc9, 0xc0, 0x7f, 0xe9, 0xa8, 0xc0, 0x2f, 0xc0, 0xcc, 0x46, 0xb5, 0xb8, 0xd1, 0x58, 0xa9, - 0xa9, 0x95, 0x9f, 0x24, 0xd1, 0xc8, 0x67, 0x61, 0x6a, 0xa9, 0xa6, 0x2e, 0x54, 0x16, 0x17, 0xcb, - 0xd5, 0x42, 0x4e, 0xb9, 0x1c, 0x2e, 0xab, 0x97, 0xd5, 0xb3, 0x95, 0x52, 0xb9, 0xb9, 0x51, 0x2d, - 0x9e, 0x2d, 0x56, 0x56, 0x49, 0x1f, 0x91, 0x8f, 0xb9, 0x8f, 0x7a, 0x02, 0xfd, 0x6c, 0x16, 0x80, - 0x56, 0x9d, 0x5c, 0xc6, 0x13, 0xba, 0xb5, 0xf8, 0x2f, 0x92, 0x4e, 0x1a, 0x02, 0x32, 0x11, 0xed, - 0xb7, 0x02, 0x93, 0x16, 0xfb, 0xc0, 0x96, 0x57, 0x06, 0xd1, 0xa1, 0x8f, 0x1e, 0x35, 0xd5, 0xff, - 0x1d, 0xbd, 0x3b, 0xc9, 0x1c, 0x21, 0x92, 0xb1, 0x64, 0x48, 0x2e, 0x8d, 0x06, 0x48, 0xf4, 0x50, - 0x06, 0xe6, 0xf8, 0x8a, 0xb9, 0x95, 0x20, 0xc6, 0x94, 0x58, 0x25, 0xf8, 0x9f, 0x43, 0x46, 0xd6, - 0x99, 0x27, 0xb1, 0xe1, 0x14, 0xbc, 0x96, 0x49, 0x4f, 0x86, 0x7b, 0x16, 0x4b, 0x21, 0xe3, 0x32, - 0xef, 0x1a, 0x1d, 0x05, 0x49, 0x99, 0x00, 0xb9, 0xf1, 0x80, 0x53, 0x90, 0xd1, 0x97, 0x65, 0x98, - 0xe5, 0xae, 0x45, 0x46, 0xaf, 0xca, 0x88, 0x5c, 0x59, 0x1a, 0xba, 0x70, 0x39, 0x73, 0xd0, 0x0b, - 0x97, 0xcf, 0xdc, 0x0c, 0x13, 0x2c, 0x8d, 0xc8, 0xb7, 0x56, 0x75, 0x4d, 0x81, 0xa3, 0x30, 0xbd, - 0x5c, 0x6e, 0x34, 0xeb, 0x8d, 0xa2, 0xda, 0x28, 0x2f, 0x16, 0x32, 0xee, 0xc0, 0x57, 0x5e, 0x5b, - 0x6f, 0xdc, 0x57, 0x90, 0x92, 0x7b, 0xe8, 0xf5, 0x32, 0x32, 0x66, 0x0f, 0xbd, 0xb8, 0xe2, 0xd3, - 0x9f, 0xab, 0x7e, 0x4a, 0x86, 0x02, 0xe5, 0xa0, 0xfc, 0x40, 0x17, 0x5b, 0x3a, 0x36, 0x5a, 0x18, - 0x5d, 0x10, 0x89, 0x08, 0xba, 0x2f, 0x56, 0x1e, 0xe9, 0xcf, 0x43, 0x56, 0x22, 0x7d, 0xe9, 0x31, - 0xb0, 0xb3, 0xfb, 0x0c, 0xec, 0x4f, 0x26, 0x75, 0xd1, 0xeb, 0x65, 0x77, 0x24, 0x90, 0x7d, 0x2c, - 0x89, 0x8b, 0xde, 0x00, 0x0e, 0xc6, 0x12, 0xe8, 0x37, 0x62, 0xfc, 0x2d, 0xc8, 0xe8, 0x79, 0x32, - 0x1c, 0x5d, 0xd4, 0x1c, 0xbc, 0x70, 0xa9, 0xe1, 0x5d, 0x5b, 0x18, 0x71, 0xd5, 0x70, 0x66, 0xdf, - 0x55, 0xc3, 0xc1, 0xcd, 0x87, 0x52, 0xcf, 0xcd, 0x87, 0xe8, 0xed, 0x49, 0x0f, 0xf5, 0xf5, 0xf0, - 0x30, 0xb2, 0x68, 0xbc, 0xc9, 0x0e, 0xeb, 0xc5, 0x73, 0x31, 0x86, 0x9b, 0xff, 0xa7, 0xa0, 0x40, - 0x59, 0x09, 0x79, 0xa1, 0xfd, 0x3a, 0xbb, 0x9d, 0xbb, 0x99, 0x20, 0xe8, 0x9f, 0x17, 0x46, 0x41, - 0xe2, 0xc3, 0x28, 0x70, 0x8b, 0x9a, 0x72, 0xaf, 0xe7, 0x40, 0xd2, 0xce, 0x30, 0xe4, 0x72, 0x16, - 0x1d, 0x67, 0x35, 0xbd, 0xce, 0x30, 0xb6, 0xf8, 0xf1, 0xdc, 0x20, 0xcb, 0xee, 0x79, 0x2c, 0x8b, - 0x22, 0x13, 0x7f, 0x51, 0x76, 0x52, 0xff, 0x63, 0xce, 0xe5, 0x2f, 0xe6, 0xf6, 0xe8, 0xf4, 0xfc, - 0x8f, 0x07, 0x71, 0x90, 0x3e, 0x0a, 0xdf, 0x93, 0x20, 0x5b, 0x37, 0x2d, 0x67, 0x54, 0x18, 0x24, - 0xdd, 0x33, 0x0d, 0x49, 0xa0, 0x1e, 0x3d, 0xe7, 0x4c, 0x6f, 0xcf, 0x34, 0xbe, 0xfc, 0x31, 0xc4, - 0x4d, 0x3c, 0x0a, 0x73, 0x94, 0x13, 0xff, 0x52, 0x91, 0xef, 0x4a, 0xb4, 0xbf, 0xba, 0x57, 0x14, - 0x91, 0x33, 0x30, 0x13, 0xda, 0xb3, 0xf4, 0x40, 0xe1, 0xd2, 0xd0, 0xeb, 0xc2, 0xb8, 0x2c, 0xf2, - 0xb8, 0xf4, 0x9b, 0x71, 0xfb, 0xf7, 0x72, 0x8c, 0xaa, 0x67, 0x4a, 0x12, 0x82, 0x31, 0xa6, 0xf0, - 0xf4, 0x11, 0x79, 0x50, 0x86, 0x3c, 0xf3, 0x19, 0x1b, 0x29, 0x02, 0x49, 0x5b, 0x86, 0x2f, 0x04, - 0x31, 0xdf, 0x32, 0x79, 0xd4, 0x2d, 0x23, 0xbe, 0xfc, 0xf4, 0x71, 0xf8, 0x3e, 0x73, 0x86, 0x2c, - 0xee, 0x69, 0x7a, 0x47, 0x3b, 0xdf, 0x49, 0x10, 0xfa, 0xf8, 0x43, 0x09, 0x8f, 0x7f, 0xf9, 0x55, - 0xe5, 0xca, 0x8b, 0x90, 0xf8, 0x8f, 0xc1, 0x94, 0xe5, 0x2f, 0x49, 0x7a, 0xa7, 0xe3, 0x7b, 0x1c, - 0x51, 0xd9, 0x77, 0x35, 0xc8, 0x99, 0xe8, 0xac, 0x97, 0x10, 0x3f, 0x63, 0x39, 0x9b, 0x32, 0x5d, - 0x6c, 0xb7, 0x97, 0xb0, 0xe6, 0xec, 0x5a, 0xb8, 0x9d, 0x68, 0x88, 0xe0, 0x45, 0x34, 0x15, 0x96, - 0x04, 0x17, 0x7c, 0x70, 0x95, 0x47, 0xe7, 0x29, 0x03, 0x7a, 0x03, 0x8f, 0x97, 0x91, 0x74, 0x49, - 0x6f, 0xf2, 0x21, 0xa9, 0x71, 0x90, 0x3c, 0x6d, 0x38, 0x26, 0xd2, 0x07, 0xe4, 0x37, 0x65, 0x98, - 0xa3, 0x76, 0xc2, 0xa8, 0x31, 0xf9, 0x83, 0x84, 0x3e, 0x26, 0xa1, 0x6b, 0x9b, 0xc2, 0xec, 0x8c, - 0x04, 0x96, 0x24, 0x1e, 0x29, 0x62, 0x7c, 0xa4, 0x8f, 0xcc, 0x67, 0xf2, 0x00, 0x21, 0xbf, 0xc1, - 0x0f, 0xe5, 0x83, 0x40, 0x80, 0xe8, 0x2d, 0x6c, 0xfe, 0x51, 0xe7, 0xa2, 0x52, 0x87, 0x7c, 0x02, - 0xfd, 0x0d, 0x29, 0x3e, 0x51, 0x68, 0x54, 0xf9, 0xf3, 0x84, 0x36, 0x2f, 0xf3, 0xda, 0x1b, 0x38, - 0xb8, 0x0f, 0xd9, 0xcb, 0x7d, 0x38, 0x81, 0xf1, 0x3b, 0x88, 0x95, 0x64, 0xa8, 0xad, 0x0e, 0x31, - 0xb3, 0x3f, 0x05, 0xc7, 0xd5, 0x72, 0x71, 0xb1, 0x56, 0x5d, 0xbd, 0x2f, 0x7c, 0x87, 0x4f, 0x41, - 0x0e, 0x4f, 0x4e, 0x52, 0x81, 0xed, 0xd5, 0x09, 0xfb, 0x40, 0x5e, 0x56, 0xb1, 0x37, 0xd4, 0x7f, - 0x2c, 0x41, 0xaf, 0x26, 0x40, 0xf6, 0x30, 0x51, 0x78, 0x10, 0x42, 0xcd, 0xe8, 0x17, 0x65, 0x28, - 0xb8, 0xe3, 0x21, 0xe5, 0x92, 0x5d, 0xd6, 0x56, 0xe3, 0xdd, 0x0a, 0xbb, 0x74, 0xff, 0x29, 0x70, - 0x2b, 0xf4, 0x12, 0x94, 0xeb, 0x61, 0xae, 0xb5, 0x8d, 0x5b, 0x17, 0x2a, 0x86, 0xb7, 0xaf, 0x4e, - 0x37, 0x61, 0x7b, 0x52, 0x79, 0x60, 0xee, 0xe5, 0x81, 0xe1, 0x27, 0xd1, 0xdc, 0x20, 0x1d, 0x66, - 0x2a, 0x02, 0x97, 0x3f, 0xf2, 0x71, 0xa9, 0x72, 0xb8, 0xdc, 0x3e, 0x14, 0xd5, 0x64, 0xb0, 0x54, - 0x87, 0x80, 0x05, 0xc1, 0xc9, 0xda, 0x7a, 0xa3, 0x52, 0xab, 0x36, 0x37, 0xea, 0xe5, 0xc5, 0xe6, - 0x82, 0x07, 0x4e, 0xbd, 0x20, 0xa3, 0xaf, 0x4b, 0x30, 0x41, 0xd9, 0xb2, 0xd1, 0xe3, 0x03, 0x08, - 0x06, 0xfa, 0x53, 0xa2, 0x37, 0x0b, 0x47, 0x47, 0xf0, 0x05, 0xc1, 0xca, 0x89, 0xe8, 0xa7, 0x9e, - 0x0a, 0x13, 0x14, 0x64, 0x6f, 0x45, 0xeb, 0x74, 0x44, 0x2f, 0xc5, 0xc8, 0xa8, 0x5e, 0x76, 0xc1, - 0x48, 0x09, 0x03, 0xd8, 0x48, 0x7f, 0x64, 0x79, 0x56, 0x96, 0x9a, 0xc1, 0xe7, 0x74, 0x67, 0x9b, - 0xb8, 0x5b, 0xa2, 0x9f, 0x10, 0x59, 0x5e, 0xbc, 0x09, 0x72, 0x7b, 0x6e, 0xee, 0x01, 0xae, 0xab, - 0x34, 0x13, 0x7a, 0xa9, 0x70, 0x60, 0x4e, 0x4e, 0x3f, 0x7d, 0x9e, 0x22, 0xc0, 0x59, 0x83, 0x6c, - 0x47, 0xb7, 0x1d, 0x36, 0x7e, 0xdc, 0x96, 0x88, 0x90, 0xf7, 0x50, 0x71, 0xf0, 0x8e, 0x4a, 0xc8, - 0xa0, 0x7b, 0x60, 0x26, 0x9c, 0x2a, 0xe0, 0xbe, 0x7b, 0x0a, 0x26, 0xd8, 0xb1, 0x32, 0xb6, 0xc4, - 0xea, 0xbd, 0x0a, 0x2e, 0x6b, 0x0a, 0xd5, 0x36, 0x7d, 0x1d, 0xf8, 0xbf, 0x8f, 0xc2, 0xc4, 0x8a, - 0x6e, 0x3b, 0xa6, 0x75, 0x09, 0x3d, 0x92, 0x81, 0x89, 0xb3, 0xd8, 0xb2, 0x75, 0xd3, 0xd8, 0xe7, - 0x6a, 0x70, 0x0d, 0x4c, 0x77, 0x2d, 0xbc, 0xa7, 0x9b, 0xbb, 0x76, 0xb0, 0x38, 0x13, 0x4e, 0x52, - 0x10, 0x4c, 0x6a, 0xbb, 0xce, 0xb6, 0x69, 0x05, 0xd1, 0x28, 0xbc, 0x77, 0xe5, 0x34, 0x00, 0x7d, - 0xae, 0x6a, 0x3b, 0x98, 0x39, 0x50, 0x84, 0x52, 0x14, 0x05, 0xb2, 0x8e, 0xbe, 0x83, 0x59, 0x78, - 0x5a, 0xf2, 0xec, 0x0a, 0x98, 0x84, 0x7a, 0x63, 0x21, 0xf5, 0x64, 0xd5, 0x7b, 0x45, 0x9f, 0x93, - 0x61, 0x7a, 0x19, 0x3b, 0x8c, 0x55, 0x1b, 0x3d, 0x3f, 0x23, 0x74, 0x23, 0x84, 0x3b, 0xc6, 0x76, - 0x34, 0xdb, 0xfb, 0xcf, 0x5f, 0x82, 0xe5, 0x13, 0x83, 0x58, 0xb9, 0x72, 0x38, 0x50, 0x36, 0x09, - 0x9c, 0xe6, 0x54, 0xa8, 0x5f, 0x26, 0xcb, 0xcc, 0x36, 0x41, 0xf6, 0x7f, 0x40, 0xef, 0x90, 0x44, - 0x0f, 0x1d, 0x33, 0xd9, 0xcf, 0x87, 0xea, 0x13, 0xd9, 0x1d, 0x4d, 0xee, 0xb1, 0x1c, 0xfb, 0x62, - 0xa0, 0x87, 0x29, 0x31, 0x32, 0xaa, 0x9f, 0x5b, 0xf0, 0xb8, 0xf2, 0x60, 0x4e, 0xd2, 0xd7, 0xc6, - 0x6f, 0xcb, 0x30, 0x5d, 0xdf, 0x36, 0x2f, 0x7a, 0x72, 0xfc, 0x69, 0x31, 0x60, 0xaf, 0x82, 0xa9, - 0xbd, 0x1e, 0x50, 0x83, 0x84, 0xe8, 0x3b, 0xda, 0xd1, 0x73, 0xe5, 0xa4, 0x30, 0x85, 0x98, 0x1b, - 0xf9, 0x0d, 0xea, 0xca, 0x53, 0x60, 0x82, 0x71, 0xcd, 0x96, 0x5c, 0xe2, 0x01, 0xf6, 0x32, 0x87, - 0x2b, 0x98, 0xe5, 0x2b, 0x98, 0x0c, 0xf9, 0xe8, 0xca, 0xa5, 0x8f, 0xfc, 0x9f, 0x48, 0x24, 0x58, - 0x85, 0x07, 0x7c, 0x69, 0x04, 0xc0, 0xa3, 0xef, 0x64, 0x44, 0x17, 0x26, 0x7d, 0x09, 0xf8, 0x1c, - 0x1c, 0xe8, 0xb6, 0x97, 0x81, 0xe4, 0xd2, 0x97, 0xe7, 0x4b, 0xb2, 0x30, 0xb3, 0xa8, 0x6f, 0x6e, - 0xfa, 0x9d, 0xe4, 0xaf, 0x0a, 0x76, 0x92, 0xd1, 0xee, 0x00, 0xae, 0x9d, 0xbb, 0x6b, 0x59, 0xd8, - 0xf0, 0x2a, 0xc5, 0x9a, 0x53, 0x4f, 0xaa, 0x72, 0x03, 0x1c, 0xf5, 0xc6, 0x85, 0x70, 0x47, 0x39, - 0xa5, 0xf6, 0x26, 0xa3, 0x6f, 0x09, 0xef, 0x6a, 0x79, 0x12, 0x0d, 0x57, 0x29, 0xa2, 0x01, 0xde, - 0x01, 0xb3, 0xdb, 0x34, 0x37, 0x99, 0xfa, 0x7b, 0x9d, 0xe5, 0xc9, 0x9e, 0x60, 0xc0, 0x6b, 0xd8, - 0xb6, 0xb5, 0x2d, 0xac, 0xf2, 0x99, 0x7b, 0x9a, 0xaf, 0x9c, 0xe4, 0x6a, 0x2b, 0xb1, 0x0d, 0x32, - 0x81, 0x9a, 0x8c, 0x41, 0x3b, 0xce, 0x40, 0x76, 0x49, 0xef, 0x60, 0xf4, 0x4b, 0x12, 0x4c, 0xa9, - 0xb8, 0x65, 0x1a, 0x2d, 0xf7, 0x2d, 0xe4, 0x1c, 0xf4, 0x4f, 0x19, 0xd1, 0x2b, 0x1d, 0x5d, 0x3a, - 0xf3, 0x3e, 0x8d, 0x88, 0x76, 0x23, 0x76, 0x75, 0x63, 0x2c, 0xa9, 0x31, 0x5c, 0xc0, 0xe1, 0x4e, - 0x3d, 0x36, 0x37, 0x3b, 0xa6, 0xc6, 0x2d, 0x7e, 0xf5, 0x9a, 0x42, 0x37, 0x42, 0xc1, 0x3b, 0x03, - 0x62, 0x3a, 0xeb, 0xba, 0x61, 0xf8, 0x87, 0x8c, 0xf7, 0xa5, 0xf3, 0xfb, 0xb6, 0xb1, 0x71, 0x5a, - 0x48, 0xdd, 0x59, 0xe9, 0x11, 0x9a, 0x7d, 0x3d, 0xcc, 0x9d, 0xbf, 0xe4, 0x60, 0x9b, 0xe5, 0x62, - 0xc5, 0x66, 0xd5, 0x9e, 0xd4, 0x50, 0x94, 0xe5, 0xb8, 0x78, 0x2e, 0x31, 0x05, 0x26, 0x13, 0xf5, - 0xca, 0x10, 0x33, 0xc0, 0xe3, 0x50, 0xa8, 0xd6, 0x16, 0xcb, 0xc4, 0x57, 0xcd, 0xf3, 0xfe, 0xd9, - 0x42, 0x2f, 0x90, 0x61, 0x86, 0x38, 0x93, 0x78, 0x28, 0x5c, 0x2b, 0x30, 0x1f, 0x41, 0x5f, 0x14, - 0xf6, 0x63, 0x23, 0x55, 0x0e, 0x17, 0x10, 0x2d, 0xe8, 0x4d, 0xbd, 0xd3, 0x2b, 0xe8, 0x9c, 0xda, - 0x93, 0xda, 0x07, 0x10, 0xb9, 0x2f, 0x20, 0xbf, 0x27, 0xe4, 0xcc, 0x36, 0x88, 0xbb, 0xc3, 0x42, - 0xe5, 0xf7, 0x65, 0x98, 0x76, 0x27, 0x29, 0x1e, 0x28, 0x35, 0x0e, 0x14, 0xd3, 0xe8, 0x5c, 0x0a, - 0x96, 0x45, 0xbc, 0xd7, 0x44, 0x8d, 0xe4, 0xaf, 0x84, 0x67, 0xee, 0x44, 0x44, 0x21, 0x5e, 0xc6, - 0x84, 0xdf, 0x7b, 0x84, 0xe6, 0xf3, 0x03, 0x98, 0x3b, 0x2c, 0xf8, 0xbe, 0x9a, 0x83, 0xfc, 0x46, - 0x97, 0x20, 0xf7, 0x52, 0x59, 0x24, 0x62, 0xf9, 0xbe, 0x83, 0x0c, 0xae, 0x99, 0xd5, 0x31, 0x5b, - 0x5a, 0x67, 0x3d, 0x38, 0x11, 0x16, 0x24, 0x28, 0xb7, 0x33, 0xdf, 0x46, 0x7a, 0xdc, 0xee, 0xfa, - 0xd8, 0x60, 0xde, 0x44, 0x46, 0xa1, 0x43, 0x23, 0x37, 0xc1, 0xb1, 0xb6, 0x6e, 0x6b, 0xe7, 0x3b, - 0xb8, 0x6c, 0xb4, 0xac, 0x4b, 0x54, 0x1c, 0x6c, 0x5a, 0xb5, 0xef, 0x83, 0x72, 0x27, 0xe4, 0x6c, - 0xe7, 0x52, 0x87, 0xce, 0x13, 0xc3, 0x67, 0x4c, 0x22, 0x8b, 0xaa, 0xbb, 0xd9, 0x55, 0xfa, 0x57, - 0xd8, 0x45, 0x69, 0x42, 0xf0, 0x3e, 0xe7, 0x27, 0x41, 0xde, 0xb4, 0xf4, 0x2d, 0x9d, 0xde, 0xcf, - 0x33, 0xb7, 0x2f, 0x66, 0x1d, 0x35, 0x05, 0x6a, 0x24, 0x8b, 0xca, 0xb2, 0x2a, 0x4f, 0x81, 0x29, - 0x7d, 0x47, 0xdb, 0xc2, 0xf7, 0xea, 0x06, 0x3d, 0xd1, 0x37, 0x77, 0xeb, 0xa9, 0x7d, 0xc7, 0x67, - 0xd8, 0x77, 0x35, 0xc8, 0x8a, 0xde, 0x23, 0x89, 0x06, 0xd6, 0x21, 0x75, 0xa3, 0xa0, 0x8e, 0xe5, - 0x5e, 0x6b, 0xf4, 0x0a, 0xa1, 0x90, 0x37, 0xd1, 0x6c, 0xa5, 0x3f, 0x78, 0x7f, 0x56, 0x82, 0xc9, - 0x45, 0xf3, 0xa2, 0x41, 0x14, 0xfd, 0x36, 0x31, 0x5b, 0xb7, 0xcf, 0x21, 0x47, 0xfe, 0xda, 0xc8, - 0xd8, 0x13, 0x0d, 0xa4, 0xb6, 0x5e, 0x91, 0x11, 0x30, 0xc4, 0xb6, 0x1c, 0xc1, 0xcb, 0xfc, 0xe2, - 0xca, 0x49, 0x5f, 0xae, 0x7f, 0x2a, 0x43, 0x76, 0xd1, 0x32, 0xbb, 0xe8, 0x4d, 0x99, 0x04, 0x2e, - 0x0b, 0x6d, 0xcb, 0xec, 0x36, 0xc8, 0x6d, 0x5c, 0xc1, 0x31, 0x8e, 0x70, 0x9a, 0x72, 0x1b, 0x4c, - 0x76, 0x4d, 0x5b, 0x77, 0xbc, 0x69, 0xc4, 0xdc, 0xad, 0x8f, 0xe9, 0xdb, 0x9a, 0xd7, 0x59, 0x26, - 0xd5, 0xcf, 0xee, 0xf6, 0xda, 0x44, 0x84, 0xae, 0x5c, 0x5c, 0x31, 0x7a, 0x37, 0x92, 0xf5, 0xa4, - 0xa2, 0x17, 0x86, 0x91, 0x7c, 0x1a, 0x8f, 0xe4, 0x63, 0xfb, 0x48, 0xd8, 0x32, 0xbb, 0x23, 0xd9, - 0x64, 0x7c, 0x99, 0x8f, 0xea, 0xd3, 0x39, 0x54, 0x6f, 0x14, 0x2a, 0x33, 0x7d, 0x44, 0xdf, 0x93, - 0x05, 0x20, 0x66, 0xc6, 0x86, 0x3b, 0x01, 0x12, 0xb3, 0xb1, 0x7e, 0x21, 0x1b, 0x92, 0x65, 0x91, - 0x97, 0xe5, 0xe3, 0x23, 0xac, 0x18, 0x42, 0x3e, 0x42, 0xa2, 0x45, 0xc8, 0xed, 0xba, 0x9f, 0x99, - 0x44, 0x05, 0x49, 0x90, 0x57, 0x95, 0xfe, 0x89, 0xfe, 0x24, 0x03, 0x39, 0x92, 0xa0, 0x9c, 0x06, - 0x20, 0x03, 0x3b, 0x3d, 0x10, 0x94, 0x21, 0x43, 0x78, 0x28, 0x85, 0x68, 0xab, 0xde, 0x66, 0x9f, - 0xa9, 0xc9, 0x1c, 0x24, 0xb8, 0x7f, 0x93, 0xe1, 0x9e, 0xd0, 0x62, 0x06, 0x40, 0x28, 0xc5, 0xfd, - 0x9b, 0xbc, 0xad, 0xe2, 0x4d, 0x1a, 0x28, 0x39, 0xab, 0x06, 0x09, 0xfe, 0xdf, 0xab, 0xfe, 0xf5, - 0x5a, 0xde, 0xdf, 0x24, 0xc5, 0x9d, 0x0c, 0x13, 0xb5, 0x5c, 0x08, 0x8a, 0xc8, 0x93, 0x4c, 0xbd, - 0xc9, 0xe8, 0xd5, 0xbe, 0xda, 0x2c, 0x72, 0x6a, 0x73, 0x4b, 0x02, 0xf1, 0xa6, 0xaf, 0x3c, 0x5f, - 0xce, 0xc1, 0x54, 0xd5, 0x6c, 0x33, 0xdd, 0x09, 0x4d, 0x18, 0x3f, 0x96, 0x4b, 0x34, 0x61, 0xf4, - 0x69, 0x44, 0x28, 0xc8, 0xdd, 0xbc, 0x82, 0x88, 0x51, 0x08, 0xeb, 0x87, 0xb2, 0x00, 0x79, 0xa2, - 0xbd, 0xfb, 0xef, 0x6d, 0x8a, 0x23, 0x41, 0x44, 0xab, 0xb2, 0x3f, 0xff, 0xc3, 0xe9, 0xd8, 0x7f, - 0x85, 0x1c, 0xa9, 0x60, 0xcc, 0xee, 0x0e, 0x5f, 0x51, 0x29, 0xbe, 0xa2, 0x72, 0x7c, 0x45, 0xb3, - 0xbd, 0x15, 0x4d, 0xb2, 0x0e, 0x10, 0xa5, 0x21, 0xe9, 0xeb, 0xf8, 0x3f, 0x4e, 0x00, 0x54, 0xb5, - 0x3d, 0x7d, 0x8b, 0xee, 0x0e, 0x7f, 0xce, 0x9b, 0xff, 0xb0, 0x7d, 0xdc, 0xff, 0x16, 0x1a, 0x08, - 0x6f, 0x83, 0x09, 0x36, 0xee, 0xb1, 0x8a, 0x5c, 0xcd, 0x55, 0x24, 0xa0, 0x42, 0xcd, 0xd2, 0x07, - 0x1c, 0xd5, 0xcb, 0xcf, 0x5d, 0x31, 0x2b, 0xf5, 0x5c, 0x31, 0xdb, 0x7f, 0x0f, 0x22, 0xe2, 0xe2, - 0x59, 0xf4, 0x4e, 0x61, 0x8f, 0xfe, 0x10, 0x3f, 0xa1, 0x1a, 0x45, 0x34, 0xc1, 0x27, 0xc1, 0x84, - 0xe9, 0x6f, 0x68, 0xcb, 0x91, 0xeb, 0x60, 0x15, 0x63, 0xd3, 0x54, 0xbd, 0x9c, 0x82, 0x9b, 0x5f, - 0x42, 0x7c, 0x8c, 0xe5, 0xd0, 0xcc, 0xc9, 0x65, 0x2f, 0xe8, 0x94, 0x5b, 0x8f, 0x73, 0xba, 0xb3, - 0xbd, 0xaa, 0x1b, 0x17, 0x6c, 0xf4, 0x9f, 0xc5, 0x2c, 0xc8, 0x10, 0xfe, 0x52, 0x32, 0xfc, 0xf9, - 0x98, 0x1d, 0x75, 0x1e, 0xb5, 0x3b, 0xa3, 0xa8, 0xf4, 0xe7, 0x36, 0x02, 0xc0, 0xdb, 0x21, 0x4f, - 0x19, 0x65, 0x9d, 0xe8, 0x99, 0x48, 0xfc, 0x7c, 0x4a, 0x2a, 0xfb, 0x03, 0xbd, 0xc3, 0xc7, 0xf1, - 0x2c, 0x87, 0xe3, 0xc2, 0x81, 0x38, 0x4b, 0x1d, 0xd2, 0x33, 0x4f, 0x84, 0x09, 0x26, 0x69, 0x65, - 0x2e, 0xdc, 0x8a, 0x0b, 0x47, 0x14, 0x80, 0xfc, 0x9a, 0xb9, 0x87, 0x1b, 0x66, 0x21, 0xe3, 0x3e, - 0xbb, 0xfc, 0x35, 0xcc, 0x82, 0x84, 0x5e, 0x3e, 0x09, 0x93, 0x7e, 0xb4, 0x9f, 0xcf, 0x4a, 0x50, - 0x28, 0x59, 0x58, 0x73, 0xf0, 0x92, 0x65, 0xee, 0xd0, 0x1a, 0x89, 0x7b, 0x87, 0xfe, 0xa6, 0xb0, - 0x8b, 0x87, 0x1f, 0x85, 0xa7, 0xb7, 0xb0, 0x08, 0x2c, 0xe9, 0x22, 0xa4, 0xe4, 0x2d, 0x42, 0xa2, - 0x37, 0x0a, 0xb9, 0x7c, 0x88, 0x96, 0x92, 0x7e, 0x53, 0xfb, 0xa4, 0x04, 0xb9, 0x52, 0xc7, 0x34, - 0x70, 0xf8, 0x08, 0xd3, 0xc0, 0xb3, 0x32, 0xfd, 0x77, 0x22, 0xd0, 0xb3, 0x24, 0x51, 0x5b, 0x23, - 0x10, 0x80, 0x5b, 0xb6, 0xa0, 0x6c, 0xc5, 0x06, 0xa9, 0x58, 0xd2, 0xe9, 0x0b, 0xf4, 0xeb, 0x12, - 0x4c, 0xd1, 0xb8, 0x38, 0xc5, 0x4e, 0x07, 0x3d, 0x26, 0x10, 0x6a, 0x9f, 0x88, 0x49, 0xe8, 0xf7, - 0x84, 0x5d, 0xf4, 0xfd, 0x5a, 0xf9, 0xb4, 0x13, 0x04, 0x08, 0x4a, 0xe6, 0x31, 0x2e, 0xb6, 0x97, - 0x36, 0x90, 0xa1, 0xf4, 0x45, 0xfd, 0x17, 0x92, 0x6b, 0x00, 0x18, 0x17, 0xd6, 0x2d, 0xbc, 0xa7, - 0xe3, 0x8b, 0xe8, 0xca, 0x40, 0xd8, 0xfb, 0x83, 0x7e, 0xbc, 0x5e, 0x78, 0x11, 0x27, 0x44, 0x32, - 0x72, 0x2b, 0x6b, 0xba, 0x13, 0x64, 0x62, 0xbd, 0x78, 0x6f, 0x24, 0x96, 0x10, 0x19, 0x35, 0x9c, - 0x5d, 0x70, 0xcd, 0x26, 0x9a, 0x8b, 0xf4, 0x05, 0xfb, 0xfe, 0x09, 0x98, 0xdc, 0x30, 0xec, 0x6e, - 0x47, 0xb3, 0xb7, 0xd1, 0x77, 0x65, 0xc8, 0xd3, 0xdb, 0xc2, 0xd0, 0x8f, 0x71, 0xb1, 0x05, 0x7e, - 0x66, 0x17, 0x5b, 0x9e, 0x0b, 0x0e, 0x7d, 0xe9, 0x7f, 0x99, 0x39, 0x7a, 0x8f, 0x2c, 0x3a, 0x49, - 0xf5, 0x0a, 0x0d, 0x5d, 0x1b, 0xdf, 0xff, 0x38, 0x7b, 0x57, 0x6f, 0x39, 0xbb, 0x96, 0x7f, 0x35, - 0xf6, 0x13, 0xc4, 0xa8, 0xac, 0xd3, 0xbf, 0x54, 0xff, 0x77, 0xa4, 0xc1, 0x04, 0x4b, 0xdc, 0xb7, - 0x9d, 0xb4, 0xff, 0xfc, 0xed, 0x49, 0xc8, 0x6b, 0x96, 0xa3, 0xdb, 0x0e, 0xdb, 0x60, 0x65, 0x6f, - 0x6e, 0x77, 0x49, 0x9f, 0x36, 0xac, 0x8e, 0x17, 0x85, 0xc4, 0x4f, 0x40, 0xbf, 0x2f, 0x34, 0x7f, - 0x8c, 0xaf, 0x79, 0x32, 0xc8, 0xef, 0x1d, 0x62, 0x8d, 0xfa, 0x72, 0xb8, 0x4c, 0x2d, 0x36, 0xca, - 0x4d, 0x1a, 0xb4, 0xc2, 0x8f, 0x4f, 0xd1, 0x46, 0x6f, 0x97, 0x43, 0xeb, 0x77, 0x97, 0xb8, 0x31, - 0x82, 0x49, 0x31, 0x18, 0x23, 0xfc, 0x84, 0x98, 0xdd, 0x6a, 0x6e, 0x11, 0x56, 0x16, 0x5f, 0x84, - 0xfd, 0x1d, 0xe1, 0xdd, 0x24, 0x5f, 0x94, 0x03, 0xd6, 0x00, 0xe3, 0x6e, 0x13, 0x7a, 0xaf, 0xd0, - 0xce, 0xd0, 0xa0, 0x92, 0x0e, 0x11, 0xb6, 0xd7, 0x4d, 0xc0, 0xc4, 0xb2, 0xd6, 0xe9, 0x60, 0xeb, - 0x92, 0x3b, 0x24, 0x15, 0x3c, 0x0e, 0xd7, 0x34, 0x43, 0xdf, 0xc4, 0xb6, 0x13, 0xdf, 0x59, 0xbe, - 0x53, 0x38, 0x52, 0x2d, 0x2b, 0x63, 0xbe, 0x97, 0x7e, 0x84, 0xcc, 0x6f, 0x86, 0xac, 0x6e, 0x6c, - 0x9a, 0xac, 0xcb, 0xec, 0x5d, 0xb5, 0xf7, 0x7e, 0x26, 0x53, 0x17, 0x92, 0x51, 0x30, 0x58, 0xad, - 0x20, 0x17, 0xe9, 0xf7, 0x9c, 0xbf, 0x9b, 0x85, 0x59, 0x8f, 0x89, 0x8a, 0xd1, 0xc6, 0x0f, 0x84, - 0x97, 0x62, 0x5e, 0x90, 0x15, 0x3d, 0x0e, 0xd6, 0x5b, 0x1f, 0x42, 0x2a, 0x42, 0xa4, 0x0d, 0x80, - 0x96, 0xe6, 0xe0, 0x2d, 0xd3, 0xd2, 0xfd, 0xfe, 0xf0, 0xc9, 0x49, 0xa8, 0x95, 0xe8, 0xdf, 0x97, - 0xd4, 0x10, 0x1d, 0xe5, 0x4e, 0x98, 0xc6, 0xfe, 0xf9, 0x7b, 0x6f, 0xa9, 0x26, 0x16, 0xaf, 0x70, - 0x7e, 0xf4, 0x17, 0x42, 0xa7, 0xce, 0x44, 0xaa, 0x99, 0x0c, 0xb3, 0xe6, 0x70, 0x6d, 0x68, 0xa3, - 0xba, 0x56, 0x54, 0xeb, 0x2b, 0xc5, 0xd5, 0xd5, 0x4a, 0x75, 0xd9, 0x0f, 0xfc, 0xa2, 0xc0, 0xdc, - 0x62, 0xed, 0x5c, 0x35, 0x14, 0x99, 0x27, 0x8b, 0xd6, 0x61, 0xd2, 0x93, 0x57, 0x3f, 0x5f, 0xcc, - 0xb0, 0xcc, 0x98, 0x2f, 0x66, 0x28, 0xc9, 0x35, 0xce, 0xf4, 0x96, 0xef, 0xa0, 0x43, 0x9e, 0xd1, - 0x1f, 0x6b, 0x90, 0x23, 0x6b, 0xea, 0xe8, 0xad, 0x64, 0x1b, 0xb0, 0xdb, 0xd1, 0x5a, 0x18, 0xed, - 0x24, 0xb0, 0xc6, 0xbd, 0xab, 0x13, 0xa4, 0x7d, 0x57, 0x27, 0x90, 0x47, 0x66, 0xf5, 0x1d, 0xef, - 0xb7, 0x8e, 0xaf, 0xd2, 0x2c, 0xfc, 0x01, 0xad, 0xd8, 0xdd, 0x15, 0xba, 0xfc, 0xcf, 0xd8, 0x8c, - 0x50, 0xc9, 0x68, 0x9e, 0x92, 0x59, 0xa2, 0x62, 0xfb, 0x30, 0x71, 0x1c, 0x8d, 0xe1, 0x7a, 0xef, - 0x2c, 0xe4, 0xea, 0xdd, 0x8e, 0xee, 0xa0, 0x17, 0x4b, 0x23, 0xc1, 0x8c, 0x5e, 0x77, 0x21, 0x0f, - 0xbc, 0xee, 0x22, 0xd8, 0x75, 0xcd, 0x0a, 0xec, 0xba, 0x36, 0xf0, 0x03, 0x0e, 0xbf, 0xeb, 0x7a, - 0x1b, 0x0b, 0xde, 0x46, 0xf7, 0x6c, 0x1f, 0xdb, 0x47, 0xa4, 0xa4, 0x5a, 0x7d, 0xa2, 0x02, 0x9e, - 0x79, 0x22, 0x0b, 0x4e, 0x06, 0x90, 0x5f, 0xa8, 0x35, 0x1a, 0xb5, 0xb5, 0xc2, 0x11, 0x12, 0xd5, - 0xa6, 0xb6, 0x4e, 0x43, 0xc5, 0x54, 0xaa, 0xd5, 0xb2, 0x5a, 0x90, 0x48, 0xb8, 0xb4, 0x4a, 0x63, - 0xb5, 0x5c, 0x90, 0xf9, 0xd8, 0xe7, 0xb1, 0xe6, 0x37, 0x5f, 0x76, 0x9a, 0xea, 0x25, 0x66, 0x88, - 0x47, 0xf3, 0x93, 0xbe, 0x72, 0xfd, 0x86, 0x0c, 0xb9, 0x35, 0x6c, 0x6d, 0x61, 0xf4, 0x33, 0x09, - 0x36, 0xf9, 0x36, 0x75, 0xcb, 0xa6, 0xc1, 0xe5, 0x82, 0x4d, 0xbe, 0x70, 0x9a, 0x72, 0x1d, 0xcc, - 0xda, 0xb8, 0x65, 0x1a, 0x6d, 0x2f, 0x13, 0xed, 0x8f, 0xf8, 0x44, 0xfe, 0xde, 0x79, 0x01, 0xc8, - 0x08, 0xa3, 0x23, 0xd9, 0xa9, 0x4b, 0x02, 0x4c, 0xbf, 0x52, 0xd3, 0x07, 0xe6, 0x5b, 0xb2, 0xfb, - 0x53, 0xf7, 0x12, 0x7a, 0x91, 0xf0, 0xee, 0xeb, 0x4d, 0x90, 0x27, 0x6a, 0xea, 0x8d, 0xd1, 0xfd, - 0xfb, 0x63, 0x96, 0x47, 0x59, 0x80, 0x63, 0x36, 0xee, 0xe0, 0x96, 0x83, 0xdb, 0x6e, 0xd3, 0x55, - 0x07, 0x76, 0x0a, 0xfb, 0xb3, 0xa3, 0x3f, 0x0b, 0x03, 0x78, 0x07, 0x0f, 0xe0, 0xf5, 0x7d, 0x44, - 0xe9, 0x56, 0x28, 0xda, 0x56, 0x76, 0xab, 0x51, 0xef, 0x98, 0xfe, 0xa2, 0xb8, 0xf7, 0xee, 0x7e, - 0xdb, 0x76, 0x76, 0x3a, 0xe4, 0x1b, 0x3b, 0x60, 0xe0, 0xbd, 0x2b, 0xf3, 0x30, 0xa1, 0x19, 0x97, - 0xc8, 0xa7, 0x6c, 0x4c, 0xad, 0xbd, 0x4c, 0xe8, 0xe5, 0x3e, 0xf2, 0x77, 0x71, 0xc8, 0x3f, 0x5e, - 0x8c, 0xdd, 0xf4, 0x81, 0xff, 0xf9, 0x09, 0xc8, 0xad, 0x6b, 0xb6, 0x83, 0xd1, 0xff, 0x25, 0x8b, - 0x22, 0x7f, 0x3d, 0xcc, 0x6d, 0x9a, 0xad, 0x5d, 0x1b, 0xb7, 0xf9, 0x46, 0xd9, 0x93, 0x3a, 0x0a, - 0xcc, 0x95, 0x1b, 0xa1, 0xe0, 0x25, 0x32, 0xb2, 0xde, 0x36, 0xfc, 0xbe, 0x74, 0x12, 0x49, 0xdb, - 0x5e, 0xd7, 0x2c, 0xa7, 0xb6, 0x49, 0xd2, 0xfc, 0x48, 0xda, 0xe1, 0x44, 0x0e, 0xfa, 0x7c, 0x0c, - 0xf4, 0x13, 0xd1, 0xd0, 0x4f, 0x0a, 0x40, 0xaf, 0x14, 0x61, 0x72, 0x53, 0xef, 0x60, 0xf2, 0xc3, - 0x14, 0xf9, 0xa1, 0xdf, 0x98, 0x44, 0x64, 0xef, 0x8f, 0x49, 0x4b, 0x7a, 0x07, 0xab, 0xfe, 0x6f, - 0xde, 0x44, 0x06, 0x82, 0x89, 0xcc, 0x2a, 0xf5, 0xa7, 0x75, 0x0d, 0x2f, 0x43, 0xdb, 0xc1, 0xde, - 0xe2, 0x9b, 0xc1, 0x0e, 0xb7, 0xb4, 0x35, 0x47, 0x23, 0x60, 0xcc, 0xa8, 0xe4, 0x99, 0xf7, 0x0b, - 0x91, 0x7b, 0xfd, 0x42, 0x9e, 0x23, 0x27, 0xeb, 0x11, 0x3d, 0x66, 0x23, 0x5a, 0xd4, 0x79, 0x0f, - 0x20, 0x6a, 0x29, 0xfa, 0xef, 0x2e, 0x30, 0x2d, 0xcd, 0xc2, 0xce, 0x7a, 0xd8, 0x13, 0x23, 0xa7, - 0xf2, 0x89, 0xc4, 0x95, 0xcf, 0xae, 0x6b, 0x3b, 0x98, 0x14, 0x56, 0x72, 0xbf, 0x31, 0x17, 0xad, - 0x7d, 0xe9, 0x41, 0xff, 0x9b, 0x1b, 0x75, 0xff, 0xdb, 0xaf, 0x8e, 0xe9, 0x37, 0xc3, 0x57, 0x65, - 0x41, 0x2e, 0xed, 0x3a, 0x8f, 0xea, 0xee, 0xf7, 0x7b, 0xc2, 0x7e, 0x2e, 0xac, 0x3f, 0x8b, 0xbc, - 0x68, 0x7e, 0x4c, 0xbd, 0x6f, 0x42, 0x2d, 0x11, 0xf3, 0xa7, 0x89, 0xaa, 0xdb, 0x18, 0xee, 0x35, - 0x90, 0x7d, 0x07, 0xcb, 0x07, 0x33, 0x07, 0x37, 0xcd, 0x11, 0xed, 0x9f, 0x42, 0x3d, 0x83, 0xff, - 0xee, 0x75, 0x3c, 0x59, 0x2e, 0x56, 0x1f, 0xd9, 0x5e, 0x27, 0xa2, 0x9c, 0x51, 0xe9, 0x0b, 0x7a, - 0x89, 0xb0, 0xdb, 0x39, 0x15, 0x5b, 0xac, 0x2b, 0x61, 0x32, 0x9b, 0x4a, 0xec, 0x32, 0xd1, 0x98, - 0x62, 0xd3, 0x07, 0xec, 0x9b, 0x61, 0x57, 0xc1, 0xe2, 0x81, 0x11, 0x43, 0xaf, 0x10, 0xde, 0x8e, - 0xa2, 0xd5, 0x1e, 0xb0, 0x5e, 0x98, 0x4c, 0xde, 0x62, 0x9b, 0x55, 0xb1, 0x05, 0xa7, 0x2f, 0xf1, - 0x6f, 0xc8, 0x90, 0xa7, 0x5b, 0x90, 0xe8, 0x0d, 0x99, 0x04, 0xb7, 0xb0, 0x3b, 0xbc, 0x0b, 0xa1, - 0xff, 0x9e, 0x64, 0xcd, 0x81, 0x73, 0x35, 0xcc, 0x26, 0x72, 0x35, 0xe4, 0xcf, 0x71, 0x0a, 0xb4, - 0x23, 0x5a, 0xc7, 0x94, 0xa7, 0x93, 0x49, 0x5a, 0x58, 0x5f, 0x86, 0xd2, 0xc7, 0xfb, 0x17, 0x73, - 0x30, 0x43, 0x8b, 0x3e, 0xa7, 0xb7, 0xb7, 0xb0, 0x83, 0xde, 0x2e, 0xfd, 0xe0, 0xa0, 0xae, 0x54, - 0x61, 0xe6, 0x22, 0x61, 0x7b, 0x55, 0xbb, 0x64, 0xee, 0x3a, 0x6c, 0xe5, 0xe2, 0xc6, 0xd8, 0x75, - 0x0f, 0x5a, 0xcf, 0x79, 0xfa, 0x87, 0xca, 0xfd, 0xef, 0xca, 0x98, 0x2e, 0xf8, 0x53, 0x07, 0xae, - 0x3c, 0x31, 0xb2, 0xc2, 0x49, 0xca, 0x49, 0xc8, 0xef, 0xe9, 0xf8, 0x62, 0xa5, 0xcd, 0xac, 0x5b, - 0xf6, 0x86, 0xfe, 0x50, 0x78, 0xdf, 0x36, 0x0c, 0x37, 0xe3, 0x25, 0x5d, 0x2d, 0x14, 0xdb, 0xbd, - 0x1d, 0xc8, 0xd6, 0x18, 0xce, 0x14, 0xf3, 0x97, 0x75, 0x96, 0x12, 0x28, 0x62, 0x94, 0xe1, 0xcc, - 0x87, 0xf2, 0x88, 0x3d, 0xb1, 0x42, 0x05, 0x30, 0xe2, 0x7b, 0x3c, 0xc5, 0xe2, 0x4b, 0x0c, 0x28, - 0x3a, 0x7d, 0xc9, 0xbf, 0x5a, 0x86, 0xa9, 0x3a, 0x76, 0x96, 0x74, 0xdc, 0x69, 0xdb, 0xc8, 0x3a, - 0xb8, 0x69, 0x74, 0x33, 0xe4, 0x37, 0x09, 0xb1, 0x41, 0xe7, 0x16, 0x58, 0x36, 0xf4, 0x2a, 0x49, - 0x74, 0x47, 0x98, 0xad, 0xbe, 0x79, 0xdc, 0x8e, 0x04, 0x26, 0x31, 0x8f, 0xde, 0xf8, 0x92, 0xc7, - 0x10, 0xd8, 0x56, 0x86, 0x19, 0x76, 0xbb, 0x5f, 0xb1, 0xa3, 0x6f, 0x19, 0x68, 0x77, 0x04, 0x2d, - 0x44, 0xb9, 0x05, 0x72, 0x9a, 0x4b, 0x8d, 0x6d, 0xbd, 0xa2, 0xbe, 0x9d, 0x27, 0x29, 0x4f, 0xa5, - 0x19, 0x13, 0x84, 0x91, 0x0c, 0x14, 0xdb, 0xe3, 0x79, 0x8c, 0x61, 0x24, 0x07, 0x16, 0x9e, 0x3e, - 0x62, 0x5f, 0x92, 0xe1, 0x38, 0x63, 0xe0, 0x2c, 0xb6, 0x1c, 0xbd, 0xa5, 0x75, 0x28, 0x72, 0x0f, - 0x65, 0x46, 0x01, 0xdd, 0x0a, 0xcc, 0xee, 0x85, 0xc9, 0x32, 0x08, 0xcf, 0xf4, 0x85, 0x90, 0x63, - 0x40, 0xe5, 0x7f, 0x4c, 0x10, 0x8e, 0x8f, 0x93, 0x2a, 0x47, 0x73, 0x8c, 0xe1, 0xf8, 0x84, 0x99, - 0x48, 0x1f, 0xe2, 0x17, 0xb2, 0xd0, 0x3c, 0x41, 0xf7, 0xf9, 0x39, 0x61, 0x6c, 0x37, 0x60, 0x9a, - 0x60, 0x49, 0x7f, 0x64, 0xcb, 0x10, 0x31, 0x4a, 0xec, 0xf7, 0x3b, 0xec, 0xc2, 0x30, 0xff, 0x5f, - 0x35, 0x4c, 0x07, 0x9d, 0x03, 0x08, 0x3e, 0x85, 0x3b, 0xe9, 0x4c, 0x54, 0x27, 0x2d, 0x89, 0x75, - 0xd2, 0xaf, 0x17, 0x0e, 0x96, 0xd2, 0x9f, 0xed, 0x83, 0xab, 0x87, 0x58, 0x98, 0x8c, 0xc1, 0xa5, - 0xa7, 0xaf, 0x17, 0x2f, 0xcf, 0xf6, 0x5e, 0xe3, 0xfe, 0xa1, 0x91, 0xcc, 0xa7, 0xc2, 0xfd, 0x81, - 0xdc, 0xd3, 0x1f, 0x1c, 0xc0, 0x92, 0xbe, 0x01, 0x8e, 0xd2, 0x22, 0x4a, 0x3e, 0x5b, 0x39, 0x1a, - 0x0a, 0xa2, 0x27, 0x19, 0x7d, 0x78, 0x08, 0x25, 0x18, 0x74, 0xc7, 0x7c, 0x5c, 0x27, 0x97, 0xcc, - 0xd8, 0x4d, 0xaa, 0x20, 0x87, 0x77, 0x35, 0xfd, 0xd7, 0xb3, 0xd4, 0xda, 0xdd, 0x20, 0x77, 0xba, - 0xa1, 0xbf, 0xcc, 0x8e, 0x62, 0x44, 0xb8, 0x1b, 0xb2, 0xc4, 0xc5, 0x5d, 0x8e, 0x5c, 0xd2, 0x08, - 0x8a, 0x0c, 0x2e, 0xdc, 0xc3, 0x0f, 0x38, 0x2b, 0x47, 0x54, 0xf2, 0xa7, 0x72, 0x23, 0x1c, 0x3d, - 0xaf, 0xb5, 0x2e, 0x6c, 0x59, 0xe6, 0x2e, 0xb9, 0xfd, 0xca, 0x64, 0xd7, 0x68, 0x91, 0xeb, 0x08, - 0xf9, 0x0f, 0xca, 0xad, 0x9e, 0xe9, 0x90, 0x1b, 0x64, 0x3a, 0xac, 0x1c, 0x61, 0xc6, 0x83, 0xf2, - 0x44, 0xbf, 0xd3, 0xc9, 0xc7, 0x76, 0x3a, 0x2b, 0x47, 0xbc, 0x6e, 0x47, 0x59, 0x84, 0xc9, 0xb6, - 0xbe, 0x47, 0xb6, 0xaa, 0xc9, 0xac, 0x6b, 0xd0, 0xd1, 0xe5, 0x45, 0x7d, 0x8f, 0x6e, 0x6c, 0xaf, - 0x1c, 0x51, 0xfd, 0x3f, 0x95, 0x65, 0x98, 0x22, 0xdb, 0x02, 0x84, 0xcc, 0x64, 0xa2, 0x63, 0xc9, - 0x2b, 0x47, 0xd4, 0xe0, 0x5f, 0xd7, 0xfa, 0xc8, 0x92, 0xb3, 0x1f, 0x77, 0x79, 0xdb, 0xed, 0x99, - 0x44, 0xdb, 0xed, 0xae, 0x2c, 0xe8, 0x86, 0xfb, 0x49, 0xc8, 0xb5, 0x88, 0x84, 0x25, 0x26, 0x61, - 0xfa, 0xaa, 0xdc, 0x01, 0xd9, 0x1d, 0xcd, 0xf2, 0x26, 0xcf, 0xd7, 0x0f, 0xa6, 0xbb, 0xa6, 0x59, - 0x17, 0x5c, 0x04, 0xdd, 0xbf, 0x16, 0x26, 0x20, 0x47, 0x04, 0xe7, 0x3f, 0xa0, 0x37, 0x65, 0xa9, - 0x19, 0x52, 0x32, 0x0d, 0x77, 0xd8, 0x6f, 0x98, 0xde, 0x01, 0x99, 0x3f, 0xcc, 0x8c, 0xc6, 0x82, - 0xec, 0x7b, 0xef, 0xb9, 0x1c, 0x79, 0xef, 0x79, 0xcf, 0x05, 0xbc, 0xd9, 0xde, 0x0b, 0x78, 0x83, - 0xe5, 0x83, 0xdc, 0x60, 0x47, 0x95, 0x3f, 0x1b, 0xc2, 0x74, 0xe9, 0x15, 0x44, 0xf4, 0x0c, 0xbc, - 0xa3, 0x1b, 0xa1, 0x3a, 0x7b, 0xaf, 0x09, 0x3b, 0xa5, 0xa4, 0x46, 0xcd, 0x00, 0xf6, 0xd2, 0xef, - 0x9b, 0x7e, 0x3b, 0x0b, 0xa7, 0xe8, 0x35, 0xcf, 0x7b, 0xb8, 0x61, 0xf2, 0xf7, 0x4d, 0xa2, 0x4f, - 0x8c, 0x44, 0x69, 0xfa, 0x0c, 0x38, 0x72, 0xdf, 0x01, 0x67, 0xdf, 0x21, 0xe5, 0xec, 0x80, 0x43, - 0xca, 0xb9, 0x64, 0x2b, 0x87, 0xef, 0x0b, 0xeb, 0xcf, 0x3a, 0xaf, 0x3f, 0xb7, 0x47, 0x00, 0xd4, - 0x4f, 0x2e, 0x23, 0xb1, 0x6f, 0xde, 0xea, 0x6b, 0x4a, 0x9d, 0xd3, 0x94, 0xbb, 0x86, 0x67, 0x24, - 0x7d, 0x6d, 0xf9, 0x83, 0x2c, 0x5c, 0x16, 0x30, 0x53, 0xc5, 0x17, 0x99, 0xa2, 0x7c, 0x76, 0x24, - 0x8a, 0x92, 0x3c, 0x06, 0x42, 0xda, 0x1a, 0xf3, 0x27, 0xc2, 0x67, 0x87, 0x7a, 0x81, 0xf2, 0x65, - 0x13, 0xa1, 0x2c, 0x27, 0x21, 0x4f, 0x7b, 0x18, 0x06, 0x0d, 0x7b, 0x4b, 0xd8, 0xdd, 0x88, 0x9d, - 0x38, 0x12, 0xe5, 0x6d, 0x0c, 0xfa, 0xc3, 0xd6, 0x35, 0x1a, 0xbb, 0x96, 0x51, 0x31, 0x1c, 0x13, - 0xfd, 0xdc, 0x48, 0x14, 0xc7, 0xf7, 0x86, 0x93, 0x87, 0xf1, 0x86, 0x1b, 0x6a, 0x95, 0xc3, 0xab, - 0xc1, 0xa1, 0xac, 0x72, 0x44, 0x14, 0x9e, 0x3e, 0x7e, 0x6f, 0x91, 0xe1, 0x24, 0x9b, 0x6c, 0x2d, - 0xf0, 0x16, 0x22, 0xba, 0x6f, 0x14, 0x40, 0x1e, 0xf7, 0xcc, 0x24, 0x76, 0xcb, 0x19, 0x79, 0xe1, - 0x4f, 0x4a, 0xc5, 0xde, 0xef, 0xc0, 0x4d, 0x07, 0x7b, 0x38, 0x1c, 0x09, 0x52, 0x62, 0xd7, 0x3a, - 0x24, 0x60, 0x23, 0x7d, 0xcc, 0x7e, 0x55, 0x86, 0x3c, 0xbb, 0xde, 0x7f, 0x23, 0x15, 0x87, 0x09, - 0x3e, 0xca, 0xb3, 0xc0, 0x8e, 0x5c, 0xe2, 0x4b, 0xee, 0xd3, 0xdb, 0x8b, 0x3b, 0xa4, 0x5b, 0xec, - 0xbf, 0x25, 0xc1, 0x74, 0x1d, 0x3b, 0x25, 0xcd, 0xb2, 0x74, 0x6d, 0x6b, 0x54, 0x1e, 0xdf, 0xa2, - 0xde, 0xc3, 0xe8, 0xdb, 0x19, 0xd1, 0xf3, 0x34, 0xfe, 0x42, 0xb8, 0xc7, 0x6a, 0x44, 0x2c, 0xc1, - 0x47, 0x84, 0xce, 0xcc, 0x0c, 0xa2, 0x36, 0x06, 0x8f, 0x6d, 0x09, 0x26, 0xbc, 0xb3, 0x78, 0x37, - 0x73, 0xe7, 0x33, 0xb7, 0x9d, 0x1d, 0xef, 0x18, 0x0c, 0x79, 0xde, 0x7f, 0x06, 0x0c, 0xbd, 0x2c, - 0xa1, 0xa3, 0x7c, 0xfc, 0x41, 0xc2, 0x64, 0x6d, 0x2c, 0x89, 0x3b, 0xfc, 0x61, 0x1d, 0x1d, 0xfc, - 0xbd, 0x09, 0xb6, 0x1c, 0xb9, 0xaa, 0x39, 0xf8, 0x01, 0xf4, 0x39, 0x19, 0x26, 0xea, 0xd8, 0x71, - 0xc7, 0x5b, 0xee, 0x72, 0xd3, 0x61, 0x35, 0x5c, 0x09, 0xad, 0x78, 0x4c, 0xb1, 0x35, 0x8c, 0x7b, - 0x60, 0xaa, 0x6b, 0x99, 0x2d, 0x6c, 0xdb, 0x6c, 0xf5, 0x22, 0xec, 0xa8, 0xd6, 0x6f, 0xf4, 0x27, - 0xac, 0xcd, 0xaf, 0x7b, 0xff, 0xa8, 0xc1, 0xef, 0x49, 0xcd, 0x00, 0x4a, 0x89, 0x55, 0x70, 0xdc, - 0x66, 0x40, 0x5c, 0xe1, 0xe9, 0x03, 0xfd, 0x69, 0x19, 0x66, 0xea, 0xd8, 0xf1, 0xa5, 0x98, 0x60, - 0x93, 0x23, 0x1a, 0x5e, 0x0e, 0x4a, 0xf9, 0x60, 0x50, 0x8a, 0x5f, 0x0d, 0xc8, 0x4b, 0xd3, 0x27, - 0x36, 0xc6, 0xab, 0x01, 0xc5, 0x38, 0x18, 0xc3, 0xf1, 0xb5, 0xc7, 0xc2, 0x14, 0xe1, 0x85, 0x34, - 0xd8, 0x5f, 0xce, 0x06, 0x8d, 0xf7, 0xf3, 0x29, 0x35, 0xde, 0x3b, 0x21, 0xb7, 0xa3, 0x59, 0x17, - 0x6c, 0xd2, 0x70, 0xa7, 0x45, 0xcc, 0xf6, 0x35, 0x37, 0xbb, 0x4a, 0xff, 0xea, 0xef, 0xa7, 0x99, - 0x4b, 0xe6, 0xa7, 0xf9, 0x88, 0x94, 0x68, 0x24, 0xa4, 0x73, 0x87, 0x11, 0x36, 0xf9, 0x04, 0xe3, - 0x66, 0x4c, 0xd9, 0xe9, 0x2b, 0xc7, 0x43, 0x32, 0x4c, 0xba, 0xe3, 0x36, 0xb1, 0xc7, 0xcf, 0x1d, - 0x5c, 0x1d, 0xfa, 0x1b, 0xfa, 0x09, 0x7b, 0x60, 0x4f, 0x22, 0xa3, 0x33, 0xef, 0x13, 0xf4, 0xc0, - 0x71, 0x85, 0xa7, 0x8f, 0xc7, 0xdb, 0x28, 0x1e, 0xa4, 0x3d, 0xa0, 0xd7, 0xca, 0x20, 0x2f, 0x63, - 0x67, 0xdc, 0x56, 0xe4, 0x9b, 0x85, 0x43, 0x1c, 0x71, 0x02, 0x23, 0x3c, 0xcf, 0x2f, 0xe3, 0xd1, - 0x34, 0x20, 0xb1, 0xd8, 0x46, 0x42, 0x0c, 0xa4, 0x8f, 0xda, 0xbb, 0x28, 0x6a, 0x74, 0x73, 0xe1, - 0x67, 0x47, 0xd0, 0xab, 0x8e, 0x77, 0xe1, 0xc3, 0x13, 0x20, 0xa1, 0x71, 0x58, 0xed, 0xad, 0x5f, - 0xe1, 0x63, 0xb9, 0x8a, 0x0f, 0xdc, 0xc6, 0xbe, 0x8d, 0x5b, 0x17, 0x70, 0x1b, 0xfd, 0xd4, 0xc1, - 0xa1, 0x3b, 0x05, 0x13, 0x2d, 0x4a, 0x8d, 0x80, 0x37, 0xa9, 0x7a, 0xaf, 0x09, 0xee, 0x95, 0xe6, - 0x3b, 0x22, 0xfa, 0xfb, 0x18, 0xef, 0x95, 0x16, 0x28, 0x7e, 0x0c, 0x66, 0x0b, 0x9d, 0x65, 0x54, - 0x5a, 0xa6, 0x81, 0xfe, 0xcb, 0xc1, 0x61, 0xb9, 0x0a, 0xa6, 0xf4, 0x96, 0x69, 0x90, 0x30, 0x14, - 0xde, 0x21, 0x20, 0x3f, 0xc1, 0xfb, 0x5a, 0xde, 0x31, 0xef, 0xd7, 0xd9, 0xae, 0x79, 0x90, 0x30, - 0xac, 0x31, 0xe1, 0xb2, 0x7e, 0x58, 0xc6, 0x44, 0x9f, 0xb2, 0xd3, 0x87, 0xec, 0xc3, 0x81, 0x77, - 0x1b, 0xed, 0x0a, 0x1f, 0x15, 0xab, 0xc0, 0xc3, 0x0c, 0x67, 0xe1, 0x5a, 0x1c, 0xca, 0x70, 0x16, - 0xc3, 0xc0, 0x18, 0x6e, 0xac, 0x08, 0x70, 0x4c, 0x7d, 0x0d, 0xf8, 0x00, 0xe8, 0x8c, 0xce, 0x3c, - 0x1c, 0x12, 0x9d, 0xc3, 0x31, 0x11, 0xdf, 0xcb, 0x42, 0x64, 0x32, 0x8b, 0x07, 0xfd, 0xd7, 0x51, - 0x80, 0x73, 0xfb, 0x30, 0xfe, 0x0a, 0xd4, 0x5b, 0x21, 0xc1, 0x8d, 0xd8, 0xfb, 0x24, 0xe8, 0x52, - 0x19, 0xe3, 0x5d, 0xf1, 0x22, 0xe5, 0xa7, 0x0f, 0xe0, 0xf3, 0x64, 0x98, 0x23, 0x3e, 0x02, 0x1d, - 0xac, 0x59, 0xb4, 0xa3, 0x1c, 0x89, 0xa3, 0xfc, 0xdb, 0x84, 0x03, 0xfc, 0xf0, 0x72, 0x08, 0xf8, - 0x18, 0x09, 0x14, 0x62, 0xd1, 0x7d, 0x04, 0x59, 0x18, 0xcb, 0x36, 0x4a, 0xc1, 0x67, 0x81, 0xa9, - 0xf8, 0x68, 0xf0, 0x48, 0xe8, 0x91, 0xcb, 0x0b, 0xc3, 0x6b, 0x6c, 0x63, 0xf6, 0xc8, 0x15, 0x61, - 0x22, 0x7d, 0x4c, 0x5e, 0x7b, 0x0b, 0x5b, 0x70, 0x6e, 0x90, 0x0b, 0xe3, 0x5f, 0x91, 0xf5, 0x4f, - 0xb4, 0x7d, 0x7a, 0x24, 0x1e, 0x98, 0x07, 0x08, 0x88, 0xaf, 0x40, 0xd6, 0x32, 0x2f, 0xd2, 0xa5, - 0xad, 0x59, 0x95, 0x3c, 0xd3, 0xeb, 0x29, 0x3b, 0xbb, 0x3b, 0x06, 0x3d, 0x19, 0x3a, 0xab, 0x7a, - 0xaf, 0xca, 0x75, 0x30, 0x7b, 0x51, 0x77, 0xb6, 0x57, 0xb0, 0xd6, 0xc6, 0x96, 0x6a, 0x5e, 0x24, - 0x1e, 0x73, 0x93, 0x2a, 0x9f, 0xc8, 0xfb, 0xaf, 0x08, 0xd8, 0x97, 0xe4, 0x16, 0xf9, 0xb1, 0x1c, - 0x7f, 0x4b, 0x62, 0x79, 0x46, 0x73, 0x95, 0xbe, 0xc2, 0xbc, 0x5b, 0x86, 0x29, 0xd5, 0xbc, 0xc8, - 0x94, 0xe4, 0xff, 0x38, 0x5c, 0x1d, 0x49, 0x3c, 0xd1, 0x23, 0x92, 0xf3, 0xd9, 0x1f, 0xfb, 0x44, - 0x2f, 0xb6, 0xf8, 0xb1, 0x9c, 0x5c, 0x9a, 0x51, 0xcd, 0x8b, 0x75, 0xec, 0xd0, 0x16, 0x81, 0x9a, - 0x23, 0x72, 0xb2, 0xd6, 0x6d, 0x4a, 0x90, 0xcd, 0xc3, 0xfd, 0xf7, 0xa4, 0xbb, 0x08, 0xbe, 0x80, - 0x7c, 0x16, 0xc7, 0xbd, 0x8b, 0x30, 0x90, 0x83, 0x31, 0xc4, 0x48, 0x91, 0x61, 0x5a, 0x35, 0x2f, - 0xba, 0x43, 0xc3, 0x92, 0xde, 0xe9, 0x8c, 0x66, 0x84, 0x4c, 0x6a, 0xfc, 0x7b, 0x62, 0xf0, 0xb8, - 0x18, 0xbb, 0xf1, 0x3f, 0x80, 0x81, 0xf4, 0x61, 0x78, 0x0e, 0x6d, 0x2c, 0xde, 0x08, 0x6d, 0x8c, - 0x06, 0x87, 0x61, 0x1b, 0x84, 0xcf, 0xc6, 0xa1, 0x35, 0x88, 0x28, 0x0e, 0xc6, 0xb2, 0x73, 0x32, - 0x57, 0x22, 0xc3, 0xfc, 0x68, 0xdb, 0xc4, 0x3b, 0x92, 0xb9, 0x26, 0xb2, 0x61, 0x97, 0x63, 0x64, - 0x24, 0x68, 0x24, 0x70, 0x41, 0x14, 0xe0, 0x21, 0x7d, 0x3c, 0x3e, 0x20, 0xc3, 0x0c, 0x65, 0xe1, - 0x51, 0x62, 0x05, 0x0c, 0xd5, 0xa8, 0xc2, 0x35, 0x38, 0x9c, 0x46, 0x15, 0xc3, 0xc1, 0x58, 0x6e, - 0x05, 0x75, 0xed, 0xb8, 0x21, 0x8e, 0x8f, 0x47, 0x21, 0x38, 0xb4, 0x31, 0x36, 0xc2, 0x23, 0xe4, - 0xc3, 0x18, 0x63, 0x87, 0x74, 0x8c, 0xfc, 0x39, 0x7e, 0x2b, 0x1a, 0x25, 0x06, 0x07, 0x68, 0x0a, - 0x23, 0x84, 0x61, 0xc8, 0xa6, 0x70, 0x48, 0x48, 0x7c, 0x59, 0x06, 0xa0, 0x0c, 0xac, 0x99, 0x7b, - 0xe4, 0x32, 0x9f, 0x11, 0x74, 0x67, 0xbd, 0x6e, 0xf5, 0xf2, 0x00, 0xb7, 0xfa, 0x84, 0x21, 0x5c, - 0x92, 0xae, 0x04, 0x86, 0xa4, 0xec, 0x56, 0x72, 0xec, 0x2b, 0x81, 0xf1, 0xe5, 0xa7, 0x8f, 0xf1, - 0x17, 0xa9, 0x35, 0x17, 0x1c, 0x30, 0xfd, 0xad, 0x91, 0xa0, 0x1c, 0x9a, 0xfd, 0xcb, 0xfc, 0xec, - 0xff, 0x00, 0xd8, 0x0e, 0x6b, 0x23, 0x0e, 0x3a, 0x38, 0x9a, 0xbe, 0x8d, 0x78, 0x78, 0x07, 0x44, - 0x7f, 0x36, 0x0b, 0x47, 0x59, 0x27, 0xf2, 0x83, 0x00, 0x71, 0xc2, 0x73, 0x78, 0x5c, 0x27, 0x39, - 0x00, 0xe5, 0x51, 0x2d, 0x48, 0x25, 0x59, 0xca, 0x14, 0x60, 0x6f, 0x2c, 0xab, 0x1b, 0xf9, 0xf2, - 0x03, 0x5d, 0xcd, 0x68, 0x8b, 0x87, 0xfb, 0x1d, 0x00, 0xbc, 0xb7, 0xd6, 0x28, 0xf3, 0x6b, 0x8d, - 0x7d, 0x56, 0x26, 0x13, 0xef, 0x5c, 0x13, 0x91, 0x51, 0x76, 0xc7, 0xbe, 0x73, 0x1d, 0x5d, 0x76, - 0xfa, 0x28, 0xbd, 0x43, 0x86, 0x6c, 0xdd, 0xb4, 0x1c, 0xf4, 0xdc, 0x24, 0xad, 0x93, 0x4a, 0x3e, - 0x00, 0xc9, 0x7b, 0x57, 0x4a, 0xdc, 0x2d, 0xcd, 0x37, 0xc7, 0x1f, 0x75, 0xd6, 0x1c, 0x8d, 0x78, - 0x75, 0xbb, 0xe5, 0x87, 0xae, 0x6b, 0x4e, 0x1a, 0x4f, 0x87, 0xca, 0xaf, 0x1e, 0x7d, 0x00, 0x23, - 0xb5, 0x78, 0x3a, 0x91, 0x25, 0xa7, 0x8f, 0xdb, 0xc3, 0x47, 0x99, 0x6f, 0xeb, 0x92, 0xde, 0xc1, - 0xe8, 0xb9, 0xd4, 0x65, 0xa4, 0xaa, 0xed, 0x60, 0xf1, 0x23, 0x31, 0xb1, 0xae, 0xad, 0x24, 0xbe, - 0xac, 0x1c, 0xc4, 0x97, 0x4d, 0xda, 0xa0, 0xe8, 0x01, 0x74, 0xca, 0xd2, 0xb8, 0x1b, 0x54, 0x4c, - 0xd9, 0x63, 0x89, 0xd3, 0x79, 0xac, 0x8e, 0x1d, 0x6a, 0x54, 0xd6, 0xbc, 0x1b, 0x58, 0x7e, 0x7a, - 0x24, 0x11, 0x3b, 0xfd, 0x0b, 0x5e, 0xe4, 0x9e, 0x0b, 0x5e, 0xde, 0x1d, 0x06, 0x67, 0x8d, 0x07, - 0xe7, 0xc7, 0xa3, 0x05, 0xc4, 0x33, 0x39, 0x12, 0x98, 0xde, 0xec, 0xc3, 0xb4, 0xce, 0xc1, 0x74, - 0xc7, 0x90, 0x5c, 0xa4, 0x0f, 0xd8, 0xaf, 0xe4, 0xe0, 0x28, 0x9d, 0xf4, 0x17, 0x8d, 0x36, 0x8b, - 0xb0, 0xfa, 0x06, 0xe9, 0x90, 0x37, 0xdb, 0xf6, 0x87, 0x60, 0xe5, 0x62, 0x39, 0xe7, 0x7a, 0x6f, - 0xc7, 0x5f, 0xa0, 0xe1, 0x5c, 0xdd, 0x4e, 0x94, 0xec, 0xb4, 0x89, 0xdf, 0x90, 0xef, 0xff, 0xc7, - 0xdf, 0x65, 0x34, 0x21, 0x7e, 0x97, 0xd1, 0x9f, 0x26, 0x5b, 0xb7, 0x23, 0x45, 0xf7, 0x08, 0x3c, - 0x65, 0xdb, 0x29, 0xc1, 0x8a, 0x9e, 0x00, 0x77, 0x3f, 0x1c, 0xee, 0x64, 0x41, 0x04, 0x91, 0x21, - 0xdd, 0xc9, 0x08, 0x81, 0xc3, 0x74, 0x27, 0x1b, 0xc4, 0xc0, 0x18, 0x6e, 0xb5, 0xcf, 0xb1, 0xdd, - 0x7c, 0xd2, 0x6e, 0xd0, 0x5f, 0x4b, 0xa9, 0x8f, 0xd2, 0xdf, 0xc9, 0x24, 0xf2, 0x7f, 0x26, 0x7c, - 0xc5, 0x0f, 0xd3, 0x49, 0x3c, 0x9a, 0xe3, 0xc8, 0x8d, 0x61, 0xdd, 0x48, 0x22, 0xbe, 0xe8, 0xe7, - 0xf4, 0xb6, 0xb3, 0x3d, 0xa2, 0x13, 0x1d, 0x17, 0x5d, 0x5a, 0xde, 0xf5, 0xc8, 0xe4, 0x05, 0xfd, - 0x7b, 0x26, 0x51, 0x08, 0x29, 0x5f, 0x24, 0x84, 0xad, 0x08, 0x11, 0x27, 0x08, 0xfc, 0x14, 0x4b, - 0x6f, 0x8c, 0x1a, 0x7d, 0x56, 0x6f, 0x63, 0xf3, 0x51, 0xa8, 0xd1, 0x84, 0xaf, 0xd1, 0x69, 0x74, - 0x1c, 0xb9, 0x1f, 0x52, 0x8d, 0xf6, 0x45, 0x32, 0x22, 0x8d, 0x8e, 0xa5, 0x97, 0xbe, 0x8c, 0x5f, - 0x36, 0xc3, 0x26, 0x52, 0xab, 0xba, 0x71, 0x01, 0xfd, 0x4b, 0xde, 0xbb, 0x98, 0xf9, 0x9c, 0xee, - 0x6c, 0xb3, 0x58, 0x30, 0x7f, 0x20, 0x7c, 0x37, 0xca, 0x10, 0xf1, 0x5e, 0xf8, 0x70, 0x52, 0xb9, - 0x7d, 0xe1, 0xa4, 0x8a, 0x30, 0xab, 0x1b, 0x0e, 0xb6, 0x0c, 0xad, 0xb3, 0xd4, 0xd1, 0xb6, 0xec, - 0x53, 0x13, 0x7d, 0x2f, 0xaf, 0xab, 0x84, 0xf2, 0xa8, 0xfc, 0x1f, 0xe1, 0xeb, 0x2b, 0x27, 0xf9, - 0xeb, 0x2b, 0x23, 0xa2, 0x5f, 0x4d, 0x45, 0x47, 0xbf, 0xf2, 0xa3, 0x5b, 0xc1, 0xe0, 0xe0, 0xd8, - 0xa2, 0xb6, 0x71, 0xc2, 0x70, 0x7f, 0x37, 0x0b, 0x46, 0x61, 0xf3, 0x43, 0x3f, 0xbe, 0x52, 0x4e, - 0xb4, 0xba, 0xe7, 0x2a, 0xc2, 0x7c, 0xaf, 0x12, 0x24, 0xb6, 0x50, 0xc3, 0x95, 0x97, 0x7b, 0x2a, - 0xef, 0x9b, 0x3c, 0x59, 0x01, 0x93, 0x27, 0xac, 0x54, 0x39, 0x31, 0xa5, 0x4a, 0xb2, 0x58, 0x28, - 0x52, 0xdb, 0x31, 0x9c, 0x46, 0xca, 0xc1, 0x31, 0x2f, 0xda, 0x6d, 0xb7, 0x8b, 0x35, 0x4b, 0x33, - 0x5a, 0x18, 0x7d, 0x58, 0x1a, 0x85, 0xd9, 0xbb, 0x04, 0x93, 0x7a, 0xcb, 0x34, 0xea, 0xfa, 0x33, - 0xbd, 0xcb, 0xe5, 0xe2, 0x83, 0xac, 0x13, 0x89, 0x54, 0xd8, 0x1f, 0xaa, 0xff, 0xaf, 0x52, 0x81, - 0xa9, 0x96, 0x66, 0xb5, 0x69, 0x10, 0xbe, 0x5c, 0xcf, 0x45, 0x4e, 0x91, 0x84, 0x4a, 0xde, 0x2f, - 0x6a, 0xf0, 0xb7, 0x52, 0xe3, 0x85, 0x98, 0xef, 0x89, 0xe6, 0x11, 0x49, 0x6c, 0x31, 0xf8, 0x89, - 0x93, 0xb9, 0x2b, 0x1d, 0x0b, 0x77, 0xc8, 0x1d, 0xf4, 0xb4, 0x87, 0x98, 0x52, 0x83, 0x84, 0xa4, - 0xcb, 0x03, 0xa4, 0xa8, 0x7d, 0x68, 0x8c, 0x7b, 0x79, 0x40, 0x88, 0x8b, 0xf4, 0x35, 0xf3, 0xad, - 0x79, 0x98, 0xa5, 0xbd, 0x1a, 0x13, 0x27, 0x7a, 0x1e, 0xb9, 0x42, 0xda, 0xb9, 0x17, 0x5f, 0x42, - 0xf5, 0x83, 0x8f, 0xc9, 0x05, 0x90, 0x2f, 0xf8, 0x01, 0x07, 0xdd, 0xc7, 0xa4, 0xfb, 0xf6, 0x1e, - 0x5f, 0xf3, 0x94, 0xa7, 0x71, 0xef, 0xdb, 0xc7, 0x17, 0x9f, 0x3e, 0x3e, 0xbf, 0x26, 0x83, 0x5c, - 0x6c, 0xb7, 0x51, 0xeb, 0xe0, 0x50, 0x5c, 0x03, 0xd3, 0x5e, 0x9b, 0x09, 0x62, 0x40, 0x86, 0x93, - 0x92, 0x2e, 0x82, 0xfa, 0xb2, 0x29, 0xb6, 0xc7, 0xbe, 0xab, 0x10, 0x53, 0x76, 0xfa, 0xa0, 0xfc, - 0xd6, 0x04, 0x6b, 0x34, 0x0b, 0xa6, 0x79, 0x81, 0x1c, 0x95, 0x79, 0xae, 0x0c, 0xb9, 0x25, 0xec, - 0xb4, 0xb6, 0x47, 0xd4, 0x66, 0x76, 0xad, 0x8e, 0xd7, 0x66, 0xf6, 0xdd, 0x87, 0x3f, 0xd8, 0x86, - 0xf5, 0xd8, 0x9a, 0x27, 0x2c, 0x8d, 0x3b, 0xba, 0x73, 0x6c, 0xe9, 0xe9, 0x83, 0xf3, 0xef, 0x32, - 0xcc, 0xf9, 0x2b, 0x5c, 0x14, 0x93, 0x5f, 0xc9, 0x3c, 0xda, 0xd6, 0x3b, 0xd1, 0x67, 0x93, 0x85, - 0x48, 0xf3, 0x65, 0xca, 0xd7, 0x2c, 0xe5, 0x85, 0xc5, 0x04, 0xc1, 0xd3, 0xc4, 0x18, 0x1c, 0xc3, - 0x0c, 0x5e, 0x86, 0x49, 0xc2, 0xd0, 0xa2, 0xbe, 0x47, 0x5c, 0x07, 0xb9, 0x85, 0xc6, 0x67, 0x8d, - 0x64, 0xa1, 0xf1, 0x0e, 0x7e, 0xa1, 0x51, 0x30, 0xe2, 0xb1, 0xb7, 0xce, 0x98, 0xd0, 0x97, 0xc6, - 0xfd, 0x7f, 0xe4, 0xcb, 0x8c, 0x09, 0x7c, 0x69, 0x06, 0x94, 0x9f, 0x3e, 0xa2, 0xaf, 0xfc, 0x4f, - 0xac, 0xb3, 0xf5, 0x36, 0x54, 0xd1, 0xff, 0x3c, 0x06, 0xd9, 0xb3, 0xee, 0xc3, 0xff, 0x0e, 0x6e, - 0xc4, 0x7a, 0xd1, 0x08, 0x82, 0x33, 0x3c, 0x1d, 0xb2, 0x2e, 0x7d, 0x36, 0x6d, 0xb9, 0x51, 0x6c, - 0x77, 0xd7, 0x65, 0x44, 0x25, 0xff, 0x29, 0x27, 0x21, 0x6f, 0x9b, 0xbb, 0x56, 0xcb, 0x35, 0x9f, - 0x5d, 0x8d, 0x61, 0x6f, 0x49, 0x83, 0x92, 0x72, 0xa4, 0xe7, 0x47, 0xe7, 0x32, 0x1a, 0xba, 0x20, - 0x49, 0xe6, 0x2e, 0x48, 0x4a, 0xb0, 0x7f, 0x20, 0xc0, 0x5b, 0xfa, 0x1a, 0xf1, 0xd7, 0xe4, 0xae, - 0xc0, 0xf6, 0xa8, 0x60, 0x8f, 0x10, 0xcb, 0x41, 0xd5, 0x21, 0xa9, 0xc3, 0x37, 0x2f, 0x5a, 0x3f, - 0x0e, 0xfc, 0x58, 0x1d, 0xbe, 0x05, 0x78, 0x18, 0xcb, 0x29, 0xf5, 0x3c, 0x73, 0x52, 0xbd, 0x6f, - 0x94, 0xe8, 0x66, 0x39, 0xa5, 0x3f, 0x10, 0x3a, 0x23, 0x74, 0x5e, 0x1d, 0x1a, 0x9d, 0x43, 0x72, - 0x5f, 0xfd, 0x88, 0x4c, 0x22, 0x61, 0x7a, 0x46, 0x8e, 0xf8, 0x45, 0x47, 0x89, 0x21, 0x72, 0xc7, - 0x60, 0x2e, 0x0e, 0xf4, 0xec, 0xf0, 0xa1, 0xc1, 0x79, 0xd1, 0x85, 0xf8, 0x1f, 0x77, 0x68, 0x70, - 0x51, 0x46, 0xd2, 0x07, 0xf2, 0x35, 0xf4, 0x62, 0xb1, 0x62, 0xcb, 0xd1, 0xf7, 0x46, 0xdc, 0xd2, - 0xf8, 0xe1, 0x25, 0x61, 0x34, 0xe0, 0x7d, 0x12, 0xa2, 0x1c, 0x8e, 0x3b, 0x1a, 0xb0, 0x18, 0x1b, - 0xe9, 0xc3, 0xf4, 0x77, 0x79, 0x57, 0x7a, 0x6c, 0x6d, 0xe6, 0xb5, 0x6c, 0x35, 0x00, 0x1f, 0x1c, - 0xad, 0x33, 0x30, 0x13, 0x9a, 0xfa, 0x7b, 0x17, 0xd6, 0x70, 0x69, 0x49, 0x0f, 0xba, 0xfb, 0x22, - 0x1b, 0xf9, 0xc2, 0x40, 0x82, 0x05, 0x5f, 0x11, 0x26, 0xc6, 0x72, 0x1f, 0x9c, 0x37, 0x86, 0x8d, - 0x09, 0xab, 0x3f, 0x08, 0x63, 0x55, 0xe3, 0xb1, 0xba, 0x4d, 0x44, 0x4c, 0x62, 0x63, 0x9a, 0xd0, - 0xbc, 0xf1, 0x2d, 0x3e, 0x5c, 0x2a, 0x07, 0xd7, 0xd3, 0x87, 0xe6, 0x23, 0x7d, 0xc4, 0x5e, 0x4c, - 0xbb, 0xc3, 0x3a, 0x35, 0xd9, 0x47, 0xd3, 0x1d, 0xb2, 0xd9, 0x80, 0xcc, 0xcd, 0x06, 0x12, 0xfa, - 0xdb, 0x07, 0x6e, 0xa4, 0x1e, 0x73, 0x83, 0x20, 0xca, 0x8e, 0xd8, 0xdf, 0x7e, 0x20, 0x07, 0xe9, - 0x83, 0xf3, 0x4f, 0x32, 0xc0, 0xb2, 0x65, 0xee, 0x76, 0x6b, 0x56, 0x1b, 0x5b, 0xe8, 0x6f, 0x83, - 0x09, 0xc0, 0x0b, 0x46, 0x30, 0x01, 0x58, 0x07, 0xd8, 0xf2, 0x89, 0x33, 0x0d, 0xbf, 0x45, 0xcc, - 0xdc, 0x0f, 0x98, 0x52, 0x43, 0x34, 0xf8, 0x2b, 0x67, 0x7f, 0x82, 0xc7, 0x38, 0xae, 0xcf, 0x0a, - 0xc8, 0x8d, 0x72, 0x02, 0xf0, 0x36, 0x1f, 0xeb, 0x06, 0x87, 0xf5, 0xdd, 0x07, 0xe0, 0x24, 0x7d, - 0xcc, 0xff, 0x79, 0x02, 0xa6, 0xe9, 0x76, 0x1d, 0x95, 0xe9, 0x3f, 0x04, 0xa0, 0xff, 0xd6, 0x08, - 0x40, 0xdf, 0x80, 0x19, 0x33, 0xa0, 0x4e, 0xfb, 0xd4, 0xf0, 0x02, 0x4c, 0x2c, 0xec, 0x21, 0xbe, - 0x54, 0x8e, 0x0c, 0xfa, 0x60, 0x18, 0x79, 0x95, 0x47, 0xfe, 0x8e, 0x18, 0x79, 0x87, 0x28, 0x8e, - 0x12, 0xfa, 0xb7, 0xfb, 0xd0, 0x6f, 0x70, 0xd0, 0x17, 0x0f, 0xc2, 0xca, 0x18, 0xc2, 0xed, 0xcb, - 0x90, 0x25, 0xa7, 0xe3, 0x7e, 0x3b, 0xc5, 0xf9, 0xfd, 0x29, 0x98, 0x20, 0x4d, 0xd6, 0x9f, 0x77, - 0x78, 0xaf, 0xee, 0x17, 0x6d, 0xd3, 0xc1, 0x96, 0xef, 0xb1, 0xe0, 0xbd, 0xba, 0x3c, 0x78, 0x5e, - 0xc9, 0xf6, 0xa9, 0x3c, 0xdd, 0x88, 0xf4, 0x13, 0x86, 0x9e, 0x94, 0x84, 0x25, 0x3e, 0xb2, 0xf3, - 0x72, 0xc3, 0x4c, 0x4a, 0x06, 0x30, 0x92, 0x3e, 0xf0, 0x7f, 0x99, 0x85, 0x53, 0x74, 0x55, 0x69, - 0xc9, 0x32, 0x77, 0x7a, 0x6e, 0xb7, 0xd2, 0x0f, 0xae, 0x0b, 0xd7, 0xc3, 0x9c, 0xc3, 0xf9, 0x63, - 0x33, 0x9d, 0xe8, 0x49, 0x45, 0x7f, 0x16, 0xf6, 0xa9, 0x78, 0x06, 0x8f, 0xe4, 0x42, 0x8c, 0x00, - 0xa3, 0x78, 0x4f, 0xbc, 0x50, 0x2f, 0xc8, 0x68, 0x68, 0x91, 0x4a, 0x1e, 0x6a, 0xcd, 0xd2, 0xd7, - 0xa9, 0x9c, 0x88, 0x4e, 0xbd, 0xc7, 0xd7, 0xa9, 0x9f, 0xe2, 0x74, 0x6a, 0xf9, 0xe0, 0x22, 0x49, - 0x5f, 0xb7, 0x5e, 0xe1, 0x6f, 0x0c, 0xf9, 0xdb, 0x76, 0x3b, 0x29, 0x6c, 0xd6, 0x85, 0xfd, 0x91, - 0xb2, 0x9c, 0x3f, 0x12, 0x7f, 0x1f, 0x45, 0x82, 0x99, 0x30, 0xcf, 0x75, 0x84, 0x2e, 0xcd, 0x81, - 0xa4, 0x7b, 0xdc, 0x49, 0x7a, 0x7b, 0xa8, 0xb9, 0x6e, 0x6c, 0x41, 0x63, 0x58, 0x5b, 0x9a, 0x83, - 0xfc, 0x92, 0xde, 0x71, 0xb0, 0x85, 0xbe, 0xc8, 0x66, 0xba, 0xaf, 0x48, 0x71, 0x00, 0x58, 0x84, - 0xfc, 0x26, 0x29, 0x8d, 0x99, 0xcc, 0x37, 0x89, 0xb5, 0x1e, 0xca, 0xa1, 0xca, 0xfe, 0x4d, 0x1a, - 0x9d, 0xaf, 0x87, 0xcc, 0xc8, 0xa6, 0xc8, 0x09, 0xa2, 0xf3, 0x0d, 0x66, 0x61, 0x2c, 0x17, 0x53, - 0xe5, 0x55, 0xbc, 0xe3, 0x8e, 0xf1, 0x17, 0xd2, 0x43, 0xb8, 0x00, 0xb2, 0xde, 0xb6, 0x49, 0xe7, - 0x38, 0xa5, 0xba, 0x8f, 0x49, 0x7d, 0x85, 0x7a, 0x45, 0x45, 0x59, 0x1e, 0xb7, 0xaf, 0x90, 0x10, - 0x17, 0xe9, 0x63, 0xf6, 0x1d, 0xe2, 0x28, 0xda, 0xed, 0x68, 0x2d, 0xec, 0x72, 0x9f, 0x1a, 0x6a, - 0xb4, 0x27, 0xcb, 0x7a, 0x3d, 0x59, 0xa8, 0x9d, 0xe6, 0x0e, 0xd0, 0x4e, 0x87, 0x5d, 0x86, 0xf4, - 0x65, 0x4e, 0x2a, 0x7e, 0x68, 0xcb, 0x90, 0xb1, 0x6c, 0x8c, 0xe1, 0xda, 0x51, 0xef, 0x20, 0xed, - 0x58, 0x5b, 0xeb, 0xb0, 0x9b, 0x34, 0x4c, 0x58, 0x23, 0x3b, 0x34, 0x3b, 0xcc, 0x26, 0x4d, 0x34, - 0x0f, 0x63, 0x40, 0x6b, 0x8e, 0xa1, 0xf5, 0x19, 0x36, 0x8c, 0xa6, 0xbc, 0x4f, 0x6a, 0x9b, 0x96, - 0x93, 0x6c, 0x9f, 0xd4, 0xe5, 0x4e, 0x25, 0xff, 0x25, 0x3d, 0x78, 0xc5, 0x9f, 0xab, 0x1e, 0xd5, - 0xf0, 0x99, 0xe0, 0xe0, 0xd5, 0x20, 0x06, 0xd2, 0x87, 0xf7, 0x8d, 0x87, 0x34, 0x78, 0x0e, 0xdb, - 0x1c, 0x59, 0x1b, 0x18, 0xd9, 0xd0, 0x39, 0x4c, 0x73, 0x8c, 0xe6, 0x21, 0x7d, 0xbc, 0xbe, 0x19, - 0x1a, 0x38, 0x5f, 0x3f, 0xc6, 0x81, 0xd3, 0x6b, 0x99, 0xb9, 0x21, 0x5b, 0xe6, 0xb0, 0xfb, 0x3f, - 0x4c, 0xd6, 0xa3, 0x1b, 0x30, 0x87, 0xd9, 0xff, 0x89, 0x61, 0x22, 0x7d, 0xc4, 0xdf, 0x20, 0x43, - 0xae, 0x3e, 0xfe, 0xf1, 0x72, 0xd8, 0xb9, 0x08, 0x91, 0x55, 0x7d, 0x64, 0xc3, 0xe5, 0x30, 0x73, - 0x91, 0x48, 0x16, 0xc6, 0x10, 0x78, 0xff, 0x28, 0xcc, 0x90, 0x25, 0x11, 0x6f, 0x9b, 0xf5, 0x9b, - 0x6c, 0xd4, 0x7c, 0x24, 0xc5, 0xb6, 0x7a, 0x0f, 0x4c, 0x7a, 0xfb, 0x77, 0x6c, 0xe4, 0x9c, 0x17, - 0x6b, 0x9f, 0x1e, 0x97, 0xaa, 0xff, 0xff, 0x81, 0x9c, 0x21, 0x46, 0xbe, 0x57, 0x3b, 0xac, 0x33, - 0xc4, 0xa1, 0xee, 0xd7, 0xfe, 0x69, 0x30, 0xa2, 0xfe, 0x97, 0xf4, 0x30, 0xef, 0xdd, 0xc7, 0xcd, - 0xf6, 0xd9, 0xc7, 0xfd, 0x70, 0x18, 0xcb, 0x3a, 0x8f, 0xe5, 0x9d, 0xa2, 0x22, 0x1c, 0xe1, 0x58, - 0xfb, 0x0e, 0x1f, 0xce, 0xb3, 0x1c, 0x9c, 0x0b, 0x07, 0xe2, 0x65, 0x0c, 0x07, 0x1f, 0xb3, 0xc1, - 0x98, 0xfb, 0xd1, 0x14, 0xdb, 0x71, 0xcf, 0xa9, 0x8a, 0xec, 0xbe, 0x53, 0x15, 0x5c, 0x4b, 0xcf, - 0x1d, 0xb0, 0xa5, 0x7f, 0x34, 0xac, 0x1d, 0x0d, 0x5e, 0x3b, 0x9e, 0x2e, 0x8e, 0xc8, 0xe8, 0x46, - 0xe6, 0x77, 0xfa, 0xea, 0x71, 0x8e, 0x53, 0x8f, 0xd2, 0xc1, 0x98, 0x49, 0x5f, 0x3f, 0xfe, 0xc8, - 0x9b, 0xd0, 0x1e, 0x72, 0x7b, 0x1f, 0x76, 0xab, 0x98, 0x13, 0xe2, 0xc8, 0x46, 0xee, 0x61, 0xb6, - 0x8a, 0x07, 0x71, 0x32, 0x86, 0x58, 0x6c, 0xb3, 0x30, 0x4d, 0x78, 0x3a, 0xa7, 0xb7, 0xb7, 0xb0, - 0x83, 0x5e, 0x49, 0x7d, 0x14, 0xbd, 0xc8, 0x97, 0x23, 0x0a, 0x4f, 0x14, 0x75, 0xde, 0x35, 0xa9, - 0x47, 0x07, 0x65, 0x72, 0x3e, 0xc4, 0xe0, 0xb8, 0x23, 0x28, 0x0e, 0xe4, 0x20, 0x7d, 0xc8, 0x3e, - 0x48, 0xdd, 0x6d, 0x56, 0xb5, 0x4b, 0xe6, 0xae, 0x83, 0x1e, 0x1c, 0x41, 0x07, 0xbd, 0x00, 0xf9, - 0x0e, 0xa1, 0xc6, 0x8e, 0x65, 0xc4, 0x4f, 0x77, 0x98, 0x08, 0x68, 0xf9, 0x2a, 0xfb, 0x33, 0xe9, - 0xd9, 0x8c, 0x40, 0x8e, 0x94, 0xce, 0xb8, 0xcf, 0x66, 0x0c, 0x28, 0x7f, 0x2c, 0x77, 0xec, 0x4c, - 0xba, 0xa5, 0xeb, 0x3b, 0xba, 0x33, 0xa2, 0x08, 0x0e, 0x1d, 0x97, 0x96, 0x17, 0xc1, 0x81, 0xbc, - 0x24, 0x3d, 0x31, 0x1a, 0x92, 0x8a, 0xfb, 0xfb, 0xb8, 0x4f, 0x8c, 0xc6, 0x17, 0x9f, 0x3e, 0x26, - 0xbf, 0x41, 0x5b, 0xd6, 0x59, 0xea, 0x7c, 0x9b, 0xa2, 0x5f, 0xef, 0xd0, 0x8d, 0x85, 0xb2, 0x76, - 0x78, 0x8d, 0xa5, 0x6f, 0xf9, 0xe9, 0x03, 0xf3, 0xdf, 0x7f, 0x14, 0x72, 0x8b, 0xf8, 0xfc, 0xee, - 0x16, 0xba, 0x03, 0x26, 0x1b, 0x16, 0xc6, 0x15, 0x63, 0xd3, 0x74, 0xa5, 0xeb, 0xb8, 0xcf, 0x1e, - 0x24, 0xec, 0xcd, 0xc5, 0x63, 0x1b, 0x6b, 0xed, 0xe0, 0xfc, 0x99, 0xf7, 0x8a, 0x5e, 0x24, 0x41, - 0xb6, 0xee, 0x68, 0x0e, 0x9a, 0xf2, 0xb1, 0x45, 0x0f, 0x86, 0xb1, 0xb8, 0x83, 0xc7, 0xe2, 0x7a, - 0x4e, 0x16, 0x84, 0x83, 0x79, 0xf7, 0xff, 0x08, 0x00, 0x10, 0x4c, 0xde, 0x6f, 0x9b, 0x86, 0x9b, - 0xc3, 0x3b, 0x02, 0xe9, 0xbd, 0xa3, 0x97, 0xfb, 0xe2, 0xbe, 0x8b, 0x13, 0xf7, 0xe3, 0xc5, 0x8a, - 0x18, 0xc3, 0x4a, 0x9b, 0x04, 0x53, 0xae, 0x68, 0x57, 0xb0, 0xd6, 0xb6, 0xd1, 0x8f, 0x04, 0xca, - 0x1f, 0x21, 0x66, 0xf4, 0x5e, 0xe1, 0x60, 0x9c, 0xb4, 0x56, 0x3e, 0xf1, 0x68, 0x8f, 0x0e, 0x6f, - 0xf3, 0x5f, 0xe2, 0x83, 0x91, 0xdc, 0x0c, 0x59, 0xdd, 0xd8, 0x34, 0x99, 0x7f, 0xe1, 0x95, 0x11, - 0xb4, 0x5d, 0x9d, 0x50, 0x49, 0x46, 0xc1, 0x48, 0x9d, 0xf1, 0x6c, 0x8d, 0xe5, 0xd2, 0xbb, 0xac, - 0x5b, 0x3a, 0xfa, 0xff, 0x0f, 0x14, 0xb6, 0xa2, 0x40, 0xb6, 0xab, 0x39, 0xdb, 0xac, 0x68, 0xf2, - 0xec, 0xda, 0xc8, 0xbb, 0x86, 0x66, 0x98, 0xc6, 0xa5, 0x1d, 0xfd, 0x99, 0xfe, 0xdd, 0xba, 0x5c, - 0x9a, 0xcb, 0xf9, 0x16, 0x36, 0xb0, 0xa5, 0x39, 0xb8, 0xbe, 0xb7, 0x45, 0xe6, 0x58, 0x93, 0x6a, - 0x38, 0x29, 0xb1, 0xfe, 0xbb, 0x1c, 0x47, 0xeb, 0xff, 0xa6, 0xde, 0xc1, 0x24, 0x52, 0x13, 0xd3, - 0x7f, 0xef, 0x3d, 0x91, 0xfe, 0xf7, 0x29, 0x22, 0x7d, 0x34, 0xbe, 0x2b, 0xc1, 0x4c, 0xdd, 0x55, - 0xb8, 0xfa, 0xee, 0xce, 0x8e, 0x66, 0x5d, 0x42, 0xd7, 0x06, 0xa8, 0x84, 0x54, 0x33, 0xc3, 0xfb, - 0xa5, 0x7c, 0x44, 0xf8, 0x5a, 0x69, 0xd6, 0xb4, 0x43, 0x25, 0x24, 0x6e, 0x07, 0x4f, 0x84, 0x9c, - 0xab, 0xde, 0x9e, 0xc7, 0x65, 0x6c, 0x43, 0xa0, 0x39, 0x05, 0x23, 0x5a, 0x0d, 0xe4, 0x6d, 0x0c, - 0xd1, 0x34, 0x24, 0x38, 0x5a, 0x77, 0xb4, 0xd6, 0x85, 0x65, 0xd3, 0x32, 0x77, 0x1d, 0xdd, 0xc0, - 0x36, 0x7a, 0x4c, 0x80, 0x80, 0xa7, 0xff, 0x99, 0x40, 0xff, 0xd1, 0xf7, 0x33, 0xa2, 0xa3, 0xa8, - 0xdf, 0xad, 0x86, 0xc9, 0x47, 0x04, 0xa8, 0x12, 0x1b, 0x17, 0x45, 0x28, 0xa6, 0x2f, 0xb4, 0xd7, - 0xcb, 0x50, 0x28, 0x3f, 0xd0, 0x35, 0x2d, 0x67, 0xd5, 0x6c, 0x69, 0x1d, 0xdb, 0x31, 0x2d, 0x8c, - 0x6a, 0xb1, 0x52, 0x73, 0x7b, 0x98, 0xb6, 0xd9, 0x0a, 0x06, 0x47, 0xf6, 0x16, 0x56, 0x3b, 0x99, - 0xd7, 0xf1, 0x0f, 0x0a, 0xef, 0x32, 0x52, 0xa9, 0xf4, 0x72, 0x14, 0xa1, 0xe7, 0xfd, 0xba, 0xb4, - 0x64, 0x87, 0x25, 0xc4, 0x76, 0x1e, 0x85, 0x98, 0x1a, 0xc3, 0x52, 0xb9, 0x04, 0xb3, 0xf5, 0xdd, - 0xf3, 0x3e, 0x11, 0x3b, 0x6c, 0x84, 0xbc, 0x4a, 0x38, 0x4a, 0x05, 0x53, 0xbc, 0x30, 0xa1, 0x08, - 0xf9, 0x5e, 0x07, 0xb3, 0x76, 0x38, 0x1b, 0xc3, 0x9b, 0x4f, 0x14, 0x8c, 0x4e, 0x31, 0xb8, 0xd4, - 0xf4, 0x05, 0xf8, 0x4e, 0x09, 0x66, 0x6b, 0x5d, 0x6c, 0xe0, 0x36, 0xf5, 0x82, 0xe4, 0x04, 0xf8, - 0xa2, 0x84, 0x02, 0xe4, 0x08, 0x45, 0x08, 0x30, 0xf0, 0x58, 0x5e, 0xf4, 0x84, 0x17, 0x24, 0x24, - 0x12, 0x5c, 0x5c, 0x69, 0xe9, 0x0b, 0xee, 0x0b, 0x12, 0x4c, 0xab, 0xbb, 0xc6, 0xba, 0x65, 0xba, - 0xa3, 0xb1, 0x85, 0xee, 0x0c, 0x3a, 0x88, 0x9b, 0xe0, 0x58, 0x7b, 0xd7, 0x22, 0xeb, 0x4f, 0x15, - 0xa3, 0x8e, 0x5b, 0xa6, 0xd1, 0xb6, 0x49, 0x3d, 0x72, 0xea, 0xfe, 0x0f, 0xb7, 0x67, 0x9f, 0xfb, - 0x35, 0x39, 0x83, 0x9e, 0x27, 0x1c, 0xea, 0x86, 0x56, 0x3e, 0x54, 0xb4, 0x78, 0x4f, 0x20, 0x18, - 0xd0, 0x66, 0x50, 0x09, 0xe9, 0x0b, 0xf7, 0x33, 0x12, 0x28, 0xc5, 0x56, 0xcb, 0xdc, 0x35, 0x9c, - 0x3a, 0xee, 0xe0, 0x96, 0xd3, 0xb0, 0xb4, 0x16, 0x0e, 0xdb, 0xcf, 0x05, 0x90, 0xdb, 0xba, 0xc5, - 0xfa, 0x60, 0xf7, 0x91, 0xc9, 0xf1, 0x45, 0xc2, 0x3b, 0x8e, 0xb4, 0x96, 0xfb, 0x4b, 0x49, 0x20, - 0x4e, 0xb1, 0x7d, 0x45, 0xc1, 0x82, 0xd2, 0x97, 0xea, 0x47, 0x25, 0x98, 0xf2, 0x7a, 0xec, 0x2d, - 0x11, 0x61, 0xfe, 0x46, 0xc2, 0xc9, 0x88, 0x4f, 0x3c, 0x81, 0x0c, 0xdf, 0x9a, 0x60, 0x56, 0x11, - 0x45, 0x3f, 0x99, 0xe8, 0x8a, 0xc9, 0x45, 0xe7, 0xbe, 0x56, 0x6b, 0xcd, 0xa5, 0xda, 0xea, 0x62, - 0x59, 0x2d, 0xc8, 0xe8, 0x8b, 0x12, 0x64, 0xd7, 0x75, 0x63, 0x2b, 0x1c, 0x5d, 0xe9, 0xb8, 0x6b, - 0x47, 0xb6, 0xf1, 0x03, 0xac, 0xa5, 0xd3, 0x17, 0xe5, 0x56, 0x38, 0x6e, 0xec, 0xee, 0x9c, 0xc7, - 0x56, 0x6d, 0x93, 0x8c, 0xb2, 0x76, 0xc3, 0xac, 0x63, 0x83, 0x1a, 0xa1, 0x39, 0xb5, 0xef, 0x37, - 0xde, 0x04, 0x13, 0x98, 0x3c, 0xb8, 0x9c, 0x44, 0x48, 0xdc, 0x67, 0x4a, 0x0a, 0x31, 0x95, 0x68, - 0xda, 0xd0, 0x87, 0x78, 0xfa, 0x9a, 0xfa, 0xc7, 0x39, 0x38, 0x51, 0x34, 0x2e, 0x11, 0x9b, 0x82, - 0x76, 0xf0, 0xa5, 0x6d, 0xcd, 0xd8, 0xc2, 0x64, 0x80, 0xf0, 0x25, 0x1e, 0x0e, 0xd1, 0x9f, 0xe1, - 0x43, 0xf4, 0x2b, 0x2a, 0x4c, 0x98, 0x56, 0x1b, 0x5b, 0x0b, 0x97, 0x08, 0x4f, 0xbd, 0xcb, 0xce, - 0xac, 0x4d, 0xf6, 0x2b, 0x62, 0x9e, 0x91, 0x9f, 0xaf, 0xd1, 0xff, 0x55, 0x8f, 0xd0, 0x99, 0x9b, - 0x60, 0x82, 0xa5, 0x29, 0x33, 0x30, 0x59, 0x53, 0x17, 0xcb, 0x6a, 0xb3, 0xb2, 0x58, 0x38, 0xa2, - 0x5c, 0x06, 0x47, 0x2b, 0x8d, 0xb2, 0x5a, 0x6c, 0x54, 0x6a, 0xd5, 0x26, 0x49, 0x2f, 0x64, 0xd0, - 0x73, 0xb2, 0xa2, 0x9e, 0xbd, 0xf1, 0xcc, 0xf4, 0x83, 0x55, 0x85, 0x89, 0x16, 0xcd, 0x40, 0x86, - 0xd0, 0xe9, 0x44, 0xb5, 0x63, 0x04, 0x69, 0x82, 0xea, 0x11, 0x52, 0x4e, 0x03, 0x5c, 0xb4, 0x4c, - 0x63, 0x2b, 0x38, 0x75, 0x38, 0xa9, 0x86, 0x52, 0xd0, 0x83, 0x19, 0xc8, 0xd3, 0x7f, 0xc8, 0x95, - 0x24, 0xe4, 0x29, 0x10, 0xbc, 0xf7, 0xee, 0x5a, 0xbc, 0x44, 0x5e, 0xc1, 0x44, 0x8b, 0xbd, 0xba, - 0xba, 0x48, 0x65, 0x40, 0x2d, 0x61, 0x56, 0x95, 0x9b, 0x21, 0x4f, 0xff, 0x65, 0x5e, 0x07, 0xd1, - 0xe1, 0x45, 0x69, 0x36, 0x41, 0x3f, 0x65, 0x71, 0x99, 0xa6, 0xaf, 0xcd, 0xef, 0x93, 0x60, 0xb2, - 0x8a, 0x9d, 0xd2, 0x36, 0x6e, 0x5d, 0x40, 0x8f, 0xe3, 0x17, 0x40, 0x3b, 0x3a, 0x36, 0x9c, 0xfb, - 0x76, 0x3a, 0xfe, 0x02, 0xa8, 0x97, 0x80, 0x7e, 0x31, 0xdc, 0xf9, 0xde, 0xcd, 0xeb, 0xcf, 0x8d, - 0x7d, 0xea, 0xea, 0x95, 0x10, 0xa1, 0x32, 0x27, 0x21, 0x6f, 0x61, 0x7b, 0xb7, 0xe3, 0x2d, 0xa2, - 0xb1, 0x37, 0xf4, 0xb0, 0x2f, 0xce, 0x12, 0x27, 0xce, 0x9b, 0xc5, 0x8b, 0x18, 0x43, 0xbc, 0xd2, - 0x2c, 0x4c, 0x54, 0x0c, 0xdd, 0xd1, 0xb5, 0x0e, 0x7a, 0x5e, 0x16, 0x66, 0xeb, 0xd8, 0x59, 0xd7, - 0x2c, 0x6d, 0x07, 0x3b, 0xd8, 0xb2, 0xd1, 0xb7, 0xf9, 0x3e, 0xa1, 0xdb, 0xd1, 0x9c, 0x4d, 0xd3, - 0xda, 0xf1, 0x54, 0xd3, 0x7b, 0x77, 0x55, 0x73, 0x0f, 0x5b, 0x76, 0xc0, 0x97, 0xf7, 0xea, 0x7e, - 0xb9, 0x68, 0x5a, 0x17, 0xdc, 0x41, 0x90, 0x4d, 0xd3, 0xd8, 0xab, 0x4b, 0xaf, 0x63, 0x6e, 0xad, - 0xe2, 0x3d, 0xec, 0x85, 0x4b, 0xf3, 0xdf, 0xdd, 0xb9, 0x40, 0xdb, 0xac, 0x9a, 0x8e, 0xdb, 0x69, - 0xaf, 0x9a, 0x5b, 0x34, 0x5e, 0xec, 0xa4, 0xca, 0x27, 0x06, 0xb9, 0xb4, 0x3d, 0x4c, 0x72, 0xe5, - 0xc3, 0xb9, 0x58, 0xa2, 0x32, 0x0f, 0x8a, 0xff, 0x5b, 0x03, 0x77, 0xf0, 0x0e, 0x76, 0xac, 0x4b, - 0xe4, 0x5a, 0x88, 0x49, 0xb5, 0xcf, 0x17, 0x36, 0x40, 0x8b, 0x4f, 0xd6, 0x99, 0xf4, 0xe6, 0x39, - 0xc9, 0x1d, 0x68, 0xb2, 0x2e, 0x42, 0x71, 0x2c, 0xd7, 0x5e, 0xc9, 0xae, 0x35, 0xf3, 0x12, 0x19, - 0xb2, 0x64, 0xf0, 0x7c, 0x43, 0x86, 0x5b, 0x61, 0xda, 0xc1, 0xb6, 0xad, 0x6d, 0x61, 0x6f, 0x85, - 0x89, 0xbd, 0x2a, 0xb7, 0x41, 0xae, 0x43, 0x30, 0xa5, 0x83, 0xc3, 0xb5, 0x5c, 0xcd, 0x5c, 0x03, - 0xc3, 0xa5, 0xe5, 0x8f, 0x04, 0x04, 0x6e, 0x95, 0xfe, 0x71, 0xe6, 0x1e, 0xc8, 0x51, 0xf8, 0xa7, - 0x20, 0xb7, 0x58, 0x5e, 0xd8, 0x58, 0x2e, 0x1c, 0x71, 0x1f, 0x3d, 0xfe, 0xa6, 0x20, 0xb7, 0x54, - 0x6c, 0x14, 0x57, 0x0b, 0x92, 0x5b, 0x8f, 0x4a, 0x75, 0xa9, 0x56, 0x90, 0xdd, 0xc4, 0xf5, 0x62, - 0xb5, 0x52, 0x2a, 0x64, 0x95, 0x69, 0x98, 0x38, 0x57, 0x54, 0xab, 0x95, 0xea, 0x72, 0x21, 0x87, - 0xfe, 0x2e, 0x8c, 0xdf, 0xed, 0x3c, 0x7e, 0xd7, 0x45, 0xf1, 0xd4, 0x0f, 0xb2, 0x97, 0xfa, 0x90, - 0xdd, 0xc9, 0x41, 0xf6, 0xa3, 0x22, 0x44, 0xc6, 0xe0, 0xce, 0x94, 0x87, 0x89, 0x75, 0xcb, 0x6c, - 0x61, 0xdb, 0x46, 0xbf, 0x29, 0x41, 0xbe, 0xa4, 0x19, 0x2d, 0xdc, 0x41, 0x57, 0x04, 0x50, 0x51, - 0x57, 0xd1, 0x8c, 0x7f, 0x5a, 0xec, 0x9f, 0x32, 0xa2, 0xbd, 0x1f, 0xa3, 0x3b, 0x4f, 0x69, 0x46, - 0xc8, 0x47, 0xac, 0x97, 0x8b, 0x25, 0x35, 0x86, 0xab, 0x71, 0x24, 0x98, 0x62, 0xab, 0x01, 0xe7, - 0x71, 0x78, 0x1e, 0xfe, 0xed, 0x8c, 0xe8, 0xe4, 0xd0, 0xab, 0x81, 0x4f, 0x26, 0x42, 0x1e, 0x62, - 0x13, 0xc1, 0x41, 0xd4, 0xc6, 0xb0, 0x79, 0x28, 0xc1, 0xf4, 0x86, 0x61, 0xf7, 0x13, 0x8a, 0x78, - 0x1c, 0x7d, 0xaf, 0x1a, 0x21, 0x42, 0x07, 0x8a, 0xa3, 0x3f, 0x98, 0x5e, 0xfa, 0x82, 0xf9, 0x76, - 0x06, 0x8e, 0x2f, 0x63, 0x03, 0x5b, 0x7a, 0x8b, 0xd6, 0xc0, 0x93, 0xc4, 0x9d, 0xbc, 0x24, 0x1e, - 0xc7, 0x71, 0xde, 0xef, 0x0f, 0x5e, 0x02, 0xaf, 0xf0, 0x25, 0x70, 0x37, 0x27, 0x81, 0x9b, 0x04, - 0xe9, 0x8c, 0xe1, 0x3e, 0xf4, 0x29, 0x98, 0xa9, 0x9a, 0x8e, 0xbe, 0xa9, 0xb7, 0xa8, 0x0f, 0xda, - 0x8b, 0x65, 0xc8, 0xae, 0xea, 0xb6, 0x83, 0x8a, 0x41, 0x77, 0x72, 0x0d, 0x4c, 0xeb, 0x46, 0xab, - 0xb3, 0xdb, 0xc6, 0x2a, 0xd6, 0x68, 0xbf, 0x32, 0xa9, 0x86, 0x93, 0x82, 0xad, 0x7d, 0x97, 0x2d, - 0xd9, 0xdb, 0xda, 0xff, 0xa4, 0xf0, 0x32, 0x4c, 0x98, 0x05, 0x12, 0x90, 0x32, 0xc2, 0xee, 0x2a, - 0xc2, 0xac, 0x11, 0xca, 0xea, 0x19, 0xec, 0xbd, 0x17, 0x0a, 0x84, 0xc9, 0xa9, 0xfc, 0x1f, 0xe8, - 0xdd, 0x42, 0x8d, 0x75, 0x10, 0x43, 0xc9, 0x90, 0x59, 0x1a, 0x62, 0x92, 0xac, 0xc0, 0x5c, 0xa5, - 0xda, 0x28, 0xab, 0xd5, 0xe2, 0x2a, 0xcb, 0x22, 0xa3, 0xef, 0x4a, 0x90, 0x53, 0x71, 0xb7, 0x73, - 0x29, 0x1c, 0x31, 0x9a, 0x39, 0x8a, 0x67, 0x7c, 0x47, 0x71, 0x65, 0x09, 0x40, 0x6b, 0xb9, 0x05, - 0x93, 0x2b, 0xb5, 0xa4, 0xbe, 0x71, 0x4c, 0xb9, 0x0a, 0x16, 0xfd, 0xdc, 0x6a, 0xe8, 0x4f, 0xf4, - 0x90, 0xf0, 0xce, 0x11, 0x47, 0x8d, 0x70, 0x18, 0xd1, 0x27, 0xbc, 0x47, 0x68, 0xb3, 0x67, 0x20, - 0xb9, 0xc3, 0x11, 0xff, 0x97, 0x24, 0xc8, 0x36, 0xdc, 0xde, 0x32, 0xd4, 0x71, 0x7e, 0x62, 0x38, - 0x1d, 0x77, 0xc9, 0x44, 0xe8, 0xf8, 0x5d, 0x30, 0x13, 0xd6, 0x58, 0xe6, 0x2a, 0x11, 0xab, 0xe2, - 0xdc, 0x0f, 0xc3, 0x68, 0x78, 0x1f, 0x76, 0x0e, 0x47, 0xc4, 0x1f, 0x7b, 0x3c, 0xc0, 0x1a, 0xde, - 0x39, 0x8f, 0x2d, 0x7b, 0x5b, 0xef, 0xa2, 0xbf, 0x97, 0x61, 0x6a, 0x19, 0x3b, 0x75, 0x47, 0x73, - 0x76, 0xed, 0x9e, 0xed, 0x4e, 0xc3, 0x2c, 0x69, 0xad, 0x6d, 0xcc, 0xba, 0x23, 0xef, 0x15, 0xbd, - 0x5d, 0x16, 0xf5, 0x27, 0x0a, 0xca, 0x99, 0xf7, 0xcb, 0x88, 0xc0, 0xe4, 0x09, 0x90, 0x6d, 0x6b, - 0x8e, 0xc6, 0xb0, 0xb8, 0xa2, 0x07, 0x8b, 0x80, 0x90, 0x4a, 0xb2, 0xa1, 0xdf, 0x95, 0x44, 0x1c, - 0x8a, 0x04, 0xca, 0x4f, 0x06, 0xc2, 0xbb, 0x33, 0x43, 0xa0, 0x70, 0x0c, 0x66, 0xab, 0xb5, 0x46, - 0x73, 0xb5, 0xb6, 0xbc, 0x5c, 0x76, 0x53, 0x0b, 0xb2, 0x72, 0x12, 0x94, 0xf5, 0xe2, 0x7d, 0x6b, - 0xe5, 0x6a, 0xa3, 0x59, 0xad, 0x2d, 0x96, 0xd9, 0x9f, 0x59, 0xe5, 0x28, 0x4c, 0x97, 0x8a, 0xa5, - 0x15, 0x2f, 0x21, 0xa7, 0x9c, 0x82, 0xe3, 0x6b, 0xe5, 0xb5, 0x85, 0xb2, 0x5a, 0x5f, 0xa9, 0xac, - 0x37, 0x5d, 0x32, 0x4b, 0xb5, 0x8d, 0xea, 0x62, 0x21, 0xaf, 0x20, 0x38, 0x19, 0xfa, 0x72, 0x4e, - 0xad, 0x55, 0x97, 0x9b, 0xf5, 0x46, 0xb1, 0x51, 0x2e, 0x4c, 0x28, 0x97, 0xc1, 0xd1, 0x52, 0xb1, - 0x4a, 0xb2, 0x97, 0x6a, 0xd5, 0x6a, 0xb9, 0xd4, 0x28, 0x4c, 0xa2, 0xef, 0x67, 0x61, 0xba, 0x62, - 0x57, 0xb5, 0x1d, 0x7c, 0x56, 0xeb, 0xe8, 0x6d, 0xf4, 0xbc, 0xd0, 0xcc, 0xe3, 0x3a, 0x98, 0xb5, - 0xe8, 0x23, 0x6e, 0x37, 0x74, 0x4c, 0xd1, 0x9c, 0x55, 0xf9, 0x44, 0x77, 0x4e, 0x6e, 0x10, 0x02, - 0xde, 0x9c, 0x9c, 0xbe, 0x29, 0x0b, 0x00, 0xf4, 0xa9, 0x11, 0x5c, 0xee, 0x7a, 0xa6, 0xb7, 0x35, - 0x69, 0x3b, 0xd8, 0xc6, 0xd6, 0x9e, 0xde, 0xc2, 0x5e, 0x4e, 0x35, 0xf4, 0x17, 0xfa, 0xb2, 0x2c, - 0xba, 0xbf, 0x18, 0x02, 0x35, 0x54, 0x9d, 0x88, 0xde, 0xf0, 0x97, 0x64, 0x91, 0xdd, 0x41, 0x21, - 0x92, 0xc9, 0x34, 0xe5, 0x57, 0xa5, 0xe1, 0x96, 0x6d, 0x1b, 0xb5, 0x5a, 0xb3, 0xbe, 0x52, 0x53, - 0x1b, 0x05, 0x59, 0x99, 0x81, 0x49, 0xf7, 0x75, 0xb5, 0x56, 0x5d, 0x2e, 0x64, 0x95, 0x13, 0x70, - 0x6c, 0xa5, 0x58, 0x6f, 0x56, 0xaa, 0x67, 0x8b, 0xab, 0x95, 0xc5, 0x66, 0x69, 0xa5, 0xa8, 0xd6, - 0x0b, 0x39, 0xe5, 0x0a, 0x38, 0xd1, 0xa8, 0x94, 0xd5, 0xe6, 0x52, 0xb9, 0xd8, 0xd8, 0x50, 0xcb, - 0xf5, 0x66, 0xb5, 0xd6, 0xac, 0x16, 0xd7, 0xca, 0x85, 0xbc, 0xdb, 0xfc, 0xc9, 0xa7, 0x40, 0x6d, - 0x26, 0xf6, 0x2b, 0xe3, 0x64, 0x84, 0x32, 0x4e, 0xf5, 0x2a, 0x23, 0x84, 0xd5, 0x4a, 0x2d, 0xd7, - 0xcb, 0xea, 0xd9, 0x72, 0x61, 0xba, 0x9f, 0xae, 0xcd, 0x28, 0xc7, 0xa1, 0xe0, 0xf2, 0xd0, 0xac, - 0xd4, 0xbd, 0x9c, 0x8b, 0x85, 0x59, 0xf4, 0xd1, 0x3c, 0x9c, 0x54, 0xf1, 0x96, 0x6e, 0x3b, 0xd8, - 0x5a, 0xd7, 0x2e, 0xed, 0x60, 0xc3, 0xf1, 0x3a, 0xf9, 0x7f, 0x4d, 0xac, 0x8c, 0x6b, 0x30, 0xdb, - 0xa5, 0x34, 0xd6, 0xb0, 0xb3, 0x6d, 0xb6, 0xd9, 0x28, 0xfc, 0xb8, 0xc8, 0x9e, 0x63, 0x7e, 0x3d, - 0x9c, 0x5d, 0xe5, 0xff, 0x0e, 0xe9, 0xb6, 0x1c, 0xa3, 0xdb, 0xd9, 0x61, 0x74, 0x5b, 0xb9, 0x0a, - 0xa6, 0x76, 0x6d, 0x6c, 0x95, 0x77, 0x34, 0xbd, 0xe3, 0x5d, 0xce, 0xe9, 0x27, 0xa0, 0xb7, 0x64, - 0x45, 0x4f, 0xac, 0x84, 0xea, 0xd2, 0x5f, 0x8c, 0x11, 0x7d, 0xeb, 0x69, 0x00, 0x56, 0xd9, 0x0d, - 0xab, 0xc3, 0x94, 0x35, 0x94, 0xe2, 0xf2, 0x77, 0x5e, 0xef, 0x74, 0x74, 0x63, 0xcb, 0xdf, 0xf7, - 0x0f, 0x12, 0xd0, 0xaf, 0xca, 0x22, 0x27, 0x58, 0x92, 0xf2, 0x96, 0xac, 0x35, 0x3d, 0x24, 0x8d, - 0xb9, 0xdf, 0xdd, 0xdf, 0x74, 0xf2, 0x4a, 0x01, 0x66, 0x48, 0x1a, 0x6b, 0x81, 0x85, 0x09, 0xb7, - 0x0f, 0xf6, 0xc8, 0xad, 0x95, 0x1b, 0x2b, 0xb5, 0x45, 0xff, 0xdb, 0xa4, 0x4b, 0xd2, 0x65, 0xa6, - 0x58, 0xbd, 0x8f, 0xb4, 0xc6, 0x29, 0xe5, 0x31, 0x70, 0x45, 0xa8, 0xc3, 0x2e, 0xae, 0xaa, 0xe5, - 0xe2, 0xe2, 0x7d, 0xcd, 0xf2, 0x33, 0x2a, 0xf5, 0x46, 0x9d, 0x6f, 0x5c, 0x5e, 0x3b, 0x9a, 0x76, - 0xf9, 0x2d, 0xaf, 0x15, 0x2b, 0xab, 0xac, 0x7f, 0x5f, 0xaa, 0xa9, 0x6b, 0xc5, 0x46, 0x61, 0x06, - 0xbd, 0x44, 0x86, 0xc2, 0x32, 0x76, 0xd6, 0x4d, 0xcb, 0xd1, 0x3a, 0xab, 0xba, 0x71, 0x61, 0xc3, - 0xea, 0x70, 0x93, 0x4d, 0xe1, 0x30, 0x1d, 0xfc, 0x10, 0xc9, 0x11, 0x8c, 0xde, 0x11, 0xef, 0x92, - 0x6c, 0x81, 0x32, 0x05, 0x09, 0xe8, 0x59, 0x92, 0xc8, 0x72, 0xb7, 0x78, 0xa9, 0xc9, 0xf4, 0xe4, - 0xd9, 0xe3, 0x1e, 0x9f, 0xfb, 0xa0, 0x96, 0x47, 0xcf, 0xcd, 0xc2, 0xe4, 0x92, 0x6e, 0x68, 0x1d, - 0xfd, 0x99, 0x5c, 0xfc, 0xd2, 0xa0, 0x8f, 0xc9, 0xc4, 0xf4, 0x31, 0xd2, 0x50, 0xe3, 0xe7, 0xaf, - 0xcb, 0xa2, 0xcb, 0x0b, 0x21, 0xd9, 0x7b, 0x4c, 0x46, 0x0c, 0x9e, 0xef, 0x97, 0x44, 0x96, 0x17, - 0x06, 0xd3, 0x4b, 0x86, 0xe1, 0xc7, 0x7f, 0x30, 0x6c, 0xac, 0x9e, 0xf6, 0x3d, 0xd9, 0x4f, 0x15, - 0xa6, 0xd0, 0x9f, 0xcb, 0x80, 0x96, 0xb1, 0x73, 0x16, 0x5b, 0xfe, 0x54, 0x80, 0xf4, 0xfa, 0xcc, - 0xde, 0x0e, 0x35, 0xd9, 0x37, 0x84, 0x01, 0x3c, 0xc7, 0x03, 0x58, 0x8c, 0x69, 0x3c, 0x11, 0xa4, - 0x23, 0x1a, 0x6f, 0x05, 0xf2, 0x36, 0xf9, 0xce, 0xd4, 0xec, 0x89, 0xd1, 0xc3, 0x25, 0x21, 0x16, - 0xa6, 0x4e, 0x09, 0xab, 0x8c, 0x00, 0xfa, 0x8e, 0x3f, 0x09, 0xfa, 0x49, 0x4e, 0x3b, 0x96, 0x0e, - 0xcc, 0x6c, 0x32, 0x7d, 0xb1, 0xd2, 0x55, 0x97, 0x7e, 0xf6, 0x0d, 0x7a, 0x7f, 0x0e, 0x8e, 0xf7, - 0xab, 0x0e, 0xfa, 0xbd, 0x0c, 0xb7, 0xc3, 0x8e, 0xc9, 0x90, 0x9f, 0x61, 0x1b, 0x88, 0xee, 0x8b, - 0xf2, 0x64, 0x38, 0xe1, 0x2f, 0xc3, 0x35, 0xcc, 0x2a, 0xbe, 0x68, 0x77, 0xb0, 0xe3, 0x60, 0x8b, - 0x54, 0x6d, 0x52, 0xed, 0xff, 0x51, 0x79, 0x2a, 0x5c, 0xae, 0x1b, 0xb6, 0xde, 0xc6, 0x56, 0x43, - 0xef, 0xda, 0x45, 0xa3, 0xdd, 0xd8, 0x75, 0x4c, 0x4b, 0xd7, 0xd8, 0x55, 0x92, 0x93, 0x6a, 0xd4, - 0x67, 0xe5, 0x46, 0x28, 0xe8, 0x76, 0xcd, 0x38, 0x6f, 0x6a, 0x56, 0x5b, 0x37, 0xb6, 0x56, 0x75, - 0xdb, 0x61, 0x1e, 0xc0, 0xfb, 0xd2, 0xd1, 0x3f, 0xc8, 0xa2, 0x87, 0xe9, 0x06, 0xc0, 0x1a, 0xd1, - 0xa1, 0xfc, 0xa2, 0x2c, 0x72, 0x3c, 0x2e, 0x19, 0xed, 0x64, 0xca, 0xf2, 0x9c, 0x71, 0x1b, 0x12, - 0xfd, 0x47, 0x70, 0xd2, 0xb5, 0xd0, 0x74, 0xcf, 0x10, 0x38, 0x5b, 0x56, 0x2b, 0x4b, 0x95, 0xb2, - 0x6b, 0x56, 0x9c, 0x80, 0x63, 0xc1, 0xb7, 0xc5, 0xfb, 0x9a, 0xf5, 0x72, 0xb5, 0x51, 0x98, 0x74, - 0xfb, 0x29, 0x9a, 0xbc, 0x54, 0xac, 0xac, 0x96, 0x17, 0x9b, 0x8d, 0x9a, 0xfb, 0x65, 0x71, 0x38, - 0xd3, 0x02, 0x3d, 0x98, 0x85, 0xa3, 0x44, 0xb6, 0x97, 0x88, 0x54, 0x5d, 0xa1, 0xf4, 0xf8, 0xda, - 0xfa, 0x00, 0x4d, 0x51, 0xf1, 0xa2, 0x4f, 0x0b, 0xdf, 0x94, 0x19, 0x82, 0xb0, 0xa7, 0x8c, 0x08, - 0xcd, 0xf8, 0xb6, 0x24, 0x12, 0xa1, 0x42, 0x98, 0x6c, 0x32, 0xa5, 0xf8, 0xb7, 0x71, 0x8f, 0x38, - 0xd1, 0xe0, 0x13, 0x2b, 0xb3, 0x44, 0x7e, 0x7e, 0xc6, 0x7a, 0x45, 0x25, 0xea, 0x30, 0x07, 0x40, - 0x52, 0x88, 0x06, 0x51, 0x3d, 0xe8, 0x3b, 0x5e, 0x45, 0xe9, 0x41, 0xb1, 0xd4, 0xa8, 0x9c, 0x2d, - 0x47, 0xe9, 0xc1, 0xa7, 0x64, 0x98, 0x5c, 0xc6, 0x8e, 0x3b, 0xa7, 0xb2, 0xd1, 0xd3, 0x04, 0xd6, - 0x7f, 0x5c, 0x33, 0xa6, 0x63, 0xb6, 0xb4, 0x8e, 0xbf, 0x0c, 0x40, 0xdf, 0xd0, 0x2f, 0x0c, 0x63, - 0x82, 0x78, 0x45, 0x47, 0x8c, 0x57, 0x3f, 0x0e, 0x39, 0xc7, 0xfd, 0xcc, 0x96, 0xa1, 0x7f, 0x24, - 0x72, 0xb8, 0x72, 0x89, 0x2c, 0x6a, 0x8e, 0xa6, 0xd2, 0xfc, 0xa1, 0xd1, 0x49, 0xd0, 0x76, 0x89, - 0x60, 0xe4, 0x07, 0xd1, 0xfe, 0xfc, 0x3b, 0x19, 0x4e, 0xd0, 0xf6, 0x51, 0xec, 0x76, 0xeb, 0x8e, - 0x69, 0x61, 0x15, 0xb7, 0xb0, 0xde, 0x75, 0x7a, 0xd6, 0xf7, 0x2c, 0x9a, 0xea, 0x6d, 0x36, 0xb3, - 0x57, 0xf4, 0x5a, 0x59, 0x34, 0x06, 0xf3, 0xbe, 0xf6, 0xd8, 0x53, 0x5e, 0x44, 0x63, 0xff, 0xb0, - 0x24, 0x12, 0x55, 0x39, 0x21, 0xf1, 0x64, 0x40, 0x7d, 0xe0, 0x10, 0x80, 0xf2, 0x56, 0x6e, 0xd4, - 0x72, 0xa9, 0x5c, 0x59, 0x77, 0x07, 0x81, 0xab, 0xe1, 0xca, 0xf5, 0x0d, 0xb5, 0xb4, 0x52, 0xac, - 0x97, 0x9b, 0x6a, 0x79, 0xb9, 0x52, 0x6f, 0x30, 0xa7, 0x2c, 0xfa, 0xd7, 0x84, 0x72, 0x15, 0x9c, - 0xaa, 0x6f, 0x2c, 0xd4, 0x4b, 0x6a, 0x65, 0x9d, 0xa4, 0xab, 0xe5, 0x6a, 0xf9, 0x1c, 0xfb, 0x3a, - 0x89, 0xde, 0x5b, 0x80, 0x69, 0x77, 0x02, 0x50, 0xa7, 0xf3, 0x02, 0xf4, 0x8d, 0x2c, 0x4c, 0xab, - 0xd8, 0x36, 0x3b, 0x7b, 0x64, 0x8e, 0x30, 0xae, 0xa9, 0xc7, 0xb7, 0x64, 0xd1, 0xf3, 0xdb, 0x21, - 0x66, 0xe7, 0x43, 0x8c, 0x46, 0x4f, 0x34, 0xb5, 0x3d, 0x4d, 0xef, 0x68, 0xe7, 0x59, 0x57, 0x33, - 0xa9, 0x06, 0x09, 0xca, 0x3c, 0x28, 0xe6, 0x45, 0x03, 0x5b, 0xf5, 0xd6, 0xc5, 0xb2, 0xb3, 0x5d, - 0x6c, 0xb7, 0x2d, 0x6c, 0xdb, 0x6c, 0xf5, 0xa2, 0xcf, 0x17, 0xe5, 0x06, 0x38, 0x4a, 0x52, 0x43, - 0x99, 0xa9, 0x83, 0x4c, 0x6f, 0xb2, 0x9f, 0xb3, 0x68, 0x5c, 0xf2, 0x72, 0xe6, 0x42, 0x39, 0x83, - 0xe4, 0xf0, 0x71, 0x89, 0x3c, 0x7f, 0x4a, 0xe7, 0x1a, 0x98, 0x36, 0xb4, 0x1d, 0x5c, 0x7e, 0xa0, - 0xab, 0x5b, 0xd8, 0x26, 0x8e, 0x31, 0xb2, 0x1a, 0x4e, 0x42, 0xef, 0x17, 0x3a, 0x6f, 0x2e, 0x26, - 0xb1, 0x64, 0xba, 0xbf, 0x3c, 0x84, 0xea, 0xf7, 0xe9, 0x67, 0x64, 0xf4, 0x5e, 0x19, 0x66, 0x18, - 0x53, 0x45, 0xe3, 0x52, 0xa5, 0x8d, 0xae, 0xe6, 0x8c, 0x5f, 0xcd, 0x4d, 0xf3, 0x8c, 0x5f, 0xf2, - 0x82, 0x7e, 0x59, 0x16, 0x75, 0x77, 0xee, 0x53, 0x71, 0x52, 0x46, 0xb4, 0xe3, 0xe8, 0xa6, 0xb9, - 0xcb, 0x1c, 0x55, 0x27, 0x55, 0xfa, 0x92, 0xe6, 0xa2, 0x1e, 0xfa, 0x43, 0x21, 0x67, 0x6a, 0xc1, - 0x6a, 0x1c, 0x12, 0x80, 0x1f, 0x93, 0x61, 0x8e, 0x71, 0x55, 0x67, 0xe7, 0x7c, 0x84, 0x0e, 0xbc, - 0xfd, 0x8a, 0xb0, 0x21, 0xd8, 0xa7, 0xfe, 0xac, 0xa4, 0x47, 0x0d, 0x90, 0x1f, 0x14, 0x0a, 0x8e, - 0x26, 0x5c, 0x91, 0x43, 0x82, 0xf2, 0xad, 0x59, 0x98, 0xde, 0xb0, 0xb1, 0xc5, 0xfc, 0xf6, 0xd1, - 0xc3, 0x59, 0x90, 0x97, 0x31, 0xb7, 0x91, 0xfa, 0x7c, 0x61, 0x0f, 0xdf, 0x70, 0x65, 0x43, 0x44, - 0x5d, 0x1b, 0x29, 0x02, 0xb6, 0xeb, 0x61, 0x8e, 0x8a, 0xb4, 0xe8, 0x38, 0xae, 0x91, 0xe8, 0x79, - 0xd3, 0xf6, 0xa4, 0x8e, 0x62, 0xab, 0x88, 0x94, 0xe5, 0x66, 0x29, 0xb9, 0x3c, 0xad, 0xe2, 0x4d, - 0x3a, 0x9f, 0xcd, 0xaa, 0x3d, 0xa9, 0xca, 0x2d, 0x70, 0x99, 0xd9, 0xc5, 0xf4, 0xfc, 0x4a, 0x28, - 0x73, 0x8e, 0x64, 0xee, 0xf7, 0x09, 0x7d, 0x43, 0xc8, 0x57, 0x57, 0x5c, 0x3a, 0xc9, 0x74, 0xa1, - 0x3b, 0x1a, 0x93, 0xe4, 0x38, 0x14, 0xdc, 0x1c, 0x64, 0xff, 0x45, 0x2d, 0xd7, 0x6b, 0xab, 0x67, - 0xcb, 0xfd, 0x97, 0x31, 0x72, 0xe8, 0x39, 0x32, 0x4c, 0x2d, 0x58, 0xa6, 0xd6, 0x6e, 0x69, 0xb6, - 0x83, 0xbe, 0x23, 0xc1, 0xcc, 0xba, 0x76, 0xa9, 0x63, 0x6a, 0x6d, 0xe2, 0xdf, 0xdf, 0xd3, 0x17, - 0x74, 0xe9, 0x27, 0xaf, 0x2f, 0x60, 0xaf, 0xfc, 0xc1, 0x40, 0xff, 0xe8, 0x5e, 0x46, 0xe4, 0x42, - 0x4d, 0x7f, 0x9b, 0x4f, 0xea, 0x17, 0xac, 0xd4, 0xe3, 0x6b, 0x3e, 0xcc, 0x53, 0x84, 0x45, 0xf9, - 0x5e, 0xb1, 0xf0, 0xa3, 0x22, 0x24, 0x0f, 0x67, 0x57, 0xfe, 0xb9, 0x93, 0x90, 0x5f, 0xc4, 0xc4, - 0x8a, 0xfb, 0x1f, 0x12, 0x4c, 0xd4, 0xb1, 0x43, 0x2c, 0xb8, 0xdb, 0x38, 0x4f, 0xe1, 0x36, 0xc9, - 0x10, 0x38, 0xb1, 0x7b, 0xef, 0xee, 0x64, 0x3d, 0x74, 0xde, 0x9a, 0x3c, 0x27, 0xf0, 0x48, 0xa4, - 0xe5, 0xce, 0xb3, 0x32, 0x0f, 0xe4, 0x91, 0x18, 0x4b, 0x2a, 0x7d, 0x5f, 0xab, 0xb7, 0x4b, 0xcc, - 0xb5, 0x2a, 0xd4, 0xeb, 0xbd, 0x32, 0xac, 0x9f, 0xb1, 0xde, 0x66, 0x8c, 0xf9, 0x18, 0xe7, 0xa8, - 0x27, 0xc1, 0x04, 0x95, 0xb9, 0x37, 0x1f, 0xed, 0xf5, 0x53, 0xa0, 0x24, 0xc8, 0xd9, 0x6b, 0x2f, - 0xa7, 0xa0, 0x8b, 0x5a, 0x74, 0xe1, 0x63, 0x89, 0x41, 0x30, 0x53, 0xc5, 0xce, 0x45, 0xd3, 0xba, - 0x50, 0x77, 0x34, 0x07, 0xa3, 0x7f, 0x93, 0x40, 0xae, 0x63, 0x27, 0x1c, 0xfd, 0xa4, 0x0a, 0xc7, - 0x68, 0x85, 0x58, 0x46, 0xd2, 0x7f, 0xd3, 0x8a, 0x5c, 0xd3, 0x57, 0x08, 0xa1, 0x7c, 0xea, 0xfe, - 0x5f, 0xd1, 0x6f, 0xf6, 0x0d, 0xfa, 0x24, 0xf5, 0x99, 0x34, 0x30, 0xc9, 0x84, 0x19, 0x74, 0x15, - 0x2c, 0x42, 0x4f, 0xdf, 0x27, 0x64, 0x56, 0x8b, 0xd1, 0x3c, 0x9c, 0xae, 0xe0, 0x83, 0x57, 0x40, - 0xb6, 0xb4, 0xad, 0x39, 0xe8, 0x6d, 0x32, 0x40, 0xb1, 0xdd, 0x5e, 0xa3, 0x3e, 0xe0, 0x61, 0x87, - 0xb4, 0x33, 0x30, 0xd3, 0xda, 0xd6, 0x82, 0xbb, 0x4d, 0x68, 0x7f, 0xc0, 0xa5, 0x29, 0x4f, 0x0e, - 0x9c, 0xc9, 0xa9, 0x54, 0x51, 0x0f, 0x4c, 0x6e, 0x19, 0x8c, 0xb6, 0xef, 0x68, 0xce, 0x87, 0xc2, - 0x8c, 0x3d, 0x42, 0xe7, 0xfe, 0x3e, 0x1f, 0xb0, 0x17, 0x3d, 0x87, 0x63, 0xa4, 0xfd, 0x03, 0x36, - 0x41, 0x42, 0xc2, 0x93, 0xde, 0x62, 0x01, 0x3d, 0xe2, 0xf9, 0x1a, 0x4b, 0xe8, 0x5a, 0xa5, 0xdc, - 0xd6, 0x3d, 0xd1, 0xb2, 0x80, 0x59, 0xe8, 0xa1, 0x4c, 0x32, 0xf8, 0xe2, 0x05, 0x77, 0x37, 0xcc, - 0xe2, 0xb6, 0xee, 0x60, 0xaf, 0x96, 0x4c, 0x80, 0x71, 0x10, 0xf3, 0x3f, 0xa0, 0x67, 0x0b, 0x07, - 0x5d, 0x23, 0x02, 0xdd, 0x5f, 0xa3, 0x88, 0xf6, 0x27, 0x16, 0x46, 0x4d, 0x8c, 0x66, 0xfa, 0x60, - 0xfd, 0x82, 0x0c, 0x27, 0x1a, 0xe6, 0xd6, 0x56, 0x07, 0x7b, 0x62, 0xc2, 0xd4, 0x3b, 0x13, 0x69, - 0xa3, 0x84, 0x8b, 0xec, 0x04, 0x99, 0xf7, 0xeb, 0xfe, 0x51, 0x32, 0xf7, 0x85, 0x3f, 0x31, 0x15, - 0x3b, 0x8b, 0x22, 0xe2, 0xea, 0xcb, 0x67, 0x04, 0x0a, 0x62, 0x01, 0x9f, 0x85, 0xc9, 0xa6, 0x0f, - 0xc4, 0xe7, 0x25, 0x98, 0xa5, 0x37, 0x57, 0x7a, 0x0a, 0x7a, 0xef, 0x08, 0x01, 0x40, 0xdf, 0xc9, - 0x88, 0xfa, 0xd9, 0x12, 0x99, 0x70, 0x9c, 0x44, 0x88, 0x58, 0x2c, 0xa8, 0xca, 0x40, 0x72, 0xe9, - 0x8b, 0xf6, 0x4f, 0x64, 0x98, 0x5e, 0xc6, 0x5e, 0x4b, 0xb3, 0x13, 0xf7, 0x44, 0x67, 0x60, 0x86, - 0x5c, 0xdf, 0x56, 0x63, 0xc7, 0x24, 0xe9, 0xaa, 0x19, 0x97, 0xa6, 0x5c, 0x07, 0xb3, 0xe7, 0xf1, - 0xa6, 0x69, 0xe1, 0x1a, 0x77, 0x96, 0x92, 0x4f, 0x8c, 0x08, 0x4f, 0xc7, 0xc5, 0x41, 0x5b, 0xe0, - 0xb1, 0xb9, 0x69, 0xbf, 0x30, 0x43, 0x55, 0x89, 0x18, 0x73, 0x9e, 0x02, 0x93, 0x0c, 0x79, 0xcf, - 0x4c, 0x8b, 0xeb, 0x17, 0xfd, 0xbc, 0xe8, 0x35, 0x3e, 0xa2, 0x65, 0x0e, 0xd1, 0x27, 0x26, 0x61, - 0x62, 0x2c, 0xf7, 0xbb, 0x17, 0x42, 0xe5, 0x2f, 0x5c, 0xaa, 0xb4, 0x6d, 0xb4, 0x96, 0x0c, 0xd3, - 0xd3, 0x00, 0x7e, 0xe3, 0xf0, 0xc2, 0x5a, 0x84, 0x52, 0xf8, 0xc8, 0xf5, 0xb1, 0x07, 0xf5, 0x7a, - 0xc5, 0x41, 0xd8, 0x19, 0x31, 0x30, 0x62, 0x07, 0xfc, 0x44, 0x38, 0x49, 0x1f, 0x9d, 0x4f, 0xca, - 0x70, 0xc2, 0x3f, 0x7f, 0xb4, 0xaa, 0xd9, 0x41, 0xbb, 0x2b, 0x25, 0x83, 0x88, 0x3b, 0xf0, 0xe1, - 0x37, 0x96, 0x6f, 0x26, 0x1b, 0x33, 0xfa, 0x72, 0x32, 0x5a, 0x74, 0x94, 0x9b, 0xe0, 0x98, 0xb1, - 0xbb, 0xe3, 0x4b, 0x9d, 0xb4, 0x78, 0xd6, 0xc2, 0xf7, 0x7f, 0x48, 0x32, 0x32, 0x89, 0x30, 0x3f, - 0x96, 0x39, 0x25, 0x77, 0xa4, 0xeb, 0x09, 0x89, 0x60, 0x44, 0xff, 0x92, 0x49, 0xd4, 0xbb, 0x0d, - 0x3e, 0xf3, 0x95, 0xa0, 0x97, 0x3a, 0xc4, 0x03, 0x5f, 0x67, 0x26, 0x20, 0x57, 0xde, 0xe9, 0x3a, - 0x97, 0xce, 0x3c, 0x16, 0x66, 0xeb, 0x8e, 0x85, 0xb5, 0x9d, 0xd0, 0xce, 0x80, 0x63, 0x5e, 0xc0, - 0x86, 0xb7, 0x33, 0x40, 0x5e, 0x6e, 0xbf, 0x0d, 0x26, 0x0c, 0xb3, 0xa9, 0xed, 0x3a, 0xdb, 0xca, - 0xd5, 0xfb, 0x8e, 0xd4, 0x33, 0xf0, 0x6b, 0x2c, 0x86, 0xd1, 0x97, 0xef, 0x20, 0x6b, 0xc3, 0x79, - 0xc3, 0x2c, 0xee, 0x3a, 0xdb, 0x0b, 0x57, 0x7d, 0xec, 0x6f, 0x4f, 0x67, 0x3e, 0xf5, 0xb7, 0xa7, - 0x33, 0x5f, 0xfa, 0xdb, 0xd3, 0x99, 0x5f, 0xf9, 0xca, 0xe9, 0x23, 0x9f, 0xfa, 0xca, 0xe9, 0x23, - 0x9f, 0xff, 0xca, 0xe9, 0x23, 0x3f, 0x29, 0x75, 0xcf, 0x9f, 0xcf, 0x13, 0x2a, 0x4f, 0xfa, 0x7f, - 0x03, 0x00, 0x00, 0xff, 0xff, 0x26, 0x07, 0x39, 0x30, 0x26, 0x08, 0x02, 0x00, + // 19614 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0xbd, 0x7d, 0x98, 0x23, 0x47, + 0x79, 0x2f, 0xba, 0xea, 0x96, 0x34, 0x33, 0xef, 0x7c, 0xac, 0xb6, 0xbd, 0xbb, 0x5e, 0x97, 0xcd, + 0x7a, 0xb3, 0x36, 0xc6, 0x31, 0x66, 0x6c, 0x0c, 0x21, 0xd8, 0xd8, 0xd8, 0x1a, 0x8d, 0x66, 0x46, + 0xf6, 0x8c, 0x34, 0x69, 0x69, 0x76, 0x71, 0x72, 0x72, 0x75, 0x7a, 0xa5, 0x9a, 0x99, 0xf6, 0x6a, + 0xba, 0x95, 0xee, 0x9e, 0x59, 0x2f, 0xf7, 0x39, 0xf7, 0x84, 0x10, 0x07, 0x12, 0x42, 0xc8, 0x17, + 0x49, 0x08, 0xdf, 0x06, 0xc3, 0x81, 0x04, 0x08, 0xdf, 0x07, 0x92, 0x00, 0xe1, 0x23, 0x10, 0x42, + 0x08, 0x81, 0x10, 0x08, 0x09, 0x37, 0x10, 0x08, 0x21, 0xe7, 0x09, 0x87, 0x9b, 0xdc, 0x13, 0x08, + 0x09, 0x5c, 0xee, 0xd3, 0x55, 0xd5, 0x1f, 0xa5, 0x51, 0xb7, 0xaa, 0x35, 0x6a, 0x8d, 0x09, 0xe7, + 0xbf, 0xee, 0xea, 0xea, 0xb7, 0xde, 0x7a, 0x7f, 0x6f, 0x55, 0xbd, 0x55, 0xf5, 0xd6, 0x5b, 0x70, + 0xaa, 0x7b, 0xe1, 0x96, 0xae, 0x65, 0x3a, 0xa6, 0x7d, 0x4b, 0xcb, 0xdc, 0xd9, 0xd1, 0x8c, 0xb6, + 0x3d, 0x4f, 0xde, 0x95, 0x09, 0xcd, 0xb8, 0xec, 0x5c, 0xee, 0x62, 0x74, 0x7d, 0xf7, 0xe2, 0xd6, + 0x2d, 0x1d, 0xfd, 0xc2, 0x2d, 0xdd, 0x0b, 0xb7, 0xec, 0x98, 0x6d, 0xdc, 0xf1, 0x7e, 0x20, 0x2f, + 0x2c, 0x3b, 0xba, 0x31, 0x2a, 0x57, 0xc7, 0x6c, 0x69, 0x1d, 0xdb, 0x31, 0x2d, 0xcc, 0x72, 0x9e, + 0x0c, 0x8a, 0xc4, 0x7b, 0xd8, 0x70, 0x3c, 0x0a, 0xd7, 0x6c, 0x99, 0xe6, 0x56, 0x07, 0xd3, 0x6f, + 0x17, 0x76, 0x37, 0x6f, 0xb1, 0x1d, 0x6b, 0xb7, 0xe5, 0xb0, 0xaf, 0x67, 0x7a, 0xbf, 0xb6, 0xb1, + 0xdd, 0xb2, 0xf4, 0xae, 0x63, 0x5a, 0x34, 0xc7, 0xd9, 0x9f, 0xfc, 0x85, 0x49, 0x90, 0xd5, 0x6e, + 0x0b, 0x7d, 0x63, 0x02, 0xe4, 0x62, 0xb7, 0x8b, 0x3e, 0x24, 0x01, 0x2c, 0x63, 0xe7, 0x1c, 0xb6, + 0x6c, 0xdd, 0x34, 0xd0, 0x51, 0x98, 0x50, 0xf1, 0x4f, 0xec, 0x62, 0xdb, 0xb9, 0x23, 0xfb, 0xdc, + 0xaf, 0xc8, 0x19, 0xf4, 0x88, 0x04, 0x93, 0x2a, 0xb6, 0xbb, 0xa6, 0x61, 0x63, 0xe5, 0x1e, 0xc8, + 0x61, 0xcb, 0x32, 0xad, 0x53, 0x99, 0x33, 0x99, 0x1b, 0xa7, 0x6f, 0xbb, 0x69, 0x9e, 0x55, 0x7f, + 0x5e, 0xed, 0xb6, 0xe6, 0x8b, 0xdd, 0xee, 0x7c, 0x40, 0x69, 0xde, 0xfb, 0x69, 0xbe, 0xec, 0xfe, + 0xa1, 0xd2, 0x1f, 0x95, 0x53, 0x30, 0xb1, 0x47, 0x33, 0x9c, 0x92, 0xce, 0x64, 0x6e, 0x9c, 0x52, + 0xbd, 0x57, 0xf7, 0x4b, 0x1b, 0x3b, 0x9a, 0xde, 0xb1, 0x4f, 0xc9, 0xf4, 0x0b, 0x7b, 0x45, 0x0f, + 0x67, 0x20, 0x47, 0x88, 0x28, 0x25, 0xc8, 0xb6, 0xcc, 0x36, 0x26, 0xc5, 0xcf, 0xdd, 0x76, 0x8b, + 0x78, 0xf1, 0xf3, 0x25, 0xb3, 0x8d, 0x55, 0xf2, 0xb3, 0x72, 0x06, 0xa6, 0x3d, 0xb1, 0x04, 0x6c, + 0x84, 0x93, 0xce, 0xde, 0x06, 0x59, 0x37, 0xbf, 0x32, 0x09, 0xd9, 0xea, 0xc6, 0xea, 0x6a, 0xe1, + 0x88, 0x72, 0x0c, 0x66, 0x37, 0xaa, 0xf7, 0x55, 0x6b, 0xe7, 0xab, 0xcd, 0xb2, 0xaa, 0xd6, 0xd4, + 0x42, 0x46, 0x99, 0x85, 0xa9, 0x85, 0xe2, 0x62, 0xb3, 0x52, 0x5d, 0xdf, 0x68, 0x14, 0x24, 0xf4, + 0x32, 0x19, 0xe6, 0xea, 0xd8, 0x59, 0xc4, 0x7b, 0x7a, 0x0b, 0xd7, 0x1d, 0xcd, 0xc1, 0xe8, 0x05, + 0x19, 0x5f, 0x98, 0xca, 0x86, 0x5b, 0xa8, 0xff, 0x89, 0x55, 0xe0, 0x49, 0xfb, 0x2a, 0xc0, 0x53, + 0x98, 0x67, 0x7f, 0xcf, 0x87, 0xd2, 0xd4, 0x30, 0x9d, 0xb3, 0x4f, 0x80, 0xe9, 0xd0, 0x37, 0x65, + 0x0e, 0x60, 0xa1, 0x58, 0xba, 0x6f, 0x59, 0xad, 0x6d, 0x54, 0x17, 0x0b, 0x47, 0xdc, 0xf7, 0xa5, + 0x9a, 0x5a, 0x66, 0xef, 0x19, 0xf4, 0xad, 0x4c, 0x08, 0xcc, 0x45, 0x1e, 0xcc, 0xf9, 0xc1, 0xcc, + 0xf4, 0x01, 0x14, 0xbd, 0xc6, 0x07, 0x67, 0x99, 0x03, 0xe7, 0x49, 0xc9, 0xc8, 0xa5, 0x0f, 0xd0, + 0x43, 0x12, 0x4c, 0xd6, 0xb7, 0x77, 0x9d, 0xb6, 0x79, 0xc9, 0x40, 0x53, 0x3e, 0x32, 0xe8, 0x6b, + 0x61, 0x99, 0x3c, 0x9d, 0x97, 0xc9, 0x8d, 0xfb, 0x2b, 0xc1, 0x28, 0x44, 0x48, 0xe3, 0x15, 0xbe, + 0x34, 0x8a, 0x9c, 0x34, 0x9e, 0x20, 0x4a, 0x28, 0x7d, 0x39, 0xfc, 0xe6, 0x53, 0x21, 0x57, 0xef, + 0x6a, 0x2d, 0x8c, 0x3e, 0x26, 0xc3, 0xcc, 0x2a, 0xd6, 0xf6, 0x70, 0xb1, 0xdb, 0xb5, 0xcc, 0x3d, + 0x8c, 0x4a, 0x81, 0xbe, 0x9e, 0x82, 0x09, 0xdb, 0xcd, 0x54, 0x69, 0x93, 0x1a, 0x4c, 0xa9, 0xde, + 0xab, 0x72, 0x1a, 0x40, 0x6f, 0x63, 0xc3, 0xd1, 0x1d, 0x1d, 0xdb, 0xa7, 0xa4, 0x33, 0xf2, 0x8d, + 0x53, 0x6a, 0x28, 0x05, 0x7d, 0x43, 0x12, 0xd5, 0x31, 0xc2, 0xc5, 0x7c, 0x98, 0x83, 0x08, 0xa9, + 0xbe, 0x4a, 0x12, 0xd1, 0xb1, 0x81, 0xe4, 0x92, 0xc9, 0xf6, 0x8d, 0x99, 0xe4, 0xc2, 0x75, 0x73, + 0x54, 0x6b, 0xcd, 0xfa, 0x46, 0x69, 0xa5, 0x59, 0x5f, 0x2f, 0x96, 0xca, 0x05, 0xac, 0x1c, 0x87, + 0x02, 0x79, 0x6c, 0x56, 0xea, 0xcd, 0xc5, 0xf2, 0x6a, 0xb9, 0x51, 0x5e, 0x2c, 0x6c, 0x2a, 0x0a, + 0xcc, 0xa9, 0xe5, 0x1f, 0xd9, 0x28, 0xd7, 0x1b, 0xcd, 0xa5, 0x62, 0x65, 0xb5, 0xbc, 0x58, 0xd8, + 0x72, 0x7f, 0x5e, 0xad, 0xac, 0x55, 0x1a, 0x4d, 0xb5, 0x5c, 0x2c, 0xad, 0x94, 0x17, 0x0b, 0xdb, + 0xca, 0x95, 0x70, 0x45, 0xb5, 0xd6, 0x2c, 0xae, 0xaf, 0xab, 0xb5, 0x73, 0xe5, 0x26, 0xfb, 0xa3, + 0x5e, 0xd0, 0x69, 0x41, 0x8d, 0x66, 0x7d, 0xa5, 0xa8, 0x96, 0x8b, 0x0b, 0xab, 0xe5, 0xc2, 0x03, + 0xe8, 0xd9, 0x32, 0xcc, 0xae, 0x69, 0x17, 0x71, 0x7d, 0x5b, 0xb3, 0xb0, 0x76, 0xa1, 0x83, 0xd1, + 0x75, 0x02, 0x78, 0xa2, 0x8f, 0x85, 0xf1, 0x2a, 0xf3, 0x78, 0xdd, 0xd2, 0x47, 0xc0, 0x5c, 0x11, + 0x11, 0x80, 0xfd, 0xab, 0xdf, 0x0c, 0x56, 0x38, 0xc0, 0x9e, 0x9c, 0x90, 0x5e, 0x32, 0xc4, 0x7e, + 0xea, 0x51, 0x80, 0x18, 0xfa, 0xbc, 0x0c, 0x73, 0x15, 0x63, 0x4f, 0x77, 0xf0, 0x32, 0x36, 0xb0, + 0xe5, 0x8e, 0x03, 0x42, 0x30, 0x3c, 0x22, 0x87, 0x60, 0x58, 0xe2, 0x61, 0xb8, 0xb5, 0x8f, 0xd8, + 0xf8, 0x32, 0x22, 0x46, 0xdb, 0x6b, 0x60, 0x4a, 0x27, 0xf9, 0x4a, 0x7a, 0x9b, 0x49, 0x2c, 0x48, + 0x50, 0xae, 0x87, 0x59, 0xfa, 0xb2, 0xa4, 0x77, 0xf0, 0x7d, 0xf8, 0x32, 0x1b, 0x77, 0xf9, 0x44, + 0xf4, 0xf3, 0x7e, 0xe3, 0xab, 0x70, 0x58, 0xfe, 0x50, 0x52, 0xa6, 0x92, 0x81, 0xf9, 0xc2, 0x47, + 0x43, 0xf3, 0xdb, 0xd7, 0xca, 0x74, 0xf4, 0x1d, 0x09, 0xa6, 0xeb, 0x8e, 0xd9, 0x75, 0x55, 0x56, + 0x37, 0xb6, 0xc4, 0xc0, 0xfd, 0x48, 0xb8, 0x8d, 0x95, 0x78, 0x70, 0x9f, 0xd0, 0x47, 0x8e, 0xa1, + 0x02, 0x22, 0x5a, 0xd8, 0x37, 0xfc, 0x16, 0xb6, 0xc4, 0xa1, 0x72, 0x5b, 0x22, 0x6a, 0xdf, 0x83, + 0xed, 0xeb, 0x85, 0x32, 0x14, 0x3c, 0x35, 0x73, 0x4a, 0xbb, 0x96, 0x85, 0x0d, 0x47, 0x0c, 0x84, + 0xbf, 0x0a, 0x83, 0xb0, 0xc2, 0x83, 0x70, 0x5b, 0x8c, 0x32, 0x7b, 0xa5, 0xa4, 0xd8, 0xc6, 0xde, + 0xe7, 0xa3, 0x79, 0x1f, 0x87, 0xe6, 0x0f, 0x27, 0x67, 0x2b, 0x19, 0xa4, 0x2b, 0x43, 0x20, 0x7a, + 0x1c, 0x0a, 0xee, 0x98, 0x54, 0x6a, 0x54, 0xce, 0x95, 0x9b, 0x95, 0xea, 0xb9, 0x4a, 0xa3, 0x5c, + 0xc0, 0xe8, 0x57, 0x64, 0x98, 0xa1, 0xac, 0xa9, 0x78, 0xcf, 0xbc, 0x28, 0xd8, 0xeb, 0x7d, 0x3e, + 0xa1, 0xb1, 0x10, 0x2e, 0x21, 0xa2, 0x65, 0xfc, 0x5c, 0x02, 0x63, 0x21, 0x86, 0xdc, 0xa3, 0xa9, + 0xb7, 0xda, 0xd7, 0x0c, 0xb6, 0xfa, 0xb4, 0x96, 0xbe, 0xbd, 0xd5, 0x0b, 0xb3, 0x00, 0xb4, 0x92, + 0xe7, 0x74, 0x7c, 0x09, 0xad, 0x05, 0x98, 0x70, 0x6a, 0x9b, 0x19, 0xa8, 0xb6, 0x52, 0x3f, 0xb5, + 0x7d, 0x67, 0x78, 0xcc, 0x5a, 0xe0, 0xd1, 0xbb, 0x39, 0x52, 0xdc, 0x2e, 0x27, 0xd1, 0xb3, 0x43, + 0x4f, 0x51, 0x24, 0xde, 0xea, 0xbc, 0x06, 0xa6, 0xc8, 0x63, 0x55, 0xdb, 0xc1, 0xac, 0x0d, 0x05, + 0x09, 0xca, 0x59, 0x98, 0xa1, 0x19, 0x5b, 0xa6, 0xe1, 0xd6, 0x27, 0x4b, 0x32, 0x70, 0x69, 0x2e, + 0x88, 0x2d, 0x0b, 0x6b, 0x8e, 0x69, 0x11, 0x1a, 0x39, 0x0a, 0x62, 0x28, 0x09, 0x7d, 0xd5, 0x6f, + 0x85, 0x65, 0x4e, 0x73, 0x9e, 0x98, 0xa4, 0x2a, 0xc9, 0xf4, 0x66, 0x6f, 0xb8, 0xf6, 0x47, 0x5b, + 0x5d, 0xd3, 0x45, 0x7b, 0x89, 0x4c, 0xed, 0xb0, 0x72, 0x12, 0x14, 0x96, 0xea, 0xe6, 0x2d, 0xd5, + 0xaa, 0x8d, 0x72, 0xb5, 0x51, 0xd8, 0xec, 0xab, 0x51, 0x5b, 0xe8, 0x55, 0x59, 0xc8, 0xde, 0x6b, + 0xea, 0x06, 0x7a, 0x28, 0xc3, 0xa9, 0x84, 0x81, 0x9d, 0x4b, 0xa6, 0x75, 0xd1, 0x6f, 0xa8, 0x41, + 0x42, 0x3c, 0x36, 0x81, 0x2a, 0xc9, 0x03, 0x55, 0x29, 0xdb, 0x4f, 0x95, 0x7e, 0x39, 0xac, 0x4a, + 0x77, 0xf2, 0xaa, 0x74, 0x43, 0x1f, 0xf9, 0xbb, 0xcc, 0x47, 0x74, 0x00, 0x1f, 0xf6, 0x3b, 0x80, + 0xbb, 0x39, 0x18, 0x1f, 0x2f, 0x46, 0x26, 0x19, 0x80, 0x9f, 0x4b, 0xb5, 0xe1, 0xf7, 0x83, 0x7a, + 0x2b, 0x02, 0xea, 0xed, 0x3e, 0x7d, 0x82, 0xbe, 0xbf, 0xeb, 0x78, 0x60, 0x7f, 0x37, 0x71, 0x51, + 0x39, 0x01, 0xc7, 0x16, 0x2b, 0x4b, 0x4b, 0x65, 0xb5, 0x5c, 0x6d, 0x34, 0xab, 0xe5, 0xc6, 0xf9, + 0x9a, 0x7a, 0x5f, 0xa1, 0x83, 0x1e, 0x96, 0x01, 0x5c, 0x09, 0x95, 0x34, 0xa3, 0x85, 0x3b, 0x62, + 0x3d, 0xfa, 0xff, 0x94, 0x92, 0xf5, 0x09, 0x01, 0xfd, 0x08, 0x38, 0x5f, 0x2a, 0x89, 0xb7, 0xca, + 0x48, 0x62, 0xc9, 0x40, 0x7d, 0xfd, 0xa3, 0xc1, 0xf6, 0xbc, 0x02, 0x8e, 0x7a, 0xf4, 0x58, 0xf6, + 0xfe, 0xd3, 0xbe, 0x37, 0x65, 0x61, 0x8e, 0xc1, 0xe2, 0xcd, 0xe3, 0x9f, 0x9b, 0x11, 0x99, 0xc8, + 0x23, 0x98, 0x64, 0xd3, 0x76, 0xaf, 0x7b, 0xf7, 0xdf, 0x95, 0x65, 0x98, 0xee, 0x62, 0x6b, 0x47, + 0xb7, 0x6d, 0xdd, 0x34, 0xe8, 0x82, 0xdc, 0xdc, 0x6d, 0x8f, 0xf5, 0x25, 0x4e, 0xd6, 0x2e, 0xe7, + 0xd7, 0x35, 0xcb, 0xd1, 0x5b, 0x7a, 0x57, 0x33, 0x9c, 0xf5, 0x20, 0xb3, 0x1a, 0xfe, 0x13, 0xfd, + 0x52, 0xc2, 0x69, 0x0d, 0x5f, 0x93, 0x08, 0x95, 0xf8, 0xbd, 0x04, 0x53, 0x92, 0x58, 0x82, 0xc9, + 0xd4, 0xe2, 0x43, 0xa9, 0xaa, 0x45, 0x1f, 0xbc, 0xb7, 0x94, 0xab, 0xe0, 0x44, 0xa5, 0x5a, 0xaa, + 0xa9, 0x6a, 0xb9, 0xd4, 0x68, 0xae, 0x97, 0xd5, 0xb5, 0x4a, 0xbd, 0x5e, 0xa9, 0x55, 0xeb, 0x07, + 0x69, 0xed, 0xe8, 0xa3, 0xb2, 0xaf, 0x31, 0x8b, 0xb8, 0xd5, 0xd1, 0x0d, 0x8c, 0xee, 0x3e, 0xa0, + 0xc2, 0xf0, 0xab, 0x3e, 0xe2, 0x38, 0xb3, 0xf2, 0x23, 0x70, 0x7e, 0x65, 0x72, 0x9c, 0xfb, 0x13, + 0xfc, 0x0f, 0xdc, 0xfc, 0x3f, 0x2f, 0xc3, 0xb1, 0x50, 0x43, 0x54, 0xf1, 0xce, 0xc8, 0x56, 0xf2, + 0x7e, 0x2a, 0xdc, 0x76, 0x2b, 0x3c, 0xa6, 0xfd, 0xac, 0xe9, 0x7d, 0x6c, 0x44, 0xc0, 0xfa, 0x7a, + 0x1f, 0xd6, 0x55, 0x0e, 0xd6, 0xa7, 0x0e, 0x41, 0x33, 0x19, 0xb2, 0xbf, 0x93, 0x2a, 0xb2, 0x57, + 0xc1, 0x89, 0xf5, 0xa2, 0xda, 0xa8, 0x94, 0x2a, 0xeb, 0x45, 0x77, 0x1c, 0x0d, 0x0d, 0xd9, 0x11, + 0xe6, 0x3a, 0x0f, 0x7a, 0x5f, 0x7c, 0xdf, 0x9b, 0x85, 0x6b, 0xfa, 0x77, 0xb4, 0xa5, 0x6d, 0xcd, + 0xd8, 0xc2, 0x48, 0x17, 0x81, 0x7a, 0x11, 0x26, 0x5a, 0x24, 0x3b, 0xc5, 0x39, 0xbc, 0x75, 0x13, + 0xd3, 0x97, 0xd3, 0x12, 0x54, 0xef, 0x57, 0xf4, 0xd6, 0xb0, 0x42, 0x34, 0x78, 0x85, 0x78, 0x7a, + 0x3c, 0x78, 0xfb, 0xf8, 0x8e, 0xd0, 0x8d, 0x4f, 0xf8, 0xba, 0x71, 0x9e, 0xd3, 0x8d, 0xd2, 0xc1, + 0xc8, 0x27, 0x53, 0x93, 0x3f, 0x7e, 0x34, 0x74, 0x00, 0x91, 0xda, 0xa4, 0x47, 0x8f, 0x0a, 0x7d, + 0xbb, 0xfb, 0x97, 0xcb, 0x90, 0x5f, 0xc4, 0x1d, 0x2c, 0xba, 0x12, 0xf9, 0x75, 0x49, 0x74, 0x43, + 0x84, 0xc2, 0x40, 0x69, 0x47, 0xaf, 0x8e, 0x38, 0xfa, 0x0e, 0xb6, 0x1d, 0x6d, 0xa7, 0x4b, 0x44, + 0x2d, 0xab, 0x41, 0x02, 0xfa, 0x69, 0x49, 0x64, 0xbb, 0x24, 0xa6, 0x98, 0xff, 0x18, 0x6b, 0x8a, + 0x9f, 0x92, 0x60, 0xb2, 0x8e, 0x9d, 0x9a, 0xd5, 0xc6, 0x16, 0xaa, 0x07, 0x18, 0x9d, 0x81, 0x69, + 0x02, 0x8a, 0x3b, 0xcd, 0xf4, 0x71, 0x0a, 0x27, 0x29, 0x37, 0xc0, 0x9c, 0xff, 0x4a, 0x7e, 0x67, + 0xdd, 0x78, 0x4f, 0x2a, 0xfa, 0xa7, 0x8c, 0xe8, 0x2e, 0x2e, 0x5b, 0x32, 0x64, 0xdc, 0x44, 0xb4, + 0x52, 0xb1, 0x1d, 0xd9, 0x58, 0x52, 0xe9, 0x6f, 0x74, 0xbd, 0x59, 0x02, 0xd8, 0x30, 0x6c, 0x4f, + 0xae, 0x8f, 0x4f, 0x20, 0x57, 0xf4, 0x2f, 0x99, 0x64, 0xb3, 0x98, 0xa0, 0x9c, 0x08, 0x89, 0xbd, + 0x3a, 0xc1, 0xda, 0x42, 0x24, 0xb1, 0xf4, 0x65, 0xf6, 0xa5, 0x39, 0xc8, 0x9f, 0xd7, 0x3a, 0x1d, + 0xec, 0xa0, 0x2f, 0x4b, 0x90, 0x2f, 0x59, 0x58, 0x73, 0x70, 0x58, 0x74, 0x08, 0x26, 0x2d, 0xd3, + 0x74, 0xd6, 0x35, 0x67, 0x9b, 0xc9, 0xcd, 0x7f, 0x67, 0x0e, 0x03, 0xbf, 0x1d, 0xee, 0x3e, 0xee, + 0xe6, 0x45, 0xf7, 0x83, 0x5c, 0x6d, 0x69, 0x41, 0xf3, 0xb4, 0x90, 0x88, 0xfe, 0x03, 0xc1, 0xe4, + 0x8e, 0x81, 0x77, 0x4c, 0x43, 0x6f, 0x79, 0x36, 0xa7, 0xf7, 0x8e, 0xde, 0xef, 0xcb, 0x74, 0x81, + 0x93, 0xe9, 0xbc, 0x70, 0x29, 0xc9, 0x04, 0x5a, 0x1f, 0xa2, 0xf7, 0xb8, 0x16, 0xae, 0xa6, 0x9d, + 0x41, 0xb3, 0x51, 0x6b, 0x96, 0xd4, 0x72, 0xb1, 0x51, 0x6e, 0xae, 0xd6, 0x4a, 0xc5, 0xd5, 0xa6, + 0x5a, 0x5e, 0xaf, 0x15, 0x30, 0xfa, 0x7b, 0xc9, 0x15, 0x6e, 0xcb, 0xdc, 0xc3, 0x16, 0x5a, 0x16, + 0x92, 0x73, 0x9c, 0x4c, 0x18, 0x06, 0xbf, 0x2c, 0xec, 0xb4, 0xc1, 0xa4, 0xc3, 0x38, 0x88, 0x50, + 0xde, 0x0f, 0x08, 0x35, 0xf7, 0x58, 0x52, 0x8f, 0x02, 0x49, 0xff, 0x2f, 0x09, 0x26, 0x4a, 0xa6, + 0xb1, 0x87, 0x2d, 0x27, 0x3c, 0xdf, 0x09, 0x4b, 0x33, 0xc3, 0x4b, 0xd3, 0x1d, 0x24, 0xb1, 0xe1, + 0x58, 0x66, 0xd7, 0x9b, 0xf0, 0x78, 0xaf, 0xe8, 0xb5, 0x49, 0x25, 0xcc, 0x4a, 0x8e, 0x5e, 0xf8, + 0xec, 0x5f, 0x10, 0xc7, 0x9e, 0xdc, 0xd3, 0x00, 0x1e, 0x4e, 0x82, 0x4b, 0x7f, 0x06, 0xd2, 0xef, + 0x52, 0xbe, 0x20, 0xc3, 0x2c, 0x6d, 0x7c, 0x75, 0x4c, 0x2c, 0x34, 0x54, 0x0b, 0x2f, 0x39, 0xf6, + 0x08, 0x7f, 0xe5, 0x08, 0x27, 0xfe, 0xbc, 0xd6, 0xed, 0xfa, 0xcb, 0xcf, 0x2b, 0x47, 0x54, 0xf6, + 0x4e, 0xd5, 0x7c, 0x21, 0x0f, 0x59, 0x6d, 0xd7, 0xd9, 0x46, 0xdf, 0x11, 0x9e, 0x7c, 0x72, 0x9d, + 0x01, 0xe3, 0x27, 0x02, 0x92, 0xe3, 0x90, 0x73, 0xcc, 0x8b, 0xd8, 0x93, 0x03, 0x7d, 0x71, 0xe1, + 0xd0, 0xba, 0xdd, 0x06, 0xf9, 0xc0, 0xe0, 0xf0, 0xde, 0x5d, 0x5b, 0x47, 0x6b, 0xb5, 0xcc, 0x5d, + 0xc3, 0xa9, 0x78, 0x4b, 0xd0, 0x41, 0x02, 0xfa, 0x6c, 0x46, 0x64, 0x32, 0x2b, 0xc0, 0x60, 0x32, + 0xc8, 0x2e, 0x0c, 0xd1, 0x94, 0xe6, 0xe1, 0xa6, 0xe2, 0xfa, 0x7a, 0xb3, 0x51, 0xbb, 0xaf, 0x5c, + 0x0d, 0x0c, 0xcf, 0x66, 0xa5, 0xda, 0x6c, 0xac, 0x94, 0x9b, 0xa5, 0x0d, 0x95, 0xac, 0x13, 0x16, + 0x4b, 0xa5, 0xda, 0x46, 0xb5, 0x51, 0xc0, 0xe8, 0x0d, 0x12, 0xcc, 0x94, 0x3a, 0xa6, 0xed, 0x23, + 0x7c, 0x6d, 0x80, 0xb0, 0x2f, 0xc6, 0x4c, 0x48, 0x8c, 0xe8, 0xdf, 0x33, 0xa2, 0x4e, 0x07, 0x9e, + 0x40, 0x42, 0xe4, 0x23, 0x7a, 0xa9, 0xd7, 0x0a, 0x39, 0x1d, 0x0c, 0xa6, 0x97, 0x7e, 0x93, 0xf8, + 0xd4, 0x1d, 0x30, 0x51, 0xa4, 0x8a, 0x81, 0xfe, 0x26, 0x03, 0xf9, 0x92, 0x69, 0x6c, 0xea, 0x5b, + 0xae, 0x31, 0x87, 0x0d, 0xed, 0x42, 0x07, 0x2f, 0x6a, 0x8e, 0xb6, 0xa7, 0xe3, 0x4b, 0xa4, 0x02, + 0x93, 0x6a, 0x4f, 0xaa, 0xcb, 0x14, 0x4b, 0xc1, 0x17, 0x76, 0xb7, 0x08, 0x53, 0x93, 0x6a, 0x38, + 0x49, 0x79, 0x2a, 0x5c, 0x49, 0x5f, 0xd7, 0x2d, 0x6c, 0xe1, 0x0e, 0xd6, 0x6c, 0xec, 0x4e, 0x8b, + 0x0c, 0xdc, 0x21, 0x4a, 0x3b, 0xa9, 0x46, 0x7d, 0x56, 0xce, 0xc2, 0x0c, 0xfd, 0x44, 0x4c, 0x11, + 0x9b, 0xa8, 0xf1, 0xa4, 0xca, 0xa5, 0x29, 0x4f, 0x80, 0x1c, 0x7e, 0xd0, 0xb1, 0xb4, 0x53, 0x6d, + 0x82, 0xd7, 0x95, 0xf3, 0xd4, 0xeb, 0x70, 0xde, 0xf3, 0x3a, 0x9c, 0xaf, 0x13, 0x9f, 0x44, 0x95, + 0xe6, 0x42, 0x2f, 0x99, 0xf4, 0x0d, 0x89, 0xef, 0x4a, 0x81, 0x62, 0x28, 0x90, 0x35, 0xb4, 0x1d, + 0xcc, 0xf4, 0x82, 0x3c, 0x2b, 0x37, 0xc1, 0x51, 0x6d, 0x4f, 0x73, 0x34, 0x6b, 0xd5, 0x6c, 0x69, + 0x1d, 0x32, 0xf8, 0x79, 0x2d, 0xbf, 0xf7, 0x03, 0xd9, 0x11, 0x72, 0x4c, 0x0b, 0x93, 0x5c, 0xde, + 0x8e, 0x90, 0x97, 0xe0, 0x52, 0xd7, 0x5b, 0xa6, 0x41, 0xf8, 0x97, 0x55, 0xf2, 0xec, 0x4a, 0xa5, + 0xad, 0xdb, 0x6e, 0x45, 0x08, 0x95, 0x2a, 0xdd, 0xda, 0xa8, 0x5f, 0x36, 0x5a, 0x64, 0x37, 0x68, + 0x52, 0x8d, 0xfa, 0xac, 0x2c, 0xc0, 0x34, 0xdb, 0x08, 0x59, 0x73, 0xf5, 0x2a, 0x4f, 0xf4, 0xea, + 0x0c, 0xef, 0xd3, 0x45, 0xf1, 0x9c, 0xaf, 0x06, 0xf9, 0xd4, 0xf0, 0x4f, 0xca, 0x3d, 0x70, 0x35, + 0x7b, 0x2d, 0xed, 0xda, 0x8e, 0xb9, 0x43, 0x41, 0x5f, 0xd2, 0x3b, 0xb4, 0x06, 0x13, 0xa4, 0x06, + 0x71, 0x59, 0x94, 0xdb, 0xe0, 0x78, 0xd7, 0xc2, 0x9b, 0xd8, 0xba, 0x5f, 0xdb, 0xd9, 0x7d, 0xb0, + 0x61, 0x69, 0x86, 0xdd, 0x35, 0x2d, 0xe7, 0xd4, 0x24, 0x61, 0xbe, 0xef, 0x37, 0xd6, 0x51, 0x4e, + 0x42, 0x9e, 0x8a, 0x0f, 0xbd, 0x20, 0x27, 0xec, 0xce, 0xc9, 0x2a, 0x14, 0x6b, 0x9e, 0xdd, 0x0a, + 0x13, 0xac, 0x87, 0x23, 0x40, 0x4d, 0xdf, 0x76, 0xb2, 0x67, 0x5d, 0x81, 0x51, 0x51, 0xbd, 0x6c, + 0xca, 0x93, 0x20, 0xdf, 0x22, 0xd5, 0x22, 0x98, 0x4d, 0xdf, 0x76, 0x75, 0xff, 0x42, 0x49, 0x16, + 0x95, 0x65, 0x45, 0x7f, 0x29, 0x0b, 0x79, 0x80, 0xc6, 0x71, 0x9c, 0xac, 0x55, 0x7f, 0x55, 0x1a, + 0xa2, 0xdb, 0xbc, 0x19, 0x6e, 0x64, 0x7d, 0x22, 0xb3, 0x3f, 0x16, 0x9b, 0x0b, 0x1b, 0xde, 0x64, + 0xd0, 0xb5, 0x4a, 0xea, 0x8d, 0xa2, 0xea, 0xce, 0xe4, 0x17, 0xdd, 0x49, 0xe4, 0x4d, 0x70, 0xc3, + 0x80, 0xdc, 0xe5, 0x46, 0xb3, 0x5a, 0x5c, 0x2b, 0x17, 0x36, 0x79, 0xdb, 0xa6, 0xde, 0xa8, 0xad, + 0x37, 0xd5, 0x8d, 0x6a, 0xb5, 0x52, 0x5d, 0xa6, 0xc4, 0x5c, 0x93, 0xf0, 0x64, 0x90, 0xe1, 0xbc, + 0x5a, 0x69, 0x94, 0x9b, 0xa5, 0x5a, 0x75, 0xa9, 0xb2, 0x5c, 0xd0, 0x07, 0x19, 0x46, 0x0f, 0x28, + 0x67, 0xe0, 0x1a, 0x8e, 0x93, 0x4a, 0xad, 0xea, 0xce, 0x6c, 0x4b, 0xc5, 0x6a, 0xa9, 0xec, 0x4e, + 0x63, 0x2f, 0x2a, 0x08, 0x4e, 0x50, 0x72, 0xcd, 0xa5, 0xca, 0x6a, 0x78, 0x33, 0xea, 0x23, 0x19, + 0xe5, 0x14, 0x5c, 0x11, 0xfe, 0x56, 0xa9, 0x9e, 0x2b, 0xae, 0x56, 0x16, 0x0b, 0x7f, 0x94, 0x51, + 0xae, 0x87, 0x6b, 0xb9, 0xbf, 0xe8, 0xbe, 0x52, 0xb3, 0xb2, 0xd8, 0x5c, 0xab, 0xd4, 0xd7, 0x8a, + 0x8d, 0xd2, 0x4a, 0xe1, 0xa3, 0x64, 0xbe, 0xe0, 0x1b, 0xc0, 0x21, 0xb7, 0xcc, 0x17, 0x86, 0xc7, + 0xf4, 0x22, 0xaf, 0xa8, 0x8f, 0xef, 0x0b, 0x7b, 0xbc, 0x0d, 0xfb, 0x21, 0x7f, 0x74, 0x58, 0xe4, + 0x54, 0xe8, 0xd6, 0x04, 0xb4, 0x92, 0xe9, 0x50, 0x63, 0x08, 0x15, 0x3a, 0x03, 0xd7, 0x54, 0xcb, + 0x14, 0x29, 0xb5, 0x5c, 0xaa, 0x9d, 0x2b, 0xab, 0xcd, 0xf3, 0xc5, 0xd5, 0xd5, 0x72, 0xa3, 0xb9, + 0x54, 0x51, 0xeb, 0x8d, 0xc2, 0x26, 0xfa, 0x17, 0xc9, 0x5f, 0xcd, 0x09, 0x49, 0xeb, 0x6f, 0xa4, + 0xa4, 0xcd, 0x3a, 0x76, 0xd5, 0xe6, 0x87, 0x20, 0x6f, 0x3b, 0x9a, 0xb3, 0x6b, 0xb3, 0x56, 0xfd, + 0x98, 0xfe, 0xad, 0x7a, 0xbe, 0x4e, 0x32, 0xa9, 0x2c, 0x33, 0xfa, 0xcb, 0x4c, 0x92, 0x66, 0x3a, + 0x82, 0x05, 0x1d, 0x7d, 0x08, 0x11, 0x9f, 0x06, 0xe4, 0x69, 0x7b, 0xa5, 0xde, 0x2c, 0xae, 0xaa, + 0xe5, 0xe2, 0xe2, 0xfd, 0xfe, 0x32, 0x0e, 0x56, 0x4e, 0xc0, 0xb1, 0x8d, 0x6a, 0x71, 0x61, 0xb5, + 0x4c, 0x9a, 0x4b, 0xad, 0x5a, 0x2d, 0x97, 0x5c, 0xb9, 0xff, 0x34, 0xd9, 0x34, 0x71, 0x2d, 0x68, + 0xc2, 0xb7, 0x6b, 0xe5, 0x84, 0xe4, 0xff, 0x15, 0x61, 0xdf, 0xa2, 0x40, 0xc3, 0xc2, 0xb4, 0x46, + 0x8b, 0xc3, 0x67, 0x85, 0xdc, 0x89, 0x84, 0x38, 0x49, 0x86, 0xc7, 0x7f, 0x1e, 0x02, 0x8f, 0x13, + 0x70, 0x2c, 0x8c, 0x07, 0x71, 0x2b, 0x8a, 0x86, 0xe1, 0x8b, 0x93, 0x90, 0xaf, 0xe3, 0x0e, 0x6e, + 0x39, 0xe8, 0x4d, 0x21, 0x63, 0x62, 0x0e, 0x24, 0xdf, 0x8d, 0x45, 0xd2, 0xdb, 0xdc, 0xf4, 0x59, + 0xea, 0x99, 0x3e, 0xc7, 0x98, 0x01, 0x72, 0x22, 0x33, 0x20, 0x9b, 0x82, 0x19, 0x90, 0x1b, 0xde, + 0x0c, 0xc8, 0x0f, 0x32, 0x03, 0xd0, 0xab, 0xf3, 0x49, 0x7b, 0x09, 0x2a, 0xea, 0xc3, 0x1d, 0xfc, + 0xff, 0x67, 0x36, 0x49, 0xaf, 0xd2, 0x97, 0xe3, 0x64, 0x5a, 0xfc, 0x1d, 0x39, 0x85, 0xe5, 0x07, + 0xe5, 0x3a, 0xb8, 0x36, 0x78, 0x6f, 0x96, 0x9f, 0x51, 0xa9, 0x37, 0xea, 0x64, 0xc4, 0x2f, 0xd5, + 0x54, 0x75, 0x63, 0x9d, 0xae, 0x21, 0x9f, 0x04, 0x25, 0xa0, 0xa2, 0x6e, 0x54, 0xe9, 0xf8, 0xbe, + 0xc5, 0x53, 0x5f, 0xaa, 0x54, 0x17, 0x9b, 0x7e, 0x9b, 0xa9, 0x2e, 0xd5, 0x0a, 0xdb, 0xee, 0x94, + 0x2d, 0x44, 0xdd, 0x1d, 0xa0, 0x59, 0x09, 0xc5, 0xea, 0x62, 0x73, 0xad, 0x5a, 0x5e, 0xab, 0x55, + 0x2b, 0x25, 0x92, 0x5e, 0x2f, 0x37, 0x0a, 0xba, 0x3b, 0xd0, 0xf4, 0x58, 0x14, 0xf5, 0x72, 0x51, + 0x2d, 0xad, 0x94, 0x55, 0x5a, 0xe4, 0x03, 0xca, 0x0d, 0x70, 0xb6, 0x58, 0xad, 0x35, 0xdc, 0x94, + 0x62, 0xf5, 0xfe, 0xc6, 0xfd, 0xeb, 0xe5, 0xe6, 0xba, 0x5a, 0x2b, 0x95, 0xeb, 0x75, 0xb7, 0x9d, + 0x32, 0xfb, 0xa3, 0xd0, 0x51, 0x9e, 0x0e, 0x77, 0x84, 0x58, 0x2b, 0x37, 0xc8, 0x86, 0xe5, 0x5a, + 0x8d, 0xf8, 0xac, 0x2c, 0x96, 0x9b, 0x2b, 0xc5, 0x7a, 0xb3, 0x52, 0x2d, 0xd5, 0xd6, 0xd6, 0x8b, + 0x8d, 0x8a, 0xdb, 0x9c, 0xd7, 0xd5, 0x5a, 0xa3, 0xd6, 0x3c, 0x57, 0x56, 0xeb, 0x95, 0x5a, 0xb5, + 0x60, 0xb8, 0x55, 0x0e, 0xb5, 0x7f, 0xaf, 0x1f, 0x36, 0x95, 0x6b, 0xe0, 0x94, 0x97, 0xbe, 0x5a, + 0x73, 0x05, 0x1d, 0xb2, 0x48, 0xba, 0xa9, 0x5a, 0x24, 0xff, 0x26, 0x41, 0xb6, 0xee, 0x98, 0x5d, + 0xf4, 0x83, 0x41, 0x07, 0x73, 0x1a, 0xc0, 0x22, 0xfb, 0x8f, 0xee, 0x2c, 0x8c, 0xcd, 0xcb, 0x42, + 0x29, 0xe8, 0x0f, 0x85, 0x37, 0x4d, 0x82, 0x3e, 0xdb, 0xec, 0x46, 0xd8, 0x2a, 0xdf, 0x12, 0x3b, + 0x45, 0x12, 0x4d, 0x28, 0x99, 0xbe, 0xff, 0xdc, 0x30, 0xdb, 0x22, 0x08, 0x4e, 0x86, 0x60, 0x73, + 0xe5, 0xef, 0xa9, 0x04, 0x56, 0xae, 0x84, 0x2b, 0x7a, 0x94, 0x8b, 0xe8, 0xd4, 0xa6, 0xf2, 0x03, + 0xf0, 0x98, 0x90, 0x7a, 0x97, 0xd7, 0x6a, 0xe7, 0xca, 0xbe, 0x22, 0x2f, 0x16, 0x1b, 0xc5, 0xc2, + 0x16, 0xfa, 0x94, 0x0c, 0xd9, 0x35, 0x73, 0xaf, 0x77, 0xaf, 0xca, 0xc0, 0x97, 0x42, 0x6b, 0xa1, + 0xde, 0x2b, 0xef, 0x35, 0x2f, 0x24, 0xf6, 0xb5, 0xe8, 0x7d, 0xe9, 0xcf, 0x4a, 0x49, 0xc4, 0xbe, + 0x76, 0xd0, 0xcd, 0xe8, 0x7f, 0x18, 0x46, 0xec, 0x11, 0xa2, 0xc5, 0xca, 0x59, 0x38, 0x1d, 0x7c, + 0xa8, 0x2c, 0x96, 0xab, 0x8d, 0xca, 0xd2, 0xfd, 0x81, 0x70, 0x2b, 0xaa, 0x90, 0xf8, 0x07, 0x75, + 0x63, 0xf1, 0x33, 0x8d, 0x53, 0x70, 0x3c, 0xf8, 0xb6, 0x5c, 0x6e, 0x78, 0x5f, 0x1e, 0x40, 0x0f, + 0xe5, 0x60, 0x86, 0x76, 0xeb, 0x1b, 0xdd, 0xb6, 0xe6, 0x60, 0xf4, 0xa4, 0x00, 0xdd, 0x1b, 0xe1, + 0x68, 0x65, 0x7d, 0xa9, 0x5e, 0x77, 0x4c, 0x4b, 0xdb, 0xc2, 0xc5, 0x76, 0xdb, 0x62, 0xd2, 0xea, + 0x4d, 0x46, 0x6f, 0x17, 0x5e, 0xe7, 0xe3, 0x87, 0x12, 0x5a, 0x66, 0x04, 0xea, 0x5f, 0x10, 0x5a, + 0x97, 0x13, 0x20, 0x98, 0x0c, 0xfd, 0x07, 0x46, 0xdc, 0xe6, 0xa2, 0x71, 0xd9, 0x3c, 0xfb, 0x1c, + 0x09, 0xa6, 0x1a, 0xfa, 0x0e, 0x7e, 0xa6, 0x69, 0x60, 0x5b, 0x99, 0x00, 0x79, 0x79, 0xad, 0x51, + 0x38, 0xe2, 0x3e, 0xb8, 0x46, 0x55, 0x86, 0x3c, 0x94, 0xdd, 0x02, 0xdc, 0x87, 0x62, 0xa3, 0x20, + 0xbb, 0x0f, 0x6b, 0xe5, 0x46, 0x21, 0xeb, 0x3e, 0x54, 0xcb, 0x8d, 0x42, 0xce, 0x7d, 0x58, 0x5f, + 0x6d, 0x14, 0xf2, 0xee, 0x43, 0xa5, 0xde, 0x28, 0x4c, 0xb8, 0x0f, 0x0b, 0xf5, 0x46, 0x61, 0xd2, + 0x7d, 0x38, 0x57, 0x6f, 0x14, 0xa6, 0xdc, 0x87, 0x52, 0xa3, 0x51, 0x00, 0xf7, 0xe1, 0xde, 0x7a, + 0xa3, 0x30, 0xed, 0x3e, 0x14, 0x4b, 0x8d, 0xc2, 0x0c, 0x79, 0x28, 0x37, 0x0a, 0xb3, 0xee, 0x43, + 0xbd, 0xde, 0x28, 0xcc, 0x11, 0xca, 0xf5, 0x46, 0xe1, 0x28, 0x29, 0xab, 0xd2, 0x28, 0x14, 0xdc, + 0x87, 0x95, 0x7a, 0xa3, 0x70, 0x8c, 0x64, 0xae, 0x37, 0x0a, 0x0a, 0x29, 0xb4, 0xde, 0x28, 0x5c, + 0x41, 0xf2, 0xd4, 0x1b, 0x85, 0xe3, 0xa4, 0x88, 0x7a, 0xa3, 0x70, 0x82, 0xb0, 0x51, 0x6e, 0x14, + 0x4e, 0x92, 0x3c, 0x6a, 0xa3, 0x70, 0x25, 0xf9, 0x54, 0x6d, 0x14, 0x4e, 0x11, 0xc6, 0xca, 0x8d, + 0xc2, 0x55, 0xe4, 0x41, 0x6d, 0x14, 0x10, 0xf9, 0x54, 0x6c, 0x14, 0xae, 0x46, 0x8f, 0x81, 0xa9, + 0x65, 0xec, 0x50, 0x10, 0x51, 0x01, 0xe4, 0x65, 0xec, 0x84, 0xcd, 0xf8, 0x2f, 0xc9, 0x70, 0x25, + 0x9b, 0xfa, 0x2d, 0x59, 0xe6, 0xce, 0x2a, 0xde, 0xd2, 0x5a, 0x97, 0xcb, 0x0f, 0xba, 0x26, 0x54, + 0x78, 0x5f, 0x56, 0x81, 0x6c, 0x37, 0xe8, 0x8c, 0xc8, 0x73, 0xac, 0xc5, 0xe9, 0x2d, 0x46, 0xc9, + 0xc1, 0x62, 0x14, 0xb3, 0xc8, 0xfe, 0x39, 0xac, 0xd1, 0xdc, 0xfa, 0x71, 0xa6, 0x67, 0xfd, 0xd8, + 0x6d, 0x26, 0x5d, 0x6c, 0xd9, 0xa6, 0xa1, 0x75, 0xea, 0x6c, 0xe3, 0x9e, 0xae, 0x7a, 0xf5, 0x26, + 0x2b, 0x3f, 0xe2, 0xb5, 0x0c, 0x6a, 0x95, 0x3d, 0x2d, 0x6e, 0x86, 0xdb, 0x5b, 0xcd, 0x88, 0x46, + 0xf2, 0x51, 0xbf, 0x91, 0x34, 0xb8, 0x46, 0x72, 0xcf, 0x01, 0x68, 0x27, 0x6b, 0x2f, 0x95, 0xe1, + 0xa6, 0x16, 0x81, 0x5b, 0xab, 0xb7, 0x5c, 0x2d, 0xa3, 0x4f, 0x49, 0x70, 0xb2, 0x6c, 0xf4, 0xb3, + 0xf0, 0xc3, 0xba, 0xf0, 0x86, 0x30, 0x34, 0xeb, 0xbc, 0x48, 0xef, 0xe8, 0x5b, 0xed, 0xfe, 0x34, + 0x23, 0x24, 0xfa, 0x71, 0x5f, 0xa2, 0x75, 0x4e, 0xa2, 0x77, 0x0f, 0x4f, 0x3a, 0x99, 0x40, 0xab, + 0x23, 0xed, 0x80, 0xb2, 0xe8, 0xab, 0x59, 0x78, 0x0c, 0xf5, 0xbd, 0x61, 0x1c, 0xd2, 0x56, 0x56, + 0x34, 0xda, 0x2a, 0xb6, 0x1d, 0xcd, 0x72, 0xb8, 0xf3, 0xd0, 0x3d, 0x53, 0xa9, 0x4c, 0x0a, 0x53, + 0x29, 0x69, 0xe0, 0x54, 0x0a, 0xbd, 0x2d, 0x6c, 0x3e, 0x9c, 0xe7, 0x31, 0x2e, 0xf6, 0xef, 0xff, + 0xe3, 0x6a, 0x18, 0x05, 0xb5, 0x6f, 0x57, 0xfc, 0x28, 0x07, 0xf5, 0xd2, 0x81, 0x4b, 0x48, 0x86, + 0xf8, 0x1f, 0x8e, 0xd6, 0xce, 0xcb, 0x86, 0xbf, 0xf1, 0x46, 0x49, 0xa1, 0x9d, 0xaa, 0x81, 0xfe, + 0x89, 0x09, 0x98, 0x22, 0x6d, 0x61, 0x55, 0x37, 0x2e, 0xa2, 0x87, 0x65, 0x98, 0xa9, 0xe2, 0x4b, + 0xa5, 0x6d, 0xad, 0xd3, 0xc1, 0xc6, 0x16, 0x0e, 0x9b, 0xed, 0xa7, 0x60, 0x42, 0xeb, 0x76, 0xab, + 0xc1, 0x3e, 0x83, 0xf7, 0xca, 0xfa, 0xdf, 0xaf, 0xf4, 0x6d, 0xe4, 0x99, 0x98, 0x46, 0xee, 0x97, + 0x3b, 0x1f, 0x2e, 0x33, 0x62, 0x86, 0x7c, 0x06, 0xa6, 0x5b, 0x5e, 0x16, 0xff, 0xdc, 0x44, 0x38, + 0x09, 0xfd, 0x5d, 0xa2, 0x6e, 0x40, 0xa8, 0xf0, 0x64, 0x4a, 0x81, 0x47, 0x6c, 0x87, 0x9c, 0x80, + 0x63, 0x8d, 0x5a, 0xad, 0xb9, 0x56, 0xac, 0xde, 0x1f, 0x9c, 0x57, 0xde, 0x44, 0x2f, 0xcd, 0xc2, + 0x5c, 0xdd, 0xec, 0xec, 0xe1, 0x00, 0xa6, 0x0a, 0xe7, 0x90, 0x13, 0x96, 0x53, 0x66, 0x9f, 0x9c, + 0x94, 0x93, 0x90, 0xd7, 0x0c, 0xfb, 0x12, 0xf6, 0x6c, 0x43, 0xf6, 0xc6, 0x60, 0x7c, 0x6f, 0xb8, + 0x1d, 0xab, 0x3c, 0x8c, 0x77, 0x0e, 0x90, 0x24, 0xcf, 0x55, 0x04, 0x90, 0x67, 0x61, 0xc6, 0xa6, + 0x9b, 0x85, 0x8d, 0xd0, 0x9e, 0x30, 0x97, 0x46, 0x58, 0xa4, 0xbb, 0xd5, 0x32, 0x63, 0x91, 0xbc, + 0xa1, 0x87, 0xfd, 0xe6, 0xbf, 0xc1, 0x41, 0x5c, 0x3c, 0x08, 0x63, 0xc9, 0x40, 0x7e, 0xf9, 0xa8, + 0x67, 0x78, 0xa7, 0xe0, 0x38, 0x6b, 0xb5, 0xcd, 0xd2, 0x4a, 0x71, 0x75, 0xb5, 0x5c, 0x5d, 0x2e, + 0x37, 0x2b, 0x8b, 0x74, 0xab, 0x22, 0x48, 0x29, 0x36, 0x1a, 0xe5, 0xb5, 0xf5, 0x46, 0xbd, 0x59, + 0x7e, 0x46, 0xa9, 0x5c, 0x5e, 0x24, 0x2e, 0x71, 0xe4, 0x4c, 0x8b, 0xe7, 0xbc, 0x58, 0xac, 0xd6, + 0xcf, 0x97, 0xd5, 0xc2, 0xf6, 0xd9, 0x22, 0x4c, 0x87, 0xfa, 0x79, 0x97, 0xbb, 0x45, 0xbc, 0xa9, + 0xed, 0x76, 0x98, 0xad, 0x56, 0x38, 0xe2, 0x72, 0x47, 0x64, 0x53, 0x33, 0x3a, 0x97, 0x0b, 0x19, + 0xa5, 0x00, 0x33, 0xe1, 0x2e, 0xbd, 0x20, 0xa1, 0x37, 0x5f, 0x03, 0x53, 0xe7, 0x4d, 0xeb, 0x22, + 0xf1, 0xe3, 0x42, 0xef, 0xa2, 0x71, 0x4d, 0xbc, 0x13, 0xa2, 0xa1, 0x81, 0xfd, 0xe5, 0xe2, 0xde, + 0x02, 0x1e, 0xb5, 0xf9, 0x81, 0xa7, 0x40, 0xcf, 0xc0, 0xf4, 0x25, 0x2f, 0x77, 0xd0, 0xd2, 0x43, + 0x49, 0xe8, 0xbf, 0x89, 0xed, 0xff, 0x0f, 0x2e, 0x32, 0xfd, 0xfd, 0xe9, 0x37, 0x49, 0x90, 0x5f, + 0xc6, 0x4e, 0xb1, 0xd3, 0x09, 0xcb, 0xed, 0x45, 0xc2, 0x27, 0x7b, 0xb8, 0x4a, 0x14, 0x3b, 0x9d, + 0xe8, 0x46, 0x15, 0x12, 0x90, 0xe7, 0x81, 0xce, 0xa5, 0x09, 0xfa, 0xcd, 0x0d, 0x28, 0x30, 0x7d, + 0x89, 0xbd, 0x5f, 0xf6, 0xf7, 0xb8, 0x1f, 0x09, 0x59, 0x39, 0x4f, 0x0c, 0x62, 0xda, 0x64, 0xe2, + 0xf7, 0xca, 0xbd, 0x7c, 0xca, 0x7d, 0x30, 0xb1, 0x6b, 0xe3, 0x92, 0x66, 0x63, 0xc2, 0x5b, 0x6f, + 0x4d, 0x6b, 0x17, 0x1e, 0xc0, 0x2d, 0x67, 0xbe, 0xb2, 0xe3, 0x1a, 0xd4, 0x1b, 0x34, 0xa3, 0x1f, + 0x26, 0x86, 0xbd, 0xab, 0x1e, 0x05, 0x77, 0x52, 0x72, 0x49, 0x77, 0xb6, 0x4b, 0xdb, 0x9a, 0xc3, + 0xd6, 0xb6, 0xfd, 0x77, 0xf4, 0x82, 0x21, 0xe0, 0x8c, 0xdd, 0x0b, 0x8e, 0x3c, 0x20, 0x98, 0x18, + 0xc4, 0x11, 0x6c, 0xe0, 0x0e, 0x03, 0xe2, 0x3f, 0x4a, 0x90, 0xad, 0x75, 0xb1, 0x21, 0x7c, 0x1a, + 0xc6, 0x97, 0xad, 0xd4, 0x23, 0xdb, 0x87, 0xc5, 0xbd, 0xc3, 0xfc, 0x4a, 0xbb, 0x25, 0x47, 0x48, + 0xf6, 0x16, 0xc8, 0xea, 0xc6, 0xa6, 0xc9, 0x0c, 0xd3, 0xab, 0x23, 0x36, 0x81, 0x2a, 0xc6, 0xa6, + 0xa9, 0x92, 0x8c, 0xa2, 0x8e, 0x61, 0x71, 0x65, 0xa7, 0x2f, 0xee, 0xaf, 0x4d, 0x42, 0x9e, 0xaa, + 0x33, 0x7a, 0xa1, 0x0c, 0x72, 0xb1, 0xdd, 0x8e, 0x10, 0xbc, 0xb4, 0x4f, 0xf0, 0x26, 0xf9, 0xcd, + 0xc7, 0xc4, 0x7f, 0xe7, 0x83, 0x99, 0x08, 0xf6, 0xed, 0xac, 0x49, 0x15, 0xdb, 0xed, 0x68, 0x1f, + 0x54, 0xbf, 0x40, 0x89, 0x2f, 0x30, 0xdc, 0xc2, 0x65, 0xb1, 0x16, 0x9e, 0x78, 0x20, 0x88, 0xe4, + 0x2f, 0x7d, 0x88, 0xfe, 0x59, 0x82, 0x89, 0x55, 0xdd, 0x76, 0x5c, 0x6c, 0x8a, 0x22, 0xd8, 0x5c, + 0x03, 0x53, 0x9e, 0x68, 0xdc, 0x2e, 0xcf, 0xed, 0xcf, 0x83, 0x04, 0xf4, 0xaa, 0x30, 0x3a, 0xf7, + 0xf2, 0xe8, 0x3c, 0x39, 0xbe, 0xf6, 0x8c, 0x8b, 0xe8, 0x53, 0x06, 0x41, 0xb1, 0x52, 0x6f, 0xb1, + 0xbf, 0xed, 0x0b, 0x7c, 0x8d, 0x13, 0xf8, 0xed, 0xc3, 0x14, 0x99, 0xbe, 0xd0, 0x3f, 0x2d, 0x01, + 0xb8, 0x65, 0xb3, 0xa3, 0x5c, 0x8f, 0xe3, 0x0e, 0x68, 0xc7, 0x48, 0xf7, 0xa5, 0x61, 0xe9, 0xae, + 0xf1, 0xd2, 0xfd, 0xe1, 0xc1, 0x55, 0x8d, 0x3b, 0xb2, 0xa5, 0x14, 0x40, 0xd6, 0x7d, 0xd1, 0xba, + 0x8f, 0xe8, 0x4d, 0xbe, 0x50, 0xd7, 0x39, 0xa1, 0xde, 0x39, 0x64, 0x49, 0xe9, 0xcb, 0xf5, 0xaf, + 0x24, 0x98, 0xa8, 0x63, 0xc7, 0xed, 0x26, 0xd1, 0x39, 0x91, 0x1e, 0x3e, 0xd4, 0xb6, 0x25, 0xc1, + 0xb6, 0xfd, 0xcd, 0x8c, 0x68, 0xa0, 0x97, 0x40, 0x32, 0x8c, 0xa7, 0x88, 0xc5, 0x83, 0x47, 0x84, + 0x02, 0xbd, 0x0c, 0xa2, 0x96, 0xbe, 0x74, 0xdf, 0x20, 0xf9, 0x1b, 0xf3, 0xfc, 0x49, 0x8b, 0xb0, + 0x59, 0x9c, 0xd9, 0x6f, 0x16, 0x8b, 0x9f, 0xb4, 0x08, 0xd7, 0x31, 0x7a, 0x57, 0x3a, 0xb1, 0xb1, + 0x31, 0x82, 0x0d, 0xe3, 0x61, 0xe4, 0xf5, 0x6c, 0x19, 0xf2, 0x6c, 0x65, 0xf9, 0xee, 0xf8, 0x95, + 0xe5, 0xc1, 0x53, 0x8b, 0x77, 0x0e, 0x61, 0xca, 0xc5, 0x2d, 0xf7, 0xfa, 0x6c, 0x48, 0x21, 0x36, + 0x6e, 0x86, 0x1c, 0x89, 0x44, 0xc9, 0xc6, 0xb9, 0x60, 0xaf, 0xdf, 0x23, 0x51, 0x76, 0xbf, 0xaa, + 0x34, 0x53, 0x62, 0x14, 0x46, 0xb0, 0x42, 0x3c, 0x0c, 0x0a, 0x6f, 0x57, 0x00, 0xd6, 0x77, 0x2f, + 0x74, 0x74, 0x7b, 0x5b, 0x37, 0xb6, 0xd0, 0x77, 0x33, 0x30, 0xc3, 0x5e, 0x69, 0x40, 0xc5, 0x58, + 0xf3, 0x2f, 0xd2, 0x28, 0x28, 0x80, 0xbc, 0x6b, 0xe9, 0x6c, 0x19, 0xc0, 0x7d, 0x54, 0xee, 0xf2, + 0x1d, 0x79, 0xb2, 0x3d, 0x47, 0xe9, 0x5d, 0x31, 0x04, 0x1c, 0xcc, 0x87, 0x4a, 0x0f, 0x1c, 0x7a, + 0xc2, 0x51, 0x33, 0x73, 0x7c, 0xd4, 0x4c, 0xee, 0x7c, 0x5d, 0xbe, 0xe7, 0x7c, 0x9d, 0x8b, 0xa3, + 0xad, 0x3f, 0x13, 0x13, 0xe7, 0x52, 0x59, 0x25, 0xcf, 0xee, 0x1f, 0x0f, 0x98, 0xba, 0x41, 0x36, + 0x0b, 0x98, 0xeb, 0x68, 0x90, 0x80, 0xde, 0x17, 0x4c, 0x64, 0x4c, 0x41, 0x2b, 0x38, 0x81, 0x18, + 0xb8, 0xb2, 0xb3, 0xbd, 0x65, 0x7f, 0x50, 0x38, 0x4a, 0x56, 0x48, 0x60, 0xb1, 0x53, 0x12, 0xc6, + 0x81, 0xe4, 0x73, 0x10, 0xda, 0xed, 0x8b, 0xeb, 0x4e, 0x07, 0xd1, 0x4f, 0xa6, 0x98, 0x3b, 0x43, + 0x2c, 0xbe, 0x28, 0x30, 0xe7, 0x9d, 0x3a, 0xac, 0x2d, 0xdc, 0x5b, 0x2e, 0x35, 0x0a, 0x78, 0xff, + 0x49, 0x44, 0x72, 0xe6, 0x90, 0x9e, 0x2f, 0x0c, 0x16, 0x58, 0xd0, 0xff, 0x90, 0x20, 0xcf, 0x6c, + 0x87, 0xbb, 0x0f, 0x08, 0x21, 0x7a, 0xd9, 0x30, 0x90, 0xc4, 0x1e, 0xfe, 0xfe, 0x58, 0x52, 0x00, + 0x46, 0x60, 0x2d, 0xdc, 0x9f, 0x1a, 0x00, 0xe8, 0x5f, 0x25, 0xc8, 0xba, 0x36, 0x8d, 0xd8, 0xd1, + 0xda, 0x8f, 0x0a, 0x3b, 0xb5, 0x86, 0x04, 0xe0, 0x92, 0x8f, 0xd0, 0xef, 0x05, 0x98, 0xea, 0xd2, + 0x8c, 0xfe, 0xc1, 0xee, 0xeb, 0x05, 0x7a, 0x16, 0xac, 0x06, 0xbf, 0xa1, 0x77, 0x08, 0x39, 0xc6, + 0xc6, 0xf3, 0x93, 0x0c, 0x8e, 0xf2, 0x28, 0x4e, 0xe1, 0x6e, 0xa2, 0x6f, 0x4b, 0x00, 0x2a, 0xb6, + 0xcd, 0xce, 0x1e, 0xde, 0xb0, 0x74, 0x74, 0x75, 0x00, 0x00, 0x6b, 0xf6, 0x99, 0xa0, 0xd9, 0x7f, + 0x22, 0x2c, 0xf8, 0x65, 0x5e, 0xf0, 0x4f, 0x8c, 0xd6, 0x3c, 0x8f, 0x78, 0x84, 0xf8, 0x9f, 0x0e, + 0x13, 0x4c, 0x8e, 0xcc, 0x40, 0x14, 0x13, 0xbe, 0xf7, 0x13, 0x7a, 0xb7, 0x2f, 0xfa, 0x7b, 0x39, + 0xd1, 0x3f, 0x25, 0x31, 0x47, 0xc9, 0x00, 0x28, 0x0d, 0x01, 0xc0, 0x51, 0x98, 0xf6, 0x00, 0xd8, + 0x50, 0x2b, 0x05, 0x8c, 0xde, 0x2a, 0x93, 0xbd, 0x74, 0x3a, 0x52, 0x1d, 0xbc, 0xa7, 0xf9, 0xb2, + 0xf0, 0xcc, 0x3d, 0x24, 0x0f, 0xbf, 0xfc, 0x94, 0x00, 0xfa, 0x53, 0xa1, 0xa9, 0xba, 0x00, 0x43, + 0x8f, 0x96, 0xfe, 0xea, 0x6c, 0x19, 0x66, 0x39, 0x13, 0x43, 0x39, 0x05, 0xc7, 0xb9, 0x04, 0x3a, + 0xde, 0xb5, 0x0b, 0x47, 0x14, 0x04, 0x27, 0xb9, 0x2f, 0xec, 0x05, 0xb7, 0x0b, 0x19, 0xf4, 0x0b, + 0x7f, 0x9e, 0xf1, 0x17, 0x6f, 0xde, 0x99, 0x65, 0xcb, 0x66, 0x1f, 0xe6, 0x63, 0x89, 0xb5, 0x4c, + 0xc3, 0xc1, 0x0f, 0x86, 0x7c, 0x19, 0xfc, 0x84, 0x58, 0xab, 0xe1, 0x14, 0x4c, 0x38, 0x56, 0xd8, + 0xbf, 0xc1, 0x7b, 0x0d, 0x2b, 0x56, 0x8e, 0x57, 0xac, 0x2a, 0x9c, 0xd5, 0x8d, 0x56, 0x67, 0xb7, + 0x8d, 0x55, 0xdc, 0xd1, 0x5c, 0x19, 0xda, 0x45, 0x7b, 0x11, 0x77, 0xb1, 0xd1, 0xc6, 0x86, 0x43, + 0xf9, 0xf4, 0xce, 0x32, 0x09, 0xe4, 0xe4, 0x95, 0xf1, 0x2e, 0x5e, 0x19, 0x1f, 0xd7, 0x6f, 0x3d, + 0x36, 0x66, 0xf1, 0xee, 0x76, 0x00, 0x5a, 0xb7, 0x73, 0x3a, 0xbe, 0xc4, 0xd4, 0xf0, 0xaa, 0x9e, + 0x25, 0xbc, 0x9a, 0x9f, 0x41, 0x0d, 0x65, 0x46, 0x9f, 0xf7, 0xd5, 0xef, 0x1e, 0x4e, 0xfd, 0x6e, + 0x16, 0x64, 0x21, 0x99, 0xd6, 0x75, 0x87, 0xd0, 0xba, 0x59, 0x98, 0x0a, 0x76, 0x76, 0x65, 0xe5, + 0x2a, 0x38, 0xe1, 0xf9, 0x8a, 0x56, 0xcb, 0xe5, 0xc5, 0x7a, 0x73, 0x63, 0x7d, 0x59, 0x2d, 0x2e, + 0x96, 0x0b, 0xe0, 0xea, 0x27, 0xd5, 0x4b, 0xdf, 0xc5, 0x33, 0x8b, 0xfe, 0x42, 0x82, 0x1c, 0x39, + 0x88, 0x87, 0x7e, 0x7c, 0x44, 0x9a, 0x63, 0x73, 0x9e, 0x31, 0xfe, 0xb8, 0x2b, 0x1e, 0xe3, 0x9b, + 0x09, 0x93, 0x70, 0x75, 0xa0, 0x18, 0xdf, 0x31, 0x84, 0xd2, 0x9f, 0xd6, 0xb8, 0x4d, 0xb2, 0xbe, + 0x6d, 0x5e, 0xfa, 0x7e, 0x6e, 0x92, 0x6e, 0xfd, 0x0f, 0xb9, 0x49, 0xf6, 0x61, 0x61, 0xec, 0x4d, + 0xb2, 0x4f, 0xbb, 0x8b, 0x69, 0xa6, 0xe8, 0x59, 0x39, 0x7f, 0xfe, 0xf7, 0x1c, 0xe9, 0x40, 0x1b, + 0x59, 0x45, 0x98, 0xd5, 0x0d, 0x07, 0x5b, 0x86, 0xd6, 0x59, 0xea, 0x68, 0x5b, 0x9e, 0x7d, 0xda, + 0xbb, 0x7b, 0x51, 0x09, 0xe5, 0x51, 0xf9, 0x3f, 0x94, 0xd3, 0x00, 0x0e, 0xde, 0xe9, 0x76, 0x34, + 0x27, 0x50, 0xbd, 0x50, 0x4a, 0x58, 0xfb, 0xb2, 0xbc, 0xf6, 0xdd, 0x0a, 0x57, 0x50, 0xd0, 0x1a, + 0x97, 0xbb, 0x78, 0xc3, 0xd0, 0x7f, 0x62, 0x97, 0x84, 0x9e, 0xa4, 0x3a, 0xda, 0xef, 0x13, 0xb7, + 0x9d, 0x93, 0xef, 0xd9, 0xce, 0xf9, 0x47, 0xe1, 0x90, 0x16, 0x5e, 0xab, 0x1f, 0x10, 0xd2, 0xc2, + 0x6f, 0x69, 0x72, 0x4f, 0x4b, 0xf3, 0x17, 0x59, 0xb2, 0x02, 0x8b, 0x2c, 0x61, 0x54, 0x72, 0x82, + 0x0b, 0x94, 0xaf, 0x14, 0x8a, 0x99, 0x11, 0x57, 0x8d, 0x31, 0x2c, 0x80, 0xcb, 0x30, 0x47, 0x8b, + 0x5e, 0x30, 0xcd, 0x8b, 0x3b, 0x9a, 0x75, 0x11, 0x59, 0x07, 0x52, 0xc5, 0xd8, 0xbd, 0xa4, 0xc8, + 0x0d, 0xd2, 0x8f, 0x0b, 0xcf, 0x19, 0x38, 0x71, 0x79, 0x3c, 0x8f, 0x67, 0x33, 0xe9, 0x75, 0x42, + 0x53, 0x08, 0x11, 0x06, 0xd3, 0xc7, 0xf5, 0x8f, 0x7d, 0x5c, 0xbd, 0x8e, 0x3e, 0xbc, 0x0e, 0x3f, + 0x4a, 0x5c, 0xd1, 0x17, 0x86, 0xc3, 0xce, 0xe3, 0x6b, 0x08, 0xec, 0x0a, 0x20, 0x5f, 0xf4, 0x5d, + 0x7f, 0xdc, 0xc7, 0x70, 0x85, 0xb2, 0xe9, 0xa1, 0x19, 0xc1, 0xf2, 0x58, 0xd0, 0x3c, 0xce, 0xb3, + 0x50, 0xeb, 0xa6, 0x8a, 0xe9, 0xe7, 0x84, 0xf7, 0xb7, 0xfa, 0x0a, 0x88, 0x72, 0x37, 0x9e, 0x56, + 0x29, 0xb6, 0x39, 0x26, 0xce, 0x66, 0xfa, 0x68, 0x3e, 0x3f, 0x07, 0x53, 0x5e, 0xd0, 0x11, 0x72, + 0x27, 0x8e, 0x8f, 0xe1, 0x49, 0xc8, 0xdb, 0xe6, 0xae, 0xd5, 0xc2, 0x6c, 0xc7, 0x91, 0xbd, 0x0d, + 0xb1, 0x3b, 0x36, 0x70, 0x3c, 0xdf, 0x67, 0x32, 0x64, 0x13, 0x9b, 0x0c, 0xd1, 0x06, 0x69, 0xdc, + 0x00, 0xff, 0x02, 0xe1, 0x40, 0xe6, 0x1c, 0x66, 0x75, 0xec, 0x3c, 0x1a, 0xc7, 0xf8, 0x3f, 0x10, + 0xda, 0x7b, 0x19, 0x50, 0x93, 0x64, 0x2a, 0x57, 0x1b, 0xc2, 0x50, 0xbd, 0x1a, 0xae, 0xf4, 0x72, + 0x30, 0x0b, 0x95, 0x58, 0xa4, 0x1b, 0xea, 0x6a, 0x41, 0x46, 0xcf, 0xce, 0x42, 0x81, 0xb2, 0x56, + 0xf3, 0x8d, 0x35, 0xf4, 0xa2, 0xcc, 0x61, 0x5b, 0xa4, 0xd1, 0x53, 0xcc, 0x4f, 0x4a, 0xa2, 0xc1, + 0x52, 0x39, 0xc1, 0x07, 0xb5, 0x8b, 0xd0, 0xa4, 0x21, 0x9a, 0x59, 0x8c, 0xf2, 0xa1, 0xdf, 0xca, + 0x88, 0xc4, 0x5e, 0x15, 0x63, 0x31, 0xfd, 0x5e, 0xe9, 0x33, 0x59, 0x2f, 0x76, 0xd4, 0x92, 0x65, + 0xee, 0x6c, 0x58, 0x1d, 0xf4, 0x7f, 0x0b, 0x85, 0xb6, 0x8e, 0x30, 0xff, 0xa5, 0x68, 0xf3, 0x9f, + 0x2c, 0x19, 0x77, 0x82, 0xbd, 0xaa, 0xce, 0x10, 0xc3, 0xb7, 0x72, 0x03, 0xcc, 0x69, 0xed, 0xf6, + 0xba, 0xb6, 0x85, 0x4b, 0xee, 0xbc, 0xda, 0x70, 0x58, 0x5c, 0x99, 0x9e, 0xd4, 0xd8, 0xae, 0x48, + 0x7c, 0x1d, 0x94, 0x03, 0x89, 0xc9, 0x67, 0x2c, 0xc3, 0x9b, 0x3b, 0x24, 0xb4, 0xb6, 0xb5, 0x20, + 0xca, 0x15, 0x7b, 0x13, 0xf4, 0x6c, 0x12, 0xe0, 0x3b, 0x7d, 0xcd, 0xfa, 0x3d, 0x09, 0x26, 0x5c, + 0x79, 0x17, 0xdb, 0x6d, 0xf4, 0x58, 0x2e, 0x18, 0x5c, 0xa4, 0x6f, 0xd9, 0xcf, 0x0a, 0x3b, 0xf5, + 0x79, 0x35, 0xa4, 0xf4, 0x23, 0x30, 0x09, 0x84, 0x28, 0x71, 0x42, 0x14, 0xf3, 0xdd, 0x8b, 0x2d, + 0x22, 0x7d, 0xf1, 0x7d, 0x54, 0x82, 0x59, 0x6f, 0x1e, 0xb1, 0x84, 0x9d, 0xd6, 0x36, 0xba, 0x5d, + 0x74, 0xa1, 0x89, 0xb5, 0x34, 0x7f, 0x4f, 0xb6, 0x83, 0xbe, 0x93, 0x49, 0xa8, 0xf2, 0x5c, 0xc9, + 0x11, 0xab, 0x74, 0x89, 0x74, 0x31, 0x8e, 0x60, 0xfa, 0xc2, 0xfc, 0xbc, 0x04, 0xd0, 0x30, 0xfd, + 0xb9, 0xee, 0x01, 0x24, 0xf9, 0x2b, 0xc2, 0xdb, 0xb5, 0xac, 0xe2, 0x41, 0xb1, 0xc9, 0x7b, 0x0e, + 0x41, 0xd7, 0xa4, 0x41, 0x25, 0x8d, 0xa5, 0xad, 0x4f, 0x2d, 0xee, 0x76, 0x3b, 0x7a, 0x4b, 0x73, + 0x7a, 0xfd, 0xe9, 0xa2, 0xc5, 0x4b, 0x2e, 0x8c, 0x4c, 0x64, 0x14, 0xfa, 0x65, 0x44, 0xc8, 0x92, + 0x06, 0x29, 0x91, 0xbc, 0x20, 0x25, 0x82, 0x3e, 0x32, 0x03, 0x88, 0x8f, 0x41, 0x3d, 0x65, 0x38, + 0x5a, 0xeb, 0x62, 0x63, 0xc1, 0xc2, 0x5a, 0xbb, 0x65, 0xed, 0xee, 0x5c, 0xb0, 0xc3, 0xce, 0xa0, + 0xf1, 0x3a, 0x1a, 0x5a, 0x3a, 0x96, 0xb8, 0xa5, 0x63, 0xf4, 0x33, 0xb2, 0x68, 0xc8, 0x9c, 0xd0, + 0x06, 0x47, 0x88, 0x87, 0x21, 0x86, 0xba, 0x44, 0x2e, 0x4c, 0x3d, 0xab, 0xc4, 0xd9, 0x24, 0xab, + 0xc4, 0xaf, 0x17, 0x0a, 0xc0, 0x23, 0x54, 0xaf, 0xb1, 0x78, 0xa2, 0xcd, 0xd5, 0xb1, 0x13, 0x01, + 0xef, 0xf5, 0x30, 0x7b, 0x21, 0xf8, 0xe2, 0x43, 0xcc, 0x27, 0xf6, 0xf1, 0x0f, 0x7d, 0x43, 0xd2, + 0x15, 0x18, 0x9e, 0x85, 0x08, 0x74, 0x7d, 0x04, 0x25, 0x11, 0x27, 0xb4, 0x44, 0xcb, 0x29, 0xb1, + 0xe5, 0xa7, 0x8f, 0xc2, 0x07, 0x25, 0x98, 0x26, 0xd7, 0x60, 0x2e, 0x5c, 0x26, 0xa7, 0x1a, 0x05, + 0x8d, 0x92, 0xe7, 0x87, 0xc5, 0xac, 0x40, 0xb6, 0xa3, 0x1b, 0x17, 0x3d, 0xef, 0x41, 0xf7, 0x39, + 0xb8, 0x54, 0x4d, 0xea, 0x73, 0xa9, 0x9a, 0xbf, 0x4f, 0xe1, 0x97, 0x7b, 0xa0, 0x5b, 0x7e, 0x07, + 0x92, 0x4b, 0x5f, 0x8c, 0x7f, 0x9f, 0x85, 0x7c, 0x1d, 0x6b, 0x56, 0x6b, 0x1b, 0xbd, 0x53, 0xea, + 0x3b, 0x55, 0x98, 0xe4, 0xa7, 0x0a, 0x4b, 0x30, 0xb1, 0xa9, 0x77, 0x1c, 0x6c, 0x51, 0x8f, 0xea, + 0x70, 0xd7, 0x4e, 0x9b, 0xf8, 0x42, 0xc7, 0x6c, 0x5d, 0x9c, 0x67, 0xa6, 0xfb, 0xbc, 0x17, 0x84, + 0x73, 0x7e, 0x89, 0xfc, 0xa4, 0x7a, 0x3f, 0xbb, 0x06, 0xa1, 0x6d, 0x5a, 0x4e, 0xd4, 0xfd, 0x0a, + 0x11, 0x54, 0xea, 0xa6, 0xe5, 0xa8, 0xf4, 0x47, 0x17, 0xe6, 0xcd, 0xdd, 0x4e, 0xa7, 0x81, 0x1f, + 0x74, 0xbc, 0x69, 0x9b, 0xf7, 0xee, 0x1a, 0x8b, 0xe6, 0xe6, 0xa6, 0x8d, 0xe9, 0xa2, 0x41, 0x4e, + 0x65, 0x6f, 0xca, 0x71, 0xc8, 0x75, 0xf4, 0x1d, 0x9d, 0x4e, 0x34, 0x72, 0x2a, 0x7d, 0x51, 0x6e, + 0x82, 0x42, 0x30, 0xc7, 0xa1, 0x8c, 0x9e, 0xca, 0x93, 0xa6, 0xb9, 0x2f, 0xdd, 0xd5, 0x99, 0x8b, + 0xf8, 0xb2, 0x7d, 0x6a, 0x82, 0x7c, 0x27, 0xcf, 0xfc, 0xf1, 0x15, 0x91, 0xfd, 0x0e, 0x2a, 0xf1, + 0xe8, 0x19, 0xac, 0x85, 0x5b, 0xa6, 0xd5, 0xf6, 0x64, 0x13, 0x3d, 0xc1, 0x60, 0xf9, 0x92, 0xed, + 0x52, 0xf4, 0x2d, 0x3c, 0x7d, 0x4d, 0x7b, 0x5b, 0xde, 0xed, 0x36, 0xdd, 0xa2, 0xcf, 0xeb, 0xce, + 0xf6, 0x1a, 0x76, 0x34, 0xf4, 0xf7, 0x72, 0x5f, 0x8d, 0x9b, 0xfe, 0xdf, 0x1a, 0x37, 0x40, 0xe3, + 0x68, 0x78, 0x25, 0x67, 0xd7, 0x32, 0x5c, 0x39, 0x32, 0xaf, 0xd4, 0x50, 0x8a, 0x72, 0x27, 0x5c, + 0x15, 0xbc, 0x79, 0x4b, 0xa5, 0x8b, 0x6c, 0xda, 0x3a, 0x45, 0xb2, 0x47, 0x67, 0x50, 0xd6, 0xe1, + 0x3a, 0xfa, 0x71, 0xa5, 0xb1, 0xb6, 0xba, 0xa2, 0x6f, 0x6d, 0x77, 0xf4, 0xad, 0x6d, 0xc7, 0xae, + 0x18, 0xb6, 0x83, 0xb5, 0x76, 0x6d, 0x53, 0xa5, 0x37, 0xa3, 0x00, 0xa1, 0x23, 0x92, 0x95, 0xf7, + 0xb8, 0x16, 0x1b, 0xdd, 0xc2, 0x9a, 0x12, 0xd1, 0x52, 0x9e, 0xe2, 0xb6, 0x14, 0x7b, 0xb7, 0xe3, + 0x63, 0x7a, 0x4d, 0x0f, 0xa6, 0x81, 0xaa, 0xef, 0x76, 0x48, 0x73, 0x21, 0x99, 0x93, 0x8e, 0x73, + 0x31, 0x9c, 0xa4, 0xdf, 0x6c, 0xfe, 0xbf, 0x3c, 0xe4, 0x96, 0x2d, 0xad, 0xbb, 0x8d, 0x9e, 0x1d, + 0xea, 0x9f, 0x47, 0xd5, 0x26, 0x7c, 0xed, 0x94, 0x06, 0x69, 0xa7, 0x3c, 0x40, 0x3b, 0xb3, 0x21, + 0xed, 0x8c, 0x5e, 0x54, 0x3e, 0x0b, 0x33, 0x2d, 0xb3, 0xd3, 0xc1, 0x2d, 0x57, 0x1e, 0x95, 0x36, + 0x59, 0xcd, 0x99, 0x52, 0xb9, 0x34, 0x12, 0xa8, 0x18, 0x3b, 0x75, 0xba, 0x86, 0x4e, 0x95, 0x3e, + 0x48, 0x40, 0x2f, 0x92, 0x20, 0x5b, 0x6e, 0x6f, 0x61, 0x6e, 0x9d, 0x3d, 0x13, 0x5a, 0x67, 0x3f, + 0x09, 0x79, 0x47, 0xb3, 0xb6, 0xb0, 0xe3, 0xad, 0x13, 0xd0, 0x37, 0x3f, 0x7e, 0xb2, 0x1c, 0x8a, + 0x9f, 0xfc, 0xc3, 0x90, 0x75, 0x65, 0xc6, 0x9c, 0xcc, 0xaf, 0xeb, 0x07, 0x3f, 0x91, 0xfd, 0xbc, + 0x5b, 0xe2, 0xbc, 0x5b, 0x6b, 0x95, 0xfc, 0xd0, 0x8b, 0x75, 0x6e, 0x1f, 0xd6, 0xe4, 0x92, 0xc7, + 0x96, 0x69, 0x54, 0x76, 0xb4, 0x2d, 0xcc, 0xaa, 0x19, 0x24, 0x78, 0x5f, 0xcb, 0x3b, 0xe6, 0x03, + 0x3a, 0x0b, 0x65, 0x1c, 0x24, 0xb8, 0x55, 0xd8, 0xd6, 0xdb, 0x6d, 0x6c, 0xb0, 0x96, 0xcd, 0xde, + 0xce, 0x9e, 0x86, 0xac, 0xcb, 0x83, 0xab, 0x3f, 0xae, 0xb1, 0x50, 0x38, 0xa2, 0xcc, 0xb8, 0xcd, + 0x8a, 0x36, 0xde, 0x42, 0x86, 0x5f, 0x53, 0x15, 0x71, 0xdb, 0xa1, 0x95, 0xeb, 0xdf, 0xb8, 0x9e, + 0x00, 0x39, 0xc3, 0x6c, 0xe3, 0x81, 0x83, 0x10, 0xcd, 0xa5, 0x3c, 0x19, 0x72, 0xb8, 0xed, 0xf6, + 0x0a, 0x32, 0xc9, 0x7e, 0x3a, 0x5e, 0x96, 0x2a, 0xcd, 0x9c, 0xcc, 0x37, 0xa8, 0x1f, 0xb7, 0xe9, + 0x37, 0xc0, 0x9f, 0x9f, 0x80, 0xa3, 0xb4, 0x0f, 0xa8, 0xef, 0x5e, 0x70, 0x49, 0x5d, 0xc0, 0xe8, + 0x91, 0xfe, 0x03, 0xd7, 0x51, 0x5e, 0xd9, 0x8f, 0x43, 0xce, 0xde, 0xbd, 0xe0, 0x1b, 0xa1, 0xf4, + 0x25, 0xdc, 0x74, 0xa5, 0x91, 0x0c, 0x67, 0xf2, 0xb0, 0xc3, 0x19, 0x37, 0x34, 0xc9, 0x5e, 0xe3, + 0x0f, 0x06, 0x32, 0x7a, 0x3c, 0xc2, 0x1b, 0xc8, 0xfa, 0x0d, 0x43, 0xa7, 0x60, 0x42, 0xdb, 0x74, + 0xb0, 0x15, 0x98, 0x89, 0xec, 0xd5, 0x1d, 0x2a, 0x2f, 0xe0, 0x4d, 0xd3, 0x72, 0xc5, 0x32, 0x45, + 0x87, 0x4a, 0xef, 0x3d, 0xd4, 0x72, 0x81, 0xdb, 0x21, 0xbb, 0x19, 0x8e, 0x19, 0xe6, 0x22, 0xee, + 0x32, 0x39, 0x53, 0x14, 0x67, 0x49, 0x0b, 0xd8, 0xff, 0x61, 0x5f, 0x57, 0x32, 0xb7, 0xbf, 0x2b, + 0x41, 0x9f, 0x48, 0x3a, 0x67, 0xee, 0x01, 0x7a, 0x64, 0x16, 0x9a, 0xf2, 0x34, 0x98, 0x69, 0x33, + 0x17, 0xad, 0x96, 0xee, 0xb7, 0x92, 0xc8, 0xff, 0xb8, 0xcc, 0x81, 0x22, 0x65, 0xc3, 0x8a, 0xb4, + 0x0c, 0x93, 0xe4, 0x20, 0xb3, 0xab, 0x49, 0xb9, 0x1e, 0x97, 0x78, 0x32, 0xad, 0xf3, 0x2b, 0x15, + 0x12, 0xdb, 0x7c, 0x89, 0xfd, 0xa2, 0xfa, 0x3f, 0x27, 0x9b, 0x7d, 0xc7, 0x4b, 0x28, 0xfd, 0xe6, + 0xf8, 0xdb, 0x79, 0xb8, 0xaa, 0x64, 0x99, 0xb6, 0x4d, 0xce, 0xc0, 0xf4, 0x36, 0xcc, 0xd7, 0x4a, + 0xdc, 0x4d, 0x0a, 0x8f, 0xea, 0xe6, 0xd7, 0xaf, 0x41, 0x8d, 0xaf, 0x69, 0x7c, 0x59, 0x38, 0x04, + 0x8c, 0xbf, 0xff, 0x10, 0x21, 0xf4, 0xef, 0x8f, 0x46, 0xf2, 0xb6, 0x8c, 0x48, 0x54, 0x9a, 0x84, + 0xb2, 0x4a, 0xbf, 0xb9, 0x7c, 0x4e, 0x82, 0xab, 0x7b, 0xb9, 0xd9, 0x30, 0x6c, 0xbf, 0xc1, 0x5c, + 0x3b, 0xa0, 0xbd, 0xf0, 0x51, 0x4c, 0x62, 0xef, 0x30, 0x8c, 0xa8, 0x7b, 0xa8, 0xb4, 0x88, 0xc5, + 0x92, 0xe0, 0x44, 0x4d, 0xdc, 0x1d, 0x86, 0x89, 0xc9, 0xa7, 0x2f, 0xdc, 0x4f, 0x66, 0xe1, 0xe8, + 0xb2, 0x65, 0xee, 0x76, 0xed, 0xa0, 0x07, 0xfa, 0x9b, 0xfe, 0x1b, 0xae, 0x79, 0x11, 0xd3, 0xe0, + 0x0c, 0x4c, 0x5b, 0xcc, 0x9a, 0x0b, 0xb6, 0x5f, 0xc3, 0x49, 0xe1, 0xde, 0x4b, 0x3e, 0x48, 0xef, + 0x15, 0xf4, 0x33, 0x59, 0xae, 0x9f, 0xe9, 0xed, 0x39, 0x72, 0x7d, 0x7a, 0x8e, 0xbf, 0x96, 0x12, + 0x0e, 0xaa, 0x3d, 0x22, 0x8a, 0xe8, 0x2f, 0x4a, 0x90, 0xdf, 0x22, 0x19, 0x59, 0x77, 0xf1, 0x78, + 0xb1, 0x9a, 0x11, 0xe2, 0x2a, 0xfb, 0x35, 0x90, 0xab, 0x1c, 0xd6, 0xe1, 0x44, 0x03, 0x5c, 0x3c, + 0xb7, 0xe9, 0x2b, 0xd5, 0xc3, 0x59, 0x98, 0xf1, 0x4b, 0xaf, 0xb4, 0x6d, 0xf4, 0xfc, 0xfe, 0x1a, + 0x35, 0x2b, 0xa2, 0x51, 0xfb, 0xd6, 0x99, 0xfd, 0x51, 0x47, 0x0e, 0x8d, 0x3a, 0x7d, 0x47, 0x97, + 0x99, 0x88, 0xd1, 0x05, 0x3d, 0x4b, 0x16, 0xbd, 0x8b, 0x88, 0xef, 0x5a, 0x49, 0x6d, 0x1e, 0xcd, + 0x83, 0x85, 0xe0, 0x8d, 0x48, 0x83, 0x6b, 0x95, 0xbe, 0x92, 0xbc, 0x47, 0x82, 0x63, 0xfb, 0x3b, + 0xf3, 0x1f, 0xe0, 0xbd, 0xd0, 0xdc, 0x3a, 0xd9, 0xbe, 0x17, 0x1a, 0x79, 0xe3, 0x37, 0xe9, 0x62, + 0x43, 0x8a, 0x70, 0xf6, 0xde, 0xe0, 0x4e, 0x5c, 0x2c, 0x68, 0x88, 0x20, 0xd1, 0xf4, 0x05, 0xf8, + 0xab, 0x32, 0x4c, 0xd5, 0xb1, 0xb3, 0xaa, 0x5d, 0x36, 0x77, 0x1d, 0xa4, 0x89, 0x6e, 0xcf, 0x3d, + 0x15, 0xf2, 0x1d, 0xf2, 0x0b, 0xbb, 0xe2, 0xfd, 0x4c, 0xdf, 0xfd, 0x2d, 0xe2, 0xfb, 0x43, 0x49, + 0xab, 0x2c, 0x3f, 0x1f, 0xcb, 0x45, 0x64, 0x77, 0xd4, 0xe7, 0x6e, 0x24, 0x5b, 0x3b, 0x89, 0xf6, + 0x4e, 0xa3, 0x8a, 0x4e, 0x1f, 0x96, 0x9f, 0x91, 0x61, 0xb6, 0x8e, 0x9d, 0x8a, 0xbd, 0xa4, 0xed, + 0x99, 0x96, 0xee, 0xe0, 0xf0, 0x1d, 0x8f, 0xf1, 0xd0, 0x9c, 0x06, 0xd0, 0xfd, 0xdf, 0x58, 0x84, + 0xa9, 0x50, 0x0a, 0xfa, 0xad, 0xa4, 0x8e, 0x42, 0x1c, 0x1f, 0x23, 0x01, 0x21, 0x91, 0x8f, 0x45, + 0x5c, 0xf1, 0xe9, 0x03, 0xf1, 0x59, 0x89, 0x01, 0x51, 0xb4, 0x5a, 0xdb, 0xfa, 0x1e, 0x6e, 0x27, + 0x04, 0xc2, 0xfb, 0x2d, 0x00, 0xc2, 0x27, 0x94, 0xd8, 0x7d, 0x85, 0xe3, 0x63, 0x14, 0xee, 0x2b, + 0x71, 0x04, 0xc7, 0x12, 0x24, 0xca, 0xed, 0x7a, 0xd8, 0x7a, 0xe6, 0xdd, 0xa2, 0x62, 0x0d, 0x4c, + 0x36, 0x29, 0x6c, 0xb2, 0x0d, 0xd5, 0xb1, 0xd0, 0xb2, 0x07, 0xe9, 0x74, 0x36, 0x8d, 0x8e, 0xa5, + 0x6f, 0xd1, 0xe9, 0x0b, 0xfd, 0x1d, 0x32, 0x9c, 0xf0, 0xa3, 0xa7, 0xd4, 0xb1, 0xb3, 0xa8, 0xd9, + 0xdb, 0x17, 0x4c, 0xcd, 0x6a, 0x87, 0xaf, 0xfe, 0x1f, 0xfa, 0xc4, 0x1f, 0xfa, 0x4c, 0x18, 0x84, + 0x2a, 0x0f, 0x42, 0x5f, 0x57, 0xd1, 0xbe, 0xbc, 0x8c, 0xa2, 0x93, 0x89, 0xf5, 0x66, 0xfd, 0x1d, + 0x1f, 0xac, 0x1f, 0xe1, 0xc0, 0xba, 0x6b, 0x58, 0x16, 0xd3, 0x07, 0xee, 0x37, 0xe8, 0x88, 0x10, + 0xf2, 0x6a, 0xbe, 0x5f, 0x14, 0xb0, 0x08, 0xaf, 0x56, 0x39, 0xd2, 0xab, 0x75, 0xa8, 0x31, 0x62, + 0xa0, 0x47, 0x72, 0xba, 0x63, 0xc4, 0x21, 0x7a, 0x1b, 0xbf, 0x45, 0x86, 0x02, 0x09, 0x9f, 0x15, + 0xf2, 0xf8, 0x46, 0x0f, 0x88, 0xa2, 0xb3, 0xcf, 0xbb, 0x7c, 0x22, 0xa9, 0x77, 0x39, 0x7a, 0x73, + 0x52, 0x1f, 0xf2, 0x5e, 0x6e, 0x47, 0x82, 0x58, 0x22, 0x17, 0xf1, 0x01, 0x1c, 0xa4, 0x0f, 0xda, + 0x2f, 0xc8, 0x00, 0x6e, 0x83, 0x66, 0x67, 0x1f, 0x9e, 0x21, 0x0a, 0xd7, 0x2d, 0x61, 0xbf, 0x7a, + 0x17, 0xa8, 0x13, 0x3d, 0x40, 0x51, 0x8a, 0xc1, 0xa9, 0x8a, 0x47, 0x92, 0xfa, 0x56, 0x06, 0x5c, + 0x8d, 0x04, 0x96, 0x44, 0xde, 0x96, 0x91, 0x65, 0xa7, 0x0f, 0xc8, 0x7f, 0x97, 0x20, 0xd7, 0x30, + 0xeb, 0xd8, 0x39, 0xb8, 0x29, 0x90, 0xf8, 0xd8, 0x3e, 0x29, 0x77, 0x14, 0xc7, 0xf6, 0xfb, 0x11, + 0x1a, 0x43, 0x34, 0x32, 0x09, 0x66, 0x1a, 0x66, 0xc9, 0x5f, 0x9c, 0x12, 0xf7, 0x55, 0x15, 0xbf, + 0x4f, 0xd9, 0xaf, 0x60, 0x50, 0xcc, 0x81, 0xee, 0x53, 0x1e, 0x4c, 0x2f, 0x7d, 0xb9, 0xdd, 0x0e, + 0x47, 0x37, 0x8c, 0xb6, 0xa9, 0xe2, 0xb6, 0xc9, 0x56, 0xba, 0x15, 0x05, 0xb2, 0xbb, 0x46, 0xdb, + 0x24, 0x2c, 0xe7, 0x54, 0xf2, 0xec, 0xa6, 0x59, 0xb8, 0x6d, 0x32, 0xdf, 0x00, 0xf2, 0x8c, 0xbe, + 0x2c, 0x43, 0xd6, 0xfd, 0x57, 0x5c, 0xd4, 0x6f, 0x91, 0x13, 0x06, 0x22, 0x70, 0xc9, 0x8f, 0xc4, + 0x12, 0xba, 0x3b, 0xb4, 0xf6, 0x4f, 0x3d, 0x58, 0xaf, 0x8b, 0x2a, 0x2f, 0x24, 0x8a, 0x60, 0xcd, + 0x5f, 0x39, 0x05, 0x13, 0x17, 0x3a, 0x66, 0xeb, 0x62, 0x70, 0x5e, 0x9e, 0xbd, 0x2a, 0x37, 0x41, + 0xce, 0xd2, 0x8c, 0x2d, 0xcc, 0xf6, 0x14, 0x8e, 0xf7, 0xf4, 0x85, 0xc4, 0xeb, 0x45, 0xa5, 0x59, + 0xd0, 0x9b, 0x93, 0x84, 0x40, 0xe8, 0x53, 0xf9, 0x64, 0xfa, 0xb0, 0x38, 0xc4, 0xc9, 0xb2, 0x02, + 0xcc, 0x94, 0x8a, 0xf4, 0xe6, 0xf2, 0xb5, 0xda, 0xb9, 0x72, 0x41, 0x26, 0x30, 0xbb, 0x32, 0x49, + 0x11, 0x66, 0x97, 0xfc, 0xf7, 0x2d, 0xcc, 0x7d, 0x2a, 0x7f, 0x18, 0x30, 0x7f, 0x54, 0x82, 0xd9, + 0x55, 0xdd, 0x76, 0xa2, 0xbc, 0xfd, 0x63, 0xa2, 0xe7, 0xbe, 0x20, 0xa9, 0xa9, 0xcc, 0x95, 0x23, + 0x1c, 0x36, 0x37, 0x91, 0x39, 0x1c, 0x57, 0xc4, 0x78, 0x8e, 0xa5, 0x10, 0x0e, 0xe8, 0x6d, 0xc3, + 0xc2, 0x92, 0x4c, 0x6c, 0x28, 0x05, 0x85, 0x8c, 0xdf, 0x50, 0x8a, 0x2c, 0x3b, 0x7d, 0xf9, 0x7e, + 0x59, 0x82, 0x63, 0x6e, 0xf1, 0x71, 0xcb, 0x52, 0xd1, 0x62, 0x1e, 0xb8, 0x2c, 0x95, 0x78, 0x65, + 0x7c, 0x1f, 0x2f, 0xa3, 0x58, 0x19, 0x1f, 0x44, 0x74, 0xcc, 0x62, 0x8e, 0x58, 0x86, 0x1d, 0x24, + 0xe6, 0x98, 0x65, 0xd8, 0xe1, 0xc5, 0x1c, 0xbf, 0x14, 0x3b, 0xa4, 0x98, 0x0f, 0x6d, 0x81, 0xf5, + 0xd5, 0xb2, 0x2f, 0xe6, 0xc8, 0xb5, 0x8d, 0x18, 0x31, 0x27, 0x3e, 0xb1, 0x8b, 0xde, 0x3a, 0xa4, + 0xe0, 0x47, 0xbc, 0xbe, 0x31, 0x0c, 0x4c, 0x87, 0xb8, 0xc6, 0xf1, 0x9b, 0x32, 0xcc, 0x31, 0x2e, + 0xfa, 0x4f, 0x99, 0x63, 0x30, 0x4a, 0x3c, 0x65, 0x4e, 0x7c, 0x06, 0x88, 0xe7, 0x6c, 0xfc, 0x67, + 0x80, 0x62, 0xcb, 0x4f, 0x1f, 0x9c, 0xaf, 0x64, 0xe1, 0xa4, 0xcb, 0xc2, 0x9a, 0xd9, 0xd6, 0x37, + 0x2f, 0x53, 0x2e, 0xce, 0x69, 0x9d, 0x5d, 0x6c, 0xa3, 0x77, 0x49, 0xa2, 0x28, 0xfd, 0x27, 0x00, + 0xb3, 0x8b, 0x2d, 0x1a, 0x48, 0x8d, 0x01, 0x75, 0x67, 0x54, 0x65, 0xf7, 0x97, 0xe4, 0x5f, 0x26, + 0x53, 0xf3, 0x88, 0xa8, 0x21, 0x7a, 0xae, 0x55, 0x38, 0xe5, 0x7f, 0xe9, 0x75, 0xf0, 0xc8, 0xec, + 0x77, 0xf0, 0xb8, 0x11, 0x64, 0xad, 0xdd, 0xf6, 0xa1, 0xea, 0xdd, 0xcc, 0x26, 0x65, 0xaa, 0x6e, + 0x16, 0x37, 0xa7, 0x8d, 0x83, 0xa3, 0x79, 0x11, 0x39, 0x6d, 0xec, 0x28, 0xf3, 0x90, 0xa7, 0x37, + 0x2f, 0xfb, 0x2b, 0xfa, 0xfd, 0x33, 0xb3, 0x5c, 0xbc, 0x69, 0x57, 0xe3, 0xd5, 0xf0, 0xf6, 0x44, + 0x92, 0xe9, 0xd7, 0x4f, 0x07, 0x76, 0xb2, 0xca, 0x29, 0xd8, 0xd3, 0x87, 0xa6, 0x3c, 0x9e, 0xdd, + 0xb0, 0x62, 0xb7, 0xdb, 0xb9, 0xdc, 0x60, 0xc1, 0x57, 0x12, 0xed, 0x86, 0x85, 0x62, 0xb8, 0x48, + 0xbd, 0x31, 0x5c, 0x92, 0xef, 0x86, 0x71, 0x7c, 0x8c, 0x62, 0x37, 0x2c, 0x8e, 0x60, 0xfa, 0xa2, + 0xfd, 0x6a, 0x8e, 0x5a, 0xcd, 0x2c, 0xb6, 0xff, 0xb3, 0xfb, 0x7b, 0x56, 0x03, 0xef, 0xec, 0xd2, + 0x2f, 0xec, 0x7f, 0xec, 0x9d, 0x26, 0xca, 0x93, 0x21, 0xbf, 0x69, 0x5a, 0x3b, 0x9a, 0xb7, 0x71, + 0xdf, 0x7b, 0x52, 0x84, 0xc5, 0xd3, 0x5f, 0x22, 0x79, 0x54, 0x96, 0xd7, 0x9d, 0x8f, 0x3c, 0x53, + 0xef, 0xb2, 0xa8, 0x8b, 0xee, 0xa3, 0x72, 0x3d, 0xcc, 0xb2, 0xe0, 0x8b, 0x55, 0x6c, 0x3b, 0xb8, + 0xcd, 0x22, 0x56, 0xf0, 0x89, 0xca, 0x59, 0x98, 0x61, 0x09, 0x4b, 0x7a, 0x07, 0xdb, 0x2c, 0x68, + 0x05, 0x97, 0xa6, 0x9c, 0x84, 0xbc, 0x6e, 0xdf, 0x6b, 0x9b, 0x06, 0xf1, 0xff, 0x9f, 0x54, 0xd9, + 0x9b, 0x72, 0x23, 0x1c, 0x65, 0xf9, 0x7c, 0x63, 0x95, 0x1e, 0xd8, 0xe9, 0x4d, 0x76, 0x55, 0xcb, + 0x30, 0xd7, 0x2d, 0x73, 0xcb, 0xc2, 0xb6, 0x4d, 0x4e, 0x4d, 0x4d, 0xaa, 0xa1, 0x14, 0xe5, 0xa9, + 0x70, 0x25, 0xfb, 0xc5, 0x8f, 0x0e, 0xe9, 0x1d, 0x01, 0xa2, 0xce, 0x3d, 0x51, 0x9f, 0xd1, 0xa7, + 0x86, 0x99, 0x92, 0x24, 0xbe, 0x21, 0xc1, 0xc5, 0x77, 0xb7, 0xd5, 0xc2, 0xb8, 0xcd, 0xce, 0x4c, + 0x79, 0xaf, 0x09, 0xef, 0x4e, 0x48, 0x3c, 0x81, 0x39, 0xa4, 0xcb, 0x13, 0xde, 0x7f, 0x02, 0xf2, + 0xf4, 0x22, 0x32, 0xf4, 0xc2, 0xb9, 0xbe, 0x6a, 0x3e, 0xc7, 0xab, 0xf9, 0x06, 0xcc, 0x18, 0xa6, + 0x5b, 0xdc, 0xba, 0x66, 0x69, 0x3b, 0x76, 0xdc, 0xfa, 0x24, 0xa5, 0xeb, 0x0f, 0x46, 0xd5, 0xd0, + 0x6f, 0x2b, 0x47, 0x54, 0x8e, 0x8c, 0xf2, 0x7f, 0xc0, 0xd1, 0x0b, 0x2c, 0xb6, 0x80, 0xcd, 0x28, + 0x4b, 0xd1, 0xde, 0x7b, 0x3d, 0x94, 0x17, 0xf8, 0x3f, 0x57, 0x8e, 0xa8, 0xbd, 0xc4, 0x94, 0x1f, + 0x83, 0x39, 0xf7, 0xb5, 0x6d, 0x5e, 0xf2, 0x18, 0x97, 0xa3, 0x4d, 0x98, 0x1e, 0xf2, 0x6b, 0xdc, + 0x8f, 0x2b, 0x47, 0xd4, 0x1e, 0x52, 0x4a, 0x0d, 0x60, 0xdb, 0xd9, 0xe9, 0x30, 0xc2, 0xd9, 0x68, + 0x95, 0xec, 0x21, 0xbc, 0xe2, 0xff, 0xb4, 0x72, 0x44, 0x0d, 0x91, 0x50, 0x56, 0x61, 0xca, 0x79, + 0xd0, 0x61, 0xf4, 0x72, 0xd1, 0xdb, 0xe6, 0x3d, 0xf4, 0x1a, 0xde, 0x3f, 0x2b, 0x47, 0xd4, 0x80, + 0x80, 0x52, 0x81, 0xc9, 0xee, 0x05, 0x46, 0x2c, 0xdf, 0x27, 0x4e, 0x7d, 0x7f, 0x62, 0xeb, 0x17, + 0x7c, 0x5a, 0xfe, 0xef, 0x2e, 0x63, 0x2d, 0x7b, 0x8f, 0xd1, 0x9a, 0x10, 0x66, 0xac, 0xe4, 0xfd, + 0xe3, 0x32, 0xe6, 0x13, 0x50, 0x2a, 0x30, 0x65, 0x1b, 0x5a, 0xd7, 0xde, 0x36, 0x1d, 0xfb, 0xd4, + 0x64, 0x8f, 0x87, 0x65, 0x34, 0xb5, 0x3a, 0xfb, 0x47, 0x0d, 0xfe, 0x56, 0x9e, 0x0c, 0x27, 0x76, + 0xc9, 0x85, 0xee, 0xe5, 0x07, 0x75, 0xdb, 0xd1, 0x8d, 0x2d, 0x2f, 0x3a, 0x2d, 0xed, 0xa7, 0xfa, + 0x7f, 0x54, 0xe6, 0xd9, 0x59, 0x2b, 0x20, 0x6d, 0x13, 0xf5, 0x6e, 0xf3, 0xd1, 0x62, 0x43, 0x47, + 0xac, 0x9e, 0x06, 0x59, 0xf7, 0x13, 0xe9, 0xd7, 0xe6, 0xfa, 0x2f, 0x21, 0xf6, 0xea, 0x0e, 0x69, + 0xc0, 0xee, 0x4f, 0x3d, 0x5d, 0xe3, 0xcc, 0xbe, 0xae, 0xf1, 0x0c, 0x4c, 0xeb, 0xf6, 0x9a, 0xbe, + 0x45, 0xed, 0x32, 0xe6, 0x49, 0x1f, 0x4e, 0xa2, 0xf3, 0xd8, 0x2a, 0xbe, 0x44, 0xef, 0xde, 0x38, + 0xea, 0xcd, 0x63, 0xbd, 0x14, 0x74, 0x03, 0xcc, 0x84, 0x1b, 0x19, 0xbd, 0xcd, 0x54, 0x0f, 0xac, + 0x3a, 0xf6, 0x86, 0xae, 0x87, 0x39, 0x5e, 0xa7, 0x43, 0x83, 0x97, 0xec, 0x75, 0x85, 0xe8, 0x3a, + 0x38, 0xda, 0xd3, 0xb0, 0xbc, 0x68, 0x25, 0x99, 0x20, 0x5a, 0xc9, 0x19, 0x80, 0x40, 0x8b, 0xfb, + 0x92, 0xb9, 0x16, 0xa6, 0x7c, 0xbd, 0xec, 0x9b, 0xe1, 0x8b, 0x19, 0x98, 0xf4, 0x94, 0xad, 0x5f, + 0x06, 0x77, 0xe4, 0x32, 0x42, 0x5b, 0x13, 0x6c, 0x02, 0xcf, 0xa5, 0xb9, 0x23, 0x54, 0xe0, 0x10, + 0xdc, 0xd0, 0x9d, 0x8e, 0x77, 0xa8, 0xae, 0x37, 0x59, 0x59, 0x07, 0xd0, 0x09, 0x46, 0x8d, 0xe0, + 0x94, 0xdd, 0xad, 0x09, 0xda, 0x03, 0xd5, 0x87, 0x10, 0x8d, 0xb3, 0x3f, 0xc0, 0x8e, 0xc0, 0x4d, + 0x41, 0x8e, 0x86, 0x68, 0x3f, 0xa2, 0xcc, 0x01, 0x94, 0x9f, 0xb1, 0x5e, 0x56, 0x2b, 0xe5, 0x6a, + 0xa9, 0x5c, 0xc8, 0xa0, 0x17, 0x4b, 0x30, 0xe5, 0x37, 0x82, 0xbe, 0x95, 0x2c, 0x33, 0xd5, 0x1a, + 0x78, 0x61, 0xe4, 0xfe, 0x46, 0x15, 0x56, 0xb2, 0xa7, 0xc2, 0x95, 0xbb, 0x36, 0x5e, 0xd2, 0x2d, + 0xdb, 0x51, 0xcd, 0x4b, 0x4b, 0xa6, 0xe5, 0xc7, 0x63, 0x66, 0xb1, 0x51, 0xa3, 0x3e, 0xbb, 0xb6, + 0x4a, 0x1b, 0x93, 0xe3, 0x56, 0xd8, 0x62, 0x6b, 0xce, 0x41, 0x82, 0x4b, 0xd7, 0xb1, 0x34, 0xc3, + 0xee, 0x9a, 0x36, 0x56, 0xcd, 0x4b, 0x76, 0xd1, 0x68, 0x97, 0xcc, 0xce, 0xee, 0x8e, 0x61, 0x33, + 0x6b, 0x23, 0xea, 0xb3, 0x2b, 0x1d, 0x72, 0x1d, 0xec, 0x1c, 0x40, 0xa9, 0xb6, 0xba, 0x5a, 0x2e, + 0x35, 0x2a, 0xb5, 0x6a, 0xe1, 0x88, 0x2b, 0xad, 0x46, 0x71, 0x61, 0xd5, 0x95, 0xce, 0x8f, 0xc3, + 0xa4, 0xd7, 0xa6, 0x59, 0x80, 0x95, 0x8c, 0x17, 0x60, 0x45, 0x29, 0xc2, 0xa4, 0xd7, 0xca, 0xd9, + 0x88, 0xf0, 0xd8, 0xde, 0x03, 0xb5, 0x3b, 0x9a, 0xe5, 0x10, 0x4f, 0x6c, 0x8f, 0xc8, 0x82, 0x66, + 0x63, 0xd5, 0xff, 0xed, 0xec, 0x13, 0x18, 0x07, 0x0a, 0xcc, 0x15, 0x57, 0x57, 0x9b, 0x35, 0xb5, + 0x59, 0xad, 0x35, 0x56, 0x2a, 0xd5, 0x65, 0x3a, 0x42, 0x56, 0x96, 0xab, 0x35, 0xb5, 0x4c, 0x07, + 0xc8, 0x7a, 0x21, 0x43, 0xaf, 0x23, 0x5e, 0x98, 0x84, 0x7c, 0x97, 0x48, 0x17, 0x7d, 0x4e, 0x4e, + 0x78, 0x92, 0xde, 0xc7, 0x29, 0xe2, 0xc2, 0x54, 0xce, 0x9b, 0x5d, 0xea, 0x73, 0xda, 0xf4, 0x2c, + 0xcc, 0x50, 0x2b, 0xd1, 0x26, 0x1b, 0x03, 0x04, 0x39, 0x59, 0xe5, 0xd2, 0xd0, 0x07, 0xa5, 0x04, + 0xc7, 0xeb, 0xfb, 0x72, 0x94, 0xcc, 0xb8, 0xf8, 0xf3, 0xcc, 0x70, 0x17, 0x1a, 0x54, 0xaa, 0x8d, + 0xb2, 0x5a, 0x2d, 0xae, 0xb2, 0x2c, 0xb2, 0x72, 0x0a, 0x8e, 0x57, 0x6b, 0x2c, 0x5a, 0x60, 0xbd, + 0xd9, 0xa8, 0x35, 0x2b, 0x6b, 0xeb, 0x35, 0xb5, 0x51, 0xc8, 0x29, 0x27, 0x41, 0xa1, 0xcf, 0xcd, + 0x4a, 0xbd, 0x59, 0x2a, 0x56, 0x4b, 0xe5, 0xd5, 0xf2, 0x62, 0x21, 0xaf, 0x3c, 0x0e, 0xae, 0xa3, + 0x17, 0xe4, 0xd4, 0x96, 0x9a, 0x6a, 0xed, 0x7c, 0xdd, 0x45, 0x50, 0x2d, 0xaf, 0x16, 0x5d, 0x45, + 0x0a, 0x5d, 0x4b, 0x3c, 0xa1, 0x5c, 0x01, 0x47, 0xc9, 0x95, 0xe3, 0xab, 0xb5, 0xe2, 0x22, 0x2b, + 0x6f, 0x52, 0xb9, 0x06, 0x4e, 0x55, 0xaa, 0xf5, 0x8d, 0xa5, 0xa5, 0x4a, 0xa9, 0x52, 0xae, 0x36, + 0x9a, 0xeb, 0x65, 0x75, 0xad, 0x52, 0xaf, 0xbb, 0xff, 0x16, 0xa6, 0xc8, 0xa5, 0xaf, 0xb4, 0xcf, + 0x44, 0xef, 0x94, 0x61, 0xf6, 0x9c, 0xd6, 0xd1, 0xdd, 0x81, 0x82, 0xdc, 0x06, 0xdd, 0x73, 0x10, + 0xc5, 0x21, 0xb7, 0x46, 0x33, 0x57, 0x76, 0xf2, 0x82, 0x7e, 0x5a, 0x4e, 0x78, 0x10, 0x85, 0x01, + 0x41, 0x4b, 0x9c, 0xe7, 0x4a, 0x8b, 0x98, 0x36, 0xbd, 0x52, 0x4a, 0x70, 0x10, 0x45, 0x9c, 0x7c, + 0x32, 0xf0, 0x5f, 0x32, 0x2a, 0xf0, 0x0b, 0x30, 0xb3, 0x51, 0x2d, 0x6e, 0x34, 0x56, 0x6a, 0x6a, + 0xe5, 0x47, 0x49, 0x1c, 0xf3, 0x59, 0x98, 0x5a, 0xaa, 0xa9, 0x0b, 0x95, 0xc5, 0xc5, 0x72, 0xb5, + 0x90, 0x53, 0xae, 0x84, 0x2b, 0xea, 0x65, 0xf5, 0x5c, 0xa5, 0x54, 0x6e, 0x6e, 0x54, 0x8b, 0xe7, + 0x8a, 0x95, 0x55, 0xd2, 0x47, 0xe4, 0x63, 0x6e, 0xb2, 0x9e, 0x40, 0x3f, 0x99, 0x05, 0xa0, 0x55, + 0x27, 0xd7, 0xf8, 0x84, 0xee, 0x3b, 0xfe, 0x8b, 0xa4, 0x93, 0x86, 0x80, 0x4c, 0x44, 0xfb, 0xad, + 0xc0, 0xa4, 0xc5, 0x3e, 0xb0, 0x85, 0x99, 0x41, 0x74, 0xe8, 0xa3, 0x47, 0x4d, 0xf5, 0x7f, 0x47, + 0xef, 0x4a, 0x32, 0x47, 0x88, 0x64, 0x2c, 0x19, 0x92, 0x4b, 0xa3, 0x01, 0x12, 0x3d, 0x3f, 0x03, + 0x73, 0x7c, 0xc5, 0xdc, 0x4a, 0x10, 0x63, 0x4a, 0xac, 0x12, 0xfc, 0xcf, 0x21, 0x23, 0xeb, 0xec, + 0x93, 0xd8, 0x70, 0x0a, 0x5e, 0xcb, 0xa4, 0x67, 0xca, 0x3d, 0x8b, 0xa5, 0x90, 0x71, 0x99, 0x77, + 0x8d, 0x8e, 0x82, 0xa4, 0x4c, 0x80, 0xdc, 0x78, 0xd0, 0x29, 0xc8, 0xe8, 0x8b, 0x32, 0xcc, 0x72, + 0x17, 0x2a, 0xa3, 0x57, 0x66, 0x44, 0x2e, 0x3b, 0x0d, 0x5d, 0xd5, 0x9c, 0x39, 0xe8, 0x55, 0xcd, + 0x67, 0x6f, 0x81, 0x09, 0x96, 0x46, 0xe4, 0x5b, 0xab, 0xba, 0xa6, 0xc0, 0x51, 0x98, 0x5e, 0x2e, + 0x37, 0x9a, 0xf5, 0x46, 0x51, 0x6d, 0x94, 0x17, 0x0b, 0x19, 0x77, 0xe0, 0x2b, 0xaf, 0xad, 0x37, + 0xee, 0x2f, 0x48, 0xc9, 0x7d, 0xfb, 0x7a, 0x19, 0x19, 0xb3, 0x6f, 0x5f, 0x5c, 0xf1, 0xe9, 0xcf, + 0x55, 0x3f, 0x21, 0x43, 0x81, 0x72, 0x50, 0x7e, 0xb0, 0x8b, 0x2d, 0x1d, 0x1b, 0x2d, 0x8c, 0x2e, + 0x8a, 0xc4, 0x12, 0xdd, 0x17, 0x65, 0x8f, 0xf4, 0xe7, 0x21, 0x2b, 0x91, 0xbe, 0xf4, 0x18, 0xd8, + 0xd9, 0x7d, 0x06, 0xf6, 0xc7, 0x93, 0x3a, 0xf7, 0xf5, 0xb2, 0x3b, 0x12, 0xc8, 0x3e, 0x92, 0xc4, + 0xb9, 0x6f, 0x00, 0x07, 0x63, 0x09, 0x11, 0x1c, 0x31, 0xfe, 0x16, 0x64, 0xf4, 0x3c, 0x19, 0x8e, + 0x2e, 0x6a, 0x0e, 0x5e, 0xb8, 0xdc, 0xf0, 0x2e, 0x3c, 0x8c, 0xb8, 0xa4, 0x38, 0xb3, 0xef, 0x92, + 0xe2, 0xe0, 0xce, 0x44, 0xa9, 0xe7, 0xce, 0x44, 0xf4, 0xb6, 0xa4, 0xc7, 0x01, 0x7b, 0x78, 0x18, + 0x59, 0x1c, 0xdf, 0x64, 0xc7, 0xfc, 0xe2, 0xb9, 0x48, 0xbf, 0x81, 0xbd, 0x69, 0x0a, 0x0a, 0x94, + 0x95, 0x90, 0xff, 0xda, 0xaf, 0xb2, 0x7b, 0xbd, 0x9b, 0x09, 0xc2, 0x05, 0x7a, 0x01, 0x18, 0x24, + 0x3e, 0x00, 0x03, 0xb7, 0x1c, 0x2a, 0xf7, 0xfa, 0x1c, 0x24, 0xed, 0x0c, 0x43, 0xce, 0x6a, 0xd1, + 0x11, 0x5a, 0xd3, 0xeb, 0x0c, 0x63, 0x8b, 0x1f, 0xcf, 0xdd, 0xb3, 0xec, 0x86, 0xc8, 0xb2, 0x28, + 0x32, 0xf1, 0x57, 0x6c, 0x27, 0xf5, 0x5c, 0xe6, 0x9c, 0x05, 0x63, 0xee, 0x9d, 0x4e, 0xcf, 0x73, + 0x79, 0x10, 0x07, 0xe9, 0xa3, 0xf0, 0x1d, 0x09, 0xb2, 0x75, 0xd3, 0x72, 0x46, 0x85, 0x41, 0xd2, + 0xdd, 0xd6, 0x90, 0x04, 0xea, 0xd1, 0x73, 0xce, 0xf4, 0x76, 0x5b, 0xe3, 0xcb, 0x1f, 0x43, 0xc4, + 0xc5, 0xa3, 0x30, 0x47, 0x39, 0xf1, 0xaf, 0x23, 0xf9, 0xb6, 0x44, 0xfb, 0xab, 0xfb, 0x44, 0x11, + 0x39, 0x0b, 0x33, 0xa1, 0xdd, 0x4e, 0x0f, 0x14, 0x2e, 0x0d, 0xbd, 0x36, 0x8c, 0xcb, 0x22, 0x8f, + 0x4b, 0xbf, 0x19, 0xb7, 0x7f, 0xa3, 0xc7, 0xa8, 0x7a, 0xa6, 0x24, 0xc1, 0x1b, 0x63, 0x0a, 0x4f, + 0x1f, 0x91, 0x87, 0x64, 0xc8, 0x33, 0x6f, 0xb3, 0x91, 0x22, 0x90, 0xb4, 0x65, 0xf8, 0x42, 0x10, + 0xf3, 0x4a, 0x93, 0x47, 0xdd, 0x32, 0xe2, 0xcb, 0x4f, 0x1f, 0x87, 0xef, 0x32, 0x37, 0xca, 0xe2, + 0x9e, 0xa6, 0x77, 0xb4, 0x0b, 0x9d, 0x04, 0x41, 0x93, 0x3f, 0x98, 0xf0, 0xe0, 0x98, 0x5f, 0x55, + 0xae, 0xbc, 0x08, 0x89, 0xff, 0x10, 0x4c, 0x59, 0xfe, 0x92, 0xa4, 0x77, 0xae, 0xbe, 0xc7, 0x85, + 0x95, 0x7d, 0x57, 0x83, 0x9c, 0x89, 0x4e, 0x89, 0x09, 0xf1, 0x33, 0x96, 0x53, 0x2d, 0xd3, 0xc5, + 0x76, 0x7b, 0x09, 0x6b, 0xce, 0xae, 0x85, 0xdb, 0x89, 0x86, 0x08, 0x5e, 0x44, 0x53, 0x61, 0x49, + 0x70, 0x61, 0x0b, 0x57, 0x79, 0x74, 0x9e, 0x32, 0xa0, 0x37, 0xf0, 0x78, 0x19, 0x49, 0x97, 0xf4, + 0x46, 0x1f, 0x92, 0x1a, 0x07, 0xc9, 0xd3, 0x86, 0x63, 0x22, 0x7d, 0x40, 0x7e, 0x5d, 0x86, 0x39, + 0x6a, 0x27, 0x8c, 0x1a, 0x93, 0xdf, 0x4f, 0xe8, 0x9d, 0x12, 0xba, 0xf0, 0x29, 0xcc, 0xce, 0x48, + 0x60, 0x49, 0xe2, 0xcb, 0x22, 0xc6, 0x47, 0xfa, 0xc8, 0x7c, 0x2a, 0x0f, 0x10, 0xf2, 0x38, 0xfc, + 0x60, 0x3e, 0x08, 0x21, 0x88, 0xde, 0xcc, 0xe6, 0x1f, 0x75, 0x2e, 0x9e, 0x75, 0xc8, 0x9b, 0xd0, + 0xdf, 0x90, 0xe2, 0x13, 0x85, 0x46, 0x95, 0x3f, 0x4f, 0x68, 0xf3, 0x32, 0x7f, 0xbf, 0x81, 0x83, + 0xfb, 0x90, 0xbd, 0xdc, 0x87, 0x12, 0x18, 0xbf, 0x83, 0x58, 0x49, 0x86, 0xda, 0xea, 0x10, 0x33, + 0xfb, 0x53, 0x70, 0x5c, 0x2d, 0x17, 0x17, 0x6b, 0xd5, 0xd5, 0xfb, 0xc3, 0xb7, 0xff, 0x14, 0xe4, + 0xf0, 0xe4, 0x24, 0x15, 0xd8, 0x5e, 0x95, 0xb0, 0x0f, 0xe4, 0x65, 0x15, 0x7b, 0xb7, 0xfd, 0x47, + 0x12, 0xf4, 0x6a, 0x02, 0x64, 0x0f, 0x13, 0x85, 0x87, 0x20, 0xd4, 0x8c, 0x7e, 0x56, 0x86, 0x82, + 0x3b, 0x1e, 0x52, 0x2e, 0xd9, 0x35, 0x6f, 0x35, 0xde, 0x21, 0xb1, 0x4b, 0xf7, 0x9f, 0x02, 0x87, + 0x44, 0x2f, 0x41, 0xb9, 0x01, 0xe6, 0x5a, 0xdb, 0xb8, 0x75, 0xb1, 0x62, 0x78, 0xfb, 0xea, 0x74, + 0x13, 0xb6, 0x27, 0x95, 0x07, 0xe6, 0x3e, 0x1e, 0x18, 0x7e, 0x12, 0xcd, 0x0d, 0xd2, 0x61, 0xa6, + 0x22, 0x70, 0xf9, 0x23, 0x1f, 0x97, 0x2a, 0x87, 0xcb, 0x1d, 0x43, 0x51, 0x4d, 0x06, 0x4b, 0x75, + 0x08, 0x58, 0x10, 0x9c, 0xac, 0xad, 0x37, 0x2a, 0xb5, 0x6a, 0x73, 0xa3, 0x5e, 0x5e, 0x6c, 0x2e, + 0x78, 0xe0, 0xd4, 0x0b, 0x32, 0xfa, 0xaa, 0x04, 0x13, 0x94, 0x2d, 0x1b, 0x3d, 0x3e, 0x80, 0x60, + 0xa0, 0x27, 0x26, 0x7a, 0x93, 0x70, 0x5c, 0x05, 0x5f, 0x10, 0xac, 0x9c, 0x88, 0x7e, 0xea, 0xa9, + 0x30, 0x41, 0x41, 0xf6, 0x56, 0xb4, 0x4e, 0x47, 0xf4, 0x52, 0x8c, 0x8c, 0xea, 0x65, 0x17, 0x8c, + 0xb1, 0x30, 0x80, 0x8d, 0xf4, 0x47, 0x96, 0x67, 0x65, 0xa9, 0x19, 0x7c, 0x5e, 0x77, 0xb6, 0x89, + 0xa3, 0x26, 0xfa, 0x11, 0x91, 0xe5, 0xc5, 0x9b, 0x21, 0xb7, 0xe7, 0xe6, 0x1e, 0xe0, 0xf4, 0x4a, + 0x33, 0xa1, 0x97, 0x08, 0x87, 0xf4, 0xe4, 0xf4, 0xd3, 0xe7, 0x29, 0x02, 0x9c, 0x35, 0xc8, 0x76, + 0x74, 0xdb, 0x61, 0xe3, 0xc7, 0xed, 0x89, 0x08, 0x79, 0x0f, 0x15, 0x07, 0xef, 0xa8, 0x84, 0x0c, + 0xba, 0x17, 0x66, 0xc2, 0xa9, 0x02, 0x8e, 0xbf, 0xa7, 0x60, 0x82, 0x1d, 0x48, 0x63, 0x4b, 0xac, + 0xde, 0xab, 0xe0, 0xb2, 0xa6, 0x50, 0x6d, 0xd3, 0xd7, 0x81, 0xff, 0xf7, 0x28, 0x4c, 0xac, 0xe8, + 0xb6, 0x63, 0x5a, 0x97, 0xd1, 0x23, 0x19, 0x98, 0x38, 0x87, 0x2d, 0x5b, 0x37, 0x8d, 0x7d, 0xae, + 0x06, 0x67, 0x60, 0xba, 0x6b, 0xe1, 0x3d, 0xdd, 0xdc, 0xb5, 0x83, 0xc5, 0x99, 0x70, 0x92, 0x82, + 0x60, 0x52, 0xdb, 0x75, 0xb6, 0x4d, 0x2b, 0x88, 0x63, 0xe1, 0xbd, 0x2b, 0xa7, 0x01, 0xe8, 0x73, + 0x55, 0xdb, 0xc1, 0xcc, 0x81, 0x22, 0x94, 0xa2, 0x28, 0x90, 0x75, 0xf4, 0x1d, 0xcc, 0x02, 0xdb, + 0x92, 0x67, 0x57, 0xc0, 0x24, 0x48, 0x1c, 0x0b, 0xc6, 0x27, 0xab, 0xde, 0x2b, 0xfa, 0x8c, 0x0c, + 0xd3, 0xcb, 0xd8, 0x61, 0xac, 0xda, 0xe8, 0x05, 0x19, 0xa1, 0xbb, 0x24, 0xdc, 0x31, 0xb6, 0xa3, + 0xd9, 0xde, 0x7f, 0xfe, 0x12, 0x2c, 0x9f, 0x18, 0x44, 0xd9, 0x95, 0xc3, 0x21, 0xb6, 0x49, 0xc8, + 0x35, 0xa7, 0x42, 0xfd, 0x2f, 0x59, 0x66, 0xb6, 0x09, 0xb2, 0xff, 0x03, 0x7a, 0xbb, 0x24, 0x7a, + 0x5c, 0x99, 0xc9, 0x7e, 0x3e, 0x54, 0x9f, 0xc8, 0xee, 0x68, 0x72, 0x8f, 0xe5, 0xd8, 0x17, 0x3d, + 0x3d, 0x4c, 0x89, 0x91, 0x51, 0xfd, 0xdc, 0x82, 0x07, 0x9d, 0x07, 0x73, 0x92, 0xbe, 0x36, 0x7e, + 0x53, 0x86, 0xe9, 0xfa, 0xb6, 0x79, 0xc9, 0x93, 0xe3, 0x8f, 0x8b, 0x01, 0x7b, 0x0d, 0x4c, 0xed, + 0xf5, 0x80, 0x1a, 0x24, 0x44, 0xdf, 0xee, 0x8e, 0x9e, 0x2b, 0x27, 0x85, 0x29, 0xc4, 0xdc, 0xc8, + 0xef, 0x5e, 0x57, 0x9e, 0x02, 0x13, 0x8c, 0x6b, 0xb6, 0xe4, 0x12, 0x0f, 0xb0, 0x97, 0x39, 0x5c, + 0xc1, 0x2c, 0x5f, 0xc1, 0x64, 0xc8, 0x47, 0x57, 0x2e, 0x7d, 0xe4, 0xff, 0x44, 0x22, 0x61, 0x2e, + 0x3c, 0xe0, 0x4b, 0x23, 0x00, 0x1e, 0x7d, 0x2b, 0x23, 0xba, 0x30, 0xe9, 0x4b, 0xc0, 0xe7, 0xe0, + 0x40, 0xf7, 0xc4, 0x0c, 0x24, 0x97, 0xbe, 0x3c, 0x5f, 0x9c, 0x85, 0x99, 0x45, 0x7d, 0x73, 0xd3, + 0xef, 0x24, 0x7f, 0x49, 0xb0, 0x93, 0x8c, 0x76, 0x07, 0x70, 0xed, 0xdc, 0x5d, 0xcb, 0xc2, 0x86, + 0x57, 0x29, 0xd6, 0x9c, 0x7a, 0x52, 0x95, 0x1b, 0xe1, 0xa8, 0x37, 0x2e, 0x84, 0x3b, 0xca, 0x29, + 0xb5, 0x37, 0x19, 0x7d, 0x43, 0x78, 0x57, 0xcb, 0x93, 0x68, 0xb8, 0x4a, 0x11, 0x0d, 0xf0, 0x4e, + 0x98, 0xdd, 0xa6, 0xb9, 0xc9, 0xd4, 0xdf, 0xeb, 0x2c, 0x4f, 0xf6, 0x84, 0x11, 0x5e, 0xc3, 0xb6, + 0xad, 0x6d, 0x61, 0x95, 0xcf, 0xdc, 0xd3, 0x7c, 0xe5, 0x24, 0x97, 0x62, 0x89, 0x6d, 0x90, 0x09, + 0xd4, 0x64, 0x0c, 0xda, 0x71, 0x16, 0xb2, 0x4b, 0x7a, 0x07, 0xa3, 0x9f, 0x93, 0x60, 0x4a, 0xc5, + 0x2d, 0xd3, 0x68, 0xb9, 0x6f, 0x21, 0xe7, 0xa0, 0x7f, 0xca, 0x88, 0x5e, 0x06, 0xe9, 0xd2, 0x99, + 0xf7, 0x69, 0x44, 0xb4, 0x1b, 0xb1, 0x4b, 0x1f, 0x63, 0x49, 0x8d, 0xe1, 0xea, 0x0e, 0x77, 0xea, + 0xb1, 0xb9, 0xd9, 0x31, 0x35, 0x6e, 0xf1, 0xab, 0xd7, 0x14, 0xba, 0x09, 0x0a, 0xde, 0xe9, 0x11, + 0xd3, 0x59, 0xd7, 0x0d, 0xc3, 0x3f, 0x9e, 0xbc, 0x2f, 0x9d, 0xdf, 0xb7, 0x8d, 0x8d, 0xf0, 0x42, + 0xea, 0xce, 0x4a, 0x8f, 0xd0, 0xec, 0x1b, 0x60, 0xee, 0xc2, 0x65, 0x07, 0xdb, 0x2c, 0x17, 0x2b, + 0x36, 0xab, 0xf6, 0xa4, 0x86, 0xe2, 0x33, 0xc7, 0x45, 0x82, 0x89, 0x29, 0x30, 0x99, 0xa8, 0x57, + 0x86, 0x98, 0x01, 0x1e, 0x87, 0x42, 0xb5, 0xb6, 0x58, 0x26, 0xbe, 0x6a, 0x9e, 0xf7, 0xcf, 0x16, + 0xfa, 0x15, 0x19, 0x66, 0x88, 0x33, 0x89, 0x87, 0xc2, 0x75, 0x02, 0xf3, 0x11, 0xf4, 0x79, 0x61, + 0x3f, 0x36, 0x52, 0xe5, 0x70, 0x01, 0xd1, 0x82, 0xde, 0xd4, 0x3b, 0xbd, 0x82, 0xce, 0xa9, 0x3d, + 0xa9, 0x7d, 0x00, 0x91, 0xfb, 0x02, 0xf2, 0xbb, 0x42, 0xce, 0x6c, 0x83, 0xb8, 0x3b, 0x2c, 0x54, + 0x7e, 0x4f, 0x86, 0x69, 0x77, 0x92, 0xe2, 0x81, 0x52, 0xe3, 0x40, 0x31, 0x8d, 0xce, 0xe5, 0x60, + 0x59, 0xc4, 0x7b, 0x4d, 0xd4, 0x48, 0xfe, 0x4a, 0x78, 0xe6, 0x4e, 0x44, 0x14, 0xe2, 0x65, 0x4c, + 0xf8, 0xbd, 0x5b, 0x68, 0x3e, 0x3f, 0x80, 0xb9, 0xc3, 0x82, 0xef, 0xcb, 0x39, 0xc8, 0x6f, 0x74, + 0x09, 0x72, 0x2f, 0x91, 0x45, 0x62, 0x9d, 0xef, 0x3b, 0xc8, 0xe0, 0x9a, 0x59, 0x1d, 0xb3, 0xa5, + 0x75, 0xd6, 0x83, 0x13, 0x61, 0x41, 0x82, 0x72, 0x07, 0xf3, 0x6d, 0xa4, 0x07, 0xf5, 0x6e, 0x88, + 0x0d, 0x03, 0x4e, 0x64, 0x14, 0x3a, 0x34, 0x72, 0x33, 0x1c, 0x6b, 0xeb, 0xb6, 0x76, 0xa1, 0x83, + 0xcb, 0x46, 0xcb, 0xba, 0x4c, 0xc5, 0xc1, 0xa6, 0x55, 0xfb, 0x3e, 0x28, 0x77, 0x41, 0xce, 0x76, + 0x2e, 0x77, 0xe8, 0x3c, 0x31, 0x7c, 0xc6, 0x24, 0xb2, 0xa8, 0xba, 0x9b, 0x5d, 0xa5, 0x7f, 0x85, + 0x5d, 0x94, 0x26, 0x04, 0x6f, 0x82, 0x7e, 0x12, 0xe4, 0x4d, 0x4b, 0xdf, 0xd2, 0xe9, 0xcd, 0x3e, + 0x73, 0xfb, 0xa2, 0xdd, 0x51, 0x53, 0xa0, 0x46, 0xb2, 0xa8, 0x2c, 0xab, 0xf2, 0x14, 0x98, 0xd2, + 0x77, 0xb4, 0x2d, 0x7c, 0x9f, 0x6e, 0xd0, 0xb3, 0x80, 0x73, 0xb7, 0x9d, 0xda, 0x77, 0x7c, 0x86, + 0x7d, 0x57, 0x83, 0xac, 0xe8, 0xdd, 0x92, 0x68, 0x48, 0x1e, 0x52, 0x37, 0x0a, 0xea, 0x58, 0x6e, + 0xc4, 0x46, 0x2f, 0x17, 0x0a, 0x96, 0x13, 0xcd, 0x56, 0xfa, 0x83, 0xf7, 0xa7, 0x25, 0x98, 0x5c, + 0x34, 0x2f, 0x19, 0x44, 0xd1, 0x6f, 0x17, 0xb3, 0x75, 0xfb, 0x1c, 0x72, 0xe4, 0x2f, 0x9c, 0x8c, + 0x3d, 0xd1, 0x40, 0x6a, 0xeb, 0x15, 0x19, 0x01, 0x43, 0x6c, 0xcb, 0x11, 0xbc, 0x06, 0x30, 0xae, + 0x9c, 0xf4, 0xe5, 0xfa, 0xa7, 0x32, 0x64, 0x17, 0x2d, 0xb3, 0x8b, 0xde, 0x98, 0x49, 0xe0, 0xb2, + 0xd0, 0xb6, 0xcc, 0x6e, 0x83, 0xdc, 0xe3, 0x15, 0x1c, 0xe3, 0x08, 0xa7, 0x29, 0xb7, 0xc3, 0x64, + 0xd7, 0xb4, 0x75, 0xc7, 0x9b, 0x46, 0xcc, 0xdd, 0xf6, 0x98, 0xbe, 0xad, 0x79, 0x9d, 0x65, 0x52, + 0xfd, 0xec, 0x6e, 0xaf, 0x4d, 0x44, 0xe8, 0xca, 0xc5, 0x15, 0xa3, 0x77, 0x97, 0x59, 0x4f, 0x2a, + 0x7a, 0x61, 0x18, 0xc9, 0xa7, 0xf1, 0x48, 0x3e, 0xb6, 0x8f, 0x84, 0x2d, 0xb3, 0x3b, 0x92, 0x4d, + 0xc6, 0x97, 0xfa, 0xa8, 0x3e, 0x9d, 0x43, 0xf5, 0x26, 0xa1, 0x32, 0xd3, 0x47, 0xf4, 0xdd, 0x59, + 0x00, 0x62, 0x66, 0x6c, 0xb8, 0x13, 0x20, 0x31, 0x1b, 0xeb, 0x67, 0xb2, 0x21, 0x59, 0x16, 0x79, + 0x59, 0x3e, 0x3e, 0xc2, 0x8a, 0x21, 0xe4, 0x23, 0x24, 0x5a, 0x84, 0xdc, 0xae, 0xfb, 0x99, 0x49, + 0x54, 0x90, 0x04, 0x79, 0x55, 0xe9, 0x9f, 0xe8, 0x4f, 0x32, 0x90, 0x23, 0x09, 0xca, 0x69, 0x00, + 0x32, 0xb0, 0xd3, 0x03, 0x41, 0x19, 0x32, 0x84, 0x87, 0x52, 0x88, 0xb6, 0xea, 0x6d, 0xf6, 0x99, + 0x9a, 0xcc, 0x41, 0x82, 0xfb, 0x37, 0x19, 0xee, 0x09, 0x2d, 0x66, 0x00, 0x84, 0x52, 0xdc, 0xbf, + 0xc9, 0xdb, 0x2a, 0xde, 0xa4, 0x21, 0x96, 0xb3, 0x6a, 0x90, 0xe0, 0xff, 0xbd, 0xea, 0x5f, 0xcc, + 0xe5, 0xfd, 0x4d, 0x52, 0xdc, 0xc9, 0x30, 0x51, 0xcb, 0x85, 0xa0, 0x88, 0x3c, 0xc9, 0xd4, 0x9b, + 0x8c, 0x5e, 0xe5, 0xab, 0xcd, 0x22, 0xa7, 0x36, 0xb7, 0x26, 0x10, 0x6f, 0xfa, 0xca, 0xf3, 0xc5, + 0x1c, 0x4c, 0x55, 0xcd, 0x36, 0xd3, 0x9d, 0xd0, 0x84, 0xf1, 0x23, 0xb9, 0x44, 0x13, 0x46, 0x9f, + 0x46, 0x84, 0x82, 0xdc, 0xc3, 0x2b, 0x88, 0x18, 0x85, 0xb0, 0x7e, 0x28, 0x0b, 0x90, 0x27, 0xda, + 0xbb, 0xff, 0xc6, 0xa7, 0x38, 0x12, 0x44, 0xb4, 0x2a, 0xfb, 0xf3, 0x3f, 0x9c, 0x8e, 0xfd, 0x57, + 0xc8, 0x91, 0x0a, 0xc6, 0xec, 0xee, 0xf0, 0x15, 0x95, 0xe2, 0x2b, 0x2a, 0xc7, 0x57, 0x34, 0xdb, + 0x5b, 0xd1, 0x24, 0xeb, 0x00, 0x51, 0x1a, 0x92, 0xbe, 0x8e, 0xff, 0xe3, 0x04, 0x40, 0x55, 0xdb, + 0xd3, 0xb7, 0xe8, 0xee, 0xf0, 0x67, 0xbc, 0xf9, 0x0f, 0xdb, 0xc7, 0xfd, 0x85, 0xd0, 0x40, 0x78, + 0x3b, 0x4c, 0xb0, 0x71, 0x8f, 0x55, 0xe4, 0x5a, 0xae, 0x22, 0x01, 0x15, 0x6a, 0x96, 0x3e, 0xe8, + 0xa8, 0x5e, 0x7e, 0xee, 0x72, 0x5a, 0xa9, 0xe7, 0x72, 0xda, 0xfe, 0x7b, 0x10, 0x11, 0x57, 0xd6, + 0xa2, 0x77, 0x08, 0x7b, 0xf4, 0x87, 0xf8, 0x09, 0xd5, 0x28, 0xa2, 0x09, 0x3e, 0x09, 0x26, 0x4c, + 0x7f, 0x43, 0x5b, 0x8e, 0x5c, 0x07, 0xab, 0x18, 0x9b, 0xa6, 0xea, 0xe5, 0x14, 0xdc, 0xfc, 0x12, + 0xe2, 0x63, 0x2c, 0x87, 0x66, 0x4e, 0x2e, 0x7b, 0xe1, 0xaa, 0xdc, 0x7a, 0x9c, 0xd7, 0x9d, 0xed, + 0x55, 0xdd, 0xb8, 0x68, 0xa3, 0xff, 0x2c, 0x66, 0x41, 0x86, 0xf0, 0x97, 0x92, 0xe1, 0xcf, 0xc7, + 0xec, 0xa8, 0xf3, 0xa8, 0xdd, 0x15, 0x45, 0xa5, 0x3f, 0xb7, 0x11, 0x00, 0xde, 0x01, 0x79, 0xca, + 0x28, 0xeb, 0x44, 0xcf, 0x46, 0xe2, 0xe7, 0x53, 0x52, 0xd9, 0x1f, 0xe8, 0xed, 0x3e, 0x8e, 0xe7, + 0x38, 0x1c, 0x17, 0x0e, 0xc4, 0x59, 0xea, 0x90, 0x9e, 0x7d, 0x22, 0x4c, 0x30, 0x49, 0x2b, 0x73, + 0xe1, 0x56, 0x5c, 0x38, 0xa2, 0x00, 0xe4, 0xd7, 0xcc, 0x3d, 0xdc, 0x30, 0x0b, 0x19, 0xf7, 0xd9, + 0xe5, 0xaf, 0x61, 0x16, 0x24, 0xf4, 0xb2, 0x49, 0x98, 0xf4, 0xe3, 0x04, 0x7d, 0x5a, 0x82, 0x42, + 0xc9, 0xc2, 0x9a, 0x83, 0x97, 0x2c, 0x73, 0x87, 0xd6, 0x48, 0xdc, 0x3b, 0xf4, 0xd7, 0x85, 0x5d, + 0x3c, 0xfc, 0xf8, 0x3d, 0xbd, 0x85, 0x45, 0x60, 0x49, 0x17, 0x21, 0x25, 0x6f, 0x11, 0x12, 0xbd, + 0x41, 0xc8, 0xe5, 0x43, 0xb4, 0x94, 0xf4, 0x9b, 0xda, 0xc7, 0x25, 0xc8, 0x95, 0x3a, 0xa6, 0x81, + 0xc3, 0x47, 0x98, 0x06, 0x9e, 0x95, 0xe9, 0xbf, 0x13, 0x81, 0x9e, 0x25, 0x89, 0xda, 0x1a, 0x81, + 0x00, 0xdc, 0xb2, 0x05, 0x65, 0x2b, 0x36, 0x48, 0xc5, 0x92, 0x1e, 0x43, 0x1c, 0x26, 0x09, 0xa6, + 0x68, 0x5c, 0x9c, 0x62, 0xa7, 0x83, 0x1e, 0x13, 0x08, 0xb5, 0x4f, 0xac, 0x25, 0xf4, 0xbb, 0xc2, + 0x2e, 0xfa, 0x7e, 0xad, 0x7c, 0xda, 0x09, 0x02, 0x04, 0x25, 0xf3, 0x18, 0x17, 0xdb, 0x4b, 0x1b, + 0xc8, 0x50, 0xfa, 0xa2, 0xfe, 0x0b, 0xc9, 0x35, 0x00, 0x8c, 0x8b, 0xeb, 0x16, 0xde, 0xd3, 0xf1, + 0x25, 0x74, 0x75, 0x20, 0xec, 0xfd, 0x41, 0x3f, 0x5e, 0x27, 0xbc, 0x88, 0x13, 0x22, 0x19, 0xb9, + 0x95, 0x35, 0xdd, 0x09, 0x32, 0xb1, 0x5e, 0xbc, 0x37, 0x12, 0x4b, 0x88, 0x8c, 0x1a, 0xce, 0x2e, + 0xb8, 0x66, 0x13, 0xcd, 0x45, 0xfa, 0x82, 0x7d, 0xdf, 0x04, 0x4c, 0x6e, 0x18, 0x76, 0xb7, 0xa3, + 0xd9, 0xdb, 0xe8, 0xdb, 0x32, 0xe4, 0xe9, 0x3d, 0x63, 0xe8, 0x87, 0xb8, 0xd8, 0x02, 0x3f, 0xb1, + 0x8b, 0x2d, 0xcf, 0x05, 0x87, 0xbe, 0xf4, 0xbf, 0x06, 0x1d, 0xbd, 0x5b, 0x16, 0x9d, 0xa4, 0x7a, + 0x85, 0x86, 0x2e, 0x9c, 0xef, 0x7f, 0x9c, 0xbd, 0xab, 0xb7, 0x9c, 0x5d, 0xcb, 0xbf, 0x54, 0xfb, + 0x09, 0x62, 0x54, 0xd6, 0xe9, 0x5f, 0xaa, 0xff, 0x3b, 0xd2, 0x60, 0x82, 0x25, 0xee, 0xdb, 0x4e, + 0xda, 0x7f, 0xfe, 0xf6, 0x24, 0xe4, 0x35, 0xcb, 0xd1, 0x6d, 0x87, 0x6d, 0xb0, 0xb2, 0x37, 0xb7, + 0xbb, 0xa4, 0x4f, 0x1b, 0x56, 0xc7, 0x8b, 0x42, 0xe2, 0x27, 0xa0, 0xdf, 0x13, 0x9a, 0x3f, 0xc6, + 0xd7, 0x3c, 0x19, 0xe4, 0xf7, 0x0d, 0xb1, 0x46, 0x7d, 0x25, 0x5c, 0xa1, 0x16, 0x1b, 0xe5, 0x26, + 0x0d, 0x5a, 0xe1, 0xc7, 0xa7, 0x68, 0xa3, 0xb7, 0xc9, 0xa1, 0xf5, 0xbb, 0xcb, 0xdc, 0x18, 0xc1, + 0xa4, 0x18, 0x8c, 0x11, 0x7e, 0x42, 0xcc, 0x6e, 0x35, 0xb7, 0x08, 0x2b, 0x8b, 0x2f, 0xc2, 0xfe, + 0xb6, 0xf0, 0x6e, 0x92, 0x2f, 0xca, 0x01, 0x6b, 0x80, 0x71, 0xf7, 0x10, 0xbd, 0x47, 0x68, 0x67, + 0x68, 0x50, 0x49, 0x87, 0x08, 0xdb, 0x6b, 0x27, 0x60, 0x62, 0x59, 0xeb, 0x74, 0xb0, 0x75, 0xd9, + 0x1d, 0x92, 0x0a, 0x1e, 0x87, 0x6b, 0x9a, 0xa1, 0x6f, 0x62, 0xdb, 0x89, 0xef, 0x2c, 0xdf, 0x21, + 0x1c, 0xe3, 0x96, 0x95, 0x31, 0xdf, 0x4b, 0x3f, 0x42, 0xe6, 0xb7, 0x40, 0x56, 0x37, 0x36, 0x4d, + 0xd6, 0x65, 0xf6, 0xae, 0xda, 0x7b, 0x3f, 0x93, 0xa9, 0x0b, 0xc9, 0x28, 0x18, 0xe6, 0x56, 0x90, + 0x8b, 0xf4, 0x7b, 0xce, 0xdf, 0xc9, 0xc2, 0xac, 0xc7, 0x44, 0xc5, 0x68, 0xe3, 0x07, 0xc3, 0x4b, + 0x31, 0xbf, 0x92, 0x15, 0x3d, 0x0e, 0xd6, 0x5b, 0x1f, 0x42, 0x2a, 0x42, 0xa4, 0x0d, 0x80, 0x96, + 0xe6, 0xe0, 0x2d, 0xd3, 0xd2, 0xfd, 0xfe, 0xf0, 0xc9, 0x49, 0xa8, 0x95, 0xe8, 0xdf, 0x97, 0xd5, + 0x10, 0x1d, 0xe5, 0x2e, 0x98, 0xc6, 0xfe, 0xf9, 0x7b, 0x6f, 0xa9, 0x26, 0x16, 0xaf, 0x70, 0x7e, + 0xf4, 0x17, 0x42, 0xa7, 0xce, 0x44, 0xaa, 0x99, 0x0c, 0xb3, 0xe6, 0x70, 0x6d, 0x68, 0xa3, 0xba, + 0x56, 0x54, 0xeb, 0x2b, 0xc5, 0xd5, 0xd5, 0x4a, 0x75, 0xd9, 0x0f, 0xfc, 0xa2, 0xc0, 0xdc, 0x62, + 0xed, 0x7c, 0x35, 0x14, 0x99, 0x27, 0x8b, 0xd6, 0x61, 0xd2, 0x93, 0x57, 0x3f, 0x5f, 0xcc, 0xb0, + 0xcc, 0x98, 0x2f, 0x66, 0x28, 0xc9, 0x35, 0xce, 0xf4, 0x96, 0xef, 0xa0, 0x43, 0x9e, 0xd1, 0x1f, + 0x6b, 0x90, 0x23, 0x6b, 0xea, 0xe8, 0x2d, 0x64, 0x1b, 0xb0, 0xdb, 0xd1, 0x5a, 0x18, 0xed, 0x24, + 0xb0, 0xc6, 0xbd, 0x4b, 0x17, 0xa4, 0x7d, 0x97, 0x2e, 0x90, 0x47, 0x66, 0xf5, 0x1d, 0xef, 0xb7, + 0x8e, 0xaf, 0xd2, 0x2c, 0xfc, 0x01, 0xad, 0xd8, 0xdd, 0x15, 0xba, 0xfc, 0xcf, 0xd8, 0x8c, 0x50, + 0xc9, 0x68, 0x9e, 0x92, 0x59, 0xa2, 0x62, 0xfb, 0x30, 0x71, 0x1c, 0x8d, 0xe1, 0x62, 0xf0, 0x2c, + 0xe4, 0xea, 0xdd, 0x8e, 0xee, 0xa0, 0xdf, 0x94, 0x46, 0x82, 0x19, 0xbd, 0x28, 0x43, 0x1e, 0x78, + 0x51, 0x46, 0xb0, 0xeb, 0x9a, 0x15, 0xd8, 0x75, 0x6d, 0xe0, 0x07, 0x1d, 0x7e, 0xd7, 0xf5, 0x76, + 0x16, 0xbc, 0x8d, 0xee, 0xd9, 0x3e, 0xb6, 0x8f, 0x48, 0x49, 0xb5, 0xfa, 0x44, 0x05, 0x3c, 0xfb, + 0x44, 0x16, 0x9c, 0x0c, 0x20, 0xbf, 0x50, 0x6b, 0x34, 0x6a, 0x6b, 0x85, 0x23, 0x24, 0xaa, 0x4d, + 0x6d, 0x9d, 0x86, 0x8a, 0xa9, 0x54, 0xab, 0x65, 0xb5, 0x20, 0x91, 0x70, 0x69, 0x95, 0xc6, 0x6a, + 0xb9, 0x20, 0xf3, 0x51, 0xd3, 0x63, 0xcd, 0x6f, 0xbe, 0xec, 0x34, 0xd5, 0x4b, 0xcc, 0x10, 0x8f, + 0xe6, 0x27, 0x7d, 0xe5, 0xfa, 0x35, 0x19, 0x72, 0x6b, 0xd8, 0xda, 0xc2, 0xe8, 0x27, 0x12, 0x6c, + 0xf2, 0x6d, 0xea, 0x96, 0x4d, 0x83, 0xcb, 0x05, 0x9b, 0x7c, 0xe1, 0x34, 0xe5, 0x7a, 0x98, 0xb5, + 0x71, 0xcb, 0x34, 0xda, 0x5e, 0x26, 0xda, 0x1f, 0xf1, 0x89, 0xfc, 0x8d, 0xf5, 0x02, 0x90, 0x11, + 0x46, 0x47, 0xb2, 0x53, 0x97, 0x04, 0x98, 0x7e, 0xa5, 0xa6, 0x0f, 0xcc, 0x37, 0x64, 0xf7, 0xa7, + 0xee, 0x65, 0xf4, 0x22, 0xe1, 0xdd, 0xd7, 0x9b, 0x21, 0x4f, 0xd4, 0xd4, 0x1b, 0xa3, 0xfb, 0xf7, + 0xc7, 0x2c, 0x8f, 0xb2, 0x00, 0xc7, 0x6c, 0xdc, 0xc1, 0x2d, 0x07, 0xb7, 0xdd, 0xa6, 0xab, 0x0e, + 0xec, 0x14, 0xf6, 0x67, 0x47, 0x7f, 0x16, 0x06, 0xf0, 0x4e, 0x1e, 0xc0, 0x1b, 0xfa, 0x88, 0xd2, + 0xad, 0x50, 0xb4, 0xad, 0xec, 0x56, 0xa3, 0xde, 0x31, 0xfd, 0x45, 0x71, 0xef, 0xdd, 0xfd, 0xb6, + 0xed, 0xec, 0x74, 0xc8, 0x37, 0x76, 0xc0, 0xc0, 0x7b, 0x57, 0xe6, 0x61, 0x42, 0x33, 0x2e, 0x93, + 0x4f, 0xd9, 0x98, 0x5a, 0x7b, 0x99, 0xd0, 0xcb, 0x7c, 0xe4, 0xef, 0xe6, 0x90, 0x7f, 0xbc, 0x18, + 0xbb, 0xe9, 0x03, 0xff, 0xd3, 0x13, 0x90, 0x5b, 0xd7, 0x6c, 0x07, 0xa3, 0xff, 0x47, 0x16, 0x45, + 0xfe, 0x06, 0x98, 0xdb, 0x34, 0x5b, 0xbb, 0x36, 0x6e, 0xf3, 0x8d, 0xb2, 0x27, 0x75, 0x14, 0x98, + 0x2b, 0x37, 0x41, 0xc1, 0x4b, 0x64, 0x64, 0xbd, 0x6d, 0xf8, 0x7d, 0xe9, 0x24, 0x06, 0xb7, 0xbd, + 0xae, 0x59, 0x4e, 0x6d, 0x93, 0xa4, 0xf9, 0x31, 0xb8, 0xc3, 0x89, 0x1c, 0xf4, 0xf9, 0x18, 0xe8, + 0x27, 0xa2, 0xa1, 0x9f, 0x14, 0x80, 0x5e, 0x29, 0xc2, 0xe4, 0xa6, 0xde, 0xc1, 0xe4, 0x87, 0x29, + 0xf2, 0x43, 0xbf, 0x31, 0x89, 0xc8, 0xde, 0x1f, 0x93, 0x96, 0xf4, 0x0e, 0x56, 0xfd, 0xdf, 0xbc, + 0x89, 0x0c, 0x04, 0x13, 0x99, 0x55, 0xea, 0x4f, 0xeb, 0x1a, 0x5e, 0x86, 0xb6, 0x83, 0xbd, 0xc5, + 0x37, 0x83, 0x1d, 0x6e, 0x69, 0x6b, 0x8e, 0x46, 0xc0, 0x98, 0x51, 0xc9, 0x33, 0xef, 0x17, 0x22, + 0xf7, 0xfa, 0x85, 0x3c, 0x47, 0x4e, 0xd6, 0x23, 0x7a, 0xcc, 0x46, 0xb4, 0xa8, 0x0b, 0x1e, 0x40, + 0xd4, 0x52, 0xf4, 0xdf, 0x5d, 0x60, 0x5a, 0x9a, 0x85, 0x9d, 0xf5, 0xb0, 0x27, 0x46, 0x4e, 0xe5, + 0x13, 0x89, 0x2b, 0x9f, 0x5d, 0xd7, 0x76, 0x30, 0x29, 0xac, 0xe4, 0x7e, 0x63, 0x2e, 0x5a, 0xfb, + 0xd2, 0x83, 0xfe, 0x37, 0x37, 0xea, 0xfe, 0xb7, 0x5f, 0x1d, 0xd3, 0x6f, 0x86, 0xaf, 0xcc, 0x82, + 0x5c, 0xda, 0x75, 0x1e, 0xd5, 0xdd, 0xef, 0x77, 0x84, 0xfd, 0x5c, 0x58, 0x7f, 0x16, 0x79, 0x45, + 0xfd, 0x98, 0x7a, 0xdf, 0x84, 0x5a, 0x22, 0xe6, 0x4f, 0x13, 0x55, 0xb7, 0xf4, 0x75, 0xe4, 0x8d, + 0xb2, 0xef, 0x60, 0xf9, 0x50, 0xe6, 0xe0, 0xa6, 0x39, 0xa2, 0xfd, 0x53, 0xa8, 0x67, 0xf0, 0xdf, + 0xbd, 0x8e, 0x27, 0xcb, 0xc5, 0xea, 0x23, 0xdb, 0xeb, 0x44, 0x94, 0x33, 0x2a, 0x7d, 0x41, 0x2f, + 0x16, 0x76, 0x3b, 0xa7, 0x62, 0x8b, 0x75, 0x25, 0x4c, 0x66, 0x53, 0x89, 0x5d, 0x43, 0x1a, 0x53, + 0x6c, 0xfa, 0x80, 0x7d, 0x3d, 0xec, 0x2a, 0x58, 0x3c, 0x30, 0x62, 0xe8, 0xe5, 0xc2, 0xdb, 0x51, + 0xb4, 0xda, 0x03, 0xd6, 0x0b, 0x93, 0xc9, 0x5b, 0x6c, 0xb3, 0x2a, 0xb6, 0xe0, 0xf4, 0x25, 0xfe, + 0x35, 0x19, 0xf2, 0x74, 0x0b, 0x12, 0xbd, 0x3e, 0x93, 0xe0, 0xfe, 0x76, 0x87, 0x77, 0x21, 0xf4, + 0xdf, 0x93, 0xac, 0x39, 0x70, 0xae, 0x86, 0xd9, 0x44, 0xae, 0x86, 0xfc, 0x39, 0x4e, 0x81, 0x76, + 0x44, 0xeb, 0x98, 0xf2, 0x74, 0x32, 0x49, 0x0b, 0xeb, 0xcb, 0x50, 0xfa, 0x78, 0xff, 0x6c, 0x0e, + 0x66, 0x68, 0xd1, 0xe7, 0xf5, 0xf6, 0x16, 0x76, 0xd0, 0xdb, 0xa4, 0xef, 0x1d, 0xd4, 0x95, 0x2a, + 0xcc, 0x5c, 0x22, 0x6c, 0xaf, 0x6a, 0x97, 0xcd, 0x5d, 0x87, 0xad, 0x5c, 0xdc, 0x14, 0xbb, 0xee, + 0x41, 0xeb, 0x39, 0x4f, 0xff, 0x50, 0xb9, 0xff, 0x5d, 0x19, 0xd3, 0x05, 0x7f, 0xea, 0xc0, 0x95, + 0x27, 0x46, 0x56, 0x38, 0x49, 0x39, 0x09, 0xf9, 0x3d, 0x1d, 0x5f, 0xaa, 0xb4, 0x99, 0x75, 0xcb, + 0xde, 0xd0, 0x1f, 0x08, 0xef, 0xdb, 0x86, 0xe1, 0x66, 0xbc, 0xa4, 0xab, 0x85, 0x62, 0xbb, 0xb7, + 0x03, 0xd9, 0x1a, 0xc3, 0x99, 0x62, 0xfe, 0x9a, 0xcf, 0x52, 0x02, 0x45, 0x8c, 0x32, 0x9c, 0xf9, + 0x50, 0x1e, 0xb1, 0x27, 0x56, 0xa8, 0x00, 0x46, 0x7c, 0x03, 0xa8, 0x58, 0x7c, 0x89, 0x01, 0x45, + 0xa7, 0x2f, 0xf9, 0x57, 0xc9, 0x30, 0x55, 0xc7, 0xce, 0x92, 0x8e, 0x3b, 0x6d, 0x1b, 0x59, 0x07, + 0x37, 0x8d, 0x6e, 0x81, 0xfc, 0x26, 0x21, 0x36, 0xe8, 0xdc, 0x02, 0xcb, 0x86, 0x5e, 0x29, 0x89, + 0xee, 0x08, 0xb3, 0xd5, 0x37, 0x8f, 0xdb, 0x91, 0xc0, 0x24, 0xe6, 0xd1, 0x1b, 0x5f, 0xf2, 0x18, + 0x02, 0xdb, 0xca, 0x30, 0xc3, 0xee, 0x05, 0x2c, 0x76, 0xf4, 0x2d, 0x03, 0xed, 0x8e, 0xa0, 0x85, + 0x28, 0xb7, 0x42, 0x4e, 0x73, 0xa9, 0xb1, 0xad, 0x57, 0xd4, 0xb7, 0xf3, 0x24, 0xe5, 0xa9, 0x34, + 0x63, 0x82, 0x30, 0x92, 0x81, 0x62, 0x7b, 0x3c, 0x8f, 0x31, 0x8c, 0xe4, 0xc0, 0xc2, 0xd3, 0x47, + 0xec, 0x0b, 0x32, 0x1c, 0x67, 0x0c, 0x9c, 0xc3, 0x96, 0xa3, 0xb7, 0xb4, 0x0e, 0x45, 0xee, 0xf9, + 0x99, 0x51, 0x40, 0xb7, 0x02, 0xb3, 0x7b, 0x61, 0xb2, 0x0c, 0xc2, 0xb3, 0x7d, 0x21, 0xe4, 0x18, + 0x50, 0xf9, 0x1f, 0x13, 0x84, 0xe3, 0xe3, 0xa4, 0xca, 0xd1, 0x1c, 0x63, 0x38, 0x3e, 0x61, 0x26, + 0xd2, 0x87, 0xf8, 0x85, 0x2c, 0x34, 0x4f, 0xd0, 0x7d, 0x7e, 0x46, 0x18, 0xdb, 0x0d, 0x98, 0x26, + 0x58, 0xd2, 0x1f, 0xd9, 0x32, 0x44, 0x8c, 0x12, 0xfb, 0xfd, 0x0e, 0xbb, 0x30, 0xcc, 0xff, 0x57, + 0x0d, 0xd3, 0x41, 0xe7, 0x01, 0x82, 0x4f, 0xe1, 0x4e, 0x3a, 0x13, 0xd5, 0x49, 0x4b, 0x62, 0x9d, + 0xf4, 0xeb, 0x84, 0x83, 0xa5, 0xf4, 0x67, 0xfb, 0xe0, 0xea, 0x21, 0x16, 0x26, 0x63, 0x70, 0xe9, + 0xe9, 0xeb, 0xc5, 0xcb, 0xb2, 0xbd, 0x17, 0xc0, 0x7f, 0x70, 0x24, 0xf3, 0xa9, 0x70, 0x7f, 0x20, + 0xf7, 0xf4, 0x07, 0x07, 0xb0, 0xa4, 0x6f, 0x84, 0xa3, 0xb4, 0x88, 0x92, 0xcf, 0x56, 0x8e, 0x86, + 0x82, 0xe8, 0x49, 0x46, 0x1f, 0x1a, 0x42, 0x09, 0x06, 0xdd, 0x4e, 0x1f, 0xd7, 0xc9, 0x25, 0x33, + 0x76, 0x93, 0x2a, 0xc8, 0xe1, 0x5d, 0x6a, 0xff, 0xd5, 0x2c, 0xb5, 0x76, 0x37, 0xc8, 0x9d, 0x6e, + 0xe8, 0x2f, 0xb3, 0xa3, 0x18, 0x11, 0xee, 0x81, 0x2c, 0x71, 0x71, 0x97, 0x23, 0x97, 0x34, 0x82, + 0x22, 0x83, 0x0b, 0xf7, 0xf0, 0x83, 0xce, 0xca, 0x11, 0x95, 0xfc, 0xa9, 0xdc, 0x04, 0x47, 0x2f, + 0x68, 0xad, 0x8b, 0x5b, 0x96, 0xb9, 0x4b, 0x6e, 0xbf, 0x32, 0xd9, 0x35, 0x5a, 0xe4, 0x3a, 0x42, + 0xfe, 0x83, 0x72, 0x9b, 0x67, 0x3a, 0xe4, 0x06, 0x99, 0x0e, 0x2b, 0x47, 0x98, 0xf1, 0xa0, 0x3c, + 0xd1, 0xef, 0x74, 0xf2, 0xb1, 0x9d, 0xce, 0xca, 0x11, 0xaf, 0xdb, 0x51, 0x16, 0x61, 0xb2, 0xad, + 0xef, 0x91, 0xad, 0x6a, 0x32, 0xeb, 0x1a, 0x74, 0x74, 0x79, 0x51, 0xdf, 0xa3, 0x1b, 0xdb, 0x2b, + 0x47, 0x54, 0xff, 0x4f, 0x65, 0x19, 0xa6, 0xc8, 0xb6, 0x00, 0x21, 0x33, 0x99, 0xe8, 0x58, 0xf2, + 0xca, 0x11, 0x35, 0xf8, 0xd7, 0xb5, 0x3e, 0xb2, 0xe4, 0xec, 0xc7, 0xdd, 0xde, 0x76, 0x7b, 0x26, + 0xd1, 0x76, 0xbb, 0x2b, 0x0b, 0xba, 0xe1, 0x7e, 0x12, 0x72, 0x2d, 0x22, 0x61, 0x89, 0x49, 0x98, + 0xbe, 0x2a, 0x77, 0x42, 0x76, 0x47, 0xb3, 0xbc, 0xc9, 0xf3, 0x0d, 0x83, 0xe9, 0xae, 0x69, 0xd6, + 0x45, 0x17, 0x41, 0xf7, 0xaf, 0x85, 0x09, 0xc8, 0x11, 0xc1, 0xf9, 0x0f, 0xe8, 0x8d, 0x59, 0x6a, + 0x86, 0x94, 0x4c, 0xc3, 0x1d, 0xf6, 0x1b, 0xa6, 0x77, 0x40, 0xe6, 0x0f, 0x32, 0xa3, 0xb1, 0x20, + 0xfb, 0xde, 0x98, 0x2e, 0x47, 0xde, 0x98, 0xde, 0x73, 0x75, 0x6f, 0xb6, 0xf7, 0xea, 0xde, 0x60, + 0xf9, 0x20, 0x37, 0xd8, 0x51, 0xe5, 0xcf, 0x86, 0x30, 0x5d, 0x7a, 0x05, 0x11, 0x3d, 0x03, 0xef, + 0xe8, 0x46, 0xa8, 0xce, 0xde, 0x6b, 0xc2, 0x4e, 0x29, 0xa9, 0x51, 0x33, 0x80, 0xbd, 0xf4, 0xfb, + 0xa6, 0xdf, 0xca, 0xc2, 0x29, 0x7a, 0x41, 0xf4, 0x1e, 0x6e, 0x98, 0xfc, 0x7d, 0x93, 0xe8, 0x63, + 0x23, 0x51, 0x9a, 0x3e, 0x03, 0x8e, 0xdc, 0x77, 0xc0, 0xd9, 0x77, 0x48, 0x39, 0x3b, 0xe0, 0x90, + 0x72, 0x2e, 0xd9, 0xca, 0xe1, 0x7b, 0xc3, 0xfa, 0xb3, 0xce, 0xeb, 0xcf, 0x1d, 0x11, 0x00, 0xf5, + 0x93, 0xcb, 0x48, 0xec, 0x9b, 0xb7, 0xf8, 0x9a, 0x52, 0xe7, 0x34, 0xe5, 0xee, 0xe1, 0x19, 0x49, + 0x5f, 0x5b, 0x7e, 0x3f, 0x0b, 0x57, 0x04, 0xcc, 0x54, 0xf1, 0x25, 0xa6, 0x28, 0x9f, 0x1e, 0x89, + 0xa2, 0x24, 0x8f, 0x81, 0x90, 0xb6, 0xc6, 0xfc, 0x89, 0xf0, 0xd9, 0xa1, 0x5e, 0xa0, 0x7c, 0xd9, + 0x44, 0x28, 0xcb, 0x49, 0xc8, 0xd3, 0x1e, 0x86, 0x41, 0xc3, 0xde, 0x12, 0x76, 0x37, 0x62, 0x27, + 0x8e, 0x44, 0x79, 0x1b, 0x83, 0xfe, 0xb0, 0x75, 0x8d, 0xc6, 0xae, 0x65, 0x54, 0x0c, 0xc7, 0x44, + 0x3f, 0x35, 0x12, 0xc5, 0xf1, 0xbd, 0xe1, 0xe4, 0x61, 0xbc, 0xe1, 0x86, 0x5a, 0xe5, 0xf0, 0x6a, + 0x70, 0x28, 0xab, 0x1c, 0x11, 0x85, 0xa7, 0x8f, 0xdf, 0x9b, 0x65, 0x38, 0xc9, 0x26, 0x5b, 0x0b, + 0xbc, 0x85, 0x88, 0xee, 0x1f, 0x05, 0x90, 0xc7, 0x3d, 0x33, 0x89, 0xdd, 0x72, 0x46, 0x5e, 0xf8, + 0x93, 0x52, 0xb1, 0xf7, 0x3b, 0x70, 0xd3, 0xc1, 0x1e, 0x0e, 0x47, 0x82, 0x94, 0xd8, 0xb5, 0x0e, + 0x09, 0xd8, 0x48, 0x1f, 0xb3, 0x5f, 0x92, 0x21, 0x4f, 0xcf, 0x69, 0xa1, 0x8d, 0x54, 0x1c, 0x26, + 0xf8, 0x28, 0xcf, 0x02, 0x3b, 0x72, 0x89, 0x2f, 0xb9, 0x4f, 0x6f, 0x2f, 0xee, 0x90, 0x6e, 0xb1, + 0xff, 0x86, 0x04, 0xd3, 0x75, 0xec, 0x94, 0x34, 0xcb, 0xd2, 0xb5, 0xad, 0x51, 0x79, 0x7c, 0x8b, + 0x7a, 0x0f, 0xa3, 0x6f, 0x66, 0x44, 0xcf, 0xd3, 0xf8, 0x0b, 0xe1, 0x1e, 0xab, 0x11, 0xb1, 0x04, + 0x1f, 0x11, 0x3a, 0x33, 0x33, 0x88, 0xda, 0x18, 0x3c, 0xb6, 0x25, 0x98, 0xf0, 0xce, 0xe2, 0xdd, + 0xc2, 0x9d, 0xcf, 0xdc, 0x76, 0x76, 0xbc, 0x63, 0x30, 0xe4, 0x79, 0xff, 0x19, 0x30, 0xf4, 0xd2, + 0x84, 0x8e, 0xf2, 0xf1, 0x07, 0x09, 0x93, 0xb5, 0xb1, 0x24, 0xee, 0xf0, 0x87, 0x75, 0x74, 0xf0, + 0x77, 0x27, 0xd8, 0x72, 0xe4, 0xaa, 0xe6, 0xe0, 0x07, 0xd1, 0x67, 0x64, 0x98, 0xa8, 0x63, 0xc7, + 0x1d, 0x6f, 0xb9, 0xcb, 0x4d, 0x87, 0xd5, 0x70, 0x25, 0xb4, 0xe2, 0x31, 0xc5, 0xd6, 0x30, 0xee, + 0x85, 0xa9, 0xae, 0x65, 0xb6, 0xb0, 0x6d, 0xb3, 0xd5, 0x8b, 0xb0, 0xa3, 0x5a, 0xbf, 0xd1, 0x9f, + 0xb0, 0x36, 0xbf, 0xee, 0xfd, 0xa3, 0x06, 0xbf, 0x27, 0x35, 0x03, 0x28, 0x25, 0x56, 0xc1, 0x71, + 0x9b, 0x01, 0x71, 0x85, 0xa7, 0x0f, 0xf4, 0x27, 0x65, 0x98, 0xa9, 0x63, 0xc7, 0x97, 0x62, 0x82, + 0x4d, 0x8e, 0x68, 0x78, 0x39, 0x28, 0xe5, 0x83, 0x41, 0x29, 0x7e, 0x35, 0x20, 0x2f, 0x4d, 0x9f, + 0xd8, 0x18, 0xaf, 0x06, 0x14, 0xe3, 0x60, 0x0c, 0xc7, 0xd7, 0x1e, 0x0b, 0x53, 0x84, 0x17, 0xd2, + 0x60, 0x7f, 0x3e, 0x1b, 0x34, 0xde, 0xcf, 0xa6, 0xd4, 0x78, 0xef, 0x82, 0xdc, 0x8e, 0x66, 0x5d, + 0xb4, 0x49, 0xc3, 0x9d, 0x16, 0x31, 0xdb, 0xd7, 0xdc, 0xec, 0x2a, 0xfd, 0xab, 0xbf, 0x9f, 0x66, + 0x2e, 0x99, 0x9f, 0xe6, 0x23, 0x52, 0xa2, 0x91, 0x90, 0xce, 0x1d, 0x46, 0xd8, 0xe4, 0x13, 0x8c, + 0x9b, 0x31, 0x65, 0xa7, 0xaf, 0x1c, 0xcf, 0x97, 0x61, 0xd2, 0x1d, 0xb7, 0x89, 0x3d, 0x7e, 0xfe, + 0xe0, 0xea, 0xd0, 0xdf, 0xd0, 0x4f, 0xd8, 0x03, 0x7b, 0x12, 0x19, 0x9d, 0x79, 0x9f, 0xa0, 0x07, + 0x8e, 0x2b, 0x3c, 0x7d, 0x3c, 0xde, 0x4a, 0xf1, 0x20, 0xed, 0x01, 0xbd, 0x46, 0x06, 0x79, 0x19, + 0x3b, 0xe3, 0xb6, 0x22, 0xdf, 0x24, 0x1c, 0xe2, 0x88, 0x13, 0x18, 0xe1, 0x79, 0x7e, 0x19, 0x8f, + 0xa6, 0x01, 0x89, 0xc5, 0x36, 0x12, 0x62, 0x20, 0x7d, 0xd4, 0xde, 0x49, 0x51, 0xa3, 0x9b, 0x0b, + 0x3f, 0x39, 0x82, 0x5e, 0x75, 0xbc, 0x0b, 0x1f, 0x9e, 0x00, 0x09, 0x8d, 0xc3, 0x6a, 0x6f, 0xfd, + 0x0a, 0x1f, 0xcb, 0x55, 0x7c, 0xe0, 0x36, 0xf6, 0x6d, 0xdc, 0xba, 0x88, 0xdb, 0xe8, 0xc7, 0x0e, + 0x0e, 0xdd, 0x29, 0x98, 0x68, 0x51, 0x6a, 0x04, 0xbc, 0x49, 0xd5, 0x7b, 0x4d, 0x70, 0xaf, 0x34, + 0xdf, 0x11, 0xd1, 0xdf, 0xc7, 0x78, 0xaf, 0xb4, 0x40, 0xf1, 0x63, 0x30, 0x5b, 0xe8, 0x2c, 0xa3, + 0xd2, 0x32, 0x0d, 0xf4, 0x5f, 0x0e, 0x0e, 0xcb, 0x35, 0x30, 0xa5, 0xb7, 0x4c, 0x83, 0x84, 0xa1, + 0xf0, 0x0e, 0x01, 0xf9, 0x09, 0xde, 0xd7, 0xf2, 0x8e, 0xf9, 0x80, 0xce, 0x76, 0xcd, 0x83, 0x84, + 0x61, 0x8d, 0x09, 0x97, 0xf5, 0xc3, 0x32, 0x26, 0xfa, 0x94, 0x9d, 0x3e, 0x64, 0x1f, 0x0a, 0xbc, + 0xdb, 0x68, 0x57, 0xf8, 0xa8, 0x58, 0x05, 0x1e, 0x66, 0x38, 0x0b, 0xd7, 0xe2, 0x50, 0x86, 0xb3, + 0x18, 0x06, 0xc6, 0x70, 0x63, 0x45, 0x80, 0x63, 0xea, 0x6b, 0xc0, 0x07, 0x40, 0x67, 0x74, 0xe6, + 0xe1, 0x90, 0xe8, 0x1c, 0x8e, 0x89, 0xf8, 0x1e, 0x16, 0x22, 0x93, 0x59, 0x3c, 0xe8, 0xbf, 0x8e, + 0x02, 0x9c, 0x3b, 0x86, 0xf1, 0x57, 0xa0, 0xde, 0x0a, 0x09, 0x6e, 0xc4, 0xde, 0x27, 0x41, 0x97, + 0xca, 0x18, 0xef, 0x8a, 0x17, 0x29, 0x3f, 0x7d, 0x00, 0x9f, 0x27, 0xc3, 0x1c, 0xf1, 0x11, 0xe8, + 0x60, 0xcd, 0xa2, 0x1d, 0xe5, 0x48, 0x1c, 0xe5, 0xdf, 0x2a, 0x1c, 0xe0, 0x87, 0x97, 0x43, 0xc0, + 0xc7, 0x48, 0xa0, 0x10, 0x8b, 0xee, 0x23, 0xc8, 0xc2, 0x58, 0xb6, 0x51, 0x0a, 0x3e, 0x0b, 0x4c, + 0xc5, 0x47, 0x83, 0x47, 0x42, 0x8f, 0x5c, 0x5e, 0x18, 0x5e, 0x63, 0x1b, 0xb3, 0x47, 0xae, 0x08, + 0x13, 0xe9, 0x63, 0xf2, 0x9a, 0x5b, 0xd9, 0x82, 0x73, 0x83, 0x5c, 0x18, 0xff, 0xf2, 0xac, 0x7f, + 0xa2, 0xed, 0x93, 0x23, 0xf1, 0xc0, 0x3c, 0x40, 0x40, 0x7c, 0x05, 0xb2, 0x96, 0x79, 0x89, 0x2e, + 0x6d, 0xcd, 0xaa, 0xe4, 0x99, 0x5e, 0x4f, 0xd9, 0xd9, 0xdd, 0x31, 0xe8, 0xc9, 0xd0, 0x59, 0xd5, + 0x7b, 0x55, 0xae, 0x87, 0xd9, 0x4b, 0xba, 0xb3, 0xbd, 0x82, 0xb5, 0x36, 0xb6, 0x54, 0xf3, 0x12, + 0xf1, 0x98, 0x9b, 0x54, 0xf9, 0x44, 0xde, 0x7f, 0x45, 0xc0, 0xbe, 0x24, 0xb7, 0xc8, 0x8f, 0xe5, + 0xf8, 0x5b, 0x12, 0xcb, 0x33, 0x9a, 0xab, 0xf4, 0x15, 0xe6, 0x5d, 0x32, 0x4c, 0xa9, 0xe6, 0x25, + 0xa6, 0x24, 0xff, 0xd7, 0xe1, 0xea, 0x48, 0xe2, 0x89, 0x1e, 0x91, 0x9c, 0xcf, 0xfe, 0xd8, 0x27, + 0x7a, 0xb1, 0xc5, 0x8f, 0xe5, 0xe4, 0xd2, 0x8c, 0x6a, 0x5e, 0xaa, 0x63, 0x87, 0xb6, 0x08, 0xd4, + 0x1c, 0x91, 0x93, 0xb5, 0x6e, 0x53, 0x82, 0x6c, 0x1e, 0xee, 0xbf, 0x27, 0xdd, 0x45, 0xf0, 0x05, + 0xe4, 0xb3, 0x38, 0xee, 0x5d, 0x84, 0x81, 0x1c, 0x8c, 0x21, 0x46, 0x8a, 0x0c, 0xd3, 0xaa, 0x79, + 0xc9, 0x1d, 0x1a, 0x96, 0xf4, 0x4e, 0x67, 0x34, 0x23, 0x64, 0x52, 0xe3, 0xdf, 0x13, 0x83, 0xc7, + 0xc5, 0xd8, 0x8d, 0xff, 0x01, 0x0c, 0xa4, 0x0f, 0xc3, 0x73, 0x68, 0x63, 0xf1, 0x46, 0x68, 0x63, + 0x34, 0x38, 0x0c, 0xdb, 0x20, 0x7c, 0x36, 0x0e, 0xad, 0x41, 0x44, 0x71, 0x30, 0x96, 0x9d, 0x93, + 0xb9, 0x12, 0x19, 0xe6, 0x47, 0xdb, 0x26, 0xde, 0x9e, 0xcc, 0x35, 0x91, 0x0d, 0xbb, 0x1c, 0x23, + 0x23, 0x41, 0x23, 0x81, 0x0b, 0xa2, 0x00, 0x0f, 0xe9, 0xe3, 0xf1, 0x7e, 0x19, 0x66, 0x28, 0x0b, + 0x8f, 0x12, 0x2b, 0x60, 0xa8, 0x46, 0x15, 0xae, 0xc1, 0xe1, 0x34, 0xaa, 0x18, 0x0e, 0xc6, 0x72, + 0x2b, 0xa8, 0x6b, 0xc7, 0x0d, 0x71, 0x7c, 0x3c, 0x0a, 0xc1, 0xa1, 0x8d, 0xb1, 0x11, 0x1e, 0x21, + 0x1f, 0xc6, 0x18, 0x3b, 0xa4, 0x63, 0xe4, 0xcf, 0xf1, 0x5b, 0xd1, 0x28, 0x31, 0x38, 0x40, 0x53, + 0x18, 0x21, 0x0c, 0x43, 0x36, 0x85, 0x43, 0x42, 0xe2, 0x8b, 0x32, 0x00, 0x65, 0x60, 0xcd, 0xdc, + 0x23, 0x97, 0xf9, 0x8c, 0xa0, 0x3b, 0xeb, 0x75, 0xab, 0x97, 0x07, 0xb8, 0xd5, 0x27, 0x0c, 0xe1, + 0x92, 0x74, 0x25, 0x30, 0x24, 0x65, 0xb7, 0x92, 0x63, 0x5f, 0x09, 0x8c, 0x2f, 0x3f, 0x7d, 0x8c, + 0x3f, 0x4f, 0xad, 0xb9, 0xe0, 0x80, 0xe9, 0x6f, 0x8c, 0x04, 0xe5, 0xd0, 0xec, 0x5f, 0xe6, 0x67, + 0xff, 0x07, 0xc0, 0x76, 0x58, 0x1b, 0x71, 0xd0, 0xc1, 0xd1, 0xf4, 0x6d, 0xc4, 0xc3, 0x3b, 0x20, + 0xfa, 0x93, 0x59, 0x38, 0xca, 0x3a, 0x91, 0xef, 0x05, 0x88, 0x13, 0x9e, 0xc3, 0xe3, 0x3a, 0xc9, + 0x01, 0x28, 0x8f, 0x6a, 0x41, 0x2a, 0xc9, 0x52, 0xa6, 0x00, 0x7b, 0x63, 0x59, 0xdd, 0xc8, 0x97, + 0x1f, 0xec, 0x6a, 0x46, 0x5b, 0x3c, 0xdc, 0xef, 0x00, 0xe0, 0xbd, 0xb5, 0x46, 0x99, 0x5f, 0x6b, + 0xec, 0xb3, 0x32, 0x99, 0x78, 0xe7, 0x9a, 0x88, 0x8c, 0xb2, 0x3b, 0xf6, 0x9d, 0xeb, 0xe8, 0xb2, + 0xd3, 0x47, 0xe9, 0xed, 0x32, 0x64, 0xeb, 0xa6, 0xe5, 0xa0, 0xe7, 0x26, 0x69, 0x9d, 0x54, 0xf2, + 0x01, 0x48, 0xde, 0xbb, 0x52, 0xe2, 0x6e, 0x69, 0xbe, 0x25, 0xfe, 0xa8, 0xb3, 0xe6, 0x68, 0xc4, + 0xab, 0xdb, 0x2d, 0x3f, 0x74, 0x5d, 0x73, 0xd2, 0x78, 0x3a, 0x54, 0x7e, 0xf5, 0xe8, 0x03, 0x18, + 0xa9, 0xc5, 0xd3, 0x89, 0x2c, 0x39, 0x7d, 0xdc, 0x1e, 0x3e, 0xca, 0x7c, 0x5b, 0x97, 0xf4, 0x0e, + 0x46, 0xcf, 0xa5, 0x2e, 0x23, 0x55, 0x6d, 0x07, 0x8b, 0x1f, 0x89, 0x89, 0x75, 0x6d, 0x25, 0xf1, + 0x65, 0xe5, 0x20, 0xbe, 0x6c, 0xd2, 0x06, 0x45, 0x0f, 0xa0, 0x53, 0x96, 0xc6, 0xdd, 0xa0, 0x62, + 0xca, 0x1e, 0x4b, 0x9c, 0xce, 0x63, 0x75, 0xec, 0x50, 0xa3, 0xb2, 0xe6, 0xdd, 0xc0, 0xf2, 0xe3, + 0x23, 0x89, 0xd8, 0xe9, 0x5f, 0xf0, 0x22, 0xf7, 0x5c, 0xf0, 0xf2, 0xae, 0x30, 0x38, 0x6b, 0x3c, + 0x38, 0x3f, 0x1c, 0x2d, 0x20, 0x9e, 0xc9, 0x91, 0xc0, 0xf4, 0x26, 0x1f, 0xa6, 0x75, 0x0e, 0xa6, + 0x3b, 0x87, 0xe4, 0x22, 0x7d, 0xc0, 0x7e, 0x31, 0x07, 0x47, 0xe9, 0xa4, 0xbf, 0x68, 0xb4, 0x59, + 0x84, 0xd5, 0xd7, 0x4b, 0x87, 0xbc, 0xd9, 0xb6, 0x3f, 0x04, 0x2b, 0x17, 0xcb, 0x39, 0xd7, 0x7b, + 0x3b, 0xfe, 0x02, 0x0d, 0xe7, 0xea, 0x76, 0xa2, 0x64, 0xa7, 0x4d, 0xfc, 0x86, 0x7c, 0xff, 0x3f, + 0xfe, 0x2e, 0xa3, 0x09, 0xf1, 0xbb, 0x8c, 0xfe, 0x34, 0xd9, 0xba, 0x1d, 0x29, 0xba, 0x47, 0xe0, + 0x29, 0xdb, 0x4e, 0x09, 0x56, 0xf4, 0x04, 0xb8, 0xfb, 0xfe, 0x70, 0x27, 0x0b, 0x22, 0x88, 0x0c, + 0xe9, 0x4e, 0x46, 0x08, 0x1c, 0xa6, 0x3b, 0xd9, 0x20, 0x06, 0xc6, 0x70, 0xab, 0x7d, 0x8e, 0xed, + 0xe6, 0x93, 0x76, 0x83, 0xfe, 0x5a, 0x4a, 0x7d, 0x94, 0xfe, 0x56, 0x26, 0x91, 0xff, 0x33, 0xe1, + 0x2b, 0x7e, 0x98, 0x4e, 0xe2, 0xd1, 0x1c, 0x47, 0x6e, 0x0c, 0xeb, 0x46, 0x12, 0xf1, 0x45, 0x3f, + 0xaf, 0xb7, 0x9d, 0xed, 0x11, 0x9d, 0xe8, 0xb8, 0xe4, 0xd2, 0xf2, 0xae, 0x47, 0x26, 0x2f, 0xe8, + 0xdf, 0x33, 0x89, 0x42, 0x48, 0xf9, 0x22, 0x21, 0x6c, 0x45, 0x88, 0x38, 0x41, 0xe0, 0xa7, 0x58, + 0x7a, 0x63, 0xd4, 0xe8, 0x73, 0x7a, 0x1b, 0x9b, 0x8f, 0x42, 0x8d, 0x26, 0x7c, 0x8d, 0x4e, 0xa3, + 0xe3, 0xc8, 0x7d, 0x9f, 0x6a, 0xb4, 0x2f, 0x92, 0x11, 0x69, 0x74, 0x2c, 0xbd, 0xf4, 0x65, 0xfc, + 0xd2, 0x19, 0x36, 0x91, 0x5a, 0xd5, 0x8d, 0x8b, 0xe8, 0x5f, 0xf2, 0xde, 0xc5, 0xcc, 0xe7, 0x75, + 0x67, 0x9b, 0xc5, 0x82, 0xf9, 0x7d, 0xe1, 0xbb, 0x51, 0x86, 0x88, 0xf7, 0xc2, 0x87, 0x93, 0xca, + 0xed, 0x0b, 0x27, 0x55, 0x84, 0x59, 0xdd, 0x70, 0xb0, 0x65, 0x68, 0x9d, 0xa5, 0x8e, 0xb6, 0x65, + 0x9f, 0x9a, 0xe8, 0x7b, 0x79, 0x5d, 0x25, 0x94, 0x47, 0xe5, 0xff, 0x08, 0x5f, 0x5f, 0x39, 0xc9, + 0x5f, 0x5f, 0x19, 0x11, 0xfd, 0x6a, 0x2a, 0x3a, 0xfa, 0x95, 0x1f, 0xdd, 0x0a, 0x06, 0x07, 0xc7, + 0x16, 0xb5, 0x8d, 0x13, 0x86, 0xfb, 0xbb, 0x45, 0x30, 0x0a, 0x9b, 0x1f, 0xfa, 0xf1, 0x15, 0x72, + 0xa2, 0xd5, 0x3d, 0x57, 0x11, 0xe6, 0x7b, 0x95, 0x20, 0xb1, 0x85, 0x1a, 0xae, 0xbc, 0xdc, 0x53, + 0x79, 0xdf, 0xe4, 0xc9, 0x0a, 0x98, 0x3c, 0x61, 0xa5, 0xca, 0x89, 0x29, 0x55, 0x92, 0xc5, 0x42, + 0x91, 0xda, 0x8e, 0xe1, 0x34, 0x52, 0x0e, 0x8e, 0x79, 0xd1, 0x6e, 0xbb, 0x5d, 0xac, 0x59, 0x9a, + 0xd1, 0xc2, 0xe8, 0x43, 0xd2, 0x28, 0xcc, 0xde, 0x25, 0x98, 0xd4, 0x5b, 0xa6, 0x51, 0xd7, 0x9f, + 0xe9, 0x5d, 0x2e, 0x17, 0x1f, 0x64, 0x9d, 0x48, 0xa4, 0xc2, 0xfe, 0x50, 0xfd, 0x7f, 0x95, 0x0a, + 0x4c, 0xb5, 0x34, 0xab, 0x4d, 0x83, 0xf0, 0xe5, 0x7a, 0x2e, 0x72, 0x8a, 0x24, 0x54, 0xf2, 0x7e, + 0x51, 0x83, 0xbf, 0x95, 0x1a, 0x2f, 0xc4, 0x7c, 0x4f, 0x34, 0x8f, 0x48, 0x62, 0x8b, 0xc1, 0x4f, + 0x9c, 0xcc, 0x5d, 0xe9, 0x58, 0xb8, 0x43, 0xee, 0xa0, 0xa7, 0x3d, 0xc4, 0x94, 0x1a, 0x24, 0x24, + 0x5d, 0x1e, 0x20, 0x45, 0xed, 0x43, 0x63, 0xdc, 0xcb, 0x03, 0x42, 0x5c, 0xa4, 0xaf, 0x99, 0x6f, + 0xc9, 0xc3, 0x2c, 0xed, 0xd5, 0x98, 0x38, 0xd1, 0xf3, 0xc8, 0x15, 0xd2, 0xce, 0x7d, 0xf8, 0x32, + 0xaa, 0x1f, 0x7c, 0x4c, 0x2e, 0x80, 0x7c, 0xd1, 0x0f, 0x38, 0xe8, 0x3e, 0x26, 0xdd, 0xb7, 0xf7, + 0xf8, 0x9a, 0xa7, 0x3c, 0x8d, 0x7b, 0xdf, 0x3e, 0xbe, 0xf8, 0xf4, 0xf1, 0xf9, 0x65, 0x19, 0xe4, + 0x62, 0xbb, 0x8d, 0x5a, 0x07, 0x87, 0xe2, 0x0c, 0x4c, 0x7b, 0x6d, 0x26, 0x88, 0x01, 0x19, 0x4e, + 0x4a, 0xba, 0x08, 0xea, 0xcb, 0xa6, 0xd8, 0x1e, 0xfb, 0xae, 0x42, 0x4c, 0xd9, 0xe9, 0x83, 0xf2, + 0x1b, 0x13, 0xac, 0xd1, 0x2c, 0x98, 0xe6, 0x45, 0x72, 0x54, 0xe6, 0xb9, 0x32, 0xe4, 0x96, 0xb0, + 0xd3, 0xda, 0x1e, 0x51, 0x9b, 0xd9, 0xb5, 0x3a, 0x5e, 0x9b, 0xd9, 0x77, 0x1f, 0xfe, 0x60, 0x1b, + 0xd6, 0x63, 0x6b, 0x9e, 0xb0, 0x34, 0xee, 0xe8, 0xce, 0xb1, 0xa5, 0xa7, 0x0f, 0xce, 0xbf, 0xcb, + 0x30, 0xe7, 0xaf, 0x70, 0x51, 0x4c, 0x7e, 0x31, 0xf3, 0x68, 0x5b, 0xef, 0x44, 0x9f, 0x4e, 0x16, + 0x22, 0xcd, 0x97, 0x29, 0x5f, 0xb3, 0x94, 0x17, 0x16, 0x13, 0x04, 0x4f, 0x13, 0x63, 0x70, 0x0c, + 0x33, 0x78, 0x19, 0x26, 0x09, 0x43, 0x8b, 0xfa, 0x1e, 0x71, 0x1d, 0xe4, 0x16, 0x1a, 0x9f, 0x35, + 0x92, 0x85, 0xc6, 0x3b, 0xf9, 0x85, 0x46, 0xc1, 0x88, 0xc7, 0xde, 0x3a, 0x63, 0x42, 0x5f, 0x1a, + 0xf7, 0xff, 0x91, 0x2f, 0x33, 0x26, 0xf0, 0xa5, 0x19, 0x50, 0x7e, 0xfa, 0x88, 0xbe, 0xe2, 0x3f, + 0xb1, 0xce, 0xd6, 0xdb, 0x50, 0x45, 0xff, 0xe3, 0x18, 0x64, 0xcf, 0xb9, 0x0f, 0xff, 0x2b, 0xb8, + 0x11, 0xeb, 0x45, 0x23, 0x08, 0xce, 0xf0, 0x74, 0xc8, 0xba, 0xf4, 0xd9, 0xb4, 0xe5, 0x26, 0xb1, + 0xdd, 0x5d, 0x97, 0x11, 0x95, 0xfc, 0xa7, 0x9c, 0x84, 0xbc, 0x6d, 0xee, 0x5a, 0x2d, 0xd7, 0x7c, + 0x76, 0x35, 0x86, 0xbd, 0x25, 0x0d, 0x4a, 0xca, 0x91, 0x9e, 0x1f, 0x9d, 0xcb, 0x68, 0xe8, 0x82, + 0x24, 0x99, 0xbb, 0x20, 0x29, 0xc1, 0xfe, 0x81, 0x00, 0x6f, 0xe9, 0x6b, 0xc4, 0x5f, 0x93, 0xbb, + 0x02, 0xdb, 0xa3, 0x82, 0x3d, 0x42, 0x2c, 0x07, 0x55, 0x87, 0xa4, 0x0e, 0xdf, 0xbc, 0x68, 0xfd, + 0x38, 0xf0, 0x63, 0x75, 0xf8, 0x16, 0xe0, 0x61, 0x2c, 0xa7, 0xd4, 0xf3, 0xcc, 0x49, 0xf5, 0xfe, + 0x51, 0xa2, 0x9b, 0xe5, 0x94, 0xfe, 0x40, 0xe8, 0x8c, 0xd0, 0x79, 0x75, 0x68, 0x74, 0x0e, 0xc9, + 0x7d, 0xf5, 0x0f, 0x65, 0x12, 0x09, 0xd3, 0x33, 0x72, 0xc4, 0x2f, 0x3a, 0x4a, 0x0c, 0x91, 0x3b, + 0x06, 0x73, 0x71, 0xa0, 0x67, 0x87, 0x0f, 0x0d, 0xce, 0x8b, 0x2e, 0xc4, 0xff, 0xb8, 0x43, 0x83, + 0x8b, 0x32, 0x92, 0x3e, 0x90, 0xaf, 0xa6, 0x17, 0x8b, 0x15, 0x5b, 0x8e, 0xbe, 0x37, 0xe2, 0x96, + 0xc6, 0x0f, 0x2f, 0x09, 0xa3, 0x01, 0xef, 0x93, 0x10, 0xe5, 0x70, 0xdc, 0xd1, 0x80, 0xc5, 0xd8, + 0x48, 0x1f, 0xa6, 0xbf, 0xcb, 0xbb, 0xd2, 0x63, 0x6b, 0x33, 0xaf, 0x61, 0xab, 0x01, 0xf8, 0xe0, + 0x68, 0x9d, 0x85, 0x99, 0xd0, 0xd4, 0xdf, 0xbb, 0xb0, 0x86, 0x4b, 0x4b, 0x7a, 0xd0, 0xdd, 0x17, + 0xd9, 0xc8, 0x17, 0x06, 0x12, 0x2c, 0xf8, 0x8a, 0x30, 0x31, 0x96, 0xfb, 0xe0, 0xbc, 0x31, 0x6c, + 0x4c, 0x58, 0xfd, 0x7e, 0x18, 0xab, 0x1a, 0x8f, 0xd5, 0xed, 0x22, 0x62, 0x12, 0x1b, 0xd3, 0x84, + 0xe6, 0x8d, 0x6f, 0xf6, 0xe1, 0x52, 0x39, 0xb8, 0x9e, 0x3e, 0x34, 0x1f, 0xe9, 0x23, 0xf6, 0x9b, + 0xb4, 0x3b, 0xac, 0x53, 0x93, 0x7d, 0x34, 0xdd, 0x21, 0x9b, 0x0d, 0xc8, 0xdc, 0x6c, 0x20, 0xa1, + 0xbf, 0x7d, 0xe0, 0x46, 0xea, 0x31, 0x37, 0x08, 0xa2, 0xec, 0x88, 0xfd, 0xed, 0x07, 0x72, 0x90, + 0x3e, 0x38, 0xff, 0x24, 0x03, 0x2c, 0x5b, 0xe6, 0x6e, 0xb7, 0x66, 0xb5, 0xb1, 0x85, 0xfe, 0x36, + 0x98, 0x00, 0xfc, 0xca, 0x08, 0x26, 0x00, 0xeb, 0x00, 0x5b, 0x3e, 0x71, 0xa6, 0xe1, 0xb7, 0x8a, + 0x99, 0xfb, 0x01, 0x53, 0x6a, 0x88, 0x06, 0x7f, 0xe5, 0xec, 0x8f, 0xf0, 0x18, 0xc7, 0xf5, 0x59, + 0x01, 0xb9, 0x51, 0x4e, 0x00, 0xde, 0xea, 0x63, 0xdd, 0xe0, 0xb0, 0xbe, 0xe7, 0x00, 0x9c, 0xa4, + 0x8f, 0xf9, 0x3f, 0x4f, 0xc0, 0x34, 0xdd, 0xae, 0xa3, 0x32, 0xfd, 0x87, 0x00, 0xf4, 0xdf, 0x18, + 0x01, 0xe8, 0x1b, 0x30, 0x63, 0x06, 0xd4, 0x69, 0x9f, 0x1a, 0x5e, 0x80, 0x89, 0x85, 0x3d, 0xc4, + 0x97, 0xca, 0x91, 0x41, 0x1f, 0x08, 0x23, 0xaf, 0xf2, 0xc8, 0xdf, 0x19, 0x23, 0xef, 0x10, 0xc5, + 0x51, 0x42, 0xff, 0x36, 0x1f, 0xfa, 0x0d, 0x0e, 0xfa, 0xe2, 0x41, 0x58, 0x19, 0x43, 0xb8, 0x7d, + 0x19, 0xb2, 0xe4, 0x74, 0xdc, 0x6f, 0xa5, 0x38, 0xbf, 0x3f, 0x05, 0x13, 0xa4, 0xc9, 0xfa, 0xf3, + 0x0e, 0xef, 0xd5, 0xfd, 0xa2, 0x6d, 0x3a, 0xd8, 0xf2, 0x3d, 0x16, 0xbc, 0x57, 0x97, 0x07, 0xcf, + 0x2b, 0xd9, 0x3e, 0x95, 0xa7, 0x1b, 0x91, 0x7e, 0xc2, 0xd0, 0x93, 0x92, 0xb0, 0xc4, 0x47, 0x76, + 0x5e, 0x6e, 0x98, 0x49, 0xc9, 0x00, 0x46, 0xd2, 0x07, 0xfe, 0x2f, 0xb3, 0x70, 0x8a, 0xae, 0x2a, + 0x2d, 0x59, 0xe6, 0x4e, 0xcf, 0xed, 0x56, 0xfa, 0xc1, 0x75, 0xe1, 0x06, 0x98, 0x73, 0x38, 0x7f, + 0x6c, 0xa6, 0x13, 0x3d, 0xa9, 0xe8, 0xcf, 0xc2, 0x3e, 0x15, 0xcf, 0xe0, 0x91, 0x5c, 0x88, 0x11, + 0x60, 0x14, 0xef, 0x89, 0x17, 0xea, 0x05, 0x19, 0x0d, 0x2d, 0x52, 0xc9, 0x43, 0xad, 0x59, 0xfa, + 0x3a, 0x95, 0x13, 0xd1, 0xa9, 0x77, 0xfb, 0x3a, 0xf5, 0x63, 0x9c, 0x4e, 0x2d, 0x1f, 0x5c, 0x24, + 0xe9, 0xeb, 0xd6, 0xcb, 0xfd, 0x8d, 0x21, 0x7f, 0xdb, 0x6e, 0x27, 0x85, 0xcd, 0xba, 0xb0, 0x3f, + 0x52, 0x96, 0xf3, 0x47, 0xe2, 0xef, 0xa3, 0x48, 0x30, 0x13, 0xe6, 0xb9, 0x8e, 0xd0, 0xa5, 0x39, + 0x90, 0x74, 0x8f, 0x3b, 0x49, 0x6f, 0x0f, 0x35, 0xd7, 0x8d, 0x2d, 0x68, 0x0c, 0x6b, 0x4b, 0x73, + 0x90, 0x5f, 0xd2, 0x3b, 0x0e, 0xb6, 0xd0, 0xe7, 0xd9, 0x4c, 0xf7, 0xe5, 0x29, 0x0e, 0x00, 0x8b, + 0x90, 0xdf, 0x24, 0xa5, 0x31, 0x93, 0xf9, 0x66, 0xb1, 0xd6, 0x43, 0x39, 0x54, 0xd9, 0xbf, 0x49, + 0xa3, 0xf3, 0xf5, 0x90, 0x19, 0xd9, 0x14, 0x39, 0x41, 0x74, 0xbe, 0xc1, 0x2c, 0x8c, 0xe5, 0x62, + 0xaa, 0xbc, 0x8a, 0x77, 0xdc, 0x31, 0xfe, 0x62, 0x7a, 0x08, 0x17, 0x40, 0xd6, 0xdb, 0x36, 0xe9, + 0x1c, 0xa7, 0x54, 0xf7, 0x31, 0xa9, 0xaf, 0x50, 0xaf, 0xa8, 0x28, 0xcb, 0xe3, 0xf6, 0x15, 0x12, + 0xe2, 0x22, 0x7d, 0xcc, 0xbe, 0x45, 0x1c, 0x45, 0xbb, 0x1d, 0xad, 0x85, 0x5d, 0xee, 0x53, 0x43, + 0x8d, 0xf6, 0x64, 0x59, 0xaf, 0x27, 0x0b, 0xb5, 0xd3, 0xdc, 0x01, 0xda, 0xe9, 0xb0, 0xcb, 0x90, + 0xbe, 0xcc, 0x49, 0xc5, 0x0f, 0x6d, 0x19, 0x32, 0x96, 0x8d, 0x31, 0x5c, 0x3b, 0xea, 0x1d, 0xa4, + 0x1d, 0x6b, 0x6b, 0x1d, 0x76, 0x93, 0x86, 0x09, 0x6b, 0x64, 0x87, 0x66, 0x87, 0xd9, 0xa4, 0x89, + 0xe6, 0x61, 0x0c, 0x68, 0xcd, 0x31, 0xb4, 0x3e, 0xc5, 0x86, 0xd1, 0x94, 0xf7, 0x49, 0x6d, 0xd3, + 0x72, 0x92, 0xed, 0x93, 0xba, 0xdc, 0xa9, 0xe4, 0xbf, 0xa4, 0x07, 0xaf, 0xf8, 0x73, 0xd5, 0xa3, + 0x1a, 0x3e, 0x13, 0x1c, 0xbc, 0x1a, 0xc4, 0x40, 0xfa, 0xf0, 0xbe, 0xe1, 0x90, 0x06, 0xcf, 0x61, + 0x9b, 0x23, 0x6b, 0x03, 0x23, 0x1b, 0x3a, 0x87, 0x69, 0x8e, 0xd1, 0x3c, 0xa4, 0x8f, 0xd7, 0xd7, + 0x43, 0x03, 0xe7, 0xeb, 0xc6, 0x38, 0x70, 0x7a, 0x2d, 0x33, 0x37, 0x64, 0xcb, 0x1c, 0x76, 0xff, + 0x87, 0xc9, 0x7a, 0x74, 0x03, 0xe6, 0x30, 0xfb, 0x3f, 0x31, 0x4c, 0xa4, 0x8f, 0xf8, 0xeb, 0x65, + 0xc8, 0xd5, 0xc7, 0x3f, 0x5e, 0x0e, 0x3b, 0x17, 0x21, 0xb2, 0xaa, 0x8f, 0x6c, 0xb8, 0x1c, 0x66, + 0x2e, 0x12, 0xc9, 0xc2, 0x18, 0x02, 0xef, 0x1f, 0x85, 0x19, 0xb2, 0x24, 0xe2, 0x6d, 0xb3, 0x7e, + 0x9d, 0x8d, 0x9a, 0x8f, 0xa4, 0xd8, 0x56, 0xef, 0x85, 0x49, 0x6f, 0xff, 0x8e, 0x8d, 0x9c, 0xf3, + 0x62, 0xed, 0xd3, 0xe3, 0x52, 0xf5, 0xff, 0x3f, 0x90, 0x33, 0xc4, 0xc8, 0xf7, 0x6a, 0x87, 0x75, + 0x86, 0x38, 0xd4, 0xfd, 0xda, 0x3f, 0x0d, 0x46, 0xd4, 0xff, 0x92, 0x1e, 0xe6, 0xbd, 0xfb, 0xb8, + 0xd9, 0x3e, 0xfb, 0xb8, 0x1f, 0x0a, 0x63, 0x59, 0xe7, 0xb1, 0xbc, 0x4b, 0x54, 0x84, 0x23, 0x1c, + 0x6b, 0xdf, 0xee, 0xc3, 0x79, 0x8e, 0x83, 0x73, 0xe1, 0x40, 0xbc, 0x8c, 0xe1, 0xe0, 0x63, 0x36, + 0x18, 0x73, 0x3f, 0x9c, 0x62, 0x3b, 0xee, 0x39, 0x55, 0x91, 0xdd, 0x77, 0xaa, 0x82, 0x6b, 0xe9, + 0xb9, 0x03, 0xb6, 0xf4, 0x0f, 0x87, 0xb5, 0xa3, 0xc1, 0x6b, 0xc7, 0xd3, 0xc5, 0x11, 0x19, 0xdd, + 0xc8, 0xfc, 0x0e, 0x5f, 0x3d, 0xce, 0x73, 0xea, 0x51, 0x3a, 0x18, 0x33, 0xe9, 0xeb, 0xc7, 0x1f, + 0x79, 0x13, 0xda, 0x43, 0x6e, 0xef, 0xc3, 0x6e, 0x15, 0x73, 0x42, 0x1c, 0xd9, 0xc8, 0x3d, 0xcc, + 0x56, 0xf1, 0x20, 0x4e, 0xc6, 0x10, 0x8b, 0x6d, 0x16, 0xa6, 0x09, 0x4f, 0xe7, 0xf5, 0xf6, 0x16, + 0x76, 0xd0, 0x2b, 0xa8, 0x8f, 0xa2, 0x17, 0xf9, 0x72, 0x44, 0xe1, 0x89, 0xa2, 0xce, 0xbb, 0x26, + 0xf5, 0xe8, 0xa0, 0x4c, 0xce, 0x87, 0x18, 0x1c, 0x77, 0x04, 0xc5, 0x81, 0x1c, 0xa4, 0x0f, 0xd9, + 0x07, 0xa8, 0xbb, 0xcd, 0xaa, 0x76, 0xd9, 0xdc, 0x75, 0xd0, 0x43, 0x23, 0xe8, 0xa0, 0x17, 0x20, + 0xdf, 0x21, 0xd4, 0xd8, 0xb1, 0x8c, 0xf8, 0xe9, 0x0e, 0x13, 0x01, 0x2d, 0x5f, 0x65, 0x7f, 0x26, + 0x3d, 0x9b, 0x11, 0xc8, 0x91, 0xd2, 0x19, 0xf7, 0xd9, 0x8c, 0x01, 0xe5, 0x8f, 0xe5, 0x8e, 0x9d, + 0x49, 0xb7, 0x74, 0x7d, 0x47, 0x77, 0x46, 0x14, 0xc1, 0xa1, 0xe3, 0xd2, 0xf2, 0x22, 0x38, 0x90, + 0x97, 0xa4, 0x27, 0x46, 0x43, 0x52, 0x71, 0x7f, 0x1f, 0xf7, 0x89, 0xd1, 0xf8, 0xe2, 0xd3, 0xc7, + 0xe4, 0xd7, 0x68, 0xcb, 0x3a, 0x47, 0x9d, 0x6f, 0x53, 0xf4, 0xeb, 0x1d, 0xba, 0xb1, 0x50, 0xd6, + 0x0e, 0xaf, 0xb1, 0xf4, 0x2d, 0x3f, 0x7d, 0x60, 0xfe, 0xdb, 0x0f, 0x42, 0x6e, 0x11, 0x5f, 0xd8, + 0xdd, 0x42, 0x77, 0xc2, 0x64, 0xc3, 0xc2, 0xb8, 0x62, 0x6c, 0x9a, 0xae, 0x74, 0x1d, 0xf7, 0xd9, + 0x83, 0x84, 0xbd, 0xb9, 0x78, 0x6c, 0x63, 0xad, 0x1d, 0x9c, 0x3f, 0xf3, 0x5e, 0xd1, 0x8b, 0x24, + 0xc8, 0xd6, 0x1d, 0xcd, 0x41, 0x53, 0x3e, 0xb6, 0xe8, 0xa1, 0x30, 0x16, 0x77, 0xf2, 0x58, 0xdc, + 0xc0, 0xc9, 0x82, 0x70, 0x30, 0xef, 0xfe, 0x1f, 0x01, 0x00, 0x82, 0xc9, 0x07, 0x6c, 0xd3, 0x70, + 0x73, 0x78, 0x47, 0x20, 0xbd, 0x77, 0xf4, 0x32, 0x5f, 0xdc, 0x77, 0x73, 0xe2, 0x7e, 0xbc, 0x58, + 0x11, 0x63, 0x58, 0x69, 0x93, 0x60, 0xca, 0x15, 0xed, 0x0a, 0xd6, 0xda, 0x36, 0xfa, 0x81, 0x40, + 0xf9, 0x23, 0xc4, 0x8c, 0xde, 0x23, 0x1c, 0x8c, 0x93, 0xd6, 0xca, 0x27, 0x1e, 0xed, 0xd1, 0xe1, + 0x6d, 0xfe, 0x4b, 0x7c, 0x30, 0x92, 0x5b, 0x20, 0xab, 0x1b, 0x9b, 0x26, 0xf3, 0x2f, 0xbc, 0x3a, + 0x82, 0xb6, 0xab, 0x13, 0x2a, 0xc9, 0x28, 0x18, 0xa9, 0x33, 0x9e, 0xad, 0xb1, 0x5c, 0x7a, 0x97, + 0x75, 0x4b, 0x47, 0xff, 0xe7, 0x40, 0x61, 0x2b, 0x0a, 0x64, 0xbb, 0x9a, 0xb3, 0xcd, 0x8a, 0x26, + 0xcf, 0xae, 0x8d, 0xbc, 0x6b, 0x68, 0x86, 0x69, 0x5c, 0xde, 0xd1, 0x9f, 0xe9, 0xdf, 0xad, 0xcb, + 0xa5, 0xb9, 0x9c, 0x6f, 0x61, 0x03, 0x5b, 0x9a, 0x83, 0xeb, 0x7b, 0x5b, 0x64, 0x8e, 0x35, 0xa9, + 0x86, 0x93, 0x12, 0xeb, 0xbf, 0xcb, 0x71, 0xb4, 0xfe, 0x6f, 0xea, 0x1d, 0x4c, 0x22, 0x35, 0x31, + 0xfd, 0xf7, 0xde, 0x13, 0xe9, 0x7f, 0x9f, 0x22, 0xd2, 0x47, 0xe3, 0xdb, 0x12, 0xcc, 0xd4, 0x5d, + 0x85, 0xab, 0xef, 0xee, 0xec, 0x68, 0xd6, 0x65, 0x74, 0x5d, 0x80, 0x4a, 0x48, 0x35, 0x33, 0xbc, + 0x5f, 0xca, 0x1f, 0x0a, 0x5f, 0x2b, 0xcd, 0x9a, 0x76, 0xa8, 0x84, 0xc4, 0xed, 0xe0, 0x89, 0x90, + 0x73, 0xd5, 0xdb, 0xf3, 0xb8, 0x8c, 0x6d, 0x08, 0x34, 0xa7, 0x60, 0x44, 0xab, 0x81, 0xbc, 0x8d, + 0x21, 0x9a, 0x86, 0x04, 0x47, 0xeb, 0x8e, 0xd6, 0xba, 0xb8, 0x6c, 0x5a, 0xe6, 0xae, 0xa3, 0x1b, + 0xd8, 0x46, 0x8f, 0x09, 0x10, 0xf0, 0xf4, 0x3f, 0x13, 0xe8, 0x3f, 0xfa, 0x6e, 0x46, 0x74, 0x14, + 0xf5, 0xbb, 0xd5, 0x30, 0xf9, 0x88, 0x00, 0x55, 0x62, 0xe3, 0xa2, 0x08, 0xc5, 0xf4, 0x85, 0xf6, + 0x3a, 0x19, 0x0a, 0xe5, 0x07, 0xbb, 0xa6, 0xe5, 0xac, 0x9a, 0x2d, 0xad, 0x63, 0x3b, 0xa6, 0x85, + 0x51, 0x2d, 0x56, 0x6a, 0x6e, 0x0f, 0xd3, 0x36, 0x5b, 0xc1, 0xe0, 0xc8, 0xde, 0xc2, 0x6a, 0x27, + 0xf3, 0x3a, 0xfe, 0x01, 0xe1, 0x5d, 0x46, 0x2a, 0x95, 0x5e, 0x8e, 0x22, 0xf4, 0xbc, 0x5f, 0x97, + 0x96, 0xec, 0xb0, 0x84, 0xd8, 0xce, 0xa3, 0x10, 0x53, 0x63, 0x58, 0x2a, 0x97, 0x60, 0xb6, 0xbe, + 0x7b, 0xc1, 0x27, 0x62, 0x87, 0x8d, 0x90, 0x57, 0x0a, 0x47, 0xa9, 0x60, 0x8a, 0x17, 0x26, 0x14, + 0x21, 0xdf, 0xeb, 0x61, 0xd6, 0x0e, 0x67, 0x63, 0x78, 0xf3, 0x89, 0x82, 0xd1, 0x29, 0x06, 0x97, + 0x9a, 0xbe, 0x00, 0xdf, 0x21, 0xc1, 0x6c, 0xad, 0x8b, 0x0d, 0xdc, 0xa6, 0x5e, 0x90, 0x9c, 0x00, + 0x5f, 0x94, 0x50, 0x80, 0x1c, 0xa1, 0x08, 0x01, 0x06, 0x1e, 0xcb, 0x8b, 0x9e, 0xf0, 0x82, 0x84, + 0x44, 0x82, 0x8b, 0x2b, 0x2d, 0x7d, 0xc1, 0x7d, 0x4e, 0x82, 0x69, 0x75, 0xd7, 0x58, 0xb7, 0x4c, + 0x77, 0x34, 0xb6, 0xd0, 0x5d, 0x41, 0x07, 0x71, 0x33, 0x1c, 0x6b, 0xef, 0x5a, 0x64, 0xfd, 0xa9, + 0x62, 0xd4, 0x71, 0xcb, 0x34, 0xda, 0x36, 0xa9, 0x47, 0x4e, 0xdd, 0xff, 0xe1, 0x8e, 0xec, 0x73, + 0xbf, 0x22, 0x67, 0xd0, 0xf3, 0x84, 0x43, 0xdd, 0xd0, 0xca, 0x87, 0x8a, 0x16, 0xef, 0x09, 0x04, + 0x03, 0xda, 0x0c, 0x2a, 0x21, 0x7d, 0xe1, 0x7e, 0x4a, 0x02, 0xa5, 0xd8, 0x6a, 0x99, 0xbb, 0x86, + 0x53, 0xc7, 0x1d, 0xdc, 0x72, 0x1a, 0x96, 0xd6, 0xc2, 0x61, 0xfb, 0xb9, 0x00, 0x72, 0x5b, 0xb7, + 0x58, 0x1f, 0xec, 0x3e, 0x32, 0x39, 0xbe, 0x48, 0x78, 0xc7, 0x91, 0xd6, 0x72, 0x7f, 0x29, 0x09, + 0xc4, 0x29, 0xb6, 0xaf, 0x28, 0x58, 0x50, 0xfa, 0x52, 0xfd, 0xb0, 0x04, 0x53, 0x5e, 0x8f, 0xbd, + 0x25, 0x22, 0xcc, 0x5f, 0x4b, 0x38, 0x19, 0xf1, 0x89, 0x27, 0x90, 0xe1, 0x5b, 0x12, 0xcc, 0x2a, + 0xa2, 0xe8, 0x27, 0x13, 0x5d, 0x31, 0xb9, 0xe8, 0xdc, 0xd7, 0x6a, 0xad, 0xb9, 0x54, 0x5b, 0x5d, + 0x2c, 0xab, 0x05, 0x19, 0x7d, 0x5e, 0x82, 0xec, 0xba, 0x6e, 0x6c, 0x85, 0xa3, 0x2b, 0x1d, 0x77, + 0xed, 0xc8, 0x36, 0x7e, 0x90, 0xb5, 0x74, 0xfa, 0xa2, 0xdc, 0x06, 0xc7, 0x8d, 0xdd, 0x9d, 0x0b, + 0xd8, 0xaa, 0x6d, 0x92, 0x51, 0xd6, 0x6e, 0x98, 0x75, 0x6c, 0x50, 0x23, 0x34, 0xa7, 0xf6, 0xfd, + 0xc6, 0x9b, 0x60, 0x02, 0x93, 0x07, 0x97, 0x93, 0x08, 0x89, 0xfb, 0x4c, 0x49, 0x21, 0xa6, 0x12, + 0x4d, 0x1b, 0xfa, 0x10, 0x4f, 0x5f, 0x53, 0xff, 0x38, 0x07, 0x27, 0x8a, 0xc6, 0x65, 0x62, 0x53, + 0xd0, 0x0e, 0xbe, 0xb4, 0xad, 0x19, 0x5b, 0x98, 0x0c, 0x10, 0xbe, 0xc4, 0xc3, 0x21, 0xfa, 0x33, + 0x7c, 0x88, 0x7e, 0x45, 0x85, 0x09, 0xd3, 0x6a, 0x63, 0x6b, 0xe1, 0x32, 0xe1, 0xa9, 0x77, 0xd9, + 0x99, 0xb5, 0xc9, 0x7e, 0x45, 0xcc, 0x33, 0xf2, 0xf3, 0x35, 0xfa, 0xbf, 0xea, 0x11, 0x3a, 0x7b, + 0x33, 0x4c, 0xb0, 0x34, 0x65, 0x06, 0x26, 0x6b, 0xea, 0x62, 0x59, 0x6d, 0x56, 0x16, 0x0b, 0x47, + 0x94, 0x2b, 0xe0, 0x68, 0xa5, 0x51, 0x56, 0x8b, 0x8d, 0x4a, 0xad, 0xda, 0x24, 0xe9, 0x85, 0x0c, + 0x7a, 0x4e, 0x56, 0xd4, 0xb3, 0x37, 0x9e, 0x99, 0x7e, 0xb0, 0xaa, 0x30, 0xd1, 0xa2, 0x19, 0xc8, + 0x10, 0x3a, 0x9d, 0xa8, 0x76, 0x8c, 0x20, 0x4d, 0x50, 0x3d, 0x42, 0xca, 0x69, 0x80, 0x4b, 0x96, + 0x69, 0x6c, 0x05, 0xa7, 0x0e, 0x27, 0xd5, 0x50, 0x0a, 0x7a, 0x28, 0x03, 0x79, 0xfa, 0x0f, 0xb9, + 0x92, 0x84, 0x3c, 0x05, 0x82, 0xf7, 0xde, 0x5d, 0x8b, 0x97, 0xc8, 0x2b, 0x98, 0x68, 0xb1, 0x57, + 0x57, 0x17, 0xa9, 0x0c, 0xa8, 0x25, 0xcc, 0xaa, 0x72, 0x0b, 0xe4, 0xe9, 0xbf, 0xcc, 0xeb, 0x20, + 0x3a, 0xbc, 0x28, 0xcd, 0x26, 0xe8, 0xa7, 0x2c, 0x2e, 0xd3, 0xf4, 0xb5, 0xf9, 0xbd, 0x12, 0x4c, + 0x56, 0xb1, 0x53, 0xda, 0xc6, 0xad, 0x8b, 0xe8, 0x71, 0xfc, 0x02, 0x68, 0x47, 0xc7, 0x86, 0x73, + 0xff, 0x4e, 0xc7, 0x5f, 0x00, 0xf5, 0x12, 0xd0, 0xcf, 0x86, 0x3b, 0xdf, 0x7b, 0x78, 0xfd, 0xb9, + 0xa9, 0x4f, 0x5d, 0xbd, 0x12, 0x22, 0x54, 0xe6, 0x24, 0xe4, 0x2d, 0x6c, 0xef, 0x76, 0xbc, 0x45, + 0x34, 0xf6, 0x86, 0x1e, 0xf6, 0xc5, 0x59, 0xe2, 0xc4, 0x79, 0x8b, 0x78, 0x11, 0x63, 0x88, 0x57, + 0x9a, 0x85, 0x89, 0x8a, 0xa1, 0x3b, 0xba, 0xd6, 0x41, 0xcf, 0xcb, 0xc2, 0x6c, 0x1d, 0x3b, 0xeb, + 0x9a, 0xa5, 0xed, 0x60, 0x07, 0x5b, 0x36, 0xfa, 0x26, 0xdf, 0x27, 0x74, 0x3b, 0x9a, 0xb3, 0x69, + 0x5a, 0x3b, 0x9e, 0x6a, 0x7a, 0xef, 0xae, 0x6a, 0xee, 0x61, 0xcb, 0x0e, 0xf8, 0xf2, 0x5e, 0xdd, + 0x2f, 0x97, 0x4c, 0xeb, 0xa2, 0x3b, 0x08, 0xb2, 0x69, 0x1a, 0x7b, 0x75, 0xe9, 0x75, 0xcc, 0xad, + 0x55, 0xbc, 0x87, 0xbd, 0x70, 0x69, 0xfe, 0xbb, 0x3b, 0x17, 0x68, 0x9b, 0x55, 0xd3, 0x71, 0x3b, + 0xed, 0x55, 0x73, 0x8b, 0xc6, 0x8b, 0x9d, 0x54, 0xf9, 0xc4, 0x20, 0x97, 0xb6, 0x87, 0x49, 0xae, + 0x7c, 0x38, 0x17, 0x4b, 0x54, 0xe6, 0x41, 0xf1, 0x7f, 0x6b, 0xe0, 0x0e, 0xde, 0xc1, 0x8e, 0x75, + 0x99, 0x5c, 0x0b, 0x31, 0xa9, 0xf6, 0xf9, 0xc2, 0x06, 0x68, 0xf1, 0xc9, 0x3a, 0x93, 0xde, 0x3c, + 0x27, 0xb9, 0x03, 0x4d, 0xd6, 0x45, 0x28, 0x8e, 0xe5, 0xda, 0x2b, 0xd9, 0xb5, 0x66, 0x5e, 0x2c, + 0x43, 0x96, 0x0c, 0x9e, 0xaf, 0xcf, 0x70, 0x2b, 0x4c, 0x3b, 0xd8, 0xb6, 0xb5, 0x2d, 0xec, 0xad, + 0x30, 0xb1, 0x57, 0xe5, 0x76, 0xc8, 0x75, 0x08, 0xa6, 0x74, 0x70, 0xb8, 0x8e, 0xab, 0x99, 0x6b, + 0x60, 0xb8, 0xb4, 0xfc, 0x91, 0x80, 0xc0, 0xad, 0xd2, 0x3f, 0xce, 0xde, 0x0b, 0x39, 0x0a, 0xff, + 0x14, 0xe4, 0x16, 0xcb, 0x0b, 0x1b, 0xcb, 0x85, 0x23, 0xee, 0xa3, 0xc7, 0xdf, 0x14, 0xe4, 0x96, + 0x8a, 0x8d, 0xe2, 0x6a, 0x41, 0x72, 0xeb, 0x51, 0xa9, 0x2e, 0xd5, 0x0a, 0xb2, 0x9b, 0xb8, 0x5e, + 0xac, 0x56, 0x4a, 0x85, 0xac, 0x32, 0x0d, 0x13, 0xe7, 0x8b, 0x6a, 0xb5, 0x52, 0x5d, 0x2e, 0xe4, + 0xd0, 0xdf, 0x85, 0xf1, 0xbb, 0x83, 0xc7, 0xef, 0xfa, 0x28, 0x9e, 0xfa, 0x41, 0xf6, 0x12, 0x1f, + 0xb2, 0xbb, 0x38, 0xc8, 0x7e, 0x50, 0x84, 0xc8, 0x18, 0xdc, 0x99, 0xf2, 0x30, 0xb1, 0x6e, 0x99, + 0x2d, 0x6c, 0xdb, 0xe8, 0xd7, 0x25, 0xc8, 0x97, 0x34, 0xa3, 0x85, 0x3b, 0xe8, 0xaa, 0x00, 0x2a, + 0xea, 0x2a, 0x9a, 0xf1, 0x4f, 0x8b, 0xfd, 0x53, 0x46, 0xb4, 0xf7, 0x63, 0x74, 0xe7, 0x29, 0xcd, + 0x08, 0xf9, 0x88, 0xf5, 0x72, 0xb1, 0xa4, 0xc6, 0x70, 0x35, 0x8e, 0x04, 0x53, 0x6c, 0x35, 0xe0, + 0x02, 0x0e, 0xcf, 0xc3, 0xbf, 0x99, 0x11, 0x9d, 0x1c, 0x7a, 0x35, 0xf0, 0xc9, 0x44, 0xc8, 0x43, + 0x6c, 0x22, 0x38, 0x88, 0xda, 0x18, 0x36, 0x0f, 0x25, 0x98, 0xde, 0x30, 0xec, 0x7e, 0x42, 0x11, + 0x8f, 0xa3, 0xef, 0x55, 0x23, 0x44, 0xe8, 0x40, 0x71, 0xf4, 0x07, 0xd3, 0x4b, 0x5f, 0x30, 0xdf, + 0xcc, 0xc0, 0xf1, 0x65, 0x6c, 0x60, 0x4b, 0x6f, 0xd1, 0x1a, 0x78, 0x92, 0xb8, 0x8b, 0x97, 0xc4, + 0xe3, 0x38, 0xce, 0xfb, 0xfd, 0xc1, 0x4b, 0xe0, 0xe5, 0xbe, 0x04, 0xee, 0xe1, 0x24, 0x70, 0xb3, + 0x20, 0x9d, 0x31, 0xdc, 0x87, 0x3e, 0x05, 0x33, 0x55, 0xd3, 0xd1, 0x37, 0xf5, 0x16, 0xf5, 0x41, + 0xfb, 0x4d, 0x19, 0xb2, 0xab, 0xba, 0xed, 0xa0, 0x62, 0xd0, 0x9d, 0x9c, 0x81, 0x69, 0xdd, 0x68, + 0x75, 0x76, 0xdb, 0x58, 0xc5, 0x1a, 0xed, 0x57, 0x26, 0xd5, 0x70, 0x52, 0xb0, 0xb5, 0xef, 0xb2, + 0x25, 0x7b, 0x5b, 0xfb, 0x1f, 0x17, 0x5e, 0x86, 0x09, 0xb3, 0x40, 0x02, 0x52, 0x46, 0xd8, 0x5d, + 0x45, 0x98, 0x35, 0x42, 0x59, 0x3d, 0x83, 0xbd, 0xf7, 0x42, 0x81, 0x30, 0x39, 0x95, 0xff, 0x03, + 0xbd, 0x4b, 0xa8, 0xb1, 0x0e, 0x62, 0x28, 0x19, 0x32, 0x4b, 0x43, 0x4c, 0x92, 0x15, 0x98, 0xab, + 0x54, 0x1b, 0x65, 0xb5, 0x5a, 0x5c, 0x65, 0x59, 0x64, 0xf4, 0x6d, 0x09, 0x72, 0x2a, 0xee, 0x76, + 0x2e, 0x87, 0x23, 0x46, 0x33, 0x47, 0xf1, 0x8c, 0xef, 0x28, 0xae, 0x2c, 0x01, 0x68, 0x2d, 0xb7, + 0x60, 0x72, 0xa5, 0x96, 0xd4, 0x37, 0x8e, 0x29, 0x57, 0xc1, 0xa2, 0x9f, 0x5b, 0x0d, 0xfd, 0x89, + 0x9e, 0x2f, 0xbc, 0x73, 0xc4, 0x51, 0x23, 0x1c, 0x46, 0xf4, 0x09, 0xef, 0x16, 0xda, 0xec, 0x19, + 0x48, 0xee, 0x70, 0xc4, 0xff, 0x05, 0x09, 0xb2, 0x0d, 0xb7, 0xb7, 0x0c, 0x75, 0x9c, 0x1f, 0x1b, + 0x4e, 0xc7, 0x5d, 0x32, 0x11, 0x3a, 0x7e, 0x37, 0xcc, 0x84, 0x35, 0x96, 0xb9, 0x4a, 0xc4, 0xaa, + 0x38, 0xf7, 0xc3, 0x30, 0x1a, 0xde, 0x87, 0x9d, 0xc3, 0x11, 0xf1, 0x47, 0x1e, 0x0f, 0xb0, 0x86, + 0x77, 0x2e, 0x60, 0xcb, 0xde, 0xd6, 0xbb, 0xe8, 0xef, 0x65, 0x98, 0x5a, 0xc6, 0x4e, 0xdd, 0xd1, + 0x9c, 0x5d, 0xbb, 0x67, 0xbb, 0xd3, 0x30, 0x4b, 0x5a, 0x6b, 0x1b, 0xb3, 0xee, 0xc8, 0x7b, 0x45, + 0x6f, 0x93, 0x45, 0xfd, 0x89, 0x82, 0x72, 0xe6, 0xfd, 0x32, 0x22, 0x30, 0x79, 0x02, 0x64, 0xdb, + 0x9a, 0xa3, 0x31, 0x2c, 0xae, 0xea, 0xc1, 0x22, 0x20, 0xa4, 0x92, 0x6c, 0xe8, 0x77, 0x24, 0x11, + 0x87, 0x22, 0x81, 0xf2, 0x93, 0x81, 0xf0, 0xae, 0xcc, 0x10, 0x28, 0x1c, 0x83, 0xd9, 0x6a, 0xad, + 0xd1, 0x5c, 0xad, 0x2d, 0x2f, 0x97, 0xdd, 0xd4, 0x82, 0xac, 0x9c, 0x04, 0x65, 0xbd, 0x78, 0xff, + 0x5a, 0xb9, 0xda, 0x68, 0x56, 0x6b, 0x8b, 0x65, 0xf6, 0x67, 0x56, 0x39, 0x0a, 0xd3, 0xa5, 0x62, + 0x69, 0xc5, 0x4b, 0xc8, 0x29, 0xa7, 0xe0, 0xf8, 0x5a, 0x79, 0x6d, 0xa1, 0xac, 0xd6, 0x57, 0x2a, + 0xeb, 0x4d, 0x97, 0xcc, 0x52, 0x6d, 0xa3, 0xba, 0x58, 0xc8, 0x2b, 0x08, 0x4e, 0x86, 0xbe, 0x9c, + 0x57, 0x6b, 0xd5, 0xe5, 0x66, 0xbd, 0x51, 0x6c, 0x94, 0x0b, 0x13, 0xca, 0x15, 0x70, 0xb4, 0x54, + 0xac, 0x92, 0xec, 0xa5, 0x5a, 0xb5, 0x5a, 0x2e, 0x35, 0x0a, 0x93, 0xe8, 0xbb, 0x59, 0x98, 0xae, + 0xd8, 0x55, 0x6d, 0x07, 0x9f, 0xd3, 0x3a, 0x7a, 0x1b, 0x3d, 0x2f, 0x34, 0xf3, 0xb8, 0x1e, 0x66, + 0x2d, 0xfa, 0x88, 0xdb, 0x0d, 0x1d, 0x53, 0x34, 0x67, 0x55, 0x3e, 0xd1, 0x9d, 0x93, 0x1b, 0x84, + 0x80, 0x37, 0x27, 0xa7, 0x6f, 0xca, 0x02, 0x00, 0x7d, 0x6a, 0x04, 0x97, 0xbb, 0x9e, 0xed, 0x6d, + 0x4d, 0xda, 0x0e, 0xb6, 0xb1, 0xb5, 0xa7, 0xb7, 0xb0, 0x97, 0x53, 0x0d, 0xfd, 0x85, 0xbe, 0x28, + 0x8b, 0xee, 0x2f, 0x86, 0x40, 0x0d, 0x55, 0x27, 0xa2, 0x37, 0xfc, 0x39, 0x59, 0x64, 0x77, 0x50, + 0x88, 0x64, 0x32, 0x4d, 0xf9, 0x25, 0x69, 0xb8, 0x65, 0xdb, 0x46, 0xad, 0xd6, 0xac, 0xaf, 0xd4, + 0xd4, 0x46, 0x41, 0x56, 0x66, 0x60, 0xd2, 0x7d, 0x5d, 0xad, 0x55, 0x97, 0x0b, 0x59, 0xe5, 0x04, + 0x1c, 0x5b, 0x29, 0xd6, 0x9b, 0x95, 0xea, 0xb9, 0xe2, 0x6a, 0x65, 0xb1, 0x59, 0x5a, 0x29, 0xaa, + 0xf5, 0x42, 0x4e, 0xb9, 0x0a, 0x4e, 0x34, 0x2a, 0x65, 0xb5, 0xb9, 0x54, 0x2e, 0x36, 0x36, 0xd4, + 0x72, 0xbd, 0x59, 0xad, 0x35, 0xab, 0xc5, 0xb5, 0x72, 0x21, 0xef, 0x36, 0x7f, 0xf2, 0x29, 0x50, + 0x9b, 0x89, 0xfd, 0xca, 0x38, 0x19, 0xa1, 0x8c, 0x53, 0xbd, 0xca, 0x08, 0x61, 0xb5, 0x52, 0xcb, + 0xf5, 0xb2, 0x7a, 0xae, 0x5c, 0x98, 0xee, 0xa7, 0x6b, 0x33, 0xca, 0x71, 0x28, 0xb8, 0x3c, 0x34, + 0x2b, 0x75, 0x2f, 0xe7, 0x62, 0x61, 0x16, 0x7d, 0x38, 0x0f, 0x27, 0x55, 0xbc, 0xa5, 0xdb, 0x0e, + 0xb6, 0xd6, 0xb5, 0xcb, 0x3b, 0xd8, 0x70, 0xbc, 0x4e, 0xfe, 0x5f, 0x13, 0x2b, 0xe3, 0x1a, 0xcc, + 0x76, 0x29, 0x8d, 0x35, 0xec, 0x6c, 0x9b, 0x6d, 0x36, 0x0a, 0x3f, 0x2e, 0xb2, 0xe7, 0x98, 0x5f, + 0x0f, 0x67, 0x57, 0xf9, 0xbf, 0x43, 0xba, 0x2d, 0xc7, 0xe8, 0x76, 0x76, 0x18, 0xdd, 0x56, 0xae, + 0x81, 0xa9, 0x5d, 0x1b, 0x5b, 0xe5, 0x1d, 0x4d, 0xef, 0x78, 0x97, 0x73, 0xfa, 0x09, 0xe8, 0xcd, + 0x59, 0xd1, 0x13, 0x2b, 0xa1, 0xba, 0xf4, 0x17, 0x63, 0x44, 0xdf, 0x7a, 0x1a, 0x80, 0x55, 0x76, + 0xc3, 0xea, 0x30, 0x65, 0x0d, 0xa5, 0xb8, 0xfc, 0x5d, 0xd0, 0x3b, 0x1d, 0xdd, 0xd8, 0xf2, 0xf7, + 0xfd, 0x83, 0x04, 0xf4, 0x4b, 0xb2, 0xc8, 0x09, 0x96, 0xa4, 0xbc, 0x25, 0x6b, 0x4d, 0xcf, 0x97, + 0xc6, 0xdc, 0xef, 0xee, 0x6f, 0x3a, 0x79, 0xa5, 0x00, 0x33, 0x24, 0x8d, 0xb5, 0xc0, 0xc2, 0x84, + 0xdb, 0x07, 0x7b, 0xe4, 0xd6, 0xca, 0x8d, 0x95, 0xda, 0xa2, 0xff, 0x6d, 0xd2, 0x25, 0xe9, 0x32, + 0x53, 0xac, 0xde, 0x4f, 0x5a, 0xe3, 0x94, 0xf2, 0x18, 0xb8, 0x2a, 0xd4, 0x61, 0x17, 0x57, 0xd5, + 0x72, 0x71, 0xf1, 0xfe, 0x66, 0xf9, 0x19, 0x95, 0x7a, 0xa3, 0xce, 0x37, 0x2e, 0xaf, 0x1d, 0x4d, + 0xbb, 0xfc, 0x96, 0xd7, 0x8a, 0x95, 0x55, 0xd6, 0xbf, 0x2f, 0xd5, 0xd4, 0xb5, 0x62, 0xa3, 0x30, + 0x83, 0x5e, 0x2c, 0x43, 0x61, 0x19, 0x3b, 0xeb, 0xa6, 0xe5, 0x68, 0x9d, 0x55, 0xdd, 0xb8, 0xb8, + 0x61, 0x75, 0xb8, 0xc9, 0xa6, 0x70, 0x98, 0x0e, 0x7e, 0x88, 0xe4, 0x08, 0x46, 0xef, 0x88, 0x77, + 0x49, 0xb6, 0x40, 0x99, 0x82, 0x04, 0xf4, 0x2c, 0x49, 0x64, 0xb9, 0x5b, 0xbc, 0xd4, 0x64, 0x7a, + 0xf2, 0xec, 0x71, 0x8f, 0xcf, 0x7d, 0x50, 0xcb, 0xa3, 0xe7, 0x66, 0x61, 0x72, 0x49, 0x37, 0xb4, + 0x8e, 0xfe, 0x4c, 0x2e, 0x7e, 0x69, 0xd0, 0xc7, 0x64, 0x62, 0xfa, 0x18, 0x69, 0xa8, 0xf1, 0xf3, + 0x57, 0x65, 0xd1, 0xe5, 0x85, 0x90, 0xec, 0x3d, 0x26, 0x23, 0x06, 0xcf, 0xf7, 0x49, 0x22, 0xcb, + 0x0b, 0x83, 0xe9, 0x25, 0xc3, 0xf0, 0xa3, 0xdf, 0x1b, 0x36, 0x56, 0x4f, 0xfb, 0x9e, 0xec, 0xa7, + 0x0a, 0x53, 0xe8, 0xcf, 0x65, 0x40, 0xcb, 0xd8, 0x39, 0x87, 0x2d, 0x7f, 0x2a, 0x40, 0x7a, 0x7d, + 0x66, 0x6f, 0x87, 0x9a, 0xec, 0xeb, 0xc3, 0x00, 0x9e, 0xe7, 0x01, 0x2c, 0xc6, 0x34, 0x9e, 0x08, + 0xd2, 0x11, 0x8d, 0xb7, 0x02, 0x79, 0x9b, 0x7c, 0x67, 0x6a, 0xf6, 0xc4, 0xe8, 0xe1, 0x92, 0x10, + 0x0b, 0x53, 0xa7, 0x84, 0x55, 0x46, 0x00, 0x7d, 0xcb, 0x9f, 0x04, 0xfd, 0x28, 0xa7, 0x1d, 0x4b, + 0x07, 0x66, 0x36, 0x99, 0xbe, 0x58, 0xe9, 0xaa, 0x4b, 0x3f, 0xfb, 0x06, 0xbd, 0x2f, 0x07, 0xc7, + 0xfb, 0x55, 0x07, 0xfd, 0x6e, 0x86, 0xdb, 0x61, 0xc7, 0x64, 0xc8, 0xcf, 0xb0, 0x0d, 0x44, 0xf7, + 0x45, 0x79, 0x32, 0x9c, 0xf0, 0x97, 0xe1, 0x1a, 0x66, 0x15, 0x5f, 0xb2, 0x3b, 0xd8, 0x71, 0xb0, + 0x45, 0xaa, 0x36, 0xa9, 0xf6, 0xff, 0xa8, 0x3c, 0x15, 0xae, 0xd4, 0x0d, 0x5b, 0x6f, 0x63, 0xab, + 0xa1, 0x77, 0xed, 0xa2, 0xd1, 0x6e, 0xec, 0x3a, 0xa6, 0xa5, 0x6b, 0xec, 0x2a, 0xc9, 0x49, 0x35, + 0xea, 0xb3, 0x72, 0x13, 0x14, 0x74, 0xbb, 0x66, 0x5c, 0x30, 0x35, 0xab, 0xad, 0x1b, 0x5b, 0xab, + 0xba, 0xed, 0x30, 0x0f, 0xe0, 0x7d, 0xe9, 0xe8, 0x1f, 0x64, 0xd1, 0xc3, 0x74, 0x03, 0x60, 0x8d, + 0xe8, 0x50, 0x7e, 0x56, 0x16, 0x39, 0x1e, 0x97, 0x8c, 0x76, 0x32, 0x65, 0x79, 0xce, 0xb8, 0x0d, + 0x89, 0xfe, 0x23, 0x38, 0xe9, 0x5a, 0x68, 0xba, 0x67, 0x08, 0x9c, 0x2b, 0xab, 0x95, 0xa5, 0x4a, + 0xd9, 0x35, 0x2b, 0x4e, 0xc0, 0xb1, 0xe0, 0xdb, 0xe2, 0xfd, 0xcd, 0x7a, 0xb9, 0xda, 0x28, 0x4c, + 0xba, 0xfd, 0x14, 0x4d, 0x5e, 0x2a, 0x56, 0x56, 0xcb, 0x8b, 0xcd, 0x46, 0xcd, 0xfd, 0xb2, 0x38, + 0x9c, 0x69, 0x81, 0x1e, 0xca, 0xc2, 0x51, 0x22, 0xdb, 0xcb, 0x44, 0xaa, 0xae, 0x50, 0x7a, 0x7c, + 0x6d, 0x7d, 0x80, 0xa6, 0xa8, 0x78, 0xd1, 0x27, 0x85, 0x6f, 0xca, 0x0c, 0x41, 0xd8, 0x53, 0x46, + 0x84, 0x66, 0x7c, 0x53, 0x12, 0x89, 0x50, 0x21, 0x4c, 0x36, 0x99, 0x52, 0xfc, 0xdb, 0xb8, 0x47, + 0x9c, 0x68, 0xf0, 0x89, 0x95, 0x59, 0x22, 0x3f, 0x3f, 0x63, 0xbd, 0xa2, 0x12, 0x75, 0x98, 0x03, + 0x20, 0x29, 0x44, 0x83, 0xa8, 0x1e, 0xf4, 0x1d, 0xaf, 0xa2, 0xf4, 0xa0, 0x58, 0x6a, 0x54, 0xce, + 0x95, 0xa3, 0xf4, 0xe0, 0x13, 0x32, 0x4c, 0x2e, 0x63, 0xc7, 0x9d, 0x53, 0xd9, 0xe8, 0x69, 0x02, + 0xeb, 0x3f, 0xae, 0x19, 0xd3, 0x31, 0x5b, 0x5a, 0xc7, 0x5f, 0x06, 0xa0, 0x6f, 0xe8, 0x67, 0x86, + 0x31, 0x41, 0xbc, 0xa2, 0x23, 0xc6, 0xab, 0x1f, 0x86, 0x9c, 0xe3, 0x7e, 0x66, 0xcb, 0xd0, 0x3f, + 0x10, 0x39, 0x5c, 0xb9, 0x44, 0x16, 0x35, 0x47, 0x53, 0x69, 0xfe, 0xd0, 0xe8, 0x24, 0x68, 0xbb, + 0x44, 0x30, 0xf2, 0xbd, 0x68, 0x7f, 0xfe, 0x9d, 0x0c, 0x27, 0x68, 0xfb, 0x28, 0x76, 0xbb, 0x75, + 0xc7, 0xb4, 0xb0, 0x8a, 0x5b, 0x58, 0xef, 0x3a, 0x3d, 0xeb, 0x7b, 0x16, 0x4d, 0xf5, 0x36, 0x9b, + 0xd9, 0x2b, 0x7a, 0x8d, 0x2c, 0x1a, 0x83, 0x79, 0x5f, 0x7b, 0xec, 0x29, 0x2f, 0xa2, 0xb1, 0x7f, + 0x48, 0x12, 0x89, 0xaa, 0x9c, 0x90, 0x78, 0x32, 0xa0, 0xde, 0x7f, 0x08, 0x40, 0x79, 0x2b, 0x37, + 0x6a, 0xb9, 0x54, 0xae, 0xac, 0xbb, 0x83, 0xc0, 0xb5, 0x70, 0xf5, 0xfa, 0x86, 0x5a, 0x5a, 0x29, + 0xd6, 0xcb, 0x4d, 0xb5, 0xbc, 0x5c, 0xa9, 0x37, 0x98, 0x53, 0x16, 0xfd, 0x6b, 0x42, 0xb9, 0x06, + 0x4e, 0xd5, 0x37, 0x16, 0xea, 0x25, 0xb5, 0xb2, 0x4e, 0xd2, 0xd5, 0x72, 0xb5, 0x7c, 0x9e, 0x7d, + 0x9d, 0x44, 0xef, 0x29, 0xc0, 0xb4, 0x3b, 0x01, 0xa8, 0xd3, 0x79, 0x01, 0xfa, 0x5a, 0x16, 0xa6, + 0x55, 0x6c, 0x9b, 0x9d, 0x3d, 0x32, 0x47, 0x18, 0xd7, 0xd4, 0xe3, 0x1b, 0xb2, 0xe8, 0xf9, 0xed, + 0x10, 0xb3, 0xf3, 0x21, 0x46, 0xa3, 0x27, 0x9a, 0xda, 0x9e, 0xa6, 0x77, 0xb4, 0x0b, 0xac, 0xab, + 0x99, 0x54, 0x83, 0x04, 0x65, 0x1e, 0x14, 0xf3, 0x92, 0x81, 0xad, 0x7a, 0xeb, 0x52, 0xd9, 0xd9, + 0x2e, 0xb6, 0xdb, 0x16, 0xb6, 0x6d, 0xb6, 0x7a, 0xd1, 0xe7, 0x8b, 0x72, 0x23, 0x1c, 0x25, 0xa9, + 0xa1, 0xcc, 0xd4, 0x41, 0xa6, 0x37, 0xd9, 0xcf, 0x59, 0x34, 0x2e, 0x7b, 0x39, 0x73, 0xa1, 0x9c, + 0x41, 0x72, 0xf8, 0xb8, 0x44, 0x9e, 0x3f, 0xa5, 0x73, 0x06, 0xa6, 0x0d, 0x6d, 0x07, 0x97, 0x1f, + 0xec, 0xea, 0x16, 0xb6, 0x89, 0x63, 0x8c, 0xac, 0x86, 0x93, 0xd0, 0xfb, 0x84, 0xce, 0x9b, 0x8b, + 0x49, 0x2c, 0x99, 0xee, 0x2f, 0x0f, 0xa1, 0xfa, 0x7d, 0xfa, 0x19, 0x19, 0xbd, 0x47, 0x86, 0x19, + 0xc6, 0x54, 0xd1, 0xb8, 0x5c, 0x69, 0xa3, 0x6b, 0x39, 0xe3, 0x57, 0x73, 0xd3, 0x3c, 0xe3, 0x97, + 0xbc, 0xa0, 0x9f, 0x97, 0x45, 0xdd, 0x9d, 0xfb, 0x54, 0x9c, 0x94, 0x11, 0xed, 0x38, 0xba, 0x69, + 0xee, 0x32, 0x47, 0xd5, 0x49, 0x95, 0xbe, 0xa4, 0xb9, 0xa8, 0x87, 0xfe, 0x40, 0xc8, 0x99, 0x5a, + 0xb0, 0x1a, 0x87, 0x04, 0xe0, 0x47, 0x64, 0x98, 0x63, 0x5c, 0xd5, 0xd9, 0x39, 0x1f, 0xa1, 0x03, + 0x6f, 0xbf, 0x28, 0x6c, 0x08, 0xf6, 0xa9, 0x3f, 0x2b, 0xe9, 0x51, 0x03, 0xe4, 0x07, 0x84, 0x82, + 0xa3, 0x09, 0x57, 0xe4, 0x90, 0xa0, 0x7c, 0x4b, 0x16, 0xa6, 0x37, 0x6c, 0x6c, 0x31, 0xbf, 0x7d, + 0xf4, 0x70, 0x16, 0xe4, 0x65, 0xcc, 0x6d, 0xa4, 0xbe, 0x40, 0xd8, 0xc3, 0x37, 0x5c, 0xd9, 0x10, + 0x51, 0xd7, 0x46, 0x8a, 0x80, 0xed, 0x06, 0x98, 0xa3, 0x22, 0x2d, 0x3a, 0x8e, 0x6b, 0x24, 0x7a, + 0xde, 0xb4, 0x3d, 0xa9, 0xa3, 0xd8, 0x2a, 0x22, 0x65, 0xb9, 0x59, 0x4a, 0x2e, 0x4f, 0xab, 0x78, + 0x93, 0xce, 0x67, 0xb3, 0x6a, 0x4f, 0xaa, 0x72, 0x2b, 0x5c, 0x61, 0x76, 0x31, 0x3d, 0xbf, 0x12, + 0xca, 0x9c, 0x23, 0x99, 0xfb, 0x7d, 0x42, 0x5f, 0x13, 0xf2, 0xd5, 0x15, 0x97, 0x4e, 0x32, 0x5d, + 0xe8, 0x8e, 0xc6, 0x24, 0x39, 0x0e, 0x05, 0x37, 0x07, 0xd9, 0x7f, 0x51, 0xcb, 0xf5, 0xda, 0xea, + 0xb9, 0x72, 0xff, 0x65, 0x8c, 0x1c, 0x7a, 0x8e, 0x0c, 0x53, 0x0b, 0x96, 0xa9, 0xb5, 0x5b, 0x9a, + 0xed, 0xa0, 0x6f, 0x49, 0x30, 0xb3, 0xae, 0x5d, 0xee, 0x98, 0x5a, 0x9b, 0xf8, 0xf7, 0xf7, 0xf4, + 0x05, 0x5d, 0xfa, 0xc9, 0xeb, 0x0b, 0xd8, 0x2b, 0x7f, 0x30, 0xd0, 0x3f, 0xba, 0x97, 0x11, 0xb9, + 0x50, 0xd3, 0xdf, 0xe6, 0x93, 0xfa, 0x05, 0x2b, 0xf5, 0xf8, 0x9a, 0x0f, 0xf3, 0x14, 0x61, 0x51, + 0xbe, 0x47, 0x2c, 0xfc, 0xa8, 0x08, 0xc9, 0xc3, 0xd9, 0x95, 0x7f, 0xee, 0x24, 0xe4, 0x17, 0x31, + 0xb1, 0xe2, 0xfe, 0xbb, 0x04, 0x13, 0x75, 0xec, 0x10, 0x0b, 0xee, 0x76, 0xce, 0x53, 0xb8, 0x4d, + 0x32, 0x04, 0x4e, 0xec, 0xde, 0xbb, 0x3b, 0x59, 0x0f, 0x9d, 0xb7, 0x26, 0xcf, 0x09, 0x3c, 0x12, + 0x69, 0xb9, 0xf3, 0xac, 0xcc, 0x03, 0x79, 0x24, 0xc6, 0x92, 0x4a, 0xdf, 0xd7, 0xea, 0x6d, 0x12, + 0x73, 0xad, 0x0a, 0xf5, 0x7a, 0xaf, 0x08, 0xeb, 0x67, 0xac, 0xb7, 0x19, 0x63, 0x3e, 0xc6, 0x39, + 0xea, 0x49, 0x30, 0x41, 0x65, 0xee, 0xcd, 0x47, 0x7b, 0xfd, 0x14, 0x28, 0x09, 0x72, 0xf6, 0xda, + 0xcb, 0x29, 0xe8, 0xa2, 0x16, 0x5d, 0xf8, 0x58, 0x62, 0x10, 0xcc, 0x54, 0xb1, 0x73, 0xc9, 0xb4, + 0x2e, 0xd6, 0x1d, 0xcd, 0xc1, 0xe8, 0xdf, 0x24, 0x90, 0xeb, 0xd8, 0x09, 0x47, 0x3f, 0xa9, 0xc2, + 0x31, 0x5a, 0x21, 0x96, 0x91, 0xf4, 0xdf, 0xb4, 0x22, 0x67, 0xfa, 0x0a, 0x21, 0x94, 0x4f, 0xdd, + 0xff, 0x2b, 0xfa, 0xf5, 0xbe, 0x41, 0x9f, 0xa4, 0x3e, 0x93, 0x06, 0x26, 0x99, 0x30, 0x83, 0xae, + 0x82, 0x45, 0xe8, 0xe9, 0x7b, 0x85, 0xcc, 0x6a, 0x31, 0x9a, 0x87, 0xd3, 0x15, 0x7c, 0xe0, 0x2a, + 0xc8, 0x96, 0xb6, 0x35, 0x07, 0xbd, 0x55, 0x06, 0x28, 0xb6, 0xdb, 0x6b, 0xd4, 0x07, 0x3c, 0xec, + 0x90, 0x76, 0x16, 0x66, 0x5a, 0xdb, 0x5a, 0x70, 0xb7, 0x09, 0xed, 0x0f, 0xb8, 0x34, 0xe5, 0xc9, + 0x81, 0x33, 0x39, 0x95, 0x2a, 0xea, 0x81, 0xc9, 0x2d, 0x83, 0xd1, 0xf6, 0x1d, 0xcd, 0xf9, 0x50, + 0x98, 0xb1, 0x47, 0xe8, 0xdc, 0xdf, 0xe7, 0x03, 0xf6, 0xa2, 0xe7, 0x70, 0x8c, 0xb4, 0x7f, 0xc0, + 0x26, 0x48, 0x48, 0x78, 0xd2, 0x5b, 0x2c, 0xa0, 0x47, 0x3c, 0x5f, 0x63, 0x09, 0x5d, 0xab, 0x94, + 0xdb, 0xba, 0x27, 0x5a, 0x16, 0x30, 0x0b, 0x3d, 0x3f, 0x93, 0x0c, 0xbe, 0x78, 0xc1, 0xdd, 0x03, + 0xb3, 0xb8, 0xad, 0x3b, 0xd8, 0xab, 0x25, 0x13, 0x60, 0x1c, 0xc4, 0xfc, 0x0f, 0xe8, 0xd9, 0xc2, + 0x41, 0xd7, 0x88, 0x40, 0xf7, 0xd7, 0x28, 0xa2, 0xfd, 0x89, 0x85, 0x51, 0x13, 0xa3, 0x99, 0x3e, + 0x58, 0x3f, 0x23, 0xc3, 0x89, 0x86, 0xb9, 0xb5, 0xd5, 0xc1, 0x9e, 0x98, 0x30, 0xf5, 0xce, 0x44, + 0xda, 0x28, 0xe1, 0x22, 0x3b, 0x41, 0xe6, 0x03, 0xba, 0x7f, 0x94, 0xcc, 0x7d, 0xe1, 0x4f, 0x4c, + 0xc5, 0xce, 0xa2, 0x88, 0xb8, 0xfa, 0xf2, 0x19, 0x81, 0x82, 0x58, 0xc0, 0x67, 0x61, 0xb2, 0xe9, + 0x03, 0xf1, 0x59, 0x09, 0x66, 0xe9, 0xcd, 0x95, 0x9e, 0x82, 0xde, 0x37, 0x42, 0x00, 0xd0, 0xb7, + 0x32, 0xa2, 0x7e, 0xb6, 0x44, 0x26, 0x1c, 0x27, 0x11, 0x22, 0x16, 0x0b, 0xaa, 0x32, 0x90, 0x5c, + 0xfa, 0xa2, 0xfd, 0x13, 0x19, 0xa6, 0x97, 0xb1, 0xd7, 0xd2, 0xec, 0xc4, 0x3d, 0xd1, 0x59, 0x98, + 0x21, 0xd7, 0xb7, 0xd5, 0xd8, 0x31, 0x49, 0xba, 0x6a, 0xc6, 0xa5, 0x29, 0xd7, 0xc3, 0xec, 0x05, + 0xbc, 0x69, 0x5a, 0xb8, 0xc6, 0x9d, 0xa5, 0xe4, 0x13, 0x23, 0xc2, 0xd3, 0x71, 0x71, 0xd0, 0x16, + 0x78, 0x6c, 0x6e, 0xde, 0x2f, 0xcc, 0x50, 0x55, 0x22, 0xc6, 0x9c, 0xa7, 0xc0, 0x24, 0x43, 0xde, + 0x33, 0xd3, 0xe2, 0xfa, 0x45, 0x3f, 0x2f, 0x7a, 0xb5, 0x8f, 0x68, 0x99, 0x43, 0xf4, 0x89, 0x49, + 0x98, 0x18, 0xcb, 0xfd, 0xee, 0x85, 0x50, 0xf9, 0x0b, 0x97, 0x2b, 0x6d, 0x1b, 0xad, 0x25, 0xc3, + 0xf4, 0x34, 0x80, 0xdf, 0x38, 0xbc, 0xb0, 0x16, 0xa1, 0x14, 0x3e, 0x72, 0x7d, 0xec, 0x41, 0xbd, + 0x5e, 0x71, 0x10, 0x76, 0x46, 0x0c, 0x8c, 0xd8, 0x01, 0x3f, 0x11, 0x4e, 0xd2, 0x47, 0xe7, 0xe3, + 0x32, 0x9c, 0xf0, 0xcf, 0x1f, 0xad, 0x6a, 0x76, 0xd0, 0xee, 0x4a, 0xc9, 0x20, 0xe2, 0x0e, 0x7c, + 0xf8, 0x8d, 0xe5, 0xeb, 0xc9, 0xc6, 0x8c, 0xbe, 0x9c, 0x8c, 0x16, 0x1d, 0xe5, 0x66, 0x38, 0x66, + 0xec, 0xee, 0xf8, 0x52, 0x27, 0x2d, 0x9e, 0xb5, 0xf0, 0xfd, 0x1f, 0x92, 0x8c, 0x4c, 0x22, 0xcc, + 0x8f, 0x65, 0x4e, 0xc9, 0x1d, 0xe9, 0x7a, 0x42, 0x22, 0x18, 0xd1, 0xbf, 0x64, 0x12, 0xf5, 0x6e, + 0x83, 0xcf, 0x7c, 0x25, 0xe8, 0xa5, 0x0e, 0xf1, 0xc0, 0xd7, 0xd9, 0x09, 0xc8, 0x95, 0x77, 0xba, + 0xce, 0xe5, 0xb3, 0x8f, 0x85, 0xd9, 0xba, 0x63, 0x61, 0x6d, 0x27, 0xb4, 0x33, 0xe0, 0x98, 0x17, + 0xb1, 0xe1, 0xed, 0x0c, 0x90, 0x97, 0x3b, 0x6e, 0x87, 0x09, 0xc3, 0x6c, 0x6a, 0xbb, 0xce, 0xb6, + 0x72, 0xed, 0xbe, 0x23, 0xf5, 0x0c, 0xfc, 0x1a, 0x8b, 0x61, 0xf4, 0xc5, 0x3b, 0xc9, 0xda, 0x70, + 0xde, 0x30, 0x8b, 0xbb, 0xce, 0xf6, 0xc2, 0x35, 0x1f, 0xf9, 0xdb, 0xd3, 0x99, 0x4f, 0xfc, 0xed, + 0xe9, 0xcc, 0x17, 0xfe, 0xf6, 0x74, 0xe6, 0x17, 0xbf, 0x74, 0xfa, 0xc8, 0x27, 0xbe, 0x74, 0xfa, + 0xc8, 0x67, 0xbf, 0x74, 0xfa, 0xc8, 0x8f, 0x4a, 0xdd, 0x0b, 0x17, 0xf2, 0x84, 0xca, 0x93, 0xfe, + 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x7f, 0x7f, 0x9b, 0x26, 0x60, 0x08, 0x02, 0x00, } func (m *Rpc) Marshal() (dAtA []byte, err error) { @@ -88349,6 +88359,16 @@ func (m *RpcObjectListExportRequest) MarshalToSizedBuffer(dAtA []byte) (int, err _ = i var l int _ = l + if m.IncludeDependentDetails { + i-- + if m.IncludeDependentDetails { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x60 + } if m.NoProgress { i-- if m.NoProgress { @@ -124886,6 +124906,9 @@ func (m *RpcObjectListExportRequest) Size() (n int) { if m.NoProgress { n += 2 } + if m.IncludeDependentDetails { + n += 2 + } return n } @@ -178314,6 +178337,26 @@ func (m *RpcObjectListExportRequest) Unmarshal(dAtA []byte) error { } } m.NoProgress = bool(v != 0) + case 12: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field IncludeDependentDetails", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowCommands + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.IncludeDependentDetails = bool(v != 0) default: iNdEx = preIndex skippy, err := skipCommands(dAtA[iNdEx:]) diff --git a/pb/protos/commands.proto b/pb/protos/commands.proto index d7288830a..57dec8582 100644 --- a/pb/protos/commands.proto +++ b/pb/protos/commands.proto @@ -2757,6 +2757,8 @@ message Rpc { bool includeArchived = 9; // for integrations like raycast and web publishing bool noProgress = 11; + // for web publising, just add details of dependent objects in result snapshot + bool includeDependentDetails = 12; } message Response { diff --git a/pb/protos/snapshot.proto b/pb/protos/snapshot.proto index 849260742..248af50d7 100644 --- a/pb/protos/snapshot.proto +++ b/pb/protos/snapshot.proto @@ -4,12 +4,18 @@ option go_package = "pb"; import "pkg/lib/pb/model/protos/models.proto"; import "pb/protos/changes.proto"; +import "google/protobuf/struct.proto"; message SnapshotWithType { anytype.model.SmartBlockType sbType = 1; anytype.Change.Snapshot snapshot = 2; + repeated DependantDetail dependantDetails = 3; } +message DependantDetail { + string id = 1; + google.protobuf.Struct details = 2; +} message Profile { string name = 1; string avatar = 2; diff --git a/pb/snapshot.pb.go b/pb/snapshot.pb.go index 68eb46309..260899f46 100644 --- a/pb/snapshot.pb.go +++ b/pb/snapshot.pb.go @@ -7,6 +7,7 @@ import ( fmt "fmt" model "github.com/anyproto/anytype-heart/pkg/lib/pb/model" proto "github.com/gogo/protobuf/proto" + types "github.com/gogo/protobuf/types" io "io" math "math" math_bits "math/bits" @@ -24,8 +25,9 @@ var _ = math.Inf const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package type SnapshotWithType struct { - SbType model.SmartBlockType `protobuf:"varint,1,opt,name=sbType,proto3,enum=anytype.model.SmartBlockType" json:"sbType,omitempty"` - Snapshot *ChangeSnapshot `protobuf:"bytes,2,opt,name=snapshot,proto3" json:"snapshot,omitempty"` + SbType model.SmartBlockType `protobuf:"varint,1,opt,name=sbType,proto3,enum=anytype.model.SmartBlockType" json:"sbType,omitempty"` + Snapshot *ChangeSnapshot `protobuf:"bytes,2,opt,name=snapshot,proto3" json:"snapshot,omitempty"` + DependantDetails []*DependantDetail `protobuf:"bytes,3,rep,name=dependantDetails,proto3" json:"dependantDetails,omitempty"` } func (m *SnapshotWithType) Reset() { *m = SnapshotWithType{} } @@ -75,6 +77,65 @@ func (m *SnapshotWithType) GetSnapshot() *ChangeSnapshot { return nil } +func (m *SnapshotWithType) GetDependantDetails() []*DependantDetail { + if m != nil { + return m.DependantDetails + } + return nil +} + +type DependantDetail struct { + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + Details *types.Struct `protobuf:"bytes,2,opt,name=details,proto3" json:"details,omitempty"` +} + +func (m *DependantDetail) Reset() { *m = DependantDetail{} } +func (m *DependantDetail) String() string { return proto.CompactTextString(m) } +func (*DependantDetail) ProtoMessage() {} +func (*DependantDetail) Descriptor() ([]byte, []int) { + return fileDescriptor_022f1596c727bff6, []int{1} +} +func (m *DependantDetail) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *DependantDetail) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_DependantDetail.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 *DependantDetail) XXX_Merge(src proto.Message) { + xxx_messageInfo_DependantDetail.Merge(m, src) +} +func (m *DependantDetail) XXX_Size() int { + return m.Size() +} +func (m *DependantDetail) XXX_DiscardUnknown() { + xxx_messageInfo_DependantDetail.DiscardUnknown(m) +} + +var xxx_messageInfo_DependantDetail proto.InternalMessageInfo + +func (m *DependantDetail) GetId() string { + if m != nil { + return m.Id + } + return "" +} + +func (m *DependantDetail) GetDetails() *types.Struct { + if m != nil { + return m.Details + } + return nil +} + type Profile struct { Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` Avatar string `protobuf:"bytes,2,opt,name=avatar,proto3" json:"avatar,omitempty"` @@ -88,7 +149,7 @@ func (m *Profile) Reset() { *m = Profile{} } func (m *Profile) String() string { return proto.CompactTextString(m) } func (*Profile) ProtoMessage() {} func (*Profile) Descriptor() ([]byte, []int) { - return fileDescriptor_022f1596c727bff6, []int{1} + return fileDescriptor_022f1596c727bff6, []int{2} } func (m *Profile) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -161,33 +222,39 @@ func (m *Profile) GetAnalyticsId() string { func init() { proto.RegisterType((*SnapshotWithType)(nil), "anytype.SnapshotWithType") + proto.RegisterType((*DependantDetail)(nil), "anytype.DependantDetail") proto.RegisterType((*Profile)(nil), "anytype.Profile") } func init() { proto.RegisterFile("pb/protos/snapshot.proto", fileDescriptor_022f1596c727bff6) } var fileDescriptor_022f1596c727bff6 = []byte{ - // 318 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x64, 0x90, 0xc1, 0x4a, 0xc3, 0x30, - 0x18, 0xc7, 0x97, 0x31, 0x5b, 0x97, 0x81, 0x8c, 0x1c, 0x34, 0x8c, 0x59, 0xc6, 0xf0, 0x30, 0x3c, - 0xb4, 0x30, 0xf5, 0x05, 0xa6, 0x97, 0xdd, 0xa4, 0x13, 0x04, 0x6f, 0x5f, 0x9a, 0xb8, 0x96, 0x75, - 0x4d, 0x48, 0x82, 0xd0, 0x93, 0xaf, 0xe0, 0xfb, 0xf8, 0x02, 0x1e, 0x77, 0xf4, 0x28, 0xdb, 0x8b, - 0xc8, 0xd2, 0x76, 0x13, 0xbc, 0x7d, 0xff, 0xef, 0xff, 0xfb, 0xfe, 0xff, 0x10, 0x4c, 0x15, 0x8b, - 0x94, 0x96, 0x56, 0x9a, 0xc8, 0x14, 0xa0, 0x4c, 0x2a, 0x6d, 0xe8, 0x34, 0xf1, 0xa1, 0x28, 0x6d, - 0xa9, 0xc4, 0xe0, 0x4a, 0xad, 0x96, 0x51, 0x9e, 0xb1, 0x48, 0xb1, 0x68, 0x2d, 0xb9, 0xc8, 0x9b, - 0x03, 0x27, 0x4c, 0x85, 0x0f, 0x2e, 0x8e, 0x41, 0x49, 0x0a, 0xc5, 0x52, 0xd4, 0xc6, 0xf8, 0x1d, - 0xf7, 0x17, 0x75, 0xf2, 0x73, 0x66, 0xd3, 0xa7, 0x52, 0x09, 0x72, 0x87, 0x3d, 0xc3, 0xf6, 0x13, - 0x45, 0x23, 0x34, 0x39, 0x9b, 0x5e, 0x86, 0x75, 0x59, 0xe8, 0x32, 0xc3, 0xc5, 0x1a, 0xb4, 0x9d, - 0xe5, 0x32, 0x59, 0xed, 0xa1, 0xb8, 0x86, 0xc9, 0x2d, 0x3e, 0x6d, 0x1e, 0x49, 0xdb, 0x23, 0x34, - 0xe9, 0x4d, 0xe9, 0xe1, 0xf0, 0xde, 0x95, 0x86, 0x4d, 0x55, 0x7c, 0x20, 0xc7, 0x9f, 0x08, 0xfb, - 0x8f, 0x5a, 0xbe, 0x66, 0xb9, 0x20, 0x04, 0x77, 0x0a, 0x58, 0x57, 0xb5, 0xdd, 0xd8, 0xcd, 0xe4, - 0x1c, 0x7b, 0xf0, 0x06, 0x16, 0xb4, 0xcb, 0xec, 0xc6, 0xb5, 0x22, 0x14, 0xfb, 0xc0, 0xb9, 0x16, - 0xc6, 0xd0, 0x8e, 0x33, 0x1a, 0x49, 0xae, 0x71, 0xdf, 0x28, 0x48, 0xc4, 0x03, 0x98, 0x94, 0x49, - 0xd0, 0x7c, 0xce, 0xe9, 0x89, 0x43, 0xfe, 0xed, 0xc9, 0x10, 0x77, 0x55, 0x55, 0x3e, 0xe7, 0xd4, - 0x73, 0xd0, 0x71, 0x41, 0x46, 0xb8, 0x07, 0x05, 0xe4, 0xa5, 0xcd, 0x12, 0x33, 0xe7, 0xd4, 0x77, - 0xfe, 0xdf, 0xd5, 0x6c, 0xf8, 0xb5, 0x0d, 0xd0, 0x66, 0x1b, 0xa0, 0x9f, 0x6d, 0x80, 0x3e, 0x76, - 0x41, 0x6b, 0xb3, 0x0b, 0x5a, 0xdf, 0xbb, 0xa0, 0xf5, 0xd2, 0x56, 0x8c, 0x79, 0xee, 0x8f, 0x6f, - 0x7e, 0x03, 0x00, 0x00, 0xff, 0xff, 0xab, 0x51, 0x3f, 0xdf, 0xc7, 0x01, 0x00, 0x00, + // 399 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x64, 0x90, 0xcf, 0x8e, 0xd3, 0x30, + 0x10, 0xc6, 0xeb, 0xec, 0x92, 0x50, 0xaf, 0xb4, 0x54, 0x3e, 0xb0, 0xd6, 0xaa, 0x44, 0x51, 0xc5, + 0x61, 0xc5, 0xc1, 0x11, 0x0b, 0xbc, 0xc0, 0x92, 0x4b, 0x6f, 0x28, 0x5d, 0x09, 0x89, 0xdb, 0x38, + 0xf6, 0x26, 0x51, 0xd3, 0xd8, 0x8a, 0x5d, 0xa4, 0xbc, 0x05, 0xef, 0xc3, 0x19, 0x89, 0x63, 0x8f, + 0x1c, 0x51, 0xfb, 0x22, 0xa8, 0x4e, 0xd2, 0xd2, 0xed, 0x6d, 0xfe, 0xfc, 0xe6, 0xfb, 0x66, 0x06, + 0x53, 0xcd, 0x63, 0xdd, 0x28, 0xab, 0x4c, 0x6c, 0x6a, 0xd0, 0xa6, 0x50, 0x96, 0xb9, 0x9c, 0x04, + 0x50, 0xb7, 0xb6, 0xd5, 0xf2, 0xf6, 0xad, 0x5e, 0xe6, 0x71, 0x55, 0xf2, 0x58, 0xf3, 0x78, 0xa5, + 0x84, 0xac, 0x86, 0x01, 0x97, 0x98, 0x0e, 0xbf, 0xbd, 0x39, 0x0a, 0x65, 0x05, 0xd4, 0xb9, 0x1c, + 0x1a, 0xd3, 0x5c, 0xa9, 0xbc, 0x92, 0x5d, 0x93, 0xaf, 0x9f, 0x62, 0x63, 0x9b, 0x75, 0xd6, 0xbb, + 0xcc, 0x7e, 0x21, 0x3c, 0x59, 0xf4, 0xc6, 0x5f, 0x4b, 0x5b, 0x3c, 0xb6, 0x5a, 0x92, 0x4f, 0xd8, + 0x37, 0x7c, 0x1f, 0x51, 0x14, 0xa1, 0xbb, 0xeb, 0xfb, 0x37, 0xac, 0xdf, 0x85, 0x39, 0x4b, 0xb6, + 0x58, 0x41, 0x63, 0x1f, 0x2a, 0x95, 0x2d, 0xf7, 0x50, 0xda, 0xc3, 0xe4, 0x23, 0x7e, 0x39, 0xdc, + 0x40, 0xbd, 0x08, 0xdd, 0x5d, 0xdd, 0xd3, 0xc3, 0xe0, 0x67, 0xb7, 0x13, 0x1b, 0xac, 0xd2, 0x03, + 0x49, 0x12, 0x3c, 0x11, 0x52, 0xcb, 0x5a, 0x40, 0x6d, 0x13, 0x69, 0xa1, 0xac, 0x0c, 0xbd, 0x88, + 0x2e, 0x4e, 0xa6, 0x93, 0x53, 0x20, 0x3d, 0x9b, 0x98, 0x3d, 0xe2, 0x57, 0xcf, 0x20, 0x72, 0x8d, + 0xbd, 0x52, 0xb8, 0x0b, 0xc6, 0xa9, 0x57, 0x0a, 0xf2, 0x1e, 0x07, 0xa2, 0xd7, 0xef, 0xb6, 0xbb, + 0x61, 0xdd, 0x6b, 0xd8, 0xf0, 0x1a, 0xb6, 0x70, 0xaf, 0x49, 0x07, 0x6e, 0xf6, 0x13, 0xe1, 0xe0, + 0x4b, 0xa3, 0x9e, 0xca, 0x4a, 0x12, 0x82, 0x2f, 0x6b, 0x58, 0xc9, 0x5e, 0xd0, 0xc5, 0xe4, 0x35, + 0xf6, 0xe1, 0x3b, 0x58, 0x68, 0x9c, 0xe2, 0x38, 0xed, 0x33, 0x42, 0x71, 0x00, 0x42, 0x34, 0xd2, + 0x18, 0x7a, 0xe9, 0x1a, 0x43, 0x4a, 0xde, 0xe1, 0x89, 0xd1, 0x90, 0xc9, 0x04, 0x4c, 0xc1, 0x15, + 0x34, 0x62, 0x2e, 0xe8, 0x0b, 0x87, 0x9c, 0xd5, 0xc9, 0x14, 0x8f, 0x75, 0x67, 0x3e, 0x17, 0xd4, + 0x77, 0xd0, 0xb1, 0x40, 0x22, 0x7c, 0x05, 0x35, 0x54, 0xad, 0x2d, 0x33, 0x33, 0x17, 0x34, 0x70, + 0xfd, 0xff, 0x4b, 0x0f, 0xd3, 0xdf, 0xdb, 0x10, 0x6d, 0xb6, 0x21, 0xfa, 0xbb, 0x0d, 0xd1, 0x8f, + 0x5d, 0x38, 0xda, 0xec, 0xc2, 0xd1, 0x9f, 0x5d, 0x38, 0xfa, 0xe6, 0x69, 0xce, 0x7d, 0x77, 0xf5, + 0x87, 0x7f, 0x01, 0x00, 0x00, 0xff, 0xff, 0x36, 0x2f, 0x5b, 0x24, 0x82, 0x02, 0x00, 0x00, } func (m *SnapshotWithType) Marshal() (dAtA []byte, err error) { @@ -210,6 +277,20 @@ func (m *SnapshotWithType) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l + if len(m.DependantDetails) > 0 { + for iNdEx := len(m.DependantDetails) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.DependantDetails[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintSnapshot(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x1a + } + } if m.Snapshot != nil { { size, err := m.Snapshot.MarshalToSizedBuffer(dAtA[:i]) @@ -230,6 +311,48 @@ func (m *SnapshotWithType) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } +func (m *DependantDetail) 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 *DependantDetail) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *DependantDetail) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.Details != nil { + { + size, err := m.Details.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintSnapshot(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + } + if len(m.Id) > 0 { + i -= len(m.Id) + copy(dAtA[i:], m.Id) + i = encodeVarintSnapshot(dAtA, i, uint64(len(m.Id))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + func (m *Profile) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -319,6 +442,29 @@ func (m *SnapshotWithType) Size() (n int) { l = m.Snapshot.Size() n += 1 + l + sovSnapshot(uint64(l)) } + if len(m.DependantDetails) > 0 { + for _, e := range m.DependantDetails { + l = e.Size() + n += 1 + l + sovSnapshot(uint64(l)) + } + } + return n +} + +func (m *DependantDetail) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Id) + if l > 0 { + n += 1 + l + sovSnapshot(uint64(l)) + } + if m.Details != nil { + l = m.Details.Size() + n += 1 + l + sovSnapshot(uint64(l)) + } return n } @@ -445,6 +591,158 @@ func (m *SnapshotWithType) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field DependantDetails", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowSnapshot + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthSnapshot + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthSnapshot + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.DependantDetails = append(m.DependantDetails, &DependantDetail{}) + if err := m.DependantDetails[len(m.DependantDetails)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipSnapshot(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthSnapshot + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *DependantDetail) 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 ErrIntOverflowSnapshot + } + 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: DependantDetail: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: DependantDetail: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Id", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowSnapshot + } + 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 ErrInvalidLengthSnapshot + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthSnapshot + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Id = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Details", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowSnapshot + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthSnapshot + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthSnapshot + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Details == nil { + m.Details = &types.Struct{} + } + if err := m.Details.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipSnapshot(dAtA[iNdEx:]) From 8e14863b212c5c3bffe6dc26b4d9a5051f66b176 Mon Sep 17 00:00:00 2001 From: Roman Khafizianov Date: Wed, 22 Jan 2025 17:23:41 +0100 Subject: [PATCH 142/195] GO-4459 add jsonApiListenAddr to AccountStart/Create RPCs --- clientlibrary/service/service.pb.go | 712 ++--- core/account.go | 13 + core/anytype/config/config.go | 1 + core/api/server/middleware.go | 10 +- core/api/server/router.go | 19 +- core/api/server/server.go | 6 +- core/api/service.go | 73 +- core/application/account_config_update.go | 15 + core/application/account_create.go | 5 +- core/application/account_select.go | 8 +- core/application/account_stop.go | 2 +- docs/proto.md | 78 + pb/commands.pb.go | 3284 +++++++++++++-------- pb/protos/commands.proto | 24 + pb/protos/service/service.proto | 2 + pb/service/service.pb.go | 711 ++--- 16 files changed, 3020 insertions(+), 1943 deletions(-) diff --git a/clientlibrary/service/service.pb.go b/clientlibrary/service/service.pb.go index cbd21b09e..e50edb608 100644 --- a/clientlibrary/service/service.pb.go +++ b/clientlibrary/service/service.pb.go @@ -25,343 +25,344 @@ const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package func init() { proto.RegisterFile("pb/protos/service/service.proto", fileDescriptor_93a29dc403579097) } var fileDescriptor_93a29dc403579097 = []byte{ - // 5364 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x9d, 0xdf, 0x6f, 0x24, 0x49, - 0x52, 0xf8, 0xd7, 0x2f, 0xdf, 0xfd, 0x52, 0xc7, 0x2d, 0xd0, 0x0b, 0xcb, 0xde, 0x72, 0x37, 0xbf, - 0x76, 0xc6, 0xf6, 0x8c, 0xed, 0xf6, 0xec, 0xcc, 0xce, 0xee, 0xe9, 0x0e, 0x09, 0x79, 0xec, 0xb1, - 0xd7, 0x9c, 0xed, 0x31, 0xee, 0xf6, 0x8c, 0xb4, 0x12, 0x12, 0xe9, 0xea, 0x74, 0xbb, 0x70, 0x75, - 0x65, 0x5d, 0x55, 0x76, 0x7b, 0xfa, 0x10, 0x08, 0x04, 0x02, 0x81, 0x40, 0x9c, 0xf8, 0xf5, 0x8a, - 0xc4, 0x5f, 0xc3, 0xe3, 0x3d, 0xf2, 0x88, 0x76, 0x9f, 0xef, 0x7f, 0x40, 0x95, 0x95, 0x95, 0x3f, - 0xa2, 0x22, 0xb2, 0xca, 0xf7, 0x34, 0xa3, 0x8e, 0x4f, 0x44, 0x64, 0x56, 0x66, 0x46, 0x46, 0x66, - 0x65, 0xa5, 0xa3, 0xbb, 0xf9, 0xc5, 0x76, 0x5e, 0x08, 0x29, 0xca, 0xed, 0x92, 0x17, 0x8b, 0x24, - 0xe6, 0xcd, 0xbf, 0x43, 0xf5, 0xf3, 0xe0, 0x7d, 0x96, 0x2d, 0xe5, 0x32, 0xe7, 0x9f, 0x7c, 0x6c, - 0xc9, 0x58, 0xcc, 0x66, 0x2c, 0x9b, 0x94, 0x35, 0xf2, 0xc9, 0x47, 0x56, 0xc2, 0x17, 0x3c, 0x93, - 0xfa, 0xf7, 0x67, 0xbf, 0xfc, 0xe5, 0x4a, 0xf4, 0xc1, 0x6e, 0x9a, 0xf0, 0x4c, 0xee, 0x6a, 0x8d, - 0xc1, 0xd7, 0xd1, 0x77, 0x77, 0xf2, 0xfc, 0x80, 0xcb, 0x37, 0xbc, 0x28, 0x13, 0x91, 0x0d, 0x3e, - 0x1d, 0x6a, 0x07, 0xc3, 0xb3, 0x3c, 0x1e, 0xee, 0xe4, 0xf9, 0xd0, 0x0a, 0x87, 0x67, 0xfc, 0xa7, - 0x73, 0x5e, 0xca, 0x4f, 0x1e, 0x86, 0xa1, 0x32, 0x17, 0x59, 0xc9, 0x07, 0x97, 0xd1, 0x6f, 0xed, - 0xe4, 0xf9, 0x88, 0xcb, 0x3d, 0x5e, 0x55, 0x60, 0x24, 0x99, 0xe4, 0x83, 0xb5, 0x96, 0xaa, 0x0f, - 0x18, 0x1f, 0xeb, 0xdd, 0xa0, 0xf6, 0x33, 0x8e, 0xbe, 0x53, 0xf9, 0xb9, 0x9a, 0xcb, 0x89, 0xb8, - 0xc9, 0x06, 0xf7, 0xdb, 0x8a, 0x5a, 0x64, 0x6c, 0x3f, 0x08, 0x21, 0xda, 0xea, 0xdb, 0xe8, 0xd7, - 0xdf, 0xb2, 0x34, 0xe5, 0x72, 0xb7, 0xe0, 0x55, 0xc1, 0x7d, 0x9d, 0x5a, 0x34, 0xac, 0x65, 0xc6, - 0xee, 0xa7, 0x41, 0x46, 0x1b, 0xfe, 0x3a, 0xfa, 0x6e, 0x2d, 0x39, 0xe3, 0xb1, 0x58, 0xf0, 0x62, - 0x80, 0x6a, 0x69, 0x21, 0xf1, 0xc8, 0x5b, 0x10, 0xb4, 0xbd, 0x2b, 0xb2, 0x05, 0x2f, 0x24, 0x6e, - 0x5b, 0x0b, 0xc3, 0xb6, 0x2d, 0xa4, 0x6d, 0xff, 0xfd, 0x4a, 0xf4, 0xfd, 0x9d, 0x38, 0x16, 0xf3, - 0x4c, 0x1e, 0x89, 0x98, 0xa5, 0x47, 0x49, 0x76, 0x7d, 0xc2, 0x6f, 0x76, 0xaf, 0x2a, 0x3e, 0x9b, - 0xf2, 0xc1, 0x73, 0xff, 0xa9, 0xd6, 0xe8, 0xd0, 0xb0, 0x43, 0x17, 0x36, 0xbe, 0x3f, 0xbf, 0x9d, - 0x92, 0x2e, 0xcb, 0x3f, 0xaf, 0x44, 0x77, 0x60, 0x59, 0x46, 0x22, 0x5d, 0x70, 0x5b, 0x9a, 0x17, - 0x1d, 0x86, 0x7d, 0xdc, 0x94, 0xe7, 0x8b, 0xdb, 0xaa, 0xe9, 0x12, 0xa5, 0xd1, 0x87, 0x6e, 0x77, - 0x19, 0xf1, 0x52, 0x0d, 0xa7, 0xc7, 0x74, 0x8f, 0xd0, 0x88, 0xf1, 0xfc, 0xa4, 0x0f, 0xaa, 0xbd, - 0x25, 0xd1, 0x40, 0x7b, 0x4b, 0x45, 0x69, 0x9c, 0xad, 0xa3, 0x16, 0x1c, 0xc2, 0xf8, 0x7a, 0xdc, - 0x83, 0xd4, 0xae, 0xfe, 0x24, 0xfa, 0x8d, 0xb7, 0xa2, 0xb8, 0x2e, 0x73, 0x16, 0x73, 0x3d, 0x14, - 0x1e, 0xf9, 0xda, 0x8d, 0x14, 0x8e, 0x86, 0xd5, 0x2e, 0xcc, 0xe9, 0xb4, 0x8d, 0xf0, 0x75, 0xce, - 0x61, 0x0c, 0xb2, 0x8a, 0x95, 0x90, 0xea, 0xb4, 0x10, 0xd2, 0xb6, 0xaf, 0xa3, 0x81, 0xb5, 0x7d, - 0xf1, 0xa7, 0x3c, 0x96, 0x3b, 0x93, 0x09, 0x6c, 0x15, 0xab, 0xab, 0x88, 0xe1, 0xce, 0x64, 0x42, - 0xb5, 0x0a, 0x8e, 0x6a, 0x67, 0x37, 0xd1, 0x47, 0xc0, 0xd9, 0x51, 0x52, 0x2a, 0x87, 0x5b, 0x61, - 0x2b, 0x1a, 0x33, 0x4e, 0x87, 0x7d, 0x71, 0xed, 0xf8, 0x2f, 0x57, 0xa2, 0xef, 0x21, 0x9e, 0xcf, - 0xf8, 0x4c, 0x2c, 0xf8, 0xe0, 0x69, 0xb7, 0xb5, 0x9a, 0x34, 0xfe, 0x3f, 0xbb, 0x85, 0x06, 0xd2, - 0x4d, 0x46, 0x3c, 0xe5, 0xb1, 0x24, 0xbb, 0x49, 0x2d, 0xee, 0xec, 0x26, 0x06, 0x73, 0x46, 0x58, - 0x23, 0x3c, 0xe0, 0x72, 0x77, 0x5e, 0x14, 0x3c, 0x93, 0x64, 0x5b, 0x5a, 0xa4, 0xb3, 0x2d, 0x3d, - 0x14, 0xa9, 0xcf, 0x01, 0x97, 0x3b, 0x69, 0x4a, 0xd6, 0xa7, 0x16, 0x77, 0xd6, 0xc7, 0x60, 0xda, - 0x43, 0x1c, 0xfd, 0xa6, 0xf3, 0xc4, 0xe4, 0x61, 0x76, 0x29, 0x06, 0xf4, 0xb3, 0x50, 0x72, 0xe3, - 0x63, 0xad, 0x93, 0x43, 0xaa, 0xf1, 0xea, 0x5d, 0x2e, 0x0a, 0xba, 0x59, 0x6a, 0x71, 0x67, 0x35, - 0x0c, 0xa6, 0x3d, 0xfc, 0x71, 0xf4, 0x81, 0x8e, 0x92, 0xcd, 0x7c, 0xf6, 0x10, 0x0d, 0xa1, 0x70, - 0x42, 0x7b, 0xd4, 0x41, 0xd9, 0xe0, 0xa0, 0x65, 0x3a, 0xf8, 0x7c, 0x8a, 0xea, 0x81, 0xd0, 0xf3, - 0x30, 0x0c, 0xb5, 0x6c, 0xef, 0xf1, 0x94, 0x93, 0xb6, 0x6b, 0x61, 0x87, 0x6d, 0x03, 0x69, 0xdb, - 0x45, 0xf4, 0x3b, 0xe6, 0xb1, 0x54, 0xf3, 0xa8, 0x92, 0x57, 0x41, 0x7a, 0x83, 0xa8, 0xb7, 0x0b, - 0x19, 0x5f, 0x9b, 0xfd, 0xe0, 0x56, 0x7d, 0xf4, 0x08, 0xc4, 0xeb, 0x03, 0xc6, 0xdf, 0xc3, 0x30, - 0xa4, 0x6d, 0xff, 0xc3, 0x4a, 0xf4, 0x03, 0x2d, 0x7b, 0x95, 0xb1, 0x8b, 0x94, 0xab, 0x29, 0xf1, - 0x84, 0xcb, 0x1b, 0x51, 0x5c, 0x8f, 0x96, 0x59, 0x4c, 0x4c, 0xff, 0x38, 0xdc, 0x31, 0xfd, 0x93, - 0x4a, 0x4e, 0xc6, 0xa7, 0x2b, 0x2a, 0x45, 0x0e, 0x33, 0xbe, 0xa6, 0x06, 0x52, 0xe4, 0x54, 0xc6, - 0xe7, 0x23, 0x2d, 0xab, 0xc7, 0x55, 0xd8, 0xc4, 0xad, 0x1e, 0xbb, 0x71, 0xf2, 0x41, 0x08, 0xb1, - 0x61, 0xab, 0xe9, 0xc0, 0x22, 0xbb, 0x4c, 0xa6, 0xe7, 0xf9, 0xa4, 0xea, 0xc6, 0x8f, 0xf1, 0x1e, - 0xea, 0x20, 0x44, 0xd8, 0x22, 0x50, 0xed, 0xed, 0x9f, 0x6c, 0x62, 0xa4, 0x87, 0xd2, 0x7e, 0x21, - 0x66, 0x47, 0x7c, 0xca, 0xe2, 0xa5, 0x1e, 0xff, 0x9f, 0x87, 0x06, 0x1e, 0xa4, 0x4d, 0x21, 0x5e, - 0xdc, 0x52, 0x4b, 0x97, 0xe7, 0x3f, 0x57, 0xa2, 0x87, 0x4d, 0xf5, 0xaf, 0x58, 0x36, 0xe5, 0xba, - 0x3d, 0xeb, 0xd2, 0xef, 0x64, 0x93, 0x33, 0x5e, 0x4a, 0x56, 0xc8, 0xc1, 0x8f, 0xf0, 0x4a, 0x86, - 0x74, 0x4c, 0xd9, 0x7e, 0xfc, 0x2b, 0xe9, 0xda, 0x56, 0x1f, 0x55, 0x81, 0x4d, 0x87, 0x00, 0xbf, - 0xd5, 0x95, 0x04, 0x06, 0x80, 0x07, 0x21, 0xc4, 0xb6, 0xba, 0x12, 0x1c, 0x66, 0x8b, 0x44, 0xf2, - 0x03, 0x9e, 0xf1, 0xa2, 0xdd, 0xea, 0xb5, 0xaa, 0x8f, 0x10, 0xad, 0x4e, 0xa0, 0x36, 0xd8, 0x78, - 0xde, 0xcc, 0xe4, 0xb8, 0x11, 0x30, 0xd2, 0x9a, 0x1e, 0x37, 0xfb, 0xc1, 0x76, 0x75, 0xe7, 0xf8, - 0x3c, 0xe3, 0x0b, 0x71, 0x0d, 0x57, 0x77, 0xae, 0x89, 0x1a, 0x20, 0x56, 0x77, 0x28, 0x68, 0x67, - 0x30, 0xc7, 0xcf, 0x9b, 0x84, 0xdf, 0x80, 0x19, 0xcc, 0x55, 0xae, 0xc4, 0xc4, 0x0c, 0x86, 0x60, - 0xda, 0xc3, 0x49, 0xf4, 0x6b, 0x4a, 0xf8, 0x87, 0x22, 0xc9, 0x06, 0x77, 0x11, 0xa5, 0x4a, 0x60, - 0xac, 0xde, 0xa3, 0x01, 0x50, 0xe2, 0xea, 0xd7, 0x5d, 0x96, 0xc5, 0x3c, 0x45, 0x4b, 0x6c, 0xc5, - 0xc1, 0x12, 0x7b, 0x98, 0x4d, 0x1d, 0x94, 0xb0, 0x8a, 0x5f, 0xa3, 0x2b, 0x56, 0x24, 0xd9, 0x74, - 0x80, 0xe9, 0x3a, 0x72, 0x22, 0x75, 0xc0, 0x38, 0xd0, 0x85, 0xb5, 0xe2, 0x4e, 0x9e, 0x17, 0x55, - 0x58, 0xc4, 0xba, 0xb0, 0x8f, 0x04, 0xbb, 0x70, 0x0b, 0xc5, 0xbd, 0xed, 0xf1, 0x38, 0x4d, 0xb2, - 0xa0, 0x37, 0x8d, 0xf4, 0xf1, 0x66, 0x51, 0xd0, 0x79, 0x8f, 0x38, 0x5b, 0xf0, 0xa6, 0x66, 0xd8, - 0x93, 0x71, 0x81, 0x60, 0xe7, 0x05, 0xa0, 0x5d, 0xa7, 0x29, 0xf1, 0x31, 0xbb, 0xe6, 0xd5, 0x03, - 0xe6, 0xd5, 0xbc, 0x36, 0xc0, 0xf4, 0x3d, 0x82, 0x58, 0xa7, 0xe1, 0xa4, 0x76, 0x35, 0x8f, 0x3e, - 0x52, 0xf2, 0x53, 0x56, 0xc8, 0x24, 0x4e, 0x72, 0x96, 0x35, 0xf9, 0x3f, 0x36, 0xae, 0x5b, 0x94, - 0x71, 0xb9, 0xd5, 0x93, 0xd6, 0x6e, 0xff, 0x63, 0x25, 0xba, 0x0f, 0xfd, 0x9e, 0xf2, 0x62, 0x96, - 0xa8, 0x65, 0x64, 0x59, 0x07, 0xe1, 0xc1, 0x97, 0x61, 0xa3, 0x2d, 0x05, 0x53, 0x9a, 0x1f, 0xde, - 0x5e, 0xd1, 0x26, 0x43, 0x23, 0x9d, 0x5a, 0xbf, 0x2e, 0x26, 0xad, 0x6d, 0x96, 0x51, 0x93, 0x2f, - 0x2b, 0x21, 0x91, 0x0c, 0xb5, 0x20, 0x30, 0xc2, 0xcf, 0xb3, 0xb2, 0xb1, 0x8e, 0x8d, 0x70, 0x2b, - 0x0e, 0x8e, 0x70, 0x0f, 0xb3, 0x23, 0xfc, 0x74, 0x7e, 0x91, 0x26, 0xe5, 0x55, 0x92, 0x4d, 0x75, - 0xe6, 0xeb, 0xeb, 0x5a, 0x31, 0x4c, 0x7e, 0xd7, 0x3a, 0x39, 0xcc, 0x89, 0xee, 0x2c, 0xa4, 0x13, - 0xd0, 0x4d, 0xd6, 0x3a, 0x39, 0xbb, 0x3e, 0xb0, 0xd2, 0x6a, 0xe5, 0x08, 0xd6, 0x07, 0x8e, 0x6a, - 0x25, 0x25, 0xd6, 0x07, 0x6d, 0x4a, 0x9b, 0x17, 0xd1, 0x6f, 0xbb, 0x75, 0x28, 0x45, 0xba, 0xe0, - 0xe7, 0x45, 0x32, 0x78, 0x42, 0x97, 0xaf, 0x61, 0x8c, 0xab, 0x8d, 0x5e, 0xac, 0x0d, 0x54, 0x96, - 0x38, 0xe0, 0x72, 0x24, 0x99, 0x9c, 0x97, 0x20, 0x50, 0x39, 0x36, 0x0c, 0x42, 0x04, 0x2a, 0x02, - 0xd5, 0xde, 0xfe, 0x28, 0x8a, 0xea, 0x45, 0xb7, 0xda, 0x18, 0xf1, 0xe7, 0x1e, 0xbd, 0x1a, 0xf7, - 0x76, 0x45, 0xee, 0x07, 0x08, 0x9b, 0xf0, 0xd4, 0xbf, 0xab, 0xfd, 0x9e, 0x01, 0xaa, 0xa1, 0x44, - 0x44, 0xc2, 0x03, 0x10, 0x58, 0xd0, 0xd1, 0x95, 0xb8, 0xc1, 0x0b, 0x5a, 0x49, 0xc2, 0x05, 0xd5, - 0x84, 0xdd, 0x81, 0xd5, 0x05, 0xc5, 0x76, 0x60, 0x9b, 0x62, 0x84, 0x76, 0x60, 0x21, 0x63, 0xfb, - 0x8c, 0x6b, 0xf8, 0xa5, 0x10, 0xd7, 0x33, 0x56, 0x5c, 0x83, 0x3e, 0xe3, 0x29, 0x37, 0x0c, 0xd1, - 0x67, 0x28, 0xd6, 0xf6, 0x19, 0xd7, 0x61, 0x95, 0x2e, 0x9f, 0x17, 0x29, 0xe8, 0x33, 0x9e, 0x0d, - 0x8d, 0x10, 0x7d, 0x86, 0x40, 0x6d, 0x74, 0x72, 0xbd, 0x8d, 0x38, 0x5c, 0xf3, 0x7b, 0xea, 0x23, - 0x4e, 0xad, 0xf9, 0x11, 0x0c, 0x76, 0xa1, 0x83, 0x82, 0xe5, 0x57, 0x78, 0x17, 0x52, 0xa2, 0x70, - 0x17, 0x6a, 0x10, 0xd8, 0xde, 0x23, 0xce, 0x8a, 0xf8, 0x0a, 0x6f, 0xef, 0x5a, 0x16, 0x6e, 0x6f, - 0xc3, 0xc0, 0xf6, 0xae, 0x05, 0x6f, 0x13, 0x79, 0x75, 0xcc, 0x25, 0xc3, 0xdb, 0xdb, 0x67, 0xc2, - 0xed, 0xdd, 0x62, 0x6d, 0x3e, 0xee, 0x3a, 0x1c, 0xcd, 0x2f, 0xca, 0xb8, 0x48, 0x2e, 0xf8, 0x20, - 0x60, 0xc5, 0x40, 0x44, 0x3e, 0x4e, 0xc2, 0xda, 0xe7, 0xcf, 0x57, 0xa2, 0xbb, 0x4d, 0xb3, 0x8b, - 0xb2, 0xd4, 0x73, 0x9f, 0xef, 0xfe, 0x05, 0xde, 0xbe, 0x04, 0x4e, 0xec, 0x89, 0xf7, 0x50, 0x73, - 0x72, 0x03, 0xbc, 0x48, 0xe7, 0x59, 0x69, 0x0a, 0xf5, 0x65, 0x1f, 0xeb, 0x8e, 0x02, 0x91, 0x1b, - 0xf4, 0x52, 0xb4, 0x69, 0x99, 0x6e, 0x9f, 0x46, 0x76, 0x38, 0x29, 0x41, 0x5a, 0xd6, 0x3c, 0x6f, - 0x87, 0x20, 0xd2, 0x32, 0x9c, 0x84, 0x5d, 0xe1, 0xa0, 0x10, 0xf3, 0xbc, 0xec, 0xe8, 0x0a, 0x00, - 0x0a, 0x77, 0x85, 0x36, 0xac, 0x7d, 0xbe, 0x8b, 0x7e, 0xd7, 0xed, 0x7e, 0xee, 0xc3, 0xde, 0xa2, - 0xfb, 0x14, 0xf6, 0x88, 0x87, 0x7d, 0x71, 0x9b, 0x51, 0x34, 0x9e, 0xe5, 0x1e, 0x97, 0x2c, 0x49, - 0xcb, 0xc1, 0x2a, 0x6e, 0xa3, 0x91, 0x13, 0x19, 0x05, 0xc6, 0xc1, 0xf8, 0xb6, 0x37, 0xcf, 0xd3, - 0x24, 0x6e, 0xbf, 0x91, 0xd0, 0xba, 0x46, 0x1c, 0x8e, 0x6f, 0x2e, 0x06, 0xe3, 0x75, 0x95, 0xfa, - 0xa9, 0xff, 0x8c, 0x97, 0x39, 0xc7, 0xe3, 0xb5, 0x87, 0x84, 0xe3, 0x35, 0x44, 0x61, 0x7d, 0x46, - 0x5c, 0x1e, 0xb1, 0xa5, 0x98, 0x13, 0xf1, 0xda, 0x88, 0xc3, 0xf5, 0x71, 0x31, 0xbb, 0x36, 0x30, - 0x1e, 0x0e, 0x33, 0xc9, 0x8b, 0x8c, 0xa5, 0xfb, 0x29, 0x9b, 0x96, 0x03, 0x22, 0xc6, 0xf8, 0x14, - 0xb1, 0x36, 0xa0, 0x69, 0xe4, 0x31, 0x1e, 0x96, 0xfb, 0x6c, 0x21, 0x8a, 0x44, 0xd2, 0x8f, 0xd1, - 0x22, 0x9d, 0x8f, 0xd1, 0x43, 0x51, 0x6f, 0x3b, 0x45, 0x7c, 0x95, 0x2c, 0xf8, 0x24, 0xe0, 0xad, - 0x41, 0x7a, 0x78, 0x73, 0x50, 0xa4, 0xd1, 0x46, 0x62, 0x5e, 0xc4, 0x9c, 0x6c, 0xb4, 0x5a, 0xdc, - 0xd9, 0x68, 0x06, 0xd3, 0x1e, 0xfe, 0x66, 0x25, 0xfa, 0xbd, 0x5a, 0xea, 0xbe, 0x26, 0xd8, 0x63, - 0xe5, 0xd5, 0x85, 0x60, 0xc5, 0x64, 0xf0, 0x19, 0x66, 0x07, 0x45, 0x8d, 0xeb, 0x67, 0xb7, 0x51, - 0x81, 0x8f, 0xb5, 0xca, 0xbb, 0xed, 0x88, 0x43, 0x1f, 0xab, 0x87, 0x84, 0x1f, 0x2b, 0x44, 0x61, - 0x00, 0x51, 0xf2, 0x7a, 0x4b, 0x6e, 0x95, 0xd4, 0xf7, 0xf7, 0xe5, 0xd6, 0x3a, 0x39, 0x18, 0x1f, - 0x2b, 0xa1, 0xdf, 0x5b, 0xb6, 0x28, 0x1b, 0x78, 0x8f, 0x19, 0xf6, 0xc5, 0x49, 0xcf, 0x66, 0x54, - 0x84, 0x3d, 0xb7, 0x46, 0xc6, 0xb0, 0x2f, 0x4e, 0x78, 0x76, 0xc2, 0x5a, 0xc8, 0x33, 0x12, 0xda, - 0x86, 0x7d, 0x71, 0x98, 0x7d, 0x69, 0xa6, 0x99, 0x17, 0x9e, 0x04, 0xec, 0xc0, 0xb9, 0x61, 0xa3, - 0x17, 0xab, 0x1d, 0xfe, 0xdd, 0x4a, 0xf4, 0x7d, 0xeb, 0xf1, 0x58, 0x4c, 0x92, 0xcb, 0x65, 0x0d, - 0xbd, 0x61, 0xe9, 0x9c, 0x97, 0x83, 0x67, 0x94, 0xb5, 0x36, 0x6b, 0x4a, 0xf0, 0xfc, 0x56, 0x3a, - 0x70, 0xec, 0xec, 0xe4, 0x79, 0xba, 0x1c, 0xf3, 0x59, 0x9e, 0x92, 0x63, 0xc7, 0x43, 0xc2, 0x63, - 0x07, 0xa2, 0x30, 0x2b, 0x1f, 0x8b, 0x2a, 0xe7, 0x47, 0xb3, 0x72, 0x25, 0x0a, 0x67, 0xe5, 0x0d, - 0x02, 0x73, 0xa5, 0xb1, 0xd8, 0x15, 0x69, 0xca, 0x63, 0xd9, 0x3e, 0x6a, 0x60, 0x34, 0x2d, 0x11, - 0xce, 0x95, 0x00, 0x69, 0x77, 0xe5, 0x9a, 0x35, 0x24, 0x2b, 0xf8, 0xcb, 0xe5, 0x51, 0x92, 0x5d, - 0x0f, 0xf0, 0xb4, 0xc0, 0x02, 0xc4, 0xae, 0x1c, 0x0a, 0xc2, 0xb5, 0xea, 0x79, 0x36, 0x11, 0xf8, - 0x5a, 0xb5, 0x92, 0x84, 0xd7, 0xaa, 0x9a, 0x80, 0x26, 0xcf, 0x38, 0x65, 0xb2, 0x92, 0x84, 0x4d, - 0x6a, 0x02, 0x0b, 0x85, 0xfa, 0xdd, 0x0d, 0x19, 0x0a, 0xc1, 0xdb, 0x9a, 0xb5, 0x4e, 0x0e, 0xf6, - 0xd0, 0x66, 0xd1, 0xba, 0xcf, 0x65, 0x7c, 0x85, 0xf7, 0x50, 0x0f, 0x09, 0xf7, 0x50, 0x88, 0xc2, - 0x2a, 0x8d, 0x85, 0x59, 0x74, 0xaf, 0xe2, 0xfd, 0xa3, 0xb5, 0xe0, 0x5e, 0xeb, 0xe4, 0xe0, 0x32, - 0xf2, 0x70, 0xa6, 0x9e, 0x19, 0xda, 0xc9, 0x6b, 0x59, 0x78, 0x19, 0x69, 0x18, 0x58, 0xfa, 0x5a, - 0xa0, 0xf6, 0xb2, 0x56, 0x69, 0x45, 0x6f, 0x37, 0x6b, 0xad, 0x93, 0xd3, 0x4e, 0xfe, 0xcd, 0x2c, - 0xe3, 0x6a, 0xe9, 0x89, 0xa8, 0xc6, 0xc8, 0x1b, 0x96, 0x26, 0x13, 0x26, 0xf9, 0x58, 0x5c, 0xf3, - 0x0c, 0x5f, 0x31, 0xe9, 0xd2, 0xd6, 0xfc, 0xd0, 0x53, 0x08, 0xaf, 0x98, 0xc2, 0x8a, 0xb0, 0x9f, - 0xd4, 0xf4, 0x79, 0xc9, 0x77, 0x59, 0x49, 0x44, 0x32, 0x0f, 0x09, 0xf7, 0x13, 0x88, 0xc2, 0x7c, - 0xb5, 0x96, 0xbf, 0x7a, 0x97, 0xf3, 0x22, 0xe1, 0x59, 0xcc, 0xf1, 0x7c, 0x15, 0x52, 0xe1, 0x7c, - 0x15, 0xa1, 0xe1, 0x5a, 0x6d, 0x8f, 0x49, 0xfe, 0x72, 0x39, 0x4e, 0x66, 0xbc, 0x94, 0x6c, 0x96, - 0xe3, 0x6b, 0x35, 0x00, 0x85, 0xd7, 0x6a, 0x6d, 0xb8, 0xb5, 0x35, 0x64, 0x02, 0x62, 0xfb, 0x84, - 0x12, 0x24, 0x02, 0x27, 0x94, 0x08, 0x14, 0x3e, 0x58, 0x0b, 0xa0, 0x2f, 0x09, 0x5a, 0x56, 0x82, - 0x2f, 0x09, 0x68, 0xba, 0xb5, 0xe1, 0x66, 0x98, 0x51, 0x35, 0x34, 0x3b, 0x8a, 0x3e, 0x72, 0x87, - 0xe8, 0x46, 0x2f, 0x16, 0xdf, 0xe1, 0x3b, 0xe3, 0x29, 0x53, 0xd3, 0x56, 0x60, 0x1b, 0xad, 0x61, - 0xfa, 0xec, 0xf0, 0x39, 0xac, 0x76, 0xf8, 0x57, 0x2b, 0xd1, 0x27, 0x98, 0xc7, 0xd7, 0xb9, 0xf2, - 0xfb, 0xb4, 0xdb, 0x56, 0x4d, 0x12, 0x47, 0xb0, 0xc2, 0x1a, 0xba, 0x0c, 0x7f, 0x16, 0x7d, 0xdc, - 0x88, 0xec, 0x09, 0x2d, 0x5d, 0x00, 0x3f, 0x69, 0x33, 0xe5, 0x87, 0x9c, 0x71, 0xbf, 0xdd, 0x9b, - 0xb7, 0xeb, 0x21, 0xbf, 0x5c, 0x25, 0x58, 0x0f, 0x19, 0x1b, 0x5a, 0x4c, 0xac, 0x87, 0x10, 0xcc, - 0x8e, 0x4e, 0xb7, 0x7a, 0x6f, 0x13, 0x79, 0xa5, 0xf2, 0x2d, 0x30, 0x3a, 0xbd, 0xb2, 0x1a, 0x88, - 0x18, 0x9d, 0x24, 0x0c, 0x33, 0x92, 0x06, 0xac, 0xc6, 0x26, 0x16, 0xcb, 0x8d, 0x21, 0x77, 0x64, - 0xae, 0x77, 0x83, 0xb0, 0xbf, 0x36, 0x62, 0xbd, 0xf4, 0x79, 0x12, 0xb2, 0x00, 0x96, 0x3f, 0x1b, - 0xbd, 0x58, 0xed, 0xf0, 0x2f, 0xa2, 0xef, 0xb5, 0x2a, 0xb6, 0xcf, 0x99, 0x9c, 0x17, 0x7c, 0x32, - 0xd8, 0xee, 0x28, 0x77, 0x03, 0x1a, 0xd7, 0x4f, 0xfb, 0x2b, 0xb4, 0x72, 0xf4, 0x86, 0xab, 0xbb, - 0x95, 0x29, 0xc3, 0xb3, 0x90, 0x49, 0x9f, 0x0d, 0xe6, 0xe8, 0xb4, 0x4e, 0x6b, 0x99, 0xed, 0xf6, - 0xae, 0x9d, 0x05, 0x4b, 0x52, 0xf5, 0xb2, 0xf6, 0xb3, 0x90, 0x51, 0x0f, 0x0d, 0x2e, 0xb3, 0x49, - 0x95, 0x56, 0x64, 0x56, 0x63, 0xdc, 0x59, 0x9e, 0x6d, 0xd2, 0x91, 0x00, 0x59, 0x9d, 0x6d, 0xf5, - 0xa4, 0xb5, 0x5b, 0xd9, 0x4c, 0x79, 0xd5, 0xcf, 0x6e, 0x27, 0xc7, 0xbc, 0x6a, 0x55, 0xa4, 0xa7, - 0x6f, 0xf5, 0xa4, 0xb5, 0xd7, 0x3f, 0x8f, 0x3e, 0x6e, 0x7b, 0xd5, 0x13, 0xd1, 0x76, 0xa7, 0x29, - 0x30, 0x17, 0x3d, 0xed, 0xaf, 0x60, 0x97, 0x34, 0x5f, 0x25, 0xa5, 0x14, 0xc5, 0x72, 0x74, 0x25, - 0x6e, 0x9a, 0x2f, 0x1f, 0xfc, 0xd1, 0xaa, 0x81, 0xa1, 0x43, 0x10, 0x4b, 0x1a, 0x9c, 0x6c, 0xb9, - 0xb2, 0x5f, 0x48, 0x94, 0x84, 0x2b, 0x87, 0xe8, 0x70, 0xe5, 0x93, 0x36, 0x56, 0x35, 0xb5, 0xb2, - 0x9f, 0x73, 0xac, 0xe1, 0x45, 0x6d, 0x7f, 0xd2, 0xb1, 0xde, 0x0d, 0xda, 0x8c, 0x45, 0x8b, 0xf7, - 0x92, 0xcb, 0x4b, 0x53, 0x27, 0xbc, 0xa4, 0x2e, 0x42, 0x64, 0x2c, 0x04, 0x6a, 0x93, 0xee, 0xfd, - 0x24, 0xe5, 0x6a, 0x47, 0xff, 0xf5, 0xe5, 0x65, 0x2a, 0xd8, 0x04, 0x24, 0xdd, 0x95, 0x78, 0xe8, - 0xca, 0x89, 0xa4, 0x1b, 0xe3, 0xec, 0x59, 0x81, 0x4a, 0x7a, 0xc6, 0x63, 0x91, 0xc5, 0x49, 0x0a, - 0x0f, 0x82, 0x2a, 0x4d, 0x23, 0x24, 0xce, 0x0a, 0xb4, 0x20, 0x3b, 0x31, 0x56, 0xa2, 0x6a, 0xd8, - 0x37, 0xe5, 0x7f, 0xd4, 0x56, 0x74, 0xc4, 0xc4, 0xc4, 0x88, 0x60, 0x76, 0xed, 0x59, 0x09, 0xcf, - 0x73, 0x65, 0xfc, 0x5e, 0x5b, 0xab, 0x96, 0x10, 0x6b, 0x4f, 0x9f, 0xb0, 0x6b, 0xa8, 0xea, 0xf7, - 0x3d, 0x71, 0x93, 0x29, 0xa3, 0x0f, 0xda, 0x2a, 0x8d, 0x8c, 0x58, 0x43, 0x41, 0x46, 0x1b, 0xfe, - 0x49, 0xf4, 0xff, 0x95, 0xe1, 0x42, 0xe4, 0x83, 0x3b, 0x88, 0x42, 0xe1, 0x9c, 0xd9, 0xbc, 0x4b, - 0xca, 0xed, 0xd1, 0x02, 0xd3, 0x37, 0xce, 0x4b, 0x36, 0xe5, 0x83, 0x87, 0x44, 0x8b, 0x2b, 0x29, - 0x71, 0xb4, 0xa0, 0x4d, 0xf9, 0xbd, 0xe2, 0x44, 0x4c, 0xb4, 0x75, 0xa4, 0x86, 0x46, 0x18, 0xea, - 0x15, 0x2e, 0x64, 0x93, 0x99, 0x13, 0xb6, 0x48, 0xa6, 0x66, 0xc2, 0xa9, 0xe3, 0x56, 0x09, 0x92, - 0x19, 0xcb, 0x0c, 0x1d, 0x88, 0x48, 0x66, 0x48, 0x58, 0xfb, 0xfc, 0xd7, 0x95, 0xe8, 0x9e, 0x65, - 0x0e, 0x9a, 0xdd, 0xba, 0xc3, 0xec, 0x52, 0x54, 0xa9, 0xcf, 0x51, 0x92, 0x5d, 0x97, 0x83, 0x2f, - 0x28, 0x93, 0x38, 0x6f, 0x8a, 0xf2, 0xe5, 0xad, 0xf5, 0x6c, 0xd6, 0xda, 0x6c, 0x65, 0xd9, 0xf7, - 0xd9, 0xb5, 0x06, 0xc8, 0x5a, 0xcd, 0x8e, 0x17, 0xe4, 0x88, 0xac, 0x35, 0xc4, 0xdb, 0x26, 0x36, - 0xce, 0x53, 0x91, 0xc1, 0x26, 0xb6, 0x16, 0x2a, 0x21, 0xd1, 0xc4, 0x2d, 0xc8, 0xc6, 0xe3, 0x46, - 0x54, 0xef, 0xba, 0xec, 0xa4, 0x29, 0x88, 0xc7, 0x46, 0xd5, 0x00, 0x44, 0x3c, 0x46, 0x41, 0xed, - 0xe7, 0x2c, 0xfa, 0x4e, 0xf5, 0x48, 0x4f, 0x0b, 0xbe, 0x48, 0x38, 0x3c, 0x7a, 0xe1, 0x48, 0x88, - 0xf1, 0xef, 0x13, 0x76, 0x64, 0x9d, 0x67, 0x65, 0x9e, 0xb2, 0xf2, 0x4a, 0xbf, 0x8c, 0xf7, 0xeb, - 0xdc, 0x08, 0xe1, 0xeb, 0xf8, 0x47, 0x1d, 0x94, 0x0d, 0xea, 0x8d, 0xcc, 0x84, 0x98, 0x55, 0x5c, - 0xb5, 0x15, 0x66, 0xd6, 0x3a, 0x39, 0xbb, 0xe3, 0x7d, 0xc0, 0xd2, 0x94, 0x17, 0xcb, 0x46, 0x76, - 0xcc, 0xb2, 0xe4, 0x92, 0x97, 0x12, 0xec, 0x78, 0x6b, 0x6a, 0x08, 0x31, 0x62, 0xc7, 0x3b, 0x80, - 0xdb, 0x6c, 0x1e, 0x78, 0x3e, 0xcc, 0x26, 0xfc, 0x1d, 0xc8, 0xe6, 0xa1, 0x1d, 0xc5, 0x10, 0xd9, - 0x3c, 0xc5, 0xda, 0x9d, 0xdf, 0x97, 0xa9, 0x88, 0xaf, 0xf5, 0x14, 0xe0, 0x37, 0xb0, 0x92, 0xc0, - 0x39, 0xe0, 0x41, 0x08, 0xb1, 0x93, 0x80, 0x12, 0x9c, 0xf1, 0x3c, 0x65, 0x31, 0x3c, 0x7f, 0x53, - 0xeb, 0x68, 0x19, 0x31, 0x09, 0x40, 0x06, 0x14, 0x57, 0x9f, 0xeb, 0xc1, 0x8a, 0x0b, 0x8e, 0xf5, - 0x3c, 0x08, 0x21, 0x76, 0x1a, 0x54, 0x82, 0x51, 0x9e, 0x26, 0x12, 0x0c, 0x83, 0x5a, 0x43, 0x49, - 0x88, 0x61, 0xe0, 0x13, 0xc0, 0xe4, 0x31, 0x2f, 0xa6, 0x1c, 0x35, 0xa9, 0x24, 0x41, 0x93, 0x0d, - 0x61, 0x0f, 0x1b, 0xd7, 0x75, 0x17, 0xf9, 0x12, 0x1c, 0x36, 0xd6, 0xd5, 0x12, 0xf9, 0x92, 0x38, - 0x6c, 0xec, 0x01, 0xa0, 0x88, 0xa7, 0xac, 0x94, 0x78, 0x11, 0x95, 0x24, 0x58, 0xc4, 0x86, 0xb0, - 0x73, 0x74, 0x5d, 0xc4, 0xb9, 0x04, 0x73, 0xb4, 0x2e, 0x80, 0xf3, 0x06, 0xfa, 0x2e, 0x29, 0xb7, - 0x91, 0xa4, 0x6e, 0x15, 0x2e, 0xf7, 0x13, 0x9e, 0x4e, 0x4a, 0x10, 0x49, 0xf4, 0x73, 0x6f, 0xa4, - 0x44, 0x24, 0x69, 0x53, 0xa0, 0x2b, 0xe9, 0xfd, 0x71, 0xac, 0x76, 0x60, 0x6b, 0xfc, 0x41, 0x08, - 0xb1, 0xf1, 0xa9, 0x29, 0xf4, 0x2e, 0x2b, 0x8a, 0xa4, 0x9a, 0xfc, 0x57, 0xf1, 0x02, 0x35, 0x72, - 0x22, 0x3e, 0x61, 0x1c, 0x18, 0x5e, 0x4d, 0xe0, 0xc6, 0x0a, 0x06, 0x43, 0xf7, 0xa7, 0x41, 0xc6, - 0x66, 0x9c, 0x4a, 0xe2, 0xbc, 0x42, 0xc5, 0x9e, 0x26, 0xf2, 0x06, 0x75, 0xb5, 0x0b, 0x73, 0x3e, - 0x06, 0x32, 0x2e, 0x8e, 0xc5, 0x82, 0x8f, 0xc5, 0xab, 0x77, 0x49, 0x29, 0x93, 0x6c, 0xaa, 0x67, - 0xee, 0xe7, 0x84, 0x25, 0x0c, 0x26, 0x3e, 0x06, 0xea, 0x54, 0xb2, 0x09, 0x04, 0x28, 0xcb, 0x09, - 0xbf, 0x41, 0x13, 0x08, 0x68, 0xd1, 0x70, 0x44, 0x02, 0x11, 0xe2, 0xed, 0x3e, 0x8a, 0x71, 0xae, - 0xbf, 0x98, 0x1e, 0x8b, 0x26, 0x97, 0xa3, 0xac, 0x41, 0x90, 0x58, 0xca, 0x06, 0x15, 0xec, 0xfa, - 0xd2, 0xf8, 0xb7, 0x43, 0x6c, 0x9d, 0xb0, 0xd3, 0x1e, 0x66, 0x8f, 0x7b, 0x90, 0x88, 0x2b, 0x7b, - 0x0e, 0x80, 0x72, 0xd5, 0x3e, 0x06, 0xf0, 0xb8, 0x07, 0xe9, 0xec, 0xc9, 0xb8, 0xd5, 0x7a, 0xc9, - 0xe2, 0xeb, 0x69, 0x21, 0xe6, 0xd9, 0x64, 0x57, 0xa4, 0xa2, 0x00, 0x7b, 0x32, 0x5e, 0xa9, 0x01, - 0x4a, 0xec, 0xc9, 0x74, 0xa8, 0xd8, 0x0c, 0xce, 0x2d, 0xc5, 0x4e, 0x9a, 0x4c, 0xe1, 0x8a, 0xda, - 0x33, 0xa4, 0x00, 0x22, 0x83, 0x43, 0x41, 0xa4, 0x13, 0xd5, 0x2b, 0x6e, 0x99, 0xc4, 0x2c, 0xad, - 0xfd, 0x6d, 0xd3, 0x66, 0x3c, 0xb0, 0xb3, 0x13, 0x21, 0x0a, 0x48, 0x3d, 0xc7, 0xf3, 0x22, 0x3b, - 0xcc, 0xa4, 0x20, 0xeb, 0xd9, 0x00, 0x9d, 0xf5, 0x74, 0x40, 0x10, 0x56, 0xc7, 0xfc, 0x5d, 0x55, - 0x9a, 0xea, 0x1f, 0x2c, 0xac, 0x56, 0xbf, 0x0f, 0xb5, 0x3c, 0x14, 0x56, 0x01, 0x07, 0x2a, 0xa3, - 0x9d, 0xd4, 0x1d, 0x26, 0xa0, 0xed, 0x77, 0x93, 0xf5, 0x6e, 0x10, 0xf7, 0x33, 0x92, 0xcb, 0x94, - 0x87, 0xfc, 0x28, 0xa0, 0x8f, 0x9f, 0x06, 0xb4, 0xdb, 0x2d, 0x5e, 0x7d, 0xae, 0x78, 0x7c, 0xdd, - 0x3a, 0xd6, 0xe4, 0x17, 0xb4, 0x46, 0x88, 0xed, 0x16, 0x02, 0xc5, 0x9b, 0xe8, 0x30, 0x16, 0x59, - 0xa8, 0x89, 0x2a, 0x79, 0x9f, 0x26, 0xd2, 0x9c, 0x5d, 0xfc, 0x1a, 0xa9, 0xee, 0x99, 0x75, 0x33, - 0x6d, 0x10, 0x16, 0x5c, 0x88, 0x58, 0xfc, 0x92, 0xb0, 0xcd, 0xc9, 0xa1, 0xcf, 0xe3, 0xf6, 0x99, - 0xef, 0x96, 0x95, 0x63, 0xfa, 0xcc, 0x37, 0xc5, 0xd2, 0x95, 0xac, 0xfb, 0x48, 0x87, 0x15, 0xbf, - 0x9f, 0x6c, 0xf6, 0x83, 0xed, 0x92, 0xc7, 0xf3, 0xb9, 0x9b, 0x72, 0x56, 0xd4, 0x5e, 0xb7, 0x02, - 0x86, 0x2c, 0x46, 0x2c, 0x79, 0x02, 0x38, 0x08, 0x61, 0x9e, 0xe7, 0x5d, 0x91, 0x49, 0x9e, 0x49, - 0x2c, 0x84, 0xf9, 0xc6, 0x34, 0x18, 0x0a, 0x61, 0x94, 0x02, 0xe8, 0xb7, 0x6a, 0x3f, 0x88, 0xcb, - 0x13, 0x36, 0x43, 0x33, 0xb6, 0x7a, 0xaf, 0xa7, 0x96, 0x87, 0xfa, 0x2d, 0xe0, 0x9c, 0x97, 0x7c, - 0xae, 0x97, 0x31, 0x2b, 0xa6, 0x66, 0x77, 0x63, 0x32, 0x78, 0x4a, 0xdb, 0xf1, 0x49, 0xe2, 0x25, - 0x5f, 0x58, 0x03, 0x84, 0x9d, 0xc3, 0x19, 0x9b, 0x9a, 0x9a, 0x22, 0x35, 0x50, 0xf2, 0x56, 0x55, - 0xd7, 0xbb, 0x41, 0xe0, 0xe7, 0x4d, 0x32, 0xe1, 0x22, 0xe0, 0x47, 0xc9, 0xfb, 0xf8, 0x81, 0x20, - 0xc8, 0xde, 0xaa, 0x7a, 0xd7, 0x2b, 0xba, 0x9d, 0x6c, 0xa2, 0xd7, 0xb1, 0x43, 0xe2, 0xf1, 0x00, - 0x2e, 0x94, 0xbd, 0x11, 0x3c, 0x18, 0xa3, 0xcd, 0x06, 0x6d, 0x68, 0x8c, 0x9a, 0xfd, 0xd7, 0x3e, - 0x63, 0x14, 0x83, 0xb5, 0xcf, 0x9f, 0xe9, 0x31, 0xba, 0xc7, 0x24, 0xab, 0xf2, 0xf6, 0x37, 0x09, - 0xbf, 0xd1, 0x0b, 0x61, 0xa4, 0xbe, 0x0d, 0x35, 0x54, 0x9f, 0xac, 0x82, 0x55, 0xf1, 0x76, 0x6f, - 0x3e, 0xe0, 0x5b, 0xaf, 0x10, 0x3a, 0x7d, 0x83, 0xa5, 0xc2, 0x76, 0x6f, 0x3e, 0xe0, 0x5b, 0x7f, - 0x0b, 0xdf, 0xe9, 0x1b, 0x7c, 0x10, 0xbf, 0xdd, 0x9b, 0xd7, 0xbe, 0xff, 0xba, 0x19, 0xb8, 0xae, - 0xf3, 0x2a, 0x0f, 0x8b, 0x65, 0xb2, 0xe0, 0x58, 0x3a, 0xe9, 0xdb, 0x33, 0x68, 0x28, 0x9d, 0xa4, - 0x55, 0x9c, 0x0b, 0x94, 0xb0, 0x52, 0x9c, 0x8a, 0x32, 0x51, 0x2f, 0xe9, 0x9f, 0xf7, 0x30, 0xda, - 0xc0, 0xa1, 0x45, 0x53, 0x48, 0xc9, 0xbe, 0x6e, 0xf4, 0x50, 0x7b, 0x8a, 0x79, 0x33, 0x60, 0xaf, - 0x7d, 0x98, 0x79, 0xab, 0x27, 0x6d, 0x5f, 0xfc, 0x79, 0x8c, 0xfb, 0xc6, 0x31, 0xd4, 0xaa, 0xe8, - 0x4b, 0xc7, 0xa7, 0xfd, 0x15, 0xb4, 0xfb, 0xbf, 0x6d, 0xd6, 0x15, 0xd0, 0xbf, 0x1e, 0x04, 0xcf, - 0xfa, 0x58, 0x04, 0x03, 0xe1, 0xf9, 0xad, 0x74, 0x74, 0x41, 0xfe, 0xb1, 0x59, 0x40, 0x37, 0xa8, - 0xfa, 0x96, 0x43, 0x7d, 0x03, 0xaa, 0xc7, 0x44, 0xa8, 0x59, 0x2d, 0x0c, 0x47, 0xc6, 0x8b, 0x5b, - 0x6a, 0x39, 0xd7, 0x69, 0x79, 0xb0, 0xfe, 0xe6, 0xd0, 0x29, 0x4f, 0xc8, 0xb2, 0x43, 0xc3, 0x02, - 0x7d, 0x71, 0x5b, 0x35, 0x6a, 0xac, 0x38, 0xb0, 0xba, 0x9d, 0xe3, 0x79, 0x4f, 0xc3, 0xde, 0x7d, - 0x1d, 0x9f, 0xdf, 0x4e, 0x49, 0x97, 0xe5, 0xbf, 0x56, 0xa2, 0x47, 0x1e, 0x6b, 0xdf, 0x27, 0x80, - 0x5d, 0x8f, 0x1f, 0x07, 0xec, 0x53, 0x4a, 0xa6, 0x70, 0xbf, 0xff, 0xab, 0x29, 0xdb, 0xbb, 0xa7, - 0x3c, 0x95, 0xfd, 0x24, 0x95, 0xbc, 0x68, 0xdf, 0x3d, 0xe5, 0xdb, 0xad, 0xa9, 0x21, 0x7d, 0xf7, - 0x54, 0x00, 0x77, 0xee, 0x9e, 0x42, 0x3c, 0xa3, 0x77, 0x4f, 0xa1, 0xd6, 0x82, 0x77, 0x4f, 0x85, - 0x35, 0xa8, 0xf0, 0xde, 0x14, 0xa1, 0xde, 0xb7, 0xee, 0x65, 0xd1, 0xdf, 0xc6, 0x7e, 0x76, 0x1b, - 0x15, 0x62, 0x82, 0xab, 0x39, 0x75, 0xce, 0xad, 0xc7, 0x33, 0xf5, 0xce, 0xba, 0x6d, 0xf7, 0xe6, - 0xb5, 0xef, 0x9f, 0xea, 0xd5, 0x8d, 0x09, 0xe7, 0xa2, 0x50, 0xf7, 0x8e, 0x6d, 0x84, 0xc2, 0x73, - 0x65, 0xc1, 0x6d, 0xf9, 0xcd, 0x7e, 0x30, 0x51, 0xdd, 0x8a, 0xd0, 0x8d, 0x3e, 0xec, 0x32, 0x04, - 0x9a, 0x7c, 0xbb, 0x37, 0x4f, 0x4c, 0x23, 0xb5, 0xef, 0xba, 0xb5, 0x7b, 0x18, 0xf3, 0xdb, 0xfa, - 0x69, 0x7f, 0x05, 0xed, 0x7e, 0xa1, 0xd3, 0x46, 0xd7, 0xbd, 0x6a, 0xe7, 0xad, 0x2e, 0x53, 0x23, - 0xaf, 0x99, 0x87, 0x7d, 0xf1, 0x50, 0x02, 0xe1, 0x4e, 0xa1, 0x5d, 0x09, 0x04, 0x3a, 0x8d, 0x7e, - 0x7e, 0x3b, 0x25, 0x5d, 0x96, 0x7f, 0x59, 0x89, 0xee, 0x92, 0x65, 0xd1, 0xfd, 0xe0, 0x8b, 0xbe, - 0x96, 0x41, 0x7f, 0xf8, 0xf2, 0xd6, 0x7a, 0xba, 0x50, 0xff, 0xbe, 0x12, 0xdd, 0x0b, 0x14, 0xaa, - 0xee, 0x20, 0xb7, 0xb0, 0xee, 0x77, 0x94, 0x1f, 0xde, 0x5e, 0x91, 0x9a, 0xee, 0x5d, 0x7c, 0xd4, - 0xbe, 0x94, 0x29, 0x60, 0x7b, 0x44, 0x5f, 0xca, 0xd4, 0xad, 0x05, 0x37, 0x79, 0xd8, 0x45, 0xb3, - 0xe8, 0x42, 0x37, 0x79, 0xd4, 0x09, 0xb5, 0xe0, 0xe5, 0x12, 0x18, 0x87, 0x39, 0x79, 0xf5, 0x2e, - 0x67, 0xd9, 0x84, 0x76, 0x52, 0xcb, 0xbb, 0x9d, 0x18, 0x0e, 0x6e, 0x8e, 0x55, 0xd2, 0x33, 0xd1, - 0x2c, 0xa4, 0x1e, 0x53, 0xfa, 0x06, 0x09, 0x6e, 0x8e, 0xb5, 0x50, 0xc2, 0x9b, 0xce, 0x1a, 0x43, - 0xde, 0x40, 0xb2, 0xf8, 0xa4, 0x0f, 0x0a, 0x52, 0x74, 0xe3, 0xcd, 0xec, 0xb9, 0x6f, 0x86, 0xac, - 0xb4, 0xf6, 0xdd, 0xb7, 0x7a, 0xd2, 0x84, 0xdb, 0x11, 0x97, 0x5f, 0x71, 0x36, 0xe1, 0x45, 0xd0, - 0xad, 0xa1, 0x7a, 0xb9, 0x75, 0x69, 0xcc, 0xed, 0xae, 0x48, 0xe7, 0xb3, 0x4c, 0x37, 0x26, 0xe9, - 0xd6, 0xa5, 0xba, 0xdd, 0x02, 0x1a, 0x6e, 0x0b, 0x5a, 0xb7, 0x2a, 0xbd, 0x7c, 0x12, 0x36, 0xe3, - 0x65, 0x95, 0x1b, 0xbd, 0x58, 0xba, 0x9e, 0xba, 0x1b, 0x75, 0xd4, 0x13, 0xf4, 0xa4, 0xad, 0x9e, - 0x34, 0xdc, 0x9f, 0x73, 0xdc, 0x9a, 0xfe, 0xb4, 0xdd, 0x61, 0xab, 0xd5, 0xa5, 0x9e, 0xf6, 0x57, - 0x80, 0xbb, 0xa1, 0xba, 0x57, 0x1d, 0x25, 0xa5, 0xdc, 0x4f, 0xd2, 0x74, 0xb0, 0x11, 0xe8, 0x26, - 0x0d, 0x14, 0xdc, 0x0d, 0x45, 0x60, 0xa2, 0x27, 0x37, 0xbb, 0x87, 0xd9, 0xa0, 0xcb, 0x8e, 0xa2, - 0x7a, 0xf5, 0x64, 0x97, 0x06, 0x3b, 0x5a, 0xce, 0xa3, 0x36, 0xb5, 0x1d, 0x86, 0x1f, 0x5c, 0xab, - 0xc2, 0xdb, 0xbd, 0x79, 0xf0, 0xba, 0x5d, 0x51, 0x6a, 0x66, 0x79, 0x48, 0x99, 0xf0, 0x66, 0x92, - 0x47, 0x1d, 0x14, 0xd8, 0x15, 0xac, 0x87, 0xd1, 0xdb, 0x64, 0x32, 0xe5, 0x12, 0x7d, 0x53, 0xe4, - 0x02, 0xc1, 0x37, 0x45, 0x00, 0x04, 0x4d, 0x57, 0xff, 0x6e, 0xb6, 0x43, 0x0f, 0x27, 0x58, 0xd3, - 0x69, 0x65, 0x87, 0x0a, 0x35, 0x1d, 0x4a, 0x83, 0x68, 0x60, 0xdc, 0xea, 0xcf, 0xf1, 0x9f, 0x84, - 0xcc, 0x80, 0x6f, 0xf2, 0x37, 0x7a, 0xb1, 0x60, 0x46, 0xb1, 0x0e, 0x93, 0x59, 0x22, 0xb1, 0x19, - 0xc5, 0xb1, 0x51, 0x21, 0xa1, 0x19, 0xa5, 0x8d, 0x52, 0xd5, 0xab, 0x72, 0x84, 0xc3, 0x49, 0xb8, - 0x7a, 0x35, 0xd3, 0xaf, 0x7a, 0x86, 0x6d, 0xbd, 0xd8, 0xcc, 0x4c, 0x97, 0x91, 0x57, 0x7a, 0xb1, - 0x8c, 0xf4, 0x6d, 0xf5, 0x99, 0x26, 0x04, 0x43, 0x51, 0x87, 0x52, 0x80, 0x1b, 0xf6, 0x15, 0xd7, - 0xbc, 0x7b, 0xcd, 0x73, 0xce, 0x0a, 0x96, 0xc5, 0xe8, 0xe2, 0x54, 0x19, 0x6c, 0x91, 0xa1, 0xc5, - 0x29, 0xa9, 0x01, 0x5e, 0x9b, 0xfb, 0x1f, 0x58, 0x22, 0x43, 0xc1, 0x7c, 0xc9, 0xe8, 0x7f, 0x5f, - 0xf9, 0xb8, 0x07, 0x09, 0x5f, 0x9b, 0x37, 0x80, 0xd9, 0xf8, 0xae, 0x9d, 0x7e, 0x16, 0x30, 0xe5, - 0xa3, 0xa1, 0x85, 0x30, 0xad, 0x02, 0x3a, 0xb5, 0x49, 0x70, 0xb9, 0xfc, 0x09, 0x5f, 0x62, 0x9d, - 0xda, 0xe6, 0xa7, 0x0a, 0x09, 0x75, 0xea, 0x36, 0x0a, 0xf2, 0x4c, 0x77, 0x1d, 0xb4, 0x1a, 0xd0, - 0x77, 0x97, 0x3e, 0x6b, 0x9d, 0x1c, 0x18, 0x39, 0x7b, 0xc9, 0xc2, 0x7b, 0x4f, 0x80, 0x14, 0x74, - 0x2f, 0x59, 0xe0, 0xaf, 0x09, 0x36, 0x7a, 0xb1, 0xf0, 0x95, 0x3c, 0x93, 0xfc, 0x5d, 0xf3, 0xae, - 0x1c, 0x29, 0xae, 0x92, 0xb7, 0x5e, 0x96, 0xaf, 0x77, 0x83, 0xf6, 0x00, 0xec, 0x69, 0x21, 0x62, - 0x5e, 0x96, 0xfa, 0xa6, 0x4a, 0xff, 0x84, 0x91, 0x96, 0x0d, 0xc1, 0x3d, 0x95, 0x0f, 0xc3, 0x90, - 0x73, 0xbd, 0x5c, 0x2d, 0xb2, 0xb7, 0xde, 0xac, 0xa2, 0x9a, 0xed, 0x0b, 0x6f, 0xd6, 0x3a, 0x39, - 0x3b, 0xbc, 0xb4, 0xd4, 0xbd, 0xe6, 0x66, 0x1d, 0x55, 0xc7, 0x6e, 0xb8, 0x79, 0xdc, 0x83, 0xd4, - 0xae, 0xbe, 0x8a, 0xde, 0x3f, 0x12, 0xd3, 0x11, 0xcf, 0x26, 0x83, 0x1f, 0xf8, 0x47, 0x68, 0xc5, - 0x74, 0x58, 0xfd, 0x6c, 0x8c, 0xde, 0xa1, 0xc4, 0xf6, 0x10, 0xe0, 0x1e, 0xbf, 0x98, 0x4f, 0x47, - 0x92, 0x49, 0x70, 0x08, 0x50, 0xfd, 0x3e, 0xac, 0x04, 0xc4, 0x21, 0x40, 0x0f, 0x00, 0xf6, 0xc6, - 0x05, 0xe7, 0xa8, 0xbd, 0x4a, 0x10, 0xb4, 0xa7, 0x01, 0x9b, 0x45, 0x18, 0x7b, 0x55, 0xa2, 0x0e, - 0x0f, 0xed, 0x59, 0x1d, 0x25, 0x25, 0xb2, 0x88, 0x36, 0x65, 0x3b, 0x77, 0x5d, 0x7d, 0x75, 0xeb, - 0xc8, 0x7c, 0x36, 0x63, 0xc5, 0x12, 0x74, 0x6e, 0x5d, 0x4b, 0x07, 0x20, 0x3a, 0x37, 0x0a, 0xda, - 0x51, 0xdb, 0x3c, 0xe6, 0xf8, 0xfa, 0x40, 0x14, 0x62, 0x2e, 0x93, 0x8c, 0xc3, 0x9b, 0x27, 0xcc, - 0x03, 0x75, 0x19, 0x62, 0xd4, 0x52, 0xac, 0xcd, 0x72, 0x15, 0x51, 0x9f, 0x27, 0x54, 0xf7, 0x57, - 0x97, 0x52, 0x14, 0xf0, 0x7d, 0x62, 0x6d, 0x05, 0x42, 0x44, 0x96, 0x4b, 0xc2, 0xa0, 0xed, 0x4f, - 0x93, 0x6c, 0x8a, 0xb6, 0xfd, 0xa9, 0x7b, 0xfb, 0xeb, 0x3d, 0x1a, 0xb0, 0x03, 0xaa, 0x7e, 0x68, - 0xf5, 0x00, 0xd0, 0xdf, 0x72, 0xa2, 0x0f, 0xdd, 0x25, 0x88, 0x01, 0x85, 0x93, 0xc0, 0xd5, 0xeb, - 0x9c, 0x67, 0x7c, 0xd2, 0x9c, 0x9a, 0xc3, 0x5c, 0x79, 0x44, 0xd0, 0x15, 0x24, 0x6d, 0x2c, 0x52, - 0xf2, 0xb3, 0x79, 0x76, 0x5a, 0x88, 0xcb, 0x24, 0xe5, 0x05, 0x88, 0x45, 0xb5, 0xba, 0x23, 0x27, - 0x62, 0x11, 0xc6, 0xd9, 0xe3, 0x17, 0x4a, 0xea, 0x5d, 0xc2, 0x3e, 0x2e, 0x58, 0x0c, 0x8f, 0x5f, - 0xd4, 0x36, 0xda, 0x18, 0xb1, 0x33, 0x18, 0xc0, 0x9d, 0x44, 0xa7, 0x76, 0x9d, 0x2d, 0x55, 0xff, - 0xd0, 0xdf, 0x12, 0xaa, 0x3b, 0x51, 0x4b, 0x90, 0xe8, 0x68, 0x73, 0x18, 0x49, 0x24, 0x3a, 0x61, - 0x0d, 0x3b, 0x95, 0x28, 0xee, 0x44, 0x1f, 0x2b, 0x02, 0x53, 0x49, 0x6d, 0xa3, 0x11, 0x12, 0x53, - 0x49, 0x0b, 0x02, 0x01, 0xa9, 0x19, 0x06, 0x53, 0x34, 0x20, 0x19, 0x69, 0x30, 0x20, 0xb9, 0x94, - 0x0d, 0x14, 0x87, 0x59, 0x22, 0x13, 0x96, 0x8e, 0xb8, 0x3c, 0x65, 0x05, 0x9b, 0x71, 0xc9, 0x0b, - 0x18, 0x28, 0x34, 0x32, 0xf4, 0x18, 0x22, 0x50, 0x50, 0xac, 0x76, 0xf8, 0x07, 0xd1, 0x87, 0xd5, - 0xbc, 0xcf, 0x33, 0xfd, 0xe7, 0x56, 0x5e, 0xa9, 0xbf, 0xd3, 0x34, 0xf8, 0xc8, 0xd8, 0x18, 0xc9, - 0x82, 0xb3, 0x59, 0x63, 0xfb, 0x03, 0xf3, 0xbb, 0x02, 0x9f, 0xae, 0x54, 0xfd, 0xf9, 0x44, 0xc8, - 0xe4, 0xb2, 0x5a, 0x66, 0xeb, 0x2f, 0x88, 0x40, 0x7f, 0x76, 0xc5, 0xc3, 0xc0, 0x5d, 0x14, 0x18, - 0x67, 0xe3, 0xb4, 0x2b, 0x3d, 0xe3, 0x79, 0x0a, 0xe3, 0xb4, 0xa7, 0xad, 0x00, 0x22, 0x4e, 0xa3, - 0xa0, 0x1d, 0x9c, 0xae, 0x78, 0xcc, 0xc3, 0x95, 0x19, 0xf3, 0x7e, 0x95, 0x19, 0x7b, 0x1f, 0x65, - 0xa4, 0xd1, 0x87, 0xc7, 0x7c, 0x76, 0xc1, 0x8b, 0xf2, 0x2a, 0xc9, 0xa9, 0x7b, 0x5b, 0x2d, 0xd1, - 0x79, 0x6f, 0x2b, 0x81, 0xda, 0x99, 0xc0, 0x02, 0x87, 0xe5, 0x09, 0x9b, 0x71, 0x75, 0xb3, 0x06, - 0x98, 0x09, 0x1c, 0x23, 0x0e, 0x44, 0xcc, 0x04, 0x24, 0xec, 0x7c, 0xdf, 0x65, 0x99, 0x33, 0x3e, - 0xad, 0x7a, 0x58, 0x71, 0xca, 0x96, 0x33, 0x9e, 0x49, 0x6d, 0x12, 0xec, 0xc9, 0x3b, 0x26, 0x71, - 0x9e, 0xd8, 0x93, 0xef, 0xa3, 0xe7, 0x84, 0x26, 0xef, 0xc1, 0x9f, 0x8a, 0x42, 0xd6, 0x7f, 0x4c, - 0xe9, 0xbc, 0x48, 0x41, 0x68, 0xf2, 0x1f, 0xaa, 0x47, 0x12, 0xa1, 0x29, 0xac, 0xe1, 0xfc, 0x15, - 0x02, 0xaf, 0x0c, 0x6f, 0x78, 0x61, 0xfa, 0xc9, 0xab, 0x19, 0x4b, 0x52, 0xdd, 0x1b, 0x7e, 0x14, - 0xb0, 0x4d, 0xe8, 0x10, 0x7f, 0x85, 0xa0, 0xaf, 0xae, 0xf3, 0x77, 0x1b, 0xc2, 0x25, 0x04, 0xaf, - 0x08, 0x3a, 0xec, 0x13, 0xaf, 0x08, 0xba, 0xb5, 0xec, 0xca, 0xdd, 0xb2, 0x8a, 0x5b, 0x2a, 0x62, - 0x57, 0x4c, 0xe0, 0x7e, 0xa1, 0x63, 0x13, 0x80, 0xc4, 0xca, 0x3d, 0xa8, 0x60, 0x53, 0x03, 0x8b, - 0xed, 0x27, 0x19, 0x4b, 0x93, 0x9f, 0xc1, 0xb4, 0xde, 0xb1, 0xd3, 0x10, 0x44, 0x6a, 0x80, 0x93, - 0x98, 0xab, 0x03, 0x2e, 0xc7, 0x49, 0x15, 0xfa, 0xd7, 0x03, 0xcf, 0x4d, 0x11, 0xdd, 0xae, 0x1c, - 0xd2, 0xb9, 0xa3, 0x15, 0x3e, 0xd6, 0x9d, 0x3c, 0x1f, 0x55, 0xb3, 0xea, 0x19, 0x8f, 0x79, 0x92, - 0xcb, 0xc1, 0x8b, 0xf0, 0xb3, 0x02, 0x38, 0x71, 0xd0, 0xa2, 0x87, 0x9a, 0xf3, 0xfa, 0xbe, 0x8a, - 0x25, 0xa3, 0xfa, 0xaf, 0x0c, 0x9e, 0x97, 0xbc, 0xd0, 0x89, 0xc6, 0x01, 0x97, 0x60, 0x74, 0x3a, - 0xdc, 0xd0, 0x01, 0xab, 0x8a, 0x12, 0xa3, 0x33, 0xac, 0x61, 0x37, 0xfb, 0x1c, 0x4e, 0xdf, 0xb9, - 0xad, 0xce, 0x1b, 0x6e, 0x92, 0xc6, 0x1c, 0x8a, 0xd8, 0xec, 0xa3, 0x69, 0x9b, 0xad, 0xb5, 0xdd, - 0xee, 0x64, 0xcb, 0x43, 0x78, 0x64, 0x02, 0xb1, 0xa4, 0x30, 0x22, 0x5b, 0x0b, 0xe0, 0xce, 0x66, - 0x78, 0x21, 0xd8, 0x24, 0x66, 0xa5, 0x3c, 0x65, 0xcb, 0x54, 0xb0, 0x89, 0x9a, 0xd7, 0xe1, 0x66, - 0x78, 0xc3, 0x0c, 0x5d, 0x88, 0xda, 0x0c, 0xa7, 0x60, 0x37, 0x3b, 0x53, 0x7f, 0x3c, 0x51, 0x9f, - 0xe5, 0x84, 0xd9, 0x99, 0x2a, 0x2f, 0x3c, 0xc7, 0xf9, 0x30, 0x0c, 0xd9, 0x6f, 0xd0, 0x6a, 0x91, - 0x4a, 0x43, 0xee, 0x61, 0x3a, 0x5e, 0x02, 0x72, 0x3f, 0x40, 0xd8, 0x7b, 0x29, 0xea, 0xdf, 0x9b, - 0xbf, 0xff, 0x23, 0xf5, 0x4d, 0xd6, 0x9b, 0x98, 0xae, 0x0b, 0x0d, 0xdd, 0x0b, 0xee, 0xb6, 0x7a, - 0xd2, 0x36, 0xcd, 0xdc, 0xbd, 0x62, 0x72, 0x67, 0x32, 0x39, 0xe6, 0x25, 0xf2, 0x41, 0x79, 0x25, - 0x1c, 0x5a, 0x29, 0x91, 0x66, 0xb6, 0x29, 0xdb, 0xd1, 0x2b, 0xd9, 0xab, 0x49, 0x22, 0xb5, 0xac, - 0x39, 0x21, 0xbd, 0xd9, 0x36, 0xd0, 0xa6, 0x88, 0x5a, 0xd1, 0xb4, 0x8d, 0xe5, 0x15, 0x33, 0x16, - 0xd3, 0x69, 0xca, 0x35, 0x74, 0xc6, 0x59, 0x7d, 0x91, 0xdf, 0x76, 0xdb, 0x16, 0x0a, 0x12, 0xb1, - 0x3c, 0xa8, 0x60, 0xd3, 0xc8, 0x0a, 0xab, 0x5f, 0x49, 0x35, 0x0f, 0x76, 0xad, 0x6d, 0xc6, 0x03, - 0x88, 0x34, 0x12, 0x05, 0xed, 0x77, 0x6f, 0x95, 0xf8, 0x80, 0x37, 0x4f, 0x02, 0x5e, 0x41, 0xa4, - 0x94, 0x1d, 0x31, 0xf1, 0xdd, 0x1b, 0x82, 0xd9, 0x75, 0x02, 0xf0, 0xf0, 0x72, 0x79, 0x38, 0x81, - 0xeb, 0x04, 0xa8, 0xaf, 0x18, 0x62, 0x9d, 0x40, 0xb1, 0x7e, 0xd3, 0x99, 0x7d, 0xaf, 0x23, 0x56, - 0xda, 0xca, 0x21, 0x4d, 0x87, 0x82, 0xa1, 0xa6, 0xa3, 0x14, 0xfc, 0x47, 0xea, 0x6e, 0xad, 0x21, - 0x8f, 0x14, 0xdb, 0x57, 0x5b, 0xed, 0xc2, 0x6c, 0x5c, 0x32, 0xeb, 0x49, 0x75, 0x64, 0x09, 0xbf, - 0xc1, 0xbf, 0x16, 0x12, 0x71, 0xa9, 0x05, 0xd5, 0xb6, 0x5f, 0xde, 0xff, 0xef, 0x6f, 0xee, 0xac, - 0xfc, 0xe2, 0x9b, 0x3b, 0x2b, 0xff, 0xfb, 0xcd, 0x9d, 0x95, 0x9f, 0x7f, 0x7b, 0xe7, 0xbd, 0x5f, - 0x7c, 0x7b, 0xe7, 0xbd, 0xff, 0xf9, 0xf6, 0xce, 0x7b, 0x5f, 0xbf, 0xaf, 0xff, 0xa8, 0xee, 0xc5, - 0xff, 0x53, 0x7f, 0x1a, 0xf7, 0xf9, 0xff, 0x05, 0x00, 0x00, 0xff, 0xff, 0xb2, 0x7c, 0x4b, 0xdb, - 0x78, 0x77, 0x00, 0x00, + // 5389 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x9d, 0xdd, 0x6f, 0x24, 0x49, + 0x52, 0xc0, 0xcf, 0x2f, 0x2c, 0xd4, 0x71, 0x0b, 0xf4, 0xc2, 0xb2, 0xb7, 0xdc, 0xcd, 0xcc, 0xce, + 0xce, 0xd8, 0x33, 0x63, 0xbb, 0x3d, 0x3b, 0xb3, 0x1f, 0xa7, 0x3b, 0x24, 0xd4, 0x63, 0x8f, 0xbd, + 0xbe, 0xb3, 0x3d, 0xc6, 0xdd, 0x9e, 0x91, 0x56, 0x42, 0x22, 0xdd, 0x95, 0x6e, 0x17, 0xae, 0xae, + 0xac, 0xab, 0xca, 0x6e, 0x4f, 0x1f, 0x02, 0x81, 0x40, 0x20, 0x10, 0x88, 0x13, 0x5f, 0xaf, 0x48, + 0xfc, 0x35, 0x3c, 0xde, 0x23, 0x8f, 0x68, 0xf7, 0x8d, 0x07, 0xfe, 0x06, 0x54, 0x59, 0x59, 0xf9, + 0x11, 0x15, 0x91, 0x55, 0xbe, 0xa7, 0x19, 0x75, 0xfc, 0x22, 0x22, 0x3f, 0x23, 0x23, 0xb3, 0xb2, + 0xca, 0xd1, 0xdd, 0xfc, 0x62, 0x27, 0x2f, 0x84, 0x14, 0xe5, 0x4e, 0xc9, 0x8b, 0x65, 0x32, 0xe5, + 0xcd, 0xbf, 0x43, 0xf5, 0xf3, 0xe0, 0x1d, 0x96, 0xad, 0xe4, 0x2a, 0xe7, 0x1f, 0x7e, 0x60, 0xc9, + 0xa9, 0x98, 0xcf, 0x59, 0x16, 0x97, 0x35, 0xf2, 0xe1, 0xfb, 0x56, 0xc2, 0x97, 0x3c, 0x93, 0xfa, + 0xf7, 0x67, 0xff, 0xfb, 0x7f, 0x6b, 0xd1, 0xbb, 0xbb, 0x69, 0xc2, 0x33, 0xb9, 0xab, 0x35, 0x06, + 0x5f, 0x45, 0xdf, 0x19, 0xe5, 0xf9, 0x01, 0x97, 0xaf, 0x79, 0x51, 0x26, 0x22, 0x1b, 0x7c, 0x3c, + 0xd4, 0x0e, 0x86, 0x67, 0xf9, 0x74, 0x38, 0xca, 0xf3, 0xa1, 0x15, 0x0e, 0xcf, 0xf8, 0x4f, 0x17, + 0xbc, 0x94, 0x1f, 0x3e, 0x08, 0x43, 0x65, 0x2e, 0xb2, 0x92, 0x0f, 0x2e, 0xa3, 0xdf, 0x1a, 0xe5, + 0xf9, 0x98, 0xcb, 0x3d, 0x5e, 0x55, 0x60, 0x2c, 0x99, 0xe4, 0x83, 0x8d, 0x96, 0xaa, 0x0f, 0x18, + 0x1f, 0x8f, 0xba, 0x41, 0xed, 0x67, 0x12, 0x7d, 0xbb, 0xf2, 0x73, 0xb5, 0x90, 0xb1, 0xb8, 0xc9, + 0x06, 0x1f, 0xb5, 0x15, 0xb5, 0xc8, 0xd8, 0xbe, 0x1f, 0x42, 0xb4, 0xd5, 0x37, 0xd1, 0xaf, 0xbf, + 0x61, 0x69, 0xca, 0xe5, 0x6e, 0xc1, 0xab, 0x82, 0xfb, 0x3a, 0xb5, 0x68, 0x58, 0xcb, 0x8c, 0xdd, + 0x8f, 0x83, 0x8c, 0x36, 0xfc, 0x55, 0xf4, 0x9d, 0x5a, 0x72, 0xc6, 0xa7, 0x62, 0xc9, 0x8b, 0x01, + 0xaa, 0xa5, 0x85, 0x44, 0x93, 0xb7, 0x20, 0x68, 0x7b, 0x57, 0x64, 0x4b, 0x5e, 0x48, 0xdc, 0xb6, + 0x16, 0x86, 0x6d, 0x5b, 0x48, 0xdb, 0xfe, 0xbb, 0xb5, 0xe8, 0x7b, 0xa3, 0xe9, 0x54, 0x2c, 0x32, + 0x79, 0x24, 0xa6, 0x2c, 0x3d, 0x4a, 0xb2, 0xeb, 0x13, 0x7e, 0xb3, 0x7b, 0x55, 0xf1, 0xd9, 0x8c, + 0x0f, 0x9e, 0xfb, 0xad, 0x5a, 0xa3, 0x43, 0xc3, 0x0e, 0x5d, 0xd8, 0xf8, 0xfe, 0xf4, 0x76, 0x4a, + 0xba, 0x2c, 0xff, 0xb4, 0x16, 0xdd, 0x81, 0x65, 0x19, 0x8b, 0x74, 0xc9, 0x6d, 0x69, 0x3e, 0xeb, + 0x30, 0xec, 0xe3, 0xa6, 0x3c, 0x9f, 0xdf, 0x56, 0x4d, 0x97, 0x28, 0x8d, 0xde, 0x73, 0x87, 0xcb, + 0x98, 0x97, 0x6a, 0x3a, 0x3d, 0xa6, 0x47, 0x84, 0x46, 0x8c, 0xe7, 0x27, 0x7d, 0x50, 0xed, 0x2d, + 0x89, 0x06, 0xda, 0x5b, 0x2a, 0x4a, 0xe3, 0xec, 0x11, 0x6a, 0xc1, 0x21, 0x8c, 0xaf, 0xc7, 0x3d, + 0x48, 0xed, 0xea, 0x8f, 0xa3, 0xdf, 0x78, 0x23, 0x8a, 0xeb, 0x32, 0x67, 0x53, 0xae, 0xa7, 0xc2, + 0x43, 0x5f, 0xbb, 0x91, 0xc2, 0xd9, 0xb0, 0xde, 0x85, 0x39, 0x83, 0xb6, 0x11, 0xbe, 0xca, 0x39, + 0x8c, 0x41, 0x56, 0xb1, 0x12, 0x52, 0x83, 0x16, 0x42, 0xda, 0xf6, 0x75, 0x34, 0xb0, 0xb6, 0x2f, + 0xfe, 0x84, 0x4f, 0xe5, 0x28, 0x8e, 0x61, 0xaf, 0x58, 0x5d, 0x45, 0x0c, 0x47, 0x71, 0x4c, 0xf5, + 0x0a, 0x8e, 0x6a, 0x67, 0x37, 0xd1, 0xfb, 0xc0, 0xd9, 0x51, 0x52, 0x2a, 0x87, 0xdb, 0x61, 0x2b, + 0x1a, 0x33, 0x4e, 0x87, 0x7d, 0x71, 0xed, 0xf8, 0x2f, 0xd6, 0xa2, 0xef, 0x22, 0x9e, 0xcf, 0xf8, + 0x5c, 0x2c, 0xf9, 0xe0, 0x69, 0xb7, 0xb5, 0x9a, 0x34, 0xfe, 0x3f, 0xb9, 0x85, 0x06, 0x32, 0x4c, + 0xc6, 0x3c, 0xe5, 0x53, 0x49, 0x0e, 0x93, 0x5a, 0xdc, 0x39, 0x4c, 0x0c, 0xe6, 0xcc, 0xb0, 0x46, + 0x78, 0xc0, 0xe5, 0xee, 0xa2, 0x28, 0x78, 0x26, 0xc9, 0xbe, 0xb4, 0x48, 0x67, 0x5f, 0x7a, 0x28, + 0x52, 0x9f, 0x03, 0x2e, 0x47, 0x69, 0x4a, 0xd6, 0xa7, 0x16, 0x77, 0xd6, 0xc7, 0x60, 0xda, 0xc3, + 0x34, 0xfa, 0x4d, 0xa7, 0xc5, 0xe4, 0x61, 0x76, 0x29, 0x06, 0x74, 0x5b, 0x28, 0xb9, 0xf1, 0xb1, + 0xd1, 0xc9, 0x21, 0xd5, 0x78, 0xf9, 0x36, 0x17, 0x05, 0xdd, 0x2d, 0xb5, 0xb8, 0xb3, 0x1a, 0x06, + 0xd3, 0x1e, 0xfe, 0x28, 0x7a, 0x57, 0x47, 0xc9, 0x66, 0x3d, 0x7b, 0x80, 0x86, 0x50, 0xb8, 0xa0, + 0x3d, 0xec, 0xa0, 0x6c, 0x70, 0xd0, 0x32, 0x1d, 0x7c, 0x3e, 0x46, 0xf5, 0x40, 0xe8, 0x79, 0x10, + 0x86, 0x5a, 0xb6, 0xf7, 0x78, 0xca, 0x49, 0xdb, 0xb5, 0xb0, 0xc3, 0xb6, 0x81, 0xb4, 0xed, 0x22, + 0xfa, 0x1d, 0xd3, 0x2c, 0xd5, 0x3a, 0xaa, 0xe4, 0x55, 0x90, 0xde, 0x24, 0xea, 0xed, 0x42, 0xc6, + 0xd7, 0x56, 0x3f, 0xb8, 0x55, 0x1f, 0x3d, 0x03, 0xf1, 0xfa, 0x80, 0xf9, 0xf7, 0x20, 0x0c, 0x69, + 0xdb, 0x7f, 0xbf, 0x16, 0x7d, 0x5f, 0xcb, 0x5e, 0x66, 0xec, 0x22, 0xe5, 0x6a, 0x49, 0x3c, 0xe1, + 0xf2, 0x46, 0x14, 0xd7, 0xe3, 0x55, 0x36, 0x25, 0x96, 0x7f, 0x1c, 0xee, 0x58, 0xfe, 0x49, 0x25, + 0x5d, 0x98, 0x3f, 0x8d, 0x3e, 0x68, 0x06, 0xc5, 0x15, 0xcb, 0x66, 0xfc, 0xc7, 0xa5, 0xc8, 0x46, + 0x79, 0x32, 0x8a, 0xe3, 0x62, 0x30, 0xc4, 0xbb, 0x1e, 0x72, 0xa6, 0x04, 0x3b, 0xbd, 0x79, 0x27, + 0xdd, 0xd4, 0xad, 0x2c, 0x45, 0x0e, 0xd3, 0xcd, 0xa6, 0xf9, 0xa4, 0xc8, 0xa9, 0x74, 0xd3, 0x47, + 0x5a, 0x56, 0x8f, 0xab, 0x98, 0x8d, 0x5b, 0x3d, 0x76, 0x83, 0xf4, 0xfd, 0x10, 0x62, 0x63, 0x66, + 0xd3, 0x50, 0x22, 0xbb, 0x4c, 0x66, 0xe7, 0x79, 0x5c, 0xcd, 0xa1, 0xc7, 0x78, 0x9d, 0x1d, 0x84, + 0x88, 0x99, 0x04, 0xaa, 0xbd, 0xfd, 0xa3, 0xcd, 0xca, 0xf4, 0x3c, 0xde, 0x2f, 0xc4, 0xfc, 0x88, + 0xcf, 0xd8, 0x74, 0xa5, 0x83, 0xcf, 0xa7, 0xa1, 0x59, 0x0f, 0x69, 0x53, 0x88, 0xcf, 0x6e, 0xa9, + 0xa5, 0xcb, 0xf3, 0x1f, 0x6b, 0xd1, 0x03, 0x6f, 0x9c, 0xe8, 0xc1, 0x54, 0x97, 0x7e, 0x94, 0xc5, + 0x67, 0xbc, 0x94, 0xac, 0x90, 0x83, 0x1f, 0x06, 0xc6, 0x00, 0xa1, 0x63, 0xca, 0xf6, 0xa3, 0x5f, + 0x4a, 0xd7, 0xf6, 0xfa, 0xb8, 0x8a, 0xaa, 0x3a, 0xfe, 0xf8, 0xbd, 0xae, 0x24, 0x30, 0xfa, 0xdc, + 0x0f, 0x21, 0xb6, 0xd7, 0x95, 0xe0, 0x30, 0x5b, 0x26, 0x92, 0x1f, 0xf0, 0x8c, 0x17, 0xed, 0x5e, + 0xaf, 0x55, 0x7d, 0x84, 0xe8, 0x75, 0x02, 0xb5, 0x91, 0xce, 0xf3, 0x66, 0x56, 0xe6, 0xcd, 0x80, + 0x91, 0xd6, 0xda, 0xbc, 0xd5, 0x0f, 0xb6, 0x5b, 0x4b, 0xc7, 0xe7, 0x19, 0x5f, 0x8a, 0x6b, 0xb8, + 0xb5, 0x74, 0x4d, 0xd4, 0x00, 0xb1, 0xb5, 0x44, 0x41, 0xbb, 0x7c, 0x3a, 0x7e, 0x5e, 0x27, 0xfc, + 0x06, 0x2c, 0x9f, 0xae, 0x72, 0x25, 0x26, 0x96, 0x4f, 0x04, 0xd3, 0x1e, 0x4e, 0xa2, 0x5f, 0x53, + 0xc2, 0x1f, 0x8b, 0x24, 0x1b, 0xdc, 0x45, 0x94, 0x2a, 0x81, 0xb1, 0x7a, 0x8f, 0x06, 0x40, 0x89, + 0xab, 0x5f, 0x77, 0x59, 0x36, 0xe5, 0x29, 0x5a, 0x62, 0x2b, 0x0e, 0x96, 0xd8, 0xc3, 0x6c, 0xde, + 0xa2, 0x84, 0x55, 0xfc, 0x1a, 0x5f, 0xb1, 0x22, 0xc9, 0x66, 0x03, 0x4c, 0xd7, 0x91, 0x13, 0x79, + 0x0b, 0xc6, 0x81, 0x21, 0xac, 0x15, 0x47, 0x79, 0x5e, 0x54, 0x61, 0x11, 0x1b, 0xc2, 0x3e, 0x12, + 0x1c, 0xc2, 0x2d, 0x14, 0xf7, 0xb6, 0xc7, 0xa7, 0x69, 0x92, 0x05, 0xbd, 0x69, 0xa4, 0x8f, 0x37, + 0x8b, 0x82, 0xc1, 0x7b, 0xc4, 0xd9, 0x92, 0x37, 0x35, 0xc3, 0x5a, 0xc6, 0x05, 0x82, 0x83, 0x17, + 0x80, 0x76, 0x93, 0xa8, 0xc4, 0xc7, 0xec, 0x9a, 0x57, 0x0d, 0xcc, 0xab, 0x45, 0x75, 0x80, 0xe9, + 0x7b, 0x04, 0xb1, 0x49, 0xc4, 0x49, 0xed, 0x6a, 0x11, 0xbd, 0xaf, 0xe4, 0xa7, 0xac, 0x90, 0xc9, + 0x34, 0xc9, 0x59, 0xd6, 0x6c, 0x3e, 0xb0, 0x79, 0xdd, 0xa2, 0x8c, 0xcb, 0xed, 0x9e, 0xb4, 0x76, + 0xfb, 0xef, 0x6b, 0xd1, 0x47, 0xd0, 0xef, 0x29, 0x2f, 0xe6, 0x89, 0xda, 0xc3, 0x96, 0x75, 0x10, + 0x1e, 0x7c, 0x11, 0x36, 0xda, 0x52, 0x30, 0xa5, 0xf9, 0xc1, 0xed, 0x15, 0x6d, 0x26, 0x36, 0xd6, + 0x79, 0xfd, 0xab, 0x22, 0x6e, 0x9d, 0xf1, 0x8c, 0x9b, 0x64, 0x5d, 0x09, 0x89, 0x4c, 0xac, 0x05, + 0x81, 0x19, 0x7e, 0x9e, 0x95, 0x8d, 0x75, 0x6c, 0x86, 0x5b, 0x71, 0x70, 0x86, 0x7b, 0x98, 0x9d, + 0xe1, 0xa7, 0x8b, 0x8b, 0x34, 0x29, 0xaf, 0x92, 0x6c, 0xa6, 0xd3, 0x6e, 0x5f, 0xd7, 0x8a, 0x61, + 0xe6, 0xbd, 0xd1, 0xc9, 0x61, 0x4e, 0xf4, 0x60, 0x21, 0x9d, 0x80, 0x61, 0xb2, 0xd1, 0xc9, 0xd9, + 0xcd, 0x89, 0x95, 0x56, 0xdb, 0x56, 0xb0, 0x39, 0x71, 0x54, 0x2b, 0x29, 0xb1, 0x39, 0x69, 0x53, + 0xda, 0xbc, 0x88, 0x7e, 0xdb, 0xad, 0x43, 0x29, 0xd2, 0x25, 0x3f, 0x2f, 0x92, 0xc1, 0x13, 0xba, + 0x7c, 0x0d, 0x63, 0x5c, 0x6d, 0xf6, 0x62, 0x6d, 0xa0, 0xb2, 0xc4, 0x01, 0x97, 0x63, 0xc9, 0xe4, + 0xa2, 0x04, 0x81, 0xca, 0xb1, 0x61, 0x10, 0x22, 0x50, 0x11, 0xa8, 0xf6, 0xf6, 0x87, 0x51, 0x54, + 0xef, 0xf8, 0xd5, 0xa9, 0x8c, 0xbf, 0xf6, 0xe8, 0xa3, 0x00, 0xef, 0x48, 0xe6, 0xa3, 0x00, 0x61, + 0x13, 0x9e, 0xfa, 0x77, 0x75, 0xd8, 0x34, 0x40, 0x35, 0x94, 0x88, 0x48, 0x78, 0x00, 0x02, 0x0b, + 0x3a, 0xbe, 0x12, 0x37, 0x78, 0x41, 0x2b, 0x49, 0xb8, 0xa0, 0x9a, 0xb0, 0xc7, 0xbf, 0xba, 0xa0, + 0xd8, 0xf1, 0x6f, 0x53, 0x8c, 0xd0, 0xf1, 0x2f, 0x64, 0xec, 0x98, 0x71, 0x0d, 0xbf, 0x10, 0xe2, + 0x7a, 0xce, 0x8a, 0x6b, 0x30, 0x66, 0x3c, 0xe5, 0x86, 0x21, 0xc6, 0x0c, 0xc5, 0xda, 0x31, 0xe3, + 0x3a, 0xac, 0xd2, 0xe5, 0xf3, 0x22, 0x05, 0x63, 0xc6, 0xb3, 0xa1, 0x11, 0x62, 0xcc, 0x10, 0xa8, + 0x8d, 0x4e, 0xae, 0xb7, 0x31, 0x87, 0x07, 0x0e, 0x9e, 0xfa, 0x98, 0x53, 0x07, 0x0e, 0x08, 0x06, + 0x87, 0xd0, 0x41, 0xc1, 0xf2, 0x2b, 0x7c, 0x08, 0x29, 0x51, 0x78, 0x08, 0x35, 0x08, 0xec, 0xef, + 0x31, 0x67, 0xc5, 0xf4, 0x0a, 0xef, 0xef, 0x5a, 0x16, 0xee, 0x6f, 0xc3, 0xc0, 0xfe, 0xae, 0x05, + 0x6f, 0x12, 0x79, 0x75, 0xcc, 0x25, 0xc3, 0xfb, 0xdb, 0x67, 0xc2, 0xfd, 0xdd, 0x62, 0x6d, 0x3e, + 0xee, 0x3a, 0x1c, 0x2f, 0x2e, 0xca, 0x69, 0x91, 0x5c, 0xf0, 0x41, 0xc0, 0x8a, 0x81, 0x88, 0x7c, + 0x9c, 0x84, 0xb5, 0xcf, 0x9f, 0xaf, 0x45, 0x77, 0x9b, 0x6e, 0x17, 0x65, 0xa9, 0xd7, 0x3e, 0xdf, + 0xfd, 0x67, 0x78, 0xff, 0x12, 0x38, 0x71, 0x20, 0xdf, 0x43, 0xcd, 0xc9, 0x0d, 0xf0, 0x22, 0x9d, + 0x67, 0xa5, 0x29, 0xd4, 0x17, 0x7d, 0xac, 0x3b, 0x0a, 0x44, 0x6e, 0xd0, 0x4b, 0xd1, 0xa6, 0x65, + 0xba, 0x7f, 0x1a, 0xd9, 0x61, 0x5c, 0x82, 0xb4, 0xac, 0x69, 0x6f, 0x87, 0x20, 0xd2, 0x32, 0x9c, + 0x84, 0x43, 0xe1, 0xa0, 0x10, 0x8b, 0xbc, 0xec, 0x18, 0x0a, 0x00, 0x0a, 0x0f, 0x85, 0x36, 0xac, + 0x7d, 0xbe, 0x8d, 0x7e, 0xd7, 0x1d, 0x7e, 0x6e, 0x63, 0x6f, 0xd3, 0x63, 0x0a, 0x6b, 0xe2, 0x61, + 0x5f, 0xdc, 0x66, 0x14, 0x8d, 0x67, 0xb9, 0xc7, 0x25, 0x4b, 0xd2, 0x72, 0xb0, 0x8e, 0xdb, 0x68, + 0xe4, 0x44, 0x46, 0x81, 0x71, 0x30, 0xbe, 0xed, 0x2d, 0xf2, 0x34, 0x99, 0xb6, 0x1f, 0x87, 0x68, + 0x5d, 0x23, 0x0e, 0xc7, 0x37, 0x17, 0x83, 0xf1, 0xba, 0x4a, 0xfd, 0xd4, 0x7f, 0x26, 0xab, 0x9c, + 0xe3, 0xf1, 0xda, 0x43, 0xc2, 0xf1, 0x1a, 0xa2, 0xb0, 0x3e, 0x63, 0x2e, 0x8f, 0xd8, 0x4a, 0x2c, + 0x88, 0x78, 0x6d, 0xc4, 0xe1, 0xfa, 0xb8, 0x98, 0xdd, 0x1b, 0x18, 0x0f, 0x87, 0x99, 0xe4, 0x45, + 0xc6, 0xd2, 0xfd, 0x94, 0xcd, 0xca, 0x01, 0x11, 0x63, 0x7c, 0x8a, 0xd8, 0x1b, 0xd0, 0x34, 0xd2, + 0x8c, 0x87, 0xe5, 0x3e, 0x5b, 0x8a, 0x22, 0x91, 0x74, 0x33, 0x5a, 0xa4, 0xb3, 0x19, 0x3d, 0x14, + 0xf5, 0x36, 0x2a, 0xa6, 0x57, 0xc9, 0x92, 0xc7, 0x01, 0x6f, 0x0d, 0xd2, 0xc3, 0x9b, 0x83, 0x22, + 0x9d, 0x36, 0x16, 0x8b, 0x62, 0xca, 0xc9, 0x4e, 0xab, 0xc5, 0x9d, 0x9d, 0x66, 0x30, 0xed, 0xe1, + 0xaf, 0xd7, 0xa2, 0xdf, 0xab, 0xa5, 0xee, 0x33, 0x8a, 0x3d, 0x56, 0x5e, 0x5d, 0x08, 0x56, 0xc4, + 0x83, 0x4f, 0x30, 0x3b, 0x28, 0x6a, 0x5c, 0x3f, 0xbb, 0x8d, 0x0a, 0x6c, 0xd6, 0x2a, 0xef, 0xb6, + 0x33, 0x0e, 0x6d, 0x56, 0x0f, 0x09, 0x37, 0x2b, 0x44, 0x61, 0x00, 0x51, 0xf2, 0xfa, 0x48, 0x6e, + 0x9d, 0xd4, 0xf7, 0xcf, 0xe5, 0x36, 0x3a, 0x39, 0x18, 0x1f, 0x2b, 0xa1, 0x3f, 0x5a, 0xb6, 0x29, + 0x1b, 0xf8, 0x88, 0x19, 0xf6, 0xc5, 0x49, 0xcf, 0x66, 0x56, 0x84, 0x3d, 0xb7, 0x66, 0xc6, 0xb0, + 0x2f, 0x4e, 0x78, 0x76, 0xc2, 0x5a, 0xc8, 0x33, 0x12, 0xda, 0x86, 0x7d, 0x71, 0x98, 0x7d, 0x69, + 0xa6, 0x59, 0x17, 0x9e, 0x04, 0xec, 0xc0, 0xb5, 0x61, 0xb3, 0x17, 0xab, 0x1d, 0xfe, 0xed, 0x5a, + 0xf4, 0x3d, 0xeb, 0xf1, 0x58, 0xc4, 0xc9, 0xe5, 0xaa, 0x86, 0x5e, 0xb3, 0x74, 0xc1, 0xcb, 0xc1, + 0x33, 0xca, 0x5a, 0x9b, 0x35, 0x25, 0x78, 0x7e, 0x2b, 0x1d, 0x38, 0x77, 0x46, 0x79, 0x9e, 0xae, + 0x26, 0x7c, 0x9e, 0xa7, 0xe4, 0xdc, 0xf1, 0x90, 0xf0, 0xdc, 0x81, 0x28, 0xcc, 0xca, 0x27, 0xa2, + 0xca, 0xf9, 0xd1, 0xac, 0x5c, 0x89, 0xc2, 0x59, 0x79, 0x83, 0xc0, 0x5c, 0x69, 0x22, 0x76, 0x45, + 0x9a, 0xf2, 0xa9, 0x6c, 0xdf, 0x73, 0x30, 0x9a, 0x96, 0x08, 0xe7, 0x4a, 0x80, 0xb4, 0xa7, 0x72, + 0xcd, 0x1e, 0x92, 0x15, 0xfc, 0xc5, 0xea, 0x28, 0xc9, 0xae, 0x07, 0x78, 0x5a, 0x60, 0x01, 0xe2, + 0x54, 0x0e, 0x05, 0xe1, 0x5e, 0xf5, 0x3c, 0x8b, 0x05, 0xbe, 0x57, 0xad, 0x24, 0xe1, 0xbd, 0xaa, + 0x26, 0xa0, 0xc9, 0x33, 0x4e, 0x99, 0xac, 0x24, 0x61, 0x93, 0x9a, 0xc0, 0x42, 0xa1, 0x7e, 0x76, + 0x43, 0x86, 0x42, 0xf0, 0xb4, 0x66, 0xa3, 0x93, 0x83, 0x23, 0xb4, 0xd9, 0xb4, 0xee, 0x73, 0x39, + 0xbd, 0xc2, 0x47, 0xa8, 0x87, 0x84, 0x47, 0x28, 0x44, 0x61, 0x95, 0x26, 0xc2, 0x6c, 0xba, 0xd7, + 0xf1, 0xf1, 0xd1, 0xda, 0x70, 0x6f, 0x74, 0x72, 0x70, 0x1b, 0x79, 0x38, 0x57, 0x6d, 0x86, 0x0e, + 0xf2, 0x5a, 0x16, 0xde, 0x46, 0x1a, 0x06, 0x96, 0xbe, 0x16, 0xa8, 0xb3, 0xac, 0x75, 0x5a, 0xd1, + 0x3b, 0xcd, 0xda, 0xe8, 0xe4, 0xb4, 0x93, 0x7f, 0x35, 0xdb, 0xb8, 0x5a, 0x7a, 0x22, 0xaa, 0x39, + 0xf2, 0x9a, 0xa5, 0x49, 0xcc, 0x24, 0x9f, 0x88, 0x6b, 0x9e, 0xe1, 0x3b, 0x26, 0x5d, 0xda, 0x9a, + 0x1f, 0x7a, 0x0a, 0xe1, 0x1d, 0x53, 0x58, 0x11, 0x8e, 0x93, 0x9a, 0x3e, 0x2f, 0xf9, 0x2e, 0x2b, + 0x89, 0x48, 0xe6, 0x21, 0xe1, 0x71, 0x02, 0x51, 0x98, 0xaf, 0xd6, 0xf2, 0x97, 0x6f, 0x73, 0x5e, + 0x24, 0x3c, 0x9b, 0x72, 0x3c, 0x5f, 0x85, 0x54, 0x38, 0x5f, 0x45, 0x68, 0xb8, 0x57, 0xdb, 0x63, + 0x92, 0xbf, 0x58, 0x4d, 0x92, 0x39, 0x2f, 0x25, 0x9b, 0xe7, 0xf8, 0x5e, 0x0d, 0x40, 0xe1, 0xbd, + 0x5a, 0x1b, 0x6e, 0x1d, 0x0d, 0x99, 0x80, 0xd8, 0xbe, 0x1e, 0x05, 0x89, 0xc0, 0xf5, 0x28, 0x02, + 0x85, 0x0d, 0x6b, 0x01, 0xf4, 0x21, 0x41, 0xcb, 0x4a, 0xf0, 0x21, 0x01, 0x4d, 0xb7, 0x0e, 0xdc, + 0x0c, 0x33, 0xae, 0xa6, 0x66, 0x47, 0xd1, 0xc7, 0xee, 0x14, 0xdd, 0xec, 0xc5, 0xe2, 0x27, 0x7c, + 0x67, 0x3c, 0x65, 0x6a, 0xd9, 0x0a, 0x1c, 0xa3, 0x35, 0x4c, 0x9f, 0x13, 0x3e, 0x87, 0xd5, 0x0e, + 0xff, 0x72, 0x2d, 0xfa, 0x10, 0xf3, 0xf8, 0x2a, 0x57, 0x7e, 0x9f, 0x76, 0xdb, 0xaa, 0x49, 0xe2, + 0xfe, 0x57, 0x58, 0xc3, 0x5e, 0xc9, 0x68, 0x44, 0xf6, 0x7a, 0x98, 0x2e, 0x80, 0x9f, 0xb4, 0x99, + 0xf2, 0x43, 0x8e, 0xb8, 0x92, 0x11, 0xe2, 0xed, 0x7e, 0xc8, 0x2f, 0x57, 0x09, 0xf6, 0x43, 0xc6, + 0x86, 0x16, 0x13, 0xfb, 0x21, 0x04, 0xb3, 0xb3, 0xd3, 0xad, 0xde, 0x9b, 0x44, 0x5e, 0xa9, 0x7c, + 0x0b, 0xcc, 0x4e, 0xaf, 0xac, 0x06, 0x22, 0x66, 0x27, 0x09, 0xc3, 0x8c, 0xa4, 0x01, 0xab, 0xb9, + 0x89, 0xc5, 0x72, 0x63, 0xc8, 0x9d, 0x99, 0x8f, 0xba, 0x41, 0x38, 0x5e, 0x1b, 0xb1, 0xde, 0xfa, + 0x3c, 0x09, 0x59, 0x00, 0xdb, 0x9f, 0xcd, 0x5e, 0xac, 0x76, 0xf8, 0xe7, 0xd1, 0x77, 0x5b, 0x15, + 0xdb, 0xe7, 0x4c, 0x2e, 0x0a, 0x1e, 0x0f, 0x76, 0x3a, 0xca, 0xdd, 0x80, 0xc6, 0xf5, 0xd3, 0xfe, + 0x0a, 0xad, 0x1c, 0xbd, 0xe1, 0xea, 0x61, 0x65, 0xca, 0xf0, 0x2c, 0x64, 0xd2, 0x67, 0x83, 0x39, + 0x3a, 0xad, 0xd3, 0xda, 0x66, 0xbb, 0xa3, 0x6b, 0xb4, 0x64, 0x49, 0xaa, 0x1e, 0xd6, 0x7e, 0x12, + 0x32, 0xea, 0xa1, 0xc1, 0x6d, 0x36, 0xa9, 0xd2, 0x8a, 0xcc, 0x6a, 0x8e, 0x3b, 0xdb, 0xb3, 0x2d, + 0x3a, 0x12, 0x20, 0xbb, 0xb3, 0xed, 0x9e, 0xb4, 0x76, 0x2b, 0x9b, 0x25, 0xaf, 0xfa, 0xd9, 0x1d, + 0xe4, 0x98, 0x57, 0xad, 0x8a, 0x8c, 0xf4, 0xed, 0x9e, 0xb4, 0xf6, 0xfa, 0x67, 0xd1, 0x07, 0x6d, + 0xaf, 0x7a, 0x21, 0xda, 0xe9, 0x34, 0x05, 0xd6, 0xa2, 0xa7, 0xfd, 0x15, 0xec, 0x96, 0xe6, 0xcb, + 0xa4, 0x94, 0xa2, 0x58, 0x8d, 0xaf, 0xc4, 0x4d, 0xf3, 0xda, 0x85, 0x3f, 0x5b, 0x35, 0x30, 0x74, + 0x08, 0x62, 0x4b, 0x83, 0x93, 0x2d, 0x57, 0xf6, 0xf5, 0x8c, 0x92, 0x70, 0xe5, 0x10, 0x1d, 0xae, + 0x7c, 0xd2, 0xc6, 0xaa, 0xa6, 0x56, 0xf6, 0x5d, 0x92, 0x0d, 0xbc, 0xa8, 0xed, 0xf7, 0x49, 0x1e, + 0x75, 0x83, 0x36, 0x63, 0xd1, 0xe2, 0xbd, 0xe4, 0xf2, 0xd2, 0xd4, 0x09, 0x2f, 0xa9, 0x8b, 0x10, + 0x19, 0x0b, 0x81, 0xda, 0xa4, 0x7b, 0x3f, 0x49, 0xb9, 0x3a, 0xd1, 0x7f, 0x75, 0x79, 0x99, 0x0a, + 0x16, 0x83, 0xa4, 0xbb, 0x12, 0x0f, 0x5d, 0x39, 0x91, 0x74, 0x63, 0x9c, 0xbd, 0x2b, 0x50, 0x49, + 0xcf, 0xf8, 0x54, 0x64, 0xd3, 0x24, 0x85, 0xb7, 0x50, 0x95, 0xa6, 0x11, 0x12, 0x77, 0x05, 0x5a, + 0x90, 0x5d, 0x18, 0x2b, 0x51, 0x35, 0xed, 0x9b, 0xf2, 0x3f, 0x6c, 0x2b, 0x3a, 0x62, 0x62, 0x61, + 0x44, 0x30, 0xbb, 0xf7, 0xac, 0x84, 0xe7, 0xb9, 0x32, 0x7e, 0xaf, 0xad, 0x55, 0x4b, 0x88, 0xbd, + 0xa7, 0x4f, 0xd8, 0x3d, 0x54, 0xf5, 0xfb, 0x9e, 0xb8, 0xc9, 0x94, 0xd1, 0xfb, 0x6d, 0x95, 0x46, + 0x46, 0xec, 0xa1, 0x20, 0xa3, 0x0d, 0xff, 0x24, 0xfa, 0x55, 0x65, 0xb8, 0x10, 0xf9, 0xe0, 0x0e, + 0xa2, 0x50, 0x38, 0x77, 0x36, 0xef, 0x92, 0x72, 0x7b, 0xb5, 0xc0, 0x8c, 0x8d, 0xf3, 0x92, 0xcd, + 0xf8, 0xe0, 0x01, 0xd1, 0xe3, 0x4a, 0x4a, 0x5c, 0x2d, 0x68, 0x53, 0xfe, 0xa8, 0x38, 0x11, 0xb1, + 0xb6, 0x8e, 0xd4, 0xd0, 0x08, 0x43, 0xa3, 0xc2, 0x85, 0x6c, 0x32, 0x73, 0xc2, 0x96, 0xc9, 0xcc, + 0x2c, 0x38, 0x75, 0xdc, 0x2a, 0x41, 0x32, 0x63, 0x99, 0xa1, 0x03, 0x11, 0xc9, 0x0c, 0x09, 0x6b, + 0x9f, 0xff, 0xb2, 0x16, 0xdd, 0xb3, 0xcc, 0x41, 0x73, 0x5a, 0x77, 0x98, 0x5d, 0x8a, 0x2a, 0xf5, + 0x39, 0x4a, 0xb2, 0xeb, 0x72, 0xf0, 0x39, 0x65, 0x12, 0xe7, 0x4d, 0x51, 0xbe, 0xb8, 0xb5, 0x9e, + 0xcd, 0x5a, 0x9b, 0xa3, 0x2c, 0xfb, 0x3c, 0xbb, 0xd6, 0x00, 0x59, 0xab, 0x39, 0xf1, 0x82, 0x1c, + 0x91, 0xb5, 0x86, 0x78, 0xdb, 0xc5, 0xc6, 0x79, 0x2a, 0x32, 0xd8, 0xc5, 0xd6, 0x42, 0x25, 0x24, + 0xba, 0xb8, 0x05, 0xd9, 0x78, 0xdc, 0x88, 0xea, 0x53, 0x97, 0x51, 0x9a, 0x82, 0x78, 0x6c, 0x54, + 0x0d, 0x40, 0xc4, 0x63, 0x14, 0xd4, 0x7e, 0xce, 0xa2, 0x6f, 0x57, 0x4d, 0x7a, 0x5a, 0xf0, 0x65, + 0xc2, 0xe1, 0xd5, 0x0b, 0x47, 0x42, 0xcc, 0x7f, 0x9f, 0xb0, 0x33, 0xeb, 0x3c, 0x2b, 0xf3, 0x94, + 0x95, 0x57, 0xfa, 0x61, 0xbc, 0x5f, 0xe7, 0x46, 0x08, 0x1f, 0xc7, 0x3f, 0xec, 0xa0, 0x6c, 0x50, + 0x6f, 0x64, 0x26, 0xc4, 0xac, 0xe3, 0xaa, 0xad, 0x30, 0xb3, 0xd1, 0xc9, 0xd9, 0x13, 0xef, 0x03, + 0x96, 0xa6, 0xbc, 0x58, 0x35, 0xb2, 0x63, 0x96, 0x25, 0x97, 0xbc, 0x94, 0xe0, 0xc4, 0x5b, 0x53, + 0x43, 0x88, 0x11, 0x27, 0xde, 0x01, 0xdc, 0x66, 0xf3, 0xc0, 0xf3, 0x61, 0x16, 0xf3, 0xb7, 0x20, + 0x9b, 0x87, 0x76, 0x14, 0x43, 0x64, 0xf3, 0x14, 0x6b, 0x4f, 0x7e, 0x5f, 0xa4, 0x62, 0x7a, 0xad, + 0x97, 0x00, 0xbf, 0x83, 0x95, 0x04, 0xae, 0x01, 0xf7, 0x43, 0x88, 0x5d, 0x04, 0x94, 0xe0, 0x8c, + 0xe7, 0x29, 0x9b, 0xc2, 0xfb, 0x37, 0xb5, 0x8e, 0x96, 0x11, 0x8b, 0x00, 0x64, 0x40, 0x71, 0xf5, + 0xbd, 0x1e, 0xac, 0xb8, 0xe0, 0x5a, 0xcf, 0xfd, 0x10, 0x62, 0x97, 0x41, 0x25, 0x18, 0xe7, 0x69, + 0x22, 0xc1, 0x34, 0xa8, 0x35, 0x94, 0x84, 0x98, 0x06, 0x3e, 0x01, 0x4c, 0x1e, 0xf3, 0x62, 0xc6, + 0x51, 0x93, 0x4a, 0x12, 0x34, 0xd9, 0x10, 0xf6, 0xb2, 0x71, 0x5d, 0x77, 0x91, 0xaf, 0xc0, 0x65, + 0x63, 0x5d, 0x2d, 0x91, 0xaf, 0x88, 0xcb, 0xc6, 0x1e, 0x00, 0x8a, 0x78, 0xca, 0x4a, 0x89, 0x17, + 0x51, 0x49, 0x82, 0x45, 0x6c, 0x08, 0xbb, 0x46, 0xd7, 0x45, 0x5c, 0x48, 0xb0, 0x46, 0xeb, 0x02, + 0x38, 0x4f, 0xa0, 0xef, 0x92, 0x72, 0x1b, 0x49, 0xea, 0x5e, 0xe1, 0x72, 0x3f, 0xe1, 0x69, 0x5c, + 0x82, 0x48, 0xa2, 0xdb, 0xbd, 0x91, 0x12, 0x91, 0xa4, 0x4d, 0x81, 0xa1, 0xa4, 0xcf, 0xc7, 0xb1, + 0xda, 0x81, 0xa3, 0xf1, 0xfb, 0x21, 0xc4, 0xc6, 0xa7, 0xa6, 0xd0, 0xbb, 0xac, 0x28, 0x92, 0x6a, + 0xf1, 0x5f, 0xc7, 0x0b, 0xd4, 0xc8, 0x89, 0xf8, 0x84, 0x71, 0x60, 0x7a, 0x35, 0x81, 0x1b, 0x2b, + 0x18, 0x0c, 0xdd, 0x1f, 0x07, 0x19, 0x9b, 0x71, 0x2a, 0x89, 0xf3, 0x08, 0x15, 0x6b, 0x4d, 0xe4, + 0x09, 0xea, 0x7a, 0x17, 0xe6, 0xbc, 0x89, 0x64, 0x5c, 0x1c, 0x8b, 0x25, 0x9f, 0x88, 0x97, 0x6f, + 0x93, 0x52, 0x26, 0xd9, 0x4c, 0xaf, 0xdc, 0xcf, 0x09, 0x4b, 0x18, 0x4c, 0xbc, 0x89, 0xd4, 0xa9, + 0x64, 0x13, 0x08, 0x50, 0x96, 0x13, 0x7e, 0x83, 0x26, 0x10, 0xd0, 0xa2, 0xe1, 0x88, 0x04, 0x22, + 0xc4, 0xdb, 0x73, 0x14, 0xe3, 0x5c, 0xbf, 0xae, 0x3d, 0x11, 0x4d, 0x2e, 0x47, 0x59, 0x83, 0x20, + 0xb1, 0x95, 0x0d, 0x2a, 0xd8, 0xfd, 0xa5, 0xf1, 0x6f, 0xa7, 0xd8, 0x23, 0xc2, 0x4e, 0x7b, 0x9a, + 0x3d, 0xee, 0x41, 0x22, 0xae, 0xec, 0x3d, 0x00, 0xca, 0x55, 0xfb, 0x1a, 0xc0, 0xe3, 0x1e, 0xa4, + 0x73, 0x26, 0xe3, 0x56, 0xeb, 0x05, 0x9b, 0x5e, 0xcf, 0x0a, 0xb1, 0xc8, 0xe2, 0x5d, 0x91, 0x8a, + 0x02, 0x9c, 0xc9, 0x78, 0xa5, 0x06, 0x28, 0x71, 0x26, 0xd3, 0xa1, 0x62, 0x33, 0x38, 0xb7, 0x14, + 0xa3, 0x34, 0x99, 0xc1, 0x1d, 0xb5, 0x67, 0x48, 0x01, 0x44, 0x06, 0x87, 0x82, 0xc8, 0x20, 0xaa, + 0x77, 0xdc, 0x32, 0x99, 0xb2, 0xb4, 0xf6, 0xb7, 0x43, 0x9b, 0xf1, 0xc0, 0xce, 0x41, 0x84, 0x28, + 0x20, 0xf5, 0x9c, 0x2c, 0x8a, 0xec, 0x30, 0x93, 0x82, 0xac, 0x67, 0x03, 0x74, 0xd6, 0xd3, 0x01, + 0x41, 0x58, 0x9d, 0xf0, 0xb7, 0x55, 0x69, 0xaa, 0x7f, 0xb0, 0xb0, 0x5a, 0xfd, 0x3e, 0xd4, 0xf2, + 0x50, 0x58, 0x05, 0x1c, 0xa8, 0x8c, 0x76, 0x52, 0x0f, 0x98, 0x80, 0xb6, 0x3f, 0x4c, 0x1e, 0x75, + 0x83, 0xb8, 0x9f, 0xb1, 0x5c, 0xa5, 0x3c, 0xe4, 0x47, 0x01, 0x7d, 0xfc, 0x34, 0xa0, 0x3d, 0x6e, + 0xf1, 0xea, 0x73, 0xc5, 0xa7, 0xd7, 0xad, 0x6b, 0x4d, 0x7e, 0x41, 0x6b, 0x84, 0x38, 0x6e, 0x21, + 0x50, 0xbc, 0x8b, 0x0e, 0xa7, 0x22, 0x0b, 0x75, 0x51, 0x25, 0xef, 0xd3, 0x45, 0x9a, 0xb3, 0x9b, + 0x5f, 0x23, 0xd5, 0x23, 0xb3, 0xee, 0xa6, 0x4d, 0xc2, 0x82, 0x0b, 0x11, 0x9b, 0x5f, 0x12, 0xb6, + 0x39, 0x39, 0xf4, 0x79, 0xdc, 0xbe, 0xf3, 0xdd, 0xb2, 0x72, 0x4c, 0xdf, 0xf9, 0xa6, 0x58, 0xba, + 0x92, 0xf5, 0x18, 0xe9, 0xb0, 0xe2, 0x8f, 0x93, 0xad, 0x7e, 0xb0, 0xdd, 0xf2, 0x78, 0x3e, 0x77, + 0x53, 0xce, 0x8a, 0xda, 0xeb, 0x76, 0xc0, 0x90, 0xc5, 0x88, 0x2d, 0x4f, 0x00, 0x07, 0x21, 0xcc, + 0xf3, 0xbc, 0x2b, 0x32, 0xc9, 0x33, 0x89, 0x85, 0x30, 0xdf, 0x98, 0x06, 0x43, 0x21, 0x8c, 0x52, + 0x00, 0xe3, 0x56, 0x9d, 0x07, 0x71, 0x79, 0xc2, 0xe6, 0x68, 0xc6, 0x56, 0x9f, 0xf5, 0xd4, 0xf2, + 0xd0, 0xb8, 0x05, 0x9c, 0xf3, 0x90, 0xcf, 0xf5, 0x32, 0x61, 0xc5, 0xcc, 0x9c, 0x6e, 0xc4, 0x83, + 0xa7, 0xb4, 0x1d, 0x9f, 0x24, 0x1e, 0xf2, 0x85, 0x35, 0x40, 0xd8, 0x39, 0x9c, 0xb3, 0x99, 0xa9, + 0x29, 0x52, 0x03, 0x25, 0x6f, 0x55, 0xf5, 0x51, 0x37, 0x08, 0xfc, 0xbc, 0x4e, 0x62, 0x2e, 0x02, + 0x7e, 0x94, 0xbc, 0x8f, 0x1f, 0x08, 0x82, 0xec, 0xad, 0xaa, 0x77, 0xbd, 0xa3, 0x1b, 0x65, 0xb1, + 0xde, 0xc7, 0x0e, 0x89, 0xe6, 0x01, 0x5c, 0x28, 0x7b, 0x23, 0x78, 0x30, 0x47, 0x9b, 0x03, 0xda, + 0xd0, 0x1c, 0x35, 0xe7, 0xaf, 0x7d, 0xe6, 0x28, 0x06, 0x6b, 0x9f, 0x3f, 0xd3, 0x73, 0x74, 0x8f, + 0x49, 0x56, 0xe5, 0xed, 0xaf, 0x13, 0x7e, 0xa3, 0x37, 0xc2, 0x48, 0x7d, 0x1b, 0x6a, 0xa8, 0x5e, + 0x59, 0x05, 0xbb, 0xe2, 0x9d, 0xde, 0x7c, 0xc0, 0xb7, 0xde, 0x21, 0x74, 0xfa, 0x06, 0x5b, 0x85, + 0x9d, 0xde, 0x7c, 0xc0, 0xb7, 0x7e, 0x17, 0xbe, 0xd3, 0x37, 0x78, 0x21, 0x7e, 0xa7, 0x37, 0xaf, + 0x7d, 0xff, 0x55, 0x33, 0x71, 0x5d, 0xe7, 0x55, 0x1e, 0x36, 0x95, 0xc9, 0x92, 0x63, 0xe9, 0xa4, + 0x6f, 0xcf, 0xa0, 0xa1, 0x74, 0x92, 0x56, 0x71, 0xbe, 0xde, 0x84, 0x95, 0xe2, 0x54, 0x94, 0x89, + 0x7a, 0x48, 0xff, 0xbc, 0x87, 0xd1, 0x06, 0x0e, 0x6d, 0x9a, 0x42, 0x4a, 0xf6, 0x71, 0xa3, 0x87, + 0xda, 0x5b, 0xcc, 0x5b, 0x01, 0x7b, 0xed, 0xcb, 0xcc, 0xdb, 0x3d, 0x69, 0xfb, 0xe0, 0xcf, 0x63, + 0xdc, 0x27, 0x8e, 0xa1, 0x5e, 0x45, 0x1f, 0x3a, 0x3e, 0xed, 0xaf, 0xa0, 0xdd, 0xff, 0x4d, 0xb3, + 0xaf, 0x80, 0xfe, 0xf5, 0x24, 0x78, 0xd6, 0xc7, 0x22, 0x98, 0x08, 0xcf, 0x6f, 0xa5, 0xa3, 0x0b, + 0xf2, 0x0f, 0xcd, 0x06, 0xba, 0x41, 0xd5, 0xbb, 0x1c, 0xea, 0x1d, 0x50, 0x3d, 0x27, 0x42, 0xdd, + 0x6a, 0x61, 0x38, 0x33, 0x3e, 0xbb, 0xa5, 0x96, 0xf3, 0x2d, 0x2f, 0x0f, 0xd6, 0xef, 0x1c, 0x3a, + 0xe5, 0x09, 0x59, 0x76, 0x68, 0x58, 0xa0, 0xcf, 0x6f, 0xab, 0x46, 0xcd, 0x15, 0x07, 0x56, 0x5f, + 0xe7, 0x78, 0xde, 0xd3, 0xb0, 0xf7, 0xbd, 0x8e, 0x4f, 0x6f, 0xa7, 0xa4, 0xcb, 0xf2, 0x9f, 0x6b, + 0xd1, 0x43, 0x8f, 0xb5, 0xcf, 0x13, 0xc0, 0xa9, 0xc7, 0x8f, 0x02, 0xf6, 0x29, 0x25, 0x53, 0xb8, + 0xdf, 0xff, 0xe5, 0x94, 0xed, 0x87, 0xaf, 0x3c, 0x95, 0xfd, 0x24, 0x95, 0xbc, 0x68, 0x7f, 0xf8, + 0xca, 0xb7, 0x5b, 0x53, 0x43, 0xfa, 0xc3, 0x57, 0x01, 0xdc, 0xf9, 0xf0, 0x15, 0xe2, 0x19, 0xfd, + 0xf0, 0x15, 0x6a, 0x2d, 0xf8, 0xe1, 0xab, 0xb0, 0x06, 0x15, 0xde, 0x9b, 0x22, 0xd4, 0xe7, 0xd6, + 0xbd, 0x2c, 0xfa, 0xc7, 0xd8, 0xcf, 0x6e, 0xa3, 0x42, 0x2c, 0x70, 0x35, 0xa7, 0xee, 0xb9, 0xf5, + 0x68, 0x53, 0xef, 0xae, 0xdb, 0x4e, 0x6f, 0x5e, 0xfb, 0xfe, 0xa9, 0xde, 0xdd, 0x98, 0x70, 0x2e, + 0x0a, 0xf5, 0xd1, 0xb3, 0xcd, 0x50, 0x78, 0xae, 0x2c, 0xb8, 0x3d, 0xbf, 0xd5, 0x0f, 0x26, 0xaa, + 0x5b, 0x11, 0xba, 0xd3, 0x87, 0x5d, 0x86, 0x40, 0x97, 0xef, 0xf4, 0xe6, 0x89, 0x65, 0xa4, 0xf6, + 0x5d, 0xf7, 0x76, 0x0f, 0x63, 0x7e, 0x5f, 0x3f, 0xed, 0xaf, 0xa0, 0xdd, 0x2f, 0x75, 0xda, 0xe8, + 0xba, 0x57, 0xfd, 0xbc, 0xdd, 0x65, 0x6a, 0xec, 0x75, 0xf3, 0xb0, 0x2f, 0x1e, 0x4a, 0x20, 0xdc, + 0x25, 0xb4, 0x2b, 0x81, 0x40, 0x97, 0xd1, 0x4f, 0x6f, 0xa7, 0xa4, 0xcb, 0xf2, 0xcf, 0x6b, 0xd1, + 0x5d, 0xb2, 0x2c, 0x7a, 0x1c, 0x7c, 0xde, 0xd7, 0x32, 0x18, 0x0f, 0x5f, 0xdc, 0x5a, 0x4f, 0x17, + 0xea, 0xdf, 0xd6, 0xa2, 0x7b, 0x81, 0x42, 0xd5, 0x03, 0xe4, 0x16, 0xd6, 0xfd, 0x81, 0xf2, 0x83, + 0xdb, 0x2b, 0x52, 0xcb, 0xbd, 0x8b, 0x8f, 0xdb, 0x1f, 0x65, 0x0a, 0xd8, 0x1e, 0xd3, 0x1f, 0x65, + 0xea, 0xd6, 0x82, 0x87, 0x3c, 0xec, 0xa2, 0xd9, 0x74, 0xa1, 0x87, 0x3c, 0xea, 0x86, 0x5a, 0xf0, + 0xe3, 0x12, 0x18, 0x87, 0x39, 0x79, 0xf9, 0x36, 0x67, 0x59, 0x4c, 0x3b, 0xa9, 0xe5, 0xdd, 0x4e, + 0x0c, 0x07, 0x0f, 0xc7, 0x2a, 0xe9, 0x99, 0x68, 0x36, 0x52, 0x8f, 0x29, 0x7d, 0x83, 0x04, 0x0f, + 0xc7, 0x5a, 0x28, 0xe1, 0x4d, 0x67, 0x8d, 0x21, 0x6f, 0x20, 0x59, 0x7c, 0xd2, 0x07, 0x05, 0x29, + 0xba, 0xf1, 0x66, 0xce, 0xdc, 0xb7, 0x42, 0x56, 0x5a, 0xe7, 0xee, 0xdb, 0x3d, 0x69, 0xc2, 0xed, + 0x98, 0xcb, 0x2f, 0x39, 0x8b, 0x79, 0x11, 0x74, 0x6b, 0xa8, 0x5e, 0x6e, 0x5d, 0x1a, 0x73, 0xbb, + 0x2b, 0xd2, 0xc5, 0x3c, 0xd3, 0x9d, 0x49, 0xba, 0x75, 0xa9, 0x6e, 0xb7, 0x80, 0x86, 0xc7, 0x82, + 0xd6, 0xad, 0x4a, 0x2f, 0x9f, 0x84, 0xcd, 0x78, 0x59, 0xe5, 0x66, 0x2f, 0x96, 0xae, 0xa7, 0x1e, + 0x46, 0x1d, 0xf5, 0x04, 0x23, 0x69, 0xbb, 0x27, 0x0d, 0xcf, 0xe7, 0x1c, 0xb7, 0x66, 0x3c, 0xed, + 0x74, 0xd8, 0x6a, 0x0d, 0xa9, 0xa7, 0xfd, 0x15, 0xe0, 0x69, 0xa8, 0x1e, 0x55, 0x47, 0x49, 0x29, + 0xf7, 0x93, 0x34, 0x1d, 0x6c, 0x06, 0x86, 0x49, 0x03, 0x05, 0x4f, 0x43, 0x11, 0x98, 0x18, 0xc9, + 0xcd, 0xe9, 0x61, 0x36, 0xe8, 0xb2, 0xa3, 0xa8, 0x5e, 0x23, 0xd9, 0xa5, 0xc1, 0x89, 0x96, 0xd3, + 0xd4, 0xa6, 0xb6, 0xc3, 0x70, 0xc3, 0xb5, 0x2a, 0xbc, 0xd3, 0x9b, 0x07, 0x8f, 0xdb, 0x15, 0xa5, + 0x56, 0x96, 0x07, 0x94, 0x09, 0x6f, 0x25, 0x79, 0xd8, 0x41, 0x81, 0x53, 0xc1, 0x7a, 0x1a, 0xbd, + 0x49, 0xe2, 0x19, 0x97, 0xe8, 0x93, 0x22, 0x17, 0x08, 0x3e, 0x29, 0x02, 0x20, 0xe8, 0xba, 0xfa, + 0x77, 0x73, 0x1c, 0x7a, 0x18, 0x63, 0x5d, 0xa7, 0x95, 0x1d, 0x2a, 0xd4, 0x75, 0x28, 0x0d, 0xa2, + 0x81, 0x71, 0xab, 0x5f, 0xc7, 0x7f, 0x12, 0x32, 0x03, 0xde, 0xc9, 0xdf, 0xec, 0xc5, 0x82, 0x15, + 0xc5, 0x3a, 0x4c, 0xe6, 0x89, 0xc4, 0x56, 0x14, 0xc7, 0x46, 0x85, 0x84, 0x56, 0x94, 0x36, 0x4a, + 0x55, 0xaf, 0xca, 0x11, 0x0e, 0xe3, 0x70, 0xf5, 0x6a, 0xa6, 0x5f, 0xf5, 0x0c, 0xdb, 0x7a, 0xb0, + 0x99, 0x99, 0x21, 0x23, 0xaf, 0xf4, 0x66, 0x19, 0x19, 0xdb, 0xea, 0x35, 0x4d, 0x08, 0x86, 0xa2, + 0x0e, 0xa5, 0x00, 0x0f, 0xec, 0x2b, 0xae, 0x79, 0xf6, 0x9a, 0xe7, 0x9c, 0x15, 0x2c, 0x9b, 0xa2, + 0x9b, 0x53, 0x65, 0xb0, 0x45, 0x86, 0x36, 0xa7, 0xa4, 0x06, 0x78, 0x6c, 0xee, 0xbf, 0x60, 0x89, + 0x4c, 0x05, 0xf3, 0x26, 0xa3, 0xff, 0x7e, 0xe5, 0xe3, 0x1e, 0x24, 0x7c, 0x6c, 0xde, 0x00, 0xe6, + 0xe0, 0xbb, 0x76, 0xfa, 0x49, 0xc0, 0x94, 0x8f, 0x86, 0x36, 0xc2, 0xb4, 0x0a, 0x18, 0xd4, 0x26, + 0xc1, 0xe5, 0xf2, 0x27, 0x7c, 0x85, 0x0d, 0x6a, 0x9b, 0x9f, 0x2a, 0x24, 0x34, 0xa8, 0xdb, 0x28, + 0xc8, 0x33, 0xdd, 0x7d, 0xd0, 0x7a, 0x40, 0xdf, 0xdd, 0xfa, 0x6c, 0x74, 0x72, 0x60, 0xe6, 0xec, + 0x25, 0x4b, 0xef, 0x39, 0x01, 0x52, 0xd0, 0xbd, 0x64, 0x89, 0x3f, 0x26, 0xd8, 0xec, 0xc5, 0xc2, + 0x47, 0xf2, 0x4c, 0xf2, 0xb7, 0xcd, 0xb3, 0x72, 0xa4, 0xb8, 0x4a, 0xde, 0x7a, 0x58, 0xfe, 0xa8, + 0x1b, 0xb4, 0x17, 0x60, 0x4f, 0x0b, 0x31, 0xe5, 0x65, 0xa9, 0xbf, 0x54, 0xe9, 0xdf, 0x30, 0xd2, + 0xb2, 0x21, 0xf8, 0x4e, 0xe5, 0x83, 0x30, 0xe4, 0x7c, 0x5e, 0xae, 0x16, 0xd9, 0xaf, 0xde, 0xac, + 0xa3, 0x9a, 0xed, 0x0f, 0xde, 0x6c, 0x74, 0x72, 0x76, 0x7a, 0x69, 0xa9, 0xfb, 0x99, 0x9b, 0x47, + 0xa8, 0x3a, 0xf6, 0x85, 0x9b, 0xc7, 0x3d, 0x48, 0xed, 0xea, 0xcb, 0xe8, 0x9d, 0x23, 0x31, 0x1b, + 0xf3, 0x2c, 0x1e, 0x7c, 0xdf, 0xbf, 0x42, 0x2b, 0x66, 0xc3, 0xea, 0x67, 0x63, 0xf4, 0x0e, 0x25, + 0xb6, 0x97, 0x00, 0xf7, 0xf8, 0xc5, 0x62, 0x36, 0x96, 0x4c, 0x82, 0x4b, 0x80, 0xea, 0xf7, 0x61, + 0x25, 0x20, 0x2e, 0x01, 0x7a, 0x00, 0xb0, 0x37, 0x29, 0x38, 0x47, 0xed, 0x55, 0x82, 0xa0, 0x3d, + 0x0d, 0xd8, 0x2c, 0xc2, 0xd8, 0xab, 0x12, 0x75, 0x78, 0x69, 0xcf, 0xea, 0x28, 0x29, 0x91, 0x45, + 0xb4, 0x29, 0x3b, 0xb8, 0xeb, 0xea, 0xab, 0xaf, 0x8e, 0x2c, 0xe6, 0x73, 0x56, 0xac, 0xc0, 0xe0, + 0xd6, 0xb5, 0x74, 0x00, 0x62, 0x70, 0xa3, 0xa0, 0x9d, 0xb5, 0x4d, 0x33, 0x4f, 0xaf, 0x0f, 0x44, + 0x21, 0x16, 0x32, 0xc9, 0x38, 0xfc, 0xf2, 0x84, 0x69, 0x50, 0x97, 0x21, 0x66, 0x2d, 0xc5, 0xda, + 0x2c, 0x57, 0x11, 0xf5, 0x7d, 0x42, 0xf5, 0xf1, 0xec, 0x52, 0x8a, 0x02, 0x3e, 0x4f, 0xac, 0xad, + 0x40, 0x88, 0xc8, 0x72, 0x49, 0x18, 0xf4, 0xfd, 0x69, 0x92, 0xcd, 0xd0, 0xbe, 0x3f, 0x75, 0xbf, + 0xfe, 0x7a, 0x8f, 0x06, 0xec, 0x84, 0xaa, 0x1b, 0xad, 0x9e, 0x00, 0xfa, 0x5d, 0x4e, 0xb4, 0xd1, + 0x5d, 0x82, 0x98, 0x50, 0x38, 0x09, 0x5c, 0xbd, 0xca, 0x79, 0xc6, 0xe3, 0xe6, 0xd6, 0x1c, 0xe6, + 0xca, 0x23, 0x82, 0xae, 0x20, 0x69, 0x63, 0x91, 0x92, 0x9f, 0x2d, 0xb2, 0xd3, 0x42, 0x5c, 0x26, + 0x29, 0x2f, 0x40, 0x2c, 0xaa, 0xd5, 0x1d, 0x39, 0x11, 0x8b, 0x30, 0xce, 0x5e, 0xbf, 0x50, 0x52, + 0xef, 0x0b, 0xf0, 0x93, 0x82, 0x4d, 0xe1, 0xf5, 0x8b, 0xda, 0x46, 0x1b, 0x23, 0x4e, 0x06, 0x03, + 0xb8, 0x93, 0xe8, 0xd4, 0xae, 0xb3, 0x95, 0x1a, 0x1f, 0xfa, 0x5d, 0x42, 0xf5, 0x4d, 0xd4, 0x12, + 0x24, 0x3a, 0xda, 0x1c, 0x46, 0x12, 0x89, 0x4e, 0x58, 0xc3, 0x2e, 0x25, 0x8a, 0x3b, 0xd1, 0xd7, + 0x8a, 0xc0, 0x52, 0x52, 0xdb, 0x68, 0x84, 0xc4, 0x52, 0xd2, 0x82, 0x40, 0x40, 0x6a, 0xa6, 0xc1, + 0x0c, 0x0d, 0x48, 0x46, 0x1a, 0x0c, 0x48, 0x2e, 0x65, 0x03, 0xc5, 0x61, 0x96, 0xc8, 0x84, 0xa5, + 0x63, 0x2e, 0x4f, 0x59, 0xc1, 0xe6, 0x5c, 0xf2, 0x02, 0x06, 0x0a, 0x8d, 0x0c, 0x3d, 0x86, 0x08, + 0x14, 0x14, 0xab, 0x1d, 0xfe, 0x41, 0xf4, 0x5e, 0xb5, 0xee, 0xf3, 0x4c, 0xff, 0xad, 0x97, 0x97, + 0xea, 0x8f, 0x44, 0x0d, 0xde, 0x37, 0x36, 0xc6, 0xb2, 0xe0, 0x6c, 0xde, 0xd8, 0x7e, 0xd7, 0xfc, + 0xae, 0xc0, 0xa7, 0x6b, 0xd5, 0x78, 0x3e, 0x11, 0x32, 0xb9, 0xac, 0xb6, 0xd9, 0xfa, 0x0d, 0x22, + 0x30, 0x9e, 0x5d, 0xf1, 0x30, 0xf0, 0x2d, 0x0a, 0x8c, 0xb3, 0x71, 0xda, 0x95, 0x9e, 0xf1, 0x3c, + 0x85, 0x71, 0xda, 0xd3, 0x56, 0x00, 0x11, 0xa7, 0x51, 0xd0, 0x4e, 0x4e, 0x57, 0x3c, 0xe1, 0xe1, + 0xca, 0x4c, 0x78, 0xbf, 0xca, 0x4c, 0xbc, 0x97, 0x32, 0xd2, 0xe8, 0xbd, 0x63, 0x3e, 0xbf, 0xe0, + 0x45, 0x79, 0x95, 0xe4, 0xd4, 0x77, 0x5b, 0x2d, 0xd1, 0xf9, 0xdd, 0x56, 0x02, 0xb5, 0x2b, 0x81, + 0x05, 0x0e, 0xcb, 0x13, 0x36, 0xe7, 0xea, 0xcb, 0x1a, 0x60, 0x25, 0x70, 0x8c, 0x38, 0x10, 0xb1, + 0x12, 0x90, 0xb0, 0xf3, 0x7e, 0x97, 0x65, 0xce, 0xf8, 0xac, 0x1a, 0x61, 0xc5, 0x29, 0x5b, 0xcd, + 0x79, 0x26, 0xb5, 0x49, 0x70, 0x26, 0xef, 0x98, 0xc4, 0x79, 0xe2, 0x4c, 0xbe, 0x8f, 0x9e, 0x13, + 0x9a, 0xbc, 0x86, 0x3f, 0x15, 0x85, 0xac, 0xff, 0x92, 0xd3, 0x79, 0x91, 0x82, 0xd0, 0xe4, 0x37, + 0xaa, 0x47, 0x12, 0xa1, 0x29, 0xac, 0xe1, 0xfc, 0x15, 0x02, 0xaf, 0x0c, 0xaf, 0x79, 0x61, 0xc6, + 0xc9, 0xcb, 0x39, 0x4b, 0x52, 0x3d, 0x1a, 0x7e, 0x18, 0xb0, 0x4d, 0xe8, 0x10, 0x7f, 0x85, 0xa0, + 0xaf, 0xae, 0xf3, 0x77, 0x1b, 0xc2, 0x25, 0x04, 0x8f, 0x08, 0x3a, 0xec, 0x13, 0x8f, 0x08, 0xba, + 0xb5, 0xec, 0xce, 0xdd, 0xb2, 0x8a, 0x5b, 0x29, 0x62, 0x57, 0xc4, 0xf0, 0xbc, 0xd0, 0xb1, 0x09, + 0x40, 0x62, 0xe7, 0x1e, 0x54, 0xb0, 0xa9, 0x81, 0xc5, 0xf6, 0x93, 0x8c, 0xa5, 0xc9, 0xcf, 0x60, + 0x5a, 0xef, 0xd8, 0x69, 0x08, 0x22, 0x35, 0xc0, 0x49, 0xcc, 0xd5, 0x01, 0x97, 0x93, 0xa4, 0x0a, + 0xfd, 0x8f, 0x02, 0xed, 0xa6, 0x88, 0x6e, 0x57, 0x0e, 0xe9, 0x7c, 0xa3, 0x15, 0x36, 0xeb, 0x28, + 0xcf, 0xc7, 0xd5, 0xaa, 0x7a, 0xc6, 0xa7, 0x3c, 0xc9, 0xe5, 0xe0, 0xb3, 0x70, 0x5b, 0x01, 0x9c, + 0xb8, 0x68, 0xd1, 0x43, 0xcd, 0x79, 0x7c, 0x5f, 0xc5, 0x92, 0x71, 0xfd, 0x27, 0x0e, 0xcf, 0x4b, + 0x5e, 0xe8, 0x44, 0xe3, 0x80, 0x4b, 0x30, 0x3b, 0x1d, 0x6e, 0xe8, 0x80, 0x55, 0x45, 0x89, 0xd9, + 0x19, 0xd6, 0xb0, 0x87, 0x7d, 0x0e, 0xa7, 0xbf, 0xb9, 0xad, 0xee, 0x1b, 0x6e, 0x91, 0xc6, 0x1c, + 0x8a, 0x38, 0xec, 0xa3, 0x69, 0x9b, 0xad, 0xb5, 0xdd, 0x8e, 0xb2, 0xd5, 0x21, 0xbc, 0x32, 0x81, + 0x58, 0x52, 0x18, 0x91, 0xad, 0x05, 0x70, 0xe7, 0x30, 0xbc, 0x10, 0x2c, 0x9e, 0xb2, 0x52, 0x9e, + 0xb2, 0x55, 0x2a, 0x58, 0xac, 0xd6, 0x75, 0x78, 0x18, 0xde, 0x30, 0x43, 0x17, 0xa2, 0x0e, 0xc3, + 0x29, 0xd8, 0xcd, 0xce, 0xd4, 0x5f, 0x6e, 0xd4, 0x77, 0x39, 0x61, 0x76, 0xa6, 0xca, 0x0b, 0xef, + 0x71, 0x3e, 0x08, 0x43, 0xf6, 0x1d, 0xb4, 0x5a, 0xa4, 0xd2, 0x90, 0x7b, 0x98, 0x8e, 0x97, 0x80, + 0x7c, 0x14, 0x20, 0xec, 0x77, 0x29, 0xea, 0xdf, 0x9b, 0x3f, 0x3e, 0x24, 0xf5, 0x97, 0xac, 0xb7, + 0x30, 0x5d, 0x17, 0x1a, 0xba, 0x1f, 0xb8, 0xdb, 0xee, 0x49, 0xdb, 0x34, 0x73, 0xf7, 0x8a, 0xc9, + 0x51, 0x1c, 0x1f, 0xf3, 0x12, 0x79, 0xa1, 0xbc, 0x12, 0x0e, 0xad, 0x94, 0x48, 0x33, 0xdb, 0x94, + 0x1d, 0xe8, 0x95, 0xec, 0x65, 0x9c, 0x48, 0x2d, 0x6b, 0x6e, 0x48, 0x6f, 0xb5, 0x0d, 0xb4, 0x29, + 0xa2, 0x56, 0x34, 0x6d, 0x63, 0x79, 0xc5, 0x4c, 0xc4, 0x6c, 0x96, 0x72, 0x0d, 0x9d, 0x71, 0x56, + 0x7f, 0xc8, 0x6f, 0xa7, 0x6d, 0x0b, 0x05, 0x89, 0x58, 0x1e, 0x54, 0xb0, 0x69, 0x64, 0x85, 0xd5, + 0x8f, 0xa4, 0x9a, 0x86, 0xdd, 0x68, 0x9b, 0xf1, 0x00, 0x22, 0x8d, 0x44, 0x41, 0xfb, 0xde, 0x5b, + 0x25, 0x3e, 0xe0, 0x4d, 0x4b, 0xc0, 0x4f, 0x10, 0x29, 0x65, 0x47, 0x4c, 0xbc, 0xf7, 0x86, 0x60, + 0x76, 0x9f, 0x00, 0x3c, 0xbc, 0x58, 0x1d, 0xc6, 0x70, 0x9f, 0x00, 0xf5, 0x15, 0x43, 0xec, 0x13, + 0x28, 0xd6, 0xef, 0x3a, 0x73, 0xee, 0x75, 0xc4, 0x4a, 0x5b, 0x39, 0xa4, 0xeb, 0x50, 0x30, 0xd4, + 0x75, 0x94, 0x82, 0xdf, 0xa4, 0xee, 0xd1, 0x1a, 0xd2, 0xa4, 0xd8, 0xb9, 0xda, 0x7a, 0x17, 0x66, + 0xe3, 0x92, 0xd9, 0x4f, 0xaa, 0x2b, 0x4b, 0xf8, 0x17, 0xfc, 0x6b, 0x21, 0x11, 0x97, 0x5a, 0x50, + 0x6d, 0xfb, 0xc5, 0x47, 0xff, 0xf5, 0xf5, 0x9d, 0xb5, 0x5f, 0x7c, 0x7d, 0x67, 0xed, 0x7f, 0xbe, + 0xbe, 0xb3, 0xf6, 0xf3, 0x6f, 0xee, 0x7c, 0xeb, 0x17, 0xdf, 0xdc, 0xf9, 0xd6, 0x7f, 0x7f, 0x73, + 0xe7, 0x5b, 0x5f, 0xbd, 0xa3, 0xff, 0xa2, 0xef, 0xc5, 0xaf, 0xa8, 0xbf, 0xcb, 0xfb, 0xfc, 0xff, + 0x03, 0x00, 0x00, 0xff, 0xff, 0xda, 0x50, 0xa4, 0x4a, 0xf5, 0x77, 0x00, 0x00, } // This is a compile-time assertion to ensure that this generated file @@ -403,6 +404,7 @@ type ClientCommandsHandler interface { AccountRevertDeletion(context.Context, *pb.RpcAccountRevertDeletionRequest) *pb.RpcAccountRevertDeletionResponse AccountSelect(context.Context, *pb.RpcAccountSelectRequest) *pb.RpcAccountSelectResponse AccountEnableLocalNetworkSync(context.Context, *pb.RpcAccountEnableLocalNetworkSyncRequest) *pb.RpcAccountEnableLocalNetworkSyncResponse + AccountChangeJsonApiAddr(context.Context, *pb.RpcAccountChangeJsonApiAddrRequest) *pb.RpcAccountChangeJsonApiAddrResponse AccountStop(context.Context, *pb.RpcAccountStopRequest) *pb.RpcAccountStopResponse AccountMove(context.Context, *pb.RpcAccountMoveRequest) *pb.RpcAccountMoveResponse AccountConfigUpdate(context.Context, *pb.RpcAccountConfigUpdateRequest) *pb.RpcAccountConfigUpdateResponse @@ -1235,6 +1237,26 @@ func AccountEnableLocalNetworkSync(b []byte) (resp []byte) { return resp } +func AccountChangeJsonApiAddr(b []byte) (resp []byte) { + defer func() { + if PanicHandler != nil { + if r := recover(); r != nil { + resp, _ = (&pb.RpcAccountChangeJsonApiAddrResponse{Error: &pb.RpcAccountChangeJsonApiAddrResponseError{Code: pb.RpcAccountChangeJsonApiAddrResponseError_UNKNOWN_ERROR, Description: "panic recovered"}}).Marshal() + PanicHandler(r) + } + } + }() + + in := new(pb.RpcAccountChangeJsonApiAddrRequest) + if err := in.Unmarshal(b); err != nil { + resp, _ = (&pb.RpcAccountChangeJsonApiAddrResponse{Error: &pb.RpcAccountChangeJsonApiAddrResponseError{Code: pb.RpcAccountChangeJsonApiAddrResponseError_BAD_INPUT, Description: err.Error()}}).Marshal() + return resp + } + + resp, _ = clientCommandsHandler.AccountChangeJsonApiAddr(context.Background(), in).Marshal() + return resp +} + func AccountStop(b []byte) (resp []byte) { defer func() { if PanicHandler != nil { @@ -6253,6 +6275,8 @@ func CommandAsync(cmd string, data []byte, callback func(data []byte)) { cd = AccountSelect(data) case "AccountEnableLocalNetworkSync": cd = AccountEnableLocalNetworkSync(data) + case "AccountChangeJsonApiAddr": + cd = AccountChangeJsonApiAddr(data) case "AccountStop": cd = AccountStop(data) case "AccountMove": @@ -7135,6 +7159,20 @@ func (h *ClientCommandsHandlerProxy) AccountEnableLocalNetworkSync(ctx context.C call, _ := actualCall(ctx, req) return call.(*pb.RpcAccountEnableLocalNetworkSyncResponse) } +func (h *ClientCommandsHandlerProxy) AccountChangeJsonApiAddr(ctx context.Context, req *pb.RpcAccountChangeJsonApiAddrRequest) *pb.RpcAccountChangeJsonApiAddrResponse { + actualCall := func(ctx context.Context, req any) (any, error) { + return h.client.AccountChangeJsonApiAddr(ctx, req.(*pb.RpcAccountChangeJsonApiAddrRequest)), nil + } + for _, interceptor := range h.interceptors { + toCall := actualCall + currentInterceptor := interceptor + actualCall = func(ctx context.Context, req any) (any, error) { + return currentInterceptor(ctx, req, "AccountChangeJsonApiAddr", toCall) + } + } + call, _ := actualCall(ctx, req) + return call.(*pb.RpcAccountChangeJsonApiAddrResponse) +} func (h *ClientCommandsHandlerProxy) AccountStop(ctx context.Context, req *pb.RpcAccountStopRequest) *pb.RpcAccountStopResponse { actualCall := func(ctx context.Context, req any) (any, error) { return h.client.AccountStop(ctx, req.(*pb.RpcAccountStopRequest)), nil diff --git a/core/account.go b/core/account.go index fa243b00e..52b2f275a 100644 --- a/core/account.go +++ b/core/account.go @@ -198,6 +198,19 @@ func (mw *Middleware) AccountEnableLocalNetworkSync(_ context.Context, req *pb.R } } +func (mw *Middleware) AccountChangeJsonApiAddr(ctx context.Context, req *pb.RpcAccountChangeJsonApiAddrRequest) *pb.RpcAccountChangeJsonApiAddrResponse { + err := mw.applicationService.AccountChangeJsonApiAddr(ctx, req.ListenAddr) + code := mapErrorCode(err, + errToCode(application.ErrApplicationIsNotRunning, pb.RpcAccountChangeJsonApiAddrResponseError_ACCOUNT_IS_NOT_RUNNING), + ) + return &pb.RpcAccountChangeJsonApiAddrResponse{ + Error: &pb.RpcAccountChangeJsonApiAddrResponseError{ + Code: code, + Description: getErrorDescription(err), + }, + } +} + func (mw *Middleware) AccountLocalLinkNewChallenge(ctx context.Context, request *pb.RpcAccountLocalLinkNewChallengeRequest) *pb.RpcAccountLocalLinkNewChallengeResponse { info := getClientInfo(ctx) diff --git a/core/anytype/config/config.go b/core/anytype/config/config.go index 6c4bd90f0..61c2e141f 100644 --- a/core/anytype/config/config.go +++ b/core/anytype/config/config.go @@ -74,6 +74,7 @@ type Config struct { NetworkCustomConfigFilePath string `json:",omitempty"` // not saved to config SqliteTempPath string `json:",omitempty"` // not saved to config AnyStoreConfig *anystore.Config `json:",omitempty"` // not saved to config + JsonApiListenAddr string `json:",omitempty"` // empty means disabled RepoPath string AnalyticsId string diff --git a/core/api/server/middleware.go b/core/api/server/middleware.go index b1604a6a2..da05740b8 100644 --- a/core/api/server/middleware.go +++ b/core/api/server/middleware.go @@ -6,7 +6,6 @@ import ( "net/http" "strings" - "github.com/anyproto/any-sync/app" "github.com/didip/tollbooth/v8" "github.com/didip/tollbooth/v8/limiter" "github.com/gin-gonic/gin" @@ -75,14 +74,9 @@ func (s *Server) ensureAuthenticated(mw service.ClientCommandsServer) gin.Handle } // ensureAccountInfo is a middleware that ensures the account info is available in the services. -func (s *Server) ensureAccountInfo(a *app.App) gin.HandlerFunc { +func (s *Server) ensureAccountInfo(accountService account.Service) gin.HandlerFunc { return func(c *gin.Context) { - if a == nil { - c.AbortWithStatusJSON(http.StatusForbidden, gin.H{"error": "failed to get app instance"}) - return - } - - accInfo, err := a.Component(account.CName).(account.Service).GetInfo(context.Background()) + accInfo, err := accountService.GetInfo(context.Background()) if err != nil { c.AbortWithStatusJSON(http.StatusInternalServerError, gin.H{"error": fmt.Sprintf("failed to get account info: %v", err)}) return diff --git a/core/api/server/router.go b/core/api/server/router.go index 0cacec0d4..09aa81078 100644 --- a/core/api/server/router.go +++ b/core/api/server/router.go @@ -1,11 +1,13 @@ package server import ( - "github.com/anyproto/any-sync/app" + "os" + "github.com/gin-gonic/gin" swaggerFiles "github.com/swaggo/files" ginSwagger "github.com/swaggo/gin-swagger" + "github.com/anyproto/anytype-heart/core/anytype/account" "github.com/anyproto/anytype-heart/core/api/pagination" "github.com/anyproto/anytype-heart/core/api/services/auth" "github.com/anyproto/anytype-heart/core/api/services/export" @@ -24,9 +26,18 @@ const ( ) // NewRouter builds and returns a *gin.Engine with all routes configured. -func (s *Server) NewRouter(a *app.App, mw service.ClientCommandsServer) *gin.Engine { - router := gin.Default() +func (s *Server) NewRouter(accountService account.Service, mw service.ClientCommandsServer) *gin.Engine { + debug := os.Getenv("ANYTYPE_API_DEBUG") == "1" + if !debug { + gin.SetMode(gin.ReleaseMode) + } + router := gin.New() + router.Use(gin.Recovery()) + + if debug { + router.Use(gin.Logger()) + } paginator := pagination.New(pagination.Config{ DefaultPage: defaultPage, DefaultPageSize: defaultPageSize, @@ -48,7 +59,7 @@ func (s *Server) NewRouter(a *app.App, mw service.ClientCommandsServer) *gin.Eng v1 := router.Group("/v1") v1.Use(paginator) v1.Use(s.ensureAuthenticated(mw)) - v1.Use(s.ensureAccountInfo(a)) + v1.Use(s.ensureAccountInfo(accountService)) { // Export v1.POST("/spaces/:space_id/objects/:object_id/export/:format", export.GetObjectExportHandler(s.exportService)) diff --git a/core/api/server/server.go b/core/api/server/server.go index ae69f8204..c178ef40d 100644 --- a/core/api/server/server.go +++ b/core/api/server/server.go @@ -3,9 +3,9 @@ package server import ( "sync" - "github.com/anyproto/any-sync/app" "github.com/gin-gonic/gin" + "github.com/anyproto/anytype-heart/core/anytype/account" "github.com/anyproto/anytype-heart/core/api/services/auth" "github.com/anyproto/anytype-heart/core/api/services/export" "github.com/anyproto/anytype-heart/core/api/services/object" @@ -29,7 +29,7 @@ type Server struct { } // NewServer constructs a new Server with default config and sets up the routes. -func NewServer(a *app.App, mw service.ClientCommandsServer) *Server { +func NewServer(accountService account.Service, mw service.ClientCommandsServer) *Server { s := &Server{ authService: auth.NewService(mw), exportService: export.NewService(mw), @@ -38,7 +38,7 @@ func NewServer(a *app.App, mw service.ClientCommandsServer) *Server { s.objectService = object.NewService(mw, s.spaceService) s.searchService = search.NewService(mw, s.spaceService, s.objectService) - s.engine = s.NewRouter(a, mw) + s.engine = s.NewRouter(accountService, mw) s.KeyToToken = make(map[string]string) return s diff --git a/core/api/service.go b/core/api/service.go index 1becdd27d..84cd86be3 100644 --- a/core/api/service.go +++ b/core/api/service.go @@ -5,18 +5,20 @@ import ( "errors" "fmt" "net/http" + "sync" "time" "github.com/anyproto/any-sync/app" + "github.com/anyproto/anytype-heart/core/anytype/account" + "github.com/anyproto/anytype-heart/core/anytype/config" "github.com/anyproto/anytype-heart/core/api/server" "github.com/anyproto/anytype-heart/pb/service" ) const ( - CName = "api" - httpPort = ":31009" - timeout = 5 * time.Second + CName = "api" + readTimeout = 5 * time.Second ) var ( @@ -25,12 +27,16 @@ var ( type Service interface { app.ComponentRunnable + ReassignAddress(ctx context.Context, listenAddr string) (err error) } type apiService struct { - srv *server.Server - httpSrv *http.Server - mw service.ClientCommandsServer + srv *server.Server + httpSrv *http.Server + mw service.ClientCommandsServer + accountService account.Service + listenAddr string + lock sync.Mutex } func New() Service { @@ -58,16 +64,32 @@ func (s *apiService) Name() (name string) { // @externalDocs.description OpenAPI // @externalDocs.url https://swagger.io/resources/open-api/ func (s *apiService) Init(a *app.App) (err error) { - s.srv = server.NewServer(a, s.mw) - s.httpSrv = &http.Server{ - Addr: httpPort, - Handler: s.srv.Engine(), - ReadHeaderTimeout: timeout, - } + s.listenAddr = a.MustComponent(config.CName).(*config.Config).JsonApiListenAddr + s.accountService = a.MustComponent(account.CName).(account.Service) + return nil } func (s *apiService) Run(ctx context.Context) (err error) { + s.runServer() + return nil +} + +func (s *apiService) runServer() { + s.lock.Lock() + defer s.lock.Unlock() + if s.listenAddr == "" { + // means that API is disabled + return + } + + s.srv = server.NewServer(s.accountService, s.mw) + s.httpSrv = &http.Server{ + Addr: s.listenAddr, + Handler: s.srv.Engine(), + ReadHeaderTimeout: readTimeout, + } + fmt.Printf("Starting API server on %s\n", s.httpSrv.Addr) go func() { @@ -76,11 +98,17 @@ func (s *apiService) Run(ctx context.Context) (err error) { } }() - return nil + return } -func (s *apiService) Close(ctx context.Context) (err error) { - shutdownCtx, cancel := context.WithTimeout(ctx, timeout) +func (s *apiService) shutdown(ctx context.Context) (err error) { + if s.httpSrv == nil { + return nil + } + s.lock.Lock() + defer s.lock.Unlock() + // we don't want graceful shutdown here and block tha app close + shutdownCtx, cancel := context.WithTimeout(ctx, time.Millisecond) defer cancel() if err := s.httpSrv.Shutdown(shutdownCtx); err != nil { @@ -90,6 +118,21 @@ func (s *apiService) Close(ctx context.Context) (err error) { return nil } +func (s *apiService) Close(ctx context.Context) (err error) { + return s.shutdown(ctx) +} + +func (s *apiService) ReassignAddress(ctx context.Context, listenAddr string) (err error) { + err = s.shutdown(ctx) + if err != nil { + return err + } + + s.listenAddr = listenAddr + s.runServer() + return nil +} + func SetMiddlewareParams(mw service.ClientCommandsServer) { mwSrv = mw } diff --git a/core/application/account_config_update.go b/core/application/account_config_update.go index 49142cf11..8697fdd04 100644 --- a/core/application/account_config_update.go +++ b/core/application/account_config_update.go @@ -1,9 +1,13 @@ package application import ( + "context" "errors" + "github.com/anyproto/any-sync/app" + "github.com/anyproto/anytype-heart/core/anytype/config" + "github.com/anyproto/anytype-heart/core/api" "github.com/anyproto/anytype-heart/pb" ) @@ -24,3 +28,14 @@ func (s *Service) AccountConfigUpdate(req *pb.RpcAccountConfigUpdateRequest) err } return nil } + +func (s *Service) AccountChangeJsonApiAddr(ctx context.Context, addr string) error { + s.lock.RLock() + defer s.lock.RUnlock() + + if s.app == nil { + return ErrApplicationIsNotRunning + } + apiService := app.MustComponent[api.Service](s.app) + return apiService.ReassignAddress(ctx, addr) +} diff --git a/core/application/account_create.go b/core/application/account_create.go index c1ff2a7ac..0c2fa5189 100644 --- a/core/application/account_create.go +++ b/core/application/account_create.go @@ -12,8 +12,8 @@ import ( "github.com/anyproto/anytype-heart/core/anytype/account" "github.com/anyproto/anytype-heart/core/anytype/config" "github.com/anyproto/anytype-heart/core/block" - "github.com/anyproto/anytype-heart/core/domain" "github.com/anyproto/anytype-heart/core/block/detailservice" + "github.com/anyproto/anytype-heart/core/domain" "github.com/anyproto/anytype-heart/core/domain/objectorigin" "github.com/anyproto/anytype-heart/pb" "github.com/anyproto/anytype-heart/pkg/lib/bundle" @@ -57,6 +57,9 @@ func (s *Service) AccountCreate(ctx context.Context, req *pb.RpcAccountCreateReq cfg.NetworkMode = req.NetworkMode cfg.NetworkCustomConfigFilePath = req.NetworkCustomConfigFilePath } + if req.JsonApiListenAddr != "" { + cfg.JsonApiListenAddr = req.JsonApiListenAddr + } comps := []app.Component{ cfg, anytype.BootstrapWallet(s.rootPath, derivationResult), diff --git a/core/application/account_select.go b/core/application/account_select.go index c700f8dec..6f22b7f86 100644 --- a/core/application/account_select.go +++ b/core/application/account_select.go @@ -74,10 +74,10 @@ func (s *Service) AccountSelect(ctx context.Context, req *pb.RpcAccountSelectReq } metrics.Service.SetWorkingDir(req.RootPath, req.Id) - return s.start(ctx, req.Id, req.RootPath, req.DisableLocalNetworkSync, req.PreferYamuxTransport, req.NetworkMode, req.NetworkCustomConfigFilePath) + return s.start(ctx, req.Id, req.RootPath, req.DisableLocalNetworkSync, req.JsonApiListenAddr, req.PreferYamuxTransport, req.NetworkMode, req.NetworkCustomConfigFilePath) } -func (s *Service) start(ctx context.Context, id string, rootPath string, disableLocalNetworkSync bool, preferYamux bool, networkMode pb.RpcAccountNetworkMode, networkConfigFilePath string) (*model.Account, error) { +func (s *Service) start(ctx context.Context, id string, rootPath string, disableLocalNetworkSync bool, jsonApiListenAddr string, preferYamux bool, networkMode pb.RpcAccountNetworkMode, networkConfigFilePath string) (*model.Account, error) { ctx, task := trace2.NewTask(ctx, "application.start") defer task.End() @@ -108,6 +108,10 @@ func (s *Service) start(ctx context.Context, id string, rootPath string, disable if disableLocalNetworkSync { cfg.DontStartLocalNetworkSyncAutomatically = true } + + if jsonApiListenAddr != "" { + cfg.JsonApiListenAddr = jsonApiListenAddr + } if preferYamux { cfg.PeferYamuxTransport = true } diff --git a/core/application/account_stop.go b/core/application/account_stop.go index 616461f69..b5f1f353e 100644 --- a/core/application/account_stop.go +++ b/core/application/account_stop.go @@ -89,7 +89,7 @@ func (s *Service) AccountChangeNetworkConfigAndRestart(ctx context.Context, req return ErrFailedToStopApplication } - _, err = s.start(ctx, accountId, rootPath, conf.DontStartLocalNetworkSyncAutomatically, conf.PeferYamuxTransport, req.NetworkMode, req.NetworkCustomConfigFilePath) + _, err = s.start(ctx, accountId, rootPath, conf.DontStartLocalNetworkSyncAutomatically, conf.JsonApiListenAddr, conf.PeferYamuxTransport, req.NetworkMode, req.NetworkCustomConfigFilePath) return err } diff --git a/docs/proto.md b/docs/proto.md index ea94570d6..cd2d8f005 100644 --- a/docs/proto.md +++ b/docs/proto.md @@ -50,6 +50,10 @@ - [Empty](#anytype-Empty) - [Rpc](#anytype-Rpc) - [Rpc.Account](#anytype-Rpc-Account) + - [Rpc.Account.ChangeJsonApiAddr](#anytype-Rpc-Account-ChangeJsonApiAddr) + - [Rpc.Account.ChangeJsonApiAddr.Request](#anytype-Rpc-Account-ChangeJsonApiAddr-Request) + - [Rpc.Account.ChangeJsonApiAddr.Response](#anytype-Rpc-Account-ChangeJsonApiAddr-Response) + - [Rpc.Account.ChangeJsonApiAddr.Response.Error](#anytype-Rpc-Account-ChangeJsonApiAddr-Response-Error) - [Rpc.Account.ChangeNetworkConfigAndRestart](#anytype-Rpc-Account-ChangeNetworkConfigAndRestart) - [Rpc.Account.ChangeNetworkConfigAndRestart.Request](#anytype-Rpc-Account-ChangeNetworkConfigAndRestart-Request) - [Rpc.Account.ChangeNetworkConfigAndRestart.Response](#anytype-Rpc-Account-ChangeNetworkConfigAndRestart-Response) @@ -1274,6 +1278,7 @@ - [Rpc.Workspace.SetInfo.Response.Error](#anytype-Rpc-Workspace-SetInfo-Response-Error) - [StreamRequest](#anytype-StreamRequest) + - [Rpc.Account.ChangeJsonApiAddr.Response.Error.Code](#anytype-Rpc-Account-ChangeJsonApiAddr-Response-Error-Code) - [Rpc.Account.ChangeNetworkConfigAndRestart.Response.Error.Code](#anytype-Rpc-Account-ChangeNetworkConfigAndRestart-Response-Error-Code) - [Rpc.Account.ConfigUpdate.Response.Error.Code](#anytype-Rpc-Account-ConfigUpdate-Response-Error-Code) - [Rpc.Account.ConfigUpdate.Timezones](#anytype-Rpc-Account-ConfigUpdate-Timezones) @@ -2020,6 +2025,7 @@ | AccountRevertDeletion | [Rpc.Account.RevertDeletion.Request](#anytype-Rpc-Account-RevertDeletion-Request) | [Rpc.Account.RevertDeletion.Response](#anytype-Rpc-Account-RevertDeletion-Response) | | | AccountSelect | [Rpc.Account.Select.Request](#anytype-Rpc-Account-Select-Request) | [Rpc.Account.Select.Response](#anytype-Rpc-Account-Select-Response) | | | AccountEnableLocalNetworkSync | [Rpc.Account.EnableLocalNetworkSync.Request](#anytype-Rpc-Account-EnableLocalNetworkSync-Request) | [Rpc.Account.EnableLocalNetworkSync.Response](#anytype-Rpc-Account-EnableLocalNetworkSync-Response) | | +| AccountChangeJsonApiAddr | [Rpc.Account.ChangeJsonApiAddr.Request](#anytype-Rpc-Account-ChangeJsonApiAddr-Request) | [Rpc.Account.ChangeJsonApiAddr.Response](#anytype-Rpc-Account-ChangeJsonApiAddr-Response) | | | AccountStop | [Rpc.Account.Stop.Request](#anytype-Rpc-Account-Stop-Request) | [Rpc.Account.Stop.Response](#anytype-Rpc-Account-Stop-Response) | | | AccountMove | [Rpc.Account.Move.Request](#anytype-Rpc-Account-Move-Request) | [Rpc.Account.Move.Response](#anytype-Rpc-Account-Move-Response) | | | AccountConfigUpdate | [Rpc.Account.ConfigUpdate.Request](#anytype-Rpc-Account-ConfigUpdate-Request) | [Rpc.Account.ConfigUpdate.Response](#anytype-Rpc-Account-ConfigUpdate-Response) | | @@ -2942,6 +2948,62 @@ Response – message from a middleware. + + +### Rpc.Account.ChangeJsonApiAddr + + + + + + + + + +### Rpc.Account.ChangeJsonApiAddr.Request + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| listenAddr | [string](#string) | | make sure to use 127.0.0.1:x to not listen on all interfaces; recommended value is 127.0.0.1:31009 | + + + + + + + + +### Rpc.Account.ChangeJsonApiAddr.Response + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| error | [Rpc.Account.ChangeJsonApiAddr.Response.Error](#anytype-Rpc-Account-ChangeJsonApiAddr-Response-Error) | | | + + + + + + + + +### Rpc.Account.ChangeJsonApiAddr.Response.Error + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| code | [Rpc.Account.ChangeJsonApiAddr.Response.Error.Code](#anytype-Rpc-Account-ChangeJsonApiAddr-Response-Error-Code) | | | +| description | [string](#string) | | | + + + + + + ### Rpc.Account.ChangeNetworkConfigAndRestart @@ -3100,6 +3162,7 @@ Front end to middleware request-to-create-an account | networkMode | [Rpc.Account.NetworkMode](#anytype-Rpc-Account-NetworkMode) | | optional, default is DefaultConfig | | networkCustomConfigFilePath | [string](#string) | | config path for the custom network mode } | | preferYamuxTransport | [bool](#bool) | | optional, default is false, recommended in case of problems with QUIC transport | +| jsonApiListenAddr | [string](#string) | | optional, if empty json api will not be started; 127.0.0.1:31009 should be the default one | @@ -3644,6 +3707,7 @@ User can select an account from those, that came with an AccountAdd events | networkMode | [Rpc.Account.NetworkMode](#anytype-Rpc-Account-NetworkMode) | | optional, default is DefaultConfig | | networkCustomConfigFilePath | [string](#string) | | config path for the custom network mode | | preferYamuxTransport | [bool](#bool) | | optional, default is false, recommended in case of problems with QUIC transport | +| jsonApiListenAddr | [string](#string) | | optional, if empty json api will not be started; 127.0.0.1:31009 should be the default one | @@ -20689,6 +20753,20 @@ Middleware-to-front-end response, that can contain a NULL error or a non-NULL er + + +### Rpc.Account.ChangeJsonApiAddr.Response.Error.Code + + +| Name | Number | Description | +| ---- | ------ | ----------- | +| NULL | 0 | | +| UNKNOWN_ERROR | 1 | | +| BAD_INPUT | 2 | | +| ACCOUNT_IS_NOT_RUNNING | 4 | | + + + ### Rpc.Account.ChangeNetworkConfigAndRestart.Response.Error.Code diff --git a/pb/commands.pb.go b/pb/commands.pb.go index 9782590c2..8e97796ca 100644 --- a/pb/commands.pb.go +++ b/pb/commands.pb.go @@ -1481,6 +1481,37 @@ func (RpcAccountEnableLocalNetworkSyncResponseErrorCode) EnumDescriptor() ([]byt return fileDescriptor_8261c968b2e6f45c, []int{0, 3, 11, 1, 0, 0} } +type RpcAccountChangeJsonApiAddrResponseErrorCode int32 + +const ( + RpcAccountChangeJsonApiAddrResponseError_NULL RpcAccountChangeJsonApiAddrResponseErrorCode = 0 + RpcAccountChangeJsonApiAddrResponseError_UNKNOWN_ERROR RpcAccountChangeJsonApiAddrResponseErrorCode = 1 + RpcAccountChangeJsonApiAddrResponseError_BAD_INPUT RpcAccountChangeJsonApiAddrResponseErrorCode = 2 + RpcAccountChangeJsonApiAddrResponseError_ACCOUNT_IS_NOT_RUNNING RpcAccountChangeJsonApiAddrResponseErrorCode = 4 +) + +var RpcAccountChangeJsonApiAddrResponseErrorCode_name = map[int32]string{ + 0: "NULL", + 1: "UNKNOWN_ERROR", + 2: "BAD_INPUT", + 4: "ACCOUNT_IS_NOT_RUNNING", +} + +var RpcAccountChangeJsonApiAddrResponseErrorCode_value = map[string]int32{ + "NULL": 0, + "UNKNOWN_ERROR": 1, + "BAD_INPUT": 2, + "ACCOUNT_IS_NOT_RUNNING": 4, +} + +func (x RpcAccountChangeJsonApiAddrResponseErrorCode) String() string { + return proto.EnumName(RpcAccountChangeJsonApiAddrResponseErrorCode_name, int32(x)) +} + +func (RpcAccountChangeJsonApiAddrResponseErrorCode) EnumDescriptor() ([]byte, []int) { + return fileDescriptor_8261c968b2e6f45c, []int{0, 3, 12, 1, 0, 0} +} + type RpcAccountChangeNetworkConfigAndRestartResponseErrorCode int32 const ( @@ -1521,7 +1552,7 @@ func (x RpcAccountChangeNetworkConfigAndRestartResponseErrorCode) String() strin } func (RpcAccountChangeNetworkConfigAndRestartResponseErrorCode) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 3, 12, 1, 0, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 3, 13, 1, 0, 0} } type RpcAccountLocalLinkNewChallengeResponseErrorCode int32 @@ -1555,7 +1586,7 @@ func (x RpcAccountLocalLinkNewChallengeResponseErrorCode) String() string { } func (RpcAccountLocalLinkNewChallengeResponseErrorCode) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 3, 13, 0, 1, 0, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 3, 14, 0, 1, 0, 0} } type RpcAccountLocalLinkSolveChallengeResponseErrorCode int32 @@ -1595,7 +1626,7 @@ func (x RpcAccountLocalLinkSolveChallengeResponseErrorCode) String() string { } func (RpcAccountLocalLinkSolveChallengeResponseErrorCode) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 3, 13, 1, 1, 0, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 3, 14, 1, 1, 0, 0} } type RpcWorkspaceGetCurrentResponseErrorCode int32 @@ -14050,6 +14081,7 @@ type RpcAccountCreateRequest struct { NetworkMode RpcAccountNetworkMode `protobuf:"varint,6,opt,name=networkMode,proto3,enum=anytype.RpcAccountNetworkMode" json:"networkMode,omitempty"` NetworkCustomConfigFilePath string `protobuf:"bytes,7,opt,name=networkCustomConfigFilePath,proto3" json:"networkCustomConfigFilePath,omitempty"` PreferYamuxTransport bool `protobuf:"varint,8,opt,name=preferYamuxTransport,proto3" json:"preferYamuxTransport,omitempty"` + JsonApiListenAddr string `protobuf:"bytes,9,opt,name=jsonApiListenAddr,proto3" json:"jsonApiListenAddr,omitempty"` } func (m *RpcAccountCreateRequest) Reset() { *m = RpcAccountCreateRequest{} } @@ -14160,6 +14192,13 @@ func (m *RpcAccountCreateRequest) GetPreferYamuxTransport() bool { return false } +func (m *RpcAccountCreateRequest) GetJsonApiListenAddr() string { + if m != nil { + return m.JsonApiListenAddr + } + return "" +} + // XXX_OneofWrappers is for the internal use of the proto package. func (*RpcAccountCreateRequest) XXX_OneofWrappers() []interface{} { return []interface{}{ @@ -14852,6 +14891,7 @@ type RpcAccountSelectRequest struct { NetworkMode RpcAccountNetworkMode `protobuf:"varint,4,opt,name=networkMode,proto3,enum=anytype.RpcAccountNetworkMode" json:"networkMode,omitempty"` NetworkCustomConfigFilePath string `protobuf:"bytes,5,opt,name=networkCustomConfigFilePath,proto3" json:"networkCustomConfigFilePath,omitempty"` PreferYamuxTransport bool `protobuf:"varint,6,opt,name=preferYamuxTransport,proto3" json:"preferYamuxTransport,omitempty"` + JsonApiListenAddr string `protobuf:"bytes,7,opt,name=jsonApiListenAddr,proto3" json:"jsonApiListenAddr,omitempty"` } func (m *RpcAccountSelectRequest) Reset() { *m = RpcAccountSelectRequest{} } @@ -14929,6 +14969,13 @@ func (m *RpcAccountSelectRequest) GetPreferYamuxTransport() bool { return false } +func (m *RpcAccountSelectRequest) GetJsonApiListenAddr() string { + if m != nil { + return m.JsonApiListenAddr + } + return "" +} + // * // Middleware-to-front-end response for an account select request, that can contain a NULL error and selected account or a non-NULL error and an empty account type RpcAccountSelectResponse struct { @@ -16079,6 +16126,184 @@ func (m *RpcAccountEnableLocalNetworkSyncResponseError) GetDescription() string return "" } +type RpcAccountChangeJsonApiAddr struct { +} + +func (m *RpcAccountChangeJsonApiAddr) Reset() { *m = RpcAccountChangeJsonApiAddr{} } +func (m *RpcAccountChangeJsonApiAddr) String() string { return proto.CompactTextString(m) } +func (*RpcAccountChangeJsonApiAddr) ProtoMessage() {} +func (*RpcAccountChangeJsonApiAddr) Descriptor() ([]byte, []int) { + return fileDescriptor_8261c968b2e6f45c, []int{0, 3, 12} +} +func (m *RpcAccountChangeJsonApiAddr) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *RpcAccountChangeJsonApiAddr) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_RpcAccountChangeJsonApiAddr.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 *RpcAccountChangeJsonApiAddr) XXX_Merge(src proto.Message) { + xxx_messageInfo_RpcAccountChangeJsonApiAddr.Merge(m, src) +} +func (m *RpcAccountChangeJsonApiAddr) XXX_Size() int { + return m.Size() +} +func (m *RpcAccountChangeJsonApiAddr) XXX_DiscardUnknown() { + xxx_messageInfo_RpcAccountChangeJsonApiAddr.DiscardUnknown(m) +} + +var xxx_messageInfo_RpcAccountChangeJsonApiAddr proto.InternalMessageInfo + +type RpcAccountChangeJsonApiAddrRequest struct { + ListenAddr string `protobuf:"bytes,1,opt,name=listenAddr,proto3" json:"listenAddr,omitempty"` +} + +func (m *RpcAccountChangeJsonApiAddrRequest) Reset() { *m = RpcAccountChangeJsonApiAddrRequest{} } +func (m *RpcAccountChangeJsonApiAddrRequest) String() string { return proto.CompactTextString(m) } +func (*RpcAccountChangeJsonApiAddrRequest) ProtoMessage() {} +func (*RpcAccountChangeJsonApiAddrRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_8261c968b2e6f45c, []int{0, 3, 12, 0} +} +func (m *RpcAccountChangeJsonApiAddrRequest) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *RpcAccountChangeJsonApiAddrRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_RpcAccountChangeJsonApiAddrRequest.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 *RpcAccountChangeJsonApiAddrRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_RpcAccountChangeJsonApiAddrRequest.Merge(m, src) +} +func (m *RpcAccountChangeJsonApiAddrRequest) XXX_Size() int { + return m.Size() +} +func (m *RpcAccountChangeJsonApiAddrRequest) XXX_DiscardUnknown() { + xxx_messageInfo_RpcAccountChangeJsonApiAddrRequest.DiscardUnknown(m) +} + +var xxx_messageInfo_RpcAccountChangeJsonApiAddrRequest proto.InternalMessageInfo + +func (m *RpcAccountChangeJsonApiAddrRequest) GetListenAddr() string { + if m != nil { + return m.ListenAddr + } + return "" +} + +type RpcAccountChangeJsonApiAddrResponse struct { + Error *RpcAccountChangeJsonApiAddrResponseError `protobuf:"bytes,2,opt,name=error,proto3" json:"error,omitempty"` +} + +func (m *RpcAccountChangeJsonApiAddrResponse) Reset() { *m = RpcAccountChangeJsonApiAddrResponse{} } +func (m *RpcAccountChangeJsonApiAddrResponse) String() string { return proto.CompactTextString(m) } +func (*RpcAccountChangeJsonApiAddrResponse) ProtoMessage() {} +func (*RpcAccountChangeJsonApiAddrResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_8261c968b2e6f45c, []int{0, 3, 12, 1} +} +func (m *RpcAccountChangeJsonApiAddrResponse) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *RpcAccountChangeJsonApiAddrResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_RpcAccountChangeJsonApiAddrResponse.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 *RpcAccountChangeJsonApiAddrResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_RpcAccountChangeJsonApiAddrResponse.Merge(m, src) +} +func (m *RpcAccountChangeJsonApiAddrResponse) XXX_Size() int { + return m.Size() +} +func (m *RpcAccountChangeJsonApiAddrResponse) XXX_DiscardUnknown() { + xxx_messageInfo_RpcAccountChangeJsonApiAddrResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_RpcAccountChangeJsonApiAddrResponse proto.InternalMessageInfo + +func (m *RpcAccountChangeJsonApiAddrResponse) GetError() *RpcAccountChangeJsonApiAddrResponseError { + if m != nil { + return m.Error + } + return nil +} + +type RpcAccountChangeJsonApiAddrResponseError struct { + Code RpcAccountChangeJsonApiAddrResponseErrorCode `protobuf:"varint,1,opt,name=code,proto3,enum=anytype.RpcAccountChangeJsonApiAddrResponseErrorCode" json:"code,omitempty"` + Description string `protobuf:"bytes,2,opt,name=description,proto3" json:"description,omitempty"` +} + +func (m *RpcAccountChangeJsonApiAddrResponseError) Reset() { + *m = RpcAccountChangeJsonApiAddrResponseError{} +} +func (m *RpcAccountChangeJsonApiAddrResponseError) String() string { return proto.CompactTextString(m) } +func (*RpcAccountChangeJsonApiAddrResponseError) ProtoMessage() {} +func (*RpcAccountChangeJsonApiAddrResponseError) Descriptor() ([]byte, []int) { + return fileDescriptor_8261c968b2e6f45c, []int{0, 3, 12, 1, 0} +} +func (m *RpcAccountChangeJsonApiAddrResponseError) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *RpcAccountChangeJsonApiAddrResponseError) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_RpcAccountChangeJsonApiAddrResponseError.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 *RpcAccountChangeJsonApiAddrResponseError) XXX_Merge(src proto.Message) { + xxx_messageInfo_RpcAccountChangeJsonApiAddrResponseError.Merge(m, src) +} +func (m *RpcAccountChangeJsonApiAddrResponseError) XXX_Size() int { + return m.Size() +} +func (m *RpcAccountChangeJsonApiAddrResponseError) XXX_DiscardUnknown() { + xxx_messageInfo_RpcAccountChangeJsonApiAddrResponseError.DiscardUnknown(m) +} + +var xxx_messageInfo_RpcAccountChangeJsonApiAddrResponseError proto.InternalMessageInfo + +func (m *RpcAccountChangeJsonApiAddrResponseError) GetCode() RpcAccountChangeJsonApiAddrResponseErrorCode { + if m != nil { + return m.Code + } + return RpcAccountChangeJsonApiAddrResponseError_NULL +} + +func (m *RpcAccountChangeJsonApiAddrResponseError) GetDescription() string { + if m != nil { + return m.Description + } + return "" +} + type RpcAccountChangeNetworkConfigAndRestart struct { } @@ -16088,7 +16313,7 @@ func (m *RpcAccountChangeNetworkConfigAndRestart) Reset() { func (m *RpcAccountChangeNetworkConfigAndRestart) String() string { return proto.CompactTextString(m) } func (*RpcAccountChangeNetworkConfigAndRestart) ProtoMessage() {} func (*RpcAccountChangeNetworkConfigAndRestart) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 3, 12} + return fileDescriptor_8261c968b2e6f45c, []int{0, 3, 13} } func (m *RpcAccountChangeNetworkConfigAndRestart) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -16130,7 +16355,7 @@ func (m *RpcAccountChangeNetworkConfigAndRestartRequest) String() string { } func (*RpcAccountChangeNetworkConfigAndRestartRequest) ProtoMessage() {} func (*RpcAccountChangeNetworkConfigAndRestartRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 3, 12, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 3, 13, 0} } func (m *RpcAccountChangeNetworkConfigAndRestartRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -16185,7 +16410,7 @@ func (m *RpcAccountChangeNetworkConfigAndRestartResponse) String() string { } func (*RpcAccountChangeNetworkConfigAndRestartResponse) ProtoMessage() {} func (*RpcAccountChangeNetworkConfigAndRestartResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 3, 12, 1} + return fileDescriptor_8261c968b2e6f45c, []int{0, 3, 13, 1} } func (m *RpcAccountChangeNetworkConfigAndRestartResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -16234,7 +16459,7 @@ func (m *RpcAccountChangeNetworkConfigAndRestartResponseError) String() string { } func (*RpcAccountChangeNetworkConfigAndRestartResponseError) ProtoMessage() {} func (*RpcAccountChangeNetworkConfigAndRestartResponseError) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 3, 12, 1, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 3, 13, 1, 0} } func (m *RpcAccountChangeNetworkConfigAndRestartResponseError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -16284,7 +16509,7 @@ func (m *RpcAccountLocalLink) Reset() { *m = RpcAccountLocalLink{} } func (m *RpcAccountLocalLink) String() string { return proto.CompactTextString(m) } func (*RpcAccountLocalLink) ProtoMessage() {} func (*RpcAccountLocalLink) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 3, 13} + return fileDescriptor_8261c968b2e6f45c, []int{0, 3, 14} } func (m *RpcAccountLocalLink) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -16320,7 +16545,7 @@ func (m *RpcAccountLocalLinkNewChallenge) Reset() { *m = RpcAccountLocal func (m *RpcAccountLocalLinkNewChallenge) String() string { return proto.CompactTextString(m) } func (*RpcAccountLocalLinkNewChallenge) ProtoMessage() {} func (*RpcAccountLocalLinkNewChallenge) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 3, 13, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 3, 14, 0} } func (m *RpcAccountLocalLinkNewChallenge) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -16360,7 +16585,7 @@ func (m *RpcAccountLocalLinkNewChallengeRequest) Reset() { func (m *RpcAccountLocalLinkNewChallengeRequest) String() string { return proto.CompactTextString(m) } func (*RpcAccountLocalLinkNewChallengeRequest) ProtoMessage() {} func (*RpcAccountLocalLinkNewChallengeRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 3, 13, 0, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 3, 14, 0, 0} } func (m *RpcAccountLocalLinkNewChallengeRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -16414,7 +16639,7 @@ func (m *RpcAccountLocalLinkNewChallengeResponse) Reset() { func (m *RpcAccountLocalLinkNewChallengeResponse) String() string { return proto.CompactTextString(m) } func (*RpcAccountLocalLinkNewChallengeResponse) ProtoMessage() {} func (*RpcAccountLocalLinkNewChallengeResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 3, 13, 0, 1} + return fileDescriptor_8261c968b2e6f45c, []int{0, 3, 14, 0, 1} } func (m *RpcAccountLocalLinkNewChallengeResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -16470,7 +16695,7 @@ func (m *RpcAccountLocalLinkNewChallengeResponseError) String() string { } func (*RpcAccountLocalLinkNewChallengeResponseError) ProtoMessage() {} func (*RpcAccountLocalLinkNewChallengeResponseError) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 3, 13, 0, 1, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 3, 14, 0, 1, 0} } func (m *RpcAccountLocalLinkNewChallengeResponseError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -16520,7 +16745,7 @@ func (m *RpcAccountLocalLinkSolveChallenge) Reset() { *m = RpcAccountLoc func (m *RpcAccountLocalLinkSolveChallenge) String() string { return proto.CompactTextString(m) } func (*RpcAccountLocalLinkSolveChallenge) ProtoMessage() {} func (*RpcAccountLocalLinkSolveChallenge) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 3, 13, 1} + return fileDescriptor_8261c968b2e6f45c, []int{0, 3, 14, 1} } func (m *RpcAccountLocalLinkSolveChallenge) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -16560,7 +16785,7 @@ func (m *RpcAccountLocalLinkSolveChallengeRequest) Reset() { func (m *RpcAccountLocalLinkSolveChallengeRequest) String() string { return proto.CompactTextString(m) } func (*RpcAccountLocalLinkSolveChallengeRequest) ProtoMessage() {} func (*RpcAccountLocalLinkSolveChallengeRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 3, 13, 1, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 3, 14, 1, 0} } func (m *RpcAccountLocalLinkSolveChallengeRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -16617,7 +16842,7 @@ func (m *RpcAccountLocalLinkSolveChallengeResponse) String() string { } func (*RpcAccountLocalLinkSolveChallengeResponse) ProtoMessage() {} func (*RpcAccountLocalLinkSolveChallengeResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 3, 13, 1, 1} + return fileDescriptor_8261c968b2e6f45c, []int{0, 3, 14, 1, 1} } func (m *RpcAccountLocalLinkSolveChallengeResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -16680,7 +16905,7 @@ func (m *RpcAccountLocalLinkSolveChallengeResponseError) String() string { } func (*RpcAccountLocalLinkSolveChallengeResponseError) ProtoMessage() {} func (*RpcAccountLocalLinkSolveChallengeResponseError) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 3, 13, 1, 1, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 3, 14, 1, 1, 0} } func (m *RpcAccountLocalLinkSolveChallengeResponseError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -70599,6 +70824,7 @@ func init() { proto.RegisterEnum("anytype.RpcAccountConfigUpdateResponseErrorCode", RpcAccountConfigUpdateResponseErrorCode_name, RpcAccountConfigUpdateResponseErrorCode_value) proto.RegisterEnum("anytype.RpcAccountRecoverFromLegacyExportResponseErrorCode", RpcAccountRecoverFromLegacyExportResponseErrorCode_name, RpcAccountRecoverFromLegacyExportResponseErrorCode_value) proto.RegisterEnum("anytype.RpcAccountEnableLocalNetworkSyncResponseErrorCode", RpcAccountEnableLocalNetworkSyncResponseErrorCode_name, RpcAccountEnableLocalNetworkSyncResponseErrorCode_value) + proto.RegisterEnum("anytype.RpcAccountChangeJsonApiAddrResponseErrorCode", RpcAccountChangeJsonApiAddrResponseErrorCode_name, RpcAccountChangeJsonApiAddrResponseErrorCode_value) proto.RegisterEnum("anytype.RpcAccountChangeNetworkConfigAndRestartResponseErrorCode", RpcAccountChangeNetworkConfigAndRestartResponseErrorCode_name, RpcAccountChangeNetworkConfigAndRestartResponseErrorCode_value) proto.RegisterEnum("anytype.RpcAccountLocalLinkNewChallengeResponseErrorCode", RpcAccountLocalLinkNewChallengeResponseErrorCode_name, RpcAccountLocalLinkNewChallengeResponseErrorCode_value) proto.RegisterEnum("anytype.RpcAccountLocalLinkSolveChallengeResponseErrorCode", RpcAccountLocalLinkSolveChallengeResponseErrorCode_name, RpcAccountLocalLinkSolveChallengeResponseErrorCode_value) @@ -71006,6 +71232,10 @@ func init() { proto.RegisterType((*RpcAccountEnableLocalNetworkSyncRequest)(nil), "anytype.Rpc.Account.EnableLocalNetworkSync.Request") proto.RegisterType((*RpcAccountEnableLocalNetworkSyncResponse)(nil), "anytype.Rpc.Account.EnableLocalNetworkSync.Response") proto.RegisterType((*RpcAccountEnableLocalNetworkSyncResponseError)(nil), "anytype.Rpc.Account.EnableLocalNetworkSync.Response.Error") + proto.RegisterType((*RpcAccountChangeJsonApiAddr)(nil), "anytype.Rpc.Account.ChangeJsonApiAddr") + proto.RegisterType((*RpcAccountChangeJsonApiAddrRequest)(nil), "anytype.Rpc.Account.ChangeJsonApiAddr.Request") + proto.RegisterType((*RpcAccountChangeJsonApiAddrResponse)(nil), "anytype.Rpc.Account.ChangeJsonApiAddr.Response") + proto.RegisterType((*RpcAccountChangeJsonApiAddrResponseError)(nil), "anytype.Rpc.Account.ChangeJsonApiAddr.Response.Error") proto.RegisterType((*RpcAccountChangeNetworkConfigAndRestart)(nil), "anytype.Rpc.Account.ChangeNetworkConfigAndRestart") proto.RegisterType((*RpcAccountChangeNetworkConfigAndRestartRequest)(nil), "anytype.Rpc.Account.ChangeNetworkConfigAndRestart.Request") proto.RegisterType((*RpcAccountChangeNetworkConfigAndRestartResponse)(nil), "anytype.Rpc.Account.ChangeNetworkConfigAndRestart.Response") @@ -72093,1234 +72323,1239 @@ func init() { func init() { proto.RegisterFile("pb/protos/commands.proto", fileDescriptor_8261c968b2e6f45c) } var fileDescriptor_8261c968b2e6f45c = []byte{ - // 19622 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0xfd, 0x7d, 0x9c, 0x23, 0x47, - 0x75, 0x2f, 0x8c, 0xaf, 0xba, 0x25, 0xcd, 0xcc, 0x99, 0x97, 0xd5, 0xb6, 0x77, 0xd7, 0xeb, 0xb2, - 0x59, 0x3b, 0x6b, 0x63, 0x1c, 0x63, 0xc6, 0xc6, 0x10, 0x82, 0x8d, 0x8d, 0xad, 0xd1, 0x68, 0x66, - 0x64, 0xcf, 0x48, 0x43, 0x4b, 0xb3, 0x8b, 0x93, 0x9b, 0x9f, 0x6e, 0xaf, 0x54, 0x33, 0xd3, 0x5e, - 0x4d, 0xb7, 0xd2, 0xdd, 0x33, 0xeb, 0xe5, 0xf7, 0xb9, 0xcf, 0x0d, 0x21, 0xe6, 0x25, 0xc4, 0x97, - 0x10, 0x42, 0x12, 0xde, 0x5f, 0x0d, 0x17, 0x12, 0x20, 0xbc, 0x5f, 0x48, 0x02, 0x84, 0x97, 0x40, - 0x08, 0x21, 0x04, 0x42, 0x20, 0x24, 0x3c, 0x81, 0x40, 0x08, 0xb9, 0x9f, 0x70, 0x79, 0x92, 0xe7, - 0x06, 0x42, 0x02, 0x4f, 0x9e, 0x4f, 0x57, 0x55, 0xbf, 0x94, 0x46, 0xdd, 0xaa, 0xd6, 0xa8, 0x35, - 0x26, 0x3c, 0xff, 0x75, 0x57, 0x57, 0x9f, 0x3a, 0x75, 0xbe, 0xa7, 0xaa, 0x4e, 0x55, 0x9d, 0x3a, - 0x05, 0xa7, 0xba, 0xe7, 0x6f, 0xee, 0x5a, 0xa6, 0x63, 0xda, 0x37, 0xb7, 0xcc, 0x9d, 0x1d, 0xcd, - 0x68, 0xdb, 0xf3, 0xe4, 0x5d, 0x99, 0xd0, 0x8c, 0x4b, 0xce, 0xa5, 0x2e, 0x46, 0xd7, 0x75, 0x2f, - 0x6c, 0xdd, 0xdc, 0xd1, 0xcf, 0xdf, 0xdc, 0x3d, 0x7f, 0xf3, 0x8e, 0xd9, 0xc6, 0x1d, 0xef, 0x07, - 0xf2, 0xc2, 0xb2, 0xa3, 0x1b, 0xa2, 0x72, 0x75, 0xcc, 0x96, 0xd6, 0xb1, 0x1d, 0xd3, 0xc2, 0x2c, - 0xe7, 0xc9, 0xa0, 0x48, 0xbc, 0x87, 0x0d, 0xc7, 0xa3, 0x70, 0xd5, 0x96, 0x69, 0x6e, 0x75, 0x30, - 0xfd, 0x76, 0x7e, 0x77, 0xf3, 0x66, 0xdb, 0xb1, 0x76, 0x5b, 0x0e, 0xfb, 0x7a, 0x4d, 0xef, 0xd7, - 0x36, 0xb6, 0x5b, 0x96, 0xde, 0x75, 0x4c, 0x8b, 0xe6, 0x38, 0xf3, 0xf7, 0x0f, 0x4d, 0x82, 0xac, - 0x76, 0x5b, 0xe8, 0x3b, 0x13, 0x20, 0x17, 0xbb, 0x5d, 0xf4, 0x31, 0x09, 0x60, 0x19, 0x3b, 0x67, - 0xb1, 0x65, 0xeb, 0xa6, 0x81, 0x8e, 0xc2, 0x84, 0x8a, 0x7f, 0x76, 0x17, 0xdb, 0xce, 0xed, 0xd9, - 0xe7, 0x7e, 0x43, 0xce, 0xa0, 0x87, 0x25, 0x98, 0x54, 0xb1, 0xdd, 0x35, 0x0d, 0x1b, 0x2b, 0x77, - 0x43, 0x0e, 0x5b, 0x96, 0x69, 0x9d, 0xca, 0x5c, 0x93, 0xb9, 0x61, 0xfa, 0xd6, 0x1b, 0xe7, 0x59, - 0xf5, 0xe7, 0xd5, 0x6e, 0x6b, 0xbe, 0xd8, 0xed, 0xce, 0x07, 0x94, 0xe6, 0xbd, 0x9f, 0xe6, 0xcb, - 0xee, 0x1f, 0x2a, 0xfd, 0x51, 0x39, 0x05, 0x13, 0x7b, 0x34, 0xc3, 0x29, 0xe9, 0x9a, 0xcc, 0x0d, - 0x53, 0xaa, 0xf7, 0xea, 0x7e, 0x69, 0x63, 0x47, 0xd3, 0x3b, 0xf6, 0x29, 0x99, 0x7e, 0x61, 0xaf, - 0xe8, 0xb5, 0x19, 0xc8, 0x11, 0x22, 0x4a, 0x09, 0xb2, 0x2d, 0xb3, 0x8d, 0x49, 0xf1, 0x73, 0xb7, - 0xde, 0x2c, 0x5e, 0xfc, 0x7c, 0xc9, 0x6c, 0x63, 0x95, 0xfc, 0xac, 0x5c, 0x03, 0xd3, 0x9e, 0x58, - 0x02, 0x36, 0xc2, 0x49, 0x67, 0x6e, 0x85, 0xac, 0x9b, 0x5f, 0x99, 0x84, 0x6c, 0x75, 0x63, 0x75, - 0xb5, 0x70, 0x44, 0x39, 0x06, 0xb3, 0x1b, 0xd5, 0x7b, 0xab, 0xb5, 0x73, 0xd5, 0x66, 0x59, 0x55, - 0x6b, 0x6a, 0x21, 0xa3, 0xcc, 0xc2, 0xd4, 0x42, 0x71, 0xb1, 0x59, 0xa9, 0xae, 0x6f, 0x34, 0x0a, - 0x12, 0x7a, 0xa5, 0x0c, 0x73, 0x75, 0xec, 0x2c, 0xe2, 0x3d, 0xbd, 0x85, 0xeb, 0x8e, 0xe6, 0x60, - 0xf4, 0x82, 0x8c, 0x2f, 0x4c, 0x65, 0xc3, 0x2d, 0xd4, 0xff, 0xc4, 0x2a, 0xf0, 0x84, 0x7d, 0x15, - 0xe0, 0x29, 0xcc, 0xb3, 0xbf, 0xe7, 0x43, 0x69, 0x6a, 0x98, 0xce, 0x99, 0xc7, 0xc1, 0x74, 0xe8, - 0x9b, 0x32, 0x07, 0xb0, 0x50, 0x2c, 0xdd, 0xbb, 0xac, 0xd6, 0x36, 0xaa, 0x8b, 0x85, 0x23, 0xee, - 0xfb, 0x52, 0x4d, 0x2d, 0xb3, 0xf7, 0x0c, 0xfa, 0x5e, 0x26, 0x04, 0xe6, 0x22, 0x0f, 0xe6, 0xfc, - 0x60, 0x66, 0xfa, 0x00, 0x8a, 0xde, 0xe0, 0x83, 0xb3, 0xcc, 0x81, 0xf3, 0x84, 0x64, 0xe4, 0xd2, - 0x07, 0xe8, 0x41, 0x09, 0x26, 0xeb, 0xdb, 0xbb, 0x4e, 0xdb, 0xbc, 0x68, 0xa0, 0x29, 0x1f, 0x19, - 0xf4, 0xad, 0xb0, 0x4c, 0x9e, 0xca, 0xcb, 0xe4, 0x86, 0xfd, 0x95, 0x60, 0x14, 0x22, 0xa4, 0xf1, - 0x6a, 0x5f, 0x1a, 0x45, 0x4e, 0x1a, 0x8f, 0x13, 0x25, 0x94, 0xbe, 0x1c, 0x5e, 0xfa, 0x64, 0xc8, - 0xd5, 0xbb, 0x5a, 0x0b, 0xa3, 0x4f, 0xc9, 0x30, 0xb3, 0x8a, 0xb5, 0x3d, 0x5c, 0xec, 0x76, 0x2d, - 0x73, 0x0f, 0xa3, 0x52, 0xa0, 0xaf, 0xa7, 0x60, 0xc2, 0x76, 0x33, 0x55, 0xda, 0xa4, 0x06, 0x53, - 0xaa, 0xf7, 0xaa, 0x9c, 0x06, 0xd0, 0xdb, 0xd8, 0x70, 0x74, 0x47, 0xc7, 0xf6, 0x29, 0xe9, 0x1a, - 0xf9, 0x86, 0x29, 0x35, 0x94, 0x82, 0xbe, 0x23, 0x89, 0xea, 0x18, 0xe1, 0x62, 0x3e, 0xcc, 0x41, - 0x84, 0x54, 0x5f, 0x27, 0x89, 0xe8, 0xd8, 0x40, 0x72, 0xc9, 0x64, 0xfb, 0xd6, 0x4c, 0x72, 0xe1, - 0xba, 0x39, 0xaa, 0xb5, 0x66, 0x7d, 0xa3, 0xb4, 0xd2, 0xac, 0xaf, 0x17, 0x4b, 0xe5, 0x02, 0x56, - 0x8e, 0x43, 0x81, 0x3c, 0x36, 0x2b, 0xf5, 0xe6, 0x62, 0x79, 0xb5, 0xdc, 0x28, 0x2f, 0x16, 0x36, - 0x15, 0x05, 0xe6, 0xd4, 0xf2, 0xd3, 0x36, 0xca, 0xf5, 0x46, 0x73, 0xa9, 0x58, 0x59, 0x2d, 0x2f, - 0x16, 0xb6, 0xdc, 0x9f, 0x57, 0x2b, 0x6b, 0x95, 0x46, 0x53, 0x2d, 0x17, 0x4b, 0x2b, 0xe5, 0xc5, - 0xc2, 0xb6, 0x72, 0x39, 0x5c, 0x56, 0xad, 0x35, 0x8b, 0xeb, 0xeb, 0x6a, 0xed, 0x6c, 0xb9, 0xc9, - 0xfe, 0xa8, 0x17, 0x74, 0x5a, 0x50, 0xa3, 0x59, 0x5f, 0x29, 0xaa, 0xe5, 0xe2, 0xc2, 0x6a, 0xb9, - 0x70, 0x3f, 0x7a, 0x96, 0x0c, 0xb3, 0x6b, 0xda, 0x05, 0x5c, 0xdf, 0xd6, 0x2c, 0xac, 0x9d, 0xef, - 0x60, 0x74, 0xad, 0x00, 0x9e, 0xe8, 0x53, 0x61, 0xbc, 0xca, 0x3c, 0x5e, 0x37, 0xf7, 0x11, 0x30, - 0x57, 0x44, 0x04, 0x60, 0xff, 0xe2, 0x37, 0x83, 0x15, 0x0e, 0xb0, 0x27, 0x26, 0xa4, 0x97, 0x0c, - 0xb1, 0x9f, 0x7f, 0x04, 0x20, 0x86, 0xbe, 0x2c, 0xc3, 0x5c, 0xc5, 0xd8, 0xd3, 0x1d, 0xbc, 0x8c, - 0x0d, 0x6c, 0xb9, 0xe3, 0x80, 0x10, 0x0c, 0x0f, 0xcb, 0x21, 0x18, 0x96, 0x78, 0x18, 0x6e, 0xe9, - 0x23, 0x36, 0xbe, 0x8c, 0x88, 0xd1, 0xf6, 0x2a, 0x98, 0xd2, 0x49, 0xbe, 0x92, 0xde, 0x66, 0x12, - 0x0b, 0x12, 0x94, 0xeb, 0x60, 0x96, 0xbe, 0x2c, 0xe9, 0x1d, 0x7c, 0x2f, 0xbe, 0xc4, 0xc6, 0x5d, - 0x3e, 0x11, 0xfd, 0x92, 0xdf, 0xf8, 0x2a, 0x1c, 0x96, 0x3f, 0x91, 0x94, 0xa9, 0x64, 0x60, 0xbe, - 0xf8, 0x91, 0xd0, 0xfc, 0xf6, 0xb5, 0x32, 0x1d, 0xfd, 0x40, 0x82, 0xe9, 0xba, 0x63, 0x76, 0x5d, - 0x95, 0xd5, 0x8d, 0x2d, 0x31, 0x70, 0x3f, 0x11, 0x6e, 0x63, 0x25, 0x1e, 0xdc, 0xc7, 0xf5, 0x91, - 0x63, 0xa8, 0x80, 0x88, 0x16, 0xf6, 0x1d, 0xbf, 0x85, 0x2d, 0x71, 0xa8, 0xdc, 0x9a, 0x88, 0xda, - 0x0f, 0x61, 0xfb, 0x7a, 0xb1, 0x0c, 0x05, 0x4f, 0xcd, 0x9c, 0xd2, 0xae, 0x65, 0x61, 0xc3, 0x11, - 0x03, 0xe1, 0x2f, 0xc3, 0x20, 0xac, 0xf0, 0x20, 0xdc, 0x1a, 0xa3, 0xcc, 0x5e, 0x29, 0x29, 0xb6, - 0xb1, 0x0f, 0xf9, 0x68, 0xde, 0xcb, 0xa1, 0xf9, 0x93, 0xc9, 0xd9, 0x4a, 0x06, 0xe9, 0xca, 0x10, - 0x88, 0x1e, 0x87, 0x82, 0x3b, 0x26, 0x95, 0x1a, 0x95, 0xb3, 0xe5, 0x66, 0xa5, 0x7a, 0xb6, 0xd2, - 0x28, 0x17, 0x30, 0x7a, 0x91, 0x0c, 0x33, 0x94, 0x35, 0x15, 0xef, 0x99, 0x17, 0x04, 0x7b, 0xbd, - 0x2f, 0x27, 0x34, 0x16, 0xc2, 0x25, 0x44, 0xb4, 0x8c, 0x5f, 0x4c, 0x60, 0x2c, 0xc4, 0x90, 0x7b, - 0x24, 0xf5, 0x56, 0xfb, 0x9a, 0xc1, 0x56, 0x9f, 0xd6, 0xd2, 0xb7, 0xb7, 0x7a, 0x71, 0x16, 0x80, + // 19697 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0xfd, 0x7b, 0x9c, 0x24, 0x49, + 0x59, 0x2f, 0x8c, 0x4f, 0x65, 0x56, 0x55, 0x77, 0x3f, 0x7d, 0x99, 0x9a, 0xdc, 0x99, 0xd9, 0xd9, + 0xd8, 0x65, 0x76, 0x9d, 0x5d, 0x96, 0x75, 0x59, 0x7a, 0x97, 0x05, 0x91, 0x5d, 0xf6, 0x56, 0x5d, + 0x5d, 0xdd, 0x5d, 0xbb, 0xdd, 0x55, 0x6d, 0x56, 0xf5, 0x0c, 0xab, 0xc7, 0x5f, 0x9d, 0x9c, 0xaa, + 0xe8, 0xee, 0xdc, 0xa9, 0xce, 0x2c, 0x33, 0xb3, 0x7b, 0x76, 0xf8, 0x7d, 0xce, 0x7b, 0x44, 0x5c, + 0x41, 0x91, 0x83, 0x88, 0xa8, 0x80, 0xdc, 0x59, 0x38, 0x20, 0x17, 0xb9, 0x1f, 0x50, 0x01, 0xb9, + 0xc8, 0x45, 0x44, 0x04, 0x11, 0x44, 0xf7, 0x15, 0x04, 0x11, 0xcf, 0x47, 0x0e, 0xaf, 0xbe, 0x47, + 0x10, 0x85, 0xd7, 0xf7, 0x93, 0x11, 0x91, 0x97, 0xa8, 0xae, 0xcc, 0x8a, 0xac, 0xae, 0xac, 0x5e, + 0xe4, 0xfd, 0x2f, 0x33, 0x32, 0xf2, 0x89, 0x27, 0x9e, 0xef, 0x13, 0x11, 0x4f, 0x44, 0x3c, 0xf1, + 0x04, 0x9c, 0xea, 0x9e, 0xbf, 0xb9, 0x6b, 0x99, 0x8e, 0x69, 0xdf, 0xdc, 0x32, 0x77, 0x76, 0x34, + 0xa3, 0x6d, 0xcf, 0x93, 0x77, 0x65, 0x42, 0x33, 0x2e, 0x39, 0x97, 0xba, 0x18, 0x5d, 0xd7, 0xbd, + 0xb0, 0x75, 0x73, 0x47, 0x3f, 0x7f, 0x73, 0xf7, 0xfc, 0xcd, 0x3b, 0x66, 0x1b, 0x77, 0xbc, 0x1f, + 0xc8, 0x0b, 0xcb, 0x8e, 0x6e, 0x88, 0xca, 0xd5, 0x31, 0x5b, 0x5a, 0xc7, 0x76, 0x4c, 0x0b, 0xb3, + 0x9c, 0x27, 0x83, 0x22, 0xf1, 0x1e, 0x36, 0x1c, 0x8f, 0xc2, 0x55, 0x5b, 0xa6, 0xb9, 0xd5, 0xc1, + 0xf4, 0xdb, 0xf9, 0xdd, 0xcd, 0x9b, 0x6d, 0xc7, 0xda, 0x6d, 0x39, 0xec, 0xeb, 0x35, 0xbd, 0x5f, + 0xdb, 0xd8, 0x6e, 0x59, 0x7a, 0xd7, 0x31, 0x2d, 0x9a, 0xe3, 0xcc, 0x9b, 0x5e, 0x30, 0x09, 0xb2, + 0xda, 0x6d, 0xa1, 0x6f, 0x4f, 0x80, 0x5c, 0xec, 0x76, 0xd1, 0x47, 0x25, 0x80, 0x65, 0xec, 0x9c, + 0xc5, 0x96, 0xad, 0x9b, 0x06, 0x3a, 0x0a, 0x13, 0x2a, 0xfe, 0x99, 0x5d, 0x6c, 0x3b, 0xb7, 0x67, + 0x9f, 0xf3, 0x75, 0x39, 0x83, 0x1e, 0x96, 0x60, 0x52, 0xc5, 0x76, 0xd7, 0x34, 0x6c, 0xac, 0xdc, + 0x03, 0x39, 0x6c, 0x59, 0xa6, 0x75, 0x2a, 0x73, 0x4d, 0xe6, 0x86, 0xe9, 0x5b, 0x6f, 0x9c, 0x67, + 0xd5, 0x9f, 0x57, 0xbb, 0xad, 0xf9, 0x62, 0xb7, 0x3b, 0x1f, 0x50, 0x9a, 0xf7, 0x7e, 0x9a, 0x2f, + 0xbb, 0x7f, 0xa8, 0xf4, 0x47, 0xe5, 0x14, 0x4c, 0xec, 0xd1, 0x0c, 0xa7, 0xa4, 0x6b, 0x32, 0x37, + 0x4c, 0xa9, 0xde, 0xab, 0xfb, 0xa5, 0x8d, 0x1d, 0x4d, 0xef, 0xd8, 0xa7, 0x64, 0xfa, 0x85, 0xbd, + 0xa2, 0x57, 0x67, 0x20, 0x47, 0x88, 0x28, 0x25, 0xc8, 0xb6, 0xcc, 0x36, 0x26, 0xc5, 0xcf, 0xdd, + 0x7a, 0xb3, 0x78, 0xf1, 0xf3, 0x25, 0xb3, 0x8d, 0x55, 0xf2, 0xb3, 0x72, 0x0d, 0x4c, 0x7b, 0x62, + 0x09, 0xd8, 0x08, 0x27, 0x9d, 0xb9, 0x15, 0xb2, 0x6e, 0x7e, 0x65, 0x12, 0xb2, 0xd5, 0x8d, 0xd5, + 0xd5, 0xc2, 0x11, 0xe5, 0x18, 0xcc, 0x6e, 0x54, 0xef, 0xab, 0xd6, 0xce, 0x55, 0x9b, 0x65, 0x55, + 0xad, 0xa9, 0x85, 0x8c, 0x32, 0x0b, 0x53, 0x0b, 0xc5, 0xc5, 0x66, 0xa5, 0xba, 0xbe, 0xd1, 0x28, + 0x48, 0xe8, 0xe5, 0x32, 0xcc, 0xd5, 0xb1, 0xb3, 0x88, 0xf7, 0xf4, 0x16, 0xae, 0x3b, 0x9a, 0x83, + 0xd1, 0xf3, 0x33, 0xbe, 0x30, 0x95, 0x0d, 0xb7, 0x50, 0xff, 0x13, 0xab, 0xc0, 0x93, 0xf6, 0x55, + 0x80, 0xa7, 0x30, 0xcf, 0xfe, 0x9e, 0x0f, 0xa5, 0xa9, 0x61, 0x3a, 0x67, 0x9e, 0x00, 0xd3, 0xa1, + 0x6f, 0xca, 0x1c, 0xc0, 0x42, 0xb1, 0x74, 0xdf, 0xb2, 0x5a, 0xdb, 0xa8, 0x2e, 0x16, 0x8e, 0xb8, + 0xef, 0x4b, 0x35, 0xb5, 0xcc, 0xde, 0x33, 0xe8, 0xbb, 0x99, 0x10, 0x98, 0x8b, 0x3c, 0x98, 0xf3, + 0x83, 0x99, 0xe9, 0x03, 0x28, 0x7a, 0x9d, 0x0f, 0xce, 0x32, 0x07, 0xce, 0x93, 0x92, 0x91, 0x4b, + 0x1f, 0xa0, 0x87, 0x24, 0x98, 0xac, 0x6f, 0xef, 0x3a, 0x6d, 0xf3, 0xa2, 0x81, 0xa6, 0x7c, 0x64, + 0xd0, 0x37, 0xc3, 0x32, 0xb9, 0x8b, 0x97, 0xc9, 0x0d, 0xfb, 0x2b, 0xc1, 0x28, 0x44, 0x48, 0xe3, + 0x95, 0xbe, 0x34, 0x8a, 0x9c, 0x34, 0x9e, 0x20, 0x4a, 0x28, 0x7d, 0x39, 0xbc, 0xe4, 0xa9, 0x90, + 0xab, 0x77, 0xb5, 0x16, 0x46, 0x9f, 0x92, 0x61, 0x66, 0x15, 0x6b, 0x7b, 0xb8, 0xd8, 0xed, 0x5a, + 0xe6, 0x1e, 0x46, 0xa5, 0x40, 0x5f, 0x4f, 0xc1, 0x84, 0xed, 0x66, 0xaa, 0xb4, 0x49, 0x0d, 0xa6, + 0x54, 0xef, 0x55, 0x39, 0x0d, 0xa0, 0xb7, 0xb1, 0xe1, 0xe8, 0x8e, 0x8e, 0xed, 0x53, 0xd2, 0x35, + 0xf2, 0x0d, 0x53, 0x6a, 0x28, 0x05, 0x7d, 0x5b, 0x12, 0xd5, 0x31, 0xc2, 0xc5, 0x7c, 0x98, 0x83, + 0x08, 0xa9, 0xbe, 0x46, 0x12, 0xd1, 0xb1, 0x81, 0xe4, 0x92, 0xc9, 0xf6, 0x2d, 0x99, 0xe4, 0xc2, + 0x75, 0x73, 0x54, 0x6b, 0xcd, 0xfa, 0x46, 0x69, 0xa5, 0x59, 0x5f, 0x2f, 0x96, 0xca, 0x05, 0xac, + 0x1c, 0x87, 0x02, 0x79, 0x6c, 0x56, 0xea, 0xcd, 0xc5, 0xf2, 0x6a, 0xb9, 0x51, 0x5e, 0x2c, 0x6c, + 0x2a, 0x0a, 0xcc, 0xa9, 0xe5, 0x9f, 0xd8, 0x28, 0xd7, 0x1b, 0xcd, 0xa5, 0x62, 0x65, 0xb5, 0xbc, + 0x58, 0xd8, 0x72, 0x7f, 0x5e, 0xad, 0xac, 0x55, 0x1a, 0x4d, 0xb5, 0x5c, 0x2c, 0xad, 0x94, 0x17, + 0x0b, 0xdb, 0xca, 0xe5, 0x70, 0x59, 0xb5, 0xd6, 0x2c, 0xae, 0xaf, 0xab, 0xb5, 0xb3, 0xe5, 0x26, + 0xfb, 0xa3, 0x5e, 0xd0, 0x69, 0x41, 0x8d, 0x66, 0x7d, 0xa5, 0xa8, 0x96, 0x8b, 0x0b, 0xab, 0xe5, + 0xc2, 0x03, 0xe8, 0x59, 0x32, 0xcc, 0xae, 0x69, 0x17, 0x70, 0x7d, 0x5b, 0xb3, 0xb0, 0x76, 0xbe, + 0x83, 0xd1, 0xb5, 0x02, 0x78, 0xa2, 0x4f, 0x85, 0xf1, 0x2a, 0xf3, 0x78, 0xdd, 0xdc, 0x47, 0xc0, + 0x5c, 0x11, 0x11, 0x80, 0xfd, 0x8b, 0xdf, 0x0c, 0x56, 0x38, 0xc0, 0x9e, 0x9c, 0x90, 0x5e, 0x32, + 0xc4, 0x7e, 0xee, 0x51, 0x80, 0x18, 0x7a, 0x44, 0x86, 0xb9, 0x8a, 0xb1, 0xa7, 0x3b, 0x78, 0x19, + 0x1b, 0xd8, 0x72, 0xc7, 0x01, 0x21, 0x18, 0x1e, 0x96, 0x43, 0x30, 0x2c, 0xf1, 0x30, 0xdc, 0xd2, + 0x47, 0x6c, 0x7c, 0x19, 0x11, 0xa3, 0xed, 0x55, 0x30, 0xa5, 0x93, 0x7c, 0x25, 0xbd, 0xcd, 0x24, + 0x16, 0x24, 0x28, 0xd7, 0xc1, 0x2c, 0x7d, 0x59, 0xd2, 0x3b, 0xf8, 0x3e, 0x7c, 0x89, 0x8d, 0xbb, + 0x7c, 0x22, 0xfa, 0x65, 0xbf, 0xf1, 0x55, 0x38, 0x2c, 0x7f, 0x2c, 0x29, 0x53, 0xc9, 0xc0, 0x7c, + 0xd1, 0xa3, 0xa1, 0xf9, 0xed, 0x6b, 0x65, 0x3a, 0xfa, 0xbe, 0x04, 0xd3, 0x75, 0xc7, 0xec, 0xba, + 0x2a, 0xab, 0x1b, 0x5b, 0x62, 0xe0, 0x7e, 0x3c, 0xdc, 0xc6, 0x4a, 0x3c, 0xb8, 0x4f, 0xe8, 0x23, + 0xc7, 0x50, 0x01, 0x11, 0x2d, 0xec, 0xdb, 0x7e, 0x0b, 0x5b, 0xe2, 0x50, 0xb9, 0x35, 0x11, 0xb5, + 0x1f, 0xc0, 0xf6, 0xf5, 0x22, 0x19, 0x0a, 0x9e, 0x9a, 0x39, 0xa5, 0x5d, 0xcb, 0xc2, 0x86, 0x23, + 0x06, 0xc2, 0x5f, 0x86, 0x41, 0x58, 0xe1, 0x41, 0xb8, 0x35, 0x46, 0x99, 0xbd, 0x52, 0x52, 0x6c, + 0x63, 0x1f, 0xf4, 0xd1, 0xbc, 0x8f, 0x43, 0xf3, 0xc7, 0x93, 0xb3, 0x95, 0x0c, 0xd2, 0x95, 0x21, + 0x10, 0x3d, 0x0e, 0x05, 0x77, 0x4c, 0x2a, 0x35, 0x2a, 0x67, 0xcb, 0xcd, 0x4a, 0xf5, 0x6c, 0xa5, + 0x51, 0x2e, 0x60, 0xf4, 0x42, 0x19, 0x66, 0x28, 0x6b, 0x2a, 0xde, 0x33, 0x2f, 0x08, 0xf6, 0x7a, + 0x8f, 0x24, 0x34, 0x16, 0xc2, 0x25, 0x44, 0xb4, 0x8c, 0x5f, 0x4a, 0x60, 0x2c, 0xc4, 0x90, 0x7b, + 0x34, 0xf5, 0x56, 0xfb, 0x9a, 0xc1, 0x56, 0x9f, 0xd6, 0xd2, 0xb7, 0xb7, 0x7a, 0x51, 0x16, 0x80, 0x56, 0xf2, 0xac, 0x8e, 0x2f, 0xa2, 0xb5, 0x00, 0x13, 0x4e, 0x6d, 0x33, 0x03, 0xd5, 0x56, 0xea, - 0xa7, 0xb6, 0xef, 0x0d, 0x8f, 0x59, 0x0b, 0x3c, 0x7a, 0x37, 0x45, 0x8a, 0xdb, 0xe5, 0x24, 0x7a, + 0xa7, 0xb6, 0xef, 0x09, 0x8f, 0x59, 0x0b, 0x3c, 0x7a, 0x37, 0x45, 0x8a, 0xdb, 0xe5, 0x24, 0x7a, 0x76, 0xe8, 0x29, 0x8a, 0xc4, 0x5b, 0x9d, 0x57, 0xc1, 0x14, 0x79, 0xac, 0x6a, 0x3b, 0x98, 0xb5, 0xa1, 0x20, 0x41, 0x39, 0x03, 0x33, 0x34, 0x63, 0xcb, 0x34, 0xdc, 0xfa, 0x64, 0x49, 0x06, 0x2e, 0xcd, 0x05, 0xb1, 0x65, 0x61, 0xcd, 0x31, 0x2d, 0x42, 0x23, 0x47, 0x41, 0x0c, 0x25, 0xa1, 0x6f, - 0xfa, 0xad, 0xb0, 0xcc, 0x69, 0xce, 0xe3, 0x93, 0x54, 0x25, 0x99, 0xde, 0xec, 0x0d, 0xd7, 0xfe, + 0xf8, 0xad, 0xb0, 0xcc, 0x69, 0xce, 0x13, 0x93, 0x54, 0x25, 0x99, 0xde, 0xec, 0x0d, 0xd7, 0xfe, 0x68, 0xab, 0x6b, 0xba, 0x68, 0x2f, 0x91, 0xa9, 0x1d, 0x56, 0x4e, 0x82, 0xc2, 0x52, 0xdd, 0xbc, - 0xa5, 0x5a, 0xb5, 0x51, 0xae, 0x36, 0x0a, 0x9b, 0x7d, 0x35, 0x6a, 0x0b, 0xbd, 0x2e, 0x0b, 0xd9, - 0x7b, 0x4c, 0xdd, 0x40, 0x0f, 0x66, 0x38, 0x95, 0x30, 0xb0, 0x73, 0xd1, 0xb4, 0x2e, 0xf8, 0x0d, - 0x35, 0x48, 0x88, 0xc7, 0x26, 0x50, 0x25, 0x79, 0xa0, 0x2a, 0x65, 0xfb, 0xa9, 0xd2, 0xaf, 0x84, - 0x55, 0xe9, 0x0e, 0x5e, 0x95, 0xae, 0xef, 0x23, 0x7f, 0x97, 0xf9, 0x88, 0x0e, 0xe0, 0xe3, 0x7e, - 0x07, 0x70, 0x17, 0x07, 0xe3, 0x63, 0xc5, 0xc8, 0x24, 0x03, 0xf0, 0x4b, 0xa9, 0x36, 0xfc, 0x7e, - 0x50, 0x6f, 0x45, 0x40, 0xbd, 0xdd, 0xa7, 0x4f, 0xd0, 0xf7, 0x77, 0x1d, 0xf7, 0xef, 0xef, 0x26, + 0xa5, 0x5a, 0xb5, 0x51, 0xae, 0x36, 0x0a, 0x9b, 0x7d, 0x35, 0x6a, 0x0b, 0xbd, 0x26, 0x0b, 0xd9, + 0x7b, 0x4d, 0xdd, 0x40, 0x0f, 0x65, 0x38, 0x95, 0x30, 0xb0, 0x73, 0xd1, 0xb4, 0x2e, 0xf8, 0x0d, + 0x35, 0x48, 0x88, 0xc7, 0x26, 0x50, 0x25, 0x79, 0xa0, 0x2a, 0x65, 0xfb, 0xa9, 0xd2, 0xaf, 0x86, + 0x55, 0xe9, 0x0e, 0x5e, 0x95, 0xae, 0xef, 0x23, 0x7f, 0x97, 0xf9, 0x88, 0x0e, 0xe0, 0x63, 0x7e, + 0x07, 0x70, 0x37, 0x07, 0xe3, 0xe3, 0xc5, 0xc8, 0x24, 0x03, 0xf0, 0x4b, 0xa9, 0x36, 0xfc, 0x7e, + 0x50, 0x6f, 0x45, 0x40, 0xbd, 0xdd, 0xa7, 0x4f, 0xd0, 0xf7, 0x77, 0x1d, 0x0f, 0xec, 0xef, 0x26, 0x2e, 0x28, 0x27, 0xe0, 0xd8, 0x62, 0x65, 0x69, 0xa9, 0xac, 0x96, 0xab, 0x8d, 0x66, 0xb5, 0xdc, - 0x38, 0x57, 0x53, 0xef, 0x2d, 0x74, 0xd0, 0x6b, 0x65, 0x00, 0x57, 0x42, 0x25, 0xcd, 0x68, 0xe1, - 0x8e, 0x58, 0x8f, 0xfe, 0xbf, 0xa4, 0x64, 0x7d, 0x42, 0x40, 0x3f, 0x02, 0xce, 0x57, 0x48, 0xe2, - 0xad, 0x32, 0x92, 0x58, 0x32, 0x50, 0xdf, 0xfc, 0x48, 0xb0, 0x3d, 0x2f, 0x83, 0xa3, 0x1e, 0x3d, - 0x96, 0xbd, 0xff, 0xb4, 0xef, 0x6d, 0x59, 0x98, 0x63, 0xb0, 0x78, 0xf3, 0xf8, 0xe7, 0x66, 0x44, + 0x38, 0x57, 0x53, 0xef, 0x2b, 0x74, 0xd0, 0xab, 0x65, 0x00, 0x57, 0x42, 0x25, 0xcd, 0x68, 0xe1, + 0x8e, 0x58, 0x8f, 0xfe, 0xbf, 0xa4, 0x64, 0x7d, 0x42, 0x40, 0x3f, 0x02, 0xce, 0x97, 0x49, 0xe2, + 0xad, 0x32, 0x92, 0x58, 0x32, 0x50, 0xdf, 0xf8, 0x68, 0xb0, 0x3d, 0x2f, 0x83, 0xa3, 0x1e, 0x3d, + 0x96, 0xbd, 0xff, 0xb4, 0xef, 0xad, 0x59, 0x98, 0x63, 0xb0, 0x78, 0xf3, 0xf8, 0xe7, 0x64, 0x44, 0x26, 0xf2, 0x08, 0x26, 0xd9, 0xb4, 0xdd, 0xeb, 0xde, 0xfd, 0x77, 0x65, 0x19, 0xa6, 0xbb, 0xd8, - 0xda, 0xd1, 0x6d, 0x5b, 0x37, 0x0d, 0xba, 0x20, 0x37, 0x77, 0xeb, 0xa3, 0x7d, 0x89, 0x93, 0xb5, + 0xda, 0xd1, 0x6d, 0x5b, 0x37, 0x0d, 0xba, 0x20, 0x37, 0x77, 0xeb, 0x63, 0x7d, 0x89, 0x93, 0xb5, 0xcb, 0xf9, 0x75, 0xcd, 0x72, 0xf4, 0x96, 0xde, 0xd5, 0x0c, 0x67, 0x3d, 0xc8, 0xac, 0x86, 0xff, - 0x44, 0x2f, 0x4c, 0x38, 0xad, 0xe1, 0x6b, 0x12, 0xa1, 0x12, 0xbf, 0x9b, 0x60, 0x4a, 0x12, 0x4b, - 0x30, 0x99, 0x5a, 0x7c, 0x2c, 0x55, 0xb5, 0xe8, 0x83, 0xf7, 0x96, 0x72, 0x05, 0x9c, 0xa8, 0x54, + 0x44, 0x2f, 0x48, 0x38, 0xad, 0xe1, 0x6b, 0x12, 0xa1, 0x12, 0xbf, 0x97, 0x60, 0x4a, 0x12, 0x4b, + 0x30, 0x99, 0x5a, 0x7c, 0x34, 0x55, 0xb5, 0xe8, 0x83, 0xf7, 0x96, 0x72, 0x05, 0x9c, 0xa8, 0x54, 0x4b, 0x35, 0x55, 0x2d, 0x97, 0x1a, 0xcd, 0xf5, 0xb2, 0xba, 0x56, 0xa9, 0xd7, 0x2b, 0xb5, 0x6a, - 0xfd, 0x20, 0xad, 0x1d, 0x7d, 0x52, 0xf6, 0x35, 0x66, 0x11, 0xb7, 0x3a, 0xba, 0x81, 0xd1, 0x5d, - 0x07, 0x54, 0x18, 0x7e, 0xd5, 0x47, 0x1c, 0x67, 0x56, 0x7e, 0x04, 0xce, 0xaf, 0x49, 0x8e, 0x73, - 0x7f, 0x82, 0xff, 0x81, 0x9b, 0xff, 0x97, 0x65, 0x38, 0x16, 0x6a, 0x88, 0x2a, 0xde, 0x19, 0xd9, - 0x4a, 0xde, 0xcf, 0x87, 0xdb, 0x6e, 0x85, 0xc7, 0xb4, 0x9f, 0x35, 0xbd, 0x8f, 0x8d, 0x08, 0x58, - 0xdf, 0xec, 0xc3, 0xba, 0xca, 0xc1, 0xfa, 0xe4, 0x21, 0x68, 0x26, 0x43, 0xf6, 0xb7, 0x53, 0x45, - 0xf6, 0x0a, 0x38, 0xb1, 0x5e, 0x54, 0x1b, 0x95, 0x52, 0x65, 0xbd, 0xe8, 0x8e, 0xa3, 0xa1, 0x21, - 0x3b, 0xc2, 0x5c, 0xe7, 0x41, 0xef, 0x8b, 0xef, 0x07, 0xb3, 0x70, 0x55, 0xff, 0x8e, 0xb6, 0xb4, - 0xad, 0x19, 0x5b, 0x18, 0xe9, 0x22, 0x50, 0x2f, 0xc2, 0x44, 0x8b, 0x64, 0xa7, 0x38, 0x87, 0xb7, - 0x6e, 0x62, 0xfa, 0x72, 0x5a, 0x82, 0xea, 0xfd, 0x8a, 0xde, 0x19, 0x56, 0x88, 0x06, 0xaf, 0x10, - 0x4f, 0x8d, 0x07, 0x6f, 0x1f, 0xdf, 0x11, 0xba, 0xf1, 0x19, 0x5f, 0x37, 0xce, 0x71, 0xba, 0x51, - 0x3a, 0x18, 0xf9, 0x64, 0x6a, 0xf2, 0x47, 0x8f, 0x84, 0x0e, 0x20, 0x52, 0x9b, 0xf4, 0xe8, 0x51, - 0xa1, 0x6f, 0x77, 0xff, 0x2a, 0x19, 0xf2, 0x8b, 0xb8, 0x83, 0x45, 0x57, 0x22, 0xbf, 0x2d, 0x89, - 0x6e, 0x88, 0x50, 0x18, 0x28, 0xed, 0xe8, 0xd5, 0x11, 0x47, 0xdf, 0xc1, 0xb6, 0xa3, 0xed, 0x74, - 0x89, 0xa8, 0x65, 0x35, 0x48, 0x40, 0xbf, 0x20, 0x89, 0x6c, 0x97, 0xc4, 0x14, 0xf3, 0x1f, 0x63, - 0x4d, 0xf1, 0x73, 0x12, 0x4c, 0xd6, 0xb1, 0x53, 0xb3, 0xda, 0xd8, 0x42, 0xf5, 0x00, 0xa3, 0x6b, - 0x60, 0x9a, 0x80, 0xe2, 0x4e, 0x33, 0x7d, 0x9c, 0xc2, 0x49, 0xca, 0xf5, 0x30, 0xe7, 0xbf, 0x92, - 0xdf, 0x59, 0x37, 0xde, 0x93, 0x8a, 0xfe, 0x31, 0x23, 0xba, 0x8b, 0xcb, 0x96, 0x0c, 0x19, 0x37, - 0x11, 0xad, 0x54, 0x6c, 0x47, 0x36, 0x96, 0x54, 0xfa, 0x1b, 0x5d, 0x6f, 0x97, 0x00, 0x36, 0x0c, - 0xdb, 0x93, 0xeb, 0x63, 0x13, 0xc8, 0x15, 0xfd, 0x73, 0x26, 0xd9, 0x2c, 0x26, 0x28, 0x27, 0x42, - 0x62, 0xaf, 0x4f, 0xb0, 0xb6, 0x10, 0x49, 0x2c, 0x7d, 0x99, 0x7d, 0x6d, 0x0e, 0xf2, 0xe7, 0xb4, - 0x4e, 0x07, 0x3b, 0xe8, 0xeb, 0x12, 0xe4, 0x4b, 0x16, 0xd6, 0x1c, 0x1c, 0x16, 0x1d, 0x82, 0x49, - 0xcb, 0x34, 0x9d, 0x75, 0xcd, 0xd9, 0x66, 0x72, 0xf3, 0xdf, 0x99, 0xc3, 0xc0, 0x6f, 0x85, 0xbb, - 0x8f, 0xbb, 0x78, 0xd1, 0xfd, 0x38, 0x57, 0x5b, 0x5a, 0xd0, 0x3c, 0x2d, 0x24, 0xa2, 0xff, 0x40, - 0x30, 0xb9, 0x63, 0xe0, 0x1d, 0xd3, 0xd0, 0x5b, 0x9e, 0xcd, 0xe9, 0xbd, 0xa3, 0x0f, 0xfb, 0x32, - 0x5d, 0xe0, 0x64, 0x3a, 0x2f, 0x5c, 0x4a, 0x32, 0x81, 0xd6, 0x87, 0xe8, 0x3d, 0xae, 0x86, 0x2b, - 0x69, 0x67, 0xd0, 0x6c, 0xd4, 0x9a, 0x25, 0xb5, 0x5c, 0x6c, 0x94, 0x9b, 0xab, 0xb5, 0x52, 0x71, - 0xb5, 0xa9, 0x96, 0xd7, 0x6b, 0x05, 0x8c, 0xfe, 0x4e, 0x72, 0x85, 0xdb, 0x32, 0xf7, 0xb0, 0x85, - 0x96, 0x85, 0xe4, 0x1c, 0x27, 0x13, 0x86, 0xc1, 0xaf, 0x08, 0x3b, 0x6d, 0x30, 0xe9, 0x30, 0x0e, - 0x22, 0x94, 0xf7, 0x23, 0x42, 0xcd, 0x3d, 0x96, 0xd4, 0x23, 0x40, 0xd2, 0xff, 0x5b, 0x82, 0x89, - 0x92, 0x69, 0xec, 0x61, 0xcb, 0x09, 0xcf, 0x77, 0xc2, 0xd2, 0xcc, 0xf0, 0xd2, 0x74, 0x07, 0x49, - 0x6c, 0x38, 0x96, 0xd9, 0xf5, 0x26, 0x3c, 0xde, 0x2b, 0x7a, 0x63, 0x52, 0x09, 0xb3, 0x92, 0xa3, - 0x17, 0x3e, 0xfb, 0x17, 0xc4, 0xb1, 0x27, 0xf7, 0x34, 0x80, 0xd7, 0x26, 0xc1, 0xa5, 0x3f, 0x03, - 0xe9, 0x77, 0x29, 0x5f, 0x91, 0x61, 0x96, 0x36, 0xbe, 0x3a, 0x26, 0x16, 0x1a, 0xaa, 0x85, 0x97, - 0x1c, 0x7b, 0x84, 0xbf, 0x72, 0x84, 0x13, 0x7f, 0x5e, 0xeb, 0x76, 0xfd, 0xe5, 0xe7, 0x95, 0x23, - 0x2a, 0x7b, 0xa7, 0x6a, 0xbe, 0x90, 0x87, 0xac, 0xb6, 0xeb, 0x6c, 0xa3, 0x1f, 0x08, 0x4f, 0x3e, - 0xb9, 0xce, 0x80, 0xf1, 0x13, 0x01, 0xc9, 0x71, 0xc8, 0x39, 0xe6, 0x05, 0xec, 0xc9, 0x81, 0xbe, - 0xb8, 0x70, 0x68, 0xdd, 0x6e, 0x83, 0x7c, 0x60, 0x70, 0x78, 0xef, 0xae, 0xad, 0xa3, 0xb5, 0x5a, - 0xe6, 0xae, 0xe1, 0x54, 0xbc, 0x25, 0xe8, 0x20, 0x01, 0x7d, 0x31, 0x23, 0x32, 0x99, 0x15, 0x60, - 0x30, 0x19, 0x64, 0xe7, 0x87, 0x68, 0x4a, 0xf3, 0x70, 0x63, 0x71, 0x7d, 0xbd, 0xd9, 0xa8, 0xdd, - 0x5b, 0xae, 0x06, 0x86, 0x67, 0xb3, 0x52, 0x6d, 0x36, 0x56, 0xca, 0xcd, 0xd2, 0x86, 0x4a, 0xd6, - 0x09, 0x8b, 0xa5, 0x52, 0x6d, 0xa3, 0xda, 0x28, 0x60, 0xf4, 0x16, 0x09, 0x66, 0x4a, 0x1d, 0xd3, - 0xf6, 0x11, 0xbe, 0x3a, 0x40, 0xd8, 0x17, 0x63, 0x26, 0x24, 0x46, 0xf4, 0x6f, 0x19, 0x51, 0xa7, - 0x03, 0x4f, 0x20, 0x21, 0xf2, 0x11, 0xbd, 0xd4, 0x1b, 0x85, 0x9c, 0x0e, 0x06, 0xd3, 0x4b, 0xbf, - 0x49, 0xfc, 0xea, 0x53, 0x60, 0xa2, 0x48, 0x15, 0x03, 0xfd, 0x75, 0x06, 0xf2, 0x25, 0xd3, 0xd8, - 0xd4, 0xb7, 0x5c, 0x63, 0x0e, 0x1b, 0xda, 0xf9, 0x0e, 0x5e, 0xd4, 0x1c, 0x6d, 0x4f, 0xc7, 0x17, - 0x49, 0x05, 0x26, 0xd5, 0x9e, 0x54, 0x97, 0x29, 0x96, 0x82, 0xcf, 0xef, 0x6e, 0x11, 0xa6, 0x26, - 0xd5, 0x70, 0x92, 0xf2, 0x64, 0xb8, 0x9c, 0xbe, 0xae, 0x5b, 0xd8, 0xc2, 0x1d, 0xac, 0xd9, 0xd8, - 0x9d, 0x16, 0x19, 0xb8, 0x43, 0x94, 0x76, 0x52, 0x8d, 0xfa, 0xac, 0x9c, 0x81, 0x19, 0xfa, 0x89, - 0x98, 0x22, 0x36, 0x51, 0xe3, 0x49, 0x95, 0x4b, 0x53, 0x1e, 0x07, 0x39, 0xfc, 0x80, 0x63, 0x69, - 0xa7, 0xda, 0x04, 0xaf, 0xcb, 0xe7, 0xa9, 0xd7, 0xe1, 0xbc, 0xe7, 0x75, 0x38, 0x5f, 0x27, 0x3e, - 0x89, 0x2a, 0xcd, 0x85, 0x5e, 0x3e, 0xe9, 0x1b, 0x12, 0xff, 0x2e, 0x05, 0x8a, 0xa1, 0x40, 0xd6, - 0xd0, 0x76, 0x30, 0xd3, 0x0b, 0xf2, 0xac, 0xdc, 0x08, 0x47, 0xb5, 0x3d, 0xcd, 0xd1, 0xac, 0x55, - 0xb3, 0xa5, 0x75, 0xc8, 0xe0, 0xe7, 0xb5, 0xfc, 0xde, 0x0f, 0x64, 0x47, 0xc8, 0x31, 0x2d, 0x4c, - 0x72, 0x79, 0x3b, 0x42, 0x5e, 0x82, 0x4b, 0x5d, 0x6f, 0x99, 0x06, 0xe1, 0x5f, 0x56, 0xc9, 0xb3, - 0x2b, 0x95, 0xb6, 0x6e, 0xbb, 0x15, 0x21, 0x54, 0xaa, 0x74, 0x6b, 0xa3, 0x7e, 0xc9, 0x68, 0x91, - 0xdd, 0xa0, 0x49, 0x35, 0xea, 0xb3, 0xb2, 0x00, 0xd3, 0x6c, 0x23, 0x64, 0xcd, 0xd5, 0xab, 0x3c, - 0xd1, 0xab, 0x6b, 0x78, 0x9f, 0x2e, 0x8a, 0xe7, 0x7c, 0x35, 0xc8, 0xa7, 0x86, 0x7f, 0x52, 0xee, - 0x86, 0x2b, 0xd9, 0x6b, 0x69, 0xd7, 0x76, 0xcc, 0x1d, 0x0a, 0xfa, 0x92, 0xde, 0xa1, 0x35, 0x98, - 0x20, 0x35, 0x88, 0xcb, 0xa2, 0xdc, 0x0a, 0xc7, 0xbb, 0x16, 0xde, 0xc4, 0xd6, 0x7d, 0xda, 0xce, - 0xee, 0x03, 0x0d, 0x4b, 0x33, 0xec, 0xae, 0x69, 0x39, 0xa7, 0x26, 0x09, 0xf3, 0x7d, 0xbf, 0xb1, - 0x8e, 0x72, 0x12, 0xf2, 0x54, 0x7c, 0xe8, 0x05, 0x39, 0x61, 0x77, 0x4e, 0x56, 0xa1, 0x58, 0xf3, - 0xec, 0x16, 0x98, 0x60, 0x3d, 0x1c, 0x01, 0x6a, 0xfa, 0xd6, 0x93, 0x3d, 0xeb, 0x0a, 0x8c, 0x8a, - 0xea, 0x65, 0x53, 0x9e, 0x00, 0xf9, 0x16, 0xa9, 0x16, 0xc1, 0x6c, 0xfa, 0xd6, 0x2b, 0xfb, 0x17, - 0x4a, 0xb2, 0xa8, 0x2c, 0x2b, 0xfa, 0x0b, 0x59, 0xc8, 0x03, 0x34, 0x8e, 0xe3, 0x64, 0xad, 0xfa, - 0x9b, 0xd2, 0x10, 0xdd, 0xe6, 0x4d, 0x70, 0x03, 0xeb, 0x13, 0x99, 0xfd, 0xb1, 0xd8, 0x5c, 0xd8, - 0xf0, 0x26, 0x83, 0xae, 0x55, 0x52, 0x6f, 0x14, 0x55, 0x77, 0x26, 0xbf, 0xe8, 0x4e, 0x22, 0x6f, - 0x84, 0xeb, 0x07, 0xe4, 0x2e, 0x37, 0x9a, 0xd5, 0xe2, 0x5a, 0xb9, 0xb0, 0xc9, 0xdb, 0x36, 0xf5, - 0x46, 0x6d, 0xbd, 0xa9, 0x6e, 0x54, 0xab, 0x95, 0xea, 0x32, 0x25, 0xe6, 0x9a, 0x84, 0x27, 0x83, - 0x0c, 0xe7, 0xd4, 0x4a, 0xa3, 0xdc, 0x2c, 0xd5, 0xaa, 0x4b, 0x95, 0xe5, 0x82, 0x3e, 0xc8, 0x30, - 0xba, 0x5f, 0xb9, 0x06, 0xae, 0xe2, 0x38, 0xa9, 0xd4, 0xaa, 0xee, 0xcc, 0xb6, 0x54, 0xac, 0x96, - 0xca, 0xee, 0x34, 0xf6, 0x82, 0x82, 0xe0, 0x04, 0x25, 0xd7, 0x5c, 0xaa, 0xac, 0x86, 0x37, 0xa3, - 0x3e, 0x91, 0x51, 0x4e, 0xc1, 0x65, 0xe1, 0x6f, 0x95, 0xea, 0xd9, 0xe2, 0x6a, 0x65, 0xb1, 0xf0, - 0x87, 0x19, 0xe5, 0x3a, 0xb8, 0x9a, 0xfb, 0x8b, 0xee, 0x2b, 0x35, 0x2b, 0x8b, 0xcd, 0xb5, 0x4a, - 0x7d, 0xad, 0xd8, 0x28, 0xad, 0x14, 0x3e, 0x49, 0xe6, 0x0b, 0xbe, 0x01, 0x1c, 0x72, 0xcb, 0x7c, - 0x71, 0x78, 0x4c, 0x2f, 0xf2, 0x8a, 0xfa, 0xd8, 0xbe, 0xb0, 0xc7, 0xdb, 0xb0, 0x1f, 0xf3, 0x47, - 0x87, 0x45, 0x4e, 0x85, 0x6e, 0x49, 0x40, 0x2b, 0x99, 0x0e, 0x35, 0x86, 0x50, 0xa1, 0x6b, 0xe0, - 0xaa, 0x6a, 0x99, 0x22, 0xa5, 0x96, 0x4b, 0xb5, 0xb3, 0x65, 0xb5, 0x79, 0xae, 0xb8, 0xba, 0x5a, - 0x6e, 0x34, 0x97, 0x2a, 0x6a, 0xbd, 0x51, 0xd8, 0x44, 0xff, 0x2c, 0xf9, 0xab, 0x39, 0x21, 0x69, - 0xfd, 0xb5, 0x94, 0xb4, 0x59, 0xc7, 0xae, 0xda, 0xfc, 0x04, 0xe4, 0x6d, 0x47, 0x73, 0x76, 0x6d, - 0xd6, 0xaa, 0x1f, 0xd5, 0xbf, 0x55, 0xcf, 0xd7, 0x49, 0x26, 0x95, 0x65, 0x46, 0x7f, 0x91, 0x49, - 0xd2, 0x4c, 0x47, 0xb0, 0xa0, 0xa3, 0x0f, 0x21, 0xe2, 0xd3, 0x80, 0x3c, 0x6d, 0xaf, 0xd4, 0x9b, - 0xc5, 0x55, 0xb5, 0x5c, 0x5c, 0xbc, 0xcf, 0x5f, 0xc6, 0xc1, 0xca, 0x09, 0x38, 0xb6, 0x51, 0x2d, - 0x2e, 0xac, 0x96, 0x49, 0x73, 0xa9, 0x55, 0xab, 0xe5, 0x92, 0x2b, 0xf7, 0x5f, 0x20, 0x9b, 0x26, - 0xae, 0x05, 0x4d, 0xf8, 0x76, 0xad, 0x9c, 0x90, 0xfc, 0xbf, 0x21, 0xec, 0x5b, 0x14, 0x68, 0x58, - 0x98, 0xd6, 0x68, 0x71, 0xf8, 0xa2, 0x90, 0x3b, 0x91, 0x10, 0x27, 0xc9, 0xf0, 0xf8, 0xcf, 0x43, - 0xe0, 0x71, 0x02, 0x8e, 0x85, 0xf1, 0x20, 0x6e, 0x45, 0xd1, 0x30, 0x7c, 0x75, 0x12, 0xf2, 0x75, - 0xdc, 0xc1, 0x2d, 0x07, 0xbd, 0x2d, 0x64, 0x4c, 0xcc, 0x81, 0xe4, 0xbb, 0xb1, 0x48, 0x7a, 0x9b, - 0x9b, 0x3e, 0x4b, 0x3d, 0xd3, 0xe7, 0x18, 0x33, 0x40, 0x4e, 0x64, 0x06, 0x64, 0x53, 0x30, 0x03, - 0x72, 0xc3, 0x9b, 0x01, 0xf9, 0x41, 0x66, 0x00, 0x7a, 0x7d, 0x3e, 0x69, 0x2f, 0x41, 0x45, 0x7d, - 0xb8, 0x83, 0xff, 0xff, 0xca, 0x26, 0xe9, 0x55, 0xfa, 0x72, 0x9c, 0x4c, 0x8b, 0x7f, 0x20, 0xa7, - 0xb0, 0xfc, 0xa0, 0x5c, 0x0b, 0x57, 0x07, 0xef, 0xcd, 0xf2, 0xd3, 0x2b, 0xf5, 0x46, 0x9d, 0x8c, - 0xf8, 0xa5, 0x9a, 0xaa, 0x6e, 0xac, 0xd3, 0x35, 0xe4, 0x93, 0xa0, 0x04, 0x54, 0xd4, 0x8d, 0x2a, - 0x1d, 0xdf, 0xb7, 0x78, 0xea, 0x4b, 0x95, 0xea, 0x62, 0xd3, 0x6f, 0x33, 0xd5, 0xa5, 0x5a, 0x61, - 0xdb, 0x9d, 0xb2, 0x85, 0xa8, 0xbb, 0x03, 0x34, 0x2b, 0xa1, 0x58, 0x5d, 0x6c, 0xae, 0x55, 0xcb, - 0x6b, 0xb5, 0x6a, 0xa5, 0x44, 0xd2, 0xeb, 0xe5, 0x46, 0x41, 0x77, 0x07, 0x9a, 0x1e, 0x8b, 0xa2, - 0x5e, 0x2e, 0xaa, 0xa5, 0x95, 0xb2, 0x4a, 0x8b, 0xbc, 0x5f, 0xb9, 0x1e, 0xce, 0x14, 0xab, 0xb5, - 0x86, 0x9b, 0x52, 0xac, 0xde, 0xd7, 0xb8, 0x6f, 0xbd, 0xdc, 0x5c, 0x57, 0x6b, 0xa5, 0x72, 0xbd, - 0xee, 0xb6, 0x53, 0x66, 0x7f, 0x14, 0x3a, 0xca, 0x53, 0xe1, 0xf6, 0x10, 0x6b, 0xe5, 0x06, 0xd9, - 0xb0, 0x5c, 0xab, 0x11, 0x9f, 0x95, 0xc5, 0x72, 0x73, 0xa5, 0x58, 0x6f, 0x56, 0xaa, 0xa5, 0xda, - 0xda, 0x7a, 0xb1, 0x51, 0x71, 0x9b, 0xf3, 0xba, 0x5a, 0x6b, 0xd4, 0x9a, 0x67, 0xcb, 0x6a, 0xbd, - 0x52, 0xab, 0x16, 0x0c, 0xb7, 0xca, 0xa1, 0xf6, 0xef, 0xf5, 0xc3, 0xa6, 0x72, 0x15, 0x9c, 0xf2, - 0xd2, 0x57, 0x6b, 0xae, 0xa0, 0x43, 0x16, 0x49, 0x37, 0x55, 0x8b, 0xe4, 0x5f, 0x25, 0xc8, 0xd6, - 0x1d, 0xb3, 0x8b, 0x7e, 0x3c, 0xe8, 0x60, 0x4e, 0x03, 0x58, 0x64, 0xff, 0xd1, 0x9d, 0x85, 0xb1, - 0x79, 0x59, 0x28, 0x05, 0xfd, 0x81, 0xf0, 0xa6, 0x49, 0xd0, 0x67, 0x9b, 0xdd, 0x08, 0x5b, 0xe5, - 0x7b, 0x62, 0xa7, 0x48, 0xa2, 0x09, 0x25, 0xd3, 0xf7, 0x5f, 0x1c, 0x66, 0x5b, 0x04, 0xc1, 0xc9, - 0x10, 0x6c, 0xae, 0xfc, 0x3d, 0x95, 0xc0, 0xca, 0xe5, 0x70, 0x59, 0x8f, 0x72, 0x11, 0x9d, 0xda, - 0x54, 0x7e, 0x0c, 0x1e, 0x15, 0x52, 0xef, 0xf2, 0x5a, 0xed, 0x6c, 0xd9, 0x57, 0xe4, 0xc5, 0x62, - 0xa3, 0x58, 0xd8, 0x42, 0x9f, 0x93, 0x21, 0xbb, 0x66, 0xee, 0xf5, 0xee, 0x55, 0x19, 0xf8, 0x62, - 0x68, 0x2d, 0xd4, 0x7b, 0xe5, 0xbd, 0xe6, 0x85, 0xc4, 0xbe, 0x16, 0xbd, 0x2f, 0xfd, 0x45, 0x29, - 0x89, 0xd8, 0xd7, 0x0e, 0xba, 0x19, 0xfd, 0xf7, 0xc3, 0x88, 0x3d, 0x42, 0xb4, 0x58, 0x39, 0x03, - 0xa7, 0x83, 0x0f, 0x95, 0xc5, 0x72, 0xb5, 0x51, 0x59, 0xba, 0x2f, 0x10, 0x6e, 0x45, 0x15, 0x12, - 0xff, 0xa0, 0x6e, 0x2c, 0x7e, 0xa6, 0x71, 0x0a, 0x8e, 0x07, 0xdf, 0x96, 0xcb, 0x0d, 0xef, 0xcb, - 0xfd, 0xe8, 0xc1, 0x1c, 0xcc, 0xd0, 0x6e, 0x7d, 0xa3, 0xdb, 0xd6, 0x1c, 0x8c, 0x9e, 0x10, 0xa0, - 0x7b, 0x03, 0x1c, 0xad, 0xac, 0x2f, 0xd5, 0xeb, 0x8e, 0x69, 0x69, 0x5b, 0xb8, 0xd8, 0x6e, 0x5b, - 0x4c, 0x5a, 0xbd, 0xc9, 0xe8, 0xdd, 0xc2, 0xeb, 0x7c, 0xfc, 0x50, 0x42, 0xcb, 0x8c, 0x40, 0xfd, - 0x2b, 0x42, 0xeb, 0x72, 0x02, 0x04, 0x93, 0xa1, 0x7f, 0xff, 0x88, 0xdb, 0x5c, 0x34, 0x2e, 0x9b, - 0x67, 0x9e, 0x23, 0xc1, 0x54, 0x43, 0xdf, 0xc1, 0xcf, 0x30, 0x0d, 0x6c, 0x2b, 0x13, 0x20, 0x2f, - 0xaf, 0x35, 0x0a, 0x47, 0xdc, 0x07, 0xd7, 0xa8, 0xca, 0x90, 0x87, 0xb2, 0x5b, 0x80, 0xfb, 0x50, - 0x6c, 0x14, 0x64, 0xf7, 0x61, 0xad, 0xdc, 0x28, 0x64, 0xdd, 0x87, 0x6a, 0xb9, 0x51, 0xc8, 0xb9, - 0x0f, 0xeb, 0xab, 0x8d, 0x42, 0xde, 0x7d, 0xa8, 0xd4, 0x1b, 0x85, 0x09, 0xf7, 0x61, 0xa1, 0xde, - 0x28, 0x4c, 0xba, 0x0f, 0x67, 0xeb, 0x8d, 0xc2, 0x94, 0xfb, 0x50, 0x6a, 0x34, 0x0a, 0xe0, 0x3e, - 0xdc, 0x53, 0x6f, 0x14, 0xa6, 0xdd, 0x87, 0x62, 0xa9, 0x51, 0x98, 0x21, 0x0f, 0xe5, 0x46, 0x61, - 0xd6, 0x7d, 0xa8, 0xd7, 0x1b, 0x85, 0x39, 0x42, 0xb9, 0xde, 0x28, 0x1c, 0x25, 0x65, 0x55, 0x1a, - 0x85, 0x82, 0xfb, 0xb0, 0x52, 0x6f, 0x14, 0x8e, 0x91, 0xcc, 0xf5, 0x46, 0x41, 0x21, 0x85, 0xd6, - 0x1b, 0x85, 0xcb, 0x48, 0x9e, 0x7a, 0xa3, 0x70, 0x9c, 0x14, 0x51, 0x6f, 0x14, 0x4e, 0x10, 0x36, - 0xca, 0x8d, 0xc2, 0x49, 0x92, 0x47, 0x6d, 0x14, 0x2e, 0x27, 0x9f, 0xaa, 0x8d, 0xc2, 0x29, 0xc2, - 0x58, 0xb9, 0x51, 0xb8, 0x82, 0x3c, 0xa8, 0x8d, 0x02, 0x22, 0x9f, 0x8a, 0x8d, 0xc2, 0x95, 0xe8, - 0x51, 0x30, 0xb5, 0x8c, 0x1d, 0x0a, 0x22, 0x2a, 0x80, 0xbc, 0x8c, 0x9d, 0xb0, 0x19, 0xff, 0x35, - 0x19, 0x2e, 0x67, 0x53, 0xbf, 0x25, 0xcb, 0xdc, 0x59, 0xc5, 0x5b, 0x5a, 0xeb, 0x52, 0xf9, 0x01, - 0xd7, 0x84, 0x0a, 0xef, 0xcb, 0x2a, 0x90, 0xed, 0x06, 0x9d, 0x11, 0x79, 0x8e, 0xb5, 0x38, 0xbd, - 0xc5, 0x28, 0x39, 0x58, 0x8c, 0x62, 0x16, 0xd9, 0x3f, 0x85, 0x35, 0x9a, 0x5b, 0x3f, 0xce, 0xf4, - 0xac, 0x1f, 0xbb, 0xcd, 0xa4, 0x8b, 0x2d, 0xdb, 0x34, 0xb4, 0x4e, 0x9d, 0x6d, 0xdc, 0xd3, 0x55, - 0xaf, 0xde, 0x64, 0xe5, 0x69, 0x5e, 0xcb, 0xa0, 0x56, 0xd9, 0x53, 0xe2, 0x66, 0xb8, 0xbd, 0xd5, - 0x8c, 0x68, 0x24, 0x9f, 0xf4, 0x1b, 0x49, 0x83, 0x6b, 0x24, 0x77, 0x1f, 0x80, 0x76, 0xb2, 0xf6, - 0x52, 0x19, 0x6e, 0x6a, 0x11, 0xb8, 0xb5, 0x7a, 0xcb, 0xd5, 0x32, 0xfa, 0x9c, 0x04, 0x27, 0xcb, - 0x46, 0x3f, 0x0b, 0x3f, 0xac, 0x0b, 0x6f, 0x09, 0x43, 0xb3, 0xce, 0x8b, 0xf4, 0xf6, 0xbe, 0xd5, - 0xee, 0x4f, 0x33, 0x42, 0xa2, 0x9f, 0xf6, 0x25, 0x5a, 0xe7, 0x24, 0x7a, 0xd7, 0xf0, 0xa4, 0x93, - 0x09, 0xb4, 0x3a, 0xd2, 0x0e, 0x28, 0x8b, 0xbe, 0x99, 0x85, 0x47, 0x51, 0xdf, 0x1b, 0xc6, 0x21, - 0x6d, 0x65, 0x45, 0xa3, 0xad, 0x62, 0xdb, 0xd1, 0x2c, 0x87, 0x3b, 0x0f, 0xdd, 0x33, 0x95, 0xca, - 0xa4, 0x30, 0x95, 0x92, 0x06, 0x4e, 0xa5, 0xd0, 0xbb, 0xc2, 0xe6, 0xc3, 0x39, 0x1e, 0xe3, 0x62, - 0xff, 0xfe, 0x3f, 0xae, 0x86, 0x51, 0x50, 0xfb, 0x76, 0xc5, 0x4f, 0x71, 0x50, 0x2f, 0x1d, 0xb8, - 0x84, 0x64, 0x88, 0xff, 0xc1, 0x68, 0xed, 0xbc, 0x6c, 0xf8, 0x1b, 0x6f, 0x94, 0x14, 0xda, 0xa9, - 0x1a, 0xe8, 0x2f, 0x9c, 0x84, 0x29, 0xd2, 0x16, 0x56, 0x75, 0xe3, 0x82, 0xdb, 0x69, 0xcf, 0x54, - 0xf1, 0xc5, 0xd2, 0xb6, 0xd6, 0xe9, 0x60, 0x63, 0x0b, 0xa3, 0xfb, 0x39, 0xcb, 0x51, 0xeb, 0x76, - 0xab, 0xc1, 0x3e, 0x83, 0xf7, 0xaa, 0xdc, 0x05, 0x39, 0xbb, 0x65, 0x76, 0x31, 0x11, 0xd4, 0x5c, - 0xc8, 0x33, 0x81, 0x5f, 0x59, 0x29, 0xee, 0x3a, 0xdb, 0xf3, 0xa4, 0xac, 0x62, 0x57, 0xaf, 0xbb, - 0x3f, 0xa8, 0xf4, 0x3f, 0xd6, 0x81, 0x7f, 0xa3, 0x6f, 0x2f, 0x91, 0x89, 0xe9, 0x25, 0x7c, 0xc6, - 0xe7, 0xc3, 0x4c, 0x47, 0x4c, 0xb1, 0xaf, 0x81, 0xe9, 0x96, 0x97, 0xc5, 0x3f, 0x78, 0x11, 0x4e, - 0x42, 0x7f, 0x9b, 0xa8, 0x1f, 0x11, 0x2a, 0x3c, 0x99, 0x56, 0xe1, 0x11, 0x1b, 0x32, 0x27, 0xe0, - 0x58, 0xa3, 0x56, 0x6b, 0xae, 0x15, 0xab, 0xf7, 0x05, 0x07, 0x9e, 0x37, 0xd1, 0x2b, 0xb2, 0x30, - 0x57, 0x37, 0x3b, 0x7b, 0x38, 0xc0, 0xb9, 0xc2, 0x79, 0xf4, 0x84, 0xe5, 0x94, 0xd9, 0x27, 0x27, - 0xe5, 0x24, 0xe4, 0x35, 0xc3, 0xbe, 0x88, 0x3d, 0xe3, 0x92, 0xbd, 0x31, 0x18, 0x3f, 0x18, 0xee, - 0x08, 0x54, 0x1e, 0xc6, 0x3b, 0x06, 0x48, 0x92, 0xe7, 0x2a, 0x02, 0xc8, 0x33, 0x30, 0x63, 0xd3, - 0xdd, 0xc6, 0x46, 0x68, 0x53, 0x99, 0x4b, 0x23, 0x2c, 0xd2, 0xed, 0x6e, 0x99, 0xb1, 0x48, 0xde, - 0xd0, 0x6b, 0xfd, 0xfe, 0x63, 0x83, 0x83, 0xb8, 0x78, 0x10, 0xc6, 0x92, 0x81, 0xfc, 0xaa, 0x51, - 0x4f, 0x11, 0x4f, 0xc1, 0x71, 0xd6, 0xec, 0x9b, 0xa5, 0x95, 0xe2, 0xea, 0x6a, 0xb9, 0xba, 0x5c, - 0x6e, 0x56, 0x16, 0xe9, 0x5e, 0x47, 0x90, 0x52, 0x6c, 0x34, 0xca, 0x6b, 0xeb, 0x8d, 0x7a, 0xb3, - 0xfc, 0xf4, 0x52, 0xb9, 0xbc, 0x48, 0x7c, 0xea, 0xc8, 0xa1, 0x18, 0xcf, 0xfb, 0xb1, 0x58, 0xad, - 0x9f, 0x2b, 0xab, 0x85, 0xed, 0x33, 0x45, 0x98, 0x0e, 0x0d, 0x14, 0x2e, 0x77, 0x8b, 0x78, 0x53, - 0xdb, 0xed, 0x30, 0x63, 0xaf, 0x70, 0xc4, 0xe5, 0x8e, 0xc8, 0xa6, 0x66, 0x74, 0x2e, 0x15, 0x32, - 0x4a, 0x01, 0x66, 0xc2, 0x63, 0x42, 0x41, 0x42, 0x6f, 0xbf, 0x0a, 0xa6, 0xce, 0x99, 0xd6, 0x05, - 0xe2, 0x08, 0x86, 0xde, 0x47, 0x03, 0xa3, 0x78, 0x47, 0x4c, 0x43, 0x96, 0xc1, 0xab, 0xc4, 0xdd, - 0x0d, 0x3c, 0x6a, 0xf3, 0x03, 0x8f, 0x91, 0x5e, 0x03, 0xd3, 0x17, 0xbd, 0xdc, 0x41, 0x4b, 0x0f, - 0x25, 0xa1, 0xff, 0x2e, 0xe6, 0x40, 0x30, 0xb8, 0xc8, 0xf4, 0x37, 0xb8, 0xdf, 0x26, 0x41, 0x7e, - 0x19, 0x3b, 0xc5, 0x4e, 0x27, 0x2c, 0xb7, 0x97, 0x08, 0x1f, 0x0d, 0xe2, 0x2a, 0x51, 0xec, 0x74, - 0xa2, 0x1b, 0x55, 0x48, 0x40, 0x9e, 0x0b, 0x3b, 0x97, 0x26, 0xe8, 0x78, 0x37, 0xa0, 0xc0, 0xf4, - 0x25, 0xf6, 0x61, 0xd9, 0xdf, 0x24, 0x7f, 0x38, 0x64, 0x26, 0x3d, 0x3e, 0x08, 0x8a, 0x93, 0x89, - 0xdf, 0x6c, 0xf7, 0xf2, 0x29, 0xf7, 0xc2, 0xc4, 0xae, 0x8d, 0x4b, 0x9a, 0xed, 0x0d, 0x6d, 0x7c, - 0x4d, 0x6b, 0xe7, 0xef, 0xc7, 0x2d, 0x67, 0xbe, 0xb2, 0xe3, 0x5a, 0xe4, 0x1b, 0x34, 0xa3, 0x1f, - 0x67, 0x86, 0xbd, 0xab, 0x1e, 0x05, 0x77, 0x56, 0x73, 0x51, 0x77, 0xb6, 0x4b, 0xdb, 0x9a, 0xc3, - 0x16, 0xc7, 0xfd, 0x77, 0xf4, 0x82, 0x21, 0xe0, 0x8c, 0xdd, 0x4c, 0x8e, 0x3c, 0x61, 0x98, 0x18, - 0xc4, 0x11, 0xec, 0x00, 0x0f, 0x03, 0xe2, 0x3f, 0x48, 0x90, 0xad, 0x75, 0xb1, 0x21, 0x7c, 0x9c, - 0xc6, 0x97, 0xad, 0xd4, 0x23, 0xdb, 0xd7, 0x8a, 0xbb, 0x97, 0xf9, 0x95, 0x76, 0x4b, 0x8e, 0x90, - 0xec, 0xcd, 0x90, 0xd5, 0x8d, 0x4d, 0x93, 0x59, 0xb6, 0x57, 0x46, 0xd8, 0x3a, 0x15, 0x63, 0xd3, - 0x54, 0x49, 0x46, 0x51, 0xcf, 0xb2, 0xb8, 0xb2, 0xd3, 0x17, 0xf7, 0xb7, 0x26, 0x21, 0x4f, 0xd5, - 0x19, 0xbd, 0x58, 0x06, 0xb9, 0xd8, 0x6e, 0x47, 0x08, 0x5e, 0xda, 0x27, 0x78, 0x93, 0xfc, 0xe6, - 0x63, 0xe2, 0xbf, 0xf3, 0xd1, 0x50, 0x04, 0xfb, 0x76, 0xd6, 0xa4, 0x8a, 0xed, 0x76, 0xb4, 0x13, - 0xab, 0x5f, 0xa0, 0xc4, 0x17, 0x18, 0x6e, 0xe1, 0xb2, 0x58, 0x0b, 0x4f, 0x3c, 0x10, 0x44, 0xf2, - 0x97, 0x3e, 0x44, 0xff, 0x24, 0xc1, 0xc4, 0xaa, 0x6e, 0x3b, 0x2e, 0x36, 0x45, 0x11, 0x6c, 0xae, - 0x82, 0x29, 0x4f, 0x34, 0x6e, 0x97, 0xe7, 0xf6, 0xe7, 0x41, 0x02, 0x7a, 0x5d, 0x18, 0x9d, 0x7b, - 0x78, 0x74, 0x9e, 0x18, 0x5f, 0x7b, 0xc6, 0x45, 0xf4, 0x31, 0x85, 0xa0, 0x58, 0xa9, 0xb7, 0xd8, - 0xdf, 0xf2, 0x05, 0xbe, 0xc6, 0x09, 0xfc, 0xb6, 0x61, 0x8a, 0x4c, 0x5f, 0xe8, 0x9f, 0x97, 0x00, - 0xdc, 0xb2, 0xd9, 0x59, 0xb0, 0xc7, 0x70, 0x27, 0xbc, 0x63, 0xa4, 0xfb, 0x8a, 0xb0, 0x74, 0xd7, - 0x78, 0xe9, 0xfe, 0xe4, 0xe0, 0xaa, 0xc6, 0x9d, 0xf9, 0x52, 0x0a, 0x20, 0xeb, 0xbe, 0x68, 0xdd, - 0x47, 0xf4, 0x36, 0x5f, 0xa8, 0xeb, 0x9c, 0x50, 0xef, 0x18, 0xb2, 0xa4, 0xf4, 0xe5, 0xfa, 0x97, - 0x12, 0x4c, 0xd4, 0xb1, 0xe3, 0x76, 0x93, 0xe8, 0xac, 0x48, 0x0f, 0x1f, 0x6a, 0xdb, 0x92, 0x60, - 0xdb, 0xfe, 0x6e, 0x46, 0x34, 0x52, 0x4c, 0x20, 0x19, 0xc6, 0x53, 0xc4, 0xea, 0xc3, 0xc3, 0x42, - 0x91, 0x62, 0x06, 0x51, 0x4b, 0x5f, 0xba, 0x6f, 0x91, 0xfc, 0x9d, 0x7d, 0xfe, 0xa8, 0x46, 0xd8, - 0x2c, 0xce, 0xec, 0x37, 0x8b, 0xc5, 0x8f, 0x6a, 0x84, 0xeb, 0x18, 0xbd, 0xad, 0x9d, 0xd8, 0xd8, - 0x18, 0xc1, 0x8e, 0xf3, 0x30, 0xf2, 0x7a, 0x96, 0x0c, 0x79, 0xb6, 0x34, 0x7d, 0x57, 0xfc, 0xd2, - 0xf4, 0xe0, 0xa9, 0xc5, 0x7b, 0x87, 0x30, 0xe5, 0xe2, 0xd6, 0x8b, 0x7d, 0x36, 0xa4, 0x10, 0x1b, - 0x37, 0x41, 0x8e, 0x84, 0xb2, 0x64, 0xe3, 0x5c, 0xe0, 0x2c, 0xe0, 0x91, 0x28, 0xbb, 0x5f, 0x55, - 0x9a, 0x29, 0x31, 0x0a, 0x23, 0x58, 0x62, 0x1e, 0x06, 0x85, 0x5f, 0x57, 0x00, 0xd6, 0x77, 0xcf, - 0x77, 0x74, 0x7b, 0x5b, 0x37, 0xb6, 0xd0, 0x57, 0x33, 0x30, 0xc3, 0x5e, 0x69, 0x44, 0xc6, 0x58, - 0xf3, 0x2f, 0xd2, 0x28, 0x28, 0x80, 0xbc, 0x6b, 0xe9, 0x6c, 0x19, 0xc0, 0x7d, 0x54, 0xee, 0xf4, - 0x3d, 0x81, 0xb2, 0x3d, 0x67, 0xf1, 0x5d, 0x31, 0x04, 0x1c, 0xcc, 0x87, 0x4a, 0x0f, 0x3c, 0x82, - 0xc2, 0x61, 0x37, 0x73, 0x7c, 0xd8, 0x4d, 0xee, 0x80, 0x5e, 0xbe, 0xe7, 0x80, 0x9e, 0x8b, 0xa3, - 0xad, 0x3f, 0x03, 0x13, 0xef, 0x54, 0x59, 0x25, 0xcf, 0xe8, 0x43, 0xc1, 0x54, 0xc5, 0x14, 0xb4, - 0x73, 0x13, 0x54, 0xf4, 0x2a, 0x98, 0xba, 0xdf, 0xd4, 0x0d, 0xb2, 0x97, 0xc1, 0xbc, 0x8f, 0x83, - 0x04, 0xf4, 0x51, 0xe1, 0x40, 0x5a, 0x21, 0x91, 0xc4, 0x4e, 0x3a, 0x18, 0x07, 0x92, 0xcf, 0x41, - 0x68, 0x43, 0x30, 0xae, 0xc3, 0x1c, 0x44, 0x3f, 0x99, 0xea, 0xed, 0x0c, 0xb1, 0xbc, 0xa2, 0xc0, - 0x9c, 0x77, 0x30, 0xb1, 0xb6, 0x70, 0x4f, 0xb9, 0xd4, 0x28, 0xe0, 0xfd, 0x87, 0x15, 0xc9, 0xb1, - 0x44, 0x7a, 0x04, 0x31, 0x58, 0x42, 0x41, 0xff, 0x53, 0x82, 0x3c, 0xb3, 0x0e, 0xee, 0x3a, 0x20, - 0x84, 0xe8, 0x95, 0xc3, 0x40, 0x12, 0x7b, 0x3e, 0xfc, 0x53, 0x49, 0x01, 0x18, 0x81, 0x3d, 0x70, - 0x5f, 0x6a, 0x00, 0xa0, 0x7f, 0x91, 0x20, 0xeb, 0x5a, 0x2d, 0x62, 0xa7, 0x6f, 0x3f, 0x29, 0xec, - 0xf7, 0x1a, 0x12, 0x80, 0x4b, 0x3e, 0x42, 0xbf, 0x17, 0x60, 0xaa, 0x4b, 0x33, 0xfa, 0x67, 0xbf, - 0xaf, 0x13, 0xe8, 0x3b, 0xb0, 0x1a, 0xfc, 0x86, 0xde, 0x23, 0xe4, 0x3b, 0x1b, 0xcf, 0x4f, 0x32, - 0x38, 0xca, 0xa3, 0x38, 0xa8, 0xbb, 0x89, 0xbe, 0x2f, 0x01, 0xa8, 0xd8, 0x36, 0x3b, 0x7b, 0x78, - 0xc3, 0xd2, 0xd1, 0x95, 0x01, 0x00, 0xac, 0xd9, 0x67, 0x82, 0x66, 0xff, 0x99, 0xb0, 0xe0, 0x97, - 0x79, 0xc1, 0x3f, 0x3e, 0x5a, 0xf3, 0x3c, 0xe2, 0x11, 0xe2, 0x7f, 0x2a, 0x4c, 0x30, 0x39, 0x32, - 0x13, 0x50, 0x4c, 0xf8, 0xde, 0x4f, 0xe8, 0xfd, 0xbe, 0xe8, 0xef, 0xe1, 0x44, 0xff, 0xa4, 0xc4, - 0x1c, 0x25, 0x03, 0xa0, 0x34, 0x04, 0x00, 0x47, 0x61, 0xda, 0x03, 0x60, 0x43, 0xad, 0x14, 0x30, - 0x7a, 0xa7, 0x4c, 0xb6, 0xdb, 0xe9, 0x58, 0x74, 0xf0, 0x9e, 0xe6, 0xeb, 0xc2, 0x73, 0xf3, 0x90, - 0x3c, 0xfc, 0xf2, 0x53, 0x02, 0xe8, 0x4f, 0x84, 0x26, 0xe3, 0x02, 0x0c, 0x3d, 0x52, 0xfa, 0xab, - 0x33, 0x65, 0x98, 0xe5, 0x8c, 0x08, 0xe5, 0x14, 0x1c, 0xe7, 0x12, 0xe8, 0x78, 0xd7, 0x2e, 0x1c, - 0x51, 0x10, 0x9c, 0xe4, 0xbe, 0xb0, 0x17, 0xdc, 0x2e, 0x64, 0xd0, 0x9f, 0x7d, 0x2e, 0xe3, 0x2f, - 0xcf, 0xbc, 0x37, 0xcb, 0x16, 0xc6, 0x3e, 0xce, 0x87, 0x1b, 0x6b, 0x99, 0x86, 0x83, 0x1f, 0x08, - 0xb9, 0x3b, 0xf8, 0x09, 0xb1, 0x56, 0xc3, 0x29, 0x98, 0x70, 0xac, 0xb0, 0x0b, 0x84, 0xf7, 0x1a, - 0x56, 0xac, 0x1c, 0xaf, 0x58, 0x55, 0x38, 0xa3, 0x1b, 0xad, 0xce, 0x6e, 0x1b, 0xab, 0xb8, 0xa3, - 0xb9, 0x32, 0xb4, 0x8b, 0xf6, 0x22, 0xee, 0x62, 0xa3, 0x8d, 0x0d, 0x87, 0xf2, 0xe9, 0x1d, 0x77, - 0x12, 0xc8, 0xc9, 0x2b, 0xe3, 0x9d, 0xbc, 0x32, 0x3e, 0xa6, 0xdf, 0x8a, 0x6b, 0xcc, 0xf2, 0xdc, - 0x6d, 0x00, 0xb4, 0x6e, 0x67, 0x75, 0x7c, 0x91, 0xa9, 0xe1, 0x15, 0x3d, 0x8b, 0x74, 0x35, 0x3f, - 0x83, 0x1a, 0xca, 0x8c, 0xbe, 0xec, 0xab, 0xdf, 0xdd, 0x9c, 0xfa, 0xdd, 0x24, 0xc8, 0x42, 0x32, - 0xad, 0xeb, 0x0e, 0xa1, 0x75, 0xb3, 0x30, 0x15, 0x6c, 0xfe, 0xca, 0xca, 0x15, 0x70, 0xc2, 0x73, - 0x27, 0xad, 0x96, 0xcb, 0x8b, 0xf5, 0xe6, 0xc6, 0xfa, 0xb2, 0x5a, 0x5c, 0x2c, 0x17, 0xc0, 0xd5, - 0x4f, 0xaa, 0x97, 0xbe, 0x17, 0x68, 0x16, 0xfd, 0xb9, 0x04, 0x39, 0x72, 0x56, 0x0f, 0xfd, 0xcc, - 0x88, 0x34, 0xc7, 0xe6, 0x9c, 0x67, 0xfc, 0x71, 0x57, 0x3c, 0x0c, 0x38, 0x13, 0x26, 0xe1, 0xea, - 0x40, 0x61, 0xc0, 0x63, 0x08, 0xa5, 0x3f, 0x71, 0x71, 0x9b, 0x64, 0x7d, 0xdb, 0xbc, 0xf8, 0xa3, - 0xdc, 0x24, 0xdd, 0xfa, 0x1f, 0x72, 0x93, 0xec, 0xc3, 0xc2, 0xd8, 0x9b, 0x64, 0x9f, 0x76, 0x17, - 0xd3, 0x4c, 0xd1, 0x33, 0x73, 0xfe, 0xfc, 0xef, 0x39, 0xd2, 0x81, 0xb6, 0xaa, 0x8a, 0x30, 0xab, - 0x1b, 0x0e, 0xb6, 0x0c, 0xad, 0xb3, 0xd4, 0xd1, 0xb6, 0x3c, 0xfb, 0xb4, 0x77, 0x7f, 0xa2, 0x12, - 0xca, 0xa3, 0xf2, 0x7f, 0x28, 0xa7, 0x01, 0x1c, 0xbc, 0xd3, 0xed, 0x68, 0x4e, 0xa0, 0x7a, 0xa1, - 0x94, 0xb0, 0xf6, 0x65, 0x79, 0xed, 0xbb, 0x05, 0x2e, 0xa3, 0xa0, 0x35, 0x2e, 0x75, 0xf1, 0x86, - 0xa1, 0xff, 0xec, 0x2e, 0x89, 0x4e, 0x49, 0x75, 0xb4, 0xdf, 0x27, 0x6e, 0xc3, 0x26, 0xdf, 0xb3, - 0x61, 0xf3, 0x0f, 0xc2, 0x51, 0x2f, 0xbc, 0x56, 0x3f, 0x20, 0xea, 0x85, 0xdf, 0xd2, 0xe4, 0x9e, - 0x96, 0xe6, 0x2f, 0xa3, 0x64, 0x05, 0x96, 0x51, 0xc2, 0xa8, 0xe4, 0x04, 0x97, 0x20, 0x5f, 0x23, - 0x14, 0x56, 0x23, 0xae, 0x1a, 0x63, 0x58, 0xe2, 0x96, 0x61, 0x8e, 0x16, 0xbd, 0x60, 0x9a, 0x17, - 0x76, 0x34, 0xeb, 0x02, 0xb2, 0x0e, 0xa4, 0x8a, 0xb1, 0xbb, 0x45, 0x91, 0x5b, 0xa0, 0x9f, 0x16, - 0x9e, 0x33, 0x70, 0xe2, 0xf2, 0x78, 0x1e, 0xcf, 0x76, 0xd1, 0x9b, 0x84, 0xa6, 0x10, 0x22, 0x0c, - 0xa6, 0x8f, 0xeb, 0x1f, 0xf9, 0xb8, 0x7a, 0x1d, 0x7d, 0x78, 0xa5, 0x7d, 0x94, 0xb8, 0xa2, 0xaf, - 0x0c, 0x87, 0x9d, 0xc7, 0xd7, 0x10, 0xd8, 0x15, 0x40, 0xbe, 0xe0, 0x3b, 0xf7, 0xb8, 0x8f, 0xe1, - 0x0a, 0x65, 0xd3, 0x43, 0x33, 0x82, 0xe5, 0xb1, 0xa0, 0x79, 0x9c, 0x67, 0xa1, 0xd6, 0x4d, 0x15, - 0xd3, 0x2f, 0x09, 0xef, 0x60, 0xf5, 0x15, 0x10, 0xe5, 0x6e, 0x3c, 0xad, 0x52, 0x6c, 0xfb, 0x4b, - 0x9c, 0xcd, 0xf4, 0xd1, 0x7c, 0x28, 0x07, 0x53, 0x5e, 0x5c, 0x12, 0x72, 0x6d, 0x8e, 0x8f, 0xe1, - 0x49, 0xc8, 0xdb, 0xe6, 0xae, 0xd5, 0xc2, 0x6c, 0x4f, 0x91, 0xbd, 0x0d, 0xb1, 0xff, 0x35, 0x70, - 0x3c, 0xdf, 0x67, 0x32, 0x64, 0x13, 0x9b, 0x0c, 0xd1, 0x06, 0x69, 0xdc, 0x00, 0xff, 0x02, 0xe1, - 0x58, 0xe7, 0x1c, 0x66, 0x75, 0xec, 0x3c, 0x12, 0xc7, 0xf8, 0xdf, 0x17, 0xda, 0x5d, 0x19, 0x50, - 0x93, 0x64, 0x2a, 0x57, 0x1b, 0xc2, 0x50, 0xbd, 0x12, 0x2e, 0xf7, 0x72, 0x30, 0x0b, 0x95, 0x58, - 0xa4, 0x1b, 0xea, 0x6a, 0x41, 0x46, 0xcf, 0xca, 0x42, 0x81, 0xb2, 0x56, 0xf3, 0x8d, 0x35, 0xf4, - 0x92, 0xcc, 0x61, 0x5b, 0xa4, 0xd1, 0x53, 0xcc, 0xcf, 0x4a, 0xa2, 0xf1, 0x54, 0x39, 0xc1, 0x07, - 0xb5, 0x8b, 0xd0, 0xa4, 0x21, 0x9a, 0x59, 0x8c, 0xf2, 0xa1, 0xdf, 0xcc, 0x88, 0x84, 0x67, 0x15, - 0x63, 0x31, 0xfd, 0x5e, 0xe9, 0x0b, 0x59, 0x2f, 0xbc, 0xd4, 0x92, 0x65, 0xee, 0x6c, 0x58, 0x1d, - 0xf4, 0x7f, 0x0a, 0x45, 0xbf, 0x8e, 0x30, 0xff, 0xa5, 0x68, 0xf3, 0x9f, 0x2c, 0x19, 0x77, 0x82, - 0xbd, 0xaa, 0xce, 0x10, 0xc3, 0xb7, 0x72, 0x3d, 0xcc, 0x69, 0xed, 0xf6, 0xba, 0xb6, 0x85, 0x4b, - 0xee, 0xbc, 0xda, 0x70, 0x58, 0xe8, 0x99, 0x9e, 0xd4, 0xd8, 0xae, 0x48, 0x7c, 0x1d, 0x94, 0x03, - 0x89, 0xc9, 0x67, 0x2c, 0xc3, 0x9b, 0x3b, 0x24, 0xb4, 0xb6, 0xb5, 0x20, 0x10, 0x16, 0x7b, 0x13, - 0xf4, 0x5d, 0x12, 0xe0, 0x3b, 0x7d, 0xcd, 0xfa, 0x5d, 0x09, 0x26, 0x5c, 0x79, 0x17, 0xdb, 0x6d, - 0xf4, 0x68, 0x2e, 0x5e, 0x5c, 0xa4, 0xf7, 0xd8, 0xf3, 0x84, 0xdd, 0xf6, 0xbc, 0x1a, 0x52, 0xfa, - 0x11, 0x98, 0x04, 0x42, 0x94, 0x38, 0x21, 0x8a, 0x79, 0xe7, 0xc5, 0x16, 0x91, 0xbe, 0xf8, 0x3e, - 0x29, 0xc1, 0xac, 0x37, 0x8f, 0x58, 0xc2, 0x4e, 0x6b, 0x1b, 0xdd, 0x26, 0xba, 0xd0, 0xc4, 0x5a, - 0x9a, 0xbf, 0x27, 0xdb, 0x41, 0x3f, 0xc8, 0x24, 0x54, 0x79, 0xae, 0xe4, 0x88, 0x55, 0xba, 0x44, - 0xba, 0x18, 0x47, 0x30, 0x7d, 0x61, 0x7e, 0x59, 0x02, 0x68, 0x98, 0xfe, 0x5c, 0xf7, 0x00, 0x92, - 0x7c, 0x91, 0xf0, 0x76, 0x2d, 0xab, 0x78, 0x50, 0x6c, 0xf2, 0x9e, 0x43, 0xd0, 0xf9, 0x68, 0x50, - 0x49, 0x63, 0x69, 0xeb, 0x53, 0x8b, 0xbb, 0xdd, 0x8e, 0xde, 0xd2, 0x9c, 0x5e, 0x8f, 0xb9, 0x68, - 0xf1, 0x92, 0x3b, 0x25, 0x13, 0x19, 0x85, 0x7e, 0x19, 0x11, 0xb2, 0xa4, 0x71, 0x4c, 0x24, 0x2f, - 0x8e, 0x89, 0xa0, 0x17, 0xcc, 0x00, 0xe2, 0x63, 0x50, 0x4f, 0x19, 0x8e, 0xd6, 0xba, 0xd8, 0x58, - 0xb0, 0xb0, 0xd6, 0x6e, 0x59, 0xbb, 0x3b, 0xe7, 0xed, 0xb0, 0xbb, 0x67, 0xbc, 0x8e, 0x86, 0x96, - 0x8e, 0x25, 0x6e, 0xe9, 0x18, 0x3d, 0x5b, 0x16, 0x8d, 0xaa, 0x13, 0xda, 0xe0, 0x08, 0xf1, 0x30, - 0xc4, 0x50, 0x97, 0xc8, 0x49, 0xa9, 0x67, 0x95, 0x38, 0x9b, 0x64, 0x95, 0xf8, 0xcd, 0x42, 0x31, - 0x7a, 0x84, 0xea, 0x35, 0x16, 0x5f, 0xb3, 0xb9, 0x3a, 0x76, 0x22, 0xe0, 0xbd, 0x0e, 0x66, 0xcf, - 0x07, 0x5f, 0x7c, 0x88, 0xf9, 0xc4, 0x3e, 0x1e, 0xa0, 0x6f, 0x49, 0xba, 0x02, 0xc3, 0xb3, 0x10, - 0x81, 0xae, 0x8f, 0xa0, 0x24, 0xe2, 0x66, 0x96, 0x68, 0x39, 0x25, 0xb6, 0xfc, 0xf4, 0x51, 0xf8, - 0xa8, 0x04, 0xd3, 0xe4, 0xa6, 0xcc, 0x85, 0x4b, 0xe4, 0xe0, 0xa3, 0xa0, 0x51, 0xf2, 0x50, 0x58, - 0xcc, 0x0a, 0x64, 0x3b, 0xba, 0x71, 0xc1, 0xf3, 0x0f, 0x74, 0x9f, 0x83, 0x7b, 0xd7, 0xa4, 0x3e, - 0xf7, 0xae, 0xf9, 0xfb, 0x14, 0x7e, 0xb9, 0x07, 0xba, 0x08, 0x78, 0x20, 0xb9, 0xf4, 0xc5, 0xf8, - 0x77, 0x59, 0xc8, 0xd7, 0xb1, 0x66, 0xb5, 0xb6, 0xd1, 0x7b, 0xa5, 0xbe, 0x53, 0x85, 0x49, 0x7e, - 0xaa, 0xb0, 0x04, 0x13, 0x9b, 0x7a, 0xc7, 0xc1, 0x16, 0xf5, 0x99, 0x0e, 0x77, 0xed, 0xb4, 0x89, - 0x2f, 0x74, 0xcc, 0xd6, 0x85, 0x79, 0x66, 0xba, 0xcf, 0x7b, 0x71, 0x3a, 0xe7, 0x97, 0xc8, 0x4f, - 0xaa, 0xf7, 0xb3, 0x6b, 0x10, 0xda, 0xa6, 0xe5, 0x44, 0x5d, 0xc1, 0x10, 0x41, 0xa5, 0x6e, 0x5a, - 0x8e, 0x4a, 0x7f, 0x74, 0x61, 0xde, 0xdc, 0xed, 0x74, 0x1a, 0xf8, 0x01, 0xc7, 0x9b, 0xb6, 0x79, - 0xef, 0xae, 0xb1, 0x68, 0x6e, 0x6e, 0xda, 0x98, 0x2e, 0x1a, 0xe4, 0x54, 0xf6, 0xa6, 0x1c, 0x87, - 0x5c, 0x47, 0xdf, 0xd1, 0xe9, 0x44, 0x23, 0xa7, 0xd2, 0x17, 0xe5, 0x46, 0x28, 0x04, 0x73, 0x1c, - 0xca, 0xe8, 0xa9, 0x3c, 0x69, 0x9a, 0xfb, 0xd2, 0x5d, 0x9d, 0xb9, 0x80, 0x2f, 0xd9, 0xa7, 0x26, - 0xc8, 0x77, 0xf2, 0xcc, 0x1f, 0x50, 0x11, 0xd9, 0xef, 0xa0, 0x12, 0x8f, 0x9e, 0xc1, 0x5a, 0xb8, - 0x65, 0x5a, 0x6d, 0x4f, 0x36, 0xd1, 0x13, 0x0c, 0x96, 0x2f, 0xd9, 0x2e, 0x45, 0xdf, 0xc2, 0xd3, - 0xd7, 0xb4, 0x77, 0xe5, 0xdd, 0x6e, 0xd3, 0x2d, 0xfa, 0x9c, 0xee, 0x6c, 0xaf, 0x61, 0x47, 0x43, - 0x7f, 0x27, 0xf7, 0xd5, 0xb8, 0xe9, 0xff, 0x4f, 0xe3, 0x06, 0x68, 0x1c, 0x8d, 0xc0, 0xe4, 0xec, - 0x5a, 0x86, 0x2b, 0x47, 0x16, 0xf3, 0x34, 0x94, 0xa2, 0xdc, 0x01, 0x57, 0x04, 0x6f, 0xde, 0x52, - 0xe9, 0x22, 0x9b, 0xb6, 0x4e, 0x91, 0xec, 0xd1, 0x19, 0x94, 0x75, 0xb8, 0x96, 0x7e, 0x5c, 0x69, - 0xac, 0xad, 0xae, 0xe8, 0x5b, 0xdb, 0x1d, 0x7d, 0x6b, 0xdb, 0xb1, 0x2b, 0x86, 0xed, 0x60, 0xad, - 0x5d, 0xdb, 0x54, 0xe9, 0xe5, 0x29, 0x40, 0xe8, 0x88, 0x64, 0xe5, 0x7d, 0xaa, 0xc5, 0x46, 0xb7, - 0xb0, 0xa6, 0x44, 0xb4, 0x94, 0x27, 0xb9, 0x2d, 0xc5, 0xde, 0xed, 0xf8, 0x98, 0x5e, 0xd5, 0x83, - 0x69, 0xa0, 0xea, 0xbb, 0x1d, 0xd2, 0x5c, 0x48, 0xe6, 0xa4, 0xe3, 0x5c, 0x0c, 0x27, 0xe9, 0x37, - 0x9b, 0xff, 0x27, 0x0f, 0xb9, 0x65, 0x4b, 0xeb, 0x6e, 0xa3, 0x67, 0x85, 0xfa, 0xe7, 0x51, 0xb5, - 0x09, 0x5f, 0x3b, 0xa5, 0x41, 0xda, 0x29, 0x0f, 0xd0, 0xce, 0x6c, 0x48, 0x3b, 0xa3, 0x17, 0x95, - 0xcf, 0xc0, 0x4c, 0xcb, 0xec, 0x74, 0x70, 0xcb, 0x95, 0x47, 0xa5, 0x4d, 0x56, 0x73, 0xa6, 0x54, - 0x2e, 0x8d, 0xc4, 0x32, 0xc6, 0x4e, 0x9d, 0xae, 0xa1, 0x53, 0xa5, 0x0f, 0x12, 0xd0, 0x4b, 0x24, - 0xc8, 0x96, 0xdb, 0x5b, 0x98, 0x5b, 0x67, 0xcf, 0x84, 0xd6, 0xd9, 0x4f, 0x42, 0xde, 0xd1, 0xac, - 0x2d, 0xec, 0x78, 0xeb, 0x04, 0xf4, 0xcd, 0x0f, 0xb1, 0x2c, 0x87, 0x42, 0x2c, 0xff, 0x24, 0x64, - 0x5d, 0x99, 0x31, 0x37, 0xf2, 0x6b, 0xfb, 0xc1, 0x4f, 0x64, 0x3f, 0xef, 0x96, 0x38, 0xef, 0xd6, - 0x5a, 0x25, 0x3f, 0xf4, 0x62, 0x9d, 0xdb, 0x87, 0x35, 0xb9, 0x07, 0xb2, 0x65, 0x1a, 0x95, 0x1d, - 0x6d, 0x0b, 0xb3, 0x6a, 0x06, 0x09, 0xde, 0xd7, 0xf2, 0x8e, 0x79, 0xbf, 0xce, 0xa2, 0x1d, 0x07, - 0x09, 0x6e, 0x15, 0xb6, 0xf5, 0x76, 0x1b, 0x1b, 0xac, 0x65, 0xb3, 0xb7, 0x33, 0xa7, 0x21, 0xeb, - 0xf2, 0xe0, 0xea, 0x8f, 0x6b, 0x2c, 0x14, 0x8e, 0x28, 0x33, 0x6e, 0xb3, 0xa2, 0x8d, 0xb7, 0x90, - 0xe1, 0xd7, 0x54, 0x45, 0xdc, 0x76, 0x68, 0xe5, 0xfa, 0x37, 0xae, 0xc7, 0x41, 0xce, 0x30, 0xdb, - 0x78, 0xe0, 0x20, 0x44, 0x73, 0x29, 0x4f, 0x84, 0x1c, 0x6e, 0xbb, 0xbd, 0x82, 0x4c, 0xb2, 0x9f, - 0x8e, 0x97, 0xa5, 0x4a, 0x33, 0x27, 0xf3, 0x0d, 0xea, 0xc7, 0x6d, 0xfa, 0x0d, 0xf0, 0x97, 0x26, - 0xe0, 0x28, 0xed, 0x03, 0xea, 0xbb, 0xe7, 0x5d, 0x52, 0xe7, 0x31, 0x7a, 0xb8, 0xff, 0xc0, 0x75, - 0x94, 0x57, 0xf6, 0xe3, 0x90, 0xb3, 0x77, 0xcf, 0xfb, 0x46, 0x28, 0x7d, 0x09, 0x37, 0x5d, 0x69, - 0x24, 0xc3, 0x99, 0x3c, 0xec, 0x70, 0xc6, 0x0d, 0x4d, 0xb2, 0xd7, 0xf8, 0x83, 0x81, 0x8c, 0x1e, - 0x80, 0xf0, 0x06, 0xb2, 0x7e, 0xc3, 0xd0, 0x29, 0x98, 0xd0, 0x36, 0x1d, 0x6c, 0x05, 0x66, 0x22, - 0x7b, 0x75, 0x87, 0xca, 0xf3, 0x78, 0xd3, 0xb4, 0x5c, 0xb1, 0x4c, 0xd1, 0xa1, 0xd2, 0x7b, 0x0f, - 0xb5, 0x5c, 0xe0, 0x76, 0xc8, 0x6e, 0x82, 0x63, 0x86, 0xb9, 0x88, 0xbb, 0x4c, 0xce, 0x14, 0xc5, - 0x59, 0xd2, 0x02, 0xf6, 0x7f, 0xd8, 0xd7, 0x95, 0xcc, 0xed, 0xef, 0x4a, 0xd0, 0x67, 0x92, 0xce, - 0x99, 0x7b, 0x80, 0x1e, 0x99, 0x85, 0xa6, 0x3c, 0x05, 0x66, 0xda, 0xcc, 0x45, 0xab, 0xa5, 0xfb, - 0xad, 0x24, 0xf2, 0x3f, 0x2e, 0x73, 0xa0, 0x48, 0xd9, 0xb0, 0x22, 0x2d, 0xc3, 0x24, 0x39, 0xaa, - 0xec, 0x6a, 0x52, 0xae, 0xc7, 0x25, 0x9e, 0x4c, 0xeb, 0xfc, 0x4a, 0x85, 0xc4, 0x36, 0x5f, 0x62, - 0xbf, 0xa8, 0xfe, 0xcf, 0xc9, 0x66, 0xdf, 0xf1, 0x12, 0x4a, 0xbf, 0x39, 0xfe, 0x56, 0x1e, 0xae, - 0x28, 0x59, 0xa6, 0x6d, 0x93, 0x33, 0x30, 0xbd, 0x0d, 0xf3, 0x8d, 0x12, 0x77, 0xd9, 0xc2, 0x23, - 0xba, 0xf9, 0xf5, 0x6b, 0x50, 0xe3, 0x6b, 0x1a, 0x5f, 0x17, 0x0e, 0xf2, 0xe2, 0xef, 0x3f, 0x44, - 0x08, 0xfd, 0x47, 0xa3, 0x91, 0xbc, 0x2b, 0x23, 0x12, 0x77, 0x26, 0xa1, 0xac, 0xd2, 0x6f, 0x2e, - 0x5f, 0x92, 0xe0, 0xca, 0x5e, 0x6e, 0x36, 0x0c, 0xdb, 0x6f, 0x30, 0x57, 0x0f, 0x68, 0x2f, 0x7c, - 0x9c, 0x92, 0xd8, 0x6b, 0x0e, 0x23, 0xea, 0x1e, 0x2a, 0x2d, 0x62, 0xb1, 0x24, 0x38, 0x51, 0x13, - 0x77, 0xcd, 0x61, 0x62, 0xf2, 0xe9, 0x0b, 0xf7, 0xb3, 0x59, 0x38, 0xba, 0x6c, 0x99, 0xbb, 0x5d, - 0x3b, 0xe8, 0x81, 0xfe, 0xba, 0xff, 0x86, 0x6b, 0x5e, 0xc4, 0x34, 0xb8, 0x06, 0xa6, 0x2d, 0x66, - 0xcd, 0x05, 0xdb, 0xaf, 0xe1, 0xa4, 0x70, 0xef, 0x25, 0x1f, 0xa4, 0xf7, 0x0a, 0xfa, 0x99, 0x2c, - 0xd7, 0xcf, 0xf4, 0xf6, 0x1c, 0xb9, 0x3e, 0x3d, 0xc7, 0x5f, 0x49, 0x09, 0x07, 0xd5, 0x1e, 0x11, - 0x45, 0xf4, 0x17, 0x25, 0xc8, 0x6f, 0x91, 0x8c, 0xac, 0xbb, 0x78, 0xac, 0x58, 0xcd, 0x08, 0x71, - 0x95, 0xfd, 0x1a, 0xc8, 0x55, 0x0e, 0xeb, 0x70, 0xa2, 0x01, 0x2e, 0x9e, 0xdb, 0xf4, 0x95, 0xea, - 0xb5, 0x59, 0x98, 0xf1, 0x4b, 0xaf, 0xb4, 0x6d, 0xf4, 0x50, 0x7f, 0x8d, 0x9a, 0x15, 0xd1, 0xa8, - 0x7d, 0xeb, 0xcc, 0xfe, 0xa8, 0x23, 0x87, 0x46, 0x9d, 0xbe, 0xa3, 0xcb, 0x4c, 0xc4, 0xe8, 0x82, - 0x9e, 0x29, 0x8b, 0x5e, 0x57, 0xc4, 0x77, 0xad, 0xa4, 0x36, 0x8f, 0xe4, 0xc1, 0x42, 0xf0, 0xd2, - 0xa4, 0xc1, 0xb5, 0x4a, 0x5f, 0x49, 0x3e, 0x20, 0xc1, 0xb1, 0xfd, 0x9d, 0xf9, 0x8f, 0xf1, 0x5e, - 0x68, 0x6e, 0x9d, 0x6c, 0xdf, 0x0b, 0x8d, 0xbc, 0xf1, 0x9b, 0x74, 0xb1, 0x41, 0x43, 0x38, 0x7b, - 0x6f, 0x70, 0x27, 0x2e, 0x16, 0x16, 0x44, 0x90, 0xe8, 0x18, 0x6e, 0x9d, 0x92, 0x61, 0xaa, 0x8e, - 0x9d, 0x55, 0xed, 0x92, 0xb9, 0xeb, 0x20, 0x4d, 0x74, 0x7b, 0xee, 0xc9, 0x90, 0xef, 0x90, 0x5f, - 0xd8, 0x2d, 0xf0, 0xd7, 0xf4, 0xdd, 0xdf, 0x22, 0xbe, 0x3f, 0x94, 0xb4, 0xca, 0xf2, 0xf3, 0xd1, - 0x5a, 0x44, 0x76, 0x47, 0x7d, 0xee, 0x46, 0xb2, 0xb5, 0x93, 0x68, 0xef, 0x34, 0xaa, 0xe8, 0xf4, - 0x61, 0x79, 0xb6, 0x0c, 0xb3, 0x75, 0xec, 0x54, 0xec, 0x25, 0x6d, 0xcf, 0xb4, 0x74, 0x07, 0x87, - 0xaf, 0x81, 0x8c, 0x87, 0xe6, 0x34, 0x80, 0xee, 0xff, 0xc6, 0x62, 0x48, 0x85, 0x52, 0xd0, 0x6f, - 0x26, 0x75, 0x14, 0xe2, 0xf8, 0x18, 0x09, 0x08, 0x89, 0x7c, 0x2c, 0xe2, 0x8a, 0x4f, 0x1f, 0x88, - 0x2f, 0x4a, 0x0c, 0x88, 0xa2, 0xd5, 0xda, 0xd6, 0xf7, 0x70, 0x3b, 0x21, 0x10, 0xde, 0x6f, 0x01, - 0x10, 0x3e, 0xa1, 0xc4, 0xee, 0x2b, 0x1c, 0x1f, 0xa3, 0x70, 0x5f, 0x89, 0x23, 0x38, 0x96, 0x30, - 0x50, 0x6e, 0xd7, 0xc3, 0xd6, 0x33, 0xef, 0x12, 0x15, 0x6b, 0x60, 0xb2, 0x49, 0x61, 0x93, 0x6d, - 0xa8, 0x8e, 0x85, 0x96, 0x3d, 0x48, 0xa7, 0xb3, 0x69, 0x74, 0x2c, 0x7d, 0x8b, 0x4e, 0x5f, 0xe8, - 0xef, 0x91, 0xe1, 0x84, 0x1f, 0x1f, 0xa5, 0x8e, 0x9d, 0x45, 0xcd, 0xde, 0x3e, 0x6f, 0x6a, 0x56, - 0x1b, 0x95, 0x46, 0x70, 0xe2, 0x0f, 0x7d, 0x21, 0x0c, 0x42, 0x95, 0x07, 0xa1, 0xaf, 0xab, 0x68, - 0x5f, 0x5e, 0x46, 0xd1, 0xc9, 0xc4, 0x7a, 0xb3, 0xfe, 0xb6, 0x0f, 0xd6, 0xd3, 0x38, 0xb0, 0xee, - 0x1c, 0x96, 0xc5, 0xf4, 0x81, 0xfb, 0x0d, 0x3a, 0x22, 0x84, 0xbc, 0x9a, 0xef, 0x13, 0x05, 0x2c, - 0xc2, 0xab, 0x55, 0x8e, 0xf4, 0x6a, 0x1d, 0x6a, 0x8c, 0x18, 0xe8, 0x91, 0x9c, 0xee, 0x18, 0x71, - 0x88, 0xde, 0xc6, 0xef, 0x90, 0xa1, 0x40, 0x02, 0x64, 0x85, 0x3c, 0xbe, 0xc3, 0xf1, 0xa6, 0xe3, - 0xd1, 0xd9, 0xe7, 0x5d, 0x3e, 0x91, 0xd4, 0xbb, 0x1c, 0xbd, 0x3d, 0xa9, 0x0f, 0x79, 0x2f, 0xb7, - 0x23, 0x41, 0x2c, 0x91, 0x8b, 0xf8, 0x00, 0x0e, 0xd2, 0x07, 0xed, 0xbf, 0xc9, 0x00, 0x6e, 0x83, - 0x66, 0x67, 0x1f, 0x9e, 0x2e, 0x0a, 0xd7, 0xcd, 0x61, 0xbf, 0x7a, 0x17, 0xa8, 0x13, 0x3d, 0x40, - 0x51, 0x8a, 0xc1, 0xa9, 0x8a, 0x87, 0x93, 0xfa, 0x56, 0x06, 0x5c, 0x8d, 0x04, 0x96, 0x44, 0xde, - 0x96, 0x91, 0x65, 0xa7, 0x0f, 0xc8, 0xff, 0x90, 0x20, 0xd7, 0x30, 0xeb, 0xd8, 0x39, 0xb8, 0x29, - 0x90, 0xf8, 0xd8, 0x3e, 0x29, 0x77, 0x14, 0xc7, 0xf6, 0xfb, 0x11, 0x4a, 0x5f, 0x74, 0xef, 0x96, - 0x60, 0xa6, 0x61, 0x96, 0xfc, 0xc5, 0x29, 0x71, 0x5f, 0x55, 0xf1, 0x2b, 0x97, 0xfd, 0x0a, 0x06, - 0xc5, 0x1c, 0xe8, 0xca, 0xe5, 0xc1, 0xf4, 0xd2, 0x97, 0xdb, 0x6d, 0x70, 0x74, 0xc3, 0x68, 0x9b, - 0x2a, 0x6e, 0x9b, 0x6c, 0xa5, 0x5b, 0x51, 0x20, 0xbb, 0x6b, 0xb4, 0x4d, 0xc2, 0x72, 0x4e, 0x25, - 0xcf, 0x6e, 0x9a, 0x85, 0xdb, 0x26, 0xf3, 0x0d, 0x20, 0xcf, 0xe8, 0xeb, 0x32, 0x64, 0xdd, 0x7f, - 0xc5, 0x45, 0xfd, 0x0e, 0x39, 0x61, 0x20, 0x02, 0x97, 0xfc, 0x48, 0x2c, 0xa1, 0xbb, 0x42, 0x6b, - 0xff, 0xd4, 0x83, 0xf5, 0xda, 0xa8, 0xf2, 0x42, 0xa2, 0x08, 0xd6, 0xfc, 0x95, 0x53, 0x30, 0x71, - 0xbe, 0x63, 0xb6, 0x2e, 0x04, 0xe7, 0xe5, 0xd9, 0xab, 0x72, 0x23, 0xe4, 0x2c, 0xcd, 0xd8, 0xc2, - 0x6c, 0x4f, 0xe1, 0x78, 0x4f, 0x5f, 0x48, 0xbc, 0x5e, 0x54, 0x9a, 0x05, 0xbd, 0x3d, 0x49, 0x08, - 0x84, 0x3e, 0x95, 0x4f, 0xa6, 0x0f, 0x8b, 0x43, 0x9c, 0x2c, 0x2b, 0xc0, 0x4c, 0xa9, 0x48, 0x2f, - 0x37, 0x5f, 0xab, 0x9d, 0x2d, 0x17, 0x64, 0x02, 0xb3, 0x2b, 0x93, 0x14, 0x61, 0x76, 0xc9, 0xff, - 0xc8, 0xc2, 0xdc, 0xa7, 0xf2, 0x87, 0x01, 0xf3, 0x27, 0x25, 0x98, 0x5d, 0xd5, 0x6d, 0x27, 0xca, - 0xdb, 0x3f, 0x26, 0x3e, 0xee, 0x0b, 0x92, 0x9a, 0xca, 0x5c, 0x39, 0xc2, 0x81, 0x71, 0x13, 0x99, - 0xc3, 0x71, 0x45, 0x8c, 0xe7, 0x58, 0x0a, 0xe1, 0x80, 0x5e, 0x48, 0x2c, 0x2c, 0xc9, 0xc4, 0x86, - 0x52, 0x50, 0xc8, 0xf8, 0x0d, 0xa5, 0xc8, 0xb2, 0xd3, 0x97, 0xef, 0xd7, 0x25, 0x38, 0xe6, 0x16, - 0x1f, 0xb7, 0x2c, 0x15, 0x2d, 0xe6, 0x81, 0xcb, 0x52, 0x89, 0x57, 0xc6, 0xf7, 0xf1, 0x32, 0x8a, - 0x95, 0xf1, 0x41, 0x44, 0xc7, 0x2c, 0xe6, 0x88, 0x65, 0xd8, 0x41, 0x62, 0x8e, 0x59, 0x86, 0x1d, - 0x5e, 0xcc, 0xf1, 0x4b, 0xb1, 0x43, 0x8a, 0xf9, 0xd0, 0x16, 0x58, 0x5f, 0x2f, 0xfb, 0x62, 0x8e, - 0x5c, 0xdb, 0x88, 0x11, 0x73, 0xe2, 0x13, 0xbb, 0xe8, 0x9d, 0x43, 0x0a, 0x7e, 0xc4, 0xeb, 0x1b, - 0xc3, 0xc0, 0x74, 0x88, 0x6b, 0x1c, 0x2f, 0x95, 0x61, 0x8e, 0x71, 0xd1, 0x7f, 0xca, 0x1c, 0x83, - 0x51, 0xe2, 0x29, 0x73, 0xe2, 0x33, 0x40, 0x3c, 0x67, 0xe3, 0x3f, 0x03, 0x14, 0x5b, 0x7e, 0xfa, - 0xe0, 0x7c, 0x23, 0x0b, 0x27, 0x5d, 0x16, 0xd6, 0xcc, 0xb6, 0xbe, 0x79, 0x89, 0x72, 0x71, 0x56, - 0xeb, 0xec, 0x62, 0x1b, 0xbd, 0x4f, 0x12, 0x45, 0xe9, 0x3f, 0x01, 0x98, 0x5d, 0x6c, 0xd1, 0x40, - 0x6a, 0x0c, 0xa8, 0x3b, 0xa2, 0x2a, 0xbb, 0xbf, 0x24, 0xff, 0xba, 0x98, 0x9a, 0x47, 0x44, 0x0d, - 0xd1, 0x73, 0xad, 0xc2, 0x29, 0xff, 0x4b, 0xaf, 0x83, 0x47, 0x66, 0xbf, 0x83, 0xc7, 0x0d, 0x20, - 0x6b, 0xed, 0xb6, 0x0f, 0x55, 0xef, 0x66, 0x36, 0x29, 0x53, 0x75, 0xb3, 0xb8, 0x39, 0x6d, 0x1c, - 0x1c, 0xcd, 0x8b, 0xc8, 0x69, 0x63, 0x47, 0x99, 0x87, 0x3c, 0xbd, 0x9c, 0xd9, 0x5f, 0xd1, 0xef, - 0x9f, 0x99, 0xe5, 0xe2, 0x4d, 0xbb, 0x1a, 0xaf, 0x86, 0xb7, 0x25, 0x92, 0x4c, 0xbf, 0x7e, 0x3a, - 0xb0, 0x93, 0x55, 0x4e, 0xc1, 0x9e, 0x3a, 0x34, 0xe5, 0xf1, 0xec, 0x86, 0x15, 0xbb, 0xdd, 0xce, - 0xa5, 0x06, 0x0b, 0xbe, 0x92, 0x68, 0x37, 0x2c, 0x14, 0xc3, 0x45, 0xea, 0x8d, 0xe1, 0x92, 0x7c, - 0x37, 0x8c, 0xe3, 0x63, 0x14, 0xbb, 0x61, 0x71, 0x04, 0xd3, 0x17, 0xed, 0x5b, 0x73, 0xd4, 0x6a, - 0x66, 0xd1, 0xfb, 0xff, 0xb0, 0xff, 0x21, 0x34, 0xe0, 0x9d, 0x5d, 0xfa, 0x05, 0xf6, 0x8f, 0xbd, - 0xb5, 0x44, 0x79, 0x22, 0xe4, 0x37, 0x4d, 0x6b, 0x47, 0xf3, 0x36, 0xee, 0x7b, 0x4f, 0x8a, 0xb0, - 0x88, 0xf9, 0x4b, 0x24, 0x8f, 0xca, 0xf2, 0xba, 0xf3, 0x91, 0x67, 0xe8, 0x5d, 0x16, 0x75, 0xd1, - 0x7d, 0x54, 0xae, 0x83, 0x59, 0x16, 0x7c, 0xb1, 0x8a, 0x6d, 0x07, 0xb7, 0x59, 0xc4, 0x0a, 0x3e, - 0x51, 0x39, 0x03, 0x33, 0x2c, 0x61, 0x49, 0xef, 0x60, 0x9b, 0x05, 0xad, 0xe0, 0xd2, 0x94, 0x93, - 0x90, 0xd7, 0xed, 0x7b, 0x6c, 0xd3, 0x20, 0xfe, 0xff, 0x93, 0x2a, 0x7b, 0x53, 0x6e, 0x80, 0xa3, - 0x2c, 0x9f, 0x6f, 0xac, 0xd2, 0x03, 0x3b, 0xbd, 0xc9, 0xae, 0x6a, 0x19, 0xe6, 0xba, 0x65, 0x6e, - 0x59, 0xd8, 0xb6, 0xc9, 0xa9, 0xa9, 0x49, 0x35, 0x94, 0x82, 0x3e, 0x37, 0xcc, 0xc4, 0x22, 0xf1, - 0x4d, 0x06, 0x2e, 0x4a, 0xbb, 0xad, 0x16, 0xc6, 0x6d, 0x76, 0xf2, 0xc9, 0x7b, 0x4d, 0x78, 0xc7, - 0x41, 0xe2, 0x69, 0xc8, 0x21, 0x5d, 0x72, 0xf0, 0xe1, 0x13, 0x90, 0xa7, 0x17, 0x86, 0xa1, 0x17, - 0xcf, 0xf5, 0x55, 0xd6, 0x39, 0x5e, 0x59, 0x37, 0x60, 0xc6, 0x30, 0xdd, 0xe2, 0xd6, 0x35, 0x4b, - 0xdb, 0xb1, 0xe3, 0x56, 0x19, 0x29, 0x5d, 0x7f, 0x48, 0xa9, 0x86, 0x7e, 0x5b, 0x39, 0xa2, 0x72, - 0x64, 0x94, 0xff, 0x1f, 0x1c, 0x3d, 0xcf, 0x22, 0x04, 0xd8, 0x8c, 0xb2, 0x14, 0xed, 0x83, 0xd7, - 0x43, 0x79, 0x81, 0xff, 0x73, 0xe5, 0x88, 0xda, 0x4b, 0x4c, 0xf9, 0x69, 0x98, 0x73, 0x5f, 0xdb, - 0xe6, 0x45, 0x8f, 0x71, 0x39, 0xda, 0x10, 0xe9, 0x21, 0xbf, 0xc6, 0xfd, 0xb8, 0x72, 0x44, 0xed, - 0x21, 0xa5, 0xd4, 0x00, 0xb6, 0x9d, 0x9d, 0x0e, 0x23, 0x9c, 0x8d, 0x56, 0xc9, 0x1e, 0xc2, 0x2b, - 0xfe, 0x4f, 0x2b, 0x47, 0xd4, 0x10, 0x09, 0x65, 0x15, 0xa6, 0x9c, 0x07, 0x1c, 0x46, 0x2f, 0x17, - 0xbd, 0xf9, 0xdd, 0x43, 0xaf, 0xe1, 0xfd, 0xb3, 0x72, 0x44, 0x0d, 0x08, 0x28, 0x15, 0x98, 0xec, - 0x9e, 0x67, 0xc4, 0xf2, 0x7d, 0xa2, 0xcd, 0xf7, 0x27, 0xb6, 0x7e, 0xde, 0xa7, 0xe5, 0xff, 0xee, - 0x32, 0xd6, 0xb2, 0xf7, 0x18, 0xad, 0x09, 0x61, 0xc6, 0x4a, 0xde, 0x3f, 0x2e, 0x63, 0x3e, 0x01, - 0xa5, 0x02, 0x53, 0xb6, 0xa1, 0x75, 0xed, 0x6d, 0xd3, 0xb1, 0x4f, 0x4d, 0xf6, 0xf8, 0x49, 0x46, - 0x53, 0xab, 0xb3, 0x7f, 0xd4, 0xe0, 0x6f, 0xe5, 0x89, 0x70, 0x62, 0x97, 0xdc, 0xdc, 0x5e, 0x7e, - 0x40, 0xb7, 0x1d, 0xdd, 0xd8, 0xf2, 0x62, 0xcc, 0xd2, 0xde, 0xa6, 0xff, 0x47, 0x65, 0x9e, 0x9d, - 0x98, 0x02, 0xd2, 0x36, 0x51, 0xef, 0x66, 0x1d, 0x2d, 0x36, 0x74, 0x50, 0xea, 0x29, 0x90, 0x75, - 0x3f, 0x91, 0xde, 0x69, 0xae, 0xff, 0x42, 0x60, 0xaf, 0xee, 0x90, 0x06, 0xec, 0xfe, 0xd4, 0xd3, - 0xc1, 0xcd, 0xf4, 0x76, 0x70, 0x6e, 0x03, 0xd7, 0xed, 0x35, 0x7d, 0x8b, 0x5a, 0x57, 0xcc, 0x1f, - 0x3e, 0x9c, 0x44, 0x67, 0xa3, 0x55, 0x7c, 0x91, 0xde, 0xa0, 0x71, 0xd4, 0x9b, 0x8d, 0x7a, 0x29, - 0xe8, 0x7a, 0x98, 0x09, 0x37, 0x32, 0x7a, 0xeb, 0xa8, 0x1e, 0xd8, 0x66, 0xec, 0x0d, 0x5d, 0x07, - 0x73, 0xbc, 0x4e, 0x87, 0x86, 0x20, 0xd9, 0xeb, 0x0a, 0xd1, 0xb5, 0x70, 0xb4, 0xa7, 0x61, 0x79, - 0x31, 0x47, 0x32, 0x41, 0xcc, 0x91, 0x6b, 0x00, 0x02, 0x2d, 0xee, 0x4b, 0xe6, 0x6a, 0x98, 0xf2, - 0xf5, 0xb2, 0x6f, 0x86, 0xaf, 0x66, 0x60, 0xd2, 0x53, 0xb6, 0x7e, 0x19, 0xdc, 0xf1, 0xc7, 0x08, - 0x6d, 0x30, 0xb0, 0x69, 0x38, 0x97, 0xe6, 0x8e, 0x33, 0x81, 0x5b, 0x6f, 0x43, 0x77, 0x3a, 0xde, - 0xd1, 0xb8, 0xde, 0x64, 0x65, 0x1d, 0x40, 0x27, 0x18, 0x35, 0x82, 0xb3, 0x72, 0xb7, 0x24, 0x68, - 0x0f, 0x54, 0x1f, 0x42, 0x34, 0xce, 0xfc, 0x18, 0x3b, 0xc8, 0x36, 0x05, 0x39, 0x1a, 0x68, 0xfd, - 0x88, 0x32, 0x07, 0x50, 0x7e, 0xfa, 0x7a, 0x59, 0xad, 0x94, 0xab, 0xa5, 0x72, 0x21, 0x83, 0x5e, - 0x26, 0xc1, 0x94, 0xdf, 0x08, 0xfa, 0x56, 0xb2, 0xcc, 0x54, 0x6b, 0xe0, 0xc5, 0x8e, 0xfb, 0x1b, - 0x55, 0x58, 0xc9, 0x9e, 0x0c, 0x97, 0xef, 0xda, 0x78, 0x49, 0xb7, 0x6c, 0x47, 0x35, 0x2f, 0x2e, - 0x99, 0x96, 0x1f, 0x55, 0x99, 0x45, 0x38, 0x8d, 0xfa, 0xec, 0x5a, 0x1c, 0x6d, 0x4c, 0x0e, 0x4d, - 0x61, 0x8b, 0xad, 0x1c, 0x07, 0x09, 0x2e, 0x5d, 0xc7, 0xd2, 0x0c, 0xbb, 0x6b, 0xda, 0x58, 0x35, - 0x2f, 0xda, 0x45, 0xa3, 0x5d, 0x32, 0x3b, 0xbb, 0x3b, 0x86, 0xcd, 0x6c, 0x86, 0xa8, 0xcf, 0xae, - 0x74, 0xc8, 0xb5, 0xad, 0x73, 0x00, 0xa5, 0xda, 0xea, 0x6a, 0xb9, 0xd4, 0xa8, 0xd4, 0xaa, 0x85, - 0x23, 0xae, 0xb4, 0x1a, 0xc5, 0x85, 0x55, 0x57, 0x3a, 0x3f, 0x03, 0x93, 0x5e, 0x9b, 0x66, 0x61, - 0x52, 0x32, 0x5e, 0x98, 0x14, 0xa5, 0x08, 0x93, 0x5e, 0x2b, 0x67, 0x23, 0xc2, 0xa3, 0x7b, 0x8f, - 0xc5, 0xee, 0x68, 0x96, 0x43, 0xfc, 0xa9, 0x3d, 0x22, 0x0b, 0x9a, 0x8d, 0x55, 0xff, 0xb7, 0x33, - 0x8f, 0x63, 0x1c, 0x28, 0x30, 0x57, 0x5c, 0x5d, 0x6d, 0xd6, 0xd4, 0x66, 0xb5, 0xd6, 0x58, 0xa9, - 0x54, 0x97, 0xe9, 0x08, 0x59, 0x59, 0xae, 0xd6, 0xd4, 0x32, 0x1d, 0x20, 0xeb, 0x85, 0x0c, 0xbd, - 0x36, 0x78, 0x61, 0x12, 0xf2, 0x5d, 0x22, 0x5d, 0xf4, 0x25, 0x39, 0xe1, 0x79, 0x78, 0x1f, 0xa7, - 0x88, 0x8b, 0x4d, 0x39, 0x9f, 0x74, 0xa9, 0xcf, 0x99, 0xd1, 0x33, 0x30, 0x43, 0x6d, 0x3d, 0x9b, - 0x2c, 0xef, 0x13, 0xe4, 0x64, 0x95, 0x4b, 0x43, 0x1f, 0x95, 0x12, 0x1c, 0x92, 0xef, 0xcb, 0x51, - 0x32, 0xe3, 0xe2, 0xcf, 0x32, 0xc3, 0x5d, 0x4b, 0x50, 0xa9, 0x36, 0xca, 0x6a, 0xb5, 0xb8, 0xca, - 0xb2, 0xc8, 0xca, 0x29, 0x38, 0x5e, 0xad, 0xb1, 0x98, 0x7f, 0xf5, 0x66, 0xa3, 0xd6, 0xac, 0xac, - 0xad, 0xd7, 0xd4, 0x46, 0x21, 0xa7, 0x9c, 0x04, 0x85, 0x3e, 0x37, 0x2b, 0xf5, 0x66, 0xa9, 0x58, - 0x2d, 0x95, 0x57, 0xcb, 0x8b, 0x85, 0xbc, 0xf2, 0x18, 0xb8, 0x96, 0x5e, 0x73, 0x53, 0x5b, 0x6a, - 0xaa, 0xb5, 0x73, 0x75, 0x17, 0x41, 0xb5, 0xbc, 0x5a, 0x74, 0x15, 0x29, 0x74, 0x7d, 0xf0, 0x84, - 0x72, 0x19, 0x1c, 0x25, 0x77, 0x8b, 0xaf, 0xd6, 0x8a, 0x8b, 0xac, 0xbc, 0x49, 0xe5, 0x2a, 0x38, - 0x55, 0xa9, 0xd6, 0x37, 0x96, 0x96, 0x2a, 0xa5, 0x4a, 0xb9, 0xda, 0x68, 0xae, 0x97, 0xd5, 0xb5, - 0x4a, 0xbd, 0xee, 0xfe, 0x5b, 0x98, 0x22, 0x97, 0xb3, 0xd2, 0x3e, 0x13, 0xbd, 0x57, 0x86, 0xd9, - 0xb3, 0x5a, 0x47, 0x77, 0x07, 0x0a, 0x72, 0x6b, 0x73, 0xcf, 0x71, 0x12, 0x87, 0xdc, 0xee, 0xcc, - 0x1c, 0xd2, 0xc9, 0x0b, 0xfa, 0x05, 0x39, 0xe1, 0x71, 0x12, 0x06, 0x04, 0x2d, 0x71, 0x9e, 0x2b, - 0x2d, 0x62, 0xf2, 0xf3, 0x1a, 0x29, 0xc1, 0x71, 0x12, 0x71, 0xf2, 0xc9, 0xc0, 0x7f, 0xf9, 0xa8, - 0xc0, 0x2f, 0xc0, 0xcc, 0x46, 0xb5, 0xb8, 0xd1, 0x58, 0xa9, 0xa9, 0x95, 0x9f, 0x22, 0xd1, 0xc8, - 0x67, 0x61, 0x6a, 0xa9, 0xa6, 0x2e, 0x54, 0x16, 0x17, 0xcb, 0xd5, 0x42, 0x4e, 0xb9, 0x1c, 0x2e, - 0xab, 0x97, 0xd5, 0xb3, 0x95, 0x52, 0xb9, 0xb9, 0x51, 0x2d, 0x9e, 0x2d, 0x56, 0x56, 0x49, 0x1f, - 0x91, 0x8f, 0xb9, 0x71, 0x7a, 0x02, 0xfd, 0x5c, 0x16, 0x80, 0x56, 0x9d, 0x5c, 0xc6, 0x13, 0xba, - 0x97, 0xf8, 0xcf, 0x93, 0x4e, 0x1a, 0x02, 0x32, 0x11, 0xed, 0xb7, 0x02, 0x93, 0x16, 0xfb, 0xc0, - 0x96, 0x57, 0x06, 0xd1, 0xa1, 0x8f, 0x1e, 0x35, 0xd5, 0xff, 0x1d, 0xbd, 0x2f, 0xc9, 0x1c, 0x21, - 0x92, 0xb1, 0x64, 0x48, 0x2e, 0x8d, 0x06, 0x48, 0xf4, 0x50, 0x06, 0xe6, 0xf8, 0x8a, 0xb9, 0x95, - 0x20, 0xc6, 0x94, 0x58, 0x25, 0xf8, 0x9f, 0x43, 0x46, 0xd6, 0x99, 0x27, 0xb0, 0xe1, 0x14, 0xbc, - 0x96, 0x49, 0x4f, 0x86, 0x7b, 0x16, 0x4b, 0x21, 0xe3, 0x32, 0xef, 0x1a, 0x1d, 0x05, 0x49, 0x99, - 0x00, 0xb9, 0xf1, 0x80, 0x53, 0x90, 0xd1, 0x57, 0x65, 0x98, 0xe5, 0x2e, 0x3e, 0x46, 0xaf, 0xc9, - 0x88, 0x5c, 0x4a, 0x1a, 0xba, 0x52, 0x39, 0x73, 0xd0, 0x2b, 0x95, 0xcf, 0xdc, 0x0c, 0x13, 0x2c, - 0x8d, 0xc8, 0xb7, 0x56, 0x75, 0x4d, 0x81, 0xa3, 0x30, 0xbd, 0x5c, 0x6e, 0x34, 0xeb, 0x8d, 0xa2, - 0xda, 0x28, 0x2f, 0x16, 0x32, 0xee, 0xc0, 0x57, 0x5e, 0x5b, 0x6f, 0xdc, 0x57, 0x90, 0x92, 0x7b, - 0xe8, 0xf5, 0x32, 0x32, 0x66, 0x0f, 0xbd, 0xb8, 0xe2, 0xd3, 0x9f, 0xab, 0x7e, 0x46, 0x86, 0x02, - 0xe5, 0xa0, 0xfc, 0x40, 0x17, 0x5b, 0x3a, 0x36, 0x5a, 0x18, 0x5d, 0x10, 0x89, 0x08, 0xba, 0x2f, - 0x56, 0x1e, 0xe9, 0xcf, 0x43, 0x56, 0x22, 0x7d, 0xe9, 0x31, 0xb0, 0xb3, 0xfb, 0x0c, 0xec, 0x4f, - 0x27, 0x75, 0xd1, 0xeb, 0x65, 0x77, 0x24, 0x90, 0x7d, 0x22, 0x89, 0x8b, 0xde, 0x00, 0x0e, 0xc6, - 0x12, 0xe8, 0x37, 0x62, 0xfc, 0x2d, 0xc8, 0xe8, 0xf9, 0x32, 0x1c, 0x5d, 0xd4, 0x1c, 0xbc, 0x70, - 0xa9, 0xe1, 0x5d, 0x4c, 0x18, 0x71, 0x99, 0x70, 0x66, 0xdf, 0x65, 0xc2, 0xc1, 0xdd, 0x86, 0x52, - 0xcf, 0xdd, 0x86, 0xe8, 0x5d, 0x49, 0x0f, 0xf5, 0xf5, 0xf0, 0x30, 0xb2, 0x68, 0xbc, 0xc9, 0x0e, - 0xeb, 0xc5, 0x73, 0x31, 0x86, 0xbb, 0xfd, 0xa7, 0xa0, 0x40, 0x59, 0x09, 0x79, 0xa1, 0xfd, 0x2a, - 0xbb, 0x7f, 0xbb, 0x99, 0x20, 0xe8, 0x9f, 0x17, 0x46, 0x41, 0xe2, 0xc3, 0x28, 0x70, 0x8b, 0x9a, - 0x72, 0xaf, 0xe7, 0x40, 0xd2, 0xce, 0x30, 0xe4, 0x72, 0x16, 0x1d, 0x67, 0x35, 0xbd, 0xce, 0x30, - 0xb6, 0xf8, 0xf1, 0xdc, 0x11, 0xcb, 0xee, 0x79, 0x2c, 0x8b, 0x22, 0x13, 0x7f, 0x15, 0x76, 0x52, - 0xff, 0x63, 0xce, 0xe5, 0x2f, 0xe6, 0x7e, 0xe8, 0xf4, 0xfc, 0x8f, 0x07, 0x71, 0x90, 0x3e, 0x0a, - 0x3f, 0x90, 0x20, 0x5b, 0x37, 0x2d, 0x67, 0x54, 0x18, 0x24, 0xdd, 0x33, 0x0d, 0x49, 0xa0, 0x1e, - 0x3d, 0xe7, 0x4c, 0x6f, 0xcf, 0x34, 0xbe, 0xfc, 0x31, 0xc4, 0x4d, 0x3c, 0x0a, 0x73, 0x94, 0x13, - 0xff, 0x52, 0x91, 0xef, 0x4b, 0xb4, 0xbf, 0xba, 0x57, 0x14, 0x91, 0x33, 0x30, 0x13, 0xda, 0xb3, - 0xf4, 0x40, 0xe1, 0xd2, 0xd0, 0x1b, 0xc3, 0xb8, 0x2c, 0xf2, 0xb8, 0xf4, 0x9b, 0x71, 0xfb, 0xf7, - 0x72, 0x8c, 0xaa, 0x67, 0x4a, 0x12, 0x82, 0x31, 0xa6, 0xf0, 0xf4, 0x11, 0x79, 0x50, 0x86, 0x3c, - 0xf3, 0x19, 0x1b, 0x29, 0x02, 0x49, 0x5b, 0x86, 0x2f, 0x04, 0x31, 0xdf, 0x32, 0x79, 0xd4, 0x2d, - 0x23, 0xbe, 0xfc, 0xf4, 0x71, 0xf8, 0x77, 0xe6, 0x0c, 0x59, 0xdc, 0xd3, 0xf4, 0x8e, 0x76, 0xbe, - 0x93, 0x20, 0xf4, 0xf1, 0x47, 0x13, 0x1e, 0xff, 0xf2, 0xab, 0xca, 0x95, 0x17, 0x21, 0xf1, 0x9f, - 0x80, 0x29, 0xcb, 0x5f, 0x92, 0xf4, 0x4e, 0xc7, 0xf7, 0x38, 0xa2, 0xb2, 0xef, 0x6a, 0x90, 0x33, - 0xd1, 0x59, 0x2f, 0x21, 0x7e, 0xc6, 0x72, 0x36, 0x65, 0xba, 0xd8, 0x6e, 0x2f, 0x61, 0xcd, 0xd9, - 0xb5, 0x70, 0x3b, 0xd1, 0x10, 0xc1, 0x8b, 0x68, 0x2a, 0x2c, 0x09, 0x2e, 0xf8, 0xe0, 0x2a, 0x8f, - 0xce, 0x93, 0x06, 0xf4, 0x06, 0x1e, 0x2f, 0x23, 0xe9, 0x92, 0xde, 0xea, 0x43, 0x52, 0xe3, 0x20, - 0x79, 0xca, 0x70, 0x4c, 0x8c, 0xe1, 0x42, 0x77, 0x19, 0xe6, 0xa8, 0x9d, 0x30, 0x6a, 0x4c, 0x7e, - 0x2f, 0xa1, 0x8f, 0x49, 0xe8, 0xda, 0xa6, 0x30, 0x3b, 0x23, 0x81, 0x25, 0x89, 0x47, 0x8a, 0x18, - 0x1f, 0xe9, 0x23, 0xf3, 0xb9, 0x3c, 0x40, 0xc8, 0x6f, 0xf0, 0xa3, 0xf9, 0x20, 0x10, 0x20, 0x7a, - 0x3b, 0x9b, 0x7f, 0xd4, 0xb9, 0xa8, 0xd4, 0x21, 0x9f, 0x40, 0x7f, 0x43, 0x8a, 0x4f, 0x14, 0x1a, - 0x55, 0xfe, 0x2c, 0xa1, 0xcd, 0xcb, 0xbc, 0xf6, 0x06, 0x0e, 0xee, 0x43, 0xf6, 0x72, 0x1f, 0x4b, - 0x60, 0xfc, 0x0e, 0x62, 0x25, 0x19, 0x6a, 0xab, 0x43, 0xcc, 0xec, 0x4f, 0xc1, 0x71, 0xb5, 0x5c, - 0x5c, 0xac, 0x55, 0x57, 0xef, 0x0b, 0xdf, 0xe1, 0x53, 0x90, 0xc3, 0x93, 0x93, 0x54, 0x60, 0x7b, - 0x5d, 0xc2, 0x3e, 0x90, 0x97, 0x55, 0xec, 0x0d, 0xf5, 0x9f, 0x48, 0xd0, 0xab, 0x09, 0x90, 0x3d, - 0x4c, 0x14, 0x1e, 0x84, 0x50, 0x33, 0x7a, 0x9e, 0x0c, 0x05, 0x77, 0x3c, 0xa4, 0x5c, 0xb2, 0xcb, - 0xda, 0x6a, 0xbc, 0x5b, 0x61, 0x97, 0xee, 0x3f, 0x05, 0x6e, 0x85, 0x5e, 0x82, 0x72, 0x3d, 0xcc, - 0xb5, 0xb6, 0x71, 0xeb, 0x42, 0xc5, 0xf0, 0xf6, 0xd5, 0xe9, 0x26, 0x6c, 0x4f, 0x2a, 0x0f, 0xcc, - 0xbd, 0x3c, 0x30, 0xfc, 0x24, 0x9a, 0x1b, 0xa4, 0xc3, 0x4c, 0x45, 0xe0, 0xf2, 0x87, 0x3e, 0x2e, - 0x55, 0x0e, 0x97, 0xdb, 0x87, 0xa2, 0x9a, 0x0c, 0x96, 0xea, 0x10, 0xb0, 0x20, 0x38, 0x59, 0x5b, - 0x6f, 0x54, 0x6a, 0xd5, 0xe6, 0x46, 0xbd, 0xbc, 0xd8, 0x5c, 0xf0, 0xc0, 0xa9, 0x17, 0x64, 0xf4, - 0x4d, 0x09, 0x26, 0x28, 0x5b, 0x36, 0x7a, 0x6c, 0x00, 0xc1, 0x40, 0x7f, 0x4a, 0xf4, 0x36, 0xe1, - 0xe8, 0x08, 0xbe, 0x20, 0x58, 0x39, 0x11, 0xfd, 0xd4, 0x93, 0x61, 0x82, 0x82, 0xec, 0xad, 0x68, - 0x9d, 0x8e, 0xe8, 0xa5, 0x18, 0x19, 0xd5, 0xcb, 0x2e, 0x18, 0x29, 0x61, 0x00, 0x1b, 0xe9, 0x8f, - 0x2c, 0xcf, 0xcc, 0x52, 0x33, 0xf8, 0x9c, 0xee, 0x6c, 0x13, 0x77, 0x4b, 0xf4, 0x34, 0x91, 0xe5, - 0xc5, 0x9b, 0x20, 0xb7, 0xe7, 0xe6, 0x1e, 0xe0, 0xba, 0x4a, 0x33, 0xa1, 0x97, 0x0b, 0x07, 0xe6, - 0xe4, 0xf4, 0xd3, 0xe7, 0x29, 0x02, 0x9c, 0x35, 0xc8, 0x76, 0x74, 0xdb, 0x61, 0xe3, 0xc7, 0x6d, - 0x89, 0x08, 0x79, 0x0f, 0x15, 0x07, 0xef, 0xa8, 0x84, 0x0c, 0xba, 0x07, 0x66, 0xc2, 0xa9, 0x02, - 0xee, 0xbb, 0xa7, 0x60, 0x82, 0x1d, 0x2b, 0x63, 0x4b, 0xac, 0xde, 0xab, 0xe0, 0xb2, 0xa6, 0x50, - 0x6d, 0xd3, 0xd7, 0x81, 0xff, 0xfb, 0x28, 0x4c, 0xac, 0xe8, 0xb6, 0x63, 0x5a, 0x97, 0xd0, 0xc3, - 0x19, 0x98, 0x38, 0x8b, 0x2d, 0x5b, 0x37, 0x8d, 0x7d, 0xae, 0x06, 0xd7, 0xc0, 0x74, 0xd7, 0xc2, - 0x7b, 0xba, 0xb9, 0x6b, 0x07, 0x8b, 0x33, 0xe1, 0x24, 0x05, 0xc1, 0xa4, 0xb6, 0xeb, 0x6c, 0x9b, - 0x56, 0x10, 0x8d, 0xc2, 0x7b, 0x57, 0x4e, 0x03, 0xd0, 0xe7, 0xaa, 0xb6, 0x83, 0x99, 0x03, 0x45, - 0x28, 0x45, 0x51, 0x20, 0xeb, 0xe8, 0x3b, 0x98, 0x85, 0xa7, 0x25, 0xcf, 0xae, 0x80, 0x49, 0xa8, - 0x37, 0x16, 0x52, 0x4f, 0x56, 0xbd, 0x57, 0xf4, 0x05, 0x19, 0xa6, 0x97, 0xb1, 0xc3, 0x58, 0xb5, - 0xd1, 0x0b, 0x32, 0x42, 0x37, 0x42, 0xb8, 0x63, 0x6c, 0x47, 0xb3, 0xbd, 0xff, 0xfc, 0x25, 0x58, - 0x3e, 0x31, 0x88, 0x95, 0x2b, 0x87, 0x03, 0x65, 0x93, 0xc0, 0x69, 0x4e, 0x85, 0xfa, 0x65, 0xb2, - 0xcc, 0x6c, 0x13, 0x64, 0xff, 0x07, 0xf4, 0x6e, 0x49, 0xf4, 0xd0, 0x31, 0x93, 0xfd, 0x7c, 0xa8, - 0x3e, 0x91, 0xdd, 0xd1, 0xe4, 0x1e, 0xcb, 0xb1, 0x2f, 0x06, 0x7a, 0x98, 0x12, 0x23, 0xa3, 0xfa, - 0xb9, 0x05, 0x8f, 0x2b, 0x0f, 0xe6, 0x24, 0x7d, 0x6d, 0xfc, 0xae, 0x0c, 0xd3, 0xf5, 0x6d, 0xf3, - 0xa2, 0x27, 0xc7, 0x9f, 0x11, 0x03, 0xf6, 0x2a, 0x98, 0xda, 0xeb, 0x01, 0x35, 0x48, 0x88, 0xbe, - 0xa3, 0x1d, 0x3d, 0x57, 0x4e, 0x0a, 0x53, 0x88, 0xb9, 0x91, 0xdf, 0xa0, 0xae, 0x3c, 0x09, 0x26, - 0x18, 0xd7, 0x6c, 0xc9, 0x25, 0x1e, 0x60, 0x2f, 0x73, 0xb8, 0x82, 0x59, 0xbe, 0x82, 0xc9, 0x90, - 0x8f, 0xae, 0x5c, 0xfa, 0xc8, 0xff, 0xb1, 0x44, 0x82, 0x55, 0x78, 0xc0, 0x97, 0x46, 0x00, 0x3c, - 0xfa, 0x5e, 0x46, 0x74, 0x61, 0xd2, 0x97, 0x80, 0xcf, 0xc1, 0x81, 0x6e, 0x7b, 0x19, 0x48, 0x2e, - 0x7d, 0x79, 0xbe, 0x2c, 0x0b, 0x33, 0x8b, 0xfa, 0xe6, 0xa6, 0xdf, 0x49, 0xbe, 0x50, 0xb0, 0x93, - 0x8c, 0x76, 0x07, 0x70, 0xed, 0xdc, 0x5d, 0xcb, 0xc2, 0x86, 0x57, 0x29, 0xd6, 0x9c, 0x7a, 0x52, - 0x95, 0x1b, 0xe0, 0xa8, 0x37, 0x2e, 0x84, 0x3b, 0xca, 0x29, 0xb5, 0x37, 0x19, 0x7d, 0x47, 0x78, - 0x57, 0xcb, 0x93, 0x68, 0xb8, 0x4a, 0x11, 0x0d, 0xf0, 0x0e, 0x98, 0xdd, 0xa6, 0xb9, 0xc9, 0xd4, - 0xdf, 0xeb, 0x2c, 0x4f, 0xf6, 0x04, 0x03, 0x5e, 0xc3, 0xb6, 0xad, 0x6d, 0x61, 0x95, 0xcf, 0xdc, - 0xd3, 0x7c, 0xe5, 0x24, 0x57, 0x5b, 0x89, 0x6d, 0x90, 0x09, 0xd4, 0x64, 0x0c, 0xda, 0x71, 0x06, - 0xb2, 0x4b, 0x7a, 0x07, 0xa3, 0x5f, 0x94, 0x60, 0x4a, 0xc5, 0x2d, 0xd3, 0x68, 0xb9, 0x6f, 0x21, - 0xe7, 0xa0, 0x7f, 0xcc, 0x88, 0x5e, 0xe9, 0xe8, 0xd2, 0x99, 0xf7, 0x69, 0x44, 0xb4, 0x1b, 0xb1, - 0xab, 0x1b, 0x63, 0x49, 0x8d, 0xe1, 0x02, 0x0e, 0x77, 0xea, 0xb1, 0xb9, 0xd9, 0x31, 0x35, 0x6e, - 0xf1, 0xab, 0xd7, 0x14, 0xba, 0x11, 0x0a, 0xde, 0x19, 0x10, 0xd3, 0x59, 0xd7, 0x0d, 0xc3, 0x3f, - 0x64, 0xbc, 0x2f, 0x9d, 0xdf, 0xb7, 0x8d, 0x8d, 0xd3, 0x42, 0xea, 0xce, 0x4a, 0x8f, 0xd0, 0xec, - 0xeb, 0x61, 0xee, 0xfc, 0x25, 0x07, 0xdb, 0x2c, 0x17, 0x2b, 0x36, 0xab, 0xf6, 0xa4, 0x86, 0xa2, - 0x2c, 0xc7, 0xc5, 0x73, 0x89, 0x29, 0x30, 0x99, 0xa8, 0x57, 0x86, 0x98, 0x01, 0x1e, 0x87, 0x42, - 0xb5, 0xb6, 0x58, 0x26, 0xbe, 0x6a, 0x9e, 0xf7, 0xcf, 0x16, 0x7a, 0x91, 0x0c, 0x33, 0xc4, 0x99, - 0xc4, 0x43, 0xe1, 0x5a, 0x81, 0xf9, 0x08, 0xfa, 0xb2, 0xb0, 0x1f, 0x1b, 0xa9, 0x72, 0xb8, 0x80, - 0x68, 0x41, 0x6f, 0xea, 0x9d, 0x5e, 0x41, 0xe7, 0xd4, 0x9e, 0xd4, 0x3e, 0x80, 0xc8, 0x7d, 0x01, - 0xf9, 0x1d, 0x21, 0x67, 0xb6, 0x41, 0xdc, 0x1d, 0x16, 0x2a, 0xbf, 0x2b, 0xc3, 0xb4, 0x3b, 0x49, - 0xf1, 0x40, 0xa9, 0x71, 0xa0, 0x98, 0x46, 0xe7, 0x52, 0xb0, 0x2c, 0xe2, 0xbd, 0x26, 0x6a, 0x24, - 0x7f, 0x29, 0x3c, 0x73, 0x27, 0x22, 0x0a, 0xf1, 0x32, 0x26, 0xfc, 0xde, 0x2f, 0x34, 0x9f, 0x1f, - 0xc0, 0xdc, 0x61, 0xc1, 0xf7, 0xf5, 0x1c, 0xe4, 0x37, 0xba, 0x04, 0xb9, 0x97, 0xcb, 0x22, 0x11, - 0xcb, 0xf7, 0x1d, 0x64, 0x70, 0xcd, 0xac, 0x8e, 0xd9, 0xd2, 0x3a, 0xeb, 0xc1, 0x89, 0xb0, 0x20, - 0x41, 0xb9, 0x9d, 0xf9, 0x36, 0xd2, 0xe3, 0x76, 0xd7, 0xc7, 0x06, 0xf3, 0x26, 0x32, 0x0a, 0x1d, - 0x1a, 0xb9, 0x09, 0x8e, 0xb5, 0x75, 0x5b, 0x3b, 0xdf, 0xc1, 0x65, 0xa3, 0x65, 0x5d, 0xa2, 0xe2, - 0x60, 0xd3, 0xaa, 0x7d, 0x1f, 0x94, 0x3b, 0x21, 0x67, 0x3b, 0x97, 0x3a, 0x74, 0x9e, 0x18, 0x3e, - 0x63, 0x12, 0x59, 0x54, 0xdd, 0xcd, 0xae, 0xd2, 0xbf, 0xc2, 0x2e, 0x4a, 0x13, 0x82, 0xf7, 0x39, - 0x3f, 0x01, 0xf2, 0xa6, 0xa5, 0x6f, 0xe9, 0xf4, 0x7e, 0x9e, 0xb9, 0x7d, 0x31, 0xeb, 0xa8, 0x29, - 0x50, 0x23, 0x59, 0x54, 0x96, 0x55, 0x79, 0x12, 0x4c, 0xe9, 0x3b, 0xda, 0x16, 0xbe, 0x57, 0x37, - 0xe8, 0x89, 0xbe, 0xb9, 0x5b, 0x4f, 0xed, 0x3b, 0x3e, 0xc3, 0xbe, 0xab, 0x41, 0x56, 0xf4, 0x7e, - 0x49, 0x34, 0xb0, 0x0e, 0xa9, 0x1b, 0x05, 0x75, 0x2c, 0xf7, 0x5a, 0xa3, 0x57, 0x09, 0x85, 0xbc, - 0x89, 0x66, 0x2b, 0xfd, 0xc1, 0xfb, 0xf3, 0x12, 0x4c, 0x2e, 0x9a, 0x17, 0x0d, 0xa2, 0xe8, 0xb7, - 0x89, 0xd9, 0xba, 0x7d, 0x0e, 0x39, 0xf2, 0xd7, 0x46, 0xc6, 0x9e, 0x68, 0x20, 0xb5, 0xf5, 0x8a, - 0x8c, 0x80, 0x21, 0xb6, 0xe5, 0x08, 0x5e, 0xe6, 0x17, 0x57, 0x4e, 0xfa, 0x72, 0xfd, 0x13, 0x19, - 0xb2, 0x8b, 0x96, 0xd9, 0x45, 0x6f, 0xcd, 0x24, 0x70, 0x59, 0x68, 0x5b, 0x66, 0xb7, 0x41, 0x6e, - 0xe3, 0x0a, 0x8e, 0x71, 0x84, 0xd3, 0x94, 0xdb, 0x60, 0xb2, 0x6b, 0xda, 0xba, 0xe3, 0x4d, 0x23, - 0xe6, 0x6e, 0x7d, 0x54, 0xdf, 0xd6, 0xbc, 0xce, 0x32, 0xa9, 0x7e, 0x76, 0xb7, 0xd7, 0x26, 0x22, - 0x74, 0xe5, 0xe2, 0x8a, 0xd1, 0xbb, 0x91, 0xac, 0x27, 0x15, 0xbd, 0x38, 0x8c, 0xe4, 0x53, 0x78, - 0x24, 0x1f, 0xdd, 0x47, 0xc2, 0x96, 0xd9, 0x1d, 0xc9, 0x26, 0xe3, 0x2b, 0x7c, 0x54, 0x9f, 0xca, - 0xa1, 0x7a, 0xa3, 0x50, 0x99, 0xe9, 0x23, 0xfa, 0xfe, 0x2c, 0x00, 0x31, 0x33, 0x36, 0xdc, 0x09, - 0x90, 0x98, 0x8d, 0xf5, 0xec, 0x6c, 0x48, 0x96, 0x45, 0x5e, 0x96, 0x8f, 0x8d, 0xb0, 0x62, 0x08, - 0xf9, 0x08, 0x89, 0x16, 0x21, 0xb7, 0xeb, 0x7e, 0x66, 0x12, 0x15, 0x24, 0x41, 0x5e, 0x55, 0xfa, - 0x27, 0xfa, 0xe3, 0x0c, 0xe4, 0x48, 0x82, 0x72, 0x1a, 0x80, 0x0c, 0xec, 0xf4, 0x40, 0x50, 0x86, - 0x0c, 0xe1, 0xa1, 0x14, 0xa2, 0xad, 0x7a, 0x9b, 0x7d, 0xa6, 0x26, 0x73, 0x90, 0xe0, 0xfe, 0x4d, - 0x86, 0x7b, 0x42, 0x8b, 0x19, 0x00, 0xa1, 0x14, 0xf7, 0x6f, 0xf2, 0xb6, 0x8a, 0x37, 0x69, 0xa0, - 0xe4, 0xac, 0x1a, 0x24, 0xf8, 0x7f, 0xaf, 0xfa, 0xd7, 0x6b, 0x79, 0x7f, 0x93, 0x14, 0x77, 0x32, - 0x4c, 0xd4, 0x72, 0x21, 0x28, 0x22, 0x4f, 0x32, 0xf5, 0x26, 0xa3, 0xd7, 0xf9, 0x6a, 0xb3, 0xc8, - 0xa9, 0xcd, 0x2d, 0x09, 0xc4, 0x9b, 0xbe, 0xf2, 0x7c, 0x35, 0x07, 0x53, 0x55, 0xb3, 0xcd, 0x74, - 0x27, 0x34, 0x61, 0xfc, 0x44, 0x2e, 0xd1, 0x84, 0xd1, 0xa7, 0x11, 0xa1, 0x20, 0x77, 0xf3, 0x0a, - 0x22, 0x46, 0x21, 0xac, 0x1f, 0xca, 0x02, 0xe4, 0x89, 0xf6, 0xee, 0xbf, 0xb7, 0x29, 0x8e, 0x04, - 0x11, 0xad, 0xca, 0xfe, 0xfc, 0x0f, 0xa7, 0x63, 0xff, 0x15, 0x72, 0xa4, 0x82, 0x31, 0xbb, 0x3b, - 0x7c, 0x45, 0xa5, 0xf8, 0x8a, 0xca, 0xf1, 0x15, 0xcd, 0xf6, 0x56, 0x34, 0xc9, 0x3a, 0x40, 0x94, - 0x86, 0xa4, 0xaf, 0xe3, 0xff, 0x30, 0x01, 0x50, 0xd5, 0xf6, 0xf4, 0x2d, 0xba, 0x3b, 0xfc, 0x05, - 0x6f, 0xfe, 0xc3, 0xf6, 0x71, 0xff, 0x5b, 0x68, 0x20, 0xbc, 0x0d, 0x26, 0xd8, 0xb8, 0xc7, 0x2a, - 0x72, 0x35, 0x57, 0x91, 0x80, 0x0a, 0x35, 0x4b, 0x1f, 0x70, 0x54, 0x2f, 0x3f, 0x77, 0xc5, 0xac, - 0xd4, 0x73, 0xc5, 0x6c, 0xff, 0x3d, 0x88, 0x88, 0x8b, 0x67, 0xd1, 0x7b, 0x84, 0x3d, 0xfa, 0x43, - 0xfc, 0x84, 0x6a, 0x14, 0xd1, 0x04, 0x9f, 0x00, 0x13, 0xa6, 0xbf, 0xa1, 0x2d, 0x47, 0xae, 0x83, - 0x55, 0x8c, 0x4d, 0x53, 0xf5, 0x72, 0x0a, 0x6e, 0x7e, 0x09, 0xf1, 0x31, 0x96, 0x43, 0x33, 0x27, - 0x97, 0xbd, 0xa0, 0x53, 0x6e, 0x3d, 0xce, 0xe9, 0xce, 0xf6, 0xaa, 0x6e, 0x5c, 0xb0, 0xd1, 0x7f, - 0x16, 0xb3, 0x20, 0x43, 0xf8, 0x4b, 0xc9, 0xf0, 0xe7, 0x63, 0x76, 0xd4, 0x79, 0xd4, 0xee, 0x8c, - 0xa2, 0xd2, 0x9f, 0xdb, 0x08, 0x00, 0x6f, 0x87, 0x3c, 0x65, 0x94, 0x75, 0xa2, 0x67, 0x22, 0xf1, - 0xf3, 0x29, 0xa9, 0xec, 0x0f, 0xf4, 0x6e, 0x1f, 0xc7, 0xb3, 0x1c, 0x8e, 0x0b, 0x07, 0xe2, 0x2c, - 0x75, 0x48, 0xcf, 0x3c, 0x1e, 0x26, 0x98, 0xa4, 0x95, 0xb9, 0x70, 0x2b, 0x2e, 0x1c, 0x51, 0x00, - 0xf2, 0x6b, 0xe6, 0x1e, 0x6e, 0x98, 0x85, 0x8c, 0xfb, 0xec, 0xf2, 0xd7, 0x30, 0x0b, 0x12, 0x7a, - 0xe5, 0x24, 0x4c, 0xfa, 0xd1, 0x7e, 0x3e, 0x2f, 0x41, 0xa1, 0x64, 0x61, 0xcd, 0xc1, 0x4b, 0x96, - 0xb9, 0x43, 0x6b, 0x24, 0xee, 0x1d, 0xfa, 0xeb, 0xc2, 0x2e, 0x1e, 0x7e, 0x14, 0x9e, 0xde, 0xc2, - 0x22, 0xb0, 0xa4, 0x8b, 0x90, 0x92, 0xb7, 0x08, 0x89, 0xde, 0x22, 0xe4, 0xf2, 0x21, 0x5a, 0x4a, - 0xfa, 0x4d, 0xed, 0xd3, 0x12, 0xe4, 0x4a, 0x1d, 0xd3, 0xc0, 0xe1, 0x23, 0x4c, 0x03, 0xcf, 0xca, - 0xf4, 0xdf, 0x89, 0x40, 0xcf, 0x94, 0x44, 0x6d, 0x8d, 0x40, 0x00, 0x6e, 0xd9, 0x82, 0xb2, 0x15, - 0x1b, 0xa4, 0x62, 0x49, 0xa7, 0x2f, 0xd0, 0x6f, 0x4a, 0x30, 0x45, 0xe3, 0xe2, 0x14, 0x3b, 0x1d, - 0xf4, 0xa8, 0x40, 0xa8, 0x7d, 0x22, 0x26, 0xa1, 0xdf, 0x11, 0x76, 0xd1, 0xf7, 0x6b, 0xe5, 0xd3, - 0x4e, 0x10, 0x20, 0x28, 0x99, 0xc7, 0xb8, 0xd8, 0x5e, 0xda, 0x40, 0x86, 0xd2, 0x17, 0xf5, 0x9f, - 0x4b, 0xae, 0x01, 0x60, 0x5c, 0x58, 0xb7, 0xf0, 0x9e, 0x8e, 0x2f, 0xa2, 0x2b, 0x03, 0x61, 0xef, - 0x0f, 0xfa, 0xf1, 0x26, 0xe1, 0x45, 0x9c, 0x10, 0xc9, 0xc8, 0xad, 0xac, 0xe9, 0x4e, 0x90, 0x89, - 0xf5, 0xe2, 0xbd, 0x91, 0x58, 0x42, 0x64, 0xd4, 0x70, 0x76, 0xc1, 0x35, 0x9b, 0x68, 0x2e, 0xd2, - 0x17, 0xec, 0x87, 0x26, 0x60, 0x72, 0xc3, 0xb0, 0xbb, 0x1d, 0xcd, 0xde, 0x46, 0xdf, 0x97, 0x21, - 0x4f, 0x6f, 0x0b, 0x43, 0x3f, 0xc1, 0xc5, 0x16, 0xf8, 0xd9, 0x5d, 0x6c, 0x79, 0x2e, 0x38, 0xf4, - 0xa5, 0xff, 0x65, 0xe6, 0xe8, 0xfd, 0xb2, 0xe8, 0x24, 0xd5, 0x2b, 0x34, 0x74, 0x6d, 0x7c, 0xff, - 0xe3, 0xec, 0x5d, 0xbd, 0xe5, 0xec, 0x5a, 0xfe, 0xd5, 0xd8, 0x8f, 0x13, 0xa3, 0xb2, 0x4e, 0xff, - 0x52, 0xfd, 0xdf, 0x91, 0x06, 0x13, 0x2c, 0x71, 0xdf, 0x76, 0xd2, 0xfe, 0xf3, 0xb7, 0x27, 0x21, - 0xaf, 0x59, 0x8e, 0x6e, 0x3b, 0x6c, 0x83, 0x95, 0xbd, 0xb9, 0xdd, 0x25, 0x7d, 0xda, 0xb0, 0x3a, - 0x5e, 0x14, 0x12, 0x3f, 0x01, 0xfd, 0xae, 0xd0, 0xfc, 0x31, 0xbe, 0xe6, 0xc9, 0x20, 0xbf, 0x77, - 0x88, 0x35, 0xea, 0xcb, 0xe1, 0x32, 0xb5, 0xd8, 0x28, 0x37, 0x69, 0xd0, 0x0a, 0x3f, 0x3e, 0x45, - 0x1b, 0xbd, 0x4b, 0x0e, 0xad, 0xdf, 0x5d, 0xe2, 0xc6, 0x08, 0x26, 0xc5, 0x60, 0x8c, 0xf0, 0x13, - 0x62, 0x76, 0xab, 0xb9, 0x45, 0x58, 0x59, 0x7c, 0x11, 0xf6, 0xb7, 0x84, 0x77, 0x93, 0x7c, 0x51, - 0x0e, 0x58, 0x03, 0x8c, 0xbb, 0x4d, 0xe8, 0x03, 0x42, 0x3b, 0x43, 0x83, 0x4a, 0x3a, 0x44, 0xd8, - 0xde, 0x38, 0x01, 0x13, 0xcb, 0x5a, 0xa7, 0x83, 0xad, 0x4b, 0xee, 0x90, 0x54, 0xf0, 0x38, 0x5c, - 0xd3, 0x0c, 0x7d, 0x13, 0xdb, 0x4e, 0x7c, 0x67, 0xf9, 0x1e, 0xe1, 0x48, 0xb5, 0xac, 0x8c, 0xf9, - 0x5e, 0xfa, 0x11, 0x32, 0xbf, 0x19, 0xb2, 0xba, 0xb1, 0x69, 0xb2, 0x2e, 0xb3, 0x77, 0xd5, 0xde, - 0xfb, 0x99, 0x4c, 0x5d, 0x48, 0x46, 0xc1, 0x60, 0xb5, 0x82, 0x5c, 0xa4, 0xdf, 0x73, 0xfe, 0x76, - 0x16, 0x66, 0x3d, 0x26, 0x2a, 0x46, 0x1b, 0x3f, 0x10, 0x5e, 0x8a, 0x79, 0x51, 0x56, 0xf4, 0x38, - 0x58, 0x6f, 0x7d, 0x08, 0xa9, 0x08, 0x91, 0x36, 0x00, 0x5a, 0x9a, 0x83, 0xb7, 0x4c, 0x4b, 0xf7, - 0xfb, 0xc3, 0x27, 0x26, 0xa1, 0x56, 0xa2, 0x7f, 0x5f, 0x52, 0x43, 0x74, 0x94, 0x3b, 0x61, 0x1a, - 0xfb, 0xe7, 0xef, 0xbd, 0xa5, 0x9a, 0x58, 0xbc, 0xc2, 0xf9, 0xd1, 0x9f, 0x0b, 0x9d, 0x3a, 0x13, - 0xa9, 0x66, 0x32, 0xcc, 0x9a, 0xc3, 0xb5, 0xa1, 0x8d, 0xea, 0x5a, 0x51, 0xad, 0xaf, 0x14, 0x57, - 0x57, 0x2b, 0xd5, 0x65, 0x3f, 0xf0, 0x8b, 0x02, 0x73, 0x8b, 0xb5, 0x73, 0xd5, 0x50, 0x64, 0x9e, - 0x2c, 0x5a, 0x87, 0x49, 0x4f, 0x5e, 0xfd, 0x7c, 0x31, 0xc3, 0x32, 0x63, 0xbe, 0x98, 0xa1, 0x24, - 0xd7, 0x38, 0xd3, 0x5b, 0xbe, 0x83, 0x0e, 0x79, 0x46, 0x7f, 0xa4, 0x41, 0x8e, 0xac, 0xa9, 0xa3, - 0x77, 0x90, 0x6d, 0xc0, 0x6e, 0x47, 0x6b, 0x61, 0xb4, 0x93, 0xc0, 0x1a, 0xf7, 0xae, 0x4e, 0x90, - 0xf6, 0x5d, 0x9d, 0x40, 0x1e, 0x99, 0xd5, 0x77, 0xbc, 0xdf, 0x3a, 0xbe, 0x4a, 0xb3, 0xf0, 0x07, - 0xb4, 0x62, 0x77, 0x57, 0xe8, 0xf2, 0x3f, 0x63, 0x33, 0x42, 0x25, 0xa3, 0x79, 0x4a, 0x66, 0x89, - 0x8a, 0xed, 0xc3, 0xc4, 0x71, 0x34, 0x86, 0xeb, 0xbd, 0xb3, 0x90, 0xab, 0x77, 0x3b, 0xba, 0x83, - 0x5e, 0x2a, 0x8d, 0x04, 0x33, 0x7a, 0xdd, 0x85, 0x3c, 0xf0, 0xba, 0x8b, 0x60, 0xd7, 0x35, 0x2b, - 0xb0, 0xeb, 0xda, 0xc0, 0x0f, 0x38, 0xfc, 0xae, 0xeb, 0x6d, 0x2c, 0x78, 0x1b, 0xdd, 0xb3, 0x7d, - 0x74, 0x1f, 0x91, 0x92, 0x6a, 0xf5, 0x89, 0x0a, 0x78, 0xe6, 0xf1, 0x2c, 0x38, 0x19, 0x40, 0x7e, - 0xa1, 0xd6, 0x68, 0xd4, 0xd6, 0x0a, 0x47, 0x48, 0x54, 0x9b, 0xda, 0x3a, 0x0d, 0x15, 0x53, 0xa9, - 0x56, 0xcb, 0x6a, 0x41, 0x22, 0xe1, 0xd2, 0x2a, 0x8d, 0xd5, 0x72, 0x41, 0xe6, 0x63, 0x9f, 0xc7, - 0x9a, 0xdf, 0x7c, 0xd9, 0x69, 0xaa, 0x97, 0x98, 0x21, 0x1e, 0xcd, 0x4f, 0xfa, 0xca, 0xf5, 0x6b, - 0x32, 0xe4, 0xd6, 0xb0, 0xb5, 0x85, 0xd1, 0xcf, 0x26, 0xd8, 0xe4, 0xdb, 0xd4, 0x2d, 0x9b, 0x06, - 0x97, 0x0b, 0x36, 0xf9, 0xc2, 0x69, 0xca, 0x75, 0x30, 0x6b, 0xe3, 0x96, 0x69, 0xb4, 0xbd, 0x4c, - 0xb4, 0x3f, 0xe2, 0x13, 0xf9, 0x7b, 0xe7, 0x05, 0x20, 0x23, 0x8c, 0x8e, 0x64, 0xa7, 0x2e, 0x09, - 0x30, 0xfd, 0x4a, 0x4d, 0x1f, 0x98, 0xef, 0xc8, 0xee, 0x4f, 0xdd, 0x4b, 0xe8, 0x25, 0xc2, 0xbb, - 0xaf, 0x37, 0x41, 0x9e, 0xa8, 0xa9, 0x37, 0x46, 0xf7, 0xef, 0x8f, 0x59, 0x1e, 0x65, 0x01, 0x8e, - 0xd9, 0xb8, 0x83, 0x5b, 0x0e, 0x6e, 0xbb, 0x4d, 0x57, 0x1d, 0xd8, 0x29, 0xec, 0xcf, 0x8e, 0xfe, - 0x34, 0x0c, 0xe0, 0x1d, 0x3c, 0x80, 0xd7, 0xf7, 0x11, 0xa5, 0x5b, 0xa1, 0x68, 0x5b, 0xd9, 0xad, - 0x46, 0xbd, 0x63, 0xfa, 0x8b, 0xe2, 0xde, 0xbb, 0xfb, 0x6d, 0xdb, 0xd9, 0xe9, 0x90, 0x6f, 0xec, - 0x80, 0x81, 0xf7, 0xae, 0xcc, 0xc3, 0x84, 0x66, 0x5c, 0x22, 0x9f, 0xb2, 0x31, 0xb5, 0xf6, 0x32, - 0xa1, 0x57, 0xfa, 0xc8, 0xdf, 0xc5, 0x21, 0xff, 0x58, 0x31, 0x76, 0xd3, 0x07, 0xfe, 0x17, 0x26, - 0x20, 0xb7, 0xae, 0xd9, 0x0e, 0x46, 0xff, 0x97, 0x2c, 0x8a, 0xfc, 0xf5, 0x30, 0xb7, 0x69, 0xb6, - 0x76, 0x6d, 0xdc, 0xe6, 0x1b, 0x65, 0x4f, 0xea, 0x28, 0x30, 0x57, 0x6e, 0x84, 0x82, 0x97, 0xc8, - 0xc8, 0x7a, 0xdb, 0xf0, 0xfb, 0xd2, 0x49, 0x24, 0x6d, 0x7b, 0x5d, 0xb3, 0x9c, 0xda, 0x26, 0x49, - 0xf3, 0x23, 0x69, 0x87, 0x13, 0x39, 0xe8, 0xf3, 0x31, 0xd0, 0x4f, 0x44, 0x43, 0x3f, 0x29, 0x00, - 0xbd, 0x52, 0x84, 0xc9, 0x4d, 0xbd, 0x83, 0xc9, 0x0f, 0x53, 0xe4, 0x87, 0x7e, 0x63, 0x12, 0x91, - 0xbd, 0x3f, 0x26, 0x2d, 0xe9, 0x1d, 0xac, 0xfa, 0xbf, 0x79, 0x13, 0x19, 0x08, 0x26, 0x32, 0xab, - 0xd4, 0x9f, 0xd6, 0x35, 0xbc, 0x0c, 0x6d, 0x07, 0x7b, 0x8b, 0x6f, 0x06, 0x3b, 0xdc, 0xd2, 0xd6, - 0x1c, 0x8d, 0x80, 0x31, 0xa3, 0x92, 0x67, 0xde, 0x2f, 0x44, 0xee, 0xf5, 0x0b, 0x79, 0x8e, 0x9c, - 0xac, 0x47, 0xf4, 0x98, 0x8d, 0x68, 0x51, 0xe7, 0x3d, 0x80, 0xa8, 0xa5, 0xe8, 0xbf, 0xbb, 0xc0, - 0xb4, 0x34, 0x0b, 0x3b, 0xeb, 0x61, 0x4f, 0x8c, 0x9c, 0xca, 0x27, 0x12, 0x57, 0x3e, 0xbb, 0xae, - 0xed, 0x60, 0x52, 0x58, 0xc9, 0xfd, 0xc6, 0x5c, 0xb4, 0xf6, 0xa5, 0x07, 0xfd, 0x6f, 0x6e, 0xd4, - 0xfd, 0x6f, 0xbf, 0x3a, 0xa6, 0xdf, 0x0c, 0x5f, 0x93, 0x05, 0xb9, 0xb4, 0xeb, 0x3c, 0xa2, 0xbb, - 0xdf, 0x1f, 0x08, 0xfb, 0xb9, 0xb0, 0xfe, 0x2c, 0xf2, 0xa2, 0xf9, 0x31, 0xf5, 0xbe, 0x09, 0xb5, - 0x44, 0xcc, 0x9f, 0x26, 0xaa, 0x6e, 0x63, 0xb8, 0xd7, 0x40, 0xf6, 0x1d, 0x2c, 0x1f, 0xcc, 0x1c, - 0xdc, 0x34, 0x47, 0xb4, 0x7f, 0x0a, 0xf5, 0x0c, 0xfe, 0xbb, 0xd7, 0xf1, 0x64, 0xb9, 0x58, 0x7d, - 0x64, 0x7b, 0x9d, 0x88, 0x72, 0x46, 0xa5, 0x2f, 0xe8, 0x65, 0xc2, 0x6e, 0xe7, 0x54, 0x6c, 0xb1, - 0xae, 0x84, 0xc9, 0x6c, 0x2a, 0xb1, 0xcb, 0x44, 0x63, 0x8a, 0x4d, 0x1f, 0xb0, 0x6f, 0x87, 0x5d, - 0x05, 0x8b, 0x07, 0x46, 0x0c, 0xbd, 0x4a, 0x78, 0x3b, 0x8a, 0x56, 0x7b, 0xc0, 0x7a, 0x61, 0x32, - 0x79, 0x8b, 0x6d, 0x56, 0xc5, 0x16, 0x9c, 0xbe, 0xc4, 0xbf, 0x25, 0x43, 0x9e, 0x6e, 0x41, 0xa2, - 0x37, 0x67, 0x12, 0xdc, 0xc2, 0xee, 0xf0, 0x2e, 0x84, 0xfe, 0x7b, 0x92, 0x35, 0x07, 0xce, 0xd5, - 0x30, 0x9b, 0xc8, 0xd5, 0x90, 0x3f, 0xc7, 0x29, 0xd0, 0x8e, 0x68, 0x1d, 0x53, 0x9e, 0x4e, 0x26, - 0x69, 0x61, 0x7d, 0x19, 0x4a, 0x1f, 0xef, 0xe7, 0xe5, 0x60, 0x86, 0x16, 0x7d, 0x4e, 0x6f, 0x6f, - 0x61, 0x07, 0xbd, 0x4b, 0xfa, 0xe1, 0x41, 0x5d, 0xa9, 0xc2, 0xcc, 0x45, 0xc2, 0xf6, 0xaa, 0x76, - 0xc9, 0xdc, 0x75, 0xd8, 0xca, 0xc5, 0x8d, 0xb1, 0xeb, 0x1e, 0xb4, 0x9e, 0xf3, 0xf4, 0x0f, 0x95, - 0xfb, 0xdf, 0x95, 0x31, 0x5d, 0xf0, 0xa7, 0x0e, 0x5c, 0x79, 0x62, 0x64, 0x85, 0x93, 0x94, 0x93, - 0x90, 0xdf, 0xd3, 0xf1, 0xc5, 0x4a, 0x9b, 0x59, 0xb7, 0xec, 0x0d, 0xfd, 0xbe, 0xf0, 0xbe, 0x6d, - 0x18, 0x6e, 0xc6, 0x4b, 0xba, 0x5a, 0x28, 0xb6, 0x7b, 0x3b, 0x90, 0xad, 0x31, 0x9c, 0x29, 0xe6, - 0x2f, 0xeb, 0x2c, 0x25, 0x50, 0xc4, 0x28, 0xc3, 0x99, 0x0f, 0xe5, 0x11, 0x7b, 0x62, 0x85, 0x0a, - 0x60, 0xc4, 0xf7, 0x78, 0x8a, 0xc5, 0x97, 0x18, 0x50, 0x74, 0xfa, 0x92, 0x7f, 0x9d, 0x0c, 0x53, - 0x75, 0xec, 0x2c, 0xe9, 0xb8, 0xd3, 0xb6, 0x91, 0x75, 0x70, 0xd3, 0xe8, 0x66, 0xc8, 0x6f, 0x12, - 0x62, 0x83, 0xce, 0x2d, 0xb0, 0x6c, 0xe8, 0x35, 0x92, 0xe8, 0x8e, 0x30, 0x5b, 0x7d, 0xf3, 0xb8, - 0x1d, 0x09, 0x4c, 0x62, 0x1e, 0xbd, 0xf1, 0x25, 0x8f, 0x21, 0xb0, 0xad, 0x0c, 0x33, 0xec, 0x76, - 0xbf, 0x62, 0x47, 0xdf, 0x32, 0xd0, 0xee, 0x08, 0x5a, 0x88, 0x72, 0x0b, 0xe4, 0x34, 0x97, 0x1a, - 0xdb, 0x7a, 0x45, 0x7d, 0x3b, 0x4f, 0x52, 0x9e, 0x4a, 0x33, 0x26, 0x08, 0x23, 0x19, 0x28, 0xb6, - 0xc7, 0xf3, 0x18, 0xc3, 0x48, 0x0e, 0x2c, 0x3c, 0x7d, 0xc4, 0xbe, 0x22, 0xc3, 0x71, 0xc6, 0xc0, - 0x59, 0x6c, 0x39, 0x7a, 0x4b, 0xeb, 0x50, 0xe4, 0x1e, 0xca, 0x8c, 0x02, 0xba, 0x15, 0x98, 0xdd, - 0x0b, 0x93, 0x65, 0x10, 0x9e, 0xe9, 0x0b, 0x21, 0xc7, 0x80, 0xca, 0xff, 0x98, 0x20, 0x1c, 0x1f, - 0x27, 0x55, 0x8e, 0xe6, 0x18, 0xc3, 0xf1, 0x09, 0x33, 0x91, 0x3e, 0xc4, 0x2f, 0x66, 0xa1, 0x79, - 0x82, 0xee, 0xf3, 0x0b, 0xc2, 0xd8, 0x6e, 0xc0, 0x34, 0xc1, 0x92, 0xfe, 0xc8, 0x96, 0x21, 0x62, - 0x94, 0xd8, 0xef, 0x77, 0xd8, 0x85, 0x61, 0xfe, 0xbf, 0x6a, 0x98, 0x0e, 0x3a, 0x07, 0x10, 0x7c, - 0x0a, 0x77, 0xd2, 0x99, 0xa8, 0x4e, 0x5a, 0x12, 0xeb, 0xa4, 0xdf, 0x24, 0x1c, 0x2c, 0xa5, 0x3f, - 0xdb, 0x07, 0x57, 0x0f, 0xb1, 0x30, 0x19, 0x83, 0x4b, 0x4f, 0x5f, 0x2f, 0x5e, 0x99, 0xed, 0xbd, - 0xc6, 0xfd, 0xa3, 0x23, 0x99, 0x4f, 0x85, 0xfb, 0x03, 0xb9, 0xa7, 0x3f, 0x38, 0x80, 0x25, 0x7d, - 0x03, 0x1c, 0xa5, 0x45, 0x94, 0x7c, 0xb6, 0x72, 0x34, 0x14, 0x44, 0x4f, 0x32, 0xfa, 0xd8, 0x10, - 0x4a, 0x30, 0xe8, 0x8e, 0xf9, 0xb8, 0x4e, 0x2e, 0x99, 0xb1, 0x9b, 0x54, 0x41, 0x0e, 0xef, 0x6a, - 0xfa, 0x6f, 0x66, 0xa9, 0xb5, 0xbb, 0x41, 0xee, 0x74, 0x43, 0x7f, 0x91, 0x1d, 0xc5, 0x88, 0x70, - 0x37, 0x64, 0x89, 0x8b, 0xbb, 0x1c, 0xb9, 0xa4, 0x11, 0x14, 0x19, 0x5c, 0xb8, 0x87, 0x1f, 0x70, - 0x56, 0x8e, 0xa8, 0xe4, 0x4f, 0xe5, 0x46, 0x38, 0x7a, 0x5e, 0x6b, 0x5d, 0xd8, 0xb2, 0xcc, 0x5d, - 0x72, 0xfb, 0x95, 0xc9, 0xae, 0xd1, 0x22, 0xd7, 0x11, 0xf2, 0x1f, 0x94, 0x5b, 0x3d, 0xd3, 0x21, - 0x37, 0xc8, 0x74, 0x58, 0x39, 0xc2, 0x8c, 0x07, 0xe5, 0xf1, 0x7e, 0xa7, 0x93, 0x8f, 0xed, 0x74, - 0x56, 0x8e, 0x78, 0xdd, 0x8e, 0xb2, 0x08, 0x93, 0x6d, 0x7d, 0x8f, 0x6c, 0x55, 0x93, 0x59, 0xd7, - 0xa0, 0xa3, 0xcb, 0x8b, 0xfa, 0x1e, 0xdd, 0xd8, 0x5e, 0x39, 0xa2, 0xfa, 0x7f, 0x2a, 0xcb, 0x30, - 0x45, 0xb6, 0x05, 0x08, 0x99, 0xc9, 0x44, 0xc7, 0x92, 0x57, 0x8e, 0xa8, 0xc1, 0xbf, 0xae, 0xf5, - 0x91, 0x25, 0x67, 0x3f, 0xee, 0xf2, 0xb6, 0xdb, 0x33, 0x89, 0xb6, 0xdb, 0x5d, 0x59, 0xd0, 0x0d, - 0xf7, 0x93, 0x90, 0x6b, 0x11, 0x09, 0x4b, 0x4c, 0xc2, 0xf4, 0x55, 0xb9, 0x03, 0xb2, 0x3b, 0x9a, - 0xe5, 0x4d, 0x9e, 0xaf, 0x1f, 0x4c, 0x77, 0x4d, 0xb3, 0x2e, 0xb8, 0x08, 0xba, 0x7f, 0x2d, 0x4c, - 0x40, 0x8e, 0x08, 0xce, 0x7f, 0x40, 0x6f, 0xcd, 0x52, 0x33, 0xa4, 0x64, 0x1a, 0xee, 0xb0, 0xdf, - 0x30, 0xbd, 0x03, 0x32, 0xbf, 0x9f, 0x19, 0x8d, 0x05, 0xd9, 0xf7, 0xde, 0x73, 0x39, 0xf2, 0xde, - 0xf3, 0x9e, 0x0b, 0x78, 0xb3, 0xbd, 0x17, 0xf0, 0x06, 0xcb, 0x07, 0xb9, 0xc1, 0x8e, 0x2a, 0x7f, - 0x3a, 0x84, 0xe9, 0xd2, 0x2b, 0x88, 0xe8, 0x19, 0x78, 0x47, 0x37, 0x42, 0x75, 0xf6, 0x5e, 0x13, - 0x76, 0x4a, 0x49, 0x8d, 0x9a, 0x01, 0xec, 0xa5, 0xdf, 0x37, 0xfd, 0x66, 0x16, 0x4e, 0xd1, 0x6b, - 0x9e, 0xf7, 0x70, 0xc3, 0xe4, 0xef, 0x9b, 0x44, 0x9f, 0x1a, 0x89, 0xd2, 0xf4, 0x19, 0x70, 0xe4, - 0xbe, 0x03, 0xce, 0xbe, 0x43, 0xca, 0xd9, 0x01, 0x87, 0x94, 0x73, 0xc9, 0x56, 0x0e, 0x3f, 0x18, - 0xd6, 0x9f, 0x75, 0x5e, 0x7f, 0x6e, 0x8f, 0x00, 0xa8, 0x9f, 0x5c, 0x46, 0x62, 0xdf, 0xbc, 0xc3, - 0xd7, 0x94, 0x3a, 0xa7, 0x29, 0x77, 0x0d, 0xcf, 0x48, 0xfa, 0xda, 0xf2, 0x7b, 0x59, 0xb8, 0x2c, - 0x60, 0xa6, 0x8a, 0x2f, 0x32, 0x45, 0xf9, 0xfc, 0x48, 0x14, 0x25, 0x79, 0x0c, 0x84, 0xb4, 0x35, - 0xe6, 0x8f, 0x85, 0xcf, 0x0e, 0xf5, 0x02, 0xe5, 0xcb, 0x26, 0x42, 0x59, 0x4e, 0x42, 0x9e, 0xf6, - 0x30, 0x0c, 0x1a, 0xf6, 0x96, 0xb0, 0xbb, 0x11, 0x3b, 0x71, 0x24, 0xca, 0xdb, 0x18, 0xf4, 0x87, - 0xad, 0x6b, 0x34, 0x76, 0x2d, 0xa3, 0x62, 0x38, 0x26, 0xfa, 0xf9, 0x91, 0x28, 0x8e, 0xef, 0x0d, - 0x27, 0x0f, 0xe3, 0x0d, 0x37, 0xd4, 0x2a, 0x87, 0x57, 0x83, 0x43, 0x59, 0xe5, 0x88, 0x28, 0x3c, - 0x7d, 0xfc, 0xde, 0x2e, 0xc3, 0x49, 0x36, 0xd9, 0x5a, 0xe0, 0x2d, 0x44, 0x74, 0xdf, 0x28, 0x80, - 0x3c, 0xee, 0x99, 0x49, 0xec, 0x96, 0x33, 0xf2, 0xc2, 0x9f, 0x94, 0x8a, 0xbd, 0xdf, 0x81, 0x9b, - 0x0e, 0xf6, 0x70, 0x38, 0x12, 0xa4, 0xc4, 0xae, 0x75, 0x48, 0xc0, 0x46, 0xfa, 0x98, 0xbd, 0x50, - 0x86, 0x3c, 0xbb, 0xde, 0x7f, 0x23, 0x15, 0x87, 0x09, 0x3e, 0xca, 0xb3, 0xc0, 0x8e, 0x5c, 0xe2, - 0x4b, 0xee, 0xd3, 0xdb, 0x8b, 0x3b, 0xa4, 0x5b, 0xec, 0xbf, 0x23, 0xc1, 0x74, 0x1d, 0x3b, 0x25, - 0xcd, 0xb2, 0x74, 0x6d, 0x6b, 0x54, 0x1e, 0xdf, 0xa2, 0xde, 0xc3, 0xe8, 0xbb, 0x19, 0xd1, 0xf3, - 0x34, 0xfe, 0x42, 0xb8, 0xc7, 0x6a, 0x44, 0x2c, 0xc1, 0x87, 0x85, 0xce, 0xcc, 0x0c, 0xa2, 0x36, - 0x06, 0x8f, 0x6d, 0x09, 0x26, 0xbc, 0xb3, 0x78, 0x37, 0x73, 0xe7, 0x33, 0xb7, 0x9d, 0x1d, 0xef, - 0x18, 0x0c, 0x79, 0xde, 0x7f, 0x06, 0x0c, 0xbd, 0x22, 0xa1, 0xa3, 0x7c, 0xfc, 0x41, 0xc2, 0x64, - 0x6d, 0x2c, 0x89, 0x3b, 0xfc, 0x61, 0x1d, 0x1d, 0xfc, 0x9d, 0x09, 0xb6, 0x1c, 0xb9, 0xaa, 0x39, - 0xf8, 0x01, 0xf4, 0x05, 0x19, 0x26, 0xea, 0xd8, 0x71, 0xc7, 0x5b, 0xee, 0x72, 0xd3, 0x61, 0x35, - 0x5c, 0x09, 0xad, 0x78, 0x4c, 0xb1, 0x35, 0x8c, 0x7b, 0x60, 0xaa, 0x6b, 0x99, 0x2d, 0x6c, 0xdb, - 0x6c, 0xf5, 0x22, 0xec, 0xa8, 0xd6, 0x6f, 0xf4, 0x27, 0xac, 0xcd, 0xaf, 0x7b, 0xff, 0xa8, 0xc1, - 0xef, 0x49, 0xcd, 0x00, 0x4a, 0x89, 0x55, 0x70, 0xdc, 0x66, 0x40, 0x5c, 0xe1, 0xe9, 0x03, 0xfd, - 0x59, 0x19, 0x66, 0xea, 0xd8, 0xf1, 0xa5, 0x98, 0x60, 0x93, 0x23, 0x1a, 0x5e, 0x0e, 0x4a, 0xf9, - 0x60, 0x50, 0x8a, 0x5f, 0x0d, 0xc8, 0x4b, 0xd3, 0x27, 0x36, 0xc6, 0xab, 0x01, 0xc5, 0x38, 0x18, - 0xc3, 0xf1, 0xb5, 0x47, 0xc3, 0x14, 0xe1, 0x85, 0x34, 0xd8, 0x5f, 0xca, 0x06, 0x8d, 0xf7, 0x8b, - 0x29, 0x35, 0xde, 0x3b, 0x21, 0xb7, 0xa3, 0x59, 0x17, 0x6c, 0xd2, 0x70, 0xa7, 0x45, 0xcc, 0xf6, - 0x35, 0x37, 0xbb, 0x4a, 0xff, 0xea, 0xef, 0xa7, 0x99, 0x4b, 0xe6, 0xa7, 0xf9, 0xb0, 0x94, 0x68, - 0x24, 0xa4, 0x73, 0x87, 0x11, 0x36, 0xf9, 0x04, 0xe3, 0x66, 0x4c, 0xd9, 0xe9, 0x2b, 0xc7, 0x43, - 0x32, 0x4c, 0xba, 0xe3, 0x36, 0xb1, 0xc7, 0xcf, 0x1d, 0x5c, 0x1d, 0xfa, 0x1b, 0xfa, 0x09, 0x7b, - 0x60, 0x4f, 0x22, 0xa3, 0x33, 0xef, 0x13, 0xf4, 0xc0, 0x71, 0x85, 0xa7, 0x8f, 0xc7, 0x3b, 0x29, - 0x1e, 0xa4, 0x3d, 0xa0, 0x37, 0xc8, 0x20, 0x2f, 0x63, 0x67, 0xdc, 0x56, 0xe4, 0xdb, 0x84, 0x43, - 0x1c, 0x71, 0x02, 0x23, 0x3c, 0xcf, 0x2f, 0xe3, 0xd1, 0x34, 0x20, 0xb1, 0xd8, 0x46, 0x42, 0x0c, - 0xa4, 0x8f, 0xda, 0x7b, 0x29, 0x6a, 0x74, 0x73, 0xe1, 0xe7, 0x46, 0xd0, 0xab, 0x8e, 0x77, 0xe1, - 0xc3, 0x13, 0x20, 0xa1, 0x71, 0x58, 0xed, 0xad, 0x5f, 0xe1, 0x63, 0xb9, 0x8a, 0x0f, 0xdc, 0xc6, - 0xbe, 0x8d, 0x5b, 0x17, 0x70, 0x1b, 0xfd, 0xf4, 0xc1, 0xa1, 0x3b, 0x05, 0x13, 0x2d, 0x4a, 0x8d, - 0x80, 0x37, 0xa9, 0x7a, 0xaf, 0x09, 0xee, 0x95, 0xe6, 0x3b, 0x22, 0xfa, 0xfb, 0x18, 0xef, 0x95, - 0x16, 0x28, 0x7e, 0x0c, 0x66, 0x0b, 0x9d, 0x65, 0x54, 0x5a, 0xa6, 0x81, 0xfe, 0xcb, 0xc1, 0x61, - 0xb9, 0x0a, 0xa6, 0xf4, 0x96, 0x69, 0x90, 0x30, 0x14, 0xde, 0x21, 0x20, 0x3f, 0xc1, 0xfb, 0x5a, - 0xde, 0x31, 0xef, 0xd7, 0xd9, 0xae, 0x79, 0x90, 0x30, 0xac, 0x31, 0xe1, 0xb2, 0x7e, 0x58, 0xc6, - 0x44, 0x9f, 0xb2, 0xd3, 0x87, 0xec, 0x63, 0x81, 0x77, 0x1b, 0xed, 0x0a, 0x1f, 0x11, 0xab, 0xc0, - 0xc3, 0x0c, 0x67, 0xe1, 0x5a, 0x1c, 0xca, 0x70, 0x16, 0xc3, 0xc0, 0x18, 0x6e, 0xac, 0x08, 0x70, - 0x4c, 0x7d, 0x0d, 0xf8, 0x00, 0xe8, 0x8c, 0xce, 0x3c, 0x1c, 0x12, 0x9d, 0xc3, 0x31, 0x11, 0x3f, - 0xc0, 0x42, 0x64, 0x32, 0x8b, 0x07, 0xfd, 0xd7, 0x51, 0x80, 0x73, 0xfb, 0x30, 0xfe, 0x0a, 0xd4, - 0x5b, 0x21, 0xc1, 0x8d, 0xd8, 0xfb, 0x24, 0xe8, 0x52, 0x19, 0xe3, 0x5d, 0xf1, 0x22, 0xe5, 0xa7, - 0x0f, 0xe0, 0xf3, 0x65, 0x98, 0x23, 0x3e, 0x02, 0x1d, 0xac, 0x59, 0xb4, 0xa3, 0x1c, 0x89, 0xa3, - 0xfc, 0x3b, 0x85, 0x03, 0xfc, 0xf0, 0x72, 0x08, 0xf8, 0x18, 0x09, 0x14, 0x62, 0xd1, 0x7d, 0x04, - 0x59, 0x18, 0xcb, 0x36, 0x4a, 0xc1, 0x67, 0x81, 0xa9, 0xf8, 0x68, 0xf0, 0x48, 0xe8, 0x91, 0xcb, - 0x0b, 0xc3, 0x6b, 0x6c, 0x63, 0xf6, 0xc8, 0x15, 0x61, 0x22, 0x7d, 0x4c, 0xde, 0x70, 0x0b, 0x5b, - 0x70, 0x6e, 0x90, 0x0b, 0xe3, 0x5f, 0x95, 0xf5, 0x4f, 0xb4, 0x7d, 0x76, 0x24, 0x1e, 0x98, 0x07, - 0x08, 0x88, 0xaf, 0x40, 0xd6, 0x32, 0x2f, 0xd2, 0xa5, 0xad, 0x59, 0x95, 0x3c, 0xd3, 0xeb, 0x29, - 0x3b, 0xbb, 0x3b, 0x06, 0x3d, 0x19, 0x3a, 0xab, 0x7a, 0xaf, 0xca, 0x75, 0x30, 0x7b, 0x51, 0x77, - 0xb6, 0x57, 0xb0, 0xd6, 0xc6, 0x96, 0x6a, 0x5e, 0x24, 0x1e, 0x73, 0x93, 0x2a, 0x9f, 0xc8, 0xfb, - 0xaf, 0x08, 0xd8, 0x97, 0xe4, 0x16, 0xf9, 0xb1, 0x1c, 0x7f, 0x4b, 0x62, 0x79, 0x46, 0x73, 0x95, - 0xbe, 0xc2, 0xbc, 0x4f, 0x86, 0x29, 0xd5, 0xbc, 0xc8, 0x94, 0xe4, 0xff, 0x38, 0x5c, 0x1d, 0x49, - 0x3c, 0xd1, 0x23, 0x92, 0xf3, 0xd9, 0x1f, 0xfb, 0x44, 0x2f, 0xb6, 0xf8, 0xb1, 0x9c, 0x5c, 0x9a, - 0x51, 0xcd, 0x8b, 0x75, 0xec, 0xd0, 0x16, 0x81, 0x9a, 0x23, 0x72, 0xb2, 0xd6, 0x6d, 0x4a, 0x90, - 0xcd, 0xc3, 0xfd, 0xf7, 0xa4, 0xbb, 0x08, 0xbe, 0x80, 0x7c, 0x16, 0xc7, 0xbd, 0x8b, 0x30, 0x90, - 0x83, 0x31, 0xc4, 0x48, 0x91, 0x61, 0x5a, 0x35, 0x2f, 0xba, 0x43, 0xc3, 0x92, 0xde, 0xe9, 0x8c, - 0x66, 0x84, 0x4c, 0x6a, 0xfc, 0x7b, 0x62, 0xf0, 0xb8, 0x18, 0xbb, 0xf1, 0x3f, 0x80, 0x81, 0xf4, - 0x61, 0x78, 0x0e, 0x6d, 0x2c, 0xde, 0x08, 0x6d, 0x8c, 0x06, 0x87, 0x61, 0x1b, 0x84, 0xcf, 0xc6, - 0xa1, 0x35, 0x88, 0x28, 0x0e, 0xc6, 0xb2, 0x73, 0x32, 0x57, 0x22, 0xc3, 0xfc, 0x68, 0xdb, 0xc4, - 0xbb, 0x93, 0xb9, 0x26, 0xb2, 0x61, 0x97, 0x63, 0x64, 0x24, 0x68, 0x24, 0x70, 0x41, 0x14, 0xe0, - 0x21, 0x7d, 0x3c, 0x3e, 0x2c, 0xc3, 0x0c, 0x65, 0xe1, 0x11, 0x62, 0x05, 0x0c, 0xd5, 0xa8, 0xc2, - 0x35, 0x38, 0x9c, 0x46, 0x15, 0xc3, 0xc1, 0x58, 0x6e, 0x05, 0x75, 0xed, 0xb8, 0x21, 0x8e, 0x8f, - 0x47, 0x21, 0x38, 0xb4, 0x31, 0x36, 0xc2, 0x23, 0xe4, 0xc3, 0x18, 0x63, 0x87, 0x74, 0x8c, 0xfc, - 0x39, 0x7e, 0x2b, 0x1a, 0x25, 0x06, 0x07, 0x68, 0x0a, 0x23, 0x84, 0x61, 0xc8, 0xa6, 0x70, 0x48, - 0x48, 0x7c, 0x55, 0x06, 0xa0, 0x0c, 0xac, 0x99, 0x7b, 0xe4, 0x32, 0x9f, 0x11, 0x74, 0x67, 0xbd, - 0x6e, 0xf5, 0xf2, 0x00, 0xb7, 0xfa, 0x84, 0x21, 0x5c, 0x92, 0xae, 0x04, 0x86, 0xa4, 0xec, 0x56, - 0x72, 0xec, 0x2b, 0x81, 0xf1, 0xe5, 0xa7, 0x8f, 0xf1, 0x97, 0xa9, 0x35, 0x17, 0x1c, 0x30, 0xfd, - 0x8d, 0x91, 0xa0, 0x1c, 0x9a, 0xfd, 0xcb, 0xfc, 0xec, 0xff, 0x00, 0xd8, 0x0e, 0x6b, 0x23, 0x0e, - 0x3a, 0x38, 0x9a, 0xbe, 0x8d, 0x78, 0x78, 0x07, 0x44, 0x7f, 0x2e, 0x0b, 0x47, 0x59, 0x27, 0xf2, - 0xc3, 0x00, 0x71, 0xc2, 0x73, 0x78, 0x5c, 0x27, 0x39, 0x00, 0xe5, 0x51, 0x2d, 0x48, 0x25, 0x59, - 0xca, 0x14, 0x60, 0x6f, 0x2c, 0xab, 0x1b, 0xf9, 0xf2, 0x03, 0x5d, 0xcd, 0x68, 0x8b, 0x87, 0xfb, - 0x1d, 0x00, 0xbc, 0xb7, 0xd6, 0x28, 0xf3, 0x6b, 0x8d, 0x7d, 0x56, 0x26, 0x13, 0xef, 0x5c, 0x13, - 0x91, 0x51, 0x76, 0xc7, 0xbe, 0x73, 0x1d, 0x5d, 0x76, 0xfa, 0x28, 0xbd, 0x5b, 0x86, 0x6c, 0xdd, - 0xb4, 0x1c, 0xf4, 0xdc, 0x24, 0xad, 0x93, 0x4a, 0x3e, 0x00, 0xc9, 0x7b, 0x57, 0x4a, 0xdc, 0x2d, - 0xcd, 0x37, 0xc7, 0x1f, 0x75, 0xd6, 0x1c, 0x8d, 0x78, 0x75, 0xbb, 0xe5, 0x87, 0xae, 0x6b, 0x4e, - 0x1a, 0x4f, 0x87, 0xca, 0xaf, 0x1e, 0x7d, 0x00, 0x23, 0xb5, 0x78, 0x3a, 0x91, 0x25, 0xa7, 0x8f, - 0xdb, 0x6b, 0x8f, 0x32, 0xdf, 0xd6, 0x25, 0xbd, 0x83, 0xd1, 0x73, 0xa9, 0xcb, 0x48, 0x55, 0xdb, - 0xc1, 0xe2, 0x47, 0x62, 0x62, 0x5d, 0x5b, 0x49, 0x7c, 0x59, 0x39, 0x88, 0x2f, 0x9b, 0xb4, 0x41, - 0xd1, 0x03, 0xe8, 0x94, 0xa5, 0x71, 0x37, 0xa8, 0x98, 0xb2, 0xc7, 0x12, 0xa7, 0xf3, 0x58, 0x1d, - 0x3b, 0xd4, 0xa8, 0xac, 0x79, 0x37, 0xb0, 0xfc, 0xcc, 0x48, 0x22, 0x76, 0xfa, 0x17, 0xbc, 0xc8, - 0x3d, 0x17, 0xbc, 0xbc, 0x2f, 0x0c, 0xce, 0x1a, 0x0f, 0xce, 0x4f, 0x46, 0x0b, 0x88, 0x67, 0x72, - 0x24, 0x30, 0xbd, 0xcd, 0x87, 0x69, 0x9d, 0x83, 0xe9, 0x8e, 0x21, 0xb9, 0x48, 0x1f, 0xb0, 0x5f, - 0xce, 0xc1, 0x51, 0x3a, 0xe9, 0x2f, 0x1a, 0x6d, 0x16, 0x61, 0xf5, 0xcd, 0xd2, 0x21, 0x6f, 0xb6, - 0xed, 0x0f, 0xc1, 0xca, 0xc5, 0x72, 0xce, 0xf5, 0xde, 0x8e, 0xbf, 0x40, 0xc3, 0xb9, 0xba, 0x9d, - 0x28, 0xd9, 0x69, 0x13, 0xbf, 0x21, 0xdf, 0xff, 0x8f, 0xbf, 0xcb, 0x68, 0x42, 0xfc, 0x2e, 0xa3, - 0x3f, 0x49, 0xb6, 0x6e, 0x47, 0x8a, 0xee, 0x11, 0x78, 0xca, 0xb6, 0x53, 0x82, 0x15, 0x3d, 0x01, - 0xee, 0x7e, 0x34, 0xdc, 0xc9, 0x82, 0x08, 0x22, 0x43, 0xba, 0x93, 0x11, 0x02, 0x87, 0xe9, 0x4e, - 0x36, 0x88, 0x81, 0x31, 0xdc, 0x6a, 0x9f, 0x63, 0xbb, 0xf9, 0xa4, 0xdd, 0xa0, 0xbf, 0x92, 0x52, - 0x1f, 0xa5, 0xbf, 0x97, 0x49, 0xe4, 0xff, 0x4c, 0xf8, 0x8a, 0x1f, 0xa6, 0x93, 0x78, 0x34, 0xc7, - 0x91, 0x1b, 0xc3, 0xba, 0x91, 0x44, 0x7c, 0xd1, 0xcf, 0xe9, 0x6d, 0x67, 0x7b, 0x44, 0x27, 0x3a, - 0x2e, 0xba, 0xb4, 0xbc, 0xeb, 0x91, 0xc9, 0x0b, 0xfa, 0xb7, 0x4c, 0xa2, 0x10, 0x52, 0xbe, 0x48, - 0x08, 0x5b, 0x11, 0x22, 0x4e, 0x10, 0xf8, 0x29, 0x96, 0xde, 0x18, 0x35, 0xfa, 0xac, 0xde, 0xc6, - 0xe6, 0x23, 0x50, 0xa3, 0x09, 0x5f, 0xa3, 0xd3, 0xe8, 0x38, 0x72, 0x3f, 0xa2, 0x1a, 0xed, 0x8b, - 0x64, 0x44, 0x1a, 0x1d, 0x4b, 0x2f, 0x7d, 0x19, 0xbf, 0x62, 0x86, 0x4d, 0xa4, 0x56, 0x75, 0xe3, - 0x02, 0xfa, 0xe7, 0xbc, 0x77, 0x31, 0xf3, 0x39, 0xdd, 0xd9, 0x66, 0xb1, 0x60, 0x7e, 0x4f, 0xf8, - 0x6e, 0x94, 0x21, 0xe2, 0xbd, 0xf0, 0xe1, 0xa4, 0x72, 0xfb, 0xc2, 0x49, 0x15, 0x61, 0x56, 0x37, - 0x1c, 0x6c, 0x19, 0x5a, 0x67, 0xa9, 0xa3, 0x6d, 0xd9, 0xa7, 0x26, 0xfa, 0x5e, 0x5e, 0x57, 0x09, - 0xe5, 0x51, 0xf9, 0x3f, 0xc2, 0xd7, 0x57, 0x4e, 0xf2, 0xd7, 0x57, 0x46, 0x44, 0xbf, 0x9a, 0x8a, - 0x8e, 0x7e, 0xe5, 0x47, 0xb7, 0x82, 0xc1, 0xc1, 0xb1, 0x45, 0x6d, 0xe3, 0x84, 0xe1, 0xfe, 0x6e, - 0x16, 0x8c, 0xc2, 0xe6, 0x87, 0x7e, 0x7c, 0xb5, 0x9c, 0x68, 0x75, 0xcf, 0x55, 0x84, 0xf9, 0x5e, - 0x25, 0x48, 0x6c, 0xa1, 0x86, 0x2b, 0x2f, 0xf7, 0x54, 0xde, 0x37, 0x79, 0xb2, 0x02, 0x26, 0x4f, - 0x58, 0xa9, 0x72, 0x62, 0x4a, 0x95, 0x64, 0xb1, 0x50, 0xa4, 0xb6, 0x63, 0x38, 0x8d, 0x94, 0x83, - 0x63, 0x5e, 0xb4, 0xdb, 0x6e, 0x17, 0x6b, 0x96, 0x66, 0xb4, 0x30, 0xfa, 0x98, 0x34, 0x0a, 0xb3, - 0x77, 0x09, 0x26, 0xf5, 0x96, 0x69, 0xd4, 0xf5, 0x67, 0x78, 0x97, 0xcb, 0xc5, 0x07, 0x59, 0x27, - 0x12, 0xa9, 0xb0, 0x3f, 0x54, 0xff, 0x5f, 0xa5, 0x02, 0x53, 0x2d, 0xcd, 0x6a, 0xd3, 0x20, 0x7c, - 0xb9, 0x9e, 0x8b, 0x9c, 0x22, 0x09, 0x95, 0xbc, 0x5f, 0xd4, 0xe0, 0x6f, 0xa5, 0xc6, 0x0b, 0x31, - 0xdf, 0x13, 0xcd, 0x23, 0x92, 0xd8, 0x62, 0xf0, 0x13, 0x27, 0x73, 0x57, 0x3a, 0x16, 0xee, 0x90, - 0x3b, 0xe8, 0x69, 0x0f, 0x31, 0xa5, 0x06, 0x09, 0x49, 0x97, 0x07, 0x48, 0x51, 0xfb, 0xd0, 0x18, - 0xf7, 0xf2, 0x80, 0x10, 0x17, 0xe9, 0x6b, 0xe6, 0x3b, 0xf2, 0x30, 0x4b, 0x7b, 0x35, 0x26, 0x4e, - 0xf4, 0x7c, 0x72, 0x85, 0xb4, 0x73, 0x2f, 0xbe, 0x84, 0xea, 0x07, 0x1f, 0x93, 0x0b, 0x20, 0x5f, - 0xf0, 0x03, 0x0e, 0xba, 0x8f, 0x49, 0xf7, 0xed, 0x3d, 0xbe, 0xe6, 0x29, 0x4f, 0xe3, 0xde, 0xb7, - 0x8f, 0x2f, 0x3e, 0x7d, 0x7c, 0x7e, 0x45, 0x06, 0xb9, 0xd8, 0x6e, 0xa3, 0xd6, 0xc1, 0xa1, 0xb8, - 0x06, 0xa6, 0xbd, 0x36, 0x13, 0xc4, 0x80, 0x0c, 0x27, 0x25, 0x5d, 0x04, 0xf5, 0x65, 0x53, 0x6c, - 0x8f, 0x7d, 0x57, 0x21, 0xa6, 0xec, 0xf4, 0x41, 0xf9, 0x8d, 0x09, 0xd6, 0x68, 0x16, 0x4c, 0xf3, - 0x02, 0x39, 0x2a, 0xf3, 0x5c, 0x19, 0x72, 0x4b, 0xd8, 0x69, 0x6d, 0x8f, 0xa8, 0xcd, 0xec, 0x5a, - 0x1d, 0xaf, 0xcd, 0xec, 0xbb, 0x0f, 0x7f, 0xb0, 0x0d, 0xeb, 0xb1, 0x35, 0x4f, 0x58, 0x1a, 0x77, - 0x74, 0xe7, 0xd8, 0xd2, 0xd3, 0x07, 0xe7, 0xdf, 0x64, 0x98, 0xf3, 0x57, 0xb8, 0x28, 0x26, 0xbf, - 0x9c, 0x79, 0xa4, 0xad, 0x77, 0xa2, 0xcf, 0x27, 0x0b, 0x91, 0xe6, 0xcb, 0x94, 0xaf, 0x59, 0xca, - 0x0b, 0x8b, 0x09, 0x82, 0xa7, 0x89, 0x31, 0x38, 0x86, 0x19, 0xbc, 0x0c, 0x93, 0x84, 0xa1, 0x45, - 0x7d, 0x8f, 0xb8, 0x0e, 0x72, 0x0b, 0x8d, 0xcf, 0x1c, 0xc9, 0x42, 0xe3, 0x1d, 0xfc, 0x42, 0xa3, - 0x60, 0xc4, 0x63, 0x6f, 0x9d, 0x31, 0xa1, 0x2f, 0x8d, 0xfb, 0xff, 0xc8, 0x97, 0x19, 0x13, 0xf8, - 0xd2, 0x0c, 0x28, 0x3f, 0x7d, 0x44, 0x5f, 0xfd, 0x9f, 0x58, 0x67, 0xeb, 0x6d, 0xa8, 0xa2, 0xff, - 0x79, 0x0c, 0xb2, 0x67, 0xdd, 0x87, 0xff, 0x1d, 0xdc, 0x88, 0xf5, 0x92, 0x11, 0x04, 0x67, 0x78, - 0x2a, 0x64, 0x5d, 0xfa, 0x6c, 0xda, 0x72, 0xa3, 0xd8, 0xee, 0xae, 0xcb, 0x88, 0x4a, 0xfe, 0x53, - 0x4e, 0x42, 0xde, 0x36, 0x77, 0xad, 0x96, 0x6b, 0x3e, 0xbb, 0x1a, 0xc3, 0xde, 0x92, 0x06, 0x25, - 0xe5, 0x48, 0xcf, 0x8f, 0xce, 0x65, 0x34, 0x74, 0x41, 0x92, 0xcc, 0x5d, 0x90, 0x94, 0x60, 0xff, - 0x40, 0x80, 0xb7, 0xf4, 0x35, 0xe2, 0xaf, 0xc8, 0x5d, 0x81, 0xed, 0x51, 0xc1, 0x1e, 0x21, 0x96, - 0x83, 0xaa, 0x43, 0x52, 0x87, 0x6f, 0x5e, 0xb4, 0x7e, 0x1c, 0xf8, 0xb1, 0x3a, 0x7c, 0x0b, 0xf0, - 0x30, 0x96, 0x53, 0xea, 0x79, 0xe6, 0xa4, 0x7a, 0xdf, 0x28, 0xd1, 0xcd, 0x72, 0x4a, 0x7f, 0x20, - 0x74, 0x46, 0xe8, 0xbc, 0x3a, 0x34, 0x3a, 0x87, 0xe4, 0xbe, 0xfa, 0x07, 0x32, 0x89, 0x84, 0xe9, - 0x19, 0x39, 0xe2, 0x17, 0x1d, 0x25, 0x86, 0xc8, 0x1d, 0x83, 0xb9, 0x38, 0xd0, 0xb3, 0xc3, 0x87, - 0x06, 0xe7, 0x45, 0x17, 0xe2, 0x7f, 0xdc, 0xa1, 0xc1, 0x45, 0x19, 0x49, 0x1f, 0xc8, 0xd7, 0xd3, - 0x8b, 0xc5, 0x8a, 0x2d, 0x47, 0xdf, 0x1b, 0x71, 0x4b, 0xe3, 0x87, 0x97, 0x84, 0xd1, 0x80, 0xf7, - 0x49, 0x88, 0x72, 0x38, 0xee, 0x68, 0xc0, 0x62, 0x6c, 0xa4, 0x0f, 0xd3, 0xdf, 0xe6, 0x5d, 0xe9, - 0xb1, 0xb5, 0x99, 0x37, 0xb0, 0xd5, 0x00, 0x7c, 0x70, 0xb4, 0xce, 0xc0, 0x4c, 0x68, 0xea, 0xef, - 0x5d, 0x58, 0xc3, 0xa5, 0x25, 0x3d, 0xe8, 0xee, 0x8b, 0x6c, 0xe4, 0x0b, 0x03, 0x09, 0x16, 0x7c, - 0x45, 0x98, 0x18, 0xcb, 0x7d, 0x70, 0xde, 0x18, 0x36, 0x26, 0xac, 0x7e, 0x2f, 0x8c, 0x55, 0x8d, - 0xc7, 0xea, 0x36, 0x11, 0x31, 0x89, 0x8d, 0x69, 0x42, 0xf3, 0xc6, 0xb7, 0xfb, 0x70, 0xa9, 0x1c, - 0x5c, 0x4f, 0x1d, 0x9a, 0x8f, 0xf4, 0x11, 0x7b, 0x29, 0xed, 0x0e, 0xeb, 0xd4, 0x64, 0x1f, 0x4d, - 0x77, 0xc8, 0x66, 0x03, 0x32, 0x37, 0x1b, 0x48, 0xe8, 0x6f, 0x1f, 0xb8, 0x91, 0x7a, 0xcc, 0x0d, - 0x82, 0x28, 0x3b, 0x62, 0x7f, 0xfb, 0x81, 0x1c, 0xa4, 0x0f, 0xce, 0x3f, 0xca, 0x00, 0xcb, 0x96, - 0xb9, 0xdb, 0xad, 0x59, 0x6d, 0x6c, 0xa1, 0xbf, 0x09, 0x26, 0x00, 0x2f, 0x1a, 0xc1, 0x04, 0x60, - 0x1d, 0x60, 0xcb, 0x27, 0xce, 0x34, 0xfc, 0x16, 0x31, 0x73, 0x3f, 0x60, 0x4a, 0x0d, 0xd1, 0xe0, - 0xaf, 0x9c, 0x7d, 0x1a, 0x8f, 0x71, 0x5c, 0x9f, 0x15, 0x90, 0x1b, 0xe5, 0x04, 0xe0, 0x9d, 0x3e, - 0xd6, 0x0d, 0x0e, 0xeb, 0xbb, 0x0f, 0xc0, 0x49, 0xfa, 0x98, 0xff, 0xd3, 0x04, 0x4c, 0xd3, 0xed, - 0x3a, 0x2a, 0xd3, 0xbf, 0x0f, 0x40, 0xff, 0x8d, 0x11, 0x80, 0xbe, 0x01, 0x33, 0x66, 0x40, 0x9d, - 0xf6, 0xa9, 0xe1, 0x05, 0x98, 0x58, 0xd8, 0x43, 0x7c, 0xa9, 0x1c, 0x19, 0xf4, 0x91, 0x30, 0xf2, - 0x2a, 0x8f, 0xfc, 0x1d, 0x31, 0xf2, 0x0e, 0x51, 0x1c, 0x25, 0xf4, 0xef, 0xf2, 0xa1, 0xdf, 0xe0, - 0xa0, 0x2f, 0x1e, 0x84, 0x95, 0x31, 0x84, 0xdb, 0x97, 0x21, 0x4b, 0x4e, 0xc7, 0xfd, 0x66, 0x8a, - 0xf3, 0xfb, 0x53, 0x30, 0x41, 0x9a, 0xac, 0x3f, 0xef, 0xf0, 0x5e, 0xdd, 0x2f, 0xda, 0xa6, 0x83, - 0x2d, 0xdf, 0x63, 0xc1, 0x7b, 0x75, 0x79, 0xf0, 0xbc, 0x92, 0xed, 0x53, 0x79, 0xba, 0x11, 0xe9, - 0x27, 0x0c, 0x3d, 0x29, 0x09, 0x4b, 0x7c, 0x64, 0xe7, 0xe5, 0x86, 0x99, 0x94, 0x0c, 0x60, 0x24, - 0x7d, 0xe0, 0xff, 0x22, 0x0b, 0xa7, 0xe8, 0xaa, 0xd2, 0x92, 0x65, 0xee, 0xf4, 0xdc, 0x6e, 0xa5, - 0x1f, 0x5c, 0x17, 0xae, 0x87, 0x39, 0x87, 0xf3, 0xc7, 0x66, 0x3a, 0xd1, 0x93, 0x8a, 0xfe, 0x34, - 0xec, 0x53, 0xf1, 0x74, 0x1e, 0xc9, 0x85, 0x18, 0x01, 0x46, 0xf1, 0x9e, 0x78, 0xa1, 0x5e, 0x90, - 0xd1, 0xd0, 0x22, 0x95, 0x3c, 0xd4, 0x9a, 0xa5, 0xaf, 0x53, 0x39, 0x11, 0x9d, 0x7a, 0xbf, 0xaf, - 0x53, 0x3f, 0xcd, 0xe9, 0xd4, 0xf2, 0xc1, 0x45, 0x92, 0xbe, 0x6e, 0xbd, 0xca, 0xdf, 0x18, 0xf2, - 0xb7, 0xed, 0x76, 0x52, 0xd8, 0xac, 0x0b, 0xfb, 0x23, 0x65, 0x39, 0x7f, 0x24, 0xfe, 0x3e, 0x8a, - 0x04, 0x33, 0x61, 0x9e, 0xeb, 0x08, 0x5d, 0x9a, 0x03, 0x49, 0xf7, 0xb8, 0x93, 0xf4, 0xf6, 0x50, - 0x73, 0xdd, 0xd8, 0x82, 0xc6, 0xb0, 0xb6, 0x34, 0x07, 0xf9, 0x25, 0xbd, 0xe3, 0x60, 0x0b, 0x7d, - 0x99, 0xcd, 0x74, 0x5f, 0x95, 0xe2, 0x00, 0xb0, 0x08, 0xf9, 0x4d, 0x52, 0x1a, 0x33, 0x99, 0x6f, - 0x12, 0x6b, 0x3d, 0x94, 0x43, 0x95, 0xfd, 0x9b, 0x34, 0x3a, 0x5f, 0x0f, 0x99, 0x91, 0x4d, 0x91, - 0x13, 0x44, 0xe7, 0x1b, 0xcc, 0xc2, 0x58, 0x2e, 0xa6, 0xca, 0xab, 0x78, 0xc7, 0x1d, 0xe3, 0x2f, - 0xa4, 0x87, 0x70, 0x01, 0x64, 0xbd, 0x6d, 0x93, 0xce, 0x71, 0x4a, 0x75, 0x1f, 0x93, 0xfa, 0x0a, - 0xf5, 0x8a, 0x8a, 0xb2, 0x3c, 0x6e, 0x5f, 0x21, 0x21, 0x2e, 0xd2, 0xc7, 0xec, 0x7b, 0xc4, 0x51, - 0xb4, 0xdb, 0xd1, 0x5a, 0xd8, 0xe5, 0x3e, 0x35, 0xd4, 0x68, 0x4f, 0x96, 0xf5, 0x7a, 0xb2, 0x50, - 0x3b, 0xcd, 0x1d, 0xa0, 0x9d, 0x0e, 0xbb, 0x0c, 0xe9, 0xcb, 0x9c, 0x54, 0xfc, 0xd0, 0x96, 0x21, - 0x63, 0xd9, 0x18, 0xc3, 0xb5, 0xa3, 0xde, 0x41, 0xda, 0xb1, 0xb6, 0xd6, 0x61, 0x37, 0x69, 0x98, - 0xb0, 0x46, 0x76, 0x68, 0x76, 0x98, 0x4d, 0x9a, 0x68, 0x1e, 0xc6, 0x80, 0xd6, 0x1c, 0x43, 0xeb, - 0x73, 0x6c, 0x18, 0x4d, 0x79, 0x9f, 0xd4, 0x36, 0x2d, 0x27, 0xd9, 0x3e, 0xa9, 0xcb, 0x9d, 0x4a, - 0xfe, 0x4b, 0x7a, 0xf0, 0x8a, 0x3f, 0x57, 0x3d, 0xaa, 0xe1, 0x33, 0xc1, 0xc1, 0xab, 0x41, 0x0c, - 0xa4, 0x0f, 0xef, 0x5b, 0x0e, 0x69, 0xf0, 0x1c, 0xb6, 0x39, 0xb2, 0x36, 0x30, 0xb2, 0xa1, 0x73, - 0x98, 0xe6, 0x18, 0xcd, 0x43, 0xfa, 0x78, 0x7d, 0x3b, 0x34, 0x70, 0xbe, 0x69, 0x8c, 0x03, 0xa7, - 0xd7, 0x32, 0x73, 0x43, 0xb6, 0xcc, 0x61, 0xf7, 0x7f, 0x98, 0xac, 0x47, 0x37, 0x60, 0x0e, 0xb3, - 0xff, 0x13, 0xc3, 0x44, 0xfa, 0x88, 0xbf, 0x59, 0x86, 0x5c, 0x7d, 0xfc, 0xe3, 0xe5, 0xb0, 0x73, - 0x11, 0x22, 0xab, 0xfa, 0xc8, 0x86, 0xcb, 0x61, 0xe6, 0x22, 0x91, 0x2c, 0x8c, 0x21, 0xf0, 0xfe, - 0x51, 0x98, 0x21, 0x4b, 0x22, 0xde, 0x36, 0xeb, 0xb7, 0xd9, 0xa8, 0xf9, 0x70, 0x8a, 0x6d, 0xf5, - 0x1e, 0x98, 0xf4, 0xf6, 0xef, 0xd8, 0xc8, 0x39, 0x2f, 0xd6, 0x3e, 0x3d, 0x2e, 0x55, 0xff, 0xff, - 0x03, 0x39, 0x43, 0x8c, 0x7c, 0xaf, 0x76, 0x58, 0x67, 0x88, 0x43, 0xdd, 0xaf, 0xfd, 0x93, 0x60, - 0x44, 0xfd, 0x2f, 0xe9, 0x61, 0xde, 0xbb, 0x8f, 0x9b, 0xed, 0xb3, 0x8f, 0xfb, 0xb1, 0x30, 0x96, - 0x75, 0x1e, 0xcb, 0x3b, 0x45, 0x45, 0x38, 0xc2, 0xb1, 0xf6, 0xdd, 0x3e, 0x9c, 0x67, 0x39, 0x38, - 0x17, 0x0e, 0xc4, 0xcb, 0x18, 0x0e, 0x3e, 0x66, 0x83, 0x31, 0xf7, 0xe3, 0x29, 0xb6, 0xe3, 0x9e, - 0x53, 0x15, 0xd9, 0x7d, 0xa7, 0x2a, 0xb8, 0x96, 0x9e, 0x3b, 0x60, 0x4b, 0xff, 0x78, 0x58, 0x3b, - 0x1a, 0xbc, 0x76, 0x3c, 0x55, 0x1c, 0x91, 0xd1, 0x8d, 0xcc, 0xef, 0xf1, 0xd5, 0xe3, 0x1c, 0xa7, - 0x1e, 0xa5, 0x83, 0x31, 0x93, 0xbe, 0x7e, 0xfc, 0xa1, 0x37, 0xa1, 0x3d, 0xe4, 0xf6, 0x3e, 0xec, - 0x56, 0x31, 0x27, 0xc4, 0x91, 0x8d, 0xdc, 0xc3, 0x6c, 0x15, 0x0f, 0xe2, 0x64, 0x0c, 0xb1, 0xd8, - 0x66, 0x61, 0x9a, 0xf0, 0x74, 0x4e, 0x6f, 0x6f, 0x61, 0x07, 0xbd, 0x9a, 0xfa, 0x28, 0x7a, 0x91, - 0x2f, 0x47, 0x14, 0x9e, 0x28, 0xea, 0xbc, 0x6b, 0x52, 0x8f, 0x0e, 0xca, 0xe4, 0x7c, 0x88, 0xc1, - 0x71, 0x47, 0x50, 0x1c, 0xc8, 0x41, 0xfa, 0x90, 0x7d, 0x84, 0xba, 0xdb, 0xac, 0x6a, 0x97, 0xcc, - 0x5d, 0x07, 0x3d, 0x38, 0x82, 0x0e, 0x7a, 0x01, 0xf2, 0x1d, 0x42, 0x8d, 0x1d, 0xcb, 0x88, 0x9f, - 0xee, 0x30, 0x11, 0xd0, 0xf2, 0x55, 0xf6, 0x67, 0xd2, 0xb3, 0x19, 0x81, 0x1c, 0x29, 0x9d, 0x71, - 0x9f, 0xcd, 0x18, 0x50, 0xfe, 0x58, 0xee, 0xd8, 0x99, 0x74, 0x4b, 0xd7, 0x77, 0x74, 0x67, 0x44, - 0x11, 0x1c, 0x3a, 0x2e, 0x2d, 0x2f, 0x82, 0x03, 0x79, 0x49, 0x7a, 0x62, 0x34, 0x24, 0x15, 0xf7, - 0xf7, 0x71, 0x9f, 0x18, 0x8d, 0x2f, 0x3e, 0x7d, 0x4c, 0x7e, 0x8d, 0xb6, 0xac, 0xb3, 0xd4, 0xf9, - 0x36, 0x45, 0xbf, 0xde, 0xa1, 0x1b, 0x0b, 0x65, 0xed, 0xf0, 0x1a, 0x4b, 0xdf, 0xf2, 0xd3, 0x07, - 0xe6, 0xbf, 0xff, 0x38, 0xe4, 0x16, 0xf1, 0xf9, 0xdd, 0x2d, 0x74, 0x07, 0x4c, 0x36, 0x2c, 0x8c, - 0x2b, 0xc6, 0xa6, 0xe9, 0x4a, 0xd7, 0x71, 0x9f, 0x3d, 0x48, 0xd8, 0x9b, 0x8b, 0xc7, 0x36, 0xd6, - 0xda, 0xc1, 0xf9, 0x33, 0xef, 0x15, 0xbd, 0x44, 0x82, 0x6c, 0xdd, 0xd1, 0x1c, 0x34, 0xe5, 0x63, - 0x8b, 0x1e, 0x0c, 0x63, 0x71, 0x07, 0x8f, 0xc5, 0xf5, 0x9c, 0x2c, 0x08, 0x07, 0xf3, 0xee, 0xff, - 0x11, 0x00, 0x20, 0x98, 0xbc, 0xdf, 0x36, 0x0d, 0x37, 0x87, 0x77, 0x04, 0xd2, 0x7b, 0x47, 0xaf, - 0xf4, 0xc5, 0x7d, 0x17, 0x27, 0xee, 0xc7, 0x8a, 0x15, 0x31, 0x86, 0x95, 0x36, 0x09, 0xa6, 0x5c, - 0xd1, 0xae, 0x60, 0xad, 0x6d, 0xa3, 0x1f, 0x0b, 0x94, 0x3f, 0x42, 0xcc, 0xe8, 0x03, 0xc2, 0xc1, - 0x38, 0x69, 0xad, 0x7c, 0xe2, 0xd1, 0x1e, 0x1d, 0xde, 0xe6, 0xbf, 0xc4, 0x07, 0x23, 0xb9, 0x19, - 0xb2, 0xba, 0xb1, 0x69, 0x32, 0xff, 0xc2, 0x2b, 0x23, 0x68, 0xbb, 0x3a, 0xa1, 0x92, 0x8c, 0x82, - 0x91, 0x3a, 0xe3, 0xd9, 0x1a, 0xcb, 0xa5, 0x77, 0x59, 0xb7, 0x74, 0xf4, 0xff, 0x1f, 0x28, 0x6c, - 0x45, 0x81, 0x6c, 0x57, 0x73, 0xb6, 0x59, 0xd1, 0xe4, 0xd9, 0xb5, 0x91, 0x77, 0x0d, 0xcd, 0x30, - 0x8d, 0x4b, 0x3b, 0xfa, 0x33, 0xfc, 0xbb, 0x75, 0xb9, 0x34, 0x97, 0xf3, 0x2d, 0x6c, 0x60, 0x4b, - 0x73, 0x70, 0x7d, 0x6f, 0x8b, 0xcc, 0xb1, 0x26, 0xd5, 0x70, 0x52, 0x62, 0xfd, 0x77, 0x39, 0x8e, - 0xd6, 0xff, 0x4d, 0xbd, 0x83, 0x49, 0xa4, 0x26, 0xa6, 0xff, 0xde, 0x7b, 0x22, 0xfd, 0xef, 0x53, - 0x44, 0xfa, 0x68, 0x7c, 0x5f, 0x82, 0x99, 0xba, 0xab, 0x70, 0xf5, 0xdd, 0x9d, 0x1d, 0xcd, 0xba, - 0x84, 0xae, 0x0d, 0x50, 0x09, 0xa9, 0x66, 0x86, 0xf7, 0x4b, 0xf9, 0x03, 0xe1, 0x6b, 0xa5, 0x59, - 0xd3, 0x0e, 0x95, 0x90, 0xb8, 0x1d, 0x3c, 0x1e, 0x72, 0xae, 0x7a, 0x7b, 0x1e, 0x97, 0xb1, 0x0d, - 0x81, 0xe6, 0x14, 0x8c, 0x68, 0x35, 0x90, 0xb7, 0x31, 0x44, 0xd3, 0x90, 0xe0, 0x68, 0xdd, 0xd1, - 0x5a, 0x17, 0x96, 0x4d, 0xcb, 0xdc, 0x75, 0x74, 0x03, 0xdb, 0xe8, 0x51, 0x01, 0x02, 0x9e, 0xfe, - 0x67, 0x02, 0xfd, 0x47, 0xff, 0x9e, 0x11, 0x1d, 0x45, 0xfd, 0x6e, 0x35, 0x4c, 0x3e, 0x22, 0x40, - 0x95, 0xd8, 0xb8, 0x28, 0x42, 0x31, 0x7d, 0xa1, 0xbd, 0x49, 0x86, 0x42, 0xf9, 0x81, 0xae, 0x69, - 0x39, 0xab, 0x66, 0x4b, 0xeb, 0xd8, 0x8e, 0x69, 0x61, 0x54, 0x8b, 0x95, 0x9a, 0xdb, 0xc3, 0xb4, - 0xcd, 0x56, 0x30, 0x38, 0xb2, 0xb7, 0xb0, 0xda, 0xc9, 0xbc, 0x8e, 0x7f, 0x44, 0x78, 0x97, 0x91, - 0x4a, 0xa5, 0x97, 0xa3, 0x08, 0x3d, 0xef, 0xd7, 0xa5, 0x25, 0x3b, 0x2c, 0x21, 0xb6, 0xf3, 0x28, - 0xc4, 0xd4, 0x18, 0x96, 0xca, 0x25, 0x98, 0xad, 0xef, 0x9e, 0xf7, 0x89, 0xd8, 0x61, 0x23, 0xe4, - 0x35, 0xc2, 0x51, 0x2a, 0x98, 0xe2, 0x85, 0x09, 0x45, 0xc8, 0xf7, 0x3a, 0x98, 0xb5, 0xc3, 0xd9, - 0x18, 0xde, 0x7c, 0xa2, 0x60, 0x74, 0x8a, 0xc1, 0xa5, 0xa6, 0x2f, 0xc0, 0xf7, 0x48, 0x30, 0x5b, - 0xeb, 0x62, 0x03, 0xb7, 0xa9, 0x17, 0x24, 0x27, 0xc0, 0x97, 0x24, 0x14, 0x20, 0x47, 0x28, 0x42, - 0x80, 0x81, 0xc7, 0xf2, 0xa2, 0x27, 0xbc, 0x20, 0x21, 0x91, 0xe0, 0xe2, 0x4a, 0x4b, 0x5f, 0x70, - 0x5f, 0x92, 0x60, 0x5a, 0xdd, 0x35, 0xd6, 0x2d, 0xd3, 0x1d, 0x8d, 0x2d, 0x74, 0x67, 0xd0, 0x41, - 0xdc, 0x04, 0xc7, 0xda, 0xbb, 0x16, 0x59, 0x7f, 0xaa, 0x18, 0x75, 0xdc, 0x32, 0x8d, 0xb6, 0x4d, - 0xea, 0x91, 0x53, 0xf7, 0x7f, 0xb8, 0x3d, 0xfb, 0xdc, 0x6f, 0xc8, 0x19, 0xf4, 0x7c, 0xe1, 0x50, - 0x37, 0xb4, 0xf2, 0xa1, 0xa2, 0xc5, 0x7b, 0x02, 0xc1, 0x80, 0x36, 0x83, 0x4a, 0x48, 0x5f, 0xb8, - 0x9f, 0x93, 0x40, 0x29, 0xb6, 0x5a, 0xe6, 0xae, 0xe1, 0xd4, 0x71, 0x07, 0xb7, 0x9c, 0x86, 0xa5, - 0xb5, 0x70, 0xd8, 0x7e, 0x2e, 0x80, 0xdc, 0xd6, 0x2d, 0xd6, 0x07, 0xbb, 0x8f, 0x4c, 0x8e, 0x2f, - 0x11, 0xde, 0x71, 0xa4, 0xb5, 0xdc, 0x5f, 0x4a, 0x02, 0x71, 0x8a, 0xed, 0x2b, 0x0a, 0x16, 0x94, - 0xbe, 0x54, 0x3f, 0x2e, 0xc1, 0x94, 0xd7, 0x63, 0x6f, 0x89, 0x08, 0xf3, 0xd7, 0x12, 0x4e, 0x46, - 0x7c, 0xe2, 0x09, 0x64, 0xf8, 0x8e, 0x04, 0xb3, 0x8a, 0x28, 0xfa, 0xc9, 0x44, 0x57, 0x4c, 0x2e, - 0x3a, 0xf7, 0xb5, 0x5a, 0x6b, 0x2e, 0xd5, 0x56, 0x17, 0xcb, 0x6a, 0x41, 0x46, 0x5f, 0x96, 0x20, - 0xbb, 0xae, 0x1b, 0x5b, 0xe1, 0xe8, 0x4a, 0xc7, 0x5d, 0x3b, 0xb2, 0x8d, 0x1f, 0x60, 0x2d, 0x9d, - 0xbe, 0x28, 0xb7, 0xc2, 0x71, 0x63, 0x77, 0xe7, 0x3c, 0xb6, 0x6a, 0x9b, 0x64, 0x94, 0xb5, 0x1b, - 0x66, 0x1d, 0x1b, 0xd4, 0x08, 0xcd, 0xa9, 0x7d, 0xbf, 0xf1, 0x26, 0x98, 0xc0, 0xe4, 0xc1, 0xe5, - 0x24, 0x42, 0xe2, 0x3e, 0x53, 0x52, 0x88, 0xa9, 0x44, 0xd3, 0x86, 0x3e, 0xc4, 0xd3, 0xd7, 0xd4, - 0x3f, 0xca, 0xc1, 0x89, 0xa2, 0x71, 0x89, 0xd8, 0x14, 0xb4, 0x83, 0x2f, 0x6d, 0x6b, 0xc6, 0x16, - 0x26, 0x03, 0x84, 0x2f, 0xf1, 0x70, 0x88, 0xfe, 0x0c, 0x1f, 0xa2, 0x5f, 0x51, 0x61, 0xc2, 0xb4, - 0xda, 0xd8, 0x5a, 0xb8, 0x44, 0x78, 0xea, 0x5d, 0x76, 0x66, 0x6d, 0xb2, 0x5f, 0x11, 0xf3, 0x8c, - 0xfc, 0x7c, 0x8d, 0xfe, 0xaf, 0x7a, 0x84, 0xce, 0xdc, 0x04, 0x13, 0x2c, 0x4d, 0x99, 0x81, 0xc9, - 0x9a, 0xba, 0x58, 0x56, 0x9b, 0x95, 0xc5, 0xc2, 0x11, 0xe5, 0x32, 0x38, 0x5a, 0x69, 0x94, 0xd5, - 0x62, 0xa3, 0x52, 0xab, 0x36, 0x49, 0x7a, 0x21, 0x83, 0x9e, 0x93, 0x15, 0xf5, 0xec, 0x8d, 0x67, - 0xa6, 0x1f, 0xac, 0x2a, 0x4c, 0xb4, 0x68, 0x06, 0x32, 0x84, 0x4e, 0x27, 0xaa, 0x1d, 0x23, 0x48, - 0x13, 0x54, 0x8f, 0x90, 0x72, 0x1a, 0xe0, 0xa2, 0x65, 0x1a, 0x5b, 0xc1, 0xa9, 0xc3, 0x49, 0x35, - 0x94, 0x82, 0x1e, 0xcc, 0x40, 0x9e, 0xfe, 0x43, 0xae, 0x24, 0x21, 0x4f, 0x81, 0xe0, 0xbd, 0x77, - 0xd7, 0xe2, 0x25, 0xf2, 0x0a, 0x26, 0x5a, 0xec, 0xd5, 0xd5, 0x45, 0x2a, 0x03, 0x6a, 0x09, 0xb3, - 0xaa, 0xdc, 0x0c, 0x79, 0xfa, 0x2f, 0xf3, 0x3a, 0x88, 0x0e, 0x2f, 0x4a, 0xb3, 0x09, 0xfa, 0x29, - 0x8b, 0xcb, 0x34, 0x7d, 0x6d, 0xfe, 0xa0, 0x04, 0x93, 0x55, 0xec, 0x94, 0xb6, 0x71, 0xeb, 0x02, - 0x7a, 0x0c, 0xbf, 0x00, 0xda, 0xd1, 0xb1, 0xe1, 0xdc, 0xb7, 0xd3, 0xf1, 0x17, 0x40, 0xbd, 0x04, - 0xf4, 0xbc, 0x70, 0xe7, 0x7b, 0x37, 0xaf, 0x3f, 0x37, 0xf6, 0xa9, 0xab, 0x57, 0x42, 0x84, 0xca, - 0x9c, 0x84, 0xbc, 0x85, 0xed, 0xdd, 0x8e, 0xb7, 0x88, 0xc6, 0xde, 0xd0, 0x6b, 0x7d, 0x71, 0x96, - 0x38, 0x71, 0xde, 0x2c, 0x5e, 0xc4, 0x18, 0xe2, 0x95, 0x66, 0x61, 0xa2, 0x62, 0xe8, 0x8e, 0xae, - 0x75, 0xd0, 0xf3, 0xb3, 0x30, 0x5b, 0xc7, 0xce, 0xba, 0x66, 0x69, 0x3b, 0xd8, 0xc1, 0x96, 0x8d, - 0xbe, 0xcb, 0xf7, 0x09, 0xdd, 0x8e, 0xe6, 0x6c, 0x9a, 0xd6, 0x8e, 0xa7, 0x9a, 0xde, 0xbb, 0xab, - 0x9a, 0x7b, 0xd8, 0xb2, 0x03, 0xbe, 0xbc, 0x57, 0xf7, 0xcb, 0x45, 0xd3, 0xba, 0xe0, 0x0e, 0x82, - 0x6c, 0x9a, 0xc6, 0x5e, 0x5d, 0x7a, 0x1d, 0x73, 0x6b, 0x15, 0xef, 0x61, 0x2f, 0x5c, 0x9a, 0xff, - 0xee, 0xce, 0x05, 0xda, 0x66, 0xd5, 0x74, 0xdc, 0x4e, 0x7b, 0xd5, 0xdc, 0xa2, 0xf1, 0x62, 0x27, - 0x55, 0x3e, 0x31, 0xc8, 0xa5, 0xed, 0x61, 0x92, 0x2b, 0x1f, 0xce, 0xc5, 0x12, 0x95, 0x79, 0x50, - 0xfc, 0xdf, 0x1a, 0xb8, 0x83, 0x77, 0xb0, 0x63, 0x5d, 0x22, 0xd7, 0x42, 0x4c, 0xaa, 0x7d, 0xbe, - 0xb0, 0x01, 0x5a, 0x7c, 0xb2, 0xce, 0xa4, 0x37, 0xcf, 0x49, 0xee, 0x40, 0x93, 0x75, 0x11, 0x8a, - 0x63, 0xb9, 0xf6, 0x4a, 0x76, 0xad, 0x99, 0x97, 0xc9, 0x90, 0x25, 0x83, 0xe7, 0x9b, 0x33, 0xdc, - 0x0a, 0xd3, 0x0e, 0xb6, 0x6d, 0x6d, 0x0b, 0x7b, 0x2b, 0x4c, 0xec, 0x55, 0xb9, 0x0d, 0x72, 0x1d, - 0x82, 0x29, 0x1d, 0x1c, 0xae, 0xe5, 0x6a, 0xe6, 0x1a, 0x18, 0x2e, 0x2d, 0x7f, 0x24, 0x20, 0x70, - 0xab, 0xf4, 0x8f, 0x33, 0xf7, 0x40, 0x8e, 0xc2, 0x3f, 0x05, 0xb9, 0xc5, 0xf2, 0xc2, 0xc6, 0x72, - 0xe1, 0x88, 0xfb, 0xe8, 0xf1, 0x37, 0x05, 0xb9, 0xa5, 0x62, 0xa3, 0xb8, 0x5a, 0x90, 0xdc, 0x7a, - 0x54, 0xaa, 0x4b, 0xb5, 0x82, 0xec, 0x26, 0xae, 0x17, 0xab, 0x95, 0x52, 0x21, 0xab, 0x4c, 0xc3, - 0xc4, 0xb9, 0xa2, 0x5a, 0xad, 0x54, 0x97, 0x0b, 0x39, 0xf4, 0xb7, 0x61, 0xfc, 0x6e, 0xe7, 0xf1, - 0xbb, 0x2e, 0x8a, 0xa7, 0x7e, 0x90, 0xbd, 0xdc, 0x87, 0xec, 0x4e, 0x0e, 0xb2, 0x1f, 0x17, 0x21, - 0x32, 0x06, 0x77, 0xa6, 0x3c, 0x4c, 0xac, 0x5b, 0x66, 0x0b, 0xdb, 0x36, 0xfa, 0x75, 0x09, 0xf2, - 0x25, 0xcd, 0x68, 0xe1, 0x0e, 0xba, 0x22, 0x80, 0x8a, 0xba, 0x8a, 0x66, 0xfc, 0xd3, 0x62, 0xff, - 0x98, 0x11, 0xed, 0xfd, 0x18, 0xdd, 0x79, 0x4a, 0x33, 0x42, 0x3e, 0x62, 0xbd, 0x5c, 0x2c, 0xa9, - 0x31, 0x5c, 0x8d, 0x23, 0xc1, 0x14, 0x5b, 0x0d, 0x38, 0x8f, 0xc3, 0xf3, 0xf0, 0xef, 0x66, 0x44, - 0x27, 0x87, 0x5e, 0x0d, 0x7c, 0x32, 0x11, 0xf2, 0x10, 0x9b, 0x08, 0x0e, 0xa2, 0x36, 0x86, 0xcd, - 0x43, 0x09, 0xa6, 0x37, 0x0c, 0xbb, 0x9f, 0x50, 0xc4, 0xe3, 0xe8, 0x7b, 0xd5, 0x08, 0x11, 0x3a, - 0x50, 0x1c, 0xfd, 0xc1, 0xf4, 0xd2, 0x17, 0xcc, 0x77, 0x33, 0x70, 0x7c, 0x19, 0x1b, 0xd8, 0xd2, - 0x5b, 0xb4, 0x06, 0x9e, 0x24, 0xee, 0xe4, 0x25, 0xf1, 0x18, 0x8e, 0xf3, 0x7e, 0x7f, 0xf0, 0x12, - 0x78, 0x95, 0x2f, 0x81, 0xbb, 0x39, 0x09, 0xdc, 0x24, 0x48, 0x67, 0x0c, 0xf7, 0xa1, 0x4f, 0xc1, - 0x4c, 0xd5, 0x74, 0xf4, 0x4d, 0xbd, 0x45, 0x7d, 0xd0, 0x5e, 0x2a, 0x43, 0x76, 0x55, 0xb7, 0x1d, - 0x54, 0x0c, 0xba, 0x93, 0x6b, 0x60, 0x5a, 0x37, 0x5a, 0x9d, 0xdd, 0x36, 0x56, 0xb1, 0x46, 0xfb, - 0x95, 0x49, 0x35, 0x9c, 0x14, 0x6c, 0xed, 0xbb, 0x6c, 0xc9, 0xde, 0xd6, 0xfe, 0xa7, 0x85, 0x97, - 0x61, 0xc2, 0x2c, 0x90, 0x80, 0x94, 0x11, 0x76, 0x57, 0x11, 0x66, 0x8d, 0x50, 0x56, 0xcf, 0x60, - 0xef, 0xbd, 0x50, 0x20, 0x4c, 0x4e, 0xe5, 0xff, 0x40, 0xef, 0x13, 0x6a, 0xac, 0x83, 0x18, 0x4a, - 0x86, 0xcc, 0xd2, 0x10, 0x93, 0x64, 0x05, 0xe6, 0x2a, 0xd5, 0x46, 0x59, 0xad, 0x16, 0x57, 0x59, - 0x16, 0x19, 0x7d, 0x5f, 0x82, 0x9c, 0x8a, 0xbb, 0x9d, 0x4b, 0xe1, 0x88, 0xd1, 0xcc, 0x51, 0x3c, - 0xe3, 0x3b, 0x8a, 0x2b, 0x4b, 0x00, 0x5a, 0xcb, 0x2d, 0x98, 0x5c, 0xa9, 0x25, 0xf5, 0x8d, 0x63, - 0xca, 0x55, 0xb0, 0xe8, 0xe7, 0x56, 0x43, 0x7f, 0xa2, 0x87, 0x84, 0x77, 0x8e, 0x38, 0x6a, 0x84, - 0xc3, 0x88, 0x3e, 0xe1, 0xfd, 0x42, 0x9b, 0x3d, 0x03, 0xc9, 0x1d, 0x8e, 0xf8, 0xbf, 0x22, 0x41, - 0xb6, 0xe1, 0xf6, 0x96, 0xa1, 0x8e, 0xf3, 0x53, 0xc3, 0xe9, 0xb8, 0x4b, 0x26, 0x42, 0xc7, 0xef, - 0x82, 0x99, 0xb0, 0xc6, 0x32, 0x57, 0x89, 0x58, 0x15, 0xe7, 0x7e, 0x18, 0x46, 0xc3, 0xfb, 0xb0, - 0x73, 0x38, 0x22, 0xfe, 0xc4, 0x63, 0x01, 0xd6, 0xf0, 0xce, 0x79, 0x6c, 0xd9, 0xdb, 0x7a, 0x17, - 0xfd, 0x9d, 0x0c, 0x53, 0xcb, 0xd8, 0xa9, 0x3b, 0x9a, 0xb3, 0x6b, 0xf7, 0x6c, 0x77, 0x1a, 0x66, - 0x49, 0x6b, 0x6d, 0x63, 0xd6, 0x1d, 0x79, 0xaf, 0xe8, 0x5d, 0xb2, 0xa8, 0x3f, 0x51, 0x50, 0xce, - 0xbc, 0x5f, 0x46, 0x04, 0x26, 0x8f, 0x83, 0x6c, 0x5b, 0x73, 0x34, 0x86, 0xc5, 0x15, 0x3d, 0x58, - 0x04, 0x84, 0x54, 0x92, 0x0d, 0xfd, 0xb6, 0x24, 0xe2, 0x50, 0x24, 0x50, 0x7e, 0x32, 0x10, 0xde, - 0x97, 0x19, 0x02, 0x85, 0x63, 0x30, 0x5b, 0xad, 0x35, 0x9a, 0xab, 0xb5, 0xe5, 0xe5, 0xb2, 0x9b, - 0x5a, 0x90, 0x95, 0x93, 0xa0, 0xac, 0x17, 0xef, 0x5b, 0x2b, 0x57, 0x1b, 0xcd, 0x6a, 0x6d, 0xb1, - 0xcc, 0xfe, 0xcc, 0x2a, 0x47, 0x61, 0xba, 0x54, 0x2c, 0xad, 0x78, 0x09, 0x39, 0xe5, 0x14, 0x1c, - 0x5f, 0x2b, 0xaf, 0x2d, 0x94, 0xd5, 0xfa, 0x4a, 0x65, 0xbd, 0xe9, 0x92, 0x59, 0xaa, 0x6d, 0x54, - 0x17, 0x0b, 0x79, 0x05, 0xc1, 0xc9, 0xd0, 0x97, 0x73, 0x6a, 0xad, 0xba, 0xdc, 0xac, 0x37, 0x8a, - 0x8d, 0x72, 0x61, 0x42, 0xb9, 0x0c, 0x8e, 0x96, 0x8a, 0x55, 0x92, 0xbd, 0x54, 0xab, 0x56, 0xcb, - 0xa5, 0x46, 0x61, 0x12, 0xfd, 0x7b, 0x16, 0xa6, 0x2b, 0x76, 0x55, 0xdb, 0xc1, 0x67, 0xb5, 0x8e, - 0xde, 0x46, 0xcf, 0x0f, 0xcd, 0x3c, 0xae, 0x83, 0x59, 0x8b, 0x3e, 0xe2, 0x76, 0x43, 0xc7, 0x14, - 0xcd, 0x59, 0x95, 0x4f, 0x74, 0xe7, 0xe4, 0x06, 0x21, 0xe0, 0xcd, 0xc9, 0xe9, 0x9b, 0xb2, 0x00, - 0x40, 0x9f, 0x1a, 0xc1, 0xe5, 0xae, 0x67, 0x7a, 0x5b, 0x93, 0xb6, 0x83, 0x6d, 0x6c, 0xed, 0xe9, - 0x2d, 0xec, 0xe5, 0x54, 0x43, 0x7f, 0xa1, 0xaf, 0xca, 0xa2, 0xfb, 0x8b, 0x21, 0x50, 0x43, 0xd5, - 0x89, 0xe8, 0x0d, 0x7f, 0x51, 0x16, 0xd9, 0x1d, 0x14, 0x22, 0x99, 0x4c, 0x53, 0x5e, 0x28, 0x0d, - 0xb7, 0x6c, 0xdb, 0xa8, 0xd5, 0x9a, 0xf5, 0x95, 0x9a, 0xda, 0x28, 0xc8, 0xca, 0x0c, 0x4c, 0xba, - 0xaf, 0xab, 0xb5, 0xea, 0x72, 0x21, 0xab, 0x9c, 0x80, 0x63, 0x2b, 0xc5, 0x7a, 0xb3, 0x52, 0x3d, - 0x5b, 0x5c, 0xad, 0x2c, 0x36, 0x4b, 0x2b, 0x45, 0xb5, 0x5e, 0xc8, 0x29, 0x57, 0xc0, 0x89, 0x46, - 0xa5, 0xac, 0x36, 0x97, 0xca, 0xc5, 0xc6, 0x86, 0x5a, 0xae, 0x37, 0xab, 0xb5, 0x66, 0xb5, 0xb8, - 0x56, 0x2e, 0xe4, 0xdd, 0xe6, 0x4f, 0x3e, 0x05, 0x6a, 0x33, 0xb1, 0x5f, 0x19, 0x27, 0x23, 0x94, - 0x71, 0xaa, 0x57, 0x19, 0x21, 0xac, 0x56, 0x6a, 0xb9, 0x5e, 0x56, 0xcf, 0x96, 0x0b, 0xd3, 0xfd, - 0x74, 0x6d, 0x46, 0x39, 0x0e, 0x05, 0x97, 0x87, 0x66, 0xa5, 0xee, 0xe5, 0x5c, 0x2c, 0xcc, 0xa2, - 0x8f, 0xe7, 0xe1, 0xa4, 0x8a, 0xb7, 0x74, 0xdb, 0xc1, 0xd6, 0xba, 0x76, 0x69, 0x07, 0x1b, 0x8e, - 0xd7, 0xc9, 0xff, 0x4b, 0x62, 0x65, 0x5c, 0x83, 0xd9, 0x2e, 0xa5, 0xb1, 0x86, 0x9d, 0x6d, 0xb3, - 0xcd, 0x46, 0xe1, 0xc7, 0x44, 0xf6, 0x1c, 0xf3, 0xeb, 0xe1, 0xec, 0x2a, 0xff, 0x77, 0x48, 0xb7, - 0xe5, 0x18, 0xdd, 0xce, 0x0e, 0xa3, 0xdb, 0xca, 0x55, 0x30, 0xb5, 0x6b, 0x63, 0xab, 0xbc, 0xa3, - 0xe9, 0x1d, 0xef, 0x72, 0x4e, 0x3f, 0x01, 0xbd, 0x3d, 0x2b, 0x7a, 0x62, 0x25, 0x54, 0x97, 0xfe, - 0x62, 0x8c, 0xe8, 0x5b, 0x4f, 0x03, 0xb0, 0xca, 0x6e, 0x58, 0x1d, 0xa6, 0xac, 0xa1, 0x14, 0x97, - 0xbf, 0xf3, 0x7a, 0xa7, 0xa3, 0x1b, 0x5b, 0xfe, 0xbe, 0x7f, 0x90, 0x80, 0x5e, 0x28, 0x8b, 0x9c, - 0x60, 0x49, 0xca, 0x5b, 0xb2, 0xd6, 0xf4, 0x90, 0x34, 0xe6, 0x7e, 0x77, 0x7f, 0xd3, 0xc9, 0x2b, - 0x05, 0x98, 0x21, 0x69, 0xac, 0x05, 0x16, 0x26, 0xdc, 0x3e, 0xd8, 0x23, 0xb7, 0x56, 0x6e, 0xac, - 0xd4, 0x16, 0xfd, 0x6f, 0x93, 0x2e, 0x49, 0x97, 0x99, 0x62, 0xf5, 0x3e, 0xd2, 0x1a, 0xa7, 0x94, - 0x47, 0xc1, 0x15, 0xa1, 0x0e, 0xbb, 0xb8, 0xaa, 0x96, 0x8b, 0x8b, 0xf7, 0x35, 0xcb, 0x4f, 0xaf, - 0xd4, 0x1b, 0x75, 0xbe, 0x71, 0x79, 0xed, 0x68, 0xda, 0xe5, 0xb7, 0xbc, 0x56, 0xac, 0xac, 0xb2, - 0xfe, 0x7d, 0xa9, 0xa6, 0xae, 0x15, 0x1b, 0x85, 0x19, 0xf4, 0x32, 0x19, 0x0a, 0xcb, 0xd8, 0x59, - 0x37, 0x2d, 0x47, 0xeb, 0xac, 0xea, 0xc6, 0x85, 0x0d, 0xab, 0xc3, 0x4d, 0x36, 0x85, 0xc3, 0x74, - 0xf0, 0x43, 0x24, 0x47, 0x30, 0x7a, 0x47, 0xbc, 0x4b, 0xb2, 0x05, 0xca, 0x14, 0x24, 0xa0, 0x67, - 0x4a, 0x22, 0xcb, 0xdd, 0xe2, 0xa5, 0x26, 0xd3, 0x93, 0x67, 0x8d, 0x7b, 0x7c, 0xee, 0x83, 0x5a, - 0x1e, 0x3d, 0x37, 0x0b, 0x93, 0x4b, 0xba, 0xa1, 0x75, 0xf4, 0x67, 0x70, 0xf1, 0x4b, 0x83, 0x3e, - 0x26, 0x13, 0xd3, 0xc7, 0x48, 0x43, 0x8d, 0x9f, 0xbf, 0x2a, 0x8b, 0x2e, 0x2f, 0x84, 0x64, 0xef, - 0x31, 0x19, 0x31, 0x78, 0x7e, 0x48, 0x12, 0x59, 0x5e, 0x18, 0x4c, 0x2f, 0x19, 0x86, 0x9f, 0xfc, - 0xe1, 0xb0, 0xb1, 0x7a, 0xda, 0xf7, 0x64, 0x3f, 0x55, 0x98, 0x42, 0x7f, 0x26, 0x03, 0x5a, 0xc6, - 0xce, 0x59, 0x6c, 0xf9, 0x53, 0x01, 0xd2, 0xeb, 0x33, 0x7b, 0x3b, 0xd4, 0x64, 0xdf, 0x1c, 0x06, - 0xf0, 0x1c, 0x0f, 0x60, 0x31, 0xa6, 0xf1, 0x44, 0x90, 0x8e, 0x68, 0xbc, 0x15, 0xc8, 0xdb, 0xe4, - 0x3b, 0x53, 0xb3, 0xc7, 0x47, 0x0f, 0x97, 0x84, 0x58, 0x98, 0x3a, 0x25, 0xac, 0x32, 0x02, 0xe8, - 0x7b, 0xfe, 0x24, 0xe8, 0xa7, 0x38, 0xed, 0x58, 0x3a, 0x30, 0xb3, 0xc9, 0xf4, 0xc5, 0x4a, 0x57, - 0x5d, 0xfa, 0xd9, 0x37, 0xe8, 0x43, 0x39, 0x38, 0xde, 0xaf, 0x3a, 0xe8, 0x77, 0x32, 0xdc, 0x0e, - 0x3b, 0x26, 0x43, 0x7e, 0x86, 0x6d, 0x20, 0xba, 0x2f, 0xca, 0x13, 0xe1, 0x84, 0xbf, 0x0c, 0xd7, - 0x30, 0xab, 0xf8, 0xa2, 0xdd, 0xc1, 0x8e, 0x83, 0x2d, 0x52, 0xb5, 0x49, 0xb5, 0xff, 0x47, 0xe5, - 0xc9, 0x70, 0xb9, 0x6e, 0xd8, 0x7a, 0x1b, 0x5b, 0x0d, 0xbd, 0x6b, 0x17, 0x8d, 0x76, 0x63, 0xd7, - 0x31, 0x2d, 0x5d, 0x63, 0x57, 0x49, 0x4e, 0xaa, 0x51, 0x9f, 0x95, 0x1b, 0xa1, 0xa0, 0xdb, 0x35, - 0xe3, 0xbc, 0xa9, 0x59, 0x6d, 0xdd, 0xd8, 0x5a, 0xd5, 0x6d, 0x87, 0x79, 0x00, 0xef, 0x4b, 0x47, - 0x7f, 0x2f, 0x8b, 0x1e, 0xa6, 0x1b, 0x00, 0x6b, 0x44, 0x87, 0xf2, 0x3c, 0x59, 0xe4, 0x78, 0x5c, - 0x32, 0xda, 0xc9, 0x94, 0xe5, 0x39, 0xe3, 0x36, 0x24, 0xfa, 0x8f, 0xe0, 0xa4, 0x6b, 0xa1, 0xe9, - 0x9e, 0x21, 0x70, 0xb6, 0xac, 0x56, 0x96, 0x2a, 0x65, 0xd7, 0xac, 0x38, 0x01, 0xc7, 0x82, 0x6f, - 0x8b, 0xf7, 0x35, 0xeb, 0xe5, 0x6a, 0xa3, 0x30, 0xe9, 0xf6, 0x53, 0x34, 0x79, 0xa9, 0x58, 0x59, - 0x2d, 0x2f, 0x36, 0x1b, 0x35, 0xf7, 0xcb, 0xe2, 0x70, 0xa6, 0x05, 0x7a, 0x30, 0x0b, 0x47, 0x89, - 0x6c, 0x2f, 0x11, 0xa9, 0xba, 0x42, 0xe9, 0xf1, 0xb5, 0xf5, 0x01, 0x9a, 0xa2, 0xe2, 0x45, 0x9f, - 0x15, 0xbe, 0x29, 0x33, 0x04, 0x61, 0x4f, 0x19, 0x11, 0x9a, 0xf1, 0x5d, 0x49, 0x24, 0x42, 0x85, - 0x30, 0xd9, 0x64, 0x4a, 0xf1, 0xaf, 0xe3, 0x1e, 0x71, 0xa2, 0xc1, 0x27, 0x56, 0x66, 0x89, 0xfc, - 0xfc, 0xf4, 0xf5, 0x8a, 0x4a, 0xd4, 0x61, 0x0e, 0x80, 0xa4, 0x10, 0x0d, 0xa2, 0x7a, 0xd0, 0x77, - 0xbc, 0x8a, 0xd2, 0x83, 0x62, 0xa9, 0x51, 0x39, 0x5b, 0x8e, 0xd2, 0x83, 0xcf, 0xc8, 0x30, 0xb9, - 0x8c, 0x1d, 0x77, 0x4e, 0x65, 0xa3, 0xa7, 0x08, 0xac, 0xff, 0xb8, 0x66, 0x4c, 0xc7, 0x6c, 0x69, - 0x1d, 0x7f, 0x19, 0x80, 0xbe, 0xa1, 0x67, 0x0f, 0x63, 0x82, 0x78, 0x45, 0x47, 0x8c, 0x57, 0x3f, - 0x09, 0x39, 0xc7, 0xfd, 0xcc, 0x96, 0xa1, 0x7f, 0x2c, 0x72, 0xb8, 0x72, 0x89, 0x2c, 0x6a, 0x8e, - 0xa6, 0xd2, 0xfc, 0xa1, 0xd1, 0x49, 0xd0, 0x76, 0x89, 0x60, 0xe4, 0x87, 0xd1, 0xfe, 0xfc, 0x5b, - 0x19, 0x4e, 0xd0, 0xf6, 0x51, 0xec, 0x76, 0xeb, 0x8e, 0x69, 0x61, 0x15, 0xb7, 0xb0, 0xde, 0x75, - 0x7a, 0xd6, 0xf7, 0x2c, 0x9a, 0xea, 0x6d, 0x36, 0xb3, 0x57, 0xf4, 0x06, 0x59, 0x34, 0x06, 0xf3, - 0xbe, 0xf6, 0xd8, 0x53, 0x5e, 0x44, 0x63, 0xff, 0x98, 0x24, 0x12, 0x55, 0x39, 0x21, 0xf1, 0x64, - 0x40, 0x7d, 0xf8, 0x10, 0x80, 0xf2, 0x56, 0x6e, 0xd4, 0x72, 0xa9, 0x5c, 0x59, 0x77, 0x07, 0x81, - 0xab, 0xe1, 0xca, 0xf5, 0x0d, 0xb5, 0xb4, 0x52, 0xac, 0x97, 0x9b, 0x6a, 0x79, 0xb9, 0x52, 0x6f, - 0x30, 0xa7, 0x2c, 0xfa, 0xd7, 0x84, 0x72, 0x15, 0x9c, 0xaa, 0x6f, 0x2c, 0xd4, 0x4b, 0x6a, 0x65, - 0x9d, 0xa4, 0xab, 0xe5, 0x6a, 0xf9, 0x1c, 0xfb, 0x3a, 0x89, 0x3e, 0x50, 0x80, 0x69, 0x77, 0x02, - 0x50, 0xa7, 0xf3, 0x02, 0xf4, 0xad, 0x2c, 0x4c, 0xab, 0xd8, 0x36, 0x3b, 0x7b, 0x64, 0x8e, 0x30, - 0xae, 0xa9, 0xc7, 0x77, 0x64, 0xd1, 0xf3, 0xdb, 0x21, 0x66, 0xe7, 0x43, 0x8c, 0x46, 0x4f, 0x34, - 0xb5, 0x3d, 0x4d, 0xef, 0x68, 0xe7, 0x59, 0x57, 0x33, 0xa9, 0x06, 0x09, 0xca, 0x3c, 0x28, 0xe6, - 0x45, 0x03, 0x5b, 0xf5, 0xd6, 0xc5, 0xb2, 0xb3, 0x5d, 0x6c, 0xb7, 0x2d, 0x6c, 0xdb, 0x6c, 0xf5, - 0xa2, 0xcf, 0x17, 0xe5, 0x06, 0x38, 0x4a, 0x52, 0x43, 0x99, 0xa9, 0x83, 0x4c, 0x6f, 0xb2, 0x9f, - 0xb3, 0x68, 0x5c, 0xf2, 0x72, 0xe6, 0x42, 0x39, 0x83, 0xe4, 0xf0, 0x71, 0x89, 0x3c, 0x7f, 0x4a, - 0xe7, 0x1a, 0x98, 0x36, 0xb4, 0x1d, 0x5c, 0x7e, 0xa0, 0xab, 0x5b, 0xd8, 0x26, 0x8e, 0x31, 0xb2, - 0x1a, 0x4e, 0x42, 0x1f, 0x12, 0x3a, 0x6f, 0x2e, 0x26, 0xb1, 0x64, 0xba, 0xbf, 0x3c, 0x84, 0xea, - 0xf7, 0xe9, 0x67, 0x64, 0xf4, 0x01, 0x19, 0x66, 0x18, 0x53, 0x45, 0xe3, 0x52, 0xa5, 0x8d, 0xae, - 0xe6, 0x8c, 0x5f, 0xcd, 0x4d, 0xf3, 0x8c, 0x5f, 0xf2, 0x82, 0x7e, 0x49, 0x16, 0x75, 0x77, 0xee, - 0x53, 0x71, 0x52, 0x46, 0xb4, 0xe3, 0xe8, 0xa6, 0xb9, 0xcb, 0x1c, 0x55, 0x27, 0x55, 0xfa, 0x92, - 0xe6, 0xa2, 0x1e, 0xfa, 0x7d, 0x21, 0x67, 0x6a, 0xc1, 0x6a, 0x1c, 0x12, 0x80, 0x9f, 0x90, 0x61, - 0x8e, 0x71, 0x55, 0x67, 0xe7, 0x7c, 0x84, 0x0e, 0xbc, 0xfd, 0xb2, 0xb0, 0x21, 0xd8, 0xa7, 0xfe, - 0xac, 0xa4, 0x47, 0x0c, 0x90, 0x1f, 0x11, 0x0a, 0x8e, 0x26, 0x5c, 0x91, 0x43, 0x82, 0xf2, 0x1d, - 0x59, 0x98, 0xde, 0xb0, 0xb1, 0xc5, 0xfc, 0xf6, 0xd1, 0x6b, 0xb3, 0x20, 0x2f, 0x63, 0x6e, 0x23, - 0xf5, 0x05, 0xc2, 0x1e, 0xbe, 0xe1, 0xca, 0x86, 0x88, 0xba, 0x36, 0x52, 0x04, 0x6c, 0xd7, 0xc3, - 0x1c, 0x15, 0x69, 0xd1, 0x71, 0x5c, 0x23, 0xd1, 0xf3, 0xa6, 0xed, 0x49, 0x1d, 0xc5, 0x56, 0x11, - 0x29, 0xcb, 0xcd, 0x52, 0x72, 0x79, 0x5a, 0xc5, 0x9b, 0x74, 0x3e, 0x9b, 0x55, 0x7b, 0x52, 0x95, - 0x5b, 0xe0, 0x32, 0xb3, 0x8b, 0xe9, 0xf9, 0x95, 0x50, 0xe6, 0x1c, 0xc9, 0xdc, 0xef, 0x13, 0xfa, - 0x96, 0x90, 0xaf, 0xae, 0xb8, 0x74, 0x92, 0xe9, 0x42, 0x77, 0x34, 0x26, 0xc9, 0x71, 0x28, 0xb8, - 0x39, 0xc8, 0xfe, 0x8b, 0x5a, 0xae, 0xd7, 0x56, 0xcf, 0x96, 0xfb, 0x2f, 0x63, 0xe4, 0xd0, 0x73, - 0x64, 0x98, 0x5a, 0xb0, 0x4c, 0xad, 0xdd, 0xd2, 0x6c, 0x07, 0x7d, 0x4f, 0x82, 0x99, 0x75, 0xed, - 0x52, 0xc7, 0xd4, 0xda, 0xc4, 0xbf, 0xbf, 0xa7, 0x2f, 0xe8, 0xd2, 0x4f, 0x5e, 0x5f, 0xc0, 0x5e, - 0xf9, 0x83, 0x81, 0xfe, 0xd1, 0xbd, 0x8c, 0xc8, 0x85, 0x9a, 0xfe, 0x36, 0x9f, 0xd4, 0x2f, 0x58, - 0xa9, 0xc7, 0xd7, 0x7c, 0x98, 0xa7, 0x08, 0x8b, 0xf2, 0x03, 0x62, 0xe1, 0x47, 0x45, 0x48, 0x1e, - 0xce, 0xae, 0xfc, 0x73, 0x27, 0x21, 0xbf, 0x88, 0x89, 0x15, 0xf7, 0x3f, 0x24, 0x98, 0xa8, 0x63, - 0x87, 0x58, 0x70, 0xb7, 0x71, 0x9e, 0xc2, 0x6d, 0x92, 0x21, 0x70, 0x62, 0xf7, 0xde, 0xdd, 0xc9, - 0x7a, 0xe8, 0xbc, 0x35, 0x79, 0x4e, 0xe0, 0x91, 0x48, 0xcb, 0x9d, 0x67, 0x65, 0x1e, 0xc8, 0x23, - 0x31, 0x96, 0x54, 0xfa, 0xbe, 0x56, 0xef, 0x92, 0x98, 0x6b, 0x55, 0xa8, 0xd7, 0x7b, 0x75, 0x58, - 0x3f, 0x63, 0xbd, 0xcd, 0x18, 0xf3, 0x31, 0xce, 0x51, 0x4f, 0x80, 0x09, 0x2a, 0x73, 0x6f, 0x3e, - 0xda, 0xeb, 0xa7, 0x40, 0x49, 0x90, 0xb3, 0xd7, 0x5e, 0x4e, 0x41, 0x17, 0xb5, 0xe8, 0xc2, 0xc7, - 0x12, 0x83, 0x60, 0xa6, 0x8a, 0x9d, 0x8b, 0xa6, 0x75, 0xa1, 0xee, 0x68, 0x0e, 0x46, 0xff, 0x2a, - 0x81, 0x5c, 0xc7, 0x4e, 0x38, 0xfa, 0x49, 0x15, 0x8e, 0xd1, 0x0a, 0xb1, 0x8c, 0xa4, 0xff, 0xa6, - 0x15, 0xb9, 0xa6, 0xaf, 0x10, 0x42, 0xf9, 0xd4, 0xfd, 0xbf, 0xa2, 0x5f, 0xef, 0x1b, 0xf4, 0x49, - 0xea, 0x33, 0x69, 0x60, 0x92, 0x09, 0x33, 0xe8, 0x2a, 0x58, 0x84, 0x9e, 0x7e, 0x50, 0xc8, 0xac, - 0x16, 0xa3, 0x79, 0x38, 0x5d, 0xc1, 0x47, 0xae, 0x80, 0x6c, 0x69, 0x5b, 0x73, 0xd0, 0x3b, 0x65, - 0x80, 0x62, 0xbb, 0xbd, 0x46, 0x7d, 0xc0, 0xc3, 0x0e, 0x69, 0x67, 0x60, 0xa6, 0xb5, 0xad, 0x05, - 0x77, 0x9b, 0xd0, 0xfe, 0x80, 0x4b, 0x53, 0x9e, 0x18, 0x38, 0x93, 0x53, 0xa9, 0xa2, 0x1e, 0x98, - 0xdc, 0x32, 0x18, 0x6d, 0xdf, 0xd1, 0x9c, 0x0f, 0x85, 0x19, 0x7b, 0x84, 0xce, 0xfd, 0x7d, 0x3e, - 0x60, 0x2f, 0x7a, 0x0e, 0xc7, 0x48, 0xfb, 0x07, 0x6c, 0x82, 0x84, 0x84, 0x27, 0xbd, 0xc5, 0x02, - 0x7a, 0xc4, 0xf3, 0x35, 0x96, 0xd0, 0xb5, 0x4a, 0xb9, 0xad, 0x7b, 0xa2, 0x65, 0x01, 0xb3, 0xd0, - 0x43, 0x99, 0x64, 0xf0, 0xc5, 0x0b, 0xee, 0x6e, 0x98, 0xc5, 0x6d, 0xdd, 0xc1, 0x5e, 0x2d, 0x99, - 0x00, 0xe3, 0x20, 0xe6, 0x7f, 0x40, 0xcf, 0x12, 0x0e, 0xba, 0x46, 0x04, 0xba, 0xbf, 0x46, 0x11, - 0xed, 0x4f, 0x2c, 0x8c, 0x9a, 0x18, 0xcd, 0xf4, 0xc1, 0x7a, 0xb6, 0x0c, 0x27, 0x1a, 0xe6, 0xd6, - 0x56, 0x07, 0x7b, 0x62, 0xc2, 0xd4, 0x3b, 0x13, 0x69, 0xa3, 0x84, 0x8b, 0xec, 0x04, 0x99, 0xf7, - 0xeb, 0xfe, 0x51, 0x32, 0xf7, 0x85, 0x3f, 0x31, 0x15, 0x3b, 0x8b, 0x22, 0xe2, 0xea, 0xcb, 0x67, - 0x04, 0x0a, 0x62, 0x01, 0x9f, 0x85, 0xc9, 0xa6, 0x0f, 0xc4, 0x17, 0x25, 0x98, 0xa5, 0x37, 0x57, - 0x7a, 0x0a, 0x7a, 0xef, 0x08, 0x01, 0x40, 0xdf, 0xcb, 0x88, 0xfa, 0xd9, 0x12, 0x99, 0x70, 0x9c, - 0x44, 0x88, 0x58, 0x2c, 0xa8, 0xca, 0x40, 0x72, 0xe9, 0x8b, 0xf6, 0x8f, 0x65, 0x98, 0x5e, 0xc6, - 0x5e, 0x4b, 0xb3, 0x13, 0xf7, 0x44, 0x67, 0x60, 0x86, 0x5c, 0xdf, 0x56, 0x63, 0xc7, 0x24, 0xe9, - 0xaa, 0x19, 0x97, 0xa6, 0x5c, 0x07, 0xb3, 0xe7, 0xf1, 0xa6, 0x69, 0xe1, 0x1a, 0x77, 0x96, 0x92, - 0x4f, 0x8c, 0x08, 0x4f, 0xc7, 0xc5, 0x41, 0x5b, 0xe0, 0xb1, 0xb9, 0x69, 0xbf, 0x30, 0x43, 0x55, - 0x89, 0x18, 0x73, 0x9e, 0x04, 0x93, 0x0c, 0x79, 0xcf, 0x4c, 0x8b, 0xeb, 0x17, 0xfd, 0xbc, 0xe8, - 0xf5, 0x3e, 0xa2, 0x65, 0x0e, 0xd1, 0xc7, 0x27, 0x61, 0x62, 0x2c, 0xf7, 0xbb, 0x17, 0x42, 0xe5, - 0x2f, 0x5c, 0xaa, 0xb4, 0x6d, 0xb4, 0x96, 0x0c, 0xd3, 0xd3, 0x00, 0x7e, 0xe3, 0xf0, 0xc2, 0x5a, - 0x84, 0x52, 0xf8, 0xc8, 0xf5, 0xb1, 0x07, 0xf5, 0x7a, 0xc5, 0x41, 0xd8, 0x19, 0x31, 0x30, 0x62, - 0x07, 0xfc, 0x44, 0x38, 0x49, 0x1f, 0x9d, 0x4f, 0xcb, 0x70, 0xc2, 0x3f, 0x7f, 0xb4, 0xaa, 0xd9, - 0x41, 0xbb, 0x2b, 0x25, 0x83, 0x88, 0x3b, 0xf0, 0xe1, 0x37, 0x96, 0x6f, 0x27, 0x1b, 0x33, 0xfa, - 0x72, 0x32, 0x5a, 0x74, 0x94, 0x9b, 0xe0, 0x98, 0xb1, 0xbb, 0xe3, 0x4b, 0x9d, 0xb4, 0x78, 0xd6, - 0xc2, 0xf7, 0x7f, 0x48, 0x32, 0x32, 0x89, 0x30, 0x3f, 0x96, 0x39, 0x25, 0x77, 0xa4, 0xeb, 0x71, - 0x89, 0x60, 0x44, 0xff, 0x9c, 0x49, 0xd4, 0xbb, 0x0d, 0x3e, 0xf3, 0x95, 0xa0, 0x97, 0x3a, 0xc4, - 0x03, 0x5f, 0x67, 0x26, 0x20, 0x57, 0xde, 0xe9, 0x3a, 0x97, 0xce, 0x3c, 0x1a, 0x66, 0xeb, 0x8e, - 0x85, 0xb5, 0x9d, 0xd0, 0xce, 0x80, 0x63, 0x5e, 0xc0, 0x86, 0xb7, 0x33, 0x40, 0x5e, 0x6e, 0xbf, - 0x0d, 0x26, 0x0c, 0xb3, 0xa9, 0xed, 0x3a, 0xdb, 0xca, 0xd5, 0xfb, 0x8e, 0xd4, 0x33, 0xf0, 0x6b, - 0x2c, 0x86, 0xd1, 0x57, 0xef, 0x20, 0x6b, 0xc3, 0x79, 0xc3, 0x2c, 0xee, 0x3a, 0xdb, 0x0b, 0x57, - 0x7d, 0xe2, 0x6f, 0x4e, 0x67, 0x3e, 0xf3, 0x37, 0xa7, 0x33, 0x5f, 0xf9, 0x9b, 0xd3, 0x99, 0x5f, - 0xfe, 0xda, 0xe9, 0x23, 0x9f, 0xf9, 0xda, 0xe9, 0x23, 0x5f, 0xfc, 0xda, 0xe9, 0x23, 0x3f, 0x25, - 0x75, 0xcf, 0x9f, 0xcf, 0x13, 0x2a, 0x4f, 0xf8, 0x7f, 0x03, 0x00, 0x00, 0xff, 0xff, 0x77, 0x3a, - 0x9d, 0xaf, 0x49, 0x08, 0x02, 0x00, + 0xfd, 0x20, 0xad, 0x1d, 0x7d, 0x52, 0xf6, 0x35, 0x66, 0x11, 0xb7, 0x3a, 0xba, 0x81, 0xd1, 0xdd, + 0x07, 0x54, 0x18, 0x7e, 0xd5, 0x47, 0x1c, 0x67, 0x56, 0x7e, 0x04, 0xce, 0xaf, 0x4a, 0x8e, 0x73, + 0x7f, 0x82, 0xff, 0x81, 0x9b, 0xff, 0x23, 0x32, 0x1c, 0x0b, 0x35, 0x44, 0x15, 0xef, 0x8c, 0x6c, + 0x25, 0xef, 0xe7, 0xc2, 0x6d, 0xb7, 0xc2, 0x63, 0xda, 0xcf, 0x9a, 0xde, 0xc7, 0x46, 0x04, 0xac, + 0x6f, 0xf4, 0x61, 0x5d, 0xe5, 0x60, 0x7d, 0xea, 0x10, 0x34, 0x93, 0x21, 0xfb, 0x3b, 0xa9, 0x22, + 0x7b, 0x05, 0x9c, 0x58, 0x2f, 0xaa, 0x8d, 0x4a, 0xa9, 0xb2, 0x5e, 0x74, 0xc7, 0xd1, 0xd0, 0x90, + 0x1d, 0x61, 0xae, 0xf3, 0xa0, 0xf7, 0xc5, 0xf7, 0x03, 0x59, 0xb8, 0xaa, 0x7f, 0x47, 0x5b, 0xda, + 0xd6, 0x8c, 0x2d, 0x8c, 0x74, 0x11, 0xa8, 0x17, 0x61, 0xa2, 0x45, 0xb2, 0x53, 0x9c, 0xc3, 0x5b, + 0x37, 0x31, 0x7d, 0x39, 0x2d, 0x41, 0xf5, 0x7e, 0x45, 0xef, 0x08, 0x2b, 0x44, 0x83, 0x57, 0x88, + 0xbb, 0xe2, 0xc1, 0xdb, 0xc7, 0x77, 0x84, 0x6e, 0x7c, 0xc6, 0xd7, 0x8d, 0x73, 0x9c, 0x6e, 0x94, + 0x0e, 0x46, 0x3e, 0x99, 0x9a, 0xfc, 0xd1, 0xa3, 0xa1, 0x03, 0x88, 0xd4, 0x26, 0x3d, 0x7a, 0x54, + 0xe8, 0xdb, 0xdd, 0xbf, 0x42, 0x86, 0xfc, 0x22, 0xee, 0x60, 0xd1, 0x95, 0xc8, 0x6f, 0x49, 0xa2, + 0x1b, 0x22, 0x14, 0x06, 0x4a, 0x3b, 0x7a, 0x75, 0xc4, 0xd1, 0x77, 0xb0, 0xed, 0x68, 0x3b, 0x5d, + 0x22, 0x6a, 0x59, 0x0d, 0x12, 0xd0, 0xcf, 0x4b, 0x22, 0xdb, 0x25, 0x31, 0xc5, 0xfc, 0xc7, 0x58, + 0x53, 0xfc, 0x9c, 0x04, 0x93, 0x75, 0xec, 0xd4, 0xac, 0x36, 0xb6, 0x50, 0x3d, 0xc0, 0xe8, 0x1a, + 0x98, 0x26, 0xa0, 0xb8, 0xd3, 0x4c, 0x1f, 0xa7, 0x70, 0x92, 0x72, 0x3d, 0xcc, 0xf9, 0xaf, 0xe4, + 0x77, 0xd6, 0x8d, 0xf7, 0xa4, 0xa2, 0x7f, 0xcc, 0x88, 0xee, 0xe2, 0xb2, 0x25, 0x43, 0xc6, 0x4d, + 0x44, 0x2b, 0x15, 0xdb, 0x91, 0x8d, 0x25, 0x95, 0xfe, 0x46, 0xd7, 0xdb, 0x24, 0x80, 0x0d, 0xc3, + 0xf6, 0xe4, 0xfa, 0xf8, 0x04, 0x72, 0x45, 0xff, 0x9c, 0x49, 0x36, 0x8b, 0x09, 0xca, 0x89, 0x90, + 0xd8, 0x6b, 0x13, 0xac, 0x2d, 0x44, 0x12, 0x4b, 0x5f, 0x66, 0x5f, 0x9d, 0x83, 0xfc, 0x39, 0xad, + 0xd3, 0xc1, 0x0e, 0xfa, 0x9a, 0x04, 0xf9, 0x92, 0x85, 0x35, 0x07, 0x87, 0x45, 0x87, 0x60, 0xd2, + 0x32, 0x4d, 0x67, 0x5d, 0x73, 0xb6, 0x99, 0xdc, 0xfc, 0x77, 0xe6, 0x30, 0xf0, 0xa6, 0x70, 0xf7, + 0x71, 0x37, 0x2f, 0xba, 0x1f, 0xe5, 0x6a, 0x4b, 0x0b, 0x9a, 0xa7, 0x85, 0x44, 0xf4, 0x1f, 0x08, + 0x26, 0x77, 0x0c, 0xbc, 0x63, 0x1a, 0x7a, 0xcb, 0xb3, 0x39, 0xbd, 0x77, 0xf4, 0x21, 0x5f, 0xa6, + 0x0b, 0x9c, 0x4c, 0xe7, 0x85, 0x4b, 0x49, 0x26, 0xd0, 0xfa, 0x10, 0xbd, 0xc7, 0xd5, 0x70, 0x25, + 0xed, 0x0c, 0x9a, 0x8d, 0x5a, 0xb3, 0xa4, 0x96, 0x8b, 0x8d, 0x72, 0x73, 0xb5, 0x56, 0x2a, 0xae, + 0x36, 0xd5, 0xf2, 0x7a, 0xad, 0x80, 0xd1, 0xdf, 0x49, 0xae, 0x70, 0x5b, 0xe6, 0x1e, 0xb6, 0xd0, + 0xb2, 0x90, 0x9c, 0xe3, 0x64, 0xc2, 0x30, 0xf8, 0x55, 0x61, 0xa7, 0x0d, 0x26, 0x1d, 0xc6, 0x41, + 0x84, 0xf2, 0x7e, 0x58, 0xa8, 0xb9, 0xc7, 0x92, 0x7a, 0x14, 0x48, 0xfa, 0x7f, 0x4b, 0x30, 0x51, + 0x32, 0x8d, 0x3d, 0x6c, 0x39, 0xe1, 0xf9, 0x4e, 0x58, 0x9a, 0x19, 0x5e, 0x9a, 0xee, 0x20, 0x89, + 0x0d, 0xc7, 0x32, 0xbb, 0xde, 0x84, 0xc7, 0x7b, 0x45, 0xaf, 0x4f, 0x2a, 0x61, 0x56, 0x72, 0xf4, + 0xc2, 0x67, 0xff, 0x82, 0x38, 0xf6, 0xe4, 0x9e, 0x06, 0xf0, 0xea, 0x24, 0xb8, 0xf4, 0x67, 0x20, + 0xfd, 0x2e, 0xe5, 0xcb, 0x32, 0xcc, 0xd2, 0xc6, 0x57, 0xc7, 0xc4, 0x42, 0x43, 0xb5, 0xf0, 0x92, + 0x63, 0x8f, 0xf0, 0x57, 0x8e, 0x70, 0xe2, 0xcf, 0x6b, 0xdd, 0xae, 0xbf, 0xfc, 0xbc, 0x72, 0x44, + 0x65, 0xef, 0x54, 0xcd, 0x17, 0xf2, 0x90, 0xd5, 0x76, 0x9d, 0x6d, 0xf4, 0x7d, 0xe1, 0xc9, 0x27, + 0xd7, 0x19, 0x30, 0x7e, 0x22, 0x20, 0x39, 0x0e, 0x39, 0xc7, 0xbc, 0x80, 0x3d, 0x39, 0xd0, 0x17, + 0x17, 0x0e, 0xad, 0xdb, 0x6d, 0x90, 0x0f, 0x0c, 0x0e, 0xef, 0xdd, 0xb5, 0x75, 0xb4, 0x56, 0xcb, + 0xdc, 0x35, 0x9c, 0x8a, 0xb7, 0x04, 0x1d, 0x24, 0xa0, 0x2f, 0x66, 0x44, 0x26, 0xb3, 0x02, 0x0c, + 0x26, 0x83, 0xec, 0xfc, 0x10, 0x4d, 0x69, 0x1e, 0x6e, 0x2c, 0xae, 0xaf, 0x37, 0x1b, 0xb5, 0xfb, + 0xca, 0xd5, 0xc0, 0xf0, 0x6c, 0x56, 0xaa, 0xcd, 0xc6, 0x4a, 0xb9, 0x59, 0xda, 0x50, 0xc9, 0x3a, + 0x61, 0xb1, 0x54, 0xaa, 0x6d, 0x54, 0x1b, 0x05, 0x8c, 0xde, 0x2c, 0xc1, 0x4c, 0xa9, 0x63, 0xda, + 0x3e, 0xc2, 0x57, 0x07, 0x08, 0xfb, 0x62, 0xcc, 0x84, 0xc4, 0x88, 0xfe, 0x2d, 0x23, 0xea, 0x74, + 0xe0, 0x09, 0x24, 0x44, 0x3e, 0xa2, 0x97, 0x7a, 0xbd, 0x90, 0xd3, 0xc1, 0x60, 0x7a, 0xe9, 0x37, + 0x89, 0x2f, 0xdc, 0x05, 0x13, 0x45, 0xaa, 0x18, 0xe8, 0xaf, 0x33, 0x90, 0x2f, 0x99, 0xc6, 0xa6, + 0xbe, 0xe5, 0x1a, 0x73, 0xd8, 0xd0, 0xce, 0x77, 0xf0, 0xa2, 0xe6, 0x68, 0x7b, 0x3a, 0xbe, 0x48, + 0x2a, 0x30, 0xa9, 0xf6, 0xa4, 0xba, 0x4c, 0xb1, 0x14, 0x7c, 0x7e, 0x77, 0x8b, 0x30, 0x35, 0xa9, + 0x86, 0x93, 0x94, 0xa7, 0xc2, 0xe5, 0xf4, 0x75, 0xdd, 0xc2, 0x16, 0xee, 0x60, 0xcd, 0xc6, 0xee, + 0xb4, 0xc8, 0xc0, 0x1d, 0xa2, 0xb4, 0x93, 0x6a, 0xd4, 0x67, 0xe5, 0x0c, 0xcc, 0xd0, 0x4f, 0xc4, + 0x14, 0xb1, 0x89, 0x1a, 0x4f, 0xaa, 0x5c, 0x9a, 0xf2, 0x04, 0xc8, 0xe1, 0x07, 0x1d, 0x4b, 0x3b, + 0xd5, 0x26, 0x78, 0x5d, 0x3e, 0x4f, 0xbd, 0x0e, 0xe7, 0x3d, 0xaf, 0xc3, 0xf9, 0x3a, 0xf1, 0x49, + 0x54, 0x69, 0x2e, 0xf4, 0xc9, 0x49, 0xdf, 0x90, 0x78, 0xb3, 0x1c, 0x28, 0x86, 0x02, 0x59, 0x43, + 0xdb, 0xc1, 0x4c, 0x2f, 0xc8, 0xb3, 0x72, 0x23, 0x1c, 0xd5, 0xf6, 0x34, 0x47, 0xb3, 0x56, 0xcd, + 0x96, 0xd6, 0x21, 0x83, 0x9f, 0xd7, 0xf2, 0x7b, 0x3f, 0x90, 0x1d, 0x21, 0xc7, 0xb4, 0x30, 0xc9, + 0xe5, 0xed, 0x08, 0x79, 0x09, 0x2e, 0x75, 0xbd, 0x65, 0x1a, 0x84, 0x7f, 0x59, 0x25, 0xcf, 0xae, + 0x54, 0xda, 0xba, 0xed, 0x56, 0x84, 0x50, 0xa9, 0xd2, 0xad, 0x8d, 0xfa, 0x25, 0xa3, 0x45, 0x76, + 0x83, 0x26, 0xd5, 0xa8, 0xcf, 0xca, 0x02, 0x4c, 0xb3, 0x8d, 0x90, 0x35, 0x57, 0xaf, 0xf2, 0x44, + 0xaf, 0xae, 0xe1, 0x7d, 0xba, 0x28, 0x9e, 0xf3, 0xd5, 0x20, 0x9f, 0x1a, 0xfe, 0x49, 0xb9, 0x07, + 0xae, 0x64, 0xaf, 0xa5, 0x5d, 0xdb, 0x31, 0x77, 0x28, 0xe8, 0x4b, 0x7a, 0x87, 0xd6, 0x60, 0x82, + 0xd4, 0x20, 0x2e, 0x8b, 0x72, 0x2b, 0x1c, 0xef, 0x5a, 0x78, 0x13, 0x5b, 0xf7, 0x6b, 0x3b, 0xbb, + 0x0f, 0x36, 0x2c, 0xcd, 0xb0, 0xbb, 0xa6, 0xe5, 0x9c, 0x9a, 0x24, 0xcc, 0xf7, 0xfd, 0xa6, 0xdc, + 0x04, 0xc7, 0x1e, 0xb0, 0x4d, 0xa3, 0xd8, 0xd5, 0x57, 0x75, 0xdb, 0xc1, 0x46, 0xb1, 0xdd, 0xb6, + 0x4e, 0x4d, 0x91, 0xb2, 0xf6, 0x7f, 0x60, 0xdd, 0xea, 0x24, 0xe4, 0xa9, 0xb0, 0xd1, 0xf3, 0x73, + 0xc2, 0xce, 0x9f, 0xac, 0xfa, 0xb1, 0xc6, 0xdc, 0x2d, 0x30, 0xc1, 0xfa, 0x43, 0x02, 0xeb, 0xf4, + 0xad, 0x27, 0x7b, 0x56, 0x21, 0x18, 0x15, 0xd5, 0xcb, 0xa6, 0x3c, 0x09, 0xf2, 0x2d, 0x22, 0x04, + 0x82, 0xf0, 0xf4, 0xad, 0x57, 0xf6, 0x2f, 0x94, 0x64, 0x51, 0x59, 0x56, 0xf4, 0x17, 0xb2, 0x90, + 0xbf, 0x68, 0x1c, 0xc7, 0xc9, 0xfa, 0x80, 0x6f, 0x48, 0x43, 0x74, 0xb2, 0x37, 0xc1, 0x0d, 0xac, + 0x07, 0x65, 0xd6, 0xca, 0x62, 0x73, 0x61, 0xc3, 0x9b, 0x3a, 0xba, 0x36, 0x4c, 0xbd, 0x51, 0x54, + 0xdd, 0x79, 0xff, 0xa2, 0x3b, 0xe5, 0xbc, 0x11, 0xae, 0x1f, 0x90, 0xbb, 0xdc, 0x68, 0x56, 0x8b, + 0x6b, 0xe5, 0xc2, 0x26, 0x6f, 0x09, 0xd5, 0x1b, 0xb5, 0xf5, 0xa6, 0xba, 0x51, 0xad, 0x56, 0xaa, + 0xcb, 0x94, 0x98, 0x6b, 0x40, 0x9e, 0x0c, 0x32, 0x9c, 0x53, 0x2b, 0x8d, 0x72, 0xb3, 0x54, 0xab, + 0x2e, 0x55, 0x96, 0x0b, 0xfa, 0x20, 0x33, 0xea, 0x01, 0xe5, 0x1a, 0xb8, 0x8a, 0xe3, 0xa4, 0x52, + 0xab, 0xba, 0xf3, 0xe0, 0x52, 0xb1, 0x5a, 0x2a, 0xbb, 0x93, 0xde, 0x0b, 0x0a, 0x82, 0x13, 0x94, + 0x5c, 0x73, 0xa9, 0xb2, 0x1a, 0xde, 0xba, 0xfa, 0x78, 0x46, 0x39, 0x05, 0x97, 0x85, 0xbf, 0x55, + 0xaa, 0x67, 0x8b, 0xab, 0x95, 0xc5, 0xc2, 0x27, 0x32, 0xca, 0x75, 0x70, 0x35, 0xf7, 0x17, 0xdd, + 0x85, 0x6a, 0x56, 0x16, 0x9b, 0x6b, 0x95, 0xfa, 0x5a, 0xb1, 0x51, 0x5a, 0x29, 0x7c, 0x92, 0xcc, + 0x2e, 0x7c, 0x73, 0x39, 0xe4, 0xc4, 0xf9, 0xa2, 0xb0, 0x05, 0x50, 0xe4, 0x15, 0xf5, 0xf1, 0x7d, + 0x61, 0x8f, 0xb7, 0x78, 0x3f, 0xea, 0x8f, 0x25, 0x8b, 0x9c, 0x0a, 0xdd, 0x92, 0x80, 0x56, 0x32, + 0x1d, 0x6a, 0x0c, 0xa1, 0x42, 0xd7, 0xc0, 0x55, 0xd5, 0x32, 0x45, 0x4a, 0x2d, 0x97, 0x6a, 0x67, + 0xcb, 0x6a, 0xf3, 0x5c, 0x71, 0x75, 0xb5, 0xdc, 0x68, 0x2e, 0x55, 0xd4, 0x7a, 0xa3, 0xb0, 0x89, + 0xfe, 0x59, 0xf2, 0xd7, 0x7e, 0x42, 0xd2, 0xfa, 0x6b, 0x29, 0x69, 0xb3, 0x8e, 0x5d, 0xe3, 0xf9, + 0x31, 0xc8, 0xdb, 0x8e, 0xe6, 0xec, 0xda, 0xac, 0x55, 0x3f, 0xa6, 0x7f, 0xab, 0x9e, 0xaf, 0x93, + 0x4c, 0x2a, 0xcb, 0x8c, 0xfe, 0x22, 0x93, 0xa4, 0x99, 0x8e, 0x60, 0xf9, 0x47, 0x1f, 0x42, 0xc4, + 0xa7, 0x01, 0x79, 0xda, 0x5e, 0xa9, 0x37, 0x8b, 0xab, 0x6a, 0xb9, 0xb8, 0x78, 0xbf, 0xbf, 0xe8, + 0x83, 0x95, 0x13, 0x70, 0x6c, 0xa3, 0x5a, 0x5c, 0x58, 0x2d, 0x93, 0xe6, 0x52, 0xab, 0x56, 0xcb, + 0x25, 0x57, 0xee, 0x3f, 0x4f, 0xb6, 0x58, 0x5c, 0x7b, 0x9b, 0xf0, 0xed, 0xda, 0x44, 0x21, 0xf9, + 0x7f, 0x5d, 0xd8, 0x13, 0x29, 0xd0, 0xb0, 0x30, 0xad, 0xd1, 0xe2, 0xf0, 0x45, 0x21, 0xe7, 0x23, + 0x21, 0x4e, 0x92, 0xe1, 0xf1, 0x9f, 0x87, 0xc0, 0xe3, 0x04, 0x1c, 0x0b, 0xe3, 0x41, 0x9c, 0x90, + 0xa2, 0x61, 0x78, 0xfe, 0x14, 0xe4, 0xeb, 0xb8, 0x83, 0x5b, 0x0e, 0x7a, 0x44, 0x0a, 0x4c, 0x8f, + 0x39, 0x90, 0x7c, 0xa7, 0x17, 0x49, 0x6f, 0x73, 0x93, 0x6d, 0xa9, 0x67, 0xb2, 0x1d, 0x63, 0x34, + 0xc8, 0x89, 0x8c, 0x86, 0x6c, 0x0a, 0x46, 0x43, 0x6e, 0x78, 0xa3, 0x21, 0x9f, 0xd4, 0x68, 0x98, + 0x88, 0x35, 0x1a, 0xd0, 0x6b, 0xf3, 0x49, 0xfb, 0x14, 0x0a, 0xcc, 0xe1, 0x9a, 0x0a, 0xff, 0x2b, + 0x9b, 0xa4, 0x0f, 0xea, 0xcb, 0x71, 0x32, 0x9d, 0xff, 0xbe, 0x9c, 0xc2, 0xd2, 0x86, 0x72, 0x2d, + 0x5c, 0x1d, 0xbc, 0x37, 0xcb, 0x4f, 0xaf, 0xd4, 0x1b, 0x75, 0x62, 0x1f, 0x94, 0x6a, 0xaa, 0xba, + 0xb1, 0x4e, 0xd7, 0xa7, 0x4f, 0x82, 0x12, 0x50, 0x51, 0x37, 0xaa, 0xd4, 0x1a, 0xd8, 0xe2, 0xa9, + 0x2f, 0x55, 0xaa, 0x8b, 0x4d, 0xbf, 0x85, 0x55, 0x97, 0x6a, 0x85, 0x6d, 0x77, 0x3a, 0x18, 0xa2, + 0xee, 0x0e, 0xe7, 0xac, 0x84, 0x62, 0x75, 0xb1, 0xb9, 0x56, 0x2d, 0xaf, 0xd5, 0xaa, 0x95, 0x12, + 0x49, 0xaf, 0x97, 0x1b, 0x05, 0xdd, 0x1d, 0x96, 0x7a, 0xec, 0x8f, 0x7a, 0xb9, 0xa8, 0x96, 0x56, + 0xca, 0x2a, 0x2d, 0xf2, 0x01, 0xe5, 0x7a, 0x38, 0x53, 0xac, 0xd6, 0x1a, 0x6e, 0x4a, 0xb1, 0x7a, + 0x7f, 0xe3, 0xfe, 0xf5, 0x72, 0x73, 0x5d, 0xad, 0x95, 0xca, 0xf5, 0xba, 0xdb, 0xaa, 0x99, 0xb5, + 0x52, 0xe8, 0x28, 0x77, 0xc1, 0xed, 0x21, 0xd6, 0xca, 0x0d, 0xb2, 0x19, 0xba, 0x56, 0x23, 0xfe, + 0x30, 0x8b, 0xe5, 0xe6, 0x4a, 0xb1, 0xde, 0xac, 0x54, 0x4b, 0xb5, 0xb5, 0xf5, 0x62, 0xa3, 0xe2, + 0x36, 0xfe, 0x75, 0xb5, 0xd6, 0xa8, 0x35, 0xcf, 0x96, 0xd5, 0x7a, 0xa5, 0x56, 0x2d, 0x18, 0x6e, + 0x95, 0x43, 0xbd, 0x85, 0xd7, 0x6b, 0x9b, 0xca, 0x55, 0x70, 0xca, 0x4b, 0x5f, 0xad, 0xb9, 0x82, + 0x0e, 0xd9, 0x2f, 0xdd, 0x54, 0xed, 0x97, 0x7f, 0x95, 0x20, 0x5b, 0x77, 0xcc, 0x2e, 0xfa, 0xd1, + 0xa0, 0x3b, 0x3a, 0x0d, 0x60, 0x91, 0xbd, 0x4d, 0x77, 0x86, 0xc7, 0xe6, 0x7c, 0xa1, 0x14, 0xf4, + 0x87, 0xc2, 0x1b, 0x32, 0x41, 0x0f, 0x6f, 0x76, 0x23, 0x2c, 0x9b, 0xef, 0x8a, 0x9d, 0x50, 0x89, + 0x26, 0x94, 0x4c, 0xdf, 0x7f, 0x69, 0x98, 0x2d, 0x17, 0x04, 0x27, 0x43, 0xb0, 0xb9, 0xf2, 0xf7, + 0x54, 0x02, 0x2b, 0x97, 0xc3, 0x65, 0x3d, 0xca, 0x45, 0x74, 0x6a, 0x53, 0xf9, 0x11, 0x78, 0x4c, + 0x48, 0xbd, 0xcb, 0x6b, 0xb5, 0xb3, 0x65, 0x5f, 0x91, 0x17, 0x8b, 0x8d, 0x62, 0x61, 0x0b, 0x7d, + 0x4e, 0x86, 0xec, 0x9a, 0xb9, 0xd7, 0xbb, 0x0f, 0x66, 0xe0, 0x8b, 0xa1, 0x75, 0x56, 0xef, 0x95, + 0xf7, 0xc8, 0x17, 0x12, 0xfb, 0x5a, 0xf4, 0x9e, 0xf7, 0x17, 0xa5, 0x24, 0x62, 0x5f, 0x3b, 0xe8, + 0x46, 0xf7, 0xdf, 0x0f, 0x23, 0xf6, 0x08, 0xd1, 0x62, 0xe5, 0x0c, 0x9c, 0x0e, 0x3e, 0x54, 0x16, + 0xcb, 0xd5, 0x46, 0x65, 0xe9, 0xfe, 0x40, 0xb8, 0x15, 0x55, 0x48, 0xfc, 0x83, 0xba, 0xb1, 0xf8, + 0x79, 0xc9, 0x29, 0x38, 0x1e, 0x7c, 0x5b, 0x2e, 0x37, 0xbc, 0x2f, 0x0f, 0xa0, 0x87, 0x72, 0x30, + 0x43, 0xbb, 0xf5, 0x8d, 0x6e, 0x5b, 0x73, 0x30, 0x7a, 0x52, 0x80, 0xee, 0x0d, 0x70, 0xb4, 0xb2, + 0xbe, 0x54, 0xaf, 0x3b, 0xa6, 0xa5, 0x6d, 0x61, 0x32, 0x8e, 0x51, 0x69, 0xf5, 0x26, 0xa3, 0x77, + 0x09, 0xaf, 0x21, 0xf2, 0x43, 0x09, 0x2d, 0x33, 0x02, 0xf5, 0x2f, 0x0b, 0xad, 0xf9, 0x09, 0x10, + 0x4c, 0x86, 0xfe, 0x03, 0x23, 0x6e, 0x73, 0xd1, 0xb8, 0x6c, 0x9e, 0x79, 0xb6, 0x04, 0x53, 0x0d, + 0x7d, 0x07, 0x3f, 0xc3, 0x34, 0xb0, 0xad, 0x4c, 0x80, 0xbc, 0xbc, 0xd6, 0x28, 0x1c, 0x71, 0x1f, + 0x5c, 0x13, 0x2c, 0x43, 0x1e, 0xca, 0x6e, 0x01, 0xee, 0x43, 0xb1, 0x51, 0x90, 0xdd, 0x87, 0xb5, + 0x72, 0xa3, 0x90, 0x75, 0x1f, 0xaa, 0xe5, 0x46, 0x21, 0xe7, 0x3e, 0xac, 0xaf, 0x36, 0x0a, 0x79, + 0xf7, 0xa1, 0x52, 0x6f, 0x14, 0x26, 0xdc, 0x87, 0x85, 0x7a, 0xa3, 0x30, 0xe9, 0x3e, 0x9c, 0xad, + 0x37, 0x0a, 0x53, 0xee, 0x43, 0xa9, 0xd1, 0x28, 0x80, 0xfb, 0x70, 0x6f, 0xbd, 0x51, 0x98, 0x76, + 0x1f, 0x8a, 0xa5, 0x46, 0x61, 0x86, 0x3c, 0x94, 0x1b, 0x85, 0x59, 0xf7, 0xa1, 0x5e, 0x6f, 0x14, + 0xe6, 0x08, 0xe5, 0x7a, 0xa3, 0x70, 0x94, 0x94, 0x55, 0x69, 0x14, 0x0a, 0xee, 0xc3, 0x4a, 0xbd, + 0x51, 0x38, 0x46, 0x32, 0xd7, 0x1b, 0x05, 0x85, 0x14, 0x5a, 0x6f, 0x14, 0x2e, 0x23, 0x79, 0xea, + 0x8d, 0xc2, 0x71, 0x52, 0x44, 0xbd, 0x51, 0x38, 0x41, 0xd8, 0x28, 0x37, 0x0a, 0x27, 0x49, 0x1e, + 0xb5, 0x51, 0xb8, 0x9c, 0x7c, 0xaa, 0x36, 0x0a, 0xa7, 0x08, 0x63, 0xe5, 0x46, 0xe1, 0x0a, 0xf2, + 0xa0, 0x36, 0x0a, 0x88, 0x7c, 0x2a, 0x36, 0x0a, 0x57, 0xa2, 0xc7, 0xc0, 0xd4, 0x32, 0x76, 0x28, + 0x88, 0xa8, 0x00, 0xf2, 0x32, 0x76, 0xc2, 0x46, 0xff, 0x57, 0x65, 0xb8, 0x9c, 0x4d, 0x14, 0x97, + 0x2c, 0x73, 0x67, 0x15, 0x6f, 0x69, 0xad, 0x4b, 0xe5, 0x07, 0x5d, 0x83, 0x2b, 0xbc, 0xe7, 0xab, + 0x40, 0xb6, 0x1b, 0x74, 0x46, 0xe4, 0x39, 0xd6, 0x3e, 0xf5, 0x16, 0xba, 0xe4, 0x60, 0xa1, 0x8b, + 0x59, 0x64, 0xff, 0x14, 0xd6, 0x68, 0x6e, 0x6d, 0x3a, 0xd3, 0xb3, 0x36, 0xed, 0x36, 0x93, 0x2e, + 0xb6, 0x6c, 0xd3, 0xd0, 0x3a, 0x75, 0xe6, 0x14, 0x40, 0x57, 0xd4, 0x7a, 0x93, 0x95, 0x9f, 0xf0, + 0x5a, 0x06, 0xb5, 0xca, 0x9e, 0x16, 0x37, 0x1f, 0xee, 0xad, 0x66, 0x44, 0x23, 0xf9, 0xa4, 0xdf, + 0x48, 0x1a, 0x5c, 0x23, 0xb9, 0xe7, 0x00, 0xb4, 0x93, 0xb5, 0x97, 0xca, 0x70, 0x13, 0x91, 0xc0, + 0x65, 0xd6, 0x5b, 0x0a, 0x97, 0xd1, 0xe7, 0x24, 0x38, 0x59, 0x36, 0xfa, 0xcd, 0x07, 0xc2, 0xba, + 0xf0, 0xe6, 0x30, 0x34, 0xeb, 0xbc, 0x48, 0x6f, 0xef, 0x5b, 0xed, 0xfe, 0x34, 0x23, 0x24, 0xfa, + 0x69, 0x5f, 0xa2, 0x75, 0x4e, 0xa2, 0x77, 0x0f, 0x4f, 0x3a, 0x99, 0x40, 0xab, 0x23, 0xed, 0x80, + 0xb2, 0xe8, 0x6b, 0x12, 0x1c, 0xa3, 0x7e, 0x3d, 0xf7, 0xd2, 0xe9, 0x07, 0xe9, 0xb2, 0x79, 0x13, + 0xaa, 0x13, 0x4c, 0x55, 0xa8, 0x7e, 0x87, 0x52, 0xd0, 0x6b, 0xc2, 0x02, 0xbf, 0x8f, 0x17, 0x78, + 0x44, 0x67, 0xdc, 0x5b, 0x5c, 0x84, 0xac, 0x3f, 0xe1, 0xcb, 0xba, 0xca, 0xc9, 0xfa, 0xf6, 0xa1, + 0xa8, 0x1e, 0xae, 0x98, 0xbf, 0x91, 0x85, 0xc7, 0x50, 0x0e, 0x99, 0x22, 0xd0, 0xce, 0xac, 0x68, + 0xb4, 0x55, 0x6c, 0x3b, 0x9a, 0xe5, 0x70, 0x47, 0xda, 0x7b, 0xe6, 0xb7, 0x99, 0x14, 0xe6, 0xb7, + 0xd2, 0xc0, 0xf9, 0x2d, 0x7a, 0x67, 0xd8, 0x4a, 0x3b, 0xc7, 0x23, 0x5b, 0x8c, 0xc1, 0x20, 0xa2, + 0x86, 0x51, 0x2d, 0xca, 0x37, 0xdf, 0x7e, 0x92, 0x43, 0x79, 0xe9, 0xc0, 0x25, 0x24, 0x43, 0xfc, + 0x0f, 0x47, 0x6b, 0x4e, 0x67, 0xc3, 0xdf, 0x78, 0xdb, 0xaf, 0xd0, 0x4e, 0x75, 0x1e, 0xf4, 0x82, + 0x49, 0x98, 0x22, 0x5d, 0xce, 0xaa, 0x6e, 0x5c, 0x70, 0xc7, 0xc6, 0x99, 0x2a, 0xbe, 0x58, 0xda, + 0xd6, 0x3a, 0x1d, 0x6c, 0x6c, 0x61, 0xf4, 0x00, 0x67, 0xa0, 0x6b, 0xdd, 0x6e, 0x35, 0xd8, 0x2a, + 0xf2, 0x5e, 0x95, 0xbb, 0x21, 0x67, 0xb7, 0xcc, 0x2e, 0x26, 0x82, 0x9a, 0x0b, 0x39, 0x97, 0xf0, + 0xcb, 0x5d, 0xc5, 0x5d, 0x67, 0x7b, 0x9e, 0x94, 0x55, 0xec, 0xea, 0x75, 0xf7, 0x07, 0x95, 0xfe, + 0xc7, 0xc6, 0xc9, 0xaf, 0xf7, 0xed, 0x8c, 0x33, 0x31, 0x9d, 0xb1, 0xcf, 0xf8, 0x7c, 0x98, 0xe9, + 0x88, 0x95, 0x8c, 0x6b, 0x60, 0xba, 0xe5, 0x65, 0xf1, 0xcf, 0xce, 0x84, 0x93, 0xd0, 0xdf, 0x26, + 0xea, 0xae, 0x85, 0x0a, 0x4f, 0xa6, 0x55, 0x78, 0xc4, 0xf6, 0xe2, 0x09, 0x38, 0xd6, 0xa8, 0xd5, + 0x9a, 0x6b, 0xc5, 0xea, 0xfd, 0xc1, 0x99, 0xf5, 0x4d, 0xf4, 0xb2, 0x2c, 0xcc, 0xd5, 0xcd, 0xce, + 0x1e, 0x0e, 0x70, 0xae, 0x70, 0x4e, 0x59, 0x61, 0x39, 0x65, 0xf6, 0xc9, 0x49, 0x39, 0x09, 0x79, + 0xcd, 0xb0, 0x2f, 0x62, 0xcf, 0x86, 0x67, 0x6f, 0x0c, 0xc6, 0x0f, 0x84, 0x3b, 0x02, 0x95, 0x87, + 0xf1, 0x8e, 0x01, 0x92, 0xe4, 0xb9, 0x8a, 0x00, 0xf2, 0x0c, 0xcc, 0xd8, 0x74, 0xc3, 0xb8, 0x11, + 0xf2, 0x0b, 0xe0, 0xd2, 0x08, 0x8b, 0xd4, 0x63, 0x41, 0x66, 0x2c, 0x92, 0x37, 0xf4, 0x6a, 0xbf, + 0xff, 0xd8, 0xe0, 0x20, 0x2e, 0x1e, 0x84, 0xb1, 0x64, 0x20, 0xbf, 0x62, 0xd4, 0x33, 0xf1, 0x53, + 0x70, 0x9c, 0x35, 0xfb, 0x66, 0x69, 0xa5, 0xb8, 0xba, 0x5a, 0xae, 0x2e, 0x97, 0x9b, 0x95, 0x45, + 0xba, 0x01, 0x15, 0xa4, 0x14, 0x1b, 0x8d, 0xf2, 0xda, 0x7a, 0xa3, 0xde, 0x2c, 0x3f, 0xbd, 0x54, + 0x2e, 0x2f, 0x12, 0xb7, 0x48, 0x72, 0xae, 0xc9, 0x73, 0x60, 0x2d, 0x56, 0xeb, 0xe7, 0xca, 0x6a, + 0x61, 0xfb, 0x4c, 0x11, 0xa6, 0x43, 0x03, 0x85, 0xcb, 0xdd, 0x22, 0xde, 0xd4, 0x76, 0x3b, 0xcc, + 0xa6, 0x2e, 0x1c, 0x71, 0xb9, 0x23, 0xb2, 0xa9, 0x19, 0x9d, 0x4b, 0x85, 0x8c, 0x52, 0x80, 0x99, + 0xf0, 0x98, 0x50, 0x90, 0xd0, 0xdb, 0xae, 0x82, 0xa9, 0x73, 0xa6, 0x75, 0x81, 0xf8, 0xf2, 0xa1, + 0xf7, 0xd2, 0xd8, 0x36, 0xde, 0x29, 0xe1, 0x90, 0x01, 0xf6, 0x0a, 0x71, 0x8f, 0x11, 0x8f, 0xda, + 0xfc, 0xc0, 0x93, 0xc0, 0xd7, 0xc0, 0xf4, 0x45, 0x2f, 0x77, 0xd0, 0xd2, 0x43, 0x49, 0xe8, 0xbf, + 0x8b, 0xf9, 0x80, 0x0c, 0x2e, 0x32, 0x7d, 0x1f, 0x85, 0xb7, 0x4a, 0x90, 0x5f, 0xc6, 0x4e, 0xb1, + 0xd3, 0x09, 0xcb, 0xed, 0xc5, 0xc2, 0xa7, 0xbb, 0xb8, 0x4a, 0x14, 0x3b, 0x9d, 0xe8, 0x46, 0x15, + 0x12, 0x90, 0x77, 0x0a, 0x81, 0x4b, 0x13, 0xf4, 0x9d, 0x1c, 0x50, 0x60, 0xfa, 0x12, 0xfb, 0x90, + 0xec, 0xfb, 0x39, 0x3c, 0x1c, 0x32, 0x93, 0x9e, 0x18, 0xc4, 0x35, 0xca, 0xc4, 0xfb, 0x4b, 0x78, + 0xf9, 0x94, 0xfb, 0x60, 0x62, 0xd7, 0xc6, 0x25, 0xcd, 0xf6, 0x86, 0x36, 0xbe, 0xa6, 0xb5, 0xf3, + 0x0f, 0xe0, 0x96, 0x33, 0x5f, 0xd9, 0x71, 0x27, 0x3e, 0x1b, 0x34, 0xa3, 0x1f, 0x2a, 0x88, 0xbd, + 0xab, 0x1e, 0x05, 0x77, 0xf2, 0x78, 0x51, 0x77, 0xb6, 0x4b, 0xdb, 0x9a, 0xc3, 0x76, 0x2c, 0xfc, + 0x77, 0xf4, 0xfc, 0x21, 0xe0, 0x8c, 0xdd, 0xe1, 0x8f, 0x3c, 0x24, 0x9a, 0x18, 0xc4, 0x11, 0x6c, + 0xcb, 0x0f, 0x03, 0xe2, 0x3f, 0x48, 0x90, 0xad, 0x75, 0xb1, 0x21, 0x7c, 0x22, 0xca, 0x97, 0xad, + 0xd4, 0x23, 0xdb, 0x57, 0x8b, 0x7b, 0x08, 0xfa, 0x95, 0x76, 0x4b, 0x8e, 0x90, 0xec, 0xcd, 0x90, + 0xd5, 0x8d, 0x4d, 0x93, 0x59, 0xb6, 0x57, 0x46, 0xd8, 0x3a, 0x15, 0x63, 0xd3, 0x54, 0x49, 0x46, + 0x51, 0xe7, 0xc0, 0xb8, 0xb2, 0xd3, 0x17, 0xf7, 0x37, 0x27, 0x21, 0x4f, 0xd5, 0x19, 0xbd, 0x48, + 0x06, 0xb9, 0xd8, 0x6e, 0x47, 0x08, 0x5e, 0xda, 0x27, 0x78, 0x93, 0xfc, 0xe6, 0x63, 0xe2, 0xbf, + 0xf3, 0x01, 0x6d, 0x04, 0xfb, 0x76, 0xd6, 0xa4, 0x8a, 0xed, 0x76, 0xb4, 0x1f, 0xb2, 0x5f, 0xa0, + 0xc4, 0x17, 0x18, 0x6e, 0xe1, 0xb2, 0x58, 0x0b, 0x4f, 0x3c, 0x10, 0x44, 0xf2, 0x97, 0x3e, 0x44, + 0xff, 0x24, 0xc1, 0xc4, 0xaa, 0x6e, 0x3b, 0x2e, 0x36, 0x45, 0x11, 0x6c, 0xae, 0x82, 0x29, 0x4f, + 0x34, 0x6e, 0x97, 0xe7, 0xf6, 0xe7, 0x41, 0x02, 0x3f, 0x13, 0xbf, 0x97, 0x47, 0xe7, 0xc9, 0xf1, + 0xb5, 0x67, 0x5c, 0x44, 0x9f, 0x34, 0x09, 0x8a, 0x95, 0x7a, 0x8b, 0x7d, 0x93, 0x2f, 0xf0, 0x35, + 0x4e, 0xe0, 0xb7, 0x0d, 0x53, 0x64, 0xfa, 0x42, 0xff, 0xbc, 0x04, 0xe0, 0x96, 0xcd, 0x8e, 0xf3, + 0x3d, 0x8e, 0x3b, 0xa4, 0x1f, 0x23, 0xdd, 0x97, 0x85, 0xa5, 0xbb, 0xc6, 0x4b, 0xf7, 0xc7, 0x07, + 0x57, 0x35, 0xee, 0xd8, 0x9e, 0x52, 0x00, 0x59, 0xf7, 0x45, 0xeb, 0x3e, 0xa2, 0xb7, 0xfa, 0x42, + 0x5d, 0xe7, 0x84, 0x7a, 0xc7, 0x90, 0x25, 0xa5, 0x2f, 0xd7, 0xbf, 0x94, 0x60, 0xa2, 0x8e, 0x1d, + 0xb7, 0x9b, 0x44, 0x67, 0x45, 0x7a, 0xf8, 0x50, 0xdb, 0x96, 0x04, 0xdb, 0xf6, 0x77, 0x32, 0xa2, + 0xc1, 0x7e, 0x02, 0xc9, 0x30, 0x9e, 0x22, 0x56, 0x1f, 0x1e, 0x16, 0x0a, 0xf6, 0x33, 0x88, 0x5a, + 0xfa, 0xd2, 0x7d, 0xb3, 0xe4, 0xbb, 0x5b, 0xf0, 0xa7, 0x6d, 0xc2, 0x66, 0x71, 0x66, 0xbf, 0x59, + 0x2c, 0x7e, 0xda, 0x26, 0x5c, 0xc7, 0x68, 0xef, 0x81, 0xc4, 0xc6, 0xc6, 0x08, 0x36, 0xf6, 0x87, + 0x91, 0xd7, 0xb3, 0x64, 0xc8, 0xb3, 0x1d, 0x80, 0xbb, 0xe3, 0x77, 0x00, 0x06, 0x4f, 0x2d, 0xde, + 0x33, 0x84, 0x29, 0x17, 0xb7, 0x2c, 0xef, 0xb3, 0x21, 0x85, 0xd8, 0xb8, 0x09, 0x72, 0x24, 0x1a, + 0x29, 0x1b, 0xe7, 0x02, 0x9f, 0x0c, 0x8f, 0x44, 0xd9, 0xfd, 0xaa, 0xd2, 0x4c, 0x89, 0x51, 0x18, + 0xc1, 0x4a, 0xfe, 0x30, 0x28, 0xfc, 0x86, 0x02, 0xb0, 0xbe, 0x7b, 0xbe, 0xa3, 0xdb, 0xdb, 0xba, + 0xb1, 0x85, 0xbe, 0x92, 0x81, 0x19, 0xf6, 0x4a, 0x83, 0x6a, 0xc6, 0x9a, 0x7f, 0x91, 0x46, 0x41, + 0x01, 0xe4, 0x5d, 0x4b, 0x67, 0xcb, 0x00, 0xee, 0xa3, 0x72, 0xa7, 0xef, 0x9e, 0x95, 0xed, 0x09, + 0xa7, 0xe0, 0x8a, 0x21, 0xe0, 0x60, 0x3e, 0x54, 0x7a, 0xe0, 0xa6, 0x15, 0x8e, 0x9c, 0x9a, 0xe3, + 0x23, 0xa7, 0x72, 0x67, 0x2c, 0xf3, 0x3d, 0x67, 0x2c, 0x5d, 0x1c, 0x6d, 0xfd, 0x19, 0x98, 0xf8, + 0xef, 0xc8, 0x2a, 0x79, 0x46, 0x1f, 0x0c, 0xa6, 0x2a, 0xa6, 0xa0, 0x9d, 0x9b, 0xa0, 0xa2, 0x57, + 0xc1, 0xd4, 0x03, 0xa6, 0x6e, 0x90, 0x2d, 0x23, 0xe6, 0x40, 0x1e, 0x24, 0xa0, 0x8f, 0x08, 0xc7, + 0x42, 0x0b, 0x89, 0x24, 0x76, 0xd2, 0xc1, 0x38, 0x90, 0x7c, 0x0e, 0x42, 0xfb, 0xae, 0x71, 0x1d, + 0xe6, 0x20, 0xfa, 0xc9, 0x54, 0x6f, 0x67, 0x88, 0xe5, 0x15, 0x05, 0xe6, 0xbc, 0xb3, 0xa5, 0xb5, + 0x85, 0x7b, 0xcb, 0xa5, 0x46, 0x01, 0xef, 0x3f, 0x6f, 0x4a, 0x4e, 0x96, 0xd2, 0x53, 0xa4, 0xc1, + 0x12, 0x0a, 0xfa, 0x9f, 0x12, 0xe4, 0x99, 0x75, 0x70, 0xf7, 0x01, 0x21, 0x44, 0x2f, 0x1f, 0x06, + 0x92, 0xd8, 0x23, 0xfe, 0x9f, 0x4a, 0x0a, 0xc0, 0x08, 0xec, 0x81, 0xfb, 0x53, 0x03, 0x00, 0xfd, + 0x8b, 0x04, 0x59, 0xd7, 0x6a, 0x11, 0x3b, 0x40, 0xfd, 0x49, 0x61, 0x67, 0xe4, 0x90, 0x00, 0x5c, + 0xf2, 0x11, 0xfa, 0xbd, 0x00, 0x53, 0x5d, 0x9a, 0xd1, 0x3f, 0xbe, 0x7f, 0x9d, 0x40, 0xdf, 0x81, + 0xd5, 0xe0, 0x37, 0xf4, 0x6e, 0x21, 0x87, 0xe6, 0x78, 0x7e, 0x92, 0xc1, 0x51, 0x1e, 0xc5, 0x59, + 0xeb, 0x4d, 0xf4, 0x3d, 0x09, 0x40, 0xc5, 0xb6, 0xd9, 0xd9, 0xc3, 0x1b, 0x96, 0x8e, 0xae, 0x0c, + 0x00, 0x60, 0xcd, 0x3e, 0x13, 0x34, 0xfb, 0xcf, 0x84, 0x05, 0xbf, 0xcc, 0x0b, 0xfe, 0x89, 0xd1, + 0x9a, 0xe7, 0x11, 0x8f, 0x10, 0xff, 0x5d, 0x30, 0xc1, 0xe4, 0xc8, 0x4c, 0x40, 0x31, 0xe1, 0x7b, + 0x3f, 0xa1, 0xf7, 0xf9, 0xa2, 0xbf, 0x97, 0x13, 0xfd, 0x53, 0x12, 0x73, 0x94, 0x0c, 0x80, 0xd2, + 0x10, 0x00, 0x1c, 0x85, 0x69, 0x0f, 0x80, 0x0d, 0xb5, 0x52, 0xc0, 0xe8, 0x1d, 0x32, 0xf1, 0x6a, + 0xa0, 0x63, 0xd1, 0xc1, 0x7b, 0x9a, 0xaf, 0x09, 0xcf, 0xcd, 0x43, 0xf2, 0xf0, 0xcb, 0x4f, 0x09, + 0xa0, 0x3f, 0x11, 0x9a, 0x8c, 0x0b, 0x30, 0xf4, 0x68, 0xe9, 0xaf, 0xce, 0x94, 0x61, 0x96, 0x33, + 0x22, 0x94, 0x53, 0x70, 0x9c, 0x4b, 0xa0, 0xe3, 0x5d, 0xbb, 0x70, 0x44, 0x41, 0x70, 0x92, 0xfb, + 0xc2, 0x5e, 0x70, 0xbb, 0x90, 0x41, 0x7f, 0xf6, 0xb9, 0x8c, 0xbf, 0x3c, 0xf3, 0x9e, 0x2c, 0x5b, + 0x18, 0xfb, 0x18, 0x1f, 0x31, 0xae, 0x65, 0x1a, 0x0e, 0x7e, 0x30, 0xe4, 0x55, 0xe2, 0x27, 0xc4, + 0x5a, 0x0d, 0xa7, 0x60, 0xc2, 0xb1, 0xc2, 0x9e, 0x26, 0xde, 0x6b, 0x58, 0xb1, 0x72, 0xbc, 0x62, + 0x55, 0xe1, 0x8c, 0x6e, 0xb4, 0x3a, 0xbb, 0x6d, 0xac, 0xe2, 0x8e, 0xe6, 0xca, 0xd0, 0x2e, 0xda, + 0x8b, 0xb8, 0x8b, 0x8d, 0x36, 0x36, 0x1c, 0xca, 0xa7, 0x77, 0x62, 0x4d, 0x20, 0x27, 0xaf, 0x8c, + 0x77, 0xf2, 0xca, 0xf8, 0xb8, 0x7e, 0x2b, 0xae, 0x31, 0xcb, 0x73, 0xb7, 0x01, 0xd0, 0xba, 0x9d, + 0xd5, 0xf1, 0x45, 0xa6, 0x86, 0x57, 0xf4, 0x2c, 0xd2, 0xd5, 0xfc, 0x0c, 0x6a, 0x28, 0x33, 0x7a, + 0xc4, 0x57, 0xbf, 0x7b, 0x38, 0xf5, 0xbb, 0x49, 0x90, 0x85, 0x64, 0x5a, 0xd7, 0x1d, 0x42, 0xeb, + 0x66, 0x61, 0x2a, 0xd8, 0xfc, 0x95, 0x95, 0x2b, 0xe0, 0x84, 0xe7, 0xb5, 0x5b, 0x2d, 0x97, 0x17, + 0xeb, 0xcd, 0x8d, 0xf5, 0x65, 0xb5, 0xb8, 0x58, 0x2e, 0x80, 0xab, 0x9f, 0x54, 0x2f, 0x7d, 0x67, + 0xdb, 0x2c, 0xfa, 0x73, 0x09, 0x72, 0xe4, 0xb8, 0x25, 0xfa, 0xe9, 0x11, 0x69, 0x8e, 0xcd, 0xf9, + 0x28, 0xf9, 0xe3, 0xae, 0x78, 0x24, 0x77, 0x26, 0x4c, 0xc2, 0xd5, 0x81, 0x22, 0xb9, 0xc7, 0x10, + 0x4a, 0x7f, 0xe2, 0xe2, 0x36, 0xc9, 0xfa, 0xb6, 0x79, 0xf1, 0x87, 0xb9, 0x49, 0xba, 0xf5, 0x3f, + 0xe4, 0x26, 0xd9, 0x87, 0x85, 0xb1, 0x37, 0xc9, 0x3e, 0xed, 0x2e, 0xa6, 0x99, 0xa2, 0x67, 0xe6, + 0xfc, 0xf9, 0xdf, 0xb3, 0xa5, 0x03, 0x6d, 0x55, 0x15, 0x61, 0x56, 0x37, 0x1c, 0x6c, 0x19, 0x5a, + 0x67, 0xa9, 0xa3, 0x6d, 0x79, 0xf6, 0x69, 0xef, 0xfe, 0x44, 0x25, 0x94, 0x47, 0xe5, 0xff, 0x50, + 0x4e, 0x03, 0x38, 0x78, 0xa7, 0xdb, 0xd1, 0x9c, 0x40, 0xf5, 0x42, 0x29, 0x61, 0xed, 0xcb, 0xf2, + 0xda, 0x77, 0x0b, 0x5c, 0x46, 0x41, 0x6b, 0x5c, 0xea, 0xe2, 0x0d, 0x43, 0xff, 0x99, 0x5d, 0x12, + 0x60, 0x94, 0xea, 0x68, 0xbf, 0x4f, 0xdc, 0x86, 0x4d, 0xbe, 0x67, 0xc3, 0xe6, 0x1f, 0x84, 0x03, + 0x97, 0x78, 0xad, 0x7e, 0x40, 0xe0, 0x12, 0xbf, 0xa5, 0xc9, 0x3d, 0x2d, 0xcd, 0x5f, 0x46, 0xc9, + 0x0a, 0x2c, 0xa3, 0x84, 0x51, 0xc9, 0x09, 0x2e, 0x41, 0xbe, 0x4a, 0x28, 0x32, 0x4a, 0x5c, 0x35, + 0xc6, 0xb0, 0xc4, 0x2d, 0xc3, 0x1c, 0x2d, 0x7a, 0xc1, 0x34, 0x2f, 0xec, 0x68, 0xd6, 0x05, 0x64, + 0x1d, 0x48, 0x15, 0x63, 0x77, 0x8b, 0x22, 0xb7, 0x40, 0x3f, 0x2d, 0x3c, 0x67, 0xe0, 0xc4, 0xe5, + 0xf1, 0x3c, 0x9e, 0xed, 0xa2, 0x37, 0x08, 0x4d, 0x21, 0x44, 0x18, 0x4c, 0x1f, 0xd7, 0x3f, 0xf2, + 0x71, 0xf5, 0x3a, 0xfa, 0xf0, 0x4a, 0xfb, 0x28, 0x71, 0x45, 0x5f, 0x1e, 0x0e, 0x3b, 0x8f, 0xaf, + 0x21, 0xb0, 0x2b, 0x80, 0x7c, 0xc1, 0x77, 0xee, 0x71, 0x1f, 0xc3, 0x15, 0xca, 0xa6, 0x87, 0x66, + 0x04, 0xcb, 0x63, 0x41, 0xf3, 0x38, 0xcf, 0x42, 0xad, 0x9b, 0x2a, 0xa6, 0x5f, 0x12, 0xde, 0xc1, + 0xea, 0x2b, 0x20, 0xca, 0xdd, 0x78, 0x5a, 0xa5, 0xd8, 0xf6, 0x97, 0x38, 0x9b, 0xe9, 0xa3, 0xf9, + 0xbc, 0x1c, 0x4c, 0x79, 0xa1, 0x65, 0xc8, 0xcd, 0x47, 0x3e, 0x86, 0x27, 0x21, 0x6f, 0x9b, 0xbb, + 0x56, 0x0b, 0xb3, 0x3d, 0x45, 0xf6, 0x36, 0xc4, 0xfe, 0xd7, 0xc0, 0xf1, 0x7c, 0x9f, 0xc9, 0x90, + 0x4d, 0x6c, 0x32, 0x44, 0x1b, 0xa4, 0x71, 0x03, 0xfc, 0xf3, 0x85, 0xc3, 0xd5, 0x73, 0x98, 0xd5, + 0xb1, 0xf3, 0x68, 0x1c, 0xe3, 0xff, 0x40, 0x68, 0x77, 0x65, 0x40, 0x4d, 0x92, 0xa9, 0x5c, 0x6d, + 0x08, 0x43, 0xf5, 0x4a, 0xb8, 0xdc, 0xcb, 0xc1, 0x2c, 0x54, 0x62, 0x91, 0x6e, 0xa8, 0xab, 0x05, + 0x19, 0x3d, 0x2b, 0x0b, 0x05, 0xca, 0x5a, 0xcd, 0x37, 0xd6, 0xd0, 0x8b, 0x33, 0x87, 0x6d, 0x91, + 0x46, 0x4f, 0x31, 0x3f, 0x2b, 0x89, 0x86, 0xc4, 0xe5, 0x04, 0x1f, 0xd4, 0x2e, 0x42, 0x93, 0x86, + 0x68, 0x66, 0x31, 0xca, 0x87, 0x7e, 0x3b, 0x23, 0x12, 0x61, 0x57, 0x8c, 0xc5, 0x31, 0x84, 0x43, + 0xca, 0x7a, 0x11, 0xc2, 0x96, 0x2c, 0x73, 0x67, 0xc3, 0xea, 0xa0, 0xff, 0x53, 0x28, 0x80, 0x79, + 0x84, 0xf9, 0x2f, 0x45, 0x9b, 0xff, 0x64, 0xc9, 0xb8, 0x13, 0xec, 0x55, 0x75, 0x86, 0x18, 0xbe, + 0x95, 0xeb, 0x61, 0x4e, 0x6b, 0xb7, 0xd7, 0xb5, 0x2d, 0x5c, 0x72, 0xe7, 0xd5, 0x86, 0xc3, 0xa2, + 0x07, 0xf5, 0xa4, 0xc6, 0x76, 0x45, 0xe2, 0xeb, 0xa0, 0x1c, 0x48, 0x4c, 0x3e, 0x63, 0x19, 0xde, + 0xdc, 0x21, 0xa1, 0xb5, 0xad, 0x05, 0xb1, 0xcc, 0xd8, 0x9b, 0xa0, 0xef, 0x92, 0x00, 0xdf, 0xe9, + 0x6b, 0xd6, 0xef, 0x49, 0x30, 0xe1, 0xca, 0xbb, 0xd8, 0x6e, 0xa3, 0xc7, 0x72, 0x21, 0xff, 0x22, + 0xbd, 0xc7, 0x7e, 0x51, 0xd8, 0x6d, 0xcf, 0xab, 0x21, 0xa5, 0x1f, 0x81, 0x49, 0x20, 0x44, 0x89, + 0x13, 0xa2, 0x98, 0x77, 0x5e, 0x6c, 0x11, 0xe9, 0x8b, 0xef, 0x93, 0x12, 0xcc, 0x7a, 0xf3, 0x88, + 0x25, 0xec, 0xb4, 0xb6, 0xd1, 0x6d, 0xa2, 0x0b, 0x4d, 0xac, 0xa5, 0xf9, 0x7b, 0xb2, 0x1d, 0xf4, + 0xfd, 0x4c, 0x42, 0x95, 0xe7, 0x4a, 0x8e, 0x58, 0xa5, 0x4b, 0xa4, 0x8b, 0x71, 0x04, 0xd3, 0x17, + 0xe6, 0x23, 0x12, 0x40, 0xc3, 0xf4, 0xe7, 0xba, 0x07, 0x90, 0xe4, 0x0b, 0x85, 0xb7, 0x6b, 0x59, + 0xc5, 0x83, 0x62, 0x93, 0xf7, 0x1c, 0x82, 0xce, 0x47, 0x83, 0x4a, 0x1a, 0x4b, 0x5b, 0x9f, 0x5a, + 0xdc, 0xed, 0x76, 0xf4, 0x96, 0xe6, 0xf4, 0x7a, 0xcc, 0x45, 0x8b, 0x97, 0x5c, 0x0b, 0x9a, 0xc8, + 0x28, 0xf4, 0xcb, 0x88, 0x90, 0x25, 0x0d, 0x2e, 0x23, 0x79, 0xc1, 0x65, 0x04, 0xbd, 0x60, 0x06, + 0x10, 0x1f, 0x83, 0x7a, 0xca, 0x70, 0xb4, 0xd6, 0xc5, 0xc6, 0x82, 0x85, 0xb5, 0x76, 0xcb, 0xda, + 0xdd, 0x39, 0x6f, 0x87, 0xdd, 0x3d, 0xe3, 0x75, 0x34, 0xb4, 0x74, 0x2c, 0x71, 0x4b, 0xc7, 0xe8, + 0x17, 0x64, 0xd1, 0x50, 0x47, 0xa1, 0x0d, 0x8e, 0x10, 0x0f, 0x43, 0x0c, 0x75, 0x89, 0x9c, 0x94, + 0x7a, 0x56, 0x89, 0xb3, 0x49, 0x56, 0x89, 0xdf, 0x28, 0x14, 0x38, 0x49, 0xa8, 0x5e, 0x63, 0xf1, + 0x35, 0x9b, 0xab, 0x63, 0x27, 0x02, 0xde, 0xeb, 0x60, 0xf6, 0x7c, 0xf0, 0xc5, 0x87, 0x98, 0x4f, + 0xec, 0xe3, 0x01, 0xfa, 0xe6, 0xa4, 0x2b, 0x30, 0x3c, 0x0b, 0x11, 0xe8, 0xfa, 0x08, 0x4a, 0x22, + 0x6e, 0x66, 0x89, 0x96, 0x53, 0x62, 0xcb, 0x4f, 0x1f, 0x85, 0x8f, 0x48, 0x30, 0x4d, 0x2e, 0x3b, + 0x5d, 0xb8, 0x44, 0x0e, 0x3e, 0x0a, 0x1a, 0x25, 0xcf, 0x0b, 0x8b, 0x59, 0x81, 0x6c, 0x47, 0x37, + 0x2e, 0x78, 0xfe, 0x81, 0xee, 0x73, 0x70, 0x75, 0x9e, 0xd4, 0xe7, 0xea, 0x3c, 0x7f, 0x9f, 0xc2, + 0x2f, 0xf7, 0x40, 0x77, 0x39, 0x0f, 0x24, 0x97, 0xbe, 0x18, 0xff, 0x2e, 0x0b, 0xf9, 0x3a, 0xd6, + 0xac, 0xd6, 0x36, 0x7a, 0x8f, 0xd4, 0x77, 0xaa, 0x30, 0xc9, 0x4f, 0x15, 0x96, 0x60, 0x62, 0x53, + 0xef, 0x38, 0xd8, 0xa2, 0x3e, 0xd3, 0xe1, 0xae, 0x9d, 0x36, 0xf1, 0x85, 0x8e, 0xd9, 0xba, 0x30, + 0xcf, 0x4c, 0xf7, 0x79, 0x2f, 0xd4, 0xea, 0xfc, 0x12, 0xf9, 0x49, 0xf5, 0x7e, 0x76, 0x0d, 0x42, + 0xdb, 0xb4, 0x9c, 0xa8, 0x5b, 0x34, 0x22, 0xa8, 0xd4, 0x4d, 0xcb, 0x51, 0xe9, 0x8f, 0x2e, 0xcc, + 0x9b, 0xbb, 0x9d, 0x4e, 0x03, 0x3f, 0xe8, 0x78, 0xd3, 0x36, 0xef, 0xdd, 0x35, 0x16, 0xcd, 0xcd, + 0x4d, 0x1b, 0xd3, 0x45, 0x83, 0x9c, 0xca, 0xde, 0x94, 0xe3, 0x90, 0xeb, 0xe8, 0x3b, 0x3a, 0x9d, + 0x68, 0xe4, 0x54, 0xfa, 0xa2, 0xdc, 0x08, 0x85, 0x60, 0x8e, 0x43, 0x19, 0x3d, 0x95, 0x27, 0x4d, + 0x73, 0x5f, 0xba, 0xab, 0x33, 0x17, 0xf0, 0x25, 0xfb, 0xd4, 0x04, 0xf9, 0x4e, 0x9e, 0xf9, 0x03, + 0x2a, 0x22, 0xfb, 0x1d, 0x54, 0xe2, 0xd1, 0x33, 0x58, 0x0b, 0xb7, 0x4c, 0xab, 0xed, 0xc9, 0x26, + 0x7a, 0x82, 0xc1, 0xf2, 0x25, 0xdb, 0xa5, 0xe8, 0x5b, 0x78, 0xfa, 0x9a, 0xf6, 0xce, 0xbc, 0xdb, + 0x6d, 0xba, 0x45, 0x9f, 0xd3, 0x9d, 0xed, 0x35, 0xec, 0x68, 0xe8, 0xef, 0xe4, 0xbe, 0x1a, 0x37, + 0xfd, 0xff, 0x69, 0xdc, 0x00, 0x8d, 0xa3, 0x81, 0xae, 0x9c, 0x5d, 0xcb, 0x70, 0xe5, 0xc8, 0xc2, + 0xd6, 0x86, 0x52, 0x94, 0x3b, 0xe0, 0x8a, 0xe0, 0xcd, 0x5b, 0x2a, 0x5d, 0x64, 0xd3, 0xd6, 0x29, + 0x92, 0x3d, 0x3a, 0x83, 0xb2, 0x0e, 0xd7, 0xd2, 0x8f, 0x2b, 0x8d, 0xb5, 0xd5, 0x15, 0x7d, 0x6b, + 0xbb, 0xa3, 0x6f, 0x6d, 0x3b, 0x76, 0xc5, 0xb0, 0x1d, 0xac, 0xb5, 0x6b, 0x9b, 0x2a, 0xbd, 0xff, + 0x06, 0x08, 0x1d, 0x91, 0xac, 0xbc, 0x4f, 0xb5, 0xd8, 0xe8, 0x16, 0xd6, 0x94, 0x88, 0x96, 0xf2, + 0x14, 0xb7, 0xa5, 0xd8, 0xbb, 0x1d, 0x1f, 0xd3, 0xab, 0x7a, 0x30, 0x0d, 0x54, 0x7d, 0xb7, 0x43, + 0x9a, 0x0b, 0xc9, 0x9c, 0x74, 0x9c, 0x8b, 0xe1, 0x24, 0xfd, 0x66, 0xf3, 0xff, 0xe4, 0x21, 0xb7, + 0x6c, 0x69, 0xdd, 0x6d, 0xf4, 0xac, 0x50, 0xff, 0x3c, 0xaa, 0x36, 0xe1, 0x6b, 0xa7, 0x34, 0x48, + 0x3b, 0xe5, 0x01, 0xda, 0x99, 0x0d, 0x69, 0x67, 0xf4, 0xa2, 0xf2, 0x19, 0x98, 0x69, 0x99, 0x9d, + 0x0e, 0x6e, 0xb9, 0xf2, 0xa8, 0xb4, 0xc9, 0x6a, 0xce, 0x94, 0xca, 0xa5, 0x91, 0x70, 0xd4, 0xd8, + 0xa9, 0xd3, 0x35, 0x74, 0xaa, 0xf4, 0x41, 0x02, 0x7a, 0xb1, 0x04, 0xd9, 0x72, 0x7b, 0x0b, 0x73, + 0xeb, 0xec, 0x99, 0xd0, 0x3a, 0xfb, 0x49, 0xc8, 0x3b, 0x9a, 0xb5, 0x85, 0x1d, 0x6f, 0x9d, 0x80, + 0xbe, 0xf9, 0x51, 0xb2, 0xe5, 0x50, 0x94, 0xec, 0x1f, 0x87, 0xac, 0x2b, 0x33, 0xe6, 0x46, 0x7e, + 0x6d, 0x3f, 0xf8, 0x89, 0xec, 0xe7, 0xdd, 0x12, 0xe7, 0xdd, 0x5a, 0xab, 0xe4, 0x87, 0x5e, 0xac, + 0x73, 0xfb, 0xb0, 0x26, 0x57, 0x79, 0xb6, 0x4c, 0xa3, 0xb2, 0xa3, 0x6d, 0x61, 0x56, 0xcd, 0x20, + 0xc1, 0xfb, 0x5a, 0xde, 0x31, 0x1f, 0xd0, 0x59, 0x3c, 0xc8, 0x20, 0xc1, 0xad, 0xc2, 0xb6, 0xde, + 0x6e, 0x63, 0x83, 0xb5, 0x6c, 0xf6, 0x76, 0xe6, 0x34, 0x64, 0x5d, 0x1e, 0x5c, 0xfd, 0x71, 0x8d, + 0x85, 0xc2, 0x11, 0x65, 0xc6, 0x6d, 0x56, 0xb4, 0xf1, 0x16, 0x32, 0xfc, 0x9a, 0xaa, 0x88, 0xdb, + 0x0e, 0xad, 0x5c, 0xff, 0xc6, 0xf5, 0x04, 0xc8, 0x19, 0x66, 0x1b, 0x0f, 0x1c, 0x84, 0x68, 0x2e, + 0xe5, 0xc9, 0x90, 0xc3, 0x6d, 0xb7, 0x57, 0x90, 0x49, 0xf6, 0xd3, 0xf1, 0xb2, 0x54, 0x69, 0xe6, + 0x64, 0xbe, 0x41, 0xfd, 0xb8, 0x4d, 0xbf, 0x01, 0xfe, 0xf2, 0x04, 0x1c, 0xa5, 0x7d, 0x40, 0x7d, + 0xf7, 0xbc, 0x4b, 0xea, 0x3c, 0x46, 0x0f, 0xf7, 0x1f, 0xb8, 0x8e, 0xf2, 0xca, 0x7e, 0x1c, 0x72, + 0xf6, 0xee, 0x79, 0xdf, 0x08, 0xa5, 0x2f, 0xe1, 0xa6, 0x2b, 0x8d, 0x64, 0x38, 0x93, 0x87, 0x1d, + 0xce, 0xb8, 0xa1, 0x49, 0xf6, 0x1a, 0x7f, 0x30, 0x90, 0xd1, 0x03, 0x10, 0xde, 0x40, 0xd6, 0x6f, + 0x18, 0x3a, 0x05, 0x13, 0xda, 0xa6, 0x83, 0xad, 0xc0, 0x4c, 0x64, 0xaf, 0xee, 0x50, 0x79, 0x1e, + 0x6f, 0x9a, 0x96, 0x2b, 0x16, 0x1a, 0x24, 0xdd, 0x7f, 0x0f, 0xb5, 0x5c, 0xe0, 0x76, 0xc8, 0x6e, + 0x82, 0x63, 0x86, 0xb9, 0x88, 0xbb, 0x4c, 0xce, 0x14, 0xc5, 0x59, 0xd2, 0x02, 0xf6, 0x7f, 0xd8, + 0xd7, 0x95, 0xcc, 0xed, 0xef, 0x4a, 0xd0, 0x67, 0x92, 0xce, 0x99, 0x7b, 0x80, 0x1e, 0x99, 0x85, + 0xa6, 0x3c, 0x0d, 0x66, 0xda, 0xcc, 0x45, 0xab, 0xa5, 0xfb, 0xad, 0x24, 0xf2, 0x3f, 0x2e, 0x73, + 0xa0, 0x48, 0xd9, 0xb0, 0x22, 0x2d, 0xc3, 0x24, 0x39, 0xaa, 0xec, 0x6a, 0x52, 0xae, 0xc7, 0x25, + 0x9e, 0x4c, 0xeb, 0xfc, 0x4a, 0x85, 0xc4, 0x36, 0x5f, 0x62, 0xbf, 0xa8, 0xfe, 0xcf, 0xc9, 0x66, + 0xdf, 0xf1, 0x12, 0x4a, 0xbf, 0x39, 0xbe, 0x29, 0x0f, 0x57, 0x94, 0x2c, 0xd3, 0xb6, 0xc9, 0x19, + 0x98, 0xde, 0x86, 0xf9, 0x7a, 0x89, 0xbb, 0x2f, 0xe3, 0x51, 0xdd, 0xfc, 0xfa, 0x35, 0xa8, 0xf1, + 0x35, 0x8d, 0xaf, 0x09, 0x07, 0x79, 0xf1, 0xf7, 0x1f, 0x22, 0x84, 0xfe, 0xc3, 0xd1, 0x48, 0xde, + 0x99, 0x11, 0x89, 0x3b, 0x93, 0x50, 0x56, 0xe9, 0x37, 0x97, 0x2f, 0x49, 0x70, 0x65, 0x2f, 0x37, + 0x1b, 0x86, 0xed, 0x37, 0x98, 0xab, 0x07, 0xb4, 0x17, 0x3e, 0x4e, 0x49, 0xec, 0x4d, 0x95, 0x11, + 0x75, 0x0f, 0x95, 0x16, 0xb1, 0x58, 0x12, 0x9c, 0xa8, 0x89, 0xbb, 0xa9, 0x32, 0x31, 0xf9, 0xf4, + 0x85, 0xfb, 0xd9, 0x2c, 0x1c, 0x5d, 0xb6, 0xcc, 0xdd, 0xae, 0x1d, 0xf4, 0x40, 0x7f, 0xdd, 0x7f, + 0xc3, 0x35, 0x2f, 0x62, 0x1a, 0x5c, 0x03, 0xd3, 0x16, 0xb3, 0xe6, 0x82, 0xed, 0xd7, 0x70, 0x52, + 0xb8, 0xf7, 0x92, 0x0f, 0xd2, 0x7b, 0x05, 0xfd, 0x4c, 0x96, 0xeb, 0x67, 0x7a, 0x7b, 0x8e, 0x5c, + 0x9f, 0x9e, 0xe3, 0xaf, 0xa4, 0x84, 0x83, 0x6a, 0x8f, 0x88, 0x22, 0xfa, 0x8b, 0x12, 0xe4, 0xb7, + 0x48, 0x46, 0xd6, 0x5d, 0x3c, 0x5e, 0xac, 0x66, 0x84, 0xb8, 0xca, 0x7e, 0x0d, 0xe4, 0x2a, 0x87, + 0x75, 0x38, 0xd1, 0x00, 0x17, 0xcf, 0x6d, 0xfa, 0x4a, 0xf5, 0xea, 0x2c, 0xcc, 0xf8, 0xa5, 0x57, + 0xda, 0x36, 0x7a, 0x5e, 0x7f, 0x8d, 0x9a, 0x15, 0xd1, 0xa8, 0x7d, 0xeb, 0xcc, 0xfe, 0xa8, 0x23, + 0x87, 0x46, 0x9d, 0xbe, 0xa3, 0xcb, 0x4c, 0xc4, 0xe8, 0x82, 0x9e, 0x29, 0x8b, 0xde, 0x38, 0xc5, + 0x77, 0xad, 0xa4, 0x36, 0x8f, 0xe6, 0xc1, 0x42, 0xf0, 0xde, 0xab, 0xc1, 0xb5, 0x4a, 0x5f, 0x49, + 0xde, 0x2f, 0xc1, 0xb1, 0xfd, 0x9d, 0xf9, 0x8f, 0xf0, 0x5e, 0x68, 0x6e, 0x9d, 0x6c, 0xdf, 0x0b, + 0x8d, 0xbc, 0xf1, 0x9b, 0x74, 0xb1, 0x41, 0x43, 0x38, 0x7b, 0x6f, 0x70, 0x27, 0x2e, 0x16, 0x16, + 0x44, 0x90, 0x68, 0xfa, 0x02, 0xfc, 0x35, 0x19, 0xa6, 0xea, 0xd8, 0x59, 0xd5, 0x2e, 0x99, 0xbb, + 0x0e, 0xd2, 0x44, 0xb7, 0xe7, 0x9e, 0x0a, 0xf9, 0x0e, 0xf9, 0x85, 0x5d, 0xe4, 0x7f, 0x4d, 0xdf, + 0xfd, 0x2d, 0xe2, 0xfb, 0x43, 0x49, 0xab, 0x2c, 0x3f, 0x1f, 0xad, 0x45, 0x64, 0x77, 0xd4, 0xe7, + 0x6e, 0x24, 0x5b, 0x3b, 0x89, 0xf6, 0x4e, 0xa3, 0x8a, 0x4e, 0x1f, 0x96, 0x5f, 0x90, 0x61, 0xb6, + 0x8e, 0x9d, 0x8a, 0xbd, 0xa4, 0xed, 0x99, 0x96, 0xee, 0xe0, 0xf0, 0x4d, 0x9e, 0xf1, 0xd0, 0x9c, + 0x06, 0xd0, 0xfd, 0xdf, 0x58, 0x0c, 0xa9, 0x50, 0x0a, 0xfa, 0xed, 0xa4, 0x8e, 0x42, 0x1c, 0x1f, + 0x23, 0x01, 0x21, 0x91, 0x8f, 0x45, 0x5c, 0xf1, 0xe9, 0x03, 0xf1, 0x45, 0x89, 0x01, 0x51, 0xb4, + 0x5a, 0xdb, 0xfa, 0x1e, 0x6e, 0x27, 0x04, 0xc2, 0xfb, 0x2d, 0x00, 0xc2, 0x27, 0x94, 0xd8, 0x7d, + 0x85, 0xe3, 0x63, 0x14, 0xee, 0x2b, 0x71, 0x04, 0xc7, 0x12, 0x06, 0xca, 0xed, 0x7a, 0xd8, 0x7a, + 0xe6, 0xdd, 0xa2, 0x62, 0x0d, 0x4c, 0x36, 0x29, 0x6c, 0xb2, 0x0d, 0xd5, 0xb1, 0xd0, 0xb2, 0x07, + 0xe9, 0x74, 0x36, 0x8d, 0x8e, 0xa5, 0x6f, 0xd1, 0xe9, 0x0b, 0xfd, 0xdd, 0x32, 0x9c, 0xf0, 0xe3, + 0xa3, 0xd4, 0xb1, 0xb3, 0xa8, 0xd9, 0xdb, 0xe7, 0x4d, 0xcd, 0x6a, 0xa3, 0xd2, 0x08, 0x4e, 0xfc, + 0xa1, 0x2f, 0x84, 0x41, 0xa8, 0xf2, 0x20, 0xf4, 0x75, 0x15, 0xed, 0xcb, 0xcb, 0x28, 0x3a, 0x99, + 0x58, 0x6f, 0xd6, 0xdf, 0xf1, 0xc1, 0xfa, 0x09, 0x0e, 0xac, 0x3b, 0x87, 0x65, 0x31, 0x7d, 0xe0, + 0x7e, 0x93, 0x8e, 0x08, 0x21, 0xaf, 0xe6, 0xfb, 0x45, 0x01, 0x8b, 0xf0, 0x6a, 0x95, 0x23, 0xbd, + 0x5a, 0x87, 0x1a, 0x23, 0x06, 0x7a, 0x24, 0xa7, 0x3b, 0x46, 0x1c, 0xa2, 0xb7, 0xf1, 0xdb, 0x65, + 0x28, 0x90, 0x00, 0x59, 0x21, 0x8f, 0xef, 0x70, 0xbc, 0xe9, 0x78, 0x74, 0xf6, 0x79, 0x97, 0x4f, + 0x24, 0xf5, 0x2e, 0x47, 0x6f, 0x4b, 0xea, 0x43, 0xde, 0xcb, 0xed, 0x48, 0x10, 0x4b, 0xe4, 0x22, + 0x3e, 0x80, 0x83, 0xf4, 0x41, 0xfb, 0x6f, 0x32, 0x80, 0xdb, 0xa0, 0xd9, 0xd9, 0x87, 0xa7, 0x8b, + 0xc2, 0x75, 0x73, 0xd8, 0xaf, 0xde, 0x05, 0xea, 0x44, 0x0f, 0x50, 0x94, 0x62, 0x70, 0xaa, 0xe2, + 0xe1, 0xa4, 0xbe, 0x95, 0x01, 0x57, 0x23, 0x81, 0x25, 0x91, 0xb7, 0x65, 0x64, 0xd9, 0xe9, 0x03, + 0xf2, 0x3f, 0x24, 0xc8, 0x35, 0xcc, 0x3a, 0x76, 0x0e, 0x6e, 0x0a, 0x24, 0x3e, 0xb6, 0x4f, 0xca, + 0x1d, 0xc5, 0xb1, 0xfd, 0x7e, 0x84, 0xd2, 0x17, 0xdd, 0xbb, 0x24, 0x98, 0x69, 0x98, 0x25, 0x7f, + 0x71, 0x4a, 0xdc, 0x57, 0x55, 0xfc, 0xd6, 0x6c, 0xbf, 0x82, 0x41, 0x31, 0x07, 0xba, 0x35, 0x7b, + 0x30, 0xbd, 0xf4, 0xe5, 0x76, 0x1b, 0x1c, 0xdd, 0x30, 0xda, 0xa6, 0x8a, 0xdb, 0x26, 0x5b, 0xe9, + 0x56, 0x14, 0xc8, 0xee, 0x1a, 0x6d, 0x93, 0xb0, 0x9c, 0x53, 0xc9, 0xb3, 0x9b, 0x66, 0xe1, 0xb6, + 0xc9, 0x7c, 0x03, 0xc8, 0x33, 0xfa, 0x9a, 0x0c, 0x59, 0xf7, 0x5f, 0x71, 0x51, 0xbf, 0x5d, 0x4e, + 0x18, 0x88, 0xc0, 0x25, 0x3f, 0x12, 0x4b, 0xe8, 0xee, 0xd0, 0xda, 0x3f, 0xf5, 0x60, 0xbd, 0x36, + 0xaa, 0xbc, 0x90, 0x28, 0x82, 0x35, 0x7f, 0xe5, 0x14, 0x4c, 0x9c, 0xef, 0x98, 0xad, 0x0b, 0xc1, + 0x79, 0x79, 0xf6, 0xaa, 0xdc, 0x08, 0x39, 0x4b, 0x33, 0xb6, 0x30, 0xdb, 0x53, 0x38, 0xde, 0xd3, + 0x17, 0x12, 0xaf, 0x17, 0x95, 0x66, 0x41, 0x6f, 0x4b, 0x12, 0x02, 0xa1, 0x4f, 0xe5, 0x93, 0xe9, + 0xc3, 0xe2, 0x10, 0x27, 0xcb, 0x0a, 0x30, 0x53, 0x2a, 0xd2, 0xfb, 0xe9, 0xd7, 0x6a, 0x67, 0xcb, + 0x05, 0x99, 0xc0, 0xec, 0xca, 0x24, 0x45, 0x98, 0x5d, 0xf2, 0x3f, 0xb4, 0x30, 0xf7, 0xa9, 0xfc, + 0x61, 0xc0, 0xfc, 0x49, 0x09, 0x66, 0x57, 0x75, 0xdb, 0x89, 0xf2, 0xf6, 0x8f, 0x89, 0x8f, 0xfb, + 0xfc, 0xa4, 0xa6, 0x32, 0x57, 0x8e, 0x70, 0x60, 0xdc, 0x44, 0xe6, 0x70, 0x5c, 0x11, 0xe3, 0x39, + 0x96, 0x42, 0x38, 0xa0, 0xb7, 0x44, 0x0b, 0x4b, 0x32, 0xb1, 0xa1, 0x14, 0x14, 0x32, 0x7e, 0x43, + 0x29, 0xb2, 0xec, 0xf4, 0xe5, 0xfb, 0x35, 0x09, 0x8e, 0xb9, 0xc5, 0xc7, 0x2d, 0x4b, 0x45, 0x8b, + 0x79, 0xe0, 0xb2, 0x54, 0xe2, 0x95, 0xf1, 0x7d, 0xbc, 0x8c, 0x62, 0x65, 0x7c, 0x10, 0xd1, 0x31, + 0x8b, 0x39, 0x62, 0x19, 0x76, 0x90, 0x98, 0x63, 0x96, 0x61, 0x87, 0x17, 0x73, 0xfc, 0x52, 0xec, + 0x90, 0x62, 0x3e, 0xb4, 0x05, 0xd6, 0xd7, 0xca, 0xbe, 0x98, 0x23, 0xd7, 0x36, 0x62, 0xc4, 0x9c, + 0xf8, 0xc4, 0x2e, 0x7a, 0xc7, 0x90, 0x82, 0x1f, 0xf1, 0xfa, 0xc6, 0x30, 0x30, 0x1d, 0xe2, 0x1a, + 0xc7, 0x4b, 0x64, 0x98, 0x63, 0x5c, 0xf4, 0x9f, 0x32, 0xc7, 0x60, 0x94, 0x78, 0xca, 0x9c, 0xf8, + 0x0c, 0x10, 0xcf, 0xd9, 0xf8, 0xcf, 0x00, 0xc5, 0x96, 0x9f, 0x3e, 0x38, 0x5f, 0xcf, 0xc2, 0x49, + 0x97, 0x85, 0x35, 0xb3, 0xad, 0x6f, 0x5e, 0xa2, 0x5c, 0x9c, 0xd5, 0x3a, 0xbb, 0xd8, 0x46, 0xef, + 0x95, 0x44, 0x51, 0xfa, 0x4f, 0x00, 0x66, 0x17, 0x5b, 0x34, 0x90, 0x1a, 0x03, 0xea, 0x8e, 0xa8, + 0xca, 0xee, 0x2f, 0xc9, 0xbf, 0x2e, 0xa6, 0xe6, 0x11, 0x51, 0x43, 0xf4, 0x5c, 0xab, 0x70, 0xca, + 0xff, 0xd2, 0xeb, 0xe0, 0x91, 0xd9, 0xef, 0xe0, 0x71, 0x03, 0xc8, 0x5a, 0xbb, 0xed, 0x43, 0xd5, + 0xbb, 0x99, 0x4d, 0xca, 0x54, 0xdd, 0x2c, 0x6e, 0x4e, 0x1b, 0x07, 0x47, 0xf3, 0x22, 0x72, 0xda, + 0xd8, 0x51, 0xe6, 0x21, 0x4f, 0xef, 0xc0, 0xf6, 0x57, 0xf4, 0xfb, 0x67, 0x66, 0xb9, 0x78, 0xd3, + 0xae, 0xc6, 0xab, 0xe1, 0x6d, 0x89, 0x24, 0xd3, 0xaf, 0x9f, 0x0e, 0xec, 0x64, 0x95, 0x53, 0xb0, + 0xbb, 0x86, 0xa6, 0x3c, 0x9e, 0xdd, 0xb0, 0x62, 0xb7, 0xdb, 0xb9, 0xd4, 0x60, 0xc1, 0x57, 0x12, + 0xed, 0x86, 0x85, 0x62, 0xb8, 0x48, 0xbd, 0x31, 0x5c, 0x92, 0xef, 0x86, 0x71, 0x7c, 0x8c, 0x62, + 0x37, 0x2c, 0x8e, 0x60, 0xfa, 0xa2, 0x7d, 0x4b, 0x8e, 0x5a, 0xcd, 0x2c, 0x7a, 0xff, 0x27, 0xfa, + 0x1f, 0x42, 0x03, 0xde, 0xd9, 0xa5, 0x5f, 0x60, 0xff, 0xd8, 0x5b, 0x4b, 0x94, 0x27, 0x43, 0x7e, + 0xd3, 0xb4, 0x76, 0x34, 0x6f, 0xe3, 0xbe, 0xf7, 0xa4, 0x08, 0x8b, 0x98, 0xbf, 0x44, 0xf2, 0xa8, + 0x2c, 0xaf, 0x3b, 0x1f, 0x79, 0x86, 0xde, 0x65, 0x51, 0x17, 0xdd, 0x47, 0xe5, 0x3a, 0x98, 0x65, + 0xc1, 0x17, 0xab, 0xd8, 0x76, 0x70, 0x9b, 0x45, 0xac, 0xe0, 0x13, 0x95, 0x33, 0x30, 0xc3, 0x12, + 0x96, 0xf4, 0x0e, 0xb6, 0x59, 0xd0, 0x0a, 0x2e, 0x4d, 0x39, 0x09, 0x79, 0xdd, 0xbe, 0xd7, 0x36, + 0x0d, 0xe2, 0xff, 0x3f, 0xa9, 0xb2, 0x37, 0xe5, 0x06, 0x38, 0xca, 0xf2, 0xf9, 0xc6, 0x2a, 0x3d, + 0xb0, 0xd3, 0x9b, 0xec, 0xaa, 0x96, 0x61, 0xae, 0x5b, 0xe6, 0x96, 0x85, 0x6d, 0x9b, 0x9c, 0x9a, + 0x9a, 0x54, 0x43, 0x29, 0xe8, 0x73, 0xc3, 0x4c, 0x2c, 0x12, 0xdf, 0x64, 0xe0, 0xa2, 0xb4, 0xdb, + 0x6a, 0x61, 0xdc, 0x66, 0x27, 0x9f, 0xbc, 0xd7, 0x84, 0x77, 0x1c, 0x24, 0x9e, 0x86, 0x1c, 0xd2, + 0x25, 0x07, 0x1f, 0x3a, 0x01, 0x79, 0x7a, 0x61, 0x18, 0x7a, 0xd1, 0x5c, 0x5f, 0x65, 0x9d, 0xe3, + 0x95, 0x75, 0x03, 0x66, 0x0c, 0xd3, 0x2d, 0x6e, 0x5d, 0xb3, 0xb4, 0x1d, 0x3b, 0x6e, 0x95, 0x91, + 0xd2, 0xf5, 0x87, 0x94, 0x6a, 0xe8, 0xb7, 0x95, 0x23, 0x2a, 0x47, 0x46, 0xf9, 0xff, 0xc1, 0xd1, + 0xf3, 0x2c, 0x42, 0x80, 0xcd, 0x28, 0x4b, 0xd1, 0x3e, 0x78, 0x3d, 0x94, 0x17, 0xf8, 0x3f, 0x57, + 0x8e, 0xa8, 0xbd, 0xc4, 0x94, 0x9f, 0x82, 0x39, 0xf7, 0xb5, 0x6d, 0x5e, 0xf4, 0x18, 0x97, 0xa3, + 0x0d, 0x91, 0x1e, 0xf2, 0x6b, 0xdc, 0x8f, 0x2b, 0x47, 0xd4, 0x1e, 0x52, 0x4a, 0x0d, 0x60, 0xdb, + 0xd9, 0xe9, 0x30, 0xc2, 0xd9, 0x68, 0x95, 0xec, 0x21, 0xbc, 0xe2, 0xff, 0xb4, 0x72, 0x44, 0x0d, + 0x91, 0x50, 0x56, 0x61, 0xca, 0x79, 0xd0, 0x61, 0xf4, 0x72, 0xd1, 0x9b, 0xdf, 0x3d, 0xf4, 0x1a, + 0xde, 0x3f, 0x2b, 0x47, 0xd4, 0x80, 0x80, 0x52, 0x81, 0xc9, 0xee, 0x79, 0x46, 0x2c, 0xdf, 0x27, + 0xda, 0x7c, 0x7f, 0x62, 0xeb, 0xe7, 0x7d, 0x5a, 0xfe, 0xef, 0x2e, 0x63, 0x2d, 0x7b, 0x8f, 0xd1, + 0x9a, 0x10, 0x66, 0xac, 0xe4, 0xfd, 0xe3, 0x32, 0xe6, 0x13, 0x50, 0x2a, 0x30, 0x65, 0x1b, 0x5a, + 0xd7, 0xde, 0x36, 0x1d, 0xfb, 0xd4, 0x64, 0x8f, 0x9f, 0x64, 0x34, 0xb5, 0x3a, 0xfb, 0x47, 0x0d, + 0xfe, 0x56, 0x9e, 0x0c, 0x27, 0x76, 0xc9, 0x05, 0xf9, 0xe5, 0x07, 0x75, 0xdb, 0xd1, 0x8d, 0x2d, + 0x2f, 0xc6, 0x2c, 0xed, 0x6d, 0xfa, 0x7f, 0x54, 0xe6, 0xd9, 0x89, 0x29, 0x20, 0x6d, 0x13, 0xf5, + 0x6e, 0xd6, 0xd1, 0x62, 0x43, 0x07, 0xa5, 0x9e, 0x06, 0x59, 0xf7, 0x13, 0xe9, 0x9d, 0xe6, 0xfa, + 0x2f, 0x04, 0xf6, 0xea, 0x0e, 0x69, 0xc0, 0xee, 0x4f, 0x3d, 0x1d, 0xdc, 0x4c, 0x6f, 0x07, 0xe7, + 0x36, 0x70, 0xdd, 0x5e, 0xd3, 0xb7, 0xa8, 0x75, 0xc5, 0xfc, 0xe1, 0xc3, 0x49, 0x74, 0x36, 0x5a, + 0xc5, 0x17, 0xe9, 0x0d, 0x1a, 0x47, 0xbd, 0xd9, 0xa8, 0x97, 0x82, 0xae, 0x87, 0x99, 0x70, 0x23, + 0xa3, 0xb7, 0x8e, 0xea, 0x81, 0x6d, 0xc6, 0xde, 0xd0, 0x75, 0x30, 0xc7, 0xeb, 0x74, 0x68, 0x08, + 0x92, 0xbd, 0xae, 0x10, 0x5d, 0x0b, 0x47, 0x7b, 0x1a, 0x96, 0x17, 0x73, 0x24, 0x13, 0xc4, 0x1c, + 0xb9, 0x06, 0x20, 0xd0, 0xe2, 0xbe, 0x64, 0xae, 0x86, 0x29, 0x5f, 0x2f, 0xfb, 0x66, 0xf8, 0x4a, + 0x06, 0x26, 0x3d, 0x65, 0xeb, 0x97, 0xc1, 0x1d, 0x7f, 0x8c, 0xd0, 0x06, 0x03, 0x9b, 0x86, 0x73, + 0x69, 0xee, 0x38, 0x13, 0xb8, 0xf5, 0x36, 0x74, 0xa7, 0xe3, 0x1d, 0x8d, 0xeb, 0x4d, 0x56, 0xd6, + 0x01, 0x74, 0x82, 0x51, 0x23, 0x38, 0x2b, 0x77, 0x4b, 0x82, 0xf6, 0x40, 0xf5, 0x21, 0x44, 0xe3, + 0xcc, 0x8f, 0xb0, 0x83, 0x6c, 0x53, 0x90, 0xa3, 0x81, 0xd6, 0x8f, 0x28, 0x73, 0x00, 0xe5, 0xa7, + 0xaf, 0x97, 0xd5, 0x4a, 0xb9, 0x5a, 0x2a, 0x17, 0x32, 0xe8, 0xa5, 0x12, 0x4c, 0xf9, 0x8d, 0xa0, + 0x6f, 0x25, 0xcb, 0x4c, 0xb5, 0x06, 0x5e, 0xec, 0xb8, 0xbf, 0x51, 0x85, 0x95, 0xec, 0xa9, 0x70, + 0xf9, 0xae, 0x8d, 0x97, 0x74, 0xcb, 0x76, 0x54, 0xf3, 0xe2, 0x92, 0x69, 0xf9, 0x51, 0x95, 0x59, + 0x84, 0xd3, 0xa8, 0xcf, 0xae, 0xc5, 0xd1, 0xc6, 0xe4, 0xd0, 0x14, 0xb6, 0xd8, 0xca, 0x71, 0x90, + 0xe0, 0xd2, 0x75, 0x2c, 0xcd, 0xb0, 0xbb, 0xa6, 0x8d, 0x55, 0xf3, 0xa2, 0x5d, 0x34, 0xda, 0x25, + 0xb3, 0xb3, 0xbb, 0x63, 0xd8, 0xcc, 0x66, 0x88, 0xfa, 0xec, 0x4a, 0x87, 0x5c, 0xdb, 0x3a, 0x07, + 0x50, 0xaa, 0xad, 0xae, 0x96, 0x4b, 0x8d, 0x4a, 0xad, 0x5a, 0x38, 0xe2, 0x4a, 0xab, 0x51, 0x5c, + 0x58, 0x75, 0xa5, 0xf3, 0xd3, 0x30, 0xe9, 0xb5, 0x69, 0x16, 0x26, 0x25, 0xe3, 0x85, 0x49, 0x51, + 0x8a, 0x30, 0xe9, 0xb5, 0x72, 0x36, 0x22, 0x3c, 0xb6, 0xf7, 0x58, 0xec, 0x8e, 0x66, 0x39, 0xc4, + 0x9f, 0xda, 0x23, 0xb2, 0xa0, 0xd9, 0x58, 0xf5, 0x7f, 0x3b, 0xf3, 0x04, 0xc6, 0x81, 0x02, 0x73, + 0xc5, 0xd5, 0xd5, 0x66, 0x4d, 0x6d, 0x56, 0x6b, 0x8d, 0x95, 0x4a, 0x75, 0x99, 0x8e, 0x90, 0x95, + 0xe5, 0x6a, 0x4d, 0x2d, 0xd3, 0x01, 0xb2, 0x5e, 0xc8, 0xd0, 0x6b, 0x83, 0x17, 0x26, 0x21, 0xdf, + 0x25, 0xd2, 0x45, 0x5f, 0x92, 0x13, 0x9e, 0x87, 0xf7, 0x71, 0x8a, 0xb8, 0xd8, 0x94, 0xf3, 0x49, + 0x97, 0xfa, 0x9c, 0x19, 0x3d, 0x03, 0x33, 0xd4, 0xd6, 0xb3, 0xc9, 0xf2, 0x3e, 0x41, 0x4e, 0x56, + 0xb9, 0x34, 0xf4, 0x11, 0x29, 0xc1, 0x21, 0xf9, 0xbe, 0x1c, 0x25, 0x33, 0x2e, 0xfe, 0x2c, 0x33, + 0xdc, 0xb5, 0x04, 0x95, 0x6a, 0xa3, 0xac, 0x56, 0x8b, 0xab, 0x2c, 0x8b, 0xac, 0x9c, 0x82, 0xe3, + 0xd5, 0x1a, 0x8b, 0xf9, 0x57, 0x6f, 0x36, 0x6a, 0xcd, 0xca, 0xda, 0x7a, 0x4d, 0x6d, 0x14, 0x72, + 0xca, 0x49, 0x50, 0xe8, 0x73, 0xb3, 0x52, 0x6f, 0x96, 0x8a, 0xd5, 0x52, 0x79, 0xb5, 0xbc, 0x58, + 0xc8, 0x2b, 0x8f, 0x83, 0x6b, 0xe9, 0x35, 0x37, 0xb5, 0xa5, 0xa6, 0x5a, 0x3b, 0x57, 0x77, 0x11, + 0x54, 0xcb, 0xab, 0x45, 0x57, 0x91, 0x42, 0xd7, 0x07, 0x4f, 0x28, 0x97, 0xc1, 0x51, 0x72, 0xb7, + 0xf8, 0x6a, 0xad, 0xb8, 0xc8, 0xca, 0x9b, 0x54, 0xae, 0x82, 0x53, 0x95, 0x6a, 0x7d, 0x63, 0x69, + 0xa9, 0x52, 0xaa, 0x94, 0xab, 0x8d, 0xe6, 0x7a, 0x59, 0x5d, 0xab, 0xd4, 0xeb, 0xee, 0xbf, 0x85, + 0x29, 0x72, 0x39, 0x2b, 0xed, 0x33, 0xd1, 0x7b, 0x64, 0x98, 0x3d, 0xab, 0x75, 0x74, 0x77, 0xa0, + 0x20, 0xb7, 0x36, 0xf7, 0x1c, 0x27, 0x71, 0xc8, 0xed, 0xce, 0xcc, 0x21, 0x9d, 0xbc, 0xa0, 0x9f, + 0x97, 0x13, 0x1e, 0x27, 0x61, 0x40, 0xd0, 0x12, 0xe7, 0xb9, 0xd2, 0x22, 0x26, 0x3f, 0xaf, 0x92, + 0x12, 0x1c, 0x27, 0x11, 0x27, 0x9f, 0x0c, 0xfc, 0xdf, 0x1a, 0x15, 0xf8, 0x05, 0x98, 0xd9, 0xa8, + 0x16, 0x37, 0x1a, 0x2b, 0x35, 0xb5, 0xf2, 0x93, 0x24, 0x1a, 0xf9, 0x2c, 0x4c, 0x2d, 0xd5, 0xd4, + 0x85, 0xca, 0xe2, 0x62, 0xb9, 0x5a, 0xc8, 0x29, 0x97, 0xc3, 0x65, 0xf5, 0xb2, 0x7a, 0xb6, 0x52, + 0x2a, 0x37, 0x37, 0xaa, 0xc5, 0xb3, 0xc5, 0xca, 0x2a, 0xe9, 0x23, 0xf2, 0x31, 0x37, 0x4e, 0x4f, + 0xa0, 0x9f, 0xcd, 0x02, 0xd0, 0xaa, 0x93, 0xcb, 0x78, 0x42, 0xf7, 0x12, 0xff, 0x79, 0xd2, 0x49, + 0x43, 0x40, 0x26, 0xa2, 0xfd, 0x56, 0x60, 0xd2, 0x62, 0x1f, 0xd8, 0xf2, 0xca, 0x20, 0x3a, 0xf4, + 0xd1, 0xa3, 0xa6, 0xfa, 0xbf, 0xa3, 0xf7, 0x26, 0x99, 0x23, 0x44, 0x32, 0x96, 0x0c, 0xc9, 0xa5, + 0xd1, 0x00, 0x89, 0x9e, 0x97, 0x81, 0x39, 0xbe, 0x62, 0x6e, 0x25, 0x88, 0x31, 0x25, 0x56, 0x09, + 0xfe, 0xe7, 0x90, 0x91, 0x75, 0xe6, 0x49, 0x6c, 0x38, 0x05, 0xaf, 0x65, 0xd2, 0x93, 0xe1, 0x9e, + 0xc5, 0x52, 0xc8, 0xb8, 0xcc, 0xbb, 0x46, 0x47, 0x41, 0x52, 0x26, 0x40, 0x6e, 0x3c, 0xe8, 0x14, + 0x64, 0xf4, 0x15, 0x19, 0x66, 0xb9, 0x8b, 0x8f, 0xd1, 0xab, 0x32, 0x22, 0x97, 0x92, 0x86, 0xae, + 0x54, 0xce, 0x1c, 0xf4, 0x4a, 0xe5, 0x33, 0x37, 0xc3, 0x04, 0x4b, 0x23, 0xf2, 0xad, 0x55, 0x5d, + 0x53, 0xe0, 0x28, 0x4c, 0x2f, 0x97, 0x1b, 0xcd, 0x7a, 0xa3, 0xa8, 0x36, 0xca, 0x8b, 0x85, 0x8c, + 0x3b, 0xf0, 0x95, 0xd7, 0xd6, 0x1b, 0xf7, 0x17, 0xa4, 0xe4, 0x1e, 0x7a, 0xbd, 0x8c, 0x8c, 0xd9, + 0x43, 0x2f, 0xae, 0xf8, 0xf4, 0xe7, 0xaa, 0x9f, 0x91, 0xa1, 0x40, 0x39, 0x28, 0x3f, 0xd8, 0xc5, + 0x96, 0x8e, 0x8d, 0x16, 0x46, 0x17, 0x44, 0x22, 0x82, 0xee, 0x8b, 0x95, 0x47, 0xfa, 0xf3, 0x90, + 0x95, 0x48, 0x5f, 0x7a, 0x0c, 0xec, 0xec, 0x3e, 0x03, 0xfb, 0xd3, 0x49, 0x5d, 0xf4, 0x7a, 0xd9, + 0x1d, 0x09, 0x64, 0x1f, 0x4f, 0xe2, 0xa2, 0x37, 0x80, 0x83, 0xb1, 0x04, 0xfa, 0x8d, 0x18, 0x7f, + 0x0b, 0x32, 0x7a, 0xae, 0x0c, 0x47, 0x17, 0x35, 0x07, 0x2f, 0x5c, 0x6a, 0x78, 0x17, 0x13, 0x46, + 0x5c, 0x26, 0x9c, 0xd9, 0x77, 0x99, 0x70, 0x70, 0xb7, 0xa1, 0xd4, 0x73, 0xb7, 0x21, 0x7a, 0x67, + 0xd2, 0x43, 0x7d, 0x3d, 0x3c, 0x8c, 0x2c, 0x1a, 0x6f, 0xb2, 0xc3, 0x7a, 0xf1, 0x5c, 0x8c, 0xe1, + 0x6e, 0xff, 0x29, 0x28, 0x50, 0x56, 0x42, 0x5e, 0x68, 0xbf, 0xc6, 0xee, 0xdf, 0x6e, 0x26, 0x08, + 0xfa, 0xe7, 0x85, 0x51, 0x90, 0xf8, 0x30, 0x0a, 0xdc, 0xa2, 0xa6, 0xdc, 0xeb, 0x39, 0x90, 0xb4, + 0x33, 0x0c, 0xb9, 0x9c, 0x45, 0xc7, 0x59, 0x4d, 0xaf, 0x33, 0x8c, 0x2d, 0x7e, 0x3c, 0x77, 0xc4, + 0xb2, 0x7b, 0x1e, 0xcb, 0xa2, 0xc8, 0xc4, 0x5f, 0x85, 0x9d, 0xd4, 0xff, 0x98, 0x73, 0xf9, 0x8b, + 0xb9, 0x1f, 0x3a, 0x3d, 0xff, 0xe3, 0x41, 0x1c, 0xa4, 0x8f, 0xc2, 0xf7, 0x25, 0xc8, 0xd6, 0x4d, + 0xcb, 0x19, 0x15, 0x06, 0x49, 0xf7, 0x4c, 0x43, 0x12, 0xa8, 0x47, 0xcf, 0x39, 0xd3, 0xdb, 0x33, + 0x8d, 0x2f, 0x7f, 0x0c, 0x71, 0x13, 0x8f, 0xc2, 0x1c, 0xe5, 0xc4, 0xbf, 0x54, 0xe4, 0x7b, 0x12, + 0xed, 0xaf, 0xee, 0x13, 0x45, 0xe4, 0x0c, 0xcc, 0x84, 0xf6, 0x2c, 0x3d, 0x50, 0xb8, 0x34, 0xf4, + 0xfa, 0x30, 0x2e, 0x8b, 0x3c, 0x2e, 0xfd, 0x66, 0xdc, 0xfe, 0xbd, 0x1c, 0xa3, 0xea, 0x99, 0x92, + 0x84, 0x60, 0x8c, 0x29, 0x3c, 0x7d, 0x44, 0x1e, 0x92, 0x21, 0xcf, 0x7c, 0xc6, 0x46, 0x8a, 0x40, + 0xd2, 0x96, 0xe1, 0x0b, 0x41, 0xcc, 0xb7, 0x4c, 0x1e, 0x75, 0xcb, 0x88, 0x2f, 0x3f, 0x7d, 0x1c, + 0xfe, 0x9d, 0x39, 0x43, 0x16, 0xf7, 0x34, 0xbd, 0xa3, 0x9d, 0xef, 0x24, 0x08, 0x7d, 0xfc, 0x91, + 0x84, 0xc7, 0xbf, 0xfc, 0xaa, 0x72, 0xe5, 0x45, 0x48, 0xfc, 0xc7, 0x60, 0xca, 0xf2, 0x97, 0x24, + 0xbd, 0xd3, 0xf1, 0x3d, 0x8e, 0xa8, 0xec, 0xbb, 0x1a, 0xe4, 0x4c, 0x74, 0xd6, 0x4b, 0x88, 0x9f, + 0xb1, 0x9c, 0x4d, 0x99, 0x2e, 0xb6, 0xdb, 0x4b, 0x58, 0x73, 0x76, 0x2d, 0xdc, 0x4e, 0x34, 0x44, + 0xf0, 0x22, 0x9a, 0x0a, 0x4b, 0x82, 0x0b, 0x3e, 0xb8, 0xca, 0xa3, 0xf3, 0x94, 0x01, 0xbd, 0x81, + 0xc7, 0xcb, 0x48, 0xba, 0xa4, 0xb7, 0xf8, 0x90, 0xd4, 0x38, 0x48, 0x9e, 0x36, 0x1c, 0x13, 0x63, + 0xb8, 0xd0, 0x5d, 0x86, 0x39, 0x6a, 0x27, 0x8c, 0x1a, 0x93, 0xdf, 0x4f, 0xe8, 0x63, 0x12, 0xba, + 0xb6, 0x29, 0xcc, 0xce, 0x48, 0x60, 0x49, 0xe2, 0x91, 0x22, 0xc6, 0x47, 0xfa, 0xc8, 0x7c, 0x2e, + 0x0f, 0x10, 0xf2, 0x1b, 0xfc, 0x48, 0x3e, 0x08, 0x04, 0x88, 0xde, 0xc6, 0xe6, 0x1f, 0x75, 0x2e, + 0x2a, 0x75, 0xc8, 0x27, 0xd0, 0xdf, 0x90, 0xe2, 0x13, 0x85, 0x46, 0x95, 0x3f, 0x4b, 0x68, 0xf3, + 0x32, 0xaf, 0xbd, 0x81, 0x83, 0xfb, 0x90, 0xbd, 0xdc, 0x47, 0x13, 0x18, 0xbf, 0x83, 0x58, 0x49, + 0x86, 0xda, 0xea, 0x10, 0x33, 0xfb, 0x53, 0x70, 0x5c, 0x2d, 0x17, 0x17, 0x6b, 0xd5, 0xd5, 0xfb, + 0xc3, 0x77, 0xf8, 0x14, 0xe4, 0xf0, 0xe4, 0x24, 0x15, 0xd8, 0x5e, 0x93, 0xb0, 0x0f, 0xe4, 0x65, + 0x15, 0x7b, 0x43, 0xfd, 0xc7, 0x13, 0xf4, 0x6a, 0x02, 0x64, 0x0f, 0x13, 0x85, 0x87, 0x20, 0xd4, + 0x8c, 0x7e, 0x51, 0x86, 0x82, 0x3b, 0x1e, 0x52, 0x2e, 0xd9, 0x65, 0x6d, 0x35, 0xde, 0xad, 0xb0, + 0x4b, 0xf7, 0x9f, 0x02, 0xb7, 0x42, 0x2f, 0x41, 0xb9, 0x1e, 0xe6, 0x5a, 0xdb, 0xb8, 0x75, 0xa1, + 0x62, 0x78, 0xfb, 0xea, 0x74, 0x13, 0xb6, 0x27, 0x95, 0x07, 0xe6, 0x3e, 0x1e, 0x18, 0x7e, 0x12, + 0xcd, 0x0d, 0xd2, 0x61, 0xa6, 0x22, 0x70, 0xf9, 0x84, 0x8f, 0x4b, 0x95, 0xc3, 0xe5, 0xf6, 0xa1, + 0xa8, 0x26, 0x83, 0xa5, 0x3a, 0x04, 0x2c, 0x08, 0x4e, 0xd6, 0xd6, 0x1b, 0x95, 0x5a, 0xb5, 0xb9, + 0x51, 0x2f, 0x2f, 0x36, 0x17, 0x3c, 0x70, 0xea, 0x05, 0x19, 0x7d, 0x43, 0x82, 0x09, 0xca, 0x96, + 0x8d, 0x1e, 0x1f, 0x40, 0x30, 0xd0, 0x9f, 0x12, 0xbd, 0x55, 0x38, 0x3a, 0x82, 0x2f, 0x08, 0x56, + 0x4e, 0x44, 0x3f, 0xf5, 0x54, 0x98, 0xa0, 0x20, 0x7b, 0x2b, 0x5a, 0xa7, 0x23, 0x7a, 0x29, 0x46, + 0x46, 0xf5, 0xb2, 0x0b, 0x46, 0x4a, 0x18, 0xc0, 0x46, 0xfa, 0x23, 0xcb, 0x33, 0xb3, 0xd4, 0x0c, + 0x3e, 0xa7, 0x3b, 0xdb, 0xc4, 0xdd, 0x12, 0xfd, 0x84, 0xc8, 0xf2, 0xe2, 0x4d, 0x90, 0xdb, 0x73, + 0x73, 0x0f, 0x70, 0x5d, 0xa5, 0x99, 0xd0, 0x6f, 0x09, 0x07, 0xe6, 0xe4, 0xf4, 0xd3, 0xe7, 0x29, + 0x02, 0x9c, 0x35, 0xc8, 0x76, 0x74, 0xdb, 0x61, 0xe3, 0xc7, 0x6d, 0x89, 0x08, 0x79, 0x0f, 0x15, + 0x07, 0xef, 0xa8, 0x84, 0x0c, 0xba, 0x17, 0x66, 0xc2, 0xa9, 0x02, 0xee, 0xbb, 0xa7, 0x60, 0x82, + 0x1d, 0x2b, 0x63, 0x4b, 0xac, 0xde, 0xab, 0xe0, 0xb2, 0xa6, 0x50, 0x6d, 0xd3, 0xd7, 0x81, 0xff, + 0xfb, 0x28, 0x4c, 0xac, 0xe8, 0xb6, 0x63, 0x5a, 0x97, 0xd0, 0xc3, 0x19, 0x98, 0x38, 0x8b, 0x2d, + 0x5b, 0x37, 0x8d, 0x7d, 0xae, 0x06, 0xd7, 0xc0, 0x74, 0xd7, 0xc2, 0x7b, 0xba, 0xb9, 0x6b, 0x07, + 0x8b, 0x33, 0xe1, 0x24, 0x05, 0xc1, 0xa4, 0xb6, 0xeb, 0x6c, 0x9b, 0x56, 0x10, 0x8d, 0xc2, 0x7b, + 0x57, 0x4e, 0x03, 0xd0, 0xe7, 0xaa, 0xb6, 0x83, 0x99, 0x03, 0x45, 0x28, 0x45, 0x51, 0x20, 0xeb, + 0xe8, 0x3b, 0x98, 0x85, 0xa7, 0x25, 0xcf, 0xae, 0x80, 0x49, 0xa8, 0x37, 0x16, 0x52, 0x4f, 0x56, + 0xbd, 0x57, 0xf4, 0x05, 0x19, 0xa6, 0x97, 0xb1, 0xc3, 0x58, 0xb5, 0xd1, 0xf3, 0x33, 0x42, 0x37, + 0x42, 0xb8, 0x63, 0x6c, 0x47, 0xb3, 0xbd, 0xff, 0xfc, 0x25, 0x58, 0x3e, 0x31, 0x88, 0x95, 0x2b, + 0x87, 0x03, 0x65, 0x93, 0xc0, 0x69, 0x4e, 0x85, 0xfa, 0x65, 0xb2, 0xcc, 0x6c, 0x13, 0x64, 0xff, + 0x07, 0xf4, 0x2e, 0x49, 0xf4, 0xd0, 0x31, 0x93, 0xfd, 0x7c, 0xa8, 0x3e, 0x91, 0xdd, 0xd1, 0xe4, + 0x1e, 0xcb, 0xb1, 0x2f, 0x06, 0x7a, 0x98, 0x12, 0x23, 0xa3, 0xfa, 0xb9, 0x05, 0x8f, 0x2b, 0x0f, + 0xe6, 0x24, 0x7d, 0x6d, 0xfc, 0x8e, 0x0c, 0xd3, 0xf5, 0x6d, 0xf3, 0xa2, 0x27, 0xc7, 0x9f, 0x16, + 0x03, 0xf6, 0x2a, 0x98, 0xda, 0xeb, 0x01, 0x35, 0x48, 0x88, 0xbe, 0xa3, 0x1d, 0x3d, 0x47, 0x4e, + 0x0a, 0x53, 0x88, 0xb9, 0x91, 0xdf, 0xa0, 0xae, 0x3c, 0x05, 0x26, 0x18, 0xd7, 0x6c, 0xc9, 0x25, + 0x1e, 0x60, 0x2f, 0x73, 0xb8, 0x82, 0x59, 0xbe, 0x82, 0xc9, 0x90, 0x8f, 0xae, 0x5c, 0xfa, 0xc8, + 0xff, 0xb1, 0x44, 0x82, 0x55, 0x78, 0xc0, 0x97, 0x46, 0x00, 0x3c, 0xfa, 0x6e, 0x46, 0x74, 0x61, + 0xd2, 0x97, 0x80, 0xcf, 0xc1, 0x81, 0x6e, 0x7b, 0x19, 0x48, 0x2e, 0x7d, 0x79, 0xbe, 0x34, 0x0b, + 0x33, 0x8b, 0xfa, 0xe6, 0xa6, 0xdf, 0x49, 0xbe, 0x40, 0xb0, 0x93, 0x8c, 0x76, 0x07, 0x70, 0xed, + 0xdc, 0x5d, 0xcb, 0xc2, 0x86, 0x57, 0x29, 0xd6, 0x9c, 0x7a, 0x52, 0x95, 0x1b, 0xe0, 0xa8, 0x37, + 0x2e, 0x84, 0x3b, 0xca, 0x29, 0xb5, 0x37, 0x19, 0x7d, 0x5b, 0x78, 0x57, 0xcb, 0x93, 0x68, 0xb8, + 0x4a, 0x11, 0x0d, 0xf0, 0x0e, 0x98, 0xdd, 0xa6, 0xb9, 0xc9, 0xd4, 0xdf, 0xeb, 0x2c, 0x4f, 0xf6, + 0x04, 0x03, 0x5e, 0xc3, 0xb6, 0xad, 0x6d, 0x61, 0x95, 0xcf, 0xdc, 0xd3, 0x7c, 0xe5, 0x24, 0x57, + 0x5b, 0x89, 0x6d, 0x90, 0x09, 0xd4, 0x64, 0x0c, 0xda, 0x71, 0x06, 0xb2, 0x4b, 0x7a, 0x07, 0xa3, + 0x5f, 0x92, 0x60, 0x4a, 0xc5, 0x2d, 0xd3, 0x68, 0xb9, 0x6f, 0x21, 0xe7, 0xa0, 0x7f, 0xcc, 0x88, + 0x5e, 0xe9, 0xe8, 0xd2, 0x99, 0xf7, 0x69, 0x44, 0xb4, 0x1b, 0xb1, 0xab, 0x1b, 0x63, 0x49, 0x8d, + 0xe1, 0x02, 0x0e, 0x77, 0xea, 0xb1, 0xb9, 0xd9, 0x31, 0x35, 0x6e, 0xf1, 0xab, 0xd7, 0x14, 0xba, + 0x11, 0x0a, 0xde, 0x19, 0x10, 0xd3, 0x59, 0xd7, 0x0d, 0xc3, 0x3f, 0x64, 0xbc, 0x2f, 0x9d, 0xdf, + 0xb7, 0x8d, 0x8d, 0xd3, 0x42, 0xea, 0xce, 0x4a, 0x8f, 0xd0, 0xec, 0xeb, 0x61, 0xee, 0xfc, 0x25, + 0x07, 0xdb, 0x2c, 0x17, 0x2b, 0x36, 0xab, 0xf6, 0xa4, 0x86, 0xa2, 0x2c, 0xc7, 0xc5, 0x73, 0x89, + 0x29, 0x30, 0x99, 0xa8, 0x57, 0x86, 0x98, 0x01, 0x1e, 0x87, 0x42, 0xb5, 0xb6, 0x58, 0x26, 0xbe, + 0x6a, 0x9e, 0xf7, 0xcf, 0x16, 0x7a, 0xa1, 0x0c, 0x33, 0xc4, 0x99, 0xc4, 0x43, 0xe1, 0x5a, 0x81, + 0xf9, 0x08, 0x7a, 0x44, 0xd8, 0x8f, 0x8d, 0x54, 0x39, 0x5c, 0x40, 0xb4, 0xa0, 0x37, 0xf5, 0x4e, + 0xaf, 0xa0, 0x73, 0x6a, 0x4f, 0x6a, 0x1f, 0x40, 0xe4, 0xbe, 0x80, 0xfc, 0xae, 0x90, 0x33, 0xdb, + 0x20, 0xee, 0x0e, 0x0b, 0x95, 0xdf, 0x93, 0x61, 0xda, 0x9d, 0xa4, 0x78, 0xa0, 0xd4, 0x38, 0x50, + 0x4c, 0xa3, 0x73, 0x29, 0x58, 0x16, 0xf1, 0x5e, 0x13, 0x35, 0x92, 0xbf, 0x14, 0x9e, 0xb9, 0x13, + 0x11, 0x85, 0x78, 0x19, 0x13, 0x7e, 0xef, 0x13, 0x9a, 0xcf, 0x0f, 0x60, 0xee, 0xb0, 0xe0, 0xfb, + 0x5a, 0x0e, 0xf2, 0x1b, 0x5d, 0x82, 0xdc, 0x6f, 0xc9, 0x22, 0x11, 0xcb, 0xf7, 0x1d, 0x64, 0x70, + 0xcd, 0xac, 0x8e, 0xd9, 0xd2, 0x3a, 0xeb, 0xc1, 0x89, 0xb0, 0x20, 0x41, 0xb9, 0x9d, 0xf9, 0x36, + 0xd2, 0xe3, 0x76, 0xd7, 0xc7, 0x06, 0xf3, 0x26, 0x32, 0x0a, 0x1d, 0x1a, 0xb9, 0x09, 0x8e, 0xb5, + 0x75, 0x5b, 0x3b, 0xdf, 0xc1, 0x65, 0xa3, 0x65, 0x5d, 0xa2, 0xe2, 0x60, 0xd3, 0xaa, 0x7d, 0x1f, + 0x94, 0x3b, 0x21, 0x67, 0x3b, 0x97, 0x3a, 0x74, 0x9e, 0x18, 0x3e, 0x63, 0x12, 0x59, 0x54, 0xdd, + 0xcd, 0xae, 0xd2, 0xbf, 0xc2, 0x2e, 0x4a, 0x13, 0x82, 0xf7, 0x39, 0x3f, 0x09, 0xf2, 0xa6, 0xa5, + 0x6f, 0xe9, 0xf4, 0x7e, 0x9e, 0xb9, 0x7d, 0x31, 0xeb, 0xa8, 0x29, 0x50, 0x23, 0x59, 0x54, 0x96, + 0x55, 0x79, 0x0a, 0x4c, 0xe9, 0x3b, 0xda, 0x16, 0xbe, 0x4f, 0x37, 0xe8, 0x89, 0xbe, 0xb9, 0x5b, + 0x4f, 0xed, 0x3b, 0x3e, 0xc3, 0xbe, 0xab, 0x41, 0x56, 0xf4, 0x3e, 0x49, 0x34, 0xb0, 0x0e, 0xa9, + 0x1b, 0x05, 0x75, 0x2c, 0xf7, 0x5a, 0xa3, 0x57, 0x08, 0x85, 0xbc, 0x89, 0x66, 0x2b, 0xfd, 0xc1, + 0xfb, 0xf3, 0x12, 0x4c, 0x2e, 0x9a, 0x17, 0x0d, 0xa2, 0xe8, 0xb7, 0x89, 0xd9, 0xba, 0x7d, 0x0e, + 0x39, 0xf2, 0xd7, 0x46, 0xc6, 0x9e, 0x68, 0x20, 0xb5, 0xf5, 0x8a, 0x8c, 0x80, 0x21, 0xb6, 0xe5, + 0x08, 0x5e, 0xe6, 0x17, 0x57, 0x4e, 0xfa, 0x72, 0xfd, 0x13, 0x19, 0xb2, 0x8b, 0x96, 0xd9, 0x45, + 0x6f, 0xc9, 0x24, 0x70, 0x59, 0x68, 0x5b, 0x66, 0xb7, 0x41, 0x6e, 0xe3, 0x0a, 0x8e, 0x71, 0x84, + 0xd3, 0x94, 0xdb, 0x60, 0xb2, 0x6b, 0xda, 0xba, 0xe3, 0x4d, 0x23, 0xe6, 0x6e, 0x7d, 0x4c, 0xdf, + 0xd6, 0xbc, 0xce, 0x32, 0xa9, 0x7e, 0x76, 0xb7, 0xd7, 0x26, 0x22, 0x74, 0xe5, 0xe2, 0x8a, 0xd1, + 0xbb, 0x91, 0xac, 0x27, 0x15, 0xbd, 0x28, 0x8c, 0xe4, 0xd3, 0x78, 0x24, 0x1f, 0xdb, 0x47, 0xc2, + 0x96, 0xd9, 0x1d, 0xc9, 0x26, 0xe3, 0xcb, 0x7c, 0x54, 0xef, 0xe2, 0x50, 0xbd, 0x51, 0xa8, 0xcc, + 0xf4, 0x11, 0x7d, 0x5f, 0x16, 0x80, 0x98, 0x19, 0x1b, 0xee, 0x04, 0x48, 0xcc, 0xc6, 0xfa, 0x85, + 0x6c, 0x48, 0x96, 0x45, 0x5e, 0x96, 0x8f, 0x8f, 0xb0, 0x62, 0x08, 0xf9, 0x08, 0x89, 0x16, 0x21, + 0xb7, 0xeb, 0x7e, 0x66, 0x12, 0x15, 0x24, 0x41, 0x5e, 0x55, 0xfa, 0x27, 0xfa, 0xe3, 0x0c, 0xe4, + 0x48, 0x82, 0x72, 0x1a, 0x80, 0x0c, 0xec, 0xf4, 0x40, 0x50, 0x86, 0x0c, 0xe1, 0xa1, 0x14, 0xa2, + 0xad, 0x7a, 0x9b, 0x7d, 0xa6, 0x26, 0x73, 0x90, 0xe0, 0xfe, 0x4d, 0x86, 0x7b, 0x42, 0x8b, 0x19, + 0x00, 0xa1, 0x14, 0xf7, 0x6f, 0xf2, 0xb6, 0x8a, 0x37, 0x69, 0xa0, 0xe4, 0xac, 0x1a, 0x24, 0xf8, + 0x7f, 0xaf, 0xfa, 0xd7, 0x6b, 0x79, 0x7f, 0x93, 0x14, 0x77, 0x32, 0x4c, 0xd4, 0x72, 0x21, 0x28, + 0x22, 0x4f, 0x32, 0xf5, 0x26, 0xa3, 0xd7, 0xf8, 0x6a, 0xb3, 0xc8, 0xa9, 0xcd, 0x2d, 0x09, 0xc4, + 0x9b, 0xbe, 0xf2, 0x7c, 0x25, 0x07, 0x53, 0x55, 0xb3, 0xcd, 0x74, 0x27, 0x34, 0x61, 0xfc, 0x78, + 0x2e, 0xd1, 0x84, 0xd1, 0xa7, 0x11, 0xa1, 0x20, 0xf7, 0xf0, 0x0a, 0x22, 0x46, 0x21, 0xac, 0x1f, + 0xca, 0x02, 0xe4, 0x89, 0xf6, 0xee, 0xbf, 0xb7, 0x29, 0x8e, 0x04, 0x11, 0xad, 0xca, 0xfe, 0xfc, + 0x0f, 0xa7, 0x63, 0xff, 0x15, 0x72, 0xa4, 0x82, 0x31, 0xbb, 0x3b, 0x7c, 0x45, 0xa5, 0xf8, 0x8a, + 0xca, 0xf1, 0x15, 0xcd, 0xf6, 0x56, 0x34, 0xc9, 0x3a, 0x40, 0x94, 0x86, 0xa4, 0xaf, 0xe3, 0xff, + 0x30, 0x01, 0x50, 0xd5, 0xf6, 0xf4, 0x2d, 0xba, 0x3b, 0xfc, 0x05, 0x6f, 0xfe, 0xc3, 0xf6, 0x71, + 0xff, 0x5b, 0x68, 0x20, 0xbc, 0x0d, 0x26, 0xd8, 0xb8, 0xc7, 0x2a, 0x72, 0x35, 0x57, 0x91, 0x80, + 0x0a, 0x35, 0x4b, 0x1f, 0x74, 0x54, 0x2f, 0x3f, 0x77, 0xc5, 0xac, 0xd4, 0x73, 0xc5, 0x6c, 0xff, + 0x3d, 0x88, 0x88, 0x8b, 0x67, 0xd1, 0xbb, 0x85, 0x3d, 0xfa, 0x43, 0xfc, 0x84, 0x6a, 0x14, 0xd1, + 0x04, 0x9f, 0x04, 0x13, 0xa6, 0xbf, 0xa1, 0x2d, 0x47, 0xae, 0x83, 0x55, 0x8c, 0x4d, 0x53, 0xf5, + 0x72, 0x0a, 0x6e, 0x7e, 0x09, 0xf1, 0x31, 0x96, 0x43, 0x33, 0x27, 0x97, 0xbd, 0xa0, 0x53, 0x6e, + 0x3d, 0xce, 0xe9, 0xce, 0xf6, 0xaa, 0x6e, 0x5c, 0xb0, 0xd1, 0x7f, 0x16, 0xb3, 0x20, 0x43, 0xf8, + 0x4b, 0xc9, 0xf0, 0xe7, 0x63, 0x76, 0xd4, 0x79, 0xd4, 0xee, 0x8c, 0xa2, 0xd2, 0x9f, 0xdb, 0x08, + 0x00, 0x6f, 0x87, 0x3c, 0x65, 0x94, 0x75, 0xa2, 0x67, 0x22, 0xf1, 0xf3, 0x29, 0xa9, 0xec, 0x0f, + 0xf4, 0x2e, 0x1f, 0xc7, 0xb3, 0x1c, 0x8e, 0x0b, 0x07, 0xe2, 0x2c, 0x75, 0x48, 0xcf, 0x3c, 0x11, + 0x26, 0x98, 0xa4, 0x95, 0xb9, 0x70, 0x2b, 0x2e, 0x1c, 0x51, 0x00, 0xf2, 0x6b, 0xe6, 0x1e, 0x6e, + 0x98, 0x85, 0x8c, 0xfb, 0xec, 0xf2, 0xd7, 0x30, 0x0b, 0x12, 0x7a, 0xf9, 0x24, 0x4c, 0xfa, 0xd1, + 0x7e, 0x3e, 0x2f, 0x41, 0xa1, 0x64, 0x61, 0xcd, 0xc1, 0x4b, 0x96, 0xb9, 0x43, 0x6b, 0x24, 0xee, + 0x1d, 0xfa, 0x1b, 0xc2, 0x2e, 0x1e, 0x7e, 0x14, 0x9e, 0xde, 0xc2, 0x22, 0xb0, 0xa4, 0x8b, 0x90, + 0x92, 0xb7, 0x08, 0x89, 0xde, 0x2c, 0xe4, 0xf2, 0x21, 0x5a, 0x4a, 0xfa, 0x4d, 0xed, 0xd3, 0x12, + 0xe4, 0x4a, 0x1d, 0xd3, 0xc0, 0xe1, 0x23, 0x4c, 0x03, 0xcf, 0xca, 0xf4, 0xdf, 0x89, 0x40, 0xcf, + 0x94, 0x44, 0x6d, 0x8d, 0x40, 0x00, 0x6e, 0xd9, 0x82, 0xb2, 0x15, 0x1b, 0xa4, 0x62, 0x49, 0xa7, + 0x2f, 0xd0, 0x6f, 0x48, 0x30, 0x45, 0xe3, 0xe2, 0x14, 0x3b, 0x1d, 0xf4, 0x98, 0x40, 0xa8, 0x7d, + 0x22, 0x26, 0xa1, 0xdf, 0x15, 0x76, 0xd1, 0xf7, 0x6b, 0xe5, 0xd3, 0x4e, 0x10, 0x20, 0x28, 0x99, + 0xc7, 0xb8, 0xd8, 0x5e, 0xda, 0x40, 0x86, 0xd2, 0x17, 0xf5, 0x9f, 0x4b, 0xae, 0x01, 0x60, 0x5c, + 0x58, 0xb7, 0xf0, 0x9e, 0x8e, 0x2f, 0xa2, 0x2b, 0x03, 0x61, 0xef, 0x0f, 0xfa, 0xf1, 0x06, 0xe1, + 0x45, 0x9c, 0x10, 0xc9, 0xc8, 0xad, 0xac, 0xe9, 0x4e, 0x90, 0x89, 0xf5, 0xe2, 0xbd, 0x91, 0x58, + 0x42, 0x64, 0xd4, 0x70, 0x76, 0xc1, 0x35, 0x9b, 0x68, 0x2e, 0xd2, 0x17, 0xec, 0x07, 0x27, 0x60, + 0x72, 0xc3, 0xb0, 0xbb, 0x1d, 0xcd, 0xde, 0x46, 0xdf, 0x93, 0x21, 0x4f, 0x6f, 0x0b, 0x43, 0x3f, + 0xc6, 0xc5, 0x16, 0xf8, 0x99, 0x5d, 0x6c, 0x79, 0x2e, 0x38, 0xf4, 0xa5, 0xff, 0x65, 0xe6, 0xe8, + 0x7d, 0xb2, 0xe8, 0x24, 0xd5, 0x2b, 0x34, 0x74, 0x6d, 0x7c, 0xff, 0xe3, 0xec, 0x5d, 0xbd, 0xe5, + 0xec, 0x5a, 0xfe, 0xd5, 0xd8, 0x4f, 0x10, 0xa3, 0xb2, 0x4e, 0xff, 0x52, 0xfd, 0xdf, 0x91, 0x06, + 0x13, 0x2c, 0x71, 0xdf, 0x76, 0xd2, 0xfe, 0xf3, 0xb7, 0x27, 0x21, 0xaf, 0x59, 0x8e, 0x6e, 0x3b, + 0x6c, 0x83, 0x95, 0xbd, 0xb9, 0xdd, 0x25, 0x7d, 0xda, 0xb0, 0x3a, 0x5e, 0x14, 0x12, 0x3f, 0x01, + 0xfd, 0x9e, 0xd0, 0xfc, 0x31, 0xbe, 0xe6, 0xc9, 0x20, 0xbf, 0x6f, 0x88, 0x35, 0xea, 0xcb, 0xe1, + 0x32, 0xb5, 0xd8, 0x28, 0x37, 0x69, 0xd0, 0x0a, 0x3f, 0x3e, 0x45, 0x1b, 0xbd, 0x53, 0x0e, 0xad, + 0xdf, 0x5d, 0xe2, 0xc6, 0x08, 0x26, 0xc5, 0x60, 0x8c, 0xf0, 0x13, 0x62, 0x76, 0xab, 0xb9, 0x45, + 0x58, 0x59, 0x7c, 0x11, 0xf6, 0x4d, 0xc2, 0xbb, 0x49, 0xbe, 0x28, 0x07, 0xac, 0x01, 0xc6, 0xdd, + 0x26, 0xf4, 0x7e, 0xa1, 0x9d, 0xa1, 0x41, 0x25, 0x1d, 0x22, 0x6c, 0xaf, 0x9f, 0x80, 0x89, 0x65, + 0xad, 0xd3, 0xc1, 0xd6, 0x25, 0x77, 0x48, 0x2a, 0x78, 0x1c, 0xae, 0x69, 0x86, 0xbe, 0x89, 0x6d, + 0x27, 0xbe, 0xb3, 0x7c, 0xb7, 0x70, 0xa4, 0x5a, 0x56, 0xc6, 0x7c, 0x2f, 0xfd, 0x08, 0x99, 0xdf, + 0x0c, 0x59, 0xdd, 0xd8, 0x34, 0x59, 0x97, 0xd9, 0xbb, 0x6a, 0xef, 0xfd, 0x4c, 0xa6, 0x2e, 0x24, + 0xa3, 0x60, 0xb0, 0x5a, 0x41, 0x2e, 0xd2, 0xef, 0x39, 0x7f, 0x27, 0x0b, 0xb3, 0x1e, 0x13, 0x15, + 0xa3, 0x8d, 0x1f, 0x0c, 0x2f, 0xc5, 0xbc, 0x30, 0x2b, 0x7a, 0x1c, 0xac, 0xb7, 0x3e, 0x84, 0x54, + 0x84, 0x48, 0x1b, 0x00, 0x2d, 0xcd, 0xc1, 0x5b, 0xa6, 0xa5, 0xfb, 0xfd, 0xe1, 0x93, 0x93, 0x50, + 0x2b, 0xd1, 0xbf, 0x2f, 0xa9, 0x21, 0x3a, 0xca, 0x9d, 0x30, 0x8d, 0xfd, 0xf3, 0xf7, 0xde, 0x52, + 0x4d, 0x2c, 0x5e, 0xe1, 0xfc, 0xe8, 0xcf, 0x85, 0x4e, 0x9d, 0x89, 0x54, 0x33, 0x19, 0x66, 0xcd, + 0xe1, 0xda, 0xd0, 0x46, 0x75, 0xad, 0xa8, 0xd6, 0x57, 0x8a, 0xab, 0xab, 0x95, 0xea, 0xb2, 0x1f, + 0xf8, 0x45, 0x81, 0xb9, 0xc5, 0xda, 0xb9, 0x6a, 0x28, 0x32, 0x4f, 0x16, 0xad, 0xc3, 0xa4, 0x27, + 0xaf, 0x7e, 0xbe, 0x98, 0x61, 0x99, 0x31, 0x5f, 0xcc, 0x50, 0x92, 0x6b, 0x9c, 0xe9, 0x2d, 0xdf, + 0x41, 0x87, 0x3c, 0xa3, 0x3f, 0xd2, 0x20, 0x47, 0xd6, 0xd4, 0xd1, 0xdb, 0xc9, 0x36, 0x60, 0xb7, + 0xa3, 0xb5, 0x30, 0xda, 0x49, 0x60, 0x8d, 0x7b, 0x57, 0x27, 0x48, 0xfb, 0xae, 0x4e, 0x20, 0x8f, + 0xcc, 0xea, 0x3b, 0xde, 0x6f, 0x1d, 0x5f, 0xa5, 0x59, 0xf8, 0x03, 0x5a, 0xb1, 0xbb, 0x2b, 0x74, + 0xf9, 0x9f, 0xb1, 0x19, 0xa1, 0x92, 0xd1, 0x3c, 0x25, 0xb3, 0x44, 0xc5, 0xf6, 0x61, 0xe2, 0x38, + 0x1a, 0xc3, 0xf5, 0xde, 0x59, 0xc8, 0xd5, 0xbb, 0x1d, 0xdd, 0x41, 0x2f, 0x91, 0x46, 0x82, 0x19, + 0xbd, 0xee, 0x42, 0x1e, 0x78, 0xdd, 0x45, 0xb0, 0xeb, 0x9a, 0x15, 0xd8, 0x75, 0x6d, 0xe0, 0x07, + 0x1d, 0x7e, 0xd7, 0xf5, 0x36, 0x16, 0xbc, 0x8d, 0xee, 0xd9, 0x3e, 0xb6, 0x8f, 0x48, 0x49, 0xb5, + 0xfa, 0x44, 0x05, 0x3c, 0xf3, 0x44, 0x16, 0x9c, 0x0c, 0x20, 0xbf, 0x50, 0x6b, 0x34, 0x6a, 0x6b, + 0x85, 0x23, 0x24, 0xaa, 0x4d, 0x6d, 0x9d, 0x86, 0x8a, 0xa9, 0x54, 0xab, 0x65, 0xb5, 0x20, 0x91, + 0x70, 0x69, 0x95, 0xc6, 0x6a, 0xb9, 0x20, 0xf3, 0xb1, 0xcf, 0x63, 0xcd, 0x6f, 0xbe, 0xec, 0x34, + 0xd5, 0x4b, 0xcc, 0x10, 0x8f, 0xe6, 0x27, 0x7d, 0xe5, 0xfa, 0x75, 0x19, 0x72, 0x6b, 0xd8, 0xda, + 0xc2, 0xe8, 0x67, 0x12, 0x6c, 0xf2, 0x6d, 0xea, 0x96, 0x4d, 0x83, 0xcb, 0x05, 0x9b, 0x7c, 0xe1, + 0x34, 0xe5, 0x3a, 0x98, 0xb5, 0x71, 0xcb, 0x34, 0xda, 0x5e, 0x26, 0xda, 0x1f, 0xf1, 0x89, 0xfc, + 0xbd, 0xf3, 0x02, 0x90, 0x11, 0x46, 0x47, 0xb2, 0x53, 0x97, 0x04, 0x98, 0x7e, 0xa5, 0xa6, 0x0f, + 0xcc, 0xb7, 0x65, 0xf7, 0xa7, 0xee, 0x25, 0xf4, 0x62, 0xe1, 0xdd, 0xd7, 0x9b, 0x20, 0x4f, 0xd4, + 0xd4, 0x1b, 0xa3, 0xfb, 0xf7, 0xc7, 0x2c, 0x8f, 0xb2, 0x00, 0xc7, 0x6c, 0xdc, 0xc1, 0x2d, 0x07, + 0xb7, 0xdd, 0xa6, 0xab, 0x0e, 0xec, 0x14, 0xf6, 0x67, 0x47, 0x7f, 0x1a, 0x06, 0xf0, 0x0e, 0x1e, + 0xc0, 0xeb, 0xfb, 0x88, 0xd2, 0xad, 0x50, 0xb4, 0xad, 0xec, 0x56, 0xa3, 0xde, 0x31, 0xfd, 0x45, + 0x71, 0xef, 0xdd, 0xfd, 0xb6, 0xed, 0xec, 0x74, 0xc8, 0x37, 0x76, 0xc0, 0xc0, 0x7b, 0x57, 0xe6, + 0x61, 0x42, 0x33, 0x2e, 0x91, 0x4f, 0xd9, 0x98, 0x5a, 0x7b, 0x99, 0xd0, 0xcb, 0x7d, 0xe4, 0xef, + 0xe6, 0x90, 0x7f, 0xbc, 0x18, 0xbb, 0xe9, 0x03, 0xff, 0xf3, 0x13, 0x90, 0x5b, 0xd7, 0x6c, 0x07, + 0xa3, 0xff, 0x4b, 0x16, 0x45, 0xfe, 0x7a, 0x98, 0xdb, 0x34, 0x5b, 0xbb, 0x36, 0x6e, 0xf3, 0x8d, + 0xb2, 0x27, 0x75, 0x14, 0x98, 0x2b, 0x37, 0x42, 0xc1, 0x4b, 0x64, 0x64, 0xbd, 0x6d, 0xf8, 0x7d, + 0xe9, 0x24, 0x92, 0xb6, 0xbd, 0xae, 0x59, 0x4e, 0x6d, 0x93, 0xa4, 0xf9, 0x91, 0xb4, 0xc3, 0x89, + 0x1c, 0xf4, 0xf9, 0x18, 0xe8, 0x27, 0xa2, 0xa1, 0x9f, 0x14, 0x80, 0x5e, 0x29, 0xc2, 0xe4, 0xa6, + 0xde, 0xc1, 0xe4, 0x87, 0x29, 0xf2, 0x43, 0xbf, 0x31, 0x89, 0xc8, 0xde, 0x1f, 0x93, 0x96, 0xf4, + 0x0e, 0x56, 0xfd, 0xdf, 0xbc, 0x89, 0x0c, 0x04, 0x13, 0x99, 0x55, 0xea, 0x4f, 0xeb, 0x1a, 0x5e, + 0x86, 0xb6, 0x83, 0xbd, 0xc5, 0x37, 0x83, 0x1d, 0x6e, 0x69, 0x6b, 0x8e, 0x46, 0xc0, 0x98, 0x51, + 0xc9, 0x33, 0xef, 0x17, 0x22, 0xf7, 0xfa, 0x85, 0x3c, 0x5b, 0x4e, 0xd6, 0x23, 0x7a, 0xcc, 0x46, + 0xb4, 0xa8, 0xf3, 0x1e, 0x40, 0xd4, 0x52, 0xf4, 0xdf, 0x5d, 0x60, 0x5a, 0x9a, 0x85, 0x9d, 0xf5, + 0xb0, 0x27, 0x46, 0x4e, 0xe5, 0x13, 0x89, 0x2b, 0x9f, 0x5d, 0xd7, 0x76, 0x30, 0x29, 0xac, 0xe4, + 0x7e, 0x63, 0x2e, 0x5a, 0xfb, 0xd2, 0x83, 0xfe, 0x37, 0x37, 0xea, 0xfe, 0xb7, 0x5f, 0x1d, 0xd3, + 0x6f, 0x86, 0xaf, 0xca, 0x82, 0x5c, 0xda, 0x75, 0x1e, 0xd5, 0xdd, 0xef, 0xf7, 0x85, 0xfd, 0x5c, + 0x58, 0x7f, 0x16, 0x79, 0xd1, 0xfc, 0x98, 0x7a, 0xdf, 0x84, 0x5a, 0x22, 0xe6, 0x4f, 0x13, 0x55, + 0xb7, 0x31, 0xdc, 0x6b, 0x20, 0xfb, 0x0e, 0x96, 0x0f, 0x65, 0x0e, 0x6e, 0x9a, 0x23, 0xda, 0x3f, + 0x85, 0x7a, 0x06, 0xff, 0xdd, 0xeb, 0x78, 0xb2, 0x5c, 0xac, 0x3e, 0xb2, 0xbd, 0x4e, 0x44, 0x39, + 0xa3, 0xd2, 0x17, 0xf4, 0x52, 0x61, 0xb7, 0x73, 0x2a, 0xb6, 0x58, 0x57, 0xc2, 0x64, 0x36, 0x95, + 0xd8, 0x65, 0xa2, 0x31, 0xc5, 0xa6, 0x0f, 0xd8, 0xb7, 0xc2, 0xae, 0x82, 0xc5, 0x03, 0x23, 0x86, + 0x5e, 0x21, 0xbc, 0x1d, 0x45, 0xab, 0x3d, 0x60, 0xbd, 0x30, 0x99, 0xbc, 0xc5, 0x36, 0xab, 0x62, + 0x0b, 0x4e, 0x5f, 0xe2, 0xdf, 0x94, 0x21, 0x4f, 0xb7, 0x20, 0xd1, 0x1b, 0x33, 0x09, 0x6e, 0x61, + 0x77, 0x78, 0x17, 0x42, 0xff, 0x3d, 0xc9, 0x9a, 0x03, 0xe7, 0x6a, 0x98, 0x4d, 0xe4, 0x6a, 0xc8, + 0x9f, 0xe3, 0x14, 0x68, 0x47, 0xb4, 0x8e, 0x29, 0x4f, 0x27, 0x93, 0xb4, 0xb0, 0xbe, 0x0c, 0xa5, + 0x8f, 0xf7, 0x2f, 0xe6, 0x60, 0x86, 0x16, 0x7d, 0x4e, 0x6f, 0x6f, 0x61, 0x07, 0xbd, 0x53, 0xfa, + 0xc1, 0x41, 0x5d, 0xa9, 0xc2, 0xcc, 0x45, 0xc2, 0xf6, 0xaa, 0x76, 0xc9, 0xdc, 0x75, 0xd8, 0xca, + 0xc5, 0x8d, 0xb1, 0xeb, 0x1e, 0xb4, 0x9e, 0xf3, 0xf4, 0x0f, 0x95, 0xfb, 0xdf, 0x95, 0x31, 0x5d, + 0xf0, 0xa7, 0x0e, 0x5c, 0x79, 0x62, 0x64, 0x85, 0x93, 0x94, 0x93, 0x90, 0xdf, 0xd3, 0xf1, 0xc5, + 0x4a, 0x9b, 0x59, 0xb7, 0xec, 0x0d, 0xfd, 0x81, 0xf0, 0xbe, 0x6d, 0x18, 0x6e, 0xc6, 0x4b, 0xba, + 0x5a, 0x28, 0xb6, 0x7b, 0x3b, 0x90, 0xad, 0x31, 0x9c, 0x29, 0xe6, 0x2f, 0xeb, 0x2c, 0x25, 0x50, + 0xc4, 0x28, 0xc3, 0x99, 0x0f, 0xe5, 0x11, 0x7b, 0x62, 0x85, 0x0a, 0x60, 0xc4, 0xf7, 0x78, 0x8a, + 0xc5, 0x97, 0x18, 0x50, 0x74, 0xfa, 0x92, 0x7f, 0x8d, 0x0c, 0x53, 0x75, 0xec, 0x2c, 0xe9, 0xb8, + 0xd3, 0xb6, 0x91, 0x75, 0x70, 0xd3, 0xe8, 0x66, 0xc8, 0x6f, 0x12, 0x62, 0x83, 0xce, 0x2d, 0xb0, + 0x6c, 0xe8, 0x55, 0x92, 0xe8, 0x8e, 0x30, 0x5b, 0x7d, 0xf3, 0xb8, 0x1d, 0x09, 0x4c, 0x62, 0x1e, + 0xbd, 0xf1, 0x25, 0x8f, 0x21, 0xb0, 0xad, 0x0c, 0x33, 0xec, 0x76, 0xbf, 0x62, 0x47, 0xdf, 0x32, + 0xd0, 0xee, 0x08, 0x5a, 0x88, 0x72, 0x0b, 0xe4, 0x34, 0x97, 0x1a, 0xdb, 0x7a, 0x45, 0x7d, 0x3b, + 0x4f, 0x52, 0x9e, 0x4a, 0x33, 0x26, 0x08, 0x23, 0x19, 0x28, 0xb6, 0xc7, 0xf3, 0x18, 0xc3, 0x48, + 0x0e, 0x2c, 0x3c, 0x7d, 0xc4, 0xbe, 0x2c, 0xc3, 0x71, 0xc6, 0xc0, 0x59, 0x6c, 0x39, 0x7a, 0x4b, + 0xeb, 0x50, 0xe4, 0x9e, 0x97, 0x19, 0x05, 0x74, 0x2b, 0x30, 0xbb, 0x17, 0x26, 0xcb, 0x20, 0x3c, + 0xd3, 0x17, 0x42, 0x8e, 0x01, 0x95, 0xff, 0x31, 0x41, 0x38, 0x3e, 0x4e, 0xaa, 0x1c, 0xcd, 0x31, + 0x86, 0xe3, 0x13, 0x66, 0x22, 0x7d, 0x88, 0x5f, 0xc4, 0x42, 0xf3, 0x04, 0xdd, 0xe7, 0x17, 0x84, + 0xb1, 0xdd, 0x80, 0x69, 0x82, 0x25, 0xfd, 0x91, 0x2d, 0x43, 0xc4, 0x28, 0xb1, 0xdf, 0xef, 0xb0, + 0x0b, 0xc3, 0xfc, 0x7f, 0xd5, 0x30, 0x1d, 0x74, 0x0e, 0x20, 0xf8, 0x14, 0xee, 0xa4, 0x33, 0x51, + 0x9d, 0xb4, 0x24, 0xd6, 0x49, 0xbf, 0x41, 0x38, 0x58, 0x4a, 0x7f, 0xb6, 0x0f, 0xae, 0x1e, 0x62, + 0x61, 0x32, 0x06, 0x97, 0x9e, 0xbe, 0x5e, 0xbc, 0x3c, 0xdb, 0x7b, 0x8d, 0xfb, 0x47, 0x46, 0x32, + 0x9f, 0x0a, 0xf7, 0x07, 0x72, 0x4f, 0x7f, 0x70, 0x00, 0x4b, 0xfa, 0x06, 0x38, 0x4a, 0x8b, 0x28, + 0xf9, 0x6c, 0xe5, 0x68, 0x28, 0x88, 0x9e, 0x64, 0xf4, 0xd1, 0x21, 0x94, 0x60, 0xd0, 0x1d, 0xf3, + 0x71, 0x9d, 0x5c, 0x32, 0x63, 0x37, 0xa9, 0x82, 0x1c, 0xde, 0xd5, 0xf4, 0xdf, 0xc8, 0x52, 0x6b, + 0x77, 0x83, 0xdc, 0xe9, 0x86, 0xfe, 0x22, 0x3b, 0x8a, 0x11, 0xe1, 0x1e, 0xc8, 0x12, 0x17, 0x77, + 0x39, 0x72, 0x49, 0x23, 0x28, 0x32, 0xb8, 0x70, 0x0f, 0x3f, 0xe8, 0xac, 0x1c, 0x51, 0xc9, 0x9f, + 0xca, 0x8d, 0x70, 0xf4, 0xbc, 0xd6, 0xba, 0xb0, 0x65, 0x99, 0xbb, 0xe4, 0xf6, 0x2b, 0x93, 0x5d, + 0xa3, 0x45, 0xae, 0x23, 0xe4, 0x3f, 0x28, 0xb7, 0x7a, 0xa6, 0x43, 0x6e, 0x90, 0xe9, 0xb0, 0x72, + 0x84, 0x19, 0x0f, 0xca, 0x13, 0xfd, 0x4e, 0x27, 0x1f, 0xdb, 0xe9, 0xac, 0x1c, 0xf1, 0xba, 0x1d, + 0x65, 0x11, 0x26, 0xdb, 0xfa, 0x1e, 0xd9, 0xaa, 0x26, 0xb3, 0xae, 0x41, 0x47, 0x97, 0x17, 0xf5, + 0x3d, 0xba, 0xb1, 0xbd, 0x72, 0x44, 0xf5, 0xff, 0x54, 0x96, 0x61, 0x8a, 0x6c, 0x0b, 0x10, 0x32, + 0x93, 0x89, 0x8e, 0x25, 0xaf, 0x1c, 0x51, 0x83, 0x7f, 0x5d, 0xeb, 0x23, 0x4b, 0xce, 0x7e, 0xdc, + 0xed, 0x6d, 0xb7, 0x67, 0x12, 0x6d, 0xb7, 0xbb, 0xb2, 0xa0, 0x1b, 0xee, 0x27, 0x21, 0xd7, 0x22, + 0x12, 0x96, 0x98, 0x84, 0xe9, 0xab, 0x72, 0x07, 0x64, 0x77, 0x34, 0xcb, 0x9b, 0x3c, 0x5f, 0x3f, + 0x98, 0xee, 0x9a, 0x66, 0x5d, 0x70, 0x11, 0x74, 0xff, 0x5a, 0x98, 0x80, 0x1c, 0x11, 0x9c, 0xff, + 0x80, 0xde, 0x92, 0xa5, 0x66, 0x48, 0xc9, 0x34, 0xdc, 0x61, 0xbf, 0x61, 0x7a, 0x07, 0x64, 0xfe, + 0x20, 0x33, 0x1a, 0x0b, 0xb2, 0xef, 0xbd, 0xe7, 0x72, 0xe4, 0xbd, 0xe7, 0x3d, 0x17, 0xf0, 0x66, + 0x7b, 0x2f, 0xe0, 0x0d, 0x96, 0x0f, 0x72, 0x83, 0x1d, 0x55, 0xfe, 0x74, 0x08, 0xd3, 0xa5, 0x57, + 0x10, 0xd1, 0x33, 0xf0, 0x8e, 0x6e, 0x84, 0xea, 0xec, 0xbd, 0x26, 0xec, 0x94, 0x92, 0x1a, 0x35, + 0x03, 0xd8, 0x4b, 0xbf, 0x6f, 0xfa, 0xed, 0x2c, 0x9c, 0xa2, 0xd7, 0x3c, 0xef, 0xe1, 0x86, 0xc9, + 0xdf, 0x37, 0x89, 0x3e, 0x35, 0x12, 0xa5, 0xe9, 0x33, 0xe0, 0xc8, 0x7d, 0x07, 0x9c, 0x7d, 0x87, + 0x94, 0xb3, 0x03, 0x0e, 0x29, 0xe7, 0x92, 0xad, 0x1c, 0x7e, 0x20, 0xac, 0x3f, 0xeb, 0xbc, 0xfe, + 0xdc, 0x1e, 0x01, 0x50, 0x3f, 0xb9, 0x8c, 0xc4, 0xbe, 0x79, 0xbb, 0xaf, 0x29, 0x75, 0x4e, 0x53, + 0xee, 0x1e, 0x9e, 0x91, 0xf4, 0xb5, 0xe5, 0xf7, 0xb3, 0x70, 0x59, 0xc0, 0x4c, 0x15, 0x5f, 0x64, + 0x8a, 0xf2, 0xf9, 0x91, 0x28, 0x4a, 0xf2, 0x18, 0x08, 0x69, 0x6b, 0xcc, 0x1f, 0x0b, 0x9f, 0x1d, + 0xea, 0x05, 0xca, 0x97, 0x4d, 0x84, 0xb2, 0x9c, 0x84, 0x3c, 0xed, 0x61, 0x18, 0x34, 0xec, 0x2d, + 0x61, 0x77, 0x23, 0x76, 0xe2, 0x48, 0x94, 0xb7, 0x31, 0xe8, 0x0f, 0x5b, 0xd7, 0x68, 0xec, 0x5a, + 0x46, 0xc5, 0x70, 0x4c, 0xf4, 0x73, 0x23, 0x51, 0x1c, 0xdf, 0x1b, 0x4e, 0x1e, 0xc6, 0x1b, 0x6e, + 0xa8, 0x55, 0x0e, 0xaf, 0x06, 0x87, 0xb2, 0xca, 0x11, 0x51, 0x78, 0xfa, 0xf8, 0xbd, 0x4d, 0x86, + 0x93, 0x6c, 0xb2, 0xb5, 0xc0, 0x5b, 0x88, 0xe8, 0xfe, 0x51, 0x00, 0x79, 0xdc, 0x33, 0x93, 0xd8, + 0x2d, 0x67, 0xe4, 0x85, 0x3f, 0x29, 0x15, 0x7b, 0xbf, 0x03, 0x37, 0x1d, 0xec, 0xe1, 0x70, 0x24, + 0x48, 0x89, 0x5d, 0xeb, 0x90, 0x80, 0x8d, 0xf4, 0x31, 0x7b, 0x81, 0x0c, 0x79, 0x76, 0xbd, 0xff, + 0x46, 0x2a, 0x0e, 0x13, 0x7c, 0x94, 0x67, 0x81, 0x1d, 0xb9, 0xc4, 0x97, 0xdc, 0xa7, 0xb7, 0x17, + 0x77, 0x48, 0xb7, 0xd8, 0x7f, 0x5b, 0x82, 0xe9, 0x3a, 0x76, 0x4a, 0x9a, 0x65, 0xe9, 0xda, 0xd6, + 0xa8, 0x3c, 0xbe, 0x45, 0xbd, 0x87, 0xd1, 0x77, 0x32, 0xa2, 0xe7, 0x69, 0xfc, 0x85, 0x70, 0x8f, + 0xd5, 0x88, 0x58, 0x82, 0x0f, 0x0b, 0x9d, 0x99, 0x19, 0x44, 0x6d, 0x0c, 0x1e, 0xdb, 0x12, 0x4c, + 0x78, 0x67, 0xf1, 0x6e, 0xe6, 0xce, 0x67, 0x6e, 0x3b, 0x3b, 0xde, 0x31, 0x18, 0xf2, 0xbc, 0xff, + 0x0c, 0x18, 0x7a, 0x59, 0x42, 0x47, 0xf9, 0xf8, 0x83, 0x84, 0xc9, 0xda, 0x58, 0x12, 0x77, 0xf8, + 0xc3, 0x3a, 0x3a, 0xf8, 0xbb, 0x13, 0x6c, 0x39, 0x72, 0x55, 0x73, 0xf0, 0x83, 0xe8, 0x0b, 0x32, + 0x4c, 0xd4, 0xb1, 0xe3, 0x8e, 0xb7, 0xdc, 0xe5, 0xa6, 0xc3, 0x6a, 0xb8, 0x12, 0x5a, 0xf1, 0x98, + 0x62, 0x6b, 0x18, 0xf7, 0xc2, 0x54, 0xd7, 0x32, 0x5b, 0xd8, 0xb6, 0xd9, 0xea, 0x45, 0xd8, 0x51, + 0xad, 0xdf, 0xe8, 0x4f, 0x58, 0x9b, 0x5f, 0xf7, 0xfe, 0x51, 0x83, 0xdf, 0x93, 0x9a, 0x01, 0x94, + 0x12, 0xab, 0xe0, 0xb8, 0xcd, 0x80, 0xb8, 0xc2, 0xd3, 0x07, 0xfa, 0xb3, 0x32, 0xcc, 0xd4, 0xb1, + 0xe3, 0x4b, 0x31, 0xc1, 0x26, 0x47, 0x34, 0xbc, 0x1c, 0x94, 0xf2, 0xc1, 0xa0, 0x14, 0xbf, 0x1a, + 0x90, 0x97, 0xa6, 0x4f, 0x6c, 0x8c, 0x57, 0x03, 0x8a, 0x71, 0x30, 0x86, 0xe3, 0x6b, 0x8f, 0x85, + 0x29, 0xc2, 0x0b, 0x69, 0xb0, 0xbf, 0x9c, 0x0d, 0x1a, 0xef, 0x17, 0x53, 0x6a, 0xbc, 0x77, 0x42, + 0x6e, 0x47, 0xb3, 0x2e, 0xd8, 0xa4, 0xe1, 0x4e, 0x8b, 0x98, 0xed, 0x6b, 0x6e, 0x76, 0x95, 0xfe, + 0xd5, 0xdf, 0x4f, 0x33, 0x97, 0xcc, 0x4f, 0xf3, 0x61, 0x29, 0xd1, 0x48, 0x48, 0xe7, 0x0e, 0x23, + 0x6c, 0xf2, 0x09, 0xc6, 0xcd, 0x98, 0xb2, 0xd3, 0x57, 0x8e, 0xe7, 0xc9, 0x30, 0xe9, 0x8e, 0xdb, + 0xc4, 0x1e, 0x3f, 0x77, 0x70, 0x75, 0xe8, 0x6f, 0xe8, 0x27, 0xec, 0x81, 0x3d, 0x89, 0x8c, 0xce, + 0xbc, 0x4f, 0xd0, 0x03, 0xc7, 0x15, 0x9e, 0x3e, 0x1e, 0xef, 0xa0, 0x78, 0x90, 0xf6, 0x80, 0x5e, + 0x27, 0x83, 0xbc, 0x8c, 0x9d, 0x71, 0x5b, 0x91, 0x6f, 0x15, 0x0e, 0x71, 0xc4, 0x09, 0x8c, 0xf0, + 0x3c, 0xbf, 0x8c, 0x47, 0xd3, 0x80, 0xc4, 0x62, 0x1b, 0x09, 0x31, 0x90, 0x3e, 0x6a, 0xef, 0xa1, + 0xa8, 0xd1, 0xcd, 0x85, 0x9f, 0x1d, 0x41, 0xaf, 0x3a, 0xde, 0x85, 0x0f, 0x4f, 0x80, 0x84, 0xc6, + 0x61, 0xb5, 0xb7, 0x7e, 0x85, 0x8f, 0xe5, 0x2a, 0x3e, 0x70, 0x1b, 0xfb, 0x36, 0x6e, 0x5d, 0xc0, + 0x6d, 0xf4, 0x53, 0x07, 0x87, 0xee, 0x14, 0x4c, 0xb4, 0x28, 0x35, 0x02, 0xde, 0xa4, 0xea, 0xbd, + 0x26, 0xb8, 0x57, 0x9a, 0xef, 0x88, 0xe8, 0xef, 0x63, 0xbc, 0x57, 0x5a, 0xa0, 0xf8, 0x31, 0x98, + 0x2d, 0x74, 0x96, 0x51, 0x69, 0x99, 0x06, 0xfa, 0x2f, 0x07, 0x87, 0xe5, 0x2a, 0x98, 0xd2, 0x5b, + 0xa6, 0x41, 0xc2, 0x50, 0x78, 0x87, 0x80, 0xfc, 0x04, 0xef, 0x6b, 0x79, 0xc7, 0x7c, 0x40, 0x67, + 0xbb, 0xe6, 0x41, 0xc2, 0xb0, 0xc6, 0x84, 0xcb, 0xfa, 0x61, 0x19, 0x13, 0x7d, 0xca, 0x4e, 0x1f, + 0xb2, 0x8f, 0x06, 0xde, 0x6d, 0xb4, 0x2b, 0x7c, 0x54, 0xac, 0x02, 0x0f, 0x33, 0x9c, 0x85, 0x6b, + 0x71, 0x28, 0xc3, 0x59, 0x0c, 0x03, 0x63, 0xb8, 0xb1, 0x22, 0xc0, 0x31, 0xf5, 0x35, 0xe0, 0x03, + 0xa0, 0x33, 0x3a, 0xf3, 0x70, 0x48, 0x74, 0x0e, 0xc7, 0x44, 0x7c, 0x3f, 0x0b, 0x91, 0xc9, 0x2c, + 0x1e, 0xf4, 0x5f, 0x47, 0x01, 0xce, 0xed, 0xc3, 0xf8, 0x2b, 0x50, 0x6f, 0x85, 0x04, 0x37, 0x62, + 0xef, 0x93, 0xa0, 0x4b, 0x65, 0x8c, 0x77, 0xc5, 0x8b, 0x94, 0x9f, 0x3e, 0x80, 0xcf, 0x95, 0x61, + 0x8e, 0xf8, 0x08, 0x74, 0xb0, 0x66, 0xd1, 0x8e, 0x72, 0x24, 0x8e, 0xf2, 0xef, 0x10, 0x0e, 0xf0, + 0xc3, 0xcb, 0x21, 0xe0, 0x63, 0x24, 0x50, 0x88, 0x45, 0xf7, 0x11, 0x64, 0x61, 0x2c, 0xdb, 0x28, + 0x05, 0x9f, 0x05, 0xa6, 0xe2, 0xa3, 0xc1, 0x23, 0xa1, 0x47, 0x2e, 0x2f, 0x0c, 0xaf, 0xb1, 0x8d, + 0xd9, 0x23, 0x57, 0x84, 0x89, 0xf4, 0x31, 0x79, 0xdd, 0x2d, 0x6c, 0xc1, 0xb9, 0x41, 0x2e, 0x8c, + 0x7f, 0x45, 0xd6, 0x3f, 0xd1, 0xf6, 0xd9, 0x91, 0x78, 0x60, 0x1e, 0x20, 0x20, 0xbe, 0x02, 0x59, + 0xcb, 0xbc, 0x48, 0x97, 0xb6, 0x66, 0x55, 0xf2, 0x4c, 0xaf, 0xa7, 0xec, 0xec, 0xee, 0x18, 0xf4, + 0x64, 0xe8, 0xac, 0xea, 0xbd, 0x2a, 0xd7, 0xc1, 0xec, 0x45, 0xdd, 0xd9, 0x5e, 0xc1, 0x5a, 0x1b, + 0x5b, 0xaa, 0x79, 0x91, 0x78, 0xcc, 0x4d, 0xaa, 0x7c, 0x22, 0xef, 0xbf, 0x22, 0x60, 0x5f, 0x92, + 0x5b, 0xe4, 0xc7, 0x72, 0xfc, 0x2d, 0x89, 0xe5, 0x19, 0xcd, 0x55, 0xfa, 0x0a, 0xf3, 0x5e, 0x19, + 0xa6, 0x54, 0xf3, 0x22, 0x53, 0x92, 0xff, 0xe3, 0x70, 0x75, 0x24, 0xf1, 0x44, 0x8f, 0x48, 0xce, + 0x67, 0x7f, 0xec, 0x13, 0xbd, 0xd8, 0xe2, 0xc7, 0x72, 0x72, 0x69, 0x46, 0x35, 0x2f, 0xd6, 0xb1, + 0x43, 0x5b, 0x04, 0x6a, 0x8e, 0xc8, 0xc9, 0x5a, 0xb7, 0x29, 0x41, 0x36, 0x0f, 0xf7, 0xdf, 0x93, + 0xee, 0x22, 0xf8, 0x02, 0xf2, 0x59, 0x1c, 0xf7, 0x2e, 0xc2, 0x40, 0x0e, 0xc6, 0x10, 0x23, 0x45, + 0x86, 0x69, 0xd5, 0xbc, 0xe8, 0x0e, 0x0d, 0x4b, 0x7a, 0xa7, 0x33, 0x9a, 0x11, 0x32, 0xa9, 0xf1, + 0xef, 0x89, 0xc1, 0xe3, 0x62, 0xec, 0xc6, 0xff, 0x00, 0x06, 0xd2, 0x87, 0xe1, 0xd9, 0xb4, 0xb1, + 0x78, 0x23, 0xb4, 0x31, 0x1a, 0x1c, 0x86, 0x6d, 0x10, 0x3e, 0x1b, 0x87, 0xd6, 0x20, 0xa2, 0x38, + 0x18, 0xcb, 0xce, 0xc9, 0x5c, 0x89, 0x0c, 0xf3, 0xa3, 0x6d, 0x13, 0xef, 0x4a, 0xe6, 0x9a, 0xc8, + 0x86, 0x5d, 0x8e, 0x91, 0x91, 0xa0, 0x91, 0xc0, 0x05, 0x51, 0x80, 0x87, 0xf4, 0xf1, 0xf8, 0x90, + 0x0c, 0x33, 0x94, 0x85, 0x47, 0x89, 0x15, 0x30, 0x54, 0xa3, 0x0a, 0xd7, 0xe0, 0x70, 0x1a, 0x55, + 0x0c, 0x07, 0x63, 0xb9, 0x15, 0xd4, 0xb5, 0xe3, 0x86, 0x38, 0x3e, 0x1e, 0x85, 0xe0, 0xd0, 0xc6, + 0xd8, 0x08, 0x8f, 0x90, 0x0f, 0x63, 0x8c, 0x1d, 0xd2, 0x31, 0xf2, 0x67, 0xfb, 0xad, 0x68, 0x94, + 0x18, 0x1c, 0xa0, 0x29, 0x8c, 0x10, 0x86, 0x21, 0x9b, 0xc2, 0x21, 0x21, 0xf1, 0x15, 0x19, 0x80, + 0x32, 0xb0, 0x66, 0xee, 0x91, 0xcb, 0x7c, 0x46, 0xd0, 0x9d, 0xf5, 0xba, 0xd5, 0xcb, 0x03, 0xdc, + 0xea, 0x13, 0x86, 0x70, 0x49, 0xba, 0x12, 0x18, 0x92, 0xb2, 0x5b, 0xc9, 0xb1, 0xaf, 0x04, 0xc6, + 0x97, 0x9f, 0x3e, 0xc6, 0x8f, 0x50, 0x6b, 0x2e, 0x38, 0x60, 0xfa, 0x9b, 0x23, 0x41, 0x39, 0x34, + 0xfb, 0x97, 0xf9, 0xd9, 0xff, 0x01, 0xb0, 0x1d, 0xd6, 0x46, 0x1c, 0x74, 0x70, 0x34, 0x7d, 0x1b, + 0xf1, 0xf0, 0x0e, 0x88, 0xfe, 0x6c, 0x16, 0x8e, 0xb2, 0x4e, 0xe4, 0x07, 0x01, 0xe2, 0x84, 0xe7, + 0xf0, 0xb8, 0x4e, 0x72, 0x00, 0xca, 0xa3, 0x5a, 0x90, 0x4a, 0xb2, 0x94, 0x29, 0xc0, 0xde, 0x58, + 0x56, 0x37, 0xf2, 0xe5, 0x07, 0xbb, 0x9a, 0xd1, 0x16, 0x0f, 0xf7, 0x3b, 0x00, 0x78, 0x6f, 0xad, + 0x51, 0xe6, 0xd7, 0x1a, 0xfb, 0xac, 0x4c, 0x26, 0xde, 0xb9, 0x26, 0x22, 0xa3, 0xec, 0x8e, 0x7d, + 0xe7, 0x3a, 0xba, 0xec, 0xf4, 0x51, 0x7a, 0x97, 0x0c, 0xd9, 0xba, 0x69, 0x39, 0xe8, 0x39, 0x49, + 0x5a, 0x27, 0x95, 0x7c, 0x00, 0x92, 0xf7, 0xae, 0x94, 0xb8, 0x5b, 0x9a, 0x6f, 0x8e, 0x3f, 0xea, + 0xac, 0x39, 0x1a, 0xf1, 0xea, 0x76, 0xcb, 0x0f, 0x5d, 0xd7, 0x9c, 0x34, 0x9e, 0x0e, 0x95, 0x5f, + 0x3d, 0xfa, 0x00, 0x46, 0x6a, 0xf1, 0x74, 0x22, 0x4b, 0x4e, 0x1f, 0xb7, 0x57, 0x1f, 0x65, 0xbe, + 0xad, 0x4b, 0x7a, 0x07, 0xa3, 0xe7, 0x50, 0x97, 0x91, 0xaa, 0xb6, 0x83, 0xc5, 0x8f, 0xc4, 0xc4, + 0xba, 0xb6, 0x92, 0xf8, 0xb2, 0x72, 0x10, 0x5f, 0x36, 0x69, 0x83, 0xa2, 0x07, 0xd0, 0x29, 0x4b, + 0xe3, 0x6e, 0x50, 0x31, 0x65, 0x8f, 0x25, 0x4e, 0xe7, 0xb1, 0x3a, 0x76, 0xa8, 0x51, 0x59, 0xf3, + 0x6e, 0x60, 0xf9, 0xe9, 0x91, 0x44, 0xec, 0xf4, 0x2f, 0x78, 0x91, 0x7b, 0x2e, 0x78, 0x79, 0x6f, + 0x18, 0x9c, 0x35, 0x1e, 0x9c, 0x1f, 0x8f, 0x16, 0x10, 0xcf, 0xe4, 0x48, 0x60, 0x7a, 0xab, 0x0f, + 0xd3, 0x3a, 0x07, 0xd3, 0x1d, 0x43, 0x72, 0x91, 0x3e, 0x60, 0xbf, 0x92, 0x83, 0xa3, 0x74, 0xd2, + 0x5f, 0x34, 0xda, 0x2c, 0xc2, 0xea, 0x1b, 0xa5, 0x43, 0xde, 0x6c, 0xdb, 0x1f, 0x82, 0x95, 0x8b, + 0xe5, 0x9c, 0xeb, 0xbd, 0x1d, 0x7f, 0x81, 0x86, 0x73, 0x75, 0x3b, 0x51, 0xb2, 0xd3, 0x26, 0x7e, + 0x43, 0xbe, 0xff, 0x1f, 0x7f, 0x97, 0xd1, 0x84, 0xf8, 0x5d, 0x46, 0x7f, 0x92, 0x6c, 0xdd, 0x8e, + 0x14, 0xdd, 0x23, 0xf0, 0x94, 0x6d, 0xa7, 0x04, 0x2b, 0x7a, 0x02, 0xdc, 0xfd, 0x70, 0xb8, 0x93, + 0x05, 0x11, 0x44, 0x86, 0x74, 0x27, 0x23, 0x04, 0x0e, 0xd3, 0x9d, 0x6c, 0x10, 0x03, 0x63, 0xb8, + 0xd5, 0x3e, 0xc7, 0x76, 0xf3, 0x49, 0xbb, 0x41, 0x7f, 0x25, 0xa5, 0x3e, 0x4a, 0x7f, 0x37, 0x93, + 0xc8, 0xff, 0x99, 0xf0, 0x15, 0x3f, 0x4c, 0x27, 0xf1, 0x68, 0x8e, 0x23, 0x37, 0x86, 0x75, 0x23, + 0x89, 0xf8, 0xa2, 0x9f, 0xd3, 0xdb, 0xce, 0xf6, 0x88, 0x4e, 0x74, 0x5c, 0x74, 0x69, 0x79, 0xd7, + 0x23, 0x93, 0x17, 0xf4, 0x6f, 0x99, 0x44, 0x21, 0xa4, 0x7c, 0x91, 0x10, 0xb6, 0x22, 0x44, 0x9c, + 0x20, 0xf0, 0x53, 0x2c, 0xbd, 0x31, 0x6a, 0xf4, 0x59, 0xbd, 0x8d, 0xcd, 0x47, 0xa1, 0x46, 0x13, + 0xbe, 0x46, 0xa7, 0xd1, 0x71, 0xe4, 0x7e, 0x48, 0x35, 0xda, 0x17, 0xc9, 0x88, 0x34, 0x3a, 0x96, + 0x5e, 0xfa, 0x32, 0x7e, 0xd9, 0x0c, 0x9b, 0x48, 0xad, 0xea, 0xc6, 0x05, 0xf4, 0xcf, 0x79, 0xef, + 0x62, 0xe6, 0x73, 0xba, 0xb3, 0xcd, 0x62, 0xc1, 0xfc, 0xbe, 0xf0, 0xdd, 0x28, 0x43, 0xc4, 0x7b, + 0xe1, 0xc3, 0x49, 0xe5, 0xf6, 0x85, 0x93, 0x2a, 0xc2, 0xac, 0x6e, 0x38, 0xd8, 0x32, 0xb4, 0xce, + 0x52, 0x47, 0xdb, 0xb2, 0x4f, 0x4d, 0xf4, 0xbd, 0xbc, 0xae, 0x12, 0xca, 0xa3, 0xf2, 0x7f, 0x84, + 0xaf, 0xaf, 0x9c, 0xe4, 0xaf, 0xaf, 0x8c, 0x88, 0x7e, 0x35, 0x15, 0x1d, 0xfd, 0xca, 0x8f, 0x6e, + 0x05, 0x83, 0x83, 0x63, 0x8b, 0xda, 0xc6, 0x09, 0xc3, 0xfd, 0xdd, 0x2c, 0x18, 0x85, 0xcd, 0x0f, + 0xfd, 0xf8, 0x4a, 0x39, 0xd1, 0xea, 0x9e, 0xab, 0x08, 0xf3, 0xbd, 0x4a, 0x90, 0xd8, 0x42, 0x0d, + 0x57, 0x5e, 0xee, 0xa9, 0xbc, 0x6f, 0xf2, 0x64, 0x05, 0x4c, 0x9e, 0xb0, 0x52, 0xe5, 0xc4, 0x94, + 0x2a, 0xc9, 0x62, 0xa1, 0x48, 0x6d, 0xc7, 0x70, 0x1a, 0x29, 0x07, 0xc7, 0xbc, 0x68, 0xb7, 0xdd, + 0x2e, 0xd6, 0x2c, 0xcd, 0x68, 0x61, 0xf4, 0x51, 0x69, 0x14, 0x66, 0xef, 0x12, 0x4c, 0xea, 0x2d, + 0xd3, 0xa8, 0xeb, 0xcf, 0xf0, 0x2e, 0x97, 0x8b, 0x0f, 0xb2, 0x4e, 0x24, 0x52, 0x61, 0x7f, 0xa8, + 0xfe, 0xbf, 0x4a, 0x05, 0xa6, 0x5a, 0x9a, 0xd5, 0xa6, 0x41, 0xf8, 0x72, 0x3d, 0x17, 0x39, 0x45, + 0x12, 0x2a, 0x79, 0xbf, 0xa8, 0xc1, 0xdf, 0x4a, 0x8d, 0x17, 0x62, 0xbe, 0x27, 0x9a, 0x47, 0x24, + 0xb1, 0xc5, 0xe0, 0x27, 0x4e, 0xe6, 0xae, 0x74, 0x2c, 0xdc, 0x21, 0x77, 0xd0, 0xd3, 0x1e, 0x62, + 0x4a, 0x0d, 0x12, 0x92, 0x2e, 0x0f, 0x90, 0xa2, 0xf6, 0xa1, 0x31, 0xee, 0xe5, 0x01, 0x21, 0x2e, + 0xd2, 0xd7, 0xcc, 0xb7, 0xe7, 0x61, 0x96, 0xf6, 0x6a, 0x4c, 0x9c, 0xe8, 0xb9, 0xe4, 0x0a, 0x69, + 0xe7, 0x3e, 0x7c, 0x09, 0xd5, 0x0f, 0x3e, 0x26, 0x17, 0x40, 0xbe, 0xe0, 0x07, 0x1c, 0x74, 0x1f, + 0x93, 0xee, 0xdb, 0x7b, 0x7c, 0xcd, 0x53, 0x9e, 0xc6, 0xbd, 0x6f, 0x1f, 0x5f, 0x7c, 0xfa, 0xf8, + 0xfc, 0xaa, 0x0c, 0x72, 0xb1, 0xdd, 0x46, 0xad, 0x83, 0x43, 0x71, 0x0d, 0x4c, 0x7b, 0x6d, 0x26, + 0x88, 0x01, 0x19, 0x4e, 0x4a, 0xba, 0x08, 0xea, 0xcb, 0xa6, 0xd8, 0x1e, 0xfb, 0xae, 0x42, 0x4c, + 0xd9, 0xe9, 0x83, 0xf2, 0x9b, 0x13, 0xac, 0xd1, 0x2c, 0x98, 0xe6, 0x05, 0x72, 0x54, 0xe6, 0x39, + 0x32, 0xe4, 0x96, 0xb0, 0xd3, 0xda, 0x1e, 0x51, 0x9b, 0xd9, 0xb5, 0x3a, 0x5e, 0x9b, 0xd9, 0x77, + 0x1f, 0xfe, 0x60, 0x1b, 0xd6, 0x63, 0x6b, 0x9e, 0xb0, 0x34, 0xee, 0xe8, 0xce, 0xb1, 0xa5, 0xa7, + 0x0f, 0xce, 0xbf, 0xc9, 0x30, 0xe7, 0xaf, 0x70, 0x51, 0x4c, 0x7e, 0x25, 0xf3, 0x68, 0x5b, 0xef, + 0x44, 0x9f, 0x4f, 0x16, 0x22, 0xcd, 0x97, 0x29, 0x5f, 0xb3, 0x94, 0x17, 0x16, 0x13, 0x04, 0x4f, + 0x13, 0x63, 0x70, 0x0c, 0x33, 0x78, 0x19, 0x26, 0x09, 0x43, 0x8b, 0xfa, 0x1e, 0x71, 0x1d, 0xe4, + 0x16, 0x1a, 0x9f, 0x39, 0x92, 0x85, 0xc6, 0x3b, 0xf8, 0x85, 0x46, 0xc1, 0x88, 0xc7, 0xde, 0x3a, + 0x63, 0x42, 0x5f, 0x1a, 0xf7, 0xff, 0x91, 0x2f, 0x33, 0x26, 0xf0, 0xa5, 0x19, 0x50, 0x7e, 0xfa, + 0x88, 0xbe, 0xf2, 0x3f, 0xb1, 0xce, 0xd6, 0xdb, 0x50, 0x45, 0xff, 0xf3, 0x18, 0x64, 0xcf, 0xba, + 0x0f, 0xff, 0x3b, 0xb8, 0x11, 0xeb, 0xc5, 0x23, 0x08, 0xce, 0x70, 0x17, 0x64, 0x5d, 0xfa, 0x6c, + 0xda, 0x72, 0xa3, 0xd8, 0xee, 0xae, 0xcb, 0x88, 0x4a, 0xfe, 0x53, 0x4e, 0x42, 0xde, 0x36, 0x77, + 0xad, 0x96, 0x6b, 0x3e, 0xbb, 0x1a, 0xc3, 0xde, 0x92, 0x06, 0x25, 0xe5, 0x48, 0xcf, 0x8f, 0xce, + 0x65, 0x34, 0x74, 0x41, 0x92, 0xcc, 0x5d, 0x90, 0x94, 0x60, 0xff, 0x40, 0x80, 0xb7, 0xf4, 0x35, + 0xe2, 0xaf, 0xc8, 0x5d, 0x81, 0xed, 0x51, 0xc1, 0x1e, 0x21, 0x96, 0x83, 0xaa, 0x43, 0x52, 0x87, + 0x6f, 0x5e, 0xb4, 0x7e, 0x1c, 0xf8, 0xb1, 0x3a, 0x7c, 0x0b, 0xf0, 0x30, 0x96, 0x53, 0xea, 0x79, + 0xe6, 0xa4, 0x7a, 0xff, 0x28, 0xd1, 0xcd, 0x72, 0x4a, 0x7f, 0x20, 0x74, 0x46, 0xe8, 0xbc, 0x3a, + 0x34, 0x3a, 0x87, 0xe4, 0xbe, 0xfa, 0x87, 0x32, 0x89, 0x84, 0xe9, 0x19, 0x39, 0xe2, 0x17, 0x1d, + 0x25, 0x86, 0xc8, 0x1d, 0x83, 0xb9, 0x38, 0xd0, 0xb3, 0xc3, 0x87, 0x06, 0xe7, 0x45, 0x17, 0xe2, + 0x7f, 0xdc, 0xa1, 0xc1, 0x45, 0x19, 0x49, 0x1f, 0xc8, 0xd7, 0xd2, 0x8b, 0xc5, 0x8a, 0x2d, 0x47, + 0xdf, 0x1b, 0x71, 0x4b, 0xe3, 0x87, 0x97, 0x84, 0xd1, 0x80, 0xf7, 0x49, 0x88, 0x72, 0x38, 0xee, + 0x68, 0xc0, 0x62, 0x6c, 0xa4, 0x0f, 0xd3, 0xdf, 0xe6, 0x5d, 0xe9, 0xb1, 0xb5, 0x99, 0xd7, 0xb1, + 0xd5, 0x00, 0x7c, 0x70, 0xb4, 0xce, 0xc0, 0x4c, 0x68, 0xea, 0xef, 0x5d, 0x58, 0xc3, 0xa5, 0x25, + 0x3d, 0xe8, 0xee, 0x8b, 0x6c, 0xe4, 0x0b, 0x03, 0x09, 0x16, 0x7c, 0x45, 0x98, 0x18, 0xcb, 0x7d, + 0x70, 0xde, 0x18, 0x36, 0x26, 0xac, 0x7e, 0x3f, 0x8c, 0x55, 0x8d, 0xc7, 0xea, 0x36, 0x11, 0x31, + 0x89, 0x8d, 0x69, 0x42, 0xf3, 0xc6, 0xb7, 0xf9, 0x70, 0xa9, 0x1c, 0x5c, 0x77, 0x0d, 0xcd, 0x47, + 0xfa, 0x88, 0xbd, 0x84, 0x76, 0x87, 0x75, 0x6a, 0xb2, 0x8f, 0xa6, 0x3b, 0x64, 0xb3, 0x01, 0x99, + 0x9b, 0x0d, 0x24, 0xf4, 0xb7, 0x0f, 0xdc, 0x48, 0x3d, 0xe6, 0x06, 0x41, 0x94, 0x1d, 0xb1, 0xbf, + 0xfd, 0x40, 0x0e, 0xd2, 0x07, 0xe7, 0x1f, 0x65, 0x80, 0x65, 0xcb, 0xdc, 0xed, 0xd6, 0xac, 0x36, + 0xb6, 0xd0, 0xdf, 0x04, 0x13, 0x80, 0x17, 0x8e, 0x60, 0x02, 0xb0, 0x0e, 0xb0, 0xe5, 0x13, 0x67, + 0x1a, 0x7e, 0x8b, 0x98, 0xb9, 0x1f, 0x30, 0xa5, 0x86, 0x68, 0xf0, 0x57, 0xce, 0xfe, 0x04, 0x8f, + 0x71, 0x5c, 0x9f, 0x15, 0x90, 0x1b, 0xe5, 0x04, 0xe0, 0x1d, 0x3e, 0xd6, 0x0d, 0x0e, 0xeb, 0x7b, + 0x0e, 0xc0, 0x49, 0xfa, 0x98, 0xff, 0xd3, 0x04, 0x4c, 0xd3, 0xed, 0x3a, 0x2a, 0xd3, 0xbf, 0x0f, + 0x40, 0xff, 0xcd, 0x11, 0x80, 0xbe, 0x01, 0x33, 0x66, 0x40, 0x9d, 0xf6, 0xa9, 0xe1, 0x05, 0x98, + 0x58, 0xd8, 0x43, 0x7c, 0xa9, 0x1c, 0x19, 0xf4, 0xe1, 0x30, 0xf2, 0x2a, 0x8f, 0xfc, 0x1d, 0x31, + 0xf2, 0x0e, 0x51, 0x1c, 0x25, 0xf4, 0xef, 0xf4, 0xa1, 0xdf, 0xe0, 0xa0, 0x2f, 0x1e, 0x84, 0x95, + 0x31, 0x84, 0xdb, 0x97, 0x21, 0x4b, 0x4e, 0xc7, 0xfd, 0x76, 0x8a, 0xf3, 0xfb, 0x53, 0x30, 0x41, + 0x9a, 0xac, 0x3f, 0xef, 0xf0, 0x5e, 0xdd, 0x2f, 0xda, 0xa6, 0x83, 0x2d, 0xdf, 0x63, 0xc1, 0x7b, + 0x75, 0x79, 0xf0, 0xbc, 0x92, 0xed, 0x53, 0x79, 0xba, 0x11, 0xe9, 0x27, 0x0c, 0x3d, 0x29, 0x09, + 0x4b, 0x7c, 0x64, 0xe7, 0xe5, 0x86, 0x99, 0x94, 0x0c, 0x60, 0x24, 0x7d, 0xe0, 0xff, 0x22, 0x0b, + 0xa7, 0xe8, 0xaa, 0xd2, 0x92, 0x65, 0xee, 0xf4, 0xdc, 0x6e, 0xa5, 0x1f, 0x5c, 0x17, 0xae, 0x87, + 0x39, 0x87, 0xf3, 0xc7, 0x66, 0x3a, 0xd1, 0x93, 0x8a, 0xfe, 0x34, 0xec, 0x53, 0xf1, 0x74, 0x1e, + 0xc9, 0x85, 0x18, 0x01, 0x46, 0xf1, 0x9e, 0x78, 0xa1, 0x5e, 0x90, 0xd1, 0xd0, 0x22, 0x95, 0x3c, + 0xd4, 0x9a, 0xa5, 0xaf, 0x53, 0x39, 0x11, 0x9d, 0x7a, 0x9f, 0xaf, 0x53, 0x3f, 0xc5, 0xe9, 0xd4, + 0xf2, 0xc1, 0x45, 0x92, 0xbe, 0x6e, 0xbd, 0xc2, 0xdf, 0x18, 0xf2, 0xb7, 0xed, 0x76, 0x52, 0xd8, + 0xac, 0x0b, 0xfb, 0x23, 0x65, 0x39, 0x7f, 0x24, 0xfe, 0x3e, 0x8a, 0x04, 0x33, 0x61, 0x9e, 0xeb, + 0x08, 0x5d, 0x9a, 0x03, 0x49, 0xf7, 0xb8, 0x93, 0xf4, 0xf6, 0x50, 0x73, 0xdd, 0xd8, 0x82, 0xc6, + 0xb0, 0xb6, 0x34, 0x07, 0xf9, 0x25, 0xbd, 0xe3, 0x60, 0x0b, 0x3d, 0xc2, 0x66, 0xba, 0xaf, 0x48, + 0x71, 0x00, 0x58, 0x84, 0xfc, 0x26, 0x29, 0x8d, 0x99, 0xcc, 0x37, 0x89, 0xb5, 0x1e, 0xca, 0xa1, + 0xca, 0xfe, 0x4d, 0x1a, 0x9d, 0xaf, 0x87, 0xcc, 0xc8, 0xa6, 0xc8, 0x09, 0xa2, 0xf3, 0x0d, 0x66, + 0x61, 0x2c, 0x17, 0x53, 0xe5, 0x55, 0xbc, 0xe3, 0x8e, 0xf1, 0x17, 0xd2, 0x43, 0xb8, 0x00, 0xb2, + 0xde, 0xb6, 0x49, 0xe7, 0x38, 0xa5, 0xba, 0x8f, 0x49, 0x7d, 0x85, 0x7a, 0x45, 0x45, 0x59, 0x1e, + 0xb7, 0xaf, 0x90, 0x10, 0x17, 0xe9, 0x63, 0xf6, 0x5d, 0xe2, 0x28, 0xda, 0xed, 0x68, 0x2d, 0xec, + 0x72, 0x9f, 0x1a, 0x6a, 0xb4, 0x27, 0xcb, 0x7a, 0x3d, 0x59, 0xa8, 0x9d, 0xe6, 0x0e, 0xd0, 0x4e, + 0x87, 0x5d, 0x86, 0xf4, 0x65, 0x4e, 0x2a, 0x7e, 0x68, 0xcb, 0x90, 0xb1, 0x6c, 0x8c, 0xe1, 0xda, + 0x51, 0xef, 0x20, 0xed, 0x58, 0x5b, 0xeb, 0xb0, 0x9b, 0x34, 0x4c, 0x58, 0x23, 0x3b, 0x34, 0x3b, + 0xcc, 0x26, 0x4d, 0x34, 0x0f, 0x63, 0x40, 0x6b, 0x8e, 0xa1, 0xf5, 0x39, 0x36, 0x8c, 0xa6, 0xbc, + 0x4f, 0x6a, 0x9b, 0x96, 0x93, 0x6c, 0x9f, 0xd4, 0xe5, 0x4e, 0x25, 0xff, 0x25, 0x3d, 0x78, 0xc5, + 0x9f, 0xab, 0x1e, 0xd5, 0xf0, 0x99, 0xe0, 0xe0, 0xd5, 0x20, 0x06, 0xd2, 0x87, 0xf7, 0xcd, 0x87, + 0x34, 0x78, 0x0e, 0xdb, 0x1c, 0x59, 0x1b, 0x18, 0xd9, 0xd0, 0x39, 0x4c, 0x73, 0x8c, 0xe6, 0x21, + 0x7d, 0xbc, 0xbe, 0x15, 0x1a, 0x38, 0xdf, 0x30, 0xc6, 0x81, 0xd3, 0x6b, 0x99, 0xb9, 0x21, 0x5b, + 0xe6, 0xb0, 0xfb, 0x3f, 0x4c, 0xd6, 0xa3, 0x1b, 0x30, 0x87, 0xd9, 0xff, 0x89, 0x61, 0x22, 0x7d, + 0xc4, 0xdf, 0x28, 0x43, 0xae, 0x3e, 0xfe, 0xf1, 0x72, 0xd8, 0xb9, 0x08, 0x91, 0x55, 0x7d, 0x64, + 0xc3, 0xe5, 0x30, 0x73, 0x91, 0x48, 0x16, 0xc6, 0x10, 0x78, 0xff, 0x28, 0xcc, 0x90, 0x25, 0x11, + 0x6f, 0x9b, 0xf5, 0x5b, 0x6c, 0xd4, 0x7c, 0x38, 0xc5, 0xb6, 0x7a, 0x2f, 0x4c, 0x7a, 0xfb, 0x77, + 0x6c, 0xe4, 0x9c, 0x17, 0x6b, 0x9f, 0x1e, 0x97, 0xaa, 0xff, 0xff, 0x81, 0x9c, 0x21, 0x46, 0xbe, + 0x57, 0x3b, 0xac, 0x33, 0xc4, 0xa1, 0xee, 0xd7, 0xfe, 0x49, 0x30, 0xa2, 0xfe, 0x97, 0xf4, 0x30, + 0xef, 0xdd, 0xc7, 0xcd, 0xf6, 0xd9, 0xc7, 0xfd, 0x68, 0x18, 0xcb, 0x3a, 0x8f, 0xe5, 0x9d, 0xa2, + 0x22, 0x1c, 0xe1, 0x58, 0xfb, 0x2e, 0x1f, 0xce, 0xb3, 0x1c, 0x9c, 0x0b, 0x07, 0xe2, 0x65, 0x0c, + 0x07, 0x1f, 0xb3, 0xc1, 0x98, 0xfb, 0xb1, 0x14, 0xdb, 0x71, 0xcf, 0xa9, 0x8a, 0xec, 0xbe, 0x53, + 0x15, 0x5c, 0x4b, 0xcf, 0x1d, 0xb0, 0xa5, 0x7f, 0x2c, 0xac, 0x1d, 0x0d, 0x5e, 0x3b, 0xee, 0x12, + 0x47, 0x64, 0x74, 0x23, 0xf3, 0xbb, 0x7d, 0xf5, 0x38, 0xc7, 0xa9, 0x47, 0xe9, 0x60, 0xcc, 0xa4, + 0xaf, 0x1f, 0x9f, 0xf0, 0x26, 0xb4, 0x87, 0xdc, 0xde, 0x87, 0xdd, 0x2a, 0xe6, 0x84, 0x38, 0xb2, + 0x91, 0x7b, 0x98, 0xad, 0xe2, 0x41, 0x9c, 0x8c, 0x21, 0x16, 0xdb, 0x2c, 0x4c, 0x13, 0x9e, 0xce, + 0xe9, 0xed, 0x2d, 0xec, 0xa0, 0x57, 0x52, 0x1f, 0x45, 0x2f, 0xf2, 0xe5, 0x88, 0xc2, 0x13, 0x45, + 0x9d, 0x77, 0x4d, 0xea, 0xd1, 0x41, 0x99, 0x9c, 0x0f, 0x31, 0x38, 0xee, 0x08, 0x8a, 0x03, 0x39, + 0x48, 0x1f, 0xb2, 0x0f, 0x53, 0x77, 0x9b, 0x55, 0xed, 0x92, 0xb9, 0xeb, 0xa0, 0x87, 0x46, 0xd0, + 0x41, 0x2f, 0x40, 0xbe, 0x43, 0xa8, 0xb1, 0x63, 0x19, 0xf1, 0xd3, 0x1d, 0x26, 0x02, 0x5a, 0xbe, + 0xca, 0xfe, 0x4c, 0x7a, 0x36, 0x23, 0x90, 0x23, 0xa5, 0x33, 0xee, 0xb3, 0x19, 0x03, 0xca, 0x1f, + 0xcb, 0x1d, 0x3b, 0x93, 0x6e, 0xe9, 0xfa, 0x8e, 0xee, 0x8c, 0x28, 0x82, 0x43, 0xc7, 0xa5, 0xe5, + 0x45, 0x70, 0x20, 0x2f, 0x49, 0x4f, 0x8c, 0x86, 0xa4, 0xe2, 0xfe, 0x3e, 0xee, 0x13, 0xa3, 0xf1, + 0xc5, 0xa7, 0x8f, 0xc9, 0xaf, 0xd3, 0x96, 0x75, 0x96, 0x3a, 0xdf, 0xa6, 0xe8, 0xd7, 0x3b, 0x74, + 0x63, 0xa1, 0xac, 0x1d, 0x5e, 0x63, 0xe9, 0x5b, 0x7e, 0xfa, 0xc0, 0xfc, 0xf7, 0x1f, 0x85, 0xdc, + 0x22, 0x3e, 0xbf, 0xbb, 0x85, 0xee, 0x80, 0xc9, 0x86, 0x85, 0x71, 0xc5, 0xd8, 0x34, 0x5d, 0xe9, + 0x3a, 0xee, 0xb3, 0x07, 0x09, 0x7b, 0x73, 0xf1, 0xd8, 0xc6, 0x5a, 0x3b, 0x38, 0x7f, 0xe6, 0xbd, + 0xa2, 0x17, 0x4b, 0x90, 0xad, 0x3b, 0x9a, 0x83, 0xa6, 0x7c, 0x6c, 0xd1, 0x43, 0x61, 0x2c, 0xee, + 0xe0, 0xb1, 0xb8, 0x9e, 0x93, 0x05, 0xe1, 0x60, 0xde, 0xfd, 0x3f, 0x02, 0x00, 0x04, 0x93, 0x0f, + 0xd8, 0xa6, 0xe1, 0xe6, 0xf0, 0x8e, 0x40, 0x7a, 0xef, 0xe8, 0xe5, 0xbe, 0xb8, 0xef, 0xe6, 0xc4, + 0xfd, 0x78, 0xb1, 0x22, 0xc6, 0xb0, 0xd2, 0x26, 0xc1, 0x94, 0x2b, 0xda, 0x15, 0xac, 0xb5, 0x6d, + 0xf4, 0x23, 0x81, 0xf2, 0x47, 0x88, 0x19, 0xbd, 0x5f, 0x38, 0x18, 0x27, 0xad, 0x95, 0x4f, 0x3c, + 0xda, 0xa3, 0xc3, 0xdb, 0xfc, 0x97, 0xf8, 0x60, 0x24, 0x37, 0x43, 0x56, 0x37, 0x36, 0x4d, 0xe6, + 0x5f, 0x78, 0x65, 0x04, 0x6d, 0x57, 0x27, 0x54, 0x92, 0x51, 0x30, 0x52, 0x67, 0x3c, 0x5b, 0x63, + 0xb9, 0xf4, 0x2e, 0xeb, 0x96, 0x8e, 0xfe, 0xff, 0x03, 0x85, 0xad, 0x28, 0x90, 0xed, 0x6a, 0xce, + 0x36, 0x2b, 0x9a, 0x3c, 0xbb, 0x36, 0xf2, 0xae, 0xa1, 0x19, 0xa6, 0x71, 0x69, 0x47, 0x7f, 0x86, + 0x7f, 0xb7, 0x2e, 0x97, 0xe6, 0x72, 0xbe, 0x85, 0x0d, 0x6c, 0x69, 0x0e, 0xae, 0xef, 0x6d, 0x91, + 0x39, 0xd6, 0xa4, 0x1a, 0x4e, 0x4a, 0xac, 0xff, 0x2e, 0xc7, 0xd1, 0xfa, 0xbf, 0xa9, 0x77, 0x30, + 0x89, 0xd4, 0xc4, 0xf4, 0xdf, 0x7b, 0x4f, 0xa4, 0xff, 0x7d, 0x8a, 0x48, 0x1f, 0x8d, 0xef, 0x49, + 0x30, 0x53, 0x77, 0x15, 0xae, 0xbe, 0xbb, 0xb3, 0xa3, 0x59, 0x97, 0xd0, 0xb5, 0x01, 0x2a, 0x21, + 0xd5, 0xcc, 0xf0, 0x7e, 0x29, 0x7f, 0x28, 0x7c, 0xad, 0x34, 0x6b, 0xda, 0xa1, 0x12, 0x12, 0xb7, + 0x83, 0x27, 0x42, 0xce, 0x55, 0x6f, 0xcf, 0xe3, 0x32, 0xb6, 0x21, 0xd0, 0x9c, 0x82, 0x11, 0xad, + 0x06, 0xf2, 0x36, 0x86, 0x68, 0x1a, 0x12, 0x1c, 0xad, 0x3b, 0x5a, 0xeb, 0xc2, 0xb2, 0x69, 0x99, + 0xbb, 0x8e, 0x6e, 0x60, 0x1b, 0x3d, 0x26, 0x40, 0xc0, 0xd3, 0xff, 0x4c, 0xa0, 0xff, 0xe8, 0xdf, + 0x33, 0xa2, 0xa3, 0xa8, 0xdf, 0xad, 0x86, 0xc9, 0x47, 0x04, 0xa8, 0x12, 0x1b, 0x17, 0x45, 0x28, + 0xa6, 0x2f, 0xb4, 0x37, 0xc8, 0x50, 0x28, 0x3f, 0xd8, 0x35, 0x2d, 0x67, 0xd5, 0x6c, 0x69, 0x1d, + 0xdb, 0x31, 0x2d, 0x8c, 0x6a, 0xb1, 0x52, 0x73, 0x7b, 0x98, 0xb6, 0xd9, 0x0a, 0x06, 0x47, 0xf6, + 0x16, 0x56, 0x3b, 0x99, 0xd7, 0xf1, 0x0f, 0x0b, 0xef, 0x32, 0x52, 0xa9, 0xf4, 0x72, 0x14, 0xa1, + 0xe7, 0xfd, 0xba, 0xb4, 0x64, 0x87, 0x25, 0xc4, 0x76, 0x1e, 0x85, 0x98, 0x1a, 0xc3, 0x52, 0xb9, + 0x04, 0xb3, 0xf5, 0xdd, 0xf3, 0x3e, 0x11, 0x3b, 0x6c, 0x84, 0xbc, 0x4a, 0x38, 0x4a, 0x05, 0x53, + 0xbc, 0x30, 0xa1, 0x08, 0xf9, 0x5e, 0x07, 0xb3, 0x76, 0x38, 0x1b, 0xc3, 0x9b, 0x4f, 0x14, 0x8c, + 0x4e, 0x31, 0xb8, 0xd4, 0xf4, 0x05, 0xf8, 0x6e, 0x09, 0x66, 0x6b, 0x5d, 0x6c, 0xe0, 0x36, 0xf5, + 0x82, 0xe4, 0x04, 0xf8, 0xe2, 0x84, 0x02, 0xe4, 0x08, 0x45, 0x08, 0x30, 0xf0, 0x58, 0x5e, 0xf4, + 0x84, 0x17, 0x24, 0x24, 0x12, 0x5c, 0x5c, 0x69, 0xe9, 0x0b, 0xee, 0x4b, 0x12, 0x4c, 0xab, 0xbb, + 0xc6, 0xba, 0x65, 0xba, 0xa3, 0xb1, 0x85, 0xee, 0x0c, 0x3a, 0x88, 0x9b, 0xe0, 0x58, 0x7b, 0xd7, + 0x22, 0xeb, 0x4f, 0x15, 0xa3, 0x8e, 0x5b, 0xa6, 0xd1, 0xb6, 0x49, 0x3d, 0x72, 0xea, 0xfe, 0x0f, + 0xb7, 0x67, 0x9f, 0xf3, 0x75, 0x39, 0x83, 0x9e, 0x2b, 0x1c, 0xea, 0x86, 0x56, 0x3e, 0x54, 0xb4, + 0x78, 0x4f, 0x20, 0x18, 0xd0, 0x66, 0x50, 0x09, 0xe9, 0x0b, 0xf7, 0x73, 0x12, 0x28, 0xc5, 0x56, + 0xcb, 0xdc, 0x35, 0x9c, 0x3a, 0xee, 0xe0, 0x96, 0xd3, 0xb0, 0xb4, 0x16, 0x0e, 0xdb, 0xcf, 0x05, + 0x90, 0xdb, 0xba, 0xc5, 0xfa, 0x60, 0xf7, 0x91, 0xc9, 0xf1, 0xc5, 0xc2, 0x3b, 0x8e, 0xb4, 0x96, + 0xfb, 0x4b, 0x49, 0x20, 0x4e, 0xb1, 0x7d, 0x45, 0xc1, 0x82, 0xd2, 0x97, 0xea, 0xc7, 0x24, 0x98, + 0xf2, 0x7a, 0xec, 0x2d, 0x11, 0x61, 0xfe, 0x7a, 0xc2, 0xc9, 0x88, 0x4f, 0x3c, 0x81, 0x0c, 0xdf, + 0x9e, 0x60, 0x56, 0x11, 0x45, 0x3f, 0x99, 0xe8, 0x8a, 0xc9, 0x45, 0xe7, 0xbe, 0x56, 0x6b, 0xcd, + 0xa5, 0xda, 0xea, 0x62, 0x59, 0x2d, 0xc8, 0xe8, 0x11, 0x09, 0xb2, 0xeb, 0xba, 0xb1, 0x15, 0x8e, + 0xae, 0x74, 0xdc, 0xb5, 0x23, 0xdb, 0xf8, 0x41, 0xd6, 0xd2, 0xe9, 0x8b, 0x72, 0x2b, 0x1c, 0x37, + 0x76, 0x77, 0xce, 0x63, 0xab, 0xb6, 0x49, 0x46, 0x59, 0xbb, 0x61, 0xd6, 0xb1, 0x41, 0x8d, 0xd0, + 0x9c, 0xda, 0xf7, 0x1b, 0x6f, 0x82, 0x09, 0x4c, 0x1e, 0x5c, 0x4e, 0x22, 0x24, 0xee, 0x33, 0x25, + 0x85, 0x98, 0x4a, 0x34, 0x6d, 0xe8, 0x43, 0x3c, 0x7d, 0x4d, 0xfd, 0xa3, 0x1c, 0x9c, 0x28, 0x1a, + 0x97, 0x88, 0x4d, 0x41, 0x3b, 0xf8, 0xd2, 0xb6, 0x66, 0x6c, 0x61, 0x32, 0x40, 0xf8, 0x12, 0x0f, + 0x87, 0xe8, 0xcf, 0xf0, 0x21, 0xfa, 0x15, 0x15, 0x26, 0x4c, 0xab, 0x8d, 0xad, 0x85, 0x4b, 0x84, + 0xa7, 0xde, 0x65, 0x67, 0xd6, 0x26, 0xfb, 0x15, 0x31, 0xcf, 0xc8, 0xcf, 0xd7, 0xe8, 0xff, 0xaa, + 0x47, 0xe8, 0xcc, 0x4d, 0x30, 0xc1, 0xd2, 0x94, 0x19, 0x98, 0xac, 0xa9, 0x8b, 0x65, 0xb5, 0x59, + 0x59, 0x2c, 0x1c, 0x51, 0x2e, 0x83, 0xa3, 0x95, 0x46, 0x59, 0x2d, 0x36, 0x2a, 0xb5, 0x6a, 0x93, + 0xa4, 0x17, 0x32, 0xe8, 0xd9, 0x59, 0x51, 0xcf, 0xde, 0x78, 0x66, 0xfa, 0xc1, 0xaa, 0xc2, 0x44, + 0x8b, 0x66, 0x20, 0x43, 0xe8, 0x74, 0xa2, 0xda, 0x31, 0x82, 0x34, 0x41, 0xf5, 0x08, 0x29, 0xa7, + 0x01, 0x2e, 0x5a, 0xa6, 0xb1, 0x15, 0x9c, 0x3a, 0x9c, 0x54, 0x43, 0x29, 0xe8, 0xa1, 0x0c, 0xe4, + 0xe9, 0x3f, 0xe4, 0x4a, 0x12, 0xf2, 0x14, 0x08, 0xde, 0x7b, 0x77, 0x2d, 0x5e, 0x22, 0xaf, 0x60, + 0xa2, 0xc5, 0x5e, 0x5d, 0x5d, 0xa4, 0x32, 0xa0, 0x96, 0x30, 0xab, 0xca, 0xcd, 0x90, 0xa7, 0xff, + 0x32, 0xaf, 0x83, 0xe8, 0xf0, 0xa2, 0x34, 0x9b, 0xa0, 0x9f, 0xb2, 0xb8, 0x4c, 0xd3, 0xd7, 0xe6, + 0x0f, 0x48, 0x30, 0x59, 0xc5, 0x4e, 0x69, 0x1b, 0xb7, 0x2e, 0xa0, 0xc7, 0xf1, 0x0b, 0xa0, 0x1d, + 0x1d, 0x1b, 0xce, 0xfd, 0x3b, 0x1d, 0x7f, 0x01, 0xd4, 0x4b, 0x40, 0xbf, 0x18, 0xee, 0x7c, 0xef, + 0xe1, 0xf5, 0xe7, 0xc6, 0x3e, 0x75, 0xf5, 0x4a, 0x88, 0x50, 0x99, 0x93, 0x90, 0xb7, 0xb0, 0xbd, + 0xdb, 0xf1, 0x16, 0xd1, 0xd8, 0x1b, 0x7a, 0xb5, 0x2f, 0xce, 0x12, 0x27, 0xce, 0x9b, 0xc5, 0x8b, + 0x18, 0x43, 0xbc, 0xd2, 0x2c, 0x4c, 0x54, 0x0c, 0xdd, 0xd1, 0xb5, 0x0e, 0x7a, 0x6e, 0x16, 0x66, + 0xeb, 0xd8, 0x59, 0xd7, 0x2c, 0x6d, 0x07, 0x3b, 0xd8, 0xb2, 0xd1, 0x77, 0xf8, 0x3e, 0xa1, 0xdb, + 0xd1, 0x9c, 0x4d, 0xd3, 0xda, 0xf1, 0x54, 0xd3, 0x7b, 0x77, 0x55, 0x73, 0x0f, 0x5b, 0x76, 0xc0, + 0x97, 0xf7, 0xea, 0x7e, 0xb9, 0x68, 0x5a, 0x17, 0xdc, 0x41, 0x90, 0x4d, 0xd3, 0xd8, 0xab, 0x4b, + 0xaf, 0x63, 0x6e, 0xad, 0xe2, 0x3d, 0xec, 0x85, 0x4b, 0xf3, 0xdf, 0xdd, 0xb9, 0x40, 0xdb, 0xac, + 0x9a, 0x8e, 0xdb, 0x69, 0xaf, 0x9a, 0x5b, 0x34, 0x5e, 0xec, 0xa4, 0xca, 0x27, 0x06, 0xb9, 0xb4, + 0x3d, 0x4c, 0x72, 0xe5, 0xc3, 0xb9, 0x58, 0xa2, 0x32, 0x0f, 0x8a, 0xff, 0x5b, 0x03, 0x77, 0xf0, + 0x0e, 0x76, 0xac, 0x4b, 0xe4, 0x5a, 0x88, 0x49, 0xb5, 0xcf, 0x17, 0x36, 0x40, 0x8b, 0x4f, 0xd6, + 0x99, 0xf4, 0xe6, 0x39, 0xc9, 0x1d, 0x68, 0xb2, 0x2e, 0x42, 0x71, 0x2c, 0xd7, 0x5e, 0xc9, 0xae, + 0x35, 0xf3, 0x52, 0x19, 0xb2, 0x64, 0xf0, 0x7c, 0x63, 0x86, 0x5b, 0x61, 0xda, 0xc1, 0xb6, 0xad, + 0x6d, 0x61, 0x6f, 0x85, 0x89, 0xbd, 0x2a, 0xb7, 0x41, 0xae, 0x43, 0x30, 0xa5, 0x83, 0xc3, 0xb5, + 0x5c, 0xcd, 0x5c, 0x03, 0xc3, 0xa5, 0xe5, 0x8f, 0x04, 0x04, 0x6e, 0x95, 0xfe, 0x71, 0xe6, 0x5e, + 0xc8, 0x51, 0xf8, 0xa7, 0x20, 0xb7, 0x58, 0x5e, 0xd8, 0x58, 0x2e, 0x1c, 0x71, 0x1f, 0x3d, 0xfe, + 0xa6, 0x20, 0xb7, 0x54, 0x6c, 0x14, 0x57, 0x0b, 0x92, 0x5b, 0x8f, 0x4a, 0x75, 0xa9, 0x56, 0x90, + 0xdd, 0xc4, 0xf5, 0x62, 0xb5, 0x52, 0x2a, 0x64, 0x95, 0x69, 0x98, 0x38, 0x57, 0x54, 0xab, 0x95, + 0xea, 0x72, 0x21, 0x87, 0xfe, 0x36, 0x8c, 0xdf, 0xed, 0x3c, 0x7e, 0xd7, 0x45, 0xf1, 0xd4, 0x0f, + 0xb2, 0xdf, 0xf2, 0x21, 0xbb, 0x93, 0x83, 0xec, 0x47, 0x45, 0x88, 0x8c, 0xc1, 0x9d, 0x29, 0x0f, + 0x13, 0xeb, 0x96, 0xd9, 0xc2, 0xb6, 0x8d, 0x7e, 0x43, 0x82, 0x7c, 0x49, 0x33, 0x5a, 0xb8, 0x83, + 0xae, 0x08, 0xa0, 0xa2, 0xae, 0xa2, 0x19, 0xff, 0xb4, 0xd8, 0x3f, 0x66, 0x44, 0x7b, 0x3f, 0x46, + 0x77, 0x9e, 0xd2, 0x8c, 0x90, 0x8f, 0x58, 0x2f, 0x17, 0x4b, 0x6a, 0x0c, 0x57, 0xe3, 0x48, 0x30, + 0xc5, 0x56, 0x03, 0xce, 0xe3, 0xf0, 0x3c, 0xfc, 0x3b, 0x19, 0xd1, 0xc9, 0xa1, 0x57, 0x03, 0x9f, + 0x4c, 0x84, 0x3c, 0xc4, 0x26, 0x82, 0x83, 0xa8, 0x8d, 0x61, 0xf3, 0x50, 0x82, 0xe9, 0x0d, 0xc3, + 0xee, 0x27, 0x14, 0xf1, 0x38, 0xfa, 0x5e, 0x35, 0x42, 0x84, 0x0e, 0x14, 0x47, 0x7f, 0x30, 0xbd, + 0xf4, 0x05, 0xf3, 0x9d, 0x0c, 0x1c, 0x5f, 0xc6, 0x06, 0xb6, 0xf4, 0x16, 0xad, 0x81, 0x27, 0x89, + 0x3b, 0x79, 0x49, 0x3c, 0x8e, 0xe3, 0xbc, 0xdf, 0x1f, 0xbc, 0x04, 0x5e, 0xe1, 0x4b, 0xe0, 0x1e, + 0x4e, 0x02, 0x37, 0x09, 0xd2, 0x19, 0xc3, 0x7d, 0xe8, 0x53, 0x30, 0x53, 0x35, 0x1d, 0x7d, 0x53, + 0x6f, 0x51, 0x1f, 0xb4, 0x97, 0xc8, 0x90, 0x5d, 0xd5, 0x6d, 0x07, 0x15, 0x83, 0xee, 0xe4, 0x1a, + 0x98, 0xd6, 0x8d, 0x56, 0x67, 0xb7, 0x8d, 0x55, 0xac, 0xd1, 0x7e, 0x65, 0x52, 0x0d, 0x27, 0x05, + 0x5b, 0xfb, 0x2e, 0x5b, 0xb2, 0xb7, 0xb5, 0xff, 0x69, 0xe1, 0x65, 0x98, 0x30, 0x0b, 0x24, 0x20, + 0x65, 0x84, 0xdd, 0x55, 0x84, 0x59, 0x23, 0x94, 0xd5, 0x33, 0xd8, 0x7b, 0x2f, 0x14, 0x08, 0x93, + 0x53, 0xf9, 0x3f, 0xd0, 0x7b, 0x85, 0x1a, 0xeb, 0x20, 0x86, 0x92, 0x21, 0xb3, 0x34, 0xc4, 0x24, + 0x59, 0x81, 0xb9, 0x4a, 0xb5, 0x51, 0x56, 0xab, 0xc5, 0x55, 0x96, 0x45, 0x46, 0xdf, 0x93, 0x20, + 0xa7, 0xe2, 0x6e, 0xe7, 0x52, 0x38, 0x62, 0x34, 0x73, 0x14, 0xcf, 0xf8, 0x8e, 0xe2, 0xca, 0x12, + 0x80, 0xd6, 0x72, 0x0b, 0x26, 0x57, 0x6a, 0x49, 0x7d, 0xe3, 0x98, 0x72, 0x15, 0x2c, 0xfa, 0xb9, + 0xd5, 0xd0, 0x9f, 0xe8, 0x79, 0xc2, 0x3b, 0x47, 0x1c, 0x35, 0xc2, 0x61, 0x44, 0x9f, 0xf0, 0x3e, + 0xa1, 0xcd, 0x9e, 0x81, 0xe4, 0x0e, 0x47, 0xfc, 0x5f, 0x96, 0x20, 0xdb, 0x70, 0x7b, 0xcb, 0x50, + 0xc7, 0xf9, 0xa9, 0xe1, 0x74, 0xdc, 0x25, 0x13, 0xa1, 0xe3, 0x77, 0xc3, 0x4c, 0x58, 0x63, 0x99, + 0xab, 0x44, 0xac, 0x8a, 0x73, 0x3f, 0x0c, 0xa3, 0xe1, 0x7d, 0xd8, 0x39, 0x1c, 0x11, 0x7f, 0xfc, + 0xf1, 0x00, 0x6b, 0x78, 0xe7, 0x3c, 0xb6, 0xec, 0x6d, 0xbd, 0x8b, 0xfe, 0x4e, 0x86, 0xa9, 0x65, + 0xec, 0xd4, 0x1d, 0xcd, 0xd9, 0xb5, 0x7b, 0xb6, 0x3b, 0x0d, 0xb3, 0xa4, 0xb5, 0xb6, 0x31, 0xeb, + 0x8e, 0xbc, 0x57, 0xf4, 0x4e, 0x59, 0xd4, 0x9f, 0x28, 0x28, 0x67, 0xde, 0x2f, 0x23, 0x02, 0x93, + 0x27, 0x40, 0xb6, 0xad, 0x39, 0x1a, 0xc3, 0xe2, 0x8a, 0x1e, 0x2c, 0x02, 0x42, 0x2a, 0xc9, 0x86, + 0x7e, 0x47, 0x12, 0x71, 0x28, 0x12, 0x28, 0x3f, 0x19, 0x08, 0xef, 0xcd, 0x0c, 0x81, 0xc2, 0x31, + 0x98, 0xad, 0xd6, 0x1a, 0xcd, 0xd5, 0xda, 0xf2, 0x72, 0xd9, 0x4d, 0x2d, 0xc8, 0xca, 0x49, 0x50, + 0xd6, 0x8b, 0xf7, 0xaf, 0x95, 0xab, 0x8d, 0x66, 0xb5, 0xb6, 0x58, 0x66, 0x7f, 0x66, 0x95, 0xa3, + 0x30, 0x5d, 0x2a, 0x96, 0x56, 0xbc, 0x84, 0x9c, 0x72, 0x0a, 0x8e, 0xaf, 0x95, 0xd7, 0x16, 0xca, + 0x6a, 0x7d, 0xa5, 0xb2, 0xde, 0x74, 0xc9, 0x2c, 0xd5, 0x36, 0xaa, 0x8b, 0x85, 0xbc, 0x82, 0xe0, + 0x64, 0xe8, 0xcb, 0x39, 0xb5, 0x56, 0x5d, 0x6e, 0xd6, 0x1b, 0xc5, 0x46, 0xb9, 0x30, 0xa1, 0x5c, + 0x06, 0x47, 0x4b, 0xc5, 0x2a, 0xc9, 0x5e, 0xaa, 0x55, 0xab, 0xe5, 0x52, 0xa3, 0x30, 0x89, 0xfe, + 0x3d, 0x0b, 0xd3, 0x15, 0xbb, 0xaa, 0xed, 0xe0, 0xb3, 0x5a, 0x47, 0x6f, 0xa3, 0xe7, 0x86, 0x66, + 0x1e, 0xd7, 0xc1, 0xac, 0x45, 0x1f, 0x71, 0xbb, 0xa1, 0x63, 0x8a, 0xe6, 0xac, 0xca, 0x27, 0xba, + 0x73, 0x72, 0x83, 0x10, 0xf0, 0xe6, 0xe4, 0xf4, 0x4d, 0x59, 0x00, 0xa0, 0x4f, 0x8d, 0xe0, 0x72, + 0xd7, 0x33, 0xbd, 0xad, 0x49, 0xdb, 0xc1, 0x36, 0xb6, 0xf6, 0xf4, 0x16, 0xf6, 0x72, 0xaa, 0xa1, + 0xbf, 0xd0, 0x57, 0x64, 0xd1, 0xfd, 0xc5, 0x10, 0xa8, 0xa1, 0xea, 0x44, 0xf4, 0x86, 0xbf, 0x24, + 0x8b, 0xec, 0x0e, 0x0a, 0x91, 0x4c, 0xa6, 0x29, 0x2f, 0x90, 0x86, 0x5b, 0xb6, 0x6d, 0xd4, 0x6a, + 0xcd, 0xfa, 0x4a, 0x4d, 0x6d, 0x14, 0x64, 0x65, 0x06, 0x26, 0xdd, 0xd7, 0xd5, 0x5a, 0x75, 0xb9, + 0x90, 0x55, 0x4e, 0xc0, 0xb1, 0x95, 0x62, 0xbd, 0x59, 0xa9, 0x9e, 0x2d, 0xae, 0x56, 0x16, 0x9b, + 0xa5, 0x95, 0xa2, 0x5a, 0x2f, 0xe4, 0x94, 0x2b, 0xe0, 0x44, 0xa3, 0x52, 0x56, 0x9b, 0x4b, 0xe5, + 0x62, 0x63, 0x43, 0x2d, 0xd7, 0x9b, 0xd5, 0x5a, 0xb3, 0x5a, 0x5c, 0x2b, 0x17, 0xf2, 0x6e, 0xf3, + 0x27, 0x9f, 0x02, 0xb5, 0x99, 0xd8, 0xaf, 0x8c, 0x93, 0x11, 0xca, 0x38, 0xd5, 0xab, 0x8c, 0x10, + 0x56, 0x2b, 0xb5, 0x5c, 0x2f, 0xab, 0x67, 0xcb, 0x85, 0xe9, 0x7e, 0xba, 0x36, 0xa3, 0x1c, 0x87, + 0x82, 0xcb, 0x43, 0xb3, 0x52, 0xf7, 0x72, 0x2e, 0x16, 0x66, 0xd1, 0xc7, 0xf2, 0x70, 0x52, 0xc5, + 0x5b, 0xba, 0xed, 0x60, 0x6b, 0x5d, 0xbb, 0xb4, 0x83, 0x0d, 0xc7, 0xeb, 0xe4, 0xff, 0x25, 0xb1, + 0x32, 0xae, 0xc1, 0x6c, 0x97, 0xd2, 0x58, 0xc3, 0xce, 0xb6, 0xd9, 0x66, 0xa3, 0xf0, 0xe3, 0x22, + 0x7b, 0x8e, 0xf9, 0xf5, 0x70, 0x76, 0x95, 0xff, 0x3b, 0xa4, 0xdb, 0x72, 0x8c, 0x6e, 0x67, 0x87, + 0xd1, 0x6d, 0xe5, 0x2a, 0x98, 0xda, 0xb5, 0xb1, 0x55, 0xde, 0xd1, 0xf4, 0x8e, 0x77, 0x39, 0xa7, + 0x9f, 0x80, 0xde, 0x96, 0x15, 0x3d, 0xb1, 0x12, 0xaa, 0x4b, 0x7f, 0x31, 0x46, 0xf4, 0xad, 0xa7, + 0x01, 0x58, 0x65, 0x37, 0xac, 0x0e, 0x53, 0xd6, 0x50, 0x8a, 0xcb, 0xdf, 0x79, 0xbd, 0xd3, 0xd1, + 0x8d, 0x2d, 0x7f, 0xdf, 0x3f, 0x48, 0x40, 0x2f, 0x90, 0x45, 0x4e, 0xb0, 0x24, 0xe5, 0x2d, 0x59, + 0x6b, 0x7a, 0x9e, 0x34, 0xe6, 0x7e, 0x77, 0x7f, 0xd3, 0xc9, 0x2b, 0x05, 0x98, 0x21, 0x69, 0xac, + 0x05, 0x16, 0x26, 0xdc, 0x3e, 0xd8, 0x23, 0xb7, 0x56, 0x6e, 0xac, 0xd4, 0x16, 0xfd, 0x6f, 0x93, + 0x2e, 0x49, 0x97, 0x99, 0x62, 0xf5, 0x7e, 0xd2, 0x1a, 0xa7, 0x94, 0xc7, 0xc0, 0x15, 0xa1, 0x0e, + 0xbb, 0xb8, 0xaa, 0x96, 0x8b, 0x8b, 0xf7, 0x37, 0xcb, 0x4f, 0xaf, 0xd4, 0x1b, 0x75, 0xbe, 0x71, + 0x79, 0xed, 0x68, 0xda, 0xe5, 0xb7, 0xbc, 0x56, 0xac, 0xac, 0xb2, 0xfe, 0x7d, 0xa9, 0xa6, 0xae, + 0x15, 0x1b, 0x85, 0x19, 0xf4, 0x52, 0x19, 0x0a, 0xcb, 0xd8, 0x59, 0x37, 0x2d, 0x47, 0xeb, 0xac, + 0xea, 0xc6, 0x85, 0x0d, 0xab, 0xc3, 0x4d, 0x36, 0x85, 0xc3, 0x74, 0xf0, 0x43, 0x24, 0x47, 0x30, + 0x7a, 0x47, 0xbc, 0x4b, 0xb2, 0x05, 0xca, 0x14, 0x24, 0xa0, 0x67, 0x4a, 0x22, 0xcb, 0xdd, 0xe2, + 0xa5, 0x26, 0xd3, 0x93, 0x67, 0x8d, 0x7b, 0x7c, 0xee, 0x83, 0x5a, 0x1e, 0x3d, 0x27, 0x0b, 0x93, + 0x4b, 0xba, 0xa1, 0x75, 0xf4, 0x67, 0x70, 0xf1, 0x4b, 0x83, 0x3e, 0x26, 0x13, 0xd3, 0xc7, 0x48, + 0x43, 0x8d, 0x9f, 0xbf, 0x26, 0x8b, 0x2e, 0x2f, 0x84, 0x64, 0xef, 0x31, 0x19, 0x31, 0x78, 0x7e, + 0x50, 0x12, 0x59, 0x5e, 0x18, 0x4c, 0x2f, 0x19, 0x86, 0x9f, 0xfc, 0xc1, 0xb0, 0xb1, 0x7a, 0xda, + 0xf7, 0x64, 0x3f, 0x55, 0x98, 0x42, 0x7f, 0x26, 0x03, 0x5a, 0xc6, 0xce, 0x59, 0x6c, 0xf9, 0x53, + 0x01, 0xd2, 0xeb, 0x33, 0x7b, 0x3b, 0xd4, 0x64, 0xdf, 0x18, 0x06, 0xf0, 0x1c, 0x0f, 0x60, 0x31, + 0xa6, 0xf1, 0x44, 0x90, 0x8e, 0x68, 0xbc, 0x15, 0xc8, 0xdb, 0xe4, 0x3b, 0x53, 0xb3, 0x27, 0x46, + 0x0f, 0x97, 0x84, 0x58, 0x98, 0x3a, 0x25, 0xac, 0x32, 0x02, 0xe8, 0xbb, 0xfe, 0x24, 0xe8, 0x27, + 0x39, 0xed, 0x58, 0x3a, 0x30, 0xb3, 0xc9, 0xf4, 0xc5, 0x4a, 0x57, 0x5d, 0xfa, 0xd9, 0x37, 0xe8, + 0x83, 0x39, 0x38, 0xde, 0xaf, 0x3a, 0xe8, 0x77, 0x33, 0xdc, 0x0e, 0x3b, 0x26, 0x43, 0x7e, 0x86, + 0x6d, 0x20, 0xba, 0x2f, 0xca, 0x93, 0xe1, 0x84, 0xbf, 0x0c, 0xd7, 0x30, 0xab, 0xf8, 0xa2, 0xdd, + 0xc1, 0x8e, 0x83, 0x2d, 0x52, 0xb5, 0x49, 0xb5, 0xff, 0x47, 0xe5, 0xa9, 0x70, 0xb9, 0x6e, 0xd8, + 0x7a, 0x1b, 0x5b, 0x0d, 0xbd, 0x6b, 0x17, 0x8d, 0x76, 0x63, 0xd7, 0x31, 0x2d, 0x5d, 0x63, 0x57, + 0x49, 0x4e, 0xaa, 0x51, 0x9f, 0x95, 0x1b, 0xa1, 0xa0, 0xdb, 0x35, 0xe3, 0xbc, 0xa9, 0x59, 0x6d, + 0xdd, 0xd8, 0x5a, 0xd5, 0x6d, 0x87, 0x79, 0x00, 0xef, 0x4b, 0x47, 0x7f, 0x2f, 0x8b, 0x1e, 0xa6, + 0x1b, 0x00, 0x6b, 0x44, 0x87, 0xf2, 0x8b, 0xb2, 0xc8, 0xf1, 0xb8, 0x64, 0xb4, 0x93, 0x29, 0xcb, + 0xb3, 0xc7, 0x6d, 0x48, 0xf4, 0x1f, 0xc1, 0x49, 0xd7, 0x42, 0xd3, 0x3d, 0x43, 0xe0, 0x6c, 0x59, + 0xad, 0x2c, 0x55, 0xca, 0xae, 0x59, 0x71, 0x02, 0x8e, 0x05, 0xdf, 0x16, 0xef, 0x6f, 0xd6, 0xcb, + 0xd5, 0x46, 0x61, 0xd2, 0xed, 0xa7, 0x68, 0xf2, 0x52, 0xb1, 0xb2, 0x5a, 0x5e, 0x6c, 0x36, 0x6a, + 0xee, 0x97, 0xc5, 0xe1, 0x4c, 0x0b, 0xf4, 0x50, 0x16, 0x8e, 0x12, 0xd9, 0x5e, 0x22, 0x52, 0x75, + 0x85, 0xd2, 0xe3, 0x6b, 0xeb, 0x03, 0x34, 0x45, 0xc5, 0x8b, 0x3e, 0x2b, 0x7c, 0x53, 0x66, 0x08, + 0xc2, 0x9e, 0x32, 0x22, 0x34, 0xe3, 0x3b, 0x92, 0x48, 0x84, 0x0a, 0x61, 0xb2, 0xc9, 0x94, 0xe2, + 0x5f, 0xc7, 0x3d, 0xe2, 0x44, 0x83, 0x4f, 0xac, 0xcc, 0x12, 0xf9, 0xf9, 0xe9, 0xeb, 0x15, 0x95, + 0xa8, 0xc3, 0x1c, 0x00, 0x49, 0x21, 0x1a, 0x44, 0xf5, 0xa0, 0xef, 0x78, 0x15, 0xa5, 0x07, 0xc5, + 0x52, 0xa3, 0x72, 0xb6, 0x1c, 0xa5, 0x07, 0x9f, 0x91, 0x61, 0x72, 0x19, 0x3b, 0xee, 0x9c, 0xca, + 0x46, 0x4f, 0x13, 0x58, 0xff, 0x71, 0xcd, 0x98, 0x8e, 0xd9, 0xd2, 0x3a, 0xfe, 0x32, 0x00, 0x7d, + 0x43, 0xbf, 0x30, 0x8c, 0x09, 0xe2, 0x15, 0x1d, 0x31, 0x5e, 0xfd, 0x38, 0xe4, 0x1c, 0xf7, 0x33, + 0x5b, 0x86, 0xfe, 0x91, 0xc8, 0xe1, 0xca, 0x25, 0xb2, 0xa8, 0x39, 0x9a, 0x4a, 0xf3, 0x87, 0x46, + 0x27, 0x41, 0xdb, 0x25, 0x82, 0x91, 0x1f, 0x44, 0xfb, 0xf3, 0x6f, 0x65, 0x38, 0x41, 0xdb, 0x47, + 0xb1, 0xdb, 0xad, 0x3b, 0xa6, 0x85, 0x55, 0xdc, 0xc2, 0x7a, 0xd7, 0xe9, 0x59, 0xdf, 0xb3, 0x68, + 0xaa, 0xb7, 0xd9, 0xcc, 0x5e, 0xd1, 0xeb, 0x64, 0xd1, 0x18, 0xcc, 0xfb, 0xda, 0x63, 0x4f, 0x79, + 0x11, 0x8d, 0xfd, 0xa3, 0x92, 0x48, 0x54, 0xe5, 0x84, 0xc4, 0x93, 0x01, 0xf5, 0xa1, 0x43, 0x00, + 0xca, 0x5b, 0xb9, 0x51, 0xcb, 0xa5, 0x72, 0x65, 0xdd, 0x1d, 0x04, 0xae, 0x86, 0x2b, 0xd7, 0x37, + 0xd4, 0xd2, 0x4a, 0xb1, 0x5e, 0x6e, 0xaa, 0xe5, 0xe5, 0x4a, 0xbd, 0xc1, 0x9c, 0xb2, 0xe8, 0x5f, + 0x13, 0xca, 0x55, 0x70, 0xaa, 0xbe, 0xb1, 0x50, 0x2f, 0xa9, 0x95, 0x75, 0x92, 0xae, 0x96, 0xab, + 0xe5, 0x73, 0xec, 0xeb, 0x24, 0x7a, 0x7f, 0x01, 0xa6, 0xdd, 0x09, 0x40, 0x9d, 0xce, 0x0b, 0xd0, + 0x37, 0xb3, 0x30, 0xad, 0x62, 0xdb, 0xec, 0xec, 0x91, 0x39, 0xc2, 0xb8, 0xa6, 0x1e, 0xdf, 0x96, + 0x45, 0xcf, 0x6f, 0x87, 0x98, 0x9d, 0x0f, 0x31, 0x1a, 0x3d, 0xd1, 0xd4, 0xf6, 0x34, 0xbd, 0xa3, + 0x9d, 0x67, 0x5d, 0xcd, 0xa4, 0x1a, 0x24, 0x28, 0xf3, 0xa0, 0x98, 0x17, 0x0d, 0x6c, 0xd5, 0x5b, + 0x17, 0xcb, 0xce, 0x76, 0xb1, 0xdd, 0xb6, 0xb0, 0x6d, 0xb3, 0xd5, 0x8b, 0x3e, 0x5f, 0x94, 0x1b, + 0xe0, 0x28, 0x49, 0x0d, 0x65, 0xa6, 0x0e, 0x32, 0xbd, 0xc9, 0x7e, 0xce, 0xa2, 0x71, 0xc9, 0xcb, + 0x99, 0x0b, 0xe5, 0x0c, 0x92, 0xc3, 0xc7, 0x25, 0xf2, 0xfc, 0x29, 0x9d, 0x6b, 0x60, 0xda, 0xd0, + 0x76, 0x70, 0xf9, 0xc1, 0xae, 0x6e, 0x61, 0x9b, 0x38, 0xc6, 0xc8, 0x6a, 0x38, 0x09, 0x7d, 0x50, + 0xe8, 0xbc, 0xb9, 0x98, 0xc4, 0x92, 0xe9, 0xfe, 0xf2, 0x10, 0xaa, 0xdf, 0xa7, 0x9f, 0x91, 0xd1, + 0xfb, 0x65, 0x98, 0x61, 0x4c, 0x15, 0x8d, 0x4b, 0x95, 0x36, 0xba, 0x9a, 0x33, 0x7e, 0x35, 0x37, + 0xcd, 0x33, 0x7e, 0xc9, 0x0b, 0xfa, 0x65, 0x59, 0xd4, 0xdd, 0xb9, 0x4f, 0xc5, 0x49, 0x19, 0xd1, + 0x8e, 0xa3, 0x9b, 0xe6, 0x2e, 0x73, 0x54, 0x9d, 0x54, 0xe9, 0x4b, 0x9a, 0x8b, 0x7a, 0xe8, 0x0f, + 0x84, 0x9c, 0xa9, 0x05, 0xab, 0x71, 0x48, 0x00, 0x7e, 0x5c, 0x86, 0x39, 0xc6, 0x55, 0x9d, 0x9d, + 0xf3, 0x11, 0x3a, 0xf0, 0xf6, 0x2b, 0xc2, 0x86, 0x60, 0x9f, 0xfa, 0xb3, 0x92, 0x1e, 0x35, 0x40, + 0x7e, 0x58, 0x28, 0x38, 0x9a, 0x70, 0x45, 0x0e, 0x09, 0xca, 0xb7, 0x67, 0x61, 0x7a, 0xc3, 0xc6, + 0x16, 0xf3, 0xdb, 0x47, 0xaf, 0xce, 0x82, 0xbc, 0x8c, 0xb9, 0x8d, 0xd4, 0xe7, 0x0b, 0x7b, 0xf8, + 0x86, 0x2b, 0x1b, 0x22, 0xea, 0xda, 0x48, 0x11, 0xb0, 0x5d, 0x0f, 0x73, 0x54, 0xa4, 0x45, 0xc7, + 0x71, 0x8d, 0x44, 0xcf, 0x9b, 0xb6, 0x27, 0x75, 0x14, 0x5b, 0x45, 0xa4, 0x2c, 0x37, 0x4b, 0xc9, + 0xe5, 0x69, 0x15, 0x6f, 0xd2, 0xf9, 0x6c, 0x56, 0xed, 0x49, 0x55, 0x6e, 0x81, 0xcb, 0xcc, 0x2e, + 0xa6, 0xe7, 0x57, 0x42, 0x99, 0x73, 0x24, 0x73, 0xbf, 0x4f, 0xe8, 0x9b, 0x42, 0xbe, 0xba, 0xe2, + 0xd2, 0x49, 0xa6, 0x0b, 0xdd, 0xd1, 0x98, 0x24, 0xc7, 0xa1, 0xe0, 0xe6, 0x20, 0xfb, 0x2f, 0x6a, + 0xb9, 0x5e, 0x5b, 0x3d, 0x5b, 0xee, 0xbf, 0x8c, 0x91, 0x43, 0xcf, 0x96, 0x61, 0x6a, 0xc1, 0x32, + 0xb5, 0x76, 0x4b, 0xb3, 0x1d, 0xf4, 0x5d, 0x09, 0x66, 0xd6, 0xb5, 0x4b, 0x1d, 0x53, 0x6b, 0x13, + 0xff, 0xfe, 0x9e, 0xbe, 0xa0, 0x4b, 0x3f, 0x79, 0x7d, 0x01, 0x7b, 0xe5, 0x0f, 0x06, 0xfa, 0x47, + 0xf7, 0x32, 0x22, 0x17, 0x6a, 0xfa, 0xdb, 0x7c, 0x52, 0xbf, 0x60, 0xa5, 0x1e, 0x5f, 0xf3, 0x61, + 0x9e, 0x22, 0x2c, 0xca, 0xf7, 0x8b, 0x85, 0x1f, 0x15, 0x21, 0x79, 0x38, 0xbb, 0xf2, 0xcf, 0x99, + 0x84, 0xfc, 0x22, 0x26, 0x56, 0xdc, 0xff, 0x90, 0x60, 0xa2, 0x8e, 0x1d, 0x62, 0xc1, 0xdd, 0xc6, + 0x79, 0x0a, 0xb7, 0x49, 0x86, 0xc0, 0x89, 0xdd, 0x7b, 0x77, 0x27, 0xeb, 0xa1, 0xf3, 0xd6, 0xe4, + 0x39, 0x81, 0x47, 0x22, 0x2d, 0x77, 0x9e, 0x95, 0x79, 0x20, 0x8f, 0xc4, 0x58, 0x52, 0xe9, 0xfb, + 0x5a, 0xbd, 0x53, 0x62, 0xae, 0x55, 0xa1, 0x5e, 0xef, 0x95, 0x61, 0xfd, 0x8c, 0xf5, 0x36, 0x63, + 0xcc, 0xc7, 0x38, 0x47, 0x3d, 0x09, 0x26, 0xa8, 0xcc, 0xbd, 0xf9, 0x68, 0xaf, 0x9f, 0x02, 0x25, + 0x41, 0xce, 0x5e, 0x7b, 0x39, 0x05, 0x5d, 0xd4, 0xa2, 0x0b, 0x1f, 0x4b, 0x0c, 0x82, 0x99, 0x2a, + 0x76, 0x2e, 0x9a, 0xd6, 0x85, 0xba, 0xa3, 0x39, 0x18, 0xfd, 0xab, 0x04, 0x72, 0x1d, 0x3b, 0xe1, + 0xe8, 0x27, 0x55, 0x38, 0x46, 0x2b, 0xc4, 0x32, 0x92, 0xfe, 0x9b, 0x56, 0xe4, 0x9a, 0xbe, 0x42, + 0x08, 0xe5, 0x53, 0xf7, 0xff, 0x8a, 0x7e, 0xa3, 0x6f, 0xd0, 0x27, 0xa9, 0xcf, 0xa4, 0x81, 0x49, + 0x26, 0xcc, 0xa0, 0xab, 0x60, 0x11, 0x7a, 0xfa, 0x01, 0x21, 0xb3, 0x5a, 0x8c, 0xe6, 0xe1, 0x74, + 0x05, 0x1f, 0xbe, 0x02, 0xb2, 0xa5, 0x6d, 0xcd, 0x41, 0xef, 0x90, 0x01, 0x8a, 0xed, 0xf6, 0x1a, + 0xf5, 0x01, 0x0f, 0x3b, 0xa4, 0x9d, 0x81, 0x99, 0xd6, 0xb6, 0x16, 0xdc, 0x6d, 0x42, 0xfb, 0x03, + 0x2e, 0x4d, 0x79, 0x72, 0xe0, 0x4c, 0x4e, 0xa5, 0x8a, 0x7a, 0x60, 0x72, 0xcb, 0x60, 0xb4, 0x7d, + 0x47, 0x73, 0x3e, 0x14, 0x66, 0xec, 0x11, 0x3a, 0xf7, 0xf7, 0xf9, 0x80, 0xbd, 0xe8, 0x39, 0x1c, + 0x23, 0xed, 0x1f, 0xb0, 0x09, 0x12, 0x12, 0x9e, 0xf4, 0x16, 0x0b, 0xe8, 0x11, 0xcf, 0xd7, 0x58, + 0x42, 0xd7, 0x2a, 0xe5, 0xb6, 0xee, 0x89, 0x96, 0x05, 0xcc, 0x42, 0xcf, 0xcb, 0x24, 0x83, 0x2f, + 0x5e, 0x70, 0xf7, 0xc0, 0x2c, 0x6e, 0xeb, 0x0e, 0xf6, 0x6a, 0xc9, 0x04, 0x18, 0x07, 0x31, 0xff, + 0x03, 0x7a, 0x96, 0x70, 0xd0, 0x35, 0x22, 0xd0, 0xfd, 0x35, 0x8a, 0x68, 0x7f, 0x62, 0x61, 0xd4, + 0xc4, 0x68, 0xa6, 0x0f, 0xd6, 0x2f, 0xc8, 0x70, 0xa2, 0x61, 0x6e, 0x6d, 0x75, 0xb0, 0x27, 0x26, + 0x4c, 0xbd, 0x33, 0x91, 0x36, 0x4a, 0xb8, 0xc8, 0x4e, 0x90, 0xf9, 0x80, 0xee, 0x1f, 0x25, 0x73, + 0x5f, 0xf8, 0x13, 0x53, 0xb1, 0xb3, 0x28, 0x22, 0xae, 0xbe, 0x7c, 0x46, 0xa0, 0x20, 0x16, 0xf0, + 0x59, 0x98, 0x6c, 0xfa, 0x40, 0x7c, 0x51, 0x82, 0x59, 0x7a, 0x73, 0xa5, 0xa7, 0xa0, 0xf7, 0x8d, + 0x10, 0x00, 0xf4, 0xdd, 0x8c, 0xa8, 0x9f, 0x2d, 0x91, 0x09, 0xc7, 0x49, 0x84, 0x88, 0xc5, 0x82, + 0xaa, 0x0c, 0x24, 0x97, 0xbe, 0x68, 0xff, 0x58, 0x86, 0xe9, 0x65, 0xec, 0xb5, 0x34, 0x3b, 0x71, + 0x4f, 0x74, 0x06, 0x66, 0xc8, 0xf5, 0x6d, 0x35, 0x76, 0x4c, 0x92, 0xae, 0x9a, 0x71, 0x69, 0xca, + 0x75, 0x30, 0x7b, 0x1e, 0x6f, 0x9a, 0x16, 0xae, 0x71, 0x67, 0x29, 0xf9, 0xc4, 0x88, 0xf0, 0x74, + 0x5c, 0x1c, 0xb4, 0x05, 0x1e, 0x9b, 0x9b, 0xf6, 0x0b, 0x33, 0x54, 0x95, 0x88, 0x31, 0xe7, 0x29, + 0x30, 0xc9, 0x90, 0xf7, 0xcc, 0xb4, 0xb8, 0x7e, 0xd1, 0xcf, 0x8b, 0x5e, 0xeb, 0x23, 0x5a, 0xe6, + 0x10, 0x7d, 0x62, 0x12, 0x26, 0xc6, 0x72, 0xbf, 0x7b, 0x21, 0x54, 0xfe, 0xc2, 0xa5, 0x4a, 0xdb, + 0x46, 0x6b, 0xc9, 0x30, 0x3d, 0x0d, 0xe0, 0x37, 0x0e, 0x2f, 0xac, 0x45, 0x28, 0x85, 0x8f, 0x5c, + 0x1f, 0x7b, 0x50, 0xaf, 0x57, 0x1c, 0x84, 0x9d, 0x11, 0x03, 0x23, 0x76, 0xc0, 0x4f, 0x84, 0x93, + 0xf4, 0xd1, 0xf9, 0xb4, 0x0c, 0x27, 0xfc, 0xf3, 0x47, 0xab, 0x9a, 0x1d, 0xb4, 0xbb, 0x52, 0x32, + 0x88, 0xb8, 0x03, 0x1f, 0x7e, 0x63, 0xf9, 0x56, 0xb2, 0x31, 0xa3, 0x2f, 0x27, 0xa3, 0x45, 0x47, + 0xb9, 0x09, 0x8e, 0x19, 0xbb, 0x3b, 0xbe, 0xd4, 0x49, 0x8b, 0x67, 0x2d, 0x7c, 0xff, 0x87, 0x24, + 0x23, 0x93, 0x08, 0xf3, 0x63, 0x99, 0x53, 0x72, 0x47, 0xba, 0x9e, 0x90, 0x08, 0x46, 0xf4, 0xcf, + 0x99, 0x44, 0xbd, 0xdb, 0xe0, 0x33, 0x5f, 0x09, 0x7a, 0xa9, 0x43, 0x3c, 0xf0, 0x75, 0x66, 0x02, + 0x72, 0xe5, 0x9d, 0xae, 0x73, 0xe9, 0xcc, 0x63, 0x61, 0xb6, 0xee, 0x58, 0x58, 0xdb, 0x09, 0xed, + 0x0c, 0x38, 0xe6, 0x05, 0x6c, 0x78, 0x3b, 0x03, 0xe4, 0xe5, 0xf6, 0xdb, 0x60, 0xc2, 0x30, 0x9b, + 0xda, 0xae, 0xb3, 0xad, 0x5c, 0xbd, 0xef, 0x48, 0x3d, 0x03, 0xbf, 0xc6, 0x62, 0x18, 0x7d, 0xe5, + 0x0e, 0xb2, 0x36, 0x9c, 0x37, 0xcc, 0xe2, 0xae, 0xb3, 0xbd, 0x70, 0xd5, 0xc7, 0xff, 0xe6, 0x74, + 0xe6, 0x33, 0x7f, 0x73, 0x3a, 0xf3, 0xe5, 0xbf, 0x39, 0x9d, 0xf9, 0x95, 0xaf, 0x9e, 0x3e, 0xf2, + 0x99, 0xaf, 0x9e, 0x3e, 0xf2, 0xc5, 0xaf, 0x9e, 0x3e, 0xf2, 0x93, 0x52, 0xf7, 0xfc, 0xf9, 0x3c, + 0xa1, 0xf2, 0xa4, 0xff, 0x37, 0x00, 0x00, 0xff, 0xff, 0xcb, 0xc4, 0xd4, 0x2d, 0x0c, 0x0a, 0x02, + 0x00, } func (m *Rpc) Marshal() (dAtA []byte, err error) { @@ -76743,6 +76978,13 @@ func (m *RpcAccountCreateRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) _ = i var l int _ = l + if len(m.JsonApiListenAddr) > 0 { + i -= len(m.JsonApiListenAddr) + copy(dAtA[i:], m.JsonApiListenAddr) + i = encodeVarintCommands(dAtA, i, uint64(len(m.JsonApiListenAddr))) + i-- + dAtA[i] = 0x4a + } if m.PreferYamuxTransport { i-- if m.PreferYamuxTransport { @@ -77329,6 +77571,13 @@ func (m *RpcAccountSelectRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) _ = i var l int _ = l + if len(m.JsonApiListenAddr) > 0 { + i -= len(m.JsonApiListenAddr) + copy(dAtA[i:], m.JsonApiListenAddr) + i = encodeVarintCommands(dAtA, i, uint64(len(m.JsonApiListenAddr))) + i-- + dAtA[i] = 0x3a + } if m.PreferYamuxTransport { i-- if m.PreferYamuxTransport { @@ -78178,6 +78427,129 @@ func (m *RpcAccountEnableLocalNetworkSyncResponseError) MarshalToSizedBuffer(dAt return len(dAtA) - i, nil } +func (m *RpcAccountChangeJsonApiAddr) 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 *RpcAccountChangeJsonApiAddr) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *RpcAccountChangeJsonApiAddr) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + return len(dAtA) - i, nil +} + +func (m *RpcAccountChangeJsonApiAddrRequest) 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 *RpcAccountChangeJsonApiAddrRequest) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *RpcAccountChangeJsonApiAddrRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.ListenAddr) > 0 { + i -= len(m.ListenAddr) + copy(dAtA[i:], m.ListenAddr) + i = encodeVarintCommands(dAtA, i, uint64(len(m.ListenAddr))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *RpcAccountChangeJsonApiAddrResponse) 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 *RpcAccountChangeJsonApiAddrResponse) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *RpcAccountChangeJsonApiAddrResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.Error != nil { + { + size, err := m.Error.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintCommands(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + } + return len(dAtA) - i, nil +} + +func (m *RpcAccountChangeJsonApiAddrResponseError) 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 *RpcAccountChangeJsonApiAddrResponseError) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *RpcAccountChangeJsonApiAddrResponseError) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.Description) > 0 { + i -= len(m.Description) + copy(dAtA[i:], m.Description) + i = encodeVarintCommands(dAtA, i, uint64(len(m.Description))) + i-- + dAtA[i] = 0x12 + } + if m.Code != 0 { + i = encodeVarintCommands(dAtA, i, uint64(m.Code)) + i-- + dAtA[i] = 0x8 + } + return len(dAtA) - i, nil +} + func (m *RpcAccountChangeNetworkConfigAndRestart) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -119977,6 +120349,10 @@ func (m *RpcAccountCreateRequest) Size() (n int) { if m.PreferYamuxTransport { n += 2 } + l = len(m.JsonApiListenAddr) + if l > 0 { + n += 1 + l + sovCommands(uint64(l)) + } return n } @@ -120212,6 +120588,10 @@ func (m *RpcAccountSelectRequest) Size() (n int) { if m.PreferYamuxTransport { n += 2 } + l = len(m.JsonApiListenAddr) + if l > 0 { + n += 1 + l + sovCommands(uint64(l)) + } return n } @@ -120544,6 +120924,57 @@ func (m *RpcAccountEnableLocalNetworkSyncResponseError) Size() (n int) { return n } +func (m *RpcAccountChangeJsonApiAddr) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + return n +} + +func (m *RpcAccountChangeJsonApiAddrRequest) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.ListenAddr) + if l > 0 { + n += 1 + l + sovCommands(uint64(l)) + } + return n +} + +func (m *RpcAccountChangeJsonApiAddrResponse) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Error != nil { + l = m.Error.Size() + n += 1 + l + sovCommands(uint64(l)) + } + return n +} + +func (m *RpcAccountChangeJsonApiAddrResponseError) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Code != 0 { + n += 1 + sovCommands(uint64(m.Code)) + } + l = len(m.Description) + if l > 0 { + n += 1 + l + sovCommands(uint64(l)) + } + return n +} + func (m *RpcAccountChangeNetworkConfigAndRestart) Size() (n int) { if m == nil { return 0 @@ -146926,6 +147357,38 @@ func (m *RpcAccountCreateRequest) Unmarshal(dAtA []byte) error { } } m.PreferYamuxTransport = bool(v != 0) + case 9: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field JsonApiListenAddr", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowCommands + } + 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 ErrInvalidLengthCommands + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthCommands + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.JsonApiListenAddr = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipCommands(dAtA[iNdEx:]) @@ -148373,6 +148836,38 @@ func (m *RpcAccountSelectRequest) Unmarshal(dAtA []byte) error { } } m.PreferYamuxTransport = bool(v != 0) + case 7: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field JsonApiListenAddr", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowCommands + } + 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 ErrInvalidLengthCommands + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthCommands + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.JsonApiListenAddr = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipCommands(dAtA[iNdEx:]) @@ -150469,6 +150964,325 @@ func (m *RpcAccountEnableLocalNetworkSyncResponseError) Unmarshal(dAtA []byte) e } return nil } +func (m *RpcAccountChangeJsonApiAddr) 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 ErrIntOverflowCommands + } + 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: ChangeJsonApiAddr: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ChangeJsonApiAddr: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + default: + iNdEx = preIndex + skippy, err := skipCommands(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthCommands + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *RpcAccountChangeJsonApiAddrRequest) 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 ErrIntOverflowCommands + } + 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: Request: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Request: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ListenAddr", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowCommands + } + 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 ErrInvalidLengthCommands + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthCommands + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.ListenAddr = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipCommands(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthCommands + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *RpcAccountChangeJsonApiAddrResponse) 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 ErrIntOverflowCommands + } + 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: Response: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Response: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Error", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowCommands + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthCommands + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthCommands + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Error == nil { + m.Error = &RpcAccountChangeJsonApiAddrResponseError{} + } + if err := m.Error.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipCommands(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthCommands + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *RpcAccountChangeJsonApiAddrResponseError) 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 ErrIntOverflowCommands + } + 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: Error: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Error: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Code", wireType) + } + m.Code = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowCommands + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Code |= RpcAccountChangeJsonApiAddrResponseErrorCode(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Description", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowCommands + } + 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 ErrInvalidLengthCommands + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthCommands + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Description = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipCommands(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthCommands + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} func (m *RpcAccountChangeNetworkConfigAndRestart) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 diff --git a/pb/protos/commands.proto b/pb/protos/commands.proto index 088a7e399..eadc70d50 100644 --- a/pb/protos/commands.proto +++ b/pb/protos/commands.proto @@ -703,6 +703,7 @@ message Rpc { NetworkMode networkMode = 6; // optional, default is DefaultConfig string networkCustomConfigFilePath = 7; // config path for the custom network mode } bool preferYamuxTransport = 8; // optional, default is false, recommended in case of problems with QUIC transport + string jsonApiListenAddr = 9; // optional, if empty json api will not be started; 127.0.0.1:31009 should be the default one } /** * Middleware-to-front-end response for an account creation request, that can contain a NULL error and created account or a non-NULL error and an empty account @@ -824,6 +825,7 @@ message Rpc { NetworkMode networkMode = 4; // optional, default is DefaultConfig string networkCustomConfigFilePath = 5; // config path for the custom network mode bool preferYamuxTransport = 6; // optional, default is false, recommended in case of problems with QUIC transport + string jsonApiListenAddr = 7; // optional, if empty json api will not be started; 127.0.0.1:31009 should be the default one } /** @@ -1033,6 +1035,28 @@ message Rpc { } + message ChangeJsonApiAddr { + message Request { + string listenAddr = 1; // make sure to use 127.0.0.1:x to not listen on all interfaces; recommended value is 127.0.0.1:31009 + } + message Response { + Error error = 2; + + message Error { + Code code = 1; + string description = 2; + + enum Code { + NULL = 0; + UNKNOWN_ERROR = 1; + BAD_INPUT = 2; + ACCOUNT_IS_NOT_RUNNING = 4; + } + } + } + + } + message ChangeNetworkConfigAndRestart { message Request { NetworkMode networkMode = 1; diff --git a/pb/protos/service/service.proto b/pb/protos/service/service.proto index 36579a606..f892260ea 100644 --- a/pb/protos/service/service.proto +++ b/pb/protos/service/service.proto @@ -41,6 +41,8 @@ service ClientCommands { rpc AccountRevertDeletion (anytype.Rpc.Account.RevertDeletion.Request) returns (anytype.Rpc.Account.RevertDeletion.Response); rpc AccountSelect (anytype.Rpc.Account.Select.Request) returns (anytype.Rpc.Account.Select.Response); rpc AccountEnableLocalNetworkSync (anytype.Rpc.Account.EnableLocalNetworkSync.Request) returns (anytype.Rpc.Account.EnableLocalNetworkSync.Response); + rpc AccountChangeJsonApiAddr (anytype.Rpc.Account.ChangeJsonApiAddr.Request) returns (anytype.Rpc.Account.ChangeJsonApiAddr.Response); + rpc AccountStop (anytype.Rpc.Account.Stop.Request) returns (anytype.Rpc.Account.Stop.Response); rpc AccountMove (anytype.Rpc.Account.Move.Request) returns (anytype.Rpc.Account.Move.Response); rpc AccountConfigUpdate (anytype.Rpc.Account.ConfigUpdate.Request) returns (anytype.Rpc.Account.ConfigUpdate.Response); diff --git a/pb/service/service.pb.go b/pb/service/service.pb.go index 8adc4974b..576bbccd5 100644 --- a/pb/service/service.pb.go +++ b/pb/service/service.pb.go @@ -26,343 +26,344 @@ const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package func init() { proto.RegisterFile("pb/protos/service/service.proto", fileDescriptor_93a29dc403579097) } var fileDescriptor_93a29dc403579097 = []byte{ - // 5364 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x9d, 0xdf, 0x6f, 0x24, 0x49, - 0x52, 0xf8, 0xd7, 0x2f, 0xdf, 0xfd, 0x52, 0xc7, 0x2d, 0xd0, 0x0b, 0xcb, 0xde, 0x72, 0x37, 0xbf, - 0x76, 0xc6, 0xf6, 0x8c, 0xed, 0xf6, 0xec, 0xcc, 0xce, 0xee, 0xe9, 0x0e, 0x09, 0x79, 0xec, 0xb1, - 0xd7, 0x9c, 0xed, 0x31, 0xee, 0xf6, 0x8c, 0xb4, 0x12, 0x12, 0xe9, 0xea, 0x74, 0xbb, 0x70, 0x75, - 0x65, 0x5d, 0x55, 0x76, 0x7b, 0xfa, 0x10, 0x08, 0x04, 0x02, 0x81, 0x40, 0x9c, 0xf8, 0xf5, 0x8a, - 0xc4, 0x5f, 0xc3, 0xe3, 0x3d, 0xf2, 0x88, 0x76, 0x9f, 0xef, 0x7f, 0x40, 0x95, 0x95, 0x95, 0x3f, - 0xa2, 0x22, 0xb2, 0xca, 0xf7, 0x34, 0xa3, 0x8e, 0x4f, 0x44, 0x64, 0x56, 0x66, 0x46, 0x46, 0x66, - 0x65, 0xa5, 0xa3, 0xbb, 0xf9, 0xc5, 0x76, 0x5e, 0x08, 0x29, 0xca, 0xed, 0x92, 0x17, 0x8b, 0x24, - 0xe6, 0xcd, 0xbf, 0x43, 0xf5, 0xf3, 0xe0, 0x7d, 0x96, 0x2d, 0xe5, 0x32, 0xe7, 0x9f, 0x7c, 0x6c, - 0xc9, 0x58, 0xcc, 0x66, 0x2c, 0x9b, 0x94, 0x35, 0xf2, 0xc9, 0x47, 0x56, 0xc2, 0x17, 0x3c, 0x93, - 0xfa, 0xf7, 0x67, 0xbf, 0xfc, 0xe5, 0x4a, 0xf4, 0xc1, 0x6e, 0x9a, 0xf0, 0x4c, 0xee, 0x6a, 0x8d, - 0xc1, 0xd7, 0xd1, 0x77, 0x77, 0xf2, 0xfc, 0x80, 0xcb, 0x37, 0xbc, 0x28, 0x13, 0x91, 0x0d, 0x3e, - 0x1d, 0x6a, 0x07, 0xc3, 0xb3, 0x3c, 0x1e, 0xee, 0xe4, 0xf9, 0xd0, 0x0a, 0x87, 0x67, 0xfc, 0xa7, - 0x73, 0x5e, 0xca, 0x4f, 0x1e, 0x86, 0xa1, 0x32, 0x17, 0x59, 0xc9, 0x07, 0x97, 0xd1, 0x6f, 0xed, - 0xe4, 0xf9, 0x88, 0xcb, 0x3d, 0x5e, 0x55, 0x60, 0x24, 0x99, 0xe4, 0x83, 0xb5, 0x96, 0xaa, 0x0f, - 0x18, 0x1f, 0xeb, 0xdd, 0xa0, 0xf6, 0x33, 0x8e, 0xbe, 0x53, 0xf9, 0xb9, 0x9a, 0xcb, 0x89, 0xb8, - 0xc9, 0x06, 0xf7, 0xdb, 0x8a, 0x5a, 0x64, 0x6c, 0x3f, 0x08, 0x21, 0xda, 0xea, 0xdb, 0xe8, 0xd7, - 0xdf, 0xb2, 0x34, 0xe5, 0x72, 0xb7, 0xe0, 0x55, 0xc1, 0x7d, 0x9d, 0x5a, 0x34, 0xac, 0x65, 0xc6, - 0xee, 0xa7, 0x41, 0x46, 0x1b, 0xfe, 0x3a, 0xfa, 0x6e, 0x2d, 0x39, 0xe3, 0xb1, 0x58, 0xf0, 0x62, - 0x80, 0x6a, 0x69, 0x21, 0xf1, 0xc8, 0x5b, 0x10, 0xb4, 0xbd, 0x2b, 0xb2, 0x05, 0x2f, 0x24, 0x6e, - 0x5b, 0x0b, 0xc3, 0xb6, 0x2d, 0xa4, 0x6d, 0xff, 0xfd, 0x4a, 0xf4, 0xfd, 0x9d, 0x38, 0x16, 0xf3, - 0x4c, 0x1e, 0x89, 0x98, 0xa5, 0x47, 0x49, 0x76, 0x7d, 0xc2, 0x6f, 0x76, 0xaf, 0x2a, 0x3e, 0x9b, - 0xf2, 0xc1, 0x73, 0xff, 0xa9, 0xd6, 0xe8, 0xd0, 0xb0, 0x43, 0x17, 0x36, 0xbe, 0x3f, 0xbf, 0x9d, - 0x92, 0x2e, 0xcb, 0x3f, 0xaf, 0x44, 0x77, 0x60, 0x59, 0x46, 0x22, 0x5d, 0x70, 0x5b, 0x9a, 0x17, - 0x1d, 0x86, 0x7d, 0xdc, 0x94, 0xe7, 0x8b, 0xdb, 0xaa, 0xe9, 0x12, 0xa5, 0xd1, 0x87, 0x6e, 0x77, - 0x19, 0xf1, 0x52, 0x0d, 0xa7, 0xc7, 0x74, 0x8f, 0xd0, 0x88, 0xf1, 0xfc, 0xa4, 0x0f, 0xaa, 0xbd, - 0x25, 0xd1, 0x40, 0x7b, 0x4b, 0x45, 0x69, 0x9c, 0xad, 0xa3, 0x16, 0x1c, 0xc2, 0xf8, 0x7a, 0xdc, - 0x83, 0xd4, 0xae, 0xfe, 0x24, 0xfa, 0x8d, 0xb7, 0xa2, 0xb8, 0x2e, 0x73, 0x16, 0x73, 0x3d, 0x14, - 0x1e, 0xf9, 0xda, 0x8d, 0x14, 0x8e, 0x86, 0xd5, 0x2e, 0xcc, 0xe9, 0xb4, 0x8d, 0xf0, 0x75, 0xce, - 0x61, 0x0c, 0xb2, 0x8a, 0x95, 0x90, 0xea, 0xb4, 0x10, 0xd2, 0xb6, 0xaf, 0xa3, 0x81, 0xb5, 0x7d, - 0xf1, 0xa7, 0x3c, 0x96, 0x3b, 0x93, 0x09, 0x6c, 0x15, 0xab, 0xab, 0x88, 0xe1, 0xce, 0x64, 0x42, - 0xb5, 0x0a, 0x8e, 0x6a, 0x67, 0x37, 0xd1, 0x47, 0xc0, 0xd9, 0x51, 0x52, 0x2a, 0x87, 0x5b, 0x61, - 0x2b, 0x1a, 0x33, 0x4e, 0x87, 0x7d, 0x71, 0xed, 0xf8, 0x2f, 0x57, 0xa2, 0xef, 0x21, 0x9e, 0xcf, - 0xf8, 0x4c, 0x2c, 0xf8, 0xe0, 0x69, 0xb7, 0xb5, 0x9a, 0x34, 0xfe, 0x3f, 0xbb, 0x85, 0x06, 0xd2, - 0x4d, 0x46, 0x3c, 0xe5, 0xb1, 0x24, 0xbb, 0x49, 0x2d, 0xee, 0xec, 0x26, 0x06, 0x73, 0x46, 0x58, - 0x23, 0x3c, 0xe0, 0x72, 0x77, 0x5e, 0x14, 0x3c, 0x93, 0x64, 0x5b, 0x5a, 0xa4, 0xb3, 0x2d, 0x3d, - 0x14, 0xa9, 0xcf, 0x01, 0x97, 0x3b, 0x69, 0x4a, 0xd6, 0xa7, 0x16, 0x77, 0xd6, 0xc7, 0x60, 0xda, - 0x43, 0x1c, 0xfd, 0xa6, 0xf3, 0xc4, 0xe4, 0x61, 0x76, 0x29, 0x06, 0xf4, 0xb3, 0x50, 0x72, 0xe3, - 0x63, 0xad, 0x93, 0x43, 0xaa, 0xf1, 0xea, 0x5d, 0x2e, 0x0a, 0xba, 0x59, 0x6a, 0x71, 0x67, 0x35, - 0x0c, 0xa6, 0x3d, 0xfc, 0x71, 0xf4, 0x81, 0x8e, 0x92, 0xcd, 0x7c, 0xf6, 0x10, 0x0d, 0xa1, 0x70, - 0x42, 0x7b, 0xd4, 0x41, 0xd9, 0xe0, 0xa0, 0x65, 0x3a, 0xf8, 0x7c, 0x8a, 0xea, 0x81, 0xd0, 0xf3, - 0x30, 0x0c, 0xb5, 0x6c, 0xef, 0xf1, 0x94, 0x93, 0xb6, 0x6b, 0x61, 0x87, 0x6d, 0x03, 0x69, 0xdb, - 0x45, 0xf4, 0x3b, 0xe6, 0xb1, 0x54, 0xf3, 0xa8, 0x92, 0x57, 0x41, 0x7a, 0x83, 0xa8, 0xb7, 0x0b, - 0x19, 0x5f, 0x9b, 0xfd, 0xe0, 0x56, 0x7d, 0xf4, 0x08, 0xc4, 0xeb, 0x03, 0xc6, 0xdf, 0xc3, 0x30, - 0xa4, 0x6d, 0xff, 0xc3, 0x4a, 0xf4, 0x03, 0x2d, 0x7b, 0x95, 0xb1, 0x8b, 0x94, 0xab, 0x29, 0xf1, - 0x84, 0xcb, 0x1b, 0x51, 0x5c, 0x8f, 0x96, 0x59, 0x4c, 0x4c, 0xff, 0x38, 0xdc, 0x31, 0xfd, 0x93, - 0x4a, 0x4e, 0xc6, 0xa7, 0x2b, 0x2a, 0x45, 0x0e, 0x33, 0xbe, 0xa6, 0x06, 0x52, 0xe4, 0x54, 0xc6, - 0xe7, 0x23, 0x2d, 0xab, 0xc7, 0x55, 0xd8, 0xc4, 0xad, 0x1e, 0xbb, 0x71, 0xf2, 0x41, 0x08, 0xb1, - 0x61, 0xab, 0xe9, 0xc0, 0x22, 0xbb, 0x4c, 0xa6, 0xe7, 0xf9, 0xa4, 0xea, 0xc6, 0x8f, 0xf1, 0x1e, - 0xea, 0x20, 0x44, 0xd8, 0x22, 0x50, 0xed, 0xed, 0x9f, 0x6c, 0x62, 0xa4, 0x87, 0xd2, 0x7e, 0x21, - 0x66, 0x47, 0x7c, 0xca, 0xe2, 0xa5, 0x1e, 0xff, 0x9f, 0x87, 0x06, 0x1e, 0xa4, 0x4d, 0x21, 0x5e, - 0xdc, 0x52, 0x4b, 0x97, 0xe7, 0x3f, 0x57, 0xa2, 0x87, 0x4d, 0xf5, 0xaf, 0x58, 0x36, 0xe5, 0xba, - 0x3d, 0xeb, 0xd2, 0xef, 0x64, 0x93, 0x33, 0x5e, 0x4a, 0x56, 0xc8, 0xc1, 0x8f, 0xf0, 0x4a, 0x86, - 0x74, 0x4c, 0xd9, 0x7e, 0xfc, 0x2b, 0xe9, 0xda, 0x56, 0x1f, 0x55, 0x81, 0x4d, 0x87, 0x00, 0xbf, - 0xd5, 0x95, 0x04, 0x06, 0x80, 0x07, 0x21, 0xc4, 0xb6, 0xba, 0x12, 0x1c, 0x66, 0x8b, 0x44, 0xf2, - 0x03, 0x9e, 0xf1, 0xa2, 0xdd, 0xea, 0xb5, 0xaa, 0x8f, 0x10, 0xad, 0x4e, 0xa0, 0x36, 0xd8, 0x78, - 0xde, 0xcc, 0xe4, 0xb8, 0x11, 0x30, 0xd2, 0x9a, 0x1e, 0x37, 0xfb, 0xc1, 0x76, 0x75, 0xe7, 0xf8, - 0x3c, 0xe3, 0x0b, 0x71, 0x0d, 0x57, 0x77, 0xae, 0x89, 0x1a, 0x20, 0x56, 0x77, 0x28, 0x68, 0x67, - 0x30, 0xc7, 0xcf, 0x9b, 0x84, 0xdf, 0x80, 0x19, 0xcc, 0x55, 0xae, 0xc4, 0xc4, 0x0c, 0x86, 0x60, - 0xda, 0xc3, 0x49, 0xf4, 0x6b, 0x4a, 0xf8, 0x87, 0x22, 0xc9, 0x06, 0x77, 0x11, 0xa5, 0x4a, 0x60, - 0xac, 0xde, 0xa3, 0x01, 0x50, 0xe2, 0xea, 0xd7, 0x5d, 0x96, 0xc5, 0x3c, 0x45, 0x4b, 0x6c, 0xc5, - 0xc1, 0x12, 0x7b, 0x98, 0x4d, 0x1d, 0x94, 0xb0, 0x8a, 0x5f, 0xa3, 0x2b, 0x56, 0x24, 0xd9, 0x74, - 0x80, 0xe9, 0x3a, 0x72, 0x22, 0x75, 0xc0, 0x38, 0xd0, 0x85, 0xb5, 0xe2, 0x4e, 0x9e, 0x17, 0x55, - 0x58, 0xc4, 0xba, 0xb0, 0x8f, 0x04, 0xbb, 0x70, 0x0b, 0xc5, 0xbd, 0xed, 0xf1, 0x38, 0x4d, 0xb2, - 0xa0, 0x37, 0x8d, 0xf4, 0xf1, 0x66, 0x51, 0xd0, 0x79, 0x8f, 0x38, 0x5b, 0xf0, 0xa6, 0x66, 0xd8, - 0x93, 0x71, 0x81, 0x60, 0xe7, 0x05, 0xa0, 0x5d, 0xa7, 0x29, 0xf1, 0x31, 0xbb, 0xe6, 0xd5, 0x03, - 0xe6, 0xd5, 0xbc, 0x36, 0xc0, 0xf4, 0x3d, 0x82, 0x58, 0xa7, 0xe1, 0xa4, 0x76, 0x35, 0x8f, 0x3e, - 0x52, 0xf2, 0x53, 0x56, 0xc8, 0x24, 0x4e, 0x72, 0x96, 0x35, 0xf9, 0x3f, 0x36, 0xae, 0x5b, 0x94, - 0x71, 0xb9, 0xd5, 0x93, 0xd6, 0x6e, 0xff, 0x63, 0x25, 0xba, 0x0f, 0xfd, 0x9e, 0xf2, 0x62, 0x96, - 0xa8, 0x65, 0x64, 0x59, 0x07, 0xe1, 0xc1, 0x97, 0x61, 0xa3, 0x2d, 0x05, 0x53, 0x9a, 0x1f, 0xde, - 0x5e, 0xd1, 0x26, 0x43, 0x23, 0x9d, 0x5a, 0xbf, 0x2e, 0x26, 0xad, 0x6d, 0x96, 0x51, 0x93, 0x2f, - 0x2b, 0x21, 0x91, 0x0c, 0xb5, 0x20, 0x30, 0xc2, 0xcf, 0xb3, 0xb2, 0xb1, 0x8e, 0x8d, 0x70, 0x2b, - 0x0e, 0x8e, 0x70, 0x0f, 0xb3, 0x23, 0xfc, 0x74, 0x7e, 0x91, 0x26, 0xe5, 0x55, 0x92, 0x4d, 0x75, - 0xe6, 0xeb, 0xeb, 0x5a, 0x31, 0x4c, 0x7e, 0xd7, 0x3a, 0x39, 0xcc, 0x89, 0xee, 0x2c, 0xa4, 0x13, - 0xd0, 0x4d, 0xd6, 0x3a, 0x39, 0xbb, 0x3e, 0xb0, 0xd2, 0x6a, 0xe5, 0x08, 0xd6, 0x07, 0x8e, 0x6a, - 0x25, 0x25, 0xd6, 0x07, 0x6d, 0x4a, 0x9b, 0x17, 0xd1, 0x6f, 0xbb, 0x75, 0x28, 0x45, 0xba, 0xe0, - 0xe7, 0x45, 0x32, 0x78, 0x42, 0x97, 0xaf, 0x61, 0x8c, 0xab, 0x8d, 0x5e, 0xac, 0x0d, 0x54, 0x96, - 0x38, 0xe0, 0x72, 0x24, 0x99, 0x9c, 0x97, 0x20, 0x50, 0x39, 0x36, 0x0c, 0x42, 0x04, 0x2a, 0x02, - 0xd5, 0xde, 0xfe, 0x28, 0x8a, 0xea, 0x45, 0xb7, 0xda, 0x18, 0xf1, 0xe7, 0x1e, 0xbd, 0x1a, 0xf7, - 0x76, 0x45, 0xee, 0x07, 0x08, 0x9b, 0xf0, 0xd4, 0xbf, 0xab, 0xfd, 0x9e, 0x01, 0xaa, 0xa1, 0x44, - 0x44, 0xc2, 0x03, 0x10, 0x58, 0xd0, 0xd1, 0x95, 0xb8, 0xc1, 0x0b, 0x5a, 0x49, 0xc2, 0x05, 0xd5, - 0x84, 0xdd, 0x81, 0xd5, 0x05, 0xc5, 0x76, 0x60, 0x9b, 0x62, 0x84, 0x76, 0x60, 0x21, 0x63, 0xfb, - 0x8c, 0x6b, 0xf8, 0xa5, 0x10, 0xd7, 0x33, 0x56, 0x5c, 0x83, 0x3e, 0xe3, 0x29, 0x37, 0x0c, 0xd1, - 0x67, 0x28, 0xd6, 0xf6, 0x19, 0xd7, 0x61, 0x95, 0x2e, 0x9f, 0x17, 0x29, 0xe8, 0x33, 0x9e, 0x0d, - 0x8d, 0x10, 0x7d, 0x86, 0x40, 0x6d, 0x74, 0x72, 0xbd, 0x8d, 0x38, 0x5c, 0xf3, 0x7b, 0xea, 0x23, - 0x4e, 0xad, 0xf9, 0x11, 0x0c, 0x76, 0xa1, 0x83, 0x82, 0xe5, 0x57, 0x78, 0x17, 0x52, 0xa2, 0x70, - 0x17, 0x6a, 0x10, 0xd8, 0xde, 0x23, 0xce, 0x8a, 0xf8, 0x0a, 0x6f, 0xef, 0x5a, 0x16, 0x6e, 0x6f, - 0xc3, 0xc0, 0xf6, 0xae, 0x05, 0x6f, 0x13, 0x79, 0x75, 0xcc, 0x25, 0xc3, 0xdb, 0xdb, 0x67, 0xc2, - 0xed, 0xdd, 0x62, 0x6d, 0x3e, 0xee, 0x3a, 0x1c, 0xcd, 0x2f, 0xca, 0xb8, 0x48, 0x2e, 0xf8, 0x20, - 0x60, 0xc5, 0x40, 0x44, 0x3e, 0x4e, 0xc2, 0xda, 0xe7, 0xcf, 0x57, 0xa2, 0xbb, 0x4d, 0xb3, 0x8b, - 0xb2, 0xd4, 0x73, 0x9f, 0xef, 0xfe, 0x05, 0xde, 0xbe, 0x04, 0x4e, 0xec, 0x89, 0xf7, 0x50, 0x73, - 0x72, 0x03, 0xbc, 0x48, 0xe7, 0x59, 0x69, 0x0a, 0xf5, 0x65, 0x1f, 0xeb, 0x8e, 0x02, 0x91, 0x1b, - 0xf4, 0x52, 0xb4, 0x69, 0x99, 0x6e, 0x9f, 0x46, 0x76, 0x38, 0x29, 0x41, 0x5a, 0xd6, 0x3c, 0x6f, - 0x87, 0x20, 0xd2, 0x32, 0x9c, 0x84, 0x5d, 0xe1, 0xa0, 0x10, 0xf3, 0xbc, 0xec, 0xe8, 0x0a, 0x00, - 0x0a, 0x77, 0x85, 0x36, 0xac, 0x7d, 0xbe, 0x8b, 0x7e, 0xd7, 0xed, 0x7e, 0xee, 0xc3, 0xde, 0xa2, - 0xfb, 0x14, 0xf6, 0x88, 0x87, 0x7d, 0x71, 0x9b, 0x51, 0x34, 0x9e, 0xe5, 0x1e, 0x97, 0x2c, 0x49, - 0xcb, 0xc1, 0x2a, 0x6e, 0xa3, 0x91, 0x13, 0x19, 0x05, 0xc6, 0xc1, 0xf8, 0xb6, 0x37, 0xcf, 0xd3, - 0x24, 0x6e, 0xbf, 0x91, 0xd0, 0xba, 0x46, 0x1c, 0x8e, 0x6f, 0x2e, 0x06, 0xe3, 0x75, 0x95, 0xfa, - 0xa9, 0xff, 0x8c, 0x97, 0x39, 0xc7, 0xe3, 0xb5, 0x87, 0x84, 0xe3, 0x35, 0x44, 0x61, 0x7d, 0x46, - 0x5c, 0x1e, 0xb1, 0xa5, 0x98, 0x13, 0xf1, 0xda, 0x88, 0xc3, 0xf5, 0x71, 0x31, 0xbb, 0x36, 0x30, - 0x1e, 0x0e, 0x33, 0xc9, 0x8b, 0x8c, 0xa5, 0xfb, 0x29, 0x9b, 0x96, 0x03, 0x22, 0xc6, 0xf8, 0x14, - 0xb1, 0x36, 0xa0, 0x69, 0xe4, 0x31, 0x1e, 0x96, 0xfb, 0x6c, 0x21, 0x8a, 0x44, 0xd2, 0x8f, 0xd1, - 0x22, 0x9d, 0x8f, 0xd1, 0x43, 0x51, 0x6f, 0x3b, 0x45, 0x7c, 0x95, 0x2c, 0xf8, 0x24, 0xe0, 0xad, - 0x41, 0x7a, 0x78, 0x73, 0x50, 0xa4, 0xd1, 0x46, 0x62, 0x5e, 0xc4, 0x9c, 0x6c, 0xb4, 0x5a, 0xdc, - 0xd9, 0x68, 0x06, 0xd3, 0x1e, 0xfe, 0x66, 0x25, 0xfa, 0xbd, 0x5a, 0xea, 0xbe, 0x26, 0xd8, 0x63, - 0xe5, 0xd5, 0x85, 0x60, 0xc5, 0x64, 0xf0, 0x19, 0x66, 0x07, 0x45, 0x8d, 0xeb, 0x67, 0xb7, 0x51, - 0x81, 0x8f, 0xb5, 0xca, 0xbb, 0xed, 0x88, 0x43, 0x1f, 0xab, 0x87, 0x84, 0x1f, 0x2b, 0x44, 0x61, - 0x00, 0x51, 0xf2, 0x7a, 0x4b, 0x6e, 0x95, 0xd4, 0xf7, 0xf7, 0xe5, 0xd6, 0x3a, 0x39, 0x18, 0x1f, - 0x2b, 0xa1, 0xdf, 0x5b, 0xb6, 0x28, 0x1b, 0x78, 0x8f, 0x19, 0xf6, 0xc5, 0x49, 0xcf, 0x66, 0x54, - 0x84, 0x3d, 0xb7, 0x46, 0xc6, 0xb0, 0x2f, 0x4e, 0x78, 0x76, 0xc2, 0x5a, 0xc8, 0x33, 0x12, 0xda, - 0x86, 0x7d, 0x71, 0x98, 0x7d, 0x69, 0xa6, 0x99, 0x17, 0x9e, 0x04, 0xec, 0xc0, 0xb9, 0x61, 0xa3, - 0x17, 0xab, 0x1d, 0xfe, 0xdd, 0x4a, 0xf4, 0x7d, 0xeb, 0xf1, 0x58, 0x4c, 0x92, 0xcb, 0x65, 0x0d, - 0xbd, 0x61, 0xe9, 0x9c, 0x97, 0x83, 0x67, 0x94, 0xb5, 0x36, 0x6b, 0x4a, 0xf0, 0xfc, 0x56, 0x3a, - 0x70, 0xec, 0xec, 0xe4, 0x79, 0xba, 0x1c, 0xf3, 0x59, 0x9e, 0x92, 0x63, 0xc7, 0x43, 0xc2, 0x63, - 0x07, 0xa2, 0x30, 0x2b, 0x1f, 0x8b, 0x2a, 0xe7, 0x47, 0xb3, 0x72, 0x25, 0x0a, 0x67, 0xe5, 0x0d, - 0x02, 0x73, 0xa5, 0xb1, 0xd8, 0x15, 0x69, 0xca, 0x63, 0xd9, 0x3e, 0x6a, 0x60, 0x34, 0x2d, 0x11, - 0xce, 0x95, 0x00, 0x69, 0x77, 0xe5, 0x9a, 0x35, 0x24, 0x2b, 0xf8, 0xcb, 0xe5, 0x51, 0x92, 0x5d, - 0x0f, 0xf0, 0xb4, 0xc0, 0x02, 0xc4, 0xae, 0x1c, 0x0a, 0xc2, 0xb5, 0xea, 0x79, 0x36, 0x11, 0xf8, - 0x5a, 0xb5, 0x92, 0x84, 0xd7, 0xaa, 0x9a, 0x80, 0x26, 0xcf, 0x38, 0x65, 0xb2, 0x92, 0x84, 0x4d, - 0x6a, 0x02, 0x0b, 0x85, 0xfa, 0xdd, 0x0d, 0x19, 0x0a, 0xc1, 0xdb, 0x9a, 0xb5, 0x4e, 0x0e, 0xf6, - 0xd0, 0x66, 0xd1, 0xba, 0xcf, 0x65, 0x7c, 0x85, 0xf7, 0x50, 0x0f, 0x09, 0xf7, 0x50, 0x88, 0xc2, - 0x2a, 0x8d, 0x85, 0x59, 0x74, 0xaf, 0xe2, 0xfd, 0xa3, 0xb5, 0xe0, 0x5e, 0xeb, 0xe4, 0xe0, 0x32, - 0xf2, 0x70, 0xa6, 0x9e, 0x19, 0xda, 0xc9, 0x6b, 0x59, 0x78, 0x19, 0x69, 0x18, 0x58, 0xfa, 0x5a, - 0xa0, 0xf6, 0xb2, 0x56, 0x69, 0x45, 0x6f, 0x37, 0x6b, 0xad, 0x93, 0xd3, 0x4e, 0xfe, 0xcd, 0x2c, - 0xe3, 0x6a, 0xe9, 0x89, 0xa8, 0xc6, 0xc8, 0x1b, 0x96, 0x26, 0x13, 0x26, 0xf9, 0x58, 0x5c, 0xf3, - 0x0c, 0x5f, 0x31, 0xe9, 0xd2, 0xd6, 0xfc, 0xd0, 0x53, 0x08, 0xaf, 0x98, 0xc2, 0x8a, 0xb0, 0x9f, - 0xd4, 0xf4, 0x79, 0xc9, 0x77, 0x59, 0x49, 0x44, 0x32, 0x0f, 0x09, 0xf7, 0x13, 0x88, 0xc2, 0x7c, - 0xb5, 0x96, 0xbf, 0x7a, 0x97, 0xf3, 0x22, 0xe1, 0x59, 0xcc, 0xf1, 0x7c, 0x15, 0x52, 0xe1, 0x7c, - 0x15, 0xa1, 0xe1, 0x5a, 0x6d, 0x8f, 0x49, 0xfe, 0x72, 0x39, 0x4e, 0x66, 0xbc, 0x94, 0x6c, 0x96, - 0xe3, 0x6b, 0x35, 0x00, 0x85, 0xd7, 0x6a, 0x6d, 0xb8, 0xb5, 0x35, 0x64, 0x02, 0x62, 0xfb, 0x84, - 0x12, 0x24, 0x02, 0x27, 0x94, 0x08, 0x14, 0x3e, 0x58, 0x0b, 0xa0, 0x2f, 0x09, 0x5a, 0x56, 0x82, - 0x2f, 0x09, 0x68, 0xba, 0xb5, 0xe1, 0x66, 0x98, 0x51, 0x35, 0x34, 0x3b, 0x8a, 0x3e, 0x72, 0x87, - 0xe8, 0x46, 0x2f, 0x16, 0xdf, 0xe1, 0x3b, 0xe3, 0x29, 0x53, 0xd3, 0x56, 0x60, 0x1b, 0xad, 0x61, - 0xfa, 0xec, 0xf0, 0x39, 0xac, 0x76, 0xf8, 0x57, 0x2b, 0xd1, 0x27, 0x98, 0xc7, 0xd7, 0xb9, 0xf2, - 0xfb, 0xb4, 0xdb, 0x56, 0x4d, 0x12, 0x47, 0xb0, 0xc2, 0x1a, 0xba, 0x0c, 0x7f, 0x16, 0x7d, 0xdc, - 0x88, 0xec, 0x09, 0x2d, 0x5d, 0x00, 0x3f, 0x69, 0x33, 0xe5, 0x87, 0x9c, 0x71, 0xbf, 0xdd, 0x9b, - 0xb7, 0xeb, 0x21, 0xbf, 0x5c, 0x25, 0x58, 0x0f, 0x19, 0x1b, 0x5a, 0x4c, 0xac, 0x87, 0x10, 0xcc, - 0x8e, 0x4e, 0xb7, 0x7a, 0x6f, 0x13, 0x79, 0xa5, 0xf2, 0x2d, 0x30, 0x3a, 0xbd, 0xb2, 0x1a, 0x88, - 0x18, 0x9d, 0x24, 0x0c, 0x33, 0x92, 0x06, 0xac, 0xc6, 0x26, 0x16, 0xcb, 0x8d, 0x21, 0x77, 0x64, - 0xae, 0x77, 0x83, 0xb0, 0xbf, 0x36, 0x62, 0xbd, 0xf4, 0x79, 0x12, 0xb2, 0x00, 0x96, 0x3f, 0x1b, - 0xbd, 0x58, 0xed, 0xf0, 0x2f, 0xa2, 0xef, 0xb5, 0x2a, 0xb6, 0xcf, 0x99, 0x9c, 0x17, 0x7c, 0x32, - 0xd8, 0xee, 0x28, 0x77, 0x03, 0x1a, 0xd7, 0x4f, 0xfb, 0x2b, 0xb4, 0x72, 0xf4, 0x86, 0xab, 0xbb, - 0x95, 0x29, 0xc3, 0xb3, 0x90, 0x49, 0x9f, 0x0d, 0xe6, 0xe8, 0xb4, 0x4e, 0x6b, 0x99, 0xed, 0xf6, - 0xae, 0x9d, 0x05, 0x4b, 0x52, 0xf5, 0xb2, 0xf6, 0xb3, 0x90, 0x51, 0x0f, 0x0d, 0x2e, 0xb3, 0x49, - 0x95, 0x56, 0x64, 0x56, 0x63, 0xdc, 0x59, 0x9e, 0x6d, 0xd2, 0x91, 0x00, 0x59, 0x9d, 0x6d, 0xf5, - 0xa4, 0xb5, 0x5b, 0xd9, 0x4c, 0x79, 0xd5, 0xcf, 0x6e, 0x27, 0xc7, 0xbc, 0x6a, 0x55, 0xa4, 0xa7, - 0x6f, 0xf5, 0xa4, 0xb5, 0xd7, 0x3f, 0x8f, 0x3e, 0x6e, 0x7b, 0xd5, 0x13, 0xd1, 0x76, 0xa7, 0x29, - 0x30, 0x17, 0x3d, 0xed, 0xaf, 0x60, 0x97, 0x34, 0x5f, 0x25, 0xa5, 0x14, 0xc5, 0x72, 0x74, 0x25, - 0x6e, 0x9a, 0x2f, 0x1f, 0xfc, 0xd1, 0xaa, 0x81, 0xa1, 0x43, 0x10, 0x4b, 0x1a, 0x9c, 0x6c, 0xb9, - 0xb2, 0x5f, 0x48, 0x94, 0x84, 0x2b, 0x87, 0xe8, 0x70, 0xe5, 0x93, 0x36, 0x56, 0x35, 0xb5, 0xb2, - 0x9f, 0x73, 0xac, 0xe1, 0x45, 0x6d, 0x7f, 0xd2, 0xb1, 0xde, 0x0d, 0xda, 0x8c, 0x45, 0x8b, 0xf7, - 0x92, 0xcb, 0x4b, 0x53, 0x27, 0xbc, 0xa4, 0x2e, 0x42, 0x64, 0x2c, 0x04, 0x6a, 0x93, 0xee, 0xfd, - 0x24, 0xe5, 0x6a, 0x47, 0xff, 0xf5, 0xe5, 0x65, 0x2a, 0xd8, 0x04, 0x24, 0xdd, 0x95, 0x78, 0xe8, - 0xca, 0x89, 0xa4, 0x1b, 0xe3, 0xec, 0x59, 0x81, 0x4a, 0x7a, 0xc6, 0x63, 0x91, 0xc5, 0x49, 0x0a, - 0x0f, 0x82, 0x2a, 0x4d, 0x23, 0x24, 0xce, 0x0a, 0xb4, 0x20, 0x3b, 0x31, 0x56, 0xa2, 0x6a, 0xd8, - 0x37, 0xe5, 0x7f, 0xd4, 0x56, 0x74, 0xc4, 0xc4, 0xc4, 0x88, 0x60, 0x76, 0xed, 0x59, 0x09, 0xcf, - 0x73, 0x65, 0xfc, 0x5e, 0x5b, 0xab, 0x96, 0x10, 0x6b, 0x4f, 0x9f, 0xb0, 0x6b, 0xa8, 0xea, 0xf7, - 0x3d, 0x71, 0x93, 0x29, 0xa3, 0x0f, 0xda, 0x2a, 0x8d, 0x8c, 0x58, 0x43, 0x41, 0x46, 0x1b, 0xfe, - 0x49, 0xf4, 0xff, 0x95, 0xe1, 0x42, 0xe4, 0x83, 0x3b, 0x88, 0x42, 0xe1, 0x9c, 0xd9, 0xbc, 0x4b, - 0xca, 0xed, 0xd1, 0x02, 0xd3, 0x37, 0xce, 0x4b, 0x36, 0xe5, 0x83, 0x87, 0x44, 0x8b, 0x2b, 0x29, - 0x71, 0xb4, 0xa0, 0x4d, 0xf9, 0xbd, 0xe2, 0x44, 0x4c, 0xb4, 0x75, 0xa4, 0x86, 0x46, 0x18, 0xea, - 0x15, 0x2e, 0x64, 0x93, 0x99, 0x13, 0xb6, 0x48, 0xa6, 0x66, 0xc2, 0xa9, 0xe3, 0x56, 0x09, 0x92, - 0x19, 0xcb, 0x0c, 0x1d, 0x88, 0x48, 0x66, 0x48, 0x58, 0xfb, 0xfc, 0xd7, 0x95, 0xe8, 0x9e, 0x65, - 0x0e, 0x9a, 0xdd, 0xba, 0xc3, 0xec, 0x52, 0x54, 0xa9, 0xcf, 0x51, 0x92, 0x5d, 0x97, 0x83, 0x2f, - 0x28, 0x93, 0x38, 0x6f, 0x8a, 0xf2, 0xe5, 0xad, 0xf5, 0x6c, 0xd6, 0xda, 0x6c, 0x65, 0xd9, 0xf7, - 0xd9, 0xb5, 0x06, 0xc8, 0x5a, 0xcd, 0x8e, 0x17, 0xe4, 0x88, 0xac, 0x35, 0xc4, 0xdb, 0x26, 0x36, - 0xce, 0x53, 0x91, 0xc1, 0x26, 0xb6, 0x16, 0x2a, 0x21, 0xd1, 0xc4, 0x2d, 0xc8, 0xc6, 0xe3, 0x46, - 0x54, 0xef, 0xba, 0xec, 0xa4, 0x29, 0x88, 0xc7, 0x46, 0xd5, 0x00, 0x44, 0x3c, 0x46, 0x41, 0xed, - 0xe7, 0x2c, 0xfa, 0x4e, 0xf5, 0x48, 0x4f, 0x0b, 0xbe, 0x48, 0x38, 0x3c, 0x7a, 0xe1, 0x48, 0x88, - 0xf1, 0xef, 0x13, 0x76, 0x64, 0x9d, 0x67, 0x65, 0x9e, 0xb2, 0xf2, 0x4a, 0xbf, 0x8c, 0xf7, 0xeb, - 0xdc, 0x08, 0xe1, 0xeb, 0xf8, 0x47, 0x1d, 0x94, 0x0d, 0xea, 0x8d, 0xcc, 0x84, 0x98, 0x55, 0x5c, - 0xb5, 0x15, 0x66, 0xd6, 0x3a, 0x39, 0xbb, 0xe3, 0x7d, 0xc0, 0xd2, 0x94, 0x17, 0xcb, 0x46, 0x76, - 0xcc, 0xb2, 0xe4, 0x92, 0x97, 0x12, 0xec, 0x78, 0x6b, 0x6a, 0x08, 0x31, 0x62, 0xc7, 0x3b, 0x80, - 0xdb, 0x6c, 0x1e, 0x78, 0x3e, 0xcc, 0x26, 0xfc, 0x1d, 0xc8, 0xe6, 0xa1, 0x1d, 0xc5, 0x10, 0xd9, - 0x3c, 0xc5, 0xda, 0x9d, 0xdf, 0x97, 0xa9, 0x88, 0xaf, 0xf5, 0x14, 0xe0, 0x37, 0xb0, 0x92, 0xc0, - 0x39, 0xe0, 0x41, 0x08, 0xb1, 0x93, 0x80, 0x12, 0x9c, 0xf1, 0x3c, 0x65, 0x31, 0x3c, 0x7f, 0x53, - 0xeb, 0x68, 0x19, 0x31, 0x09, 0x40, 0x06, 0x14, 0x57, 0x9f, 0xeb, 0xc1, 0x8a, 0x0b, 0x8e, 0xf5, - 0x3c, 0x08, 0x21, 0x76, 0x1a, 0x54, 0x82, 0x51, 0x9e, 0x26, 0x12, 0x0c, 0x83, 0x5a, 0x43, 0x49, - 0x88, 0x61, 0xe0, 0x13, 0xc0, 0xe4, 0x31, 0x2f, 0xa6, 0x1c, 0x35, 0xa9, 0x24, 0x41, 0x93, 0x0d, - 0x61, 0x0f, 0x1b, 0xd7, 0x75, 0x17, 0xf9, 0x12, 0x1c, 0x36, 0xd6, 0xd5, 0x12, 0xf9, 0x92, 0x38, - 0x6c, 0xec, 0x01, 0xa0, 0x88, 0xa7, 0xac, 0x94, 0x78, 0x11, 0x95, 0x24, 0x58, 0xc4, 0x86, 0xb0, - 0x73, 0x74, 0x5d, 0xc4, 0xb9, 0x04, 0x73, 0xb4, 0x2e, 0x80, 0xf3, 0x06, 0xfa, 0x2e, 0x29, 0xb7, - 0x91, 0xa4, 0x6e, 0x15, 0x2e, 0xf7, 0x13, 0x9e, 0x4e, 0x4a, 0x10, 0x49, 0xf4, 0x73, 0x6f, 0xa4, - 0x44, 0x24, 0x69, 0x53, 0xa0, 0x2b, 0xe9, 0xfd, 0x71, 0xac, 0x76, 0x60, 0x6b, 0xfc, 0x41, 0x08, - 0xb1, 0xf1, 0xa9, 0x29, 0xf4, 0x2e, 0x2b, 0x8a, 0xa4, 0x9a, 0xfc, 0x57, 0xf1, 0x02, 0x35, 0x72, - 0x22, 0x3e, 0x61, 0x1c, 0x18, 0x5e, 0x4d, 0xe0, 0xc6, 0x0a, 0x06, 0x43, 0xf7, 0xa7, 0x41, 0xc6, - 0x66, 0x9c, 0x4a, 0xe2, 0xbc, 0x42, 0xc5, 0x9e, 0x26, 0xf2, 0x06, 0x75, 0xb5, 0x0b, 0x73, 0x3e, - 0x06, 0x32, 0x2e, 0x8e, 0xc5, 0x82, 0x8f, 0xc5, 0xab, 0x77, 0x49, 0x29, 0x93, 0x6c, 0xaa, 0x67, - 0xee, 0xe7, 0x84, 0x25, 0x0c, 0x26, 0x3e, 0x06, 0xea, 0x54, 0xb2, 0x09, 0x04, 0x28, 0xcb, 0x09, - 0xbf, 0x41, 0x13, 0x08, 0x68, 0xd1, 0x70, 0x44, 0x02, 0x11, 0xe2, 0xed, 0x3e, 0x8a, 0x71, 0xae, - 0xbf, 0x98, 0x1e, 0x8b, 0x26, 0x97, 0xa3, 0xac, 0x41, 0x90, 0x58, 0xca, 0x06, 0x15, 0xec, 0xfa, - 0xd2, 0xf8, 0xb7, 0x43, 0x6c, 0x9d, 0xb0, 0xd3, 0x1e, 0x66, 0x8f, 0x7b, 0x90, 0x88, 0x2b, 0x7b, - 0x0e, 0x80, 0x72, 0xd5, 0x3e, 0x06, 0xf0, 0xb8, 0x07, 0xe9, 0xec, 0xc9, 0xb8, 0xd5, 0x7a, 0xc9, - 0xe2, 0xeb, 0x69, 0x21, 0xe6, 0xd9, 0x64, 0x57, 0xa4, 0xa2, 0x00, 0x7b, 0x32, 0x5e, 0xa9, 0x01, - 0x4a, 0xec, 0xc9, 0x74, 0xa8, 0xd8, 0x0c, 0xce, 0x2d, 0xc5, 0x4e, 0x9a, 0x4c, 0xe1, 0x8a, 0xda, - 0x33, 0xa4, 0x00, 0x22, 0x83, 0x43, 0x41, 0xa4, 0x13, 0xd5, 0x2b, 0x6e, 0x99, 0xc4, 0x2c, 0xad, - 0xfd, 0x6d, 0xd3, 0x66, 0x3c, 0xb0, 0xb3, 0x13, 0x21, 0x0a, 0x48, 0x3d, 0xc7, 0xf3, 0x22, 0x3b, - 0xcc, 0xa4, 0x20, 0xeb, 0xd9, 0x00, 0x9d, 0xf5, 0x74, 0x40, 0x10, 0x56, 0xc7, 0xfc, 0x5d, 0x55, - 0x9a, 0xea, 0x1f, 0x2c, 0xac, 0x56, 0xbf, 0x0f, 0xb5, 0x3c, 0x14, 0x56, 0x01, 0x07, 0x2a, 0xa3, - 0x9d, 0xd4, 0x1d, 0x26, 0xa0, 0xed, 0x77, 0x93, 0xf5, 0x6e, 0x10, 0xf7, 0x33, 0x92, 0xcb, 0x94, - 0x87, 0xfc, 0x28, 0xa0, 0x8f, 0x9f, 0x06, 0xb4, 0xdb, 0x2d, 0x5e, 0x7d, 0xae, 0x78, 0x7c, 0xdd, - 0x3a, 0xd6, 0xe4, 0x17, 0xb4, 0x46, 0x88, 0xed, 0x16, 0x02, 0xc5, 0x9b, 0xe8, 0x30, 0x16, 0x59, - 0xa8, 0x89, 0x2a, 0x79, 0x9f, 0x26, 0xd2, 0x9c, 0x5d, 0xfc, 0x1a, 0xa9, 0xee, 0x99, 0x75, 0x33, - 0x6d, 0x10, 0x16, 0x5c, 0x88, 0x58, 0xfc, 0x92, 0xb0, 0xcd, 0xc9, 0xa1, 0xcf, 0xe3, 0xf6, 0x99, - 0xef, 0x96, 0x95, 0x63, 0xfa, 0xcc, 0x37, 0xc5, 0xd2, 0x95, 0xac, 0xfb, 0x48, 0x87, 0x15, 0xbf, - 0x9f, 0x6c, 0xf6, 0x83, 0xed, 0x92, 0xc7, 0xf3, 0xb9, 0x9b, 0x72, 0x56, 0xd4, 0x5e, 0xb7, 0x02, - 0x86, 0x2c, 0x46, 0x2c, 0x79, 0x02, 0x38, 0x08, 0x61, 0x9e, 0xe7, 0x5d, 0x91, 0x49, 0x9e, 0x49, - 0x2c, 0x84, 0xf9, 0xc6, 0x34, 0x18, 0x0a, 0x61, 0x94, 0x02, 0xe8, 0xb7, 0x6a, 0x3f, 0x88, 0xcb, - 0x13, 0x36, 0x43, 0x33, 0xb6, 0x7a, 0xaf, 0xa7, 0x96, 0x87, 0xfa, 0x2d, 0xe0, 0x9c, 0x97, 0x7c, - 0xae, 0x97, 0x31, 0x2b, 0xa6, 0x66, 0x77, 0x63, 0x32, 0x78, 0x4a, 0xdb, 0xf1, 0x49, 0xe2, 0x25, - 0x5f, 0x58, 0x03, 0x84, 0x9d, 0xc3, 0x19, 0x9b, 0x9a, 0x9a, 0x22, 0x35, 0x50, 0xf2, 0x56, 0x55, - 0xd7, 0xbb, 0x41, 0xe0, 0xe7, 0x4d, 0x32, 0xe1, 0x22, 0xe0, 0x47, 0xc9, 0xfb, 0xf8, 0x81, 0x20, - 0xc8, 0xde, 0xaa, 0x7a, 0xd7, 0x2b, 0xba, 0x9d, 0x6c, 0xa2, 0xd7, 0xb1, 0x43, 0xe2, 0xf1, 0x00, - 0x2e, 0x94, 0xbd, 0x11, 0x3c, 0x18, 0xa3, 0xcd, 0x06, 0x6d, 0x68, 0x8c, 0x9a, 0xfd, 0xd7, 0x3e, - 0x63, 0x14, 0x83, 0xb5, 0xcf, 0x9f, 0xe9, 0x31, 0xba, 0xc7, 0x24, 0xab, 0xf2, 0xf6, 0x37, 0x09, - 0xbf, 0xd1, 0x0b, 0x61, 0xa4, 0xbe, 0x0d, 0x35, 0x54, 0x9f, 0xac, 0x82, 0x55, 0xf1, 0x76, 0x6f, - 0x3e, 0xe0, 0x5b, 0xaf, 0x10, 0x3a, 0x7d, 0x83, 0xa5, 0xc2, 0x76, 0x6f, 0x3e, 0xe0, 0x5b, 0x7f, - 0x0b, 0xdf, 0xe9, 0x1b, 0x7c, 0x10, 0xbf, 0xdd, 0x9b, 0xd7, 0xbe, 0xff, 0xba, 0x19, 0xb8, 0xae, - 0xf3, 0x2a, 0x0f, 0x8b, 0x65, 0xb2, 0xe0, 0x58, 0x3a, 0xe9, 0xdb, 0x33, 0x68, 0x28, 0x9d, 0xa4, - 0x55, 0x9c, 0x0b, 0x94, 0xb0, 0x52, 0x9c, 0x8a, 0x32, 0x51, 0x2f, 0xe9, 0x9f, 0xf7, 0x30, 0xda, - 0xc0, 0xa1, 0x45, 0x53, 0x48, 0xc9, 0xbe, 0x6e, 0xf4, 0x50, 0x7b, 0x8a, 0x79, 0x33, 0x60, 0xaf, - 0x7d, 0x98, 0x79, 0xab, 0x27, 0x6d, 0x5f, 0xfc, 0x79, 0x8c, 0xfb, 0xc6, 0x31, 0xd4, 0xaa, 0xe8, - 0x4b, 0xc7, 0xa7, 0xfd, 0x15, 0xb4, 0xfb, 0xbf, 0x6d, 0xd6, 0x15, 0xd0, 0xbf, 0x1e, 0x04, 0xcf, - 0xfa, 0x58, 0x04, 0x03, 0xe1, 0xf9, 0xad, 0x74, 0x74, 0x41, 0xfe, 0xb1, 0x59, 0x40, 0x37, 0xa8, - 0xfa, 0x96, 0x43, 0x7d, 0x03, 0xaa, 0xc7, 0x44, 0xa8, 0x59, 0x2d, 0x0c, 0x47, 0xc6, 0x8b, 0x5b, - 0x6a, 0x39, 0xd7, 0x69, 0x79, 0xb0, 0xfe, 0xe6, 0xd0, 0x29, 0x4f, 0xc8, 0xb2, 0x43, 0xc3, 0x02, - 0x7d, 0x71, 0x5b, 0x35, 0x6a, 0xac, 0x38, 0xb0, 0xba, 0x9d, 0xe3, 0x79, 0x4f, 0xc3, 0xde, 0x7d, - 0x1d, 0x9f, 0xdf, 0x4e, 0x49, 0x97, 0xe5, 0xbf, 0x56, 0xa2, 0x47, 0x1e, 0x6b, 0xdf, 0x27, 0x80, - 0x5d, 0x8f, 0x1f, 0x07, 0xec, 0x53, 0x4a, 0xa6, 0x70, 0xbf, 0xff, 0xab, 0x29, 0xdb, 0xbb, 0xa7, - 0x3c, 0x95, 0xfd, 0x24, 0x95, 0xbc, 0x68, 0xdf, 0x3d, 0xe5, 0xdb, 0xad, 0xa9, 0x21, 0x7d, 0xf7, - 0x54, 0x00, 0x77, 0xee, 0x9e, 0x42, 0x3c, 0xa3, 0x77, 0x4f, 0xa1, 0xd6, 0x82, 0x77, 0x4f, 0x85, - 0x35, 0xa8, 0xf0, 0xde, 0x14, 0xa1, 0xde, 0xb7, 0xee, 0x65, 0xd1, 0xdf, 0xc6, 0x7e, 0x76, 0x1b, - 0x15, 0x62, 0x82, 0xab, 0x39, 0x75, 0xce, 0xad, 0xc7, 0x33, 0xf5, 0xce, 0xba, 0x6d, 0xf7, 0xe6, - 0xb5, 0xef, 0x9f, 0xea, 0xd5, 0x8d, 0x09, 0xe7, 0xa2, 0x50, 0xf7, 0x8e, 0x6d, 0x84, 0xc2, 0x73, - 0x65, 0xc1, 0x6d, 0xf9, 0xcd, 0x7e, 0x30, 0x51, 0xdd, 0x8a, 0xd0, 0x8d, 0x3e, 0xec, 0x32, 0x04, - 0x9a, 0x7c, 0xbb, 0x37, 0x4f, 0x4c, 0x23, 0xb5, 0xef, 0xba, 0xb5, 0x7b, 0x18, 0xf3, 0xdb, 0xfa, - 0x69, 0x7f, 0x05, 0xed, 0x7e, 0xa1, 0xd3, 0x46, 0xd7, 0xbd, 0x6a, 0xe7, 0xad, 0x2e, 0x53, 0x23, - 0xaf, 0x99, 0x87, 0x7d, 0xf1, 0x50, 0x02, 0xe1, 0x4e, 0xa1, 0x5d, 0x09, 0x04, 0x3a, 0x8d, 0x7e, - 0x7e, 0x3b, 0x25, 0x5d, 0x96, 0x7f, 0x59, 0x89, 0xee, 0x92, 0x65, 0xd1, 0xfd, 0xe0, 0x8b, 0xbe, - 0x96, 0x41, 0x7f, 0xf8, 0xf2, 0xd6, 0x7a, 0xba, 0x50, 0xff, 0xbe, 0x12, 0xdd, 0x0b, 0x14, 0xaa, - 0xee, 0x20, 0xb7, 0xb0, 0xee, 0x77, 0x94, 0x1f, 0xde, 0x5e, 0x91, 0x9a, 0xee, 0x5d, 0x7c, 0xd4, - 0xbe, 0x94, 0x29, 0x60, 0x7b, 0x44, 0x5f, 0xca, 0xd4, 0xad, 0x05, 0x37, 0x79, 0xd8, 0x45, 0xb3, - 0xe8, 0x42, 0x37, 0x79, 0xd4, 0x09, 0xb5, 0xe0, 0xe5, 0x12, 0x18, 0x87, 0x39, 0x79, 0xf5, 0x2e, - 0x67, 0xd9, 0x84, 0x76, 0x52, 0xcb, 0xbb, 0x9d, 0x18, 0x0e, 0x6e, 0x8e, 0x55, 0xd2, 0x33, 0xd1, - 0x2c, 0xa4, 0x1e, 0x53, 0xfa, 0x06, 0x09, 0x6e, 0x8e, 0xb5, 0x50, 0xc2, 0x9b, 0xce, 0x1a, 0x43, - 0xde, 0x40, 0xb2, 0xf8, 0xa4, 0x0f, 0x0a, 0x52, 0x74, 0xe3, 0xcd, 0xec, 0xb9, 0x6f, 0x86, 0xac, - 0xb4, 0xf6, 0xdd, 0xb7, 0x7a, 0xd2, 0x84, 0xdb, 0x11, 0x97, 0x5f, 0x71, 0x36, 0xe1, 0x45, 0xd0, - 0xad, 0xa1, 0x7a, 0xb9, 0x75, 0x69, 0xcc, 0xed, 0xae, 0x48, 0xe7, 0xb3, 0x4c, 0x37, 0x26, 0xe9, - 0xd6, 0xa5, 0xba, 0xdd, 0x02, 0x1a, 0x6e, 0x0b, 0x5a, 0xb7, 0x2a, 0xbd, 0x7c, 0x12, 0x36, 0xe3, - 0x65, 0x95, 0x1b, 0xbd, 0x58, 0xba, 0x9e, 0xba, 0x1b, 0x75, 0xd4, 0x13, 0xf4, 0xa4, 0xad, 0x9e, - 0x34, 0xdc, 0x9f, 0x73, 0xdc, 0x9a, 0xfe, 0xb4, 0xdd, 0x61, 0xab, 0xd5, 0xa5, 0x9e, 0xf6, 0x57, - 0x80, 0xbb, 0xa1, 0xba, 0x57, 0x1d, 0x25, 0xa5, 0xdc, 0x4f, 0xd2, 0x74, 0xb0, 0x11, 0xe8, 0x26, - 0x0d, 0x14, 0xdc, 0x0d, 0x45, 0x60, 0xa2, 0x27, 0x37, 0xbb, 0x87, 0xd9, 0xa0, 0xcb, 0x8e, 0xa2, - 0x7a, 0xf5, 0x64, 0x97, 0x06, 0x3b, 0x5a, 0xce, 0xa3, 0x36, 0xb5, 0x1d, 0x86, 0x1f, 0x5c, 0xab, - 0xc2, 0xdb, 0xbd, 0x79, 0xf0, 0xba, 0x5d, 0x51, 0x6a, 0x66, 0x79, 0x48, 0x99, 0xf0, 0x66, 0x92, - 0x47, 0x1d, 0x14, 0xd8, 0x15, 0xac, 0x87, 0xd1, 0xdb, 0x64, 0x32, 0xe5, 0x12, 0x7d, 0x53, 0xe4, - 0x02, 0xc1, 0x37, 0x45, 0x00, 0x04, 0x4d, 0x57, 0xff, 0x6e, 0xb6, 0x43, 0x0f, 0x27, 0x58, 0xd3, - 0x69, 0x65, 0x87, 0x0a, 0x35, 0x1d, 0x4a, 0x83, 0x68, 0x60, 0xdc, 0xea, 0xcf, 0xf1, 0x9f, 0x84, - 0xcc, 0x80, 0x6f, 0xf2, 0x37, 0x7a, 0xb1, 0x60, 0x46, 0xb1, 0x0e, 0x93, 0x59, 0x22, 0xb1, 0x19, - 0xc5, 0xb1, 0x51, 0x21, 0xa1, 0x19, 0xa5, 0x8d, 0x52, 0xd5, 0xab, 0x72, 0x84, 0xc3, 0x49, 0xb8, - 0x7a, 0x35, 0xd3, 0xaf, 0x7a, 0x86, 0x6d, 0xbd, 0xd8, 0xcc, 0x4c, 0x97, 0x91, 0x57, 0x7a, 0xb1, - 0x8c, 0xf4, 0x6d, 0xf5, 0x99, 0x26, 0x04, 0x43, 0x51, 0x87, 0x52, 0x80, 0x1b, 0xf6, 0x15, 0xd7, - 0xbc, 0x7b, 0xcd, 0x73, 0xce, 0x0a, 0x96, 0xc5, 0xe8, 0xe2, 0x54, 0x19, 0x6c, 0x91, 0xa1, 0xc5, - 0x29, 0xa9, 0x01, 0x5e, 0x9b, 0xfb, 0x1f, 0x58, 0x22, 0x43, 0xc1, 0x7c, 0xc9, 0xe8, 0x7f, 0x5f, - 0xf9, 0xb8, 0x07, 0x09, 0x5f, 0x9b, 0x37, 0x80, 0xd9, 0xf8, 0xae, 0x9d, 0x7e, 0x16, 0x30, 0xe5, - 0xa3, 0xa1, 0x85, 0x30, 0xad, 0x02, 0x3a, 0xb5, 0x49, 0x70, 0xb9, 0xfc, 0x09, 0x5f, 0x62, 0x9d, - 0xda, 0xe6, 0xa7, 0x0a, 0x09, 0x75, 0xea, 0x36, 0x0a, 0xf2, 0x4c, 0x77, 0x1d, 0xb4, 0x1a, 0xd0, - 0x77, 0x97, 0x3e, 0x6b, 0x9d, 0x1c, 0x18, 0x39, 0x7b, 0xc9, 0xc2, 0x7b, 0x4f, 0x80, 0x14, 0x74, - 0x2f, 0x59, 0xe0, 0xaf, 0x09, 0x36, 0x7a, 0xb1, 0xf0, 0x95, 0x3c, 0x93, 0xfc, 0x5d, 0xf3, 0xae, - 0x1c, 0x29, 0xae, 0x92, 0xb7, 0x5e, 0x96, 0xaf, 0x77, 0x83, 0xf6, 0x00, 0xec, 0x69, 0x21, 0x62, - 0x5e, 0x96, 0xfa, 0xa6, 0x4a, 0xff, 0x84, 0x91, 0x96, 0x0d, 0xc1, 0x3d, 0x95, 0x0f, 0xc3, 0x90, - 0x73, 0xbd, 0x5c, 0x2d, 0xb2, 0xb7, 0xde, 0xac, 0xa2, 0x9a, 0xed, 0x0b, 0x6f, 0xd6, 0x3a, 0x39, - 0x3b, 0xbc, 0xb4, 0xd4, 0xbd, 0xe6, 0x66, 0x1d, 0x55, 0xc7, 0x6e, 0xb8, 0x79, 0xdc, 0x83, 0xd4, - 0xae, 0xbe, 0x8a, 0xde, 0x3f, 0x12, 0xd3, 0x11, 0xcf, 0x26, 0x83, 0x1f, 0xf8, 0x47, 0x68, 0xc5, - 0x74, 0x58, 0xfd, 0x6c, 0x8c, 0xde, 0xa1, 0xc4, 0xf6, 0x10, 0xe0, 0x1e, 0xbf, 0x98, 0x4f, 0x47, - 0x92, 0x49, 0x70, 0x08, 0x50, 0xfd, 0x3e, 0xac, 0x04, 0xc4, 0x21, 0x40, 0x0f, 0x00, 0xf6, 0xc6, - 0x05, 0xe7, 0xa8, 0xbd, 0x4a, 0x10, 0xb4, 0xa7, 0x01, 0x9b, 0x45, 0x18, 0x7b, 0x55, 0xa2, 0x0e, - 0x0f, 0xed, 0x59, 0x1d, 0x25, 0x25, 0xb2, 0x88, 0x36, 0x65, 0x3b, 0x77, 0x5d, 0x7d, 0x75, 0xeb, - 0xc8, 0x7c, 0x36, 0x63, 0xc5, 0x12, 0x74, 0x6e, 0x5d, 0x4b, 0x07, 0x20, 0x3a, 0x37, 0x0a, 0xda, - 0x51, 0xdb, 0x3c, 0xe6, 0xf8, 0xfa, 0x40, 0x14, 0x62, 0x2e, 0x93, 0x8c, 0xc3, 0x9b, 0x27, 0xcc, - 0x03, 0x75, 0x19, 0x62, 0xd4, 0x52, 0xac, 0xcd, 0x72, 0x15, 0x51, 0x9f, 0x27, 0x54, 0xf7, 0x57, - 0x97, 0x52, 0x14, 0xf0, 0x7d, 0x62, 0x6d, 0x05, 0x42, 0x44, 0x96, 0x4b, 0xc2, 0xa0, 0xed, 0x4f, - 0x93, 0x6c, 0x8a, 0xb6, 0xfd, 0xa9, 0x7b, 0xfb, 0xeb, 0x3d, 0x1a, 0xb0, 0x03, 0xaa, 0x7e, 0x68, - 0xf5, 0x00, 0xd0, 0xdf, 0x72, 0xa2, 0x0f, 0xdd, 0x25, 0x88, 0x01, 0x85, 0x93, 0xc0, 0xd5, 0xeb, - 0x9c, 0x67, 0x7c, 0xd2, 0x9c, 0x9a, 0xc3, 0x5c, 0x79, 0x44, 0xd0, 0x15, 0x24, 0x6d, 0x2c, 0x52, - 0xf2, 0xb3, 0x79, 0x76, 0x5a, 0x88, 0xcb, 0x24, 0xe5, 0x05, 0x88, 0x45, 0xb5, 0xba, 0x23, 0x27, - 0x62, 0x11, 0xc6, 0xd9, 0xe3, 0x17, 0x4a, 0xea, 0x5d, 0xc2, 0x3e, 0x2e, 0x58, 0x0c, 0x8f, 0x5f, - 0xd4, 0x36, 0xda, 0x18, 0xb1, 0x33, 0x18, 0xc0, 0x9d, 0x44, 0xa7, 0x76, 0x9d, 0x2d, 0x55, 0xff, - 0xd0, 0xdf, 0x12, 0xaa, 0x3b, 0x51, 0x4b, 0x90, 0xe8, 0x68, 0x73, 0x18, 0x49, 0x24, 0x3a, 0x61, - 0x0d, 0x3b, 0x95, 0x28, 0xee, 0x44, 0x1f, 0x2b, 0x02, 0x53, 0x49, 0x6d, 0xa3, 0x11, 0x12, 0x53, - 0x49, 0x0b, 0x02, 0x01, 0xa9, 0x19, 0x06, 0x53, 0x34, 0x20, 0x19, 0x69, 0x30, 0x20, 0xb9, 0x94, - 0x0d, 0x14, 0x87, 0x59, 0x22, 0x13, 0x96, 0x8e, 0xb8, 0x3c, 0x65, 0x05, 0x9b, 0x71, 0xc9, 0x0b, - 0x18, 0x28, 0x34, 0x32, 0xf4, 0x18, 0x22, 0x50, 0x50, 0xac, 0x76, 0xf8, 0x07, 0xd1, 0x87, 0xd5, - 0xbc, 0xcf, 0x33, 0xfd, 0xe7, 0x56, 0x5e, 0xa9, 0xbf, 0xd3, 0x34, 0xf8, 0xc8, 0xd8, 0x18, 0xc9, - 0x82, 0xb3, 0x59, 0x63, 0xfb, 0x03, 0xf3, 0xbb, 0x02, 0x9f, 0xae, 0x54, 0xfd, 0xf9, 0x44, 0xc8, - 0xe4, 0xb2, 0x5a, 0x66, 0xeb, 0x2f, 0x88, 0x40, 0x7f, 0x76, 0xc5, 0xc3, 0xc0, 0x5d, 0x14, 0x18, - 0x67, 0xe3, 0xb4, 0x2b, 0x3d, 0xe3, 0x79, 0x0a, 0xe3, 0xb4, 0xa7, 0xad, 0x00, 0x22, 0x4e, 0xa3, - 0xa0, 0x1d, 0x9c, 0xae, 0x78, 0xcc, 0xc3, 0x95, 0x19, 0xf3, 0x7e, 0x95, 0x19, 0x7b, 0x1f, 0x65, - 0xa4, 0xd1, 0x87, 0xc7, 0x7c, 0x76, 0xc1, 0x8b, 0xf2, 0x2a, 0xc9, 0xa9, 0x7b, 0x5b, 0x2d, 0xd1, - 0x79, 0x6f, 0x2b, 0x81, 0xda, 0x99, 0xc0, 0x02, 0x87, 0xe5, 0x09, 0x9b, 0x71, 0x75, 0xb3, 0x06, - 0x98, 0x09, 0x1c, 0x23, 0x0e, 0x44, 0xcc, 0x04, 0x24, 0xec, 0x7c, 0xdf, 0x65, 0x99, 0x33, 0x3e, - 0xad, 0x7a, 0x58, 0x71, 0xca, 0x96, 0x33, 0x9e, 0x49, 0x6d, 0x12, 0xec, 0xc9, 0x3b, 0x26, 0x71, - 0x9e, 0xd8, 0x93, 0xef, 0xa3, 0xe7, 0x84, 0x26, 0xef, 0xc1, 0x9f, 0x8a, 0x42, 0xd6, 0x7f, 0x4c, - 0xe9, 0xbc, 0x48, 0x41, 0x68, 0xf2, 0x1f, 0xaa, 0x47, 0x12, 0xa1, 0x29, 0xac, 0xe1, 0xfc, 0x15, - 0x02, 0xaf, 0x0c, 0x6f, 0x78, 0x61, 0xfa, 0xc9, 0xab, 0x19, 0x4b, 0x52, 0xdd, 0x1b, 0x7e, 0x14, - 0xb0, 0x4d, 0xe8, 0x10, 0x7f, 0x85, 0xa0, 0xaf, 0xae, 0xf3, 0x77, 0x1b, 0xc2, 0x25, 0x04, 0xaf, - 0x08, 0x3a, 0xec, 0x13, 0xaf, 0x08, 0xba, 0xb5, 0xec, 0xca, 0xdd, 0xb2, 0x8a, 0x5b, 0x2a, 0x62, - 0x57, 0x4c, 0xe0, 0x7e, 0xa1, 0x63, 0x13, 0x80, 0xc4, 0xca, 0x3d, 0xa8, 0x60, 0x53, 0x03, 0x8b, - 0xed, 0x27, 0x19, 0x4b, 0x93, 0x9f, 0xc1, 0xb4, 0xde, 0xb1, 0xd3, 0x10, 0x44, 0x6a, 0x80, 0x93, - 0x98, 0xab, 0x03, 0x2e, 0xc7, 0x49, 0x15, 0xfa, 0xd7, 0x03, 0xcf, 0x4d, 0x11, 0xdd, 0xae, 0x1c, - 0xd2, 0xb9, 0xa3, 0x15, 0x3e, 0xd6, 0x9d, 0x3c, 0x1f, 0x55, 0xb3, 0xea, 0x19, 0x8f, 0x79, 0x92, - 0xcb, 0xc1, 0x8b, 0xf0, 0xb3, 0x02, 0x38, 0x71, 0xd0, 0xa2, 0x87, 0x9a, 0xf3, 0xfa, 0xbe, 0x8a, - 0x25, 0xa3, 0xfa, 0xaf, 0x0c, 0x9e, 0x97, 0xbc, 0xd0, 0x89, 0xc6, 0x01, 0x97, 0x60, 0x74, 0x3a, - 0xdc, 0xd0, 0x01, 0xab, 0x8a, 0x12, 0xa3, 0x33, 0xac, 0x61, 0x37, 0xfb, 0x1c, 0x4e, 0xdf, 0xb9, - 0xad, 0xce, 0x1b, 0x6e, 0x92, 0xc6, 0x1c, 0x8a, 0xd8, 0xec, 0xa3, 0x69, 0x9b, 0xad, 0xb5, 0xdd, - 0xee, 0x64, 0xcb, 0x43, 0x78, 0x64, 0x02, 0xb1, 0xa4, 0x30, 0x22, 0x5b, 0x0b, 0xe0, 0xce, 0x66, - 0x78, 0x21, 0xd8, 0x24, 0x66, 0xa5, 0x3c, 0x65, 0xcb, 0x54, 0xb0, 0x89, 0x9a, 0xd7, 0xe1, 0x66, - 0x78, 0xc3, 0x0c, 0x5d, 0x88, 0xda, 0x0c, 0xa7, 0x60, 0x37, 0x3b, 0x53, 0x7f, 0x3c, 0x51, 0x9f, - 0xe5, 0x84, 0xd9, 0x99, 0x2a, 0x2f, 0x3c, 0xc7, 0xf9, 0x30, 0x0c, 0xd9, 0x6f, 0xd0, 0x6a, 0x91, - 0x4a, 0x43, 0xee, 0x61, 0x3a, 0x5e, 0x02, 0x72, 0x3f, 0x40, 0xd8, 0x7b, 0x29, 0xea, 0xdf, 0x9b, - 0xbf, 0xff, 0x23, 0xf5, 0x4d, 0xd6, 0x9b, 0x98, 0xae, 0x0b, 0x0d, 0xdd, 0x0b, 0xee, 0xb6, 0x7a, - 0xd2, 0x36, 0xcd, 0xdc, 0xbd, 0x62, 0x72, 0x67, 0x32, 0x39, 0xe6, 0x25, 0xf2, 0x41, 0x79, 0x25, - 0x1c, 0x5a, 0x29, 0x91, 0x66, 0xb6, 0x29, 0xdb, 0xd1, 0x2b, 0xd9, 0xab, 0x49, 0x22, 0xb5, 0xac, - 0x39, 0x21, 0xbd, 0xd9, 0x36, 0xd0, 0xa6, 0x88, 0x5a, 0xd1, 0xb4, 0x8d, 0xe5, 0x15, 0x33, 0x16, - 0xd3, 0x69, 0xca, 0x35, 0x74, 0xc6, 0x59, 0x7d, 0x91, 0xdf, 0x76, 0xdb, 0x16, 0x0a, 0x12, 0xb1, - 0x3c, 0xa8, 0x60, 0xd3, 0xc8, 0x0a, 0xab, 0x5f, 0x49, 0x35, 0x0f, 0x76, 0xad, 0x6d, 0xc6, 0x03, - 0x88, 0x34, 0x12, 0x05, 0xed, 0x77, 0x6f, 0x95, 0xf8, 0x80, 0x37, 0x4f, 0x02, 0x5e, 0x41, 0xa4, - 0x94, 0x1d, 0x31, 0xf1, 0xdd, 0x1b, 0x82, 0xd9, 0x75, 0x02, 0xf0, 0xf0, 0x72, 0x79, 0x38, 0x81, - 0xeb, 0x04, 0xa8, 0xaf, 0x18, 0x62, 0x9d, 0x40, 0xb1, 0x7e, 0xd3, 0x99, 0x7d, 0xaf, 0x23, 0x56, - 0xda, 0xca, 0x21, 0x4d, 0x87, 0x82, 0xa1, 0xa6, 0xa3, 0x14, 0xfc, 0x47, 0xea, 0x6e, 0xad, 0x21, - 0x8f, 0x14, 0xdb, 0x57, 0x5b, 0xed, 0xc2, 0x6c, 0x5c, 0x32, 0xeb, 0x49, 0x75, 0x64, 0x09, 0xbf, - 0xc1, 0xbf, 0x16, 0x12, 0x71, 0xa9, 0x05, 0xd5, 0xb6, 0x5f, 0xde, 0xff, 0xef, 0x6f, 0xee, 0xac, - 0xfc, 0xe2, 0x9b, 0x3b, 0x2b, 0xff, 0xfb, 0xcd, 0x9d, 0x95, 0x9f, 0x7f, 0x7b, 0xe7, 0xbd, 0x5f, - 0x7c, 0x7b, 0xe7, 0xbd, 0xff, 0xf9, 0xf6, 0xce, 0x7b, 0x5f, 0xbf, 0xaf, 0xff, 0xa8, 0xee, 0xc5, - 0xff, 0x53, 0x7f, 0x1a, 0xf7, 0xf9, 0xff, 0x05, 0x00, 0x00, 0xff, 0xff, 0xb2, 0x7c, 0x4b, 0xdb, - 0x78, 0x77, 0x00, 0x00, + // 5389 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x9d, 0xdd, 0x6f, 0x24, 0x49, + 0x52, 0xc0, 0xcf, 0x2f, 0x2c, 0xd4, 0x71, 0x0b, 0xf4, 0xc2, 0xb2, 0xb7, 0xdc, 0xcd, 0xcc, 0xce, + 0xce, 0xd8, 0x33, 0x63, 0xbb, 0x3d, 0x3b, 0xb3, 0x1f, 0xa7, 0x3b, 0x24, 0xd4, 0x63, 0x8f, 0xbd, + 0xbe, 0xb3, 0x3d, 0xc6, 0xdd, 0x9e, 0x91, 0x56, 0x42, 0x22, 0xdd, 0x95, 0x6e, 0x17, 0xae, 0xae, + 0xac, 0xab, 0xca, 0x6e, 0x4f, 0x1f, 0x02, 0x81, 0x40, 0x20, 0x10, 0x88, 0x13, 0x5f, 0xaf, 0x48, + 0xfc, 0x35, 0x3c, 0xde, 0x23, 0x8f, 0x68, 0xf7, 0x8d, 0x07, 0xfe, 0x06, 0x54, 0x59, 0x59, 0xf9, + 0x11, 0x15, 0x91, 0x55, 0xbe, 0xa7, 0x19, 0x75, 0xfc, 0x22, 0x22, 0x3f, 0x23, 0x23, 0xb3, 0xb2, + 0xca, 0xd1, 0xdd, 0xfc, 0x62, 0x27, 0x2f, 0x84, 0x14, 0xe5, 0x4e, 0xc9, 0x8b, 0x65, 0x32, 0xe5, + 0xcd, 0xbf, 0x43, 0xf5, 0xf3, 0xe0, 0x1d, 0x96, 0xad, 0xe4, 0x2a, 0xe7, 0x1f, 0x7e, 0x60, 0xc9, + 0xa9, 0x98, 0xcf, 0x59, 0x16, 0x97, 0x35, 0xf2, 0xe1, 0xfb, 0x56, 0xc2, 0x97, 0x3c, 0x93, 0xfa, + 0xf7, 0x67, 0xff, 0xfb, 0x7f, 0x6b, 0xd1, 0xbb, 0xbb, 0x69, 0xc2, 0x33, 0xb9, 0xab, 0x35, 0x06, + 0x5f, 0x45, 0xdf, 0x19, 0xe5, 0xf9, 0x01, 0x97, 0xaf, 0x79, 0x51, 0x26, 0x22, 0x1b, 0x7c, 0x3c, + 0xd4, 0x0e, 0x86, 0x67, 0xf9, 0x74, 0x38, 0xca, 0xf3, 0xa1, 0x15, 0x0e, 0xcf, 0xf8, 0x4f, 0x17, + 0xbc, 0x94, 0x1f, 0x3e, 0x08, 0x43, 0x65, 0x2e, 0xb2, 0x92, 0x0f, 0x2e, 0xa3, 0xdf, 0x1a, 0xe5, + 0xf9, 0x98, 0xcb, 0x3d, 0x5e, 0x55, 0x60, 0x2c, 0x99, 0xe4, 0x83, 0x8d, 0x96, 0xaa, 0x0f, 0x18, + 0x1f, 0x8f, 0xba, 0x41, 0xed, 0x67, 0x12, 0x7d, 0xbb, 0xf2, 0x73, 0xb5, 0x90, 0xb1, 0xb8, 0xc9, + 0x06, 0x1f, 0xb5, 0x15, 0xb5, 0xc8, 0xd8, 0xbe, 0x1f, 0x42, 0xb4, 0xd5, 0x37, 0xd1, 0xaf, 0xbf, + 0x61, 0x69, 0xca, 0xe5, 0x6e, 0xc1, 0xab, 0x82, 0xfb, 0x3a, 0xb5, 0x68, 0x58, 0xcb, 0x8c, 0xdd, + 0x8f, 0x83, 0x8c, 0x36, 0xfc, 0x55, 0xf4, 0x9d, 0x5a, 0x72, 0xc6, 0xa7, 0x62, 0xc9, 0x8b, 0x01, + 0xaa, 0xa5, 0x85, 0x44, 0x93, 0xb7, 0x20, 0x68, 0x7b, 0x57, 0x64, 0x4b, 0x5e, 0x48, 0xdc, 0xb6, + 0x16, 0x86, 0x6d, 0x5b, 0x48, 0xdb, 0xfe, 0xbb, 0xb5, 0xe8, 0x7b, 0xa3, 0xe9, 0x54, 0x2c, 0x32, + 0x79, 0x24, 0xa6, 0x2c, 0x3d, 0x4a, 0xb2, 0xeb, 0x13, 0x7e, 0xb3, 0x7b, 0x55, 0xf1, 0xd9, 0x8c, + 0x0f, 0x9e, 0xfb, 0xad, 0x5a, 0xa3, 0x43, 0xc3, 0x0e, 0x5d, 0xd8, 0xf8, 0xfe, 0xf4, 0x76, 0x4a, + 0xba, 0x2c, 0xff, 0xb4, 0x16, 0xdd, 0x81, 0x65, 0x19, 0x8b, 0x74, 0xc9, 0x6d, 0x69, 0x3e, 0xeb, + 0x30, 0xec, 0xe3, 0xa6, 0x3c, 0x9f, 0xdf, 0x56, 0x4d, 0x97, 0x28, 0x8d, 0xde, 0x73, 0x87, 0xcb, + 0x98, 0x97, 0x6a, 0x3a, 0x3d, 0xa6, 0x47, 0x84, 0x46, 0x8c, 0xe7, 0x27, 0x7d, 0x50, 0xed, 0x2d, + 0x89, 0x06, 0xda, 0x5b, 0x2a, 0x4a, 0xe3, 0xec, 0x11, 0x6a, 0xc1, 0x21, 0x8c, 0xaf, 0xc7, 0x3d, + 0x48, 0xed, 0xea, 0x8f, 0xa3, 0xdf, 0x78, 0x23, 0x8a, 0xeb, 0x32, 0x67, 0x53, 0xae, 0xa7, 0xc2, + 0x43, 0x5f, 0xbb, 0x91, 0xc2, 0xd9, 0xb0, 0xde, 0x85, 0x39, 0x83, 0xb6, 0x11, 0xbe, 0xca, 0x39, + 0x8c, 0x41, 0x56, 0xb1, 0x12, 0x52, 0x83, 0x16, 0x42, 0xda, 0xf6, 0x75, 0x34, 0xb0, 0xb6, 0x2f, + 0xfe, 0x84, 0x4f, 0xe5, 0x28, 0x8e, 0x61, 0xaf, 0x58, 0x5d, 0x45, 0x0c, 0x47, 0x71, 0x4c, 0xf5, + 0x0a, 0x8e, 0x6a, 0x67, 0x37, 0xd1, 0xfb, 0xc0, 0xd9, 0x51, 0x52, 0x2a, 0x87, 0xdb, 0x61, 0x2b, + 0x1a, 0x33, 0x4e, 0x87, 0x7d, 0x71, 0xed, 0xf8, 0x2f, 0xd6, 0xa2, 0xef, 0x22, 0x9e, 0xcf, 0xf8, + 0x5c, 0x2c, 0xf9, 0xe0, 0x69, 0xb7, 0xb5, 0x9a, 0x34, 0xfe, 0x3f, 0xb9, 0x85, 0x06, 0x32, 0x4c, + 0xc6, 0x3c, 0xe5, 0x53, 0x49, 0x0e, 0x93, 0x5a, 0xdc, 0x39, 0x4c, 0x0c, 0xe6, 0xcc, 0xb0, 0x46, + 0x78, 0xc0, 0xe5, 0xee, 0xa2, 0x28, 0x78, 0x26, 0xc9, 0xbe, 0xb4, 0x48, 0x67, 0x5f, 0x7a, 0x28, + 0x52, 0x9f, 0x03, 0x2e, 0x47, 0x69, 0x4a, 0xd6, 0xa7, 0x16, 0x77, 0xd6, 0xc7, 0x60, 0xda, 0xc3, + 0x34, 0xfa, 0x4d, 0xa7, 0xc5, 0xe4, 0x61, 0x76, 0x29, 0x06, 0x74, 0x5b, 0x28, 0xb9, 0xf1, 0xb1, + 0xd1, 0xc9, 0x21, 0xd5, 0x78, 0xf9, 0x36, 0x17, 0x05, 0xdd, 0x2d, 0xb5, 0xb8, 0xb3, 0x1a, 0x06, + 0xd3, 0x1e, 0xfe, 0x28, 0x7a, 0x57, 0x47, 0xc9, 0x66, 0x3d, 0x7b, 0x80, 0x86, 0x50, 0xb8, 0xa0, + 0x3d, 0xec, 0xa0, 0x6c, 0x70, 0xd0, 0x32, 0x1d, 0x7c, 0x3e, 0x46, 0xf5, 0x40, 0xe8, 0x79, 0x10, + 0x86, 0x5a, 0xb6, 0xf7, 0x78, 0xca, 0x49, 0xdb, 0xb5, 0xb0, 0xc3, 0xb6, 0x81, 0xb4, 0xed, 0x22, + 0xfa, 0x1d, 0xd3, 0x2c, 0xd5, 0x3a, 0xaa, 0xe4, 0x55, 0x90, 0xde, 0x24, 0xea, 0xed, 0x42, 0xc6, + 0xd7, 0x56, 0x3f, 0xb8, 0x55, 0x1f, 0x3d, 0x03, 0xf1, 0xfa, 0x80, 0xf9, 0xf7, 0x20, 0x0c, 0x69, + 0xdb, 0x7f, 0xbf, 0x16, 0x7d, 0x5f, 0xcb, 0x5e, 0x66, 0xec, 0x22, 0xe5, 0x6a, 0x49, 0x3c, 0xe1, + 0xf2, 0x46, 0x14, 0xd7, 0xe3, 0x55, 0x36, 0x25, 0x96, 0x7f, 0x1c, 0xee, 0x58, 0xfe, 0x49, 0x25, + 0x5d, 0x98, 0x3f, 0x8d, 0x3e, 0x68, 0x06, 0xc5, 0x15, 0xcb, 0x66, 0xfc, 0xc7, 0xa5, 0xc8, 0x46, + 0x79, 0x32, 0x8a, 0xe3, 0x62, 0x30, 0xc4, 0xbb, 0x1e, 0x72, 0xa6, 0x04, 0x3b, 0xbd, 0x79, 0x27, + 0xdd, 0xd4, 0xad, 0x2c, 0x45, 0x0e, 0xd3, 0xcd, 0xa6, 0xf9, 0xa4, 0xc8, 0xa9, 0x74, 0xd3, 0x47, + 0x5a, 0x56, 0x8f, 0xab, 0x98, 0x8d, 0x5b, 0x3d, 0x76, 0x83, 0xf4, 0xfd, 0x10, 0x62, 0x63, 0x66, + 0xd3, 0x50, 0x22, 0xbb, 0x4c, 0x66, 0xe7, 0x79, 0x5c, 0xcd, 0xa1, 0xc7, 0x78, 0x9d, 0x1d, 0x84, + 0x88, 0x99, 0x04, 0xaa, 0xbd, 0xfd, 0xa3, 0xcd, 0xca, 0xf4, 0x3c, 0xde, 0x2f, 0xc4, 0xfc, 0x88, + 0xcf, 0xd8, 0x74, 0xa5, 0x83, 0xcf, 0xa7, 0xa1, 0x59, 0x0f, 0x69, 0x53, 0x88, 0xcf, 0x6e, 0xa9, + 0xa5, 0xcb, 0xf3, 0x1f, 0x6b, 0xd1, 0x03, 0x6f, 0x9c, 0xe8, 0xc1, 0x54, 0x97, 0x7e, 0x94, 0xc5, + 0x67, 0xbc, 0x94, 0xac, 0x90, 0x83, 0x1f, 0x06, 0xc6, 0x00, 0xa1, 0x63, 0xca, 0xf6, 0xa3, 0x5f, + 0x4a, 0xd7, 0xf6, 0xfa, 0xb8, 0x8a, 0xaa, 0x3a, 0xfe, 0xf8, 0xbd, 0xae, 0x24, 0x30, 0xfa, 0xdc, + 0x0f, 0x21, 0xb6, 0xd7, 0x95, 0xe0, 0x30, 0x5b, 0x26, 0x92, 0x1f, 0xf0, 0x8c, 0x17, 0xed, 0x5e, + 0xaf, 0x55, 0x7d, 0x84, 0xe8, 0x75, 0x02, 0xb5, 0x91, 0xce, 0xf3, 0x66, 0x56, 0xe6, 0xcd, 0x80, + 0x91, 0xd6, 0xda, 0xbc, 0xd5, 0x0f, 0xb6, 0x5b, 0x4b, 0xc7, 0xe7, 0x19, 0x5f, 0x8a, 0x6b, 0xb8, + 0xb5, 0x74, 0x4d, 0xd4, 0x00, 0xb1, 0xb5, 0x44, 0x41, 0xbb, 0x7c, 0x3a, 0x7e, 0x5e, 0x27, 0xfc, + 0x06, 0x2c, 0x9f, 0xae, 0x72, 0x25, 0x26, 0x96, 0x4f, 0x04, 0xd3, 0x1e, 0x4e, 0xa2, 0x5f, 0x53, + 0xc2, 0x1f, 0x8b, 0x24, 0x1b, 0xdc, 0x45, 0x94, 0x2a, 0x81, 0xb1, 0x7a, 0x8f, 0x06, 0x40, 0x89, + 0xab, 0x5f, 0x77, 0x59, 0x36, 0xe5, 0x29, 0x5a, 0x62, 0x2b, 0x0e, 0x96, 0xd8, 0xc3, 0x6c, 0xde, + 0xa2, 0x84, 0x55, 0xfc, 0x1a, 0x5f, 0xb1, 0x22, 0xc9, 0x66, 0x03, 0x4c, 0xd7, 0x91, 0x13, 0x79, + 0x0b, 0xc6, 0x81, 0x21, 0xac, 0x15, 0x47, 0x79, 0x5e, 0x54, 0x61, 0x11, 0x1b, 0xc2, 0x3e, 0x12, + 0x1c, 0xc2, 0x2d, 0x14, 0xf7, 0xb6, 0xc7, 0xa7, 0x69, 0x92, 0x05, 0xbd, 0x69, 0xa4, 0x8f, 0x37, + 0x8b, 0x82, 0xc1, 0x7b, 0xc4, 0xd9, 0x92, 0x37, 0x35, 0xc3, 0x5a, 0xc6, 0x05, 0x82, 0x83, 0x17, + 0x80, 0x76, 0x93, 0xa8, 0xc4, 0xc7, 0xec, 0x9a, 0x57, 0x0d, 0xcc, 0xab, 0x45, 0x75, 0x80, 0xe9, + 0x7b, 0x04, 0xb1, 0x49, 0xc4, 0x49, 0xed, 0x6a, 0x11, 0xbd, 0xaf, 0xe4, 0xa7, 0xac, 0x90, 0xc9, + 0x34, 0xc9, 0x59, 0xd6, 0x6c, 0x3e, 0xb0, 0x79, 0xdd, 0xa2, 0x8c, 0xcb, 0xed, 0x9e, 0xb4, 0x76, + 0xfb, 0xef, 0x6b, 0xd1, 0x47, 0xd0, 0xef, 0x29, 0x2f, 0xe6, 0x89, 0xda, 0xc3, 0x96, 0x75, 0x10, + 0x1e, 0x7c, 0x11, 0x36, 0xda, 0x52, 0x30, 0xa5, 0xf9, 0xc1, 0xed, 0x15, 0x6d, 0x26, 0x36, 0xd6, + 0x79, 0xfd, 0xab, 0x22, 0x6e, 0x9d, 0xf1, 0x8c, 0x9b, 0x64, 0x5d, 0x09, 0x89, 0x4c, 0xac, 0x05, + 0x81, 0x19, 0x7e, 0x9e, 0x95, 0x8d, 0x75, 0x6c, 0x86, 0x5b, 0x71, 0x70, 0x86, 0x7b, 0x98, 0x9d, + 0xe1, 0xa7, 0x8b, 0x8b, 0x34, 0x29, 0xaf, 0x92, 0x6c, 0xa6, 0xd3, 0x6e, 0x5f, 0xd7, 0x8a, 0x61, + 0xe6, 0xbd, 0xd1, 0xc9, 0x61, 0x4e, 0xf4, 0x60, 0x21, 0x9d, 0x80, 0x61, 0xb2, 0xd1, 0xc9, 0xd9, + 0xcd, 0x89, 0x95, 0x56, 0xdb, 0x56, 0xb0, 0x39, 0x71, 0x54, 0x2b, 0x29, 0xb1, 0x39, 0x69, 0x53, + 0xda, 0xbc, 0x88, 0x7e, 0xdb, 0xad, 0x43, 0x29, 0xd2, 0x25, 0x3f, 0x2f, 0x92, 0xc1, 0x13, 0xba, + 0x7c, 0x0d, 0x63, 0x5c, 0x6d, 0xf6, 0x62, 0x6d, 0xa0, 0xb2, 0xc4, 0x01, 0x97, 0x63, 0xc9, 0xe4, + 0xa2, 0x04, 0x81, 0xca, 0xb1, 0x61, 0x10, 0x22, 0x50, 0x11, 0xa8, 0xf6, 0xf6, 0x87, 0x51, 0x54, + 0xef, 0xf8, 0xd5, 0xa9, 0x8c, 0xbf, 0xf6, 0xe8, 0xa3, 0x00, 0xef, 0x48, 0xe6, 0xa3, 0x00, 0x61, + 0x13, 0x9e, 0xfa, 0x77, 0x75, 0xd8, 0x34, 0x40, 0x35, 0x94, 0x88, 0x48, 0x78, 0x00, 0x02, 0x0b, + 0x3a, 0xbe, 0x12, 0x37, 0x78, 0x41, 0x2b, 0x49, 0xb8, 0xa0, 0x9a, 0xb0, 0xc7, 0xbf, 0xba, 0xa0, + 0xd8, 0xf1, 0x6f, 0x53, 0x8c, 0xd0, 0xf1, 0x2f, 0x64, 0xec, 0x98, 0x71, 0x0d, 0xbf, 0x10, 0xe2, + 0x7a, 0xce, 0x8a, 0x6b, 0x30, 0x66, 0x3c, 0xe5, 0x86, 0x21, 0xc6, 0x0c, 0xc5, 0xda, 0x31, 0xe3, + 0x3a, 0xac, 0xd2, 0xe5, 0xf3, 0x22, 0x05, 0x63, 0xc6, 0xb3, 0xa1, 0x11, 0x62, 0xcc, 0x10, 0xa8, + 0x8d, 0x4e, 0xae, 0xb7, 0x31, 0x87, 0x07, 0x0e, 0x9e, 0xfa, 0x98, 0x53, 0x07, 0x0e, 0x08, 0x06, + 0x87, 0xd0, 0x41, 0xc1, 0xf2, 0x2b, 0x7c, 0x08, 0x29, 0x51, 0x78, 0x08, 0x35, 0x08, 0xec, 0xef, + 0x31, 0x67, 0xc5, 0xf4, 0x0a, 0xef, 0xef, 0x5a, 0x16, 0xee, 0x6f, 0xc3, 0xc0, 0xfe, 0xae, 0x05, + 0x6f, 0x12, 0x79, 0x75, 0xcc, 0x25, 0xc3, 0xfb, 0xdb, 0x67, 0xc2, 0xfd, 0xdd, 0x62, 0x6d, 0x3e, + 0xee, 0x3a, 0x1c, 0x2f, 0x2e, 0xca, 0x69, 0x91, 0x5c, 0xf0, 0x41, 0xc0, 0x8a, 0x81, 0x88, 0x7c, + 0x9c, 0x84, 0xb5, 0xcf, 0x9f, 0xaf, 0x45, 0x77, 0x9b, 0x6e, 0x17, 0x65, 0xa9, 0xd7, 0x3e, 0xdf, + 0xfd, 0x67, 0x78, 0xff, 0x12, 0x38, 0x71, 0x20, 0xdf, 0x43, 0xcd, 0xc9, 0x0d, 0xf0, 0x22, 0x9d, + 0x67, 0xa5, 0x29, 0xd4, 0x17, 0x7d, 0xac, 0x3b, 0x0a, 0x44, 0x6e, 0xd0, 0x4b, 0xd1, 0xa6, 0x65, + 0xba, 0x7f, 0x1a, 0xd9, 0x61, 0x5c, 0x82, 0xb4, 0xac, 0x69, 0x6f, 0x87, 0x20, 0xd2, 0x32, 0x9c, + 0x84, 0x43, 0xe1, 0xa0, 0x10, 0x8b, 0xbc, 0xec, 0x18, 0x0a, 0x00, 0x0a, 0x0f, 0x85, 0x36, 0xac, + 0x7d, 0xbe, 0x8d, 0x7e, 0xd7, 0x1d, 0x7e, 0x6e, 0x63, 0x6f, 0xd3, 0x63, 0x0a, 0x6b, 0xe2, 0x61, + 0x5f, 0xdc, 0x66, 0x14, 0x8d, 0x67, 0xb9, 0xc7, 0x25, 0x4b, 0xd2, 0x72, 0xb0, 0x8e, 0xdb, 0x68, + 0xe4, 0x44, 0x46, 0x81, 0x71, 0x30, 0xbe, 0xed, 0x2d, 0xf2, 0x34, 0x99, 0xb6, 0x1f, 0x87, 0x68, + 0x5d, 0x23, 0x0e, 0xc7, 0x37, 0x17, 0x83, 0xf1, 0xba, 0x4a, 0xfd, 0xd4, 0x7f, 0x26, 0xab, 0x9c, + 0xe3, 0xf1, 0xda, 0x43, 0xc2, 0xf1, 0x1a, 0xa2, 0xb0, 0x3e, 0x63, 0x2e, 0x8f, 0xd8, 0x4a, 0x2c, + 0x88, 0x78, 0x6d, 0xc4, 0xe1, 0xfa, 0xb8, 0x98, 0xdd, 0x1b, 0x18, 0x0f, 0x87, 0x99, 0xe4, 0x45, + 0xc6, 0xd2, 0xfd, 0x94, 0xcd, 0xca, 0x01, 0x11, 0x63, 0x7c, 0x8a, 0xd8, 0x1b, 0xd0, 0x34, 0xd2, + 0x8c, 0x87, 0xe5, 0x3e, 0x5b, 0x8a, 0x22, 0x91, 0x74, 0x33, 0x5a, 0xa4, 0xb3, 0x19, 0x3d, 0x14, + 0xf5, 0x36, 0x2a, 0xa6, 0x57, 0xc9, 0x92, 0xc7, 0x01, 0x6f, 0x0d, 0xd2, 0xc3, 0x9b, 0x83, 0x22, + 0x9d, 0x36, 0x16, 0x8b, 0x62, 0xca, 0xc9, 0x4e, 0xab, 0xc5, 0x9d, 0x9d, 0x66, 0x30, 0xed, 0xe1, + 0xaf, 0xd7, 0xa2, 0xdf, 0xab, 0xa5, 0xee, 0x33, 0x8a, 0x3d, 0x56, 0x5e, 0x5d, 0x08, 0x56, 0xc4, + 0x83, 0x4f, 0x30, 0x3b, 0x28, 0x6a, 0x5c, 0x3f, 0xbb, 0x8d, 0x0a, 0x6c, 0xd6, 0x2a, 0xef, 0xb6, + 0x33, 0x0e, 0x6d, 0x56, 0x0f, 0x09, 0x37, 0x2b, 0x44, 0x61, 0x00, 0x51, 0xf2, 0xfa, 0x48, 0x6e, + 0x9d, 0xd4, 0xf7, 0xcf, 0xe5, 0x36, 0x3a, 0x39, 0x18, 0x1f, 0x2b, 0xa1, 0x3f, 0x5a, 0xb6, 0x29, + 0x1b, 0xf8, 0x88, 0x19, 0xf6, 0xc5, 0x49, 0xcf, 0x66, 0x56, 0x84, 0x3d, 0xb7, 0x66, 0xc6, 0xb0, + 0x2f, 0x4e, 0x78, 0x76, 0xc2, 0x5a, 0xc8, 0x33, 0x12, 0xda, 0x86, 0x7d, 0x71, 0x98, 0x7d, 0x69, + 0xa6, 0x59, 0x17, 0x9e, 0x04, 0xec, 0xc0, 0xb5, 0x61, 0xb3, 0x17, 0xab, 0x1d, 0xfe, 0xed, 0x5a, + 0xf4, 0x3d, 0xeb, 0xf1, 0x58, 0xc4, 0xc9, 0xe5, 0xaa, 0x86, 0x5e, 0xb3, 0x74, 0xc1, 0xcb, 0xc1, + 0x33, 0xca, 0x5a, 0x9b, 0x35, 0x25, 0x78, 0x7e, 0x2b, 0x1d, 0x38, 0x77, 0x46, 0x79, 0x9e, 0xae, + 0x26, 0x7c, 0x9e, 0xa7, 0xe4, 0xdc, 0xf1, 0x90, 0xf0, 0xdc, 0x81, 0x28, 0xcc, 0xca, 0x27, 0xa2, + 0xca, 0xf9, 0xd1, 0xac, 0x5c, 0x89, 0xc2, 0x59, 0x79, 0x83, 0xc0, 0x5c, 0x69, 0x22, 0x76, 0x45, + 0x9a, 0xf2, 0xa9, 0x6c, 0xdf, 0x73, 0x30, 0x9a, 0x96, 0x08, 0xe7, 0x4a, 0x80, 0xb4, 0xa7, 0x72, + 0xcd, 0x1e, 0x92, 0x15, 0xfc, 0xc5, 0xea, 0x28, 0xc9, 0xae, 0x07, 0x78, 0x5a, 0x60, 0x01, 0xe2, + 0x54, 0x0e, 0x05, 0xe1, 0x5e, 0xf5, 0x3c, 0x8b, 0x05, 0xbe, 0x57, 0xad, 0x24, 0xe1, 0xbd, 0xaa, + 0x26, 0xa0, 0xc9, 0x33, 0x4e, 0x99, 0xac, 0x24, 0x61, 0x93, 0x9a, 0xc0, 0x42, 0xa1, 0x7e, 0x76, + 0x43, 0x86, 0x42, 0xf0, 0xb4, 0x66, 0xa3, 0x93, 0x83, 0x23, 0xb4, 0xd9, 0xb4, 0xee, 0x73, 0x39, + 0xbd, 0xc2, 0x47, 0xa8, 0x87, 0x84, 0x47, 0x28, 0x44, 0x61, 0x95, 0x26, 0xc2, 0x6c, 0xba, 0xd7, + 0xf1, 0xf1, 0xd1, 0xda, 0x70, 0x6f, 0x74, 0x72, 0x70, 0x1b, 0x79, 0x38, 0x57, 0x6d, 0x86, 0x0e, + 0xf2, 0x5a, 0x16, 0xde, 0x46, 0x1a, 0x06, 0x96, 0xbe, 0x16, 0xa8, 0xb3, 0xac, 0x75, 0x5a, 0xd1, + 0x3b, 0xcd, 0xda, 0xe8, 0xe4, 0xb4, 0x93, 0x7f, 0x35, 0xdb, 0xb8, 0x5a, 0x7a, 0x22, 0xaa, 0x39, + 0xf2, 0x9a, 0xa5, 0x49, 0xcc, 0x24, 0x9f, 0x88, 0x6b, 0x9e, 0xe1, 0x3b, 0x26, 0x5d, 0xda, 0x9a, + 0x1f, 0x7a, 0x0a, 0xe1, 0x1d, 0x53, 0x58, 0x11, 0x8e, 0x93, 0x9a, 0x3e, 0x2f, 0xf9, 0x2e, 0x2b, + 0x89, 0x48, 0xe6, 0x21, 0xe1, 0x71, 0x02, 0x51, 0x98, 0xaf, 0xd6, 0xf2, 0x97, 0x6f, 0x73, 0x5e, + 0x24, 0x3c, 0x9b, 0x72, 0x3c, 0x5f, 0x85, 0x54, 0x38, 0x5f, 0x45, 0x68, 0xb8, 0x57, 0xdb, 0x63, + 0x92, 0xbf, 0x58, 0x4d, 0x92, 0x39, 0x2f, 0x25, 0x9b, 0xe7, 0xf8, 0x5e, 0x0d, 0x40, 0xe1, 0xbd, + 0x5a, 0x1b, 0x6e, 0x1d, 0x0d, 0x99, 0x80, 0xd8, 0xbe, 0x1e, 0x05, 0x89, 0xc0, 0xf5, 0x28, 0x02, + 0x85, 0x0d, 0x6b, 0x01, 0xf4, 0x21, 0x41, 0xcb, 0x4a, 0xf0, 0x21, 0x01, 0x4d, 0xb7, 0x0e, 0xdc, + 0x0c, 0x33, 0xae, 0xa6, 0x66, 0x47, 0xd1, 0xc7, 0xee, 0x14, 0xdd, 0xec, 0xc5, 0xe2, 0x27, 0x7c, + 0x67, 0x3c, 0x65, 0x6a, 0xd9, 0x0a, 0x1c, 0xa3, 0x35, 0x4c, 0x9f, 0x13, 0x3e, 0x87, 0xd5, 0x0e, + 0xff, 0x72, 0x2d, 0xfa, 0x10, 0xf3, 0xf8, 0x2a, 0x57, 0x7e, 0x9f, 0x76, 0xdb, 0xaa, 0x49, 0xe2, + 0xfe, 0x57, 0x58, 0xc3, 0x5e, 0xc9, 0x68, 0x44, 0xf6, 0x7a, 0x98, 0x2e, 0x80, 0x9f, 0xb4, 0x99, + 0xf2, 0x43, 0x8e, 0xb8, 0x92, 0x11, 0xe2, 0xed, 0x7e, 0xc8, 0x2f, 0x57, 0x09, 0xf6, 0x43, 0xc6, + 0x86, 0x16, 0x13, 0xfb, 0x21, 0x04, 0xb3, 0xb3, 0xd3, 0xad, 0xde, 0x9b, 0x44, 0x5e, 0xa9, 0x7c, + 0x0b, 0xcc, 0x4e, 0xaf, 0xac, 0x06, 0x22, 0x66, 0x27, 0x09, 0xc3, 0x8c, 0xa4, 0x01, 0xab, 0xb9, + 0x89, 0xc5, 0x72, 0x63, 0xc8, 0x9d, 0x99, 0x8f, 0xba, 0x41, 0x38, 0x5e, 0x1b, 0xb1, 0xde, 0xfa, + 0x3c, 0x09, 0x59, 0x00, 0xdb, 0x9f, 0xcd, 0x5e, 0xac, 0x76, 0xf8, 0xe7, 0xd1, 0x77, 0x5b, 0x15, + 0xdb, 0xe7, 0x4c, 0x2e, 0x0a, 0x1e, 0x0f, 0x76, 0x3a, 0xca, 0xdd, 0x80, 0xc6, 0xf5, 0xd3, 0xfe, + 0x0a, 0xad, 0x1c, 0xbd, 0xe1, 0xea, 0x61, 0x65, 0xca, 0xf0, 0x2c, 0x64, 0xd2, 0x67, 0x83, 0x39, + 0x3a, 0xad, 0xd3, 0xda, 0x66, 0xbb, 0xa3, 0x6b, 0xb4, 0x64, 0x49, 0xaa, 0x1e, 0xd6, 0x7e, 0x12, + 0x32, 0xea, 0xa1, 0xc1, 0x6d, 0x36, 0xa9, 0xd2, 0x8a, 0xcc, 0x6a, 0x8e, 0x3b, 0xdb, 0xb3, 0x2d, + 0x3a, 0x12, 0x20, 0xbb, 0xb3, 0xed, 0x9e, 0xb4, 0x76, 0x2b, 0x9b, 0x25, 0xaf, 0xfa, 0xd9, 0x1d, + 0xe4, 0x98, 0x57, 0xad, 0x8a, 0x8c, 0xf4, 0xed, 0x9e, 0xb4, 0xf6, 0xfa, 0x67, 0xd1, 0x07, 0x6d, + 0xaf, 0x7a, 0x21, 0xda, 0xe9, 0x34, 0x05, 0xd6, 0xa2, 0xa7, 0xfd, 0x15, 0xec, 0x96, 0xe6, 0xcb, + 0xa4, 0x94, 0xa2, 0x58, 0x8d, 0xaf, 0xc4, 0x4d, 0xf3, 0xda, 0x85, 0x3f, 0x5b, 0x35, 0x30, 0x74, + 0x08, 0x62, 0x4b, 0x83, 0x93, 0x2d, 0x57, 0xf6, 0xf5, 0x8c, 0x92, 0x70, 0xe5, 0x10, 0x1d, 0xae, + 0x7c, 0xd2, 0xc6, 0xaa, 0xa6, 0x56, 0xf6, 0x5d, 0x92, 0x0d, 0xbc, 0xa8, 0xed, 0xf7, 0x49, 0x1e, + 0x75, 0x83, 0x36, 0x63, 0xd1, 0xe2, 0xbd, 0xe4, 0xf2, 0xd2, 0xd4, 0x09, 0x2f, 0xa9, 0x8b, 0x10, + 0x19, 0x0b, 0x81, 0xda, 0xa4, 0x7b, 0x3f, 0x49, 0xb9, 0x3a, 0xd1, 0x7f, 0x75, 0x79, 0x99, 0x0a, + 0x16, 0x83, 0xa4, 0xbb, 0x12, 0x0f, 0x5d, 0x39, 0x91, 0x74, 0x63, 0x9c, 0xbd, 0x2b, 0x50, 0x49, + 0xcf, 0xf8, 0x54, 0x64, 0xd3, 0x24, 0x85, 0xb7, 0x50, 0x95, 0xa6, 0x11, 0x12, 0x77, 0x05, 0x5a, + 0x90, 0x5d, 0x18, 0x2b, 0x51, 0x35, 0xed, 0x9b, 0xf2, 0x3f, 0x6c, 0x2b, 0x3a, 0x62, 0x62, 0x61, + 0x44, 0x30, 0xbb, 0xf7, 0xac, 0x84, 0xe7, 0xb9, 0x32, 0x7e, 0xaf, 0xad, 0x55, 0x4b, 0x88, 0xbd, + 0xa7, 0x4f, 0xd8, 0x3d, 0x54, 0xf5, 0xfb, 0x9e, 0xb8, 0xc9, 0x94, 0xd1, 0xfb, 0x6d, 0x95, 0x46, + 0x46, 0xec, 0xa1, 0x20, 0xa3, 0x0d, 0xff, 0x24, 0xfa, 0x55, 0x65, 0xb8, 0x10, 0xf9, 0xe0, 0x0e, + 0xa2, 0x50, 0x38, 0x77, 0x36, 0xef, 0x92, 0x72, 0x7b, 0xb5, 0xc0, 0x8c, 0x8d, 0xf3, 0x92, 0xcd, + 0xf8, 0xe0, 0x01, 0xd1, 0xe3, 0x4a, 0x4a, 0x5c, 0x2d, 0x68, 0x53, 0xfe, 0xa8, 0x38, 0x11, 0xb1, + 0xb6, 0x8e, 0xd4, 0xd0, 0x08, 0x43, 0xa3, 0xc2, 0x85, 0x6c, 0x32, 0x73, 0xc2, 0x96, 0xc9, 0xcc, + 0x2c, 0x38, 0x75, 0xdc, 0x2a, 0x41, 0x32, 0x63, 0x99, 0xa1, 0x03, 0x11, 0xc9, 0x0c, 0x09, 0x6b, + 0x9f, 0xff, 0xb2, 0x16, 0xdd, 0xb3, 0xcc, 0x41, 0x73, 0x5a, 0x77, 0x98, 0x5d, 0x8a, 0x2a, 0xf5, + 0x39, 0x4a, 0xb2, 0xeb, 0x72, 0xf0, 0x39, 0x65, 0x12, 0xe7, 0x4d, 0x51, 0xbe, 0xb8, 0xb5, 0x9e, + 0xcd, 0x5a, 0x9b, 0xa3, 0x2c, 0xfb, 0x3c, 0xbb, 0xd6, 0x00, 0x59, 0xab, 0x39, 0xf1, 0x82, 0x1c, + 0x91, 0xb5, 0x86, 0x78, 0xdb, 0xc5, 0xc6, 0x79, 0x2a, 0x32, 0xd8, 0xc5, 0xd6, 0x42, 0x25, 0x24, + 0xba, 0xb8, 0x05, 0xd9, 0x78, 0xdc, 0x88, 0xea, 0x53, 0x97, 0x51, 0x9a, 0x82, 0x78, 0x6c, 0x54, + 0x0d, 0x40, 0xc4, 0x63, 0x14, 0xd4, 0x7e, 0xce, 0xa2, 0x6f, 0x57, 0x4d, 0x7a, 0x5a, 0xf0, 0x65, + 0xc2, 0xe1, 0xd5, 0x0b, 0x47, 0x42, 0xcc, 0x7f, 0x9f, 0xb0, 0x33, 0xeb, 0x3c, 0x2b, 0xf3, 0x94, + 0x95, 0x57, 0xfa, 0x61, 0xbc, 0x5f, 0xe7, 0x46, 0x08, 0x1f, 0xc7, 0x3f, 0xec, 0xa0, 0x6c, 0x50, + 0x6f, 0x64, 0x26, 0xc4, 0xac, 0xe3, 0xaa, 0xad, 0x30, 0xb3, 0xd1, 0xc9, 0xd9, 0x13, 0xef, 0x03, + 0x96, 0xa6, 0xbc, 0x58, 0x35, 0xb2, 0x63, 0x96, 0x25, 0x97, 0xbc, 0x94, 0xe0, 0xc4, 0x5b, 0x53, + 0x43, 0x88, 0x11, 0x27, 0xde, 0x01, 0xdc, 0x66, 0xf3, 0xc0, 0xf3, 0x61, 0x16, 0xf3, 0xb7, 0x20, + 0x9b, 0x87, 0x76, 0x14, 0x43, 0x64, 0xf3, 0x14, 0x6b, 0x4f, 0x7e, 0x5f, 0xa4, 0x62, 0x7a, 0xad, + 0x97, 0x00, 0xbf, 0x83, 0x95, 0x04, 0xae, 0x01, 0xf7, 0x43, 0x88, 0x5d, 0x04, 0x94, 0xe0, 0x8c, + 0xe7, 0x29, 0x9b, 0xc2, 0xfb, 0x37, 0xb5, 0x8e, 0x96, 0x11, 0x8b, 0x00, 0x64, 0x40, 0x71, 0xf5, + 0xbd, 0x1e, 0xac, 0xb8, 0xe0, 0x5a, 0xcf, 0xfd, 0x10, 0x62, 0x97, 0x41, 0x25, 0x18, 0xe7, 0x69, + 0x22, 0xc1, 0x34, 0xa8, 0x35, 0x94, 0x84, 0x98, 0x06, 0x3e, 0x01, 0x4c, 0x1e, 0xf3, 0x62, 0xc6, + 0x51, 0x93, 0x4a, 0x12, 0x34, 0xd9, 0x10, 0xf6, 0xb2, 0x71, 0x5d, 0x77, 0x91, 0xaf, 0xc0, 0x65, + 0x63, 0x5d, 0x2d, 0x91, 0xaf, 0x88, 0xcb, 0xc6, 0x1e, 0x00, 0x8a, 0x78, 0xca, 0x4a, 0x89, 0x17, + 0x51, 0x49, 0x82, 0x45, 0x6c, 0x08, 0xbb, 0x46, 0xd7, 0x45, 0x5c, 0x48, 0xb0, 0x46, 0xeb, 0x02, + 0x38, 0x4f, 0xa0, 0xef, 0x92, 0x72, 0x1b, 0x49, 0xea, 0x5e, 0xe1, 0x72, 0x3f, 0xe1, 0x69, 0x5c, + 0x82, 0x48, 0xa2, 0xdb, 0xbd, 0x91, 0x12, 0x91, 0xa4, 0x4d, 0x81, 0xa1, 0xa4, 0xcf, 0xc7, 0xb1, + 0xda, 0x81, 0xa3, 0xf1, 0xfb, 0x21, 0xc4, 0xc6, 0xa7, 0xa6, 0xd0, 0xbb, 0xac, 0x28, 0x92, 0x6a, + 0xf1, 0x5f, 0xc7, 0x0b, 0xd4, 0xc8, 0x89, 0xf8, 0x84, 0x71, 0x60, 0x7a, 0x35, 0x81, 0x1b, 0x2b, + 0x18, 0x0c, 0xdd, 0x1f, 0x07, 0x19, 0x9b, 0x71, 0x2a, 0x89, 0xf3, 0x08, 0x15, 0x6b, 0x4d, 0xe4, + 0x09, 0xea, 0x7a, 0x17, 0xe6, 0xbc, 0x89, 0x64, 0x5c, 0x1c, 0x8b, 0x25, 0x9f, 0x88, 0x97, 0x6f, + 0x93, 0x52, 0x26, 0xd9, 0x4c, 0xaf, 0xdc, 0xcf, 0x09, 0x4b, 0x18, 0x4c, 0xbc, 0x89, 0xd4, 0xa9, + 0x64, 0x13, 0x08, 0x50, 0x96, 0x13, 0x7e, 0x83, 0x26, 0x10, 0xd0, 0xa2, 0xe1, 0x88, 0x04, 0x22, + 0xc4, 0xdb, 0x73, 0x14, 0xe3, 0x5c, 0xbf, 0xae, 0x3d, 0x11, 0x4d, 0x2e, 0x47, 0x59, 0x83, 0x20, + 0xb1, 0x95, 0x0d, 0x2a, 0xd8, 0xfd, 0xa5, 0xf1, 0x6f, 0xa7, 0xd8, 0x23, 0xc2, 0x4e, 0x7b, 0x9a, + 0x3d, 0xee, 0x41, 0x22, 0xae, 0xec, 0x3d, 0x00, 0xca, 0x55, 0xfb, 0x1a, 0xc0, 0xe3, 0x1e, 0xa4, + 0x73, 0x26, 0xe3, 0x56, 0xeb, 0x05, 0x9b, 0x5e, 0xcf, 0x0a, 0xb1, 0xc8, 0xe2, 0x5d, 0x91, 0x8a, + 0x02, 0x9c, 0xc9, 0x78, 0xa5, 0x06, 0x28, 0x71, 0x26, 0xd3, 0xa1, 0x62, 0x33, 0x38, 0xb7, 0x14, + 0xa3, 0x34, 0x99, 0xc1, 0x1d, 0xb5, 0x67, 0x48, 0x01, 0x44, 0x06, 0x87, 0x82, 0xc8, 0x20, 0xaa, + 0x77, 0xdc, 0x32, 0x99, 0xb2, 0xb4, 0xf6, 0xb7, 0x43, 0x9b, 0xf1, 0xc0, 0xce, 0x41, 0x84, 0x28, + 0x20, 0xf5, 0x9c, 0x2c, 0x8a, 0xec, 0x30, 0x93, 0x82, 0xac, 0x67, 0x03, 0x74, 0xd6, 0xd3, 0x01, + 0x41, 0x58, 0x9d, 0xf0, 0xb7, 0x55, 0x69, 0xaa, 0x7f, 0xb0, 0xb0, 0x5a, 0xfd, 0x3e, 0xd4, 0xf2, + 0x50, 0x58, 0x05, 0x1c, 0xa8, 0x8c, 0x76, 0x52, 0x0f, 0x98, 0x80, 0xb6, 0x3f, 0x4c, 0x1e, 0x75, + 0x83, 0xb8, 0x9f, 0xb1, 0x5c, 0xa5, 0x3c, 0xe4, 0x47, 0x01, 0x7d, 0xfc, 0x34, 0xa0, 0x3d, 0x6e, + 0xf1, 0xea, 0x73, 0xc5, 0xa7, 0xd7, 0xad, 0x6b, 0x4d, 0x7e, 0x41, 0x6b, 0x84, 0x38, 0x6e, 0x21, + 0x50, 0xbc, 0x8b, 0x0e, 0xa7, 0x22, 0x0b, 0x75, 0x51, 0x25, 0xef, 0xd3, 0x45, 0x9a, 0xb3, 0x9b, + 0x5f, 0x23, 0xd5, 0x23, 0xb3, 0xee, 0xa6, 0x4d, 0xc2, 0x82, 0x0b, 0x11, 0x9b, 0x5f, 0x12, 0xb6, + 0x39, 0x39, 0xf4, 0x79, 0xdc, 0xbe, 0xf3, 0xdd, 0xb2, 0x72, 0x4c, 0xdf, 0xf9, 0xa6, 0x58, 0xba, + 0x92, 0xf5, 0x18, 0xe9, 0xb0, 0xe2, 0x8f, 0x93, 0xad, 0x7e, 0xb0, 0xdd, 0xf2, 0x78, 0x3e, 0x77, + 0x53, 0xce, 0x8a, 0xda, 0xeb, 0x76, 0xc0, 0x90, 0xc5, 0x88, 0x2d, 0x4f, 0x00, 0x07, 0x21, 0xcc, + 0xf3, 0xbc, 0x2b, 0x32, 0xc9, 0x33, 0x89, 0x85, 0x30, 0xdf, 0x98, 0x06, 0x43, 0x21, 0x8c, 0x52, + 0x00, 0xe3, 0x56, 0x9d, 0x07, 0x71, 0x79, 0xc2, 0xe6, 0x68, 0xc6, 0x56, 0x9f, 0xf5, 0xd4, 0xf2, + 0xd0, 0xb8, 0x05, 0x9c, 0xf3, 0x90, 0xcf, 0xf5, 0x32, 0x61, 0xc5, 0xcc, 0x9c, 0x6e, 0xc4, 0x83, + 0xa7, 0xb4, 0x1d, 0x9f, 0x24, 0x1e, 0xf2, 0x85, 0x35, 0x40, 0xd8, 0x39, 0x9c, 0xb3, 0x99, 0xa9, + 0x29, 0x52, 0x03, 0x25, 0x6f, 0x55, 0xf5, 0x51, 0x37, 0x08, 0xfc, 0xbc, 0x4e, 0x62, 0x2e, 0x02, + 0x7e, 0x94, 0xbc, 0x8f, 0x1f, 0x08, 0x82, 0xec, 0xad, 0xaa, 0x77, 0xbd, 0xa3, 0x1b, 0x65, 0xb1, + 0xde, 0xc7, 0x0e, 0x89, 0xe6, 0x01, 0x5c, 0x28, 0x7b, 0x23, 0x78, 0x30, 0x47, 0x9b, 0x03, 0xda, + 0xd0, 0x1c, 0x35, 0xe7, 0xaf, 0x7d, 0xe6, 0x28, 0x06, 0x6b, 0x9f, 0x3f, 0xd3, 0x73, 0x74, 0x8f, + 0x49, 0x56, 0xe5, 0xed, 0xaf, 0x13, 0x7e, 0xa3, 0x37, 0xc2, 0x48, 0x7d, 0x1b, 0x6a, 0xa8, 0x5e, + 0x59, 0x05, 0xbb, 0xe2, 0x9d, 0xde, 0x7c, 0xc0, 0xb7, 0xde, 0x21, 0x74, 0xfa, 0x06, 0x5b, 0x85, + 0x9d, 0xde, 0x7c, 0xc0, 0xb7, 0x7e, 0x17, 0xbe, 0xd3, 0x37, 0x78, 0x21, 0x7e, 0xa7, 0x37, 0xaf, + 0x7d, 0xff, 0x55, 0x33, 0x71, 0x5d, 0xe7, 0x55, 0x1e, 0x36, 0x95, 0xc9, 0x92, 0x63, 0xe9, 0xa4, + 0x6f, 0xcf, 0xa0, 0xa1, 0x74, 0x92, 0x56, 0x71, 0xbe, 0xde, 0x84, 0x95, 0xe2, 0x54, 0x94, 0x89, + 0x7a, 0x48, 0xff, 0xbc, 0x87, 0xd1, 0x06, 0x0e, 0x6d, 0x9a, 0x42, 0x4a, 0xf6, 0x71, 0xa3, 0x87, + 0xda, 0x5b, 0xcc, 0x5b, 0x01, 0x7b, 0xed, 0xcb, 0xcc, 0xdb, 0x3d, 0x69, 0xfb, 0xe0, 0xcf, 0x63, + 0xdc, 0x27, 0x8e, 0xa1, 0x5e, 0x45, 0x1f, 0x3a, 0x3e, 0xed, 0xaf, 0xa0, 0xdd, 0xff, 0x4d, 0xb3, + 0xaf, 0x80, 0xfe, 0xf5, 0x24, 0x78, 0xd6, 0xc7, 0x22, 0x98, 0x08, 0xcf, 0x6f, 0xa5, 0xa3, 0x0b, + 0xf2, 0x0f, 0xcd, 0x06, 0xba, 0x41, 0xd5, 0xbb, 0x1c, 0xea, 0x1d, 0x50, 0x3d, 0x27, 0x42, 0xdd, + 0x6a, 0x61, 0x38, 0x33, 0x3e, 0xbb, 0xa5, 0x96, 0xf3, 0x2d, 0x2f, 0x0f, 0xd6, 0xef, 0x1c, 0x3a, + 0xe5, 0x09, 0x59, 0x76, 0x68, 0x58, 0xa0, 0xcf, 0x6f, 0xab, 0x46, 0xcd, 0x15, 0x07, 0x56, 0x5f, + 0xe7, 0x78, 0xde, 0xd3, 0xb0, 0xf7, 0xbd, 0x8e, 0x4f, 0x6f, 0xa7, 0xa4, 0xcb, 0xf2, 0x9f, 0x6b, + 0xd1, 0x43, 0x8f, 0xb5, 0xcf, 0x13, 0xc0, 0xa9, 0xc7, 0x8f, 0x02, 0xf6, 0x29, 0x25, 0x53, 0xb8, + 0xdf, 0xff, 0xe5, 0x94, 0xed, 0x87, 0xaf, 0x3c, 0x95, 0xfd, 0x24, 0x95, 0xbc, 0x68, 0x7f, 0xf8, + 0xca, 0xb7, 0x5b, 0x53, 0x43, 0xfa, 0xc3, 0x57, 0x01, 0xdc, 0xf9, 0xf0, 0x15, 0xe2, 0x19, 0xfd, + 0xf0, 0x15, 0x6a, 0x2d, 0xf8, 0xe1, 0xab, 0xb0, 0x06, 0x15, 0xde, 0x9b, 0x22, 0xd4, 0xe7, 0xd6, + 0xbd, 0x2c, 0xfa, 0xc7, 0xd8, 0xcf, 0x6e, 0xa3, 0x42, 0x2c, 0x70, 0x35, 0xa7, 0xee, 0xb9, 0xf5, + 0x68, 0x53, 0xef, 0xae, 0xdb, 0x4e, 0x6f, 0x5e, 0xfb, 0xfe, 0xa9, 0xde, 0xdd, 0x98, 0x70, 0x2e, + 0x0a, 0xf5, 0xd1, 0xb3, 0xcd, 0x50, 0x78, 0xae, 0x2c, 0xb8, 0x3d, 0xbf, 0xd5, 0x0f, 0x26, 0xaa, + 0x5b, 0x11, 0xba, 0xd3, 0x87, 0x5d, 0x86, 0x40, 0x97, 0xef, 0xf4, 0xe6, 0x89, 0x65, 0xa4, 0xf6, + 0x5d, 0xf7, 0x76, 0x0f, 0x63, 0x7e, 0x5f, 0x3f, 0xed, 0xaf, 0xa0, 0xdd, 0x2f, 0x75, 0xda, 0xe8, + 0xba, 0x57, 0xfd, 0xbc, 0xdd, 0x65, 0x6a, 0xec, 0x75, 0xf3, 0xb0, 0x2f, 0x1e, 0x4a, 0x20, 0xdc, + 0x25, 0xb4, 0x2b, 0x81, 0x40, 0x97, 0xd1, 0x4f, 0x6f, 0xa7, 0xa4, 0xcb, 0xf2, 0xcf, 0x6b, 0xd1, + 0x5d, 0xb2, 0x2c, 0x7a, 0x1c, 0x7c, 0xde, 0xd7, 0x32, 0x18, 0x0f, 0x5f, 0xdc, 0x5a, 0x4f, 0x17, + 0xea, 0xdf, 0xd6, 0xa2, 0x7b, 0x81, 0x42, 0xd5, 0x03, 0xe4, 0x16, 0xd6, 0xfd, 0x81, 0xf2, 0x83, + 0xdb, 0x2b, 0x52, 0xcb, 0xbd, 0x8b, 0x8f, 0xdb, 0x1f, 0x65, 0x0a, 0xd8, 0x1e, 0xd3, 0x1f, 0x65, + 0xea, 0xd6, 0x82, 0x87, 0x3c, 0xec, 0xa2, 0xd9, 0x74, 0xa1, 0x87, 0x3c, 0xea, 0x86, 0x5a, 0xf0, + 0xe3, 0x12, 0x18, 0x87, 0x39, 0x79, 0xf9, 0x36, 0x67, 0x59, 0x4c, 0x3b, 0xa9, 0xe5, 0xdd, 0x4e, + 0x0c, 0x07, 0x0f, 0xc7, 0x2a, 0xe9, 0x99, 0x68, 0x36, 0x52, 0x8f, 0x29, 0x7d, 0x83, 0x04, 0x0f, + 0xc7, 0x5a, 0x28, 0xe1, 0x4d, 0x67, 0x8d, 0x21, 0x6f, 0x20, 0x59, 0x7c, 0xd2, 0x07, 0x05, 0x29, + 0xba, 0xf1, 0x66, 0xce, 0xdc, 0xb7, 0x42, 0x56, 0x5a, 0xe7, 0xee, 0xdb, 0x3d, 0x69, 0xc2, 0xed, + 0x98, 0xcb, 0x2f, 0x39, 0x8b, 0x79, 0x11, 0x74, 0x6b, 0xa8, 0x5e, 0x6e, 0x5d, 0x1a, 0x73, 0xbb, + 0x2b, 0xd2, 0xc5, 0x3c, 0xd3, 0x9d, 0x49, 0xba, 0x75, 0xa9, 0x6e, 0xb7, 0x80, 0x86, 0xc7, 0x82, + 0xd6, 0xad, 0x4a, 0x2f, 0x9f, 0x84, 0xcd, 0x78, 0x59, 0xe5, 0x66, 0x2f, 0x96, 0xae, 0xa7, 0x1e, + 0x46, 0x1d, 0xf5, 0x04, 0x23, 0x69, 0xbb, 0x27, 0x0d, 0xcf, 0xe7, 0x1c, 0xb7, 0x66, 0x3c, 0xed, + 0x74, 0xd8, 0x6a, 0x0d, 0xa9, 0xa7, 0xfd, 0x15, 0xe0, 0x69, 0xa8, 0x1e, 0x55, 0x47, 0x49, 0x29, + 0xf7, 0x93, 0x34, 0x1d, 0x6c, 0x06, 0x86, 0x49, 0x03, 0x05, 0x4f, 0x43, 0x11, 0x98, 0x18, 0xc9, + 0xcd, 0xe9, 0x61, 0x36, 0xe8, 0xb2, 0xa3, 0xa8, 0x5e, 0x23, 0xd9, 0xa5, 0xc1, 0x89, 0x96, 0xd3, + 0xd4, 0xa6, 0xb6, 0xc3, 0x70, 0xc3, 0xb5, 0x2a, 0xbc, 0xd3, 0x9b, 0x07, 0x8f, 0xdb, 0x15, 0xa5, + 0x56, 0x96, 0x07, 0x94, 0x09, 0x6f, 0x25, 0x79, 0xd8, 0x41, 0x81, 0x53, 0xc1, 0x7a, 0x1a, 0xbd, + 0x49, 0xe2, 0x19, 0x97, 0xe8, 0x93, 0x22, 0x17, 0x08, 0x3e, 0x29, 0x02, 0x20, 0xe8, 0xba, 0xfa, + 0x77, 0x73, 0x1c, 0x7a, 0x18, 0x63, 0x5d, 0xa7, 0x95, 0x1d, 0x2a, 0xd4, 0x75, 0x28, 0x0d, 0xa2, + 0x81, 0x71, 0xab, 0x5f, 0xc7, 0x7f, 0x12, 0x32, 0x03, 0xde, 0xc9, 0xdf, 0xec, 0xc5, 0x82, 0x15, + 0xc5, 0x3a, 0x4c, 0xe6, 0x89, 0xc4, 0x56, 0x14, 0xc7, 0x46, 0x85, 0x84, 0x56, 0x94, 0x36, 0x4a, + 0x55, 0xaf, 0xca, 0x11, 0x0e, 0xe3, 0x70, 0xf5, 0x6a, 0xa6, 0x5f, 0xf5, 0x0c, 0xdb, 0x7a, 0xb0, + 0x99, 0x99, 0x21, 0x23, 0xaf, 0xf4, 0x66, 0x19, 0x19, 0xdb, 0xea, 0x35, 0x4d, 0x08, 0x86, 0xa2, + 0x0e, 0xa5, 0x00, 0x0f, 0xec, 0x2b, 0xae, 0x79, 0xf6, 0x9a, 0xe7, 0x9c, 0x15, 0x2c, 0x9b, 0xa2, + 0x9b, 0x53, 0x65, 0xb0, 0x45, 0x86, 0x36, 0xa7, 0xa4, 0x06, 0x78, 0x6c, 0xee, 0xbf, 0x60, 0x89, + 0x4c, 0x05, 0xf3, 0x26, 0xa3, 0xff, 0x7e, 0xe5, 0xe3, 0x1e, 0x24, 0x7c, 0x6c, 0xde, 0x00, 0xe6, + 0xe0, 0xbb, 0x76, 0xfa, 0x49, 0xc0, 0x94, 0x8f, 0x86, 0x36, 0xc2, 0xb4, 0x0a, 0x18, 0xd4, 0x26, + 0xc1, 0xe5, 0xf2, 0x27, 0x7c, 0x85, 0x0d, 0x6a, 0x9b, 0x9f, 0x2a, 0x24, 0x34, 0xa8, 0xdb, 0x28, + 0xc8, 0x33, 0xdd, 0x7d, 0xd0, 0x7a, 0x40, 0xdf, 0xdd, 0xfa, 0x6c, 0x74, 0x72, 0x60, 0xe6, 0xec, + 0x25, 0x4b, 0xef, 0x39, 0x01, 0x52, 0xd0, 0xbd, 0x64, 0x89, 0x3f, 0x26, 0xd8, 0xec, 0xc5, 0xc2, + 0x47, 0xf2, 0x4c, 0xf2, 0xb7, 0xcd, 0xb3, 0x72, 0xa4, 0xb8, 0x4a, 0xde, 0x7a, 0x58, 0xfe, 0xa8, + 0x1b, 0xb4, 0x17, 0x60, 0x4f, 0x0b, 0x31, 0xe5, 0x65, 0xa9, 0xbf, 0x54, 0xe9, 0xdf, 0x30, 0xd2, + 0xb2, 0x21, 0xf8, 0x4e, 0xe5, 0x83, 0x30, 0xe4, 0x7c, 0x5e, 0xae, 0x16, 0xd9, 0xaf, 0xde, 0xac, + 0xa3, 0x9a, 0xed, 0x0f, 0xde, 0x6c, 0x74, 0x72, 0x76, 0x7a, 0x69, 0xa9, 0xfb, 0x99, 0x9b, 0x47, + 0xa8, 0x3a, 0xf6, 0x85, 0x9b, 0xc7, 0x3d, 0x48, 0xed, 0xea, 0xcb, 0xe8, 0x9d, 0x23, 0x31, 0x1b, + 0xf3, 0x2c, 0x1e, 0x7c, 0xdf, 0xbf, 0x42, 0x2b, 0x66, 0xc3, 0xea, 0x67, 0x63, 0xf4, 0x0e, 0x25, + 0xb6, 0x97, 0x00, 0xf7, 0xf8, 0xc5, 0x62, 0x36, 0x96, 0x4c, 0x82, 0x4b, 0x80, 0xea, 0xf7, 0x61, + 0x25, 0x20, 0x2e, 0x01, 0x7a, 0x00, 0xb0, 0x37, 0x29, 0x38, 0x47, 0xed, 0x55, 0x82, 0xa0, 0x3d, + 0x0d, 0xd8, 0x2c, 0xc2, 0xd8, 0xab, 0x12, 0x75, 0x78, 0x69, 0xcf, 0xea, 0x28, 0x29, 0x91, 0x45, + 0xb4, 0x29, 0x3b, 0xb8, 0xeb, 0xea, 0xab, 0xaf, 0x8e, 0x2c, 0xe6, 0x73, 0x56, 0xac, 0xc0, 0xe0, + 0xd6, 0xb5, 0x74, 0x00, 0x62, 0x70, 0xa3, 0xa0, 0x9d, 0xb5, 0x4d, 0x33, 0x4f, 0xaf, 0x0f, 0x44, + 0x21, 0x16, 0x32, 0xc9, 0x38, 0xfc, 0xf2, 0x84, 0x69, 0x50, 0x97, 0x21, 0x66, 0x2d, 0xc5, 0xda, + 0x2c, 0x57, 0x11, 0xf5, 0x7d, 0x42, 0xf5, 0xf1, 0xec, 0x52, 0x8a, 0x02, 0x3e, 0x4f, 0xac, 0xad, + 0x40, 0x88, 0xc8, 0x72, 0x49, 0x18, 0xf4, 0xfd, 0x69, 0x92, 0xcd, 0xd0, 0xbe, 0x3f, 0x75, 0xbf, + 0xfe, 0x7a, 0x8f, 0x06, 0xec, 0x84, 0xaa, 0x1b, 0xad, 0x9e, 0x00, 0xfa, 0x5d, 0x4e, 0xb4, 0xd1, + 0x5d, 0x82, 0x98, 0x50, 0x38, 0x09, 0x5c, 0xbd, 0xca, 0x79, 0xc6, 0xe3, 0xe6, 0xd6, 0x1c, 0xe6, + 0xca, 0x23, 0x82, 0xae, 0x20, 0x69, 0x63, 0x91, 0x92, 0x9f, 0x2d, 0xb2, 0xd3, 0x42, 0x5c, 0x26, + 0x29, 0x2f, 0x40, 0x2c, 0xaa, 0xd5, 0x1d, 0x39, 0x11, 0x8b, 0x30, 0xce, 0x5e, 0xbf, 0x50, 0x52, + 0xef, 0x0b, 0xf0, 0x93, 0x82, 0x4d, 0xe1, 0xf5, 0x8b, 0xda, 0x46, 0x1b, 0x23, 0x4e, 0x06, 0x03, + 0xb8, 0x93, 0xe8, 0xd4, 0xae, 0xb3, 0x95, 0x1a, 0x1f, 0xfa, 0x5d, 0x42, 0xf5, 0x4d, 0xd4, 0x12, + 0x24, 0x3a, 0xda, 0x1c, 0x46, 0x12, 0x89, 0x4e, 0x58, 0xc3, 0x2e, 0x25, 0x8a, 0x3b, 0xd1, 0xd7, + 0x8a, 0xc0, 0x52, 0x52, 0xdb, 0x68, 0x84, 0xc4, 0x52, 0xd2, 0x82, 0x40, 0x40, 0x6a, 0xa6, 0xc1, + 0x0c, 0x0d, 0x48, 0x46, 0x1a, 0x0c, 0x48, 0x2e, 0x65, 0x03, 0xc5, 0x61, 0x96, 0xc8, 0x84, 0xa5, + 0x63, 0x2e, 0x4f, 0x59, 0xc1, 0xe6, 0x5c, 0xf2, 0x02, 0x06, 0x0a, 0x8d, 0x0c, 0x3d, 0x86, 0x08, + 0x14, 0x14, 0xab, 0x1d, 0xfe, 0x41, 0xf4, 0x5e, 0xb5, 0xee, 0xf3, 0x4c, 0xff, 0xad, 0x97, 0x97, + 0xea, 0x8f, 0x44, 0x0d, 0xde, 0x37, 0x36, 0xc6, 0xb2, 0xe0, 0x6c, 0xde, 0xd8, 0x7e, 0xd7, 0xfc, + 0xae, 0xc0, 0xa7, 0x6b, 0xd5, 0x78, 0x3e, 0x11, 0x32, 0xb9, 0xac, 0xb6, 0xd9, 0xfa, 0x0d, 0x22, + 0x30, 0x9e, 0x5d, 0xf1, 0x30, 0xf0, 0x2d, 0x0a, 0x8c, 0xb3, 0x71, 0xda, 0x95, 0x9e, 0xf1, 0x3c, + 0x85, 0x71, 0xda, 0xd3, 0x56, 0x00, 0x11, 0xa7, 0x51, 0xd0, 0x4e, 0x4e, 0x57, 0x3c, 0xe1, 0xe1, + 0xca, 0x4c, 0x78, 0xbf, 0xca, 0x4c, 0xbc, 0x97, 0x32, 0xd2, 0xe8, 0xbd, 0x63, 0x3e, 0xbf, 0xe0, + 0x45, 0x79, 0x95, 0xe4, 0xd4, 0x77, 0x5b, 0x2d, 0xd1, 0xf9, 0xdd, 0x56, 0x02, 0xb5, 0x2b, 0x81, + 0x05, 0x0e, 0xcb, 0x13, 0x36, 0xe7, 0xea, 0xcb, 0x1a, 0x60, 0x25, 0x70, 0x8c, 0x38, 0x10, 0xb1, + 0x12, 0x90, 0xb0, 0xf3, 0x7e, 0x97, 0x65, 0xce, 0xf8, 0xac, 0x1a, 0x61, 0xc5, 0x29, 0x5b, 0xcd, + 0x79, 0x26, 0xb5, 0x49, 0x70, 0x26, 0xef, 0x98, 0xc4, 0x79, 0xe2, 0x4c, 0xbe, 0x8f, 0x9e, 0x13, + 0x9a, 0xbc, 0x86, 0x3f, 0x15, 0x85, 0xac, 0xff, 0x92, 0xd3, 0x79, 0x91, 0x82, 0xd0, 0xe4, 0x37, + 0xaa, 0x47, 0x12, 0xa1, 0x29, 0xac, 0xe1, 0xfc, 0x15, 0x02, 0xaf, 0x0c, 0xaf, 0x79, 0x61, 0xc6, + 0xc9, 0xcb, 0x39, 0x4b, 0x52, 0x3d, 0x1a, 0x7e, 0x18, 0xb0, 0x4d, 0xe8, 0x10, 0x7f, 0x85, 0xa0, + 0xaf, 0xae, 0xf3, 0x77, 0x1b, 0xc2, 0x25, 0x04, 0x8f, 0x08, 0x3a, 0xec, 0x13, 0x8f, 0x08, 0xba, + 0xb5, 0xec, 0xce, 0xdd, 0xb2, 0x8a, 0x5b, 0x29, 0x62, 0x57, 0xc4, 0xf0, 0xbc, 0xd0, 0xb1, 0x09, + 0x40, 0x62, 0xe7, 0x1e, 0x54, 0xb0, 0xa9, 0x81, 0xc5, 0xf6, 0x93, 0x8c, 0xa5, 0xc9, 0xcf, 0x60, + 0x5a, 0xef, 0xd8, 0x69, 0x08, 0x22, 0x35, 0xc0, 0x49, 0xcc, 0xd5, 0x01, 0x97, 0x93, 0xa4, 0x0a, + 0xfd, 0x8f, 0x02, 0xed, 0xa6, 0x88, 0x6e, 0x57, 0x0e, 0xe9, 0x7c, 0xa3, 0x15, 0x36, 0xeb, 0x28, + 0xcf, 0xc7, 0xd5, 0xaa, 0x7a, 0xc6, 0xa7, 0x3c, 0xc9, 0xe5, 0xe0, 0xb3, 0x70, 0x5b, 0x01, 0x9c, + 0xb8, 0x68, 0xd1, 0x43, 0xcd, 0x79, 0x7c, 0x5f, 0xc5, 0x92, 0x71, 0xfd, 0x27, 0x0e, 0xcf, 0x4b, + 0x5e, 0xe8, 0x44, 0xe3, 0x80, 0x4b, 0x30, 0x3b, 0x1d, 0x6e, 0xe8, 0x80, 0x55, 0x45, 0x89, 0xd9, + 0x19, 0xd6, 0xb0, 0x87, 0x7d, 0x0e, 0xa7, 0xbf, 0xb9, 0xad, 0xee, 0x1b, 0x6e, 0x91, 0xc6, 0x1c, + 0x8a, 0x38, 0xec, 0xa3, 0x69, 0x9b, 0xad, 0xb5, 0xdd, 0x8e, 0xb2, 0xd5, 0x21, 0xbc, 0x32, 0x81, + 0x58, 0x52, 0x18, 0x91, 0xad, 0x05, 0x70, 0xe7, 0x30, 0xbc, 0x10, 0x2c, 0x9e, 0xb2, 0x52, 0x9e, + 0xb2, 0x55, 0x2a, 0x58, 0xac, 0xd6, 0x75, 0x78, 0x18, 0xde, 0x30, 0x43, 0x17, 0xa2, 0x0e, 0xc3, + 0x29, 0xd8, 0xcd, 0xce, 0xd4, 0x5f, 0x6e, 0xd4, 0x77, 0x39, 0x61, 0x76, 0xa6, 0xca, 0x0b, 0xef, + 0x71, 0x3e, 0x08, 0x43, 0xf6, 0x1d, 0xb4, 0x5a, 0xa4, 0xd2, 0x90, 0x7b, 0x98, 0x8e, 0x97, 0x80, + 0x7c, 0x14, 0x20, 0xec, 0x77, 0x29, 0xea, 0xdf, 0x9b, 0x3f, 0x3e, 0x24, 0xf5, 0x97, 0xac, 0xb7, + 0x30, 0x5d, 0x17, 0x1a, 0xba, 0x1f, 0xb8, 0xdb, 0xee, 0x49, 0xdb, 0x34, 0x73, 0xf7, 0x8a, 0xc9, + 0x51, 0x1c, 0x1f, 0xf3, 0x12, 0x79, 0xa1, 0xbc, 0x12, 0x0e, 0xad, 0x94, 0x48, 0x33, 0xdb, 0x94, + 0x1d, 0xe8, 0x95, 0xec, 0x65, 0x9c, 0x48, 0x2d, 0x6b, 0x6e, 0x48, 0x6f, 0xb5, 0x0d, 0xb4, 0x29, + 0xa2, 0x56, 0x34, 0x6d, 0x63, 0x79, 0xc5, 0x4c, 0xc4, 0x6c, 0x96, 0x72, 0x0d, 0x9d, 0x71, 0x56, + 0x7f, 0xc8, 0x6f, 0xa7, 0x6d, 0x0b, 0x05, 0x89, 0x58, 0x1e, 0x54, 0xb0, 0x69, 0x64, 0x85, 0xd5, + 0x8f, 0xa4, 0x9a, 0x86, 0xdd, 0x68, 0x9b, 0xf1, 0x00, 0x22, 0x8d, 0x44, 0x41, 0xfb, 0xde, 0x5b, + 0x25, 0x3e, 0xe0, 0x4d, 0x4b, 0xc0, 0x4f, 0x10, 0x29, 0x65, 0x47, 0x4c, 0xbc, 0xf7, 0x86, 0x60, + 0x76, 0x9f, 0x00, 0x3c, 0xbc, 0x58, 0x1d, 0xc6, 0x70, 0x9f, 0x00, 0xf5, 0x15, 0x43, 0xec, 0x13, + 0x28, 0xd6, 0xef, 0x3a, 0x73, 0xee, 0x75, 0xc4, 0x4a, 0x5b, 0x39, 0xa4, 0xeb, 0x50, 0x30, 0xd4, + 0x75, 0x94, 0x82, 0xdf, 0xa4, 0xee, 0xd1, 0x1a, 0xd2, 0xa4, 0xd8, 0xb9, 0xda, 0x7a, 0x17, 0x66, + 0xe3, 0x92, 0xd9, 0x4f, 0xaa, 0x2b, 0x4b, 0xf8, 0x17, 0xfc, 0x6b, 0x21, 0x11, 0x97, 0x5a, 0x50, + 0x6d, 0xfb, 0xc5, 0x47, 0xff, 0xf5, 0xf5, 0x9d, 0xb5, 0x5f, 0x7c, 0x7d, 0x67, 0xed, 0x7f, 0xbe, + 0xbe, 0xb3, 0xf6, 0xf3, 0x6f, 0xee, 0x7c, 0xeb, 0x17, 0xdf, 0xdc, 0xf9, 0xd6, 0x7f, 0x7f, 0x73, + 0xe7, 0x5b, 0x5f, 0xbd, 0xa3, 0xff, 0xa2, 0xef, 0xc5, 0xaf, 0xa8, 0xbf, 0xcb, 0xfb, 0xfc, 0xff, + 0x03, 0x00, 0x00, 0xff, 0xff, 0xda, 0x50, 0xa4, 0x4a, 0xf5, 0x77, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -409,6 +410,7 @@ type ClientCommandsClient interface { AccountRevertDeletion(ctx context.Context, in *pb.RpcAccountRevertDeletionRequest, opts ...grpc.CallOption) (*pb.RpcAccountRevertDeletionResponse, error) AccountSelect(ctx context.Context, in *pb.RpcAccountSelectRequest, opts ...grpc.CallOption) (*pb.RpcAccountSelectResponse, error) AccountEnableLocalNetworkSync(ctx context.Context, in *pb.RpcAccountEnableLocalNetworkSyncRequest, opts ...grpc.CallOption) (*pb.RpcAccountEnableLocalNetworkSyncResponse, error) + AccountChangeJsonApiAddr(ctx context.Context, in *pb.RpcAccountChangeJsonApiAddrRequest, opts ...grpc.CallOption) (*pb.RpcAccountChangeJsonApiAddrResponse, error) AccountStop(ctx context.Context, in *pb.RpcAccountStopRequest, opts ...grpc.CallOption) (*pb.RpcAccountStopResponse, error) AccountMove(ctx context.Context, in *pb.RpcAccountMoveRequest, opts ...grpc.CallOption) (*pb.RpcAccountMoveResponse, error) AccountConfigUpdate(ctx context.Context, in *pb.RpcAccountConfigUpdateRequest, opts ...grpc.CallOption) (*pb.RpcAccountConfigUpdateResponse, error) @@ -959,6 +961,15 @@ func (c *clientCommandsClient) AccountEnableLocalNetworkSync(ctx context.Context return out, nil } +func (c *clientCommandsClient) AccountChangeJsonApiAddr(ctx context.Context, in *pb.RpcAccountChangeJsonApiAddrRequest, opts ...grpc.CallOption) (*pb.RpcAccountChangeJsonApiAddrResponse, error) { + out := new(pb.RpcAccountChangeJsonApiAddrResponse) + err := c.cc.Invoke(ctx, "/anytype.ClientCommands/AccountChangeJsonApiAddr", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + func (c *clientCommandsClient) AccountStop(ctx context.Context, in *pb.RpcAccountStopRequest, opts ...grpc.CallOption) (*pb.RpcAccountStopResponse, error) { out := new(pb.RpcAccountStopResponse) err := c.cc.Invoke(ctx, "/anytype.ClientCommands/AccountStop", in, out, opts...) @@ -3257,6 +3268,7 @@ type ClientCommandsServer interface { AccountRevertDeletion(context.Context, *pb.RpcAccountRevertDeletionRequest) *pb.RpcAccountRevertDeletionResponse AccountSelect(context.Context, *pb.RpcAccountSelectRequest) *pb.RpcAccountSelectResponse AccountEnableLocalNetworkSync(context.Context, *pb.RpcAccountEnableLocalNetworkSyncRequest) *pb.RpcAccountEnableLocalNetworkSyncResponse + AccountChangeJsonApiAddr(context.Context, *pb.RpcAccountChangeJsonApiAddrRequest) *pb.RpcAccountChangeJsonApiAddrResponse AccountStop(context.Context, *pb.RpcAccountStopRequest) *pb.RpcAccountStopResponse AccountMove(context.Context, *pb.RpcAccountMoveRequest) *pb.RpcAccountMoveResponse AccountConfigUpdate(context.Context, *pb.RpcAccountConfigUpdateRequest) *pb.RpcAccountConfigUpdateResponse @@ -3647,6 +3659,9 @@ func (*UnimplementedClientCommandsServer) AccountSelect(ctx context.Context, req func (*UnimplementedClientCommandsServer) AccountEnableLocalNetworkSync(ctx context.Context, req *pb.RpcAccountEnableLocalNetworkSyncRequest) *pb.RpcAccountEnableLocalNetworkSyncResponse { return nil } +func (*UnimplementedClientCommandsServer) AccountChangeJsonApiAddr(ctx context.Context, req *pb.RpcAccountChangeJsonApiAddrRequest) *pb.RpcAccountChangeJsonApiAddrResponse { + return nil +} func (*UnimplementedClientCommandsServer) AccountStop(ctx context.Context, req *pb.RpcAccountStopRequest) *pb.RpcAccountStopResponse { return nil } @@ -4867,6 +4882,24 @@ func _ClientCommands_AccountEnableLocalNetworkSync_Handler(srv interface{}, ctx return interceptor(ctx, in, info, handler) } +func _ClientCommands_AccountChangeJsonApiAddr_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(pb.RpcAccountChangeJsonApiAddrRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ClientCommandsServer).AccountChangeJsonApiAddr(ctx, in), nil + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/anytype.ClientCommands/AccountChangeJsonApiAddr", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ClientCommandsServer).AccountChangeJsonApiAddr(ctx, req.(*pb.RpcAccountChangeJsonApiAddrRequest)), nil + } + return interceptor(ctx, in, info, handler) +} + func _ClientCommands_AccountStop_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(pb.RpcAccountStopRequest) if err := dec(in); err != nil { @@ -9461,6 +9494,10 @@ var _ClientCommands_serviceDesc = grpc.ServiceDesc{ MethodName: "AccountEnableLocalNetworkSync", Handler: _ClientCommands_AccountEnableLocalNetworkSync_Handler, }, + { + MethodName: "AccountChangeJsonApiAddr", + Handler: _ClientCommands_AccountChangeJsonApiAddr_Handler, + }, { MethodName: "AccountStop", Handler: _ClientCommands_AccountStop_Handler, From 7c7f51b07c9c9adb77ea567221db20ccf63bee79 Mon Sep 17 00:00:00 2001 From: Jannis Metrikat <120120832+jmetrikat@users.noreply.github.com> Date: Wed, 22 Jan 2025 17:32:27 +0100 Subject: [PATCH 143/195] GO-4459: Add new mocks and fix lint --- core/api/service.go | 2 - .../mock_service/mock_ClientCommandsServer.go | 49 +++++++++++++++++++ 2 files changed, 49 insertions(+), 2 deletions(-) diff --git a/core/api/service.go b/core/api/service.go index 84cd86be3..25c55bcdd 100644 --- a/core/api/service.go +++ b/core/api/service.go @@ -97,8 +97,6 @@ func (s *apiService) runServer() { fmt.Printf("API server ListenAndServe error: %v\n", err) } }() - - return } func (s *apiService) shutdown(ctx context.Context) (err error) { diff --git a/pb/service/mock_service/mock_ClientCommandsServer.go b/pb/service/mock_service/mock_ClientCommandsServer.go index a4b00d152..335613596 100644 --- a/pb/service/mock_service/mock_ClientCommandsServer.go +++ b/pb/service/mock_service/mock_ClientCommandsServer.go @@ -24,6 +24,55 @@ func (_m *MockClientCommandsServer) EXPECT() *MockClientCommandsServer_Expecter return &MockClientCommandsServer_Expecter{mock: &_m.Mock} } +// AccountChangeJsonApiAddr provides a mock function with given fields: _a0, _a1 +func (_m *MockClientCommandsServer) AccountChangeJsonApiAddr(_a0 context.Context, _a1 *pb.RpcAccountChangeJsonApiAddrRequest) *pb.RpcAccountChangeJsonApiAddrResponse { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for AccountChangeJsonApiAddr") + } + + var r0 *pb.RpcAccountChangeJsonApiAddrResponse + if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcAccountChangeJsonApiAddrRequest) *pb.RpcAccountChangeJsonApiAddrResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.RpcAccountChangeJsonApiAddrResponse) + } + } + + return r0 +} + +// MockClientCommandsServer_AccountChangeJsonApiAddr_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'AccountChangeJsonApiAddr' +type MockClientCommandsServer_AccountChangeJsonApiAddr_Call struct { + *mock.Call +} + +// AccountChangeJsonApiAddr is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *pb.RpcAccountChangeJsonApiAddrRequest +func (_e *MockClientCommandsServer_Expecter) AccountChangeJsonApiAddr(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_AccountChangeJsonApiAddr_Call { + return &MockClientCommandsServer_AccountChangeJsonApiAddr_Call{Call: _e.mock.On("AccountChangeJsonApiAddr", _a0, _a1)} +} + +func (_c *MockClientCommandsServer_AccountChangeJsonApiAddr_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcAccountChangeJsonApiAddrRequest)) *MockClientCommandsServer_AccountChangeJsonApiAddr_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*pb.RpcAccountChangeJsonApiAddrRequest)) + }) + return _c +} + +func (_c *MockClientCommandsServer_AccountChangeJsonApiAddr_Call) Return(_a0 *pb.RpcAccountChangeJsonApiAddrResponse) *MockClientCommandsServer_AccountChangeJsonApiAddr_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockClientCommandsServer_AccountChangeJsonApiAddr_Call) RunAndReturn(run func(context.Context, *pb.RpcAccountChangeJsonApiAddrRequest) *pb.RpcAccountChangeJsonApiAddrResponse) *MockClientCommandsServer_AccountChangeJsonApiAddr_Call { + _c.Call.Return(run) + return _c +} + // AccountChangeNetworkConfigAndRestart provides a mock function with given fields: _a0, _a1 func (_m *MockClientCommandsServer) AccountChangeNetworkConfigAndRestart(_a0 context.Context, _a1 *pb.RpcAccountChangeNetworkConfigAndRestartRequest) *pb.RpcAccountChangeNetworkConfigAndRestartResponse { ret := _m.Called(_a0, _a1) From a35c0abaa42009d48c0e06e6afeef961b56dfd46 Mon Sep 17 00:00:00 2001 From: AnastasiaShemyakinskaya Date: Wed, 22 Jan 2025 22:49:07 +0100 Subject: [PATCH 144/195] GO-4889: fix json marshaller Signed-off-by: AnastasiaShemyakinskaya --- core/converter/pbc/pbc.go | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/core/converter/pbc/pbc.go b/core/converter/pbc/pbc.go index 020febbdc..af8cc7150 100644 --- a/core/converter/pbc/pbc.go +++ b/core/converter/pbc/pbc.go @@ -50,9 +50,11 @@ func (p *pbc) Convert(sbType model.SmartBlockType) []byte { }) } mo := &pb.SnapshotWithType{ - SbType: sbType, - Snapshot: snapshot, - DependantDetails: dependentDetails, + SbType: sbType, + Snapshot: snapshot, + } + if len(dependentDetails) > 0 { + mo.DependantDetails = dependentDetails } if p.isJSON { m := jsonpb.Marshaler{Indent: " "} From 4a54b186cbc340b4da7fffc3004d68b7d5a0ad06 Mon Sep 17 00:00:00 2001 From: kirillston Date: Wed, 22 Jan 2025 23:05:40 +0100 Subject: [PATCH 145/195] Fix linkpreview call --- core/linkpreview.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/linkpreview.go b/core/linkpreview.go index 450da53f9..2cb4f1ac0 100644 --- a/core/linkpreview.go +++ b/core/linkpreview.go @@ -24,7 +24,7 @@ func (mw *Middleware) LinkPreview(cctx context.Context, req *pb.RpcLinkPreviewRe } } - data, _, _, err := getService[linkpreview.LinkPreview](mw).Fetch(ctx, u.String()) + data, _, _, err := mustService[linkpreview.LinkPreview](mw).Fetch(ctx, u.String()) if err != nil { return &pb.RpcLinkPreviewResponse{ Error: &pb.RpcLinkPreviewResponseError{ From 999f583af23976011c7c2da0b20317c7060d8593 Mon Sep 17 00:00:00 2001 From: AnastasiaShemyakinskaya Date: Wed, 22 Jan 2025 23:20:59 +0100 Subject: [PATCH 146/195] GO-4889: add tests Signed-off-by: AnastasiaShemyakinskaya --- core/block/export/export_test.go | 134 +++++++++++++++++++++++++++++++ core/converter/pbc/pbc_test.go | 48 +++++++++-- 2 files changed, 177 insertions(+), 5 deletions(-) diff --git a/core/block/export/export_test.go b/core/block/export/export_test.go index cd33df3eb..74c2e0f7b 100644 --- a/core/block/export/export_test.go +++ b/core/block/export/export_test.go @@ -4,10 +4,13 @@ import ( "archive/zip" "context" "fmt" + "os" "path/filepath" "testing" "github.com/anyproto/any-sync/app" + "github.com/gogo/protobuf/jsonpb" + "github.com/gogo/protobuf/types" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/mock" @@ -29,6 +32,7 @@ import ( "github.com/anyproto/anytype-heart/pkg/lib/pb/model" "github.com/anyproto/anytype-heart/space/spacecore/typeprovider/mock_typeprovider" "github.com/anyproto/anytype-heart/tests/testutil" + "github.com/anyproto/anytype-heart/util/pbtypes" ) func TestFileNamer_Get(t *testing.T) { @@ -1891,6 +1895,136 @@ func Test_docsForExport(t *testing.T) { assert.Nil(t, err) assert.Equal(t, 2, len(expCtx.docs)) }) + t.Run("include dependent details", func(t *testing.T) { + // given + storeFixture := objectstore.NewStoreFixture(t) + objectTypeId := "customObjectType" + objectTypeUniqueKey, err := domain.NewUniqueKey(smartblock.SmartBlockTypeObjectType, objectTypeId) + assert.Nil(t, err) + + objectID := "id" + targetBlockId := "targetBlockId" + storeFixture.AddObjects(t, spaceId, []spaceindex.TestObject{ + { + bundle.RelationKeyId: domain.String(objectID), + bundle.RelationKeyType: domain.String(objectTypeId), + bundle.RelationKeySpaceId: domain.String(spaceId), + }, + { + bundle.RelationKeyId: domain.String(targetBlockId), + bundle.RelationKeyType: domain.String(objectTypeId), + bundle.RelationKeySpaceId: domain.String(spaceId), + bundle.RelationKeyName: domain.String("test"), + }, + { + bundle.RelationKeyId: domain.String(objectTypeId), + bundle.RelationKeyUniqueKey: domain.String(objectTypeUniqueKey.Marshal()), + bundle.RelationKeyLayout: domain.Int64(int64(model.ObjectType_objectType)), + bundle.RelationKeyRecommendedRelations: domain.StringList([]string{addr.MissingObject}), + bundle.RelationKeySpaceId: domain.String(spaceId), + }, + }) + + objectGetter := mock_cache.NewMockObjectGetter(t) + + smartBlockTest := smarttest.New(objectID) + doc := smartBlockTest.NewState().SetDetails(domain.NewDetailsFromMap(map[domain.RelationKey]domain.Value{ + bundle.RelationKeyId: domain.String(objectID), + bundle.RelationKeyType: domain.String(objectTypeId), + })) + doc.AddRelationLinks(&model.RelationLink{ + Key: bundle.RelationKeyId.String(), + Format: model.RelationFormat_longtext, + }, &model.RelationLink{ + Key: bundle.RelationKeyType.String(), + Format: model.RelationFormat_longtext, + }) + smartBlockTest.Doc = doc + + smartBlockTest.AddBlock(simple.New(&model.Block{ + Id: objectID, + ChildrenIds: []string{"link"}, + Content: &model.BlockContentOfSmartblock{Smartblock: &model.BlockContentSmartblock{}}, + })) + smartBlockTest.AddBlock(simple.New(&model.Block{ + Id: "link", + Content: &model.BlockContentOfLink{Link: &model.BlockContentLink{ + TargetBlockId: targetBlockId, + }}, + })) + + smartBlockTest.SetSpaceId(spaceId) + objectType := smarttest.New(objectTypeId) + objectTypeDoc := objectType.NewState().SetDetails(domain.NewDetailsFromMap(map[domain.RelationKey]domain.Value{ + bundle.RelationKeyId: domain.String(objectTypeId), + bundle.RelationKeyType: domain.String(objectTypeId), + })) + objectTypeDoc.AddRelationLinks(&model.RelationLink{ + Key: bundle.RelationKeyId.String(), + Format: model.RelationFormat_longtext, + }, &model.RelationLink{ + Key: bundle.RelationKeyType.String(), + Format: model.RelationFormat_longtext, + }) + objectType.Doc = objectTypeDoc + objectType.SetType(smartblock.SmartBlockTypeObjectType) + objectType.SetSpaceId(spaceId) + + objectGetter.EXPECT().GetObject(context.Background(), objectID).Return(smartBlockTest, nil) + objectGetter.EXPECT().GetObject(context.Background(), objectTypeId).Return(objectType, nil) + + a := &app.App{} + mockSender := mock_event.NewMockSender(t) + a.Register(testutil.PrepareMock(context.Background(), a, mockSender)) + service := process.New() + err = service.Init(a) + assert.Nil(t, err) + + notifications := mock_notifications.NewMockNotifications(t) + + e := &export{ + objectStore: storeFixture, + picker: objectGetter, + processService: service, + notificationService: notifications, + } + + // when + path, success, err := e.Export(context.Background(), pb.RpcObjectListExportRequest{ + SpaceId: spaceId, + Path: t.TempDir(), + ObjectIds: []string{objectID}, + Format: model.Export_Protobuf, + IncludeFiles: true, + IsJson: true, + NoProgress: true, + IncludeDependentDetails: true, + }) + + // then + assert.Nil(t, err) + assert.Equal(t, 2, success) + + objectPath := filepath.Join(path, objectsDirectory, objectID+".pb.json") + file, err := os.Open(objectPath) + assert.Nil(t, err) + var snapshot pb.SnapshotWithType + err = jsonpb.Unmarshal(file, &snapshot) + assert.Nil(t, err) + + expected := []*pb.DependantDetail{ + { + Id: targetBlockId, + Details: &types.Struct{Fields: map[string]*types.Value{ + bundle.RelationKeyId.String(): pbtypes.String(targetBlockId), + bundle.RelationKeyType.String(): pbtypes.String(objectTypeId), + bundle.RelationKeySpaceId.String(): pbtypes.String(spaceId), + bundle.RelationKeyName.String(): pbtypes.String("test"), + }}, + }, + } + assert.Equal(t, expected, snapshot.DependantDetails) + }) } func Test_provideFileName(t *testing.T) { diff --git a/core/converter/pbc/pbc_test.go b/core/converter/pbc/pbc_test.go index 420043f7d..ca4f3fe33 100644 --- a/core/converter/pbc/pbc_test.go +++ b/core/converter/pbc/pbc_test.go @@ -3,17 +3,55 @@ package pbc import ( "testing" + "github.com/gogo/protobuf/jsonpb" + "github.com/gogo/protobuf/types" "github.com/stretchr/testify/assert" "github.com/anyproto/anytype-heart/core/block/editor/state" "github.com/anyproto/anytype-heart/core/block/editor/template" + "github.com/anyproto/anytype-heart/core/domain" + "github.com/anyproto/anytype-heart/pb" + "github.com/anyproto/anytype-heart/pkg/lib/bundle" + "github.com/anyproto/anytype-heart/pkg/lib/database" "github.com/anyproto/anytype-heart/pkg/lib/pb/model" + "github.com/anyproto/anytype-heart/util/pbtypes" ) func TestPbc_Convert(t *testing.T) { - s := state.NewDoc("root", nil).(*state.State) - template.InitTemplate(s, template.WithTitle) - c := NewConverter(s, false, nil) - result := c.Convert(model.SmartBlockType_Page) - assert.NotEmpty(t, result) + t.Run("success", func(t *testing.T) { + s := state.NewDoc("root", nil).(*state.State) + template.InitTemplate(s, template.WithTitle) + c := NewConverter(s, false, nil) + result := c.Convert(model.SmartBlockType_Page) + assert.NotEmpty(t, result) + }) + t.Run("dependent details", func(t *testing.T) { + s := state.NewDoc("root", nil).(*state.State) + template.InitTemplate(s, template.WithTitle) + records := []database.Record{ + { + Details: domain.NewDetailsFromMap(map[domain.RelationKey]domain.Value{ + bundle.RelationKeyId: domain.String("test"), + bundle.RelationKeyName: domain.String("test"), + }), + }, + } + c := NewConverter(s, true, records) + result := c.Convert(model.SmartBlockType_Page) + assert.NotEmpty(t, result) + + var resultSnapshot pb.SnapshotWithType + err := jsonpb.UnmarshalString(string(result), &resultSnapshot) + assert.Nil(t, err) + expected := []*pb.DependantDetail{ + { + Id: "test", + Details: &types.Struct{Fields: map[string]*types.Value{ + bundle.RelationKeyId.String(): pbtypes.String("test"), + bundle.RelationKeyName.String(): pbtypes.String("test"), + }}, + }, + } + assert.Equal(t, expected, resultSnapshot.DependantDetails) + }) } From 0087afeae7dbb52d8e8e1dec682de7fed08e7fdb Mon Sep 17 00:00:00 2001 From: AnastasiaShemyakinskaya Date: Wed, 22 Jan 2025 23:24:30 +0100 Subject: [PATCH 147/195] GO-4889: fix import Signed-off-by: AnastasiaShemyakinskaya --- core/block/import/pb/converter.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/block/import/pb/converter.go b/core/block/import/pb/converter.go index fc21e5713..e6544d974 100644 --- a/core/block/import/pb/converter.go +++ b/core/block/import/pb/converter.go @@ -285,7 +285,7 @@ func (p *Pb) getSnapshotFromFile(rd io.ReadCloser, name string) (*common.Snapsho defer rd.Close() if filepath.Ext(name) == ".json" { snapshot := &pb.SnapshotWithType{} - um := jsonpb.Unmarshaler{} + um := jsonpb.Unmarshaler{AllowUnknownFields: true} if uErr := um.Unmarshal(rd, snapshot); uErr != nil { return nil, fmt.Errorf("PB:GetSnapshot %w", uErr) } From e0f39ee3fc3ee918997cc7affe02ec3bf67661e0 Mon Sep 17 00:00:00 2001 From: Mikhail Date: Thu, 23 Jan 2025 14:55:31 +0100 Subject: [PATCH 148/195] GO-4937 Fix graylog overflow (#2041) --- metrics/interceptors.go | 78 +++++++++++++++++++++++++++++------------ 1 file changed, 55 insertions(+), 23 deletions(-) diff --git a/metrics/interceptors.go b/metrics/interceptors.go index 466a5e3de..61d356299 100644 --- a/metrics/interceptors.go +++ b/metrics/interceptors.go @@ -6,6 +6,7 @@ import ( "os" "path/filepath" "strings" + "sync" "time" "github.com/samber/lo" @@ -27,11 +28,33 @@ const ( ) var ( - // every duration will be added to the previous ones - UnaryTraceCollections = []time.Duration{time.Second * 3, time.Second * 7, time.Second * 10, time.Second * 30, time.Second * 50} // 3, 10, 20, 50, 100 - // UnaryWarningInProgressIndex specify the index of UnaryTraceCollections when we will send the warning log in-progress without waiting for the command to finish - UnaryWarningInProgressIndex = 1 + maxDuration = time.Second * 10 + cache = new(methodsCache) ) + +type methodsCache struct { + methods map[string]struct{} + mu sync.RWMutex +} + +func (c *methodsCache) addMethod(method string) { + c.mu.Lock() + defer c.mu.Unlock() + + if c.methods == nil { + c.methods = make(map[string]struct{}) + } + c.methods[method] = struct{}{} +} + +func (c *methodsCache) hasMethod(method string) bool { + c.mu.RLock() + defer c.mu.RUnlock() + + _, exists := c.methods[method] + return exists +} + var excludedMethods = []string{ "BlockSetCarriage", "BlockTextSetText", @@ -174,31 +197,40 @@ func SharedLongMethodsInterceptor(ctx context.Context, req any, methodName strin lastTrace := atomic.NewString("") l := log.With("method", methodName) go func() { - loop: - for i, duration := range UnaryTraceCollections { - select { - case <-doneCh: - break loop - case <-time.After(duration): - trace := debug.Stack(true) - // double check, because we can have a race and the stack trace can be taken after the method is already finished - if stackTraceHasMethod(methodName, trace) { - lastTrace.Store(string(trace)) - if i == UnaryWarningInProgressIndex { - traceCompressed := debug.CompressBytes(trace) - l.With("ver", 2).With("in_progress", true).With("goroutines", traceCompressed).With("total", time.Since(start).Milliseconds()).Warnf("grpc unary request is taking too long") - } - } + select { + case <-doneCh: + break + case <-time.After(maxDuration): + trace := debug.Stack(true) + // double check, because we can have a race and the stack trace can be taken after the method is already finished + if !cache.hasMethod(methodName) && stackTraceHasMethod(methodName, trace) { + lastTrace.Store(string(trace)) + traceCompressed := debug.CompressBytes(trace) + l.With("ver", 2). + With("in_progress", true). + With("goroutines", traceCompressed). + With("total", time.Since(start).Milliseconds()). + Warnf("grpc unary request is taking too long") + cache.addMethod(methodName) } } }() ctx = context.WithValue(ctx, CtxKeyRPC, methodName) resp, err := actualCall(ctx, req) close(doneCh) - if len(UnaryTraceCollections) > 0 && time.Since(start) > UnaryTraceCollections[0] { - // todo: save long stack trace to files - lastTraceB := debug.CompressBytes([]byte(lastTrace.String())) - l.With("ver", 2).With("error", err).With("in_progress", false).With("goroutines", lastTraceB).With("total", time.Since(start).Milliseconds()).Warnf("grpc unary request took too long") + if time.Since(start) > maxDuration { + if !cache.hasMethod(methodName) { + // todo: save long stack trace to files + lastTraceB := debug.CompressBytes([]byte(lastTrace.String())) + l.With("ver", 2). + With("error", err). + With("in_progress", false). + With("goroutines", lastTraceB). + With("total", time.Since(start).Milliseconds()). + Warnf("grpc unary request took too long") + cache.addMethod(methodName) + } + Service.Send( &LongMethodEvent{ methodName: methodName, From 0ce6d7abb867b86bef5716f41ce7387d41ab2133 Mon Sep 17 00:00:00 2001 From: AnastasiaShemyakinskaya Date: Thu, 23 Jan 2025 17:45:21 +0100 Subject: [PATCH 149/195] GO-4889: add state filters Signed-off-by: AnastasiaShemyakinskaya --- core/block/editor/state/state.go | 41 + core/block/export/export.go | 185 +- core/block/import/pb/converter.go | 2 +- core/publish/service.go | 21 + docs/proto.md | 18 + pb/commands.pb.go | 2703 ++++++++++++++++------------- pb/protos/commands.proto | 5 + 7 files changed, 1697 insertions(+), 1278 deletions(-) diff --git a/core/block/editor/state/state.go b/core/block/editor/state/state.go index 2d87af11c..3af2522b1 100644 --- a/core/block/editor/state/state.go +++ b/core/block/editor/state/state.go @@ -4,6 +4,7 @@ import ( "bytes" "errors" "fmt" + "slices" "strings" "time" @@ -139,6 +140,46 @@ type State struct { originalCreatedTimestamp int64 // pass here from snapshots when importing objects or used for derived objects such as relations, types and etc } +type Filters struct { + RelationsWhiteList []string + OnlyRootBlock bool +} + +func (s *State) Filter(filters *Filters) *State { + if filters == nil { + return s + } + if filters.OnlyRootBlock { + resultBlocks := make(map[string]simple.Block, 1) + resultBlocks[s.rootId] = s.blocks[s.rootId] + s.blocks = resultBlocks + } + if len(filters.RelationsWhiteList) > 0 { + s.cutRelations(filters) + } + if s.parent != nil { + s.parent = s.parent.Filter(filters) + } + return s +} + +func (s *State) cutRelations(filters *Filters) { + resultDetails := domain.NewDetails() + s.relationLinks = pbtypes.RelationLinks{} + for key, value := range s.details.Iterate() { + if slices.Contains(filters.RelationsWhiteList, key.String()) { + resultDetails.Set(key, value) + } + } + if resultDetails.Len() != len(filters.RelationsWhiteList) { + for key, value := range s.localDetails.Iterate() { + if slices.Contains(filters.RelationsWhiteList, key.String()) { + resultDetails.Set(key, value) + } + } + } +} + func (s *State) MigrationVersion() uint32 { return s.migrationVersion } diff --git a/core/block/export/export.go b/core/block/export/export.go index 9a0302621..60eff3576 100644 --- a/core/block/export/export.go +++ b/core/block/export/export.go @@ -134,51 +134,79 @@ func (e *export) finishWithNotification(spaceId string, exportFormat model.Expor }, nil) } +type Doc struct { + Details *domain.Details + isLink bool +} + +type Docs map[string]*Doc + +func (d Docs) transformToDetailsMap() map[string]*domain.Details { + details := make(map[string]*domain.Details, len(d)) + for id, doc := range d { + details[id] = doc.Details + } + return details +} + type exportContext struct { - spaceId string - docs map[string]*domain.Details - includeArchive bool - includeNested bool - includeFiles bool - format model.ExportFormat - isJson bool - reqIds []string - zip bool - path string + spaceId string + docs Docs + includeArchive bool + includeNested bool + includeFiles bool + format model.ExportFormat + isJson bool + reqIds []string + zip bool + path string + linkStateFilters *state.Filters + isLinkProcess bool *export } func newExportContext(e *export, req pb.RpcObjectListExportRequest) *exportContext { - return &exportContext{ - path: req.Path, - spaceId: req.SpaceId, - docs: map[string]*domain.Details{}, - includeArchive: req.IncludeArchived, - includeNested: req.IncludeNested, - includeFiles: req.IncludeFiles, - format: req.Format, - isJson: req.IsJson, - reqIds: req.ObjectIds, - zip: req.Zip, - export: e, + ec := &exportContext{ + path: req.Path, + spaceId: req.SpaceId, + docs: map[string]*Doc{}, + includeArchive: req.IncludeArchived, + includeNested: req.IncludeNested, + includeFiles: req.IncludeFiles, + format: req.Format, + isJson: req.IsJson, + reqIds: req.ObjectIds, + zip: req.Zip, + linkStateFilters: pbFiltersToState(req.LinksStateFilters), + export: e, } + return ec } func (e *exportContext) copy() *exportContext { return &exportContext{ - spaceId: e.spaceId, - docs: e.docs, - includeArchive: e.includeArchive, - includeNested: e.includeNested, - includeFiles: e.includeFiles, - format: e.format, - isJson: e.isJson, - reqIds: e.reqIds, - export: e.export, + spaceId: e.spaceId, + docs: e.docs, + includeArchive: e.includeArchive, + includeNested: e.includeNested, + includeFiles: e.includeFiles, + format: e.format, + isJson: e.isJson, + reqIds: e.reqIds, + export: e.export, + isLinkProcess: e.isLinkProcess, + linkStateFilters: e.linkStateFilters, } } +func (e *exportContext) getStateFilters(id string) *state.Filters { + if doc, ok := e.docs[id]; ok && doc.isLink { + return e.linkStateFilters + } + return nil +} + func (e *exportContext) exportObjects(ctx context.Context, queue process.Queue) (string, int, error) { var ( err error @@ -261,10 +289,11 @@ func (e *exportContext) exportDocs(ctx context.Context, succeed *int64, tasks []process.Task, ) []process.Task { + docsDetails := e.docs.transformToDetailsMap() for docId := range e.docs { did := docId task := func() { - if werr := e.writeDoc(ctx, wr, did); werr != nil { + if werr := e.writeDoc(ctx, wr, did, docsDetails); werr != nil { log.With("objectID", did).Warnf("can't export doc: %v", werr) } else { atomic.AddInt64(succeed, 1) @@ -277,7 +306,7 @@ func (e *exportContext) exportDocs(ctx context.Context, func (e *exportContext) exportGraphJson(ctx context.Context, succeed int, wr writer, queue process.Queue) int { mc := graphjson.NewMultiConverter(e.sbtProvider) - mc.SetKnownDocs(e.docs) + mc.SetKnownDocs(e.docs.transformToDetailsMap()) var werr error if succeed, werr = e.writeMultiDoc(ctx, mc, wr, queue); werr != nil { log.Warnf("can't export docs: %v", werr) @@ -291,7 +320,7 @@ func (e *exportContext) exportDotAndSVG(ctx context.Context, succeed int, wr wri format = dot.ExportFormatSVG } mc := dot.NewMultiConverter(format, e.sbtProvider) - mc.SetKnownDocs(e.docs) + mc.SetKnownDocs(e.docs.transformToDetailsMap()) var werr error if succeed, werr = e.writeMultiDoc(ctx, mc, wr, queue); werr != nil { log.Warnf("can't export docs: %v", werr) @@ -332,7 +361,7 @@ func (e *exportContext) getObjectsByIDs(isProtobuf bool) error { } for _, object := range res { id := object.Details.GetString(bundle.RelationKeyId) - e.docs[id] = object.Details + e.docs[id] = &Doc{Details: object.Details} } if isProtobuf { return e.processProtobuf() @@ -385,7 +414,7 @@ func (e *exportContext) processNotProtobuf() error { } if e.includeNested { for _, id := range ids { - e.addNestedObject(id, map[string]*domain.Details{}) + e.addNestedObject(id, map[string]*Doc{}) } } return nil @@ -426,7 +455,7 @@ func (e *exportContext) addDependentObjectsFromDataview() error { err error ) for id, details := range e.docs { - if isObjectWithDataview(details) { + if isObjectWithDataview(details.Details) { viewDependentObjectsIds, err = e.getViewDependentObjects(id, viewDependentObjectsIds) if err != nil { return err @@ -443,14 +472,17 @@ func (e *exportContext) addDependentObjectsFromDataview() error { } for _, object := range append(viewDependentObjects, templates...) { id := object.Details.GetString(bundle.RelationKeyId) - e.docs[id] = object.Details + e.docs[id] = &Doc{ + Details: object.Details, + isLink: e.isLinkProcess, + } } return nil } func (e *exportContext) getViewDependentObjects(id string, viewDependentObjectsIds []string) ([]string, error) { err := cache.Do(e.picker, id, func(sb sb.SmartBlock) error { - st := sb.NewState() + st := sb.NewState().Filter(e.getStateFilters(id)) viewDependentObjectsIds = append(viewDependentObjectsIds, objectlink.DependentObjectIDs(st, sb.Space(), objectlink.Flags{Blocks: true})...) return nil }) @@ -506,7 +538,7 @@ func (e *exportContext) addDerivedObjects() error { return nil } -func (e *exportContext) getRelationsAndTypes(notProcessedObjects map[string]*domain.Details, processedObjects map[string]struct{}) ([]string, []string, []string, error) { +func (e *exportContext) getRelationsAndTypes(notProcessedObjects map[string]*Doc, processedObjects map[string]struct{}) ([]string, []string, []string, error) { allRelations, allTypes, allSetOfList, err := e.collectDerivedObjects(notProcessedObjects) if err != nil { return nil, nil, nil, err @@ -525,11 +557,11 @@ func (e *exportContext) getRelationsAndTypes(notProcessedObjects map[string]*dom return allRelations, allTypes, allSetOfList, nil } -func (e *exportContext) collectDerivedObjects(objects map[string]*domain.Details) ([]string, []string, []string, error) { +func (e *exportContext) collectDerivedObjects(objects map[string]*Doc) ([]string, []string, []string, error) { var relations, objectsTypes, setOf []string for id := range objects { err := cache.Do(e.picker, id, func(b sb.SmartBlock) error { - state := b.NewState() + state := b.NewState().Filter(e.getStateFilters(id)) relations = lo.Union(relations, getObjectRelations(state)) details := state.CombinedDetails() if isObjectWithDataview(details) { @@ -582,7 +614,7 @@ func getDataviewRelations(state *state.State) ([]string, error) { } func (e *exportContext) getDerivedObjectsForTypes(allTypes []string, processedObjects map[string]struct{}) ([]string, []string, []string, error) { - notProceedTypes := make(map[string]*domain.Details) + notProceedTypes := make(map[string]*Doc) var relations, objectTypes []string for _, object := range allTypes { if _, ok := processedObjects[object]; ok { @@ -609,12 +641,13 @@ func (e *exportContext) getTemplatesRelationsAndTypes(allTypes []string, process if len(templates) == 0 { return nil, nil, nil, nil } - templatesToProcess := make(map[string]*domain.Details, len(templates)) + templatesToProcess := make(map[string]*Doc, len(templates)) for _, template := range templates { id := template.Details.GetString(bundle.RelationKeyId) if _, ok := e.docs[id]; !ok { - e.docs[id] = template.Details - templatesToProcess[id] = template.Details + templateDoc := &Doc{Details: template.Details, isLink: e.isLinkProcess} + e.docs[id] = templateDoc + templatesToProcess[id] = templateDoc } } templateRelations, templateType, templateSetOfList, err := e.getRelationsAndTypes(templatesToProcess, processedObjects) @@ -671,7 +704,7 @@ func (e *exportContext) addRelation(relation database.Record) { relationKey := domain.RelationKey(relation.Details.GetString(bundle.RelationKeyRelationKey)) if relationKey != "" && !bundle.HasRelation(relationKey) { id := relation.Details.GetString(bundle.RelationKeyId) - e.docs[id] = relation.Details + e.docs[id] = &Doc{Details: relation.Details, isLink: e.isLinkProcess} } } @@ -694,7 +727,7 @@ func (e *exportContext) addRelationOptions(relationKey string) error { } for _, option := range relationOptions { id := option.Details.GetString(bundle.RelationKeyId) - e.docs[id] = option.Details + e.docs[id] = &Doc{Details: option.Details, isLink: e.isLinkProcess} } return nil } @@ -748,7 +781,7 @@ func (e *exportContext) addObjectsAndCollectRecommendedRelations(objectTypes []d return nil, err } id := objectTypes[i].Details.GetString(bundle.RelationKeyId) - e.docs[id] = objectTypes[i].Details + e.docs[id] = &Doc{Details: objectTypes[i].Details, isLink: e.isLinkProcess} if uniqueKey.SmartblockType() == smartblock.SmartBlockTypeObjectType { key, err := domain.GetTypeKeyFromRawUniqueKey(rawUniqueKey) if err != nil { @@ -782,13 +815,13 @@ func (e *exportContext) addRecommendedRelations(recommendedRelations []string) e if bundle.IsSystemRelation(domain.RelationKey(uniqueKey.InternalKey())) { continue } - e.docs[id] = relation.Details + e.docs[id] = &Doc{Details: relation.Details, isLink: e.isLinkProcess} } return nil } func (e *exportContext) addNestedObjects(ids []string) error { - nestedDocs := make(map[string]*domain.Details, 0) + nestedDocs := make(map[string]*Doc, 0) for _, id := range ids { e.addNestedObject(id, nestedDocs) } @@ -798,6 +831,7 @@ func (e *exportContext) addNestedObjects(ids []string) error { exportCtxChild := e.copy() exportCtxChild.includeNested = false exportCtxChild.docs = nestedDocs + exportCtxChild.isLinkProcess = true err := exportCtxChild.processProtobuf() if err != nil { return err @@ -810,10 +844,20 @@ func (e *exportContext) addNestedObjects(ids []string) error { return nil } -func (e *exportContext) addNestedObject(id string, nestedDocs map[string]*domain.Details) { - links, err := e.objectStore.SpaceIndex(e.spaceId).GetOutboundLinksById(id) +func (e *exportContext) addNestedObject(id string, nestedDocs map[string]*Doc) { + var links []string + err := cache.Do(e.picker, id, func(sb sb.SmartBlock) error { + st := sb.NewState().Filter(e.getStateFilters(id)) + links = objectlink.DependentObjectIDs(st, sb.Space(), objectlink.Flags{ + Blocks: true, + Details: true, + Collection: true, + NoSystemRelations: true, + NoHiddenBundledRelations: true, + }) + return nil + }) if err != nil { - log.Errorf("export failed to get outbound links for id: %s", err) return } for _, link := range links { @@ -832,8 +876,9 @@ func (e *exportContext) addNestedObject(id string, nestedDocs map[string]*domain continue } if isLinkedObjectExist(rec) { - nestedDocs[link] = rec[0].Details - e.docs[link] = rec[0].Details + exportDoc := &Doc{Details: rec[0].Details, isLink: e.isLinkProcess} + nestedDocs[link] = exportDoc + e.docs[link] = exportDoc e.addNestedObject(link, nestedDocs) } } @@ -844,7 +889,7 @@ func (e *exportContext) fillLinkedFiles(id string) ([]string, error) { spaceIndex := e.objectStore.SpaceIndex(e.spaceId) var fileObjectsIds []string err := cache.Do(e.picker, id, func(b sb.SmartBlock) error { - b.NewState().IterateLinkedFiles(func(fileObjectId string) { + b.NewState().Filter(e.getStateFilters(id)).IterateLinkedFiles(func(fileObjectId string) { res, err := spaceIndex.Query(database.Query{ Filters: []database.FilterRequest{ { @@ -861,7 +906,7 @@ func (e *exportContext) fillLinkedFiles(id string) ([]string, error) { if len(res) == 0 { return } - e.docs[fileObjectId] = res[0].Details + e.docs[fileObjectId] = &Doc{Details: res[0].Details, isLink: e.isLinkProcess} fileObjectsIds = append(fileObjectsIds, fileObjectId) }) return nil @@ -885,7 +930,7 @@ func (e *exportContext) getExistedObjects(isProtobuf bool) error { } res = append(res, archivedObjects...) } - e.docs = make(map[string]*domain.Details, len(res)) + e.docs = make(map[string]*Doc, len(res)) for _, info := range res { objectSpaceID := e.spaceId if objectSpaceID == "" { @@ -899,15 +944,14 @@ func (e *exportContext) getExistedObjects(isProtobuf bool) error { if !objectValid(sbType, info, e.includeArchive, isProtobuf) { continue } - e.docs[info.Id] = info.Details - + e.docs[info.Id] = &Doc{Details: info.Details} } return nil } func (e *exportContext) listTargetTypesFromTemplates(ids []string) []string { for id, object := range e.docs { - if object.Has(bundle.RelationKeyTargetObjectType) { + if object.Details.Has(bundle.RelationKeyTargetObjectType) { ids = append(ids, id) } } @@ -950,13 +994,14 @@ func (e *exportContext) writeMultiDoc(ctx context.Context, mw converter.MultiCon return } -func (e *exportContext) writeDoc(ctx context.Context, wr writer, docId string) (err error) { +func (e *exportContext) writeDoc(ctx context.Context, wr writer, docId string, details map[string]*domain.Details) (err error) { return cache.Do(e.picker, docId, func(b sb.SmartBlock) error { st := b.NewState() if st.CombinedDetails().GetBool(bundle.RelationKeyIsDeleted) { return nil } + st = st.Filter(e.getStateFilters(docId)) if e.includeFiles && b.Type() == smartblock.SmartBlockTypeFileObject { fileName, err := e.saveFile(ctx, wr, b, e.spaceId == "") if err != nil { @@ -978,7 +1023,7 @@ func (e *exportContext) writeDoc(ctx context.Context, wr writer, docId string) ( case model.Export_JSON: conv = pbjson.NewConverter(st) } - conv.SetKnownDocs(e.docs) + conv.SetKnownDocs(details) result := conv.Convert(b.Type().ToProto()) var filename string if e.format == model.Export_Markdown { @@ -1198,7 +1243,7 @@ func cleanupFile(wr writer) { os.Remove(wr.Path()) } -func listObjectIds(docs map[string]*domain.Details) []string { +func listObjectIds(docs map[string]*Doc) []string { ids := make([]string, 0, len(docs)) for id := range docs { ids = append(ids, id) @@ -1209,3 +1254,13 @@ func listObjectIds(docs map[string]*domain.Details) []string { func isLinkedObjectExist(rec []database.Record) bool { return len(rec) > 0 && !rec[0].Details.GetBool(bundle.RelationKeyIsDeleted) } + +func pbFiltersToState(filters *pb.RpcObjectListExportStateFilters) *state.Filters { + if filters == nil { + return nil + } + return &state.Filters{ + RelationsWhiteList: filters.RelationsWhiteList, + OnlyRootBlock: filters.OnlyRootBlock, + } +} diff --git a/core/block/import/pb/converter.go b/core/block/import/pb/converter.go index fc21e5713..e6544d974 100644 --- a/core/block/import/pb/converter.go +++ b/core/block/import/pb/converter.go @@ -285,7 +285,7 @@ func (p *Pb) getSnapshotFromFile(rd io.ReadCloser, name string) (*common.Snapsho defer rd.Close() if filepath.Ext(name) == ".json" { snapshot := &pb.SnapshotWithType{} - um := jsonpb.Unmarshaler{} + um := jsonpb.Unmarshaler{AllowUnknownFields: true} if uErr := um.Unmarshal(rd, snapshot); uErr != nil { return nil, fmt.Errorf("PB:GetSnapshot %w", uErr) } diff --git a/core/publish/service.go b/core/publish/service.go index dc1c9f702..2947f3613 100644 --- a/core/publish/service.go +++ b/core/publish/service.go @@ -45,6 +45,23 @@ const ( indexFileName = "index.json.gz" ) +var publishingRelationsWhiteList = []string{ + bundle.RelationKeyName.String(), + bundle.RelationKeyDescription.String(), + bundle.RelationKeySnippet.String(), + bundle.RelationKeyType.String(), + bundle.RelationKeySpaceId.String(), + bundle.RelationKeyId.String(), + bundle.RelationKeyIconImage.String(), + bundle.RelationKeyIconEmoji.String(), + bundle.RelationKeyCoverType.String(), + bundle.RelationKeyCoverId.String(), + bundle.RelationKeyIsArchived.String(), + bundle.RelationKeyIsDeleted.String(), + bundle.RelationKeyDone.String(), + bundle.RelationKeyPicture.String(), +} + var log = logger.NewNamed(CName) var ErrLimitExceeded = errors.New("limit exceeded") @@ -130,6 +147,10 @@ func (s *service) exportToDir(ctx context.Context, spaceId, pageId string) (dirE Path: tempDir, ObjectIds: []string{pageId}, NoProgress: true, + LinksStateFilters: &pb.RpcObjectListExportStateFilters{ + RelationsWhiteList: publishingRelationsWhiteList, + OnlyRootBlock: true, + }, }) if err != nil { return diff --git a/docs/proto.md b/docs/proto.md index 2394c9964..e030166b8 100644 --- a/docs/proto.md +++ b/docs/proto.md @@ -918,6 +918,7 @@ - [Rpc.Object.ListExport.Request](#anytype-Rpc-Object-ListExport-Request) - [Rpc.Object.ListExport.Response](#anytype-Rpc-Object-ListExport-Response) - [Rpc.Object.ListExport.Response.Error](#anytype-Rpc-Object-ListExport-Response-Error) + - [Rpc.Object.ListExport.StateFilters](#anytype-Rpc-Object-ListExport-StateFilters) - [Rpc.Object.ListModifyDetailValues](#anytype-Rpc-Object-ListModifyDetailValues) - [Rpc.Object.ListModifyDetailValues.Request](#anytype-Rpc-Object-ListModifyDetailValues-Request) - [Rpc.Object.ListModifyDetailValues.Request.Operation](#anytype-Rpc-Object-ListModifyDetailValues-Request-Operation) @@ -15553,6 +15554,7 @@ Deletes the object, keys from the local store and unsubscribe from remote change | isJson | [bool](#bool) | | for protobuf export | | includeArchived | [bool](#bool) | | for migration | | noProgress | [bool](#bool) | | for integrations like raycast and web publishing | +| linksStateFilters | [Rpc.Object.ListExport.StateFilters](#anytype-Rpc-Object-ListExport-StateFilters) | | | @@ -15593,6 +15595,22 @@ Deletes the object, keys from the local store and unsubscribe from remote change + + +### Rpc.Object.ListExport.StateFilters + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| relationsWhiteList | [string](#string) | repeated | | +| onlyRootBlock | [bool](#bool) | | | + + + + + + ### Rpc.Object.ListModifyDetailValues diff --git a/pb/commands.pb.go b/pb/commands.pb.go index 84e0979bb..866388565 100644 --- a/pb/commands.pb.go +++ b/pb/commands.pb.go @@ -3468,7 +3468,7 @@ func (x RpcObjectListExportResponseErrorCode) String() string { } func (RpcObjectListExportResponseErrorCode) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 6, 47, 1, 0, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 6, 47, 2, 0, 0} } type RpcObjectImportRequestMode int32 @@ -29807,7 +29807,8 @@ type RpcObjectListExportRequest struct { // for migration IncludeArchived bool `protobuf:"varint,9,opt,name=includeArchived,proto3" json:"includeArchived,omitempty"` // for integrations like raycast and web publishing - NoProgress bool `protobuf:"varint,11,opt,name=noProgress,proto3" json:"noProgress,omitempty"` + NoProgress bool `protobuf:"varint,11,opt,name=noProgress,proto3" json:"noProgress,omitempty"` + LinksStateFilters *RpcObjectListExportStateFilters `protobuf:"bytes,12,opt,name=linksStateFilters,proto3" json:"linksStateFilters,omitempty"` } func (m *RpcObjectListExportRequest) Reset() { *m = RpcObjectListExportRequest{} } @@ -29913,6 +29914,65 @@ func (m *RpcObjectListExportRequest) GetNoProgress() bool { return false } +func (m *RpcObjectListExportRequest) GetLinksStateFilters() *RpcObjectListExportStateFilters { + if m != nil { + return m.LinksStateFilters + } + return nil +} + +type RpcObjectListExportStateFilters struct { + RelationsWhiteList []string `protobuf:"bytes,1,rep,name=relationsWhiteList,proto3" json:"relationsWhiteList,omitempty"` + OnlyRootBlock bool `protobuf:"varint,2,opt,name=onlyRootBlock,proto3" json:"onlyRootBlock,omitempty"` +} + +func (m *RpcObjectListExportStateFilters) Reset() { *m = RpcObjectListExportStateFilters{} } +func (m *RpcObjectListExportStateFilters) String() string { return proto.CompactTextString(m) } +func (*RpcObjectListExportStateFilters) ProtoMessage() {} +func (*RpcObjectListExportStateFilters) Descriptor() ([]byte, []int) { + return fileDescriptor_8261c968b2e6f45c, []int{0, 6, 47, 1} +} +func (m *RpcObjectListExportStateFilters) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *RpcObjectListExportStateFilters) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_RpcObjectListExportStateFilters.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 *RpcObjectListExportStateFilters) XXX_Merge(src proto.Message) { + xxx_messageInfo_RpcObjectListExportStateFilters.Merge(m, src) +} +func (m *RpcObjectListExportStateFilters) XXX_Size() int { + return m.Size() +} +func (m *RpcObjectListExportStateFilters) XXX_DiscardUnknown() { + xxx_messageInfo_RpcObjectListExportStateFilters.DiscardUnknown(m) +} + +var xxx_messageInfo_RpcObjectListExportStateFilters proto.InternalMessageInfo + +func (m *RpcObjectListExportStateFilters) GetRelationsWhiteList() []string { + if m != nil { + return m.RelationsWhiteList + } + return nil +} + +func (m *RpcObjectListExportStateFilters) GetOnlyRootBlock() bool { + if m != nil { + return m.OnlyRootBlock + } + return false +} + type RpcObjectListExportResponse struct { Error *RpcObjectListExportResponseError `protobuf:"bytes,1,opt,name=error,proto3" json:"error,omitempty"` Path string `protobuf:"bytes,2,opt,name=path,proto3" json:"path,omitempty"` @@ -29924,7 +29984,7 @@ func (m *RpcObjectListExportResponse) Reset() { *m = RpcObjectListExport func (m *RpcObjectListExportResponse) String() string { return proto.CompactTextString(m) } func (*RpcObjectListExportResponse) ProtoMessage() {} func (*RpcObjectListExportResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 6, 47, 1} + return fileDescriptor_8261c968b2e6f45c, []int{0, 6, 47, 2} } func (m *RpcObjectListExportResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -29990,7 +30050,7 @@ func (m *RpcObjectListExportResponseError) Reset() { *m = RpcObjectListE func (m *RpcObjectListExportResponseError) String() string { return proto.CompactTextString(m) } func (*RpcObjectListExportResponseError) ProtoMessage() {} func (*RpcObjectListExportResponseError) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 6, 47, 1, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 6, 47, 2, 0} } func (m *RpcObjectListExportResponseError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -71511,6 +71571,7 @@ func init() { proto.RegisterType((*RpcObjectApplyTemplateResponseError)(nil), "anytype.Rpc.Object.ApplyTemplate.Response.Error") proto.RegisterType((*RpcObjectListExport)(nil), "anytype.Rpc.Object.ListExport") proto.RegisterType((*RpcObjectListExportRequest)(nil), "anytype.Rpc.Object.ListExport.Request") + proto.RegisterType((*RpcObjectListExportStateFilters)(nil), "anytype.Rpc.Object.ListExport.StateFilters") proto.RegisterType((*RpcObjectListExportResponse)(nil), "anytype.Rpc.Object.ListExport.Response") proto.RegisterType((*RpcObjectListExportResponseError)(nil), "anytype.Rpc.Object.ListExport.Response.Error") proto.RegisterType((*RpcObjectImport)(nil), "anytype.Rpc.Object.Import") @@ -72331,1239 +72392,1243 @@ func init() { func init() { proto.RegisterFile("pb/protos/commands.proto", fileDescriptor_8261c968b2e6f45c) } var fileDescriptor_8261c968b2e6f45c = []byte{ - // 19701 bytes of a gzipped FileDescriptorProto + // 19766 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0xfd, 0x7d, 0x9c, 0x24, 0x49, 0x55, 0x2f, 0x8c, 0x4f, 0x65, 0x56, 0x55, 0x77, 0x9f, 0x7e, 0x99, 0x9a, 0xdc, 0x99, 0xd9, 0xd9, - 0xd8, 0x65, 0x76, 0x9d, 0x5d, 0x96, 0x75, 0x59, 0x7a, 0x97, 0x05, 0x91, 0x5d, 0xf6, 0xad, 0xba, + 0xd8, 0x65, 0x76, 0x9c, 0x5d, 0x96, 0x75, 0x59, 0x7a, 0x97, 0x05, 0x91, 0x5d, 0xf6, 0xad, 0xba, 0xba, 0xba, 0xbb, 0x76, 0xbb, 0xab, 0xda, 0xac, 0xea, 0x19, 0x56, 0xaf, 0xbf, 0xba, 0x39, 0x55, - 0xd1, 0xdd, 0xb9, 0x53, 0x9d, 0x59, 0x66, 0x66, 0xf7, 0xec, 0xf0, 0xfb, 0xdc, 0xe7, 0x8a, 0xb8, - 0x02, 0x22, 0x17, 0x11, 0x51, 0x01, 0x79, 0x67, 0xe1, 0x82, 0x02, 0xf2, 0x7e, 0x41, 0x05, 0xe4, - 0x45, 0x5e, 0x44, 0x44, 0x10, 0x41, 0x74, 0x1f, 0x41, 0x10, 0xf1, 0x7e, 0xe4, 0xf2, 0xe8, 0x73, - 0x05, 0x51, 0x78, 0x7c, 0x3e, 0x19, 0x11, 0xf9, 0x12, 0xd5, 0x95, 0x59, 0x91, 0xd5, 0x95, 0xd5, - 0x8b, 0x3c, 0xff, 0x65, 0x46, 0x46, 0x9e, 0x38, 0x71, 0xbe, 0x27, 0x22, 0x4e, 0x44, 0x9c, 0x38, - 0x01, 0xa7, 0xba, 0xe7, 0x6f, 0xee, 0x5a, 0xa6, 0x63, 0xda, 0x37, 0xb7, 0xcc, 0x9d, 0x1d, 0xcd, - 0x68, 0xdb, 0xf3, 0xe4, 0x5d, 0x99, 0xd0, 0x8c, 0x4b, 0xce, 0xa5, 0x2e, 0x46, 0xd7, 0x75, 0x2f, - 0x6c, 0xdd, 0xdc, 0xd1, 0xcf, 0xdf, 0xdc, 0x3d, 0x7f, 0xf3, 0x8e, 0xd9, 0xc6, 0x1d, 0xef, 0x07, - 0xf2, 0xc2, 0xb2, 0xa3, 0x1b, 0xa2, 0x72, 0x75, 0xcc, 0x96, 0xd6, 0xb1, 0x1d, 0xd3, 0xc2, 0x2c, - 0xe7, 0xc9, 0xa0, 0x48, 0xbc, 0x87, 0x0d, 0xc7, 0xa3, 0x70, 0xd5, 0x96, 0x69, 0x6e, 0x75, 0x30, - 0xfd, 0x76, 0x7e, 0x77, 0xf3, 0x66, 0xdb, 0xb1, 0x76, 0x5b, 0x0e, 0xfb, 0x7a, 0x4d, 0xef, 0xd7, - 0x36, 0xb6, 0x5b, 0x96, 0xde, 0x75, 0x4c, 0x8b, 0xe6, 0x38, 0xf3, 0xc9, 0x17, 0x4e, 0x82, 0xac, - 0x76, 0x5b, 0xe8, 0xdb, 0x13, 0x20, 0x17, 0xbb, 0x5d, 0xf4, 0x51, 0x09, 0x60, 0x19, 0x3b, 0x67, - 0xb1, 0x65, 0xeb, 0xa6, 0x81, 0x8e, 0xc2, 0x84, 0x8a, 0x7f, 0x66, 0x17, 0xdb, 0xce, 0xed, 0xd9, - 0xe7, 0x7c, 0x5d, 0xce, 0xa0, 0x87, 0x25, 0x98, 0x54, 0xb1, 0xdd, 0x35, 0x0d, 0x1b, 0x2b, 0xf7, - 0x40, 0x0e, 0x5b, 0x96, 0x69, 0x9d, 0xca, 0x5c, 0x93, 0xb9, 0x61, 0xfa, 0xd6, 0x1b, 0xe7, 0x59, - 0xf5, 0xe7, 0xd5, 0x6e, 0x6b, 0xbe, 0xd8, 0xed, 0xce, 0x07, 0x94, 0xe6, 0xbd, 0x9f, 0xe6, 0xcb, - 0xee, 0x1f, 0x2a, 0xfd, 0x51, 0x39, 0x05, 0x13, 0x7b, 0x34, 0xc3, 0x29, 0xe9, 0x9a, 0xcc, 0x0d, - 0x53, 0xaa, 0xf7, 0xea, 0x7e, 0x69, 0x63, 0x47, 0xd3, 0x3b, 0xf6, 0x29, 0x99, 0x7e, 0x61, 0xaf, - 0xe8, 0x35, 0x19, 0xc8, 0x11, 0x22, 0x4a, 0x09, 0xb2, 0x2d, 0xb3, 0x8d, 0x49, 0xf1, 0x73, 0xb7, - 0xde, 0x2c, 0x5e, 0xfc, 0x7c, 0xc9, 0x6c, 0x63, 0x95, 0xfc, 0xac, 0x5c, 0x03, 0xd3, 0x9e, 0x58, - 0x02, 0x36, 0xc2, 0x49, 0x67, 0x6e, 0x85, 0xac, 0x9b, 0x5f, 0x99, 0x84, 0x6c, 0x75, 0x63, 0x75, - 0xb5, 0x70, 0x44, 0x39, 0x06, 0xb3, 0x1b, 0xd5, 0xfb, 0xaa, 0xb5, 0x73, 0xd5, 0x66, 0x59, 0x55, - 0x6b, 0x6a, 0x21, 0xa3, 0xcc, 0xc2, 0xd4, 0x42, 0x71, 0xb1, 0x59, 0xa9, 0xae, 0x6f, 0x34, 0x0a, - 0x12, 0x7a, 0x85, 0x0c, 0x73, 0x75, 0xec, 0x2c, 0xe2, 0x3d, 0xbd, 0x85, 0xeb, 0x8e, 0xe6, 0x60, - 0xf4, 0x82, 0x8c, 0x2f, 0x4c, 0x65, 0xc3, 0x2d, 0xd4, 0xff, 0xc4, 0x2a, 0xf0, 0xa4, 0x7d, 0x15, - 0xe0, 0x29, 0xcc, 0xb3, 0xbf, 0xe7, 0x43, 0x69, 0x6a, 0x98, 0xce, 0x99, 0x27, 0xc0, 0x74, 0xe8, - 0x9b, 0x32, 0x07, 0xb0, 0x50, 0x2c, 0xdd, 0xb7, 0xac, 0xd6, 0x36, 0xaa, 0x8b, 0x85, 0x23, 0xee, - 0xfb, 0x52, 0x4d, 0x2d, 0xb3, 0xf7, 0x0c, 0xfa, 0x6e, 0x26, 0x04, 0xe6, 0x22, 0x0f, 0xe6, 0xfc, - 0x60, 0x66, 0xfa, 0x00, 0x8a, 0x5e, 0xef, 0x83, 0xb3, 0xcc, 0x81, 0xf3, 0xa4, 0x64, 0xe4, 0xd2, - 0x07, 0xe8, 0x21, 0x09, 0x26, 0xeb, 0xdb, 0xbb, 0x4e, 0xdb, 0xbc, 0x68, 0xa0, 0x29, 0x1f, 0x19, - 0xf4, 0xcd, 0xb0, 0x4c, 0xee, 0xe2, 0x65, 0x72, 0xc3, 0xfe, 0x4a, 0x30, 0x0a, 0x11, 0xd2, 0x78, - 0x95, 0x2f, 0x8d, 0x22, 0x27, 0x8d, 0x27, 0x88, 0x12, 0x4a, 0x5f, 0x0e, 0x2f, 0x7d, 0x2a, 0xe4, - 0xea, 0x5d, 0xad, 0x85, 0xd1, 0xa7, 0x64, 0x98, 0x59, 0xc5, 0xda, 0x1e, 0x2e, 0x76, 0xbb, 0x96, - 0xb9, 0x87, 0x51, 0x29, 0xd0, 0xd7, 0x53, 0x30, 0x61, 0xbb, 0x99, 0x2a, 0x6d, 0x52, 0x83, 0x29, - 0xd5, 0x7b, 0x55, 0x4e, 0x03, 0xe8, 0x6d, 0x6c, 0x38, 0xba, 0xa3, 0x63, 0xfb, 0x94, 0x74, 0x8d, - 0x7c, 0xc3, 0x94, 0x1a, 0x4a, 0x41, 0xdf, 0x96, 0x44, 0x75, 0x8c, 0x70, 0x31, 0x1f, 0xe6, 0x20, - 0x42, 0xaa, 0xaf, 0x95, 0x44, 0x74, 0x6c, 0x20, 0xb9, 0x64, 0xb2, 0x7d, 0x4b, 0x26, 0xb9, 0x70, + 0xd1, 0xdd, 0xb9, 0x53, 0x9d, 0x59, 0x66, 0x66, 0xf7, 0x6c, 0xf3, 0xfb, 0xdc, 0xe7, 0x8a, 0xb8, + 0x82, 0x22, 0x17, 0x11, 0x51, 0x51, 0x01, 0x79, 0x59, 0xbd, 0xa2, 0x88, 0xbc, 0x5f, 0x50, 0x11, + 0x05, 0x04, 0x51, 0x11, 0x41, 0x04, 0xd1, 0x7d, 0x04, 0x41, 0xc4, 0xfb, 0x91, 0xcb, 0xa3, 0xcf, + 0x15, 0x44, 0xe1, 0xf1, 0xf9, 0x64, 0x44, 0xe4, 0x4b, 0x54, 0x57, 0x66, 0x45, 0x56, 0x57, 0x56, + 0x2f, 0xf2, 0xfc, 0x97, 0x19, 0x19, 0x79, 0xe2, 0xc4, 0xf9, 0x9e, 0x88, 0x38, 0x11, 0x71, 0xe2, + 0x04, 0x9c, 0xe9, 0x5e, 0xba, 0xad, 0x6b, 0x99, 0x8e, 0x69, 0xdf, 0xd6, 0x32, 0x77, 0x76, 0x34, + 0xa3, 0x6d, 0xcf, 0x93, 0x77, 0x65, 0x42, 0x33, 0xf6, 0x9d, 0xfd, 0x2e, 0x46, 0x37, 0x76, 0x2f, + 0x6f, 0xdd, 0xd6, 0xd1, 0x2f, 0xdd, 0xd6, 0xbd, 0x74, 0xdb, 0x8e, 0xd9, 0xc6, 0x1d, 0xef, 0x07, + 0xf2, 0xc2, 0xb2, 0xa3, 0x9b, 0xa3, 0x72, 0x75, 0xcc, 0x96, 0xd6, 0xb1, 0x1d, 0xd3, 0xc2, 0x2c, + 0xe7, 0xe9, 0xa0, 0x48, 0xbc, 0x87, 0x0d, 0xc7, 0xa3, 0x70, 0xdd, 0x96, 0x69, 0x6e, 0x75, 0x30, + 0xfd, 0x76, 0x69, 0x77, 0xf3, 0x36, 0xdb, 0xb1, 0x76, 0x5b, 0x0e, 0xfb, 0x7a, 0xae, 0xf7, 0x6b, + 0x1b, 0xdb, 0x2d, 0x4b, 0xef, 0x3a, 0xa6, 0x45, 0x73, 0x9c, 0x7f, 0xf1, 0xcb, 0x27, 0x41, 0x56, + 0xbb, 0x2d, 0xf4, 0xd5, 0x09, 0x90, 0x8b, 0xdd, 0x2e, 0xfa, 0xa0, 0x04, 0xb0, 0x8c, 0x9d, 0x0b, + 0xd8, 0xb2, 0x75, 0xd3, 0x40, 0xc7, 0x61, 0x42, 0xc5, 0x3f, 0xb0, 0x8b, 0x6d, 0xe7, 0xae, 0xec, + 0x8b, 0xbe, 0x28, 0x67, 0xd0, 0x63, 0x12, 0x4c, 0xaa, 0xd8, 0xee, 0x9a, 0x86, 0x8d, 0x95, 0xfb, + 0x21, 0x87, 0x2d, 0xcb, 0xb4, 0xce, 0x64, 0xce, 0x65, 0x6e, 0x9e, 0xbe, 0xe3, 0x96, 0x79, 0x56, + 0xfd, 0x79, 0xb5, 0xdb, 0x9a, 0x2f, 0x76, 0xbb, 0xf3, 0x01, 0xa5, 0x79, 0xef, 0xa7, 0xf9, 0xb2, + 0xfb, 0x87, 0x4a, 0x7f, 0x54, 0xce, 0xc0, 0xc4, 0x1e, 0xcd, 0x70, 0x46, 0x3a, 0x97, 0xb9, 0x79, + 0x4a, 0xf5, 0x5e, 0xdd, 0x2f, 0x6d, 0xec, 0x68, 0x7a, 0xc7, 0x3e, 0x23, 0xd3, 0x2f, 0xec, 0x15, + 0xbd, 0x2e, 0x03, 0x39, 0x42, 0x44, 0x29, 0x41, 0xb6, 0x65, 0xb6, 0x31, 0x29, 0x7e, 0xee, 0x8e, + 0xdb, 0xc4, 0x8b, 0x9f, 0x2f, 0x99, 0x6d, 0xac, 0x92, 0x9f, 0x95, 0x73, 0x30, 0xed, 0x89, 0x25, + 0x60, 0x23, 0x9c, 0x74, 0xfe, 0x0e, 0xc8, 0xba, 0xf9, 0x95, 0x49, 0xc8, 0x56, 0x37, 0x56, 0x57, + 0x0b, 0xc7, 0x94, 0x13, 0x30, 0xbb, 0x51, 0x7d, 0xb0, 0x5a, 0xbb, 0x58, 0x6d, 0x96, 0x55, 0xb5, + 0xa6, 0x16, 0x32, 0xca, 0x2c, 0x4c, 0x2d, 0x14, 0x17, 0x9b, 0x95, 0xea, 0xfa, 0x46, 0xa3, 0x20, + 0xa1, 0x57, 0xcb, 0x30, 0x57, 0xc7, 0xce, 0x22, 0xde, 0xd3, 0x5b, 0xb8, 0xee, 0x68, 0x0e, 0x46, + 0x2f, 0xcd, 0xf8, 0xc2, 0x54, 0x36, 0xdc, 0x42, 0xfd, 0x4f, 0xac, 0x02, 0xcf, 0x38, 0x50, 0x01, + 0x9e, 0xc2, 0x3c, 0xfb, 0x7b, 0x3e, 0x94, 0xa6, 0x86, 0xe9, 0x9c, 0x7f, 0x1a, 0x4c, 0x87, 0xbe, + 0x29, 0x73, 0x00, 0x0b, 0xc5, 0xd2, 0x83, 0xcb, 0x6a, 0x6d, 0xa3, 0xba, 0x58, 0x38, 0xe6, 0xbe, + 0x2f, 0xd5, 0xd4, 0x32, 0x7b, 0xcf, 0xa0, 0xaf, 0x67, 0x42, 0x60, 0x2e, 0xf2, 0x60, 0xce, 0x0f, + 0x66, 0xa6, 0x0f, 0xa0, 0xe8, 0x97, 0x7c, 0x70, 0x96, 0x39, 0x70, 0x9e, 0x91, 0x8c, 0x5c, 0xfa, + 0x00, 0x3d, 0x2a, 0xc1, 0x64, 0x7d, 0x7b, 0xd7, 0x69, 0x9b, 0x57, 0x0c, 0x34, 0xe5, 0x23, 0x83, + 0xbe, 0x1c, 0x96, 0xc9, 0xbd, 0xbc, 0x4c, 0x6e, 0x3e, 0x58, 0x09, 0x46, 0x21, 0x42, 0x1a, 0xbf, + 0xe8, 0x4b, 0xa3, 0xc8, 0x49, 0xe3, 0x69, 0xa2, 0x84, 0xd2, 0x97, 0xc3, 0xcf, 0x3d, 0x1b, 0x72, + 0xf5, 0xae, 0xd6, 0xc2, 0xe8, 0x8f, 0x64, 0x98, 0x59, 0xc5, 0xda, 0x1e, 0x2e, 0x76, 0xbb, 0x96, + 0xb9, 0x87, 0x51, 0x29, 0xd0, 0xd7, 0x33, 0x30, 0x61, 0xbb, 0x99, 0x2a, 0x6d, 0x52, 0x83, 0x29, + 0xd5, 0x7b, 0x55, 0xce, 0x02, 0xe8, 0x6d, 0x6c, 0x38, 0xba, 0xa3, 0x63, 0xfb, 0x8c, 0x74, 0x4e, + 0xbe, 0x79, 0x4a, 0x0d, 0xa5, 0xa0, 0xaf, 0x4a, 0xa2, 0x3a, 0x46, 0xb8, 0x98, 0x0f, 0x73, 0x10, + 0x21, 0xd5, 0xd7, 0x4b, 0x22, 0x3a, 0x36, 0x90, 0x5c, 0x32, 0xd9, 0xfe, 0x7a, 0x26, 0xb9, 0x70, 0xdd, 0x1c, 0xd5, 0x5a, 0xb3, 0xbe, 0x51, 0x5a, 0x69, 0xd6, 0xd7, 0x8b, 0xa5, 0x72, 0x01, 0x2b, - 0xc7, 0xa1, 0x40, 0x1e, 0x9b, 0x95, 0x7a, 0x73, 0xb1, 0xbc, 0x5a, 0x6e, 0x94, 0x17, 0x0b, 0x9b, - 0x8a, 0x02, 0x73, 0x6a, 0xf9, 0x27, 0x36, 0xca, 0xf5, 0x46, 0x73, 0xa9, 0x58, 0x59, 0x2d, 0x2f, + 0x27, 0xa1, 0x40, 0x1e, 0x9b, 0x95, 0x7a, 0x73, 0xb1, 0xbc, 0x5a, 0x6e, 0x94, 0x17, 0x0b, 0x9b, + 0x8a, 0x02, 0x73, 0x6a, 0xf9, 0x7b, 0x36, 0xca, 0xf5, 0x46, 0x73, 0xa9, 0x58, 0x59, 0x2d, 0x2f, 0x16, 0xb6, 0xdc, 0x9f, 0x57, 0x2b, 0x6b, 0x95, 0x46, 0x53, 0x2d, 0x17, 0x4b, 0x2b, 0xe5, 0xc5, - 0xc2, 0xb6, 0x72, 0x39, 0x5c, 0x56, 0xad, 0x35, 0x8b, 0xeb, 0xeb, 0x6a, 0xed, 0x6c, 0xb9, 0xc9, + 0xc2, 0xb6, 0x72, 0x35, 0x5c, 0x55, 0xad, 0x35, 0x8b, 0xeb, 0xeb, 0x6a, 0xed, 0x42, 0xb9, 0xc9, 0xfe, 0xa8, 0x17, 0x74, 0x5a, 0x50, 0xa3, 0x59, 0x5f, 0x29, 0xaa, 0xe5, 0xe2, 0xc2, 0x6a, 0xb9, - 0xf0, 0x00, 0x7a, 0x96, 0x0c, 0xb3, 0x6b, 0xda, 0x05, 0x5c, 0xdf, 0xd6, 0x2c, 0xac, 0x9d, 0xef, - 0x60, 0x74, 0xad, 0x00, 0x9e, 0xe8, 0x53, 0x61, 0xbc, 0xca, 0x3c, 0x5e, 0x37, 0xf7, 0x11, 0x30, - 0x57, 0x44, 0x04, 0x60, 0xff, 0xe2, 0x37, 0x83, 0x15, 0x0e, 0xb0, 0x27, 0x27, 0xa4, 0x97, 0x0c, - 0xb1, 0x9f, 0x7b, 0x14, 0x20, 0x86, 0x1e, 0x91, 0x61, 0xae, 0x62, 0xec, 0xe9, 0x0e, 0x5e, 0xc6, - 0x06, 0xb6, 0xdc, 0x71, 0x40, 0x08, 0x86, 0x87, 0xe5, 0x10, 0x0c, 0x4b, 0x3c, 0x0c, 0xb7, 0xf4, - 0x11, 0x1b, 0x5f, 0x46, 0xc4, 0x68, 0x7b, 0x15, 0x4c, 0xe9, 0x24, 0x5f, 0x49, 0x6f, 0x33, 0x89, - 0x05, 0x09, 0xca, 0x75, 0x30, 0x4b, 0x5f, 0x96, 0xf4, 0x0e, 0xbe, 0x0f, 0x5f, 0x62, 0xe3, 0x2e, - 0x9f, 0x88, 0x7e, 0xc9, 0x6f, 0x7c, 0x15, 0x0e, 0xcb, 0x1f, 0x4b, 0xca, 0x54, 0x32, 0x30, 0x5f, - 0xfc, 0x68, 0x68, 0x7e, 0xfb, 0x5a, 0x99, 0x8e, 0xbe, 0x2f, 0xc1, 0x74, 0xdd, 0x31, 0xbb, 0xae, - 0xca, 0xea, 0xc6, 0x96, 0x18, 0xb8, 0x1f, 0x0f, 0xb7, 0xb1, 0x12, 0x0f, 0xee, 0x13, 0xfa, 0xc8, - 0x31, 0x54, 0x40, 0x44, 0x0b, 0xfb, 0xb6, 0xdf, 0xc2, 0x96, 0x38, 0x54, 0x6e, 0x4d, 0x44, 0xed, - 0x07, 0xb0, 0x7d, 0xbd, 0x58, 0x86, 0x82, 0xa7, 0x66, 0x4e, 0x69, 0xd7, 0xb2, 0xb0, 0xe1, 0x88, - 0x81, 0xf0, 0x97, 0x61, 0x10, 0x56, 0x78, 0x10, 0x6e, 0x8d, 0x51, 0x66, 0xaf, 0x94, 0x14, 0xdb, - 0xd8, 0x07, 0x7d, 0x34, 0xef, 0xe3, 0xd0, 0xfc, 0xf1, 0xe4, 0x6c, 0x25, 0x83, 0x74, 0x65, 0x08, - 0x44, 0x8f, 0x43, 0xc1, 0x1d, 0x93, 0x4a, 0x8d, 0xca, 0xd9, 0x72, 0xb3, 0x52, 0x3d, 0x5b, 0x69, - 0x94, 0x0b, 0x18, 0xbd, 0x48, 0x86, 0x19, 0xca, 0x9a, 0x8a, 0xf7, 0xcc, 0x0b, 0x82, 0xbd, 0xde, - 0x23, 0x09, 0x8d, 0x85, 0x70, 0x09, 0x11, 0x2d, 0xe3, 0x17, 0x13, 0x18, 0x0b, 0x31, 0xe4, 0x1e, - 0x4d, 0xbd, 0xd5, 0xbe, 0x66, 0xb0, 0xd5, 0xa7, 0xb5, 0xf4, 0xed, 0xad, 0x5e, 0x9c, 0x05, 0xa0, - 0x95, 0x3c, 0xab, 0xe3, 0x8b, 0x68, 0x2d, 0xc0, 0x84, 0x53, 0xdb, 0xcc, 0x40, 0xb5, 0x95, 0xfa, - 0xa9, 0xed, 0x7b, 0xc2, 0x63, 0xd6, 0x02, 0x8f, 0xde, 0x4d, 0x91, 0xe2, 0x76, 0x39, 0x89, 0x9e, - 0x1d, 0x7a, 0x8a, 0x22, 0xf1, 0x56, 0xe7, 0x55, 0x30, 0x45, 0x1e, 0xab, 0xda, 0x0e, 0x66, 0x6d, - 0x28, 0x48, 0x50, 0xce, 0xc0, 0x0c, 0xcd, 0xd8, 0x32, 0x0d, 0xb7, 0x3e, 0x59, 0x92, 0x81, 0x4b, - 0x73, 0x41, 0x6c, 0x59, 0x58, 0x73, 0x4c, 0x8b, 0xd0, 0xc8, 0x51, 0x10, 0x43, 0x49, 0xe8, 0x1b, - 0x7e, 0x2b, 0x2c, 0x73, 0x9a, 0xf3, 0xc4, 0x24, 0x55, 0x49, 0xa6, 0x37, 0x7b, 0xc3, 0xb5, 0x3f, - 0xda, 0xea, 0x9a, 0x2e, 0xda, 0x4b, 0x64, 0x6a, 0x87, 0x95, 0x93, 0xa0, 0xb0, 0x54, 0x37, 0x6f, - 0xa9, 0x56, 0x6d, 0x94, 0xab, 0x8d, 0xc2, 0x66, 0x5f, 0x8d, 0xda, 0x42, 0xaf, 0xcd, 0x42, 0xf6, - 0x5e, 0x53, 0x37, 0xd0, 0x43, 0x19, 0x4e, 0x25, 0x0c, 0xec, 0x5c, 0x34, 0xad, 0x0b, 0x7e, 0x43, - 0x0d, 0x12, 0xe2, 0xb1, 0x09, 0x54, 0x49, 0x1e, 0xa8, 0x4a, 0xd9, 0x7e, 0xaa, 0xf4, 0x2b, 0x61, - 0x55, 0xba, 0x83, 0x57, 0xa5, 0xeb, 0xfb, 0xc8, 0xdf, 0x65, 0x3e, 0xa2, 0x03, 0xf8, 0x98, 0xdf, - 0x01, 0xdc, 0xcd, 0xc1, 0xf8, 0x78, 0x31, 0x32, 0xc9, 0x00, 0xfc, 0x52, 0xaa, 0x0d, 0xbf, 0x1f, - 0xd4, 0x5b, 0x11, 0x50, 0x6f, 0xf7, 0xe9, 0x13, 0xf4, 0xfd, 0x5d, 0xc7, 0x03, 0xfb, 0xbb, 0x89, - 0x0b, 0xca, 0x09, 0x38, 0xb6, 0x58, 0x59, 0x5a, 0x2a, 0xab, 0xe5, 0x6a, 0xa3, 0x59, 0x2d, 0x37, - 0xce, 0xd5, 0xd4, 0xfb, 0x0a, 0x1d, 0xf4, 0x1a, 0x19, 0xc0, 0x95, 0x50, 0x49, 0x33, 0x5a, 0xb8, - 0x23, 0xd6, 0xa3, 0xff, 0x2f, 0x29, 0x59, 0x9f, 0x10, 0xd0, 0x8f, 0x80, 0xf3, 0xe5, 0x92, 0x78, - 0xab, 0x8c, 0x24, 0x96, 0x0c, 0xd4, 0x37, 0x3d, 0x1a, 0x6c, 0xcf, 0xcb, 0xe0, 0xa8, 0x47, 0x8f, - 0x65, 0xef, 0x3f, 0xed, 0x7b, 0x6b, 0x16, 0xe6, 0x18, 0x2c, 0xde, 0x3c, 0xfe, 0x39, 0x19, 0x91, + 0xf0, 0x30, 0x7a, 0x81, 0x0c, 0xb3, 0x6b, 0xda, 0x65, 0x5c, 0xdf, 0xd6, 0x2c, 0xac, 0x5d, 0xea, + 0x60, 0x74, 0x83, 0x00, 0x9e, 0xe8, 0x8f, 0xc2, 0x78, 0x95, 0x79, 0xbc, 0x6e, 0xeb, 0x23, 0x60, + 0xae, 0x88, 0x08, 0xc0, 0xfe, 0xc5, 0x6f, 0x06, 0x2b, 0x1c, 0x60, 0xcf, 0x4c, 0x48, 0x2f, 0x19, + 0x62, 0x3f, 0xf4, 0x04, 0x40, 0x0c, 0x3d, 0x2e, 0xc3, 0x5c, 0xc5, 0xd8, 0xd3, 0x1d, 0xbc, 0x8c, + 0x0d, 0x6c, 0xb9, 0xe3, 0x80, 0x10, 0x0c, 0x8f, 0xc9, 0x21, 0x18, 0x96, 0x78, 0x18, 0x6e, 0xef, + 0x23, 0x36, 0xbe, 0x8c, 0x88, 0xd1, 0xf6, 0x3a, 0x98, 0xd2, 0x49, 0xbe, 0x92, 0xde, 0x66, 0x12, + 0x0b, 0x12, 0x94, 0x1b, 0x61, 0x96, 0xbe, 0x2c, 0xe9, 0x1d, 0xfc, 0x20, 0xde, 0x67, 0xe3, 0x2e, + 0x9f, 0x88, 0x7e, 0xdc, 0x6f, 0x7c, 0x15, 0x0e, 0xcb, 0xef, 0x4a, 0xca, 0x54, 0x32, 0x30, 0x5f, + 0xf1, 0x44, 0x68, 0x7e, 0x07, 0x5a, 0x99, 0x8e, 0xbe, 0x29, 0xc1, 0x74, 0xdd, 0x31, 0xbb, 0xae, + 0xca, 0xea, 0xc6, 0x96, 0x18, 0xb8, 0x1f, 0x0e, 0xb7, 0xb1, 0x12, 0x0f, 0xee, 0xd3, 0xfa, 0xc8, + 0x31, 0x54, 0x40, 0x44, 0x0b, 0xfb, 0xaa, 0xdf, 0xc2, 0x96, 0x38, 0x54, 0xee, 0x48, 0x44, 0xed, + 0x5b, 0xb0, 0x7d, 0xbd, 0x42, 0x86, 0x82, 0xa7, 0x66, 0x4e, 0x69, 0xd7, 0xb2, 0xb0, 0xe1, 0x88, + 0x81, 0xf0, 0x97, 0x61, 0x10, 0x56, 0x78, 0x10, 0xee, 0x88, 0x51, 0x66, 0xaf, 0x94, 0x14, 0xdb, + 0xd8, 0xfb, 0x7c, 0x34, 0x1f, 0xe4, 0xd0, 0xfc, 0xee, 0xe4, 0x6c, 0x25, 0x83, 0x74, 0x65, 0x08, + 0x44, 0x4f, 0x42, 0xc1, 0x1d, 0x93, 0x4a, 0x8d, 0xca, 0x85, 0x72, 0xb3, 0x52, 0xbd, 0x50, 0x69, + 0x94, 0x0b, 0x18, 0xbd, 0x5c, 0x86, 0x19, 0xca, 0x9a, 0x8a, 0xf7, 0xcc, 0xcb, 0x82, 0xbd, 0xde, + 0xe3, 0x09, 0x8d, 0x85, 0x70, 0x09, 0x11, 0x2d, 0xe3, 0xc7, 0x12, 0x18, 0x0b, 0x31, 0xe4, 0x9e, + 0x48, 0xbd, 0xd5, 0x81, 0x66, 0xb0, 0xd5, 0xa7, 0xb5, 0xf4, 0xed, 0xad, 0x5e, 0x91, 0x05, 0xa0, + 0x95, 0xbc, 0xa0, 0xe3, 0x2b, 0x68, 0x2d, 0xc0, 0x84, 0x53, 0xdb, 0xcc, 0x40, 0xb5, 0x95, 0xfa, + 0xa9, 0xed, 0xbb, 0xc2, 0x63, 0xd6, 0x02, 0x8f, 0xde, 0xad, 0x91, 0xe2, 0x76, 0x39, 0x89, 0x9e, + 0x1d, 0x7a, 0x8a, 0x22, 0xf1, 0x56, 0xe7, 0x75, 0x30, 0x45, 0x1e, 0xab, 0xda, 0x0e, 0x66, 0x6d, + 0x28, 0x48, 0x50, 0xce, 0xc3, 0x0c, 0xcd, 0xd8, 0x32, 0x0d, 0xb7, 0x3e, 0x59, 0x92, 0x81, 0x4b, + 0x73, 0x41, 0x6c, 0x59, 0x58, 0x73, 0x4c, 0x8b, 0xd0, 0xc8, 0x51, 0x10, 0x43, 0x49, 0xe8, 0x4b, + 0x7e, 0x2b, 0x2c, 0x73, 0x9a, 0xf3, 0xf4, 0x24, 0x55, 0x49, 0xa6, 0x37, 0x7b, 0xc3, 0xb5, 0x3f, + 0xda, 0xea, 0x9a, 0x2e, 0xda, 0x4b, 0x64, 0x6a, 0x87, 0x95, 0xd3, 0xa0, 0xb0, 0x54, 0x37, 0x6f, + 0xa9, 0x56, 0x6d, 0x94, 0xab, 0x8d, 0xc2, 0x66, 0x5f, 0x8d, 0xda, 0x42, 0xaf, 0xcf, 0x42, 0xf6, + 0x01, 0x53, 0x37, 0xd0, 0xa3, 0x19, 0x4e, 0x25, 0x0c, 0xec, 0x5c, 0x31, 0xad, 0xcb, 0x7e, 0x43, + 0x0d, 0x12, 0xe2, 0xb1, 0x09, 0x54, 0x49, 0x1e, 0xa8, 0x4a, 0xd9, 0x7e, 0xaa, 0xf4, 0x93, 0x61, + 0x55, 0xba, 0x9b, 0x57, 0xa5, 0x9b, 0xfa, 0xc8, 0xdf, 0x65, 0x3e, 0xa2, 0x03, 0xf8, 0x90, 0xdf, + 0x01, 0xdc, 0xc7, 0xc1, 0xf8, 0x54, 0x31, 0x32, 0xc9, 0x00, 0xfc, 0x4c, 0xaa, 0x0d, 0xbf, 0x1f, + 0xd4, 0x5b, 0x11, 0x50, 0x6f, 0xf7, 0xe9, 0x13, 0xf4, 0x83, 0x5d, 0xc7, 0xc3, 0x07, 0xbb, 0x89, + 0xcb, 0xca, 0x29, 0x38, 0xb1, 0x58, 0x59, 0x5a, 0x2a, 0xab, 0xe5, 0x6a, 0xa3, 0x59, 0x2d, 0x37, + 0x2e, 0xd6, 0xd4, 0x07, 0x0b, 0x1d, 0xf4, 0x3a, 0x19, 0xc0, 0x95, 0x50, 0x49, 0x33, 0x5a, 0xb8, + 0x23, 0xd6, 0xa3, 0xff, 0x2f, 0x29, 0x59, 0x9f, 0x10, 0xd0, 0x8f, 0x80, 0xf3, 0x55, 0x92, 0x78, + 0xab, 0x8c, 0x24, 0x96, 0x0c, 0xd4, 0x37, 0x3e, 0x11, 0x6c, 0xcf, 0xab, 0xe0, 0xb8, 0x47, 0x8f, + 0x65, 0xef, 0x3f, 0xed, 0x7b, 0x73, 0x16, 0xe6, 0x18, 0x2c, 0xde, 0x3c, 0xfe, 0x45, 0x19, 0x91, 0x89, 0x3c, 0x82, 0x49, 0x36, 0x6d, 0xf7, 0xba, 0x77, 0xff, 0x5d, 0x59, 0x86, 0xe9, 0x2e, 0xb6, - 0x76, 0x74, 0xdb, 0xd6, 0x4d, 0x83, 0x2e, 0xc8, 0xcd, 0xdd, 0xfa, 0x58, 0x5f, 0xe2, 0x64, 0xed, + 0x76, 0x74, 0xdb, 0xd6, 0x4d, 0x83, 0x2e, 0xc8, 0xcd, 0xdd, 0xf1, 0x64, 0x5f, 0xe2, 0x64, 0xed, 0x72, 0x7e, 0x5d, 0xb3, 0x1c, 0xbd, 0xa5, 0x77, 0x35, 0xc3, 0x59, 0x0f, 0x32, 0xab, 0xe1, 0x3f, - 0xd1, 0x0b, 0x13, 0x4e, 0x6b, 0xf8, 0x9a, 0x44, 0xa8, 0xc4, 0xef, 0x25, 0x98, 0x92, 0xc4, 0x12, - 0x4c, 0xa6, 0x16, 0x1f, 0x4d, 0x55, 0x2d, 0xfa, 0xe0, 0xbd, 0xa5, 0x5c, 0x01, 0x27, 0x2a, 0xd5, + 0xd1, 0xcb, 0x12, 0x4e, 0x6b, 0xf8, 0x9a, 0x44, 0xa8, 0xc4, 0x6f, 0x25, 0x98, 0x92, 0xc4, 0x12, + 0x4c, 0xa6, 0x16, 0x1f, 0x4c, 0x55, 0x2d, 0xfa, 0xe0, 0xbd, 0xa5, 0x5c, 0x03, 0xa7, 0x2a, 0xd5, 0x52, 0x4d, 0x55, 0xcb, 0xa5, 0x46, 0x73, 0xbd, 0xac, 0xae, 0x55, 0xea, 0xf5, 0x4a, 0xad, 0x5a, - 0x3f, 0x48, 0x6b, 0x47, 0x9f, 0x94, 0x7d, 0x8d, 0x59, 0xc4, 0xad, 0x8e, 0x6e, 0x60, 0x74, 0xf7, - 0x01, 0x15, 0x86, 0x5f, 0xf5, 0x11, 0xc7, 0x99, 0x95, 0x1f, 0x81, 0xf3, 0xab, 0x93, 0xe3, 0xdc, - 0x9f, 0xe0, 0x7f, 0xe0, 0xe6, 0xff, 0x88, 0x0c, 0xc7, 0x42, 0x0d, 0x51, 0xc5, 0x3b, 0x23, 0x5b, - 0xc9, 0xfb, 0xb9, 0x70, 0xdb, 0xad, 0xf0, 0x98, 0xf6, 0xb3, 0xa6, 0xf7, 0xb1, 0x11, 0x01, 0xeb, - 0x9b, 0x7c, 0x58, 0x57, 0x39, 0x58, 0x9f, 0x3a, 0x04, 0xcd, 0x64, 0xc8, 0xfe, 0x4e, 0xaa, 0xc8, - 0x5e, 0x01, 0x27, 0xd6, 0x8b, 0x6a, 0xa3, 0x52, 0xaa, 0xac, 0x17, 0xdd, 0x71, 0x34, 0x34, 0x64, - 0x47, 0x98, 0xeb, 0x3c, 0xe8, 0x7d, 0xf1, 0xfd, 0x40, 0x16, 0xae, 0xea, 0xdf, 0xd1, 0x96, 0xb6, - 0x35, 0x63, 0x0b, 0x23, 0x5d, 0x04, 0xea, 0x45, 0x98, 0x68, 0x91, 0xec, 0x14, 0xe7, 0xf0, 0xd6, - 0x4d, 0x4c, 0x5f, 0x4e, 0x4b, 0x50, 0xbd, 0x5f, 0xd1, 0x3b, 0xc2, 0x0a, 0xd1, 0xe0, 0x15, 0xe2, - 0xae, 0x78, 0xf0, 0xf6, 0xf1, 0x1d, 0xa1, 0x1b, 0x9f, 0xf1, 0x75, 0xe3, 0x1c, 0xa7, 0x1b, 0xa5, - 0x83, 0x91, 0x4f, 0xa6, 0x26, 0x7f, 0xf4, 0x68, 0xe8, 0x00, 0x22, 0xb5, 0x49, 0x8f, 0x1e, 0x15, - 0xfa, 0x76, 0xf7, 0xaf, 0x94, 0x21, 0xbf, 0x88, 0x3b, 0x58, 0x74, 0x25, 0xf2, 0x5b, 0x92, 0xe8, - 0x86, 0x08, 0x85, 0x81, 0xd2, 0x8e, 0x5e, 0x1d, 0x71, 0xf4, 0x1d, 0x6c, 0x3b, 0xda, 0x4e, 0x97, - 0x88, 0x5a, 0x56, 0x83, 0x04, 0xf4, 0xf3, 0x92, 0xc8, 0x76, 0x49, 0x4c, 0x31, 0xff, 0x31, 0xd6, - 0x14, 0x3f, 0x27, 0xc1, 0x64, 0x1d, 0x3b, 0x35, 0xab, 0x8d, 0x2d, 0x54, 0x0f, 0x30, 0xba, 0x06, - 0xa6, 0x09, 0x28, 0xee, 0x34, 0xd3, 0xc7, 0x29, 0x9c, 0xa4, 0x5c, 0x0f, 0x73, 0xfe, 0x2b, 0xf9, + 0x3f, 0x4c, 0x6b, 0x47, 0x1f, 0x91, 0x7d, 0x8d, 0x59, 0xc4, 0xad, 0x8e, 0x6e, 0x60, 0x74, 0xdf, + 0x21, 0x15, 0x86, 0x5f, 0xf5, 0x11, 0xc7, 0x99, 0x95, 0x1f, 0x81, 0xf3, 0x6b, 0x93, 0xe3, 0xdc, + 0x9f, 0xe0, 0x7f, 0xe0, 0xe6, 0xff, 0xb8, 0x0c, 0x27, 0x42, 0x0d, 0x51, 0xc5, 0x3b, 0x23, 0x5b, + 0xc9, 0xfb, 0xa1, 0x70, 0xdb, 0xad, 0xf0, 0x98, 0xf6, 0xb3, 0xa6, 0x0f, 0xb0, 0x11, 0x01, 0xeb, + 0x1b, 0x7d, 0x58, 0x57, 0x39, 0x58, 0x9f, 0x3d, 0x04, 0xcd, 0x64, 0xc8, 0xfe, 0x46, 0xaa, 0xc8, + 0x5e, 0x03, 0xa7, 0xd6, 0x8b, 0x6a, 0xa3, 0x52, 0xaa, 0xac, 0x17, 0xdd, 0x71, 0x34, 0x34, 0x64, + 0x47, 0x98, 0xeb, 0x3c, 0xe8, 0x7d, 0xf1, 0xfd, 0x9d, 0x2c, 0x5c, 0xd7, 0xbf, 0xa3, 0x2d, 0x6d, + 0x6b, 0xc6, 0x16, 0x46, 0xba, 0x08, 0xd4, 0x8b, 0x30, 0xd1, 0x22, 0xd9, 0x29, 0xce, 0xe1, 0xad, + 0x9b, 0x98, 0xbe, 0x9c, 0x96, 0xa0, 0x7a, 0xbf, 0xa2, 0xb7, 0x85, 0x15, 0xa2, 0xc1, 0x2b, 0xc4, + 0xbd, 0xf1, 0xe0, 0x1d, 0xe0, 0x3b, 0x42, 0x37, 0x3e, 0xe6, 0xeb, 0xc6, 0x45, 0x4e, 0x37, 0x4a, + 0x87, 0x23, 0x9f, 0x4c, 0x4d, 0xfe, 0xf0, 0x89, 0xd0, 0x01, 0x44, 0x6a, 0x93, 0x1e, 0x3d, 0x2a, + 0xf4, 0xed, 0xee, 0x5f, 0x23, 0x43, 0x7e, 0x11, 0x77, 0xb0, 0xe8, 0x4a, 0xe4, 0x57, 0x24, 0xd1, + 0x0d, 0x11, 0x0a, 0x03, 0xa5, 0x1d, 0xbd, 0x3a, 0xe2, 0xe8, 0x3b, 0xd8, 0x76, 0xb4, 0x9d, 0x2e, + 0x11, 0xb5, 0xac, 0x06, 0x09, 0xe8, 0x87, 0x25, 0x91, 0xed, 0x92, 0x98, 0x62, 0xfe, 0x63, 0xac, + 0x29, 0x7e, 0x42, 0x82, 0xc9, 0x3a, 0x76, 0x6a, 0x56, 0x1b, 0x5b, 0xa8, 0x1e, 0x60, 0x74, 0x0e, + 0xa6, 0x09, 0x28, 0xee, 0x34, 0xd3, 0xc7, 0x29, 0x9c, 0xa4, 0xdc, 0x04, 0x73, 0xfe, 0x2b, 0xf9, 0x9d, 0x75, 0xe3, 0x3d, 0xa9, 0xe8, 0x1f, 0x33, 0xa2, 0xbb, 0xb8, 0x6c, 0xc9, 0x90, 0x71, 0x13, - 0xd1, 0x4a, 0xc5, 0x76, 0x64, 0x63, 0x49, 0xa5, 0xbf, 0xd1, 0xf5, 0x36, 0x09, 0x60, 0xc3, 0xb0, - 0x3d, 0xb9, 0x3e, 0x3e, 0x81, 0x5c, 0xd1, 0x3f, 0x67, 0x92, 0xcd, 0x62, 0x82, 0x72, 0x22, 0x24, - 0xf6, 0xba, 0x04, 0x6b, 0x0b, 0x91, 0xc4, 0xd2, 0x97, 0xd9, 0x57, 0xe7, 0x20, 0x7f, 0x4e, 0xeb, - 0x74, 0xb0, 0x83, 0xbe, 0x26, 0x41, 0xbe, 0x64, 0x61, 0xcd, 0xc1, 0x61, 0xd1, 0x21, 0x98, 0xb4, - 0x4c, 0xd3, 0x59, 0xd7, 0x9c, 0x6d, 0x26, 0x37, 0xff, 0x9d, 0x39, 0x0c, 0xfc, 0x76, 0xb8, 0xfb, - 0xb8, 0x9b, 0x17, 0xdd, 0x8f, 0x72, 0xb5, 0xa5, 0x05, 0xcd, 0xd3, 0x42, 0x22, 0xfa, 0x0f, 0x04, - 0x93, 0x3b, 0x06, 0xde, 0x31, 0x0d, 0xbd, 0xe5, 0xd9, 0x9c, 0xde, 0x3b, 0xfa, 0x90, 0x2f, 0xd3, - 0x05, 0x4e, 0xa6, 0xf3, 0xc2, 0xa5, 0x24, 0x13, 0x68, 0x7d, 0x88, 0xde, 0xe3, 0x6a, 0xb8, 0x92, - 0x76, 0x06, 0xcd, 0x46, 0xad, 0x59, 0x52, 0xcb, 0xc5, 0x46, 0xb9, 0xb9, 0x5a, 0x2b, 0x15, 0x57, - 0x9b, 0x6a, 0x79, 0xbd, 0x56, 0xc0, 0xe8, 0xef, 0x24, 0x57, 0xb8, 0x2d, 0x73, 0x0f, 0x5b, 0x68, - 0x59, 0x48, 0xce, 0x71, 0x32, 0x61, 0x18, 0xfc, 0x8a, 0xb0, 0xd3, 0x06, 0x93, 0x0e, 0xe3, 0x20, - 0x42, 0x79, 0x3f, 0x2c, 0xd4, 0xdc, 0x63, 0x49, 0x3d, 0x0a, 0x24, 0xfd, 0xbf, 0x25, 0x98, 0x28, - 0x99, 0xc6, 0x1e, 0xb6, 0x9c, 0xf0, 0x7c, 0x27, 0x2c, 0xcd, 0x0c, 0x2f, 0x4d, 0x77, 0x90, 0xc4, - 0x86, 0x63, 0x99, 0x5d, 0x6f, 0xc2, 0xe3, 0xbd, 0xa2, 0x37, 0x24, 0x95, 0x30, 0x2b, 0x39, 0x7a, - 0xe1, 0xb3, 0x7f, 0x41, 0x1c, 0x7b, 0x72, 0x4f, 0x03, 0x78, 0x4d, 0x12, 0x5c, 0xfa, 0x33, 0x90, - 0x7e, 0x97, 0xf2, 0x65, 0x19, 0x66, 0x69, 0xe3, 0xab, 0x63, 0x62, 0xa1, 0xa1, 0x5a, 0x78, 0xc9, - 0xb1, 0x47, 0xf8, 0x2b, 0x47, 0x38, 0xf1, 0xe7, 0xb5, 0x6e, 0xd7, 0x5f, 0x7e, 0x5e, 0x39, 0xa2, - 0xb2, 0x77, 0xaa, 0xe6, 0x0b, 0x79, 0xc8, 0x6a, 0xbb, 0xce, 0x36, 0xfa, 0xbe, 0xf0, 0xe4, 0x93, - 0xeb, 0x0c, 0x18, 0x3f, 0x11, 0x90, 0x1c, 0x87, 0x9c, 0x63, 0x5e, 0xc0, 0x9e, 0x1c, 0xe8, 0x8b, - 0x0b, 0x87, 0xd6, 0xed, 0x36, 0xc8, 0x07, 0x06, 0x87, 0xf7, 0xee, 0xda, 0x3a, 0x5a, 0xab, 0x65, - 0xee, 0x1a, 0x4e, 0xc5, 0x5b, 0x82, 0x0e, 0x12, 0xd0, 0x17, 0x33, 0x22, 0x93, 0x59, 0x01, 0x06, - 0x93, 0x41, 0x76, 0x7e, 0x88, 0xa6, 0x34, 0x0f, 0x37, 0x16, 0xd7, 0xd7, 0x9b, 0x8d, 0xda, 0x7d, - 0xe5, 0x6a, 0x60, 0x78, 0x36, 0x2b, 0xd5, 0x66, 0x63, 0xa5, 0xdc, 0x2c, 0x6d, 0xa8, 0x64, 0x9d, - 0xb0, 0x58, 0x2a, 0xd5, 0x36, 0xaa, 0x8d, 0x02, 0x46, 0x6f, 0x96, 0x60, 0xa6, 0xd4, 0x31, 0x6d, - 0x1f, 0xe1, 0xab, 0x03, 0x84, 0x7d, 0x31, 0x66, 0x42, 0x62, 0x44, 0xff, 0x96, 0x11, 0x75, 0x3a, - 0xf0, 0x04, 0x12, 0x22, 0x1f, 0xd1, 0x4b, 0xbd, 0x41, 0xc8, 0xe9, 0x60, 0x30, 0xbd, 0xf4, 0x9b, - 0xc4, 0x17, 0xee, 0x82, 0x89, 0x22, 0x55, 0x0c, 0xf4, 0xd7, 0x19, 0xc8, 0x97, 0x4c, 0x63, 0x53, - 0xdf, 0x72, 0x8d, 0x39, 0x6c, 0x68, 0xe7, 0x3b, 0x78, 0x51, 0x73, 0xb4, 0x3d, 0x1d, 0x5f, 0x24, - 0x15, 0x98, 0x54, 0x7b, 0x52, 0x5d, 0xa6, 0x58, 0x0a, 0x3e, 0xbf, 0xbb, 0x45, 0x98, 0x9a, 0x54, - 0xc3, 0x49, 0xca, 0x53, 0xe1, 0x72, 0xfa, 0xba, 0x6e, 0x61, 0x0b, 0x77, 0xb0, 0x66, 0x63, 0x77, - 0x5a, 0x64, 0xe0, 0x0e, 0x51, 0xda, 0x49, 0x35, 0xea, 0xb3, 0x72, 0x06, 0x66, 0xe8, 0x27, 0x62, - 0x8a, 0xd8, 0x44, 0x8d, 0x27, 0x55, 0x2e, 0x4d, 0x79, 0x02, 0xe4, 0xf0, 0x83, 0x8e, 0xa5, 0x9d, - 0x6a, 0x13, 0xbc, 0x2e, 0x9f, 0xa7, 0x5e, 0x87, 0xf3, 0x9e, 0xd7, 0xe1, 0x7c, 0x9d, 0xf8, 0x24, - 0xaa, 0x34, 0x17, 0xfa, 0xe4, 0xa4, 0x6f, 0x48, 0xbc, 0x59, 0x0e, 0x14, 0x43, 0x81, 0xac, 0xa1, - 0xed, 0x60, 0xa6, 0x17, 0xe4, 0x59, 0xb9, 0x11, 0x8e, 0x6a, 0x7b, 0x9a, 0xa3, 0x59, 0xab, 0x66, - 0x4b, 0xeb, 0x90, 0xc1, 0xcf, 0x6b, 0xf9, 0xbd, 0x1f, 0xc8, 0x8e, 0x90, 0x63, 0x5a, 0x98, 0xe4, - 0xf2, 0x76, 0x84, 0xbc, 0x04, 0x97, 0xba, 0xde, 0x32, 0x0d, 0xc2, 0xbf, 0xac, 0x92, 0x67, 0x57, - 0x2a, 0x6d, 0xdd, 0x76, 0x2b, 0x42, 0xa8, 0x54, 0xe9, 0xd6, 0x46, 0xfd, 0x92, 0xd1, 0x22, 0xbb, - 0x41, 0x93, 0x6a, 0xd4, 0x67, 0x65, 0x01, 0xa6, 0xd9, 0x46, 0xc8, 0x9a, 0xab, 0x57, 0x79, 0xa2, - 0x57, 0xd7, 0xf0, 0x3e, 0x5d, 0x14, 0xcf, 0xf9, 0x6a, 0x90, 0x4f, 0x0d, 0xff, 0xa4, 0xdc, 0x03, - 0x57, 0xb2, 0xd7, 0xd2, 0xae, 0xed, 0x98, 0x3b, 0x14, 0xf4, 0x25, 0xbd, 0x43, 0x6b, 0x30, 0x41, - 0x6a, 0x10, 0x97, 0x45, 0xb9, 0x15, 0x8e, 0x77, 0x2d, 0xbc, 0x89, 0xad, 0xfb, 0xb5, 0x9d, 0xdd, - 0x07, 0x1b, 0x96, 0x66, 0xd8, 0x5d, 0xd3, 0x72, 0x4e, 0x4d, 0x12, 0xe6, 0xfb, 0x7e, 0x53, 0x6e, - 0x82, 0x63, 0x0f, 0xd8, 0xa6, 0x51, 0xec, 0xea, 0xab, 0xba, 0xed, 0x60, 0xa3, 0xd8, 0x6e, 0x5b, - 0xa7, 0xa6, 0x48, 0x59, 0xfb, 0x3f, 0xb0, 0x6e, 0x75, 0x12, 0xf2, 0x54, 0xd8, 0xe8, 0x05, 0x39, - 0x61, 0xe7, 0x4f, 0x56, 0xfd, 0x58, 0x63, 0xee, 0x16, 0x98, 0x60, 0xfd, 0x21, 0x81, 0x75, 0xfa, - 0xd6, 0x93, 0x3d, 0xab, 0x10, 0x8c, 0x8a, 0xea, 0x65, 0x53, 0x9e, 0x04, 0xf9, 0x16, 0x11, 0x02, - 0x41, 0x78, 0xfa, 0xd6, 0x2b, 0xfb, 0x17, 0x4a, 0xb2, 0xa8, 0x2c, 0x2b, 0xfa, 0x0b, 0x59, 0xc8, - 0x5f, 0x34, 0x8e, 0xe3, 0x64, 0x7d, 0xc0, 0x37, 0xa4, 0x21, 0x3a, 0xd9, 0x9b, 0xe0, 0x06, 0xd6, - 0x83, 0x32, 0x6b, 0x65, 0xb1, 0xb9, 0xb0, 0xe1, 0x4d, 0x1d, 0x5d, 0x1b, 0xa6, 0xde, 0x28, 0xaa, - 0xee, 0xbc, 0x7f, 0xd1, 0x9d, 0x72, 0xde, 0x08, 0xd7, 0x0f, 0xc8, 0x5d, 0x6e, 0x34, 0xab, 0xc5, - 0xb5, 0x72, 0x61, 0x93, 0xb7, 0x84, 0xea, 0x8d, 0xda, 0x7a, 0x53, 0xdd, 0xa8, 0x56, 0x2b, 0xd5, - 0x65, 0x4a, 0xcc, 0x35, 0x20, 0x4f, 0x06, 0x19, 0xce, 0xa9, 0x95, 0x46, 0xb9, 0x59, 0xaa, 0x55, - 0x97, 0x2a, 0xcb, 0x05, 0x7d, 0x90, 0x19, 0xf5, 0x80, 0x72, 0x0d, 0x5c, 0xc5, 0x71, 0x52, 0xa9, - 0x55, 0xdd, 0x79, 0x70, 0xa9, 0x58, 0x2d, 0x95, 0xdd, 0x49, 0xef, 0x05, 0x05, 0xc1, 0x09, 0x4a, - 0xae, 0xb9, 0x54, 0x59, 0x0d, 0x6f, 0x5d, 0x7d, 0x3c, 0xa3, 0x9c, 0x82, 0xcb, 0xc2, 0xdf, 0x2a, - 0xd5, 0xb3, 0xc5, 0xd5, 0xca, 0x62, 0xe1, 0x13, 0x19, 0xe5, 0x3a, 0xb8, 0x9a, 0xfb, 0x8b, 0xee, - 0x42, 0x35, 0x2b, 0x8b, 0xcd, 0xb5, 0x4a, 0x7d, 0xad, 0xd8, 0x28, 0xad, 0x14, 0x3e, 0x49, 0x66, - 0x17, 0xbe, 0xb9, 0x1c, 0x72, 0xe2, 0x7c, 0x71, 0xd8, 0x02, 0x28, 0xf2, 0x8a, 0xfa, 0xf8, 0xbe, - 0xb0, 0xc7, 0x5b, 0xbc, 0x1f, 0xf5, 0xc7, 0x92, 0x45, 0x4e, 0x85, 0x6e, 0x49, 0x40, 0x2b, 0x99, - 0x0e, 0x35, 0x86, 0x50, 0xa1, 0x6b, 0xe0, 0xaa, 0x6a, 0x99, 0x22, 0xa5, 0x96, 0x4b, 0xb5, 0xb3, - 0x65, 0xb5, 0x79, 0xae, 0xb8, 0xba, 0x5a, 0x6e, 0x34, 0x97, 0x2a, 0x6a, 0xbd, 0x51, 0xd8, 0x44, - 0xff, 0x2c, 0xf9, 0x6b, 0x3f, 0x21, 0x69, 0xfd, 0xb5, 0x94, 0xb4, 0x59, 0xc7, 0xae, 0xf1, 0xfc, - 0x18, 0xe4, 0x6d, 0x47, 0x73, 0x76, 0x6d, 0xd6, 0xaa, 0x1f, 0xd3, 0xbf, 0x55, 0xcf, 0xd7, 0x49, + 0xd1, 0x4a, 0xc5, 0x76, 0x64, 0x63, 0x49, 0xa5, 0xbf, 0xd1, 0xf5, 0x16, 0x09, 0x60, 0xc3, 0xb0, + 0x3d, 0xb9, 0x3e, 0x35, 0x81, 0x5c, 0xd1, 0x3f, 0x67, 0x92, 0xcd, 0x62, 0x82, 0x72, 0x22, 0x24, + 0xf6, 0x86, 0x04, 0x6b, 0x0b, 0x91, 0xc4, 0xd2, 0x97, 0xd9, 0xe7, 0xe7, 0x20, 0x7f, 0x51, 0xeb, + 0x74, 0xb0, 0x83, 0xbe, 0x20, 0x41, 0xbe, 0x64, 0x61, 0xcd, 0xc1, 0x61, 0xd1, 0x21, 0x98, 0xb4, + 0x4c, 0xd3, 0x59, 0xd7, 0x9c, 0x6d, 0x26, 0x37, 0xff, 0x9d, 0x39, 0x0c, 0xfc, 0x5a, 0xb8, 0xfb, + 0xb8, 0x8f, 0x17, 0xdd, 0x77, 0x72, 0xb5, 0xa5, 0x05, 0xcd, 0xd3, 0x42, 0x22, 0xfa, 0x0f, 0x04, + 0x93, 0x3b, 0x06, 0xde, 0x31, 0x0d, 0xbd, 0xe5, 0xd9, 0x9c, 0xde, 0x3b, 0xfa, 0x3d, 0x5f, 0xa6, + 0x0b, 0x9c, 0x4c, 0xe7, 0x85, 0x4b, 0x49, 0x26, 0xd0, 0xfa, 0x10, 0xbd, 0xc7, 0xf5, 0x70, 0x2d, + 0xed, 0x0c, 0x9a, 0x8d, 0x5a, 0xb3, 0xa4, 0x96, 0x8b, 0x8d, 0x72, 0x73, 0xb5, 0x56, 0x2a, 0xae, + 0x36, 0xd5, 0xf2, 0x7a, 0xad, 0x80, 0xd1, 0xdf, 0x49, 0xae, 0x70, 0x5b, 0xe6, 0x1e, 0xb6, 0xd0, + 0xb2, 0x90, 0x9c, 0xe3, 0x64, 0xc2, 0x30, 0xf8, 0x49, 0x61, 0xa7, 0x0d, 0x26, 0x1d, 0xc6, 0x41, + 0x84, 0xf2, 0xbe, 0x5f, 0xa8, 0xb9, 0xc7, 0x92, 0x7a, 0x02, 0x48, 0xfa, 0x7f, 0x4b, 0x30, 0x51, + 0x32, 0x8d, 0x3d, 0x6c, 0x39, 0xe1, 0xf9, 0x4e, 0x58, 0x9a, 0x19, 0x5e, 0x9a, 0xee, 0x20, 0x89, + 0x0d, 0xc7, 0x32, 0xbb, 0xde, 0x84, 0xc7, 0x7b, 0x45, 0xbf, 0x9c, 0x54, 0xc2, 0xac, 0xe4, 0xe8, + 0x85, 0xcf, 0xfe, 0x05, 0x71, 0xec, 0xc9, 0x3d, 0x0d, 0xe0, 0x75, 0x49, 0x70, 0xe9, 0xcf, 0x40, + 0xfa, 0x5d, 0xca, 0x67, 0x65, 0x98, 0xa5, 0x8d, 0xaf, 0x8e, 0x89, 0x85, 0x86, 0x6a, 0xe1, 0x25, + 0xc7, 0x1e, 0xe1, 0xaf, 0x1c, 0xe3, 0xc4, 0x9f, 0xd7, 0xba, 0x5d, 0x7f, 0xf9, 0x79, 0xe5, 0x98, + 0xca, 0xde, 0xa9, 0x9a, 0x2f, 0xe4, 0x21, 0xab, 0xed, 0x3a, 0xdb, 0xe8, 0x9b, 0xc2, 0x93, 0x4f, + 0xae, 0x33, 0x60, 0xfc, 0x44, 0x40, 0x72, 0x12, 0x72, 0x8e, 0x79, 0x19, 0x7b, 0x72, 0xa0, 0x2f, + 0x2e, 0x1c, 0x5a, 0xb7, 0xdb, 0x20, 0x1f, 0x18, 0x1c, 0xde, 0xbb, 0x6b, 0xeb, 0x68, 0xad, 0x96, + 0xb9, 0x6b, 0x38, 0x15, 0x6f, 0x09, 0x3a, 0x48, 0x40, 0x9f, 0xce, 0x88, 0x4c, 0x66, 0x05, 0x18, + 0x4c, 0x06, 0xd9, 0xa5, 0x21, 0x9a, 0xd2, 0x3c, 0xdc, 0x52, 0x5c, 0x5f, 0x6f, 0x36, 0x6a, 0x0f, + 0x96, 0xab, 0x81, 0xe1, 0xd9, 0xac, 0x54, 0x9b, 0x8d, 0x95, 0x72, 0xb3, 0xb4, 0xa1, 0x92, 0x75, + 0xc2, 0x62, 0xa9, 0x54, 0xdb, 0xa8, 0x36, 0x0a, 0x18, 0xbd, 0x49, 0x82, 0x99, 0x52, 0xc7, 0xb4, + 0x7d, 0x84, 0xaf, 0x0f, 0x10, 0xf6, 0xc5, 0x98, 0x09, 0x89, 0x11, 0xfd, 0x5b, 0x46, 0xd4, 0xe9, + 0xc0, 0x13, 0x48, 0x88, 0x7c, 0x44, 0x2f, 0xf5, 0xcb, 0x42, 0x4e, 0x07, 0x83, 0xe9, 0xa5, 0xdf, + 0x24, 0x3e, 0x75, 0x2f, 0x4c, 0x14, 0xa9, 0x62, 0xa0, 0xbf, 0xce, 0x40, 0xbe, 0x64, 0x1a, 0x9b, + 0xfa, 0x96, 0x6b, 0xcc, 0x61, 0x43, 0xbb, 0xd4, 0xc1, 0x8b, 0x9a, 0xa3, 0xed, 0xe9, 0xf8, 0x0a, + 0xa9, 0xc0, 0xa4, 0xda, 0x93, 0xea, 0x32, 0xc5, 0x52, 0xf0, 0xa5, 0xdd, 0x2d, 0xc2, 0xd4, 0xa4, + 0x1a, 0x4e, 0x52, 0x9e, 0x0d, 0x57, 0xd3, 0xd7, 0x75, 0x0b, 0x5b, 0xb8, 0x83, 0x35, 0x1b, 0xbb, + 0xd3, 0x22, 0x03, 0x77, 0x88, 0xd2, 0x4e, 0xaa, 0x51, 0x9f, 0x95, 0xf3, 0x30, 0x43, 0x3f, 0x11, + 0x53, 0xc4, 0x26, 0x6a, 0x3c, 0xa9, 0x72, 0x69, 0xca, 0xd3, 0x20, 0x87, 0x1f, 0x71, 0x2c, 0xed, + 0x4c, 0x9b, 0xe0, 0x75, 0xf5, 0x3c, 0xf5, 0x3a, 0x9c, 0xf7, 0xbc, 0x0e, 0xe7, 0xeb, 0xc4, 0x27, + 0x51, 0xa5, 0xb9, 0xd0, 0x47, 0x26, 0x7d, 0x43, 0xe2, 0x4d, 0x72, 0xa0, 0x18, 0x0a, 0x64, 0x0d, + 0x6d, 0x07, 0x33, 0xbd, 0x20, 0xcf, 0xca, 0x2d, 0x70, 0x5c, 0xdb, 0xd3, 0x1c, 0xcd, 0x5a, 0x35, + 0x5b, 0x5a, 0x87, 0x0c, 0x7e, 0x5e, 0xcb, 0xef, 0xfd, 0x40, 0x76, 0x84, 0x1c, 0xd3, 0xc2, 0x24, + 0x97, 0xb7, 0x23, 0xe4, 0x25, 0xb8, 0xd4, 0xf5, 0x96, 0x69, 0x10, 0xfe, 0x65, 0x95, 0x3c, 0xbb, + 0x52, 0x69, 0xeb, 0xb6, 0x5b, 0x11, 0x42, 0xa5, 0x4a, 0xb7, 0x36, 0xea, 0xfb, 0x46, 0x8b, 0xec, + 0x06, 0x4d, 0xaa, 0x51, 0x9f, 0x95, 0x05, 0x98, 0x66, 0x1b, 0x21, 0x6b, 0xae, 0x5e, 0xe5, 0x89, + 0x5e, 0x9d, 0xe3, 0x7d, 0xba, 0x28, 0x9e, 0xf3, 0xd5, 0x20, 0x9f, 0x1a, 0xfe, 0x49, 0xb9, 0x1f, + 0xae, 0x65, 0xaf, 0xa5, 0x5d, 0xdb, 0x31, 0x77, 0x28, 0xe8, 0x4b, 0x7a, 0x87, 0xd6, 0x60, 0x82, + 0xd4, 0x20, 0x2e, 0x8b, 0x72, 0x07, 0x9c, 0xec, 0x5a, 0x78, 0x13, 0x5b, 0x0f, 0x69, 0x3b, 0xbb, + 0x8f, 0x34, 0x2c, 0xcd, 0xb0, 0xbb, 0xa6, 0xe5, 0x9c, 0x99, 0x24, 0xcc, 0xf7, 0xfd, 0xa6, 0xdc, + 0x0a, 0x27, 0x1e, 0xb6, 0x4d, 0xa3, 0xd8, 0xd5, 0x57, 0x75, 0xdb, 0xc1, 0x46, 0xb1, 0xdd, 0xb6, + 0xce, 0x4c, 0x91, 0xb2, 0x0e, 0x7e, 0x60, 0xdd, 0xea, 0x24, 0xe4, 0xa9, 0xb0, 0xd1, 0x4b, 0x73, + 0xc2, 0xce, 0x9f, 0xac, 0xfa, 0xb1, 0xc6, 0xdc, 0xed, 0x30, 0xc1, 0xfa, 0x43, 0x02, 0xeb, 0xf4, + 0x1d, 0xa7, 0x7b, 0x56, 0x21, 0x18, 0x15, 0xd5, 0xcb, 0xa6, 0x3c, 0x03, 0xf2, 0x2d, 0x22, 0x04, + 0x82, 0xf0, 0xf4, 0x1d, 0xd7, 0xf6, 0x2f, 0x94, 0x64, 0x51, 0x59, 0x56, 0xf4, 0x17, 0xb2, 0x90, + 0xbf, 0x68, 0x1c, 0xc7, 0xc9, 0xfa, 0x80, 0x2f, 0x49, 0x43, 0x74, 0xb2, 0xb7, 0xc2, 0xcd, 0xac, + 0x07, 0x65, 0xd6, 0xca, 0x62, 0x73, 0x61, 0xc3, 0x9b, 0x3a, 0xba, 0x36, 0x4c, 0xbd, 0x51, 0x54, + 0xdd, 0x79, 0xff, 0xa2, 0x3b, 0xe5, 0xbc, 0x05, 0x6e, 0x1a, 0x90, 0xbb, 0xdc, 0x68, 0x56, 0x8b, + 0x6b, 0xe5, 0xc2, 0x26, 0x6f, 0x09, 0xd5, 0x1b, 0xb5, 0xf5, 0xa6, 0xba, 0x51, 0xad, 0x56, 0xaa, + 0xcb, 0x94, 0x98, 0x6b, 0x40, 0x9e, 0x0e, 0x32, 0x5c, 0x54, 0x2b, 0x8d, 0x72, 0xb3, 0x54, 0xab, + 0x2e, 0x55, 0x96, 0x0b, 0xfa, 0x20, 0x33, 0xea, 0x61, 0xe5, 0x1c, 0x5c, 0xc7, 0x71, 0x52, 0xa9, + 0x55, 0xdd, 0x79, 0x70, 0xa9, 0x58, 0x2d, 0x95, 0xdd, 0x49, 0xef, 0x65, 0x05, 0xc1, 0x29, 0x4a, + 0xae, 0xb9, 0x54, 0x59, 0x0d, 0x6f, 0x5d, 0x7d, 0x38, 0xa3, 0x9c, 0x81, 0xab, 0xc2, 0xdf, 0x2a, + 0xd5, 0x0b, 0xc5, 0xd5, 0xca, 0x62, 0xe1, 0x0f, 0x32, 0xca, 0x8d, 0x70, 0x3d, 0xf7, 0x17, 0xdd, + 0x85, 0x6a, 0x56, 0x16, 0x9b, 0x6b, 0x95, 0xfa, 0x5a, 0xb1, 0x51, 0x5a, 0x29, 0x7c, 0x84, 0xcc, + 0x2e, 0x7c, 0x73, 0x39, 0xe4, 0xc4, 0xf9, 0x8a, 0xb0, 0x05, 0x50, 0xe4, 0x15, 0xf5, 0xa9, 0x7d, + 0x61, 0x8f, 0xb7, 0x78, 0x3f, 0xe8, 0x8f, 0x25, 0x8b, 0x9c, 0x0a, 0xdd, 0x9e, 0x80, 0x56, 0x32, + 0x1d, 0x6a, 0x0c, 0xa1, 0x42, 0xe7, 0xe0, 0xba, 0x6a, 0x99, 0x22, 0xa5, 0x96, 0x4b, 0xb5, 0x0b, + 0x65, 0xb5, 0x79, 0xb1, 0xb8, 0xba, 0x5a, 0x6e, 0x34, 0x97, 0x2a, 0x6a, 0xbd, 0x51, 0xd8, 0x44, + 0xff, 0x2c, 0xf9, 0x6b, 0x3f, 0x21, 0x69, 0xfd, 0xb5, 0x94, 0xb4, 0x59, 0xc7, 0xae, 0xf1, 0x7c, + 0x17, 0xe4, 0x6d, 0x47, 0x73, 0x76, 0x6d, 0xd6, 0xaa, 0x9f, 0xd4, 0xbf, 0x55, 0xcf, 0xd7, 0x49, 0x26, 0x95, 0x65, 0x46, 0x7f, 0x91, 0x49, 0xd2, 0x4c, 0x47, 0xb0, 0xfc, 0xa3, 0x0f, 0x21, 0xe2, - 0xd3, 0x80, 0x3c, 0x6d, 0xaf, 0xd4, 0x9b, 0xc5, 0x55, 0xb5, 0x5c, 0x5c, 0xbc, 0xdf, 0x5f, 0xf4, - 0xc1, 0xca, 0x09, 0x38, 0xb6, 0x51, 0x2d, 0x2e, 0xac, 0x96, 0x49, 0x73, 0xa9, 0x55, 0xab, 0xe5, - 0x92, 0x2b, 0xf7, 0x9f, 0x27, 0x5b, 0x2c, 0xae, 0xbd, 0x4d, 0xf8, 0x76, 0x6d, 0xa2, 0x90, 0xfc, - 0xbf, 0x2e, 0xec, 0x89, 0x14, 0x68, 0x58, 0x98, 0xd6, 0x68, 0x71, 0xf8, 0xa2, 0x90, 0xf3, 0x91, - 0x10, 0x27, 0xc9, 0xf0, 0xf8, 0xcf, 0x43, 0xe0, 0x71, 0x02, 0x8e, 0x85, 0xf1, 0x20, 0x4e, 0x48, - 0xd1, 0x30, 0xbc, 0x60, 0x0a, 0xf2, 0x75, 0xdc, 0xc1, 0x2d, 0x07, 0x3d, 0x22, 0x05, 0xa6, 0xc7, + 0xb3, 0x80, 0x3c, 0x6d, 0xaf, 0xd4, 0x9b, 0xc5, 0x55, 0xb5, 0x5c, 0x5c, 0x7c, 0xc8, 0x5f, 0xf4, + 0xc1, 0xca, 0x29, 0x38, 0xb1, 0x51, 0x2d, 0x2e, 0xac, 0x96, 0x49, 0x73, 0xa9, 0x55, 0xab, 0xe5, + 0x92, 0x2b, 0xf7, 0x1f, 0x26, 0x5b, 0x2c, 0xae, 0xbd, 0x4d, 0xf8, 0x76, 0x6d, 0xa2, 0x90, 0xfc, + 0xbf, 0x28, 0xec, 0x89, 0x14, 0x68, 0x58, 0x98, 0xd6, 0x68, 0x71, 0xf8, 0xb4, 0x90, 0xf3, 0x91, + 0x10, 0x27, 0xc9, 0xf0, 0xf8, 0xcf, 0x43, 0xe0, 0x71, 0x0a, 0x4e, 0x84, 0xf1, 0x20, 0x4e, 0x48, + 0xd1, 0x30, 0xbc, 0x74, 0x0a, 0xf2, 0x75, 0xdc, 0xc1, 0x2d, 0x07, 0x3d, 0x2e, 0x05, 0xa6, 0xc7, 0x1c, 0x48, 0xbe, 0xd3, 0x8b, 0xa4, 0xb7, 0xb9, 0xc9, 0xb6, 0xd4, 0x33, 0xd9, 0x8e, 0x31, 0x1a, 0xe4, 0x44, 0x46, 0x43, 0x36, 0x05, 0xa3, 0x21, 0x37, 0xbc, 0xd1, 0x90, 0x4f, 0x6a, 0x34, 0x4c, - 0xc4, 0x1a, 0x0d, 0xe8, 0x75, 0xf9, 0xa4, 0x7d, 0x0a, 0x05, 0xe6, 0x70, 0x4d, 0x85, 0xff, 0x95, - 0x4d, 0xd2, 0x07, 0xf5, 0xe5, 0x38, 0x99, 0xce, 0x7f, 0x5f, 0x4e, 0x61, 0x69, 0x43, 0xb9, 0x16, - 0xae, 0x0e, 0xde, 0x9b, 0xe5, 0xa7, 0x57, 0xea, 0x8d, 0x3a, 0xb1, 0x0f, 0x4a, 0x35, 0x55, 0xdd, - 0x58, 0xa7, 0xeb, 0xd3, 0x27, 0x41, 0x09, 0xa8, 0xa8, 0x1b, 0x55, 0x6a, 0x0d, 0x6c, 0xf1, 0xd4, + 0xc4, 0x1a, 0x0d, 0xe8, 0x0d, 0xf9, 0xa4, 0x7d, 0x0a, 0x05, 0xe6, 0x68, 0x4d, 0x85, 0xff, 0x95, + 0x4d, 0xd2, 0x07, 0xf5, 0xe5, 0x38, 0x99, 0xce, 0x7f, 0x53, 0x4e, 0x61, 0x69, 0x43, 0xb9, 0x01, + 0xae, 0x0f, 0xde, 0x9b, 0xe5, 0xe7, 0x56, 0xea, 0x8d, 0x3a, 0xb1, 0x0f, 0x4a, 0x35, 0x55, 0xdd, + 0x58, 0xa7, 0xeb, 0xd3, 0xa7, 0x41, 0x09, 0xa8, 0xa8, 0x1b, 0x55, 0x6a, 0x0d, 0x6c, 0xf1, 0xd4, 0x97, 0x2a, 0xd5, 0xc5, 0xa6, 0xdf, 0xc2, 0xaa, 0x4b, 0xb5, 0xc2, 0xb6, 0x3b, 0x1d, 0x0c, 0x51, 0x77, 0x87, 0x73, 0x56, 0x42, 0xb1, 0xba, 0xd8, 0x5c, 0xab, 0x96, 0xd7, 0x6a, 0xd5, 0x4a, 0x89, 0xa4, 0xd7, 0xcb, 0x8d, 0x82, 0xee, 0x0e, 0x4b, 0x3d, 0xf6, 0x47, 0xbd, 0x5c, 0x54, 0x4b, 0x2b, - 0x65, 0x95, 0x16, 0xf9, 0x80, 0x72, 0x3d, 0x9c, 0x29, 0x56, 0x6b, 0x0d, 0x37, 0xa5, 0x58, 0xbd, - 0xbf, 0x71, 0xff, 0x7a, 0xb9, 0xb9, 0xae, 0xd6, 0x4a, 0xe5, 0x7a, 0xdd, 0x6d, 0xd5, 0xcc, 0x5a, - 0x29, 0x74, 0x94, 0xbb, 0xe0, 0xf6, 0x10, 0x6b, 0xe5, 0x06, 0xd9, 0x0c, 0x5d, 0xab, 0x11, 0x7f, + 0x65, 0x95, 0x16, 0xf9, 0xb0, 0x72, 0x13, 0x9c, 0x2f, 0x56, 0x6b, 0x0d, 0x37, 0xa5, 0x58, 0x7d, + 0xa8, 0xf1, 0xd0, 0x7a, 0xb9, 0xb9, 0xae, 0xd6, 0x4a, 0xe5, 0x7a, 0xdd, 0x6d, 0xd5, 0xcc, 0x5a, + 0x29, 0x74, 0x94, 0x7b, 0xe1, 0xae, 0x10, 0x6b, 0xe5, 0x06, 0xd9, 0x0c, 0x5d, 0xab, 0x11, 0x7f, 0x98, 0xc5, 0x72, 0x73, 0xa5, 0x58, 0x6f, 0x56, 0xaa, 0xa5, 0xda, 0xda, 0x7a, 0xb1, 0x51, 0x71, - 0x1b, 0xff, 0xba, 0x5a, 0x6b, 0xd4, 0x9a, 0x67, 0xcb, 0x6a, 0xbd, 0x52, 0xab, 0x16, 0x0c, 0xb7, - 0xca, 0xa1, 0xde, 0xc2, 0xeb, 0xb5, 0x4d, 0xe5, 0x2a, 0x38, 0xe5, 0xa5, 0xaf, 0xd6, 0x5c, 0x41, - 0x87, 0xec, 0x97, 0x6e, 0xaa, 0xf6, 0xcb, 0xbf, 0x4a, 0x90, 0xad, 0x3b, 0x66, 0x17, 0xfd, 0x68, - 0xd0, 0x1d, 0x9d, 0x06, 0xb0, 0xc8, 0xde, 0xa6, 0x3b, 0xc3, 0x63, 0x73, 0xbe, 0x50, 0x0a, 0xfa, - 0x43, 0xe1, 0x0d, 0x99, 0xa0, 0x87, 0x37, 0xbb, 0x11, 0x96, 0xcd, 0x77, 0xc5, 0x4e, 0xa8, 0x44, - 0x13, 0x4a, 0xa6, 0xef, 0xbf, 0x38, 0xcc, 0x96, 0x0b, 0x82, 0x93, 0x21, 0xd8, 0x5c, 0xf9, 0x7b, - 0x2a, 0x81, 0x95, 0xcb, 0xe1, 0xb2, 0x1e, 0xe5, 0x22, 0x3a, 0xb5, 0xa9, 0xfc, 0x08, 0x3c, 0x26, - 0xa4, 0xde, 0xe5, 0xb5, 0xda, 0xd9, 0xb2, 0xaf, 0xc8, 0x8b, 0xc5, 0x46, 0xb1, 0xb0, 0x85, 0x3e, - 0x27, 0x43, 0x76, 0xcd, 0xdc, 0xeb, 0xdd, 0x07, 0x33, 0xf0, 0xc5, 0xd0, 0x3a, 0xab, 0xf7, 0xca, - 0x7b, 0xe4, 0x0b, 0x89, 0x7d, 0x2d, 0x7a, 0xcf, 0xfb, 0x8b, 0x52, 0x12, 0xb1, 0xaf, 0x1d, 0x74, - 0xa3, 0xfb, 0xef, 0x87, 0x11, 0x7b, 0x84, 0x68, 0xb1, 0x72, 0x06, 0x4e, 0x07, 0x1f, 0x2a, 0x8b, - 0xe5, 0x6a, 0xa3, 0xb2, 0x74, 0x7f, 0x20, 0xdc, 0x8a, 0x2a, 0x24, 0xfe, 0x41, 0xdd, 0x58, 0xfc, - 0xbc, 0xe4, 0x14, 0x1c, 0x0f, 0xbe, 0x2d, 0x97, 0x1b, 0xde, 0x97, 0x07, 0xd0, 0x43, 0x39, 0x98, - 0xa1, 0xdd, 0xfa, 0x46, 0xb7, 0xad, 0x39, 0x18, 0x3d, 0x29, 0x40, 0xf7, 0x06, 0x38, 0x5a, 0x59, - 0x5f, 0xaa, 0xd7, 0x1d, 0xd3, 0xd2, 0xb6, 0x30, 0x19, 0xc7, 0xa8, 0xb4, 0x7a, 0x93, 0xd1, 0xbb, - 0x84, 0xd7, 0x10, 0xf9, 0xa1, 0x84, 0x96, 0x19, 0x81, 0xfa, 0x97, 0x85, 0xd6, 0xfc, 0x04, 0x08, - 0x26, 0x43, 0xff, 0x81, 0x11, 0xb7, 0xb9, 0x68, 0x5c, 0x36, 0xcf, 0x3c, 0x5b, 0x82, 0xa9, 0x86, - 0xbe, 0x83, 0x9f, 0x61, 0x1a, 0xd8, 0x56, 0x26, 0x40, 0x5e, 0x5e, 0x6b, 0x14, 0x8e, 0xb8, 0x0f, + 0x1b, 0xff, 0xba, 0x5a, 0x6b, 0xd4, 0x9a, 0x17, 0xca, 0x6a, 0xbd, 0x52, 0xab, 0x16, 0x0c, 0xb7, + 0xca, 0xa1, 0xde, 0xc2, 0xeb, 0xb5, 0x4d, 0xe5, 0x3a, 0x38, 0xe3, 0xa5, 0xaf, 0xd6, 0x5c, 0x41, + 0x87, 0xec, 0x97, 0x6e, 0xaa, 0xf6, 0xcb, 0xbf, 0x4a, 0x90, 0xad, 0x3b, 0x66, 0x17, 0x7d, 0x67, + 0xd0, 0x1d, 0x9d, 0x05, 0xb0, 0xc8, 0xde, 0xa6, 0x3b, 0xc3, 0x63, 0x73, 0xbe, 0x50, 0x0a, 0xfa, + 0x7d, 0xe1, 0x0d, 0x99, 0xa0, 0x87, 0x37, 0xbb, 0x11, 0x96, 0xcd, 0xd7, 0xc5, 0x4e, 0xa8, 0x44, + 0x13, 0x4a, 0xa6, 0xef, 0x3f, 0x36, 0xcc, 0x96, 0x0b, 0x82, 0xd3, 0x21, 0xd8, 0x5c, 0xf9, 0x7b, + 0x2a, 0x81, 0x95, 0xab, 0xe1, 0xaa, 0x1e, 0xe5, 0x22, 0x3a, 0xb5, 0xa9, 0x7c, 0x07, 0x3c, 0x29, + 0xa4, 0xde, 0xe5, 0xb5, 0xda, 0x85, 0xb2, 0xaf, 0xc8, 0x8b, 0xc5, 0x46, 0xb1, 0xb0, 0x85, 0x3e, + 0x21, 0x43, 0x76, 0xcd, 0xdc, 0xeb, 0xdd, 0x07, 0x33, 0xf0, 0x95, 0xd0, 0x3a, 0xab, 0xf7, 0xca, + 0x7b, 0xe4, 0x0b, 0x89, 0x7d, 0x2d, 0x7a, 0xcf, 0xfb, 0xd3, 0x52, 0x12, 0xb1, 0xaf, 0x1d, 0x76, + 0xa3, 0xfb, 0xef, 0x87, 0x11, 0x7b, 0x84, 0x68, 0xb1, 0x72, 0x1e, 0xce, 0x06, 0x1f, 0x2a, 0x8b, + 0xe5, 0x6a, 0xa3, 0xb2, 0xf4, 0x50, 0x20, 0xdc, 0x8a, 0x2a, 0x24, 0xfe, 0x41, 0xdd, 0x58, 0xfc, + 0xbc, 0xe4, 0x0c, 0x9c, 0x0c, 0xbe, 0x2d, 0x97, 0x1b, 0xde, 0x97, 0x87, 0xd1, 0xa3, 0x39, 0x98, + 0xa1, 0xdd, 0xfa, 0x46, 0xb7, 0xad, 0x39, 0x18, 0x3d, 0x23, 0x40, 0xf7, 0x66, 0x38, 0x5e, 0x59, + 0x5f, 0xaa, 0xd7, 0x1d, 0xd3, 0xd2, 0xb6, 0x30, 0x19, 0xc7, 0xa8, 0xb4, 0x7a, 0x93, 0xd1, 0x3b, + 0x84, 0xd7, 0x10, 0xf9, 0xa1, 0x84, 0x96, 0x19, 0x81, 0xfa, 0x67, 0x85, 0xd6, 0xfc, 0x04, 0x08, + 0x26, 0x43, 0xff, 0xe1, 0x11, 0xb7, 0xb9, 0x68, 0x5c, 0x36, 0xcf, 0xbf, 0x50, 0x82, 0xa9, 0x86, + 0xbe, 0x83, 0x9f, 0x67, 0x1a, 0xd8, 0x56, 0x26, 0x40, 0x5e, 0x5e, 0x6b, 0x14, 0x8e, 0xb9, 0x0f, 0xae, 0x09, 0x96, 0x21, 0x0f, 0x65, 0xb7, 0x00, 0xf7, 0xa1, 0xd8, 0x28, 0xc8, 0xee, 0xc3, 0x5a, 0xb9, 0x51, 0xc8, 0xba, 0x0f, 0xd5, 0x72, 0xa3, 0x90, 0x73, 0x1f, 0xd6, 0x57, 0x1b, 0x85, 0xbc, - 0xfb, 0x50, 0xa9, 0x37, 0x0a, 0x13, 0xee, 0xc3, 0x42, 0xbd, 0x51, 0x98, 0x74, 0x1f, 0xce, 0xd6, - 0x1b, 0x85, 0x29, 0xf7, 0xa1, 0xd4, 0x68, 0x14, 0xc0, 0x7d, 0xb8, 0xb7, 0xde, 0x28, 0x4c, 0xbb, + 0xfb, 0x50, 0xa9, 0x37, 0x0a, 0x13, 0xee, 0xc3, 0x42, 0xbd, 0x51, 0x98, 0x74, 0x1f, 0x2e, 0xd4, + 0x1b, 0x85, 0x29, 0xf7, 0xa1, 0xd4, 0x68, 0x14, 0xc0, 0x7d, 0x78, 0xa0, 0xde, 0x28, 0x4c, 0xbb, 0x0f, 0xc5, 0x52, 0xa3, 0x30, 0x43, 0x1e, 0xca, 0x8d, 0xc2, 0xac, 0xfb, 0x50, 0xaf, 0x37, 0x0a, - 0x73, 0x84, 0x72, 0xbd, 0x51, 0x38, 0x4a, 0xca, 0xaa, 0x34, 0x0a, 0x05, 0xf7, 0x61, 0xa5, 0xde, - 0x28, 0x1c, 0x23, 0x99, 0xeb, 0x8d, 0x82, 0x42, 0x0a, 0xad, 0x37, 0x0a, 0x97, 0x91, 0x3c, 0xf5, - 0x46, 0xe1, 0x38, 0x29, 0xa2, 0xde, 0x28, 0x9c, 0x20, 0x6c, 0x94, 0x1b, 0x85, 0x93, 0x24, 0x8f, - 0xda, 0x28, 0x5c, 0x4e, 0x3e, 0x55, 0x1b, 0x85, 0x53, 0x84, 0xb1, 0x72, 0xa3, 0x70, 0x05, 0x79, - 0x50, 0x1b, 0x05, 0x44, 0x3e, 0x15, 0x1b, 0x85, 0x2b, 0xd1, 0x63, 0x60, 0x6a, 0x19, 0x3b, 0x14, - 0x44, 0x54, 0x00, 0x79, 0x19, 0x3b, 0x61, 0xa3, 0xff, 0xab, 0x32, 0x5c, 0xce, 0x26, 0x8a, 0x4b, - 0x96, 0xb9, 0xb3, 0x8a, 0xb7, 0xb4, 0xd6, 0xa5, 0xf2, 0x83, 0xae, 0xc1, 0x15, 0xde, 0xf3, 0x55, - 0x20, 0xdb, 0x0d, 0x3a, 0x23, 0xf2, 0x1c, 0x6b, 0x9f, 0x7a, 0x0b, 0x5d, 0x72, 0xb0, 0xd0, 0xc5, - 0x2c, 0xb2, 0x7f, 0x0a, 0x6b, 0x34, 0xb7, 0x36, 0x9d, 0xe9, 0x59, 0x9b, 0x76, 0x9b, 0x49, 0x17, - 0x5b, 0xb6, 0x69, 0x68, 0x9d, 0x3a, 0x73, 0x0a, 0xa0, 0x2b, 0x6a, 0xbd, 0xc9, 0xca, 0x4f, 0x78, - 0x2d, 0x83, 0x5a, 0x65, 0x4f, 0x8b, 0x9b, 0x0f, 0xf7, 0x56, 0x33, 0xa2, 0x91, 0x7c, 0xd2, 0x6f, - 0x24, 0x0d, 0xae, 0x91, 0xdc, 0x73, 0x00, 0xda, 0xc9, 0xda, 0x4b, 0x65, 0xb8, 0x89, 0x48, 0xe0, - 0x32, 0xeb, 0x2d, 0x85, 0xcb, 0xe8, 0x73, 0x12, 0x9c, 0x2c, 0x1b, 0xfd, 0xe6, 0x03, 0x61, 0x5d, - 0x78, 0x73, 0x18, 0x9a, 0x75, 0x5e, 0xa4, 0xb7, 0xf7, 0xad, 0x76, 0x7f, 0x9a, 0x11, 0x12, 0xfd, - 0xb4, 0x2f, 0xd1, 0x3a, 0x27, 0xd1, 0xbb, 0x87, 0x27, 0x9d, 0x4c, 0xa0, 0xd5, 0x91, 0x76, 0x40, - 0x59, 0xf4, 0x35, 0x09, 0x8e, 0x51, 0xbf, 0x9e, 0x7b, 0xe9, 0xf4, 0x83, 0x74, 0xd9, 0xbc, 0x09, - 0xd5, 0x09, 0xa6, 0x2a, 0x54, 0xbf, 0x43, 0x29, 0xe8, 0xb5, 0x61, 0x81, 0xdf, 0xc7, 0x0b, 0x3c, - 0xa2, 0x33, 0xee, 0x2d, 0x2e, 0x42, 0xd6, 0x9f, 0xf0, 0x65, 0x5d, 0xe5, 0x64, 0x7d, 0xfb, 0x50, - 0x54, 0x0f, 0x57, 0xcc, 0xdf, 0xc8, 0xc2, 0x63, 0x28, 0x87, 0x4c, 0x11, 0x68, 0x67, 0x56, 0x34, + 0x73, 0x84, 0x72, 0xbd, 0x51, 0x38, 0x4e, 0xca, 0xaa, 0x34, 0x0a, 0x05, 0xf7, 0x61, 0xa5, 0xde, + 0x28, 0x9c, 0x20, 0x99, 0xeb, 0x8d, 0x82, 0x42, 0x0a, 0xad, 0x37, 0x0a, 0x57, 0x91, 0x3c, 0xf5, + 0x46, 0xe1, 0x24, 0x29, 0xa2, 0xde, 0x28, 0x9c, 0x22, 0x6c, 0x94, 0x1b, 0x85, 0xd3, 0x24, 0x8f, + 0xda, 0x28, 0x5c, 0x4d, 0x3e, 0x55, 0x1b, 0x85, 0x33, 0x84, 0xb1, 0x72, 0xa3, 0x70, 0x0d, 0x79, + 0x50, 0x1b, 0x05, 0x44, 0x3e, 0x15, 0x1b, 0x85, 0x6b, 0xd1, 0x93, 0x60, 0x6a, 0x19, 0x3b, 0x14, + 0x44, 0x54, 0x00, 0x79, 0x19, 0x3b, 0x61, 0xa3, 0xff, 0xf3, 0x32, 0x5c, 0xcd, 0x26, 0x8a, 0x4b, + 0x96, 0xb9, 0xb3, 0x8a, 0xb7, 0xb4, 0xd6, 0x7e, 0xf9, 0x11, 0xd7, 0xe0, 0x0a, 0xef, 0xf9, 0x2a, + 0x90, 0xed, 0x06, 0x9d, 0x11, 0x79, 0x8e, 0xb5, 0x4f, 0xbd, 0x85, 0x2e, 0x39, 0x58, 0xe8, 0x62, + 0x16, 0xd9, 0x3f, 0x85, 0x35, 0x9a, 0x5b, 0x9b, 0xce, 0xf4, 0xac, 0x4d, 0xbb, 0xcd, 0xa4, 0x8b, + 0x2d, 0xdb, 0x34, 0xb4, 0x4e, 0x9d, 0x39, 0x05, 0xd0, 0x15, 0xb5, 0xde, 0x64, 0xe5, 0x7b, 0xbc, + 0x96, 0x41, 0xad, 0xb2, 0xe7, 0xc4, 0xcd, 0x87, 0x7b, 0xab, 0x19, 0xd1, 0x48, 0x3e, 0xe2, 0x37, + 0x92, 0x06, 0xd7, 0x48, 0xee, 0x3f, 0x04, 0xed, 0x64, 0xed, 0xa5, 0x32, 0xdc, 0x44, 0x24, 0x70, + 0x99, 0xf5, 0x96, 0xc2, 0x65, 0xf4, 0x09, 0x09, 0x4e, 0x97, 0x8d, 0x7e, 0xf3, 0x81, 0xb0, 0x2e, + 0xbc, 0x29, 0x0c, 0xcd, 0x3a, 0x2f, 0xd2, 0xbb, 0xfa, 0x56, 0xbb, 0x3f, 0xcd, 0x08, 0x89, 0x7e, + 0xd4, 0x97, 0x68, 0x9d, 0x93, 0xe8, 0x7d, 0xc3, 0x93, 0x4e, 0x26, 0xd0, 0xea, 0x48, 0x3b, 0xa0, + 0x2c, 0xfa, 0x82, 0x04, 0x27, 0xa8, 0x5f, 0xcf, 0x03, 0x74, 0xfa, 0x41, 0xba, 0x6c, 0xde, 0x84, + 0xea, 0x04, 0x53, 0x15, 0xaa, 0xdf, 0xa1, 0x14, 0xf4, 0xfa, 0xb0, 0xc0, 0x1f, 0xe4, 0x05, 0x1e, + 0xd1, 0x19, 0xf7, 0x16, 0x17, 0x21, 0xeb, 0x3f, 0xf0, 0x65, 0x5d, 0xe5, 0x64, 0x7d, 0xd7, 0x50, + 0x54, 0x8f, 0x56, 0xcc, 0x5f, 0xca, 0xc2, 0x93, 0x28, 0x87, 0x4c, 0x11, 0x68, 0x67, 0x56, 0x34, 0xda, 0x2a, 0xb6, 0x1d, 0xcd, 0x72, 0xb8, 0x23, 0xed, 0x3d, 0xf3, 0xdb, 0x4c, 0x0a, 0xf3, 0x5b, - 0x69, 0xe0, 0xfc, 0x16, 0xbd, 0x33, 0x6c, 0xa5, 0x9d, 0xe3, 0x91, 0x2d, 0xc6, 0x60, 0x10, 0x51, - 0xc3, 0xa8, 0x16, 0xe5, 0x9b, 0x6f, 0x3f, 0xc9, 0xa1, 0xbc, 0x74, 0xe0, 0x12, 0x92, 0x21, 0xfe, - 0x87, 0xa3, 0x35, 0xa7, 0xb3, 0xe1, 0x6f, 0xbc, 0xed, 0x57, 0x68, 0xa7, 0x3a, 0x0f, 0x7a, 0xe1, - 0x24, 0x4c, 0x91, 0x2e, 0x67, 0x55, 0x37, 0x2e, 0xb8, 0x63, 0xe3, 0x4c, 0x15, 0x5f, 0x2c, 0x6d, - 0x6b, 0x9d, 0x0e, 0x36, 0xb6, 0x30, 0x7a, 0x80, 0x33, 0xd0, 0xb5, 0x6e, 0xb7, 0x1a, 0x6c, 0x15, - 0x79, 0xaf, 0xca, 0xdd, 0x90, 0xb3, 0x5b, 0x66, 0x17, 0x13, 0x41, 0xcd, 0x85, 0x9c, 0x4b, 0xf8, + 0x69, 0xe0, 0xfc, 0x16, 0xbd, 0x3d, 0x6c, 0xa5, 0x5d, 0xe4, 0x91, 0x2d, 0xc6, 0x60, 0x10, 0x51, + 0xc3, 0xa8, 0x16, 0xe5, 0x9b, 0x6f, 0xdf, 0xcb, 0xa1, 0xbc, 0x74, 0xe8, 0x12, 0x92, 0x21, 0xfe, + 0xfb, 0xa3, 0x35, 0xa7, 0xb3, 0xe1, 0x6f, 0xbc, 0xed, 0x57, 0x68, 0xa7, 0x3a, 0x0f, 0x7a, 0xd9, + 0x24, 0x4c, 0x91, 0x2e, 0x67, 0x55, 0x37, 0x2e, 0xbb, 0x63, 0xe3, 0x4c, 0x15, 0x5f, 0x29, 0x6d, + 0x6b, 0x9d, 0x0e, 0x36, 0xb6, 0x30, 0x7a, 0x98, 0x33, 0xd0, 0xb5, 0x6e, 0xb7, 0x1a, 0x6c, 0x15, + 0x79, 0xaf, 0xca, 0x7d, 0x90, 0xb3, 0x5b, 0x66, 0x17, 0x13, 0x41, 0xcd, 0x85, 0x9c, 0x4b, 0xf8, 0xe5, 0xae, 0xe2, 0xae, 0xb3, 0x3d, 0x4f, 0xca, 0x2a, 0x76, 0xf5, 0xba, 0xfb, 0x83, 0x4a, 0xff, - 0x63, 0xe3, 0xe4, 0xd7, 0xfb, 0x76, 0xc6, 0x99, 0x98, 0xce, 0xd8, 0x67, 0x7c, 0x3e, 0xcc, 0x74, - 0xc4, 0x4a, 0xc6, 0x35, 0x30, 0xdd, 0xf2, 0xb2, 0xf8, 0x67, 0x67, 0xc2, 0x49, 0xe8, 0x6f, 0x13, - 0x75, 0xd7, 0x42, 0x85, 0x27, 0xd3, 0x2a, 0x3c, 0x62, 0x7b, 0xf1, 0x04, 0x1c, 0x6b, 0xd4, 0x6a, - 0xcd, 0xb5, 0x62, 0xf5, 0xfe, 0xe0, 0xcc, 0xfa, 0x26, 0x7a, 0x79, 0x16, 0xe6, 0xea, 0x66, 0x67, - 0x0f, 0x07, 0x38, 0x57, 0x38, 0xa7, 0xac, 0xb0, 0x9c, 0x32, 0xfb, 0xe4, 0xa4, 0x9c, 0x84, 0xbc, - 0x66, 0xd8, 0x17, 0xb1, 0x67, 0xc3, 0xb3, 0x37, 0x06, 0xe3, 0x07, 0xc2, 0x1d, 0x81, 0xca, 0xc3, - 0x78, 0xc7, 0x00, 0x49, 0xf2, 0x5c, 0x45, 0x00, 0x79, 0x06, 0x66, 0x6c, 0xba, 0x61, 0xdc, 0x08, - 0xf9, 0x05, 0x70, 0x69, 0x84, 0x45, 0xea, 0xb1, 0x20, 0x33, 0x16, 0xc9, 0x1b, 0x7a, 0x8d, 0xdf, - 0x7f, 0x6c, 0x70, 0x10, 0x17, 0x0f, 0xc2, 0x58, 0x32, 0x90, 0x5f, 0x39, 0xea, 0x99, 0xf8, 0x29, - 0x38, 0xce, 0x9a, 0x7d, 0xb3, 0xb4, 0x52, 0x5c, 0x5d, 0x2d, 0x57, 0x97, 0xcb, 0xcd, 0xca, 0x22, - 0xdd, 0x80, 0x0a, 0x52, 0x8a, 0x8d, 0x46, 0x79, 0x6d, 0xbd, 0x51, 0x6f, 0x96, 0x9f, 0x5e, 0x2a, - 0x97, 0x17, 0x89, 0x5b, 0x24, 0x39, 0xd7, 0xe4, 0x39, 0xb0, 0x16, 0xab, 0xf5, 0x73, 0x65, 0xb5, - 0xb0, 0x7d, 0xa6, 0x08, 0xd3, 0xa1, 0x81, 0xc2, 0xe5, 0x6e, 0x11, 0x6f, 0x6a, 0xbb, 0x1d, 0x66, - 0x53, 0x17, 0x8e, 0xb8, 0xdc, 0x11, 0xd9, 0xd4, 0x8c, 0xce, 0xa5, 0x42, 0x46, 0x29, 0xc0, 0x4c, - 0x78, 0x4c, 0x28, 0x48, 0xe8, 0x6d, 0x57, 0xc1, 0xd4, 0x39, 0xd3, 0xba, 0x40, 0x7c, 0xf9, 0xd0, - 0x7b, 0x69, 0x6c, 0x1b, 0xef, 0x94, 0x70, 0xc8, 0x00, 0x7b, 0xa5, 0xb8, 0xc7, 0x88, 0x47, 0x6d, - 0x7e, 0xe0, 0x49, 0xe0, 0x6b, 0x60, 0xfa, 0xa2, 0x97, 0x3b, 0x68, 0xe9, 0xa1, 0x24, 0xf4, 0xdf, - 0xc5, 0x7c, 0x40, 0x06, 0x17, 0x99, 0xbe, 0x8f, 0xc2, 0x5b, 0x25, 0xc8, 0x2f, 0x63, 0xa7, 0xd8, - 0xe9, 0x84, 0xe5, 0xf6, 0x12, 0xe1, 0xd3, 0x5d, 0x5c, 0x25, 0x8a, 0x9d, 0x4e, 0x74, 0xa3, 0x0a, - 0x09, 0xc8, 0x3b, 0x85, 0xc0, 0xa5, 0x09, 0xfa, 0x4e, 0x0e, 0x28, 0x30, 0x7d, 0x89, 0x7d, 0x48, - 0xf6, 0xfd, 0x1c, 0x1e, 0x0e, 0x99, 0x49, 0x4f, 0x0c, 0xe2, 0x1a, 0x65, 0xe2, 0xfd, 0x25, 0xbc, - 0x7c, 0xca, 0x7d, 0x30, 0xb1, 0x6b, 0xe3, 0x92, 0x66, 0x7b, 0x43, 0x1b, 0x5f, 0xd3, 0xda, 0xf9, - 0x07, 0x70, 0xcb, 0x99, 0xaf, 0xec, 0xb8, 0x13, 0x9f, 0x0d, 0x9a, 0xd1, 0x0f, 0x15, 0xc4, 0xde, - 0x55, 0x8f, 0x82, 0x3b, 0x79, 0xbc, 0xa8, 0x3b, 0xdb, 0xa5, 0x6d, 0xcd, 0x61, 0x3b, 0x16, 0xfe, - 0x3b, 0x7a, 0xc1, 0x10, 0x70, 0xc6, 0xee, 0xf0, 0x47, 0x1e, 0x12, 0x4d, 0x0c, 0xe2, 0x08, 0xb6, - 0xe5, 0x87, 0x01, 0xf1, 0x1f, 0x24, 0xc8, 0xd6, 0xba, 0xd8, 0x10, 0x3e, 0x11, 0xe5, 0xcb, 0x56, - 0xea, 0x91, 0xed, 0x6b, 0xc4, 0x3d, 0x04, 0xfd, 0x4a, 0xbb, 0x25, 0x47, 0x48, 0xf6, 0x66, 0xc8, - 0xea, 0xc6, 0xa6, 0xc9, 0x2c, 0xdb, 0x2b, 0x23, 0x6c, 0x9d, 0x8a, 0xb1, 0x69, 0xaa, 0x24, 0xa3, - 0xa8, 0x73, 0x60, 0x5c, 0xd9, 0xe9, 0x8b, 0xfb, 0x9b, 0x93, 0x90, 0xa7, 0xea, 0x8c, 0x5e, 0x2c, - 0x83, 0x5c, 0x6c, 0xb7, 0x23, 0x04, 0x2f, 0xed, 0x13, 0xbc, 0x49, 0x7e, 0xf3, 0x31, 0xf1, 0xdf, - 0xf9, 0x80, 0x36, 0x82, 0x7d, 0x3b, 0x6b, 0x52, 0xc5, 0x76, 0x3b, 0xda, 0x0f, 0xd9, 0x2f, 0x50, - 0xe2, 0x0b, 0x0c, 0xb7, 0x70, 0x59, 0xac, 0x85, 0x27, 0x1e, 0x08, 0x22, 0xf9, 0x4b, 0x1f, 0xa2, - 0x7f, 0x92, 0x60, 0x62, 0x55, 0xb7, 0x1d, 0x17, 0x9b, 0xa2, 0x08, 0x36, 0x57, 0xc1, 0x94, 0x27, - 0x1a, 0xb7, 0xcb, 0x73, 0xfb, 0xf3, 0x20, 0x81, 0x9f, 0x89, 0xdf, 0xcb, 0xa3, 0xf3, 0xe4, 0xf8, - 0xda, 0x33, 0x2e, 0xa2, 0x4f, 0x9a, 0x04, 0xc5, 0x4a, 0xbd, 0xc5, 0xfe, 0xb6, 0x2f, 0xf0, 0x35, - 0x4e, 0xe0, 0xb7, 0x0d, 0x53, 0x64, 0xfa, 0x42, 0xff, 0xbc, 0x04, 0xe0, 0x96, 0xcd, 0x8e, 0xf3, - 0x3d, 0x8e, 0x3b, 0xa4, 0x1f, 0x23, 0xdd, 0x97, 0x87, 0xa5, 0xbb, 0xc6, 0x4b, 0xf7, 0xc7, 0x07, - 0x57, 0x35, 0xee, 0xd8, 0x9e, 0x52, 0x00, 0x59, 0xf7, 0x45, 0xeb, 0x3e, 0xa2, 0xb7, 0xfa, 0x42, - 0x5d, 0xe7, 0x84, 0x7a, 0xc7, 0x90, 0x25, 0xa5, 0x2f, 0xd7, 0xbf, 0x94, 0x60, 0xa2, 0x8e, 0x1d, - 0xb7, 0x9b, 0x44, 0x67, 0x45, 0x7a, 0xf8, 0x50, 0xdb, 0x96, 0x04, 0xdb, 0xf6, 0x77, 0x32, 0xa2, - 0xc1, 0x7e, 0x02, 0xc9, 0x30, 0x9e, 0x22, 0x56, 0x1f, 0x1e, 0x16, 0x0a, 0xf6, 0x33, 0x88, 0x5a, - 0xfa, 0xd2, 0x7d, 0xb3, 0xe4, 0xbb, 0x5b, 0xf0, 0xa7, 0x6d, 0xc2, 0x66, 0x71, 0x66, 0xbf, 0x59, - 0x2c, 0x7e, 0xda, 0x26, 0x5c, 0xc7, 0x68, 0xef, 0x81, 0xc4, 0xc6, 0xc6, 0x08, 0x36, 0xf6, 0x87, - 0x91, 0xd7, 0xb3, 0x64, 0xc8, 0xb3, 0x1d, 0x80, 0xbb, 0xe3, 0x77, 0x00, 0x06, 0x4f, 0x2d, 0xde, - 0x33, 0x84, 0x29, 0x17, 0xb7, 0x2c, 0xef, 0xb3, 0x21, 0x85, 0xd8, 0xb8, 0x09, 0x72, 0x24, 0x1a, - 0x29, 0x1b, 0xe7, 0x02, 0x9f, 0x0c, 0x8f, 0x44, 0xd9, 0xfd, 0xaa, 0xd2, 0x4c, 0x89, 0x51, 0x18, - 0xc1, 0x4a, 0xfe, 0x30, 0x28, 0xbc, 0x4b, 0x01, 0x58, 0xdf, 0x3d, 0xdf, 0xd1, 0xed, 0x6d, 0xdd, - 0xd8, 0x42, 0xff, 0x9e, 0x81, 0x19, 0xf6, 0x4a, 0x83, 0x6a, 0xc6, 0x9a, 0x7f, 0x91, 0x46, 0x41, - 0x01, 0xe4, 0x5d, 0x4b, 0x67, 0xcb, 0x00, 0xee, 0xa3, 0x72, 0xa7, 0xef, 0x9e, 0x95, 0xed, 0x09, - 0xa7, 0xe0, 0x8a, 0x21, 0xe0, 0x60, 0x3e, 0x54, 0x7a, 0xe0, 0xa6, 0x15, 0x8e, 0x9c, 0x9a, 0xe3, - 0x23, 0xa7, 0x72, 0x67, 0x2c, 0xf3, 0x3d, 0x67, 0x2c, 0x5d, 0x1c, 0x6d, 0xfd, 0x19, 0x98, 0xf8, - 0xef, 0xc8, 0x2a, 0x79, 0x76, 0xff, 0x78, 0xc0, 0xd4, 0x0d, 0xb2, 0xa9, 0xc3, 0xdc, 0x87, 0x83, - 0x04, 0xf4, 0xc1, 0x60, 0x22, 0x63, 0x0a, 0x5a, 0xc1, 0x09, 0xc4, 0xc0, 0x95, 0x9d, 0xed, 0x2d, - 0xfb, 0x23, 0xc2, 0x91, 0xd2, 0x42, 0x02, 0x8b, 0x9d, 0x92, 0x30, 0x0e, 0x24, 0x9f, 0x83, 0xd0, - 0xae, 0x6c, 0x5c, 0x77, 0x3a, 0x88, 0x7e, 0x32, 0xc5, 0xdc, 0x19, 0x62, 0xf1, 0x45, 0x81, 0x39, - 0xef, 0xe4, 0x69, 0x6d, 0xe1, 0xde, 0x72, 0xa9, 0x51, 0xc0, 0xfb, 0x4f, 0xa3, 0x92, 0x73, 0xa7, - 0xf4, 0x8c, 0x69, 0xb0, 0xc0, 0x82, 0xfe, 0xa7, 0x04, 0x79, 0x66, 0x3b, 0xdc, 0x7d, 0x40, 0x08, - 0xd1, 0x2b, 0x86, 0x81, 0x24, 0x36, 0x00, 0xc0, 0xa7, 0x92, 0x02, 0x30, 0x02, 0x6b, 0xe1, 0xfe, - 0xd4, 0x00, 0x40, 0xff, 0x22, 0x41, 0xd6, 0xb5, 0x69, 0xc4, 0x8e, 0x57, 0x7f, 0x52, 0xd8, 0x55, - 0x39, 0x24, 0x00, 0x97, 0x7c, 0x84, 0x7e, 0x2f, 0xc0, 0x54, 0x97, 0x66, 0xf4, 0x0f, 0xf7, 0x5f, - 0x27, 0xd0, 0xb3, 0x60, 0x35, 0xf8, 0x0d, 0xbd, 0x5b, 0xc8, 0xdd, 0x39, 0x9e, 0x9f, 0x64, 0x70, - 0x94, 0x47, 0x71, 0x12, 0x7b, 0x13, 0x7d, 0x4f, 0x02, 0x50, 0xb1, 0x6d, 0x76, 0xf6, 0xf0, 0x86, - 0xa5, 0xa3, 0x2b, 0x03, 0x00, 0x58, 0xb3, 0xcf, 0x04, 0xcd, 0xfe, 0x33, 0x61, 0xc1, 0x2f, 0xf3, - 0x82, 0x7f, 0x62, 0xb4, 0xe6, 0x79, 0xc4, 0x23, 0xc4, 0x7f, 0x17, 0x4c, 0x30, 0x39, 0x32, 0x03, - 0x51, 0x4c, 0xf8, 0xde, 0x4f, 0xe8, 0x7d, 0xbe, 0xe8, 0xef, 0xe5, 0x44, 0xff, 0x94, 0xc4, 0x1c, - 0x25, 0x03, 0xa0, 0x34, 0x04, 0x00, 0x47, 0x61, 0xda, 0x03, 0x60, 0x43, 0xad, 0x14, 0x30, 0x7a, - 0x87, 0x4c, 0x7c, 0x1e, 0xe8, 0x48, 0x75, 0xf0, 0x9e, 0xe6, 0x6b, 0xc2, 0x33, 0xf7, 0x90, 0x3c, - 0xfc, 0xf2, 0x53, 0x02, 0xe8, 0x4f, 0x84, 0xa6, 0xea, 0x02, 0x0c, 0x3d, 0x5a, 0xfa, 0xab, 0x33, - 0x65, 0x98, 0xe5, 0x4c, 0x0c, 0xe5, 0x14, 0x1c, 0xe7, 0x12, 0xe8, 0x78, 0xd7, 0x2e, 0x1c, 0x51, - 0x10, 0x9c, 0xe4, 0xbe, 0xb0, 0x17, 0xdc, 0x2e, 0x64, 0xd0, 0x9f, 0x7d, 0x2e, 0xe3, 0x2f, 0xde, - 0xbc, 0x27, 0xcb, 0x96, 0xcd, 0x3e, 0xc6, 0xc7, 0x93, 0x6b, 0x99, 0x86, 0x83, 0x1f, 0x0c, 0xf9, - 0x9c, 0xf8, 0x09, 0xb1, 0x56, 0xc3, 0x29, 0x98, 0x70, 0xac, 0xb0, 0x1f, 0x8a, 0xf7, 0x1a, 0x56, - 0xac, 0x1c, 0xaf, 0x58, 0x55, 0x38, 0xa3, 0x1b, 0xad, 0xce, 0x6e, 0x1b, 0xab, 0xb8, 0xa3, 0xb9, - 0x32, 0xb4, 0x8b, 0xf6, 0x22, 0xee, 0x62, 0xa3, 0x8d, 0x0d, 0x87, 0xf2, 0xe9, 0x9d, 0x67, 0x13, - 0xc8, 0xc9, 0x2b, 0xe3, 0x9d, 0xbc, 0x32, 0x3e, 0xae, 0xdf, 0x7a, 0x6c, 0xcc, 0xe2, 0xdd, 0x6d, - 0x00, 0xb4, 0x6e, 0x67, 0x75, 0x7c, 0x91, 0xa9, 0xe1, 0x15, 0x3d, 0x4b, 0x78, 0x35, 0x3f, 0x83, - 0x1a, 0xca, 0x8c, 0x1e, 0xf1, 0xd5, 0xef, 0x1e, 0x4e, 0xfd, 0x6e, 0x12, 0x64, 0x21, 0x99, 0xd6, - 0x75, 0x87, 0xd0, 0xba, 0x59, 0x98, 0x0a, 0xb6, 0x86, 0x65, 0xe5, 0x0a, 0x38, 0xe1, 0xf9, 0xf4, - 0x56, 0xcb, 0xe5, 0xc5, 0x7a, 0x73, 0x63, 0x7d, 0x59, 0x2d, 0x2e, 0x96, 0x0b, 0xe0, 0xea, 0x27, - 0xd5, 0x4b, 0xdf, 0x15, 0x37, 0x8b, 0xfe, 0x5c, 0x82, 0x1c, 0x39, 0x8c, 0x89, 0x7e, 0x7a, 0x44, - 0x9a, 0x63, 0x73, 0x1e, 0x4c, 0xfe, 0xb8, 0x2b, 0x1e, 0xe7, 0x9d, 0x09, 0x93, 0x70, 0x75, 0xa0, - 0x38, 0xef, 0x31, 0x84, 0xd2, 0x9f, 0xd6, 0xb8, 0x4d, 0xb2, 0xbe, 0x6d, 0x5e, 0xfc, 0x61, 0x6e, - 0x92, 0x6e, 0xfd, 0x0f, 0xb9, 0x49, 0xf6, 0x61, 0x61, 0xec, 0x4d, 0xb2, 0x4f, 0xbb, 0x8b, 0x69, - 0xa6, 0xe8, 0x99, 0x39, 0x7f, 0xfe, 0xf7, 0x6c, 0xe9, 0x40, 0x1b, 0x59, 0x45, 0x98, 0xd5, 0x0d, - 0x07, 0x5b, 0x86, 0xd6, 0x59, 0xea, 0x68, 0x5b, 0x9e, 0x7d, 0xda, 0xbb, 0x7b, 0x51, 0x09, 0xe5, - 0x51, 0xf9, 0x3f, 0x94, 0xd3, 0x00, 0x0e, 0xde, 0xe9, 0x76, 0x34, 0x27, 0x50, 0xbd, 0x50, 0x4a, - 0x58, 0xfb, 0xb2, 0xbc, 0xf6, 0xdd, 0x02, 0x97, 0x51, 0xd0, 0x1a, 0x97, 0xba, 0x78, 0xc3, 0xd0, - 0x7f, 0x66, 0x97, 0x84, 0x1f, 0xa5, 0x3a, 0xda, 0xef, 0x13, 0xb7, 0x9d, 0x93, 0xef, 0xd9, 0xce, - 0xf9, 0x07, 0xe1, 0xb0, 0x26, 0x5e, 0xab, 0x1f, 0x10, 0xd6, 0xc4, 0x6f, 0x69, 0x72, 0x4f, 0x4b, - 0xf3, 0x17, 0x59, 0xb2, 0x02, 0x8b, 0x2c, 0x61, 0x54, 0x72, 0x82, 0x0b, 0x94, 0xaf, 0x16, 0x8a, - 0x9b, 0x12, 0x57, 0x8d, 0x31, 0x2c, 0x80, 0xcb, 0x30, 0x47, 0x8b, 0x5e, 0x30, 0xcd, 0x0b, 0x3b, - 0x9a, 0x75, 0x01, 0x59, 0x07, 0x52, 0xc5, 0xd8, 0xbd, 0xa4, 0xc8, 0x0d, 0xd2, 0x4f, 0x0b, 0xcf, - 0x19, 0x38, 0x71, 0x79, 0x3c, 0x8f, 0x67, 0x33, 0xe9, 0x8d, 0x42, 0x53, 0x08, 0x11, 0x06, 0xd3, - 0xc7, 0xf5, 0x8f, 0x7c, 0x5c, 0xbd, 0x8e, 0x3e, 0xbc, 0x0e, 0x3f, 0x4a, 0x5c, 0xd1, 0x97, 0x87, - 0xc3, 0xce, 0xe3, 0x6b, 0x08, 0xec, 0x0a, 0x20, 0x5f, 0xf0, 0x5d, 0x7f, 0xdc, 0xc7, 0x70, 0x85, - 0xb2, 0xe9, 0xa1, 0x19, 0xc1, 0xf2, 0x58, 0xd0, 0x3c, 0xce, 0xb3, 0x50, 0xeb, 0xa6, 0x8a, 0xe9, - 0x97, 0x84, 0xf7, 0xb7, 0xfa, 0x0a, 0x88, 0x72, 0x37, 0x9e, 0x56, 0x29, 0xb6, 0x39, 0x26, 0xce, - 0x66, 0xfa, 0x68, 0x3e, 0x3f, 0x07, 0x53, 0x5e, 0xe0, 0x19, 0x72, 0x2f, 0x92, 0x8f, 0xe1, 0x49, - 0xc8, 0xdb, 0xe6, 0xae, 0xd5, 0xc2, 0x6c, 0xc7, 0x91, 0xbd, 0x0d, 0xb1, 0x3b, 0x36, 0x70, 0x3c, - 0xdf, 0x67, 0x32, 0x64, 0x13, 0x9b, 0x0c, 0xd1, 0x06, 0x69, 0xdc, 0x00, 0xff, 0x02, 0xe1, 0x60, - 0xf6, 0x1c, 0x66, 0x75, 0xec, 0x3c, 0x1a, 0xc7, 0xf8, 0x3f, 0x10, 0xda, 0x7b, 0x19, 0x50, 0x93, - 0x64, 0x2a, 0x57, 0x1b, 0xc2, 0x50, 0xbd, 0x12, 0x2e, 0xf7, 0x72, 0x30, 0x0b, 0x95, 0x58, 0xa4, - 0x1b, 0xea, 0x6a, 0x41, 0x46, 0xcf, 0xca, 0x42, 0x81, 0xb2, 0x56, 0xf3, 0x8d, 0x35, 0xf4, 0x92, - 0xcc, 0x61, 0x5b, 0xa4, 0xd1, 0x53, 0xcc, 0xcf, 0x4a, 0xa2, 0x01, 0x73, 0x39, 0xc1, 0x07, 0xb5, - 0x8b, 0xd0, 0xa4, 0x21, 0x9a, 0x59, 0x8c, 0xf2, 0xa1, 0xdf, 0xca, 0x88, 0xc4, 0xdf, 0x15, 0x63, - 0x71, 0x0c, 0xc1, 0x92, 0xb2, 0x5e, 0xfc, 0xb0, 0x25, 0xcb, 0xdc, 0xd9, 0xb0, 0x3a, 0xe8, 0xff, - 0x14, 0x0a, 0x6f, 0x1e, 0x61, 0xfe, 0x4b, 0xd1, 0xe6, 0x3f, 0x59, 0x32, 0xee, 0x04, 0x7b, 0x55, - 0x9d, 0x21, 0x86, 0x6f, 0xe5, 0x7a, 0x98, 0xd3, 0xda, 0xed, 0x75, 0x6d, 0x0b, 0x97, 0xdc, 0x79, - 0xb5, 0xe1, 0xb0, 0xd8, 0x42, 0x3d, 0xa9, 0xb1, 0x5d, 0x91, 0xf8, 0x3a, 0x28, 0x07, 0x12, 0x93, - 0xcf, 0x58, 0x86, 0x37, 0x77, 0x48, 0x68, 0x6d, 0x6b, 0x41, 0xa4, 0x33, 0xf6, 0x26, 0xe8, 0xd9, - 0x24, 0xc0, 0x77, 0xfa, 0x9a, 0xf5, 0x7b, 0x12, 0x4c, 0xb8, 0xf2, 0x2e, 0xb6, 0xdb, 0xe8, 0xb1, - 0x5c, 0x40, 0xc0, 0x48, 0xdf, 0xb2, 0xe7, 0x0a, 0x3b, 0xf5, 0x79, 0x35, 0xa4, 0xf4, 0x23, 0x30, - 0x09, 0x84, 0x28, 0x71, 0x42, 0x14, 0xf3, 0xdd, 0x8b, 0x2d, 0x22, 0x7d, 0xf1, 0x7d, 0x52, 0x82, - 0x59, 0x6f, 0x1e, 0xb1, 0x84, 0x9d, 0xd6, 0x36, 0xba, 0x4d, 0x74, 0xa1, 0x89, 0xb5, 0x34, 0x7f, - 0x4f, 0xb6, 0x83, 0xbe, 0x9f, 0x49, 0xa8, 0xf2, 0x5c, 0xc9, 0x11, 0xab, 0x74, 0x89, 0x74, 0x31, - 0x8e, 0x60, 0xfa, 0xc2, 0x7c, 0x44, 0x02, 0x68, 0x98, 0xfe, 0x5c, 0xf7, 0x00, 0x92, 0x7c, 0x91, + 0x63, 0xe3, 0xe4, 0x17, 0xfb, 0x76, 0xc6, 0x99, 0x98, 0xce, 0xd8, 0x67, 0x7c, 0x3e, 0xcc, 0x74, + 0xc4, 0x4a, 0xc6, 0x39, 0x98, 0x6e, 0x79, 0x59, 0xfc, 0xb3, 0x33, 0xe1, 0x24, 0xf4, 0xb7, 0x89, + 0xba, 0x6b, 0xa1, 0xc2, 0x93, 0x69, 0x15, 0x1e, 0xb1, 0xbd, 0x78, 0x0a, 0x4e, 0x34, 0x6a, 0xb5, + 0xe6, 0x5a, 0xb1, 0xfa, 0x50, 0x70, 0x66, 0x7d, 0x13, 0xbd, 0x2a, 0x0b, 0x73, 0x75, 0xb3, 0xb3, + 0x87, 0x03, 0x9c, 0x2b, 0x9c, 0x53, 0x56, 0x58, 0x4e, 0x99, 0x03, 0x72, 0x52, 0x4e, 0x43, 0x5e, + 0x33, 0xec, 0x2b, 0xd8, 0xb3, 0xe1, 0xd9, 0x1b, 0x83, 0xf1, 0x77, 0xc2, 0x1d, 0x81, 0xca, 0xc3, + 0x78, 0xf7, 0x00, 0x49, 0xf2, 0x5c, 0x45, 0x00, 0x79, 0x1e, 0x66, 0x6c, 0xba, 0x61, 0xdc, 0x08, + 0xf9, 0x05, 0x70, 0x69, 0x84, 0x45, 0xea, 0xb1, 0x20, 0x33, 0x16, 0xc9, 0x1b, 0x7a, 0x9d, 0xdf, + 0x7f, 0x6c, 0x70, 0x10, 0x17, 0x0f, 0xc3, 0x58, 0x32, 0x90, 0x5f, 0x33, 0xea, 0x99, 0xf8, 0x19, + 0x38, 0xc9, 0x9a, 0x7d, 0xb3, 0xb4, 0x52, 0x5c, 0x5d, 0x2d, 0x57, 0x97, 0xcb, 0xcd, 0xca, 0x22, + 0xdd, 0x80, 0x0a, 0x52, 0x8a, 0x8d, 0x46, 0x79, 0x6d, 0xbd, 0x51, 0x6f, 0x96, 0x9f, 0x5b, 0x2a, + 0x97, 0x17, 0x89, 0x5b, 0x24, 0x39, 0xd7, 0xe4, 0x39, 0xb0, 0x16, 0xab, 0xf5, 0x8b, 0x65, 0xb5, + 0xb0, 0x7d, 0xbe, 0x08, 0xd3, 0xa1, 0x81, 0xc2, 0xe5, 0x6e, 0x11, 0x6f, 0x6a, 0xbb, 0x1d, 0x66, + 0x53, 0x17, 0x8e, 0xb9, 0xdc, 0x11, 0xd9, 0xd4, 0x8c, 0xce, 0x7e, 0x21, 0xa3, 0x14, 0x60, 0x26, + 0x3c, 0x26, 0x14, 0x24, 0xf4, 0x96, 0xeb, 0x60, 0xea, 0xa2, 0x69, 0x5d, 0x26, 0xbe, 0x7c, 0xe8, + 0xdd, 0x34, 0xb6, 0x8d, 0x77, 0x4a, 0x38, 0x64, 0x80, 0xbd, 0x46, 0xdc, 0x63, 0xc4, 0xa3, 0x36, + 0x3f, 0xf0, 0x24, 0xf0, 0x39, 0x98, 0xbe, 0xe2, 0xe5, 0x0e, 0x5a, 0x7a, 0x28, 0x09, 0xfd, 0x77, + 0x31, 0x1f, 0x90, 0xc1, 0x45, 0xa6, 0xef, 0xa3, 0xf0, 0x66, 0x09, 0xf2, 0xcb, 0xd8, 0x29, 0x76, + 0x3a, 0x61, 0xb9, 0xbd, 0x52, 0xf8, 0x74, 0x17, 0x57, 0x89, 0x62, 0xa7, 0x13, 0xdd, 0xa8, 0x42, + 0x02, 0xf2, 0x4e, 0x21, 0x70, 0x69, 0x82, 0xbe, 0x93, 0x03, 0x0a, 0x4c, 0x5f, 0x62, 0xbf, 0x27, + 0xfb, 0x7e, 0x0e, 0x8f, 0x85, 0xcc, 0xa4, 0xa7, 0x07, 0x71, 0x8d, 0x32, 0xf1, 0xfe, 0x12, 0x5e, + 0x3e, 0xe5, 0x41, 0x98, 0xd8, 0xb5, 0x71, 0x49, 0xb3, 0xbd, 0xa1, 0x8d, 0xaf, 0x69, 0xed, 0xd2, + 0xc3, 0xb8, 0xe5, 0xcc, 0x57, 0x76, 0xdc, 0x89, 0xcf, 0x06, 0xcd, 0xe8, 0x87, 0x0a, 0x62, 0xef, + 0xaa, 0x47, 0xc1, 0x9d, 0x3c, 0x5e, 0xd1, 0x9d, 0xed, 0xd2, 0xb6, 0xe6, 0xb0, 0x1d, 0x0b, 0xff, + 0x1d, 0xbd, 0x74, 0x08, 0x38, 0x63, 0x77, 0xf8, 0x23, 0x0f, 0x89, 0x26, 0x06, 0x71, 0x04, 0xdb, + 0xf2, 0xc3, 0x80, 0xf8, 0x0f, 0x12, 0x64, 0x6b, 0x5d, 0x6c, 0x08, 0x9f, 0x88, 0xf2, 0x65, 0x2b, + 0xf5, 0xc8, 0xf6, 0x75, 0xe2, 0x1e, 0x82, 0x7e, 0xa5, 0xdd, 0x92, 0x23, 0x24, 0x7b, 0x1b, 0x64, + 0x75, 0x63, 0xd3, 0x64, 0x96, 0xed, 0xb5, 0x11, 0xb6, 0x4e, 0xc5, 0xd8, 0x34, 0x55, 0x92, 0x51, + 0xd4, 0x39, 0x30, 0xae, 0xec, 0xf4, 0xc5, 0xfd, 0xe5, 0x49, 0xc8, 0x53, 0x75, 0x46, 0xaf, 0x90, + 0x41, 0x2e, 0xb6, 0xdb, 0x11, 0x82, 0x97, 0x0e, 0x08, 0xde, 0x24, 0xbf, 0xf9, 0x98, 0xf8, 0xef, + 0x7c, 0x40, 0x1b, 0xc1, 0xbe, 0x9d, 0x35, 0xa9, 0x62, 0xbb, 0x1d, 0xed, 0x87, 0xec, 0x17, 0x28, + 0xf1, 0x05, 0x86, 0x5b, 0xb8, 0x2c, 0xd6, 0xc2, 0x13, 0x0f, 0x04, 0x91, 0xfc, 0xa5, 0x0f, 0xd1, + 0x3f, 0x49, 0x30, 0xb1, 0xaa, 0xdb, 0x8e, 0x8b, 0x4d, 0x51, 0x04, 0x9b, 0xeb, 0x60, 0xca, 0x13, + 0x8d, 0xdb, 0xe5, 0xb9, 0xfd, 0x79, 0x90, 0xc0, 0xcf, 0xc4, 0x1f, 0xe0, 0xd1, 0x79, 0x66, 0x7c, + 0xed, 0x19, 0x17, 0xd1, 0x27, 0x4d, 0x82, 0x62, 0xa5, 0xde, 0x62, 0x7f, 0xcd, 0x17, 0xf8, 0x1a, + 0x27, 0xf0, 0x3b, 0x87, 0x29, 0x32, 0x7d, 0xa1, 0x7f, 0x52, 0x02, 0x70, 0xcb, 0x66, 0xc7, 0xf9, + 0x9e, 0xc2, 0x1d, 0xd2, 0x8f, 0x91, 0xee, 0xab, 0xc2, 0xd2, 0x5d, 0xe3, 0xa5, 0xfb, 0xdd, 0x83, + 0xab, 0x1a, 0x77, 0x6c, 0x4f, 0x29, 0x80, 0xac, 0xfb, 0xa2, 0x75, 0x1f, 0xd1, 0x9b, 0x7d, 0xa1, + 0xae, 0x73, 0x42, 0xbd, 0x7b, 0xc8, 0x92, 0xd2, 0x97, 0xeb, 0x5f, 0x4a, 0x30, 0x51, 0xc7, 0x8e, + 0xdb, 0x4d, 0xa2, 0x0b, 0x22, 0x3d, 0x7c, 0xa8, 0x6d, 0x4b, 0x82, 0x6d, 0xfb, 0x6b, 0x19, 0xd1, + 0x60, 0x3f, 0x81, 0x64, 0x18, 0x4f, 0x11, 0xab, 0x0f, 0x8f, 0x09, 0x05, 0xfb, 0x19, 0x44, 0x2d, + 0x7d, 0xe9, 0xbe, 0x49, 0xf2, 0xdd, 0x2d, 0xf8, 0xd3, 0x36, 0x61, 0xb3, 0x38, 0x73, 0xd0, 0x2c, + 0x16, 0x3f, 0x6d, 0x13, 0xae, 0x63, 0xb4, 0xf7, 0x40, 0x62, 0x63, 0x63, 0x04, 0x1b, 0xfb, 0xc3, + 0xc8, 0xeb, 0x05, 0x32, 0xe4, 0xd9, 0x0e, 0xc0, 0x7d, 0xf1, 0x3b, 0x00, 0x83, 0xa7, 0x16, 0xef, + 0x1a, 0xc2, 0x94, 0x8b, 0x5b, 0x96, 0xf7, 0xd9, 0x90, 0x42, 0x6c, 0xdc, 0x0a, 0x39, 0x12, 0x8d, + 0x94, 0x8d, 0x73, 0x81, 0x4f, 0x86, 0x47, 0xa2, 0xec, 0x7e, 0x55, 0x69, 0xa6, 0xc4, 0x28, 0x8c, + 0x60, 0x25, 0x7f, 0x18, 0x14, 0xde, 0xa1, 0x00, 0xac, 0xef, 0x5e, 0xea, 0xe8, 0xf6, 0xb6, 0x6e, + 0x6c, 0xa1, 0x7f, 0xcf, 0xc0, 0x0c, 0x7b, 0xa5, 0x41, 0x35, 0x63, 0xcd, 0xbf, 0x48, 0xa3, 0xa0, + 0x00, 0xf2, 0xae, 0xa5, 0xb3, 0x65, 0x00, 0xf7, 0x51, 0xb9, 0xc7, 0x77, 0xcf, 0xca, 0xf6, 0x84, + 0x53, 0x70, 0xc5, 0x10, 0x70, 0x30, 0x1f, 0x2a, 0x3d, 0x70, 0xd3, 0x0a, 0x47, 0x4e, 0xcd, 0xf1, + 0x91, 0x53, 0xb9, 0x33, 0x96, 0xf9, 0x9e, 0x33, 0x96, 0x2e, 0x8e, 0xb6, 0xfe, 0x3c, 0x4c, 0xfc, + 0x77, 0x64, 0x95, 0x3c, 0xbb, 0x7f, 0x3c, 0x6c, 0xea, 0x06, 0xd9, 0xd4, 0x61, 0xee, 0xc3, 0x41, + 0x02, 0x7a, 0x5f, 0x30, 0x91, 0x31, 0x05, 0xad, 0xe0, 0x04, 0x62, 0xe0, 0xca, 0xce, 0xf6, 0x96, + 0xfd, 0x01, 0xe1, 0x48, 0x69, 0x21, 0x81, 0xc5, 0x4e, 0x49, 0x18, 0x07, 0x92, 0xcf, 0x41, 0x68, + 0x57, 0x36, 0xae, 0x3b, 0x1d, 0x44, 0x3f, 0x99, 0x62, 0xee, 0x0c, 0xb1, 0xf8, 0xa2, 0xc0, 0x9c, + 0x77, 0xf2, 0xb4, 0xb6, 0xf0, 0x40, 0xb9, 0xd4, 0x28, 0xe0, 0x83, 0xa7, 0x51, 0xc9, 0xb9, 0x53, + 0x7a, 0xc6, 0x34, 0x58, 0x60, 0x41, 0xff, 0x53, 0x82, 0x3c, 0xb3, 0x1d, 0xee, 0x3b, 0x24, 0x84, + 0xe8, 0xd5, 0xc3, 0x40, 0x12, 0x1b, 0x00, 0xe0, 0x8f, 0x92, 0x02, 0x30, 0x02, 0x6b, 0xe1, 0xa1, + 0xd4, 0x00, 0x40, 0xff, 0x22, 0x41, 0xd6, 0xb5, 0x69, 0xc4, 0x8e, 0x57, 0x7f, 0x44, 0xd8, 0x55, + 0x39, 0x24, 0x00, 0x97, 0x7c, 0x84, 0x7e, 0x2f, 0xc0, 0x54, 0x97, 0x66, 0xf4, 0x0f, 0xf7, 0xdf, + 0x28, 0xd0, 0xb3, 0x60, 0x35, 0xf8, 0x0d, 0xbd, 0x53, 0xc8, 0xdd, 0x39, 0x9e, 0x9f, 0x64, 0x70, + 0x94, 0x47, 0x71, 0x12, 0x7b, 0x13, 0x7d, 0x43, 0x02, 0x50, 0xb1, 0x6d, 0x76, 0xf6, 0xf0, 0x86, + 0xa5, 0xa3, 0x6b, 0x03, 0x00, 0x58, 0xb3, 0xcf, 0x04, 0xcd, 0xfe, 0x63, 0x61, 0xc1, 0x2f, 0xf3, + 0x82, 0x7f, 0x7a, 0xb4, 0xe6, 0x79, 0xc4, 0x23, 0xc4, 0x7f, 0x2f, 0x4c, 0x30, 0x39, 0x32, 0x03, + 0x51, 0x4c, 0xf8, 0xde, 0x4f, 0xe8, 0x3d, 0xbe, 0xe8, 0x1f, 0xe0, 0x44, 0xff, 0xac, 0xc4, 0x1c, + 0x25, 0x03, 0xa0, 0x34, 0x04, 0x00, 0xc7, 0x61, 0xda, 0x03, 0x60, 0x43, 0xad, 0x14, 0x30, 0x7a, + 0x9b, 0x4c, 0x7c, 0x1e, 0xe8, 0x48, 0x75, 0xf8, 0x9e, 0xe6, 0x0b, 0xc2, 0x33, 0xf7, 0x90, 0x3c, + 0xfc, 0xf2, 0x53, 0x02, 0xe8, 0x4f, 0x84, 0xa6, 0xea, 0x02, 0x0c, 0x3d, 0x51, 0xfa, 0xab, 0xf3, + 0x65, 0x98, 0xe5, 0x4c, 0x0c, 0xe5, 0x0c, 0x9c, 0xe4, 0x12, 0xe8, 0x78, 0xd7, 0x2e, 0x1c, 0x53, + 0x10, 0x9c, 0xe6, 0xbe, 0xb0, 0x17, 0xdc, 0x2e, 0x64, 0xd0, 0x2b, 0x3e, 0x99, 0xf1, 0x17, 0x6f, + 0xde, 0x95, 0x65, 0xcb, 0x66, 0x1f, 0xe2, 0xe3, 0xc9, 0xb5, 0x4c, 0xc3, 0xc1, 0x8f, 0x84, 0x7c, + 0x4e, 0xfc, 0x84, 0x58, 0xab, 0xe1, 0x0c, 0x4c, 0x38, 0x56, 0xd8, 0x0f, 0xc5, 0x7b, 0x0d, 0x2b, + 0x56, 0x8e, 0x57, 0xac, 0x2a, 0x9c, 0xd7, 0x8d, 0x56, 0x67, 0xb7, 0x8d, 0x55, 0xdc, 0xd1, 0x5c, + 0x19, 0xda, 0x45, 0x7b, 0x11, 0x77, 0xb1, 0xd1, 0xc6, 0x86, 0x43, 0xf9, 0xf4, 0xce, 0xb3, 0x09, + 0xe4, 0xe4, 0x95, 0xf1, 0x1e, 0x5e, 0x19, 0x9f, 0xd2, 0x6f, 0x3d, 0x36, 0x66, 0xf1, 0xee, 0x4e, + 0x00, 0x5a, 0xb7, 0x0b, 0x3a, 0xbe, 0xc2, 0xd4, 0xf0, 0x9a, 0x9e, 0x25, 0xbc, 0x9a, 0x9f, 0x41, + 0x0d, 0x65, 0x46, 0x8f, 0xfb, 0xea, 0x77, 0x3f, 0xa7, 0x7e, 0xb7, 0x0a, 0xb2, 0x90, 0x4c, 0xeb, + 0xba, 0x43, 0x68, 0xdd, 0x2c, 0x4c, 0x05, 0x5b, 0xc3, 0xb2, 0x72, 0x0d, 0x9c, 0xf2, 0x7c, 0x7a, + 0xab, 0xe5, 0xf2, 0x62, 0xbd, 0xb9, 0xb1, 0xbe, 0xac, 0x16, 0x17, 0xcb, 0x05, 0x70, 0xf5, 0x93, + 0xea, 0xa5, 0xef, 0x8a, 0x9b, 0x45, 0x7f, 0x2e, 0x41, 0x8e, 0x1c, 0xc6, 0x44, 0xdf, 0x3f, 0x22, + 0xcd, 0xb1, 0x39, 0x0f, 0x26, 0x7f, 0xdc, 0x15, 0x8f, 0xf3, 0xce, 0x84, 0x49, 0xb8, 0x3a, 0x54, + 0x9c, 0xf7, 0x18, 0x42, 0xe9, 0x4f, 0x6b, 0xdc, 0x26, 0x59, 0xdf, 0x36, 0xaf, 0x7c, 0x3b, 0x37, + 0x49, 0xb7, 0xfe, 0x47, 0xdc, 0x24, 0xfb, 0xb0, 0x30, 0xf6, 0x26, 0xd9, 0xa7, 0xdd, 0xc5, 0x34, + 0x53, 0xf4, 0xfc, 0x9c, 0x3f, 0xff, 0x7b, 0xa1, 0x74, 0xa8, 0x8d, 0xac, 0x22, 0xcc, 0xea, 0x86, + 0x83, 0x2d, 0x43, 0xeb, 0x2c, 0x75, 0xb4, 0x2d, 0xcf, 0x3e, 0xed, 0xdd, 0xbd, 0xa8, 0x84, 0xf2, + 0xa8, 0xfc, 0x1f, 0xca, 0x59, 0x00, 0x07, 0xef, 0x74, 0x3b, 0x9a, 0x13, 0xa8, 0x5e, 0x28, 0x25, + 0xac, 0x7d, 0x59, 0x5e, 0xfb, 0x6e, 0x87, 0xab, 0x28, 0x68, 0x8d, 0xfd, 0x2e, 0xde, 0x30, 0xf4, + 0x1f, 0xd8, 0x25, 0xe1, 0x47, 0xa9, 0x8e, 0xf6, 0xfb, 0xc4, 0x6d, 0xe7, 0xe4, 0x7b, 0xb6, 0x73, + 0xfe, 0x41, 0x38, 0xac, 0x89, 0xd7, 0xea, 0x07, 0x84, 0x35, 0xf1, 0x5b, 0x9a, 0xdc, 0xd3, 0xd2, + 0xfc, 0x45, 0x96, 0xac, 0xc0, 0x22, 0x4b, 0x18, 0x95, 0x9c, 0xe0, 0x02, 0xe5, 0x6b, 0x85, 0xe2, + 0xa6, 0xc4, 0x55, 0x63, 0x0c, 0x0b, 0xe0, 0x32, 0xcc, 0xd1, 0xa2, 0x17, 0x4c, 0xf3, 0xf2, 0x8e, + 0x66, 0x5d, 0x46, 0xd6, 0xa1, 0x54, 0x31, 0x76, 0x2f, 0x29, 0x72, 0x83, 0xf4, 0xa3, 0xc2, 0x73, + 0x06, 0x4e, 0x5c, 0x1e, 0xcf, 0xe3, 0xd9, 0x4c, 0xfa, 0x15, 0xa1, 0x29, 0x84, 0x08, 0x83, 0xe9, + 0xe3, 0xfa, 0x87, 0x3e, 0xae, 0x5e, 0x47, 0x1f, 0x5e, 0x87, 0x1f, 0x25, 0xae, 0xe8, 0xb3, 0xc3, + 0x61, 0xe7, 0xf1, 0x35, 0x04, 0x76, 0x05, 0x90, 0x2f, 0xfb, 0xae, 0x3f, 0xee, 0x63, 0xb8, 0x42, + 0xd9, 0xf4, 0xd0, 0x8c, 0x60, 0x79, 0x2c, 0x68, 0x9e, 0xe4, 0x59, 0xa8, 0x75, 0x53, 0xc5, 0xf4, + 0x33, 0xc2, 0xfb, 0x5b, 0x7d, 0x05, 0x44, 0xb9, 0x1b, 0x4f, 0xab, 0x14, 0xdb, 0x1c, 0x13, 0x67, + 0x33, 0x7d, 0x34, 0x5f, 0x92, 0x83, 0x29, 0x2f, 0xf0, 0x0c, 0xb9, 0x17, 0xc9, 0xc7, 0xf0, 0x34, + 0xe4, 0x6d, 0x73, 0xd7, 0x6a, 0x61, 0xb6, 0xe3, 0xc8, 0xde, 0x86, 0xd8, 0x1d, 0x1b, 0x38, 0x9e, + 0x1f, 0x30, 0x19, 0xb2, 0x89, 0x4d, 0x86, 0x68, 0x83, 0x34, 0x6e, 0x80, 0x7f, 0xa9, 0x70, 0x30, + 0x7b, 0x0e, 0xb3, 0x3a, 0x76, 0x9e, 0x88, 0x63, 0xfc, 0xef, 0x0a, 0xed, 0xbd, 0x0c, 0xa8, 0x49, + 0x32, 0x95, 0xab, 0x0d, 0x61, 0xa8, 0x5e, 0x0b, 0x57, 0x7b, 0x39, 0x98, 0x85, 0x4a, 0x2c, 0xd2, + 0x0d, 0x75, 0xb5, 0x20, 0xa3, 0x17, 0x64, 0xa1, 0x40, 0x59, 0xab, 0xf9, 0xc6, 0x1a, 0x7a, 0x65, + 0xe6, 0xa8, 0x2d, 0xd2, 0xe8, 0x29, 0xe6, 0xc7, 0x25, 0xd1, 0x80, 0xb9, 0x9c, 0xe0, 0x83, 0xda, + 0x45, 0x68, 0xd2, 0x10, 0xcd, 0x2c, 0x46, 0xf9, 0xd0, 0xaf, 0x66, 0x44, 0xe2, 0xef, 0x8a, 0xb1, + 0x38, 0x86, 0x60, 0x49, 0x59, 0x2f, 0x7e, 0xd8, 0x92, 0x65, 0xee, 0x6c, 0x58, 0x1d, 0xf4, 0x7f, + 0x0a, 0x85, 0x37, 0x8f, 0x30, 0xff, 0xa5, 0x68, 0xf3, 0x9f, 0x2c, 0x19, 0x77, 0x82, 0xbd, 0xaa, + 0xce, 0x10, 0xc3, 0xb7, 0x72, 0x13, 0xcc, 0x69, 0xed, 0xf6, 0xba, 0xb6, 0x85, 0x4b, 0xee, 0xbc, + 0xda, 0x70, 0x58, 0x6c, 0xa1, 0x9e, 0xd4, 0xd8, 0xae, 0x48, 0x7c, 0x1d, 0x94, 0x03, 0x89, 0xc9, + 0x67, 0x2c, 0xc3, 0x9b, 0x3b, 0x24, 0xb4, 0xb6, 0xb5, 0x20, 0xd2, 0x19, 0x7b, 0x13, 0xf4, 0x6c, + 0x12, 0xe0, 0x3b, 0x7d, 0xcd, 0xfa, 0x2d, 0x09, 0x26, 0x5c, 0x79, 0x17, 0xdb, 0x6d, 0xf4, 0x64, + 0x2e, 0x20, 0x60, 0xa4, 0x6f, 0xd9, 0x8f, 0x0a, 0x3b, 0xf5, 0x79, 0x35, 0xa4, 0xf4, 0x23, 0x30, + 0x09, 0x84, 0x28, 0x71, 0x42, 0x14, 0xf3, 0xdd, 0x8b, 0x2d, 0x22, 0x7d, 0xf1, 0x7d, 0x44, 0x82, + 0x59, 0x6f, 0x1e, 0xb1, 0x84, 0x9d, 0xd6, 0x36, 0xba, 0x53, 0x74, 0xa1, 0x89, 0xb5, 0x34, 0x7f, + 0x4f, 0xb6, 0x83, 0xbe, 0x99, 0x49, 0xa8, 0xf2, 0x5c, 0xc9, 0x11, 0xab, 0x74, 0x89, 0x74, 0x31, + 0x8e, 0x60, 0xfa, 0xc2, 0x7c, 0x5c, 0x02, 0x68, 0x98, 0xfe, 0x5c, 0xf7, 0x10, 0x92, 0x7c, 0xb9, 0xf0, 0x76, 0x2d, 0xab, 0x78, 0x50, 0x6c, 0xf2, 0x9e, 0x43, 0xd0, 0x35, 0x69, 0x50, 0x49, 0x63, 0x69, 0xeb, 0x53, 0x8b, 0xbb, 0xdd, 0x8e, 0xde, 0xd2, 0x9c, 0x5e, 0x7f, 0xba, 0x68, 0xf1, 0x92, 0x4b, 0x43, 0x13, 0x19, 0x85, 0x7e, 0x19, 0x11, 0xb2, 0xa4, 0xa1, 0x67, 0x24, 0x2f, 0xf4, 0x8c, - 0xa0, 0x8f, 0xcc, 0x00, 0xe2, 0x63, 0x50, 0x4f, 0x19, 0x8e, 0xd6, 0xba, 0xd8, 0x58, 0xb0, 0xb0, - 0xd6, 0x6e, 0x59, 0xbb, 0x3b, 0xe7, 0xed, 0xb0, 0x33, 0x68, 0xbc, 0x8e, 0x86, 0x96, 0x8e, 0x25, - 0x6e, 0xe9, 0x18, 0xfd, 0x82, 0x2c, 0x1a, 0x08, 0x29, 0xb4, 0xc1, 0x11, 0xe2, 0x61, 0x88, 0xa1, - 0x2e, 0x91, 0x0b, 0x53, 0xcf, 0x2a, 0x71, 0x36, 0xc9, 0x2a, 0xf1, 0x9b, 0x84, 0xc2, 0x2a, 0x09, - 0xd5, 0x6b, 0x2c, 0x9e, 0x68, 0x73, 0x75, 0xec, 0x44, 0xc0, 0x7b, 0x1d, 0xcc, 0x9e, 0x0f, 0xbe, - 0xf8, 0x10, 0xf3, 0x89, 0x7d, 0xfc, 0x43, 0xdf, 0x9c, 0x74, 0x05, 0x86, 0x67, 0x21, 0x02, 0x5d, - 0x1f, 0x41, 0x49, 0xc4, 0x09, 0x2d, 0xd1, 0x72, 0x4a, 0x6c, 0xf9, 0xe9, 0xa3, 0xf0, 0x11, 0x09, - 0xa6, 0xc9, 0x55, 0xa8, 0x0b, 0x97, 0xc8, 0xb1, 0x48, 0x41, 0xa3, 0xe4, 0xf9, 0x61, 0x31, 0x2b, - 0x90, 0xed, 0xe8, 0xc6, 0x05, 0xcf, 0x7b, 0xd0, 0x7d, 0x0e, 0x2e, 0xd6, 0x93, 0xfa, 0x5c, 0xac, - 0xe7, 0xef, 0x53, 0xf8, 0xe5, 0x1e, 0xe8, 0xa6, 0xe7, 0x81, 0xe4, 0xd2, 0x17, 0xe3, 0xdf, 0x65, - 0x21, 0x5f, 0xc7, 0x9a, 0xd5, 0xda, 0x46, 0xef, 0x91, 0xfa, 0x4e, 0x15, 0x26, 0xf9, 0xa9, 0xc2, - 0x12, 0x4c, 0x6c, 0xea, 0x1d, 0x07, 0x5b, 0xd4, 0xa3, 0x3a, 0xdc, 0xb5, 0xd3, 0x26, 0xbe, 0xd0, - 0x31, 0x5b, 0x17, 0xe6, 0x99, 0xe9, 0x3e, 0xef, 0x05, 0x62, 0x9d, 0x5f, 0x22, 0x3f, 0xa9, 0xde, - 0xcf, 0xae, 0x41, 0x68, 0x9b, 0x96, 0x13, 0x75, 0xc7, 0x46, 0x04, 0x95, 0xba, 0x69, 0x39, 0x2a, - 0xfd, 0xd1, 0x85, 0x79, 0x73, 0xb7, 0xd3, 0x69, 0xe0, 0x07, 0x1d, 0x6f, 0xda, 0xe6, 0xbd, 0xbb, - 0xc6, 0xa2, 0xb9, 0xb9, 0x69, 0x63, 0xba, 0x68, 0x90, 0x53, 0xd9, 0x9b, 0x72, 0x1c, 0x72, 0x1d, - 0x7d, 0x47, 0xa7, 0x13, 0x8d, 0x9c, 0x4a, 0x5f, 0x94, 0x1b, 0xa1, 0x10, 0xcc, 0x71, 0x28, 0xa3, - 0xa7, 0xf2, 0xa4, 0x69, 0xee, 0x4b, 0x77, 0x75, 0xe6, 0x02, 0xbe, 0x64, 0x9f, 0x9a, 0x20, 0xdf, - 0xc9, 0x33, 0x7f, 0x7c, 0x45, 0x64, 0xbf, 0x83, 0x4a, 0x3c, 0x7a, 0x06, 0x6b, 0xe1, 0x96, 0x69, - 0xb5, 0x3d, 0xd9, 0x44, 0x4f, 0x30, 0x58, 0xbe, 0x64, 0xbb, 0x14, 0x7d, 0x0b, 0x4f, 0x5f, 0xd3, - 0xde, 0x99, 0x77, 0xbb, 0x4d, 0xb7, 0xe8, 0x73, 0xba, 0xb3, 0xbd, 0x86, 0x1d, 0x0d, 0xfd, 0x9d, - 0xdc, 0x57, 0xe3, 0xa6, 0xff, 0x3f, 0x8d, 0x1b, 0xa0, 0x71, 0x34, 0x0c, 0x96, 0xb3, 0x6b, 0x19, - 0xae, 0x1c, 0x99, 0x57, 0x6a, 0x28, 0x45, 0xb9, 0x03, 0xae, 0x08, 0xde, 0xbc, 0xa5, 0xd2, 0x45, - 0x36, 0x6d, 0x9d, 0x22, 0xd9, 0xa3, 0x33, 0x28, 0xeb, 0x70, 0x2d, 0xfd, 0xb8, 0xd2, 0x58, 0x5b, - 0x5d, 0xd1, 0xb7, 0xb6, 0x3b, 0xfa, 0xd6, 0xb6, 0x63, 0x57, 0x0c, 0xdb, 0xc1, 0x5a, 0xbb, 0xb6, - 0xa9, 0xd2, 0xdb, 0x71, 0x80, 0xd0, 0x11, 0xc9, 0xca, 0x7b, 0x5c, 0x8b, 0x8d, 0x6e, 0x61, 0x4d, - 0x89, 0x68, 0x29, 0x4f, 0x71, 0x5b, 0x8a, 0xbd, 0xdb, 0xf1, 0x31, 0xbd, 0xaa, 0x07, 0xd3, 0x40, - 0xd5, 0x77, 0x3b, 0xa4, 0xb9, 0x90, 0xcc, 0x49, 0xc7, 0xb9, 0x18, 0x4e, 0xd2, 0x6f, 0x36, 0xff, - 0x4f, 0x1e, 0x72, 0xcb, 0x96, 0xd6, 0xdd, 0x46, 0xcf, 0x0a, 0xf5, 0xcf, 0xa3, 0x6a, 0x13, 0xbe, - 0x76, 0x4a, 0x83, 0xb4, 0x53, 0x1e, 0xa0, 0x9d, 0xd9, 0x90, 0x76, 0x46, 0x2f, 0x2a, 0x9f, 0x81, - 0x99, 0x96, 0xd9, 0xe9, 0xe0, 0x96, 0x2b, 0x8f, 0x4a, 0x9b, 0xac, 0xe6, 0x4c, 0xa9, 0x5c, 0x1a, - 0x09, 0x56, 0x8d, 0x9d, 0x3a, 0x5d, 0x43, 0xa7, 0x4a, 0x1f, 0x24, 0xa0, 0x97, 0x48, 0x90, 0x2d, - 0xb7, 0xb7, 0x30, 0xb7, 0xce, 0x9e, 0x09, 0xad, 0xb3, 0x9f, 0x84, 0xbc, 0xa3, 0x59, 0x5b, 0xd8, - 0xf1, 0xd6, 0x09, 0xe8, 0x9b, 0x1f, 0x43, 0x5b, 0x0e, 0xc5, 0xd0, 0xfe, 0x71, 0xc8, 0xba, 0x32, - 0x63, 0x4e, 0xe6, 0xd7, 0xf6, 0x83, 0x9f, 0xc8, 0x7e, 0xde, 0x2d, 0x71, 0xde, 0xad, 0xb5, 0x4a, - 0x7e, 0xe8, 0xc5, 0x3a, 0xb7, 0x0f, 0x6b, 0x72, 0xd1, 0x67, 0xcb, 0x34, 0x2a, 0x3b, 0xda, 0x16, - 0x66, 0xd5, 0x0c, 0x12, 0xbc, 0xaf, 0xe5, 0x1d, 0xf3, 0x01, 0x9d, 0x45, 0x8b, 0x0c, 0x12, 0xdc, - 0x2a, 0x6c, 0xeb, 0xed, 0x36, 0x36, 0x58, 0xcb, 0x66, 0x6f, 0x67, 0x4e, 0x43, 0xd6, 0xe5, 0xc1, - 0xd5, 0x1f, 0xd7, 0x58, 0x28, 0x1c, 0x51, 0x66, 0xdc, 0x66, 0x45, 0x1b, 0x6f, 0x21, 0xc3, 0xaf, - 0xa9, 0x8a, 0xb8, 0xed, 0xd0, 0xca, 0xf5, 0x6f, 0x5c, 0x4f, 0x80, 0x9c, 0x61, 0xb6, 0xf1, 0xc0, - 0x41, 0x88, 0xe6, 0x52, 0x9e, 0x0c, 0x39, 0xdc, 0x76, 0x7b, 0x05, 0x99, 0x64, 0x3f, 0x1d, 0x2f, - 0x4b, 0x95, 0x66, 0x4e, 0xe6, 0x1b, 0xd4, 0x8f, 0xdb, 0xf4, 0x1b, 0xe0, 0x2f, 0x4d, 0xc0, 0x51, - 0xda, 0x07, 0xd4, 0x77, 0xcf, 0xbb, 0xa4, 0xce, 0x63, 0xf4, 0x70, 0xff, 0x81, 0xeb, 0x28, 0xaf, - 0xec, 0xc7, 0x21, 0x67, 0xef, 0x9e, 0xf7, 0x8d, 0x50, 0xfa, 0x12, 0x6e, 0xba, 0xd2, 0x48, 0x86, - 0x33, 0x79, 0xd8, 0xe1, 0x8c, 0x1b, 0x9a, 0x64, 0xaf, 0xf1, 0x07, 0x03, 0x19, 0x3d, 0x1e, 0xe1, - 0x0d, 0x64, 0xfd, 0x86, 0xa1, 0x53, 0x30, 0xa1, 0x6d, 0x3a, 0xd8, 0x0a, 0xcc, 0x44, 0xf6, 0xea, - 0x0e, 0x95, 0xe7, 0xf1, 0xa6, 0x69, 0xb9, 0x62, 0xa1, 0x21, 0xd4, 0xfd, 0xf7, 0x50, 0xcb, 0x05, - 0x6e, 0x87, 0xec, 0x26, 0x38, 0x66, 0x98, 0x8b, 0xb8, 0xcb, 0xe4, 0x4c, 0x51, 0x9c, 0x25, 0x2d, - 0x60, 0xff, 0x87, 0x7d, 0x5d, 0xc9, 0xdc, 0xfe, 0xae, 0x04, 0x7d, 0x26, 0xe9, 0x9c, 0xb9, 0x07, - 0xe8, 0x91, 0x59, 0x68, 0xca, 0xd3, 0x60, 0xa6, 0xcd, 0x5c, 0xb4, 0x5a, 0xba, 0xdf, 0x4a, 0x22, - 0xff, 0xe3, 0x32, 0x07, 0x8a, 0x94, 0x0d, 0x2b, 0xd2, 0x32, 0x4c, 0x92, 0x83, 0xcc, 0xae, 0x26, - 0xe5, 0x7a, 0x5c, 0xe2, 0xc9, 0xb4, 0xce, 0xaf, 0x54, 0x48, 0x6c, 0xf3, 0x25, 0xf6, 0x8b, 0xea, - 0xff, 0x9c, 0x6c, 0xf6, 0x1d, 0x2f, 0xa1, 0xf4, 0x9b, 0xe3, 0x6f, 0xe7, 0xe1, 0x8a, 0x92, 0x65, - 0xda, 0x36, 0x39, 0x03, 0xd3, 0xdb, 0x30, 0xdf, 0x20, 0x71, 0xb7, 0x69, 0x3c, 0xaa, 0x9b, 0x5f, - 0xbf, 0x06, 0x35, 0xbe, 0xa6, 0xf1, 0x35, 0xe1, 0x10, 0x30, 0xfe, 0xfe, 0x43, 0x84, 0xd0, 0x7f, - 0x38, 0x1a, 0xc9, 0x3b, 0x33, 0x22, 0x51, 0x69, 0x12, 0xca, 0x2a, 0xfd, 0xe6, 0xf2, 0x25, 0x09, - 0xae, 0xec, 0xe5, 0x66, 0xc3, 0xb0, 0xfd, 0x06, 0x73, 0xf5, 0x80, 0xf6, 0xc2, 0x47, 0x31, 0x89, - 0xbd, 0xc7, 0x32, 0xa2, 0xee, 0xa1, 0xd2, 0x22, 0x16, 0x4b, 0x82, 0x13, 0x35, 0x71, 0xf7, 0x58, - 0x26, 0x26, 0x9f, 0xbe, 0x70, 0x3f, 0x9b, 0x85, 0xa3, 0xcb, 0x96, 0xb9, 0xdb, 0xb5, 0x83, 0x1e, - 0xe8, 0xaf, 0xfb, 0x6f, 0xb8, 0xe6, 0x45, 0x4c, 0x83, 0x6b, 0x60, 0xda, 0x62, 0xd6, 0x5c, 0xb0, - 0xfd, 0x1a, 0x4e, 0x0a, 0xf7, 0x5e, 0xf2, 0x41, 0x7a, 0xaf, 0xa0, 0x9f, 0xc9, 0x72, 0xfd, 0x4c, - 0x6f, 0xcf, 0x91, 0xeb, 0xd3, 0x73, 0xfc, 0x95, 0x94, 0x70, 0x50, 0xed, 0x11, 0x51, 0x44, 0x7f, - 0x51, 0x82, 0xfc, 0x16, 0xc9, 0xc8, 0xba, 0x8b, 0xc7, 0x8b, 0xd5, 0x8c, 0x10, 0x57, 0xd9, 0xaf, - 0x81, 0x5c, 0xe5, 0xb0, 0x0e, 0x27, 0x1a, 0xe0, 0xe2, 0xb9, 0x4d, 0x5f, 0xa9, 0x5e, 0x93, 0x85, - 0x19, 0xbf, 0xf4, 0x4a, 0xdb, 0x46, 0xcf, 0xef, 0xaf, 0x51, 0xb3, 0x22, 0x1a, 0xb5, 0x6f, 0x9d, - 0xd9, 0x1f, 0x75, 0xe4, 0xd0, 0xa8, 0xd3, 0x77, 0x74, 0x99, 0x89, 0x18, 0x5d, 0xd0, 0x33, 0x65, - 0xd1, 0xfb, 0xa8, 0xf8, 0xae, 0x95, 0xd4, 0xe6, 0xd1, 0x3c, 0x58, 0x08, 0xde, 0x8a, 0x35, 0xb8, - 0x56, 0xe9, 0x2b, 0xc9, 0xfb, 0x25, 0x38, 0xb6, 0xbf, 0x33, 0xff, 0x11, 0xde, 0x0b, 0xcd, 0xad, - 0x93, 0xed, 0x7b, 0xa1, 0x91, 0x37, 0x7e, 0x93, 0x2e, 0x36, 0xa4, 0x08, 0x67, 0xef, 0x0d, 0xee, - 0xc4, 0xc5, 0x82, 0x86, 0x08, 0x12, 0x4d, 0x5f, 0x80, 0xbf, 0x2a, 0xc3, 0x54, 0x1d, 0x3b, 0xab, - 0xda, 0x25, 0x73, 0xd7, 0x41, 0x9a, 0xe8, 0xf6, 0xdc, 0x53, 0x21, 0xdf, 0x21, 0xbf, 0xb0, 0x6b, - 0xfe, 0xaf, 0xe9, 0xbb, 0xbf, 0x45, 0x7c, 0x7f, 0x28, 0x69, 0x95, 0xe5, 0xe7, 0x63, 0xb9, 0x88, - 0xec, 0x8e, 0xfa, 0xdc, 0x8d, 0x64, 0x6b, 0x27, 0xd1, 0xde, 0x69, 0x54, 0xd1, 0xe9, 0xc3, 0xf2, - 0x0b, 0x32, 0xcc, 0xd6, 0xb1, 0x53, 0xb1, 0x97, 0xb4, 0x3d, 0xd3, 0xd2, 0x1d, 0x1c, 0xbe, 0xe7, - 0x33, 0x1e, 0x9a, 0xd3, 0x00, 0xba, 0xff, 0x1b, 0x8b, 0x30, 0x15, 0x4a, 0x41, 0xbf, 0x95, 0xd4, - 0x51, 0x88, 0xe3, 0x63, 0x24, 0x20, 0x24, 0xf2, 0xb1, 0x88, 0x2b, 0x3e, 0x7d, 0x20, 0xbe, 0x28, - 0x31, 0x20, 0x8a, 0x56, 0x6b, 0x5b, 0xdf, 0xc3, 0xed, 0x84, 0x40, 0x78, 0xbf, 0x05, 0x40, 0xf8, - 0x84, 0x12, 0xbb, 0xaf, 0x70, 0x7c, 0x8c, 0xc2, 0x7d, 0x25, 0x8e, 0xe0, 0x58, 0x82, 0x44, 0xb9, - 0x5d, 0x0f, 0x5b, 0xcf, 0xbc, 0x5b, 0x54, 0xac, 0x81, 0xc9, 0x26, 0x85, 0x4d, 0xb6, 0xa1, 0x3a, - 0x16, 0x5a, 0xf6, 0x20, 0x9d, 0xce, 0xa6, 0xd1, 0xb1, 0xf4, 0x2d, 0x3a, 0x7d, 0xa1, 0xbf, 0x5b, - 0x86, 0x13, 0x7e, 0xf4, 0x94, 0x3a, 0x76, 0x16, 0x35, 0x7b, 0xfb, 0xbc, 0xa9, 0x59, 0x6d, 0x54, - 0x1a, 0xc1, 0x89, 0x3f, 0xf4, 0x85, 0x30, 0x08, 0x55, 0x1e, 0x84, 0xbe, 0xae, 0xa2, 0x7d, 0x79, - 0x19, 0x45, 0x27, 0x13, 0xeb, 0xcd, 0xfa, 0x3b, 0x3e, 0x58, 0x3f, 0xc1, 0x81, 0x75, 0xe7, 0xb0, - 0x2c, 0xa6, 0x0f, 0xdc, 0x6f, 0xd0, 0x11, 0x21, 0xe4, 0xd5, 0x7c, 0xbf, 0x28, 0x60, 0x11, 0x5e, - 0xad, 0x72, 0xa4, 0x57, 0xeb, 0x50, 0x63, 0xc4, 0x40, 0x8f, 0xe4, 0x74, 0xc7, 0x88, 0x43, 0xf4, - 0x36, 0x7e, 0xbb, 0x0c, 0x05, 0x12, 0x3e, 0x2b, 0xe4, 0xf1, 0x1d, 0x8e, 0x46, 0x1d, 0x8f, 0xce, - 0x3e, 0xef, 0xf2, 0x89, 0xa4, 0xde, 0xe5, 0xe8, 0x6d, 0x49, 0x7d, 0xc8, 0x7b, 0xb9, 0x1d, 0x09, - 0x62, 0x89, 0x5c, 0xc4, 0x07, 0x70, 0x90, 0x3e, 0x68, 0xff, 0x4d, 0x06, 0x70, 0x1b, 0x34, 0x3b, - 0xfb, 0xf0, 0x74, 0x51, 0xb8, 0x6e, 0x0e, 0xfb, 0xd5, 0xbb, 0x40, 0x9d, 0xe8, 0x01, 0x8a, 0x52, - 0x0c, 0x4e, 0x55, 0x3c, 0x9c, 0xd4, 0xb7, 0x32, 0xe0, 0x6a, 0x24, 0xb0, 0x24, 0xf2, 0xb6, 0x8c, - 0x2c, 0x3b, 0x7d, 0x40, 0xfe, 0x87, 0x04, 0xb9, 0x86, 0x59, 0xc7, 0xce, 0xc1, 0x4d, 0x81, 0xc4, - 0xc7, 0xf6, 0x49, 0xb9, 0xa3, 0x38, 0xb6, 0xdf, 0x8f, 0xd0, 0x18, 0xa2, 0x91, 0x49, 0x30, 0xd3, - 0x30, 0x4b, 0xfe, 0xe2, 0x94, 0xb8, 0xaf, 0xaa, 0xf8, 0x9d, 0xda, 0x7e, 0x05, 0x83, 0x62, 0x0e, - 0x74, 0xa7, 0xf6, 0x60, 0x7a, 0xe9, 0xcb, 0xed, 0x36, 0x38, 0xba, 0x61, 0xb4, 0x4d, 0x15, 0xb7, - 0x4d, 0xb6, 0xd2, 0xad, 0x28, 0x90, 0xdd, 0x35, 0xda, 0x26, 0x61, 0x39, 0xa7, 0x92, 0x67, 0x37, - 0xcd, 0xc2, 0x6d, 0x93, 0xf9, 0x06, 0x90, 0x67, 0xf4, 0x35, 0x19, 0xb2, 0xee, 0xbf, 0xe2, 0xa2, - 0x7e, 0xbb, 0x9c, 0x30, 0x10, 0x81, 0x4b, 0x7e, 0x24, 0x96, 0xd0, 0xdd, 0xa1, 0xb5, 0x7f, 0xea, - 0xc1, 0x7a, 0x6d, 0x54, 0x79, 0x21, 0x51, 0x04, 0x6b, 0xfe, 0xca, 0x29, 0x98, 0x38, 0xdf, 0x31, - 0x5b, 0x17, 0x82, 0xf3, 0xf2, 0xec, 0x55, 0xb9, 0x11, 0x72, 0x96, 0x66, 0x6c, 0x61, 0xb6, 0xa7, - 0x70, 0xbc, 0xa7, 0x2f, 0x24, 0x5e, 0x2f, 0x2a, 0xcd, 0x82, 0xde, 0x96, 0x24, 0x04, 0x42, 0x9f, - 0xca, 0x27, 0xd3, 0x87, 0xc5, 0x21, 0x4e, 0x96, 0x15, 0x60, 0xa6, 0x54, 0xa4, 0xb7, 0xd7, 0xaf, - 0xd5, 0xce, 0x96, 0x0b, 0x32, 0x81, 0xd9, 0x95, 0x49, 0x8a, 0x30, 0xbb, 0xe4, 0x7f, 0x68, 0x61, - 0xee, 0x53, 0xf9, 0xc3, 0x80, 0xf9, 0x93, 0x12, 0xcc, 0xae, 0xea, 0xb6, 0x13, 0xe5, 0xed, 0x1f, - 0x13, 0x3d, 0xf7, 0x05, 0x49, 0x4d, 0x65, 0xae, 0x1c, 0xe1, 0xb0, 0xb9, 0x89, 0xcc, 0xe1, 0xb8, - 0x22, 0xc6, 0x73, 0x2c, 0x85, 0x70, 0x40, 0xef, 0x90, 0x16, 0x96, 0x64, 0x62, 0x43, 0x29, 0x28, - 0x64, 0xfc, 0x86, 0x52, 0x64, 0xd9, 0xe9, 0xcb, 0xf7, 0x6b, 0x12, 0x1c, 0x73, 0x8b, 0x8f, 0x5b, - 0x96, 0x8a, 0x16, 0xf3, 0xc0, 0x65, 0xa9, 0xc4, 0x2b, 0xe3, 0xfb, 0x78, 0x19, 0xc5, 0xca, 0xf8, - 0x20, 0xa2, 0x63, 0x16, 0x73, 0xc4, 0x32, 0xec, 0x20, 0x31, 0xc7, 0x2c, 0xc3, 0x0e, 0x2f, 0xe6, - 0xf8, 0xa5, 0xd8, 0x21, 0xc5, 0x7c, 0x68, 0x0b, 0xac, 0xaf, 0x93, 0x7d, 0x31, 0x47, 0xae, 0x6d, - 0xc4, 0x88, 0x39, 0xf1, 0x89, 0x5d, 0xf4, 0x8e, 0x21, 0x05, 0x3f, 0xe2, 0xf5, 0x8d, 0x61, 0x60, - 0x3a, 0xc4, 0x35, 0x8e, 0x97, 0xca, 0x30, 0xc7, 0xb8, 0xe8, 0x3f, 0x65, 0x8e, 0xc1, 0x28, 0xf1, - 0x94, 0x39, 0xf1, 0x19, 0x20, 0x9e, 0xb3, 0xf1, 0x9f, 0x01, 0x8a, 0x2d, 0x3f, 0x7d, 0x70, 0xbe, - 0x9e, 0x85, 0x93, 0x2e, 0x0b, 0x6b, 0x66, 0x5b, 0xdf, 0xbc, 0x44, 0xb9, 0x38, 0xab, 0x75, 0x76, - 0xb1, 0x8d, 0xde, 0x2b, 0x89, 0xa2, 0xf4, 0x9f, 0x00, 0xcc, 0x2e, 0xb6, 0x68, 0x20, 0x35, 0x06, - 0xd4, 0x1d, 0x51, 0x95, 0xdd, 0x5f, 0x92, 0x7f, 0x99, 0x4c, 0xcd, 0x23, 0xa2, 0x86, 0xe8, 0xb9, - 0x56, 0xe1, 0x94, 0xff, 0xa5, 0xd7, 0xc1, 0x23, 0xb3, 0xdf, 0xc1, 0xe3, 0x06, 0x90, 0xb5, 0x76, - 0xdb, 0x87, 0xaa, 0x77, 0x33, 0x9b, 0x94, 0xa9, 0xba, 0x59, 0xdc, 0x9c, 0x36, 0x0e, 0x8e, 0xe6, - 0x45, 0xe4, 0xb4, 0xb1, 0xa3, 0xcc, 0x43, 0x9e, 0xde, 0x90, 0xed, 0xaf, 0xe8, 0xf7, 0xcf, 0xcc, - 0x72, 0xf1, 0xa6, 0x5d, 0x8d, 0x57, 0xc3, 0xdb, 0x12, 0x49, 0xa6, 0x5f, 0x3f, 0x1d, 0xd8, 0xc9, - 0x2a, 0xa7, 0x60, 0x77, 0x0d, 0x4d, 0x79, 0x3c, 0xbb, 0x61, 0xc5, 0x6e, 0xb7, 0x73, 0xa9, 0xc1, - 0x82, 0xaf, 0x24, 0xda, 0x0d, 0x0b, 0xc5, 0x70, 0x91, 0x7a, 0x63, 0xb8, 0x24, 0xdf, 0x0d, 0xe3, - 0xf8, 0x18, 0xc5, 0x6e, 0x58, 0x1c, 0xc1, 0xf4, 0x45, 0xfb, 0x96, 0x1c, 0xb5, 0x9a, 0x59, 0x6c, - 0xff, 0x4f, 0xf4, 0x3f, 0x84, 0x06, 0xbc, 0xb3, 0x4b, 0xbf, 0xb0, 0xff, 0xb1, 0x77, 0x9a, 0x28, - 0x4f, 0x86, 0xfc, 0xa6, 0x69, 0xed, 0x68, 0xde, 0xc6, 0x7d, 0xef, 0x49, 0x11, 0x16, 0x4f, 0x7f, - 0x89, 0xe4, 0x51, 0x59, 0x5e, 0x77, 0x3e, 0xf2, 0x0c, 0xbd, 0xcb, 0xa2, 0x2e, 0xba, 0x8f, 0xca, - 0x75, 0x30, 0xcb, 0x82, 0x2f, 0x56, 0xb1, 0xed, 0xe0, 0x36, 0x8b, 0x58, 0xc1, 0x27, 0x2a, 0x67, - 0x60, 0x86, 0x25, 0x2c, 0xe9, 0x1d, 0x6c, 0xb3, 0xa0, 0x15, 0x5c, 0x9a, 0x72, 0x12, 0xf2, 0xba, - 0x7d, 0xaf, 0x6d, 0x1a, 0xc4, 0xff, 0x7f, 0x52, 0x65, 0x6f, 0xca, 0x0d, 0x70, 0x94, 0xe5, 0xf3, - 0x8d, 0x55, 0x7a, 0x60, 0xa7, 0x37, 0xd9, 0x55, 0x2d, 0xc3, 0x5c, 0xb7, 0xcc, 0x2d, 0x0b, 0xdb, - 0x36, 0x39, 0x35, 0x35, 0xa9, 0x86, 0x52, 0xd0, 0xe7, 0x86, 0x99, 0x58, 0x24, 0xbe, 0xe7, 0xc0, - 0x45, 0x69, 0xb7, 0xd5, 0xc2, 0xb8, 0xcd, 0x4e, 0x3e, 0x79, 0xaf, 0x09, 0x6f, 0x40, 0x48, 0x3c, - 0x0d, 0x39, 0xa4, 0x2b, 0x10, 0x3e, 0x74, 0x02, 0xf2, 0xf4, 0x3a, 0x31, 0xf4, 0xe2, 0xb9, 0xbe, - 0xca, 0x3a, 0xc7, 0x2b, 0xeb, 0x06, 0xcc, 0x18, 0xa6, 0x5b, 0xdc, 0xba, 0x66, 0x69, 0x3b, 0x76, - 0xdc, 0x2a, 0x23, 0xa5, 0xeb, 0x0f, 0x29, 0xd5, 0xd0, 0x6f, 0x2b, 0x47, 0x54, 0x8e, 0x8c, 0xf2, - 0xff, 0x83, 0xa3, 0xe7, 0x59, 0x84, 0x00, 0x9b, 0x51, 0x96, 0xa2, 0x7d, 0xf0, 0x7a, 0x28, 0x2f, - 0xf0, 0x7f, 0xae, 0x1c, 0x51, 0x7b, 0x89, 0x29, 0x3f, 0x05, 0x73, 0xee, 0x6b, 0xdb, 0xbc, 0xe8, - 0x31, 0x2e, 0x47, 0x1b, 0x22, 0x3d, 0xe4, 0xd7, 0xb8, 0x1f, 0x57, 0x8e, 0xa8, 0x3d, 0xa4, 0x94, - 0x1a, 0xc0, 0xb6, 0xb3, 0xd3, 0x61, 0x84, 0xb3, 0xd1, 0x2a, 0xd9, 0x43, 0x78, 0xc5, 0xff, 0x69, - 0xe5, 0x88, 0x1a, 0x22, 0xa1, 0xac, 0xc2, 0x94, 0xf3, 0xa0, 0xc3, 0xe8, 0xe5, 0xa2, 0x37, 0xbf, - 0x7b, 0xe8, 0x35, 0xbc, 0x7f, 0x56, 0x8e, 0xa8, 0x01, 0x01, 0xa5, 0x02, 0x93, 0xdd, 0xf3, 0x8c, - 0x58, 0xbe, 0x4f, 0xb4, 0xf9, 0xfe, 0xc4, 0xd6, 0xcf, 0xfb, 0xb4, 0xfc, 0xdf, 0x5d, 0xc6, 0x5a, - 0xf6, 0x1e, 0xa3, 0x35, 0x21, 0xcc, 0x58, 0xc9, 0xfb, 0xc7, 0x65, 0xcc, 0x27, 0xa0, 0x54, 0x60, - 0xca, 0x36, 0xb4, 0xae, 0xbd, 0x6d, 0x3a, 0xf6, 0xa9, 0xc9, 0x1e, 0x3f, 0xc9, 0x68, 0x6a, 0x75, - 0xf6, 0x8f, 0x1a, 0xfc, 0xad, 0x3c, 0x19, 0x4e, 0xec, 0x92, 0xeb, 0xf3, 0xcb, 0x0f, 0xea, 0xb6, - 0xa3, 0x1b, 0x5b, 0x5e, 0x8c, 0x59, 0xda, 0xdb, 0xf4, 0xff, 0xa8, 0xcc, 0xb3, 0x13, 0x53, 0x40, - 0xda, 0x26, 0xea, 0xdd, 0xac, 0xa3, 0xc5, 0x86, 0x0e, 0x4a, 0x3d, 0x0d, 0xb2, 0xee, 0x27, 0xd2, - 0x3b, 0xcd, 0xf5, 0x5f, 0x08, 0xec, 0xd5, 0x1d, 0xd2, 0x80, 0xdd, 0x9f, 0x7a, 0x3a, 0xb8, 0x99, - 0xde, 0x0e, 0xce, 0x6d, 0xe0, 0xba, 0xbd, 0xa6, 0x6f, 0x51, 0xeb, 0x8a, 0xf9, 0xc3, 0x87, 0x93, - 0xe8, 0x6c, 0xb4, 0x8a, 0x2f, 0xd2, 0x1b, 0x34, 0x8e, 0x7a, 0xb3, 0x51, 0x2f, 0x05, 0x5d, 0x0f, - 0x33, 0xe1, 0x46, 0x46, 0xef, 0x24, 0xd5, 0x03, 0xdb, 0x8c, 0xbd, 0xa1, 0xeb, 0x60, 0x8e, 0xd7, - 0xe9, 0xd0, 0x10, 0x24, 0x7b, 0x5d, 0x21, 0xba, 0x16, 0x8e, 0xf6, 0x34, 0x2c, 0x2f, 0xe6, 0x48, - 0x26, 0x88, 0x39, 0x72, 0x0d, 0x40, 0xa0, 0xc5, 0x7d, 0xc9, 0x5c, 0x0d, 0x53, 0xbe, 0x5e, 0xf6, - 0xcd, 0xf0, 0x95, 0x0c, 0x4c, 0x7a, 0xca, 0xd6, 0x2f, 0x83, 0x3b, 0xfe, 0x18, 0xa1, 0x0d, 0x06, - 0x36, 0x0d, 0xe7, 0xd2, 0xdc, 0x71, 0x26, 0x70, 0xeb, 0x6d, 0xe8, 0x4e, 0xc7, 0x3b, 0x1a, 0xd7, - 0x9b, 0xac, 0xac, 0x03, 0xe8, 0x04, 0xa3, 0x46, 0x70, 0x56, 0xee, 0x96, 0x04, 0xed, 0x81, 0xea, - 0x43, 0x88, 0xc6, 0x99, 0x1f, 0x61, 0x07, 0xd9, 0xa6, 0x20, 0x47, 0x03, 0xad, 0x1f, 0x51, 0xe6, - 0x00, 0xca, 0x4f, 0x5f, 0x2f, 0xab, 0x95, 0x72, 0xb5, 0x54, 0x2e, 0x64, 0xd0, 0xcb, 0x24, 0x98, - 0xf2, 0x1b, 0x41, 0xdf, 0x4a, 0x96, 0x99, 0x6a, 0x0d, 0xbc, 0xf6, 0x71, 0x7f, 0xa3, 0x0a, 0x2b, - 0xd9, 0x53, 0xe1, 0xf2, 0x5d, 0x1b, 0x2f, 0xe9, 0x96, 0xed, 0xa8, 0xe6, 0xc5, 0x25, 0xd3, 0xf2, - 0xa3, 0x2a, 0xb3, 0x08, 0xa7, 0x51, 0x9f, 0x5d, 0x8b, 0xa3, 0x8d, 0xc9, 0xa1, 0x29, 0x6c, 0xb1, - 0x95, 0xe3, 0x20, 0xc1, 0xa5, 0xeb, 0x58, 0x9a, 0x61, 0x77, 0x4d, 0x1b, 0xab, 0xe6, 0x45, 0xbb, - 0x68, 0xb4, 0x4b, 0x66, 0x67, 0x77, 0xc7, 0xb0, 0x99, 0xcd, 0x10, 0xf5, 0xd9, 0x95, 0x0e, 0xb9, - 0xd4, 0x75, 0x0e, 0xa0, 0x54, 0x5b, 0x5d, 0x2d, 0x97, 0x1a, 0x95, 0x5a, 0xb5, 0x70, 0xc4, 0x95, - 0x56, 0xa3, 0xb8, 0xb0, 0xea, 0x4a, 0xe7, 0xa7, 0x61, 0xd2, 0x6b, 0xd3, 0x2c, 0x4c, 0x4a, 0xc6, - 0x0b, 0x93, 0xa2, 0x14, 0x61, 0xd2, 0x6b, 0xe5, 0x6c, 0x44, 0x78, 0x6c, 0xef, 0xb1, 0xd8, 0x1d, - 0xcd, 0x72, 0x88, 0x3f, 0xb5, 0x47, 0x64, 0x41, 0xb3, 0xb1, 0xea, 0xff, 0x76, 0xe6, 0x09, 0x8c, - 0x03, 0x05, 0xe6, 0x8a, 0xab, 0xab, 0xcd, 0x9a, 0xda, 0xac, 0xd6, 0x1a, 0x2b, 0x95, 0xea, 0x32, - 0x1d, 0x21, 0x2b, 0xcb, 0xd5, 0x9a, 0x5a, 0xa6, 0x03, 0x64, 0xbd, 0x90, 0xa1, 0x97, 0x0a, 0x2f, - 0x4c, 0x42, 0xbe, 0x4b, 0xa4, 0x8b, 0xbe, 0x24, 0x27, 0x3c, 0x0f, 0xef, 0xe3, 0x14, 0x71, 0xed, - 0x29, 0xe7, 0x93, 0x2e, 0xf5, 0x39, 0x33, 0x7a, 0x06, 0x66, 0xa8, 0xad, 0x67, 0x93, 0xe5, 0x7d, - 0x82, 0x9c, 0xac, 0x72, 0x69, 0xe8, 0x23, 0x52, 0x82, 0x43, 0xf2, 0x7d, 0x39, 0x4a, 0x66, 0x5c, - 0xfc, 0x59, 0x66, 0xb8, 0x6b, 0x09, 0x2a, 0xd5, 0x46, 0x59, 0xad, 0x16, 0x57, 0x59, 0x16, 0x59, - 0x39, 0x05, 0xc7, 0xab, 0x35, 0x16, 0xf3, 0xaf, 0xde, 0x6c, 0xd4, 0x9a, 0x95, 0xb5, 0xf5, 0x9a, - 0xda, 0x28, 0xe4, 0x94, 0x93, 0xa0, 0xd0, 0xe7, 0x66, 0xa5, 0xde, 0x2c, 0x15, 0xab, 0xa5, 0xf2, - 0x6a, 0x79, 0xb1, 0x90, 0x57, 0x1e, 0x07, 0xd7, 0xd2, 0x6b, 0x6e, 0x6a, 0x4b, 0x4d, 0xb5, 0x76, - 0xae, 0xee, 0x22, 0xa8, 0x96, 0x57, 0x8b, 0xae, 0x22, 0x85, 0x2e, 0x17, 0x9e, 0x50, 0x2e, 0x83, - 0xa3, 0xe4, 0xe6, 0xf1, 0xd5, 0x5a, 0x71, 0x91, 0x95, 0x37, 0xa9, 0x5c, 0x05, 0xa7, 0x2a, 0xd5, - 0xfa, 0xc6, 0xd2, 0x52, 0xa5, 0x54, 0x29, 0x57, 0x1b, 0xcd, 0xf5, 0xb2, 0xba, 0x56, 0xa9, 0xd7, - 0xdd, 0x7f, 0x0b, 0x53, 0xe4, 0xea, 0x56, 0xda, 0x67, 0xa2, 0xf7, 0xc8, 0x30, 0x7b, 0x56, 0xeb, - 0xe8, 0xee, 0x40, 0x41, 0xee, 0x74, 0xee, 0x39, 0x4e, 0xe2, 0x90, 0xbb, 0x9f, 0x99, 0x43, 0x3a, - 0x79, 0x41, 0x3f, 0x2f, 0x27, 0x3c, 0x4e, 0xc2, 0x80, 0xa0, 0x25, 0xce, 0x73, 0xa5, 0x45, 0x4c, - 0x7e, 0x5e, 0x2d, 0x25, 0x38, 0x4e, 0x22, 0x4e, 0x3e, 0x19, 0xf8, 0xbf, 0x39, 0x2a, 0xf0, 0x0b, - 0x30, 0xb3, 0x51, 0x2d, 0x6e, 0x34, 0x56, 0x6a, 0x6a, 0xe5, 0x27, 0x49, 0x34, 0xf2, 0x59, 0x98, - 0x5a, 0xaa, 0xa9, 0x0b, 0x95, 0xc5, 0xc5, 0x72, 0xb5, 0x90, 0x53, 0x2e, 0x87, 0xcb, 0xea, 0x65, - 0xf5, 0x6c, 0xa5, 0x54, 0x6e, 0x6e, 0x54, 0x8b, 0x67, 0x8b, 0x95, 0x55, 0xd2, 0x47, 0xe4, 0x63, - 0xee, 0xa3, 0x9e, 0x40, 0x3f, 0x9b, 0x05, 0xa0, 0x55, 0x27, 0x97, 0xf1, 0x84, 0x6e, 0x2d, 0xfe, - 0xf3, 0xa4, 0x93, 0x86, 0x80, 0x4c, 0x44, 0xfb, 0xad, 0xc0, 0xa4, 0xc5, 0x3e, 0xb0, 0xe5, 0x95, - 0x41, 0x74, 0xe8, 0xa3, 0x47, 0x4d, 0xf5, 0x7f, 0x47, 0xef, 0x4d, 0x32, 0x47, 0x88, 0x64, 0x2c, - 0x19, 0x92, 0x4b, 0xa3, 0x01, 0x12, 0x3d, 0x3f, 0x03, 0x73, 0x7c, 0xc5, 0xdc, 0x4a, 0x10, 0x63, - 0x4a, 0xac, 0x12, 0xfc, 0xcf, 0x21, 0x23, 0xeb, 0xcc, 0x93, 0xd8, 0x70, 0x0a, 0x5e, 0xcb, 0xa4, - 0x27, 0xc3, 0x3d, 0x8b, 0xa5, 0x90, 0x71, 0x99, 0x77, 0x8d, 0x8e, 0x82, 0xa4, 0x4c, 0x80, 0xdc, - 0x78, 0xd0, 0x29, 0xc8, 0xe8, 0x2b, 0x32, 0xcc, 0x72, 0xd7, 0x22, 0xa3, 0x57, 0x67, 0x44, 0xae, - 0x2c, 0x0d, 0x5d, 0xb8, 0x9c, 0x39, 0xe8, 0x85, 0xcb, 0x67, 0x6e, 0x86, 0x09, 0x96, 0x46, 0xe4, - 0x5b, 0xab, 0xba, 0xa6, 0xc0, 0x51, 0x98, 0x5e, 0x2e, 0x37, 0x9a, 0xf5, 0x46, 0x51, 0x6d, 0x94, - 0x17, 0x0b, 0x19, 0x77, 0xe0, 0x2b, 0xaf, 0xad, 0x37, 0xee, 0x2f, 0x48, 0xc9, 0x3d, 0xf4, 0x7a, - 0x19, 0x19, 0xb3, 0x87, 0x5e, 0x5c, 0xf1, 0xe9, 0xcf, 0x55, 0x3f, 0x23, 0x43, 0x81, 0x72, 0x50, - 0x7e, 0xb0, 0x8b, 0x2d, 0x1d, 0x1b, 0x2d, 0x8c, 0x2e, 0x88, 0x44, 0x04, 0xdd, 0x17, 0x2b, 0x8f, - 0xf4, 0xe7, 0x21, 0x2b, 0x91, 0xbe, 0xf4, 0x18, 0xd8, 0xd9, 0x7d, 0x06, 0xf6, 0xa7, 0x93, 0xba, - 0xe8, 0xf5, 0xb2, 0x3b, 0x12, 0xc8, 0x3e, 0x9e, 0xc4, 0x45, 0x6f, 0x00, 0x07, 0x63, 0x09, 0xf4, - 0x1b, 0x31, 0xfe, 0x16, 0x64, 0xf4, 0x3c, 0x19, 0x8e, 0x2e, 0x6a, 0x0e, 0x5e, 0xb8, 0xd4, 0xf0, - 0xae, 0x2d, 0x8c, 0xb8, 0x6a, 0x38, 0xb3, 0xef, 0xaa, 0xe1, 0xe0, 0xe6, 0x43, 0xa9, 0xe7, 0xe6, - 0x43, 0xf4, 0xce, 0xa4, 0x87, 0xfa, 0x7a, 0x78, 0x18, 0x59, 0x34, 0xde, 0x64, 0x87, 0xf5, 0xe2, - 0xb9, 0x18, 0xc3, 0xcd, 0xff, 0x53, 0x50, 0xa0, 0xac, 0x84, 0xbc, 0xd0, 0x7e, 0x95, 0xdd, 0xce, - 0xdd, 0x4c, 0x10, 0xf4, 0xcf, 0x0b, 0xa3, 0x20, 0xf1, 0x61, 0x14, 0xb8, 0x45, 0x4d, 0xb9, 0xd7, - 0x73, 0x20, 0x69, 0x67, 0x18, 0x72, 0x39, 0x8b, 0x8e, 0xb3, 0x9a, 0x5e, 0x67, 0x18, 0x5b, 0xfc, - 0x78, 0x6e, 0x90, 0x65, 0xf7, 0x3c, 0x96, 0x45, 0x91, 0x89, 0xbf, 0x28, 0x3b, 0xa9, 0xff, 0x31, - 0xe7, 0xf2, 0x17, 0x73, 0x7b, 0x74, 0x7a, 0xfe, 0xc7, 0x83, 0x38, 0x48, 0x1f, 0x85, 0xef, 0x4b, - 0x90, 0xad, 0x9b, 0x96, 0x33, 0x2a, 0x0c, 0x92, 0xee, 0x99, 0x86, 0x24, 0x50, 0x8f, 0x9e, 0x73, - 0xa6, 0xb7, 0x67, 0x1a, 0x5f, 0xfe, 0x18, 0xe2, 0x26, 0x1e, 0x85, 0x39, 0xca, 0x89, 0x7f, 0xa9, - 0xc8, 0xf7, 0x24, 0xda, 0x5f, 0xdd, 0x27, 0x8a, 0xc8, 0x19, 0x98, 0x09, 0xed, 0x59, 0x7a, 0xa0, - 0x70, 0x69, 0xe8, 0x0d, 0x61, 0x5c, 0x16, 0x79, 0x5c, 0xfa, 0xcd, 0xb8, 0xfd, 0x7b, 0x39, 0x46, - 0xd5, 0x33, 0x25, 0x09, 0xc1, 0x18, 0x53, 0x78, 0xfa, 0x88, 0x3c, 0x24, 0x43, 0x9e, 0xf9, 0x8c, - 0x8d, 0x14, 0x81, 0xa4, 0x2d, 0xc3, 0x17, 0x82, 0x98, 0x6f, 0x99, 0x3c, 0xea, 0x96, 0x11, 0x5f, - 0x7e, 0xfa, 0x38, 0xfc, 0x3b, 0x73, 0x86, 0x2c, 0xee, 0x69, 0x7a, 0x47, 0x3b, 0xdf, 0x49, 0x10, - 0xfa, 0xf8, 0x23, 0x09, 0x8f, 0x7f, 0xf9, 0x55, 0xe5, 0xca, 0x8b, 0x90, 0xf8, 0x8f, 0xc1, 0x94, - 0xe5, 0x2f, 0x49, 0x7a, 0xa7, 0xe3, 0x7b, 0x1c, 0x51, 0xd9, 0x77, 0x35, 0xc8, 0x99, 0xe8, 0xac, - 0x97, 0x10, 0x3f, 0x63, 0x39, 0x9b, 0x32, 0x5d, 0x6c, 0xb7, 0x97, 0xb0, 0xe6, 0xec, 0x5a, 0xb8, - 0x9d, 0x68, 0x88, 0xe0, 0x45, 0x34, 0x15, 0x96, 0x04, 0x17, 0x7c, 0x70, 0x95, 0x47, 0xe7, 0x29, - 0x03, 0x7a, 0x03, 0x8f, 0x97, 0x91, 0x74, 0x49, 0x6f, 0xf1, 0x21, 0xa9, 0x71, 0x90, 0x3c, 0x6d, - 0x38, 0x26, 0xd2, 0x07, 0xe4, 0xd7, 0x65, 0x98, 0xa3, 0x76, 0xc2, 0xa8, 0x31, 0xf9, 0xfd, 0x84, - 0x3e, 0x26, 0xa1, 0x6b, 0x9b, 0xc2, 0xec, 0x8c, 0x04, 0x96, 0x24, 0x1e, 0x29, 0x62, 0x7c, 0xa4, - 0x8f, 0xcc, 0xe7, 0xf2, 0x00, 0x21, 0xbf, 0xc1, 0x8f, 0xe4, 0x83, 0x40, 0x80, 0xe8, 0x6d, 0x6c, - 0xfe, 0x51, 0xe7, 0xa2, 0x52, 0x87, 0x7c, 0x02, 0xfd, 0x0d, 0x29, 0x3e, 0x51, 0x68, 0x54, 0xf9, - 0xb3, 0x84, 0x36, 0x2f, 0xf3, 0xda, 0x1b, 0x38, 0xb8, 0x0f, 0xd9, 0xcb, 0x7d, 0x34, 0x81, 0xf1, - 0x3b, 0x88, 0x95, 0x64, 0xa8, 0xad, 0x0e, 0x31, 0xb3, 0x3f, 0x05, 0xc7, 0xd5, 0x72, 0x71, 0xb1, - 0x56, 0x5d, 0xbd, 0x3f, 0x7c, 0x87, 0x4f, 0x41, 0x0e, 0x4f, 0x4e, 0x52, 0x81, 0xed, 0xb5, 0x09, - 0xfb, 0x40, 0x5e, 0x56, 0xb1, 0x37, 0xd4, 0x7f, 0x3c, 0x41, 0xaf, 0x26, 0x40, 0xf6, 0x30, 0x51, - 0x78, 0x08, 0x42, 0xcd, 0xe8, 0xb9, 0x32, 0x14, 0xdc, 0xf1, 0x90, 0x72, 0xc9, 0x2e, 0x6b, 0xab, - 0xf1, 0x6e, 0x85, 0x5d, 0xba, 0xff, 0x14, 0xb8, 0x15, 0x7a, 0x09, 0xca, 0xf5, 0x30, 0xd7, 0xda, - 0xc6, 0xad, 0x0b, 0x15, 0xc3, 0xdb, 0x57, 0xa7, 0x9b, 0xb0, 0x3d, 0xa9, 0x3c, 0x30, 0xf7, 0xf1, - 0xc0, 0xf0, 0x93, 0x68, 0x6e, 0x90, 0x0e, 0x33, 0x15, 0x81, 0xcb, 0x27, 0x7c, 0x5c, 0xaa, 0x1c, - 0x2e, 0xb7, 0x0f, 0x45, 0x35, 0x19, 0x2c, 0xd5, 0x21, 0x60, 0x41, 0x70, 0xb2, 0xb6, 0xde, 0xa8, - 0xd4, 0xaa, 0xcd, 0x8d, 0x7a, 0x79, 0xb1, 0xb9, 0xe0, 0x81, 0x53, 0x2f, 0xc8, 0xe8, 0x1b, 0x12, - 0x4c, 0x50, 0xb6, 0x6c, 0xf4, 0xf8, 0x00, 0x82, 0x81, 0xfe, 0x94, 0xe8, 0xad, 0xc2, 0xd1, 0x11, - 0x7c, 0x41, 0xb0, 0x72, 0x22, 0xfa, 0xa9, 0xa7, 0xc2, 0x04, 0x05, 0xd9, 0x5b, 0xd1, 0x3a, 0x1d, - 0xd1, 0x4b, 0x31, 0x32, 0xaa, 0x97, 0x5d, 0x30, 0x52, 0xc2, 0x00, 0x36, 0xd2, 0x1f, 0x59, 0x9e, - 0x99, 0xa5, 0x66, 0xf0, 0x39, 0xdd, 0xd9, 0x26, 0xee, 0x96, 0xe8, 0x27, 0x44, 0x96, 0x17, 0x6f, - 0x82, 0xdc, 0x9e, 0x9b, 0x7b, 0x80, 0xeb, 0x2a, 0xcd, 0x84, 0x7e, 0x53, 0x38, 0x30, 0x27, 0xa7, - 0x9f, 0x3e, 0x4f, 0x11, 0xe0, 0xac, 0x41, 0xb6, 0xa3, 0xdb, 0x0e, 0x1b, 0x3f, 0x6e, 0x4b, 0x44, - 0xc8, 0x7b, 0xa8, 0x38, 0x78, 0x47, 0x25, 0x64, 0xd0, 0xbd, 0x30, 0x13, 0x4e, 0x15, 0x70, 0xdf, - 0x3d, 0x05, 0x13, 0xec, 0x58, 0x19, 0x5b, 0x62, 0xf5, 0x5e, 0x05, 0x97, 0x35, 0x85, 0x6a, 0x9b, - 0xbe, 0x0e, 0xfc, 0xdf, 0x47, 0x61, 0x62, 0x45, 0xb7, 0x1d, 0xd3, 0xba, 0x84, 0x1e, 0xce, 0xc0, - 0xc4, 0x59, 0x6c, 0xd9, 0xba, 0x69, 0xec, 0x73, 0x35, 0xb8, 0x06, 0xa6, 0xbb, 0x16, 0xde, 0xd3, - 0xcd, 0x5d, 0x3b, 0x58, 0x9c, 0x09, 0x27, 0x29, 0x08, 0x26, 0xb5, 0x5d, 0x67, 0xdb, 0xb4, 0x82, - 0x68, 0x14, 0xde, 0xbb, 0x72, 0x1a, 0x80, 0x3e, 0x57, 0xb5, 0x1d, 0xcc, 0x1c, 0x28, 0x42, 0x29, - 0x8a, 0x02, 0x59, 0x47, 0xdf, 0xc1, 0x2c, 0x3c, 0x2d, 0x79, 0x76, 0x05, 0x4c, 0x42, 0xbd, 0xb1, - 0x90, 0x7a, 0xb2, 0xea, 0xbd, 0xa2, 0x2f, 0xc8, 0x30, 0xbd, 0x8c, 0x1d, 0xc6, 0xaa, 0x8d, 0x5e, - 0x90, 0x11, 0xba, 0x11, 0xc2, 0x1d, 0x63, 0x3b, 0x9a, 0xed, 0xfd, 0xe7, 0x2f, 0xc1, 0xf2, 0x89, - 0x41, 0xac, 0x5c, 0x39, 0x1c, 0x28, 0x9b, 0x04, 0x4e, 0x73, 0x2a, 0xd4, 0x2f, 0x93, 0x65, 0x66, - 0x9b, 0x20, 0xfb, 0x3f, 0xa0, 0x77, 0x49, 0xa2, 0x87, 0x8e, 0x99, 0xec, 0xe7, 0x43, 0xf5, 0x89, - 0xec, 0x8e, 0x26, 0xf7, 0x58, 0x8e, 0x7d, 0x31, 0xd0, 0xc3, 0x94, 0x18, 0x19, 0xd5, 0xcf, 0x2d, - 0x78, 0x5c, 0x79, 0x30, 0x27, 0xe9, 0x6b, 0xe3, 0x77, 0x64, 0x98, 0xae, 0x6f, 0x9b, 0x17, 0x3d, - 0x39, 0xfe, 0xb4, 0x18, 0xb0, 0x57, 0xc1, 0xd4, 0x5e, 0x0f, 0xa8, 0x41, 0x42, 0xf4, 0x1d, 0xed, - 0xe8, 0x39, 0x72, 0x52, 0x98, 0x42, 0xcc, 0x8d, 0xfc, 0x06, 0x75, 0xe5, 0x29, 0x30, 0xc1, 0xb8, - 0x66, 0x4b, 0x2e, 0xf1, 0x00, 0x7b, 0x99, 0xc3, 0x15, 0xcc, 0xf2, 0x15, 0x4c, 0x86, 0x7c, 0x74, - 0xe5, 0xd2, 0x47, 0xfe, 0x8f, 0x25, 0x12, 0xac, 0xc2, 0x03, 0xbe, 0x34, 0x02, 0xe0, 0xd1, 0x77, - 0x33, 0xa2, 0x0b, 0x93, 0xbe, 0x04, 0x7c, 0x0e, 0x0e, 0x74, 0xdb, 0xcb, 0x40, 0x72, 0xe9, 0xcb, - 0xf3, 0x65, 0x59, 0x98, 0x59, 0xd4, 0x37, 0x37, 0xfd, 0x4e, 0xf2, 0x85, 0x82, 0x9d, 0x64, 0xb4, - 0x3b, 0x80, 0x6b, 0xe7, 0xee, 0x5a, 0x16, 0x36, 0xbc, 0x4a, 0xb1, 0xe6, 0xd4, 0x93, 0xaa, 0xdc, - 0x00, 0x47, 0xbd, 0x71, 0x21, 0xdc, 0x51, 0x4e, 0xa9, 0xbd, 0xc9, 0xe8, 0xdb, 0xc2, 0xbb, 0x5a, - 0x9e, 0x44, 0xc3, 0x55, 0x8a, 0x68, 0x80, 0x77, 0xc0, 0xec, 0x36, 0xcd, 0x4d, 0xa6, 0xfe, 0x5e, - 0x67, 0x79, 0xb2, 0x27, 0x18, 0xf0, 0x1a, 0xb6, 0x6d, 0x6d, 0x0b, 0xab, 0x7c, 0xe6, 0x9e, 0xe6, - 0x2b, 0x27, 0xb9, 0xda, 0x4a, 0x6c, 0x83, 0x4c, 0xa0, 0x26, 0x63, 0xd0, 0x8e, 0x33, 0x90, 0x5d, - 0xd2, 0x3b, 0x18, 0xfd, 0xa2, 0x04, 0x53, 0x2a, 0x6e, 0x99, 0x46, 0xcb, 0x7d, 0x0b, 0x39, 0x07, - 0xfd, 0x63, 0x46, 0xf4, 0x4a, 0x47, 0x97, 0xce, 0xbc, 0x4f, 0x23, 0xa2, 0xdd, 0x88, 0x5d, 0xdd, - 0x18, 0x4b, 0x6a, 0x0c, 0x17, 0x70, 0xb8, 0x53, 0x8f, 0xcd, 0xcd, 0x8e, 0xa9, 0x71, 0x8b, 0x5f, - 0xbd, 0xa6, 0xd0, 0x8d, 0x50, 0xf0, 0xce, 0x80, 0x98, 0xce, 0xba, 0x6e, 0x18, 0xfe, 0x21, 0xe3, - 0x7d, 0xe9, 0xfc, 0xbe, 0x6d, 0x6c, 0x9c, 0x16, 0x52, 0x77, 0x56, 0x7a, 0x84, 0x66, 0x5f, 0x0f, - 0x73, 0xe7, 0x2f, 0x39, 0xd8, 0x66, 0xb9, 0x58, 0xb1, 0x59, 0xb5, 0x27, 0x35, 0x14, 0x65, 0x39, - 0x2e, 0x9e, 0x4b, 0x4c, 0x81, 0xc9, 0x44, 0xbd, 0x32, 0xc4, 0x0c, 0xf0, 0x38, 0x14, 0xaa, 0xb5, - 0xc5, 0x32, 0xf1, 0x55, 0xf3, 0xbc, 0x7f, 0xb6, 0xd0, 0x8b, 0x64, 0x98, 0x21, 0xce, 0x24, 0x1e, - 0x0a, 0xd7, 0x0a, 0xcc, 0x47, 0xd0, 0x23, 0xc2, 0x7e, 0x6c, 0xa4, 0xca, 0xe1, 0x02, 0xa2, 0x05, - 0xbd, 0xa9, 0x77, 0x7a, 0x05, 0x9d, 0x53, 0x7b, 0x52, 0xfb, 0x00, 0x22, 0xf7, 0x05, 0xe4, 0x77, - 0x85, 0x9c, 0xd9, 0x06, 0x71, 0x77, 0x58, 0xa8, 0xfc, 0x9e, 0x0c, 0xd3, 0xee, 0x24, 0xc5, 0x03, - 0xa5, 0xc6, 0x81, 0x62, 0x1a, 0x9d, 0x4b, 0xc1, 0xb2, 0x88, 0xf7, 0x9a, 0xa8, 0x91, 0xfc, 0xa5, - 0xf0, 0xcc, 0x9d, 0x88, 0x28, 0xc4, 0xcb, 0x98, 0xf0, 0x7b, 0x9f, 0xd0, 0x7c, 0x7e, 0x00, 0x73, - 0x87, 0x05, 0xdf, 0xd7, 0x72, 0x90, 0xdf, 0xe8, 0x12, 0xe4, 0x7e, 0x53, 0x16, 0x89, 0x58, 0xbe, - 0xef, 0x20, 0x83, 0x6b, 0x66, 0x75, 0xcc, 0x96, 0xd6, 0x59, 0x0f, 0x4e, 0x84, 0x05, 0x09, 0xca, - 0xed, 0xcc, 0xb7, 0x91, 0x1e, 0xb7, 0xbb, 0x3e, 0x36, 0x98, 0x37, 0x91, 0x51, 0xe8, 0xd0, 0xc8, - 0x4d, 0x70, 0xac, 0xad, 0xdb, 0xda, 0xf9, 0x0e, 0x2e, 0x1b, 0x2d, 0xeb, 0x12, 0x15, 0x07, 0x9b, - 0x56, 0xed, 0xfb, 0xa0, 0xdc, 0x09, 0x39, 0xdb, 0xb9, 0xd4, 0xa1, 0xf3, 0xc4, 0xf0, 0x19, 0x93, - 0xc8, 0xa2, 0xea, 0x6e, 0x76, 0x95, 0xfe, 0x15, 0x76, 0x51, 0x9a, 0x10, 0xbc, 0xcf, 0xf9, 0x49, - 0x90, 0x37, 0x2d, 0x7d, 0x4b, 0xa7, 0xf7, 0xf3, 0xcc, 0xed, 0x8b, 0x59, 0x47, 0x4d, 0x81, 0x1a, - 0xc9, 0xa2, 0xb2, 0xac, 0xca, 0x53, 0x60, 0x4a, 0xdf, 0xd1, 0xb6, 0xf0, 0x7d, 0xba, 0x41, 0x4f, - 0xf4, 0xcd, 0xdd, 0x7a, 0x6a, 0xdf, 0xf1, 0x19, 0xf6, 0x5d, 0x0d, 0xb2, 0xa2, 0xf7, 0x49, 0xa2, - 0x81, 0x75, 0x48, 0xdd, 0x28, 0xa8, 0x63, 0xb9, 0xd7, 0x1a, 0xbd, 0x52, 0x28, 0xe4, 0x4d, 0x34, - 0x5b, 0xe9, 0x0f, 0xde, 0x9f, 0x97, 0x60, 0x72, 0xd1, 0xbc, 0x68, 0x10, 0x45, 0xbf, 0x4d, 0xcc, - 0xd6, 0xed, 0x73, 0xc8, 0x91, 0xbf, 0x36, 0x32, 0xf6, 0x44, 0x03, 0xa9, 0xad, 0x57, 0x64, 0x04, - 0x0c, 0xb1, 0x2d, 0x47, 0xf0, 0x32, 0xbf, 0xb8, 0x72, 0xd2, 0x97, 0xeb, 0x9f, 0xc8, 0x90, 0x5d, - 0xb4, 0xcc, 0x2e, 0x7a, 0x4b, 0x26, 0x81, 0xcb, 0x42, 0xdb, 0x32, 0xbb, 0x0d, 0x72, 0x1b, 0x57, - 0x70, 0x8c, 0x23, 0x9c, 0xa6, 0xdc, 0x06, 0x93, 0x5d, 0xd3, 0xd6, 0x1d, 0x6f, 0x1a, 0x31, 0x77, - 0xeb, 0x63, 0xfa, 0xb6, 0xe6, 0x75, 0x96, 0x49, 0xf5, 0xb3, 0xbb, 0xbd, 0x36, 0x11, 0xa1, 0x2b, - 0x17, 0x57, 0x8c, 0xde, 0x8d, 0x64, 0x3d, 0xa9, 0xe8, 0xc5, 0x61, 0x24, 0x9f, 0xc6, 0x23, 0xf9, - 0xd8, 0x3e, 0x12, 0xb6, 0xcc, 0xee, 0x48, 0x36, 0x19, 0x5f, 0xee, 0xa3, 0x7a, 0x17, 0x87, 0xea, - 0x8d, 0x42, 0x65, 0xa6, 0x8f, 0xe8, 0xfb, 0xb2, 0x00, 0xc4, 0xcc, 0xd8, 0x70, 0x27, 0x40, 0x62, - 0x36, 0xd6, 0x2f, 0x64, 0x43, 0xb2, 0x2c, 0xf2, 0xb2, 0x7c, 0x7c, 0x84, 0x15, 0x43, 0xc8, 0x47, - 0x48, 0xb4, 0x08, 0xb9, 0x5d, 0xf7, 0x33, 0x93, 0xa8, 0x20, 0x09, 0xf2, 0xaa, 0xd2, 0x3f, 0xd1, - 0x1f, 0x67, 0x20, 0x47, 0x12, 0x94, 0xd3, 0x00, 0x64, 0x60, 0xa7, 0x07, 0x82, 0x32, 0x64, 0x08, - 0x0f, 0xa5, 0x10, 0x6d, 0xd5, 0xdb, 0xec, 0x33, 0x35, 0x99, 0x83, 0x04, 0xf7, 0x6f, 0x32, 0xdc, - 0x13, 0x5a, 0xcc, 0x00, 0x08, 0xa5, 0xb8, 0x7f, 0x93, 0xb7, 0x55, 0xbc, 0x49, 0x03, 0x25, 0x67, - 0xd5, 0x20, 0xc1, 0xff, 0x7b, 0xd5, 0xbf, 0x5e, 0xcb, 0xfb, 0x9b, 0xa4, 0xb8, 0x93, 0x61, 0xa2, - 0x96, 0x0b, 0x41, 0x11, 0x79, 0x92, 0xa9, 0x37, 0x19, 0xbd, 0xd6, 0x57, 0x9b, 0x45, 0x4e, 0x6d, - 0x6e, 0x49, 0x20, 0xde, 0xf4, 0x95, 0xe7, 0x2b, 0x39, 0x98, 0xaa, 0x9a, 0x6d, 0xa6, 0x3b, 0xa1, - 0x09, 0xe3, 0xc7, 0x73, 0x89, 0x26, 0x8c, 0x3e, 0x8d, 0x08, 0x05, 0xb9, 0x87, 0x57, 0x10, 0x31, - 0x0a, 0x61, 0xfd, 0x50, 0x16, 0x20, 0x4f, 0xb4, 0x77, 0xff, 0xbd, 0x4d, 0x71, 0x24, 0x88, 0x68, - 0x55, 0xf6, 0xe7, 0x7f, 0x38, 0x1d, 0xfb, 0xaf, 0x90, 0x23, 0x15, 0x8c, 0xd9, 0xdd, 0xe1, 0x2b, - 0x2a, 0xc5, 0x57, 0x54, 0x8e, 0xaf, 0x68, 0xb6, 0xb7, 0xa2, 0x49, 0xd6, 0x01, 0xa2, 0x34, 0x24, - 0x7d, 0x1d, 0xff, 0x87, 0x09, 0x80, 0xaa, 0xb6, 0xa7, 0x6f, 0xd1, 0xdd, 0xe1, 0x2f, 0x78, 0xf3, - 0x1f, 0xb6, 0x8f, 0xfb, 0xdf, 0x42, 0x03, 0xe1, 0x6d, 0x30, 0xc1, 0xc6, 0x3d, 0x56, 0x91, 0xab, - 0xb9, 0x8a, 0x04, 0x54, 0xa8, 0x59, 0xfa, 0xa0, 0xa3, 0x7a, 0xf9, 0xb9, 0x2b, 0x66, 0xa5, 0x9e, - 0x2b, 0x66, 0xfb, 0xef, 0x41, 0x44, 0x5c, 0x3c, 0x8b, 0xde, 0x2d, 0xec, 0xd1, 0x1f, 0xe2, 0x27, - 0x54, 0xa3, 0x88, 0x26, 0xf8, 0x24, 0x98, 0x30, 0xfd, 0x0d, 0x6d, 0x39, 0x72, 0x1d, 0xac, 0x62, - 0x6c, 0x9a, 0xaa, 0x97, 0x53, 0x70, 0xf3, 0x4b, 0x88, 0x8f, 0xb1, 0x1c, 0x9a, 0x39, 0xb9, 0xec, - 0x05, 0x9d, 0x72, 0xeb, 0x71, 0x4e, 0x77, 0xb6, 0x57, 0x75, 0xe3, 0x82, 0x8d, 0xfe, 0xb3, 0x98, - 0x05, 0x19, 0xc2, 0x5f, 0x4a, 0x86, 0x3f, 0x1f, 0xb3, 0xa3, 0xce, 0xa3, 0x76, 0x67, 0x14, 0x95, - 0xfe, 0xdc, 0x46, 0x00, 0x78, 0x3b, 0xe4, 0x29, 0xa3, 0xac, 0x13, 0x3d, 0x13, 0x89, 0x9f, 0x4f, - 0x49, 0x65, 0x7f, 0xa0, 0x77, 0xf9, 0x38, 0x9e, 0xe5, 0x70, 0x5c, 0x38, 0x10, 0x67, 0xa9, 0x43, - 0x7a, 0xe6, 0x89, 0x30, 0xc1, 0x24, 0xad, 0xcc, 0x85, 0x5b, 0x71, 0xe1, 0x88, 0x02, 0x90, 0x5f, - 0x33, 0xf7, 0x70, 0xc3, 0x2c, 0x64, 0xdc, 0x67, 0x97, 0xbf, 0x86, 0x59, 0x90, 0xd0, 0x2b, 0x26, - 0x61, 0xd2, 0x8f, 0xf6, 0xf3, 0x79, 0x09, 0x0a, 0x25, 0x0b, 0x6b, 0x0e, 0x5e, 0xb2, 0xcc, 0x1d, - 0x5a, 0x23, 0x71, 0xef, 0xd0, 0x5f, 0x17, 0x76, 0xf1, 0xf0, 0xa3, 0xf0, 0xf4, 0x16, 0x16, 0x81, - 0x25, 0x5d, 0x84, 0x94, 0xbc, 0x45, 0x48, 0xf4, 0x66, 0x21, 0x97, 0x0f, 0xd1, 0x52, 0xd2, 0x6f, - 0x6a, 0x9f, 0x96, 0x20, 0x57, 0xea, 0x98, 0x06, 0x0e, 0x1f, 0x61, 0x1a, 0x78, 0x56, 0xa6, 0xff, - 0x4e, 0x04, 0x7a, 0xa6, 0x24, 0x6a, 0x6b, 0x04, 0x02, 0x70, 0xcb, 0x16, 0x94, 0xad, 0xd8, 0x20, - 0x15, 0x4b, 0x3a, 0x7d, 0x81, 0x7e, 0x43, 0x82, 0x29, 0x1a, 0x17, 0xa7, 0xd8, 0xe9, 0xa0, 0xc7, - 0x04, 0x42, 0xed, 0x13, 0x31, 0x09, 0xfd, 0xae, 0xb0, 0x8b, 0xbe, 0x5f, 0x2b, 0x9f, 0x76, 0x82, - 0x00, 0x41, 0xc9, 0x3c, 0xc6, 0xc5, 0xf6, 0xd2, 0x06, 0x32, 0x94, 0xbe, 0xa8, 0xff, 0x5c, 0x72, - 0x0d, 0x00, 0xe3, 0xc2, 0xba, 0x85, 0xf7, 0x74, 0x7c, 0x11, 0x5d, 0x19, 0x08, 0x7b, 0x7f, 0xd0, - 0x8f, 0x37, 0x0a, 0x2f, 0xe2, 0x84, 0x48, 0x46, 0x6e, 0x65, 0x4d, 0x77, 0x82, 0x4c, 0xac, 0x17, - 0xef, 0x8d, 0xc4, 0x12, 0x22, 0xa3, 0x86, 0xb3, 0x0b, 0xae, 0xd9, 0x44, 0x73, 0x91, 0xbe, 0x60, - 0x3f, 0x38, 0x01, 0x93, 0x1b, 0x86, 0xdd, 0xed, 0x68, 0xf6, 0x36, 0xfa, 0x9e, 0x0c, 0x79, 0x7a, - 0x5b, 0x18, 0xfa, 0x31, 0x2e, 0xb6, 0xc0, 0xcf, 0xec, 0x62, 0xcb, 0x73, 0xc1, 0xa1, 0x2f, 0xfd, - 0x2f, 0x33, 0x47, 0xef, 0x93, 0x45, 0x27, 0xa9, 0x5e, 0xa1, 0xa1, 0x6b, 0xe3, 0xfb, 0x1f, 0x67, - 0xef, 0xea, 0x2d, 0x67, 0xd7, 0xf2, 0xaf, 0xc6, 0x7e, 0x82, 0x18, 0x95, 0x75, 0xfa, 0x97, 0xea, - 0xff, 0x8e, 0x34, 0x98, 0x60, 0x89, 0xfb, 0xb6, 0x93, 0xf6, 0x9f, 0xbf, 0x3d, 0x09, 0x79, 0xcd, - 0x72, 0x74, 0xdb, 0x61, 0x1b, 0xac, 0xec, 0xcd, 0xed, 0x2e, 0xe9, 0xd3, 0x86, 0xd5, 0xf1, 0xa2, - 0x90, 0xf8, 0x09, 0xe8, 0xf7, 0x84, 0xe6, 0x8f, 0xf1, 0x35, 0x4f, 0x06, 0xf9, 0x7d, 0x43, 0xac, - 0x51, 0x5f, 0x0e, 0x97, 0xa9, 0xc5, 0x46, 0xb9, 0x49, 0x83, 0x56, 0xf8, 0xf1, 0x29, 0xda, 0xe8, - 0x9d, 0x72, 0x68, 0xfd, 0xee, 0x12, 0x37, 0x46, 0x30, 0x29, 0x06, 0x63, 0x84, 0x9f, 0x10, 0xb3, - 0x5b, 0xcd, 0x2d, 0xc2, 0xca, 0xe2, 0x8b, 0xb0, 0xbf, 0x2d, 0xbc, 0x9b, 0xe4, 0x8b, 0x72, 0xc0, - 0x1a, 0x60, 0xdc, 0x6d, 0x42, 0xef, 0x17, 0xda, 0x19, 0x1a, 0x54, 0xd2, 0x21, 0xc2, 0xf6, 0x86, - 0x09, 0x98, 0x58, 0xd6, 0x3a, 0x1d, 0x6c, 0x5d, 0x72, 0x87, 0xa4, 0x82, 0xc7, 0xe1, 0x9a, 0x66, - 0xe8, 0x9b, 0xd8, 0x76, 0xe2, 0x3b, 0xcb, 0x77, 0x0b, 0x47, 0xaa, 0x65, 0x65, 0xcc, 0xf7, 0xd2, - 0x8f, 0x90, 0xf9, 0xcd, 0x90, 0xd5, 0x8d, 0x4d, 0x93, 0x75, 0x99, 0xbd, 0xab, 0xf6, 0xde, 0xcf, - 0x64, 0xea, 0x42, 0x32, 0x0a, 0x06, 0xab, 0x15, 0xe4, 0x22, 0xfd, 0x9e, 0xf3, 0x77, 0xb2, 0x30, - 0xeb, 0x31, 0x51, 0x31, 0xda, 0xf8, 0xc1, 0xf0, 0x52, 0xcc, 0x8b, 0xb2, 0xa2, 0xc7, 0xc1, 0x7a, - 0xeb, 0x43, 0x48, 0x45, 0x88, 0xb4, 0x01, 0xd0, 0xd2, 0x1c, 0xbc, 0x65, 0x5a, 0xba, 0xdf, 0x1f, - 0x3e, 0x39, 0x09, 0xb5, 0x12, 0xfd, 0xfb, 0x92, 0x1a, 0xa2, 0xa3, 0xdc, 0x09, 0xd3, 0xd8, 0x3f, - 0x7f, 0xef, 0x2d, 0xd5, 0xc4, 0xe2, 0x15, 0xce, 0x8f, 0xfe, 0x5c, 0xe8, 0xd4, 0x99, 0x48, 0x35, - 0x93, 0x61, 0xd6, 0x1c, 0xae, 0x0d, 0x6d, 0x54, 0xd7, 0x8a, 0x6a, 0x7d, 0xa5, 0xb8, 0xba, 0x5a, - 0xa9, 0x2e, 0xfb, 0x81, 0x5f, 0x14, 0x98, 0x5b, 0xac, 0x9d, 0xab, 0x86, 0x22, 0xf3, 0x64, 0xd1, - 0x3a, 0x4c, 0x7a, 0xf2, 0xea, 0xe7, 0x8b, 0x19, 0x96, 0x19, 0xf3, 0xc5, 0x0c, 0x25, 0xb9, 0xc6, - 0x99, 0xde, 0xf2, 0x1d, 0x74, 0xc8, 0x33, 0xfa, 0x23, 0x0d, 0x72, 0x64, 0x4d, 0x1d, 0xbd, 0x9d, - 0x6c, 0x03, 0x76, 0x3b, 0x5a, 0x0b, 0xa3, 0x9d, 0x04, 0xd6, 0xb8, 0x77, 0x75, 0x82, 0xb4, 0xef, - 0xea, 0x04, 0xf2, 0xc8, 0xac, 0xbe, 0xe3, 0xfd, 0xd6, 0xf1, 0x55, 0x9a, 0x85, 0x3f, 0xa0, 0x15, - 0xbb, 0xbb, 0x42, 0x97, 0xff, 0x19, 0x9b, 0x11, 0x2a, 0x19, 0xcd, 0x53, 0x32, 0x4b, 0x54, 0x6c, - 0x1f, 0x26, 0x8e, 0xa3, 0x31, 0x5c, 0xef, 0x9d, 0x85, 0x5c, 0xbd, 0xdb, 0xd1, 0x1d, 0xf4, 0x52, - 0x69, 0x24, 0x98, 0xd1, 0xeb, 0x2e, 0xe4, 0x81, 0xd7, 0x5d, 0x04, 0xbb, 0xae, 0x59, 0x81, 0x5d, - 0xd7, 0x06, 0x7e, 0xd0, 0xe1, 0x77, 0x5d, 0x6f, 0x63, 0xc1, 0xdb, 0xe8, 0x9e, 0xed, 0x63, 0xfb, - 0x88, 0x94, 0x54, 0xab, 0x4f, 0x54, 0xc0, 0x33, 0x4f, 0x64, 0xc1, 0xc9, 0x00, 0xf2, 0x0b, 0xb5, - 0x46, 0xa3, 0xb6, 0x56, 0x38, 0x42, 0xa2, 0xda, 0xd4, 0xd6, 0x69, 0xa8, 0x98, 0x4a, 0xb5, 0x5a, - 0x56, 0x0b, 0x12, 0x09, 0x97, 0x56, 0x69, 0xac, 0x96, 0x0b, 0x32, 0x1f, 0xfb, 0x3c, 0xd6, 0xfc, - 0xe6, 0xcb, 0x4e, 0x53, 0xbd, 0xc4, 0x0c, 0xf1, 0x68, 0x7e, 0xd2, 0x57, 0xae, 0x5f, 0x93, 0x21, - 0xb7, 0x86, 0xad, 0x2d, 0x8c, 0x7e, 0x26, 0xc1, 0x26, 0xdf, 0xa6, 0x6e, 0xd9, 0x34, 0xb8, 0x5c, - 0xb0, 0xc9, 0x17, 0x4e, 0x53, 0xae, 0x83, 0x59, 0x1b, 0xb7, 0x4c, 0xa3, 0xed, 0x65, 0xa2, 0xfd, - 0x11, 0x9f, 0xc8, 0xdf, 0x3b, 0x2f, 0x00, 0x19, 0x61, 0x74, 0x24, 0x3b, 0x75, 0x49, 0x80, 0xe9, - 0x57, 0x6a, 0xfa, 0xc0, 0x7c, 0x5b, 0x76, 0x7f, 0xea, 0x5e, 0x42, 0x2f, 0x11, 0xde, 0x7d, 0xbd, - 0x09, 0xf2, 0x44, 0x4d, 0xbd, 0x31, 0xba, 0x7f, 0x7f, 0xcc, 0xf2, 0x28, 0x0b, 0x70, 0xcc, 0xc6, - 0x1d, 0xdc, 0x72, 0x70, 0xdb, 0x6d, 0xba, 0xea, 0xc0, 0x4e, 0x61, 0x7f, 0x76, 0xf4, 0xa7, 0x61, - 0x00, 0xef, 0xe0, 0x01, 0xbc, 0xbe, 0x8f, 0x28, 0xdd, 0x0a, 0x45, 0xdb, 0xca, 0x6e, 0x35, 0xea, - 0x1d, 0xd3, 0x5f, 0x14, 0xf7, 0xde, 0xdd, 0x6f, 0xdb, 0xce, 0x4e, 0x87, 0x7c, 0x63, 0x07, 0x0c, - 0xbc, 0x77, 0x65, 0x1e, 0x26, 0x34, 0xe3, 0x12, 0xf9, 0x94, 0x8d, 0xa9, 0xb5, 0x97, 0x09, 0xbd, - 0xc2, 0x47, 0xfe, 0x6e, 0x0e, 0xf9, 0xc7, 0x8b, 0xb1, 0x9b, 0x3e, 0xf0, 0x3f, 0x3f, 0x01, 0xb9, - 0x75, 0xcd, 0x76, 0x30, 0xfa, 0xbf, 0x64, 0x51, 0xe4, 0xaf, 0x87, 0xb9, 0x4d, 0xb3, 0xb5, 0x6b, - 0xe3, 0x36, 0xdf, 0x28, 0x7b, 0x52, 0x47, 0x81, 0xb9, 0x72, 0x23, 0x14, 0xbc, 0x44, 0x46, 0xd6, - 0xdb, 0x86, 0xdf, 0x97, 0x4e, 0x22, 0x69, 0xdb, 0xeb, 0x9a, 0xe5, 0xd4, 0x36, 0x49, 0x9a, 0x1f, - 0x49, 0x3b, 0x9c, 0xc8, 0x41, 0x9f, 0x8f, 0x81, 0x7e, 0x22, 0x1a, 0xfa, 0x49, 0x01, 0xe8, 0x95, - 0x22, 0x4c, 0x6e, 0xea, 0x1d, 0x4c, 0x7e, 0x98, 0x22, 0x3f, 0xf4, 0x1b, 0x93, 0x88, 0xec, 0xfd, - 0x31, 0x69, 0x49, 0xef, 0x60, 0xd5, 0xff, 0xcd, 0x9b, 0xc8, 0x40, 0x30, 0x91, 0x59, 0xa5, 0xfe, - 0xb4, 0xae, 0xe1, 0x65, 0x68, 0x3b, 0xd8, 0x5b, 0x7c, 0x33, 0xd8, 0xe1, 0x96, 0xb6, 0xe6, 0x68, - 0x04, 0x8c, 0x19, 0x95, 0x3c, 0xf3, 0x7e, 0x21, 0x72, 0xaf, 0x5f, 0xc8, 0xb3, 0xe5, 0x64, 0x3d, - 0xa2, 0xc7, 0x6c, 0x44, 0x8b, 0x3a, 0xef, 0x01, 0x44, 0x2d, 0x45, 0xff, 0xdd, 0x05, 0xa6, 0xa5, - 0x59, 0xd8, 0x59, 0x0f, 0x7b, 0x62, 0xe4, 0x54, 0x3e, 0x91, 0xb8, 0xf2, 0xd9, 0x75, 0x6d, 0x07, - 0x93, 0xc2, 0x4a, 0xee, 0x37, 0xe6, 0xa2, 0xb5, 0x2f, 0x3d, 0xe8, 0x7f, 0x73, 0xa3, 0xee, 0x7f, - 0xfb, 0xd5, 0x31, 0xfd, 0x66, 0xf8, 0xea, 0x2c, 0xc8, 0xa5, 0x5d, 0xe7, 0x51, 0xdd, 0xfd, 0x7e, - 0x5f, 0xd8, 0xcf, 0x85, 0xf5, 0x67, 0x91, 0x17, 0xcd, 0x8f, 0xa9, 0xf7, 0x4d, 0xa8, 0x25, 0x62, - 0xfe, 0x34, 0x51, 0x75, 0x1b, 0xc3, 0xbd, 0x06, 0xb2, 0xef, 0x60, 0xf9, 0x50, 0xe6, 0xe0, 0xa6, - 0x39, 0xa2, 0xfd, 0x53, 0xa8, 0x67, 0xf0, 0xdf, 0xbd, 0x8e, 0x27, 0xcb, 0xc5, 0xea, 0x23, 0xdb, - 0xeb, 0x44, 0x94, 0x33, 0x2a, 0x7d, 0x41, 0x2f, 0x13, 0x76, 0x3b, 0xa7, 0x62, 0x8b, 0x75, 0x25, - 0x4c, 0x66, 0x53, 0x89, 0x5d, 0x26, 0x1a, 0x53, 0x6c, 0xfa, 0x80, 0x7d, 0x2b, 0xec, 0x2a, 0x58, - 0x3c, 0x30, 0x62, 0xe8, 0x95, 0xc2, 0xdb, 0x51, 0xb4, 0xda, 0x03, 0xd6, 0x0b, 0x93, 0xc9, 0x5b, - 0x6c, 0xb3, 0x2a, 0xb6, 0xe0, 0xf4, 0x25, 0xfe, 0x4d, 0x19, 0xf2, 0x74, 0x0b, 0x12, 0xbd, 0x29, - 0x93, 0xe0, 0x16, 0x76, 0x87, 0x77, 0x21, 0xf4, 0xdf, 0x93, 0xac, 0x39, 0x70, 0xae, 0x86, 0xd9, - 0x44, 0xae, 0x86, 0xfc, 0x39, 0x4e, 0x81, 0x76, 0x44, 0xeb, 0x98, 0xf2, 0x74, 0x32, 0x49, 0x0b, - 0xeb, 0xcb, 0x50, 0xfa, 0x78, 0x3f, 0x37, 0x07, 0x33, 0xb4, 0xe8, 0x73, 0x7a, 0x7b, 0x0b, 0x3b, - 0xe8, 0x9d, 0xd2, 0x0f, 0x0e, 0xea, 0x4a, 0x15, 0x66, 0x2e, 0x12, 0xb6, 0x57, 0xb5, 0x4b, 0xe6, - 0xae, 0xc3, 0x56, 0x2e, 0x6e, 0x8c, 0x5d, 0xf7, 0xa0, 0xf5, 0x9c, 0xa7, 0x7f, 0xa8, 0xdc, 0xff, - 0xae, 0x8c, 0xe9, 0x82, 0x3f, 0x75, 0xe0, 0xca, 0x13, 0x23, 0x2b, 0x9c, 0xa4, 0x9c, 0x84, 0xfc, - 0x9e, 0x8e, 0x2f, 0x56, 0xda, 0xcc, 0xba, 0x65, 0x6f, 0xe8, 0x0f, 0x84, 0xf7, 0x6d, 0xc3, 0x70, - 0x33, 0x5e, 0xd2, 0xd5, 0x42, 0xb1, 0xdd, 0xdb, 0x81, 0x6c, 0x8d, 0xe1, 0x4c, 0x31, 0x7f, 0x59, - 0x67, 0x29, 0x81, 0x22, 0x46, 0x19, 0xce, 0x7c, 0x28, 0x8f, 0xd8, 0x13, 0x2b, 0x54, 0x00, 0x23, - 0xbe, 0xc7, 0x53, 0x2c, 0xbe, 0xc4, 0x80, 0xa2, 0xd3, 0x97, 0xfc, 0x6b, 0x65, 0x98, 0xaa, 0x63, - 0x67, 0x49, 0xc7, 0x9d, 0xb6, 0x8d, 0xac, 0x83, 0x9b, 0x46, 0x37, 0x43, 0x7e, 0x93, 0x10, 0x1b, - 0x74, 0x6e, 0x81, 0x65, 0x43, 0xaf, 0x96, 0x44, 0x77, 0x84, 0xd9, 0xea, 0x9b, 0xc7, 0xed, 0x48, - 0x60, 0x12, 0xf3, 0xe8, 0x8d, 0x2f, 0x79, 0x0c, 0x81, 0x6d, 0x65, 0x98, 0x61, 0xb7, 0xfb, 0x15, - 0x3b, 0xfa, 0x96, 0x81, 0x76, 0x47, 0xd0, 0x42, 0x94, 0x5b, 0x20, 0xa7, 0xb9, 0xd4, 0xd8, 0xd6, - 0x2b, 0xea, 0xdb, 0x79, 0x92, 0xf2, 0x54, 0x9a, 0x31, 0x41, 0x18, 0xc9, 0x40, 0xb1, 0x3d, 0x9e, - 0xc7, 0x18, 0x46, 0x72, 0x60, 0xe1, 0xe9, 0x23, 0xf6, 0x65, 0x19, 0x8e, 0x33, 0x06, 0xce, 0x62, - 0xcb, 0xd1, 0x5b, 0x5a, 0x87, 0x22, 0xf7, 0xfc, 0xcc, 0x28, 0xa0, 0x5b, 0x81, 0xd9, 0xbd, 0x30, - 0x59, 0x06, 0xe1, 0x99, 0xbe, 0x10, 0x72, 0x0c, 0xa8, 0xfc, 0x8f, 0x09, 0xc2, 0xf1, 0x71, 0x52, - 0xe5, 0x68, 0x8e, 0x31, 0x1c, 0x9f, 0x30, 0x13, 0xe9, 0x43, 0xfc, 0x62, 0x16, 0x9a, 0x27, 0xe8, - 0x3e, 0xbf, 0x20, 0x8c, 0xed, 0x06, 0x4c, 0x13, 0x2c, 0xe9, 0x8f, 0x6c, 0x19, 0x22, 0x46, 0x89, - 0xfd, 0x7e, 0x87, 0x5d, 0x18, 0xe6, 0xff, 0xab, 0x86, 0xe9, 0xa0, 0x73, 0x00, 0xc1, 0xa7, 0x70, - 0x27, 0x9d, 0x89, 0xea, 0xa4, 0x25, 0xb1, 0x4e, 0xfa, 0x8d, 0xc2, 0xc1, 0x52, 0xfa, 0xb3, 0x7d, - 0x70, 0xf5, 0x10, 0x0b, 0x93, 0x31, 0xb8, 0xf4, 0xf4, 0xf5, 0xe2, 0x15, 0xd9, 0xde, 0x6b, 0xdc, - 0x3f, 0x32, 0x92, 0xf9, 0x54, 0xb8, 0x3f, 0x90, 0x7b, 0xfa, 0x83, 0x03, 0x58, 0xd2, 0x37, 0xc0, - 0x51, 0x5a, 0x44, 0xc9, 0x67, 0x2b, 0x47, 0x43, 0x41, 0xf4, 0x24, 0xa3, 0x8f, 0x0e, 0xa1, 0x04, - 0x83, 0xee, 0x98, 0x8f, 0xeb, 0xe4, 0x92, 0x19, 0xbb, 0x49, 0x15, 0xe4, 0xf0, 0xae, 0xa6, 0xff, - 0x46, 0x96, 0x5a, 0xbb, 0x1b, 0xe4, 0x4e, 0x37, 0xf4, 0x17, 0xd9, 0x51, 0x8c, 0x08, 0xf7, 0x40, - 0x96, 0xb8, 0xb8, 0xcb, 0x91, 0x4b, 0x1a, 0x41, 0x91, 0xc1, 0x85, 0x7b, 0xf8, 0x41, 0x67, 0xe5, - 0x88, 0x4a, 0xfe, 0x54, 0x6e, 0x84, 0xa3, 0xe7, 0xb5, 0xd6, 0x85, 0x2d, 0xcb, 0xdc, 0x25, 0xb7, - 0x5f, 0x99, 0xec, 0x1a, 0x2d, 0x72, 0x1d, 0x21, 0xff, 0x41, 0xb9, 0xd5, 0x33, 0x1d, 0x72, 0x83, - 0x4c, 0x87, 0x95, 0x23, 0xcc, 0x78, 0x50, 0x9e, 0xe8, 0x77, 0x3a, 0xf9, 0xd8, 0x4e, 0x67, 0xe5, - 0x88, 0xd7, 0xed, 0x28, 0x8b, 0x30, 0xd9, 0xd6, 0xf7, 0xc8, 0x56, 0x35, 0x99, 0x75, 0x0d, 0x3a, - 0xba, 0xbc, 0xa8, 0xef, 0xd1, 0x8d, 0xed, 0x95, 0x23, 0xaa, 0xff, 0xa7, 0xb2, 0x0c, 0x53, 0x64, - 0x5b, 0x80, 0x90, 0x99, 0x4c, 0x74, 0x2c, 0x79, 0xe5, 0x88, 0x1a, 0xfc, 0xeb, 0x5a, 0x1f, 0x59, - 0x72, 0xf6, 0xe3, 0x6e, 0x6f, 0xbb, 0x3d, 0x93, 0x68, 0xbb, 0xdd, 0x95, 0x05, 0xdd, 0x70, 0x3f, - 0x09, 0xb9, 0x16, 0x91, 0xb0, 0xc4, 0x24, 0x4c, 0x5f, 0x95, 0x3b, 0x20, 0xbb, 0xa3, 0x59, 0xde, - 0xe4, 0xf9, 0xfa, 0xc1, 0x74, 0xd7, 0x34, 0xeb, 0x82, 0x8b, 0xa0, 0xfb, 0xd7, 0xc2, 0x04, 0xe4, - 0x88, 0xe0, 0xfc, 0x07, 0xf4, 0x96, 0x2c, 0x35, 0x43, 0x4a, 0xa6, 0xe1, 0x0e, 0xfb, 0x0d, 0xd3, - 0x3b, 0x20, 0xf3, 0x07, 0x99, 0xd1, 0x58, 0x90, 0x7d, 0xef, 0x3d, 0x97, 0x23, 0xef, 0x3d, 0xef, - 0xb9, 0x80, 0x37, 0xdb, 0x7b, 0x01, 0x6f, 0xb0, 0x7c, 0x90, 0x1b, 0xec, 0xa8, 0xf2, 0xa7, 0x43, - 0x98, 0x2e, 0xbd, 0x82, 0x88, 0x9e, 0x81, 0x77, 0x74, 0x23, 0x54, 0x67, 0xef, 0x35, 0x61, 0xa7, - 0x94, 0xd4, 0xa8, 0x19, 0xc0, 0x5e, 0xfa, 0x7d, 0xd3, 0x6f, 0x65, 0xe1, 0x14, 0xbd, 0xe6, 0x79, - 0x0f, 0x37, 0x4c, 0xfe, 0xbe, 0x49, 0xf4, 0xa9, 0x91, 0x28, 0x4d, 0x9f, 0x01, 0x47, 0xee, 0x3b, - 0xe0, 0xec, 0x3b, 0xa4, 0x9c, 0x1d, 0x70, 0x48, 0x39, 0x97, 0x6c, 0xe5, 0xf0, 0x03, 0x61, 0xfd, - 0x59, 0xe7, 0xf5, 0xe7, 0xf6, 0x08, 0x80, 0xfa, 0xc9, 0x65, 0x24, 0xf6, 0xcd, 0xdb, 0x7d, 0x4d, - 0xa9, 0x73, 0x9a, 0x72, 0xf7, 0xf0, 0x8c, 0xa4, 0xaf, 0x2d, 0xbf, 0x9f, 0x85, 0xcb, 0x02, 0x66, - 0xaa, 0xf8, 0x22, 0x53, 0x94, 0xcf, 0x8f, 0x44, 0x51, 0x92, 0xc7, 0x40, 0x48, 0x5b, 0x63, 0xfe, - 0x58, 0xf8, 0xec, 0x50, 0x2f, 0x50, 0xbe, 0x6c, 0x22, 0x94, 0xe5, 0x24, 0xe4, 0x69, 0x0f, 0xc3, - 0xa0, 0x61, 0x6f, 0x09, 0xbb, 0x1b, 0xb1, 0x13, 0x47, 0xa2, 0xbc, 0x8d, 0x41, 0x7f, 0xd8, 0xba, - 0x46, 0x63, 0xd7, 0x32, 0x2a, 0x86, 0x63, 0xa2, 0x9f, 0x1b, 0x89, 0xe2, 0xf8, 0xde, 0x70, 0xf2, - 0x30, 0xde, 0x70, 0x43, 0xad, 0x72, 0x78, 0x35, 0x38, 0x94, 0x55, 0x8e, 0x88, 0xc2, 0xd3, 0xc7, - 0xef, 0x6d, 0x32, 0x9c, 0x64, 0x93, 0xad, 0x05, 0xde, 0x42, 0x44, 0xf7, 0x8f, 0x02, 0xc8, 0xe3, - 0x9e, 0x99, 0xc4, 0x6e, 0x39, 0x23, 0x2f, 0xfc, 0x49, 0xa9, 0xd8, 0xfb, 0x1d, 0xb8, 0xe9, 0x60, - 0x0f, 0x87, 0x23, 0x41, 0x4a, 0xec, 0x5a, 0x87, 0x04, 0x6c, 0xa4, 0x8f, 0xd9, 0x0b, 0x65, 0xc8, - 0xb3, 0xeb, 0xfd, 0x37, 0x52, 0x71, 0x98, 0xe0, 0xa3, 0x3c, 0x0b, 0xec, 0xc8, 0x25, 0xbe, 0xe4, - 0x3e, 0xbd, 0xbd, 0xb8, 0x43, 0xba, 0xc5, 0xfe, 0xdb, 0x12, 0x4c, 0xd7, 0xb1, 0x53, 0xd2, 0x2c, - 0x4b, 0xd7, 0xb6, 0x46, 0xe5, 0xf1, 0x2d, 0xea, 0x3d, 0x8c, 0xbe, 0x93, 0x11, 0x3d, 0x4f, 0xe3, - 0x2f, 0x84, 0x7b, 0xac, 0x46, 0xc4, 0x12, 0x7c, 0x58, 0xe8, 0xcc, 0xcc, 0x20, 0x6a, 0x63, 0xf0, - 0xd8, 0x96, 0x60, 0xc2, 0x3b, 0x8b, 0x77, 0x33, 0x77, 0x3e, 0x73, 0xdb, 0xd9, 0xf1, 0x8e, 0xc1, - 0x90, 0xe7, 0xfd, 0x67, 0xc0, 0xd0, 0xcb, 0x13, 0x3a, 0xca, 0xc7, 0x1f, 0x24, 0x4c, 0xd6, 0xc6, - 0x92, 0xb8, 0xc3, 0x1f, 0xd6, 0xd1, 0xc1, 0xdf, 0x9d, 0x60, 0xcb, 0x91, 0xab, 0x9a, 0x83, 0x1f, - 0x44, 0x5f, 0x90, 0x61, 0xa2, 0x8e, 0x1d, 0x77, 0xbc, 0xe5, 0x2e, 0x37, 0x1d, 0x56, 0xc3, 0x95, - 0xd0, 0x8a, 0xc7, 0x14, 0x5b, 0xc3, 0xb8, 0x17, 0xa6, 0xba, 0x96, 0xd9, 0xc2, 0xb6, 0xcd, 0x56, - 0x2f, 0xc2, 0x8e, 0x6a, 0xfd, 0x46, 0x7f, 0xc2, 0xda, 0xfc, 0xba, 0xf7, 0x8f, 0x1a, 0xfc, 0x9e, - 0xd4, 0x0c, 0xa0, 0x94, 0x58, 0x05, 0xc7, 0x6d, 0x06, 0xc4, 0x15, 0x9e, 0x3e, 0xd0, 0x9f, 0x95, - 0x61, 0xa6, 0x8e, 0x1d, 0x5f, 0x8a, 0x09, 0x36, 0x39, 0xa2, 0xe1, 0xe5, 0xa0, 0x94, 0x0f, 0x06, - 0xa5, 0xf8, 0xd5, 0x80, 0xbc, 0x34, 0x7d, 0x62, 0x63, 0xbc, 0x1a, 0x50, 0x8c, 0x83, 0x31, 0x1c, - 0x5f, 0x7b, 0x2c, 0x4c, 0x11, 0x5e, 0x48, 0x83, 0xfd, 0xa5, 0x6c, 0xd0, 0x78, 0xbf, 0x98, 0x52, - 0xe3, 0xbd, 0x13, 0x72, 0x3b, 0x9a, 0x75, 0xc1, 0x26, 0x0d, 0x77, 0x5a, 0xc4, 0x6c, 0x5f, 0x73, - 0xb3, 0xab, 0xf4, 0xaf, 0xfe, 0x7e, 0x9a, 0xb9, 0x64, 0x7e, 0x9a, 0x0f, 0x4b, 0x89, 0x46, 0x42, - 0x3a, 0x77, 0x18, 0x61, 0x93, 0x4f, 0x30, 0x6e, 0xc6, 0x94, 0x9d, 0xbe, 0x72, 0x3c, 0x5f, 0x86, - 0x49, 0x77, 0xdc, 0x26, 0xf6, 0xf8, 0xb9, 0x83, 0xab, 0x43, 0x7f, 0x43, 0x3f, 0x61, 0x0f, 0xec, - 0x49, 0x64, 0x74, 0xe6, 0x7d, 0x82, 0x1e, 0x38, 0xae, 0xf0, 0xf4, 0xf1, 0x78, 0x07, 0xc5, 0x83, - 0xb4, 0x07, 0xf4, 0x7a, 0x19, 0xe4, 0x65, 0xec, 0x8c, 0xdb, 0x8a, 0x7c, 0xab, 0x70, 0x88, 0x23, - 0x4e, 0x60, 0x84, 0xe7, 0xf9, 0x65, 0x3c, 0x9a, 0x06, 0x24, 0x16, 0xdb, 0x48, 0x88, 0x81, 0xf4, - 0x51, 0x7b, 0x0f, 0x45, 0x8d, 0x6e, 0x2e, 0xfc, 0xec, 0x08, 0x7a, 0xd5, 0xf1, 0x2e, 0x7c, 0x78, - 0x02, 0x24, 0x34, 0x0e, 0xab, 0xbd, 0xf5, 0x2b, 0x7c, 0x2c, 0x57, 0xf1, 0x81, 0xdb, 0xd8, 0xb7, - 0x71, 0xeb, 0x02, 0x6e, 0xa3, 0x9f, 0x3a, 0x38, 0x74, 0xa7, 0x60, 0xa2, 0x45, 0xa9, 0x11, 0xf0, - 0x26, 0x55, 0xef, 0x35, 0xc1, 0xbd, 0xd2, 0x7c, 0x47, 0x44, 0x7f, 0x1f, 0xe3, 0xbd, 0xd2, 0x02, - 0xc5, 0x8f, 0xc1, 0x6c, 0xa1, 0xb3, 0x8c, 0x4a, 0xcb, 0x34, 0xd0, 0x7f, 0x39, 0x38, 0x2c, 0x57, - 0xc1, 0x94, 0xde, 0x32, 0x0d, 0x12, 0x86, 0xc2, 0x3b, 0x04, 0xe4, 0x27, 0x78, 0x5f, 0xcb, 0x3b, - 0xe6, 0x03, 0x3a, 0xdb, 0x35, 0x0f, 0x12, 0x86, 0x35, 0x26, 0x5c, 0xd6, 0x0f, 0xcb, 0x98, 0xe8, - 0x53, 0x76, 0xfa, 0x90, 0x7d, 0x34, 0xf0, 0x6e, 0xa3, 0x5d, 0xe1, 0xa3, 0x62, 0x15, 0x78, 0x98, - 0xe1, 0x2c, 0x5c, 0x8b, 0x43, 0x19, 0xce, 0x62, 0x18, 0x18, 0xc3, 0x8d, 0x15, 0x01, 0x8e, 0xa9, - 0xaf, 0x01, 0x1f, 0x00, 0x9d, 0xd1, 0x99, 0x87, 0x43, 0xa2, 0x73, 0x38, 0x26, 0xe2, 0xfb, 0x59, - 0x88, 0x4c, 0x66, 0xf1, 0xa0, 0xff, 0x3a, 0x0a, 0x70, 0x6e, 0x1f, 0xc6, 0x5f, 0x81, 0x7a, 0x2b, - 0x24, 0xb8, 0x11, 0x7b, 0x9f, 0x04, 0x5d, 0x2a, 0x63, 0xbc, 0x2b, 0x5e, 0xa4, 0xfc, 0xf4, 0x01, - 0x7c, 0x9e, 0x0c, 0x73, 0xc4, 0x47, 0xa0, 0x83, 0x35, 0x8b, 0x76, 0x94, 0x23, 0x71, 0x94, 0x7f, - 0x87, 0x70, 0x80, 0x1f, 0x5e, 0x0e, 0x01, 0x1f, 0x23, 0x81, 0x42, 0x2c, 0xba, 0x8f, 0x20, 0x0b, - 0x63, 0xd9, 0x46, 0x29, 0xf8, 0x2c, 0x30, 0x15, 0x1f, 0x0d, 0x1e, 0x09, 0x3d, 0x72, 0x79, 0x61, - 0x78, 0x8d, 0x6d, 0xcc, 0x1e, 0xb9, 0x22, 0x4c, 0xa4, 0x8f, 0xc9, 0xeb, 0x6f, 0x61, 0x0b, 0xce, - 0x0d, 0x72, 0x61, 0xfc, 0x2b, 0xb3, 0xfe, 0x89, 0xb6, 0xcf, 0x8e, 0xc4, 0x03, 0xf3, 0x00, 0x01, - 0xf1, 0x15, 0xc8, 0x5a, 0xe6, 0x45, 0xba, 0xb4, 0x35, 0xab, 0x92, 0x67, 0x7a, 0x3d, 0x65, 0x67, - 0x77, 0xc7, 0xa0, 0x27, 0x43, 0x67, 0x55, 0xef, 0x55, 0xb9, 0x0e, 0x66, 0x2f, 0xea, 0xce, 0xf6, - 0x0a, 0xd6, 0xda, 0xd8, 0x52, 0xcd, 0x8b, 0xc4, 0x63, 0x6e, 0x52, 0xe5, 0x13, 0x79, 0xff, 0x15, - 0x01, 0xfb, 0x92, 0xdc, 0x22, 0x3f, 0x96, 0xe3, 0x6f, 0x49, 0x2c, 0xcf, 0x68, 0xae, 0xd2, 0x57, - 0x98, 0xf7, 0xca, 0x30, 0xa5, 0x9a, 0x17, 0x99, 0x92, 0xfc, 0x1f, 0x87, 0xab, 0x23, 0x89, 0x27, - 0x7a, 0x44, 0x72, 0x3e, 0xfb, 0x63, 0x9f, 0xe8, 0xc5, 0x16, 0x3f, 0x96, 0x93, 0x4b, 0x33, 0xaa, - 0x79, 0xb1, 0x8e, 0x1d, 0xda, 0x22, 0x50, 0x73, 0x44, 0x4e, 0xd6, 0xba, 0x4d, 0x09, 0xb2, 0x79, - 0xb8, 0xff, 0x9e, 0x74, 0x17, 0xc1, 0x17, 0x90, 0xcf, 0xe2, 0xb8, 0x77, 0x11, 0x06, 0x72, 0x30, - 0x86, 0x18, 0x29, 0x32, 0x4c, 0xab, 0xe6, 0x45, 0x77, 0x68, 0x58, 0xd2, 0x3b, 0x9d, 0xd1, 0x8c, - 0x90, 0x49, 0x8d, 0x7f, 0x4f, 0x0c, 0x1e, 0x17, 0x63, 0x37, 0xfe, 0x07, 0x30, 0x90, 0x3e, 0x0c, - 0xcf, 0xa6, 0x8d, 0xc5, 0x1b, 0xa1, 0x8d, 0xd1, 0xe0, 0x30, 0x6c, 0x83, 0xf0, 0xd9, 0x38, 0xb4, - 0x06, 0x11, 0xc5, 0xc1, 0x58, 0x76, 0x4e, 0xe6, 0x4a, 0x64, 0x98, 0x1f, 0x6d, 0x9b, 0x78, 0x57, - 0x32, 0xd7, 0x44, 0x36, 0xec, 0x72, 0x8c, 0x8c, 0x04, 0x8d, 0x04, 0x2e, 0x88, 0x02, 0x3c, 0xa4, - 0x8f, 0xc7, 0x87, 0x64, 0x98, 0xa1, 0x2c, 0x3c, 0x4a, 0xac, 0x80, 0xa1, 0x1a, 0x55, 0xb8, 0x06, - 0x87, 0xd3, 0xa8, 0x62, 0x38, 0x18, 0xcb, 0xad, 0xa0, 0xae, 0x1d, 0x37, 0xc4, 0xf1, 0xf1, 0x28, - 0x04, 0x87, 0x36, 0xc6, 0x46, 0x78, 0x84, 0x7c, 0x18, 0x63, 0xec, 0x90, 0x8e, 0x91, 0x3f, 0xdb, - 0x6f, 0x45, 0xa3, 0xc4, 0xe0, 0x00, 0x4d, 0x61, 0x84, 0x30, 0x0c, 0xd9, 0x14, 0x0e, 0x09, 0x89, - 0xaf, 0xc8, 0x00, 0x94, 0x81, 0x35, 0x73, 0x8f, 0x5c, 0xe6, 0x33, 0x82, 0xee, 0xac, 0xd7, 0xad, - 0x5e, 0x1e, 0xe0, 0x56, 0x9f, 0x30, 0x84, 0x4b, 0xd2, 0x95, 0xc0, 0x90, 0x94, 0xdd, 0x4a, 0x8e, - 0x7d, 0x25, 0x30, 0xbe, 0xfc, 0xf4, 0x31, 0x7e, 0x84, 0x5a, 0x73, 0xc1, 0x01, 0xd3, 0xdf, 0x18, - 0x09, 0xca, 0xa1, 0xd9, 0xbf, 0xcc, 0xcf, 0xfe, 0x0f, 0x80, 0xed, 0xb0, 0x36, 0xe2, 0xa0, 0x83, - 0xa3, 0xe9, 0xdb, 0x88, 0x87, 0x77, 0x40, 0xf4, 0x67, 0xb3, 0x70, 0x94, 0x75, 0x22, 0x3f, 0x08, - 0x10, 0x27, 0x3c, 0x87, 0xc7, 0x75, 0x92, 0x03, 0x50, 0x1e, 0xd5, 0x82, 0x54, 0x92, 0xa5, 0x4c, - 0x01, 0xf6, 0xc6, 0xb2, 0xba, 0x91, 0x2f, 0x3f, 0xd8, 0xd5, 0x8c, 0xb6, 0x78, 0xb8, 0xdf, 0x01, - 0xc0, 0x7b, 0x6b, 0x8d, 0x32, 0xbf, 0xd6, 0xd8, 0x67, 0x65, 0x32, 0xf1, 0xce, 0x35, 0x11, 0x19, - 0x65, 0x77, 0xec, 0x3b, 0xd7, 0xd1, 0x65, 0xa7, 0x8f, 0xd2, 0xbb, 0x64, 0xc8, 0xd6, 0x4d, 0xcb, - 0x41, 0xcf, 0x49, 0xd2, 0x3a, 0xa9, 0xe4, 0x03, 0x90, 0xbc, 0x77, 0xa5, 0xc4, 0xdd, 0xd2, 0x7c, - 0x73, 0xfc, 0x51, 0x67, 0xcd, 0xd1, 0x88, 0x57, 0xb7, 0x5b, 0x7e, 0xe8, 0xba, 0xe6, 0xa4, 0xf1, - 0x74, 0xa8, 0xfc, 0xea, 0xd1, 0x07, 0x30, 0x52, 0x8b, 0xa7, 0x13, 0x59, 0x72, 0xfa, 0xb8, 0xbd, - 0xe6, 0x28, 0xf3, 0x6d, 0x5d, 0xd2, 0x3b, 0x18, 0x3d, 0x87, 0xba, 0x8c, 0x54, 0xb5, 0x1d, 0x2c, - 0x7e, 0x24, 0x26, 0xd6, 0xb5, 0x95, 0xc4, 0x97, 0x95, 0x83, 0xf8, 0xb2, 0x49, 0x1b, 0x14, 0x3d, - 0x80, 0x4e, 0x59, 0x1a, 0x77, 0x83, 0x8a, 0x29, 0x7b, 0x2c, 0x71, 0x3a, 0x8f, 0xd5, 0xb1, 0x43, - 0x8d, 0xca, 0x9a, 0x77, 0x03, 0xcb, 0x4f, 0x8f, 0x24, 0x62, 0xa7, 0x7f, 0xc1, 0x8b, 0xdc, 0x73, - 0xc1, 0xcb, 0x7b, 0xc3, 0xe0, 0xac, 0xf1, 0xe0, 0xfc, 0x78, 0xb4, 0x80, 0x78, 0x26, 0x47, 0x02, - 0xd3, 0x5b, 0x7d, 0x98, 0xd6, 0x39, 0x98, 0xee, 0x18, 0x92, 0x8b, 0xf4, 0x01, 0xfb, 0xe5, 0x1c, - 0x1c, 0xa5, 0x93, 0xfe, 0xa2, 0xd1, 0x66, 0x11, 0x56, 0xdf, 0x24, 0x1d, 0xf2, 0x66, 0xdb, 0xfe, - 0x10, 0xac, 0x5c, 0x2c, 0xe7, 0x5c, 0xef, 0xed, 0xf8, 0x0b, 0x34, 0x9c, 0xab, 0xdb, 0x89, 0x92, - 0x9d, 0x36, 0xf1, 0x1b, 0xf2, 0xfd, 0xff, 0xf8, 0xbb, 0x8c, 0x26, 0xc4, 0xef, 0x32, 0xfa, 0x93, - 0x64, 0xeb, 0x76, 0xa4, 0xe8, 0x1e, 0x81, 0xa7, 0x6c, 0x3b, 0x25, 0x58, 0xd1, 0x13, 0xe0, 0xee, - 0x87, 0xc3, 0x9d, 0x2c, 0x88, 0x20, 0x32, 0xa4, 0x3b, 0x19, 0x21, 0x70, 0x98, 0xee, 0x64, 0x83, - 0x18, 0x18, 0xc3, 0xad, 0xf6, 0x39, 0xb6, 0x9b, 0x4f, 0xda, 0x0d, 0xfa, 0x2b, 0x29, 0xf5, 0x51, - 0xfa, 0xbb, 0x99, 0x44, 0xfe, 0xcf, 0x84, 0xaf, 0xf8, 0x61, 0x3a, 0x89, 0x47, 0x73, 0x1c, 0xb9, - 0x31, 0xac, 0x1b, 0x49, 0xc4, 0x17, 0xfd, 0x9c, 0xde, 0x76, 0xb6, 0x47, 0x74, 0xa2, 0xe3, 0xa2, - 0x4b, 0xcb, 0xbb, 0x1e, 0x99, 0xbc, 0xa0, 0x7f, 0xcb, 0x24, 0x0a, 0x21, 0xe5, 0x8b, 0x84, 0xb0, - 0x15, 0x21, 0xe2, 0x04, 0x81, 0x9f, 0x62, 0xe9, 0x8d, 0x51, 0xa3, 0xcf, 0xea, 0x6d, 0x6c, 0x3e, - 0x0a, 0x35, 0x9a, 0xf0, 0x35, 0x3a, 0x8d, 0x8e, 0x23, 0xf7, 0x43, 0xaa, 0xd1, 0xbe, 0x48, 0x46, - 0xa4, 0xd1, 0xb1, 0xf4, 0xd2, 0x97, 0xf1, 0xcb, 0x67, 0xd8, 0x44, 0x6a, 0x55, 0x37, 0x2e, 0xa0, - 0x7f, 0xce, 0x7b, 0x17, 0x33, 0x9f, 0xd3, 0x9d, 0x6d, 0x16, 0x0b, 0xe6, 0xf7, 0x85, 0xef, 0x46, - 0x19, 0x22, 0xde, 0x0b, 0x1f, 0x4e, 0x2a, 0xb7, 0x2f, 0x9c, 0x54, 0x11, 0x66, 0x75, 0xc3, 0xc1, - 0x96, 0xa1, 0x75, 0x96, 0x3a, 0xda, 0x96, 0x7d, 0x6a, 0xa2, 0xef, 0xe5, 0x75, 0x95, 0x50, 0x1e, - 0x95, 0xff, 0x23, 0x7c, 0x7d, 0xe5, 0x24, 0x7f, 0x7d, 0x65, 0x44, 0xf4, 0xab, 0xa9, 0xe8, 0xe8, - 0x57, 0x7e, 0x74, 0x2b, 0x18, 0x1c, 0x1c, 0x5b, 0xd4, 0x36, 0x4e, 0x18, 0xee, 0xef, 0x66, 0xc1, - 0x28, 0x6c, 0x7e, 0xe8, 0xc7, 0x57, 0xc9, 0x89, 0x56, 0xf7, 0x5c, 0x45, 0x98, 0xef, 0x55, 0x82, - 0xc4, 0x16, 0x6a, 0xb8, 0xf2, 0x72, 0x4f, 0xe5, 0x7d, 0x93, 0x27, 0x2b, 0x60, 0xf2, 0x84, 0x95, - 0x2a, 0x27, 0xa6, 0x54, 0x49, 0x16, 0x0b, 0x45, 0x6a, 0x3b, 0x86, 0xd3, 0x48, 0x39, 0x38, 0xe6, - 0x45, 0xbb, 0xed, 0x76, 0xb1, 0x66, 0x69, 0x46, 0x0b, 0xa3, 0x8f, 0x4a, 0xa3, 0x30, 0x7b, 0x97, - 0x60, 0x52, 0x6f, 0x99, 0x46, 0x5d, 0x7f, 0x86, 0x77, 0xb9, 0x5c, 0x7c, 0x90, 0x75, 0x22, 0x91, - 0x0a, 0xfb, 0x43, 0xf5, 0xff, 0x55, 0x2a, 0x30, 0xd5, 0xd2, 0xac, 0x36, 0x0d, 0xc2, 0x97, 0xeb, - 0xb9, 0xc8, 0x29, 0x92, 0x50, 0xc9, 0xfb, 0x45, 0x0d, 0xfe, 0x56, 0x6a, 0xbc, 0x10, 0xf3, 0x3d, - 0xd1, 0x3c, 0x22, 0x89, 0x2d, 0x06, 0x3f, 0x71, 0x32, 0x77, 0xa5, 0x63, 0xe1, 0x0e, 0xb9, 0x83, - 0x9e, 0xf6, 0x10, 0x53, 0x6a, 0x90, 0x90, 0x74, 0x79, 0x80, 0x14, 0xb5, 0x0f, 0x8d, 0x71, 0x2f, - 0x0f, 0x08, 0x71, 0x91, 0xbe, 0x66, 0xbe, 0x3d, 0x0f, 0xb3, 0xb4, 0x57, 0x63, 0xe2, 0x44, 0xcf, - 0x23, 0x57, 0x48, 0x3b, 0xf7, 0xe1, 0x4b, 0xa8, 0x7e, 0xf0, 0x31, 0xb9, 0x00, 0xf2, 0x05, 0x3f, - 0xe0, 0xa0, 0xfb, 0x98, 0x74, 0xdf, 0xde, 0xe3, 0x6b, 0x9e, 0xf2, 0x34, 0xee, 0x7d, 0xfb, 0xf8, - 0xe2, 0xd3, 0xc7, 0xe7, 0x57, 0x64, 0x90, 0x8b, 0xed, 0x36, 0x6a, 0x1d, 0x1c, 0x8a, 0x6b, 0x60, - 0xda, 0x6b, 0x33, 0x41, 0x0c, 0xc8, 0x70, 0x52, 0xd2, 0x45, 0x50, 0x5f, 0x36, 0xc5, 0xf6, 0xd8, - 0x77, 0x15, 0x62, 0xca, 0x4e, 0x1f, 0x94, 0xdf, 0x98, 0x60, 0x8d, 0x66, 0xc1, 0x34, 0x2f, 0x90, - 0xa3, 0x32, 0xcf, 0x91, 0x21, 0xb7, 0x84, 0x9d, 0xd6, 0xf6, 0x88, 0xda, 0xcc, 0xae, 0xd5, 0xf1, - 0xda, 0xcc, 0xbe, 0xfb, 0xf0, 0x07, 0xdb, 0xb0, 0x1e, 0x5b, 0xf3, 0x84, 0xa5, 0x71, 0x47, 0x77, - 0x8e, 0x2d, 0x3d, 0x7d, 0x70, 0xfe, 0x4d, 0x86, 0x39, 0x7f, 0x85, 0x8b, 0x62, 0xf2, 0xcb, 0x99, - 0x47, 0xdb, 0x7a, 0x27, 0xfa, 0x7c, 0xb2, 0x10, 0x69, 0xbe, 0x4c, 0xf9, 0x9a, 0xa5, 0xbc, 0xb0, - 0x98, 0x20, 0x78, 0x9a, 0x18, 0x83, 0x63, 0x98, 0xc1, 0xcb, 0x30, 0x49, 0x18, 0x5a, 0xd4, 0xf7, - 0x88, 0xeb, 0x20, 0xb7, 0xd0, 0xf8, 0xcc, 0x91, 0x2c, 0x34, 0xde, 0xc1, 0x2f, 0x34, 0x0a, 0x46, - 0x3c, 0xf6, 0xd6, 0x19, 0x13, 0xfa, 0xd2, 0xb8, 0xff, 0x8f, 0x7c, 0x99, 0x31, 0x81, 0x2f, 0xcd, - 0x80, 0xf2, 0xd3, 0x47, 0xf4, 0x55, 0xff, 0x89, 0x75, 0xb6, 0xde, 0x86, 0x2a, 0xfa, 0x9f, 0xc7, - 0x20, 0x7b, 0xd6, 0x7d, 0xf8, 0xdf, 0xc1, 0x8d, 0x58, 0x2f, 0x19, 0x41, 0x70, 0x86, 0xbb, 0x20, - 0xeb, 0xd2, 0x67, 0xd3, 0x96, 0x1b, 0xc5, 0x76, 0x77, 0x5d, 0x46, 0x54, 0xf2, 0x9f, 0x72, 0x12, - 0xf2, 0xb6, 0xb9, 0x6b, 0xb5, 0x5c, 0xf3, 0xd9, 0xd5, 0x18, 0xf6, 0x96, 0x34, 0x28, 0x29, 0x47, - 0x7a, 0x7e, 0x74, 0x2e, 0xa3, 0xa1, 0x0b, 0x92, 0x64, 0xee, 0x82, 0xa4, 0x04, 0xfb, 0x07, 0x02, - 0xbc, 0xa5, 0xaf, 0x11, 0x7f, 0x45, 0xee, 0x0a, 0x6c, 0x8f, 0x0a, 0xf6, 0x08, 0xb1, 0x1c, 0x54, - 0x1d, 0x92, 0x3a, 0x7c, 0xf3, 0xa2, 0xf5, 0xe3, 0xc0, 0x8f, 0xd5, 0xe1, 0x5b, 0x80, 0x87, 0xb1, - 0x9c, 0x52, 0xcf, 0x33, 0x27, 0xd5, 0xfb, 0x47, 0x89, 0x6e, 0x96, 0x53, 0xfa, 0x03, 0xa1, 0x33, - 0x42, 0xe7, 0xd5, 0xa1, 0xd1, 0x39, 0x24, 0xf7, 0xd5, 0x3f, 0x94, 0x49, 0x24, 0x4c, 0xcf, 0xc8, - 0x11, 0xbf, 0xe8, 0x28, 0x31, 0x44, 0xee, 0x18, 0xcc, 0xc5, 0x81, 0x9e, 0x1d, 0x3e, 0x34, 0x38, - 0x2f, 0xba, 0x10, 0xff, 0xe3, 0x0e, 0x0d, 0x2e, 0xca, 0x48, 0xfa, 0x40, 0xbe, 0x8e, 0x5e, 0x2c, - 0x56, 0x6c, 0x39, 0xfa, 0xde, 0x88, 0x5b, 0x1a, 0x3f, 0xbc, 0x24, 0x8c, 0x06, 0xbc, 0x4f, 0x42, - 0x94, 0xc3, 0x71, 0x47, 0x03, 0x16, 0x63, 0x23, 0x7d, 0x98, 0xfe, 0x36, 0xef, 0x4a, 0x8f, 0xad, - 0xcd, 0xbc, 0x9e, 0xad, 0x06, 0xe0, 0x83, 0xa3, 0x75, 0x06, 0x66, 0x42, 0x53, 0x7f, 0xef, 0xc2, - 0x1a, 0x2e, 0x2d, 0xe9, 0x41, 0x77, 0x5f, 0x64, 0x23, 0x5f, 0x18, 0x48, 0xb0, 0xe0, 0x2b, 0xc2, - 0xc4, 0x58, 0xee, 0x83, 0xf3, 0xc6, 0xb0, 0x31, 0x61, 0xf5, 0xfb, 0x61, 0xac, 0x6a, 0x3c, 0x56, - 0xb7, 0x89, 0x88, 0x49, 0x6c, 0x4c, 0x13, 0x9a, 0x37, 0xbe, 0xcd, 0x87, 0x4b, 0xe5, 0xe0, 0xba, - 0x6b, 0x68, 0x3e, 0xd2, 0x47, 0xec, 0xa5, 0xb4, 0x3b, 0xac, 0x53, 0x93, 0x7d, 0x34, 0xdd, 0x21, - 0x9b, 0x0d, 0xc8, 0xdc, 0x6c, 0x20, 0xa1, 0xbf, 0x7d, 0xe0, 0x46, 0xea, 0x31, 0x37, 0x08, 0xa2, - 0xec, 0x88, 0xfd, 0xed, 0x07, 0x72, 0x90, 0x3e, 0x38, 0xff, 0x28, 0x03, 0x2c, 0x5b, 0xe6, 0x6e, - 0xb7, 0x66, 0xb5, 0xb1, 0x85, 0xfe, 0x26, 0x98, 0x00, 0xbc, 0x68, 0x04, 0x13, 0x80, 0x75, 0x80, - 0x2d, 0x9f, 0x38, 0xd3, 0xf0, 0x5b, 0xc4, 0xcc, 0xfd, 0x80, 0x29, 0x35, 0x44, 0x83, 0xbf, 0x72, - 0xf6, 0x27, 0x78, 0x8c, 0xe3, 0xfa, 0xac, 0x80, 0xdc, 0x28, 0x27, 0x00, 0xef, 0xf0, 0xb1, 0x6e, - 0x70, 0x58, 0xdf, 0x73, 0x00, 0x4e, 0xd2, 0xc7, 0xfc, 0x9f, 0x26, 0x60, 0x9a, 0x6e, 0xd7, 0x51, - 0x99, 0xfe, 0x7d, 0x00, 0xfa, 0x6f, 0x8c, 0x00, 0xf4, 0x0d, 0x98, 0x31, 0x03, 0xea, 0xb4, 0x4f, - 0x0d, 0x2f, 0xc0, 0xc4, 0xc2, 0x1e, 0xe2, 0x4b, 0xe5, 0xc8, 0xa0, 0x0f, 0x87, 0x91, 0x57, 0x79, - 0xe4, 0xef, 0x88, 0x91, 0x77, 0x88, 0xe2, 0x28, 0xa1, 0x7f, 0xa7, 0x0f, 0xfd, 0x06, 0x07, 0x7d, - 0xf1, 0x20, 0xac, 0x8c, 0x21, 0xdc, 0xbe, 0x0c, 0x59, 0x72, 0x3a, 0xee, 0xb7, 0x52, 0x9c, 0xdf, - 0x9f, 0x82, 0x09, 0xd2, 0x64, 0xfd, 0x79, 0x87, 0xf7, 0xea, 0x7e, 0xd1, 0x36, 0x1d, 0x6c, 0xf9, - 0x1e, 0x0b, 0xde, 0xab, 0xcb, 0x83, 0xe7, 0x95, 0x6c, 0x9f, 0xca, 0xd3, 0x8d, 0x48, 0x3f, 0x61, - 0xe8, 0x49, 0x49, 0x58, 0xe2, 0x23, 0x3b, 0x2f, 0x37, 0xcc, 0xa4, 0x64, 0x00, 0x23, 0xe9, 0x03, - 0xff, 0x17, 0x59, 0x38, 0x45, 0x57, 0x95, 0x96, 0x2c, 0x73, 0xa7, 0xe7, 0x76, 0x2b, 0xfd, 0xe0, - 0xba, 0x70, 0x3d, 0xcc, 0x39, 0x9c, 0x3f, 0x36, 0xd3, 0x89, 0x9e, 0x54, 0xf4, 0xa7, 0x61, 0x9f, - 0x8a, 0xa7, 0xf3, 0x48, 0x2e, 0xc4, 0x08, 0x30, 0x8a, 0xf7, 0xc4, 0x0b, 0xf5, 0x82, 0x8c, 0x86, - 0x16, 0xa9, 0xe4, 0xa1, 0xd6, 0x2c, 0x7d, 0x9d, 0xca, 0x89, 0xe8, 0xd4, 0xfb, 0x7c, 0x9d, 0xfa, - 0x29, 0x4e, 0xa7, 0x96, 0x0f, 0x2e, 0x92, 0xf4, 0x75, 0xeb, 0x95, 0xfe, 0xc6, 0x90, 0xbf, 0x6d, - 0xb7, 0x93, 0xc2, 0x66, 0x5d, 0xd8, 0x1f, 0x29, 0xcb, 0xf9, 0x23, 0xf1, 0xf7, 0x51, 0x24, 0x98, - 0x09, 0xf3, 0x5c, 0x47, 0xe8, 0xd2, 0x1c, 0x48, 0xba, 0xc7, 0x9d, 0xa4, 0xb7, 0x87, 0x9a, 0xeb, - 0xc6, 0x16, 0x34, 0x86, 0xb5, 0xa5, 0x39, 0xc8, 0x2f, 0xe9, 0x1d, 0x07, 0x5b, 0xe8, 0x11, 0x36, - 0xd3, 0x7d, 0x65, 0x8a, 0x03, 0xc0, 0x22, 0xe4, 0x37, 0x49, 0x69, 0xcc, 0x64, 0xbe, 0x49, 0xac, - 0xf5, 0x50, 0x0e, 0x55, 0xf6, 0x6f, 0xd2, 0xe8, 0x7c, 0x3d, 0x64, 0x46, 0x36, 0x45, 0x4e, 0x10, - 0x9d, 0x6f, 0x30, 0x0b, 0x63, 0xb9, 0x98, 0x2a, 0xaf, 0xe2, 0x1d, 0x77, 0x8c, 0xbf, 0x90, 0x1e, - 0xc2, 0x05, 0x90, 0xf5, 0xb6, 0x4d, 0x3a, 0xc7, 0x29, 0xd5, 0x7d, 0x4c, 0xea, 0x2b, 0xd4, 0x2b, - 0x2a, 0xca, 0xf2, 0xb8, 0x7d, 0x85, 0x84, 0xb8, 0x48, 0x1f, 0xb3, 0xef, 0x12, 0x47, 0xd1, 0x6e, - 0x47, 0x6b, 0x61, 0x97, 0xfb, 0xd4, 0x50, 0xa3, 0x3d, 0x59, 0xd6, 0xeb, 0xc9, 0x42, 0xed, 0x34, - 0x77, 0x80, 0x76, 0x3a, 0xec, 0x32, 0xa4, 0x2f, 0x73, 0x52, 0xf1, 0x43, 0x5b, 0x86, 0x8c, 0x65, - 0x63, 0x0c, 0xd7, 0x8e, 0x7a, 0x07, 0x69, 0xc7, 0xda, 0x5a, 0x87, 0xdd, 0xa4, 0x61, 0xc2, 0x1a, - 0xd9, 0xa1, 0xd9, 0x61, 0x36, 0x69, 0xa2, 0x79, 0x18, 0x03, 0x5a, 0x73, 0x0c, 0xad, 0xcf, 0xb1, - 0x61, 0x34, 0xe5, 0x7d, 0x52, 0xdb, 0xb4, 0x9c, 0x64, 0xfb, 0xa4, 0x2e, 0x77, 0x2a, 0xf9, 0x2f, - 0xe9, 0xc1, 0x2b, 0xfe, 0x5c, 0xf5, 0xa8, 0x86, 0xcf, 0x04, 0x07, 0xaf, 0x06, 0x31, 0x90, 0x3e, - 0xbc, 0x6f, 0x3e, 0xa4, 0xc1, 0x73, 0xd8, 0xe6, 0xc8, 0xda, 0xc0, 0xc8, 0x86, 0xce, 0x61, 0x9a, - 0x63, 0x34, 0x0f, 0xe9, 0xe3, 0xf5, 0xad, 0xd0, 0xc0, 0xf9, 0xc6, 0x31, 0x0e, 0x9c, 0x5e, 0xcb, - 0xcc, 0x0d, 0xd9, 0x32, 0x87, 0xdd, 0xff, 0x61, 0xb2, 0x1e, 0xdd, 0x80, 0x39, 0xcc, 0xfe, 0x4f, - 0x0c, 0x13, 0xe9, 0x23, 0xfe, 0x26, 0x19, 0x72, 0xf5, 0xf1, 0x8f, 0x97, 0xc3, 0xce, 0x45, 0x88, - 0xac, 0xea, 0x23, 0x1b, 0x2e, 0x87, 0x99, 0x8b, 0x44, 0xb2, 0x30, 0x86, 0xc0, 0xfb, 0x47, 0x61, - 0x86, 0x2c, 0x89, 0x78, 0xdb, 0xac, 0xdf, 0x62, 0xa3, 0xe6, 0xc3, 0x29, 0xb6, 0xd5, 0x7b, 0x61, - 0xd2, 0xdb, 0xbf, 0x63, 0x23, 0xe7, 0xbc, 0x58, 0xfb, 0xf4, 0xb8, 0x54, 0xfd, 0xff, 0x0f, 0xe4, - 0x0c, 0x31, 0xf2, 0xbd, 0xda, 0x61, 0x9d, 0x21, 0x0e, 0x75, 0xbf, 0xf6, 0x4f, 0x82, 0x11, 0xf5, - 0xbf, 0xa4, 0x87, 0x79, 0xef, 0x3e, 0x6e, 0xb6, 0xcf, 0x3e, 0xee, 0x47, 0xc3, 0x58, 0xd6, 0x79, - 0x2c, 0xef, 0x14, 0x15, 0xe1, 0x08, 0xc7, 0xda, 0x77, 0xf9, 0x70, 0x9e, 0xe5, 0xe0, 0x5c, 0x38, - 0x10, 0x2f, 0x63, 0x38, 0xf8, 0x98, 0x0d, 0xc6, 0xdc, 0x8f, 0xa5, 0xd8, 0x8e, 0x7b, 0x4e, 0x55, - 0x64, 0xf7, 0x9d, 0xaa, 0xe0, 0x5a, 0x7a, 0xee, 0x80, 0x2d, 0xfd, 0x63, 0x61, 0xed, 0x68, 0xf0, - 0xda, 0x71, 0x97, 0x38, 0x22, 0xa3, 0x1b, 0x99, 0xdf, 0xed, 0xab, 0xc7, 0x39, 0x4e, 0x3d, 0x4a, - 0x07, 0x63, 0x26, 0x7d, 0xfd, 0xf8, 0x84, 0x37, 0xa1, 0x3d, 0xe4, 0xf6, 0x3e, 0xec, 0x56, 0x31, - 0x27, 0xc4, 0x91, 0x8d, 0xdc, 0xc3, 0x6c, 0x15, 0x0f, 0xe2, 0x64, 0x0c, 0xb1, 0xd8, 0x66, 0x61, - 0x9a, 0xf0, 0x74, 0x4e, 0x6f, 0x6f, 0x61, 0x07, 0xbd, 0x8a, 0xfa, 0x28, 0x7a, 0x91, 0x2f, 0x47, - 0x14, 0x9e, 0x28, 0xea, 0xbc, 0x6b, 0x52, 0x8f, 0x0e, 0xca, 0xe4, 0x7c, 0x88, 0xc1, 0x71, 0x47, - 0x50, 0x1c, 0xc8, 0x41, 0xfa, 0x90, 0x7d, 0x98, 0xba, 0xdb, 0xac, 0x6a, 0x97, 0xcc, 0x5d, 0x07, - 0x3d, 0x34, 0x82, 0x0e, 0x7a, 0x01, 0xf2, 0x1d, 0x42, 0x8d, 0x1d, 0xcb, 0x88, 0x9f, 0xee, 0x30, - 0x11, 0xd0, 0xf2, 0x55, 0xf6, 0x67, 0xd2, 0xb3, 0x19, 0x81, 0x1c, 0x29, 0x9d, 0x71, 0x9f, 0xcd, - 0x18, 0x50, 0xfe, 0x58, 0xee, 0xd8, 0x99, 0x74, 0x4b, 0xd7, 0x77, 0x74, 0x67, 0x44, 0x11, 0x1c, - 0x3a, 0x2e, 0x2d, 0x2f, 0x82, 0x03, 0x79, 0x49, 0x7a, 0x62, 0x34, 0x24, 0x15, 0xf7, 0xf7, 0x71, - 0x9f, 0x18, 0x8d, 0x2f, 0x3e, 0x7d, 0x4c, 0x7e, 0x8d, 0xb6, 0xac, 0xb3, 0xd4, 0xf9, 0x36, 0x45, - 0xbf, 0xde, 0xa1, 0x1b, 0x0b, 0x65, 0xed, 0xf0, 0x1a, 0x4b, 0xdf, 0xf2, 0xd3, 0x07, 0xe6, 0xbf, - 0xff, 0x28, 0xe4, 0x16, 0xf1, 0xf9, 0xdd, 0x2d, 0x74, 0x07, 0x4c, 0x36, 0x2c, 0x8c, 0x2b, 0xc6, - 0xa6, 0xe9, 0x4a, 0xd7, 0x71, 0x9f, 0x3d, 0x48, 0xd8, 0x9b, 0x8b, 0xc7, 0x36, 0xd6, 0xda, 0xc1, - 0xf9, 0x33, 0xef, 0x15, 0xbd, 0x44, 0x82, 0x6c, 0xdd, 0xd1, 0x1c, 0x34, 0xe5, 0x63, 0x8b, 0x1e, - 0x0a, 0x63, 0x71, 0x07, 0x8f, 0xc5, 0xf5, 0x9c, 0x2c, 0x08, 0x07, 0xf3, 0xee, 0xff, 0x11, 0x00, - 0x20, 0x98, 0x7c, 0xc0, 0x36, 0x0d, 0x37, 0x87, 0x77, 0x04, 0xd2, 0x7b, 0x47, 0xaf, 0xf0, 0xc5, - 0x7d, 0x37, 0x27, 0xee, 0xc7, 0x8b, 0x15, 0x31, 0x86, 0x95, 0x36, 0x09, 0xa6, 0x5c, 0xd1, 0xae, - 0x60, 0xad, 0x6d, 0xa3, 0x1f, 0x09, 0x94, 0x3f, 0x42, 0xcc, 0xe8, 0xfd, 0xc2, 0xc1, 0x38, 0x69, - 0xad, 0x7c, 0xe2, 0xd1, 0x1e, 0x1d, 0xde, 0xe6, 0xbf, 0xc4, 0x07, 0x23, 0xb9, 0x19, 0xb2, 0xba, - 0xb1, 0x69, 0x32, 0xff, 0xc2, 0x2b, 0x23, 0x68, 0xbb, 0x3a, 0xa1, 0x92, 0x8c, 0x82, 0x91, 0x3a, - 0xe3, 0xd9, 0x1a, 0xcb, 0xa5, 0x77, 0x59, 0xb7, 0x74, 0xf4, 0xff, 0x1f, 0x28, 0x6c, 0x45, 0x81, - 0x6c, 0x57, 0x73, 0xb6, 0x59, 0xd1, 0xe4, 0xd9, 0xb5, 0x91, 0x77, 0x0d, 0xcd, 0x30, 0x8d, 0x4b, - 0x3b, 0xfa, 0x33, 0xfc, 0xbb, 0x75, 0xb9, 0x34, 0x97, 0xf3, 0x2d, 0x6c, 0x60, 0x4b, 0x73, 0x70, - 0x7d, 0x6f, 0x8b, 0xcc, 0xb1, 0x26, 0xd5, 0x70, 0x52, 0x62, 0xfd, 0x77, 0x39, 0x8e, 0xd6, 0xff, - 0x4d, 0xbd, 0x83, 0x49, 0xa4, 0x26, 0xa6, 0xff, 0xde, 0x7b, 0x22, 0xfd, 0xef, 0x53, 0x44, 0xfa, - 0x68, 0x7c, 0x4f, 0x82, 0x99, 0xba, 0xab, 0x70, 0xf5, 0xdd, 0x9d, 0x1d, 0xcd, 0xba, 0x84, 0xae, - 0x0d, 0x50, 0x09, 0xa9, 0x66, 0x86, 0xf7, 0x4b, 0xf9, 0x43, 0xe1, 0x6b, 0xa5, 0x59, 0xd3, 0x0e, - 0x95, 0x90, 0xb8, 0x1d, 0x3c, 0x11, 0x72, 0xae, 0x7a, 0x7b, 0x1e, 0x97, 0xb1, 0x0d, 0x81, 0xe6, - 0x14, 0x8c, 0x68, 0x35, 0x90, 0xb7, 0x31, 0x44, 0xd3, 0x90, 0xe0, 0x68, 0xdd, 0xd1, 0x5a, 0x17, - 0x96, 0x4d, 0xcb, 0xdc, 0x75, 0x74, 0x03, 0xdb, 0xe8, 0x31, 0x01, 0x02, 0x9e, 0xfe, 0x67, 0x02, - 0xfd, 0x47, 0xff, 0x9e, 0x11, 0x1d, 0x45, 0xfd, 0x6e, 0x35, 0x4c, 0x3e, 0x22, 0x40, 0x95, 0xd8, - 0xb8, 0x28, 0x42, 0x31, 0x7d, 0xa1, 0xbd, 0x51, 0x86, 0x42, 0xf9, 0xc1, 0xae, 0x69, 0x39, 0xab, - 0x66, 0x4b, 0xeb, 0xd8, 0x8e, 0x69, 0x61, 0x54, 0x8b, 0x95, 0x9a, 0xdb, 0xc3, 0xb4, 0xcd, 0x56, - 0x30, 0x38, 0xb2, 0xb7, 0xb0, 0xda, 0xc9, 0xbc, 0x8e, 0x7f, 0x58, 0x78, 0x97, 0x91, 0x4a, 0xa5, - 0x97, 0xa3, 0x08, 0x3d, 0xef, 0xd7, 0xa5, 0x25, 0x3b, 0x2c, 0x21, 0xb6, 0xf3, 0x28, 0xc4, 0xd4, - 0x18, 0x96, 0xca, 0x25, 0x98, 0xad, 0xef, 0x9e, 0xf7, 0x89, 0xd8, 0x61, 0x23, 0xe4, 0xd5, 0xc2, - 0x51, 0x2a, 0x98, 0xe2, 0x85, 0x09, 0x45, 0xc8, 0xf7, 0x3a, 0x98, 0xb5, 0xc3, 0xd9, 0x18, 0xde, - 0x7c, 0xa2, 0x60, 0x74, 0x8a, 0xc1, 0xa5, 0xa6, 0x2f, 0xc0, 0x77, 0x4b, 0x30, 0x5b, 0xeb, 0x62, - 0x03, 0xb7, 0xa9, 0x17, 0x24, 0x27, 0xc0, 0x97, 0x24, 0x14, 0x20, 0x47, 0x28, 0x42, 0x80, 0x81, - 0xc7, 0xf2, 0xa2, 0x27, 0xbc, 0x20, 0x21, 0x91, 0xe0, 0xe2, 0x4a, 0x4b, 0x5f, 0x70, 0x5f, 0x92, - 0x60, 0x5a, 0xdd, 0x35, 0xd6, 0x2d, 0xd3, 0x1d, 0x8d, 0x2d, 0x74, 0x67, 0xd0, 0x41, 0xdc, 0x04, - 0xc7, 0xda, 0xbb, 0x16, 0x59, 0x7f, 0xaa, 0x18, 0x75, 0xdc, 0x32, 0x8d, 0xb6, 0x4d, 0xea, 0x91, - 0x53, 0xf7, 0x7f, 0xb8, 0x3d, 0xfb, 0x9c, 0xaf, 0xcb, 0x19, 0xf4, 0x3c, 0xe1, 0x50, 0x37, 0xb4, - 0xf2, 0xa1, 0xa2, 0xc5, 0x7b, 0x02, 0xc1, 0x80, 0x36, 0x83, 0x4a, 0x48, 0x5f, 0xb8, 0x9f, 0x93, - 0x40, 0x29, 0xb6, 0x5a, 0xe6, 0xae, 0xe1, 0xd4, 0x71, 0x07, 0xb7, 0x9c, 0x86, 0xa5, 0xb5, 0x70, - 0xd8, 0x7e, 0x2e, 0x80, 0xdc, 0xd6, 0x2d, 0xd6, 0x07, 0xbb, 0x8f, 0x4c, 0x8e, 0x2f, 0x11, 0xde, - 0x71, 0xa4, 0xb5, 0xdc, 0x5f, 0x4a, 0x02, 0x71, 0x8a, 0xed, 0x2b, 0x0a, 0x16, 0x94, 0xbe, 0x54, - 0x3f, 0x26, 0xc1, 0x94, 0xd7, 0x63, 0x6f, 0x89, 0x08, 0xf3, 0xd7, 0x12, 0x4e, 0x46, 0x7c, 0xe2, - 0x09, 0x64, 0xf8, 0xf6, 0x04, 0xb3, 0x8a, 0x28, 0xfa, 0xc9, 0x44, 0x57, 0x4c, 0x2e, 0x3a, 0xf7, - 0xb5, 0x5a, 0x6b, 0x2e, 0xd5, 0x56, 0x17, 0xcb, 0x6a, 0x41, 0x46, 0x8f, 0x48, 0x90, 0x5d, 0xd7, - 0x8d, 0xad, 0x70, 0x74, 0xa5, 0xe3, 0xae, 0x1d, 0xd9, 0xc6, 0x0f, 0xb2, 0x96, 0x4e, 0x5f, 0x94, - 0x5b, 0xe1, 0xb8, 0xb1, 0xbb, 0x73, 0x1e, 0x5b, 0xb5, 0x4d, 0x32, 0xca, 0xda, 0x0d, 0xb3, 0x8e, - 0x0d, 0x6a, 0x84, 0xe6, 0xd4, 0xbe, 0xdf, 0x78, 0x13, 0x4c, 0x60, 0xf2, 0xe0, 0x72, 0x12, 0x21, - 0x71, 0x9f, 0x29, 0x29, 0xc4, 0x54, 0xa2, 0x69, 0x43, 0x1f, 0xe2, 0xe9, 0x6b, 0xea, 0x1f, 0xe5, - 0xe0, 0x44, 0xd1, 0xb8, 0x44, 0x6c, 0x0a, 0xda, 0xc1, 0x97, 0xb6, 0x35, 0x63, 0x0b, 0x93, 0x01, - 0xc2, 0x97, 0x78, 0x38, 0x44, 0x7f, 0x86, 0x0f, 0xd1, 0xaf, 0xa8, 0x30, 0x61, 0x5a, 0x6d, 0x6c, - 0x2d, 0x5c, 0x22, 0x3c, 0xf5, 0x2e, 0x3b, 0xb3, 0x36, 0xd9, 0xaf, 0x88, 0x79, 0x46, 0x7e, 0xbe, - 0x46, 0xff, 0x57, 0x3d, 0x42, 0x67, 0x6e, 0x82, 0x09, 0x96, 0xa6, 0xcc, 0xc0, 0x64, 0x4d, 0x5d, - 0x2c, 0xab, 0xcd, 0xca, 0x62, 0xe1, 0x88, 0x72, 0x19, 0x1c, 0xad, 0x34, 0xca, 0x6a, 0xb1, 0x51, - 0xa9, 0x55, 0x9b, 0x24, 0xbd, 0x90, 0x41, 0xcf, 0xce, 0x8a, 0x7a, 0xf6, 0xc6, 0x33, 0xd3, 0x0f, - 0x56, 0x15, 0x26, 0x5a, 0x34, 0x03, 0x19, 0x42, 0xa7, 0x13, 0xd5, 0x8e, 0x11, 0xa4, 0x09, 0xaa, - 0x47, 0x48, 0x39, 0x0d, 0x70, 0xd1, 0x32, 0x8d, 0xad, 0xe0, 0xd4, 0xe1, 0xa4, 0x1a, 0x4a, 0x41, - 0x0f, 0x65, 0x20, 0x4f, 0xff, 0x21, 0x57, 0x92, 0x90, 0xa7, 0x40, 0xf0, 0xde, 0xbb, 0x6b, 0xf1, - 0x12, 0x79, 0x05, 0x13, 0x2d, 0xf6, 0xea, 0xea, 0x22, 0x95, 0x01, 0xb5, 0x84, 0x59, 0x55, 0x6e, - 0x86, 0x3c, 0xfd, 0x97, 0x79, 0x1d, 0x44, 0x87, 0x17, 0xa5, 0xd9, 0x04, 0xfd, 0x94, 0xc5, 0x65, - 0x9a, 0xbe, 0x36, 0x7f, 0x40, 0x82, 0xc9, 0x2a, 0x76, 0x4a, 0xdb, 0xb8, 0x75, 0x01, 0x3d, 0x8e, - 0x5f, 0x00, 0xed, 0xe8, 0xd8, 0x70, 0xee, 0xdf, 0xe9, 0xf8, 0x0b, 0xa0, 0x5e, 0x02, 0x7a, 0x6e, - 0xb8, 0xf3, 0xbd, 0x87, 0xd7, 0x9f, 0x1b, 0xfb, 0xd4, 0xd5, 0x2b, 0x21, 0x42, 0x65, 0x4e, 0x42, - 0xde, 0xc2, 0xf6, 0x6e, 0xc7, 0x5b, 0x44, 0x63, 0x6f, 0xe8, 0x35, 0xbe, 0x38, 0x4b, 0x9c, 0x38, - 0x6f, 0x16, 0x2f, 0x62, 0x0c, 0xf1, 0x4a, 0xb3, 0x30, 0x51, 0x31, 0x74, 0x47, 0xd7, 0x3a, 0xe8, - 0x79, 0x59, 0x98, 0xad, 0x63, 0x67, 0x5d, 0xb3, 0xb4, 0x1d, 0xec, 0x60, 0xcb, 0x46, 0xdf, 0xe1, - 0xfb, 0x84, 0x6e, 0x47, 0x73, 0x36, 0x4d, 0x6b, 0xc7, 0x53, 0x4d, 0xef, 0xdd, 0x55, 0xcd, 0x3d, - 0x6c, 0xd9, 0x01, 0x5f, 0xde, 0xab, 0xfb, 0xe5, 0xa2, 0x69, 0x5d, 0x70, 0x07, 0x41, 0x36, 0x4d, - 0x63, 0xaf, 0x2e, 0xbd, 0x8e, 0xb9, 0xb5, 0x8a, 0xf7, 0xb0, 0x17, 0x2e, 0xcd, 0x7f, 0x77, 0xe7, - 0x02, 0x6d, 0xb3, 0x6a, 0x3a, 0x6e, 0xa7, 0xbd, 0x6a, 0x6e, 0xd1, 0x78, 0xb1, 0x93, 0x2a, 0x9f, - 0x18, 0xe4, 0xd2, 0xf6, 0x30, 0xc9, 0x95, 0x0f, 0xe7, 0x62, 0x89, 0xca, 0x3c, 0x28, 0xfe, 0x6f, - 0x0d, 0xdc, 0xc1, 0x3b, 0xd8, 0xb1, 0x2e, 0x91, 0x6b, 0x21, 0x26, 0xd5, 0x3e, 0x5f, 0xd8, 0x00, - 0x2d, 0x3e, 0x59, 0x67, 0xd2, 0x9b, 0xe7, 0x24, 0x77, 0xa0, 0xc9, 0xba, 0x08, 0xc5, 0xb1, 0x5c, - 0x7b, 0x25, 0xbb, 0xd6, 0xcc, 0xcb, 0x64, 0xc8, 0x92, 0xc1, 0xf3, 0x4d, 0x19, 0x6e, 0x85, 0x69, - 0x07, 0xdb, 0xb6, 0xb6, 0x85, 0xbd, 0x15, 0x26, 0xf6, 0xaa, 0xdc, 0x06, 0xb9, 0x0e, 0xc1, 0x94, - 0x0e, 0x0e, 0xd7, 0x72, 0x35, 0x73, 0x0d, 0x0c, 0x97, 0x96, 0x3f, 0x12, 0x10, 0xb8, 0x55, 0xfa, - 0xc7, 0x99, 0x7b, 0x21, 0x47, 0xe1, 0x9f, 0x82, 0xdc, 0x62, 0x79, 0x61, 0x63, 0xb9, 0x70, 0xc4, - 0x7d, 0xf4, 0xf8, 0x9b, 0x82, 0xdc, 0x52, 0xb1, 0x51, 0x5c, 0x2d, 0x48, 0x6e, 0x3d, 0x2a, 0xd5, - 0xa5, 0x5a, 0x41, 0x76, 0x13, 0xd7, 0x8b, 0xd5, 0x4a, 0xa9, 0x90, 0x55, 0xa6, 0x61, 0xe2, 0x5c, - 0x51, 0xad, 0x56, 0xaa, 0xcb, 0x85, 0x1c, 0xfa, 0xdb, 0x30, 0x7e, 0xb7, 0xf3, 0xf8, 0x5d, 0x17, - 0xc5, 0x53, 0x3f, 0xc8, 0x7e, 0xd3, 0x87, 0xec, 0x4e, 0x0e, 0xb2, 0x1f, 0x15, 0x21, 0x32, 0x06, - 0x77, 0xa6, 0x3c, 0x4c, 0xac, 0x5b, 0x66, 0x0b, 0xdb, 0x36, 0xfa, 0x75, 0x09, 0xf2, 0x25, 0xcd, - 0x68, 0xe1, 0x0e, 0xba, 0x22, 0x80, 0x8a, 0xba, 0x8a, 0x66, 0xfc, 0xd3, 0x62, 0xff, 0x98, 0x11, - 0xed, 0xfd, 0x18, 0xdd, 0x79, 0x4a, 0x33, 0x42, 0x3e, 0x62, 0xbd, 0x5c, 0x2c, 0xa9, 0x31, 0x5c, - 0x8d, 0x23, 0xc1, 0x14, 0x5b, 0x0d, 0x38, 0x8f, 0xc3, 0xf3, 0xf0, 0xef, 0x64, 0x44, 0x27, 0x87, - 0x5e, 0x0d, 0x7c, 0x32, 0x11, 0xf2, 0x10, 0x9b, 0x08, 0x0e, 0xa2, 0x36, 0x86, 0xcd, 0x43, 0x09, - 0xa6, 0x37, 0x0c, 0xbb, 0x9f, 0x50, 0xc4, 0xe3, 0xe8, 0x7b, 0xd5, 0x08, 0x11, 0x3a, 0x50, 0x1c, - 0xfd, 0xc1, 0xf4, 0xd2, 0x17, 0xcc, 0x77, 0x32, 0x70, 0x7c, 0x19, 0x1b, 0xd8, 0xd2, 0x5b, 0xb4, - 0x06, 0x9e, 0x24, 0xee, 0xe4, 0x25, 0xf1, 0x38, 0x8e, 0xf3, 0x7e, 0x7f, 0xf0, 0x12, 0x78, 0xa5, - 0x2f, 0x81, 0x7b, 0x38, 0x09, 0xdc, 0x24, 0x48, 0x67, 0x0c, 0xf7, 0xa1, 0x4f, 0xc1, 0x4c, 0xd5, - 0x74, 0xf4, 0x4d, 0xbd, 0x45, 0x7d, 0xd0, 0x5e, 0x2a, 0x43, 0x76, 0x55, 0xb7, 0x1d, 0x54, 0x0c, - 0xba, 0x93, 0x6b, 0x60, 0x5a, 0x37, 0x5a, 0x9d, 0xdd, 0x36, 0x56, 0xb1, 0x46, 0xfb, 0x95, 0x49, - 0x35, 0x9c, 0x14, 0x6c, 0xed, 0xbb, 0x6c, 0xc9, 0xde, 0xd6, 0xfe, 0xa7, 0x85, 0x97, 0x61, 0xc2, - 0x2c, 0x90, 0x80, 0x94, 0x11, 0x76, 0x57, 0x11, 0x66, 0x8d, 0x50, 0x56, 0xcf, 0x60, 0xef, 0xbd, - 0x50, 0x20, 0x4c, 0x4e, 0xe5, 0xff, 0x40, 0xef, 0x15, 0x6a, 0xac, 0x83, 0x18, 0x4a, 0x86, 0xcc, - 0xd2, 0x10, 0x93, 0x64, 0x05, 0xe6, 0x2a, 0xd5, 0x46, 0x59, 0xad, 0x16, 0x57, 0x59, 0x16, 0x19, - 0x7d, 0x4f, 0x82, 0x9c, 0x8a, 0xbb, 0x9d, 0x4b, 0xe1, 0x88, 0xd1, 0xcc, 0x51, 0x3c, 0xe3, 0x3b, - 0x8a, 0x2b, 0x4b, 0x00, 0x5a, 0xcb, 0x2d, 0x98, 0x5c, 0xa9, 0x25, 0xf5, 0x8d, 0x63, 0xca, 0x55, - 0xb0, 0xe8, 0xe7, 0x56, 0x43, 0x7f, 0xa2, 0xe7, 0x0b, 0xef, 0x1c, 0x71, 0xd4, 0x08, 0x87, 0x11, - 0x7d, 0xc2, 0xfb, 0x84, 0x36, 0x7b, 0x06, 0x92, 0x3b, 0x1c, 0xf1, 0x7f, 0x59, 0x82, 0x6c, 0xc3, - 0xed, 0x2d, 0x43, 0x1d, 0xe7, 0xa7, 0x86, 0xd3, 0x71, 0x97, 0x4c, 0x84, 0x8e, 0xdf, 0x0d, 0x33, - 0x61, 0x8d, 0x65, 0xae, 0x12, 0xb1, 0x2a, 0xce, 0xfd, 0x30, 0x8c, 0x86, 0xf7, 0x61, 0xe7, 0x70, - 0x44, 0xfc, 0xf1, 0xc7, 0x03, 0xac, 0xe1, 0x9d, 0xf3, 0xd8, 0xb2, 0xb7, 0xf5, 0x2e, 0xfa, 0x3b, - 0x19, 0xa6, 0x96, 0xb1, 0x53, 0x77, 0x34, 0x67, 0xd7, 0xee, 0xd9, 0xee, 0x34, 0xcc, 0x92, 0xd6, - 0xda, 0xc6, 0xac, 0x3b, 0xf2, 0x5e, 0xd1, 0x3b, 0x65, 0x51, 0x7f, 0xa2, 0xa0, 0x9c, 0x79, 0xbf, - 0x8c, 0x08, 0x4c, 0x9e, 0x00, 0xd9, 0xb6, 0xe6, 0x68, 0x0c, 0x8b, 0x2b, 0x7a, 0xb0, 0x08, 0x08, - 0xa9, 0x24, 0x1b, 0xfa, 0x1d, 0x49, 0xc4, 0xa1, 0x48, 0xa0, 0xfc, 0x64, 0x20, 0xbc, 0x37, 0x33, - 0x04, 0x0a, 0xc7, 0x60, 0xb6, 0x5a, 0x6b, 0x34, 0x57, 0x6b, 0xcb, 0xcb, 0x65, 0x37, 0xb5, 0x20, - 0x2b, 0x27, 0x41, 0x59, 0x2f, 0xde, 0xbf, 0x56, 0xae, 0x36, 0x9a, 0xd5, 0xda, 0x62, 0x99, 0xfd, - 0x99, 0x55, 0x8e, 0xc2, 0x74, 0xa9, 0x58, 0x5a, 0xf1, 0x12, 0x72, 0xca, 0x29, 0x38, 0xbe, 0x56, - 0x5e, 0x5b, 0x28, 0xab, 0xf5, 0x95, 0xca, 0x7a, 0xd3, 0x25, 0xb3, 0x54, 0xdb, 0xa8, 0x2e, 0x16, - 0xf2, 0x0a, 0x82, 0x93, 0xa1, 0x2f, 0xe7, 0xd4, 0x5a, 0x75, 0xb9, 0x59, 0x6f, 0x14, 0x1b, 0xe5, - 0xc2, 0x84, 0x72, 0x19, 0x1c, 0x2d, 0x15, 0xab, 0x24, 0x7b, 0xa9, 0x56, 0xad, 0x96, 0x4b, 0x8d, - 0xc2, 0x24, 0xfa, 0xf7, 0x2c, 0x4c, 0x57, 0xec, 0xaa, 0xb6, 0x83, 0xcf, 0x6a, 0x1d, 0xbd, 0x8d, - 0x9e, 0x17, 0x9a, 0x79, 0x5c, 0x07, 0xb3, 0x16, 0x7d, 0xc4, 0xed, 0x86, 0x8e, 0x29, 0x9a, 0xb3, - 0x2a, 0x9f, 0xe8, 0xce, 0xc9, 0x0d, 0x42, 0xc0, 0x9b, 0x93, 0xd3, 0x37, 0x65, 0x01, 0x80, 0x3e, - 0x35, 0x82, 0xcb, 0x5d, 0xcf, 0xf4, 0xb6, 0x26, 0x6d, 0x07, 0xdb, 0xd8, 0xda, 0xd3, 0x5b, 0xd8, - 0xcb, 0xa9, 0x86, 0xfe, 0x42, 0x5f, 0x91, 0x45, 0xf7, 0x17, 0x43, 0xa0, 0x86, 0xaa, 0x13, 0xd1, - 0x1b, 0xfe, 0xa2, 0x2c, 0xb2, 0x3b, 0x28, 0x44, 0x32, 0x99, 0xa6, 0xbc, 0x50, 0x1a, 0x6e, 0xd9, - 0xb6, 0x51, 0xab, 0x35, 0xeb, 0x2b, 0x35, 0xb5, 0x51, 0x90, 0x95, 0x19, 0x98, 0x74, 0x5f, 0x57, - 0x6b, 0xd5, 0xe5, 0x42, 0x56, 0x39, 0x01, 0xc7, 0x56, 0x8a, 0xf5, 0x66, 0xa5, 0x7a, 0xb6, 0xb8, - 0x5a, 0x59, 0x6c, 0x96, 0x56, 0x8a, 0x6a, 0xbd, 0x90, 0x53, 0xae, 0x80, 0x13, 0x8d, 0x4a, 0x59, - 0x6d, 0x2e, 0x95, 0x8b, 0x8d, 0x0d, 0xb5, 0x5c, 0x6f, 0x56, 0x6b, 0xcd, 0x6a, 0x71, 0xad, 0x5c, - 0xc8, 0xbb, 0xcd, 0x9f, 0x7c, 0x0a, 0xd4, 0x66, 0x62, 0xbf, 0x32, 0x4e, 0x46, 0x28, 0xe3, 0x54, - 0xaf, 0x32, 0x42, 0x58, 0xad, 0xd4, 0x72, 0xbd, 0xac, 0x9e, 0x2d, 0x17, 0xa6, 0xfb, 0xe9, 0xda, - 0x8c, 0x72, 0x1c, 0x0a, 0x2e, 0x0f, 0xcd, 0x4a, 0xdd, 0xcb, 0xb9, 0x58, 0x98, 0x45, 0x1f, 0xcb, - 0xc3, 0x49, 0x15, 0x6f, 0xe9, 0xb6, 0x83, 0xad, 0x75, 0xed, 0xd2, 0x0e, 0x36, 0x1c, 0xaf, 0x93, - 0xff, 0x97, 0xc4, 0xca, 0xb8, 0x06, 0xb3, 0x5d, 0x4a, 0x63, 0x0d, 0x3b, 0xdb, 0x66, 0x9b, 0x8d, - 0xc2, 0x8f, 0x8b, 0xec, 0x39, 0xe6, 0xd7, 0xc3, 0xd9, 0x55, 0xfe, 0xef, 0x90, 0x6e, 0xcb, 0x31, - 0xba, 0x9d, 0x1d, 0x46, 0xb7, 0x95, 0xab, 0x60, 0x6a, 0xd7, 0xc6, 0x56, 0x79, 0x47, 0xd3, 0x3b, - 0xde, 0xe5, 0x9c, 0x7e, 0x02, 0x7a, 0x5b, 0x56, 0xf4, 0xc4, 0x4a, 0xa8, 0x2e, 0xfd, 0xc5, 0x18, - 0xd1, 0xb7, 0x9e, 0x06, 0x60, 0x95, 0xdd, 0xb0, 0x3a, 0x4c, 0x59, 0x43, 0x29, 0x2e, 0x7f, 0xe7, - 0xf5, 0x4e, 0x47, 0x37, 0xb6, 0xfc, 0x7d, 0xff, 0x20, 0x01, 0xbd, 0x50, 0x16, 0x39, 0xc1, 0x92, - 0x94, 0xb7, 0x64, 0xad, 0xe9, 0xf9, 0xd2, 0x98, 0xfb, 0xdd, 0xfd, 0x4d, 0x27, 0xaf, 0x14, 0x60, - 0x86, 0xa4, 0xb1, 0x16, 0x58, 0x98, 0x70, 0xfb, 0x60, 0x8f, 0xdc, 0x5a, 0xb9, 0xb1, 0x52, 0x5b, - 0xf4, 0xbf, 0x4d, 0xba, 0x24, 0x5d, 0x66, 0x8a, 0xd5, 0xfb, 0x49, 0x6b, 0x9c, 0x52, 0x1e, 0x03, - 0x57, 0x84, 0x3a, 0xec, 0xe2, 0xaa, 0x5a, 0x2e, 0x2e, 0xde, 0xdf, 0x2c, 0x3f, 0xbd, 0x52, 0x6f, - 0xd4, 0xf9, 0xc6, 0xe5, 0xb5, 0xa3, 0x69, 0x97, 0xdf, 0xf2, 0x5a, 0xb1, 0xb2, 0xca, 0xfa, 0xf7, - 0xa5, 0x9a, 0xba, 0x56, 0x6c, 0x14, 0x66, 0xd0, 0xcb, 0x64, 0x28, 0x2c, 0x63, 0x67, 0xdd, 0xb4, - 0x1c, 0xad, 0xb3, 0xaa, 0x1b, 0x17, 0x36, 0xac, 0x0e, 0x37, 0xd9, 0x14, 0x0e, 0xd3, 0xc1, 0x0f, - 0x91, 0x1c, 0xc1, 0xe8, 0x1d, 0xf1, 0x2e, 0xc9, 0x16, 0x28, 0x53, 0x90, 0x80, 0x9e, 0x29, 0x89, - 0x2c, 0x77, 0x8b, 0x97, 0x9a, 0x4c, 0x4f, 0x9e, 0x35, 0xee, 0xf1, 0xb9, 0x0f, 0x6a, 0x79, 0xf4, - 0x9c, 0x2c, 0x4c, 0x2e, 0xe9, 0x86, 0xd6, 0xd1, 0x9f, 0xc1, 0xc5, 0x2f, 0x0d, 0xfa, 0x98, 0x4c, - 0x4c, 0x1f, 0x23, 0x0d, 0x35, 0x7e, 0xfe, 0xaa, 0x2c, 0xba, 0xbc, 0x10, 0x92, 0xbd, 0xc7, 0x64, - 0xc4, 0xe0, 0xf9, 0x41, 0x49, 0x64, 0x79, 0x61, 0x30, 0xbd, 0x64, 0x18, 0x7e, 0xf2, 0x07, 0xc3, - 0xc6, 0xea, 0x69, 0xdf, 0x93, 0xfd, 0x54, 0x61, 0x0a, 0xfd, 0x99, 0x0c, 0x68, 0x19, 0x3b, 0x67, - 0xb1, 0xe5, 0x4f, 0x05, 0x48, 0xaf, 0xcf, 0xec, 0xed, 0x50, 0x93, 0x7d, 0x53, 0x18, 0xc0, 0x73, - 0x3c, 0x80, 0xc5, 0x98, 0xc6, 0x13, 0x41, 0x3a, 0xa2, 0xf1, 0x56, 0x20, 0x6f, 0x93, 0xef, 0x4c, - 0xcd, 0x9e, 0x18, 0x3d, 0x5c, 0x12, 0x62, 0x61, 0xea, 0x94, 0xb0, 0xca, 0x08, 0xa0, 0xef, 0xfa, - 0x93, 0xa0, 0x9f, 0xe4, 0xb4, 0x63, 0xe9, 0xc0, 0xcc, 0x26, 0xd3, 0x17, 0x2b, 0x5d, 0x75, 0xe9, - 0x67, 0xdf, 0xa0, 0x0f, 0xe6, 0xe0, 0x78, 0xbf, 0xea, 0xa0, 0xdf, 0xcd, 0x70, 0x3b, 0xec, 0x98, - 0x0c, 0xf9, 0x19, 0xb6, 0x81, 0xe8, 0xbe, 0x28, 0x4f, 0x86, 0x13, 0xfe, 0x32, 0x5c, 0xc3, 0xac, - 0xe2, 0x8b, 0x76, 0x07, 0x3b, 0x0e, 0xb6, 0x48, 0xd5, 0x26, 0xd5, 0xfe, 0x1f, 0x95, 0xa7, 0xc2, - 0xe5, 0xba, 0x61, 0xeb, 0x6d, 0x6c, 0x35, 0xf4, 0xae, 0x5d, 0x34, 0xda, 0x8d, 0x5d, 0xc7, 0xb4, - 0x74, 0x8d, 0x5d, 0x25, 0x39, 0xa9, 0x46, 0x7d, 0x56, 0x6e, 0x84, 0x82, 0x6e, 0xd7, 0x8c, 0xf3, - 0xa6, 0x66, 0xb5, 0x75, 0x63, 0x6b, 0x55, 0xb7, 0x1d, 0xe6, 0x01, 0xbc, 0x2f, 0x1d, 0xfd, 0xbd, - 0x2c, 0x7a, 0x98, 0x6e, 0x00, 0xac, 0x11, 0x1d, 0xca, 0x73, 0x65, 0x91, 0xe3, 0x71, 0xc9, 0x68, - 0x27, 0x53, 0x96, 0x67, 0x8f, 0xdb, 0x90, 0xe8, 0x3f, 0x82, 0x93, 0xae, 0x85, 0xa6, 0x7b, 0x86, - 0xc0, 0xd9, 0xb2, 0x5a, 0x59, 0xaa, 0x94, 0x5d, 0xb3, 0xe2, 0x04, 0x1c, 0x0b, 0xbe, 0x2d, 0xde, - 0xdf, 0xac, 0x97, 0xab, 0x8d, 0xc2, 0xa4, 0xdb, 0x4f, 0xd1, 0xe4, 0xa5, 0x62, 0x65, 0xb5, 0xbc, - 0xd8, 0x6c, 0xd4, 0xdc, 0x2f, 0x8b, 0xc3, 0x99, 0x16, 0xe8, 0xa1, 0x2c, 0x1c, 0x25, 0xb2, 0xbd, - 0x44, 0xa4, 0xea, 0x0a, 0xa5, 0xc7, 0xd7, 0xd6, 0x07, 0x68, 0x8a, 0x8a, 0x17, 0x7d, 0x56, 0xf8, - 0xa6, 0xcc, 0x10, 0x84, 0x3d, 0x65, 0x44, 0x68, 0xc6, 0x77, 0x24, 0x91, 0x08, 0x15, 0xc2, 0x64, - 0x93, 0x29, 0xc5, 0xbf, 0x8e, 0x7b, 0xc4, 0x89, 0x06, 0x9f, 0x58, 0x99, 0x25, 0xf2, 0xf3, 0xd3, - 0xd7, 0x2b, 0x2a, 0x51, 0x87, 0x39, 0x00, 0x92, 0x42, 0x34, 0x88, 0xea, 0x41, 0xdf, 0xf1, 0x2a, - 0x4a, 0x0f, 0x8a, 0xa5, 0x46, 0xe5, 0x6c, 0x39, 0x4a, 0x0f, 0x3e, 0x23, 0xc3, 0xe4, 0x32, 0x76, - 0xdc, 0x39, 0x95, 0x8d, 0x9e, 0x26, 0xb0, 0xfe, 0xe3, 0x9a, 0x31, 0x1d, 0xb3, 0xa5, 0x75, 0xfc, - 0x65, 0x00, 0xfa, 0x86, 0x7e, 0x61, 0x18, 0x13, 0xc4, 0x2b, 0x3a, 0x62, 0xbc, 0xfa, 0x71, 0xc8, - 0x39, 0xee, 0x67, 0xb6, 0x0c, 0xfd, 0x23, 0x91, 0xc3, 0x95, 0x4b, 0x64, 0x51, 0x73, 0x34, 0x95, - 0xe6, 0x0f, 0x8d, 0x4e, 0x82, 0xb6, 0x4b, 0x04, 0x23, 0x3f, 0x88, 0xf6, 0xe7, 0xdf, 0xca, 0x70, - 0x82, 0xb6, 0x8f, 0x62, 0xb7, 0x5b, 0x77, 0x4c, 0x0b, 0xab, 0xb8, 0x85, 0xf5, 0xae, 0xd3, 0xb3, - 0xbe, 0x67, 0xd1, 0x54, 0x6f, 0xb3, 0x99, 0xbd, 0xa2, 0xd7, 0xcb, 0xa2, 0x31, 0x98, 0xf7, 0xb5, - 0xc7, 0x9e, 0xf2, 0x22, 0x1a, 0xfb, 0x47, 0x25, 0x91, 0xa8, 0xca, 0x09, 0x89, 0x27, 0x03, 0xea, - 0x43, 0x87, 0x00, 0x94, 0xb7, 0x72, 0xa3, 0x96, 0x4b, 0xe5, 0xca, 0xba, 0x3b, 0x08, 0x5c, 0x0d, - 0x57, 0xae, 0x6f, 0xa8, 0xa5, 0x95, 0x62, 0xbd, 0xdc, 0x54, 0xcb, 0xcb, 0x95, 0x7a, 0x83, 0x39, - 0x65, 0xd1, 0xbf, 0x26, 0x94, 0xab, 0xe0, 0x54, 0x7d, 0x63, 0xa1, 0x5e, 0x52, 0x2b, 0xeb, 0x24, - 0x5d, 0x2d, 0x57, 0xcb, 0xe7, 0xd8, 0xd7, 0x49, 0xf4, 0xfe, 0x02, 0x4c, 0xbb, 0x13, 0x80, 0x3a, - 0x9d, 0x17, 0xa0, 0x6f, 0x66, 0x61, 0x5a, 0xc5, 0xb6, 0xd9, 0xd9, 0x23, 0x73, 0x84, 0x71, 0x4d, - 0x3d, 0xbe, 0x2d, 0x8b, 0x9e, 0xdf, 0x0e, 0x31, 0x3b, 0x1f, 0x62, 0x34, 0x7a, 0xa2, 0xa9, 0xed, - 0x69, 0x7a, 0x47, 0x3b, 0xcf, 0xba, 0x9a, 0x49, 0x35, 0x48, 0x50, 0xe6, 0x41, 0x31, 0x2f, 0x1a, - 0xd8, 0xaa, 0xb7, 0x2e, 0x96, 0x9d, 0xed, 0x62, 0xbb, 0x6d, 0x61, 0xdb, 0x66, 0xab, 0x17, 0x7d, - 0xbe, 0x28, 0x37, 0xc0, 0x51, 0x92, 0x1a, 0xca, 0x4c, 0x1d, 0x64, 0x7a, 0x93, 0xfd, 0x9c, 0x45, - 0xe3, 0x92, 0x97, 0x33, 0x17, 0xca, 0x19, 0x24, 0x87, 0x8f, 0x4b, 0xe4, 0xf9, 0x53, 0x3a, 0xd7, - 0xc0, 0xb4, 0xa1, 0xed, 0xe0, 0xf2, 0x83, 0x5d, 0xdd, 0xc2, 0x36, 0x71, 0x8c, 0x91, 0xd5, 0x70, - 0x12, 0xfa, 0xa0, 0xd0, 0x79, 0x73, 0x31, 0x89, 0x25, 0xd3, 0xfd, 0xe5, 0x21, 0x54, 0xbf, 0x4f, - 0x3f, 0x23, 0xa3, 0xf7, 0xcb, 0x30, 0xc3, 0x98, 0x2a, 0x1a, 0x97, 0x2a, 0x6d, 0x74, 0x35, 0x67, - 0xfc, 0x6a, 0x6e, 0x9a, 0x67, 0xfc, 0x92, 0x17, 0xf4, 0x4b, 0xb2, 0xa8, 0xbb, 0x73, 0x9f, 0x8a, - 0x93, 0x32, 0xa2, 0x1d, 0x47, 0x37, 0xcd, 0x5d, 0xe6, 0xa8, 0x3a, 0xa9, 0xd2, 0x97, 0x34, 0x17, - 0xf5, 0xd0, 0x1f, 0x08, 0x39, 0x53, 0x0b, 0x56, 0xe3, 0x90, 0x00, 0xfc, 0xb8, 0x0c, 0x73, 0x8c, - 0xab, 0x3a, 0x3b, 0xe7, 0x23, 0x74, 0xe0, 0xed, 0x97, 0x85, 0x0d, 0xc1, 0x3e, 0xf5, 0x67, 0x25, - 0x3d, 0x6a, 0x80, 0xfc, 0xb0, 0x50, 0x70, 0x34, 0xe1, 0x8a, 0x1c, 0x12, 0x94, 0x6f, 0xcf, 0xc2, - 0xf4, 0x86, 0x8d, 0x2d, 0xe6, 0xb7, 0x8f, 0x5e, 0x93, 0x05, 0x79, 0x19, 0x73, 0x1b, 0xa9, 0x2f, - 0x10, 0xf6, 0xf0, 0x0d, 0x57, 0x36, 0x44, 0xd4, 0xb5, 0x91, 0x22, 0x60, 0xbb, 0x1e, 0xe6, 0xa8, - 0x48, 0x8b, 0x8e, 0xe3, 0x1a, 0x89, 0x9e, 0x37, 0x6d, 0x4f, 0xea, 0x28, 0xb6, 0x8a, 0x48, 0x59, - 0x6e, 0x96, 0x92, 0xcb, 0xd3, 0x2a, 0xde, 0xa4, 0xf3, 0xd9, 0xac, 0xda, 0x93, 0xaa, 0xdc, 0x02, - 0x97, 0x99, 0x5d, 0x4c, 0xcf, 0xaf, 0x84, 0x32, 0xe7, 0x48, 0xe6, 0x7e, 0x9f, 0xd0, 0x37, 0x85, - 0x7c, 0x75, 0xc5, 0xa5, 0x93, 0x4c, 0x17, 0xba, 0xa3, 0x31, 0x49, 0x8e, 0x43, 0xc1, 0xcd, 0x41, - 0xf6, 0x5f, 0xd4, 0x72, 0xbd, 0xb6, 0x7a, 0xb6, 0xdc, 0x7f, 0x19, 0x23, 0x87, 0x9e, 0x2d, 0xc3, - 0xd4, 0x82, 0x65, 0x6a, 0xed, 0x96, 0x66, 0x3b, 0xe8, 0xbb, 0x12, 0xcc, 0xac, 0x6b, 0x97, 0x3a, - 0xa6, 0xd6, 0x26, 0xfe, 0xfd, 0x3d, 0x7d, 0x41, 0x97, 0x7e, 0xf2, 0xfa, 0x02, 0xf6, 0xca, 0x1f, - 0x0c, 0xf4, 0x8f, 0xee, 0x65, 0x44, 0x2e, 0xd4, 0xf4, 0xb7, 0xf9, 0xa4, 0x7e, 0xc1, 0x4a, 0x3d, - 0xbe, 0xe6, 0xc3, 0x3c, 0x45, 0x58, 0x94, 0xef, 0x17, 0x0b, 0x3f, 0x2a, 0x42, 0xf2, 0x70, 0x76, - 0xe5, 0x9f, 0x33, 0x09, 0xf9, 0x45, 0x4c, 0xac, 0xb8, 0xff, 0x21, 0xc1, 0x44, 0x1d, 0x3b, 0xc4, - 0x82, 0xbb, 0x8d, 0xf3, 0x14, 0x6e, 0x93, 0x0c, 0x81, 0x13, 0xbb, 0xf7, 0xee, 0x4e, 0xd6, 0x43, - 0xe7, 0xad, 0xc9, 0x73, 0x02, 0x8f, 0x44, 0x5a, 0xee, 0x3c, 0x2b, 0xf3, 0x40, 0x1e, 0x89, 0xb1, - 0xa4, 0xd2, 0xf7, 0xb5, 0x7a, 0xa7, 0xc4, 0x5c, 0xab, 0x42, 0xbd, 0xde, 0xab, 0xc2, 0xfa, 0x19, - 0xeb, 0x6d, 0xc6, 0x98, 0x8f, 0x71, 0x8e, 0x7a, 0x12, 0x4c, 0x50, 0x99, 0x7b, 0xf3, 0xd1, 0x5e, - 0x3f, 0x05, 0x4a, 0x82, 0x9c, 0xbd, 0xf6, 0x72, 0x0a, 0xba, 0xa8, 0x45, 0x17, 0x3e, 0x96, 0x18, - 0x04, 0x33, 0x55, 0xec, 0x5c, 0x34, 0xad, 0x0b, 0x75, 0x47, 0x73, 0x30, 0xfa, 0x57, 0x09, 0xe4, - 0x3a, 0x76, 0xc2, 0xd1, 0x4f, 0xaa, 0x70, 0x8c, 0x56, 0x88, 0x65, 0x24, 0xfd, 0x37, 0xad, 0xc8, - 0x35, 0x7d, 0x85, 0x10, 0xca, 0xa7, 0xee, 0xff, 0x15, 0xfd, 0x7a, 0xdf, 0xa0, 0x4f, 0x52, 0x9f, - 0x49, 0x03, 0x93, 0x4c, 0x98, 0x41, 0x57, 0xc1, 0x22, 0xf4, 0xf4, 0x03, 0x42, 0x66, 0xb5, 0x18, - 0xcd, 0xc3, 0xe9, 0x0a, 0x3e, 0x7c, 0x05, 0x64, 0x4b, 0xdb, 0x9a, 0x83, 0xde, 0x21, 0x03, 0x14, - 0xdb, 0xed, 0x35, 0xea, 0x03, 0x1e, 0x76, 0x48, 0x3b, 0x03, 0x33, 0xad, 0x6d, 0x2d, 0xb8, 0xdb, - 0x84, 0xf6, 0x07, 0x5c, 0x9a, 0xf2, 0xe4, 0xc0, 0x99, 0x9c, 0x4a, 0x15, 0xf5, 0xc0, 0xe4, 0x96, - 0xc1, 0x68, 0xfb, 0x8e, 0xe6, 0x7c, 0x28, 0xcc, 0xd8, 0x23, 0x74, 0xee, 0xef, 0xf3, 0x01, 0x7b, - 0xd1, 0x73, 0x38, 0x46, 0xda, 0x3f, 0x60, 0x13, 0x24, 0x24, 0x3c, 0xe9, 0x2d, 0x16, 0xd0, 0x23, - 0x9e, 0xaf, 0xb1, 0x84, 0xae, 0x55, 0xca, 0x6d, 0xdd, 0x13, 0x2d, 0x0b, 0x98, 0x85, 0x9e, 0x9f, - 0x49, 0x06, 0x5f, 0xbc, 0xe0, 0xee, 0x81, 0x59, 0xdc, 0xd6, 0x1d, 0xec, 0xd5, 0x92, 0x09, 0x30, - 0x0e, 0x62, 0xfe, 0x07, 0xf4, 0x2c, 0xe1, 0xa0, 0x6b, 0x44, 0xa0, 0xfb, 0x6b, 0x14, 0xd1, 0xfe, - 0xc4, 0xc2, 0xa8, 0x89, 0xd1, 0x4c, 0x1f, 0xac, 0x5f, 0x90, 0xe1, 0x44, 0xc3, 0xdc, 0xda, 0xea, - 0x60, 0x4f, 0x4c, 0x98, 0x7a, 0x67, 0x22, 0x6d, 0x94, 0x70, 0x91, 0x9d, 0x20, 0xf3, 0x01, 0xdd, - 0x3f, 0x4a, 0xe6, 0xbe, 0xf0, 0x27, 0xa6, 0x62, 0x67, 0x51, 0x44, 0x5c, 0x7d, 0xf9, 0x8c, 0x40, - 0x41, 0x2c, 0xe0, 0xb3, 0x30, 0xd9, 0xf4, 0x81, 0xf8, 0xa2, 0x04, 0xb3, 0xf4, 0xe6, 0x4a, 0x4f, - 0x41, 0xef, 0x1b, 0x21, 0x00, 0xe8, 0xbb, 0x19, 0x51, 0x3f, 0x5b, 0x22, 0x13, 0x8e, 0x93, 0x08, - 0x11, 0x8b, 0x05, 0x55, 0x19, 0x48, 0x2e, 0x7d, 0xd1, 0xfe, 0xb1, 0x0c, 0xd3, 0xcb, 0xd8, 0x6b, - 0x69, 0x76, 0xe2, 0x9e, 0xe8, 0x0c, 0xcc, 0x90, 0xeb, 0xdb, 0x6a, 0xec, 0x98, 0x24, 0x5d, 0x35, - 0xe3, 0xd2, 0x94, 0xeb, 0x60, 0xf6, 0x3c, 0xde, 0x34, 0x2d, 0x5c, 0xe3, 0xce, 0x52, 0xf2, 0x89, - 0x11, 0xe1, 0xe9, 0xb8, 0x38, 0x68, 0x0b, 0x3c, 0x36, 0x37, 0xed, 0x17, 0x66, 0xa8, 0x2a, 0x11, - 0x63, 0xce, 0x53, 0x60, 0x92, 0x21, 0xef, 0x99, 0x69, 0x71, 0xfd, 0xa2, 0x9f, 0x17, 0xbd, 0xce, - 0x47, 0xb4, 0xcc, 0x21, 0xfa, 0xc4, 0x24, 0x4c, 0x8c, 0xe5, 0x7e, 0xf7, 0x42, 0xa8, 0xfc, 0x85, - 0x4b, 0x95, 0xb6, 0x8d, 0xd6, 0x92, 0x61, 0x7a, 0x1a, 0xc0, 0x6f, 0x1c, 0x5e, 0x58, 0x8b, 0x50, - 0x0a, 0x1f, 0xb9, 0x3e, 0xf6, 0xa0, 0x5e, 0xaf, 0x38, 0x08, 0x3b, 0x23, 0x06, 0x46, 0xec, 0x80, - 0x9f, 0x08, 0x27, 0xe9, 0xa3, 0xf3, 0x69, 0x19, 0x4e, 0xf8, 0xe7, 0x8f, 0x56, 0x35, 0x3b, 0x68, - 0x77, 0xa5, 0x64, 0x10, 0x71, 0x07, 0x3e, 0xfc, 0xc6, 0xf2, 0xad, 0x64, 0x63, 0x46, 0x5f, 0x4e, - 0x46, 0x8b, 0x8e, 0x72, 0x13, 0x1c, 0x33, 0x76, 0x77, 0x7c, 0xa9, 0x93, 0x16, 0xcf, 0x5a, 0xf8, - 0xfe, 0x0f, 0x49, 0x46, 0x26, 0x11, 0xe6, 0xc7, 0x32, 0xa7, 0xe4, 0x8e, 0x74, 0x3d, 0x21, 0x11, - 0x8c, 0xe8, 0x9f, 0x33, 0x89, 0x7a, 0xb7, 0xc1, 0x67, 0xbe, 0x12, 0xf4, 0x52, 0x87, 0x78, 0xe0, - 0xeb, 0xcc, 0x04, 0xe4, 0xca, 0x3b, 0x5d, 0xe7, 0xd2, 0x99, 0xc7, 0xc2, 0x6c, 0xdd, 0xb1, 0xb0, - 0xb6, 0x13, 0xda, 0x19, 0x70, 0xcc, 0x0b, 0xd8, 0xf0, 0x76, 0x06, 0xc8, 0xcb, 0xed, 0xb7, 0xc1, - 0x84, 0x61, 0x36, 0xb5, 0x5d, 0x67, 0x5b, 0xb9, 0x7a, 0xdf, 0x91, 0x7a, 0x06, 0x7e, 0x8d, 0xc5, - 0x30, 0xfa, 0xca, 0x1d, 0x64, 0x6d, 0x38, 0x6f, 0x98, 0xc5, 0x5d, 0x67, 0x7b, 0xe1, 0xaa, 0x8f, - 0xff, 0xcd, 0xe9, 0xcc, 0x67, 0xfe, 0xe6, 0x74, 0xe6, 0xcb, 0x7f, 0x73, 0x3a, 0xf3, 0xcb, 0x5f, - 0x3d, 0x7d, 0xe4, 0x33, 0x5f, 0x3d, 0x7d, 0xe4, 0x8b, 0x5f, 0x3d, 0x7d, 0xe4, 0x27, 0xa5, 0xee, - 0xf9, 0xf3, 0x79, 0x42, 0xe5, 0x49, 0xff, 0x6f, 0x00, 0x00, 0x00, 0xff, 0xff, 0xb8, 0xd5, 0xc4, - 0x5d, 0x2a, 0x0a, 0x02, 0x00, + 0xa0, 0x8f, 0xcc, 0x00, 0xe2, 0x63, 0x50, 0x4f, 0x19, 0x8e, 0xd7, 0xba, 0xd8, 0x58, 0xb0, 0xb0, + 0xd6, 0x6e, 0x59, 0xbb, 0x3b, 0x97, 0xec, 0xb0, 0x33, 0x68, 0xbc, 0x8e, 0x86, 0x96, 0x8e, 0x25, + 0x6e, 0xe9, 0x18, 0xfd, 0x88, 0x2c, 0x1a, 0x08, 0x29, 0xb4, 0xc1, 0x11, 0xe2, 0x61, 0x88, 0xa1, + 0x2e, 0x91, 0x0b, 0x53, 0xcf, 0x2a, 0x71, 0x36, 0xc9, 0x2a, 0xf1, 0x1b, 0x85, 0xc2, 0x2a, 0x09, + 0xd5, 0x6b, 0x2c, 0x9e, 0x68, 0x73, 0x75, 0xec, 0x44, 0xc0, 0x7b, 0x23, 0xcc, 0x5e, 0x0a, 0xbe, + 0xf8, 0x10, 0xf3, 0x89, 0x7d, 0xfc, 0x43, 0xdf, 0x94, 0x74, 0x05, 0x86, 0x67, 0x21, 0x02, 0x5d, + 0x1f, 0x41, 0x49, 0xc4, 0x09, 0x2d, 0xd1, 0x72, 0x4a, 0x6c, 0xf9, 0xe9, 0xa3, 0xf0, 0x01, 0x09, + 0xa6, 0xc9, 0x55, 0xa8, 0x0b, 0xfb, 0xe4, 0x58, 0xa4, 0xa0, 0x51, 0xf2, 0x92, 0xb0, 0x98, 0x15, + 0xc8, 0x76, 0x74, 0xe3, 0xb2, 0xe7, 0x3d, 0xe8, 0x3e, 0x07, 0x17, 0xeb, 0x49, 0x7d, 0x2e, 0xd6, + 0xf3, 0xf7, 0x29, 0xfc, 0x72, 0x0f, 0x75, 0xd3, 0xf3, 0x40, 0x72, 0xe9, 0x8b, 0xf1, 0xef, 0xb2, + 0x90, 0xaf, 0x63, 0xcd, 0x6a, 0x6d, 0xa3, 0x77, 0x49, 0x7d, 0xa7, 0x0a, 0x93, 0xfc, 0x54, 0x61, + 0x09, 0x26, 0x36, 0xf5, 0x8e, 0x83, 0x2d, 0xea, 0x51, 0x1d, 0xee, 0xda, 0x69, 0x13, 0x5f, 0xe8, + 0x98, 0xad, 0xcb, 0xf3, 0xcc, 0x74, 0x9f, 0xf7, 0x02, 0xb1, 0xce, 0x2f, 0x91, 0x9f, 0x54, 0xef, + 0x67, 0xd7, 0x20, 0xb4, 0x4d, 0xcb, 0x89, 0xba, 0x63, 0x23, 0x82, 0x4a, 0xdd, 0xb4, 0x1c, 0x95, + 0xfe, 0xe8, 0xc2, 0xbc, 0xb9, 0xdb, 0xe9, 0x34, 0xf0, 0x23, 0x8e, 0x37, 0x6d, 0xf3, 0xde, 0x5d, + 0x63, 0xd1, 0xdc, 0xdc, 0xb4, 0x31, 0x5d, 0x34, 0xc8, 0xa9, 0xec, 0x4d, 0x39, 0x09, 0xb9, 0x8e, + 0xbe, 0xa3, 0xd3, 0x89, 0x46, 0x4e, 0xa5, 0x2f, 0xca, 0x2d, 0x50, 0x08, 0xe6, 0x38, 0x94, 0xd1, + 0x33, 0x79, 0xd2, 0x34, 0x0f, 0xa4, 0xbb, 0x3a, 0x73, 0x19, 0xef, 0xdb, 0x67, 0x26, 0xc8, 0x77, + 0xf2, 0xcc, 0x1f, 0x5f, 0x11, 0xd9, 0xef, 0xa0, 0x12, 0x8f, 0x9e, 0xc1, 0x5a, 0xb8, 0x65, 0x5a, + 0x6d, 0x4f, 0x36, 0xd1, 0x13, 0x0c, 0x96, 0x2f, 0xd9, 0x2e, 0x45, 0xdf, 0xc2, 0xd3, 0xd7, 0xb4, + 0xb7, 0xe7, 0xdd, 0x6e, 0xd3, 0x2d, 0xfa, 0xa2, 0xee, 0x6c, 0xaf, 0x61, 0x47, 0x43, 0x7f, 0x27, + 0xf7, 0xd5, 0xb8, 0xe9, 0xff, 0x4f, 0xe3, 0x06, 0x68, 0x1c, 0x0d, 0x83, 0xe5, 0xec, 0x5a, 0x86, + 0x2b, 0x47, 0xe6, 0x95, 0x1a, 0x4a, 0x51, 0xee, 0x86, 0x6b, 0x82, 0x37, 0x6f, 0xa9, 0x74, 0x91, + 0x4d, 0x5b, 0xa7, 0x48, 0xf6, 0xe8, 0x0c, 0xca, 0x3a, 0xdc, 0x40, 0x3f, 0xae, 0x34, 0xd6, 0x56, + 0x57, 0xf4, 0xad, 0xed, 0x8e, 0xbe, 0xb5, 0xed, 0xd8, 0x15, 0xc3, 0x76, 0xb0, 0xd6, 0xae, 0x6d, + 0xaa, 0xf4, 0x76, 0x1c, 0x20, 0x74, 0x44, 0xb2, 0xf2, 0x1e, 0xd7, 0x62, 0xa3, 0x5b, 0x58, 0x53, + 0x22, 0x5a, 0xca, 0xb3, 0xdc, 0x96, 0x62, 0xef, 0x76, 0x7c, 0x4c, 0xaf, 0xeb, 0xc1, 0x34, 0x50, + 0xf5, 0xdd, 0x0e, 0x69, 0x2e, 0x24, 0x73, 0xd2, 0x71, 0x2e, 0x86, 0x93, 0xf4, 0x9b, 0xcd, 0xff, + 0x93, 0x87, 0xdc, 0xb2, 0xa5, 0x75, 0xb7, 0xd1, 0x0b, 0x42, 0xfd, 0xf3, 0xa8, 0xda, 0x84, 0xaf, + 0x9d, 0xd2, 0x20, 0xed, 0x94, 0x07, 0x68, 0x67, 0x36, 0xa4, 0x9d, 0xd1, 0x8b, 0xca, 0xe7, 0x61, + 0xa6, 0x65, 0x76, 0x3a, 0xb8, 0xe5, 0xca, 0xa3, 0xd2, 0x26, 0xab, 0x39, 0x53, 0x2a, 0x97, 0x46, + 0x82, 0x55, 0x63, 0xa7, 0x4e, 0xd7, 0xd0, 0xa9, 0xd2, 0x07, 0x09, 0xe8, 0x95, 0x12, 0x64, 0xcb, + 0xed, 0x2d, 0xcc, 0xad, 0xb3, 0x67, 0x42, 0xeb, 0xec, 0xa7, 0x21, 0xef, 0x68, 0xd6, 0x16, 0x76, + 0xbc, 0x75, 0x02, 0xfa, 0xe6, 0xc7, 0xd0, 0x96, 0x43, 0x31, 0xb4, 0xbf, 0x1b, 0xb2, 0xae, 0xcc, + 0x98, 0x93, 0xf9, 0x0d, 0xfd, 0xe0, 0x27, 0xb2, 0x9f, 0x77, 0x4b, 0x9c, 0x77, 0x6b, 0xad, 0x92, + 0x1f, 0x7a, 0xb1, 0xce, 0x1d, 0xc0, 0x9a, 0x5c, 0xf4, 0xd9, 0x32, 0x8d, 0xca, 0x8e, 0xb6, 0x85, + 0x59, 0x35, 0x83, 0x04, 0xef, 0x6b, 0x79, 0xc7, 0x7c, 0x58, 0x67, 0xd1, 0x22, 0x83, 0x04, 0xb7, + 0x0a, 0xdb, 0x7a, 0xbb, 0x8d, 0x0d, 0xd6, 0xb2, 0xd9, 0xdb, 0xf9, 0xb3, 0x90, 0x75, 0x79, 0x70, + 0xf5, 0xc7, 0x35, 0x16, 0x0a, 0xc7, 0x94, 0x19, 0xb7, 0x59, 0xd1, 0xc6, 0x5b, 0xc8, 0xf0, 0x6b, + 0xaa, 0x22, 0x6e, 0x3b, 0xb4, 0x72, 0xfd, 0x1b, 0xd7, 0xd3, 0x20, 0x67, 0x98, 0x6d, 0x3c, 0x70, + 0x10, 0xa2, 0xb9, 0x94, 0x67, 0x42, 0x0e, 0xb7, 0xdd, 0x5e, 0x41, 0x26, 0xd9, 0xcf, 0xc6, 0xcb, + 0x52, 0xa5, 0x99, 0x93, 0xf9, 0x06, 0xf5, 0xe3, 0x36, 0xfd, 0x06, 0xf8, 0xe3, 0x13, 0x70, 0x9c, + 0xf6, 0x01, 0xf5, 0xdd, 0x4b, 0x2e, 0xa9, 0x4b, 0x18, 0x3d, 0xd6, 0x7f, 0xe0, 0x3a, 0xce, 0x2b, + 0xfb, 0x49, 0xc8, 0xd9, 0xbb, 0x97, 0x7c, 0x23, 0x94, 0xbe, 0x84, 0x9b, 0xae, 0x34, 0x92, 0xe1, + 0x4c, 0x1e, 0x76, 0x38, 0xe3, 0x86, 0x26, 0xd9, 0x6b, 0xfc, 0xc1, 0x40, 0x46, 0x8f, 0x47, 0x78, + 0x03, 0x59, 0xbf, 0x61, 0xe8, 0x0c, 0x4c, 0x68, 0x9b, 0x0e, 0xb6, 0x02, 0x33, 0x91, 0xbd, 0xba, + 0x43, 0xe5, 0x25, 0xbc, 0x69, 0x5a, 0xae, 0x58, 0x68, 0x08, 0x75, 0xff, 0x3d, 0xd4, 0x72, 0x81, + 0xdb, 0x21, 0xbb, 0x15, 0x4e, 0x18, 0xe6, 0x22, 0xee, 0x32, 0x39, 0x53, 0x14, 0x67, 0x49, 0x0b, + 0x38, 0xf8, 0xe1, 0x40, 0x57, 0x32, 0x77, 0xb0, 0x2b, 0x41, 0x1f, 0x4b, 0x3a, 0x67, 0xee, 0x01, + 0x7a, 0x64, 0x16, 0x9a, 0xf2, 0x1c, 0x98, 0x69, 0x33, 0x17, 0xad, 0x96, 0xee, 0xb7, 0x92, 0xc8, + 0xff, 0xb8, 0xcc, 0x81, 0x22, 0x65, 0xc3, 0x8a, 0xb4, 0x0c, 0x93, 0xe4, 0x20, 0xb3, 0xab, 0x49, + 0xb9, 0x1e, 0x97, 0x78, 0x32, 0xad, 0xf3, 0x2b, 0x15, 0x12, 0xdb, 0x7c, 0x89, 0xfd, 0xa2, 0xfa, + 0x3f, 0x27, 0x9b, 0x7d, 0xc7, 0x4b, 0x28, 0xfd, 0xe6, 0xf8, 0x6b, 0x79, 0xb8, 0xa6, 0x64, 0x99, + 0xb6, 0x4d, 0xce, 0xc0, 0xf4, 0x36, 0xcc, 0x5f, 0x96, 0xb8, 0xdb, 0x34, 0x9e, 0xd0, 0xcd, 0xaf, + 0x5f, 0x83, 0x1a, 0x5f, 0xd3, 0xf8, 0x82, 0x70, 0x08, 0x18, 0x7f, 0xff, 0x21, 0x42, 0xe8, 0xdf, + 0x1e, 0x8d, 0xe4, 0xed, 0x19, 0x91, 0xa8, 0x34, 0x09, 0x65, 0x95, 0x7e, 0x73, 0xf9, 0x8c, 0x04, + 0xd7, 0xf6, 0x72, 0xb3, 0x61, 0xd8, 0x7e, 0x83, 0xb9, 0x7e, 0x40, 0x7b, 0xe1, 0xa3, 0x98, 0xc4, + 0xde, 0x63, 0x19, 0x51, 0xf7, 0x50, 0x69, 0x11, 0x8b, 0x25, 0xc1, 0x89, 0x9a, 0xb8, 0x7b, 0x2c, + 0x13, 0x93, 0x4f, 0x5f, 0xb8, 0x1f, 0xcf, 0xc2, 0xf1, 0x65, 0xcb, 0xdc, 0xed, 0xda, 0x41, 0x0f, + 0xf4, 0xd7, 0xfd, 0x37, 0x5c, 0xf3, 0x22, 0xa6, 0xc1, 0x39, 0x98, 0xb6, 0x98, 0x35, 0x17, 0x6c, + 0xbf, 0x86, 0x93, 0xc2, 0xbd, 0x97, 0x7c, 0x98, 0xde, 0x2b, 0xe8, 0x67, 0xb2, 0x5c, 0x3f, 0xd3, + 0xdb, 0x73, 0xe4, 0xfa, 0xf4, 0x1c, 0x7f, 0x25, 0x25, 0x1c, 0x54, 0x7b, 0x44, 0x14, 0xd1, 0x5f, + 0x94, 0x20, 0xbf, 0x45, 0x32, 0xb2, 0xee, 0xe2, 0xa9, 0x62, 0x35, 0x23, 0xc4, 0x55, 0xf6, 0x6b, + 0x20, 0x57, 0x39, 0xac, 0xc3, 0x89, 0x06, 0xb8, 0x78, 0x6e, 0xd3, 0x57, 0xaa, 0xd7, 0x65, 0x61, + 0xc6, 0x2f, 0xbd, 0xd2, 0xb6, 0xd1, 0x4b, 0xfa, 0x6b, 0xd4, 0xac, 0x88, 0x46, 0x1d, 0x58, 0x67, + 0xf6, 0x47, 0x1d, 0x39, 0x34, 0xea, 0xf4, 0x1d, 0x5d, 0x66, 0x22, 0x46, 0x17, 0xf4, 0x7c, 0x59, + 0xf4, 0x3e, 0x2a, 0xbe, 0x6b, 0x25, 0xb5, 0x79, 0x22, 0x0f, 0x16, 0x82, 0xb7, 0x62, 0x0d, 0xae, + 0x55, 0xfa, 0x4a, 0xf2, 0x5e, 0x09, 0x4e, 0x1c, 0xec, 0xcc, 0xbf, 0x83, 0xf7, 0x42, 0x73, 0xeb, + 0x64, 0xfb, 0x5e, 0x68, 0xe4, 0x8d, 0xdf, 0xa4, 0x8b, 0x0d, 0x29, 0xc2, 0xd9, 0x7b, 0x83, 0x3b, + 0x71, 0xb1, 0xa0, 0x21, 0x82, 0x44, 0xd3, 0x17, 0xe0, 0x4f, 0xc9, 0x30, 0x55, 0xc7, 0xce, 0xaa, + 0xb6, 0x6f, 0xee, 0x3a, 0x48, 0x13, 0xdd, 0x9e, 0x7b, 0x36, 0xe4, 0x3b, 0xe4, 0x17, 0x76, 0xcd, + 0xff, 0xb9, 0xbe, 0xfb, 0x5b, 0xc4, 0xf7, 0x87, 0x92, 0x56, 0x59, 0x7e, 0x3e, 0x96, 0x8b, 0xc8, + 0xee, 0xa8, 0xcf, 0xdd, 0x48, 0xb6, 0x76, 0x12, 0xed, 0x9d, 0x46, 0x15, 0x9d, 0x3e, 0x2c, 0x3f, + 0x22, 0xc3, 0x6c, 0x1d, 0x3b, 0x15, 0x7b, 0x49, 0xdb, 0x33, 0x2d, 0xdd, 0xc1, 0xe1, 0x7b, 0x3e, + 0xe3, 0xa1, 0x39, 0x0b, 0xa0, 0xfb, 0xbf, 0xb1, 0x08, 0x53, 0xa1, 0x14, 0xf4, 0xab, 0x49, 0x1d, + 0x85, 0x38, 0x3e, 0x46, 0x02, 0x42, 0x22, 0x1f, 0x8b, 0xb8, 0xe2, 0xd3, 0x07, 0xe2, 0xd3, 0x12, + 0x03, 0xa2, 0x68, 0xb5, 0xb6, 0xf5, 0x3d, 0xdc, 0x4e, 0x08, 0x84, 0xf7, 0x5b, 0x00, 0x84, 0x4f, + 0x28, 0xb1, 0xfb, 0x0a, 0xc7, 0xc7, 0x28, 0xdc, 0x57, 0xe2, 0x08, 0x8e, 0x25, 0x48, 0x94, 0xdb, + 0xf5, 0xb0, 0xf5, 0xcc, 0xfb, 0x44, 0xc5, 0x1a, 0x98, 0x6c, 0x52, 0xd8, 0x64, 0x1b, 0xaa, 0x63, + 0xa1, 0x65, 0x0f, 0xd2, 0xe9, 0x6c, 0x1a, 0x1d, 0x4b, 0xdf, 0xa2, 0xd3, 0x17, 0xfa, 0x3b, 0x65, + 0x38, 0xe5, 0x47, 0x4f, 0xa9, 0x63, 0x67, 0x51, 0xb3, 0xb7, 0x2f, 0x99, 0x9a, 0xd5, 0x46, 0xa5, + 0x11, 0x9c, 0xf8, 0x43, 0x9f, 0x0a, 0x83, 0x50, 0xe5, 0x41, 0xe8, 0xeb, 0x2a, 0xda, 0x97, 0x97, + 0x51, 0x74, 0x32, 0xb1, 0xde, 0xac, 0xbf, 0xe1, 0x83, 0xf5, 0x3d, 0x1c, 0x58, 0xf7, 0x0c, 0xcb, + 0x62, 0xfa, 0xc0, 0xfd, 0x2c, 0x1d, 0x11, 0x42, 0x5e, 0xcd, 0x0f, 0x89, 0x02, 0x16, 0xe1, 0xd5, + 0x2a, 0x47, 0x7a, 0xb5, 0x0e, 0x35, 0x46, 0x0c, 0xf4, 0x48, 0x4e, 0x77, 0x8c, 0x38, 0x42, 0x6f, + 0xe3, 0xb7, 0xca, 0x50, 0x20, 0xe1, 0xb3, 0x42, 0x1e, 0xdf, 0xe1, 0x68, 0xd4, 0xf1, 0xe8, 0x1c, + 0xf0, 0x2e, 0x9f, 0x48, 0xea, 0x5d, 0x8e, 0xde, 0x92, 0xd4, 0x87, 0xbc, 0x97, 0xdb, 0x91, 0x20, + 0x96, 0xc8, 0x45, 0x7c, 0x00, 0x07, 0xe9, 0x83, 0xf6, 0xdf, 0x64, 0x00, 0xb7, 0x41, 0xb3, 0xb3, + 0x0f, 0xcf, 0x15, 0x85, 0xeb, 0xb6, 0xb0, 0x5f, 0xbd, 0x0b, 0xd4, 0xa9, 0x1e, 0xa0, 0x28, 0xc5, + 0xe0, 0x54, 0xc5, 0x63, 0x49, 0x7d, 0x2b, 0x03, 0xae, 0x46, 0x02, 0x4b, 0x22, 0x6f, 0xcb, 0xc8, + 0xb2, 0xd3, 0x07, 0xe4, 0x7f, 0x48, 0x90, 0x6b, 0x98, 0x75, 0xec, 0x1c, 0xde, 0x14, 0x48, 0x7c, + 0x6c, 0x9f, 0x94, 0x3b, 0x8a, 0x63, 0xfb, 0xfd, 0x08, 0x8d, 0x21, 0x1a, 0x99, 0x04, 0x33, 0x0d, + 0xb3, 0xe4, 0x2f, 0x4e, 0x89, 0xfb, 0xaa, 0x8a, 0xdf, 0xa9, 0xed, 0x57, 0x30, 0x28, 0xe6, 0x50, + 0x77, 0x6a, 0x0f, 0xa6, 0x97, 0xbe, 0xdc, 0xee, 0x84, 0xe3, 0x1b, 0x46, 0xdb, 0x54, 0x71, 0xdb, + 0x64, 0x2b, 0xdd, 0x8a, 0x02, 0xd9, 0x5d, 0xa3, 0x6d, 0x12, 0x96, 0x73, 0x2a, 0x79, 0x76, 0xd3, + 0x2c, 0xdc, 0x36, 0x99, 0x6f, 0x00, 0x79, 0x46, 0x5f, 0x90, 0x21, 0xeb, 0xfe, 0x2b, 0x2e, 0xea, + 0xb7, 0xca, 0x09, 0x03, 0x11, 0xb8, 0xe4, 0x47, 0x62, 0x09, 0xdd, 0x17, 0x5a, 0xfb, 0xa7, 0x1e, + 0xac, 0x37, 0x44, 0x95, 0x17, 0x12, 0x45, 0xb0, 0xe6, 0xaf, 0x9c, 0x81, 0x89, 0x4b, 0x1d, 0xb3, + 0x75, 0x39, 0x38, 0x2f, 0xcf, 0x5e, 0x95, 0x5b, 0x20, 0x67, 0x69, 0xc6, 0x16, 0x66, 0x7b, 0x0a, + 0x27, 0x7b, 0xfa, 0x42, 0xe2, 0xf5, 0xa2, 0xd2, 0x2c, 0xe8, 0x2d, 0x49, 0x42, 0x20, 0xf4, 0xa9, + 0x7c, 0x32, 0x7d, 0x58, 0x1c, 0xe2, 0x64, 0x59, 0x01, 0x66, 0x4a, 0x45, 0x7a, 0x7b, 0xfd, 0x5a, + 0xed, 0x42, 0xb9, 0x20, 0x13, 0x98, 0x5d, 0x99, 0xa4, 0x08, 0xb3, 0x4b, 0xfe, 0xdb, 0x16, 0xe6, + 0x3e, 0x95, 0x3f, 0x0a, 0x98, 0x3f, 0x22, 0xc1, 0xec, 0xaa, 0x6e, 0x3b, 0x51, 0xde, 0xfe, 0x31, + 0xd1, 0x73, 0x5f, 0x9a, 0xd4, 0x54, 0xe6, 0xca, 0x11, 0x0e, 0x9b, 0x9b, 0xc8, 0x1c, 0x8e, 0x2b, + 0x62, 0x3c, 0xc7, 0x52, 0x08, 0x07, 0xf4, 0x0e, 0x69, 0x61, 0x49, 0x26, 0x36, 0x94, 0x82, 0x42, + 0xc6, 0x6f, 0x28, 0x45, 0x96, 0x9d, 0xbe, 0x7c, 0xbf, 0x20, 0xc1, 0x09, 0xb7, 0xf8, 0xb8, 0x65, + 0xa9, 0x68, 0x31, 0x0f, 0x5c, 0x96, 0x4a, 0xbc, 0x32, 0x7e, 0x80, 0x97, 0x51, 0xac, 0x8c, 0x0f, + 0x22, 0x3a, 0x66, 0x31, 0x47, 0x2c, 0xc3, 0x0e, 0x12, 0x73, 0xcc, 0x32, 0xec, 0xf0, 0x62, 0x8e, + 0x5f, 0x8a, 0x1d, 0x52, 0xcc, 0x47, 0xb6, 0xc0, 0xfa, 0x06, 0xd9, 0x17, 0x73, 0xe4, 0xda, 0x46, + 0x8c, 0x98, 0x13, 0x9f, 0xd8, 0x45, 0x6f, 0x1b, 0x52, 0xf0, 0x23, 0x5e, 0xdf, 0x18, 0x06, 0xa6, + 0x23, 0x5c, 0xe3, 0xf8, 0x39, 0x19, 0xe6, 0x18, 0x17, 0xfd, 0xa7, 0xcc, 0x31, 0x18, 0x25, 0x9e, + 0x32, 0x27, 0x3e, 0x03, 0xc4, 0x73, 0x36, 0xfe, 0x33, 0x40, 0xb1, 0xe5, 0xa7, 0x0f, 0xce, 0x17, + 0xb3, 0x70, 0xda, 0x65, 0x61, 0xcd, 0x6c, 0xeb, 0x9b, 0xfb, 0x94, 0x8b, 0x0b, 0x5a, 0x67, 0x17, + 0xdb, 0xe8, 0xdd, 0x92, 0x28, 0x4a, 0xff, 0x09, 0xc0, 0xec, 0x62, 0x8b, 0x06, 0x52, 0x63, 0x40, + 0xdd, 0x1d, 0x55, 0xd9, 0x83, 0x25, 0xf9, 0x97, 0xc9, 0xd4, 0x3c, 0x22, 0x6a, 0x88, 0x9e, 0x6b, + 0x15, 0x4e, 0xf9, 0x5f, 0x7a, 0x1d, 0x3c, 0x32, 0x07, 0x1d, 0x3c, 0x6e, 0x06, 0x59, 0x6b, 0xb7, + 0x7d, 0xa8, 0x7a, 0x37, 0xb3, 0x49, 0x99, 0xaa, 0x9b, 0xc5, 0xcd, 0x69, 0xe3, 0xe0, 0x68, 0x5e, + 0x44, 0x4e, 0x1b, 0x3b, 0xca, 0x3c, 0xe4, 0xe9, 0x0d, 0xd9, 0xfe, 0x8a, 0x7e, 0xff, 0xcc, 0x2c, + 0x17, 0x6f, 0xda, 0xd5, 0x78, 0x35, 0xbc, 0x33, 0x91, 0x64, 0xfa, 0xf5, 0xd3, 0x81, 0x9d, 0xac, + 0x72, 0x0a, 0x76, 0xef, 0xd0, 0x94, 0xc7, 0xb3, 0x1b, 0x56, 0xec, 0x76, 0x3b, 0xfb, 0x0d, 0x16, + 0x7c, 0x25, 0xd1, 0x6e, 0x58, 0x28, 0x86, 0x8b, 0xd4, 0x1b, 0xc3, 0x25, 0xf9, 0x6e, 0x18, 0xc7, + 0xc7, 0x28, 0x76, 0xc3, 0xe2, 0x08, 0xa6, 0x2f, 0xda, 0xaf, 0xe4, 0xa9, 0xd5, 0xcc, 0x62, 0xfb, + 0xbf, 0xa1, 0xbf, 0x67, 0x35, 0xf0, 0xce, 0x2e, 0xfd, 0xc2, 0xfe, 0xc7, 0xde, 0x69, 0xa2, 0x3c, + 0x13, 0xf2, 0x9b, 0xa6, 0xb5, 0xa3, 0x79, 0x1b, 0xf7, 0xbd, 0x27, 0x45, 0x58, 0x3c, 0xfd, 0x25, + 0x92, 0x47, 0x65, 0x79, 0xdd, 0xf9, 0xc8, 0xf3, 0xf4, 0x2e, 0x8b, 0xba, 0xe8, 0x3e, 0x2a, 0x37, + 0xc2, 0x2c, 0x0b, 0xbe, 0x58, 0xc5, 0xb6, 0x83, 0xdb, 0x2c, 0x62, 0x05, 0x9f, 0xa8, 0x9c, 0x87, + 0x19, 0x96, 0xb0, 0xa4, 0x77, 0xb0, 0xcd, 0x82, 0x56, 0x70, 0x69, 0xca, 0x69, 0xc8, 0xeb, 0xf6, + 0x03, 0xb6, 0x69, 0x10, 0xff, 0xff, 0x49, 0x95, 0xbd, 0x29, 0x37, 0xc3, 0x71, 0x96, 0xcf, 0x37, + 0x56, 0xe9, 0x81, 0x9d, 0xde, 0x64, 0x57, 0xb5, 0x0c, 0x73, 0xdd, 0x32, 0xb7, 0x2c, 0x6c, 0xdb, + 0xe4, 0xd4, 0xd4, 0xa4, 0x1a, 0x4a, 0x51, 0x1e, 0x82, 0x13, 0x1d, 0xdd, 0xb8, 0x6c, 0x93, 0x20, + 0xbd, 0x4b, 0xcc, 0x6d, 0x6c, 0xa6, 0x4f, 0xf0, 0xec, 0x50, 0x63, 0x63, 0x72, 0x08, 0xff, 0xa2, + 0x1e, 0xa4, 0x82, 0xda, 0x30, 0x13, 0x7e, 0x57, 0xe6, 0x41, 0xf1, 0x7a, 0x31, 0xfb, 0xe2, 0xb6, + 0xee, 0x60, 0x97, 0x16, 0xeb, 0x6b, 0xfb, 0x7c, 0x71, 0xc5, 0x68, 0x1a, 0x9d, 0x7d, 0xd5, 0x34, + 0x1d, 0xe2, 0xd7, 0xc5, 0x0c, 0x45, 0x3e, 0x11, 0x7d, 0x62, 0x98, 0x99, 0x51, 0xe2, 0x8b, 0x1a, + 0x5c, 0x35, 0xdb, 0x6d, 0xb5, 0x30, 0x6e, 0xb3, 0xa3, 0x5b, 0xde, 0x6b, 0xc2, 0x2b, 0x1c, 0x12, + 0xcf, 0xa3, 0x8e, 0xe8, 0x0e, 0x87, 0xdf, 0x3b, 0x05, 0x79, 0x7a, 0x1f, 0x1a, 0x7a, 0xc5, 0x5c, + 0xdf, 0xd6, 0x36, 0xc7, 0xb7, 0xb6, 0x0d, 0x98, 0x31, 0x4c, 0xb7, 0xb8, 0x75, 0xcd, 0xd2, 0x76, + 0xec, 0xb8, 0x65, 0x52, 0x4a, 0xd7, 0x1f, 0x13, 0xab, 0xa1, 0xdf, 0x56, 0x8e, 0xa9, 0x1c, 0x19, + 0xe5, 0xff, 0x07, 0xc7, 0x2f, 0xb1, 0x10, 0x07, 0x36, 0xa3, 0x2c, 0x45, 0x3b, 0x11, 0xf6, 0x50, + 0x5e, 0xe0, 0xff, 0x5c, 0x39, 0xa6, 0xf6, 0x12, 0x53, 0xbe, 0x0f, 0xe6, 0xdc, 0xd7, 0xb6, 0x79, + 0xc5, 0x63, 0x5c, 0x8e, 0xb6, 0xa4, 0x7a, 0xc8, 0xaf, 0x71, 0x3f, 0xae, 0x1c, 0x53, 0x7b, 0x48, + 0x29, 0x35, 0x80, 0x6d, 0x67, 0xa7, 0xc3, 0x08, 0x67, 0xa3, 0x55, 0xb2, 0x87, 0xf0, 0x8a, 0xff, + 0xd3, 0xca, 0x31, 0x35, 0x44, 0x42, 0x59, 0x85, 0x29, 0xe7, 0x11, 0x87, 0xd1, 0xcb, 0x45, 0xef, + 0xde, 0xf7, 0xd0, 0x6b, 0x78, 0xff, 0xac, 0x1c, 0x53, 0x03, 0x02, 0x4a, 0x05, 0x26, 0xbb, 0x97, + 0x18, 0xb1, 0x7c, 0x74, 0x8b, 0xef, 0x21, 0xb6, 0x7e, 0xc9, 0xa7, 0xe5, 0xff, 0xee, 0x32, 0xd6, + 0xb2, 0xf7, 0x18, 0xad, 0x09, 0x61, 0xc6, 0x4a, 0xde, 0x3f, 0x2e, 0x63, 0x3e, 0x01, 0xa5, 0x02, + 0x53, 0xb6, 0xa1, 0x75, 0xed, 0x6d, 0xd3, 0xb1, 0xcf, 0x4c, 0xf6, 0x38, 0x7a, 0x46, 0x53, 0xab, + 0xb3, 0x7f, 0xd4, 0xe0, 0x6f, 0xe5, 0x99, 0x70, 0x6a, 0x97, 0xdc, 0xff, 0x5f, 0x7e, 0x44, 0xb7, + 0x1d, 0xdd, 0xd8, 0xf2, 0x82, 0xe4, 0xd2, 0xee, 0xb2, 0xff, 0x47, 0x65, 0x9e, 0x1d, 0xf9, 0x02, + 0xd2, 0x36, 0x51, 0xef, 0x6e, 0x23, 0x2d, 0x36, 0x74, 0xd2, 0xeb, 0x39, 0x90, 0x75, 0x3f, 0x91, + 0xee, 0x75, 0xae, 0xff, 0x4a, 0x66, 0xaf, 0xee, 0x90, 0x06, 0xec, 0xfe, 0xd4, 0xd3, 0x43, 0xcf, + 0x1c, 0xe8, 0xa1, 0xcf, 0xc1, 0xb4, 0x6e, 0xaf, 0xe9, 0x5b, 0xd4, 0x3c, 0x64, 0x0e, 0xfd, 0xe1, + 0x24, 0x3a, 0x9d, 0xae, 0xe2, 0x2b, 0xf4, 0x0a, 0x90, 0xe3, 0xde, 0x74, 0xda, 0x4b, 0x41, 0x37, + 0xc1, 0x4c, 0xb8, 0x91, 0xd1, 0x4b, 0x55, 0xf5, 0xc0, 0xb8, 0x64, 0x6f, 0xe8, 0x46, 0x98, 0xe3, + 0x75, 0x3a, 0x34, 0x86, 0xca, 0x5e, 0x57, 0x88, 0x6e, 0x80, 0xe3, 0x3d, 0x0d, 0xcb, 0x0b, 0x9a, + 0x92, 0x09, 0x82, 0xa6, 0x9c, 0x03, 0x08, 0xb4, 0xb8, 0x2f, 0x99, 0xeb, 0x61, 0xca, 0xd7, 0xcb, + 0xbe, 0x19, 0x3e, 0x97, 0x81, 0x49, 0x4f, 0xd9, 0xfa, 0x65, 0x70, 0x07, 0x50, 0x23, 0xb4, 0x43, + 0xc2, 0x86, 0x07, 0x2e, 0xcd, 0x1d, 0x28, 0x03, 0xbf, 0xe4, 0x86, 0xee, 0x74, 0xbc, 0xb3, 0x7d, + 0xbd, 0xc9, 0xca, 0x3a, 0x80, 0x4e, 0x30, 0x6a, 0x04, 0x87, 0xfd, 0x6e, 0x4f, 0xd0, 0x1e, 0xa8, + 0x3e, 0x84, 0x68, 0x9c, 0xff, 0x0e, 0x76, 0x12, 0x6f, 0x0a, 0x72, 0x34, 0x52, 0xfc, 0x31, 0x65, + 0x0e, 0xa0, 0xfc, 0xdc, 0xf5, 0xb2, 0x5a, 0x29, 0x57, 0x4b, 0xe5, 0x42, 0x06, 0xfd, 0xbc, 0x04, + 0x53, 0x7e, 0x23, 0xe8, 0x5b, 0xc9, 0x32, 0x53, 0xad, 0x81, 0xf7, 0x56, 0x1e, 0x6c, 0x54, 0x61, + 0x25, 0x7b, 0x36, 0x5c, 0xbd, 0x6b, 0xe3, 0x25, 0xdd, 0xb2, 0x1d, 0xd5, 0xbc, 0xb2, 0x64, 0x5a, + 0x7e, 0x58, 0x68, 0x16, 0xa2, 0x35, 0xea, 0xb3, 0x6b, 0x32, 0xb5, 0x31, 0x39, 0xf5, 0x85, 0x2d, + 0xb6, 0xf4, 0x1d, 0x24, 0xb8, 0x74, 0x1d, 0x4b, 0x33, 0xec, 0xae, 0x69, 0x63, 0xd5, 0xbc, 0x62, + 0x17, 0x8d, 0x76, 0xc9, 0xec, 0xec, 0xee, 0x18, 0x36, 0x33, 0x7a, 0xa2, 0x3e, 0xbb, 0xd2, 0x21, + 0xb7, 0xd2, 0xce, 0x01, 0x94, 0x6a, 0xab, 0xab, 0xe5, 0x52, 0xa3, 0x52, 0xab, 0x16, 0x8e, 0xb9, + 0xd2, 0x6a, 0x14, 0x17, 0x56, 0x5d, 0xe9, 0x7c, 0x3f, 0x4c, 0x7a, 0x6d, 0x9a, 0xc5, 0x79, 0xc9, + 0x78, 0x71, 0x5e, 0x94, 0x22, 0x4c, 0x7a, 0xad, 0x9c, 0x8d, 0x08, 0x4f, 0xee, 0x3d, 0xd7, 0xbb, + 0xa3, 0x59, 0xd4, 0x46, 0xf0, 0x88, 0x2c, 0x68, 0x36, 0x56, 0xfd, 0xdf, 0xce, 0x3f, 0x8d, 0x71, + 0xa0, 0xc0, 0x5c, 0x71, 0x75, 0xb5, 0x59, 0x53, 0x9b, 0xd5, 0x5a, 0x63, 0xa5, 0x52, 0x5d, 0xa6, + 0x23, 0x64, 0x65, 0xb9, 0x5a, 0x53, 0xcb, 0x74, 0x80, 0xac, 0x17, 0x32, 0xf4, 0x56, 0xe4, 0x85, + 0x49, 0xc8, 0x77, 0x89, 0x74, 0xd1, 0x67, 0xe4, 0x84, 0x07, 0xfa, 0x7d, 0x9c, 0x22, 0xee, 0x6d, + 0xe5, 0x9c, 0xea, 0xa5, 0x3e, 0x87, 0x5e, 0xcf, 0xc3, 0x0c, 0x35, 0x56, 0x6d, 0xb2, 0x3f, 0x41, + 0x90, 0x93, 0x55, 0x2e, 0x0d, 0x7d, 0x40, 0x4a, 0x70, 0xca, 0xbf, 0x2f, 0x47, 0xc9, 0x8c, 0x8b, + 0x3f, 0xcb, 0x0c, 0x77, 0xaf, 0x42, 0xa5, 0xda, 0x28, 0xab, 0xd5, 0xe2, 0x2a, 0xcb, 0x22, 0x2b, + 0x67, 0xe0, 0x64, 0xb5, 0xc6, 0x82, 0x16, 0xd6, 0x9b, 0x8d, 0x5a, 0xb3, 0xb2, 0xb6, 0x5e, 0x53, + 0x1b, 0x85, 0x9c, 0x72, 0x1a, 0x14, 0xfa, 0xdc, 0xac, 0xd4, 0x9b, 0xa5, 0x62, 0xb5, 0x54, 0x5e, + 0x2d, 0x2f, 0x16, 0xf2, 0xca, 0x53, 0xe0, 0x06, 0x7a, 0x4f, 0x4f, 0x6d, 0xa9, 0xa9, 0xd6, 0x2e, + 0xd6, 0x5d, 0x04, 0xd5, 0xf2, 0x6a, 0xd1, 0x55, 0xa4, 0xd0, 0xed, 0xc8, 0x13, 0xca, 0x55, 0x70, + 0x9c, 0x5c, 0x9d, 0xbe, 0x5a, 0x2b, 0x2e, 0xb2, 0xf2, 0x26, 0x95, 0xeb, 0xe0, 0x4c, 0xa5, 0x5a, + 0xdf, 0x58, 0x5a, 0xaa, 0x94, 0x2a, 0xe5, 0x6a, 0xa3, 0xb9, 0x5e, 0x56, 0xd7, 0x2a, 0xf5, 0xba, + 0xfb, 0x6f, 0x61, 0x8a, 0xdc, 0x3d, 0x4b, 0xfb, 0x4c, 0xf4, 0x2e, 0x19, 0x66, 0x2f, 0x68, 0x1d, + 0xdd, 0x1d, 0x28, 0xc8, 0xa5, 0xd4, 0x3d, 0xe7, 0x61, 0x1c, 0x72, 0x79, 0x35, 0xf3, 0xa8, 0x27, + 0x2f, 0xe8, 0x87, 0xe5, 0x84, 0xe7, 0x61, 0x18, 0x10, 0xb4, 0xc4, 0x79, 0xae, 0xb4, 0x88, 0xd9, + 0xdb, 0x6b, 0xa5, 0x04, 0xe7, 0x61, 0xc4, 0xc9, 0x27, 0x03, 0xff, 0x17, 0x46, 0x05, 0x7e, 0x01, + 0x66, 0x36, 0xaa, 0xc5, 0x8d, 0xc6, 0x4a, 0x4d, 0xad, 0x7c, 0x2f, 0x09, 0xa7, 0x3e, 0x0b, 0x53, + 0x4b, 0x35, 0x75, 0xa1, 0xb2, 0xb8, 0x58, 0xae, 0x16, 0x72, 0xca, 0xd5, 0x70, 0x55, 0xbd, 0xac, + 0x5e, 0xa8, 0x94, 0xca, 0xcd, 0x8d, 0x6a, 0xf1, 0x42, 0xb1, 0xb2, 0x4a, 0xfa, 0x88, 0x7c, 0xcc, + 0x85, 0xda, 0x13, 0xe8, 0x07, 0xb3, 0x00, 0xb4, 0xea, 0xe4, 0x36, 0xa1, 0xd0, 0xb5, 0xcb, 0x7f, + 0x9e, 0x74, 0xd2, 0x10, 0x90, 0x89, 0x68, 0xbf, 0x15, 0x98, 0xb4, 0xd8, 0x07, 0xb6, 0x3e, 0x34, + 0x88, 0x0e, 0x7d, 0xf4, 0xa8, 0xa9, 0xfe, 0xef, 0xe8, 0xdd, 0x49, 0xe6, 0x08, 0x91, 0x8c, 0x25, + 0x43, 0x72, 0x69, 0x34, 0x40, 0xa2, 0x97, 0x64, 0x60, 0x8e, 0xaf, 0x98, 0x5b, 0x09, 0x62, 0x4c, + 0x89, 0x55, 0x82, 0xff, 0x39, 0x64, 0x64, 0x9d, 0x7f, 0x06, 0x1b, 0x4e, 0xc1, 0x6b, 0x99, 0xf4, + 0x68, 0xbb, 0x67, 0xb1, 0x14, 0x32, 0x2e, 0xf3, 0xae, 0xd1, 0x51, 0x90, 0x94, 0x09, 0x90, 0x1b, + 0x8f, 0x38, 0x05, 0x19, 0x7d, 0x4e, 0x86, 0x59, 0xee, 0x5e, 0x67, 0xf4, 0xda, 0x8c, 0xc8, 0x9d, + 0xab, 0xa1, 0x1b, 0xa3, 0x33, 0x87, 0xbd, 0x31, 0xfa, 0xfc, 0x6d, 0x30, 0xc1, 0xd2, 0x88, 0x7c, + 0x6b, 0x55, 0xd7, 0x14, 0x38, 0x0e, 0xd3, 0xcb, 0xe5, 0x46, 0xb3, 0xde, 0x28, 0xaa, 0x8d, 0xf2, + 0x62, 0x21, 0xe3, 0x0e, 0x7c, 0xe5, 0xb5, 0xf5, 0xc6, 0x43, 0x05, 0x29, 0xb9, 0x8b, 0x61, 0x2f, + 0x23, 0x63, 0x76, 0x31, 0x8c, 0x2b, 0x3e, 0xfd, 0xb9, 0xea, 0xc7, 0x64, 0x28, 0x50, 0x0e, 0xca, + 0x8f, 0x74, 0xb1, 0xa5, 0x63, 0xa3, 0x85, 0xd1, 0x65, 0x91, 0x90, 0xa6, 0x07, 0x82, 0xfd, 0x91, + 0xfe, 0x3c, 0x64, 0x25, 0xd2, 0x97, 0x1e, 0x03, 0x3b, 0x7b, 0xc0, 0xc0, 0xfe, 0x68, 0x52, 0x1f, + 0xc3, 0x5e, 0x76, 0x47, 0x02, 0xd9, 0x87, 0x93, 0xf8, 0x18, 0x0e, 0xe0, 0x60, 0x2c, 0x91, 0x8a, + 0x23, 0xc6, 0xdf, 0x82, 0x8c, 0x5e, 0x2c, 0xc3, 0xf1, 0x45, 0xcd, 0xc1, 0x0b, 0xfb, 0x0d, 0xef, + 0xde, 0xc5, 0x88, 0xbb, 0x92, 0x33, 0x07, 0xee, 0x4a, 0x0e, 0xae, 0x6e, 0x94, 0x7a, 0xae, 0x6e, + 0x44, 0x6f, 0x4f, 0x7a, 0x2a, 0xb1, 0x87, 0x87, 0x91, 0x85, 0x13, 0x4e, 0x76, 0xda, 0x30, 0x9e, + 0x8b, 0xf4, 0x1b, 0xd8, 0x9b, 0xa7, 0xa0, 0x40, 0x59, 0x09, 0xb9, 0xd1, 0xfd, 0x14, 0xbb, 0x5e, + 0xbc, 0x99, 0x20, 0x6a, 0xa1, 0x17, 0x07, 0x42, 0xe2, 0xe3, 0x40, 0x70, 0xab, 0xb2, 0x72, 0xaf, + 0xeb, 0x43, 0xd2, 0xce, 0x30, 0xe4, 0x33, 0x17, 0x1d, 0x28, 0x36, 0xbd, 0xce, 0x30, 0xb6, 0xf8, + 0xf1, 0x5c, 0x81, 0xcb, 0x2e, 0xaa, 0x2c, 0x8b, 0x22, 0x13, 0x7f, 0xd3, 0x77, 0x52, 0x07, 0x6a, + 0xce, 0x67, 0x31, 0xe6, 0xfa, 0xeb, 0xf4, 0x1c, 0xa8, 0x07, 0x71, 0x90, 0x3e, 0x0a, 0xdf, 0x94, + 0x20, 0x5b, 0x37, 0x2d, 0x67, 0x54, 0x18, 0x24, 0xdd, 0xf4, 0x0d, 0x49, 0xa0, 0x1e, 0x3d, 0xe7, + 0x4c, 0x6f, 0xd3, 0x37, 0xbe, 0xfc, 0x31, 0x04, 0x7e, 0x3c, 0x0e, 0x73, 0x94, 0x13, 0xff, 0x56, + 0x94, 0x6f, 0x48, 0xb4, 0xbf, 0x7a, 0x50, 0x14, 0x91, 0xf3, 0x30, 0x13, 0xda, 0x74, 0xf5, 0x40, + 0xe1, 0xd2, 0xd0, 0x2f, 0x87, 0x71, 0x59, 0xe4, 0x71, 0xe9, 0x37, 0xe3, 0xf6, 0x2f, 0x16, 0x19, + 0x55, 0xcf, 0x94, 0x24, 0x86, 0x64, 0x4c, 0xe1, 0xe9, 0x23, 0xf2, 0xa8, 0x0c, 0x79, 0xe6, 0xf4, + 0x36, 0x52, 0x04, 0x92, 0xb6, 0x0c, 0x5f, 0x08, 0x62, 0xce, 0x71, 0xf2, 0xa8, 0x5b, 0x46, 0x7c, + 0xf9, 0xe9, 0xe3, 0xf0, 0xef, 0xcc, 0x9b, 0xb3, 0xb8, 0xa7, 0xe9, 0x1d, 0xed, 0x52, 0x27, 0x41, + 0xec, 0xe6, 0x0f, 0x24, 0x3c, 0xbf, 0xe6, 0x57, 0x95, 0x2b, 0x2f, 0x42, 0xe2, 0xdf, 0x05, 0x53, + 0xfe, 0x16, 0xa0, 0x7f, 0xbc, 0xbf, 0xc7, 0x93, 0x96, 0x7d, 0x57, 0x83, 0x9c, 0x89, 0x0e, 0xab, + 0x09, 0xf1, 0x33, 0x96, 0xc3, 0x35, 0xd3, 0xc5, 0x76, 0x7b, 0x09, 0x6b, 0xce, 0xae, 0x85, 0xdb, + 0x89, 0x86, 0x08, 0x5e, 0x44, 0x53, 0x61, 0x49, 0x70, 0xd1, 0x13, 0x57, 0x79, 0x74, 0x9e, 0x35, + 0xa0, 0x37, 0xf0, 0x78, 0x19, 0x49, 0x97, 0xf4, 0xeb, 0x3e, 0x24, 0x35, 0x0e, 0x92, 0xe7, 0x0c, + 0xc7, 0x44, 0xfa, 0x80, 0xfc, 0x8c, 0x0c, 0x73, 0xd4, 0x4e, 0x18, 0x35, 0x26, 0xbf, 0x9d, 0xd0, + 0x49, 0x26, 0x74, 0xef, 0x54, 0x98, 0x9d, 0x91, 0xc0, 0x92, 0xc4, 0xa5, 0x46, 0x8c, 0x8f, 0xf4, + 0x91, 0xf9, 0x44, 0x1e, 0x20, 0xe4, 0xf8, 0xf8, 0x81, 0x7c, 0x10, 0xc9, 0x10, 0xbd, 0x85, 0xcd, + 0x3f, 0xea, 0x5c, 0x58, 0xed, 0x90, 0x53, 0xa3, 0xbf, 0x21, 0xc5, 0x27, 0x0a, 0x8d, 0x2a, 0x7f, + 0x96, 0xd0, 0xe6, 0x65, 0x6e, 0x87, 0x03, 0x07, 0xf7, 0x21, 0x7b, 0xb9, 0x0f, 0x26, 0x30, 0x7e, + 0x07, 0xb1, 0x92, 0x0c, 0xb5, 0xd5, 0x21, 0x66, 0xf6, 0x67, 0xe0, 0xa4, 0x5a, 0x2e, 0x2e, 0xd6, + 0xaa, 0xab, 0x0f, 0x85, 0x2f, 0x21, 0x2a, 0xc8, 0xe1, 0xc9, 0x49, 0x2a, 0xb0, 0xbd, 0x3e, 0x61, + 0x1f, 0xc8, 0xcb, 0x2a, 0xf6, 0x8a, 0xfd, 0x0f, 0x27, 0xe8, 0xd5, 0x04, 0xc8, 0x1e, 0x25, 0x0a, + 0x8f, 0x42, 0xa8, 0x19, 0xfd, 0xa8, 0x0c, 0x05, 0x77, 0x3c, 0xa4, 0x5c, 0xb2, 0xdb, 0xe6, 0x6a, + 0xbc, 0x5f, 0x64, 0x97, 0xee, 0x3f, 0x05, 0x7e, 0x91, 0x5e, 0x82, 0x72, 0x13, 0xcc, 0xb5, 0xb6, + 0x71, 0xeb, 0x72, 0xc5, 0xf0, 0xf6, 0xd5, 0xe9, 0x26, 0x6c, 0x4f, 0x2a, 0x0f, 0xcc, 0x83, 0x3c, + 0x30, 0xfc, 0x24, 0x9a, 0x1b, 0xa4, 0xc3, 0x4c, 0x45, 0xe0, 0xf2, 0x07, 0x3e, 0x2e, 0x55, 0x0e, + 0x97, 0xbb, 0x86, 0xa2, 0x9a, 0x0c, 0x96, 0xea, 0x10, 0xb0, 0x20, 0x38, 0x5d, 0x5b, 0x6f, 0x54, + 0x6a, 0xd5, 0xe6, 0x46, 0xbd, 0xbc, 0xd8, 0x5c, 0xf0, 0xc0, 0xa9, 0x17, 0x64, 0xf4, 0x25, 0x09, + 0x26, 0x28, 0x5b, 0x36, 0x7a, 0x6a, 0x00, 0xc1, 0x40, 0x87, 0x50, 0xf4, 0x66, 0xe1, 0xf0, 0x0e, + 0xbe, 0x20, 0x58, 0x39, 0x11, 0xfd, 0xd4, 0xb3, 0x61, 0x82, 0x82, 0xec, 0xad, 0x68, 0x9d, 0x8d, + 0xe8, 0xa5, 0x18, 0x19, 0xd5, 0xcb, 0x2e, 0x18, 0xea, 0x61, 0x00, 0x1b, 0xe9, 0x8f, 0x2c, 0xcf, + 0xcf, 0x52, 0x33, 0xf8, 0xa2, 0xee, 0x6c, 0x13, 0x7f, 0x51, 0xf4, 0x3d, 0x22, 0xcb, 0x8b, 0xb7, + 0x42, 0x6e, 0xcf, 0xcd, 0x3d, 0xc0, 0xf7, 0x96, 0x66, 0x42, 0xbf, 0x20, 0x1c, 0x59, 0x94, 0xd3, + 0x4f, 0x9f, 0xa7, 0x08, 0x70, 0xd6, 0x20, 0xdb, 0xd1, 0x6d, 0x87, 0x8d, 0x1f, 0x77, 0x26, 0x22, + 0xe4, 0x3d, 0x54, 0x1c, 0xbc, 0xa3, 0x12, 0x32, 0xe8, 0x01, 0x98, 0x09, 0xa7, 0x0a, 0xf8, 0x1f, + 0x9f, 0x81, 0x09, 0x76, 0x2e, 0x8e, 0x2d, 0xb1, 0x7a, 0xaf, 0x82, 0xcb, 0x9a, 0x42, 0xb5, 0x4d, + 0x5f, 0x07, 0xfe, 0xef, 0xe3, 0x30, 0xb1, 0xa2, 0xdb, 0x8e, 0x69, 0xed, 0xa3, 0xc7, 0x32, 0x30, + 0x71, 0x01, 0x5b, 0xb6, 0x6e, 0x1a, 0x07, 0x5c, 0x0d, 0xce, 0xc1, 0x74, 0xd7, 0xc2, 0x7b, 0xba, + 0xb9, 0x6b, 0x07, 0x8b, 0x33, 0xe1, 0x24, 0x05, 0xc1, 0xa4, 0xb6, 0xeb, 0x6c, 0x9b, 0x56, 0x10, + 0x4e, 0xc3, 0x7b, 0x57, 0xce, 0x02, 0xd0, 0xe7, 0xaa, 0xb6, 0x83, 0x99, 0x03, 0x45, 0x28, 0x45, + 0x51, 0x20, 0xeb, 0xe8, 0x3b, 0x98, 0xc5, 0xd7, 0x25, 0xcf, 0xae, 0x80, 0x49, 0xac, 0x3a, 0x16, + 0x13, 0x50, 0x56, 0xbd, 0x57, 0xf4, 0x29, 0x19, 0xa6, 0x97, 0xb1, 0xc3, 0x58, 0xb5, 0xd1, 0x4b, + 0x33, 0x42, 0x57, 0x5a, 0xb8, 0x63, 0x6c, 0x47, 0xb3, 0xbd, 0xff, 0xfc, 0x25, 0x58, 0x3e, 0x31, + 0x08, 0xf6, 0x2b, 0x87, 0x23, 0x7d, 0x93, 0xc8, 0x6f, 0x4e, 0x85, 0x3a, 0x96, 0xb2, 0xcc, 0x6c, + 0x13, 0xe4, 0xe0, 0x07, 0xf4, 0x0e, 0x49, 0xf4, 0xd4, 0x34, 0x93, 0xfd, 0x7c, 0xa8, 0x3e, 0x91, + 0xdd, 0xd1, 0xe4, 0x1e, 0xcb, 0x71, 0x20, 0x88, 0x7b, 0x98, 0x12, 0x23, 0xa3, 0xfa, 0xb9, 0x05, + 0xcf, 0x5b, 0x0f, 0xe6, 0x24, 0x7d, 0x6d, 0xfc, 0x9a, 0x0c, 0xd3, 0xf5, 0x6d, 0xf3, 0x8a, 0x27, + 0xc7, 0xef, 0x17, 0x03, 0xf6, 0x3a, 0x98, 0xda, 0xeb, 0x01, 0x35, 0x48, 0x88, 0xbe, 0x64, 0x1e, + 0xbd, 0x48, 0x4e, 0x0a, 0x53, 0x88, 0xb9, 0x91, 0x5f, 0x01, 0xaf, 0x3c, 0x0b, 0x26, 0x18, 0xd7, + 0x6c, 0xc9, 0x25, 0x1e, 0x60, 0x2f, 0x73, 0xb8, 0x82, 0x59, 0xbe, 0x82, 0xc9, 0x90, 0x8f, 0xae, + 0x5c, 0xfa, 0xc8, 0xff, 0xb1, 0x44, 0xa2, 0x6d, 0x78, 0xc0, 0x97, 0x46, 0x00, 0x3c, 0xfa, 0x7a, + 0x46, 0x74, 0x61, 0xd2, 0x97, 0x80, 0xcf, 0xc1, 0xa1, 0xae, 0xab, 0x19, 0x48, 0x2e, 0x7d, 0x79, + 0xfe, 0x7c, 0x16, 0x66, 0x16, 0xf5, 0xcd, 0x4d, 0xbf, 0x93, 0x7c, 0x99, 0x60, 0x27, 0x19, 0xed, + 0x0e, 0xe0, 0xda, 0xb9, 0xbb, 0x96, 0x85, 0x0d, 0xaf, 0x52, 0xac, 0x39, 0xf5, 0xa4, 0x2a, 0x37, + 0xc3, 0x71, 0x6f, 0x5c, 0x08, 0x77, 0x94, 0x53, 0x6a, 0x6f, 0x32, 0xfa, 0xaa, 0xf0, 0xae, 0x96, + 0x27, 0xd1, 0x70, 0x95, 0x22, 0x1a, 0xe0, 0xdd, 0x30, 0xbb, 0x4d, 0x73, 0x93, 0xa9, 0xbf, 0xd7, + 0x59, 0x9e, 0xee, 0x89, 0x66, 0xbc, 0x86, 0x6d, 0x5b, 0xdb, 0xc2, 0x2a, 0x9f, 0xb9, 0xa7, 0xf9, + 0xca, 0x49, 0xee, 0xe6, 0x12, 0xdb, 0x20, 0x13, 0xa8, 0xc9, 0x18, 0xb4, 0xe3, 0x3c, 0x64, 0x97, + 0xf4, 0x0e, 0x46, 0x3f, 0x26, 0xc1, 0x94, 0x8a, 0x5b, 0xa6, 0xd1, 0x72, 0xdf, 0x42, 0xce, 0x41, + 0xff, 0x98, 0x11, 0xbd, 0x93, 0xd2, 0xa5, 0x33, 0xef, 0xd3, 0x88, 0x68, 0x37, 0x62, 0x77, 0x4f, + 0xc6, 0x92, 0x1a, 0xc3, 0x0d, 0x22, 0xee, 0xd4, 0x63, 0x73, 0xb3, 0x63, 0x6a, 0xdc, 0xe2, 0x57, + 0xaf, 0x29, 0x74, 0x0b, 0x14, 0xbc, 0x43, 0x2c, 0xa6, 0xb3, 0xae, 0x1b, 0x86, 0x7f, 0x4a, 0xfa, + 0x40, 0x3a, 0xbf, 0x6f, 0x1b, 0x1b, 0x68, 0x86, 0xd4, 0x9d, 0x95, 0x1e, 0xa1, 0xd9, 0x37, 0xc1, + 0xdc, 0xa5, 0x7d, 0x07, 0xdb, 0x2c, 0x17, 0x2b, 0x36, 0xab, 0xf6, 0xa4, 0x86, 0xc2, 0x44, 0xc7, + 0x05, 0xa4, 0x89, 0x29, 0x30, 0x99, 0xa8, 0x57, 0x86, 0x98, 0x01, 0x9e, 0x84, 0x42, 0xb5, 0xb6, + 0x58, 0x26, 0xbe, 0x6a, 0x9e, 0xf7, 0xcf, 0x16, 0x7a, 0xb9, 0x0c, 0x33, 0xc4, 0x99, 0xc4, 0x43, + 0xe1, 0x06, 0x81, 0xf9, 0x08, 0x7a, 0x5c, 0xd8, 0x8f, 0x8d, 0x54, 0x39, 0x5c, 0x40, 0xb4, 0xa0, + 0x37, 0xf5, 0x4e, 0xaf, 0xa0, 0x73, 0x6a, 0x4f, 0x6a, 0x1f, 0x40, 0xe4, 0xbe, 0x80, 0xfc, 0xa6, + 0x90, 0x33, 0xdb, 0x20, 0xee, 0x8e, 0x0a, 0x95, 0xdf, 0x92, 0x61, 0xda, 0x9d, 0xa4, 0x78, 0xa0, + 0xd4, 0x38, 0x50, 0x4c, 0xa3, 0xb3, 0x1f, 0x2c, 0x8b, 0x78, 0xaf, 0x89, 0x1a, 0xc9, 0x5f, 0x0a, + 0xcf, 0xdc, 0x89, 0x88, 0x42, 0xbc, 0x8c, 0x09, 0xbf, 0xf7, 0x08, 0xcd, 0xe7, 0x07, 0x30, 0x77, + 0x54, 0xf0, 0x7d, 0x21, 0x07, 0xf9, 0x8d, 0x2e, 0x41, 0xee, 0x17, 0x64, 0x91, 0x90, 0xeb, 0x07, + 0x0e, 0x32, 0xb8, 0x66, 0x56, 0xc7, 0x6c, 0x69, 0x9d, 0xf5, 0xe0, 0x44, 0x58, 0x90, 0xa0, 0xdc, + 0xc5, 0x7c, 0x1b, 0xe9, 0x79, 0xc1, 0x9b, 0x62, 0xa3, 0x91, 0x13, 0x19, 0x85, 0x0e, 0x8d, 0xdc, + 0x0a, 0x27, 0xda, 0xba, 0xad, 0x5d, 0xea, 0xe0, 0xb2, 0xd1, 0xb2, 0xf6, 0xa9, 0x38, 0xd8, 0xb4, + 0xea, 0xc0, 0x07, 0xe5, 0x1e, 0xc8, 0xd9, 0xce, 0x7e, 0x87, 0xce, 0x13, 0xc3, 0x67, 0x4c, 0x22, + 0x8b, 0xaa, 0xbb, 0xd9, 0x55, 0xfa, 0x57, 0xd8, 0x45, 0x69, 0x42, 0xf0, 0x42, 0xea, 0x67, 0x40, + 0xde, 0xb4, 0xf4, 0x2d, 0x9d, 0x5e, 0x30, 0x34, 0x77, 0x20, 0xe8, 0x1e, 0x35, 0x05, 0x6a, 0x24, + 0x8b, 0xca, 0xb2, 0x2a, 0xcf, 0x82, 0x29, 0x7d, 0x47, 0xdb, 0xc2, 0x0f, 0xea, 0x06, 0x3d, 0x92, + 0x38, 0x77, 0xc7, 0x99, 0x03, 0xc7, 0x67, 0xd8, 0x77, 0x35, 0xc8, 0x8a, 0xde, 0x23, 0x89, 0x46, + 0x06, 0x22, 0x75, 0xa3, 0xa0, 0x8e, 0xe5, 0x62, 0x6e, 0xf4, 0x1a, 0xa1, 0x98, 0x3d, 0xd1, 0x6c, + 0xa5, 0x3f, 0x78, 0x7f, 0x52, 0x82, 0xc9, 0x45, 0xf3, 0x8a, 0x41, 0x14, 0xfd, 0x4e, 0x31, 0x5b, + 0xb7, 0xcf, 0x21, 0x47, 0xfe, 0xde, 0xcb, 0xd8, 0x13, 0x0d, 0xa4, 0xb6, 0x5e, 0x91, 0x11, 0x30, + 0xc4, 0xb6, 0x1c, 0xc1, 0xdb, 0x08, 0xe3, 0xca, 0x49, 0x5f, 0xae, 0x7f, 0x22, 0x43, 0x76, 0xd1, + 0x32, 0xbb, 0xe8, 0xd7, 0x33, 0x09, 0x5c, 0x16, 0xda, 0x96, 0xd9, 0x6d, 0x90, 0xeb, 0xc4, 0x82, + 0x63, 0x1c, 0xe1, 0x34, 0xe5, 0x4e, 0x98, 0xec, 0x9a, 0xb6, 0xee, 0x78, 0xd3, 0x88, 0xb9, 0x3b, + 0x9e, 0xd4, 0xb7, 0x35, 0xaf, 0xb3, 0x4c, 0xaa, 0x9f, 0xdd, 0xed, 0xb5, 0x89, 0x08, 0x5d, 0xb9, + 0xb8, 0x62, 0xf4, 0xae, 0x54, 0xeb, 0x49, 0x45, 0xaf, 0x08, 0x23, 0xf9, 0x1c, 0x1e, 0xc9, 0x27, + 0xf7, 0x91, 0xb0, 0x65, 0x76, 0x47, 0xb2, 0xc9, 0xf8, 0x2a, 0x1f, 0xd5, 0x7b, 0x39, 0x54, 0x6f, + 0x11, 0x2a, 0x33, 0x7d, 0x44, 0xdf, 0x93, 0x05, 0x20, 0x66, 0xc6, 0x86, 0x3b, 0x01, 0x12, 0xb3, + 0xb1, 0x7e, 0x24, 0x1b, 0x92, 0x65, 0x91, 0x97, 0xe5, 0x53, 0x23, 0xac, 0x18, 0x42, 0x3e, 0x42, + 0xa2, 0x45, 0xc8, 0xed, 0xba, 0x9f, 0x99, 0x44, 0x05, 0x49, 0x90, 0x57, 0x95, 0xfe, 0x89, 0xfe, + 0x38, 0x03, 0x39, 0x92, 0xa0, 0x9c, 0x05, 0x20, 0x03, 0x3b, 0x3d, 0x10, 0x94, 0x21, 0x43, 0x78, + 0x28, 0x85, 0x68, 0xab, 0xde, 0x66, 0x9f, 0xa9, 0xc9, 0x1c, 0x24, 0xb8, 0x7f, 0x93, 0xe1, 0x9e, + 0xd0, 0x62, 0x06, 0x40, 0x28, 0xc5, 0xfd, 0x9b, 0xbc, 0xad, 0xe2, 0x4d, 0x1a, 0xe9, 0x39, 0xab, + 0x06, 0x09, 0xfe, 0xdf, 0xab, 0xfe, 0xfd, 0x60, 0xde, 0xdf, 0x24, 0xc5, 0x9d, 0x0c, 0x13, 0xb5, + 0x5c, 0x08, 0x8a, 0xc8, 0x93, 0x4c, 0xbd, 0xc9, 0xe8, 0xf5, 0xbe, 0xda, 0x2c, 0x72, 0x6a, 0x73, + 0x7b, 0x02, 0xf1, 0xa6, 0xaf, 0x3c, 0x9f, 0xcb, 0xc1, 0x54, 0xd5, 0x6c, 0x33, 0xdd, 0x09, 0x4d, + 0x18, 0x3f, 0x9c, 0x4b, 0x34, 0x61, 0xf4, 0x69, 0x44, 0x28, 0xc8, 0xfd, 0xbc, 0x82, 0x88, 0x51, + 0x08, 0xeb, 0x87, 0xb2, 0x00, 0x79, 0xa2, 0xbd, 0x07, 0x2f, 0x9e, 0x8a, 0x23, 0x41, 0x44, 0xab, + 0xb2, 0x3f, 0xff, 0xc3, 0xe9, 0xd8, 0x7f, 0x85, 0x1c, 0xa9, 0x60, 0xcc, 0xee, 0x0e, 0x5f, 0x51, + 0x29, 0xbe, 0xa2, 0x72, 0x7c, 0x45, 0xb3, 0xbd, 0x15, 0x4d, 0xb2, 0x0e, 0x10, 0xa5, 0x21, 0xe9, + 0xeb, 0xf8, 0x3f, 0x4c, 0x00, 0x54, 0xb5, 0x3d, 0x7d, 0x8b, 0xee, 0x0e, 0x7f, 0xca, 0x9b, 0xff, + 0xb0, 0x7d, 0xdc, 0xff, 0x16, 0x1a, 0x08, 0xef, 0x84, 0x09, 0x36, 0xee, 0xb1, 0x8a, 0x5c, 0xcf, + 0x55, 0x24, 0xa0, 0x42, 0xcd, 0xd2, 0x47, 0x1c, 0xd5, 0xcb, 0xcf, 0xdd, 0x91, 0x2b, 0xf5, 0xdc, + 0x91, 0xdb, 0x7f, 0x0f, 0x22, 0xe2, 0xe6, 0x5c, 0xf4, 0x4e, 0x61, 0x8f, 0xfe, 0x10, 0x3f, 0xa1, + 0x1a, 0x45, 0x34, 0xc1, 0x67, 0xc0, 0x84, 0xe9, 0x6f, 0x68, 0xcb, 0x91, 0xeb, 0x60, 0x15, 0x63, + 0xd3, 0x54, 0xbd, 0x9c, 0x82, 0x9b, 0x5f, 0x42, 0x7c, 0x8c, 0xe5, 0xd0, 0xcc, 0xe9, 0x65, 0x2f, + 0x6a, 0x96, 0x5b, 0x8f, 0x8b, 0xba, 0xb3, 0xbd, 0xaa, 0x1b, 0x97, 0x6d, 0xf4, 0x9f, 0xc5, 0x2c, + 0xc8, 0x10, 0xfe, 0x52, 0x32, 0xfc, 0xf9, 0x98, 0x1d, 0x75, 0x1e, 0xb5, 0x7b, 0xa2, 0xa8, 0xf4, + 0xe7, 0x36, 0x02, 0xc0, 0xbb, 0x20, 0x4f, 0x19, 0x65, 0x9d, 0xe8, 0xf9, 0x48, 0xfc, 0x7c, 0x4a, + 0x2a, 0xfb, 0x03, 0xbd, 0xc3, 0xc7, 0xf1, 0x02, 0x87, 0xe3, 0xc2, 0xa1, 0x38, 0x4b, 0x1d, 0xd2, + 0xf3, 0x4f, 0x87, 0x09, 0x26, 0x69, 0x65, 0x2e, 0xdc, 0x8a, 0x0b, 0xc7, 0x14, 0x80, 0xfc, 0x9a, + 0xb9, 0x87, 0x1b, 0x66, 0x21, 0xe3, 0x3e, 0xbb, 0xfc, 0x35, 0xcc, 0x82, 0x84, 0x5e, 0x3d, 0x09, + 0x93, 0x7e, 0xb8, 0xa2, 0x4f, 0x4a, 0x50, 0x28, 0x59, 0x58, 0x73, 0xf0, 0x92, 0x65, 0xee, 0xd0, + 0x1a, 0x89, 0x7b, 0x87, 0xfe, 0x8c, 0xb0, 0x8b, 0x87, 0x1f, 0x46, 0xa8, 0xb7, 0xb0, 0x08, 0x2c, + 0xe9, 0x22, 0xa4, 0xe4, 0x2d, 0x42, 0xa2, 0x37, 0x09, 0xb9, 0x7c, 0x88, 0x96, 0x92, 0x7e, 0x53, + 0xfb, 0xa8, 0x04, 0xb9, 0x52, 0xc7, 0x34, 0x70, 0xf8, 0x08, 0xd3, 0xc0, 0xb3, 0x32, 0xfd, 0x77, + 0x22, 0xd0, 0xf3, 0x25, 0x51, 0x5b, 0x23, 0x10, 0x80, 0x5b, 0xb6, 0xa0, 0x6c, 0xc5, 0x06, 0xa9, + 0x58, 0xd2, 0xe9, 0x0b, 0xf4, 0x4b, 0x12, 0x4c, 0xd1, 0xb8, 0x38, 0xc5, 0x4e, 0x07, 0x3d, 0x29, + 0x10, 0x6a, 0x9f, 0x90, 0x4f, 0xe8, 0x37, 0x85, 0x5d, 0xf4, 0xfd, 0x5a, 0xf9, 0xb4, 0x13, 0x04, + 0x08, 0x4a, 0xe6, 0x31, 0x2e, 0xb6, 0x97, 0x36, 0x90, 0xa1, 0xf4, 0x45, 0xfd, 0xe7, 0x92, 0x6b, + 0x00, 0x18, 0x97, 0xd7, 0x2d, 0xbc, 0xa7, 0xe3, 0x2b, 0xe8, 0xda, 0x40, 0xd8, 0x07, 0x83, 0x7e, + 0xfc, 0x8a, 0xf0, 0x22, 0x4e, 0x88, 0x64, 0xe4, 0x56, 0xd6, 0x74, 0x27, 0xc8, 0xc4, 0x7a, 0xf1, + 0xde, 0x48, 0x2c, 0x21, 0x32, 0x6a, 0x38, 0xbb, 0xe0, 0x9a, 0x4d, 0x34, 0x17, 0xe9, 0x0b, 0xf6, + 0x7d, 0x13, 0x30, 0xb9, 0x61, 0xd8, 0xdd, 0x8e, 0x66, 0x6f, 0xa3, 0x6f, 0xc8, 0x90, 0xa7, 0xd7, + 0x9d, 0xa1, 0xef, 0xe2, 0x62, 0x0b, 0xfc, 0xc0, 0x2e, 0xb6, 0x3c, 0x17, 0x1c, 0xfa, 0xd2, 0xff, + 0x36, 0x76, 0xf4, 0x1e, 0x59, 0x74, 0x92, 0xea, 0x15, 0x1a, 0xba, 0xf7, 0xbe, 0xff, 0x71, 0xf6, + 0xae, 0xde, 0x72, 0x76, 0x2d, 0xff, 0x6e, 0xef, 0xa7, 0x89, 0x51, 0x59, 0xa7, 0x7f, 0xa9, 0xfe, + 0xef, 0x48, 0x83, 0x09, 0x96, 0x78, 0x60, 0x3b, 0xe9, 0xe0, 0xf9, 0xdb, 0xd3, 0x90, 0xd7, 0x2c, + 0x47, 0xb7, 0x1d, 0xb6, 0xc1, 0xca, 0xde, 0xdc, 0xee, 0x92, 0x3e, 0x6d, 0x58, 0x1d, 0x2f, 0x0a, + 0x89, 0x9f, 0x80, 0x7e, 0x4b, 0x68, 0xfe, 0x18, 0x5f, 0xf3, 0x64, 0x90, 0x3f, 0x38, 0xc4, 0x1a, + 0xf5, 0xd5, 0x70, 0x95, 0x5a, 0x6c, 0x94, 0x9b, 0x34, 0x68, 0x85, 0x1f, 0x9f, 0xa2, 0x8d, 0xde, + 0x2e, 0x87, 0xd6, 0xef, 0xf6, 0xb9, 0x31, 0x82, 0x49, 0x31, 0x18, 0x23, 0xfc, 0x84, 0x98, 0xdd, + 0x6a, 0x6e, 0x11, 0x56, 0x16, 0x5f, 0x84, 0xfd, 0x35, 0xe1, 0xdd, 0x24, 0x5f, 0x94, 0x03, 0xd6, + 0x00, 0xe3, 0xae, 0x43, 0x7a, 0xaf, 0xd0, 0xce, 0xd0, 0xa0, 0x92, 0x8e, 0x10, 0xb6, 0x5f, 0x9e, + 0x80, 0x89, 0x65, 0xad, 0xd3, 0xc1, 0xd6, 0xbe, 0x3b, 0x24, 0x15, 0x3c, 0x0e, 0xd7, 0x34, 0x43, + 0xdf, 0xc4, 0xb6, 0x13, 0xdf, 0x59, 0xbe, 0x53, 0x38, 0xd4, 0x2e, 0x2b, 0x63, 0xbe, 0x97, 0x7e, + 0x84, 0xcc, 0x6f, 0x83, 0xac, 0x6e, 0x6c, 0x9a, 0xac, 0xcb, 0xec, 0x5d, 0xb5, 0xf7, 0x7e, 0x26, + 0x53, 0x17, 0x92, 0x51, 0x30, 0xda, 0xae, 0x20, 0x17, 0xe9, 0xf7, 0x9c, 0xbf, 0x91, 0x85, 0x59, + 0x8f, 0x89, 0x8a, 0xd1, 0xc6, 0x8f, 0x84, 0x97, 0x62, 0x5e, 0x9e, 0x15, 0x3d, 0x0e, 0xd6, 0x5b, + 0x1f, 0x42, 0x2a, 0x42, 0xa4, 0x0d, 0x80, 0x96, 0xe6, 0xe0, 0x2d, 0xd3, 0xd2, 0xfd, 0xfe, 0xf0, + 0x99, 0x49, 0xa8, 0x95, 0xe8, 0xdf, 0xfb, 0x6a, 0x88, 0x8e, 0x72, 0x0f, 0x4c, 0x63, 0xff, 0xfc, + 0xbd, 0xb7, 0x54, 0x13, 0x8b, 0x57, 0x38, 0x3f, 0xfa, 0x73, 0xa1, 0x53, 0x67, 0x22, 0xd5, 0x4c, + 0x86, 0x59, 0x73, 0xb8, 0x36, 0xb4, 0x51, 0x5d, 0x2b, 0xaa, 0xf5, 0x95, 0xe2, 0xea, 0x6a, 0xa5, + 0xba, 0xec, 0x07, 0x7e, 0x51, 0x60, 0x6e, 0xb1, 0x76, 0xb1, 0x1a, 0x8a, 0xcc, 0x93, 0x45, 0xeb, + 0x30, 0xe9, 0xc9, 0xab, 0x9f, 0x2f, 0x66, 0x58, 0x66, 0xcc, 0x17, 0x33, 0x94, 0xe4, 0x1a, 0x67, + 0x7a, 0xcb, 0x77, 0xd0, 0x21, 0xcf, 0xe8, 0x0f, 0x35, 0xc8, 0xd1, 0x68, 0x91, 0x6f, 0x25, 0xdb, + 0x80, 0xdd, 0x8e, 0xd6, 0xc2, 0x68, 0x27, 0x81, 0x35, 0xee, 0xdd, 0xfd, 0x20, 0x1d, 0xb8, 0xfb, + 0x81, 0x3c, 0x32, 0xab, 0xef, 0x64, 0xbf, 0x75, 0x7c, 0x95, 0x66, 0xe1, 0x0f, 0x68, 0xc5, 0xee, + 0xae, 0xd0, 0xe5, 0x7f, 0xc6, 0x66, 0x84, 0x4a, 0x46, 0xf3, 0x94, 0xcc, 0x12, 0x15, 0xdb, 0x87, + 0x89, 0xe3, 0x68, 0x0c, 0xf7, 0x93, 0x67, 0x21, 0x57, 0xef, 0x76, 0x74, 0x07, 0xfd, 0x9c, 0x34, + 0x12, 0xcc, 0xe8, 0x7d, 0x1d, 0xf2, 0xc0, 0xfb, 0x3a, 0x82, 0x5d, 0xd7, 0xac, 0xc0, 0xae, 0x6b, + 0x03, 0x3f, 0xe2, 0xf0, 0xbb, 0xae, 0x77, 0xb2, 0xe0, 0x6d, 0x74, 0xcf, 0xf6, 0xc9, 0x7d, 0x44, + 0x4a, 0xaa, 0xd5, 0x27, 0x2a, 0xe0, 0xf9, 0xa7, 0xb3, 0xe0, 0x64, 0x00, 0xf9, 0x85, 0x5a, 0xa3, + 0x51, 0x5b, 0x2b, 0x1c, 0x23, 0x51, 0x6d, 0x6a, 0xeb, 0x34, 0x54, 0x4c, 0xa5, 0x5a, 0x2d, 0xab, + 0x05, 0x89, 0x84, 0x4b, 0xab, 0x34, 0x56, 0xcb, 0x05, 0x99, 0x0f, 0xde, 0x1e, 0x6b, 0x7e, 0xf3, + 0x65, 0xa7, 0xa9, 0x5e, 0x62, 0x86, 0x78, 0x34, 0x3f, 0xe9, 0x2b, 0xd7, 0x4f, 0xcb, 0x90, 0x5b, + 0xc3, 0xd6, 0x16, 0x46, 0x3f, 0x90, 0x60, 0x93, 0x6f, 0x53, 0xb7, 0x6c, 0x1a, 0x5c, 0x2e, 0xd8, + 0xe4, 0x0b, 0xa7, 0x29, 0x37, 0xc2, 0xac, 0x8d, 0x5b, 0xa6, 0xd1, 0xf6, 0x32, 0xd1, 0xfe, 0x88, + 0x4f, 0xe4, 0x2f, 0xce, 0x17, 0x80, 0x8c, 0x30, 0x3a, 0x92, 0x9d, 0xba, 0x24, 0xc0, 0xf4, 0x2b, + 0x35, 0x7d, 0x60, 0xbe, 0x2a, 0xbb, 0x3f, 0x75, 0xf7, 0xd1, 0x2b, 0x85, 0x77, 0x5f, 0x6f, 0x85, + 0x3c, 0x51, 0x53, 0x6f, 0x8c, 0xee, 0xdf, 0x1f, 0xb3, 0x3c, 0xca, 0x02, 0x9c, 0xb0, 0x71, 0x07, + 0xb7, 0x1c, 0xdc, 0x76, 0x9b, 0xae, 0x3a, 0xb0, 0x53, 0x38, 0x98, 0x1d, 0xfd, 0x69, 0x18, 0xc0, + 0xbb, 0x79, 0x00, 0x6f, 0xea, 0x23, 0x4a, 0xb7, 0x42, 0xd1, 0xb6, 0xb2, 0x5b, 0x8d, 0x7a, 0xc7, + 0xf4, 0x17, 0xc5, 0xbd, 0x77, 0xf7, 0xdb, 0xb6, 0xb3, 0xd3, 0x21, 0xdf, 0xd8, 0x01, 0x03, 0xef, + 0x5d, 0x99, 0x87, 0x09, 0xcd, 0xd8, 0x27, 0x9f, 0xb2, 0x31, 0xb5, 0xf6, 0x32, 0xa1, 0x57, 0xfb, + 0xc8, 0xdf, 0xc7, 0x21, 0xff, 0x54, 0x31, 0x76, 0xd3, 0x07, 0xfe, 0x87, 0x27, 0x20, 0xb7, 0xae, + 0xd9, 0x0e, 0x46, 0xff, 0x97, 0x2c, 0x8a, 0xfc, 0x4d, 0x30, 0xb7, 0x69, 0xb6, 0x76, 0x6d, 0xdc, + 0xe6, 0x1b, 0x65, 0x4f, 0xea, 0x28, 0x30, 0x57, 0x6e, 0x81, 0x82, 0x97, 0xc8, 0xc8, 0x7a, 0xdb, + 0xf0, 0x07, 0xd2, 0x49, 0x28, 0x70, 0x7b, 0x5d, 0xb3, 0x9c, 0xda, 0x26, 0x8d, 0x61, 0xed, 0x85, + 0x02, 0x0f, 0x27, 0x72, 0xd0, 0xe7, 0x63, 0xa0, 0x9f, 0x88, 0x86, 0x7e, 0x52, 0x00, 0x7a, 0xa5, + 0x08, 0x93, 0x9b, 0x7a, 0x07, 0x93, 0x1f, 0xa6, 0xc8, 0x0f, 0xfd, 0xc6, 0x24, 0x22, 0x7b, 0x7f, + 0x4c, 0x5a, 0xd2, 0x3b, 0x58, 0xf5, 0x7f, 0xf3, 0x26, 0x32, 0x10, 0x4c, 0x64, 0x56, 0xa9, 0x3f, + 0xad, 0x6b, 0x78, 0x19, 0xda, 0x0e, 0xf6, 0x16, 0xdf, 0x0c, 0x76, 0xb8, 0xa5, 0xad, 0x39, 0x1a, + 0x01, 0x63, 0x46, 0x25, 0xcf, 0xbc, 0x5f, 0x88, 0xdc, 0xeb, 0x17, 0xf2, 0x42, 0x39, 0x59, 0x8f, + 0xe8, 0x31, 0x1b, 0xd1, 0xa2, 0x2e, 0x79, 0x00, 0x51, 0x4b, 0xd1, 0x7f, 0x77, 0x81, 0x69, 0x69, + 0x16, 0x76, 0xd6, 0xc3, 0x9e, 0x18, 0x39, 0x95, 0x4f, 0x24, 0xae, 0x7c, 0x76, 0x5d, 0xdb, 0xc1, + 0xa4, 0xb0, 0x92, 0xfb, 0x8d, 0xb9, 0x68, 0x1d, 0x48, 0x0f, 0xfa, 0xdf, 0xdc, 0xa8, 0xfb, 0xdf, + 0x7e, 0x75, 0x4c, 0xbf, 0x19, 0xbe, 0x36, 0x0b, 0x72, 0x69, 0xd7, 0x79, 0x42, 0x77, 0xbf, 0xdf, + 0x14, 0xf6, 0x73, 0x61, 0xfd, 0x59, 0xe4, 0x4d, 0xf9, 0x63, 0xea, 0x7d, 0x13, 0x6a, 0x89, 0x98, + 0x3f, 0x4d, 0x54, 0xdd, 0xd2, 0xd7, 0x91, 0x5f, 0x97, 0x7d, 0x07, 0xcb, 0x47, 0x33, 0x87, 0x37, + 0xcd, 0x11, 0xed, 0x9f, 0x42, 0x3d, 0x83, 0xff, 0xee, 0x75, 0x3c, 0x59, 0x2e, 0x56, 0x1f, 0xd9, + 0x5e, 0x27, 0xa2, 0x9c, 0x51, 0xe9, 0x0b, 0xfa, 0x79, 0x61, 0xb7, 0x73, 0x2a, 0xb6, 0x58, 0x57, + 0xc2, 0x64, 0x36, 0x95, 0xd8, 0x6d, 0xa8, 0x31, 0xc5, 0x8e, 0xe1, 0x26, 0x8d, 0xb0, 0xab, 0x60, + 0xf1, 0xd0, 0x88, 0xa1, 0xd7, 0x08, 0x6f, 0x47, 0xd1, 0x6a, 0x0f, 0x58, 0x2f, 0x4c, 0x26, 0x6f, + 0xb1, 0xcd, 0xaa, 0xd8, 0x82, 0xd3, 0x97, 0xf8, 0x97, 0x65, 0xc8, 0xd3, 0x2d, 0x48, 0xf4, 0xc6, + 0x4c, 0x82, 0x6b, 0xe4, 0x1d, 0xde, 0x85, 0xd0, 0x7f, 0x4f, 0xb2, 0xe6, 0xc0, 0xb9, 0x1a, 0x66, + 0x13, 0xb9, 0x1a, 0xf2, 0xe7, 0x38, 0x05, 0xda, 0x11, 0xad, 0x63, 0xca, 0xd3, 0xc9, 0x24, 0x2d, + 0xac, 0x2f, 0x43, 0xe9, 0xe3, 0xfd, 0xa3, 0x39, 0x98, 0xa1, 0x45, 0x5f, 0xd4, 0xdb, 0x5b, 0xd8, + 0x41, 0x6f, 0x97, 0xbe, 0x75, 0x50, 0x57, 0xaa, 0x30, 0x73, 0x85, 0xb0, 0xbd, 0xaa, 0xed, 0x9b, + 0xbb, 0x0e, 0x5b, 0xb9, 0xb8, 0x25, 0x76, 0xdd, 0x83, 0xd6, 0x73, 0x9e, 0xfe, 0xa1, 0x72, 0xff, + 0xbb, 0x32, 0xa6, 0x0b, 0xfe, 0xd4, 0x81, 0x2b, 0x4f, 0x8c, 0xac, 0x70, 0x92, 0x72, 0x1a, 0xf2, + 0x7b, 0x3a, 0xbe, 0x52, 0x69, 0x33, 0xeb, 0x96, 0xbd, 0xa1, 0xdf, 0x15, 0xde, 0xb7, 0x0d, 0xc3, + 0xcd, 0x78, 0x49, 0x57, 0x0b, 0xc5, 0x76, 0x6f, 0x07, 0xb2, 0x35, 0x86, 0x33, 0xc5, 0xfc, 0x6d, + 0xa3, 0xa5, 0x04, 0x8a, 0x18, 0x65, 0x38, 0xf3, 0xa1, 0x3c, 0x62, 0x4f, 0xac, 0x50, 0x01, 0x8c, + 0xf8, 0x22, 0x52, 0xb1, 0xf8, 0x12, 0x03, 0x8a, 0x4e, 0x5f, 0xf2, 0xaf, 0x97, 0x61, 0xaa, 0x8e, + 0x9d, 0x25, 0x1d, 0x77, 0xda, 0x36, 0xb2, 0x0e, 0x6f, 0x1a, 0xdd, 0x06, 0xf9, 0x4d, 0x42, 0x6c, + 0xd0, 0xb9, 0x05, 0x96, 0x0d, 0xbd, 0x56, 0x12, 0xdd, 0x11, 0x66, 0xab, 0x6f, 0x1e, 0xb7, 0x23, + 0x81, 0x49, 0xcc, 0xa3, 0x37, 0xbe, 0xe4, 0x31, 0x04, 0xb6, 0x95, 0x61, 0x86, 0x5d, 0x4f, 0x58, + 0xec, 0xe8, 0x5b, 0x06, 0xda, 0x1d, 0x41, 0x0b, 0x51, 0x6e, 0x87, 0x9c, 0xe6, 0x52, 0x63, 0x5b, + 0xaf, 0xa8, 0x6f, 0xe7, 0x49, 0xca, 0x53, 0x69, 0xc6, 0x04, 0x61, 0x24, 0x03, 0xc5, 0xf6, 0x78, + 0x1e, 0x63, 0x18, 0xc9, 0x81, 0x85, 0xa7, 0x8f, 0xd8, 0x67, 0x65, 0x38, 0xc9, 0x18, 0xb8, 0x80, + 0x2d, 0x47, 0x6f, 0x69, 0x1d, 0x8a, 0xdc, 0x4b, 0x32, 0xa3, 0x80, 0x6e, 0x05, 0x66, 0xf7, 0xc2, + 0x64, 0x19, 0x84, 0xe7, 0xfb, 0x42, 0xc8, 0x31, 0xa0, 0xf2, 0x3f, 0x26, 0x08, 0xc7, 0xc7, 0x49, + 0x95, 0xa3, 0x39, 0xc6, 0x70, 0x7c, 0xc2, 0x4c, 0xa4, 0x0f, 0xf1, 0x2b, 0x58, 0x68, 0x9e, 0xa0, + 0xfb, 0xfc, 0x94, 0x30, 0xb6, 0x1b, 0x30, 0x4d, 0xb0, 0xa4, 0x3f, 0xb2, 0x65, 0x88, 0x18, 0x25, + 0xf6, 0xfb, 0x1d, 0x76, 0x61, 0x98, 0xff, 0xaf, 0x1a, 0xa6, 0x83, 0x2e, 0x02, 0x04, 0x9f, 0xc2, + 0x9d, 0x74, 0x26, 0xaa, 0x93, 0x96, 0xc4, 0x3a, 0xe9, 0x5f, 0x11, 0x0e, 0x96, 0xd2, 0x9f, 0xed, + 0xc3, 0xab, 0x87, 0x58, 0x98, 0x8c, 0xc1, 0xa5, 0xa7, 0xaf, 0x17, 0xaf, 0xce, 0xf6, 0xde, 0x43, + 0xff, 0x81, 0x91, 0xcc, 0xa7, 0xc2, 0xfd, 0x81, 0xdc, 0xd3, 0x1f, 0x1c, 0xc2, 0x92, 0xbe, 0x19, + 0x8e, 0xd3, 0x22, 0x4a, 0x3e, 0x5b, 0x39, 0x1a, 0x0a, 0xa2, 0x27, 0x19, 0x7d, 0x70, 0x08, 0x25, + 0x18, 0x74, 0x49, 0x7e, 0x5c, 0x27, 0x97, 0xcc, 0xd8, 0x4d, 0xaa, 0x20, 0x47, 0x77, 0xb7, 0xfe, + 0x97, 0xb2, 0xd4, 0xda, 0xdd, 0x20, 0x77, 0xba, 0xa1, 0xbf, 0xc8, 0x8e, 0x62, 0x44, 0xb8, 0x1f, + 0xb2, 0xc4, 0xc5, 0x5d, 0x8e, 0x5c, 0xd2, 0x08, 0x8a, 0x0c, 0x2e, 0xdc, 0xc3, 0x8f, 0x38, 0x2b, + 0xc7, 0x54, 0xf2, 0xa7, 0x72, 0x0b, 0x1c, 0xbf, 0xa4, 0xb5, 0x2e, 0x6f, 0x59, 0xe6, 0x2e, 0xb9, + 0xfd, 0xca, 0x64, 0xd7, 0x68, 0x91, 0xeb, 0x08, 0xf9, 0x0f, 0xca, 0x1d, 0x9e, 0xe9, 0x90, 0x1b, + 0x64, 0x3a, 0xac, 0x1c, 0x63, 0xc6, 0x83, 0xf2, 0x74, 0xbf, 0xd3, 0xc9, 0xc7, 0x76, 0x3a, 0x2b, + 0xc7, 0xbc, 0x6e, 0x47, 0x59, 0x84, 0xc9, 0xb6, 0xbe, 0x47, 0xb6, 0xaa, 0xc9, 0xac, 0x6b, 0xd0, + 0xd1, 0xe5, 0x45, 0x7d, 0x8f, 0x6e, 0x6c, 0xaf, 0x1c, 0x53, 0xfd, 0x3f, 0x95, 0x65, 0x98, 0x22, + 0xdb, 0x02, 0x84, 0xcc, 0x64, 0xa2, 0x63, 0xc9, 0x2b, 0xc7, 0xd4, 0xe0, 0x5f, 0xd7, 0xfa, 0xc8, + 0x92, 0xb3, 0x1f, 0xf7, 0x79, 0xdb, 0xed, 0x99, 0x44, 0xdb, 0xed, 0xae, 0x2c, 0xe8, 0x86, 0xfb, + 0x69, 0xc8, 0xb5, 0x88, 0x84, 0x25, 0x26, 0x61, 0xfa, 0xaa, 0xdc, 0x0d, 0xd9, 0x1d, 0xcd, 0xf2, + 0x26, 0xcf, 0x37, 0x0d, 0xa6, 0xbb, 0xa6, 0x59, 0x97, 0x5d, 0x04, 0xdd, 0xbf, 0x16, 0x26, 0x20, + 0x47, 0x04, 0xe7, 0x3f, 0xa0, 0x5f, 0xcf, 0x52, 0x33, 0xa4, 0x64, 0x1a, 0xee, 0xb0, 0xdf, 0x30, + 0xbd, 0x03, 0x32, 0xbf, 0x9b, 0x19, 0x8d, 0x05, 0xd9, 0xf7, 0xe2, 0x76, 0x39, 0xf2, 0xe2, 0xf6, + 0x9e, 0x1b, 0x84, 0xb3, 0xbd, 0x37, 0x08, 0x07, 0xcb, 0x07, 0xb9, 0xc1, 0x8e, 0x2a, 0x7f, 0x3a, + 0x84, 0xe9, 0xd2, 0x2b, 0x88, 0xe8, 0x19, 0x78, 0x47, 0x37, 0x42, 0x75, 0xf6, 0x5e, 0x13, 0x76, + 0x4a, 0x49, 0x8d, 0x9a, 0x01, 0xec, 0xa5, 0xdf, 0x37, 0xfd, 0x6a, 0x16, 0xce, 0xd0, 0x7b, 0xaa, + 0xf7, 0x70, 0xc3, 0xe4, 0xef, 0x9b, 0x44, 0x7f, 0x34, 0x12, 0xa5, 0xe9, 0x33, 0xe0, 0xc8, 0x7d, + 0x07, 0x9c, 0x03, 0x87, 0x94, 0xb3, 0x03, 0x0e, 0x29, 0xe7, 0x92, 0xad, 0x1c, 0xfe, 0x4e, 0x58, + 0x7f, 0xd6, 0x79, 0xfd, 0xb9, 0x2b, 0x02, 0xa0, 0x7e, 0x72, 0x19, 0x89, 0x7d, 0xf3, 0x56, 0x5f, + 0x53, 0xea, 0x9c, 0xa6, 0xdc, 0x37, 0x3c, 0x23, 0xe9, 0x6b, 0xcb, 0x6f, 0x67, 0xe1, 0xaa, 0x80, + 0x99, 0x2a, 0xbe, 0xc2, 0x14, 0xe5, 0x93, 0x23, 0x51, 0x94, 0xe4, 0x31, 0x10, 0xd2, 0xd6, 0x98, + 0x3f, 0x16, 0x3e, 0x3b, 0xd4, 0x0b, 0x94, 0x2f, 0x9b, 0x08, 0x65, 0x39, 0x0d, 0x79, 0xda, 0xc3, + 0x30, 0x68, 0xd8, 0x5b, 0xc2, 0xee, 0x46, 0xec, 0xc4, 0x91, 0x28, 0x6f, 0x63, 0xd0, 0x1f, 0xb6, + 0xae, 0xd1, 0xd8, 0xb5, 0x8c, 0x8a, 0xe1, 0x98, 0xe8, 0x87, 0x46, 0xa2, 0x38, 0xbe, 0x37, 0x9c, + 0x3c, 0x8c, 0x37, 0xdc, 0x50, 0xab, 0x1c, 0x5e, 0x0d, 0x8e, 0x64, 0x95, 0x23, 0xa2, 0xf0, 0xf4, + 0xf1, 0x7b, 0x8b, 0x0c, 0xa7, 0xd9, 0x64, 0x6b, 0x81, 0xb7, 0x10, 0xd1, 0x43, 0xa3, 0x00, 0xf2, + 0xa4, 0x67, 0x26, 0xb1, 0x5b, 0xce, 0xc8, 0x0b, 0x7f, 0x52, 0x2a, 0xf6, 0x7e, 0x07, 0x6e, 0x3a, + 0xd8, 0xc3, 0xe1, 0x48, 0x90, 0x12, 0xbb, 0xd6, 0x21, 0x01, 0x1b, 0xe9, 0x63, 0xf6, 0x32, 0x19, + 0xf2, 0xf4, 0x9c, 0x16, 0xda, 0x48, 0xc5, 0x61, 0x82, 0x8f, 0xf2, 0x2c, 0xb0, 0x23, 0x97, 0xf8, + 0x92, 0xfb, 0xf4, 0xf6, 0xe2, 0x8e, 0xe8, 0x16, 0xfb, 0xaf, 0x4a, 0x30, 0x5d, 0xc7, 0x4e, 0x49, + 0xb3, 0x2c, 0x5d, 0xdb, 0x1a, 0x95, 0xc7, 0xb7, 0xa8, 0xf7, 0x30, 0xfa, 0x5a, 0x46, 0xf4, 0x3c, + 0x8d, 0xbf, 0x10, 0xee, 0xb1, 0x1a, 0x11, 0x4b, 0xf0, 0x31, 0xa1, 0x33, 0x33, 0x83, 0xa8, 0x8d, + 0xc1, 0x63, 0x5b, 0x82, 0x09, 0xef, 0x2c, 0xde, 0x6d, 0xdc, 0xf9, 0xcc, 0x6d, 0x67, 0xc7, 0x3b, + 0x06, 0x43, 0x9e, 0x0f, 0x9e, 0x01, 0x43, 0xaf, 0x4a, 0xe8, 0x28, 0x1f, 0x7f, 0x90, 0x30, 0x59, + 0x1b, 0x4b, 0xe2, 0x0e, 0x7f, 0x54, 0x47, 0x07, 0x7f, 0x73, 0x82, 0x2d, 0x47, 0xae, 0x6a, 0x0e, + 0x7e, 0x04, 0x7d, 0x4a, 0x86, 0x89, 0x3a, 0x76, 0xdc, 0xf1, 0x96, 0xbb, 0xdc, 0x74, 0x58, 0x0d, + 0x57, 0x42, 0x2b, 0x1e, 0x53, 0x6c, 0x0d, 0xe3, 0x01, 0x98, 0xea, 0x5a, 0x66, 0x0b, 0xdb, 0x36, + 0x5b, 0xbd, 0x08, 0x3b, 0xaa, 0xf5, 0x1b, 0xfd, 0x09, 0x6b, 0xf3, 0xeb, 0xde, 0x3f, 0x6a, 0xf0, + 0x7b, 0x52, 0x33, 0x80, 0x52, 0x62, 0x15, 0x1c, 0xb7, 0x19, 0x10, 0x57, 0x78, 0xfa, 0x40, 0x7f, + 0x5c, 0x86, 0x99, 0x3a, 0x76, 0x7c, 0x29, 0x26, 0xd8, 0xe4, 0x88, 0x86, 0x97, 0x83, 0x52, 0x3e, + 0x1c, 0x94, 0xe2, 0x57, 0x03, 0xf2, 0xd2, 0xf4, 0x89, 0x8d, 0xf1, 0x6a, 0x40, 0x31, 0x0e, 0xc6, + 0x70, 0x7c, 0xed, 0xc9, 0x30, 0x45, 0x78, 0x21, 0x0d, 0xf6, 0xc7, 0xb3, 0x41, 0xe3, 0xfd, 0x74, + 0x4a, 0x8d, 0xf7, 0x1e, 0xc8, 0xed, 0x68, 0xd6, 0x65, 0x9b, 0x34, 0xdc, 0x69, 0x11, 0xb3, 0x7d, + 0xcd, 0xcd, 0xae, 0xd2, 0xbf, 0xfa, 0xfb, 0x69, 0xe6, 0x92, 0xf9, 0x69, 0x3e, 0x26, 0x25, 0x1a, + 0x09, 0xe9, 0xdc, 0x61, 0x84, 0x4d, 0x3e, 0xc1, 0xb8, 0x19, 0x53, 0x76, 0xfa, 0xca, 0xf1, 0x12, + 0x19, 0x26, 0xdd, 0x71, 0x9b, 0xd8, 0xe3, 0x17, 0x0f, 0xaf, 0x0e, 0xfd, 0x0d, 0xfd, 0x84, 0x3d, + 0xb0, 0x27, 0x91, 0xd1, 0x99, 0xf7, 0x09, 0x7a, 0xe0, 0xb8, 0xc2, 0xd3, 0xc7, 0xe3, 0x6d, 0x14, + 0x0f, 0xd2, 0x1e, 0xd0, 0x2f, 0xc9, 0x20, 0x2f, 0x63, 0x67, 0xdc, 0x56, 0xe4, 0x9b, 0x85, 0x43, + 0x1c, 0x71, 0x02, 0x23, 0x3c, 0xcf, 0x2f, 0xe3, 0xd1, 0x34, 0x20, 0xb1, 0xd8, 0x46, 0x42, 0x0c, + 0xa4, 0x8f, 0xda, 0xbb, 0x28, 0x6a, 0x74, 0x73, 0xe1, 0x07, 0x47, 0xd0, 0xab, 0x8e, 0x77, 0xe1, + 0xc3, 0x13, 0x20, 0xa1, 0x71, 0x54, 0xed, 0xad, 0x5f, 0xe1, 0x63, 0xb9, 0x8a, 0x0f, 0xdc, 0xc6, + 0xbe, 0x8d, 0x5b, 0x97, 0x71, 0x1b, 0x7d, 0xdf, 0xe1, 0xa1, 0x3b, 0x03, 0x13, 0x2d, 0x4a, 0x8d, + 0x80, 0x37, 0xa9, 0x7a, 0xaf, 0x09, 0xee, 0x95, 0xe6, 0x3b, 0x22, 0xfa, 0xfb, 0x18, 0xef, 0x95, + 0x16, 0x28, 0x7e, 0x0c, 0x66, 0x0b, 0x9d, 0x65, 0x54, 0x5a, 0xa6, 0x81, 0xfe, 0xcb, 0xe1, 0x61, + 0xb9, 0x0e, 0xa6, 0xf4, 0x96, 0x69, 0x90, 0x30, 0x14, 0xde, 0x21, 0x20, 0x3f, 0xc1, 0xfb, 0x5a, + 0xde, 0x31, 0x1f, 0xd6, 0xd9, 0xae, 0x79, 0x90, 0x30, 0xac, 0x31, 0xe1, 0xb2, 0x7e, 0x54, 0xc6, + 0x44, 0x9f, 0xb2, 0xd3, 0x87, 0xec, 0x83, 0x81, 0x77, 0x1b, 0xed, 0x0a, 0x9f, 0x10, 0xab, 0xc0, + 0xc3, 0x0c, 0x67, 0xe1, 0x5a, 0x1c, 0xc9, 0x70, 0x16, 0xc3, 0xc0, 0x18, 0x6e, 0xac, 0x08, 0x70, + 0x4c, 0x7d, 0x0d, 0xf8, 0x10, 0xe8, 0x8c, 0xce, 0x3c, 0x1c, 0x12, 0x9d, 0xa3, 0x31, 0x11, 0xdf, + 0xcb, 0x42, 0x64, 0x32, 0x8b, 0x07, 0xfd, 0xd7, 0x51, 0x80, 0x73, 0xd7, 0x30, 0xfe, 0x0a, 0xd4, + 0x5b, 0x21, 0xc1, 0x8d, 0xd8, 0x07, 0x24, 0xe8, 0x52, 0x19, 0xe3, 0x5d, 0xf1, 0x22, 0xe5, 0xa7, + 0x0f, 0xe0, 0x8b, 0x65, 0x98, 0x23, 0x3e, 0x02, 0x1d, 0xac, 0x59, 0xb4, 0xa3, 0x1c, 0x89, 0xa3, + 0xfc, 0xdb, 0x84, 0x03, 0xfc, 0xf0, 0x72, 0x08, 0xf8, 0x18, 0x09, 0x14, 0x62, 0xd1, 0x7d, 0x04, + 0x59, 0x18, 0xcb, 0x36, 0x4a, 0xc1, 0x67, 0x81, 0xa9, 0xf8, 0x68, 0xf0, 0x48, 0xe8, 0x91, 0xcb, + 0x0b, 0xc3, 0x6b, 0x6c, 0x63, 0xf6, 0xc8, 0x15, 0x61, 0x22, 0x7d, 0x4c, 0x7e, 0xe9, 0x76, 0xb6, + 0xe0, 0xdc, 0x20, 0x17, 0xc6, 0xbf, 0x26, 0xeb, 0x9f, 0x68, 0xfb, 0xf8, 0x48, 0x3c, 0x30, 0x0f, + 0x11, 0x10, 0x5f, 0x81, 0xac, 0x65, 0x5e, 0xa1, 0x4b, 0x5b, 0xb3, 0x2a, 0x79, 0xa6, 0xd7, 0x53, + 0x76, 0x76, 0x77, 0x0c, 0x7a, 0x32, 0x74, 0x56, 0xf5, 0x5e, 0x95, 0x1b, 0x61, 0xf6, 0x8a, 0xee, + 0x6c, 0xaf, 0x60, 0xad, 0x8d, 0x2d, 0xd5, 0xbc, 0x42, 0x3c, 0xe6, 0x26, 0x55, 0x3e, 0x91, 0xf7, + 0x5f, 0x11, 0xb0, 0x2f, 0xc9, 0x2d, 0xf2, 0x63, 0x39, 0xfe, 0x96, 0xc4, 0xf2, 0x8c, 0xe6, 0x2a, + 0x7d, 0x85, 0x79, 0xb7, 0x0c, 0x53, 0xaa, 0x79, 0x85, 0x29, 0xc9, 0xff, 0x71, 0xb4, 0x3a, 0x92, + 0x78, 0xa2, 0x47, 0x24, 0xe7, 0xb3, 0x3f, 0xf6, 0x89, 0x5e, 0x6c, 0xf1, 0x63, 0x39, 0xb9, 0x34, + 0xa3, 0x9a, 0x57, 0xea, 0xd8, 0xa1, 0x2d, 0x02, 0x35, 0x47, 0xe4, 0x64, 0xad, 0xdb, 0x94, 0x20, + 0x9b, 0x87, 0xfb, 0xef, 0x49, 0x77, 0x11, 0x7c, 0x01, 0xf9, 0x2c, 0x8e, 0x7b, 0x17, 0x61, 0x20, + 0x07, 0x63, 0x88, 0x91, 0x22, 0xc3, 0xb4, 0x6a, 0x5e, 0x71, 0x87, 0x86, 0x25, 0xbd, 0xd3, 0x19, + 0xcd, 0x08, 0x99, 0xd4, 0xf8, 0xf7, 0xc4, 0xe0, 0x71, 0x31, 0x76, 0xe3, 0x7f, 0x00, 0x03, 0xe9, + 0xc3, 0xf0, 0x42, 0xda, 0x58, 0xbc, 0x11, 0xda, 0x18, 0x0d, 0x0e, 0xc3, 0x36, 0x08, 0x9f, 0x8d, + 0x23, 0x6b, 0x10, 0x51, 0x1c, 0x8c, 0x65, 0xe7, 0x64, 0xae, 0x44, 0x86, 0xf9, 0xd1, 0xb6, 0x89, + 0x77, 0x24, 0x73, 0x4d, 0x64, 0xc3, 0x2e, 0xc7, 0xc8, 0x48, 0xd0, 0x48, 0xe0, 0x82, 0x28, 0xc0, + 0x43, 0xfa, 0x78, 0xfc, 0x9e, 0x0c, 0x33, 0x94, 0x85, 0x27, 0x88, 0x15, 0x30, 0x54, 0xa3, 0x0a, + 0xd7, 0xe0, 0x68, 0x1a, 0x55, 0x0c, 0x07, 0x63, 0xb9, 0x15, 0xd4, 0xb5, 0xe3, 0x86, 0x38, 0x3e, + 0x1e, 0x85, 0xe0, 0xd0, 0xc6, 0xd8, 0x08, 0x8f, 0x90, 0x0f, 0x63, 0x8c, 0x1d, 0xd1, 0x31, 0xf2, + 0x17, 0xfa, 0xad, 0x68, 0x94, 0x18, 0x1c, 0xa2, 0x29, 0x8c, 0x10, 0x86, 0x21, 0x9b, 0xc2, 0x11, + 0x21, 0xf1, 0x39, 0x19, 0x80, 0x32, 0xb0, 0x66, 0xee, 0x91, 0xcb, 0x7c, 0x46, 0xd0, 0x9d, 0xf5, + 0xba, 0xd5, 0xcb, 0x03, 0xdc, 0xea, 0x13, 0x86, 0x70, 0x49, 0xba, 0x12, 0x18, 0x92, 0xb2, 0x5b, + 0xc9, 0xb1, 0xaf, 0x04, 0xc6, 0x97, 0x9f, 0x3e, 0xc6, 0x8f, 0x53, 0x6b, 0x2e, 0x38, 0x60, 0xfa, + 0xb3, 0x23, 0x41, 0x39, 0x34, 0xfb, 0x97, 0xf9, 0xd9, 0xff, 0x21, 0xb0, 0x1d, 0xd6, 0x46, 0x1c, + 0x74, 0x70, 0x34, 0x7d, 0x1b, 0xf1, 0xe8, 0x0e, 0x88, 0xfe, 0x60, 0x16, 0x8e, 0xb3, 0x4e, 0xe4, + 0x5b, 0x01, 0xe2, 0x84, 0xe7, 0xf0, 0xb8, 0x4e, 0x72, 0x00, 0xca, 0xa3, 0x5a, 0x90, 0x4a, 0xb2, + 0x94, 0x29, 0xc0, 0xde, 0x58, 0x56, 0x37, 0xf2, 0xe5, 0x47, 0xba, 0x9a, 0xd1, 0x16, 0x0f, 0xf7, + 0x3b, 0x00, 0x78, 0x6f, 0xad, 0x51, 0xe6, 0xd7, 0x1a, 0xfb, 0xac, 0x4c, 0x26, 0xde, 0xb9, 0x26, + 0x22, 0xa3, 0xec, 0x8e, 0x7d, 0xe7, 0x3a, 0xba, 0xec, 0xf4, 0x51, 0x7a, 0x87, 0x0c, 0xd9, 0xba, + 0x69, 0x39, 0xe8, 0x45, 0x49, 0x5a, 0x27, 0x95, 0x7c, 0x00, 0x92, 0xf7, 0xae, 0x94, 0xb8, 0x5b, + 0x9a, 0x6f, 0x8b, 0x3f, 0xea, 0xac, 0x39, 0x1a, 0xf1, 0xea, 0x76, 0xcb, 0x0f, 0x5d, 0xd7, 0x9c, + 0x34, 0x9e, 0x0e, 0x95, 0x5f, 0x3d, 0xfa, 0x00, 0x46, 0x6a, 0xf1, 0x74, 0x22, 0x4b, 0x4e, 0x1f, + 0xb7, 0xd7, 0x1d, 0x67, 0xbe, 0xad, 0x4b, 0x7a, 0x07, 0xa3, 0x17, 0x51, 0x97, 0x91, 0xaa, 0xb6, + 0x83, 0xc5, 0x8f, 0xc4, 0xc4, 0xba, 0xb6, 0x92, 0xf8, 0xb2, 0x72, 0x10, 0x5f, 0x36, 0x69, 0x83, + 0xa2, 0x07, 0xd0, 0x29, 0x4b, 0xe3, 0x6e, 0x50, 0x31, 0x65, 0x8f, 0x25, 0x4e, 0xe7, 0x89, 0x3a, + 0x76, 0xa8, 0x51, 0x59, 0xf3, 0x6e, 0x60, 0xf9, 0xfe, 0x91, 0x44, 0xec, 0xf4, 0x2f, 0x78, 0x91, + 0x7b, 0x2e, 0x78, 0x79, 0x77, 0x18, 0x9c, 0x35, 0x1e, 0x9c, 0xef, 0x8e, 0x16, 0x10, 0xcf, 0xe4, + 0x48, 0x60, 0x7a, 0xb3, 0x0f, 0xd3, 0x3a, 0x07, 0xd3, 0xdd, 0x43, 0x72, 0x91, 0x3e, 0x60, 0x3f, + 0x91, 0x83, 0xe3, 0x74, 0xd2, 0x5f, 0x34, 0xda, 0x2c, 0xc2, 0xea, 0x1b, 0xa5, 0x23, 0xde, 0x6c, + 0x3b, 0x18, 0x82, 0x95, 0x8b, 0xe5, 0x9c, 0xeb, 0xbd, 0x1d, 0x7f, 0x81, 0x86, 0x73, 0x75, 0x3b, + 0x51, 0xb2, 0xd3, 0x26, 0x7e, 0x43, 0xbe, 0xff, 0x1f, 0x7f, 0x97, 0xd1, 0x84, 0xf8, 0x5d, 0x46, + 0x7f, 0x92, 0x6c, 0xdd, 0x8e, 0x14, 0xdd, 0x23, 0xf0, 0x94, 0x6d, 0xa7, 0x04, 0x2b, 0x7a, 0x02, + 0xdc, 0x7d, 0x7b, 0xb8, 0x93, 0x05, 0x11, 0x44, 0x86, 0x74, 0x27, 0x23, 0x04, 0x8e, 0xd2, 0x9d, + 0x6c, 0x10, 0x03, 0x63, 0xb8, 0xd5, 0x3e, 0xc7, 0x76, 0xf3, 0x49, 0xbb, 0x41, 0x7f, 0x25, 0xa5, + 0x3e, 0x4a, 0x7f, 0x3d, 0x93, 0xc8, 0xff, 0x99, 0xf0, 0x15, 0x3f, 0x4c, 0x27, 0xf1, 0x68, 0x8e, + 0x23, 0x37, 0x86, 0x75, 0x23, 0x89, 0xf8, 0xa2, 0x5f, 0xd4, 0xdb, 0xce, 0xf6, 0x88, 0x4e, 0x74, + 0x5c, 0x71, 0x69, 0x79, 0xd7, 0x23, 0x93, 0x17, 0xf4, 0x6f, 0x99, 0x44, 0x21, 0xa4, 0x7c, 0x91, + 0x10, 0xb6, 0x22, 0x44, 0x9c, 0x20, 0xf0, 0x53, 0x2c, 0xbd, 0x31, 0x6a, 0xf4, 0x05, 0xbd, 0x8d, + 0xcd, 0x27, 0xa0, 0x46, 0x13, 0xbe, 0x46, 0xa7, 0xd1, 0x71, 0xe4, 0xbe, 0x4d, 0x35, 0xda, 0x17, + 0xc9, 0x88, 0x34, 0x3a, 0x96, 0x5e, 0xfa, 0x32, 0x7e, 0xd5, 0x0c, 0x9b, 0x48, 0xad, 0xea, 0xc6, + 0x65, 0xf4, 0xcf, 0x79, 0xef, 0x62, 0xe6, 0x8b, 0xba, 0xb3, 0xcd, 0x62, 0xc1, 0xfc, 0xb6, 0xf0, + 0xdd, 0x28, 0x43, 0xc4, 0x7b, 0xe1, 0xc3, 0x49, 0xe5, 0x0e, 0x84, 0x93, 0x2a, 0xc2, 0xac, 0x6e, + 0x38, 0xd8, 0x32, 0xb4, 0xce, 0x52, 0x47, 0xdb, 0xb2, 0xcf, 0x4c, 0xf4, 0xbd, 0xbc, 0xae, 0x12, + 0xca, 0xa3, 0xf2, 0x7f, 0x84, 0xaf, 0xaf, 0x9c, 0xe4, 0xaf, 0xaf, 0x8c, 0x88, 0x7e, 0x35, 0x15, + 0x1d, 0xfd, 0xca, 0x8f, 0x6e, 0x05, 0x83, 0x83, 0x63, 0x8b, 0xda, 0xc6, 0x09, 0xc3, 0xfd, 0xdd, + 0x26, 0x18, 0x85, 0xcd, 0x0f, 0xfd, 0xf8, 0x8b, 0x72, 0xa2, 0xd5, 0x3d, 0x57, 0x11, 0xe6, 0x7b, + 0x95, 0x20, 0xb1, 0x85, 0x1a, 0xae, 0xbc, 0xdc, 0x53, 0x79, 0xdf, 0xe4, 0xc9, 0x0a, 0x98, 0x3c, + 0x61, 0xa5, 0xca, 0x89, 0x29, 0x55, 0x92, 0xc5, 0x42, 0x91, 0xda, 0x8e, 0xe1, 0x34, 0x52, 0x0e, + 0x4e, 0x78, 0xd1, 0x6e, 0xbb, 0x5d, 0xac, 0x59, 0x9a, 0xd1, 0xc2, 0xe8, 0x83, 0xd2, 0x28, 0xcc, + 0xde, 0x25, 0x98, 0xd4, 0x5b, 0xa6, 0x51, 0xd7, 0x9f, 0xe7, 0x5d, 0x2e, 0x17, 0x1f, 0x64, 0x9d, + 0x48, 0xa4, 0xc2, 0xfe, 0x50, 0xfd, 0x7f, 0x95, 0x0a, 0x4c, 0xb5, 0x34, 0xab, 0x4d, 0x83, 0xf0, + 0xe5, 0x7a, 0x2e, 0x72, 0x8a, 0x24, 0x54, 0xf2, 0x7e, 0x51, 0x83, 0xbf, 0x95, 0x1a, 0x2f, 0xc4, + 0x7c, 0x4f, 0x34, 0x8f, 0x48, 0x62, 0x8b, 0xc1, 0x4f, 0x9c, 0xcc, 0x5d, 0xe9, 0x58, 0xb8, 0x43, + 0xee, 0xa0, 0xa7, 0x3d, 0xc4, 0x94, 0x1a, 0x24, 0x24, 0x5d, 0x1e, 0x20, 0x45, 0x1d, 0x40, 0x63, + 0xdc, 0xcb, 0x03, 0x42, 0x5c, 0xa4, 0xaf, 0x99, 0x6f, 0xcd, 0xc3, 0x2c, 0xed, 0xd5, 0x98, 0x38, + 0xd1, 0x8b, 0xc9, 0x15, 0xd2, 0xce, 0x83, 0x78, 0x1f, 0xd5, 0x0f, 0x3f, 0x26, 0x17, 0x40, 0xbe, + 0xec, 0x07, 0x1c, 0x74, 0x1f, 0x93, 0xee, 0xdb, 0x7b, 0x7c, 0xcd, 0x53, 0x9e, 0xc6, 0xbd, 0x6f, + 0x1f, 0x5f, 0x7c, 0xfa, 0xf8, 0xfc, 0xa4, 0x0c, 0x72, 0xb1, 0xdd, 0x46, 0xad, 0xc3, 0x43, 0x71, + 0x0e, 0xa6, 0xbd, 0x36, 0x13, 0xc4, 0x80, 0x0c, 0x27, 0x25, 0x5d, 0x04, 0xf5, 0x65, 0x53, 0x6c, + 0x8f, 0x7d, 0x57, 0x21, 0xa6, 0xec, 0xf4, 0x41, 0xf9, 0xd9, 0x09, 0xd6, 0x68, 0x16, 0x4c, 0xf3, + 0x32, 0x39, 0x2a, 0xf3, 0x22, 0x19, 0x72, 0x4b, 0xd8, 0x69, 0x6d, 0x8f, 0xa8, 0xcd, 0xec, 0x5a, + 0x1d, 0xaf, 0xcd, 0x1c, 0xb8, 0x0f, 0x7f, 0xb0, 0x0d, 0xeb, 0xb1, 0x35, 0x4f, 0x58, 0x1a, 0x77, + 0x74, 0xe7, 0xd8, 0xd2, 0xd3, 0x07, 0xe7, 0xdf, 0x64, 0x98, 0xf3, 0x57, 0xb8, 0x28, 0x26, 0x3f, + 0x91, 0x79, 0xa2, 0xad, 0x77, 0xa2, 0x4f, 0x26, 0x0b, 0x91, 0xe6, 0xcb, 0x94, 0xaf, 0x59, 0xca, + 0x0b, 0x8b, 0x09, 0x82, 0xa7, 0x89, 0x31, 0x38, 0x86, 0x19, 0xbc, 0x0c, 0x93, 0x84, 0xa1, 0x45, + 0x7d, 0x8f, 0xb8, 0x0e, 0x72, 0x0b, 0x8d, 0xcf, 0x1f, 0xc9, 0x42, 0xe3, 0xdd, 0xfc, 0x42, 0xa3, + 0x60, 0xc4, 0x63, 0x6f, 0x9d, 0x31, 0xa1, 0x2f, 0x8d, 0xfb, 0xff, 0xc8, 0x97, 0x19, 0x13, 0xf8, + 0xd2, 0x0c, 0x28, 0x3f, 0x7d, 0x44, 0x7f, 0xf1, 0x3f, 0xb1, 0xce, 0xd6, 0xdb, 0x50, 0x45, 0xff, + 0xf3, 0x04, 0x64, 0x2f, 0xb8, 0x0f, 0xff, 0x3b, 0xb8, 0x11, 0xeb, 0x95, 0x23, 0x08, 0xce, 0x70, + 0x2f, 0x64, 0x5d, 0xfa, 0x6c, 0xda, 0x72, 0x8b, 0xd8, 0xee, 0xae, 0xcb, 0x88, 0x4a, 0xfe, 0x53, + 0x4e, 0x43, 0xde, 0x36, 0x77, 0xad, 0x96, 0x6b, 0x3e, 0xbb, 0x1a, 0xc3, 0xde, 0x92, 0x06, 0x25, + 0xe5, 0x48, 0xcf, 0x8f, 0xce, 0x65, 0x34, 0x74, 0x41, 0x92, 0xcc, 0x5d, 0x90, 0x94, 0x60, 0xff, + 0x40, 0x80, 0xb7, 0xf4, 0x35, 0xe2, 0xaf, 0xc8, 0x5d, 0x81, 0xed, 0x51, 0xc1, 0x1e, 0x21, 0x96, + 0xc3, 0xaa, 0x43, 0x52, 0x87, 0x6f, 0x5e, 0xb4, 0x7e, 0x1c, 0xf8, 0xb1, 0x3a, 0x7c, 0x0b, 0xf0, + 0x30, 0x96, 0x53, 0xea, 0x79, 0xe6, 0xa4, 0xfa, 0xd0, 0x28, 0xd1, 0xcd, 0x72, 0x4a, 0x7f, 0x28, + 0x74, 0x46, 0xe8, 0xbc, 0x3a, 0x34, 0x3a, 0x47, 0xe4, 0xbe, 0xfa, 0xfb, 0x32, 0x89, 0x84, 0xe9, + 0x19, 0x39, 0xe2, 0x17, 0x1d, 0x25, 0x86, 0xc8, 0x1d, 0x83, 0xb9, 0x38, 0xd0, 0xb3, 0xc3, 0x87, + 0x06, 0xe7, 0x45, 0x17, 0xe2, 0x7f, 0xdc, 0xa1, 0xc1, 0x45, 0x19, 0x49, 0x1f, 0xc8, 0x37, 0xd0, + 0x8b, 0xc5, 0x8a, 0x2d, 0x47, 0xdf, 0x1b, 0x71, 0x4b, 0xe3, 0x87, 0x97, 0x84, 0xd1, 0x80, 0x0f, + 0x48, 0x88, 0x72, 0x38, 0xee, 0x68, 0xc0, 0x62, 0x6c, 0xa4, 0x0f, 0xd3, 0xdf, 0xe6, 0x5d, 0xe9, + 0xb1, 0xb5, 0x99, 0x5f, 0x62, 0xab, 0x01, 0xf8, 0xf0, 0x68, 0x9d, 0x87, 0x99, 0xd0, 0xd4, 0xdf, + 0xbb, 0xb0, 0x86, 0x4b, 0x4b, 0x7a, 0xd0, 0xdd, 0x17, 0xd9, 0xc8, 0x17, 0x06, 0x12, 0x2c, 0xf8, + 0x8a, 0x30, 0x31, 0x96, 0xfb, 0xe0, 0xbc, 0x31, 0x6c, 0x4c, 0x58, 0xfd, 0x76, 0x18, 0xab, 0x1a, + 0x8f, 0xd5, 0x9d, 0x22, 0x62, 0x12, 0x1b, 0xd3, 0x84, 0xe6, 0x8d, 0x6f, 0xf1, 0xe1, 0x52, 0x39, + 0xb8, 0xee, 0x1d, 0x9a, 0x8f, 0xf4, 0x11, 0xfb, 0x39, 0xda, 0x1d, 0xd6, 0xa9, 0xc9, 0x3e, 0x9a, + 0xee, 0x90, 0xcd, 0x06, 0x64, 0x6e, 0x36, 0x90, 0xd0, 0xdf, 0x3e, 0x70, 0x23, 0xf5, 0x98, 0x1b, + 0x04, 0x51, 0x76, 0xc4, 0xfe, 0xf6, 0x03, 0x39, 0x48, 0x1f, 0x9c, 0x7f, 0x94, 0x01, 0x96, 0x2d, + 0x73, 0xb7, 0x5b, 0xb3, 0xda, 0xd8, 0x42, 0x7f, 0x13, 0x4c, 0x00, 0x5e, 0x3e, 0x82, 0x09, 0xc0, + 0x3a, 0xc0, 0x96, 0x4f, 0x9c, 0x69, 0xf8, 0xed, 0x62, 0xe6, 0x7e, 0xc0, 0x94, 0x1a, 0xa2, 0xc1, + 0x5f, 0x39, 0xfb, 0x3d, 0x3c, 0xc6, 0x71, 0x7d, 0x56, 0x40, 0x6e, 0x94, 0x13, 0x80, 0xb7, 0xf9, + 0x58, 0x37, 0x38, 0xac, 0xef, 0x3f, 0x04, 0x27, 0xe9, 0x63, 0xfe, 0x4f, 0x13, 0x30, 0x4d, 0xb7, + 0xeb, 0xa8, 0x4c, 0xff, 0x3e, 0x00, 0xfd, 0x67, 0x47, 0x00, 0xfa, 0x06, 0xcc, 0x98, 0x01, 0x75, + 0xda, 0xa7, 0x86, 0x17, 0x60, 0x62, 0x61, 0x0f, 0xf1, 0xa5, 0x72, 0x64, 0xd0, 0xfb, 0xc3, 0xc8, + 0xab, 0x3c, 0xf2, 0x77, 0xc7, 0xc8, 0x3b, 0x44, 0x71, 0x94, 0xd0, 0xbf, 0xdd, 0x87, 0x7e, 0x83, + 0x83, 0xbe, 0x78, 0x18, 0x56, 0xc6, 0x10, 0x6e, 0x5f, 0x86, 0x2c, 0x39, 0x1d, 0xf7, 0xab, 0x29, + 0xce, 0xef, 0xcf, 0xc0, 0x04, 0x69, 0xb2, 0xfe, 0xbc, 0xc3, 0x7b, 0x75, 0xbf, 0x68, 0x9b, 0x0e, + 0xb6, 0x7c, 0x8f, 0x05, 0xef, 0xd5, 0xe5, 0xc1, 0xf3, 0x4a, 0xb6, 0xcf, 0xe4, 0xe9, 0x46, 0xa4, + 0x9f, 0x30, 0xf4, 0xa4, 0x24, 0x2c, 0xf1, 0x91, 0x9d, 0x97, 0x1b, 0x66, 0x52, 0x32, 0x80, 0x91, + 0xf4, 0x81, 0xff, 0x8b, 0x2c, 0x9c, 0xa1, 0xab, 0x4a, 0x4b, 0x96, 0xb9, 0xd3, 0x73, 0xbb, 0x95, + 0x7e, 0x78, 0x5d, 0xb8, 0x09, 0xe6, 0x1c, 0xce, 0x1f, 0x9b, 0xe9, 0x44, 0x4f, 0x2a, 0xfa, 0xd3, + 0xb0, 0x4f, 0xc5, 0x73, 0x79, 0x24, 0x17, 0x62, 0x04, 0x18, 0xc5, 0x7b, 0xe2, 0x85, 0x7a, 0x41, + 0x46, 0x43, 0x8b, 0x54, 0xf2, 0x50, 0x6b, 0x96, 0xbe, 0x4e, 0xe5, 0x44, 0x74, 0xea, 0x3d, 0xbe, + 0x4e, 0x7d, 0x1f, 0xa7, 0x53, 0xcb, 0x87, 0x17, 0x49, 0xfa, 0xba, 0xf5, 0x1a, 0x7f, 0x63, 0xc8, + 0xdf, 0xb6, 0xdb, 0x49, 0x61, 0xb3, 0x2e, 0xec, 0x8f, 0x94, 0xe5, 0xfc, 0x91, 0xf8, 0xfb, 0x28, + 0x12, 0xcc, 0x84, 0x79, 0xae, 0x23, 0x74, 0x69, 0x0e, 0x24, 0xdd, 0xe3, 0x4e, 0xd2, 0xdb, 0x43, + 0xcd, 0x75, 0x63, 0x0b, 0x1a, 0xc3, 0xda, 0xd2, 0x1c, 0xe4, 0x97, 0xf4, 0x8e, 0x83, 0x2d, 0xf4, + 0x38, 0x9b, 0xe9, 0xbe, 0x26, 0xc5, 0x01, 0x60, 0x11, 0xf2, 0x9b, 0xa4, 0x34, 0x66, 0x32, 0xdf, + 0x2a, 0xd6, 0x7a, 0x28, 0x87, 0x2a, 0xfb, 0x37, 0x69, 0x74, 0xbe, 0x1e, 0x32, 0x23, 0x9b, 0x22, + 0x27, 0x88, 0xce, 0x37, 0x98, 0x85, 0xb1, 0x5c, 0x4c, 0x95, 0x57, 0xf1, 0x8e, 0x3b, 0xc6, 0x5f, + 0x4e, 0x0f, 0xe1, 0x02, 0xc8, 0x7a, 0xdb, 0x26, 0x9d, 0xe3, 0x94, 0xea, 0x3e, 0x26, 0xf5, 0x15, + 0xea, 0x15, 0x15, 0x65, 0x79, 0xdc, 0xbe, 0x42, 0x42, 0x5c, 0xa4, 0x8f, 0xd9, 0xd7, 0x89, 0xa3, + 0x68, 0xb7, 0xa3, 0xb5, 0xb0, 0xcb, 0x7d, 0x6a, 0xa8, 0xd1, 0x9e, 0x2c, 0xeb, 0xf5, 0x64, 0xa1, + 0x76, 0x9a, 0x3b, 0x44, 0x3b, 0x1d, 0x76, 0x19, 0xd2, 0x97, 0x39, 0xa9, 0xf8, 0x91, 0x2d, 0x43, + 0xc6, 0xb2, 0x31, 0x86, 0x6b, 0x47, 0xbd, 0x83, 0xb4, 0x63, 0x6d, 0xad, 0xc3, 0x6e, 0xd2, 0x30, + 0x61, 0x8d, 0xec, 0xd0, 0xec, 0x30, 0x9b, 0x34, 0xd1, 0x3c, 0x8c, 0x01, 0xad, 0x39, 0x86, 0xd6, + 0x27, 0xd8, 0x30, 0x9a, 0xf2, 0x3e, 0xa9, 0x6d, 0x5a, 0x4e, 0xb2, 0x7d, 0x52, 0x97, 0x3b, 0x95, + 0xfc, 0x97, 0xf4, 0xe0, 0x15, 0x7f, 0xae, 0x7a, 0x54, 0xc3, 0x67, 0x82, 0x83, 0x57, 0x83, 0x18, + 0x48, 0x1f, 0xde, 0x37, 0x1d, 0xd1, 0xe0, 0x39, 0x6c, 0x73, 0x64, 0x6d, 0x60, 0x64, 0x43, 0xe7, + 0x30, 0xcd, 0x31, 0x9a, 0x87, 0xf4, 0xf1, 0xfa, 0x4a, 0x68, 0xe0, 0xfc, 0x95, 0x31, 0x0e, 0x9c, + 0x5e, 0xcb, 0xcc, 0x0d, 0xd9, 0x32, 0x87, 0xdd, 0xff, 0x61, 0xb2, 0x1e, 0xdd, 0x80, 0x39, 0xcc, + 0xfe, 0x4f, 0x0c, 0x13, 0xe9, 0x23, 0xfe, 0x46, 0x19, 0x72, 0xf5, 0xf1, 0x8f, 0x97, 0xc3, 0xce, + 0x45, 0x88, 0xac, 0xea, 0x23, 0x1b, 0x2e, 0x87, 0x99, 0x8b, 0x44, 0xb2, 0x30, 0x86, 0xc0, 0xfb, + 0xc7, 0x61, 0x86, 0x2c, 0x89, 0x78, 0xdb, 0xac, 0x5f, 0x61, 0xa3, 0xe6, 0x63, 0x29, 0xb6, 0xd5, + 0x07, 0x60, 0xd2, 0xdb, 0xbf, 0x63, 0x23, 0xe7, 0xbc, 0x58, 0xfb, 0xf4, 0xb8, 0x54, 0xfd, 0xff, + 0x0f, 0xe5, 0x0c, 0x31, 0xf2, 0xbd, 0xda, 0x61, 0x9d, 0x21, 0x8e, 0x74, 0xbf, 0xf6, 0x4f, 0x82, + 0x11, 0xf5, 0xbf, 0xa4, 0x87, 0x79, 0xef, 0x3e, 0x6e, 0xb6, 0xcf, 0x3e, 0xee, 0x07, 0xc3, 0x58, + 0xd6, 0x79, 0x2c, 0xef, 0x11, 0x15, 0xe1, 0x08, 0xc7, 0xda, 0x77, 0xf8, 0x70, 0x5e, 0xe0, 0xe0, + 0x5c, 0x38, 0x14, 0x2f, 0x63, 0x38, 0xf8, 0x98, 0x0d, 0xc6, 0xdc, 0x0f, 0xa5, 0xd8, 0x8e, 0x7b, + 0x4e, 0x55, 0x64, 0x0f, 0x9c, 0xaa, 0xe0, 0x5a, 0x7a, 0xee, 0x90, 0x2d, 0xfd, 0x43, 0x61, 0xed, + 0x68, 0xf0, 0xda, 0x71, 0xaf, 0x38, 0x22, 0xa3, 0x1b, 0x99, 0xdf, 0xe9, 0xab, 0xc7, 0x45, 0x4e, + 0x3d, 0x4a, 0x87, 0x63, 0x26, 0x7d, 0xfd, 0xf8, 0x03, 0x6f, 0x42, 0x7b, 0xc4, 0xed, 0x7d, 0xd8, + 0xad, 0x62, 0x4e, 0x88, 0x23, 0x1b, 0xb9, 0x87, 0xd9, 0x2a, 0x1e, 0xc4, 0xc9, 0x18, 0x62, 0xb1, + 0xcd, 0xc2, 0x34, 0xe1, 0xe9, 0xa2, 0xde, 0xde, 0xc2, 0x0e, 0xfa, 0x45, 0xea, 0xa3, 0xe8, 0x45, + 0xbe, 0x1c, 0x51, 0x78, 0xa2, 0xa8, 0xf3, 0xae, 0x49, 0x3d, 0x3a, 0x28, 0x93, 0xf3, 0x21, 0x06, + 0xc7, 0x1d, 0x41, 0x71, 0x20, 0x07, 0xe9, 0x43, 0xf6, 0x7e, 0xea, 0x6e, 0xb3, 0xaa, 0xed, 0x9b, + 0xbb, 0x0e, 0x7a, 0x74, 0x04, 0x1d, 0xf4, 0x02, 0xe4, 0x3b, 0x84, 0x1a, 0x3b, 0x96, 0x11, 0x3f, + 0xdd, 0x61, 0x22, 0xa0, 0xe5, 0xab, 0xec, 0xcf, 0xa4, 0x67, 0x33, 0x02, 0x39, 0x52, 0x3a, 0xe3, + 0x3e, 0x9b, 0x31, 0xa0, 0xfc, 0xb1, 0xdc, 0xb1, 0x33, 0xe9, 0x96, 0xae, 0xef, 0xe8, 0xce, 0x88, + 0x22, 0x38, 0x74, 0x5c, 0x5a, 0x5e, 0x04, 0x07, 0xf2, 0x92, 0xf4, 0xc4, 0x68, 0x48, 0x2a, 0xee, + 0xef, 0xe3, 0x3e, 0x31, 0x1a, 0x5f, 0x7c, 0xfa, 0x98, 0xfc, 0x34, 0x6d, 0x59, 0x17, 0xa8, 0xf3, + 0x6d, 0x8a, 0x7e, 0xbd, 0x43, 0x37, 0x16, 0xca, 0xda, 0xd1, 0x35, 0x96, 0xbe, 0xe5, 0xa7, 0x0f, + 0xcc, 0x7f, 0xff, 0x4e, 0xc8, 0x2d, 0xe2, 0x4b, 0xbb, 0x5b, 0xe8, 0x6e, 0x98, 0x6c, 0x58, 0x18, + 0x57, 0x8c, 0x4d, 0xd3, 0x95, 0xae, 0xe3, 0x3e, 0x7b, 0x90, 0xb0, 0x37, 0x17, 0x8f, 0x6d, 0xac, + 0xb5, 0x83, 0xf3, 0x67, 0xde, 0x2b, 0x7a, 0xa5, 0x04, 0xd9, 0xba, 0xa3, 0x39, 0x68, 0xca, 0xc7, + 0x16, 0x3d, 0x1a, 0xc6, 0xe2, 0x6e, 0x1e, 0x8b, 0x9b, 0x38, 0x59, 0x10, 0x0e, 0xe6, 0xdd, 0xff, + 0x23, 0x00, 0x40, 0x30, 0xf9, 0xb0, 0x6d, 0x1a, 0x6e, 0x0e, 0xef, 0x08, 0xa4, 0xf7, 0x8e, 0x5e, + 0xed, 0x8b, 0xfb, 0x3e, 0x4e, 0xdc, 0x4f, 0x15, 0x2b, 0x62, 0x0c, 0x2b, 0x6d, 0x12, 0x4c, 0xb9, + 0xa2, 0x5d, 0xc1, 0x5a, 0xdb, 0x46, 0xdf, 0x11, 0x28, 0x7f, 0x84, 0x98, 0xd1, 0x7b, 0x85, 0x83, + 0x71, 0xd2, 0x5a, 0xf9, 0xc4, 0xa3, 0x3d, 0x3a, 0xbc, 0xcd, 0x7f, 0x89, 0x0f, 0x46, 0x72, 0x1b, + 0x64, 0x75, 0x63, 0xd3, 0x64, 0xfe, 0x85, 0xd7, 0x46, 0xd0, 0x76, 0x75, 0x42, 0x25, 0x19, 0x05, + 0x23, 0x75, 0xc6, 0xb3, 0x35, 0x96, 0x4b, 0xef, 0xb2, 0x6e, 0xe9, 0xe8, 0xff, 0x3f, 0x50, 0xd8, + 0x8a, 0x02, 0xd9, 0xae, 0xe6, 0x6c, 0xb3, 0xa2, 0xc9, 0xb3, 0x6b, 0x23, 0xef, 0x1a, 0x9a, 0x61, + 0x1a, 0xfb, 0x3b, 0xfa, 0xf3, 0xfc, 0xbb, 0x75, 0xb9, 0x34, 0x97, 0xf3, 0x2d, 0x6c, 0x60, 0x4b, + 0x73, 0x70, 0x7d, 0x6f, 0x8b, 0xcc, 0xb1, 0x26, 0xd5, 0x70, 0x52, 0x62, 0xfd, 0x77, 0x39, 0x8e, + 0xd6, 0xff, 0x4d, 0xbd, 0x83, 0x49, 0xa4, 0x26, 0xa6, 0xff, 0xde, 0x7b, 0x22, 0xfd, 0xef, 0x53, + 0x44, 0xfa, 0x68, 0x7c, 0x43, 0x82, 0x99, 0xba, 0xab, 0x70, 0xf5, 0xdd, 0x9d, 0x1d, 0xcd, 0xda, + 0x47, 0x37, 0x04, 0xa8, 0x84, 0x54, 0x33, 0xc3, 0xfb, 0xa5, 0xfc, 0xbe, 0xf0, 0xb5, 0xd2, 0xac, + 0x69, 0x87, 0x4a, 0x48, 0xdc, 0x0e, 0x9e, 0x0e, 0x39, 0x57, 0xbd, 0x3d, 0x8f, 0xcb, 0xd8, 0x86, + 0x40, 0x73, 0x0a, 0x46, 0xb4, 0x1a, 0xc8, 0xdb, 0x18, 0xa2, 0x69, 0x48, 0x70, 0xbc, 0xee, 0x68, + 0xad, 0xcb, 0xcb, 0xa6, 0x65, 0xee, 0x3a, 0xba, 0x81, 0x6d, 0xf4, 0xa4, 0x00, 0x01, 0x4f, 0xff, + 0x33, 0x81, 0xfe, 0xa3, 0x7f, 0xcf, 0x88, 0x8e, 0xa2, 0x7e, 0xb7, 0x1a, 0x26, 0x1f, 0x11, 0xa0, + 0x4a, 0x6c, 0x5c, 0x14, 0xa1, 0x98, 0xbe, 0xd0, 0x7e, 0x45, 0x86, 0x42, 0xf9, 0x91, 0xae, 0x69, + 0x39, 0xab, 0x66, 0x4b, 0xeb, 0xd8, 0x8e, 0x69, 0x61, 0x54, 0x8b, 0x95, 0x9a, 0xdb, 0xc3, 0xb4, + 0xcd, 0x56, 0x30, 0x38, 0xb2, 0xb7, 0xb0, 0xda, 0xc9, 0xbc, 0x8e, 0xbf, 0x5f, 0x78, 0x97, 0x91, + 0x4a, 0xa5, 0x97, 0xa3, 0x08, 0x3d, 0xef, 0xd7, 0xa5, 0x25, 0x3b, 0x2c, 0x21, 0xb6, 0xf3, 0x28, + 0xc4, 0xd4, 0x18, 0x96, 0xca, 0x25, 0x98, 0xad, 0xef, 0x5e, 0xf2, 0x89, 0xd8, 0x61, 0x23, 0xe4, + 0xb5, 0xc2, 0x51, 0x2a, 0x98, 0xe2, 0x85, 0x09, 0x45, 0xc8, 0xf7, 0x46, 0x98, 0xb5, 0xc3, 0xd9, + 0x18, 0xde, 0x7c, 0xa2, 0x60, 0x74, 0x8a, 0xc1, 0xa5, 0xa6, 0x2f, 0xc0, 0x77, 0x4a, 0x30, 0x5b, + 0xeb, 0x62, 0x03, 0xb7, 0xa9, 0x17, 0x24, 0x27, 0xc0, 0x57, 0x26, 0x14, 0x20, 0x47, 0x28, 0x42, + 0x80, 0x81, 0xc7, 0xf2, 0xa2, 0x27, 0xbc, 0x20, 0x21, 0x91, 0xe0, 0xe2, 0x4a, 0x4b, 0x5f, 0x70, + 0x9f, 0x91, 0x60, 0x5a, 0xdd, 0x35, 0xd6, 0x2d, 0xd3, 0x1d, 0x8d, 0x2d, 0x74, 0x4f, 0xd0, 0x41, + 0xdc, 0x0a, 0x27, 0xda, 0xbb, 0x16, 0x59, 0x7f, 0xaa, 0x18, 0x75, 0xdc, 0x32, 0x8d, 0xb6, 0x4d, + 0xea, 0x91, 0x53, 0x0f, 0x7e, 0xb8, 0x2b, 0xfb, 0xa2, 0x2f, 0xca, 0x19, 0xf4, 0x62, 0xe1, 0x50, + 0x37, 0xb4, 0xf2, 0xa1, 0xa2, 0xc5, 0x7b, 0x02, 0xc1, 0x80, 0x36, 0x83, 0x4a, 0x48, 0x5f, 0xb8, + 0x9f, 0x90, 0x40, 0x29, 0xb6, 0x5a, 0xe6, 0xae, 0xe1, 0xd4, 0x71, 0x07, 0xb7, 0x9c, 0x86, 0xa5, + 0xb5, 0x70, 0xd8, 0x7e, 0x2e, 0x80, 0xdc, 0xd6, 0x2d, 0xd6, 0x07, 0xbb, 0x8f, 0x4c, 0x8e, 0xaf, + 0x14, 0xde, 0x71, 0xa4, 0xb5, 0x3c, 0x58, 0x4a, 0x02, 0x71, 0x8a, 0xed, 0x2b, 0x0a, 0x16, 0x94, + 0xbe, 0x54, 0x3f, 0x24, 0xc1, 0x94, 0xd7, 0x63, 0x6f, 0x89, 0x08, 0xf3, 0xa7, 0x13, 0x4e, 0x46, + 0x7c, 0xe2, 0x09, 0x64, 0xf8, 0xd6, 0x04, 0xb3, 0x8a, 0x28, 0xfa, 0xc9, 0x44, 0x57, 0x4c, 0x2e, + 0x3a, 0xf7, 0xb5, 0x5a, 0x6b, 0x2e, 0xd5, 0x56, 0x17, 0xcb, 0x6a, 0x41, 0x46, 0x8f, 0x4b, 0x90, + 0x5d, 0xd7, 0x8d, 0xad, 0x70, 0x74, 0xa5, 0x93, 0xae, 0x1d, 0xd9, 0xc6, 0x8f, 0xb0, 0x96, 0x4e, + 0x5f, 0x94, 0x3b, 0xe0, 0xa4, 0xb1, 0xbb, 0x73, 0x09, 0x5b, 0xb5, 0x4d, 0x32, 0xca, 0xda, 0x0d, + 0xb3, 0x8e, 0x0d, 0x6a, 0x84, 0xe6, 0xd4, 0xbe, 0xdf, 0x78, 0x13, 0x4c, 0x60, 0xf2, 0xe0, 0x72, + 0x12, 0x21, 0x71, 0x9f, 0x29, 0x29, 0xc4, 0x54, 0xa2, 0x69, 0x43, 0x1f, 0xe2, 0xe9, 0x6b, 0xea, + 0x1f, 0xe6, 0xe0, 0x54, 0xd1, 0xd8, 0x27, 0x36, 0x05, 0xed, 0xe0, 0x4b, 0xdb, 0x9a, 0xb1, 0x85, + 0xc9, 0x00, 0xe1, 0x4b, 0x3c, 0x1c, 0xa2, 0x3f, 0xc3, 0x87, 0xe8, 0x57, 0x54, 0x98, 0x30, 0xad, + 0x36, 0xb6, 0x16, 0xf6, 0x09, 0x4f, 0xbd, 0xcb, 0xce, 0xac, 0x4d, 0xf6, 0x2b, 0x62, 0x9e, 0x91, + 0x9f, 0xaf, 0xd1, 0xff, 0x55, 0x8f, 0xd0, 0xf9, 0x5b, 0x61, 0x82, 0xa5, 0x29, 0x33, 0x30, 0x59, + 0x53, 0x17, 0xcb, 0x6a, 0xb3, 0xb2, 0x58, 0x38, 0xa6, 0x5c, 0x05, 0xc7, 0x2b, 0x8d, 0xb2, 0x5a, + 0x6c, 0x54, 0x6a, 0xd5, 0x26, 0x49, 0x2f, 0x64, 0xd0, 0x0b, 0xb3, 0xa2, 0x9e, 0xbd, 0xf1, 0xcc, + 0xf4, 0x83, 0x55, 0x85, 0x89, 0x16, 0xcd, 0x40, 0x86, 0xd0, 0xe9, 0x44, 0xb5, 0x63, 0x04, 0x69, + 0x82, 0xea, 0x11, 0x52, 0xce, 0x02, 0x5c, 0xb1, 0x4c, 0x63, 0x2b, 0x38, 0x75, 0x38, 0xa9, 0x86, + 0x52, 0xd0, 0xa3, 0x19, 0xc8, 0xd3, 0x7f, 0xc8, 0x95, 0x24, 0xe4, 0x29, 0x10, 0xbc, 0xf7, 0xee, + 0x5a, 0xbc, 0x44, 0x5e, 0xc1, 0x44, 0x8b, 0xbd, 0xba, 0xba, 0x48, 0x65, 0x40, 0x2d, 0x61, 0x56, + 0x95, 0xdb, 0x20, 0x4f, 0xff, 0x65, 0x5e, 0x07, 0xd1, 0xe1, 0x45, 0x69, 0x36, 0x41, 0x3f, 0x65, + 0x71, 0x99, 0xa6, 0xaf, 0xcd, 0xbf, 0x23, 0xc1, 0x64, 0x15, 0x3b, 0xa5, 0x6d, 0xdc, 0xba, 0x8c, + 0x9e, 0xc2, 0x2f, 0x80, 0x76, 0x74, 0x6c, 0x38, 0x0f, 0xed, 0x74, 0xfc, 0x05, 0x50, 0x2f, 0x01, + 0xfd, 0x68, 0xb8, 0xf3, 0xbd, 0x9f, 0xd7, 0x9f, 0x5b, 0xfa, 0xd4, 0xd5, 0x2b, 0x21, 0x42, 0x65, + 0x4e, 0x43, 0xde, 0xc2, 0xf6, 0x6e, 0xc7, 0x5b, 0x44, 0x63, 0x6f, 0xe8, 0x75, 0xbe, 0x38, 0x4b, + 0x9c, 0x38, 0x6f, 0x13, 0x2f, 0x62, 0x0c, 0xf1, 0x4a, 0xb3, 0x30, 0x51, 0x31, 0x74, 0x47, 0xd7, + 0x3a, 0xe8, 0xc5, 0x59, 0x98, 0xad, 0x63, 0x67, 0x5d, 0xb3, 0xb4, 0x1d, 0xec, 0x60, 0xcb, 0x46, + 0x5f, 0xe3, 0xfb, 0x84, 0x6e, 0x47, 0x73, 0x36, 0x4d, 0x6b, 0xc7, 0x53, 0x4d, 0xef, 0xdd, 0x55, + 0xcd, 0x3d, 0x6c, 0xd9, 0x01, 0x5f, 0xde, 0xab, 0xfb, 0xe5, 0x8a, 0x69, 0x5d, 0x76, 0x07, 0x41, + 0x36, 0x4d, 0x63, 0xaf, 0x2e, 0xbd, 0x8e, 0xb9, 0xb5, 0x8a, 0xf7, 0xb0, 0x17, 0x2e, 0xcd, 0x7f, + 0x77, 0xe7, 0x02, 0x6d, 0xb3, 0x6a, 0x3a, 0x6e, 0xa7, 0xbd, 0x6a, 0x6e, 0xd1, 0x78, 0xb1, 0x93, + 0x2a, 0x9f, 0x18, 0xe4, 0xd2, 0xf6, 0x30, 0xc9, 0x95, 0x0f, 0xe7, 0x62, 0x89, 0xca, 0x3c, 0x28, + 0xfe, 0x6f, 0x0d, 0xdc, 0xc1, 0x3b, 0xd8, 0xb1, 0xf6, 0xc9, 0xb5, 0x10, 0x93, 0x6a, 0x9f, 0x2f, + 0x6c, 0x80, 0x16, 0x9f, 0xac, 0x33, 0xe9, 0xcd, 0x73, 0x92, 0x3b, 0xd4, 0x64, 0x5d, 0x84, 0xe2, + 0x58, 0xae, 0xbd, 0x92, 0x5d, 0x6b, 0xe6, 0xe7, 0x65, 0xc8, 0x92, 0xc1, 0xf3, 0x8d, 0x19, 0x6e, + 0x85, 0x69, 0x07, 0xdb, 0xb6, 0xb6, 0x85, 0xbd, 0x15, 0x26, 0xf6, 0xaa, 0xdc, 0x09, 0xb9, 0x0e, + 0xc1, 0x94, 0x0e, 0x0e, 0x37, 0x70, 0x35, 0x73, 0x0d, 0x0c, 0x97, 0x96, 0x3f, 0x12, 0x10, 0xb8, + 0x55, 0xfa, 0xc7, 0xf9, 0x07, 0x20, 0x47, 0xe1, 0x9f, 0x82, 0xdc, 0x62, 0x79, 0x61, 0x63, 0xb9, + 0x70, 0xcc, 0x7d, 0xf4, 0xf8, 0x9b, 0x82, 0xdc, 0x52, 0xb1, 0x51, 0x5c, 0x2d, 0x48, 0x6e, 0x3d, + 0x2a, 0xd5, 0xa5, 0x5a, 0x41, 0x76, 0x13, 0xd7, 0x8b, 0xd5, 0x4a, 0xa9, 0x90, 0x55, 0xa6, 0x61, + 0xe2, 0x62, 0x51, 0xad, 0x56, 0xaa, 0xcb, 0x85, 0x1c, 0xfa, 0xdb, 0x30, 0x7e, 0x77, 0xf1, 0xf8, + 0xdd, 0x18, 0xc5, 0x53, 0x3f, 0xc8, 0x7e, 0xc1, 0x87, 0xec, 0x1e, 0x0e, 0xb2, 0xef, 0x14, 0x21, + 0x32, 0x06, 0x77, 0xa6, 0x3c, 0x4c, 0xac, 0x5b, 0x66, 0x0b, 0xdb, 0x36, 0xfa, 0x19, 0x09, 0xf2, + 0x25, 0xcd, 0x68, 0xe1, 0x0e, 0xba, 0x26, 0x80, 0x8a, 0xba, 0x8a, 0x66, 0xfc, 0xd3, 0x62, 0xff, + 0x98, 0x11, 0xed, 0xfd, 0x18, 0xdd, 0x79, 0x4a, 0x33, 0x42, 0x3e, 0x62, 0xbd, 0x5c, 0x2c, 0xa9, + 0x31, 0x5c, 0x8d, 0x23, 0xc1, 0x14, 0x5b, 0x0d, 0xb8, 0x84, 0xc3, 0xf3, 0xf0, 0xaf, 0x65, 0x44, + 0x27, 0x87, 0x5e, 0x0d, 0x7c, 0x32, 0x11, 0xf2, 0x10, 0x9b, 0x08, 0x0e, 0xa2, 0x36, 0x86, 0xcd, + 0x43, 0x09, 0xa6, 0x37, 0x0c, 0xbb, 0x9f, 0x50, 0xc4, 0xe3, 0xe8, 0x7b, 0xd5, 0x08, 0x11, 0x3a, + 0x54, 0x1c, 0xfd, 0xc1, 0xf4, 0xd2, 0x17, 0xcc, 0xd7, 0x32, 0x70, 0x72, 0x19, 0x1b, 0xd8, 0xd2, + 0x5b, 0xb4, 0x06, 0x9e, 0x24, 0xee, 0xe1, 0x25, 0xf1, 0x14, 0x8e, 0xf3, 0x7e, 0x7f, 0xf0, 0x12, + 0x78, 0x8d, 0x2f, 0x81, 0xfb, 0x39, 0x09, 0xdc, 0x2a, 0x48, 0x67, 0x0c, 0xf7, 0xa1, 0x4f, 0xc1, + 0x4c, 0xd5, 0x74, 0xf4, 0x4d, 0xbd, 0x45, 0x7d, 0xd0, 0x7e, 0x4e, 0x86, 0xec, 0xaa, 0x6e, 0x3b, + 0xa8, 0x18, 0x74, 0x27, 0xe7, 0x60, 0x5a, 0x37, 0x5a, 0x9d, 0xdd, 0x36, 0x56, 0xb1, 0x46, 0xfb, + 0x95, 0x49, 0x35, 0x9c, 0x14, 0x6c, 0xed, 0xbb, 0x6c, 0xc9, 0xde, 0xd6, 0xfe, 0x47, 0x85, 0x97, + 0x61, 0xc2, 0x2c, 0x90, 0x80, 0x94, 0x11, 0x76, 0x57, 0x11, 0x66, 0x8d, 0x50, 0x56, 0xcf, 0x60, + 0xef, 0xbd, 0x50, 0x20, 0x4c, 0x4e, 0xe5, 0xff, 0x40, 0xef, 0x16, 0x6a, 0xac, 0x83, 0x18, 0x4a, + 0x86, 0xcc, 0xd2, 0x10, 0x93, 0x64, 0x05, 0xe6, 0x2a, 0xd5, 0x46, 0x59, 0xad, 0x16, 0x57, 0x59, + 0x16, 0x19, 0x7d, 0x43, 0x82, 0x9c, 0x8a, 0xbb, 0x9d, 0xfd, 0x70, 0xc4, 0x68, 0xe6, 0x28, 0x9e, + 0xf1, 0x1d, 0xc5, 0x95, 0x25, 0x00, 0xad, 0xe5, 0x16, 0x4c, 0xae, 0xd4, 0x92, 0xfa, 0xc6, 0x31, + 0xe5, 0x2a, 0x58, 0xf4, 0x73, 0xab, 0xa1, 0x3f, 0xd1, 0x4b, 0x84, 0x77, 0x8e, 0x38, 0x6a, 0x84, + 0xc3, 0x88, 0x3e, 0xe1, 0x3d, 0x42, 0x9b, 0x3d, 0x03, 0xc9, 0x1d, 0x8d, 0xf8, 0x3f, 0x2b, 0x41, + 0xb6, 0xe1, 0xf6, 0x96, 0xa1, 0x8e, 0xf3, 0x8f, 0x86, 0xd3, 0x71, 0x97, 0x4c, 0x84, 0x8e, 0xdf, + 0x07, 0x33, 0x61, 0x8d, 0x65, 0xae, 0x12, 0xb1, 0x2a, 0xce, 0xfd, 0x30, 0x8c, 0x86, 0xf7, 0x61, + 0xe7, 0x68, 0x44, 0xfc, 0xe1, 0xa7, 0x02, 0xac, 0xe1, 0x9d, 0x4b, 0xd8, 0xb2, 0xb7, 0xf5, 0x2e, + 0xfa, 0x3b, 0x19, 0xa6, 0x96, 0xb1, 0x53, 0x77, 0x34, 0x67, 0xd7, 0xee, 0xd9, 0xee, 0x34, 0xcc, + 0x92, 0xd6, 0xda, 0xc6, 0xac, 0x3b, 0xf2, 0x5e, 0xd1, 0xdb, 0x65, 0x51, 0x7f, 0xa2, 0xa0, 0x9c, + 0x79, 0xbf, 0x8c, 0x08, 0x4c, 0x9e, 0x06, 0xd9, 0xb6, 0xe6, 0x68, 0x0c, 0x8b, 0x6b, 0x7a, 0xb0, + 0x08, 0x08, 0xa9, 0x24, 0x1b, 0xfa, 0x0d, 0x49, 0xc4, 0xa1, 0x48, 0xa0, 0xfc, 0x64, 0x20, 0xbc, + 0x3b, 0x33, 0x04, 0x0a, 0x27, 0x60, 0xb6, 0x5a, 0x6b, 0x34, 0x57, 0x6b, 0xcb, 0xcb, 0x65, 0x37, + 0xb5, 0x20, 0x2b, 0xa7, 0x41, 0x59, 0x2f, 0x3e, 0xb4, 0x56, 0xae, 0x36, 0x9a, 0xd5, 0xda, 0x62, + 0x99, 0xfd, 0x99, 0x55, 0x8e, 0xc3, 0x74, 0xa9, 0x58, 0x5a, 0xf1, 0x12, 0x72, 0xca, 0x19, 0x38, + 0xb9, 0x56, 0x5e, 0x5b, 0x28, 0xab, 0xf5, 0x95, 0xca, 0x7a, 0xd3, 0x25, 0xb3, 0x54, 0xdb, 0xa8, + 0x2e, 0x16, 0xf2, 0x0a, 0x82, 0xd3, 0xa1, 0x2f, 0x17, 0xd5, 0x5a, 0x75, 0xb9, 0x59, 0x6f, 0x14, + 0x1b, 0xe5, 0xc2, 0x84, 0x72, 0x15, 0x1c, 0x2f, 0x15, 0xab, 0x24, 0x7b, 0xa9, 0x56, 0xad, 0x96, + 0x4b, 0x8d, 0xc2, 0x24, 0xfa, 0xf7, 0x2c, 0x4c, 0x57, 0xec, 0xaa, 0xb6, 0x83, 0x2f, 0x68, 0x1d, + 0xbd, 0x8d, 0x5e, 0x1c, 0x9a, 0x79, 0xdc, 0x08, 0xb3, 0x16, 0x7d, 0xc4, 0xed, 0x86, 0x8e, 0x29, + 0x9a, 0xb3, 0x2a, 0x9f, 0xe8, 0xce, 0xc9, 0x0d, 0x42, 0xc0, 0x9b, 0x93, 0xd3, 0x37, 0x65, 0x01, + 0x80, 0x3e, 0x35, 0x82, 0xcb, 0x5d, 0xcf, 0xf7, 0xb6, 0x26, 0x6d, 0x07, 0xdb, 0xd8, 0xda, 0xd3, + 0x5b, 0xd8, 0xcb, 0xa9, 0x86, 0xfe, 0x42, 0x9f, 0x93, 0x45, 0xf7, 0x17, 0x43, 0xa0, 0x86, 0xaa, + 0x13, 0xd1, 0x1b, 0xfe, 0x98, 0x2c, 0xb2, 0x3b, 0x28, 0x44, 0x32, 0x99, 0xa6, 0xbc, 0x4c, 0x1a, + 0x6e, 0xd9, 0xb6, 0x51, 0xab, 0x35, 0xeb, 0x2b, 0x35, 0xb5, 0x51, 0x90, 0x95, 0x19, 0x98, 0x74, + 0x5f, 0x57, 0x6b, 0xd5, 0xe5, 0x42, 0x56, 0x39, 0x05, 0x27, 0x56, 0x8a, 0xf5, 0x66, 0xa5, 0x7a, + 0xa1, 0xb8, 0x5a, 0x59, 0x6c, 0x96, 0x56, 0x8a, 0x6a, 0xbd, 0x90, 0x53, 0xae, 0x81, 0x53, 0x8d, + 0x4a, 0x59, 0x6d, 0x2e, 0x95, 0x8b, 0x8d, 0x0d, 0xb5, 0x5c, 0x6f, 0x56, 0x6b, 0xcd, 0x6a, 0x71, + 0xad, 0x5c, 0xc8, 0xbb, 0xcd, 0x9f, 0x7c, 0x0a, 0xd4, 0x66, 0xe2, 0xa0, 0x32, 0x4e, 0x46, 0x28, + 0xe3, 0x54, 0xaf, 0x32, 0x42, 0x58, 0xad, 0xd4, 0x72, 0xbd, 0xac, 0x5e, 0x28, 0x17, 0xa6, 0xfb, + 0xe9, 0xda, 0x8c, 0x72, 0x12, 0x0a, 0x2e, 0x0f, 0xcd, 0x4a, 0xdd, 0xcb, 0xb9, 0x58, 0x98, 0x45, + 0x1f, 0xca, 0xc3, 0x69, 0x15, 0x6f, 0xe9, 0xb6, 0x83, 0xad, 0x75, 0x6d, 0x7f, 0x07, 0x1b, 0x8e, + 0xd7, 0xc9, 0xff, 0x4b, 0x62, 0x65, 0x5c, 0x83, 0xd9, 0x2e, 0xa5, 0xb1, 0x86, 0x9d, 0x6d, 0xb3, + 0xcd, 0x46, 0xe1, 0xa7, 0x44, 0xf6, 0x1c, 0xf3, 0xeb, 0xe1, 0xec, 0x2a, 0xff, 0x77, 0x48, 0xb7, + 0xe5, 0x18, 0xdd, 0xce, 0x0e, 0xa3, 0xdb, 0xca, 0x75, 0x30, 0xb5, 0x6b, 0x63, 0xab, 0xbc, 0xa3, + 0xe9, 0x1d, 0xef, 0x72, 0x4e, 0x3f, 0x01, 0xbd, 0x25, 0x2b, 0x7a, 0x62, 0x25, 0x54, 0x97, 0xfe, + 0x62, 0x8c, 0xe8, 0x5b, 0xcf, 0x02, 0xb0, 0xca, 0x6e, 0x58, 0x1d, 0xa6, 0xac, 0xa1, 0x14, 0x97, + 0xbf, 0x4b, 0x7a, 0xa7, 0xa3, 0x1b, 0x5b, 0xfe, 0xbe, 0x7f, 0x90, 0x80, 0x5e, 0x26, 0x8b, 0x9c, + 0x60, 0x49, 0xca, 0x5b, 0xb2, 0xd6, 0xf4, 0x12, 0x69, 0xcc, 0xfd, 0xee, 0xc1, 0xa6, 0x93, 0x57, + 0x0a, 0x30, 0x43, 0xd2, 0x58, 0x0b, 0x2c, 0x4c, 0xb8, 0x7d, 0xb0, 0x47, 0x6e, 0xad, 0xdc, 0x58, + 0xa9, 0x2d, 0xfa, 0xdf, 0x26, 0x5d, 0x92, 0x2e, 0x33, 0xc5, 0xea, 0x43, 0xa4, 0x35, 0x4e, 0x29, + 0x4f, 0x82, 0x6b, 0x42, 0x1d, 0x76, 0x71, 0x55, 0x2d, 0x17, 0x17, 0x1f, 0x6a, 0x96, 0x9f, 0x5b, + 0xa9, 0x37, 0xea, 0x7c, 0xe3, 0xf2, 0xda, 0xd1, 0xb4, 0xcb, 0x6f, 0x79, 0xad, 0x58, 0x59, 0x65, + 0xfd, 0xfb, 0x52, 0x4d, 0x5d, 0x2b, 0x36, 0x0a, 0x33, 0xe8, 0xe7, 0x65, 0x28, 0x2c, 0x63, 0x67, + 0xdd, 0xb4, 0x1c, 0xad, 0xb3, 0xaa, 0x1b, 0x97, 0x37, 0xac, 0x0e, 0x37, 0xd9, 0x14, 0x0e, 0xd3, + 0xc1, 0x0f, 0x91, 0x1c, 0xc1, 0xe8, 0x1d, 0xf1, 0x2e, 0xc9, 0x16, 0x28, 0x53, 0x90, 0x80, 0x9e, + 0x2f, 0x89, 0x2c, 0x77, 0x8b, 0x97, 0x9a, 0x4c, 0x4f, 0x5e, 0x30, 0xee, 0xf1, 0xb9, 0x0f, 0x6a, + 0x79, 0xf4, 0xa2, 0x2c, 0x4c, 0x2e, 0xe9, 0x86, 0xd6, 0xd1, 0x9f, 0xc7, 0xc5, 0x2f, 0x0d, 0xfa, + 0x98, 0x4c, 0x4c, 0x1f, 0x23, 0x0d, 0x35, 0x7e, 0xfe, 0x94, 0x2c, 0xba, 0xbc, 0x10, 0x92, 0xbd, + 0xc7, 0x64, 0xc4, 0xe0, 0xf9, 0x3e, 0x49, 0x64, 0x79, 0x61, 0x30, 0xbd, 0x64, 0x18, 0x7e, 0xe4, + 0x5b, 0xc3, 0xc6, 0xea, 0x69, 0xdf, 0x93, 0xfd, 0x54, 0x61, 0x0a, 0xfd, 0x99, 0x0c, 0x68, 0x19, + 0x3b, 0x17, 0xb0, 0xe5, 0x4f, 0x05, 0x48, 0xaf, 0xcf, 0xec, 0xed, 0x50, 0x93, 0x7d, 0x63, 0x18, + 0xc0, 0x8b, 0x3c, 0x80, 0xc5, 0x98, 0xc6, 0x13, 0x41, 0x3a, 0xa2, 0xf1, 0x56, 0x20, 0x6f, 0x93, + 0xef, 0x4c, 0xcd, 0x9e, 0x1e, 0x3d, 0x5c, 0x12, 0x62, 0x61, 0xea, 0x94, 0xb0, 0xca, 0x08, 0xa0, + 0xaf, 0xfb, 0x93, 0xa0, 0xef, 0xe5, 0xb4, 0x63, 0xe9, 0xd0, 0xcc, 0x26, 0xd3, 0x17, 0x2b, 0x5d, + 0x75, 0xe9, 0x67, 0xdf, 0xa0, 0xf7, 0xe5, 0xe0, 0x64, 0xbf, 0xea, 0xa0, 0xdf, 0xcc, 0x70, 0x3b, + 0xec, 0x98, 0x0c, 0xf9, 0x19, 0xb6, 0x81, 0xe8, 0xbe, 0x28, 0xcf, 0x84, 0x53, 0xfe, 0x32, 0x5c, + 0xc3, 0xac, 0xe2, 0x2b, 0x76, 0x07, 0x3b, 0x0e, 0xb6, 0x48, 0xd5, 0x26, 0xd5, 0xfe, 0x1f, 0x95, + 0x67, 0xc3, 0xd5, 0xba, 0x61, 0xeb, 0x6d, 0x6c, 0x35, 0xf4, 0xae, 0x5d, 0x34, 0xda, 0x8d, 0x5d, + 0xc7, 0xb4, 0x74, 0x8d, 0x5d, 0x25, 0x39, 0xa9, 0x46, 0x7d, 0x56, 0x6e, 0x81, 0x82, 0x6e, 0xd7, + 0x8c, 0x4b, 0xa6, 0x66, 0xb5, 0x75, 0x63, 0x6b, 0x55, 0xb7, 0x1d, 0xe6, 0x01, 0x7c, 0x20, 0x1d, + 0xfd, 0xbd, 0x2c, 0x7a, 0x98, 0x6e, 0x00, 0xac, 0x11, 0x1d, 0xca, 0x8f, 0xca, 0x22, 0xc7, 0xe3, + 0x92, 0xd1, 0x4e, 0xa6, 0x2c, 0x2f, 0x1c, 0xb7, 0x21, 0xd1, 0x7f, 0x04, 0x27, 0x5d, 0x0b, 0x4d, + 0xf7, 0x0c, 0x81, 0x0b, 0x65, 0xb5, 0xb2, 0x54, 0x29, 0xbb, 0x66, 0xc5, 0x29, 0x38, 0x11, 0x7c, + 0x5b, 0x7c, 0xa8, 0x59, 0x2f, 0x57, 0x1b, 0x85, 0x49, 0xb7, 0x9f, 0xa2, 0xc9, 0x4b, 0xc5, 0xca, + 0x6a, 0x79, 0xb1, 0xd9, 0xa8, 0xb9, 0x5f, 0x16, 0x87, 0x33, 0x2d, 0xd0, 0xa3, 0x59, 0x38, 0x4e, + 0x64, 0xbb, 0x4f, 0xa4, 0xea, 0x0a, 0xa5, 0xc7, 0xd7, 0xd6, 0x07, 0x68, 0x8a, 0x8a, 0x17, 0x7d, + 0x5c, 0xf8, 0xa6, 0xcc, 0x10, 0x84, 0x3d, 0x65, 0x44, 0x68, 0xc6, 0xd7, 0x24, 0x91, 0x08, 0x15, + 0xc2, 0x64, 0x93, 0x29, 0xc5, 0xbf, 0x8e, 0x7b, 0xc4, 0x89, 0x06, 0x9f, 0x58, 0x99, 0x25, 0xf2, + 0xf3, 0x73, 0xd7, 0x2b, 0x2a, 0x51, 0x87, 0x39, 0x00, 0x92, 0x42, 0x34, 0x88, 0xea, 0x41, 0xdf, + 0xf1, 0x2a, 0x4a, 0x0f, 0x8a, 0xa5, 0x46, 0xe5, 0x42, 0x39, 0x4a, 0x0f, 0x3e, 0x26, 0xc3, 0xe4, + 0x32, 0x76, 0xdc, 0x39, 0x95, 0x8d, 0x9e, 0x23, 0xb0, 0xfe, 0xe3, 0x9a, 0x31, 0x1d, 0xb3, 0xa5, + 0x75, 0xfc, 0x65, 0x00, 0xfa, 0x86, 0x7e, 0x64, 0x18, 0x13, 0xc4, 0x2b, 0x3a, 0x62, 0xbc, 0xfa, + 0x6e, 0xc8, 0x39, 0xee, 0x67, 0xb6, 0x0c, 0xfd, 0x1d, 0x91, 0xc3, 0x95, 0x4b, 0x64, 0x51, 0x73, + 0x34, 0x95, 0xe6, 0x0f, 0x8d, 0x4e, 0x82, 0xb6, 0x4b, 0x04, 0x23, 0xdf, 0x8a, 0xf6, 0xe7, 0xdf, + 0xca, 0x70, 0x8a, 0xb6, 0x8f, 0x62, 0xb7, 0x5b, 0x77, 0x4c, 0x0b, 0xab, 0xb8, 0x85, 0xf5, 0xae, + 0xd3, 0xb3, 0xbe, 0x67, 0xd1, 0x54, 0x6f, 0xb3, 0x99, 0xbd, 0xa2, 0x5f, 0x92, 0x45, 0x63, 0x30, + 0x1f, 0x68, 0x8f, 0x3d, 0xe5, 0x45, 0x34, 0xf6, 0x0f, 0x4a, 0x22, 0x51, 0x95, 0x13, 0x12, 0x4f, + 0x06, 0xd4, 0xef, 0x1d, 0x01, 0x50, 0xde, 0xca, 0x8d, 0x5a, 0x2e, 0x95, 0x2b, 0xeb, 0xee, 0x20, + 0x70, 0x3d, 0x5c, 0xbb, 0xbe, 0xa1, 0x96, 0x56, 0x8a, 0xf5, 0x72, 0x53, 0x2d, 0x2f, 0x57, 0xea, + 0x0d, 0xe6, 0x94, 0x45, 0xff, 0x9a, 0x50, 0xae, 0x83, 0x33, 0xf5, 0x8d, 0x85, 0x7a, 0x49, 0xad, + 0xac, 0x93, 0x74, 0xb5, 0x5c, 0x2d, 0x5f, 0x64, 0x5f, 0x27, 0xd1, 0x7b, 0x0b, 0x30, 0xed, 0x4e, + 0x00, 0xea, 0x74, 0x5e, 0x80, 0xbe, 0x9c, 0x85, 0x69, 0x15, 0xdb, 0x66, 0x67, 0x8f, 0xcc, 0x11, + 0xc6, 0x35, 0xf5, 0xf8, 0xaa, 0x2c, 0x7a, 0x7e, 0x3b, 0xc4, 0xec, 0x7c, 0x88, 0xd1, 0xe8, 0x89, + 0xa6, 0xb6, 0xa7, 0xe9, 0x1d, 0xed, 0x12, 0xeb, 0x6a, 0x26, 0xd5, 0x20, 0x41, 0x99, 0x07, 0xc5, + 0xbc, 0x62, 0x60, 0xab, 0xde, 0xba, 0x52, 0x76, 0xb6, 0x8b, 0xed, 0xb6, 0x85, 0x6d, 0x9b, 0xad, + 0x5e, 0xf4, 0xf9, 0xa2, 0xdc, 0x0c, 0xc7, 0x49, 0x6a, 0x28, 0x33, 0x75, 0x90, 0xe9, 0x4d, 0xf6, + 0x73, 0x16, 0x8d, 0x7d, 0x2f, 0x67, 0x2e, 0x94, 0x33, 0x48, 0x0e, 0x1f, 0x97, 0xc8, 0xf3, 0xa7, + 0x74, 0xce, 0xc1, 0xb4, 0xa1, 0xed, 0xe0, 0xf2, 0x23, 0x5d, 0xdd, 0xc2, 0x36, 0x71, 0x8c, 0x91, + 0xd5, 0x70, 0x12, 0x7a, 0x9f, 0xd0, 0x79, 0x73, 0x31, 0x89, 0x25, 0xd3, 0xfd, 0xe5, 0x21, 0x54, + 0xbf, 0x4f, 0x3f, 0x23, 0xa3, 0xf7, 0xca, 0x30, 0xc3, 0x98, 0x2a, 0x1a, 0xfb, 0x95, 0x36, 0xba, + 0x9e, 0x33, 0x7e, 0x35, 0x37, 0xcd, 0x33, 0x7e, 0xc9, 0x0b, 0xfa, 0x71, 0x59, 0xd4, 0xdd, 0xb9, + 0x4f, 0xc5, 0x49, 0x19, 0xd1, 0x8e, 0xa3, 0x9b, 0xe6, 0x2e, 0x73, 0x54, 0x9d, 0x54, 0xe9, 0x4b, + 0x9a, 0x8b, 0x7a, 0xe8, 0x77, 0x85, 0x9c, 0xa9, 0x05, 0xab, 0x71, 0x44, 0x00, 0x7e, 0x58, 0x86, + 0x39, 0xc6, 0x55, 0x9d, 0x9d, 0xf3, 0x11, 0x3a, 0xf0, 0xf6, 0x13, 0xc2, 0x86, 0x60, 0x9f, 0xfa, + 0xb3, 0x92, 0x9e, 0x30, 0x40, 0xbe, 0x5f, 0x28, 0x38, 0x9a, 0x70, 0x45, 0x8e, 0x08, 0xca, 0xb7, + 0x66, 0x61, 0x7a, 0xc3, 0xc6, 0x16, 0xf3, 0xdb, 0x47, 0xaf, 0xcb, 0x82, 0xbc, 0x8c, 0xb9, 0x8d, + 0xd4, 0x97, 0x0a, 0x7b, 0xf8, 0x86, 0x2b, 0x1b, 0x22, 0xea, 0xda, 0x48, 0x11, 0xb0, 0xdd, 0x04, + 0x73, 0x54, 0xa4, 0x45, 0xc7, 0x71, 0x8d, 0x44, 0xcf, 0x9b, 0xb6, 0x27, 0x75, 0x14, 0x5b, 0x45, + 0xa4, 0x2c, 0x37, 0x4b, 0xc9, 0xe5, 0x69, 0x15, 0x6f, 0xd2, 0xf9, 0x6c, 0x56, 0xed, 0x49, 0x55, + 0x6e, 0x87, 0xab, 0xcc, 0x2e, 0xa6, 0xe7, 0x57, 0x42, 0x99, 0x73, 0x24, 0x73, 0xbf, 0x4f, 0xe8, + 0xcb, 0x42, 0xbe, 0xba, 0xe2, 0xd2, 0x49, 0xa6, 0x0b, 0xdd, 0xd1, 0x98, 0x24, 0x27, 0xa1, 0xe0, + 0xe6, 0x20, 0xfb, 0x2f, 0x6a, 0xb9, 0x5e, 0x5b, 0xbd, 0x50, 0xee, 0xbf, 0x8c, 0x91, 0x43, 0x2f, + 0x94, 0x61, 0x6a, 0xc1, 0x32, 0xb5, 0x76, 0x4b, 0xb3, 0x1d, 0xf4, 0x75, 0x09, 0x66, 0xd6, 0xb5, + 0xfd, 0x8e, 0xa9, 0xb5, 0x89, 0x7f, 0x7f, 0x4f, 0x5f, 0xd0, 0xa5, 0x9f, 0xbc, 0xbe, 0x80, 0xbd, + 0xf2, 0x07, 0x03, 0xfd, 0xa3, 0x7b, 0x19, 0x91, 0x0b, 0x35, 0xfd, 0x6d, 0x3e, 0xa9, 0x5f, 0xb0, + 0x52, 0x8f, 0xaf, 0xf9, 0x30, 0x4f, 0x11, 0x16, 0xe5, 0x7b, 0xc5, 0xc2, 0x8f, 0x8a, 0x90, 0x3c, + 0x9a, 0x5d, 0xf9, 0x17, 0x4d, 0x42, 0x7e, 0x11, 0x13, 0x2b, 0xee, 0x7f, 0x48, 0x30, 0x51, 0xc7, + 0x0e, 0xb1, 0xe0, 0xee, 0xe4, 0x3c, 0x85, 0xdb, 0x24, 0x43, 0xe0, 0xc4, 0xee, 0xbd, 0xbb, 0x93, + 0xf5, 0xd0, 0x79, 0x6b, 0xf2, 0x9c, 0xc0, 0x23, 0x91, 0x96, 0x3b, 0xcf, 0xca, 0x3c, 0x94, 0x47, + 0x62, 0x2c, 0xa9, 0xf4, 0x7d, 0xad, 0xde, 0x2e, 0x31, 0xd7, 0xaa, 0x50, 0xaf, 0xf7, 0x8b, 0x61, + 0xfd, 0x8c, 0xf5, 0x36, 0x63, 0xcc, 0xc7, 0x38, 0x47, 0x3d, 0x03, 0x26, 0xa8, 0xcc, 0xbd, 0xf9, + 0x68, 0xaf, 0x9f, 0x02, 0x25, 0x41, 0xce, 0x5e, 0x7b, 0x39, 0x05, 0x5d, 0xd4, 0xa2, 0x0b, 0x1f, + 0x4b, 0x0c, 0x82, 0x99, 0x2a, 0x76, 0xae, 0x98, 0xd6, 0xe5, 0xba, 0xa3, 0x39, 0x18, 0xfd, 0xab, + 0x04, 0x72, 0x1d, 0x3b, 0xe1, 0xe8, 0x27, 0x55, 0x38, 0x41, 0x2b, 0xc4, 0x32, 0x92, 0xfe, 0x9b, + 0x56, 0xe4, 0x5c, 0x5f, 0x21, 0x84, 0xf2, 0xa9, 0x07, 0x7f, 0x45, 0x3f, 0xd3, 0x37, 0xe8, 0x93, + 0xd4, 0x67, 0xd2, 0xc0, 0x24, 0x13, 0x66, 0xd0, 0x55, 0xb0, 0x08, 0x3d, 0xfd, 0x1d, 0x21, 0xb3, + 0x5a, 0x8c, 0xe6, 0xd1, 0x74, 0x05, 0xef, 0xbf, 0x06, 0xb2, 0xa5, 0x6d, 0xcd, 0x41, 0x6f, 0x93, + 0x01, 0x8a, 0xed, 0xf6, 0x1a, 0xf5, 0x01, 0x0f, 0x3b, 0xa4, 0x9d, 0x87, 0x99, 0xd6, 0xb6, 0x16, + 0xdc, 0x6d, 0x42, 0xfb, 0x03, 0x2e, 0x4d, 0x79, 0x66, 0xe0, 0x4c, 0x4e, 0xa5, 0x8a, 0x7a, 0x60, + 0x72, 0xcb, 0x60, 0xb4, 0x7d, 0x47, 0x73, 0x3e, 0x14, 0x66, 0xec, 0x11, 0x3a, 0xf7, 0xf7, 0xf9, + 0x80, 0xbd, 0xe8, 0x39, 0x1c, 0x23, 0xed, 0x1f, 0xb0, 0x09, 0x12, 0x12, 0x9e, 0xf4, 0x16, 0x0b, + 0xe8, 0x11, 0xcf, 0xd7, 0x58, 0x42, 0xd7, 0x2a, 0xe5, 0xb6, 0xee, 0x89, 0x96, 0x05, 0xcc, 0x42, + 0x2f, 0xc9, 0x24, 0x83, 0x2f, 0x5e, 0x70, 0xf7, 0xc3, 0x2c, 0x6e, 0xeb, 0x0e, 0xf6, 0x6a, 0xc9, + 0x04, 0x18, 0x07, 0x31, 0xff, 0x03, 0x7a, 0x81, 0x70, 0xd0, 0x35, 0x22, 0xd0, 0x83, 0x35, 0x8a, + 0x68, 0x7f, 0x62, 0x61, 0xd4, 0xc4, 0x68, 0xa6, 0x0f, 0xd6, 0x8f, 0xc8, 0x70, 0xaa, 0x61, 0x6e, + 0x6d, 0x75, 0xb0, 0x27, 0x26, 0x4c, 0xbd, 0x33, 0x91, 0x36, 0x4a, 0xb8, 0xc8, 0x4e, 0x90, 0xf9, + 0xb0, 0xee, 0x1f, 0x25, 0x73, 0x5f, 0xf8, 0x13, 0x53, 0xb1, 0xb3, 0x28, 0x22, 0xae, 0xbe, 0x7c, + 0x46, 0xa0, 0x20, 0x16, 0xf0, 0x59, 0x98, 0x6c, 0xfa, 0x40, 0x7c, 0x5a, 0x82, 0x59, 0x7a, 0x73, + 0xa5, 0xa7, 0xa0, 0x0f, 0x8e, 0x10, 0x00, 0xf4, 0xf5, 0x8c, 0xa8, 0x9f, 0x2d, 0x91, 0x09, 0xc7, + 0x49, 0x84, 0x88, 0xc5, 0x82, 0xaa, 0x0c, 0x24, 0x97, 0xbe, 0x68, 0xff, 0x58, 0x86, 0xe9, 0x65, + 0xec, 0xb5, 0x34, 0x3b, 0x71, 0x4f, 0x74, 0x1e, 0x66, 0xc8, 0xf5, 0x6d, 0x35, 0x76, 0x4c, 0x92, + 0xae, 0x9a, 0x71, 0x69, 0xca, 0x8d, 0x30, 0x7b, 0x09, 0x6f, 0x9a, 0x16, 0xae, 0x71, 0x67, 0x29, + 0xf9, 0xc4, 0x88, 0xf0, 0x74, 0x5c, 0x1c, 0xb4, 0x05, 0x1e, 0x9b, 0x5b, 0x0f, 0x0a, 0x33, 0x54, + 0x95, 0x88, 0x31, 0xe7, 0x59, 0x30, 0xc9, 0x90, 0xf7, 0xcc, 0xb4, 0xb8, 0x7e, 0xd1, 0xcf, 0x8b, + 0xde, 0xe0, 0x23, 0x5a, 0xe6, 0x10, 0x7d, 0x7a, 0x12, 0x26, 0xc6, 0x72, 0xbf, 0x7b, 0x21, 0x54, + 0xfe, 0xc2, 0x7e, 0xa5, 0x6d, 0xa3, 0xb5, 0x64, 0x98, 0x9e, 0x05, 0xf0, 0x1b, 0x87, 0x17, 0xd6, + 0x22, 0x94, 0xc2, 0x47, 0xae, 0x8f, 0x3d, 0xa8, 0xd7, 0x2b, 0x0e, 0xc2, 0xce, 0x88, 0x81, 0x11, + 0x3b, 0xe0, 0x27, 0xc2, 0x49, 0xfa, 0xe8, 0x7c, 0x54, 0x86, 0x53, 0xfe, 0xf9, 0xa3, 0x55, 0xcd, + 0x0e, 0xda, 0x5d, 0x29, 0x19, 0x44, 0xdc, 0x81, 0x0f, 0xbf, 0xb1, 0x7c, 0x25, 0xd9, 0x98, 0xd1, + 0x97, 0x93, 0xd1, 0xa2, 0xa3, 0xdc, 0x0a, 0x27, 0x8c, 0xdd, 0x1d, 0x5f, 0xea, 0xa4, 0xc5, 0xb3, + 0x16, 0x7e, 0xf0, 0x43, 0x92, 0x91, 0x49, 0x84, 0xf9, 0xb1, 0xcc, 0x29, 0xb9, 0x23, 0x5d, 0x4f, + 0x4b, 0x04, 0x23, 0xfa, 0xe7, 0x4c, 0xa2, 0xde, 0x6d, 0xf0, 0x99, 0xaf, 0x04, 0xbd, 0xd4, 0x11, + 0x1e, 0xf8, 0x3a, 0x3f, 0x01, 0xb9, 0xf2, 0x4e, 0xd7, 0xd9, 0x3f, 0xff, 0x64, 0x98, 0xad, 0x3b, + 0x16, 0xd6, 0x76, 0x42, 0x3b, 0x03, 0x8e, 0x79, 0x19, 0x1b, 0xde, 0xce, 0x00, 0x79, 0xb9, 0xeb, + 0x4e, 0x98, 0x30, 0xcc, 0xa6, 0xb6, 0xeb, 0x6c, 0x2b, 0xd7, 0x1f, 0x38, 0x52, 0xcf, 0xc0, 0xaf, + 0xb1, 0x18, 0x46, 0x9f, 0xbb, 0x9b, 0xac, 0x0d, 0xe7, 0x0d, 0xb3, 0xb8, 0xeb, 0x6c, 0x2f, 0x5c, + 0xf7, 0xe1, 0xbf, 0x39, 0x9b, 0xf9, 0xd8, 0xdf, 0x9c, 0xcd, 0x7c, 0xf6, 0x6f, 0xce, 0x66, 0x7e, + 0xe2, 0xf3, 0x67, 0x8f, 0x7d, 0xec, 0xf3, 0x67, 0x8f, 0x7d, 0xfa, 0xf3, 0x67, 0x8f, 0x7d, 0xaf, + 0xd4, 0xbd, 0x74, 0x29, 0x4f, 0xa8, 0x3c, 0xe3, 0xff, 0x0d, 0x00, 0x00, 0xff, 0xff, 0xeb, 0xa8, + 0x5c, 0x9b, 0xeb, 0x0a, 0x02, 0x00, } func (m *Rpc) Marshal() (dAtA []byte, err error) { @@ -88736,6 +88801,18 @@ func (m *RpcObjectListExportRequest) MarshalToSizedBuffer(dAtA []byte) (int, err _ = i var l int _ = l + if m.LinksStateFilters != nil { + { + size, err := m.LinksStateFilters.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintCommands(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x62 + } if m.NoProgress { i-- if m.NoProgress { @@ -88827,6 +88904,48 @@ func (m *RpcObjectListExportRequest) MarshalToSizedBuffer(dAtA []byte) (int, err return len(dAtA) - i, nil } +func (m *RpcObjectListExportStateFilters) 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 *RpcObjectListExportStateFilters) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *RpcObjectListExportStateFilters) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.OnlyRootBlock { + i-- + if m.OnlyRootBlock { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x10 + } + if len(m.RelationsWhiteList) > 0 { + for iNdEx := len(m.RelationsWhiteList) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.RelationsWhiteList[iNdEx]) + copy(dAtA[i:], m.RelationsWhiteList[iNdEx]) + i = encodeVarintCommands(dAtA, i, uint64(len(m.RelationsWhiteList[iNdEx]))) + i-- + dAtA[i] = 0xa + } + } + return len(dAtA) - i, nil +} + func (m *RpcObjectListExportResponse) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -125335,6 +125454,28 @@ func (m *RpcObjectListExportRequest) Size() (n int) { if m.NoProgress { n += 2 } + if m.LinksStateFilters != nil { + l = m.LinksStateFilters.Size() + n += 1 + l + sovCommands(uint64(l)) + } + return n +} + +func (m *RpcObjectListExportStateFilters) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if len(m.RelationsWhiteList) > 0 { + for _, s := range m.RelationsWhiteList { + l = len(s) + n += 1 + l + sovCommands(uint64(l)) + } + } + if m.OnlyRootBlock { + n += 2 + } return n } @@ -179165,6 +179306,144 @@ func (m *RpcObjectListExportRequest) Unmarshal(dAtA []byte) error { } } m.NoProgress = bool(v != 0) + case 12: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field LinksStateFilters", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowCommands + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthCommands + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthCommands + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.LinksStateFilters == nil { + m.LinksStateFilters = &RpcObjectListExportStateFilters{} + } + if err := m.LinksStateFilters.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipCommands(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthCommands + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *RpcObjectListExportStateFilters) 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 ErrIntOverflowCommands + } + 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: StateFilters: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: StateFilters: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field RelationsWhiteList", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowCommands + } + 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 ErrInvalidLengthCommands + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthCommands + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.RelationsWhiteList = append(m.RelationsWhiteList, string(dAtA[iNdEx:postIndex])) + iNdEx = postIndex + case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field OnlyRootBlock", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowCommands + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.OnlyRootBlock = bool(v != 0) default: iNdEx = preIndex skippy, err := skipCommands(dAtA[iNdEx:]) diff --git a/pb/protos/commands.proto b/pb/protos/commands.proto index 1936b1602..6151d7c13 100644 --- a/pb/protos/commands.proto +++ b/pb/protos/commands.proto @@ -2782,8 +2782,13 @@ message Rpc { bool includeArchived = 9; // for integrations like raycast and web publishing bool noProgress = 11; + StateFilters linksStateFilters = 12; } + message StateFilters { + repeated string relationsWhiteList = 1; + bool onlyRootBlock = 2; + } message Response { Error error = 1; string path = 2; From a5e5d1e8f549d9be151ee7cbe484cb942edecfe4 Mon Sep 17 00:00:00 2001 From: Anatolii Smolianinov Date: Fri, 24 Jan 2025 13:32:01 +0100 Subject: [PATCH 150/195] GO-4943 use any.org domain --- core/publish/service.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/core/publish/service.go b/core/publish/service.go index dc1c9f702..de00232b3 100644 --- a/core/publish/service.go +++ b/core/publish/service.go @@ -39,9 +39,9 @@ const CName = "common.core.publishservice" const ( membershipLimit = 100 << 20 defaultLimit = 10 << 20 - inviteLinkUrlTemplate = "https://invite.any.coop/%s#%s" - memberUrlTemplate = "https://%s.coop" - defaultUrlTemplate = "https://any.coop/%s" + inviteLinkUrlTemplate = "https://invite.any.org/%s#%s" + memberUrlTemplate = "https://%s.org" + defaultUrlTemplate = "https://any.org/%s" indexFileName = "index.json.gz" ) From 4a9a5f7b974f63ebda6f2097bb0c5cb81ec4609a Mon Sep 17 00:00:00 2001 From: Anatolii Smolianinov Date: Fri, 24 Jan 2025 13:42:35 +0100 Subject: [PATCH 151/195] GO-4943 fix invite links --- core/publish/service.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/publish/service.go b/core/publish/service.go index de00232b3..f0223d28e 100644 --- a/core/publish/service.go +++ b/core/publish/service.go @@ -39,7 +39,7 @@ const CName = "common.core.publishservice" const ( membershipLimit = 100 << 20 defaultLimit = 10 << 20 - inviteLinkUrlTemplate = "https://invite.any.org/%s#%s" + inviteLinkUrlTemplate = "https://invite.any.coop/%s#%s" memberUrlTemplate = "https://%s.org" defaultUrlTemplate = "https://any.org/%s" indexFileName = "index.json.gz" From 2c1a9b8817795082f7eac1d7dd0d930f170b8d4c Mon Sep 17 00:00:00 2001 From: Anatolii Smolianinov Date: Fri, 24 Jan 2025 15:53:29 +0100 Subject: [PATCH 152/195] GO-4943 use any.coop for free users --- core/publish/service.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/publish/service.go b/core/publish/service.go index f0223d28e..ac2593ae3 100644 --- a/core/publish/service.go +++ b/core/publish/service.go @@ -41,7 +41,7 @@ const ( defaultLimit = 10 << 20 inviteLinkUrlTemplate = "https://invite.any.coop/%s#%s" memberUrlTemplate = "https://%s.org" - defaultUrlTemplate = "https://any.org/%s" + defaultUrlTemplate = "https://any.coop/%s" indexFileName = "index.json.gz" ) From d46d512b22766da5568928dfb2ccca59341b7b7c Mon Sep 17 00:00:00 2001 From: AnastasiaShemyakinskaya Date: Fri, 24 Jan 2025 16:21:55 +0100 Subject: [PATCH 153/195] GO-4889: add state filters Signed-off-by: AnastasiaShemyakinskaya --- core/block/editor/state/state.go | 52 +- core/block/editor/state/state_test.go | 210 ++ core/block/export/export.go | 20 +- core/block/export/export_test.go | 260 ++- core/publish/relationswhitelist.go | 70 + core/publish/service.go | 38 +- core/publish/service_test.go | 2 +- docs/proto.md | 21 +- pb/commands.pb.go | 2734 +++++++++++++------------ pb/protos/commands.proto | 9 +- 10 files changed, 2092 insertions(+), 1324 deletions(-) create mode 100644 core/publish/relationswhitelist.go diff --git a/core/block/editor/state/state.go b/core/block/editor/state/state.go index 3af2522b1..6ad6b8143 100644 --- a/core/block/editor/state/state.go +++ b/core/block/editor/state/state.go @@ -140,22 +140,22 @@ type State struct { originalCreatedTimestamp int64 // pass here from snapshots when importing objects or used for derived objects such as relations, types and etc } +type RelationsByLayout map[model.ObjectTypeLayout][]domain.RelationKey + type Filters struct { - RelationsWhiteList []string - OnlyRootBlock bool + RelationsWhiteList RelationsByLayout + RemoveBlocks bool } func (s *State) Filter(filters *Filters) *State { if filters == nil { return s } - if filters.OnlyRootBlock { - resultBlocks := make(map[string]simple.Block, 1) - resultBlocks[s.rootId] = s.blocks[s.rootId] - s.blocks = resultBlocks + if filters.RemoveBlocks { + s.filterBlocks() } if len(filters.RelationsWhiteList) > 0 { - s.cutRelations(filters) + s.filterRelations(filters) } if s.parent != nil { s.parent = s.parent.Filter(filters) @@ -163,21 +163,43 @@ func (s *State) Filter(filters *Filters) *State { return s } -func (s *State) cutRelations(filters *Filters) { +func (s *State) filterBlocks() { + resultBlocks := make(map[string]simple.Block) + if block, ok := s.blocks[s.rootId]; ok { + resultBlocks[s.rootId] = block + } + s.blocks = resultBlocks +} + +func (s *State) filterRelations(filters *Filters) { resultDetails := domain.NewDetails() - s.relationLinks = pbtypes.RelationLinks{} + layout, _ := s.Layout() + relationKeys := filters.RelationsWhiteList[layout] + var updatedRelationLinks pbtypes.RelationLinks for key, value := range s.details.Iterate() { - if slices.Contains(filters.RelationsWhiteList, key.String()) { + if slices.Contains(relationKeys, key) { resultDetails.Set(key, value) + updatedRelationLinks = append(updatedRelationLinks, s.relationLinks.Get(key.String())) + continue } } - if resultDetails.Len() != len(filters.RelationsWhiteList) { - for key, value := range s.localDetails.Iterate() { - if slices.Contains(filters.RelationsWhiteList, key.String()) { - resultDetails.Set(key, value) - } + s.details = resultDetails + if resultDetails.Len() == 0 { + s.details = nil + } + resultLocalDetails := domain.NewDetails() + for key, value := range s.localDetails.Iterate() { + if slices.Contains(relationKeys, key) { + resultLocalDetails.Set(key, value) + updatedRelationLinks = append(updatedRelationLinks, s.relationLinks.Get(key.String())) + continue } } + s.localDetails = resultLocalDetails + if resultLocalDetails.Len() == 0 { + s.localDetails = nil + } + s.relationLinks = updatedRelationLinks } func (s *State) MigrationVersion() uint32 { diff --git a/core/block/editor/state/state_test.go b/core/block/editor/state/state_test.go index c99f9dd4c..816580ba3 100644 --- a/core/block/editor/state/state_test.go +++ b/core/block/editor/state/state_test.go @@ -2977,3 +2977,213 @@ func TestState_AddRelationLinks(t *testing.T) { assert.Len(t, s.GetRelationLinks(), 1) }) } + +func TestFilter(t *testing.T) { + t.Run("no filters", func(t *testing.T) { + // given + st := buildStateFromAST(blockbuilder.Root( + blockbuilder.ID("root"), + blockbuilder.Children( + blockbuilder.Text( + " text 1 ", + blockbuilder.ID("1"), + ), + blockbuilder.Text( + " text 2 ", + blockbuilder.ID("2"), + ), + ))) + st.AddDetails(domain.NewDetailsFromMap(map[domain.RelationKey]domain.Value{ + bundle.RelationKeyCoverType: domain.Int64(1), + bundle.RelationKeyName: domain.String("name"), + bundle.RelationKeyAssignee: domain.String("assignee"), + bundle.RelationKeyLayout: domain.Int64(model.ObjectType_todo), + })) + st.AddRelationLinks(&model.RelationLink{ + Key: bundle.RelationKeyCoverType.String(), + Format: model.RelationFormat_number, + }, + &model.RelationLink{ + Key: bundle.RelationKeyName.String(), + Format: model.RelationFormat_longtext, + }, + &model.RelationLink{ + Key: bundle.RelationKeyAssignee.String(), + Format: model.RelationFormat_object, + }, + &model.RelationLink{ + Key: bundle.RelationKeyLayout.String(), + Format: model.RelationFormat_number, + }, + ) + + // when + filteredState := st.Filter(nil) + + // then + assert.Equal(t, st, filteredState) + }) + t.Run("remove blocks", func(t *testing.T) { + // given + st := NewDoc("root", map[string]simple.Block{ + "root": base.NewBase(&model.Block{Id: "root", ChildrenIds: []string{"2"}}), + "2": base.NewBase(&model.Block{Id: "2"}), + }).(*State) + st.AddDetails(domain.NewDetailsFromMap(map[domain.RelationKey]domain.Value{ + bundle.RelationKeyCoverType: domain.Int64(1), + bundle.RelationKeyName: domain.String("name"), + bundle.RelationKeyAssignee: domain.String("assignee"), + bundle.RelationKeyLayout: domain.Int64(model.ObjectType_todo), + })) + st.AddRelationLinks(&model.RelationLink{ + Key: bundle.RelationKeyCoverType.String(), + Format: model.RelationFormat_number, + }, + &model.RelationLink{ + Key: bundle.RelationKeyName.String(), + Format: model.RelationFormat_longtext, + }, + &model.RelationLink{ + Key: bundle.RelationKeyAssignee.String(), + Format: model.RelationFormat_object, + }, + &model.RelationLink{ + Key: bundle.RelationKeyLayout.String(), + Format: model.RelationFormat_number, + }, + ) + + // when + filteredState := st.Filter(&Filters{RemoveBlocks: true}) + + // then + assert.Len(t, filteredState.blocks, 1) + assert.NotNil(t, filteredState.blocks["root"]) + }) + t.Run("filter relations by white list", func(t *testing.T) { + // given + st := NewDoc("root", map[string]simple.Block{ + "root": base.NewBase(&model.Block{Id: "root", ChildrenIds: []string{"2"}}), + "2": base.NewBase(&model.Block{Id: "2"}), + }).(*State) + st.AddDetails(domain.NewDetailsFromMap(map[domain.RelationKey]domain.Value{ + bundle.RelationKeyCoverType: domain.Int64(1), + bundle.RelationKeyName: domain.String("name"), + bundle.RelationKeyAssignee: domain.String("assignee"), + bundle.RelationKeyLayout: domain.Int64(model.ObjectType_todo), + })) + st.AddRelationLinks(&model.RelationLink{ + Key: bundle.RelationKeyCoverType.String(), + Format: model.RelationFormat_number, + }, + &model.RelationLink{ + Key: bundle.RelationKeyName.String(), + Format: model.RelationFormat_longtext, + }, + &model.RelationLink{ + Key: bundle.RelationKeyAssignee.String(), + Format: model.RelationFormat_object, + }, + &model.RelationLink{ + Key: bundle.RelationKeyLayout.String(), + Format: model.RelationFormat_number, + }, + ) + + // when + filteredState := st.Filter(&Filters{RelationsWhiteList: map[model.ObjectTypeLayout][]domain.RelationKey{ + model.ObjectType_todo: {bundle.RelationKeyAssignee}, + }}) + + // then + assert.Equal(t, filteredState.details.Len(), 1) + assert.Equal(t, filteredState.localDetails.Len(), 0) + assert.Len(t, filteredState.relationLinks, 1) + assert.Equal(t, bundle.RelationKeyAssignee.String(), filteredState.relationLinks[0].Key) + }) + t.Run("parent state", func(t *testing.T) { + // given + st := NewDoc("root", map[string]simple.Block{ + "root": base.NewBase(&model.Block{Id: "root", ChildrenIds: []string{"2"}}), + "2": base.NewBase(&model.Block{Id: "2"}), + }).(*State) + st.AddDetails(domain.NewDetailsFromMap(map[domain.RelationKey]domain.Value{ + bundle.RelationKeyCoverType: domain.Int64(1), + bundle.RelationKeyName: domain.String("name"), + bundle.RelationKeyAssignee: domain.String("assignee"), + bundle.RelationKeyLayout: domain.Int64(model.ObjectType_todo), + })) + st.AddRelationLinks(&model.RelationLink{ + Key: bundle.RelationKeyCoverType.String(), + Format: model.RelationFormat_number, + }, + &model.RelationLink{ + Key: bundle.RelationKeyName.String(), + Format: model.RelationFormat_longtext, + }, + &model.RelationLink{ + Key: bundle.RelationKeyAssignee.String(), + Format: model.RelationFormat_object, + }, + &model.RelationLink{ + Key: bundle.RelationKeyLayout.String(), + Format: model.RelationFormat_number, + }, + ) + + // when + filteredState := st.NewState().Filter(&Filters{ + RemoveBlocks: true, + RelationsWhiteList: map[model.ObjectTypeLayout][]domain.RelationKey{ + model.ObjectType_todo: {bundle.RelationKeyAssignee}, + }}) + + // then + assert.Equal(t, filteredState.parent.details.Len(), 1) + assert.Equal(t, filteredState.parent.localDetails.Len(), 0) + assert.Len(t, filteredState.parent.relationLinks, 1) + assert.Equal(t, bundle.RelationKeyAssignee.String(), filteredState.parent.relationLinks[0].Key) + assert.Len(t, filteredState.parent.blocks, 1) + assert.NotNil(t, filteredState.parent.blocks["root"]) + }) + t.Run("empty white list relations", func(t *testing.T) { + // given + st := NewDoc("root", map[string]simple.Block{ + "root": base.NewBase(&model.Block{Id: "root", ChildrenIds: []string{"2"}}), + "2": base.NewBase(&model.Block{Id: "2"}), + }).(*State) + st.AddDetails(domain.NewDetailsFromMap(map[domain.RelationKey]domain.Value{ + bundle.RelationKeyCoverType: domain.Int64(1), + bundle.RelationKeyName: domain.String("name"), + bundle.RelationKeyAssignee: domain.String("assignee"), + bundle.RelationKeyLayout: domain.Int64(model.ObjectType_todo), + })) + st.AddRelationLinks(&model.RelationLink{ + Key: bundle.RelationKeyCoverType.String(), + Format: model.RelationFormat_number, + }, + &model.RelationLink{ + Key: bundle.RelationKeyName.String(), + Format: model.RelationFormat_longtext, + }, + &model.RelationLink{ + Key: bundle.RelationKeyAssignee.String(), + Format: model.RelationFormat_object, + }, + &model.RelationLink{ + Key: bundle.RelationKeyLayout.String(), + Format: model.RelationFormat_number, + }, + ) + + // when + filteredState := st.Filter(&Filters{RelationsWhiteList: map[model.ObjectTypeLayout][]domain.RelationKey{ + model.ObjectType_todo: {}, + }}) + + // then + assert.Equal(t, filteredState.details.Len(), 0) + assert.Equal(t, filteredState.localDetails.Len(), 0) + assert.Len(t, filteredState.relationLinks, 0) + }) +} diff --git a/core/block/export/export.go b/core/block/export/export.go index 60eff3576..0b6d70d92 100644 --- a/core/block/export/export.go +++ b/core/block/export/export.go @@ -571,8 +571,10 @@ func (e *exportContext) collectDerivedObjects(objects map[string]*Doc) ([]string } relations = lo.Union(relations, dataviewRelations) } - objectTypeId := details.GetString(bundle.RelationKeyType) - objectsTypes = lo.Union(objectsTypes, []string{objectTypeId}) + if details.Has(bundle.RelationKeyType) { + objectTypeId := details.GetString(bundle.RelationKeyType) + objectsTypes = lo.Union(objectsTypes, []string{objectTypeId}) + } setOfList := details.GetStringList(bundle.RelationKeySetOf) setOf = lo.Union(setOf, setOfList) return nil @@ -876,7 +878,7 @@ func (e *exportContext) addNestedObject(id string, nestedDocs map[string]*Doc) { continue } if isLinkedObjectExist(rec) { - exportDoc := &Doc{Details: rec[0].Details, isLink: e.isLinkProcess} + exportDoc := &Doc{Details: rec[0].Details, isLink: true} nestedDocs[link] = exportDoc e.docs[link] = exportDoc e.addNestedObject(link, nestedDocs) @@ -1259,8 +1261,16 @@ func pbFiltersToState(filters *pb.RpcObjectListExportStateFilters) *state.Filter if filters == nil { return nil } + relationByLayoutList := state.RelationsByLayout{} + for _, relationByLayout := range filters.RelationsWhiteList { + allowedRelations := make([]domain.RelationKey, 0, len(relationByLayout.AllowedRelations)) + for _, relation := range relationByLayout.AllowedRelations { + allowedRelations = append(allowedRelations, domain.RelationKey(relation)) + } + relationByLayoutList[relationByLayout.Layout] = allowedRelations + } return &state.Filters{ - RelationsWhiteList: filters.RelationsWhiteList, - OnlyRootBlock: filters.OnlyRootBlock, + RelationsWhiteList: relationByLayoutList, + RemoveBlocks: filters.RemoveBlocks, } } diff --git a/core/block/export/export_test.go b/core/block/export/export_test.go index cd33df3eb..001ce203b 100644 --- a/core/block/export/export_test.go +++ b/core/block/export/export_test.go @@ -4,10 +4,12 @@ import ( "archive/zip" "context" "fmt" + "os" "path/filepath" "testing" "github.com/anyproto/any-sync/app" + "github.com/gogo/protobuf/jsonpb" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/mock" @@ -361,6 +363,186 @@ func TestExport_Export(t *testing.T) { assert.NotNil(t, err) assert.Equal(t, 0, success) }) + t.Run("export with filters success", func(t *testing.T) { + // given + storeFixture := objectstore.NewStoreFixture(t) + objectTypeId := "objectTypeId" + objectTypeUniqueKey, err := domain.NewUniqueKey(smartblock.SmartBlockTypeObjectType, objectTypeId) + assert.Nil(t, err) + objectId := "objectID" + link := "linkId" + + storeFixture.AddObjects(t, spaceId, []spaceindex.TestObject{ + { + bundle.RelationKeyId: domain.String(link), + bundle.RelationKeyType: domain.String(objectTypeId), + bundle.RelationKeySpaceId: domain.String(spaceId), + bundle.RelationKeyDescription: domain.String("description"), + bundle.RelationKeyLayout: domain.Int64(model.ObjectType_set), + bundle.RelationKeyCamera: domain.String("test"), + }, + { + bundle.RelationKeyId: domain.String(objectId), + bundle.RelationKeyType: domain.String(objectTypeId), + bundle.RelationKeySpaceId: domain.String(spaceId), + }, + { + bundle.RelationKeyId: domain.String(objectTypeId), + bundle.RelationKeyUniqueKey: domain.String(objectTypeUniqueKey.Marshal()), + bundle.RelationKeyLayout: domain.Int64(int64(model.ObjectType_objectType)), + bundle.RelationKeyRecommendedRelations: domain.StringList([]string{addr.MissingObject}), + bundle.RelationKeySpaceId: domain.String(spaceId), + bundle.RelationKeyType: domain.String(objectTypeId), + }, + }) + + objectGetter := mock_cache.NewMockObjectGetterComponent(t) + + smartBlockTest := smarttest.New(objectId) + doc := smartBlockTest.NewState().SetDetails(domain.NewDetailsFromMap(map[domain.RelationKey]domain.Value{ + bundle.RelationKeyId: domain.String(objectId), + bundle.RelationKeyType: domain.String(objectTypeId), + })) + doc.AddRelationLinks(&model.RelationLink{ + Key: bundle.RelationKeyId.String(), + Format: model.RelationFormat_longtext, + }, &model.RelationLink{ + Key: bundle.RelationKeyType.String(), + Format: model.RelationFormat_longtext, + }) + smartBlockTest.Doc = doc + smartBlockTest.AddBlock(simple.New(&model.Block{Id: objectId, ChildrenIds: []string{"linkBlock"}, Content: &model.BlockContentOfSmartblock{Smartblock: &model.BlockContentSmartblock{}}})) + smartBlockTest.AddBlock(simple.New(&model.Block{Id: "linkBlock", Content: &model.BlockContentOfLink{Link: &model.BlockContentLink{TargetBlockId: link}}})) + + objectType := smarttest.New(objectTypeId) + objectTypeDoc := objectType.NewState().SetDetails(domain.NewDetailsFromMap(map[domain.RelationKey]domain.Value{ + bundle.RelationKeyId: domain.String(objectTypeId), + bundle.RelationKeyType: domain.String(objectTypeId), + })) + objectTypeDoc.AddRelationLinks(&model.RelationLink{ + Key: bundle.RelationKeyId.String(), + Format: model.RelationFormat_longtext, + }, &model.RelationLink{ + Key: bundle.RelationKeyType.String(), + Format: model.RelationFormat_longtext, + }) + objectType.Doc = objectTypeDoc + objectType.SetType(smartblock.SmartBlockTypeObjectType) + + linkObject := smarttest.New(link) + linkObjectDoc := linkObject.NewState().SetDetails(domain.NewDetailsFromMap(map[domain.RelationKey]domain.Value{ + bundle.RelationKeyId: domain.String(link), + bundle.RelationKeyType: domain.String(objectTypeId), + bundle.RelationKeySpaceId: domain.String(spaceId), + bundle.RelationKeyDescription: domain.String("description"), + bundle.RelationKeyLayout: domain.Int64(model.ObjectType_set), + bundle.RelationKeyCamera: domain.String("test"), + })) + linkObjectDoc.AddRelationLinks(&model.RelationLink{ + Key: bundle.RelationKeyId.String(), + Format: model.RelationFormat_longtext, + }, &model.RelationLink{ + Key: bundle.RelationKeyType.String(), + Format: model.RelationFormat_longtext, + }, &model.RelationLink{ + Key: bundle.RelationKeySpaceId.String(), + Format: model.RelationFormat_longtext, + }, &model.RelationLink{ + Key: bundle.RelationKeyDescription.String(), + Format: model.RelationFormat_longtext, + }, &model.RelationLink{ + Key: bundle.RelationKeyLayout.String(), + Format: model.RelationFormat_number, + }, &model.RelationLink{ + Key: bundle.RelationKeyCamera.String(), + Format: model.RelationFormat_longtext, + }) + linkObject.Doc = linkObjectDoc + linkObject.AddBlock(simple.New(&model.Block{Id: objectId, ChildrenIds: []string{"linkBlock"}, Content: &model.BlockContentOfSmartblock{Smartblock: &model.BlockContentSmartblock{}}})) + linkObject.AddBlock(simple.New(&model.Block{Id: "linkBlock", Content: &model.BlockContentOfLink{Link: &model.BlockContentLink{TargetBlockId: "link1"}}})) + + objectGetter.EXPECT().GetObject(context.Background(), objectId).Return(smartBlockTest, nil).Times(4) + objectGetter.EXPECT().GetObject(context.Background(), objectTypeId).Return(objectType, nil) + objectGetter.EXPECT().GetObject(context.Background(), link).Return(linkObject, nil) + + a := &app.App{} + mockSender := mock_event.NewMockSender(t) + mockSender.EXPECT().Broadcast(mock.Anything).Return() + a.Register(testutil.PrepareMock(context.Background(), a, mockSender)) + service := process.New() + err = service.Init(a) + assert.Nil(t, err) + + notifications := mock_notifications.NewMockNotifications(t) + notificationSend := make(chan struct{}) + notifications.EXPECT().CreateAndSend(mock.Anything).RunAndReturn(func(notification *model.Notification) error { + close(notificationSend) + return nil + }) + + provider := mock_typeprovider.NewMockSmartBlockTypeProvider(t) + provider.EXPECT().Type(spaceId, link).Return(smartblock.SmartBlockTypePage, nil) + + e := &export{ + objectStore: storeFixture, + picker: objectGetter, + processService: service, + notificationService: notifications, + sbtProvider: provider, + } + + // when + path, success, err := e.Export(context.Background(), pb.RpcObjectListExportRequest{ + SpaceId: spaceId, + Path: t.TempDir(), + ObjectIds: []string{objectId}, + Format: model.Export_Protobuf, + Zip: true, + IncludeNested: true, + IncludeFiles: true, + IsJson: true, + LinksStateFilters: &pb.RpcObjectListExportStateFilters{ + RelationsWhiteList: []*pb.RpcObjectListExportRelationsWhiteList{ + { + Layout: model.ObjectType_set, + AllowedRelations: []string{bundle.RelationKeyCamera.String()}, + }, + }, + RemoveBlocks: true, + }, + }) + + // then + <-notificationSend + assert.Nil(t, err) + assert.Equal(t, 3, success) + + reader, err := zip.OpenReader(path) + assert.Nil(t, err) + + assert.Len(t, reader.File, 3) + fileNames := make(map[string]bool, 3) + for _, file := range reader.File { + fileNames[file.Name] = true + } + + objectPath := filepath.Join(objectsDirectory, link+".pb.json") + assert.True(t, fileNames[objectPath]) + + file, err := os.Open(objectPath) + if err != nil { + return + } + var sn *pb.SnapshotWithType + err = jsonpb.Unmarshal(file, sn) + assert.Nil(t, err) + assert.Len(t, sn.GetSnapshot().GetData().GetBlocks(), 1) + assert.Equal(t, link, sn.GetSnapshot().GetData().GetBlocks()[0].GetId()) + assert.Len(t, sn.GetSnapshot().GetData().GetDetails().GetFields(), 1) + assert.NotNil(t, sn.GetSnapshot().GetData().GetDetails().GetFields()[bundle.RelationKeyCamera.String()]) + assert.Len(t, sn.GetSnapshot().GetData().GetRelationLinks(), 1) + assert.Equal(t, bundle.RelationKeyCamera.String(), sn.GetSnapshot().GetData().GetRelationLinks()[0].Key) + }) } func Test_docsForExport(t *testing.T) { @@ -379,14 +561,49 @@ func Test_docsForExport(t *testing.T) { bundle.RelationKeySpaceId: domain.String(spaceId), }, }) - err := storeFixture.SpaceIndex(spaceId).UpdateObjectLinks(context.Background(), "id", []string{"id1"}) - assert.Nil(t, err) provider := mock_typeprovider.NewMockSmartBlockTypeProvider(t) provider.EXPECT().Type(spaceId, "id1").Return(smartblock.SmartBlockTypePage, nil) + + objectGetter := mock_cache.NewMockObjectGetterComponent(t) + smartBlockTest := smarttest.New("id") + doc := smartBlockTest.NewState().SetDetails(domain.NewDetailsFromMap(map[domain.RelationKey]domain.Value{ + bundle.RelationKeyId: domain.String("id"), + bundle.RelationKeyType: domain.String("objectTypeId"), + })) + doc.AddRelationLinks(&model.RelationLink{ + Key: bundle.RelationKeyId.String(), + Format: model.RelationFormat_longtext, + }, &model.RelationLink{ + Key: bundle.RelationKeyType.String(), + Format: model.RelationFormat_longtext, + }) + smartBlockTest.Doc = doc + + smartBlockTest.AddBlock(simple.New(&model.Block{Id: "id", ChildrenIds: []string{"linkBlock"}, Content: &model.BlockContentOfSmartblock{Smartblock: &model.BlockContentSmartblock{}}})) + smartBlockTest.AddBlock(simple.New(&model.Block{Id: "linkBlock", Content: &model.BlockContentOfLink{Link: &model.BlockContentLink{TargetBlockId: "id1"}}})) + + linkObject := smarttest.New("id1") + linkObjectDoc := linkObject.NewState().SetDetails(domain.NewDetailsFromMap(map[domain.RelationKey]domain.Value{ + bundle.RelationKeyId: domain.String("id1"), + bundle.RelationKeyType: domain.String("objectTypeId"), + })) + linkObjectDoc.AddRelationLinks(&model.RelationLink{ + Key: bundle.RelationKeyId.String(), + Format: model.RelationFormat_longtext, + }, &model.RelationLink{ + Key: bundle.RelationKeyType.String(), + Format: model.RelationFormat_longtext, + }) + linkObject.Doc = linkObjectDoc + + objectGetter.EXPECT().GetObject(context.Background(), "id").Return(smartBlockTest, nil) + objectGetter.EXPECT().GetObject(context.Background(), "id1").Return(linkObject, nil) + e := &export{ objectStore: storeFixture, sbtProvider: provider, + picker: objectGetter, } expCtx := newExportContext(e, pb.RpcObjectListExportRequest{ @@ -396,7 +613,7 @@ func Test_docsForExport(t *testing.T) { }) // when - err = expCtx.docsForExport() + err := expCtx.docsForExport() // then assert.Nil(t, err) @@ -417,14 +634,32 @@ func Test_docsForExport(t *testing.T) { bundle.RelationKeySpaceId: domain.String(spaceId), }, }) - err := storeFixture.SpaceIndex(spaceId).UpdateObjectLinks(context.Background(), "id", []string{"id1"}) - assert.Nil(t, err) + objectGetter := mock_cache.NewMockObjectGetterComponent(t) + smartBlockTest := smarttest.New("id") + doc := smartBlockTest.NewState().SetDetails(domain.NewDetailsFromMap(map[domain.RelationKey]domain.Value{ + bundle.RelationKeyId: domain.String("id"), + bundle.RelationKeyType: domain.String("objectTypeId"), + })) + doc.AddRelationLinks(&model.RelationLink{ + Key: bundle.RelationKeyId.String(), + Format: model.RelationFormat_longtext, + }, &model.RelationLink{ + Key: bundle.RelationKeyType.String(), + Format: model.RelationFormat_longtext, + }) + smartBlockTest.Doc = doc + + smartBlockTest.AddBlock(simple.New(&model.Block{Id: "id", ChildrenIds: []string{"linkBlock"}, Content: &model.BlockContentOfSmartblock{Smartblock: &model.BlockContentSmartblock{}}})) + smartBlockTest.AddBlock(simple.New(&model.Block{Id: "linkBlock", Content: &model.BlockContentOfLink{Link: &model.BlockContentLink{TargetBlockId: "id1"}}})) + + objectGetter.EXPECT().GetObject(context.Background(), "id").Return(smartBlockTest, nil) provider := mock_typeprovider.NewMockSmartBlockTypeProvider(t) provider.EXPECT().Type(spaceId, "id1").Return(smartblock.SmartBlockTypePage, nil) e := &export{ objectStore: storeFixture, sbtProvider: provider, + picker: objectGetter, } expCtx := newExportContext(e, pb.RpcObjectListExportRequest{ SpaceId: spaceId, @@ -433,7 +668,7 @@ func Test_docsForExport(t *testing.T) { }) // when - err = expCtx.docsForExport() + err := expCtx.docsForExport() // then assert.Nil(t, err) @@ -770,10 +1005,10 @@ func Test_docsForExport(t *testing.T) { linkedObjectId := "linkedObjectId" storeFixture.AddObjects(t, spaceId, []objectstore.TestObject{ { - bundle.RelationKeyId: domain.String("id"), - domain.RelationKey(relationKey): domain.String("test"), - bundle.RelationKeyType: domain.String(objectTypeKey), - bundle.RelationKeySpaceId: domain.String(spaceId), + bundle.RelationKeyId: domain.String("id"), + relationKey: domain.String("test"), + bundle.RelationKeyType: domain.String(objectTypeKey), + bundle.RelationKeySpaceId: domain.String(spaceId), }, { bundle.RelationKeyId: domain.String(relationKey), @@ -810,9 +1045,6 @@ func Test_docsForExport(t *testing.T) { }, }) - err = storeFixture.SpaceIndex(spaceId).UpdateObjectLinks(context.Background(), templateId, []string{linkedObjectId}) - assert.Nil(t, err) - objectGetter := mock_cache.NewMockObjectGetter(t) template := smarttest.New(templateId) @@ -828,6 +1060,8 @@ func Test_docsForExport(t *testing.T) { Format: model.RelationFormat_longtext, }) template.Doc = templateDoc + template.AddBlock(simple.New(&model.Block{Id: templateId, ChildrenIds: []string{"linkBlock"}, Content: &model.BlockContentOfSmartblock{Smartblock: &model.BlockContentSmartblock{}}})) + template.AddBlock(simple.New(&model.Block{Id: "linkBlock", Content: &model.BlockContentOfLink{Link: &model.BlockContentLink{TargetBlockId: linkedObjectId}}})) smartBlockTest := smarttest.New("id") doc := smartBlockTest.NewState().SetDetails(domain.NewDetailsFromMap(map[domain.RelationKey]domain.Value{ diff --git a/core/publish/relationswhitelist.go b/core/publish/relationswhitelist.go new file mode 100644 index 000000000..3ae96012f --- /dev/null +++ b/core/publish/relationswhitelist.go @@ -0,0 +1,70 @@ +package publish + +import ( + "github.com/anyproto/anytype-heart/pb" + "github.com/anyproto/anytype-heart/pkg/lib/bundle" + "github.com/anyproto/anytype-heart/pkg/lib/pb/model" +) + +var allObjectsRelationsWhiteList = []string{ + bundle.RelationKeyType.String(), + bundle.RelationKeySpaceId.String(), + bundle.RelationKeyId.String(), + bundle.RelationKeyLayout.String(), + bundle.RelationKeyIsArchived.String(), + bundle.RelationKeyIsDeleted.String(), + bundle.RelationKeyName.String(), +} + +var documentRelationsWhiteList = append(allObjectsRelationsWhiteList, + bundle.RelationKeyDescription.String(), + bundle.RelationKeySnippet.String(), + bundle.RelationKeyIconImage.String(), + bundle.RelationKeyIconEmoji.String(), + bundle.RelationKeyCoverType.String(), + bundle.RelationKeyCoverId.String(), +) + +var todoRelationsWhiteList = append(documentRelationsWhiteList, bundle.RelationKeyDone.String()) + +var bookmarkRelationsWhiteList = append(documentRelationsWhiteList, bundle.RelationKeyPicture.String()) + +var derivedObjectsWhiteList = append(allObjectsRelationsWhiteList, bundle.RelationKeyUniqueKey.String()) + +var relationsWhiteList = append(derivedObjectsWhiteList, bundle.RelationKeyRelationFormat.String()) + +var relationOptionWhiteList = append(derivedObjectsWhiteList, bundle.RelationKeyRelationOptionColor.String()) + +var publishingRelationsWhiteList = map[model.ObjectTypeLayout][]string{ + model.ObjectType_basic: documentRelationsWhiteList, + model.ObjectType_profile: documentRelationsWhiteList, + model.ObjectType_todo: todoRelationsWhiteList, + model.ObjectType_set: documentRelationsWhiteList, + model.ObjectType_collection: documentRelationsWhiteList, + model.ObjectType_objectType: derivedObjectsWhiteList, + model.ObjectType_relation: relationsWhiteList, + model.ObjectType_file: documentRelationsWhiteList, + model.ObjectType_dashboard: allObjectsRelationsWhiteList, + model.ObjectType_image: documentRelationsWhiteList, + model.ObjectType_note: documentRelationsWhiteList, + model.ObjectType_space: allObjectsRelationsWhiteList, + + model.ObjectType_bookmark: bookmarkRelationsWhiteList, + model.ObjectType_relationOption: relationOptionWhiteList, + model.ObjectType_relationOptionsList: relationOptionWhiteList, + model.ObjectType_participant: documentRelationsWhiteList, + model.ObjectType_chat: allObjectsRelationsWhiteList, + model.ObjectType_chatDerived: allObjectsRelationsWhiteList, + model.ObjectType_tag: documentRelationsWhiteList, +} + +func relationsWhiteListToPbModel() []*pb.RpcObjectListExportRelationsWhiteList { + pbRelationsWhiteList := make([]*pb.RpcObjectListExportRelationsWhiteList, 0, len(publishingRelationsWhiteList)) + for layout, relation := range publishingRelationsWhiteList { + pbRelationsWhiteList = append(pbRelationsWhiteList, &pb.RpcObjectListExportRelationsWhiteList{ + Layout: layout, + AllowedRelations: relation, + }) + } + return pbRelationsWhiteList +} diff --git a/core/publish/service.go b/core/publish/service.go index 2947f3613..185359105 100644 --- a/core/publish/service.go +++ b/core/publish/service.go @@ -45,23 +45,6 @@ const ( indexFileName = "index.json.gz" ) -var publishingRelationsWhiteList = []string{ - bundle.RelationKeyName.String(), - bundle.RelationKeyDescription.String(), - bundle.RelationKeySnippet.String(), - bundle.RelationKeyType.String(), - bundle.RelationKeySpaceId.String(), - bundle.RelationKeyId.String(), - bundle.RelationKeyIconImage.String(), - bundle.RelationKeyIconEmoji.String(), - bundle.RelationKeyCoverType.String(), - bundle.RelationKeyCoverId.String(), - bundle.RelationKeyIsArchived.String(), - bundle.RelationKeyIsDeleted.String(), - bundle.RelationKeyDone.String(), - bundle.RelationKeyPicture.String(), -} - var log = logger.NewNamed(CName) var ErrLimitExceeded = errors.New("limit exceeded") @@ -139,17 +122,18 @@ func uniqName() string { func (s *service) exportToDir(ctx context.Context, spaceId, pageId string) (dirEntries []fs.DirEntry, exportPath string, err error) { tempDir := os.TempDir() exportPath, _, err = s.exportService.Export(ctx, pb.RpcObjectListExportRequest{ - SpaceId: spaceId, - Format: model.Export_Protobuf, - IncludeFiles: true, - IsJson: false, - Zip: false, - Path: tempDir, - ObjectIds: []string{pageId}, - NoProgress: true, + SpaceId: spaceId, + Format: model.Export_Protobuf, + IncludeFiles: true, + IsJson: false, + Zip: false, + Path: tempDir, + ObjectIds: []string{pageId}, + NoProgress: true, + IncludeNested: true, LinksStateFilters: &pb.RpcObjectListExportStateFilters{ - RelationsWhiteList: publishingRelationsWhiteList, - OnlyRootBlock: true, + RelationsWhiteList: relationsWhiteListToPbModel(), + RemoveBlocks: true, }, }) if err != nil { diff --git a/core/publish/service_test.go b/core/publish/service_test.go index 12d4e9c9a..6aa175172 100644 --- a/core/publish/service_test.go +++ b/core/publish/service_test.go @@ -697,7 +697,7 @@ func prepareExporterWithFile(t *testing.T, objectTypeId string, spaceService *mo space.EXPECT().DerivedIDs().Return(threads.DerivedSmartblockIds{}) file.SetSpace(space) - objectGetter.EXPECT().GetObject(context.Background(), objectId).Return(smartBlockTest, nil).Times(3) + objectGetter.EXPECT().GetObject(context.Background(), objectId).Return(smartBlockTest, nil).Times(4) objectGetter.EXPECT().GetObject(context.Background(), objectTypeId).Return(objectType, nil).Times(2) objectGetter.EXPECT().GetObject(context.Background(), fileId).Return(file, nil) diff --git a/docs/proto.md b/docs/proto.md index e030166b8..2f99684d5 100644 --- a/docs/proto.md +++ b/docs/proto.md @@ -915,6 +915,7 @@ - [Rpc.Object.ListDuplicate.Response](#anytype-Rpc-Object-ListDuplicate-Response) - [Rpc.Object.ListDuplicate.Response.Error](#anytype-Rpc-Object-ListDuplicate-Response-Error) - [Rpc.Object.ListExport](#anytype-Rpc-Object-ListExport) + - [Rpc.Object.ListExport.RelationsWhiteList](#anytype-Rpc-Object-ListExport-RelationsWhiteList) - [Rpc.Object.ListExport.Request](#anytype-Rpc-Object-ListExport-Request) - [Rpc.Object.ListExport.Response](#anytype-Rpc-Object-ListExport-Response) - [Rpc.Object.ListExport.Response.Error](#anytype-Rpc-Object-ListExport-Response-Error) @@ -15536,6 +15537,22 @@ Deletes the object, keys from the local store and unsubscribe from remote change + + +### Rpc.Object.ListExport.RelationsWhiteList + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| layout | [model.ObjectType.Layout](#anytype-model-ObjectType-Layout) | | | +| allowedRelations | [string](#string) | repeated | | + + + + + + ### Rpc.Object.ListExport.Request @@ -15603,8 +15620,8 @@ Deletes the object, keys from the local store and unsubscribe from remote change | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | -| relationsWhiteList | [string](#string) | repeated | | -| onlyRootBlock | [bool](#bool) | | | +| relationsWhiteList | [Rpc.Object.ListExport.RelationsWhiteList](#anytype-Rpc-Object-ListExport-RelationsWhiteList) | repeated | | +| removeBlocks | [bool](#bool) | | | diff --git a/pb/commands.pb.go b/pb/commands.pb.go index 866388565..fd9ebbdaf 100644 --- a/pb/commands.pb.go +++ b/pb/commands.pb.go @@ -3468,7 +3468,7 @@ func (x RpcObjectListExportResponseErrorCode) String() string { } func (RpcObjectListExportResponseErrorCode) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 6, 47, 2, 0, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 6, 47, 3, 0, 0} } type RpcObjectImportRequestMode int32 @@ -29922,8 +29922,8 @@ func (m *RpcObjectListExportRequest) GetLinksStateFilters() *RpcObjectListExport } type RpcObjectListExportStateFilters struct { - RelationsWhiteList []string `protobuf:"bytes,1,rep,name=relationsWhiteList,proto3" json:"relationsWhiteList,omitempty"` - OnlyRootBlock bool `protobuf:"varint,2,opt,name=onlyRootBlock,proto3" json:"onlyRootBlock,omitempty"` + RelationsWhiteList []*RpcObjectListExportRelationsWhiteList `protobuf:"bytes,1,rep,name=relationsWhiteList,proto3" json:"relationsWhiteList,omitempty"` + RemoveBlocks bool `protobuf:"varint,2,opt,name=removeBlocks,proto3" json:"removeBlocks,omitempty"` } func (m *RpcObjectListExportStateFilters) Reset() { *m = RpcObjectListExportStateFilters{} } @@ -29959,20 +29959,72 @@ func (m *RpcObjectListExportStateFilters) XXX_DiscardUnknown() { var xxx_messageInfo_RpcObjectListExportStateFilters proto.InternalMessageInfo -func (m *RpcObjectListExportStateFilters) GetRelationsWhiteList() []string { +func (m *RpcObjectListExportStateFilters) GetRelationsWhiteList() []*RpcObjectListExportRelationsWhiteList { if m != nil { return m.RelationsWhiteList } return nil } -func (m *RpcObjectListExportStateFilters) GetOnlyRootBlock() bool { +func (m *RpcObjectListExportStateFilters) GetRemoveBlocks() bool { if m != nil { - return m.OnlyRootBlock + return m.RemoveBlocks } return false } +type RpcObjectListExportRelationsWhiteList struct { + Layout model.ObjectTypeLayout `protobuf:"varint,1,opt,name=layout,proto3,enum=anytype.model.ObjectTypeLayout" json:"layout,omitempty"` + AllowedRelations []string `protobuf:"bytes,2,rep,name=allowedRelations,proto3" json:"allowedRelations,omitempty"` +} + +func (m *RpcObjectListExportRelationsWhiteList) Reset() { *m = RpcObjectListExportRelationsWhiteList{} } +func (m *RpcObjectListExportRelationsWhiteList) String() string { return proto.CompactTextString(m) } +func (*RpcObjectListExportRelationsWhiteList) ProtoMessage() {} +func (*RpcObjectListExportRelationsWhiteList) Descriptor() ([]byte, []int) { + return fileDescriptor_8261c968b2e6f45c, []int{0, 6, 47, 2} +} +func (m *RpcObjectListExportRelationsWhiteList) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *RpcObjectListExportRelationsWhiteList) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_RpcObjectListExportRelationsWhiteList.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 *RpcObjectListExportRelationsWhiteList) XXX_Merge(src proto.Message) { + xxx_messageInfo_RpcObjectListExportRelationsWhiteList.Merge(m, src) +} +func (m *RpcObjectListExportRelationsWhiteList) XXX_Size() int { + return m.Size() +} +func (m *RpcObjectListExportRelationsWhiteList) XXX_DiscardUnknown() { + xxx_messageInfo_RpcObjectListExportRelationsWhiteList.DiscardUnknown(m) +} + +var xxx_messageInfo_RpcObjectListExportRelationsWhiteList proto.InternalMessageInfo + +func (m *RpcObjectListExportRelationsWhiteList) GetLayout() model.ObjectTypeLayout { + if m != nil { + return m.Layout + } + return model.ObjectType_basic +} + +func (m *RpcObjectListExportRelationsWhiteList) GetAllowedRelations() []string { + if m != nil { + return m.AllowedRelations + } + return nil +} + type RpcObjectListExportResponse struct { Error *RpcObjectListExportResponseError `protobuf:"bytes,1,opt,name=error,proto3" json:"error,omitempty"` Path string `protobuf:"bytes,2,opt,name=path,proto3" json:"path,omitempty"` @@ -29984,7 +30036,7 @@ func (m *RpcObjectListExportResponse) Reset() { *m = RpcObjectListExport func (m *RpcObjectListExportResponse) String() string { return proto.CompactTextString(m) } func (*RpcObjectListExportResponse) ProtoMessage() {} func (*RpcObjectListExportResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 6, 47, 2} + return fileDescriptor_8261c968b2e6f45c, []int{0, 6, 47, 3} } func (m *RpcObjectListExportResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -30050,7 +30102,7 @@ func (m *RpcObjectListExportResponseError) Reset() { *m = RpcObjectListE func (m *RpcObjectListExportResponseError) String() string { return proto.CompactTextString(m) } func (*RpcObjectListExportResponseError) ProtoMessage() {} func (*RpcObjectListExportResponseError) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 6, 47, 2, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 6, 47, 3, 0} } func (m *RpcObjectListExportResponseError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -71572,6 +71624,7 @@ func init() { proto.RegisterType((*RpcObjectListExport)(nil), "anytype.Rpc.Object.ListExport") proto.RegisterType((*RpcObjectListExportRequest)(nil), "anytype.Rpc.Object.ListExport.Request") proto.RegisterType((*RpcObjectListExportStateFilters)(nil), "anytype.Rpc.Object.ListExport.StateFilters") + proto.RegisterType((*RpcObjectListExportRelationsWhiteList)(nil), "anytype.Rpc.Object.ListExport.RelationsWhiteList") proto.RegisterType((*RpcObjectListExportResponse)(nil), "anytype.Rpc.Object.ListExport.Response") proto.RegisterType((*RpcObjectListExportResponseError)(nil), "anytype.Rpc.Object.ListExport.Response.Error") proto.RegisterType((*RpcObjectImport)(nil), "anytype.Rpc.Object.Import") @@ -72392,1243 +72445,1245 @@ func init() { func init() { proto.RegisterFile("pb/protos/commands.proto", fileDescriptor_8261c968b2e6f45c) } var fileDescriptor_8261c968b2e6f45c = []byte{ - // 19766 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0xfd, 0x7d, 0x9c, 0x24, 0x49, - 0x55, 0x2f, 0x8c, 0x4f, 0x65, 0x56, 0x55, 0x77, 0x9f, 0x7e, 0x99, 0x9a, 0xdc, 0x99, 0xd9, 0xd9, - 0xd8, 0x65, 0x76, 0x9c, 0x5d, 0x96, 0x75, 0x59, 0x7a, 0x97, 0x05, 0x91, 0x5d, 0xf6, 0xad, 0xba, - 0xba, 0xba, 0xbb, 0x76, 0xbb, 0xab, 0xda, 0xac, 0xea, 0x19, 0x56, 0xaf, 0xbf, 0xba, 0x39, 0x55, - 0xd1, 0xdd, 0xb9, 0x53, 0x9d, 0x59, 0x66, 0x66, 0xf7, 0x6c, 0xf3, 0xfb, 0xdc, 0xe7, 0x8a, 0xb8, - 0x82, 0x22, 0x17, 0x11, 0x51, 0x51, 0x01, 0x79, 0x59, 0xbd, 0xa2, 0x88, 0xbc, 0x5f, 0x50, 0x11, - 0x05, 0x04, 0x51, 0x11, 0x41, 0x04, 0xd1, 0x7d, 0x04, 0x41, 0xc4, 0xfb, 0x91, 0xcb, 0xa3, 0xcf, - 0x15, 0x44, 0xe1, 0xf1, 0xf9, 0x64, 0x44, 0xe4, 0x4b, 0x54, 0x57, 0x66, 0x45, 0x56, 0x57, 0x56, - 0x2f, 0xf2, 0xfc, 0x97, 0x19, 0x19, 0x79, 0xe2, 0xc4, 0xf9, 0x9e, 0x88, 0x38, 0x11, 0x71, 0xe2, - 0x04, 0x9c, 0xe9, 0x5e, 0xba, 0xad, 0x6b, 0x99, 0x8e, 0x69, 0xdf, 0xd6, 0x32, 0x77, 0x76, 0x34, - 0xa3, 0x6d, 0xcf, 0x93, 0x77, 0x65, 0x42, 0x33, 0xf6, 0x9d, 0xfd, 0x2e, 0x46, 0x37, 0x76, 0x2f, - 0x6f, 0xdd, 0xd6, 0xd1, 0x2f, 0xdd, 0xd6, 0xbd, 0x74, 0xdb, 0x8e, 0xd9, 0xc6, 0x1d, 0xef, 0x07, - 0xf2, 0xc2, 0xb2, 0xa3, 0x9b, 0xa3, 0x72, 0x75, 0xcc, 0x96, 0xd6, 0xb1, 0x1d, 0xd3, 0xc2, 0x2c, - 0xe7, 0xe9, 0xa0, 0x48, 0xbc, 0x87, 0x0d, 0xc7, 0xa3, 0x70, 0xdd, 0x96, 0x69, 0x6e, 0x75, 0x30, - 0xfd, 0x76, 0x69, 0x77, 0xf3, 0x36, 0xdb, 0xb1, 0x76, 0x5b, 0x0e, 0xfb, 0x7a, 0xae, 0xf7, 0x6b, - 0x1b, 0xdb, 0x2d, 0x4b, 0xef, 0x3a, 0xa6, 0x45, 0x73, 0x9c, 0x7f, 0xf1, 0xcb, 0x27, 0x41, 0x56, - 0xbb, 0x2d, 0xf4, 0xd5, 0x09, 0x90, 0x8b, 0xdd, 0x2e, 0xfa, 0xa0, 0x04, 0xb0, 0x8c, 0x9d, 0x0b, - 0xd8, 0xb2, 0x75, 0xd3, 0x40, 0xc7, 0x61, 0x42, 0xc5, 0x3f, 0xb0, 0x8b, 0x6d, 0xe7, 0xae, 0xec, - 0x8b, 0xbe, 0x28, 0x67, 0xd0, 0x63, 0x12, 0x4c, 0xaa, 0xd8, 0xee, 0x9a, 0x86, 0x8d, 0x95, 0xfb, - 0x21, 0x87, 0x2d, 0xcb, 0xb4, 0xce, 0x64, 0xce, 0x65, 0x6e, 0x9e, 0xbe, 0xe3, 0x96, 0x79, 0x56, - 0xfd, 0x79, 0xb5, 0xdb, 0x9a, 0x2f, 0x76, 0xbb, 0xf3, 0x01, 0xa5, 0x79, 0xef, 0xa7, 0xf9, 0xb2, - 0xfb, 0x87, 0x4a, 0x7f, 0x54, 0xce, 0xc0, 0xc4, 0x1e, 0xcd, 0x70, 0x46, 0x3a, 0x97, 0xb9, 0x79, - 0x4a, 0xf5, 0x5e, 0xdd, 0x2f, 0x6d, 0xec, 0x68, 0x7a, 0xc7, 0x3e, 0x23, 0xd3, 0x2f, 0xec, 0x15, - 0xbd, 0x2e, 0x03, 0x39, 0x42, 0x44, 0x29, 0x41, 0xb6, 0x65, 0xb6, 0x31, 0x29, 0x7e, 0xee, 0x8e, - 0xdb, 0xc4, 0x8b, 0x9f, 0x2f, 0x99, 0x6d, 0xac, 0x92, 0x9f, 0x95, 0x73, 0x30, 0xed, 0x89, 0x25, - 0x60, 0x23, 0x9c, 0x74, 0xfe, 0x0e, 0xc8, 0xba, 0xf9, 0x95, 0x49, 0xc8, 0x56, 0x37, 0x56, 0x57, - 0x0b, 0xc7, 0x94, 0x13, 0x30, 0xbb, 0x51, 0x7d, 0xb0, 0x5a, 0xbb, 0x58, 0x6d, 0x96, 0x55, 0xb5, - 0xa6, 0x16, 0x32, 0xca, 0x2c, 0x4c, 0x2d, 0x14, 0x17, 0x9b, 0x95, 0xea, 0xfa, 0x46, 0xa3, 0x20, - 0xa1, 0x57, 0xcb, 0x30, 0x57, 0xc7, 0xce, 0x22, 0xde, 0xd3, 0x5b, 0xb8, 0xee, 0x68, 0x0e, 0x46, - 0x2f, 0xcd, 0xf8, 0xc2, 0x54, 0x36, 0xdc, 0x42, 0xfd, 0x4f, 0xac, 0x02, 0xcf, 0x38, 0x50, 0x01, - 0x9e, 0xc2, 0x3c, 0xfb, 0x7b, 0x3e, 0x94, 0xa6, 0x86, 0xe9, 0x9c, 0x7f, 0x1a, 0x4c, 0x87, 0xbe, - 0x29, 0x73, 0x00, 0x0b, 0xc5, 0xd2, 0x83, 0xcb, 0x6a, 0x6d, 0xa3, 0xba, 0x58, 0x38, 0xe6, 0xbe, - 0x2f, 0xd5, 0xd4, 0x32, 0x7b, 0xcf, 0xa0, 0xaf, 0x67, 0x42, 0x60, 0x2e, 0xf2, 0x60, 0xce, 0x0f, - 0x66, 0xa6, 0x0f, 0xa0, 0xe8, 0x97, 0x7c, 0x70, 0x96, 0x39, 0x70, 0x9e, 0x91, 0x8c, 0x5c, 0xfa, - 0x00, 0x3d, 0x2a, 0xc1, 0x64, 0x7d, 0x7b, 0xd7, 0x69, 0x9b, 0x57, 0x0c, 0x34, 0xe5, 0x23, 0x83, - 0xbe, 0x1c, 0x96, 0xc9, 0xbd, 0xbc, 0x4c, 0x6e, 0x3e, 0x58, 0x09, 0x46, 0x21, 0x42, 0x1a, 0xbf, - 0xe8, 0x4b, 0xa3, 0xc8, 0x49, 0xe3, 0x69, 0xa2, 0x84, 0xd2, 0x97, 0xc3, 0xcf, 0x3d, 0x1b, 0x72, - 0xf5, 0xae, 0xd6, 0xc2, 0xe8, 0x8f, 0x64, 0x98, 0x59, 0xc5, 0xda, 0x1e, 0x2e, 0x76, 0xbb, 0x96, - 0xb9, 0x87, 0x51, 0x29, 0xd0, 0xd7, 0x33, 0x30, 0x61, 0xbb, 0x99, 0x2a, 0x6d, 0x52, 0x83, 0x29, - 0xd5, 0x7b, 0x55, 0xce, 0x02, 0xe8, 0x6d, 0x6c, 0x38, 0xba, 0xa3, 0x63, 0xfb, 0x8c, 0x74, 0x4e, - 0xbe, 0x79, 0x4a, 0x0d, 0xa5, 0xa0, 0xaf, 0x4a, 0xa2, 0x3a, 0x46, 0xb8, 0x98, 0x0f, 0x73, 0x10, - 0x21, 0xd5, 0xd7, 0x4b, 0x22, 0x3a, 0x36, 0x90, 0x5c, 0x32, 0xd9, 0xfe, 0x7a, 0x26, 0xb9, 0x70, - 0xdd, 0x1c, 0xd5, 0x5a, 0xb3, 0xbe, 0x51, 0x5a, 0x69, 0xd6, 0xd7, 0x8b, 0xa5, 0x72, 0x01, 0x2b, - 0x27, 0xa1, 0x40, 0x1e, 0x9b, 0x95, 0x7a, 0x73, 0xb1, 0xbc, 0x5a, 0x6e, 0x94, 0x17, 0x0b, 0x9b, - 0x8a, 0x02, 0x73, 0x6a, 0xf9, 0x7b, 0x36, 0xca, 0xf5, 0x46, 0x73, 0xa9, 0x58, 0x59, 0x2d, 0x2f, - 0x16, 0xb6, 0xdc, 0x9f, 0x57, 0x2b, 0x6b, 0x95, 0x46, 0x53, 0x2d, 0x17, 0x4b, 0x2b, 0xe5, 0xc5, - 0xc2, 0xb6, 0x72, 0x35, 0x5c, 0x55, 0xad, 0x35, 0x8b, 0xeb, 0xeb, 0x6a, 0xed, 0x42, 0xb9, 0xc9, - 0xfe, 0xa8, 0x17, 0x74, 0x5a, 0x50, 0xa3, 0x59, 0x5f, 0x29, 0xaa, 0xe5, 0xe2, 0xc2, 0x6a, 0xb9, - 0xf0, 0x30, 0x7a, 0x81, 0x0c, 0xb3, 0x6b, 0xda, 0x65, 0x5c, 0xdf, 0xd6, 0x2c, 0xac, 0x5d, 0xea, - 0x60, 0x74, 0x83, 0x00, 0x9e, 0xe8, 0x8f, 0xc2, 0x78, 0x95, 0x79, 0xbc, 0x6e, 0xeb, 0x23, 0x60, - 0xae, 0x88, 0x08, 0xc0, 0xfe, 0xc5, 0x6f, 0x06, 0x2b, 0x1c, 0x60, 0xcf, 0x4c, 0x48, 0x2f, 0x19, - 0x62, 0x3f, 0xf4, 0x04, 0x40, 0x0c, 0x3d, 0x2e, 0xc3, 0x5c, 0xc5, 0xd8, 0xd3, 0x1d, 0xbc, 0x8c, - 0x0d, 0x6c, 0xb9, 0xe3, 0x80, 0x10, 0x0c, 0x8f, 0xc9, 0x21, 0x18, 0x96, 0x78, 0x18, 0x6e, 0xef, - 0x23, 0x36, 0xbe, 0x8c, 0x88, 0xd1, 0xf6, 0x3a, 0x98, 0xd2, 0x49, 0xbe, 0x92, 0xde, 0x66, 0x12, - 0x0b, 0x12, 0x94, 0x1b, 0x61, 0x96, 0xbe, 0x2c, 0xe9, 0x1d, 0xfc, 0x20, 0xde, 0x67, 0xe3, 0x2e, - 0x9f, 0x88, 0x7e, 0xdc, 0x6f, 0x7c, 0x15, 0x0e, 0xcb, 0xef, 0x4a, 0xca, 0x54, 0x32, 0x30, 0x5f, - 0xf1, 0x44, 0x68, 0x7e, 0x07, 0x5a, 0x99, 0x8e, 0xbe, 0x29, 0xc1, 0x74, 0xdd, 0x31, 0xbb, 0xae, - 0xca, 0xea, 0xc6, 0x96, 0x18, 0xb8, 0x1f, 0x0e, 0xb7, 0xb1, 0x12, 0x0f, 0xee, 0xd3, 0xfa, 0xc8, - 0x31, 0x54, 0x40, 0x44, 0x0b, 0xfb, 0xaa, 0xdf, 0xc2, 0x96, 0x38, 0x54, 0xee, 0x48, 0x44, 0xed, - 0x5b, 0xb0, 0x7d, 0xbd, 0x42, 0x86, 0x82, 0xa7, 0x66, 0x4e, 0x69, 0xd7, 0xb2, 0xb0, 0xe1, 0x88, - 0x81, 0xf0, 0x97, 0x61, 0x10, 0x56, 0x78, 0x10, 0xee, 0x88, 0x51, 0x66, 0xaf, 0x94, 0x14, 0xdb, - 0xd8, 0xfb, 0x7c, 0x34, 0x1f, 0xe4, 0xd0, 0xfc, 0xee, 0xe4, 0x6c, 0x25, 0x83, 0x74, 0x65, 0x08, - 0x44, 0x4f, 0x42, 0xc1, 0x1d, 0x93, 0x4a, 0x8d, 0xca, 0x85, 0x72, 0xb3, 0x52, 0xbd, 0x50, 0x69, - 0x94, 0x0b, 0x18, 0xbd, 0x5c, 0x86, 0x19, 0xca, 0x9a, 0x8a, 0xf7, 0xcc, 0xcb, 0x82, 0xbd, 0xde, - 0xe3, 0x09, 0x8d, 0x85, 0x70, 0x09, 0x11, 0x2d, 0xe3, 0xc7, 0x12, 0x18, 0x0b, 0x31, 0xe4, 0x9e, - 0x48, 0xbd, 0xd5, 0x81, 0x66, 0xb0, 0xd5, 0xa7, 0xb5, 0xf4, 0xed, 0xad, 0x5e, 0x91, 0x05, 0xa0, - 0x95, 0xbc, 0xa0, 0xe3, 0x2b, 0x68, 0x2d, 0xc0, 0x84, 0x53, 0xdb, 0xcc, 0x40, 0xb5, 0x95, 0xfa, - 0xa9, 0xed, 0xbb, 0xc2, 0x63, 0xd6, 0x02, 0x8f, 0xde, 0xad, 0x91, 0xe2, 0x76, 0x39, 0x89, 0x9e, - 0x1d, 0x7a, 0x8a, 0x22, 0xf1, 0x56, 0xe7, 0x75, 0x30, 0x45, 0x1e, 0xab, 0xda, 0x0e, 0x66, 0x6d, - 0x28, 0x48, 0x50, 0xce, 0xc3, 0x0c, 0xcd, 0xd8, 0x32, 0x0d, 0xb7, 0x3e, 0x59, 0x92, 0x81, 0x4b, - 0x73, 0x41, 0x6c, 0x59, 0x58, 0x73, 0x4c, 0x8b, 0xd0, 0xc8, 0x51, 0x10, 0x43, 0x49, 0xe8, 0x4b, - 0x7e, 0x2b, 0x2c, 0x73, 0x9a, 0xf3, 0xf4, 0x24, 0x55, 0x49, 0xa6, 0x37, 0x7b, 0xc3, 0xb5, 0x3f, - 0xda, 0xea, 0x9a, 0x2e, 0xda, 0x4b, 0x64, 0x6a, 0x87, 0x95, 0xd3, 0xa0, 0xb0, 0x54, 0x37, 0x6f, - 0xa9, 0x56, 0x6d, 0x94, 0xab, 0x8d, 0xc2, 0x66, 0x5f, 0x8d, 0xda, 0x42, 0xaf, 0xcf, 0x42, 0xf6, - 0x01, 0x53, 0x37, 0xd0, 0xa3, 0x19, 0x4e, 0x25, 0x0c, 0xec, 0x5c, 0x31, 0xad, 0xcb, 0x7e, 0x43, - 0x0d, 0x12, 0xe2, 0xb1, 0x09, 0x54, 0x49, 0x1e, 0xa8, 0x4a, 0xd9, 0x7e, 0xaa, 0xf4, 0x93, 0x61, - 0x55, 0xba, 0x9b, 0x57, 0xa5, 0x9b, 0xfa, 0xc8, 0xdf, 0x65, 0x3e, 0xa2, 0x03, 0xf8, 0x90, 0xdf, - 0x01, 0xdc, 0xc7, 0xc1, 0xf8, 0x54, 0x31, 0x32, 0xc9, 0x00, 0xfc, 0x4c, 0xaa, 0x0d, 0xbf, 0x1f, - 0xd4, 0x5b, 0x11, 0x50, 0x6f, 0xf7, 0xe9, 0x13, 0xf4, 0x83, 0x5d, 0xc7, 0xc3, 0x07, 0xbb, 0x89, - 0xcb, 0xca, 0x29, 0x38, 0xb1, 0x58, 0x59, 0x5a, 0x2a, 0xab, 0xe5, 0x6a, 0xa3, 0x59, 0x2d, 0x37, - 0x2e, 0xd6, 0xd4, 0x07, 0x0b, 0x1d, 0xf4, 0x3a, 0x19, 0xc0, 0x95, 0x50, 0x49, 0x33, 0x5a, 0xb8, - 0x23, 0xd6, 0xa3, 0xff, 0x2f, 0x29, 0x59, 0x9f, 0x10, 0xd0, 0x8f, 0x80, 0xf3, 0x55, 0x92, 0x78, - 0xab, 0x8c, 0x24, 0x96, 0x0c, 0xd4, 0x37, 0x3e, 0x11, 0x6c, 0xcf, 0xab, 0xe0, 0xb8, 0x47, 0x8f, - 0x65, 0xef, 0x3f, 0xed, 0x7b, 0x73, 0x16, 0xe6, 0x18, 0x2c, 0xde, 0x3c, 0xfe, 0x45, 0x19, 0x91, - 0x89, 0x3c, 0x82, 0x49, 0x36, 0x6d, 0xf7, 0xba, 0x77, 0xff, 0x5d, 0x59, 0x86, 0xe9, 0x2e, 0xb6, - 0x76, 0x74, 0xdb, 0xd6, 0x4d, 0x83, 0x2e, 0xc8, 0xcd, 0xdd, 0xf1, 0x64, 0x5f, 0xe2, 0x64, 0xed, - 0x72, 0x7e, 0x5d, 0xb3, 0x1c, 0xbd, 0xa5, 0x77, 0x35, 0xc3, 0x59, 0x0f, 0x32, 0xab, 0xe1, 0x3f, - 0xd1, 0xcb, 0x12, 0x4e, 0x6b, 0xf8, 0x9a, 0x44, 0xa8, 0xc4, 0x6f, 0x25, 0x98, 0x92, 0xc4, 0x12, - 0x4c, 0xa6, 0x16, 0x1f, 0x4c, 0x55, 0x2d, 0xfa, 0xe0, 0xbd, 0xa5, 0x5c, 0x03, 0xa7, 0x2a, 0xd5, - 0x52, 0x4d, 0x55, 0xcb, 0xa5, 0x46, 0x73, 0xbd, 0xac, 0xae, 0x55, 0xea, 0xf5, 0x4a, 0xad, 0x5a, - 0x3f, 0x4c, 0x6b, 0x47, 0x1f, 0x91, 0x7d, 0x8d, 0x59, 0xc4, 0xad, 0x8e, 0x6e, 0x60, 0x74, 0xdf, - 0x21, 0x15, 0x86, 0x5f, 0xf5, 0x11, 0xc7, 0x99, 0x95, 0x1f, 0x81, 0xf3, 0x6b, 0x93, 0xe3, 0xdc, - 0x9f, 0xe0, 0x7f, 0xe0, 0xe6, 0xff, 0xb8, 0x0c, 0x27, 0x42, 0x0d, 0x51, 0xc5, 0x3b, 0x23, 0x5b, - 0xc9, 0xfb, 0xa1, 0x70, 0xdb, 0xad, 0xf0, 0x98, 0xf6, 0xb3, 0xa6, 0x0f, 0xb0, 0x11, 0x01, 0xeb, - 0x1b, 0x7d, 0x58, 0x57, 0x39, 0x58, 0x9f, 0x3d, 0x04, 0xcd, 0x64, 0xc8, 0xfe, 0x46, 0xaa, 0xc8, - 0x5e, 0x03, 0xa7, 0xd6, 0x8b, 0x6a, 0xa3, 0x52, 0xaa, 0xac, 0x17, 0xdd, 0x71, 0x34, 0x34, 0x64, - 0x47, 0x98, 0xeb, 0x3c, 0xe8, 0x7d, 0xf1, 0xfd, 0x9d, 0x2c, 0x5c, 0xd7, 0xbf, 0xa3, 0x2d, 0x6d, - 0x6b, 0xc6, 0x16, 0x46, 0xba, 0x08, 0xd4, 0x8b, 0x30, 0xd1, 0x22, 0xd9, 0x29, 0xce, 0xe1, 0xad, - 0x9b, 0x98, 0xbe, 0x9c, 0x96, 0xa0, 0x7a, 0xbf, 0xa2, 0xb7, 0x85, 0x15, 0xa2, 0xc1, 0x2b, 0xc4, - 0xbd, 0xf1, 0xe0, 0x1d, 0xe0, 0x3b, 0x42, 0x37, 0x3e, 0xe6, 0xeb, 0xc6, 0x45, 0x4e, 0x37, 0x4a, - 0x87, 0x23, 0x9f, 0x4c, 0x4d, 0xfe, 0xf0, 0x89, 0xd0, 0x01, 0x44, 0x6a, 0x93, 0x1e, 0x3d, 0x2a, - 0xf4, 0xed, 0xee, 0x5f, 0x23, 0x43, 0x7e, 0x11, 0x77, 0xb0, 0xe8, 0x4a, 0xe4, 0x57, 0x24, 0xd1, - 0x0d, 0x11, 0x0a, 0x03, 0xa5, 0x1d, 0xbd, 0x3a, 0xe2, 0xe8, 0x3b, 0xd8, 0x76, 0xb4, 0x9d, 0x2e, - 0x11, 0xb5, 0xac, 0x06, 0x09, 0xe8, 0x87, 0x25, 0x91, 0xed, 0x92, 0x98, 0x62, 0xfe, 0x63, 0xac, - 0x29, 0x7e, 0x42, 0x82, 0xc9, 0x3a, 0x76, 0x6a, 0x56, 0x1b, 0x5b, 0xa8, 0x1e, 0x60, 0x74, 0x0e, - 0xa6, 0x09, 0x28, 0xee, 0x34, 0xd3, 0xc7, 0x29, 0x9c, 0xa4, 0xdc, 0x04, 0x73, 0xfe, 0x2b, 0xf9, - 0x9d, 0x75, 0xe3, 0x3d, 0xa9, 0xe8, 0x1f, 0x33, 0xa2, 0xbb, 0xb8, 0x6c, 0xc9, 0x90, 0x71, 0x13, - 0xd1, 0x4a, 0xc5, 0x76, 0x64, 0x63, 0x49, 0xa5, 0xbf, 0xd1, 0xf5, 0x16, 0x09, 0x60, 0xc3, 0xb0, - 0x3d, 0xb9, 0x3e, 0x35, 0x81, 0x5c, 0xd1, 0x3f, 0x67, 0x92, 0xcd, 0x62, 0x82, 0x72, 0x22, 0x24, - 0xf6, 0x86, 0x04, 0x6b, 0x0b, 0x91, 0xc4, 0xd2, 0x97, 0xd9, 0xe7, 0xe7, 0x20, 0x7f, 0x51, 0xeb, - 0x74, 0xb0, 0x83, 0xbe, 0x20, 0x41, 0xbe, 0x64, 0x61, 0xcd, 0xc1, 0x61, 0xd1, 0x21, 0x98, 0xb4, - 0x4c, 0xd3, 0x59, 0xd7, 0x9c, 0x6d, 0x26, 0x37, 0xff, 0x9d, 0x39, 0x0c, 0xfc, 0x5a, 0xb8, 0xfb, - 0xb8, 0x8f, 0x17, 0xdd, 0x77, 0x72, 0xb5, 0xa5, 0x05, 0xcd, 0xd3, 0x42, 0x22, 0xfa, 0x0f, 0x04, - 0x93, 0x3b, 0x06, 0xde, 0x31, 0x0d, 0xbd, 0xe5, 0xd9, 0x9c, 0xde, 0x3b, 0xfa, 0x3d, 0x5f, 0xa6, - 0x0b, 0x9c, 0x4c, 0xe7, 0x85, 0x4b, 0x49, 0x26, 0xd0, 0xfa, 0x10, 0xbd, 0xc7, 0xf5, 0x70, 0x2d, - 0xed, 0x0c, 0x9a, 0x8d, 0x5a, 0xb3, 0xa4, 0x96, 0x8b, 0x8d, 0x72, 0x73, 0xb5, 0x56, 0x2a, 0xae, - 0x36, 0xd5, 0xf2, 0x7a, 0xad, 0x80, 0xd1, 0xdf, 0x49, 0xae, 0x70, 0x5b, 0xe6, 0x1e, 0xb6, 0xd0, - 0xb2, 0x90, 0x9c, 0xe3, 0x64, 0xc2, 0x30, 0xf8, 0x49, 0x61, 0xa7, 0x0d, 0x26, 0x1d, 0xc6, 0x41, - 0x84, 0xf2, 0xbe, 0x5f, 0xa8, 0xb9, 0xc7, 0x92, 0x7a, 0x02, 0x48, 0xfa, 0x7f, 0x4b, 0x30, 0x51, - 0x32, 0x8d, 0x3d, 0x6c, 0x39, 0xe1, 0xf9, 0x4e, 0x58, 0x9a, 0x19, 0x5e, 0x9a, 0xee, 0x20, 0x89, - 0x0d, 0xc7, 0x32, 0xbb, 0xde, 0x84, 0xc7, 0x7b, 0x45, 0xbf, 0x9c, 0x54, 0xc2, 0xac, 0xe4, 0xe8, - 0x85, 0xcf, 0xfe, 0x05, 0x71, 0xec, 0xc9, 0x3d, 0x0d, 0xe0, 0x75, 0x49, 0x70, 0xe9, 0xcf, 0x40, - 0xfa, 0x5d, 0xca, 0x67, 0x65, 0x98, 0xa5, 0x8d, 0xaf, 0x8e, 0x89, 0x85, 0x86, 0x6a, 0xe1, 0x25, - 0xc7, 0x1e, 0xe1, 0xaf, 0x1c, 0xe3, 0xc4, 0x9f, 0xd7, 0xba, 0x5d, 0x7f, 0xf9, 0x79, 0xe5, 0x98, - 0xca, 0xde, 0xa9, 0x9a, 0x2f, 0xe4, 0x21, 0xab, 0xed, 0x3a, 0xdb, 0xe8, 0x9b, 0xc2, 0x93, 0x4f, - 0xae, 0x33, 0x60, 0xfc, 0x44, 0x40, 0x72, 0x12, 0x72, 0x8e, 0x79, 0x19, 0x7b, 0x72, 0xa0, 0x2f, + // 19802 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0xfd, 0x7b, 0x9c, 0x24, 0x49, + 0x59, 0x2f, 0x8c, 0x4f, 0x65, 0x56, 0x55, 0x77, 0x3f, 0x7d, 0x99, 0x9a, 0xdc, 0x99, 0xd9, 0xd9, + 0xd8, 0x65, 0x76, 0x9c, 0x5d, 0x96, 0x75, 0x59, 0x7a, 0x2f, 0x20, 0xb2, 0xcb, 0xde, 0xaa, 0xab, + 0xab, 0xbb, 0x6b, 0xb7, 0xbb, 0xaa, 0xcd, 0xaa, 0x9e, 0x61, 0xf5, 0xf8, 0xab, 0x93, 0x53, 0x15, + 0xdd, 0x9d, 0x3b, 0xd5, 0x99, 0x65, 0x66, 0x76, 0xcf, 0x0e, 0xbf, 0xcf, 0x79, 0x8f, 0x88, 0x2b, + 0x28, 0x72, 0x10, 0x15, 0x15, 0x15, 0x90, 0xcb, 0xca, 0x01, 0x05, 0xe4, 0x7e, 0x40, 0x05, 0xe4, + 0x22, 0x88, 0x88, 0x08, 0x72, 0x11, 0xdd, 0x57, 0x10, 0x44, 0x3c, 0x1f, 0x39, 0xbc, 0xfa, 0x1e, + 0x41, 0x14, 0x5e, 0xdf, 0x4f, 0x46, 0x44, 0x5e, 0xa2, 0xba, 0x32, 0x2b, 0xb2, 0xba, 0xb2, 0x7a, + 0x91, 0xf7, 0xbf, 0xcc, 0xc8, 0xc8, 0x27, 0x9e, 0x78, 0xbe, 0x4f, 0x44, 0x3c, 0x11, 0xf1, 0xc4, + 0x13, 0x70, 0xaa, 0x7b, 0xe1, 0x96, 0xae, 0x65, 0x3a, 0xa6, 0x7d, 0x4b, 0xcb, 0xdc, 0xd9, 0xd1, + 0x8c, 0xb6, 0x3d, 0x4f, 0xde, 0x95, 0x09, 0xcd, 0xb8, 0xec, 0x5c, 0xee, 0x62, 0x74, 0x7d, 0xf7, + 0xe2, 0xd6, 0x2d, 0x1d, 0xfd, 0xc2, 0x2d, 0xdd, 0x0b, 0xb7, 0xec, 0x98, 0x6d, 0xdc, 0xf1, 0x7e, + 0x20, 0x2f, 0x2c, 0x3b, 0xba, 0x31, 0x2a, 0x57, 0xc7, 0x6c, 0x69, 0x1d, 0xdb, 0x31, 0x2d, 0xcc, + 0x72, 0x9e, 0x0c, 0x8a, 0xc4, 0x7b, 0xd8, 0x70, 0x3c, 0x0a, 0xd7, 0x6c, 0x99, 0xe6, 0x56, 0x07, + 0xd3, 0x6f, 0x17, 0x76, 0x37, 0x6f, 0xb1, 0x1d, 0x6b, 0xb7, 0xe5, 0xb0, 0xaf, 0x67, 0x7a, 0xbf, + 0xb6, 0xb1, 0xdd, 0xb2, 0xf4, 0xae, 0x63, 0x5a, 0x34, 0xc7, 0xd9, 0x77, 0xfd, 0xe2, 0x24, 0xc8, + 0x6a, 0xb7, 0x85, 0xbe, 0x31, 0x01, 0x72, 0xb1, 0xdb, 0x45, 0x1f, 0x92, 0x00, 0x96, 0xb1, 0x73, + 0x0e, 0x5b, 0xb6, 0x6e, 0x1a, 0xe8, 0x28, 0x4c, 0xa8, 0xf8, 0xc7, 0x76, 0xb1, 0xed, 0xdc, 0x99, + 0x7d, 0xfe, 0x57, 0xe4, 0x0c, 0x7a, 0x54, 0x82, 0x49, 0x15, 0xdb, 0x5d, 0xd3, 0xb0, 0xb1, 0x72, + 0x1f, 0xe4, 0xb0, 0x65, 0x99, 0xd6, 0xa9, 0xcc, 0x99, 0xcc, 0x8d, 0xd3, 0xb7, 0xdf, 0x34, 0xcf, + 0xaa, 0x3f, 0xaf, 0x76, 0x5b, 0xf3, 0xc5, 0x6e, 0x77, 0x3e, 0xa0, 0x34, 0xef, 0xfd, 0x34, 0x5f, + 0x76, 0xff, 0x50, 0xe9, 0x8f, 0xca, 0x29, 0x98, 0xd8, 0xa3, 0x19, 0x4e, 0x49, 0x67, 0x32, 0x37, + 0x4e, 0xa9, 0xde, 0xab, 0xfb, 0xa5, 0x8d, 0x1d, 0x4d, 0xef, 0xd8, 0xa7, 0x64, 0xfa, 0x85, 0xbd, + 0xa2, 0x57, 0x65, 0x20, 0x47, 0x88, 0x28, 0x25, 0xc8, 0xb6, 0xcc, 0x36, 0x26, 0xc5, 0xcf, 0xdd, + 0x7e, 0x8b, 0x78, 0xf1, 0xf3, 0x25, 0xb3, 0x8d, 0x55, 0xf2, 0xb3, 0x72, 0x06, 0xa6, 0x3d, 0xb1, + 0x04, 0x6c, 0x84, 0x93, 0xce, 0xde, 0x0e, 0x59, 0x37, 0xbf, 0x32, 0x09, 0xd9, 0xea, 0xc6, 0xea, + 0x6a, 0xe1, 0x88, 0x72, 0x0c, 0x66, 0x37, 0xaa, 0x0f, 0x54, 0x6b, 0xe7, 0xab, 0xcd, 0xb2, 0xaa, + 0xd6, 0xd4, 0x42, 0x46, 0x99, 0x85, 0xa9, 0x85, 0xe2, 0x62, 0xb3, 0x52, 0x5d, 0xdf, 0x68, 0x14, + 0x24, 0xf4, 0x72, 0x19, 0xe6, 0xea, 0xd8, 0x59, 0xc4, 0x7b, 0x7a, 0x0b, 0xd7, 0x1d, 0xcd, 0xc1, + 0xe8, 0x45, 0x19, 0x5f, 0x98, 0xca, 0x86, 0x5b, 0xa8, 0xff, 0x89, 0x55, 0xe0, 0xa9, 0xfb, 0x2a, + 0xc0, 0x53, 0x98, 0x67, 0x7f, 0xcf, 0x87, 0xd2, 0xd4, 0x30, 0x9d, 0xb3, 0x4f, 0x81, 0xe9, 0xd0, + 0x37, 0x65, 0x0e, 0x60, 0xa1, 0x58, 0x7a, 0x60, 0x59, 0xad, 0x6d, 0x54, 0x17, 0x0b, 0x47, 0xdc, + 0xf7, 0xa5, 0x9a, 0x5a, 0x66, 0xef, 0x19, 0xf4, 0xad, 0x4c, 0x08, 0xcc, 0x45, 0x1e, 0xcc, 0xf9, + 0xc1, 0xcc, 0xf4, 0x01, 0x14, 0xfd, 0xa6, 0x0f, 0xce, 0x32, 0x07, 0xce, 0x53, 0x93, 0x91, 0x4b, + 0x1f, 0xa0, 0x47, 0x24, 0x98, 0xac, 0x6f, 0xef, 0x3a, 0x6d, 0xf3, 0x92, 0x81, 0xa6, 0x7c, 0x64, + 0xd0, 0xd7, 0xc2, 0x32, 0xb9, 0x87, 0x97, 0xc9, 0x8d, 0xfb, 0x2b, 0xc1, 0x28, 0x44, 0x48, 0xe3, + 0x37, 0x7c, 0x69, 0x14, 0x39, 0x69, 0x3c, 0x45, 0x94, 0x50, 0xfa, 0x72, 0xf8, 0xd5, 0x67, 0x40, + 0xae, 0xde, 0xd5, 0x5a, 0x18, 0x7d, 0x4c, 0x86, 0x99, 0x55, 0xac, 0xed, 0xe1, 0x62, 0xb7, 0x6b, + 0x99, 0x7b, 0x18, 0x95, 0x02, 0x7d, 0x3d, 0x05, 0x13, 0xb6, 0x9b, 0xa9, 0xd2, 0x26, 0x35, 0x98, + 0x52, 0xbd, 0x57, 0xe5, 0x34, 0x80, 0xde, 0xc6, 0x86, 0xa3, 0x3b, 0x3a, 0xb6, 0x4f, 0x49, 0x67, + 0xe4, 0x1b, 0xa7, 0xd4, 0x50, 0x0a, 0xfa, 0x86, 0x24, 0xaa, 0x63, 0x84, 0x8b, 0xf9, 0x30, 0x07, + 0x11, 0x52, 0x7d, 0xb5, 0x24, 0xa2, 0x63, 0x03, 0xc9, 0x25, 0x93, 0xed, 0x1b, 0x33, 0xc9, 0x85, + 0xeb, 0xe6, 0xa8, 0xd6, 0x9a, 0xf5, 0x8d, 0xd2, 0x4a, 0xb3, 0xbe, 0x5e, 0x2c, 0x95, 0x0b, 0x58, + 0x39, 0x0e, 0x05, 0xf2, 0xd8, 0xac, 0xd4, 0x9b, 0x8b, 0xe5, 0xd5, 0x72, 0xa3, 0xbc, 0x58, 0xd8, + 0x54, 0x14, 0x98, 0x53, 0xcb, 0x3f, 0xb4, 0x51, 0xae, 0x37, 0x9a, 0x4b, 0xc5, 0xca, 0x6a, 0x79, + 0xb1, 0xb0, 0xe5, 0xfe, 0xbc, 0x5a, 0x59, 0xab, 0x34, 0x9a, 0x6a, 0xb9, 0x58, 0x5a, 0x29, 0x2f, + 0x16, 0xb6, 0x95, 0x2b, 0xe1, 0x8a, 0x6a, 0xad, 0x59, 0x5c, 0x5f, 0x57, 0x6b, 0xe7, 0xca, 0x4d, + 0xf6, 0x47, 0xbd, 0xa0, 0xd3, 0x82, 0x1a, 0xcd, 0xfa, 0x4a, 0x51, 0x2d, 0x17, 0x17, 0x56, 0xcb, + 0x85, 0x87, 0xd0, 0x73, 0x65, 0x98, 0x5d, 0xd3, 0x2e, 0xe2, 0xfa, 0xb6, 0x66, 0x61, 0xed, 0x42, + 0x07, 0xa3, 0xeb, 0x04, 0xf0, 0x44, 0x1f, 0x0b, 0xe3, 0x55, 0xe6, 0xf1, 0xba, 0xa5, 0x8f, 0x80, + 0xb9, 0x22, 0x22, 0x00, 0xfb, 0x17, 0xbf, 0x19, 0xac, 0x70, 0x80, 0x3d, 0x2d, 0x21, 0xbd, 0x64, + 0x88, 0xfd, 0xc4, 0xe3, 0x00, 0x31, 0xf4, 0x98, 0x0c, 0x73, 0x15, 0x63, 0x4f, 0x77, 0xf0, 0x32, + 0x36, 0xb0, 0xe5, 0x8e, 0x03, 0x42, 0x30, 0x3c, 0x2a, 0x87, 0x60, 0x58, 0xe2, 0x61, 0xb8, 0xb5, + 0x8f, 0xd8, 0xf8, 0x32, 0x22, 0x46, 0xdb, 0x6b, 0x60, 0x4a, 0x27, 0xf9, 0x4a, 0x7a, 0x9b, 0x49, + 0x2c, 0x48, 0x50, 0xae, 0x87, 0x59, 0xfa, 0xb2, 0xa4, 0x77, 0xf0, 0x03, 0xf8, 0x32, 0x1b, 0x77, + 0xf9, 0x44, 0xf4, 0xb3, 0x7e, 0xe3, 0xab, 0x70, 0x58, 0xfe, 0x40, 0x52, 0xa6, 0x92, 0x81, 0xf9, + 0x92, 0xc7, 0x43, 0xf3, 0xdb, 0xd7, 0xca, 0x74, 0xf4, 0x1d, 0x09, 0xa6, 0xeb, 0x8e, 0xd9, 0x75, + 0x55, 0x56, 0x37, 0xb6, 0xc4, 0xc0, 0xfd, 0x48, 0xb8, 0x8d, 0x95, 0x78, 0x70, 0x9f, 0xd2, 0x47, + 0x8e, 0xa1, 0x02, 0x22, 0x5a, 0xd8, 0x37, 0xfc, 0x16, 0xb6, 0xc4, 0xa1, 0x72, 0x7b, 0x22, 0x6a, + 0xdf, 0x85, 0xed, 0xeb, 0x25, 0x32, 0x14, 0x3c, 0x35, 0x73, 0x4a, 0xbb, 0x96, 0x85, 0x0d, 0x47, + 0x0c, 0x84, 0xbf, 0x0c, 0x83, 0xb0, 0xc2, 0x83, 0x70, 0x7b, 0x8c, 0x32, 0x7b, 0xa5, 0xa4, 0xd8, + 0xc6, 0xde, 0xe7, 0xa3, 0xf9, 0x00, 0x87, 0xe6, 0x0f, 0x26, 0x67, 0x2b, 0x19, 0xa4, 0x2b, 0x43, + 0x20, 0x7a, 0x1c, 0x0a, 0xee, 0x98, 0x54, 0x6a, 0x54, 0xce, 0x95, 0x9b, 0x95, 0xea, 0xb9, 0x4a, + 0xa3, 0x5c, 0xc0, 0xe8, 0x17, 0x64, 0x98, 0xa1, 0xac, 0xa9, 0x78, 0xcf, 0xbc, 0x28, 0xd8, 0xeb, + 0x3d, 0x96, 0xd0, 0x58, 0x08, 0x97, 0x10, 0xd1, 0x32, 0x7e, 0x26, 0x81, 0xb1, 0x10, 0x43, 0xee, + 0xf1, 0xd4, 0x5b, 0xed, 0x6b, 0x06, 0x5b, 0x7d, 0x5a, 0x4b, 0xdf, 0xde, 0xea, 0x25, 0x59, 0x00, + 0x5a, 0xc9, 0x73, 0x3a, 0xbe, 0x84, 0xd6, 0x02, 0x4c, 0x38, 0xb5, 0xcd, 0x0c, 0x54, 0x5b, 0xa9, + 0x9f, 0xda, 0xbe, 0x33, 0x3c, 0x66, 0x2d, 0xf0, 0xe8, 0xdd, 0x1c, 0x29, 0x6e, 0x97, 0x93, 0xe8, + 0xd9, 0xa1, 0xa7, 0x28, 0x12, 0x6f, 0x75, 0x5e, 0x03, 0x53, 0xe4, 0xb1, 0xaa, 0xed, 0x60, 0xd6, + 0x86, 0x82, 0x04, 0xe5, 0x2c, 0xcc, 0xd0, 0x8c, 0x2d, 0xd3, 0x70, 0xeb, 0x93, 0x25, 0x19, 0xb8, + 0x34, 0x17, 0xc4, 0x96, 0x85, 0x35, 0xc7, 0xb4, 0x08, 0x8d, 0x1c, 0x05, 0x31, 0x94, 0x84, 0xbe, + 0xea, 0xb7, 0xc2, 0x32, 0xa7, 0x39, 0xb7, 0x25, 0xa9, 0x4a, 0x32, 0xbd, 0xd9, 0x1b, 0xae, 0xfd, + 0xd1, 0x56, 0xd7, 0x74, 0xd1, 0x5e, 0x22, 0x53, 0x3b, 0xac, 0x9c, 0x04, 0x85, 0xa5, 0xba, 0x79, + 0x4b, 0xb5, 0x6a, 0xa3, 0x5c, 0x6d, 0x14, 0x36, 0xfb, 0x6a, 0xd4, 0x16, 0x7a, 0x75, 0x16, 0xb2, + 0xf7, 0x9b, 0xba, 0x81, 0x1e, 0xc9, 0x70, 0x2a, 0x61, 0x60, 0xe7, 0x92, 0x69, 0x5d, 0xf4, 0x1b, + 0x6a, 0x90, 0x10, 0x8f, 0x4d, 0xa0, 0x4a, 0xf2, 0x40, 0x55, 0xca, 0xf6, 0x53, 0xa5, 0x9f, 0x0f, + 0xab, 0xd2, 0x5d, 0xbc, 0x2a, 0xdd, 0xd0, 0x47, 0xfe, 0x2e, 0xf3, 0x11, 0x1d, 0xc0, 0x87, 0xfd, + 0x0e, 0xe0, 0x5e, 0x0e, 0xc6, 0x27, 0x8b, 0x91, 0x49, 0x06, 0xe0, 0xe7, 0x53, 0x6d, 0xf8, 0xfd, + 0xa0, 0xde, 0x8a, 0x80, 0x7a, 0xbb, 0x4f, 0x9f, 0xa0, 0xef, 0xef, 0x3a, 0x1e, 0xda, 0xdf, 0x4d, + 0x5c, 0x54, 0x4e, 0xc0, 0xb1, 0xc5, 0xca, 0xd2, 0x52, 0x59, 0x2d, 0x57, 0x1b, 0xcd, 0x6a, 0xb9, + 0x71, 0xbe, 0xa6, 0x3e, 0x50, 0xe8, 0xa0, 0x57, 0xc9, 0x00, 0xae, 0x84, 0x4a, 0x9a, 0xd1, 0xc2, + 0x1d, 0xb1, 0x1e, 0xfd, 0x7f, 0x49, 0xc9, 0xfa, 0x84, 0x80, 0x7e, 0x04, 0x9c, 0x2f, 0x93, 0xc4, + 0x5b, 0x65, 0x24, 0xb1, 0x64, 0xa0, 0xbe, 0xfe, 0xf1, 0x60, 0x7b, 0x5e, 0x01, 0x47, 0x3d, 0x7a, + 0x2c, 0x7b, 0xff, 0x69, 0xdf, 0x9b, 0xb2, 0x30, 0xc7, 0x60, 0xf1, 0xe6, 0xf1, 0xcf, 0xcf, 0x88, + 0x4c, 0xe4, 0x11, 0x4c, 0xb2, 0x69, 0xbb, 0xd7, 0xbd, 0xfb, 0xef, 0xca, 0x32, 0x4c, 0x77, 0xb1, + 0xb5, 0xa3, 0xdb, 0xb6, 0x6e, 0x1a, 0x74, 0x41, 0x6e, 0xee, 0xf6, 0x27, 0xfa, 0x12, 0x27, 0x6b, + 0x97, 0xf3, 0xeb, 0x9a, 0xe5, 0xe8, 0x2d, 0xbd, 0xab, 0x19, 0xce, 0x7a, 0x90, 0x59, 0x0d, 0xff, + 0x89, 0x5e, 0x9c, 0x70, 0x5a, 0xc3, 0xd7, 0x24, 0x42, 0x25, 0x7e, 0x2f, 0xc1, 0x94, 0x24, 0x96, + 0x60, 0x32, 0xb5, 0xf8, 0x50, 0xaa, 0x6a, 0xd1, 0x07, 0xef, 0x2d, 0xe5, 0x2a, 0x38, 0x51, 0xa9, + 0x96, 0x6a, 0xaa, 0x5a, 0x2e, 0x35, 0x9a, 0xeb, 0x65, 0x75, 0xad, 0x52, 0xaf, 0x57, 0x6a, 0xd5, + 0xfa, 0x41, 0x5a, 0x3b, 0xfa, 0xa8, 0xec, 0x6b, 0xcc, 0x22, 0x6e, 0x75, 0x74, 0x03, 0xa3, 0x7b, + 0x0f, 0xa8, 0x30, 0xfc, 0xaa, 0x8f, 0x38, 0xce, 0xac, 0xfc, 0x08, 0x9c, 0x5f, 0x99, 0x1c, 0xe7, + 0xfe, 0x04, 0xff, 0x03, 0x37, 0xff, 0xc7, 0x64, 0x38, 0x16, 0x6a, 0x88, 0x2a, 0xde, 0x19, 0xd9, + 0x4a, 0xde, 0x4f, 0x84, 0xdb, 0x6e, 0x85, 0xc7, 0xb4, 0x9f, 0x35, 0xbd, 0x8f, 0x8d, 0x08, 0x58, + 0x5f, 0xef, 0xc3, 0xba, 0xca, 0xc1, 0xfa, 0x8c, 0x21, 0x68, 0x26, 0x43, 0xf6, 0x77, 0x52, 0x45, + 0xf6, 0x2a, 0x38, 0xb1, 0x5e, 0x54, 0x1b, 0x95, 0x52, 0x65, 0xbd, 0xe8, 0x8e, 0xa3, 0xa1, 0x21, + 0x3b, 0xc2, 0x5c, 0xe7, 0x41, 0xef, 0x8b, 0xef, 0x7b, 0xb3, 0x70, 0x4d, 0xff, 0x8e, 0xb6, 0xb4, + 0xad, 0x19, 0x5b, 0x18, 0xe9, 0x22, 0x50, 0x2f, 0xc2, 0x44, 0x8b, 0x64, 0xa7, 0x38, 0x87, 0xb7, + 0x6e, 0x62, 0xfa, 0x72, 0x5a, 0x82, 0xea, 0xfd, 0x8a, 0xde, 0x1a, 0x56, 0x88, 0x06, 0xaf, 0x10, + 0xf7, 0xc4, 0x83, 0xb7, 0x8f, 0xef, 0x08, 0xdd, 0xf8, 0x84, 0xaf, 0x1b, 0xe7, 0x39, 0xdd, 0x28, + 0x1d, 0x8c, 0x7c, 0x32, 0x35, 0xf9, 0xe3, 0xc7, 0x43, 0x07, 0x10, 0xa9, 0x4d, 0x7a, 0xf4, 0xa8, + 0xd0, 0xb7, 0xbb, 0x7f, 0x85, 0x0c, 0xf9, 0x45, 0xdc, 0xc1, 0xa2, 0x2b, 0x91, 0x5f, 0x97, 0x44, + 0x37, 0x44, 0x28, 0x0c, 0x94, 0x76, 0xf4, 0xea, 0x88, 0xa3, 0xef, 0x60, 0xdb, 0xd1, 0x76, 0xba, + 0x44, 0xd4, 0xb2, 0x1a, 0x24, 0xa0, 0x9f, 0x94, 0x44, 0xb6, 0x4b, 0x62, 0x8a, 0xf9, 0x8f, 0xb1, + 0xa6, 0xf8, 0x29, 0x09, 0x26, 0xeb, 0xd8, 0xa9, 0x59, 0x6d, 0x6c, 0xa1, 0x7a, 0x80, 0xd1, 0x19, + 0x98, 0x26, 0xa0, 0xb8, 0xd3, 0x4c, 0x1f, 0xa7, 0x70, 0x92, 0x72, 0x03, 0xcc, 0xf9, 0xaf, 0xe4, + 0x77, 0xd6, 0x8d, 0xf7, 0xa4, 0xa2, 0x7f, 0xcc, 0x88, 0xee, 0xe2, 0xb2, 0x25, 0x43, 0xc6, 0x4d, + 0x44, 0x2b, 0x15, 0xdb, 0x91, 0x8d, 0x25, 0x95, 0xfe, 0x46, 0xd7, 0x9b, 0x25, 0x80, 0x0d, 0xc3, + 0xf6, 0xe4, 0xfa, 0xe4, 0x04, 0x72, 0x45, 0xff, 0x9c, 0x49, 0x36, 0x8b, 0x09, 0xca, 0x89, 0x90, + 0xd8, 0x6b, 0x12, 0xac, 0x2d, 0x44, 0x12, 0x4b, 0x5f, 0x66, 0x5f, 0x9a, 0x83, 0xfc, 0x79, 0xad, + 0xd3, 0xc1, 0x0e, 0xfa, 0xb2, 0x04, 0xf9, 0x92, 0x85, 0x35, 0x07, 0x87, 0x45, 0x87, 0x60, 0xd2, + 0x32, 0x4d, 0x67, 0x5d, 0x73, 0xb6, 0x99, 0xdc, 0xfc, 0x77, 0xe6, 0x30, 0xf0, 0xdb, 0xe1, 0xee, + 0xe3, 0x5e, 0x5e, 0x74, 0xdf, 0xcf, 0xd5, 0x96, 0x16, 0x34, 0x4f, 0x0b, 0x89, 0xe8, 0x3f, 0x10, + 0x4c, 0xee, 0x18, 0x78, 0xc7, 0x34, 0xf4, 0x96, 0x67, 0x73, 0x7a, 0xef, 0xe8, 0xfd, 0xbe, 0x4c, + 0x17, 0x38, 0x99, 0xce, 0x0b, 0x97, 0x92, 0x4c, 0xa0, 0xf5, 0x21, 0x7a, 0x8f, 0x6b, 0xe1, 0x6a, + 0xda, 0x19, 0x34, 0x1b, 0xb5, 0x66, 0x49, 0x2d, 0x17, 0x1b, 0xe5, 0xe6, 0x6a, 0xad, 0x54, 0x5c, + 0x6d, 0xaa, 0xe5, 0xf5, 0x5a, 0x01, 0xa3, 0xbf, 0x93, 0x5c, 0xe1, 0xb6, 0xcc, 0x3d, 0x6c, 0xa1, + 0x65, 0x21, 0x39, 0xc7, 0xc9, 0x84, 0x61, 0xf0, 0xf3, 0xc2, 0x4e, 0x1b, 0x4c, 0x3a, 0x8c, 0x83, + 0x08, 0xe5, 0xfd, 0x80, 0x50, 0x73, 0x8f, 0x25, 0xf5, 0x38, 0x90, 0xf4, 0xff, 0x96, 0x60, 0xa2, + 0x64, 0x1a, 0x7b, 0xd8, 0x72, 0xc2, 0xf3, 0x9d, 0xb0, 0x34, 0x33, 0xbc, 0x34, 0xdd, 0x41, 0x12, + 0x1b, 0x8e, 0x65, 0x76, 0xbd, 0x09, 0x8f, 0xf7, 0x8a, 0x5e, 0x9b, 0x54, 0xc2, 0xac, 0xe4, 0xe8, + 0x85, 0xcf, 0xfe, 0x05, 0x71, 0xec, 0xc9, 0x3d, 0x0d, 0xe0, 0x55, 0x49, 0x70, 0xe9, 0xcf, 0x40, + 0xfa, 0x5d, 0xca, 0x17, 0x64, 0x98, 0xa5, 0x8d, 0xaf, 0x8e, 0x89, 0x85, 0x86, 0x6a, 0xe1, 0x25, + 0xc7, 0x1e, 0xe1, 0xaf, 0x1c, 0xe1, 0xc4, 0x9f, 0xd7, 0xba, 0x5d, 0x7f, 0xf9, 0x79, 0xe5, 0x88, + 0xca, 0xde, 0xa9, 0x9a, 0x2f, 0xe4, 0x21, 0xab, 0xed, 0x3a, 0xdb, 0xe8, 0x3b, 0xc2, 0x93, 0x4f, + 0xae, 0x33, 0x60, 0xfc, 0x44, 0x40, 0x72, 0x1c, 0x72, 0x8e, 0x79, 0x11, 0x7b, 0x72, 0xa0, 0x2f, 0x2e, 0x1c, 0x5a, 0xb7, 0xdb, 0x20, 0x1f, 0x18, 0x1c, 0xde, 0xbb, 0x6b, 0xeb, 0x68, 0xad, 0x96, - 0xb9, 0x6b, 0x38, 0x15, 0x6f, 0x09, 0x3a, 0x48, 0x40, 0x9f, 0xce, 0x88, 0x4c, 0x66, 0x05, 0x18, - 0x4c, 0x06, 0xd9, 0xa5, 0x21, 0x9a, 0xd2, 0x3c, 0xdc, 0x52, 0x5c, 0x5f, 0x6f, 0x36, 0x6a, 0x0f, - 0x96, 0xab, 0x81, 0xe1, 0xd9, 0xac, 0x54, 0x9b, 0x8d, 0x95, 0x72, 0xb3, 0xb4, 0xa1, 0x92, 0x75, - 0xc2, 0x62, 0xa9, 0x54, 0xdb, 0xa8, 0x36, 0x0a, 0x18, 0xbd, 0x49, 0x82, 0x99, 0x52, 0xc7, 0xb4, - 0x7d, 0x84, 0xaf, 0x0f, 0x10, 0xf6, 0xc5, 0x98, 0x09, 0x89, 0x11, 0xfd, 0x5b, 0x46, 0xd4, 0xe9, - 0xc0, 0x13, 0x48, 0x88, 0x7c, 0x44, 0x2f, 0xf5, 0xcb, 0x42, 0x4e, 0x07, 0x83, 0xe9, 0xa5, 0xdf, - 0x24, 0x3e, 0x75, 0x2f, 0x4c, 0x14, 0xa9, 0x62, 0xa0, 0xbf, 0xce, 0x40, 0xbe, 0x64, 0x1a, 0x9b, - 0xfa, 0x96, 0x6b, 0xcc, 0x61, 0x43, 0xbb, 0xd4, 0xc1, 0x8b, 0x9a, 0xa3, 0xed, 0xe9, 0xf8, 0x0a, - 0xa9, 0xc0, 0xa4, 0xda, 0x93, 0xea, 0x32, 0xc5, 0x52, 0xf0, 0xa5, 0xdd, 0x2d, 0xc2, 0xd4, 0xa4, - 0x1a, 0x4e, 0x52, 0x9e, 0x0d, 0x57, 0xd3, 0xd7, 0x75, 0x0b, 0x5b, 0xb8, 0x83, 0x35, 0x1b, 0xbb, - 0xd3, 0x22, 0x03, 0x77, 0x88, 0xd2, 0x4e, 0xaa, 0x51, 0x9f, 0x95, 0xf3, 0x30, 0x43, 0x3f, 0x11, - 0x53, 0xc4, 0x26, 0x6a, 0x3c, 0xa9, 0x72, 0x69, 0xca, 0xd3, 0x20, 0x87, 0x1f, 0x71, 0x2c, 0xed, - 0x4c, 0x9b, 0xe0, 0x75, 0xf5, 0x3c, 0xf5, 0x3a, 0x9c, 0xf7, 0xbc, 0x0e, 0xe7, 0xeb, 0xc4, 0x27, - 0x51, 0xa5, 0xb9, 0xd0, 0x47, 0x26, 0x7d, 0x43, 0xe2, 0x4d, 0x72, 0xa0, 0x18, 0x0a, 0x64, 0x0d, - 0x6d, 0x07, 0x33, 0xbd, 0x20, 0xcf, 0xca, 0x2d, 0x70, 0x5c, 0xdb, 0xd3, 0x1c, 0xcd, 0x5a, 0x35, - 0x5b, 0x5a, 0x87, 0x0c, 0x7e, 0x5e, 0xcb, 0xef, 0xfd, 0x40, 0x76, 0x84, 0x1c, 0xd3, 0xc2, 0x24, - 0x97, 0xb7, 0x23, 0xe4, 0x25, 0xb8, 0xd4, 0xf5, 0x96, 0x69, 0x10, 0xfe, 0x65, 0x95, 0x3c, 0xbb, - 0x52, 0x69, 0xeb, 0xb6, 0x5b, 0x11, 0x42, 0xa5, 0x4a, 0xb7, 0x36, 0xea, 0xfb, 0x46, 0x8b, 0xec, + 0xb9, 0x6b, 0x38, 0x15, 0x6f, 0x09, 0x3a, 0x48, 0x40, 0x9f, 0xcb, 0x88, 0x4c, 0x66, 0x05, 0x18, + 0x4c, 0x06, 0xd9, 0x85, 0x21, 0x9a, 0xd2, 0x3c, 0xdc, 0x54, 0x5c, 0x5f, 0x6f, 0x36, 0x6a, 0x0f, + 0x94, 0xab, 0x81, 0xe1, 0xd9, 0xac, 0x54, 0x9b, 0x8d, 0x95, 0x72, 0xb3, 0xb4, 0xa1, 0x92, 0x75, + 0xc2, 0x62, 0xa9, 0x54, 0xdb, 0xa8, 0x36, 0x0a, 0x18, 0xbd, 0x41, 0x82, 0x99, 0x52, 0xc7, 0xb4, + 0x7d, 0x84, 0xaf, 0x0d, 0x10, 0xf6, 0xc5, 0x98, 0x09, 0x89, 0x11, 0xfd, 0x5b, 0x46, 0xd4, 0xe9, + 0xc0, 0x13, 0x48, 0x88, 0x7c, 0x44, 0x2f, 0xf5, 0x5a, 0x21, 0xa7, 0x83, 0xc1, 0xf4, 0xd2, 0x6f, + 0x12, 0x9f, 0xbd, 0x07, 0x26, 0x8a, 0x54, 0x31, 0xd0, 0x5f, 0x67, 0x20, 0x5f, 0x32, 0x8d, 0x4d, + 0x7d, 0xcb, 0x35, 0xe6, 0xb0, 0xa1, 0x5d, 0xe8, 0xe0, 0x45, 0xcd, 0xd1, 0xf6, 0x74, 0x7c, 0x89, + 0x54, 0x60, 0x52, 0xed, 0x49, 0x75, 0x99, 0x62, 0x29, 0xf8, 0xc2, 0xee, 0x16, 0x61, 0x6a, 0x52, + 0x0d, 0x27, 0x29, 0xcf, 0x80, 0x2b, 0xe9, 0xeb, 0xba, 0x85, 0x2d, 0xdc, 0xc1, 0x9a, 0x8d, 0xdd, + 0x69, 0x91, 0x81, 0x3b, 0x44, 0x69, 0x27, 0xd5, 0xa8, 0xcf, 0xca, 0x59, 0x98, 0xa1, 0x9f, 0x88, + 0x29, 0x62, 0x13, 0x35, 0x9e, 0x54, 0xb9, 0x34, 0xe5, 0x29, 0x90, 0xc3, 0x0f, 0x3b, 0x96, 0x76, + 0xaa, 0x4d, 0xf0, 0xba, 0x72, 0x9e, 0x7a, 0x1d, 0xce, 0x7b, 0x5e, 0x87, 0xf3, 0x75, 0xe2, 0x93, + 0xa8, 0xd2, 0x5c, 0xe8, 0xa3, 0x93, 0xbe, 0x21, 0xf1, 0x06, 0x39, 0x50, 0x0c, 0x05, 0xb2, 0x86, + 0xb6, 0x83, 0x99, 0x5e, 0x90, 0x67, 0xe5, 0x26, 0x38, 0xaa, 0xed, 0x69, 0x8e, 0x66, 0xad, 0x9a, + 0x2d, 0xad, 0x43, 0x06, 0x3f, 0xaf, 0xe5, 0xf7, 0x7e, 0x20, 0x3b, 0x42, 0x8e, 0x69, 0x61, 0x92, + 0xcb, 0xdb, 0x11, 0xf2, 0x12, 0x5c, 0xea, 0x7a, 0xcb, 0x34, 0x08, 0xff, 0xb2, 0x4a, 0x9e, 0x5d, + 0xa9, 0xb4, 0x75, 0xdb, 0xad, 0x08, 0xa1, 0x52, 0xa5, 0x5b, 0x1b, 0xf5, 0xcb, 0x46, 0x8b, 0xec, 0x06, 0x4d, 0xaa, 0x51, 0x9f, 0x95, 0x05, 0x98, 0x66, 0x1b, 0x21, 0x6b, 0xae, 0x5e, 0xe5, 0x89, - 0x5e, 0x9d, 0xe3, 0x7d, 0xba, 0x28, 0x9e, 0xf3, 0xd5, 0x20, 0x9f, 0x1a, 0xfe, 0x49, 0xb9, 0x1f, - 0xae, 0x65, 0xaf, 0xa5, 0x5d, 0xdb, 0x31, 0x77, 0x28, 0xe8, 0x4b, 0x7a, 0x87, 0xd6, 0x60, 0x82, - 0xd4, 0x20, 0x2e, 0x8b, 0x72, 0x07, 0x9c, 0xec, 0x5a, 0x78, 0x13, 0x5b, 0x0f, 0x69, 0x3b, 0xbb, - 0x8f, 0x34, 0x2c, 0xcd, 0xb0, 0xbb, 0xa6, 0xe5, 0x9c, 0x99, 0x24, 0xcc, 0xf7, 0xfd, 0xa6, 0xdc, - 0x0a, 0x27, 0x1e, 0xb6, 0x4d, 0xa3, 0xd8, 0xd5, 0x57, 0x75, 0xdb, 0xc1, 0x46, 0xb1, 0xdd, 0xb6, - 0xce, 0x4c, 0x91, 0xb2, 0x0e, 0x7e, 0x60, 0xdd, 0xea, 0x24, 0xe4, 0xa9, 0xb0, 0xd1, 0x4b, 0x73, - 0xc2, 0xce, 0x9f, 0xac, 0xfa, 0xb1, 0xc6, 0xdc, 0xed, 0x30, 0xc1, 0xfa, 0x43, 0x02, 0xeb, 0xf4, - 0x1d, 0xa7, 0x7b, 0x56, 0x21, 0x18, 0x15, 0xd5, 0xcb, 0xa6, 0x3c, 0x03, 0xf2, 0x2d, 0x22, 0x04, - 0x82, 0xf0, 0xf4, 0x1d, 0xd7, 0xf6, 0x2f, 0x94, 0x64, 0x51, 0x59, 0x56, 0xf4, 0x17, 0xb2, 0x90, - 0xbf, 0x68, 0x1c, 0xc7, 0xc9, 0xfa, 0x80, 0x2f, 0x49, 0x43, 0x74, 0xb2, 0xb7, 0xc2, 0xcd, 0xac, + 0x5e, 0x9d, 0xe1, 0x7d, 0xba, 0x28, 0x9e, 0xf3, 0xd5, 0x20, 0x9f, 0x1a, 0xfe, 0x49, 0xb9, 0x0f, + 0xae, 0x66, 0xaf, 0xa5, 0x5d, 0xdb, 0x31, 0x77, 0x28, 0xe8, 0x4b, 0x7a, 0x87, 0xd6, 0x60, 0x82, + 0xd4, 0x20, 0x2e, 0x8b, 0x72, 0x3b, 0x1c, 0xef, 0x5a, 0x78, 0x13, 0x5b, 0x0f, 0x6a, 0x3b, 0xbb, + 0x0f, 0x37, 0x2c, 0xcd, 0xb0, 0xbb, 0xa6, 0xe5, 0x9c, 0x9a, 0x24, 0xcc, 0xf7, 0xfd, 0xa6, 0xdc, + 0x0c, 0xc7, 0x1e, 0xb2, 0x4d, 0xa3, 0xd8, 0xd5, 0x57, 0x75, 0xdb, 0xc1, 0x46, 0xb1, 0xdd, 0xb6, + 0x4e, 0x4d, 0x91, 0xb2, 0xf6, 0x7f, 0x60, 0xdd, 0xea, 0x24, 0xe4, 0xa9, 0xb0, 0xd1, 0x8b, 0x72, + 0xc2, 0xce, 0x9f, 0xac, 0xfa, 0xb1, 0xc6, 0xdc, 0xad, 0x30, 0xc1, 0xfa, 0x43, 0x02, 0xeb, 0xf4, + 0xed, 0x27, 0x7b, 0x56, 0x21, 0x18, 0x15, 0xd5, 0xcb, 0xa6, 0x3c, 0x15, 0xf2, 0x2d, 0x22, 0x04, + 0x82, 0xf0, 0xf4, 0xed, 0x57, 0xf7, 0x2f, 0x94, 0x64, 0x51, 0x59, 0x56, 0xf4, 0x17, 0xb2, 0x90, + 0xbf, 0x68, 0x1c, 0xc7, 0xc9, 0xfa, 0x80, 0xaf, 0x4a, 0x43, 0x74, 0xb2, 0x37, 0xc3, 0x8d, 0xac, 0x07, 0x65, 0xd6, 0xca, 0x62, 0x73, 0x61, 0xc3, 0x9b, 0x3a, 0xba, 0x36, 0x4c, 0xbd, 0x51, 0x54, - 0xdd, 0x79, 0xff, 0xa2, 0x3b, 0xe5, 0xbc, 0x05, 0x6e, 0x1a, 0x90, 0xbb, 0xdc, 0x68, 0x56, 0x8b, + 0xdd, 0x79, 0xff, 0xa2, 0x3b, 0xe5, 0xbc, 0x09, 0x6e, 0x18, 0x90, 0xbb, 0xdc, 0x68, 0x56, 0x8b, 0x6b, 0xe5, 0xc2, 0x26, 0x6f, 0x09, 0xd5, 0x1b, 0xb5, 0xf5, 0xa6, 0xba, 0x51, 0xad, 0x56, 0xaa, - 0xcb, 0x94, 0x98, 0x6b, 0x40, 0x9e, 0x0e, 0x32, 0x5c, 0x54, 0x2b, 0x8d, 0x72, 0xb3, 0x54, 0xab, - 0x2e, 0x55, 0x96, 0x0b, 0xfa, 0x20, 0x33, 0xea, 0x61, 0xe5, 0x1c, 0x5c, 0xc7, 0x71, 0x52, 0xa9, - 0x55, 0xdd, 0x79, 0x70, 0xa9, 0x58, 0x2d, 0x95, 0xdd, 0x49, 0xef, 0x65, 0x05, 0xc1, 0x29, 0x4a, - 0xae, 0xb9, 0x54, 0x59, 0x0d, 0x6f, 0x5d, 0x7d, 0x38, 0xa3, 0x9c, 0x81, 0xab, 0xc2, 0xdf, 0x2a, - 0xd5, 0x0b, 0xc5, 0xd5, 0xca, 0x62, 0xe1, 0x0f, 0x32, 0xca, 0x8d, 0x70, 0x3d, 0xf7, 0x17, 0xdd, - 0x85, 0x6a, 0x56, 0x16, 0x9b, 0x6b, 0x95, 0xfa, 0x5a, 0xb1, 0x51, 0x5a, 0x29, 0x7c, 0x84, 0xcc, - 0x2e, 0x7c, 0x73, 0x39, 0xe4, 0xc4, 0xf9, 0x8a, 0xb0, 0x05, 0x50, 0xe4, 0x15, 0xf5, 0xa9, 0x7d, - 0x61, 0x8f, 0xb7, 0x78, 0x3f, 0xe8, 0x8f, 0x25, 0x8b, 0x9c, 0x0a, 0xdd, 0x9e, 0x80, 0x56, 0x32, - 0x1d, 0x6a, 0x0c, 0xa1, 0x42, 0xe7, 0xe0, 0xba, 0x6a, 0x99, 0x22, 0xa5, 0x96, 0x4b, 0xb5, 0x0b, - 0x65, 0xb5, 0x79, 0xb1, 0xb8, 0xba, 0x5a, 0x6e, 0x34, 0x97, 0x2a, 0x6a, 0xbd, 0x51, 0xd8, 0x44, - 0xff, 0x2c, 0xf9, 0x6b, 0x3f, 0x21, 0x69, 0xfd, 0xb5, 0x94, 0xb4, 0x59, 0xc7, 0xae, 0xf1, 0x7c, - 0x17, 0xe4, 0x6d, 0x47, 0x73, 0x76, 0x6d, 0xd6, 0xaa, 0x9f, 0xd4, 0xbf, 0x55, 0xcf, 0xd7, 0x49, + 0xcb, 0x94, 0x98, 0x6b, 0x40, 0x9e, 0x0c, 0x32, 0x9c, 0x57, 0x2b, 0x8d, 0x72, 0xb3, 0x54, 0xab, + 0x2e, 0x55, 0x96, 0x0b, 0xfa, 0x20, 0x33, 0xea, 0x21, 0xe5, 0x0c, 0x5c, 0xc3, 0x71, 0x52, 0xa9, + 0x55, 0xdd, 0x79, 0x70, 0xa9, 0x58, 0x2d, 0x95, 0xdd, 0x49, 0xef, 0x45, 0x05, 0xc1, 0x09, 0x4a, + 0xae, 0xb9, 0x54, 0x59, 0x0d, 0x6f, 0x5d, 0x7d, 0x24, 0xa3, 0x9c, 0x82, 0x2b, 0xc2, 0xdf, 0x2a, + 0xd5, 0x73, 0xc5, 0xd5, 0xca, 0x62, 0xe1, 0x8f, 0x32, 0xca, 0xf5, 0x70, 0x2d, 0xf7, 0x17, 0xdd, + 0x85, 0x6a, 0x56, 0x16, 0x9b, 0x6b, 0x95, 0xfa, 0x5a, 0xb1, 0x51, 0x5a, 0x29, 0x7c, 0x94, 0xcc, + 0x2e, 0x7c, 0x73, 0x39, 0xe4, 0xc4, 0xf9, 0x92, 0xb0, 0x05, 0x50, 0xe4, 0x15, 0xf5, 0xc9, 0x7d, + 0x61, 0x8f, 0xb7, 0x78, 0x3f, 0xe4, 0x8f, 0x25, 0x8b, 0x9c, 0x0a, 0xdd, 0x9a, 0x80, 0x56, 0x32, + 0x1d, 0x6a, 0x0c, 0xa1, 0x42, 0x67, 0xe0, 0x9a, 0x6a, 0x99, 0x22, 0xa5, 0x96, 0x4b, 0xb5, 0x73, + 0x65, 0xb5, 0x79, 0xbe, 0xb8, 0xba, 0x5a, 0x6e, 0x34, 0x97, 0x2a, 0x6a, 0xbd, 0x51, 0xd8, 0x44, + 0xff, 0x2c, 0xf9, 0x6b, 0x3f, 0x21, 0x69, 0xfd, 0xb5, 0x94, 0xb4, 0x59, 0xc7, 0xae, 0xf1, 0xfc, + 0x00, 0xe4, 0x6d, 0x47, 0x73, 0x76, 0x6d, 0xd6, 0xaa, 0x9f, 0xd0, 0xbf, 0x55, 0xcf, 0xd7, 0x49, 0x26, 0x95, 0x65, 0x46, 0x7f, 0x91, 0x49, 0xd2, 0x4c, 0x47, 0xb0, 0xfc, 0xa3, 0x0f, 0x21, 0xe2, - 0xb3, 0x80, 0x3c, 0x6d, 0xaf, 0xd4, 0x9b, 0xc5, 0x55, 0xb5, 0x5c, 0x5c, 0x7c, 0xc8, 0x5f, 0xf4, - 0xc1, 0xca, 0x29, 0x38, 0xb1, 0x51, 0x2d, 0x2e, 0xac, 0x96, 0x49, 0x73, 0xa9, 0x55, 0xab, 0xe5, - 0x92, 0x2b, 0xf7, 0x1f, 0x26, 0x5b, 0x2c, 0xae, 0xbd, 0x4d, 0xf8, 0x76, 0x6d, 0xa2, 0x90, 0xfc, - 0xbf, 0x28, 0xec, 0x89, 0x14, 0x68, 0x58, 0x98, 0xd6, 0x68, 0x71, 0xf8, 0xb4, 0x90, 0xf3, 0x91, - 0x10, 0x27, 0xc9, 0xf0, 0xf8, 0xcf, 0x43, 0xe0, 0x71, 0x0a, 0x4e, 0x84, 0xf1, 0x20, 0x4e, 0x48, - 0xd1, 0x30, 0xbc, 0x74, 0x0a, 0xf2, 0x75, 0xdc, 0xc1, 0x2d, 0x07, 0x3d, 0x2e, 0x05, 0xa6, 0xc7, + 0xd3, 0x80, 0x3c, 0x6d, 0xaf, 0xd4, 0x9b, 0xc5, 0x55, 0xb5, 0x5c, 0x5c, 0x7c, 0xd0, 0x5f, 0xf4, + 0xc1, 0xca, 0x09, 0x38, 0xb6, 0x51, 0x2d, 0x2e, 0xac, 0x96, 0x49, 0x73, 0xa9, 0x55, 0xab, 0xe5, + 0x92, 0x2b, 0xf7, 0x9f, 0x24, 0x5b, 0x2c, 0xae, 0xbd, 0x4d, 0xf8, 0x76, 0x6d, 0xa2, 0x90, 0xfc, + 0xbf, 0x22, 0xec, 0x89, 0x14, 0x68, 0x58, 0x98, 0xd6, 0x68, 0x71, 0xf8, 0x9c, 0x90, 0xf3, 0x91, + 0x10, 0x27, 0xc9, 0xf0, 0xf8, 0xcf, 0x43, 0xe0, 0x71, 0x02, 0x8e, 0x85, 0xf1, 0x20, 0x4e, 0x48, + 0xd1, 0x30, 0xbc, 0x68, 0x0a, 0xf2, 0x75, 0xdc, 0xc1, 0x2d, 0x07, 0x3d, 0x26, 0x05, 0xa6, 0xc7, 0x1c, 0x48, 0xbe, 0xd3, 0x8b, 0xa4, 0xb7, 0xb9, 0xc9, 0xb6, 0xd4, 0x33, 0xd9, 0x8e, 0x31, 0x1a, 0xe4, 0x44, 0x46, 0x43, 0x36, 0x05, 0xa3, 0x21, 0x37, 0xbc, 0xd1, 0x90, 0x4f, 0x6a, 0x34, 0x4c, - 0xc4, 0x1a, 0x0d, 0xe8, 0x0d, 0xf9, 0xa4, 0x7d, 0x0a, 0x05, 0xe6, 0x68, 0x4d, 0x85, 0xff, 0x95, - 0x4d, 0xd2, 0x07, 0xf5, 0xe5, 0x38, 0x99, 0xce, 0x7f, 0x53, 0x4e, 0x61, 0x69, 0x43, 0xb9, 0x01, - 0xae, 0x0f, 0xde, 0x9b, 0xe5, 0xe7, 0x56, 0xea, 0x8d, 0x3a, 0xb1, 0x0f, 0x4a, 0x35, 0x55, 0xdd, - 0x58, 0xa7, 0xeb, 0xd3, 0xa7, 0x41, 0x09, 0xa8, 0xa8, 0x1b, 0x55, 0x6a, 0x0d, 0x6c, 0xf1, 0xd4, + 0xc4, 0x1a, 0x0d, 0xe8, 0x35, 0xf9, 0xa4, 0x7d, 0x0a, 0x05, 0xe6, 0x70, 0x4d, 0x85, 0xff, 0x95, + 0x4d, 0xd2, 0x07, 0xf5, 0xe5, 0x38, 0x99, 0xce, 0x7f, 0x47, 0x4e, 0x61, 0x69, 0x43, 0xb9, 0x0e, + 0xae, 0x0d, 0xde, 0x9b, 0xe5, 0x67, 0x55, 0xea, 0x8d, 0x3a, 0xb1, 0x0f, 0x4a, 0x35, 0x55, 0xdd, + 0x58, 0xa7, 0xeb, 0xd3, 0x27, 0x41, 0x09, 0xa8, 0xa8, 0x1b, 0x55, 0x6a, 0x0d, 0x6c, 0xf1, 0xd4, 0x97, 0x2a, 0xd5, 0xc5, 0xa6, 0xdf, 0xc2, 0xaa, 0x4b, 0xb5, 0xc2, 0xb6, 0x3b, 0x1d, 0x0c, 0x51, 0x77, 0x87, 0x73, 0x56, 0x42, 0xb1, 0xba, 0xd8, 0x5c, 0xab, 0x96, 0xd7, 0x6a, 0xd5, 0x4a, 0x89, 0xa4, 0xd7, 0xcb, 0x8d, 0x82, 0xee, 0x0e, 0x4b, 0x3d, 0xf6, 0x47, 0xbd, 0x5c, 0x54, 0x4b, 0x2b, - 0x65, 0x95, 0x16, 0xf9, 0xb0, 0x72, 0x13, 0x9c, 0x2f, 0x56, 0x6b, 0x0d, 0x37, 0xa5, 0x58, 0x7d, - 0xa8, 0xf1, 0xd0, 0x7a, 0xb9, 0xb9, 0xae, 0xd6, 0x4a, 0xe5, 0x7a, 0xdd, 0x6d, 0xd5, 0xcc, 0x5a, - 0x29, 0x74, 0x94, 0x7b, 0xe1, 0xae, 0x10, 0x6b, 0xe5, 0x06, 0xd9, 0x0c, 0x5d, 0xab, 0x11, 0x7f, + 0x65, 0x95, 0x16, 0xf9, 0x90, 0x72, 0x03, 0x9c, 0x2d, 0x56, 0x6b, 0x0d, 0x37, 0xa5, 0x58, 0x7d, + 0xb0, 0xf1, 0xe0, 0x7a, 0xb9, 0xb9, 0xae, 0xd6, 0x4a, 0xe5, 0x7a, 0xdd, 0x6d, 0xd5, 0xcc, 0x5a, + 0x29, 0x74, 0x94, 0x7b, 0xe0, 0xce, 0x10, 0x6b, 0xe5, 0x06, 0xd9, 0x0c, 0x5d, 0xab, 0x11, 0x7f, 0x98, 0xc5, 0x72, 0x73, 0xa5, 0x58, 0x6f, 0x56, 0xaa, 0xa5, 0xda, 0xda, 0x7a, 0xb1, 0x51, 0x71, - 0x1b, 0xff, 0xba, 0x5a, 0x6b, 0xd4, 0x9a, 0x17, 0xca, 0x6a, 0xbd, 0x52, 0xab, 0x16, 0x0c, 0xb7, - 0xca, 0xa1, 0xde, 0xc2, 0xeb, 0xb5, 0x4d, 0xe5, 0x3a, 0x38, 0xe3, 0xa5, 0xaf, 0xd6, 0x5c, 0x41, - 0x87, 0xec, 0x97, 0x6e, 0xaa, 0xf6, 0xcb, 0xbf, 0x4a, 0x90, 0xad, 0x3b, 0x66, 0x17, 0x7d, 0x67, - 0xd0, 0x1d, 0x9d, 0x05, 0xb0, 0xc8, 0xde, 0xa6, 0x3b, 0xc3, 0x63, 0x73, 0xbe, 0x50, 0x0a, 0xfa, - 0x7d, 0xe1, 0x0d, 0x99, 0xa0, 0x87, 0x37, 0xbb, 0x11, 0x96, 0xcd, 0xd7, 0xc5, 0x4e, 0xa8, 0x44, - 0x13, 0x4a, 0xa6, 0xef, 0x3f, 0x36, 0xcc, 0x96, 0x0b, 0x82, 0xd3, 0x21, 0xd8, 0x5c, 0xf9, 0x7b, - 0x2a, 0x81, 0x95, 0xab, 0xe1, 0xaa, 0x1e, 0xe5, 0x22, 0x3a, 0xb5, 0xa9, 0x7c, 0x07, 0x3c, 0x29, - 0xa4, 0xde, 0xe5, 0xb5, 0xda, 0x85, 0xb2, 0xaf, 0xc8, 0x8b, 0xc5, 0x46, 0xb1, 0xb0, 0x85, 0x3e, - 0x21, 0x43, 0x76, 0xcd, 0xdc, 0xeb, 0xdd, 0x07, 0x33, 0xf0, 0x95, 0xd0, 0x3a, 0xab, 0xf7, 0xca, - 0x7b, 0xe4, 0x0b, 0x89, 0x7d, 0x2d, 0x7a, 0xcf, 0xfb, 0xd3, 0x52, 0x12, 0xb1, 0xaf, 0x1d, 0x76, - 0xa3, 0xfb, 0xef, 0x87, 0x11, 0x7b, 0x84, 0x68, 0xb1, 0x72, 0x1e, 0xce, 0x06, 0x1f, 0x2a, 0x8b, - 0xe5, 0x6a, 0xa3, 0xb2, 0xf4, 0x50, 0x20, 0xdc, 0x8a, 0x2a, 0x24, 0xfe, 0x41, 0xdd, 0x58, 0xfc, - 0xbc, 0xe4, 0x0c, 0x9c, 0x0c, 0xbe, 0x2d, 0x97, 0x1b, 0xde, 0x97, 0x87, 0xd1, 0xa3, 0x39, 0x98, - 0xa1, 0xdd, 0xfa, 0x46, 0xb7, 0xad, 0x39, 0x18, 0x3d, 0x23, 0x40, 0xf7, 0x66, 0x38, 0x5e, 0x59, - 0x5f, 0xaa, 0xd7, 0x1d, 0xd3, 0xd2, 0xb6, 0x30, 0x19, 0xc7, 0xa8, 0xb4, 0x7a, 0x93, 0xd1, 0x3b, - 0x84, 0xd7, 0x10, 0xf9, 0xa1, 0x84, 0x96, 0x19, 0x81, 0xfa, 0x67, 0x85, 0xd6, 0xfc, 0x04, 0x08, - 0x26, 0x43, 0xff, 0xe1, 0x11, 0xb7, 0xb9, 0x68, 0x5c, 0x36, 0xcf, 0xbf, 0x50, 0x82, 0xa9, 0x86, - 0xbe, 0x83, 0x9f, 0x67, 0x1a, 0xd8, 0x56, 0x26, 0x40, 0x5e, 0x5e, 0x6b, 0x14, 0x8e, 0xb9, 0x0f, + 0x1b, 0xff, 0xba, 0x5a, 0x6b, 0xd4, 0x9a, 0xe7, 0xca, 0x6a, 0xbd, 0x52, 0xab, 0x16, 0x0c, 0xb7, + 0xca, 0xa1, 0xde, 0xc2, 0xeb, 0xb5, 0x4d, 0xe5, 0x1a, 0x38, 0xe5, 0xa5, 0xaf, 0xd6, 0x5c, 0x41, + 0x87, 0xec, 0x97, 0x6e, 0xaa, 0xf6, 0xcb, 0xbf, 0x4a, 0x90, 0xad, 0x3b, 0x66, 0x17, 0x7d, 0x7f, + 0xd0, 0x1d, 0x9d, 0x06, 0xb0, 0xc8, 0xde, 0xa6, 0x3b, 0xc3, 0x63, 0x73, 0xbe, 0x50, 0x0a, 0xfa, + 0x43, 0xe1, 0x0d, 0x99, 0xa0, 0x87, 0x37, 0xbb, 0x11, 0x96, 0xcd, 0xb7, 0xc4, 0x4e, 0xa8, 0x44, + 0x13, 0x4a, 0xa6, 0xef, 0x3f, 0x33, 0xcc, 0x96, 0x0b, 0x82, 0x93, 0x21, 0xd8, 0x5c, 0xf9, 0x7b, + 0x2a, 0x81, 0x95, 0x2b, 0xe1, 0x8a, 0x1e, 0xe5, 0x22, 0x3a, 0xb5, 0xa9, 0x7c, 0x1f, 0x3c, 0x21, + 0xa4, 0xde, 0xe5, 0xb5, 0xda, 0xb9, 0xb2, 0xaf, 0xc8, 0x8b, 0xc5, 0x46, 0xb1, 0xb0, 0x85, 0x3e, + 0x25, 0x43, 0x76, 0xcd, 0xdc, 0xeb, 0xdd, 0x07, 0x33, 0xf0, 0xa5, 0xd0, 0x3a, 0xab, 0xf7, 0xca, + 0x7b, 0xe4, 0x0b, 0x89, 0x7d, 0x2d, 0x7a, 0xcf, 0xfb, 0x73, 0x52, 0x12, 0xb1, 0xaf, 0x1d, 0x74, + 0xa3, 0xfb, 0xef, 0x87, 0x11, 0x7b, 0x84, 0x68, 0xb1, 0x72, 0x16, 0x4e, 0x07, 0x1f, 0x2a, 0x8b, + 0xe5, 0x6a, 0xa3, 0xb2, 0xf4, 0x60, 0x20, 0xdc, 0x8a, 0x2a, 0x24, 0xfe, 0x41, 0xdd, 0x58, 0xfc, + 0xbc, 0xe4, 0x14, 0x1c, 0x0f, 0xbe, 0x2d, 0x97, 0x1b, 0xde, 0x97, 0x87, 0xd0, 0x23, 0x39, 0x98, + 0xa1, 0xdd, 0xfa, 0x46, 0xb7, 0xad, 0x39, 0x18, 0x3d, 0x35, 0x40, 0xf7, 0x46, 0x38, 0x5a, 0x59, + 0x5f, 0xaa, 0xd7, 0x1d, 0xd3, 0xd2, 0xb6, 0x30, 0x19, 0xc7, 0xa8, 0xb4, 0x7a, 0x93, 0xd1, 0xdb, + 0x85, 0xd7, 0x10, 0xf9, 0xa1, 0x84, 0x96, 0x19, 0x81, 0xfa, 0x17, 0x84, 0xd6, 0xfc, 0x04, 0x08, + 0x26, 0x43, 0xff, 0xa1, 0x11, 0xb7, 0xb9, 0x68, 0x5c, 0x36, 0xcf, 0x3e, 0x4f, 0x82, 0xa9, 0x86, + 0xbe, 0x83, 0x9f, 0x6d, 0x1a, 0xd8, 0x56, 0x26, 0x40, 0x5e, 0x5e, 0x6b, 0x14, 0x8e, 0xb8, 0x0f, 0xae, 0x09, 0x96, 0x21, 0x0f, 0x65, 0xb7, 0x00, 0xf7, 0xa1, 0xd8, 0x28, 0xc8, 0xee, 0xc3, 0x5a, 0xb9, 0x51, 0xc8, 0xba, 0x0f, 0xd5, 0x72, 0xa3, 0x90, 0x73, 0x1f, 0xd6, 0x57, 0x1b, 0x85, 0xbc, - 0xfb, 0x50, 0xa9, 0x37, 0x0a, 0x13, 0xee, 0xc3, 0x42, 0xbd, 0x51, 0x98, 0x74, 0x1f, 0x2e, 0xd4, - 0x1b, 0x85, 0x29, 0xf7, 0xa1, 0xd4, 0x68, 0x14, 0xc0, 0x7d, 0x78, 0xa0, 0xde, 0x28, 0x4c, 0xbb, + 0xfb, 0x50, 0xa9, 0x37, 0x0a, 0x13, 0xee, 0xc3, 0x42, 0xbd, 0x51, 0x98, 0x74, 0x1f, 0xce, 0xd5, + 0x1b, 0x85, 0x29, 0xf7, 0xa1, 0xd4, 0x68, 0x14, 0xc0, 0x7d, 0xb8, 0xbf, 0xde, 0x28, 0x4c, 0xbb, 0x0f, 0xc5, 0x52, 0xa3, 0x30, 0x43, 0x1e, 0xca, 0x8d, 0xc2, 0xac, 0xfb, 0x50, 0xaf, 0x37, 0x0a, - 0x73, 0x84, 0x72, 0xbd, 0x51, 0x38, 0x4e, 0xca, 0xaa, 0x34, 0x0a, 0x05, 0xf7, 0x61, 0xa5, 0xde, - 0x28, 0x9c, 0x20, 0x99, 0xeb, 0x8d, 0x82, 0x42, 0x0a, 0xad, 0x37, 0x0a, 0x57, 0x91, 0x3c, 0xf5, - 0x46, 0xe1, 0x24, 0x29, 0xa2, 0xde, 0x28, 0x9c, 0x22, 0x6c, 0x94, 0x1b, 0x85, 0xd3, 0x24, 0x8f, - 0xda, 0x28, 0x5c, 0x4d, 0x3e, 0x55, 0x1b, 0x85, 0x33, 0x84, 0xb1, 0x72, 0xa3, 0x70, 0x0d, 0x79, - 0x50, 0x1b, 0x05, 0x44, 0x3e, 0x15, 0x1b, 0x85, 0x6b, 0xd1, 0x93, 0x60, 0x6a, 0x19, 0x3b, 0x14, - 0x44, 0x54, 0x00, 0x79, 0x19, 0x3b, 0x61, 0xa3, 0xff, 0xf3, 0x32, 0x5c, 0xcd, 0x26, 0x8a, 0x4b, - 0x96, 0xb9, 0xb3, 0x8a, 0xb7, 0xb4, 0xd6, 0x7e, 0xf9, 0x11, 0xd7, 0xe0, 0x0a, 0xef, 0xf9, 0x2a, - 0x90, 0xed, 0x06, 0x9d, 0x11, 0x79, 0x8e, 0xb5, 0x4f, 0xbd, 0x85, 0x2e, 0x39, 0x58, 0xe8, 0x62, - 0x16, 0xd9, 0x3f, 0x85, 0x35, 0x9a, 0x5b, 0x9b, 0xce, 0xf4, 0xac, 0x4d, 0xbb, 0xcd, 0xa4, 0x8b, - 0x2d, 0xdb, 0x34, 0xb4, 0x4e, 0x9d, 0x39, 0x05, 0xd0, 0x15, 0xb5, 0xde, 0x64, 0xe5, 0x7b, 0xbc, - 0x96, 0x41, 0xad, 0xb2, 0xe7, 0xc4, 0xcd, 0x87, 0x7b, 0xab, 0x19, 0xd1, 0x48, 0x3e, 0xe2, 0x37, - 0x92, 0x06, 0xd7, 0x48, 0xee, 0x3f, 0x04, 0xed, 0x64, 0xed, 0xa5, 0x32, 0xdc, 0x44, 0x24, 0x70, - 0x99, 0xf5, 0x96, 0xc2, 0x65, 0xf4, 0x09, 0x09, 0x4e, 0x97, 0x8d, 0x7e, 0xf3, 0x81, 0xb0, 0x2e, - 0xbc, 0x29, 0x0c, 0xcd, 0x3a, 0x2f, 0xd2, 0xbb, 0xfa, 0x56, 0xbb, 0x3f, 0xcd, 0x08, 0x89, 0x7e, - 0xd4, 0x97, 0x68, 0x9d, 0x93, 0xe8, 0x7d, 0xc3, 0x93, 0x4e, 0x26, 0xd0, 0xea, 0x48, 0x3b, 0xa0, - 0x2c, 0xfa, 0x82, 0x04, 0x27, 0xa8, 0x5f, 0xcf, 0x03, 0x74, 0xfa, 0x41, 0xba, 0x6c, 0xde, 0x84, - 0xea, 0x04, 0x53, 0x15, 0xaa, 0xdf, 0xa1, 0x14, 0xf4, 0xfa, 0xb0, 0xc0, 0x1f, 0xe4, 0x05, 0x1e, - 0xd1, 0x19, 0xf7, 0x16, 0x17, 0x21, 0xeb, 0x3f, 0xf0, 0x65, 0x5d, 0xe5, 0x64, 0x7d, 0xd7, 0x50, - 0x54, 0x8f, 0x56, 0xcc, 0x5f, 0xca, 0xc2, 0x93, 0x28, 0x87, 0x4c, 0x11, 0x68, 0x67, 0x56, 0x34, - 0xda, 0x2a, 0xb6, 0x1d, 0xcd, 0x72, 0xb8, 0x23, 0xed, 0x3d, 0xf3, 0xdb, 0x4c, 0x0a, 0xf3, 0x5b, - 0x69, 0xe0, 0xfc, 0x16, 0xbd, 0x3d, 0x6c, 0xa5, 0x5d, 0xe4, 0x91, 0x2d, 0xc6, 0x60, 0x10, 0x51, - 0xc3, 0xa8, 0x16, 0xe5, 0x9b, 0x6f, 0xdf, 0xcb, 0xa1, 0xbc, 0x74, 0xe8, 0x12, 0x92, 0x21, 0xfe, - 0xfb, 0xa3, 0x35, 0xa7, 0xb3, 0xe1, 0x6f, 0xbc, 0xed, 0x57, 0x68, 0xa7, 0x3a, 0x0f, 0x7a, 0xd9, - 0x24, 0x4c, 0x91, 0x2e, 0x67, 0x55, 0x37, 0x2e, 0xbb, 0x63, 0xe3, 0x4c, 0x15, 0x5f, 0x29, 0x6d, - 0x6b, 0x9d, 0x0e, 0x36, 0xb6, 0x30, 0x7a, 0x98, 0x33, 0xd0, 0xb5, 0x6e, 0xb7, 0x1a, 0x6c, 0x15, - 0x79, 0xaf, 0xca, 0x7d, 0x90, 0xb3, 0x5b, 0x66, 0x17, 0x13, 0x41, 0xcd, 0x85, 0x9c, 0x4b, 0xf8, - 0xe5, 0xae, 0xe2, 0xae, 0xb3, 0x3d, 0x4f, 0xca, 0x2a, 0x76, 0xf5, 0xba, 0xfb, 0x83, 0x4a, 0xff, - 0x63, 0xe3, 0xe4, 0x17, 0xfb, 0x76, 0xc6, 0x99, 0x98, 0xce, 0xd8, 0x67, 0x7c, 0x3e, 0xcc, 0x74, - 0xc4, 0x4a, 0xc6, 0x39, 0x98, 0x6e, 0x79, 0x59, 0xfc, 0xb3, 0x33, 0xe1, 0x24, 0xf4, 0xb7, 0x89, - 0xba, 0x6b, 0xa1, 0xc2, 0x93, 0x69, 0x15, 0x1e, 0xb1, 0xbd, 0x78, 0x0a, 0x4e, 0x34, 0x6a, 0xb5, - 0xe6, 0x5a, 0xb1, 0xfa, 0x50, 0x70, 0x66, 0x7d, 0x13, 0xbd, 0x2a, 0x0b, 0x73, 0x75, 0xb3, 0xb3, - 0x87, 0x03, 0x9c, 0x2b, 0x9c, 0x53, 0x56, 0x58, 0x4e, 0x99, 0x03, 0x72, 0x52, 0x4e, 0x43, 0x5e, - 0x33, 0xec, 0x2b, 0xd8, 0xb3, 0xe1, 0xd9, 0x1b, 0x83, 0xf1, 0x77, 0xc2, 0x1d, 0x81, 0xca, 0xc3, - 0x78, 0xf7, 0x00, 0x49, 0xf2, 0x5c, 0x45, 0x00, 0x79, 0x1e, 0x66, 0x6c, 0xba, 0x61, 0xdc, 0x08, - 0xf9, 0x05, 0x70, 0x69, 0x84, 0x45, 0xea, 0xb1, 0x20, 0x33, 0x16, 0xc9, 0x1b, 0x7a, 0x9d, 0xdf, - 0x7f, 0x6c, 0x70, 0x10, 0x17, 0x0f, 0xc3, 0x58, 0x32, 0x90, 0x5f, 0x33, 0xea, 0x99, 0xf8, 0x19, - 0x38, 0xc9, 0x9a, 0x7d, 0xb3, 0xb4, 0x52, 0x5c, 0x5d, 0x2d, 0x57, 0x97, 0xcb, 0xcd, 0xca, 0x22, - 0xdd, 0x80, 0x0a, 0x52, 0x8a, 0x8d, 0x46, 0x79, 0x6d, 0xbd, 0x51, 0x6f, 0x96, 0x9f, 0x5b, 0x2a, - 0x97, 0x17, 0x89, 0x5b, 0x24, 0x39, 0xd7, 0xe4, 0x39, 0xb0, 0x16, 0xab, 0xf5, 0x8b, 0x65, 0xb5, - 0xb0, 0x7d, 0xbe, 0x08, 0xd3, 0xa1, 0x81, 0xc2, 0xe5, 0x6e, 0x11, 0x6f, 0x6a, 0xbb, 0x1d, 0x66, - 0x53, 0x17, 0x8e, 0xb9, 0xdc, 0x11, 0xd9, 0xd4, 0x8c, 0xce, 0x7e, 0x21, 0xa3, 0x14, 0x60, 0x26, - 0x3c, 0x26, 0x14, 0x24, 0xf4, 0x96, 0xeb, 0x60, 0xea, 0xa2, 0x69, 0x5d, 0x26, 0xbe, 0x7c, 0xe8, - 0xdd, 0x34, 0xb6, 0x8d, 0x77, 0x4a, 0x38, 0x64, 0x80, 0xbd, 0x46, 0xdc, 0x63, 0xc4, 0xa3, 0x36, - 0x3f, 0xf0, 0x24, 0xf0, 0x39, 0x98, 0xbe, 0xe2, 0xe5, 0x0e, 0x5a, 0x7a, 0x28, 0x09, 0xfd, 0x77, - 0x31, 0x1f, 0x90, 0xc1, 0x45, 0xa6, 0xef, 0xa3, 0xf0, 0x66, 0x09, 0xf2, 0xcb, 0xd8, 0x29, 0x76, - 0x3a, 0x61, 0xb9, 0xbd, 0x52, 0xf8, 0x74, 0x17, 0x57, 0x89, 0x62, 0xa7, 0x13, 0xdd, 0xa8, 0x42, - 0x02, 0xf2, 0x4e, 0x21, 0x70, 0x69, 0x82, 0xbe, 0x93, 0x03, 0x0a, 0x4c, 0x5f, 0x62, 0xbf, 0x27, - 0xfb, 0x7e, 0x0e, 0x8f, 0x85, 0xcc, 0xa4, 0xa7, 0x07, 0x71, 0x8d, 0x32, 0xf1, 0xfe, 0x12, 0x5e, - 0x3e, 0xe5, 0x41, 0x98, 0xd8, 0xb5, 0x71, 0x49, 0xb3, 0xbd, 0xa1, 0x8d, 0xaf, 0x69, 0xed, 0xd2, - 0xc3, 0xb8, 0xe5, 0xcc, 0x57, 0x76, 0xdc, 0x89, 0xcf, 0x06, 0xcd, 0xe8, 0x87, 0x0a, 0x62, 0xef, - 0xaa, 0x47, 0xc1, 0x9d, 0x3c, 0x5e, 0xd1, 0x9d, 0xed, 0xd2, 0xb6, 0xe6, 0xb0, 0x1d, 0x0b, 0xff, - 0x1d, 0xbd, 0x74, 0x08, 0x38, 0x63, 0x77, 0xf8, 0x23, 0x0f, 0x89, 0x26, 0x06, 0x71, 0x04, 0xdb, - 0xf2, 0xc3, 0x80, 0xf8, 0x0f, 0x12, 0x64, 0x6b, 0x5d, 0x6c, 0x08, 0x9f, 0x88, 0xf2, 0x65, 0x2b, - 0xf5, 0xc8, 0xf6, 0x75, 0xe2, 0x1e, 0x82, 0x7e, 0xa5, 0xdd, 0x92, 0x23, 0x24, 0x7b, 0x1b, 0x64, - 0x75, 0x63, 0xd3, 0x64, 0x96, 0xed, 0xb5, 0x11, 0xb6, 0x4e, 0xc5, 0xd8, 0x34, 0x55, 0x92, 0x51, - 0xd4, 0x39, 0x30, 0xae, 0xec, 0xf4, 0xc5, 0xfd, 0xe5, 0x49, 0xc8, 0x53, 0x75, 0x46, 0xaf, 0x90, - 0x41, 0x2e, 0xb6, 0xdb, 0x11, 0x82, 0x97, 0x0e, 0x08, 0xde, 0x24, 0xbf, 0xf9, 0x98, 0xf8, 0xef, - 0x7c, 0x40, 0x1b, 0xc1, 0xbe, 0x9d, 0x35, 0xa9, 0x62, 0xbb, 0x1d, 0xed, 0x87, 0xec, 0x17, 0x28, - 0xf1, 0x05, 0x86, 0x5b, 0xb8, 0x2c, 0xd6, 0xc2, 0x13, 0x0f, 0x04, 0x91, 0xfc, 0xa5, 0x0f, 0xd1, - 0x3f, 0x49, 0x30, 0xb1, 0xaa, 0xdb, 0x8e, 0x8b, 0x4d, 0x51, 0x04, 0x9b, 0xeb, 0x60, 0xca, 0x13, - 0x8d, 0xdb, 0xe5, 0xb9, 0xfd, 0x79, 0x90, 0xc0, 0xcf, 0xc4, 0x1f, 0xe0, 0xd1, 0x79, 0x66, 0x7c, - 0xed, 0x19, 0x17, 0xd1, 0x27, 0x4d, 0x82, 0x62, 0xa5, 0xde, 0x62, 0x7f, 0xcd, 0x17, 0xf8, 0x1a, - 0x27, 0xf0, 0x3b, 0x87, 0x29, 0x32, 0x7d, 0xa1, 0x7f, 0x52, 0x02, 0x70, 0xcb, 0x66, 0xc7, 0xf9, - 0x9e, 0xc2, 0x1d, 0xd2, 0x8f, 0x91, 0xee, 0xab, 0xc2, 0xd2, 0x5d, 0xe3, 0xa5, 0xfb, 0xdd, 0x83, - 0xab, 0x1a, 0x77, 0x6c, 0x4f, 0x29, 0x80, 0xac, 0xfb, 0xa2, 0x75, 0x1f, 0xd1, 0x9b, 0x7d, 0xa1, - 0xae, 0x73, 0x42, 0xbd, 0x7b, 0xc8, 0x92, 0xd2, 0x97, 0xeb, 0x5f, 0x4a, 0x30, 0x51, 0xc7, 0x8e, - 0xdb, 0x4d, 0xa2, 0x0b, 0x22, 0x3d, 0x7c, 0xa8, 0x6d, 0x4b, 0x82, 0x6d, 0xfb, 0x6b, 0x19, 0xd1, - 0x60, 0x3f, 0x81, 0x64, 0x18, 0x4f, 0x11, 0xab, 0x0f, 0x8f, 0x09, 0x05, 0xfb, 0x19, 0x44, 0x2d, - 0x7d, 0xe9, 0xbe, 0x49, 0xf2, 0xdd, 0x2d, 0xf8, 0xd3, 0x36, 0x61, 0xb3, 0x38, 0x73, 0xd0, 0x2c, - 0x16, 0x3f, 0x6d, 0x13, 0xae, 0x63, 0xb4, 0xf7, 0x40, 0x62, 0x63, 0x63, 0x04, 0x1b, 0xfb, 0xc3, - 0xc8, 0xeb, 0x05, 0x32, 0xe4, 0xd9, 0x0e, 0xc0, 0x7d, 0xf1, 0x3b, 0x00, 0x83, 0xa7, 0x16, 0xef, - 0x1a, 0xc2, 0x94, 0x8b, 0x5b, 0x96, 0xf7, 0xd9, 0x90, 0x42, 0x6c, 0xdc, 0x0a, 0x39, 0x12, 0x8d, - 0x94, 0x8d, 0x73, 0x81, 0x4f, 0x86, 0x47, 0xa2, 0xec, 0x7e, 0x55, 0x69, 0xa6, 0xc4, 0x28, 0x8c, - 0x60, 0x25, 0x7f, 0x18, 0x14, 0xde, 0xa1, 0x00, 0xac, 0xef, 0x5e, 0xea, 0xe8, 0xf6, 0xb6, 0x6e, - 0x6c, 0xa1, 0x7f, 0xcf, 0xc0, 0x0c, 0x7b, 0xa5, 0x41, 0x35, 0x63, 0xcd, 0xbf, 0x48, 0xa3, 0xa0, - 0x00, 0xf2, 0xae, 0xa5, 0xb3, 0x65, 0x00, 0xf7, 0x51, 0xb9, 0xc7, 0x77, 0xcf, 0xca, 0xf6, 0x84, - 0x53, 0x70, 0xc5, 0x10, 0x70, 0x30, 0x1f, 0x2a, 0x3d, 0x70, 0xd3, 0x0a, 0x47, 0x4e, 0xcd, 0xf1, - 0x91, 0x53, 0xb9, 0x33, 0x96, 0xf9, 0x9e, 0x33, 0x96, 0x2e, 0x8e, 0xb6, 0xfe, 0x3c, 0x4c, 0xfc, - 0x77, 0x64, 0x95, 0x3c, 0xbb, 0x7f, 0x3c, 0x6c, 0xea, 0x06, 0xd9, 0xd4, 0x61, 0xee, 0xc3, 0x41, - 0x02, 0x7a, 0x5f, 0x30, 0x91, 0x31, 0x05, 0xad, 0xe0, 0x04, 0x62, 0xe0, 0xca, 0xce, 0xf6, 0x96, - 0xfd, 0x01, 0xe1, 0x48, 0x69, 0x21, 0x81, 0xc5, 0x4e, 0x49, 0x18, 0x07, 0x92, 0xcf, 0x41, 0x68, - 0x57, 0x36, 0xae, 0x3b, 0x1d, 0x44, 0x3f, 0x99, 0x62, 0xee, 0x0c, 0xb1, 0xf8, 0xa2, 0xc0, 0x9c, - 0x77, 0xf2, 0xb4, 0xb6, 0xf0, 0x40, 0xb9, 0xd4, 0x28, 0xe0, 0x83, 0xa7, 0x51, 0xc9, 0xb9, 0x53, - 0x7a, 0xc6, 0x34, 0x58, 0x60, 0x41, 0xff, 0x53, 0x82, 0x3c, 0xb3, 0x1d, 0xee, 0x3b, 0x24, 0x84, - 0xe8, 0xd5, 0xc3, 0x40, 0x12, 0x1b, 0x00, 0xe0, 0x8f, 0x92, 0x02, 0x30, 0x02, 0x6b, 0xe1, 0xa1, - 0xd4, 0x00, 0x40, 0xff, 0x22, 0x41, 0xd6, 0xb5, 0x69, 0xc4, 0x8e, 0x57, 0x7f, 0x44, 0xd8, 0x55, - 0x39, 0x24, 0x00, 0x97, 0x7c, 0x84, 0x7e, 0x2f, 0xc0, 0x54, 0x97, 0x66, 0xf4, 0x0f, 0xf7, 0xdf, - 0x28, 0xd0, 0xb3, 0x60, 0x35, 0xf8, 0x0d, 0xbd, 0x53, 0xc8, 0xdd, 0x39, 0x9e, 0x9f, 0x64, 0x70, - 0x94, 0x47, 0x71, 0x12, 0x7b, 0x13, 0x7d, 0x43, 0x02, 0x50, 0xb1, 0x6d, 0x76, 0xf6, 0xf0, 0x86, - 0xa5, 0xa3, 0x6b, 0x03, 0x00, 0x58, 0xb3, 0xcf, 0x04, 0xcd, 0xfe, 0x63, 0x61, 0xc1, 0x2f, 0xf3, - 0x82, 0x7f, 0x7a, 0xb4, 0xe6, 0x79, 0xc4, 0x23, 0xc4, 0x7f, 0x2f, 0x4c, 0x30, 0x39, 0x32, 0x03, - 0x51, 0x4c, 0xf8, 0xde, 0x4f, 0xe8, 0x3d, 0xbe, 0xe8, 0x1f, 0xe0, 0x44, 0xff, 0xac, 0xc4, 0x1c, - 0x25, 0x03, 0xa0, 0x34, 0x04, 0x00, 0xc7, 0x61, 0xda, 0x03, 0x60, 0x43, 0xad, 0x14, 0x30, 0x7a, - 0x9b, 0x4c, 0x7c, 0x1e, 0xe8, 0x48, 0x75, 0xf8, 0x9e, 0xe6, 0x0b, 0xc2, 0x33, 0xf7, 0x90, 0x3c, - 0xfc, 0xf2, 0x53, 0x02, 0xe8, 0x4f, 0x84, 0xa6, 0xea, 0x02, 0x0c, 0x3d, 0x51, 0xfa, 0xab, 0xf3, - 0x65, 0x98, 0xe5, 0x4c, 0x0c, 0xe5, 0x0c, 0x9c, 0xe4, 0x12, 0xe8, 0x78, 0xd7, 0x2e, 0x1c, 0x53, - 0x10, 0x9c, 0xe6, 0xbe, 0xb0, 0x17, 0xdc, 0x2e, 0x64, 0xd0, 0x2b, 0x3e, 0x99, 0xf1, 0x17, 0x6f, - 0xde, 0x95, 0x65, 0xcb, 0x66, 0x1f, 0xe2, 0xe3, 0xc9, 0xb5, 0x4c, 0xc3, 0xc1, 0x8f, 0x84, 0x7c, - 0x4e, 0xfc, 0x84, 0x58, 0xab, 0xe1, 0x0c, 0x4c, 0x38, 0x56, 0xd8, 0x0f, 0xc5, 0x7b, 0x0d, 0x2b, - 0x56, 0x8e, 0x57, 0xac, 0x2a, 0x9c, 0xd7, 0x8d, 0x56, 0x67, 0xb7, 0x8d, 0x55, 0xdc, 0xd1, 0x5c, - 0x19, 0xda, 0x45, 0x7b, 0x11, 0x77, 0xb1, 0xd1, 0xc6, 0x86, 0x43, 0xf9, 0xf4, 0xce, 0xb3, 0x09, - 0xe4, 0xe4, 0x95, 0xf1, 0x1e, 0x5e, 0x19, 0x9f, 0xd2, 0x6f, 0x3d, 0x36, 0x66, 0xf1, 0xee, 0x4e, - 0x00, 0x5a, 0xb7, 0x0b, 0x3a, 0xbe, 0xc2, 0xd4, 0xf0, 0x9a, 0x9e, 0x25, 0xbc, 0x9a, 0x9f, 0x41, - 0x0d, 0x65, 0x46, 0x8f, 0xfb, 0xea, 0x77, 0x3f, 0xa7, 0x7e, 0xb7, 0x0a, 0xb2, 0x90, 0x4c, 0xeb, - 0xba, 0x43, 0x68, 0xdd, 0x2c, 0x4c, 0x05, 0x5b, 0xc3, 0xb2, 0x72, 0x0d, 0x9c, 0xf2, 0x7c, 0x7a, - 0xab, 0xe5, 0xf2, 0x62, 0xbd, 0xb9, 0xb1, 0xbe, 0xac, 0x16, 0x17, 0xcb, 0x05, 0x70, 0xf5, 0x93, - 0xea, 0xa5, 0xef, 0x8a, 0x9b, 0x45, 0x7f, 0x2e, 0x41, 0x8e, 0x1c, 0xc6, 0x44, 0xdf, 0x3f, 0x22, - 0xcd, 0xb1, 0x39, 0x0f, 0x26, 0x7f, 0xdc, 0x15, 0x8f, 0xf3, 0xce, 0x84, 0x49, 0xb8, 0x3a, 0x54, - 0x9c, 0xf7, 0x18, 0x42, 0xe9, 0x4f, 0x6b, 0xdc, 0x26, 0x59, 0xdf, 0x36, 0xaf, 0x7c, 0x3b, 0x37, - 0x49, 0xb7, 0xfe, 0x47, 0xdc, 0x24, 0xfb, 0xb0, 0x30, 0xf6, 0x26, 0xd9, 0xa7, 0xdd, 0xc5, 0x34, - 0x53, 0xf4, 0xfc, 0x9c, 0x3f, 0xff, 0x7b, 0xa1, 0x74, 0xa8, 0x8d, 0xac, 0x22, 0xcc, 0xea, 0x86, - 0x83, 0x2d, 0x43, 0xeb, 0x2c, 0x75, 0xb4, 0x2d, 0xcf, 0x3e, 0xed, 0xdd, 0xbd, 0xa8, 0x84, 0xf2, - 0xa8, 0xfc, 0x1f, 0xca, 0x59, 0x00, 0x07, 0xef, 0x74, 0x3b, 0x9a, 0x13, 0xa8, 0x5e, 0x28, 0x25, - 0xac, 0x7d, 0x59, 0x5e, 0xfb, 0x6e, 0x87, 0xab, 0x28, 0x68, 0x8d, 0xfd, 0x2e, 0xde, 0x30, 0xf4, - 0x1f, 0xd8, 0x25, 0xe1, 0x47, 0xa9, 0x8e, 0xf6, 0xfb, 0xc4, 0x6d, 0xe7, 0xe4, 0x7b, 0xb6, 0x73, - 0xfe, 0x41, 0x38, 0xac, 0x89, 0xd7, 0xea, 0x07, 0x84, 0x35, 0xf1, 0x5b, 0x9a, 0xdc, 0xd3, 0xd2, - 0xfc, 0x45, 0x96, 0xac, 0xc0, 0x22, 0x4b, 0x18, 0x95, 0x9c, 0xe0, 0x02, 0xe5, 0x6b, 0x85, 0xe2, - 0xa6, 0xc4, 0x55, 0x63, 0x0c, 0x0b, 0xe0, 0x32, 0xcc, 0xd1, 0xa2, 0x17, 0x4c, 0xf3, 0xf2, 0x8e, - 0x66, 0x5d, 0x46, 0xd6, 0xa1, 0x54, 0x31, 0x76, 0x2f, 0x29, 0x72, 0x83, 0xf4, 0xa3, 0xc2, 0x73, - 0x06, 0x4e, 0x5c, 0x1e, 0xcf, 0xe3, 0xd9, 0x4c, 0xfa, 0x15, 0xa1, 0x29, 0x84, 0x08, 0x83, 0xe9, - 0xe3, 0xfa, 0x87, 0x3e, 0xae, 0x5e, 0x47, 0x1f, 0x5e, 0x87, 0x1f, 0x25, 0xae, 0xe8, 0xb3, 0xc3, - 0x61, 0xe7, 0xf1, 0x35, 0x04, 0x76, 0x05, 0x90, 0x2f, 0xfb, 0xae, 0x3f, 0xee, 0x63, 0xb8, 0x42, - 0xd9, 0xf4, 0xd0, 0x8c, 0x60, 0x79, 0x2c, 0x68, 0x9e, 0xe4, 0x59, 0xa8, 0x75, 0x53, 0xc5, 0xf4, - 0x33, 0xc2, 0xfb, 0x5b, 0x7d, 0x05, 0x44, 0xb9, 0x1b, 0x4f, 0xab, 0x14, 0xdb, 0x1c, 0x13, 0x67, - 0x33, 0x7d, 0x34, 0x5f, 0x92, 0x83, 0x29, 0x2f, 0xf0, 0x0c, 0xb9, 0x17, 0xc9, 0xc7, 0xf0, 0x34, - 0xe4, 0x6d, 0x73, 0xd7, 0x6a, 0x61, 0xb6, 0xe3, 0xc8, 0xde, 0x86, 0xd8, 0x1d, 0x1b, 0x38, 0x9e, - 0x1f, 0x30, 0x19, 0xb2, 0x89, 0x4d, 0x86, 0x68, 0x83, 0x34, 0x6e, 0x80, 0x7f, 0xa9, 0x70, 0x30, - 0x7b, 0x0e, 0xb3, 0x3a, 0x76, 0x9e, 0x88, 0x63, 0xfc, 0xef, 0x0a, 0xed, 0xbd, 0x0c, 0xa8, 0x49, - 0x32, 0x95, 0xab, 0x0d, 0x61, 0xa8, 0x5e, 0x0b, 0x57, 0x7b, 0x39, 0x98, 0x85, 0x4a, 0x2c, 0xd2, - 0x0d, 0x75, 0xb5, 0x20, 0xa3, 0x17, 0x64, 0xa1, 0x40, 0x59, 0xab, 0xf9, 0xc6, 0x1a, 0x7a, 0x65, - 0xe6, 0xa8, 0x2d, 0xd2, 0xe8, 0x29, 0xe6, 0xc7, 0x25, 0xd1, 0x80, 0xb9, 0x9c, 0xe0, 0x83, 0xda, - 0x45, 0x68, 0xd2, 0x10, 0xcd, 0x2c, 0x46, 0xf9, 0xd0, 0xaf, 0x66, 0x44, 0xe2, 0xef, 0x8a, 0xb1, - 0x38, 0x86, 0x60, 0x49, 0x59, 0x2f, 0x7e, 0xd8, 0x92, 0x65, 0xee, 0x6c, 0x58, 0x1d, 0xf4, 0x7f, - 0x0a, 0x85, 0x37, 0x8f, 0x30, 0xff, 0xa5, 0x68, 0xf3, 0x9f, 0x2c, 0x19, 0x77, 0x82, 0xbd, 0xaa, - 0xce, 0x10, 0xc3, 0xb7, 0x72, 0x13, 0xcc, 0x69, 0xed, 0xf6, 0xba, 0xb6, 0x85, 0x4b, 0xee, 0xbc, - 0xda, 0x70, 0x58, 0x6c, 0xa1, 0x9e, 0xd4, 0xd8, 0xae, 0x48, 0x7c, 0x1d, 0x94, 0x03, 0x89, 0xc9, - 0x67, 0x2c, 0xc3, 0x9b, 0x3b, 0x24, 0xb4, 0xb6, 0xb5, 0x20, 0xd2, 0x19, 0x7b, 0x13, 0xf4, 0x6c, - 0x12, 0xe0, 0x3b, 0x7d, 0xcd, 0xfa, 0x2d, 0x09, 0x26, 0x5c, 0x79, 0x17, 0xdb, 0x6d, 0xf4, 0x64, - 0x2e, 0x20, 0x60, 0xa4, 0x6f, 0xd9, 0x8f, 0x0a, 0x3b, 0xf5, 0x79, 0x35, 0xa4, 0xf4, 0x23, 0x30, - 0x09, 0x84, 0x28, 0x71, 0x42, 0x14, 0xf3, 0xdd, 0x8b, 0x2d, 0x22, 0x7d, 0xf1, 0x7d, 0x44, 0x82, - 0x59, 0x6f, 0x1e, 0xb1, 0x84, 0x9d, 0xd6, 0x36, 0xba, 0x53, 0x74, 0xa1, 0x89, 0xb5, 0x34, 0x7f, - 0x4f, 0xb6, 0x83, 0xbe, 0x99, 0x49, 0xa8, 0xf2, 0x5c, 0xc9, 0x11, 0xab, 0x74, 0x89, 0x74, 0x31, - 0x8e, 0x60, 0xfa, 0xc2, 0x7c, 0x5c, 0x02, 0x68, 0x98, 0xfe, 0x5c, 0xf7, 0x10, 0x92, 0x7c, 0xb9, - 0xf0, 0x76, 0x2d, 0xab, 0x78, 0x50, 0x6c, 0xf2, 0x9e, 0x43, 0xd0, 0x35, 0x69, 0x50, 0x49, 0x63, - 0x69, 0xeb, 0x53, 0x8b, 0xbb, 0xdd, 0x8e, 0xde, 0xd2, 0x9c, 0x5e, 0x7f, 0xba, 0x68, 0xf1, 0x92, - 0x4b, 0x43, 0x13, 0x19, 0x85, 0x7e, 0x19, 0x11, 0xb2, 0xa4, 0xa1, 0x67, 0x24, 0x2f, 0xf4, 0x8c, - 0xa0, 0x8f, 0xcc, 0x00, 0xe2, 0x63, 0x50, 0x4f, 0x19, 0x8e, 0xd7, 0xba, 0xd8, 0x58, 0xb0, 0xb0, - 0xd6, 0x6e, 0x59, 0xbb, 0x3b, 0x97, 0xec, 0xb0, 0x33, 0x68, 0xbc, 0x8e, 0x86, 0x96, 0x8e, 0x25, - 0x6e, 0xe9, 0x18, 0xfd, 0x88, 0x2c, 0x1a, 0x08, 0x29, 0xb4, 0xc1, 0x11, 0xe2, 0x61, 0x88, 0xa1, - 0x2e, 0x91, 0x0b, 0x53, 0xcf, 0x2a, 0x71, 0x36, 0xc9, 0x2a, 0xf1, 0x1b, 0x85, 0xc2, 0x2a, 0x09, - 0xd5, 0x6b, 0x2c, 0x9e, 0x68, 0x73, 0x75, 0xec, 0x44, 0xc0, 0x7b, 0x23, 0xcc, 0x5e, 0x0a, 0xbe, - 0xf8, 0x10, 0xf3, 0x89, 0x7d, 0xfc, 0x43, 0xdf, 0x94, 0x74, 0x05, 0x86, 0x67, 0x21, 0x02, 0x5d, - 0x1f, 0x41, 0x49, 0xc4, 0x09, 0x2d, 0xd1, 0x72, 0x4a, 0x6c, 0xf9, 0xe9, 0xa3, 0xf0, 0x01, 0x09, - 0xa6, 0xc9, 0x55, 0xa8, 0x0b, 0xfb, 0xe4, 0x58, 0xa4, 0xa0, 0x51, 0xf2, 0x92, 0xb0, 0x98, 0x15, - 0xc8, 0x76, 0x74, 0xe3, 0xb2, 0xe7, 0x3d, 0xe8, 0x3e, 0x07, 0x17, 0xeb, 0x49, 0x7d, 0x2e, 0xd6, - 0xf3, 0xf7, 0x29, 0xfc, 0x72, 0x0f, 0x75, 0xd3, 0xf3, 0x40, 0x72, 0xe9, 0x8b, 0xf1, 0xef, 0xb2, - 0x90, 0xaf, 0x63, 0xcd, 0x6a, 0x6d, 0xa3, 0x77, 0x49, 0x7d, 0xa7, 0x0a, 0x93, 0xfc, 0x54, 0x61, - 0x09, 0x26, 0x36, 0xf5, 0x8e, 0x83, 0x2d, 0xea, 0x51, 0x1d, 0xee, 0xda, 0x69, 0x13, 0x5f, 0xe8, - 0x98, 0xad, 0xcb, 0xf3, 0xcc, 0x74, 0x9f, 0xf7, 0x02, 0xb1, 0xce, 0x2f, 0x91, 0x9f, 0x54, 0xef, - 0x67, 0xd7, 0x20, 0xb4, 0x4d, 0xcb, 0x89, 0xba, 0x63, 0x23, 0x82, 0x4a, 0xdd, 0xb4, 0x1c, 0x95, - 0xfe, 0xe8, 0xc2, 0xbc, 0xb9, 0xdb, 0xe9, 0x34, 0xf0, 0x23, 0x8e, 0x37, 0x6d, 0xf3, 0xde, 0x5d, - 0x63, 0xd1, 0xdc, 0xdc, 0xb4, 0x31, 0x5d, 0x34, 0xc8, 0xa9, 0xec, 0x4d, 0x39, 0x09, 0xb9, 0x8e, - 0xbe, 0xa3, 0xd3, 0x89, 0x46, 0x4e, 0xa5, 0x2f, 0xca, 0x2d, 0x50, 0x08, 0xe6, 0x38, 0x94, 0xd1, - 0x33, 0x79, 0xd2, 0x34, 0x0f, 0xa4, 0xbb, 0x3a, 0x73, 0x19, 0xef, 0xdb, 0x67, 0x26, 0xc8, 0x77, - 0xf2, 0xcc, 0x1f, 0x5f, 0x11, 0xd9, 0xef, 0xa0, 0x12, 0x8f, 0x9e, 0xc1, 0x5a, 0xb8, 0x65, 0x5a, - 0x6d, 0x4f, 0x36, 0xd1, 0x13, 0x0c, 0x96, 0x2f, 0xd9, 0x2e, 0x45, 0xdf, 0xc2, 0xd3, 0xd7, 0xb4, - 0xb7, 0xe7, 0xdd, 0x6e, 0xd3, 0x2d, 0xfa, 0xa2, 0xee, 0x6c, 0xaf, 0x61, 0x47, 0x43, 0x7f, 0x27, - 0xf7, 0xd5, 0xb8, 0xe9, 0xff, 0x4f, 0xe3, 0x06, 0x68, 0x1c, 0x0d, 0x83, 0xe5, 0xec, 0x5a, 0x86, - 0x2b, 0x47, 0xe6, 0x95, 0x1a, 0x4a, 0x51, 0xee, 0x86, 0x6b, 0x82, 0x37, 0x6f, 0xa9, 0x74, 0x91, - 0x4d, 0x5b, 0xa7, 0x48, 0xf6, 0xe8, 0x0c, 0xca, 0x3a, 0xdc, 0x40, 0x3f, 0xae, 0x34, 0xd6, 0x56, - 0x57, 0xf4, 0xad, 0xed, 0x8e, 0xbe, 0xb5, 0xed, 0xd8, 0x15, 0xc3, 0x76, 0xb0, 0xd6, 0xae, 0x6d, - 0xaa, 0xf4, 0x76, 0x1c, 0x20, 0x74, 0x44, 0xb2, 0xf2, 0x1e, 0xd7, 0x62, 0xa3, 0x5b, 0x58, 0x53, - 0x22, 0x5a, 0xca, 0xb3, 0xdc, 0x96, 0x62, 0xef, 0x76, 0x7c, 0x4c, 0xaf, 0xeb, 0xc1, 0x34, 0x50, - 0xf5, 0xdd, 0x0e, 0x69, 0x2e, 0x24, 0x73, 0xd2, 0x71, 0x2e, 0x86, 0x93, 0xf4, 0x9b, 0xcd, 0xff, - 0x93, 0x87, 0xdc, 0xb2, 0xa5, 0x75, 0xb7, 0xd1, 0x0b, 0x42, 0xfd, 0xf3, 0xa8, 0xda, 0x84, 0xaf, - 0x9d, 0xd2, 0x20, 0xed, 0x94, 0x07, 0x68, 0x67, 0x36, 0xa4, 0x9d, 0xd1, 0x8b, 0xca, 0xe7, 0x61, - 0xa6, 0x65, 0x76, 0x3a, 0xb8, 0xe5, 0xca, 0xa3, 0xd2, 0x26, 0xab, 0x39, 0x53, 0x2a, 0x97, 0x46, - 0x82, 0x55, 0x63, 0xa7, 0x4e, 0xd7, 0xd0, 0xa9, 0xd2, 0x07, 0x09, 0xe8, 0x95, 0x12, 0x64, 0xcb, - 0xed, 0x2d, 0xcc, 0xad, 0xb3, 0x67, 0x42, 0xeb, 0xec, 0xa7, 0x21, 0xef, 0x68, 0xd6, 0x16, 0x76, - 0xbc, 0x75, 0x02, 0xfa, 0xe6, 0xc7, 0xd0, 0x96, 0x43, 0x31, 0xb4, 0xbf, 0x1b, 0xb2, 0xae, 0xcc, - 0x98, 0x93, 0xf9, 0x0d, 0xfd, 0xe0, 0x27, 0xb2, 0x9f, 0x77, 0x4b, 0x9c, 0x77, 0x6b, 0xad, 0x92, - 0x1f, 0x7a, 0xb1, 0xce, 0x1d, 0xc0, 0x9a, 0x5c, 0xf4, 0xd9, 0x32, 0x8d, 0xca, 0x8e, 0xb6, 0x85, - 0x59, 0x35, 0x83, 0x04, 0xef, 0x6b, 0x79, 0xc7, 0x7c, 0x58, 0x67, 0xd1, 0x22, 0x83, 0x04, 0xb7, - 0x0a, 0xdb, 0x7a, 0xbb, 0x8d, 0x0d, 0xd6, 0xb2, 0xd9, 0xdb, 0xf9, 0xb3, 0x90, 0x75, 0x79, 0x70, - 0xf5, 0xc7, 0x35, 0x16, 0x0a, 0xc7, 0x94, 0x19, 0xb7, 0x59, 0xd1, 0xc6, 0x5b, 0xc8, 0xf0, 0x6b, - 0xaa, 0x22, 0x6e, 0x3b, 0xb4, 0x72, 0xfd, 0x1b, 0xd7, 0xd3, 0x20, 0x67, 0x98, 0x6d, 0x3c, 0x70, - 0x10, 0xa2, 0xb9, 0x94, 0x67, 0x42, 0x0e, 0xb7, 0xdd, 0x5e, 0x41, 0x26, 0xd9, 0xcf, 0xc6, 0xcb, - 0x52, 0xa5, 0x99, 0x93, 0xf9, 0x06, 0xf5, 0xe3, 0x36, 0xfd, 0x06, 0xf8, 0xe3, 0x13, 0x70, 0x9c, - 0xf6, 0x01, 0xf5, 0xdd, 0x4b, 0x2e, 0xa9, 0x4b, 0x18, 0x3d, 0xd6, 0x7f, 0xe0, 0x3a, 0xce, 0x2b, - 0xfb, 0x49, 0xc8, 0xd9, 0xbb, 0x97, 0x7c, 0x23, 0x94, 0xbe, 0x84, 0x9b, 0xae, 0x34, 0x92, 0xe1, - 0x4c, 0x1e, 0x76, 0x38, 0xe3, 0x86, 0x26, 0xd9, 0x6b, 0xfc, 0xc1, 0x40, 0x46, 0x8f, 0x47, 0x78, - 0x03, 0x59, 0xbf, 0x61, 0xe8, 0x0c, 0x4c, 0x68, 0x9b, 0x0e, 0xb6, 0x02, 0x33, 0x91, 0xbd, 0xba, - 0x43, 0xe5, 0x25, 0xbc, 0x69, 0x5a, 0xae, 0x58, 0x68, 0x08, 0x75, 0xff, 0x3d, 0xd4, 0x72, 0x81, - 0xdb, 0x21, 0xbb, 0x15, 0x4e, 0x18, 0xe6, 0x22, 0xee, 0x32, 0x39, 0x53, 0x14, 0x67, 0x49, 0x0b, - 0x38, 0xf8, 0xe1, 0x40, 0x57, 0x32, 0x77, 0xb0, 0x2b, 0x41, 0x1f, 0x4b, 0x3a, 0x67, 0xee, 0x01, - 0x7a, 0x64, 0x16, 0x9a, 0xf2, 0x1c, 0x98, 0x69, 0x33, 0x17, 0xad, 0x96, 0xee, 0xb7, 0x92, 0xc8, - 0xff, 0xb8, 0xcc, 0x81, 0x22, 0x65, 0xc3, 0x8a, 0xb4, 0x0c, 0x93, 0xe4, 0x20, 0xb3, 0xab, 0x49, - 0xb9, 0x1e, 0x97, 0x78, 0x32, 0xad, 0xf3, 0x2b, 0x15, 0x12, 0xdb, 0x7c, 0x89, 0xfd, 0xa2, 0xfa, - 0x3f, 0x27, 0x9b, 0x7d, 0xc7, 0x4b, 0x28, 0xfd, 0xe6, 0xf8, 0x6b, 0x79, 0xb8, 0xa6, 0x64, 0x99, - 0xb6, 0x4d, 0xce, 0xc0, 0xf4, 0x36, 0xcc, 0x5f, 0x96, 0xb8, 0xdb, 0x34, 0x9e, 0xd0, 0xcd, 0xaf, - 0x5f, 0x83, 0x1a, 0x5f, 0xd3, 0xf8, 0x82, 0x70, 0x08, 0x18, 0x7f, 0xff, 0x21, 0x42, 0xe8, 0xdf, - 0x1e, 0x8d, 0xe4, 0xed, 0x19, 0x91, 0xa8, 0x34, 0x09, 0x65, 0x95, 0x7e, 0x73, 0xf9, 0x8c, 0x04, - 0xd7, 0xf6, 0x72, 0xb3, 0x61, 0xd8, 0x7e, 0x83, 0xb9, 0x7e, 0x40, 0x7b, 0xe1, 0xa3, 0x98, 0xc4, - 0xde, 0x63, 0x19, 0x51, 0xf7, 0x50, 0x69, 0x11, 0x8b, 0x25, 0xc1, 0x89, 0x9a, 0xb8, 0x7b, 0x2c, - 0x13, 0x93, 0x4f, 0x5f, 0xb8, 0x1f, 0xcf, 0xc2, 0xf1, 0x65, 0xcb, 0xdc, 0xed, 0xda, 0x41, 0x0f, - 0xf4, 0xd7, 0xfd, 0x37, 0x5c, 0xf3, 0x22, 0xa6, 0xc1, 0x39, 0x98, 0xb6, 0x98, 0x35, 0x17, 0x6c, - 0xbf, 0x86, 0x93, 0xc2, 0xbd, 0x97, 0x7c, 0x98, 0xde, 0x2b, 0xe8, 0x67, 0xb2, 0x5c, 0x3f, 0xd3, - 0xdb, 0x73, 0xe4, 0xfa, 0xf4, 0x1c, 0x7f, 0x25, 0x25, 0x1c, 0x54, 0x7b, 0x44, 0x14, 0xd1, 0x5f, - 0x94, 0x20, 0xbf, 0x45, 0x32, 0xb2, 0xee, 0xe2, 0xa9, 0x62, 0x35, 0x23, 0xc4, 0x55, 0xf6, 0x6b, - 0x20, 0x57, 0x39, 0xac, 0xc3, 0x89, 0x06, 0xb8, 0x78, 0x6e, 0xd3, 0x57, 0xaa, 0xd7, 0x65, 0x61, - 0xc6, 0x2f, 0xbd, 0xd2, 0xb6, 0xd1, 0x4b, 0xfa, 0x6b, 0xd4, 0xac, 0x88, 0x46, 0x1d, 0x58, 0x67, - 0xf6, 0x47, 0x1d, 0x39, 0x34, 0xea, 0xf4, 0x1d, 0x5d, 0x66, 0x22, 0x46, 0x17, 0xf4, 0x7c, 0x59, - 0xf4, 0x3e, 0x2a, 0xbe, 0x6b, 0x25, 0xb5, 0x79, 0x22, 0x0f, 0x16, 0x82, 0xb7, 0x62, 0x0d, 0xae, - 0x55, 0xfa, 0x4a, 0xf2, 0x5e, 0x09, 0x4e, 0x1c, 0xec, 0xcc, 0xbf, 0x83, 0xf7, 0x42, 0x73, 0xeb, - 0x64, 0xfb, 0x5e, 0x68, 0xe4, 0x8d, 0xdf, 0xa4, 0x8b, 0x0d, 0x29, 0xc2, 0xd9, 0x7b, 0x83, 0x3b, - 0x71, 0xb1, 0xa0, 0x21, 0x82, 0x44, 0xd3, 0x17, 0xe0, 0x4f, 0xc9, 0x30, 0x55, 0xc7, 0xce, 0xaa, - 0xb6, 0x6f, 0xee, 0x3a, 0x48, 0x13, 0xdd, 0x9e, 0x7b, 0x36, 0xe4, 0x3b, 0xe4, 0x17, 0x76, 0xcd, - 0xff, 0xb9, 0xbe, 0xfb, 0x5b, 0xc4, 0xf7, 0x87, 0x92, 0x56, 0x59, 0x7e, 0x3e, 0x96, 0x8b, 0xc8, - 0xee, 0xa8, 0xcf, 0xdd, 0x48, 0xb6, 0x76, 0x12, 0xed, 0x9d, 0x46, 0x15, 0x9d, 0x3e, 0x2c, 0x3f, - 0x22, 0xc3, 0x6c, 0x1d, 0x3b, 0x15, 0x7b, 0x49, 0xdb, 0x33, 0x2d, 0xdd, 0xc1, 0xe1, 0x7b, 0x3e, - 0xe3, 0xa1, 0x39, 0x0b, 0xa0, 0xfb, 0xbf, 0xb1, 0x08, 0x53, 0xa1, 0x14, 0xf4, 0xab, 0x49, 0x1d, - 0x85, 0x38, 0x3e, 0x46, 0x02, 0x42, 0x22, 0x1f, 0x8b, 0xb8, 0xe2, 0xd3, 0x07, 0xe2, 0xd3, 0x12, - 0x03, 0xa2, 0x68, 0xb5, 0xb6, 0xf5, 0x3d, 0xdc, 0x4e, 0x08, 0x84, 0xf7, 0x5b, 0x00, 0x84, 0x4f, - 0x28, 0xb1, 0xfb, 0x0a, 0xc7, 0xc7, 0x28, 0xdc, 0x57, 0xe2, 0x08, 0x8e, 0x25, 0x48, 0x94, 0xdb, - 0xf5, 0xb0, 0xf5, 0xcc, 0xfb, 0x44, 0xc5, 0x1a, 0x98, 0x6c, 0x52, 0xd8, 0x64, 0x1b, 0xaa, 0x63, - 0xa1, 0x65, 0x0f, 0xd2, 0xe9, 0x6c, 0x1a, 0x1d, 0x4b, 0xdf, 0xa2, 0xd3, 0x17, 0xfa, 0x3b, 0x65, - 0x38, 0xe5, 0x47, 0x4f, 0xa9, 0x63, 0x67, 0x51, 0xb3, 0xb7, 0x2f, 0x99, 0x9a, 0xd5, 0x46, 0xa5, - 0x11, 0x9c, 0xf8, 0x43, 0x9f, 0x0a, 0x83, 0x50, 0xe5, 0x41, 0xe8, 0xeb, 0x2a, 0xda, 0x97, 0x97, - 0x51, 0x74, 0x32, 0xb1, 0xde, 0xac, 0xbf, 0xe1, 0x83, 0xf5, 0x3d, 0x1c, 0x58, 0xf7, 0x0c, 0xcb, - 0x62, 0xfa, 0xc0, 0xfd, 0x2c, 0x1d, 0x11, 0x42, 0x5e, 0xcd, 0x0f, 0x89, 0x02, 0x16, 0xe1, 0xd5, - 0x2a, 0x47, 0x7a, 0xb5, 0x0e, 0x35, 0x46, 0x0c, 0xf4, 0x48, 0x4e, 0x77, 0x8c, 0x38, 0x42, 0x6f, - 0xe3, 0xb7, 0xca, 0x50, 0x20, 0xe1, 0xb3, 0x42, 0x1e, 0xdf, 0xe1, 0x68, 0xd4, 0xf1, 0xe8, 0x1c, - 0xf0, 0x2e, 0x9f, 0x48, 0xea, 0x5d, 0x8e, 0xde, 0x92, 0xd4, 0x87, 0xbc, 0x97, 0xdb, 0x91, 0x20, - 0x96, 0xc8, 0x45, 0x7c, 0x00, 0x07, 0xe9, 0x83, 0xf6, 0xdf, 0x64, 0x00, 0xb7, 0x41, 0xb3, 0xb3, - 0x0f, 0xcf, 0x15, 0x85, 0xeb, 0xb6, 0xb0, 0x5f, 0xbd, 0x0b, 0xd4, 0xa9, 0x1e, 0xa0, 0x28, 0xc5, - 0xe0, 0x54, 0xc5, 0x63, 0x49, 0x7d, 0x2b, 0x03, 0xae, 0x46, 0x02, 0x4b, 0x22, 0x6f, 0xcb, 0xc8, - 0xb2, 0xd3, 0x07, 0xe4, 0x7f, 0x48, 0x90, 0x6b, 0x98, 0x75, 0xec, 0x1c, 0xde, 0x14, 0x48, 0x7c, - 0x6c, 0x9f, 0x94, 0x3b, 0x8a, 0x63, 0xfb, 0xfd, 0x08, 0x8d, 0x21, 0x1a, 0x99, 0x04, 0x33, 0x0d, - 0xb3, 0xe4, 0x2f, 0x4e, 0x89, 0xfb, 0xaa, 0x8a, 0xdf, 0xa9, 0xed, 0x57, 0x30, 0x28, 0xe6, 0x50, - 0x77, 0x6a, 0x0f, 0xa6, 0x97, 0xbe, 0xdc, 0xee, 0x84, 0xe3, 0x1b, 0x46, 0xdb, 0x54, 0x71, 0xdb, - 0x64, 0x2b, 0xdd, 0x8a, 0x02, 0xd9, 0x5d, 0xa3, 0x6d, 0x12, 0x96, 0x73, 0x2a, 0x79, 0x76, 0xd3, - 0x2c, 0xdc, 0x36, 0x99, 0x6f, 0x00, 0x79, 0x46, 0x5f, 0x90, 0x21, 0xeb, 0xfe, 0x2b, 0x2e, 0xea, - 0xb7, 0xca, 0x09, 0x03, 0x11, 0xb8, 0xe4, 0x47, 0x62, 0x09, 0xdd, 0x17, 0x5a, 0xfb, 0xa7, 0x1e, - 0xac, 0x37, 0x44, 0x95, 0x17, 0x12, 0x45, 0xb0, 0xe6, 0xaf, 0x9c, 0x81, 0x89, 0x4b, 0x1d, 0xb3, - 0x75, 0x39, 0x38, 0x2f, 0xcf, 0x5e, 0x95, 0x5b, 0x20, 0x67, 0x69, 0xc6, 0x16, 0x66, 0x7b, 0x0a, - 0x27, 0x7b, 0xfa, 0x42, 0xe2, 0xf5, 0xa2, 0xd2, 0x2c, 0xe8, 0x2d, 0x49, 0x42, 0x20, 0xf4, 0xa9, - 0x7c, 0x32, 0x7d, 0x58, 0x1c, 0xe2, 0x64, 0x59, 0x01, 0x66, 0x4a, 0x45, 0x7a, 0x7b, 0xfd, 0x5a, - 0xed, 0x42, 0xb9, 0x20, 0x13, 0x98, 0x5d, 0x99, 0xa4, 0x08, 0xb3, 0x4b, 0xfe, 0xdb, 0x16, 0xe6, - 0x3e, 0x95, 0x3f, 0x0a, 0x98, 0x3f, 0x22, 0xc1, 0xec, 0xaa, 0x6e, 0x3b, 0x51, 0xde, 0xfe, 0x31, - 0xd1, 0x73, 0x5f, 0x9a, 0xd4, 0x54, 0xe6, 0xca, 0x11, 0x0e, 0x9b, 0x9b, 0xc8, 0x1c, 0x8e, 0x2b, - 0x62, 0x3c, 0xc7, 0x52, 0x08, 0x07, 0xf4, 0x0e, 0x69, 0x61, 0x49, 0x26, 0x36, 0x94, 0x82, 0x42, - 0xc6, 0x6f, 0x28, 0x45, 0x96, 0x9d, 0xbe, 0x7c, 0xbf, 0x20, 0xc1, 0x09, 0xb7, 0xf8, 0xb8, 0x65, - 0xa9, 0x68, 0x31, 0x0f, 0x5c, 0x96, 0x4a, 0xbc, 0x32, 0x7e, 0x80, 0x97, 0x51, 0xac, 0x8c, 0x0f, - 0x22, 0x3a, 0x66, 0x31, 0x47, 0x2c, 0xc3, 0x0e, 0x12, 0x73, 0xcc, 0x32, 0xec, 0xf0, 0x62, 0x8e, - 0x5f, 0x8a, 0x1d, 0x52, 0xcc, 0x47, 0xb6, 0xc0, 0xfa, 0x06, 0xd9, 0x17, 0x73, 0xe4, 0xda, 0x46, - 0x8c, 0x98, 0x13, 0x9f, 0xd8, 0x45, 0x6f, 0x1b, 0x52, 0xf0, 0x23, 0x5e, 0xdf, 0x18, 0x06, 0xa6, - 0x23, 0x5c, 0xe3, 0xf8, 0x39, 0x19, 0xe6, 0x18, 0x17, 0xfd, 0xa7, 0xcc, 0x31, 0x18, 0x25, 0x9e, - 0x32, 0x27, 0x3e, 0x03, 0xc4, 0x73, 0x36, 0xfe, 0x33, 0x40, 0xb1, 0xe5, 0xa7, 0x0f, 0xce, 0x17, - 0xb3, 0x70, 0xda, 0x65, 0x61, 0xcd, 0x6c, 0xeb, 0x9b, 0xfb, 0x94, 0x8b, 0x0b, 0x5a, 0x67, 0x17, - 0xdb, 0xe8, 0xdd, 0x92, 0x28, 0x4a, 0xff, 0x09, 0xc0, 0xec, 0x62, 0x8b, 0x06, 0x52, 0x63, 0x40, - 0xdd, 0x1d, 0x55, 0xd9, 0x83, 0x25, 0xf9, 0x97, 0xc9, 0xd4, 0x3c, 0x22, 0x6a, 0x88, 0x9e, 0x6b, - 0x15, 0x4e, 0xf9, 0x5f, 0x7a, 0x1d, 0x3c, 0x32, 0x07, 0x1d, 0x3c, 0x6e, 0x06, 0x59, 0x6b, 0xb7, + 0x73, 0x84, 0x72, 0xbd, 0x51, 0x38, 0x4a, 0xca, 0xaa, 0x34, 0x0a, 0x05, 0xf7, 0x61, 0xa5, 0xde, + 0x28, 0x1c, 0x23, 0x99, 0xeb, 0x8d, 0x82, 0x42, 0x0a, 0xad, 0x37, 0x0a, 0x57, 0x90, 0x3c, 0xf5, + 0x46, 0xe1, 0x38, 0x29, 0xa2, 0xde, 0x28, 0x9c, 0x20, 0x6c, 0x94, 0x1b, 0x85, 0x93, 0x24, 0x8f, + 0xda, 0x28, 0x5c, 0x49, 0x3e, 0x55, 0x1b, 0x85, 0x53, 0x84, 0xb1, 0x72, 0xa3, 0x70, 0x15, 0x79, + 0x50, 0x1b, 0x05, 0x44, 0x3e, 0x15, 0x1b, 0x85, 0xab, 0xd1, 0x13, 0x60, 0x6a, 0x19, 0x3b, 0x14, + 0x44, 0x54, 0x00, 0x79, 0x19, 0x3b, 0x61, 0xa3, 0xff, 0x4b, 0x32, 0x5c, 0xc9, 0x26, 0x8a, 0x4b, + 0x96, 0xb9, 0xb3, 0x8a, 0xb7, 0xb4, 0xd6, 0xe5, 0xf2, 0xc3, 0xae, 0xc1, 0x15, 0xde, 0xf3, 0x55, + 0x20, 0xdb, 0x0d, 0x3a, 0x23, 0xf2, 0x1c, 0x6b, 0x9f, 0x7a, 0x0b, 0x5d, 0x72, 0xb0, 0xd0, 0xc5, + 0x2c, 0xb2, 0x7f, 0x0a, 0x6b, 0x34, 0xb7, 0x36, 0x9d, 0xe9, 0x59, 0x9b, 0x76, 0x9b, 0x49, 0x17, + 0x5b, 0xb6, 0x69, 0x68, 0x9d, 0x3a, 0x73, 0x0a, 0xa0, 0x2b, 0x6a, 0xbd, 0xc9, 0xca, 0x0f, 0x79, + 0x2d, 0x83, 0x5a, 0x65, 0xcf, 0x8c, 0x9b, 0x0f, 0xf7, 0x56, 0x33, 0xa2, 0x91, 0x7c, 0xd4, 0x6f, + 0x24, 0x0d, 0xae, 0x91, 0xdc, 0x77, 0x00, 0xda, 0xc9, 0xda, 0x4b, 0x65, 0xb8, 0x89, 0x48, 0xe0, + 0x32, 0xeb, 0x2d, 0x85, 0xcb, 0xe8, 0x53, 0x12, 0x9c, 0x2c, 0x1b, 0xfd, 0xe6, 0x03, 0x61, 0x5d, + 0x78, 0x43, 0x18, 0x9a, 0x75, 0x5e, 0xa4, 0x77, 0xf6, 0xad, 0x76, 0x7f, 0x9a, 0x11, 0x12, 0xfd, + 0xb8, 0x2f, 0xd1, 0x3a, 0x27, 0xd1, 0x7b, 0x87, 0x27, 0x9d, 0x4c, 0xa0, 0xd5, 0x91, 0x76, 0x40, + 0x59, 0xf4, 0x65, 0x09, 0x8e, 0x51, 0xbf, 0x9e, 0xfb, 0xe9, 0xf4, 0x83, 0x74, 0xd9, 0xbc, 0x09, + 0xd5, 0x09, 0xa6, 0x2a, 0x54, 0xbf, 0x43, 0x29, 0xe8, 0xd5, 0x61, 0x81, 0x3f, 0xc0, 0x0b, 0x3c, + 0xa2, 0x33, 0xee, 0x2d, 0x2e, 0x42, 0xd6, 0x7f, 0xe4, 0xcb, 0xba, 0xca, 0xc9, 0xfa, 0xce, 0xa1, + 0xa8, 0x1e, 0xae, 0x98, 0xbf, 0x9a, 0x85, 0x27, 0x50, 0x0e, 0x99, 0x22, 0xd0, 0xce, 0xac, 0x68, + 0xb4, 0x55, 0x6c, 0x3b, 0x9a, 0xe5, 0x70, 0x47, 0xda, 0x7b, 0xe6, 0xb7, 0x99, 0x14, 0xe6, 0xb7, + 0xd2, 0xc0, 0xf9, 0x2d, 0x7a, 0x5b, 0xd8, 0x4a, 0x3b, 0xcf, 0x23, 0x5b, 0x8c, 0xc1, 0x20, 0xa2, + 0x86, 0x51, 0x2d, 0xca, 0x37, 0xdf, 0x7e, 0x98, 0x43, 0x79, 0xe9, 0xc0, 0x25, 0x24, 0x43, 0xfc, + 0x0f, 0x47, 0x6b, 0x4e, 0x67, 0xc3, 0xdf, 0x78, 0xdb, 0xaf, 0xd0, 0x4e, 0x75, 0x1e, 0xf4, 0xe2, + 0x49, 0x98, 0x22, 0x5d, 0xce, 0xaa, 0x6e, 0x5c, 0x74, 0xc7, 0xc6, 0x99, 0x2a, 0xbe, 0x54, 0xda, + 0xd6, 0x3a, 0x1d, 0x6c, 0x6c, 0x61, 0xf4, 0x10, 0x67, 0xa0, 0x6b, 0xdd, 0x6e, 0x35, 0xd8, 0x2a, + 0xf2, 0x5e, 0x95, 0x7b, 0x21, 0x67, 0xb7, 0xcc, 0x2e, 0x26, 0x82, 0x9a, 0x0b, 0x39, 0x97, 0xf0, + 0xcb, 0x5d, 0xc5, 0x5d, 0x67, 0x7b, 0x9e, 0x94, 0x55, 0xec, 0xea, 0x75, 0xf7, 0x07, 0x95, 0xfe, + 0xc7, 0xc6, 0xc9, 0xaf, 0xf4, 0xed, 0x8c, 0x33, 0x31, 0x9d, 0xb1, 0xcf, 0xf8, 0x7c, 0x98, 0xe9, + 0x88, 0x95, 0x8c, 0x33, 0x30, 0xdd, 0xf2, 0xb2, 0xf8, 0x67, 0x67, 0xc2, 0x49, 0xe8, 0x6f, 0x13, + 0x75, 0xd7, 0x42, 0x85, 0x27, 0xd3, 0x2a, 0x3c, 0x62, 0x7b, 0xf1, 0x04, 0x1c, 0x6b, 0xd4, 0x6a, + 0xcd, 0xb5, 0x62, 0xf5, 0xc1, 0xe0, 0xcc, 0xfa, 0x26, 0x7a, 0x59, 0x16, 0xe6, 0xea, 0x66, 0x67, + 0x0f, 0x07, 0x38, 0x57, 0x38, 0xa7, 0xac, 0xb0, 0x9c, 0x32, 0xfb, 0xe4, 0xa4, 0x9c, 0x84, 0xbc, + 0x66, 0xd8, 0x97, 0xb0, 0x67, 0xc3, 0xb3, 0x37, 0x06, 0xe3, 0x7b, 0xc3, 0x1d, 0x81, 0xca, 0xc3, + 0x78, 0xd7, 0x00, 0x49, 0xf2, 0x5c, 0x45, 0x00, 0x79, 0x16, 0x66, 0x6c, 0xba, 0x61, 0xdc, 0x08, + 0xf9, 0x05, 0x70, 0x69, 0x84, 0x45, 0xea, 0xb1, 0x20, 0x33, 0x16, 0xc9, 0x1b, 0x7a, 0x95, 0xdf, + 0x7f, 0x6c, 0x70, 0x10, 0x17, 0x0f, 0xc2, 0x58, 0x32, 0x90, 0x5f, 0x31, 0xea, 0x99, 0xf8, 0x29, + 0x38, 0xce, 0x9a, 0x7d, 0xb3, 0xb4, 0x52, 0x5c, 0x5d, 0x2d, 0x57, 0x97, 0xcb, 0xcd, 0xca, 0x22, + 0xdd, 0x80, 0x0a, 0x52, 0x8a, 0x8d, 0x46, 0x79, 0x6d, 0xbd, 0x51, 0x6f, 0x96, 0x9f, 0x55, 0x2a, + 0x97, 0x17, 0x89, 0x5b, 0x24, 0x39, 0xd7, 0xe4, 0x39, 0xb0, 0x16, 0xab, 0xf5, 0xf3, 0x65, 0xb5, + 0xb0, 0x7d, 0xb6, 0x08, 0xd3, 0xa1, 0x81, 0xc2, 0xe5, 0x6e, 0x11, 0x6f, 0x6a, 0xbb, 0x1d, 0x66, + 0x53, 0x17, 0x8e, 0xb8, 0xdc, 0x11, 0xd9, 0xd4, 0x8c, 0xce, 0xe5, 0x42, 0x46, 0x29, 0xc0, 0x4c, + 0x78, 0x4c, 0x28, 0x48, 0xe8, 0xcd, 0xd7, 0xc0, 0xd4, 0x79, 0xd3, 0xba, 0x48, 0x7c, 0xf9, 0xd0, + 0xbb, 0x68, 0x6c, 0x1b, 0xef, 0x94, 0x70, 0xc8, 0x00, 0x7b, 0x85, 0xb8, 0xc7, 0x88, 0x47, 0x6d, + 0x7e, 0xe0, 0x49, 0xe0, 0x33, 0x30, 0x7d, 0xc9, 0xcb, 0x1d, 0xb4, 0xf4, 0x50, 0x12, 0xfa, 0xef, + 0x62, 0x3e, 0x20, 0x83, 0x8b, 0x4c, 0xdf, 0x47, 0xe1, 0x4d, 0x12, 0xe4, 0x97, 0xb1, 0x53, 0xec, + 0x74, 0xc2, 0x72, 0x7b, 0xa9, 0xf0, 0xe9, 0x2e, 0xae, 0x12, 0xc5, 0x4e, 0x27, 0xba, 0x51, 0x85, + 0x04, 0xe4, 0x9d, 0x42, 0xe0, 0xd2, 0x04, 0x7d, 0x27, 0x07, 0x14, 0x98, 0xbe, 0xc4, 0xde, 0x2f, + 0xfb, 0x7e, 0x0e, 0x8f, 0x86, 0xcc, 0xa4, 0xdb, 0x82, 0xb8, 0x46, 0x99, 0x78, 0x7f, 0x09, 0x2f, + 0x9f, 0xf2, 0x00, 0x4c, 0xec, 0xda, 0xb8, 0xa4, 0xd9, 0xde, 0xd0, 0xc6, 0xd7, 0xb4, 0x76, 0xe1, + 0x21, 0xdc, 0x72, 0xe6, 0x2b, 0x3b, 0xee, 0xc4, 0x67, 0x83, 0x66, 0xf4, 0x43, 0x05, 0xb1, 0x77, + 0xd5, 0xa3, 0xe0, 0x4e, 0x1e, 0x2f, 0xe9, 0xce, 0x76, 0x69, 0x5b, 0x73, 0xd8, 0x8e, 0x85, 0xff, + 0x8e, 0x5e, 0x34, 0x04, 0x9c, 0xb1, 0x3b, 0xfc, 0x91, 0x87, 0x44, 0x13, 0x83, 0x38, 0x82, 0x6d, + 0xf9, 0x61, 0x40, 0xfc, 0x07, 0x09, 0xb2, 0xb5, 0x2e, 0x36, 0x84, 0x4f, 0x44, 0xf9, 0xb2, 0x95, + 0x7a, 0x64, 0xfb, 0x2a, 0x71, 0x0f, 0x41, 0xbf, 0xd2, 0x6e, 0xc9, 0x11, 0x92, 0xbd, 0x05, 0xb2, + 0xba, 0xb1, 0x69, 0x32, 0xcb, 0xf6, 0xea, 0x08, 0x5b, 0xa7, 0x62, 0x6c, 0x9a, 0x2a, 0xc9, 0x28, + 0xea, 0x1c, 0x18, 0x57, 0x76, 0xfa, 0xe2, 0xfe, 0xda, 0x24, 0xe4, 0xa9, 0x3a, 0xa3, 0x97, 0xc8, + 0x20, 0x17, 0xdb, 0xed, 0x08, 0xc1, 0x4b, 0xfb, 0x04, 0x6f, 0x92, 0xdf, 0x7c, 0x4c, 0xfc, 0x77, + 0x3e, 0xa0, 0x8d, 0x60, 0xdf, 0xce, 0x9a, 0x54, 0xb1, 0xdd, 0x8e, 0xf6, 0x43, 0xf6, 0x0b, 0x94, + 0xf8, 0x02, 0xc3, 0x2d, 0x5c, 0x16, 0x6b, 0xe1, 0x89, 0x07, 0x82, 0x48, 0xfe, 0xd2, 0x87, 0xe8, + 0x9f, 0x24, 0x98, 0x58, 0xd5, 0x6d, 0xc7, 0xc5, 0xa6, 0x28, 0x82, 0xcd, 0x35, 0x30, 0xe5, 0x89, + 0xc6, 0xed, 0xf2, 0xdc, 0xfe, 0x3c, 0x48, 0xe0, 0x67, 0xe2, 0xf7, 0xf3, 0xe8, 0x3c, 0x2d, 0xbe, + 0xf6, 0x8c, 0x8b, 0xe8, 0x93, 0x26, 0x41, 0xb1, 0x52, 0x6f, 0xb1, 0xbf, 0xed, 0x0b, 0x7c, 0x8d, + 0x13, 0xf8, 0x1d, 0xc3, 0x14, 0x99, 0xbe, 0xd0, 0x3f, 0x2d, 0x01, 0xb8, 0x65, 0xb3, 0xe3, 0x7c, + 0x4f, 0xe2, 0x0e, 0xe9, 0xc7, 0x48, 0xf7, 0x65, 0x61, 0xe9, 0xae, 0xf1, 0xd2, 0xfd, 0xc1, 0xc1, + 0x55, 0x8d, 0x3b, 0xb6, 0xa7, 0x14, 0x40, 0xd6, 0x7d, 0xd1, 0xba, 0x8f, 0xe8, 0x4d, 0xbe, 0x50, + 0xd7, 0x39, 0xa1, 0xde, 0x35, 0x64, 0x49, 0xe9, 0xcb, 0xf5, 0x2f, 0x25, 0x98, 0xa8, 0x63, 0xc7, + 0xed, 0x26, 0xd1, 0x39, 0x91, 0x1e, 0x3e, 0xd4, 0xb6, 0x25, 0xc1, 0xb6, 0xfd, 0xcd, 0x8c, 0x68, + 0xb0, 0x9f, 0x40, 0x32, 0x8c, 0xa7, 0x88, 0xd5, 0x87, 0x47, 0x85, 0x82, 0xfd, 0x0c, 0xa2, 0x96, + 0xbe, 0x74, 0xdf, 0x20, 0xf9, 0xee, 0x16, 0xfc, 0x69, 0x9b, 0xb0, 0x59, 0x9c, 0xd9, 0x6f, 0x16, + 0x8b, 0x9f, 0xb6, 0x09, 0xd7, 0x31, 0xda, 0x7b, 0x20, 0xb1, 0xb1, 0x31, 0x82, 0x8d, 0xfd, 0x61, + 0xe4, 0xf5, 0x5c, 0x19, 0xf2, 0x6c, 0x07, 0xe0, 0xde, 0xf8, 0x1d, 0x80, 0xc1, 0x53, 0x8b, 0x77, + 0x0e, 0x61, 0xca, 0xc5, 0x2d, 0xcb, 0xfb, 0x6c, 0x48, 0x21, 0x36, 0x6e, 0x86, 0x1c, 0x89, 0x46, + 0xca, 0xc6, 0xb9, 0xc0, 0x27, 0xc3, 0x23, 0x51, 0x76, 0xbf, 0xaa, 0x34, 0x53, 0x62, 0x14, 0x46, + 0xb0, 0x92, 0x3f, 0x0c, 0x0a, 0x6f, 0x57, 0x00, 0xd6, 0x77, 0x2f, 0x74, 0x74, 0x7b, 0x5b, 0x37, + 0xb6, 0xd0, 0xbf, 0x67, 0x60, 0x86, 0xbd, 0xd2, 0xa0, 0x9a, 0xb1, 0xe6, 0x5f, 0xa4, 0x51, 0x50, + 0x00, 0x79, 0xd7, 0xd2, 0xd9, 0x32, 0x80, 0xfb, 0xa8, 0xdc, 0xed, 0xbb, 0x67, 0x65, 0x7b, 0xc2, + 0x29, 0xb8, 0x62, 0x08, 0x38, 0x98, 0x0f, 0x95, 0x1e, 0xb8, 0x69, 0x85, 0x23, 0xa7, 0xe6, 0xf8, + 0xc8, 0xa9, 0xdc, 0x19, 0xcb, 0x7c, 0xcf, 0x19, 0x4b, 0x17, 0x47, 0x5b, 0x7f, 0x36, 0x26, 0xfe, + 0x3b, 0xb2, 0x4a, 0x9e, 0xdd, 0x3f, 0x1e, 0x32, 0x75, 0x83, 0x6c, 0xea, 0x30, 0xf7, 0xe1, 0x20, + 0x01, 0xbd, 0x2f, 0x98, 0xc8, 0x98, 0x82, 0x56, 0x70, 0x02, 0x31, 0x70, 0x65, 0x67, 0x7b, 0xcb, + 0xfe, 0xa0, 0x70, 0xa4, 0xb4, 0x90, 0xc0, 0x62, 0xa7, 0x24, 0x8c, 0x03, 0xc9, 0xe7, 0x20, 0xb4, + 0x2b, 0x1b, 0xd7, 0x9d, 0x0e, 0xa2, 0x9f, 0x4c, 0x31, 0x77, 0x86, 0x58, 0x7c, 0x51, 0x60, 0xce, + 0x3b, 0x79, 0x5a, 0x5b, 0xb8, 0xbf, 0x5c, 0x6a, 0x14, 0xf0, 0xfe, 0xd3, 0xa8, 0xe4, 0xdc, 0x29, + 0x3d, 0x63, 0x1a, 0x2c, 0xb0, 0xa0, 0xff, 0x29, 0x41, 0x9e, 0xd9, 0x0e, 0xf7, 0x1e, 0x10, 0x42, + 0xf4, 0xf2, 0x61, 0x20, 0x89, 0x0d, 0x00, 0xf0, 0xb1, 0xa4, 0x00, 0x8c, 0xc0, 0x5a, 0x78, 0x30, + 0x35, 0x00, 0xd0, 0xbf, 0x48, 0x90, 0x75, 0x6d, 0x1a, 0xb1, 0xe3, 0xd5, 0x1f, 0x15, 0x76, 0x55, + 0x0e, 0x09, 0xc0, 0x25, 0x1f, 0xa1, 0xdf, 0x0b, 0x30, 0xd5, 0xa5, 0x19, 0xfd, 0xc3, 0xfd, 0xd7, + 0x0b, 0xf4, 0x2c, 0x58, 0x0d, 0x7e, 0x43, 0xef, 0x10, 0x72, 0x77, 0x8e, 0xe7, 0x27, 0x19, 0x1c, + 0xe5, 0x51, 0x9c, 0xc4, 0xde, 0x44, 0xdf, 0x96, 0x00, 0x54, 0x6c, 0x9b, 0x9d, 0x3d, 0xbc, 0x61, + 0xe9, 0xe8, 0xea, 0x00, 0x00, 0xd6, 0xec, 0x33, 0x41, 0xb3, 0xff, 0x44, 0x58, 0xf0, 0xcb, 0xbc, + 0xe0, 0x6f, 0x8b, 0xd6, 0x3c, 0x8f, 0x78, 0x84, 0xf8, 0xef, 0x81, 0x09, 0x26, 0x47, 0x66, 0x20, + 0x8a, 0x09, 0xdf, 0xfb, 0x09, 0xbd, 0xdb, 0x17, 0xfd, 0xfd, 0x9c, 0xe8, 0x9f, 0x9e, 0x98, 0xa3, + 0x64, 0x00, 0x94, 0x86, 0x00, 0xe0, 0x28, 0x4c, 0x7b, 0x00, 0x6c, 0xa8, 0x95, 0x02, 0x46, 0x6f, + 0x95, 0x89, 0xcf, 0x03, 0x1d, 0xa9, 0x0e, 0xde, 0xd3, 0x7c, 0x59, 0x78, 0xe6, 0x1e, 0x92, 0x87, + 0x5f, 0x7e, 0x4a, 0x00, 0xfd, 0xa9, 0xd0, 0x54, 0x5d, 0x80, 0xa1, 0xc7, 0x4b, 0x7f, 0x75, 0xb6, + 0x0c, 0xb3, 0x9c, 0x89, 0xa1, 0x9c, 0x82, 0xe3, 0x5c, 0x02, 0x1d, 0xef, 0xda, 0x85, 0x23, 0x0a, + 0x82, 0x93, 0xdc, 0x17, 0xf6, 0x82, 0xdb, 0x85, 0x0c, 0xfa, 0xc0, 0x67, 0x32, 0xfe, 0xe2, 0xcd, + 0x3b, 0xb3, 0x6c, 0xd9, 0xec, 0xc3, 0x7c, 0x3c, 0xb9, 0x96, 0x69, 0x38, 0xf8, 0xe1, 0x90, 0xcf, + 0x89, 0x9f, 0x10, 0x6b, 0x35, 0x9c, 0x82, 0x09, 0xc7, 0x0a, 0xfb, 0xa1, 0x78, 0xaf, 0x61, 0xc5, + 0xca, 0xf1, 0x8a, 0x55, 0x85, 0xb3, 0xba, 0xd1, 0xea, 0xec, 0xb6, 0xb1, 0x8a, 0x3b, 0x9a, 0x2b, + 0x43, 0xbb, 0x68, 0x2f, 0xe2, 0x2e, 0x36, 0xda, 0xd8, 0x70, 0x28, 0x9f, 0xde, 0x79, 0x36, 0x81, + 0x9c, 0xbc, 0x32, 0xde, 0xcd, 0x2b, 0xe3, 0x93, 0xfa, 0xad, 0xc7, 0xc6, 0x2c, 0xde, 0xdd, 0x01, + 0x40, 0xeb, 0x76, 0x4e, 0xc7, 0x97, 0x98, 0x1a, 0x5e, 0xd5, 0xb3, 0x84, 0x57, 0xf3, 0x33, 0xa8, + 0xa1, 0xcc, 0xe8, 0x31, 0x5f, 0xfd, 0xee, 0xe3, 0xd4, 0xef, 0x66, 0x41, 0x16, 0x92, 0x69, 0x5d, + 0x77, 0x08, 0xad, 0x9b, 0x85, 0xa9, 0x60, 0x6b, 0x58, 0x56, 0xae, 0x82, 0x13, 0x9e, 0x4f, 0x6f, + 0xb5, 0x5c, 0x5e, 0xac, 0x37, 0x37, 0xd6, 0x97, 0xd5, 0xe2, 0x62, 0xb9, 0x00, 0xae, 0x7e, 0x52, + 0xbd, 0xf4, 0x5d, 0x71, 0xb3, 0xe8, 0x33, 0x12, 0xe4, 0xc8, 0x61, 0x4c, 0xf4, 0xa3, 0x23, 0xd2, + 0x1c, 0x9b, 0xf3, 0x60, 0xf2, 0xc7, 0x5d, 0xf1, 0x38, 0xef, 0x4c, 0x98, 0x84, 0xab, 0x03, 0xc5, + 0x79, 0x8f, 0x21, 0x94, 0xfe, 0xb4, 0xc6, 0x6d, 0x92, 0xf5, 0x6d, 0xf3, 0xd2, 0xf7, 0x72, 0x93, + 0x74, 0xeb, 0x7f, 0xc8, 0x4d, 0xb2, 0x0f, 0x0b, 0x63, 0x6f, 0x92, 0x7d, 0xda, 0x5d, 0x4c, 0x33, + 0x45, 0xcf, 0xc9, 0xf9, 0xf3, 0xbf, 0xe7, 0x49, 0x07, 0xda, 0xc8, 0x2a, 0xc2, 0xac, 0x6e, 0x38, + 0xd8, 0x32, 0xb4, 0xce, 0x52, 0x47, 0xdb, 0xf2, 0xec, 0xd3, 0xde, 0xdd, 0x8b, 0x4a, 0x28, 0x8f, + 0xca, 0xff, 0xa1, 0x9c, 0x06, 0x70, 0xf0, 0x4e, 0xb7, 0xa3, 0x39, 0x81, 0xea, 0x85, 0x52, 0xc2, + 0xda, 0x97, 0xe5, 0xb5, 0xef, 0x56, 0xb8, 0x82, 0x82, 0xd6, 0xb8, 0xdc, 0xc5, 0x1b, 0x86, 0xfe, + 0x63, 0xbb, 0x24, 0xfc, 0x28, 0xd5, 0xd1, 0x7e, 0x9f, 0xb8, 0xed, 0x9c, 0x7c, 0xcf, 0x76, 0xce, + 0x3f, 0x08, 0x87, 0x35, 0xf1, 0x5a, 0xfd, 0x80, 0xb0, 0x26, 0x7e, 0x4b, 0x93, 0x7b, 0x5a, 0x9a, + 0xbf, 0xc8, 0x92, 0x15, 0x58, 0x64, 0x09, 0xa3, 0x92, 0x13, 0x5c, 0xa0, 0x7c, 0xa5, 0x50, 0xdc, + 0x94, 0xb8, 0x6a, 0x8c, 0x61, 0x01, 0x5c, 0x86, 0x39, 0x5a, 0xf4, 0x82, 0x69, 0x5e, 0xdc, 0xd1, + 0xac, 0x8b, 0xc8, 0x3a, 0x90, 0x2a, 0xc6, 0xee, 0x25, 0x45, 0x6e, 0x90, 0x7e, 0x5c, 0x78, 0xce, + 0xc0, 0x89, 0xcb, 0xe3, 0x79, 0x3c, 0x9b, 0x49, 0xaf, 0x13, 0x9a, 0x42, 0x88, 0x30, 0x98, 0x3e, + 0xae, 0x7f, 0xec, 0xe3, 0xea, 0x75, 0xf4, 0xe1, 0x75, 0xf8, 0x51, 0xe2, 0x8a, 0xbe, 0x30, 0x1c, + 0x76, 0x1e, 0x5f, 0x43, 0x60, 0x57, 0x00, 0xf9, 0xa2, 0xef, 0xfa, 0xe3, 0x3e, 0x86, 0x2b, 0x94, + 0x4d, 0x0f, 0xcd, 0x08, 0x96, 0xc7, 0x82, 0xe6, 0x71, 0x9e, 0x85, 0x5a, 0x37, 0x55, 0x4c, 0x3f, + 0x2f, 0xbc, 0xbf, 0xd5, 0x57, 0x40, 0x94, 0xbb, 0xf1, 0xb4, 0x4a, 0xb1, 0xcd, 0x31, 0x71, 0x36, + 0xd3, 0x47, 0xf3, 0x85, 0x39, 0x98, 0xf2, 0x02, 0xcf, 0x90, 0x7b, 0x91, 0x7c, 0x0c, 0x4f, 0x42, + 0xde, 0x36, 0x77, 0xad, 0x16, 0x66, 0x3b, 0x8e, 0xec, 0x6d, 0x88, 0xdd, 0xb1, 0x81, 0xe3, 0xf9, + 0x3e, 0x93, 0x21, 0x9b, 0xd8, 0x64, 0x88, 0x36, 0x48, 0xe3, 0x06, 0xf8, 0x17, 0x09, 0x07, 0xb3, + 0xe7, 0x30, 0xab, 0x63, 0xe7, 0xf1, 0x38, 0xc6, 0xff, 0x81, 0xd0, 0xde, 0xcb, 0x80, 0x9a, 0x24, + 0x53, 0xb9, 0xda, 0x10, 0x86, 0xea, 0xd5, 0x70, 0xa5, 0x97, 0x83, 0x59, 0xa8, 0xc4, 0x22, 0xdd, + 0x50, 0x57, 0x0b, 0x32, 0x7a, 0x6e, 0x16, 0x0a, 0x94, 0xb5, 0x9a, 0x6f, 0xac, 0xa1, 0x97, 0x66, + 0x0e, 0xdb, 0x22, 0x8d, 0x9e, 0x62, 0x7e, 0x52, 0x12, 0x0d, 0x98, 0xcb, 0x09, 0x3e, 0xa8, 0x5d, + 0x84, 0x26, 0x0d, 0xd1, 0xcc, 0x62, 0x94, 0x0f, 0xfd, 0x56, 0x46, 0x24, 0xfe, 0xae, 0x18, 0x8b, + 0x63, 0x08, 0x96, 0x94, 0xf5, 0xe2, 0x87, 0x2d, 0x59, 0xe6, 0xce, 0x86, 0xd5, 0x41, 0xff, 0xa7, + 0x50, 0x78, 0xf3, 0x08, 0xf3, 0x5f, 0x8a, 0x36, 0xff, 0xc9, 0x92, 0x71, 0x27, 0xd8, 0xab, 0xea, + 0x0c, 0x31, 0x7c, 0x2b, 0x37, 0xc0, 0x9c, 0xd6, 0x6e, 0xaf, 0x6b, 0x5b, 0xb8, 0xe4, 0xce, 0xab, + 0x0d, 0x87, 0xc5, 0x16, 0xea, 0x49, 0x8d, 0xed, 0x8a, 0xc4, 0xd7, 0x41, 0x39, 0x90, 0x98, 0x7c, + 0xc6, 0x32, 0xbc, 0xb9, 0x43, 0x42, 0x6b, 0x5b, 0x0b, 0x22, 0x9d, 0xb1, 0x37, 0x41, 0xcf, 0x26, + 0x01, 0xbe, 0xd3, 0xd7, 0xac, 0xdf, 0x93, 0x60, 0xc2, 0x95, 0x77, 0xb1, 0xdd, 0x46, 0x4f, 0xe4, + 0x02, 0x02, 0x46, 0xfa, 0x96, 0xfd, 0xb4, 0xb0, 0x53, 0x9f, 0x57, 0x43, 0x4a, 0x3f, 0x02, 0x93, + 0x40, 0x88, 0x12, 0x27, 0x44, 0x31, 0xdf, 0xbd, 0xd8, 0x22, 0xd2, 0x17, 0xdf, 0x47, 0x25, 0x98, + 0xf5, 0xe6, 0x11, 0x4b, 0xd8, 0x69, 0x6d, 0xa3, 0x3b, 0x44, 0x17, 0x9a, 0x58, 0x4b, 0xf3, 0xf7, + 0x64, 0x3b, 0xe8, 0x3b, 0x99, 0x84, 0x2a, 0xcf, 0x95, 0x1c, 0xb1, 0x4a, 0x97, 0x48, 0x17, 0xe3, + 0x08, 0xa6, 0x2f, 0xcc, 0xc7, 0x24, 0x80, 0x86, 0xe9, 0xcf, 0x75, 0x0f, 0x20, 0xc9, 0x5f, 0x10, + 0xde, 0xae, 0x65, 0x15, 0x0f, 0x8a, 0x4d, 0xde, 0x73, 0x08, 0xba, 0x26, 0x0d, 0x2a, 0x69, 0x2c, + 0x6d, 0x7d, 0x6a, 0x71, 0xb7, 0xdb, 0xd1, 0x5b, 0x9a, 0xd3, 0xeb, 0x4f, 0x17, 0x2d, 0x5e, 0x72, + 0x69, 0x68, 0x22, 0xa3, 0xd0, 0x2f, 0x23, 0x42, 0x96, 0x34, 0xf4, 0x8c, 0xe4, 0x85, 0x9e, 0x11, + 0xf4, 0x91, 0x19, 0x40, 0x7c, 0x0c, 0xea, 0x29, 0xc3, 0xd1, 0x5a, 0x17, 0x1b, 0x0b, 0x16, 0xd6, + 0xda, 0x2d, 0x6b, 0x77, 0xe7, 0x82, 0x1d, 0x76, 0x06, 0x8d, 0xd7, 0xd1, 0xd0, 0xd2, 0xb1, 0xc4, + 0x2d, 0x1d, 0xa3, 0x9f, 0x92, 0x45, 0x03, 0x21, 0x85, 0x36, 0x38, 0x42, 0x3c, 0x0c, 0x31, 0xd4, + 0x25, 0x72, 0x61, 0xea, 0x59, 0x25, 0xce, 0x26, 0x59, 0x25, 0x7e, 0xbd, 0x50, 0x58, 0x25, 0xa1, + 0x7a, 0x8d, 0xc5, 0x13, 0x6d, 0xae, 0x8e, 0x9d, 0x08, 0x78, 0xaf, 0x87, 0xd9, 0x0b, 0xc1, 0x17, + 0x1f, 0x62, 0x3e, 0xb1, 0x8f, 0x7f, 0xe8, 0x1b, 0x92, 0xae, 0xc0, 0xf0, 0x2c, 0x44, 0xa0, 0xeb, + 0x23, 0x28, 0x89, 0x38, 0xa1, 0x25, 0x5a, 0x4e, 0x89, 0x2d, 0x3f, 0x7d, 0x14, 0x3e, 0x28, 0xc1, + 0x34, 0xb9, 0x0a, 0x75, 0xe1, 0x32, 0x39, 0x16, 0x29, 0x68, 0x94, 0xbc, 0x30, 0x2c, 0x66, 0x05, + 0xb2, 0x1d, 0xdd, 0xb8, 0xe8, 0x79, 0x0f, 0xba, 0xcf, 0xc1, 0xc5, 0x7a, 0x52, 0x9f, 0x8b, 0xf5, + 0xfc, 0x7d, 0x0a, 0xbf, 0xdc, 0x03, 0xdd, 0xf4, 0x3c, 0x90, 0x5c, 0xfa, 0x62, 0xfc, 0xbb, 0x2c, + 0xe4, 0xeb, 0x58, 0xb3, 0x5a, 0xdb, 0xe8, 0x9d, 0x52, 0xdf, 0xa9, 0xc2, 0x24, 0x3f, 0x55, 0x58, + 0x82, 0x89, 0x4d, 0xbd, 0xe3, 0x60, 0x8b, 0x7a, 0x54, 0x87, 0xbb, 0x76, 0xda, 0xc4, 0x17, 0x3a, + 0x66, 0xeb, 0xe2, 0x3c, 0x33, 0xdd, 0xe7, 0xbd, 0x40, 0xac, 0xf3, 0x4b, 0xe4, 0x27, 0xd5, 0xfb, + 0xd9, 0x35, 0x08, 0x6d, 0xd3, 0x72, 0xa2, 0xee, 0xd8, 0x88, 0xa0, 0x52, 0x37, 0x2d, 0x47, 0xa5, + 0x3f, 0xba, 0x30, 0x6f, 0xee, 0x76, 0x3a, 0x0d, 0xfc, 0xb0, 0xe3, 0x4d, 0xdb, 0xbc, 0x77, 0xd7, + 0x58, 0x34, 0x37, 0x37, 0x6d, 0x4c, 0x17, 0x0d, 0x72, 0x2a, 0x7b, 0x53, 0x8e, 0x43, 0xae, 0xa3, + 0xef, 0xe8, 0x74, 0xa2, 0x91, 0x53, 0xe9, 0x8b, 0x72, 0x13, 0x14, 0x82, 0x39, 0x0e, 0x65, 0xf4, + 0x54, 0x9e, 0x34, 0xcd, 0x7d, 0xe9, 0xae, 0xce, 0x5c, 0xc4, 0x97, 0xed, 0x53, 0x13, 0xe4, 0x3b, + 0x79, 0xe6, 0x8f, 0xaf, 0x88, 0xec, 0x77, 0x50, 0x89, 0x47, 0xcf, 0x60, 0x2d, 0xdc, 0x32, 0xad, + 0xb6, 0x27, 0x9b, 0xe8, 0x09, 0x06, 0xcb, 0x97, 0x6c, 0x97, 0xa2, 0x6f, 0xe1, 0xe9, 0x6b, 0xda, + 0xdb, 0xf2, 0x6e, 0xb7, 0xe9, 0x16, 0x7d, 0x5e, 0x77, 0xb6, 0xd7, 0xb0, 0xa3, 0xa1, 0xbf, 0x93, + 0xfb, 0x6a, 0xdc, 0xf4, 0xff, 0xa7, 0x71, 0x03, 0x34, 0x8e, 0x86, 0xc1, 0x72, 0x76, 0x2d, 0xc3, + 0x95, 0x23, 0xf3, 0x4a, 0x0d, 0xa5, 0x28, 0x77, 0xc1, 0x55, 0xc1, 0x9b, 0xb7, 0x54, 0xba, 0xc8, + 0xa6, 0xad, 0x53, 0x24, 0x7b, 0x74, 0x06, 0x65, 0x1d, 0xae, 0xa3, 0x1f, 0x57, 0x1a, 0x6b, 0xab, + 0x2b, 0xfa, 0xd6, 0x76, 0x47, 0xdf, 0xda, 0x76, 0xec, 0x8a, 0x61, 0x3b, 0x58, 0x6b, 0xd7, 0x36, + 0x55, 0x7a, 0x3b, 0x0e, 0x10, 0x3a, 0x22, 0x59, 0x79, 0x8f, 0x6b, 0xb1, 0xd1, 0x2d, 0xac, 0x29, + 0x11, 0x2d, 0xe5, 0xe9, 0x6e, 0x4b, 0xb1, 0x77, 0x3b, 0x3e, 0xa6, 0xd7, 0xf4, 0x60, 0x1a, 0xa8, + 0xfa, 0x6e, 0x87, 0x34, 0x17, 0x92, 0x39, 0xe9, 0x38, 0x17, 0xc3, 0x49, 0xfa, 0xcd, 0xe6, 0xff, + 0xc9, 0x43, 0x6e, 0xd9, 0xd2, 0xba, 0xdb, 0xe8, 0xb9, 0xa1, 0xfe, 0x79, 0x54, 0x6d, 0xc2, 0xd7, + 0x4e, 0x69, 0x90, 0x76, 0xca, 0x03, 0xb4, 0x33, 0x1b, 0xd2, 0xce, 0xe8, 0x45, 0xe5, 0xb3, 0x30, + 0xd3, 0x32, 0x3b, 0x1d, 0xdc, 0x72, 0xe5, 0x51, 0x69, 0x93, 0xd5, 0x9c, 0x29, 0x95, 0x4b, 0x23, + 0xc1, 0xaa, 0xb1, 0x53, 0xa7, 0x6b, 0xe8, 0x54, 0xe9, 0x83, 0x04, 0xf4, 0x52, 0x09, 0xb2, 0xe5, + 0xf6, 0x16, 0xe6, 0xd6, 0xd9, 0x33, 0xa1, 0x75, 0xf6, 0x93, 0x90, 0x77, 0x34, 0x6b, 0x0b, 0x3b, + 0xde, 0x3a, 0x01, 0x7d, 0xf3, 0x63, 0x68, 0xcb, 0xa1, 0x18, 0xda, 0x3f, 0x08, 0x59, 0x57, 0x66, + 0xcc, 0xc9, 0xfc, 0xba, 0x7e, 0xf0, 0x13, 0xd9, 0xcf, 0xbb, 0x25, 0xce, 0xbb, 0xb5, 0x56, 0xc9, + 0x0f, 0xbd, 0x58, 0xe7, 0xf6, 0x61, 0x4d, 0x2e, 0xfa, 0x6c, 0x99, 0x46, 0x65, 0x47, 0xdb, 0xc2, + 0xac, 0x9a, 0x41, 0x82, 0xf7, 0xb5, 0xbc, 0x63, 0x3e, 0xa4, 0xb3, 0x68, 0x91, 0x41, 0x82, 0x5b, + 0x85, 0x6d, 0xbd, 0xdd, 0xc6, 0x06, 0x6b, 0xd9, 0xec, 0xed, 0xec, 0x69, 0xc8, 0xba, 0x3c, 0xb8, + 0xfa, 0xe3, 0x1a, 0x0b, 0x85, 0x23, 0xca, 0x8c, 0xdb, 0xac, 0x68, 0xe3, 0x2d, 0x64, 0xf8, 0x35, + 0x55, 0x11, 0xb7, 0x1d, 0x5a, 0xb9, 0xfe, 0x8d, 0xeb, 0x29, 0x90, 0x33, 0xcc, 0x36, 0x1e, 0x38, + 0x08, 0xd1, 0x5c, 0xca, 0xd3, 0x20, 0x87, 0xdb, 0x6e, 0xaf, 0x20, 0x93, 0xec, 0xa7, 0xe3, 0x65, + 0xa9, 0xd2, 0xcc, 0xc9, 0x7c, 0x83, 0xfa, 0x71, 0x9b, 0x7e, 0x03, 0xfc, 0xd9, 0x09, 0x38, 0x4a, + 0xfb, 0x80, 0xfa, 0xee, 0x05, 0x97, 0xd4, 0x05, 0x8c, 0x1e, 0xed, 0x3f, 0x70, 0x1d, 0xe5, 0x95, + 0xfd, 0x38, 0xe4, 0xec, 0xdd, 0x0b, 0xbe, 0x11, 0x4a, 0x5f, 0xc2, 0x4d, 0x57, 0x1a, 0xc9, 0x70, + 0x26, 0x0f, 0x3b, 0x9c, 0x71, 0x43, 0x93, 0xec, 0x35, 0xfe, 0x60, 0x20, 0xa3, 0xc7, 0x23, 0xbc, + 0x81, 0xac, 0xdf, 0x30, 0x74, 0x0a, 0x26, 0xb4, 0x4d, 0x07, 0x5b, 0x81, 0x99, 0xc8, 0x5e, 0xdd, + 0xa1, 0xf2, 0x02, 0xde, 0x34, 0x2d, 0x57, 0x2c, 0x34, 0x84, 0xba, 0xff, 0x1e, 0x6a, 0xb9, 0xc0, + 0xed, 0x90, 0xdd, 0x0c, 0xc7, 0x0c, 0x73, 0x11, 0x77, 0x99, 0x9c, 0x29, 0x8a, 0xb3, 0xa4, 0x05, + 0xec, 0xff, 0xb0, 0xaf, 0x2b, 0x99, 0xdb, 0xdf, 0x95, 0xa0, 0x4f, 0x24, 0x9d, 0x33, 0xf7, 0x00, + 0x3d, 0x32, 0x0b, 0x4d, 0x79, 0x26, 0xcc, 0xb4, 0x99, 0x8b, 0x56, 0x4b, 0xf7, 0x5b, 0x49, 0xe4, + 0x7f, 0x5c, 0xe6, 0x40, 0x91, 0xb2, 0x61, 0x45, 0x5a, 0x86, 0x49, 0x72, 0x90, 0xd9, 0xd5, 0xa4, + 0x5c, 0x8f, 0x4b, 0x3c, 0x99, 0xd6, 0xf9, 0x95, 0x0a, 0x89, 0x6d, 0xbe, 0xc4, 0x7e, 0x51, 0xfd, + 0x9f, 0x93, 0xcd, 0xbe, 0xe3, 0x25, 0x94, 0x7e, 0x73, 0xfc, 0xed, 0x3c, 0x5c, 0x55, 0xb2, 0x4c, + 0xdb, 0x26, 0x67, 0x60, 0x7a, 0x1b, 0xe6, 0x6b, 0x25, 0xee, 0x36, 0x8d, 0xc7, 0x75, 0xf3, 0xeb, + 0xd7, 0xa0, 0xc6, 0xd7, 0x34, 0xbe, 0x2c, 0x1c, 0x02, 0xc6, 0xdf, 0x7f, 0x88, 0x10, 0xfa, 0xf7, + 0x46, 0x23, 0x79, 0x5b, 0x46, 0x24, 0x2a, 0x4d, 0x42, 0x59, 0xa5, 0xdf, 0x5c, 0x3e, 0x2f, 0xc1, + 0xd5, 0xbd, 0xdc, 0x6c, 0x18, 0xb6, 0xdf, 0x60, 0xae, 0x1d, 0xd0, 0x5e, 0xf8, 0x28, 0x26, 0xb1, + 0xf7, 0x58, 0x46, 0xd4, 0x3d, 0x54, 0x5a, 0xc4, 0x62, 0x49, 0x70, 0xa2, 0x26, 0xee, 0x1e, 0xcb, + 0xc4, 0xe4, 0xd3, 0x17, 0xee, 0x27, 0xb3, 0x70, 0x74, 0xd9, 0x32, 0x77, 0xbb, 0x76, 0xd0, 0x03, + 0xfd, 0x75, 0xff, 0x0d, 0xd7, 0xbc, 0x88, 0x69, 0x70, 0x06, 0xa6, 0x2d, 0x66, 0xcd, 0x05, 0xdb, + 0xaf, 0xe1, 0xa4, 0x70, 0xef, 0x25, 0x1f, 0xa4, 0xf7, 0x0a, 0xfa, 0x99, 0x2c, 0xd7, 0xcf, 0xf4, + 0xf6, 0x1c, 0xb9, 0x3e, 0x3d, 0xc7, 0x5f, 0x49, 0x09, 0x07, 0xd5, 0x1e, 0x11, 0x45, 0xf4, 0x17, + 0x25, 0xc8, 0x6f, 0x91, 0x8c, 0xac, 0xbb, 0x78, 0xb2, 0x58, 0xcd, 0x08, 0x71, 0x95, 0xfd, 0x1a, + 0xc8, 0x55, 0x0e, 0xeb, 0x70, 0xa2, 0x01, 0x2e, 0x9e, 0xdb, 0xf4, 0x95, 0xea, 0x55, 0x59, 0x98, + 0xf1, 0x4b, 0xaf, 0xb4, 0x6d, 0xf4, 0xc2, 0xfe, 0x1a, 0x35, 0x2b, 0xa2, 0x51, 0xfb, 0xd6, 0x99, + 0xfd, 0x51, 0x47, 0x0e, 0x8d, 0x3a, 0x7d, 0x47, 0x97, 0x99, 0x88, 0xd1, 0x05, 0x3d, 0x47, 0x16, + 0xbd, 0x8f, 0x8a, 0xef, 0x5a, 0x49, 0x6d, 0x1e, 0xcf, 0x83, 0x85, 0xe0, 0xad, 0x58, 0x83, 0x6b, + 0x95, 0xbe, 0x92, 0xbc, 0x47, 0x82, 0x63, 0xfb, 0x3b, 0xf3, 0xef, 0xe3, 0xbd, 0xd0, 0xdc, 0x3a, + 0xd9, 0xbe, 0x17, 0x1a, 0x79, 0xe3, 0x37, 0xe9, 0x62, 0x43, 0x8a, 0x70, 0xf6, 0xde, 0xe0, 0x4e, + 0x5c, 0x2c, 0x68, 0x88, 0x20, 0xd1, 0xf4, 0x05, 0xf8, 0x8b, 0x32, 0x4c, 0xd5, 0xb1, 0xb3, 0xaa, + 0x5d, 0x36, 0x77, 0x1d, 0xa4, 0x89, 0x6e, 0xcf, 0x3d, 0x03, 0xf2, 0x1d, 0xf2, 0x0b, 0xbb, 0xe6, + 0xff, 0x4c, 0xdf, 0xfd, 0x2d, 0xe2, 0xfb, 0x43, 0x49, 0xab, 0x2c, 0x3f, 0x1f, 0xcb, 0x45, 0x64, + 0x77, 0xd4, 0xe7, 0x6e, 0x24, 0x5b, 0x3b, 0x89, 0xf6, 0x4e, 0xa3, 0x8a, 0x4e, 0x1f, 0x96, 0x9f, + 0x92, 0x61, 0xb6, 0x8e, 0x9d, 0x8a, 0xbd, 0xa4, 0xed, 0x99, 0x96, 0xee, 0xe0, 0xf0, 0x3d, 0x9f, + 0xf1, 0xd0, 0x9c, 0x06, 0xd0, 0xfd, 0xdf, 0x58, 0x84, 0xa9, 0x50, 0x0a, 0xfa, 0xad, 0xa4, 0x8e, + 0x42, 0x1c, 0x1f, 0x23, 0x01, 0x21, 0x91, 0x8f, 0x45, 0x5c, 0xf1, 0xe9, 0x03, 0xf1, 0x39, 0x89, + 0x01, 0x51, 0xb4, 0x5a, 0xdb, 0xfa, 0x1e, 0x6e, 0x27, 0x04, 0xc2, 0xfb, 0x2d, 0x00, 0xc2, 0x27, + 0x94, 0xd8, 0x7d, 0x85, 0xe3, 0x63, 0x14, 0xee, 0x2b, 0x71, 0x04, 0xc7, 0x12, 0x24, 0xca, 0xed, + 0x7a, 0xd8, 0x7a, 0xe6, 0xbd, 0xa2, 0x62, 0x0d, 0x4c, 0x36, 0x29, 0x6c, 0xb2, 0x0d, 0xd5, 0xb1, + 0xd0, 0xb2, 0x07, 0xe9, 0x74, 0x36, 0x8d, 0x8e, 0xa5, 0x6f, 0xd1, 0xe9, 0x0b, 0xfd, 0x1d, 0x32, + 0x9c, 0xf0, 0xa3, 0xa7, 0xd4, 0xb1, 0xb3, 0xa8, 0xd9, 0xdb, 0x17, 0x4c, 0xcd, 0x6a, 0xa3, 0xd2, + 0x08, 0x4e, 0xfc, 0xa1, 0xcf, 0x86, 0x41, 0xa8, 0xf2, 0x20, 0xf4, 0x75, 0x15, 0xed, 0xcb, 0xcb, + 0x28, 0x3a, 0x99, 0x58, 0x6f, 0xd6, 0xdf, 0xf1, 0xc1, 0xfa, 0x21, 0x0e, 0xac, 0xbb, 0x87, 0x65, + 0x31, 0x7d, 0xe0, 0x7e, 0x85, 0x8e, 0x08, 0x21, 0xaf, 0xe6, 0x07, 0x45, 0x01, 0x8b, 0xf0, 0x6a, + 0x95, 0x23, 0xbd, 0x5a, 0x87, 0x1a, 0x23, 0x06, 0x7a, 0x24, 0xa7, 0x3b, 0x46, 0x1c, 0xa2, 0xb7, + 0xf1, 0x5b, 0x64, 0x28, 0x90, 0xf0, 0x59, 0x21, 0x8f, 0xef, 0x70, 0x34, 0xea, 0x78, 0x74, 0xf6, + 0x79, 0x97, 0x4f, 0x24, 0xf5, 0x2e, 0x47, 0x6f, 0x4e, 0xea, 0x43, 0xde, 0xcb, 0xed, 0x48, 0x10, + 0x4b, 0xe4, 0x22, 0x3e, 0x80, 0x83, 0xf4, 0x41, 0xfb, 0x6f, 0x32, 0x80, 0xdb, 0xa0, 0xd9, 0xd9, + 0x87, 0x67, 0x89, 0xc2, 0x75, 0x4b, 0xd8, 0xaf, 0xde, 0x05, 0xea, 0x44, 0x0f, 0x50, 0x94, 0x62, + 0x70, 0xaa, 0xe2, 0xd1, 0xa4, 0xbe, 0x95, 0x01, 0x57, 0x23, 0x81, 0x25, 0x91, 0xb7, 0x65, 0x64, + 0xd9, 0xe9, 0x03, 0xf2, 0x3f, 0x24, 0xc8, 0x35, 0xcc, 0x3a, 0x76, 0x0e, 0x6e, 0x0a, 0x24, 0x3e, + 0xb6, 0x4f, 0xca, 0x1d, 0xc5, 0xb1, 0xfd, 0x7e, 0x84, 0xc6, 0x10, 0x8d, 0x4c, 0x82, 0x99, 0x86, + 0x59, 0xf2, 0x17, 0xa7, 0xc4, 0x7d, 0x55, 0xc5, 0xef, 0xd4, 0xf6, 0x2b, 0x18, 0x14, 0x73, 0xa0, + 0x3b, 0xb5, 0x07, 0xd3, 0x4b, 0x5f, 0x6e, 0x77, 0xc0, 0xd1, 0x0d, 0xa3, 0x6d, 0xaa, 0xb8, 0x6d, + 0xb2, 0x95, 0x6e, 0x45, 0x81, 0xec, 0xae, 0xd1, 0x36, 0x09, 0xcb, 0x39, 0x95, 0x3c, 0xbb, 0x69, + 0x16, 0x6e, 0x9b, 0xcc, 0x37, 0x80, 0x3c, 0xa3, 0x2f, 0xcb, 0x90, 0x75, 0xff, 0x15, 0x17, 0xf5, + 0x5b, 0xe4, 0x84, 0x81, 0x08, 0x5c, 0xf2, 0x23, 0xb1, 0x84, 0xee, 0x0d, 0xad, 0xfd, 0x53, 0x0f, + 0xd6, 0xeb, 0xa2, 0xca, 0x0b, 0x89, 0x22, 0x58, 0xf3, 0x57, 0x4e, 0xc1, 0xc4, 0x85, 0x8e, 0xd9, + 0xba, 0x18, 0x9c, 0x97, 0x67, 0xaf, 0xca, 0x4d, 0x90, 0xb3, 0x34, 0x63, 0x0b, 0xb3, 0x3d, 0x85, + 0xe3, 0x3d, 0x7d, 0x21, 0xf1, 0x7a, 0x51, 0x69, 0x16, 0xf4, 0xe6, 0x24, 0x21, 0x10, 0xfa, 0x54, + 0x3e, 0x99, 0x3e, 0x2c, 0x0e, 0x71, 0xb2, 0xac, 0x00, 0x33, 0xa5, 0x22, 0xbd, 0xbd, 0x7e, 0xad, + 0x76, 0xae, 0x5c, 0x90, 0x09, 0xcc, 0xae, 0x4c, 0x52, 0x84, 0xd9, 0x25, 0xff, 0x3d, 0x0b, 0x73, + 0x9f, 0xca, 0x1f, 0x06, 0xcc, 0x1f, 0x95, 0x60, 0x76, 0x55, 0xb7, 0x9d, 0x28, 0x6f, 0xff, 0x98, + 0xe8, 0xb9, 0x2f, 0x4a, 0x6a, 0x2a, 0x73, 0xe5, 0x08, 0x87, 0xcd, 0x4d, 0x64, 0x0e, 0xc7, 0x15, + 0x31, 0x9e, 0x63, 0x29, 0x84, 0x03, 0x7a, 0x87, 0xb4, 0xb0, 0x24, 0x13, 0x1b, 0x4a, 0x41, 0x21, + 0xe3, 0x37, 0x94, 0x22, 0xcb, 0x4e, 0x5f, 0xbe, 0x5f, 0x96, 0xe0, 0x98, 0x5b, 0x7c, 0xdc, 0xb2, + 0x54, 0xb4, 0x98, 0x07, 0x2e, 0x4b, 0x25, 0x5e, 0x19, 0xdf, 0xc7, 0xcb, 0x28, 0x56, 0xc6, 0x07, + 0x11, 0x1d, 0xb3, 0x98, 0x23, 0x96, 0x61, 0x07, 0x89, 0x39, 0x66, 0x19, 0x76, 0x78, 0x31, 0xc7, + 0x2f, 0xc5, 0x0e, 0x29, 0xe6, 0x43, 0x5b, 0x60, 0x7d, 0x8d, 0xec, 0x8b, 0x39, 0x72, 0x6d, 0x23, + 0x46, 0xcc, 0x89, 0x4f, 0xec, 0xa2, 0xb7, 0x0e, 0x29, 0xf8, 0x11, 0xaf, 0x6f, 0x0c, 0x03, 0xd3, + 0x21, 0xae, 0x71, 0xfc, 0xaa, 0x0c, 0x73, 0x8c, 0x8b, 0xfe, 0x53, 0xe6, 0x18, 0x8c, 0x12, 0x4f, + 0x99, 0x13, 0x9f, 0x01, 0xe2, 0x39, 0x1b, 0xff, 0x19, 0xa0, 0xd8, 0xf2, 0xd3, 0x07, 0xe7, 0x2b, + 0x59, 0x38, 0xe9, 0xb2, 0xb0, 0x66, 0xb6, 0xf5, 0xcd, 0xcb, 0x94, 0x8b, 0x73, 0x5a, 0x67, 0x17, + 0xdb, 0xe8, 0x5d, 0x92, 0x28, 0x4a, 0xff, 0x09, 0xc0, 0xec, 0x62, 0x8b, 0x06, 0x52, 0x63, 0x40, + 0xdd, 0x15, 0x55, 0xd9, 0xfd, 0x25, 0xf9, 0x97, 0xc9, 0xd4, 0x3c, 0x22, 0x6a, 0x88, 0x9e, 0x6b, + 0x15, 0x4e, 0xf9, 0x5f, 0x7a, 0x1d, 0x3c, 0x32, 0xfb, 0x1d, 0x3c, 0x6e, 0x04, 0x59, 0x6b, 0xb7, 0x7d, 0xa8, 0x7a, 0x37, 0xb3, 0x49, 0x99, 0xaa, 0x9b, 0xc5, 0xcd, 0x69, 0xe3, 0xe0, 0x68, 0x5e, 0x44, 0x4e, 0x1b, 0x3b, 0xca, 0x3c, 0xe4, 0xe9, 0x0d, 0xd9, 0xfe, 0x8a, 0x7e, 0xff, 0xcc, 0x2c, - 0x17, 0x6f, 0xda, 0xd5, 0x78, 0x35, 0xbc, 0x33, 0x91, 0x64, 0xfa, 0xf5, 0xd3, 0x81, 0x9d, 0xac, - 0x72, 0x0a, 0x76, 0xef, 0xd0, 0x94, 0xc7, 0xb3, 0x1b, 0x56, 0xec, 0x76, 0x3b, 0xfb, 0x0d, 0x16, - 0x7c, 0x25, 0xd1, 0x6e, 0x58, 0x28, 0x86, 0x8b, 0xd4, 0x1b, 0xc3, 0x25, 0xf9, 0x6e, 0x18, 0xc7, - 0xc7, 0x28, 0x76, 0xc3, 0xe2, 0x08, 0xa6, 0x2f, 0xda, 0xaf, 0xe4, 0xa9, 0xd5, 0xcc, 0x62, 0xfb, - 0xbf, 0xa1, 0xbf, 0x67, 0x35, 0xf0, 0xce, 0x2e, 0xfd, 0xc2, 0xfe, 0xc7, 0xde, 0x69, 0xa2, 0x3c, - 0x13, 0xf2, 0x9b, 0xa6, 0xb5, 0xa3, 0x79, 0x1b, 0xf7, 0xbd, 0x27, 0x45, 0x58, 0x3c, 0xfd, 0x25, - 0x92, 0x47, 0x65, 0x79, 0xdd, 0xf9, 0xc8, 0xf3, 0xf4, 0x2e, 0x8b, 0xba, 0xe8, 0x3e, 0x2a, 0x37, - 0xc2, 0x2c, 0x0b, 0xbe, 0x58, 0xc5, 0xb6, 0x83, 0xdb, 0x2c, 0x62, 0x05, 0x9f, 0xa8, 0x9c, 0x87, - 0x19, 0x96, 0xb0, 0xa4, 0x77, 0xb0, 0xcd, 0x82, 0x56, 0x70, 0x69, 0xca, 0x69, 0xc8, 0xeb, 0xf6, - 0x03, 0xb6, 0x69, 0x10, 0xff, 0xff, 0x49, 0x95, 0xbd, 0x29, 0x37, 0xc3, 0x71, 0x96, 0xcf, 0x37, - 0x56, 0xe9, 0x81, 0x9d, 0xde, 0x64, 0x57, 0xb5, 0x0c, 0x73, 0xdd, 0x32, 0xb7, 0x2c, 0x6c, 0xdb, - 0xe4, 0xd4, 0xd4, 0xa4, 0x1a, 0x4a, 0x51, 0x1e, 0x82, 0x13, 0x1d, 0xdd, 0xb8, 0x6c, 0x93, 0x20, - 0xbd, 0x4b, 0xcc, 0x6d, 0x6c, 0xa6, 0x4f, 0xf0, 0xec, 0x50, 0x63, 0x63, 0x72, 0x08, 0xff, 0xa2, - 0x1e, 0xa4, 0x82, 0xda, 0x30, 0x13, 0x7e, 0x57, 0xe6, 0x41, 0xf1, 0x7a, 0x31, 0xfb, 0xe2, 0xb6, - 0xee, 0x60, 0x97, 0x16, 0xeb, 0x6b, 0xfb, 0x7c, 0x71, 0xc5, 0x68, 0x1a, 0x9d, 0x7d, 0xd5, 0x34, - 0x1d, 0xe2, 0xd7, 0xc5, 0x0c, 0x45, 0x3e, 0x11, 0x7d, 0x62, 0x98, 0x99, 0x51, 0xe2, 0x8b, 0x1a, - 0x5c, 0x35, 0xdb, 0x6d, 0xb5, 0x30, 0x6e, 0xb3, 0xa3, 0x5b, 0xde, 0x6b, 0xc2, 0x2b, 0x1c, 0x12, - 0xcf, 0xa3, 0x8e, 0xe8, 0x0e, 0x87, 0xdf, 0x3b, 0x05, 0x79, 0x7a, 0x1f, 0x1a, 0x7a, 0xc5, 0x5c, - 0xdf, 0xd6, 0x36, 0xc7, 0xb7, 0xb6, 0x0d, 0x98, 0x31, 0x4c, 0xb7, 0xb8, 0x75, 0xcd, 0xd2, 0x76, - 0xec, 0xb8, 0x65, 0x52, 0x4a, 0xd7, 0x1f, 0x13, 0xab, 0xa1, 0xdf, 0x56, 0x8e, 0xa9, 0x1c, 0x19, - 0xe5, 0xff, 0x07, 0xc7, 0x2f, 0xb1, 0x10, 0x07, 0x36, 0xa3, 0x2c, 0x45, 0x3b, 0x11, 0xf6, 0x50, - 0x5e, 0xe0, 0xff, 0x5c, 0x39, 0xa6, 0xf6, 0x12, 0x53, 0xbe, 0x0f, 0xe6, 0xdc, 0xd7, 0xb6, 0x79, - 0xc5, 0x63, 0x5c, 0x8e, 0xb6, 0xa4, 0x7a, 0xc8, 0xaf, 0x71, 0x3f, 0xae, 0x1c, 0x53, 0x7b, 0x48, - 0x29, 0x35, 0x80, 0x6d, 0x67, 0xa7, 0xc3, 0x08, 0x67, 0xa3, 0x55, 0xb2, 0x87, 0xf0, 0x8a, 0xff, - 0xd3, 0xca, 0x31, 0x35, 0x44, 0x42, 0x59, 0x85, 0x29, 0xe7, 0x11, 0x87, 0xd1, 0xcb, 0x45, 0xef, - 0xde, 0xf7, 0xd0, 0x6b, 0x78, 0xff, 0xac, 0x1c, 0x53, 0x03, 0x02, 0x4a, 0x05, 0x26, 0xbb, 0x97, - 0x18, 0xb1, 0x7c, 0x74, 0x8b, 0xef, 0x21, 0xb6, 0x7e, 0xc9, 0xa7, 0xe5, 0xff, 0xee, 0x32, 0xd6, - 0xb2, 0xf7, 0x18, 0xad, 0x09, 0x61, 0xc6, 0x4a, 0xde, 0x3f, 0x2e, 0x63, 0x3e, 0x01, 0xa5, 0x02, - 0x53, 0xb6, 0xa1, 0x75, 0xed, 0x6d, 0xd3, 0xb1, 0xcf, 0x4c, 0xf6, 0x38, 0x7a, 0x46, 0x53, 0xab, - 0xb3, 0x7f, 0xd4, 0xe0, 0x6f, 0xe5, 0x99, 0x70, 0x6a, 0x97, 0xdc, 0xff, 0x5f, 0x7e, 0x44, 0xb7, - 0x1d, 0xdd, 0xd8, 0xf2, 0x82, 0xe4, 0xd2, 0xee, 0xb2, 0xff, 0x47, 0x65, 0x9e, 0x1d, 0xf9, 0x02, - 0xd2, 0x36, 0x51, 0xef, 0x6e, 0x23, 0x2d, 0x36, 0x74, 0xd2, 0xeb, 0x39, 0x90, 0x75, 0x3f, 0x91, - 0xee, 0x75, 0xae, 0xff, 0x4a, 0x66, 0xaf, 0xee, 0x90, 0x06, 0xec, 0xfe, 0xd4, 0xd3, 0x43, 0xcf, - 0x1c, 0xe8, 0xa1, 0xcf, 0xc1, 0xb4, 0x6e, 0xaf, 0xe9, 0x5b, 0xd4, 0x3c, 0x64, 0x0e, 0xfd, 0xe1, - 0x24, 0x3a, 0x9d, 0xae, 0xe2, 0x2b, 0xf4, 0x0a, 0x90, 0xe3, 0xde, 0x74, 0xda, 0x4b, 0x41, 0x37, - 0xc1, 0x4c, 0xb8, 0x91, 0xd1, 0x4b, 0x55, 0xf5, 0xc0, 0xb8, 0x64, 0x6f, 0xe8, 0x46, 0x98, 0xe3, - 0x75, 0x3a, 0x34, 0x86, 0xca, 0x5e, 0x57, 0x88, 0x6e, 0x80, 0xe3, 0x3d, 0x0d, 0xcb, 0x0b, 0x9a, - 0x92, 0x09, 0x82, 0xa6, 0x9c, 0x03, 0x08, 0xb4, 0xb8, 0x2f, 0x99, 0xeb, 0x61, 0xca, 0xd7, 0xcb, - 0xbe, 0x19, 0x3e, 0x97, 0x81, 0x49, 0x4f, 0xd9, 0xfa, 0x65, 0x70, 0x07, 0x50, 0x23, 0xb4, 0x43, - 0xc2, 0x86, 0x07, 0x2e, 0xcd, 0x1d, 0x28, 0x03, 0xbf, 0xe4, 0x86, 0xee, 0x74, 0xbc, 0xb3, 0x7d, - 0xbd, 0xc9, 0xca, 0x3a, 0x80, 0x4e, 0x30, 0x6a, 0x04, 0x87, 0xfd, 0x6e, 0x4f, 0xd0, 0x1e, 0xa8, - 0x3e, 0x84, 0x68, 0x9c, 0xff, 0x0e, 0x76, 0x12, 0x6f, 0x0a, 0x72, 0x34, 0x52, 0xfc, 0x31, 0x65, - 0x0e, 0xa0, 0xfc, 0xdc, 0xf5, 0xb2, 0x5a, 0x29, 0x57, 0x4b, 0xe5, 0x42, 0x06, 0xfd, 0xbc, 0x04, - 0x53, 0x7e, 0x23, 0xe8, 0x5b, 0xc9, 0x32, 0x53, 0xad, 0x81, 0xf7, 0x56, 0x1e, 0x6c, 0x54, 0x61, - 0x25, 0x7b, 0x36, 0x5c, 0xbd, 0x6b, 0xe3, 0x25, 0xdd, 0xb2, 0x1d, 0xd5, 0xbc, 0xb2, 0x64, 0x5a, - 0x7e, 0x58, 0x68, 0x16, 0xa2, 0x35, 0xea, 0xb3, 0x6b, 0x32, 0xb5, 0x31, 0x39, 0xf5, 0x85, 0x2d, - 0xb6, 0xf4, 0x1d, 0x24, 0xb8, 0x74, 0x1d, 0x4b, 0x33, 0xec, 0xae, 0x69, 0x63, 0xd5, 0xbc, 0x62, - 0x17, 0x8d, 0x76, 0xc9, 0xec, 0xec, 0xee, 0x18, 0x36, 0x33, 0x7a, 0xa2, 0x3e, 0xbb, 0xd2, 0x21, - 0xb7, 0xd2, 0xce, 0x01, 0x94, 0x6a, 0xab, 0xab, 0xe5, 0x52, 0xa3, 0x52, 0xab, 0x16, 0x8e, 0xb9, - 0xd2, 0x6a, 0x14, 0x17, 0x56, 0x5d, 0xe9, 0x7c, 0x3f, 0x4c, 0x7a, 0x6d, 0x9a, 0xc5, 0x79, 0xc9, - 0x78, 0x71, 0x5e, 0x94, 0x22, 0x4c, 0x7a, 0xad, 0x9c, 0x8d, 0x08, 0x4f, 0xee, 0x3d, 0xd7, 0xbb, - 0xa3, 0x59, 0xd4, 0x46, 0xf0, 0x88, 0x2c, 0x68, 0x36, 0x56, 0xfd, 0xdf, 0xce, 0x3f, 0x8d, 0x71, - 0xa0, 0xc0, 0x5c, 0x71, 0x75, 0xb5, 0x59, 0x53, 0x9b, 0xd5, 0x5a, 0x63, 0xa5, 0x52, 0x5d, 0xa6, - 0x23, 0x64, 0x65, 0xb9, 0x5a, 0x53, 0xcb, 0x74, 0x80, 0xac, 0x17, 0x32, 0xf4, 0x56, 0xe4, 0x85, - 0x49, 0xc8, 0x77, 0x89, 0x74, 0xd1, 0x67, 0xe4, 0x84, 0x07, 0xfa, 0x7d, 0x9c, 0x22, 0xee, 0x6d, - 0xe5, 0x9c, 0xea, 0xa5, 0x3e, 0x87, 0x5e, 0xcf, 0xc3, 0x0c, 0x35, 0x56, 0x6d, 0xb2, 0x3f, 0x41, - 0x90, 0x93, 0x55, 0x2e, 0x0d, 0x7d, 0x40, 0x4a, 0x70, 0xca, 0xbf, 0x2f, 0x47, 0xc9, 0x8c, 0x8b, - 0x3f, 0xcb, 0x0c, 0x77, 0xaf, 0x42, 0xa5, 0xda, 0x28, 0xab, 0xd5, 0xe2, 0x2a, 0xcb, 0x22, 0x2b, - 0x67, 0xe0, 0x64, 0xb5, 0xc6, 0x82, 0x16, 0xd6, 0x9b, 0x8d, 0x5a, 0xb3, 0xb2, 0xb6, 0x5e, 0x53, - 0x1b, 0x85, 0x9c, 0x72, 0x1a, 0x14, 0xfa, 0xdc, 0xac, 0xd4, 0x9b, 0xa5, 0x62, 0xb5, 0x54, 0x5e, - 0x2d, 0x2f, 0x16, 0xf2, 0xca, 0x53, 0xe0, 0x06, 0x7a, 0x4f, 0x4f, 0x6d, 0xa9, 0xa9, 0xd6, 0x2e, - 0xd6, 0x5d, 0x04, 0xd5, 0xf2, 0x6a, 0xd1, 0x55, 0xa4, 0xd0, 0xed, 0xc8, 0x13, 0xca, 0x55, 0x70, - 0x9c, 0x5c, 0x9d, 0xbe, 0x5a, 0x2b, 0x2e, 0xb2, 0xf2, 0x26, 0x95, 0xeb, 0xe0, 0x4c, 0xa5, 0x5a, - 0xdf, 0x58, 0x5a, 0xaa, 0x94, 0x2a, 0xe5, 0x6a, 0xa3, 0xb9, 0x5e, 0x56, 0xd7, 0x2a, 0xf5, 0xba, - 0xfb, 0x6f, 0x61, 0x8a, 0xdc, 0x3d, 0x4b, 0xfb, 0x4c, 0xf4, 0x2e, 0x19, 0x66, 0x2f, 0x68, 0x1d, - 0xdd, 0x1d, 0x28, 0xc8, 0xa5, 0xd4, 0x3d, 0xe7, 0x61, 0x1c, 0x72, 0x79, 0x35, 0xf3, 0xa8, 0x27, - 0x2f, 0xe8, 0x87, 0xe5, 0x84, 0xe7, 0x61, 0x18, 0x10, 0xb4, 0xc4, 0x79, 0xae, 0xb4, 0x88, 0xd9, - 0xdb, 0x6b, 0xa5, 0x04, 0xe7, 0x61, 0xc4, 0xc9, 0x27, 0x03, 0xff, 0x17, 0x46, 0x05, 0x7e, 0x01, - 0x66, 0x36, 0xaa, 0xc5, 0x8d, 0xc6, 0x4a, 0x4d, 0xad, 0x7c, 0x2f, 0x09, 0xa7, 0x3e, 0x0b, 0x53, - 0x4b, 0x35, 0x75, 0xa1, 0xb2, 0xb8, 0x58, 0xae, 0x16, 0x72, 0xca, 0xd5, 0x70, 0x55, 0xbd, 0xac, - 0x5e, 0xa8, 0x94, 0xca, 0xcd, 0x8d, 0x6a, 0xf1, 0x42, 0xb1, 0xb2, 0x4a, 0xfa, 0x88, 0x7c, 0xcc, - 0x85, 0xda, 0x13, 0xe8, 0x07, 0xb3, 0x00, 0xb4, 0xea, 0xe4, 0x36, 0xa1, 0xd0, 0xb5, 0xcb, 0x7f, - 0x9e, 0x74, 0xd2, 0x10, 0x90, 0x89, 0x68, 0xbf, 0x15, 0x98, 0xb4, 0xd8, 0x07, 0xb6, 0x3e, 0x34, - 0x88, 0x0e, 0x7d, 0xf4, 0xa8, 0xa9, 0xfe, 0xef, 0xe8, 0xdd, 0x49, 0xe6, 0x08, 0x91, 0x8c, 0x25, - 0x43, 0x72, 0x69, 0x34, 0x40, 0xa2, 0x97, 0x64, 0x60, 0x8e, 0xaf, 0x98, 0x5b, 0x09, 0x62, 0x4c, - 0x89, 0x55, 0x82, 0xff, 0x39, 0x64, 0x64, 0x9d, 0x7f, 0x06, 0x1b, 0x4e, 0xc1, 0x6b, 0x99, 0xf4, - 0x68, 0xbb, 0x67, 0xb1, 0x14, 0x32, 0x2e, 0xf3, 0xae, 0xd1, 0x51, 0x90, 0x94, 0x09, 0x90, 0x1b, - 0x8f, 0x38, 0x05, 0x19, 0x7d, 0x4e, 0x86, 0x59, 0xee, 0x5e, 0x67, 0xf4, 0xda, 0x8c, 0xc8, 0x9d, - 0xab, 0xa1, 0x1b, 0xa3, 0x33, 0x87, 0xbd, 0x31, 0xfa, 0xfc, 0x6d, 0x30, 0xc1, 0xd2, 0x88, 0x7c, - 0x6b, 0x55, 0xd7, 0x14, 0x38, 0x0e, 0xd3, 0xcb, 0xe5, 0x46, 0xb3, 0xde, 0x28, 0xaa, 0x8d, 0xf2, - 0x62, 0x21, 0xe3, 0x0e, 0x7c, 0xe5, 0xb5, 0xf5, 0xc6, 0x43, 0x05, 0x29, 0xb9, 0x8b, 0x61, 0x2f, - 0x23, 0x63, 0x76, 0x31, 0x8c, 0x2b, 0x3e, 0xfd, 0xb9, 0xea, 0xc7, 0x64, 0x28, 0x50, 0x0e, 0xca, - 0x8f, 0x74, 0xb1, 0xa5, 0x63, 0xa3, 0x85, 0xd1, 0x65, 0x91, 0x90, 0xa6, 0x07, 0x82, 0xfd, 0x91, - 0xfe, 0x3c, 0x64, 0x25, 0xd2, 0x97, 0x1e, 0x03, 0x3b, 0x7b, 0xc0, 0xc0, 0xfe, 0x68, 0x52, 0x1f, - 0xc3, 0x5e, 0x76, 0x47, 0x02, 0xd9, 0x87, 0x93, 0xf8, 0x18, 0x0e, 0xe0, 0x60, 0x2c, 0x91, 0x8a, - 0x23, 0xc6, 0xdf, 0x82, 0x8c, 0x5e, 0x2c, 0xc3, 0xf1, 0x45, 0xcd, 0xc1, 0x0b, 0xfb, 0x0d, 0xef, - 0xde, 0xc5, 0x88, 0xbb, 0x92, 0x33, 0x07, 0xee, 0x4a, 0x0e, 0xae, 0x6e, 0x94, 0x7a, 0xae, 0x6e, - 0x44, 0x6f, 0x4f, 0x7a, 0x2a, 0xb1, 0x87, 0x87, 0x91, 0x85, 0x13, 0x4e, 0x76, 0xda, 0x30, 0x9e, - 0x8b, 0xf4, 0x1b, 0xd8, 0x9b, 0xa7, 0xa0, 0x40, 0x59, 0x09, 0xb9, 0xd1, 0xfd, 0x14, 0xbb, 0x5e, - 0xbc, 0x99, 0x20, 0x6a, 0xa1, 0x17, 0x07, 0x42, 0xe2, 0xe3, 0x40, 0x70, 0xab, 0xb2, 0x72, 0xaf, - 0xeb, 0x43, 0xd2, 0xce, 0x30, 0xe4, 0x33, 0x17, 0x1d, 0x28, 0x36, 0xbd, 0xce, 0x30, 0xb6, 0xf8, - 0xf1, 0x5c, 0x81, 0xcb, 0x2e, 0xaa, 0x2c, 0x8b, 0x22, 0x13, 0x7f, 0xd3, 0x77, 0x52, 0x07, 0x6a, - 0xce, 0x67, 0x31, 0xe6, 0xfa, 0xeb, 0xf4, 0x1c, 0xa8, 0x07, 0x71, 0x90, 0x3e, 0x0a, 0xdf, 0x94, - 0x20, 0x5b, 0x37, 0x2d, 0x67, 0x54, 0x18, 0x24, 0xdd, 0xf4, 0x0d, 0x49, 0xa0, 0x1e, 0x3d, 0xe7, - 0x4c, 0x6f, 0xd3, 0x37, 0xbe, 0xfc, 0x31, 0x04, 0x7e, 0x3c, 0x0e, 0x73, 0x94, 0x13, 0xff, 0x56, - 0x94, 0x6f, 0x48, 0xb4, 0xbf, 0x7a, 0x50, 0x14, 0x91, 0xf3, 0x30, 0x13, 0xda, 0x74, 0xf5, 0x40, - 0xe1, 0xd2, 0xd0, 0x2f, 0x87, 0x71, 0x59, 0xe4, 0x71, 0xe9, 0x37, 0xe3, 0xf6, 0x2f, 0x16, 0x19, - 0x55, 0xcf, 0x94, 0x24, 0x86, 0x64, 0x4c, 0xe1, 0xe9, 0x23, 0xf2, 0xa8, 0x0c, 0x79, 0xe6, 0xf4, - 0x36, 0x52, 0x04, 0x92, 0xb6, 0x0c, 0x5f, 0x08, 0x62, 0xce, 0x71, 0xf2, 0xa8, 0x5b, 0x46, 0x7c, - 0xf9, 0xe9, 0xe3, 0xf0, 0xef, 0xcc, 0x9b, 0xb3, 0xb8, 0xa7, 0xe9, 0x1d, 0xed, 0x52, 0x27, 0x41, - 0xec, 0xe6, 0x0f, 0x24, 0x3c, 0xbf, 0xe6, 0x57, 0x95, 0x2b, 0x2f, 0x42, 0xe2, 0xdf, 0x05, 0x53, - 0xfe, 0x16, 0xa0, 0x7f, 0xbc, 0xbf, 0xc7, 0x93, 0x96, 0x7d, 0x57, 0x83, 0x9c, 0x89, 0x0e, 0xab, - 0x09, 0xf1, 0x33, 0x96, 0xc3, 0x35, 0xd3, 0xc5, 0x76, 0x7b, 0x09, 0x6b, 0xce, 0xae, 0x85, 0xdb, - 0x89, 0x86, 0x08, 0x5e, 0x44, 0x53, 0x61, 0x49, 0x70, 0xd1, 0x13, 0x57, 0x79, 0x74, 0x9e, 0x35, - 0xa0, 0x37, 0xf0, 0x78, 0x19, 0x49, 0x97, 0xf4, 0xeb, 0x3e, 0x24, 0x35, 0x0e, 0x92, 0xe7, 0x0c, - 0xc7, 0x44, 0xfa, 0x80, 0xfc, 0x8c, 0x0c, 0x73, 0xd4, 0x4e, 0x18, 0x35, 0x26, 0xbf, 0x9d, 0xd0, - 0x49, 0x26, 0x74, 0xef, 0x54, 0x98, 0x9d, 0x91, 0xc0, 0x92, 0xc4, 0xa5, 0x46, 0x8c, 0x8f, 0xf4, - 0x91, 0xf9, 0x44, 0x1e, 0x20, 0xe4, 0xf8, 0xf8, 0x81, 0x7c, 0x10, 0xc9, 0x10, 0xbd, 0x85, 0xcd, - 0x3f, 0xea, 0x5c, 0x58, 0xed, 0x90, 0x53, 0xa3, 0xbf, 0x21, 0xc5, 0x27, 0x0a, 0x8d, 0x2a, 0x7f, - 0x96, 0xd0, 0xe6, 0x65, 0x6e, 0x87, 0x03, 0x07, 0xf7, 0x21, 0x7b, 0xb9, 0x0f, 0x26, 0x30, 0x7e, - 0x07, 0xb1, 0x92, 0x0c, 0xb5, 0xd5, 0x21, 0x66, 0xf6, 0x67, 0xe0, 0xa4, 0x5a, 0x2e, 0x2e, 0xd6, - 0xaa, 0xab, 0x0f, 0x85, 0x2f, 0x21, 0x2a, 0xc8, 0xe1, 0xc9, 0x49, 0x2a, 0xb0, 0xbd, 0x3e, 0x61, - 0x1f, 0xc8, 0xcb, 0x2a, 0xf6, 0x8a, 0xfd, 0x0f, 0x27, 0xe8, 0xd5, 0x04, 0xc8, 0x1e, 0x25, 0x0a, - 0x8f, 0x42, 0xa8, 0x19, 0xfd, 0xa8, 0x0c, 0x05, 0x77, 0x3c, 0xa4, 0x5c, 0xb2, 0xdb, 0xe6, 0x6a, - 0xbc, 0x5f, 0x64, 0x97, 0xee, 0x3f, 0x05, 0x7e, 0x91, 0x5e, 0x82, 0x72, 0x13, 0xcc, 0xb5, 0xb6, - 0x71, 0xeb, 0x72, 0xc5, 0xf0, 0xf6, 0xd5, 0xe9, 0x26, 0x6c, 0x4f, 0x2a, 0x0f, 0xcc, 0x83, 0x3c, - 0x30, 0xfc, 0x24, 0x9a, 0x1b, 0xa4, 0xc3, 0x4c, 0x45, 0xe0, 0xf2, 0x07, 0x3e, 0x2e, 0x55, 0x0e, - 0x97, 0xbb, 0x86, 0xa2, 0x9a, 0x0c, 0x96, 0xea, 0x10, 0xb0, 0x20, 0x38, 0x5d, 0x5b, 0x6f, 0x54, - 0x6a, 0xd5, 0xe6, 0x46, 0xbd, 0xbc, 0xd8, 0x5c, 0xf0, 0xc0, 0xa9, 0x17, 0x64, 0xf4, 0x25, 0x09, - 0x26, 0x28, 0x5b, 0x36, 0x7a, 0x6a, 0x00, 0xc1, 0x40, 0x87, 0x50, 0xf4, 0x66, 0xe1, 0xf0, 0x0e, - 0xbe, 0x20, 0x58, 0x39, 0x11, 0xfd, 0xd4, 0xb3, 0x61, 0x82, 0x82, 0xec, 0xad, 0x68, 0x9d, 0x8d, - 0xe8, 0xa5, 0x18, 0x19, 0xd5, 0xcb, 0x2e, 0x18, 0xea, 0x61, 0x00, 0x1b, 0xe9, 0x8f, 0x2c, 0xcf, - 0xcf, 0x52, 0x33, 0xf8, 0xa2, 0xee, 0x6c, 0x13, 0x7f, 0x51, 0xf4, 0x3d, 0x22, 0xcb, 0x8b, 0xb7, - 0x42, 0x6e, 0xcf, 0xcd, 0x3d, 0xc0, 0xf7, 0x96, 0x66, 0x42, 0xbf, 0x20, 0x1c, 0x59, 0x94, 0xd3, - 0x4f, 0x9f, 0xa7, 0x08, 0x70, 0xd6, 0x20, 0xdb, 0xd1, 0x6d, 0x87, 0x8d, 0x1f, 0x77, 0x26, 0x22, - 0xe4, 0x3d, 0x54, 0x1c, 0xbc, 0xa3, 0x12, 0x32, 0xe8, 0x01, 0x98, 0x09, 0xa7, 0x0a, 0xf8, 0x1f, - 0x9f, 0x81, 0x09, 0x76, 0x2e, 0x8e, 0x2d, 0xb1, 0x7a, 0xaf, 0x82, 0xcb, 0x9a, 0x42, 0xb5, 0x4d, - 0x5f, 0x07, 0xfe, 0xef, 0xe3, 0x30, 0xb1, 0xa2, 0xdb, 0x8e, 0x69, 0xed, 0xa3, 0xc7, 0x32, 0x30, - 0x71, 0x01, 0x5b, 0xb6, 0x6e, 0x1a, 0x07, 0x5c, 0x0d, 0xce, 0xc1, 0x74, 0xd7, 0xc2, 0x7b, 0xba, - 0xb9, 0x6b, 0x07, 0x8b, 0x33, 0xe1, 0x24, 0x05, 0xc1, 0xa4, 0xb6, 0xeb, 0x6c, 0x9b, 0x56, 0x10, - 0x4e, 0xc3, 0x7b, 0x57, 0xce, 0x02, 0xd0, 0xe7, 0xaa, 0xb6, 0x83, 0x99, 0x03, 0x45, 0x28, 0x45, - 0x51, 0x20, 0xeb, 0xe8, 0x3b, 0x98, 0xc5, 0xd7, 0x25, 0xcf, 0xae, 0x80, 0x49, 0xac, 0x3a, 0x16, - 0x13, 0x50, 0x56, 0xbd, 0x57, 0xf4, 0x29, 0x19, 0xa6, 0x97, 0xb1, 0xc3, 0x58, 0xb5, 0xd1, 0x4b, - 0x33, 0x42, 0x57, 0x5a, 0xb8, 0x63, 0x6c, 0x47, 0xb3, 0xbd, 0xff, 0xfc, 0x25, 0x58, 0x3e, 0x31, - 0x08, 0xf6, 0x2b, 0x87, 0x23, 0x7d, 0x93, 0xc8, 0x6f, 0x4e, 0x85, 0x3a, 0x96, 0xb2, 0xcc, 0x6c, - 0x13, 0xe4, 0xe0, 0x07, 0xf4, 0x0e, 0x49, 0xf4, 0xd4, 0x34, 0x93, 0xfd, 0x7c, 0xa8, 0x3e, 0x91, - 0xdd, 0xd1, 0xe4, 0x1e, 0xcb, 0x71, 0x20, 0x88, 0x7b, 0x98, 0x12, 0x23, 0xa3, 0xfa, 0xb9, 0x05, - 0xcf, 0x5b, 0x0f, 0xe6, 0x24, 0x7d, 0x6d, 0xfc, 0x9a, 0x0c, 0xd3, 0xf5, 0x6d, 0xf3, 0x8a, 0x27, - 0xc7, 0xef, 0x17, 0x03, 0xf6, 0x3a, 0x98, 0xda, 0xeb, 0x01, 0x35, 0x48, 0x88, 0xbe, 0x64, 0x1e, - 0xbd, 0x48, 0x4e, 0x0a, 0x53, 0x88, 0xb9, 0x91, 0x5f, 0x01, 0xaf, 0x3c, 0x0b, 0x26, 0x18, 0xd7, - 0x6c, 0xc9, 0x25, 0x1e, 0x60, 0x2f, 0x73, 0xb8, 0x82, 0x59, 0xbe, 0x82, 0xc9, 0x90, 0x8f, 0xae, - 0x5c, 0xfa, 0xc8, 0xff, 0xb1, 0x44, 0xa2, 0x6d, 0x78, 0xc0, 0x97, 0x46, 0x00, 0x3c, 0xfa, 0x7a, - 0x46, 0x74, 0x61, 0xd2, 0x97, 0x80, 0xcf, 0xc1, 0xa1, 0xae, 0xab, 0x19, 0x48, 0x2e, 0x7d, 0x79, - 0xfe, 0x7c, 0x16, 0x66, 0x16, 0xf5, 0xcd, 0x4d, 0xbf, 0x93, 0x7c, 0x99, 0x60, 0x27, 0x19, 0xed, - 0x0e, 0xe0, 0xda, 0xb9, 0xbb, 0x96, 0x85, 0x0d, 0xaf, 0x52, 0xac, 0x39, 0xf5, 0xa4, 0x2a, 0x37, - 0xc3, 0x71, 0x6f, 0x5c, 0x08, 0x77, 0x94, 0x53, 0x6a, 0x6f, 0x32, 0xfa, 0xaa, 0xf0, 0xae, 0x96, - 0x27, 0xd1, 0x70, 0x95, 0x22, 0x1a, 0xe0, 0xdd, 0x30, 0xbb, 0x4d, 0x73, 0x93, 0xa9, 0xbf, 0xd7, - 0x59, 0x9e, 0xee, 0x89, 0x66, 0xbc, 0x86, 0x6d, 0x5b, 0xdb, 0xc2, 0x2a, 0x9f, 0xb9, 0xa7, 0xf9, - 0xca, 0x49, 0xee, 0xe6, 0x12, 0xdb, 0x20, 0x13, 0xa8, 0xc9, 0x18, 0xb4, 0xe3, 0x3c, 0x64, 0x97, - 0xf4, 0x0e, 0x46, 0x3f, 0x26, 0xc1, 0x94, 0x8a, 0x5b, 0xa6, 0xd1, 0x72, 0xdf, 0x42, 0xce, 0x41, - 0xff, 0x98, 0x11, 0xbd, 0x93, 0xd2, 0xa5, 0x33, 0xef, 0xd3, 0x88, 0x68, 0x37, 0x62, 0x77, 0x4f, - 0xc6, 0x92, 0x1a, 0xc3, 0x0d, 0x22, 0xee, 0xd4, 0x63, 0x73, 0xb3, 0x63, 0x6a, 0xdc, 0xe2, 0x57, - 0xaf, 0x29, 0x74, 0x0b, 0x14, 0xbc, 0x43, 0x2c, 0xa6, 0xb3, 0xae, 0x1b, 0x86, 0x7f, 0x4a, 0xfa, - 0x40, 0x3a, 0xbf, 0x6f, 0x1b, 0x1b, 0x68, 0x86, 0xd4, 0x9d, 0x95, 0x1e, 0xa1, 0xd9, 0x37, 0xc1, - 0xdc, 0xa5, 0x7d, 0x07, 0xdb, 0x2c, 0x17, 0x2b, 0x36, 0xab, 0xf6, 0xa4, 0x86, 0xc2, 0x44, 0xc7, - 0x05, 0xa4, 0x89, 0x29, 0x30, 0x99, 0xa8, 0x57, 0x86, 0x98, 0x01, 0x9e, 0x84, 0x42, 0xb5, 0xb6, - 0x58, 0x26, 0xbe, 0x6a, 0x9e, 0xf7, 0xcf, 0x16, 0x7a, 0xb9, 0x0c, 0x33, 0xc4, 0x99, 0xc4, 0x43, - 0xe1, 0x06, 0x81, 0xf9, 0x08, 0x7a, 0x5c, 0xd8, 0x8f, 0x8d, 0x54, 0x39, 0x5c, 0x40, 0xb4, 0xa0, - 0x37, 0xf5, 0x4e, 0xaf, 0xa0, 0x73, 0x6a, 0x4f, 0x6a, 0x1f, 0x40, 0xe4, 0xbe, 0x80, 0xfc, 0xa6, - 0x90, 0x33, 0xdb, 0x20, 0xee, 0x8e, 0x0a, 0x95, 0xdf, 0x92, 0x61, 0xda, 0x9d, 0xa4, 0x78, 0xa0, - 0xd4, 0x38, 0x50, 0x4c, 0xa3, 0xb3, 0x1f, 0x2c, 0x8b, 0x78, 0xaf, 0x89, 0x1a, 0xc9, 0x5f, 0x0a, - 0xcf, 0xdc, 0x89, 0x88, 0x42, 0xbc, 0x8c, 0x09, 0xbf, 0xf7, 0x08, 0xcd, 0xe7, 0x07, 0x30, 0x77, - 0x54, 0xf0, 0x7d, 0x21, 0x07, 0xf9, 0x8d, 0x2e, 0x41, 0xee, 0x17, 0x64, 0x91, 0x90, 0xeb, 0x07, - 0x0e, 0x32, 0xb8, 0x66, 0x56, 0xc7, 0x6c, 0x69, 0x9d, 0xf5, 0xe0, 0x44, 0x58, 0x90, 0xa0, 0xdc, - 0xc5, 0x7c, 0x1b, 0xe9, 0x79, 0xc1, 0x9b, 0x62, 0xa3, 0x91, 0x13, 0x19, 0x85, 0x0e, 0x8d, 0xdc, - 0x0a, 0x27, 0xda, 0xba, 0xad, 0x5d, 0xea, 0xe0, 0xb2, 0xd1, 0xb2, 0xf6, 0xa9, 0x38, 0xd8, 0xb4, - 0xea, 0xc0, 0x07, 0xe5, 0x1e, 0xc8, 0xd9, 0xce, 0x7e, 0x87, 0xce, 0x13, 0xc3, 0x67, 0x4c, 0x22, - 0x8b, 0xaa, 0xbb, 0xd9, 0x55, 0xfa, 0x57, 0xd8, 0x45, 0x69, 0x42, 0xf0, 0x42, 0xea, 0x67, 0x40, - 0xde, 0xb4, 0xf4, 0x2d, 0x9d, 0x5e, 0x30, 0x34, 0x77, 0x20, 0xe8, 0x1e, 0x35, 0x05, 0x6a, 0x24, - 0x8b, 0xca, 0xb2, 0x2a, 0xcf, 0x82, 0x29, 0x7d, 0x47, 0xdb, 0xc2, 0x0f, 0xea, 0x06, 0x3d, 0x92, - 0x38, 0x77, 0xc7, 0x99, 0x03, 0xc7, 0x67, 0xd8, 0x77, 0x35, 0xc8, 0x8a, 0xde, 0x23, 0x89, 0x46, - 0x06, 0x22, 0x75, 0xa3, 0xa0, 0x8e, 0xe5, 0x62, 0x6e, 0xf4, 0x1a, 0xa1, 0x98, 0x3d, 0xd1, 0x6c, - 0xa5, 0x3f, 0x78, 0x7f, 0x52, 0x82, 0xc9, 0x45, 0xf3, 0x8a, 0x41, 0x14, 0xfd, 0x4e, 0x31, 0x5b, - 0xb7, 0xcf, 0x21, 0x47, 0xfe, 0xde, 0xcb, 0xd8, 0x13, 0x0d, 0xa4, 0xb6, 0x5e, 0x91, 0x11, 0x30, - 0xc4, 0xb6, 0x1c, 0xc1, 0xdb, 0x08, 0xe3, 0xca, 0x49, 0x5f, 0xae, 0x7f, 0x22, 0x43, 0x76, 0xd1, - 0x32, 0xbb, 0xe8, 0xd7, 0x33, 0x09, 0x5c, 0x16, 0xda, 0x96, 0xd9, 0x6d, 0x90, 0xeb, 0xc4, 0x82, - 0x63, 0x1c, 0xe1, 0x34, 0xe5, 0x4e, 0x98, 0xec, 0x9a, 0xb6, 0xee, 0x78, 0xd3, 0x88, 0xb9, 0x3b, - 0x9e, 0xd4, 0xb7, 0x35, 0xaf, 0xb3, 0x4c, 0xaa, 0x9f, 0xdd, 0xed, 0xb5, 0x89, 0x08, 0x5d, 0xb9, - 0xb8, 0x62, 0xf4, 0xae, 0x54, 0xeb, 0x49, 0x45, 0xaf, 0x08, 0x23, 0xf9, 0x1c, 0x1e, 0xc9, 0x27, - 0xf7, 0x91, 0xb0, 0x65, 0x76, 0x47, 0xb2, 0xc9, 0xf8, 0x2a, 0x1f, 0xd5, 0x7b, 0x39, 0x54, 0x6f, - 0x11, 0x2a, 0x33, 0x7d, 0x44, 0xdf, 0x93, 0x05, 0x20, 0x66, 0xc6, 0x86, 0x3b, 0x01, 0x12, 0xb3, - 0xb1, 0x7e, 0x24, 0x1b, 0x92, 0x65, 0x91, 0x97, 0xe5, 0x53, 0x23, 0xac, 0x18, 0x42, 0x3e, 0x42, - 0xa2, 0x45, 0xc8, 0xed, 0xba, 0x9f, 0x99, 0x44, 0x05, 0x49, 0x90, 0x57, 0x95, 0xfe, 0x89, 0xfe, - 0x38, 0x03, 0x39, 0x92, 0xa0, 0x9c, 0x05, 0x20, 0x03, 0x3b, 0x3d, 0x10, 0x94, 0x21, 0x43, 0x78, - 0x28, 0x85, 0x68, 0xab, 0xde, 0x66, 0x9f, 0xa9, 0xc9, 0x1c, 0x24, 0xb8, 0x7f, 0x93, 0xe1, 0x9e, - 0xd0, 0x62, 0x06, 0x40, 0x28, 0xc5, 0xfd, 0x9b, 0xbc, 0xad, 0xe2, 0x4d, 0x1a, 0xe9, 0x39, 0xab, - 0x06, 0x09, 0xfe, 0xdf, 0xab, 0xfe, 0xfd, 0x60, 0xde, 0xdf, 0x24, 0xc5, 0x9d, 0x0c, 0x13, 0xb5, - 0x5c, 0x08, 0x8a, 0xc8, 0x93, 0x4c, 0xbd, 0xc9, 0xe8, 0xf5, 0xbe, 0xda, 0x2c, 0x72, 0x6a, 0x73, - 0x7b, 0x02, 0xf1, 0xa6, 0xaf, 0x3c, 0x9f, 0xcb, 0xc1, 0x54, 0xd5, 0x6c, 0x33, 0xdd, 0x09, 0x4d, - 0x18, 0x3f, 0x9c, 0x4b, 0x34, 0x61, 0xf4, 0x69, 0x44, 0x28, 0xc8, 0xfd, 0xbc, 0x82, 0x88, 0x51, - 0x08, 0xeb, 0x87, 0xb2, 0x00, 0x79, 0xa2, 0xbd, 0x07, 0x2f, 0x9e, 0x8a, 0x23, 0x41, 0x44, 0xab, - 0xb2, 0x3f, 0xff, 0xc3, 0xe9, 0xd8, 0x7f, 0x85, 0x1c, 0xa9, 0x60, 0xcc, 0xee, 0x0e, 0x5f, 0x51, - 0x29, 0xbe, 0xa2, 0x72, 0x7c, 0x45, 0xb3, 0xbd, 0x15, 0x4d, 0xb2, 0x0e, 0x10, 0xa5, 0x21, 0xe9, - 0xeb, 0xf8, 0x3f, 0x4c, 0x00, 0x54, 0xb5, 0x3d, 0x7d, 0x8b, 0xee, 0x0e, 0x7f, 0xca, 0x9b, 0xff, - 0xb0, 0x7d, 0xdc, 0xff, 0x16, 0x1a, 0x08, 0xef, 0x84, 0x09, 0x36, 0xee, 0xb1, 0x8a, 0x5c, 0xcf, - 0x55, 0x24, 0xa0, 0x42, 0xcd, 0xd2, 0x47, 0x1c, 0xd5, 0xcb, 0xcf, 0xdd, 0x91, 0x2b, 0xf5, 0xdc, - 0x91, 0xdb, 0x7f, 0x0f, 0x22, 0xe2, 0xe6, 0x5c, 0xf4, 0x4e, 0x61, 0x8f, 0xfe, 0x10, 0x3f, 0xa1, - 0x1a, 0x45, 0x34, 0xc1, 0x67, 0xc0, 0x84, 0xe9, 0x6f, 0x68, 0xcb, 0x91, 0xeb, 0x60, 0x15, 0x63, - 0xd3, 0x54, 0xbd, 0x9c, 0x82, 0x9b, 0x5f, 0x42, 0x7c, 0x8c, 0xe5, 0xd0, 0xcc, 0xe9, 0x65, 0x2f, - 0x6a, 0x96, 0x5b, 0x8f, 0x8b, 0xba, 0xb3, 0xbd, 0xaa, 0x1b, 0x97, 0x6d, 0xf4, 0x9f, 0xc5, 0x2c, - 0xc8, 0x10, 0xfe, 0x52, 0x32, 0xfc, 0xf9, 0x98, 0x1d, 0x75, 0x1e, 0xb5, 0x7b, 0xa2, 0xa8, 0xf4, - 0xe7, 0x36, 0x02, 0xc0, 0xbb, 0x20, 0x4f, 0x19, 0x65, 0x9d, 0xe8, 0xf9, 0x48, 0xfc, 0x7c, 0x4a, - 0x2a, 0xfb, 0x03, 0xbd, 0xc3, 0xc7, 0xf1, 0x02, 0x87, 0xe3, 0xc2, 0xa1, 0x38, 0x4b, 0x1d, 0xd2, - 0xf3, 0x4f, 0x87, 0x09, 0x26, 0x69, 0x65, 0x2e, 0xdc, 0x8a, 0x0b, 0xc7, 0x14, 0x80, 0xfc, 0x9a, - 0xb9, 0x87, 0x1b, 0x66, 0x21, 0xe3, 0x3e, 0xbb, 0xfc, 0x35, 0xcc, 0x82, 0x84, 0x5e, 0x3d, 0x09, - 0x93, 0x7e, 0xb8, 0xa2, 0x4f, 0x4a, 0x50, 0x28, 0x59, 0x58, 0x73, 0xf0, 0x92, 0x65, 0xee, 0xd0, - 0x1a, 0x89, 0x7b, 0x87, 0xfe, 0x8c, 0xb0, 0x8b, 0x87, 0x1f, 0x46, 0xa8, 0xb7, 0xb0, 0x08, 0x2c, - 0xe9, 0x22, 0xa4, 0xe4, 0x2d, 0x42, 0xa2, 0x37, 0x09, 0xb9, 0x7c, 0x88, 0x96, 0x92, 0x7e, 0x53, - 0xfb, 0xa8, 0x04, 0xb9, 0x52, 0xc7, 0x34, 0x70, 0xf8, 0x08, 0xd3, 0xc0, 0xb3, 0x32, 0xfd, 0x77, - 0x22, 0xd0, 0xf3, 0x25, 0x51, 0x5b, 0x23, 0x10, 0x80, 0x5b, 0xb6, 0xa0, 0x6c, 0xc5, 0x06, 0xa9, - 0x58, 0xd2, 0xe9, 0x0b, 0xf4, 0x4b, 0x12, 0x4c, 0xd1, 0xb8, 0x38, 0xc5, 0x4e, 0x07, 0x3d, 0x29, - 0x10, 0x6a, 0x9f, 0x90, 0x4f, 0xe8, 0x37, 0x85, 0x5d, 0xf4, 0xfd, 0x5a, 0xf9, 0xb4, 0x13, 0x04, - 0x08, 0x4a, 0xe6, 0x31, 0x2e, 0xb6, 0x97, 0x36, 0x90, 0xa1, 0xf4, 0x45, 0xfd, 0xe7, 0x92, 0x6b, - 0x00, 0x18, 0x97, 0xd7, 0x2d, 0xbc, 0xa7, 0xe3, 0x2b, 0xe8, 0xda, 0x40, 0xd8, 0x07, 0x83, 0x7e, - 0xfc, 0x8a, 0xf0, 0x22, 0x4e, 0x88, 0x64, 0xe4, 0x56, 0xd6, 0x74, 0x27, 0xc8, 0xc4, 0x7a, 0xf1, - 0xde, 0x48, 0x2c, 0x21, 0x32, 0x6a, 0x38, 0xbb, 0xe0, 0x9a, 0x4d, 0x34, 0x17, 0xe9, 0x0b, 0xf6, - 0x7d, 0x13, 0x30, 0xb9, 0x61, 0xd8, 0xdd, 0x8e, 0x66, 0x6f, 0xa3, 0x6f, 0xc8, 0x90, 0xa7, 0xd7, - 0x9d, 0xa1, 0xef, 0xe2, 0x62, 0x0b, 0xfc, 0xc0, 0x2e, 0xb6, 0x3c, 0x17, 0x1c, 0xfa, 0xd2, 0xff, - 0x36, 0x76, 0xf4, 0x1e, 0x59, 0x74, 0x92, 0xea, 0x15, 0x1a, 0xba, 0xf7, 0xbe, 0xff, 0x71, 0xf6, - 0xae, 0xde, 0x72, 0x76, 0x2d, 0xff, 0x6e, 0xef, 0xa7, 0x89, 0x51, 0x59, 0xa7, 0x7f, 0xa9, 0xfe, - 0xef, 0x48, 0x83, 0x09, 0x96, 0x78, 0x60, 0x3b, 0xe9, 0xe0, 0xf9, 0xdb, 0xd3, 0x90, 0xd7, 0x2c, - 0x47, 0xb7, 0x1d, 0xb6, 0xc1, 0xca, 0xde, 0xdc, 0xee, 0x92, 0x3e, 0x6d, 0x58, 0x1d, 0x2f, 0x0a, - 0x89, 0x9f, 0x80, 0x7e, 0x4b, 0x68, 0xfe, 0x18, 0x5f, 0xf3, 0x64, 0x90, 0x3f, 0x38, 0xc4, 0x1a, - 0xf5, 0xd5, 0x70, 0x95, 0x5a, 0x6c, 0x94, 0x9b, 0x34, 0x68, 0x85, 0x1f, 0x9f, 0xa2, 0x8d, 0xde, - 0x2e, 0x87, 0xd6, 0xef, 0xf6, 0xb9, 0x31, 0x82, 0x49, 0x31, 0x18, 0x23, 0xfc, 0x84, 0x98, 0xdd, - 0x6a, 0x6e, 0x11, 0x56, 0x16, 0x5f, 0x84, 0xfd, 0x35, 0xe1, 0xdd, 0x24, 0x5f, 0x94, 0x03, 0xd6, - 0x00, 0xe3, 0xae, 0x43, 0x7a, 0xaf, 0xd0, 0xce, 0xd0, 0xa0, 0x92, 0x8e, 0x10, 0xb6, 0x5f, 0x9e, - 0x80, 0x89, 0x65, 0xad, 0xd3, 0xc1, 0xd6, 0xbe, 0x3b, 0x24, 0x15, 0x3c, 0x0e, 0xd7, 0x34, 0x43, - 0xdf, 0xc4, 0xb6, 0x13, 0xdf, 0x59, 0xbe, 0x53, 0x38, 0xd4, 0x2e, 0x2b, 0x63, 0xbe, 0x97, 0x7e, - 0x84, 0xcc, 0x6f, 0x83, 0xac, 0x6e, 0x6c, 0x9a, 0xac, 0xcb, 0xec, 0x5d, 0xb5, 0xf7, 0x7e, 0x26, - 0x53, 0x17, 0x92, 0x51, 0x30, 0xda, 0xae, 0x20, 0x17, 0xe9, 0xf7, 0x9c, 0xbf, 0x91, 0x85, 0x59, - 0x8f, 0x89, 0x8a, 0xd1, 0xc6, 0x8f, 0x84, 0x97, 0x62, 0x5e, 0x9e, 0x15, 0x3d, 0x0e, 0xd6, 0x5b, - 0x1f, 0x42, 0x2a, 0x42, 0xa4, 0x0d, 0x80, 0x96, 0xe6, 0xe0, 0x2d, 0xd3, 0xd2, 0xfd, 0xfe, 0xf0, - 0x99, 0x49, 0xa8, 0x95, 0xe8, 0xdf, 0xfb, 0x6a, 0x88, 0x8e, 0x72, 0x0f, 0x4c, 0x63, 0xff, 0xfc, - 0xbd, 0xb7, 0x54, 0x13, 0x8b, 0x57, 0x38, 0x3f, 0xfa, 0x73, 0xa1, 0x53, 0x67, 0x22, 0xd5, 0x4c, - 0x86, 0x59, 0x73, 0xb8, 0x36, 0xb4, 0x51, 0x5d, 0x2b, 0xaa, 0xf5, 0x95, 0xe2, 0xea, 0x6a, 0xa5, - 0xba, 0xec, 0x07, 0x7e, 0x51, 0x60, 0x6e, 0xb1, 0x76, 0xb1, 0x1a, 0x8a, 0xcc, 0x93, 0x45, 0xeb, - 0x30, 0xe9, 0xc9, 0xab, 0x9f, 0x2f, 0x66, 0x58, 0x66, 0xcc, 0x17, 0x33, 0x94, 0xe4, 0x1a, 0x67, - 0x7a, 0xcb, 0x77, 0xd0, 0x21, 0xcf, 0xe8, 0x0f, 0x35, 0xc8, 0xd1, 0x68, 0x91, 0x6f, 0x25, 0xdb, - 0x80, 0xdd, 0x8e, 0xd6, 0xc2, 0x68, 0x27, 0x81, 0x35, 0xee, 0xdd, 0xfd, 0x20, 0x1d, 0xb8, 0xfb, - 0x81, 0x3c, 0x32, 0xab, 0xef, 0x64, 0xbf, 0x75, 0x7c, 0x95, 0x66, 0xe1, 0x0f, 0x68, 0xc5, 0xee, - 0xae, 0xd0, 0xe5, 0x7f, 0xc6, 0x66, 0x84, 0x4a, 0x46, 0xf3, 0x94, 0xcc, 0x12, 0x15, 0xdb, 0x87, - 0x89, 0xe3, 0x68, 0x0c, 0xf7, 0x93, 0x67, 0x21, 0x57, 0xef, 0x76, 0x74, 0x07, 0xfd, 0x9c, 0x34, - 0x12, 0xcc, 0xe8, 0x7d, 0x1d, 0xf2, 0xc0, 0xfb, 0x3a, 0x82, 0x5d, 0xd7, 0xac, 0xc0, 0xae, 0x6b, - 0x03, 0x3f, 0xe2, 0xf0, 0xbb, 0xae, 0x77, 0xb2, 0xe0, 0x6d, 0x74, 0xcf, 0xf6, 0xc9, 0x7d, 0x44, - 0x4a, 0xaa, 0xd5, 0x27, 0x2a, 0xe0, 0xf9, 0xa7, 0xb3, 0xe0, 0x64, 0x00, 0xf9, 0x85, 0x5a, 0xa3, - 0x51, 0x5b, 0x2b, 0x1c, 0x23, 0x51, 0x6d, 0x6a, 0xeb, 0x34, 0x54, 0x4c, 0xa5, 0x5a, 0x2d, 0xab, - 0x05, 0x89, 0x84, 0x4b, 0xab, 0x34, 0x56, 0xcb, 0x05, 0x99, 0x0f, 0xde, 0x1e, 0x6b, 0x7e, 0xf3, - 0x65, 0xa7, 0xa9, 0x5e, 0x62, 0x86, 0x78, 0x34, 0x3f, 0xe9, 0x2b, 0xd7, 0x4f, 0xcb, 0x90, 0x5b, - 0xc3, 0xd6, 0x16, 0x46, 0x3f, 0x90, 0x60, 0x93, 0x6f, 0x53, 0xb7, 0x6c, 0x1a, 0x5c, 0x2e, 0xd8, - 0xe4, 0x0b, 0xa7, 0x29, 0x37, 0xc2, 0xac, 0x8d, 0x5b, 0xa6, 0xd1, 0xf6, 0x32, 0xd1, 0xfe, 0x88, - 0x4f, 0xe4, 0x2f, 0xce, 0x17, 0x80, 0x8c, 0x30, 0x3a, 0x92, 0x9d, 0xba, 0x24, 0xc0, 0xf4, 0x2b, - 0x35, 0x7d, 0x60, 0xbe, 0x2a, 0xbb, 0x3f, 0x75, 0xf7, 0xd1, 0x2b, 0x85, 0x77, 0x5f, 0x6f, 0x85, - 0x3c, 0x51, 0x53, 0x6f, 0x8c, 0xee, 0xdf, 0x1f, 0xb3, 0x3c, 0xca, 0x02, 0x9c, 0xb0, 0x71, 0x07, - 0xb7, 0x1c, 0xdc, 0x76, 0x9b, 0xae, 0x3a, 0xb0, 0x53, 0x38, 0x98, 0x1d, 0xfd, 0x69, 0x18, 0xc0, - 0xbb, 0x79, 0x00, 0x6f, 0xea, 0x23, 0x4a, 0xb7, 0x42, 0xd1, 0xb6, 0xb2, 0x5b, 0x8d, 0x7a, 0xc7, - 0xf4, 0x17, 0xc5, 0xbd, 0x77, 0xf7, 0xdb, 0xb6, 0xb3, 0xd3, 0x21, 0xdf, 0xd8, 0x01, 0x03, 0xef, - 0x5d, 0x99, 0x87, 0x09, 0xcd, 0xd8, 0x27, 0x9f, 0xb2, 0x31, 0xb5, 0xf6, 0x32, 0xa1, 0x57, 0xfb, - 0xc8, 0xdf, 0xc7, 0x21, 0xff, 0x54, 0x31, 0x76, 0xd3, 0x07, 0xfe, 0x87, 0x27, 0x20, 0xb7, 0xae, - 0xd9, 0x0e, 0x46, 0xff, 0x97, 0x2c, 0x8a, 0xfc, 0x4d, 0x30, 0xb7, 0x69, 0xb6, 0x76, 0x6d, 0xdc, - 0xe6, 0x1b, 0x65, 0x4f, 0xea, 0x28, 0x30, 0x57, 0x6e, 0x81, 0x82, 0x97, 0xc8, 0xc8, 0x7a, 0xdb, - 0xf0, 0x07, 0xd2, 0x49, 0x28, 0x70, 0x7b, 0x5d, 0xb3, 0x9c, 0xda, 0x26, 0x8d, 0x61, 0xed, 0x85, - 0x02, 0x0f, 0x27, 0x72, 0xd0, 0xe7, 0x63, 0xa0, 0x9f, 0x88, 0x86, 0x7e, 0x52, 0x00, 0x7a, 0xa5, - 0x08, 0x93, 0x9b, 0x7a, 0x07, 0x93, 0x1f, 0xa6, 0xc8, 0x0f, 0xfd, 0xc6, 0x24, 0x22, 0x7b, 0x7f, - 0x4c, 0x5a, 0xd2, 0x3b, 0x58, 0xf5, 0x7f, 0xf3, 0x26, 0x32, 0x10, 0x4c, 0x64, 0x56, 0xa9, 0x3f, - 0xad, 0x6b, 0x78, 0x19, 0xda, 0x0e, 0xf6, 0x16, 0xdf, 0x0c, 0x76, 0xb8, 0xa5, 0xad, 0x39, 0x1a, - 0x01, 0x63, 0x46, 0x25, 0xcf, 0xbc, 0x5f, 0x88, 0xdc, 0xeb, 0x17, 0xf2, 0x42, 0x39, 0x59, 0x8f, - 0xe8, 0x31, 0x1b, 0xd1, 0xa2, 0x2e, 0x79, 0x00, 0x51, 0x4b, 0xd1, 0x7f, 0x77, 0x81, 0x69, 0x69, - 0x16, 0x76, 0xd6, 0xc3, 0x9e, 0x18, 0x39, 0x95, 0x4f, 0x24, 0xae, 0x7c, 0x76, 0x5d, 0xdb, 0xc1, - 0xa4, 0xb0, 0x92, 0xfb, 0x8d, 0xb9, 0x68, 0x1d, 0x48, 0x0f, 0xfa, 0xdf, 0xdc, 0xa8, 0xfb, 0xdf, - 0x7e, 0x75, 0x4c, 0xbf, 0x19, 0xbe, 0x36, 0x0b, 0x72, 0x69, 0xd7, 0x79, 0x42, 0x77, 0xbf, 0xdf, - 0x14, 0xf6, 0x73, 0x61, 0xfd, 0x59, 0xe4, 0x4d, 0xf9, 0x63, 0xea, 0x7d, 0x13, 0x6a, 0x89, 0x98, - 0x3f, 0x4d, 0x54, 0xdd, 0xd2, 0xd7, 0x91, 0x5f, 0x97, 0x7d, 0x07, 0xcb, 0x47, 0x33, 0x87, 0x37, - 0xcd, 0x11, 0xed, 0x9f, 0x42, 0x3d, 0x83, 0xff, 0xee, 0x75, 0x3c, 0x59, 0x2e, 0x56, 0x1f, 0xd9, - 0x5e, 0x27, 0xa2, 0x9c, 0x51, 0xe9, 0x0b, 0xfa, 0x79, 0x61, 0xb7, 0x73, 0x2a, 0xb6, 0x58, 0x57, - 0xc2, 0x64, 0x36, 0x95, 0xd8, 0x6d, 0xa8, 0x31, 0xc5, 0x8e, 0xe1, 0x26, 0x8d, 0xb0, 0xab, 0x60, - 0xf1, 0xd0, 0x88, 0xa1, 0xd7, 0x08, 0x6f, 0x47, 0xd1, 0x6a, 0x0f, 0x58, 0x2f, 0x4c, 0x26, 0x6f, - 0xb1, 0xcd, 0xaa, 0xd8, 0x82, 0xd3, 0x97, 0xf8, 0x97, 0x65, 0xc8, 0xd3, 0x2d, 0x48, 0xf4, 0xc6, - 0x4c, 0x82, 0x6b, 0xe4, 0x1d, 0xde, 0x85, 0xd0, 0x7f, 0x4f, 0xb2, 0xe6, 0xc0, 0xb9, 0x1a, 0x66, - 0x13, 0xb9, 0x1a, 0xf2, 0xe7, 0x38, 0x05, 0xda, 0x11, 0xad, 0x63, 0xca, 0xd3, 0xc9, 0x24, 0x2d, - 0xac, 0x2f, 0x43, 0xe9, 0xe3, 0xfd, 0xa3, 0x39, 0x98, 0xa1, 0x45, 0x5f, 0xd4, 0xdb, 0x5b, 0xd8, - 0x41, 0x6f, 0x97, 0xbe, 0x75, 0x50, 0x57, 0xaa, 0x30, 0x73, 0x85, 0xb0, 0xbd, 0xaa, 0xed, 0x9b, - 0xbb, 0x0e, 0x5b, 0xb9, 0xb8, 0x25, 0x76, 0xdd, 0x83, 0xd6, 0x73, 0x9e, 0xfe, 0xa1, 0x72, 0xff, - 0xbb, 0x32, 0xa6, 0x0b, 0xfe, 0xd4, 0x81, 0x2b, 0x4f, 0x8c, 0xac, 0x70, 0x92, 0x72, 0x1a, 0xf2, - 0x7b, 0x3a, 0xbe, 0x52, 0x69, 0x33, 0xeb, 0x96, 0xbd, 0xa1, 0xdf, 0x15, 0xde, 0xb7, 0x0d, 0xc3, - 0xcd, 0x78, 0x49, 0x57, 0x0b, 0xc5, 0x76, 0x6f, 0x07, 0xb2, 0x35, 0x86, 0x33, 0xc5, 0xfc, 0x6d, - 0xa3, 0xa5, 0x04, 0x8a, 0x18, 0x65, 0x38, 0xf3, 0xa1, 0x3c, 0x62, 0x4f, 0xac, 0x50, 0x01, 0x8c, - 0xf8, 0x22, 0x52, 0xb1, 0xf8, 0x12, 0x03, 0x8a, 0x4e, 0x5f, 0xf2, 0xaf, 0x97, 0x61, 0xaa, 0x8e, - 0x9d, 0x25, 0x1d, 0x77, 0xda, 0x36, 0xb2, 0x0e, 0x6f, 0x1a, 0xdd, 0x06, 0xf9, 0x4d, 0x42, 0x6c, - 0xd0, 0xb9, 0x05, 0x96, 0x0d, 0xbd, 0x56, 0x12, 0xdd, 0x11, 0x66, 0xab, 0x6f, 0x1e, 0xb7, 0x23, - 0x81, 0x49, 0xcc, 0xa3, 0x37, 0xbe, 0xe4, 0x31, 0x04, 0xb6, 0x95, 0x61, 0x86, 0x5d, 0x4f, 0x58, - 0xec, 0xe8, 0x5b, 0x06, 0xda, 0x1d, 0x41, 0x0b, 0x51, 0x6e, 0x87, 0x9c, 0xe6, 0x52, 0x63, 0x5b, - 0xaf, 0xa8, 0x6f, 0xe7, 0x49, 0xca, 0x53, 0x69, 0xc6, 0x04, 0x61, 0x24, 0x03, 0xc5, 0xf6, 0x78, - 0x1e, 0x63, 0x18, 0xc9, 0x81, 0x85, 0xa7, 0x8f, 0xd8, 0x67, 0x65, 0x38, 0xc9, 0x18, 0xb8, 0x80, - 0x2d, 0x47, 0x6f, 0x69, 0x1d, 0x8a, 0xdc, 0x4b, 0x32, 0xa3, 0x80, 0x6e, 0x05, 0x66, 0xf7, 0xc2, - 0x64, 0x19, 0x84, 0xe7, 0xfb, 0x42, 0xc8, 0x31, 0xa0, 0xf2, 0x3f, 0x26, 0x08, 0xc7, 0xc7, 0x49, - 0x95, 0xa3, 0x39, 0xc6, 0x70, 0x7c, 0xc2, 0x4c, 0xa4, 0x0f, 0xf1, 0x2b, 0x58, 0x68, 0x9e, 0xa0, - 0xfb, 0xfc, 0x94, 0x30, 0xb6, 0x1b, 0x30, 0x4d, 0xb0, 0xa4, 0x3f, 0xb2, 0x65, 0x88, 0x18, 0x25, - 0xf6, 0xfb, 0x1d, 0x76, 0x61, 0x98, 0xff, 0xaf, 0x1a, 0xa6, 0x83, 0x2e, 0x02, 0x04, 0x9f, 0xc2, - 0x9d, 0x74, 0x26, 0xaa, 0x93, 0x96, 0xc4, 0x3a, 0xe9, 0x5f, 0x11, 0x0e, 0x96, 0xd2, 0x9f, 0xed, - 0xc3, 0xab, 0x87, 0x58, 0x98, 0x8c, 0xc1, 0xa5, 0xa7, 0xaf, 0x17, 0xaf, 0xce, 0xf6, 0xde, 0x43, - 0xff, 0x81, 0x91, 0xcc, 0xa7, 0xc2, 0xfd, 0x81, 0xdc, 0xd3, 0x1f, 0x1c, 0xc2, 0x92, 0xbe, 0x19, - 0x8e, 0xd3, 0x22, 0x4a, 0x3e, 0x5b, 0x39, 0x1a, 0x0a, 0xa2, 0x27, 0x19, 0x7d, 0x70, 0x08, 0x25, - 0x18, 0x74, 0x49, 0x7e, 0x5c, 0x27, 0x97, 0xcc, 0xd8, 0x4d, 0xaa, 0x20, 0x47, 0x77, 0xb7, 0xfe, - 0x97, 0xb2, 0xd4, 0xda, 0xdd, 0x20, 0x77, 0xba, 0xa1, 0xbf, 0xc8, 0x8e, 0x62, 0x44, 0xb8, 0x1f, - 0xb2, 0xc4, 0xc5, 0x5d, 0x8e, 0x5c, 0xd2, 0x08, 0x8a, 0x0c, 0x2e, 0xdc, 0xc3, 0x8f, 0x38, 0x2b, - 0xc7, 0x54, 0xf2, 0xa7, 0x72, 0x0b, 0x1c, 0xbf, 0xa4, 0xb5, 0x2e, 0x6f, 0x59, 0xe6, 0x2e, 0xb9, - 0xfd, 0xca, 0x64, 0xd7, 0x68, 0x91, 0xeb, 0x08, 0xf9, 0x0f, 0xca, 0x1d, 0x9e, 0xe9, 0x90, 0x1b, - 0x64, 0x3a, 0xac, 0x1c, 0x63, 0xc6, 0x83, 0xf2, 0x74, 0xbf, 0xd3, 0xc9, 0xc7, 0x76, 0x3a, 0x2b, - 0xc7, 0xbc, 0x6e, 0x47, 0x59, 0x84, 0xc9, 0xb6, 0xbe, 0x47, 0xb6, 0xaa, 0xc9, 0xac, 0x6b, 0xd0, - 0xd1, 0xe5, 0x45, 0x7d, 0x8f, 0x6e, 0x6c, 0xaf, 0x1c, 0x53, 0xfd, 0x3f, 0x95, 0x65, 0x98, 0x22, - 0xdb, 0x02, 0x84, 0xcc, 0x64, 0xa2, 0x63, 0xc9, 0x2b, 0xc7, 0xd4, 0xe0, 0x5f, 0xd7, 0xfa, 0xc8, - 0x92, 0xb3, 0x1f, 0xf7, 0x79, 0xdb, 0xed, 0x99, 0x44, 0xdb, 0xed, 0xae, 0x2c, 0xe8, 0x86, 0xfb, - 0x69, 0xc8, 0xb5, 0x88, 0x84, 0x25, 0x26, 0x61, 0xfa, 0xaa, 0xdc, 0x0d, 0xd9, 0x1d, 0xcd, 0xf2, - 0x26, 0xcf, 0x37, 0x0d, 0xa6, 0xbb, 0xa6, 0x59, 0x97, 0x5d, 0x04, 0xdd, 0xbf, 0x16, 0x26, 0x20, - 0x47, 0x04, 0xe7, 0x3f, 0xa0, 0x5f, 0xcf, 0x52, 0x33, 0xa4, 0x64, 0x1a, 0xee, 0xb0, 0xdf, 0x30, - 0xbd, 0x03, 0x32, 0xbf, 0x9b, 0x19, 0x8d, 0x05, 0xd9, 0xf7, 0xe2, 0x76, 0x39, 0xf2, 0xe2, 0xf6, - 0x9e, 0x1b, 0x84, 0xb3, 0xbd, 0x37, 0x08, 0x07, 0xcb, 0x07, 0xb9, 0xc1, 0x8e, 0x2a, 0x7f, 0x3a, - 0x84, 0xe9, 0xd2, 0x2b, 0x88, 0xe8, 0x19, 0x78, 0x47, 0x37, 0x42, 0x75, 0xf6, 0x5e, 0x13, 0x76, - 0x4a, 0x49, 0x8d, 0x9a, 0x01, 0xec, 0xa5, 0xdf, 0x37, 0xfd, 0x6a, 0x16, 0xce, 0xd0, 0x7b, 0xaa, - 0xf7, 0x70, 0xc3, 0xe4, 0xef, 0x9b, 0x44, 0x7f, 0x34, 0x12, 0xa5, 0xe9, 0x33, 0xe0, 0xc8, 0x7d, - 0x07, 0x9c, 0x03, 0x87, 0x94, 0xb3, 0x03, 0x0e, 0x29, 0xe7, 0x92, 0xad, 0x1c, 0xfe, 0x4e, 0x58, - 0x7f, 0xd6, 0x79, 0xfd, 0xb9, 0x2b, 0x02, 0xa0, 0x7e, 0x72, 0x19, 0x89, 0x7d, 0xf3, 0x56, 0x5f, - 0x53, 0xea, 0x9c, 0xa6, 0xdc, 0x37, 0x3c, 0x23, 0xe9, 0x6b, 0xcb, 0x6f, 0x67, 0xe1, 0xaa, 0x80, - 0x99, 0x2a, 0xbe, 0xc2, 0x14, 0xe5, 0x93, 0x23, 0x51, 0x94, 0xe4, 0x31, 0x10, 0xd2, 0xd6, 0x98, - 0x3f, 0x16, 0x3e, 0x3b, 0xd4, 0x0b, 0x94, 0x2f, 0x9b, 0x08, 0x65, 0x39, 0x0d, 0x79, 0xda, 0xc3, - 0x30, 0x68, 0xd8, 0x5b, 0xc2, 0xee, 0x46, 0xec, 0xc4, 0x91, 0x28, 0x6f, 0x63, 0xd0, 0x1f, 0xb6, - 0xae, 0xd1, 0xd8, 0xb5, 0x8c, 0x8a, 0xe1, 0x98, 0xe8, 0x87, 0x46, 0xa2, 0x38, 0xbe, 0x37, 0x9c, - 0x3c, 0x8c, 0x37, 0xdc, 0x50, 0xab, 0x1c, 0x5e, 0x0d, 0x8e, 0x64, 0x95, 0x23, 0xa2, 0xf0, 0xf4, - 0xf1, 0x7b, 0x8b, 0x0c, 0xa7, 0xd9, 0x64, 0x6b, 0x81, 0xb7, 0x10, 0xd1, 0x43, 0xa3, 0x00, 0xf2, - 0xa4, 0x67, 0x26, 0xb1, 0x5b, 0xce, 0xc8, 0x0b, 0x7f, 0x52, 0x2a, 0xf6, 0x7e, 0x07, 0x6e, 0x3a, - 0xd8, 0xc3, 0xe1, 0x48, 0x90, 0x12, 0xbb, 0xd6, 0x21, 0x01, 0x1b, 0xe9, 0x63, 0xf6, 0x32, 0x19, - 0xf2, 0xf4, 0x9c, 0x16, 0xda, 0x48, 0xc5, 0x61, 0x82, 0x8f, 0xf2, 0x2c, 0xb0, 0x23, 0x97, 0xf8, - 0x92, 0xfb, 0xf4, 0xf6, 0xe2, 0x8e, 0xe8, 0x16, 0xfb, 0xaf, 0x4a, 0x30, 0x5d, 0xc7, 0x4e, 0x49, - 0xb3, 0x2c, 0x5d, 0xdb, 0x1a, 0x95, 0xc7, 0xb7, 0xa8, 0xf7, 0x30, 0xfa, 0x5a, 0x46, 0xf4, 0x3c, - 0x8d, 0xbf, 0x10, 0xee, 0xb1, 0x1a, 0x11, 0x4b, 0xf0, 0x31, 0xa1, 0x33, 0x33, 0x83, 0xa8, 0x8d, - 0xc1, 0x63, 0x5b, 0x82, 0x09, 0xef, 0x2c, 0xde, 0x6d, 0xdc, 0xf9, 0xcc, 0x6d, 0x67, 0xc7, 0x3b, - 0x06, 0x43, 0x9e, 0x0f, 0x9e, 0x01, 0x43, 0xaf, 0x4a, 0xe8, 0x28, 0x1f, 0x7f, 0x90, 0x30, 0x59, - 0x1b, 0x4b, 0xe2, 0x0e, 0x7f, 0x54, 0x47, 0x07, 0x7f, 0x73, 0x82, 0x2d, 0x47, 0xae, 0x6a, 0x0e, - 0x7e, 0x04, 0x7d, 0x4a, 0x86, 0x89, 0x3a, 0x76, 0xdc, 0xf1, 0x96, 0xbb, 0xdc, 0x74, 0x58, 0x0d, - 0x57, 0x42, 0x2b, 0x1e, 0x53, 0x6c, 0x0d, 0xe3, 0x01, 0x98, 0xea, 0x5a, 0x66, 0x0b, 0xdb, 0x36, - 0x5b, 0xbd, 0x08, 0x3b, 0xaa, 0xf5, 0x1b, 0xfd, 0x09, 0x6b, 0xf3, 0xeb, 0xde, 0x3f, 0x6a, 0xf0, - 0x7b, 0x52, 0x33, 0x80, 0x52, 0x62, 0x15, 0x1c, 0xb7, 0x19, 0x10, 0x57, 0x78, 0xfa, 0x40, 0x7f, - 0x5c, 0x86, 0x99, 0x3a, 0x76, 0x7c, 0x29, 0x26, 0xd8, 0xe4, 0x88, 0x86, 0x97, 0x83, 0x52, 0x3e, - 0x1c, 0x94, 0xe2, 0x57, 0x03, 0xf2, 0xd2, 0xf4, 0x89, 0x8d, 0xf1, 0x6a, 0x40, 0x31, 0x0e, 0xc6, - 0x70, 0x7c, 0xed, 0xc9, 0x30, 0x45, 0x78, 0x21, 0x0d, 0xf6, 0xc7, 0xb3, 0x41, 0xe3, 0xfd, 0x74, - 0x4a, 0x8d, 0xf7, 0x1e, 0xc8, 0xed, 0x68, 0xd6, 0x65, 0x9b, 0x34, 0xdc, 0x69, 0x11, 0xb3, 0x7d, - 0xcd, 0xcd, 0xae, 0xd2, 0xbf, 0xfa, 0xfb, 0x69, 0xe6, 0x92, 0xf9, 0x69, 0x3e, 0x26, 0x25, 0x1a, - 0x09, 0xe9, 0xdc, 0x61, 0x84, 0x4d, 0x3e, 0xc1, 0xb8, 0x19, 0x53, 0x76, 0xfa, 0xca, 0xf1, 0x12, - 0x19, 0x26, 0xdd, 0x71, 0x9b, 0xd8, 0xe3, 0x17, 0x0f, 0xaf, 0x0e, 0xfd, 0x0d, 0xfd, 0x84, 0x3d, - 0xb0, 0x27, 0x91, 0xd1, 0x99, 0xf7, 0x09, 0x7a, 0xe0, 0xb8, 0xc2, 0xd3, 0xc7, 0xe3, 0x6d, 0x14, - 0x0f, 0xd2, 0x1e, 0xd0, 0x2f, 0xc9, 0x20, 0x2f, 0x63, 0x67, 0xdc, 0x56, 0xe4, 0x9b, 0x85, 0x43, - 0x1c, 0x71, 0x02, 0x23, 0x3c, 0xcf, 0x2f, 0xe3, 0xd1, 0x34, 0x20, 0xb1, 0xd8, 0x46, 0x42, 0x0c, - 0xa4, 0x8f, 0xda, 0xbb, 0x28, 0x6a, 0x74, 0x73, 0xe1, 0x07, 0x47, 0xd0, 0xab, 0x8e, 0x77, 0xe1, - 0xc3, 0x13, 0x20, 0xa1, 0x71, 0x54, 0xed, 0xad, 0x5f, 0xe1, 0x63, 0xb9, 0x8a, 0x0f, 0xdc, 0xc6, - 0xbe, 0x8d, 0x5b, 0x97, 0x71, 0x1b, 0x7d, 0xdf, 0xe1, 0xa1, 0x3b, 0x03, 0x13, 0x2d, 0x4a, 0x8d, - 0x80, 0x37, 0xa9, 0x7a, 0xaf, 0x09, 0xee, 0x95, 0xe6, 0x3b, 0x22, 0xfa, 0xfb, 0x18, 0xef, 0x95, - 0x16, 0x28, 0x7e, 0x0c, 0x66, 0x0b, 0x9d, 0x65, 0x54, 0x5a, 0xa6, 0x81, 0xfe, 0xcb, 0xe1, 0x61, - 0xb9, 0x0e, 0xa6, 0xf4, 0x96, 0x69, 0x90, 0x30, 0x14, 0xde, 0x21, 0x20, 0x3f, 0xc1, 0xfb, 0x5a, - 0xde, 0x31, 0x1f, 0xd6, 0xd9, 0xae, 0x79, 0x90, 0x30, 0xac, 0x31, 0xe1, 0xb2, 0x7e, 0x54, 0xc6, - 0x44, 0x9f, 0xb2, 0xd3, 0x87, 0xec, 0x83, 0x81, 0x77, 0x1b, 0xed, 0x0a, 0x9f, 0x10, 0xab, 0xc0, - 0xc3, 0x0c, 0x67, 0xe1, 0x5a, 0x1c, 0xc9, 0x70, 0x16, 0xc3, 0xc0, 0x18, 0x6e, 0xac, 0x08, 0x70, - 0x4c, 0x7d, 0x0d, 0xf8, 0x10, 0xe8, 0x8c, 0xce, 0x3c, 0x1c, 0x12, 0x9d, 0xa3, 0x31, 0x11, 0xdf, - 0xcb, 0x42, 0x64, 0x32, 0x8b, 0x07, 0xfd, 0xd7, 0x51, 0x80, 0x73, 0xd7, 0x30, 0xfe, 0x0a, 0xd4, - 0x5b, 0x21, 0xc1, 0x8d, 0xd8, 0x07, 0x24, 0xe8, 0x52, 0x19, 0xe3, 0x5d, 0xf1, 0x22, 0xe5, 0xa7, - 0x0f, 0xe0, 0x8b, 0x65, 0x98, 0x23, 0x3e, 0x02, 0x1d, 0xac, 0x59, 0xb4, 0xa3, 0x1c, 0x89, 0xa3, - 0xfc, 0xdb, 0x84, 0x03, 0xfc, 0xf0, 0x72, 0x08, 0xf8, 0x18, 0x09, 0x14, 0x62, 0xd1, 0x7d, 0x04, - 0x59, 0x18, 0xcb, 0x36, 0x4a, 0xc1, 0x67, 0x81, 0xa9, 0xf8, 0x68, 0xf0, 0x48, 0xe8, 0x91, 0xcb, - 0x0b, 0xc3, 0x6b, 0x6c, 0x63, 0xf6, 0xc8, 0x15, 0x61, 0x22, 0x7d, 0x4c, 0x7e, 0xe9, 0x76, 0xb6, - 0xe0, 0xdc, 0x20, 0x17, 0xc6, 0xbf, 0x26, 0xeb, 0x9f, 0x68, 0xfb, 0xf8, 0x48, 0x3c, 0x30, 0x0f, - 0x11, 0x10, 0x5f, 0x81, 0xac, 0x65, 0x5e, 0xa1, 0x4b, 0x5b, 0xb3, 0x2a, 0x79, 0xa6, 0xd7, 0x53, - 0x76, 0x76, 0x77, 0x0c, 0x7a, 0x32, 0x74, 0x56, 0xf5, 0x5e, 0x95, 0x1b, 0x61, 0xf6, 0x8a, 0xee, - 0x6c, 0xaf, 0x60, 0xad, 0x8d, 0x2d, 0xd5, 0xbc, 0x42, 0x3c, 0xe6, 0x26, 0x55, 0x3e, 0x91, 0xf7, - 0x5f, 0x11, 0xb0, 0x2f, 0xc9, 0x2d, 0xf2, 0x63, 0x39, 0xfe, 0x96, 0xc4, 0xf2, 0x8c, 0xe6, 0x2a, - 0x7d, 0x85, 0x79, 0xb7, 0x0c, 0x53, 0xaa, 0x79, 0x85, 0x29, 0xc9, 0xff, 0x71, 0xb4, 0x3a, 0x92, - 0x78, 0xa2, 0x47, 0x24, 0xe7, 0xb3, 0x3f, 0xf6, 0x89, 0x5e, 0x6c, 0xf1, 0x63, 0x39, 0xb9, 0x34, - 0xa3, 0x9a, 0x57, 0xea, 0xd8, 0xa1, 0x2d, 0x02, 0x35, 0x47, 0xe4, 0x64, 0xad, 0xdb, 0x94, 0x20, - 0x9b, 0x87, 0xfb, 0xef, 0x49, 0x77, 0x11, 0x7c, 0x01, 0xf9, 0x2c, 0x8e, 0x7b, 0x17, 0x61, 0x20, - 0x07, 0x63, 0x88, 0x91, 0x22, 0xc3, 0xb4, 0x6a, 0x5e, 0x71, 0x87, 0x86, 0x25, 0xbd, 0xd3, 0x19, - 0xcd, 0x08, 0x99, 0xd4, 0xf8, 0xf7, 0xc4, 0xe0, 0x71, 0x31, 0x76, 0xe3, 0x7f, 0x00, 0x03, 0xe9, - 0xc3, 0xf0, 0x42, 0xda, 0x58, 0xbc, 0x11, 0xda, 0x18, 0x0d, 0x0e, 0xc3, 0x36, 0x08, 0x9f, 0x8d, - 0x23, 0x6b, 0x10, 0x51, 0x1c, 0x8c, 0x65, 0xe7, 0x64, 0xae, 0x44, 0x86, 0xf9, 0xd1, 0xb6, 0x89, - 0x77, 0x24, 0x73, 0x4d, 0x64, 0xc3, 0x2e, 0xc7, 0xc8, 0x48, 0xd0, 0x48, 0xe0, 0x82, 0x28, 0xc0, - 0x43, 0xfa, 0x78, 0xfc, 0x9e, 0x0c, 0x33, 0x94, 0x85, 0x27, 0x88, 0x15, 0x30, 0x54, 0xa3, 0x0a, - 0xd7, 0xe0, 0x68, 0x1a, 0x55, 0x0c, 0x07, 0x63, 0xb9, 0x15, 0xd4, 0xb5, 0xe3, 0x86, 0x38, 0x3e, - 0x1e, 0x85, 0xe0, 0xd0, 0xc6, 0xd8, 0x08, 0x8f, 0x90, 0x0f, 0x63, 0x8c, 0x1d, 0xd1, 0x31, 0xf2, - 0x17, 0xfa, 0xad, 0x68, 0x94, 0x18, 0x1c, 0xa2, 0x29, 0x8c, 0x10, 0x86, 0x21, 0x9b, 0xc2, 0x11, - 0x21, 0xf1, 0x39, 0x19, 0x80, 0x32, 0xb0, 0x66, 0xee, 0x91, 0xcb, 0x7c, 0x46, 0xd0, 0x9d, 0xf5, - 0xba, 0xd5, 0xcb, 0x03, 0xdc, 0xea, 0x13, 0x86, 0x70, 0x49, 0xba, 0x12, 0x18, 0x92, 0xb2, 0x5b, - 0xc9, 0xb1, 0xaf, 0x04, 0xc6, 0x97, 0x9f, 0x3e, 0xc6, 0x8f, 0x53, 0x6b, 0x2e, 0x38, 0x60, 0xfa, - 0xb3, 0x23, 0x41, 0x39, 0x34, 0xfb, 0x97, 0xf9, 0xd9, 0xff, 0x21, 0xb0, 0x1d, 0xd6, 0x46, 0x1c, - 0x74, 0x70, 0x34, 0x7d, 0x1b, 0xf1, 0xe8, 0x0e, 0x88, 0xfe, 0x60, 0x16, 0x8e, 0xb3, 0x4e, 0xe4, - 0x5b, 0x01, 0xe2, 0x84, 0xe7, 0xf0, 0xb8, 0x4e, 0x72, 0x00, 0xca, 0xa3, 0x5a, 0x90, 0x4a, 0xb2, - 0x94, 0x29, 0xc0, 0xde, 0x58, 0x56, 0x37, 0xf2, 0xe5, 0x47, 0xba, 0x9a, 0xd1, 0x16, 0x0f, 0xf7, - 0x3b, 0x00, 0x78, 0x6f, 0xad, 0x51, 0xe6, 0xd7, 0x1a, 0xfb, 0xac, 0x4c, 0x26, 0xde, 0xb9, 0x26, - 0x22, 0xa3, 0xec, 0x8e, 0x7d, 0xe7, 0x3a, 0xba, 0xec, 0xf4, 0x51, 0x7a, 0x87, 0x0c, 0xd9, 0xba, - 0x69, 0x39, 0xe8, 0x45, 0x49, 0x5a, 0x27, 0x95, 0x7c, 0x00, 0x92, 0xf7, 0xae, 0x94, 0xb8, 0x5b, - 0x9a, 0x6f, 0x8b, 0x3f, 0xea, 0xac, 0x39, 0x1a, 0xf1, 0xea, 0x76, 0xcb, 0x0f, 0x5d, 0xd7, 0x9c, - 0x34, 0x9e, 0x0e, 0x95, 0x5f, 0x3d, 0xfa, 0x00, 0x46, 0x6a, 0xf1, 0x74, 0x22, 0x4b, 0x4e, 0x1f, - 0xb7, 0xd7, 0x1d, 0x67, 0xbe, 0xad, 0x4b, 0x7a, 0x07, 0xa3, 0x17, 0x51, 0x97, 0x91, 0xaa, 0xb6, - 0x83, 0xc5, 0x8f, 0xc4, 0xc4, 0xba, 0xb6, 0x92, 0xf8, 0xb2, 0x72, 0x10, 0x5f, 0x36, 0x69, 0x83, - 0xa2, 0x07, 0xd0, 0x29, 0x4b, 0xe3, 0x6e, 0x50, 0x31, 0x65, 0x8f, 0x25, 0x4e, 0xe7, 0x89, 0x3a, - 0x76, 0xa8, 0x51, 0x59, 0xf3, 0x6e, 0x60, 0xf9, 0xfe, 0x91, 0x44, 0xec, 0xf4, 0x2f, 0x78, 0x91, - 0x7b, 0x2e, 0x78, 0x79, 0x77, 0x18, 0x9c, 0x35, 0x1e, 0x9c, 0xef, 0x8e, 0x16, 0x10, 0xcf, 0xe4, - 0x48, 0x60, 0x7a, 0xb3, 0x0f, 0xd3, 0x3a, 0x07, 0xd3, 0xdd, 0x43, 0x72, 0x91, 0x3e, 0x60, 0x3f, - 0x91, 0x83, 0xe3, 0x74, 0xd2, 0x5f, 0x34, 0xda, 0x2c, 0xc2, 0xea, 0x1b, 0xa5, 0x23, 0xde, 0x6c, - 0x3b, 0x18, 0x82, 0x95, 0x8b, 0xe5, 0x9c, 0xeb, 0xbd, 0x1d, 0x7f, 0x81, 0x86, 0x73, 0x75, 0x3b, - 0x51, 0xb2, 0xd3, 0x26, 0x7e, 0x43, 0xbe, 0xff, 0x1f, 0x7f, 0x97, 0xd1, 0x84, 0xf8, 0x5d, 0x46, - 0x7f, 0x92, 0x6c, 0xdd, 0x8e, 0x14, 0xdd, 0x23, 0xf0, 0x94, 0x6d, 0xa7, 0x04, 0x2b, 0x7a, 0x02, - 0xdc, 0x7d, 0x7b, 0xb8, 0x93, 0x05, 0x11, 0x44, 0x86, 0x74, 0x27, 0x23, 0x04, 0x8e, 0xd2, 0x9d, - 0x6c, 0x10, 0x03, 0x63, 0xb8, 0xd5, 0x3e, 0xc7, 0x76, 0xf3, 0x49, 0xbb, 0x41, 0x7f, 0x25, 0xa5, - 0x3e, 0x4a, 0x7f, 0x3d, 0x93, 0xc8, 0xff, 0x99, 0xf0, 0x15, 0x3f, 0x4c, 0x27, 0xf1, 0x68, 0x8e, - 0x23, 0x37, 0x86, 0x75, 0x23, 0x89, 0xf8, 0xa2, 0x5f, 0xd4, 0xdb, 0xce, 0xf6, 0x88, 0x4e, 0x74, - 0x5c, 0x71, 0x69, 0x79, 0xd7, 0x23, 0x93, 0x17, 0xf4, 0x6f, 0x99, 0x44, 0x21, 0xa4, 0x7c, 0x91, - 0x10, 0xb6, 0x22, 0x44, 0x9c, 0x20, 0xf0, 0x53, 0x2c, 0xbd, 0x31, 0x6a, 0xf4, 0x05, 0xbd, 0x8d, - 0xcd, 0x27, 0xa0, 0x46, 0x13, 0xbe, 0x46, 0xa7, 0xd1, 0x71, 0xe4, 0xbe, 0x4d, 0x35, 0xda, 0x17, - 0xc9, 0x88, 0x34, 0x3a, 0x96, 0x5e, 0xfa, 0x32, 0x7e, 0xd5, 0x0c, 0x9b, 0x48, 0xad, 0xea, 0xc6, - 0x65, 0xf4, 0xcf, 0x79, 0xef, 0x62, 0xe6, 0x8b, 0xba, 0xb3, 0xcd, 0x62, 0xc1, 0xfc, 0xb6, 0xf0, - 0xdd, 0x28, 0x43, 0xc4, 0x7b, 0xe1, 0xc3, 0x49, 0xe5, 0x0e, 0x84, 0x93, 0x2a, 0xc2, 0xac, 0x6e, - 0x38, 0xd8, 0x32, 0xb4, 0xce, 0x52, 0x47, 0xdb, 0xb2, 0xcf, 0x4c, 0xf4, 0xbd, 0xbc, 0xae, 0x12, - 0xca, 0xa3, 0xf2, 0x7f, 0x84, 0xaf, 0xaf, 0x9c, 0xe4, 0xaf, 0xaf, 0x8c, 0x88, 0x7e, 0x35, 0x15, - 0x1d, 0xfd, 0xca, 0x8f, 0x6e, 0x05, 0x83, 0x83, 0x63, 0x8b, 0xda, 0xc6, 0x09, 0xc3, 0xfd, 0xdd, - 0x26, 0x18, 0x85, 0xcd, 0x0f, 0xfd, 0xf8, 0x8b, 0x72, 0xa2, 0xd5, 0x3d, 0x57, 0x11, 0xe6, 0x7b, - 0x95, 0x20, 0xb1, 0x85, 0x1a, 0xae, 0xbc, 0xdc, 0x53, 0x79, 0xdf, 0xe4, 0xc9, 0x0a, 0x98, 0x3c, - 0x61, 0xa5, 0xca, 0x89, 0x29, 0x55, 0x92, 0xc5, 0x42, 0x91, 0xda, 0x8e, 0xe1, 0x34, 0x52, 0x0e, - 0x4e, 0x78, 0xd1, 0x6e, 0xbb, 0x5d, 0xac, 0x59, 0x9a, 0xd1, 0xc2, 0xe8, 0x83, 0xd2, 0x28, 0xcc, - 0xde, 0x25, 0x98, 0xd4, 0x5b, 0xa6, 0x51, 0xd7, 0x9f, 0xe7, 0x5d, 0x2e, 0x17, 0x1f, 0x64, 0x9d, - 0x48, 0xa4, 0xc2, 0xfe, 0x50, 0xfd, 0x7f, 0x95, 0x0a, 0x4c, 0xb5, 0x34, 0xab, 0x4d, 0x83, 0xf0, - 0xe5, 0x7a, 0x2e, 0x72, 0x8a, 0x24, 0x54, 0xf2, 0x7e, 0x51, 0x83, 0xbf, 0x95, 0x1a, 0x2f, 0xc4, - 0x7c, 0x4f, 0x34, 0x8f, 0x48, 0x62, 0x8b, 0xc1, 0x4f, 0x9c, 0xcc, 0x5d, 0xe9, 0x58, 0xb8, 0x43, - 0xee, 0xa0, 0xa7, 0x3d, 0xc4, 0x94, 0x1a, 0x24, 0x24, 0x5d, 0x1e, 0x20, 0x45, 0x1d, 0x40, 0x63, - 0xdc, 0xcb, 0x03, 0x42, 0x5c, 0xa4, 0xaf, 0x99, 0x6f, 0xcd, 0xc3, 0x2c, 0xed, 0xd5, 0x98, 0x38, - 0xd1, 0x8b, 0xc9, 0x15, 0xd2, 0xce, 0x83, 0x78, 0x1f, 0xd5, 0x0f, 0x3f, 0x26, 0x17, 0x40, 0xbe, - 0xec, 0x07, 0x1c, 0x74, 0x1f, 0x93, 0xee, 0xdb, 0x7b, 0x7c, 0xcd, 0x53, 0x9e, 0xc6, 0xbd, 0x6f, - 0x1f, 0x5f, 0x7c, 0xfa, 0xf8, 0xfc, 0xa4, 0x0c, 0x72, 0xb1, 0xdd, 0x46, 0xad, 0xc3, 0x43, 0x71, - 0x0e, 0xa6, 0xbd, 0x36, 0x13, 0xc4, 0x80, 0x0c, 0x27, 0x25, 0x5d, 0x04, 0xf5, 0x65, 0x53, 0x6c, - 0x8f, 0x7d, 0x57, 0x21, 0xa6, 0xec, 0xf4, 0x41, 0xf9, 0xd9, 0x09, 0xd6, 0x68, 0x16, 0x4c, 0xf3, - 0x32, 0x39, 0x2a, 0xf3, 0x22, 0x19, 0x72, 0x4b, 0xd8, 0x69, 0x6d, 0x8f, 0xa8, 0xcd, 0xec, 0x5a, - 0x1d, 0xaf, 0xcd, 0x1c, 0xb8, 0x0f, 0x7f, 0xb0, 0x0d, 0xeb, 0xb1, 0x35, 0x4f, 0x58, 0x1a, 0x77, - 0x74, 0xe7, 0xd8, 0xd2, 0xd3, 0x07, 0xe7, 0xdf, 0x64, 0x98, 0xf3, 0x57, 0xb8, 0x28, 0x26, 0x3f, - 0x91, 0x79, 0xa2, 0xad, 0x77, 0xa2, 0x4f, 0x26, 0x0b, 0x91, 0xe6, 0xcb, 0x94, 0xaf, 0x59, 0xca, - 0x0b, 0x8b, 0x09, 0x82, 0xa7, 0x89, 0x31, 0x38, 0x86, 0x19, 0xbc, 0x0c, 0x93, 0x84, 0xa1, 0x45, - 0x7d, 0x8f, 0xb8, 0x0e, 0x72, 0x0b, 0x8d, 0xcf, 0x1f, 0xc9, 0x42, 0xe3, 0xdd, 0xfc, 0x42, 0xa3, - 0x60, 0xc4, 0x63, 0x6f, 0x9d, 0x31, 0xa1, 0x2f, 0x8d, 0xfb, 0xff, 0xc8, 0x97, 0x19, 0x13, 0xf8, - 0xd2, 0x0c, 0x28, 0x3f, 0x7d, 0x44, 0x7f, 0xf1, 0x3f, 0xb1, 0xce, 0xd6, 0xdb, 0x50, 0x45, 0xff, - 0xf3, 0x04, 0x64, 0x2f, 0xb8, 0x0f, 0xff, 0x3b, 0xb8, 0x11, 0xeb, 0x95, 0x23, 0x08, 0xce, 0x70, - 0x2f, 0x64, 0x5d, 0xfa, 0x6c, 0xda, 0x72, 0x8b, 0xd8, 0xee, 0xae, 0xcb, 0x88, 0x4a, 0xfe, 0x53, - 0x4e, 0x43, 0xde, 0x36, 0x77, 0xad, 0x96, 0x6b, 0x3e, 0xbb, 0x1a, 0xc3, 0xde, 0x92, 0x06, 0x25, - 0xe5, 0x48, 0xcf, 0x8f, 0xce, 0x65, 0x34, 0x74, 0x41, 0x92, 0xcc, 0x5d, 0x90, 0x94, 0x60, 0xff, - 0x40, 0x80, 0xb7, 0xf4, 0x35, 0xe2, 0xaf, 0xc8, 0x5d, 0x81, 0xed, 0x51, 0xc1, 0x1e, 0x21, 0x96, - 0xc3, 0xaa, 0x43, 0x52, 0x87, 0x6f, 0x5e, 0xb4, 0x7e, 0x1c, 0xf8, 0xb1, 0x3a, 0x7c, 0x0b, 0xf0, - 0x30, 0x96, 0x53, 0xea, 0x79, 0xe6, 0xa4, 0xfa, 0xd0, 0x28, 0xd1, 0xcd, 0x72, 0x4a, 0x7f, 0x28, - 0x74, 0x46, 0xe8, 0xbc, 0x3a, 0x34, 0x3a, 0x47, 0xe4, 0xbe, 0xfa, 0xfb, 0x32, 0x89, 0x84, 0xe9, - 0x19, 0x39, 0xe2, 0x17, 0x1d, 0x25, 0x86, 0xc8, 0x1d, 0x83, 0xb9, 0x38, 0xd0, 0xb3, 0xc3, 0x87, - 0x06, 0xe7, 0x45, 0x17, 0xe2, 0x7f, 0xdc, 0xa1, 0xc1, 0x45, 0x19, 0x49, 0x1f, 0xc8, 0x37, 0xd0, - 0x8b, 0xc5, 0x8a, 0x2d, 0x47, 0xdf, 0x1b, 0x71, 0x4b, 0xe3, 0x87, 0x97, 0x84, 0xd1, 0x80, 0x0f, - 0x48, 0x88, 0x72, 0x38, 0xee, 0x68, 0xc0, 0x62, 0x6c, 0xa4, 0x0f, 0xd3, 0xdf, 0xe6, 0x5d, 0xe9, - 0xb1, 0xb5, 0x99, 0x5f, 0x62, 0xab, 0x01, 0xf8, 0xf0, 0x68, 0x9d, 0x87, 0x99, 0xd0, 0xd4, 0xdf, - 0xbb, 0xb0, 0x86, 0x4b, 0x4b, 0x7a, 0xd0, 0xdd, 0x17, 0xd9, 0xc8, 0x17, 0x06, 0x12, 0x2c, 0xf8, - 0x8a, 0x30, 0x31, 0x96, 0xfb, 0xe0, 0xbc, 0x31, 0x6c, 0x4c, 0x58, 0xfd, 0x76, 0x18, 0xab, 0x1a, - 0x8f, 0xd5, 0x9d, 0x22, 0x62, 0x12, 0x1b, 0xd3, 0x84, 0xe6, 0x8d, 0x6f, 0xf1, 0xe1, 0x52, 0x39, - 0xb8, 0xee, 0x1d, 0x9a, 0x8f, 0xf4, 0x11, 0xfb, 0x39, 0xda, 0x1d, 0xd6, 0xa9, 0xc9, 0x3e, 0x9a, - 0xee, 0x90, 0xcd, 0x06, 0x64, 0x6e, 0x36, 0x90, 0xd0, 0xdf, 0x3e, 0x70, 0x23, 0xf5, 0x98, 0x1b, - 0x04, 0x51, 0x76, 0xc4, 0xfe, 0xf6, 0x03, 0x39, 0x48, 0x1f, 0x9c, 0x7f, 0x94, 0x01, 0x96, 0x2d, - 0x73, 0xb7, 0x5b, 0xb3, 0xda, 0xd8, 0x42, 0x7f, 0x13, 0x4c, 0x00, 0x5e, 0x3e, 0x82, 0x09, 0xc0, - 0x3a, 0xc0, 0x96, 0x4f, 0x9c, 0x69, 0xf8, 0xed, 0x62, 0xe6, 0x7e, 0xc0, 0x94, 0x1a, 0xa2, 0xc1, - 0x5f, 0x39, 0xfb, 0x3d, 0x3c, 0xc6, 0x71, 0x7d, 0x56, 0x40, 0x6e, 0x94, 0x13, 0x80, 0xb7, 0xf9, - 0x58, 0x37, 0x38, 0xac, 0xef, 0x3f, 0x04, 0x27, 0xe9, 0x63, 0xfe, 0x4f, 0x13, 0x30, 0x4d, 0xb7, - 0xeb, 0xa8, 0x4c, 0xff, 0x3e, 0x00, 0xfd, 0x67, 0x47, 0x00, 0xfa, 0x06, 0xcc, 0x98, 0x01, 0x75, - 0xda, 0xa7, 0x86, 0x17, 0x60, 0x62, 0x61, 0x0f, 0xf1, 0xa5, 0x72, 0x64, 0xd0, 0xfb, 0xc3, 0xc8, - 0xab, 0x3c, 0xf2, 0x77, 0xc7, 0xc8, 0x3b, 0x44, 0x71, 0x94, 0xd0, 0xbf, 0xdd, 0x87, 0x7e, 0x83, - 0x83, 0xbe, 0x78, 0x18, 0x56, 0xc6, 0x10, 0x6e, 0x5f, 0x86, 0x2c, 0x39, 0x1d, 0xf7, 0xab, 0x29, - 0xce, 0xef, 0xcf, 0xc0, 0x04, 0x69, 0xb2, 0xfe, 0xbc, 0xc3, 0x7b, 0x75, 0xbf, 0x68, 0x9b, 0x0e, - 0xb6, 0x7c, 0x8f, 0x05, 0xef, 0xd5, 0xe5, 0xc1, 0xf3, 0x4a, 0xb6, 0xcf, 0xe4, 0xe9, 0x46, 0xa4, - 0x9f, 0x30, 0xf4, 0xa4, 0x24, 0x2c, 0xf1, 0x91, 0x9d, 0x97, 0x1b, 0x66, 0x52, 0x32, 0x80, 0x91, - 0xf4, 0x81, 0xff, 0x8b, 0x2c, 0x9c, 0xa1, 0xab, 0x4a, 0x4b, 0x96, 0xb9, 0xd3, 0x73, 0xbb, 0x95, - 0x7e, 0x78, 0x5d, 0xb8, 0x09, 0xe6, 0x1c, 0xce, 0x1f, 0x9b, 0xe9, 0x44, 0x4f, 0x2a, 0xfa, 0xd3, - 0xb0, 0x4f, 0xc5, 0x73, 0x79, 0x24, 0x17, 0x62, 0x04, 0x18, 0xc5, 0x7b, 0xe2, 0x85, 0x7a, 0x41, - 0x46, 0x43, 0x8b, 0x54, 0xf2, 0x50, 0x6b, 0x96, 0xbe, 0x4e, 0xe5, 0x44, 0x74, 0xea, 0x3d, 0xbe, - 0x4e, 0x7d, 0x1f, 0xa7, 0x53, 0xcb, 0x87, 0x17, 0x49, 0xfa, 0xba, 0xf5, 0x1a, 0x7f, 0x63, 0xc8, - 0xdf, 0xb6, 0xdb, 0x49, 0x61, 0xb3, 0x2e, 0xec, 0x8f, 0x94, 0xe5, 0xfc, 0x91, 0xf8, 0xfb, 0x28, - 0x12, 0xcc, 0x84, 0x79, 0xae, 0x23, 0x74, 0x69, 0x0e, 0x24, 0xdd, 0xe3, 0x4e, 0xd2, 0xdb, 0x43, - 0xcd, 0x75, 0x63, 0x0b, 0x1a, 0xc3, 0xda, 0xd2, 0x1c, 0xe4, 0x97, 0xf4, 0x8e, 0x83, 0x2d, 0xf4, - 0x38, 0x9b, 0xe9, 0xbe, 0x26, 0xc5, 0x01, 0x60, 0x11, 0xf2, 0x9b, 0xa4, 0x34, 0x66, 0x32, 0xdf, - 0x2a, 0xd6, 0x7a, 0x28, 0x87, 0x2a, 0xfb, 0x37, 0x69, 0x74, 0xbe, 0x1e, 0x32, 0x23, 0x9b, 0x22, - 0x27, 0x88, 0xce, 0x37, 0x98, 0x85, 0xb1, 0x5c, 0x4c, 0x95, 0x57, 0xf1, 0x8e, 0x3b, 0xc6, 0x5f, - 0x4e, 0x0f, 0xe1, 0x02, 0xc8, 0x7a, 0xdb, 0x26, 0x9d, 0xe3, 0x94, 0xea, 0x3e, 0x26, 0xf5, 0x15, - 0xea, 0x15, 0x15, 0x65, 0x79, 0xdc, 0xbe, 0x42, 0x42, 0x5c, 0xa4, 0x8f, 0xd9, 0xd7, 0x89, 0xa3, - 0x68, 0xb7, 0xa3, 0xb5, 0xb0, 0xcb, 0x7d, 0x6a, 0xa8, 0xd1, 0x9e, 0x2c, 0xeb, 0xf5, 0x64, 0xa1, - 0x76, 0x9a, 0x3b, 0x44, 0x3b, 0x1d, 0x76, 0x19, 0xd2, 0x97, 0x39, 0xa9, 0xf8, 0x91, 0x2d, 0x43, - 0xc6, 0xb2, 0x31, 0x86, 0x6b, 0x47, 0xbd, 0x83, 0xb4, 0x63, 0x6d, 0xad, 0xc3, 0x6e, 0xd2, 0x30, - 0x61, 0x8d, 0xec, 0xd0, 0xec, 0x30, 0x9b, 0x34, 0xd1, 0x3c, 0x8c, 0x01, 0xad, 0x39, 0x86, 0xd6, - 0x27, 0xd8, 0x30, 0x9a, 0xf2, 0x3e, 0xa9, 0x6d, 0x5a, 0x4e, 0xb2, 0x7d, 0x52, 0x97, 0x3b, 0x95, - 0xfc, 0x97, 0xf4, 0xe0, 0x15, 0x7f, 0xae, 0x7a, 0x54, 0xc3, 0x67, 0x82, 0x83, 0x57, 0x83, 0x18, - 0x48, 0x1f, 0xde, 0x37, 0x1d, 0xd1, 0xe0, 0x39, 0x6c, 0x73, 0x64, 0x6d, 0x60, 0x64, 0x43, 0xe7, - 0x30, 0xcd, 0x31, 0x9a, 0x87, 0xf4, 0xf1, 0xfa, 0x4a, 0x68, 0xe0, 0xfc, 0x95, 0x31, 0x0e, 0x9c, - 0x5e, 0xcb, 0xcc, 0x0d, 0xd9, 0x32, 0x87, 0xdd, 0xff, 0x61, 0xb2, 0x1e, 0xdd, 0x80, 0x39, 0xcc, - 0xfe, 0x4f, 0x0c, 0x13, 0xe9, 0x23, 0xfe, 0x46, 0x19, 0x72, 0xf5, 0xf1, 0x8f, 0x97, 0xc3, 0xce, - 0x45, 0x88, 0xac, 0xea, 0x23, 0x1b, 0x2e, 0x87, 0x99, 0x8b, 0x44, 0xb2, 0x30, 0x86, 0xc0, 0xfb, - 0xc7, 0x61, 0x86, 0x2c, 0x89, 0x78, 0xdb, 0xac, 0x5f, 0x61, 0xa3, 0xe6, 0x63, 0x29, 0xb6, 0xd5, - 0x07, 0x60, 0xd2, 0xdb, 0xbf, 0x63, 0x23, 0xe7, 0xbc, 0x58, 0xfb, 0xf4, 0xb8, 0x54, 0xfd, 0xff, - 0x0f, 0xe5, 0x0c, 0x31, 0xf2, 0xbd, 0xda, 0x61, 0x9d, 0x21, 0x8e, 0x74, 0xbf, 0xf6, 0x4f, 0x82, - 0x11, 0xf5, 0xbf, 0xa4, 0x87, 0x79, 0xef, 0x3e, 0x6e, 0xb6, 0xcf, 0x3e, 0xee, 0x07, 0xc3, 0x58, - 0xd6, 0x79, 0x2c, 0xef, 0x11, 0x15, 0xe1, 0x08, 0xc7, 0xda, 0x77, 0xf8, 0x70, 0x5e, 0xe0, 0xe0, - 0x5c, 0x38, 0x14, 0x2f, 0x63, 0x38, 0xf8, 0x98, 0x0d, 0xc6, 0xdc, 0x0f, 0xa5, 0xd8, 0x8e, 0x7b, - 0x4e, 0x55, 0x64, 0x0f, 0x9c, 0xaa, 0xe0, 0x5a, 0x7a, 0xee, 0x90, 0x2d, 0xfd, 0x43, 0x61, 0xed, - 0x68, 0xf0, 0xda, 0x71, 0xaf, 0x38, 0x22, 0xa3, 0x1b, 0x99, 0xdf, 0xe9, 0xab, 0xc7, 0x45, 0x4e, - 0x3d, 0x4a, 0x87, 0x63, 0x26, 0x7d, 0xfd, 0xf8, 0x03, 0x6f, 0x42, 0x7b, 0xc4, 0xed, 0x7d, 0xd8, - 0xad, 0x62, 0x4e, 0x88, 0x23, 0x1b, 0xb9, 0x87, 0xd9, 0x2a, 0x1e, 0xc4, 0xc9, 0x18, 0x62, 0xb1, - 0xcd, 0xc2, 0x34, 0xe1, 0xe9, 0xa2, 0xde, 0xde, 0xc2, 0x0e, 0xfa, 0x45, 0xea, 0xa3, 0xe8, 0x45, - 0xbe, 0x1c, 0x51, 0x78, 0xa2, 0xa8, 0xf3, 0xae, 0x49, 0x3d, 0x3a, 0x28, 0x93, 0xf3, 0x21, 0x06, - 0xc7, 0x1d, 0x41, 0x71, 0x20, 0x07, 0xe9, 0x43, 0xf6, 0x7e, 0xea, 0x6e, 0xb3, 0xaa, 0xed, 0x9b, - 0xbb, 0x0e, 0x7a, 0x74, 0x04, 0x1d, 0xf4, 0x02, 0xe4, 0x3b, 0x84, 0x1a, 0x3b, 0x96, 0x11, 0x3f, - 0xdd, 0x61, 0x22, 0xa0, 0xe5, 0xab, 0xec, 0xcf, 0xa4, 0x67, 0x33, 0x02, 0x39, 0x52, 0x3a, 0xe3, - 0x3e, 0x9b, 0x31, 0xa0, 0xfc, 0xb1, 0xdc, 0xb1, 0x33, 0xe9, 0x96, 0xae, 0xef, 0xe8, 0xce, 0x88, - 0x22, 0x38, 0x74, 0x5c, 0x5a, 0x5e, 0x04, 0x07, 0xf2, 0x92, 0xf4, 0xc4, 0x68, 0x48, 0x2a, 0xee, - 0xef, 0xe3, 0x3e, 0x31, 0x1a, 0x5f, 0x7c, 0xfa, 0x98, 0xfc, 0x34, 0x6d, 0x59, 0x17, 0xa8, 0xf3, - 0x6d, 0x8a, 0x7e, 0xbd, 0x43, 0x37, 0x16, 0xca, 0xda, 0xd1, 0x35, 0x96, 0xbe, 0xe5, 0xa7, 0x0f, - 0xcc, 0x7f, 0xff, 0x4e, 0xc8, 0x2d, 0xe2, 0x4b, 0xbb, 0x5b, 0xe8, 0x6e, 0x98, 0x6c, 0x58, 0x18, - 0x57, 0x8c, 0x4d, 0xd3, 0x95, 0xae, 0xe3, 0x3e, 0x7b, 0x90, 0xb0, 0x37, 0x17, 0x8f, 0x6d, 0xac, - 0xb5, 0x83, 0xf3, 0x67, 0xde, 0x2b, 0x7a, 0xa5, 0x04, 0xd9, 0xba, 0xa3, 0x39, 0x68, 0xca, 0xc7, - 0x16, 0x3d, 0x1a, 0xc6, 0xe2, 0x6e, 0x1e, 0x8b, 0x9b, 0x38, 0x59, 0x10, 0x0e, 0xe6, 0xdd, 0xff, - 0x23, 0x00, 0x40, 0x30, 0xf9, 0xb0, 0x6d, 0x1a, 0x6e, 0x0e, 0xef, 0x08, 0xa4, 0xf7, 0x8e, 0x5e, - 0xed, 0x8b, 0xfb, 0x3e, 0x4e, 0xdc, 0x4f, 0x15, 0x2b, 0x62, 0x0c, 0x2b, 0x6d, 0x12, 0x4c, 0xb9, - 0xa2, 0x5d, 0xc1, 0x5a, 0xdb, 0x46, 0xdf, 0x11, 0x28, 0x7f, 0x84, 0x98, 0xd1, 0x7b, 0x85, 0x83, - 0x71, 0xd2, 0x5a, 0xf9, 0xc4, 0xa3, 0x3d, 0x3a, 0xbc, 0xcd, 0x7f, 0x89, 0x0f, 0x46, 0x72, 0x1b, - 0x64, 0x75, 0x63, 0xd3, 0x64, 0xfe, 0x85, 0xd7, 0x46, 0xd0, 0x76, 0x75, 0x42, 0x25, 0x19, 0x05, - 0x23, 0x75, 0xc6, 0xb3, 0x35, 0x96, 0x4b, 0xef, 0xb2, 0x6e, 0xe9, 0xe8, 0xff, 0x3f, 0x50, 0xd8, - 0x8a, 0x02, 0xd9, 0xae, 0xe6, 0x6c, 0xb3, 0xa2, 0xc9, 0xb3, 0x6b, 0x23, 0xef, 0x1a, 0x9a, 0x61, - 0x1a, 0xfb, 0x3b, 0xfa, 0xf3, 0xfc, 0xbb, 0x75, 0xb9, 0x34, 0x97, 0xf3, 0x2d, 0x6c, 0x60, 0x4b, - 0x73, 0x70, 0x7d, 0x6f, 0x8b, 0xcc, 0xb1, 0x26, 0xd5, 0x70, 0x52, 0x62, 0xfd, 0x77, 0x39, 0x8e, - 0xd6, 0xff, 0x4d, 0xbd, 0x83, 0x49, 0xa4, 0x26, 0xa6, 0xff, 0xde, 0x7b, 0x22, 0xfd, 0xef, 0x53, - 0x44, 0xfa, 0x68, 0x7c, 0x43, 0x82, 0x99, 0xba, 0xab, 0x70, 0xf5, 0xdd, 0x9d, 0x1d, 0xcd, 0xda, - 0x47, 0x37, 0x04, 0xa8, 0x84, 0x54, 0x33, 0xc3, 0xfb, 0xa5, 0xfc, 0xbe, 0xf0, 0xb5, 0xd2, 0xac, - 0x69, 0x87, 0x4a, 0x48, 0xdc, 0x0e, 0x9e, 0x0e, 0x39, 0x57, 0xbd, 0x3d, 0x8f, 0xcb, 0xd8, 0x86, - 0x40, 0x73, 0x0a, 0x46, 0xb4, 0x1a, 0xc8, 0xdb, 0x18, 0xa2, 0x69, 0x48, 0x70, 0xbc, 0xee, 0x68, - 0xad, 0xcb, 0xcb, 0xa6, 0x65, 0xee, 0x3a, 0xba, 0x81, 0x6d, 0xf4, 0xa4, 0x00, 0x01, 0x4f, 0xff, - 0x33, 0x81, 0xfe, 0xa3, 0x7f, 0xcf, 0x88, 0x8e, 0xa2, 0x7e, 0xb7, 0x1a, 0x26, 0x1f, 0x11, 0xa0, - 0x4a, 0x6c, 0x5c, 0x14, 0xa1, 0x98, 0xbe, 0xd0, 0x7e, 0x45, 0x86, 0x42, 0xf9, 0x91, 0xae, 0x69, - 0x39, 0xab, 0x66, 0x4b, 0xeb, 0xd8, 0x8e, 0x69, 0x61, 0x54, 0x8b, 0x95, 0x9a, 0xdb, 0xc3, 0xb4, - 0xcd, 0x56, 0x30, 0x38, 0xb2, 0xb7, 0xb0, 0xda, 0xc9, 0xbc, 0x8e, 0xbf, 0x5f, 0x78, 0x97, 0x91, - 0x4a, 0xa5, 0x97, 0xa3, 0x08, 0x3d, 0xef, 0xd7, 0xa5, 0x25, 0x3b, 0x2c, 0x21, 0xb6, 0xf3, 0x28, - 0xc4, 0xd4, 0x18, 0x96, 0xca, 0x25, 0x98, 0xad, 0xef, 0x5e, 0xf2, 0x89, 0xd8, 0x61, 0x23, 0xe4, - 0xb5, 0xc2, 0x51, 0x2a, 0x98, 0xe2, 0x85, 0x09, 0x45, 0xc8, 0xf7, 0x46, 0x98, 0xb5, 0xc3, 0xd9, - 0x18, 0xde, 0x7c, 0xa2, 0x60, 0x74, 0x8a, 0xc1, 0xa5, 0xa6, 0x2f, 0xc0, 0x77, 0x4a, 0x30, 0x5b, - 0xeb, 0x62, 0x03, 0xb7, 0xa9, 0x17, 0x24, 0x27, 0xc0, 0x57, 0x26, 0x14, 0x20, 0x47, 0x28, 0x42, - 0x80, 0x81, 0xc7, 0xf2, 0xa2, 0x27, 0xbc, 0x20, 0x21, 0x91, 0xe0, 0xe2, 0x4a, 0x4b, 0x5f, 0x70, - 0x9f, 0x91, 0x60, 0x5a, 0xdd, 0x35, 0xd6, 0x2d, 0xd3, 0x1d, 0x8d, 0x2d, 0x74, 0x4f, 0xd0, 0x41, - 0xdc, 0x0a, 0x27, 0xda, 0xbb, 0x16, 0x59, 0x7f, 0xaa, 0x18, 0x75, 0xdc, 0x32, 0x8d, 0xb6, 0x4d, - 0xea, 0x91, 0x53, 0x0f, 0x7e, 0xb8, 0x2b, 0xfb, 0xa2, 0x2f, 0xca, 0x19, 0xf4, 0x62, 0xe1, 0x50, - 0x37, 0xb4, 0xf2, 0xa1, 0xa2, 0xc5, 0x7b, 0x02, 0xc1, 0x80, 0x36, 0x83, 0x4a, 0x48, 0x5f, 0xb8, - 0x9f, 0x90, 0x40, 0x29, 0xb6, 0x5a, 0xe6, 0xae, 0xe1, 0xd4, 0x71, 0x07, 0xb7, 0x9c, 0x86, 0xa5, - 0xb5, 0x70, 0xd8, 0x7e, 0x2e, 0x80, 0xdc, 0xd6, 0x2d, 0xd6, 0x07, 0xbb, 0x8f, 0x4c, 0x8e, 0xaf, - 0x14, 0xde, 0x71, 0xa4, 0xb5, 0x3c, 0x58, 0x4a, 0x02, 0x71, 0x8a, 0xed, 0x2b, 0x0a, 0x16, 0x94, - 0xbe, 0x54, 0x3f, 0x24, 0xc1, 0x94, 0xd7, 0x63, 0x6f, 0x89, 0x08, 0xf3, 0xa7, 0x13, 0x4e, 0x46, - 0x7c, 0xe2, 0x09, 0x64, 0xf8, 0xd6, 0x04, 0xb3, 0x8a, 0x28, 0xfa, 0xc9, 0x44, 0x57, 0x4c, 0x2e, - 0x3a, 0xf7, 0xb5, 0x5a, 0x6b, 0x2e, 0xd5, 0x56, 0x17, 0xcb, 0x6a, 0x41, 0x46, 0x8f, 0x4b, 0x90, - 0x5d, 0xd7, 0x8d, 0xad, 0x70, 0x74, 0xa5, 0x93, 0xae, 0x1d, 0xd9, 0xc6, 0x8f, 0xb0, 0x96, 0x4e, - 0x5f, 0x94, 0x3b, 0xe0, 0xa4, 0xb1, 0xbb, 0x73, 0x09, 0x5b, 0xb5, 0x4d, 0x32, 0xca, 0xda, 0x0d, - 0xb3, 0x8e, 0x0d, 0x6a, 0x84, 0xe6, 0xd4, 0xbe, 0xdf, 0x78, 0x13, 0x4c, 0x60, 0xf2, 0xe0, 0x72, - 0x12, 0x21, 0x71, 0x9f, 0x29, 0x29, 0xc4, 0x54, 0xa2, 0x69, 0x43, 0x1f, 0xe2, 0xe9, 0x6b, 0xea, - 0x1f, 0xe6, 0xe0, 0x54, 0xd1, 0xd8, 0x27, 0x36, 0x05, 0xed, 0xe0, 0x4b, 0xdb, 0x9a, 0xb1, 0x85, - 0xc9, 0x00, 0xe1, 0x4b, 0x3c, 0x1c, 0xa2, 0x3f, 0xc3, 0x87, 0xe8, 0x57, 0x54, 0x98, 0x30, 0xad, - 0x36, 0xb6, 0x16, 0xf6, 0x09, 0x4f, 0xbd, 0xcb, 0xce, 0xac, 0x4d, 0xf6, 0x2b, 0x62, 0x9e, 0x91, - 0x9f, 0xaf, 0xd1, 0xff, 0x55, 0x8f, 0xd0, 0xf9, 0x5b, 0x61, 0x82, 0xa5, 0x29, 0x33, 0x30, 0x59, - 0x53, 0x17, 0xcb, 0x6a, 0xb3, 0xb2, 0x58, 0x38, 0xa6, 0x5c, 0x05, 0xc7, 0x2b, 0x8d, 0xb2, 0x5a, - 0x6c, 0x54, 0x6a, 0xd5, 0x26, 0x49, 0x2f, 0x64, 0xd0, 0x0b, 0xb3, 0xa2, 0x9e, 0xbd, 0xf1, 0xcc, - 0xf4, 0x83, 0x55, 0x85, 0x89, 0x16, 0xcd, 0x40, 0x86, 0xd0, 0xe9, 0x44, 0xb5, 0x63, 0x04, 0x69, - 0x82, 0xea, 0x11, 0x52, 0xce, 0x02, 0x5c, 0xb1, 0x4c, 0x63, 0x2b, 0x38, 0x75, 0x38, 0xa9, 0x86, - 0x52, 0xd0, 0xa3, 0x19, 0xc8, 0xd3, 0x7f, 0xc8, 0x95, 0x24, 0xe4, 0x29, 0x10, 0xbc, 0xf7, 0xee, - 0x5a, 0xbc, 0x44, 0x5e, 0xc1, 0x44, 0x8b, 0xbd, 0xba, 0xba, 0x48, 0x65, 0x40, 0x2d, 0x61, 0x56, - 0x95, 0xdb, 0x20, 0x4f, 0xff, 0x65, 0x5e, 0x07, 0xd1, 0xe1, 0x45, 0x69, 0x36, 0x41, 0x3f, 0x65, - 0x71, 0x99, 0xa6, 0xaf, 0xcd, 0xbf, 0x23, 0xc1, 0x64, 0x15, 0x3b, 0xa5, 0x6d, 0xdc, 0xba, 0x8c, - 0x9e, 0xc2, 0x2f, 0x80, 0x76, 0x74, 0x6c, 0x38, 0x0f, 0xed, 0x74, 0xfc, 0x05, 0x50, 0x2f, 0x01, - 0xfd, 0x68, 0xb8, 0xf3, 0xbd, 0x9f, 0xd7, 0x9f, 0x5b, 0xfa, 0xd4, 0xd5, 0x2b, 0x21, 0x42, 0x65, - 0x4e, 0x43, 0xde, 0xc2, 0xf6, 0x6e, 0xc7, 0x5b, 0x44, 0x63, 0x6f, 0xe8, 0x75, 0xbe, 0x38, 0x4b, - 0x9c, 0x38, 0x6f, 0x13, 0x2f, 0x62, 0x0c, 0xf1, 0x4a, 0xb3, 0x30, 0x51, 0x31, 0x74, 0x47, 0xd7, - 0x3a, 0xe8, 0xc5, 0x59, 0x98, 0xad, 0x63, 0x67, 0x5d, 0xb3, 0xb4, 0x1d, 0xec, 0x60, 0xcb, 0x46, - 0x5f, 0xe3, 0xfb, 0x84, 0x6e, 0x47, 0x73, 0x36, 0x4d, 0x6b, 0xc7, 0x53, 0x4d, 0xef, 0xdd, 0x55, - 0xcd, 0x3d, 0x6c, 0xd9, 0x01, 0x5f, 0xde, 0xab, 0xfb, 0xe5, 0x8a, 0x69, 0x5d, 0x76, 0x07, 0x41, - 0x36, 0x4d, 0x63, 0xaf, 0x2e, 0xbd, 0x8e, 0xb9, 0xb5, 0x8a, 0xf7, 0xb0, 0x17, 0x2e, 0xcd, 0x7f, - 0x77, 0xe7, 0x02, 0x6d, 0xb3, 0x6a, 0x3a, 0x6e, 0xa7, 0xbd, 0x6a, 0x6e, 0xd1, 0x78, 0xb1, 0x93, - 0x2a, 0x9f, 0x18, 0xe4, 0xd2, 0xf6, 0x30, 0xc9, 0x95, 0x0f, 0xe7, 0x62, 0x89, 0xca, 0x3c, 0x28, - 0xfe, 0x6f, 0x0d, 0xdc, 0xc1, 0x3b, 0xd8, 0xb1, 0xf6, 0xc9, 0xb5, 0x10, 0x93, 0x6a, 0x9f, 0x2f, - 0x6c, 0x80, 0x16, 0x9f, 0xac, 0x33, 0xe9, 0xcd, 0x73, 0x92, 0x3b, 0xd4, 0x64, 0x5d, 0x84, 0xe2, - 0x58, 0xae, 0xbd, 0x92, 0x5d, 0x6b, 0xe6, 0xe7, 0x65, 0xc8, 0x92, 0xc1, 0xf3, 0x8d, 0x19, 0x6e, - 0x85, 0x69, 0x07, 0xdb, 0xb6, 0xb6, 0x85, 0xbd, 0x15, 0x26, 0xf6, 0xaa, 0xdc, 0x09, 0xb9, 0x0e, - 0xc1, 0x94, 0x0e, 0x0e, 0x37, 0x70, 0x35, 0x73, 0x0d, 0x0c, 0x97, 0x96, 0x3f, 0x12, 0x10, 0xb8, - 0x55, 0xfa, 0xc7, 0xf9, 0x07, 0x20, 0x47, 0xe1, 0x9f, 0x82, 0xdc, 0x62, 0x79, 0x61, 0x63, 0xb9, - 0x70, 0xcc, 0x7d, 0xf4, 0xf8, 0x9b, 0x82, 0xdc, 0x52, 0xb1, 0x51, 0x5c, 0x2d, 0x48, 0x6e, 0x3d, - 0x2a, 0xd5, 0xa5, 0x5a, 0x41, 0x76, 0x13, 0xd7, 0x8b, 0xd5, 0x4a, 0xa9, 0x90, 0x55, 0xa6, 0x61, - 0xe2, 0x62, 0x51, 0xad, 0x56, 0xaa, 0xcb, 0x85, 0x1c, 0xfa, 0xdb, 0x30, 0x7e, 0x77, 0xf1, 0xf8, - 0xdd, 0x18, 0xc5, 0x53, 0x3f, 0xc8, 0x7e, 0xc1, 0x87, 0xec, 0x1e, 0x0e, 0xb2, 0xef, 0x14, 0x21, - 0x32, 0x06, 0x77, 0xa6, 0x3c, 0x4c, 0xac, 0x5b, 0x66, 0x0b, 0xdb, 0x36, 0xfa, 0x19, 0x09, 0xf2, - 0x25, 0xcd, 0x68, 0xe1, 0x0e, 0xba, 0x26, 0x80, 0x8a, 0xba, 0x8a, 0x66, 0xfc, 0xd3, 0x62, 0xff, - 0x98, 0x11, 0xed, 0xfd, 0x18, 0xdd, 0x79, 0x4a, 0x33, 0x42, 0x3e, 0x62, 0xbd, 0x5c, 0x2c, 0xa9, - 0x31, 0x5c, 0x8d, 0x23, 0xc1, 0x14, 0x5b, 0x0d, 0xb8, 0x84, 0xc3, 0xf3, 0xf0, 0xaf, 0x65, 0x44, - 0x27, 0x87, 0x5e, 0x0d, 0x7c, 0x32, 0x11, 0xf2, 0x10, 0x9b, 0x08, 0x0e, 0xa2, 0x36, 0x86, 0xcd, - 0x43, 0x09, 0xa6, 0x37, 0x0c, 0xbb, 0x9f, 0x50, 0xc4, 0xe3, 0xe8, 0x7b, 0xd5, 0x08, 0x11, 0x3a, - 0x54, 0x1c, 0xfd, 0xc1, 0xf4, 0xd2, 0x17, 0xcc, 0xd7, 0x32, 0x70, 0x72, 0x19, 0x1b, 0xd8, 0xd2, - 0x5b, 0xb4, 0x06, 0x9e, 0x24, 0xee, 0xe1, 0x25, 0xf1, 0x14, 0x8e, 0xf3, 0x7e, 0x7f, 0xf0, 0x12, - 0x78, 0x8d, 0x2f, 0x81, 0xfb, 0x39, 0x09, 0xdc, 0x2a, 0x48, 0x67, 0x0c, 0xf7, 0xa1, 0x4f, 0xc1, - 0x4c, 0xd5, 0x74, 0xf4, 0x4d, 0xbd, 0x45, 0x7d, 0xd0, 0x7e, 0x4e, 0x86, 0xec, 0xaa, 0x6e, 0x3b, - 0xa8, 0x18, 0x74, 0x27, 0xe7, 0x60, 0x5a, 0x37, 0x5a, 0x9d, 0xdd, 0x36, 0x56, 0xb1, 0x46, 0xfb, - 0x95, 0x49, 0x35, 0x9c, 0x14, 0x6c, 0xed, 0xbb, 0x6c, 0xc9, 0xde, 0xd6, 0xfe, 0x47, 0x85, 0x97, - 0x61, 0xc2, 0x2c, 0x90, 0x80, 0x94, 0x11, 0x76, 0x57, 0x11, 0x66, 0x8d, 0x50, 0x56, 0xcf, 0x60, - 0xef, 0xbd, 0x50, 0x20, 0x4c, 0x4e, 0xe5, 0xff, 0x40, 0xef, 0x16, 0x6a, 0xac, 0x83, 0x18, 0x4a, - 0x86, 0xcc, 0xd2, 0x10, 0x93, 0x64, 0x05, 0xe6, 0x2a, 0xd5, 0x46, 0x59, 0xad, 0x16, 0x57, 0x59, - 0x16, 0x19, 0x7d, 0x43, 0x82, 0x9c, 0x8a, 0xbb, 0x9d, 0xfd, 0x70, 0xc4, 0x68, 0xe6, 0x28, 0x9e, - 0xf1, 0x1d, 0xc5, 0x95, 0x25, 0x00, 0xad, 0xe5, 0x16, 0x4c, 0xae, 0xd4, 0x92, 0xfa, 0xc6, 0x31, - 0xe5, 0x2a, 0x58, 0xf4, 0x73, 0xab, 0xa1, 0x3f, 0xd1, 0x4b, 0x84, 0x77, 0x8e, 0x38, 0x6a, 0x84, - 0xc3, 0x88, 0x3e, 0xe1, 0x3d, 0x42, 0x9b, 0x3d, 0x03, 0xc9, 0x1d, 0x8d, 0xf8, 0x3f, 0x2b, 0x41, - 0xb6, 0xe1, 0xf6, 0x96, 0xa1, 0x8e, 0xf3, 0x8f, 0x86, 0xd3, 0x71, 0x97, 0x4c, 0x84, 0x8e, 0xdf, - 0x07, 0x33, 0x61, 0x8d, 0x65, 0xae, 0x12, 0xb1, 0x2a, 0xce, 0xfd, 0x30, 0x8c, 0x86, 0xf7, 0x61, - 0xe7, 0x68, 0x44, 0xfc, 0xe1, 0xa7, 0x02, 0xac, 0xe1, 0x9d, 0x4b, 0xd8, 0xb2, 0xb7, 0xf5, 0x2e, - 0xfa, 0x3b, 0x19, 0xa6, 0x96, 0xb1, 0x53, 0x77, 0x34, 0x67, 0xd7, 0xee, 0xd9, 0xee, 0x34, 0xcc, - 0x92, 0xd6, 0xda, 0xc6, 0xac, 0x3b, 0xf2, 0x5e, 0xd1, 0xdb, 0x65, 0x51, 0x7f, 0xa2, 0xa0, 0x9c, - 0x79, 0xbf, 0x8c, 0x08, 0x4c, 0x9e, 0x06, 0xd9, 0xb6, 0xe6, 0x68, 0x0c, 0x8b, 0x6b, 0x7a, 0xb0, - 0x08, 0x08, 0xa9, 0x24, 0x1b, 0xfa, 0x0d, 0x49, 0xc4, 0xa1, 0x48, 0xa0, 0xfc, 0x64, 0x20, 0xbc, - 0x3b, 0x33, 0x04, 0x0a, 0x27, 0x60, 0xb6, 0x5a, 0x6b, 0x34, 0x57, 0x6b, 0xcb, 0xcb, 0x65, 0x37, - 0xb5, 0x20, 0x2b, 0xa7, 0x41, 0x59, 0x2f, 0x3e, 0xb4, 0x56, 0xae, 0x36, 0x9a, 0xd5, 0xda, 0x62, - 0x99, 0xfd, 0x99, 0x55, 0x8e, 0xc3, 0x74, 0xa9, 0x58, 0x5a, 0xf1, 0x12, 0x72, 0xca, 0x19, 0x38, - 0xb9, 0x56, 0x5e, 0x5b, 0x28, 0xab, 0xf5, 0x95, 0xca, 0x7a, 0xd3, 0x25, 0xb3, 0x54, 0xdb, 0xa8, - 0x2e, 0x16, 0xf2, 0x0a, 0x82, 0xd3, 0xa1, 0x2f, 0x17, 0xd5, 0x5a, 0x75, 0xb9, 0x59, 0x6f, 0x14, - 0x1b, 0xe5, 0xc2, 0x84, 0x72, 0x15, 0x1c, 0x2f, 0x15, 0xab, 0x24, 0x7b, 0xa9, 0x56, 0xad, 0x96, - 0x4b, 0x8d, 0xc2, 0x24, 0xfa, 0xf7, 0x2c, 0x4c, 0x57, 0xec, 0xaa, 0xb6, 0x83, 0x2f, 0x68, 0x1d, - 0xbd, 0x8d, 0x5e, 0x1c, 0x9a, 0x79, 0xdc, 0x08, 0xb3, 0x16, 0x7d, 0xc4, 0xed, 0x86, 0x8e, 0x29, - 0x9a, 0xb3, 0x2a, 0x9f, 0xe8, 0xce, 0xc9, 0x0d, 0x42, 0xc0, 0x9b, 0x93, 0xd3, 0x37, 0x65, 0x01, - 0x80, 0x3e, 0x35, 0x82, 0xcb, 0x5d, 0xcf, 0xf7, 0xb6, 0x26, 0x6d, 0x07, 0xdb, 0xd8, 0xda, 0xd3, - 0x5b, 0xd8, 0xcb, 0xa9, 0x86, 0xfe, 0x42, 0x9f, 0x93, 0x45, 0xf7, 0x17, 0x43, 0xa0, 0x86, 0xaa, - 0x13, 0xd1, 0x1b, 0xfe, 0x98, 0x2c, 0xb2, 0x3b, 0x28, 0x44, 0x32, 0x99, 0xa6, 0xbc, 0x4c, 0x1a, - 0x6e, 0xd9, 0xb6, 0x51, 0xab, 0x35, 0xeb, 0x2b, 0x35, 0xb5, 0x51, 0x90, 0x95, 0x19, 0x98, 0x74, - 0x5f, 0x57, 0x6b, 0xd5, 0xe5, 0x42, 0x56, 0x39, 0x05, 0x27, 0x56, 0x8a, 0xf5, 0x66, 0xa5, 0x7a, - 0xa1, 0xb8, 0x5a, 0x59, 0x6c, 0x96, 0x56, 0x8a, 0x6a, 0xbd, 0x90, 0x53, 0xae, 0x81, 0x53, 0x8d, - 0x4a, 0x59, 0x6d, 0x2e, 0x95, 0x8b, 0x8d, 0x0d, 0xb5, 0x5c, 0x6f, 0x56, 0x6b, 0xcd, 0x6a, 0x71, - 0xad, 0x5c, 0xc8, 0xbb, 0xcd, 0x9f, 0x7c, 0x0a, 0xd4, 0x66, 0xe2, 0xa0, 0x32, 0x4e, 0x46, 0x28, - 0xe3, 0x54, 0xaf, 0x32, 0x42, 0x58, 0xad, 0xd4, 0x72, 0xbd, 0xac, 0x5e, 0x28, 0x17, 0xa6, 0xfb, - 0xe9, 0xda, 0x8c, 0x72, 0x12, 0x0a, 0x2e, 0x0f, 0xcd, 0x4a, 0xdd, 0xcb, 0xb9, 0x58, 0x98, 0x45, - 0x1f, 0xca, 0xc3, 0x69, 0x15, 0x6f, 0xe9, 0xb6, 0x83, 0xad, 0x75, 0x6d, 0x7f, 0x07, 0x1b, 0x8e, - 0xd7, 0xc9, 0xff, 0x4b, 0x62, 0x65, 0x5c, 0x83, 0xd9, 0x2e, 0xa5, 0xb1, 0x86, 0x9d, 0x6d, 0xb3, - 0xcd, 0x46, 0xe1, 0xa7, 0x44, 0xf6, 0x1c, 0xf3, 0xeb, 0xe1, 0xec, 0x2a, 0xff, 0x77, 0x48, 0xb7, - 0xe5, 0x18, 0xdd, 0xce, 0x0e, 0xa3, 0xdb, 0xca, 0x75, 0x30, 0xb5, 0x6b, 0x63, 0xab, 0xbc, 0xa3, - 0xe9, 0x1d, 0xef, 0x72, 0x4e, 0x3f, 0x01, 0xbd, 0x25, 0x2b, 0x7a, 0x62, 0x25, 0x54, 0x97, 0xfe, - 0x62, 0x8c, 0xe8, 0x5b, 0xcf, 0x02, 0xb0, 0xca, 0x6e, 0x58, 0x1d, 0xa6, 0xac, 0xa1, 0x14, 0x97, - 0xbf, 0x4b, 0x7a, 0xa7, 0xa3, 0x1b, 0x5b, 0xfe, 0xbe, 0x7f, 0x90, 0x80, 0x5e, 0x26, 0x8b, 0x9c, - 0x60, 0x49, 0xca, 0x5b, 0xb2, 0xd6, 0xf4, 0x12, 0x69, 0xcc, 0xfd, 0xee, 0xc1, 0xa6, 0x93, 0x57, - 0x0a, 0x30, 0x43, 0xd2, 0x58, 0x0b, 0x2c, 0x4c, 0xb8, 0x7d, 0xb0, 0x47, 0x6e, 0xad, 0xdc, 0x58, - 0xa9, 0x2d, 0xfa, 0xdf, 0x26, 0x5d, 0x92, 0x2e, 0x33, 0xc5, 0xea, 0x43, 0xa4, 0x35, 0x4e, 0x29, - 0x4f, 0x82, 0x6b, 0x42, 0x1d, 0x76, 0x71, 0x55, 0x2d, 0x17, 0x17, 0x1f, 0x6a, 0x96, 0x9f, 0x5b, - 0xa9, 0x37, 0xea, 0x7c, 0xe3, 0xf2, 0xda, 0xd1, 0xb4, 0xcb, 0x6f, 0x79, 0xad, 0x58, 0x59, 0x65, - 0xfd, 0xfb, 0x52, 0x4d, 0x5d, 0x2b, 0x36, 0x0a, 0x33, 0xe8, 0xe7, 0x65, 0x28, 0x2c, 0x63, 0x67, - 0xdd, 0xb4, 0x1c, 0xad, 0xb3, 0xaa, 0x1b, 0x97, 0x37, 0xac, 0x0e, 0x37, 0xd9, 0x14, 0x0e, 0xd3, - 0xc1, 0x0f, 0x91, 0x1c, 0xc1, 0xe8, 0x1d, 0xf1, 0x2e, 0xc9, 0x16, 0x28, 0x53, 0x90, 0x80, 0x9e, - 0x2f, 0x89, 0x2c, 0x77, 0x8b, 0x97, 0x9a, 0x4c, 0x4f, 0x5e, 0x30, 0xee, 0xf1, 0xb9, 0x0f, 0x6a, - 0x79, 0xf4, 0xa2, 0x2c, 0x4c, 0x2e, 0xe9, 0x86, 0xd6, 0xd1, 0x9f, 0xc7, 0xc5, 0x2f, 0x0d, 0xfa, - 0x98, 0x4c, 0x4c, 0x1f, 0x23, 0x0d, 0x35, 0x7e, 0xfe, 0x94, 0x2c, 0xba, 0xbc, 0x10, 0x92, 0xbd, - 0xc7, 0x64, 0xc4, 0xe0, 0xf9, 0x3e, 0x49, 0x64, 0x79, 0x61, 0x30, 0xbd, 0x64, 0x18, 0x7e, 0xe4, - 0x5b, 0xc3, 0xc6, 0xea, 0x69, 0xdf, 0x93, 0xfd, 0x54, 0x61, 0x0a, 0xfd, 0x99, 0x0c, 0x68, 0x19, - 0x3b, 0x17, 0xb0, 0xe5, 0x4f, 0x05, 0x48, 0xaf, 0xcf, 0xec, 0xed, 0x50, 0x93, 0x7d, 0x63, 0x18, - 0xc0, 0x8b, 0x3c, 0x80, 0xc5, 0x98, 0xc6, 0x13, 0x41, 0x3a, 0xa2, 0xf1, 0x56, 0x20, 0x6f, 0x93, - 0xef, 0x4c, 0xcd, 0x9e, 0x1e, 0x3d, 0x5c, 0x12, 0x62, 0x61, 0xea, 0x94, 0xb0, 0xca, 0x08, 0xa0, - 0xaf, 0xfb, 0x93, 0xa0, 0xef, 0xe5, 0xb4, 0x63, 0xe9, 0xd0, 0xcc, 0x26, 0xd3, 0x17, 0x2b, 0x5d, - 0x75, 0xe9, 0x67, 0xdf, 0xa0, 0xf7, 0xe5, 0xe0, 0x64, 0xbf, 0xea, 0xa0, 0xdf, 0xcc, 0x70, 0x3b, - 0xec, 0x98, 0x0c, 0xf9, 0x19, 0xb6, 0x81, 0xe8, 0xbe, 0x28, 0xcf, 0x84, 0x53, 0xfe, 0x32, 0x5c, - 0xc3, 0xac, 0xe2, 0x2b, 0x76, 0x07, 0x3b, 0x0e, 0xb6, 0x48, 0xd5, 0x26, 0xd5, 0xfe, 0x1f, 0x95, - 0x67, 0xc3, 0xd5, 0xba, 0x61, 0xeb, 0x6d, 0x6c, 0x35, 0xf4, 0xae, 0x5d, 0x34, 0xda, 0x8d, 0x5d, - 0xc7, 0xb4, 0x74, 0x8d, 0x5d, 0x25, 0x39, 0xa9, 0x46, 0x7d, 0x56, 0x6e, 0x81, 0x82, 0x6e, 0xd7, - 0x8c, 0x4b, 0xa6, 0x66, 0xb5, 0x75, 0x63, 0x6b, 0x55, 0xb7, 0x1d, 0xe6, 0x01, 0x7c, 0x20, 0x1d, - 0xfd, 0xbd, 0x2c, 0x7a, 0x98, 0x6e, 0x00, 0xac, 0x11, 0x1d, 0xca, 0x8f, 0xca, 0x22, 0xc7, 0xe3, - 0x92, 0xd1, 0x4e, 0xa6, 0x2c, 0x2f, 0x1c, 0xb7, 0x21, 0xd1, 0x7f, 0x04, 0x27, 0x5d, 0x0b, 0x4d, - 0xf7, 0x0c, 0x81, 0x0b, 0x65, 0xb5, 0xb2, 0x54, 0x29, 0xbb, 0x66, 0xc5, 0x29, 0x38, 0x11, 0x7c, - 0x5b, 0x7c, 0xa8, 0x59, 0x2f, 0x57, 0x1b, 0x85, 0x49, 0xb7, 0x9f, 0xa2, 0xc9, 0x4b, 0xc5, 0xca, - 0x6a, 0x79, 0xb1, 0xd9, 0xa8, 0xb9, 0x5f, 0x16, 0x87, 0x33, 0x2d, 0xd0, 0xa3, 0x59, 0x38, 0x4e, - 0x64, 0xbb, 0x4f, 0xa4, 0xea, 0x0a, 0xa5, 0xc7, 0xd7, 0xd6, 0x07, 0x68, 0x8a, 0x8a, 0x17, 0x7d, - 0x5c, 0xf8, 0xa6, 0xcc, 0x10, 0x84, 0x3d, 0x65, 0x44, 0x68, 0xc6, 0xd7, 0x24, 0x91, 0x08, 0x15, - 0xc2, 0x64, 0x93, 0x29, 0xc5, 0xbf, 0x8e, 0x7b, 0xc4, 0x89, 0x06, 0x9f, 0x58, 0x99, 0x25, 0xf2, - 0xf3, 0x73, 0xd7, 0x2b, 0x2a, 0x51, 0x87, 0x39, 0x00, 0x92, 0x42, 0x34, 0x88, 0xea, 0x41, 0xdf, - 0xf1, 0x2a, 0x4a, 0x0f, 0x8a, 0xa5, 0x46, 0xe5, 0x42, 0x39, 0x4a, 0x0f, 0x3e, 0x26, 0xc3, 0xe4, - 0x32, 0x76, 0xdc, 0x39, 0x95, 0x8d, 0x9e, 0x23, 0xb0, 0xfe, 0xe3, 0x9a, 0x31, 0x1d, 0xb3, 0xa5, - 0x75, 0xfc, 0x65, 0x00, 0xfa, 0x86, 0x7e, 0x64, 0x18, 0x13, 0xc4, 0x2b, 0x3a, 0x62, 0xbc, 0xfa, - 0x6e, 0xc8, 0x39, 0xee, 0x67, 0xb6, 0x0c, 0xfd, 0x1d, 0x91, 0xc3, 0x95, 0x4b, 0x64, 0x51, 0x73, - 0x34, 0x95, 0xe6, 0x0f, 0x8d, 0x4e, 0x82, 0xb6, 0x4b, 0x04, 0x23, 0xdf, 0x8a, 0xf6, 0xe7, 0xdf, - 0xca, 0x70, 0x8a, 0xb6, 0x8f, 0x62, 0xb7, 0x5b, 0x77, 0x4c, 0x0b, 0xab, 0xb8, 0x85, 0xf5, 0xae, - 0xd3, 0xb3, 0xbe, 0x67, 0xd1, 0x54, 0x6f, 0xb3, 0x99, 0xbd, 0xa2, 0x5f, 0x92, 0x45, 0x63, 0x30, - 0x1f, 0x68, 0x8f, 0x3d, 0xe5, 0x45, 0x34, 0xf6, 0x0f, 0x4a, 0x22, 0x51, 0x95, 0x13, 0x12, 0x4f, - 0x06, 0xd4, 0xef, 0x1d, 0x01, 0x50, 0xde, 0xca, 0x8d, 0x5a, 0x2e, 0x95, 0x2b, 0xeb, 0xee, 0x20, - 0x70, 0x3d, 0x5c, 0xbb, 0xbe, 0xa1, 0x96, 0x56, 0x8a, 0xf5, 0x72, 0x53, 0x2d, 0x2f, 0x57, 0xea, - 0x0d, 0xe6, 0x94, 0x45, 0xff, 0x9a, 0x50, 0xae, 0x83, 0x33, 0xf5, 0x8d, 0x85, 0x7a, 0x49, 0xad, - 0xac, 0x93, 0x74, 0xb5, 0x5c, 0x2d, 0x5f, 0x64, 0x5f, 0x27, 0xd1, 0x7b, 0x0b, 0x30, 0xed, 0x4e, - 0x00, 0xea, 0x74, 0x5e, 0x80, 0xbe, 0x9c, 0x85, 0x69, 0x15, 0xdb, 0x66, 0x67, 0x8f, 0xcc, 0x11, - 0xc6, 0x35, 0xf5, 0xf8, 0xaa, 0x2c, 0x7a, 0x7e, 0x3b, 0xc4, 0xec, 0x7c, 0x88, 0xd1, 0xe8, 0x89, - 0xa6, 0xb6, 0xa7, 0xe9, 0x1d, 0xed, 0x12, 0xeb, 0x6a, 0x26, 0xd5, 0x20, 0x41, 0x99, 0x07, 0xc5, - 0xbc, 0x62, 0x60, 0xab, 0xde, 0xba, 0x52, 0x76, 0xb6, 0x8b, 0xed, 0xb6, 0x85, 0x6d, 0x9b, 0xad, - 0x5e, 0xf4, 0xf9, 0xa2, 0xdc, 0x0c, 0xc7, 0x49, 0x6a, 0x28, 0x33, 0x75, 0x90, 0xe9, 0x4d, 0xf6, - 0x73, 0x16, 0x8d, 0x7d, 0x2f, 0x67, 0x2e, 0x94, 0x33, 0x48, 0x0e, 0x1f, 0x97, 0xc8, 0xf3, 0xa7, - 0x74, 0xce, 0xc1, 0xb4, 0xa1, 0xed, 0xe0, 0xf2, 0x23, 0x5d, 0xdd, 0xc2, 0x36, 0x71, 0x8c, 0x91, - 0xd5, 0x70, 0x12, 0x7a, 0x9f, 0xd0, 0x79, 0x73, 0x31, 0x89, 0x25, 0xd3, 0xfd, 0xe5, 0x21, 0x54, - 0xbf, 0x4f, 0x3f, 0x23, 0xa3, 0xf7, 0xca, 0x30, 0xc3, 0x98, 0x2a, 0x1a, 0xfb, 0x95, 0x36, 0xba, - 0x9e, 0x33, 0x7e, 0x35, 0x37, 0xcd, 0x33, 0x7e, 0xc9, 0x0b, 0xfa, 0x71, 0x59, 0xd4, 0xdd, 0xb9, - 0x4f, 0xc5, 0x49, 0x19, 0xd1, 0x8e, 0xa3, 0x9b, 0xe6, 0x2e, 0x73, 0x54, 0x9d, 0x54, 0xe9, 0x4b, - 0x9a, 0x8b, 0x7a, 0xe8, 0x77, 0x85, 0x9c, 0xa9, 0x05, 0xab, 0x71, 0x44, 0x00, 0x7e, 0x58, 0x86, - 0x39, 0xc6, 0x55, 0x9d, 0x9d, 0xf3, 0x11, 0x3a, 0xf0, 0xf6, 0x13, 0xc2, 0x86, 0x60, 0x9f, 0xfa, - 0xb3, 0x92, 0x9e, 0x30, 0x40, 0xbe, 0x5f, 0x28, 0x38, 0x9a, 0x70, 0x45, 0x8e, 0x08, 0xca, 0xb7, - 0x66, 0x61, 0x7a, 0xc3, 0xc6, 0x16, 0xf3, 0xdb, 0x47, 0xaf, 0xcb, 0x82, 0xbc, 0x8c, 0xb9, 0x8d, - 0xd4, 0x97, 0x0a, 0x7b, 0xf8, 0x86, 0x2b, 0x1b, 0x22, 0xea, 0xda, 0x48, 0x11, 0xb0, 0xdd, 0x04, - 0x73, 0x54, 0xa4, 0x45, 0xc7, 0x71, 0x8d, 0x44, 0xcf, 0x9b, 0xb6, 0x27, 0x75, 0x14, 0x5b, 0x45, - 0xa4, 0x2c, 0x37, 0x4b, 0xc9, 0xe5, 0x69, 0x15, 0x6f, 0xd2, 0xf9, 0x6c, 0x56, 0xed, 0x49, 0x55, - 0x6e, 0x87, 0xab, 0xcc, 0x2e, 0xa6, 0xe7, 0x57, 0x42, 0x99, 0x73, 0x24, 0x73, 0xbf, 0x4f, 0xe8, - 0xcb, 0x42, 0xbe, 0xba, 0xe2, 0xd2, 0x49, 0xa6, 0x0b, 0xdd, 0xd1, 0x98, 0x24, 0x27, 0xa1, 0xe0, - 0xe6, 0x20, 0xfb, 0x2f, 0x6a, 0xb9, 0x5e, 0x5b, 0xbd, 0x50, 0xee, 0xbf, 0x8c, 0x91, 0x43, 0x2f, - 0x94, 0x61, 0x6a, 0xc1, 0x32, 0xb5, 0x76, 0x4b, 0xb3, 0x1d, 0xf4, 0x75, 0x09, 0x66, 0xd6, 0xb5, - 0xfd, 0x8e, 0xa9, 0xb5, 0x89, 0x7f, 0x7f, 0x4f, 0x5f, 0xd0, 0xa5, 0x9f, 0xbc, 0xbe, 0x80, 0xbd, - 0xf2, 0x07, 0x03, 0xfd, 0xa3, 0x7b, 0x19, 0x91, 0x0b, 0x35, 0xfd, 0x6d, 0x3e, 0xa9, 0x5f, 0xb0, - 0x52, 0x8f, 0xaf, 0xf9, 0x30, 0x4f, 0x11, 0x16, 0xe5, 0x7b, 0xc5, 0xc2, 0x8f, 0x8a, 0x90, 0x3c, - 0x9a, 0x5d, 0xf9, 0x17, 0x4d, 0x42, 0x7e, 0x11, 0x13, 0x2b, 0xee, 0x7f, 0x48, 0x30, 0x51, 0xc7, - 0x0e, 0xb1, 0xe0, 0xee, 0xe4, 0x3c, 0x85, 0xdb, 0x24, 0x43, 0xe0, 0xc4, 0xee, 0xbd, 0xbb, 0x93, - 0xf5, 0xd0, 0x79, 0x6b, 0xf2, 0x9c, 0xc0, 0x23, 0x91, 0x96, 0x3b, 0xcf, 0xca, 0x3c, 0x94, 0x47, - 0x62, 0x2c, 0xa9, 0xf4, 0x7d, 0xad, 0xde, 0x2e, 0x31, 0xd7, 0xaa, 0x50, 0xaf, 0xf7, 0x8b, 0x61, - 0xfd, 0x8c, 0xf5, 0x36, 0x63, 0xcc, 0xc7, 0x38, 0x47, 0x3d, 0x03, 0x26, 0xa8, 0xcc, 0xbd, 0xf9, - 0x68, 0xaf, 0x9f, 0x02, 0x25, 0x41, 0xce, 0x5e, 0x7b, 0x39, 0x05, 0x5d, 0xd4, 0xa2, 0x0b, 0x1f, - 0x4b, 0x0c, 0x82, 0x99, 0x2a, 0x76, 0xae, 0x98, 0xd6, 0xe5, 0xba, 0xa3, 0x39, 0x18, 0xfd, 0xab, - 0x04, 0x72, 0x1d, 0x3b, 0xe1, 0xe8, 0x27, 0x55, 0x38, 0x41, 0x2b, 0xc4, 0x32, 0x92, 0xfe, 0x9b, - 0x56, 0xe4, 0x5c, 0x5f, 0x21, 0x84, 0xf2, 0xa9, 0x07, 0x7f, 0x45, 0x3f, 0xd3, 0x37, 0xe8, 0x93, - 0xd4, 0x67, 0xd2, 0xc0, 0x24, 0x13, 0x66, 0xd0, 0x55, 0xb0, 0x08, 0x3d, 0xfd, 0x1d, 0x21, 0xb3, - 0x5a, 0x8c, 0xe6, 0xd1, 0x74, 0x05, 0xef, 0xbf, 0x06, 0xb2, 0xa5, 0x6d, 0xcd, 0x41, 0x6f, 0x93, - 0x01, 0x8a, 0xed, 0xf6, 0x1a, 0xf5, 0x01, 0x0f, 0x3b, 0xa4, 0x9d, 0x87, 0x99, 0xd6, 0xb6, 0x16, - 0xdc, 0x6d, 0x42, 0xfb, 0x03, 0x2e, 0x4d, 0x79, 0x66, 0xe0, 0x4c, 0x4e, 0xa5, 0x8a, 0x7a, 0x60, - 0x72, 0xcb, 0x60, 0xb4, 0x7d, 0x47, 0x73, 0x3e, 0x14, 0x66, 0xec, 0x11, 0x3a, 0xf7, 0xf7, 0xf9, - 0x80, 0xbd, 0xe8, 0x39, 0x1c, 0x23, 0xed, 0x1f, 0xb0, 0x09, 0x12, 0x12, 0x9e, 0xf4, 0x16, 0x0b, - 0xe8, 0x11, 0xcf, 0xd7, 0x58, 0x42, 0xd7, 0x2a, 0xe5, 0xb6, 0xee, 0x89, 0x96, 0x05, 0xcc, 0x42, - 0x2f, 0xc9, 0x24, 0x83, 0x2f, 0x5e, 0x70, 0xf7, 0xc3, 0x2c, 0x6e, 0xeb, 0x0e, 0xf6, 0x6a, 0xc9, - 0x04, 0x18, 0x07, 0x31, 0xff, 0x03, 0x7a, 0x81, 0x70, 0xd0, 0x35, 0x22, 0xd0, 0x83, 0x35, 0x8a, - 0x68, 0x7f, 0x62, 0x61, 0xd4, 0xc4, 0x68, 0xa6, 0x0f, 0xd6, 0x8f, 0xc8, 0x70, 0xaa, 0x61, 0x6e, - 0x6d, 0x75, 0xb0, 0x27, 0x26, 0x4c, 0xbd, 0x33, 0x91, 0x36, 0x4a, 0xb8, 0xc8, 0x4e, 0x90, 0xf9, - 0xb0, 0xee, 0x1f, 0x25, 0x73, 0x5f, 0xf8, 0x13, 0x53, 0xb1, 0xb3, 0x28, 0x22, 0xae, 0xbe, 0x7c, - 0x46, 0xa0, 0x20, 0x16, 0xf0, 0x59, 0x98, 0x6c, 0xfa, 0x40, 0x7c, 0x5a, 0x82, 0x59, 0x7a, 0x73, - 0xa5, 0xa7, 0xa0, 0x0f, 0x8e, 0x10, 0x00, 0xf4, 0xf5, 0x8c, 0xa8, 0x9f, 0x2d, 0x91, 0x09, 0xc7, - 0x49, 0x84, 0x88, 0xc5, 0x82, 0xaa, 0x0c, 0x24, 0x97, 0xbe, 0x68, 0xff, 0x58, 0x86, 0xe9, 0x65, - 0xec, 0xb5, 0x34, 0x3b, 0x71, 0x4f, 0x74, 0x1e, 0x66, 0xc8, 0xf5, 0x6d, 0x35, 0x76, 0x4c, 0x92, - 0xae, 0x9a, 0x71, 0x69, 0xca, 0x8d, 0x30, 0x7b, 0x09, 0x6f, 0x9a, 0x16, 0xae, 0x71, 0x67, 0x29, - 0xf9, 0xc4, 0x88, 0xf0, 0x74, 0x5c, 0x1c, 0xb4, 0x05, 0x1e, 0x9b, 0x5b, 0x0f, 0x0a, 0x33, 0x54, - 0x95, 0x88, 0x31, 0xe7, 0x59, 0x30, 0xc9, 0x90, 0xf7, 0xcc, 0xb4, 0xb8, 0x7e, 0xd1, 0xcf, 0x8b, - 0xde, 0xe0, 0x23, 0x5a, 0xe6, 0x10, 0x7d, 0x7a, 0x12, 0x26, 0xc6, 0x72, 0xbf, 0x7b, 0x21, 0x54, - 0xfe, 0xc2, 0x7e, 0xa5, 0x6d, 0xa3, 0xb5, 0x64, 0x98, 0x9e, 0x05, 0xf0, 0x1b, 0x87, 0x17, 0xd6, - 0x22, 0x94, 0xc2, 0x47, 0xae, 0x8f, 0x3d, 0xa8, 0xd7, 0x2b, 0x0e, 0xc2, 0xce, 0x88, 0x81, 0x11, - 0x3b, 0xe0, 0x27, 0xc2, 0x49, 0xfa, 0xe8, 0x7c, 0x54, 0x86, 0x53, 0xfe, 0xf9, 0xa3, 0x55, 0xcd, - 0x0e, 0xda, 0x5d, 0x29, 0x19, 0x44, 0xdc, 0x81, 0x0f, 0xbf, 0xb1, 0x7c, 0x25, 0xd9, 0x98, 0xd1, - 0x97, 0x93, 0xd1, 0xa2, 0xa3, 0xdc, 0x0a, 0x27, 0x8c, 0xdd, 0x1d, 0x5f, 0xea, 0xa4, 0xc5, 0xb3, - 0x16, 0x7e, 0xf0, 0x43, 0x92, 0x91, 0x49, 0x84, 0xf9, 0xb1, 0xcc, 0x29, 0xb9, 0x23, 0x5d, 0x4f, - 0x4b, 0x04, 0x23, 0xfa, 0xe7, 0x4c, 0xa2, 0xde, 0x6d, 0xf0, 0x99, 0xaf, 0x04, 0xbd, 0xd4, 0x11, - 0x1e, 0xf8, 0x3a, 0x3f, 0x01, 0xb9, 0xf2, 0x4e, 0xd7, 0xd9, 0x3f, 0xff, 0x64, 0x98, 0xad, 0x3b, - 0x16, 0xd6, 0x76, 0x42, 0x3b, 0x03, 0x8e, 0x79, 0x19, 0x1b, 0xde, 0xce, 0x00, 0x79, 0xb9, 0xeb, - 0x4e, 0x98, 0x30, 0xcc, 0xa6, 0xb6, 0xeb, 0x6c, 0x2b, 0xd7, 0x1f, 0x38, 0x52, 0xcf, 0xc0, 0xaf, - 0xb1, 0x18, 0x46, 0x9f, 0xbb, 0x9b, 0xac, 0x0d, 0xe7, 0x0d, 0xb3, 0xb8, 0xeb, 0x6c, 0x2f, 0x5c, - 0xf7, 0xe1, 0xbf, 0x39, 0x9b, 0xf9, 0xd8, 0xdf, 0x9c, 0xcd, 0x7c, 0xf6, 0x6f, 0xce, 0x66, 0x7e, - 0xe2, 0xf3, 0x67, 0x8f, 0x7d, 0xec, 0xf3, 0x67, 0x8f, 0x7d, 0xfa, 0xf3, 0x67, 0x8f, 0x7d, 0xaf, - 0xd4, 0xbd, 0x74, 0x29, 0x4f, 0xa8, 0x3c, 0xe3, 0xff, 0x0d, 0x00, 0x00, 0xff, 0xff, 0xeb, 0xa8, - 0x5c, 0x9b, 0xeb, 0x0a, 0x02, 0x00, + 0x17, 0x6f, 0xda, 0xd5, 0x78, 0x35, 0xbc, 0x23, 0x91, 0x64, 0xfa, 0xf5, 0xd3, 0x81, 0x9d, 0xac, + 0x72, 0x0a, 0x76, 0xcf, 0xd0, 0x94, 0xc7, 0xb3, 0x1b, 0x56, 0xec, 0x76, 0x3b, 0x97, 0x1b, 0x2c, + 0xf8, 0x4a, 0xa2, 0xdd, 0xb0, 0x50, 0x0c, 0x17, 0xa9, 0x37, 0x86, 0x4b, 0xf2, 0xdd, 0x30, 0x8e, + 0x8f, 0x51, 0xec, 0x86, 0xc5, 0x11, 0x4c, 0x5f, 0xb4, 0x2f, 0x9b, 0xa4, 0x56, 0x33, 0x8b, 0xed, + 0xff, 0x9a, 0xfe, 0x9e, 0xd5, 0xc0, 0x3b, 0xbb, 0xf4, 0x0b, 0xfb, 0x1f, 0x7b, 0xa7, 0x89, 0xf2, + 0x34, 0xc8, 0x6f, 0x9a, 0xd6, 0x8e, 0xe6, 0x6d, 0xdc, 0xf7, 0x9e, 0x14, 0x61, 0xf1, 0xf4, 0x97, + 0x48, 0x1e, 0x95, 0xe5, 0x75, 0xe7, 0x23, 0xcf, 0xd6, 0xbb, 0x2c, 0xea, 0xa2, 0xfb, 0xa8, 0x5c, + 0x0f, 0xb3, 0x2c, 0xf8, 0x62, 0x15, 0xdb, 0x0e, 0x6e, 0xb3, 0x88, 0x15, 0x7c, 0xa2, 0x72, 0x16, + 0x66, 0x58, 0xc2, 0x92, 0xde, 0xc1, 0x36, 0x0b, 0x5a, 0xc1, 0xa5, 0x29, 0x27, 0x21, 0xaf, 0xdb, + 0xf7, 0xdb, 0xa6, 0x41, 0xfc, 0xff, 0x27, 0x55, 0xf6, 0xa6, 0xdc, 0x08, 0x47, 0x59, 0x3e, 0xdf, + 0x58, 0xa5, 0x07, 0x76, 0x7a, 0x93, 0x5d, 0xd5, 0x32, 0xcc, 0x75, 0xcb, 0xdc, 0xb2, 0xb0, 0x6d, + 0x93, 0x53, 0x53, 0x93, 0x6a, 0x28, 0x45, 0x79, 0x10, 0x8e, 0x75, 0x74, 0xe3, 0xa2, 0x4d, 0x82, + 0xf4, 0x2e, 0x31, 0xb7, 0xb1, 0x99, 0x3e, 0xc1, 0xb3, 0x43, 0x8d, 0x8d, 0xc9, 0x21, 0xfc, 0x8b, + 0xba, 0x9f, 0x0a, 0x7a, 0x49, 0x06, 0x66, 0xc2, 0x09, 0x8a, 0x06, 0x8a, 0xd7, 0x8d, 0xd9, 0xe7, + 0xb7, 0x75, 0x07, 0xbb, 0xc4, 0xd8, 0xd9, 0x94, 0xdb, 0x06, 0x14, 0xa6, 0xee, 0xfb, 0x51, 0xed, + 0x43, 0xcc, 0x15, 0x2a, 0xed, 0xa0, 0x88, 0x27, 0x98, 0xcd, 0x6c, 0x4b, 0x2e, 0x0d, 0x3d, 0x1b, + 0x94, 0xfd, 0xd4, 0x42, 0x5e, 0x1b, 0x99, 0x64, 0x5e, 0x1b, 0xca, 0x4d, 0x50, 0xd0, 0x3a, 0x1d, + 0xf3, 0x12, 0x6e, 0xfb, 0x64, 0x99, 0x6e, 0xed, 0x4b, 0x47, 0x9f, 0x1a, 0x66, 0x1e, 0x97, 0xf8, + 0x5a, 0x09, 0xb7, 0x51, 0xec, 0xb6, 0x5a, 0x18, 0xb7, 0xd9, 0x41, 0x33, 0xef, 0x35, 0xe1, 0x85, + 0x13, 0x89, 0x67, 0x7d, 0x87, 0x74, 0xe3, 0xc4, 0xfb, 0x4f, 0x40, 0x9e, 0xde, 0xde, 0x86, 0x5e, + 0x32, 0xd7, 0xb7, 0x6f, 0x98, 0xe3, 0xfb, 0x86, 0x0d, 0x98, 0x31, 0x4c, 0xb7, 0xb8, 0x75, 0xcd, + 0xd2, 0x76, 0xec, 0xb8, 0x45, 0x5d, 0x4a, 0xd7, 0x1f, 0xc1, 0xab, 0xa1, 0xdf, 0x56, 0x8e, 0xa8, + 0x1c, 0x19, 0xe5, 0xff, 0x07, 0x47, 0x2f, 0xb0, 0x80, 0x0c, 0x36, 0xa3, 0x2c, 0x45, 0xbb, 0x3c, + 0xf6, 0x50, 0x5e, 0xe0, 0xff, 0x5c, 0x39, 0xa2, 0xf6, 0x12, 0x53, 0x7e, 0x04, 0xe6, 0xdc, 0xd7, + 0xb6, 0x79, 0xc9, 0x63, 0x5c, 0x8e, 0xb6, 0xfb, 0x7a, 0xc8, 0xaf, 0x71, 0x3f, 0xae, 0x1c, 0x51, + 0x7b, 0x48, 0x29, 0x35, 0x80, 0x6d, 0x67, 0xa7, 0xc3, 0x08, 0x67, 0xa3, 0x55, 0xb2, 0x87, 0xf0, + 0x8a, 0xff, 0xd3, 0xca, 0x11, 0x35, 0x44, 0x42, 0x59, 0x85, 0x29, 0xe7, 0x61, 0x87, 0xd1, 0xcb, + 0x45, 0xfb, 0x1a, 0xf4, 0xd0, 0x6b, 0x78, 0xff, 0xac, 0x1c, 0x51, 0x03, 0x02, 0x4a, 0x05, 0x26, + 0xbb, 0x17, 0x18, 0xb1, 0x7c, 0x74, 0xff, 0xd4, 0x43, 0x6c, 0xfd, 0x82, 0x4f, 0xcb, 0xff, 0xdd, + 0x65, 0xac, 0x65, 0xef, 0x31, 0x5a, 0x13, 0xc2, 0x8c, 0x95, 0xbc, 0x7f, 0x5c, 0xc6, 0x7c, 0x02, + 0x4a, 0x05, 0xa6, 0x6c, 0x43, 0xeb, 0xda, 0xdb, 0xa6, 0x63, 0x9f, 0x9a, 0xec, 0x71, 0x4b, 0x8d, + 0xa6, 0x56, 0x67, 0xff, 0xa8, 0xc1, 0xdf, 0xca, 0xd3, 0xe0, 0xc4, 0x6e, 0xb7, 0xad, 0x39, 0xb8, + 0xfc, 0xb0, 0x6e, 0x3b, 0xba, 0xb1, 0xe5, 0x85, 0xf4, 0xa5, 0x9d, 0x7b, 0xff, 0x8f, 0xca, 0x3c, + 0x3b, 0xa0, 0x06, 0xa4, 0x6d, 0xa2, 0xde, 0xbd, 0x51, 0x5a, 0x6c, 0xe8, 0x5c, 0xda, 0x33, 0x21, + 0xeb, 0x7e, 0x22, 0x83, 0xc1, 0x5c, 0xff, 0x75, 0xd7, 0x5e, 0xdd, 0x21, 0x0d, 0xd8, 0xfd, 0xa9, + 0x67, 0x3c, 0x99, 0xd9, 0x37, 0x9e, 0x9c, 0x81, 0x69, 0xdd, 0x5e, 0xd3, 0xb7, 0xa8, 0x31, 0xcb, + 0x8e, 0x1f, 0x84, 0x93, 0xe8, 0xe4, 0xbf, 0x8a, 0x2f, 0xd1, 0x0b, 0x4b, 0x8e, 0x7a, 0x93, 0x7f, + 0x2f, 0x05, 0xdd, 0x00, 0x33, 0xe1, 0x46, 0x46, 0xaf, 0x80, 0xd5, 0x03, 0x53, 0x98, 0xbd, 0xa1, + 0xeb, 0x61, 0x8e, 0xd7, 0xe9, 0xd0, 0x88, 0x2f, 0x7b, 0x5d, 0x21, 0xba, 0x0e, 0x8e, 0xf6, 0x34, + 0x2c, 0x2f, 0xc4, 0x4b, 0x26, 0x08, 0xf1, 0x72, 0x06, 0x20, 0xd0, 0xe2, 0xbe, 0x64, 0xae, 0x85, + 0x29, 0x5f, 0x2f, 0xfb, 0x66, 0xf8, 0x62, 0x06, 0x26, 0x3d, 0x65, 0xeb, 0x97, 0xc1, 0x1d, 0x99, + 0x8c, 0xd0, 0x7e, 0x8e, 0x37, 0x32, 0x85, 0xd3, 0xdc, 0x61, 0x3d, 0xf0, 0xa2, 0x6e, 0xe8, 0x4e, + 0xc7, 0x3b, 0x89, 0xd8, 0x9b, 0xac, 0xac, 0x03, 0xe8, 0x04, 0xa3, 0x46, 0x70, 0x34, 0xf1, 0xd6, + 0x04, 0xed, 0x81, 0xea, 0x43, 0x88, 0xc6, 0xd9, 0xef, 0x63, 0xe7, 0x06, 0xa7, 0x20, 0x47, 0xe3, + 0xda, 0x1f, 0x51, 0xe6, 0x00, 0xca, 0xcf, 0x5a, 0x2f, 0xab, 0x95, 0x72, 0xb5, 0x54, 0x2e, 0x64, + 0xd0, 0xaf, 0x49, 0x30, 0xe5, 0x37, 0x82, 0xbe, 0x95, 0x2c, 0x33, 0xd5, 0x1a, 0x78, 0xcb, 0xe6, + 0xfe, 0x46, 0x15, 0x56, 0xb2, 0x67, 0xc0, 0x95, 0xbb, 0x36, 0x5e, 0xd2, 0x2d, 0xdb, 0x51, 0xcd, + 0x4b, 0x4b, 0xa6, 0x15, 0x0c, 0xac, 0x34, 0xa0, 0x6c, 0xd4, 0x67, 0xd7, 0xc0, 0x6b, 0x63, 0x72, + 0x46, 0x0d, 0x5b, 0x6c, 0xa1, 0x3e, 0x48, 0x70, 0xe9, 0x3a, 0x96, 0x66, 0xd8, 0x5d, 0xd3, 0xc6, + 0xaa, 0x79, 0xc9, 0x2e, 0x1a, 0xed, 0x92, 0xd9, 0xd9, 0xdd, 0x31, 0x6c, 0x66, 0xa2, 0x45, 0x7d, + 0x76, 0xa5, 0x43, 0xee, 0xd0, 0x9d, 0x03, 0x28, 0xd5, 0x56, 0x57, 0xcb, 0xa5, 0x46, 0xa5, 0x56, + 0x2d, 0x1c, 0x71, 0xa5, 0xd5, 0x28, 0x2e, 0xac, 0xba, 0xd2, 0xf9, 0x51, 0x98, 0xf4, 0xda, 0x34, + 0x8b, 0x4a, 0x93, 0xf1, 0xa2, 0xd2, 0x28, 0x45, 0x98, 0xf4, 0x5a, 0x39, 0x1b, 0x11, 0x9e, 0xd8, + 0x7b, 0x0a, 0x79, 0x47, 0xb3, 0x1c, 0x62, 0xa0, 0x78, 0x44, 0x16, 0x34, 0x1b, 0xab, 0xfe, 0x6f, + 0x67, 0x9f, 0xc2, 0x38, 0x50, 0x60, 0xae, 0xb8, 0xba, 0xda, 0xac, 0xa9, 0xcd, 0x6a, 0xad, 0xb1, + 0x52, 0xa9, 0x2e, 0xd3, 0x11, 0xb2, 0xb2, 0x5c, 0xad, 0xa9, 0x65, 0x3a, 0x40, 0xd6, 0x0b, 0x19, + 0x7a, 0x87, 0xf3, 0xc2, 0x24, 0xe4, 0xbb, 0x44, 0xba, 0xe8, 0xf3, 0x72, 0xc2, 0xf0, 0x03, 0x3e, + 0x4e, 0x11, 0xb7, 0xcc, 0x72, 0x47, 0x00, 0xa4, 0x3e, 0x47, 0x74, 0xcf, 0xc2, 0x0c, 0x35, 0xad, + 0x6d, 0xb2, 0x9b, 0x42, 0x90, 0x93, 0x55, 0x2e, 0x0d, 0x7d, 0x50, 0x4a, 0x10, 0x93, 0xa0, 0x2f, + 0x47, 0xc9, 0x8c, 0x8b, 0x3f, 0xcf, 0x0c, 0x77, 0x0b, 0x44, 0xa5, 0xda, 0x28, 0xab, 0xd5, 0xe2, + 0x2a, 0xcb, 0x22, 0x2b, 0xa7, 0xe0, 0x78, 0xb5, 0xc6, 0x42, 0x2c, 0xd6, 0x9b, 0x8d, 0x5a, 0xb3, + 0xb2, 0xb6, 0x5e, 0x53, 0x1b, 0x85, 0x9c, 0x72, 0x12, 0x14, 0xfa, 0xdc, 0xac, 0xd4, 0x9b, 0xa5, + 0x62, 0xb5, 0x54, 0x5e, 0x2d, 0x2f, 0x16, 0xf2, 0xca, 0x93, 0xe0, 0x3a, 0x7a, 0xab, 0x50, 0x6d, + 0xa9, 0xa9, 0xd6, 0xce, 0xd7, 0x5d, 0x04, 0xd5, 0xf2, 0x6a, 0xd1, 0x55, 0xa4, 0xd0, 0x5d, 0xce, + 0x13, 0xca, 0x15, 0x70, 0x94, 0x5c, 0xf4, 0xbe, 0x5a, 0x2b, 0x2e, 0xb2, 0xf2, 0x26, 0x95, 0x6b, + 0xe0, 0x54, 0xa5, 0x5a, 0xdf, 0x58, 0x5a, 0xaa, 0x94, 0x2a, 0xe5, 0x6a, 0xa3, 0xb9, 0x5e, 0x56, + 0xd7, 0x2a, 0xf5, 0xba, 0xfb, 0x6f, 0x61, 0x8a, 0xdc, 0x94, 0x4b, 0xfb, 0x4c, 0xf4, 0x4e, 0x19, + 0x66, 0xcf, 0x69, 0x1d, 0xdd, 0x1d, 0x28, 0xc8, 0x15, 0xda, 0x3d, 0xa7, 0x77, 0x1c, 0x72, 0xd5, + 0x36, 0xf3, 0xff, 0x27, 0x2f, 0xe8, 0x27, 0xe5, 0x84, 0xa7, 0x77, 0x18, 0x10, 0xb4, 0xc4, 0x79, + 0xae, 0xb4, 0x88, 0xb9, 0xe6, 0x2b, 0xa5, 0x04, 0xa7, 0x77, 0xc4, 0xc9, 0x27, 0x03, 0xff, 0xd7, + 0x47, 0x05, 0x7e, 0x01, 0x66, 0x36, 0xaa, 0xc5, 0x8d, 0xc6, 0x4a, 0x4d, 0xad, 0xfc, 0x30, 0x09, + 0xfe, 0x3e, 0x0b, 0x53, 0x4b, 0x35, 0x75, 0xa1, 0xb2, 0xb8, 0x58, 0xae, 0x16, 0x72, 0xca, 0x95, + 0x70, 0x45, 0xbd, 0xac, 0x9e, 0xab, 0x94, 0xca, 0xcd, 0x8d, 0x6a, 0xf1, 0x5c, 0xb1, 0xb2, 0x4a, + 0xfa, 0x88, 0x7c, 0xcc, 0xf5, 0xdf, 0x13, 0xe8, 0xc7, 0xb3, 0x00, 0xb4, 0xea, 0xe4, 0xee, 0xa3, + 0xd0, 0x25, 0xd1, 0x9f, 0x49, 0x3a, 0x69, 0x08, 0xc8, 0x44, 0xb4, 0xdf, 0x0a, 0x4c, 0x5a, 0xec, + 0x03, 0x5b, 0xcd, 0x1a, 0x44, 0x87, 0x3e, 0x7a, 0xd4, 0x54, 0xff, 0x77, 0xf4, 0xae, 0x24, 0x73, + 0x84, 0x48, 0xc6, 0x92, 0x21, 0xb9, 0x34, 0x1a, 0x20, 0xd1, 0x0b, 0x33, 0x30, 0xc7, 0x57, 0xcc, + 0xad, 0x04, 0x31, 0xa6, 0xc4, 0x2a, 0xc1, 0xff, 0x1c, 0x32, 0xb2, 0xce, 0x3e, 0x95, 0x0d, 0xa7, + 0xe0, 0xb5, 0x4c, 0x7a, 0x10, 0xdf, 0xb3, 0x58, 0x0a, 0x19, 0x97, 0x79, 0xd7, 0xe8, 0x28, 0x48, + 0xca, 0x04, 0xc8, 0x8d, 0x87, 0x9d, 0x82, 0x8c, 0xbe, 0x28, 0xc3, 0x2c, 0x77, 0x0b, 0x35, 0x7a, + 0x65, 0x46, 0xe4, 0x86, 0xd8, 0xd0, 0xfd, 0xd6, 0x99, 0x83, 0xde, 0x6f, 0x7d, 0xf6, 0x16, 0x98, + 0x60, 0x69, 0x44, 0xbe, 0xb5, 0xaa, 0x6b, 0x0a, 0x1c, 0x85, 0xe9, 0xe5, 0x72, 0xa3, 0x59, 0x6f, + 0x14, 0xd5, 0x46, 0x79, 0xb1, 0x90, 0x71, 0x07, 0xbe, 0xf2, 0xda, 0x7a, 0xe3, 0xc1, 0x82, 0x94, + 0xdc, 0x21, 0xb2, 0x97, 0x91, 0x31, 0x3b, 0x44, 0xc6, 0x15, 0x9f, 0xfe, 0x5c, 0xf5, 0x13, 0x32, + 0x14, 0x28, 0x07, 0xe5, 0x87, 0xbb, 0xd8, 0xd2, 0xb1, 0xd1, 0xc2, 0xe8, 0xa2, 0x48, 0x00, 0xd6, + 0x7d, 0xa1, 0x09, 0x49, 0x7f, 0x1e, 0xb2, 0x12, 0xe9, 0x4b, 0x8f, 0x81, 0x9d, 0xdd, 0x67, 0x60, + 0x7f, 0x3c, 0xa9, 0x47, 0x64, 0x2f, 0xbb, 0x23, 0x81, 0xec, 0x23, 0x49, 0x3c, 0x22, 0x07, 0x70, + 0x30, 0x96, 0xb8, 0xca, 0x11, 0xe3, 0x6f, 0x41, 0x46, 0x2f, 0x90, 0xe1, 0xe8, 0xa2, 0xe6, 0xe0, + 0x85, 0xcb, 0x0d, 0xef, 0x96, 0xc8, 0x88, 0x9b, 0x9d, 0x33, 0xfb, 0x6e, 0x76, 0x0e, 0x2e, 0x9a, + 0x94, 0x7a, 0x2e, 0x9a, 0x44, 0x6f, 0x4b, 0x7a, 0x86, 0xb2, 0x87, 0x87, 0x91, 0x05, 0x3f, 0x4e, + 0x76, 0x36, 0x32, 0x9e, 0x8b, 0xf4, 0x1b, 0xd8, 0x9b, 0xa6, 0xa0, 0x40, 0x59, 0x09, 0x39, 0xfd, + 0xfd, 0x22, 0xbb, 0x0c, 0xbd, 0x99, 0x20, 0xc6, 0xa2, 0x17, 0xb5, 0x42, 0xe2, 0xa3, 0x56, 0x70, + 0x6b, 0xc8, 0x72, 0xaf, 0xa3, 0x46, 0xd2, 0xce, 0x30, 0xe4, 0xe1, 0x17, 0x1d, 0xd6, 0x36, 0xbd, + 0xce, 0x30, 0xb6, 0xf8, 0xf1, 0x5c, 0xd8, 0xcb, 0xae, 0xd5, 0x2c, 0x8b, 0x22, 0x13, 0x7f, 0x2f, + 0x79, 0x52, 0x77, 0x6f, 0xce, 0xc3, 0x32, 0xe6, 0xb2, 0xee, 0xf4, 0xdc, 0xbd, 0x07, 0x71, 0x90, + 0x3e, 0x0a, 0xdf, 0x91, 0x20, 0x5b, 0x37, 0x2d, 0x67, 0x54, 0x18, 0x24, 0xdd, 0xa2, 0x0e, 0x49, + 0xa0, 0x1e, 0x3d, 0xe7, 0x4c, 0x6f, 0x8b, 0x3a, 0xbe, 0xfc, 0x31, 0x84, 0xa9, 0x3c, 0x0a, 0x73, + 0x94, 0x13, 0xff, 0x0e, 0x97, 0x6f, 0x4b, 0xb4, 0xbf, 0x7a, 0x40, 0x14, 0x11, 0xb2, 0xf1, 0xe1, + 0x6f, 0x11, 0x7b, 0xa0, 0x70, 0x69, 0xe8, 0xb5, 0x61, 0x5c, 0x16, 0x79, 0x5c, 0xfa, 0xcd, 0xb8, + 0xfd, 0x6b, 0x50, 0x46, 0xd5, 0x33, 0x25, 0x89, 0x78, 0x19, 0x53, 0x78, 0xfa, 0x88, 0x3c, 0x22, + 0x43, 0x9e, 0xb9, 0xe8, 0x8d, 0x14, 0x81, 0xa4, 0x2d, 0xc3, 0x17, 0x82, 0x98, 0x2b, 0x9f, 0x3c, + 0xea, 0x96, 0x11, 0x5f, 0x7e, 0xfa, 0x38, 0xfc, 0x3b, 0xf3, 0x3d, 0x2d, 0xee, 0x69, 0x7a, 0x47, + 0xbb, 0xd0, 0x49, 0x10, 0x69, 0xfa, 0x83, 0x09, 0x4f, 0xdb, 0xf9, 0x55, 0xe5, 0xca, 0x8b, 0x90, + 0xf8, 0x0f, 0xc0, 0x94, 0xc5, 0xed, 0xf5, 0xb9, 0x56, 0x54, 0x8f, 0xdf, 0x2f, 0xfb, 0xae, 0x06, + 0x39, 0x13, 0x1d, 0xad, 0x13, 0xe2, 0x67, 0x2c, 0x47, 0x81, 0xa6, 0x8b, 0xed, 0xf6, 0x12, 0xd6, + 0x9c, 0x5d, 0x0b, 0xb7, 0x13, 0x0d, 0x11, 0x56, 0xcf, 0x76, 0x68, 0x48, 0x12, 0x5c, 0xac, 0xc7, + 0x55, 0x1e, 0x9d, 0xa7, 0x0f, 0xe8, 0x0d, 0x3c, 0x5e, 0x46, 0xd2, 0x25, 0xbd, 0xd1, 0x87, 0xa4, + 0xc6, 0x41, 0xf2, 0xcc, 0xe1, 0x98, 0x48, 0x1f, 0x90, 0x5f, 0x96, 0x61, 0x8e, 0xda, 0x09, 0xa3, + 0xc6, 0xe4, 0xf7, 0x13, 0xba, 0xf4, 0x84, 0x6e, 0xc9, 0x0a, 0xb3, 0x33, 0x12, 0x58, 0x92, 0x38, + 0x00, 0x89, 0xf1, 0x91, 0x3e, 0x32, 0x9f, 0xca, 0x03, 0x84, 0xdc, 0x34, 0x3f, 0x98, 0x0f, 0xe2, + 0x2e, 0xa2, 0x37, 0xb3, 0xf9, 0x47, 0x9d, 0x0b, 0x02, 0x1e, 0x72, 0xc1, 0xf4, 0x37, 0xa4, 0xf8, + 0x44, 0xa1, 0x51, 0xe5, 0xcf, 0x13, 0xda, 0xbc, 0xcc, 0x49, 0x72, 0xe0, 0xe0, 0x3e, 0x64, 0x2f, + 0xf7, 0xa1, 0x04, 0xc6, 0xef, 0x20, 0x56, 0x92, 0xa1, 0xb6, 0x3a, 0xc4, 0xcc, 0xfe, 0x14, 0x1c, + 0x57, 0xcb, 0xc5, 0xc5, 0x5a, 0x75, 0xf5, 0xc1, 0xf0, 0x95, 0x49, 0x05, 0x39, 0x3c, 0x39, 0x49, + 0x05, 0xb6, 0x57, 0x27, 0xec, 0x03, 0x79, 0x59, 0xc5, 0xcd, 0x56, 0x42, 0x8b, 0x2b, 0x83, 0x7b, + 0x35, 0x01, 0xb2, 0x87, 0x89, 0xc2, 0x23, 0x10, 0x6a, 0x46, 0x3f, 0x2d, 0x43, 0x81, 0xf8, 0xfe, + 0x10, 0x2e, 0xd9, 0xdd, 0x78, 0x35, 0xde, 0x8b, 0xb3, 0x4b, 0xf7, 0x9f, 0x02, 0x2f, 0x4e, 0x2f, + 0x41, 0xb9, 0x01, 0xe6, 0x5a, 0xdb, 0xb8, 0x75, 0xb1, 0x62, 0x78, 0xfb, 0xea, 0x74, 0x13, 0xb6, + 0x27, 0x95, 0x07, 0xe6, 0x01, 0x1e, 0x18, 0x7e, 0x12, 0xcd, 0x0d, 0xd2, 0x61, 0xa6, 0x22, 0x70, + 0xf9, 0x23, 0x1f, 0x97, 0x2a, 0x87, 0xcb, 0x9d, 0x43, 0x51, 0x4d, 0x06, 0x4b, 0x75, 0x08, 0x58, + 0x10, 0x9c, 0xac, 0xad, 0x37, 0x2a, 0xb5, 0x6a, 0x73, 0xa3, 0x5e, 0x5e, 0x6c, 0x2e, 0x78, 0xe0, + 0xd4, 0x0b, 0x32, 0xfa, 0xaa, 0x04, 0x13, 0x94, 0x2d, 0x1b, 0x3d, 0x39, 0x80, 0x60, 0xa0, 0xfb, + 0x2a, 0x7a, 0x93, 0x70, 0x30, 0x0a, 0x5f, 0x10, 0xac, 0x9c, 0x88, 0x7e, 0xea, 0x19, 0x30, 0x41, + 0x41, 0xf6, 0x56, 0xb4, 0x4e, 0x47, 0xf4, 0x52, 0x8c, 0x8c, 0xea, 0x65, 0x17, 0x0c, 0x4c, 0x31, + 0x80, 0x8d, 0xf4, 0x47, 0x96, 0xe7, 0x64, 0xa9, 0x19, 0x7c, 0x5e, 0x77, 0xb6, 0x89, 0x77, 0x2b, + 0xfa, 0x21, 0x91, 0xe5, 0xc5, 0x9b, 0x21, 0xb7, 0xe7, 0xe6, 0x1e, 0xe0, 0x29, 0x4c, 0x33, 0xa1, + 0x5f, 0x17, 0x8e, 0x83, 0xca, 0xe9, 0xa7, 0xcf, 0x53, 0x04, 0x38, 0x6b, 0x90, 0xed, 0xe8, 0xb6, + 0xc3, 0xc6, 0x8f, 0x3b, 0x12, 0x11, 0xf2, 0x1e, 0x2a, 0x0e, 0xde, 0x51, 0x09, 0x19, 0x74, 0x3f, + 0xcc, 0x84, 0x53, 0x05, 0xbc, 0xa5, 0x4f, 0xc1, 0x04, 0x3b, 0xc5, 0xc7, 0x96, 0x58, 0xbd, 0x57, + 0xc1, 0x65, 0x4d, 0xa1, 0xda, 0xa6, 0xaf, 0x03, 0xff, 0xf7, 0x51, 0x98, 0x58, 0xd1, 0x6d, 0xc7, + 0xb4, 0x2e, 0xa3, 0x47, 0x33, 0x30, 0x71, 0x0e, 0x5b, 0xb6, 0x6e, 0x1a, 0xfb, 0x5c, 0x0d, 0xce, + 0xc0, 0x74, 0xd7, 0xc2, 0x7b, 0xba, 0xb9, 0x6b, 0x07, 0x8b, 0x33, 0xe1, 0x24, 0x05, 0xc1, 0xa4, + 0xb6, 0xeb, 0x6c, 0x9b, 0x56, 0x10, 0xfc, 0xc3, 0x7b, 0x57, 0x4e, 0x03, 0xd0, 0xe7, 0xaa, 0xb6, + 0x83, 0x99, 0x03, 0x45, 0x28, 0x45, 0x51, 0x20, 0xeb, 0xe8, 0x3b, 0x98, 0x45, 0x03, 0x26, 0xcf, + 0xae, 0x80, 0x49, 0x64, 0x3d, 0x16, 0xc1, 0x50, 0x56, 0xbd, 0x57, 0xf4, 0x59, 0x19, 0xa6, 0x97, + 0xb1, 0xc3, 0x58, 0xb5, 0xd1, 0x8b, 0x32, 0x42, 0x17, 0x70, 0xb8, 0x63, 0x6c, 0x47, 0xb3, 0xbd, + 0xff, 0xfc, 0x25, 0x58, 0x3e, 0x31, 0x08, 0x4d, 0x2c, 0x87, 0xe3, 0x92, 0x93, 0x38, 0x75, 0x4e, + 0x85, 0xba, 0xc1, 0xb2, 0xcc, 0x6c, 0x13, 0x64, 0xff, 0x07, 0xf4, 0x76, 0x49, 0xf4, 0x8c, 0x37, + 0x93, 0xfd, 0x7c, 0xa8, 0x3e, 0x91, 0xdd, 0xd1, 0xe4, 0x1e, 0xcb, 0xb1, 0x2f, 0xe4, 0x7c, 0x98, + 0x12, 0x23, 0xa3, 0xfa, 0xb9, 0x05, 0x4f, 0x87, 0x0f, 0xe6, 0x24, 0x7d, 0x6d, 0xfc, 0xa6, 0x0c, + 0xd3, 0xf5, 0x6d, 0xf3, 0x92, 0x27, 0xc7, 0x1f, 0x15, 0x03, 0xf6, 0x1a, 0x98, 0xda, 0xeb, 0x01, + 0x35, 0x48, 0x88, 0xbe, 0x12, 0x1f, 0x3d, 0x5f, 0x4e, 0x0a, 0x53, 0x88, 0xb9, 0x91, 0x5f, 0x58, + 0xaf, 0x3c, 0x1d, 0x26, 0x18, 0xd7, 0x6c, 0xc9, 0x25, 0x1e, 0x60, 0x2f, 0x73, 0xb8, 0x82, 0x59, + 0xbe, 0x82, 0xc9, 0x90, 0x8f, 0xae, 0x5c, 0xfa, 0xc8, 0xff, 0x89, 0x44, 0x62, 0x83, 0x78, 0xc0, + 0x97, 0x46, 0x00, 0x3c, 0xfa, 0x56, 0x46, 0x74, 0x61, 0xd2, 0x97, 0x80, 0xcf, 0xc1, 0x81, 0x2e, + 0xd7, 0x19, 0x48, 0x2e, 0x7d, 0x79, 0xfe, 0x5a, 0x16, 0x66, 0x16, 0xf5, 0xcd, 0x4d, 0xbf, 0x93, + 0x7c, 0xb1, 0x60, 0x27, 0x19, 0xed, 0x0e, 0xe0, 0xda, 0xb9, 0xbb, 0x96, 0x85, 0x0d, 0xaf, 0x52, + 0xac, 0x39, 0xf5, 0xa4, 0x2a, 0x37, 0xc2, 0x51, 0x6f, 0x5c, 0x08, 0x77, 0x94, 0x53, 0x6a, 0x6f, + 0x32, 0xfa, 0x86, 0xf0, 0xae, 0x96, 0x27, 0xd1, 0x70, 0x95, 0x22, 0x1a, 0xe0, 0x5d, 0x30, 0xbb, + 0x4d, 0x73, 0x93, 0xa9, 0xbf, 0xd7, 0x59, 0x9e, 0xec, 0x89, 0xbd, 0xbc, 0x86, 0x6d, 0x5b, 0xdb, + 0xc2, 0x2a, 0x9f, 0xb9, 0xa7, 0xf9, 0xca, 0x49, 0x6e, 0x12, 0x13, 0xdb, 0x20, 0x13, 0xa8, 0xc9, + 0x18, 0xb4, 0xe3, 0x2c, 0x64, 0x97, 0xf4, 0x0e, 0x46, 0x3f, 0x23, 0xc1, 0x94, 0x8a, 0x5b, 0xa6, + 0xd1, 0x72, 0xdf, 0x42, 0xce, 0x41, 0xff, 0x98, 0x11, 0xbd, 0x41, 0xd3, 0xa5, 0x33, 0xef, 0xd3, + 0x88, 0x68, 0x37, 0x62, 0x37, 0x65, 0xc6, 0x92, 0x1a, 0xc3, 0x7d, 0x27, 0xee, 0xd4, 0x63, 0x73, + 0xb3, 0x63, 0x6a, 0xdc, 0xe2, 0x57, 0xaf, 0x29, 0x74, 0x13, 0x14, 0xbc, 0x23, 0x37, 0xa6, 0xb3, + 0xae, 0x1b, 0x86, 0x7f, 0xa6, 0x7b, 0x5f, 0x3a, 0xbf, 0x6f, 0x1b, 0x1b, 0x16, 0x87, 0xd4, 0x9d, + 0x95, 0x1e, 0xa1, 0xd9, 0x37, 0xc0, 0xdc, 0x85, 0xcb, 0x0e, 0xb6, 0x59, 0x2e, 0x56, 0x6c, 0x56, + 0xed, 0x49, 0x0d, 0x05, 0xb5, 0x8e, 0x0b, 0x9f, 0x13, 0x53, 0x60, 0x32, 0x51, 0xaf, 0x0c, 0x31, + 0x03, 0x3c, 0x0e, 0x85, 0x6a, 0x6d, 0xb1, 0x4c, 0x7c, 0xd5, 0x3c, 0xef, 0x9f, 0x2d, 0xf4, 0x0b, + 0x32, 0xcc, 0x10, 0x67, 0x12, 0x0f, 0x85, 0xeb, 0x04, 0xe6, 0x23, 0xe8, 0x31, 0x61, 0x3f, 0x36, + 0x52, 0xe5, 0x70, 0x01, 0xd1, 0x82, 0xde, 0xd4, 0x3b, 0xbd, 0x82, 0xce, 0xa9, 0x3d, 0xa9, 0x7d, + 0x00, 0x91, 0xfb, 0x02, 0xf2, 0xbb, 0x42, 0xce, 0x6c, 0x83, 0xb8, 0x3b, 0x2c, 0x54, 0x7e, 0x4f, + 0x86, 0x69, 0x77, 0x92, 0xe2, 0x81, 0x52, 0xe3, 0x40, 0x31, 0x8d, 0xce, 0xe5, 0x60, 0x59, 0xc4, + 0x7b, 0x4d, 0xd4, 0x48, 0xfe, 0x52, 0x78, 0xe6, 0x4e, 0x44, 0x14, 0xe2, 0x65, 0x4c, 0xf8, 0xbd, + 0x5b, 0x68, 0x3e, 0x3f, 0x80, 0xb9, 0xc3, 0x82, 0xef, 0xcb, 0x39, 0xc8, 0x6f, 0x74, 0x09, 0x72, + 0xbf, 0x2e, 0x8b, 0x04, 0x88, 0xdf, 0x77, 0x90, 0xc1, 0x35, 0xb3, 0x3a, 0x66, 0x4b, 0xeb, 0xac, + 0x07, 0x27, 0xc2, 0x82, 0x04, 0xe5, 0x4e, 0xe6, 0xdb, 0x48, 0x4f, 0x37, 0xde, 0x10, 0x1b, 0x3b, + 0x9d, 0xc8, 0x28, 0x74, 0x68, 0xe4, 0x66, 0x38, 0xd6, 0xd6, 0x6d, 0xed, 0x42, 0x07, 0x97, 0x8d, + 0x96, 0x75, 0x99, 0x8a, 0x83, 0x4d, 0xab, 0xf6, 0x7d, 0x50, 0xee, 0x86, 0x9c, 0xed, 0x5c, 0xee, + 0xd0, 0x79, 0x62, 0xf8, 0x8c, 0x49, 0x64, 0x51, 0x75, 0x37, 0xbb, 0x4a, 0xff, 0x0a, 0xbb, 0x28, + 0x4d, 0x08, 0x5e, 0x9f, 0xfd, 0x54, 0xc8, 0x9b, 0x96, 0xbe, 0xa5, 0xd3, 0xeb, 0x90, 0xe6, 0xf6, + 0x85, 0x08, 0xa4, 0xa6, 0x40, 0x8d, 0x64, 0x51, 0x59, 0x56, 0xe5, 0xe9, 0x30, 0xa5, 0xef, 0x68, + 0x5b, 0xf8, 0x01, 0xdd, 0xa0, 0x07, 0x28, 0xe7, 0x6e, 0x3f, 0xb5, 0xef, 0xf8, 0x0c, 0xfb, 0xae, + 0x06, 0x59, 0xd1, 0xbb, 0x25, 0xd1, 0x38, 0x46, 0xa4, 0x6e, 0x14, 0xd4, 0xb1, 0x5c, 0x23, 0x8e, + 0x5e, 0x21, 0x14, 0x61, 0x28, 0x9a, 0xad, 0xf4, 0x07, 0xef, 0x4f, 0x4b, 0x30, 0xb9, 0x68, 0x5e, + 0x32, 0x88, 0xa2, 0xdf, 0x21, 0x66, 0xeb, 0xf6, 0x39, 0xe4, 0xc8, 0xdf, 0xd2, 0x19, 0x7b, 0xa2, + 0x81, 0xd4, 0xd6, 0x2b, 0x32, 0x02, 0x86, 0xd8, 0x96, 0x23, 0x78, 0x77, 0x62, 0x5c, 0x39, 0xe9, + 0xcb, 0xf5, 0x4f, 0x65, 0xc8, 0x2e, 0x5a, 0x66, 0x17, 0xbd, 0x31, 0x93, 0xc0, 0x65, 0xa1, 0x6d, + 0x99, 0xdd, 0x06, 0xb9, 0xfc, 0x2c, 0x38, 0xc6, 0x11, 0x4e, 0x53, 0xee, 0x80, 0xc9, 0xae, 0x69, + 0xeb, 0x8e, 0x37, 0x8d, 0x98, 0xbb, 0xfd, 0x09, 0x7d, 0x5b, 0xf3, 0x3a, 0xcb, 0xa4, 0xfa, 0xd9, + 0xdd, 0x5e, 0x9b, 0x88, 0xd0, 0x95, 0x8b, 0x2b, 0x46, 0xef, 0x02, 0xb8, 0x9e, 0x54, 0xf4, 0x92, + 0x30, 0x92, 0xcf, 0xe4, 0x91, 0x7c, 0x62, 0x1f, 0x09, 0x5b, 0x66, 0x77, 0x24, 0x9b, 0x8c, 0x2f, + 0xf3, 0x51, 0xbd, 0x87, 0x43, 0xf5, 0x26, 0xa1, 0x32, 0xd3, 0x47, 0xf4, 0xdd, 0x59, 0x00, 0x62, + 0x66, 0x6c, 0xb8, 0x13, 0x20, 0x31, 0x1b, 0xeb, 0xa7, 0xb2, 0x21, 0x59, 0x16, 0x79, 0x59, 0x3e, + 0x39, 0xc2, 0x8a, 0x21, 0xe4, 0x23, 0x24, 0x5a, 0x84, 0xdc, 0xae, 0xfb, 0x99, 0x49, 0x54, 0x90, + 0x04, 0x79, 0x55, 0xe9, 0x9f, 0xe8, 0x4f, 0x32, 0x90, 0x23, 0x09, 0xca, 0x69, 0x00, 0x32, 0xb0, + 0xd3, 0x03, 0x41, 0x19, 0x32, 0x84, 0x87, 0x52, 0x88, 0xb6, 0xea, 0x6d, 0xf6, 0x99, 0x9a, 0xcc, + 0x41, 0x82, 0xfb, 0x37, 0x19, 0xee, 0x09, 0x2d, 0x66, 0x00, 0x84, 0x52, 0xdc, 0xbf, 0xc9, 0xdb, + 0x2a, 0xde, 0xa4, 0x71, 0xa9, 0xb3, 0x6a, 0x90, 0xe0, 0xff, 0xbd, 0xea, 0xdf, 0x66, 0xe6, 0xfd, + 0x4d, 0x52, 0xdc, 0xc9, 0x30, 0x51, 0xcb, 0x85, 0xa0, 0x88, 0x3c, 0xc9, 0xd4, 0x9b, 0x8c, 0x5e, + 0xed, 0xab, 0xcd, 0x22, 0xa7, 0x36, 0xb7, 0x26, 0x10, 0x6f, 0xfa, 0xca, 0xf3, 0xc5, 0x1c, 0x4c, + 0x55, 0xcd, 0x36, 0xd3, 0x9d, 0xd0, 0x84, 0xf1, 0x23, 0xb9, 0x44, 0x13, 0x46, 0x9f, 0x46, 0x84, + 0x82, 0xdc, 0xc7, 0x2b, 0x88, 0x18, 0x85, 0xb0, 0x7e, 0x28, 0x0b, 0x90, 0x27, 0xda, 0xbb, 0xff, + 0x9a, 0xac, 0x38, 0x12, 0x44, 0xb4, 0x2a, 0xfb, 0xf3, 0x3f, 0x9c, 0x8e, 0xfd, 0x57, 0xc8, 0x91, + 0x0a, 0xc6, 0xec, 0xee, 0xf0, 0x15, 0x95, 0xe2, 0x2b, 0x2a, 0xc7, 0x57, 0x34, 0xdb, 0x5b, 0xd1, + 0x24, 0xeb, 0x00, 0x51, 0x1a, 0x92, 0xbe, 0x8e, 0xff, 0xc3, 0x04, 0x40, 0x55, 0xdb, 0xd3, 0xb7, + 0xe8, 0xee, 0xf0, 0x67, 0xbd, 0xf9, 0x0f, 0xdb, 0xc7, 0xfd, 0x6f, 0xa1, 0x81, 0xf0, 0x0e, 0x98, + 0x60, 0xe3, 0x1e, 0xab, 0xc8, 0xb5, 0x5c, 0x45, 0x02, 0x2a, 0xd4, 0x2c, 0x7d, 0xd8, 0x51, 0xbd, + 0xfc, 0xdc, 0x8d, 0xbe, 0x52, 0xcf, 0x8d, 0xbe, 0xfd, 0xf7, 0x20, 0x22, 0xee, 0xf9, 0x45, 0xef, + 0x10, 0xf6, 0xe8, 0x0f, 0xf1, 0x13, 0xaa, 0x51, 0x44, 0x13, 0x7c, 0x2a, 0x4c, 0x98, 0xfe, 0x86, + 0xb6, 0x1c, 0xb9, 0x0e, 0x56, 0x31, 0x36, 0x4d, 0xd5, 0xcb, 0x29, 0xb8, 0xf9, 0x25, 0xc4, 0xc7, + 0x58, 0x0e, 0xcd, 0x9c, 0x5c, 0xf6, 0x62, 0x7c, 0xb9, 0xf5, 0x38, 0xaf, 0x3b, 0xdb, 0xab, 0xba, + 0x71, 0xd1, 0x46, 0xff, 0x59, 0xcc, 0x82, 0x0c, 0xe1, 0x2f, 0x25, 0xc3, 0x9f, 0x8f, 0xd9, 0x51, + 0xe7, 0x51, 0xbb, 0x3b, 0x8a, 0x4a, 0x7f, 0x6e, 0x23, 0x00, 0xbc, 0x13, 0xf2, 0x94, 0x51, 0xd6, + 0x89, 0x9e, 0x8d, 0xc4, 0xcf, 0xa7, 0xa4, 0xb2, 0x3f, 0xd0, 0xdb, 0x7d, 0x1c, 0xcf, 0x71, 0x38, + 0x2e, 0x1c, 0x88, 0xb3, 0xd4, 0x21, 0x3d, 0x7b, 0x1b, 0x4c, 0x30, 0x49, 0x2b, 0x73, 0xe1, 0x56, + 0x5c, 0x38, 0xa2, 0x00, 0xe4, 0xd7, 0xcc, 0x3d, 0xdc, 0x30, 0x0b, 0x19, 0xf7, 0xd9, 0xe5, 0xaf, + 0x61, 0x16, 0x24, 0xf4, 0xf2, 0x49, 0x98, 0xf4, 0x83, 0x2b, 0x7d, 0x5a, 0x82, 0x42, 0xc9, 0xc2, + 0x9a, 0x83, 0x97, 0x2c, 0x73, 0x87, 0xd6, 0x48, 0xdc, 0x3b, 0xf4, 0x97, 0x85, 0x5d, 0x3c, 0xfc, + 0xa0, 0x47, 0xbd, 0x85, 0x45, 0x60, 0x49, 0x17, 0x21, 0x25, 0x6f, 0x11, 0x12, 0xbd, 0x41, 0xc8, + 0xe5, 0x43, 0xb4, 0x94, 0xf4, 0x9b, 0xda, 0xc7, 0x25, 0xc8, 0x95, 0x3a, 0xa6, 0x81, 0xc3, 0x47, + 0x98, 0x06, 0x9e, 0x95, 0xe9, 0xbf, 0x13, 0x81, 0x9e, 0x23, 0x89, 0xda, 0x1a, 0x81, 0x00, 0xdc, + 0xb2, 0x05, 0x65, 0x2b, 0x36, 0x48, 0xc5, 0x92, 0x4e, 0x5f, 0xa0, 0x5f, 0x95, 0x60, 0x8a, 0xc6, + 0xc5, 0x29, 0x76, 0x3a, 0xe8, 0x09, 0x81, 0x50, 0xfb, 0x04, 0xa8, 0x42, 0xbf, 0x2b, 0xec, 0xa2, + 0xef, 0xd7, 0xca, 0xa7, 0x9d, 0x20, 0x40, 0x50, 0x32, 0x8f, 0x71, 0xb1, 0xbd, 0xb4, 0x81, 0x0c, + 0xa5, 0x2f, 0xea, 0xcf, 0x48, 0xae, 0x01, 0x60, 0x5c, 0x5c, 0xb7, 0xf0, 0x9e, 0x8e, 0x2f, 0xa1, + 0xab, 0x03, 0x61, 0xef, 0x0f, 0xfa, 0xf1, 0x3a, 0xe1, 0x45, 0x9c, 0x10, 0xc9, 0xc8, 0xad, 0xac, + 0xe9, 0x4e, 0x90, 0x89, 0xf5, 0xe2, 0xbd, 0x91, 0x58, 0x42, 0x64, 0xd4, 0x70, 0x76, 0xc1, 0x35, + 0x9b, 0x68, 0x2e, 0xd2, 0x17, 0xec, 0xfb, 0x26, 0x60, 0x72, 0xc3, 0xb0, 0xbb, 0x1d, 0xcd, 0xde, + 0x46, 0xdf, 0x96, 0x21, 0x4f, 0x2f, 0x67, 0x43, 0x3f, 0xc0, 0xc5, 0x16, 0xf8, 0xb1, 0x5d, 0x6c, + 0x79, 0x2e, 0x38, 0xf4, 0xa5, 0xff, 0xdd, 0xf1, 0xe8, 0xdd, 0xb2, 0xe8, 0x24, 0xd5, 0x2b, 0x34, + 0x74, 0x4b, 0x7f, 0xff, 0xe3, 0xec, 0x5d, 0xbd, 0xe5, 0xec, 0x5a, 0xfe, 0x4d, 0xe4, 0x4f, 0x11, + 0xa3, 0xb2, 0x4e, 0xff, 0x52, 0xfd, 0xdf, 0x91, 0x06, 0x13, 0x2c, 0x71, 0xdf, 0x76, 0xd2, 0xfe, + 0xf3, 0xb7, 0x27, 0x21, 0xaf, 0x59, 0x8e, 0x6e, 0x3b, 0x6c, 0x83, 0x95, 0xbd, 0xb9, 0xdd, 0x25, + 0x7d, 0xda, 0xb0, 0x3a, 0x5e, 0x14, 0x12, 0x3f, 0x01, 0xfd, 0x9e, 0xd0, 0xfc, 0x31, 0xbe, 0xe6, + 0xc9, 0x20, 0x7f, 0x60, 0x88, 0x35, 0xea, 0x2b, 0xe1, 0x0a, 0xb5, 0xd8, 0x28, 0x37, 0x69, 0xd0, + 0x0a, 0x3f, 0x3e, 0x45, 0x1b, 0xbd, 0x4d, 0x0e, 0xad, 0xdf, 0x5d, 0xe6, 0xc6, 0x08, 0x26, 0xc5, + 0x60, 0x8c, 0xf0, 0x13, 0x62, 0x76, 0xab, 0xb9, 0x45, 0x58, 0x59, 0x7c, 0x11, 0xf6, 0xb7, 0x85, + 0x77, 0x93, 0x7c, 0x51, 0x0e, 0x58, 0x03, 0x8c, 0xbb, 0xbc, 0xe9, 0x3d, 0x42, 0x3b, 0x43, 0x83, + 0x4a, 0x3a, 0x44, 0xd8, 0x5e, 0x3b, 0x01, 0x13, 0xcb, 0x5a, 0xa7, 0x83, 0xad, 0xcb, 0xee, 0x90, + 0x54, 0xf0, 0x38, 0x5c, 0xd3, 0x0c, 0x7d, 0x13, 0xdb, 0x4e, 0x7c, 0x67, 0xf9, 0x0e, 0xe1, 0xc0, + 0xc0, 0xac, 0x8c, 0xf9, 0x5e, 0xfa, 0x11, 0x32, 0xbf, 0x05, 0xb2, 0xba, 0xb1, 0x69, 0xb2, 0x2e, + 0xb3, 0x77, 0xd5, 0xde, 0xfb, 0x99, 0x4c, 0x5d, 0x48, 0x46, 0xc1, 0xd8, 0xc0, 0x82, 0x5c, 0xa4, + 0xdf, 0x73, 0xfe, 0x4e, 0x16, 0x66, 0x3d, 0x26, 0x2a, 0x46, 0x1b, 0x3f, 0x1c, 0x5e, 0x8a, 0xf9, + 0x85, 0xac, 0xe8, 0x71, 0xb0, 0xde, 0xfa, 0x10, 0x52, 0x11, 0x22, 0x6d, 0x00, 0xb4, 0x34, 0x07, + 0x6f, 0x99, 0x96, 0xee, 0xf7, 0x87, 0x4f, 0x4b, 0x42, 0xad, 0x44, 0xff, 0xbe, 0xac, 0x86, 0xe8, + 0x28, 0x77, 0xc3, 0x34, 0xf6, 0xcf, 0xdf, 0x7b, 0x4b, 0x35, 0xb1, 0x78, 0x85, 0xf3, 0xa3, 0xcf, + 0x08, 0x9d, 0x3a, 0x13, 0xa9, 0x66, 0x32, 0xcc, 0x9a, 0xc3, 0xb5, 0xa1, 0x8d, 0xea, 0x5a, 0x51, + 0xad, 0xaf, 0x14, 0x57, 0x57, 0x2b, 0xd5, 0x65, 0x3f, 0xf0, 0x8b, 0x02, 0x73, 0x8b, 0xb5, 0xf3, + 0xd5, 0x50, 0x64, 0x9e, 0x2c, 0x5a, 0x87, 0x49, 0x4f, 0x5e, 0xfd, 0x7c, 0x31, 0xc3, 0x32, 0x63, + 0xbe, 0x98, 0xa1, 0x24, 0xd7, 0x38, 0xd3, 0x5b, 0xbe, 0x83, 0x0e, 0x79, 0x46, 0x7f, 0xac, 0x41, + 0x8e, 0xac, 0xa9, 0xa3, 0xb7, 0x90, 0x6d, 0xc0, 0x6e, 0x47, 0x6b, 0x61, 0xb4, 0x93, 0xc0, 0x1a, + 0xf7, 0x6e, 0xaa, 0x90, 0xf6, 0xdd, 0x54, 0x41, 0x1e, 0x99, 0xd5, 0x77, 0xbc, 0xdf, 0x3a, 0xbe, + 0x4a, 0xb3, 0xf0, 0x07, 0xb4, 0x62, 0x77, 0x57, 0xe8, 0xf2, 0x3f, 0x63, 0x33, 0x42, 0x25, 0xa3, + 0x79, 0x4a, 0x66, 0x89, 0x8a, 0xed, 0xc3, 0xc4, 0x71, 0x34, 0x86, 0xdb, 0xd4, 0xb3, 0x90, 0xab, + 0x77, 0x3b, 0xba, 0x83, 0x7e, 0x55, 0x1a, 0x09, 0x66, 0xf4, 0x76, 0x11, 0x79, 0xe0, 0xed, 0x22, + 0xc1, 0xae, 0x6b, 0x56, 0x60, 0xd7, 0xb5, 0x81, 0x1f, 0x76, 0xf8, 0x5d, 0xd7, 0x3b, 0x58, 0xf0, + 0x36, 0xba, 0x67, 0xfb, 0xc4, 0x3e, 0x22, 0x25, 0xd5, 0xea, 0x13, 0x15, 0xf0, 0xec, 0x6d, 0x2c, + 0x38, 0x19, 0x40, 0x7e, 0xa1, 0xd6, 0x68, 0xd4, 0xd6, 0x0a, 0x47, 0x48, 0x54, 0x9b, 0xda, 0x3a, + 0x0d, 0x15, 0x53, 0xa9, 0x56, 0xcb, 0x6a, 0x41, 0x22, 0xe1, 0xd2, 0x2a, 0x8d, 0xd5, 0x72, 0x41, + 0xe6, 0x43, 0xcd, 0xc7, 0x9a, 0xdf, 0x7c, 0xd9, 0x69, 0xaa, 0x97, 0x98, 0x21, 0x1e, 0xcd, 0x4f, + 0xfa, 0xca, 0xf5, 0x4b, 0x32, 0xe4, 0xd6, 0xb0, 0xb5, 0x85, 0xd1, 0x8f, 0x25, 0xd8, 0xe4, 0xdb, + 0xd4, 0x2d, 0x9b, 0x06, 0x97, 0x0b, 0x36, 0xf9, 0xc2, 0x69, 0xca, 0xf5, 0x30, 0x6b, 0xe3, 0x96, + 0x69, 0xb4, 0xbd, 0x4c, 0xb4, 0x3f, 0xe2, 0x13, 0xf9, 0x6b, 0xfe, 0x05, 0x20, 0x23, 0x8c, 0x8e, + 0x64, 0xa7, 0x2e, 0x09, 0x30, 0xfd, 0x4a, 0x4d, 0x1f, 0x98, 0x6f, 0xc8, 0xee, 0x4f, 0xdd, 0xcb, + 0xe8, 0xa5, 0xc2, 0xbb, 0xaf, 0x37, 0x43, 0xfe, 0x82, 0x17, 0xa5, 0x58, 0x8e, 0xec, 0x8f, 0x59, + 0x1e, 0x65, 0x01, 0x8e, 0xd9, 0xb8, 0x83, 0x5b, 0x0e, 0x6e, 0xbb, 0x4d, 0x57, 0x1d, 0xd8, 0x29, + 0xec, 0xcf, 0x8e, 0xfe, 0x2c, 0x0c, 0xe0, 0x5d, 0x3c, 0x80, 0x37, 0xf4, 0x11, 0xa5, 0x5b, 0xa1, + 0x68, 0x5b, 0xd9, 0xad, 0x46, 0xbd, 0x63, 0xfa, 0x8b, 0xe2, 0xde, 0xbb, 0xfb, 0x6d, 0xdb, 0xd9, + 0xe9, 0x90, 0x6f, 0xec, 0x80, 0x81, 0xf7, 0xae, 0xcc, 0xc3, 0x84, 0x66, 0x5c, 0x26, 0x9f, 0xb2, + 0x31, 0xb5, 0xf6, 0x32, 0xa1, 0x97, 0xfb, 0xc8, 0xdf, 0xcb, 0x21, 0xff, 0x64, 0x31, 0x76, 0xd3, + 0x07, 0xfe, 0x27, 0x27, 0x20, 0xb7, 0xae, 0xd9, 0x0e, 0x46, 0xff, 0x97, 0x2c, 0x8a, 0xfc, 0x0d, + 0x30, 0xb7, 0x69, 0xb6, 0x76, 0x6d, 0xdc, 0xe6, 0x1b, 0x65, 0x4f, 0xea, 0x28, 0x30, 0x57, 0x6e, + 0x82, 0x82, 0x97, 0xc8, 0xc8, 0x7a, 0xdb, 0xf0, 0xfb, 0xd2, 0x49, 0xe0, 0x72, 0x7b, 0x5d, 0xb3, + 0x9c, 0xda, 0x26, 0x49, 0xf3, 0x03, 0x97, 0x87, 0x13, 0x39, 0xe8, 0xf3, 0x31, 0xd0, 0x4f, 0x44, + 0x43, 0x3f, 0x29, 0x00, 0xbd, 0x52, 0x84, 0xc9, 0x4d, 0xbd, 0x83, 0xc9, 0x0f, 0x53, 0xe4, 0x87, + 0x7e, 0x63, 0x12, 0x91, 0xbd, 0x3f, 0x26, 0x2d, 0xe9, 0x1d, 0xac, 0xfa, 0xbf, 0x79, 0x13, 0x19, + 0x08, 0x26, 0x32, 0xab, 0xd4, 0x9f, 0xd6, 0x35, 0xbc, 0x0c, 0x6d, 0x07, 0x7b, 0x8b, 0x6f, 0x06, + 0x3b, 0xdc, 0xd2, 0xd6, 0x1c, 0x8d, 0x80, 0x31, 0xa3, 0x92, 0x67, 0xde, 0x2f, 0x44, 0xee, 0xf5, + 0x0b, 0x79, 0x9e, 0x9c, 0xac, 0x47, 0xf4, 0x98, 0x8d, 0x68, 0x51, 0x17, 0x3c, 0x80, 0xa8, 0xa5, + 0xe8, 0xbf, 0xbb, 0xc0, 0xb4, 0x34, 0x0b, 0x3b, 0xeb, 0x61, 0x4f, 0x8c, 0x9c, 0xca, 0x27, 0x12, + 0x57, 0x3e, 0xbb, 0xae, 0xed, 0xd0, 0x40, 0xe7, 0x25, 0xf7, 0x1b, 0x73, 0xd1, 0xda, 0x97, 0x1e, + 0xf4, 0xbf, 0xb9, 0x51, 0xf7, 0xbf, 0xfd, 0xea, 0x98, 0x7e, 0x33, 0x7c, 0x65, 0x16, 0xe4, 0xd2, + 0xae, 0xf3, 0xb8, 0xee, 0x7e, 0xbf, 0x23, 0xec, 0xe7, 0xc2, 0xfa, 0xb3, 0xc8, 0x7b, 0xfd, 0xc7, + 0xd4, 0xfb, 0x26, 0xd4, 0x12, 0x31, 0x7f, 0x9a, 0xa8, 0xba, 0xa5, 0xaf, 0x23, 0x6f, 0x94, 0x7d, + 0x07, 0xcb, 0x47, 0x32, 0x07, 0x37, 0xcd, 0x11, 0xed, 0x9f, 0x42, 0x3d, 0x83, 0xff, 0xee, 0x75, + 0x3c, 0x59, 0x2e, 0x56, 0x1f, 0xd9, 0x5e, 0x27, 0xa2, 0x9c, 0x51, 0xe9, 0x0b, 0xfa, 0x35, 0x61, + 0xb7, 0x73, 0x2a, 0xb6, 0x58, 0x57, 0xc2, 0x64, 0x36, 0x95, 0xd8, 0xdd, 0xad, 0x31, 0xc5, 0xa6, + 0x0f, 0xd8, 0xd7, 0xc3, 0xae, 0x82, 0xc5, 0x03, 0x23, 0x86, 0x5e, 0x21, 0xbc, 0x1d, 0x45, 0xab, + 0x3d, 0x60, 0xbd, 0x30, 0x99, 0xbc, 0xc5, 0x36, 0xab, 0x62, 0x0b, 0x4e, 0x5f, 0xe2, 0x5f, 0x93, + 0x21, 0x4f, 0xb7, 0x20, 0xd1, 0xeb, 0x33, 0x09, 0x2e, 0xbd, 0x77, 0x78, 0x17, 0x42, 0xff, 0x3d, + 0xc9, 0x9a, 0x03, 0xe7, 0x6a, 0x98, 0x4d, 0xe4, 0x6a, 0xc8, 0x9f, 0xe3, 0x14, 0x68, 0x47, 0xb4, + 0x8e, 0x29, 0x4f, 0x27, 0x93, 0xb4, 0xb0, 0xbe, 0x0c, 0xa5, 0x8f, 0xf7, 0x4f, 0xe7, 0x60, 0x86, + 0x16, 0x7d, 0x5e, 0x6f, 0x6f, 0x61, 0x07, 0xbd, 0x4d, 0xfa, 0xee, 0x41, 0x5d, 0xa9, 0xc2, 0xcc, + 0x25, 0xc2, 0x36, 0xbd, 0x91, 0x85, 0xad, 0x5c, 0xdc, 0x14, 0xbb, 0xee, 0x41, 0xeb, 0xe9, 0xdd, + 0xe1, 0xc2, 0xfd, 0xef, 0xca, 0x98, 0x2e, 0xf8, 0x53, 0x07, 0xae, 0x3c, 0x31, 0xb2, 0xc2, 0x49, + 0xca, 0x49, 0xc8, 0xef, 0xe9, 0xf8, 0x52, 0xa5, 0xcd, 0xac, 0x5b, 0xf6, 0x86, 0xfe, 0x40, 0x78, + 0xdf, 0x36, 0x0c, 0x37, 0xe3, 0x25, 0x5d, 0x2d, 0x14, 0xdb, 0xbd, 0x1d, 0xc8, 0xd6, 0x18, 0xce, + 0x14, 0xf3, 0x77, 0xa3, 0x96, 0x12, 0x28, 0x62, 0x94, 0xe1, 0xcc, 0x87, 0xf2, 0x88, 0x3d, 0xb1, + 0x42, 0x05, 0x30, 0xe2, 0x6b, 0x53, 0xc5, 0xe2, 0x4b, 0x0c, 0x28, 0x3a, 0x7d, 0xc9, 0xbf, 0x5a, + 0x86, 0xa9, 0x3a, 0x76, 0x96, 0x74, 0xdc, 0x69, 0xdb, 0xc8, 0x3a, 0xb8, 0x69, 0x74, 0x0b, 0xe4, + 0x37, 0x09, 0xb1, 0x41, 0xe7, 0x16, 0x58, 0x36, 0xf4, 0x4a, 0x49, 0x74, 0x47, 0x98, 0xad, 0xbe, + 0x79, 0xdc, 0x8e, 0x04, 0x26, 0x31, 0x8f, 0xde, 0xf8, 0x92, 0xc7, 0x10, 0xd8, 0x56, 0x86, 0x19, + 0x76, 0x99, 0x62, 0xb1, 0xa3, 0x6f, 0x19, 0x68, 0x77, 0x04, 0x2d, 0x44, 0xb9, 0x15, 0x72, 0x9a, + 0x4b, 0x8d, 0x6d, 0xbd, 0xa2, 0xbe, 0x9d, 0x27, 0x29, 0x4f, 0xa5, 0x19, 0x13, 0x84, 0x91, 0x0c, + 0x14, 0xdb, 0xe3, 0x79, 0x8c, 0x61, 0x24, 0x07, 0x16, 0x9e, 0x3e, 0x62, 0x5f, 0x90, 0xe1, 0x38, + 0x63, 0xe0, 0x1c, 0xb6, 0x1c, 0xbd, 0xa5, 0x75, 0x28, 0x72, 0x2f, 0xcc, 0x8c, 0x02, 0xba, 0x15, + 0x98, 0xdd, 0x0b, 0x93, 0x65, 0x10, 0x9e, 0xed, 0x0b, 0x21, 0xc7, 0x80, 0xca, 0xff, 0x98, 0x20, + 0x1c, 0x1f, 0x27, 0x55, 0x8e, 0xe6, 0x18, 0xc3, 0xf1, 0x09, 0x33, 0x91, 0x3e, 0xc4, 0x2f, 0x61, + 0xa1, 0x79, 0x82, 0xee, 0xf3, 0xb3, 0xc2, 0xd8, 0x6e, 0xc0, 0x34, 0xc1, 0x92, 0xfe, 0xc8, 0x96, + 0x21, 0x62, 0x94, 0xd8, 0xef, 0x77, 0xd8, 0x85, 0x61, 0xfe, 0xbf, 0x6a, 0x98, 0x0e, 0x3a, 0x0f, + 0x10, 0x7c, 0x0a, 0x77, 0xd2, 0x99, 0xa8, 0x4e, 0x5a, 0x12, 0xeb, 0xa4, 0x5f, 0x27, 0x1c, 0x2c, + 0xa5, 0x3f, 0xdb, 0x07, 0x57, 0x0f, 0xb1, 0x30, 0x19, 0x83, 0x4b, 0x4f, 0x5f, 0x2f, 0x5e, 0x9e, + 0xed, 0xbd, 0x35, 0xff, 0x83, 0x23, 0x99, 0x4f, 0x85, 0xfb, 0x03, 0xb9, 0xa7, 0x3f, 0x38, 0x80, + 0x25, 0x7d, 0x23, 0x1c, 0xa5, 0x45, 0x94, 0x7c, 0xb6, 0x72, 0x34, 0x14, 0x44, 0x4f, 0x32, 0xfa, + 0xd0, 0x10, 0x4a, 0x30, 0xe8, 0x4a, 0xff, 0xb8, 0x4e, 0x2e, 0x99, 0xb1, 0x9b, 0x54, 0x41, 0xa2, + 0x38, 0x1b, 0x83, 0x5b, 0x68, 0x96, 0x5a, 0xbb, 0x1b, 0xe4, 0x4e, 0x37, 0xf4, 0x17, 0xd9, 0x51, + 0x8c, 0x08, 0xf7, 0x41, 0x96, 0xb8, 0xb8, 0xcb, 0x91, 0x4b, 0x1a, 0x41, 0x91, 0xc1, 0x85, 0x7b, + 0xf8, 0x61, 0x67, 0xe5, 0x88, 0x4a, 0xfe, 0x54, 0x6e, 0x82, 0xa3, 0x17, 0xb4, 0xd6, 0xc5, 0x2d, + 0xcb, 0xdc, 0x25, 0xb7, 0x5f, 0x99, 0xec, 0x1a, 0x2d, 0x72, 0x1d, 0x21, 0xff, 0x41, 0xb9, 0xdd, + 0x33, 0x1d, 0x72, 0x83, 0x4c, 0x87, 0x95, 0x23, 0xcc, 0x78, 0x50, 0x6e, 0xf3, 0x3b, 0x9d, 0x7c, + 0x6c, 0xa7, 0xb3, 0x72, 0xc4, 0xeb, 0x76, 0x94, 0x45, 0x98, 0x6c, 0xeb, 0x7b, 0x64, 0xab, 0x9a, + 0xcc, 0xba, 0x06, 0x1d, 0x5d, 0x5e, 0xd4, 0xf7, 0xe8, 0xc6, 0xf6, 0xca, 0x11, 0xd5, 0xff, 0x53, + 0x59, 0x86, 0x29, 0xb2, 0x2d, 0x40, 0xc8, 0x4c, 0x26, 0x3a, 0x96, 0xbc, 0x72, 0x44, 0x0d, 0xfe, + 0x75, 0xad, 0x8f, 0x2c, 0x39, 0xfb, 0x71, 0xaf, 0xb7, 0xdd, 0x9e, 0x49, 0xb4, 0xdd, 0xee, 0xca, + 0x82, 0x6e, 0xb8, 0x9f, 0x84, 0x5c, 0x8b, 0x48, 0x58, 0x62, 0x12, 0xa6, 0xaf, 0xca, 0x5d, 0x90, + 0xdd, 0xd1, 0x2c, 0x6f, 0xf2, 0x7c, 0xc3, 0x60, 0xba, 0x6b, 0x9a, 0x75, 0xd1, 0x45, 0xd0, 0xfd, + 0x6b, 0x61, 0x02, 0x72, 0x44, 0x70, 0xfe, 0x03, 0x7a, 0x63, 0x96, 0x9a, 0x21, 0x25, 0xd3, 0x70, + 0x87, 0xfd, 0x86, 0xe9, 0x1d, 0x90, 0xf9, 0x83, 0xcc, 0x68, 0x2c, 0xc8, 0xbe, 0xd7, 0xcc, 0xcb, + 0x91, 0xd7, 0xcc, 0xf7, 0xdc, 0x77, 0x9c, 0xed, 0xbd, 0xef, 0x38, 0x58, 0x3e, 0xc8, 0x0d, 0x76, + 0x54, 0xf9, 0xb3, 0x21, 0x4c, 0x97, 0x5e, 0x41, 0x44, 0xcf, 0xc0, 0x3b, 0xba, 0x11, 0xaa, 0xb3, + 0xf7, 0x9a, 0xb0, 0x53, 0x4a, 0x6a, 0xd4, 0x0c, 0x60, 0x2f, 0xfd, 0xbe, 0xe9, 0xb7, 0xb2, 0x70, + 0x8a, 0xde, 0xaa, 0xbd, 0x87, 0x1b, 0x26, 0x7f, 0xdf, 0x24, 0xfa, 0xd8, 0x48, 0x94, 0xa6, 0xcf, + 0x80, 0x23, 0xf7, 0x1d, 0x70, 0xf6, 0x1d, 0x52, 0xce, 0x0e, 0x38, 0xa4, 0x9c, 0x4b, 0xb6, 0x72, + 0xf8, 0xde, 0xb0, 0xfe, 0xac, 0xf3, 0xfa, 0x73, 0x67, 0x04, 0x40, 0xfd, 0xe4, 0x32, 0x12, 0xfb, + 0xe6, 0x2d, 0xbe, 0xa6, 0xd4, 0x39, 0x4d, 0xb9, 0x77, 0x78, 0x46, 0xd2, 0xd7, 0x96, 0xdf, 0xcf, + 0xc2, 0x15, 0x01, 0x33, 0x55, 0x7c, 0x89, 0x29, 0xca, 0xa7, 0x47, 0xa2, 0x28, 0xc9, 0x63, 0x20, + 0xa4, 0xad, 0x31, 0x7f, 0x22, 0x7c, 0x76, 0xa8, 0x17, 0x28, 0x5f, 0x36, 0x11, 0xca, 0x72, 0x12, + 0xf2, 0xb4, 0x87, 0x61, 0xd0, 0xb0, 0xb7, 0x84, 0xdd, 0x8d, 0xd8, 0x89, 0x23, 0x51, 0xde, 0xc6, + 0xa0, 0x3f, 0x6c, 0x5d, 0xa3, 0xb1, 0x6b, 0x19, 0x15, 0xc3, 0x31, 0xd1, 0x4f, 0x8c, 0x44, 0x71, + 0x7c, 0x6f, 0x38, 0x79, 0x18, 0x6f, 0xb8, 0xa1, 0x56, 0x39, 0xbc, 0x1a, 0x1c, 0xca, 0x2a, 0x47, + 0x44, 0xe1, 0xe9, 0xe3, 0xf7, 0x66, 0x19, 0x4e, 0xb2, 0xc9, 0xd6, 0x02, 0x6f, 0x21, 0xa2, 0x07, + 0x47, 0x01, 0xe4, 0x71, 0xcf, 0x4c, 0x62, 0xb7, 0x9c, 0x91, 0x17, 0xfe, 0xa4, 0x54, 0xec, 0xfd, + 0x0e, 0xdc, 0x74, 0xb0, 0x87, 0xc3, 0x91, 0x20, 0x25, 0x76, 0xad, 0x43, 0x02, 0x36, 0xd2, 0xc7, + 0xec, 0xc5, 0x32, 0xe4, 0xe9, 0x39, 0x2d, 0xb4, 0x91, 0x8a, 0xc3, 0x04, 0x1f, 0xe5, 0x59, 0x60, + 0x47, 0x2e, 0xf1, 0x25, 0xf7, 0xe9, 0xed, 0xc5, 0x1d, 0xd2, 0x2d, 0xf6, 0xdf, 0x90, 0x60, 0xba, + 0x8e, 0x9d, 0x92, 0x66, 0x59, 0xba, 0xb6, 0x35, 0x2a, 0x8f, 0x6f, 0x51, 0xef, 0x61, 0xf4, 0xcd, + 0x8c, 0xe8, 0x79, 0x1a, 0x7f, 0x21, 0xdc, 0x63, 0x35, 0x22, 0x96, 0xe0, 0xa3, 0x42, 0x67, 0x66, + 0x06, 0x51, 0x1b, 0x83, 0xc7, 0xb6, 0x04, 0x13, 0xde, 0x59, 0xbc, 0x5b, 0xb8, 0xf3, 0x99, 0xdb, + 0xce, 0x8e, 0x77, 0x0c, 0x86, 0x3c, 0xef, 0x3f, 0x03, 0x86, 0x5e, 0x96, 0xd0, 0x51, 0x3e, 0xfe, + 0x20, 0x61, 0xb2, 0x36, 0x96, 0xc4, 0x1d, 0xfe, 0xb0, 0x8e, 0x0e, 0xfe, 0xee, 0x04, 0x5b, 0x8e, + 0x5c, 0xd5, 0x1c, 0xfc, 0x30, 0xfa, 0xac, 0x0c, 0x13, 0x75, 0xec, 0xb8, 0xe3, 0x2d, 0x77, 0xb9, + 0xe9, 0xb0, 0x1a, 0xae, 0x84, 0x56, 0x3c, 0xa6, 0xd8, 0x1a, 0xc6, 0xfd, 0x30, 0xd5, 0xb5, 0xcc, + 0x16, 0xb6, 0x6d, 0xb6, 0x7a, 0x11, 0x76, 0x54, 0xeb, 0x37, 0xfa, 0x13, 0xd6, 0xe6, 0xd7, 0xbd, + 0x7f, 0xd4, 0xe0, 0xf7, 0xa4, 0x66, 0x00, 0xa5, 0xc4, 0x2a, 0x38, 0x6e, 0x33, 0x20, 0xae, 0xf0, + 0xf4, 0x81, 0xfe, 0xa4, 0x0c, 0x33, 0x75, 0xec, 0xf8, 0x52, 0x4c, 0xb0, 0xc9, 0x11, 0x0d, 0x2f, + 0x07, 0xa5, 0x7c, 0x30, 0x28, 0xc5, 0xaf, 0x06, 0xe4, 0xa5, 0xe9, 0x13, 0x1b, 0xe3, 0xd5, 0x80, + 0x62, 0x1c, 0x8c, 0xe1, 0xf8, 0xda, 0x13, 0x61, 0x8a, 0xf0, 0x42, 0x1a, 0xec, 0xcf, 0x66, 0x83, + 0xc6, 0xfb, 0xb9, 0x94, 0x1a, 0xef, 0xdd, 0x90, 0xdb, 0xd1, 0xac, 0x8b, 0x36, 0x69, 0xb8, 0xd3, + 0x22, 0x66, 0xfb, 0x9a, 0x9b, 0x5d, 0xa5, 0x7f, 0xf5, 0xf7, 0xd3, 0xcc, 0x25, 0xf3, 0xd3, 0x7c, + 0x54, 0x4a, 0x34, 0x12, 0xd2, 0xb9, 0xc3, 0x08, 0x9b, 0x7c, 0x82, 0x71, 0x33, 0xa6, 0xec, 0xf4, + 0x95, 0xe3, 0x85, 0x32, 0x4c, 0xba, 0xe3, 0x36, 0xb1, 0xc7, 0xcf, 0x1f, 0x5c, 0x1d, 0xfa, 0x1b, + 0xfa, 0x09, 0x7b, 0x60, 0x4f, 0x22, 0xa3, 0x33, 0xef, 0x13, 0xf4, 0xc0, 0x71, 0x85, 0xa7, 0x8f, + 0xc7, 0x5b, 0x29, 0x1e, 0xa4, 0x3d, 0xa0, 0xdf, 0x94, 0x41, 0x5e, 0xc6, 0xce, 0xb8, 0xad, 0xc8, + 0x37, 0x09, 0x87, 0x38, 0xe2, 0x04, 0x46, 0x78, 0x9e, 0x5f, 0xc6, 0xa3, 0x69, 0x40, 0x62, 0xb1, + 0x8d, 0x84, 0x18, 0x48, 0x1f, 0xb5, 0x77, 0x52, 0xd4, 0xe8, 0xe6, 0xc2, 0x8f, 0x8f, 0xa0, 0x57, + 0x1d, 0xef, 0xc2, 0x87, 0x27, 0x40, 0x42, 0xe3, 0xb0, 0xda, 0x5b, 0xbf, 0xc2, 0xc7, 0x72, 0x15, + 0x1f, 0xb8, 0x8d, 0x7d, 0x1b, 0xb7, 0x2e, 0xe2, 0x36, 0xfa, 0x91, 0x83, 0x43, 0x77, 0x0a, 0x26, + 0x5a, 0x94, 0x1a, 0x01, 0x6f, 0x52, 0xf5, 0x5e, 0x13, 0xdc, 0x2b, 0xcd, 0x77, 0x44, 0xf4, 0xf7, + 0x31, 0xde, 0x2b, 0x2d, 0x50, 0xfc, 0x18, 0xcc, 0x16, 0x3a, 0xcb, 0xa8, 0xb4, 0x4c, 0x03, 0xfd, + 0x97, 0x83, 0xc3, 0x72, 0x0d, 0x4c, 0xe9, 0x2d, 0xd3, 0x20, 0x61, 0x28, 0xbc, 0x43, 0x40, 0x7e, + 0x82, 0xf7, 0xb5, 0xbc, 0x63, 0x3e, 0xa4, 0xb3, 0x5d, 0xf3, 0x20, 0x61, 0x58, 0x63, 0xc2, 0x65, + 0xfd, 0xb0, 0x8c, 0x89, 0x3e, 0x65, 0xa7, 0x0f, 0xd9, 0x87, 0x02, 0xef, 0x36, 0xda, 0x15, 0x3e, + 0x2e, 0x56, 0x81, 0x87, 0x19, 0xce, 0xc2, 0xb5, 0x38, 0x94, 0xe1, 0x2c, 0x86, 0x81, 0x31, 0xdc, + 0x58, 0x11, 0xe0, 0x98, 0xfa, 0x1a, 0xf0, 0x01, 0xd0, 0x19, 0x9d, 0x79, 0x38, 0x24, 0x3a, 0x87, + 0x63, 0x22, 0xbe, 0x87, 0x85, 0xc8, 0x64, 0x16, 0x0f, 0xfa, 0xaf, 0xa3, 0x00, 0xe7, 0xce, 0x61, + 0xfc, 0x15, 0xa8, 0xb7, 0x42, 0x82, 0x1b, 0xb1, 0xf7, 0x49, 0xd0, 0xa5, 0x32, 0xc6, 0xbb, 0xe2, + 0x45, 0xca, 0x4f, 0x1f, 0xc0, 0x17, 0xc8, 0x30, 0x47, 0x7c, 0x04, 0x3a, 0x58, 0xb3, 0x68, 0x47, + 0x39, 0x12, 0x47, 0xf9, 0xb7, 0x0a, 0x07, 0xf8, 0xe1, 0xe5, 0x10, 0xf0, 0x31, 0x12, 0x28, 0xc4, + 0xa2, 0xfb, 0x08, 0xb2, 0x30, 0x96, 0x6d, 0x94, 0x82, 0xcf, 0x02, 0x53, 0xf1, 0xd1, 0xe0, 0x91, + 0xd0, 0x23, 0x97, 0x17, 0x86, 0xd7, 0xd8, 0xc6, 0xec, 0x91, 0x2b, 0xc2, 0x44, 0xfa, 0x98, 0xfc, + 0xe6, 0xad, 0x6c, 0xc1, 0xb9, 0x41, 0x2e, 0x8c, 0x7f, 0x45, 0xd6, 0x3f, 0xd1, 0xf6, 0xc9, 0x91, + 0x78, 0x60, 0x1e, 0x20, 0x20, 0xbe, 0x02, 0x59, 0xcb, 0xbc, 0x44, 0x97, 0xb6, 0x66, 0x55, 0xf2, + 0x4c, 0xaf, 0xa7, 0xec, 0xec, 0xee, 0x18, 0xf4, 0x64, 0xe8, 0xac, 0xea, 0xbd, 0x2a, 0xd7, 0xc3, + 0xec, 0x25, 0xdd, 0xd9, 0x5e, 0xc1, 0x5a, 0x1b, 0x5b, 0xaa, 0x79, 0x89, 0x78, 0xcc, 0x4d, 0xaa, + 0x7c, 0x22, 0xef, 0xbf, 0x22, 0x60, 0x5f, 0x92, 0x5b, 0xe4, 0xc7, 0x72, 0xfc, 0x2d, 0x89, 0xe5, + 0x19, 0xcd, 0x55, 0xfa, 0x0a, 0xf3, 0x2e, 0x19, 0xa6, 0x54, 0xf3, 0x12, 0x53, 0x92, 0xff, 0xe3, + 0x70, 0x75, 0x24, 0xf1, 0x44, 0x8f, 0x48, 0xce, 0x67, 0x7f, 0xec, 0x13, 0xbd, 0xd8, 0xe2, 0xc7, + 0x72, 0x72, 0x69, 0x46, 0x35, 0x2f, 0xd5, 0xb1, 0x43, 0x5b, 0x04, 0x6a, 0x8e, 0xc8, 0xc9, 0x5a, + 0xb7, 0x29, 0x41, 0x36, 0x0f, 0xf7, 0xdf, 0x93, 0xee, 0x22, 0xf8, 0x02, 0xf2, 0x59, 0x1c, 0xf7, + 0x2e, 0xc2, 0x40, 0x0e, 0xc6, 0x10, 0x23, 0x45, 0x86, 0x69, 0xd5, 0xbc, 0xe4, 0x0e, 0x0d, 0x4b, + 0x7a, 0xa7, 0x33, 0x9a, 0x11, 0x32, 0xa9, 0xf1, 0xef, 0x89, 0xc1, 0xe3, 0x62, 0xec, 0xc6, 0xff, + 0x00, 0x06, 0xd2, 0x87, 0xe1, 0x79, 0xb4, 0xb1, 0x78, 0x23, 0xb4, 0x31, 0x1a, 0x1c, 0x86, 0x6d, + 0x10, 0x3e, 0x1b, 0x87, 0xd6, 0x20, 0xa2, 0x38, 0x18, 0xcb, 0xce, 0xc9, 0x5c, 0x89, 0x0c, 0xf3, + 0xa3, 0x6d, 0x13, 0x6f, 0x4f, 0xe6, 0x9a, 0xc8, 0x86, 0x5d, 0x8e, 0x91, 0x91, 0xa0, 0x91, 0xc0, + 0x05, 0x51, 0x80, 0x87, 0xf4, 0xf1, 0x78, 0xbf, 0x0c, 0x33, 0x94, 0x85, 0xc7, 0x89, 0x15, 0x30, + 0x54, 0xa3, 0x0a, 0xd7, 0xe0, 0x70, 0x1a, 0x55, 0x0c, 0x07, 0x63, 0xb9, 0x15, 0xd4, 0xb5, 0xe3, + 0x86, 0x38, 0x3e, 0x1e, 0x85, 0xe0, 0xd0, 0xc6, 0xd8, 0x08, 0x8f, 0x90, 0x0f, 0x63, 0x8c, 0x1d, + 0xd2, 0x31, 0xf2, 0xe7, 0xf9, 0xad, 0x68, 0x94, 0x18, 0x1c, 0xa0, 0x29, 0x8c, 0x10, 0x86, 0x21, + 0x9b, 0xc2, 0x21, 0x21, 0xf1, 0x45, 0x19, 0x80, 0x32, 0xb0, 0x66, 0xee, 0x91, 0xcb, 0x7c, 0x46, + 0xd0, 0x9d, 0xf5, 0xba, 0xd5, 0xcb, 0x03, 0xdc, 0xea, 0x13, 0x86, 0x70, 0x49, 0xba, 0x12, 0x18, + 0x92, 0xb2, 0x5b, 0xc9, 0xb1, 0xaf, 0x04, 0xc6, 0x97, 0x9f, 0x3e, 0xc6, 0x8f, 0x51, 0x6b, 0x2e, + 0x38, 0x60, 0xfa, 0x2b, 0x23, 0x41, 0x39, 0x34, 0xfb, 0x97, 0xf9, 0xd9, 0xff, 0x01, 0xb0, 0x1d, + 0xd6, 0x46, 0x1c, 0x74, 0x70, 0x34, 0x7d, 0x1b, 0xf1, 0xf0, 0x0e, 0x88, 0xfe, 0x78, 0x16, 0x8e, + 0xb2, 0x4e, 0xe4, 0xbb, 0x01, 0xe2, 0x84, 0xe7, 0xf0, 0xb8, 0x4e, 0x72, 0x00, 0xca, 0xa3, 0x5a, + 0x90, 0x4a, 0xb2, 0x94, 0x29, 0xc0, 0xde, 0x58, 0x56, 0x37, 0xf2, 0xe5, 0x87, 0xbb, 0x9a, 0xd1, + 0x16, 0x0f, 0xf7, 0x3b, 0x00, 0x78, 0x6f, 0xad, 0x51, 0xe6, 0xd7, 0x1a, 0xfb, 0xac, 0x4c, 0x26, + 0xde, 0xb9, 0x26, 0x22, 0xa3, 0xec, 0x8e, 0x7d, 0xe7, 0x3a, 0xba, 0xec, 0xf4, 0x51, 0x7a, 0xbb, + 0x0c, 0xd9, 0xba, 0x69, 0x39, 0xe8, 0xf9, 0x49, 0x5a, 0x27, 0x95, 0x7c, 0x00, 0x92, 0xf7, 0xae, + 0x94, 0xb8, 0x5b, 0x9a, 0x6f, 0x89, 0x3f, 0xea, 0xac, 0x39, 0x1a, 0xf1, 0xea, 0x76, 0xcb, 0x0f, + 0x5d, 0xd7, 0x9c, 0x34, 0x9e, 0x0e, 0x95, 0x5f, 0x3d, 0xfa, 0x00, 0x46, 0x6a, 0xf1, 0x74, 0x22, + 0x4b, 0x4e, 0x1f, 0xb7, 0x57, 0x1d, 0x65, 0xbe, 0xad, 0x4b, 0x7a, 0x07, 0xa3, 0xe7, 0x53, 0x97, + 0x91, 0xaa, 0xb6, 0x83, 0xc5, 0x8f, 0xc4, 0xc4, 0xba, 0xb6, 0x92, 0xf8, 0xb2, 0x72, 0x10, 0x5f, + 0x36, 0x69, 0x83, 0xa2, 0x07, 0xd0, 0x29, 0x4b, 0xe3, 0x6e, 0x50, 0x31, 0x65, 0x8f, 0x25, 0x4e, + 0xe7, 0xb1, 0x3a, 0x76, 0xa8, 0x51, 0x59, 0xf3, 0x6e, 0x60, 0xf9, 0xd1, 0x91, 0x44, 0xec, 0xf4, + 0x2f, 0x78, 0x91, 0x7b, 0x2e, 0x78, 0x79, 0x57, 0x18, 0x9c, 0x35, 0x1e, 0x9c, 0x1f, 0x8c, 0x16, + 0x10, 0xcf, 0xe4, 0x48, 0x60, 0x7a, 0x93, 0x0f, 0xd3, 0x3a, 0x07, 0xd3, 0x5d, 0x43, 0x72, 0x91, + 0x3e, 0x60, 0x3f, 0x97, 0x83, 0xa3, 0x74, 0xd2, 0x5f, 0x34, 0xda, 0x2c, 0xc2, 0xea, 0xeb, 0xa5, + 0x43, 0xde, 0x6c, 0xdb, 0x1f, 0x82, 0x95, 0x8b, 0xe5, 0x9c, 0xeb, 0xbd, 0x1d, 0x7f, 0x81, 0x86, + 0x73, 0x75, 0x3b, 0x51, 0xb2, 0xd3, 0x26, 0x7e, 0x43, 0xbe, 0xff, 0x1f, 0x7f, 0x97, 0xd1, 0x84, + 0xf8, 0x5d, 0x46, 0x7f, 0x9a, 0x6c, 0xdd, 0x8e, 0x14, 0xdd, 0x23, 0xf0, 0x94, 0x6d, 0xa7, 0x04, + 0x2b, 0x7a, 0x02, 0xdc, 0x7d, 0x6f, 0xb8, 0x93, 0x05, 0x11, 0x44, 0x86, 0x74, 0x27, 0x23, 0x04, + 0x0e, 0xd3, 0x9d, 0x6c, 0x10, 0x03, 0x63, 0xb8, 0xd5, 0x3e, 0xc7, 0x76, 0xf3, 0x49, 0xbb, 0x41, + 0x7f, 0x25, 0xa5, 0x3e, 0x4a, 0x7f, 0x2b, 0x93, 0xc8, 0xff, 0x99, 0xf0, 0x15, 0x3f, 0x4c, 0x27, + 0xf1, 0x68, 0x8e, 0x23, 0x37, 0x86, 0x75, 0x23, 0x89, 0xf8, 0xa2, 0x9f, 0xd7, 0xdb, 0xce, 0xf6, + 0x88, 0x4e, 0x74, 0x5c, 0x72, 0x69, 0x79, 0xd7, 0x23, 0x93, 0x17, 0xf4, 0x6f, 0x99, 0x44, 0x21, + 0xa4, 0x7c, 0x91, 0x10, 0xb6, 0x22, 0x44, 0x9c, 0x20, 0xf0, 0x53, 0x2c, 0xbd, 0x31, 0x6a, 0xf4, + 0x39, 0xbd, 0x8d, 0xcd, 0xc7, 0xa1, 0x46, 0x13, 0xbe, 0x46, 0xa7, 0xd1, 0x71, 0xe4, 0xbe, 0x47, + 0x35, 0xda, 0x17, 0xc9, 0x88, 0x34, 0x3a, 0x96, 0x5e, 0xfa, 0x32, 0x7e, 0xd9, 0x0c, 0x9b, 0x48, + 0xad, 0xea, 0xc6, 0x45, 0xf4, 0xcf, 0x79, 0xef, 0x62, 0xe6, 0xf3, 0xba, 0xb3, 0xcd, 0x62, 0xc1, + 0xfc, 0xbe, 0xf0, 0xdd, 0x28, 0x43, 0xc4, 0x7b, 0xe1, 0xc3, 0x49, 0xe5, 0xf6, 0x85, 0x93, 0x2a, + 0xc2, 0xac, 0x6e, 0x38, 0xd8, 0x32, 0xb4, 0xce, 0x52, 0x47, 0xdb, 0xb2, 0x4f, 0x4d, 0xf4, 0xbd, + 0xbc, 0xae, 0x12, 0xca, 0xa3, 0xf2, 0x7f, 0x84, 0xaf, 0xaf, 0x9c, 0xe4, 0xaf, 0xaf, 0x8c, 0x88, + 0x7e, 0x35, 0x15, 0x1d, 0xfd, 0xca, 0x8f, 0x6e, 0x05, 0x83, 0x83, 0x63, 0x8b, 0xda, 0xc6, 0x09, + 0xc3, 0xfd, 0xdd, 0x22, 0x18, 0x85, 0xcd, 0x0f, 0xfd, 0xf8, 0x1b, 0x72, 0xa2, 0xd5, 0x3d, 0x57, + 0x11, 0xe6, 0x7b, 0x95, 0x20, 0xb1, 0x85, 0x1a, 0xae, 0xbc, 0xdc, 0x53, 0x79, 0xdf, 0xe4, 0xc9, + 0x0a, 0x98, 0x3c, 0x61, 0xa5, 0xca, 0x89, 0x29, 0x55, 0x92, 0xc5, 0x42, 0x91, 0xda, 0x8e, 0xe1, + 0x34, 0x52, 0x0e, 0x8e, 0x79, 0xd1, 0x6e, 0xbb, 0x5d, 0xac, 0x59, 0x9a, 0xd1, 0xc2, 0xe8, 0x43, + 0xd2, 0x28, 0xcc, 0xde, 0x25, 0x98, 0xd4, 0x5b, 0xa6, 0x51, 0xd7, 0x9f, 0xed, 0x5d, 0x2e, 0x17, + 0x1f, 0x64, 0x9d, 0x48, 0xa4, 0xc2, 0xfe, 0x50, 0xfd, 0x7f, 0x95, 0x0a, 0x4c, 0xb5, 0x34, 0xab, + 0x4d, 0x83, 0xf0, 0xe5, 0x7a, 0x2e, 0x72, 0x8a, 0x24, 0x54, 0xf2, 0x7e, 0x51, 0x83, 0xbf, 0x95, + 0x1a, 0x2f, 0xc4, 0x7c, 0x4f, 0x34, 0x8f, 0x48, 0x62, 0x8b, 0xc1, 0x4f, 0x9c, 0xcc, 0x5d, 0xe9, + 0x58, 0xb8, 0x43, 0xee, 0xa0, 0xa7, 0x3d, 0xc4, 0x94, 0x1a, 0x24, 0x24, 0x5d, 0x1e, 0x20, 0x45, + 0xed, 0x43, 0x63, 0xdc, 0xcb, 0x03, 0x42, 0x5c, 0xa4, 0xaf, 0x99, 0x6f, 0xc9, 0xc3, 0x2c, 0xed, + 0xd5, 0x98, 0x38, 0xd1, 0x0b, 0xc8, 0x15, 0xd2, 0xce, 0x03, 0xf8, 0x32, 0xaa, 0x1f, 0x7c, 0x4c, + 0x2e, 0x80, 0x7c, 0xd1, 0x0f, 0x38, 0xe8, 0x3e, 0x26, 0xdd, 0xb7, 0xf7, 0xf8, 0x9a, 0xa7, 0x3c, + 0x8d, 0x7b, 0xdf, 0x3e, 0xbe, 0xf8, 0xf4, 0xf1, 0xf9, 0x79, 0x19, 0xe4, 0x62, 0xbb, 0x8d, 0x5a, + 0x07, 0x87, 0xe2, 0x0c, 0x4c, 0x7b, 0x6d, 0x26, 0x88, 0x01, 0x19, 0x4e, 0x4a, 0xba, 0x08, 0xea, + 0xcb, 0xa6, 0xd8, 0x1e, 0xfb, 0xae, 0x42, 0x4c, 0xd9, 0xe9, 0x83, 0xf2, 0x2b, 0x13, 0xac, 0xd1, + 0x2c, 0x98, 0xe6, 0x45, 0x72, 0x54, 0xe6, 0xf9, 0x32, 0xe4, 0x96, 0xb0, 0xd3, 0xda, 0x1e, 0x51, + 0x9b, 0xd9, 0xb5, 0x3a, 0x5e, 0x9b, 0xd9, 0x77, 0x1f, 0xfe, 0x60, 0x1b, 0xd6, 0x63, 0x6b, 0x9e, + 0xb0, 0x34, 0xee, 0xe8, 0xce, 0xb1, 0xa5, 0xa7, 0x0f, 0xce, 0xbf, 0xc9, 0x30, 0xe7, 0xaf, 0x70, + 0x51, 0x4c, 0x7e, 0x2e, 0xf3, 0x78, 0x5b, 0xef, 0x44, 0x9f, 0x4e, 0x16, 0x22, 0xcd, 0x97, 0x29, + 0x5f, 0xb3, 0x94, 0x17, 0x16, 0x13, 0x04, 0x4f, 0x13, 0x63, 0x70, 0x0c, 0x33, 0x78, 0x19, 0x26, + 0x09, 0x43, 0x8b, 0xfa, 0x1e, 0x71, 0x1d, 0xe4, 0x16, 0x1a, 0x9f, 0x33, 0x92, 0x85, 0xc6, 0xbb, + 0xf8, 0x85, 0x46, 0xc1, 0x88, 0xc7, 0xde, 0x3a, 0x63, 0x42, 0x5f, 0x1a, 0xf7, 0xff, 0x91, 0x2f, + 0x33, 0x26, 0xf0, 0xa5, 0x19, 0x50, 0x7e, 0xfa, 0x88, 0xfe, 0xc6, 0x7f, 0x62, 0x9d, 0xad, 0xb7, + 0xa1, 0x8a, 0xfe, 0xe7, 0x31, 0xc8, 0x9e, 0x73, 0x1f, 0xfe, 0x77, 0x70, 0x23, 0xd6, 0x4b, 0x47, + 0x10, 0x9c, 0xe1, 0x1e, 0xc8, 0xba, 0xf4, 0xd9, 0xb4, 0xe5, 0x26, 0xb1, 0xdd, 0x5d, 0x97, 0x11, + 0x95, 0xfc, 0xa7, 0x9c, 0x84, 0xbc, 0x6d, 0xee, 0x5a, 0x2d, 0xd7, 0x7c, 0x76, 0x35, 0x86, 0xbd, + 0x25, 0x0d, 0x4a, 0xca, 0x91, 0x9e, 0x1f, 0x9d, 0xcb, 0x68, 0xe8, 0x82, 0x24, 0x99, 0xbb, 0x20, + 0x29, 0xc1, 0xfe, 0x81, 0x00, 0x6f, 0xe9, 0x6b, 0xc4, 0x5f, 0x91, 0xbb, 0x02, 0xdb, 0xa3, 0x82, + 0x3d, 0x42, 0x2c, 0x07, 0x55, 0x87, 0xa4, 0x0e, 0xdf, 0xbc, 0x68, 0xfd, 0x38, 0xf0, 0x63, 0x75, + 0xf8, 0x16, 0xe0, 0x61, 0x2c, 0xa7, 0xd4, 0xf3, 0xcc, 0x49, 0xf5, 0xc1, 0x51, 0xa2, 0x9b, 0xe5, + 0x94, 0xfe, 0x40, 0xe8, 0x8c, 0xd0, 0x79, 0x75, 0x68, 0x74, 0x0e, 0xc9, 0x7d, 0xf5, 0x0f, 0x65, + 0x12, 0x09, 0xd3, 0x33, 0x72, 0xc4, 0x2f, 0x3a, 0x4a, 0x0c, 0x91, 0x3b, 0x06, 0x73, 0x71, 0xa0, + 0x67, 0x87, 0x0f, 0x0d, 0xce, 0x8b, 0x2e, 0xc4, 0xff, 0xb8, 0x43, 0x83, 0x8b, 0x32, 0x92, 0x3e, + 0x90, 0xaf, 0xa1, 0x17, 0x8b, 0x15, 0x5b, 0x8e, 0xbe, 0x37, 0xe2, 0x96, 0xc6, 0x0f, 0x2f, 0x09, + 0xa3, 0x01, 0xef, 0x93, 0x10, 0xe5, 0x70, 0xdc, 0xd1, 0x80, 0xc5, 0xd8, 0x48, 0x1f, 0xa6, 0xbf, + 0xcd, 0xbb, 0xd2, 0x63, 0x6b, 0x33, 0xbf, 0xc9, 0x56, 0x03, 0xf0, 0xc1, 0xd1, 0x3a, 0x0b, 0x33, + 0xa1, 0xa9, 0xbf, 0x77, 0x61, 0x0d, 0x97, 0x96, 0xf4, 0xa0, 0xbb, 0x2f, 0xb2, 0x91, 0x2f, 0x0c, + 0x24, 0x58, 0xf0, 0x15, 0x61, 0x62, 0x2c, 0xf7, 0xc1, 0x79, 0x63, 0xd8, 0x98, 0xb0, 0xfa, 0xfd, + 0x30, 0x56, 0x35, 0x1e, 0xab, 0x3b, 0x44, 0xc4, 0x24, 0x36, 0xa6, 0x09, 0xcd, 0x1b, 0xdf, 0xec, + 0xc3, 0xa5, 0x72, 0x70, 0xdd, 0x33, 0x34, 0x1f, 0xe9, 0x23, 0xf6, 0xab, 0xb4, 0x3b, 0xac, 0x53, + 0x93, 0x7d, 0x34, 0xdd, 0x21, 0x9b, 0x0d, 0xc8, 0xdc, 0x6c, 0x20, 0xa1, 0xbf, 0x7d, 0xe0, 0x46, + 0xea, 0x31, 0x37, 0x08, 0xa2, 0xec, 0x88, 0xfd, 0xed, 0x07, 0x72, 0x90, 0x3e, 0x38, 0xff, 0x28, + 0x03, 0x2c, 0x5b, 0xe6, 0x6e, 0xb7, 0x66, 0xb5, 0xb1, 0x85, 0xfe, 0x26, 0x98, 0x00, 0xfc, 0xc2, + 0x08, 0x26, 0x00, 0xeb, 0x00, 0x5b, 0x3e, 0x71, 0xa6, 0xe1, 0xb7, 0x8a, 0x99, 0xfb, 0x01, 0x53, + 0x6a, 0x88, 0x06, 0x7f, 0xe5, 0xec, 0x0f, 0xf1, 0x18, 0xc7, 0xf5, 0x59, 0x01, 0xb9, 0x51, 0x4e, + 0x00, 0xde, 0xea, 0x63, 0xdd, 0xe0, 0xb0, 0xbe, 0xef, 0x00, 0x9c, 0xa4, 0x8f, 0xf9, 0x3f, 0x4d, + 0xc0, 0x34, 0xdd, 0xae, 0xa3, 0x32, 0xfd, 0xfb, 0x00, 0xf4, 0x5f, 0x19, 0x01, 0xe8, 0x1b, 0x30, + 0x63, 0x06, 0xd4, 0x69, 0x9f, 0x1a, 0x5e, 0x80, 0x89, 0x85, 0x3d, 0xc4, 0x97, 0xca, 0x91, 0x41, + 0x1f, 0x08, 0x23, 0xaf, 0xf2, 0xc8, 0xdf, 0x15, 0x23, 0xef, 0x10, 0xc5, 0x51, 0x42, 0xff, 0x36, + 0x1f, 0xfa, 0x0d, 0x0e, 0xfa, 0xe2, 0x41, 0x58, 0x19, 0x43, 0xb8, 0x7d, 0x19, 0xb2, 0xe4, 0x74, + 0xdc, 0x6f, 0xa5, 0x38, 0xbf, 0x3f, 0x05, 0x13, 0xa4, 0xc9, 0xfa, 0xf3, 0x0e, 0xef, 0xd5, 0xfd, + 0xa2, 0x6d, 0x3a, 0xd8, 0xf2, 0x3d, 0x16, 0xbc, 0x57, 0x97, 0x07, 0xcf, 0x2b, 0xd9, 0x3e, 0x95, + 0xa7, 0x1b, 0x91, 0x7e, 0xc2, 0xd0, 0x93, 0x92, 0xb0, 0xc4, 0x47, 0x76, 0x5e, 0x6e, 0x98, 0x49, + 0xc9, 0x00, 0x46, 0xd2, 0x07, 0xfe, 0x2f, 0xb2, 0x70, 0x8a, 0xae, 0x2a, 0x2d, 0x59, 0xe6, 0x4e, + 0xcf, 0xed, 0x56, 0xfa, 0xc1, 0x75, 0xe1, 0x06, 0x98, 0x73, 0x38, 0x7f, 0x6c, 0xa6, 0x13, 0x3d, + 0xa9, 0xe8, 0xcf, 0xc2, 0x3e, 0x15, 0xcf, 0xe2, 0x91, 0x5c, 0x88, 0x11, 0x60, 0x14, 0xef, 0x89, + 0x17, 0xea, 0x05, 0x19, 0x0d, 0x2d, 0x52, 0xc9, 0x43, 0xad, 0x59, 0xfa, 0x3a, 0x95, 0x13, 0xd1, + 0xa9, 0x77, 0xfb, 0x3a, 0xf5, 0x23, 0x9c, 0x4e, 0x2d, 0x1f, 0x5c, 0x24, 0xe9, 0xeb, 0xd6, 0x2b, + 0xfc, 0x8d, 0x21, 0x7f, 0xdb, 0x6e, 0x27, 0x85, 0xcd, 0xba, 0xb0, 0x3f, 0x52, 0x96, 0xf3, 0x47, + 0xe2, 0xef, 0xa3, 0x48, 0x30, 0x13, 0xe6, 0xb9, 0x8e, 0xd0, 0xa5, 0x39, 0x90, 0x74, 0x8f, 0x3b, + 0x49, 0x6f, 0x0f, 0x35, 0xd7, 0x8d, 0x2d, 0x68, 0x0c, 0x6b, 0x4b, 0x73, 0x90, 0x5f, 0xd2, 0x3b, + 0x0e, 0xb6, 0xd0, 0x63, 0x6c, 0xa6, 0xfb, 0x8a, 0x14, 0x07, 0x80, 0x45, 0xc8, 0x6f, 0x92, 0xd2, + 0x98, 0xc9, 0x7c, 0xb3, 0x58, 0xeb, 0xa1, 0x1c, 0xaa, 0xec, 0xdf, 0xa4, 0xd1, 0xf9, 0x7a, 0xc8, + 0x8c, 0x6c, 0x8a, 0x9c, 0x20, 0x3a, 0xdf, 0x60, 0x16, 0xc6, 0x72, 0x31, 0x55, 0x5e, 0xc5, 0x3b, + 0xee, 0x18, 0x7f, 0x31, 0x3d, 0x84, 0x0b, 0x20, 0xeb, 0x6d, 0x9b, 0x74, 0x8e, 0x53, 0xaa, 0xfb, + 0x98, 0xd4, 0x57, 0xa8, 0x57, 0x54, 0x94, 0xe5, 0x71, 0xfb, 0x0a, 0x09, 0x71, 0x91, 0x3e, 0x66, + 0xdf, 0x22, 0x8e, 0xa2, 0xdd, 0x8e, 0xd6, 0xc2, 0x2e, 0xf7, 0xa9, 0xa1, 0x46, 0x7b, 0xb2, 0xac, + 0xd7, 0x93, 0x85, 0xda, 0x69, 0xee, 0x00, 0xed, 0x74, 0xd8, 0x65, 0x48, 0x5f, 0xe6, 0xa4, 0xe2, + 0x87, 0xb6, 0x0c, 0x19, 0xcb, 0xc6, 0x18, 0xae, 0x1d, 0xf5, 0x0e, 0xd2, 0x8e, 0xb5, 0xb5, 0x0e, + 0xbb, 0x49, 0xc3, 0x84, 0x35, 0xb2, 0x43, 0xb3, 0xc3, 0x6c, 0xd2, 0x44, 0xf3, 0x30, 0x06, 0xb4, + 0xe6, 0x18, 0x5a, 0x9f, 0x62, 0xc3, 0x68, 0xca, 0xfb, 0xa4, 0xb6, 0x69, 0x39, 0xc9, 0xf6, 0x49, + 0x5d, 0xee, 0x54, 0xf2, 0x5f, 0xd2, 0x83, 0x57, 0xfc, 0xb9, 0xea, 0x51, 0x0d, 0x9f, 0x09, 0x0e, + 0x5e, 0x0d, 0x62, 0x20, 0x7d, 0x78, 0xdf, 0x70, 0x48, 0x83, 0xe7, 0xb0, 0xcd, 0x91, 0xb5, 0x81, + 0x91, 0x0d, 0x9d, 0xc3, 0x34, 0xc7, 0x68, 0x1e, 0xd2, 0xc7, 0xeb, 0xeb, 0xa1, 0x81, 0xf3, 0x75, + 0x63, 0x1c, 0x38, 0xbd, 0x96, 0x99, 0x1b, 0xb2, 0x65, 0x0e, 0xbb, 0xff, 0xc3, 0x64, 0x3d, 0xba, + 0x01, 0x73, 0x98, 0xfd, 0x9f, 0x18, 0x26, 0xd2, 0x47, 0xfc, 0xf5, 0x32, 0xe4, 0xea, 0xe3, 0x1f, + 0x2f, 0x87, 0x9d, 0x8b, 0x10, 0x59, 0xd5, 0x47, 0x36, 0x5c, 0x0e, 0x33, 0x17, 0x89, 0x64, 0x61, + 0x0c, 0x81, 0xf7, 0x8f, 0xc2, 0x0c, 0x59, 0x12, 0xf1, 0xb6, 0x59, 0xbf, 0xce, 0x46, 0xcd, 0x47, + 0x53, 0x6c, 0xab, 0xf7, 0xc3, 0xa4, 0xb7, 0x7f, 0xc7, 0x46, 0xce, 0x79, 0xb1, 0xf6, 0xe9, 0x71, + 0xa9, 0xfa, 0xff, 0x1f, 0xc8, 0x19, 0x62, 0xe4, 0x7b, 0xb5, 0xc3, 0x3a, 0x43, 0x1c, 0xea, 0x7e, + 0xed, 0x9f, 0x06, 0x23, 0xea, 0x7f, 0x49, 0x0f, 0xf3, 0xde, 0x7d, 0xdc, 0x6c, 0x9f, 0x7d, 0xdc, + 0x0f, 0x85, 0xb1, 0xac, 0xf3, 0x58, 0xde, 0x2d, 0x2a, 0xc2, 0x11, 0x8e, 0xb5, 0x6f, 0xf7, 0xe1, + 0x3c, 0xc7, 0xc1, 0xb9, 0x70, 0x20, 0x5e, 0xc6, 0x70, 0xf0, 0x31, 0x1b, 0x8c, 0xb9, 0x1f, 0x4e, + 0xb1, 0x1d, 0xf7, 0x9c, 0xaa, 0xc8, 0xee, 0x3b, 0x55, 0xc1, 0xb5, 0xf4, 0xdc, 0x01, 0x5b, 0xfa, + 0x87, 0xc3, 0xda, 0xd1, 0xe0, 0xb5, 0xe3, 0x1e, 0x71, 0x44, 0x46, 0x37, 0x32, 0xbf, 0xc3, 0x57, + 0x8f, 0xf3, 0x9c, 0x7a, 0x94, 0x0e, 0xc6, 0x4c, 0xfa, 0xfa, 0xf1, 0x47, 0xde, 0x84, 0xf6, 0x90, + 0xdb, 0xfb, 0xb0, 0x5b, 0xc5, 0x9c, 0x10, 0x47, 0x36, 0x72, 0x0f, 0xb3, 0x55, 0x3c, 0x88, 0x93, + 0x31, 0xc4, 0x62, 0x9b, 0x85, 0x69, 0xc2, 0xd3, 0x79, 0xbd, 0xbd, 0x85, 0x1d, 0xf4, 0x1b, 0xd4, + 0x47, 0xd1, 0x8b, 0x7c, 0x39, 0xa2, 0xf0, 0x44, 0x51, 0xe7, 0x5d, 0x93, 0x7a, 0x74, 0x50, 0x26, + 0xe7, 0x43, 0x0c, 0x8e, 0x3b, 0x82, 0xe2, 0x40, 0x0e, 0xd2, 0x87, 0xec, 0x03, 0xd4, 0xdd, 0x66, + 0x55, 0xbb, 0x6c, 0xee, 0x3a, 0xe8, 0x91, 0x11, 0x74, 0xd0, 0x0b, 0x90, 0xef, 0x10, 0x6a, 0xec, + 0x58, 0x46, 0xfc, 0x74, 0x87, 0x89, 0x80, 0x96, 0xaf, 0xb2, 0x3f, 0x93, 0x9e, 0xcd, 0x08, 0xe4, + 0x48, 0xe9, 0x8c, 0xfb, 0x6c, 0xc6, 0x80, 0xf2, 0xc7, 0x72, 0xc7, 0xce, 0xa4, 0x5b, 0xba, 0xbe, + 0xa3, 0x3b, 0x23, 0x8a, 0xe0, 0xd0, 0x71, 0x69, 0x79, 0x11, 0x1c, 0xc8, 0x4b, 0xd2, 0x13, 0xa3, + 0x21, 0xa9, 0xb8, 0xbf, 0x8f, 0xfb, 0xc4, 0x68, 0x7c, 0xf1, 0xe9, 0x63, 0xf2, 0x4b, 0xb4, 0x65, + 0x9d, 0xa3, 0xce, 0xb7, 0x29, 0xfa, 0xf5, 0x0e, 0xdd, 0x58, 0x28, 0x6b, 0x87, 0xd7, 0x58, 0xfa, + 0x96, 0x9f, 0x3e, 0x30, 0xff, 0xfd, 0xfb, 0x21, 0xb7, 0x88, 0x2f, 0xec, 0x6e, 0xa1, 0xbb, 0x60, + 0xb2, 0x61, 0x61, 0x5c, 0x31, 0x36, 0x4d, 0x57, 0xba, 0x8e, 0xfb, 0xec, 0x41, 0xc2, 0xde, 0x5c, + 0x3c, 0xb6, 0xb1, 0xd6, 0x0e, 0xce, 0x9f, 0x79, 0xaf, 0xe8, 0xa5, 0x12, 0x64, 0xeb, 0x8e, 0xe6, + 0xa0, 0x29, 0x1f, 0x5b, 0xf4, 0x48, 0x18, 0x8b, 0xbb, 0x78, 0x2c, 0x6e, 0xe0, 0x64, 0x41, 0x38, + 0x98, 0x77, 0xff, 0x8f, 0x00, 0x00, 0xc1, 0xe4, 0x43, 0xb6, 0x69, 0xb8, 0x39, 0xbc, 0x23, 0x90, + 0xde, 0x3b, 0x7a, 0xb9, 0x2f, 0xee, 0x7b, 0x39, 0x71, 0x3f, 0x59, 0xac, 0x88, 0x31, 0xac, 0xb4, + 0x49, 0x30, 0xe5, 0x8a, 0x76, 0x05, 0x6b, 0x6d, 0x1b, 0x7d, 0x5f, 0xa0, 0xfc, 0x11, 0x62, 0x46, + 0xef, 0x11, 0x0e, 0xc6, 0x49, 0x6b, 0xe5, 0x13, 0x8f, 0xf6, 0xe8, 0xf0, 0x36, 0xff, 0x25, 0x3e, + 0x18, 0xc9, 0x2d, 0x90, 0xd5, 0x8d, 0x4d, 0x93, 0xf9, 0x17, 0x5e, 0x1d, 0x41, 0xdb, 0xd5, 0x09, + 0x95, 0x64, 0x14, 0x8c, 0xd4, 0x19, 0xcf, 0xd6, 0x58, 0x2e, 0xbd, 0xcb, 0xba, 0xa5, 0xa3, 0xff, + 0xff, 0x40, 0x61, 0x2b, 0x0a, 0x64, 0xbb, 0x9a, 0xb3, 0xcd, 0x8a, 0x26, 0xcf, 0xae, 0x8d, 0xbc, + 0x6b, 0x68, 0x86, 0x69, 0x5c, 0xde, 0xd1, 0x9f, 0xed, 0xdf, 0xad, 0xcb, 0xa5, 0xb9, 0x9c, 0x6f, + 0x61, 0x03, 0x5b, 0x9a, 0x83, 0xeb, 0x7b, 0x5b, 0x64, 0x8e, 0x35, 0xa9, 0x86, 0x93, 0x12, 0xeb, + 0xbf, 0xcb, 0x71, 0xb4, 0xfe, 0x6f, 0xea, 0x1d, 0x4c, 0x22, 0x35, 0x31, 0xfd, 0xf7, 0xde, 0x13, + 0xe9, 0x7f, 0x9f, 0x22, 0xd2, 0x47, 0xe3, 0xdb, 0x12, 0xcc, 0xd4, 0x5d, 0x85, 0xab, 0xef, 0xee, + 0xec, 0x68, 0xd6, 0x65, 0x74, 0x5d, 0x80, 0x4a, 0x48, 0x35, 0x33, 0xbc, 0x5f, 0xca, 0x1f, 0x0a, + 0x5f, 0x2b, 0xcd, 0x9a, 0x76, 0xa8, 0x84, 0xc4, 0xed, 0xe0, 0x36, 0xc8, 0xb9, 0xea, 0xed, 0x79, + 0x5c, 0xc6, 0x36, 0x04, 0x9a, 0x53, 0x30, 0xa2, 0xd5, 0x40, 0xde, 0xc6, 0x10, 0x4d, 0x43, 0x82, + 0xa3, 0x75, 0x47, 0x6b, 0x5d, 0x5c, 0x36, 0x2d, 0x73, 0xd7, 0xd1, 0x0d, 0x6c, 0xa3, 0x27, 0x04, + 0x08, 0x78, 0xfa, 0x9f, 0x09, 0xf4, 0x1f, 0xfd, 0x7b, 0x46, 0x74, 0x14, 0xf5, 0xbb, 0xd5, 0x30, + 0xf9, 0x88, 0x00, 0x55, 0x62, 0xe3, 0xa2, 0x08, 0xc5, 0xf4, 0x85, 0xf6, 0x3a, 0x19, 0x0a, 0xe5, + 0x87, 0xbb, 0xa6, 0xe5, 0xac, 0x9a, 0x2d, 0xad, 0x63, 0x3b, 0xa6, 0x85, 0x51, 0x2d, 0x56, 0x6a, + 0x6e, 0x0f, 0xd3, 0x36, 0x5b, 0xc1, 0xe0, 0xc8, 0xde, 0xc2, 0x6a, 0x27, 0xf3, 0x3a, 0xfe, 0x01, + 0xe1, 0x5d, 0x46, 0x2a, 0x95, 0x5e, 0x8e, 0x22, 0xf4, 0xbc, 0x5f, 0x97, 0x96, 0xec, 0xb0, 0x84, + 0xd8, 0xce, 0xa3, 0x10, 0x53, 0x63, 0x58, 0x2a, 0x97, 0x60, 0xb6, 0xbe, 0x7b, 0xc1, 0x27, 0x62, + 0x87, 0x8d, 0x90, 0x57, 0x0a, 0x47, 0xa9, 0x60, 0x8a, 0x17, 0x26, 0x14, 0x21, 0xdf, 0xeb, 0x61, + 0xd6, 0x0e, 0x67, 0x63, 0x78, 0xf3, 0x89, 0x82, 0xd1, 0x29, 0x06, 0x97, 0x9a, 0xbe, 0x00, 0xdf, + 0x21, 0xc1, 0x6c, 0xad, 0x8b, 0x0d, 0xdc, 0xa6, 0x5e, 0x90, 0x9c, 0x00, 0x5f, 0x9a, 0x50, 0x80, + 0x1c, 0xa1, 0x08, 0x01, 0x06, 0x1e, 0xcb, 0x8b, 0x9e, 0xf0, 0x82, 0x84, 0x44, 0x82, 0x8b, 0x2b, + 0x2d, 0x7d, 0xc1, 0x7d, 0x5e, 0x82, 0x69, 0x75, 0xd7, 0x58, 0xb7, 0x4c, 0x77, 0x34, 0xb6, 0xd0, + 0xdd, 0x41, 0x07, 0x71, 0x33, 0x1c, 0x6b, 0xef, 0x5a, 0x64, 0xfd, 0xa9, 0x62, 0xd4, 0x71, 0xcb, + 0x34, 0xda, 0x36, 0xa9, 0x47, 0x4e, 0xdd, 0xff, 0xe1, 0xce, 0xec, 0xf3, 0xbf, 0x22, 0x67, 0xd0, + 0x0b, 0x84, 0x43, 0xdd, 0xd0, 0xca, 0x87, 0x8a, 0x16, 0xef, 0x09, 0x04, 0x03, 0xda, 0x0c, 0x2a, + 0x21, 0x7d, 0xe1, 0x7e, 0x4a, 0x02, 0xa5, 0xd8, 0x6a, 0x99, 0xbb, 0x86, 0x53, 0xc7, 0x1d, 0xdc, + 0x72, 0x1a, 0x96, 0xd6, 0xc2, 0x61, 0xfb, 0xb9, 0x00, 0x72, 0x5b, 0xb7, 0x58, 0x1f, 0xec, 0x3e, + 0x32, 0x39, 0xbe, 0x54, 0x78, 0xc7, 0x91, 0xd6, 0x72, 0x7f, 0x29, 0x09, 0xc4, 0x29, 0xb6, 0xaf, + 0x28, 0x58, 0x50, 0xfa, 0x52, 0xfd, 0xb0, 0x04, 0x53, 0x5e, 0x8f, 0xbd, 0x25, 0x22, 0xcc, 0x5f, + 0x4a, 0x38, 0x19, 0xf1, 0x89, 0x27, 0x90, 0xe1, 0x5b, 0x12, 0xcc, 0x2a, 0xa2, 0xe8, 0x27, 0x13, + 0x5d, 0x31, 0xb9, 0xe8, 0xdc, 0xd7, 0x6a, 0xad, 0xb9, 0x54, 0x5b, 0x5d, 0x2c, 0xab, 0x05, 0x19, + 0x3d, 0x26, 0x41, 0x76, 0x5d, 0x37, 0xb6, 0xc2, 0xd1, 0x95, 0x8e, 0xbb, 0x76, 0x64, 0x1b, 0x3f, + 0xcc, 0x5a, 0x3a, 0x7d, 0x51, 0x6e, 0x87, 0xe3, 0xc6, 0xee, 0xce, 0x05, 0x6c, 0xd5, 0x36, 0xc9, + 0x28, 0x6b, 0x37, 0xcc, 0x3a, 0x36, 0xa8, 0x11, 0x9a, 0x53, 0xfb, 0x7e, 0xe3, 0x4d, 0x30, 0x81, + 0xc9, 0x83, 0xcb, 0x49, 0x84, 0xc4, 0x7d, 0xa6, 0xa4, 0x10, 0x53, 0x89, 0xa6, 0x0d, 0x7d, 0x88, + 0xa7, 0xaf, 0xa9, 0x7f, 0x9c, 0x83, 0x13, 0x45, 0xe3, 0x32, 0xb1, 0x29, 0x68, 0x07, 0x5f, 0xda, + 0xd6, 0x8c, 0x2d, 0x4c, 0x06, 0x08, 0x5f, 0xe2, 0xe1, 0x10, 0xfd, 0x19, 0x3e, 0x44, 0xbf, 0xa2, + 0xc2, 0x84, 0x69, 0xb5, 0xb1, 0xb5, 0x70, 0x99, 0xf0, 0xd4, 0xbb, 0xec, 0xcc, 0xda, 0x64, 0xbf, + 0x22, 0xe6, 0x19, 0xf9, 0xf9, 0x1a, 0xfd, 0x5f, 0xf5, 0x08, 0x9d, 0xbd, 0x19, 0x26, 0x58, 0x9a, + 0x32, 0x03, 0x93, 0x35, 0x75, 0xb1, 0xac, 0x36, 0x2b, 0x8b, 0x85, 0x23, 0xca, 0x15, 0x70, 0xb4, + 0xd2, 0x28, 0xab, 0xc5, 0x46, 0xa5, 0x56, 0x6d, 0x92, 0xf4, 0x42, 0x06, 0x3d, 0x2f, 0x2b, 0xea, + 0xd9, 0x1b, 0xcf, 0x4c, 0x3f, 0x58, 0x55, 0x98, 0x68, 0xd1, 0x0c, 0x64, 0x08, 0x9d, 0x4e, 0x54, + 0x3b, 0x46, 0x90, 0x26, 0xa8, 0x1e, 0x21, 0xe5, 0x34, 0xc0, 0x25, 0xcb, 0x34, 0xb6, 0x82, 0x53, + 0x87, 0x93, 0x6a, 0x28, 0x05, 0x3d, 0x92, 0x81, 0x3c, 0xfd, 0x87, 0x5c, 0x49, 0x42, 0x9e, 0x02, + 0xc1, 0x7b, 0xef, 0xae, 0xc5, 0x4b, 0xe4, 0x15, 0x4c, 0xb4, 0xd8, 0xab, 0xab, 0x8b, 0x54, 0x06, + 0xd4, 0x12, 0x66, 0x55, 0xb9, 0x05, 0xf2, 0xf4, 0x5f, 0xe6, 0x75, 0x10, 0x1d, 0x5e, 0x94, 0x66, + 0x13, 0xf4, 0x53, 0x16, 0x97, 0x69, 0xfa, 0xda, 0xfc, 0x5e, 0x09, 0x26, 0xab, 0xd8, 0x29, 0x6d, + 0xe3, 0xd6, 0x45, 0xf4, 0x24, 0x7e, 0x01, 0xb4, 0xa3, 0x63, 0xc3, 0x79, 0x70, 0xa7, 0xe3, 0x2f, + 0x80, 0x7a, 0x09, 0xe8, 0xa7, 0xc3, 0x9d, 0xef, 0x7d, 0xbc, 0xfe, 0xdc, 0xd4, 0xa7, 0xae, 0x5e, + 0x09, 0x11, 0x2a, 0x73, 0x12, 0xf2, 0x16, 0xb6, 0x77, 0x3b, 0xde, 0x22, 0x1a, 0x7b, 0x43, 0xaf, + 0xf2, 0xc5, 0x59, 0xe2, 0xc4, 0x79, 0x8b, 0x78, 0x11, 0x63, 0x88, 0x57, 0x9a, 0x85, 0x89, 0x8a, + 0xa1, 0x3b, 0xba, 0xd6, 0x41, 0x2f, 0xc8, 0xc2, 0x6c, 0x1d, 0x3b, 0xeb, 0x9a, 0xa5, 0xed, 0x60, + 0x07, 0x5b, 0x36, 0xfa, 0x26, 0xdf, 0x27, 0x74, 0x3b, 0x9a, 0xb3, 0x69, 0x5a, 0x3b, 0x9e, 0x6a, + 0x7a, 0xef, 0xae, 0x6a, 0xee, 0x61, 0xcb, 0x0e, 0xf8, 0xf2, 0x5e, 0xdd, 0x2f, 0x97, 0x4c, 0xeb, + 0xa2, 0x3b, 0x08, 0xb2, 0x69, 0x1a, 0x7b, 0x75, 0xe9, 0x75, 0xcc, 0xad, 0x55, 0xbc, 0x87, 0xbd, + 0x70, 0x69, 0xfe, 0xbb, 0x3b, 0x17, 0x68, 0x9b, 0x55, 0xd3, 0x71, 0x3b, 0xed, 0x55, 0x73, 0x8b, + 0xc6, 0x8b, 0x9d, 0x54, 0xf9, 0xc4, 0x20, 0x97, 0xb6, 0x87, 0x49, 0xae, 0x7c, 0x38, 0x17, 0x4b, + 0x54, 0xe6, 0x41, 0xf1, 0x7f, 0x6b, 0xe0, 0x0e, 0xde, 0xc1, 0x8e, 0x75, 0x99, 0x5c, 0x0b, 0x31, + 0xa9, 0xf6, 0xf9, 0xc2, 0x06, 0x68, 0xf1, 0xc9, 0x3a, 0x93, 0xde, 0x3c, 0x27, 0xb9, 0x03, 0x4d, + 0xd6, 0x45, 0x28, 0x8e, 0xe5, 0xda, 0x2b, 0xd9, 0xb5, 0x66, 0x7e, 0x4d, 0x86, 0x2c, 0x19, 0x3c, + 0x5f, 0x9f, 0xe1, 0x56, 0x98, 0x76, 0xb0, 0x6d, 0x6b, 0x5b, 0xd8, 0x5b, 0x61, 0x62, 0xaf, 0xca, + 0x1d, 0x90, 0xeb, 0x10, 0x4c, 0xe9, 0xe0, 0x70, 0x1d, 0x57, 0x33, 0xd7, 0xc0, 0x70, 0x69, 0xf9, + 0x23, 0x01, 0x81, 0x5b, 0xa5, 0x7f, 0x9c, 0xbd, 0x1f, 0x72, 0x14, 0xfe, 0x29, 0xc8, 0x2d, 0x96, + 0x17, 0x36, 0x96, 0x0b, 0x47, 0xdc, 0x47, 0x8f, 0xbf, 0x29, 0xc8, 0x2d, 0x15, 0x1b, 0xc5, 0xd5, + 0x82, 0xe4, 0xd6, 0xa3, 0x52, 0x5d, 0xaa, 0x15, 0x64, 0x37, 0x71, 0xbd, 0x58, 0xad, 0x94, 0x0a, + 0x59, 0x65, 0x1a, 0x26, 0xce, 0x17, 0xd5, 0x6a, 0xa5, 0xba, 0x5c, 0xc8, 0xa1, 0xbf, 0x0d, 0xe3, + 0x77, 0x27, 0x8f, 0xdf, 0xf5, 0x51, 0x3c, 0xf5, 0x83, 0xec, 0xd7, 0x7d, 0xc8, 0xee, 0xe6, 0x20, + 0xfb, 0x7e, 0x11, 0x22, 0x63, 0x70, 0x67, 0xca, 0xc3, 0xc4, 0xba, 0x65, 0xb6, 0xb0, 0x6d, 0xa3, + 0x5f, 0x96, 0x20, 0x5f, 0xd2, 0x8c, 0x16, 0xee, 0xa0, 0xab, 0x02, 0xa8, 0xa8, 0xab, 0x68, 0xc6, + 0x3f, 0x2d, 0xf6, 0x8f, 0x19, 0xd1, 0xde, 0x8f, 0xd1, 0x9d, 0xa7, 0x34, 0x23, 0xe4, 0x23, 0xd6, + 0xcb, 0xc5, 0x92, 0x1a, 0xc3, 0xd5, 0x38, 0x12, 0x4c, 0xb1, 0xd5, 0x80, 0x0b, 0x38, 0x3c, 0x0f, + 0xff, 0x66, 0x46, 0x74, 0x72, 0xe8, 0xd5, 0xc0, 0x27, 0x13, 0x21, 0x0f, 0xb1, 0x89, 0xe0, 0x20, + 0x6a, 0x63, 0xd8, 0x3c, 0x94, 0x60, 0x7a, 0xc3, 0xb0, 0xfb, 0x09, 0x45, 0x3c, 0x8e, 0xbe, 0x57, + 0x8d, 0x10, 0xa1, 0x03, 0xc5, 0xd1, 0x1f, 0x4c, 0x2f, 0x7d, 0xc1, 0x7c, 0x33, 0x03, 0xc7, 0x97, + 0xb1, 0x81, 0x2d, 0xbd, 0x45, 0x6b, 0xe0, 0x49, 0xe2, 0x6e, 0x5e, 0x12, 0x4f, 0xe2, 0x38, 0xef, + 0xf7, 0x07, 0x2f, 0x81, 0x57, 0xf8, 0x12, 0xb8, 0x8f, 0x93, 0xc0, 0xcd, 0x82, 0x74, 0xc6, 0x70, + 0x1f, 0xfa, 0x14, 0xcc, 0x54, 0x4d, 0x47, 0xdf, 0xd4, 0x5b, 0xd4, 0x07, 0xed, 0x57, 0x65, 0xc8, + 0xae, 0xea, 0xb6, 0x83, 0x8a, 0x41, 0x77, 0x72, 0x06, 0xa6, 0x75, 0xa3, 0xd5, 0xd9, 0x6d, 0x63, + 0x15, 0x6b, 0xb4, 0x5f, 0x99, 0x54, 0xc3, 0x49, 0xc1, 0xd6, 0xbe, 0xcb, 0x96, 0xec, 0x6d, 0xed, + 0x7f, 0x5c, 0x78, 0x19, 0x26, 0xcc, 0x02, 0x09, 0x48, 0x19, 0x61, 0x77, 0x15, 0x61, 0xd6, 0x08, + 0x65, 0xf5, 0x0c, 0xf6, 0xde, 0x0b, 0x05, 0xc2, 0xe4, 0x54, 0xfe, 0x0f, 0xf4, 0x2e, 0xa1, 0xc6, + 0x3a, 0x88, 0xa1, 0x64, 0xc8, 0x2c, 0x0d, 0x31, 0x49, 0x56, 0x60, 0xae, 0x52, 0x6d, 0x94, 0xd5, + 0x6a, 0x71, 0x95, 0x65, 0x91, 0xd1, 0xb7, 0x25, 0xc8, 0xa9, 0xb8, 0xdb, 0xb9, 0x1c, 0x8e, 0x18, + 0xcd, 0x1c, 0xc5, 0x33, 0xbe, 0xa3, 0xb8, 0xb2, 0x04, 0xa0, 0xb5, 0xdc, 0x82, 0xc9, 0x95, 0x5a, + 0x52, 0xdf, 0x38, 0xa6, 0x5c, 0x05, 0x8b, 0x7e, 0x6e, 0x35, 0xf4, 0x27, 0x7a, 0xa1, 0xf0, 0xce, + 0x11, 0x47, 0x8d, 0x70, 0x18, 0xd1, 0x27, 0xbc, 0x5b, 0x68, 0xb3, 0x67, 0x20, 0xb9, 0xc3, 0x11, + 0xff, 0x17, 0x24, 0xc8, 0x36, 0xdc, 0xde, 0x32, 0xd4, 0x71, 0x7e, 0x6c, 0x38, 0x1d, 0x77, 0xc9, + 0x44, 0xe8, 0xf8, 0xbd, 0x30, 0x13, 0xd6, 0x58, 0xe6, 0x2a, 0x11, 0xab, 0xe2, 0xdc, 0x0f, 0xc3, + 0x68, 0x78, 0x1f, 0x76, 0x0e, 0x47, 0xc4, 0x1f, 0x79, 0x32, 0xc0, 0x1a, 0xde, 0xb9, 0x80, 0x2d, + 0x7b, 0x5b, 0xef, 0xa2, 0xbf, 0x93, 0x61, 0x6a, 0x19, 0x3b, 0x75, 0x47, 0x73, 0x76, 0xed, 0x9e, + 0xed, 0x4e, 0xc3, 0x2c, 0x69, 0xad, 0x6d, 0xcc, 0xba, 0x23, 0xef, 0x15, 0xbd, 0x4d, 0x16, 0xf5, + 0x27, 0x0a, 0xca, 0x99, 0xf7, 0xcb, 0x88, 0xc0, 0xe4, 0x29, 0x90, 0x6d, 0x6b, 0x8e, 0xc6, 0xb0, + 0xb8, 0xaa, 0x07, 0x8b, 0x80, 0x90, 0x4a, 0xb2, 0xa1, 0xdf, 0x91, 0x44, 0x1c, 0x8a, 0x04, 0xca, + 0x4f, 0x06, 0xc2, 0xbb, 0x32, 0x43, 0xa0, 0x70, 0x0c, 0x66, 0xab, 0xb5, 0x46, 0x73, 0xb5, 0xb6, + 0xbc, 0x5c, 0x76, 0x53, 0x0b, 0xb2, 0x72, 0x12, 0x94, 0xf5, 0xe2, 0x83, 0x6b, 0xe5, 0x6a, 0xa3, + 0x59, 0xad, 0x2d, 0x96, 0xd9, 0x9f, 0x59, 0xe5, 0x28, 0x4c, 0x97, 0x8a, 0xa5, 0x15, 0x2f, 0x21, + 0xa7, 0x9c, 0x82, 0xe3, 0x6b, 0xe5, 0xb5, 0x85, 0xb2, 0x5a, 0x5f, 0xa9, 0xac, 0x37, 0x5d, 0x32, + 0x4b, 0xb5, 0x8d, 0xea, 0x62, 0x21, 0xaf, 0x20, 0x38, 0x19, 0xfa, 0x72, 0x5e, 0xad, 0x55, 0x97, + 0x9b, 0xf5, 0x46, 0xb1, 0x51, 0x2e, 0x4c, 0x28, 0x57, 0xc0, 0xd1, 0x52, 0xb1, 0x4a, 0xb2, 0x97, + 0x6a, 0xd5, 0x6a, 0xb9, 0xd4, 0x28, 0x4c, 0xa2, 0x7f, 0xcf, 0xc2, 0x74, 0xc5, 0xae, 0x6a, 0x3b, + 0xf8, 0x9c, 0xd6, 0xd1, 0xdb, 0xe8, 0x05, 0xa1, 0x99, 0xc7, 0xf5, 0x30, 0x6b, 0xd1, 0x47, 0xdc, + 0x6e, 0xe8, 0x98, 0xa2, 0x39, 0xab, 0xf2, 0x89, 0xee, 0x9c, 0xdc, 0x20, 0x04, 0xbc, 0x39, 0x39, + 0x7d, 0x53, 0x16, 0x00, 0xe8, 0x53, 0x23, 0xb8, 0xdc, 0xf5, 0x6c, 0x6f, 0x6b, 0xd2, 0x76, 0xb0, + 0x8d, 0xad, 0x3d, 0xbd, 0x85, 0xbd, 0x9c, 0x6a, 0xe8, 0x2f, 0xf4, 0x45, 0x59, 0x74, 0x7f, 0x31, + 0x04, 0x6a, 0xa8, 0x3a, 0x11, 0xbd, 0xe1, 0xcf, 0xc8, 0x22, 0xbb, 0x83, 0x42, 0x24, 0x93, 0x69, + 0xca, 0x8b, 0xa5, 0xe1, 0x96, 0x6d, 0x1b, 0xb5, 0x5a, 0xb3, 0xbe, 0x52, 0x53, 0x1b, 0x05, 0x59, + 0x99, 0x81, 0x49, 0xf7, 0x75, 0xb5, 0x56, 0x5d, 0x2e, 0x64, 0x95, 0x13, 0x70, 0x6c, 0xa5, 0x58, + 0x6f, 0x56, 0xaa, 0xe7, 0x8a, 0xab, 0x95, 0xc5, 0x66, 0x69, 0xa5, 0xa8, 0xd6, 0x0b, 0x39, 0xe5, + 0x2a, 0x38, 0xd1, 0xa8, 0x94, 0xd5, 0xe6, 0x52, 0xb9, 0xd8, 0xd8, 0x50, 0xcb, 0xf5, 0x66, 0xb5, + 0xd6, 0xac, 0x16, 0xd7, 0xca, 0x85, 0xbc, 0xdb, 0xfc, 0xc9, 0xa7, 0x40, 0x6d, 0x26, 0xf6, 0x2b, + 0xe3, 0x64, 0x84, 0x32, 0x4e, 0xf5, 0x2a, 0x23, 0x84, 0xd5, 0x4a, 0x2d, 0xd7, 0xcb, 0xea, 0xb9, + 0x72, 0x61, 0xba, 0x9f, 0xae, 0xcd, 0x28, 0xc7, 0xa1, 0xe0, 0xf2, 0xd0, 0xac, 0xd4, 0xbd, 0x9c, + 0x8b, 0x85, 0x59, 0xf4, 0xe1, 0x3c, 0x9c, 0x54, 0xf1, 0x96, 0x6e, 0x3b, 0xd8, 0x5a, 0xd7, 0x2e, + 0xef, 0x60, 0xc3, 0xf1, 0x3a, 0xf9, 0x7f, 0x49, 0xac, 0x8c, 0x6b, 0x30, 0xdb, 0xa5, 0x34, 0xd6, + 0xb0, 0xb3, 0x6d, 0xb6, 0xd9, 0x28, 0xfc, 0xa4, 0xc8, 0x9e, 0x63, 0x7e, 0x3d, 0x9c, 0x5d, 0xe5, + 0xff, 0x0e, 0xe9, 0xb6, 0x1c, 0xa3, 0xdb, 0xd9, 0x61, 0x74, 0x5b, 0xb9, 0x06, 0xa6, 0x76, 0x6d, + 0x6c, 0x95, 0x77, 0x34, 0xbd, 0xe3, 0x5d, 0xce, 0xe9, 0x27, 0xa0, 0x37, 0x67, 0x45, 0x4f, 0xac, + 0x84, 0xea, 0xd2, 0x5f, 0x8c, 0x11, 0x7d, 0xeb, 0x69, 0x00, 0x56, 0xd9, 0x0d, 0xab, 0xc3, 0x94, + 0x35, 0x94, 0xe2, 0xf2, 0x77, 0x41, 0xef, 0x74, 0x74, 0x63, 0xcb, 0xdf, 0xf7, 0x0f, 0x12, 0xd0, + 0x8b, 0x65, 0x91, 0x13, 0x2c, 0x49, 0x79, 0x4b, 0xd6, 0x9a, 0x5e, 0x28, 0x8d, 0xb9, 0xdf, 0xdd, + 0xdf, 0x74, 0xf2, 0x4a, 0x01, 0x66, 0x48, 0x1a, 0x6b, 0x81, 0x85, 0x09, 0xb7, 0x0f, 0xf6, 0xc8, + 0xad, 0x95, 0x1b, 0x2b, 0xb5, 0x45, 0xff, 0xdb, 0xa4, 0x4b, 0xd2, 0x65, 0xa6, 0x58, 0x7d, 0x90, + 0xb4, 0xc6, 0x29, 0xe5, 0x09, 0x70, 0x55, 0xa8, 0xc3, 0x2e, 0xae, 0xaa, 0xe5, 0xe2, 0xe2, 0x83, + 0xcd, 0xf2, 0xb3, 0x2a, 0xf5, 0x46, 0x9d, 0x6f, 0x5c, 0x5e, 0x3b, 0x9a, 0x76, 0xf9, 0x2d, 0xaf, + 0x15, 0x2b, 0xab, 0xac, 0x7f, 0x5f, 0xaa, 0xa9, 0x6b, 0xc5, 0x46, 0x61, 0x06, 0xfd, 0x9a, 0x0c, + 0x85, 0x65, 0xec, 0xac, 0x9b, 0x96, 0xa3, 0x75, 0x56, 0x75, 0xe3, 0xe2, 0x86, 0xd5, 0xe1, 0x26, + 0x9b, 0xc2, 0x61, 0x3a, 0xf8, 0x21, 0x92, 0x23, 0x18, 0xbd, 0x23, 0xde, 0x25, 0xd9, 0x02, 0x65, + 0x0a, 0x12, 0xd0, 0x73, 0x24, 0x91, 0xe5, 0x6e, 0xf1, 0x52, 0x93, 0xe9, 0xc9, 0x73, 0xc7, 0x3d, + 0x3e, 0xf7, 0x41, 0x2d, 0x8f, 0x9e, 0x9f, 0x85, 0xc9, 0x25, 0xdd, 0xd0, 0x3a, 0xfa, 0xb3, 0xb9, + 0xf8, 0xa5, 0x41, 0x1f, 0x93, 0x89, 0xe9, 0x63, 0xa4, 0xa1, 0xc6, 0xcf, 0x5f, 0x94, 0x45, 0x97, + 0x17, 0x42, 0xb2, 0xf7, 0x98, 0x8c, 0x18, 0x3c, 0xdf, 0x27, 0x89, 0x2c, 0x2f, 0x0c, 0xa6, 0x97, + 0x0c, 0xc3, 0x8f, 0x7e, 0x77, 0xd8, 0x58, 0x3d, 0xed, 0x7b, 0xb2, 0x9f, 0x2a, 0x4c, 0xa1, 0x3f, + 0x97, 0x01, 0x2d, 0x63, 0xe7, 0x1c, 0xb6, 0xfc, 0xa9, 0x00, 0xe9, 0xf5, 0x99, 0xbd, 0x1d, 0x6a, + 0xb2, 0xaf, 0x0f, 0x03, 0x78, 0x9e, 0x07, 0xb0, 0x18, 0xd3, 0x78, 0x22, 0x48, 0x47, 0x34, 0xde, + 0x0a, 0xe4, 0x6d, 0xf2, 0x9d, 0xa9, 0xd9, 0x6d, 0xd1, 0xc3, 0x25, 0x21, 0x16, 0xa6, 0x4e, 0x09, + 0xab, 0x8c, 0x00, 0xfa, 0x96, 0x3f, 0x09, 0xfa, 0x61, 0x4e, 0x3b, 0x96, 0x0e, 0xcc, 0x6c, 0x32, + 0x7d, 0xb1, 0xd2, 0x55, 0x97, 0x7e, 0xf6, 0x0d, 0x7a, 0x5f, 0x0e, 0x8e, 0xf7, 0xab, 0x0e, 0xfa, + 0xdd, 0x0c, 0xb7, 0xc3, 0x8e, 0xc9, 0x90, 0x9f, 0x61, 0x1b, 0x88, 0xee, 0x8b, 0xf2, 0x34, 0x38, + 0xe1, 0x2f, 0xc3, 0x35, 0xcc, 0x2a, 0xbe, 0x64, 0x77, 0xb0, 0xe3, 0x60, 0x8b, 0x54, 0x6d, 0x52, + 0xed, 0xff, 0x51, 0x79, 0x06, 0x5c, 0xa9, 0x1b, 0xb6, 0xde, 0xc6, 0x56, 0x43, 0xef, 0xda, 0x45, + 0xa3, 0xdd, 0xd8, 0x75, 0x4c, 0x4b, 0xd7, 0xd8, 0x55, 0x92, 0x93, 0x6a, 0xd4, 0x67, 0xe5, 0x26, + 0x28, 0xe8, 0x76, 0xcd, 0xb8, 0x60, 0x6a, 0x56, 0x5b, 0x37, 0xb6, 0x56, 0x75, 0xdb, 0x61, 0x1e, + 0xc0, 0xfb, 0xd2, 0xd1, 0xdf, 0xcb, 0xa2, 0x87, 0xe9, 0x06, 0xc0, 0x1a, 0xd1, 0xa1, 0xfc, 0xb4, + 0x2c, 0x72, 0x3c, 0x2e, 0x19, 0xed, 0x64, 0xca, 0xf2, 0xbc, 0x71, 0x1b, 0x12, 0xfd, 0x47, 0x70, + 0xd2, 0xb5, 0xd0, 0x74, 0xcf, 0x10, 0x38, 0x57, 0x56, 0x2b, 0x4b, 0x95, 0xb2, 0x6b, 0x56, 0x9c, + 0x80, 0x63, 0xc1, 0xb7, 0xc5, 0x07, 0x9b, 0xf5, 0x72, 0xb5, 0x51, 0x98, 0x74, 0xfb, 0x29, 0x9a, + 0xbc, 0x54, 0xac, 0xac, 0x96, 0x17, 0x9b, 0x8d, 0x9a, 0xfb, 0x65, 0x71, 0x38, 0xd3, 0x02, 0x3d, + 0x92, 0x85, 0xa3, 0x44, 0xb6, 0x97, 0x89, 0x54, 0x5d, 0xa1, 0xf4, 0xf8, 0xda, 0xfa, 0x00, 0x4d, + 0x51, 0xf1, 0xa2, 0x4f, 0x0a, 0xdf, 0x94, 0x19, 0x82, 0xb0, 0xa7, 0x8c, 0x08, 0xcd, 0xf8, 0xa6, + 0x24, 0x12, 0xa1, 0x42, 0x98, 0x6c, 0x32, 0xa5, 0xf8, 0xd7, 0x71, 0x8f, 0x38, 0xd1, 0xe0, 0x13, + 0x2b, 0xb3, 0x44, 0x7e, 0x7e, 0xd6, 0x7a, 0x45, 0x25, 0xea, 0x30, 0x07, 0x40, 0x52, 0x88, 0x06, + 0x51, 0x3d, 0xe8, 0x3b, 0x5e, 0x45, 0xe9, 0x41, 0xb1, 0xd4, 0xa8, 0x9c, 0x2b, 0x47, 0xe9, 0xc1, + 0x27, 0x64, 0x98, 0x5c, 0xc6, 0x8e, 0x3b, 0xa7, 0xb2, 0xd1, 0x33, 0x05, 0xd6, 0x7f, 0x5c, 0x33, + 0xa6, 0x63, 0xb6, 0xb4, 0x8e, 0xbf, 0x0c, 0x40, 0xdf, 0xd0, 0x4f, 0x0d, 0x63, 0x82, 0x78, 0x45, + 0x47, 0x8c, 0x57, 0x3f, 0x08, 0x39, 0xc7, 0xfd, 0xcc, 0x96, 0xa1, 0xbf, 0x2f, 0x72, 0xb8, 0x72, + 0x89, 0x2c, 0x6a, 0x8e, 0xa6, 0xd2, 0xfc, 0xa1, 0xd1, 0x49, 0xd0, 0x76, 0x89, 0x60, 0xe4, 0xbb, + 0xd1, 0xfe, 0xfc, 0x5b, 0x19, 0x4e, 0xd0, 0xf6, 0x51, 0xec, 0x76, 0xeb, 0x8e, 0x69, 0x61, 0x15, + 0xb7, 0xb0, 0xde, 0x75, 0x7a, 0xd6, 0xf7, 0x2c, 0x9a, 0xea, 0x6d, 0x36, 0xb3, 0x57, 0xf4, 0x9b, + 0xb2, 0x68, 0x0c, 0xe6, 0x7d, 0xed, 0xb1, 0xa7, 0xbc, 0x88, 0xc6, 0xfe, 0x21, 0x49, 0x24, 0xaa, + 0x72, 0x42, 0xe2, 0xc9, 0x80, 0x7a, 0xff, 0x21, 0x00, 0xe5, 0xad, 0xdc, 0xa8, 0xe5, 0x52, 0xb9, + 0xb2, 0xee, 0x0e, 0x02, 0xd7, 0xc2, 0xd5, 0xeb, 0x1b, 0x6a, 0x69, 0xa5, 0x58, 0x2f, 0x37, 0xd5, + 0xf2, 0x72, 0xa5, 0xde, 0x60, 0x4e, 0x59, 0xf4, 0xaf, 0x09, 0xe5, 0x1a, 0x38, 0x55, 0xdf, 0x58, + 0xa8, 0x97, 0xd4, 0xca, 0x3a, 0x49, 0x57, 0xcb, 0xd5, 0xf2, 0x79, 0xf6, 0x75, 0x12, 0xbd, 0xa7, + 0x00, 0xd3, 0xee, 0x04, 0xa0, 0x4e, 0xe7, 0x05, 0xe8, 0x6b, 0x59, 0x98, 0x56, 0xb1, 0x6d, 0x76, + 0xf6, 0xc8, 0x1c, 0x61, 0x5c, 0x53, 0x8f, 0x6f, 0xc8, 0xa2, 0xe7, 0xb7, 0x43, 0xcc, 0xce, 0x87, + 0x18, 0x8d, 0x9e, 0x68, 0x6a, 0x7b, 0x9a, 0xde, 0xd1, 0x2e, 0xb0, 0xae, 0x66, 0x52, 0x0d, 0x12, + 0x94, 0x79, 0x50, 0xcc, 0x4b, 0x06, 0xb6, 0xea, 0xad, 0x4b, 0x65, 0x67, 0xbb, 0xd8, 0x6e, 0x5b, + 0xd8, 0xb6, 0xd9, 0xea, 0x45, 0x9f, 0x2f, 0xca, 0x8d, 0x70, 0x94, 0xa4, 0x86, 0x32, 0x53, 0x07, + 0x99, 0xde, 0x64, 0x3f, 0x67, 0xd1, 0xb8, 0xec, 0xe5, 0xcc, 0x85, 0x72, 0x06, 0xc9, 0xe1, 0xe3, + 0x12, 0x79, 0xfe, 0x94, 0xce, 0x19, 0x98, 0x36, 0xb4, 0x1d, 0x5c, 0x7e, 0xb8, 0xab, 0x5b, 0xd8, + 0x26, 0x8e, 0x31, 0xb2, 0x1a, 0x4e, 0x42, 0xef, 0x13, 0x3a, 0x6f, 0x2e, 0x26, 0xb1, 0x64, 0xba, + 0xbf, 0x3c, 0x84, 0xea, 0xf7, 0xe9, 0x67, 0x64, 0xf4, 0x1e, 0x19, 0x66, 0x18, 0x53, 0x45, 0xe3, + 0x72, 0xa5, 0x8d, 0xae, 0xe5, 0x8c, 0x5f, 0xcd, 0x4d, 0xf3, 0x8c, 0x5f, 0xf2, 0x82, 0x7e, 0x56, + 0x16, 0x75, 0x77, 0xee, 0x53, 0x71, 0x52, 0x46, 0xb4, 0xe3, 0xe8, 0xa6, 0xb9, 0xcb, 0x1c, 0x55, + 0x27, 0x55, 0xfa, 0x92, 0xe6, 0xa2, 0x1e, 0xfa, 0x03, 0x21, 0x67, 0x6a, 0xc1, 0x6a, 0x1c, 0x12, + 0x80, 0x1f, 0x91, 0x61, 0x8e, 0x71, 0x55, 0x67, 0xe7, 0x7c, 0x84, 0x0e, 0xbc, 0xfd, 0x9c, 0xb0, + 0x21, 0xd8, 0xa7, 0xfe, 0xac, 0xa4, 0xc7, 0x0d, 0x90, 0x1f, 0x10, 0x0a, 0x8e, 0x26, 0x5c, 0x91, + 0x43, 0x82, 0xf2, 0x2d, 0x59, 0x98, 0xde, 0xb0, 0xb1, 0xc5, 0xfc, 0xf6, 0xd1, 0xab, 0xb2, 0x20, + 0x2f, 0x63, 0x6e, 0x23, 0xf5, 0x45, 0xc2, 0x1e, 0xbe, 0xe1, 0xca, 0x86, 0x88, 0xba, 0x36, 0x52, + 0x04, 0x6c, 0x37, 0xc0, 0x1c, 0x15, 0x69, 0xd1, 0x71, 0x5c, 0x23, 0xd1, 0xf3, 0xa6, 0xed, 0x49, + 0x1d, 0xc5, 0x56, 0x11, 0x29, 0xcb, 0xcd, 0x52, 0x72, 0x79, 0x5a, 0xc5, 0x9b, 0x74, 0x3e, 0x9b, + 0x55, 0x7b, 0x52, 0x95, 0x5b, 0xe1, 0x0a, 0xb3, 0x8b, 0xe9, 0xf9, 0x95, 0x50, 0xe6, 0x1c, 0xc9, + 0xdc, 0xef, 0x13, 0xfa, 0x9a, 0x90, 0xaf, 0xae, 0xb8, 0x74, 0x92, 0xe9, 0x42, 0x77, 0x34, 0x26, + 0xc9, 0x71, 0x28, 0xb8, 0x39, 0xc8, 0xfe, 0x8b, 0x5a, 0xae, 0xd7, 0x56, 0xcf, 0x95, 0xfb, 0x2f, + 0x63, 0xe4, 0xd0, 0xf3, 0x64, 0x98, 0x5a, 0xb0, 0x4c, 0xad, 0xdd, 0xd2, 0x6c, 0x07, 0x7d, 0x4b, + 0x82, 0x99, 0x75, 0xed, 0x72, 0xc7, 0xd4, 0xda, 0xc4, 0xbf, 0xbf, 0xa7, 0x2f, 0xe8, 0xd2, 0x4f, + 0x5e, 0x5f, 0xc0, 0x5e, 0xf9, 0x83, 0x81, 0xfe, 0xd1, 0xbd, 0x8c, 0xc8, 0x85, 0x9a, 0xfe, 0x36, + 0x9f, 0xd4, 0x2f, 0x58, 0xa9, 0xc7, 0xd7, 0x7c, 0x98, 0xa7, 0x08, 0x8b, 0xf2, 0x3d, 0x62, 0xe1, + 0x47, 0x45, 0x48, 0x1e, 0xce, 0xae, 0xfc, 0xf3, 0x27, 0x21, 0xbf, 0x88, 0x89, 0x15, 0xf7, 0x3f, + 0x24, 0x98, 0xa8, 0x63, 0x87, 0x58, 0x70, 0x77, 0x70, 0x9e, 0xc2, 0x6d, 0x92, 0x21, 0x70, 0x62, + 0xf7, 0xde, 0xdd, 0xc9, 0x7a, 0xe8, 0xbc, 0x35, 0x79, 0x4e, 0xe0, 0x91, 0x48, 0xcb, 0x9d, 0x67, + 0x65, 0x1e, 0xc8, 0x23, 0x31, 0x96, 0x54, 0xfa, 0xbe, 0x56, 0x6f, 0x93, 0x98, 0x6b, 0x55, 0xa8, + 0xd7, 0xfb, 0x8d, 0xb0, 0x7e, 0xc6, 0x7a, 0x9b, 0x31, 0xe6, 0x63, 0x9c, 0xa3, 0x9e, 0x0a, 0x13, + 0x54, 0xe6, 0xde, 0x7c, 0xb4, 0xd7, 0x4f, 0x81, 0x92, 0x20, 0x67, 0xaf, 0xbd, 0x9c, 0x82, 0x2e, + 0x6a, 0xd1, 0x85, 0x8f, 0x25, 0x06, 0xc1, 0x4c, 0x15, 0x3b, 0x97, 0x4c, 0xeb, 0x62, 0xdd, 0xd1, + 0x1c, 0x8c, 0xfe, 0x55, 0x02, 0xb9, 0x8e, 0x9d, 0x70, 0xf4, 0x93, 0x2a, 0x1c, 0xa3, 0x15, 0x62, + 0x19, 0x49, 0xff, 0x4d, 0x2b, 0x72, 0xa6, 0xaf, 0x10, 0x42, 0xf9, 0xd4, 0xfd, 0xbf, 0xa2, 0x5f, + 0xee, 0x1b, 0xf4, 0x49, 0xea, 0x33, 0x69, 0x60, 0x92, 0x09, 0x33, 0xe8, 0x2a, 0x58, 0x84, 0x9e, + 0xbe, 0x57, 0xc8, 0xac, 0x16, 0xa3, 0x79, 0x38, 0x5d, 0xc1, 0x07, 0xae, 0x82, 0x6c, 0x69, 0x5b, + 0x73, 0xd0, 0x5b, 0x65, 0x80, 0x62, 0xbb, 0xbd, 0x46, 0x7d, 0xc0, 0xc3, 0x0e, 0x69, 0x67, 0x61, + 0xa6, 0xb5, 0xad, 0x05, 0x77, 0x9b, 0xd0, 0xfe, 0x80, 0x4b, 0x53, 0x9e, 0x16, 0x38, 0x93, 0x53, + 0xa9, 0xa2, 0x1e, 0x98, 0xdc, 0x32, 0x18, 0x6d, 0xdf, 0xd1, 0x9c, 0x0f, 0x85, 0x19, 0x7b, 0x84, + 0xce, 0xfd, 0x7d, 0x3e, 0x60, 0x2f, 0x7a, 0x0e, 0xc7, 0x48, 0xfb, 0x07, 0x6c, 0x82, 0x84, 0x84, + 0x27, 0xbd, 0xc5, 0x02, 0x7a, 0xc4, 0xf3, 0x35, 0x96, 0xd0, 0xb5, 0x4a, 0xb9, 0xad, 0x7b, 0xa2, + 0x65, 0x01, 0xb3, 0xd0, 0x0b, 0x33, 0xc9, 0xe0, 0x8b, 0x17, 0xdc, 0x7d, 0x30, 0x8b, 0xdb, 0xba, + 0x83, 0xbd, 0x5a, 0x32, 0x01, 0xc6, 0x41, 0xcc, 0xff, 0x80, 0x9e, 0x2b, 0x1c, 0x74, 0x8d, 0x08, + 0x74, 0x7f, 0x8d, 0x22, 0xda, 0x9f, 0x58, 0x18, 0x35, 0x31, 0x9a, 0xe9, 0x83, 0xf5, 0x53, 0x32, + 0x9c, 0x68, 0x98, 0x5b, 0x5b, 0x1d, 0xec, 0x89, 0x09, 0x53, 0xef, 0x4c, 0xa4, 0x8d, 0x12, 0x2e, + 0xb2, 0x13, 0x64, 0x3e, 0xa4, 0xfb, 0x47, 0xc9, 0xdc, 0x17, 0xfe, 0xc4, 0x54, 0xec, 0x2c, 0x8a, + 0x88, 0xab, 0x2f, 0x9f, 0x11, 0x28, 0x88, 0x05, 0x7c, 0x16, 0x26, 0x9b, 0x3e, 0x10, 0x9f, 0x93, + 0x60, 0x96, 0xde, 0x5c, 0xe9, 0x29, 0xe8, 0x03, 0x23, 0x04, 0x00, 0x7d, 0x2b, 0x23, 0xea, 0x67, + 0x4b, 0x64, 0xc2, 0x71, 0x12, 0x21, 0x62, 0xb1, 0xa0, 0x2a, 0x03, 0xc9, 0xa5, 0x2f, 0xda, 0x3f, + 0x91, 0x61, 0x7a, 0x19, 0x7b, 0x2d, 0xcd, 0x4e, 0xdc, 0x13, 0x9d, 0x85, 0x19, 0x72, 0x7d, 0x5b, + 0x8d, 0x1d, 0x93, 0xa4, 0xab, 0x66, 0x5c, 0x9a, 0x72, 0x3d, 0xcc, 0x5e, 0xc0, 0x9b, 0xa6, 0x85, + 0x6b, 0xdc, 0x59, 0x4a, 0x3e, 0x31, 0x22, 0x3c, 0x1d, 0x17, 0x07, 0x6d, 0x81, 0xc7, 0xe6, 0xe6, + 0xfd, 0xc2, 0x0c, 0x55, 0x25, 0x62, 0xcc, 0x79, 0x3a, 0x4c, 0x32, 0xe4, 0x3d, 0x33, 0x2d, 0xae, + 0x5f, 0xf4, 0xf3, 0xa2, 0xd7, 0xf8, 0x88, 0x96, 0x39, 0x44, 0x6f, 0x4b, 0xc2, 0xc4, 0x58, 0xee, + 0x77, 0x2f, 0x84, 0xca, 0x5f, 0xb8, 0x5c, 0x69, 0xdb, 0x68, 0x2d, 0x19, 0xa6, 0xa7, 0x01, 0xfc, + 0xc6, 0xe1, 0x85, 0xb5, 0x08, 0xa5, 0xf0, 0x91, 0xeb, 0x63, 0x0f, 0xea, 0xf5, 0x8a, 0x83, 0xb0, + 0x33, 0x62, 0x60, 0xc4, 0x0e, 0xf8, 0x89, 0x70, 0x92, 0x3e, 0x3a, 0x1f, 0x97, 0xe1, 0x84, 0x7f, + 0xfe, 0x68, 0x55, 0xb3, 0x83, 0x76, 0x57, 0x4a, 0x06, 0x11, 0x77, 0xe0, 0xc3, 0x6f, 0x2c, 0x5f, + 0x4f, 0x36, 0x66, 0xf4, 0xe5, 0x64, 0xb4, 0xe8, 0x28, 0x37, 0xc3, 0x31, 0x63, 0x77, 0xc7, 0x97, + 0x3a, 0x69, 0xf1, 0xac, 0x85, 0xef, 0xff, 0x90, 0x64, 0x64, 0x12, 0x61, 0x7e, 0x2c, 0x73, 0x4a, + 0xee, 0x48, 0xd7, 0x53, 0x12, 0xc1, 0x88, 0xfe, 0x39, 0x93, 0xa8, 0x77, 0x1b, 0x7c, 0xe6, 0x2b, + 0x41, 0x2f, 0x75, 0x88, 0x07, 0xbe, 0xce, 0x4e, 0x40, 0xae, 0xbc, 0xd3, 0x75, 0x2e, 0x9f, 0x7d, + 0x22, 0xcc, 0xd6, 0x1d, 0x0b, 0x6b, 0x3b, 0xa1, 0x9d, 0x01, 0xc7, 0xbc, 0x88, 0x0d, 0x6f, 0x67, + 0x80, 0xbc, 0xdc, 0x79, 0x07, 0x4c, 0x18, 0x66, 0x53, 0xdb, 0x75, 0xb6, 0x95, 0x6b, 0xf7, 0x1d, + 0xa9, 0x67, 0xe0, 0xd7, 0x58, 0x0c, 0xa3, 0x2f, 0xde, 0x45, 0xd6, 0x86, 0xf3, 0x86, 0x59, 0xdc, + 0x75, 0xb6, 0x17, 0xae, 0xf9, 0xc8, 0xdf, 0x9c, 0xce, 0x7c, 0xe2, 0x6f, 0x4e, 0x67, 0xbe, 0xf0, + 0x37, 0xa7, 0x33, 0x3f, 0xf7, 0xa5, 0xd3, 0x47, 0x3e, 0xf1, 0xa5, 0xd3, 0x47, 0x3e, 0xf7, 0xa5, + 0xd3, 0x47, 0x7e, 0x58, 0xea, 0x5e, 0xb8, 0x90, 0x27, 0x54, 0x9e, 0xfa, 0xff, 0x06, 0x00, 0x00, + 0xff, 0xff, 0x07, 0xc6, 0xed, 0x93, 0x99, 0x0b, 0x02, 0x00, } func (m *Rpc) Marshal() (dAtA []byte, err error) { @@ -88924,9 +88979,9 @@ func (m *RpcObjectListExportStateFilters) MarshalToSizedBuffer(dAtA []byte) (int _ = i var l int _ = l - if m.OnlyRootBlock { + if m.RemoveBlocks { i-- - if m.OnlyRootBlock { + if m.RemoveBlocks { dAtA[i] = 1 } else { dAtA[i] = 0 @@ -88936,9 +88991,14 @@ func (m *RpcObjectListExportStateFilters) MarshalToSizedBuffer(dAtA []byte) (int } if len(m.RelationsWhiteList) > 0 { for iNdEx := len(m.RelationsWhiteList) - 1; iNdEx >= 0; iNdEx-- { - i -= len(m.RelationsWhiteList[iNdEx]) - copy(dAtA[i:], m.RelationsWhiteList[iNdEx]) - i = encodeVarintCommands(dAtA, i, uint64(len(m.RelationsWhiteList[iNdEx]))) + { + size, err := m.RelationsWhiteList[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintCommands(dAtA, i, uint64(size)) + } i-- dAtA[i] = 0xa } @@ -88946,6 +89006,43 @@ func (m *RpcObjectListExportStateFilters) MarshalToSizedBuffer(dAtA []byte) (int return len(dAtA) - i, nil } +func (m *RpcObjectListExportRelationsWhiteList) 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 *RpcObjectListExportRelationsWhiteList) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *RpcObjectListExportRelationsWhiteList) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.AllowedRelations) > 0 { + for iNdEx := len(m.AllowedRelations) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.AllowedRelations[iNdEx]) + copy(dAtA[i:], m.AllowedRelations[iNdEx]) + i = encodeVarintCommands(dAtA, i, uint64(len(m.AllowedRelations[iNdEx]))) + i-- + dAtA[i] = 0x12 + } + } + if m.Layout != 0 { + i = encodeVarintCommands(dAtA, i, uint64(m.Layout)) + i-- + dAtA[i] = 0x8 + } + return len(dAtA) - i, nil +} + func (m *RpcObjectListExportResponse) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -125468,17 +125565,35 @@ func (m *RpcObjectListExportStateFilters) Size() (n int) { var l int _ = l if len(m.RelationsWhiteList) > 0 { - for _, s := range m.RelationsWhiteList { - l = len(s) + for _, e := range m.RelationsWhiteList { + l = e.Size() n += 1 + l + sovCommands(uint64(l)) } } - if m.OnlyRootBlock { + if m.RemoveBlocks { n += 2 } return n } +func (m *RpcObjectListExportRelationsWhiteList) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Layout != 0 { + n += 1 + sovCommands(uint64(m.Layout)) + } + if len(m.AllowedRelations) > 0 { + for _, s := range m.AllowedRelations { + l = len(s) + n += 1 + l + sovCommands(uint64(l)) + } + } + return n +} + func (m *RpcObjectListExportResponse) Size() (n int) { if m == nil { return 0 @@ -179396,6 +179511,129 @@ func (m *RpcObjectListExportStateFilters) Unmarshal(dAtA []byte) error { if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field RelationsWhiteList", wireType) } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowCommands + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthCommands + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthCommands + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.RelationsWhiteList = append(m.RelationsWhiteList, &RpcObjectListExportRelationsWhiteList{}) + if err := m.RelationsWhiteList[len(m.RelationsWhiteList)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field RemoveBlocks", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowCommands + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.RemoveBlocks = bool(v != 0) + default: + iNdEx = preIndex + skippy, err := skipCommands(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthCommands + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *RpcObjectListExportRelationsWhiteList) 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 ErrIntOverflowCommands + } + 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: RelationsWhiteList: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: RelationsWhiteList: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Layout", wireType) + } + m.Layout = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowCommands + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Layout |= model.ObjectTypeLayout(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field AllowedRelations", wireType) + } var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { @@ -179422,28 +179660,8 @@ func (m *RpcObjectListExportStateFilters) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.RelationsWhiteList = append(m.RelationsWhiteList, string(dAtA[iNdEx:postIndex])) + m.AllowedRelations = append(m.AllowedRelations, string(dAtA[iNdEx:postIndex])) iNdEx = postIndex - case 2: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field OnlyRootBlock", wireType) - } - var v int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowCommands - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - v |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - m.OnlyRootBlock = bool(v != 0) default: iNdEx = preIndex skippy, err := skipCommands(dAtA[iNdEx:]) diff --git a/pb/protos/commands.proto b/pb/protos/commands.proto index 6151d7c13..f7f42efdd 100644 --- a/pb/protos/commands.proto +++ b/pb/protos/commands.proto @@ -2784,10 +2784,13 @@ message Rpc { bool noProgress = 11; StateFilters linksStateFilters = 12; } - message StateFilters { - repeated string relationsWhiteList = 1; - bool onlyRootBlock = 2; + repeated RelationsWhiteList relationsWhiteList = 1; + bool removeBlocks = 2; + } + message RelationsWhiteList { + anytype.model.ObjectType.Layout layout = 1; + repeated string allowedRelations = 2; } message Response { Error error = 1; From 640cb218c4a76d712f7e70328de180b9bb279bd3 Mon Sep 17 00:00:00 2001 From: AnastasiaShemyakinskaya Date: Fri, 24 Jan 2025 16:24:58 +0100 Subject: [PATCH 154/195] GO-4889: fix conflicts Signed-off-by: AnastasiaShemyakinskaya --- docs/proto.md | 159 +- pb/commands.pb.go | 3829 ++++++++++++++++++++++++++++++--------------- 2 files changed, 2725 insertions(+), 1263 deletions(-) diff --git a/docs/proto.md b/docs/proto.md index 2fae09a17..d90295a09 100644 --- a/docs/proto.md +++ b/docs/proto.md @@ -50,6 +50,10 @@ - [Empty](#anytype-Empty) - [Rpc](#anytype-Rpc) - [Rpc.Account](#anytype-Rpc-Account) + - [Rpc.Account.ChangeJsonApiAddr](#anytype-Rpc-Account-ChangeJsonApiAddr) + - [Rpc.Account.ChangeJsonApiAddr.Request](#anytype-Rpc-Account-ChangeJsonApiAddr-Request) + - [Rpc.Account.ChangeJsonApiAddr.Response](#anytype-Rpc-Account-ChangeJsonApiAddr-Response) + - [Rpc.Account.ChangeJsonApiAddr.Response.Error](#anytype-Rpc-Account-ChangeJsonApiAddr-Response-Error) - [Rpc.Account.ChangeNetworkConfigAndRestart](#anytype-Rpc-Account-ChangeNetworkConfigAndRestart) - [Rpc.Account.ChangeNetworkConfigAndRestart.Request](#anytype-Rpc-Account-ChangeNetworkConfigAndRestart-Request) - [Rpc.Account.ChangeNetworkConfigAndRestart.Response](#anytype-Rpc-Account-ChangeNetworkConfigAndRestart-Response) @@ -911,9 +915,11 @@ - [Rpc.Object.ListDuplicate.Response](#anytype-Rpc-Object-ListDuplicate-Response) - [Rpc.Object.ListDuplicate.Response.Error](#anytype-Rpc-Object-ListDuplicate-Response-Error) - [Rpc.Object.ListExport](#anytype-Rpc-Object-ListExport) + - [Rpc.Object.ListExport.RelationsWhiteList](#anytype-Rpc-Object-ListExport-RelationsWhiteList) - [Rpc.Object.ListExport.Request](#anytype-Rpc-Object-ListExport-Request) - [Rpc.Object.ListExport.Response](#anytype-Rpc-Object-ListExport-Response) - [Rpc.Object.ListExport.Response.Error](#anytype-Rpc-Object-ListExport-Response-Error) + - [Rpc.Object.ListExport.StateFilters](#anytype-Rpc-Object-ListExport-StateFilters) - [Rpc.Object.ListModifyDetailValues](#anytype-Rpc-Object-ListModifyDetailValues) - [Rpc.Object.ListModifyDetailValues.Request](#anytype-Rpc-Object-ListModifyDetailValues-Request) - [Rpc.Object.ListModifyDetailValues.Request.Operation](#anytype-Rpc-Object-ListModifyDetailValues-Request-Operation) @@ -1274,6 +1280,7 @@ - [Rpc.Workspace.SetInfo.Response.Error](#anytype-Rpc-Workspace-SetInfo-Response-Error) - [StreamRequest](#anytype-StreamRequest) + - [Rpc.Account.ChangeJsonApiAddr.Response.Error.Code](#anytype-Rpc-Account-ChangeJsonApiAddr-Response-Error-Code) - [Rpc.Account.ChangeNetworkConfigAndRestart.Response.Error.Code](#anytype-Rpc-Account-ChangeNetworkConfigAndRestart-Response-Error-Code) - [Rpc.Account.ConfigUpdate.Response.Error.Code](#anytype-Rpc-Account-ConfigUpdate-Response-Error-Code) - [Rpc.Account.ConfigUpdate.Timezones](#anytype-Rpc-Account-ConfigUpdate-Timezones) @@ -1584,6 +1591,7 @@ - [Event.Account.Details](#anytype-Event-Account-Details) - [Event.Account.LinkChallenge](#anytype-Event-Account-LinkChallenge) - [Event.Account.LinkChallenge.ClientInfo](#anytype-Event-Account-LinkChallenge-ClientInfo) + - [Event.Account.LinkChallengeHide](#anytype-Event-Account-LinkChallengeHide) - [Event.Account.Show](#anytype-Event-Account-Show) - [Event.Account.Update](#anytype-Event-Account-Update) - [Event.Block](#anytype-Event-Block) @@ -1811,6 +1819,7 @@ - [pkg/lib/pb/model/protos/models.proto](#pkg_lib_pb_model_protos_models-proto) - [Account](#anytype-model-Account) + - [Account.Auth](#anytype-model-Account-Auth) - [Account.Config](#anytype-model-Account-Config) - [Account.Info](#anytype-model-Account-Info) - [Account.Status](#anytype-model-Account-Status) @@ -1909,6 +1918,7 @@ - [SmartBlockSnapshotBase](#anytype-model-SmartBlockSnapshotBase) - [SpaceObjectHeader](#anytype-model-SpaceObjectHeader) + - [Account.Auth.LocalApiScope](#anytype-model-Account-Auth-LocalApiScope) - [Account.StatusType](#anytype-model-Account-StatusType) - [Block.Align](#anytype-model-Block-Align) - [Block.Content.Bookmark.State](#anytype-model-Block-Content-Bookmark-State) @@ -2018,6 +2028,7 @@ | AccountRevertDeletion | [Rpc.Account.RevertDeletion.Request](#anytype-Rpc-Account-RevertDeletion-Request) | [Rpc.Account.RevertDeletion.Response](#anytype-Rpc-Account-RevertDeletion-Response) | | | AccountSelect | [Rpc.Account.Select.Request](#anytype-Rpc-Account-Select-Request) | [Rpc.Account.Select.Response](#anytype-Rpc-Account-Select-Response) | | | AccountEnableLocalNetworkSync | [Rpc.Account.EnableLocalNetworkSync.Request](#anytype-Rpc-Account-EnableLocalNetworkSync-Request) | [Rpc.Account.EnableLocalNetworkSync.Response](#anytype-Rpc-Account-EnableLocalNetworkSync-Response) | | +| AccountChangeJsonApiAddr | [Rpc.Account.ChangeJsonApiAddr.Request](#anytype-Rpc-Account-ChangeJsonApiAddr-Request) | [Rpc.Account.ChangeJsonApiAddr.Response](#anytype-Rpc-Account-ChangeJsonApiAddr-Response) | | | AccountStop | [Rpc.Account.Stop.Request](#anytype-Rpc-Account-Stop-Request) | [Rpc.Account.Stop.Response](#anytype-Rpc-Account-Stop-Response) | | | AccountMove | [Rpc.Account.Move.Request](#anytype-Rpc-Account-Move-Request) | [Rpc.Account.Move.Response](#anytype-Rpc-Account-Move-Response) | | | AccountConfigUpdate | [Rpc.Account.ConfigUpdate.Request](#anytype-Rpc-Account-ConfigUpdate-Request) | [Rpc.Account.ConfigUpdate.Response](#anytype-Rpc-Account-ConfigUpdate-Response) | | @@ -2940,6 +2951,62 @@ Response – message from a middleware. + + +### Rpc.Account.ChangeJsonApiAddr + + + + + + + + + +### Rpc.Account.ChangeJsonApiAddr.Request + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| listenAddr | [string](#string) | | make sure to use 127.0.0.1:x to not listen on all interfaces; recommended value is 127.0.0.1:31009 | + + + + + + + + +### Rpc.Account.ChangeJsonApiAddr.Response + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| error | [Rpc.Account.ChangeJsonApiAddr.Response.Error](#anytype-Rpc-Account-ChangeJsonApiAddr-Response-Error) | | | + + + + + + + + +### Rpc.Account.ChangeJsonApiAddr.Response.Error + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| code | [Rpc.Account.ChangeJsonApiAddr.Response.Error.Code](#anytype-Rpc-Account-ChangeJsonApiAddr-Response-Error-Code) | | | +| description | [string](#string) | | | + + + + + + ### Rpc.Account.ChangeNetworkConfigAndRestart @@ -3098,6 +3165,7 @@ Front end to middleware request-to-create-an account | networkMode | [Rpc.Account.NetworkMode](#anytype-Rpc-Account-NetworkMode) | | optional, default is DefaultConfig | | networkCustomConfigFilePath | [string](#string) | | config path for the custom network mode } | | preferYamuxTransport | [bool](#bool) | | optional, default is false, recommended in case of problems with QUIC transport | +| jsonApiListenAddr | [string](#string) | | optional, if empty json api will not be started; 127.0.0.1:31009 should be the default one | @@ -3299,6 +3367,7 @@ TODO: Remove this request if we do not need it, GO-1926 | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | | appName | [string](#string) | | just for info, not secure to rely on | +| scope | [model.Account.Auth.LocalApiScope](#anytype-model-Account-Auth-LocalApiScope) | | | @@ -3641,6 +3710,7 @@ User can select an account from those, that came with an AccountAdd events | networkMode | [Rpc.Account.NetworkMode](#anytype-Rpc-Account-NetworkMode) | | optional, default is DefaultConfig | | networkCustomConfigFilePath | [string](#string) | | config path for the custom network mode | | preferYamuxTransport | [bool](#bool) | | optional, default is false, recommended in case of problems with QUIC transport | +| jsonApiListenAddr | [string](#string) | | optional, if empty json api will not be started; 127.0.0.1:31009 should be the default one | @@ -15468,6 +15538,22 @@ Deletes the object, keys from the local store and unsubscribe from remote change + + +### Rpc.Object.ListExport.RelationsWhiteList + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| layout | [model.ObjectType.Layout](#anytype-model-ObjectType-Layout) | | | +| allowedRelations | [string](#string) | repeated | | + + + + + + ### Rpc.Object.ListExport.Request @@ -15486,7 +15572,7 @@ Deletes the object, keys from the local store and unsubscribe from remote change | isJson | [bool](#bool) | | for protobuf export | | includeArchived | [bool](#bool) | | for migration | | noProgress | [bool](#bool) | | for integrations like raycast and web publishing | -| includeDependentDetails | [bool](#bool) | | for web publising, just add details of dependent objects in result snapshot | +| linksStateFilters | [Rpc.Object.ListExport.StateFilters](#anytype-Rpc-Object-ListExport-StateFilters) | | | @@ -15527,6 +15613,22 @@ Deletes the object, keys from the local store and unsubscribe from remote change + + +### Rpc.Object.ListExport.StateFilters + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| relationsWhiteList | [Rpc.Object.ListExport.RelationsWhiteList](#anytype-Rpc-Object-ListExport-RelationsWhiteList) | repeated | | +| removeBlocks | [bool](#bool) | | | + + + + + + ### Rpc.Object.ListModifyDetailValues @@ -20688,6 +20790,20 @@ Middleware-to-front-end response, that can contain a NULL error or a non-NULL er + + +### Rpc.Account.ChangeJsonApiAddr.Response.Error.Code + + +| Name | Number | Description | +| ---- | ------ | ----------- | +| NULL | 0 | | +| UNKNOWN_ERROR | 1 | | +| BAD_INPUT | 2 | | +| ACCOUNT_IS_NOT_RUNNING | 4 | | + + + ### Rpc.Account.ChangeNetworkConfigAndRestart.Response.Error.Code @@ -24949,6 +25065,7 @@ Event – type of message, that could be sent from a middleware to the correspon | ----- | ---- | ----- | ----------- | | challenge | [string](#string) | | | | clientInfo | [Event.Account.LinkChallenge.ClientInfo](#anytype-Event-Account-LinkChallenge-ClientInfo) | | | +| scope | [model.Account.Auth.LocalApiScope](#anytype-model-Account-Auth-LocalApiScope) | | | @@ -24972,6 +25089,21 @@ Event – type of message, that could be sent from a middleware to the correspon + + +### Event.Account.LinkChallengeHide + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| challenge | [string](#string) | | verify code before hiding to protect from MITM attacks | + + + + + + ### Event.Account.Show @@ -27254,6 +27386,7 @@ Precondition: user A opened a block | accountConfigUpdate | [Event.Account.Config.Update](#anytype-Event-Account-Config-Update) | | | | accountUpdate | [Event.Account.Update](#anytype-Event-Account-Update) | | | | accountLinkChallenge | [Event.Account.LinkChallenge](#anytype-Event-Account-LinkChallenge) | | | +| accountLinkChallengeHide | [Event.Account.LinkChallengeHide](#anytype-Event-Account-LinkChallengeHide) | | | | objectDetailsSet | [Event.Object.Details.Set](#anytype-Event-Object-Details-Set) | | | | objectDetailsAmend | [Event.Object.Details.Amend](#anytype-Event-Object-Details-Amend) | | | | objectDetailsUnset | [Event.Object.Details.Unset](#anytype-Event-Object-Details-Unset) | | | @@ -28510,6 +28643,16 @@ Contains basic information about a user account + + +### Account.Auth + + + + + + + ### Account.Config @@ -30225,6 +30368,19 @@ stored | + + +### Account.Auth.LocalApiScope + + +| Name | Number | Description | +| ---- | ------ | ----------- | +| Limited | 0 | Used in WebClipper; AccountSelect(to be deprecated), ObjectSearch, ObjectShow, ObjectCreate, ObjectCreateFromURL, BlockPreview, BlockPaste, BroadcastPayloadEvent | +| JsonAPI | 1 | JSON API only, no direct grpc api calls allowed | +| Full | 2 | Full access, not available via LocalLink | + + + ### Account.StatusType @@ -30947,6 +31103,7 @@ Look https://github.com/golang/protobuf/issues/1135 for more information. | usecase | 6 | | | builtin | 7 | | | bookmark | 8 | | +| api | 9 | | diff --git a/pb/commands.pb.go b/pb/commands.pb.go index 19779b4e2..fd9ebbdaf 100644 --- a/pb/commands.pb.go +++ b/pb/commands.pb.go @@ -1481,6 +1481,37 @@ func (RpcAccountEnableLocalNetworkSyncResponseErrorCode) EnumDescriptor() ([]byt return fileDescriptor_8261c968b2e6f45c, []int{0, 3, 11, 1, 0, 0} } +type RpcAccountChangeJsonApiAddrResponseErrorCode int32 + +const ( + RpcAccountChangeJsonApiAddrResponseError_NULL RpcAccountChangeJsonApiAddrResponseErrorCode = 0 + RpcAccountChangeJsonApiAddrResponseError_UNKNOWN_ERROR RpcAccountChangeJsonApiAddrResponseErrorCode = 1 + RpcAccountChangeJsonApiAddrResponseError_BAD_INPUT RpcAccountChangeJsonApiAddrResponseErrorCode = 2 + RpcAccountChangeJsonApiAddrResponseError_ACCOUNT_IS_NOT_RUNNING RpcAccountChangeJsonApiAddrResponseErrorCode = 4 +) + +var RpcAccountChangeJsonApiAddrResponseErrorCode_name = map[int32]string{ + 0: "NULL", + 1: "UNKNOWN_ERROR", + 2: "BAD_INPUT", + 4: "ACCOUNT_IS_NOT_RUNNING", +} + +var RpcAccountChangeJsonApiAddrResponseErrorCode_value = map[string]int32{ + "NULL": 0, + "UNKNOWN_ERROR": 1, + "BAD_INPUT": 2, + "ACCOUNT_IS_NOT_RUNNING": 4, +} + +func (x RpcAccountChangeJsonApiAddrResponseErrorCode) String() string { + return proto.EnumName(RpcAccountChangeJsonApiAddrResponseErrorCode_name, int32(x)) +} + +func (RpcAccountChangeJsonApiAddrResponseErrorCode) EnumDescriptor() ([]byte, []int) { + return fileDescriptor_8261c968b2e6f45c, []int{0, 3, 12, 1, 0, 0} +} + type RpcAccountChangeNetworkConfigAndRestartResponseErrorCode int32 const ( @@ -1521,7 +1552,7 @@ func (x RpcAccountChangeNetworkConfigAndRestartResponseErrorCode) String() strin } func (RpcAccountChangeNetworkConfigAndRestartResponseErrorCode) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 3, 12, 1, 0, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 3, 13, 1, 0, 0} } type RpcAccountLocalLinkNewChallengeResponseErrorCode int32 @@ -1555,7 +1586,7 @@ func (x RpcAccountLocalLinkNewChallengeResponseErrorCode) String() string { } func (RpcAccountLocalLinkNewChallengeResponseErrorCode) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 3, 13, 0, 1, 0, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 3, 14, 0, 1, 0, 0} } type RpcAccountLocalLinkSolveChallengeResponseErrorCode int32 @@ -1595,7 +1626,7 @@ func (x RpcAccountLocalLinkSolveChallengeResponseErrorCode) String() string { } func (RpcAccountLocalLinkSolveChallengeResponseErrorCode) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 3, 13, 1, 1, 0, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 3, 14, 1, 1, 0, 0} } type RpcWorkspaceGetCurrentResponseErrorCode int32 @@ -3437,7 +3468,7 @@ func (x RpcObjectListExportResponseErrorCode) String() string { } func (RpcObjectListExportResponseErrorCode) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 6, 47, 1, 0, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 6, 47, 3, 0, 0} } type RpcObjectImportRequestMode int32 @@ -14050,6 +14081,7 @@ type RpcAccountCreateRequest struct { NetworkMode RpcAccountNetworkMode `protobuf:"varint,6,opt,name=networkMode,proto3,enum=anytype.RpcAccountNetworkMode" json:"networkMode,omitempty"` NetworkCustomConfigFilePath string `protobuf:"bytes,7,opt,name=networkCustomConfigFilePath,proto3" json:"networkCustomConfigFilePath,omitempty"` PreferYamuxTransport bool `protobuf:"varint,8,opt,name=preferYamuxTransport,proto3" json:"preferYamuxTransport,omitempty"` + JsonApiListenAddr string `protobuf:"bytes,9,opt,name=jsonApiListenAddr,proto3" json:"jsonApiListenAddr,omitempty"` } func (m *RpcAccountCreateRequest) Reset() { *m = RpcAccountCreateRequest{} } @@ -14160,6 +14192,13 @@ func (m *RpcAccountCreateRequest) GetPreferYamuxTransport() bool { return false } +func (m *RpcAccountCreateRequest) GetJsonApiListenAddr() string { + if m != nil { + return m.JsonApiListenAddr + } + return "" +} + // XXX_OneofWrappers is for the internal use of the proto package. func (*RpcAccountCreateRequest) XXX_OneofWrappers() []interface{} { return []interface{}{ @@ -14852,6 +14891,7 @@ type RpcAccountSelectRequest struct { NetworkMode RpcAccountNetworkMode `protobuf:"varint,4,opt,name=networkMode,proto3,enum=anytype.RpcAccountNetworkMode" json:"networkMode,omitempty"` NetworkCustomConfigFilePath string `protobuf:"bytes,5,opt,name=networkCustomConfigFilePath,proto3" json:"networkCustomConfigFilePath,omitempty"` PreferYamuxTransport bool `protobuf:"varint,6,opt,name=preferYamuxTransport,proto3" json:"preferYamuxTransport,omitempty"` + JsonApiListenAddr string `protobuf:"bytes,7,opt,name=jsonApiListenAddr,proto3" json:"jsonApiListenAddr,omitempty"` } func (m *RpcAccountSelectRequest) Reset() { *m = RpcAccountSelectRequest{} } @@ -14929,6 +14969,13 @@ func (m *RpcAccountSelectRequest) GetPreferYamuxTransport() bool { return false } +func (m *RpcAccountSelectRequest) GetJsonApiListenAddr() string { + if m != nil { + return m.JsonApiListenAddr + } + return "" +} + // * // Middleware-to-front-end response for an account select request, that can contain a NULL error and selected account or a non-NULL error and an empty account type RpcAccountSelectResponse struct { @@ -16079,6 +16126,184 @@ func (m *RpcAccountEnableLocalNetworkSyncResponseError) GetDescription() string return "" } +type RpcAccountChangeJsonApiAddr struct { +} + +func (m *RpcAccountChangeJsonApiAddr) Reset() { *m = RpcAccountChangeJsonApiAddr{} } +func (m *RpcAccountChangeJsonApiAddr) String() string { return proto.CompactTextString(m) } +func (*RpcAccountChangeJsonApiAddr) ProtoMessage() {} +func (*RpcAccountChangeJsonApiAddr) Descriptor() ([]byte, []int) { + return fileDescriptor_8261c968b2e6f45c, []int{0, 3, 12} +} +func (m *RpcAccountChangeJsonApiAddr) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *RpcAccountChangeJsonApiAddr) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_RpcAccountChangeJsonApiAddr.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 *RpcAccountChangeJsonApiAddr) XXX_Merge(src proto.Message) { + xxx_messageInfo_RpcAccountChangeJsonApiAddr.Merge(m, src) +} +func (m *RpcAccountChangeJsonApiAddr) XXX_Size() int { + return m.Size() +} +func (m *RpcAccountChangeJsonApiAddr) XXX_DiscardUnknown() { + xxx_messageInfo_RpcAccountChangeJsonApiAddr.DiscardUnknown(m) +} + +var xxx_messageInfo_RpcAccountChangeJsonApiAddr proto.InternalMessageInfo + +type RpcAccountChangeJsonApiAddrRequest struct { + ListenAddr string `protobuf:"bytes,1,opt,name=listenAddr,proto3" json:"listenAddr,omitempty"` +} + +func (m *RpcAccountChangeJsonApiAddrRequest) Reset() { *m = RpcAccountChangeJsonApiAddrRequest{} } +func (m *RpcAccountChangeJsonApiAddrRequest) String() string { return proto.CompactTextString(m) } +func (*RpcAccountChangeJsonApiAddrRequest) ProtoMessage() {} +func (*RpcAccountChangeJsonApiAddrRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_8261c968b2e6f45c, []int{0, 3, 12, 0} +} +func (m *RpcAccountChangeJsonApiAddrRequest) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *RpcAccountChangeJsonApiAddrRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_RpcAccountChangeJsonApiAddrRequest.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 *RpcAccountChangeJsonApiAddrRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_RpcAccountChangeJsonApiAddrRequest.Merge(m, src) +} +func (m *RpcAccountChangeJsonApiAddrRequest) XXX_Size() int { + return m.Size() +} +func (m *RpcAccountChangeJsonApiAddrRequest) XXX_DiscardUnknown() { + xxx_messageInfo_RpcAccountChangeJsonApiAddrRequest.DiscardUnknown(m) +} + +var xxx_messageInfo_RpcAccountChangeJsonApiAddrRequest proto.InternalMessageInfo + +func (m *RpcAccountChangeJsonApiAddrRequest) GetListenAddr() string { + if m != nil { + return m.ListenAddr + } + return "" +} + +type RpcAccountChangeJsonApiAddrResponse struct { + Error *RpcAccountChangeJsonApiAddrResponseError `protobuf:"bytes,2,opt,name=error,proto3" json:"error,omitempty"` +} + +func (m *RpcAccountChangeJsonApiAddrResponse) Reset() { *m = RpcAccountChangeJsonApiAddrResponse{} } +func (m *RpcAccountChangeJsonApiAddrResponse) String() string { return proto.CompactTextString(m) } +func (*RpcAccountChangeJsonApiAddrResponse) ProtoMessage() {} +func (*RpcAccountChangeJsonApiAddrResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_8261c968b2e6f45c, []int{0, 3, 12, 1} +} +func (m *RpcAccountChangeJsonApiAddrResponse) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *RpcAccountChangeJsonApiAddrResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_RpcAccountChangeJsonApiAddrResponse.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 *RpcAccountChangeJsonApiAddrResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_RpcAccountChangeJsonApiAddrResponse.Merge(m, src) +} +func (m *RpcAccountChangeJsonApiAddrResponse) XXX_Size() int { + return m.Size() +} +func (m *RpcAccountChangeJsonApiAddrResponse) XXX_DiscardUnknown() { + xxx_messageInfo_RpcAccountChangeJsonApiAddrResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_RpcAccountChangeJsonApiAddrResponse proto.InternalMessageInfo + +func (m *RpcAccountChangeJsonApiAddrResponse) GetError() *RpcAccountChangeJsonApiAddrResponseError { + if m != nil { + return m.Error + } + return nil +} + +type RpcAccountChangeJsonApiAddrResponseError struct { + Code RpcAccountChangeJsonApiAddrResponseErrorCode `protobuf:"varint,1,opt,name=code,proto3,enum=anytype.RpcAccountChangeJsonApiAddrResponseErrorCode" json:"code,omitempty"` + Description string `protobuf:"bytes,2,opt,name=description,proto3" json:"description,omitempty"` +} + +func (m *RpcAccountChangeJsonApiAddrResponseError) Reset() { + *m = RpcAccountChangeJsonApiAddrResponseError{} +} +func (m *RpcAccountChangeJsonApiAddrResponseError) String() string { return proto.CompactTextString(m) } +func (*RpcAccountChangeJsonApiAddrResponseError) ProtoMessage() {} +func (*RpcAccountChangeJsonApiAddrResponseError) Descriptor() ([]byte, []int) { + return fileDescriptor_8261c968b2e6f45c, []int{0, 3, 12, 1, 0} +} +func (m *RpcAccountChangeJsonApiAddrResponseError) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *RpcAccountChangeJsonApiAddrResponseError) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_RpcAccountChangeJsonApiAddrResponseError.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 *RpcAccountChangeJsonApiAddrResponseError) XXX_Merge(src proto.Message) { + xxx_messageInfo_RpcAccountChangeJsonApiAddrResponseError.Merge(m, src) +} +func (m *RpcAccountChangeJsonApiAddrResponseError) XXX_Size() int { + return m.Size() +} +func (m *RpcAccountChangeJsonApiAddrResponseError) XXX_DiscardUnknown() { + xxx_messageInfo_RpcAccountChangeJsonApiAddrResponseError.DiscardUnknown(m) +} + +var xxx_messageInfo_RpcAccountChangeJsonApiAddrResponseError proto.InternalMessageInfo + +func (m *RpcAccountChangeJsonApiAddrResponseError) GetCode() RpcAccountChangeJsonApiAddrResponseErrorCode { + if m != nil { + return m.Code + } + return RpcAccountChangeJsonApiAddrResponseError_NULL +} + +func (m *RpcAccountChangeJsonApiAddrResponseError) GetDescription() string { + if m != nil { + return m.Description + } + return "" +} + type RpcAccountChangeNetworkConfigAndRestart struct { } @@ -16088,7 +16313,7 @@ func (m *RpcAccountChangeNetworkConfigAndRestart) Reset() { func (m *RpcAccountChangeNetworkConfigAndRestart) String() string { return proto.CompactTextString(m) } func (*RpcAccountChangeNetworkConfigAndRestart) ProtoMessage() {} func (*RpcAccountChangeNetworkConfigAndRestart) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 3, 12} + return fileDescriptor_8261c968b2e6f45c, []int{0, 3, 13} } func (m *RpcAccountChangeNetworkConfigAndRestart) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -16130,7 +16355,7 @@ func (m *RpcAccountChangeNetworkConfigAndRestartRequest) String() string { } func (*RpcAccountChangeNetworkConfigAndRestartRequest) ProtoMessage() {} func (*RpcAccountChangeNetworkConfigAndRestartRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 3, 12, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 3, 13, 0} } func (m *RpcAccountChangeNetworkConfigAndRestartRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -16185,7 +16410,7 @@ func (m *RpcAccountChangeNetworkConfigAndRestartResponse) String() string { } func (*RpcAccountChangeNetworkConfigAndRestartResponse) ProtoMessage() {} func (*RpcAccountChangeNetworkConfigAndRestartResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 3, 12, 1} + return fileDescriptor_8261c968b2e6f45c, []int{0, 3, 13, 1} } func (m *RpcAccountChangeNetworkConfigAndRestartResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -16234,7 +16459,7 @@ func (m *RpcAccountChangeNetworkConfigAndRestartResponseError) String() string { } func (*RpcAccountChangeNetworkConfigAndRestartResponseError) ProtoMessage() {} func (*RpcAccountChangeNetworkConfigAndRestartResponseError) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 3, 12, 1, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 3, 13, 1, 0} } func (m *RpcAccountChangeNetworkConfigAndRestartResponseError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -16284,7 +16509,7 @@ func (m *RpcAccountLocalLink) Reset() { *m = RpcAccountLocalLink{} } func (m *RpcAccountLocalLink) String() string { return proto.CompactTextString(m) } func (*RpcAccountLocalLink) ProtoMessage() {} func (*RpcAccountLocalLink) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 3, 13} + return fileDescriptor_8261c968b2e6f45c, []int{0, 3, 14} } func (m *RpcAccountLocalLink) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -16320,7 +16545,7 @@ func (m *RpcAccountLocalLinkNewChallenge) Reset() { *m = RpcAccountLocal func (m *RpcAccountLocalLinkNewChallenge) String() string { return proto.CompactTextString(m) } func (*RpcAccountLocalLinkNewChallenge) ProtoMessage() {} func (*RpcAccountLocalLinkNewChallenge) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 3, 13, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 3, 14, 0} } func (m *RpcAccountLocalLinkNewChallenge) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -16350,7 +16575,8 @@ func (m *RpcAccountLocalLinkNewChallenge) XXX_DiscardUnknown() { var xxx_messageInfo_RpcAccountLocalLinkNewChallenge proto.InternalMessageInfo type RpcAccountLocalLinkNewChallengeRequest struct { - AppName string `protobuf:"bytes,1,opt,name=appName,proto3" json:"appName,omitempty"` + AppName string `protobuf:"bytes,1,opt,name=appName,proto3" json:"appName,omitempty"` + Scope model.AccountAuthLocalApiScope `protobuf:"varint,2,opt,name=scope,proto3,enum=anytype.model.AccountAuthLocalApiScope" json:"scope,omitempty"` } func (m *RpcAccountLocalLinkNewChallengeRequest) Reset() { @@ -16359,7 +16585,7 @@ func (m *RpcAccountLocalLinkNewChallengeRequest) Reset() { func (m *RpcAccountLocalLinkNewChallengeRequest) String() string { return proto.CompactTextString(m) } func (*RpcAccountLocalLinkNewChallengeRequest) ProtoMessage() {} func (*RpcAccountLocalLinkNewChallengeRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 3, 13, 0, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 3, 14, 0, 0} } func (m *RpcAccountLocalLinkNewChallengeRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -16395,6 +16621,13 @@ func (m *RpcAccountLocalLinkNewChallengeRequest) GetAppName() string { return "" } +func (m *RpcAccountLocalLinkNewChallengeRequest) GetScope() model.AccountAuthLocalApiScope { + if m != nil { + return m.Scope + } + return model.AccountAuth_Limited +} + type RpcAccountLocalLinkNewChallengeResponse struct { Error *RpcAccountLocalLinkNewChallengeResponseError `protobuf:"bytes,1,opt,name=error,proto3" json:"error,omitempty"` ChallengeId string `protobuf:"bytes,2,opt,name=challengeId,proto3" json:"challengeId,omitempty"` @@ -16406,7 +16639,7 @@ func (m *RpcAccountLocalLinkNewChallengeResponse) Reset() { func (m *RpcAccountLocalLinkNewChallengeResponse) String() string { return proto.CompactTextString(m) } func (*RpcAccountLocalLinkNewChallengeResponse) ProtoMessage() {} func (*RpcAccountLocalLinkNewChallengeResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 3, 13, 0, 1} + return fileDescriptor_8261c968b2e6f45c, []int{0, 3, 14, 0, 1} } func (m *RpcAccountLocalLinkNewChallengeResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -16462,7 +16695,7 @@ func (m *RpcAccountLocalLinkNewChallengeResponseError) String() string { } func (*RpcAccountLocalLinkNewChallengeResponseError) ProtoMessage() {} func (*RpcAccountLocalLinkNewChallengeResponseError) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 3, 13, 0, 1, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 3, 14, 0, 1, 0} } func (m *RpcAccountLocalLinkNewChallengeResponseError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -16512,7 +16745,7 @@ func (m *RpcAccountLocalLinkSolveChallenge) Reset() { *m = RpcAccountLoc func (m *RpcAccountLocalLinkSolveChallenge) String() string { return proto.CompactTextString(m) } func (*RpcAccountLocalLinkSolveChallenge) ProtoMessage() {} func (*RpcAccountLocalLinkSolveChallenge) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 3, 13, 1} + return fileDescriptor_8261c968b2e6f45c, []int{0, 3, 14, 1} } func (m *RpcAccountLocalLinkSolveChallenge) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -16552,7 +16785,7 @@ func (m *RpcAccountLocalLinkSolveChallengeRequest) Reset() { func (m *RpcAccountLocalLinkSolveChallengeRequest) String() string { return proto.CompactTextString(m) } func (*RpcAccountLocalLinkSolveChallengeRequest) ProtoMessage() {} func (*RpcAccountLocalLinkSolveChallengeRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 3, 13, 1, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 3, 14, 1, 0} } func (m *RpcAccountLocalLinkSolveChallengeRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -16609,7 +16842,7 @@ func (m *RpcAccountLocalLinkSolveChallengeResponse) String() string { } func (*RpcAccountLocalLinkSolveChallengeResponse) ProtoMessage() {} func (*RpcAccountLocalLinkSolveChallengeResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 3, 13, 1, 1} + return fileDescriptor_8261c968b2e6f45c, []int{0, 3, 14, 1, 1} } func (m *RpcAccountLocalLinkSolveChallengeResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -16672,7 +16905,7 @@ func (m *RpcAccountLocalLinkSolveChallengeResponseError) String() string { } func (*RpcAccountLocalLinkSolveChallengeResponseError) ProtoMessage() {} func (*RpcAccountLocalLinkSolveChallengeResponseError) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 3, 13, 1, 1, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 3, 14, 1, 1, 0} } func (m *RpcAccountLocalLinkSolveChallengeResponseError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -29574,9 +29807,8 @@ type RpcObjectListExportRequest struct { // for migration IncludeArchived bool `protobuf:"varint,9,opt,name=includeArchived,proto3" json:"includeArchived,omitempty"` // for integrations like raycast and web publishing - NoProgress bool `protobuf:"varint,11,opt,name=noProgress,proto3" json:"noProgress,omitempty"` - // for web publising, just add details of dependent objects in result snapshot - IncludeDependentDetails bool `protobuf:"varint,12,opt,name=includeDependentDetails,proto3" json:"includeDependentDetails,omitempty"` + NoProgress bool `protobuf:"varint,11,opt,name=noProgress,proto3" json:"noProgress,omitempty"` + LinksStateFilters *RpcObjectListExportStateFilters `protobuf:"bytes,12,opt,name=linksStateFilters,proto3" json:"linksStateFilters,omitempty"` } func (m *RpcObjectListExportRequest) Reset() { *m = RpcObjectListExportRequest{} } @@ -29682,13 +29914,117 @@ func (m *RpcObjectListExportRequest) GetNoProgress() bool { return false } -func (m *RpcObjectListExportRequest) GetIncludeDependentDetails() bool { +func (m *RpcObjectListExportRequest) GetLinksStateFilters() *RpcObjectListExportStateFilters { if m != nil { - return m.IncludeDependentDetails + return m.LinksStateFilters + } + return nil +} + +type RpcObjectListExportStateFilters struct { + RelationsWhiteList []*RpcObjectListExportRelationsWhiteList `protobuf:"bytes,1,rep,name=relationsWhiteList,proto3" json:"relationsWhiteList,omitempty"` + RemoveBlocks bool `protobuf:"varint,2,opt,name=removeBlocks,proto3" json:"removeBlocks,omitempty"` +} + +func (m *RpcObjectListExportStateFilters) Reset() { *m = RpcObjectListExportStateFilters{} } +func (m *RpcObjectListExportStateFilters) String() string { return proto.CompactTextString(m) } +func (*RpcObjectListExportStateFilters) ProtoMessage() {} +func (*RpcObjectListExportStateFilters) Descriptor() ([]byte, []int) { + return fileDescriptor_8261c968b2e6f45c, []int{0, 6, 47, 1} +} +func (m *RpcObjectListExportStateFilters) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *RpcObjectListExportStateFilters) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_RpcObjectListExportStateFilters.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 *RpcObjectListExportStateFilters) XXX_Merge(src proto.Message) { + xxx_messageInfo_RpcObjectListExportStateFilters.Merge(m, src) +} +func (m *RpcObjectListExportStateFilters) XXX_Size() int { + return m.Size() +} +func (m *RpcObjectListExportStateFilters) XXX_DiscardUnknown() { + xxx_messageInfo_RpcObjectListExportStateFilters.DiscardUnknown(m) +} + +var xxx_messageInfo_RpcObjectListExportStateFilters proto.InternalMessageInfo + +func (m *RpcObjectListExportStateFilters) GetRelationsWhiteList() []*RpcObjectListExportRelationsWhiteList { + if m != nil { + return m.RelationsWhiteList + } + return nil +} + +func (m *RpcObjectListExportStateFilters) GetRemoveBlocks() bool { + if m != nil { + return m.RemoveBlocks } return false } +type RpcObjectListExportRelationsWhiteList struct { + Layout model.ObjectTypeLayout `protobuf:"varint,1,opt,name=layout,proto3,enum=anytype.model.ObjectTypeLayout" json:"layout,omitempty"` + AllowedRelations []string `protobuf:"bytes,2,rep,name=allowedRelations,proto3" json:"allowedRelations,omitempty"` +} + +func (m *RpcObjectListExportRelationsWhiteList) Reset() { *m = RpcObjectListExportRelationsWhiteList{} } +func (m *RpcObjectListExportRelationsWhiteList) String() string { return proto.CompactTextString(m) } +func (*RpcObjectListExportRelationsWhiteList) ProtoMessage() {} +func (*RpcObjectListExportRelationsWhiteList) Descriptor() ([]byte, []int) { + return fileDescriptor_8261c968b2e6f45c, []int{0, 6, 47, 2} +} +func (m *RpcObjectListExportRelationsWhiteList) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *RpcObjectListExportRelationsWhiteList) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_RpcObjectListExportRelationsWhiteList.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 *RpcObjectListExportRelationsWhiteList) XXX_Merge(src proto.Message) { + xxx_messageInfo_RpcObjectListExportRelationsWhiteList.Merge(m, src) +} +func (m *RpcObjectListExportRelationsWhiteList) XXX_Size() int { + return m.Size() +} +func (m *RpcObjectListExportRelationsWhiteList) XXX_DiscardUnknown() { + xxx_messageInfo_RpcObjectListExportRelationsWhiteList.DiscardUnknown(m) +} + +var xxx_messageInfo_RpcObjectListExportRelationsWhiteList proto.InternalMessageInfo + +func (m *RpcObjectListExportRelationsWhiteList) GetLayout() model.ObjectTypeLayout { + if m != nil { + return m.Layout + } + return model.ObjectType_basic +} + +func (m *RpcObjectListExportRelationsWhiteList) GetAllowedRelations() []string { + if m != nil { + return m.AllowedRelations + } + return nil +} + type RpcObjectListExportResponse struct { Error *RpcObjectListExportResponseError `protobuf:"bytes,1,opt,name=error,proto3" json:"error,omitempty"` Path string `protobuf:"bytes,2,opt,name=path,proto3" json:"path,omitempty"` @@ -29700,7 +30036,7 @@ func (m *RpcObjectListExportResponse) Reset() { *m = RpcObjectListExport func (m *RpcObjectListExportResponse) String() string { return proto.CompactTextString(m) } func (*RpcObjectListExportResponse) ProtoMessage() {} func (*RpcObjectListExportResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 6, 47, 1} + return fileDescriptor_8261c968b2e6f45c, []int{0, 6, 47, 3} } func (m *RpcObjectListExportResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -29766,7 +30102,7 @@ func (m *RpcObjectListExportResponseError) Reset() { *m = RpcObjectListE func (m *RpcObjectListExportResponseError) String() string { return proto.CompactTextString(m) } func (*RpcObjectListExportResponseError) ProtoMessage() {} func (*RpcObjectListExportResponseError) Descriptor() ([]byte, []int) { - return fileDescriptor_8261c968b2e6f45c, []int{0, 6, 47, 1, 0} + return fileDescriptor_8261c968b2e6f45c, []int{0, 6, 47, 3, 0} } func (m *RpcObjectListExportResponseError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -70608,6 +70944,7 @@ func init() { proto.RegisterEnum("anytype.RpcAccountConfigUpdateResponseErrorCode", RpcAccountConfigUpdateResponseErrorCode_name, RpcAccountConfigUpdateResponseErrorCode_value) proto.RegisterEnum("anytype.RpcAccountRecoverFromLegacyExportResponseErrorCode", RpcAccountRecoverFromLegacyExportResponseErrorCode_name, RpcAccountRecoverFromLegacyExportResponseErrorCode_value) proto.RegisterEnum("anytype.RpcAccountEnableLocalNetworkSyncResponseErrorCode", RpcAccountEnableLocalNetworkSyncResponseErrorCode_name, RpcAccountEnableLocalNetworkSyncResponseErrorCode_value) + proto.RegisterEnum("anytype.RpcAccountChangeJsonApiAddrResponseErrorCode", RpcAccountChangeJsonApiAddrResponseErrorCode_name, RpcAccountChangeJsonApiAddrResponseErrorCode_value) proto.RegisterEnum("anytype.RpcAccountChangeNetworkConfigAndRestartResponseErrorCode", RpcAccountChangeNetworkConfigAndRestartResponseErrorCode_name, RpcAccountChangeNetworkConfigAndRestartResponseErrorCode_value) proto.RegisterEnum("anytype.RpcAccountLocalLinkNewChallengeResponseErrorCode", RpcAccountLocalLinkNewChallengeResponseErrorCode_name, RpcAccountLocalLinkNewChallengeResponseErrorCode_value) proto.RegisterEnum("anytype.RpcAccountLocalLinkSolveChallengeResponseErrorCode", RpcAccountLocalLinkSolveChallengeResponseErrorCode_name, RpcAccountLocalLinkSolveChallengeResponseErrorCode_value) @@ -71015,6 +71352,10 @@ func init() { proto.RegisterType((*RpcAccountEnableLocalNetworkSyncRequest)(nil), "anytype.Rpc.Account.EnableLocalNetworkSync.Request") proto.RegisterType((*RpcAccountEnableLocalNetworkSyncResponse)(nil), "anytype.Rpc.Account.EnableLocalNetworkSync.Response") proto.RegisterType((*RpcAccountEnableLocalNetworkSyncResponseError)(nil), "anytype.Rpc.Account.EnableLocalNetworkSync.Response.Error") + proto.RegisterType((*RpcAccountChangeJsonApiAddr)(nil), "anytype.Rpc.Account.ChangeJsonApiAddr") + proto.RegisterType((*RpcAccountChangeJsonApiAddrRequest)(nil), "anytype.Rpc.Account.ChangeJsonApiAddr.Request") + proto.RegisterType((*RpcAccountChangeJsonApiAddrResponse)(nil), "anytype.Rpc.Account.ChangeJsonApiAddr.Response") + proto.RegisterType((*RpcAccountChangeJsonApiAddrResponseError)(nil), "anytype.Rpc.Account.ChangeJsonApiAddr.Response.Error") proto.RegisterType((*RpcAccountChangeNetworkConfigAndRestart)(nil), "anytype.Rpc.Account.ChangeNetworkConfigAndRestart") proto.RegisterType((*RpcAccountChangeNetworkConfigAndRestartRequest)(nil), "anytype.Rpc.Account.ChangeNetworkConfigAndRestart.Request") proto.RegisterType((*RpcAccountChangeNetworkConfigAndRestartResponse)(nil), "anytype.Rpc.Account.ChangeNetworkConfigAndRestart.Response") @@ -71282,6 +71623,8 @@ func init() { proto.RegisterType((*RpcObjectApplyTemplateResponseError)(nil), "anytype.Rpc.Object.ApplyTemplate.Response.Error") proto.RegisterType((*RpcObjectListExport)(nil), "anytype.Rpc.Object.ListExport") proto.RegisterType((*RpcObjectListExportRequest)(nil), "anytype.Rpc.Object.ListExport.Request") + proto.RegisterType((*RpcObjectListExportStateFilters)(nil), "anytype.Rpc.Object.ListExport.StateFilters") + proto.RegisterType((*RpcObjectListExportRelationsWhiteList)(nil), "anytype.Rpc.Object.ListExport.RelationsWhiteList") proto.RegisterType((*RpcObjectListExportResponse)(nil), "anytype.Rpc.Object.ListExport.Response") proto.RegisterType((*RpcObjectListExportResponseError)(nil), "anytype.Rpc.Object.ListExport.Response.Error") proto.RegisterType((*RpcObjectImport)(nil), "anytype.Rpc.Object.Import") @@ -72102,1233 +72445,1245 @@ func init() { func init() { proto.RegisterFile("pb/protos/commands.proto", fileDescriptor_8261c968b2e6f45c) } var fileDescriptor_8261c968b2e6f45c = []byte{ - // 19614 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0xbd, 0x7d, 0x98, 0x23, 0x47, - 0x79, 0x2f, 0xba, 0xea, 0x96, 0x34, 0x33, 0xef, 0x7c, 0xac, 0xb6, 0xbd, 0xbb, 0x5e, 0x97, 0xcd, - 0x7a, 0xb3, 0x36, 0xc6, 0x31, 0x66, 0x6c, 0x0c, 0x21, 0xd8, 0xd8, 0xd8, 0x1a, 0x8d, 0x66, 0x46, - 0xf6, 0x8c, 0x34, 0x69, 0x69, 0x76, 0x71, 0x72, 0x72, 0x75, 0x7a, 0xa5, 0x9a, 0x99, 0xf6, 0x6a, - 0xba, 0x95, 0xee, 0x9e, 0x59, 0x2f, 0xf7, 0x39, 0xf7, 0x84, 0x10, 0x07, 0x12, 0x42, 0xc8, 0x17, - 0x49, 0x08, 0xdf, 0x06, 0xc3, 0x81, 0x04, 0x08, 0xdf, 0x07, 0x92, 0x00, 0xe1, 0x23, 0x10, 0x42, - 0x08, 0x81, 0x10, 0x08, 0x09, 0x37, 0x10, 0x08, 0x21, 0xe7, 0x09, 0x87, 0x9b, 0xdc, 0x13, 0x08, - 0x09, 0x5c, 0xee, 0xd3, 0x55, 0xd5, 0x1f, 0xa5, 0x51, 0xb7, 0xaa, 0x35, 0x6a, 0x8d, 0x09, 0xe7, - 0xbf, 0xee, 0xea, 0xea, 0xb7, 0xde, 0x7a, 0x7f, 0x6f, 0x55, 0xbd, 0x55, 0xf5, 0xd6, 0x5b, 0x70, - 0xaa, 0x7b, 0xe1, 0x96, 0xae, 0x65, 0x3a, 0xa6, 0x7d, 0x4b, 0xcb, 0xdc, 0xd9, 0xd1, 0x8c, 0xb6, - 0x3d, 0x4f, 0xde, 0x95, 0x09, 0xcd, 0xb8, 0xec, 0x5c, 0xee, 0x62, 0x74, 0x7d, 0xf7, 0xe2, 0xd6, - 0x2d, 0x1d, 0xfd, 0xc2, 0x2d, 0xdd, 0x0b, 0xb7, 0xec, 0x98, 0x6d, 0xdc, 0xf1, 0x7e, 0x20, 0x2f, - 0x2c, 0x3b, 0xba, 0x31, 0x2a, 0x57, 0xc7, 0x6c, 0x69, 0x1d, 0xdb, 0x31, 0x2d, 0xcc, 0x72, 0x9e, - 0x0c, 0x8a, 0xc4, 0x7b, 0xd8, 0x70, 0x3c, 0x0a, 0xd7, 0x6c, 0x99, 0xe6, 0x56, 0x07, 0xd3, 0x6f, - 0x17, 0x76, 0x37, 0x6f, 0xb1, 0x1d, 0x6b, 0xb7, 0xe5, 0xb0, 0xaf, 0x67, 0x7a, 0xbf, 0xb6, 0xb1, - 0xdd, 0xb2, 0xf4, 0xae, 0x63, 0x5a, 0x34, 0xc7, 0xd9, 0x9f, 0xfc, 0x85, 0x49, 0x90, 0xd5, 0x6e, - 0x0b, 0x7d, 0x63, 0x02, 0xe4, 0x62, 0xb7, 0x8b, 0x3e, 0x24, 0x01, 0x2c, 0x63, 0xe7, 0x1c, 0xb6, - 0x6c, 0xdd, 0x34, 0xd0, 0x51, 0x98, 0x50, 0xf1, 0x4f, 0xec, 0x62, 0xdb, 0xb9, 0x23, 0xfb, 0xdc, - 0xaf, 0xc8, 0x19, 0xf4, 0x88, 0x04, 0x93, 0x2a, 0xb6, 0xbb, 0xa6, 0x61, 0x63, 0xe5, 0x1e, 0xc8, - 0x61, 0xcb, 0x32, 0xad, 0x53, 0x99, 0x33, 0x99, 0x1b, 0xa7, 0x6f, 0xbb, 0x69, 0x9e, 0x55, 0x7f, - 0x5e, 0xed, 0xb6, 0xe6, 0x8b, 0xdd, 0xee, 0x7c, 0x40, 0x69, 0xde, 0xfb, 0x69, 0xbe, 0xec, 0xfe, - 0xa1, 0xd2, 0x1f, 0x95, 0x53, 0x30, 0xb1, 0x47, 0x33, 0x9c, 0x92, 0xce, 0x64, 0x6e, 0x9c, 0x52, - 0xbd, 0x57, 0xf7, 0x4b, 0x1b, 0x3b, 0x9a, 0xde, 0xb1, 0x4f, 0xc9, 0xf4, 0x0b, 0x7b, 0x45, 0x0f, - 0x67, 0x20, 0x47, 0x88, 0x28, 0x25, 0xc8, 0xb6, 0xcc, 0x36, 0x26, 0xc5, 0xcf, 0xdd, 0x76, 0x8b, - 0x78, 0xf1, 0xf3, 0x25, 0xb3, 0x8d, 0x55, 0xf2, 0xb3, 0x72, 0x06, 0xa6, 0x3d, 0xb1, 0x04, 0x6c, - 0x84, 0x93, 0xce, 0xde, 0x06, 0x59, 0x37, 0xbf, 0x32, 0x09, 0xd9, 0xea, 0xc6, 0xea, 0x6a, 0xe1, - 0x88, 0x72, 0x0c, 0x66, 0x37, 0xaa, 0xf7, 0x55, 0x6b, 0xe7, 0xab, 0xcd, 0xb2, 0xaa, 0xd6, 0xd4, - 0x42, 0x46, 0x99, 0x85, 0xa9, 0x85, 0xe2, 0x62, 0xb3, 0x52, 0x5d, 0xdf, 0x68, 0x14, 0x24, 0xf4, - 0x32, 0x19, 0xe6, 0xea, 0xd8, 0x59, 0xc4, 0x7b, 0x7a, 0x0b, 0xd7, 0x1d, 0xcd, 0xc1, 0xe8, 0x05, - 0x19, 0x5f, 0x98, 0xca, 0x86, 0x5b, 0xa8, 0xff, 0x89, 0x55, 0xe0, 0x49, 0xfb, 0x2a, 0xc0, 0x53, - 0x98, 0x67, 0x7f, 0xcf, 0x87, 0xd2, 0xd4, 0x30, 0x9d, 0xb3, 0x4f, 0x80, 0xe9, 0xd0, 0x37, 0x65, - 0x0e, 0x60, 0xa1, 0x58, 0xba, 0x6f, 0x59, 0xad, 0x6d, 0x54, 0x17, 0x0b, 0x47, 0xdc, 0xf7, 0xa5, - 0x9a, 0x5a, 0x66, 0xef, 0x19, 0xf4, 0xad, 0x4c, 0x08, 0xcc, 0x45, 0x1e, 0xcc, 0xf9, 0xc1, 0xcc, - 0xf4, 0x01, 0x14, 0xbd, 0xc6, 0x07, 0x67, 0x99, 0x03, 0xe7, 0x49, 0xc9, 0xc8, 0xa5, 0x0f, 0xd0, - 0x43, 0x12, 0x4c, 0xd6, 0xb7, 0x77, 0x9d, 0xb6, 0x79, 0xc9, 0x40, 0x53, 0x3e, 0x32, 0xe8, 0x6b, - 0x61, 0x99, 0x3c, 0x9d, 0x97, 0xc9, 0x8d, 0xfb, 0x2b, 0xc1, 0x28, 0x44, 0x48, 0xe3, 0x15, 0xbe, - 0x34, 0x8a, 0x9c, 0x34, 0x9e, 0x20, 0x4a, 0x28, 0x7d, 0x39, 0xfc, 0xe6, 0x53, 0x21, 0x57, 0xef, - 0x6a, 0x2d, 0x8c, 0x3e, 0x26, 0xc3, 0xcc, 0x2a, 0xd6, 0xf6, 0x70, 0xb1, 0xdb, 0xb5, 0xcc, 0x3d, - 0x8c, 0x4a, 0x81, 0xbe, 0x9e, 0x82, 0x09, 0xdb, 0xcd, 0x54, 0x69, 0x93, 0x1a, 0x4c, 0xa9, 0xde, - 0xab, 0x72, 0x1a, 0x40, 0x6f, 0x63, 0xc3, 0xd1, 0x1d, 0x1d, 0xdb, 0xa7, 0xa4, 0x33, 0xf2, 0x8d, - 0x53, 0x6a, 0x28, 0x05, 0x7d, 0x43, 0x12, 0xd5, 0x31, 0xc2, 0xc5, 0x7c, 0x98, 0x83, 0x08, 0xa9, - 0xbe, 0x4a, 0x12, 0xd1, 0xb1, 0x81, 0xe4, 0x92, 0xc9, 0xf6, 0x8d, 0x99, 0xe4, 0xc2, 0x75, 0x73, - 0x54, 0x6b, 0xcd, 0xfa, 0x46, 0x69, 0xa5, 0x59, 0x5f, 0x2f, 0x96, 0xca, 0x05, 0xac, 0x1c, 0x87, - 0x02, 0x79, 0x6c, 0x56, 0xea, 0xcd, 0xc5, 0xf2, 0x6a, 0xb9, 0x51, 0x5e, 0x2c, 0x6c, 0x2a, 0x0a, - 0xcc, 0xa9, 0xe5, 0x1f, 0xd9, 0x28, 0xd7, 0x1b, 0xcd, 0xa5, 0x62, 0x65, 0xb5, 0xbc, 0x58, 0xd8, - 0x72, 0x7f, 0x5e, 0xad, 0xac, 0x55, 0x1a, 0x4d, 0xb5, 0x5c, 0x2c, 0xad, 0x94, 0x17, 0x0b, 0xdb, - 0xca, 0x95, 0x70, 0x45, 0xb5, 0xd6, 0x2c, 0xae, 0xaf, 0xab, 0xb5, 0x73, 0xe5, 0x26, 0xfb, 0xa3, - 0x5e, 0xd0, 0x69, 0x41, 0x8d, 0x66, 0x7d, 0xa5, 0xa8, 0x96, 0x8b, 0x0b, 0xab, 0xe5, 0xc2, 0x03, - 0xe8, 0xd9, 0x32, 0xcc, 0xae, 0x69, 0x17, 0x71, 0x7d, 0x5b, 0xb3, 0xb0, 0x76, 0xa1, 0x83, 0xd1, - 0x75, 0x02, 0x78, 0xa2, 0x8f, 0x85, 0xf1, 0x2a, 0xf3, 0x78, 0xdd, 0xd2, 0x47, 0xc0, 0x5c, 0x11, - 0x11, 0x80, 0xfd, 0xab, 0xdf, 0x0c, 0x56, 0x38, 0xc0, 0x9e, 0x9c, 0x90, 0x5e, 0x32, 0xc4, 0x7e, - 0xea, 0x51, 0x80, 0x18, 0xfa, 0xbc, 0x0c, 0x73, 0x15, 0x63, 0x4f, 0x77, 0xf0, 0x32, 0x36, 0xb0, - 0xe5, 0x8e, 0x03, 0x42, 0x30, 0x3c, 0x22, 0x87, 0x60, 0x58, 0xe2, 0x61, 0xb8, 0xb5, 0x8f, 0xd8, - 0xf8, 0x32, 0x22, 0x46, 0xdb, 0x6b, 0x60, 0x4a, 0x27, 0xf9, 0x4a, 0x7a, 0x9b, 0x49, 0x2c, 0x48, - 0x50, 0xae, 0x87, 0x59, 0xfa, 0xb2, 0xa4, 0x77, 0xf0, 0x7d, 0xf8, 0x32, 0x1b, 0x77, 0xf9, 0x44, - 0xf4, 0xf3, 0x7e, 0xe3, 0xab, 0x70, 0x58, 0xfe, 0x50, 0x52, 0xa6, 0x92, 0x81, 0xf9, 0xc2, 0x47, - 0x43, 0xf3, 0xdb, 0xd7, 0xca, 0x74, 0xf4, 0x1d, 0x09, 0xa6, 0xeb, 0x8e, 0xd9, 0x75, 0x55, 0x56, - 0x37, 0xb6, 0xc4, 0xc0, 0xfd, 0x48, 0xb8, 0x8d, 0x95, 0x78, 0x70, 0x9f, 0xd0, 0x47, 0x8e, 0xa1, - 0x02, 0x22, 0x5a, 0xd8, 0x37, 0xfc, 0x16, 0xb6, 0xc4, 0xa1, 0x72, 0x5b, 0x22, 0x6a, 0xdf, 0x83, - 0xed, 0xeb, 0x85, 0x32, 0x14, 0x3c, 0x35, 0x73, 0x4a, 0xbb, 0x96, 0x85, 0x0d, 0x47, 0x0c, 0x84, - 0xbf, 0x0a, 0x83, 0xb0, 0xc2, 0x83, 0x70, 0x5b, 0x8c, 0x32, 0x7b, 0xa5, 0xa4, 0xd8, 0xc6, 0xde, - 0xe7, 0xa3, 0x79, 0x1f, 0x87, 0xe6, 0x0f, 0x27, 0x67, 0x2b, 0x19, 0xa4, 0x2b, 0x43, 0x20, 0x7a, - 0x1c, 0x0a, 0xee, 0x98, 0x54, 0x6a, 0x54, 0xce, 0x95, 0x9b, 0x95, 0xea, 0xb9, 0x4a, 0xa3, 0x5c, - 0xc0, 0xe8, 0x57, 0x64, 0x98, 0xa1, 0xac, 0xa9, 0x78, 0xcf, 0xbc, 0x28, 0xd8, 0xeb, 0x7d, 0x3e, - 0xa1, 0xb1, 0x10, 0x2e, 0x21, 0xa2, 0x65, 0xfc, 0x5c, 0x02, 0x63, 0x21, 0x86, 0xdc, 0xa3, 0xa9, - 0xb7, 0xda, 0xd7, 0x0c, 0xb6, 0xfa, 0xb4, 0x96, 0xbe, 0xbd, 0xd5, 0x0b, 0xb3, 0x00, 0xb4, 0x92, - 0xe7, 0x74, 0x7c, 0x09, 0xad, 0x05, 0x98, 0x70, 0x6a, 0x9b, 0x19, 0xa8, 0xb6, 0x52, 0x3f, 0xb5, - 0x7d, 0x67, 0x78, 0xcc, 0x5a, 0xe0, 0xd1, 0xbb, 0x39, 0x52, 0xdc, 0x2e, 0x27, 0xd1, 0xb3, 0x43, - 0x4f, 0x51, 0x24, 0xde, 0xea, 0xbc, 0x06, 0xa6, 0xc8, 0x63, 0x55, 0xdb, 0xc1, 0xac, 0x0d, 0x05, - 0x09, 0xca, 0x59, 0x98, 0xa1, 0x19, 0x5b, 0xa6, 0xe1, 0xd6, 0x27, 0x4b, 0x32, 0x70, 0x69, 0x2e, - 0x88, 0x2d, 0x0b, 0x6b, 0x8e, 0x69, 0x11, 0x1a, 0x39, 0x0a, 0x62, 0x28, 0x09, 0x7d, 0xd5, 0x6f, - 0x85, 0x65, 0x4e, 0x73, 0x9e, 0x98, 0xa4, 0x2a, 0xc9, 0xf4, 0x66, 0x6f, 0xb8, 0xf6, 0x47, 0x5b, - 0x5d, 0xd3, 0x45, 0x7b, 0x89, 0x4c, 0xed, 0xb0, 0x72, 0x12, 0x14, 0x96, 0xea, 0xe6, 0x2d, 0xd5, - 0xaa, 0x8d, 0x72, 0xb5, 0x51, 0xd8, 0xec, 0xab, 0x51, 0x5b, 0xe8, 0x55, 0x59, 0xc8, 0xde, 0x6b, - 0xea, 0x06, 0x7a, 0x28, 0xc3, 0xa9, 0x84, 0x81, 0x9d, 0x4b, 0xa6, 0x75, 0xd1, 0x6f, 0xa8, 0x41, - 0x42, 0x3c, 0x36, 0x81, 0x2a, 0xc9, 0x03, 0x55, 0x29, 0xdb, 0x4f, 0x95, 0x7e, 0x39, 0xac, 0x4a, - 0x77, 0xf2, 0xaa, 0x74, 0x43, 0x1f, 0xf9, 0xbb, 0xcc, 0x47, 0x74, 0x00, 0x1f, 0xf6, 0x3b, 0x80, - 0xbb, 0x39, 0x18, 0x1f, 0x2f, 0x46, 0x26, 0x19, 0x80, 0x9f, 0x4b, 0xb5, 0xe1, 0xf7, 0x83, 0x7a, - 0x2b, 0x02, 0xea, 0xed, 0x3e, 0x7d, 0x82, 0xbe, 0xbf, 0xeb, 0x78, 0x60, 0x7f, 0x37, 0x71, 0x51, - 0x39, 0x01, 0xc7, 0x16, 0x2b, 0x4b, 0x4b, 0x65, 0xb5, 0x5c, 0x6d, 0x34, 0xab, 0xe5, 0xc6, 0xf9, - 0x9a, 0x7a, 0x5f, 0xa1, 0x83, 0x1e, 0x96, 0x01, 0x5c, 0x09, 0x95, 0x34, 0xa3, 0x85, 0x3b, 0x62, - 0x3d, 0xfa, 0xff, 0x94, 0x92, 0xf5, 0x09, 0x01, 0xfd, 0x08, 0x38, 0x5f, 0x2a, 0x89, 0xb7, 0xca, - 0x48, 0x62, 0xc9, 0x40, 0x7d, 0xfd, 0xa3, 0xc1, 0xf6, 0xbc, 0x02, 0x8e, 0x7a, 0xf4, 0x58, 0xf6, - 0xfe, 0xd3, 0xbe, 0x37, 0x65, 0x61, 0x8e, 0xc1, 0xe2, 0xcd, 0xe3, 0x9f, 0x9b, 0x11, 0x99, 0xc8, - 0x23, 0x98, 0x64, 0xd3, 0x76, 0xaf, 0x7b, 0xf7, 0xdf, 0x95, 0x65, 0x98, 0xee, 0x62, 0x6b, 0x47, - 0xb7, 0x6d, 0xdd, 0x34, 0xe8, 0x82, 0xdc, 0xdc, 0x6d, 0x8f, 0xf5, 0x25, 0x4e, 0xd6, 0x2e, 0xe7, - 0xd7, 0x35, 0xcb, 0xd1, 0x5b, 0x7a, 0x57, 0x33, 0x9c, 0xf5, 0x20, 0xb3, 0x1a, 0xfe, 0x13, 0xfd, - 0x52, 0xc2, 0x69, 0x0d, 0x5f, 0x93, 0x08, 0x95, 0xf8, 0xbd, 0x04, 0x53, 0x92, 0x58, 0x82, 0xc9, - 0xd4, 0xe2, 0x43, 0xa9, 0xaa, 0x45, 0x1f, 0xbc, 0xb7, 0x94, 0xab, 0xe0, 0x44, 0xa5, 0x5a, 0xaa, - 0xa9, 0x6a, 0xb9, 0xd4, 0x68, 0xae, 0x97, 0xd5, 0xb5, 0x4a, 0xbd, 0x5e, 0xa9, 0x55, 0xeb, 0x07, - 0x69, 0xed, 0xe8, 0xa3, 0xb2, 0xaf, 0x31, 0x8b, 0xb8, 0xd5, 0xd1, 0x0d, 0x8c, 0xee, 0x3e, 0xa0, - 0xc2, 0xf0, 0xab, 0x3e, 0xe2, 0x38, 0xb3, 0xf2, 0x23, 0x70, 0x7e, 0x65, 0x72, 0x9c, 0xfb, 0x13, - 0xfc, 0x0f, 0xdc, 0xfc, 0x3f, 0x2f, 0xc3, 0xb1, 0x50, 0x43, 0x54, 0xf1, 0xce, 0xc8, 0x56, 0xf2, - 0x7e, 0x2a, 0xdc, 0x76, 0x2b, 0x3c, 0xa6, 0xfd, 0xac, 0xe9, 0x7d, 0x6c, 0x44, 0xc0, 0xfa, 0x7a, - 0x1f, 0xd6, 0x55, 0x0e, 0xd6, 0xa7, 0x0e, 0x41, 0x33, 0x19, 0xb2, 0xbf, 0x93, 0x2a, 0xb2, 0x57, - 0xc1, 0x89, 0xf5, 0xa2, 0xda, 0xa8, 0x94, 0x2a, 0xeb, 0x45, 0x77, 0x1c, 0x0d, 0x0d, 0xd9, 0x11, - 0xe6, 0x3a, 0x0f, 0x7a, 0x5f, 0x7c, 0xdf, 0x9b, 0x85, 0x6b, 0xfa, 0x77, 0xb4, 0xa5, 0x6d, 0xcd, - 0xd8, 0xc2, 0x48, 0x17, 0x81, 0x7a, 0x11, 0x26, 0x5a, 0x24, 0x3b, 0xc5, 0x39, 0xbc, 0x75, 0x13, - 0xd3, 0x97, 0xd3, 0x12, 0x54, 0xef, 0x57, 0xf4, 0xd6, 0xb0, 0x42, 0x34, 0x78, 0x85, 0x78, 0x7a, - 0x3c, 0x78, 0xfb, 0xf8, 0x8e, 0xd0, 0x8d, 0x4f, 0xf8, 0xba, 0x71, 0x9e, 0xd3, 0x8d, 0xd2, 0xc1, - 0xc8, 0x27, 0x53, 0x93, 0x3f, 0x7e, 0x34, 0x74, 0x00, 0x91, 0xda, 0xa4, 0x47, 0x8f, 0x0a, 0x7d, - 0xbb, 0xfb, 0x97, 0xcb, 0x90, 0x5f, 0xc4, 0x1d, 0x2c, 0xba, 0x12, 0xf9, 0x75, 0x49, 0x74, 0x43, - 0x84, 0xc2, 0x40, 0x69, 0x47, 0xaf, 0x8e, 0x38, 0xfa, 0x0e, 0xb6, 0x1d, 0x6d, 0xa7, 0x4b, 0x44, - 0x2d, 0xab, 0x41, 0x02, 0xfa, 0x69, 0x49, 0x64, 0xbb, 0x24, 0xa6, 0x98, 0xff, 0x18, 0x6b, 0x8a, - 0x9f, 0x92, 0x60, 0xb2, 0x8e, 0x9d, 0x9a, 0xd5, 0xc6, 0x16, 0xaa, 0x07, 0x18, 0x9d, 0x81, 0x69, - 0x02, 0x8a, 0x3b, 0xcd, 0xf4, 0x71, 0x0a, 0x27, 0x29, 0x37, 0xc0, 0x9c, 0xff, 0x4a, 0x7e, 0x67, - 0xdd, 0x78, 0x4f, 0x2a, 0xfa, 0xa7, 0x8c, 0xe8, 0x2e, 0x2e, 0x5b, 0x32, 0x64, 0xdc, 0x44, 0xb4, - 0x52, 0xb1, 0x1d, 0xd9, 0x58, 0x52, 0xe9, 0x6f, 0x74, 0xbd, 0x59, 0x02, 0xd8, 0x30, 0x6c, 0x4f, - 0xae, 0x8f, 0x4f, 0x20, 0x57, 0xf4, 0x2f, 0x99, 0x64, 0xb3, 0x98, 0xa0, 0x9c, 0x08, 0x89, 0xbd, - 0x3a, 0xc1, 0xda, 0x42, 0x24, 0xb1, 0xf4, 0x65, 0xf6, 0xa5, 0x39, 0xc8, 0x9f, 0xd7, 0x3a, 0x1d, - 0xec, 0xa0, 0x2f, 0x4b, 0x90, 0x2f, 0x59, 0x58, 0x73, 0x70, 0x58, 0x74, 0x08, 0x26, 0x2d, 0xd3, - 0x74, 0xd6, 0x35, 0x67, 0x9b, 0xc9, 0xcd, 0x7f, 0x67, 0x0e, 0x03, 0xbf, 0x1d, 0xee, 0x3e, 0xee, - 0xe6, 0x45, 0xf7, 0x83, 0x5c, 0x6d, 0x69, 0x41, 0xf3, 0xb4, 0x90, 0x88, 0xfe, 0x03, 0xc1, 0xe4, - 0x8e, 0x81, 0x77, 0x4c, 0x43, 0x6f, 0x79, 0x36, 0xa7, 0xf7, 0x8e, 0xde, 0xef, 0xcb, 0x74, 0x81, - 0x93, 0xe9, 0xbc, 0x70, 0x29, 0xc9, 0x04, 0x5a, 0x1f, 0xa2, 0xf7, 0xb8, 0x16, 0xae, 0xa6, 0x9d, - 0x41, 0xb3, 0x51, 0x6b, 0x96, 0xd4, 0x72, 0xb1, 0x51, 0x6e, 0xae, 0xd6, 0x4a, 0xc5, 0xd5, 0xa6, - 0x5a, 0x5e, 0xaf, 0x15, 0x30, 0xfa, 0x7b, 0xc9, 0x15, 0x6e, 0xcb, 0xdc, 0xc3, 0x16, 0x5a, 0x16, - 0x92, 0x73, 0x9c, 0x4c, 0x18, 0x06, 0xbf, 0x2c, 0xec, 0xb4, 0xc1, 0xa4, 0xc3, 0x38, 0x88, 0x50, - 0xde, 0x0f, 0x08, 0x35, 0xf7, 0x58, 0x52, 0x8f, 0x02, 0x49, 0xff, 0x2f, 0x09, 0x26, 0x4a, 0xa6, - 0xb1, 0x87, 0x2d, 0x27, 0x3c, 0xdf, 0x09, 0x4b, 0x33, 0xc3, 0x4b, 0xd3, 0x1d, 0x24, 0xb1, 0xe1, - 0x58, 0x66, 0xd7, 0x9b, 0xf0, 0x78, 0xaf, 0xe8, 0xb5, 0x49, 0x25, 0xcc, 0x4a, 0x8e, 0x5e, 0xf8, - 0xec, 0x5f, 0x10, 0xc7, 0x9e, 0xdc, 0xd3, 0x00, 0x1e, 0x4e, 0x82, 0x4b, 0x7f, 0x06, 0xd2, 0xef, - 0x52, 0xbe, 0x20, 0xc3, 0x2c, 0x6d, 0x7c, 0x75, 0x4c, 0x2c, 0x34, 0x54, 0x0b, 0x2f, 0x39, 0xf6, - 0x08, 0x7f, 0xe5, 0x08, 0x27, 0xfe, 0xbc, 0xd6, 0xed, 0xfa, 0xcb, 0xcf, 0x2b, 0x47, 0x54, 0xf6, - 0x4e, 0xd5, 0x7c, 0x21, 0x0f, 0x59, 0x6d, 0xd7, 0xd9, 0x46, 0xdf, 0x11, 0x9e, 0x7c, 0x72, 0x9d, - 0x01, 0xe3, 0x27, 0x02, 0x92, 0xe3, 0x90, 0x73, 0xcc, 0x8b, 0xd8, 0x93, 0x03, 0x7d, 0x71, 0xe1, - 0xd0, 0xba, 0xdd, 0x06, 0xf9, 0xc0, 0xe0, 0xf0, 0xde, 0x5d, 0x5b, 0x47, 0x6b, 0xb5, 0xcc, 0x5d, - 0xc3, 0xa9, 0x78, 0x4b, 0xd0, 0x41, 0x02, 0xfa, 0x6c, 0x46, 0x64, 0x32, 0x2b, 0xc0, 0x60, 0x32, - 0xc8, 0x2e, 0x0c, 0xd1, 0x94, 0xe6, 0xe1, 0xa6, 0xe2, 0xfa, 0x7a, 0xb3, 0x51, 0xbb, 0xaf, 0x5c, - 0x0d, 0x0c, 0xcf, 0x66, 0xa5, 0xda, 0x6c, 0xac, 0x94, 0x9b, 0xa5, 0x0d, 0x95, 0xac, 0x13, 0x16, - 0x4b, 0xa5, 0xda, 0x46, 0xb5, 0x51, 0xc0, 0xe8, 0x0d, 0x12, 0xcc, 0x94, 0x3a, 0xa6, 0xed, 0x23, - 0x7c, 0x6d, 0x80, 0xb0, 0x2f, 0xc6, 0x4c, 0x48, 0x8c, 0xe8, 0xdf, 0x33, 0xa2, 0x4e, 0x07, 0x9e, - 0x40, 0x42, 0xe4, 0x23, 0x7a, 0xa9, 0xd7, 0x0a, 0x39, 0x1d, 0x0c, 0xa6, 0x97, 0x7e, 0x93, 0xf8, - 0xd4, 0x1d, 0x30, 0x51, 0xa4, 0x8a, 0x81, 0xfe, 0x26, 0x03, 0xf9, 0x92, 0x69, 0x6c, 0xea, 0x5b, - 0xae, 0x31, 0x87, 0x0d, 0xed, 0x42, 0x07, 0x2f, 0x6a, 0x8e, 0xb6, 0xa7, 0xe3, 0x4b, 0xa4, 0x02, - 0x93, 0x6a, 0x4f, 0xaa, 0xcb, 0x14, 0x4b, 0xc1, 0x17, 0x76, 0xb7, 0x08, 0x53, 0x93, 0x6a, 0x38, - 0x49, 0x79, 0x2a, 0x5c, 0x49, 0x5f, 0xd7, 0x2d, 0x6c, 0xe1, 0x0e, 0xd6, 0x6c, 0xec, 0x4e, 0x8b, - 0x0c, 0xdc, 0x21, 0x4a, 0x3b, 0xa9, 0x46, 0x7d, 0x56, 0xce, 0xc2, 0x0c, 0xfd, 0x44, 0x4c, 0x11, - 0x9b, 0xa8, 0xf1, 0xa4, 0xca, 0xa5, 0x29, 0x4f, 0x80, 0x1c, 0x7e, 0xd0, 0xb1, 0xb4, 0x53, 0x6d, - 0x82, 0xd7, 0x95, 0xf3, 0xd4, 0xeb, 0x70, 0xde, 0xf3, 0x3a, 0x9c, 0xaf, 0x13, 0x9f, 0x44, 0x95, - 0xe6, 0x42, 0x2f, 0x99, 0xf4, 0x0d, 0x89, 0xef, 0x4a, 0x81, 0x62, 0x28, 0x90, 0x35, 0xb4, 0x1d, - 0xcc, 0xf4, 0x82, 0x3c, 0x2b, 0x37, 0xc1, 0x51, 0x6d, 0x4f, 0x73, 0x34, 0x6b, 0xd5, 0x6c, 0x69, - 0x1d, 0x32, 0xf8, 0x79, 0x2d, 0xbf, 0xf7, 0x03, 0xd9, 0x11, 0x72, 0x4c, 0x0b, 0x93, 0x5c, 0xde, - 0x8e, 0x90, 0x97, 0xe0, 0x52, 0xd7, 0x5b, 0xa6, 0x41, 0xf8, 0x97, 0x55, 0xf2, 0xec, 0x4a, 0xa5, - 0xad, 0xdb, 0x6e, 0x45, 0x08, 0x95, 0x2a, 0xdd, 0xda, 0xa8, 0x5f, 0x36, 0x5a, 0x64, 0x37, 0x68, - 0x52, 0x8d, 0xfa, 0xac, 0x2c, 0xc0, 0x34, 0xdb, 0x08, 0x59, 0x73, 0xf5, 0x2a, 0x4f, 0xf4, 0xea, - 0x0c, 0xef, 0xd3, 0x45, 0xf1, 0x9c, 0xaf, 0x06, 0xf9, 0xd4, 0xf0, 0x4f, 0xca, 0x3d, 0x70, 0x35, - 0x7b, 0x2d, 0xed, 0xda, 0x8e, 0xb9, 0x43, 0x41, 0x5f, 0xd2, 0x3b, 0xb4, 0x06, 0x13, 0xa4, 0x06, - 0x71, 0x59, 0x94, 0xdb, 0xe0, 0x78, 0xd7, 0xc2, 0x9b, 0xd8, 0xba, 0x5f, 0xdb, 0xd9, 0x7d, 0xb0, - 0x61, 0x69, 0x86, 0xdd, 0x35, 0x2d, 0xe7, 0xd4, 0x24, 0x61, 0xbe, 0xef, 0x37, 0xd6, 0x51, 0x4e, - 0x42, 0x9e, 0x8a, 0x0f, 0xbd, 0x20, 0x27, 0xec, 0xce, 0xc9, 0x2a, 0x14, 0x6b, 0x9e, 0xdd, 0x0a, - 0x13, 0xac, 0x87, 0x23, 0x40, 0x4d, 0xdf, 0x76, 0xb2, 0x67, 0x5d, 0x81, 0x51, 0x51, 0xbd, 0x6c, - 0xca, 0x93, 0x20, 0xdf, 0x22, 0xd5, 0x22, 0x98, 0x4d, 0xdf, 0x76, 0x75, 0xff, 0x42, 0x49, 0x16, - 0x95, 0x65, 0x45, 0x7f, 0x29, 0x0b, 0x79, 0x80, 0xc6, 0x71, 0x9c, 0xac, 0x55, 0x7f, 0x55, 0x1a, - 0xa2, 0xdb, 0xbc, 0x19, 0x6e, 0x64, 0x7d, 0x22, 0xb3, 0x3f, 0x16, 0x9b, 0x0b, 0x1b, 0xde, 0x64, - 0xd0, 0xb5, 0x4a, 0xea, 0x8d, 0xa2, 0xea, 0xce, 0xe4, 0x17, 0xdd, 0x49, 0xe4, 0x4d, 0x70, 0xc3, - 0x80, 0xdc, 0xe5, 0x46, 0xb3, 0x5a, 0x5c, 0x2b, 0x17, 0x36, 0x79, 0xdb, 0xa6, 0xde, 0xa8, 0xad, - 0x37, 0xd5, 0x8d, 0x6a, 0xb5, 0x52, 0x5d, 0xa6, 0xc4, 0x5c, 0x93, 0xf0, 0x64, 0x90, 0xe1, 0xbc, - 0x5a, 0x69, 0x94, 0x9b, 0xa5, 0x5a, 0x75, 0xa9, 0xb2, 0x5c, 0xd0, 0x07, 0x19, 0x46, 0x0f, 0x28, - 0x67, 0xe0, 0x1a, 0x8e, 0x93, 0x4a, 0xad, 0xea, 0xce, 0x6c, 0x4b, 0xc5, 0x6a, 0xa9, 0xec, 0x4e, - 0x63, 0x2f, 0x2a, 0x08, 0x4e, 0x50, 0x72, 0xcd, 0xa5, 0xca, 0x6a, 0x78, 0x33, 0xea, 0x23, 0x19, - 0xe5, 0x14, 0x5c, 0x11, 0xfe, 0x56, 0xa9, 0x9e, 0x2b, 0xae, 0x56, 0x16, 0x0b, 0x7f, 0x94, 0x51, - 0xae, 0x87, 0x6b, 0xb9, 0xbf, 0xe8, 0xbe, 0x52, 0xb3, 0xb2, 0xd8, 0x5c, 0xab, 0xd4, 0xd7, 0x8a, - 0x8d, 0xd2, 0x4a, 0xe1, 0xa3, 0x64, 0xbe, 0xe0, 0x1b, 0xc0, 0x21, 0xb7, 0xcc, 0x17, 0x86, 0xc7, - 0xf4, 0x22, 0xaf, 0xa8, 0x8f, 0xef, 0x0b, 0x7b, 0xbc, 0x0d, 0xfb, 0x21, 0x7f, 0x74, 0x58, 0xe4, - 0x54, 0xe8, 0xd6, 0x04, 0xb4, 0x92, 0xe9, 0x50, 0x63, 0x08, 0x15, 0x3a, 0x03, 0xd7, 0x54, 0xcb, - 0x14, 0x29, 0xb5, 0x5c, 0xaa, 0x9d, 0x2b, 0xab, 0xcd, 0xf3, 0xc5, 0xd5, 0xd5, 0x72, 0xa3, 0xb9, - 0x54, 0x51, 0xeb, 0x8d, 0xc2, 0x26, 0xfa, 0x17, 0xc9, 0x5f, 0xcd, 0x09, 0x49, 0xeb, 0x6f, 0xa4, - 0xa4, 0xcd, 0x3a, 0x76, 0xd5, 0xe6, 0x87, 0x20, 0x6f, 0x3b, 0x9a, 0xb3, 0x6b, 0xb3, 0x56, 0xfd, - 0x98, 0xfe, 0xad, 0x7a, 0xbe, 0x4e, 0x32, 0xa9, 0x2c, 0x33, 0xfa, 0xcb, 0x4c, 0x92, 0x66, 0x3a, - 0x82, 0x05, 0x1d, 0x7d, 0x08, 0x11, 0x9f, 0x06, 0xe4, 0x69, 0x7b, 0xa5, 0xde, 0x2c, 0xae, 0xaa, - 0xe5, 0xe2, 0xe2, 0xfd, 0xfe, 0x32, 0x0e, 0x56, 0x4e, 0xc0, 0xb1, 0x8d, 0x6a, 0x71, 0x61, 0xb5, - 0x4c, 0x9a, 0x4b, 0xad, 0x5a, 0x2d, 0x97, 0x5c, 0xb9, 0xff, 0x34, 0xd9, 0x34, 0x71, 0x2d, 0x68, - 0xc2, 0xb7, 0x6b, 0xe5, 0x84, 0xe4, 0xff, 0x15, 0x61, 0xdf, 0xa2, 0x40, 0xc3, 0xc2, 0xb4, 0x46, - 0x8b, 0xc3, 0x67, 0x85, 0xdc, 0x89, 0x84, 0x38, 0x49, 0x86, 0xc7, 0x7f, 0x1e, 0x02, 0x8f, 0x13, - 0x70, 0x2c, 0x8c, 0x07, 0x71, 0x2b, 0x8a, 0x86, 0xe1, 0x8b, 0x93, 0x90, 0xaf, 0xe3, 0x0e, 0x6e, - 0x39, 0xe8, 0x4d, 0x21, 0x63, 0x62, 0x0e, 0x24, 0xdf, 0x8d, 0x45, 0xd2, 0xdb, 0xdc, 0xf4, 0x59, - 0xea, 0x99, 0x3e, 0xc7, 0x98, 0x01, 0x72, 0x22, 0x33, 0x20, 0x9b, 0x82, 0x19, 0x90, 0x1b, 0xde, - 0x0c, 0xc8, 0x0f, 0x32, 0x03, 0xd0, 0xab, 0xf3, 0x49, 0x7b, 0x09, 0x2a, 0xea, 0xc3, 0x1d, 0xfc, - 0xff, 0x67, 0x36, 0x49, 0xaf, 0xd2, 0x97, 0xe3, 0x64, 0x5a, 0xfc, 0x1d, 0x39, 0x85, 0xe5, 0x07, - 0xe5, 0x3a, 0xb8, 0x36, 0x78, 0x6f, 0x96, 0x9f, 0x51, 0xa9, 0x37, 0xea, 0x64, 0xc4, 0x2f, 0xd5, - 0x54, 0x75, 0x63, 0x9d, 0xae, 0x21, 0x9f, 0x04, 0x25, 0xa0, 0xa2, 0x6e, 0x54, 0xe9, 0xf8, 0xbe, - 0xc5, 0x53, 0x5f, 0xaa, 0x54, 0x17, 0x9b, 0x7e, 0x9b, 0xa9, 0x2e, 0xd5, 0x0a, 0xdb, 0xee, 0x94, - 0x2d, 0x44, 0xdd, 0x1d, 0xa0, 0x59, 0x09, 0xc5, 0xea, 0x62, 0x73, 0xad, 0x5a, 0x5e, 0xab, 0x55, - 0x2b, 0x25, 0x92, 0x5e, 0x2f, 0x37, 0x0a, 0xba, 0x3b, 0xd0, 0xf4, 0x58, 0x14, 0xf5, 0x72, 0x51, - 0x2d, 0xad, 0x94, 0x55, 0x5a, 0xe4, 0x03, 0xca, 0x0d, 0x70, 0xb6, 0x58, 0xad, 0x35, 0xdc, 0x94, - 0x62, 0xf5, 0xfe, 0xc6, 0xfd, 0xeb, 0xe5, 0xe6, 0xba, 0x5a, 0x2b, 0x95, 0xeb, 0x75, 0xb7, 0x9d, - 0x32, 0xfb, 0xa3, 0xd0, 0x51, 0x9e, 0x0e, 0x77, 0x84, 0x58, 0x2b, 0x37, 0xc8, 0x86, 0xe5, 0x5a, - 0x8d, 0xf8, 0xac, 0x2c, 0x96, 0x9b, 0x2b, 0xc5, 0x7a, 0xb3, 0x52, 0x2d, 0xd5, 0xd6, 0xd6, 0x8b, - 0x8d, 0x8a, 0xdb, 0x9c, 0xd7, 0xd5, 0x5a, 0xa3, 0xd6, 0x3c, 0x57, 0x56, 0xeb, 0x95, 0x5a, 0xb5, - 0x60, 0xb8, 0x55, 0x0e, 0xb5, 0x7f, 0xaf, 0x1f, 0x36, 0x95, 0x6b, 0xe0, 0x94, 0x97, 0xbe, 0x5a, - 0x73, 0x05, 0x1d, 0xb2, 0x48, 0xba, 0xa9, 0x5a, 0x24, 0xff, 0x26, 0x41, 0xb6, 0xee, 0x98, 0x5d, - 0xf4, 0x83, 0x41, 0x07, 0x73, 0x1a, 0xc0, 0x22, 0xfb, 0x8f, 0xee, 0x2c, 0x8c, 0xcd, 0xcb, 0x42, - 0x29, 0xe8, 0x0f, 0x85, 0x37, 0x4d, 0x82, 0x3e, 0xdb, 0xec, 0x46, 0xd8, 0x2a, 0xdf, 0x12, 0x3b, - 0x45, 0x12, 0x4d, 0x28, 0x99, 0xbe, 0xff, 0xdc, 0x30, 0xdb, 0x22, 0x08, 0x4e, 0x86, 0x60, 0x73, - 0xe5, 0xef, 0xa9, 0x04, 0x56, 0xae, 0x84, 0x2b, 0x7a, 0x94, 0x8b, 0xe8, 0xd4, 0xa6, 0xf2, 0x03, - 0xf0, 0x98, 0x90, 0x7a, 0x97, 0xd7, 0x6a, 0xe7, 0xca, 0xbe, 0x22, 0x2f, 0x16, 0x1b, 0xc5, 0xc2, - 0x16, 0xfa, 0x94, 0x0c, 0xd9, 0x35, 0x73, 0xaf, 0x77, 0xaf, 0xca, 0xc0, 0x97, 0x42, 0x6b, 0xa1, - 0xde, 0x2b, 0xef, 0x35, 0x2f, 0x24, 0xf6, 0xb5, 0xe8, 0x7d, 0xe9, 0xcf, 0x4a, 0x49, 0xc4, 0xbe, - 0x76, 0xd0, 0xcd, 0xe8, 0x7f, 0x18, 0x46, 0xec, 0x11, 0xa2, 0xc5, 0xca, 0x59, 0x38, 0x1d, 0x7c, - 0xa8, 0x2c, 0x96, 0xab, 0x8d, 0xca, 0xd2, 0xfd, 0x81, 0x70, 0x2b, 0xaa, 0x90, 0xf8, 0x07, 0x75, - 0x63, 0xf1, 0x33, 0x8d, 0x53, 0x70, 0x3c, 0xf8, 0xb6, 0x5c, 0x6e, 0x78, 0x5f, 0x1e, 0x40, 0x0f, - 0xe5, 0x60, 0x86, 0x76, 0xeb, 0x1b, 0xdd, 0xb6, 0xe6, 0x60, 0xf4, 0xa4, 0x00, 0xdd, 0x1b, 0xe1, - 0x68, 0x65, 0x7d, 0xa9, 0x5e, 0x77, 0x4c, 0x4b, 0xdb, 0xc2, 0xc5, 0x76, 0xdb, 0x62, 0xd2, 0xea, - 0x4d, 0x46, 0x6f, 0x17, 0x5e, 0xe7, 0xe3, 0x87, 0x12, 0x5a, 0x66, 0x04, 0xea, 0x5f, 0x10, 0x5a, - 0x97, 0x13, 0x20, 0x98, 0x0c, 0xfd, 0x07, 0x46, 0xdc, 0xe6, 0xa2, 0x71, 0xd9, 0x3c, 0xfb, 0x1c, - 0x09, 0xa6, 0x1a, 0xfa, 0x0e, 0x7e, 0xa6, 0x69, 0x60, 0x5b, 0x99, 0x00, 0x79, 0x79, 0xad, 0x51, - 0x38, 0xe2, 0x3e, 0xb8, 0x46, 0x55, 0x86, 0x3c, 0x94, 0xdd, 0x02, 0xdc, 0x87, 0x62, 0xa3, 0x20, - 0xbb, 0x0f, 0x6b, 0xe5, 0x46, 0x21, 0xeb, 0x3e, 0x54, 0xcb, 0x8d, 0x42, 0xce, 0x7d, 0x58, 0x5f, - 0x6d, 0x14, 0xf2, 0xee, 0x43, 0xa5, 0xde, 0x28, 0x4c, 0xb8, 0x0f, 0x0b, 0xf5, 0x46, 0x61, 0xd2, - 0x7d, 0x38, 0x57, 0x6f, 0x14, 0xa6, 0xdc, 0x87, 0x52, 0xa3, 0x51, 0x00, 0xf7, 0xe1, 0xde, 0x7a, - 0xa3, 0x30, 0xed, 0x3e, 0x14, 0x4b, 0x8d, 0xc2, 0x0c, 0x79, 0x28, 0x37, 0x0a, 0xb3, 0xee, 0x43, - 0xbd, 0xde, 0x28, 0xcc, 0x11, 0xca, 0xf5, 0x46, 0xe1, 0x28, 0x29, 0xab, 0xd2, 0x28, 0x14, 0xdc, - 0x87, 0x95, 0x7a, 0xa3, 0x70, 0x8c, 0x64, 0xae, 0x37, 0x0a, 0x0a, 0x29, 0xb4, 0xde, 0x28, 0x5c, - 0x41, 0xf2, 0xd4, 0x1b, 0x85, 0xe3, 0xa4, 0x88, 0x7a, 0xa3, 0x70, 0x82, 0xb0, 0x51, 0x6e, 0x14, - 0x4e, 0x92, 0x3c, 0x6a, 0xa3, 0x70, 0x25, 0xf9, 0x54, 0x6d, 0x14, 0x4e, 0x11, 0xc6, 0xca, 0x8d, - 0xc2, 0x55, 0xe4, 0x41, 0x6d, 0x14, 0x10, 0xf9, 0x54, 0x6c, 0x14, 0xae, 0x46, 0x8f, 0x81, 0xa9, - 0x65, 0xec, 0x50, 0x10, 0x51, 0x01, 0xe4, 0x65, 0xec, 0x84, 0xcd, 0xf8, 0x2f, 0xc9, 0x70, 0x25, - 0x9b, 0xfa, 0x2d, 0x59, 0xe6, 0xce, 0x2a, 0xde, 0xd2, 0x5a, 0x97, 0xcb, 0x0f, 0xba, 0x26, 0x54, - 0x78, 0x5f, 0x56, 0x81, 0x6c, 0x37, 0xe8, 0x8c, 0xc8, 0x73, 0xac, 0xc5, 0xe9, 0x2d, 0x46, 0xc9, - 0xc1, 0x62, 0x14, 0xb3, 0xc8, 0xfe, 0x39, 0xac, 0xd1, 0xdc, 0xfa, 0x71, 0xa6, 0x67, 0xfd, 0xd8, - 0x6d, 0x26, 0x5d, 0x6c, 0xd9, 0xa6, 0xa1, 0x75, 0xea, 0x6c, 0xe3, 0x9e, 0xae, 0x7a, 0xf5, 0x26, - 0x2b, 0x3f, 0xe2, 0xb5, 0x0c, 0x6a, 0x95, 0x3d, 0x2d, 0x6e, 0x86, 0xdb, 0x5b, 0xcd, 0x88, 0x46, - 0xf2, 0x51, 0xbf, 0x91, 0x34, 0xb8, 0x46, 0x72, 0xcf, 0x01, 0x68, 0x27, 0x6b, 0x2f, 0x95, 0xe1, - 0xa6, 0x16, 0x81, 0x5b, 0xab, 0xb7, 0x5c, 0x2d, 0xa3, 0x4f, 0x49, 0x70, 0xb2, 0x6c, 0xf4, 0xb3, - 0xf0, 0xc3, 0xba, 0xf0, 0x86, 0x30, 0x34, 0xeb, 0xbc, 0x48, 0xef, 0xe8, 0x5b, 0xed, 0xfe, 0x34, - 0x23, 0x24, 0xfa, 0x71, 0x5f, 0xa2, 0x75, 0x4e, 0xa2, 0x77, 0x0f, 0x4f, 0x3a, 0x99, 0x40, 0xab, - 0x23, 0xed, 0x80, 0xb2, 0xe8, 0xab, 0x59, 0x78, 0x0c, 0xf5, 0xbd, 0x61, 0x1c, 0xd2, 0x56, 0x56, - 0x34, 0xda, 0x2a, 0xb6, 0x1d, 0xcd, 0x72, 0xb8, 0xf3, 0xd0, 0x3d, 0x53, 0xa9, 0x4c, 0x0a, 0x53, - 0x29, 0x69, 0xe0, 0x54, 0x0a, 0xbd, 0x2d, 0x6c, 0x3e, 0x9c, 0xe7, 0x31, 0x2e, 0xf6, 0xef, 0xff, - 0xe3, 0x6a, 0x18, 0x05, 0xb5, 0x6f, 0x57, 0xfc, 0x28, 0x07, 0xf5, 0xd2, 0x81, 0x4b, 0x48, 0x86, - 0xf8, 0x1f, 0x8e, 0xd6, 0xce, 0xcb, 0x86, 0xbf, 0xf1, 0x46, 0x49, 0xa1, 0x9d, 0xaa, 0x81, 0xfe, - 0x89, 0x09, 0x98, 0x22, 0x6d, 0x61, 0x55, 0x37, 0x2e, 0xa2, 0x87, 0x65, 0x98, 0xa9, 0xe2, 0x4b, - 0xa5, 0x6d, 0xad, 0xd3, 0xc1, 0xc6, 0x16, 0x0e, 0x9b, 0xed, 0xa7, 0x60, 0x42, 0xeb, 0x76, 0xab, - 0xc1, 0x3e, 0x83, 0xf7, 0xca, 0xfa, 0xdf, 0xaf, 0xf4, 0x6d, 0xe4, 0x99, 0x98, 0x46, 0xee, 0x97, - 0x3b, 0x1f, 0x2e, 0x33, 0x62, 0x86, 0x7c, 0x06, 0xa6, 0x5b, 0x5e, 0x16, 0xff, 0xdc, 0x44, 0x38, - 0x09, 0xfd, 0x5d, 0xa2, 0x6e, 0x40, 0xa8, 0xf0, 0x64, 0x4a, 0x81, 0x47, 0x6c, 0x87, 0x9c, 0x80, - 0x63, 0x8d, 0x5a, 0xad, 0xb9, 0x56, 0xac, 0xde, 0x1f, 0x9c, 0x57, 0xde, 0x44, 0x2f, 0xcd, 0xc2, - 0x5c, 0xdd, 0xec, 0xec, 0xe1, 0x00, 0xa6, 0x0a, 0xe7, 0x90, 0x13, 0x96, 0x53, 0x66, 0x9f, 0x9c, - 0x94, 0x93, 0x90, 0xd7, 0x0c, 0xfb, 0x12, 0xf6, 0x6c, 0x43, 0xf6, 0xc6, 0x60, 0x7c, 0x6f, 0xb8, - 0x1d, 0xab, 0x3c, 0x8c, 0x77, 0x0e, 0x90, 0x24, 0xcf, 0x55, 0x04, 0x90, 0x67, 0x61, 0xc6, 0xa6, - 0x9b, 0x85, 0x8d, 0xd0, 0x9e, 0x30, 0x97, 0x46, 0x58, 0xa4, 0xbb, 0xd5, 0x32, 0x63, 0x91, 0xbc, - 0xa1, 0x87, 0xfd, 0xe6, 0xbf, 0xc1, 0x41, 0x5c, 0x3c, 0x08, 0x63, 0xc9, 0x40, 0x7e, 0xf9, 0xa8, - 0x67, 0x78, 0xa7, 0xe0, 0x38, 0x6b, 0xb5, 0xcd, 0xd2, 0x4a, 0x71, 0x75, 0xb5, 0x5c, 0x5d, 0x2e, - 0x37, 0x2b, 0x8b, 0x74, 0xab, 0x22, 0x48, 0x29, 0x36, 0x1a, 0xe5, 0xb5, 0xf5, 0x46, 0xbd, 0x59, - 0x7e, 0x46, 0xa9, 0x5c, 0x5e, 0x24, 0x2e, 0x71, 0xe4, 0x4c, 0x8b, 0xe7, 0xbc, 0x58, 0xac, 0xd6, - 0xcf, 0x97, 0xd5, 0xc2, 0xf6, 0xd9, 0x22, 0x4c, 0x87, 0xfa, 0x79, 0x97, 0xbb, 0x45, 0xbc, 0xa9, - 0xed, 0x76, 0x98, 0xad, 0x56, 0x38, 0xe2, 0x72, 0x47, 0x64, 0x53, 0x33, 0x3a, 0x97, 0x0b, 0x19, - 0xa5, 0x00, 0x33, 0xe1, 0x2e, 0xbd, 0x20, 0xa1, 0x37, 0x5f, 0x03, 0x53, 0xe7, 0x4d, 0xeb, 0x22, - 0xf1, 0xe3, 0x42, 0xef, 0xa2, 0x71, 0x4d, 0xbc, 0x13, 0xa2, 0xa1, 0x81, 0xfd, 0xe5, 0xe2, 0xde, - 0x02, 0x1e, 0xb5, 0xf9, 0x81, 0xa7, 0x40, 0xcf, 0xc0, 0xf4, 0x25, 0x2f, 0x77, 0xd0, 0xd2, 0x43, - 0x49, 0xe8, 0xbf, 0x89, 0xed, 0xff, 0x0f, 0x2e, 0x32, 0xfd, 0xfd, 0xe9, 0x37, 0x49, 0x90, 0x5f, - 0xc6, 0x4e, 0xb1, 0xd3, 0x09, 0xcb, 0xed, 0x45, 0xc2, 0x27, 0x7b, 0xb8, 0x4a, 0x14, 0x3b, 0x9d, - 0xe8, 0x46, 0x15, 0x12, 0x90, 0xe7, 0x81, 0xce, 0xa5, 0x09, 0xfa, 0xcd, 0x0d, 0x28, 0x30, 0x7d, - 0x89, 0xbd, 0x5f, 0xf6, 0xf7, 0xb8, 0x1f, 0x09, 0x59, 0x39, 0x4f, 0x0c, 0x62, 0xda, 0x64, 0xe2, - 0xf7, 0xca, 0xbd, 0x7c, 0xca, 0x7d, 0x30, 0xb1, 0x6b, 0xe3, 0x92, 0x66, 0x63, 0xc2, 0x5b, 0x6f, - 0x4d, 0x6b, 0x17, 0x1e, 0xc0, 0x2d, 0x67, 0xbe, 0xb2, 0xe3, 0x1a, 0xd4, 0x1b, 0x34, 0xa3, 0x1f, - 0x26, 0x86, 0xbd, 0xab, 0x1e, 0x05, 0x77, 0x52, 0x72, 0x49, 0x77, 0xb6, 0x4b, 0xdb, 0x9a, 0xc3, - 0xd6, 0xb6, 0xfd, 0x77, 0xf4, 0x82, 0x21, 0xe0, 0x8c, 0xdd, 0x0b, 0x8e, 0x3c, 0x20, 0x98, 0x18, - 0xc4, 0x11, 0x6c, 0xe0, 0x0e, 0x03, 0xe2, 0x3f, 0x4a, 0x90, 0xad, 0x75, 0xb1, 0x21, 0x7c, 0x1a, - 0xc6, 0x97, 0xad, 0xd4, 0x23, 0xdb, 0x87, 0xc5, 0xbd, 0xc3, 0xfc, 0x4a, 0xbb, 0x25, 0x47, 0x48, - 0xf6, 0x16, 0xc8, 0xea, 0xc6, 0xa6, 0xc9, 0x0c, 0xd3, 0xab, 0x23, 0x36, 0x81, 0x2a, 0xc6, 0xa6, - 0xa9, 0x92, 0x8c, 0xa2, 0x8e, 0x61, 0x71, 0x65, 0xa7, 0x2f, 0xee, 0xaf, 0x4d, 0x42, 0x9e, 0xaa, - 0x33, 0x7a, 0xa1, 0x0c, 0x72, 0xb1, 0xdd, 0x8e, 0x10, 0xbc, 0xb4, 0x4f, 0xf0, 0x26, 0xf9, 0xcd, - 0xc7, 0xc4, 0x7f, 0xe7, 0x83, 0x99, 0x08, 0xf6, 0xed, 0xac, 0x49, 0x15, 0xdb, 0xed, 0x68, 0x1f, - 0x54, 0xbf, 0x40, 0x89, 0x2f, 0x30, 0xdc, 0xc2, 0x65, 0xb1, 0x16, 0x9e, 0x78, 0x20, 0x88, 0xe4, - 0x2f, 0x7d, 0x88, 0xfe, 0x59, 0x82, 0x89, 0x55, 0xdd, 0x76, 0x5c, 0x6c, 0x8a, 0x22, 0xd8, 0x5c, - 0x03, 0x53, 0x9e, 0x68, 0xdc, 0x2e, 0xcf, 0xed, 0xcf, 0x83, 0x04, 0xf4, 0xaa, 0x30, 0x3a, 0xf7, - 0xf2, 0xe8, 0x3c, 0x39, 0xbe, 0xf6, 0x8c, 0x8b, 0xe8, 0x53, 0x06, 0x41, 0xb1, 0x52, 0x6f, 0xb1, - 0xbf, 0xed, 0x0b, 0x7c, 0x8d, 0x13, 0xf8, 0xed, 0xc3, 0x14, 0x99, 0xbe, 0xd0, 0x3f, 0x2d, 0x01, - 0xb8, 0x65, 0xb3, 0xa3, 0x5c, 0x8f, 0xe3, 0x0e, 0x68, 0xc7, 0x48, 0xf7, 0xa5, 0x61, 0xe9, 0xae, - 0xf1, 0xd2, 0xfd, 0xe1, 0xc1, 0x55, 0x8d, 0x3b, 0xb2, 0xa5, 0x14, 0x40, 0xd6, 0x7d, 0xd1, 0xba, - 0x8f, 0xe8, 0x4d, 0xbe, 0x50, 0xd7, 0x39, 0xa1, 0xde, 0x39, 0x64, 0x49, 0xe9, 0xcb, 0xf5, 0xaf, - 0x24, 0x98, 0xa8, 0x63, 0xc7, 0xed, 0x26, 0xd1, 0x39, 0x91, 0x1e, 0x3e, 0xd4, 0xb6, 0x25, 0xc1, - 0xb6, 0xfd, 0xcd, 0x8c, 0x68, 0xa0, 0x97, 0x40, 0x32, 0x8c, 0xa7, 0x88, 0xc5, 0x83, 0x47, 0x84, - 0x02, 0xbd, 0x0c, 0xa2, 0x96, 0xbe, 0x74, 0xdf, 0x20, 0xf9, 0x1b, 0xf3, 0xfc, 0x49, 0x8b, 0xb0, - 0x59, 0x9c, 0xd9, 0x6f, 0x16, 0x8b, 0x9f, 0xb4, 0x08, 0xd7, 0x31, 0x7a, 0x57, 0x3a, 0xb1, 0xb1, - 0x31, 0x82, 0x0d, 0xe3, 0x61, 0xe4, 0xf5, 0x6c, 0x19, 0xf2, 0x6c, 0x65, 0xf9, 0xee, 0xf8, 0x95, - 0xe5, 0xc1, 0x53, 0x8b, 0x77, 0x0e, 0x61, 0xca, 0xc5, 0x2d, 0xf7, 0xfa, 0x6c, 0x48, 0x21, 0x36, - 0x6e, 0x86, 0x1c, 0x89, 0x44, 0xc9, 0xc6, 0xb9, 0x60, 0xaf, 0xdf, 0x23, 0x51, 0x76, 0xbf, 0xaa, - 0x34, 0x53, 0x62, 0x14, 0x46, 0xb0, 0x42, 0x3c, 0x0c, 0x0a, 0x6f, 0x57, 0x00, 0xd6, 0x77, 0x2f, - 0x74, 0x74, 0x7b, 0x5b, 0x37, 0xb6, 0xd0, 0x77, 0x33, 0x30, 0xc3, 0x5e, 0x69, 0x40, 0xc5, 0x58, - 0xf3, 0x2f, 0xd2, 0x28, 0x28, 0x80, 0xbc, 0x6b, 0xe9, 0x6c, 0x19, 0xc0, 0x7d, 0x54, 0xee, 0xf2, - 0x1d, 0x79, 0xb2, 0x3d, 0x47, 0xe9, 0x5d, 0x31, 0x04, 0x1c, 0xcc, 0x87, 0x4a, 0x0f, 0x1c, 0x7a, - 0xc2, 0x51, 0x33, 0x73, 0x7c, 0xd4, 0x4c, 0xee, 0x7c, 0x5d, 0xbe, 0xe7, 0x7c, 0x9d, 0x8b, 0xa3, - 0xad, 0x3f, 0x13, 0x13, 0xe7, 0x52, 0x59, 0x25, 0xcf, 0xee, 0x1f, 0x0f, 0x98, 0xba, 0x41, 0x36, - 0x0b, 0x98, 0xeb, 0x68, 0x90, 0x80, 0xde, 0x17, 0x4c, 0x64, 0x4c, 0x41, 0x2b, 0x38, 0x81, 0x18, - 0xb8, 0xb2, 0xb3, 0xbd, 0x65, 0x7f, 0x50, 0x38, 0x4a, 0x56, 0x48, 0x60, 0xb1, 0x53, 0x12, 0xc6, - 0x81, 0xe4, 0x73, 0x10, 0xda, 0xed, 0x8b, 0xeb, 0x4e, 0x07, 0xd1, 0x4f, 0xa6, 0x98, 0x3b, 0x43, - 0x2c, 0xbe, 0x28, 0x30, 0xe7, 0x9d, 0x3a, 0xac, 0x2d, 0xdc, 0x5b, 0x2e, 0x35, 0x0a, 0x78, 0xff, - 0x49, 0x44, 0x72, 0xe6, 0x90, 0x9e, 0x2f, 0x0c, 0x16, 0x58, 0xd0, 0xff, 0x90, 0x20, 0xcf, 0x6c, - 0x87, 0xbb, 0x0f, 0x08, 0x21, 0x7a, 0xd9, 0x30, 0x90, 0xc4, 0x1e, 0xfe, 0xfe, 0x58, 0x52, 0x00, - 0x46, 0x60, 0x2d, 0xdc, 0x9f, 0x1a, 0x00, 0xe8, 0x5f, 0x25, 0xc8, 0xba, 0x36, 0x8d, 0xd8, 0xd1, - 0xda, 0x8f, 0x0a, 0x3b, 0xb5, 0x86, 0x04, 0xe0, 0x92, 0x8f, 0xd0, 0xef, 0x05, 0x98, 0xea, 0xd2, - 0x8c, 0xfe, 0xc1, 0xee, 0xeb, 0x05, 0x7a, 0x16, 0xac, 0x06, 0xbf, 0xa1, 0x77, 0x08, 0x39, 0xc6, - 0xc6, 0xf3, 0x93, 0x0c, 0x8e, 0xf2, 0x28, 0x4e, 0xe1, 0x6e, 0xa2, 0x6f, 0x4b, 0x00, 0x2a, 0xb6, - 0xcd, 0xce, 0x1e, 0xde, 0xb0, 0x74, 0x74, 0x75, 0x00, 0x00, 0x6b, 0xf6, 0x99, 0xa0, 0xd9, 0x7f, - 0x22, 0x2c, 0xf8, 0x65, 0x5e, 0xf0, 0x4f, 0x8c, 0xd6, 0x3c, 0x8f, 0x78, 0x84, 0xf8, 0x9f, 0x0e, - 0x13, 0x4c, 0x8e, 0xcc, 0x40, 0x14, 0x13, 0xbe, 0xf7, 0x13, 0x7a, 0xb7, 0x2f, 0xfa, 0x7b, 0x39, - 0xd1, 0x3f, 0x25, 0x31, 0x47, 0xc9, 0x00, 0x28, 0x0d, 0x01, 0xc0, 0x51, 0x98, 0xf6, 0x00, 0xd8, - 0x50, 0x2b, 0x05, 0x8c, 0xde, 0x2a, 0x93, 0xbd, 0x74, 0x3a, 0x52, 0x1d, 0xbc, 0xa7, 0xf9, 0xb2, - 0xf0, 0xcc, 0x3d, 0x24, 0x0f, 0xbf, 0xfc, 0x94, 0x00, 0xfa, 0x53, 0xa1, 0xa9, 0xba, 0x00, 0x43, - 0x8f, 0x96, 0xfe, 0xea, 0x6c, 0x19, 0x66, 0x39, 0x13, 0x43, 0x39, 0x05, 0xc7, 0xb9, 0x04, 0x3a, - 0xde, 0xb5, 0x0b, 0x47, 0x14, 0x04, 0x27, 0xb9, 0x2f, 0xec, 0x05, 0xb7, 0x0b, 0x19, 0xf4, 0x0b, - 0x7f, 0x9e, 0xf1, 0x17, 0x6f, 0xde, 0x99, 0x65, 0xcb, 0x66, 0x1f, 0xe6, 0x63, 0x89, 0xb5, 0x4c, - 0xc3, 0xc1, 0x0f, 0x86, 0x7c, 0x19, 0xfc, 0x84, 0x58, 0xab, 0xe1, 0x14, 0x4c, 0x38, 0x56, 0xd8, - 0xbf, 0xc1, 0x7b, 0x0d, 0x2b, 0x56, 0x8e, 0x57, 0xac, 0x2a, 0x9c, 0xd5, 0x8d, 0x56, 0x67, 0xb7, - 0x8d, 0x55, 0xdc, 0xd1, 0x5c, 0x19, 0xda, 0x45, 0x7b, 0x11, 0x77, 0xb1, 0xd1, 0xc6, 0x86, 0x43, - 0xf9, 0xf4, 0xce, 0x32, 0x09, 0xe4, 0xe4, 0x95, 0xf1, 0x2e, 0x5e, 0x19, 0x1f, 0xd7, 0x6f, 0x3d, - 0x36, 0x66, 0xf1, 0xee, 0x76, 0x00, 0x5a, 0xb7, 0x73, 0x3a, 0xbe, 0xc4, 0xd4, 0xf0, 0xaa, 0x9e, - 0x25, 0xbc, 0x9a, 0x9f, 0x41, 0x0d, 0x65, 0x46, 0x9f, 0xf7, 0xd5, 0xef, 0x1e, 0x4e, 0xfd, 0x6e, - 0x16, 0x64, 0x21, 0x99, 0xd6, 0x75, 0x87, 0xd0, 0xba, 0x59, 0x98, 0x0a, 0x76, 0x76, 0x65, 0xe5, - 0x2a, 0x38, 0xe1, 0xf9, 0x8a, 0x56, 0xcb, 0xe5, 0xc5, 0x7a, 0x73, 0x63, 0x7d, 0x59, 0x2d, 0x2e, - 0x96, 0x0b, 0xe0, 0xea, 0x27, 0xd5, 0x4b, 0xdf, 0xc5, 0x33, 0x8b, 0xfe, 0x42, 0x82, 0x1c, 0x39, - 0x88, 0x87, 0x7e, 0x7c, 0x44, 0x9a, 0x63, 0x73, 0x9e, 0x31, 0xfe, 0xb8, 0x2b, 0x1e, 0xe3, 0x9b, - 0x09, 0x93, 0x70, 0x75, 0xa0, 0x18, 0xdf, 0x31, 0x84, 0xd2, 0x9f, 0xd6, 0xb8, 0x4d, 0xb2, 0xbe, - 0x6d, 0x5e, 0xfa, 0x7e, 0x6e, 0x92, 0x6e, 0xfd, 0x0f, 0xb9, 0x49, 0xf6, 0x61, 0x61, 0xec, 0x4d, - 0xb2, 0x4f, 0xbb, 0x8b, 0x69, 0xa6, 0xe8, 0x59, 0x39, 0x7f, 0xfe, 0xf7, 0x1c, 0xe9, 0x40, 0x1b, - 0x59, 0x45, 0x98, 0xd5, 0x0d, 0x07, 0x5b, 0x86, 0xd6, 0x59, 0xea, 0x68, 0x5b, 0x9e, 0x7d, 0xda, - 0xbb, 0x7b, 0x51, 0x09, 0xe5, 0x51, 0xf9, 0x3f, 0x94, 0xd3, 0x00, 0x0e, 0xde, 0xe9, 0x76, 0x34, - 0x27, 0x50, 0xbd, 0x50, 0x4a, 0x58, 0xfb, 0xb2, 0xbc, 0xf6, 0xdd, 0x0a, 0x57, 0x50, 0xd0, 0x1a, - 0x97, 0xbb, 0x78, 0xc3, 0xd0, 0x7f, 0x62, 0x97, 0x84, 0x9e, 0xa4, 0x3a, 0xda, 0xef, 0x13, 0xb7, - 0x9d, 0x93, 0xef, 0xd9, 0xce, 0xf9, 0x47, 0xe1, 0x90, 0x16, 0x5e, 0xab, 0x1f, 0x10, 0xd2, 0xc2, - 0x6f, 0x69, 0x72, 0x4f, 0x4b, 0xf3, 0x17, 0x59, 0xb2, 0x02, 0x8b, 0x2c, 0x61, 0x54, 0x72, 0x82, - 0x0b, 0x94, 0xaf, 0x14, 0x8a, 0x99, 0x11, 0x57, 0x8d, 0x31, 0x2c, 0x80, 0xcb, 0x30, 0x47, 0x8b, - 0x5e, 0x30, 0xcd, 0x8b, 0x3b, 0x9a, 0x75, 0x11, 0x59, 0x07, 0x52, 0xc5, 0xd8, 0xbd, 0xa4, 0xc8, - 0x0d, 0xd2, 0x8f, 0x0b, 0xcf, 0x19, 0x38, 0x71, 0x79, 0x3c, 0x8f, 0x67, 0x33, 0xe9, 0x75, 0x42, - 0x53, 0x08, 0x11, 0x06, 0xd3, 0xc7, 0xf5, 0x8f, 0x7d, 0x5c, 0xbd, 0x8e, 0x3e, 0xbc, 0x0e, 0x3f, - 0x4a, 0x5c, 0xd1, 0x17, 0x86, 0xc3, 0xce, 0xe3, 0x6b, 0x08, 0xec, 0x0a, 0x20, 0x5f, 0xf4, 0x5d, - 0x7f, 0xdc, 0xc7, 0x70, 0x85, 0xb2, 0xe9, 0xa1, 0x19, 0xc1, 0xf2, 0x58, 0xd0, 0x3c, 0xce, 0xb3, - 0x50, 0xeb, 0xa6, 0x8a, 0xe9, 0xe7, 0x84, 0xf7, 0xb7, 0xfa, 0x0a, 0x88, 0x72, 0x37, 0x9e, 0x56, - 0x29, 0xb6, 0x39, 0x26, 0xce, 0x66, 0xfa, 0x68, 0x3e, 0x3f, 0x07, 0x53, 0x5e, 0xd0, 0x11, 0x72, - 0x27, 0x8e, 0x8f, 0xe1, 0x49, 0xc8, 0xdb, 0xe6, 0xae, 0xd5, 0xc2, 0x6c, 0xc7, 0x91, 0xbd, 0x0d, - 0xb1, 0x3b, 0x36, 0x70, 0x3c, 0xdf, 0x67, 0x32, 0x64, 0x13, 0x9b, 0x0c, 0xd1, 0x06, 0x69, 0xdc, - 0x00, 0xff, 0x02, 0xe1, 0x40, 0xe6, 0x1c, 0x66, 0x75, 0xec, 0x3c, 0x1a, 0xc7, 0xf8, 0x3f, 0x10, - 0xda, 0x7b, 0x19, 0x50, 0x93, 0x64, 0x2a, 0x57, 0x1b, 0xc2, 0x50, 0xbd, 0x1a, 0xae, 0xf4, 0x72, - 0x30, 0x0b, 0x95, 0x58, 0xa4, 0x1b, 0xea, 0x6a, 0x41, 0x46, 0xcf, 0xce, 0x42, 0x81, 0xb2, 0x56, - 0xf3, 0x8d, 0x35, 0xf4, 0xa2, 0xcc, 0x61, 0x5b, 0xa4, 0xd1, 0x53, 0xcc, 0x4f, 0x4a, 0xa2, 0xc1, - 0x52, 0x39, 0xc1, 0x07, 0xb5, 0x8b, 0xd0, 0xa4, 0x21, 0x9a, 0x59, 0x8c, 0xf2, 0xa1, 0xdf, 0xca, - 0x88, 0xc4, 0x5e, 0x15, 0x63, 0x31, 0xfd, 0x5e, 0xe9, 0x33, 0x59, 0x2f, 0x76, 0xd4, 0x92, 0x65, - 0xee, 0x6c, 0x58, 0x1d, 0xf4, 0x7f, 0x0b, 0x85, 0xb6, 0x8e, 0x30, 0xff, 0xa5, 0x68, 0xf3, 0x9f, - 0x2c, 0x19, 0x77, 0x82, 0xbd, 0xaa, 0xce, 0x10, 0xc3, 0xb7, 0x72, 0x03, 0xcc, 0x69, 0xed, 0xf6, - 0xba, 0xb6, 0x85, 0x4b, 0xee, 0xbc, 0xda, 0x70, 0x58, 0x5c, 0x99, 0x9e, 0xd4, 0xd8, 0xae, 0x48, - 0x7c, 0x1d, 0x94, 0x03, 0x89, 0xc9, 0x67, 0x2c, 0xc3, 0x9b, 0x3b, 0x24, 0xb4, 0xb6, 0xb5, 0x20, - 0xca, 0x15, 0x7b, 0x13, 0xf4, 0x6c, 0x12, 0xe0, 0x3b, 0x7d, 0xcd, 0xfa, 0x3d, 0x09, 0x26, 0x5c, - 0x79, 0x17, 0xdb, 0x6d, 0xf4, 0x58, 0x2e, 0x18, 0x5c, 0xa4, 0x6f, 0xd9, 0xcf, 0x0a, 0x3b, 0xf5, - 0x79, 0x35, 0xa4, 0xf4, 0x23, 0x30, 0x09, 0x84, 0x28, 0x71, 0x42, 0x14, 0xf3, 0xdd, 0x8b, 0x2d, - 0x22, 0x7d, 0xf1, 0x7d, 0x54, 0x82, 0x59, 0x6f, 0x1e, 0xb1, 0x84, 0x9d, 0xd6, 0x36, 0xba, 0x5d, - 0x74, 0xa1, 0x89, 0xb5, 0x34, 0x7f, 0x4f, 0xb6, 0x83, 0xbe, 0x93, 0x49, 0xa8, 0xf2, 0x5c, 0xc9, - 0x11, 0xab, 0x74, 0x89, 0x74, 0x31, 0x8e, 0x60, 0xfa, 0xc2, 0xfc, 0xbc, 0x04, 0xd0, 0x30, 0xfd, - 0xb9, 0xee, 0x01, 0x24, 0xf9, 0x2b, 0xc2, 0xdb, 0xb5, 0xac, 0xe2, 0x41, 0xb1, 0xc9, 0x7b, 0x0e, - 0x41, 0xd7, 0xa4, 0x41, 0x25, 0x8d, 0xa5, 0xad, 0x4f, 0x2d, 0xee, 0x76, 0x3b, 0x7a, 0x4b, 0x73, - 0x7a, 0xfd, 0xe9, 0xa2, 0xc5, 0x4b, 0x2e, 0x8c, 0x4c, 0x64, 0x14, 0xfa, 0x65, 0x44, 0xc8, 0x92, - 0x06, 0x29, 0x91, 0xbc, 0x20, 0x25, 0x82, 0x3e, 0x32, 0x03, 0x88, 0x8f, 0x41, 0x3d, 0x65, 0x38, - 0x5a, 0xeb, 0x62, 0x63, 0xc1, 0xc2, 0x5a, 0xbb, 0x65, 0xed, 0xee, 0x5c, 0xb0, 0xc3, 0xce, 0xa0, - 0xf1, 0x3a, 0x1a, 0x5a, 0x3a, 0x96, 0xb8, 0xa5, 0x63, 0xf4, 0x33, 0xb2, 0x68, 0xc8, 0x9c, 0xd0, - 0x06, 0x47, 0x88, 0x87, 0x21, 0x86, 0xba, 0x44, 0x2e, 0x4c, 0x3d, 0xab, 0xc4, 0xd9, 0x24, 0xab, - 0xc4, 0xaf, 0x17, 0x0a, 0xc0, 0x23, 0x54, 0xaf, 0xb1, 0x78, 0xa2, 0xcd, 0xd5, 0xb1, 0x13, 0x01, - 0xef, 0xf5, 0x30, 0x7b, 0x21, 0xf8, 0xe2, 0x43, 0xcc, 0x27, 0xf6, 0xf1, 0x0f, 0x7d, 0x43, 0xd2, - 0x15, 0x18, 0x9e, 0x85, 0x08, 0x74, 0x7d, 0x04, 0x25, 0x11, 0x27, 0xb4, 0x44, 0xcb, 0x29, 0xb1, - 0xe5, 0xa7, 0x8f, 0xc2, 0x07, 0x25, 0x98, 0x26, 0xd7, 0x60, 0x2e, 0x5c, 0x26, 0xa7, 0x1a, 0x05, - 0x8d, 0x92, 0xe7, 0x87, 0xc5, 0xac, 0x40, 0xb6, 0xa3, 0x1b, 0x17, 0x3d, 0xef, 0x41, 0xf7, 0x39, - 0xb8, 0x54, 0x4d, 0xea, 0x73, 0xa9, 0x9a, 0xbf, 0x4f, 0xe1, 0x97, 0x7b, 0xa0, 0x5b, 0x7e, 0x07, - 0x92, 0x4b, 0x5f, 0x8c, 0x7f, 0x9f, 0x85, 0x7c, 0x1d, 0x6b, 0x56, 0x6b, 0x1b, 0xbd, 0x53, 0xea, - 0x3b, 0x55, 0x98, 0xe4, 0xa7, 0x0a, 0x4b, 0x30, 0xb1, 0xa9, 0x77, 0x1c, 0x6c, 0x51, 0x8f, 0xea, - 0x70, 0xd7, 0x4e, 0x9b, 0xf8, 0x42, 0xc7, 0x6c, 0x5d, 0x9c, 0x67, 0xa6, 0xfb, 0xbc, 0x17, 0x84, - 0x73, 0x7e, 0x89, 0xfc, 0xa4, 0x7a, 0x3f, 0xbb, 0x06, 0xa1, 0x6d, 0x5a, 0x4e, 0xd4, 0xfd, 0x0a, - 0x11, 0x54, 0xea, 0xa6, 0xe5, 0xa8, 0xf4, 0x47, 0x17, 0xe6, 0xcd, 0xdd, 0x4e, 0xa7, 0x81, 0x1f, - 0x74, 0xbc, 0x69, 0x9b, 0xf7, 0xee, 0x1a, 0x8b, 0xe6, 0xe6, 0xa6, 0x8d, 0xe9, 0xa2, 0x41, 0x4e, - 0x65, 0x6f, 0xca, 0x71, 0xc8, 0x75, 0xf4, 0x1d, 0x9d, 0x4e, 0x34, 0x72, 0x2a, 0x7d, 0x51, 0x6e, - 0x82, 0x42, 0x30, 0xc7, 0xa1, 0x8c, 0x9e, 0xca, 0x93, 0xa6, 0xb9, 0x2f, 0xdd, 0xd5, 0x99, 0x8b, - 0xf8, 0xb2, 0x7d, 0x6a, 0x82, 0x7c, 0x27, 0xcf, 0xfc, 0xf1, 0x15, 0x91, 0xfd, 0x0e, 0x2a, 0xf1, - 0xe8, 0x19, 0xac, 0x85, 0x5b, 0xa6, 0xd5, 0xf6, 0x64, 0x13, 0x3d, 0xc1, 0x60, 0xf9, 0x92, 0xed, - 0x52, 0xf4, 0x2d, 0x3c, 0x7d, 0x4d, 0x7b, 0x5b, 0xde, 0xed, 0x36, 0xdd, 0xa2, 0xcf, 0xeb, 0xce, - 0xf6, 0x1a, 0x76, 0x34, 0xf4, 0xf7, 0x72, 0x5f, 0x8d, 0x9b, 0xfe, 0xdf, 0x1a, 0x37, 0x40, 0xe3, - 0x68, 0x78, 0x25, 0x67, 0xd7, 0x32, 0x5c, 0x39, 0x32, 0xaf, 0xd4, 0x50, 0x8a, 0x72, 0x27, 0x5c, - 0x15, 0xbc, 0x79, 0x4b, 0xa5, 0x8b, 0x6c, 0xda, 0x3a, 0x45, 0xb2, 0x47, 0x67, 0x50, 0xd6, 0xe1, - 0x3a, 0xfa, 0x71, 0xa5, 0xb1, 0xb6, 0xba, 0xa2, 0x6f, 0x6d, 0x77, 0xf4, 0xad, 0x6d, 0xc7, 0xae, - 0x18, 0xb6, 0x83, 0xb5, 0x76, 0x6d, 0x53, 0xa5, 0x37, 0xa3, 0x00, 0xa1, 0x23, 0x92, 0x95, 0xf7, - 0xb8, 0x16, 0x1b, 0xdd, 0xc2, 0x9a, 0x12, 0xd1, 0x52, 0x9e, 0xe2, 0xb6, 0x14, 0x7b, 0xb7, 0xe3, - 0x63, 0x7a, 0x4d, 0x0f, 0xa6, 0x81, 0xaa, 0xef, 0x76, 0x48, 0x73, 0x21, 0x99, 0x93, 0x8e, 0x73, - 0x31, 0x9c, 0xa4, 0xdf, 0x6c, 0xfe, 0xbf, 0x3c, 0xe4, 0x96, 0x2d, 0xad, 0xbb, 0x8d, 0x9e, 0x1d, - 0xea, 0x9f, 0x47, 0xd5, 0x26, 0x7c, 0xed, 0x94, 0x06, 0x69, 0xa7, 0x3c, 0x40, 0x3b, 0xb3, 0x21, - 0xed, 0x8c, 0x5e, 0x54, 0x3e, 0x0b, 0x33, 0x2d, 0xb3, 0xd3, 0xc1, 0x2d, 0x57, 0x1e, 0x95, 0x36, - 0x59, 0xcd, 0x99, 0x52, 0xb9, 0x34, 0x12, 0xa8, 0x18, 0x3b, 0x75, 0xba, 0x86, 0x4e, 0x95, 0x3e, - 0x48, 0x40, 0x2f, 0x92, 0x20, 0x5b, 0x6e, 0x6f, 0x61, 0x6e, 0x9d, 0x3d, 0x13, 0x5a, 0x67, 0x3f, - 0x09, 0x79, 0x47, 0xb3, 0xb6, 0xb0, 0xe3, 0xad, 0x13, 0xd0, 0x37, 0x3f, 0x7e, 0xb2, 0x1c, 0x8a, - 0x9f, 0xfc, 0xc3, 0x90, 0x75, 0x65, 0xc6, 0x9c, 0xcc, 0xaf, 0xeb, 0x07, 0x3f, 0x91, 0xfd, 0xbc, - 0x5b, 0xe2, 0xbc, 0x5b, 0x6b, 0x95, 0xfc, 0xd0, 0x8b, 0x75, 0x6e, 0x1f, 0xd6, 0xe4, 0x92, 0xc7, - 0x96, 0x69, 0x54, 0x76, 0xb4, 0x2d, 0xcc, 0xaa, 0x19, 0x24, 0x78, 0x5f, 0xcb, 0x3b, 0xe6, 0x03, - 0x3a, 0x0b, 0x65, 0x1c, 0x24, 0xb8, 0x55, 0xd8, 0xd6, 0xdb, 0x6d, 0x6c, 0xb0, 0x96, 0xcd, 0xde, - 0xce, 0x9e, 0x86, 0xac, 0xcb, 0x83, 0xab, 0x3f, 0xae, 0xb1, 0x50, 0x38, 0xa2, 0xcc, 0xb8, 0xcd, - 0x8a, 0x36, 0xde, 0x42, 0x86, 0x5f, 0x53, 0x15, 0x71, 0xdb, 0xa1, 0x95, 0xeb, 0xdf, 0xb8, 0x9e, - 0x00, 0x39, 0xc3, 0x6c, 0xe3, 0x81, 0x83, 0x10, 0xcd, 0xa5, 0x3c, 0x19, 0x72, 0xb8, 0xed, 0xf6, - 0x0a, 0x32, 0xc9, 0x7e, 0x3a, 0x5e, 0x96, 0x2a, 0xcd, 0x9c, 0xcc, 0x37, 0xa8, 0x1f, 0xb7, 0xe9, - 0x37, 0xc0, 0x9f, 0x9f, 0x80, 0xa3, 0xb4, 0x0f, 0xa8, 0xef, 0x5e, 0x70, 0x49, 0x5d, 0xc0, 0xe8, - 0x91, 0xfe, 0x03, 0xd7, 0x51, 0x5e, 0xd9, 0x8f, 0x43, 0xce, 0xde, 0xbd, 0xe0, 0x1b, 0xa1, 0xf4, - 0x25, 0xdc, 0x74, 0xa5, 0x91, 0x0c, 0x67, 0xf2, 0xb0, 0xc3, 0x19, 0x37, 0x34, 0xc9, 0x5e, 0xe3, - 0x0f, 0x06, 0x32, 0x7a, 0x3c, 0xc2, 0x1b, 0xc8, 0xfa, 0x0d, 0x43, 0xa7, 0x60, 0x42, 0xdb, 0x74, - 0xb0, 0x15, 0x98, 0x89, 0xec, 0xd5, 0x1d, 0x2a, 0x2f, 0xe0, 0x4d, 0xd3, 0x72, 0xc5, 0x32, 0x45, - 0x87, 0x4a, 0xef, 0x3d, 0xd4, 0x72, 0x81, 0xdb, 0x21, 0xbb, 0x19, 0x8e, 0x19, 0xe6, 0x22, 0xee, - 0x32, 0x39, 0x53, 0x14, 0x67, 0x49, 0x0b, 0xd8, 0xff, 0x61, 0x5f, 0x57, 0x32, 0xb7, 0xbf, 0x2b, - 0x41, 0x9f, 0x48, 0x3a, 0x67, 0xee, 0x01, 0x7a, 0x64, 0x16, 0x9a, 0xf2, 0x34, 0x98, 0x69, 0x33, - 0x17, 0xad, 0x96, 0xee, 0xb7, 0x92, 0xc8, 0xff, 0xb8, 0xcc, 0x81, 0x22, 0x65, 0xc3, 0x8a, 0xb4, - 0x0c, 0x93, 0xe4, 0x20, 0xb3, 0xab, 0x49, 0xb9, 0x1e, 0x97, 0x78, 0x32, 0xad, 0xf3, 0x2b, 0x15, - 0x12, 0xdb, 0x7c, 0x89, 0xfd, 0xa2, 0xfa, 0x3f, 0x27, 0x9b, 0x7d, 0xc7, 0x4b, 0x28, 0xfd, 0xe6, - 0xf8, 0xdb, 0x79, 0xb8, 0xaa, 0x64, 0x99, 0xb6, 0x4d, 0xce, 0xc0, 0xf4, 0x36, 0xcc, 0xd7, 0x4a, - 0xdc, 0x4d, 0x0a, 0x8f, 0xea, 0xe6, 0xd7, 0xaf, 0x41, 0x8d, 0xaf, 0x69, 0x7c, 0x59, 0x38, 0x04, - 0x8c, 0xbf, 0xff, 0x10, 0x21, 0xf4, 0xef, 0x8f, 0x46, 0xf2, 0xb6, 0x8c, 0x48, 0x54, 0x9a, 0x84, - 0xb2, 0x4a, 0xbf, 0xb9, 0x7c, 0x4e, 0x82, 0xab, 0x7b, 0xb9, 0xd9, 0x30, 0x6c, 0xbf, 0xc1, 0x5c, - 0x3b, 0xa0, 0xbd, 0xf0, 0x51, 0x4c, 0x62, 0xef, 0x30, 0x8c, 0xa8, 0x7b, 0xa8, 0xb4, 0x88, 0xc5, - 0x92, 0xe0, 0x44, 0x4d, 0xdc, 0x1d, 0x86, 0x89, 0xc9, 0xa7, 0x2f, 0xdc, 0x4f, 0x66, 0xe1, 0xe8, - 0xb2, 0x65, 0xee, 0x76, 0xed, 0xa0, 0x07, 0xfa, 0x9b, 0xfe, 0x1b, 0xae, 0x79, 0x11, 0xd3, 0xe0, - 0x0c, 0x4c, 0x5b, 0xcc, 0x9a, 0x0b, 0xb6, 0x5f, 0xc3, 0x49, 0xe1, 0xde, 0x4b, 0x3e, 0x48, 0xef, - 0x15, 0xf4, 0x33, 0x59, 0xae, 0x9f, 0xe9, 0xed, 0x39, 0x72, 0x7d, 0x7a, 0x8e, 0xbf, 0x96, 0x12, - 0x0e, 0xaa, 0x3d, 0x22, 0x8a, 0xe8, 0x2f, 0x4a, 0x90, 0xdf, 0x22, 0x19, 0x59, 0x77, 0xf1, 0x78, - 0xb1, 0x9a, 0x11, 0xe2, 0x2a, 0xfb, 0x35, 0x90, 0xab, 0x1c, 0xd6, 0xe1, 0x44, 0x03, 0x5c, 0x3c, - 0xb7, 0xe9, 0x2b, 0xd5, 0xc3, 0x59, 0x98, 0xf1, 0x4b, 0xaf, 0xb4, 0x6d, 0xf4, 0xfc, 0xfe, 0x1a, - 0x35, 0x2b, 0xa2, 0x51, 0xfb, 0xd6, 0x99, 0xfd, 0x51, 0x47, 0x0e, 0x8d, 0x3a, 0x7d, 0x47, 0x97, - 0x99, 0x88, 0xd1, 0x05, 0x3d, 0x4b, 0x16, 0xbd, 0x8b, 0x88, 0xef, 0x5a, 0x49, 0x6d, 0x1e, 0xcd, - 0x83, 0x85, 0xe0, 0x8d, 0x48, 0x83, 0x6b, 0x95, 0xbe, 0x92, 0xbc, 0x47, 0x82, 0x63, 0xfb, 0x3b, - 0xf3, 0x1f, 0xe0, 0xbd, 0xd0, 0xdc, 0x3a, 0xd9, 0xbe, 0x17, 0x1a, 0x79, 0xe3, 0x37, 0xe9, 0x62, - 0x43, 0x8a, 0x70, 0xf6, 0xde, 0xe0, 0x4e, 0x5c, 0x2c, 0x68, 0x88, 0x20, 0xd1, 0xf4, 0x05, 0xf8, - 0xab, 0x32, 0x4c, 0xd5, 0xb1, 0xb3, 0xaa, 0x5d, 0x36, 0x77, 0x1d, 0xa4, 0x89, 0x6e, 0xcf, 0x3d, - 0x15, 0xf2, 0x1d, 0xf2, 0x0b, 0xbb, 0xe2, 0xfd, 0x4c, 0xdf, 0xfd, 0x2d, 0xe2, 0xfb, 0x43, 0x49, - 0xab, 0x2c, 0x3f, 0x1f, 0xcb, 0x45, 0x64, 0x77, 0xd4, 0xe7, 0x6e, 0x24, 0x5b, 0x3b, 0x89, 0xf6, - 0x4e, 0xa3, 0x8a, 0x4e, 0x1f, 0x96, 0x9f, 0x91, 0x61, 0xb6, 0x8e, 0x9d, 0x8a, 0xbd, 0xa4, 0xed, - 0x99, 0x96, 0xee, 0xe0, 0xf0, 0x1d, 0x8f, 0xf1, 0xd0, 0x9c, 0x06, 0xd0, 0xfd, 0xdf, 0x58, 0x84, - 0xa9, 0x50, 0x0a, 0xfa, 0xad, 0xa4, 0x8e, 0x42, 0x1c, 0x1f, 0x23, 0x01, 0x21, 0x91, 0x8f, 0x45, - 0x5c, 0xf1, 0xe9, 0x03, 0xf1, 0x59, 0x89, 0x01, 0x51, 0xb4, 0x5a, 0xdb, 0xfa, 0x1e, 0x6e, 0x27, - 0x04, 0xc2, 0xfb, 0x2d, 0x00, 0xc2, 0x27, 0x94, 0xd8, 0x7d, 0x85, 0xe3, 0x63, 0x14, 0xee, 0x2b, - 0x71, 0x04, 0xc7, 0x12, 0x24, 0xca, 0xed, 0x7a, 0xd8, 0x7a, 0xe6, 0xdd, 0xa2, 0x62, 0x0d, 0x4c, - 0x36, 0x29, 0x6c, 0xb2, 0x0d, 0xd5, 0xb1, 0xd0, 0xb2, 0x07, 0xe9, 0x74, 0x36, 0x8d, 0x8e, 0xa5, - 0x6f, 0xd1, 0xe9, 0x0b, 0xfd, 0x1d, 0x32, 0x9c, 0xf0, 0xa3, 0xa7, 0xd4, 0xb1, 0xb3, 0xa8, 0xd9, - 0xdb, 0x17, 0x4c, 0xcd, 0x6a, 0x87, 0xaf, 0xfe, 0x1f, 0xfa, 0xc4, 0x1f, 0xfa, 0x4c, 0x18, 0x84, - 0x2a, 0x0f, 0x42, 0x5f, 0x57, 0xd1, 0xbe, 0xbc, 0x8c, 0xa2, 0x93, 0x89, 0xf5, 0x66, 0xfd, 0x1d, - 0x1f, 0xac, 0x1f, 0xe1, 0xc0, 0xba, 0x6b, 0x58, 0x16, 0xd3, 0x07, 0xee, 0x37, 0xe8, 0x88, 0x10, - 0xf2, 0x6a, 0xbe, 0x5f, 0x14, 0xb0, 0x08, 0xaf, 0x56, 0x39, 0xd2, 0xab, 0x75, 0xa8, 0x31, 0x62, - 0xa0, 0x47, 0x72, 0xba, 0x63, 0xc4, 0x21, 0x7a, 0x1b, 0xbf, 0x45, 0x86, 0x02, 0x09, 0x9f, 0x15, - 0xf2, 0xf8, 0x46, 0x0f, 0x88, 0xa2, 0xb3, 0xcf, 0xbb, 0x7c, 0x22, 0xa9, 0x77, 0x39, 0x7a, 0x73, - 0x52, 0x1f, 0xf2, 0x5e, 0x6e, 0x47, 0x82, 0x58, 0x22, 0x17, 0xf1, 0x01, 0x1c, 0xa4, 0x0f, 0xda, - 0x2f, 0xc8, 0x00, 0x6e, 0x83, 0x66, 0x67, 0x1f, 0x9e, 0x21, 0x0a, 0xd7, 0x2d, 0x61, 0xbf, 0x7a, - 0x17, 0xa8, 0x13, 0x3d, 0x40, 0x51, 0x8a, 0xc1, 0xa9, 0x8a, 0x47, 0x92, 0xfa, 0x56, 0x06, 0x5c, - 0x8d, 0x04, 0x96, 0x44, 0xde, 0x96, 0x91, 0x65, 0xa7, 0x0f, 0xc8, 0x7f, 0x97, 0x20, 0xd7, 0x30, - 0xeb, 0xd8, 0x39, 0xb8, 0x29, 0x90, 0xf8, 0xd8, 0x3e, 0x29, 0x77, 0x14, 0xc7, 0xf6, 0xfb, 0x11, - 0x1a, 0x43, 0x34, 0x32, 0x09, 0x66, 0x1a, 0x66, 0xc9, 0x5f, 0x9c, 0x12, 0xf7, 0x55, 0x15, 0xbf, - 0x4f, 0xd9, 0xaf, 0x60, 0x50, 0xcc, 0x81, 0xee, 0x53, 0x1e, 0x4c, 0x2f, 0x7d, 0xb9, 0xdd, 0x0e, - 0x47, 0x37, 0x8c, 0xb6, 0xa9, 0xe2, 0xb6, 0xc9, 0x56, 0xba, 0x15, 0x05, 0xb2, 0xbb, 0x46, 0xdb, - 0x24, 0x2c, 0xe7, 0x54, 0xf2, 0xec, 0xa6, 0x59, 0xb8, 0x6d, 0x32, 0xdf, 0x00, 0xf2, 0x8c, 0xbe, - 0x2c, 0x43, 0xd6, 0xfd, 0x57, 0x5c, 0xd4, 0x6f, 0x91, 0x13, 0x06, 0x22, 0x70, 0xc9, 0x8f, 0xc4, - 0x12, 0xba, 0x3b, 0xb4, 0xf6, 0x4f, 0x3d, 0x58, 0xaf, 0x8b, 0x2a, 0x2f, 0x24, 0x8a, 0x60, 0xcd, - 0x5f, 0x39, 0x05, 0x13, 0x17, 0x3a, 0x66, 0xeb, 0x62, 0x70, 0x5e, 0x9e, 0xbd, 0x2a, 0x37, 0x41, - 0xce, 0xd2, 0x8c, 0x2d, 0xcc, 0xf6, 0x14, 0x8e, 0xf7, 0xf4, 0x85, 0xc4, 0xeb, 0x45, 0xa5, 0x59, - 0xd0, 0x9b, 0x93, 0x84, 0x40, 0xe8, 0x53, 0xf9, 0x64, 0xfa, 0xb0, 0x38, 0xc4, 0xc9, 0xb2, 0x02, - 0xcc, 0x94, 0x8a, 0xf4, 0xe6, 0xf2, 0xb5, 0xda, 0xb9, 0x72, 0x41, 0x26, 0x30, 0xbb, 0x32, 0x49, - 0x11, 0x66, 0x97, 0xfc, 0xf7, 0x2d, 0xcc, 0x7d, 0x2a, 0x7f, 0x18, 0x30, 0x7f, 0x54, 0x82, 0xd9, - 0x55, 0xdd, 0x76, 0xa2, 0xbc, 0xfd, 0x63, 0xa2, 0xe7, 0xbe, 0x20, 0xa9, 0xa9, 0xcc, 0x95, 0x23, - 0x1c, 0x36, 0x37, 0x91, 0x39, 0x1c, 0x57, 0xc4, 0x78, 0x8e, 0xa5, 0x10, 0x0e, 0xe8, 0x6d, 0xc3, - 0xc2, 0x92, 0x4c, 0x6c, 0x28, 0x05, 0x85, 0x8c, 0xdf, 0x50, 0x8a, 0x2c, 0x3b, 0x7d, 0xf9, 0x7e, - 0x59, 0x82, 0x63, 0x6e, 0xf1, 0x71, 0xcb, 0x52, 0xd1, 0x62, 0x1e, 0xb8, 0x2c, 0x95, 0x78, 0x65, - 0x7c, 0x1f, 0x2f, 0xa3, 0x58, 0x19, 0x1f, 0x44, 0x74, 0xcc, 0x62, 0x8e, 0x58, 0x86, 0x1d, 0x24, - 0xe6, 0x98, 0x65, 0xd8, 0xe1, 0xc5, 0x1c, 0xbf, 0x14, 0x3b, 0xa4, 0x98, 0x0f, 0x6d, 0x81, 0xf5, - 0xd5, 0xb2, 0x2f, 0xe6, 0xc8, 0xb5, 0x8d, 0x18, 0x31, 0x27, 0x3e, 0xb1, 0x8b, 0xde, 0x3a, 0xa4, - 0xe0, 0x47, 0xbc, 0xbe, 0x31, 0x0c, 0x4c, 0x87, 0xb8, 0xc6, 0xf1, 0x9b, 0x32, 0xcc, 0x31, 0x2e, - 0xfa, 0x4f, 0x99, 0x63, 0x30, 0x4a, 0x3c, 0x65, 0x4e, 0x7c, 0x06, 0x88, 0xe7, 0x6c, 0xfc, 0x67, - 0x80, 0x62, 0xcb, 0x4f, 0x1f, 0x9c, 0xaf, 0x64, 0xe1, 0xa4, 0xcb, 0xc2, 0x9a, 0xd9, 0xd6, 0x37, - 0x2f, 0x53, 0x2e, 0xce, 0x69, 0x9d, 0x5d, 0x6c, 0xa3, 0x77, 0x49, 0xa2, 0x28, 0xfd, 0x27, 0x00, - 0xb3, 0x8b, 0x2d, 0x1a, 0x48, 0x8d, 0x01, 0x75, 0x67, 0x54, 0x65, 0xf7, 0x97, 0xe4, 0x5f, 0x26, - 0x53, 0xf3, 0x88, 0xa8, 0x21, 0x7a, 0xae, 0x55, 0x38, 0xe5, 0x7f, 0xe9, 0x75, 0xf0, 0xc8, 0xec, - 0x77, 0xf0, 0xb8, 0x11, 0x64, 0xad, 0xdd, 0xf6, 0xa1, 0xea, 0xdd, 0xcc, 0x26, 0x65, 0xaa, 0x6e, - 0x16, 0x37, 0xa7, 0x8d, 0x83, 0xa3, 0x79, 0x11, 0x39, 0x6d, 0xec, 0x28, 0xf3, 0x90, 0xa7, 0x37, - 0x2f, 0xfb, 0x2b, 0xfa, 0xfd, 0x33, 0xb3, 0x5c, 0xbc, 0x69, 0x57, 0xe3, 0xd5, 0xf0, 0xf6, 0x44, - 0x92, 0xe9, 0xd7, 0x4f, 0x07, 0x76, 0xb2, 0xca, 0x29, 0xd8, 0xd3, 0x87, 0xa6, 0x3c, 0x9e, 0xdd, - 0xb0, 0x62, 0xb7, 0xdb, 0xb9, 0xdc, 0x60, 0xc1, 0x57, 0x12, 0xed, 0x86, 0x85, 0x62, 0xb8, 0x48, - 0xbd, 0x31, 0x5c, 0x92, 0xef, 0x86, 0x71, 0x7c, 0x8c, 0x62, 0x37, 0x2c, 0x8e, 0x60, 0xfa, 0xa2, - 0xfd, 0x6a, 0x8e, 0x5a, 0xcd, 0x2c, 0xb6, 0xff, 0xb3, 0xfb, 0x7b, 0x56, 0x03, 0xef, 0xec, 0xd2, - 0x2f, 0xec, 0x7f, 0xec, 0x9d, 0x26, 0xca, 0x93, 0x21, 0xbf, 0x69, 0x5a, 0x3b, 0x9a, 0xb7, 0x71, - 0xdf, 0x7b, 0x52, 0x84, 0xc5, 0xd3, 0x5f, 0x22, 0x79, 0x54, 0x96, 0xd7, 0x9d, 0x8f, 0x3c, 0x53, - 0xef, 0xb2, 0xa8, 0x8b, 0xee, 0xa3, 0x72, 0x3d, 0xcc, 0xb2, 0xe0, 0x8b, 0x55, 0x6c, 0x3b, 0xb8, - 0xcd, 0x22, 0x56, 0xf0, 0x89, 0xca, 0x59, 0x98, 0x61, 0x09, 0x4b, 0x7a, 0x07, 0xdb, 0x2c, 0x68, - 0x05, 0x97, 0xa6, 0x9c, 0x84, 0xbc, 0x6e, 0xdf, 0x6b, 0x9b, 0x06, 0xf1, 0xff, 0x9f, 0x54, 0xd9, - 0x9b, 0x72, 0x23, 0x1c, 0x65, 0xf9, 0x7c, 0x63, 0x95, 0x1e, 0xd8, 0xe9, 0x4d, 0x76, 0x55, 0xcb, - 0x30, 0xd7, 0x2d, 0x73, 0xcb, 0xc2, 0xb6, 0x4d, 0x4e, 0x4d, 0x4d, 0xaa, 0xa1, 0x14, 0xe5, 0xa9, - 0x70, 0x25, 0xfb, 0xc5, 0x8f, 0x0e, 0xe9, 0x1d, 0x01, 0xa2, 0xce, 0x3d, 0x51, 0x9f, 0xd1, 0xa7, - 0x86, 0x99, 0x92, 0x24, 0xbe, 0x21, 0xc1, 0xc5, 0x77, 0xb7, 0xd5, 0xc2, 0xb8, 0xcd, 0xce, 0x4c, - 0x79, 0xaf, 0x09, 0xef, 0x4e, 0x48, 0x3c, 0x81, 0x39, 0xa4, 0xcb, 0x13, 0xde, 0x7f, 0x02, 0xf2, - 0xf4, 0x22, 0x32, 0xf4, 0xc2, 0xb9, 0xbe, 0x6a, 0x3e, 0xc7, 0xab, 0xf9, 0x06, 0xcc, 0x18, 0xa6, - 0x5b, 0xdc, 0xba, 0x66, 0x69, 0x3b, 0x76, 0xdc, 0xfa, 0x24, 0xa5, 0xeb, 0x0f, 0x46, 0xd5, 0xd0, - 0x6f, 0x2b, 0x47, 0x54, 0x8e, 0x8c, 0xf2, 0x7f, 0xc0, 0xd1, 0x0b, 0x2c, 0xb6, 0x80, 0xcd, 0x28, - 0x4b, 0xd1, 0xde, 0x7b, 0x3d, 0x94, 0x17, 0xf8, 0x3f, 0x57, 0x8e, 0xa8, 0xbd, 0xc4, 0x94, 0x1f, - 0x83, 0x39, 0xf7, 0xb5, 0x6d, 0x5e, 0xf2, 0x18, 0x97, 0xa3, 0x4d, 0x98, 0x1e, 0xf2, 0x6b, 0xdc, - 0x8f, 0x2b, 0x47, 0xd4, 0x1e, 0x52, 0x4a, 0x0d, 0x60, 0xdb, 0xd9, 0xe9, 0x30, 0xc2, 0xd9, 0x68, - 0x95, 0xec, 0x21, 0xbc, 0xe2, 0xff, 0xb4, 0x72, 0x44, 0x0d, 0x91, 0x50, 0x56, 0x61, 0xca, 0x79, - 0xd0, 0x61, 0xf4, 0x72, 0xd1, 0xdb, 0xe6, 0x3d, 0xf4, 0x1a, 0xde, 0x3f, 0x2b, 0x47, 0xd4, 0x80, - 0x80, 0x52, 0x81, 0xc9, 0xee, 0x05, 0x46, 0x2c, 0xdf, 0x27, 0x4e, 0x7d, 0x7f, 0x62, 0xeb, 0x17, - 0x7c, 0x5a, 0xfe, 0xef, 0x2e, 0x63, 0x2d, 0x7b, 0x8f, 0xd1, 0x9a, 0x10, 0x66, 0xac, 0xe4, 0xfd, - 0xe3, 0x32, 0xe6, 0x13, 0x50, 0x2a, 0x30, 0x65, 0x1b, 0x5a, 0xd7, 0xde, 0x36, 0x1d, 0xfb, 0xd4, - 0x64, 0x8f, 0x87, 0x65, 0x34, 0xb5, 0x3a, 0xfb, 0x47, 0x0d, 0xfe, 0x56, 0x9e, 0x0c, 0x27, 0x76, - 0xc9, 0x85, 0xee, 0xe5, 0x07, 0x75, 0xdb, 0xd1, 0x8d, 0x2d, 0x2f, 0x3a, 0x2d, 0xed, 0xa7, 0xfa, - 0x7f, 0x54, 0xe6, 0xd9, 0x59, 0x2b, 0x20, 0x6d, 0x13, 0xf5, 0x6e, 0xf3, 0xd1, 0x62, 0x43, 0x47, - 0xac, 0x9e, 0x06, 0x59, 0xf7, 0x13, 0xe9, 0xd7, 0xe6, 0xfa, 0x2f, 0x21, 0xf6, 0xea, 0x0e, 0x69, - 0xc0, 0xee, 0x4f, 0x3d, 0x5d, 0xe3, 0xcc, 0xbe, 0xae, 0xf1, 0x0c, 0x4c, 0xeb, 0xf6, 0x9a, 0xbe, - 0x45, 0xed, 0x32, 0xe6, 0x49, 0x1f, 0x4e, 0xa2, 0xf3, 0xd8, 0x2a, 0xbe, 0x44, 0xef, 0xde, 0x38, - 0xea, 0xcd, 0x63, 0xbd, 0x14, 0x74, 0x03, 0xcc, 0x84, 0x1b, 0x19, 0xbd, 0xcd, 0x54, 0x0f, 0xac, - 0x3a, 0xf6, 0x86, 0xae, 0x87, 0x39, 0x5e, 0xa7, 0x43, 0x83, 0x97, 0xec, 0x75, 0x85, 0xe8, 0x3a, - 0x38, 0xda, 0xd3, 0xb0, 0xbc, 0x68, 0x25, 0x99, 0x20, 0x5a, 0xc9, 0x19, 0x80, 0x40, 0x8b, 0xfb, - 0x92, 0xb9, 0x16, 0xa6, 0x7c, 0xbd, 0xec, 0x9b, 0xe1, 0x8b, 0x19, 0x98, 0xf4, 0x94, 0xad, 0x5f, - 0x06, 0x77, 0xe4, 0x32, 0x42, 0x5b, 0x13, 0x6c, 0x02, 0xcf, 0xa5, 0xb9, 0x23, 0x54, 0xe0, 0x10, - 0xdc, 0xd0, 0x9d, 0x8e, 0x77, 0xa8, 0xae, 0x37, 0x59, 0x59, 0x07, 0xd0, 0x09, 0x46, 0x8d, 0xe0, - 0x94, 0xdd, 0xad, 0x09, 0xda, 0x03, 0xd5, 0x87, 0x10, 0x8d, 0xb3, 0x3f, 0xc0, 0x8e, 0xc0, 0x4d, - 0x41, 0x8e, 0x86, 0x68, 0x3f, 0xa2, 0xcc, 0x01, 0x94, 0x9f, 0xb1, 0x5e, 0x56, 0x2b, 0xe5, 0x6a, - 0xa9, 0x5c, 0xc8, 0xa0, 0x17, 0x4b, 0x30, 0xe5, 0x37, 0x82, 0xbe, 0x95, 0x2c, 0x33, 0xd5, 0x1a, - 0x78, 0x61, 0xe4, 0xfe, 0x46, 0x15, 0x56, 0xb2, 0xa7, 0xc2, 0x95, 0xbb, 0x36, 0x5e, 0xd2, 0x2d, - 0xdb, 0x51, 0xcd, 0x4b, 0x4b, 0xa6, 0xe5, 0xc7, 0x63, 0x66, 0xb1, 0x51, 0xa3, 0x3e, 0xbb, 0xb6, - 0x4a, 0x1b, 0x93, 0xe3, 0x56, 0xd8, 0x62, 0x6b, 0xce, 0x41, 0x82, 0x4b, 0xd7, 0xb1, 0x34, 0xc3, - 0xee, 0x9a, 0x36, 0x56, 0xcd, 0x4b, 0x76, 0xd1, 0x68, 0x97, 0xcc, 0xce, 0xee, 0x8e, 0x61, 0x33, - 0x6b, 0x23, 0xea, 0xb3, 0x2b, 0x1d, 0x72, 0x1d, 0xec, 0x1c, 0x40, 0xa9, 0xb6, 0xba, 0x5a, 0x2e, - 0x35, 0x2a, 0xb5, 0x6a, 0xe1, 0x88, 0x2b, 0xad, 0x46, 0x71, 0x61, 0xd5, 0x95, 0xce, 0x8f, 0xc3, - 0xa4, 0xd7, 0xa6, 0x59, 0x80, 0x95, 0x8c, 0x17, 0x60, 0x45, 0x29, 0xc2, 0xa4, 0xd7, 0xca, 0xd9, - 0x88, 0xf0, 0xd8, 0xde, 0x03, 0xb5, 0x3b, 0x9a, 0xe5, 0x10, 0x4f, 0x6c, 0x8f, 0xc8, 0x82, 0x66, - 0x63, 0xd5, 0xff, 0xed, 0xec, 0x13, 0x18, 0x07, 0x0a, 0xcc, 0x15, 0x57, 0x57, 0x9b, 0x35, 0xb5, - 0x59, 0xad, 0x35, 0x56, 0x2a, 0xd5, 0x65, 0x3a, 0x42, 0x56, 0x96, 0xab, 0x35, 0xb5, 0x4c, 0x07, - 0xc8, 0x7a, 0x21, 0x43, 0xaf, 0x23, 0x5e, 0x98, 0x84, 0x7c, 0x97, 0x48, 0x17, 0x7d, 0x4e, 0x4e, - 0x78, 0x92, 0xde, 0xc7, 0x29, 0xe2, 0xc2, 0x54, 0xce, 0x9b, 0x5d, 0xea, 0x73, 0xda, 0xf4, 0x2c, - 0xcc, 0x50, 0x2b, 0xd1, 0x26, 0x1b, 0x03, 0x04, 0x39, 0x59, 0xe5, 0xd2, 0xd0, 0x07, 0xa5, 0x04, - 0xc7, 0xeb, 0xfb, 0x72, 0x94, 0xcc, 0xb8, 0xf8, 0xf3, 0xcc, 0x70, 0x17, 0x1a, 0x54, 0xaa, 0x8d, - 0xb2, 0x5a, 0x2d, 0xae, 0xb2, 0x2c, 0xb2, 0x72, 0x0a, 0x8e, 0x57, 0x6b, 0x2c, 0x5a, 0x60, 0xbd, - 0xd9, 0xa8, 0x35, 0x2b, 0x6b, 0xeb, 0x35, 0xb5, 0x51, 0xc8, 0x29, 0x27, 0x41, 0xa1, 0xcf, 0xcd, - 0x4a, 0xbd, 0x59, 0x2a, 0x56, 0x4b, 0xe5, 0xd5, 0xf2, 0x62, 0x21, 0xaf, 0x3c, 0x0e, 0xae, 0xa3, - 0x17, 0xe4, 0xd4, 0x96, 0x9a, 0x6a, 0xed, 0x7c, 0xdd, 0x45, 0x50, 0x2d, 0xaf, 0x16, 0x5d, 0x45, - 0x0a, 0x5d, 0x4b, 0x3c, 0xa1, 0x5c, 0x01, 0x47, 0xc9, 0x95, 0xe3, 0xab, 0xb5, 0xe2, 0x22, 0x2b, - 0x6f, 0x52, 0xb9, 0x06, 0x4e, 0x55, 0xaa, 0xf5, 0x8d, 0xa5, 0xa5, 0x4a, 0xa9, 0x52, 0xae, 0x36, - 0x9a, 0xeb, 0x65, 0x75, 0xad, 0x52, 0xaf, 0xbb, 0xff, 0x16, 0xa6, 0xc8, 0xa5, 0xaf, 0xb4, 0xcf, - 0x44, 0xef, 0x94, 0x61, 0xf6, 0x9c, 0xd6, 0xd1, 0xdd, 0x81, 0x82, 0xdc, 0x06, 0xdd, 0x73, 0x10, - 0xc5, 0x21, 0xb7, 0x46, 0x33, 0x57, 0x76, 0xf2, 0x82, 0x7e, 0x5a, 0x4e, 0x78, 0x10, 0x85, 0x01, - 0x41, 0x4b, 0x9c, 0xe7, 0x4a, 0x8b, 0x98, 0x36, 0xbd, 0x52, 0x4a, 0x70, 0x10, 0x45, 0x9c, 0x7c, - 0x32, 0xf0, 0x5f, 0x32, 0x2a, 0xf0, 0x0b, 0x30, 0xb3, 0x51, 0x2d, 0x6e, 0x34, 0x56, 0x6a, 0x6a, - 0xe5, 0x47, 0x49, 0x1c, 0xf3, 0x59, 0x98, 0x5a, 0xaa, 0xa9, 0x0b, 0x95, 0xc5, 0xc5, 0x72, 0xb5, - 0x90, 0x53, 0xae, 0x84, 0x2b, 0xea, 0x65, 0xf5, 0x5c, 0xa5, 0x54, 0x6e, 0x6e, 0x54, 0x8b, 0xe7, - 0x8a, 0x95, 0x55, 0xd2, 0x47, 0xe4, 0x63, 0x6e, 0xb2, 0x9e, 0x40, 0x3f, 0x99, 0x05, 0xa0, 0x55, - 0x27, 0xd7, 0xf8, 0x84, 0xee, 0x3b, 0xfe, 0x8b, 0xa4, 0x93, 0x86, 0x80, 0x4c, 0x44, 0xfb, 0xad, - 0xc0, 0xa4, 0xc5, 0x3e, 0xb0, 0x85, 0x99, 0x41, 0x74, 0xe8, 0xa3, 0x47, 0x4d, 0xf5, 0x7f, 0x47, - 0xef, 0x4a, 0x32, 0x47, 0x88, 0x64, 0x2c, 0x19, 0x92, 0x4b, 0xa3, 0x01, 0x12, 0x3d, 0x3f, 0x03, - 0x73, 0x7c, 0xc5, 0xdc, 0x4a, 0x10, 0x63, 0x4a, 0xac, 0x12, 0xfc, 0xcf, 0x21, 0x23, 0xeb, 0xec, - 0x93, 0xd8, 0x70, 0x0a, 0x5e, 0xcb, 0xa4, 0x67, 0xca, 0x3d, 0x8b, 0xa5, 0x90, 0x71, 0x99, 0x77, - 0x8d, 0x8e, 0x82, 0xa4, 0x4c, 0x80, 0xdc, 0x78, 0xd0, 0x29, 0xc8, 0xe8, 0x8b, 0x32, 0xcc, 0x72, - 0x17, 0x2a, 0xa3, 0x57, 0x66, 0x44, 0x2e, 0x3b, 0x0d, 0x5d, 0xd5, 0x9c, 0x39, 0xe8, 0x55, 0xcd, - 0x67, 0x6f, 0x81, 0x09, 0x96, 0x46, 0xe4, 0x5b, 0xab, 0xba, 0xa6, 0xc0, 0x51, 0x98, 0x5e, 0x2e, - 0x37, 0x9a, 0xf5, 0x46, 0x51, 0x6d, 0x94, 0x17, 0x0b, 0x19, 0x77, 0xe0, 0x2b, 0xaf, 0xad, 0x37, - 0xee, 0x2f, 0x48, 0xc9, 0x7d, 0xfb, 0x7a, 0x19, 0x19, 0xb3, 0x6f, 0x5f, 0x5c, 0xf1, 0xe9, 0xcf, - 0x55, 0x3f, 0x21, 0x43, 0x81, 0x72, 0x50, 0x7e, 0xb0, 0x8b, 0x2d, 0x1d, 0x1b, 0x2d, 0x8c, 0x2e, - 0x8a, 0xc4, 0x12, 0xdd, 0x17, 0x65, 0x8f, 0xf4, 0xe7, 0x21, 0x2b, 0x91, 0xbe, 0xf4, 0x18, 0xd8, - 0xd9, 0x7d, 0x06, 0xf6, 0xc7, 0x93, 0x3a, 0xf7, 0xf5, 0xb2, 0x3b, 0x12, 0xc8, 0x3e, 0x92, 0xc4, - 0xb9, 0x6f, 0x00, 0x07, 0x63, 0x09, 0x11, 0x1c, 0x31, 0xfe, 0x16, 0x64, 0xf4, 0x3c, 0x19, 0x8e, - 0x2e, 0x6a, 0x0e, 0x5e, 0xb8, 0xdc, 0xf0, 0x2e, 0x3c, 0x8c, 0xb8, 0xa4, 0x38, 0xb3, 0xef, 0x92, - 0xe2, 0xe0, 0xce, 0x44, 0xa9, 0xe7, 0xce, 0x44, 0xf4, 0xb6, 0xa4, 0xc7, 0x01, 0x7b, 0x78, 0x18, - 0x59, 0x1c, 0xdf, 0x64, 0xc7, 0xfc, 0xe2, 0xb9, 0x48, 0xbf, 0x81, 0xbd, 0x69, 0x0a, 0x0a, 0x94, - 0x95, 0x90, 0xff, 0xda, 0xaf, 0xb2, 0x7b, 0xbd, 0x9b, 0x09, 0xc2, 0x05, 0x7a, 0x01, 0x18, 0x24, - 0x3e, 0x00, 0x03, 0xb7, 0x1c, 0x2a, 0xf7, 0xfa, 0x1c, 0x24, 0xed, 0x0c, 0x43, 0xce, 0x6a, 0xd1, - 0x11, 0x5a, 0xd3, 0xeb, 0x0c, 0x63, 0x8b, 0x1f, 0xcf, 0xdd, 0xb3, 0xec, 0x86, 0xc8, 0xb2, 0x28, - 0x32, 0xf1, 0x57, 0x6c, 0x27, 0xf5, 0x5c, 0xe6, 0x9c, 0x05, 0x63, 0xee, 0x9d, 0x4e, 0xcf, 0x73, - 0x79, 0x10, 0x07, 0xe9, 0xa3, 0xf0, 0x1d, 0x09, 0xb2, 0x75, 0xd3, 0x72, 0x46, 0x85, 0x41, 0xd2, - 0xdd, 0xd6, 0x90, 0x04, 0xea, 0xd1, 0x73, 0xce, 0xf4, 0x76, 0x5b, 0xe3, 0xcb, 0x1f, 0x43, 0xc4, - 0xc5, 0xa3, 0x30, 0x47, 0x39, 0xf1, 0xaf, 0x23, 0xf9, 0xb6, 0x44, 0xfb, 0xab, 0xfb, 0x44, 0x11, - 0x39, 0x0b, 0x33, 0xa1, 0xdd, 0x4e, 0x0f, 0x14, 0x2e, 0x0d, 0xbd, 0x36, 0x8c, 0xcb, 0x22, 0x8f, - 0x4b, 0xbf, 0x19, 0xb7, 0x7f, 0xa3, 0xc7, 0xa8, 0x7a, 0xa6, 0x24, 0xc1, 0x1b, 0x63, 0x0a, 0x4f, - 0x1f, 0x91, 0x87, 0x64, 0xc8, 0x33, 0x6f, 0xb3, 0x91, 0x22, 0x90, 0xb4, 0x65, 0xf8, 0x42, 0x10, - 0xf3, 0x4a, 0x93, 0x47, 0xdd, 0x32, 0xe2, 0xcb, 0x4f, 0x1f, 0x87, 0xef, 0x32, 0x37, 0xca, 0xe2, - 0x9e, 0xa6, 0x77, 0xb4, 0x0b, 0x9d, 0x04, 0x41, 0x93, 0x3f, 0x98, 0xf0, 0xe0, 0x98, 0x5f, 0x55, - 0xae, 0xbc, 0x08, 0x89, 0xff, 0x10, 0x4c, 0x59, 0xfe, 0x92, 0xa4, 0x77, 0xae, 0xbe, 0xc7, 0x85, - 0x95, 0x7d, 0x57, 0x83, 0x9c, 0x89, 0x4e, 0x89, 0x09, 0xf1, 0x33, 0x96, 0x53, 0x2d, 0xd3, 0xc5, - 0x76, 0x7b, 0x09, 0x6b, 0xce, 0xae, 0x85, 0xdb, 0x89, 0x86, 0x08, 0x5e, 0x44, 0x53, 0x61, 0x49, - 0x70, 0x61, 0x0b, 0x57, 0x79, 0x74, 0x9e, 0x32, 0xa0, 0x37, 0xf0, 0x78, 0x19, 0x49, 0x97, 0xf4, - 0x46, 0x1f, 0x92, 0x1a, 0x07, 0xc9, 0xd3, 0x86, 0x63, 0x22, 0x7d, 0x40, 0x7e, 0x5d, 0x86, 0x39, - 0x6a, 0x27, 0x8c, 0x1a, 0x93, 0xdf, 0x4f, 0xe8, 0x9d, 0x12, 0xba, 0xf0, 0x29, 0xcc, 0xce, 0x48, - 0x60, 0x49, 0xe2, 0xcb, 0x22, 0xc6, 0x47, 0xfa, 0xc8, 0x7c, 0x2a, 0x0f, 0x10, 0xf2, 0x38, 0xfc, - 0x60, 0x3e, 0x08, 0x21, 0x88, 0xde, 0xcc, 0xe6, 0x1f, 0x75, 0x2e, 0x9e, 0x75, 0xc8, 0x9b, 0xd0, - 0xdf, 0x90, 0xe2, 0x13, 0x85, 0x46, 0x95, 0x3f, 0x4f, 0x68, 0xf3, 0x32, 0x7f, 0xbf, 0x81, 0x83, - 0xfb, 0x90, 0xbd, 0xdc, 0x87, 0x12, 0x18, 0xbf, 0x83, 0x58, 0x49, 0x86, 0xda, 0xea, 0x10, 0x33, - 0xfb, 0x53, 0x70, 0x5c, 0x2d, 0x17, 0x17, 0x6b, 0xd5, 0xd5, 0xfb, 0xc3, 0xb7, 0xff, 0x14, 0xe4, - 0xf0, 0xe4, 0x24, 0x15, 0xd8, 0x5e, 0x95, 0xb0, 0x0f, 0xe4, 0x65, 0x15, 0x7b, 0xb7, 0xfd, 0x47, - 0x12, 0xf4, 0x6a, 0x02, 0x64, 0x0f, 0x13, 0x85, 0x87, 0x20, 0xd4, 0x8c, 0x7e, 0x56, 0x86, 0x82, - 0x3b, 0x1e, 0x52, 0x2e, 0xd9, 0x35, 0x6f, 0x35, 0xde, 0x21, 0xb1, 0x4b, 0xf7, 0x9f, 0x02, 0x87, - 0x44, 0x2f, 0x41, 0xb9, 0x01, 0xe6, 0x5a, 0xdb, 0xb8, 0x75, 0xb1, 0x62, 0x78, 0xfb, 0xea, 0x74, - 0x13, 0xb6, 0x27, 0x95, 0x07, 0xe6, 0x3e, 0x1e, 0x18, 0x7e, 0x12, 0xcd, 0x0d, 0xd2, 0x61, 0xa6, - 0x22, 0x70, 0xf9, 0x23, 0x1f, 0x97, 0x2a, 0x87, 0xcb, 0x1d, 0x43, 0x51, 0x4d, 0x06, 0x4b, 0x75, - 0x08, 0x58, 0x10, 0x9c, 0xac, 0xad, 0x37, 0x2a, 0xb5, 0x6a, 0x73, 0xa3, 0x5e, 0x5e, 0x6c, 0x2e, - 0x78, 0xe0, 0xd4, 0x0b, 0x32, 0xfa, 0xaa, 0x04, 0x13, 0x94, 0x2d, 0x1b, 0x3d, 0x3e, 0x80, 0x60, - 0xa0, 0x27, 0x26, 0x7a, 0x93, 0x70, 0x5c, 0x05, 0x5f, 0x10, 0xac, 0x9c, 0x88, 0x7e, 0xea, 0xa9, - 0x30, 0x41, 0x41, 0xf6, 0x56, 0xb4, 0x4e, 0x47, 0xf4, 0x52, 0x8c, 0x8c, 0xea, 0x65, 0x17, 0x8c, - 0xb1, 0x30, 0x80, 0x8d, 0xf4, 0x47, 0x96, 0x67, 0x65, 0xa9, 0x19, 0x7c, 0x5e, 0x77, 0xb6, 0x89, - 0xa3, 0x26, 0xfa, 0x11, 0x91, 0xe5, 0xc5, 0x9b, 0x21, 0xb7, 0xe7, 0xe6, 0x1e, 0xe0, 0xf4, 0x4a, - 0x33, 0xa1, 0x97, 0x08, 0x87, 0xf4, 0xe4, 0xf4, 0xd3, 0xe7, 0x29, 0x02, 0x9c, 0x35, 0xc8, 0x76, - 0x74, 0xdb, 0x61, 0xe3, 0xc7, 0xed, 0x89, 0x08, 0x79, 0x0f, 0x15, 0x07, 0xef, 0xa8, 0x84, 0x0c, - 0xba, 0x17, 0x66, 0xc2, 0xa9, 0x02, 0x8e, 0xbf, 0xa7, 0x60, 0x82, 0x1d, 0x48, 0x63, 0x4b, 0xac, - 0xde, 0xab, 0xe0, 0xb2, 0xa6, 0x50, 0x6d, 0xd3, 0xd7, 0x81, 0xff, 0xf7, 0x28, 0x4c, 0xac, 0xe8, - 0xb6, 0x63, 0x5a, 0x97, 0xd1, 0x23, 0x19, 0x98, 0x38, 0x87, 0x2d, 0x5b, 0x37, 0x8d, 0x7d, 0xae, - 0x06, 0x67, 0x60, 0xba, 0x6b, 0xe1, 0x3d, 0xdd, 0xdc, 0xb5, 0x83, 0xc5, 0x99, 0x70, 0x92, 0x82, - 0x60, 0x52, 0xdb, 0x75, 0xb6, 0x4d, 0x2b, 0x88, 0x63, 0xe1, 0xbd, 0x2b, 0xa7, 0x01, 0xe8, 0x73, - 0x55, 0xdb, 0xc1, 0xcc, 0x81, 0x22, 0x94, 0xa2, 0x28, 0x90, 0x75, 0xf4, 0x1d, 0xcc, 0x02, 0xdb, - 0x92, 0x67, 0x57, 0xc0, 0x24, 0x48, 0x1c, 0x0b, 0xc6, 0x27, 0xab, 0xde, 0x2b, 0xfa, 0x8c, 0x0c, - 0xd3, 0xcb, 0xd8, 0x61, 0xac, 0xda, 0xe8, 0x05, 0x19, 0xa1, 0xbb, 0x24, 0xdc, 0x31, 0xb6, 0xa3, - 0xd9, 0xde, 0x7f, 0xfe, 0x12, 0x2c, 0x9f, 0x18, 0x44, 0xd9, 0x95, 0xc3, 0x21, 0xb6, 0x49, 0xc8, - 0x35, 0xa7, 0x42, 0xfd, 0x2f, 0x59, 0x66, 0xb6, 0x09, 0xb2, 0xff, 0x03, 0x7a, 0xbb, 0x24, 0x7a, - 0x5c, 0x99, 0xc9, 0x7e, 0x3e, 0x54, 0x9f, 0xc8, 0xee, 0x68, 0x72, 0x8f, 0xe5, 0xd8, 0x17, 0x3d, - 0x3d, 0x4c, 0x89, 0x91, 0x51, 0xfd, 0xdc, 0x82, 0x07, 0x9d, 0x07, 0x73, 0x92, 0xbe, 0x36, 0x7e, - 0x53, 0x86, 0xe9, 0xfa, 0xb6, 0x79, 0xc9, 0x93, 0xe3, 0x8f, 0x8b, 0x01, 0x7b, 0x0d, 0x4c, 0xed, - 0xf5, 0x80, 0x1a, 0x24, 0x44, 0xdf, 0xee, 0x8e, 0x9e, 0x2b, 0x27, 0x85, 0x29, 0xc4, 0xdc, 0xc8, - 0xef, 0x5e, 0x57, 0x9e, 0x02, 0x13, 0x8c, 0x6b, 0xb6, 0xe4, 0x12, 0x0f, 0xb0, 0x97, 0x39, 0x5c, - 0xc1, 0x2c, 0x5f, 0xc1, 0x64, 0xc8, 0x47, 0x57, 0x2e, 0x7d, 0xe4, 0xff, 0x44, 0x22, 0x61, 0x2e, - 0x3c, 0xe0, 0x4b, 0x23, 0x00, 0x1e, 0x7d, 0x2b, 0x23, 0xba, 0x30, 0xe9, 0x4b, 0xc0, 0xe7, 0xe0, - 0x40, 0xf7, 0xc4, 0x0c, 0x24, 0x97, 0xbe, 0x3c, 0x5f, 0x9c, 0x85, 0x99, 0x45, 0x7d, 0x73, 0xd3, - 0xef, 0x24, 0x7f, 0x49, 0xb0, 0x93, 0x8c, 0x76, 0x07, 0x70, 0xed, 0xdc, 0x5d, 0xcb, 0xc2, 0x86, - 0x57, 0x29, 0xd6, 0x9c, 0x7a, 0x52, 0x95, 0x1b, 0xe1, 0xa8, 0x37, 0x2e, 0x84, 0x3b, 0xca, 0x29, - 0xb5, 0x37, 0x19, 0x7d, 0x43, 0x78, 0x57, 0xcb, 0x93, 0x68, 0xb8, 0x4a, 0x11, 0x0d, 0xf0, 0x4e, - 0x98, 0xdd, 0xa6, 0xb9, 0xc9, 0xd4, 0xdf, 0xeb, 0x2c, 0x4f, 0xf6, 0x84, 0x11, 0x5e, 0xc3, 0xb6, - 0xad, 0x6d, 0x61, 0x95, 0xcf, 0xdc, 0xd3, 0x7c, 0xe5, 0x24, 0x97, 0x62, 0x89, 0x6d, 0x90, 0x09, - 0xd4, 0x64, 0x0c, 0xda, 0x71, 0x16, 0xb2, 0x4b, 0x7a, 0x07, 0xa3, 0x9f, 0x93, 0x60, 0x4a, 0xc5, - 0x2d, 0xd3, 0x68, 0xb9, 0x6f, 0x21, 0xe7, 0xa0, 0x7f, 0xca, 0x88, 0x5e, 0x06, 0xe9, 0xd2, 0x99, - 0xf7, 0x69, 0x44, 0xb4, 0x1b, 0xb1, 0x4b, 0x1f, 0x63, 0x49, 0x8d, 0xe1, 0xea, 0x0e, 0x77, 0xea, - 0xb1, 0xb9, 0xd9, 0x31, 0x35, 0x6e, 0xf1, 0xab, 0xd7, 0x14, 0xba, 0x09, 0x0a, 0xde, 0xe9, 0x11, - 0xd3, 0x59, 0xd7, 0x0d, 0xc3, 0x3f, 0x9e, 0xbc, 0x2f, 0x9d, 0xdf, 0xb7, 0x8d, 0x8d, 0xf0, 0x42, - 0xea, 0xce, 0x4a, 0x8f, 0xd0, 0xec, 0x1b, 0x60, 0xee, 0xc2, 0x65, 0x07, 0xdb, 0x2c, 0x17, 0x2b, - 0x36, 0xab, 0xf6, 0xa4, 0x86, 0xe2, 0x33, 0xc7, 0x45, 0x82, 0x89, 0x29, 0x30, 0x99, 0xa8, 0x57, - 0x86, 0x98, 0x01, 0x1e, 0x87, 0x42, 0xb5, 0xb6, 0x58, 0x26, 0xbe, 0x6a, 0x9e, 0xf7, 0xcf, 0x16, - 0xfa, 0x15, 0x19, 0x66, 0x88, 0x33, 0x89, 0x87, 0xc2, 0x75, 0x02, 0xf3, 0x11, 0xf4, 0x79, 0x61, - 0x3f, 0x36, 0x52, 0xe5, 0x70, 0x01, 0xd1, 0x82, 0xde, 0xd4, 0x3b, 0xbd, 0x82, 0xce, 0xa9, 0x3d, - 0xa9, 0x7d, 0x00, 0x91, 0xfb, 0x02, 0xf2, 0xbb, 0x42, 0xce, 0x6c, 0x83, 0xb8, 0x3b, 0x2c, 0x54, - 0x7e, 0x4f, 0x86, 0x69, 0x77, 0x92, 0xe2, 0x81, 0x52, 0xe3, 0x40, 0x31, 0x8d, 0xce, 0xe5, 0x60, - 0x59, 0xc4, 0x7b, 0x4d, 0xd4, 0x48, 0xfe, 0x4a, 0x78, 0xe6, 0x4e, 0x44, 0x14, 0xe2, 0x65, 0x4c, - 0xf8, 0xbd, 0x5b, 0x68, 0x3e, 0x3f, 0x80, 0xb9, 0xc3, 0x82, 0xef, 0xcb, 0x39, 0xc8, 0x6f, 0x74, - 0x09, 0x72, 0x2f, 0x91, 0x45, 0x62, 0x9d, 0xef, 0x3b, 0xc8, 0xe0, 0x9a, 0x59, 0x1d, 0xb3, 0xa5, - 0x75, 0xd6, 0x83, 0x13, 0x61, 0x41, 0x82, 0x72, 0x07, 0xf3, 0x6d, 0xa4, 0x07, 0xf5, 0x6e, 0x88, - 0x0d, 0x03, 0x4e, 0x64, 0x14, 0x3a, 0x34, 0x72, 0x33, 0x1c, 0x6b, 0xeb, 0xb6, 0x76, 0xa1, 0x83, - 0xcb, 0x46, 0xcb, 0xba, 0x4c, 0xc5, 0xc1, 0xa6, 0x55, 0xfb, 0x3e, 0x28, 0x77, 0x41, 0xce, 0x76, - 0x2e, 0x77, 0xe8, 0x3c, 0x31, 0x7c, 0xc6, 0x24, 0xb2, 0xa8, 0xba, 0x9b, 0x5d, 0xa5, 0x7f, 0x85, - 0x5d, 0x94, 0x26, 0x04, 0x6f, 0x82, 0x7e, 0x12, 0xe4, 0x4d, 0x4b, 0xdf, 0xd2, 0xe9, 0xcd, 0x3e, - 0x73, 0xfb, 0xa2, 0xdd, 0x51, 0x53, 0xa0, 0x46, 0xb2, 0xa8, 0x2c, 0xab, 0xf2, 0x14, 0x98, 0xd2, - 0x77, 0xb4, 0x2d, 0x7c, 0x9f, 0x6e, 0xd0, 0xb3, 0x80, 0x73, 0xb7, 0x9d, 0xda, 0x77, 0x7c, 0x86, - 0x7d, 0x57, 0x83, 0xac, 0xe8, 0xdd, 0x92, 0x68, 0x48, 0x1e, 0x52, 0x37, 0x0a, 0xea, 0x58, 0x6e, - 0xc4, 0x46, 0x2f, 0x17, 0x0a, 0x96, 0x13, 0xcd, 0x56, 0xfa, 0x83, 0xf7, 0xa7, 0x25, 0x98, 0x5c, - 0x34, 0x2f, 0x19, 0x44, 0xd1, 0x6f, 0x17, 0xb3, 0x75, 0xfb, 0x1c, 0x72, 0xe4, 0x2f, 0x9c, 0x8c, - 0x3d, 0xd1, 0x40, 0x6a, 0xeb, 0x15, 0x19, 0x01, 0x43, 0x6c, 0xcb, 0x11, 0xbc, 0x06, 0x30, 0xae, - 0x9c, 0xf4, 0xe5, 0xfa, 0xa7, 0x32, 0x64, 0x17, 0x2d, 0xb3, 0x8b, 0xde, 0x98, 0x49, 0xe0, 0xb2, - 0xd0, 0xb6, 0xcc, 0x6e, 0x83, 0xdc, 0xe3, 0x15, 0x1c, 0xe3, 0x08, 0xa7, 0x29, 0xb7, 0xc3, 0x64, - 0xd7, 0xb4, 0x75, 0xc7, 0x9b, 0x46, 0xcc, 0xdd, 0xf6, 0x98, 0xbe, 0xad, 0x79, 0x9d, 0x65, 0x52, - 0xfd, 0xec, 0x6e, 0xaf, 0x4d, 0x44, 0xe8, 0xca, 0xc5, 0x15, 0xa3, 0x77, 0x97, 0x59, 0x4f, 0x2a, - 0x7a, 0x61, 0x18, 0xc9, 0xa7, 0xf1, 0x48, 0x3e, 0xb6, 0x8f, 0x84, 0x2d, 0xb3, 0x3b, 0x92, 0x4d, - 0xc6, 0x97, 0xfa, 0xa8, 0x3e, 0x9d, 0x43, 0xf5, 0x26, 0xa1, 0x32, 0xd3, 0x47, 0xf4, 0xdd, 0x59, - 0x00, 0x62, 0x66, 0x6c, 0xb8, 0x13, 0x20, 0x31, 0x1b, 0xeb, 0x67, 0xb2, 0x21, 0x59, 0x16, 0x79, - 0x59, 0x3e, 0x3e, 0xc2, 0x8a, 0x21, 0xe4, 0x23, 0x24, 0x5a, 0x84, 0xdc, 0xae, 0xfb, 0x99, 0x49, - 0x54, 0x90, 0x04, 0x79, 0x55, 0xe9, 0x9f, 0xe8, 0x4f, 0x32, 0x90, 0x23, 0x09, 0xca, 0x69, 0x00, - 0x32, 0xb0, 0xd3, 0x03, 0x41, 0x19, 0x32, 0x84, 0x87, 0x52, 0x88, 0xb6, 0xea, 0x6d, 0xf6, 0x99, - 0x9a, 0xcc, 0x41, 0x82, 0xfb, 0x37, 0x19, 0xee, 0x09, 0x2d, 0x66, 0x00, 0x84, 0x52, 0xdc, 0xbf, - 0xc9, 0xdb, 0x2a, 0xde, 0xa4, 0x21, 0x96, 0xb3, 0x6a, 0x90, 0xe0, 0xff, 0xbd, 0xea, 0x5f, 0xcc, - 0xe5, 0xfd, 0x4d, 0x52, 0xdc, 0xc9, 0x30, 0x51, 0xcb, 0x85, 0xa0, 0x88, 0x3c, 0xc9, 0xd4, 0x9b, - 0x8c, 0x5e, 0xe5, 0xab, 0xcd, 0x22, 0xa7, 0x36, 0xb7, 0x26, 0x10, 0x6f, 0xfa, 0xca, 0xf3, 0xc5, - 0x1c, 0x4c, 0x55, 0xcd, 0x36, 0xd3, 0x9d, 0xd0, 0x84, 0xf1, 0x23, 0xb9, 0x44, 0x13, 0x46, 0x9f, - 0x46, 0x84, 0x82, 0xdc, 0xc3, 0x2b, 0x88, 0x18, 0x85, 0xb0, 0x7e, 0x28, 0x0b, 0x90, 0x27, 0xda, - 0xbb, 0xff, 0xc6, 0xa7, 0x38, 0x12, 0x44, 0xb4, 0x2a, 0xfb, 0xf3, 0x3f, 0x9c, 0x8e, 0xfd, 0x57, - 0xc8, 0x91, 0x0a, 0xc6, 0xec, 0xee, 0xf0, 0x15, 0x95, 0xe2, 0x2b, 0x2a, 0xc7, 0x57, 0x34, 0xdb, - 0x5b, 0xd1, 0x24, 0xeb, 0x00, 0x51, 0x1a, 0x92, 0xbe, 0x8e, 0xff, 0xe3, 0x04, 0x40, 0x55, 0xdb, - 0xd3, 0xb7, 0xe8, 0xee, 0xf0, 0x67, 0xbc, 0xf9, 0x0f, 0xdb, 0xc7, 0xfd, 0x85, 0xd0, 0x40, 0x78, - 0x3b, 0x4c, 0xb0, 0x71, 0x8f, 0x55, 0xe4, 0x5a, 0xae, 0x22, 0x01, 0x15, 0x6a, 0x96, 0x3e, 0xe8, - 0xa8, 0x5e, 0x7e, 0xee, 0x72, 0x5a, 0xa9, 0xe7, 0x72, 0xda, 0xfe, 0x7b, 0x10, 0x11, 0x57, 0xd6, - 0xa2, 0x77, 0x08, 0x7b, 0xf4, 0x87, 0xf8, 0x09, 0xd5, 0x28, 0xa2, 0x09, 0x3e, 0x09, 0x26, 0x4c, - 0x7f, 0x43, 0x5b, 0x8e, 0x5c, 0x07, 0xab, 0x18, 0x9b, 0xa6, 0xea, 0xe5, 0x14, 0xdc, 0xfc, 0x12, - 0xe2, 0x63, 0x2c, 0x87, 0x66, 0x4e, 0x2e, 0x7b, 0xe1, 0xaa, 0xdc, 0x7a, 0x9c, 0xd7, 0x9d, 0xed, - 0x55, 0xdd, 0xb8, 0x68, 0xa3, 0xff, 0x2c, 0x66, 0x41, 0x86, 0xf0, 0x97, 0x92, 0xe1, 0xcf, 0xc7, - 0xec, 0xa8, 0xf3, 0xa8, 0xdd, 0x15, 0x45, 0xa5, 0x3f, 0xb7, 0x11, 0x00, 0xde, 0x01, 0x79, 0xca, - 0x28, 0xeb, 0x44, 0xcf, 0x46, 0xe2, 0xe7, 0x53, 0x52, 0xd9, 0x1f, 0xe8, 0xed, 0x3e, 0x8e, 0xe7, - 0x38, 0x1c, 0x17, 0x0e, 0xc4, 0x59, 0xea, 0x90, 0x9e, 0x7d, 0x22, 0x4c, 0x30, 0x49, 0x2b, 0x73, - 0xe1, 0x56, 0x5c, 0x38, 0xa2, 0x00, 0xe4, 0xd7, 0xcc, 0x3d, 0xdc, 0x30, 0x0b, 0x19, 0xf7, 0xd9, - 0xe5, 0xaf, 0x61, 0x16, 0x24, 0xf4, 0xb2, 0x49, 0x98, 0xf4, 0xe3, 0x04, 0x7d, 0x5a, 0x82, 0x42, - 0xc9, 0xc2, 0x9a, 0x83, 0x97, 0x2c, 0x73, 0x87, 0xd6, 0x48, 0xdc, 0x3b, 0xf4, 0xd7, 0x85, 0x5d, - 0x3c, 0xfc, 0xf8, 0x3d, 0xbd, 0x85, 0x45, 0x60, 0x49, 0x17, 0x21, 0x25, 0x6f, 0x11, 0x12, 0xbd, - 0x41, 0xc8, 0xe5, 0x43, 0xb4, 0x94, 0xf4, 0x9b, 0xda, 0xc7, 0x25, 0xc8, 0x95, 0x3a, 0xa6, 0x81, - 0xc3, 0x47, 0x98, 0x06, 0x9e, 0x95, 0xe9, 0xbf, 0x13, 0x81, 0x9e, 0x25, 0x89, 0xda, 0x1a, 0x81, - 0x00, 0xdc, 0xb2, 0x05, 0x65, 0x2b, 0x36, 0x48, 0xc5, 0x92, 0x1e, 0x43, 0x1c, 0x26, 0x09, 0xa6, - 0x68, 0x5c, 0x9c, 0x62, 0xa7, 0x83, 0x1e, 0x13, 0x08, 0xb5, 0x4f, 0xac, 0x25, 0xf4, 0xbb, 0xc2, - 0x2e, 0xfa, 0x7e, 0xad, 0x7c, 0xda, 0x09, 0x02, 0x04, 0x25, 0xf3, 0x18, 0x17, 0xdb, 0x4b, 0x1b, - 0xc8, 0x50, 0xfa, 0xa2, 0xfe, 0x0b, 0xc9, 0x35, 0x00, 0x8c, 0x8b, 0xeb, 0x16, 0xde, 0xd3, 0xf1, - 0x25, 0x74, 0x75, 0x20, 0xec, 0xfd, 0x41, 0x3f, 0x5e, 0x27, 0xbc, 0x88, 0x13, 0x22, 0x19, 0xb9, - 0x95, 0x35, 0xdd, 0x09, 0x32, 0xb1, 0x5e, 0xbc, 0x37, 0x12, 0x4b, 0x88, 0x8c, 0x1a, 0xce, 0x2e, - 0xb8, 0x66, 0x13, 0xcd, 0x45, 0xfa, 0x82, 0x7d, 0xdf, 0x04, 0x4c, 0x6e, 0x18, 0x76, 0xb7, 0xa3, - 0xd9, 0xdb, 0xe8, 0xdb, 0x32, 0xe4, 0xe9, 0x3d, 0x63, 0xe8, 0x87, 0xb8, 0xd8, 0x02, 0x3f, 0xb1, - 0x8b, 0x2d, 0xcf, 0x05, 0x87, 0xbe, 0xf4, 0xbf, 0x06, 0x1d, 0xbd, 0x5b, 0x16, 0x9d, 0xa4, 0x7a, - 0x85, 0x86, 0x2e, 0x9c, 0xef, 0x7f, 0x9c, 0xbd, 0xab, 0xb7, 0x9c, 0x5d, 0xcb, 0xbf, 0x54, 0xfb, - 0x09, 0x62, 0x54, 0xd6, 0xe9, 0x5f, 0xaa, 0xff, 0x3b, 0xd2, 0x60, 0x82, 0x25, 0xee, 0xdb, 0x4e, - 0xda, 0x7f, 0xfe, 0xf6, 0x24, 0xe4, 0x35, 0xcb, 0xd1, 0x6d, 0x87, 0x6d, 0xb0, 0xb2, 0x37, 0xb7, - 0xbb, 0xa4, 0x4f, 0x1b, 0x56, 0xc7, 0x8b, 0x42, 0xe2, 0x27, 0xa0, 0xdf, 0x13, 0x9a, 0x3f, 0xc6, - 0xd7, 0x3c, 0x19, 0xe4, 0xf7, 0x0d, 0xb1, 0x46, 0x7d, 0x25, 0x5c, 0xa1, 0x16, 0x1b, 0xe5, 0x26, - 0x0d, 0x5a, 0xe1, 0xc7, 0xa7, 0x68, 0xa3, 0xb7, 0xc9, 0xa1, 0xf5, 0xbb, 0xcb, 0xdc, 0x18, 0xc1, - 0xa4, 0x18, 0x8c, 0x11, 0x7e, 0x42, 0xcc, 0x6e, 0x35, 0xb7, 0x08, 0x2b, 0x8b, 0x2f, 0xc2, 0xfe, - 0xb6, 0xf0, 0x6e, 0x92, 0x2f, 0xca, 0x01, 0x6b, 0x80, 0x71, 0xf7, 0x10, 0xbd, 0x47, 0x68, 0x67, - 0x68, 0x50, 0x49, 0x87, 0x08, 0xdb, 0x6b, 0x27, 0x60, 0x62, 0x59, 0xeb, 0x74, 0xb0, 0x75, 0xd9, - 0x1d, 0x92, 0x0a, 0x1e, 0x87, 0x6b, 0x9a, 0xa1, 0x6f, 0x62, 0xdb, 0x89, 0xef, 0x2c, 0xdf, 0x21, - 0x1c, 0xe3, 0x96, 0x95, 0x31, 0xdf, 0x4b, 0x3f, 0x42, 0xe6, 0xb7, 0x40, 0x56, 0x37, 0x36, 0x4d, - 0xd6, 0x65, 0xf6, 0xae, 0xda, 0x7b, 0x3f, 0x93, 0xa9, 0x0b, 0xc9, 0x28, 0x18, 0xe6, 0x56, 0x90, - 0x8b, 0xf4, 0x7b, 0xce, 0xdf, 0xc9, 0xc2, 0xac, 0xc7, 0x44, 0xc5, 0x68, 0xe3, 0x07, 0xc3, 0x4b, - 0x31, 0xbf, 0x92, 0x15, 0x3d, 0x0e, 0xd6, 0x5b, 0x1f, 0x42, 0x2a, 0x42, 0xa4, 0x0d, 0x80, 0x96, - 0xe6, 0xe0, 0x2d, 0xd3, 0xd2, 0xfd, 0xfe, 0xf0, 0xc9, 0x49, 0xa8, 0x95, 0xe8, 0xdf, 0x97, 0xd5, - 0x10, 0x1d, 0xe5, 0x2e, 0x98, 0xc6, 0xfe, 0xf9, 0x7b, 0x6f, 0xa9, 0x26, 0x16, 0xaf, 0x70, 0x7e, - 0xf4, 0x17, 0x42, 0xa7, 0xce, 0x44, 0xaa, 0x99, 0x0c, 0xb3, 0xe6, 0x70, 0x6d, 0x68, 0xa3, 0xba, - 0x56, 0x54, 0xeb, 0x2b, 0xc5, 0xd5, 0xd5, 0x4a, 0x75, 0xd9, 0x0f, 0xfc, 0xa2, 0xc0, 0xdc, 0x62, - 0xed, 0x7c, 0x35, 0x14, 0x99, 0x27, 0x8b, 0xd6, 0x61, 0xd2, 0x93, 0x57, 0x3f, 0x5f, 0xcc, 0xb0, - 0xcc, 0x98, 0x2f, 0x66, 0x28, 0xc9, 0x35, 0xce, 0xf4, 0x96, 0xef, 0xa0, 0x43, 0x9e, 0xd1, 0x1f, - 0x6b, 0x90, 0x23, 0x6b, 0xea, 0xe8, 0x2d, 0x64, 0x1b, 0xb0, 0xdb, 0xd1, 0x5a, 0x18, 0xed, 0x24, - 0xb0, 0xc6, 0xbd, 0x4b, 0x17, 0xa4, 0x7d, 0x97, 0x2e, 0x90, 0x47, 0x66, 0xf5, 0x1d, 0xef, 0xb7, - 0x8e, 0xaf, 0xd2, 0x2c, 0xfc, 0x01, 0xad, 0xd8, 0xdd, 0x15, 0xba, 0xfc, 0xcf, 0xd8, 0x8c, 0x50, - 0xc9, 0x68, 0x9e, 0x92, 0x59, 0xa2, 0x62, 0xfb, 0x30, 0x71, 0x1c, 0x8d, 0xe1, 0x62, 0xf0, 0x2c, - 0xe4, 0xea, 0xdd, 0x8e, 0xee, 0xa0, 0xdf, 0x94, 0x46, 0x82, 0x19, 0xbd, 0x28, 0x43, 0x1e, 0x78, - 0x51, 0x46, 0xb0, 0xeb, 0x9a, 0x15, 0xd8, 0x75, 0x6d, 0xe0, 0x07, 0x1d, 0x7e, 0xd7, 0xf5, 0x76, - 0x16, 0xbc, 0x8d, 0xee, 0xd9, 0x3e, 0xb6, 0x8f, 0x48, 0x49, 0xb5, 0xfa, 0x44, 0x05, 0x3c, 0xfb, - 0x44, 0x16, 0x9c, 0x0c, 0x20, 0xbf, 0x50, 0x6b, 0x34, 0x6a, 0x6b, 0x85, 0x23, 0x24, 0xaa, 0x4d, - 0x6d, 0x9d, 0x86, 0x8a, 0xa9, 0x54, 0xab, 0x65, 0xb5, 0x20, 0x91, 0x70, 0x69, 0x95, 0xc6, 0x6a, - 0xb9, 0x20, 0xf3, 0x51, 0xd3, 0x63, 0xcd, 0x6f, 0xbe, 0xec, 0x34, 0xd5, 0x4b, 0xcc, 0x10, 0x8f, - 0xe6, 0x27, 0x7d, 0xe5, 0xfa, 0x35, 0x19, 0x72, 0x6b, 0xd8, 0xda, 0xc2, 0xe8, 0x27, 0x12, 0x6c, - 0xf2, 0x6d, 0xea, 0x96, 0x4d, 0x83, 0xcb, 0x05, 0x9b, 0x7c, 0xe1, 0x34, 0xe5, 0x7a, 0x98, 0xb5, - 0x71, 0xcb, 0x34, 0xda, 0x5e, 0x26, 0xda, 0x1f, 0xf1, 0x89, 0xfc, 0x8d, 0xf5, 0x02, 0x90, 0x11, - 0x46, 0x47, 0xb2, 0x53, 0x97, 0x04, 0x98, 0x7e, 0xa5, 0xa6, 0x0f, 0xcc, 0x37, 0x64, 0xf7, 0xa7, - 0xee, 0x65, 0xf4, 0x22, 0xe1, 0xdd, 0xd7, 0x9b, 0x21, 0x4f, 0xd4, 0xd4, 0x1b, 0xa3, 0xfb, 0xf7, - 0xc7, 0x2c, 0x8f, 0xb2, 0x00, 0xc7, 0x6c, 0xdc, 0xc1, 0x2d, 0x07, 0xb7, 0xdd, 0xa6, 0xab, 0x0e, - 0xec, 0x14, 0xf6, 0x67, 0x47, 0x7f, 0x16, 0x06, 0xf0, 0x4e, 0x1e, 0xc0, 0x1b, 0xfa, 0x88, 0xd2, - 0xad, 0x50, 0xb4, 0xad, 0xec, 0x56, 0xa3, 0xde, 0x31, 0xfd, 0x45, 0x71, 0xef, 0xdd, 0xfd, 0xb6, - 0xed, 0xec, 0x74, 0xc8, 0x37, 0x76, 0xc0, 0xc0, 0x7b, 0x57, 0xe6, 0x61, 0x42, 0x33, 0x2e, 0x93, - 0x4f, 0xd9, 0x98, 0x5a, 0x7b, 0x99, 0xd0, 0xcb, 0x7c, 0xe4, 0xef, 0xe6, 0x90, 0x7f, 0xbc, 0x18, - 0xbb, 0xe9, 0x03, 0xff, 0xd3, 0x13, 0x90, 0x5b, 0xd7, 0x6c, 0x07, 0xa3, 0xff, 0x47, 0x16, 0x45, - 0xfe, 0x06, 0x98, 0xdb, 0x34, 0x5b, 0xbb, 0x36, 0x6e, 0xf3, 0x8d, 0xb2, 0x27, 0x75, 0x14, 0x98, - 0x2b, 0x37, 0x41, 0xc1, 0x4b, 0x64, 0x64, 0xbd, 0x6d, 0xf8, 0x7d, 0xe9, 0x24, 0x06, 0xb7, 0xbd, - 0xae, 0x59, 0x4e, 0x6d, 0x93, 0xa4, 0xf9, 0x31, 0xb8, 0xc3, 0x89, 0x1c, 0xf4, 0xf9, 0x18, 0xe8, - 0x27, 0xa2, 0xa1, 0x9f, 0x14, 0x80, 0x5e, 0x29, 0xc2, 0xe4, 0xa6, 0xde, 0xc1, 0xe4, 0x87, 0x29, - 0xf2, 0x43, 0xbf, 0x31, 0x89, 0xc8, 0xde, 0x1f, 0x93, 0x96, 0xf4, 0x0e, 0x56, 0xfd, 0xdf, 0xbc, - 0x89, 0x0c, 0x04, 0x13, 0x99, 0x55, 0xea, 0x4f, 0xeb, 0x1a, 0x5e, 0x86, 0xb6, 0x83, 0xbd, 0xc5, - 0x37, 0x83, 0x1d, 0x6e, 0x69, 0x6b, 0x8e, 0x46, 0xc0, 0x98, 0x51, 0xc9, 0x33, 0xef, 0x17, 0x22, - 0xf7, 0xfa, 0x85, 0x3c, 0x47, 0x4e, 0xd6, 0x23, 0x7a, 0xcc, 0x46, 0xb4, 0xa8, 0x0b, 0x1e, 0x40, - 0xd4, 0x52, 0xf4, 0xdf, 0x5d, 0x60, 0x5a, 0x9a, 0x85, 0x9d, 0xf5, 0xb0, 0x27, 0x46, 0x4e, 0xe5, - 0x13, 0x89, 0x2b, 0x9f, 0x5d, 0xd7, 0x76, 0x30, 0x29, 0xac, 0xe4, 0x7e, 0x63, 0x2e, 0x5a, 0xfb, - 0xd2, 0x83, 0xfe, 0x37, 0x37, 0xea, 0xfe, 0xb7, 0x5f, 0x1d, 0xd3, 0x6f, 0x86, 0xaf, 0xcc, 0x82, - 0x5c, 0xda, 0x75, 0x1e, 0xd5, 0xdd, 0xef, 0x77, 0x84, 0xfd, 0x5c, 0x58, 0x7f, 0x16, 0x79, 0x45, - 0xfd, 0x98, 0x7a, 0xdf, 0x84, 0x5a, 0x22, 0xe6, 0x4f, 0x13, 0x55, 0xb7, 0xf4, 0x75, 0xe4, 0x8d, - 0xb2, 0xef, 0x60, 0xf9, 0x50, 0xe6, 0xe0, 0xa6, 0x39, 0xa2, 0xfd, 0x53, 0xa8, 0x67, 0xf0, 0xdf, - 0xbd, 0x8e, 0x27, 0xcb, 0xc5, 0xea, 0x23, 0xdb, 0xeb, 0x44, 0x94, 0x33, 0x2a, 0x7d, 0x41, 0x2f, - 0x16, 0x76, 0x3b, 0xa7, 0x62, 0x8b, 0x75, 0x25, 0x4c, 0x66, 0x53, 0x89, 0x5d, 0x43, 0x1a, 0x53, - 0x6c, 0xfa, 0x80, 0x7d, 0x3d, 0xec, 0x2a, 0x58, 0x3c, 0x30, 0x62, 0xe8, 0xe5, 0xc2, 0xdb, 0x51, - 0xb4, 0xda, 0x03, 0xd6, 0x0b, 0x93, 0xc9, 0x5b, 0x6c, 0xb3, 0x2a, 0xb6, 0xe0, 0xf4, 0x25, 0xfe, - 0x35, 0x19, 0xf2, 0x74, 0x0b, 0x12, 0xbd, 0x3e, 0x93, 0xe0, 0xfe, 0x76, 0x87, 0x77, 0x21, 0xf4, - 0xdf, 0x93, 0xac, 0x39, 0x70, 0xae, 0x86, 0xd9, 0x44, 0xae, 0x86, 0xfc, 0x39, 0x4e, 0x81, 0x76, - 0x44, 0xeb, 0x98, 0xf2, 0x74, 0x32, 0x49, 0x0b, 0xeb, 0xcb, 0x50, 0xfa, 0x78, 0xff, 0x6c, 0x0e, - 0x66, 0x68, 0xd1, 0xe7, 0xf5, 0xf6, 0x16, 0x76, 0xd0, 0xdb, 0xa4, 0xef, 0x1d, 0xd4, 0x95, 0x2a, - 0xcc, 0x5c, 0x22, 0x6c, 0xaf, 0x6a, 0x97, 0xcd, 0x5d, 0x87, 0xad, 0x5c, 0xdc, 0x14, 0xbb, 0xee, - 0x41, 0xeb, 0x39, 0x4f, 0xff, 0x50, 0xb9, 0xff, 0x5d, 0x19, 0xd3, 0x05, 0x7f, 0xea, 0xc0, 0x95, - 0x27, 0x46, 0x56, 0x38, 0x49, 0x39, 0x09, 0xf9, 0x3d, 0x1d, 0x5f, 0xaa, 0xb4, 0x99, 0x75, 0xcb, - 0xde, 0xd0, 0x1f, 0x08, 0xef, 0xdb, 0x86, 0xe1, 0x66, 0xbc, 0xa4, 0xab, 0x85, 0x62, 0xbb, 0xb7, - 0x03, 0xd9, 0x1a, 0xc3, 0x99, 0x62, 0xfe, 0x9a, 0xcf, 0x52, 0x02, 0x45, 0x8c, 0x32, 0x9c, 0xf9, - 0x50, 0x1e, 0xb1, 0x27, 0x56, 0xa8, 0x00, 0x46, 0x7c, 0x03, 0xa8, 0x58, 0x7c, 0x89, 0x01, 0x45, - 0xa7, 0x2f, 0xf9, 0x57, 0xc9, 0x30, 0x55, 0xc7, 0xce, 0x92, 0x8e, 0x3b, 0x6d, 0x1b, 0x59, 0x07, - 0x37, 0x8d, 0x6e, 0x81, 0xfc, 0x26, 0x21, 0x36, 0xe8, 0xdc, 0x02, 0xcb, 0x86, 0x5e, 0x29, 0x89, - 0xee, 0x08, 0xb3, 0xd5, 0x37, 0x8f, 0xdb, 0x91, 0xc0, 0x24, 0xe6, 0xd1, 0x1b, 0x5f, 0xf2, 0x18, - 0x02, 0xdb, 0xca, 0x30, 0xc3, 0xee, 0x05, 0x2c, 0x76, 0xf4, 0x2d, 0x03, 0xed, 0x8e, 0xa0, 0x85, - 0x28, 0xb7, 0x42, 0x4e, 0x73, 0xa9, 0xb1, 0xad, 0x57, 0xd4, 0xb7, 0xf3, 0x24, 0xe5, 0xa9, 0x34, - 0x63, 0x82, 0x30, 0x92, 0x81, 0x62, 0x7b, 0x3c, 0x8f, 0x31, 0x8c, 0xe4, 0xc0, 0xc2, 0xd3, 0x47, - 0xec, 0x0b, 0x32, 0x1c, 0x67, 0x0c, 0x9c, 0xc3, 0x96, 0xa3, 0xb7, 0xb4, 0x0e, 0x45, 0xee, 0xf9, - 0x99, 0x51, 0x40, 0xb7, 0x02, 0xb3, 0x7b, 0x61, 0xb2, 0x0c, 0xc2, 0xb3, 0x7d, 0x21, 0xe4, 0x18, - 0x50, 0xf9, 0x1f, 0x13, 0x84, 0xe3, 0xe3, 0xa4, 0xca, 0xd1, 0x1c, 0x63, 0x38, 0x3e, 0x61, 0x26, - 0xd2, 0x87, 0xf8, 0x85, 0x2c, 0x34, 0x4f, 0xd0, 0x7d, 0x7e, 0x46, 0x18, 0xdb, 0x0d, 0x98, 0x26, - 0x58, 0xd2, 0x1f, 0xd9, 0x32, 0x44, 0x8c, 0x12, 0xfb, 0xfd, 0x0e, 0xbb, 0x30, 0xcc, 0xff, 0x57, - 0x0d, 0xd3, 0x41, 0xe7, 0x01, 0x82, 0x4f, 0xe1, 0x4e, 0x3a, 0x13, 0xd5, 0x49, 0x4b, 0x62, 0x9d, - 0xf4, 0xeb, 0x84, 0x83, 0xa5, 0xf4, 0x67, 0xfb, 0xe0, 0xea, 0x21, 0x16, 0x26, 0x63, 0x70, 0xe9, - 0xe9, 0xeb, 0xc5, 0xcb, 0xb2, 0xbd, 0x17, 0xc0, 0x7f, 0x70, 0x24, 0xf3, 0xa9, 0x70, 0x7f, 0x20, - 0xf7, 0xf4, 0x07, 0x07, 0xb0, 0xa4, 0x6f, 0x84, 0xa3, 0xb4, 0x88, 0x92, 0xcf, 0x56, 0x8e, 0x86, - 0x82, 0xe8, 0x49, 0x46, 0x1f, 0x1a, 0x42, 0x09, 0x06, 0xdd, 0x4e, 0x1f, 0xd7, 0xc9, 0x25, 0x33, - 0x76, 0x93, 0x2a, 0xc8, 0xe1, 0x5d, 0x6a, 0xff, 0xd5, 0x2c, 0xb5, 0x76, 0x37, 0xc8, 0x9d, 0x6e, - 0xe8, 0x2f, 0xb3, 0xa3, 0x18, 0x11, 0xee, 0x81, 0x2c, 0x71, 0x71, 0x97, 0x23, 0x97, 0x34, 0x82, - 0x22, 0x83, 0x0b, 0xf7, 0xf0, 0x83, 0xce, 0xca, 0x11, 0x95, 0xfc, 0xa9, 0xdc, 0x04, 0x47, 0x2f, - 0x68, 0xad, 0x8b, 0x5b, 0x96, 0xb9, 0x4b, 0x6e, 0xbf, 0x32, 0xd9, 0x35, 0x5a, 0xe4, 0x3a, 0x42, - 0xfe, 0x83, 0x72, 0x9b, 0x67, 0x3a, 0xe4, 0x06, 0x99, 0x0e, 0x2b, 0x47, 0x98, 0xf1, 0xa0, 0x3c, - 0xd1, 0xef, 0x74, 0xf2, 0xb1, 0x9d, 0xce, 0xca, 0x11, 0xaf, 0xdb, 0x51, 0x16, 0x61, 0xb2, 0xad, - 0xef, 0x91, 0xad, 0x6a, 0x32, 0xeb, 0x1a, 0x74, 0x74, 0x79, 0x51, 0xdf, 0xa3, 0x1b, 0xdb, 0x2b, - 0x47, 0x54, 0xff, 0x4f, 0x65, 0x19, 0xa6, 0xc8, 0xb6, 0x00, 0x21, 0x33, 0x99, 0xe8, 0x58, 0xf2, - 0xca, 0x11, 0x35, 0xf8, 0xd7, 0xb5, 0x3e, 0xb2, 0xe4, 0xec, 0xc7, 0xdd, 0xde, 0x76, 0x7b, 0x26, - 0xd1, 0x76, 0xbb, 0x2b, 0x0b, 0xba, 0xe1, 0x7e, 0x12, 0x72, 0x2d, 0x22, 0x61, 0x89, 0x49, 0x98, - 0xbe, 0x2a, 0x77, 0x42, 0x76, 0x47, 0xb3, 0xbc, 0xc9, 0xf3, 0x0d, 0x83, 0xe9, 0xae, 0x69, 0xd6, - 0x45, 0x17, 0x41, 0xf7, 0xaf, 0x85, 0x09, 0xc8, 0x11, 0xc1, 0xf9, 0x0f, 0xe8, 0x8d, 0x59, 0x6a, - 0x86, 0x94, 0x4c, 0xc3, 0x1d, 0xf6, 0x1b, 0xa6, 0x77, 0x40, 0xe6, 0x0f, 0x32, 0xa3, 0xb1, 0x20, - 0xfb, 0xde, 0x98, 0x2e, 0x47, 0xde, 0x98, 0xde, 0x73, 0x75, 0x6f, 0xb6, 0xf7, 0xea, 0xde, 0x60, - 0xf9, 0x20, 0x37, 0xd8, 0x51, 0xe5, 0xcf, 0x86, 0x30, 0x5d, 0x7a, 0x05, 0x11, 0x3d, 0x03, 0xef, - 0xe8, 0x46, 0xa8, 0xce, 0xde, 0x6b, 0xc2, 0x4e, 0x29, 0xa9, 0x51, 0x33, 0x80, 0xbd, 0xf4, 0xfb, - 0xa6, 0xdf, 0xca, 0xc2, 0x29, 0x7a, 0x41, 0xf4, 0x1e, 0x6e, 0x98, 0xfc, 0x7d, 0x93, 0xe8, 0x63, - 0x23, 0x51, 0x9a, 0x3e, 0x03, 0x8e, 0xdc, 0x77, 0xc0, 0xd9, 0x77, 0x48, 0x39, 0x3b, 0xe0, 0x90, - 0x72, 0x2e, 0xd9, 0xca, 0xe1, 0x7b, 0xc3, 0xfa, 0xb3, 0xce, 0xeb, 0xcf, 0x1d, 0x11, 0x00, 0xf5, - 0x93, 0xcb, 0x48, 0xec, 0x9b, 0xb7, 0xf8, 0x9a, 0x52, 0xe7, 0x34, 0xe5, 0xee, 0xe1, 0x19, 0x49, - 0x5f, 0x5b, 0x7e, 0x3f, 0x0b, 0x57, 0x04, 0xcc, 0x54, 0xf1, 0x25, 0xa6, 0x28, 0x9f, 0x1e, 0x89, - 0xa2, 0x24, 0x8f, 0x81, 0x90, 0xb6, 0xc6, 0xfc, 0x89, 0xf0, 0xd9, 0xa1, 0x5e, 0xa0, 0x7c, 0xd9, - 0x44, 0x28, 0xcb, 0x49, 0xc8, 0xd3, 0x1e, 0x86, 0x41, 0xc3, 0xde, 0x12, 0x76, 0x37, 0x62, 0x27, - 0x8e, 0x44, 0x79, 0x1b, 0x83, 0xfe, 0xb0, 0x75, 0x8d, 0xc6, 0xae, 0x65, 0x54, 0x0c, 0xc7, 0x44, - 0x3f, 0x35, 0x12, 0xc5, 0xf1, 0xbd, 0xe1, 0xe4, 0x61, 0xbc, 0xe1, 0x86, 0x5a, 0xe5, 0xf0, 0x6a, - 0x70, 0x28, 0xab, 0x1c, 0x11, 0x85, 0xa7, 0x8f, 0xdf, 0x9b, 0x65, 0x38, 0xc9, 0x26, 0x5b, 0x0b, - 0xbc, 0x85, 0x88, 0xee, 0x1f, 0x05, 0x90, 0xc7, 0x3d, 0x33, 0x89, 0xdd, 0x72, 0x46, 0x5e, 0xf8, - 0x93, 0x52, 0xb1, 0xf7, 0x3b, 0x70, 0xd3, 0xc1, 0x1e, 0x0e, 0x47, 0x82, 0x94, 0xd8, 0xb5, 0x0e, - 0x09, 0xd8, 0x48, 0x1f, 0xb3, 0x5f, 0x92, 0x21, 0x4f, 0xcf, 0x69, 0xa1, 0x8d, 0x54, 0x1c, 0x26, - 0xf8, 0x28, 0xcf, 0x02, 0x3b, 0x72, 0x89, 0x2f, 0xb9, 0x4f, 0x6f, 0x2f, 0xee, 0x90, 0x6e, 0xb1, - 0xff, 0x86, 0x04, 0xd3, 0x75, 0xec, 0x94, 0x34, 0xcb, 0xd2, 0xb5, 0xad, 0x51, 0x79, 0x7c, 0x8b, - 0x7a, 0x0f, 0xa3, 0x6f, 0x66, 0x44, 0xcf, 0xd3, 0xf8, 0x0b, 0xe1, 0x1e, 0xab, 0x11, 0xb1, 0x04, - 0x1f, 0x11, 0x3a, 0x33, 0x33, 0x88, 0xda, 0x18, 0x3c, 0xb6, 0x25, 0x98, 0xf0, 0xce, 0xe2, 0xdd, - 0xc2, 0x9d, 0xcf, 0xdc, 0x76, 0x76, 0xbc, 0x63, 0x30, 0xe4, 0x79, 0xff, 0x19, 0x30, 0xf4, 0xd2, - 0x84, 0x8e, 0xf2, 0xf1, 0x07, 0x09, 0x93, 0xb5, 0xb1, 0x24, 0xee, 0xf0, 0x87, 0x75, 0x74, 0xf0, - 0x77, 0x27, 0xd8, 0x72, 0xe4, 0xaa, 0xe6, 0xe0, 0x07, 0xd1, 0x67, 0x64, 0x98, 0xa8, 0x63, 0xc7, - 0x1d, 0x6f, 0xb9, 0xcb, 0x4d, 0x87, 0xd5, 0x70, 0x25, 0xb4, 0xe2, 0x31, 0xc5, 0xd6, 0x30, 0xee, - 0x85, 0xa9, 0xae, 0x65, 0xb6, 0xb0, 0x6d, 0xb3, 0xd5, 0x8b, 0xb0, 0xa3, 0x5a, 0xbf, 0xd1, 0x9f, - 0xb0, 0x36, 0xbf, 0xee, 0xfd, 0xa3, 0x06, 0xbf, 0x27, 0x35, 0x03, 0x28, 0x25, 0x56, 0xc1, 0x71, - 0x9b, 0x01, 0x71, 0x85, 0xa7, 0x0f, 0xf4, 0x27, 0x65, 0x98, 0xa9, 0x63, 0xc7, 0x97, 0x62, 0x82, - 0x4d, 0x8e, 0x68, 0x78, 0x39, 0x28, 0xe5, 0x83, 0x41, 0x29, 0x7e, 0x35, 0x20, 0x2f, 0x4d, 0x9f, - 0xd8, 0x18, 0xaf, 0x06, 0x14, 0xe3, 0x60, 0x0c, 0xc7, 0xd7, 0x1e, 0x0b, 0x53, 0x84, 0x17, 0xd2, - 0x60, 0x7f, 0x3e, 0x1b, 0x34, 0xde, 0xcf, 0xa6, 0xd4, 0x78, 0xef, 0x82, 0xdc, 0x8e, 0x66, 0x5d, - 0xb4, 0x49, 0xc3, 0x9d, 0x16, 0x31, 0xdb, 0xd7, 0xdc, 0xec, 0x2a, 0xfd, 0xab, 0xbf, 0x9f, 0x66, - 0x2e, 0x99, 0x9f, 0xe6, 0x23, 0x52, 0xa2, 0x91, 0x90, 0xce, 0x1d, 0x46, 0xd8, 0xe4, 0x13, 0x8c, - 0x9b, 0x31, 0x65, 0xa7, 0xaf, 0x1c, 0xcf, 0x97, 0x61, 0xd2, 0x1d, 0xb7, 0x89, 0x3d, 0x7e, 0xfe, - 0xe0, 0xea, 0xd0, 0xdf, 0xd0, 0x4f, 0xd8, 0x03, 0x7b, 0x12, 0x19, 0x9d, 0x79, 0x9f, 0xa0, 0x07, - 0x8e, 0x2b, 0x3c, 0x7d, 0x3c, 0xde, 0x4a, 0xf1, 0x20, 0xed, 0x01, 0xbd, 0x46, 0x06, 0x79, 0x19, - 0x3b, 0xe3, 0xb6, 0x22, 0xdf, 0x24, 0x1c, 0xe2, 0x88, 0x13, 0x18, 0xe1, 0x79, 0x7e, 0x19, 0x8f, - 0xa6, 0x01, 0x89, 0xc5, 0x36, 0x12, 0x62, 0x20, 0x7d, 0xd4, 0xde, 0x49, 0x51, 0xa3, 0x9b, 0x0b, - 0x3f, 0x39, 0x82, 0x5e, 0x75, 0xbc, 0x0b, 0x1f, 0x9e, 0x00, 0x09, 0x8d, 0xc3, 0x6a, 0x6f, 0xfd, - 0x0a, 0x1f, 0xcb, 0x55, 0x7c, 0xe0, 0x36, 0xf6, 0x6d, 0xdc, 0xba, 0x88, 0xdb, 0xe8, 0xc7, 0x0e, - 0x0e, 0xdd, 0x29, 0x98, 0x68, 0x51, 0x6a, 0x04, 0xbc, 0x49, 0xd5, 0x7b, 0x4d, 0x70, 0xaf, 0x34, - 0xdf, 0x11, 0xd1, 0xdf, 0xc7, 0x78, 0xaf, 0xb4, 0x40, 0xf1, 0x63, 0x30, 0x5b, 0xe8, 0x2c, 0xa3, - 0xd2, 0x32, 0x0d, 0xf4, 0x5f, 0x0e, 0x0e, 0xcb, 0x35, 0x30, 0xa5, 0xb7, 0x4c, 0x83, 0x84, 0xa1, - 0xf0, 0x0e, 0x01, 0xf9, 0x09, 0xde, 0xd7, 0xf2, 0x8e, 0xf9, 0x80, 0xce, 0x76, 0xcd, 0x83, 0x84, - 0x61, 0x8d, 0x09, 0x97, 0xf5, 0xc3, 0x32, 0x26, 0xfa, 0x94, 0x9d, 0x3e, 0x64, 0x1f, 0x0a, 0xbc, - 0xdb, 0x68, 0x57, 0xf8, 0xa8, 0x58, 0x05, 0x1e, 0x66, 0x38, 0x0b, 0xd7, 0xe2, 0x50, 0x86, 0xb3, - 0x18, 0x06, 0xc6, 0x70, 0x63, 0x45, 0x80, 0x63, 0xea, 0x6b, 0xc0, 0x07, 0x40, 0x67, 0x74, 0xe6, - 0xe1, 0x90, 0xe8, 0x1c, 0x8e, 0x89, 0xf8, 0x1e, 0x16, 0x22, 0x93, 0x59, 0x3c, 0xe8, 0xbf, 0x8e, - 0x02, 0x9c, 0x3b, 0x86, 0xf1, 0x57, 0xa0, 0xde, 0x0a, 0x09, 0x6e, 0xc4, 0xde, 0x27, 0x41, 0x97, - 0xca, 0x18, 0xef, 0x8a, 0x17, 0x29, 0x3f, 0x7d, 0x00, 0x9f, 0x27, 0xc3, 0x1c, 0xf1, 0x11, 0xe8, - 0x60, 0xcd, 0xa2, 0x1d, 0xe5, 0x48, 0x1c, 0xe5, 0xdf, 0x2a, 0x1c, 0xe0, 0x87, 0x97, 0x43, 0xc0, - 0xc7, 0x48, 0xa0, 0x10, 0x8b, 0xee, 0x23, 0xc8, 0xc2, 0x58, 0xb6, 0x51, 0x0a, 0x3e, 0x0b, 0x4c, - 0xc5, 0x47, 0x83, 0x47, 0x42, 0x8f, 0x5c, 0x5e, 0x18, 0x5e, 0x63, 0x1b, 0xb3, 0x47, 0xae, 0x08, - 0x13, 0xe9, 0x63, 0xf2, 0x9a, 0x5b, 0xd9, 0x82, 0x73, 0x83, 0x5c, 0x18, 0xff, 0xf2, 0xac, 0x7f, - 0xa2, 0xed, 0x93, 0x23, 0xf1, 0xc0, 0x3c, 0x40, 0x40, 0x7c, 0x05, 0xb2, 0x96, 0x79, 0x89, 0x2e, - 0x6d, 0xcd, 0xaa, 0xe4, 0x99, 0x5e, 0x4f, 0xd9, 0xd9, 0xdd, 0x31, 0xe8, 0xc9, 0xd0, 0x59, 0xd5, - 0x7b, 0x55, 0xae, 0x87, 0xd9, 0x4b, 0xba, 0xb3, 0xbd, 0x82, 0xb5, 0x36, 0xb6, 0x54, 0xf3, 0x12, - 0xf1, 0x98, 0x9b, 0x54, 0xf9, 0x44, 0xde, 0x7f, 0x45, 0xc0, 0xbe, 0x24, 0xb7, 0xc8, 0x8f, 0xe5, - 0xf8, 0x5b, 0x12, 0xcb, 0x33, 0x9a, 0xab, 0xf4, 0x15, 0xe6, 0x5d, 0x32, 0x4c, 0xa9, 0xe6, 0x25, - 0xa6, 0x24, 0xff, 0xd7, 0xe1, 0xea, 0x48, 0xe2, 0x89, 0x1e, 0x91, 0x9c, 0xcf, 0xfe, 0xd8, 0x27, - 0x7a, 0xb1, 0xc5, 0x8f, 0xe5, 0xe4, 0xd2, 0x8c, 0x6a, 0x5e, 0xaa, 0x63, 0x87, 0xb6, 0x08, 0xd4, - 0x1c, 0x91, 0x93, 0xb5, 0x6e, 0x53, 0x82, 0x6c, 0x1e, 0xee, 0xbf, 0x27, 0xdd, 0x45, 0xf0, 0x05, - 0xe4, 0xb3, 0x38, 0xee, 0x5d, 0x84, 0x81, 0x1c, 0x8c, 0x21, 0x46, 0x8a, 0x0c, 0xd3, 0xaa, 0x79, - 0xc9, 0x1d, 0x1a, 0x96, 0xf4, 0x4e, 0x67, 0x34, 0x23, 0x64, 0x52, 0xe3, 0xdf, 0x13, 0x83, 0xc7, - 0xc5, 0xd8, 0x8d, 0xff, 0x01, 0x0c, 0xa4, 0x0f, 0xc3, 0x73, 0x68, 0x63, 0xf1, 0x46, 0x68, 0x63, - 0x34, 0x38, 0x0c, 0xdb, 0x20, 0x7c, 0x36, 0x0e, 0xad, 0x41, 0x44, 0x71, 0x30, 0x96, 0x9d, 0x93, - 0xb9, 0x12, 0x19, 0xe6, 0x47, 0xdb, 0x26, 0xde, 0x9e, 0xcc, 0x35, 0x91, 0x0d, 0xbb, 0x1c, 0x23, - 0x23, 0x41, 0x23, 0x81, 0x0b, 0xa2, 0x00, 0x0f, 0xe9, 0xe3, 0xf1, 0x7e, 0x19, 0x66, 0x28, 0x0b, - 0x8f, 0x12, 0x2b, 0x60, 0xa8, 0x46, 0x15, 0xae, 0xc1, 0xe1, 0x34, 0xaa, 0x18, 0x0e, 0xc6, 0x72, - 0x2b, 0xa8, 0x6b, 0xc7, 0x0d, 0x71, 0x7c, 0x3c, 0x0a, 0xc1, 0xa1, 0x8d, 0xb1, 0x11, 0x1e, 0x21, - 0x1f, 0xc6, 0x18, 0x3b, 0xa4, 0x63, 0xe4, 0xcf, 0xf1, 0x5b, 0xd1, 0x28, 0x31, 0x38, 0x40, 0x53, - 0x18, 0x21, 0x0c, 0x43, 0x36, 0x85, 0x43, 0x42, 0xe2, 0x8b, 0x32, 0x00, 0x65, 0x60, 0xcd, 0xdc, - 0x23, 0x97, 0xf9, 0x8c, 0xa0, 0x3b, 0xeb, 0x75, 0xab, 0x97, 0x07, 0xb8, 0xd5, 0x27, 0x0c, 0xe1, - 0x92, 0x74, 0x25, 0x30, 0x24, 0x65, 0xb7, 0x92, 0x63, 0x5f, 0x09, 0x8c, 0x2f, 0x3f, 0x7d, 0x8c, - 0x3f, 0x4f, 0xad, 0xb9, 0xe0, 0x80, 0xe9, 0x6f, 0x8c, 0x04, 0xe5, 0xd0, 0xec, 0x5f, 0xe6, 0x67, - 0xff, 0x07, 0xc0, 0x76, 0x58, 0x1b, 0x71, 0xd0, 0xc1, 0xd1, 0xf4, 0x6d, 0xc4, 0xc3, 0x3b, 0x20, - 0xfa, 0x93, 0x59, 0x38, 0xca, 0x3a, 0x91, 0xef, 0x05, 0x88, 0x13, 0x9e, 0xc3, 0xe3, 0x3a, 0xc9, - 0x01, 0x28, 0x8f, 0x6a, 0x41, 0x2a, 0xc9, 0x52, 0xa6, 0x00, 0x7b, 0x63, 0x59, 0xdd, 0xc8, 0x97, - 0x1f, 0xec, 0x6a, 0x46, 0x5b, 0x3c, 0xdc, 0xef, 0x00, 0xe0, 0xbd, 0xb5, 0x46, 0x99, 0x5f, 0x6b, - 0xec, 0xb3, 0x32, 0x99, 0x78, 0xe7, 0x9a, 0x88, 0x8c, 0xb2, 0x3b, 0xf6, 0x9d, 0xeb, 0xe8, 0xb2, - 0xd3, 0x47, 0xe9, 0xed, 0x32, 0x64, 0xeb, 0xa6, 0xe5, 0xa0, 0xe7, 0x26, 0x69, 0x9d, 0x54, 0xf2, - 0x01, 0x48, 0xde, 0xbb, 0x52, 0xe2, 0x6e, 0x69, 0xbe, 0x25, 0xfe, 0xa8, 0xb3, 0xe6, 0x68, 0xc4, - 0xab, 0xdb, 0x2d, 0x3f, 0x74, 0x5d, 0x73, 0xd2, 0x78, 0x3a, 0x54, 0x7e, 0xf5, 0xe8, 0x03, 0x18, - 0xa9, 0xc5, 0xd3, 0x89, 0x2c, 0x39, 0x7d, 0xdc, 0x1e, 0x3e, 0xca, 0x7c, 0x5b, 0x97, 0xf4, 0x0e, - 0x46, 0xcf, 0xa5, 0x2e, 0x23, 0x55, 0x6d, 0x07, 0x8b, 0x1f, 0x89, 0x89, 0x75, 0x6d, 0x25, 0xf1, - 0x65, 0xe5, 0x20, 0xbe, 0x6c, 0xd2, 0x06, 0x45, 0x0f, 0xa0, 0x53, 0x96, 0xc6, 0xdd, 0xa0, 0x62, - 0xca, 0x1e, 0x4b, 0x9c, 0xce, 0x63, 0x75, 0xec, 0x50, 0xa3, 0xb2, 0xe6, 0xdd, 0xc0, 0xf2, 0xe3, - 0x23, 0x89, 0xd8, 0xe9, 0x5f, 0xf0, 0x22, 0xf7, 0x5c, 0xf0, 0xf2, 0xae, 0x30, 0x38, 0x6b, 0x3c, - 0x38, 0x3f, 0x1c, 0x2d, 0x20, 0x9e, 0xc9, 0x91, 0xc0, 0xf4, 0x26, 0x1f, 0xa6, 0x75, 0x0e, 0xa6, - 0x3b, 0x87, 0xe4, 0x22, 0x7d, 0xc0, 0x7e, 0x31, 0x07, 0x47, 0xe9, 0xa4, 0xbf, 0x68, 0xb4, 0x59, - 0x84, 0xd5, 0xd7, 0x4b, 0x87, 0xbc, 0xd9, 0xb6, 0x3f, 0x04, 0x2b, 0x17, 0xcb, 0x39, 0xd7, 0x7b, - 0x3b, 0xfe, 0x02, 0x0d, 0xe7, 0xea, 0x76, 0xa2, 0x64, 0xa7, 0x4d, 0xfc, 0x86, 0x7c, 0xff, 0x3f, - 0xfe, 0x2e, 0xa3, 0x09, 0xf1, 0xbb, 0x8c, 0xfe, 0x34, 0xd9, 0xba, 0x1d, 0x29, 0xba, 0x47, 0xe0, - 0x29, 0xdb, 0x4e, 0x09, 0x56, 0xf4, 0x04, 0xb8, 0xfb, 0xfe, 0x70, 0x27, 0x0b, 0x22, 0x88, 0x0c, - 0xe9, 0x4e, 0x46, 0x08, 0x1c, 0xa6, 0x3b, 0xd9, 0x20, 0x06, 0xc6, 0x70, 0xab, 0x7d, 0x8e, 0xed, - 0xe6, 0x93, 0x76, 0x83, 0xfe, 0x5a, 0x4a, 0x7d, 0x94, 0xfe, 0x56, 0x26, 0x91, 0xff, 0x33, 0xe1, - 0x2b, 0x7e, 0x98, 0x4e, 0xe2, 0xd1, 0x1c, 0x47, 0x6e, 0x0c, 0xeb, 0x46, 0x12, 0xf1, 0x45, 0x3f, - 0xaf, 0xb7, 0x9d, 0xed, 0x11, 0x9d, 0xe8, 0xb8, 0xe4, 0xd2, 0xf2, 0xae, 0x47, 0x26, 0x2f, 0xe8, - 0xdf, 0x33, 0x89, 0x42, 0x48, 0xf9, 0x22, 0x21, 0x6c, 0x45, 0x88, 0x38, 0x41, 0xe0, 0xa7, 0x58, - 0x7a, 0x63, 0xd4, 0xe8, 0x73, 0x7a, 0x1b, 0x9b, 0x8f, 0x42, 0x8d, 0x26, 0x7c, 0x8d, 0x4e, 0xa3, - 0xe3, 0xc8, 0x7d, 0x9f, 0x6a, 0xb4, 0x2f, 0x92, 0x11, 0x69, 0x74, 0x2c, 0xbd, 0xf4, 0x65, 0xfc, - 0xd2, 0x19, 0x36, 0x91, 0x5a, 0xd5, 0x8d, 0x8b, 0xe8, 0x5f, 0xf2, 0xde, 0xc5, 0xcc, 0xe7, 0x75, - 0x67, 0x9b, 0xc5, 0x82, 0xf9, 0x7d, 0xe1, 0xbb, 0x51, 0x86, 0x88, 0xf7, 0xc2, 0x87, 0x93, 0xca, - 0xed, 0x0b, 0x27, 0x55, 0x84, 0x59, 0xdd, 0x70, 0xb0, 0x65, 0x68, 0x9d, 0xa5, 0x8e, 0xb6, 0x65, - 0x9f, 0x9a, 0xe8, 0x7b, 0x79, 0x5d, 0x25, 0x94, 0x47, 0xe5, 0xff, 0x08, 0x5f, 0x5f, 0x39, 0xc9, - 0x5f, 0x5f, 0x19, 0x11, 0xfd, 0x6a, 0x2a, 0x3a, 0xfa, 0x95, 0x1f, 0xdd, 0x0a, 0x06, 0x07, 0xc7, - 0x16, 0xb5, 0x8d, 0x13, 0x86, 0xfb, 0xbb, 0x45, 0x30, 0x0a, 0x9b, 0x1f, 0xfa, 0xf1, 0x15, 0x72, - 0xa2, 0xd5, 0x3d, 0x57, 0x11, 0xe6, 0x7b, 0x95, 0x20, 0xb1, 0x85, 0x1a, 0xae, 0xbc, 0xdc, 0x53, - 0x79, 0xdf, 0xe4, 0xc9, 0x0a, 0x98, 0x3c, 0x61, 0xa5, 0xca, 0x89, 0x29, 0x55, 0x92, 0xc5, 0x42, - 0x91, 0xda, 0x8e, 0xe1, 0x34, 0x52, 0x0e, 0x8e, 0x79, 0xd1, 0x6e, 0xbb, 0x5d, 0xac, 0x59, 0x9a, - 0xd1, 0xc2, 0xe8, 0x43, 0xd2, 0x28, 0xcc, 0xde, 0x25, 0x98, 0xd4, 0x5b, 0xa6, 0x51, 0xd7, 0x9f, - 0xe9, 0x5d, 0x2e, 0x17, 0x1f, 0x64, 0x9d, 0x48, 0xa4, 0xc2, 0xfe, 0x50, 0xfd, 0x7f, 0x95, 0x0a, - 0x4c, 0xb5, 0x34, 0xab, 0x4d, 0x83, 0xf0, 0xe5, 0x7a, 0x2e, 0x72, 0x8a, 0x24, 0x54, 0xf2, 0x7e, - 0x51, 0x83, 0xbf, 0x95, 0x1a, 0x2f, 0xc4, 0x7c, 0x4f, 0x34, 0x8f, 0x48, 0x62, 0x8b, 0xc1, 0x4f, - 0x9c, 0xcc, 0x5d, 0xe9, 0x58, 0xb8, 0x43, 0xee, 0xa0, 0xa7, 0x3d, 0xc4, 0x94, 0x1a, 0x24, 0x24, - 0x5d, 0x1e, 0x20, 0x45, 0xed, 0x43, 0x63, 0xdc, 0xcb, 0x03, 0x42, 0x5c, 0xa4, 0xaf, 0x99, 0x6f, - 0xc9, 0xc3, 0x2c, 0xed, 0xd5, 0x98, 0x38, 0xd1, 0xf3, 0xc8, 0x15, 0xd2, 0xce, 0x7d, 0xf8, 0x32, - 0xaa, 0x1f, 0x7c, 0x4c, 0x2e, 0x80, 0x7c, 0xd1, 0x0f, 0x38, 0xe8, 0x3e, 0x26, 0xdd, 0xb7, 0xf7, - 0xf8, 0x9a, 0xa7, 0x3c, 0x8d, 0x7b, 0xdf, 0x3e, 0xbe, 0xf8, 0xf4, 0xf1, 0xf9, 0x65, 0x19, 0xe4, - 0x62, 0xbb, 0x8d, 0x5a, 0x07, 0x87, 0xe2, 0x0c, 0x4c, 0x7b, 0x6d, 0x26, 0x88, 0x01, 0x19, 0x4e, - 0x4a, 0xba, 0x08, 0xea, 0xcb, 0xa6, 0xd8, 0x1e, 0xfb, 0xae, 0x42, 0x4c, 0xd9, 0xe9, 0x83, 0xf2, - 0x1b, 0x13, 0xac, 0xd1, 0x2c, 0x98, 0xe6, 0x45, 0x72, 0x54, 0xe6, 0xb9, 0x32, 0xe4, 0x96, 0xb0, - 0xd3, 0xda, 0x1e, 0x51, 0x9b, 0xd9, 0xb5, 0x3a, 0x5e, 0x9b, 0xd9, 0x77, 0x1f, 0xfe, 0x60, 0x1b, - 0xd6, 0x63, 0x6b, 0x9e, 0xb0, 0x34, 0xee, 0xe8, 0xce, 0xb1, 0xa5, 0xa7, 0x0f, 0xce, 0xbf, 0xcb, - 0x30, 0xe7, 0xaf, 0x70, 0x51, 0x4c, 0x7e, 0x31, 0xf3, 0x68, 0x5b, 0xef, 0x44, 0x9f, 0x4e, 0x16, - 0x22, 0xcd, 0x97, 0x29, 0x5f, 0xb3, 0x94, 0x17, 0x16, 0x13, 0x04, 0x4f, 0x13, 0x63, 0x70, 0x0c, - 0x33, 0x78, 0x19, 0x26, 0x09, 0x43, 0x8b, 0xfa, 0x1e, 0x71, 0x1d, 0xe4, 0x16, 0x1a, 0x9f, 0x35, - 0x92, 0x85, 0xc6, 0x3b, 0xf9, 0x85, 0x46, 0xc1, 0x88, 0xc7, 0xde, 0x3a, 0x63, 0x42, 0x5f, 0x1a, - 0xf7, 0xff, 0x91, 0x2f, 0x33, 0x26, 0xf0, 0xa5, 0x19, 0x50, 0x7e, 0xfa, 0x88, 0xbe, 0xe2, 0x3f, - 0xb1, 0xce, 0xd6, 0xdb, 0x50, 0x45, 0xff, 0xe3, 0x18, 0x64, 0xcf, 0xb9, 0x0f, 0xff, 0x2b, 0xb8, - 0x11, 0xeb, 0x45, 0x23, 0x08, 0xce, 0xf0, 0x74, 0xc8, 0xba, 0xf4, 0xd9, 0xb4, 0xe5, 0x26, 0xb1, - 0xdd, 0x5d, 0x97, 0x11, 0x95, 0xfc, 0xa7, 0x9c, 0x84, 0xbc, 0x6d, 0xee, 0x5a, 0x2d, 0xd7, 0x7c, - 0x76, 0x35, 0x86, 0xbd, 0x25, 0x0d, 0x4a, 0xca, 0x91, 0x9e, 0x1f, 0x9d, 0xcb, 0x68, 0xe8, 0x82, - 0x24, 0x99, 0xbb, 0x20, 0x29, 0xc1, 0xfe, 0x81, 0x00, 0x6f, 0xe9, 0x6b, 0xc4, 0x5f, 0x93, 0xbb, - 0x02, 0xdb, 0xa3, 0x82, 0x3d, 0x42, 0x2c, 0x07, 0x55, 0x87, 0xa4, 0x0e, 0xdf, 0xbc, 0x68, 0xfd, - 0x38, 0xf0, 0x63, 0x75, 0xf8, 0x16, 0xe0, 0x61, 0x2c, 0xa7, 0xd4, 0xf3, 0xcc, 0x49, 0xf5, 0xfe, - 0x51, 0xa2, 0x9b, 0xe5, 0x94, 0xfe, 0x40, 0xe8, 0x8c, 0xd0, 0x79, 0x75, 0x68, 0x74, 0x0e, 0xc9, - 0x7d, 0xf5, 0x0f, 0x65, 0x12, 0x09, 0xd3, 0x33, 0x72, 0xc4, 0x2f, 0x3a, 0x4a, 0x0c, 0x91, 0x3b, - 0x06, 0x73, 0x71, 0xa0, 0x67, 0x87, 0x0f, 0x0d, 0xce, 0x8b, 0x2e, 0xc4, 0xff, 0xb8, 0x43, 0x83, - 0x8b, 0x32, 0x92, 0x3e, 0x90, 0xaf, 0xa6, 0x17, 0x8b, 0x15, 0x5b, 0x8e, 0xbe, 0x37, 0xe2, 0x96, - 0xc6, 0x0f, 0x2f, 0x09, 0xa3, 0x01, 0xef, 0x93, 0x10, 0xe5, 0x70, 0xdc, 0xd1, 0x80, 0xc5, 0xd8, - 0x48, 0x1f, 0xa6, 0xbf, 0xcb, 0xbb, 0xd2, 0x63, 0x6b, 0x33, 0xaf, 0x61, 0xab, 0x01, 0xf8, 0xe0, - 0x68, 0x9d, 0x85, 0x99, 0xd0, 0xd4, 0xdf, 0xbb, 0xb0, 0x86, 0x4b, 0x4b, 0x7a, 0xd0, 0xdd, 0x17, - 0xd9, 0xc8, 0x17, 0x06, 0x12, 0x2c, 0xf8, 0x8a, 0x30, 0x31, 0x96, 0xfb, 0xe0, 0xbc, 0x31, 0x6c, - 0x4c, 0x58, 0xfd, 0x7e, 0x18, 0xab, 0x1a, 0x8f, 0xd5, 0xed, 0x22, 0x62, 0x12, 0x1b, 0xd3, 0x84, - 0xe6, 0x8d, 0x6f, 0xf6, 0xe1, 0x52, 0x39, 0xb8, 0x9e, 0x3e, 0x34, 0x1f, 0xe9, 0x23, 0xf6, 0x9b, - 0xb4, 0x3b, 0xac, 0x53, 0x93, 0x7d, 0x34, 0xdd, 0x21, 0x9b, 0x0d, 0xc8, 0xdc, 0x6c, 0x20, 0xa1, - 0xbf, 0x7d, 0xe0, 0x46, 0xea, 0x31, 0x37, 0x08, 0xa2, 0xec, 0x88, 0xfd, 0xed, 0x07, 0x72, 0x90, - 0x3e, 0x38, 0xff, 0x24, 0x03, 0x2c, 0x5b, 0xe6, 0x6e, 0xb7, 0x66, 0xb5, 0xb1, 0x85, 0xfe, 0x36, - 0x98, 0x00, 0xfc, 0xca, 0x08, 0x26, 0x00, 0xeb, 0x00, 0x5b, 0x3e, 0x71, 0xa6, 0xe1, 0xb7, 0x8a, - 0x99, 0xfb, 0x01, 0x53, 0x6a, 0x88, 0x06, 0x7f, 0xe5, 0xec, 0x8f, 0xf0, 0x18, 0xc7, 0xf5, 0x59, - 0x01, 0xb9, 0x51, 0x4e, 0x00, 0xde, 0xea, 0x63, 0xdd, 0xe0, 0xb0, 0xbe, 0xe7, 0x00, 0x9c, 0xa4, - 0x8f, 0xf9, 0x3f, 0x4f, 0xc0, 0x34, 0xdd, 0xae, 0xa3, 0x32, 0xfd, 0x87, 0x00, 0xf4, 0xdf, 0x18, - 0x01, 0xe8, 0x1b, 0x30, 0x63, 0x06, 0xd4, 0x69, 0x9f, 0x1a, 0x5e, 0x80, 0x89, 0x85, 0x3d, 0xc4, - 0x97, 0xca, 0x91, 0x41, 0x1f, 0x08, 0x23, 0xaf, 0xf2, 0xc8, 0xdf, 0x19, 0x23, 0xef, 0x10, 0xc5, - 0x51, 0x42, 0xff, 0x36, 0x1f, 0xfa, 0x0d, 0x0e, 0xfa, 0xe2, 0x41, 0x58, 0x19, 0x43, 0xb8, 0x7d, - 0x19, 0xb2, 0xe4, 0x74, 0xdc, 0x6f, 0xa5, 0x38, 0xbf, 0x3f, 0x05, 0x13, 0xa4, 0xc9, 0xfa, 0xf3, - 0x0e, 0xef, 0xd5, 0xfd, 0xa2, 0x6d, 0x3a, 0xd8, 0xf2, 0x3d, 0x16, 0xbc, 0x57, 0x97, 0x07, 0xcf, - 0x2b, 0xd9, 0x3e, 0x95, 0xa7, 0x1b, 0x91, 0x7e, 0xc2, 0xd0, 0x93, 0x92, 0xb0, 0xc4, 0x47, 0x76, - 0x5e, 0x6e, 0x98, 0x49, 0xc9, 0x00, 0x46, 0xd2, 0x07, 0xfe, 0x2f, 0xb3, 0x70, 0x8a, 0xae, 0x2a, - 0x2d, 0x59, 0xe6, 0x4e, 0xcf, 0xed, 0x56, 0xfa, 0xc1, 0x75, 0xe1, 0x06, 0x98, 0x73, 0x38, 0x7f, - 0x6c, 0xa6, 0x13, 0x3d, 0xa9, 0xe8, 0xcf, 0xc2, 0x3e, 0x15, 0xcf, 0xe0, 0x91, 0x5c, 0x88, 0x11, - 0x60, 0x14, 0xef, 0x89, 0x17, 0xea, 0x05, 0x19, 0x0d, 0x2d, 0x52, 0xc9, 0x43, 0xad, 0x59, 0xfa, - 0x3a, 0x95, 0x13, 0xd1, 0xa9, 0x77, 0xfb, 0x3a, 0xf5, 0x63, 0x9c, 0x4e, 0x2d, 0x1f, 0x5c, 0x24, - 0xe9, 0xeb, 0xd6, 0xcb, 0xfd, 0x8d, 0x21, 0x7f, 0xdb, 0x6e, 0x27, 0x85, 0xcd, 0xba, 0xb0, 0x3f, - 0x52, 0x96, 0xf3, 0x47, 0xe2, 0xef, 0xa3, 0x48, 0x30, 0x13, 0xe6, 0xb9, 0x8e, 0xd0, 0xa5, 0x39, - 0x90, 0x74, 0x8f, 0x3b, 0x49, 0x6f, 0x0f, 0x35, 0xd7, 0x8d, 0x2d, 0x68, 0x0c, 0x6b, 0x4b, 0x73, - 0x90, 0x5f, 0xd2, 0x3b, 0x0e, 0xb6, 0xd0, 0xe7, 0xd9, 0x4c, 0xf7, 0xe5, 0x29, 0x0e, 0x00, 0x8b, - 0x90, 0xdf, 0x24, 0xa5, 0x31, 0x93, 0xf9, 0x66, 0xb1, 0xd6, 0x43, 0x39, 0x54, 0xd9, 0xbf, 0x49, - 0xa3, 0xf3, 0xf5, 0x90, 0x19, 0xd9, 0x14, 0x39, 0x41, 0x74, 0xbe, 0xc1, 0x2c, 0x8c, 0xe5, 0x62, - 0xaa, 0xbc, 0x8a, 0x77, 0xdc, 0x31, 0xfe, 0x62, 0x7a, 0x08, 0x17, 0x40, 0xd6, 0xdb, 0x36, 0xe9, - 0x1c, 0xa7, 0x54, 0xf7, 0x31, 0xa9, 0xaf, 0x50, 0xaf, 0xa8, 0x28, 0xcb, 0xe3, 0xf6, 0x15, 0x12, - 0xe2, 0x22, 0x7d, 0xcc, 0xbe, 0x45, 0x1c, 0x45, 0xbb, 0x1d, 0xad, 0x85, 0x5d, 0xee, 0x53, 0x43, - 0x8d, 0xf6, 0x64, 0x59, 0xaf, 0x27, 0x0b, 0xb5, 0xd3, 0xdc, 0x01, 0xda, 0xe9, 0xb0, 0xcb, 0x90, - 0xbe, 0xcc, 0x49, 0xc5, 0x0f, 0x6d, 0x19, 0x32, 0x96, 0x8d, 0x31, 0x5c, 0x3b, 0xea, 0x1d, 0xa4, - 0x1d, 0x6b, 0x6b, 0x1d, 0x76, 0x93, 0x86, 0x09, 0x6b, 0x64, 0x87, 0x66, 0x87, 0xd9, 0xa4, 0x89, - 0xe6, 0x61, 0x0c, 0x68, 0xcd, 0x31, 0xb4, 0x3e, 0xc5, 0x86, 0xd1, 0x94, 0xf7, 0x49, 0x6d, 0xd3, - 0x72, 0x92, 0xed, 0x93, 0xba, 0xdc, 0xa9, 0xe4, 0xbf, 0xa4, 0x07, 0xaf, 0xf8, 0x73, 0xd5, 0xa3, - 0x1a, 0x3e, 0x13, 0x1c, 0xbc, 0x1a, 0xc4, 0x40, 0xfa, 0xf0, 0xbe, 0xe1, 0x90, 0x06, 0xcf, 0x61, - 0x9b, 0x23, 0x6b, 0x03, 0x23, 0x1b, 0x3a, 0x87, 0x69, 0x8e, 0xd1, 0x3c, 0xa4, 0x8f, 0xd7, 0xd7, - 0x43, 0x03, 0xe7, 0xeb, 0xc6, 0x38, 0x70, 0x7a, 0x2d, 0x33, 0x37, 0x64, 0xcb, 0x1c, 0x76, 0xff, - 0x87, 0xc9, 0x7a, 0x74, 0x03, 0xe6, 0x30, 0xfb, 0x3f, 0x31, 0x4c, 0xa4, 0x8f, 0xf8, 0xeb, 0x65, - 0xc8, 0xd5, 0xc7, 0x3f, 0x5e, 0x0e, 0x3b, 0x17, 0x21, 0xb2, 0xaa, 0x8f, 0x6c, 0xb8, 0x1c, 0x66, - 0x2e, 0x12, 0xc9, 0xc2, 0x18, 0x02, 0xef, 0x1f, 0x85, 0x19, 0xb2, 0x24, 0xe2, 0x6d, 0xb3, 0x7e, - 0x9d, 0x8d, 0x9a, 0x8f, 0xa4, 0xd8, 0x56, 0xef, 0x85, 0x49, 0x6f, 0xff, 0x8e, 0x8d, 0x9c, 0xf3, - 0x62, 0xed, 0xd3, 0xe3, 0x52, 0xf5, 0xff, 0x3f, 0x90, 0x33, 0xc4, 0xc8, 0xf7, 0x6a, 0x87, 0x75, - 0x86, 0x38, 0xd4, 0xfd, 0xda, 0x3f, 0x0d, 0x46, 0xd4, 0xff, 0x92, 0x1e, 0xe6, 0xbd, 0xfb, 0xb8, - 0xd9, 0x3e, 0xfb, 0xb8, 0x1f, 0x0a, 0x63, 0x59, 0xe7, 0xb1, 0xbc, 0x4b, 0x54, 0x84, 0x23, 0x1c, - 0x6b, 0xdf, 0xee, 0xc3, 0x79, 0x8e, 0x83, 0x73, 0xe1, 0x40, 0xbc, 0x8c, 0xe1, 0xe0, 0x63, 0x36, - 0x18, 0x73, 0x3f, 0x9c, 0x62, 0x3b, 0xee, 0x39, 0x55, 0x91, 0xdd, 0x77, 0xaa, 0x82, 0x6b, 0xe9, - 0xb9, 0x03, 0xb6, 0xf4, 0x0f, 0x87, 0xb5, 0xa3, 0xc1, 0x6b, 0xc7, 0xd3, 0xc5, 0x11, 0x19, 0xdd, - 0xc8, 0xfc, 0x0e, 0x5f, 0x3d, 0xce, 0x73, 0xea, 0x51, 0x3a, 0x18, 0x33, 0xe9, 0xeb, 0xc7, 0x1f, - 0x79, 0x13, 0xda, 0x43, 0x6e, 0xef, 0xc3, 0x6e, 0x15, 0x73, 0x42, 0x1c, 0xd9, 0xc8, 0x3d, 0xcc, - 0x56, 0xf1, 0x20, 0x4e, 0xc6, 0x10, 0x8b, 0x6d, 0x16, 0xa6, 0x09, 0x4f, 0xe7, 0xf5, 0xf6, 0x16, - 0x76, 0xd0, 0x2b, 0xa8, 0x8f, 0xa2, 0x17, 0xf9, 0x72, 0x44, 0xe1, 0x89, 0xa2, 0xce, 0xbb, 0x26, - 0xf5, 0xe8, 0xa0, 0x4c, 0xce, 0x87, 0x18, 0x1c, 0x77, 0x04, 0xc5, 0x81, 0x1c, 0xa4, 0x0f, 0xd9, - 0x07, 0xa8, 0xbb, 0xcd, 0xaa, 0x76, 0xd9, 0xdc, 0x75, 0xd0, 0x43, 0x23, 0xe8, 0xa0, 0x17, 0x20, - 0xdf, 0x21, 0xd4, 0xd8, 0xb1, 0x8c, 0xf8, 0xe9, 0x0e, 0x13, 0x01, 0x2d, 0x5f, 0x65, 0x7f, 0x26, - 0x3d, 0x9b, 0x11, 0xc8, 0x91, 0xd2, 0x19, 0xf7, 0xd9, 0x8c, 0x01, 0xe5, 0x8f, 0xe5, 0x8e, 0x9d, - 0x49, 0xb7, 0x74, 0x7d, 0x47, 0x77, 0x46, 0x14, 0xc1, 0xa1, 0xe3, 0xd2, 0xf2, 0x22, 0x38, 0x90, - 0x97, 0xa4, 0x27, 0x46, 0x43, 0x52, 0x71, 0x7f, 0x1f, 0xf7, 0x89, 0xd1, 0xf8, 0xe2, 0xd3, 0xc7, - 0xe4, 0xd7, 0x68, 0xcb, 0x3a, 0x47, 0x9d, 0x6f, 0x53, 0xf4, 0xeb, 0x1d, 0xba, 0xb1, 0x50, 0xd6, - 0x0e, 0xaf, 0xb1, 0xf4, 0x2d, 0x3f, 0x7d, 0x60, 0xfe, 0xdb, 0x0f, 0x42, 0x6e, 0x11, 0x5f, 0xd8, - 0xdd, 0x42, 0x77, 0xc2, 0x64, 0xc3, 0xc2, 0xb8, 0x62, 0x6c, 0x9a, 0xae, 0x74, 0x1d, 0xf7, 0xd9, - 0x83, 0x84, 0xbd, 0xb9, 0x78, 0x6c, 0x63, 0xad, 0x1d, 0x9c, 0x3f, 0xf3, 0x5e, 0xd1, 0x8b, 0x24, - 0xc8, 0xd6, 0x1d, 0xcd, 0x41, 0x53, 0x3e, 0xb6, 0xe8, 0xa1, 0x30, 0x16, 0x77, 0xf2, 0x58, 0xdc, - 0xc0, 0xc9, 0x82, 0x70, 0x30, 0xef, 0xfe, 0x1f, 0x01, 0x00, 0x82, 0xc9, 0x07, 0x6c, 0xd3, 0x70, - 0x73, 0x78, 0x47, 0x20, 0xbd, 0x77, 0xf4, 0x32, 0x5f, 0xdc, 0x77, 0x73, 0xe2, 0x7e, 0xbc, 0x58, - 0x11, 0x63, 0x58, 0x69, 0x93, 0x60, 0xca, 0x15, 0xed, 0x0a, 0xd6, 0xda, 0x36, 0xfa, 0x81, 0x40, - 0xf9, 0x23, 0xc4, 0x8c, 0xde, 0x23, 0x1c, 0x8c, 0x93, 0xd6, 0xca, 0x27, 0x1e, 0xed, 0xd1, 0xe1, - 0x6d, 0xfe, 0x4b, 0x7c, 0x30, 0x92, 0x5b, 0x20, 0xab, 0x1b, 0x9b, 0x26, 0xf3, 0x2f, 0xbc, 0x3a, - 0x82, 0xb6, 0xab, 0x13, 0x2a, 0xc9, 0x28, 0x18, 0xa9, 0x33, 0x9e, 0xad, 0xb1, 0x5c, 0x7a, 0x97, - 0x75, 0x4b, 0x47, 0xff, 0xe7, 0x40, 0x61, 0x2b, 0x0a, 0x64, 0xbb, 0x9a, 0xb3, 0xcd, 0x8a, 0x26, - 0xcf, 0xae, 0x8d, 0xbc, 0x6b, 0x68, 0x86, 0x69, 0x5c, 0xde, 0xd1, 0x9f, 0xe9, 0xdf, 0xad, 0xcb, - 0xa5, 0xb9, 0x9c, 0x6f, 0x61, 0x03, 0x5b, 0x9a, 0x83, 0xeb, 0x7b, 0x5b, 0x64, 0x8e, 0x35, 0xa9, - 0x86, 0x93, 0x12, 0xeb, 0xbf, 0xcb, 0x71, 0xb4, 0xfe, 0x6f, 0xea, 0x1d, 0x4c, 0x22, 0x35, 0x31, - 0xfd, 0xf7, 0xde, 0x13, 0xe9, 0x7f, 0x9f, 0x22, 0xd2, 0x47, 0xe3, 0xdb, 0x12, 0xcc, 0xd4, 0x5d, - 0x85, 0xab, 0xef, 0xee, 0xec, 0x68, 0xd6, 0x65, 0x74, 0x5d, 0x80, 0x4a, 0x48, 0x35, 0x33, 0xbc, - 0x5f, 0xca, 0x1f, 0x0a, 0x5f, 0x2b, 0xcd, 0x9a, 0x76, 0xa8, 0x84, 0xc4, 0xed, 0xe0, 0x89, 0x90, - 0x73, 0xd5, 0xdb, 0xf3, 0xb8, 0x8c, 0x6d, 0x08, 0x34, 0xa7, 0x60, 0x44, 0xab, 0x81, 0xbc, 0x8d, - 0x21, 0x9a, 0x86, 0x04, 0x47, 0xeb, 0x8e, 0xd6, 0xba, 0xb8, 0x6c, 0x5a, 0xe6, 0xae, 0xa3, 0x1b, - 0xd8, 0x46, 0x8f, 0x09, 0x10, 0xf0, 0xf4, 0x3f, 0x13, 0xe8, 0x3f, 0xfa, 0x6e, 0x46, 0x74, 0x14, - 0xf5, 0xbb, 0xd5, 0x30, 0xf9, 0x88, 0x00, 0x55, 0x62, 0xe3, 0xa2, 0x08, 0xc5, 0xf4, 0x85, 0xf6, - 0x3a, 0x19, 0x0a, 0xe5, 0x07, 0xbb, 0xa6, 0xe5, 0xac, 0x9a, 0x2d, 0xad, 0x63, 0x3b, 0xa6, 0x85, - 0x51, 0x2d, 0x56, 0x6a, 0x6e, 0x0f, 0xd3, 0x36, 0x5b, 0xc1, 0xe0, 0xc8, 0xde, 0xc2, 0x6a, 0x27, - 0xf3, 0x3a, 0xfe, 0x01, 0xe1, 0x5d, 0x46, 0x2a, 0x95, 0x5e, 0x8e, 0x22, 0xf4, 0xbc, 0x5f, 0x97, - 0x96, 0xec, 0xb0, 0x84, 0xd8, 0xce, 0xa3, 0x10, 0x53, 0x63, 0x58, 0x2a, 0x97, 0x60, 0xb6, 0xbe, - 0x7b, 0xc1, 0x27, 0x62, 0x87, 0x8d, 0x90, 0x57, 0x0a, 0x47, 0xa9, 0x60, 0x8a, 0x17, 0x26, 0x14, - 0x21, 0xdf, 0xeb, 0x61, 0xd6, 0x0e, 0x67, 0x63, 0x78, 0xf3, 0x89, 0x82, 0xd1, 0x29, 0x06, 0x97, - 0x9a, 0xbe, 0x00, 0xdf, 0x21, 0xc1, 0x6c, 0xad, 0x8b, 0x0d, 0xdc, 0xa6, 0x5e, 0x90, 0x9c, 0x00, - 0x5f, 0x94, 0x50, 0x80, 0x1c, 0xa1, 0x08, 0x01, 0x06, 0x1e, 0xcb, 0x8b, 0x9e, 0xf0, 0x82, 0x84, - 0x44, 0x82, 0x8b, 0x2b, 0x2d, 0x7d, 0xc1, 0x7d, 0x4e, 0x82, 0x69, 0x75, 0xd7, 0x58, 0xb7, 0x4c, - 0x77, 0x34, 0xb6, 0xd0, 0x5d, 0x41, 0x07, 0x71, 0x33, 0x1c, 0x6b, 0xef, 0x5a, 0x64, 0xfd, 0xa9, - 0x62, 0xd4, 0x71, 0xcb, 0x34, 0xda, 0x36, 0xa9, 0x47, 0x4e, 0xdd, 0xff, 0xe1, 0x8e, 0xec, 0x73, - 0xbf, 0x22, 0x67, 0xd0, 0xf3, 0x84, 0x43, 0xdd, 0xd0, 0xca, 0x87, 0x8a, 0x16, 0xef, 0x09, 0x04, - 0x03, 0xda, 0x0c, 0x2a, 0x21, 0x7d, 0xe1, 0x7e, 0x4a, 0x02, 0xa5, 0xd8, 0x6a, 0x99, 0xbb, 0x86, - 0x53, 0xc7, 0x1d, 0xdc, 0x72, 0x1a, 0x96, 0xd6, 0xc2, 0x61, 0xfb, 0xb9, 0x00, 0x72, 0x5b, 0xb7, - 0x58, 0x1f, 0xec, 0x3e, 0x32, 0x39, 0xbe, 0x48, 0x78, 0xc7, 0x91, 0xd6, 0x72, 0x7f, 0x29, 0x09, - 0xc4, 0x29, 0xb6, 0xaf, 0x28, 0x58, 0x50, 0xfa, 0x52, 0xfd, 0xb0, 0x04, 0x53, 0x5e, 0x8f, 0xbd, - 0x25, 0x22, 0xcc, 0x5f, 0x4b, 0x38, 0x19, 0xf1, 0x89, 0x27, 0x90, 0xe1, 0x5b, 0x12, 0xcc, 0x2a, - 0xa2, 0xe8, 0x27, 0x13, 0x5d, 0x31, 0xb9, 0xe8, 0xdc, 0xd7, 0x6a, 0xad, 0xb9, 0x54, 0x5b, 0x5d, - 0x2c, 0xab, 0x05, 0x19, 0x7d, 0x5e, 0x82, 0xec, 0xba, 0x6e, 0x6c, 0x85, 0xa3, 0x2b, 0x1d, 0x77, - 0xed, 0xc8, 0x36, 0x7e, 0x90, 0xb5, 0x74, 0xfa, 0xa2, 0xdc, 0x06, 0xc7, 0x8d, 0xdd, 0x9d, 0x0b, - 0xd8, 0xaa, 0x6d, 0x92, 0x51, 0xd6, 0x6e, 0x98, 0x75, 0x6c, 0x50, 0x23, 0x34, 0xa7, 0xf6, 0xfd, - 0xc6, 0x9b, 0x60, 0x02, 0x93, 0x07, 0x97, 0x93, 0x08, 0x89, 0xfb, 0x4c, 0x49, 0x21, 0xa6, 0x12, - 0x4d, 0x1b, 0xfa, 0x10, 0x4f, 0x5f, 0x53, 0xff, 0x38, 0x07, 0x27, 0x8a, 0xc6, 0x65, 0x62, 0x53, - 0xd0, 0x0e, 0xbe, 0xb4, 0xad, 0x19, 0x5b, 0x98, 0x0c, 0x10, 0xbe, 0xc4, 0xc3, 0x21, 0xfa, 0x33, - 0x7c, 0x88, 0x7e, 0x45, 0x85, 0x09, 0xd3, 0x6a, 0x63, 0x6b, 0xe1, 0x32, 0xe1, 0xa9, 0x77, 0xd9, - 0x99, 0xb5, 0xc9, 0x7e, 0x45, 0xcc, 0x33, 0xf2, 0xf3, 0x35, 0xfa, 0xbf, 0xea, 0x11, 0x3a, 0x7b, - 0x33, 0x4c, 0xb0, 0x34, 0x65, 0x06, 0x26, 0x6b, 0xea, 0x62, 0x59, 0x6d, 0x56, 0x16, 0x0b, 0x47, - 0x94, 0x2b, 0xe0, 0x68, 0xa5, 0x51, 0x56, 0x8b, 0x8d, 0x4a, 0xad, 0xda, 0x24, 0xe9, 0x85, 0x0c, - 0x7a, 0x4e, 0x56, 0xd4, 0xb3, 0x37, 0x9e, 0x99, 0x7e, 0xb0, 0xaa, 0x30, 0xd1, 0xa2, 0x19, 0xc8, - 0x10, 0x3a, 0x9d, 0xa8, 0x76, 0x8c, 0x20, 0x4d, 0x50, 0x3d, 0x42, 0xca, 0x69, 0x80, 0x4b, 0x96, - 0x69, 0x6c, 0x05, 0xa7, 0x0e, 0x27, 0xd5, 0x50, 0x0a, 0x7a, 0x28, 0x03, 0x79, 0xfa, 0x0f, 0xb9, - 0x92, 0x84, 0x3c, 0x05, 0x82, 0xf7, 0xde, 0x5d, 0x8b, 0x97, 0xc8, 0x2b, 0x98, 0x68, 0xb1, 0x57, - 0x57, 0x17, 0xa9, 0x0c, 0xa8, 0x25, 0xcc, 0xaa, 0x72, 0x0b, 0xe4, 0xe9, 0xbf, 0xcc, 0xeb, 0x20, - 0x3a, 0xbc, 0x28, 0xcd, 0x26, 0xe8, 0xa7, 0x2c, 0x2e, 0xd3, 0xf4, 0xb5, 0xf9, 0xbd, 0x12, 0x4c, - 0x56, 0xb1, 0x53, 0xda, 0xc6, 0xad, 0x8b, 0xe8, 0x71, 0xfc, 0x02, 0x68, 0x47, 0xc7, 0x86, 0x73, - 0xff, 0x4e, 0xc7, 0x5f, 0x00, 0xf5, 0x12, 0xd0, 0xcf, 0x86, 0x3b, 0xdf, 0x7b, 0x78, 0xfd, 0xb9, - 0xa9, 0x4f, 0x5d, 0xbd, 0x12, 0x22, 0x54, 0xe6, 0x24, 0xe4, 0x2d, 0x6c, 0xef, 0x76, 0xbc, 0x45, - 0x34, 0xf6, 0x86, 0x1e, 0xf6, 0xc5, 0x59, 0xe2, 0xc4, 0x79, 0x8b, 0x78, 0x11, 0x63, 0x88, 0x57, - 0x9a, 0x85, 0x89, 0x8a, 0xa1, 0x3b, 0xba, 0xd6, 0x41, 0xcf, 0xcb, 0xc2, 0x6c, 0x1d, 0x3b, 0xeb, - 0x9a, 0xa5, 0xed, 0x60, 0x07, 0x5b, 0x36, 0xfa, 0x26, 0xdf, 0x27, 0x74, 0x3b, 0x9a, 0xb3, 0x69, - 0x5a, 0x3b, 0x9e, 0x6a, 0x7a, 0xef, 0xae, 0x6a, 0xee, 0x61, 0xcb, 0x0e, 0xf8, 0xf2, 0x5e, 0xdd, - 0x2f, 0x97, 0x4c, 0xeb, 0xa2, 0x3b, 0x08, 0xb2, 0x69, 0x1a, 0x7b, 0x75, 0xe9, 0x75, 0xcc, 0xad, - 0x55, 0xbc, 0x87, 0xbd, 0x70, 0x69, 0xfe, 0xbb, 0x3b, 0x17, 0x68, 0x9b, 0x55, 0xd3, 0x71, 0x3b, - 0xed, 0x55, 0x73, 0x8b, 0xc6, 0x8b, 0x9d, 0x54, 0xf9, 0xc4, 0x20, 0x97, 0xb6, 0x87, 0x49, 0xae, - 0x7c, 0x38, 0x17, 0x4b, 0x54, 0xe6, 0x41, 0xf1, 0x7f, 0x6b, 0xe0, 0x0e, 0xde, 0xc1, 0x8e, 0x75, - 0x99, 0x5c, 0x0b, 0x31, 0xa9, 0xf6, 0xf9, 0xc2, 0x06, 0x68, 0xf1, 0xc9, 0x3a, 0x93, 0xde, 0x3c, - 0x27, 0xb9, 0x03, 0x4d, 0xd6, 0x45, 0x28, 0x8e, 0xe5, 0xda, 0x2b, 0xd9, 0xb5, 0x66, 0x5e, 0x2c, - 0x43, 0x96, 0x0c, 0x9e, 0xaf, 0xcf, 0x70, 0x2b, 0x4c, 0x3b, 0xd8, 0xb6, 0xb5, 0x2d, 0xec, 0xad, - 0x30, 0xb1, 0x57, 0xe5, 0x76, 0xc8, 0x75, 0x08, 0xa6, 0x74, 0x70, 0xb8, 0x8e, 0xab, 0x99, 0x6b, - 0x60, 0xb8, 0xb4, 0xfc, 0x91, 0x80, 0xc0, 0xad, 0xd2, 0x3f, 0xce, 0xde, 0x0b, 0x39, 0x0a, 0xff, - 0x14, 0xe4, 0x16, 0xcb, 0x0b, 0x1b, 0xcb, 0x85, 0x23, 0xee, 0xa3, 0xc7, 0xdf, 0x14, 0xe4, 0x96, - 0x8a, 0x8d, 0xe2, 0x6a, 0x41, 0x72, 0xeb, 0x51, 0xa9, 0x2e, 0xd5, 0x0a, 0xb2, 0x9b, 0xb8, 0x5e, - 0xac, 0x56, 0x4a, 0x85, 0xac, 0x32, 0x0d, 0x13, 0xe7, 0x8b, 0x6a, 0xb5, 0x52, 0x5d, 0x2e, 0xe4, - 0xd0, 0xdf, 0x85, 0xf1, 0xbb, 0x83, 0xc7, 0xef, 0xfa, 0x28, 0x9e, 0xfa, 0x41, 0xf6, 0x12, 0x1f, - 0xb2, 0xbb, 0x38, 0xc8, 0x7e, 0x50, 0x84, 0xc8, 0x18, 0xdc, 0x99, 0xf2, 0x30, 0xb1, 0x6e, 0x99, - 0x2d, 0x6c, 0xdb, 0xe8, 0xd7, 0x25, 0xc8, 0x97, 0x34, 0xa3, 0x85, 0x3b, 0xe8, 0xaa, 0x00, 0x2a, - 0xea, 0x2a, 0x9a, 0xf1, 0x4f, 0x8b, 0xfd, 0x53, 0x46, 0xb4, 0xf7, 0x63, 0x74, 0xe7, 0x29, 0xcd, - 0x08, 0xf9, 0x88, 0xf5, 0x72, 0xb1, 0xa4, 0xc6, 0x70, 0x35, 0x8e, 0x04, 0x53, 0x6c, 0x35, 0xe0, - 0x02, 0x0e, 0xcf, 0xc3, 0xbf, 0x99, 0x11, 0x9d, 0x1c, 0x7a, 0x35, 0xf0, 0xc9, 0x44, 0xc8, 0x43, - 0x6c, 0x22, 0x38, 0x88, 0xda, 0x18, 0x36, 0x0f, 0x25, 0x98, 0xde, 0x30, 0xec, 0x7e, 0x42, 0x11, - 0x8f, 0xa3, 0xef, 0x55, 0x23, 0x44, 0xe8, 0x40, 0x71, 0xf4, 0x07, 0xd3, 0x4b, 0x5f, 0x30, 0xdf, - 0xcc, 0xc0, 0xf1, 0x65, 0x6c, 0x60, 0x4b, 0x6f, 0xd1, 0x1a, 0x78, 0x92, 0xb8, 0x8b, 0x97, 0xc4, - 0xe3, 0x38, 0xce, 0xfb, 0xfd, 0xc1, 0x4b, 0xe0, 0xe5, 0xbe, 0x04, 0xee, 0xe1, 0x24, 0x70, 0xb3, - 0x20, 0x9d, 0x31, 0xdc, 0x87, 0x3e, 0x05, 0x33, 0x55, 0xd3, 0xd1, 0x37, 0xf5, 0x16, 0xf5, 0x41, - 0xfb, 0x4d, 0x19, 0xb2, 0xab, 0xba, 0xed, 0xa0, 0x62, 0xd0, 0x9d, 0x9c, 0x81, 0x69, 0xdd, 0x68, - 0x75, 0x76, 0xdb, 0x58, 0xc5, 0x1a, 0xed, 0x57, 0x26, 0xd5, 0x70, 0x52, 0xb0, 0xb5, 0xef, 0xb2, - 0x25, 0x7b, 0x5b, 0xfb, 0x1f, 0x17, 0x5e, 0x86, 0x09, 0xb3, 0x40, 0x02, 0x52, 0x46, 0xd8, 0x5d, - 0x45, 0x98, 0x35, 0x42, 0x59, 0x3d, 0x83, 0xbd, 0xf7, 0x42, 0x81, 0x30, 0x39, 0x95, 0xff, 0x03, - 0xbd, 0x4b, 0xa8, 0xb1, 0x0e, 0x62, 0x28, 0x19, 0x32, 0x4b, 0x43, 0x4c, 0x92, 0x15, 0x98, 0xab, - 0x54, 0x1b, 0x65, 0xb5, 0x5a, 0x5c, 0x65, 0x59, 0x64, 0xf4, 0x6d, 0x09, 0x72, 0x2a, 0xee, 0x76, - 0x2e, 0x87, 0x23, 0x46, 0x33, 0x47, 0xf1, 0x8c, 0xef, 0x28, 0xae, 0x2c, 0x01, 0x68, 0x2d, 0xb7, - 0x60, 0x72, 0xa5, 0x96, 0xd4, 0x37, 0x8e, 0x29, 0x57, 0xc1, 0xa2, 0x9f, 0x5b, 0x0d, 0xfd, 0x89, - 0x9e, 0x2f, 0xbc, 0x73, 0xc4, 0x51, 0x23, 0x1c, 0x46, 0xf4, 0x09, 0xef, 0x16, 0xda, 0xec, 0x19, - 0x48, 0xee, 0x70, 0xc4, 0xff, 0x05, 0x09, 0xb2, 0x0d, 0xb7, 0xb7, 0x0c, 0x75, 0x9c, 0x1f, 0x1b, - 0x4e, 0xc7, 0x5d, 0x32, 0x11, 0x3a, 0x7e, 0x37, 0xcc, 0x84, 0x35, 0x96, 0xb9, 0x4a, 0xc4, 0xaa, - 0x38, 0xf7, 0xc3, 0x30, 0x1a, 0xde, 0x87, 0x9d, 0xc3, 0x11, 0xf1, 0x47, 0x1e, 0x0f, 0xb0, 0x86, - 0x77, 0x2e, 0x60, 0xcb, 0xde, 0xd6, 0xbb, 0xe8, 0xef, 0x65, 0x98, 0x5a, 0xc6, 0x4e, 0xdd, 0xd1, - 0x9c, 0x5d, 0xbb, 0x67, 0xbb, 0xd3, 0x30, 0x4b, 0x5a, 0x6b, 0x1b, 0xb3, 0xee, 0xc8, 0x7b, 0x45, - 0x6f, 0x93, 0x45, 0xfd, 0x89, 0x82, 0x72, 0xe6, 0xfd, 0x32, 0x22, 0x30, 0x79, 0x02, 0x64, 0xdb, - 0x9a, 0xa3, 0x31, 0x2c, 0xae, 0xea, 0xc1, 0x22, 0x20, 0xa4, 0x92, 0x6c, 0xe8, 0x77, 0x24, 0x11, - 0x87, 0x22, 0x81, 0xf2, 0x93, 0x81, 0xf0, 0xae, 0xcc, 0x10, 0x28, 0x1c, 0x83, 0xd9, 0x6a, 0xad, - 0xd1, 0x5c, 0xad, 0x2d, 0x2f, 0x97, 0xdd, 0xd4, 0x82, 0xac, 0x9c, 0x04, 0x65, 0xbd, 0x78, 0xff, - 0x5a, 0xb9, 0xda, 0x68, 0x56, 0x6b, 0x8b, 0x65, 0xf6, 0x67, 0x56, 0x39, 0x0a, 0xd3, 0xa5, 0x62, - 0x69, 0xc5, 0x4b, 0xc8, 0x29, 0xa7, 0xe0, 0xf8, 0x5a, 0x79, 0x6d, 0xa1, 0xac, 0xd6, 0x57, 0x2a, - 0xeb, 0x4d, 0x97, 0xcc, 0x52, 0x6d, 0xa3, 0xba, 0x58, 0xc8, 0x2b, 0x08, 0x4e, 0x86, 0xbe, 0x9c, - 0x57, 0x6b, 0xd5, 0xe5, 0x66, 0xbd, 0x51, 0x6c, 0x94, 0x0b, 0x13, 0xca, 0x15, 0x70, 0xb4, 0x54, - 0xac, 0x92, 0xec, 0xa5, 0x5a, 0xb5, 0x5a, 0x2e, 0x35, 0x0a, 0x93, 0xe8, 0xbb, 0x59, 0x98, 0xae, - 0xd8, 0x55, 0x6d, 0x07, 0x9f, 0xd3, 0x3a, 0x7a, 0x1b, 0x3d, 0x2f, 0x34, 0xf3, 0xb8, 0x1e, 0x66, - 0x2d, 0xfa, 0x88, 0xdb, 0x0d, 0x1d, 0x53, 0x34, 0x67, 0x55, 0x3e, 0xd1, 0x9d, 0x93, 0x1b, 0x84, - 0x80, 0x37, 0x27, 0xa7, 0x6f, 0xca, 0x02, 0x00, 0x7d, 0x6a, 0x04, 0x97, 0xbb, 0x9e, 0xed, 0x6d, - 0x4d, 0xda, 0x0e, 0xb6, 0xb1, 0xb5, 0xa7, 0xb7, 0xb0, 0x97, 0x53, 0x0d, 0xfd, 0x85, 0xbe, 0x28, - 0x8b, 0xee, 0x2f, 0x86, 0x40, 0x0d, 0x55, 0x27, 0xa2, 0x37, 0xfc, 0x39, 0x59, 0x64, 0x77, 0x50, - 0x88, 0x64, 0x32, 0x4d, 0xf9, 0x25, 0x69, 0xb8, 0x65, 0xdb, 0x46, 0xad, 0xd6, 0xac, 0xaf, 0xd4, - 0xd4, 0x46, 0x41, 0x56, 0x66, 0x60, 0xd2, 0x7d, 0x5d, 0xad, 0x55, 0x97, 0x0b, 0x59, 0xe5, 0x04, - 0x1c, 0x5b, 0x29, 0xd6, 0x9b, 0x95, 0xea, 0xb9, 0xe2, 0x6a, 0x65, 0xb1, 0x59, 0x5a, 0x29, 0xaa, - 0xf5, 0x42, 0x4e, 0xb9, 0x0a, 0x4e, 0x34, 0x2a, 0x65, 0xb5, 0xb9, 0x54, 0x2e, 0x36, 0x36, 0xd4, - 0x72, 0xbd, 0x59, 0xad, 0x35, 0xab, 0xc5, 0xb5, 0x72, 0x21, 0xef, 0x36, 0x7f, 0xf2, 0x29, 0x50, - 0x9b, 0x89, 0xfd, 0xca, 0x38, 0x19, 0xa1, 0x8c, 0x53, 0xbd, 0xca, 0x08, 0x61, 0xb5, 0x52, 0xcb, - 0xf5, 0xb2, 0x7a, 0xae, 0x5c, 0x98, 0xee, 0xa7, 0x6b, 0x33, 0xca, 0x71, 0x28, 0xb8, 0x3c, 0x34, - 0x2b, 0x75, 0x2f, 0xe7, 0x62, 0x61, 0x16, 0x7d, 0x38, 0x0f, 0x27, 0x55, 0xbc, 0xa5, 0xdb, 0x0e, - 0xb6, 0xd6, 0xb5, 0xcb, 0x3b, 0xd8, 0x70, 0xbc, 0x4e, 0xfe, 0x5f, 0x13, 0x2b, 0xe3, 0x1a, 0xcc, - 0x76, 0x29, 0x8d, 0x35, 0xec, 0x6c, 0x9b, 0x6d, 0x36, 0x0a, 0x3f, 0x2e, 0xb2, 0xe7, 0x98, 0x5f, - 0x0f, 0x67, 0x57, 0xf9, 0xbf, 0x43, 0xba, 0x2d, 0xc7, 0xe8, 0x76, 0x76, 0x18, 0xdd, 0x56, 0xae, - 0x81, 0xa9, 0x5d, 0x1b, 0x5b, 0xe5, 0x1d, 0x4d, 0xef, 0x78, 0x97, 0x73, 0xfa, 0x09, 0xe8, 0xcd, - 0x59, 0xd1, 0x13, 0x2b, 0xa1, 0xba, 0xf4, 0x17, 0x63, 0x44, 0xdf, 0x7a, 0x1a, 0x80, 0x55, 0x76, - 0xc3, 0xea, 0x30, 0x65, 0x0d, 0xa5, 0xb8, 0xfc, 0x5d, 0xd0, 0x3b, 0x1d, 0xdd, 0xd8, 0xf2, 0xf7, - 0xfd, 0x83, 0x04, 0xf4, 0x4b, 0xb2, 0xc8, 0x09, 0x96, 0xa4, 0xbc, 0x25, 0x6b, 0x4d, 0xcf, 0x97, - 0xc6, 0xdc, 0xef, 0xee, 0x6f, 0x3a, 0x79, 0xa5, 0x00, 0x33, 0x24, 0x8d, 0xb5, 0xc0, 0xc2, 0x84, - 0xdb, 0x07, 0x7b, 0xe4, 0xd6, 0xca, 0x8d, 0x95, 0xda, 0xa2, 0xff, 0x6d, 0xd2, 0x25, 0xe9, 0x32, - 0x53, 0xac, 0xde, 0x4f, 0x5a, 0xe3, 0x94, 0xf2, 0x18, 0xb8, 0x2a, 0xd4, 0x61, 0x17, 0x57, 0xd5, - 0x72, 0x71, 0xf1, 0xfe, 0x66, 0xf9, 0x19, 0x95, 0x7a, 0xa3, 0xce, 0x37, 0x2e, 0xaf, 0x1d, 0x4d, - 0xbb, 0xfc, 0x96, 0xd7, 0x8a, 0x95, 0x55, 0xd6, 0xbf, 0x2f, 0xd5, 0xd4, 0xb5, 0x62, 0xa3, 0x30, - 0x83, 0x5e, 0x2c, 0x43, 0x61, 0x19, 0x3b, 0xeb, 0xa6, 0xe5, 0x68, 0x9d, 0x55, 0xdd, 0xb8, 0xb8, - 0x61, 0x75, 0xb8, 0xc9, 0xa6, 0x70, 0x98, 0x0e, 0x7e, 0x88, 0xe4, 0x08, 0x46, 0xef, 0x88, 0x77, - 0x49, 0xb6, 0x40, 0x99, 0x82, 0x04, 0xf4, 0x2c, 0x49, 0x64, 0xb9, 0x5b, 0xbc, 0xd4, 0x64, 0x7a, - 0xf2, 0xec, 0x71, 0x8f, 0xcf, 0x7d, 0x50, 0xcb, 0xa3, 0xe7, 0x66, 0x61, 0x72, 0x49, 0x37, 0xb4, - 0x8e, 0xfe, 0x4c, 0x2e, 0x7e, 0x69, 0xd0, 0xc7, 0x64, 0x62, 0xfa, 0x18, 0x69, 0xa8, 0xf1, 0xf3, - 0x57, 0x65, 0xd1, 0xe5, 0x85, 0x90, 0xec, 0x3d, 0x26, 0x23, 0x06, 0xcf, 0xf7, 0x49, 0x22, 0xcb, - 0x0b, 0x83, 0xe9, 0x25, 0xc3, 0xf0, 0xa3, 0xdf, 0x1b, 0x36, 0x56, 0x4f, 0xfb, 0x9e, 0xec, 0xa7, - 0x0a, 0x53, 0xe8, 0xcf, 0x65, 0x40, 0xcb, 0xd8, 0x39, 0x87, 0x2d, 0x7f, 0x2a, 0x40, 0x7a, 0x7d, - 0x66, 0x6f, 0x87, 0x9a, 0xec, 0xeb, 0xc3, 0x00, 0x9e, 0xe7, 0x01, 0x2c, 0xc6, 0x34, 0x9e, 0x08, - 0xd2, 0x11, 0x8d, 0xb7, 0x02, 0x79, 0x9b, 0x7c, 0x67, 0x6a, 0xf6, 0xc4, 0xe8, 0xe1, 0x92, 0x10, - 0x0b, 0x53, 0xa7, 0x84, 0x55, 0x46, 0x00, 0x7d, 0xcb, 0x9f, 0x04, 0xfd, 0x28, 0xa7, 0x1d, 0x4b, - 0x07, 0x66, 0x36, 0x99, 0xbe, 0x58, 0xe9, 0xaa, 0x4b, 0x3f, 0xfb, 0x06, 0xbd, 0x2f, 0x07, 0xc7, - 0xfb, 0x55, 0x07, 0xfd, 0x6e, 0x86, 0xdb, 0x61, 0xc7, 0x64, 0xc8, 0xcf, 0xb0, 0x0d, 0x44, 0xf7, - 0x45, 0x79, 0x32, 0x9c, 0xf0, 0x97, 0xe1, 0x1a, 0x66, 0x15, 0x5f, 0xb2, 0x3b, 0xd8, 0x71, 0xb0, - 0x45, 0xaa, 0x36, 0xa9, 0xf6, 0xff, 0xa8, 0x3c, 0x15, 0xae, 0xd4, 0x0d, 0x5b, 0x6f, 0x63, 0xab, - 0xa1, 0x77, 0xed, 0xa2, 0xd1, 0x6e, 0xec, 0x3a, 0xa6, 0xa5, 0x6b, 0xec, 0x2a, 0xc9, 0x49, 0x35, - 0xea, 0xb3, 0x72, 0x13, 0x14, 0x74, 0xbb, 0x66, 0x5c, 0x30, 0x35, 0xab, 0xad, 0x1b, 0x5b, 0xab, - 0xba, 0xed, 0x30, 0x0f, 0xe0, 0x7d, 0xe9, 0xe8, 0x1f, 0x64, 0xd1, 0xc3, 0x74, 0x03, 0x60, 0x8d, - 0xe8, 0x50, 0x7e, 0x56, 0x16, 0x39, 0x1e, 0x97, 0x8c, 0x76, 0x32, 0x65, 0x79, 0xce, 0xb8, 0x0d, - 0x89, 0xfe, 0x23, 0x38, 0xe9, 0x5a, 0x68, 0xba, 0x67, 0x08, 0x9c, 0x2b, 0xab, 0x95, 0xa5, 0x4a, - 0xd9, 0x35, 0x2b, 0x4e, 0xc0, 0xb1, 0xe0, 0xdb, 0xe2, 0xfd, 0xcd, 0x7a, 0xb9, 0xda, 0x28, 0x4c, - 0xba, 0xfd, 0x14, 0x4d, 0x5e, 0x2a, 0x56, 0x56, 0xcb, 0x8b, 0xcd, 0x46, 0xcd, 0xfd, 0xb2, 0x38, - 0x9c, 0x69, 0x81, 0x1e, 0xca, 0xc2, 0x51, 0x22, 0xdb, 0xcb, 0x44, 0xaa, 0xae, 0x50, 0x7a, 0x7c, - 0x6d, 0x7d, 0x80, 0xa6, 0xa8, 0x78, 0xd1, 0x27, 0x85, 0x6f, 0xca, 0x0c, 0x41, 0xd8, 0x53, 0x46, - 0x84, 0x66, 0x7c, 0x53, 0x12, 0x89, 0x50, 0x21, 0x4c, 0x36, 0x99, 0x52, 0xfc, 0xdb, 0xb8, 0x47, - 0x9c, 0x68, 0xf0, 0x89, 0x95, 0x59, 0x22, 0x3f, 0x3f, 0x63, 0xbd, 0xa2, 0x12, 0x75, 0x98, 0x03, - 0x20, 0x29, 0x44, 0x83, 0xa8, 0x1e, 0xf4, 0x1d, 0xaf, 0xa2, 0xf4, 0xa0, 0x58, 0x6a, 0x54, 0xce, - 0x95, 0xa3, 0xf4, 0xe0, 0x13, 0x32, 0x4c, 0x2e, 0x63, 0xc7, 0x9d, 0x53, 0xd9, 0xe8, 0x69, 0x02, - 0xeb, 0x3f, 0xae, 0x19, 0xd3, 0x31, 0x5b, 0x5a, 0xc7, 0x5f, 0x06, 0xa0, 0x6f, 0xe8, 0x67, 0x86, - 0x31, 0x41, 0xbc, 0xa2, 0x23, 0xc6, 0xab, 0x1f, 0x86, 0x9c, 0xe3, 0x7e, 0x66, 0xcb, 0xd0, 0x3f, - 0x10, 0x39, 0x5c, 0xb9, 0x44, 0x16, 0x35, 0x47, 0x53, 0x69, 0xfe, 0xd0, 0xe8, 0x24, 0x68, 0xbb, - 0x44, 0x30, 0xf2, 0xbd, 0x68, 0x7f, 0xfe, 0x9d, 0x0c, 0x27, 0x68, 0xfb, 0x28, 0x76, 0xbb, 0x75, - 0xc7, 0xb4, 0xb0, 0x8a, 0x5b, 0x58, 0xef, 0x3a, 0x3d, 0xeb, 0x7b, 0x16, 0x4d, 0xf5, 0x36, 0x9b, - 0xd9, 0x2b, 0x7a, 0x8d, 0x2c, 0x1a, 0x83, 0x79, 0x5f, 0x7b, 0xec, 0x29, 0x2f, 0xa2, 0xb1, 0x7f, - 0x48, 0x12, 0x89, 0xaa, 0x9c, 0x90, 0x78, 0x32, 0xa0, 0xde, 0x7f, 0x08, 0x40, 0x79, 0x2b, 0x37, - 0x6a, 0xb9, 0x54, 0xae, 0xac, 0xbb, 0x83, 0xc0, 0xb5, 0x70, 0xf5, 0xfa, 0x86, 0x5a, 0x5a, 0x29, - 0xd6, 0xcb, 0x4d, 0xb5, 0xbc, 0x5c, 0xa9, 0x37, 0x98, 0x53, 0x16, 0xfd, 0x6b, 0x42, 0xb9, 0x06, - 0x4e, 0xd5, 0x37, 0x16, 0xea, 0x25, 0xb5, 0xb2, 0x4e, 0xd2, 0xd5, 0x72, 0xb5, 0x7c, 0x9e, 0x7d, - 0x9d, 0x44, 0xef, 0x29, 0xc0, 0xb4, 0x3b, 0x01, 0xa8, 0xd3, 0x79, 0x01, 0xfa, 0x5a, 0x16, 0xa6, - 0x55, 0x6c, 0x9b, 0x9d, 0x3d, 0x32, 0x47, 0x18, 0xd7, 0xd4, 0xe3, 0x1b, 0xb2, 0xe8, 0xf9, 0xed, - 0x10, 0xb3, 0xf3, 0x21, 0x46, 0xa3, 0x27, 0x9a, 0xda, 0x9e, 0xa6, 0x77, 0xb4, 0x0b, 0xac, 0xab, - 0x99, 0x54, 0x83, 0x04, 0x65, 0x1e, 0x14, 0xf3, 0x92, 0x81, 0xad, 0x7a, 0xeb, 0x52, 0xd9, 0xd9, - 0x2e, 0xb6, 0xdb, 0x16, 0xb6, 0x6d, 0xb6, 0x7a, 0xd1, 0xe7, 0x8b, 0x72, 0x23, 0x1c, 0x25, 0xa9, - 0xa1, 0xcc, 0xd4, 0x41, 0xa6, 0x37, 0xd9, 0xcf, 0x59, 0x34, 0x2e, 0x7b, 0x39, 0x73, 0xa1, 0x9c, - 0x41, 0x72, 0xf8, 0xb8, 0x44, 0x9e, 0x3f, 0xa5, 0x73, 0x06, 0xa6, 0x0d, 0x6d, 0x07, 0x97, 0x1f, - 0xec, 0xea, 0x16, 0xb6, 0x89, 0x63, 0x8c, 0xac, 0x86, 0x93, 0xd0, 0xfb, 0x84, 0xce, 0x9b, 0x8b, - 0x49, 0x2c, 0x99, 0xee, 0x2f, 0x0f, 0xa1, 0xfa, 0x7d, 0xfa, 0x19, 0x19, 0xbd, 0x47, 0x86, 0x19, - 0xc6, 0x54, 0xd1, 0xb8, 0x5c, 0x69, 0xa3, 0x6b, 0x39, 0xe3, 0x57, 0x73, 0xd3, 0x3c, 0xe3, 0x97, - 0xbc, 0xa0, 0x9f, 0x97, 0x45, 0xdd, 0x9d, 0xfb, 0x54, 0x9c, 0x94, 0x11, 0xed, 0x38, 0xba, 0x69, - 0xee, 0x32, 0x47, 0xd5, 0x49, 0x95, 0xbe, 0xa4, 0xb9, 0xa8, 0x87, 0xfe, 0x40, 0xc8, 0x99, 0x5a, - 0xb0, 0x1a, 0x87, 0x04, 0xe0, 0x47, 0x64, 0x98, 0x63, 0x5c, 0xd5, 0xd9, 0x39, 0x1f, 0xa1, 0x03, - 0x6f, 0xbf, 0x28, 0x6c, 0x08, 0xf6, 0xa9, 0x3f, 0x2b, 0xe9, 0x51, 0x03, 0xe4, 0x07, 0x84, 0x82, - 0xa3, 0x09, 0x57, 0xe4, 0x90, 0xa0, 0x7c, 0x4b, 0x16, 0xa6, 0x37, 0x6c, 0x6c, 0x31, 0xbf, 0x7d, - 0xf4, 0x70, 0x16, 0xe4, 0x65, 0xcc, 0x6d, 0xa4, 0xbe, 0x40, 0xd8, 0xc3, 0x37, 0x5c, 0xd9, 0x10, - 0x51, 0xd7, 0x46, 0x8a, 0x80, 0xed, 0x06, 0x98, 0xa3, 0x22, 0x2d, 0x3a, 0x8e, 0x6b, 0x24, 0x7a, - 0xde, 0xb4, 0x3d, 0xa9, 0xa3, 0xd8, 0x2a, 0x22, 0x65, 0xb9, 0x59, 0x4a, 0x2e, 0x4f, 0xab, 0x78, - 0x93, 0xce, 0x67, 0xb3, 0x6a, 0x4f, 0xaa, 0x72, 0x2b, 0x5c, 0x61, 0x76, 0x31, 0x3d, 0xbf, 0x12, - 0xca, 0x9c, 0x23, 0x99, 0xfb, 0x7d, 0x42, 0x5f, 0x13, 0xf2, 0xd5, 0x15, 0x97, 0x4e, 0x32, 0x5d, - 0xe8, 0x8e, 0xc6, 0x24, 0x39, 0x0e, 0x05, 0x37, 0x07, 0xd9, 0x7f, 0x51, 0xcb, 0xf5, 0xda, 0xea, - 0xb9, 0x72, 0xff, 0x65, 0x8c, 0x1c, 0x7a, 0x8e, 0x0c, 0x53, 0x0b, 0x96, 0xa9, 0xb5, 0x5b, 0x9a, - 0xed, 0xa0, 0x6f, 0x49, 0x30, 0xb3, 0xae, 0x5d, 0xee, 0x98, 0x5a, 0x9b, 0xf8, 0xf7, 0xf7, 0xf4, - 0x05, 0x5d, 0xfa, 0xc9, 0xeb, 0x0b, 0xd8, 0x2b, 0x7f, 0x30, 0xd0, 0x3f, 0xba, 0x97, 0x11, 0xb9, - 0x50, 0xd3, 0xdf, 0xe6, 0x93, 0xfa, 0x05, 0x2b, 0xf5, 0xf8, 0x9a, 0x0f, 0xf3, 0x14, 0x61, 0x51, - 0xbe, 0x47, 0x2c, 0xfc, 0xa8, 0x08, 0xc9, 0xc3, 0xd9, 0x95, 0x7f, 0xee, 0x24, 0xe4, 0x17, 0x31, - 0xb1, 0xe2, 0xfe, 0xbb, 0x04, 0x13, 0x75, 0xec, 0x10, 0x0b, 0xee, 0x76, 0xce, 0x53, 0xb8, 0x4d, - 0x32, 0x04, 0x4e, 0xec, 0xde, 0xbb, 0x3b, 0x59, 0x0f, 0x9d, 0xb7, 0x26, 0xcf, 0x09, 0x3c, 0x12, - 0x69, 0xb9, 0xf3, 0xac, 0xcc, 0x03, 0x79, 0x24, 0xc6, 0x92, 0x4a, 0xdf, 0xd7, 0xea, 0x6d, 0x12, - 0x73, 0xad, 0x0a, 0xf5, 0x7a, 0xaf, 0x08, 0xeb, 0x67, 0xac, 0xb7, 0x19, 0x63, 0x3e, 0xc6, 0x39, - 0xea, 0x49, 0x30, 0x41, 0x65, 0xee, 0xcd, 0x47, 0x7b, 0xfd, 0x14, 0x28, 0x09, 0x72, 0xf6, 0xda, - 0xcb, 0x29, 0xe8, 0xa2, 0x16, 0x5d, 0xf8, 0x58, 0x62, 0x10, 0xcc, 0x54, 0xb1, 0x73, 0xc9, 0xb4, - 0x2e, 0xd6, 0x1d, 0xcd, 0xc1, 0xe8, 0xdf, 0x24, 0x90, 0xeb, 0xd8, 0x09, 0x47, 0x3f, 0xa9, 0xc2, - 0x31, 0x5a, 0x21, 0x96, 0x91, 0xf4, 0xdf, 0xb4, 0x22, 0x67, 0xfa, 0x0a, 0x21, 0x94, 0x4f, 0xdd, - 0xff, 0x2b, 0xfa, 0xf5, 0xbe, 0x41, 0x9f, 0xa4, 0x3e, 0x93, 0x06, 0x26, 0x99, 0x30, 0x83, 0xae, - 0x82, 0x45, 0xe8, 0xe9, 0x7b, 0x85, 0xcc, 0x6a, 0x31, 0x9a, 0x87, 0xd3, 0x15, 0x7c, 0xe0, 0x2a, - 0xc8, 0x96, 0xb6, 0x35, 0x07, 0xbd, 0x55, 0x06, 0x28, 0xb6, 0xdb, 0x6b, 0xd4, 0x07, 0x3c, 0xec, - 0x90, 0x76, 0x16, 0x66, 0x5a, 0xdb, 0x5a, 0x70, 0xb7, 0x09, 0xed, 0x0f, 0xb8, 0x34, 0xe5, 0xc9, - 0x81, 0x33, 0x39, 0x95, 0x2a, 0xea, 0x81, 0xc9, 0x2d, 0x83, 0xd1, 0xf6, 0x1d, 0xcd, 0xf9, 0x50, - 0x98, 0xb1, 0x47, 0xe8, 0xdc, 0xdf, 0xe7, 0x03, 0xf6, 0xa2, 0xe7, 0x70, 0x8c, 0xb4, 0x7f, 0xc0, - 0x26, 0x48, 0x48, 0x78, 0xd2, 0x5b, 0x2c, 0xa0, 0x47, 0x3c, 0x5f, 0x63, 0x09, 0x5d, 0xab, 0x94, - 0xdb, 0xba, 0x27, 0x5a, 0x16, 0x30, 0x0b, 0x3d, 0x3f, 0x93, 0x0c, 0xbe, 0x78, 0xc1, 0xdd, 0x03, - 0xb3, 0xb8, 0xad, 0x3b, 0xd8, 0xab, 0x25, 0x13, 0x60, 0x1c, 0xc4, 0xfc, 0x0f, 0xe8, 0xd9, 0xc2, - 0x41, 0xd7, 0x88, 0x40, 0xf7, 0xd7, 0x28, 0xa2, 0xfd, 0x89, 0x85, 0x51, 0x13, 0xa3, 0x99, 0x3e, - 0x58, 0x3f, 0x23, 0xc3, 0x89, 0x86, 0xb9, 0xb5, 0xd5, 0xc1, 0x9e, 0x98, 0x30, 0xf5, 0xce, 0x44, - 0xda, 0x28, 0xe1, 0x22, 0x3b, 0x41, 0xe6, 0x03, 0xba, 0x7f, 0x94, 0xcc, 0x7d, 0xe1, 0x4f, 0x4c, - 0xc5, 0xce, 0xa2, 0x88, 0xb8, 0xfa, 0xf2, 0x19, 0x81, 0x82, 0x58, 0xc0, 0x67, 0x61, 0xb2, 0xe9, - 0x03, 0xf1, 0x59, 0x09, 0x66, 0xe9, 0xcd, 0x95, 0x9e, 0x82, 0xde, 0x37, 0x42, 0x00, 0xd0, 0xb7, - 0x32, 0xa2, 0x7e, 0xb6, 0x44, 0x26, 0x1c, 0x27, 0x11, 0x22, 0x16, 0x0b, 0xaa, 0x32, 0x90, 0x5c, - 0xfa, 0xa2, 0xfd, 0x13, 0x19, 0xa6, 0x97, 0xb1, 0xd7, 0xd2, 0xec, 0xc4, 0x3d, 0xd1, 0x59, 0x98, - 0x21, 0xd7, 0xb7, 0xd5, 0xd8, 0x31, 0x49, 0xba, 0x6a, 0xc6, 0xa5, 0x29, 0xd7, 0xc3, 0xec, 0x05, - 0xbc, 0x69, 0x5a, 0xb8, 0xc6, 0x9d, 0xa5, 0xe4, 0x13, 0x23, 0xc2, 0xd3, 0x71, 0x71, 0xd0, 0x16, - 0x78, 0x6c, 0x6e, 0xde, 0x2f, 0xcc, 0x50, 0x55, 0x22, 0xc6, 0x9c, 0xa7, 0xc0, 0x24, 0x43, 0xde, - 0x33, 0xd3, 0xe2, 0xfa, 0x45, 0x3f, 0x2f, 0x7a, 0xb5, 0x8f, 0x68, 0x99, 0x43, 0xf4, 0x89, 0x49, - 0x98, 0x18, 0xcb, 0xfd, 0xee, 0x85, 0x50, 0xf9, 0x0b, 0x97, 0x2b, 0x6d, 0x1b, 0xad, 0x25, 0xc3, - 0xf4, 0x34, 0x80, 0xdf, 0x38, 0xbc, 0xb0, 0x16, 0xa1, 0x14, 0x3e, 0x72, 0x7d, 0xec, 0x41, 0xbd, - 0x5e, 0x71, 0x10, 0x76, 0x46, 0x0c, 0x8c, 0xd8, 0x01, 0x3f, 0x11, 0x4e, 0xd2, 0x47, 0xe7, 0xe3, - 0x32, 0x9c, 0xf0, 0xcf, 0x1f, 0xad, 0x6a, 0x76, 0xd0, 0xee, 0x4a, 0xc9, 0x20, 0xe2, 0x0e, 0x7c, - 0xf8, 0x8d, 0xe5, 0xeb, 0xc9, 0xc6, 0x8c, 0xbe, 0x9c, 0x8c, 0x16, 0x1d, 0xe5, 0x66, 0x38, 0x66, - 0xec, 0xee, 0xf8, 0x52, 0x27, 0x2d, 0x9e, 0xb5, 0xf0, 0xfd, 0x1f, 0x92, 0x8c, 0x4c, 0x22, 0xcc, - 0x8f, 0x65, 0x4e, 0xc9, 0x1d, 0xe9, 0x7a, 0x42, 0x22, 0x18, 0xd1, 0xbf, 0x64, 0x12, 0xf5, 0x6e, - 0x83, 0xcf, 0x7c, 0x25, 0xe8, 0xa5, 0x0e, 0xf1, 0xc0, 0xd7, 0xd9, 0x09, 0xc8, 0x95, 0x77, 0xba, - 0xce, 0xe5, 0xb3, 0x8f, 0x85, 0xd9, 0xba, 0x63, 0x61, 0x6d, 0x27, 0xb4, 0x33, 0xe0, 0x98, 0x17, - 0xb1, 0xe1, 0xed, 0x0c, 0x90, 0x97, 0x3b, 0x6e, 0x87, 0x09, 0xc3, 0x6c, 0x6a, 0xbb, 0xce, 0xb6, - 0x72, 0xed, 0xbe, 0x23, 0xf5, 0x0c, 0xfc, 0x1a, 0x8b, 0x61, 0xf4, 0xc5, 0x3b, 0xc9, 0xda, 0x70, - 0xde, 0x30, 0x8b, 0xbb, 0xce, 0xf6, 0xc2, 0x35, 0x1f, 0xf9, 0xdb, 0xd3, 0x99, 0x4f, 0xfc, 0xed, - 0xe9, 0xcc, 0x17, 0xfe, 0xf6, 0x74, 0xe6, 0x17, 0xbf, 0x74, 0xfa, 0xc8, 0x27, 0xbe, 0x74, 0xfa, - 0xc8, 0x67, 0xbf, 0x74, 0xfa, 0xc8, 0x8f, 0x4a, 0xdd, 0x0b, 0x17, 0xf2, 0x84, 0xca, 0x93, 0xfe, - 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x7f, 0x7f, 0x9b, 0x26, 0x60, 0x08, 0x02, 0x00, + // 19802 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0xfd, 0x7b, 0x9c, 0x24, 0x49, + 0x59, 0x2f, 0x8c, 0x4f, 0x65, 0x56, 0x55, 0x77, 0x3f, 0x7d, 0x99, 0x9a, 0xdc, 0x99, 0xd9, 0xd9, + 0xd8, 0x65, 0x76, 0x9c, 0x5d, 0x96, 0x75, 0x59, 0x7a, 0x2f, 0x20, 0xb2, 0xcb, 0xde, 0xaa, 0xab, + 0xab, 0xbb, 0x6b, 0xb7, 0xbb, 0xaa, 0xcd, 0xaa, 0x9e, 0x61, 0xf5, 0xf8, 0xab, 0x93, 0x53, 0x15, + 0xdd, 0x9d, 0x3b, 0xd5, 0x99, 0x65, 0x66, 0x76, 0xcf, 0x0e, 0xbf, 0xcf, 0x79, 0x8f, 0x88, 0x2b, + 0x28, 0x72, 0x10, 0x15, 0x15, 0x15, 0x90, 0xcb, 0xca, 0x01, 0x05, 0xe4, 0x7e, 0x40, 0x05, 0xe4, + 0x22, 0x88, 0x88, 0x08, 0x72, 0x11, 0xdd, 0x57, 0x10, 0x44, 0x3c, 0x1f, 0x39, 0xbc, 0xfa, 0x1e, + 0x41, 0x14, 0x5e, 0xdf, 0x4f, 0x46, 0x44, 0x5e, 0xa2, 0xba, 0x32, 0x2b, 0xb2, 0xba, 0xb2, 0x7a, + 0x91, 0xf7, 0xbf, 0xcc, 0xc8, 0xc8, 0x27, 0x9e, 0x78, 0xbe, 0x4f, 0x44, 0x3c, 0x11, 0xf1, 0xc4, + 0x13, 0x70, 0xaa, 0x7b, 0xe1, 0x96, 0xae, 0x65, 0x3a, 0xa6, 0x7d, 0x4b, 0xcb, 0xdc, 0xd9, 0xd1, + 0x8c, 0xb6, 0x3d, 0x4f, 0xde, 0x95, 0x09, 0xcd, 0xb8, 0xec, 0x5c, 0xee, 0x62, 0x74, 0x7d, 0xf7, + 0xe2, 0xd6, 0x2d, 0x1d, 0xfd, 0xc2, 0x2d, 0xdd, 0x0b, 0xb7, 0xec, 0x98, 0x6d, 0xdc, 0xf1, 0x7e, + 0x20, 0x2f, 0x2c, 0x3b, 0xba, 0x31, 0x2a, 0x57, 0xc7, 0x6c, 0x69, 0x1d, 0xdb, 0x31, 0x2d, 0xcc, + 0x72, 0x9e, 0x0c, 0x8a, 0xc4, 0x7b, 0xd8, 0x70, 0x3c, 0x0a, 0xd7, 0x6c, 0x99, 0xe6, 0x56, 0x07, + 0xd3, 0x6f, 0x17, 0x76, 0x37, 0x6f, 0xb1, 0x1d, 0x6b, 0xb7, 0xe5, 0xb0, 0xaf, 0x67, 0x7a, 0xbf, + 0xb6, 0xb1, 0xdd, 0xb2, 0xf4, 0xae, 0x63, 0x5a, 0x34, 0xc7, 0xd9, 0x77, 0xfd, 0xe2, 0x24, 0xc8, + 0x6a, 0xb7, 0x85, 0xbe, 0x31, 0x01, 0x72, 0xb1, 0xdb, 0x45, 0x1f, 0x92, 0x00, 0x96, 0xb1, 0x73, + 0x0e, 0x5b, 0xb6, 0x6e, 0x1a, 0xe8, 0x28, 0x4c, 0xa8, 0xf8, 0xc7, 0x76, 0xb1, 0xed, 0xdc, 0x99, + 0x7d, 0xfe, 0x57, 0xe4, 0x0c, 0x7a, 0x54, 0x82, 0x49, 0x15, 0xdb, 0x5d, 0xd3, 0xb0, 0xb1, 0x72, + 0x1f, 0xe4, 0xb0, 0x65, 0x99, 0xd6, 0xa9, 0xcc, 0x99, 0xcc, 0x8d, 0xd3, 0xb7, 0xdf, 0x34, 0xcf, + 0xaa, 0x3f, 0xaf, 0x76, 0x5b, 0xf3, 0xc5, 0x6e, 0x77, 0x3e, 0xa0, 0x34, 0xef, 0xfd, 0x34, 0x5f, + 0x76, 0xff, 0x50, 0xe9, 0x8f, 0xca, 0x29, 0x98, 0xd8, 0xa3, 0x19, 0x4e, 0x49, 0x67, 0x32, 0x37, + 0x4e, 0xa9, 0xde, 0xab, 0xfb, 0xa5, 0x8d, 0x1d, 0x4d, 0xef, 0xd8, 0xa7, 0x64, 0xfa, 0x85, 0xbd, + 0xa2, 0x57, 0x65, 0x20, 0x47, 0x88, 0x28, 0x25, 0xc8, 0xb6, 0xcc, 0x36, 0x26, 0xc5, 0xcf, 0xdd, + 0x7e, 0x8b, 0x78, 0xf1, 0xf3, 0x25, 0xb3, 0x8d, 0x55, 0xf2, 0xb3, 0x72, 0x06, 0xa6, 0x3d, 0xb1, + 0x04, 0x6c, 0x84, 0x93, 0xce, 0xde, 0x0e, 0x59, 0x37, 0xbf, 0x32, 0x09, 0xd9, 0xea, 0xc6, 0xea, + 0x6a, 0xe1, 0x88, 0x72, 0x0c, 0x66, 0x37, 0xaa, 0x0f, 0x54, 0x6b, 0xe7, 0xab, 0xcd, 0xb2, 0xaa, + 0xd6, 0xd4, 0x42, 0x46, 0x99, 0x85, 0xa9, 0x85, 0xe2, 0x62, 0xb3, 0x52, 0x5d, 0xdf, 0x68, 0x14, + 0x24, 0xf4, 0x72, 0x19, 0xe6, 0xea, 0xd8, 0x59, 0xc4, 0x7b, 0x7a, 0x0b, 0xd7, 0x1d, 0xcd, 0xc1, + 0xe8, 0x45, 0x19, 0x5f, 0x98, 0xca, 0x86, 0x5b, 0xa8, 0xff, 0x89, 0x55, 0xe0, 0xa9, 0xfb, 0x2a, + 0xc0, 0x53, 0x98, 0x67, 0x7f, 0xcf, 0x87, 0xd2, 0xd4, 0x30, 0x9d, 0xb3, 0x4f, 0x81, 0xe9, 0xd0, + 0x37, 0x65, 0x0e, 0x60, 0xa1, 0x58, 0x7a, 0x60, 0x59, 0xad, 0x6d, 0x54, 0x17, 0x0b, 0x47, 0xdc, + 0xf7, 0xa5, 0x9a, 0x5a, 0x66, 0xef, 0x19, 0xf4, 0xad, 0x4c, 0x08, 0xcc, 0x45, 0x1e, 0xcc, 0xf9, + 0xc1, 0xcc, 0xf4, 0x01, 0x14, 0xfd, 0xa6, 0x0f, 0xce, 0x32, 0x07, 0xce, 0x53, 0x93, 0x91, 0x4b, + 0x1f, 0xa0, 0x47, 0x24, 0x98, 0xac, 0x6f, 0xef, 0x3a, 0x6d, 0xf3, 0x92, 0x81, 0xa6, 0x7c, 0x64, + 0xd0, 0xd7, 0xc2, 0x32, 0xb9, 0x87, 0x97, 0xc9, 0x8d, 0xfb, 0x2b, 0xc1, 0x28, 0x44, 0x48, 0xe3, + 0x37, 0x7c, 0x69, 0x14, 0x39, 0x69, 0x3c, 0x45, 0x94, 0x50, 0xfa, 0x72, 0xf8, 0xd5, 0x67, 0x40, + 0xae, 0xde, 0xd5, 0x5a, 0x18, 0x7d, 0x4c, 0x86, 0x99, 0x55, 0xac, 0xed, 0xe1, 0x62, 0xb7, 0x6b, + 0x99, 0x7b, 0x18, 0x95, 0x02, 0x7d, 0x3d, 0x05, 0x13, 0xb6, 0x9b, 0xa9, 0xd2, 0x26, 0x35, 0x98, + 0x52, 0xbd, 0x57, 0xe5, 0x34, 0x80, 0xde, 0xc6, 0x86, 0xa3, 0x3b, 0x3a, 0xb6, 0x4f, 0x49, 0x67, + 0xe4, 0x1b, 0xa7, 0xd4, 0x50, 0x0a, 0xfa, 0x86, 0x24, 0xaa, 0x63, 0x84, 0x8b, 0xf9, 0x30, 0x07, + 0x11, 0x52, 0x7d, 0xb5, 0x24, 0xa2, 0x63, 0x03, 0xc9, 0x25, 0x93, 0xed, 0x1b, 0x33, 0xc9, 0x85, + 0xeb, 0xe6, 0xa8, 0xd6, 0x9a, 0xf5, 0x8d, 0xd2, 0x4a, 0xb3, 0xbe, 0x5e, 0x2c, 0x95, 0x0b, 0x58, + 0x39, 0x0e, 0x05, 0xf2, 0xd8, 0xac, 0xd4, 0x9b, 0x8b, 0xe5, 0xd5, 0x72, 0xa3, 0xbc, 0x58, 0xd8, + 0x54, 0x14, 0x98, 0x53, 0xcb, 0x3f, 0xb4, 0x51, 0xae, 0x37, 0x9a, 0x4b, 0xc5, 0xca, 0x6a, 0x79, + 0xb1, 0xb0, 0xe5, 0xfe, 0xbc, 0x5a, 0x59, 0xab, 0x34, 0x9a, 0x6a, 0xb9, 0x58, 0x5a, 0x29, 0x2f, + 0x16, 0xb6, 0x95, 0x2b, 0xe1, 0x8a, 0x6a, 0xad, 0x59, 0x5c, 0x5f, 0x57, 0x6b, 0xe7, 0xca, 0x4d, + 0xf6, 0x47, 0xbd, 0xa0, 0xd3, 0x82, 0x1a, 0xcd, 0xfa, 0x4a, 0x51, 0x2d, 0x17, 0x17, 0x56, 0xcb, + 0x85, 0x87, 0xd0, 0x73, 0x65, 0x98, 0x5d, 0xd3, 0x2e, 0xe2, 0xfa, 0xb6, 0x66, 0x61, 0xed, 0x42, + 0x07, 0xa3, 0xeb, 0x04, 0xf0, 0x44, 0x1f, 0x0b, 0xe3, 0x55, 0xe6, 0xf1, 0xba, 0xa5, 0x8f, 0x80, + 0xb9, 0x22, 0x22, 0x00, 0xfb, 0x17, 0xbf, 0x19, 0xac, 0x70, 0x80, 0x3d, 0x2d, 0x21, 0xbd, 0x64, + 0x88, 0xfd, 0xc4, 0xe3, 0x00, 0x31, 0xf4, 0x98, 0x0c, 0x73, 0x15, 0x63, 0x4f, 0x77, 0xf0, 0x32, + 0x36, 0xb0, 0xe5, 0x8e, 0x03, 0x42, 0x30, 0x3c, 0x2a, 0x87, 0x60, 0x58, 0xe2, 0x61, 0xb8, 0xb5, + 0x8f, 0xd8, 0xf8, 0x32, 0x22, 0x46, 0xdb, 0x6b, 0x60, 0x4a, 0x27, 0xf9, 0x4a, 0x7a, 0x9b, 0x49, + 0x2c, 0x48, 0x50, 0xae, 0x87, 0x59, 0xfa, 0xb2, 0xa4, 0x77, 0xf0, 0x03, 0xf8, 0x32, 0x1b, 0x77, + 0xf9, 0x44, 0xf4, 0xb3, 0x7e, 0xe3, 0xab, 0x70, 0x58, 0xfe, 0x40, 0x52, 0xa6, 0x92, 0x81, 0xf9, + 0x92, 0xc7, 0x43, 0xf3, 0xdb, 0xd7, 0xca, 0x74, 0xf4, 0x1d, 0x09, 0xa6, 0xeb, 0x8e, 0xd9, 0x75, + 0x55, 0x56, 0x37, 0xb6, 0xc4, 0xc0, 0xfd, 0x48, 0xb8, 0x8d, 0x95, 0x78, 0x70, 0x9f, 0xd2, 0x47, + 0x8e, 0xa1, 0x02, 0x22, 0x5a, 0xd8, 0x37, 0xfc, 0x16, 0xb6, 0xc4, 0xa1, 0x72, 0x7b, 0x22, 0x6a, + 0xdf, 0x85, 0xed, 0xeb, 0x25, 0x32, 0x14, 0x3c, 0x35, 0x73, 0x4a, 0xbb, 0x96, 0x85, 0x0d, 0x47, + 0x0c, 0x84, 0xbf, 0x0c, 0x83, 0xb0, 0xc2, 0x83, 0x70, 0x7b, 0x8c, 0x32, 0x7b, 0xa5, 0xa4, 0xd8, + 0xc6, 0xde, 0xe7, 0xa3, 0xf9, 0x00, 0x87, 0xe6, 0x0f, 0x26, 0x67, 0x2b, 0x19, 0xa4, 0x2b, 0x43, + 0x20, 0x7a, 0x1c, 0x0a, 0xee, 0x98, 0x54, 0x6a, 0x54, 0xce, 0x95, 0x9b, 0x95, 0xea, 0xb9, 0x4a, + 0xa3, 0x5c, 0xc0, 0xe8, 0x17, 0x64, 0x98, 0xa1, 0xac, 0xa9, 0x78, 0xcf, 0xbc, 0x28, 0xd8, 0xeb, + 0x3d, 0x96, 0xd0, 0x58, 0x08, 0x97, 0x10, 0xd1, 0x32, 0x7e, 0x26, 0x81, 0xb1, 0x10, 0x43, 0xee, + 0xf1, 0xd4, 0x5b, 0xed, 0x6b, 0x06, 0x5b, 0x7d, 0x5a, 0x4b, 0xdf, 0xde, 0xea, 0x25, 0x59, 0x00, + 0x5a, 0xc9, 0x73, 0x3a, 0xbe, 0x84, 0xd6, 0x02, 0x4c, 0x38, 0xb5, 0xcd, 0x0c, 0x54, 0x5b, 0xa9, + 0x9f, 0xda, 0xbe, 0x33, 0x3c, 0x66, 0x2d, 0xf0, 0xe8, 0xdd, 0x1c, 0x29, 0x6e, 0x97, 0x93, 0xe8, + 0xd9, 0xa1, 0xa7, 0x28, 0x12, 0x6f, 0x75, 0x5e, 0x03, 0x53, 0xe4, 0xb1, 0xaa, 0xed, 0x60, 0xd6, + 0x86, 0x82, 0x04, 0xe5, 0x2c, 0xcc, 0xd0, 0x8c, 0x2d, 0xd3, 0x70, 0xeb, 0x93, 0x25, 0x19, 0xb8, + 0x34, 0x17, 0xc4, 0x96, 0x85, 0x35, 0xc7, 0xb4, 0x08, 0x8d, 0x1c, 0x05, 0x31, 0x94, 0x84, 0xbe, + 0xea, 0xb7, 0xc2, 0x32, 0xa7, 0x39, 0xb7, 0x25, 0xa9, 0x4a, 0x32, 0xbd, 0xd9, 0x1b, 0xae, 0xfd, + 0xd1, 0x56, 0xd7, 0x74, 0xd1, 0x5e, 0x22, 0x53, 0x3b, 0xac, 0x9c, 0x04, 0x85, 0xa5, 0xba, 0x79, + 0x4b, 0xb5, 0x6a, 0xa3, 0x5c, 0x6d, 0x14, 0x36, 0xfb, 0x6a, 0xd4, 0x16, 0x7a, 0x75, 0x16, 0xb2, + 0xf7, 0x9b, 0xba, 0x81, 0x1e, 0xc9, 0x70, 0x2a, 0x61, 0x60, 0xe7, 0x92, 0x69, 0x5d, 0xf4, 0x1b, + 0x6a, 0x90, 0x10, 0x8f, 0x4d, 0xa0, 0x4a, 0xf2, 0x40, 0x55, 0xca, 0xf6, 0x53, 0xa5, 0x9f, 0x0f, + 0xab, 0xd2, 0x5d, 0xbc, 0x2a, 0xdd, 0xd0, 0x47, 0xfe, 0x2e, 0xf3, 0x11, 0x1d, 0xc0, 0x87, 0xfd, + 0x0e, 0xe0, 0x5e, 0x0e, 0xc6, 0x27, 0x8b, 0x91, 0x49, 0x06, 0xe0, 0xe7, 0x53, 0x6d, 0xf8, 0xfd, + 0xa0, 0xde, 0x8a, 0x80, 0x7a, 0xbb, 0x4f, 0x9f, 0xa0, 0xef, 0xef, 0x3a, 0x1e, 0xda, 0xdf, 0x4d, + 0x5c, 0x54, 0x4e, 0xc0, 0xb1, 0xc5, 0xca, 0xd2, 0x52, 0x59, 0x2d, 0x57, 0x1b, 0xcd, 0x6a, 0xb9, + 0x71, 0xbe, 0xa6, 0x3e, 0x50, 0xe8, 0xa0, 0x57, 0xc9, 0x00, 0xae, 0x84, 0x4a, 0x9a, 0xd1, 0xc2, + 0x1d, 0xb1, 0x1e, 0xfd, 0x7f, 0x49, 0xc9, 0xfa, 0x84, 0x80, 0x7e, 0x04, 0x9c, 0x2f, 0x93, 0xc4, + 0x5b, 0x65, 0x24, 0xb1, 0x64, 0xa0, 0xbe, 0xfe, 0xf1, 0x60, 0x7b, 0x5e, 0x01, 0x47, 0x3d, 0x7a, + 0x2c, 0x7b, 0xff, 0x69, 0xdf, 0x9b, 0xb2, 0x30, 0xc7, 0x60, 0xf1, 0xe6, 0xf1, 0xcf, 0xcf, 0x88, + 0x4c, 0xe4, 0x11, 0x4c, 0xb2, 0x69, 0xbb, 0xd7, 0xbd, 0xfb, 0xef, 0xca, 0x32, 0x4c, 0x77, 0xb1, + 0xb5, 0xa3, 0xdb, 0xb6, 0x6e, 0x1a, 0x74, 0x41, 0x6e, 0xee, 0xf6, 0x27, 0xfa, 0x12, 0x27, 0x6b, + 0x97, 0xf3, 0xeb, 0x9a, 0xe5, 0xe8, 0x2d, 0xbd, 0xab, 0x19, 0xce, 0x7a, 0x90, 0x59, 0x0d, 0xff, + 0x89, 0x5e, 0x9c, 0x70, 0x5a, 0xc3, 0xd7, 0x24, 0x42, 0x25, 0x7e, 0x2f, 0xc1, 0x94, 0x24, 0x96, + 0x60, 0x32, 0xb5, 0xf8, 0x50, 0xaa, 0x6a, 0xd1, 0x07, 0xef, 0x2d, 0xe5, 0x2a, 0x38, 0x51, 0xa9, + 0x96, 0x6a, 0xaa, 0x5a, 0x2e, 0x35, 0x9a, 0xeb, 0x65, 0x75, 0xad, 0x52, 0xaf, 0x57, 0x6a, 0xd5, + 0xfa, 0x41, 0x5a, 0x3b, 0xfa, 0xa8, 0xec, 0x6b, 0xcc, 0x22, 0x6e, 0x75, 0x74, 0x03, 0xa3, 0x7b, + 0x0f, 0xa8, 0x30, 0xfc, 0xaa, 0x8f, 0x38, 0xce, 0xac, 0xfc, 0x08, 0x9c, 0x5f, 0x99, 0x1c, 0xe7, + 0xfe, 0x04, 0xff, 0x03, 0x37, 0xff, 0xc7, 0x64, 0x38, 0x16, 0x6a, 0x88, 0x2a, 0xde, 0x19, 0xd9, + 0x4a, 0xde, 0x4f, 0x84, 0xdb, 0x6e, 0x85, 0xc7, 0xb4, 0x9f, 0x35, 0xbd, 0x8f, 0x8d, 0x08, 0x58, + 0x5f, 0xef, 0xc3, 0xba, 0xca, 0xc1, 0xfa, 0x8c, 0x21, 0x68, 0x26, 0x43, 0xf6, 0x77, 0x52, 0x45, + 0xf6, 0x2a, 0x38, 0xb1, 0x5e, 0x54, 0x1b, 0x95, 0x52, 0x65, 0xbd, 0xe8, 0x8e, 0xa3, 0xa1, 0x21, + 0x3b, 0xc2, 0x5c, 0xe7, 0x41, 0xef, 0x8b, 0xef, 0x7b, 0xb3, 0x70, 0x4d, 0xff, 0x8e, 0xb6, 0xb4, + 0xad, 0x19, 0x5b, 0x18, 0xe9, 0x22, 0x50, 0x2f, 0xc2, 0x44, 0x8b, 0x64, 0xa7, 0x38, 0x87, 0xb7, + 0x6e, 0x62, 0xfa, 0x72, 0x5a, 0x82, 0xea, 0xfd, 0x8a, 0xde, 0x1a, 0x56, 0x88, 0x06, 0xaf, 0x10, + 0xf7, 0xc4, 0x83, 0xb7, 0x8f, 0xef, 0x08, 0xdd, 0xf8, 0x84, 0xaf, 0x1b, 0xe7, 0x39, 0xdd, 0x28, + 0x1d, 0x8c, 0x7c, 0x32, 0x35, 0xf9, 0xe3, 0xc7, 0x43, 0x07, 0x10, 0xa9, 0x4d, 0x7a, 0xf4, 0xa8, + 0xd0, 0xb7, 0xbb, 0x7f, 0x85, 0x0c, 0xf9, 0x45, 0xdc, 0xc1, 0xa2, 0x2b, 0x91, 0x5f, 0x97, 0x44, + 0x37, 0x44, 0x28, 0x0c, 0x94, 0x76, 0xf4, 0xea, 0x88, 0xa3, 0xef, 0x60, 0xdb, 0xd1, 0x76, 0xba, + 0x44, 0xd4, 0xb2, 0x1a, 0x24, 0xa0, 0x9f, 0x94, 0x44, 0xb6, 0x4b, 0x62, 0x8a, 0xf9, 0x8f, 0xb1, + 0xa6, 0xf8, 0x29, 0x09, 0x26, 0xeb, 0xd8, 0xa9, 0x59, 0x6d, 0x6c, 0xa1, 0x7a, 0x80, 0xd1, 0x19, + 0x98, 0x26, 0xa0, 0xb8, 0xd3, 0x4c, 0x1f, 0xa7, 0x70, 0x92, 0x72, 0x03, 0xcc, 0xf9, 0xaf, 0xe4, + 0x77, 0xd6, 0x8d, 0xf7, 0xa4, 0xa2, 0x7f, 0xcc, 0x88, 0xee, 0xe2, 0xb2, 0x25, 0x43, 0xc6, 0x4d, + 0x44, 0x2b, 0x15, 0xdb, 0x91, 0x8d, 0x25, 0x95, 0xfe, 0x46, 0xd7, 0x9b, 0x25, 0x80, 0x0d, 0xc3, + 0xf6, 0xe4, 0xfa, 0xe4, 0x04, 0x72, 0x45, 0xff, 0x9c, 0x49, 0x36, 0x8b, 0x09, 0xca, 0x89, 0x90, + 0xd8, 0x6b, 0x12, 0xac, 0x2d, 0x44, 0x12, 0x4b, 0x5f, 0x66, 0x5f, 0x9a, 0x83, 0xfc, 0x79, 0xad, + 0xd3, 0xc1, 0x0e, 0xfa, 0xb2, 0x04, 0xf9, 0x92, 0x85, 0x35, 0x07, 0x87, 0x45, 0x87, 0x60, 0xd2, + 0x32, 0x4d, 0x67, 0x5d, 0x73, 0xb6, 0x99, 0xdc, 0xfc, 0x77, 0xe6, 0x30, 0xf0, 0xdb, 0xe1, 0xee, + 0xe3, 0x5e, 0x5e, 0x74, 0xdf, 0xcf, 0xd5, 0x96, 0x16, 0x34, 0x4f, 0x0b, 0x89, 0xe8, 0x3f, 0x10, + 0x4c, 0xee, 0x18, 0x78, 0xc7, 0x34, 0xf4, 0x96, 0x67, 0x73, 0x7a, 0xef, 0xe8, 0xfd, 0xbe, 0x4c, + 0x17, 0x38, 0x99, 0xce, 0x0b, 0x97, 0x92, 0x4c, 0xa0, 0xf5, 0x21, 0x7a, 0x8f, 0x6b, 0xe1, 0x6a, + 0xda, 0x19, 0x34, 0x1b, 0xb5, 0x66, 0x49, 0x2d, 0x17, 0x1b, 0xe5, 0xe6, 0x6a, 0xad, 0x54, 0x5c, + 0x6d, 0xaa, 0xe5, 0xf5, 0x5a, 0x01, 0xa3, 0xbf, 0x93, 0x5c, 0xe1, 0xb6, 0xcc, 0x3d, 0x6c, 0xa1, + 0x65, 0x21, 0x39, 0xc7, 0xc9, 0x84, 0x61, 0xf0, 0xf3, 0xc2, 0x4e, 0x1b, 0x4c, 0x3a, 0x8c, 0x83, + 0x08, 0xe5, 0xfd, 0x80, 0x50, 0x73, 0x8f, 0x25, 0xf5, 0x38, 0x90, 0xf4, 0xff, 0x96, 0x60, 0xa2, + 0x64, 0x1a, 0x7b, 0xd8, 0x72, 0xc2, 0xf3, 0x9d, 0xb0, 0x34, 0x33, 0xbc, 0x34, 0xdd, 0x41, 0x12, + 0x1b, 0x8e, 0x65, 0x76, 0xbd, 0x09, 0x8f, 0xf7, 0x8a, 0x5e, 0x9b, 0x54, 0xc2, 0xac, 0xe4, 0xe8, + 0x85, 0xcf, 0xfe, 0x05, 0x71, 0xec, 0xc9, 0x3d, 0x0d, 0xe0, 0x55, 0x49, 0x70, 0xe9, 0xcf, 0x40, + 0xfa, 0x5d, 0xca, 0x17, 0x64, 0x98, 0xa5, 0x8d, 0xaf, 0x8e, 0x89, 0x85, 0x86, 0x6a, 0xe1, 0x25, + 0xc7, 0x1e, 0xe1, 0xaf, 0x1c, 0xe1, 0xc4, 0x9f, 0xd7, 0xba, 0x5d, 0x7f, 0xf9, 0x79, 0xe5, 0x88, + 0xca, 0xde, 0xa9, 0x9a, 0x2f, 0xe4, 0x21, 0xab, 0xed, 0x3a, 0xdb, 0xe8, 0x3b, 0xc2, 0x93, 0x4f, + 0xae, 0x33, 0x60, 0xfc, 0x44, 0x40, 0x72, 0x1c, 0x72, 0x8e, 0x79, 0x11, 0x7b, 0x72, 0xa0, 0x2f, + 0x2e, 0x1c, 0x5a, 0xb7, 0xdb, 0x20, 0x1f, 0x18, 0x1c, 0xde, 0xbb, 0x6b, 0xeb, 0x68, 0xad, 0x96, + 0xb9, 0x6b, 0x38, 0x15, 0x6f, 0x09, 0x3a, 0x48, 0x40, 0x9f, 0xcb, 0x88, 0x4c, 0x66, 0x05, 0x18, + 0x4c, 0x06, 0xd9, 0x85, 0x21, 0x9a, 0xd2, 0x3c, 0xdc, 0x54, 0x5c, 0x5f, 0x6f, 0x36, 0x6a, 0x0f, + 0x94, 0xab, 0x81, 0xe1, 0xd9, 0xac, 0x54, 0x9b, 0x8d, 0x95, 0x72, 0xb3, 0xb4, 0xa1, 0x92, 0x75, + 0xc2, 0x62, 0xa9, 0x54, 0xdb, 0xa8, 0x36, 0x0a, 0x18, 0xbd, 0x41, 0x82, 0x99, 0x52, 0xc7, 0xb4, + 0x7d, 0x84, 0xaf, 0x0d, 0x10, 0xf6, 0xc5, 0x98, 0x09, 0x89, 0x11, 0xfd, 0x5b, 0x46, 0xd4, 0xe9, + 0xc0, 0x13, 0x48, 0x88, 0x7c, 0x44, 0x2f, 0xf5, 0x5a, 0x21, 0xa7, 0x83, 0xc1, 0xf4, 0xd2, 0x6f, + 0x12, 0x9f, 0xbd, 0x07, 0x26, 0x8a, 0x54, 0x31, 0xd0, 0x5f, 0x67, 0x20, 0x5f, 0x32, 0x8d, 0x4d, + 0x7d, 0xcb, 0x35, 0xe6, 0xb0, 0xa1, 0x5d, 0xe8, 0xe0, 0x45, 0xcd, 0xd1, 0xf6, 0x74, 0x7c, 0x89, + 0x54, 0x60, 0x52, 0xed, 0x49, 0x75, 0x99, 0x62, 0x29, 0xf8, 0xc2, 0xee, 0x16, 0x61, 0x6a, 0x52, + 0x0d, 0x27, 0x29, 0xcf, 0x80, 0x2b, 0xe9, 0xeb, 0xba, 0x85, 0x2d, 0xdc, 0xc1, 0x9a, 0x8d, 0xdd, + 0x69, 0x91, 0x81, 0x3b, 0x44, 0x69, 0x27, 0xd5, 0xa8, 0xcf, 0xca, 0x59, 0x98, 0xa1, 0x9f, 0x88, + 0x29, 0x62, 0x13, 0x35, 0x9e, 0x54, 0xb9, 0x34, 0xe5, 0x29, 0x90, 0xc3, 0x0f, 0x3b, 0x96, 0x76, + 0xaa, 0x4d, 0xf0, 0xba, 0x72, 0x9e, 0x7a, 0x1d, 0xce, 0x7b, 0x5e, 0x87, 0xf3, 0x75, 0xe2, 0x93, + 0xa8, 0xd2, 0x5c, 0xe8, 0xa3, 0x93, 0xbe, 0x21, 0xf1, 0x06, 0x39, 0x50, 0x0c, 0x05, 0xb2, 0x86, + 0xb6, 0x83, 0x99, 0x5e, 0x90, 0x67, 0xe5, 0x26, 0x38, 0xaa, 0xed, 0x69, 0x8e, 0x66, 0xad, 0x9a, + 0x2d, 0xad, 0x43, 0x06, 0x3f, 0xaf, 0xe5, 0xf7, 0x7e, 0x20, 0x3b, 0x42, 0x8e, 0x69, 0x61, 0x92, + 0xcb, 0xdb, 0x11, 0xf2, 0x12, 0x5c, 0xea, 0x7a, 0xcb, 0x34, 0x08, 0xff, 0xb2, 0x4a, 0x9e, 0x5d, + 0xa9, 0xb4, 0x75, 0xdb, 0xad, 0x08, 0xa1, 0x52, 0xa5, 0x5b, 0x1b, 0xf5, 0xcb, 0x46, 0x8b, 0xec, + 0x06, 0x4d, 0xaa, 0x51, 0x9f, 0x95, 0x05, 0x98, 0x66, 0x1b, 0x21, 0x6b, 0xae, 0x5e, 0xe5, 0x89, + 0x5e, 0x9d, 0xe1, 0x7d, 0xba, 0x28, 0x9e, 0xf3, 0xd5, 0x20, 0x9f, 0x1a, 0xfe, 0x49, 0xb9, 0x0f, + 0xae, 0x66, 0xaf, 0xa5, 0x5d, 0xdb, 0x31, 0x77, 0x28, 0xe8, 0x4b, 0x7a, 0x87, 0xd6, 0x60, 0x82, + 0xd4, 0x20, 0x2e, 0x8b, 0x72, 0x3b, 0x1c, 0xef, 0x5a, 0x78, 0x13, 0x5b, 0x0f, 0x6a, 0x3b, 0xbb, + 0x0f, 0x37, 0x2c, 0xcd, 0xb0, 0xbb, 0xa6, 0xe5, 0x9c, 0x9a, 0x24, 0xcc, 0xf7, 0xfd, 0xa6, 0xdc, + 0x0c, 0xc7, 0x1e, 0xb2, 0x4d, 0xa3, 0xd8, 0xd5, 0x57, 0x75, 0xdb, 0xc1, 0x46, 0xb1, 0xdd, 0xb6, + 0x4e, 0x4d, 0x91, 0xb2, 0xf6, 0x7f, 0x60, 0xdd, 0xea, 0x24, 0xe4, 0xa9, 0xb0, 0xd1, 0x8b, 0x72, + 0xc2, 0xce, 0x9f, 0xac, 0xfa, 0xb1, 0xc6, 0xdc, 0xad, 0x30, 0xc1, 0xfa, 0x43, 0x02, 0xeb, 0xf4, + 0xed, 0x27, 0x7b, 0x56, 0x21, 0x18, 0x15, 0xd5, 0xcb, 0xa6, 0x3c, 0x15, 0xf2, 0x2d, 0x22, 0x04, + 0x82, 0xf0, 0xf4, 0xed, 0x57, 0xf7, 0x2f, 0x94, 0x64, 0x51, 0x59, 0x56, 0xf4, 0x17, 0xb2, 0x90, + 0xbf, 0x68, 0x1c, 0xc7, 0xc9, 0xfa, 0x80, 0xaf, 0x4a, 0x43, 0x74, 0xb2, 0x37, 0xc3, 0x8d, 0xac, + 0x07, 0x65, 0xd6, 0xca, 0x62, 0x73, 0x61, 0xc3, 0x9b, 0x3a, 0xba, 0x36, 0x4c, 0xbd, 0x51, 0x54, + 0xdd, 0x79, 0xff, 0xa2, 0x3b, 0xe5, 0xbc, 0x09, 0x6e, 0x18, 0x90, 0xbb, 0xdc, 0x68, 0x56, 0x8b, + 0x6b, 0xe5, 0xc2, 0x26, 0x6f, 0x09, 0xd5, 0x1b, 0xb5, 0xf5, 0xa6, 0xba, 0x51, 0xad, 0x56, 0xaa, + 0xcb, 0x94, 0x98, 0x6b, 0x40, 0x9e, 0x0c, 0x32, 0x9c, 0x57, 0x2b, 0x8d, 0x72, 0xb3, 0x54, 0xab, + 0x2e, 0x55, 0x96, 0x0b, 0xfa, 0x20, 0x33, 0xea, 0x21, 0xe5, 0x0c, 0x5c, 0xc3, 0x71, 0x52, 0xa9, + 0x55, 0xdd, 0x79, 0x70, 0xa9, 0x58, 0x2d, 0x95, 0xdd, 0x49, 0xef, 0x45, 0x05, 0xc1, 0x09, 0x4a, + 0xae, 0xb9, 0x54, 0x59, 0x0d, 0x6f, 0x5d, 0x7d, 0x24, 0xa3, 0x9c, 0x82, 0x2b, 0xc2, 0xdf, 0x2a, + 0xd5, 0x73, 0xc5, 0xd5, 0xca, 0x62, 0xe1, 0x8f, 0x32, 0xca, 0xf5, 0x70, 0x2d, 0xf7, 0x17, 0xdd, + 0x85, 0x6a, 0x56, 0x16, 0x9b, 0x6b, 0x95, 0xfa, 0x5a, 0xb1, 0x51, 0x5a, 0x29, 0x7c, 0x94, 0xcc, + 0x2e, 0x7c, 0x73, 0x39, 0xe4, 0xc4, 0xf9, 0x92, 0xb0, 0x05, 0x50, 0xe4, 0x15, 0xf5, 0xc9, 0x7d, + 0x61, 0x8f, 0xb7, 0x78, 0x3f, 0xe4, 0x8f, 0x25, 0x8b, 0x9c, 0x0a, 0xdd, 0x9a, 0x80, 0x56, 0x32, + 0x1d, 0x6a, 0x0c, 0xa1, 0x42, 0x67, 0xe0, 0x9a, 0x6a, 0x99, 0x22, 0xa5, 0x96, 0x4b, 0xb5, 0x73, + 0x65, 0xb5, 0x79, 0xbe, 0xb8, 0xba, 0x5a, 0x6e, 0x34, 0x97, 0x2a, 0x6a, 0xbd, 0x51, 0xd8, 0x44, + 0xff, 0x2c, 0xf9, 0x6b, 0x3f, 0x21, 0x69, 0xfd, 0xb5, 0x94, 0xb4, 0x59, 0xc7, 0xae, 0xf1, 0xfc, + 0x00, 0xe4, 0x6d, 0x47, 0x73, 0x76, 0x6d, 0xd6, 0xaa, 0x9f, 0xd0, 0xbf, 0x55, 0xcf, 0xd7, 0x49, + 0x26, 0x95, 0x65, 0x46, 0x7f, 0x91, 0x49, 0xd2, 0x4c, 0x47, 0xb0, 0xfc, 0xa3, 0x0f, 0x21, 0xe2, + 0xd3, 0x80, 0x3c, 0x6d, 0xaf, 0xd4, 0x9b, 0xc5, 0x55, 0xb5, 0x5c, 0x5c, 0x7c, 0xd0, 0x5f, 0xf4, + 0xc1, 0xca, 0x09, 0x38, 0xb6, 0x51, 0x2d, 0x2e, 0xac, 0x96, 0x49, 0x73, 0xa9, 0x55, 0xab, 0xe5, + 0x92, 0x2b, 0xf7, 0x9f, 0x24, 0x5b, 0x2c, 0xae, 0xbd, 0x4d, 0xf8, 0x76, 0x6d, 0xa2, 0x90, 0xfc, + 0xbf, 0x22, 0xec, 0x89, 0x14, 0x68, 0x58, 0x98, 0xd6, 0x68, 0x71, 0xf8, 0x9c, 0x90, 0xf3, 0x91, + 0x10, 0x27, 0xc9, 0xf0, 0xf8, 0xcf, 0x43, 0xe0, 0x71, 0x02, 0x8e, 0x85, 0xf1, 0x20, 0x4e, 0x48, + 0xd1, 0x30, 0xbc, 0x68, 0x0a, 0xf2, 0x75, 0xdc, 0xc1, 0x2d, 0x07, 0x3d, 0x26, 0x05, 0xa6, 0xc7, + 0x1c, 0x48, 0xbe, 0xd3, 0x8b, 0xa4, 0xb7, 0xb9, 0xc9, 0xb6, 0xd4, 0x33, 0xd9, 0x8e, 0x31, 0x1a, + 0xe4, 0x44, 0x46, 0x43, 0x36, 0x05, 0xa3, 0x21, 0x37, 0xbc, 0xd1, 0x90, 0x4f, 0x6a, 0x34, 0x4c, + 0xc4, 0x1a, 0x0d, 0xe8, 0x35, 0xf9, 0xa4, 0x7d, 0x0a, 0x05, 0xe6, 0x70, 0x4d, 0x85, 0xff, 0x95, + 0x4d, 0xd2, 0x07, 0xf5, 0xe5, 0x38, 0x99, 0xce, 0x7f, 0x47, 0x4e, 0x61, 0x69, 0x43, 0xb9, 0x0e, + 0xae, 0x0d, 0xde, 0x9b, 0xe5, 0x67, 0x55, 0xea, 0x8d, 0x3a, 0xb1, 0x0f, 0x4a, 0x35, 0x55, 0xdd, + 0x58, 0xa7, 0xeb, 0xd3, 0x27, 0x41, 0x09, 0xa8, 0xa8, 0x1b, 0x55, 0x6a, 0x0d, 0x6c, 0xf1, 0xd4, + 0x97, 0x2a, 0xd5, 0xc5, 0xa6, 0xdf, 0xc2, 0xaa, 0x4b, 0xb5, 0xc2, 0xb6, 0x3b, 0x1d, 0x0c, 0x51, + 0x77, 0x87, 0x73, 0x56, 0x42, 0xb1, 0xba, 0xd8, 0x5c, 0xab, 0x96, 0xd7, 0x6a, 0xd5, 0x4a, 0x89, + 0xa4, 0xd7, 0xcb, 0x8d, 0x82, 0xee, 0x0e, 0x4b, 0x3d, 0xf6, 0x47, 0xbd, 0x5c, 0x54, 0x4b, 0x2b, + 0x65, 0x95, 0x16, 0xf9, 0x90, 0x72, 0x03, 0x9c, 0x2d, 0x56, 0x6b, 0x0d, 0x37, 0xa5, 0x58, 0x7d, + 0xb0, 0xf1, 0xe0, 0x7a, 0xb9, 0xb9, 0xae, 0xd6, 0x4a, 0xe5, 0x7a, 0xdd, 0x6d, 0xd5, 0xcc, 0x5a, + 0x29, 0x74, 0x94, 0x7b, 0xe0, 0xce, 0x10, 0x6b, 0xe5, 0x06, 0xd9, 0x0c, 0x5d, 0xab, 0x11, 0x7f, + 0x98, 0xc5, 0x72, 0x73, 0xa5, 0x58, 0x6f, 0x56, 0xaa, 0xa5, 0xda, 0xda, 0x7a, 0xb1, 0x51, 0x71, + 0x1b, 0xff, 0xba, 0x5a, 0x6b, 0xd4, 0x9a, 0xe7, 0xca, 0x6a, 0xbd, 0x52, 0xab, 0x16, 0x0c, 0xb7, + 0xca, 0xa1, 0xde, 0xc2, 0xeb, 0xb5, 0x4d, 0xe5, 0x1a, 0x38, 0xe5, 0xa5, 0xaf, 0xd6, 0x5c, 0x41, + 0x87, 0xec, 0x97, 0x6e, 0xaa, 0xf6, 0xcb, 0xbf, 0x4a, 0x90, 0xad, 0x3b, 0x66, 0x17, 0x7d, 0x7f, + 0xd0, 0x1d, 0x9d, 0x06, 0xb0, 0xc8, 0xde, 0xa6, 0x3b, 0xc3, 0x63, 0x73, 0xbe, 0x50, 0x0a, 0xfa, + 0x43, 0xe1, 0x0d, 0x99, 0xa0, 0x87, 0x37, 0xbb, 0x11, 0x96, 0xcd, 0xb7, 0xc4, 0x4e, 0xa8, 0x44, + 0x13, 0x4a, 0xa6, 0xef, 0x3f, 0x33, 0xcc, 0x96, 0x0b, 0x82, 0x93, 0x21, 0xd8, 0x5c, 0xf9, 0x7b, + 0x2a, 0x81, 0x95, 0x2b, 0xe1, 0x8a, 0x1e, 0xe5, 0x22, 0x3a, 0xb5, 0xa9, 0x7c, 0x1f, 0x3c, 0x21, + 0xa4, 0xde, 0xe5, 0xb5, 0xda, 0xb9, 0xb2, 0xaf, 0xc8, 0x8b, 0xc5, 0x46, 0xb1, 0xb0, 0x85, 0x3e, + 0x25, 0x43, 0x76, 0xcd, 0xdc, 0xeb, 0xdd, 0x07, 0x33, 0xf0, 0xa5, 0xd0, 0x3a, 0xab, 0xf7, 0xca, + 0x7b, 0xe4, 0x0b, 0x89, 0x7d, 0x2d, 0x7a, 0xcf, 0xfb, 0x73, 0x52, 0x12, 0xb1, 0xaf, 0x1d, 0x74, + 0xa3, 0xfb, 0xef, 0x87, 0x11, 0x7b, 0x84, 0x68, 0xb1, 0x72, 0x16, 0x4e, 0x07, 0x1f, 0x2a, 0x8b, + 0xe5, 0x6a, 0xa3, 0xb2, 0xf4, 0x60, 0x20, 0xdc, 0x8a, 0x2a, 0x24, 0xfe, 0x41, 0xdd, 0x58, 0xfc, + 0xbc, 0xe4, 0x14, 0x1c, 0x0f, 0xbe, 0x2d, 0x97, 0x1b, 0xde, 0x97, 0x87, 0xd0, 0x23, 0x39, 0x98, + 0xa1, 0xdd, 0xfa, 0x46, 0xb7, 0xad, 0x39, 0x18, 0x3d, 0x35, 0x40, 0xf7, 0x46, 0x38, 0x5a, 0x59, + 0x5f, 0xaa, 0xd7, 0x1d, 0xd3, 0xd2, 0xb6, 0x30, 0x19, 0xc7, 0xa8, 0xb4, 0x7a, 0x93, 0xd1, 0xdb, + 0x85, 0xd7, 0x10, 0xf9, 0xa1, 0x84, 0x96, 0x19, 0x81, 0xfa, 0x17, 0x84, 0xd6, 0xfc, 0x04, 0x08, + 0x26, 0x43, 0xff, 0xa1, 0x11, 0xb7, 0xb9, 0x68, 0x5c, 0x36, 0xcf, 0x3e, 0x4f, 0x82, 0xa9, 0x86, + 0xbe, 0x83, 0x9f, 0x6d, 0x1a, 0xd8, 0x56, 0x26, 0x40, 0x5e, 0x5e, 0x6b, 0x14, 0x8e, 0xb8, 0x0f, + 0xae, 0x09, 0x96, 0x21, 0x0f, 0x65, 0xb7, 0x00, 0xf7, 0xa1, 0xd8, 0x28, 0xc8, 0xee, 0xc3, 0x5a, + 0xb9, 0x51, 0xc8, 0xba, 0x0f, 0xd5, 0x72, 0xa3, 0x90, 0x73, 0x1f, 0xd6, 0x57, 0x1b, 0x85, 0xbc, + 0xfb, 0x50, 0xa9, 0x37, 0x0a, 0x13, 0xee, 0xc3, 0x42, 0xbd, 0x51, 0x98, 0x74, 0x1f, 0xce, 0xd5, + 0x1b, 0x85, 0x29, 0xf7, 0xa1, 0xd4, 0x68, 0x14, 0xc0, 0x7d, 0xb8, 0xbf, 0xde, 0x28, 0x4c, 0xbb, + 0x0f, 0xc5, 0x52, 0xa3, 0x30, 0x43, 0x1e, 0xca, 0x8d, 0xc2, 0xac, 0xfb, 0x50, 0xaf, 0x37, 0x0a, + 0x73, 0x84, 0x72, 0xbd, 0x51, 0x38, 0x4a, 0xca, 0xaa, 0x34, 0x0a, 0x05, 0xf7, 0x61, 0xa5, 0xde, + 0x28, 0x1c, 0x23, 0x99, 0xeb, 0x8d, 0x82, 0x42, 0x0a, 0xad, 0x37, 0x0a, 0x57, 0x90, 0x3c, 0xf5, + 0x46, 0xe1, 0x38, 0x29, 0xa2, 0xde, 0x28, 0x9c, 0x20, 0x6c, 0x94, 0x1b, 0x85, 0x93, 0x24, 0x8f, + 0xda, 0x28, 0x5c, 0x49, 0x3e, 0x55, 0x1b, 0x85, 0x53, 0x84, 0xb1, 0x72, 0xa3, 0x70, 0x15, 0x79, + 0x50, 0x1b, 0x05, 0x44, 0x3e, 0x15, 0x1b, 0x85, 0xab, 0xd1, 0x13, 0x60, 0x6a, 0x19, 0x3b, 0x14, + 0x44, 0x54, 0x00, 0x79, 0x19, 0x3b, 0x61, 0xa3, 0xff, 0x4b, 0x32, 0x5c, 0xc9, 0x26, 0x8a, 0x4b, + 0x96, 0xb9, 0xb3, 0x8a, 0xb7, 0xb4, 0xd6, 0xe5, 0xf2, 0xc3, 0xae, 0xc1, 0x15, 0xde, 0xf3, 0x55, + 0x20, 0xdb, 0x0d, 0x3a, 0x23, 0xf2, 0x1c, 0x6b, 0x9f, 0x7a, 0x0b, 0x5d, 0x72, 0xb0, 0xd0, 0xc5, + 0x2c, 0xb2, 0x7f, 0x0a, 0x6b, 0x34, 0xb7, 0x36, 0x9d, 0xe9, 0x59, 0x9b, 0x76, 0x9b, 0x49, 0x17, + 0x5b, 0xb6, 0x69, 0x68, 0x9d, 0x3a, 0x73, 0x0a, 0xa0, 0x2b, 0x6a, 0xbd, 0xc9, 0xca, 0x0f, 0x79, + 0x2d, 0x83, 0x5a, 0x65, 0xcf, 0x8c, 0x9b, 0x0f, 0xf7, 0x56, 0x33, 0xa2, 0x91, 0x7c, 0xd4, 0x6f, + 0x24, 0x0d, 0xae, 0x91, 0xdc, 0x77, 0x00, 0xda, 0xc9, 0xda, 0x4b, 0x65, 0xb8, 0x89, 0x48, 0xe0, + 0x32, 0xeb, 0x2d, 0x85, 0xcb, 0xe8, 0x53, 0x12, 0x9c, 0x2c, 0x1b, 0xfd, 0xe6, 0x03, 0x61, 0x5d, + 0x78, 0x43, 0x18, 0x9a, 0x75, 0x5e, 0xa4, 0x77, 0xf6, 0xad, 0x76, 0x7f, 0x9a, 0x11, 0x12, 0xfd, + 0xb8, 0x2f, 0xd1, 0x3a, 0x27, 0xd1, 0x7b, 0x87, 0x27, 0x9d, 0x4c, 0xa0, 0xd5, 0x91, 0x76, 0x40, + 0x59, 0xf4, 0x65, 0x09, 0x8e, 0x51, 0xbf, 0x9e, 0xfb, 0xe9, 0xf4, 0x83, 0x74, 0xd9, 0xbc, 0x09, + 0xd5, 0x09, 0xa6, 0x2a, 0x54, 0xbf, 0x43, 0x29, 0xe8, 0xd5, 0x61, 0x81, 0x3f, 0xc0, 0x0b, 0x3c, + 0xa2, 0x33, 0xee, 0x2d, 0x2e, 0x42, 0xd6, 0x7f, 0xe4, 0xcb, 0xba, 0xca, 0xc9, 0xfa, 0xce, 0xa1, + 0xa8, 0x1e, 0xae, 0x98, 0xbf, 0x9a, 0x85, 0x27, 0x50, 0x0e, 0x99, 0x22, 0xd0, 0xce, 0xac, 0x68, + 0xb4, 0x55, 0x6c, 0x3b, 0x9a, 0xe5, 0x70, 0x47, 0xda, 0x7b, 0xe6, 0xb7, 0x99, 0x14, 0xe6, 0xb7, + 0xd2, 0xc0, 0xf9, 0x2d, 0x7a, 0x5b, 0xd8, 0x4a, 0x3b, 0xcf, 0x23, 0x5b, 0x8c, 0xc1, 0x20, 0xa2, + 0x86, 0x51, 0x2d, 0xca, 0x37, 0xdf, 0x7e, 0x98, 0x43, 0x79, 0xe9, 0xc0, 0x25, 0x24, 0x43, 0xfc, + 0x0f, 0x47, 0x6b, 0x4e, 0x67, 0xc3, 0xdf, 0x78, 0xdb, 0xaf, 0xd0, 0x4e, 0x75, 0x1e, 0xf4, 0xe2, + 0x49, 0x98, 0x22, 0x5d, 0xce, 0xaa, 0x6e, 0x5c, 0x74, 0xc7, 0xc6, 0x99, 0x2a, 0xbe, 0x54, 0xda, + 0xd6, 0x3a, 0x1d, 0x6c, 0x6c, 0x61, 0xf4, 0x10, 0x67, 0xa0, 0x6b, 0xdd, 0x6e, 0x35, 0xd8, 0x2a, + 0xf2, 0x5e, 0x95, 0x7b, 0x21, 0x67, 0xb7, 0xcc, 0x2e, 0x26, 0x82, 0x9a, 0x0b, 0x39, 0x97, 0xf0, + 0xcb, 0x5d, 0xc5, 0x5d, 0x67, 0x7b, 0x9e, 0x94, 0x55, 0xec, 0xea, 0x75, 0xf7, 0x07, 0x95, 0xfe, + 0xc7, 0xc6, 0xc9, 0xaf, 0xf4, 0xed, 0x8c, 0x33, 0x31, 0x9d, 0xb1, 0xcf, 0xf8, 0x7c, 0x98, 0xe9, + 0x88, 0x95, 0x8c, 0x33, 0x30, 0xdd, 0xf2, 0xb2, 0xf8, 0x67, 0x67, 0xc2, 0x49, 0xe8, 0x6f, 0x13, + 0x75, 0xd7, 0x42, 0x85, 0x27, 0xd3, 0x2a, 0x3c, 0x62, 0x7b, 0xf1, 0x04, 0x1c, 0x6b, 0xd4, 0x6a, + 0xcd, 0xb5, 0x62, 0xf5, 0xc1, 0xe0, 0xcc, 0xfa, 0x26, 0x7a, 0x59, 0x16, 0xe6, 0xea, 0x66, 0x67, + 0x0f, 0x07, 0x38, 0x57, 0x38, 0xa7, 0xac, 0xb0, 0x9c, 0x32, 0xfb, 0xe4, 0xa4, 0x9c, 0x84, 0xbc, + 0x66, 0xd8, 0x97, 0xb0, 0x67, 0xc3, 0xb3, 0x37, 0x06, 0xe3, 0x7b, 0xc3, 0x1d, 0x81, 0xca, 0xc3, + 0x78, 0xd7, 0x00, 0x49, 0xf2, 0x5c, 0x45, 0x00, 0x79, 0x16, 0x66, 0x6c, 0xba, 0x61, 0xdc, 0x08, + 0xf9, 0x05, 0x70, 0x69, 0x84, 0x45, 0xea, 0xb1, 0x20, 0x33, 0x16, 0xc9, 0x1b, 0x7a, 0x95, 0xdf, + 0x7f, 0x6c, 0x70, 0x10, 0x17, 0x0f, 0xc2, 0x58, 0x32, 0x90, 0x5f, 0x31, 0xea, 0x99, 0xf8, 0x29, + 0x38, 0xce, 0x9a, 0x7d, 0xb3, 0xb4, 0x52, 0x5c, 0x5d, 0x2d, 0x57, 0x97, 0xcb, 0xcd, 0xca, 0x22, + 0xdd, 0x80, 0x0a, 0x52, 0x8a, 0x8d, 0x46, 0x79, 0x6d, 0xbd, 0x51, 0x6f, 0x96, 0x9f, 0x55, 0x2a, + 0x97, 0x17, 0x89, 0x5b, 0x24, 0x39, 0xd7, 0xe4, 0x39, 0xb0, 0x16, 0xab, 0xf5, 0xf3, 0x65, 0xb5, + 0xb0, 0x7d, 0xb6, 0x08, 0xd3, 0xa1, 0x81, 0xc2, 0xe5, 0x6e, 0x11, 0x6f, 0x6a, 0xbb, 0x1d, 0x66, + 0x53, 0x17, 0x8e, 0xb8, 0xdc, 0x11, 0xd9, 0xd4, 0x8c, 0xce, 0xe5, 0x42, 0x46, 0x29, 0xc0, 0x4c, + 0x78, 0x4c, 0x28, 0x48, 0xe8, 0xcd, 0xd7, 0xc0, 0xd4, 0x79, 0xd3, 0xba, 0x48, 0x7c, 0xf9, 0xd0, + 0xbb, 0x68, 0x6c, 0x1b, 0xef, 0x94, 0x70, 0xc8, 0x00, 0x7b, 0x85, 0xb8, 0xc7, 0x88, 0x47, 0x6d, + 0x7e, 0xe0, 0x49, 0xe0, 0x33, 0x30, 0x7d, 0xc9, 0xcb, 0x1d, 0xb4, 0xf4, 0x50, 0x12, 0xfa, 0xef, + 0x62, 0x3e, 0x20, 0x83, 0x8b, 0x4c, 0xdf, 0x47, 0xe1, 0x4d, 0x12, 0xe4, 0x97, 0xb1, 0x53, 0xec, + 0x74, 0xc2, 0x72, 0x7b, 0xa9, 0xf0, 0xe9, 0x2e, 0xae, 0x12, 0xc5, 0x4e, 0x27, 0xba, 0x51, 0x85, + 0x04, 0xe4, 0x9d, 0x42, 0xe0, 0xd2, 0x04, 0x7d, 0x27, 0x07, 0x14, 0x98, 0xbe, 0xc4, 0xde, 0x2f, + 0xfb, 0x7e, 0x0e, 0x8f, 0x86, 0xcc, 0xa4, 0xdb, 0x82, 0xb8, 0x46, 0x99, 0x78, 0x7f, 0x09, 0x2f, + 0x9f, 0xf2, 0x00, 0x4c, 0xec, 0xda, 0xb8, 0xa4, 0xd9, 0xde, 0xd0, 0xc6, 0xd7, 0xb4, 0x76, 0xe1, + 0x21, 0xdc, 0x72, 0xe6, 0x2b, 0x3b, 0xee, 0xc4, 0x67, 0x83, 0x66, 0xf4, 0x43, 0x05, 0xb1, 0x77, + 0xd5, 0xa3, 0xe0, 0x4e, 0x1e, 0x2f, 0xe9, 0xce, 0x76, 0x69, 0x5b, 0x73, 0xd8, 0x8e, 0x85, 0xff, + 0x8e, 0x5e, 0x34, 0x04, 0x9c, 0xb1, 0x3b, 0xfc, 0x91, 0x87, 0x44, 0x13, 0x83, 0x38, 0x82, 0x6d, + 0xf9, 0x61, 0x40, 0xfc, 0x07, 0x09, 0xb2, 0xb5, 0x2e, 0x36, 0x84, 0x4f, 0x44, 0xf9, 0xb2, 0x95, + 0x7a, 0x64, 0xfb, 0x2a, 0x71, 0x0f, 0x41, 0xbf, 0xd2, 0x6e, 0xc9, 0x11, 0x92, 0xbd, 0x05, 0xb2, + 0xba, 0xb1, 0x69, 0x32, 0xcb, 0xf6, 0xea, 0x08, 0x5b, 0xa7, 0x62, 0x6c, 0x9a, 0x2a, 0xc9, 0x28, + 0xea, 0x1c, 0x18, 0x57, 0x76, 0xfa, 0xe2, 0xfe, 0xda, 0x24, 0xe4, 0xa9, 0x3a, 0xa3, 0x97, 0xc8, + 0x20, 0x17, 0xdb, 0xed, 0x08, 0xc1, 0x4b, 0xfb, 0x04, 0x6f, 0x92, 0xdf, 0x7c, 0x4c, 0xfc, 0x77, + 0x3e, 0xa0, 0x8d, 0x60, 0xdf, 0xce, 0x9a, 0x54, 0xb1, 0xdd, 0x8e, 0xf6, 0x43, 0xf6, 0x0b, 0x94, + 0xf8, 0x02, 0xc3, 0x2d, 0x5c, 0x16, 0x6b, 0xe1, 0x89, 0x07, 0x82, 0x48, 0xfe, 0xd2, 0x87, 0xe8, + 0x9f, 0x24, 0x98, 0x58, 0xd5, 0x6d, 0xc7, 0xc5, 0xa6, 0x28, 0x82, 0xcd, 0x35, 0x30, 0xe5, 0x89, + 0xc6, 0xed, 0xf2, 0xdc, 0xfe, 0x3c, 0x48, 0xe0, 0x67, 0xe2, 0xf7, 0xf3, 0xe8, 0x3c, 0x2d, 0xbe, + 0xf6, 0x8c, 0x8b, 0xe8, 0x93, 0x26, 0x41, 0xb1, 0x52, 0x6f, 0xb1, 0xbf, 0xed, 0x0b, 0x7c, 0x8d, + 0x13, 0xf8, 0x1d, 0xc3, 0x14, 0x99, 0xbe, 0xd0, 0x3f, 0x2d, 0x01, 0xb8, 0x65, 0xb3, 0xe3, 0x7c, + 0x4f, 0xe2, 0x0e, 0xe9, 0xc7, 0x48, 0xf7, 0x65, 0x61, 0xe9, 0xae, 0xf1, 0xd2, 0xfd, 0xc1, 0xc1, + 0x55, 0x8d, 0x3b, 0xb6, 0xa7, 0x14, 0x40, 0xd6, 0x7d, 0xd1, 0xba, 0x8f, 0xe8, 0x4d, 0xbe, 0x50, + 0xd7, 0x39, 0xa1, 0xde, 0x35, 0x64, 0x49, 0xe9, 0xcb, 0xf5, 0x2f, 0x25, 0x98, 0xa8, 0x63, 0xc7, + 0xed, 0x26, 0xd1, 0x39, 0x91, 0x1e, 0x3e, 0xd4, 0xb6, 0x25, 0xc1, 0xb6, 0xfd, 0xcd, 0x8c, 0x68, + 0xb0, 0x9f, 0x40, 0x32, 0x8c, 0xa7, 0x88, 0xd5, 0x87, 0x47, 0x85, 0x82, 0xfd, 0x0c, 0xa2, 0x96, + 0xbe, 0x74, 0xdf, 0x20, 0xf9, 0xee, 0x16, 0xfc, 0x69, 0x9b, 0xb0, 0x59, 0x9c, 0xd9, 0x6f, 0x16, + 0x8b, 0x9f, 0xb6, 0x09, 0xd7, 0x31, 0xda, 0x7b, 0x20, 0xb1, 0xb1, 0x31, 0x82, 0x8d, 0xfd, 0x61, + 0xe4, 0xf5, 0x5c, 0x19, 0xf2, 0x6c, 0x07, 0xe0, 0xde, 0xf8, 0x1d, 0x80, 0xc1, 0x53, 0x8b, 0x77, + 0x0e, 0x61, 0xca, 0xc5, 0x2d, 0xcb, 0xfb, 0x6c, 0x48, 0x21, 0x36, 0x6e, 0x86, 0x1c, 0x89, 0x46, + 0xca, 0xc6, 0xb9, 0xc0, 0x27, 0xc3, 0x23, 0x51, 0x76, 0xbf, 0xaa, 0x34, 0x53, 0x62, 0x14, 0x46, + 0xb0, 0x92, 0x3f, 0x0c, 0x0a, 0x6f, 0x57, 0x00, 0xd6, 0x77, 0x2f, 0x74, 0x74, 0x7b, 0x5b, 0x37, + 0xb6, 0xd0, 0xbf, 0x67, 0x60, 0x86, 0xbd, 0xd2, 0xa0, 0x9a, 0xb1, 0xe6, 0x5f, 0xa4, 0x51, 0x50, + 0x00, 0x79, 0xd7, 0xd2, 0xd9, 0x32, 0x80, 0xfb, 0xa8, 0xdc, 0xed, 0xbb, 0x67, 0x65, 0x7b, 0xc2, + 0x29, 0xb8, 0x62, 0x08, 0x38, 0x98, 0x0f, 0x95, 0x1e, 0xb8, 0x69, 0x85, 0x23, 0xa7, 0xe6, 0xf8, + 0xc8, 0xa9, 0xdc, 0x19, 0xcb, 0x7c, 0xcf, 0x19, 0x4b, 0x17, 0x47, 0x5b, 0x7f, 0x36, 0x26, 0xfe, + 0x3b, 0xb2, 0x4a, 0x9e, 0xdd, 0x3f, 0x1e, 0x32, 0x75, 0x83, 0x6c, 0xea, 0x30, 0xf7, 0xe1, 0x20, + 0x01, 0xbd, 0x2f, 0x98, 0xc8, 0x98, 0x82, 0x56, 0x70, 0x02, 0x31, 0x70, 0x65, 0x67, 0x7b, 0xcb, + 0xfe, 0xa0, 0x70, 0xa4, 0xb4, 0x90, 0xc0, 0x62, 0xa7, 0x24, 0x8c, 0x03, 0xc9, 0xe7, 0x20, 0xb4, + 0x2b, 0x1b, 0xd7, 0x9d, 0x0e, 0xa2, 0x9f, 0x4c, 0x31, 0x77, 0x86, 0x58, 0x7c, 0x51, 0x60, 0xce, + 0x3b, 0x79, 0x5a, 0x5b, 0xb8, 0xbf, 0x5c, 0x6a, 0x14, 0xf0, 0xfe, 0xd3, 0xa8, 0xe4, 0xdc, 0x29, + 0x3d, 0x63, 0x1a, 0x2c, 0xb0, 0xa0, 0xff, 0x29, 0x41, 0x9e, 0xd9, 0x0e, 0xf7, 0x1e, 0x10, 0x42, + 0xf4, 0xf2, 0x61, 0x20, 0x89, 0x0d, 0x00, 0xf0, 0xb1, 0xa4, 0x00, 0x8c, 0xc0, 0x5a, 0x78, 0x30, + 0x35, 0x00, 0xd0, 0xbf, 0x48, 0x90, 0x75, 0x6d, 0x1a, 0xb1, 0xe3, 0xd5, 0x1f, 0x15, 0x76, 0x55, + 0x0e, 0x09, 0xc0, 0x25, 0x1f, 0xa1, 0xdf, 0x0b, 0x30, 0xd5, 0xa5, 0x19, 0xfd, 0xc3, 0xfd, 0xd7, + 0x0b, 0xf4, 0x2c, 0x58, 0x0d, 0x7e, 0x43, 0xef, 0x10, 0x72, 0x77, 0x8e, 0xe7, 0x27, 0x19, 0x1c, + 0xe5, 0x51, 0x9c, 0xc4, 0xde, 0x44, 0xdf, 0x96, 0x00, 0x54, 0x6c, 0x9b, 0x9d, 0x3d, 0xbc, 0x61, + 0xe9, 0xe8, 0xea, 0x00, 0x00, 0xd6, 0xec, 0x33, 0x41, 0xb3, 0xff, 0x44, 0x58, 0xf0, 0xcb, 0xbc, + 0xe0, 0x6f, 0x8b, 0xd6, 0x3c, 0x8f, 0x78, 0x84, 0xf8, 0xef, 0x81, 0x09, 0x26, 0x47, 0x66, 0x20, + 0x8a, 0x09, 0xdf, 0xfb, 0x09, 0xbd, 0xdb, 0x17, 0xfd, 0xfd, 0x9c, 0xe8, 0x9f, 0x9e, 0x98, 0xa3, + 0x64, 0x00, 0x94, 0x86, 0x00, 0xe0, 0x28, 0x4c, 0x7b, 0x00, 0x6c, 0xa8, 0x95, 0x02, 0x46, 0x6f, + 0x95, 0x89, 0xcf, 0x03, 0x1d, 0xa9, 0x0e, 0xde, 0xd3, 0x7c, 0x59, 0x78, 0xe6, 0x1e, 0x92, 0x87, + 0x5f, 0x7e, 0x4a, 0x00, 0xfd, 0xa9, 0xd0, 0x54, 0x5d, 0x80, 0xa1, 0xc7, 0x4b, 0x7f, 0x75, 0xb6, + 0x0c, 0xb3, 0x9c, 0x89, 0xa1, 0x9c, 0x82, 0xe3, 0x5c, 0x02, 0x1d, 0xef, 0xda, 0x85, 0x23, 0x0a, + 0x82, 0x93, 0xdc, 0x17, 0xf6, 0x82, 0xdb, 0x85, 0x0c, 0xfa, 0xc0, 0x67, 0x32, 0xfe, 0xe2, 0xcd, + 0x3b, 0xb3, 0x6c, 0xd9, 0xec, 0xc3, 0x7c, 0x3c, 0xb9, 0x96, 0x69, 0x38, 0xf8, 0xe1, 0x90, 0xcf, + 0x89, 0x9f, 0x10, 0x6b, 0x35, 0x9c, 0x82, 0x09, 0xc7, 0x0a, 0xfb, 0xa1, 0x78, 0xaf, 0x61, 0xc5, + 0xca, 0xf1, 0x8a, 0x55, 0x85, 0xb3, 0xba, 0xd1, 0xea, 0xec, 0xb6, 0xb1, 0x8a, 0x3b, 0x9a, 0x2b, + 0x43, 0xbb, 0x68, 0x2f, 0xe2, 0x2e, 0x36, 0xda, 0xd8, 0x70, 0x28, 0x9f, 0xde, 0x79, 0x36, 0x81, + 0x9c, 0xbc, 0x32, 0xde, 0xcd, 0x2b, 0xe3, 0x93, 0xfa, 0xad, 0xc7, 0xc6, 0x2c, 0xde, 0xdd, 0x01, + 0x40, 0xeb, 0x76, 0x4e, 0xc7, 0x97, 0x98, 0x1a, 0x5e, 0xd5, 0xb3, 0x84, 0x57, 0xf3, 0x33, 0xa8, + 0xa1, 0xcc, 0xe8, 0x31, 0x5f, 0xfd, 0xee, 0xe3, 0xd4, 0xef, 0x66, 0x41, 0x16, 0x92, 0x69, 0x5d, + 0x77, 0x08, 0xad, 0x9b, 0x85, 0xa9, 0x60, 0x6b, 0x58, 0x56, 0xae, 0x82, 0x13, 0x9e, 0x4f, 0x6f, + 0xb5, 0x5c, 0x5e, 0xac, 0x37, 0x37, 0xd6, 0x97, 0xd5, 0xe2, 0x62, 0xb9, 0x00, 0xae, 0x7e, 0x52, + 0xbd, 0xf4, 0x5d, 0x71, 0xb3, 0xe8, 0x33, 0x12, 0xe4, 0xc8, 0x61, 0x4c, 0xf4, 0xa3, 0x23, 0xd2, + 0x1c, 0x9b, 0xf3, 0x60, 0xf2, 0xc7, 0x5d, 0xf1, 0x38, 0xef, 0x4c, 0x98, 0x84, 0xab, 0x03, 0xc5, + 0x79, 0x8f, 0x21, 0x94, 0xfe, 0xb4, 0xc6, 0x6d, 0x92, 0xf5, 0x6d, 0xf3, 0xd2, 0xf7, 0x72, 0x93, + 0x74, 0xeb, 0x7f, 0xc8, 0x4d, 0xb2, 0x0f, 0x0b, 0x63, 0x6f, 0x92, 0x7d, 0xda, 0x5d, 0x4c, 0x33, + 0x45, 0xcf, 0xc9, 0xf9, 0xf3, 0xbf, 0xe7, 0x49, 0x07, 0xda, 0xc8, 0x2a, 0xc2, 0xac, 0x6e, 0x38, + 0xd8, 0x32, 0xb4, 0xce, 0x52, 0x47, 0xdb, 0xf2, 0xec, 0xd3, 0xde, 0xdd, 0x8b, 0x4a, 0x28, 0x8f, + 0xca, 0xff, 0xa1, 0x9c, 0x06, 0x70, 0xf0, 0x4e, 0xb7, 0xa3, 0x39, 0x81, 0xea, 0x85, 0x52, 0xc2, + 0xda, 0x97, 0xe5, 0xb5, 0xef, 0x56, 0xb8, 0x82, 0x82, 0xd6, 0xb8, 0xdc, 0xc5, 0x1b, 0x86, 0xfe, + 0x63, 0xbb, 0x24, 0xfc, 0x28, 0xd5, 0xd1, 0x7e, 0x9f, 0xb8, 0xed, 0x9c, 0x7c, 0xcf, 0x76, 0xce, + 0x3f, 0x08, 0x87, 0x35, 0xf1, 0x5a, 0xfd, 0x80, 0xb0, 0x26, 0x7e, 0x4b, 0x93, 0x7b, 0x5a, 0x9a, + 0xbf, 0xc8, 0x92, 0x15, 0x58, 0x64, 0x09, 0xa3, 0x92, 0x13, 0x5c, 0xa0, 0x7c, 0xa5, 0x50, 0xdc, + 0x94, 0xb8, 0x6a, 0x8c, 0x61, 0x01, 0x5c, 0x86, 0x39, 0x5a, 0xf4, 0x82, 0x69, 0x5e, 0xdc, 0xd1, + 0xac, 0x8b, 0xc8, 0x3a, 0x90, 0x2a, 0xc6, 0xee, 0x25, 0x45, 0x6e, 0x90, 0x7e, 0x5c, 0x78, 0xce, + 0xc0, 0x89, 0xcb, 0xe3, 0x79, 0x3c, 0x9b, 0x49, 0xaf, 0x13, 0x9a, 0x42, 0x88, 0x30, 0x98, 0x3e, + 0xae, 0x7f, 0xec, 0xe3, 0xea, 0x75, 0xf4, 0xe1, 0x75, 0xf8, 0x51, 0xe2, 0x8a, 0xbe, 0x30, 0x1c, + 0x76, 0x1e, 0x5f, 0x43, 0x60, 0x57, 0x00, 0xf9, 0xa2, 0xef, 0xfa, 0xe3, 0x3e, 0x86, 0x2b, 0x94, + 0x4d, 0x0f, 0xcd, 0x08, 0x96, 0xc7, 0x82, 0xe6, 0x71, 0x9e, 0x85, 0x5a, 0x37, 0x55, 0x4c, 0x3f, + 0x2f, 0xbc, 0xbf, 0xd5, 0x57, 0x40, 0x94, 0xbb, 0xf1, 0xb4, 0x4a, 0xb1, 0xcd, 0x31, 0x71, 0x36, + 0xd3, 0x47, 0xf3, 0x85, 0x39, 0x98, 0xf2, 0x02, 0xcf, 0x90, 0x7b, 0x91, 0x7c, 0x0c, 0x4f, 0x42, + 0xde, 0x36, 0x77, 0xad, 0x16, 0x66, 0x3b, 0x8e, 0xec, 0x6d, 0x88, 0xdd, 0xb1, 0x81, 0xe3, 0xf9, + 0x3e, 0x93, 0x21, 0x9b, 0xd8, 0x64, 0x88, 0x36, 0x48, 0xe3, 0x06, 0xf8, 0x17, 0x09, 0x07, 0xb3, + 0xe7, 0x30, 0xab, 0x63, 0xe7, 0xf1, 0x38, 0xc6, 0xff, 0x81, 0xd0, 0xde, 0xcb, 0x80, 0x9a, 0x24, + 0x53, 0xb9, 0xda, 0x10, 0x86, 0xea, 0xd5, 0x70, 0xa5, 0x97, 0x83, 0x59, 0xa8, 0xc4, 0x22, 0xdd, + 0x50, 0x57, 0x0b, 0x32, 0x7a, 0x6e, 0x16, 0x0a, 0x94, 0xb5, 0x9a, 0x6f, 0xac, 0xa1, 0x97, 0x66, + 0x0e, 0xdb, 0x22, 0x8d, 0x9e, 0x62, 0x7e, 0x52, 0x12, 0x0d, 0x98, 0xcb, 0x09, 0x3e, 0xa8, 0x5d, + 0x84, 0x26, 0x0d, 0xd1, 0xcc, 0x62, 0x94, 0x0f, 0xfd, 0x56, 0x46, 0x24, 0xfe, 0xae, 0x18, 0x8b, + 0x63, 0x08, 0x96, 0x94, 0xf5, 0xe2, 0x87, 0x2d, 0x59, 0xe6, 0xce, 0x86, 0xd5, 0x41, 0xff, 0xa7, + 0x50, 0x78, 0xf3, 0x08, 0xf3, 0x5f, 0x8a, 0x36, 0xff, 0xc9, 0x92, 0x71, 0x27, 0xd8, 0xab, 0xea, + 0x0c, 0x31, 0x7c, 0x2b, 0x37, 0xc0, 0x9c, 0xd6, 0x6e, 0xaf, 0x6b, 0x5b, 0xb8, 0xe4, 0xce, 0xab, + 0x0d, 0x87, 0xc5, 0x16, 0xea, 0x49, 0x8d, 0xed, 0x8a, 0xc4, 0xd7, 0x41, 0x39, 0x90, 0x98, 0x7c, + 0xc6, 0x32, 0xbc, 0xb9, 0x43, 0x42, 0x6b, 0x5b, 0x0b, 0x22, 0x9d, 0xb1, 0x37, 0x41, 0xcf, 0x26, + 0x01, 0xbe, 0xd3, 0xd7, 0xac, 0xdf, 0x93, 0x60, 0xc2, 0x95, 0x77, 0xb1, 0xdd, 0x46, 0x4f, 0xe4, + 0x02, 0x02, 0x46, 0xfa, 0x96, 0xfd, 0xb4, 0xb0, 0x53, 0x9f, 0x57, 0x43, 0x4a, 0x3f, 0x02, 0x93, + 0x40, 0x88, 0x12, 0x27, 0x44, 0x31, 0xdf, 0xbd, 0xd8, 0x22, 0xd2, 0x17, 0xdf, 0x47, 0x25, 0x98, + 0xf5, 0xe6, 0x11, 0x4b, 0xd8, 0x69, 0x6d, 0xa3, 0x3b, 0x44, 0x17, 0x9a, 0x58, 0x4b, 0xf3, 0xf7, + 0x64, 0x3b, 0xe8, 0x3b, 0x99, 0x84, 0x2a, 0xcf, 0x95, 0x1c, 0xb1, 0x4a, 0x97, 0x48, 0x17, 0xe3, + 0x08, 0xa6, 0x2f, 0xcc, 0xc7, 0x24, 0x80, 0x86, 0xe9, 0xcf, 0x75, 0x0f, 0x20, 0xc9, 0x5f, 0x10, + 0xde, 0xae, 0x65, 0x15, 0x0f, 0x8a, 0x4d, 0xde, 0x73, 0x08, 0xba, 0x26, 0x0d, 0x2a, 0x69, 0x2c, + 0x6d, 0x7d, 0x6a, 0x71, 0xb7, 0xdb, 0xd1, 0x5b, 0x9a, 0xd3, 0xeb, 0x4f, 0x17, 0x2d, 0x5e, 0x72, + 0x69, 0x68, 0x22, 0xa3, 0xd0, 0x2f, 0x23, 0x42, 0x96, 0x34, 0xf4, 0x8c, 0xe4, 0x85, 0x9e, 0x11, + 0xf4, 0x91, 0x19, 0x40, 0x7c, 0x0c, 0xea, 0x29, 0xc3, 0xd1, 0x5a, 0x17, 0x1b, 0x0b, 0x16, 0xd6, + 0xda, 0x2d, 0x6b, 0x77, 0xe7, 0x82, 0x1d, 0x76, 0x06, 0x8d, 0xd7, 0xd1, 0xd0, 0xd2, 0xb1, 0xc4, + 0x2d, 0x1d, 0xa3, 0x9f, 0x92, 0x45, 0x03, 0x21, 0x85, 0x36, 0x38, 0x42, 0x3c, 0x0c, 0x31, 0xd4, + 0x25, 0x72, 0x61, 0xea, 0x59, 0x25, 0xce, 0x26, 0x59, 0x25, 0x7e, 0xbd, 0x50, 0x58, 0x25, 0xa1, + 0x7a, 0x8d, 0xc5, 0x13, 0x6d, 0xae, 0x8e, 0x9d, 0x08, 0x78, 0xaf, 0x87, 0xd9, 0x0b, 0xc1, 0x17, + 0x1f, 0x62, 0x3e, 0xb1, 0x8f, 0x7f, 0xe8, 0x1b, 0x92, 0xae, 0xc0, 0xf0, 0x2c, 0x44, 0xa0, 0xeb, + 0x23, 0x28, 0x89, 0x38, 0xa1, 0x25, 0x5a, 0x4e, 0x89, 0x2d, 0x3f, 0x7d, 0x14, 0x3e, 0x28, 0xc1, + 0x34, 0xb9, 0x0a, 0x75, 0xe1, 0x32, 0x39, 0x16, 0x29, 0x68, 0x94, 0xbc, 0x30, 0x2c, 0x66, 0x05, + 0xb2, 0x1d, 0xdd, 0xb8, 0xe8, 0x79, 0x0f, 0xba, 0xcf, 0xc1, 0xc5, 0x7a, 0x52, 0x9f, 0x8b, 0xf5, + 0xfc, 0x7d, 0x0a, 0xbf, 0xdc, 0x03, 0xdd, 0xf4, 0x3c, 0x90, 0x5c, 0xfa, 0x62, 0xfc, 0xbb, 0x2c, + 0xe4, 0xeb, 0x58, 0xb3, 0x5a, 0xdb, 0xe8, 0x9d, 0x52, 0xdf, 0xa9, 0xc2, 0x24, 0x3f, 0x55, 0x58, + 0x82, 0x89, 0x4d, 0xbd, 0xe3, 0x60, 0x8b, 0x7a, 0x54, 0x87, 0xbb, 0x76, 0xda, 0xc4, 0x17, 0x3a, + 0x66, 0xeb, 0xe2, 0x3c, 0x33, 0xdd, 0xe7, 0xbd, 0x40, 0xac, 0xf3, 0x4b, 0xe4, 0x27, 0xd5, 0xfb, + 0xd9, 0x35, 0x08, 0x6d, 0xd3, 0x72, 0xa2, 0xee, 0xd8, 0x88, 0xa0, 0x52, 0x37, 0x2d, 0x47, 0xa5, + 0x3f, 0xba, 0x30, 0x6f, 0xee, 0x76, 0x3a, 0x0d, 0xfc, 0xb0, 0xe3, 0x4d, 0xdb, 0xbc, 0x77, 0xd7, + 0x58, 0x34, 0x37, 0x37, 0x6d, 0x4c, 0x17, 0x0d, 0x72, 0x2a, 0x7b, 0x53, 0x8e, 0x43, 0xae, 0xa3, + 0xef, 0xe8, 0x74, 0xa2, 0x91, 0x53, 0xe9, 0x8b, 0x72, 0x13, 0x14, 0x82, 0x39, 0x0e, 0x65, 0xf4, + 0x54, 0x9e, 0x34, 0xcd, 0x7d, 0xe9, 0xae, 0xce, 0x5c, 0xc4, 0x97, 0xed, 0x53, 0x13, 0xe4, 0x3b, + 0x79, 0xe6, 0x8f, 0xaf, 0x88, 0xec, 0x77, 0x50, 0x89, 0x47, 0xcf, 0x60, 0x2d, 0xdc, 0x32, 0xad, + 0xb6, 0x27, 0x9b, 0xe8, 0x09, 0x06, 0xcb, 0x97, 0x6c, 0x97, 0xa2, 0x6f, 0xe1, 0xe9, 0x6b, 0xda, + 0xdb, 0xf2, 0x6e, 0xb7, 0xe9, 0x16, 0x7d, 0x5e, 0x77, 0xb6, 0xd7, 0xb0, 0xa3, 0xa1, 0xbf, 0x93, + 0xfb, 0x6a, 0xdc, 0xf4, 0xff, 0xa7, 0x71, 0x03, 0x34, 0x8e, 0x86, 0xc1, 0x72, 0x76, 0x2d, 0xc3, + 0x95, 0x23, 0xf3, 0x4a, 0x0d, 0xa5, 0x28, 0x77, 0xc1, 0x55, 0xc1, 0x9b, 0xb7, 0x54, 0xba, 0xc8, + 0xa6, 0xad, 0x53, 0x24, 0x7b, 0x74, 0x06, 0x65, 0x1d, 0xae, 0xa3, 0x1f, 0x57, 0x1a, 0x6b, 0xab, + 0x2b, 0xfa, 0xd6, 0x76, 0x47, 0xdf, 0xda, 0x76, 0xec, 0x8a, 0x61, 0x3b, 0x58, 0x6b, 0xd7, 0x36, + 0x55, 0x7a, 0x3b, 0x0e, 0x10, 0x3a, 0x22, 0x59, 0x79, 0x8f, 0x6b, 0xb1, 0xd1, 0x2d, 0xac, 0x29, + 0x11, 0x2d, 0xe5, 0xe9, 0x6e, 0x4b, 0xb1, 0x77, 0x3b, 0x3e, 0xa6, 0xd7, 0xf4, 0x60, 0x1a, 0xa8, + 0xfa, 0x6e, 0x87, 0x34, 0x17, 0x92, 0x39, 0xe9, 0x38, 0x17, 0xc3, 0x49, 0xfa, 0xcd, 0xe6, 0xff, + 0xc9, 0x43, 0x6e, 0xd9, 0xd2, 0xba, 0xdb, 0xe8, 0xb9, 0xa1, 0xfe, 0x79, 0x54, 0x6d, 0xc2, 0xd7, + 0x4e, 0x69, 0x90, 0x76, 0xca, 0x03, 0xb4, 0x33, 0x1b, 0xd2, 0xce, 0xe8, 0x45, 0xe5, 0xb3, 0x30, + 0xd3, 0x32, 0x3b, 0x1d, 0xdc, 0x72, 0xe5, 0x51, 0x69, 0x93, 0xd5, 0x9c, 0x29, 0x95, 0x4b, 0x23, + 0xc1, 0xaa, 0xb1, 0x53, 0xa7, 0x6b, 0xe8, 0x54, 0xe9, 0x83, 0x04, 0xf4, 0x52, 0x09, 0xb2, 0xe5, + 0xf6, 0x16, 0xe6, 0xd6, 0xd9, 0x33, 0xa1, 0x75, 0xf6, 0x93, 0x90, 0x77, 0x34, 0x6b, 0x0b, 0x3b, + 0xde, 0x3a, 0x01, 0x7d, 0xf3, 0x63, 0x68, 0xcb, 0xa1, 0x18, 0xda, 0x3f, 0x08, 0x59, 0x57, 0x66, + 0xcc, 0xc9, 0xfc, 0xba, 0x7e, 0xf0, 0x13, 0xd9, 0xcf, 0xbb, 0x25, 0xce, 0xbb, 0xb5, 0x56, 0xc9, + 0x0f, 0xbd, 0x58, 0xe7, 0xf6, 0x61, 0x4d, 0x2e, 0xfa, 0x6c, 0x99, 0x46, 0x65, 0x47, 0xdb, 0xc2, + 0xac, 0x9a, 0x41, 0x82, 0xf7, 0xb5, 0xbc, 0x63, 0x3e, 0xa4, 0xb3, 0x68, 0x91, 0x41, 0x82, 0x5b, + 0x85, 0x6d, 0xbd, 0xdd, 0xc6, 0x06, 0x6b, 0xd9, 0xec, 0xed, 0xec, 0x69, 0xc8, 0xba, 0x3c, 0xb8, + 0xfa, 0xe3, 0x1a, 0x0b, 0x85, 0x23, 0xca, 0x8c, 0xdb, 0xac, 0x68, 0xe3, 0x2d, 0x64, 0xf8, 0x35, + 0x55, 0x11, 0xb7, 0x1d, 0x5a, 0xb9, 0xfe, 0x8d, 0xeb, 0x29, 0x90, 0x33, 0xcc, 0x36, 0x1e, 0x38, + 0x08, 0xd1, 0x5c, 0xca, 0xd3, 0x20, 0x87, 0xdb, 0x6e, 0xaf, 0x20, 0x93, 0xec, 0xa7, 0xe3, 0x65, + 0xa9, 0xd2, 0xcc, 0xc9, 0x7c, 0x83, 0xfa, 0x71, 0x9b, 0x7e, 0x03, 0xfc, 0xd9, 0x09, 0x38, 0x4a, + 0xfb, 0x80, 0xfa, 0xee, 0x05, 0x97, 0xd4, 0x05, 0x8c, 0x1e, 0xed, 0x3f, 0x70, 0x1d, 0xe5, 0x95, + 0xfd, 0x38, 0xe4, 0xec, 0xdd, 0x0b, 0xbe, 0x11, 0x4a, 0x5f, 0xc2, 0x4d, 0x57, 0x1a, 0xc9, 0x70, + 0x26, 0x0f, 0x3b, 0x9c, 0x71, 0x43, 0x93, 0xec, 0x35, 0xfe, 0x60, 0x20, 0xa3, 0xc7, 0x23, 0xbc, + 0x81, 0xac, 0xdf, 0x30, 0x74, 0x0a, 0x26, 0xb4, 0x4d, 0x07, 0x5b, 0x81, 0x99, 0xc8, 0x5e, 0xdd, + 0xa1, 0xf2, 0x02, 0xde, 0x34, 0x2d, 0x57, 0x2c, 0x34, 0x84, 0xba, 0xff, 0x1e, 0x6a, 0xb9, 0xc0, + 0xed, 0x90, 0xdd, 0x0c, 0xc7, 0x0c, 0x73, 0x11, 0x77, 0x99, 0x9c, 0x29, 0x8a, 0xb3, 0xa4, 0x05, + 0xec, 0xff, 0xb0, 0xaf, 0x2b, 0x99, 0xdb, 0xdf, 0x95, 0xa0, 0x4f, 0x24, 0x9d, 0x33, 0xf7, 0x00, + 0x3d, 0x32, 0x0b, 0x4d, 0x79, 0x26, 0xcc, 0xb4, 0x99, 0x8b, 0x56, 0x4b, 0xf7, 0x5b, 0x49, 0xe4, + 0x7f, 0x5c, 0xe6, 0x40, 0x91, 0xb2, 0x61, 0x45, 0x5a, 0x86, 0x49, 0x72, 0x90, 0xd9, 0xd5, 0xa4, + 0x5c, 0x8f, 0x4b, 0x3c, 0x99, 0xd6, 0xf9, 0x95, 0x0a, 0x89, 0x6d, 0xbe, 0xc4, 0x7e, 0x51, 0xfd, + 0x9f, 0x93, 0xcd, 0xbe, 0xe3, 0x25, 0x94, 0x7e, 0x73, 0xfc, 0xed, 0x3c, 0x5c, 0x55, 0xb2, 0x4c, + 0xdb, 0x26, 0x67, 0x60, 0x7a, 0x1b, 0xe6, 0x6b, 0x25, 0xee, 0x36, 0x8d, 0xc7, 0x75, 0xf3, 0xeb, + 0xd7, 0xa0, 0xc6, 0xd7, 0x34, 0xbe, 0x2c, 0x1c, 0x02, 0xc6, 0xdf, 0x7f, 0x88, 0x10, 0xfa, 0xf7, + 0x46, 0x23, 0x79, 0x5b, 0x46, 0x24, 0x2a, 0x4d, 0x42, 0x59, 0xa5, 0xdf, 0x5c, 0x3e, 0x2f, 0xc1, + 0xd5, 0xbd, 0xdc, 0x6c, 0x18, 0xb6, 0xdf, 0x60, 0xae, 0x1d, 0xd0, 0x5e, 0xf8, 0x28, 0x26, 0xb1, + 0xf7, 0x58, 0x46, 0xd4, 0x3d, 0x54, 0x5a, 0xc4, 0x62, 0x49, 0x70, 0xa2, 0x26, 0xee, 0x1e, 0xcb, + 0xc4, 0xe4, 0xd3, 0x17, 0xee, 0x27, 0xb3, 0x70, 0x74, 0xd9, 0x32, 0x77, 0xbb, 0x76, 0xd0, 0x03, + 0xfd, 0x75, 0xff, 0x0d, 0xd7, 0xbc, 0x88, 0x69, 0x70, 0x06, 0xa6, 0x2d, 0x66, 0xcd, 0x05, 0xdb, + 0xaf, 0xe1, 0xa4, 0x70, 0xef, 0x25, 0x1f, 0xa4, 0xf7, 0x0a, 0xfa, 0x99, 0x2c, 0xd7, 0xcf, 0xf4, + 0xf6, 0x1c, 0xb9, 0x3e, 0x3d, 0xc7, 0x5f, 0x49, 0x09, 0x07, 0xd5, 0x1e, 0x11, 0x45, 0xf4, 0x17, + 0x25, 0xc8, 0x6f, 0x91, 0x8c, 0xac, 0xbb, 0x78, 0xb2, 0x58, 0xcd, 0x08, 0x71, 0x95, 0xfd, 0x1a, + 0xc8, 0x55, 0x0e, 0xeb, 0x70, 0xa2, 0x01, 0x2e, 0x9e, 0xdb, 0xf4, 0x95, 0xea, 0x55, 0x59, 0x98, + 0xf1, 0x4b, 0xaf, 0xb4, 0x6d, 0xf4, 0xc2, 0xfe, 0x1a, 0x35, 0x2b, 0xa2, 0x51, 0xfb, 0xd6, 0x99, + 0xfd, 0x51, 0x47, 0x0e, 0x8d, 0x3a, 0x7d, 0x47, 0x97, 0x99, 0x88, 0xd1, 0x05, 0x3d, 0x47, 0x16, + 0xbd, 0x8f, 0x8a, 0xef, 0x5a, 0x49, 0x6d, 0x1e, 0xcf, 0x83, 0x85, 0xe0, 0xad, 0x58, 0x83, 0x6b, + 0x95, 0xbe, 0x92, 0xbc, 0x47, 0x82, 0x63, 0xfb, 0x3b, 0xf3, 0xef, 0xe3, 0xbd, 0xd0, 0xdc, 0x3a, + 0xd9, 0xbe, 0x17, 0x1a, 0x79, 0xe3, 0x37, 0xe9, 0x62, 0x43, 0x8a, 0x70, 0xf6, 0xde, 0xe0, 0x4e, + 0x5c, 0x2c, 0x68, 0x88, 0x20, 0xd1, 0xf4, 0x05, 0xf8, 0x8b, 0x32, 0x4c, 0xd5, 0xb1, 0xb3, 0xaa, + 0x5d, 0x36, 0x77, 0x1d, 0xa4, 0x89, 0x6e, 0xcf, 0x3d, 0x03, 0xf2, 0x1d, 0xf2, 0x0b, 0xbb, 0xe6, + 0xff, 0x4c, 0xdf, 0xfd, 0x2d, 0xe2, 0xfb, 0x43, 0x49, 0xab, 0x2c, 0x3f, 0x1f, 0xcb, 0x45, 0x64, + 0x77, 0xd4, 0xe7, 0x6e, 0x24, 0x5b, 0x3b, 0x89, 0xf6, 0x4e, 0xa3, 0x8a, 0x4e, 0x1f, 0x96, 0x9f, + 0x92, 0x61, 0xb6, 0x8e, 0x9d, 0x8a, 0xbd, 0xa4, 0xed, 0x99, 0x96, 0xee, 0xe0, 0xf0, 0x3d, 0x9f, + 0xf1, 0xd0, 0x9c, 0x06, 0xd0, 0xfd, 0xdf, 0x58, 0x84, 0xa9, 0x50, 0x0a, 0xfa, 0xad, 0xa4, 0x8e, + 0x42, 0x1c, 0x1f, 0x23, 0x01, 0x21, 0x91, 0x8f, 0x45, 0x5c, 0xf1, 0xe9, 0x03, 0xf1, 0x39, 0x89, + 0x01, 0x51, 0xb4, 0x5a, 0xdb, 0xfa, 0x1e, 0x6e, 0x27, 0x04, 0xc2, 0xfb, 0x2d, 0x00, 0xc2, 0x27, + 0x94, 0xd8, 0x7d, 0x85, 0xe3, 0x63, 0x14, 0xee, 0x2b, 0x71, 0x04, 0xc7, 0x12, 0x24, 0xca, 0xed, + 0x7a, 0xd8, 0x7a, 0xe6, 0xbd, 0xa2, 0x62, 0x0d, 0x4c, 0x36, 0x29, 0x6c, 0xb2, 0x0d, 0xd5, 0xb1, + 0xd0, 0xb2, 0x07, 0xe9, 0x74, 0x36, 0x8d, 0x8e, 0xa5, 0x6f, 0xd1, 0xe9, 0x0b, 0xfd, 0x1d, 0x32, + 0x9c, 0xf0, 0xa3, 0xa7, 0xd4, 0xb1, 0xb3, 0xa8, 0xd9, 0xdb, 0x17, 0x4c, 0xcd, 0x6a, 0xa3, 0xd2, + 0x08, 0x4e, 0xfc, 0xa1, 0xcf, 0x86, 0x41, 0xa8, 0xf2, 0x20, 0xf4, 0x75, 0x15, 0xed, 0xcb, 0xcb, + 0x28, 0x3a, 0x99, 0x58, 0x6f, 0xd6, 0xdf, 0xf1, 0xc1, 0xfa, 0x21, 0x0e, 0xac, 0xbb, 0x87, 0x65, + 0x31, 0x7d, 0xe0, 0x7e, 0x85, 0x8e, 0x08, 0x21, 0xaf, 0xe6, 0x07, 0x45, 0x01, 0x8b, 0xf0, 0x6a, + 0x95, 0x23, 0xbd, 0x5a, 0x87, 0x1a, 0x23, 0x06, 0x7a, 0x24, 0xa7, 0x3b, 0x46, 0x1c, 0xa2, 0xb7, + 0xf1, 0x5b, 0x64, 0x28, 0x90, 0xf0, 0x59, 0x21, 0x8f, 0xef, 0x70, 0x34, 0xea, 0x78, 0x74, 0xf6, + 0x79, 0x97, 0x4f, 0x24, 0xf5, 0x2e, 0x47, 0x6f, 0x4e, 0xea, 0x43, 0xde, 0xcb, 0xed, 0x48, 0x10, + 0x4b, 0xe4, 0x22, 0x3e, 0x80, 0x83, 0xf4, 0x41, 0xfb, 0x6f, 0x32, 0x80, 0xdb, 0xa0, 0xd9, 0xd9, + 0x87, 0x67, 0x89, 0xc2, 0x75, 0x4b, 0xd8, 0xaf, 0xde, 0x05, 0xea, 0x44, 0x0f, 0x50, 0x94, 0x62, + 0x70, 0xaa, 0xe2, 0xd1, 0xa4, 0xbe, 0x95, 0x01, 0x57, 0x23, 0x81, 0x25, 0x91, 0xb7, 0x65, 0x64, + 0xd9, 0xe9, 0x03, 0xf2, 0x3f, 0x24, 0xc8, 0x35, 0xcc, 0x3a, 0x76, 0x0e, 0x6e, 0x0a, 0x24, 0x3e, + 0xb6, 0x4f, 0xca, 0x1d, 0xc5, 0xb1, 0xfd, 0x7e, 0x84, 0xc6, 0x10, 0x8d, 0x4c, 0x82, 0x99, 0x86, + 0x59, 0xf2, 0x17, 0xa7, 0xc4, 0x7d, 0x55, 0xc5, 0xef, 0xd4, 0xf6, 0x2b, 0x18, 0x14, 0x73, 0xa0, + 0x3b, 0xb5, 0x07, 0xd3, 0x4b, 0x5f, 0x6e, 0x77, 0xc0, 0xd1, 0x0d, 0xa3, 0x6d, 0xaa, 0xb8, 0x6d, + 0xb2, 0x95, 0x6e, 0x45, 0x81, 0xec, 0xae, 0xd1, 0x36, 0x09, 0xcb, 0x39, 0x95, 0x3c, 0xbb, 0x69, + 0x16, 0x6e, 0x9b, 0xcc, 0x37, 0x80, 0x3c, 0xa3, 0x2f, 0xcb, 0x90, 0x75, 0xff, 0x15, 0x17, 0xf5, + 0x5b, 0xe4, 0x84, 0x81, 0x08, 0x5c, 0xf2, 0x23, 0xb1, 0x84, 0xee, 0x0d, 0xad, 0xfd, 0x53, 0x0f, + 0xd6, 0xeb, 0xa2, 0xca, 0x0b, 0x89, 0x22, 0x58, 0xf3, 0x57, 0x4e, 0xc1, 0xc4, 0x85, 0x8e, 0xd9, + 0xba, 0x18, 0x9c, 0x97, 0x67, 0xaf, 0xca, 0x4d, 0x90, 0xb3, 0x34, 0x63, 0x0b, 0xb3, 0x3d, 0x85, + 0xe3, 0x3d, 0x7d, 0x21, 0xf1, 0x7a, 0x51, 0x69, 0x16, 0xf4, 0xe6, 0x24, 0x21, 0x10, 0xfa, 0x54, + 0x3e, 0x99, 0x3e, 0x2c, 0x0e, 0x71, 0xb2, 0xac, 0x00, 0x33, 0xa5, 0x22, 0xbd, 0xbd, 0x7e, 0xad, + 0x76, 0xae, 0x5c, 0x90, 0x09, 0xcc, 0xae, 0x4c, 0x52, 0x84, 0xd9, 0x25, 0xff, 0x3d, 0x0b, 0x73, + 0x9f, 0xca, 0x1f, 0x06, 0xcc, 0x1f, 0x95, 0x60, 0x76, 0x55, 0xb7, 0x9d, 0x28, 0x6f, 0xff, 0x98, + 0xe8, 0xb9, 0x2f, 0x4a, 0x6a, 0x2a, 0x73, 0xe5, 0x08, 0x87, 0xcd, 0x4d, 0x64, 0x0e, 0xc7, 0x15, + 0x31, 0x9e, 0x63, 0x29, 0x84, 0x03, 0x7a, 0x87, 0xb4, 0xb0, 0x24, 0x13, 0x1b, 0x4a, 0x41, 0x21, + 0xe3, 0x37, 0x94, 0x22, 0xcb, 0x4e, 0x5f, 0xbe, 0x5f, 0x96, 0xe0, 0x98, 0x5b, 0x7c, 0xdc, 0xb2, + 0x54, 0xb4, 0x98, 0x07, 0x2e, 0x4b, 0x25, 0x5e, 0x19, 0xdf, 0xc7, 0xcb, 0x28, 0x56, 0xc6, 0x07, + 0x11, 0x1d, 0xb3, 0x98, 0x23, 0x96, 0x61, 0x07, 0x89, 0x39, 0x66, 0x19, 0x76, 0x78, 0x31, 0xc7, + 0x2f, 0xc5, 0x0e, 0x29, 0xe6, 0x43, 0x5b, 0x60, 0x7d, 0x8d, 0xec, 0x8b, 0x39, 0x72, 0x6d, 0x23, + 0x46, 0xcc, 0x89, 0x4f, 0xec, 0xa2, 0xb7, 0x0e, 0x29, 0xf8, 0x11, 0xaf, 0x6f, 0x0c, 0x03, 0xd3, + 0x21, 0xae, 0x71, 0xfc, 0xaa, 0x0c, 0x73, 0x8c, 0x8b, 0xfe, 0x53, 0xe6, 0x18, 0x8c, 0x12, 0x4f, + 0x99, 0x13, 0x9f, 0x01, 0xe2, 0x39, 0x1b, 0xff, 0x19, 0xa0, 0xd8, 0xf2, 0xd3, 0x07, 0xe7, 0x2b, + 0x59, 0x38, 0xe9, 0xb2, 0xb0, 0x66, 0xb6, 0xf5, 0xcd, 0xcb, 0x94, 0x8b, 0x73, 0x5a, 0x67, 0x17, + 0xdb, 0xe8, 0x5d, 0x92, 0x28, 0x4a, 0xff, 0x09, 0xc0, 0xec, 0x62, 0x8b, 0x06, 0x52, 0x63, 0x40, + 0xdd, 0x15, 0x55, 0xd9, 0xfd, 0x25, 0xf9, 0x97, 0xc9, 0xd4, 0x3c, 0x22, 0x6a, 0x88, 0x9e, 0x6b, + 0x15, 0x4e, 0xf9, 0x5f, 0x7a, 0x1d, 0x3c, 0x32, 0xfb, 0x1d, 0x3c, 0x6e, 0x04, 0x59, 0x6b, 0xb7, + 0x7d, 0xa8, 0x7a, 0x37, 0xb3, 0x49, 0x99, 0xaa, 0x9b, 0xc5, 0xcd, 0x69, 0xe3, 0xe0, 0x68, 0x5e, + 0x44, 0x4e, 0x1b, 0x3b, 0xca, 0x3c, 0xe4, 0xe9, 0x0d, 0xd9, 0xfe, 0x8a, 0x7e, 0xff, 0xcc, 0x2c, + 0x17, 0x6f, 0xda, 0xd5, 0x78, 0x35, 0xbc, 0x23, 0x91, 0x64, 0xfa, 0xf5, 0xd3, 0x81, 0x9d, 0xac, + 0x72, 0x0a, 0x76, 0xcf, 0xd0, 0x94, 0xc7, 0xb3, 0x1b, 0x56, 0xec, 0x76, 0x3b, 0x97, 0x1b, 0x2c, + 0xf8, 0x4a, 0xa2, 0xdd, 0xb0, 0x50, 0x0c, 0x17, 0xa9, 0x37, 0x86, 0x4b, 0xf2, 0xdd, 0x30, 0x8e, + 0x8f, 0x51, 0xec, 0x86, 0xc5, 0x11, 0x4c, 0x5f, 0xb4, 0x2f, 0x9b, 0xa4, 0x56, 0x33, 0x8b, 0xed, + 0xff, 0x9a, 0xfe, 0x9e, 0xd5, 0xc0, 0x3b, 0xbb, 0xf4, 0x0b, 0xfb, 0x1f, 0x7b, 0xa7, 0x89, 0xf2, + 0x34, 0xc8, 0x6f, 0x9a, 0xd6, 0x8e, 0xe6, 0x6d, 0xdc, 0xf7, 0x9e, 0x14, 0x61, 0xf1, 0xf4, 0x97, + 0x48, 0x1e, 0x95, 0xe5, 0x75, 0xe7, 0x23, 0xcf, 0xd6, 0xbb, 0x2c, 0xea, 0xa2, 0xfb, 0xa8, 0x5c, + 0x0f, 0xb3, 0x2c, 0xf8, 0x62, 0x15, 0xdb, 0x0e, 0x6e, 0xb3, 0x88, 0x15, 0x7c, 0xa2, 0x72, 0x16, + 0x66, 0x58, 0xc2, 0x92, 0xde, 0xc1, 0x36, 0x0b, 0x5a, 0xc1, 0xa5, 0x29, 0x27, 0x21, 0xaf, 0xdb, + 0xf7, 0xdb, 0xa6, 0x41, 0xfc, 0xff, 0x27, 0x55, 0xf6, 0xa6, 0xdc, 0x08, 0x47, 0x59, 0x3e, 0xdf, + 0x58, 0xa5, 0x07, 0x76, 0x7a, 0x93, 0x5d, 0xd5, 0x32, 0xcc, 0x75, 0xcb, 0xdc, 0xb2, 0xb0, 0x6d, + 0x93, 0x53, 0x53, 0x93, 0x6a, 0x28, 0x45, 0x79, 0x10, 0x8e, 0x75, 0x74, 0xe3, 0xa2, 0x4d, 0x82, + 0xf4, 0x2e, 0x31, 0xb7, 0xb1, 0x99, 0x3e, 0xc1, 0xb3, 0x43, 0x8d, 0x8d, 0xc9, 0x21, 0xfc, 0x8b, + 0xba, 0x9f, 0x0a, 0x7a, 0x49, 0x06, 0x66, 0xc2, 0x09, 0x8a, 0x06, 0x8a, 0xd7, 0x8d, 0xd9, 0xe7, + 0xb7, 0x75, 0x07, 0xbb, 0xc4, 0xd8, 0xd9, 0x94, 0xdb, 0x06, 0x14, 0xa6, 0xee, 0xfb, 0x51, 0xed, + 0x43, 0xcc, 0x15, 0x2a, 0xed, 0xa0, 0x88, 0x27, 0x98, 0xcd, 0x6c, 0x4b, 0x2e, 0x0d, 0x3d, 0x1b, + 0x94, 0xfd, 0xd4, 0x42, 0x5e, 0x1b, 0x99, 0x64, 0x5e, 0x1b, 0xca, 0x4d, 0x50, 0xd0, 0x3a, 0x1d, + 0xf3, 0x12, 0x6e, 0xfb, 0x64, 0x99, 0x6e, 0xed, 0x4b, 0x47, 0x9f, 0x1a, 0x66, 0x1e, 0x97, 0xf8, + 0x5a, 0x09, 0xb7, 0x51, 0xec, 0xb6, 0x5a, 0x18, 0xb7, 0xd9, 0x41, 0x33, 0xef, 0x35, 0xe1, 0x85, + 0x13, 0x89, 0x67, 0x7d, 0x87, 0x74, 0xe3, 0xc4, 0xfb, 0x4f, 0x40, 0x9e, 0xde, 0xde, 0x86, 0x5e, + 0x32, 0xd7, 0xb7, 0x6f, 0x98, 0xe3, 0xfb, 0x86, 0x0d, 0x98, 0x31, 0x4c, 0xb7, 0xb8, 0x75, 0xcd, + 0xd2, 0x76, 0xec, 0xb8, 0x45, 0x5d, 0x4a, 0xd7, 0x1f, 0xc1, 0xab, 0xa1, 0xdf, 0x56, 0x8e, 0xa8, + 0x1c, 0x19, 0xe5, 0xff, 0x07, 0x47, 0x2f, 0xb0, 0x80, 0x0c, 0x36, 0xa3, 0x2c, 0x45, 0xbb, 0x3c, + 0xf6, 0x50, 0x5e, 0xe0, 0xff, 0x5c, 0x39, 0xa2, 0xf6, 0x12, 0x53, 0x7e, 0x04, 0xe6, 0xdc, 0xd7, + 0xb6, 0x79, 0xc9, 0x63, 0x5c, 0x8e, 0xb6, 0xfb, 0x7a, 0xc8, 0xaf, 0x71, 0x3f, 0xae, 0x1c, 0x51, + 0x7b, 0x48, 0x29, 0x35, 0x80, 0x6d, 0x67, 0xa7, 0xc3, 0x08, 0x67, 0xa3, 0x55, 0xb2, 0x87, 0xf0, + 0x8a, 0xff, 0xd3, 0xca, 0x11, 0x35, 0x44, 0x42, 0x59, 0x85, 0x29, 0xe7, 0x61, 0x87, 0xd1, 0xcb, + 0x45, 0xfb, 0x1a, 0xf4, 0xd0, 0x6b, 0x78, 0xff, 0xac, 0x1c, 0x51, 0x03, 0x02, 0x4a, 0x05, 0x26, + 0xbb, 0x17, 0x18, 0xb1, 0x7c, 0x74, 0xff, 0xd4, 0x43, 0x6c, 0xfd, 0x82, 0x4f, 0xcb, 0xff, 0xdd, + 0x65, 0xac, 0x65, 0xef, 0x31, 0x5a, 0x13, 0xc2, 0x8c, 0x95, 0xbc, 0x7f, 0x5c, 0xc6, 0x7c, 0x02, + 0x4a, 0x05, 0xa6, 0x6c, 0x43, 0xeb, 0xda, 0xdb, 0xa6, 0x63, 0x9f, 0x9a, 0xec, 0x71, 0x4b, 0x8d, + 0xa6, 0x56, 0x67, 0xff, 0xa8, 0xc1, 0xdf, 0xca, 0xd3, 0xe0, 0xc4, 0x6e, 0xb7, 0xad, 0x39, 0xb8, + 0xfc, 0xb0, 0x6e, 0x3b, 0xba, 0xb1, 0xe5, 0x85, 0xf4, 0xa5, 0x9d, 0x7b, 0xff, 0x8f, 0xca, 0x3c, + 0x3b, 0xa0, 0x06, 0xa4, 0x6d, 0xa2, 0xde, 0xbd, 0x51, 0x5a, 0x6c, 0xe8, 0x5c, 0xda, 0x33, 0x21, + 0xeb, 0x7e, 0x22, 0x83, 0xc1, 0x5c, 0xff, 0x75, 0xd7, 0x5e, 0xdd, 0x21, 0x0d, 0xd8, 0xfd, 0xa9, + 0x67, 0x3c, 0x99, 0xd9, 0x37, 0x9e, 0x9c, 0x81, 0x69, 0xdd, 0x5e, 0xd3, 0xb7, 0xa8, 0x31, 0xcb, + 0x8e, 0x1f, 0x84, 0x93, 0xe8, 0xe4, 0xbf, 0x8a, 0x2f, 0xd1, 0x0b, 0x4b, 0x8e, 0x7a, 0x93, 0x7f, + 0x2f, 0x05, 0xdd, 0x00, 0x33, 0xe1, 0x46, 0x46, 0xaf, 0x80, 0xd5, 0x03, 0x53, 0x98, 0xbd, 0xa1, + 0xeb, 0x61, 0x8e, 0xd7, 0xe9, 0xd0, 0x88, 0x2f, 0x7b, 0x5d, 0x21, 0xba, 0x0e, 0x8e, 0xf6, 0x34, + 0x2c, 0x2f, 0xc4, 0x4b, 0x26, 0x08, 0xf1, 0x72, 0x06, 0x20, 0xd0, 0xe2, 0xbe, 0x64, 0xae, 0x85, + 0x29, 0x5f, 0x2f, 0xfb, 0x66, 0xf8, 0x62, 0x06, 0x26, 0x3d, 0x65, 0xeb, 0x97, 0xc1, 0x1d, 0x99, + 0x8c, 0xd0, 0x7e, 0x8e, 0x37, 0x32, 0x85, 0xd3, 0xdc, 0x61, 0x3d, 0xf0, 0xa2, 0x6e, 0xe8, 0x4e, + 0xc7, 0x3b, 0x89, 0xd8, 0x9b, 0xac, 0xac, 0x03, 0xe8, 0x04, 0xa3, 0x46, 0x70, 0x34, 0xf1, 0xd6, + 0x04, 0xed, 0x81, 0xea, 0x43, 0x88, 0xc6, 0xd9, 0xef, 0x63, 0xe7, 0x06, 0xa7, 0x20, 0x47, 0xe3, + 0xda, 0x1f, 0x51, 0xe6, 0x00, 0xca, 0xcf, 0x5a, 0x2f, 0xab, 0x95, 0x72, 0xb5, 0x54, 0x2e, 0x64, + 0xd0, 0xaf, 0x49, 0x30, 0xe5, 0x37, 0x82, 0xbe, 0x95, 0x2c, 0x33, 0xd5, 0x1a, 0x78, 0xcb, 0xe6, + 0xfe, 0x46, 0x15, 0x56, 0xb2, 0x67, 0xc0, 0x95, 0xbb, 0x36, 0x5e, 0xd2, 0x2d, 0xdb, 0x51, 0xcd, + 0x4b, 0x4b, 0xa6, 0x15, 0x0c, 0xac, 0x34, 0xa0, 0x6c, 0xd4, 0x67, 0xd7, 0xc0, 0x6b, 0x63, 0x72, + 0x46, 0x0d, 0x5b, 0x6c, 0xa1, 0x3e, 0x48, 0x70, 0xe9, 0x3a, 0x96, 0x66, 0xd8, 0x5d, 0xd3, 0xc6, + 0xaa, 0x79, 0xc9, 0x2e, 0x1a, 0xed, 0x92, 0xd9, 0xd9, 0xdd, 0x31, 0x6c, 0x66, 0xa2, 0x45, 0x7d, + 0x76, 0xa5, 0x43, 0xee, 0xd0, 0x9d, 0x03, 0x28, 0xd5, 0x56, 0x57, 0xcb, 0xa5, 0x46, 0xa5, 0x56, + 0x2d, 0x1c, 0x71, 0xa5, 0xd5, 0x28, 0x2e, 0xac, 0xba, 0xd2, 0xf9, 0x51, 0x98, 0xf4, 0xda, 0x34, + 0x8b, 0x4a, 0x93, 0xf1, 0xa2, 0xd2, 0x28, 0x45, 0x98, 0xf4, 0x5a, 0x39, 0x1b, 0x11, 0x9e, 0xd8, + 0x7b, 0x0a, 0x79, 0x47, 0xb3, 0x1c, 0x62, 0xa0, 0x78, 0x44, 0x16, 0x34, 0x1b, 0xab, 0xfe, 0x6f, + 0x67, 0x9f, 0xc2, 0x38, 0x50, 0x60, 0xae, 0xb8, 0xba, 0xda, 0xac, 0xa9, 0xcd, 0x6a, 0xad, 0xb1, + 0x52, 0xa9, 0x2e, 0xd3, 0x11, 0xb2, 0xb2, 0x5c, 0xad, 0xa9, 0x65, 0x3a, 0x40, 0xd6, 0x0b, 0x19, + 0x7a, 0x87, 0xf3, 0xc2, 0x24, 0xe4, 0xbb, 0x44, 0xba, 0xe8, 0xf3, 0x72, 0xc2, 0xf0, 0x03, 0x3e, + 0x4e, 0x11, 0xb7, 0xcc, 0x72, 0x47, 0x00, 0xa4, 0x3e, 0x47, 0x74, 0xcf, 0xc2, 0x0c, 0x35, 0xad, + 0x6d, 0xb2, 0x9b, 0x42, 0x90, 0x93, 0x55, 0x2e, 0x0d, 0x7d, 0x50, 0x4a, 0x10, 0x93, 0xa0, 0x2f, + 0x47, 0xc9, 0x8c, 0x8b, 0x3f, 0xcf, 0x0c, 0x77, 0x0b, 0x44, 0xa5, 0xda, 0x28, 0xab, 0xd5, 0xe2, + 0x2a, 0xcb, 0x22, 0x2b, 0xa7, 0xe0, 0x78, 0xb5, 0xc6, 0x42, 0x2c, 0xd6, 0x9b, 0x8d, 0x5a, 0xb3, + 0xb2, 0xb6, 0x5e, 0x53, 0x1b, 0x85, 0x9c, 0x72, 0x12, 0x14, 0xfa, 0xdc, 0xac, 0xd4, 0x9b, 0xa5, + 0x62, 0xb5, 0x54, 0x5e, 0x2d, 0x2f, 0x16, 0xf2, 0xca, 0x93, 0xe0, 0x3a, 0x7a, 0xab, 0x50, 0x6d, + 0xa9, 0xa9, 0xd6, 0xce, 0xd7, 0x5d, 0x04, 0xd5, 0xf2, 0x6a, 0xd1, 0x55, 0xa4, 0xd0, 0x5d, 0xce, + 0x13, 0xca, 0x15, 0x70, 0x94, 0x5c, 0xf4, 0xbe, 0x5a, 0x2b, 0x2e, 0xb2, 0xf2, 0x26, 0x95, 0x6b, + 0xe0, 0x54, 0xa5, 0x5a, 0xdf, 0x58, 0x5a, 0xaa, 0x94, 0x2a, 0xe5, 0x6a, 0xa3, 0xb9, 0x5e, 0x56, + 0xd7, 0x2a, 0xf5, 0xba, 0xfb, 0x6f, 0x61, 0x8a, 0xdc, 0x94, 0x4b, 0xfb, 0x4c, 0xf4, 0x4e, 0x19, + 0x66, 0xcf, 0x69, 0x1d, 0xdd, 0x1d, 0x28, 0xc8, 0x15, 0xda, 0x3d, 0xa7, 0x77, 0x1c, 0x72, 0xd5, + 0x36, 0xf3, 0xff, 0x27, 0x2f, 0xe8, 0x27, 0xe5, 0x84, 0xa7, 0x77, 0x18, 0x10, 0xb4, 0xc4, 0x79, + 0xae, 0xb4, 0x88, 0xb9, 0xe6, 0x2b, 0xa5, 0x04, 0xa7, 0x77, 0xc4, 0xc9, 0x27, 0x03, 0xff, 0xd7, + 0x47, 0x05, 0x7e, 0x01, 0x66, 0x36, 0xaa, 0xc5, 0x8d, 0xc6, 0x4a, 0x4d, 0xad, 0xfc, 0x30, 0x09, + 0xfe, 0x3e, 0x0b, 0x53, 0x4b, 0x35, 0x75, 0xa1, 0xb2, 0xb8, 0x58, 0xae, 0x16, 0x72, 0xca, 0x95, + 0x70, 0x45, 0xbd, 0xac, 0x9e, 0xab, 0x94, 0xca, 0xcd, 0x8d, 0x6a, 0xf1, 0x5c, 0xb1, 0xb2, 0x4a, + 0xfa, 0x88, 0x7c, 0xcc, 0xf5, 0xdf, 0x13, 0xe8, 0xc7, 0xb3, 0x00, 0xb4, 0xea, 0xe4, 0xee, 0xa3, + 0xd0, 0x25, 0xd1, 0x9f, 0x49, 0x3a, 0x69, 0x08, 0xc8, 0x44, 0xb4, 0xdf, 0x0a, 0x4c, 0x5a, 0xec, + 0x03, 0x5b, 0xcd, 0x1a, 0x44, 0x87, 0x3e, 0x7a, 0xd4, 0x54, 0xff, 0x77, 0xf4, 0xae, 0x24, 0x73, + 0x84, 0x48, 0xc6, 0x92, 0x21, 0xb9, 0x34, 0x1a, 0x20, 0xd1, 0x0b, 0x33, 0x30, 0xc7, 0x57, 0xcc, + 0xad, 0x04, 0x31, 0xa6, 0xc4, 0x2a, 0xc1, 0xff, 0x1c, 0x32, 0xb2, 0xce, 0x3e, 0x95, 0x0d, 0xa7, + 0xe0, 0xb5, 0x4c, 0x7a, 0x10, 0xdf, 0xb3, 0x58, 0x0a, 0x19, 0x97, 0x79, 0xd7, 0xe8, 0x28, 0x48, + 0xca, 0x04, 0xc8, 0x8d, 0x87, 0x9d, 0x82, 0x8c, 0xbe, 0x28, 0xc3, 0x2c, 0x77, 0x0b, 0x35, 0x7a, + 0x65, 0x46, 0xe4, 0x86, 0xd8, 0xd0, 0xfd, 0xd6, 0x99, 0x83, 0xde, 0x6f, 0x7d, 0xf6, 0x16, 0x98, + 0x60, 0x69, 0x44, 0xbe, 0xb5, 0xaa, 0x6b, 0x0a, 0x1c, 0x85, 0xe9, 0xe5, 0x72, 0xa3, 0x59, 0x6f, + 0x14, 0xd5, 0x46, 0x79, 0xb1, 0x90, 0x71, 0x07, 0xbe, 0xf2, 0xda, 0x7a, 0xe3, 0xc1, 0x82, 0x94, + 0xdc, 0x21, 0xb2, 0x97, 0x91, 0x31, 0x3b, 0x44, 0xc6, 0x15, 0x9f, 0xfe, 0x5c, 0xf5, 0x13, 0x32, + 0x14, 0x28, 0x07, 0xe5, 0x87, 0xbb, 0xd8, 0xd2, 0xb1, 0xd1, 0xc2, 0xe8, 0xa2, 0x48, 0x00, 0xd6, + 0x7d, 0xa1, 0x09, 0x49, 0x7f, 0x1e, 0xb2, 0x12, 0xe9, 0x4b, 0x8f, 0x81, 0x9d, 0xdd, 0x67, 0x60, + 0x7f, 0x3c, 0xa9, 0x47, 0x64, 0x2f, 0xbb, 0x23, 0x81, 0xec, 0x23, 0x49, 0x3c, 0x22, 0x07, 0x70, + 0x30, 0x96, 0xb8, 0xca, 0x11, 0xe3, 0x6f, 0x41, 0x46, 0x2f, 0x90, 0xe1, 0xe8, 0xa2, 0xe6, 0xe0, + 0x85, 0xcb, 0x0d, 0xef, 0x96, 0xc8, 0x88, 0x9b, 0x9d, 0x33, 0xfb, 0x6e, 0x76, 0x0e, 0x2e, 0x9a, + 0x94, 0x7a, 0x2e, 0x9a, 0x44, 0x6f, 0x4b, 0x7a, 0x86, 0xb2, 0x87, 0x87, 0x91, 0x05, 0x3f, 0x4e, + 0x76, 0x36, 0x32, 0x9e, 0x8b, 0xf4, 0x1b, 0xd8, 0x9b, 0xa6, 0xa0, 0x40, 0x59, 0x09, 0x39, 0xfd, + 0xfd, 0x22, 0xbb, 0x0c, 0xbd, 0x99, 0x20, 0xc6, 0xa2, 0x17, 0xb5, 0x42, 0xe2, 0xa3, 0x56, 0x70, + 0x6b, 0xc8, 0x72, 0xaf, 0xa3, 0x46, 0xd2, 0xce, 0x30, 0xe4, 0xe1, 0x17, 0x1d, 0xd6, 0x36, 0xbd, + 0xce, 0x30, 0xb6, 0xf8, 0xf1, 0x5c, 0xd8, 0xcb, 0xae, 0xd5, 0x2c, 0x8b, 0x22, 0x13, 0x7f, 0x2f, + 0x79, 0x52, 0x77, 0x6f, 0xce, 0xc3, 0x32, 0xe6, 0xb2, 0xee, 0xf4, 0xdc, 0xbd, 0x07, 0x71, 0x90, + 0x3e, 0x0a, 0xdf, 0x91, 0x20, 0x5b, 0x37, 0x2d, 0x67, 0x54, 0x18, 0x24, 0xdd, 0xa2, 0x0e, 0x49, + 0xa0, 0x1e, 0x3d, 0xe7, 0x4c, 0x6f, 0x8b, 0x3a, 0xbe, 0xfc, 0x31, 0x84, 0xa9, 0x3c, 0x0a, 0x73, + 0x94, 0x13, 0xff, 0x0e, 0x97, 0x6f, 0x4b, 0xb4, 0xbf, 0x7a, 0x40, 0x14, 0x11, 0xb2, 0xf1, 0xe1, + 0x6f, 0x11, 0x7b, 0xa0, 0x70, 0x69, 0xe8, 0xb5, 0x61, 0x5c, 0x16, 0x79, 0x5c, 0xfa, 0xcd, 0xb8, + 0xfd, 0x6b, 0x50, 0x46, 0xd5, 0x33, 0x25, 0x89, 0x78, 0x19, 0x53, 0x78, 0xfa, 0x88, 0x3c, 0x22, + 0x43, 0x9e, 0xb9, 0xe8, 0x8d, 0x14, 0x81, 0xa4, 0x2d, 0xc3, 0x17, 0x82, 0x98, 0x2b, 0x9f, 0x3c, + 0xea, 0x96, 0x11, 0x5f, 0x7e, 0xfa, 0x38, 0xfc, 0x3b, 0xf3, 0x3d, 0x2d, 0xee, 0x69, 0x7a, 0x47, + 0xbb, 0xd0, 0x49, 0x10, 0x69, 0xfa, 0x83, 0x09, 0x4f, 0xdb, 0xf9, 0x55, 0xe5, 0xca, 0x8b, 0x90, + 0xf8, 0x0f, 0xc0, 0x94, 0xc5, 0xed, 0xf5, 0xb9, 0x56, 0x54, 0x8f, 0xdf, 0x2f, 0xfb, 0xae, 0x06, + 0x39, 0x13, 0x1d, 0xad, 0x13, 0xe2, 0x67, 0x2c, 0x47, 0x81, 0xa6, 0x8b, 0xed, 0xf6, 0x12, 0xd6, + 0x9c, 0x5d, 0x0b, 0xb7, 0x13, 0x0d, 0x11, 0x56, 0xcf, 0x76, 0x68, 0x48, 0x12, 0x5c, 0xac, 0xc7, + 0x55, 0x1e, 0x9d, 0xa7, 0x0f, 0xe8, 0x0d, 0x3c, 0x5e, 0x46, 0xd2, 0x25, 0xbd, 0xd1, 0x87, 0xa4, + 0xc6, 0x41, 0xf2, 0xcc, 0xe1, 0x98, 0x48, 0x1f, 0x90, 0x5f, 0x96, 0x61, 0x8e, 0xda, 0x09, 0xa3, + 0xc6, 0xe4, 0xf7, 0x13, 0xba, 0xf4, 0x84, 0x6e, 0xc9, 0x0a, 0xb3, 0x33, 0x12, 0x58, 0x92, 0x38, + 0x00, 0x89, 0xf1, 0x91, 0x3e, 0x32, 0x9f, 0xca, 0x03, 0x84, 0xdc, 0x34, 0x3f, 0x98, 0x0f, 0xe2, + 0x2e, 0xa2, 0x37, 0xb3, 0xf9, 0x47, 0x9d, 0x0b, 0x02, 0x1e, 0x72, 0xc1, 0xf4, 0x37, 0xa4, 0xf8, + 0x44, 0xa1, 0x51, 0xe5, 0xcf, 0x13, 0xda, 0xbc, 0xcc, 0x49, 0x72, 0xe0, 0xe0, 0x3e, 0x64, 0x2f, + 0xf7, 0xa1, 0x04, 0xc6, 0xef, 0x20, 0x56, 0x92, 0xa1, 0xb6, 0x3a, 0xc4, 0xcc, 0xfe, 0x14, 0x1c, + 0x57, 0xcb, 0xc5, 0xc5, 0x5a, 0x75, 0xf5, 0xc1, 0xf0, 0x95, 0x49, 0x05, 0x39, 0x3c, 0x39, 0x49, + 0x05, 0xb6, 0x57, 0x27, 0xec, 0x03, 0x79, 0x59, 0xc5, 0xcd, 0x56, 0x42, 0x8b, 0x2b, 0x83, 0x7b, + 0x35, 0x01, 0xb2, 0x87, 0x89, 0xc2, 0x23, 0x10, 0x6a, 0x46, 0x3f, 0x2d, 0x43, 0x81, 0xf8, 0xfe, + 0x10, 0x2e, 0xd9, 0xdd, 0x78, 0x35, 0xde, 0x8b, 0xb3, 0x4b, 0xf7, 0x9f, 0x02, 0x2f, 0x4e, 0x2f, + 0x41, 0xb9, 0x01, 0xe6, 0x5a, 0xdb, 0xb8, 0x75, 0xb1, 0x62, 0x78, 0xfb, 0xea, 0x74, 0x13, 0xb6, + 0x27, 0x95, 0x07, 0xe6, 0x01, 0x1e, 0x18, 0x7e, 0x12, 0xcd, 0x0d, 0xd2, 0x61, 0xa6, 0x22, 0x70, + 0xf9, 0x23, 0x1f, 0x97, 0x2a, 0x87, 0xcb, 0x9d, 0x43, 0x51, 0x4d, 0x06, 0x4b, 0x75, 0x08, 0x58, + 0x10, 0x9c, 0xac, 0xad, 0x37, 0x2a, 0xb5, 0x6a, 0x73, 0xa3, 0x5e, 0x5e, 0x6c, 0x2e, 0x78, 0xe0, + 0xd4, 0x0b, 0x32, 0xfa, 0xaa, 0x04, 0x13, 0x94, 0x2d, 0x1b, 0x3d, 0x39, 0x80, 0x60, 0xa0, 0xfb, + 0x2a, 0x7a, 0x93, 0x70, 0x30, 0x0a, 0x5f, 0x10, 0xac, 0x9c, 0x88, 0x7e, 0xea, 0x19, 0x30, 0x41, + 0x41, 0xf6, 0x56, 0xb4, 0x4e, 0x47, 0xf4, 0x52, 0x8c, 0x8c, 0xea, 0x65, 0x17, 0x0c, 0x4c, 0x31, + 0x80, 0x8d, 0xf4, 0x47, 0x96, 0xe7, 0x64, 0xa9, 0x19, 0x7c, 0x5e, 0x77, 0xb6, 0x89, 0x77, 0x2b, + 0xfa, 0x21, 0x91, 0xe5, 0xc5, 0x9b, 0x21, 0xb7, 0xe7, 0xe6, 0x1e, 0xe0, 0x29, 0x4c, 0x33, 0xa1, + 0x5f, 0x17, 0x8e, 0x83, 0xca, 0xe9, 0xa7, 0xcf, 0x53, 0x04, 0x38, 0x6b, 0x90, 0xed, 0xe8, 0xb6, + 0xc3, 0xc6, 0x8f, 0x3b, 0x12, 0x11, 0xf2, 0x1e, 0x2a, 0x0e, 0xde, 0x51, 0x09, 0x19, 0x74, 0x3f, + 0xcc, 0x84, 0x53, 0x05, 0xbc, 0xa5, 0x4f, 0xc1, 0x04, 0x3b, 0xc5, 0xc7, 0x96, 0x58, 0xbd, 0x57, + 0xc1, 0x65, 0x4d, 0xa1, 0xda, 0xa6, 0xaf, 0x03, 0xff, 0xf7, 0x51, 0x98, 0x58, 0xd1, 0x6d, 0xc7, + 0xb4, 0x2e, 0xa3, 0x47, 0x33, 0x30, 0x71, 0x0e, 0x5b, 0xb6, 0x6e, 0x1a, 0xfb, 0x5c, 0x0d, 0xce, + 0xc0, 0x74, 0xd7, 0xc2, 0x7b, 0xba, 0xb9, 0x6b, 0x07, 0x8b, 0x33, 0xe1, 0x24, 0x05, 0xc1, 0xa4, + 0xb6, 0xeb, 0x6c, 0x9b, 0x56, 0x10, 0xfc, 0xc3, 0x7b, 0x57, 0x4e, 0x03, 0xd0, 0xe7, 0xaa, 0xb6, + 0x83, 0x99, 0x03, 0x45, 0x28, 0x45, 0x51, 0x20, 0xeb, 0xe8, 0x3b, 0x98, 0x45, 0x03, 0x26, 0xcf, + 0xae, 0x80, 0x49, 0x64, 0x3d, 0x16, 0xc1, 0x50, 0x56, 0xbd, 0x57, 0xf4, 0x59, 0x19, 0xa6, 0x97, + 0xb1, 0xc3, 0x58, 0xb5, 0xd1, 0x8b, 0x32, 0x42, 0x17, 0x70, 0xb8, 0x63, 0x6c, 0x47, 0xb3, 0xbd, + 0xff, 0xfc, 0x25, 0x58, 0x3e, 0x31, 0x08, 0x4d, 0x2c, 0x87, 0xe3, 0x92, 0x93, 0x38, 0x75, 0x4e, + 0x85, 0xba, 0xc1, 0xb2, 0xcc, 0x6c, 0x13, 0x64, 0xff, 0x07, 0xf4, 0x76, 0x49, 0xf4, 0x8c, 0x37, + 0x93, 0xfd, 0x7c, 0xa8, 0x3e, 0x91, 0xdd, 0xd1, 0xe4, 0x1e, 0xcb, 0xb1, 0x2f, 0xe4, 0x7c, 0x98, + 0x12, 0x23, 0xa3, 0xfa, 0xb9, 0x05, 0x4f, 0x87, 0x0f, 0xe6, 0x24, 0x7d, 0x6d, 0xfc, 0xa6, 0x0c, + 0xd3, 0xf5, 0x6d, 0xf3, 0x92, 0x27, 0xc7, 0x1f, 0x15, 0x03, 0xf6, 0x1a, 0x98, 0xda, 0xeb, 0x01, + 0x35, 0x48, 0x88, 0xbe, 0x12, 0x1f, 0x3d, 0x5f, 0x4e, 0x0a, 0x53, 0x88, 0xb9, 0x91, 0x5f, 0x58, + 0xaf, 0x3c, 0x1d, 0x26, 0x18, 0xd7, 0x6c, 0xc9, 0x25, 0x1e, 0x60, 0x2f, 0x73, 0xb8, 0x82, 0x59, + 0xbe, 0x82, 0xc9, 0x90, 0x8f, 0xae, 0x5c, 0xfa, 0xc8, 0xff, 0x89, 0x44, 0x62, 0x83, 0x78, 0xc0, + 0x97, 0x46, 0x00, 0x3c, 0xfa, 0x56, 0x46, 0x74, 0x61, 0xd2, 0x97, 0x80, 0xcf, 0xc1, 0x81, 0x2e, + 0xd7, 0x19, 0x48, 0x2e, 0x7d, 0x79, 0xfe, 0x5a, 0x16, 0x66, 0x16, 0xf5, 0xcd, 0x4d, 0xbf, 0x93, + 0x7c, 0xb1, 0x60, 0x27, 0x19, 0xed, 0x0e, 0xe0, 0xda, 0xb9, 0xbb, 0x96, 0x85, 0x0d, 0xaf, 0x52, + 0xac, 0x39, 0xf5, 0xa4, 0x2a, 0x37, 0xc2, 0x51, 0x6f, 0x5c, 0x08, 0x77, 0x94, 0x53, 0x6a, 0x6f, + 0x32, 0xfa, 0x86, 0xf0, 0xae, 0x96, 0x27, 0xd1, 0x70, 0x95, 0x22, 0x1a, 0xe0, 0x5d, 0x30, 0xbb, + 0x4d, 0x73, 0x93, 0xa9, 0xbf, 0xd7, 0x59, 0x9e, 0xec, 0x89, 0xbd, 0xbc, 0x86, 0x6d, 0x5b, 0xdb, + 0xc2, 0x2a, 0x9f, 0xb9, 0xa7, 0xf9, 0xca, 0x49, 0x6e, 0x12, 0x13, 0xdb, 0x20, 0x13, 0xa8, 0xc9, + 0x18, 0xb4, 0xe3, 0x2c, 0x64, 0x97, 0xf4, 0x0e, 0x46, 0x3f, 0x23, 0xc1, 0x94, 0x8a, 0x5b, 0xa6, + 0xd1, 0x72, 0xdf, 0x42, 0xce, 0x41, 0xff, 0x98, 0x11, 0xbd, 0x41, 0xd3, 0xa5, 0x33, 0xef, 0xd3, + 0x88, 0x68, 0x37, 0x62, 0x37, 0x65, 0xc6, 0x92, 0x1a, 0xc3, 0x7d, 0x27, 0xee, 0xd4, 0x63, 0x73, + 0xb3, 0x63, 0x6a, 0xdc, 0xe2, 0x57, 0xaf, 0x29, 0x74, 0x13, 0x14, 0xbc, 0x23, 0x37, 0xa6, 0xb3, + 0xae, 0x1b, 0x86, 0x7f, 0xa6, 0x7b, 0x5f, 0x3a, 0xbf, 0x6f, 0x1b, 0x1b, 0x16, 0x87, 0xd4, 0x9d, + 0x95, 0x1e, 0xa1, 0xd9, 0x37, 0xc0, 0xdc, 0x85, 0xcb, 0x0e, 0xb6, 0x59, 0x2e, 0x56, 0x6c, 0x56, + 0xed, 0x49, 0x0d, 0x05, 0xb5, 0x8e, 0x0b, 0x9f, 0x13, 0x53, 0x60, 0x32, 0x51, 0xaf, 0x0c, 0x31, + 0x03, 0x3c, 0x0e, 0x85, 0x6a, 0x6d, 0xb1, 0x4c, 0x7c, 0xd5, 0x3c, 0xef, 0x9f, 0x2d, 0xf4, 0x0b, + 0x32, 0xcc, 0x10, 0x67, 0x12, 0x0f, 0x85, 0xeb, 0x04, 0xe6, 0x23, 0xe8, 0x31, 0x61, 0x3f, 0x36, + 0x52, 0xe5, 0x70, 0x01, 0xd1, 0x82, 0xde, 0xd4, 0x3b, 0xbd, 0x82, 0xce, 0xa9, 0x3d, 0xa9, 0x7d, + 0x00, 0x91, 0xfb, 0x02, 0xf2, 0xbb, 0x42, 0xce, 0x6c, 0x83, 0xb8, 0x3b, 0x2c, 0x54, 0x7e, 0x4f, + 0x86, 0x69, 0x77, 0x92, 0xe2, 0x81, 0x52, 0xe3, 0x40, 0x31, 0x8d, 0xce, 0xe5, 0x60, 0x59, 0xc4, + 0x7b, 0x4d, 0xd4, 0x48, 0xfe, 0x52, 0x78, 0xe6, 0x4e, 0x44, 0x14, 0xe2, 0x65, 0x4c, 0xf8, 0xbd, + 0x5b, 0x68, 0x3e, 0x3f, 0x80, 0xb9, 0xc3, 0x82, 0xef, 0xcb, 0x39, 0xc8, 0x6f, 0x74, 0x09, 0x72, + 0xbf, 0x2e, 0x8b, 0x04, 0x88, 0xdf, 0x77, 0x90, 0xc1, 0x35, 0xb3, 0x3a, 0x66, 0x4b, 0xeb, 0xac, + 0x07, 0x27, 0xc2, 0x82, 0x04, 0xe5, 0x4e, 0xe6, 0xdb, 0x48, 0x4f, 0x37, 0xde, 0x10, 0x1b, 0x3b, + 0x9d, 0xc8, 0x28, 0x74, 0x68, 0xe4, 0x66, 0x38, 0xd6, 0xd6, 0x6d, 0xed, 0x42, 0x07, 0x97, 0x8d, + 0x96, 0x75, 0x99, 0x8a, 0x83, 0x4d, 0xab, 0xf6, 0x7d, 0x50, 0xee, 0x86, 0x9c, 0xed, 0x5c, 0xee, + 0xd0, 0x79, 0x62, 0xf8, 0x8c, 0x49, 0x64, 0x51, 0x75, 0x37, 0xbb, 0x4a, 0xff, 0x0a, 0xbb, 0x28, + 0x4d, 0x08, 0x5e, 0x9f, 0xfd, 0x54, 0xc8, 0x9b, 0x96, 0xbe, 0xa5, 0xd3, 0xeb, 0x90, 0xe6, 0xf6, + 0x85, 0x08, 0xa4, 0xa6, 0x40, 0x8d, 0x64, 0x51, 0x59, 0x56, 0xe5, 0xe9, 0x30, 0xa5, 0xef, 0x68, + 0x5b, 0xf8, 0x01, 0xdd, 0xa0, 0x07, 0x28, 0xe7, 0x6e, 0x3f, 0xb5, 0xef, 0xf8, 0x0c, 0xfb, 0xae, + 0x06, 0x59, 0xd1, 0xbb, 0x25, 0xd1, 0x38, 0x46, 0xa4, 0x6e, 0x14, 0xd4, 0xb1, 0x5c, 0x23, 0x8e, + 0x5e, 0x21, 0x14, 0x61, 0x28, 0x9a, 0xad, 0xf4, 0x07, 0xef, 0x4f, 0x4b, 0x30, 0xb9, 0x68, 0x5e, + 0x32, 0x88, 0xa2, 0xdf, 0x21, 0x66, 0xeb, 0xf6, 0x39, 0xe4, 0xc8, 0xdf, 0xd2, 0x19, 0x7b, 0xa2, + 0x81, 0xd4, 0xd6, 0x2b, 0x32, 0x02, 0x86, 0xd8, 0x96, 0x23, 0x78, 0x77, 0x62, 0x5c, 0x39, 0xe9, + 0xcb, 0xf5, 0x4f, 0x65, 0xc8, 0x2e, 0x5a, 0x66, 0x17, 0xbd, 0x31, 0x93, 0xc0, 0x65, 0xa1, 0x6d, + 0x99, 0xdd, 0x06, 0xb9, 0xfc, 0x2c, 0x38, 0xc6, 0x11, 0x4e, 0x53, 0xee, 0x80, 0xc9, 0xae, 0x69, + 0xeb, 0x8e, 0x37, 0x8d, 0x98, 0xbb, 0xfd, 0x09, 0x7d, 0x5b, 0xf3, 0x3a, 0xcb, 0xa4, 0xfa, 0xd9, + 0xdd, 0x5e, 0x9b, 0x88, 0xd0, 0x95, 0x8b, 0x2b, 0x46, 0xef, 0x02, 0xb8, 0x9e, 0x54, 0xf4, 0x92, + 0x30, 0x92, 0xcf, 0xe4, 0x91, 0x7c, 0x62, 0x1f, 0x09, 0x5b, 0x66, 0x77, 0x24, 0x9b, 0x8c, 0x2f, + 0xf3, 0x51, 0xbd, 0x87, 0x43, 0xf5, 0x26, 0xa1, 0x32, 0xd3, 0x47, 0xf4, 0xdd, 0x59, 0x00, 0x62, + 0x66, 0x6c, 0xb8, 0x13, 0x20, 0x31, 0x1b, 0xeb, 0xa7, 0xb2, 0x21, 0x59, 0x16, 0x79, 0x59, 0x3e, + 0x39, 0xc2, 0x8a, 0x21, 0xe4, 0x23, 0x24, 0x5a, 0x84, 0xdc, 0xae, 0xfb, 0x99, 0x49, 0x54, 0x90, + 0x04, 0x79, 0x55, 0xe9, 0x9f, 0xe8, 0x4f, 0x32, 0x90, 0x23, 0x09, 0xca, 0x69, 0x00, 0x32, 0xb0, + 0xd3, 0x03, 0x41, 0x19, 0x32, 0x84, 0x87, 0x52, 0x88, 0xb6, 0xea, 0x6d, 0xf6, 0x99, 0x9a, 0xcc, + 0x41, 0x82, 0xfb, 0x37, 0x19, 0xee, 0x09, 0x2d, 0x66, 0x00, 0x84, 0x52, 0xdc, 0xbf, 0xc9, 0xdb, + 0x2a, 0xde, 0xa4, 0x71, 0xa9, 0xb3, 0x6a, 0x90, 0xe0, 0xff, 0xbd, 0xea, 0xdf, 0x66, 0xe6, 0xfd, + 0x4d, 0x52, 0xdc, 0xc9, 0x30, 0x51, 0xcb, 0x85, 0xa0, 0x88, 0x3c, 0xc9, 0xd4, 0x9b, 0x8c, 0x5e, + 0xed, 0xab, 0xcd, 0x22, 0xa7, 0x36, 0xb7, 0x26, 0x10, 0x6f, 0xfa, 0xca, 0xf3, 0xc5, 0x1c, 0x4c, + 0x55, 0xcd, 0x36, 0xd3, 0x9d, 0xd0, 0x84, 0xf1, 0x23, 0xb9, 0x44, 0x13, 0x46, 0x9f, 0x46, 0x84, + 0x82, 0xdc, 0xc7, 0x2b, 0x88, 0x18, 0x85, 0xb0, 0x7e, 0x28, 0x0b, 0x90, 0x27, 0xda, 0xbb, 0xff, + 0x9a, 0xac, 0x38, 0x12, 0x44, 0xb4, 0x2a, 0xfb, 0xf3, 0x3f, 0x9c, 0x8e, 0xfd, 0x57, 0xc8, 0x91, + 0x0a, 0xc6, 0xec, 0xee, 0xf0, 0x15, 0x95, 0xe2, 0x2b, 0x2a, 0xc7, 0x57, 0x34, 0xdb, 0x5b, 0xd1, + 0x24, 0xeb, 0x00, 0x51, 0x1a, 0x92, 0xbe, 0x8e, 0xff, 0xc3, 0x04, 0x40, 0x55, 0xdb, 0xd3, 0xb7, + 0xe8, 0xee, 0xf0, 0x67, 0xbd, 0xf9, 0x0f, 0xdb, 0xc7, 0xfd, 0x6f, 0xa1, 0x81, 0xf0, 0x0e, 0x98, + 0x60, 0xe3, 0x1e, 0xab, 0xc8, 0xb5, 0x5c, 0x45, 0x02, 0x2a, 0xd4, 0x2c, 0x7d, 0xd8, 0x51, 0xbd, + 0xfc, 0xdc, 0x8d, 0xbe, 0x52, 0xcf, 0x8d, 0xbe, 0xfd, 0xf7, 0x20, 0x22, 0xee, 0xf9, 0x45, 0xef, + 0x10, 0xf6, 0xe8, 0x0f, 0xf1, 0x13, 0xaa, 0x51, 0x44, 0x13, 0x7c, 0x2a, 0x4c, 0x98, 0xfe, 0x86, + 0xb6, 0x1c, 0xb9, 0x0e, 0x56, 0x31, 0x36, 0x4d, 0xd5, 0xcb, 0x29, 0xb8, 0xf9, 0x25, 0xc4, 0xc7, + 0x58, 0x0e, 0xcd, 0x9c, 0x5c, 0xf6, 0x62, 0x7c, 0xb9, 0xf5, 0x38, 0xaf, 0x3b, 0xdb, 0xab, 0xba, + 0x71, 0xd1, 0x46, 0xff, 0x59, 0xcc, 0x82, 0x0c, 0xe1, 0x2f, 0x25, 0xc3, 0x9f, 0x8f, 0xd9, 0x51, + 0xe7, 0x51, 0xbb, 0x3b, 0x8a, 0x4a, 0x7f, 0x6e, 0x23, 0x00, 0xbc, 0x13, 0xf2, 0x94, 0x51, 0xd6, + 0x89, 0x9e, 0x8d, 0xc4, 0xcf, 0xa7, 0xa4, 0xb2, 0x3f, 0xd0, 0xdb, 0x7d, 0x1c, 0xcf, 0x71, 0x38, + 0x2e, 0x1c, 0x88, 0xb3, 0xd4, 0x21, 0x3d, 0x7b, 0x1b, 0x4c, 0x30, 0x49, 0x2b, 0x73, 0xe1, 0x56, + 0x5c, 0x38, 0xa2, 0x00, 0xe4, 0xd7, 0xcc, 0x3d, 0xdc, 0x30, 0x0b, 0x19, 0xf7, 0xd9, 0xe5, 0xaf, + 0x61, 0x16, 0x24, 0xf4, 0xf2, 0x49, 0x98, 0xf4, 0x83, 0x2b, 0x7d, 0x5a, 0x82, 0x42, 0xc9, 0xc2, + 0x9a, 0x83, 0x97, 0x2c, 0x73, 0x87, 0xd6, 0x48, 0xdc, 0x3b, 0xf4, 0x97, 0x85, 0x5d, 0x3c, 0xfc, + 0xa0, 0x47, 0xbd, 0x85, 0x45, 0x60, 0x49, 0x17, 0x21, 0x25, 0x6f, 0x11, 0x12, 0xbd, 0x41, 0xc8, + 0xe5, 0x43, 0xb4, 0x94, 0xf4, 0x9b, 0xda, 0xc7, 0x25, 0xc8, 0x95, 0x3a, 0xa6, 0x81, 0xc3, 0x47, + 0x98, 0x06, 0x9e, 0x95, 0xe9, 0xbf, 0x13, 0x81, 0x9e, 0x23, 0x89, 0xda, 0x1a, 0x81, 0x00, 0xdc, + 0xb2, 0x05, 0x65, 0x2b, 0x36, 0x48, 0xc5, 0x92, 0x4e, 0x5f, 0xa0, 0x5f, 0x95, 0x60, 0x8a, 0xc6, + 0xc5, 0x29, 0x76, 0x3a, 0xe8, 0x09, 0x81, 0x50, 0xfb, 0x04, 0xa8, 0x42, 0xbf, 0x2b, 0xec, 0xa2, + 0xef, 0xd7, 0xca, 0xa7, 0x9d, 0x20, 0x40, 0x50, 0x32, 0x8f, 0x71, 0xb1, 0xbd, 0xb4, 0x81, 0x0c, + 0xa5, 0x2f, 0xea, 0xcf, 0x48, 0xae, 0x01, 0x60, 0x5c, 0x5c, 0xb7, 0xf0, 0x9e, 0x8e, 0x2f, 0xa1, + 0xab, 0x03, 0x61, 0xef, 0x0f, 0xfa, 0xf1, 0x3a, 0xe1, 0x45, 0x9c, 0x10, 0xc9, 0xc8, 0xad, 0xac, + 0xe9, 0x4e, 0x90, 0x89, 0xf5, 0xe2, 0xbd, 0x91, 0x58, 0x42, 0x64, 0xd4, 0x70, 0x76, 0xc1, 0x35, + 0x9b, 0x68, 0x2e, 0xd2, 0x17, 0xec, 0xfb, 0x26, 0x60, 0x72, 0xc3, 0xb0, 0xbb, 0x1d, 0xcd, 0xde, + 0x46, 0xdf, 0x96, 0x21, 0x4f, 0x2f, 0x67, 0x43, 0x3f, 0xc0, 0xc5, 0x16, 0xf8, 0xb1, 0x5d, 0x6c, + 0x79, 0x2e, 0x38, 0xf4, 0xa5, 0xff, 0xdd, 0xf1, 0xe8, 0xdd, 0xb2, 0xe8, 0x24, 0xd5, 0x2b, 0x34, + 0x74, 0x4b, 0x7f, 0xff, 0xe3, 0xec, 0x5d, 0xbd, 0xe5, 0xec, 0x5a, 0xfe, 0x4d, 0xe4, 0x4f, 0x11, + 0xa3, 0xb2, 0x4e, 0xff, 0x52, 0xfd, 0xdf, 0x91, 0x06, 0x13, 0x2c, 0x71, 0xdf, 0x76, 0xd2, 0xfe, + 0xf3, 0xb7, 0x27, 0x21, 0xaf, 0x59, 0x8e, 0x6e, 0x3b, 0x6c, 0x83, 0x95, 0xbd, 0xb9, 0xdd, 0x25, + 0x7d, 0xda, 0xb0, 0x3a, 0x5e, 0x14, 0x12, 0x3f, 0x01, 0xfd, 0x9e, 0xd0, 0xfc, 0x31, 0xbe, 0xe6, + 0xc9, 0x20, 0x7f, 0x60, 0x88, 0x35, 0xea, 0x2b, 0xe1, 0x0a, 0xb5, 0xd8, 0x28, 0x37, 0x69, 0xd0, + 0x0a, 0x3f, 0x3e, 0x45, 0x1b, 0xbd, 0x4d, 0x0e, 0xad, 0xdf, 0x5d, 0xe6, 0xc6, 0x08, 0x26, 0xc5, + 0x60, 0x8c, 0xf0, 0x13, 0x62, 0x76, 0xab, 0xb9, 0x45, 0x58, 0x59, 0x7c, 0x11, 0xf6, 0xb7, 0x85, + 0x77, 0x93, 0x7c, 0x51, 0x0e, 0x58, 0x03, 0x8c, 0xbb, 0xbc, 0xe9, 0x3d, 0x42, 0x3b, 0x43, 0x83, + 0x4a, 0x3a, 0x44, 0xd8, 0x5e, 0x3b, 0x01, 0x13, 0xcb, 0x5a, 0xa7, 0x83, 0xad, 0xcb, 0xee, 0x90, + 0x54, 0xf0, 0x38, 0x5c, 0xd3, 0x0c, 0x7d, 0x13, 0xdb, 0x4e, 0x7c, 0x67, 0xf9, 0x0e, 0xe1, 0xc0, + 0xc0, 0xac, 0x8c, 0xf9, 0x5e, 0xfa, 0x11, 0x32, 0xbf, 0x05, 0xb2, 0xba, 0xb1, 0x69, 0xb2, 0x2e, + 0xb3, 0x77, 0xd5, 0xde, 0xfb, 0x99, 0x4c, 0x5d, 0x48, 0x46, 0xc1, 0xd8, 0xc0, 0x82, 0x5c, 0xa4, + 0xdf, 0x73, 0xfe, 0x4e, 0x16, 0x66, 0x3d, 0x26, 0x2a, 0x46, 0x1b, 0x3f, 0x1c, 0x5e, 0x8a, 0xf9, + 0x85, 0xac, 0xe8, 0x71, 0xb0, 0xde, 0xfa, 0x10, 0x52, 0x11, 0x22, 0x6d, 0x00, 0xb4, 0x34, 0x07, + 0x6f, 0x99, 0x96, 0xee, 0xf7, 0x87, 0x4f, 0x4b, 0x42, 0xad, 0x44, 0xff, 0xbe, 0xac, 0x86, 0xe8, + 0x28, 0x77, 0xc3, 0x34, 0xf6, 0xcf, 0xdf, 0x7b, 0x4b, 0x35, 0xb1, 0x78, 0x85, 0xf3, 0xa3, 0xcf, + 0x08, 0x9d, 0x3a, 0x13, 0xa9, 0x66, 0x32, 0xcc, 0x9a, 0xc3, 0xb5, 0xa1, 0x8d, 0xea, 0x5a, 0x51, + 0xad, 0xaf, 0x14, 0x57, 0x57, 0x2b, 0xd5, 0x65, 0x3f, 0xf0, 0x8b, 0x02, 0x73, 0x8b, 0xb5, 0xf3, + 0xd5, 0x50, 0x64, 0x9e, 0x2c, 0x5a, 0x87, 0x49, 0x4f, 0x5e, 0xfd, 0x7c, 0x31, 0xc3, 0x32, 0x63, + 0xbe, 0x98, 0xa1, 0x24, 0xd7, 0x38, 0xd3, 0x5b, 0xbe, 0x83, 0x0e, 0x79, 0x46, 0x7f, 0xac, 0x41, + 0x8e, 0xac, 0xa9, 0xa3, 0xb7, 0x90, 0x6d, 0xc0, 0x6e, 0x47, 0x6b, 0x61, 0xb4, 0x93, 0xc0, 0x1a, + 0xf7, 0x6e, 0xaa, 0x90, 0xf6, 0xdd, 0x54, 0x41, 0x1e, 0x99, 0xd5, 0x77, 0xbc, 0xdf, 0x3a, 0xbe, + 0x4a, 0xb3, 0xf0, 0x07, 0xb4, 0x62, 0x77, 0x57, 0xe8, 0xf2, 0x3f, 0x63, 0x33, 0x42, 0x25, 0xa3, + 0x79, 0x4a, 0x66, 0x89, 0x8a, 0xed, 0xc3, 0xc4, 0x71, 0x34, 0x86, 0xdb, 0xd4, 0xb3, 0x90, 0xab, + 0x77, 0x3b, 0xba, 0x83, 0x7e, 0x55, 0x1a, 0x09, 0x66, 0xf4, 0x76, 0x11, 0x79, 0xe0, 0xed, 0x22, + 0xc1, 0xae, 0x6b, 0x56, 0x60, 0xd7, 0xb5, 0x81, 0x1f, 0x76, 0xf8, 0x5d, 0xd7, 0x3b, 0x58, 0xf0, + 0x36, 0xba, 0x67, 0xfb, 0xc4, 0x3e, 0x22, 0x25, 0xd5, 0xea, 0x13, 0x15, 0xf0, 0xec, 0x6d, 0x2c, + 0x38, 0x19, 0x40, 0x7e, 0xa1, 0xd6, 0x68, 0xd4, 0xd6, 0x0a, 0x47, 0x48, 0x54, 0x9b, 0xda, 0x3a, + 0x0d, 0x15, 0x53, 0xa9, 0x56, 0xcb, 0x6a, 0x41, 0x22, 0xe1, 0xd2, 0x2a, 0x8d, 0xd5, 0x72, 0x41, + 0xe6, 0x43, 0xcd, 0xc7, 0x9a, 0xdf, 0x7c, 0xd9, 0x69, 0xaa, 0x97, 0x98, 0x21, 0x1e, 0xcd, 0x4f, + 0xfa, 0xca, 0xf5, 0x4b, 0x32, 0xe4, 0xd6, 0xb0, 0xb5, 0x85, 0xd1, 0x8f, 0x25, 0xd8, 0xe4, 0xdb, + 0xd4, 0x2d, 0x9b, 0x06, 0x97, 0x0b, 0x36, 0xf9, 0xc2, 0x69, 0xca, 0xf5, 0x30, 0x6b, 0xe3, 0x96, + 0x69, 0xb4, 0xbd, 0x4c, 0xb4, 0x3f, 0xe2, 0x13, 0xf9, 0x6b, 0xfe, 0x05, 0x20, 0x23, 0x8c, 0x8e, + 0x64, 0xa7, 0x2e, 0x09, 0x30, 0xfd, 0x4a, 0x4d, 0x1f, 0x98, 0x6f, 0xc8, 0xee, 0x4f, 0xdd, 0xcb, + 0xe8, 0xa5, 0xc2, 0xbb, 0xaf, 0x37, 0x43, 0xfe, 0x82, 0x17, 0xa5, 0x58, 0x8e, 0xec, 0x8f, 0x59, + 0x1e, 0x65, 0x01, 0x8e, 0xd9, 0xb8, 0x83, 0x5b, 0x0e, 0x6e, 0xbb, 0x4d, 0x57, 0x1d, 0xd8, 0x29, + 0xec, 0xcf, 0x8e, 0xfe, 0x2c, 0x0c, 0xe0, 0x5d, 0x3c, 0x80, 0x37, 0xf4, 0x11, 0xa5, 0x5b, 0xa1, + 0x68, 0x5b, 0xd9, 0xad, 0x46, 0xbd, 0x63, 0xfa, 0x8b, 0xe2, 0xde, 0xbb, 0xfb, 0x6d, 0xdb, 0xd9, + 0xe9, 0x90, 0x6f, 0xec, 0x80, 0x81, 0xf7, 0xae, 0xcc, 0xc3, 0x84, 0x66, 0x5c, 0x26, 0x9f, 0xb2, + 0x31, 0xb5, 0xf6, 0x32, 0xa1, 0x97, 0xfb, 0xc8, 0xdf, 0xcb, 0x21, 0xff, 0x64, 0x31, 0x76, 0xd3, + 0x07, 0xfe, 0x27, 0x27, 0x20, 0xb7, 0xae, 0xd9, 0x0e, 0x46, 0xff, 0x97, 0x2c, 0x8a, 0xfc, 0x0d, + 0x30, 0xb7, 0x69, 0xb6, 0x76, 0x6d, 0xdc, 0xe6, 0x1b, 0x65, 0x4f, 0xea, 0x28, 0x30, 0x57, 0x6e, + 0x82, 0x82, 0x97, 0xc8, 0xc8, 0x7a, 0xdb, 0xf0, 0xfb, 0xd2, 0x49, 0xe0, 0x72, 0x7b, 0x5d, 0xb3, + 0x9c, 0xda, 0x26, 0x49, 0xf3, 0x03, 0x97, 0x87, 0x13, 0x39, 0xe8, 0xf3, 0x31, 0xd0, 0x4f, 0x44, + 0x43, 0x3f, 0x29, 0x00, 0xbd, 0x52, 0x84, 0xc9, 0x4d, 0xbd, 0x83, 0xc9, 0x0f, 0x53, 0xe4, 0x87, + 0x7e, 0x63, 0x12, 0x91, 0xbd, 0x3f, 0x26, 0x2d, 0xe9, 0x1d, 0xac, 0xfa, 0xbf, 0x79, 0x13, 0x19, + 0x08, 0x26, 0x32, 0xab, 0xd4, 0x9f, 0xd6, 0x35, 0xbc, 0x0c, 0x6d, 0x07, 0x7b, 0x8b, 0x6f, 0x06, + 0x3b, 0xdc, 0xd2, 0xd6, 0x1c, 0x8d, 0x80, 0x31, 0xa3, 0x92, 0x67, 0xde, 0x2f, 0x44, 0xee, 0xf5, + 0x0b, 0x79, 0x9e, 0x9c, 0xac, 0x47, 0xf4, 0x98, 0x8d, 0x68, 0x51, 0x17, 0x3c, 0x80, 0xa8, 0xa5, + 0xe8, 0xbf, 0xbb, 0xc0, 0xb4, 0x34, 0x0b, 0x3b, 0xeb, 0x61, 0x4f, 0x8c, 0x9c, 0xca, 0x27, 0x12, + 0x57, 0x3e, 0xbb, 0xae, 0xed, 0xd0, 0x40, 0xe7, 0x25, 0xf7, 0x1b, 0x73, 0xd1, 0xda, 0x97, 0x1e, + 0xf4, 0xbf, 0xb9, 0x51, 0xf7, 0xbf, 0xfd, 0xea, 0x98, 0x7e, 0x33, 0x7c, 0x65, 0x16, 0xe4, 0xd2, + 0xae, 0xf3, 0xb8, 0xee, 0x7e, 0xbf, 0x23, 0xec, 0xe7, 0xc2, 0xfa, 0xb3, 0xc8, 0x7b, 0xfd, 0xc7, + 0xd4, 0xfb, 0x26, 0xd4, 0x12, 0x31, 0x7f, 0x9a, 0xa8, 0xba, 0xa5, 0xaf, 0x23, 0x6f, 0x94, 0x7d, + 0x07, 0xcb, 0x47, 0x32, 0x07, 0x37, 0xcd, 0x11, 0xed, 0x9f, 0x42, 0x3d, 0x83, 0xff, 0xee, 0x75, + 0x3c, 0x59, 0x2e, 0x56, 0x1f, 0xd9, 0x5e, 0x27, 0xa2, 0x9c, 0x51, 0xe9, 0x0b, 0xfa, 0x35, 0x61, + 0xb7, 0x73, 0x2a, 0xb6, 0x58, 0x57, 0xc2, 0x64, 0x36, 0x95, 0xd8, 0xdd, 0xad, 0x31, 0xc5, 0xa6, + 0x0f, 0xd8, 0xd7, 0xc3, 0xae, 0x82, 0xc5, 0x03, 0x23, 0x86, 0x5e, 0x21, 0xbc, 0x1d, 0x45, 0xab, + 0x3d, 0x60, 0xbd, 0x30, 0x99, 0xbc, 0xc5, 0x36, 0xab, 0x62, 0x0b, 0x4e, 0x5f, 0xe2, 0x5f, 0x93, + 0x21, 0x4f, 0xb7, 0x20, 0xd1, 0xeb, 0x33, 0x09, 0x2e, 0xbd, 0x77, 0x78, 0x17, 0x42, 0xff, 0x3d, + 0xc9, 0x9a, 0x03, 0xe7, 0x6a, 0x98, 0x4d, 0xe4, 0x6a, 0xc8, 0x9f, 0xe3, 0x14, 0x68, 0x47, 0xb4, + 0x8e, 0x29, 0x4f, 0x27, 0x93, 0xb4, 0xb0, 0xbe, 0x0c, 0xa5, 0x8f, 0xf7, 0x4f, 0xe7, 0x60, 0x86, + 0x16, 0x7d, 0x5e, 0x6f, 0x6f, 0x61, 0x07, 0xbd, 0x4d, 0xfa, 0xee, 0x41, 0x5d, 0xa9, 0xc2, 0xcc, + 0x25, 0xc2, 0x36, 0xbd, 0x91, 0x85, 0xad, 0x5c, 0xdc, 0x14, 0xbb, 0xee, 0x41, 0xeb, 0xe9, 0xdd, + 0xe1, 0xc2, 0xfd, 0xef, 0xca, 0x98, 0x2e, 0xf8, 0x53, 0x07, 0xae, 0x3c, 0x31, 0xb2, 0xc2, 0x49, + 0xca, 0x49, 0xc8, 0xef, 0xe9, 0xf8, 0x52, 0xa5, 0xcd, 0xac, 0x5b, 0xf6, 0x86, 0xfe, 0x40, 0x78, + 0xdf, 0x36, 0x0c, 0x37, 0xe3, 0x25, 0x5d, 0x2d, 0x14, 0xdb, 0xbd, 0x1d, 0xc8, 0xd6, 0x18, 0xce, + 0x14, 0xf3, 0x77, 0xa3, 0x96, 0x12, 0x28, 0x62, 0x94, 0xe1, 0xcc, 0x87, 0xf2, 0x88, 0x3d, 0xb1, + 0x42, 0x05, 0x30, 0xe2, 0x6b, 0x53, 0xc5, 0xe2, 0x4b, 0x0c, 0x28, 0x3a, 0x7d, 0xc9, 0xbf, 0x5a, + 0x86, 0xa9, 0x3a, 0x76, 0x96, 0x74, 0xdc, 0x69, 0xdb, 0xc8, 0x3a, 0xb8, 0x69, 0x74, 0x0b, 0xe4, + 0x37, 0x09, 0xb1, 0x41, 0xe7, 0x16, 0x58, 0x36, 0xf4, 0x4a, 0x49, 0x74, 0x47, 0x98, 0xad, 0xbe, + 0x79, 0xdc, 0x8e, 0x04, 0x26, 0x31, 0x8f, 0xde, 0xf8, 0x92, 0xc7, 0x10, 0xd8, 0x56, 0x86, 0x19, + 0x76, 0x99, 0x62, 0xb1, 0xa3, 0x6f, 0x19, 0x68, 0x77, 0x04, 0x2d, 0x44, 0xb9, 0x15, 0x72, 0x9a, + 0x4b, 0x8d, 0x6d, 0xbd, 0xa2, 0xbe, 0x9d, 0x27, 0x29, 0x4f, 0xa5, 0x19, 0x13, 0x84, 0x91, 0x0c, + 0x14, 0xdb, 0xe3, 0x79, 0x8c, 0x61, 0x24, 0x07, 0x16, 0x9e, 0x3e, 0x62, 0x5f, 0x90, 0xe1, 0x38, + 0x63, 0xe0, 0x1c, 0xb6, 0x1c, 0xbd, 0xa5, 0x75, 0x28, 0x72, 0x2f, 0xcc, 0x8c, 0x02, 0xba, 0x15, + 0x98, 0xdd, 0x0b, 0x93, 0x65, 0x10, 0x9e, 0xed, 0x0b, 0x21, 0xc7, 0x80, 0xca, 0xff, 0x98, 0x20, + 0x1c, 0x1f, 0x27, 0x55, 0x8e, 0xe6, 0x18, 0xc3, 0xf1, 0x09, 0x33, 0x91, 0x3e, 0xc4, 0x2f, 0x61, + 0xa1, 0x79, 0x82, 0xee, 0xf3, 0xb3, 0xc2, 0xd8, 0x6e, 0xc0, 0x34, 0xc1, 0x92, 0xfe, 0xc8, 0x96, + 0x21, 0x62, 0x94, 0xd8, 0xef, 0x77, 0xd8, 0x85, 0x61, 0xfe, 0xbf, 0x6a, 0x98, 0x0e, 0x3a, 0x0f, + 0x10, 0x7c, 0x0a, 0x77, 0xd2, 0x99, 0xa8, 0x4e, 0x5a, 0x12, 0xeb, 0xa4, 0x5f, 0x27, 0x1c, 0x2c, + 0xa5, 0x3f, 0xdb, 0x07, 0x57, 0x0f, 0xb1, 0x30, 0x19, 0x83, 0x4b, 0x4f, 0x5f, 0x2f, 0x5e, 0x9e, + 0xed, 0xbd, 0x35, 0xff, 0x83, 0x23, 0x99, 0x4f, 0x85, 0xfb, 0x03, 0xb9, 0xa7, 0x3f, 0x38, 0x80, + 0x25, 0x7d, 0x23, 0x1c, 0xa5, 0x45, 0x94, 0x7c, 0xb6, 0x72, 0x34, 0x14, 0x44, 0x4f, 0x32, 0xfa, + 0xd0, 0x10, 0x4a, 0x30, 0xe8, 0x4a, 0xff, 0xb8, 0x4e, 0x2e, 0x99, 0xb1, 0x9b, 0x54, 0x41, 0xa2, + 0x38, 0x1b, 0x83, 0x5b, 0x68, 0x96, 0x5a, 0xbb, 0x1b, 0xe4, 0x4e, 0x37, 0xf4, 0x17, 0xd9, 0x51, + 0x8c, 0x08, 0xf7, 0x41, 0x96, 0xb8, 0xb8, 0xcb, 0x91, 0x4b, 0x1a, 0x41, 0x91, 0xc1, 0x85, 0x7b, + 0xf8, 0x61, 0x67, 0xe5, 0x88, 0x4a, 0xfe, 0x54, 0x6e, 0x82, 0xa3, 0x17, 0xb4, 0xd6, 0xc5, 0x2d, + 0xcb, 0xdc, 0x25, 0xb7, 0x5f, 0x99, 0xec, 0x1a, 0x2d, 0x72, 0x1d, 0x21, 0xff, 0x41, 0xb9, 0xdd, + 0x33, 0x1d, 0x72, 0x83, 0x4c, 0x87, 0x95, 0x23, 0xcc, 0x78, 0x50, 0x6e, 0xf3, 0x3b, 0x9d, 0x7c, + 0x6c, 0xa7, 0xb3, 0x72, 0xc4, 0xeb, 0x76, 0x94, 0x45, 0x98, 0x6c, 0xeb, 0x7b, 0x64, 0xab, 0x9a, + 0xcc, 0xba, 0x06, 0x1d, 0x5d, 0x5e, 0xd4, 0xf7, 0xe8, 0xc6, 0xf6, 0xca, 0x11, 0xd5, 0xff, 0x53, + 0x59, 0x86, 0x29, 0xb2, 0x2d, 0x40, 0xc8, 0x4c, 0x26, 0x3a, 0x96, 0xbc, 0x72, 0x44, 0x0d, 0xfe, + 0x75, 0xad, 0x8f, 0x2c, 0x39, 0xfb, 0x71, 0xaf, 0xb7, 0xdd, 0x9e, 0x49, 0xb4, 0xdd, 0xee, 0xca, + 0x82, 0x6e, 0xb8, 0x9f, 0x84, 0x5c, 0x8b, 0x48, 0x58, 0x62, 0x12, 0xa6, 0xaf, 0xca, 0x5d, 0x90, + 0xdd, 0xd1, 0x2c, 0x6f, 0xf2, 0x7c, 0xc3, 0x60, 0xba, 0x6b, 0x9a, 0x75, 0xd1, 0x45, 0xd0, 0xfd, + 0x6b, 0x61, 0x02, 0x72, 0x44, 0x70, 0xfe, 0x03, 0x7a, 0x63, 0x96, 0x9a, 0x21, 0x25, 0xd3, 0x70, + 0x87, 0xfd, 0x86, 0xe9, 0x1d, 0x90, 0xf9, 0x83, 0xcc, 0x68, 0x2c, 0xc8, 0xbe, 0xd7, 0xcc, 0xcb, + 0x91, 0xd7, 0xcc, 0xf7, 0xdc, 0x77, 0x9c, 0xed, 0xbd, 0xef, 0x38, 0x58, 0x3e, 0xc8, 0x0d, 0x76, + 0x54, 0xf9, 0xb3, 0x21, 0x4c, 0x97, 0x5e, 0x41, 0x44, 0xcf, 0xc0, 0x3b, 0xba, 0x11, 0xaa, 0xb3, + 0xf7, 0x9a, 0xb0, 0x53, 0x4a, 0x6a, 0xd4, 0x0c, 0x60, 0x2f, 0xfd, 0xbe, 0xe9, 0xb7, 0xb2, 0x70, + 0x8a, 0xde, 0xaa, 0xbd, 0x87, 0x1b, 0x26, 0x7f, 0xdf, 0x24, 0xfa, 0xd8, 0x48, 0x94, 0xa6, 0xcf, + 0x80, 0x23, 0xf7, 0x1d, 0x70, 0xf6, 0x1d, 0x52, 0xce, 0x0e, 0x38, 0xa4, 0x9c, 0x4b, 0xb6, 0x72, + 0xf8, 0xde, 0xb0, 0xfe, 0xac, 0xf3, 0xfa, 0x73, 0x67, 0x04, 0x40, 0xfd, 0xe4, 0x32, 0x12, 0xfb, + 0xe6, 0x2d, 0xbe, 0xa6, 0xd4, 0x39, 0x4d, 0xb9, 0x77, 0x78, 0x46, 0xd2, 0xd7, 0x96, 0xdf, 0xcf, + 0xc2, 0x15, 0x01, 0x33, 0x55, 0x7c, 0x89, 0x29, 0xca, 0xa7, 0x47, 0xa2, 0x28, 0xc9, 0x63, 0x20, + 0xa4, 0xad, 0x31, 0x7f, 0x22, 0x7c, 0x76, 0xa8, 0x17, 0x28, 0x5f, 0x36, 0x11, 0xca, 0x72, 0x12, + 0xf2, 0xb4, 0x87, 0x61, 0xd0, 0xb0, 0xb7, 0x84, 0xdd, 0x8d, 0xd8, 0x89, 0x23, 0x51, 0xde, 0xc6, + 0xa0, 0x3f, 0x6c, 0x5d, 0xa3, 0xb1, 0x6b, 0x19, 0x15, 0xc3, 0x31, 0xd1, 0x4f, 0x8c, 0x44, 0x71, + 0x7c, 0x6f, 0x38, 0x79, 0x18, 0x6f, 0xb8, 0xa1, 0x56, 0x39, 0xbc, 0x1a, 0x1c, 0xca, 0x2a, 0x47, + 0x44, 0xe1, 0xe9, 0xe3, 0xf7, 0x66, 0x19, 0x4e, 0xb2, 0xc9, 0xd6, 0x02, 0x6f, 0x21, 0xa2, 0x07, + 0x47, 0x01, 0xe4, 0x71, 0xcf, 0x4c, 0x62, 0xb7, 0x9c, 0x91, 0x17, 0xfe, 0xa4, 0x54, 0xec, 0xfd, + 0x0e, 0xdc, 0x74, 0xb0, 0x87, 0xc3, 0x91, 0x20, 0x25, 0x76, 0xad, 0x43, 0x02, 0x36, 0xd2, 0xc7, + 0xec, 0xc5, 0x32, 0xe4, 0xe9, 0x39, 0x2d, 0xb4, 0x91, 0x8a, 0xc3, 0x04, 0x1f, 0xe5, 0x59, 0x60, + 0x47, 0x2e, 0xf1, 0x25, 0xf7, 0xe9, 0xed, 0xc5, 0x1d, 0xd2, 0x2d, 0xf6, 0xdf, 0x90, 0x60, 0xba, + 0x8e, 0x9d, 0x92, 0x66, 0x59, 0xba, 0xb6, 0x35, 0x2a, 0x8f, 0x6f, 0x51, 0xef, 0x61, 0xf4, 0xcd, + 0x8c, 0xe8, 0x79, 0x1a, 0x7f, 0x21, 0xdc, 0x63, 0x35, 0x22, 0x96, 0xe0, 0xa3, 0x42, 0x67, 0x66, + 0x06, 0x51, 0x1b, 0x83, 0xc7, 0xb6, 0x04, 0x13, 0xde, 0x59, 0xbc, 0x5b, 0xb8, 0xf3, 0x99, 0xdb, + 0xce, 0x8e, 0x77, 0x0c, 0x86, 0x3c, 0xef, 0x3f, 0x03, 0x86, 0x5e, 0x96, 0xd0, 0x51, 0x3e, 0xfe, + 0x20, 0x61, 0xb2, 0x36, 0x96, 0xc4, 0x1d, 0xfe, 0xb0, 0x8e, 0x0e, 0xfe, 0xee, 0x04, 0x5b, 0x8e, + 0x5c, 0xd5, 0x1c, 0xfc, 0x30, 0xfa, 0xac, 0x0c, 0x13, 0x75, 0xec, 0xb8, 0xe3, 0x2d, 0x77, 0xb9, + 0xe9, 0xb0, 0x1a, 0xae, 0x84, 0x56, 0x3c, 0xa6, 0xd8, 0x1a, 0xc6, 0xfd, 0x30, 0xd5, 0xb5, 0xcc, + 0x16, 0xb6, 0x6d, 0xb6, 0x7a, 0x11, 0x76, 0x54, 0xeb, 0x37, 0xfa, 0x13, 0xd6, 0xe6, 0xd7, 0xbd, + 0x7f, 0xd4, 0xe0, 0xf7, 0xa4, 0x66, 0x00, 0xa5, 0xc4, 0x2a, 0x38, 0x6e, 0x33, 0x20, 0xae, 0xf0, + 0xf4, 0x81, 0xfe, 0xa4, 0x0c, 0x33, 0x75, 0xec, 0xf8, 0x52, 0x4c, 0xb0, 0xc9, 0x11, 0x0d, 0x2f, + 0x07, 0xa5, 0x7c, 0x30, 0x28, 0xc5, 0xaf, 0x06, 0xe4, 0xa5, 0xe9, 0x13, 0x1b, 0xe3, 0xd5, 0x80, + 0x62, 0x1c, 0x8c, 0xe1, 0xf8, 0xda, 0x13, 0x61, 0x8a, 0xf0, 0x42, 0x1a, 0xec, 0xcf, 0x66, 0x83, + 0xc6, 0xfb, 0xb9, 0x94, 0x1a, 0xef, 0xdd, 0x90, 0xdb, 0xd1, 0xac, 0x8b, 0x36, 0x69, 0xb8, 0xd3, + 0x22, 0x66, 0xfb, 0x9a, 0x9b, 0x5d, 0xa5, 0x7f, 0xf5, 0xf7, 0xd3, 0xcc, 0x25, 0xf3, 0xd3, 0x7c, + 0x54, 0x4a, 0x34, 0x12, 0xd2, 0xb9, 0xc3, 0x08, 0x9b, 0x7c, 0x82, 0x71, 0x33, 0xa6, 0xec, 0xf4, + 0x95, 0xe3, 0x85, 0x32, 0x4c, 0xba, 0xe3, 0x36, 0xb1, 0xc7, 0xcf, 0x1f, 0x5c, 0x1d, 0xfa, 0x1b, + 0xfa, 0x09, 0x7b, 0x60, 0x4f, 0x22, 0xa3, 0x33, 0xef, 0x13, 0xf4, 0xc0, 0x71, 0x85, 0xa7, 0x8f, + 0xc7, 0x5b, 0x29, 0x1e, 0xa4, 0x3d, 0xa0, 0xdf, 0x94, 0x41, 0x5e, 0xc6, 0xce, 0xb8, 0xad, 0xc8, + 0x37, 0x09, 0x87, 0x38, 0xe2, 0x04, 0x46, 0x78, 0x9e, 0x5f, 0xc6, 0xa3, 0x69, 0x40, 0x62, 0xb1, + 0x8d, 0x84, 0x18, 0x48, 0x1f, 0xb5, 0x77, 0x52, 0xd4, 0xe8, 0xe6, 0xc2, 0x8f, 0x8f, 0xa0, 0x57, + 0x1d, 0xef, 0xc2, 0x87, 0x27, 0x40, 0x42, 0xe3, 0xb0, 0xda, 0x5b, 0xbf, 0xc2, 0xc7, 0x72, 0x15, + 0x1f, 0xb8, 0x8d, 0x7d, 0x1b, 0xb7, 0x2e, 0xe2, 0x36, 0xfa, 0x91, 0x83, 0x43, 0x77, 0x0a, 0x26, + 0x5a, 0x94, 0x1a, 0x01, 0x6f, 0x52, 0xf5, 0x5e, 0x13, 0xdc, 0x2b, 0xcd, 0x77, 0x44, 0xf4, 0xf7, + 0x31, 0xde, 0x2b, 0x2d, 0x50, 0xfc, 0x18, 0xcc, 0x16, 0x3a, 0xcb, 0xa8, 0xb4, 0x4c, 0x03, 0xfd, + 0x97, 0x83, 0xc3, 0x72, 0x0d, 0x4c, 0xe9, 0x2d, 0xd3, 0x20, 0x61, 0x28, 0xbc, 0x43, 0x40, 0x7e, + 0x82, 0xf7, 0xb5, 0xbc, 0x63, 0x3e, 0xa4, 0xb3, 0x5d, 0xf3, 0x20, 0x61, 0x58, 0x63, 0xc2, 0x65, + 0xfd, 0xb0, 0x8c, 0x89, 0x3e, 0x65, 0xa7, 0x0f, 0xd9, 0x87, 0x02, 0xef, 0x36, 0xda, 0x15, 0x3e, + 0x2e, 0x56, 0x81, 0x87, 0x19, 0xce, 0xc2, 0xb5, 0x38, 0x94, 0xe1, 0x2c, 0x86, 0x81, 0x31, 0xdc, + 0x58, 0x11, 0xe0, 0x98, 0xfa, 0x1a, 0xf0, 0x01, 0xd0, 0x19, 0x9d, 0x79, 0x38, 0x24, 0x3a, 0x87, + 0x63, 0x22, 0xbe, 0x87, 0x85, 0xc8, 0x64, 0x16, 0x0f, 0xfa, 0xaf, 0xa3, 0x00, 0xe7, 0xce, 0x61, + 0xfc, 0x15, 0xa8, 0xb7, 0x42, 0x82, 0x1b, 0xb1, 0xf7, 0x49, 0xd0, 0xa5, 0x32, 0xc6, 0xbb, 0xe2, + 0x45, 0xca, 0x4f, 0x1f, 0xc0, 0x17, 0xc8, 0x30, 0x47, 0x7c, 0x04, 0x3a, 0x58, 0xb3, 0x68, 0x47, + 0x39, 0x12, 0x47, 0xf9, 0xb7, 0x0a, 0x07, 0xf8, 0xe1, 0xe5, 0x10, 0xf0, 0x31, 0x12, 0x28, 0xc4, + 0xa2, 0xfb, 0x08, 0xb2, 0x30, 0x96, 0x6d, 0x94, 0x82, 0xcf, 0x02, 0x53, 0xf1, 0xd1, 0xe0, 0x91, + 0xd0, 0x23, 0x97, 0x17, 0x86, 0xd7, 0xd8, 0xc6, 0xec, 0x91, 0x2b, 0xc2, 0x44, 0xfa, 0x98, 0xfc, + 0xe6, 0xad, 0x6c, 0xc1, 0xb9, 0x41, 0x2e, 0x8c, 0x7f, 0x45, 0xd6, 0x3f, 0xd1, 0xf6, 0xc9, 0x91, + 0x78, 0x60, 0x1e, 0x20, 0x20, 0xbe, 0x02, 0x59, 0xcb, 0xbc, 0x44, 0x97, 0xb6, 0x66, 0x55, 0xf2, + 0x4c, 0xaf, 0xa7, 0xec, 0xec, 0xee, 0x18, 0xf4, 0x64, 0xe8, 0xac, 0xea, 0xbd, 0x2a, 0xd7, 0xc3, + 0xec, 0x25, 0xdd, 0xd9, 0x5e, 0xc1, 0x5a, 0x1b, 0x5b, 0xaa, 0x79, 0x89, 0x78, 0xcc, 0x4d, 0xaa, + 0x7c, 0x22, 0xef, 0xbf, 0x22, 0x60, 0x5f, 0x92, 0x5b, 0xe4, 0xc7, 0x72, 0xfc, 0x2d, 0x89, 0xe5, + 0x19, 0xcd, 0x55, 0xfa, 0x0a, 0xf3, 0x2e, 0x19, 0xa6, 0x54, 0xf3, 0x12, 0x53, 0x92, 0xff, 0xe3, + 0x70, 0x75, 0x24, 0xf1, 0x44, 0x8f, 0x48, 0xce, 0x67, 0x7f, 0xec, 0x13, 0xbd, 0xd8, 0xe2, 0xc7, + 0x72, 0x72, 0x69, 0x46, 0x35, 0x2f, 0xd5, 0xb1, 0x43, 0x5b, 0x04, 0x6a, 0x8e, 0xc8, 0xc9, 0x5a, + 0xb7, 0x29, 0x41, 0x36, 0x0f, 0xf7, 0xdf, 0x93, 0xee, 0x22, 0xf8, 0x02, 0xf2, 0x59, 0x1c, 0xf7, + 0x2e, 0xc2, 0x40, 0x0e, 0xc6, 0x10, 0x23, 0x45, 0x86, 0x69, 0xd5, 0xbc, 0xe4, 0x0e, 0x0d, 0x4b, + 0x7a, 0xa7, 0x33, 0x9a, 0x11, 0x32, 0xa9, 0xf1, 0xef, 0x89, 0xc1, 0xe3, 0x62, 0xec, 0xc6, 0xff, + 0x00, 0x06, 0xd2, 0x87, 0xe1, 0x79, 0xb4, 0xb1, 0x78, 0x23, 0xb4, 0x31, 0x1a, 0x1c, 0x86, 0x6d, + 0x10, 0x3e, 0x1b, 0x87, 0xd6, 0x20, 0xa2, 0x38, 0x18, 0xcb, 0xce, 0xc9, 0x5c, 0x89, 0x0c, 0xf3, + 0xa3, 0x6d, 0x13, 0x6f, 0x4f, 0xe6, 0x9a, 0xc8, 0x86, 0x5d, 0x8e, 0x91, 0x91, 0xa0, 0x91, 0xc0, + 0x05, 0x51, 0x80, 0x87, 0xf4, 0xf1, 0x78, 0xbf, 0x0c, 0x33, 0x94, 0x85, 0xc7, 0x89, 0x15, 0x30, + 0x54, 0xa3, 0x0a, 0xd7, 0xe0, 0x70, 0x1a, 0x55, 0x0c, 0x07, 0x63, 0xb9, 0x15, 0xd4, 0xb5, 0xe3, + 0x86, 0x38, 0x3e, 0x1e, 0x85, 0xe0, 0xd0, 0xc6, 0xd8, 0x08, 0x8f, 0x90, 0x0f, 0x63, 0x8c, 0x1d, + 0xd2, 0x31, 0xf2, 0xe7, 0xf9, 0xad, 0x68, 0x94, 0x18, 0x1c, 0xa0, 0x29, 0x8c, 0x10, 0x86, 0x21, + 0x9b, 0xc2, 0x21, 0x21, 0xf1, 0x45, 0x19, 0x80, 0x32, 0xb0, 0x66, 0xee, 0x91, 0xcb, 0x7c, 0x46, + 0xd0, 0x9d, 0xf5, 0xba, 0xd5, 0xcb, 0x03, 0xdc, 0xea, 0x13, 0x86, 0x70, 0x49, 0xba, 0x12, 0x18, + 0x92, 0xb2, 0x5b, 0xc9, 0xb1, 0xaf, 0x04, 0xc6, 0x97, 0x9f, 0x3e, 0xc6, 0x8f, 0x51, 0x6b, 0x2e, + 0x38, 0x60, 0xfa, 0x2b, 0x23, 0x41, 0x39, 0x34, 0xfb, 0x97, 0xf9, 0xd9, 0xff, 0x01, 0xb0, 0x1d, + 0xd6, 0x46, 0x1c, 0x74, 0x70, 0x34, 0x7d, 0x1b, 0xf1, 0xf0, 0x0e, 0x88, 0xfe, 0x78, 0x16, 0x8e, + 0xb2, 0x4e, 0xe4, 0xbb, 0x01, 0xe2, 0x84, 0xe7, 0xf0, 0xb8, 0x4e, 0x72, 0x00, 0xca, 0xa3, 0x5a, + 0x90, 0x4a, 0xb2, 0x94, 0x29, 0xc0, 0xde, 0x58, 0x56, 0x37, 0xf2, 0xe5, 0x87, 0xbb, 0x9a, 0xd1, + 0x16, 0x0f, 0xf7, 0x3b, 0x00, 0x78, 0x6f, 0xad, 0x51, 0xe6, 0xd7, 0x1a, 0xfb, 0xac, 0x4c, 0x26, + 0xde, 0xb9, 0x26, 0x22, 0xa3, 0xec, 0x8e, 0x7d, 0xe7, 0x3a, 0xba, 0xec, 0xf4, 0x51, 0x7a, 0xbb, + 0x0c, 0xd9, 0xba, 0x69, 0x39, 0xe8, 0xf9, 0x49, 0x5a, 0x27, 0x95, 0x7c, 0x00, 0x92, 0xf7, 0xae, + 0x94, 0xb8, 0x5b, 0x9a, 0x6f, 0x89, 0x3f, 0xea, 0xac, 0x39, 0x1a, 0xf1, 0xea, 0x76, 0xcb, 0x0f, + 0x5d, 0xd7, 0x9c, 0x34, 0x9e, 0x0e, 0x95, 0x5f, 0x3d, 0xfa, 0x00, 0x46, 0x6a, 0xf1, 0x74, 0x22, + 0x4b, 0x4e, 0x1f, 0xb7, 0x57, 0x1d, 0x65, 0xbe, 0xad, 0x4b, 0x7a, 0x07, 0xa3, 0xe7, 0x53, 0x97, + 0x91, 0xaa, 0xb6, 0x83, 0xc5, 0x8f, 0xc4, 0xc4, 0xba, 0xb6, 0x92, 0xf8, 0xb2, 0x72, 0x10, 0x5f, + 0x36, 0x69, 0x83, 0xa2, 0x07, 0xd0, 0x29, 0x4b, 0xe3, 0x6e, 0x50, 0x31, 0x65, 0x8f, 0x25, 0x4e, + 0xe7, 0xb1, 0x3a, 0x76, 0xa8, 0x51, 0x59, 0xf3, 0x6e, 0x60, 0xf9, 0xd1, 0x91, 0x44, 0xec, 0xf4, + 0x2f, 0x78, 0x91, 0x7b, 0x2e, 0x78, 0x79, 0x57, 0x18, 0x9c, 0x35, 0x1e, 0x9c, 0x1f, 0x8c, 0x16, + 0x10, 0xcf, 0xe4, 0x48, 0x60, 0x7a, 0x93, 0x0f, 0xd3, 0x3a, 0x07, 0xd3, 0x5d, 0x43, 0x72, 0x91, + 0x3e, 0x60, 0x3f, 0x97, 0x83, 0xa3, 0x74, 0xd2, 0x5f, 0x34, 0xda, 0x2c, 0xc2, 0xea, 0xeb, 0xa5, + 0x43, 0xde, 0x6c, 0xdb, 0x1f, 0x82, 0x95, 0x8b, 0xe5, 0x9c, 0xeb, 0xbd, 0x1d, 0x7f, 0x81, 0x86, + 0x73, 0x75, 0x3b, 0x51, 0xb2, 0xd3, 0x26, 0x7e, 0x43, 0xbe, 0xff, 0x1f, 0x7f, 0x97, 0xd1, 0x84, + 0xf8, 0x5d, 0x46, 0x7f, 0x9a, 0x6c, 0xdd, 0x8e, 0x14, 0xdd, 0x23, 0xf0, 0x94, 0x6d, 0xa7, 0x04, + 0x2b, 0x7a, 0x02, 0xdc, 0x7d, 0x6f, 0xb8, 0x93, 0x05, 0x11, 0x44, 0x86, 0x74, 0x27, 0x23, 0x04, + 0x0e, 0xd3, 0x9d, 0x6c, 0x10, 0x03, 0x63, 0xb8, 0xd5, 0x3e, 0xc7, 0x76, 0xf3, 0x49, 0xbb, 0x41, + 0x7f, 0x25, 0xa5, 0x3e, 0x4a, 0x7f, 0x2b, 0x93, 0xc8, 0xff, 0x99, 0xf0, 0x15, 0x3f, 0x4c, 0x27, + 0xf1, 0x68, 0x8e, 0x23, 0x37, 0x86, 0x75, 0x23, 0x89, 0xf8, 0xa2, 0x9f, 0xd7, 0xdb, 0xce, 0xf6, + 0x88, 0x4e, 0x74, 0x5c, 0x72, 0x69, 0x79, 0xd7, 0x23, 0x93, 0x17, 0xf4, 0x6f, 0x99, 0x44, 0x21, + 0xa4, 0x7c, 0x91, 0x10, 0xb6, 0x22, 0x44, 0x9c, 0x20, 0xf0, 0x53, 0x2c, 0xbd, 0x31, 0x6a, 0xf4, + 0x39, 0xbd, 0x8d, 0xcd, 0xc7, 0xa1, 0x46, 0x13, 0xbe, 0x46, 0xa7, 0xd1, 0x71, 0xe4, 0xbe, 0x47, + 0x35, 0xda, 0x17, 0xc9, 0x88, 0x34, 0x3a, 0x96, 0x5e, 0xfa, 0x32, 0x7e, 0xd9, 0x0c, 0x9b, 0x48, + 0xad, 0xea, 0xc6, 0x45, 0xf4, 0xcf, 0x79, 0xef, 0x62, 0xe6, 0xf3, 0xba, 0xb3, 0xcd, 0x62, 0xc1, + 0xfc, 0xbe, 0xf0, 0xdd, 0x28, 0x43, 0xc4, 0x7b, 0xe1, 0xc3, 0x49, 0xe5, 0xf6, 0x85, 0x93, 0x2a, + 0xc2, 0xac, 0x6e, 0x38, 0xd8, 0x32, 0xb4, 0xce, 0x52, 0x47, 0xdb, 0xb2, 0x4f, 0x4d, 0xf4, 0xbd, + 0xbc, 0xae, 0x12, 0xca, 0xa3, 0xf2, 0x7f, 0x84, 0xaf, 0xaf, 0x9c, 0xe4, 0xaf, 0xaf, 0x8c, 0x88, + 0x7e, 0x35, 0x15, 0x1d, 0xfd, 0xca, 0x8f, 0x6e, 0x05, 0x83, 0x83, 0x63, 0x8b, 0xda, 0xc6, 0x09, + 0xc3, 0xfd, 0xdd, 0x22, 0x18, 0x85, 0xcd, 0x0f, 0xfd, 0xf8, 0x1b, 0x72, 0xa2, 0xd5, 0x3d, 0x57, + 0x11, 0xe6, 0x7b, 0x95, 0x20, 0xb1, 0x85, 0x1a, 0xae, 0xbc, 0xdc, 0x53, 0x79, 0xdf, 0xe4, 0xc9, + 0x0a, 0x98, 0x3c, 0x61, 0xa5, 0xca, 0x89, 0x29, 0x55, 0x92, 0xc5, 0x42, 0x91, 0xda, 0x8e, 0xe1, + 0x34, 0x52, 0x0e, 0x8e, 0x79, 0xd1, 0x6e, 0xbb, 0x5d, 0xac, 0x59, 0x9a, 0xd1, 0xc2, 0xe8, 0x43, + 0xd2, 0x28, 0xcc, 0xde, 0x25, 0x98, 0xd4, 0x5b, 0xa6, 0x51, 0xd7, 0x9f, 0xed, 0x5d, 0x2e, 0x17, + 0x1f, 0x64, 0x9d, 0x48, 0xa4, 0xc2, 0xfe, 0x50, 0xfd, 0x7f, 0x95, 0x0a, 0x4c, 0xb5, 0x34, 0xab, + 0x4d, 0x83, 0xf0, 0xe5, 0x7a, 0x2e, 0x72, 0x8a, 0x24, 0x54, 0xf2, 0x7e, 0x51, 0x83, 0xbf, 0x95, + 0x1a, 0x2f, 0xc4, 0x7c, 0x4f, 0x34, 0x8f, 0x48, 0x62, 0x8b, 0xc1, 0x4f, 0x9c, 0xcc, 0x5d, 0xe9, + 0x58, 0xb8, 0x43, 0xee, 0xa0, 0xa7, 0x3d, 0xc4, 0x94, 0x1a, 0x24, 0x24, 0x5d, 0x1e, 0x20, 0x45, + 0xed, 0x43, 0x63, 0xdc, 0xcb, 0x03, 0x42, 0x5c, 0xa4, 0xaf, 0x99, 0x6f, 0xc9, 0xc3, 0x2c, 0xed, + 0xd5, 0x98, 0x38, 0xd1, 0x0b, 0xc8, 0x15, 0xd2, 0xce, 0x03, 0xf8, 0x32, 0xaa, 0x1f, 0x7c, 0x4c, + 0x2e, 0x80, 0x7c, 0xd1, 0x0f, 0x38, 0xe8, 0x3e, 0x26, 0xdd, 0xb7, 0xf7, 0xf8, 0x9a, 0xa7, 0x3c, + 0x8d, 0x7b, 0xdf, 0x3e, 0xbe, 0xf8, 0xf4, 0xf1, 0xf9, 0x79, 0x19, 0xe4, 0x62, 0xbb, 0x8d, 0x5a, + 0x07, 0x87, 0xe2, 0x0c, 0x4c, 0x7b, 0x6d, 0x26, 0x88, 0x01, 0x19, 0x4e, 0x4a, 0xba, 0x08, 0xea, + 0xcb, 0xa6, 0xd8, 0x1e, 0xfb, 0xae, 0x42, 0x4c, 0xd9, 0xe9, 0x83, 0xf2, 0x2b, 0x13, 0xac, 0xd1, + 0x2c, 0x98, 0xe6, 0x45, 0x72, 0x54, 0xe6, 0xf9, 0x32, 0xe4, 0x96, 0xb0, 0xd3, 0xda, 0x1e, 0x51, + 0x9b, 0xd9, 0xb5, 0x3a, 0x5e, 0x9b, 0xd9, 0x77, 0x1f, 0xfe, 0x60, 0x1b, 0xd6, 0x63, 0x6b, 0x9e, + 0xb0, 0x34, 0xee, 0xe8, 0xce, 0xb1, 0xa5, 0xa7, 0x0f, 0xce, 0xbf, 0xc9, 0x30, 0xe7, 0xaf, 0x70, + 0x51, 0x4c, 0x7e, 0x2e, 0xf3, 0x78, 0x5b, 0xef, 0x44, 0x9f, 0x4e, 0x16, 0x22, 0xcd, 0x97, 0x29, + 0x5f, 0xb3, 0x94, 0x17, 0x16, 0x13, 0x04, 0x4f, 0x13, 0x63, 0x70, 0x0c, 0x33, 0x78, 0x19, 0x26, + 0x09, 0x43, 0x8b, 0xfa, 0x1e, 0x71, 0x1d, 0xe4, 0x16, 0x1a, 0x9f, 0x33, 0x92, 0x85, 0xc6, 0xbb, + 0xf8, 0x85, 0x46, 0xc1, 0x88, 0xc7, 0xde, 0x3a, 0x63, 0x42, 0x5f, 0x1a, 0xf7, 0xff, 0x91, 0x2f, + 0x33, 0x26, 0xf0, 0xa5, 0x19, 0x50, 0x7e, 0xfa, 0x88, 0xfe, 0xc6, 0x7f, 0x62, 0x9d, 0xad, 0xb7, + 0xa1, 0x8a, 0xfe, 0xe7, 0x31, 0xc8, 0x9e, 0x73, 0x1f, 0xfe, 0x77, 0x70, 0x23, 0xd6, 0x4b, 0x47, + 0x10, 0x9c, 0xe1, 0x1e, 0xc8, 0xba, 0xf4, 0xd9, 0xb4, 0xe5, 0x26, 0xb1, 0xdd, 0x5d, 0x97, 0x11, + 0x95, 0xfc, 0xa7, 0x9c, 0x84, 0xbc, 0x6d, 0xee, 0x5a, 0x2d, 0xd7, 0x7c, 0x76, 0x35, 0x86, 0xbd, + 0x25, 0x0d, 0x4a, 0xca, 0x91, 0x9e, 0x1f, 0x9d, 0xcb, 0x68, 0xe8, 0x82, 0x24, 0x99, 0xbb, 0x20, + 0x29, 0xc1, 0xfe, 0x81, 0x00, 0x6f, 0xe9, 0x6b, 0xc4, 0x5f, 0x91, 0xbb, 0x02, 0xdb, 0xa3, 0x82, + 0x3d, 0x42, 0x2c, 0x07, 0x55, 0x87, 0xa4, 0x0e, 0xdf, 0xbc, 0x68, 0xfd, 0x38, 0xf0, 0x63, 0x75, + 0xf8, 0x16, 0xe0, 0x61, 0x2c, 0xa7, 0xd4, 0xf3, 0xcc, 0x49, 0xf5, 0xc1, 0x51, 0xa2, 0x9b, 0xe5, + 0x94, 0xfe, 0x40, 0xe8, 0x8c, 0xd0, 0x79, 0x75, 0x68, 0x74, 0x0e, 0xc9, 0x7d, 0xf5, 0x0f, 0x65, + 0x12, 0x09, 0xd3, 0x33, 0x72, 0xc4, 0x2f, 0x3a, 0x4a, 0x0c, 0x91, 0x3b, 0x06, 0x73, 0x71, 0xa0, + 0x67, 0x87, 0x0f, 0x0d, 0xce, 0x8b, 0x2e, 0xc4, 0xff, 0xb8, 0x43, 0x83, 0x8b, 0x32, 0x92, 0x3e, + 0x90, 0xaf, 0xa1, 0x17, 0x8b, 0x15, 0x5b, 0x8e, 0xbe, 0x37, 0xe2, 0x96, 0xc6, 0x0f, 0x2f, 0x09, + 0xa3, 0x01, 0xef, 0x93, 0x10, 0xe5, 0x70, 0xdc, 0xd1, 0x80, 0xc5, 0xd8, 0x48, 0x1f, 0xa6, 0xbf, + 0xcd, 0xbb, 0xd2, 0x63, 0x6b, 0x33, 0xbf, 0xc9, 0x56, 0x03, 0xf0, 0xc1, 0xd1, 0x3a, 0x0b, 0x33, + 0xa1, 0xa9, 0xbf, 0x77, 0x61, 0x0d, 0x97, 0x96, 0xf4, 0xa0, 0xbb, 0x2f, 0xb2, 0x91, 0x2f, 0x0c, + 0x24, 0x58, 0xf0, 0x15, 0x61, 0x62, 0x2c, 0xf7, 0xc1, 0x79, 0x63, 0xd8, 0x98, 0xb0, 0xfa, 0xfd, + 0x30, 0x56, 0x35, 0x1e, 0xab, 0x3b, 0x44, 0xc4, 0x24, 0x36, 0xa6, 0x09, 0xcd, 0x1b, 0xdf, 0xec, + 0xc3, 0xa5, 0x72, 0x70, 0xdd, 0x33, 0x34, 0x1f, 0xe9, 0x23, 0xf6, 0xab, 0xb4, 0x3b, 0xac, 0x53, + 0x93, 0x7d, 0x34, 0xdd, 0x21, 0x9b, 0x0d, 0xc8, 0xdc, 0x6c, 0x20, 0xa1, 0xbf, 0x7d, 0xe0, 0x46, + 0xea, 0x31, 0x37, 0x08, 0xa2, 0xec, 0x88, 0xfd, 0xed, 0x07, 0x72, 0x90, 0x3e, 0x38, 0xff, 0x28, + 0x03, 0x2c, 0x5b, 0xe6, 0x6e, 0xb7, 0x66, 0xb5, 0xb1, 0x85, 0xfe, 0x26, 0x98, 0x00, 0xfc, 0xc2, + 0x08, 0x26, 0x00, 0xeb, 0x00, 0x5b, 0x3e, 0x71, 0xa6, 0xe1, 0xb7, 0x8a, 0x99, 0xfb, 0x01, 0x53, + 0x6a, 0x88, 0x06, 0x7f, 0xe5, 0xec, 0x0f, 0xf1, 0x18, 0xc7, 0xf5, 0x59, 0x01, 0xb9, 0x51, 0x4e, + 0x00, 0xde, 0xea, 0x63, 0xdd, 0xe0, 0xb0, 0xbe, 0xef, 0x00, 0x9c, 0xa4, 0x8f, 0xf9, 0x3f, 0x4d, + 0xc0, 0x34, 0xdd, 0xae, 0xa3, 0x32, 0xfd, 0xfb, 0x00, 0xf4, 0x5f, 0x19, 0x01, 0xe8, 0x1b, 0x30, + 0x63, 0x06, 0xd4, 0x69, 0x9f, 0x1a, 0x5e, 0x80, 0x89, 0x85, 0x3d, 0xc4, 0x97, 0xca, 0x91, 0x41, + 0x1f, 0x08, 0x23, 0xaf, 0xf2, 0xc8, 0xdf, 0x15, 0x23, 0xef, 0x10, 0xc5, 0x51, 0x42, 0xff, 0x36, + 0x1f, 0xfa, 0x0d, 0x0e, 0xfa, 0xe2, 0x41, 0x58, 0x19, 0x43, 0xb8, 0x7d, 0x19, 0xb2, 0xe4, 0x74, + 0xdc, 0x6f, 0xa5, 0x38, 0xbf, 0x3f, 0x05, 0x13, 0xa4, 0xc9, 0xfa, 0xf3, 0x0e, 0xef, 0xd5, 0xfd, + 0xa2, 0x6d, 0x3a, 0xd8, 0xf2, 0x3d, 0x16, 0xbc, 0x57, 0x97, 0x07, 0xcf, 0x2b, 0xd9, 0x3e, 0x95, + 0xa7, 0x1b, 0x91, 0x7e, 0xc2, 0xd0, 0x93, 0x92, 0xb0, 0xc4, 0x47, 0x76, 0x5e, 0x6e, 0x98, 0x49, + 0xc9, 0x00, 0x46, 0xd2, 0x07, 0xfe, 0x2f, 0xb2, 0x70, 0x8a, 0xae, 0x2a, 0x2d, 0x59, 0xe6, 0x4e, + 0xcf, 0xed, 0x56, 0xfa, 0xc1, 0x75, 0xe1, 0x06, 0x98, 0x73, 0x38, 0x7f, 0x6c, 0xa6, 0x13, 0x3d, + 0xa9, 0xe8, 0xcf, 0xc2, 0x3e, 0x15, 0xcf, 0xe2, 0x91, 0x5c, 0x88, 0x11, 0x60, 0x14, 0xef, 0x89, + 0x17, 0xea, 0x05, 0x19, 0x0d, 0x2d, 0x52, 0xc9, 0x43, 0xad, 0x59, 0xfa, 0x3a, 0x95, 0x13, 0xd1, + 0xa9, 0x77, 0xfb, 0x3a, 0xf5, 0x23, 0x9c, 0x4e, 0x2d, 0x1f, 0x5c, 0x24, 0xe9, 0xeb, 0xd6, 0x2b, + 0xfc, 0x8d, 0x21, 0x7f, 0xdb, 0x6e, 0x27, 0x85, 0xcd, 0xba, 0xb0, 0x3f, 0x52, 0x96, 0xf3, 0x47, + 0xe2, 0xef, 0xa3, 0x48, 0x30, 0x13, 0xe6, 0xb9, 0x8e, 0xd0, 0xa5, 0x39, 0x90, 0x74, 0x8f, 0x3b, + 0x49, 0x6f, 0x0f, 0x35, 0xd7, 0x8d, 0x2d, 0x68, 0x0c, 0x6b, 0x4b, 0x73, 0x90, 0x5f, 0xd2, 0x3b, + 0x0e, 0xb6, 0xd0, 0x63, 0x6c, 0xa6, 0xfb, 0x8a, 0x14, 0x07, 0x80, 0x45, 0xc8, 0x6f, 0x92, 0xd2, + 0x98, 0xc9, 0x7c, 0xb3, 0x58, 0xeb, 0xa1, 0x1c, 0xaa, 0xec, 0xdf, 0xa4, 0xd1, 0xf9, 0x7a, 0xc8, + 0x8c, 0x6c, 0x8a, 0x9c, 0x20, 0x3a, 0xdf, 0x60, 0x16, 0xc6, 0x72, 0x31, 0x55, 0x5e, 0xc5, 0x3b, + 0xee, 0x18, 0x7f, 0x31, 0x3d, 0x84, 0x0b, 0x20, 0xeb, 0x6d, 0x9b, 0x74, 0x8e, 0x53, 0xaa, 0xfb, + 0x98, 0xd4, 0x57, 0xa8, 0x57, 0x54, 0x94, 0xe5, 0x71, 0xfb, 0x0a, 0x09, 0x71, 0x91, 0x3e, 0x66, + 0xdf, 0x22, 0x8e, 0xa2, 0xdd, 0x8e, 0xd6, 0xc2, 0x2e, 0xf7, 0xa9, 0xa1, 0x46, 0x7b, 0xb2, 0xac, + 0xd7, 0x93, 0x85, 0xda, 0x69, 0xee, 0x00, 0xed, 0x74, 0xd8, 0x65, 0x48, 0x5f, 0xe6, 0xa4, 0xe2, + 0x87, 0xb6, 0x0c, 0x19, 0xcb, 0xc6, 0x18, 0xae, 0x1d, 0xf5, 0x0e, 0xd2, 0x8e, 0xb5, 0xb5, 0x0e, + 0xbb, 0x49, 0xc3, 0x84, 0x35, 0xb2, 0x43, 0xb3, 0xc3, 0x6c, 0xd2, 0x44, 0xf3, 0x30, 0x06, 0xb4, + 0xe6, 0x18, 0x5a, 0x9f, 0x62, 0xc3, 0x68, 0xca, 0xfb, 0xa4, 0xb6, 0x69, 0x39, 0xc9, 0xf6, 0x49, + 0x5d, 0xee, 0x54, 0xf2, 0x5f, 0xd2, 0x83, 0x57, 0xfc, 0xb9, 0xea, 0x51, 0x0d, 0x9f, 0x09, 0x0e, + 0x5e, 0x0d, 0x62, 0x20, 0x7d, 0x78, 0xdf, 0x70, 0x48, 0x83, 0xe7, 0xb0, 0xcd, 0x91, 0xb5, 0x81, + 0x91, 0x0d, 0x9d, 0xc3, 0x34, 0xc7, 0x68, 0x1e, 0xd2, 0xc7, 0xeb, 0xeb, 0xa1, 0x81, 0xf3, 0x75, + 0x63, 0x1c, 0x38, 0xbd, 0x96, 0x99, 0x1b, 0xb2, 0x65, 0x0e, 0xbb, 0xff, 0xc3, 0x64, 0x3d, 0xba, + 0x01, 0x73, 0x98, 0xfd, 0x9f, 0x18, 0x26, 0xd2, 0x47, 0xfc, 0xf5, 0x32, 0xe4, 0xea, 0xe3, 0x1f, + 0x2f, 0x87, 0x9d, 0x8b, 0x10, 0x59, 0xd5, 0x47, 0x36, 0x5c, 0x0e, 0x33, 0x17, 0x89, 0x64, 0x61, + 0x0c, 0x81, 0xf7, 0x8f, 0xc2, 0x0c, 0x59, 0x12, 0xf1, 0xb6, 0x59, 0xbf, 0xce, 0x46, 0xcd, 0x47, + 0x53, 0x6c, 0xab, 0xf7, 0xc3, 0xa4, 0xb7, 0x7f, 0xc7, 0x46, 0xce, 0x79, 0xb1, 0xf6, 0xe9, 0x71, + 0xa9, 0xfa, 0xff, 0x1f, 0xc8, 0x19, 0x62, 0xe4, 0x7b, 0xb5, 0xc3, 0x3a, 0x43, 0x1c, 0xea, 0x7e, + 0xed, 0x9f, 0x06, 0x23, 0xea, 0x7f, 0x49, 0x0f, 0xf3, 0xde, 0x7d, 0xdc, 0x6c, 0x9f, 0x7d, 0xdc, + 0x0f, 0x85, 0xb1, 0xac, 0xf3, 0x58, 0xde, 0x2d, 0x2a, 0xc2, 0x11, 0x8e, 0xb5, 0x6f, 0xf7, 0xe1, + 0x3c, 0xc7, 0xc1, 0xb9, 0x70, 0x20, 0x5e, 0xc6, 0x70, 0xf0, 0x31, 0x1b, 0x8c, 0xb9, 0x1f, 0x4e, + 0xb1, 0x1d, 0xf7, 0x9c, 0xaa, 0xc8, 0xee, 0x3b, 0x55, 0xc1, 0xb5, 0xf4, 0xdc, 0x01, 0x5b, 0xfa, + 0x87, 0xc3, 0xda, 0xd1, 0xe0, 0xb5, 0xe3, 0x1e, 0x71, 0x44, 0x46, 0x37, 0x32, 0xbf, 0xc3, 0x57, + 0x8f, 0xf3, 0x9c, 0x7a, 0x94, 0x0e, 0xc6, 0x4c, 0xfa, 0xfa, 0xf1, 0x47, 0xde, 0x84, 0xf6, 0x90, + 0xdb, 0xfb, 0xb0, 0x5b, 0xc5, 0x9c, 0x10, 0x47, 0x36, 0x72, 0x0f, 0xb3, 0x55, 0x3c, 0x88, 0x93, + 0x31, 0xc4, 0x62, 0x9b, 0x85, 0x69, 0xc2, 0xd3, 0x79, 0xbd, 0xbd, 0x85, 0x1d, 0xf4, 0x1b, 0xd4, + 0x47, 0xd1, 0x8b, 0x7c, 0x39, 0xa2, 0xf0, 0x44, 0x51, 0xe7, 0x5d, 0x93, 0x7a, 0x74, 0x50, 0x26, + 0xe7, 0x43, 0x0c, 0x8e, 0x3b, 0x82, 0xe2, 0x40, 0x0e, 0xd2, 0x87, 0xec, 0x03, 0xd4, 0xdd, 0x66, + 0x55, 0xbb, 0x6c, 0xee, 0x3a, 0xe8, 0x91, 0x11, 0x74, 0xd0, 0x0b, 0x90, 0xef, 0x10, 0x6a, 0xec, + 0x58, 0x46, 0xfc, 0x74, 0x87, 0x89, 0x80, 0x96, 0xaf, 0xb2, 0x3f, 0x93, 0x9e, 0xcd, 0x08, 0xe4, + 0x48, 0xe9, 0x8c, 0xfb, 0x6c, 0xc6, 0x80, 0xf2, 0xc7, 0x72, 0xc7, 0xce, 0xa4, 0x5b, 0xba, 0xbe, + 0xa3, 0x3b, 0x23, 0x8a, 0xe0, 0xd0, 0x71, 0x69, 0x79, 0x11, 0x1c, 0xc8, 0x4b, 0xd2, 0x13, 0xa3, + 0x21, 0xa9, 0xb8, 0xbf, 0x8f, 0xfb, 0xc4, 0x68, 0x7c, 0xf1, 0xe9, 0x63, 0xf2, 0x4b, 0xb4, 0x65, + 0x9d, 0xa3, 0xce, 0xb7, 0x29, 0xfa, 0xf5, 0x0e, 0xdd, 0x58, 0x28, 0x6b, 0x87, 0xd7, 0x58, 0xfa, + 0x96, 0x9f, 0x3e, 0x30, 0xff, 0xfd, 0xfb, 0x21, 0xb7, 0x88, 0x2f, 0xec, 0x6e, 0xa1, 0xbb, 0x60, + 0xb2, 0x61, 0x61, 0x5c, 0x31, 0x36, 0x4d, 0x57, 0xba, 0x8e, 0xfb, 0xec, 0x41, 0xc2, 0xde, 0x5c, + 0x3c, 0xb6, 0xb1, 0xd6, 0x0e, 0xce, 0x9f, 0x79, 0xaf, 0xe8, 0xa5, 0x12, 0x64, 0xeb, 0x8e, 0xe6, + 0xa0, 0x29, 0x1f, 0x5b, 0xf4, 0x48, 0x18, 0x8b, 0xbb, 0x78, 0x2c, 0x6e, 0xe0, 0x64, 0x41, 0x38, + 0x98, 0x77, 0xff, 0x8f, 0x00, 0x00, 0xc1, 0xe4, 0x43, 0xb6, 0x69, 0xb8, 0x39, 0xbc, 0x23, 0x90, + 0xde, 0x3b, 0x7a, 0xb9, 0x2f, 0xee, 0x7b, 0x39, 0x71, 0x3f, 0x59, 0xac, 0x88, 0x31, 0xac, 0xb4, + 0x49, 0x30, 0xe5, 0x8a, 0x76, 0x05, 0x6b, 0x6d, 0x1b, 0x7d, 0x5f, 0xa0, 0xfc, 0x11, 0x62, 0x46, + 0xef, 0x11, 0x0e, 0xc6, 0x49, 0x6b, 0xe5, 0x13, 0x8f, 0xf6, 0xe8, 0xf0, 0x36, 0xff, 0x25, 0x3e, + 0x18, 0xc9, 0x2d, 0x90, 0xd5, 0x8d, 0x4d, 0x93, 0xf9, 0x17, 0x5e, 0x1d, 0x41, 0xdb, 0xd5, 0x09, + 0x95, 0x64, 0x14, 0x8c, 0xd4, 0x19, 0xcf, 0xd6, 0x58, 0x2e, 0xbd, 0xcb, 0xba, 0xa5, 0xa3, 0xff, + 0xff, 0x40, 0x61, 0x2b, 0x0a, 0x64, 0xbb, 0x9a, 0xb3, 0xcd, 0x8a, 0x26, 0xcf, 0xae, 0x8d, 0xbc, + 0x6b, 0x68, 0x86, 0x69, 0x5c, 0xde, 0xd1, 0x9f, 0xed, 0xdf, 0xad, 0xcb, 0xa5, 0xb9, 0x9c, 0x6f, + 0x61, 0x03, 0x5b, 0x9a, 0x83, 0xeb, 0x7b, 0x5b, 0x64, 0x8e, 0x35, 0xa9, 0x86, 0x93, 0x12, 0xeb, + 0xbf, 0xcb, 0x71, 0xb4, 0xfe, 0x6f, 0xea, 0x1d, 0x4c, 0x22, 0x35, 0x31, 0xfd, 0xf7, 0xde, 0x13, + 0xe9, 0x7f, 0x9f, 0x22, 0xd2, 0x47, 0xe3, 0xdb, 0x12, 0xcc, 0xd4, 0x5d, 0x85, 0xab, 0xef, 0xee, + 0xec, 0x68, 0xd6, 0x65, 0x74, 0x5d, 0x80, 0x4a, 0x48, 0x35, 0x33, 0xbc, 0x5f, 0xca, 0x1f, 0x0a, + 0x5f, 0x2b, 0xcd, 0x9a, 0x76, 0xa8, 0x84, 0xc4, 0xed, 0xe0, 0x36, 0xc8, 0xb9, 0xea, 0xed, 0x79, + 0x5c, 0xc6, 0x36, 0x04, 0x9a, 0x53, 0x30, 0xa2, 0xd5, 0x40, 0xde, 0xc6, 0x10, 0x4d, 0x43, 0x82, + 0xa3, 0x75, 0x47, 0x6b, 0x5d, 0x5c, 0x36, 0x2d, 0x73, 0xd7, 0xd1, 0x0d, 0x6c, 0xa3, 0x27, 0x04, + 0x08, 0x78, 0xfa, 0x9f, 0x09, 0xf4, 0x1f, 0xfd, 0x7b, 0x46, 0x74, 0x14, 0xf5, 0xbb, 0xd5, 0x30, + 0xf9, 0x88, 0x00, 0x55, 0x62, 0xe3, 0xa2, 0x08, 0xc5, 0xf4, 0x85, 0xf6, 0x3a, 0x19, 0x0a, 0xe5, + 0x87, 0xbb, 0xa6, 0xe5, 0xac, 0x9a, 0x2d, 0xad, 0x63, 0x3b, 0xa6, 0x85, 0x51, 0x2d, 0x56, 0x6a, + 0x6e, 0x0f, 0xd3, 0x36, 0x5b, 0xc1, 0xe0, 0xc8, 0xde, 0xc2, 0x6a, 0x27, 0xf3, 0x3a, 0xfe, 0x01, + 0xe1, 0x5d, 0x46, 0x2a, 0x95, 0x5e, 0x8e, 0x22, 0xf4, 0xbc, 0x5f, 0x97, 0x96, 0xec, 0xb0, 0x84, + 0xd8, 0xce, 0xa3, 0x10, 0x53, 0x63, 0x58, 0x2a, 0x97, 0x60, 0xb6, 0xbe, 0x7b, 0xc1, 0x27, 0x62, + 0x87, 0x8d, 0x90, 0x57, 0x0a, 0x47, 0xa9, 0x60, 0x8a, 0x17, 0x26, 0x14, 0x21, 0xdf, 0xeb, 0x61, + 0xd6, 0x0e, 0x67, 0x63, 0x78, 0xf3, 0x89, 0x82, 0xd1, 0x29, 0x06, 0x97, 0x9a, 0xbe, 0x00, 0xdf, + 0x21, 0xc1, 0x6c, 0xad, 0x8b, 0x0d, 0xdc, 0xa6, 0x5e, 0x90, 0x9c, 0x00, 0x5f, 0x9a, 0x50, 0x80, + 0x1c, 0xa1, 0x08, 0x01, 0x06, 0x1e, 0xcb, 0x8b, 0x9e, 0xf0, 0x82, 0x84, 0x44, 0x82, 0x8b, 0x2b, + 0x2d, 0x7d, 0xc1, 0x7d, 0x5e, 0x82, 0x69, 0x75, 0xd7, 0x58, 0xb7, 0x4c, 0x77, 0x34, 0xb6, 0xd0, + 0xdd, 0x41, 0x07, 0x71, 0x33, 0x1c, 0x6b, 0xef, 0x5a, 0x64, 0xfd, 0xa9, 0x62, 0xd4, 0x71, 0xcb, + 0x34, 0xda, 0x36, 0xa9, 0x47, 0x4e, 0xdd, 0xff, 0xe1, 0xce, 0xec, 0xf3, 0xbf, 0x22, 0x67, 0xd0, + 0x0b, 0x84, 0x43, 0xdd, 0xd0, 0xca, 0x87, 0x8a, 0x16, 0xef, 0x09, 0x04, 0x03, 0xda, 0x0c, 0x2a, + 0x21, 0x7d, 0xe1, 0x7e, 0x4a, 0x02, 0xa5, 0xd8, 0x6a, 0x99, 0xbb, 0x86, 0x53, 0xc7, 0x1d, 0xdc, + 0x72, 0x1a, 0x96, 0xd6, 0xc2, 0x61, 0xfb, 0xb9, 0x00, 0x72, 0x5b, 0xb7, 0x58, 0x1f, 0xec, 0x3e, + 0x32, 0x39, 0xbe, 0x54, 0x78, 0xc7, 0x91, 0xd6, 0x72, 0x7f, 0x29, 0x09, 0xc4, 0x29, 0xb6, 0xaf, + 0x28, 0x58, 0x50, 0xfa, 0x52, 0xfd, 0xb0, 0x04, 0x53, 0x5e, 0x8f, 0xbd, 0x25, 0x22, 0xcc, 0x5f, + 0x4a, 0x38, 0x19, 0xf1, 0x89, 0x27, 0x90, 0xe1, 0x5b, 0x12, 0xcc, 0x2a, 0xa2, 0xe8, 0x27, 0x13, + 0x5d, 0x31, 0xb9, 0xe8, 0xdc, 0xd7, 0x6a, 0xad, 0xb9, 0x54, 0x5b, 0x5d, 0x2c, 0xab, 0x05, 0x19, + 0x3d, 0x26, 0x41, 0x76, 0x5d, 0x37, 0xb6, 0xc2, 0xd1, 0x95, 0x8e, 0xbb, 0x76, 0x64, 0x1b, 0x3f, + 0xcc, 0x5a, 0x3a, 0x7d, 0x51, 0x6e, 0x87, 0xe3, 0xc6, 0xee, 0xce, 0x05, 0x6c, 0xd5, 0x36, 0xc9, + 0x28, 0x6b, 0x37, 0xcc, 0x3a, 0x36, 0xa8, 0x11, 0x9a, 0x53, 0xfb, 0x7e, 0xe3, 0x4d, 0x30, 0x81, + 0xc9, 0x83, 0xcb, 0x49, 0x84, 0xc4, 0x7d, 0xa6, 0xa4, 0x10, 0x53, 0x89, 0xa6, 0x0d, 0x7d, 0x88, + 0xa7, 0xaf, 0xa9, 0x7f, 0x9c, 0x83, 0x13, 0x45, 0xe3, 0x32, 0xb1, 0x29, 0x68, 0x07, 0x5f, 0xda, + 0xd6, 0x8c, 0x2d, 0x4c, 0x06, 0x08, 0x5f, 0xe2, 0xe1, 0x10, 0xfd, 0x19, 0x3e, 0x44, 0xbf, 0xa2, + 0xc2, 0x84, 0x69, 0xb5, 0xb1, 0xb5, 0x70, 0x99, 0xf0, 0xd4, 0xbb, 0xec, 0xcc, 0xda, 0x64, 0xbf, + 0x22, 0xe6, 0x19, 0xf9, 0xf9, 0x1a, 0xfd, 0x5f, 0xf5, 0x08, 0x9d, 0xbd, 0x19, 0x26, 0x58, 0x9a, + 0x32, 0x03, 0x93, 0x35, 0x75, 0xb1, 0xac, 0x36, 0x2b, 0x8b, 0x85, 0x23, 0xca, 0x15, 0x70, 0xb4, + 0xd2, 0x28, 0xab, 0xc5, 0x46, 0xa5, 0x56, 0x6d, 0x92, 0xf4, 0x42, 0x06, 0x3d, 0x2f, 0x2b, 0xea, + 0xd9, 0x1b, 0xcf, 0x4c, 0x3f, 0x58, 0x55, 0x98, 0x68, 0xd1, 0x0c, 0x64, 0x08, 0x9d, 0x4e, 0x54, + 0x3b, 0x46, 0x90, 0x26, 0xa8, 0x1e, 0x21, 0xe5, 0x34, 0xc0, 0x25, 0xcb, 0x34, 0xb6, 0x82, 0x53, + 0x87, 0x93, 0x6a, 0x28, 0x05, 0x3d, 0x92, 0x81, 0x3c, 0xfd, 0x87, 0x5c, 0x49, 0x42, 0x9e, 0x02, + 0xc1, 0x7b, 0xef, 0xae, 0xc5, 0x4b, 0xe4, 0x15, 0x4c, 0xb4, 0xd8, 0xab, 0xab, 0x8b, 0x54, 0x06, + 0xd4, 0x12, 0x66, 0x55, 0xb9, 0x05, 0xf2, 0xf4, 0x5f, 0xe6, 0x75, 0x10, 0x1d, 0x5e, 0x94, 0x66, + 0x13, 0xf4, 0x53, 0x16, 0x97, 0x69, 0xfa, 0xda, 0xfc, 0x5e, 0x09, 0x26, 0xab, 0xd8, 0x29, 0x6d, + 0xe3, 0xd6, 0x45, 0xf4, 0x24, 0x7e, 0x01, 0xb4, 0xa3, 0x63, 0xc3, 0x79, 0x70, 0xa7, 0xe3, 0x2f, + 0x80, 0x7a, 0x09, 0xe8, 0xa7, 0xc3, 0x9d, 0xef, 0x7d, 0xbc, 0xfe, 0xdc, 0xd4, 0xa7, 0xae, 0x5e, + 0x09, 0x11, 0x2a, 0x73, 0x12, 0xf2, 0x16, 0xb6, 0x77, 0x3b, 0xde, 0x22, 0x1a, 0x7b, 0x43, 0xaf, + 0xf2, 0xc5, 0x59, 0xe2, 0xc4, 0x79, 0x8b, 0x78, 0x11, 0x63, 0x88, 0x57, 0x9a, 0x85, 0x89, 0x8a, + 0xa1, 0x3b, 0xba, 0xd6, 0x41, 0x2f, 0xc8, 0xc2, 0x6c, 0x1d, 0x3b, 0xeb, 0x9a, 0xa5, 0xed, 0x60, + 0x07, 0x5b, 0x36, 0xfa, 0x26, 0xdf, 0x27, 0x74, 0x3b, 0x9a, 0xb3, 0x69, 0x5a, 0x3b, 0x9e, 0x6a, + 0x7a, 0xef, 0xae, 0x6a, 0xee, 0x61, 0xcb, 0x0e, 0xf8, 0xf2, 0x5e, 0xdd, 0x2f, 0x97, 0x4c, 0xeb, + 0xa2, 0x3b, 0x08, 0xb2, 0x69, 0x1a, 0x7b, 0x75, 0xe9, 0x75, 0xcc, 0xad, 0x55, 0xbc, 0x87, 0xbd, + 0x70, 0x69, 0xfe, 0xbb, 0x3b, 0x17, 0x68, 0x9b, 0x55, 0xd3, 0x71, 0x3b, 0xed, 0x55, 0x73, 0x8b, + 0xc6, 0x8b, 0x9d, 0x54, 0xf9, 0xc4, 0x20, 0x97, 0xb6, 0x87, 0x49, 0xae, 0x7c, 0x38, 0x17, 0x4b, + 0x54, 0xe6, 0x41, 0xf1, 0x7f, 0x6b, 0xe0, 0x0e, 0xde, 0xc1, 0x8e, 0x75, 0x99, 0x5c, 0x0b, 0x31, + 0xa9, 0xf6, 0xf9, 0xc2, 0x06, 0x68, 0xf1, 0xc9, 0x3a, 0x93, 0xde, 0x3c, 0x27, 0xb9, 0x03, 0x4d, + 0xd6, 0x45, 0x28, 0x8e, 0xe5, 0xda, 0x2b, 0xd9, 0xb5, 0x66, 0x7e, 0x4d, 0x86, 0x2c, 0x19, 0x3c, + 0x5f, 0x9f, 0xe1, 0x56, 0x98, 0x76, 0xb0, 0x6d, 0x6b, 0x5b, 0xd8, 0x5b, 0x61, 0x62, 0xaf, 0xca, + 0x1d, 0x90, 0xeb, 0x10, 0x4c, 0xe9, 0xe0, 0x70, 0x1d, 0x57, 0x33, 0xd7, 0xc0, 0x70, 0x69, 0xf9, + 0x23, 0x01, 0x81, 0x5b, 0xa5, 0x7f, 0x9c, 0xbd, 0x1f, 0x72, 0x14, 0xfe, 0x29, 0xc8, 0x2d, 0x96, + 0x17, 0x36, 0x96, 0x0b, 0x47, 0xdc, 0x47, 0x8f, 0xbf, 0x29, 0xc8, 0x2d, 0x15, 0x1b, 0xc5, 0xd5, + 0x82, 0xe4, 0xd6, 0xa3, 0x52, 0x5d, 0xaa, 0x15, 0x64, 0x37, 0x71, 0xbd, 0x58, 0xad, 0x94, 0x0a, + 0x59, 0x65, 0x1a, 0x26, 0xce, 0x17, 0xd5, 0x6a, 0xa5, 0xba, 0x5c, 0xc8, 0xa1, 0xbf, 0x0d, 0xe3, + 0x77, 0x27, 0x8f, 0xdf, 0xf5, 0x51, 0x3c, 0xf5, 0x83, 0xec, 0xd7, 0x7d, 0xc8, 0xee, 0xe6, 0x20, + 0xfb, 0x7e, 0x11, 0x22, 0x63, 0x70, 0x67, 0xca, 0xc3, 0xc4, 0xba, 0x65, 0xb6, 0xb0, 0x6d, 0xa3, + 0x5f, 0x96, 0x20, 0x5f, 0xd2, 0x8c, 0x16, 0xee, 0xa0, 0xab, 0x02, 0xa8, 0xa8, 0xab, 0x68, 0xc6, + 0x3f, 0x2d, 0xf6, 0x8f, 0x19, 0xd1, 0xde, 0x8f, 0xd1, 0x9d, 0xa7, 0x34, 0x23, 0xe4, 0x23, 0xd6, + 0xcb, 0xc5, 0x92, 0x1a, 0xc3, 0xd5, 0x38, 0x12, 0x4c, 0xb1, 0xd5, 0x80, 0x0b, 0x38, 0x3c, 0x0f, + 0xff, 0x66, 0x46, 0x74, 0x72, 0xe8, 0xd5, 0xc0, 0x27, 0x13, 0x21, 0x0f, 0xb1, 0x89, 0xe0, 0x20, + 0x6a, 0x63, 0xd8, 0x3c, 0x94, 0x60, 0x7a, 0xc3, 0xb0, 0xfb, 0x09, 0x45, 0x3c, 0x8e, 0xbe, 0x57, + 0x8d, 0x10, 0xa1, 0x03, 0xc5, 0xd1, 0x1f, 0x4c, 0x2f, 0x7d, 0xc1, 0x7c, 0x33, 0x03, 0xc7, 0x97, + 0xb1, 0x81, 0x2d, 0xbd, 0x45, 0x6b, 0xe0, 0x49, 0xe2, 0x6e, 0x5e, 0x12, 0x4f, 0xe2, 0x38, 0xef, + 0xf7, 0x07, 0x2f, 0x81, 0x57, 0xf8, 0x12, 0xb8, 0x8f, 0x93, 0xc0, 0xcd, 0x82, 0x74, 0xc6, 0x70, + 0x1f, 0xfa, 0x14, 0xcc, 0x54, 0x4d, 0x47, 0xdf, 0xd4, 0x5b, 0xd4, 0x07, 0xed, 0x57, 0x65, 0xc8, + 0xae, 0xea, 0xb6, 0x83, 0x8a, 0x41, 0x77, 0x72, 0x06, 0xa6, 0x75, 0xa3, 0xd5, 0xd9, 0x6d, 0x63, + 0x15, 0x6b, 0xb4, 0x5f, 0x99, 0x54, 0xc3, 0x49, 0xc1, 0xd6, 0xbe, 0xcb, 0x96, 0xec, 0x6d, 0xed, + 0x7f, 0x5c, 0x78, 0x19, 0x26, 0xcc, 0x02, 0x09, 0x48, 0x19, 0x61, 0x77, 0x15, 0x61, 0xd6, 0x08, + 0x65, 0xf5, 0x0c, 0xf6, 0xde, 0x0b, 0x05, 0xc2, 0xe4, 0x54, 0xfe, 0x0f, 0xf4, 0x2e, 0xa1, 0xc6, + 0x3a, 0x88, 0xa1, 0x64, 0xc8, 0x2c, 0x0d, 0x31, 0x49, 0x56, 0x60, 0xae, 0x52, 0x6d, 0x94, 0xd5, + 0x6a, 0x71, 0x95, 0x65, 0x91, 0xd1, 0xb7, 0x25, 0xc8, 0xa9, 0xb8, 0xdb, 0xb9, 0x1c, 0x8e, 0x18, + 0xcd, 0x1c, 0xc5, 0x33, 0xbe, 0xa3, 0xb8, 0xb2, 0x04, 0xa0, 0xb5, 0xdc, 0x82, 0xc9, 0x95, 0x5a, + 0x52, 0xdf, 0x38, 0xa6, 0x5c, 0x05, 0x8b, 0x7e, 0x6e, 0x35, 0xf4, 0x27, 0x7a, 0xa1, 0xf0, 0xce, + 0x11, 0x47, 0x8d, 0x70, 0x18, 0xd1, 0x27, 0xbc, 0x5b, 0x68, 0xb3, 0x67, 0x20, 0xb9, 0xc3, 0x11, + 0xff, 0x17, 0x24, 0xc8, 0x36, 0xdc, 0xde, 0x32, 0xd4, 0x71, 0x7e, 0x6c, 0x38, 0x1d, 0x77, 0xc9, + 0x44, 0xe8, 0xf8, 0xbd, 0x30, 0x13, 0xd6, 0x58, 0xe6, 0x2a, 0x11, 0xab, 0xe2, 0xdc, 0x0f, 0xc3, + 0x68, 0x78, 0x1f, 0x76, 0x0e, 0x47, 0xc4, 0x1f, 0x79, 0x32, 0xc0, 0x1a, 0xde, 0xb9, 0x80, 0x2d, + 0x7b, 0x5b, 0xef, 0xa2, 0xbf, 0x93, 0x61, 0x6a, 0x19, 0x3b, 0x75, 0x47, 0x73, 0x76, 0xed, 0x9e, + 0xed, 0x4e, 0xc3, 0x2c, 0x69, 0xad, 0x6d, 0xcc, 0xba, 0x23, 0xef, 0x15, 0xbd, 0x4d, 0x16, 0xf5, + 0x27, 0x0a, 0xca, 0x99, 0xf7, 0xcb, 0x88, 0xc0, 0xe4, 0x29, 0x90, 0x6d, 0x6b, 0x8e, 0xc6, 0xb0, + 0xb8, 0xaa, 0x07, 0x8b, 0x80, 0x90, 0x4a, 0xb2, 0xa1, 0xdf, 0x91, 0x44, 0x1c, 0x8a, 0x04, 0xca, + 0x4f, 0x06, 0xc2, 0xbb, 0x32, 0x43, 0xa0, 0x70, 0x0c, 0x66, 0xab, 0xb5, 0x46, 0x73, 0xb5, 0xb6, + 0xbc, 0x5c, 0x76, 0x53, 0x0b, 0xb2, 0x72, 0x12, 0x94, 0xf5, 0xe2, 0x83, 0x6b, 0xe5, 0x6a, 0xa3, + 0x59, 0xad, 0x2d, 0x96, 0xd9, 0x9f, 0x59, 0xe5, 0x28, 0x4c, 0x97, 0x8a, 0xa5, 0x15, 0x2f, 0x21, + 0xa7, 0x9c, 0x82, 0xe3, 0x6b, 0xe5, 0xb5, 0x85, 0xb2, 0x5a, 0x5f, 0xa9, 0xac, 0x37, 0x5d, 0x32, + 0x4b, 0xb5, 0x8d, 0xea, 0x62, 0x21, 0xaf, 0x20, 0x38, 0x19, 0xfa, 0x72, 0x5e, 0xad, 0x55, 0x97, + 0x9b, 0xf5, 0x46, 0xb1, 0x51, 0x2e, 0x4c, 0x28, 0x57, 0xc0, 0xd1, 0x52, 0xb1, 0x4a, 0xb2, 0x97, + 0x6a, 0xd5, 0x6a, 0xb9, 0xd4, 0x28, 0x4c, 0xa2, 0x7f, 0xcf, 0xc2, 0x74, 0xc5, 0xae, 0x6a, 0x3b, + 0xf8, 0x9c, 0xd6, 0xd1, 0xdb, 0xe8, 0x05, 0xa1, 0x99, 0xc7, 0xf5, 0x30, 0x6b, 0xd1, 0x47, 0xdc, + 0x6e, 0xe8, 0x98, 0xa2, 0x39, 0xab, 0xf2, 0x89, 0xee, 0x9c, 0xdc, 0x20, 0x04, 0xbc, 0x39, 0x39, + 0x7d, 0x53, 0x16, 0x00, 0xe8, 0x53, 0x23, 0xb8, 0xdc, 0xf5, 0x6c, 0x6f, 0x6b, 0xd2, 0x76, 0xb0, + 0x8d, 0xad, 0x3d, 0xbd, 0x85, 0xbd, 0x9c, 0x6a, 0xe8, 0x2f, 0xf4, 0x45, 0x59, 0x74, 0x7f, 0x31, + 0x04, 0x6a, 0xa8, 0x3a, 0x11, 0xbd, 0xe1, 0xcf, 0xc8, 0x22, 0xbb, 0x83, 0x42, 0x24, 0x93, 0x69, + 0xca, 0x8b, 0xa5, 0xe1, 0x96, 0x6d, 0x1b, 0xb5, 0x5a, 0xb3, 0xbe, 0x52, 0x53, 0x1b, 0x05, 0x59, + 0x99, 0x81, 0x49, 0xf7, 0x75, 0xb5, 0x56, 0x5d, 0x2e, 0x64, 0x95, 0x13, 0x70, 0x6c, 0xa5, 0x58, + 0x6f, 0x56, 0xaa, 0xe7, 0x8a, 0xab, 0x95, 0xc5, 0x66, 0x69, 0xa5, 0xa8, 0xd6, 0x0b, 0x39, 0xe5, + 0x2a, 0x38, 0xd1, 0xa8, 0x94, 0xd5, 0xe6, 0x52, 0xb9, 0xd8, 0xd8, 0x50, 0xcb, 0xf5, 0x66, 0xb5, + 0xd6, 0xac, 0x16, 0xd7, 0xca, 0x85, 0xbc, 0xdb, 0xfc, 0xc9, 0xa7, 0x40, 0x6d, 0x26, 0xf6, 0x2b, + 0xe3, 0x64, 0x84, 0x32, 0x4e, 0xf5, 0x2a, 0x23, 0x84, 0xd5, 0x4a, 0x2d, 0xd7, 0xcb, 0xea, 0xb9, + 0x72, 0x61, 0xba, 0x9f, 0xae, 0xcd, 0x28, 0xc7, 0xa1, 0xe0, 0xf2, 0xd0, 0xac, 0xd4, 0xbd, 0x9c, + 0x8b, 0x85, 0x59, 0xf4, 0xe1, 0x3c, 0x9c, 0x54, 0xf1, 0x96, 0x6e, 0x3b, 0xd8, 0x5a, 0xd7, 0x2e, + 0xef, 0x60, 0xc3, 0xf1, 0x3a, 0xf9, 0x7f, 0x49, 0xac, 0x8c, 0x6b, 0x30, 0xdb, 0xa5, 0x34, 0xd6, + 0xb0, 0xb3, 0x6d, 0xb6, 0xd9, 0x28, 0xfc, 0xa4, 0xc8, 0x9e, 0x63, 0x7e, 0x3d, 0x9c, 0x5d, 0xe5, + 0xff, 0x0e, 0xe9, 0xb6, 0x1c, 0xa3, 0xdb, 0xd9, 0x61, 0x74, 0x5b, 0xb9, 0x06, 0xa6, 0x76, 0x6d, + 0x6c, 0x95, 0x77, 0x34, 0xbd, 0xe3, 0x5d, 0xce, 0xe9, 0x27, 0xa0, 0x37, 0x67, 0x45, 0x4f, 0xac, + 0x84, 0xea, 0xd2, 0x5f, 0x8c, 0x11, 0x7d, 0xeb, 0x69, 0x00, 0x56, 0xd9, 0x0d, 0xab, 0xc3, 0x94, + 0x35, 0x94, 0xe2, 0xf2, 0x77, 0x41, 0xef, 0x74, 0x74, 0x63, 0xcb, 0xdf, 0xf7, 0x0f, 0x12, 0xd0, + 0x8b, 0x65, 0x91, 0x13, 0x2c, 0x49, 0x79, 0x4b, 0xd6, 0x9a, 0x5e, 0x28, 0x8d, 0xb9, 0xdf, 0xdd, + 0xdf, 0x74, 0xf2, 0x4a, 0x01, 0x66, 0x48, 0x1a, 0x6b, 0x81, 0x85, 0x09, 0xb7, 0x0f, 0xf6, 0xc8, + 0xad, 0x95, 0x1b, 0x2b, 0xb5, 0x45, 0xff, 0xdb, 0xa4, 0x4b, 0xd2, 0x65, 0xa6, 0x58, 0x7d, 0x90, + 0xb4, 0xc6, 0x29, 0xe5, 0x09, 0x70, 0x55, 0xa8, 0xc3, 0x2e, 0xae, 0xaa, 0xe5, 0xe2, 0xe2, 0x83, + 0xcd, 0xf2, 0xb3, 0x2a, 0xf5, 0x46, 0x9d, 0x6f, 0x5c, 0x5e, 0x3b, 0x9a, 0x76, 0xf9, 0x2d, 0xaf, + 0x15, 0x2b, 0xab, 0xac, 0x7f, 0x5f, 0xaa, 0xa9, 0x6b, 0xc5, 0x46, 0x61, 0x06, 0xfd, 0x9a, 0x0c, + 0x85, 0x65, 0xec, 0xac, 0x9b, 0x96, 0xa3, 0x75, 0x56, 0x75, 0xe3, 0xe2, 0x86, 0xd5, 0xe1, 0x26, + 0x9b, 0xc2, 0x61, 0x3a, 0xf8, 0x21, 0x92, 0x23, 0x18, 0xbd, 0x23, 0xde, 0x25, 0xd9, 0x02, 0x65, + 0x0a, 0x12, 0xd0, 0x73, 0x24, 0x91, 0xe5, 0x6e, 0xf1, 0x52, 0x93, 0xe9, 0xc9, 0x73, 0xc7, 0x3d, + 0x3e, 0xf7, 0x41, 0x2d, 0x8f, 0x9e, 0x9f, 0x85, 0xc9, 0x25, 0xdd, 0xd0, 0x3a, 0xfa, 0xb3, 0xb9, + 0xf8, 0xa5, 0x41, 0x1f, 0x93, 0x89, 0xe9, 0x63, 0xa4, 0xa1, 0xc6, 0xcf, 0x5f, 0x94, 0x45, 0x97, + 0x17, 0x42, 0xb2, 0xf7, 0x98, 0x8c, 0x18, 0x3c, 0xdf, 0x27, 0x89, 0x2c, 0x2f, 0x0c, 0xa6, 0x97, + 0x0c, 0xc3, 0x8f, 0x7e, 0x77, 0xd8, 0x58, 0x3d, 0xed, 0x7b, 0xb2, 0x9f, 0x2a, 0x4c, 0xa1, 0x3f, + 0x97, 0x01, 0x2d, 0x63, 0xe7, 0x1c, 0xb6, 0xfc, 0xa9, 0x00, 0xe9, 0xf5, 0x99, 0xbd, 0x1d, 0x6a, + 0xb2, 0xaf, 0x0f, 0x03, 0x78, 0x9e, 0x07, 0xb0, 0x18, 0xd3, 0x78, 0x22, 0x48, 0x47, 0x34, 0xde, + 0x0a, 0xe4, 0x6d, 0xf2, 0x9d, 0xa9, 0xd9, 0x6d, 0xd1, 0xc3, 0x25, 0x21, 0x16, 0xa6, 0x4e, 0x09, + 0xab, 0x8c, 0x00, 0xfa, 0x96, 0x3f, 0x09, 0xfa, 0x61, 0x4e, 0x3b, 0x96, 0x0e, 0xcc, 0x6c, 0x32, + 0x7d, 0xb1, 0xd2, 0x55, 0x97, 0x7e, 0xf6, 0x0d, 0x7a, 0x5f, 0x0e, 0x8e, 0xf7, 0xab, 0x0e, 0xfa, + 0xdd, 0x0c, 0xb7, 0xc3, 0x8e, 0xc9, 0x90, 0x9f, 0x61, 0x1b, 0x88, 0xee, 0x8b, 0xf2, 0x34, 0x38, + 0xe1, 0x2f, 0xc3, 0x35, 0xcc, 0x2a, 0xbe, 0x64, 0x77, 0xb0, 0xe3, 0x60, 0x8b, 0x54, 0x6d, 0x52, + 0xed, 0xff, 0x51, 0x79, 0x06, 0x5c, 0xa9, 0x1b, 0xb6, 0xde, 0xc6, 0x56, 0x43, 0xef, 0xda, 0x45, + 0xa3, 0xdd, 0xd8, 0x75, 0x4c, 0x4b, 0xd7, 0xd8, 0x55, 0x92, 0x93, 0x6a, 0xd4, 0x67, 0xe5, 0x26, + 0x28, 0xe8, 0x76, 0xcd, 0xb8, 0x60, 0x6a, 0x56, 0x5b, 0x37, 0xb6, 0x56, 0x75, 0xdb, 0x61, 0x1e, + 0xc0, 0xfb, 0xd2, 0xd1, 0xdf, 0xcb, 0xa2, 0x87, 0xe9, 0x06, 0xc0, 0x1a, 0xd1, 0xa1, 0xfc, 0xb4, + 0x2c, 0x72, 0x3c, 0x2e, 0x19, 0xed, 0x64, 0xca, 0xf2, 0xbc, 0x71, 0x1b, 0x12, 0xfd, 0x47, 0x70, + 0xd2, 0xb5, 0xd0, 0x74, 0xcf, 0x10, 0x38, 0x57, 0x56, 0x2b, 0x4b, 0x95, 0xb2, 0x6b, 0x56, 0x9c, + 0x80, 0x63, 0xc1, 0xb7, 0xc5, 0x07, 0x9b, 0xf5, 0x72, 0xb5, 0x51, 0x98, 0x74, 0xfb, 0x29, 0x9a, + 0xbc, 0x54, 0xac, 0xac, 0x96, 0x17, 0x9b, 0x8d, 0x9a, 0xfb, 0x65, 0x71, 0x38, 0xd3, 0x02, 0x3d, + 0x92, 0x85, 0xa3, 0x44, 0xb6, 0x97, 0x89, 0x54, 0x5d, 0xa1, 0xf4, 0xf8, 0xda, 0xfa, 0x00, 0x4d, + 0x51, 0xf1, 0xa2, 0x4f, 0x0a, 0xdf, 0x94, 0x19, 0x82, 0xb0, 0xa7, 0x8c, 0x08, 0xcd, 0xf8, 0xa6, + 0x24, 0x12, 0xa1, 0x42, 0x98, 0x6c, 0x32, 0xa5, 0xf8, 0xd7, 0x71, 0x8f, 0x38, 0xd1, 0xe0, 0x13, + 0x2b, 0xb3, 0x44, 0x7e, 0x7e, 0xd6, 0x7a, 0x45, 0x25, 0xea, 0x30, 0x07, 0x40, 0x52, 0x88, 0x06, + 0x51, 0x3d, 0xe8, 0x3b, 0x5e, 0x45, 0xe9, 0x41, 0xb1, 0xd4, 0xa8, 0x9c, 0x2b, 0x47, 0xe9, 0xc1, + 0x27, 0x64, 0x98, 0x5c, 0xc6, 0x8e, 0x3b, 0xa7, 0xb2, 0xd1, 0x33, 0x05, 0xd6, 0x7f, 0x5c, 0x33, + 0xa6, 0x63, 0xb6, 0xb4, 0x8e, 0xbf, 0x0c, 0x40, 0xdf, 0xd0, 0x4f, 0x0d, 0x63, 0x82, 0x78, 0x45, + 0x47, 0x8c, 0x57, 0x3f, 0x08, 0x39, 0xc7, 0xfd, 0xcc, 0x96, 0xa1, 0xbf, 0x2f, 0x72, 0xb8, 0x72, + 0x89, 0x2c, 0x6a, 0x8e, 0xa6, 0xd2, 0xfc, 0xa1, 0xd1, 0x49, 0xd0, 0x76, 0x89, 0x60, 0xe4, 0xbb, + 0xd1, 0xfe, 0xfc, 0x5b, 0x19, 0x4e, 0xd0, 0xf6, 0x51, 0xec, 0x76, 0xeb, 0x8e, 0x69, 0x61, 0x15, + 0xb7, 0xb0, 0xde, 0x75, 0x7a, 0xd6, 0xf7, 0x2c, 0x9a, 0xea, 0x6d, 0x36, 0xb3, 0x57, 0xf4, 0x9b, + 0xb2, 0x68, 0x0c, 0xe6, 0x7d, 0xed, 0xb1, 0xa7, 0xbc, 0x88, 0xc6, 0xfe, 0x21, 0x49, 0x24, 0xaa, + 0x72, 0x42, 0xe2, 0xc9, 0x80, 0x7a, 0xff, 0x21, 0x00, 0xe5, 0xad, 0xdc, 0xa8, 0xe5, 0x52, 0xb9, + 0xb2, 0xee, 0x0e, 0x02, 0xd7, 0xc2, 0xd5, 0xeb, 0x1b, 0x6a, 0x69, 0xa5, 0x58, 0x2f, 0x37, 0xd5, + 0xf2, 0x72, 0xa5, 0xde, 0x60, 0x4e, 0x59, 0xf4, 0xaf, 0x09, 0xe5, 0x1a, 0x38, 0x55, 0xdf, 0x58, + 0xa8, 0x97, 0xd4, 0xca, 0x3a, 0x49, 0x57, 0xcb, 0xd5, 0xf2, 0x79, 0xf6, 0x75, 0x12, 0xbd, 0xa7, + 0x00, 0xd3, 0xee, 0x04, 0xa0, 0x4e, 0xe7, 0x05, 0xe8, 0x6b, 0x59, 0x98, 0x56, 0xb1, 0x6d, 0x76, + 0xf6, 0xc8, 0x1c, 0x61, 0x5c, 0x53, 0x8f, 0x6f, 0xc8, 0xa2, 0xe7, 0xb7, 0x43, 0xcc, 0xce, 0x87, + 0x18, 0x8d, 0x9e, 0x68, 0x6a, 0x7b, 0x9a, 0xde, 0xd1, 0x2e, 0xb0, 0xae, 0x66, 0x52, 0x0d, 0x12, + 0x94, 0x79, 0x50, 0xcc, 0x4b, 0x06, 0xb6, 0xea, 0xad, 0x4b, 0x65, 0x67, 0xbb, 0xd8, 0x6e, 0x5b, + 0xd8, 0xb6, 0xd9, 0xea, 0x45, 0x9f, 0x2f, 0xca, 0x8d, 0x70, 0x94, 0xa4, 0x86, 0x32, 0x53, 0x07, + 0x99, 0xde, 0x64, 0x3f, 0x67, 0xd1, 0xb8, 0xec, 0xe5, 0xcc, 0x85, 0x72, 0x06, 0xc9, 0xe1, 0xe3, + 0x12, 0x79, 0xfe, 0x94, 0xce, 0x19, 0x98, 0x36, 0xb4, 0x1d, 0x5c, 0x7e, 0xb8, 0xab, 0x5b, 0xd8, + 0x26, 0x8e, 0x31, 0xb2, 0x1a, 0x4e, 0x42, 0xef, 0x13, 0x3a, 0x6f, 0x2e, 0x26, 0xb1, 0x64, 0xba, + 0xbf, 0x3c, 0x84, 0xea, 0xf7, 0xe9, 0x67, 0x64, 0xf4, 0x1e, 0x19, 0x66, 0x18, 0x53, 0x45, 0xe3, + 0x72, 0xa5, 0x8d, 0xae, 0xe5, 0x8c, 0x5f, 0xcd, 0x4d, 0xf3, 0x8c, 0x5f, 0xf2, 0x82, 0x7e, 0x56, + 0x16, 0x75, 0x77, 0xee, 0x53, 0x71, 0x52, 0x46, 0xb4, 0xe3, 0xe8, 0xa6, 0xb9, 0xcb, 0x1c, 0x55, + 0x27, 0x55, 0xfa, 0x92, 0xe6, 0xa2, 0x1e, 0xfa, 0x03, 0x21, 0x67, 0x6a, 0xc1, 0x6a, 0x1c, 0x12, + 0x80, 0x1f, 0x91, 0x61, 0x8e, 0x71, 0x55, 0x67, 0xe7, 0x7c, 0x84, 0x0e, 0xbc, 0xfd, 0x9c, 0xb0, + 0x21, 0xd8, 0xa7, 0xfe, 0xac, 0xa4, 0xc7, 0x0d, 0x90, 0x1f, 0x10, 0x0a, 0x8e, 0x26, 0x5c, 0x91, + 0x43, 0x82, 0xf2, 0x2d, 0x59, 0x98, 0xde, 0xb0, 0xb1, 0xc5, 0xfc, 0xf6, 0xd1, 0xab, 0xb2, 0x20, + 0x2f, 0x63, 0x6e, 0x23, 0xf5, 0x45, 0xc2, 0x1e, 0xbe, 0xe1, 0xca, 0x86, 0x88, 0xba, 0x36, 0x52, + 0x04, 0x6c, 0x37, 0xc0, 0x1c, 0x15, 0x69, 0xd1, 0x71, 0x5c, 0x23, 0xd1, 0xf3, 0xa6, 0xed, 0x49, + 0x1d, 0xc5, 0x56, 0x11, 0x29, 0xcb, 0xcd, 0x52, 0x72, 0x79, 0x5a, 0xc5, 0x9b, 0x74, 0x3e, 0x9b, + 0x55, 0x7b, 0x52, 0x95, 0x5b, 0xe1, 0x0a, 0xb3, 0x8b, 0xe9, 0xf9, 0x95, 0x50, 0xe6, 0x1c, 0xc9, + 0xdc, 0xef, 0x13, 0xfa, 0x9a, 0x90, 0xaf, 0xae, 0xb8, 0x74, 0x92, 0xe9, 0x42, 0x77, 0x34, 0x26, + 0xc9, 0x71, 0x28, 0xb8, 0x39, 0xc8, 0xfe, 0x8b, 0x5a, 0xae, 0xd7, 0x56, 0xcf, 0x95, 0xfb, 0x2f, + 0x63, 0xe4, 0xd0, 0xf3, 0x64, 0x98, 0x5a, 0xb0, 0x4c, 0xad, 0xdd, 0xd2, 0x6c, 0x07, 0x7d, 0x4b, + 0x82, 0x99, 0x75, 0xed, 0x72, 0xc7, 0xd4, 0xda, 0xc4, 0xbf, 0xbf, 0xa7, 0x2f, 0xe8, 0xd2, 0x4f, + 0x5e, 0x5f, 0xc0, 0x5e, 0xf9, 0x83, 0x81, 0xfe, 0xd1, 0xbd, 0x8c, 0xc8, 0x85, 0x9a, 0xfe, 0x36, + 0x9f, 0xd4, 0x2f, 0x58, 0xa9, 0xc7, 0xd7, 0x7c, 0x98, 0xa7, 0x08, 0x8b, 0xf2, 0x3d, 0x62, 0xe1, + 0x47, 0x45, 0x48, 0x1e, 0xce, 0xae, 0xfc, 0xf3, 0x27, 0x21, 0xbf, 0x88, 0x89, 0x15, 0xf7, 0x3f, + 0x24, 0x98, 0xa8, 0x63, 0x87, 0x58, 0x70, 0x77, 0x70, 0x9e, 0xc2, 0x6d, 0x92, 0x21, 0x70, 0x62, + 0xf7, 0xde, 0xdd, 0xc9, 0x7a, 0xe8, 0xbc, 0x35, 0x79, 0x4e, 0xe0, 0x91, 0x48, 0xcb, 0x9d, 0x67, + 0x65, 0x1e, 0xc8, 0x23, 0x31, 0x96, 0x54, 0xfa, 0xbe, 0x56, 0x6f, 0x93, 0x98, 0x6b, 0x55, 0xa8, + 0xd7, 0xfb, 0x8d, 0xb0, 0x7e, 0xc6, 0x7a, 0x9b, 0x31, 0xe6, 0x63, 0x9c, 0xa3, 0x9e, 0x0a, 0x13, + 0x54, 0xe6, 0xde, 0x7c, 0xb4, 0xd7, 0x4f, 0x81, 0x92, 0x20, 0x67, 0xaf, 0xbd, 0x9c, 0x82, 0x2e, + 0x6a, 0xd1, 0x85, 0x8f, 0x25, 0x06, 0xc1, 0x4c, 0x15, 0x3b, 0x97, 0x4c, 0xeb, 0x62, 0xdd, 0xd1, + 0x1c, 0x8c, 0xfe, 0x55, 0x02, 0xb9, 0x8e, 0x9d, 0x70, 0xf4, 0x93, 0x2a, 0x1c, 0xa3, 0x15, 0x62, + 0x19, 0x49, 0xff, 0x4d, 0x2b, 0x72, 0xa6, 0xaf, 0x10, 0x42, 0xf9, 0xd4, 0xfd, 0xbf, 0xa2, 0x5f, + 0xee, 0x1b, 0xf4, 0x49, 0xea, 0x33, 0x69, 0x60, 0x92, 0x09, 0x33, 0xe8, 0x2a, 0x58, 0x84, 0x9e, + 0xbe, 0x57, 0xc8, 0xac, 0x16, 0xa3, 0x79, 0x38, 0x5d, 0xc1, 0x07, 0xae, 0x82, 0x6c, 0x69, 0x5b, + 0x73, 0xd0, 0x5b, 0x65, 0x80, 0x62, 0xbb, 0xbd, 0x46, 0x7d, 0xc0, 0xc3, 0x0e, 0x69, 0x67, 0x61, + 0xa6, 0xb5, 0xad, 0x05, 0x77, 0x9b, 0xd0, 0xfe, 0x80, 0x4b, 0x53, 0x9e, 0x16, 0x38, 0x93, 0x53, + 0xa9, 0xa2, 0x1e, 0x98, 0xdc, 0x32, 0x18, 0x6d, 0xdf, 0xd1, 0x9c, 0x0f, 0x85, 0x19, 0x7b, 0x84, + 0xce, 0xfd, 0x7d, 0x3e, 0x60, 0x2f, 0x7a, 0x0e, 0xc7, 0x48, 0xfb, 0x07, 0x6c, 0x82, 0x84, 0x84, + 0x27, 0xbd, 0xc5, 0x02, 0x7a, 0xc4, 0xf3, 0x35, 0x96, 0xd0, 0xb5, 0x4a, 0xb9, 0xad, 0x7b, 0xa2, + 0x65, 0x01, 0xb3, 0xd0, 0x0b, 0x33, 0xc9, 0xe0, 0x8b, 0x17, 0xdc, 0x7d, 0x30, 0x8b, 0xdb, 0xba, + 0x83, 0xbd, 0x5a, 0x32, 0x01, 0xc6, 0x41, 0xcc, 0xff, 0x80, 0x9e, 0x2b, 0x1c, 0x74, 0x8d, 0x08, + 0x74, 0x7f, 0x8d, 0x22, 0xda, 0x9f, 0x58, 0x18, 0x35, 0x31, 0x9a, 0xe9, 0x83, 0xf5, 0x53, 0x32, + 0x9c, 0x68, 0x98, 0x5b, 0x5b, 0x1d, 0xec, 0x89, 0x09, 0x53, 0xef, 0x4c, 0xa4, 0x8d, 0x12, 0x2e, + 0xb2, 0x13, 0x64, 0x3e, 0xa4, 0xfb, 0x47, 0xc9, 0xdc, 0x17, 0xfe, 0xc4, 0x54, 0xec, 0x2c, 0x8a, + 0x88, 0xab, 0x2f, 0x9f, 0x11, 0x28, 0x88, 0x05, 0x7c, 0x16, 0x26, 0x9b, 0x3e, 0x10, 0x9f, 0x93, + 0x60, 0x96, 0xde, 0x5c, 0xe9, 0x29, 0xe8, 0x03, 0x23, 0x04, 0x00, 0x7d, 0x2b, 0x23, 0xea, 0x67, + 0x4b, 0x64, 0xc2, 0x71, 0x12, 0x21, 0x62, 0xb1, 0xa0, 0x2a, 0x03, 0xc9, 0xa5, 0x2f, 0xda, 0x3f, + 0x91, 0x61, 0x7a, 0x19, 0x7b, 0x2d, 0xcd, 0x4e, 0xdc, 0x13, 0x9d, 0x85, 0x19, 0x72, 0x7d, 0x5b, + 0x8d, 0x1d, 0x93, 0xa4, 0xab, 0x66, 0x5c, 0x9a, 0x72, 0x3d, 0xcc, 0x5e, 0xc0, 0x9b, 0xa6, 0x85, + 0x6b, 0xdc, 0x59, 0x4a, 0x3e, 0x31, 0x22, 0x3c, 0x1d, 0x17, 0x07, 0x6d, 0x81, 0xc7, 0xe6, 0xe6, + 0xfd, 0xc2, 0x0c, 0x55, 0x25, 0x62, 0xcc, 0x79, 0x3a, 0x4c, 0x32, 0xe4, 0x3d, 0x33, 0x2d, 0xae, + 0x5f, 0xf4, 0xf3, 0xa2, 0xd7, 0xf8, 0x88, 0x96, 0x39, 0x44, 0x6f, 0x4b, 0xc2, 0xc4, 0x58, 0xee, + 0x77, 0x2f, 0x84, 0xca, 0x5f, 0xb8, 0x5c, 0x69, 0xdb, 0x68, 0x2d, 0x19, 0xa6, 0xa7, 0x01, 0xfc, + 0xc6, 0xe1, 0x85, 0xb5, 0x08, 0xa5, 0xf0, 0x91, 0xeb, 0x63, 0x0f, 0xea, 0xf5, 0x8a, 0x83, 0xb0, + 0x33, 0x62, 0x60, 0xc4, 0x0e, 0xf8, 0x89, 0x70, 0x92, 0x3e, 0x3a, 0x1f, 0x97, 0xe1, 0x84, 0x7f, + 0xfe, 0x68, 0x55, 0xb3, 0x83, 0x76, 0x57, 0x4a, 0x06, 0x11, 0x77, 0xe0, 0xc3, 0x6f, 0x2c, 0x5f, + 0x4f, 0x36, 0x66, 0xf4, 0xe5, 0x64, 0xb4, 0xe8, 0x28, 0x37, 0xc3, 0x31, 0x63, 0x77, 0xc7, 0x97, + 0x3a, 0x69, 0xf1, 0xac, 0x85, 0xef, 0xff, 0x90, 0x64, 0x64, 0x12, 0x61, 0x7e, 0x2c, 0x73, 0x4a, + 0xee, 0x48, 0xd7, 0x53, 0x12, 0xc1, 0x88, 0xfe, 0x39, 0x93, 0xa8, 0x77, 0x1b, 0x7c, 0xe6, 0x2b, + 0x41, 0x2f, 0x75, 0x88, 0x07, 0xbe, 0xce, 0x4e, 0x40, 0xae, 0xbc, 0xd3, 0x75, 0x2e, 0x9f, 0x7d, + 0x22, 0xcc, 0xd6, 0x1d, 0x0b, 0x6b, 0x3b, 0xa1, 0x9d, 0x01, 0xc7, 0xbc, 0x88, 0x0d, 0x6f, 0x67, + 0x80, 0xbc, 0xdc, 0x79, 0x07, 0x4c, 0x18, 0x66, 0x53, 0xdb, 0x75, 0xb6, 0x95, 0x6b, 0xf7, 0x1d, + 0xa9, 0x67, 0xe0, 0xd7, 0x58, 0x0c, 0xa3, 0x2f, 0xde, 0x45, 0xd6, 0x86, 0xf3, 0x86, 0x59, 0xdc, + 0x75, 0xb6, 0x17, 0xae, 0xf9, 0xc8, 0xdf, 0x9c, 0xce, 0x7c, 0xe2, 0x6f, 0x4e, 0x67, 0xbe, 0xf0, + 0x37, 0xa7, 0x33, 0x3f, 0xf7, 0xa5, 0xd3, 0x47, 0x3e, 0xf1, 0xa5, 0xd3, 0x47, 0x3e, 0xf7, 0xa5, + 0xd3, 0x47, 0x7e, 0x58, 0xea, 0x5e, 0xb8, 0x90, 0x27, 0x54, 0x9e, 0xfa, 0xff, 0x06, 0x00, 0x00, + 0xff, 0xff, 0x07, 0xc6, 0xed, 0x93, 0x99, 0x0b, 0x02, 0x00, } func (m *Rpc) Marshal() (dAtA []byte, err error) { @@ -76751,6 +77106,13 @@ func (m *RpcAccountCreateRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) _ = i var l int _ = l + if len(m.JsonApiListenAddr) > 0 { + i -= len(m.JsonApiListenAddr) + copy(dAtA[i:], m.JsonApiListenAddr) + i = encodeVarintCommands(dAtA, i, uint64(len(m.JsonApiListenAddr))) + i-- + dAtA[i] = 0x4a + } if m.PreferYamuxTransport { i-- if m.PreferYamuxTransport { @@ -77337,6 +77699,13 @@ func (m *RpcAccountSelectRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) _ = i var l int _ = l + if len(m.JsonApiListenAddr) > 0 { + i -= len(m.JsonApiListenAddr) + copy(dAtA[i:], m.JsonApiListenAddr) + i = encodeVarintCommands(dAtA, i, uint64(len(m.JsonApiListenAddr))) + i-- + dAtA[i] = 0x3a + } if m.PreferYamuxTransport { i-- if m.PreferYamuxTransport { @@ -78186,6 +78555,129 @@ func (m *RpcAccountEnableLocalNetworkSyncResponseError) MarshalToSizedBuffer(dAt return len(dAtA) - i, nil } +func (m *RpcAccountChangeJsonApiAddr) 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 *RpcAccountChangeJsonApiAddr) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *RpcAccountChangeJsonApiAddr) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + return len(dAtA) - i, nil +} + +func (m *RpcAccountChangeJsonApiAddrRequest) 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 *RpcAccountChangeJsonApiAddrRequest) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *RpcAccountChangeJsonApiAddrRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.ListenAddr) > 0 { + i -= len(m.ListenAddr) + copy(dAtA[i:], m.ListenAddr) + i = encodeVarintCommands(dAtA, i, uint64(len(m.ListenAddr))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *RpcAccountChangeJsonApiAddrResponse) 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 *RpcAccountChangeJsonApiAddrResponse) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *RpcAccountChangeJsonApiAddrResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.Error != nil { + { + size, err := m.Error.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintCommands(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + } + return len(dAtA) - i, nil +} + +func (m *RpcAccountChangeJsonApiAddrResponseError) 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 *RpcAccountChangeJsonApiAddrResponseError) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *RpcAccountChangeJsonApiAddrResponseError) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.Description) > 0 { + i -= len(m.Description) + copy(dAtA[i:], m.Description) + i = encodeVarintCommands(dAtA, i, uint64(len(m.Description))) + i-- + dAtA[i] = 0x12 + } + if m.Code != 0 { + i = encodeVarintCommands(dAtA, i, uint64(m.Code)) + i-- + dAtA[i] = 0x8 + } + return len(dAtA) - i, nil +} + func (m *RpcAccountChangeNetworkConfigAndRestart) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -78380,6 +78872,11 @@ func (m *RpcAccountLocalLinkNewChallengeRequest) MarshalToSizedBuffer(dAtA []byt _ = i var l int _ = l + if m.Scope != 0 { + i = encodeVarintCommands(dAtA, i, uint64(m.Scope)) + i-- + dAtA[i] = 0x10 + } if len(m.AppName) > 0 { i -= len(m.AppName) copy(dAtA[i:], m.AppName) @@ -88359,15 +88856,17 @@ func (m *RpcObjectListExportRequest) MarshalToSizedBuffer(dAtA []byte) (int, err _ = i var l int _ = l - if m.IncludeDependentDetails { - i-- - if m.IncludeDependentDetails { - dAtA[i] = 1 - } else { - dAtA[i] = 0 + if m.LinksStateFilters != nil { + { + size, err := m.LinksStateFilters.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintCommands(dAtA, i, uint64(size)) } i-- - dAtA[i] = 0x60 + dAtA[i] = 0x62 } if m.NoProgress { i-- @@ -88460,6 +88959,90 @@ func (m *RpcObjectListExportRequest) MarshalToSizedBuffer(dAtA []byte) (int, err return len(dAtA) - i, nil } +func (m *RpcObjectListExportStateFilters) 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 *RpcObjectListExportStateFilters) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *RpcObjectListExportStateFilters) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.RemoveBlocks { + i-- + if m.RemoveBlocks { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x10 + } + if len(m.RelationsWhiteList) > 0 { + for iNdEx := len(m.RelationsWhiteList) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.RelationsWhiteList[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintCommands(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + } + } + return len(dAtA) - i, nil +} + +func (m *RpcObjectListExportRelationsWhiteList) 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 *RpcObjectListExportRelationsWhiteList) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *RpcObjectListExportRelationsWhiteList) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.AllowedRelations) > 0 { + for iNdEx := len(m.AllowedRelations) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.AllowedRelations[iNdEx]) + copy(dAtA[i:], m.AllowedRelations[iNdEx]) + i = encodeVarintCommands(dAtA, i, uint64(len(m.AllowedRelations[iNdEx]))) + i-- + dAtA[i] = 0x12 + } + } + if m.Layout != 0 { + i = encodeVarintCommands(dAtA, i, uint64(m.Layout)) + i-- + dAtA[i] = 0x8 + } + return len(dAtA) - i, nil +} + func (m *RpcObjectListExportResponse) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -120000,6 +120583,10 @@ func (m *RpcAccountCreateRequest) Size() (n int) { if m.PreferYamuxTransport { n += 2 } + l = len(m.JsonApiListenAddr) + if l > 0 { + n += 1 + l + sovCommands(uint64(l)) + } return n } @@ -120235,6 +120822,10 @@ func (m *RpcAccountSelectRequest) Size() (n int) { if m.PreferYamuxTransport { n += 2 } + l = len(m.JsonApiListenAddr) + if l > 0 { + n += 1 + l + sovCommands(uint64(l)) + } return n } @@ -120567,6 +121158,57 @@ func (m *RpcAccountEnableLocalNetworkSyncResponseError) Size() (n int) { return n } +func (m *RpcAccountChangeJsonApiAddr) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + return n +} + +func (m *RpcAccountChangeJsonApiAddrRequest) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.ListenAddr) + if l > 0 { + n += 1 + l + sovCommands(uint64(l)) + } + return n +} + +func (m *RpcAccountChangeJsonApiAddrResponse) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Error != nil { + l = m.Error.Size() + n += 1 + l + sovCommands(uint64(l)) + } + return n +} + +func (m *RpcAccountChangeJsonApiAddrResponseError) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Code != 0 { + n += 1 + sovCommands(uint64(m.Code)) + } + l = len(m.Description) + if l > 0 { + n += 1 + l + sovCommands(uint64(l)) + } + return n +} + func (m *RpcAccountChangeNetworkConfigAndRestart) Size() (n int) { if m == nil { return 0 @@ -120649,6 +121291,9 @@ func (m *RpcAccountLocalLinkNewChallengeRequest) Size() (n int) { if l > 0 { n += 1 + l + sovCommands(uint64(l)) } + if m.Scope != 0 { + n += 1 + sovCommands(uint64(m.Scope)) + } return n } @@ -124906,12 +125551,49 @@ func (m *RpcObjectListExportRequest) Size() (n int) { if m.NoProgress { n += 2 } - if m.IncludeDependentDetails { + if m.LinksStateFilters != nil { + l = m.LinksStateFilters.Size() + n += 1 + l + sovCommands(uint64(l)) + } + return n +} + +func (m *RpcObjectListExportStateFilters) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if len(m.RelationsWhiteList) > 0 { + for _, e := range m.RelationsWhiteList { + l = e.Size() + n += 1 + l + sovCommands(uint64(l)) + } + } + if m.RemoveBlocks { n += 2 } return n } +func (m *RpcObjectListExportRelationsWhiteList) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Layout != 0 { + n += 1 + sovCommands(uint64(m.Layout)) + } + if len(m.AllowedRelations) > 0 { + for _, s := range m.AllowedRelations { + l = len(s) + n += 1 + l + sovCommands(uint64(l)) + } + } + return n +} + func (m *RpcObjectListExportResponse) Size() (n int) { if m == nil { return 0 @@ -146952,6 +147634,38 @@ func (m *RpcAccountCreateRequest) Unmarshal(dAtA []byte) error { } } m.PreferYamuxTransport = bool(v != 0) + case 9: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field JsonApiListenAddr", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowCommands + } + 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 ErrInvalidLengthCommands + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthCommands + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.JsonApiListenAddr = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipCommands(dAtA[iNdEx:]) @@ -148399,6 +149113,38 @@ func (m *RpcAccountSelectRequest) Unmarshal(dAtA []byte) error { } } m.PreferYamuxTransport = bool(v != 0) + case 7: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field JsonApiListenAddr", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowCommands + } + 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 ErrInvalidLengthCommands + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthCommands + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.JsonApiListenAddr = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipCommands(dAtA[iNdEx:]) @@ -150495,6 +151241,325 @@ func (m *RpcAccountEnableLocalNetworkSyncResponseError) Unmarshal(dAtA []byte) e } return nil } +func (m *RpcAccountChangeJsonApiAddr) 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 ErrIntOverflowCommands + } + 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: ChangeJsonApiAddr: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ChangeJsonApiAddr: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + default: + iNdEx = preIndex + skippy, err := skipCommands(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthCommands + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *RpcAccountChangeJsonApiAddrRequest) 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 ErrIntOverflowCommands + } + 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: Request: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Request: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ListenAddr", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowCommands + } + 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 ErrInvalidLengthCommands + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthCommands + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.ListenAddr = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipCommands(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthCommands + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *RpcAccountChangeJsonApiAddrResponse) 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 ErrIntOverflowCommands + } + 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: Response: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Response: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Error", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowCommands + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthCommands + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthCommands + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Error == nil { + m.Error = &RpcAccountChangeJsonApiAddrResponseError{} + } + if err := m.Error.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipCommands(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthCommands + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *RpcAccountChangeJsonApiAddrResponseError) 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 ErrIntOverflowCommands + } + 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: Error: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Error: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Code", wireType) + } + m.Code = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowCommands + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Code |= RpcAccountChangeJsonApiAddrResponseErrorCode(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Description", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowCommands + } + 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 ErrInvalidLengthCommands + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthCommands + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Description = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipCommands(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthCommands + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} func (m *RpcAccountChangeNetworkConfigAndRestart) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 @@ -150994,6 +152059,25 @@ func (m *RpcAccountLocalLinkNewChallengeRequest) Unmarshal(dAtA []byte) error { } m.AppName = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex + case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Scope", wireType) + } + m.Scope = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowCommands + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Scope |= model.AccountAuthLocalApiScope(b&0x7F) << shift + if b < 0x80 { + break + } + } default: iNdEx = preIndex skippy, err := skipCommands(dAtA[iNdEx:]) @@ -178338,8 +179422,128 @@ func (m *RpcObjectListExportRequest) Unmarshal(dAtA []byte) error { } m.NoProgress = bool(v != 0) case 12: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field LinksStateFilters", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowCommands + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthCommands + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthCommands + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.LinksStateFilters == nil { + m.LinksStateFilters = &RpcObjectListExportStateFilters{} + } + if err := m.LinksStateFilters.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipCommands(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthCommands + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *RpcObjectListExportStateFilters) 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 ErrIntOverflowCommands + } + 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: StateFilters: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: StateFilters: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field RelationsWhiteList", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowCommands + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthCommands + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthCommands + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.RelationsWhiteList = append(m.RelationsWhiteList, &RpcObjectListExportRelationsWhiteList{}) + if err := m.RelationsWhiteList[len(m.RelationsWhiteList)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field IncludeDependentDetails", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field RemoveBlocks", wireType) } var v int for shift := uint(0); ; shift += 7 { @@ -178356,7 +179560,108 @@ func (m *RpcObjectListExportRequest) Unmarshal(dAtA []byte) error { break } } - m.IncludeDependentDetails = bool(v != 0) + m.RemoveBlocks = bool(v != 0) + default: + iNdEx = preIndex + skippy, err := skipCommands(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthCommands + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *RpcObjectListExportRelationsWhiteList) 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 ErrIntOverflowCommands + } + 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: RelationsWhiteList: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: RelationsWhiteList: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Layout", wireType) + } + m.Layout = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowCommands + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Layout |= model.ObjectTypeLayout(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field AllowedRelations", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowCommands + } + 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 ErrInvalidLengthCommands + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthCommands + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.AllowedRelations = append(m.AllowedRelations, string(dAtA[iNdEx:postIndex])) + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipCommands(dAtA[iNdEx:]) From 16c425f5462f80a20a76ff3cea1c7c90e2b01476 Mon Sep 17 00:00:00 2001 From: AnastasiaShemyakinskaya Date: Fri, 24 Jan 2025 16:34:05 +0100 Subject: [PATCH 155/195] GO-4889: remove not needed code Signed-off-by: AnastasiaShemyakinskaya --- core/block/export/export.go | 24 +-- core/block/export/export_test.go | 131 ------------ core/converter/pbc/pbc.go | 18 +- core/converter/pbc/pbc_test.go | 48 +---- docs/proto.md | 18 -- pb/protos/snapshot.proto | 6 - pb/snapshot.pb.go | 346 +++---------------------------- 7 files changed, 34 insertions(+), 557 deletions(-) diff --git a/core/block/export/export.go b/core/block/export/export.go index 9dd658cc5..0b6d70d92 100644 --- a/core/block/export/export.go +++ b/core/block/export/export.go @@ -179,7 +179,7 @@ func newExportContext(e *export, req pb.RpcObjectListExportRequest) *exportConte reqIds: req.ObjectIds, zip: req.Zip, linkStateFilters: pbFiltersToState(req.LinksStateFilters), - includeDependentDetails: req.IncludeDependentDetails,export: e, + export: e, } return ec } @@ -1016,16 +1016,12 @@ func (e *exportContext) writeDoc(ctx context.Context, wr writer, docId string, d } } - dependentDetails, err := e.getDependentDetails(b, st, err) - if err != nil { - return err - } var conv converter.Converter switch e.format { case model.Export_Markdown: conv = md.NewMDConverter(st, wr.Namer()) case model.Export_Protobuf: - conv = pbc.NewConverter(st, e.isJson, dependentDetails) + conv = pbc.NewConverter(st, e.isJson) case model.Export_JSON: conv = pbjson.NewConverter(st) } @@ -1047,22 +1043,6 @@ func (e *exportContext) writeDoc(ctx context.Context, wr writer, docId string, d }) } -func (e *exportContext) getDependentDetails(b sb.SmartBlock, st *state.State, err error) ([]database.Record, error) { - var dependentDetails []database.Record - if e.includeDependentDetails { - dependentObjectIDs := objectlink.DependentObjectIDs(st, b.Space(), objectlink.Flags{ - Blocks: true, - Details: true, - Types: true, - }) - dependentDetails, err = e.objectStore.SpaceIndex(b.SpaceID()).QueryByIds(dependentObjectIDs) - if err != nil { - return nil, err - } - } - return dependentDetails, nil -} - func (e *exportContext) saveFile(ctx context.Context, wr writer, fileObject sb.SmartBlock, exportAllSpaces bool) (fileName string, err error) { fullId := domain.FullFileId{ SpaceId: fileObject.Space().Id(), diff --git a/core/block/export/export_test.go b/core/block/export/export_test.go index da38e3599..001ce203b 100644 --- a/core/block/export/export_test.go +++ b/core/block/export/export_test.go @@ -31,7 +31,6 @@ import ( "github.com/anyproto/anytype-heart/pkg/lib/pb/model" "github.com/anyproto/anytype-heart/space/spacecore/typeprovider/mock_typeprovider" "github.com/anyproto/anytype-heart/tests/testutil" - "github.com/anyproto/anytype-heart/util/pbtypes" ) func TestFileNamer_Get(t *testing.T) { @@ -2126,136 +2125,6 @@ func Test_docsForExport(t *testing.T) { assert.Nil(t, err) assert.Equal(t, 2, len(expCtx.docs)) }) - t.Run("include dependent details", func(t *testing.T) { - // given - storeFixture := objectstore.NewStoreFixture(t) - objectTypeId := "customObjectType" - objectTypeUniqueKey, err := domain.NewUniqueKey(smartblock.SmartBlockTypeObjectType, objectTypeId) - assert.Nil(t, err) - - objectID := "id" - targetBlockId := "targetBlockId" - storeFixture.AddObjects(t, spaceId, []spaceindex.TestObject{ - { - bundle.RelationKeyId: domain.String(objectID), - bundle.RelationKeyType: domain.String(objectTypeId), - bundle.RelationKeySpaceId: domain.String(spaceId), - }, - { - bundle.RelationKeyId: domain.String(targetBlockId), - bundle.RelationKeyType: domain.String(objectTypeId), - bundle.RelationKeySpaceId: domain.String(spaceId), - bundle.RelationKeyName: domain.String("test"), - }, - { - bundle.RelationKeyId: domain.String(objectTypeId), - bundle.RelationKeyUniqueKey: domain.String(objectTypeUniqueKey.Marshal()), - bundle.RelationKeyLayout: domain.Int64(int64(model.ObjectType_objectType)), - bundle.RelationKeyRecommendedRelations: domain.StringList([]string{addr.MissingObject}), - bundle.RelationKeySpaceId: domain.String(spaceId), - }, - }) - - objectGetter := mock_cache.NewMockObjectGetter(t) - - smartBlockTest := smarttest.New(objectID) - doc := smartBlockTest.NewState().SetDetails(domain.NewDetailsFromMap(map[domain.RelationKey]domain.Value{ - bundle.RelationKeyId: domain.String(objectID), - bundle.RelationKeyType: domain.String(objectTypeId), - })) - doc.AddRelationLinks(&model.RelationLink{ - Key: bundle.RelationKeyId.String(), - Format: model.RelationFormat_longtext, - }, &model.RelationLink{ - Key: bundle.RelationKeyType.String(), - Format: model.RelationFormat_longtext, - }) - smartBlockTest.Doc = doc - - smartBlockTest.AddBlock(simple.New(&model.Block{ - Id: objectID, - ChildrenIds: []string{"link"}, - Content: &model.BlockContentOfSmartblock{Smartblock: &model.BlockContentSmartblock{}}, - })) - smartBlockTest.AddBlock(simple.New(&model.Block{ - Id: "link", - Content: &model.BlockContentOfLink{Link: &model.BlockContentLink{ - TargetBlockId: targetBlockId, - }}, - })) - - smartBlockTest.SetSpaceId(spaceId) - objectType := smarttest.New(objectTypeId) - objectTypeDoc := objectType.NewState().SetDetails(domain.NewDetailsFromMap(map[domain.RelationKey]domain.Value{ - bundle.RelationKeyId: domain.String(objectTypeId), - bundle.RelationKeyType: domain.String(objectTypeId), - })) - objectTypeDoc.AddRelationLinks(&model.RelationLink{ - Key: bundle.RelationKeyId.String(), - Format: model.RelationFormat_longtext, - }, &model.RelationLink{ - Key: bundle.RelationKeyType.String(), - Format: model.RelationFormat_longtext, - }) - objectType.Doc = objectTypeDoc - objectType.SetType(smartblock.SmartBlockTypeObjectType) - objectType.SetSpaceId(spaceId) - - objectGetter.EXPECT().GetObject(context.Background(), objectID).Return(smartBlockTest, nil) - objectGetter.EXPECT().GetObject(context.Background(), objectTypeId).Return(objectType, nil) - - a := &app.App{} - mockSender := mock_event.NewMockSender(t) - a.Register(testutil.PrepareMock(context.Background(), a, mockSender)) - service := process.New() - err = service.Init(a) - assert.Nil(t, err) - - notifications := mock_notifications.NewMockNotifications(t) - - e := &export{ - objectStore: storeFixture, - picker: objectGetter, - processService: service, - notificationService: notifications, - } - - // when - path, success, err := e.Export(context.Background(), pb.RpcObjectListExportRequest{ - SpaceId: spaceId, - Path: t.TempDir(), - ObjectIds: []string{objectID}, - Format: model.Export_Protobuf, - IncludeFiles: true, - IsJson: true, - NoProgress: true, - IncludeDependentDetails: true, - }) - - // then - assert.Nil(t, err) - assert.Equal(t, 2, success) - - objectPath := filepath.Join(path, objectsDirectory, objectID+".pb.json") - file, err := os.Open(objectPath) - assert.Nil(t, err) - var snapshot pb.SnapshotWithType - err = jsonpb.Unmarshal(file, &snapshot) - assert.Nil(t, err) - - expected := []*pb.DependantDetail{ - { - Id: targetBlockId, - Details: &types.Struct{Fields: map[string]*types.Value{ - bundle.RelationKeyId.String(): pbtypes.String(targetBlockId), - bundle.RelationKeyType.String(): pbtypes.String(objectTypeId), - bundle.RelationKeySpaceId.String(): pbtypes.String(spaceId), - bundle.RelationKeyName.String(): pbtypes.String("test"), - }}, - }, - } - assert.Equal(t, expected, snapshot.DependantDetails) - }) } func Test_provideFileName(t *testing.T) { diff --git a/core/converter/pbc/pbc.go b/core/converter/pbc/pbc.go index af8cc7150..8196973cf 100644 --- a/core/converter/pbc/pbc.go +++ b/core/converter/pbc/pbc.go @@ -7,7 +7,6 @@ import ( "github.com/anyproto/anytype-heart/core/converter" "github.com/anyproto/anytype-heart/core/domain" "github.com/anyproto/anytype-heart/pb" - "github.com/anyproto/anytype-heart/pkg/lib/bundle" "github.com/anyproto/anytype-heart/pkg/lib/database" "github.com/anyproto/anytype-heart/pkg/lib/logging" "github.com/anyproto/anytype-heart/pkg/lib/pb/model" @@ -15,11 +14,10 @@ import ( var log = logging.Logger("pb-converter") -func NewConverter(s state.Doc, isJSON bool, dependentDetails []database.Record) converter.Converter { +func NewConverter(s state.Doc, isJSON bool) converter.Converter { return &pbc{ - s: s, - isJSON: isJSON, - dependentDetails: dependentDetails, + s: s, + isJSON: isJSON, } } @@ -42,20 +40,10 @@ func (p *pbc) Convert(sbType model.SmartBlockType) []byte { FileInfo: st.GetFileInfo().ToModel(), }, } - dependentDetails := make([]*pb.DependantDetail, 0, len(p.dependentDetails)) - for _, detail := range p.dependentDetails { - dependentDetails = append(dependentDetails, &pb.DependantDetail{ - Id: detail.Details.GetString(bundle.RelationKeyId), - Details: detail.Details.ToProto(), - }) - } mo := &pb.SnapshotWithType{ SbType: sbType, Snapshot: snapshot, } - if len(dependentDetails) > 0 { - mo.DependantDetails = dependentDetails - } if p.isJSON { m := jsonpb.Marshaler{Indent: " "} result, err := m.MarshalToString(mo) diff --git a/core/converter/pbc/pbc_test.go b/core/converter/pbc/pbc_test.go index ca4f3fe33..66d74d210 100644 --- a/core/converter/pbc/pbc_test.go +++ b/core/converter/pbc/pbc_test.go @@ -3,55 +3,17 @@ package pbc import ( "testing" - "github.com/gogo/protobuf/jsonpb" - "github.com/gogo/protobuf/types" "github.com/stretchr/testify/assert" "github.com/anyproto/anytype-heart/core/block/editor/state" "github.com/anyproto/anytype-heart/core/block/editor/template" - "github.com/anyproto/anytype-heart/core/domain" - "github.com/anyproto/anytype-heart/pb" - "github.com/anyproto/anytype-heart/pkg/lib/bundle" - "github.com/anyproto/anytype-heart/pkg/lib/database" "github.com/anyproto/anytype-heart/pkg/lib/pb/model" - "github.com/anyproto/anytype-heart/util/pbtypes" ) func TestPbc_Convert(t *testing.T) { - t.Run("success", func(t *testing.T) { - s := state.NewDoc("root", nil).(*state.State) - template.InitTemplate(s, template.WithTitle) - c := NewConverter(s, false, nil) - result := c.Convert(model.SmartBlockType_Page) - assert.NotEmpty(t, result) - }) - t.Run("dependent details", func(t *testing.T) { - s := state.NewDoc("root", nil).(*state.State) - template.InitTemplate(s, template.WithTitle) - records := []database.Record{ - { - Details: domain.NewDetailsFromMap(map[domain.RelationKey]domain.Value{ - bundle.RelationKeyId: domain.String("test"), - bundle.RelationKeyName: domain.String("test"), - }), - }, - } - c := NewConverter(s, true, records) - result := c.Convert(model.SmartBlockType_Page) - assert.NotEmpty(t, result) - - var resultSnapshot pb.SnapshotWithType - err := jsonpb.UnmarshalString(string(result), &resultSnapshot) - assert.Nil(t, err) - expected := []*pb.DependantDetail{ - { - Id: "test", - Details: &types.Struct{Fields: map[string]*types.Value{ - bundle.RelationKeyId.String(): pbtypes.String("test"), - bundle.RelationKeyName.String(): pbtypes.String("test"), - }}, - }, - } - assert.Equal(t, expected, resultSnapshot.DependantDetails) - }) + s := state.NewDoc("root", nil).(*state.State) + template.InitTemplate(s, template.WithTitle) + c := NewConverter(s, false) + result := c.Convert(model.SmartBlockType_Page) + assert.NotEmpty(t, result) } diff --git a/docs/proto.md b/docs/proto.md index d90295a09..2f99684d5 100644 --- a/docs/proto.md +++ b/docs/proto.md @@ -1803,7 +1803,6 @@ - [Model.Process.State](#anytype-Model-Process-State) - [pb/protos/snapshot.proto](#pb_protos_snapshot-proto) - - [DependantDetail](#anytype-DependantDetail) - [Profile](#anytype-Profile) - [SnapshotWithType](#anytype-SnapshotWithType) @@ -28392,22 +28391,6 @@ Precondition: user A and user B opened the same block - - -### DependantDetail - - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| id | [string](#string) | | | -| details | [google.protobuf.Struct](#google-protobuf-Struct) | | | - - - - - - ### Profile @@ -28438,7 +28421,6 @@ Precondition: user A and user B opened the same block | ----- | ---- | ----- | ----------- | | sbType | [model.SmartBlockType](#anytype-model-SmartBlockType) | | | | snapshot | [Change.Snapshot](#anytype-Change-Snapshot) | | | -| dependantDetails | [DependantDetail](#anytype-DependantDetail) | repeated | | diff --git a/pb/protos/snapshot.proto b/pb/protos/snapshot.proto index 248af50d7..849260742 100644 --- a/pb/protos/snapshot.proto +++ b/pb/protos/snapshot.proto @@ -4,18 +4,12 @@ option go_package = "pb"; import "pkg/lib/pb/model/protos/models.proto"; import "pb/protos/changes.proto"; -import "google/protobuf/struct.proto"; message SnapshotWithType { anytype.model.SmartBlockType sbType = 1; anytype.Change.Snapshot snapshot = 2; - repeated DependantDetail dependantDetails = 3; } -message DependantDetail { - string id = 1; - google.protobuf.Struct details = 2; -} message Profile { string name = 1; string avatar = 2; diff --git a/pb/snapshot.pb.go b/pb/snapshot.pb.go index 260899f46..68eb46309 100644 --- a/pb/snapshot.pb.go +++ b/pb/snapshot.pb.go @@ -7,7 +7,6 @@ import ( fmt "fmt" model "github.com/anyproto/anytype-heart/pkg/lib/pb/model" proto "github.com/gogo/protobuf/proto" - types "github.com/gogo/protobuf/types" io "io" math "math" math_bits "math/bits" @@ -25,9 +24,8 @@ var _ = math.Inf const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package type SnapshotWithType struct { - SbType model.SmartBlockType `protobuf:"varint,1,opt,name=sbType,proto3,enum=anytype.model.SmartBlockType" json:"sbType,omitempty"` - Snapshot *ChangeSnapshot `protobuf:"bytes,2,opt,name=snapshot,proto3" json:"snapshot,omitempty"` - DependantDetails []*DependantDetail `protobuf:"bytes,3,rep,name=dependantDetails,proto3" json:"dependantDetails,omitempty"` + SbType model.SmartBlockType `protobuf:"varint,1,opt,name=sbType,proto3,enum=anytype.model.SmartBlockType" json:"sbType,omitempty"` + Snapshot *ChangeSnapshot `protobuf:"bytes,2,opt,name=snapshot,proto3" json:"snapshot,omitempty"` } func (m *SnapshotWithType) Reset() { *m = SnapshotWithType{} } @@ -77,65 +75,6 @@ func (m *SnapshotWithType) GetSnapshot() *ChangeSnapshot { return nil } -func (m *SnapshotWithType) GetDependantDetails() []*DependantDetail { - if m != nil { - return m.DependantDetails - } - return nil -} - -type DependantDetail struct { - Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` - Details *types.Struct `protobuf:"bytes,2,opt,name=details,proto3" json:"details,omitempty"` -} - -func (m *DependantDetail) Reset() { *m = DependantDetail{} } -func (m *DependantDetail) String() string { return proto.CompactTextString(m) } -func (*DependantDetail) ProtoMessage() {} -func (*DependantDetail) Descriptor() ([]byte, []int) { - return fileDescriptor_022f1596c727bff6, []int{1} -} -func (m *DependantDetail) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *DependantDetail) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_DependantDetail.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 *DependantDetail) XXX_Merge(src proto.Message) { - xxx_messageInfo_DependantDetail.Merge(m, src) -} -func (m *DependantDetail) XXX_Size() int { - return m.Size() -} -func (m *DependantDetail) XXX_DiscardUnknown() { - xxx_messageInfo_DependantDetail.DiscardUnknown(m) -} - -var xxx_messageInfo_DependantDetail proto.InternalMessageInfo - -func (m *DependantDetail) GetId() string { - if m != nil { - return m.Id - } - return "" -} - -func (m *DependantDetail) GetDetails() *types.Struct { - if m != nil { - return m.Details - } - return nil -} - type Profile struct { Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` Avatar string `protobuf:"bytes,2,opt,name=avatar,proto3" json:"avatar,omitempty"` @@ -149,7 +88,7 @@ func (m *Profile) Reset() { *m = Profile{} } func (m *Profile) String() string { return proto.CompactTextString(m) } func (*Profile) ProtoMessage() {} func (*Profile) Descriptor() ([]byte, []int) { - return fileDescriptor_022f1596c727bff6, []int{2} + return fileDescriptor_022f1596c727bff6, []int{1} } func (m *Profile) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -222,39 +161,33 @@ func (m *Profile) GetAnalyticsId() string { func init() { proto.RegisterType((*SnapshotWithType)(nil), "anytype.SnapshotWithType") - proto.RegisterType((*DependantDetail)(nil), "anytype.DependantDetail") proto.RegisterType((*Profile)(nil), "anytype.Profile") } func init() { proto.RegisterFile("pb/protos/snapshot.proto", fileDescriptor_022f1596c727bff6) } var fileDescriptor_022f1596c727bff6 = []byte{ - // 399 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x64, 0x90, 0xcf, 0x8e, 0xd3, 0x30, - 0x10, 0xc6, 0xeb, 0xec, 0x92, 0x50, 0xaf, 0xb4, 0x54, 0x3e, 0xb0, 0xd6, 0xaa, 0x44, 0x51, 0xc5, - 0x61, 0xc5, 0xc1, 0x11, 0x0b, 0xbc, 0xc0, 0x92, 0x4b, 0x6f, 0x28, 0x5d, 0x09, 0x89, 0xdb, 0x38, - 0xf6, 0x26, 0x51, 0xd3, 0xd8, 0x8a, 0x5d, 0xa4, 0xbc, 0x05, 0xef, 0xc3, 0x19, 0x89, 0x63, 0x8f, - 0x1c, 0x51, 0xfb, 0x22, 0xa8, 0x4e, 0xd2, 0xd2, 0xed, 0x6d, 0xfe, 0xfc, 0xe6, 0xfb, 0x66, 0x06, - 0x53, 0xcd, 0x63, 0xdd, 0x28, 0xab, 0x4c, 0x6c, 0x6a, 0xd0, 0xa6, 0x50, 0x96, 0xb9, 0x9c, 0x04, - 0x50, 0xb7, 0xb6, 0xd5, 0xf2, 0xf6, 0xad, 0x5e, 0xe6, 0x71, 0x55, 0xf2, 0x58, 0xf3, 0x78, 0xa5, - 0x84, 0xac, 0x86, 0x01, 0x97, 0x98, 0x0e, 0xbf, 0xbd, 0x39, 0x0a, 0x65, 0x05, 0xd4, 0xb9, 0x1c, - 0x1a, 0xd3, 0x5c, 0xa9, 0xbc, 0x92, 0x5d, 0x93, 0xaf, 0x9f, 0x62, 0x63, 0x9b, 0x75, 0xd6, 0xbb, - 0xcc, 0x7e, 0x21, 0x3c, 0x59, 0xf4, 0xc6, 0x5f, 0x4b, 0x5b, 0x3c, 0xb6, 0x5a, 0x92, 0x4f, 0xd8, - 0x37, 0x7c, 0x1f, 0x51, 0x14, 0xa1, 0xbb, 0xeb, 0xfb, 0x37, 0xac, 0xdf, 0x85, 0x39, 0x4b, 0xb6, - 0x58, 0x41, 0x63, 0x1f, 0x2a, 0x95, 0x2d, 0xf7, 0x50, 0xda, 0xc3, 0xe4, 0x23, 0x7e, 0x39, 0xdc, - 0x40, 0xbd, 0x08, 0xdd, 0x5d, 0xdd, 0xd3, 0xc3, 0xe0, 0x67, 0xb7, 0x13, 0x1b, 0xac, 0xd2, 0x03, - 0x49, 0x12, 0x3c, 0x11, 0x52, 0xcb, 0x5a, 0x40, 0x6d, 0x13, 0x69, 0xa1, 0xac, 0x0c, 0xbd, 0x88, - 0x2e, 0x4e, 0xa6, 0x93, 0x53, 0x20, 0x3d, 0x9b, 0x98, 0x3d, 0xe2, 0x57, 0xcf, 0x20, 0x72, 0x8d, - 0xbd, 0x52, 0xb8, 0x0b, 0xc6, 0xa9, 0x57, 0x0a, 0xf2, 0x1e, 0x07, 0xa2, 0xd7, 0xef, 0xb6, 0xbb, - 0x61, 0xdd, 0x6b, 0xd8, 0xf0, 0x1a, 0xb6, 0x70, 0xaf, 0x49, 0x07, 0x6e, 0xf6, 0x13, 0xe1, 0xe0, - 0x4b, 0xa3, 0x9e, 0xca, 0x4a, 0x12, 0x82, 0x2f, 0x6b, 0x58, 0xc9, 0x5e, 0xd0, 0xc5, 0xe4, 0x35, - 0xf6, 0xe1, 0x3b, 0x58, 0x68, 0x9c, 0xe2, 0x38, 0xed, 0x33, 0x42, 0x71, 0x00, 0x42, 0x34, 0xd2, - 0x18, 0x7a, 0xe9, 0x1a, 0x43, 0x4a, 0xde, 0xe1, 0x89, 0xd1, 0x90, 0xc9, 0x04, 0x4c, 0xc1, 0x15, - 0x34, 0x62, 0x2e, 0xe8, 0x0b, 0x87, 0x9c, 0xd5, 0xc9, 0x14, 0x8f, 0x75, 0x67, 0x3e, 0x17, 0xd4, - 0x77, 0xd0, 0xb1, 0x40, 0x22, 0x7c, 0x05, 0x35, 0x54, 0xad, 0x2d, 0x33, 0x33, 0x17, 0x34, 0x70, - 0xfd, 0xff, 0x4b, 0x0f, 0xd3, 0xdf, 0xdb, 0x10, 0x6d, 0xb6, 0x21, 0xfa, 0xbb, 0x0d, 0xd1, 0x8f, - 0x5d, 0x38, 0xda, 0xec, 0xc2, 0xd1, 0x9f, 0x5d, 0x38, 0xfa, 0xe6, 0x69, 0xce, 0x7d, 0x77, 0xf5, - 0x87, 0x7f, 0x01, 0x00, 0x00, 0xff, 0xff, 0x36, 0x2f, 0x5b, 0x24, 0x82, 0x02, 0x00, 0x00, + // 318 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x64, 0x90, 0xc1, 0x4a, 0xc3, 0x30, + 0x18, 0xc7, 0x97, 0x31, 0x5b, 0x97, 0x81, 0x8c, 0x1c, 0x34, 0x8c, 0x59, 0xc6, 0xf0, 0x30, 0x3c, + 0xb4, 0x30, 0xf5, 0x05, 0xa6, 0x97, 0xdd, 0xa4, 0x13, 0x04, 0x6f, 0x5f, 0x9a, 0xb8, 0x96, 0x75, + 0x4d, 0x48, 0x82, 0xd0, 0x93, 0xaf, 0xe0, 0xfb, 0xf8, 0x02, 0x1e, 0x77, 0xf4, 0x28, 0xdb, 0x8b, + 0xc8, 0xd2, 0x76, 0x13, 0xbc, 0x7d, 0xff, 0xef, 0xff, 0xfb, 0xfe, 0xff, 0x10, 0x4c, 0x15, 0x8b, + 0x94, 0x96, 0x56, 0x9a, 0xc8, 0x14, 0xa0, 0x4c, 0x2a, 0x6d, 0xe8, 0x34, 0xf1, 0xa1, 0x28, 0x6d, + 0xa9, 0xc4, 0xe0, 0x4a, 0xad, 0x96, 0x51, 0x9e, 0xb1, 0x48, 0xb1, 0x68, 0x2d, 0xb9, 0xc8, 0x9b, + 0x03, 0x27, 0x4c, 0x85, 0x0f, 0x2e, 0x8e, 0x41, 0x49, 0x0a, 0xc5, 0x52, 0xd4, 0xc6, 0xf8, 0x1d, + 0xf7, 0x17, 0x75, 0xf2, 0x73, 0x66, 0xd3, 0xa7, 0x52, 0x09, 0x72, 0x87, 0x3d, 0xc3, 0xf6, 0x13, + 0x45, 0x23, 0x34, 0x39, 0x9b, 0x5e, 0x86, 0x75, 0x59, 0xe8, 0x32, 0xc3, 0xc5, 0x1a, 0xb4, 0x9d, + 0xe5, 0x32, 0x59, 0xed, 0xa1, 0xb8, 0x86, 0xc9, 0x2d, 0x3e, 0x6d, 0x1e, 0x49, 0xdb, 0x23, 0x34, + 0xe9, 0x4d, 0xe9, 0xe1, 0xf0, 0xde, 0x95, 0x86, 0x4d, 0x55, 0x7c, 0x20, 0xc7, 0x9f, 0x08, 0xfb, + 0x8f, 0x5a, 0xbe, 0x66, 0xb9, 0x20, 0x04, 0x77, 0x0a, 0x58, 0x57, 0xb5, 0xdd, 0xd8, 0xcd, 0xe4, + 0x1c, 0x7b, 0xf0, 0x06, 0x16, 0xb4, 0xcb, 0xec, 0xc6, 0xb5, 0x22, 0x14, 0xfb, 0xc0, 0xb9, 0x16, + 0xc6, 0xd0, 0x8e, 0x33, 0x1a, 0x49, 0xae, 0x71, 0xdf, 0x28, 0x48, 0xc4, 0x03, 0x98, 0x94, 0x49, + 0xd0, 0x7c, 0xce, 0xe9, 0x89, 0x43, 0xfe, 0xed, 0xc9, 0x10, 0x77, 0x55, 0x55, 0x3e, 0xe7, 0xd4, + 0x73, 0xd0, 0x71, 0x41, 0x46, 0xb8, 0x07, 0x05, 0xe4, 0xa5, 0xcd, 0x12, 0x33, 0xe7, 0xd4, 0x77, + 0xfe, 0xdf, 0xd5, 0x6c, 0xf8, 0xb5, 0x0d, 0xd0, 0x66, 0x1b, 0xa0, 0x9f, 0x6d, 0x80, 0x3e, 0x76, + 0x41, 0x6b, 0xb3, 0x0b, 0x5a, 0xdf, 0xbb, 0xa0, 0xf5, 0xd2, 0x56, 0x8c, 0x79, 0xee, 0x8f, 0x6f, + 0x7e, 0x03, 0x00, 0x00, 0xff, 0xff, 0xab, 0x51, 0x3f, 0xdf, 0xc7, 0x01, 0x00, 0x00, } func (m *SnapshotWithType) Marshal() (dAtA []byte, err error) { @@ -277,20 +210,6 @@ func (m *SnapshotWithType) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l - if len(m.DependantDetails) > 0 { - for iNdEx := len(m.DependantDetails) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.DependantDetails[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintSnapshot(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x1a - } - } if m.Snapshot != nil { { size, err := m.Snapshot.MarshalToSizedBuffer(dAtA[:i]) @@ -311,48 +230,6 @@ func (m *SnapshotWithType) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } -func (m *DependantDetail) 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 *DependantDetail) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *DependantDetail) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.Details != nil { - { - size, err := m.Details.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintSnapshot(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - } - if len(m.Id) > 0 { - i -= len(m.Id) - copy(dAtA[i:], m.Id) - i = encodeVarintSnapshot(dAtA, i, uint64(len(m.Id))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - func (m *Profile) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -442,29 +319,6 @@ func (m *SnapshotWithType) Size() (n int) { l = m.Snapshot.Size() n += 1 + l + sovSnapshot(uint64(l)) } - if len(m.DependantDetails) > 0 { - for _, e := range m.DependantDetails { - l = e.Size() - n += 1 + l + sovSnapshot(uint64(l)) - } - } - return n -} - -func (m *DependantDetail) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.Id) - if l > 0 { - n += 1 + l + sovSnapshot(uint64(l)) - } - if m.Details != nil { - l = m.Details.Size() - n += 1 + l + sovSnapshot(uint64(l)) - } return n } @@ -591,158 +445,6 @@ func (m *SnapshotWithType) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field DependantDetails", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowSnapshot - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthSnapshot - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthSnapshot - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.DependantDetails = append(m.DependantDetails, &DependantDetail{}) - if err := m.DependantDetails[len(m.DependantDetails)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipSnapshot(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthSnapshot - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *DependantDetail) 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 ErrIntOverflowSnapshot - } - 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: DependantDetail: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: DependantDetail: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Id", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowSnapshot - } - 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 ErrInvalidLengthSnapshot - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthSnapshot - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Id = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Details", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowSnapshot - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthSnapshot - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthSnapshot - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.Details == nil { - m.Details = &types.Struct{} - } - if err := m.Details.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipSnapshot(dAtA[iNdEx:]) From 1b093ee7e29fbdd6917a4e31341924b72d82d537 Mon Sep 17 00:00:00 2001 From: AnastasiaShemyakinskaya Date: Fri, 24 Jan 2025 16:36:29 +0100 Subject: [PATCH 156/195] GO-4889: fix Signed-off-by: AnastasiaShemyakinskaya --- core/converter/pbc/pbc.go | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/core/converter/pbc/pbc.go b/core/converter/pbc/pbc.go index 8196973cf..112d4fa92 100644 --- a/core/converter/pbc/pbc.go +++ b/core/converter/pbc/pbc.go @@ -7,7 +7,6 @@ import ( "github.com/anyproto/anytype-heart/core/converter" "github.com/anyproto/anytype-heart/core/domain" "github.com/anyproto/anytype-heart/pb" - "github.com/anyproto/anytype-heart/pkg/lib/database" "github.com/anyproto/anytype-heart/pkg/lib/logging" "github.com/anyproto/anytype-heart/pkg/lib/pb/model" ) @@ -22,9 +21,8 @@ func NewConverter(s state.Doc, isJSON bool) converter.Converter { } type pbc struct { - s state.Doc - isJSON bool - dependentDetails []database.Record + s state.Doc + isJSON bool } func (p *pbc) Convert(sbType model.SmartBlockType) []byte { @@ -45,7 +43,7 @@ func (p *pbc) Convert(sbType model.SmartBlockType) []byte { Snapshot: snapshot, } if p.isJSON { - m := jsonpb.Marshaler{Indent: " "} + m := jsonpb.Marshaler{Indent: " ", EmitDefaults: true} result, err := m.MarshalToString(mo) if err != nil { log.Errorf("failed to convert object to json: %s", err) From e91d6f47544c1a1d4af567c4465ce4da3ef7f23f Mon Sep 17 00:00:00 2001 From: AnastasiaShemyakinskaya Date: Fri, 24 Jan 2025 18:18:47 +0100 Subject: [PATCH 157/195] GO-4889: fix file relations white list Signed-off-by: AnastasiaShemyakinskaya --- core/publish/relationswhitelist.go | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/core/publish/relationswhitelist.go b/core/publish/relationswhitelist.go index 3ae96012f..fde82501f 100644 --- a/core/publish/relationswhitelist.go +++ b/core/publish/relationswhitelist.go @@ -35,6 +35,8 @@ var relationsWhiteList = append(derivedObjectsWhiteList, bundle.RelationKeyRelat var relationOptionWhiteList = append(derivedObjectsWhiteList, bundle.RelationKeyRelationOptionColor.String()) +var fileRelationsWhiteList = append(documentRelationsWhiteList, bundle.RelationKeyFileId.String(), bundle.RelationKeyFileExt.String()) + var publishingRelationsWhiteList = map[model.ObjectTypeLayout][]string{ model.ObjectType_basic: documentRelationsWhiteList, model.ObjectType_profile: documentRelationsWhiteList, @@ -43,9 +45,9 @@ var publishingRelationsWhiteList = map[model.ObjectTypeLayout][]string{ model.ObjectType_collection: documentRelationsWhiteList, model.ObjectType_objectType: derivedObjectsWhiteList, model.ObjectType_relation: relationsWhiteList, - model.ObjectType_file: documentRelationsWhiteList, + model.ObjectType_file: fileRelationsWhiteList, model.ObjectType_dashboard: allObjectsRelationsWhiteList, - model.ObjectType_image: documentRelationsWhiteList, + model.ObjectType_image: fileRelationsWhiteList, model.ObjectType_note: documentRelationsWhiteList, model.ObjectType_space: allObjectsRelationsWhiteList, From 8b2d2bee418cbbf0e30a8620e7c3893b5719af8e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 24 Jan 2025 20:18:51 +0100 Subject: [PATCH 158/195] Bump google.golang.org/grpc from 1.69.4 to 1.70.0 (#2042) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 8 ++++---- go.sum | 20 ++++++++++---------- 2 files changed, 14 insertions(+), 14 deletions(-) diff --git a/go.mod b/go.mod index 86242e144..65f4c3dd8 100644 --- a/go.mod +++ b/go.mod @@ -110,7 +110,7 @@ require ( golang.org/x/net v0.34.0 golang.org/x/oauth2 v0.25.0 golang.org/x/text v0.21.0 - google.golang.org/grpc v1.69.4 + google.golang.org/grpc v1.70.0 gopkg.in/Graylog2/go-gelf.v2 v2.0.0-20180125164251-1832d8546a9f gopkg.in/natefinch/lumberjack.v2 v2.2.1 gopkg.in/yaml.v3 v3.0.1 @@ -186,7 +186,7 @@ require ( github.com/gogs/chardet v0.0.0-20211120154057-b7413eaefb8f // indirect github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 // indirect github.com/golang/geo v0.0.0-20210211234256-740aa86cb551 // indirect - github.com/golang/glog v1.2.2 // indirect + github.com/golang/glog v1.2.3 // indirect github.com/golang/protobuf v1.5.4 // indirect github.com/google/flatbuffers v1.12.1 // indirect github.com/google/go-querystring v1.1.0 // indirect @@ -289,8 +289,8 @@ require ( golang.org/x/term v0.28.0 // indirect golang.org/x/time v0.9.0 // indirect golang.org/x/tools v0.29.0 // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20241104194629-dd2ea8efbc28 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20241021214115-324edc3d5d38 // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20241202173237-19429a94021a // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20241202173237-19429a94021a // indirect google.golang.org/protobuf v1.36.2 // indirect gopkg.in/ini.v1 v1.67.0 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect diff --git a/go.sum b/go.sum index 0d3d50d6b..ded421a5c 100644 --- a/go.sum +++ b/go.sum @@ -415,8 +415,8 @@ github.com/golang/geo v0.0.0-20200319012246-673a6f80352d/go.mod h1:QZ0nwyI2jOfgR github.com/golang/geo v0.0.0-20210211234256-740aa86cb551 h1:gtexQ/VGyN+VVFRXSFiguSNcXmS6rkKT+X7FdIrTtfo= github.com/golang/geo v0.0.0-20210211234256-740aa86cb551/go.mod h1:QZ0nwyI2jOfgRAoBvP+ab5aRr7c9x7lhGEJrKvBwjWI= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/glog v1.2.2 h1:1+mZ9upx1Dh6FmUTFR1naJ77miKiXgALjWOZ3NVFPmY= -github.com/golang/glog v1.2.2/go.mod h1:6AhwSGph0fcJtXVM/PEHPqZlFeoLxhs7/t5UDAwmO+w= +github.com/golang/glog v1.2.3 h1:oDTdz9f5VGVVNGu/Q7UXKWYsD0873HXLHdJUNBsSEKM= +github.com/golang/glog v1.2.3/go.mod h1:6AhwSGph0fcJtXVM/PEHPqZlFeoLxhs7/t5UDAwmO+w= github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= @@ -1141,10 +1141,10 @@ go.opentelemetry.io/otel v1.32.0 h1:WnBN+Xjcteh0zdk01SVqV55d/m62NJLJdIyb4y/WO5U= go.opentelemetry.io/otel v1.32.0/go.mod h1:00DCVSB0RQcnzlwyTfqtxSm+DRr9hpYrHjNGiBHVQIg= go.opentelemetry.io/otel/metric v1.32.0 h1:xV2umtmNcThh2/a/aCP+h64Xx5wsj8qqnkYZktzNa0M= go.opentelemetry.io/otel/metric v1.32.0/go.mod h1:jH7CIbbK6SH2V2wE16W05BHCtIDzauciCRLoc/SyMv8= -go.opentelemetry.io/otel/sdk v1.31.0 h1:xLY3abVHYZ5HSfOg3l2E5LUj2Cwva5Y7yGxnSW9H5Gk= -go.opentelemetry.io/otel/sdk v1.31.0/go.mod h1:TfRbMdhvxIIr/B2N2LQW2S5v9m3gOQ/08KsbbO5BPT0= -go.opentelemetry.io/otel/sdk/metric v1.31.0 h1:i9hxxLJF/9kkvfHppyLL55aW7iIJz4JjxTeYusH7zMc= -go.opentelemetry.io/otel/sdk/metric v1.31.0/go.mod h1:CRInTMVvNhUKgSAMbKyTMxqOBC0zgyxzW55lZzX43Y8= +go.opentelemetry.io/otel/sdk v1.32.0 h1:RNxepc9vK59A8XsgZQouW8ue8Gkb4jpWtJm9ge5lEG4= +go.opentelemetry.io/otel/sdk v1.32.0/go.mod h1:LqgegDBjKMmb2GC6/PrTnteJG39I8/vJCAP9LlJXEjU= +go.opentelemetry.io/otel/sdk/metric v1.32.0 h1:rZvFnvmvawYb0alrYkjraqJq0Z4ZUJAiyYCU9snn1CU= +go.opentelemetry.io/otel/sdk/metric v1.32.0/go.mod h1:PWeZlq0zt9YkYAp3gjKZ0eicRYvOh1Gd+X99x6GHpCQ= go.opentelemetry.io/otel/trace v1.32.0 h1:WIC9mYrXf8TmY/EXuULKc8hR17vE+Hjv2cssQDe03fM= go.opentelemetry.io/otel/trace v1.32.0/go.mod h1:+i4rkvCraA+tG6AzwloGaCtkx53Fa+L+V8e9a7YvhT8= go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= @@ -1603,8 +1603,8 @@ google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6D google.golang.org/genproto v0.0.0-20210108203827-ffc7fda8c3d7/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210126160654-44e461bb6506/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210226172003-ab064af71705/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto/googleapis/api v0.0.0-20241104194629-dd2ea8efbc28 h1:M0KvPgPmDZHPlbRbaNU1APr28TvwvvdUPlSv7PUvy8g= -google.golang.org/genproto/googleapis/api v0.0.0-20241104194629-dd2ea8efbc28/go.mod h1:dguCy7UOdZhTvLzDyt15+rOrawrpM4q7DD9dQ1P11P4= +google.golang.org/genproto/googleapis/api v0.0.0-20241202173237-19429a94021a h1:OAiGFfOiA0v9MRYsSidp3ubZaBnteRUyn3xB2ZQ5G/E= +google.golang.org/genproto/googleapis/api v0.0.0-20241202173237-19429a94021a/go.mod h1:jehYqy3+AhJU9ve55aNOaSml7wUXjF9x6z2LcCfpAhY= google.golang.org/genproto/googleapis/rpc v0.0.0-20241021214115-324edc3d5d38 h1:zciRKQ4kBpFgpfC5QQCVtnnNAcLIqweL7plyZRQHVpI= google.golang.org/genproto/googleapis/rpc v0.0.0-20241021214115-324edc3d5d38/go.mod h1:GX3210XPVPUjJbTUbvwI8f2IpZDMZuPJWDzDuebbviI= google.golang.org/grpc v1.12.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= @@ -1630,8 +1630,8 @@ google.golang.org/grpc v1.32.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8= google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.69.4 h1:MF5TftSMkd8GLw/m0KM6V8CMOCY6NZ1NQDPGFgbTt4A= -google.golang.org/grpc v1.69.4/go.mod h1:vyjdE6jLBI76dgpDojsFGNaHlxdjXN9ghpnd2o7JGZ4= +google.golang.org/grpc v1.70.0 h1:pWFv03aZoHzlRKHWicjsZytKAiYCtNS0dHbXnIdq7jQ= +google.golang.org/grpc v1.70.0/go.mod h1:ofIJqVKDXx/JiXrwr2IG4/zwdH9txy3IlF40RmcJSQw= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= From 3d74f6d659f45dd5ec15f689ffbe7db0516b604c Mon Sep 17 00:00:00 2001 From: Roman Khafizianov Date: Fri, 24 Jan 2025 21:47:06 +0100 Subject: [PATCH 159/195] GO-4948 applink limited scope: add missing methods --- core/auth.go | 30 ++++++++++++++++++------------ core/grpc_events.go | 4 ++-- 2 files changed, 20 insertions(+), 14 deletions(-) diff --git a/core/auth.go b/core/auth.go index 2dddf9580..ba1cc4cdb 100644 --- a/core/auth.go +++ b/core/auth.go @@ -20,14 +20,18 @@ import ( ) var limitedScopeMethods = map[string]struct{}{ - "ObjectSearch": {}, - "ObjectShow": {}, - "ObjectCreate": {}, - "ObjectCreateFromURL": {}, - "BlockPreview": {}, - "BlockPaste": {}, - "BroadcastPayloadEvent": {}, - "AccountSelect": {}, // need to replace with other method to get info + "ObjectSearch": {}, + "ObjectShow": {}, + "ObjectCreate": {}, + "ObjectCreateFromUrl": {}, + "BlockPreview": {}, + "BlockPaste": {}, + "BroadcastPayloadEvent": {}, + "AccountSelect": {}, + "ListenSessionEvents": {}, + "ObjectSearchSubscribe": {}, + "ObjectCreateRelationOption": {}, + // need to replace with other method to get info } func (mw *Middleware) Authorize(ctx context.Context, req interface{}, info *grpc.UnaryServerInfo, handler grpc.UnaryHandler) (resp interface{}, err error) { @@ -56,11 +60,13 @@ func (mw *Middleware) Authorize(ctx context.Context, req interface{}, info *grpc switch scope { case model.AccountAuth_Full: case model.AccountAuth_Limited: - if _, ok := limitedScopeMethods[strings.TrimPrefix(info.FullMethod, "/anytype.ClientCommands/")]; !ok { - return nil, status.Error(codes.PermissionDenied, "method not allowed for limited scope") + methodTrimmed := strings.TrimPrefix(info.FullMethod, "/anytype.ClientCommands/") + if _, ok := limitedScopeMethods[methodTrimmed]; !ok { + return nil, status.Error(codes.PermissionDenied, fmt.Sprintf("method %s not allowed for %s", methodTrimmed, scope.String())) } - default: - return nil, status.Error(codes.PermissionDenied, fmt.Sprintf("method not allowed for %s scope", scope.String())) + default + + return nil, status.Error(codes.PermissionDenied, fmt.Sprintf("method %s not allowed for %s scope", info.FullMethod, scope.String())) } resp, err = handler(ctx, req) return diff --git a/core/grpc_events.go b/core/grpc_events.go index 8e1150916..37e99f209 100644 --- a/core/grpc_events.go +++ b/core/grpc_events.go @@ -28,9 +28,9 @@ func (mw *Middleware) ListenSessionEvents(req *pb.StreamRequest, server lib.Clie } switch scope { - case model.AccountAuth_Full: + case model.AccountAuth_Full, model.AccountAuth_Limited: default: - log.Errorf("method not allowed for scope %s", scope.String()) + log.Warnf("method ListenSessionEvents not allowed for scope %s", scope.String()) return } var srv event.SessionServer From 38acf7f21c1a2d59215a6ccfbc806eba4e20706e Mon Sep 17 00:00:00 2001 From: Jannis Metrikat <120120832+jmetrikat@users.noreply.github.com> Date: Sat, 25 Jan 2025 00:00:32 +0100 Subject: [PATCH 160/195] GO-4948: Fix lint --- core/auth.go | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/core/auth.go b/core/auth.go index ba1cc4cdb..b9f42b415 100644 --- a/core/auth.go +++ b/core/auth.go @@ -64,8 +64,7 @@ func (mw *Middleware) Authorize(ctx context.Context, req interface{}, info *grpc if _, ok := limitedScopeMethods[methodTrimmed]; !ok { return nil, status.Error(codes.PermissionDenied, fmt.Sprintf("method %s not allowed for %s", methodTrimmed, scope.String())) } - default - + default: return nil, status.Error(codes.PermissionDenied, fmt.Sprintf("method %s not allowed for %s scope", info.FullMethod, scope.String())) } resp, err = handler(ctx, req) From aeb06105dc7663672bdedc8a45a363f53894192e Mon Sep 17 00:00:00 2001 From: Jannis Metrikat <120120832+jmetrikat@users.noreply.github.com> Date: Sun, 26 Jan 2025 19:01:50 +0100 Subject: [PATCH 161/195] GO-4459: Rename service dir to internal --- core/api/{services => internal}/auth/handler.go | 0 core/api/{services => internal}/auth/model.go | 0 core/api/{services => internal}/auth/service.go | 0 core/api/{services => internal}/auth/service_test.go | 0 core/api/{services => internal}/export/handler.go | 0 core/api/{services => internal}/export/model.go | 0 core/api/{services => internal}/export/service.go | 0 core/api/{services => internal}/export/service_test.go | 0 core/api/{services => internal}/object/handler.go | 0 core/api/{services => internal}/object/model.go | 0 core/api/{services => internal}/object/service.go | 2 +- core/api/{services => internal}/object/service_test.go | 2 +- core/api/{services => internal}/search/handler.go | 0 core/api/{services => internal}/search/service.go | 4 ++-- core/api/{services => internal}/search/service_test.go | 4 ++-- core/api/{services => internal}/space/handler.go | 0 core/api/{services => internal}/space/model.go | 0 core/api/{services => internal}/space/service.go | 0 core/api/{services => internal}/space/service_test.go | 0 core/api/server/router.go | 10 +++++----- core/api/server/server.go | 10 +++++----- 21 files changed, 16 insertions(+), 16 deletions(-) rename core/api/{services => internal}/auth/handler.go (100%) rename core/api/{services => internal}/auth/model.go (100%) rename core/api/{services => internal}/auth/service.go (100%) rename core/api/{services => internal}/auth/service_test.go (100%) rename core/api/{services => internal}/export/handler.go (100%) rename core/api/{services => internal}/export/model.go (100%) rename core/api/{services => internal}/export/service.go (100%) rename core/api/{services => internal}/export/service_test.go (100%) rename core/api/{services => internal}/object/handler.go (100%) rename core/api/{services => internal}/object/model.go (100%) rename core/api/{services => internal}/object/service.go (99%) rename core/api/{services => internal}/object/service_test.go (99%) rename core/api/{services => internal}/search/handler.go (100%) rename core/api/{services => internal}/search/service.go (98%) rename core/api/{services => internal}/search/service_test.go (99%) rename core/api/{services => internal}/space/handler.go (100%) rename core/api/{services => internal}/space/model.go (100%) rename core/api/{services => internal}/space/service.go (100%) rename core/api/{services => internal}/space/service_test.go (100%) diff --git a/core/api/services/auth/handler.go b/core/api/internal/auth/handler.go similarity index 100% rename from core/api/services/auth/handler.go rename to core/api/internal/auth/handler.go diff --git a/core/api/services/auth/model.go b/core/api/internal/auth/model.go similarity index 100% rename from core/api/services/auth/model.go rename to core/api/internal/auth/model.go diff --git a/core/api/services/auth/service.go b/core/api/internal/auth/service.go similarity index 100% rename from core/api/services/auth/service.go rename to core/api/internal/auth/service.go diff --git a/core/api/services/auth/service_test.go b/core/api/internal/auth/service_test.go similarity index 100% rename from core/api/services/auth/service_test.go rename to core/api/internal/auth/service_test.go diff --git a/core/api/services/export/handler.go b/core/api/internal/export/handler.go similarity index 100% rename from core/api/services/export/handler.go rename to core/api/internal/export/handler.go diff --git a/core/api/services/export/model.go b/core/api/internal/export/model.go similarity index 100% rename from core/api/services/export/model.go rename to core/api/internal/export/model.go diff --git a/core/api/services/export/service.go b/core/api/internal/export/service.go similarity index 100% rename from core/api/services/export/service.go rename to core/api/internal/export/service.go diff --git a/core/api/services/export/service_test.go b/core/api/internal/export/service_test.go similarity index 100% rename from core/api/services/export/service_test.go rename to core/api/internal/export/service_test.go diff --git a/core/api/services/object/handler.go b/core/api/internal/object/handler.go similarity index 100% rename from core/api/services/object/handler.go rename to core/api/internal/object/handler.go diff --git a/core/api/services/object/model.go b/core/api/internal/object/model.go similarity index 100% rename from core/api/services/object/model.go rename to core/api/internal/object/model.go diff --git a/core/api/services/object/service.go b/core/api/internal/object/service.go similarity index 99% rename from core/api/services/object/service.go rename to core/api/internal/object/service.go index f8a7eb109..c467652fb 100644 --- a/core/api/services/object/service.go +++ b/core/api/internal/object/service.go @@ -7,8 +7,8 @@ import ( "github.com/gogo/protobuf/types" + "github.com/anyproto/anytype-heart/core/api/internal/space" "github.com/anyproto/anytype-heart/core/api/pagination" - "github.com/anyproto/anytype-heart/core/api/services/space" "github.com/anyproto/anytype-heart/core/api/util" "github.com/anyproto/anytype-heart/pb" "github.com/anyproto/anytype-heart/pb/service" diff --git a/core/api/services/object/service_test.go b/core/api/internal/object/service_test.go similarity index 99% rename from core/api/services/object/service_test.go rename to core/api/internal/object/service_test.go index f5ec97b8a..82c95d5c1 100644 --- a/core/api/services/object/service_test.go +++ b/core/api/internal/object/service_test.go @@ -8,7 +8,7 @@ import ( "github.com/stretchr/testify/mock" "github.com/stretchr/testify/require" - "github.com/anyproto/anytype-heart/core/api/services/space" + "github.com/anyproto/anytype-heart/core/api/internal/space" "github.com/anyproto/anytype-heart/pb" "github.com/anyproto/anytype-heart/pb/service/mock_service" "github.com/anyproto/anytype-heart/pkg/lib/bundle" diff --git a/core/api/services/search/handler.go b/core/api/internal/search/handler.go similarity index 100% rename from core/api/services/search/handler.go rename to core/api/internal/search/handler.go diff --git a/core/api/services/search/service.go b/core/api/internal/search/service.go similarity index 98% rename from core/api/services/search/service.go rename to core/api/internal/search/service.go index 3fe671b54..be64f7cbb 100644 --- a/core/api/services/search/service.go +++ b/core/api/internal/search/service.go @@ -6,9 +6,9 @@ import ( "sort" "strings" + "github.com/anyproto/anytype-heart/core/api/internal/object" + "github.com/anyproto/anytype-heart/core/api/internal/space" "github.com/anyproto/anytype-heart/core/api/pagination" - "github.com/anyproto/anytype-heart/core/api/services/object" - "github.com/anyproto/anytype-heart/core/api/services/space" "github.com/anyproto/anytype-heart/core/api/util" "github.com/anyproto/anytype-heart/pb" "github.com/anyproto/anytype-heart/pb/service" diff --git a/core/api/services/search/service_test.go b/core/api/internal/search/service_test.go similarity index 99% rename from core/api/services/search/service_test.go rename to core/api/internal/search/service_test.go index 338cfc614..5c05ad4c2 100644 --- a/core/api/services/search/service_test.go +++ b/core/api/internal/search/service_test.go @@ -8,8 +8,8 @@ import ( "github.com/stretchr/testify/mock" "github.com/stretchr/testify/require" - "github.com/anyproto/anytype-heart/core/api/services/object" - "github.com/anyproto/anytype-heart/core/api/services/space" + "github.com/anyproto/anytype-heart/core/api/internal/object" + "github.com/anyproto/anytype-heart/core/api/internal/space" "github.com/anyproto/anytype-heart/pb" "github.com/anyproto/anytype-heart/pb/service/mock_service" "github.com/anyproto/anytype-heart/pkg/lib/bundle" diff --git a/core/api/services/space/handler.go b/core/api/internal/space/handler.go similarity index 100% rename from core/api/services/space/handler.go rename to core/api/internal/space/handler.go diff --git a/core/api/services/space/model.go b/core/api/internal/space/model.go similarity index 100% rename from core/api/services/space/model.go rename to core/api/internal/space/model.go diff --git a/core/api/services/space/service.go b/core/api/internal/space/service.go similarity index 100% rename from core/api/services/space/service.go rename to core/api/internal/space/service.go diff --git a/core/api/services/space/service_test.go b/core/api/internal/space/service_test.go similarity index 100% rename from core/api/services/space/service_test.go rename to core/api/internal/space/service_test.go diff --git a/core/api/server/router.go b/core/api/server/router.go index 09aa81078..0b47eb959 100644 --- a/core/api/server/router.go +++ b/core/api/server/router.go @@ -8,12 +8,12 @@ import ( ginSwagger "github.com/swaggo/gin-swagger" "github.com/anyproto/anytype-heart/core/anytype/account" + "github.com/anyproto/anytype-heart/core/api/internal/auth" + "github.com/anyproto/anytype-heart/core/api/internal/export" + "github.com/anyproto/anytype-heart/core/api/internal/object" + "github.com/anyproto/anytype-heart/core/api/internal/search" + "github.com/anyproto/anytype-heart/core/api/internal/space" "github.com/anyproto/anytype-heart/core/api/pagination" - "github.com/anyproto/anytype-heart/core/api/services/auth" - "github.com/anyproto/anytype-heart/core/api/services/export" - "github.com/anyproto/anytype-heart/core/api/services/object" - "github.com/anyproto/anytype-heart/core/api/services/search" - "github.com/anyproto/anytype-heart/core/api/services/space" "github.com/anyproto/anytype-heart/pb/service" ) diff --git a/core/api/server/server.go b/core/api/server/server.go index c178ef40d..78fb46793 100644 --- a/core/api/server/server.go +++ b/core/api/server/server.go @@ -6,11 +6,11 @@ import ( "github.com/gin-gonic/gin" "github.com/anyproto/anytype-heart/core/anytype/account" - "github.com/anyproto/anytype-heart/core/api/services/auth" - "github.com/anyproto/anytype-heart/core/api/services/export" - "github.com/anyproto/anytype-heart/core/api/services/object" - "github.com/anyproto/anytype-heart/core/api/services/search" - "github.com/anyproto/anytype-heart/core/api/services/space" + "github.com/anyproto/anytype-heart/core/api/internal/auth" + "github.com/anyproto/anytype-heart/core/api/internal/export" + "github.com/anyproto/anytype-heart/core/api/internal/object" + "github.com/anyproto/anytype-heart/core/api/internal/search" + "github.com/anyproto/anytype-heart/core/api/internal/space" "github.com/anyproto/anytype-heart/pb/service" ) From cba8f68e5e0312546cacc55cd05ec1a54ad609a2 Mon Sep 17 00:00:00 2001 From: Jannis Metrikat <120120832+jmetrikat@users.noreply.github.com> Date: Sun, 26 Jan 2025 19:53:34 +0100 Subject: [PATCH 162/195] GO-4459: Return snippet for object --- core/api/docs/docs.go | 4 ++ core/api/docs/swagger.json | 4 ++ core/api/docs/swagger.yaml | 3 ++ core/api/internal/object/model.go | 1 + core/api/internal/object/service.go | 1 + core/api/internal/object/service_test.go | 69 +++++++++++++----------- 6 files changed, 52 insertions(+), 30 deletions(-) diff --git a/core/api/docs/docs.go b/core/api/docs/docs.go index 410bc2b35..9eb2d64a3 100644 --- a/core/api/docs/docs.go +++ b/core/api/docs/docs.go @@ -923,6 +923,10 @@ const docTemplate = `{ "root_id": { "type": "string" }, + "snippet": { + "type": "string", + "example": "The beginning of the object body..." + }, "space_id": { "type": "string", "example": "bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1" diff --git a/core/api/docs/swagger.json b/core/api/docs/swagger.json index 7b10f8788..d4015df84 100644 --- a/core/api/docs/swagger.json +++ b/core/api/docs/swagger.json @@ -917,6 +917,10 @@ "root_id": { "type": "string" }, + "snippet": { + "type": "string", + "example": "The beginning of the object body..." + }, "space_id": { "type": "string", "example": "bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1" diff --git a/core/api/docs/swagger.yaml b/core/api/docs/swagger.yaml index 02ee8d3c0..eccf4d0df 100644 --- a/core/api/docs/swagger.yaml +++ b/core/api/docs/swagger.yaml @@ -114,6 +114,9 @@ definitions: type: string root_id: type: string + snippet: + example: The beginning of the object body... + type: string space_id: example: bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1 type: string diff --git a/core/api/internal/object/model.go b/core/api/internal/object/model.go index 0ecb4e98b..b70b73148 100644 --- a/core/api/internal/object/model.go +++ b/core/api/internal/object/model.go @@ -19,6 +19,7 @@ type Object struct { Id string `json:"id" example:"bafyreie6n5l5nkbjal37su54cha4coy7qzuhrnajluzv5qd5jvtsrxkequ"` Name string `json:"name" example:"Object Name"` Icon string `json:"icon" example:"📄"` + Snippet string `json:"snippet" example:"The beginning of the object body..."` Layout string `json:"layout" example:"basic"` ObjectType string `json:"object_type" example:"Page"` SpaceId string `json:"space_id" example:"bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1"` diff --git a/core/api/internal/object/service.go b/core/api/internal/object/service.go index c467652fb..d277478b2 100644 --- a/core/api/internal/object/service.go +++ b/core/api/internal/object/service.go @@ -128,6 +128,7 @@ func (s *ObjectService) GetObject(ctx context.Context, spaceId string, objectId Id: resp.ObjectView.Details[0].Details.Fields[bundle.RelationKeyId.String()].GetStringValue(), Name: resp.ObjectView.Details[0].Details.Fields[bundle.RelationKeyName.String()].GetStringValue(), Icon: icon, + Snippet: resp.ObjectView.Details[0].Details.Fields[bundle.RelationKeySnippet.String()].GetStringValue(), Layout: model.ObjectTypeLayout_name[int32(resp.ObjectView.Details[0].Details.Fields[bundle.RelationKeyLayout.String()].GetNumberValue())], ObjectType: objectTypeName, SpaceId: resp.ObjectView.Details[0].Details.Fields[bundle.RelationKeySpaceId.String()].GetStringValue(), diff --git a/core/api/internal/object/service_test.go b/core/api/internal/object/service_test.go index 82c95d5c1..22349b1d6 100644 --- a/core/api/internal/object/service_test.go +++ b/core/api/internal/object/service_test.go @@ -17,13 +17,17 @@ import ( ) const ( - offset = 0 - limit = 100 - mockedSpaceId = "mocked-space-id" - mockedObjectId = "mocked-object-id" - mockedNewObjectId = "mocked-new-object-id" - mockedTechSpaceId = "mocked-tech-space-id" - gatewayUrl = "http://localhost:31006" + offset = 0 + limit = 100 + mockedTechSpaceId = "mocked-tech-space-id" + gatewayUrl = "http://localhost:31006" + mockedSpaceId = "mocked-space-id" + mockedObjectId = "mocked-object-id" + mockedNewObjectId = "mocked-new-object-id" + mockedObjectName = "mocked-object-name" + mockedObjectSnippet = "mocked-object-snippet" + mockedObjectIcon = "🔍" + mockedObjectTypeUniqueKey = "ot-page" ) type fixture struct { @@ -84,10 +88,11 @@ func TestObjectService_ListObjects(t *testing.T) { { Fields: map[string]*types.Value{ bundle.RelationKeyId.String(): pbtypes.String(mockedObjectId), - bundle.RelationKeyName.String(): pbtypes.String("My Object"), - bundle.RelationKeyType.String(): pbtypes.String("ot-page"), - bundle.RelationKeyLayout.String(): pbtypes.Float64(float64(model.ObjectType_basic)), + bundle.RelationKeyName.String(): pbtypes.String(mockedObjectName), + bundle.RelationKeySnippet.String(): pbtypes.String(mockedObjectSnippet), bundle.RelationKeyIconEmoji.String(): pbtypes.String("📄"), + bundle.RelationKeyType.String(): pbtypes.String(mockedObjectTypeUniqueKey), + bundle.RelationKeyLayout.String(): pbtypes.Float64(float64(model.ObjectType_basic)), }, }, }, @@ -106,9 +111,10 @@ func TestObjectService_ListObjects(t *testing.T) { Details: &types.Struct{ Fields: map[string]*types.Value{ bundle.RelationKeyId.String(): pbtypes.String(mockedObjectId), - bundle.RelationKeyName.String(): pbtypes.String("My Object"), - bundle.RelationKeyType.String(): pbtypes.String("ot-page"), + bundle.RelationKeyName.String(): pbtypes.String(mockedObjectName), + bundle.RelationKeySnippet.String(): pbtypes.String(mockedObjectSnippet), bundle.RelationKeyIconEmoji.String(): pbtypes.String("📄"), + bundle.RelationKeyType.String(): pbtypes.String(mockedObjectTypeUniqueKey), bundle.RelationKeyLastModifiedDate.String(): pbtypes.Float64(999999), bundle.RelationKeyCreatedDate.String(): pbtypes.Float64(888888), bundle.RelationKeySpaceId.String(): pbtypes.String(mockedSpaceId), @@ -127,7 +133,7 @@ func TestObjectService_ListObjects(t *testing.T) { { RelationKey: bundle.RelationKeyUniqueKey.String(), Condition: model.BlockContentDataviewFilter_Equal, - Value: pbtypes.String("ot-page"), + Value: pbtypes.String(mockedObjectTypeUniqueKey), }, }, Keys: []string{bundle.RelationKeyName.String()}, @@ -176,9 +182,10 @@ func TestObjectService_ListObjects(t *testing.T) { require.NoError(t, err) require.Len(t, objects, 1) require.Equal(t, mockedObjectId, objects[0].Id) - require.Equal(t, "My Object", objects[0].Name) - require.Equal(t, "Page", objects[0].ObjectType) + require.Equal(t, mockedObjectName, objects[0].Name) + require.Equal(t, mockedObjectSnippet, objects[0].Snippet) require.Equal(t, "📄", objects[0].Icon) + require.Equal(t, "Page", objects[0].ObjectType) require.Equal(t, 5, len(objects[0].Details)) for _, detail := range objects[0].Details { @@ -242,9 +249,10 @@ func TestObjectService_GetObject(t *testing.T) { Details: &types.Struct{ Fields: map[string]*types.Value{ bundle.RelationKeyId.String(): pbtypes.String(mockedObjectId), - bundle.RelationKeyName.String(): pbtypes.String("Found Object"), - bundle.RelationKeyType.String(): pbtypes.String("ot-page"), - bundle.RelationKeyIconEmoji.String(): pbtypes.String("🔍"), + bundle.RelationKeyName.String(): pbtypes.String(mockedObjectName), + bundle.RelationKeySnippet.String(): pbtypes.String(mockedObjectSnippet), + bundle.RelationKeyIconEmoji.String(): pbtypes.String(mockedObjectName), + bundle.RelationKeyType.String(): pbtypes.String(mockedObjectTypeUniqueKey), bundle.RelationKeyLastModifiedDate.String(): pbtypes.Float64(999999), bundle.RelationKeyCreatedDate.String(): pbtypes.Float64(888888), bundle.RelationKeySpaceId.String(): pbtypes.String(mockedSpaceId), @@ -262,7 +270,7 @@ func TestObjectService_GetObject(t *testing.T) { { RelationKey: bundle.RelationKeyUniqueKey.String(), Condition: model.BlockContentDataviewFilter_Equal, - Value: pbtypes.String("ot-page"), + Value: pbtypes.String(mockedObjectTypeUniqueKey), }, }, Keys: []string{bundle.RelationKeyName.String()}, @@ -310,9 +318,10 @@ func TestObjectService_GetObject(t *testing.T) { // then require.NoError(t, err) require.Equal(t, mockedObjectId, object.Id) - require.Equal(t, "Found Object", object.Name) + require.Equal(t, mockedObjectName, object.Name) + require.Equal(t, mockedObjectSnippet, object.Snippet) + require.Equal(t, mockedObjectName, object.Icon) require.Equal(t, "Page", object.ObjectType) - require.Equal(t, "🔍", object.Icon) require.Equal(t, 5, len(object.Details)) for _, detail := range object.Details { @@ -360,7 +369,7 @@ func TestObjectService_CreateObject(t *testing.T) { fx.mwMock.On("ObjectCreate", mock.Anything, &pb.RpcObjectCreateRequest{ Details: &types.Struct{ Fields: map[string]*types.Value{ - bundle.RelationKeyName.String(): pbtypes.String("New Object"), + bundle.RelationKeyName.String(): pbtypes.String(mockedObjectName), bundle.RelationKeyIconEmoji.String(): pbtypes.String("🆕"), bundle.RelationKeyDescription.String(): pbtypes.String(""), bundle.RelationKeySource.String(): pbtypes.String(""), @@ -369,14 +378,14 @@ func TestObjectService_CreateObject(t *testing.T) { }, TemplateId: "", SpaceId: mockedSpaceId, - ObjectTypeUniqueKey: "ot-page", + ObjectTypeUniqueKey: mockedObjectTypeUniqueKey, WithChat: false, }).Return(&pb.RpcObjectCreateResponse{ ObjectId: mockedNewObjectId, Details: &types.Struct{ Fields: map[string]*types.Value{ bundle.RelationKeyId.String(): pbtypes.String(mockedNewObjectId), - bundle.RelationKeyName.String(): pbtypes.String("New Object"), + bundle.RelationKeyName.String(): pbtypes.String(mockedObjectName), bundle.RelationKeyIconEmoji.String(): pbtypes.String("🆕"), bundle.RelationKeySpaceId.String(): pbtypes.String(mockedSpaceId), }, @@ -396,9 +405,9 @@ func TestObjectService_CreateObject(t *testing.T) { Details: &types.Struct{ Fields: map[string]*types.Value{ bundle.RelationKeyId.String(): pbtypes.String(mockedNewObjectId), - bundle.RelationKeyName.String(): pbtypes.String("New Object"), + bundle.RelationKeyName.String(): pbtypes.String(mockedObjectName), bundle.RelationKeyLayout.String(): pbtypes.Float64(float64(model.ObjectType_basic)), - bundle.RelationKeyType.String(): pbtypes.String("ot-page"), + bundle.RelationKeyType.String(): pbtypes.String(mockedObjectTypeUniqueKey), bundle.RelationKeyIconEmoji.String(): pbtypes.String("🆕"), bundle.RelationKeySpaceId.String(): pbtypes.String(mockedSpaceId), }, @@ -416,7 +425,7 @@ func TestObjectService_CreateObject(t *testing.T) { { RelationKey: bundle.RelationKeyUniqueKey.String(), Condition: model.BlockContentDataviewFilter_Equal, - Value: pbtypes.String("ot-page"), + Value: pbtypes.String(mockedObjectTypeUniqueKey), }, }, Keys: []string{bundle.RelationKeyName.String()}, @@ -460,17 +469,17 @@ func TestObjectService_CreateObject(t *testing.T) { // when object, err := fx.CreateObject(ctx, mockedSpaceId, CreateObjectRequest{ - Name: "New Object", + Name: mockedObjectName, Icon: "🆕", // TODO: use actual values TemplateId: "", - ObjectTypeUniqueKey: "ot-page", + ObjectTypeUniqueKey: mockedObjectTypeUniqueKey, }) // then require.NoError(t, err) require.Equal(t, mockedNewObjectId, object.Id) - require.Equal(t, "New Object", object.Name) + require.Equal(t, mockedObjectName, object.Name) require.Equal(t, "Page", object.ObjectType) require.Equal(t, "🆕", object.Icon) require.Equal(t, mockedSpaceId, object.SpaceId) From fa7abd66b24d507d45d898e341ee3993128e8142 Mon Sep 17 00:00:00 2001 From: Jannis Metrikat <120120832+jmetrikat@users.noreply.github.com> Date: Sun, 26 Jan 2025 21:15:56 +0100 Subject: [PATCH 163/195] GO-4459: Refactor search endpoint to add sort option --- core/api/docs/docs.go | 57 ++++++++++++----- core/api/docs/swagger.json | 57 ++++++++++++----- core/api/docs/swagger.yaml | 39 ++++++++---- core/api/internal/object/service.go | 6 ++ core/api/internal/object/service_test.go | 12 +++- core/api/internal/search/handler.go | 16 +++-- core/api/internal/search/service.go | 79 +++++++++++++++++------- core/api/internal/search/service_test.go | 4 +- core/api/server/router.go | 2 +- 9 files changed, 191 insertions(+), 81 deletions(-) diff --git a/core/api/docs/docs.go b/core/api/docs/docs.go index 9eb2d64a3..c85a2b967 100644 --- a/core/api/docs/docs.go +++ b/core/api/docs/docs.go @@ -118,7 +118,7 @@ const docTemplate = `{ } }, "/search": { - "get": { + "post": { "consumes": [ "application/json" ], @@ -130,22 +130,6 @@ const docTemplate = `{ ], "summary": "Search objects across all spaces", "parameters": [ - { - "type": "string", - "description": "Search query", - "name": "query", - "in": "query" - }, - { - "type": "array", - "items": { - "type": "string" - }, - "collectionFormat": "csv", - "description": "Types to filter objects by", - "name": "types", - "in": "query" - }, { "type": "integer", "description": "The number of items to skip before starting to collect the result set", @@ -158,6 +142,15 @@ const docTemplate = `{ "description": "The number of items to return", "name": "limit", "in": "query" + }, + { + "description": "Search parameters", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/search.SearchRequest" + } } ], "responses": { @@ -1110,6 +1103,36 @@ const docTemplate = `{ } } }, + "search.SearchRequest": { + "type": "object", + "properties": { + "query": { + "type": "string" + }, + "sort": { + "$ref": "#/definitions/search.SortOptions" + }, + "types": { + "type": "array", + "items": { + "type": "string" + } + } + } + }, + "search.SortOptions": { + "type": "object", + "properties": { + "direction": { + "description": "\"asc\" or \"desc\"", + "type": "string" + }, + "timestamp": { + "description": "\"created_date\", \"last_modified_date\" or \"last_opened_date\"", + "type": "string" + } + } + }, "space.CreateSpaceResponse": { "type": "object", "properties": { diff --git a/core/api/docs/swagger.json b/core/api/docs/swagger.json index d4015df84..9460d9579 100644 --- a/core/api/docs/swagger.json +++ b/core/api/docs/swagger.json @@ -112,7 +112,7 @@ } }, "/search": { - "get": { + "post": { "consumes": [ "application/json" ], @@ -124,22 +124,6 @@ ], "summary": "Search objects across all spaces", "parameters": [ - { - "type": "string", - "description": "Search query", - "name": "query", - "in": "query" - }, - { - "type": "array", - "items": { - "type": "string" - }, - "collectionFormat": "csv", - "description": "Types to filter objects by", - "name": "types", - "in": "query" - }, { "type": "integer", "description": "The number of items to skip before starting to collect the result set", @@ -152,6 +136,15 @@ "description": "The number of items to return", "name": "limit", "in": "query" + }, + { + "description": "Search parameters", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/search.SearchRequest" + } } ], "responses": { @@ -1104,6 +1097,36 @@ } } }, + "search.SearchRequest": { + "type": "object", + "properties": { + "query": { + "type": "string" + }, + "sort": { + "$ref": "#/definitions/search.SortOptions" + }, + "types": { + "type": "array", + "items": { + "type": "string" + } + } + } + }, + "search.SortOptions": { + "type": "object", + "properties": { + "direction": { + "description": "\"asc\" or \"desc\"", + "type": "string" + }, + "timestamp": { + "description": "\"created_date\", \"last_modified_date\" or \"last_opened_date\"", + "type": "string" + } + } + }, "space.CreateSpaceResponse": { "type": "object", "properties": { diff --git a/core/api/docs/swagger.yaml b/core/api/docs/swagger.yaml index eccf4d0df..c5bed4edc 100644 --- a/core/api/docs/swagger.yaml +++ b/core/api/docs/swagger.yaml @@ -242,6 +242,26 @@ definitions: example: 1024 type: integer type: object + search.SearchRequest: + properties: + query: + type: string + sort: + $ref: '#/definitions/search.SortOptions' + types: + items: + type: string + type: array + type: object + search.SortOptions: + properties: + direction: + description: '"asc" or "desc"' + type: string + timestamp: + description: '"created_date", "last_modified_date" or "last_opened_date"' + type: string + type: object space.CreateSpaceResponse: properties: space: @@ -451,21 +471,10 @@ paths: tags: - auth /search: - get: + post: consumes: - application/json parameters: - - description: Search query - in: query - name: query - type: string - - collectionFormat: csv - description: Types to filter objects by - in: query - items: - type: string - name: types - type: array - description: The number of items to skip before starting to collect the result set in: query @@ -476,6 +485,12 @@ paths: in: query name: limit type: integer + - description: Search parameters + in: body + name: request + required: true + schema: + $ref: '#/definitions/search.SearchRequest' produces: - application/json responses: diff --git a/core/api/internal/object/service.go b/core/api/internal/object/service.go index d277478b2..6e8ecb7a5 100644 --- a/core/api/internal/object/service.go +++ b/core/api/internal/object/service.go @@ -417,6 +417,12 @@ func (s *ObjectService) GetDetails(resp *pb.RpcObjectShowResponse) []Detail { "details": s.spaceService.GetParticipantDetails(s.mw, s.AccountInfo, resp.ObjectView.Details[0].Details.Fields[bundle.RelationKeySpaceId.String()].GetStringValue(), creatorId), }, }, + { + Id: "last_opened_date", + Details: map[string]interface{}{ + "last_opened_date": PosixToISO8601(resp.ObjectView.Details[0].Details.Fields[bundle.RelationKeyLastOpenedDate.String()].GetNumberValue()), + }, + }, { Id: "tags", Details: map[string]interface{}{ diff --git a/core/api/internal/object/service_test.go b/core/api/internal/object/service_test.go index 22349b1d6..f79791803 100644 --- a/core/api/internal/object/service_test.go +++ b/core/api/internal/object/service_test.go @@ -115,8 +115,9 @@ func TestObjectService_ListObjects(t *testing.T) { bundle.RelationKeySnippet.String(): pbtypes.String(mockedObjectSnippet), bundle.RelationKeyIconEmoji.String(): pbtypes.String("📄"), bundle.RelationKeyType.String(): pbtypes.String(mockedObjectTypeUniqueKey), - bundle.RelationKeyLastModifiedDate.String(): pbtypes.Float64(999999), bundle.RelationKeyCreatedDate.String(): pbtypes.Float64(888888), + bundle.RelationKeyLastModifiedDate.String(): pbtypes.Float64(999999), + bundle.RelationKeyLastOpenedDate.String(): pbtypes.Float64(0), bundle.RelationKeySpaceId.String(): pbtypes.String(mockedSpaceId), }, }, @@ -186,7 +187,7 @@ func TestObjectService_ListObjects(t *testing.T) { require.Equal(t, mockedObjectSnippet, objects[0].Snippet) require.Equal(t, "📄", objects[0].Icon) require.Equal(t, "Page", objects[0].ObjectType) - require.Equal(t, 5, len(objects[0].Details)) + require.Equal(t, 6, len(objects[0].Details)) for _, detail := range objects[0].Details { if detail.Id == "created_date" { @@ -197,6 +198,8 @@ func TestObjectService_ListObjects(t *testing.T) { require.Equal(t, "1970-01-12T13:46:39Z", detail.Details["last_modified_date"]) } else if detail.Id == "last_modified_by" { require.Empty(t, detail.Details["last_modified_by"]) + } else if detail.Id == "last_opened_date" { + require.Equal(t, "1970-01-01T00:00:00Z", detail.Details["last_opened_date"]) } else if detail.Id == "tags" { require.Empty(t, detail.Details["tags"]) } else { @@ -255,6 +258,7 @@ func TestObjectService_GetObject(t *testing.T) { bundle.RelationKeyType.String(): pbtypes.String(mockedObjectTypeUniqueKey), bundle.RelationKeyLastModifiedDate.String(): pbtypes.Float64(999999), bundle.RelationKeyCreatedDate.String(): pbtypes.Float64(888888), + bundle.RelationKeyLastOpenedDate.String(): pbtypes.Float64(0), bundle.RelationKeySpaceId.String(): pbtypes.String(mockedSpaceId), }, }, @@ -322,7 +326,7 @@ func TestObjectService_GetObject(t *testing.T) { require.Equal(t, mockedObjectSnippet, object.Snippet) require.Equal(t, mockedObjectName, object.Icon) require.Equal(t, "Page", object.ObjectType) - require.Equal(t, 5, len(object.Details)) + require.Equal(t, 6, len(object.Details)) for _, detail := range object.Details { if detail.Id == "created_date" { @@ -333,6 +337,8 @@ func TestObjectService_GetObject(t *testing.T) { require.Equal(t, "1970-01-12T13:46:39Z", detail.Details["last_modified_date"]) } else if detail.Id == "last_modified_by" { require.Empty(t, detail.Details["last_modified_by"]) + } else if detail.Id == "last_opened_date" { + require.Equal(t, "1970-01-01T00:00:00Z", detail.Details["last_opened_date"]) } else if detail.Id == "tags" { require.Empty(t, detail.Details["tags"]) } else { diff --git a/core/api/internal/search/handler.go b/core/api/internal/search/handler.go index ee331c843..45c611c80 100644 --- a/core/api/internal/search/handler.go +++ b/core/api/internal/search/handler.go @@ -15,22 +15,26 @@ import ( // @Tags search // @Accept json // @Produce json -// @Param query query string false "Search query" -// @Param types query []string false "Types to filter objects by" // @Param offset query int false "The number of items to skip before starting to collect the result set" // @Param limit query int false "The number of items to return" default(100) +// @Param request body SearchRequest true "Search parameters" // @Success 200 {object} map[string][]object.Object "List of objects" // @Failure 401 {object} util.UnauthorizedError "Unauthorized" // @Failure 500 {object} util.ServerError "Internal server error" -// @Router /search [get] +// @Router /search [post] func SearchHandler(s *SearchService) gin.HandlerFunc { return func(c *gin.Context) { - searchQuery := c.Query("query") - objectTypes := c.QueryArray("types") offset := c.GetInt("offset") limit := c.GetInt("limit") - objects, total, hasMore, err := s.Search(c, searchQuery, objectTypes, offset, limit) + request := SearchRequest{} + if err := c.BindJSON(&request); err != nil { + apiErr := util.CodeToAPIError(http.StatusBadRequest, err.Error()) + c.JSON(http.StatusBadRequest, apiErr) + return + } + + objects, total, hasMore, err := s.Search(c, request, offset, limit) code := util.MapErrorCode(err, util.ErrToCode(ErrFailedSearchObjects, http.StatusInternalServerError), ) diff --git a/core/api/internal/search/service.go b/core/api/internal/search/service.go index be64f7cbb..7845c594c 100644 --- a/core/api/internal/search/service.go +++ b/core/api/internal/search/service.go @@ -23,7 +23,7 @@ var ( ) type Service interface { - Search(ctx context.Context, searchQuery string, types []string, offset, limit int) (objects []object.Object, total int, hasMore bool, err error) + Search(ctx context.Context, request SearchRequest, offset int, limit int) (objects []object.Object, total int, hasMore bool, err error) } type SearchService struct { @@ -38,33 +38,29 @@ func NewService(mw service.ClientCommandsServer, spaceService *space.SpaceServic } // Search retrieves a paginated list of objects from all spaces that match the search parameters. -func (s *SearchService) Search(ctx context.Context, searchQuery string, types []string, offset, limit int) (objects []object.Object, total int, hasMore bool, err error) { +func (s *SearchService) Search(ctx context.Context, request SearchRequest, offset int, limit int) (objects []object.Object, total int, hasMore bool, err error) { spaces, _, _, err := s.spaceService.ListSpaces(ctx, 0, spaceLimit) if err != nil { return nil, 0, false, err } baseFilters := s.prepareBaseFilters() - queryFilters := s.prepareQueryFilter(searchQuery) + queryFilters := s.prepareQueryFilter(request.Query) + sorts := s.prepareSorts(request.Sort) + dateToSortAfter := sorts[0].RelationKey allResponses := make([]*pb.RpcObjectSearchResponse, 0, len(spaces)) for _, space := range spaces { // Resolve object type IDs per space, as they are unique per space - typeFilters := s.prepareObjectTypeFilters(space.Id, types) + typeFilters := s.prepareObjectTypeFilters(space.Id, request.Types) filters := s.combineFilters(model.BlockContentDataviewFilter_And, baseFilters, queryFilters, typeFilters) objResp := s.mw.ObjectSearch(ctx, &pb.RpcObjectSearchRequest{ SpaceId: space.Id, Filters: filters, - Sorts: []*model.BlockContentDataviewSort{{ - RelationKey: bundle.RelationKeyLastModifiedDate.String(), - Type: model.BlockContentDataviewSort_Desc, - Format: model.RelationFormat_date, - IncludeTime: true, - EmptyPlacement: model.BlockContentDataviewSort_NotSpecified, - }}, - Keys: []string{bundle.RelationKeyId.String(), bundle.RelationKeyLastModifiedDate.String(), bundle.RelationKeySpaceId.String()}, - Limit: int32(offset + limit), // nolint: gosec + Sorts: sorts, + Keys: []string{bundle.RelationKeyId.String(), bundle.RelationKeySpaceId.String(), dateToSortAfter}, + Limit: int32(offset + limit), // nolint: gosec }) if objResp.Error.Code != pb.RpcObjectSearchResponseError_NULL { @@ -75,27 +71,27 @@ func (s *SearchService) Search(ctx context.Context, searchQuery string, types [] } combinedRecords := make([]struct { - Id string - SpaceId string - LastModifiedDate float64 + Id string + SpaceId string + DateToSortAfter float64 }, 0) for _, objResp := range allResponses { for _, record := range objResp.Records { combinedRecords = append(combinedRecords, struct { - Id string - SpaceId string - LastModifiedDate float64 + Id string + SpaceId string + DateToSortAfter float64 }{ - Id: record.Fields[bundle.RelationKeyId.String()].GetStringValue(), - SpaceId: record.Fields[bundle.RelationKeySpaceId.String()].GetStringValue(), - LastModifiedDate: record.Fields[bundle.RelationKeyLastModifiedDate.String()].GetNumberValue(), + Id: record.Fields[bundle.RelationKeyId.String()].GetStringValue(), + SpaceId: record.Fields[bundle.RelationKeySpaceId.String()].GetStringValue(), + DateToSortAfter: record.Fields[dateToSortAfter].GetNumberValue(), }) } } // sort after posix last_modified_date to achieve descending sort order across all spaces sort.Slice(combinedRecords, func(i, j int) bool { - return combinedRecords[i].LastModifiedDate > combinedRecords[j].LastModifiedDate + return combinedRecords[i].DateToSortAfter > combinedRecords[j].DateToSortAfter }) total = len(combinedRecords) @@ -227,3 +223,40 @@ func (s *SearchService) prepareObjectTypeFilters(spaceId string, objectTypes []s }, } } + +// prepareSorts returns a sort filter based on the given sort parameters +func (s *SearchService) prepareSorts(sort SortOptions) []*model.BlockContentDataviewSort { + return []*model.BlockContentDataviewSort{{ + RelationKey: s.getSortRelationKey(sort.Timestamp), + Type: s.getSortDirection(sort.Direction), + Format: model.RelationFormat_date, + IncludeTime: true, + EmptyPlacement: model.BlockContentDataviewSort_NotSpecified, + }} +} + +// getSortRelationKey returns the relation key for the given sort timestamp +func (s *SearchService) getSortRelationKey(timestamp string) string { + switch timestamp { + case "created_date": + return bundle.RelationKeyCreatedDate.String() + case "last_modified_date": + return bundle.RelationKeyLastModifiedDate.String() + case "last_opened_date": + return bundle.RelationKeyLastOpenedDate.String() + default: + return bundle.RelationKeyLastModifiedDate.String() + } +} + +// getSortDirection returns the sort direction for the given string +func (s *SearchService) getSortDirection(direction string) model.BlockContentDataviewSortType { + switch direction { + case "asc": + return model.BlockContentDataviewSort_Asc + case "desc": + return model.BlockContentDataviewSort_Desc + default: + return model.BlockContentDataviewSort_Desc + } +} diff --git a/core/api/internal/search/service_test.go b/core/api/internal/search/service_test.go index 5c05ad4c2..2cf132159 100644 --- a/core/api/internal/search/service_test.go +++ b/core/api/internal/search/service_test.go @@ -157,7 +157,7 @@ func TestSearchService_Search(t *testing.T) { IncludeTime: true, EmptyPlacement: model.BlockContentDataviewSort_NotSpecified, }}, - Keys: []string{bundle.RelationKeyId.String(), bundle.RelationKeyLastModifiedDate.String(), bundle.RelationKeySpaceId.String()}, + Keys: []string{bundle.RelationKeyId.String(), bundle.RelationKeySpaceId.String(), bundle.RelationKeyLastModifiedDate.String()}, Limit: int32(offset + limit), }).Return(&pb.RpcObjectSearchResponse{ Records: []*types.Struct{ @@ -322,7 +322,7 @@ func TestSearchService_Search(t *testing.T) { }).Twice() // when - objects, total, hasMore, err := fx.Search(ctx, "search-term", []string{}, offset, limit) + objects, total, hasMore, err := fx.Search(ctx, SearchRequest{Query: "search-term", Types: []string{}, Sort: SortOptions{Direction: "desc", Timestamp: "last_modified_date"}}, offset, limit) // then require.NoError(t, err) diff --git a/core/api/server/router.go b/core/api/server/router.go index 0b47eb959..257e26acc 100644 --- a/core/api/server/router.go +++ b/core/api/server/router.go @@ -73,7 +73,7 @@ func (s *Server) NewRouter(accountService account.Service, mw service.ClientComm v1.POST("/spaces/:space_id/objects", s.rateLimit(maxWriteRequestsPerSecond), object.CreateObjectHandler(s.objectService)) // Search - v1.GET("/search", search.SearchHandler(s.searchService)) + v1.POST("/search", search.SearchHandler(s.searchService)) // Space v1.GET("/spaces", space.GetSpacesHandler(s.spaceService)) From 05d2cb3012fb610289c95d5b5b34a80cd303d792 Mon Sep 17 00:00:00 2001 From: AnastasiaShemyakinskaya Date: Mon, 27 Jan 2025 00:21:21 +0100 Subject: [PATCH 164/195] GO-4889: fix Signed-off-by: AnastasiaShemyakinskaya --- core/block/export/export.go | 1 - 1 file changed, 1 deletion(-) diff --git a/core/block/export/export.go b/core/block/export/export.go index 0b6d70d92..87f91399c 100644 --- a/core/block/export/export.go +++ b/core/block/export/export.go @@ -854,7 +854,6 @@ func (e *exportContext) addNestedObject(id string, nestedDocs map[string]*Doc) { Blocks: true, Details: true, Collection: true, - NoSystemRelations: true, NoHiddenBundledRelations: true, }) return nil From e13ba05d3f8aabf79617a7e452bb603bd89a9b9c Mon Sep 17 00:00:00 2001 From: Jannis Metrikat <120120832+jmetrikat@users.noreply.github.com> Date: Mon, 27 Jan 2025 09:09:27 +0100 Subject: [PATCH 165/195] GO-4459: Add search model.go --- core/api/internal/search/model.go | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 core/api/internal/search/model.go diff --git a/core/api/internal/search/model.go b/core/api/internal/search/model.go new file mode 100644 index 000000000..a192e5a7b --- /dev/null +++ b/core/api/internal/search/model.go @@ -0,0 +1,12 @@ +package search + +type SearchRequest struct { + Query string `json:"query"` + Types []string `json:"types"` + Sort SortOptions `json:"sort"` +} + +type SortOptions struct { + Direction string `json:"direction"` // "asc" or "desc" + Timestamp string `json:"timestamp"` // "created_date", "last_modified_date" or "last_opened_date" +} From 6968ba5a040ff3bbfe6555607d5de6cfba93a15b Mon Sep 17 00:00:00 2001 From: Jannis Metrikat <120120832+jmetrikat@users.noreply.github.com> Date: Mon, 27 Jan 2025 09:17:07 +0100 Subject: [PATCH 166/195] GO-4459: Add search endpoint for single space --- core/api/docs/docs.go | 71 ++++++++++++++++++++++++ core/api/docs/swagger.json | 71 ++++++++++++++++++++++++ core/api/docs/swagger.yaml | 48 ++++++++++++++++ core/api/internal/search/handler.go | 48 +++++++++++++++- core/api/internal/search/service.go | 43 +++++++++++++- core/api/internal/search/service_test.go | 2 +- core/api/server/router.go | 3 +- 7 files changed, 278 insertions(+), 8 deletions(-) diff --git a/core/api/docs/docs.go b/core/api/docs/docs.go index c85a2b967..509cb28d5 100644 --- a/core/api/docs/docs.go +++ b/core/api/docs/docs.go @@ -626,6 +626,77 @@ const docTemplate = `{ } } }, + "/spaces/{space_id}/search": { + "post": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "search" + ], + "summary": "Search objects within a space", + "parameters": [ + { + "type": "string", + "description": "Space ID", + "name": "space_id", + "in": "path", + "required": true + }, + { + "type": "integer", + "description": "The number of items to skip before starting to collect the result set", + "name": "offset", + "in": "query" + }, + { + "type": "integer", + "default": 100, + "description": "The number of items to return", + "name": "limit", + "in": "query" + }, + { + "description": "Search parameters", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/search.SearchRequest" + } + } + ], + "responses": { + "200": { + "description": "List of objects", + "schema": { + "type": "object", + "additionalProperties": { + "type": "array", + "items": { + "$ref": "#/definitions/object.Object" + } + } + } + }, + "401": { + "description": "Unauthorized", + "schema": { + "$ref": "#/definitions/util.UnauthorizedError" + } + }, + "500": { + "description": "Internal server error", + "schema": { + "$ref": "#/definitions/util.ServerError" + } + } + } + } + }, "/spaces/{space_id}/types": { "get": { "consumes": [ diff --git a/core/api/docs/swagger.json b/core/api/docs/swagger.json index 9460d9579..67c5c4fb4 100644 --- a/core/api/docs/swagger.json +++ b/core/api/docs/swagger.json @@ -620,6 +620,77 @@ } } }, + "/spaces/{space_id}/search": { + "post": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "search" + ], + "summary": "Search objects within a space", + "parameters": [ + { + "type": "string", + "description": "Space ID", + "name": "space_id", + "in": "path", + "required": true + }, + { + "type": "integer", + "description": "The number of items to skip before starting to collect the result set", + "name": "offset", + "in": "query" + }, + { + "type": "integer", + "default": 100, + "description": "The number of items to return", + "name": "limit", + "in": "query" + }, + { + "description": "Search parameters", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/search.SearchRequest" + } + } + ], + "responses": { + "200": { + "description": "List of objects", + "schema": { + "type": "object", + "additionalProperties": { + "type": "array", + "items": { + "$ref": "#/definitions/object.Object" + } + } + } + }, + "401": { + "description": "Unauthorized", + "schema": { + "$ref": "#/definitions/util.UnauthorizedError" + } + }, + "500": { + "description": "Internal server error", + "schema": { + "$ref": "#/definitions/util.ServerError" + } + } + } + } + }, "/spaces/{space_id}/types": { "get": { "consumes": [ diff --git a/core/api/docs/swagger.yaml b/core/api/docs/swagger.yaml index c5bed4edc..a68680dc7 100644 --- a/core/api/docs/swagger.yaml +++ b/core/api/docs/swagger.yaml @@ -810,6 +810,54 @@ paths: summary: Export object tags: - export + /spaces/{space_id}/search: + post: + consumes: + - application/json + parameters: + - description: Space ID + in: path + name: space_id + required: true + type: string + - description: The number of items to skip before starting to collect the result + set + in: query + name: offset + type: integer + - default: 100 + description: The number of items to return + in: query + name: limit + type: integer + - description: Search parameters + in: body + name: request + required: true + schema: + $ref: '#/definitions/search.SearchRequest' + produces: + - application/json + responses: + "200": + description: List of objects + schema: + additionalProperties: + items: + $ref: '#/definitions/object.Object' + type: array + type: object + "401": + description: Unauthorized + schema: + $ref: '#/definitions/util.UnauthorizedError' + "500": + description: Internal server error + schema: + $ref: '#/definitions/util.ServerError' + summary: Search objects within a space + tags: + - search /spaces/{space_id}/types: get: consumes: diff --git a/core/api/internal/search/handler.go b/core/api/internal/search/handler.go index 45c611c80..c8610159a 100644 --- a/core/api/internal/search/handler.go +++ b/core/api/internal/search/handler.go @@ -9,7 +9,7 @@ import ( "github.com/anyproto/anytype-heart/core/api/util" ) -// SearchHandler searches and retrieves objects across all spaces +// GlobalSearchHandler searches and retrieves objects across all spaces // // @Summary Search objects across all spaces // @Tags search @@ -22,7 +22,7 @@ import ( // @Failure 401 {object} util.UnauthorizedError "Unauthorized" // @Failure 500 {object} util.ServerError "Internal server error" // @Router /search [post] -func SearchHandler(s *SearchService) gin.HandlerFunc { +func GlobalSearchHandler(s *SearchService) gin.HandlerFunc { return func(c *gin.Context) { offset := c.GetInt("offset") limit := c.GetInt("limit") @@ -34,7 +34,49 @@ func SearchHandler(s *SearchService) gin.HandlerFunc { return } - objects, total, hasMore, err := s.Search(c, request, offset, limit) + objects, total, hasMore, err := s.GlobalSearch(c, request, offset, limit) + code := util.MapErrorCode(err, + util.ErrToCode(ErrFailedSearchObjects, http.StatusInternalServerError), + ) + + if code != http.StatusOK { + apiErr := util.CodeToAPIError(code, err.Error()) + c.JSON(code, apiErr) + return + } + + pagination.RespondWithPagination(c, http.StatusOK, objects, total, offset, limit, hasMore) + } +} + +// SearchHandler searches and retrieves objects within a space +// +// @Summary Search objects within a space +// @Tags search +// @Accept json +// @Produce json +// @Param space_id path string true "Space ID" +// @Param offset query int false "The number of items to skip before starting to collect the result set" +// @Param limit query int false "The number of items to return" default(100) +// @Param request body SearchRequest true "Search parameters" +// @Success 200 {object} map[string][]object.Object "List of objects" +// @Failure 401 {object} util.UnauthorizedError "Unauthorized" +// @Failure 500 {object} util.ServerError "Internal server error" +// @Router /spaces/{space_id}/search [post] +func SearchHandler(s *SearchService) gin.HandlerFunc { + return func(c *gin.Context) { + spaceID := c.Param("space_id") + offset := c.GetInt("offset") + limit := c.GetInt("limit") + + request := SearchRequest{} + if err := c.BindJSON(&request); err != nil { + apiErr := util.CodeToAPIError(http.StatusBadRequest, err.Error()) + c.JSON(http.StatusBadRequest, apiErr) + return + } + + objects, total, hasMore, err := s.Search(c, spaceID, request, offset, limit) code := util.MapErrorCode(err, util.ErrToCode(ErrFailedSearchObjects, http.StatusInternalServerError), ) diff --git a/core/api/internal/search/service.go b/core/api/internal/search/service.go index 7845c594c..42dcd2ceb 100644 --- a/core/api/internal/search/service.go +++ b/core/api/internal/search/service.go @@ -23,7 +23,8 @@ var ( ) type Service interface { - Search(ctx context.Context, request SearchRequest, offset int, limit int) (objects []object.Object, total int, hasMore bool, err error) + GlobalSearch(ctx context.Context, request SearchRequest, offset int, limit int) (objects []object.Object, total int, hasMore bool, err error) + Search(ctx context.Context, spaceId string, request SearchRequest, offset int, limit int) (objects []object.Object, total int, hasMore bool, err error) } type SearchService struct { @@ -37,8 +38,8 @@ func NewService(mw service.ClientCommandsServer, spaceService *space.SpaceServic return &SearchService{mw: mw, spaceService: spaceService, objectService: objectService} } -// Search retrieves a paginated list of objects from all spaces that match the search parameters. -func (s *SearchService) Search(ctx context.Context, request SearchRequest, offset int, limit int) (objects []object.Object, total int, hasMore bool, err error) { +// GlobalSearch retrieves a paginated list of objects from all spaces that match the search parameters. +func (s *SearchService) GlobalSearch(ctx context.Context, request SearchRequest, offset int, limit int) (objects []object.Object, total int, hasMore bool, err error) { spaces, _, _, err := s.spaceService.ListSpaces(ctx, 0, spaceLimit) if err != nil { return nil, 0, false, err @@ -109,6 +110,42 @@ func (s *SearchService) Search(ctx context.Context, request SearchRequest, offse return results, total, hasMore, nil } +// Search retrieves a paginated list of objects from a specific space that match the search parameters. +func (s *SearchService) Search(ctx context.Context, spaceId string, request SearchRequest, offset int, limit int) (objects []object.Object, total int, hasMore bool, err error) { + baseFilters := s.prepareBaseFilters() + queryFilters := s.prepareQueryFilter(request.Query) + typeFilters := s.prepareObjectTypeFilters(spaceId, request.Types) + filters := s.combineFilters(model.BlockContentDataviewFilter_And, baseFilters, queryFilters, typeFilters) + + sorts := s.prepareSorts(request.Sort) + dateToSortAfter := sorts[0].RelationKey + + resp := s.mw.ObjectSearch(ctx, &pb.RpcObjectSearchRequest{ + SpaceId: spaceId, + Filters: filters, + Sorts: sorts, + Keys: []string{bundle.RelationKeyId.String(), bundle.RelationKeySpaceId.String(), dateToSortAfter}, + }) + + if resp.Error.Code != pb.RpcObjectSearchResponseError_NULL { + return nil, 0, false, ErrFailedSearchObjects + } + + total = len(resp.Records) + paginatedRecords, hasMore := pagination.Paginate(resp.Records, offset, limit) + + results := make([]object.Object, 0, len(paginatedRecords)) + for _, record := range paginatedRecords { + object, err := s.objectService.GetObject(ctx, record.Fields[bundle.RelationKeySpaceId.String()].GetStringValue(), record.Fields[bundle.RelationKeyId.String()].GetStringValue()) + if err != nil { + return nil, 0, false, err + } + results = append(results, object) + } + + return results, total, hasMore, nil +} + // makeAndCondition combines multiple filter groups with the given operator. func (s *SearchService) combineFilters(operator model.BlockContentDataviewFilterOperator, filterGroups ...[]*model.BlockContentDataviewFilter) []*model.BlockContentDataviewFilter { nestedFilters := make([]*model.BlockContentDataviewFilter, 0) diff --git a/core/api/internal/search/service_test.go b/core/api/internal/search/service_test.go index 2cf132159..eda651224 100644 --- a/core/api/internal/search/service_test.go +++ b/core/api/internal/search/service_test.go @@ -322,7 +322,7 @@ func TestSearchService_Search(t *testing.T) { }).Twice() // when - objects, total, hasMore, err := fx.Search(ctx, SearchRequest{Query: "search-term", Types: []string{}, Sort: SortOptions{Direction: "desc", Timestamp: "last_modified_date"}}, offset, limit) + objects, total, hasMore, err := fx.GlobalSearch(ctx, SearchRequest{Query: "search-term", Types: []string{}, Sort: SortOptions{Direction: "desc", Timestamp: "last_modified_date"}}, offset, limit) // then require.NoError(t, err) diff --git a/core/api/server/router.go b/core/api/server/router.go index 257e26acc..1728be74c 100644 --- a/core/api/server/router.go +++ b/core/api/server/router.go @@ -73,7 +73,8 @@ func (s *Server) NewRouter(accountService account.Service, mw service.ClientComm v1.POST("/spaces/:space_id/objects", s.rateLimit(maxWriteRequestsPerSecond), object.CreateObjectHandler(s.objectService)) // Search - v1.POST("/search", search.SearchHandler(s.searchService)) + v1.POST("/search", search.GlobalSearchHandler(s.searchService)) + v1.POST("/spaces/:space_id/search", search.SearchHandler(s.searchService)) // Space v1.GET("/spaces", space.GetSpacesHandler(s.spaceService)) From 9f72fbb673e83b4f4127ae1aa3fa52bedc9b16d6 Mon Sep 17 00:00:00 2001 From: Jannis Metrikat <120120832+jmetrikat@users.noreply.github.com> Date: Mon, 27 Jan 2025 09:30:11 +0100 Subject: [PATCH 167/195] GO-4459: Add default and max values to pagination param docs --- core/api/docs/docs.go | 14 ++++++++++++++ core/api/docs/swagger.json | 14 ++++++++++++++ core/api/docs/swagger.yaml | 28 +++++++++++++++++++++------- core/api/internal/object/handler.go | 12 ++++++------ core/api/internal/search/handler.go | 8 ++++---- core/api/internal/space/handler.go | 8 ++++---- 6 files changed, 63 insertions(+), 21 deletions(-) diff --git a/core/api/docs/docs.go b/core/api/docs/docs.go index 509cb28d5..3090f6e42 100644 --- a/core/api/docs/docs.go +++ b/core/api/docs/docs.go @@ -132,11 +132,13 @@ const docTemplate = `{ "parameters": [ { "type": "integer", + "default": 0, "description": "The number of items to skip before starting to collect the result set", "name": "offset", "in": "query" }, { + "maximum": 1000, "type": "integer", "default": 100, "description": "The number of items to return", @@ -196,11 +198,13 @@ const docTemplate = `{ "parameters": [ { "type": "integer", + "default": 0, "description": "The number of items to skip before starting to collect the result set", "name": "offset", "in": "query" }, { + "maximum": 1000, "type": "integer", "default": 100, "description": "The number of items to return", @@ -301,11 +305,13 @@ const docTemplate = `{ }, { "type": "integer", + "default": 0, "description": "The number of items to skip before starting to collect the result set", "name": "offset", "in": "query" }, { + "maximum": 1000, "type": "integer", "default": 100, "description": "The number of items to return", @@ -357,11 +363,13 @@ const docTemplate = `{ }, { "type": "integer", + "default": 0, "description": "The number of items to skip before starting to collect the result set", "name": "offset", "in": "query" }, { + "maximum": 1000, "type": "integer", "default": 100, "description": "The number of items to return", @@ -648,11 +656,13 @@ const docTemplate = `{ }, { "type": "integer", + "default": 0, "description": "The number of items to skip before starting to collect the result set", "name": "offset", "in": "query" }, { + "maximum": 1000, "type": "integer", "default": 100, "description": "The number of items to return", @@ -719,11 +729,13 @@ const docTemplate = `{ }, { "type": "integer", + "default": 0, "description": "The number of items to skip before starting to collect the result set", "name": "offset", "in": "query" }, { + "maximum": 1000, "type": "integer", "default": 100, "description": "The number of items to return", @@ -782,11 +794,13 @@ const docTemplate = `{ }, { "type": "integer", + "default": 0, "description": "The number of items to skip before starting to collect the result set", "name": "offset", "in": "query" }, { + "maximum": 1000, "type": "integer", "default": 100, "description": "The number of items to return", diff --git a/core/api/docs/swagger.json b/core/api/docs/swagger.json index 67c5c4fb4..8b8c60a7b 100644 --- a/core/api/docs/swagger.json +++ b/core/api/docs/swagger.json @@ -126,11 +126,13 @@ "parameters": [ { "type": "integer", + "default": 0, "description": "The number of items to skip before starting to collect the result set", "name": "offset", "in": "query" }, { + "maximum": 1000, "type": "integer", "default": 100, "description": "The number of items to return", @@ -190,11 +192,13 @@ "parameters": [ { "type": "integer", + "default": 0, "description": "The number of items to skip before starting to collect the result set", "name": "offset", "in": "query" }, { + "maximum": 1000, "type": "integer", "default": 100, "description": "The number of items to return", @@ -295,11 +299,13 @@ }, { "type": "integer", + "default": 0, "description": "The number of items to skip before starting to collect the result set", "name": "offset", "in": "query" }, { + "maximum": 1000, "type": "integer", "default": 100, "description": "The number of items to return", @@ -351,11 +357,13 @@ }, { "type": "integer", + "default": 0, "description": "The number of items to skip before starting to collect the result set", "name": "offset", "in": "query" }, { + "maximum": 1000, "type": "integer", "default": 100, "description": "The number of items to return", @@ -642,11 +650,13 @@ }, { "type": "integer", + "default": 0, "description": "The number of items to skip before starting to collect the result set", "name": "offset", "in": "query" }, { + "maximum": 1000, "type": "integer", "default": 100, "description": "The number of items to return", @@ -713,11 +723,13 @@ }, { "type": "integer", + "default": 0, "description": "The number of items to skip before starting to collect the result set", "name": "offset", "in": "query" }, { + "maximum": 1000, "type": "integer", "default": 100, "description": "The number of items to return", @@ -776,11 +788,13 @@ }, { "type": "integer", + "default": 0, "description": "The number of items to skip before starting to collect the result set", "name": "offset", "in": "query" }, { + "maximum": 1000, "type": "integer", "default": 100, "description": "The number of items to return", diff --git a/core/api/docs/swagger.yaml b/core/api/docs/swagger.yaml index a68680dc7..9ce98d14e 100644 --- a/core/api/docs/swagger.yaml +++ b/core/api/docs/swagger.yaml @@ -475,7 +475,8 @@ paths: consumes: - application/json parameters: - - description: The number of items to skip before starting to collect the result + - default: 0 + description: The number of items to skip before starting to collect the result set in: query name: offset @@ -483,6 +484,7 @@ paths: - default: 100 description: The number of items to return in: query + maximum: 1000 name: limit type: integer - description: Search parameters @@ -518,7 +520,8 @@ paths: consumes: - application/json parameters: - - description: The number of items to skip before starting to collect the result + - default: 0 + description: The number of items to skip before starting to collect the result set in: query name: offset @@ -526,6 +529,7 @@ paths: - default: 100 description: The number of items to return in: query + maximum: 1000 name: limit type: integer produces: @@ -588,7 +592,8 @@ paths: name: space_id required: true type: string - - description: The number of items to skip before starting to collect the result + - default: 0 + description: The number of items to skip before starting to collect the result set in: query name: offset @@ -596,6 +601,7 @@ paths: - default: 100 description: The number of items to return in: query + maximum: 1000 name: limit type: integer produces: @@ -626,7 +632,8 @@ paths: name: space_id required: true type: string - - description: The number of items to skip before starting to collect the result + - default: 0 + description: The number of items to skip before starting to collect the result set in: query name: offset @@ -634,6 +641,7 @@ paths: - default: 100 description: The number of items to return in: query + maximum: 1000 name: limit type: integer produces: @@ -820,7 +828,8 @@ paths: name: space_id required: true type: string - - description: The number of items to skip before starting to collect the result + - default: 0 + description: The number of items to skip before starting to collect the result set in: query name: offset @@ -828,6 +837,7 @@ paths: - default: 100 description: The number of items to return in: query + maximum: 1000 name: limit type: integer - description: Search parameters @@ -868,7 +878,8 @@ paths: name: space_id required: true type: string - - description: The number of items to skip before starting to collect the result + - default: 0 + description: The number of items to skip before starting to collect the result set in: query name: offset @@ -876,6 +887,7 @@ paths: - default: 100 description: The number of items to return in: query + maximum: 1000 name: limit type: integer produces: @@ -911,7 +923,8 @@ paths: name: type_id required: true type: string - - description: The number of items to skip before starting to collect the result + - default: 0 + description: The number of items to skip before starting to collect the result set in: query name: offset @@ -919,6 +932,7 @@ paths: - default: 100 description: The number of items to return in: query + maximum: 1000 name: limit type: integer produces: diff --git a/core/api/internal/object/handler.go b/core/api/internal/object/handler.go index 6951c6090..b7714fce6 100644 --- a/core/api/internal/object/handler.go +++ b/core/api/internal/object/handler.go @@ -16,8 +16,8 @@ import ( // @Accept json // @Produce json // @Param space_id path string true "Space ID" -// @Param offset query int false "The number of items to skip before starting to collect the result set" -// @Param limit query int false "The number of items to return" default(100) +// @Param offset query int false "The number of items to skip before starting to collect the result set" default(0) +// @Param limit query int false "The number of items to return" default(100) maximum(1000) // @Success 200 {object} pagination.PaginatedResponse[Object] "List of objects" // @Failure 401 {object} util.UnauthorizedError "Unauthorized" // @Failure 500 {object} util.ServerError "Internal server error" @@ -166,8 +166,8 @@ func CreateObjectHandler(s *ObjectService) gin.HandlerFunc { // @Accept json // @Produce json // @Param space_id path string true "Space ID" -// @Param offset query int false "The number of items to skip before starting to collect the result set" -// @Param limit query int false "The number of items to return" default(100) +// @Param offset query int false "The number of items to skip before starting to collect the result set" default(0) +// @Param limit query int false "The number of items to return" default(100) maximum(1000) // @Success 200 {object} pagination.PaginatedResponse[Type] "List of types" // @Failure 401 {object} util.UnauthorizedError "Unauthorized" // @Failure 500 {object} util.ServerError "Internal server error" @@ -201,8 +201,8 @@ func GetTypesHandler(s *ObjectService) gin.HandlerFunc { // @Produce json // @Param space_id path string true "Space ID" // @Param type_id path string true "Type ID" -// @Param offset query int false "The number of items to skip before starting to collect the result set" -// @Param limit query int false "The number of items to return" default(100) +// @Param offset query int false "The number of items to skip before starting to collect the result set" default(0) +// @Param limit query int false "The number of items to return" default(100) maximum(1000) // @Success 200 {object} pagination.PaginatedResponse[Template] "List of templates" // @Failure 401 {object} util.UnauthorizedError "Unauthorized" // @Failure 500 {object} util.ServerError "Internal server error" diff --git a/core/api/internal/search/handler.go b/core/api/internal/search/handler.go index c8610159a..4a6e70c36 100644 --- a/core/api/internal/search/handler.go +++ b/core/api/internal/search/handler.go @@ -15,8 +15,8 @@ import ( // @Tags search // @Accept json // @Produce json -// @Param offset query int false "The number of items to skip before starting to collect the result set" -// @Param limit query int false "The number of items to return" default(100) +// @Param offset query int false "The number of items to skip before starting to collect the result set" default(0) +// @Param limit query int false "The number of items to return" default(100) maximum(1000) // @Param request body SearchRequest true "Search parameters" // @Success 200 {object} map[string][]object.Object "List of objects" // @Failure 401 {object} util.UnauthorizedError "Unauthorized" @@ -56,8 +56,8 @@ func GlobalSearchHandler(s *SearchService) gin.HandlerFunc { // @Accept json // @Produce json // @Param space_id path string true "Space ID" -// @Param offset query int false "The number of items to skip before starting to collect the result set" -// @Param limit query int false "The number of items to return" default(100) +// @Param offset query int false "The number of items to skip before starting to collect the result set" default(0) +// @Param limit query int false "The number of items to return" default(100) maximum(1000) // @Param request body SearchRequest true "Search parameters" // @Success 200 {object} map[string][]object.Object "List of objects" // @Failure 401 {object} util.UnauthorizedError "Unauthorized" diff --git a/core/api/internal/space/handler.go b/core/api/internal/space/handler.go index 394dd87ac..714bf8e7b 100644 --- a/core/api/internal/space/handler.go +++ b/core/api/internal/space/handler.go @@ -15,8 +15,8 @@ import ( // @Tags spaces // @Accept json // @Produce json -// @Param offset query int false "The number of items to skip before starting to collect the result set" -// @Param limit query int false "The number of items to return" default(100) +// @Param offset query int false "The number of items to skip before starting to collect the result set" default(0) +// @Param limit query int false "The number of items to return" default(100) maximum(1000) // @Success 200 {object} pagination.PaginatedResponse[Space] "List of spaces" // @Failure 401 {object} util.UnauthorizedError "Unauthorized" // @Failure 500 {object} util.ServerError "Internal server error" @@ -85,8 +85,8 @@ func CreateSpaceHandler(s *SpaceService) gin.HandlerFunc { // @Accept json // @Produce json // @Param space_id path string true "Space ID" -// @Param offset query int false "The number of items to skip before starting to collect the result set" -// @Param limit query int false "The number of items to return" default(100) +// @Param offset query int false "The number of items to skip before starting to collect the result set" default(0) +// @Param limit query int false "The number of items to return" default(100) maximum(1000) // @Success 200 {object} pagination.PaginatedResponse[Member] "List of members" // @Failure 401 {object} util.UnauthorizedError "Unauthorized" // @Failure 500 {object} util.ServerError "Internal server error" From bc8b409b84bb8fe7b89cb2f2a0d47355cf581b97 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 27 Jan 2025 12:06:09 +0100 Subject: [PATCH 168/195] Bump github.com/anyproto/any-store from 0.1.4 to 0.1.5 (#2050) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 65f4c3dd8..edb02a67a 100644 --- a/go.mod +++ b/go.mod @@ -7,7 +7,7 @@ require ( github.com/PuerkitoBio/goquery v1.10.1 github.com/VividCortex/ewma v1.2.0 github.com/adrium/goheif v0.0.0-20230113233934-ca402e77a786 - github.com/anyproto/any-store v0.1.4 + github.com/anyproto/any-store v0.1.5 github.com/anyproto/any-sync v0.5.25 github.com/anyproto/anytype-publish-server/publishclient v0.0.0-20241223184559-a5cacfe0950a github.com/anyproto/go-chash v0.1.0 diff --git a/go.sum b/go.sum index ded421a5c..3217eb406 100644 --- a/go.sum +++ b/go.sum @@ -82,8 +82,8 @@ github.com/alexbrainman/goissue34681 v0.0.0-20191006012335-3fc7a47baff5/go.mod h github.com/andybalholm/cascadia v1.3.1/go.mod h1:R4bJ1UQfqADjvDa4P6HZHLh/3OxWWEqc0Sk8XGwHqvA= github.com/andybalholm/cascadia v1.3.3 h1:AG2YHrzJIm4BZ19iwJ/DAua6Btl3IwJX+VI4kktS1LM= github.com/andybalholm/cascadia v1.3.3/go.mod h1:xNd9bqTn98Ln4DwST8/nG+H0yuB8Hmgu1YHNnWw0GeA= -github.com/anyproto/any-store v0.1.4 h1:rIxMA2XugPtdHl2S/XWnNFAMxdBysFMT9ORoJWdWQwM= -github.com/anyproto/any-store v0.1.4/go.mod h1:nbyRoJYOlvSWU1xDOrmgPP96UeoTf4eYZ9k+qqLK9k8= +github.com/anyproto/any-store v0.1.5 h1:AHOaFr9A+RhUc80MceUI9DL8vWqEW7AVB29lTqUlLL8= +github.com/anyproto/any-store v0.1.5/go.mod h1:nbyRoJYOlvSWU1xDOrmgPP96UeoTf4eYZ9k+qqLK9k8= github.com/anyproto/any-sync v0.5.25 h1:v59eQ+C7YOKC18G1PVql17fuc42Mvgb7c7Ju855tc0Q= github.com/anyproto/any-sync v0.5.25/go.mod h1:NKQZqnU7NzOOjDQc/rKmiRmRDCrARdlEnVLYwWqTcfM= github.com/anyproto/anytype-publish-server/publishclient v0.0.0-20241223184559-a5cacfe0950a h1:kSNyLHsZ40JxlRAglr85YXH2ik2LH3AH5Hd3JL42KGo= From b55fb4b595407c0fb0e82de499aa82ac4797e667 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 27 Jan 2025 12:07:06 +0100 Subject: [PATCH 169/195] Bump github.com/samber/lo from 1.47.0 to 1.49.0 (#2049) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index edb02a67a..8dc8a8fca 100644 --- a/go.mod +++ b/go.mod @@ -85,7 +85,7 @@ require ( github.com/prometheus/client_golang v1.20.5 github.com/pseudomuto/protoc-gen-doc v1.5.1 github.com/rwcarlsen/goexif v0.0.0-20190401172101-9e8deecbddbd - github.com/samber/lo v1.47.0 + github.com/samber/lo v1.49.0 github.com/sasha-s/go-deadlock v0.3.5 github.com/shirou/gopsutil/v3 v3.24.5 github.com/srwiley/oksvg v0.0.0-20221011165216-be6e8873101c diff --git a/go.sum b/go.sum index 3217eb406..60652e252 100644 --- a/go.sum +++ b/go.sum @@ -979,8 +979,8 @@ github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQD github.com/rwcarlsen/goexif v0.0.0-20190401172101-9e8deecbddbd h1:CmH9+J6ZSsIjUK3dcGsnCnO41eRBOnY12zwkn5qVwgc= github.com/rwcarlsen/goexif v0.0.0-20190401172101-9e8deecbddbd/go.mod h1:hPqNNc0+uJM6H+SuU8sEs5K5IQeKccPqeSjfgcKGgPk= github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= -github.com/samber/lo v1.47.0 h1:z7RynLwP5nbyRscyvcD043DWYoOcYRv3mV8lBeqOCLc= -github.com/samber/lo v1.47.0/go.mod h1:RmDH9Ct32Qy3gduHQuKJ3gW1fMHAnE/fAzQuf6He5cU= +github.com/samber/lo v1.49.0 h1:AGnTnQrg1jpFuwECPUSoxZCfVH5W22b605kWSry3YxM= +github.com/samber/lo v1.49.0/go.mod h1:dO6KHFzUKXgP8LDhU0oI8d2hekjXnGOu0DB8Jecxd6o= github.com/samuel/go-zookeeper v0.0.0-20190923202752-2cc03de413da/go.mod h1:gi+0XIa01GRL2eRQVjQkKGqKF3SF9vZR/HnPullcV2E= github.com/sasha-s/go-deadlock v0.3.5 h1:tNCOEEDG6tBqrNDOX35j/7hL5FcFViG6awUGROb2NsU= github.com/sasha-s/go-deadlock v0.3.5/go.mod h1:bugP6EGbdGYObIlx7pUZtWqlvo8k9H6vCBBsiChJQ5U= From 43a13c99e591d35393d3fece88530407706766ea Mon Sep 17 00:00:00 2001 From: AnastasiaShemyakinskaya Date: Mon, 27 Jan 2025 13:04:11 +0100 Subject: [PATCH 170/195] GO-4889: use slices.clone Signed-off-by: AnastasiaShemyakinskaya --- core/publish/relationswhitelist.go | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/core/publish/relationswhitelist.go b/core/publish/relationswhitelist.go index fde82501f..f6cd84640 100644 --- a/core/publish/relationswhitelist.go +++ b/core/publish/relationswhitelist.go @@ -1,6 +1,8 @@ package publish import ( + "slices" + "github.com/anyproto/anytype-heart/pb" "github.com/anyproto/anytype-heart/pkg/lib/bundle" "github.com/anyproto/anytype-heart/pkg/lib/pb/model" @@ -16,7 +18,7 @@ var allObjectsRelationsWhiteList = []string{ bundle.RelationKeyName.String(), } -var documentRelationsWhiteList = append(allObjectsRelationsWhiteList, +var documentRelationsWhiteList = append(slices.Clone(allObjectsRelationsWhiteList), bundle.RelationKeyDescription.String(), bundle.RelationKeySnippet.String(), bundle.RelationKeyIconImage.String(), @@ -25,17 +27,17 @@ var documentRelationsWhiteList = append(allObjectsRelationsWhiteList, bundle.RelationKeyCoverId.String(), ) -var todoRelationsWhiteList = append(documentRelationsWhiteList, bundle.RelationKeyDone.String()) +var todoRelationsWhiteList = append(slices.Clone(documentRelationsWhiteList), bundle.RelationKeyDone.String()) -var bookmarkRelationsWhiteList = append(documentRelationsWhiteList, bundle.RelationKeyPicture.String()) +var bookmarkRelationsWhiteList = append(slices.Clone(documentRelationsWhiteList), bundle.RelationKeyPicture.String()) -var derivedObjectsWhiteList = append(allObjectsRelationsWhiteList, bundle.RelationKeyUniqueKey.String()) +var derivedObjectsWhiteList = append(slices.Clone(allObjectsRelationsWhiteList), bundle.RelationKeyUniqueKey.String()) -var relationsWhiteList = append(derivedObjectsWhiteList, bundle.RelationKeyRelationFormat.String()) +var relationsWhiteList = append(slices.Clone(derivedObjectsWhiteList), bundle.RelationKeyRelationFormat.String()) -var relationOptionWhiteList = append(derivedObjectsWhiteList, bundle.RelationKeyRelationOptionColor.String()) +var relationOptionWhiteList = append(slices.Clone(derivedObjectsWhiteList), bundle.RelationKeyRelationOptionColor.String()) -var fileRelationsWhiteList = append(documentRelationsWhiteList, bundle.RelationKeyFileId.String(), bundle.RelationKeyFileExt.String()) +var fileRelationsWhiteList = append(slices.Clone(documentRelationsWhiteList), bundle.RelationKeyFileId.String(), bundle.RelationKeyFileExt.String()) var publishingRelationsWhiteList = map[model.ObjectTypeLayout][]string{ model.ObjectType_basic: documentRelationsWhiteList, From 40c6d75a7d3b6063dacca3ac23552a1668f441c1 Mon Sep 17 00:00:00 2001 From: AnastasiaShemyakinskaya Date: Mon, 27 Jan 2025 14:08:14 +0100 Subject: [PATCH 171/195] GO-4889: copy state Signed-off-by: AnastasiaShemyakinskaya --- core/block/editor/state/state.go | 10 +++--- core/block/editor/state/state_test.go | 45 --------------------------- 2 files changed, 4 insertions(+), 51 deletions(-) diff --git a/core/block/editor/state/state.go b/core/block/editor/state/state.go index 6ad6b8143..42724921d 100644 --- a/core/block/editor/state/state.go +++ b/core/block/editor/state/state.go @@ -151,16 +151,14 @@ func (s *State) Filter(filters *Filters) *State { if filters == nil { return s } + stateCopy := s.Copy() if filters.RemoveBlocks { - s.filterBlocks() + stateCopy.filterBlocks() } if len(filters.RelationsWhiteList) > 0 { - s.filterRelations(filters) + stateCopy.filterRelations(filters) } - if s.parent != nil { - s.parent = s.parent.Filter(filters) - } - return s + return stateCopy } func (s *State) filterBlocks() { diff --git a/core/block/editor/state/state_test.go b/core/block/editor/state/state_test.go index 816580ba3..fdeb3469f 100644 --- a/core/block/editor/state/state_test.go +++ b/core/block/editor/state/state_test.go @@ -3101,51 +3101,6 @@ func TestFilter(t *testing.T) { assert.Len(t, filteredState.relationLinks, 1) assert.Equal(t, bundle.RelationKeyAssignee.String(), filteredState.relationLinks[0].Key) }) - t.Run("parent state", func(t *testing.T) { - // given - st := NewDoc("root", map[string]simple.Block{ - "root": base.NewBase(&model.Block{Id: "root", ChildrenIds: []string{"2"}}), - "2": base.NewBase(&model.Block{Id: "2"}), - }).(*State) - st.AddDetails(domain.NewDetailsFromMap(map[domain.RelationKey]domain.Value{ - bundle.RelationKeyCoverType: domain.Int64(1), - bundle.RelationKeyName: domain.String("name"), - bundle.RelationKeyAssignee: domain.String("assignee"), - bundle.RelationKeyLayout: domain.Int64(model.ObjectType_todo), - })) - st.AddRelationLinks(&model.RelationLink{ - Key: bundle.RelationKeyCoverType.String(), - Format: model.RelationFormat_number, - }, - &model.RelationLink{ - Key: bundle.RelationKeyName.String(), - Format: model.RelationFormat_longtext, - }, - &model.RelationLink{ - Key: bundle.RelationKeyAssignee.String(), - Format: model.RelationFormat_object, - }, - &model.RelationLink{ - Key: bundle.RelationKeyLayout.String(), - Format: model.RelationFormat_number, - }, - ) - - // when - filteredState := st.NewState().Filter(&Filters{ - RemoveBlocks: true, - RelationsWhiteList: map[model.ObjectTypeLayout][]domain.RelationKey{ - model.ObjectType_todo: {bundle.RelationKeyAssignee}, - }}) - - // then - assert.Equal(t, filteredState.parent.details.Len(), 1) - assert.Equal(t, filteredState.parent.localDetails.Len(), 0) - assert.Len(t, filteredState.parent.relationLinks, 1) - assert.Equal(t, bundle.RelationKeyAssignee.String(), filteredState.parent.relationLinks[0].Key) - assert.Len(t, filteredState.parent.blocks, 1) - assert.NotNil(t, filteredState.parent.blocks["root"]) - }) t.Run("empty white list relations", func(t *testing.T) { // given st := NewDoc("root", map[string]simple.Block{ From f59fb4149611b5787696000468470c2de9e3e55b Mon Sep 17 00:00:00 2001 From: Mikhail Date: Mon, 27 Jan 2025 15:11:19 +0100 Subject: [PATCH 172/195] GO-2076 Fix cold start memory overuse (#2046) --- .mockery.yaml | 1 + core/block/cache/cache.go | 5 + .../mock_cache/mock_CachedObjectGetter.go | 214 ++++++++++++++++++ core/block/object/objectcache/cache.go | 5 + .../mock_objectcache/mock_Cache.go | 56 +++++ core/block/service.go | 19 ++ core/indexer/fulltext.go | 4 + core/indexer/fulltext_test.go | 8 +- core/indexer/indexer.go | 4 +- go.mod | 8 +- go.sum | 16 +- .../mock_clientspace/mock_Space.go | 56 +++++ 12 files changed, 379 insertions(+), 17 deletions(-) create mode 100644 core/block/cache/mock_cache/mock_CachedObjectGetter.go diff --git a/.mockery.yaml b/.mockery.yaml index 883c2078c..f41f5cbc1 100644 --- a/.mockery.yaml +++ b/.mockery.yaml @@ -19,6 +19,7 @@ packages: github.com/anyproto/anytype-heart/core/block/cache: interfaces: ObjectGetter: + CachedObjectGetter: ObjectGetterComponent: github.com/anyproto/anytype-heart/pkg/lib/core: interfaces: diff --git a/core/block/cache/cache.go b/core/block/cache/cache.go index fd18fae99..7373af113 100644 --- a/core/block/cache/cache.go +++ b/core/block/cache/cache.go @@ -22,6 +22,11 @@ type ObjectGetter interface { GetObjectByFullID(ctx context.Context, id domain.FullID) (sb smartblock.SmartBlock, err error) } +type CachedObjectGetter interface { + ObjectGetter + TryRemoveFromCache(ctx context.Context, objectId string) (res bool, err error) +} + func Do[t any](p ObjectGetter, objectID string, apply func(sb t) error) error { ctx := context.Background() sb, err := p.GetObject(ctx, objectID) diff --git a/core/block/cache/mock_cache/mock_CachedObjectGetter.go b/core/block/cache/mock_cache/mock_CachedObjectGetter.go new file mode 100644 index 000000000..194dc2f8b --- /dev/null +++ b/core/block/cache/mock_cache/mock_CachedObjectGetter.go @@ -0,0 +1,214 @@ +// Code generated by mockery. DO NOT EDIT. + +package mock_cache + +import ( + context "context" + + domain "github.com/anyproto/anytype-heart/core/domain" + mock "github.com/stretchr/testify/mock" + + smartblock "github.com/anyproto/anytype-heart/core/block/editor/smartblock" +) + +// MockCachedObjectGetter is an autogenerated mock type for the CachedObjectGetter type +type MockCachedObjectGetter struct { + mock.Mock +} + +type MockCachedObjectGetter_Expecter struct { + mock *mock.Mock +} + +func (_m *MockCachedObjectGetter) EXPECT() *MockCachedObjectGetter_Expecter { + return &MockCachedObjectGetter_Expecter{mock: &_m.Mock} +} + +// GetObject provides a mock function with given fields: ctx, objectID +func (_m *MockCachedObjectGetter) GetObject(ctx context.Context, objectID string) (smartblock.SmartBlock, error) { + ret := _m.Called(ctx, objectID) + + if len(ret) == 0 { + panic("no return value specified for GetObject") + } + + var r0 smartblock.SmartBlock + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, string) (smartblock.SmartBlock, error)); ok { + return rf(ctx, objectID) + } + if rf, ok := ret.Get(0).(func(context.Context, string) smartblock.SmartBlock); ok { + r0 = rf(ctx, objectID) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(smartblock.SmartBlock) + } + } + + if rf, ok := ret.Get(1).(func(context.Context, string) error); ok { + r1 = rf(ctx, objectID) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// MockCachedObjectGetter_GetObject_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetObject' +type MockCachedObjectGetter_GetObject_Call struct { + *mock.Call +} + +// GetObject is a helper method to define mock.On call +// - ctx context.Context +// - objectID string +func (_e *MockCachedObjectGetter_Expecter) GetObject(ctx interface{}, objectID interface{}) *MockCachedObjectGetter_GetObject_Call { + return &MockCachedObjectGetter_GetObject_Call{Call: _e.mock.On("GetObject", ctx, objectID)} +} + +func (_c *MockCachedObjectGetter_GetObject_Call) Run(run func(ctx context.Context, objectID string)) *MockCachedObjectGetter_GetObject_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(string)) + }) + return _c +} + +func (_c *MockCachedObjectGetter_GetObject_Call) Return(sb smartblock.SmartBlock, err error) *MockCachedObjectGetter_GetObject_Call { + _c.Call.Return(sb, err) + return _c +} + +func (_c *MockCachedObjectGetter_GetObject_Call) RunAndReturn(run func(context.Context, string) (smartblock.SmartBlock, error)) *MockCachedObjectGetter_GetObject_Call { + _c.Call.Return(run) + return _c +} + +// GetObjectByFullID provides a mock function with given fields: ctx, id +func (_m *MockCachedObjectGetter) GetObjectByFullID(ctx context.Context, id domain.FullID) (smartblock.SmartBlock, error) { + ret := _m.Called(ctx, id) + + if len(ret) == 0 { + panic("no return value specified for GetObjectByFullID") + } + + var r0 smartblock.SmartBlock + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, domain.FullID) (smartblock.SmartBlock, error)); ok { + return rf(ctx, id) + } + if rf, ok := ret.Get(0).(func(context.Context, domain.FullID) smartblock.SmartBlock); ok { + r0 = rf(ctx, id) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(smartblock.SmartBlock) + } + } + + if rf, ok := ret.Get(1).(func(context.Context, domain.FullID) error); ok { + r1 = rf(ctx, id) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// MockCachedObjectGetter_GetObjectByFullID_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetObjectByFullID' +type MockCachedObjectGetter_GetObjectByFullID_Call struct { + *mock.Call +} + +// GetObjectByFullID is a helper method to define mock.On call +// - ctx context.Context +// - id domain.FullID +func (_e *MockCachedObjectGetter_Expecter) GetObjectByFullID(ctx interface{}, id interface{}) *MockCachedObjectGetter_GetObjectByFullID_Call { + return &MockCachedObjectGetter_GetObjectByFullID_Call{Call: _e.mock.On("GetObjectByFullID", ctx, id)} +} + +func (_c *MockCachedObjectGetter_GetObjectByFullID_Call) Run(run func(ctx context.Context, id domain.FullID)) *MockCachedObjectGetter_GetObjectByFullID_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(domain.FullID)) + }) + return _c +} + +func (_c *MockCachedObjectGetter_GetObjectByFullID_Call) Return(sb smartblock.SmartBlock, err error) *MockCachedObjectGetter_GetObjectByFullID_Call { + _c.Call.Return(sb, err) + return _c +} + +func (_c *MockCachedObjectGetter_GetObjectByFullID_Call) RunAndReturn(run func(context.Context, domain.FullID) (smartblock.SmartBlock, error)) *MockCachedObjectGetter_GetObjectByFullID_Call { + _c.Call.Return(run) + return _c +} + +// TryRemoveFromCache provides a mock function with given fields: ctx, objectId +func (_m *MockCachedObjectGetter) TryRemoveFromCache(ctx context.Context, objectId string) (bool, error) { + ret := _m.Called(ctx, objectId) + + if len(ret) == 0 { + panic("no return value specified for TryRemoveFromCache") + } + + var r0 bool + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, string) (bool, error)); ok { + return rf(ctx, objectId) + } + if rf, ok := ret.Get(0).(func(context.Context, string) bool); ok { + r0 = rf(ctx, objectId) + } else { + r0 = ret.Get(0).(bool) + } + + if rf, ok := ret.Get(1).(func(context.Context, string) error); ok { + r1 = rf(ctx, objectId) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// MockCachedObjectGetter_TryRemoveFromCache_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'TryRemoveFromCache' +type MockCachedObjectGetter_TryRemoveFromCache_Call struct { + *mock.Call +} + +// TryRemoveFromCache is a helper method to define mock.On call +// - ctx context.Context +// - objectId string +func (_e *MockCachedObjectGetter_Expecter) TryRemoveFromCache(ctx interface{}, objectId interface{}) *MockCachedObjectGetter_TryRemoveFromCache_Call { + return &MockCachedObjectGetter_TryRemoveFromCache_Call{Call: _e.mock.On("TryRemoveFromCache", ctx, objectId)} +} + +func (_c *MockCachedObjectGetter_TryRemoveFromCache_Call) Run(run func(ctx context.Context, objectId string)) *MockCachedObjectGetter_TryRemoveFromCache_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(string)) + }) + return _c +} + +func (_c *MockCachedObjectGetter_TryRemoveFromCache_Call) Return(res bool, err error) *MockCachedObjectGetter_TryRemoveFromCache_Call { + _c.Call.Return(res, err) + return _c +} + +func (_c *MockCachedObjectGetter_TryRemoveFromCache_Call) RunAndReturn(run func(context.Context, string) (bool, error)) *MockCachedObjectGetter_TryRemoveFromCache_Call { + _c.Call.Return(run) + return _c +} + +// NewMockCachedObjectGetter creates a new instance of MockCachedObjectGetter. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +// The first argument is typically a *testing.T value. +func NewMockCachedObjectGetter(t interface { + mock.TestingT + Cleanup(func()) +}) *MockCachedObjectGetter { + mock := &MockCachedObjectGetter{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} diff --git a/core/block/object/objectcache/cache.go b/core/block/object/objectcache/cache.go index 8eca07abf..56cabaaa3 100644 --- a/core/block/object/objectcache/cache.go +++ b/core/block/object/objectcache/cache.go @@ -52,6 +52,7 @@ type Cache interface { GetObjectWithTimeout(ctx context.Context, id string) (sb smartblock.SmartBlock, err error) DoLockedIfNotExists(objectID string, proc func() error) error Remove(ctx context.Context, objectID string) error + TryRemove(objectId string) (bool, error) CloseBlocks() Close(ctx context.Context) error @@ -155,6 +156,10 @@ func (c *objectCache) Remove(ctx context.Context, objectID string) error { return err } +func (c *objectCache) TryRemove(objectId string) (bool, error) { + return c.cache.TryRemove(objectId) +} + func (c *objectCache) GetObjectWithTimeout(ctx context.Context, id string) (sb smartblock.SmartBlock, err error) { if _, ok := ctx.Deadline(); !ok { var cancel context.CancelFunc diff --git a/core/block/object/objectcache/mock_objectcache/mock_Cache.go b/core/block/object/objectcache/mock_objectcache/mock_Cache.go index 8b77256e0..751b1614d 100644 --- a/core/block/object/objectcache/mock_objectcache/mock_Cache.go +++ b/core/block/object/objectcache/mock_objectcache/mock_Cache.go @@ -785,6 +785,62 @@ func (_c *MockCache_Remove_Call) RunAndReturn(run func(context.Context, string) return _c } +// TryRemove provides a mock function with given fields: objectId +func (_m *MockCache) TryRemove(objectId string) (bool, error) { + ret := _m.Called(objectId) + + if len(ret) == 0 { + panic("no return value specified for TryRemove") + } + + var r0 bool + var r1 error + if rf, ok := ret.Get(0).(func(string) (bool, error)); ok { + return rf(objectId) + } + if rf, ok := ret.Get(0).(func(string) bool); ok { + r0 = rf(objectId) + } else { + r0 = ret.Get(0).(bool) + } + + if rf, ok := ret.Get(1).(func(string) error); ok { + r1 = rf(objectId) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// MockCache_TryRemove_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'TryRemove' +type MockCache_TryRemove_Call struct { + *mock.Call +} + +// TryRemove is a helper method to define mock.On call +// - objectId string +func (_e *MockCache_Expecter) TryRemove(objectId interface{}) *MockCache_TryRemove_Call { + return &MockCache_TryRemove_Call{Call: _e.mock.On("TryRemove", objectId)} +} + +func (_c *MockCache_TryRemove_Call) Run(run func(objectId string)) *MockCache_TryRemove_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(string)) + }) + return _c +} + +func (_c *MockCache_TryRemove_Call) Return(_a0 bool, _a1 error) *MockCache_TryRemove_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *MockCache_TryRemove_Call) RunAndReturn(run func(string) (bool, error)) *MockCache_TryRemove_Call { + _c.Call.Return(run) + return _c +} + // NewMockCache creates a new instance of MockCache. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. // The first argument is typically a *testing.T value. func NewMockCache(t interface { diff --git a/core/block/service.go b/core/block/service.go index 1c10e9c95..c6f8df027 100644 --- a/core/block/service.go +++ b/core/block/service.go @@ -159,6 +159,25 @@ func (s *Service) GetObject(ctx context.Context, objectID string) (sb smartblock return s.GetObjectByFullID(ctx, domain.FullID{SpaceID: spaceID, ObjectID: objectID}) } +func (s *Service) TryRemoveFromCache(ctx context.Context, objectId string) (res bool, err error) { + spaceId, err := s.resolver.ResolveSpaceID(objectId) + if err != nil { + return false, fmt.Errorf("resolve space: %w", err) + } + spc, err := s.spaceService.Get(ctx, spaceId) + if err != nil { + return false, fmt.Errorf("get space: %w", err) + } + mutex.WithLock(s.openedObjs.lock, func() any { + _, contains := s.openedObjs.objects[objectId] + if !contains { + res, err = spc.TryRemove(objectId) + } + return nil + }) + return +} + func (s *Service) GetObjectByFullID(ctx context.Context, id domain.FullID) (sb smartblock.SmartBlock, err error) { spc, err := s.spaceService.Get(ctx, id.SpaceID) if err != nil { diff --git a/core/indexer/fulltext.go b/core/indexer/fulltext.go index 2d56fb747..79013fbc1 100644 --- a/core/indexer/fulltext.go +++ b/core/indexer/fulltext.go @@ -234,6 +234,10 @@ func (i *indexer) prepareSearchDocument(ctx context.Context, id string) (docs [] return nil }) + _, cacheErr := i.picker.TryRemoveFromCache(ctx, id) + if cacheErr != nil { + log.With("objectId", id).Errorf("object cache remove: %v", err) + } return docs, err } diff --git a/core/indexer/fulltext_test.go b/core/indexer/fulltext_test.go index 76bddddf9..4f456028c 100644 --- a/core/indexer/fulltext_test.go +++ b/core/indexer/fulltext_test.go @@ -35,7 +35,7 @@ import ( type IndexerFixture struct { *indexer - pickerFx *mock_cache.MockObjectGetter + pickerFx *mock_cache.MockCachedObjectGetter storageServiceFx *mock_storage.MockClientStorage objectStore *objectstore.StoreFixture sourceFx *mock_source.MockService @@ -82,13 +82,14 @@ func NewIndexerFixture(t *testing.T) *IndexerFixture { indxr.fileStore = fileStore indxr.ftsearch = objectStore.FullText indexerFx.ftsearch = indxr.ftsearch - indexerFx.pickerFx = mock_cache.NewMockObjectGetter(t) + indexerFx.pickerFx = mock_cache.NewMockCachedObjectGetter(t) indxr.picker = indexerFx.pickerFx indxr.spaceIndexers = make(map[string]*spaceIndexer) indxr.forceFt = make(chan struct{}) indxr.config = &config.Config{NetworkMode: pb.RpcAccount_LocalOnly} indxr.runCtx, indxr.runCtxCancel = context.WithCancel(ctx) - // go indxr.indexBatchLoop() + + indexerFx.pickerFx.EXPECT().TryRemoveFromCache(mock.Anything, mock.Anything).Maybe().Return(true, nil) return indexerFx } @@ -105,6 +106,7 @@ func TestPrepareSearchDocument_Success(t *testing.T) { ), ))) indexerFx.pickerFx.EXPECT().GetObject(mock.Anything, mock.Anything).Return(smartTest, nil) + indexerFx.pickerFx.EXPECT().TryRemoveFromCache(mock.Anything, "objectId1").Return(true, nil) docs, err := indexerFx.prepareSearchDocument(context.Background(), "objectId1") assert.NoError(t, err) diff --git a/core/indexer/indexer.go b/core/indexer/indexer.go index 3de996091..85c056d31 100644 --- a/core/indexer/indexer.go +++ b/core/indexer/indexer.go @@ -52,7 +52,7 @@ type indexer struct { store objectstore.ObjectStore fileStore filestore.FileStore source source.Service - picker cache.ObjectGetter + picker cache.CachedObjectGetter ftsearch ftsearch.FTSearch storageService storage.ClientStorage @@ -77,7 +77,7 @@ func (i *indexer) Init(a *app.App) (err error) { i.btHash = a.MustComponent("builtintemplate").(Hasher) i.fileStore = app.MustComponent[filestore.FileStore](a) i.ftsearch = app.MustComponent[ftsearch.FTSearch](a) - i.picker = app.MustComponent[cache.ObjectGetter](a) + i.picker = app.MustComponent[cache.CachedObjectGetter](a) i.runCtx, i.runCtxCancel = context.WithCancel(context.Background()) i.forceFt = make(chan struct{}) i.config = app.MustComponent[*config.Config](a) diff --git a/go.mod b/go.mod index 8dc8a8fca..24d874690 100644 --- a/go.mod +++ b/go.mod @@ -8,7 +8,7 @@ require ( github.com/VividCortex/ewma v1.2.0 github.com/adrium/goheif v0.0.0-20230113233934-ca402e77a786 github.com/anyproto/any-store v0.1.5 - github.com/anyproto/any-sync v0.5.25 + github.com/anyproto/any-sync v0.5.26 github.com/anyproto/anytype-publish-server/publishclient v0.0.0-20241223184559-a5cacfe0950a github.com/anyproto/go-chash v0.1.0 github.com/anyproto/go-naturaldate/v2 v2.0.2-0.20230524105841-9829cfd13438 @@ -52,9 +52,9 @@ require ( github.com/hbagdi/go-unsplash v0.0.0-20230414214043-474fc02c9119 github.com/huandu/skiplist v1.2.1 github.com/improbable-eng/grpc-web v0.15.0 - github.com/ipfs/boxo v0.26.0 + github.com/ipfs/boxo v0.27.0 github.com/ipfs/go-block-format v0.2.0 - github.com/ipfs/go-cid v0.4.1 + github.com/ipfs/go-cid v0.5.0 github.com/ipfs/go-datastore v0.6.0 github.com/ipfs/go-ds-flatfs v0.5.1 github.com/ipfs/go-ipld-format v0.6.0 @@ -218,7 +218,7 @@ require ( github.com/klauspost/cpuid/v2 v2.2.9 // indirect github.com/leodido/go-urn v1.4.0 // indirect github.com/libp2p/go-buffer-pool v0.1.0 // indirect - github.com/libp2p/go-libp2p v0.38.1 // indirect + github.com/libp2p/go-libp2p v0.38.2 // indirect github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 // indirect github.com/mailru/easyjson v0.7.6 // indirect github.com/mattn/go-colorable v0.1.13 // indirect diff --git a/go.sum b/go.sum index 60652e252..e977dd88c 100644 --- a/go.sum +++ b/go.sum @@ -84,8 +84,8 @@ github.com/andybalholm/cascadia v1.3.3 h1:AG2YHrzJIm4BZ19iwJ/DAua6Btl3IwJX+VI4kk github.com/andybalholm/cascadia v1.3.3/go.mod h1:xNd9bqTn98Ln4DwST8/nG+H0yuB8Hmgu1YHNnWw0GeA= github.com/anyproto/any-store v0.1.5 h1:AHOaFr9A+RhUc80MceUI9DL8vWqEW7AVB29lTqUlLL8= github.com/anyproto/any-store v0.1.5/go.mod h1:nbyRoJYOlvSWU1xDOrmgPP96UeoTf4eYZ9k+qqLK9k8= -github.com/anyproto/any-sync v0.5.25 h1:v59eQ+C7YOKC18G1PVql17fuc42Mvgb7c7Ju855tc0Q= -github.com/anyproto/any-sync v0.5.25/go.mod h1:NKQZqnU7NzOOjDQc/rKmiRmRDCrARdlEnVLYwWqTcfM= +github.com/anyproto/any-sync v0.5.26 h1:JWcR/RFGQ22CYWrdh2Ain6uEWNePtYHCLs+LXsm8hhU= +github.com/anyproto/any-sync v0.5.26/go.mod h1:Ljftoz6/mCM/2wP2tK9H1/jtVAxfgqzYplBA4MbiUs0= github.com/anyproto/anytype-publish-server/publishclient v0.0.0-20241223184559-a5cacfe0950a h1:kSNyLHsZ40JxlRAglr85YXH2ik2LH3AH5Hd3JL42KGo= github.com/anyproto/anytype-publish-server/publishclient v0.0.0-20241223184559-a5cacfe0950a/go.mod h1:4fkueCZcGniSMXkrwESO8zzERrh/L7WHimRNWecfGM0= github.com/anyproto/badger/v4 v4.2.1-0.20240110160636-80743fa3d580 h1:Ba80IlCCxkZ9H1GF+7vFu/TSpPvbpDCxXJ5ogc4euYc= @@ -584,14 +584,14 @@ github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLf github.com/influxdata/influxdb1-client v0.0.0-20191209144304-8bf82d3c094d/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo= github.com/ipfs/bbloom v0.0.4 h1:Gi+8EGJ2y5qiD5FbsbpX/TMNcJw8gSqr7eyjHa4Fhvs= github.com/ipfs/bbloom v0.0.4/go.mod h1:cS9YprKXpoZ9lT0n/Mw/a6/aFV6DTjTLYHeA+gyqMG0= -github.com/ipfs/boxo v0.26.0 h1:RRxEon7rJMy8ScVaTLncSZ5/nA6majYhRSbzc80snO8= -github.com/ipfs/boxo v0.26.0/go.mod h1:iHyc9cjoF7/zoiKVY65d2fBWRhoS2zx4cMk8hKgqrac= +github.com/ipfs/boxo v0.27.0 h1:8zu0zQrCXSUMn/0vnXy6oUppscoxstK7hQqiGFwUcjY= +github.com/ipfs/boxo v0.27.0/go.mod h1:qEIRrGNr0bitDedTCzyzBHxzNWqYmyuHgK8LG9Q83EM= github.com/ipfs/go-bitfield v1.1.0 h1:fh7FIo8bSwaJEh6DdTWbCeZ1eqOaOkKFI74SCnsWbGA= github.com/ipfs/go-bitfield v1.1.0/go.mod h1:paqf1wjq/D2BBmzfTVFlJQ9IlFOZpg422HL0HqsGWHU= github.com/ipfs/go-block-format v0.2.0 h1:ZqrkxBA2ICbDRbK8KJs/u0O3dlp6gmAuuXUJNiW1Ycs= github.com/ipfs/go-block-format v0.2.0/go.mod h1:+jpL11nFx5A/SPpsoBn6Bzkra/zaArfSmsknbPMYgzM= -github.com/ipfs/go-cid v0.4.1 h1:A/T3qGvxi4kpKWWcPC/PgbvDA2bjVLO7n4UeVwnbs/s= -github.com/ipfs/go-cid v0.4.1/go.mod h1:uQHwDeX4c6CtyrFwdqyhpNcxVewur1M7l7fNU7LKwZk= +github.com/ipfs/go-cid v0.5.0 h1:goEKKhaGm0ul11IHA7I6p1GmKz8kEYniqFopaB5Otwg= +github.com/ipfs/go-cid v0.5.0/go.mod h1:0L7vmeNXpQpUS9vt+yEARkJ8rOg43DF3iPgn4GIN0mk= github.com/ipfs/go-datastore v0.5.0/go.mod h1:9zhEApYMTl17C8YDp7JmU7sQZi2/wqiYh73hakZ90Bk= github.com/ipfs/go-datastore v0.6.0 h1:JKyz+Gvz1QEZw0LsX1IBn+JFCJQH4SJVFtM4uWU0Myk= github.com/ipfs/go-datastore v0.6.0/go.mod h1:rt5M3nNbSO/8q1t4LNkLyUwRs8HupMeN/8O4Vn9YAT8= @@ -699,8 +699,8 @@ github.com/libp2p/go-buffer-pool v0.1.0 h1:oK4mSFcQz7cTQIfqbe4MIj9gLW+mnanjyFtc6 github.com/libp2p/go-buffer-pool v0.1.0/go.mod h1:N+vh8gMqimBzdKkSMVuydVDq+UV5QTWy5HSiZacSbPg= github.com/libp2p/go-flow-metrics v0.2.0 h1:EIZzjmeOE6c8Dav0sNv35vhZxATIXWZg6j/C08XmmDw= github.com/libp2p/go-flow-metrics v0.2.0/go.mod h1:st3qqfu8+pMfh+9Mzqb2GTiwrAGjIPszEjZmtksN8Jc= -github.com/libp2p/go-libp2p v0.38.1 h1:aT1K7IFWi+gZUsQGCzTHBTlKX5QVZQOahng8DnOr6tQ= -github.com/libp2p/go-libp2p v0.38.1/go.mod h1:QWV4zGL3O9nXKdHirIC59DoRcZ446dfkjbOJ55NEWFo= +github.com/libp2p/go-libp2p v0.38.2 h1:9SZQDOCi82A25An4kx30lEtr6kGTxrtoaDkbs5xrK5k= +github.com/libp2p/go-libp2p v0.38.2/go.mod h1:QWV4zGL3O9nXKdHirIC59DoRcZ446dfkjbOJ55NEWFo= github.com/libp2p/go-libp2p-asn-util v0.4.1 h1:xqL7++IKD9TBFMgnLPZR6/6iYhawHKHl950SO9L6n94= github.com/libp2p/go-libp2p-asn-util v0.4.1/go.mod h1:d/NI6XZ9qxw67b4e+NgpQexCIiFYJjErASrYW4PFDN8= github.com/libp2p/go-libp2p-record v0.2.0 h1:oiNUOCWno2BFuxt3my4i1frNrt7PerzB3queqa1NkQ0= diff --git a/space/clientspace/mock_clientspace/mock_Space.go b/space/clientspace/mock_clientspace/mock_Space.go index a4bff49ae..d601e8001 100644 --- a/space/clientspace/mock_clientspace/mock_Space.go +++ b/space/clientspace/mock_clientspace/mock_Space.go @@ -1651,6 +1651,62 @@ func (_c *MockSpace_TreeBuilder_Call) RunAndReturn(run func() objecttreebuilder. return _c } +// TryRemove provides a mock function with given fields: objectId +func (_m *MockSpace) TryRemove(objectId string) (bool, error) { + ret := _m.Called(objectId) + + if len(ret) == 0 { + panic("no return value specified for TryRemove") + } + + var r0 bool + var r1 error + if rf, ok := ret.Get(0).(func(string) (bool, error)); ok { + return rf(objectId) + } + if rf, ok := ret.Get(0).(func(string) bool); ok { + r0 = rf(objectId) + } else { + r0 = ret.Get(0).(bool) + } + + if rf, ok := ret.Get(1).(func(string) error); ok { + r1 = rf(objectId) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// MockSpace_TryRemove_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'TryRemove' +type MockSpace_TryRemove_Call struct { + *mock.Call +} + +// TryRemove is a helper method to define mock.On call +// - objectId string +func (_e *MockSpace_Expecter) TryRemove(objectId interface{}) *MockSpace_TryRemove_Call { + return &MockSpace_TryRemove_Call{Call: _e.mock.On("TryRemove", objectId)} +} + +func (_c *MockSpace_TryRemove_Call) Run(run func(objectId string)) *MockSpace_TryRemove_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(string)) + }) + return _c +} + +func (_c *MockSpace_TryRemove_Call) Return(_a0 bool, _a1 error) *MockSpace_TryRemove_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *MockSpace_TryRemove_Call) RunAndReturn(run func(string) (bool, error)) *MockSpace_TryRemove_Call { + _c.Call.Return(run) + return _c +} + // WaitMandatoryObjects provides a mock function with given fields: ctx func (_m *MockSpace) WaitMandatoryObjects(ctx context.Context) error { ret := _m.Called(ctx) From b098e47778a29ba7068425f72667744de92d30ac Mon Sep 17 00:00:00 2001 From: AnastasiaShemyakinskaya Date: Mon, 27 Jan 2025 15:13:27 +0100 Subject: [PATCH 173/195] GO-4889: fix error code Signed-off-by: AnastasiaShemyakinskaya --- core/publish.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/publish.go b/core/publish.go index a64347855..6695ac51a 100644 --- a/core/publish.go +++ b/core/publish.go @@ -23,8 +23,8 @@ func (mw *Middleware) PublishingCreate(ctx context.Context, req *pb.RpcPublishin log.Error("PublishingCreate called", zap.String("objectId", req.ObjectId)) code := mapErrorCode(err, errToCode(nil, pb.RpcPublishingCreateResponseError_NULL), - errToCode(err, pb.RpcPublishingCreateResponseError_UNKNOWN_ERROR), - errToCode(publish.ErrLimitExceeded, pb.RpcPublishingCreateResponseError_LIMIT_EXCEEDED)) + errToCode(publish.ErrLimitExceeded, pb.RpcPublishingCreateResponseError_LIMIT_EXCEEDED), + errToCode(err, pb.RpcPublishingCreateResponseError_UNKNOWN_ERROR)) r := &pb.RpcPublishingCreateResponse{ Error: &pb.RpcPublishingCreateResponseError{ From ce7015e3c4767fa412c7324e540686b5fe6b4eec Mon Sep 17 00:00:00 2001 From: AnastasiaShemyakinskaya Date: Mon, 27 Jan 2025 16:37:17 +0100 Subject: [PATCH 174/195] GO-4889: call filter on copy Signed-off-by: AnastasiaShemyakinskaya --- core/block/editor/state/state.go | 8 ++--- core/block/editor/state/state_test.go | 44 --------------------------- core/block/export/export.go | 10 +++--- 3 files changed, 9 insertions(+), 53 deletions(-) diff --git a/core/block/editor/state/state.go b/core/block/editor/state/state.go index 42724921d..89c113aba 100644 --- a/core/block/editor/state/state.go +++ b/core/block/editor/state/state.go @@ -147,18 +147,18 @@ type Filters struct { RemoveBlocks bool } +// Filter should be called with state copy func (s *State) Filter(filters *Filters) *State { if filters == nil { return s } - stateCopy := s.Copy() if filters.RemoveBlocks { - stateCopy.filterBlocks() + s.filterBlocks() } if len(filters.RelationsWhiteList) > 0 { - stateCopy.filterRelations(filters) + s.filterRelations(filters) } - return stateCopy + return s } func (s *State) filterBlocks() { diff --git a/core/block/editor/state/state_test.go b/core/block/editor/state/state_test.go index fdeb3469f..f1be9f452 100644 --- a/core/block/editor/state/state_test.go +++ b/core/block/editor/state/state_test.go @@ -2979,50 +2979,6 @@ func TestState_AddRelationLinks(t *testing.T) { } func TestFilter(t *testing.T) { - t.Run("no filters", func(t *testing.T) { - // given - st := buildStateFromAST(blockbuilder.Root( - blockbuilder.ID("root"), - blockbuilder.Children( - blockbuilder.Text( - " text 1 ", - blockbuilder.ID("1"), - ), - blockbuilder.Text( - " text 2 ", - blockbuilder.ID("2"), - ), - ))) - st.AddDetails(domain.NewDetailsFromMap(map[domain.RelationKey]domain.Value{ - bundle.RelationKeyCoverType: domain.Int64(1), - bundle.RelationKeyName: domain.String("name"), - bundle.RelationKeyAssignee: domain.String("assignee"), - bundle.RelationKeyLayout: domain.Int64(model.ObjectType_todo), - })) - st.AddRelationLinks(&model.RelationLink{ - Key: bundle.RelationKeyCoverType.String(), - Format: model.RelationFormat_number, - }, - &model.RelationLink{ - Key: bundle.RelationKeyName.String(), - Format: model.RelationFormat_longtext, - }, - &model.RelationLink{ - Key: bundle.RelationKeyAssignee.String(), - Format: model.RelationFormat_object, - }, - &model.RelationLink{ - Key: bundle.RelationKeyLayout.String(), - Format: model.RelationFormat_number, - }, - ) - - // when - filteredState := st.Filter(nil) - - // then - assert.Equal(t, st, filteredState) - }) t.Run("remove blocks", func(t *testing.T) { // given st := NewDoc("root", map[string]simple.Block{ diff --git a/core/block/export/export.go b/core/block/export/export.go index 87f91399c..3d1d51acc 100644 --- a/core/block/export/export.go +++ b/core/block/export/export.go @@ -482,7 +482,7 @@ func (e *exportContext) addDependentObjectsFromDataview() error { func (e *exportContext) getViewDependentObjects(id string, viewDependentObjectsIds []string) ([]string, error) { err := cache.Do(e.picker, id, func(sb sb.SmartBlock) error { - st := sb.NewState().Filter(e.getStateFilters(id)) + st := sb.NewState().Copy().Filter(e.getStateFilters(id)) viewDependentObjectsIds = append(viewDependentObjectsIds, objectlink.DependentObjectIDs(st, sb.Space(), objectlink.Flags{Blocks: true})...) return nil }) @@ -561,7 +561,7 @@ func (e *exportContext) collectDerivedObjects(objects map[string]*Doc) ([]string var relations, objectsTypes, setOf []string for id := range objects { err := cache.Do(e.picker, id, func(b sb.SmartBlock) error { - state := b.NewState().Filter(e.getStateFilters(id)) + state := b.NewState().Copy().Filter(e.getStateFilters(id)) relations = lo.Union(relations, getObjectRelations(state)) details := state.CombinedDetails() if isObjectWithDataview(details) { @@ -849,7 +849,7 @@ func (e *exportContext) addNestedObjects(ids []string) error { func (e *exportContext) addNestedObject(id string, nestedDocs map[string]*Doc) { var links []string err := cache.Do(e.picker, id, func(sb sb.SmartBlock) error { - st := sb.NewState().Filter(e.getStateFilters(id)) + st := sb.NewState().Copy().Filter(e.getStateFilters(id)) links = objectlink.DependentObjectIDs(st, sb.Space(), objectlink.Flags{ Blocks: true, Details: true, @@ -890,7 +890,7 @@ func (e *exportContext) fillLinkedFiles(id string) ([]string, error) { spaceIndex := e.objectStore.SpaceIndex(e.spaceId) var fileObjectsIds []string err := cache.Do(e.picker, id, func(b sb.SmartBlock) error { - b.NewState().Filter(e.getStateFilters(id)).IterateLinkedFiles(func(fileObjectId string) { + b.NewState().Copy().Filter(e.getStateFilters(id)).IterateLinkedFiles(func(fileObjectId string) { res, err := spaceIndex.Query(database.Query{ Filters: []database.FilterRequest{ { @@ -1002,7 +1002,7 @@ func (e *exportContext) writeDoc(ctx context.Context, wr writer, docId string, d return nil } - st = st.Filter(e.getStateFilters(docId)) + st = st.Copy().Filter(e.getStateFilters(docId)) if e.includeFiles && b.Type() == smartblock.SmartBlockTypeFileObject { fileName, err := e.saveFile(ctx, wr, b, e.spaceId == "") if err != nil { From 7ded30135ef1cca35ee619ceb31c5cdc7adf709e Mon Sep 17 00:00:00 2001 From: kirillston Date: Mon, 27 Jan 2025 18:35:28 +0100 Subject: [PATCH 175/195] GO-4444 Remove comment --- space/internal/components/migration/runner.go | 1 - 1 file changed, 1 deletion(-) diff --git a/space/internal/components/migration/runner.go b/space/internal/components/migration/runner.go index 21e6cc76d..57610604e 100644 --- a/space/internal/components/migration/runner.go +++ b/space/internal/components/migration/runner.go @@ -106,7 +106,6 @@ func (r *Runner) run(migrations ...Migration) (err error) { start := time.Now() store := r.store.SpaceIndex(spaceId) - // marketPlaceStore := r.store.SpaceIndex(addr.AnytypeMarketplaceWorkspace) spent := time.Since(start) for _, m := range migrations { From a838fd1ebda089033bbdcef6ba841225a69a4baa Mon Sep 17 00:00:00 2001 From: Jannis Metrikat <120120832+jmetrikat@users.noreply.github.com> Date: Mon, 27 Jan 2025 19:02:07 +0100 Subject: [PATCH 176/195] GO-4459: Add endpoints for single type and template --- core/api/docs/docs.go | 158 ++++++++++++++++++++++++++-- core/api/docs/swagger.json | 158 ++++++++++++++++++++++++++-- core/api/docs/swagger.yaml | 105 +++++++++++++++++- core/api/internal/object/handler.go | 74 ++++++++++++- core/api/internal/object/model.go | 8 ++ core/api/internal/object/service.go | 74 +++++++++++-- core/api/server/router.go | 10 +- core/api/service.go | 11 +- 8 files changed, 560 insertions(+), 38 deletions(-) diff --git a/core/api/docs/docs.go b/core/api/docs/docs.go index 3090f6e42..d68a733bf 100644 --- a/core/api/docs/docs.go +++ b/core/api/docs/docs.go @@ -716,7 +716,7 @@ const docTemplate = `{ "application/json" ], "tags": [ - "objects" + "types" ], "summary": "List types", "parameters": [ @@ -765,6 +765,62 @@ const docTemplate = `{ } } }, + "/spaces/{space_id}/types/{type_id}": { + "get": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "types" + ], + "summary": "Get type", + "parameters": [ + { + "type": "string", + "description": "Space ID", + "name": "space_id", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "Type ID", + "name": "type_id", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "The requested type", + "schema": { + "$ref": "#/definitions/object.TypeResponse" + } + }, + "401": { + "description": "Unauthorized", + "schema": { + "$ref": "#/definitions/util.UnauthorizedError" + } + }, + "404": { + "description": "Resource not found", + "schema": { + "$ref": "#/definitions/util.NotFoundError" + } + }, + "500": { + "description": "Internal server error", + "schema": { + "$ref": "#/definitions/util.ServerError" + } + } + } + } + }, "/spaces/{space_id}/types/{type_id}/templates": { "get": { "consumes": [ @@ -774,7 +830,7 @@ const docTemplate = `{ "application/json" ], "tags": [ - "objects" + "types" ], "summary": "List templates", "parameters": [ @@ -829,6 +885,69 @@ const docTemplate = `{ } } } + }, + "/spaces/{space_id}/types/{type_id}/templates/{template_id}": { + "get": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "types" + ], + "summary": "Get template", + "parameters": [ + { + "type": "string", + "description": "Space ID", + "name": "space_id", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "Type ID", + "name": "type_id", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "Template ID", + "name": "template_id", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "The requested template", + "schema": { + "$ref": "#/definitions/object.TemplateResponse" + } + }, + "401": { + "description": "Unauthorized", + "schema": { + "$ref": "#/definitions/util.UnauthorizedError" + } + }, + "404": { + "description": "Resource not found", + "schema": { + "$ref": "#/definitions/util.NotFoundError" + } + }, + "500": { + "description": "Internal server error", + "schema": { + "$ref": "#/definitions/util.ServerError" + } + } + } + } } }, "definitions": { @@ -1044,6 +1163,14 @@ const docTemplate = `{ } } }, + "object.TemplateResponse": { + "type": "object", + "properties": { + "template": { + "$ref": "#/definitions/object.Template" + } + } + }, "object.Text": { "type": "object", "properties": { @@ -1093,6 +1220,14 @@ const docTemplate = `{ } } }, + "object.TypeResponse": { + "type": "object", + "properties": { + "type": { + "$ref": "#/definitions/object.Type" + } + } + }, "pagination.PaginatedResponse-object_Object": { "type": "object", "properties": { @@ -1209,12 +1344,18 @@ const docTemplate = `{ "type": "object", "properties": { "direction": { - "description": "\"asc\" or \"desc\"", - "type": "string" + "type": "string", + "default": "desc", + "enum": [ + "asc|desc" + ] }, "timestamp": { - "description": "\"created_date\", \"last_modified_date\" or \"last_opened_date\"", - "type": "string" + "type": "string", + "default": "last_modified_date", + "enum": [ + "created_date|last_modified_date|last_opened_date" + ] } } }, @@ -1251,6 +1392,9 @@ const docTemplate = `{ }, "role": { "type": "string", + "enum": [ + "Reader|Writer|Owner|NoPermission" + ], "example": "Owner" }, "type": { @@ -1288,7 +1432,7 @@ const docTemplate = `{ }, "icon": { "type": "string", - "example": "http://127.0.0.1:31006/image/bafybeieptz5hvcy6txplcvphjbbh5yjc2zqhmihs3owkh5oab4ezauzqay?width=100" + "example": "http://127.0.0.1:31006/image/bafybeieptz5hvcy6txplcvphjbbh5yjc2zqhmihs3owkh5oab4ezauzqay" }, "id": { "type": "string", diff --git a/core/api/docs/swagger.json b/core/api/docs/swagger.json index 8b8c60a7b..68411e15b 100644 --- a/core/api/docs/swagger.json +++ b/core/api/docs/swagger.json @@ -710,7 +710,7 @@ "application/json" ], "tags": [ - "objects" + "types" ], "summary": "List types", "parameters": [ @@ -759,6 +759,62 @@ } } }, + "/spaces/{space_id}/types/{type_id}": { + "get": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "types" + ], + "summary": "Get type", + "parameters": [ + { + "type": "string", + "description": "Space ID", + "name": "space_id", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "Type ID", + "name": "type_id", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "The requested type", + "schema": { + "$ref": "#/definitions/object.TypeResponse" + } + }, + "401": { + "description": "Unauthorized", + "schema": { + "$ref": "#/definitions/util.UnauthorizedError" + } + }, + "404": { + "description": "Resource not found", + "schema": { + "$ref": "#/definitions/util.NotFoundError" + } + }, + "500": { + "description": "Internal server error", + "schema": { + "$ref": "#/definitions/util.ServerError" + } + } + } + } + }, "/spaces/{space_id}/types/{type_id}/templates": { "get": { "consumes": [ @@ -768,7 +824,7 @@ "application/json" ], "tags": [ - "objects" + "types" ], "summary": "List templates", "parameters": [ @@ -823,6 +879,69 @@ } } } + }, + "/spaces/{space_id}/types/{type_id}/templates/{template_id}": { + "get": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "types" + ], + "summary": "Get template", + "parameters": [ + { + "type": "string", + "description": "Space ID", + "name": "space_id", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "Type ID", + "name": "type_id", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "Template ID", + "name": "template_id", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "The requested template", + "schema": { + "$ref": "#/definitions/object.TemplateResponse" + } + }, + "401": { + "description": "Unauthorized", + "schema": { + "$ref": "#/definitions/util.UnauthorizedError" + } + }, + "404": { + "description": "Resource not found", + "schema": { + "$ref": "#/definitions/util.NotFoundError" + } + }, + "500": { + "description": "Internal server error", + "schema": { + "$ref": "#/definitions/util.ServerError" + } + } + } + } } }, "definitions": { @@ -1038,6 +1157,14 @@ } } }, + "object.TemplateResponse": { + "type": "object", + "properties": { + "template": { + "$ref": "#/definitions/object.Template" + } + } + }, "object.Text": { "type": "object", "properties": { @@ -1087,6 +1214,14 @@ } } }, + "object.TypeResponse": { + "type": "object", + "properties": { + "type": { + "$ref": "#/definitions/object.Type" + } + } + }, "pagination.PaginatedResponse-object_Object": { "type": "object", "properties": { @@ -1203,12 +1338,18 @@ "type": "object", "properties": { "direction": { - "description": "\"asc\" or \"desc\"", - "type": "string" + "type": "string", + "default": "desc", + "enum": [ + "asc|desc" + ] }, "timestamp": { - "description": "\"created_date\", \"last_modified_date\" or \"last_opened_date\"", - "type": "string" + "type": "string", + "default": "last_modified_date", + "enum": [ + "created_date|last_modified_date|last_opened_date" + ] } } }, @@ -1245,6 +1386,9 @@ }, "role": { "type": "string", + "enum": [ + "Reader|Writer|Owner|NoPermission" + ], "example": "Owner" }, "type": { @@ -1282,7 +1426,7 @@ }, "icon": { "type": "string", - "example": "http://127.0.0.1:31006/image/bafybeieptz5hvcy6txplcvphjbbh5yjc2zqhmihs3owkh5oab4ezauzqay?width=100" + "example": "http://127.0.0.1:31006/image/bafybeieptz5hvcy6txplcvphjbbh5yjc2zqhmihs3owkh5oab4ezauzqay" }, "id": { "type": "string", diff --git a/core/api/docs/swagger.yaml b/core/api/docs/swagger.yaml index 9ce98d14e..08e017e99 100644 --- a/core/api/docs/swagger.yaml +++ b/core/api/docs/swagger.yaml @@ -144,6 +144,11 @@ definitions: example: template type: string type: object + object.TemplateResponse: + properties: + template: + $ref: '#/definitions/object.Template' + type: object object.Text: properties: checked: @@ -178,6 +183,11 @@ definitions: example: ot-page type: string type: object + object.TypeResponse: + properties: + type: + $ref: '#/definitions/object.Type' + type: object pagination.PaginatedResponse-object_Object: properties: data: @@ -256,10 +266,14 @@ definitions: search.SortOptions: properties: direction: - description: '"asc" or "desc"' + default: desc + enum: + - asc|desc type: string timestamp: - description: '"created_date", "last_modified_date" or "last_opened_date"' + default: last_modified_date + enum: + - created_date|last_modified_date|last_opened_date type: string type: object space.CreateSpaceResponse: @@ -285,6 +299,8 @@ definitions: example: John Doe type: string role: + enum: + - Reader|Writer|Owner|NoPermission example: Owner type: string type: @@ -312,7 +328,7 @@ definitions: example: bafyreie4qcl3wczb4cw5hrfyycikhjyh6oljdis3ewqrk5boaav3sbwqya type: string icon: - example: http://127.0.0.1:31006/image/bafybeieptz5hvcy6txplcvphjbbh5yjc2zqhmihs3owkh5oab4ezauzqay?width=100 + example: http://127.0.0.1:31006/image/bafybeieptz5hvcy6txplcvphjbbh5yjc2zqhmihs3owkh5oab4ezauzqay type: string id: example: bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1 @@ -907,7 +923,44 @@ paths: $ref: '#/definitions/util.ServerError' summary: List types tags: - - objects + - types + /spaces/{space_id}/types/{type_id}: + get: + consumes: + - application/json + parameters: + - description: Space ID + in: path + name: space_id + required: true + type: string + - description: Type ID + in: path + name: type_id + required: true + type: string + produces: + - application/json + responses: + "200": + description: The requested type + schema: + $ref: '#/definitions/object.TypeResponse' + "401": + description: Unauthorized + schema: + $ref: '#/definitions/util.UnauthorizedError' + "404": + description: Resource not found + schema: + $ref: '#/definitions/util.NotFoundError' + "500": + description: Internal server error + schema: + $ref: '#/definitions/util.ServerError' + summary: Get type + tags: + - types /spaces/{space_id}/types/{type_id}/templates: get: consumes: @@ -952,7 +1005,49 @@ paths: $ref: '#/definitions/util.ServerError' summary: List templates tags: - - objects + - types + /spaces/{space_id}/types/{type_id}/templates/{template_id}: + get: + consumes: + - application/json + parameters: + - description: Space ID + in: path + name: space_id + required: true + type: string + - description: Type ID + in: path + name: type_id + required: true + type: string + - description: Template ID + in: path + name: template_id + required: true + type: string + produces: + - application/json + responses: + "200": + description: The requested template + schema: + $ref: '#/definitions/object.TemplateResponse' + "401": + description: Unauthorized + schema: + $ref: '#/definitions/util.UnauthorizedError' + "404": + description: Resource not found + schema: + $ref: '#/definitions/util.NotFoundError' + "500": + description: Internal server error + schema: + $ref: '#/definitions/util.ServerError' + summary: Get template + tags: + - types securityDefinitions: BasicAuth: type: basic diff --git a/core/api/internal/object/handler.go b/core/api/internal/object/handler.go index b7714fce6..671f25583 100644 --- a/core/api/internal/object/handler.go +++ b/core/api/internal/object/handler.go @@ -162,7 +162,7 @@ func CreateObjectHandler(s *ObjectService) gin.HandlerFunc { // GetTypesHandler retrieves a list of types in a space // // @Summary List types -// @Tags objects +// @Tags types // @Accept json // @Produce json // @Param space_id path string true "Space ID" @@ -193,10 +193,44 @@ func GetTypesHandler(s *ObjectService) gin.HandlerFunc { } } +// GetTypeHandler retrieves a type in a space +// +// @Summary Get type +// @Tags types +// @Accept json +// @Produce json +// @Param space_id path string true "Space ID" +// @Param type_id path string true "Type ID" +// @Success 200 {object} TypeResponse "The requested type" +// @Failure 401 {object} util.UnauthorizedError "Unauthorized" +// @Failure 404 {object} util.NotFoundError "Resource not found" +// @Failure 500 {object} util.ServerError "Internal server error" +// @Router /spaces/{space_id}/types/{type_id} [get] +func GetTypeHandler(s *ObjectService) gin.HandlerFunc { + return func(c *gin.Context) { + spaceId := c.Param("space_id") + typeId := c.Param("type_id") + + object, err := s.GetType(c.Request.Context(), spaceId, typeId) + code := util.MapErrorCode(err, + util.ErrToCode(ErrTypeNotFound, http.StatusNotFound), + util.ErrToCode(ErrFailedRetrieveType, http.StatusInternalServerError), + ) + + if code != http.StatusOK { + apiErr := util.CodeToAPIError(code, err.Error()) + c.JSON(code, apiErr) + return + } + + c.JSON(http.StatusOK, TypeResponse{Type: object}) + } +} + // GetTemplatesHandler retrieves a list of templates for a type in a space // // @Summary List templates -// @Tags objects +// @Tags types // @Accept json // @Produce json // @Param space_id path string true "Space ID" @@ -231,3 +265,39 @@ func GetTemplatesHandler(s *ObjectService) gin.HandlerFunc { pagination.RespondWithPagination(c, http.StatusOK, templates, total, offset, limit, hasMore) } } + +// GetTemplateHandler retrieves a template for a type in a space +// +// @Summary Get template +// @Tags types +// @Accept json +// @Produce json +// @Param space_id path string true "Space ID" +// @Param type_id path string true "Type ID" +// @Param template_id path string true "Template ID" +// @Success 200 {object} TemplateResponse "The requested template" +// @Failure 401 {object} util.UnauthorizedError "Unauthorized" +// @Failure 404 {object} util.NotFoundError "Resource not found" +// @Failure 500 {object} util.ServerError "Internal server error" +// @Router /spaces/{space_id}/types/{type_id}/templates/{template_id} [get] +func GetTemplateHandler(s *ObjectService) gin.HandlerFunc { + return func(c *gin.Context) { + spaceId := c.Param("space_id") + typeId := c.Param("type_id") + templateId := c.Param("template_id") + + object, err := s.GetTemplate(c.Request.Context(), spaceId, typeId, templateId) + code := util.MapErrorCode(err, + util.ErrToCode(ErrTemplateNotFound, http.StatusNotFound), + util.ErrToCode(ErrFailedRetrieveTemplate, http.StatusInternalServerError), + ) + + if code != http.StatusOK { + apiErr := util.CodeToAPIError(code, err.Error()) + c.JSON(code, apiErr) + return + } + + c.JSON(http.StatusOK, TemplateResponse{Template: object}) + } +} diff --git a/core/api/internal/object/model.go b/core/api/internal/object/model.go index b70b73148..67a2d68d6 100644 --- a/core/api/internal/object/model.go +++ b/core/api/internal/object/model.go @@ -69,6 +69,10 @@ type Tag struct { Color string `json:"color" example:"yellow"` } +type TypeResponse struct { + Type Type `json:"type"` +} + type Type struct { Type string `json:"type" example:"type"` Id string `json:"id" example:"bafyreigyb6l5szohs32ts26ku2j42yd65e6hqy2u3gtzgdwqv6hzftsetu"` @@ -78,6 +82,10 @@ type Type struct { RecommendedLayout string `json:"recommended_layout" example:"todo"` } +type TemplateResponse struct { + Template Template `json:"template"` +} + type Template struct { Type string `json:"type" example:"template"` Id string `json:"id" example:"bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5uutge"` diff --git a/core/api/internal/object/service.go b/core/api/internal/object/service.go index 6e8ecb7a5..70935c154 100644 --- a/core/api/internal/object/service.go +++ b/core/api/internal/object/service.go @@ -18,20 +18,26 @@ import ( ) var ( - ErrObjectNotFound = errors.New("object not found") - ErrFailedRetrieveObject = errors.New("failed to retrieve object") - ErrFailedRetrieveObjects = errors.New("failed to retrieve list of objects") - ErrFailedDeleteObject = errors.New("failed to delete object") - ErrFailedCreateObject = errors.New("failed to create object") - ErrInputMissingSource = errors.New("source is missing for bookmark") - ErrFailedSetRelationFeatured = errors.New("failed to set relation featured") - ErrFailedFetchBookmark = errors.New("failed to fetch bookmark") - ErrFailedPasteBody = errors.New("failed to paste body") + // objects + ErrObjectNotFound = errors.New("object not found") + ErrFailedRetrieveObject = errors.New("failed to retrieve object") + ErrFailedRetrieveObjects = errors.New("failed to retrieve list of objects") + ErrFailedDeleteObject = errors.New("failed to delete object") + ErrFailedCreateObject = errors.New("failed to create object") + ErrInputMissingSource = errors.New("source is missing for bookmark") + ErrFailedSetRelationFeatured = errors.New("failed to set relation featured") + ErrFailedFetchBookmark = errors.New("failed to fetch bookmark") + ErrFailedPasteBody = errors.New("failed to paste body") + + // types ErrFailedRetrieveTypes = errors.New("failed to retrieve types") + ErrTypeNotFound = errors.New("type not found") + ErrFailedRetrieveType = errors.New("failed to retrieve type") ErrFailedRetrieveTemplateType = errors.New("failed to retrieve template type") ErrTemplateTypeNotFound = errors.New("template type not found") ErrFailedRetrieveTemplate = errors.New("failed to retrieve template") ErrFailedRetrieveTemplates = errors.New("failed to retrieve templates") + ErrTemplateNotFound = errors.New("template not found") ) type Service interface { @@ -40,7 +46,9 @@ type Service interface { DeleteObject(ctx context.Context, spaceId string, objectId string) (Object, error) CreateObject(ctx context.Context, spaceId string, request CreateObjectRequest) (Object, error) ListTypes(ctx context.Context, spaceId string, offset int, limit int) ([]Type, int, bool, error) + GetType(ctx context.Context, spaceId string, typeId string) (Type, error) ListTemplates(ctx context.Context, spaceId string, typeId string, offset int, limit int) ([]Template, int, bool, error) + GetTemplate(ctx context.Context, spaceId string, typeId string, templateId string) (Template, error) } type ObjectService struct { @@ -303,6 +311,31 @@ func (s *ObjectService) ListTypes(ctx context.Context, spaceId string, offset in return types, total, hasMore, nil } +// GetType returns a single type by its ID in a specific space. +func (s *ObjectService) GetType(ctx context.Context, spaceId string, typeId string) (Type, error) { + resp := s.mw.ObjectShow(ctx, &pb.RpcObjectShowRequest{ + SpaceId: spaceId, + ObjectId: typeId, + }) + + if resp.Error.Code == pb.RpcObjectShowResponseError_NOT_FOUND { + return Type{}, ErrTypeNotFound + } + + if resp.Error.Code != pb.RpcObjectShowResponseError_NULL { + return Type{}, ErrFailedRetrieveType + } + + return Type{ + Type: "type", + Id: typeId, + UniqueKey: resp.ObjectView.Details[0].Details.Fields[bundle.RelationKeyUniqueKey.String()].GetStringValue(), + Name: resp.ObjectView.Details[0].Details.Fields[bundle.RelationKeyName.String()].GetStringValue(), + Icon: resp.ObjectView.Details[0].Details.Fields[bundle.RelationKeyIconEmoji.String()].GetStringValue(), + RecommendedLayout: model.ObjectTypeLayout_name[int32(resp.ObjectView.Details[0].Details.Fields[bundle.RelationKeyRecommendedLayout.String()].GetNumberValue())], + }, nil +} + // ListTemplates returns a paginated list of templates in a specific space. func (s *ObjectService) ListTemplates(ctx context.Context, spaceId string, typeId string, offset int, limit int) (templates []Template, total int, hasMore bool, err error) { // First, determine the type ID of "ot-template" in the space @@ -377,6 +410,29 @@ func (s *ObjectService) ListTemplates(ctx context.Context, spaceId string, typeI return templates, total, hasMore, nil } +// GetTemplate returns a single template by its ID in a specific space. +func (s *ObjectService) GetTemplate(ctx context.Context, spaceId string, typeId string, templateId string) (Template, error) { + resp := s.mw.ObjectShow(ctx, &pb.RpcObjectShowRequest{ + SpaceId: spaceId, + ObjectId: templateId, + }) + + if resp.Error.Code == pb.RpcObjectShowResponseError_NOT_FOUND { + return Template{}, ErrTemplateNotFound + } + + if resp.Error.Code != pb.RpcObjectShowResponseError_NULL { + return Template{}, ErrFailedRetrieveTemplate + } + + return Template{ + Type: "template", + Id: templateId, + Name: resp.ObjectView.Details[0].Details.Fields[bundle.RelationKeyName.String()].GetStringValue(), + Icon: resp.ObjectView.Details[0].Details.Fields[bundle.RelationKeyIconEmoji.String()].GetStringValue(), + }, nil +} + // GetDetails returns the list of details from the ObjectShowResponse. func (s *ObjectService) GetDetails(resp *pb.RpcObjectShowResponse) []Detail { creator := resp.ObjectView.Details[0].Details.Fields[bundle.RelationKeyCreator.String()].GetStringValue() diff --git a/core/api/server/router.go b/core/api/server/router.go index 1728be74c..e33206a32 100644 --- a/core/api/server/router.go +++ b/core/api/server/router.go @@ -7,6 +7,8 @@ import ( swaggerFiles "github.com/swaggo/files" ginSwagger "github.com/swaggo/gin-swagger" + _ "github.com/anyproto/anytype-heart/core/api/docs" + "github.com/anyproto/anytype-heart/core/anytype/account" "github.com/anyproto/anytype-heart/core/api/internal/auth" "github.com/anyproto/anytype-heart/core/api/internal/export" @@ -68,8 +70,6 @@ func (s *Server) NewRouter(accountService account.Service, mw service.ClientComm v1.GET("/spaces/:space_id/objects", object.GetObjectsHandler(s.objectService)) v1.GET("/spaces/:space_id/objects/:object_id", object.GetObjectHandler(s.objectService)) v1.DELETE("/spaces/:space_id/objects/:object_id", s.rateLimit(maxWriteRequestsPerSecond), object.DeleteObjectHandler(s.objectService)) - v1.GET("/spaces/:space_id/types", object.GetTypesHandler(s.objectService)) - v1.GET("/spaces/:space_id/types/:type_id/templates", object.GetTemplatesHandler(s.objectService)) v1.POST("/spaces/:space_id/objects", s.rateLimit(maxWriteRequestsPerSecond), object.CreateObjectHandler(s.objectService)) // Search @@ -80,6 +80,12 @@ func (s *Server) NewRouter(accountService account.Service, mw service.ClientComm v1.GET("/spaces", space.GetSpacesHandler(s.spaceService)) v1.GET("/spaces/:space_id/members", space.GetMembersHandler(s.spaceService)) v1.POST("/spaces", s.rateLimit(maxWriteRequestsPerSecond), space.CreateSpaceHandler(s.spaceService)) + + // Type + v1.GET("/spaces/:space_id/types", object.GetTypesHandler(s.objectService)) + v1.GET("/spaces/:space_id/types/:type_id", object.GetTypeHandler(s.objectService)) + v1.GET("/spaces/:space_id/types/:type_id/templates", object.GetTemplatesHandler(s.objectService)) + v1.GET("/spaces/:space_id/types/:type_id/templates/:template_id", object.GetTemplateHandler(s.objectService)) } return router diff --git a/core/api/service.go b/core/api/service.go index 25c55bcdd..d758d7b7a 100644 --- a/core/api/service.go +++ b/core/api/service.go @@ -66,7 +66,6 @@ func (s *apiService) Name() (name string) { func (s *apiService) Init(a *app.App) (err error) { s.listenAddr = a.MustComponent(config.CName).(*config.Config).JsonApiListenAddr s.accountService = a.MustComponent(account.CName).(account.Service) - return nil } @@ -75,6 +74,10 @@ func (s *apiService) Run(ctx context.Context) (err error) { return nil } +func (s *apiService) Close(ctx context.Context) (err error) { + return s.shutdown(ctx) +} + func (s *apiService) runServer() { s.lock.Lock() defer s.lock.Unlock() @@ -105,10 +108,10 @@ func (s *apiService) shutdown(ctx context.Context) (err error) { } s.lock.Lock() defer s.lock.Unlock() + // we don't want graceful shutdown here and block tha app close shutdownCtx, cancel := context.WithTimeout(ctx, time.Millisecond) defer cancel() - if err := s.httpSrv.Shutdown(shutdownCtx); err != nil { return err } @@ -116,10 +119,6 @@ func (s *apiService) shutdown(ctx context.Context) (err error) { return nil } -func (s *apiService) Close(ctx context.Context) (err error) { - return s.shutdown(ctx) -} - func (s *apiService) ReassignAddress(ctx context.Context, listenAddr string) (err error) { err = s.shutdown(ctx) if err != nil { From 945b02f553493ff07a23ce01105ed2aab55a007b Mon Sep 17 00:00:00 2001 From: Jannis Metrikat <120120832+jmetrikat@users.noreply.github.com> Date: Mon, 27 Jan 2025 19:02:23 +0100 Subject: [PATCH 177/195] GO-4459: Fix model examples and enums --- core/api/internal/search/model.go | 4 ++-- core/api/internal/space/model.go | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/core/api/internal/search/model.go b/core/api/internal/search/model.go index a192e5a7b..ca64946eb 100644 --- a/core/api/internal/search/model.go +++ b/core/api/internal/search/model.go @@ -7,6 +7,6 @@ type SearchRequest struct { } type SortOptions struct { - Direction string `json:"direction"` // "asc" or "desc" - Timestamp string `json:"timestamp"` // "created_date", "last_modified_date" or "last_opened_date" + Direction string `json:"direction" enums:"asc|desc" default:"desc"` + Timestamp string `json:"timestamp" enums:"created_date|last_modified_date|last_opened_date" default:"last_modified_date"` } diff --git a/core/api/internal/space/model.go b/core/api/internal/space/model.go index 78ef51e45..a0747a6f1 100644 --- a/core/api/internal/space/model.go +++ b/core/api/internal/space/model.go @@ -12,7 +12,7 @@ type Space struct { Type string `json:"type" example:"space"` Id string `json:"id" example:"bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1"` Name string `json:"name" example:"Space Name"` - Icon string `json:"icon" example:"http://127.0.0.1:31006/image/bafybeieptz5hvcy6txplcvphjbbh5yjc2zqhmihs3owkh5oab4ezauzqay?width=100"` + Icon string `json:"icon" example:"http://127.0.0.1:31006/image/bafybeieptz5hvcy6txplcvphjbbh5yjc2zqhmihs3owkh5oab4ezauzqay"` HomeObjectId string `json:"home_object_id" example:"bafyreie4qcl3wczb4cw5hrfyycikhjyh6oljdis3ewqrk5boaav3sbwqya"` ArchiveObjectId string `json:"archive_object_id" example:"bafyreialsgoyflf3etjm3parzurivyaukzivwortf32b4twnlwpwocsrri"` ProfileObjectId string `json:"profile_object_id" example:"bafyreiaxhwreshjqwndpwtdsu4mtihaqhhmlygqnyqpfyfwlqfq3rm3gw4"` @@ -37,5 +37,5 @@ type Member struct { Icon string `json:"icon" example:"http://127.0.0.1:31006/image/bafybeieptz5hvcy6txplcvphjbbh5yjc2zqhmihs3owkh5oab4ezauzqay?width=100"` Identity string `json:"identity" example:"AAjEaEwPF4nkEh7AWkqEnzcQ8HziGB4ETjiTpvRCQvWnSMDZ"` GlobalName string `json:"global_name" example:"john.any"` - Role string `json:"role" enum:"Reader,Writer,Owner,NoPermission" example:"Owner"` + Role string `json:"role" enums:"Reader|Writer|Owner|NoPermission" example:"Owner"` } From 09fda23ca9bda392a6524e40226eb9403c4c6c84 Mon Sep 17 00:00:00 2001 From: Jannis Metrikat <120120832+jmetrikat@users.noreply.github.com> Date: Mon, 27 Jan 2025 19:23:46 +0100 Subject: [PATCH 178/195] GO-4459: Drop object_type in favor of type for objects --- core/api/docs/docs.go | 6 +---- core/api/docs/swagger.json | 6 +---- core/api/docs/swagger.yaml | 5 +--- core/api/internal/object/model.go | 21 ++++++++--------- core/api/internal/object/service.go | 21 ++++++++--------- core/api/internal/object/service_test.go | 29 ++++++++++++------------ 6 files changed, 38 insertions(+), 50 deletions(-) diff --git a/core/api/docs/docs.go b/core/api/docs/docs.go index d68a733bf..3811ad663 100644 --- a/core/api/docs/docs.go +++ b/core/api/docs/docs.go @@ -1113,10 +1113,6 @@ const docTemplate = `{ "type": "string", "example": "Object Name" }, - "object_type": { - "type": "string", - "example": "Page" - }, "root_id": { "type": "string" }, @@ -1130,7 +1126,7 @@ const docTemplate = `{ }, "type": { "type": "string", - "example": "object" + "example": "Page" } } }, diff --git a/core/api/docs/swagger.json b/core/api/docs/swagger.json index 68411e15b..ccc5d7989 100644 --- a/core/api/docs/swagger.json +++ b/core/api/docs/swagger.json @@ -1107,10 +1107,6 @@ "type": "string", "example": "Object Name" }, - "object_type": { - "type": "string", - "example": "Page" - }, "root_id": { "type": "string" }, @@ -1124,7 +1120,7 @@ }, "type": { "type": "string", - "example": "object" + "example": "Page" } } }, diff --git a/core/api/docs/swagger.yaml b/core/api/docs/swagger.yaml index 08e017e99..a2a326120 100644 --- a/core/api/docs/swagger.yaml +++ b/core/api/docs/swagger.yaml @@ -109,9 +109,6 @@ definitions: name: example: Object Name type: string - object_type: - example: Page - type: string root_id: type: string snippet: @@ -121,7 +118,7 @@ definitions: example: bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1 type: string type: - example: object + example: Page type: string type: object object.ObjectResponse: diff --git a/core/api/internal/object/model.go b/core/api/internal/object/model.go index 67a2d68d6..5f7defb3a 100644 --- a/core/api/internal/object/model.go +++ b/core/api/internal/object/model.go @@ -15,17 +15,16 @@ type ObjectResponse struct { } type Object struct { - Type string `json:"type" example:"object"` - Id string `json:"id" example:"bafyreie6n5l5nkbjal37su54cha4coy7qzuhrnajluzv5qd5jvtsrxkequ"` - Name string `json:"name" example:"Object Name"` - Icon string `json:"icon" example:"📄"` - Snippet string `json:"snippet" example:"The beginning of the object body..."` - Layout string `json:"layout" example:"basic"` - ObjectType string `json:"object_type" example:"Page"` - SpaceId string `json:"space_id" example:"bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1"` - RootId string `json:"root_id"` - Blocks []Block `json:"blocks"` - Details []Detail `json:"details"` + Type string `json:"type" example:"Page"` + Id string `json:"id" example:"bafyreie6n5l5nkbjal37su54cha4coy7qzuhrnajluzv5qd5jvtsrxkequ"` + Name string `json:"name" example:"Object Name"` + Icon string `json:"icon" example:"📄"` + Snippet string `json:"snippet" example:"The beginning of the object body..."` + Layout string `json:"layout" example:"basic"` + SpaceId string `json:"space_id" example:"bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1"` + RootId string `json:"root_id"` + Blocks []Block `json:"blocks"` + Details []Detail `json:"details"` } type Block struct { diff --git a/core/api/internal/object/service.go b/core/api/internal/object/service.go index 70935c154..59f14ee2d 100644 --- a/core/api/internal/object/service.go +++ b/core/api/internal/object/service.go @@ -132,17 +132,16 @@ func (s *ObjectService) GetObject(ctx context.Context, spaceId string, objectId } object := Object{ - Type: "object", - Id: resp.ObjectView.Details[0].Details.Fields[bundle.RelationKeyId.String()].GetStringValue(), - Name: resp.ObjectView.Details[0].Details.Fields[bundle.RelationKeyName.String()].GetStringValue(), - Icon: icon, - Snippet: resp.ObjectView.Details[0].Details.Fields[bundle.RelationKeySnippet.String()].GetStringValue(), - Layout: model.ObjectTypeLayout_name[int32(resp.ObjectView.Details[0].Details.Fields[bundle.RelationKeyLayout.String()].GetNumberValue())], - ObjectType: objectTypeName, - SpaceId: resp.ObjectView.Details[0].Details.Fields[bundle.RelationKeySpaceId.String()].GetStringValue(), - RootId: resp.ObjectView.RootId, - Blocks: s.GetBlocks(resp), - Details: s.GetDetails(resp), + Type: objectTypeName, + Id: resp.ObjectView.Details[0].Details.Fields[bundle.RelationKeyId.String()].GetStringValue(), + Name: resp.ObjectView.Details[0].Details.Fields[bundle.RelationKeyName.String()].GetStringValue(), + Icon: icon, + Snippet: resp.ObjectView.Details[0].Details.Fields[bundle.RelationKeySnippet.String()].GetStringValue(), + Layout: model.ObjectTypeLayout_name[int32(resp.ObjectView.Details[0].Details.Fields[bundle.RelationKeyLayout.String()].GetNumberValue())], + SpaceId: resp.ObjectView.Details[0].Details.Fields[bundle.RelationKeySpaceId.String()].GetStringValue(), + RootId: resp.ObjectView.RootId, + Blocks: s.GetBlocks(resp), + Details: s.GetDetails(resp), } return object, nil diff --git a/core/api/internal/object/service_test.go b/core/api/internal/object/service_test.go index f79791803..d7c485775 100644 --- a/core/api/internal/object/service_test.go +++ b/core/api/internal/object/service_test.go @@ -23,6 +23,7 @@ const ( gatewayUrl = "http://localhost:31006" mockedSpaceId = "mocked-space-id" mockedObjectId = "mocked-object-id" + mockedObjectType = "mocked-object-type" mockedNewObjectId = "mocked-new-object-id" mockedObjectName = "mocked-object-name" mockedObjectSnippet = "mocked-object-snippet" @@ -90,7 +91,7 @@ func TestObjectService_ListObjects(t *testing.T) { bundle.RelationKeyId.String(): pbtypes.String(mockedObjectId), bundle.RelationKeyName.String(): pbtypes.String(mockedObjectName), bundle.RelationKeySnippet.String(): pbtypes.String(mockedObjectSnippet), - bundle.RelationKeyIconEmoji.String(): pbtypes.String("📄"), + bundle.RelationKeyIconEmoji.String(): pbtypes.String(mockedObjectIcon), bundle.RelationKeyType.String(): pbtypes.String(mockedObjectTypeUniqueKey), bundle.RelationKeyLayout.String(): pbtypes.Float64(float64(model.ObjectType_basic)), }, @@ -113,7 +114,7 @@ func TestObjectService_ListObjects(t *testing.T) { bundle.RelationKeyId.String(): pbtypes.String(mockedObjectId), bundle.RelationKeyName.String(): pbtypes.String(mockedObjectName), bundle.RelationKeySnippet.String(): pbtypes.String(mockedObjectSnippet), - bundle.RelationKeyIconEmoji.String(): pbtypes.String("📄"), + bundle.RelationKeyIconEmoji.String(): pbtypes.String(mockedObjectIcon), bundle.RelationKeyType.String(): pbtypes.String(mockedObjectTypeUniqueKey), bundle.RelationKeyCreatedDate.String(): pbtypes.Float64(888888), bundle.RelationKeyLastModifiedDate.String(): pbtypes.Float64(999999), @@ -142,7 +143,7 @@ func TestObjectService_ListObjects(t *testing.T) { Records: []*types.Struct{ { Fields: map[string]*types.Value{ - bundle.RelationKeyName.String(): pbtypes.String("Page"), + bundle.RelationKeyName.String(): pbtypes.String(mockedObjectType), }, }, }, @@ -182,11 +183,11 @@ func TestObjectService_ListObjects(t *testing.T) { // then require.NoError(t, err) require.Len(t, objects, 1) + require.Equal(t, mockedObjectType, objects[0].Type) require.Equal(t, mockedObjectId, objects[0].Id) require.Equal(t, mockedObjectName, objects[0].Name) require.Equal(t, mockedObjectSnippet, objects[0].Snippet) - require.Equal(t, "📄", objects[0].Icon) - require.Equal(t, "Page", objects[0].ObjectType) + require.Equal(t, mockedObjectIcon, objects[0].Icon) require.Equal(t, 6, len(objects[0].Details)) for _, detail := range objects[0].Details { @@ -283,7 +284,7 @@ func TestObjectService_GetObject(t *testing.T) { Records: []*types.Struct{ { Fields: map[string]*types.Value{ - bundle.RelationKeyName.String(): pbtypes.String("Page"), + bundle.RelationKeyName.String(): pbtypes.String(mockedObjectType), }, }, }, @@ -321,11 +322,11 @@ func TestObjectService_GetObject(t *testing.T) { // then require.NoError(t, err) + require.Equal(t, mockedObjectType, object.Type) require.Equal(t, mockedObjectId, object.Id) require.Equal(t, mockedObjectName, object.Name) require.Equal(t, mockedObjectSnippet, object.Snippet) require.Equal(t, mockedObjectName, object.Icon) - require.Equal(t, "Page", object.ObjectType) require.Equal(t, 6, len(object.Details)) for _, detail := range object.Details { @@ -376,7 +377,7 @@ func TestObjectService_CreateObject(t *testing.T) { Details: &types.Struct{ Fields: map[string]*types.Value{ bundle.RelationKeyName.String(): pbtypes.String(mockedObjectName), - bundle.RelationKeyIconEmoji.String(): pbtypes.String("🆕"), + bundle.RelationKeyIconEmoji.String(): pbtypes.String(mockedObjectIcon), bundle.RelationKeyDescription.String(): pbtypes.String(""), bundle.RelationKeySource.String(): pbtypes.String(""), bundle.RelationKeyOrigin.String(): pbtypes.Int64(int64(model.ObjectOrigin_api)), @@ -392,7 +393,7 @@ func TestObjectService_CreateObject(t *testing.T) { Fields: map[string]*types.Value{ bundle.RelationKeyId.String(): pbtypes.String(mockedNewObjectId), bundle.RelationKeyName.String(): pbtypes.String(mockedObjectName), - bundle.RelationKeyIconEmoji.String(): pbtypes.String("🆕"), + bundle.RelationKeyIconEmoji.String(): pbtypes.String(mockedObjectIcon), bundle.RelationKeySpaceId.String(): pbtypes.String(mockedSpaceId), }, }, @@ -414,7 +415,7 @@ func TestObjectService_CreateObject(t *testing.T) { bundle.RelationKeyName.String(): pbtypes.String(mockedObjectName), bundle.RelationKeyLayout.String(): pbtypes.Float64(float64(model.ObjectType_basic)), bundle.RelationKeyType.String(): pbtypes.String(mockedObjectTypeUniqueKey), - bundle.RelationKeyIconEmoji.String(): pbtypes.String("🆕"), + bundle.RelationKeyIconEmoji.String(): pbtypes.String(mockedObjectIcon), bundle.RelationKeySpaceId.String(): pbtypes.String(mockedSpaceId), }, }, @@ -440,7 +441,7 @@ func TestObjectService_CreateObject(t *testing.T) { Records: []*types.Struct{ { Fields: map[string]*types.Value{ - bundle.RelationKeyName.String(): pbtypes.String("Page"), + bundle.RelationKeyName.String(): pbtypes.String(mockedObjectType), }, }, }, @@ -476,7 +477,7 @@ func TestObjectService_CreateObject(t *testing.T) { // when object, err := fx.CreateObject(ctx, mockedSpaceId, CreateObjectRequest{ Name: mockedObjectName, - Icon: "🆕", + Icon: mockedObjectIcon, // TODO: use actual values TemplateId: "", ObjectTypeUniqueKey: mockedObjectTypeUniqueKey, @@ -484,10 +485,10 @@ func TestObjectService_CreateObject(t *testing.T) { // then require.NoError(t, err) + require.Equal(t, mockedObjectType, object.Type) require.Equal(t, mockedNewObjectId, object.Id) require.Equal(t, mockedObjectName, object.Name) - require.Equal(t, "Page", object.ObjectType) - require.Equal(t, "🆕", object.Icon) + require.Equal(t, mockedObjectIcon, object.Icon) require.Equal(t, mockedSpaceId, object.SpaceId) }) From af65379507d4f04268342a4c7c519618aed53d92 Mon Sep 17 00:00:00 2001 From: Jannis Metrikat <120120832+jmetrikat@users.noreply.github.com> Date: Mon, 27 Jan 2025 20:01:29 +0100 Subject: [PATCH 179/195] GO-4459: Add swag examples --- core/api/docs/docs.go | 65 ++++++++++++++++++++++--------- core/api/docs/swagger.json | 65 ++++++++++++++++++++++--------- core/api/docs/swagger.yaml | 26 ++++++++++++- core/api/internal/object/model.go | 38 +++++++++--------- 4 files changed, 135 insertions(+), 59 deletions(-) diff --git a/core/api/docs/docs.go b/core/api/docs/docs.go index 3811ad663..e699c5686 100644 --- a/core/api/docs/docs.go +++ b/core/api/docs/docs.go @@ -986,29 +986,38 @@ const docTemplate = `{ "properties": { "align": { "type": "string", - "example": "AlignLeft" + "enum": [ + "AlignLeft|AlignCenter|AlignRight|AlignJustify" + ] }, "background_color": { - "type": "string" + "type": "string", + "example": "red" }, "children_ids": { "type": "array", "items": { "type": "string" - } + }, + "example": [ + "[\"6797ce8ecda913cde14b02dc\"]" + ] }, "file": { "$ref": "#/definitions/object.File" }, "id": { - "type": "string" + "type": "string", + "example": "64394517de52ad5acb89c66c" }, "text": { "$ref": "#/definitions/object.Text" }, "vertical_align": { "type": "string", - "example": "VerticalAlignTop" + "enum": [ + "VerticalAlignTop|VerticalAlignMiddle|VerticalAlignBottom" + ] } } }, @@ -1016,25 +1025,32 @@ const docTemplate = `{ "type": "object", "properties": { "body": { - "type": "string" + "type": "string", + "example": "Object Body" }, "description": { - "type": "string" + "type": "string", + "example": "Object Description" }, "icon": { - "type": "string" + "type": "string", + "example": "📄" }, "name": { - "type": "string" + "type": "string", + "example": "Object Name" }, "object_type_unique_key": { - "type": "string" + "type": "string", + "example": "ot-page" }, "source": { - "type": "string" + "type": "string", + "example": "https://source.com" }, "template_id": { - "type": "string" + "type": "string", + "example": "bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5uutge" } } }, @@ -1046,7 +1062,10 @@ const docTemplate = `{ "additionalProperties": true }, "id": { - "type": "string" + "type": "string", + "enum": [ + "last_modified_date|last_modified_by|created_date|created_by|last_opened_date|tags" + ] } } }, @@ -1114,7 +1133,8 @@ const docTemplate = `{ "example": "Object Name" }, "root_id": { - "type": "string" + "type": "string", + "example": "bafyreicypzj6uvu54664ucv3hmbsd5cmdy2dv4fwua26sciq74khzpyn4u" }, "snippet": { "type": "string", @@ -1171,19 +1191,26 @@ const docTemplate = `{ "type": "object", "properties": { "checked": { - "type": "boolean" + "type": "boolean", + "example": true }, "color": { - "type": "string" + "type": "string", + "example": "red" }, "icon": { - "type": "string" + "type": "string", + "example": "📄" }, "style": { - "type": "string" + "type": "string", + "enum": [ + "Paragraph|Header1|Header2|Header3|Header4|Quote|Code|Title|Checkbox|Marked|Numbered|Toggle|Description|Callout" + ] }, "text": { - "type": "string" + "type": "string", + "example": "Some text" } } }, diff --git a/core/api/docs/swagger.json b/core/api/docs/swagger.json index ccc5d7989..cb8af525d 100644 --- a/core/api/docs/swagger.json +++ b/core/api/docs/swagger.json @@ -980,29 +980,38 @@ "properties": { "align": { "type": "string", - "example": "AlignLeft" + "enum": [ + "AlignLeft|AlignCenter|AlignRight|AlignJustify" + ] }, "background_color": { - "type": "string" + "type": "string", + "example": "red" }, "children_ids": { "type": "array", "items": { "type": "string" - } + }, + "example": [ + "[\"6797ce8ecda913cde14b02dc\"]" + ] }, "file": { "$ref": "#/definitions/object.File" }, "id": { - "type": "string" + "type": "string", + "example": "64394517de52ad5acb89c66c" }, "text": { "$ref": "#/definitions/object.Text" }, "vertical_align": { "type": "string", - "example": "VerticalAlignTop" + "enum": [ + "VerticalAlignTop|VerticalAlignMiddle|VerticalAlignBottom" + ] } } }, @@ -1010,25 +1019,32 @@ "type": "object", "properties": { "body": { - "type": "string" + "type": "string", + "example": "Object Body" }, "description": { - "type": "string" + "type": "string", + "example": "Object Description" }, "icon": { - "type": "string" + "type": "string", + "example": "📄" }, "name": { - "type": "string" + "type": "string", + "example": "Object Name" }, "object_type_unique_key": { - "type": "string" + "type": "string", + "example": "ot-page" }, "source": { - "type": "string" + "type": "string", + "example": "https://source.com" }, "template_id": { - "type": "string" + "type": "string", + "example": "bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5uutge" } } }, @@ -1040,7 +1056,10 @@ "additionalProperties": true }, "id": { - "type": "string" + "type": "string", + "enum": [ + "last_modified_date|last_modified_by|created_date|created_by|last_opened_date|tags" + ] } } }, @@ -1108,7 +1127,8 @@ "example": "Object Name" }, "root_id": { - "type": "string" + "type": "string", + "example": "bafyreicypzj6uvu54664ucv3hmbsd5cmdy2dv4fwua26sciq74khzpyn4u" }, "snippet": { "type": "string", @@ -1165,19 +1185,26 @@ "type": "object", "properties": { "checked": { - "type": "boolean" + "type": "boolean", + "example": true }, "color": { - "type": "string" + "type": "string", + "example": "red" }, "icon": { - "type": "string" + "type": "string", + "example": "📄" }, "style": { - "type": "string" + "type": "string", + "enum": [ + "Paragraph|Header1|Header2|Header3|Header4|Quote|Code|Title|Checkbox|Marked|Numbered|Toggle|Description|Callout" + ] }, "text": { - "type": "string" + "type": "string", + "example": "Some text" } } }, diff --git a/core/api/docs/swagger.yaml b/core/api/docs/swagger.yaml index a2a326120..87622549b 100644 --- a/core/api/docs/swagger.yaml +++ b/core/api/docs/swagger.yaml @@ -23,39 +23,52 @@ definitions: object.Block: properties: align: - example: AlignLeft + enum: + - AlignLeft|AlignCenter|AlignRight|AlignJustify type: string background_color: + example: red type: string children_ids: + example: + - '["6797ce8ecda913cde14b02dc"]' items: type: string type: array file: $ref: '#/definitions/object.File' id: + example: 64394517de52ad5acb89c66c type: string text: $ref: '#/definitions/object.Text' vertical_align: - example: VerticalAlignTop + enum: + - VerticalAlignTop|VerticalAlignMiddle|VerticalAlignBottom type: string type: object object.CreateObjectRequest: properties: body: + example: Object Body type: string description: + example: Object Description type: string icon: + example: "\U0001F4C4" type: string name: + example: Object Name type: string object_type_unique_key: + example: ot-page type: string source: + example: https://source.com type: string template_id: + example: bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5uutge type: string type: object object.Detail: @@ -64,6 +77,8 @@ definitions: additionalProperties: true type: object id: + enum: + - last_modified_date|last_modified_by|created_date|created_by|last_opened_date|tags type: string type: object object.File: @@ -110,6 +125,7 @@ definitions: example: Object Name type: string root_id: + example: bafyreicypzj6uvu54664ucv3hmbsd5cmdy2dv4fwua26sciq74khzpyn4u type: string snippet: example: The beginning of the object body... @@ -149,14 +165,20 @@ definitions: object.Text: properties: checked: + example: true type: boolean color: + example: red type: string icon: + example: "\U0001F4C4" type: string style: + enum: + - Paragraph|Header1|Header2|Header3|Header4|Quote|Code|Title|Checkbox|Marked|Numbered|Toggle|Description|Callout type: string text: + example: Some text type: string type: object object.Type: diff --git a/core/api/internal/object/model.go b/core/api/internal/object/model.go index 5f7defb3a..9bec897c9 100644 --- a/core/api/internal/object/model.go +++ b/core/api/internal/object/model.go @@ -1,13 +1,13 @@ package object type CreateObjectRequest struct { - Name string `json:"name"` - Icon string `json:"icon"` - Description string `json:"description"` - Body string `json:"body"` - Source string `json:"source"` - TemplateId string `json:"template_id"` - ObjectTypeUniqueKey string `json:"object_type_unique_key"` + Name string `json:"name" example:"Object Name"` + Icon string `json:"icon" example:"📄"` + Description string `json:"description" example:"Object Description"` + Body string `json:"body" example:"Object Body"` + Source string `json:"source" example:"https://source.com"` + TemplateId string `json:"template_id" example:"bafyreictrp3obmnf6dwejy5o4p7bderaaia4bdg2psxbfzf44yya5uutge"` + ObjectTypeUniqueKey string `json:"object_type_unique_key" example:"ot-page"` } type ObjectResponse struct { @@ -22,27 +22,27 @@ type Object struct { Snippet string `json:"snippet" example:"The beginning of the object body..."` Layout string `json:"layout" example:"basic"` SpaceId string `json:"space_id" example:"bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1"` - RootId string `json:"root_id"` + RootId string `json:"root_id" example:"bafyreicypzj6uvu54664ucv3hmbsd5cmdy2dv4fwua26sciq74khzpyn4u"` Blocks []Block `json:"blocks"` Details []Detail `json:"details"` } type Block struct { - Id string `json:"id"` - ChildrenIds []string `json:"children_ids"` - BackgroundColor string `json:"background_color"` - Align string `json:"align" example:"AlignLeft"` - VerticalAlign string `json:"vertical_align" example:"VerticalAlignTop"` + Id string `json:"id" example:"64394517de52ad5acb89c66c"` + ChildrenIds []string `json:"children_ids" example:"[\"6797ce8ecda913cde14b02dc\"]"` + BackgroundColor string `json:"background_color" example:"red"` + Align string `json:"align" enums:"AlignLeft|AlignCenter|AlignRight|AlignJustify"` + VerticalAlign string `json:"vertical_align" enums:"VerticalAlignTop|VerticalAlignMiddle|VerticalAlignBottom"` Text *Text `json:"text,omitempty"` File *File `json:"file,omitempty"` } type Text struct { - Text string `json:"text"` - Style string `json:"style"` - Checked bool `json:"checked"` - Color string `json:"color"` - Icon string `json:"icon"` + Text string `json:"text" example:"Some text"` + Style string `json:"style" enums:"Paragraph|Header1|Header2|Header3|Header4|Quote|Code|Title|Checkbox|Marked|Numbered|Toggle|Description|Callout"` + Checked bool `json:"checked" example:"true"` + Color string `json:"color" example:"red"` + Icon string `json:"icon" example:"📄"` } type File struct { @@ -58,7 +58,7 @@ type File struct { } type Detail struct { - Id string `json:"id"` + Id string `json:"id" enums:"last_modified_date|last_modified_by|created_date|created_by|last_opened_date|tags"` Details map[string]interface{} `json:"details"` } From f0855422a83069f0fafb95fe5d65bae3ca4a9228 Mon Sep 17 00:00:00 2001 From: Jannis Metrikat <120120832+jmetrikat@users.noreply.github.com> Date: Mon, 27 Jan 2025 20:01:37 +0100 Subject: [PATCH 180/195] GO-4459: Fixes --- core/api/internal/search/service_test.go | 13 +++++++------ core/api/service.go | 2 +- 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/core/api/internal/search/service_test.go b/core/api/internal/search/service_test.go index eda651224..8cf6b94cf 100644 --- a/core/api/internal/search/service_test.go +++ b/core/api/internal/search/service_test.go @@ -18,10 +18,11 @@ import ( ) const ( - offset = 0 - limit = 100 - techSpaceId = "tech-space-id" - gatewayUrl = "http://localhost:31006" + offset = 0 + limit = 100 + techSpaceId = "tech-space-id" + gatewayUrl = "http://localhost:31006" + mockedObjectTypeName = "mocked-object-type-name" ) type fixture struct { @@ -278,7 +279,7 @@ func TestSearchService_Search(t *testing.T) { Records: []*types.Struct{ { Fields: map[string]*types.Value{ - bundle.RelationKeyName.String(): pbtypes.String("object-type-name"), + bundle.RelationKeyName.String(): pbtypes.String(mockedObjectTypeName), }, }, }, @@ -327,7 +328,7 @@ func TestSearchService_Search(t *testing.T) { // then require.NoError(t, err) require.Len(t, objects, 1) - require.Equal(t, "object", objects[0].Type) + require.Equal(t, mockedObjectTypeName, objects[0].Type) require.Equal(t, "space-1", objects[0].SpaceId) require.Equal(t, "Global Object", objects[0].Name) require.Equal(t, "obj-global-1", objects[0].Id) diff --git a/core/api/service.go b/core/api/service.go index d758d7b7a..6027337b6 100644 --- a/core/api/service.go +++ b/core/api/service.go @@ -109,7 +109,7 @@ func (s *apiService) shutdown(ctx context.Context) (err error) { s.lock.Lock() defer s.lock.Unlock() - // we don't want graceful shutdown here and block tha app close + // we don't want graceful shutdown here and block the app close shutdownCtx, cancel := context.WithTimeout(ctx, time.Millisecond) defer cancel() if err := s.httpSrv.Shutdown(shutdownCtx); err != nil { From 8be4356e2837adfe8d04cc440aec5cb5cd0a9e26 Mon Sep 17 00:00:00 2001 From: Jannis Metrikat <120120832+jmetrikat@users.noreply.github.com> Date: Mon, 27 Jan 2025 20:10:15 +0100 Subject: [PATCH 181/195] GO-4459: Update swagger examples --- core/api/docs/docs.go | 14 +++++++++----- core/api/docs/swagger.json | 14 +++++++++----- core/api/docs/swagger.yaml | 6 +++++- core/api/internal/object/model.go | 10 +++++----- 4 files changed, 28 insertions(+), 16 deletions(-) diff --git a/core/api/docs/docs.go b/core/api/docs/docs.go index e699c5686..2264a46c9 100644 --- a/core/api/docs/docs.go +++ b/core/api/docs/docs.go @@ -988,7 +988,8 @@ const docTemplate = `{ "type": "string", "enum": [ "AlignLeft|AlignCenter|AlignRight|AlignJustify" - ] + ], + "example": "AlignLeft" }, "background_color": { "type": "string", @@ -1000,7 +1001,7 @@ const docTemplate = `{ "type": "string" }, "example": [ - "[\"6797ce8ecda913cde14b02dc\"]" + "['6797ce8ecda913cde14b02dc']" ] }, "file": { @@ -1017,7 +1018,8 @@ const docTemplate = `{ "type": "string", "enum": [ "VerticalAlignTop|VerticalAlignMiddle|VerticalAlignBottom" - ] + ], + "example": "VerticalAlignTop" } } }, @@ -1065,7 +1067,8 @@ const docTemplate = `{ "type": "string", "enum": [ "last_modified_date|last_modified_by|created_date|created_by|last_opened_date|tags" - ] + ], + "example": "last_modified_date" } } }, @@ -1206,7 +1209,8 @@ const docTemplate = `{ "type": "string", "enum": [ "Paragraph|Header1|Header2|Header3|Header4|Quote|Code|Title|Checkbox|Marked|Numbered|Toggle|Description|Callout" - ] + ], + "example": "Paragraph" }, "text": { "type": "string", diff --git a/core/api/docs/swagger.json b/core/api/docs/swagger.json index cb8af525d..1d99fd5f6 100644 --- a/core/api/docs/swagger.json +++ b/core/api/docs/swagger.json @@ -982,7 +982,8 @@ "type": "string", "enum": [ "AlignLeft|AlignCenter|AlignRight|AlignJustify" - ] + ], + "example": "AlignLeft" }, "background_color": { "type": "string", @@ -994,7 +995,7 @@ "type": "string" }, "example": [ - "[\"6797ce8ecda913cde14b02dc\"]" + "['6797ce8ecda913cde14b02dc']" ] }, "file": { @@ -1011,7 +1012,8 @@ "type": "string", "enum": [ "VerticalAlignTop|VerticalAlignMiddle|VerticalAlignBottom" - ] + ], + "example": "VerticalAlignTop" } } }, @@ -1059,7 +1061,8 @@ "type": "string", "enum": [ "last_modified_date|last_modified_by|created_date|created_by|last_opened_date|tags" - ] + ], + "example": "last_modified_date" } } }, @@ -1200,7 +1203,8 @@ "type": "string", "enum": [ "Paragraph|Header1|Header2|Header3|Header4|Quote|Code|Title|Checkbox|Marked|Numbered|Toggle|Description|Callout" - ] + ], + "example": "Paragraph" }, "text": { "type": "string", diff --git a/core/api/docs/swagger.yaml b/core/api/docs/swagger.yaml index 87622549b..b91cdd6f7 100644 --- a/core/api/docs/swagger.yaml +++ b/core/api/docs/swagger.yaml @@ -25,13 +25,14 @@ definitions: align: enum: - AlignLeft|AlignCenter|AlignRight|AlignJustify + example: AlignLeft type: string background_color: example: red type: string children_ids: example: - - '["6797ce8ecda913cde14b02dc"]' + - '[''6797ce8ecda913cde14b02dc'']' items: type: string type: array @@ -45,6 +46,7 @@ definitions: vertical_align: enum: - VerticalAlignTop|VerticalAlignMiddle|VerticalAlignBottom + example: VerticalAlignTop type: string type: object object.CreateObjectRequest: @@ -79,6 +81,7 @@ definitions: id: enum: - last_modified_date|last_modified_by|created_date|created_by|last_opened_date|tags + example: last_modified_date type: string type: object object.File: @@ -176,6 +179,7 @@ definitions: style: enum: - Paragraph|Header1|Header2|Header3|Header4|Quote|Code|Title|Checkbox|Marked|Numbered|Toggle|Description|Callout + example: Paragraph type: string text: example: Some text diff --git a/core/api/internal/object/model.go b/core/api/internal/object/model.go index 9bec897c9..21a680370 100644 --- a/core/api/internal/object/model.go +++ b/core/api/internal/object/model.go @@ -29,17 +29,17 @@ type Object struct { type Block struct { Id string `json:"id" example:"64394517de52ad5acb89c66c"` - ChildrenIds []string `json:"children_ids" example:"[\"6797ce8ecda913cde14b02dc\"]"` + ChildrenIds []string `json:"children_ids" example:"['6797ce8ecda913cde14b02dc']"` BackgroundColor string `json:"background_color" example:"red"` - Align string `json:"align" enums:"AlignLeft|AlignCenter|AlignRight|AlignJustify"` - VerticalAlign string `json:"vertical_align" enums:"VerticalAlignTop|VerticalAlignMiddle|VerticalAlignBottom"` + Align string `json:"align" enums:"AlignLeft|AlignCenter|AlignRight|AlignJustify" example:"AlignLeft"` + VerticalAlign string `json:"vertical_align" enums:"VerticalAlignTop|VerticalAlignMiddle|VerticalAlignBottom" example:"VerticalAlignTop"` Text *Text `json:"text,omitempty"` File *File `json:"file,omitempty"` } type Text struct { Text string `json:"text" example:"Some text"` - Style string `json:"style" enums:"Paragraph|Header1|Header2|Header3|Header4|Quote|Code|Title|Checkbox|Marked|Numbered|Toggle|Description|Callout"` + Style string `json:"style" enums:"Paragraph|Header1|Header2|Header3|Header4|Quote|Code|Title|Checkbox|Marked|Numbered|Toggle|Description|Callout" example:"Paragraph"` Checked bool `json:"checked" example:"true"` Color string `json:"color" example:"red"` Icon string `json:"icon" example:"📄"` @@ -58,7 +58,7 @@ type File struct { } type Detail struct { - Id string `json:"id" enums:"last_modified_date|last_modified_by|created_date|created_by|last_opened_date|tags"` + Id string `json:"id" enums:"last_modified_date|last_modified_by|created_date|created_by|last_opened_date|tags" example:"last_modified_date"` Details map[string]interface{} `json:"details"` } From b708a12ca2eb81c08e3edb3bf907c10f372cef1a Mon Sep 17 00:00:00 2001 From: Grigory Efimov Date: Mon, 27 Jan 2025 16:38:27 -0300 Subject: [PATCH 182/195] added nightly build ci (#2054) --- .github/workflows/cla.yml | 2 +- .github/workflows/nightly.yml | 241 ++++++++++++++++++++++++++++++++++ Makefile | 51 ++++--- 3 files changed, 267 insertions(+), 27 deletions(-) create mode 100644 .github/workflows/nightly.yml diff --git a/.github/workflows/cla.yml b/.github/workflows/cla.yml index 96e9acc64..c0d8bbf5a 100644 --- a/.github/workflows/cla.yml +++ b/.github/workflows/cla.yml @@ -10,7 +10,7 @@ permissions: contents: write pull-requests: write statuses: write - + jobs: cla-check: uses: anyproto/open/.github/workflows/cla.yml@main diff --git a/.github/workflows/nightly.yml b/.github/workflows/nightly.yml new file mode 100644 index 000000000..61ceb4908 --- /dev/null +++ b/.github/workflows/nightly.yml @@ -0,0 +1,241 @@ +name: Nightly Builds + +on: + push: + branches: + - 'nightly*' + workflow_dispatch: + inputs: + channel: + description: electron.builder channel + required: true + default: alpha + type: choice + options: + - alpha + - beta +# schedule: +# - cron: '0 0 * * *' # every day at midnight +# filters: +# branches: +# include: +# - 'nightly-ci-test' + +permissions: + actions: 'write' + packages: 'write' + contents: 'write' + +jobs: + build: + runs-on: 'macos-14' + steps: + - name: Install Go + uses: actions/setup-go@v4 + with: + go-version: 1.23.2 + check-latest: true + + - name: Setup GO + run: | + go version + echo GOPATH=$(go env GOPATH) >> $GITHUB_ENV + echo GOBIN=$(go env GOPATH)/bin >> $GITHUB_ENV + echo $(go env GOPATH)/bin >> $GITHUB_PATH + + - name: Install brew and node deps + run: | + curl https://raw.githubusercontent.com/Homebrew/homebrew-core/31b24d65a7210ea0a5689d5ad00dd8d1bf5211db/Formula/protobuf.rb --output protobuf.rb + curl https://raw.githubusercontent.com/Homebrew/homebrew-core/d600b1f7119f6e6a4e97fb83233b313b0468b7e4/Formula/s/swift-protobuf.rb --output swift-protobuf.rb + HOMEBREW_NO_INSTALLED_DEPENDENTS_CHECK=1 HOMEBREW_NO_AUTO_UPDATE=1 HOMEBREW_NO_INSTALL_CLEANUP=1 brew install ./protobuf.rb + HOMEBREW_NO_INSTALLED_DEPENDENTS_CHECK=1 HOMEBREW_NO_AUTO_UPDATE=1 HOMEBREW_NO_INSTALL_CLEANUP=1 brew install --ignore-dependencies ./swift-protobuf.rb + HOMEBREW_NO_INSTALLED_DEPENDENTS_CHECK=1 HOMEBREW_NO_AUTO_UPDATE=1 HOMEBREW_NO_INSTALL_CLEANUP=1 brew install mingw-w64 + HOMEBREW_NO_INSTALLED_DEPENDENTS_CHECK=1 HOMEBREW_NO_AUTO_UPDATE=1 HOMEBREW_NO_INSTALL_CLEANUP=1 brew install grpcurl + HOMEBREW_NO_INSTALLED_DEPENDENTS_CHECK=1 HOMEBREW_NO_AUTO_UPDATE=1 HOMEBREW_NO_INSTALL_CLEANUP=1 brew tap messense/macos-cross-toolchains && brew install x86_64-unknown-linux-musl && brew install aarch64-unknown-linux-musl + npm i -g node-gyp + + - name: Checkout + uses: actions/checkout@v3 + + - name: Nightly mode env settings + shell: bash + run: | + # choice channel name {{ + if [[ -z "${{ github.event.inputs.channel }}" ]]; then + # choice default value for channel from ref name + if echo "${{ github.ref_name }}" | grep -q "beta"; then + CHANNEL="beta" + else + CHANNEL="alpha" + fi + else + CHANNEL="${{github.event.inputs.channel}}" + fi + echo "CHANNEL=$CHANNEL" >> $GITHUB_ENV + # }} + # choice s3 bucket for publishing {{ + if [[ "$CHANNEL" == "beta" ]]; then + S3_BUCKET="${{secrets.NIGHTLY_AWS_S3_BUCKET_BETA}}" + else + S3_BUCKET="${{secrets.NIGHTLY_AWS_S3_BUCKET}}" + fi + echo "S3_BUCKET=$S3_BUCKET" >> $GITHUB_ENV + # }} + + - name: Set env vars + env: + UNSPLASH_KEY: ${{ secrets.UNSPLASH_KEY }} + INHOUSE_KEY: ${{ secrets.INHOUSE_KEY }} + run: | + GIT_SUMMARY=$(git describe --tags --always) + echo "FLAGS=-X github.com/anyproto/anytype-heart/util/vcs.GitSummary=${GIT_SUMMARY} -X github.com/anyproto/anytype-heart/metrics.DefaultInHouseKey=${INHOUSE_KEY} -X github.com/anyproto/anytype-heart/util/unsplash.DefaultToken=${UNSPLASH_KEY}" >> $GITHUB_ENV + + VERSION="nightly" + echo "${{ secrets.STAGING_NODE_CONF }}" > ./core/anytype/config/nodes/custom.yml + echo BUILD_TAG_NETWORK=envnetworkcustom >> $GITHUB_ENV + + echo VERSION=${VERSION} >> $GITHUB_ENV + echo GOPRIVATE=github.com/anyproto >> $GITHUB_ENV + echo $(pwd)/deps >> $GITHUB_PATH + git config --global url."https://${{ secrets.ANYTYPE_PAT }}@github.com/".insteadOf "https://github.com/" + + - name: Go mod download + run: go mod download + + - name: install protoc + run: make setup-protoc + + - name: setup go + run: | + make setup-go + make setup-gomobile + which gomobile + + - name: Cross-compile library mac/win/linux + run: | + echo $FLAGS + mkdir -p .release + echo $SDKROOT + GOOS="darwin" CGO_CFLAGS="-mmacosx-version-min=11" MACOSX_DEPLOYMENT_TARGET=11.0 GOARCH="amd64" CGO_ENABLED="1" go build -tags="$BUILD_TAG_NETWORK nographviz nowatchdog nosigar nomutexdeadlockdetector" -ldflags="$FLAGS" -o darwin-amd64 github.com/anyproto/anytype-heart/cmd/grpcserver + export SDKROOT=$(xcrun --sdk macosx --show-sdk-path) + echo $SDKROOT + GOOS="darwin" CGO_CFLAGS="-mmacosx-version-min=11" MACOSX_DEPLOYMENT_TARGET=11.0 GOARCH="arm64" CGO_ENABLED="1" go build -tags="$BUILD_TAG_NETWORK nographviz nowatchdog nosigar nomutexdeadlockdetector" -ldflags="$FLAGS" -o darwin-arm64 github.com/anyproto/anytype-heart/cmd/grpcserver + GOOS="windows" GOARCH="amd64" CGO_ENABLED="1" CC="x86_64-w64-mingw32-gcc" CXX="x86_64-w64-mingw32-g++" go build -tags="$BUILD_TAG_NETWORK nographviz nowatchdog nosigar nomutexdeadlockdetector noheic" -ldflags="$FLAGS -linkmode external -extldflags=-static" -o windows-amd64 github.com/anyproto/anytype-heart/cmd/grpcserver + GOOS="linux" GOARCH="amd64" CGO_ENABLED="1" CC="x86_64-linux-musl-gcc" go build -tags="$BUILD_TAG_NETWORK nographviz nowatchdog nosigar nomutexdeadlockdetector noheic" -ldflags="$FLAGS -linkmode external -extldflags '-static -Wl,-z stack-size=1000000'" -o linux-amd64 github.com/anyproto/anytype-heart/cmd/grpcserver + GOOS="linux" GOARCH="arm64" CGO_ENABLED="1" CC="aarch64-linux-musl-gcc" go build -tags="$BUILD_TAG_NETWORK nographviz nowatchdog nosigar nomutexdeadlockdetector noheic" -ldflags="$FLAGS -linkmode external" -o linux-arm64 github.com/anyproto/anytype-heart/cmd/grpcserver + ls -lha . + + - name: Make JS protos + run: | + make protos-js + mv dist/js/pb protobuf + mkdir -p protobuf/protos + cp pb/protos/*.proto ./protobuf/protos + cp pb/protos/service/*.proto ./protobuf/protos + cp pkg/lib/pb/model/protos/*.proto ./protobuf/protos + + - name: Add system relations/types jsons + run: | + mkdir -p json/ + cp pkg/lib/bundle/systemRelations.json ./json + cp pkg/lib/bundle/systemTypes.json ./json + cp pkg/lib/bundle/internalRelations.json ./json + cp pkg/lib/bundle/internalTypes.json ./json + + - name: Pack server win + run: | + declare -a arr=("windows-amd64") + for i in "${arr[@]}"; do + OSARCH=${i%.*} + cp ./${i}* ./grpc-server.exe + zip -r js_${VERSION}_${OSARCH}.zip grpc-server.exe protobuf json + mv js_${VERSION}_${OSARCH}.zip .release/ + done + + - name: Pack server unix + run: | + declare -a arr=("darwin-amd64" "darwin-arm64" "linux-amd64") + for i in "${arr[@]}"; do + OSARCH=${i%.*} + cp ./${i}* ./grpc-server + tar -czf js_${VERSION}_${OSARCH}.tar.gz grpc-server protobuf json + mv js_${VERSION}_${OSARCH}.tar.gz .release/ + done + + - name: Make swift protos + run: | + mkdir -p .release + make protos-swift + rm -rf protobuf + mv dist/ios/protobuf protobuf + mkdir -p protobuf/protos + cp pb/protos/*.proto ./protobuf/protos + cp pb/protos/service/*.proto ./protobuf/protos + cp pkg/lib/pb/model/protos/*.proto ./protobuf/protos + + - name: Add system relations/types jsons + run: | + mkdir -p json/ + cp pkg/lib/bundle/systemRelations.json ./json + cp pkg/lib/bundle/relations.json ./json + cp pkg/lib/bundle/systemTypes.json ./json + cp pkg/lib/bundle/internalRelations.json ./json + cp pkg/lib/bundle/internalTypes.json ./json + + - name: Compile ios lib + run: | + go install github.com/vektra/mockery/v2@v2.47.0 + go install go.uber.org/mock/mockgen@v0.5.0 + make test-deps + gomobile bind -tags "$BUILD_TAG_NETWORK nogrpcserver gomobile nowatchdog nosigar nomutexdeadlockdetector timetzdata rasterizesvg" -ldflags "$FLAGS" -v -target=ios -o Lib.xcframework github.com/anyproto/anytype-heart/clientlibrary/service github.com/anyproto/anytype-heart/core || true + mkdir -p dist/ios/ && mv Lib.xcframework dist/ios/ + go run cmd/iosrepack/main.go + mv dist/ios/Lib.xcframework . + gtar --exclude ".*" -czvf ios_framework.tar.gz Lib.xcframework protobuf json + #gradle publish + mv ios_framework.tar.gz .release/ios_framework_${VERSION}.tar.gz + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + GITHUB_USER: ${{ github.actor }} + + - name: Make java protos + run: | + make protos-java + rm -rf protobuf + mv dist/android/pb protobuf + mkdir -p protobuf/protos + cp pb/protos/*.proto ./protobuf/protos + cp pb/protos/service/*.proto ./protobuf/protos + cp pkg/lib/pb/model/protos/*.proto ./protobuf/protos + + - name: Add system relations/types jsons + run: | + mkdir -p json/ + cp pkg/lib/bundle/systemRelations.json ./json + cp pkg/lib/bundle/systemTypes.json ./json + cp pkg/lib/bundle/internalRelations.json ./json + cp pkg/lib/bundle/internalTypes.json ./json + + - name: Compile android lib + run: | + gomobile bind -tags "$BUILD_TAG_NETWORK nogrpcserver gomobile nowatchdog nosigar nomutexdeadlockdetector timetzdata rasterizesvg" -ldflags "$FLAGS" -v -target=android -androidapi 26 -o lib.aar github.com/anyproto/anytype-heart/clientlibrary/service github.com/anyproto/anytype-heart/core || true + gtar --exclude ".*" -czvf android_lib_${VERSION}.tar.gz lib.aar protobuf json + mv android_lib_${VERSION}.tar.gz .release/ + + # upload release artifacts to s3 {{ + - name: Install AWS CLI + run: | + if ! which aws; then + brew install awscli + fi + aws --version + - name: Configure AWS credentials + uses: aws-actions/configure-aws-credentials@v2 + with: + aws-access-key-id: ${{ secrets.NIGHTLY_AWS_ACCESS_KEY_ID }} + aws-secret-access-key: ${{ secrets.NIGHTLY_AWS_SECRET_ACCESS_KEY }} + aws-region: ${{ secrets.NIGHTLY_AWS_REGION }} + - name: Upload build artifacts to S3 + run: | + aws s3 cp .release/ s3://${{ env.S3_BUCKET }}/mw/ --recursive --acl public-read + # }} diff --git a/Makefile b/Makefile index 7a8f3019f..cffe39487 100644 --- a/Makefile +++ b/Makefile @@ -10,13 +10,13 @@ export GOLANGCI_LINT_VERSION=1.58.1 export CGO_CFLAGS=-Wno-deprecated-non-prototype -Wno-unknown-warning-option -Wno-deprecated-declarations -Wno-xor-used-as-pow -Wno-single-bit-bitfield-constant-conversion ifndef $(GOPATH) - GOPATH=$(shell go env GOPATH) - export GOPATH +GOPATH=$(shell go env GOPATH) +export GOPATH endif ifndef $(GOROOT) - GOROOT=$(shell go env GOROOT) - export GOROOT +GOROOT=$(shell go env GOROOT) +export GOROOT endif DEPS_PATH := $(shell pwd)/deps @@ -38,14 +38,14 @@ ifdef ANYENV @exit 1; endif @if [ -z "$$ANY_SYNC_NETWORK" ]; then \ - echo "Using the default production Any Sync Network"; \ - elif [ ! -e "$$ANY_SYNC_NETWORK" ]; then \ - echo "Network configuration file not found at $$ANY_SYNC_NETWORK"; \ - exit 1; \ - else \ - echo "Using Any Sync Network configuration at $$ANY_SYNC_NETWORK"; \ - cp $$ANY_SYNC_NETWORK $(CUSTOM_NETWORK_FILE); \ - fi + echo "Using the default production Any Sync Network"; \ +elif [ ! -e "$$ANY_SYNC_NETWORK" ]; then \ + echo "Network configuration file not found at $$ANY_SYNC_NETWORK"; \ + exit 1; \ +else \ + echo "Using Any Sync Network configuration at $$ANY_SYNC_NETWORK"; \ + cp $$ANY_SYNC_NETWORK $(CUSTOM_NETWORK_FILE); \ +fi setup-go: setup-network-config check-tantivy-version @echo 'Setting up go modules...' @@ -102,7 +102,7 @@ build-js-addon: @cp dist/lib.a clientlibrary/jsaddon/lib.a @cp dist/lib.h clientlibrary/jsaddon/lib.h @cp clientlibrary/clib/bridge.h clientlibrary/jsaddon/bridge.h - # Electron's version. + # Electron's version. @export npm_config_target=12.0.4 @export npm_config_arch=x64 @export npm_config_target_arch=x64 @@ -197,7 +197,6 @@ setup-protoc-go: go build -o deps github.com/gogo/protobuf/protoc-gen-gogofast go build -o deps github.com/pseudomuto/protoc-gen-doc/cmd/protoc-gen-doc - setup-protoc-jsweb: @echo 'Installing grpc-web plugin...' @rm -rf deps/grpc-web @@ -346,17 +345,17 @@ OUTPUT_DIR := deps/libs SHA_FILE = tantivity_sha256.txt TANTIVY_LIBS := android-386.tar.gz \ - android-amd64.tar.gz \ - android-arm.tar.gz \ - android-arm64.tar.gz \ - darwin-amd64.tar.gz \ - darwin-arm64.tar.gz \ - ios-amd64.tar.gz \ - ios-arm64.tar.gz \ - ios-arm64-sim.tar.gz \ - linux-amd64-musl.tar.gz \ - linux-arm64-musl.tar.gz \ - windows-amd64.tar.gz + android-amd64.tar.gz \ + android-arm.tar.gz \ + android-arm64.tar.gz \ + darwin-amd64.tar.gz \ + darwin-arm64.tar.gz \ + ios-amd64.tar.gz \ + ios-arm64.tar.gz \ + ios-arm64-sim.tar.gz \ + linux-amd64-musl.tar.gz \ + linux-arm64-musl.tar.gz \ + windows-amd64.tar.gz define download_tantivy_lib curl -L -o $(OUTPUT_DIR)/$(1) https://github.com/$(REPO)/releases/download/$(TANTIVY_VERSION)/$(1) @@ -404,4 +403,4 @@ check-tantivy-version: $(eval OLD_VERSION := $(shell [ -f $(OUTPUT_DIR)/.verified ] && cat $(OUTPUT_DIR)/.verified || echo "")) @if [ "$(TANTIVY_VERSION)" != "$(OLD_VERSION)" ]; then \ $(MAKE) download-tantivy-all; \ - fi \ No newline at end of file + fi From 5ce3daef6e8c1a9993eae366cd5b2869a7f9c6c7 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 27 Jan 2025 20:39:11 +0100 Subject: [PATCH 183/195] Bump github.com/ipfs/boxo from 0.26.0 to 0.27.2 (#2037) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 24d874690..2232c6f0e 100644 --- a/go.mod +++ b/go.mod @@ -52,7 +52,7 @@ require ( github.com/hbagdi/go-unsplash v0.0.0-20230414214043-474fc02c9119 github.com/huandu/skiplist v1.2.1 github.com/improbable-eng/grpc-web v0.15.0 - github.com/ipfs/boxo v0.27.0 + github.com/ipfs/boxo v0.27.2 github.com/ipfs/go-block-format v0.2.0 github.com/ipfs/go-cid v0.5.0 github.com/ipfs/go-datastore v0.6.0 diff --git a/go.sum b/go.sum index e977dd88c..d7c9516ef 100644 --- a/go.sum +++ b/go.sum @@ -584,8 +584,8 @@ github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLf github.com/influxdata/influxdb1-client v0.0.0-20191209144304-8bf82d3c094d/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo= github.com/ipfs/bbloom v0.0.4 h1:Gi+8EGJ2y5qiD5FbsbpX/TMNcJw8gSqr7eyjHa4Fhvs= github.com/ipfs/bbloom v0.0.4/go.mod h1:cS9YprKXpoZ9lT0n/Mw/a6/aFV6DTjTLYHeA+gyqMG0= -github.com/ipfs/boxo v0.27.0 h1:8zu0zQrCXSUMn/0vnXy6oUppscoxstK7hQqiGFwUcjY= -github.com/ipfs/boxo v0.27.0/go.mod h1:qEIRrGNr0bitDedTCzyzBHxzNWqYmyuHgK8LG9Q83EM= +github.com/ipfs/boxo v0.27.2 h1:sGo4KdwBaMjdBjH08lqPJyt27Z4CO6sugne3ryX513s= +github.com/ipfs/boxo v0.27.2/go.mod h1:qEIRrGNr0bitDedTCzyzBHxzNWqYmyuHgK8LG9Q83EM= github.com/ipfs/go-bitfield v1.1.0 h1:fh7FIo8bSwaJEh6DdTWbCeZ1eqOaOkKFI74SCnsWbGA= github.com/ipfs/go-bitfield v1.1.0/go.mod h1:paqf1wjq/D2BBmzfTVFlJQ9IlFOZpg422HL0HqsGWHU= github.com/ipfs/go-block-format v0.2.0 h1:ZqrkxBA2ICbDRbK8KJs/u0O3dlp6gmAuuXUJNiW1Ycs= From 54bbeb160fc61e961e480a059ea5db8da2ede000 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 28 Jan 2025 12:36:01 +0100 Subject: [PATCH 184/195] Bump github.com/anyproto/any-store from 0.1.5 to 0.1.6 (#2055) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 2232c6f0e..d6574d880 100644 --- a/go.mod +++ b/go.mod @@ -7,7 +7,7 @@ require ( github.com/PuerkitoBio/goquery v1.10.1 github.com/VividCortex/ewma v1.2.0 github.com/adrium/goheif v0.0.0-20230113233934-ca402e77a786 - github.com/anyproto/any-store v0.1.5 + github.com/anyproto/any-store v0.1.6 github.com/anyproto/any-sync v0.5.26 github.com/anyproto/anytype-publish-server/publishclient v0.0.0-20241223184559-a5cacfe0950a github.com/anyproto/go-chash v0.1.0 diff --git a/go.sum b/go.sum index d7c9516ef..ad91aade9 100644 --- a/go.sum +++ b/go.sum @@ -82,8 +82,8 @@ github.com/alexbrainman/goissue34681 v0.0.0-20191006012335-3fc7a47baff5/go.mod h github.com/andybalholm/cascadia v1.3.1/go.mod h1:R4bJ1UQfqADjvDa4P6HZHLh/3OxWWEqc0Sk8XGwHqvA= github.com/andybalholm/cascadia v1.3.3 h1:AG2YHrzJIm4BZ19iwJ/DAua6Btl3IwJX+VI4kktS1LM= github.com/andybalholm/cascadia v1.3.3/go.mod h1:xNd9bqTn98Ln4DwST8/nG+H0yuB8Hmgu1YHNnWw0GeA= -github.com/anyproto/any-store v0.1.5 h1:AHOaFr9A+RhUc80MceUI9DL8vWqEW7AVB29lTqUlLL8= -github.com/anyproto/any-store v0.1.5/go.mod h1:nbyRoJYOlvSWU1xDOrmgPP96UeoTf4eYZ9k+qqLK9k8= +github.com/anyproto/any-store v0.1.6 h1:CmxIH2JhgHH2s7dnv1SNKAQ3spvX2amG/5RbrTZkLaQ= +github.com/anyproto/any-store v0.1.6/go.mod h1:nbyRoJYOlvSWU1xDOrmgPP96UeoTf4eYZ9k+qqLK9k8= github.com/anyproto/any-sync v0.5.26 h1:JWcR/RFGQ22CYWrdh2Ain6uEWNePtYHCLs+LXsm8hhU= github.com/anyproto/any-sync v0.5.26/go.mod h1:Ljftoz6/mCM/2wP2tK9H1/jtVAxfgqzYplBA4MbiUs0= github.com/anyproto/anytype-publish-server/publishclient v0.0.0-20241223184559-a5cacfe0950a h1:kSNyLHsZ40JxlRAglr85YXH2ik2LH3AH5Hd3JL42KGo= From 1000e3493cc499300fbcaeba42b22d3008785f6f Mon Sep 17 00:00:00 2001 From: AnastasiaShemyakinskaya Date: Tue, 28 Jan 2025 15:04:38 +0100 Subject: [PATCH 185/195] GO-4961: fix for backlinks Signed-off-by: AnastasiaShemyakinskaya --- core/block/export/export.go | 4 + core/block/export/export_test.go | 267 ++ .../object/objectlink/dependent_objects.go | 7 +- .../objectlink/dependent_objects_test.go | 27 +- core/publish/service.go | 19 +- docs/proto.md | 1 + pb/commands.pb.go | 2510 +++++++++-------- pb/protos/commands.proto | 1 + 8 files changed, 1589 insertions(+), 1247 deletions(-) diff --git a/core/block/export/export.go b/core/block/export/export.go index 3d1d51acc..0a4c6f799 100644 --- a/core/block/export/export.go +++ b/core/block/export/export.go @@ -162,6 +162,7 @@ type exportContext struct { path string linkStateFilters *state.Filters isLinkProcess bool + includeBackLinks bool *export } @@ -179,6 +180,7 @@ func newExportContext(e *export, req pb.RpcObjectListExportRequest) *exportConte reqIds: req.ObjectIds, zip: req.Zip, linkStateFilters: pbFiltersToState(req.LinksStateFilters), + includeBackLinks: req.IncludeBacklinks, export: e, } return ec @@ -197,6 +199,7 @@ func (e *exportContext) copy() *exportContext { export: e.export, isLinkProcess: e.isLinkProcess, linkStateFilters: e.linkStateFilters, + includeBackLinks: e.includeBackLinks, } } @@ -855,6 +858,7 @@ func (e *exportContext) addNestedObject(id string, nestedDocs map[string]*Doc) { Details: true, Collection: true, NoHiddenBundledRelations: true, + NoBackLinks: !e.includeBackLinks, }) return nil }) diff --git a/core/block/export/export_test.go b/core/block/export/export_test.go index 001ce203b..12e386422 100644 --- a/core/block/export/export_test.go +++ b/core/block/export/export_test.go @@ -543,6 +543,273 @@ func TestExport_Export(t *testing.T) { assert.Len(t, sn.GetSnapshot().GetData().GetRelationLinks(), 1) assert.Equal(t, bundle.RelationKeyCamera.String(), sn.GetSnapshot().GetData().GetRelationLinks()[0].Key) }) + t.Run("export with backlinks", func(t *testing.T) { + // given + storeFixture := objectstore.NewStoreFixture(t) + objectTypeId := "objectTypeId" + objectTypeUniqueKey, err := domain.NewUniqueKey(smartblock.SmartBlockTypeObjectType, objectTypeId) + assert.Nil(t, err) + objectId := "objectID" + link1 := "linkId" + + storeFixture.AddObjects(t, spaceId, []spaceindex.TestObject{ + { + bundle.RelationKeyId: domain.String(link1), + bundle.RelationKeyType: domain.String(objectTypeId), + bundle.RelationKeySpaceId: domain.String(spaceId), + }, + { + bundle.RelationKeyId: domain.String(objectId), + bundle.RelationKeyType: domain.String(objectTypeId), + bundle.RelationKeySpaceId: domain.String(spaceId), + bundle.RelationKeyBacklinks: domain.StringList([]string{link1}), + }, + { + bundle.RelationKeyId: domain.String(objectTypeId), + bundle.RelationKeyUniqueKey: domain.String(objectTypeUniqueKey.Marshal()), + bundle.RelationKeyLayout: domain.Int64(int64(model.ObjectType_objectType)), + bundle.RelationKeyRecommendedRelations: domain.StringList([]string{addr.MissingObject}), + bundle.RelationKeySpaceId: domain.String(spaceId), + bundle.RelationKeyType: domain.String(objectTypeId), + }, + }) + + objectGetter := mock_cache.NewMockObjectGetterComponent(t) + + smartBlockTest := smarttest.New(objectId) + doc := smartBlockTest.NewState().SetDetails(domain.NewDetailsFromMap(map[domain.RelationKey]domain.Value{ + bundle.RelationKeyId: domain.String(objectId), + bundle.RelationKeyType: domain.String(objectTypeId), + bundle.RelationKeyBacklinks: domain.StringList([]string{link1}), + })) + doc.AddRelationLinks(&model.RelationLink{ + Key: bundle.RelationKeyId.String(), + Format: model.RelationFormat_longtext, + }, &model.RelationLink{ + Key: bundle.RelationKeyType.String(), + Format: model.RelationFormat_longtext, + }, &model.RelationLink{ + Key: bundle.RelationKeyBacklinks.String(), + Format: model.RelationFormat_object, + }) + smartBlockTest.Doc = doc + + objectType := smarttest.New(objectTypeId) + objectTypeDoc := objectType.NewState().SetDetails(domain.NewDetailsFromMap(map[domain.RelationKey]domain.Value{ + bundle.RelationKeyId: domain.String(objectTypeId), + bundle.RelationKeyType: domain.String(objectTypeId), + })) + objectTypeDoc.AddRelationLinks(&model.RelationLink{ + Key: bundle.RelationKeyId.String(), + Format: model.RelationFormat_longtext, + }, &model.RelationLink{ + Key: bundle.RelationKeyType.String(), + Format: model.RelationFormat_longtext, + }) + objectType.Doc = objectTypeDoc + objectType.SetType(smartblock.SmartBlockTypeObjectType) + + linkObject := smarttest.New(link1) + linkObjectDoc := linkObject.NewState().SetDetails(domain.NewDetailsFromMap(map[domain.RelationKey]domain.Value{ + bundle.RelationKeyId: domain.String(link1), + bundle.RelationKeyType: domain.String(objectTypeId), + bundle.RelationKeySpaceId: domain.String(spaceId), + })) + linkObjectDoc.AddRelationLinks(&model.RelationLink{ + Key: bundle.RelationKeyId.String(), + Format: model.RelationFormat_longtext, + }, &model.RelationLink{ + Key: bundle.RelationKeyType.String(), + Format: model.RelationFormat_longtext, + }, &model.RelationLink{ + Key: bundle.RelationKeySpaceId.String(), + Format: model.RelationFormat_longtext, + }) + linkObject.Doc = linkObjectDoc + + objectGetter.EXPECT().GetObject(context.Background(), objectId).Return(smartBlockTest, nil).Times(4) + objectGetter.EXPECT().GetObject(context.Background(), objectTypeId).Return(objectType, nil) + objectGetter.EXPECT().GetObject(context.Background(), link1).Return(linkObject, nil) + + a := &app.App{} + mockSender := mock_event.NewMockSender(t) + mockSender.EXPECT().Broadcast(mock.Anything).Return() + a.Register(testutil.PrepareMock(context.Background(), a, mockSender)) + service := process.New() + err = service.Init(a) + assert.Nil(t, err) + + notifications := mock_notifications.NewMockNotifications(t) + notificationSend := make(chan struct{}) + notifications.EXPECT().CreateAndSend(mock.Anything).RunAndReturn(func(notification *model.Notification) error { + close(notificationSend) + return nil + }) + + provider := mock_typeprovider.NewMockSmartBlockTypeProvider(t) + provider.EXPECT().Type(spaceId, link1).Return(smartblock.SmartBlockTypePage, nil) + + e := &export{ + objectStore: storeFixture, + picker: objectGetter, + processService: service, + notificationService: notifications, + sbtProvider: provider, + } + + // when + path, success, err := e.Export(context.Background(), pb.RpcObjectListExportRequest{ + SpaceId: spaceId, + Path: t.TempDir(), + ObjectIds: []string{objectId}, + Format: model.Export_Protobuf, + Zip: true, + IncludeNested: true, + IncludeFiles: true, + IsJson: true, + IncludeBacklinks: true, + }) + + // then + <-notificationSend + assert.Nil(t, err) + assert.Equal(t, 3, success) + + reader, err := zip.OpenReader(path) + assert.Nil(t, err) + + assert.Len(t, reader.File, 3) + fileNames := make(map[string]bool, 3) + for _, file := range reader.File { + fileNames[file.Name] = true + } + + objectPath := filepath.Join(objectsDirectory, link1+".pb.json") + assert.True(t, fileNames[objectPath]) + }) + t.Run("export without backlinks", func(t *testing.T) { + // given + storeFixture := objectstore.NewStoreFixture(t) + objectTypeId := "objectTypeId" + objectTypeUniqueKey, err := domain.NewUniqueKey(smartblock.SmartBlockTypeObjectType, objectTypeId) + assert.Nil(t, err) + objectId := "objectID" + link1 := "linkId" + + storeFixture.AddObjects(t, spaceId, []spaceindex.TestObject{ + { + bundle.RelationKeyId: domain.String(link1), + bundle.RelationKeyType: domain.String(objectTypeId), + bundle.RelationKeySpaceId: domain.String(spaceId), + }, + { + bundle.RelationKeyId: domain.String(objectId), + bundle.RelationKeyType: domain.String(objectTypeId), + bundle.RelationKeySpaceId: domain.String(spaceId), + bundle.RelationKeyBacklinks: domain.StringList([]string{link1}), + }, + { + bundle.RelationKeyId: domain.String(objectTypeId), + bundle.RelationKeyUniqueKey: domain.String(objectTypeUniqueKey.Marshal()), + bundle.RelationKeyLayout: domain.Int64(int64(model.ObjectType_objectType)), + bundle.RelationKeyRecommendedRelations: domain.StringList([]string{addr.MissingObject}), + bundle.RelationKeySpaceId: domain.String(spaceId), + bundle.RelationKeyType: domain.String(objectTypeId), + }, + }) + + objectGetter := mock_cache.NewMockObjectGetterComponent(t) + + smartBlockTest := smarttest.New(objectId) + doc := smartBlockTest.NewState().SetDetails(domain.NewDetailsFromMap(map[domain.RelationKey]domain.Value{ + bundle.RelationKeyId: domain.String(objectId), + bundle.RelationKeyType: domain.String(objectTypeId), + bundle.RelationKeyBacklinks: domain.StringList([]string{link1}), + })) + doc.AddRelationLinks(&model.RelationLink{ + Key: bundle.RelationKeyId.String(), + Format: model.RelationFormat_longtext, + }, &model.RelationLink{ + Key: bundle.RelationKeyType.String(), + Format: model.RelationFormat_longtext, + }, &model.RelationLink{ + Key: bundle.RelationKeyBacklinks.String(), + Format: model.RelationFormat_object, + }) + smartBlockTest.Doc = doc + + objectType := smarttest.New(objectTypeId) + objectTypeDoc := objectType.NewState().SetDetails(domain.NewDetailsFromMap(map[domain.RelationKey]domain.Value{ + bundle.RelationKeyId: domain.String(objectTypeId), + bundle.RelationKeyType: domain.String(objectTypeId), + })) + objectTypeDoc.AddRelationLinks(&model.RelationLink{ + Key: bundle.RelationKeyId.String(), + Format: model.RelationFormat_longtext, + }, &model.RelationLink{ + Key: bundle.RelationKeyType.String(), + Format: model.RelationFormat_longtext, + }) + objectType.Doc = objectTypeDoc + objectType.SetType(smartblock.SmartBlockTypeObjectType) + + objectGetter.EXPECT().GetObject(context.Background(), objectId).Return(smartBlockTest, nil).Times(4) + objectGetter.EXPECT().GetObject(context.Background(), objectTypeId).Return(objectType, nil) + + a := &app.App{} + mockSender := mock_event.NewMockSender(t) + mockSender.EXPECT().Broadcast(mock.Anything).Return() + a.Register(testutil.PrepareMock(context.Background(), a, mockSender)) + service := process.New() + err = service.Init(a) + assert.Nil(t, err) + + notifications := mock_notifications.NewMockNotifications(t) + notificationSend := make(chan struct{}) + notifications.EXPECT().CreateAndSend(mock.Anything).RunAndReturn(func(notification *model.Notification) error { + close(notificationSend) + return nil + }) + + provider := mock_typeprovider.NewMockSmartBlockTypeProvider(t) + + e := &export{ + objectStore: storeFixture, + picker: objectGetter, + processService: service, + notificationService: notifications, + sbtProvider: provider, + } + + // when + path, success, err := e.Export(context.Background(), pb.RpcObjectListExportRequest{ + SpaceId: spaceId, + Path: t.TempDir(), + ObjectIds: []string{objectId}, + Format: model.Export_Protobuf, + Zip: true, + IncludeNested: true, + IncludeFiles: true, + IsJson: true, + IncludeBacklinks: false, + }) + + // then + <-notificationSend + assert.Nil(t, err) + assert.Equal(t, 2, success) + + reader, err := zip.OpenReader(path) + assert.Nil(t, err) + + fileNames := make(map[string]bool, 2) + for _, file := range reader.File { + fileNames[file.Name] = true + } + + objectPath := filepath.Join(objectsDirectory, link1+".pb.json") + assert.False(t, fileNames[objectPath]) + }) } func Test_docsForExport(t *testing.T) { diff --git a/core/block/object/objectlink/dependent_objects.go b/core/block/object/objectlink/dependent_objects.go index 6f8aa92b3..aa69171c1 100644 --- a/core/block/object/objectlink/dependent_objects.go +++ b/core/block/object/objectlink/dependent_objects.go @@ -48,7 +48,8 @@ type Flags struct { NoSystemRelations, NoHiddenBundledRelations, NoImages, - RoundDateIdsToDay bool + RoundDateIdsToDay, + NoBackLinks bool } func DependentObjectIDs(s *state.State, converter KeyToIDConverter, flags Flags) (ids []string) { @@ -182,6 +183,10 @@ func collectIdsFromDetail(rel *model.RelationLink, det *domain.Details, flags Fl } } + if rel.Key == bundle.RelationKeyBacklinks.String() && flags.NoBackLinks { + return + } + // handle corner cases first for specific formats if rel.Format == model.RelationFormat_date && !lo.Contains(bundle.LocalAndDerivedRelationKeys, domain.RelationKey(rel.Key)) { diff --git a/core/block/object/objectlink/dependent_objects_test.go b/core/block/object/objectlink/dependent_objects_test.go index c2d648a3d..6b97068be 100644 --- a/core/block/object/objectlink/dependent_objects_test.go +++ b/core/block/object/objectlink/dependent_objects_test.go @@ -224,9 +224,26 @@ func TestState_DepSmartIdsLinksAndRelations(t *testing.T) { assert.Len(t, objectIDs, 15) // 11 links + 4 relations }) - t.Run("date object ids are rounded to day", func(t *testing.T) { - objectIDs := DependentObjectIDs(stateWithLinks, converter, Flags{Blocks: true, RoundDateIdsToDay: true}) - assert.Len(t, objectIDs, 10) + t.Run("save backlinks", func(t *testing.T) { + st := stateWithLinks.Copy() + st.SetDetail(bundle.RelationKeyBacklinks, domain.StringList([]string{"link1"})) + st.AddRelationLinks(&model.RelationLink{ + Key: bundle.RelationKeyBacklinks.String(), + Format: model.RelationFormat_object, + }) + objectIDs := DependentObjectIDs(st, converter, Flags{Details: true}) + assert.Len(t, objectIDs, 1) + assert.Contains(t, objectIDs, "link1") + }) + t.Run("skip backlinks", func(t *testing.T) { + st := stateWithLinks.Copy() + st.SetDetail(bundle.RelationKeyBacklinks, domain.StringList([]string{"link1"})) + st.AddRelationLinks(&model.RelationLink{ + Key: bundle.RelationKeyBacklinks.String(), + Format: model.RelationFormat_object, + }) + objectIDs := DependentObjectIDs(st, converter, Flags{Details: true, NoBackLinks: true}) + assert.Len(t, objectIDs, 0) }) } @@ -322,6 +339,10 @@ func TestState_DepSmartIdsLinksDetailsAndRelations(t *testing.T) { objectIDs := DependentObjectIDs(stateWithLinks, converter, Flags{Blocks: true, Relations: true, Details: true}) assert.Len(t, objectIDs, 14) // 4 links + 5 relations + 3 options + 1 fileID + 1 date }) + t.Run("blocks, relations and details option are turned on: get ids from blocks, relations and details", func(t *testing.T) { + objectIDs := DependentObjectIDs(stateWithLinks, converter, Flags{Blocks: true, Relations: true, Details: true}) + assert.Len(t, objectIDs, 14) // 4 links + 5 relations + 3 options + 1 fileID + 1 date + }) } func TestState_DepSmartIdsLinksCreatorModifierWorkspace(t *testing.T) { diff --git a/core/publish/service.go b/core/publish/service.go index 6c2cab145..12936eae3 100644 --- a/core/publish/service.go +++ b/core/publish/service.go @@ -122,15 +122,16 @@ func uniqName() string { func (s *service) exportToDir(ctx context.Context, spaceId, pageId string) (dirEntries []fs.DirEntry, exportPath string, err error) { tempDir := os.TempDir() exportPath, _, err = s.exportService.Export(ctx, pb.RpcObjectListExportRequest{ - SpaceId: spaceId, - Format: model.Export_Protobuf, - IncludeFiles: true, - IsJson: false, - Zip: false, - Path: tempDir, - ObjectIds: []string{pageId}, - NoProgress: true, - IncludeNested: true, + SpaceId: spaceId, + Format: model.Export_Protobuf, + IncludeFiles: true, + IsJson: false, + Zip: false, + Path: tempDir, + ObjectIds: []string{pageId}, + NoProgress: true, + IncludeNested: true, + IncludeBacklinks: true, LinksStateFilters: &pb.RpcObjectListExportStateFilters{ RelationsWhiteList: relationsWhiteListToPbModel(), RemoveBlocks: true, diff --git a/docs/proto.md b/docs/proto.md index 2f99684d5..8700cac34 100644 --- a/docs/proto.md +++ b/docs/proto.md @@ -15572,6 +15572,7 @@ Deletes the object, keys from the local store and unsubscribe from remote change | includeArchived | [bool](#bool) | | for migration | | noProgress | [bool](#bool) | | for integrations like raycast and web publishing | | linksStateFilters | [Rpc.Object.ListExport.StateFilters](#anytype-Rpc-Object-ListExport-StateFilters) | | | +| includeBacklinks | [bool](#bool) | | | diff --git a/pb/commands.pb.go b/pb/commands.pb.go index fd9ebbdaf..9ac6a93ca 100644 --- a/pb/commands.pb.go +++ b/pb/commands.pb.go @@ -29809,6 +29809,7 @@ type RpcObjectListExportRequest struct { // for integrations like raycast and web publishing NoProgress bool `protobuf:"varint,11,opt,name=noProgress,proto3" json:"noProgress,omitempty"` LinksStateFilters *RpcObjectListExportStateFilters `protobuf:"bytes,12,opt,name=linksStateFilters,proto3" json:"linksStateFilters,omitempty"` + IncludeBacklinks bool `protobuf:"varint,13,opt,name=includeBacklinks,proto3" json:"includeBacklinks,omitempty"` } func (m *RpcObjectListExportRequest) Reset() { *m = RpcObjectListExportRequest{} } @@ -29921,6 +29922,13 @@ func (m *RpcObjectListExportRequest) GetLinksStateFilters() *RpcObjectListExport return nil } +func (m *RpcObjectListExportRequest) GetIncludeBacklinks() bool { + if m != nil { + return m.IncludeBacklinks + } + return false +} + type RpcObjectListExportStateFilters struct { RelationsWhiteList []*RpcObjectListExportRelationsWhiteList `protobuf:"bytes,1,rep,name=relationsWhiteList,proto3" json:"relationsWhiteList,omitempty"` RemoveBlocks bool `protobuf:"varint,2,opt,name=removeBlocks,proto3" json:"removeBlocks,omitempty"` @@ -72445,1245 +72453,1246 @@ func init() { func init() { proto.RegisterFile("pb/protos/commands.proto", fileDescriptor_8261c968b2e6f45c) } var fileDescriptor_8261c968b2e6f45c = []byte{ - // 19802 bytes of a gzipped FileDescriptorProto + // 19811 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0xfd, 0x7b, 0x9c, 0x24, 0x49, 0x59, 0x2f, 0x8c, 0x4f, 0x65, 0x56, 0x55, 0x77, 0x3f, 0x7d, 0x99, 0x9a, 0xdc, 0x99, 0xd9, 0xd9, 0xd8, 0x65, 0x76, 0x9c, 0x5d, 0x96, 0x75, 0x59, 0x7a, 0x2f, 0x20, 0xb2, 0xcb, 0xde, 0xaa, 0xab, 0xab, 0xbb, 0x6b, 0xb7, 0xbb, 0xaa, 0xcd, 0xaa, 0x9e, 0x61, 0xf5, 0xf8, 0xab, 0x93, 0x53, 0x15, 0xdd, 0x9d, 0x3b, 0xd5, 0x99, 0x65, 0x66, 0x76, 0xcf, 0x0e, 0xbf, 0xcf, 0x79, 0x8f, 0x88, 0x2b, - 0x28, 0x72, 0x10, 0x15, 0x15, 0x15, 0x90, 0xcb, 0xca, 0x01, 0x05, 0xe4, 0x7e, 0x40, 0x05, 0xe4, - 0x22, 0x88, 0x88, 0x08, 0x72, 0x11, 0xdd, 0x57, 0x10, 0x44, 0x3c, 0x1f, 0x39, 0xbc, 0xfa, 0x1e, - 0x41, 0x14, 0x5e, 0xdf, 0x4f, 0x46, 0x44, 0x5e, 0xa2, 0xba, 0x32, 0x2b, 0xb2, 0xba, 0xb2, 0x7a, - 0x91, 0xf7, 0xbf, 0xcc, 0xc8, 0xc8, 0x27, 0x9e, 0x78, 0xbe, 0x4f, 0x44, 0x3c, 0x11, 0xf1, 0xc4, - 0x13, 0x70, 0xaa, 0x7b, 0xe1, 0x96, 0xae, 0x65, 0x3a, 0xa6, 0x7d, 0x4b, 0xcb, 0xdc, 0xd9, 0xd1, - 0x8c, 0xb6, 0x3d, 0x4f, 0xde, 0x95, 0x09, 0xcd, 0xb8, 0xec, 0x5c, 0xee, 0x62, 0x74, 0x7d, 0xf7, - 0xe2, 0xd6, 0x2d, 0x1d, 0xfd, 0xc2, 0x2d, 0xdd, 0x0b, 0xb7, 0xec, 0x98, 0x6d, 0xdc, 0xf1, 0x7e, - 0x20, 0x2f, 0x2c, 0x3b, 0xba, 0x31, 0x2a, 0x57, 0xc7, 0x6c, 0x69, 0x1d, 0xdb, 0x31, 0x2d, 0xcc, - 0x72, 0x9e, 0x0c, 0x8a, 0xc4, 0x7b, 0xd8, 0x70, 0x3c, 0x0a, 0xd7, 0x6c, 0x99, 0xe6, 0x56, 0x07, - 0xd3, 0x6f, 0x17, 0x76, 0x37, 0x6f, 0xb1, 0x1d, 0x6b, 0xb7, 0xe5, 0xb0, 0xaf, 0x67, 0x7a, 0xbf, - 0xb6, 0xb1, 0xdd, 0xb2, 0xf4, 0xae, 0x63, 0x5a, 0x34, 0xc7, 0xd9, 0x77, 0xfd, 0xe2, 0x24, 0xc8, - 0x6a, 0xb7, 0x85, 0xbe, 0x31, 0x01, 0x72, 0xb1, 0xdb, 0x45, 0x1f, 0x92, 0x00, 0x96, 0xb1, 0x73, - 0x0e, 0x5b, 0xb6, 0x6e, 0x1a, 0xe8, 0x28, 0x4c, 0xa8, 0xf8, 0xc7, 0x76, 0xb1, 0xed, 0xdc, 0x99, - 0x7d, 0xfe, 0x57, 0xe4, 0x0c, 0x7a, 0x54, 0x82, 0x49, 0x15, 0xdb, 0x5d, 0xd3, 0xb0, 0xb1, 0x72, - 0x1f, 0xe4, 0xb0, 0x65, 0x99, 0xd6, 0xa9, 0xcc, 0x99, 0xcc, 0x8d, 0xd3, 0xb7, 0xdf, 0x34, 0xcf, - 0xaa, 0x3f, 0xaf, 0x76, 0x5b, 0xf3, 0xc5, 0x6e, 0x77, 0x3e, 0xa0, 0x34, 0xef, 0xfd, 0x34, 0x5f, - 0x76, 0xff, 0x50, 0xe9, 0x8f, 0xca, 0x29, 0x98, 0xd8, 0xa3, 0x19, 0x4e, 0x49, 0x67, 0x32, 0x37, - 0x4e, 0xa9, 0xde, 0xab, 0xfb, 0xa5, 0x8d, 0x1d, 0x4d, 0xef, 0xd8, 0xa7, 0x64, 0xfa, 0x85, 0xbd, - 0xa2, 0x57, 0x65, 0x20, 0x47, 0x88, 0x28, 0x25, 0xc8, 0xb6, 0xcc, 0x36, 0x26, 0xc5, 0xcf, 0xdd, - 0x7e, 0x8b, 0x78, 0xf1, 0xf3, 0x25, 0xb3, 0x8d, 0x55, 0xf2, 0xb3, 0x72, 0x06, 0xa6, 0x3d, 0xb1, - 0x04, 0x6c, 0x84, 0x93, 0xce, 0xde, 0x0e, 0x59, 0x37, 0xbf, 0x32, 0x09, 0xd9, 0xea, 0xc6, 0xea, - 0x6a, 0xe1, 0x88, 0x72, 0x0c, 0x66, 0x37, 0xaa, 0x0f, 0x54, 0x6b, 0xe7, 0xab, 0xcd, 0xb2, 0xaa, - 0xd6, 0xd4, 0x42, 0x46, 0x99, 0x85, 0xa9, 0x85, 0xe2, 0x62, 0xb3, 0x52, 0x5d, 0xdf, 0x68, 0x14, - 0x24, 0xf4, 0x72, 0x19, 0xe6, 0xea, 0xd8, 0x59, 0xc4, 0x7b, 0x7a, 0x0b, 0xd7, 0x1d, 0xcd, 0xc1, - 0xe8, 0x45, 0x19, 0x5f, 0x98, 0xca, 0x86, 0x5b, 0xa8, 0xff, 0x89, 0x55, 0xe0, 0xa9, 0xfb, 0x2a, - 0xc0, 0x53, 0x98, 0x67, 0x7f, 0xcf, 0x87, 0xd2, 0xd4, 0x30, 0x9d, 0xb3, 0x4f, 0x81, 0xe9, 0xd0, - 0x37, 0x65, 0x0e, 0x60, 0xa1, 0x58, 0x7a, 0x60, 0x59, 0xad, 0x6d, 0x54, 0x17, 0x0b, 0x47, 0xdc, - 0xf7, 0xa5, 0x9a, 0x5a, 0x66, 0xef, 0x19, 0xf4, 0xad, 0x4c, 0x08, 0xcc, 0x45, 0x1e, 0xcc, 0xf9, - 0xc1, 0xcc, 0xf4, 0x01, 0x14, 0xfd, 0xa6, 0x0f, 0xce, 0x32, 0x07, 0xce, 0x53, 0x93, 0x91, 0x4b, - 0x1f, 0xa0, 0x47, 0x24, 0x98, 0xac, 0x6f, 0xef, 0x3a, 0x6d, 0xf3, 0x92, 0x81, 0xa6, 0x7c, 0x64, - 0xd0, 0xd7, 0xc2, 0x32, 0xb9, 0x87, 0x97, 0xc9, 0x8d, 0xfb, 0x2b, 0xc1, 0x28, 0x44, 0x48, 0xe3, - 0x37, 0x7c, 0x69, 0x14, 0x39, 0x69, 0x3c, 0x45, 0x94, 0x50, 0xfa, 0x72, 0xf8, 0xd5, 0x67, 0x40, - 0xae, 0xde, 0xd5, 0x5a, 0x18, 0x7d, 0x4c, 0x86, 0x99, 0x55, 0xac, 0xed, 0xe1, 0x62, 0xb7, 0x6b, - 0x99, 0x7b, 0x18, 0x95, 0x02, 0x7d, 0x3d, 0x05, 0x13, 0xb6, 0x9b, 0xa9, 0xd2, 0x26, 0x35, 0x98, - 0x52, 0xbd, 0x57, 0xe5, 0x34, 0x80, 0xde, 0xc6, 0x86, 0xa3, 0x3b, 0x3a, 0xb6, 0x4f, 0x49, 0x67, - 0xe4, 0x1b, 0xa7, 0xd4, 0x50, 0x0a, 0xfa, 0x86, 0x24, 0xaa, 0x63, 0x84, 0x8b, 0xf9, 0x30, 0x07, - 0x11, 0x52, 0x7d, 0xb5, 0x24, 0xa2, 0x63, 0x03, 0xc9, 0x25, 0x93, 0xed, 0x1b, 0x33, 0xc9, 0x85, - 0xeb, 0xe6, 0xa8, 0xd6, 0x9a, 0xf5, 0x8d, 0xd2, 0x4a, 0xb3, 0xbe, 0x5e, 0x2c, 0x95, 0x0b, 0x58, - 0x39, 0x0e, 0x05, 0xf2, 0xd8, 0xac, 0xd4, 0x9b, 0x8b, 0xe5, 0xd5, 0x72, 0xa3, 0xbc, 0x58, 0xd8, - 0x54, 0x14, 0x98, 0x53, 0xcb, 0x3f, 0xb4, 0x51, 0xae, 0x37, 0x9a, 0x4b, 0xc5, 0xca, 0x6a, 0x79, - 0xb1, 0xb0, 0xe5, 0xfe, 0xbc, 0x5a, 0x59, 0xab, 0x34, 0x9a, 0x6a, 0xb9, 0x58, 0x5a, 0x29, 0x2f, - 0x16, 0xb6, 0x95, 0x2b, 0xe1, 0x8a, 0x6a, 0xad, 0x59, 0x5c, 0x5f, 0x57, 0x6b, 0xe7, 0xca, 0x4d, - 0xf6, 0x47, 0xbd, 0xa0, 0xd3, 0x82, 0x1a, 0xcd, 0xfa, 0x4a, 0x51, 0x2d, 0x17, 0x17, 0x56, 0xcb, - 0x85, 0x87, 0xd0, 0x73, 0x65, 0x98, 0x5d, 0xd3, 0x2e, 0xe2, 0xfa, 0xb6, 0x66, 0x61, 0xed, 0x42, - 0x07, 0xa3, 0xeb, 0x04, 0xf0, 0x44, 0x1f, 0x0b, 0xe3, 0x55, 0xe6, 0xf1, 0xba, 0xa5, 0x8f, 0x80, - 0xb9, 0x22, 0x22, 0x00, 0xfb, 0x17, 0xbf, 0x19, 0xac, 0x70, 0x80, 0x3d, 0x2d, 0x21, 0xbd, 0x64, - 0x88, 0xfd, 0xc4, 0xe3, 0x00, 0x31, 0xf4, 0x98, 0x0c, 0x73, 0x15, 0x63, 0x4f, 0x77, 0xf0, 0x32, - 0x36, 0xb0, 0xe5, 0x8e, 0x03, 0x42, 0x30, 0x3c, 0x2a, 0x87, 0x60, 0x58, 0xe2, 0x61, 0xb8, 0xb5, - 0x8f, 0xd8, 0xf8, 0x32, 0x22, 0x46, 0xdb, 0x6b, 0x60, 0x4a, 0x27, 0xf9, 0x4a, 0x7a, 0x9b, 0x49, - 0x2c, 0x48, 0x50, 0xae, 0x87, 0x59, 0xfa, 0xb2, 0xa4, 0x77, 0xf0, 0x03, 0xf8, 0x32, 0x1b, 0x77, - 0xf9, 0x44, 0xf4, 0xb3, 0x7e, 0xe3, 0xab, 0x70, 0x58, 0xfe, 0x40, 0x52, 0xa6, 0x92, 0x81, 0xf9, - 0x92, 0xc7, 0x43, 0xf3, 0xdb, 0xd7, 0xca, 0x74, 0xf4, 0x1d, 0x09, 0xa6, 0xeb, 0x8e, 0xd9, 0x75, - 0x55, 0x56, 0x37, 0xb6, 0xc4, 0xc0, 0xfd, 0x48, 0xb8, 0x8d, 0x95, 0x78, 0x70, 0x9f, 0xd2, 0x47, - 0x8e, 0xa1, 0x02, 0x22, 0x5a, 0xd8, 0x37, 0xfc, 0x16, 0xb6, 0xc4, 0xa1, 0x72, 0x7b, 0x22, 0x6a, - 0xdf, 0x85, 0xed, 0xeb, 0x25, 0x32, 0x14, 0x3c, 0x35, 0x73, 0x4a, 0xbb, 0x96, 0x85, 0x0d, 0x47, - 0x0c, 0x84, 0xbf, 0x0c, 0x83, 0xb0, 0xc2, 0x83, 0x70, 0x7b, 0x8c, 0x32, 0x7b, 0xa5, 0xa4, 0xd8, - 0xc6, 0xde, 0xe7, 0xa3, 0xf9, 0x00, 0x87, 0xe6, 0x0f, 0x26, 0x67, 0x2b, 0x19, 0xa4, 0x2b, 0x43, - 0x20, 0x7a, 0x1c, 0x0a, 0xee, 0x98, 0x54, 0x6a, 0x54, 0xce, 0x95, 0x9b, 0x95, 0xea, 0xb9, 0x4a, - 0xa3, 0x5c, 0xc0, 0xe8, 0x17, 0x64, 0x98, 0xa1, 0xac, 0xa9, 0x78, 0xcf, 0xbc, 0x28, 0xd8, 0xeb, - 0x3d, 0x96, 0xd0, 0x58, 0x08, 0x97, 0x10, 0xd1, 0x32, 0x7e, 0x26, 0x81, 0xb1, 0x10, 0x43, 0xee, - 0xf1, 0xd4, 0x5b, 0xed, 0x6b, 0x06, 0x5b, 0x7d, 0x5a, 0x4b, 0xdf, 0xde, 0xea, 0x25, 0x59, 0x00, - 0x5a, 0xc9, 0x73, 0x3a, 0xbe, 0x84, 0xd6, 0x02, 0x4c, 0x38, 0xb5, 0xcd, 0x0c, 0x54, 0x5b, 0xa9, - 0x9f, 0xda, 0xbe, 0x33, 0x3c, 0x66, 0x2d, 0xf0, 0xe8, 0xdd, 0x1c, 0x29, 0x6e, 0x97, 0x93, 0xe8, - 0xd9, 0xa1, 0xa7, 0x28, 0x12, 0x6f, 0x75, 0x5e, 0x03, 0x53, 0xe4, 0xb1, 0xaa, 0xed, 0x60, 0xd6, - 0x86, 0x82, 0x04, 0xe5, 0x2c, 0xcc, 0xd0, 0x8c, 0x2d, 0xd3, 0x70, 0xeb, 0x93, 0x25, 0x19, 0xb8, - 0x34, 0x17, 0xc4, 0x96, 0x85, 0x35, 0xc7, 0xb4, 0x08, 0x8d, 0x1c, 0x05, 0x31, 0x94, 0x84, 0xbe, - 0xea, 0xb7, 0xc2, 0x32, 0xa7, 0x39, 0xb7, 0x25, 0xa9, 0x4a, 0x32, 0xbd, 0xd9, 0x1b, 0xae, 0xfd, - 0xd1, 0x56, 0xd7, 0x74, 0xd1, 0x5e, 0x22, 0x53, 0x3b, 0xac, 0x9c, 0x04, 0x85, 0xa5, 0xba, 0x79, - 0x4b, 0xb5, 0x6a, 0xa3, 0x5c, 0x6d, 0x14, 0x36, 0xfb, 0x6a, 0xd4, 0x16, 0x7a, 0x75, 0x16, 0xb2, - 0xf7, 0x9b, 0xba, 0x81, 0x1e, 0xc9, 0x70, 0x2a, 0x61, 0x60, 0xe7, 0x92, 0x69, 0x5d, 0xf4, 0x1b, - 0x6a, 0x90, 0x10, 0x8f, 0x4d, 0xa0, 0x4a, 0xf2, 0x40, 0x55, 0xca, 0xf6, 0x53, 0xa5, 0x9f, 0x0f, - 0xab, 0xd2, 0x5d, 0xbc, 0x2a, 0xdd, 0xd0, 0x47, 0xfe, 0x2e, 0xf3, 0x11, 0x1d, 0xc0, 0x87, 0xfd, - 0x0e, 0xe0, 0x5e, 0x0e, 0xc6, 0x27, 0x8b, 0x91, 0x49, 0x06, 0xe0, 0xe7, 0x53, 0x6d, 0xf8, 0xfd, - 0xa0, 0xde, 0x8a, 0x80, 0x7a, 0xbb, 0x4f, 0x9f, 0xa0, 0xef, 0xef, 0x3a, 0x1e, 0xda, 0xdf, 0x4d, - 0x5c, 0x54, 0x4e, 0xc0, 0xb1, 0xc5, 0xca, 0xd2, 0x52, 0x59, 0x2d, 0x57, 0x1b, 0xcd, 0x6a, 0xb9, - 0x71, 0xbe, 0xa6, 0x3e, 0x50, 0xe8, 0xa0, 0x57, 0xc9, 0x00, 0xae, 0x84, 0x4a, 0x9a, 0xd1, 0xc2, - 0x1d, 0xb1, 0x1e, 0xfd, 0x7f, 0x49, 0xc9, 0xfa, 0x84, 0x80, 0x7e, 0x04, 0x9c, 0x2f, 0x93, 0xc4, - 0x5b, 0x65, 0x24, 0xb1, 0x64, 0xa0, 0xbe, 0xfe, 0xf1, 0x60, 0x7b, 0x5e, 0x01, 0x47, 0x3d, 0x7a, - 0x2c, 0x7b, 0xff, 0x69, 0xdf, 0x9b, 0xb2, 0x30, 0xc7, 0x60, 0xf1, 0xe6, 0xf1, 0xcf, 0xcf, 0x88, - 0x4c, 0xe4, 0x11, 0x4c, 0xb2, 0x69, 0xbb, 0xd7, 0xbd, 0xfb, 0xef, 0xca, 0x32, 0x4c, 0x77, 0xb1, - 0xb5, 0xa3, 0xdb, 0xb6, 0x6e, 0x1a, 0x74, 0x41, 0x6e, 0xee, 0xf6, 0x27, 0xfa, 0x12, 0x27, 0x6b, - 0x97, 0xf3, 0xeb, 0x9a, 0xe5, 0xe8, 0x2d, 0xbd, 0xab, 0x19, 0xce, 0x7a, 0x90, 0x59, 0x0d, 0xff, - 0x89, 0x5e, 0x9c, 0x70, 0x5a, 0xc3, 0xd7, 0x24, 0x42, 0x25, 0x7e, 0x2f, 0xc1, 0x94, 0x24, 0x96, - 0x60, 0x32, 0xb5, 0xf8, 0x50, 0xaa, 0x6a, 0xd1, 0x07, 0xef, 0x2d, 0xe5, 0x2a, 0x38, 0x51, 0xa9, - 0x96, 0x6a, 0xaa, 0x5a, 0x2e, 0x35, 0x9a, 0xeb, 0x65, 0x75, 0xad, 0x52, 0xaf, 0x57, 0x6a, 0xd5, - 0xfa, 0x41, 0x5a, 0x3b, 0xfa, 0xa8, 0xec, 0x6b, 0xcc, 0x22, 0x6e, 0x75, 0x74, 0x03, 0xa3, 0x7b, - 0x0f, 0xa8, 0x30, 0xfc, 0xaa, 0x8f, 0x38, 0xce, 0xac, 0xfc, 0x08, 0x9c, 0x5f, 0x99, 0x1c, 0xe7, - 0xfe, 0x04, 0xff, 0x03, 0x37, 0xff, 0xc7, 0x64, 0x38, 0x16, 0x6a, 0x88, 0x2a, 0xde, 0x19, 0xd9, - 0x4a, 0xde, 0x4f, 0x84, 0xdb, 0x6e, 0x85, 0xc7, 0xb4, 0x9f, 0x35, 0xbd, 0x8f, 0x8d, 0x08, 0x58, - 0x5f, 0xef, 0xc3, 0xba, 0xca, 0xc1, 0xfa, 0x8c, 0x21, 0x68, 0x26, 0x43, 0xf6, 0x77, 0x52, 0x45, - 0xf6, 0x2a, 0x38, 0xb1, 0x5e, 0x54, 0x1b, 0x95, 0x52, 0x65, 0xbd, 0xe8, 0x8e, 0xa3, 0xa1, 0x21, - 0x3b, 0xc2, 0x5c, 0xe7, 0x41, 0xef, 0x8b, 0xef, 0x7b, 0xb3, 0x70, 0x4d, 0xff, 0x8e, 0xb6, 0xb4, - 0xad, 0x19, 0x5b, 0x18, 0xe9, 0x22, 0x50, 0x2f, 0xc2, 0x44, 0x8b, 0x64, 0xa7, 0x38, 0x87, 0xb7, - 0x6e, 0x62, 0xfa, 0x72, 0x5a, 0x82, 0xea, 0xfd, 0x8a, 0xde, 0x1a, 0x56, 0x88, 0x06, 0xaf, 0x10, - 0xf7, 0xc4, 0x83, 0xb7, 0x8f, 0xef, 0x08, 0xdd, 0xf8, 0x84, 0xaf, 0x1b, 0xe7, 0x39, 0xdd, 0x28, - 0x1d, 0x8c, 0x7c, 0x32, 0x35, 0xf9, 0xe3, 0xc7, 0x43, 0x07, 0x10, 0xa9, 0x4d, 0x7a, 0xf4, 0xa8, - 0xd0, 0xb7, 0xbb, 0x7f, 0x85, 0x0c, 0xf9, 0x45, 0xdc, 0xc1, 0xa2, 0x2b, 0x91, 0x5f, 0x97, 0x44, - 0x37, 0x44, 0x28, 0x0c, 0x94, 0x76, 0xf4, 0xea, 0x88, 0xa3, 0xef, 0x60, 0xdb, 0xd1, 0x76, 0xba, - 0x44, 0xd4, 0xb2, 0x1a, 0x24, 0xa0, 0x9f, 0x94, 0x44, 0xb6, 0x4b, 0x62, 0x8a, 0xf9, 0x8f, 0xb1, - 0xa6, 0xf8, 0x29, 0x09, 0x26, 0xeb, 0xd8, 0xa9, 0x59, 0x6d, 0x6c, 0xa1, 0x7a, 0x80, 0xd1, 0x19, - 0x98, 0x26, 0xa0, 0xb8, 0xd3, 0x4c, 0x1f, 0xa7, 0x70, 0x92, 0x72, 0x03, 0xcc, 0xf9, 0xaf, 0xe4, - 0x77, 0xd6, 0x8d, 0xf7, 0xa4, 0xa2, 0x7f, 0xcc, 0x88, 0xee, 0xe2, 0xb2, 0x25, 0x43, 0xc6, 0x4d, - 0x44, 0x2b, 0x15, 0xdb, 0x91, 0x8d, 0x25, 0x95, 0xfe, 0x46, 0xd7, 0x9b, 0x25, 0x80, 0x0d, 0xc3, - 0xf6, 0xe4, 0xfa, 0xe4, 0x04, 0x72, 0x45, 0xff, 0x9c, 0x49, 0x36, 0x8b, 0x09, 0xca, 0x89, 0x90, - 0xd8, 0x6b, 0x12, 0xac, 0x2d, 0x44, 0x12, 0x4b, 0x5f, 0x66, 0x5f, 0x9a, 0x83, 0xfc, 0x79, 0xad, - 0xd3, 0xc1, 0x0e, 0xfa, 0xb2, 0x04, 0xf9, 0x92, 0x85, 0x35, 0x07, 0x87, 0x45, 0x87, 0x60, 0xd2, - 0x32, 0x4d, 0x67, 0x5d, 0x73, 0xb6, 0x99, 0xdc, 0xfc, 0x77, 0xe6, 0x30, 0xf0, 0xdb, 0xe1, 0xee, - 0xe3, 0x5e, 0x5e, 0x74, 0xdf, 0xcf, 0xd5, 0x96, 0x16, 0x34, 0x4f, 0x0b, 0x89, 0xe8, 0x3f, 0x10, - 0x4c, 0xee, 0x18, 0x78, 0xc7, 0x34, 0xf4, 0x96, 0x67, 0x73, 0x7a, 0xef, 0xe8, 0xfd, 0xbe, 0x4c, - 0x17, 0x38, 0x99, 0xce, 0x0b, 0x97, 0x92, 0x4c, 0xa0, 0xf5, 0x21, 0x7a, 0x8f, 0x6b, 0xe1, 0x6a, - 0xda, 0x19, 0x34, 0x1b, 0xb5, 0x66, 0x49, 0x2d, 0x17, 0x1b, 0xe5, 0xe6, 0x6a, 0xad, 0x54, 0x5c, - 0x6d, 0xaa, 0xe5, 0xf5, 0x5a, 0x01, 0xa3, 0xbf, 0x93, 0x5c, 0xe1, 0xb6, 0xcc, 0x3d, 0x6c, 0xa1, - 0x65, 0x21, 0x39, 0xc7, 0xc9, 0x84, 0x61, 0xf0, 0xf3, 0xc2, 0x4e, 0x1b, 0x4c, 0x3a, 0x8c, 0x83, - 0x08, 0xe5, 0xfd, 0x80, 0x50, 0x73, 0x8f, 0x25, 0xf5, 0x38, 0x90, 0xf4, 0xff, 0x96, 0x60, 0xa2, - 0x64, 0x1a, 0x7b, 0xd8, 0x72, 0xc2, 0xf3, 0x9d, 0xb0, 0x34, 0x33, 0xbc, 0x34, 0xdd, 0x41, 0x12, - 0x1b, 0x8e, 0x65, 0x76, 0xbd, 0x09, 0x8f, 0xf7, 0x8a, 0x5e, 0x9b, 0x54, 0xc2, 0xac, 0xe4, 0xe8, - 0x85, 0xcf, 0xfe, 0x05, 0x71, 0xec, 0xc9, 0x3d, 0x0d, 0xe0, 0x55, 0x49, 0x70, 0xe9, 0xcf, 0x40, - 0xfa, 0x5d, 0xca, 0x17, 0x64, 0x98, 0xa5, 0x8d, 0xaf, 0x8e, 0x89, 0x85, 0x86, 0x6a, 0xe1, 0x25, - 0xc7, 0x1e, 0xe1, 0xaf, 0x1c, 0xe1, 0xc4, 0x9f, 0xd7, 0xba, 0x5d, 0x7f, 0xf9, 0x79, 0xe5, 0x88, - 0xca, 0xde, 0xa9, 0x9a, 0x2f, 0xe4, 0x21, 0xab, 0xed, 0x3a, 0xdb, 0xe8, 0x3b, 0xc2, 0x93, 0x4f, - 0xae, 0x33, 0x60, 0xfc, 0x44, 0x40, 0x72, 0x1c, 0x72, 0x8e, 0x79, 0x11, 0x7b, 0x72, 0xa0, 0x2f, - 0x2e, 0x1c, 0x5a, 0xb7, 0xdb, 0x20, 0x1f, 0x18, 0x1c, 0xde, 0xbb, 0x6b, 0xeb, 0x68, 0xad, 0x96, - 0xb9, 0x6b, 0x38, 0x15, 0x6f, 0x09, 0x3a, 0x48, 0x40, 0x9f, 0xcb, 0x88, 0x4c, 0x66, 0x05, 0x18, - 0x4c, 0x06, 0xd9, 0x85, 0x21, 0x9a, 0xd2, 0x3c, 0xdc, 0x54, 0x5c, 0x5f, 0x6f, 0x36, 0x6a, 0x0f, - 0x94, 0xab, 0x81, 0xe1, 0xd9, 0xac, 0x54, 0x9b, 0x8d, 0x95, 0x72, 0xb3, 0xb4, 0xa1, 0x92, 0x75, - 0xc2, 0x62, 0xa9, 0x54, 0xdb, 0xa8, 0x36, 0x0a, 0x18, 0xbd, 0x41, 0x82, 0x99, 0x52, 0xc7, 0xb4, - 0x7d, 0x84, 0xaf, 0x0d, 0x10, 0xf6, 0xc5, 0x98, 0x09, 0x89, 0x11, 0xfd, 0x5b, 0x46, 0xd4, 0xe9, - 0xc0, 0x13, 0x48, 0x88, 0x7c, 0x44, 0x2f, 0xf5, 0x5a, 0x21, 0xa7, 0x83, 0xc1, 0xf4, 0xd2, 0x6f, - 0x12, 0x9f, 0xbd, 0x07, 0x26, 0x8a, 0x54, 0x31, 0xd0, 0x5f, 0x67, 0x20, 0x5f, 0x32, 0x8d, 0x4d, - 0x7d, 0xcb, 0x35, 0xe6, 0xb0, 0xa1, 0x5d, 0xe8, 0xe0, 0x45, 0xcd, 0xd1, 0xf6, 0x74, 0x7c, 0x89, - 0x54, 0x60, 0x52, 0xed, 0x49, 0x75, 0x99, 0x62, 0x29, 0xf8, 0xc2, 0xee, 0x16, 0x61, 0x6a, 0x52, - 0x0d, 0x27, 0x29, 0xcf, 0x80, 0x2b, 0xe9, 0xeb, 0xba, 0x85, 0x2d, 0xdc, 0xc1, 0x9a, 0x8d, 0xdd, - 0x69, 0x91, 0x81, 0x3b, 0x44, 0x69, 0x27, 0xd5, 0xa8, 0xcf, 0xca, 0x59, 0x98, 0xa1, 0x9f, 0x88, - 0x29, 0x62, 0x13, 0x35, 0x9e, 0x54, 0xb9, 0x34, 0xe5, 0x29, 0x90, 0xc3, 0x0f, 0x3b, 0x96, 0x76, - 0xaa, 0x4d, 0xf0, 0xba, 0x72, 0x9e, 0x7a, 0x1d, 0xce, 0x7b, 0x5e, 0x87, 0xf3, 0x75, 0xe2, 0x93, - 0xa8, 0xd2, 0x5c, 0xe8, 0xa3, 0x93, 0xbe, 0x21, 0xf1, 0x06, 0x39, 0x50, 0x0c, 0x05, 0xb2, 0x86, - 0xb6, 0x83, 0x99, 0x5e, 0x90, 0x67, 0xe5, 0x26, 0x38, 0xaa, 0xed, 0x69, 0x8e, 0x66, 0xad, 0x9a, - 0x2d, 0xad, 0x43, 0x06, 0x3f, 0xaf, 0xe5, 0xf7, 0x7e, 0x20, 0x3b, 0x42, 0x8e, 0x69, 0x61, 0x92, - 0xcb, 0xdb, 0x11, 0xf2, 0x12, 0x5c, 0xea, 0x7a, 0xcb, 0x34, 0x08, 0xff, 0xb2, 0x4a, 0x9e, 0x5d, - 0xa9, 0xb4, 0x75, 0xdb, 0xad, 0x08, 0xa1, 0x52, 0xa5, 0x5b, 0x1b, 0xf5, 0xcb, 0x46, 0x8b, 0xec, - 0x06, 0x4d, 0xaa, 0x51, 0x9f, 0x95, 0x05, 0x98, 0x66, 0x1b, 0x21, 0x6b, 0xae, 0x5e, 0xe5, 0x89, - 0x5e, 0x9d, 0xe1, 0x7d, 0xba, 0x28, 0x9e, 0xf3, 0xd5, 0x20, 0x9f, 0x1a, 0xfe, 0x49, 0xb9, 0x0f, - 0xae, 0x66, 0xaf, 0xa5, 0x5d, 0xdb, 0x31, 0x77, 0x28, 0xe8, 0x4b, 0x7a, 0x87, 0xd6, 0x60, 0x82, - 0xd4, 0x20, 0x2e, 0x8b, 0x72, 0x3b, 0x1c, 0xef, 0x5a, 0x78, 0x13, 0x5b, 0x0f, 0x6a, 0x3b, 0xbb, - 0x0f, 0x37, 0x2c, 0xcd, 0xb0, 0xbb, 0xa6, 0xe5, 0x9c, 0x9a, 0x24, 0xcc, 0xf7, 0xfd, 0xa6, 0xdc, - 0x0c, 0xc7, 0x1e, 0xb2, 0x4d, 0xa3, 0xd8, 0xd5, 0x57, 0x75, 0xdb, 0xc1, 0x46, 0xb1, 0xdd, 0xb6, - 0x4e, 0x4d, 0x91, 0xb2, 0xf6, 0x7f, 0x60, 0xdd, 0xea, 0x24, 0xe4, 0xa9, 0xb0, 0xd1, 0x8b, 0x72, - 0xc2, 0xce, 0x9f, 0xac, 0xfa, 0xb1, 0xc6, 0xdc, 0xad, 0x30, 0xc1, 0xfa, 0x43, 0x02, 0xeb, 0xf4, - 0xed, 0x27, 0x7b, 0x56, 0x21, 0x18, 0x15, 0xd5, 0xcb, 0xa6, 0x3c, 0x15, 0xf2, 0x2d, 0x22, 0x04, - 0x82, 0xf0, 0xf4, 0xed, 0x57, 0xf7, 0x2f, 0x94, 0x64, 0x51, 0x59, 0x56, 0xf4, 0x17, 0xb2, 0x90, - 0xbf, 0x68, 0x1c, 0xc7, 0xc9, 0xfa, 0x80, 0xaf, 0x4a, 0x43, 0x74, 0xb2, 0x37, 0xc3, 0x8d, 0xac, - 0x07, 0x65, 0xd6, 0xca, 0x62, 0x73, 0x61, 0xc3, 0x9b, 0x3a, 0xba, 0x36, 0x4c, 0xbd, 0x51, 0x54, - 0xdd, 0x79, 0xff, 0xa2, 0x3b, 0xe5, 0xbc, 0x09, 0x6e, 0x18, 0x90, 0xbb, 0xdc, 0x68, 0x56, 0x8b, - 0x6b, 0xe5, 0xc2, 0x26, 0x6f, 0x09, 0xd5, 0x1b, 0xb5, 0xf5, 0xa6, 0xba, 0x51, 0xad, 0x56, 0xaa, - 0xcb, 0x94, 0x98, 0x6b, 0x40, 0x9e, 0x0c, 0x32, 0x9c, 0x57, 0x2b, 0x8d, 0x72, 0xb3, 0x54, 0xab, - 0x2e, 0x55, 0x96, 0x0b, 0xfa, 0x20, 0x33, 0xea, 0x21, 0xe5, 0x0c, 0x5c, 0xc3, 0x71, 0x52, 0xa9, - 0x55, 0xdd, 0x79, 0x70, 0xa9, 0x58, 0x2d, 0x95, 0xdd, 0x49, 0xef, 0x45, 0x05, 0xc1, 0x09, 0x4a, - 0xae, 0xb9, 0x54, 0x59, 0x0d, 0x6f, 0x5d, 0x7d, 0x24, 0xa3, 0x9c, 0x82, 0x2b, 0xc2, 0xdf, 0x2a, - 0xd5, 0x73, 0xc5, 0xd5, 0xca, 0x62, 0xe1, 0x8f, 0x32, 0xca, 0xf5, 0x70, 0x2d, 0xf7, 0x17, 0xdd, - 0x85, 0x6a, 0x56, 0x16, 0x9b, 0x6b, 0x95, 0xfa, 0x5a, 0xb1, 0x51, 0x5a, 0x29, 0x7c, 0x94, 0xcc, - 0x2e, 0x7c, 0x73, 0x39, 0xe4, 0xc4, 0xf9, 0x92, 0xb0, 0x05, 0x50, 0xe4, 0x15, 0xf5, 0xc9, 0x7d, - 0x61, 0x8f, 0xb7, 0x78, 0x3f, 0xe4, 0x8f, 0x25, 0x8b, 0x9c, 0x0a, 0xdd, 0x9a, 0x80, 0x56, 0x32, - 0x1d, 0x6a, 0x0c, 0xa1, 0x42, 0x67, 0xe0, 0x9a, 0x6a, 0x99, 0x22, 0xa5, 0x96, 0x4b, 0xb5, 0x73, - 0x65, 0xb5, 0x79, 0xbe, 0xb8, 0xba, 0x5a, 0x6e, 0x34, 0x97, 0x2a, 0x6a, 0xbd, 0x51, 0xd8, 0x44, - 0xff, 0x2c, 0xf9, 0x6b, 0x3f, 0x21, 0x69, 0xfd, 0xb5, 0x94, 0xb4, 0x59, 0xc7, 0xae, 0xf1, 0xfc, - 0x00, 0xe4, 0x6d, 0x47, 0x73, 0x76, 0x6d, 0xd6, 0xaa, 0x9f, 0xd0, 0xbf, 0x55, 0xcf, 0xd7, 0x49, - 0x26, 0x95, 0x65, 0x46, 0x7f, 0x91, 0x49, 0xd2, 0x4c, 0x47, 0xb0, 0xfc, 0xa3, 0x0f, 0x21, 0xe2, - 0xd3, 0x80, 0x3c, 0x6d, 0xaf, 0xd4, 0x9b, 0xc5, 0x55, 0xb5, 0x5c, 0x5c, 0x7c, 0xd0, 0x5f, 0xf4, - 0xc1, 0xca, 0x09, 0x38, 0xb6, 0x51, 0x2d, 0x2e, 0xac, 0x96, 0x49, 0x73, 0xa9, 0x55, 0xab, 0xe5, - 0x92, 0x2b, 0xf7, 0x9f, 0x24, 0x5b, 0x2c, 0xae, 0xbd, 0x4d, 0xf8, 0x76, 0x6d, 0xa2, 0x90, 0xfc, - 0xbf, 0x22, 0xec, 0x89, 0x14, 0x68, 0x58, 0x98, 0xd6, 0x68, 0x71, 0xf8, 0x9c, 0x90, 0xf3, 0x91, - 0x10, 0x27, 0xc9, 0xf0, 0xf8, 0xcf, 0x43, 0xe0, 0x71, 0x02, 0x8e, 0x85, 0xf1, 0x20, 0x4e, 0x48, - 0xd1, 0x30, 0xbc, 0x68, 0x0a, 0xf2, 0x75, 0xdc, 0xc1, 0x2d, 0x07, 0x3d, 0x26, 0x05, 0xa6, 0xc7, - 0x1c, 0x48, 0xbe, 0xd3, 0x8b, 0xa4, 0xb7, 0xb9, 0xc9, 0xb6, 0xd4, 0x33, 0xd9, 0x8e, 0x31, 0x1a, - 0xe4, 0x44, 0x46, 0x43, 0x36, 0x05, 0xa3, 0x21, 0x37, 0xbc, 0xd1, 0x90, 0x4f, 0x6a, 0x34, 0x4c, - 0xc4, 0x1a, 0x0d, 0xe8, 0x35, 0xf9, 0xa4, 0x7d, 0x0a, 0x05, 0xe6, 0x70, 0x4d, 0x85, 0xff, 0x95, - 0x4d, 0xd2, 0x07, 0xf5, 0xe5, 0x38, 0x99, 0xce, 0x7f, 0x47, 0x4e, 0x61, 0x69, 0x43, 0xb9, 0x0e, - 0xae, 0x0d, 0xde, 0x9b, 0xe5, 0x67, 0x55, 0xea, 0x8d, 0x3a, 0xb1, 0x0f, 0x4a, 0x35, 0x55, 0xdd, - 0x58, 0xa7, 0xeb, 0xd3, 0x27, 0x41, 0x09, 0xa8, 0xa8, 0x1b, 0x55, 0x6a, 0x0d, 0x6c, 0xf1, 0xd4, - 0x97, 0x2a, 0xd5, 0xc5, 0xa6, 0xdf, 0xc2, 0xaa, 0x4b, 0xb5, 0xc2, 0xb6, 0x3b, 0x1d, 0x0c, 0x51, - 0x77, 0x87, 0x73, 0x56, 0x42, 0xb1, 0xba, 0xd8, 0x5c, 0xab, 0x96, 0xd7, 0x6a, 0xd5, 0x4a, 0x89, - 0xa4, 0xd7, 0xcb, 0x8d, 0x82, 0xee, 0x0e, 0x4b, 0x3d, 0xf6, 0x47, 0xbd, 0x5c, 0x54, 0x4b, 0x2b, - 0x65, 0x95, 0x16, 0xf9, 0x90, 0x72, 0x03, 0x9c, 0x2d, 0x56, 0x6b, 0x0d, 0x37, 0xa5, 0x58, 0x7d, - 0xb0, 0xf1, 0xe0, 0x7a, 0xb9, 0xb9, 0xae, 0xd6, 0x4a, 0xe5, 0x7a, 0xdd, 0x6d, 0xd5, 0xcc, 0x5a, - 0x29, 0x74, 0x94, 0x7b, 0xe0, 0xce, 0x10, 0x6b, 0xe5, 0x06, 0xd9, 0x0c, 0x5d, 0xab, 0x11, 0x7f, - 0x98, 0xc5, 0x72, 0x73, 0xa5, 0x58, 0x6f, 0x56, 0xaa, 0xa5, 0xda, 0xda, 0x7a, 0xb1, 0x51, 0x71, - 0x1b, 0xff, 0xba, 0x5a, 0x6b, 0xd4, 0x9a, 0xe7, 0xca, 0x6a, 0xbd, 0x52, 0xab, 0x16, 0x0c, 0xb7, - 0xca, 0xa1, 0xde, 0xc2, 0xeb, 0xb5, 0x4d, 0xe5, 0x1a, 0x38, 0xe5, 0xa5, 0xaf, 0xd6, 0x5c, 0x41, - 0x87, 0xec, 0x97, 0x6e, 0xaa, 0xf6, 0xcb, 0xbf, 0x4a, 0x90, 0xad, 0x3b, 0x66, 0x17, 0x7d, 0x7f, - 0xd0, 0x1d, 0x9d, 0x06, 0xb0, 0xc8, 0xde, 0xa6, 0x3b, 0xc3, 0x63, 0x73, 0xbe, 0x50, 0x0a, 0xfa, - 0x43, 0xe1, 0x0d, 0x99, 0xa0, 0x87, 0x37, 0xbb, 0x11, 0x96, 0xcd, 0xb7, 0xc4, 0x4e, 0xa8, 0x44, - 0x13, 0x4a, 0xa6, 0xef, 0x3f, 0x33, 0xcc, 0x96, 0x0b, 0x82, 0x93, 0x21, 0xd8, 0x5c, 0xf9, 0x7b, - 0x2a, 0x81, 0x95, 0x2b, 0xe1, 0x8a, 0x1e, 0xe5, 0x22, 0x3a, 0xb5, 0xa9, 0x7c, 0x1f, 0x3c, 0x21, - 0xa4, 0xde, 0xe5, 0xb5, 0xda, 0xb9, 0xb2, 0xaf, 0xc8, 0x8b, 0xc5, 0x46, 0xb1, 0xb0, 0x85, 0x3e, - 0x25, 0x43, 0x76, 0xcd, 0xdc, 0xeb, 0xdd, 0x07, 0x33, 0xf0, 0xa5, 0xd0, 0x3a, 0xab, 0xf7, 0xca, - 0x7b, 0xe4, 0x0b, 0x89, 0x7d, 0x2d, 0x7a, 0xcf, 0xfb, 0x73, 0x52, 0x12, 0xb1, 0xaf, 0x1d, 0x74, - 0xa3, 0xfb, 0xef, 0x87, 0x11, 0x7b, 0x84, 0x68, 0xb1, 0x72, 0x16, 0x4e, 0x07, 0x1f, 0x2a, 0x8b, - 0xe5, 0x6a, 0xa3, 0xb2, 0xf4, 0x60, 0x20, 0xdc, 0x8a, 0x2a, 0x24, 0xfe, 0x41, 0xdd, 0x58, 0xfc, - 0xbc, 0xe4, 0x14, 0x1c, 0x0f, 0xbe, 0x2d, 0x97, 0x1b, 0xde, 0x97, 0x87, 0xd0, 0x23, 0x39, 0x98, - 0xa1, 0xdd, 0xfa, 0x46, 0xb7, 0xad, 0x39, 0x18, 0x3d, 0x35, 0x40, 0xf7, 0x46, 0x38, 0x5a, 0x59, - 0x5f, 0xaa, 0xd7, 0x1d, 0xd3, 0xd2, 0xb6, 0x30, 0x19, 0xc7, 0xa8, 0xb4, 0x7a, 0x93, 0xd1, 0xdb, - 0x85, 0xd7, 0x10, 0xf9, 0xa1, 0x84, 0x96, 0x19, 0x81, 0xfa, 0x17, 0x84, 0xd6, 0xfc, 0x04, 0x08, - 0x26, 0x43, 0xff, 0xa1, 0x11, 0xb7, 0xb9, 0x68, 0x5c, 0x36, 0xcf, 0x3e, 0x4f, 0x82, 0xa9, 0x86, - 0xbe, 0x83, 0x9f, 0x6d, 0x1a, 0xd8, 0x56, 0x26, 0x40, 0x5e, 0x5e, 0x6b, 0x14, 0x8e, 0xb8, 0x0f, - 0xae, 0x09, 0x96, 0x21, 0x0f, 0x65, 0xb7, 0x00, 0xf7, 0xa1, 0xd8, 0x28, 0xc8, 0xee, 0xc3, 0x5a, - 0xb9, 0x51, 0xc8, 0xba, 0x0f, 0xd5, 0x72, 0xa3, 0x90, 0x73, 0x1f, 0xd6, 0x57, 0x1b, 0x85, 0xbc, - 0xfb, 0x50, 0xa9, 0x37, 0x0a, 0x13, 0xee, 0xc3, 0x42, 0xbd, 0x51, 0x98, 0x74, 0x1f, 0xce, 0xd5, - 0x1b, 0x85, 0x29, 0xf7, 0xa1, 0xd4, 0x68, 0x14, 0xc0, 0x7d, 0xb8, 0xbf, 0xde, 0x28, 0x4c, 0xbb, - 0x0f, 0xc5, 0x52, 0xa3, 0x30, 0x43, 0x1e, 0xca, 0x8d, 0xc2, 0xac, 0xfb, 0x50, 0xaf, 0x37, 0x0a, - 0x73, 0x84, 0x72, 0xbd, 0x51, 0x38, 0x4a, 0xca, 0xaa, 0x34, 0x0a, 0x05, 0xf7, 0x61, 0xa5, 0xde, - 0x28, 0x1c, 0x23, 0x99, 0xeb, 0x8d, 0x82, 0x42, 0x0a, 0xad, 0x37, 0x0a, 0x57, 0x90, 0x3c, 0xf5, - 0x46, 0xe1, 0x38, 0x29, 0xa2, 0xde, 0x28, 0x9c, 0x20, 0x6c, 0x94, 0x1b, 0x85, 0x93, 0x24, 0x8f, - 0xda, 0x28, 0x5c, 0x49, 0x3e, 0x55, 0x1b, 0x85, 0x53, 0x84, 0xb1, 0x72, 0xa3, 0x70, 0x15, 0x79, - 0x50, 0x1b, 0x05, 0x44, 0x3e, 0x15, 0x1b, 0x85, 0xab, 0xd1, 0x13, 0x60, 0x6a, 0x19, 0x3b, 0x14, - 0x44, 0x54, 0x00, 0x79, 0x19, 0x3b, 0x61, 0xa3, 0xff, 0x4b, 0x32, 0x5c, 0xc9, 0x26, 0x8a, 0x4b, - 0x96, 0xb9, 0xb3, 0x8a, 0xb7, 0xb4, 0xd6, 0xe5, 0xf2, 0xc3, 0xae, 0xc1, 0x15, 0xde, 0xf3, 0x55, - 0x20, 0xdb, 0x0d, 0x3a, 0x23, 0xf2, 0x1c, 0x6b, 0x9f, 0x7a, 0x0b, 0x5d, 0x72, 0xb0, 0xd0, 0xc5, - 0x2c, 0xb2, 0x7f, 0x0a, 0x6b, 0x34, 0xb7, 0x36, 0x9d, 0xe9, 0x59, 0x9b, 0x76, 0x9b, 0x49, 0x17, - 0x5b, 0xb6, 0x69, 0x68, 0x9d, 0x3a, 0x73, 0x0a, 0xa0, 0x2b, 0x6a, 0xbd, 0xc9, 0xca, 0x0f, 0x79, - 0x2d, 0x83, 0x5a, 0x65, 0xcf, 0x8c, 0x9b, 0x0f, 0xf7, 0x56, 0x33, 0xa2, 0x91, 0x7c, 0xd4, 0x6f, - 0x24, 0x0d, 0xae, 0x91, 0xdc, 0x77, 0x00, 0xda, 0xc9, 0xda, 0x4b, 0x65, 0xb8, 0x89, 0x48, 0xe0, - 0x32, 0xeb, 0x2d, 0x85, 0xcb, 0xe8, 0x53, 0x12, 0x9c, 0x2c, 0x1b, 0xfd, 0xe6, 0x03, 0x61, 0x5d, - 0x78, 0x43, 0x18, 0x9a, 0x75, 0x5e, 0xa4, 0x77, 0xf6, 0xad, 0x76, 0x7f, 0x9a, 0x11, 0x12, 0xfd, - 0xb8, 0x2f, 0xd1, 0x3a, 0x27, 0xd1, 0x7b, 0x87, 0x27, 0x9d, 0x4c, 0xa0, 0xd5, 0x91, 0x76, 0x40, - 0x59, 0xf4, 0x65, 0x09, 0x8e, 0x51, 0xbf, 0x9e, 0xfb, 0xe9, 0xf4, 0x83, 0x74, 0xd9, 0xbc, 0x09, - 0xd5, 0x09, 0xa6, 0x2a, 0x54, 0xbf, 0x43, 0x29, 0xe8, 0xd5, 0x61, 0x81, 0x3f, 0xc0, 0x0b, 0x3c, - 0xa2, 0x33, 0xee, 0x2d, 0x2e, 0x42, 0xd6, 0x7f, 0xe4, 0xcb, 0xba, 0xca, 0xc9, 0xfa, 0xce, 0xa1, - 0xa8, 0x1e, 0xae, 0x98, 0xbf, 0x9a, 0x85, 0x27, 0x50, 0x0e, 0x99, 0x22, 0xd0, 0xce, 0xac, 0x68, - 0xb4, 0x55, 0x6c, 0x3b, 0x9a, 0xe5, 0x70, 0x47, 0xda, 0x7b, 0xe6, 0xb7, 0x99, 0x14, 0xe6, 0xb7, - 0xd2, 0xc0, 0xf9, 0x2d, 0x7a, 0x5b, 0xd8, 0x4a, 0x3b, 0xcf, 0x23, 0x5b, 0x8c, 0xc1, 0x20, 0xa2, - 0x86, 0x51, 0x2d, 0xca, 0x37, 0xdf, 0x7e, 0x98, 0x43, 0x79, 0xe9, 0xc0, 0x25, 0x24, 0x43, 0xfc, - 0x0f, 0x47, 0x6b, 0x4e, 0x67, 0xc3, 0xdf, 0x78, 0xdb, 0xaf, 0xd0, 0x4e, 0x75, 0x1e, 0xf4, 0xe2, - 0x49, 0x98, 0x22, 0x5d, 0xce, 0xaa, 0x6e, 0x5c, 0x74, 0xc7, 0xc6, 0x99, 0x2a, 0xbe, 0x54, 0xda, - 0xd6, 0x3a, 0x1d, 0x6c, 0x6c, 0x61, 0xf4, 0x10, 0x67, 0xa0, 0x6b, 0xdd, 0x6e, 0x35, 0xd8, 0x2a, - 0xf2, 0x5e, 0x95, 0x7b, 0x21, 0x67, 0xb7, 0xcc, 0x2e, 0x26, 0x82, 0x9a, 0x0b, 0x39, 0x97, 0xf0, - 0xcb, 0x5d, 0xc5, 0x5d, 0x67, 0x7b, 0x9e, 0x94, 0x55, 0xec, 0xea, 0x75, 0xf7, 0x07, 0x95, 0xfe, - 0xc7, 0xc6, 0xc9, 0xaf, 0xf4, 0xed, 0x8c, 0x33, 0x31, 0x9d, 0xb1, 0xcf, 0xf8, 0x7c, 0x98, 0xe9, - 0x88, 0x95, 0x8c, 0x33, 0x30, 0xdd, 0xf2, 0xb2, 0xf8, 0x67, 0x67, 0xc2, 0x49, 0xe8, 0x6f, 0x13, - 0x75, 0xd7, 0x42, 0x85, 0x27, 0xd3, 0x2a, 0x3c, 0x62, 0x7b, 0xf1, 0x04, 0x1c, 0x6b, 0xd4, 0x6a, - 0xcd, 0xb5, 0x62, 0xf5, 0xc1, 0xe0, 0xcc, 0xfa, 0x26, 0x7a, 0x59, 0x16, 0xe6, 0xea, 0x66, 0x67, - 0x0f, 0x07, 0x38, 0x57, 0x38, 0xa7, 0xac, 0xb0, 0x9c, 0x32, 0xfb, 0xe4, 0xa4, 0x9c, 0x84, 0xbc, - 0x66, 0xd8, 0x97, 0xb0, 0x67, 0xc3, 0xb3, 0x37, 0x06, 0xe3, 0x7b, 0xc3, 0x1d, 0x81, 0xca, 0xc3, - 0x78, 0xd7, 0x00, 0x49, 0xf2, 0x5c, 0x45, 0x00, 0x79, 0x16, 0x66, 0x6c, 0xba, 0x61, 0xdc, 0x08, - 0xf9, 0x05, 0x70, 0x69, 0x84, 0x45, 0xea, 0xb1, 0x20, 0x33, 0x16, 0xc9, 0x1b, 0x7a, 0x95, 0xdf, - 0x7f, 0x6c, 0x70, 0x10, 0x17, 0x0f, 0xc2, 0x58, 0x32, 0x90, 0x5f, 0x31, 0xea, 0x99, 0xf8, 0x29, - 0x38, 0xce, 0x9a, 0x7d, 0xb3, 0xb4, 0x52, 0x5c, 0x5d, 0x2d, 0x57, 0x97, 0xcb, 0xcd, 0xca, 0x22, - 0xdd, 0x80, 0x0a, 0x52, 0x8a, 0x8d, 0x46, 0x79, 0x6d, 0xbd, 0x51, 0x6f, 0x96, 0x9f, 0x55, 0x2a, - 0x97, 0x17, 0x89, 0x5b, 0x24, 0x39, 0xd7, 0xe4, 0x39, 0xb0, 0x16, 0xab, 0xf5, 0xf3, 0x65, 0xb5, - 0xb0, 0x7d, 0xb6, 0x08, 0xd3, 0xa1, 0x81, 0xc2, 0xe5, 0x6e, 0x11, 0x6f, 0x6a, 0xbb, 0x1d, 0x66, - 0x53, 0x17, 0x8e, 0xb8, 0xdc, 0x11, 0xd9, 0xd4, 0x8c, 0xce, 0xe5, 0x42, 0x46, 0x29, 0xc0, 0x4c, - 0x78, 0x4c, 0x28, 0x48, 0xe8, 0xcd, 0xd7, 0xc0, 0xd4, 0x79, 0xd3, 0xba, 0x48, 0x7c, 0xf9, 0xd0, - 0xbb, 0x68, 0x6c, 0x1b, 0xef, 0x94, 0x70, 0xc8, 0x00, 0x7b, 0x85, 0xb8, 0xc7, 0x88, 0x47, 0x6d, - 0x7e, 0xe0, 0x49, 0xe0, 0x33, 0x30, 0x7d, 0xc9, 0xcb, 0x1d, 0xb4, 0xf4, 0x50, 0x12, 0xfa, 0xef, - 0x62, 0x3e, 0x20, 0x83, 0x8b, 0x4c, 0xdf, 0x47, 0xe1, 0x4d, 0x12, 0xe4, 0x97, 0xb1, 0x53, 0xec, - 0x74, 0xc2, 0x72, 0x7b, 0xa9, 0xf0, 0xe9, 0x2e, 0xae, 0x12, 0xc5, 0x4e, 0x27, 0xba, 0x51, 0x85, - 0x04, 0xe4, 0x9d, 0x42, 0xe0, 0xd2, 0x04, 0x7d, 0x27, 0x07, 0x14, 0x98, 0xbe, 0xc4, 0xde, 0x2f, - 0xfb, 0x7e, 0x0e, 0x8f, 0x86, 0xcc, 0xa4, 0xdb, 0x82, 0xb8, 0x46, 0x99, 0x78, 0x7f, 0x09, 0x2f, - 0x9f, 0xf2, 0x00, 0x4c, 0xec, 0xda, 0xb8, 0xa4, 0xd9, 0xde, 0xd0, 0xc6, 0xd7, 0xb4, 0x76, 0xe1, - 0x21, 0xdc, 0x72, 0xe6, 0x2b, 0x3b, 0xee, 0xc4, 0x67, 0x83, 0x66, 0xf4, 0x43, 0x05, 0xb1, 0x77, - 0xd5, 0xa3, 0xe0, 0x4e, 0x1e, 0x2f, 0xe9, 0xce, 0x76, 0x69, 0x5b, 0x73, 0xd8, 0x8e, 0x85, 0xff, - 0x8e, 0x5e, 0x34, 0x04, 0x9c, 0xb1, 0x3b, 0xfc, 0x91, 0x87, 0x44, 0x13, 0x83, 0x38, 0x82, 0x6d, - 0xf9, 0x61, 0x40, 0xfc, 0x07, 0x09, 0xb2, 0xb5, 0x2e, 0x36, 0x84, 0x4f, 0x44, 0xf9, 0xb2, 0x95, - 0x7a, 0x64, 0xfb, 0x2a, 0x71, 0x0f, 0x41, 0xbf, 0xd2, 0x6e, 0xc9, 0x11, 0x92, 0xbd, 0x05, 0xb2, - 0xba, 0xb1, 0x69, 0x32, 0xcb, 0xf6, 0xea, 0x08, 0x5b, 0xa7, 0x62, 0x6c, 0x9a, 0x2a, 0xc9, 0x28, - 0xea, 0x1c, 0x18, 0x57, 0x76, 0xfa, 0xe2, 0xfe, 0xda, 0x24, 0xe4, 0xa9, 0x3a, 0xa3, 0x97, 0xc8, - 0x20, 0x17, 0xdb, 0xed, 0x08, 0xc1, 0x4b, 0xfb, 0x04, 0x6f, 0x92, 0xdf, 0x7c, 0x4c, 0xfc, 0x77, - 0x3e, 0xa0, 0x8d, 0x60, 0xdf, 0xce, 0x9a, 0x54, 0xb1, 0xdd, 0x8e, 0xf6, 0x43, 0xf6, 0x0b, 0x94, - 0xf8, 0x02, 0xc3, 0x2d, 0x5c, 0x16, 0x6b, 0xe1, 0x89, 0x07, 0x82, 0x48, 0xfe, 0xd2, 0x87, 0xe8, - 0x9f, 0x24, 0x98, 0x58, 0xd5, 0x6d, 0xc7, 0xc5, 0xa6, 0x28, 0x82, 0xcd, 0x35, 0x30, 0xe5, 0x89, - 0xc6, 0xed, 0xf2, 0xdc, 0xfe, 0x3c, 0x48, 0xe0, 0x67, 0xe2, 0xf7, 0xf3, 0xe8, 0x3c, 0x2d, 0xbe, - 0xf6, 0x8c, 0x8b, 0xe8, 0x93, 0x26, 0x41, 0xb1, 0x52, 0x6f, 0xb1, 0xbf, 0xed, 0x0b, 0x7c, 0x8d, - 0x13, 0xf8, 0x1d, 0xc3, 0x14, 0x99, 0xbe, 0xd0, 0x3f, 0x2d, 0x01, 0xb8, 0x65, 0xb3, 0xe3, 0x7c, - 0x4f, 0xe2, 0x0e, 0xe9, 0xc7, 0x48, 0xf7, 0x65, 0x61, 0xe9, 0xae, 0xf1, 0xd2, 0xfd, 0xc1, 0xc1, - 0x55, 0x8d, 0x3b, 0xb6, 0xa7, 0x14, 0x40, 0xd6, 0x7d, 0xd1, 0xba, 0x8f, 0xe8, 0x4d, 0xbe, 0x50, - 0xd7, 0x39, 0xa1, 0xde, 0x35, 0x64, 0x49, 0xe9, 0xcb, 0xf5, 0x2f, 0x25, 0x98, 0xa8, 0x63, 0xc7, - 0xed, 0x26, 0xd1, 0x39, 0x91, 0x1e, 0x3e, 0xd4, 0xb6, 0x25, 0xc1, 0xb6, 0xfd, 0xcd, 0x8c, 0x68, - 0xb0, 0x9f, 0x40, 0x32, 0x8c, 0xa7, 0x88, 0xd5, 0x87, 0x47, 0x85, 0x82, 0xfd, 0x0c, 0xa2, 0x96, - 0xbe, 0x74, 0xdf, 0x20, 0xf9, 0xee, 0x16, 0xfc, 0x69, 0x9b, 0xb0, 0x59, 0x9c, 0xd9, 0x6f, 0x16, - 0x8b, 0x9f, 0xb6, 0x09, 0xd7, 0x31, 0xda, 0x7b, 0x20, 0xb1, 0xb1, 0x31, 0x82, 0x8d, 0xfd, 0x61, - 0xe4, 0xf5, 0x5c, 0x19, 0xf2, 0x6c, 0x07, 0xe0, 0xde, 0xf8, 0x1d, 0x80, 0xc1, 0x53, 0x8b, 0x77, - 0x0e, 0x61, 0xca, 0xc5, 0x2d, 0xcb, 0xfb, 0x6c, 0x48, 0x21, 0x36, 0x6e, 0x86, 0x1c, 0x89, 0x46, - 0xca, 0xc6, 0xb9, 0xc0, 0x27, 0xc3, 0x23, 0x51, 0x76, 0xbf, 0xaa, 0x34, 0x53, 0x62, 0x14, 0x46, - 0xb0, 0x92, 0x3f, 0x0c, 0x0a, 0x6f, 0x57, 0x00, 0xd6, 0x77, 0x2f, 0x74, 0x74, 0x7b, 0x5b, 0x37, - 0xb6, 0xd0, 0xbf, 0x67, 0x60, 0x86, 0xbd, 0xd2, 0xa0, 0x9a, 0xb1, 0xe6, 0x5f, 0xa4, 0x51, 0x50, - 0x00, 0x79, 0xd7, 0xd2, 0xd9, 0x32, 0x80, 0xfb, 0xa8, 0xdc, 0xed, 0xbb, 0x67, 0x65, 0x7b, 0xc2, - 0x29, 0xb8, 0x62, 0x08, 0x38, 0x98, 0x0f, 0x95, 0x1e, 0xb8, 0x69, 0x85, 0x23, 0xa7, 0xe6, 0xf8, - 0xc8, 0xa9, 0xdc, 0x19, 0xcb, 0x7c, 0xcf, 0x19, 0x4b, 0x17, 0x47, 0x5b, 0x7f, 0x36, 0x26, 0xfe, - 0x3b, 0xb2, 0x4a, 0x9e, 0xdd, 0x3f, 0x1e, 0x32, 0x75, 0x83, 0x6c, 0xea, 0x30, 0xf7, 0xe1, 0x20, - 0x01, 0xbd, 0x2f, 0x98, 0xc8, 0x98, 0x82, 0x56, 0x70, 0x02, 0x31, 0x70, 0x65, 0x67, 0x7b, 0xcb, - 0xfe, 0xa0, 0x70, 0xa4, 0xb4, 0x90, 0xc0, 0x62, 0xa7, 0x24, 0x8c, 0x03, 0xc9, 0xe7, 0x20, 0xb4, - 0x2b, 0x1b, 0xd7, 0x9d, 0x0e, 0xa2, 0x9f, 0x4c, 0x31, 0x77, 0x86, 0x58, 0x7c, 0x51, 0x60, 0xce, - 0x3b, 0x79, 0x5a, 0x5b, 0xb8, 0xbf, 0x5c, 0x6a, 0x14, 0xf0, 0xfe, 0xd3, 0xa8, 0xe4, 0xdc, 0x29, - 0x3d, 0x63, 0x1a, 0x2c, 0xb0, 0xa0, 0xff, 0x29, 0x41, 0x9e, 0xd9, 0x0e, 0xf7, 0x1e, 0x10, 0x42, - 0xf4, 0xf2, 0x61, 0x20, 0x89, 0x0d, 0x00, 0xf0, 0xb1, 0xa4, 0x00, 0x8c, 0xc0, 0x5a, 0x78, 0x30, - 0x35, 0x00, 0xd0, 0xbf, 0x48, 0x90, 0x75, 0x6d, 0x1a, 0xb1, 0xe3, 0xd5, 0x1f, 0x15, 0x76, 0x55, - 0x0e, 0x09, 0xc0, 0x25, 0x1f, 0xa1, 0xdf, 0x0b, 0x30, 0xd5, 0xa5, 0x19, 0xfd, 0xc3, 0xfd, 0xd7, - 0x0b, 0xf4, 0x2c, 0x58, 0x0d, 0x7e, 0x43, 0xef, 0x10, 0x72, 0x77, 0x8e, 0xe7, 0x27, 0x19, 0x1c, - 0xe5, 0x51, 0x9c, 0xc4, 0xde, 0x44, 0xdf, 0x96, 0x00, 0x54, 0x6c, 0x9b, 0x9d, 0x3d, 0xbc, 0x61, - 0xe9, 0xe8, 0xea, 0x00, 0x00, 0xd6, 0xec, 0x33, 0x41, 0xb3, 0xff, 0x44, 0x58, 0xf0, 0xcb, 0xbc, - 0xe0, 0x6f, 0x8b, 0xd6, 0x3c, 0x8f, 0x78, 0x84, 0xf8, 0xef, 0x81, 0x09, 0x26, 0x47, 0x66, 0x20, - 0x8a, 0x09, 0xdf, 0xfb, 0x09, 0xbd, 0xdb, 0x17, 0xfd, 0xfd, 0x9c, 0xe8, 0x9f, 0x9e, 0x98, 0xa3, - 0x64, 0x00, 0x94, 0x86, 0x00, 0xe0, 0x28, 0x4c, 0x7b, 0x00, 0x6c, 0xa8, 0x95, 0x02, 0x46, 0x6f, - 0x95, 0x89, 0xcf, 0x03, 0x1d, 0xa9, 0x0e, 0xde, 0xd3, 0x7c, 0x59, 0x78, 0xe6, 0x1e, 0x92, 0x87, - 0x5f, 0x7e, 0x4a, 0x00, 0xfd, 0xa9, 0xd0, 0x54, 0x5d, 0x80, 0xa1, 0xc7, 0x4b, 0x7f, 0x75, 0xb6, - 0x0c, 0xb3, 0x9c, 0x89, 0xa1, 0x9c, 0x82, 0xe3, 0x5c, 0x02, 0x1d, 0xef, 0xda, 0x85, 0x23, 0x0a, - 0x82, 0x93, 0xdc, 0x17, 0xf6, 0x82, 0xdb, 0x85, 0x0c, 0xfa, 0xc0, 0x67, 0x32, 0xfe, 0xe2, 0xcd, - 0x3b, 0xb3, 0x6c, 0xd9, 0xec, 0xc3, 0x7c, 0x3c, 0xb9, 0x96, 0x69, 0x38, 0xf8, 0xe1, 0x90, 0xcf, - 0x89, 0x9f, 0x10, 0x6b, 0x35, 0x9c, 0x82, 0x09, 0xc7, 0x0a, 0xfb, 0xa1, 0x78, 0xaf, 0x61, 0xc5, - 0xca, 0xf1, 0x8a, 0x55, 0x85, 0xb3, 0xba, 0xd1, 0xea, 0xec, 0xb6, 0xb1, 0x8a, 0x3b, 0x9a, 0x2b, - 0x43, 0xbb, 0x68, 0x2f, 0xe2, 0x2e, 0x36, 0xda, 0xd8, 0x70, 0x28, 0x9f, 0xde, 0x79, 0x36, 0x81, - 0x9c, 0xbc, 0x32, 0xde, 0xcd, 0x2b, 0xe3, 0x93, 0xfa, 0xad, 0xc7, 0xc6, 0x2c, 0xde, 0xdd, 0x01, - 0x40, 0xeb, 0x76, 0x4e, 0xc7, 0x97, 0x98, 0x1a, 0x5e, 0xd5, 0xb3, 0x84, 0x57, 0xf3, 0x33, 0xa8, - 0xa1, 0xcc, 0xe8, 0x31, 0x5f, 0xfd, 0xee, 0xe3, 0xd4, 0xef, 0x66, 0x41, 0x16, 0x92, 0x69, 0x5d, - 0x77, 0x08, 0xad, 0x9b, 0x85, 0xa9, 0x60, 0x6b, 0x58, 0x56, 0xae, 0x82, 0x13, 0x9e, 0x4f, 0x6f, - 0xb5, 0x5c, 0x5e, 0xac, 0x37, 0x37, 0xd6, 0x97, 0xd5, 0xe2, 0x62, 0xb9, 0x00, 0xae, 0x7e, 0x52, - 0xbd, 0xf4, 0x5d, 0x71, 0xb3, 0xe8, 0x33, 0x12, 0xe4, 0xc8, 0x61, 0x4c, 0xf4, 0xa3, 0x23, 0xd2, - 0x1c, 0x9b, 0xf3, 0x60, 0xf2, 0xc7, 0x5d, 0xf1, 0x38, 0xef, 0x4c, 0x98, 0x84, 0xab, 0x03, 0xc5, - 0x79, 0x8f, 0x21, 0x94, 0xfe, 0xb4, 0xc6, 0x6d, 0x92, 0xf5, 0x6d, 0xf3, 0xd2, 0xf7, 0x72, 0x93, - 0x74, 0xeb, 0x7f, 0xc8, 0x4d, 0xb2, 0x0f, 0x0b, 0x63, 0x6f, 0x92, 0x7d, 0xda, 0x5d, 0x4c, 0x33, - 0x45, 0xcf, 0xc9, 0xf9, 0xf3, 0xbf, 0xe7, 0x49, 0x07, 0xda, 0xc8, 0x2a, 0xc2, 0xac, 0x6e, 0x38, - 0xd8, 0x32, 0xb4, 0xce, 0x52, 0x47, 0xdb, 0xf2, 0xec, 0xd3, 0xde, 0xdd, 0x8b, 0x4a, 0x28, 0x8f, - 0xca, 0xff, 0xa1, 0x9c, 0x06, 0x70, 0xf0, 0x4e, 0xb7, 0xa3, 0x39, 0x81, 0xea, 0x85, 0x52, 0xc2, - 0xda, 0x97, 0xe5, 0xb5, 0xef, 0x56, 0xb8, 0x82, 0x82, 0xd6, 0xb8, 0xdc, 0xc5, 0x1b, 0x86, 0xfe, - 0x63, 0xbb, 0x24, 0xfc, 0x28, 0xd5, 0xd1, 0x7e, 0x9f, 0xb8, 0xed, 0x9c, 0x7c, 0xcf, 0x76, 0xce, - 0x3f, 0x08, 0x87, 0x35, 0xf1, 0x5a, 0xfd, 0x80, 0xb0, 0x26, 0x7e, 0x4b, 0x93, 0x7b, 0x5a, 0x9a, - 0xbf, 0xc8, 0x92, 0x15, 0x58, 0x64, 0x09, 0xa3, 0x92, 0x13, 0x5c, 0xa0, 0x7c, 0xa5, 0x50, 0xdc, - 0x94, 0xb8, 0x6a, 0x8c, 0x61, 0x01, 0x5c, 0x86, 0x39, 0x5a, 0xf4, 0x82, 0x69, 0x5e, 0xdc, 0xd1, - 0xac, 0x8b, 0xc8, 0x3a, 0x90, 0x2a, 0xc6, 0xee, 0x25, 0x45, 0x6e, 0x90, 0x7e, 0x5c, 0x78, 0xce, - 0xc0, 0x89, 0xcb, 0xe3, 0x79, 0x3c, 0x9b, 0x49, 0xaf, 0x13, 0x9a, 0x42, 0x88, 0x30, 0x98, 0x3e, - 0xae, 0x7f, 0xec, 0xe3, 0xea, 0x75, 0xf4, 0xe1, 0x75, 0xf8, 0x51, 0xe2, 0x8a, 0xbe, 0x30, 0x1c, - 0x76, 0x1e, 0x5f, 0x43, 0x60, 0x57, 0x00, 0xf9, 0xa2, 0xef, 0xfa, 0xe3, 0x3e, 0x86, 0x2b, 0x94, - 0x4d, 0x0f, 0xcd, 0x08, 0x96, 0xc7, 0x82, 0xe6, 0x71, 0x9e, 0x85, 0x5a, 0x37, 0x55, 0x4c, 0x3f, - 0x2f, 0xbc, 0xbf, 0xd5, 0x57, 0x40, 0x94, 0xbb, 0xf1, 0xb4, 0x4a, 0xb1, 0xcd, 0x31, 0x71, 0x36, - 0xd3, 0x47, 0xf3, 0x85, 0x39, 0x98, 0xf2, 0x02, 0xcf, 0x90, 0x7b, 0x91, 0x7c, 0x0c, 0x4f, 0x42, - 0xde, 0x36, 0x77, 0xad, 0x16, 0x66, 0x3b, 0x8e, 0xec, 0x6d, 0x88, 0xdd, 0xb1, 0x81, 0xe3, 0xf9, - 0x3e, 0x93, 0x21, 0x9b, 0xd8, 0x64, 0x88, 0x36, 0x48, 0xe3, 0x06, 0xf8, 0x17, 0x09, 0x07, 0xb3, - 0xe7, 0x30, 0xab, 0x63, 0xe7, 0xf1, 0x38, 0xc6, 0xff, 0x81, 0xd0, 0xde, 0xcb, 0x80, 0x9a, 0x24, - 0x53, 0xb9, 0xda, 0x10, 0x86, 0xea, 0xd5, 0x70, 0xa5, 0x97, 0x83, 0x59, 0xa8, 0xc4, 0x22, 0xdd, - 0x50, 0x57, 0x0b, 0x32, 0x7a, 0x6e, 0x16, 0x0a, 0x94, 0xb5, 0x9a, 0x6f, 0xac, 0xa1, 0x97, 0x66, - 0x0e, 0xdb, 0x22, 0x8d, 0x9e, 0x62, 0x7e, 0x52, 0x12, 0x0d, 0x98, 0xcb, 0x09, 0x3e, 0xa8, 0x5d, - 0x84, 0x26, 0x0d, 0xd1, 0xcc, 0x62, 0x94, 0x0f, 0xfd, 0x56, 0x46, 0x24, 0xfe, 0xae, 0x18, 0x8b, - 0x63, 0x08, 0x96, 0x94, 0xf5, 0xe2, 0x87, 0x2d, 0x59, 0xe6, 0xce, 0x86, 0xd5, 0x41, 0xff, 0xa7, - 0x50, 0x78, 0xf3, 0x08, 0xf3, 0x5f, 0x8a, 0x36, 0xff, 0xc9, 0x92, 0x71, 0x27, 0xd8, 0xab, 0xea, - 0x0c, 0x31, 0x7c, 0x2b, 0x37, 0xc0, 0x9c, 0xd6, 0x6e, 0xaf, 0x6b, 0x5b, 0xb8, 0xe4, 0xce, 0xab, - 0x0d, 0x87, 0xc5, 0x16, 0xea, 0x49, 0x8d, 0xed, 0x8a, 0xc4, 0xd7, 0x41, 0x39, 0x90, 0x98, 0x7c, - 0xc6, 0x32, 0xbc, 0xb9, 0x43, 0x42, 0x6b, 0x5b, 0x0b, 0x22, 0x9d, 0xb1, 0x37, 0x41, 0xcf, 0x26, - 0x01, 0xbe, 0xd3, 0xd7, 0xac, 0xdf, 0x93, 0x60, 0xc2, 0x95, 0x77, 0xb1, 0xdd, 0x46, 0x4f, 0xe4, - 0x02, 0x02, 0x46, 0xfa, 0x96, 0xfd, 0xb4, 0xb0, 0x53, 0x9f, 0x57, 0x43, 0x4a, 0x3f, 0x02, 0x93, - 0x40, 0x88, 0x12, 0x27, 0x44, 0x31, 0xdf, 0xbd, 0xd8, 0x22, 0xd2, 0x17, 0xdf, 0x47, 0x25, 0x98, - 0xf5, 0xe6, 0x11, 0x4b, 0xd8, 0x69, 0x6d, 0xa3, 0x3b, 0x44, 0x17, 0x9a, 0x58, 0x4b, 0xf3, 0xf7, - 0x64, 0x3b, 0xe8, 0x3b, 0x99, 0x84, 0x2a, 0xcf, 0x95, 0x1c, 0xb1, 0x4a, 0x97, 0x48, 0x17, 0xe3, - 0x08, 0xa6, 0x2f, 0xcc, 0xc7, 0x24, 0x80, 0x86, 0xe9, 0xcf, 0x75, 0x0f, 0x20, 0xc9, 0x5f, 0x10, - 0xde, 0xae, 0x65, 0x15, 0x0f, 0x8a, 0x4d, 0xde, 0x73, 0x08, 0xba, 0x26, 0x0d, 0x2a, 0x69, 0x2c, - 0x6d, 0x7d, 0x6a, 0x71, 0xb7, 0xdb, 0xd1, 0x5b, 0x9a, 0xd3, 0xeb, 0x4f, 0x17, 0x2d, 0x5e, 0x72, - 0x69, 0x68, 0x22, 0xa3, 0xd0, 0x2f, 0x23, 0x42, 0x96, 0x34, 0xf4, 0x8c, 0xe4, 0x85, 0x9e, 0x11, - 0xf4, 0x91, 0x19, 0x40, 0x7c, 0x0c, 0xea, 0x29, 0xc3, 0xd1, 0x5a, 0x17, 0x1b, 0x0b, 0x16, 0xd6, - 0xda, 0x2d, 0x6b, 0x77, 0xe7, 0x82, 0x1d, 0x76, 0x06, 0x8d, 0xd7, 0xd1, 0xd0, 0xd2, 0xb1, 0xc4, - 0x2d, 0x1d, 0xa3, 0x9f, 0x92, 0x45, 0x03, 0x21, 0x85, 0x36, 0x38, 0x42, 0x3c, 0x0c, 0x31, 0xd4, - 0x25, 0x72, 0x61, 0xea, 0x59, 0x25, 0xce, 0x26, 0x59, 0x25, 0x7e, 0xbd, 0x50, 0x58, 0x25, 0xa1, - 0x7a, 0x8d, 0xc5, 0x13, 0x6d, 0xae, 0x8e, 0x9d, 0x08, 0x78, 0xaf, 0x87, 0xd9, 0x0b, 0xc1, 0x17, - 0x1f, 0x62, 0x3e, 0xb1, 0x8f, 0x7f, 0xe8, 0x1b, 0x92, 0xae, 0xc0, 0xf0, 0x2c, 0x44, 0xa0, 0xeb, - 0x23, 0x28, 0x89, 0x38, 0xa1, 0x25, 0x5a, 0x4e, 0x89, 0x2d, 0x3f, 0x7d, 0x14, 0x3e, 0x28, 0xc1, - 0x34, 0xb9, 0x0a, 0x75, 0xe1, 0x32, 0x39, 0x16, 0x29, 0x68, 0x94, 0xbc, 0x30, 0x2c, 0x66, 0x05, - 0xb2, 0x1d, 0xdd, 0xb8, 0xe8, 0x79, 0x0f, 0xba, 0xcf, 0xc1, 0xc5, 0x7a, 0x52, 0x9f, 0x8b, 0xf5, - 0xfc, 0x7d, 0x0a, 0xbf, 0xdc, 0x03, 0xdd, 0xf4, 0x3c, 0x90, 0x5c, 0xfa, 0x62, 0xfc, 0xbb, 0x2c, - 0xe4, 0xeb, 0x58, 0xb3, 0x5a, 0xdb, 0xe8, 0x9d, 0x52, 0xdf, 0xa9, 0xc2, 0x24, 0x3f, 0x55, 0x58, - 0x82, 0x89, 0x4d, 0xbd, 0xe3, 0x60, 0x8b, 0x7a, 0x54, 0x87, 0xbb, 0x76, 0xda, 0xc4, 0x17, 0x3a, - 0x66, 0xeb, 0xe2, 0x3c, 0x33, 0xdd, 0xe7, 0xbd, 0x40, 0xac, 0xf3, 0x4b, 0xe4, 0x27, 0xd5, 0xfb, - 0xd9, 0x35, 0x08, 0x6d, 0xd3, 0x72, 0xa2, 0xee, 0xd8, 0x88, 0xa0, 0x52, 0x37, 0x2d, 0x47, 0xa5, - 0x3f, 0xba, 0x30, 0x6f, 0xee, 0x76, 0x3a, 0x0d, 0xfc, 0xb0, 0xe3, 0x4d, 0xdb, 0xbc, 0x77, 0xd7, - 0x58, 0x34, 0x37, 0x37, 0x6d, 0x4c, 0x17, 0x0d, 0x72, 0x2a, 0x7b, 0x53, 0x8e, 0x43, 0xae, 0xa3, - 0xef, 0xe8, 0x74, 0xa2, 0x91, 0x53, 0xe9, 0x8b, 0x72, 0x13, 0x14, 0x82, 0x39, 0x0e, 0x65, 0xf4, - 0x54, 0x9e, 0x34, 0xcd, 0x7d, 0xe9, 0xae, 0xce, 0x5c, 0xc4, 0x97, 0xed, 0x53, 0x13, 0xe4, 0x3b, - 0x79, 0xe6, 0x8f, 0xaf, 0x88, 0xec, 0x77, 0x50, 0x89, 0x47, 0xcf, 0x60, 0x2d, 0xdc, 0x32, 0xad, - 0xb6, 0x27, 0x9b, 0xe8, 0x09, 0x06, 0xcb, 0x97, 0x6c, 0x97, 0xa2, 0x6f, 0xe1, 0xe9, 0x6b, 0xda, - 0xdb, 0xf2, 0x6e, 0xb7, 0xe9, 0x16, 0x7d, 0x5e, 0x77, 0xb6, 0xd7, 0xb0, 0xa3, 0xa1, 0xbf, 0x93, - 0xfb, 0x6a, 0xdc, 0xf4, 0xff, 0xa7, 0x71, 0x03, 0x34, 0x8e, 0x86, 0xc1, 0x72, 0x76, 0x2d, 0xc3, - 0x95, 0x23, 0xf3, 0x4a, 0x0d, 0xa5, 0x28, 0x77, 0xc1, 0x55, 0xc1, 0x9b, 0xb7, 0x54, 0xba, 0xc8, - 0xa6, 0xad, 0x53, 0x24, 0x7b, 0x74, 0x06, 0x65, 0x1d, 0xae, 0xa3, 0x1f, 0x57, 0x1a, 0x6b, 0xab, - 0x2b, 0xfa, 0xd6, 0x76, 0x47, 0xdf, 0xda, 0x76, 0xec, 0x8a, 0x61, 0x3b, 0x58, 0x6b, 0xd7, 0x36, - 0x55, 0x7a, 0x3b, 0x0e, 0x10, 0x3a, 0x22, 0x59, 0x79, 0x8f, 0x6b, 0xb1, 0xd1, 0x2d, 0xac, 0x29, - 0x11, 0x2d, 0xe5, 0xe9, 0x6e, 0x4b, 0xb1, 0x77, 0x3b, 0x3e, 0xa6, 0xd7, 0xf4, 0x60, 0x1a, 0xa8, - 0xfa, 0x6e, 0x87, 0x34, 0x17, 0x92, 0x39, 0xe9, 0x38, 0x17, 0xc3, 0x49, 0xfa, 0xcd, 0xe6, 0xff, - 0xc9, 0x43, 0x6e, 0xd9, 0xd2, 0xba, 0xdb, 0xe8, 0xb9, 0xa1, 0xfe, 0x79, 0x54, 0x6d, 0xc2, 0xd7, - 0x4e, 0x69, 0x90, 0x76, 0xca, 0x03, 0xb4, 0x33, 0x1b, 0xd2, 0xce, 0xe8, 0x45, 0xe5, 0xb3, 0x30, - 0xd3, 0x32, 0x3b, 0x1d, 0xdc, 0x72, 0xe5, 0x51, 0x69, 0x93, 0xd5, 0x9c, 0x29, 0x95, 0x4b, 0x23, - 0xc1, 0xaa, 0xb1, 0x53, 0xa7, 0x6b, 0xe8, 0x54, 0xe9, 0x83, 0x04, 0xf4, 0x52, 0x09, 0xb2, 0xe5, - 0xf6, 0x16, 0xe6, 0xd6, 0xd9, 0x33, 0xa1, 0x75, 0xf6, 0x93, 0x90, 0x77, 0x34, 0x6b, 0x0b, 0x3b, - 0xde, 0x3a, 0x01, 0x7d, 0xf3, 0x63, 0x68, 0xcb, 0xa1, 0x18, 0xda, 0x3f, 0x08, 0x59, 0x57, 0x66, - 0xcc, 0xc9, 0xfc, 0xba, 0x7e, 0xf0, 0x13, 0xd9, 0xcf, 0xbb, 0x25, 0xce, 0xbb, 0xb5, 0x56, 0xc9, - 0x0f, 0xbd, 0x58, 0xe7, 0xf6, 0x61, 0x4d, 0x2e, 0xfa, 0x6c, 0x99, 0x46, 0x65, 0x47, 0xdb, 0xc2, - 0xac, 0x9a, 0x41, 0x82, 0xf7, 0xb5, 0xbc, 0x63, 0x3e, 0xa4, 0xb3, 0x68, 0x91, 0x41, 0x82, 0x5b, - 0x85, 0x6d, 0xbd, 0xdd, 0xc6, 0x06, 0x6b, 0xd9, 0xec, 0xed, 0xec, 0x69, 0xc8, 0xba, 0x3c, 0xb8, - 0xfa, 0xe3, 0x1a, 0x0b, 0x85, 0x23, 0xca, 0x8c, 0xdb, 0xac, 0x68, 0xe3, 0x2d, 0x64, 0xf8, 0x35, - 0x55, 0x11, 0xb7, 0x1d, 0x5a, 0xb9, 0xfe, 0x8d, 0xeb, 0x29, 0x90, 0x33, 0xcc, 0x36, 0x1e, 0x38, - 0x08, 0xd1, 0x5c, 0xca, 0xd3, 0x20, 0x87, 0xdb, 0x6e, 0xaf, 0x20, 0x93, 0xec, 0xa7, 0xe3, 0x65, - 0xa9, 0xd2, 0xcc, 0xc9, 0x7c, 0x83, 0xfa, 0x71, 0x9b, 0x7e, 0x03, 0xfc, 0xd9, 0x09, 0x38, 0x4a, - 0xfb, 0x80, 0xfa, 0xee, 0x05, 0x97, 0xd4, 0x05, 0x8c, 0x1e, 0xed, 0x3f, 0x70, 0x1d, 0xe5, 0x95, - 0xfd, 0x38, 0xe4, 0xec, 0xdd, 0x0b, 0xbe, 0x11, 0x4a, 0x5f, 0xc2, 0x4d, 0x57, 0x1a, 0xc9, 0x70, - 0x26, 0x0f, 0x3b, 0x9c, 0x71, 0x43, 0x93, 0xec, 0x35, 0xfe, 0x60, 0x20, 0xa3, 0xc7, 0x23, 0xbc, - 0x81, 0xac, 0xdf, 0x30, 0x74, 0x0a, 0x26, 0xb4, 0x4d, 0x07, 0x5b, 0x81, 0x99, 0xc8, 0x5e, 0xdd, - 0xa1, 0xf2, 0x02, 0xde, 0x34, 0x2d, 0x57, 0x2c, 0x34, 0x84, 0xba, 0xff, 0x1e, 0x6a, 0xb9, 0xc0, - 0xed, 0x90, 0xdd, 0x0c, 0xc7, 0x0c, 0x73, 0x11, 0x77, 0x99, 0x9c, 0x29, 0x8a, 0xb3, 0xa4, 0x05, - 0xec, 0xff, 0xb0, 0xaf, 0x2b, 0x99, 0xdb, 0xdf, 0x95, 0xa0, 0x4f, 0x24, 0x9d, 0x33, 0xf7, 0x00, - 0x3d, 0x32, 0x0b, 0x4d, 0x79, 0x26, 0xcc, 0xb4, 0x99, 0x8b, 0x56, 0x4b, 0xf7, 0x5b, 0x49, 0xe4, - 0x7f, 0x5c, 0xe6, 0x40, 0x91, 0xb2, 0x61, 0x45, 0x5a, 0x86, 0x49, 0x72, 0x90, 0xd9, 0xd5, 0xa4, - 0x5c, 0x8f, 0x4b, 0x3c, 0x99, 0xd6, 0xf9, 0x95, 0x0a, 0x89, 0x6d, 0xbe, 0xc4, 0x7e, 0x51, 0xfd, - 0x9f, 0x93, 0xcd, 0xbe, 0xe3, 0x25, 0x94, 0x7e, 0x73, 0xfc, 0xed, 0x3c, 0x5c, 0x55, 0xb2, 0x4c, - 0xdb, 0x26, 0x67, 0x60, 0x7a, 0x1b, 0xe6, 0x6b, 0x25, 0xee, 0x36, 0x8d, 0xc7, 0x75, 0xf3, 0xeb, - 0xd7, 0xa0, 0xc6, 0xd7, 0x34, 0xbe, 0x2c, 0x1c, 0x02, 0xc6, 0xdf, 0x7f, 0x88, 0x10, 0xfa, 0xf7, - 0x46, 0x23, 0x79, 0x5b, 0x46, 0x24, 0x2a, 0x4d, 0x42, 0x59, 0xa5, 0xdf, 0x5c, 0x3e, 0x2f, 0xc1, - 0xd5, 0xbd, 0xdc, 0x6c, 0x18, 0xb6, 0xdf, 0x60, 0xae, 0x1d, 0xd0, 0x5e, 0xf8, 0x28, 0x26, 0xb1, - 0xf7, 0x58, 0x46, 0xd4, 0x3d, 0x54, 0x5a, 0xc4, 0x62, 0x49, 0x70, 0xa2, 0x26, 0xee, 0x1e, 0xcb, - 0xc4, 0xe4, 0xd3, 0x17, 0xee, 0x27, 0xb3, 0x70, 0x74, 0xd9, 0x32, 0x77, 0xbb, 0x76, 0xd0, 0x03, - 0xfd, 0x75, 0xff, 0x0d, 0xd7, 0xbc, 0x88, 0x69, 0x70, 0x06, 0xa6, 0x2d, 0x66, 0xcd, 0x05, 0xdb, - 0xaf, 0xe1, 0xa4, 0x70, 0xef, 0x25, 0x1f, 0xa4, 0xf7, 0x0a, 0xfa, 0x99, 0x2c, 0xd7, 0xcf, 0xf4, - 0xf6, 0x1c, 0xb9, 0x3e, 0x3d, 0xc7, 0x5f, 0x49, 0x09, 0x07, 0xd5, 0x1e, 0x11, 0x45, 0xf4, 0x17, - 0x25, 0xc8, 0x6f, 0x91, 0x8c, 0xac, 0xbb, 0x78, 0xb2, 0x58, 0xcd, 0x08, 0x71, 0x95, 0xfd, 0x1a, - 0xc8, 0x55, 0x0e, 0xeb, 0x70, 0xa2, 0x01, 0x2e, 0x9e, 0xdb, 0xf4, 0x95, 0xea, 0x55, 0x59, 0x98, - 0xf1, 0x4b, 0xaf, 0xb4, 0x6d, 0xf4, 0xc2, 0xfe, 0x1a, 0x35, 0x2b, 0xa2, 0x51, 0xfb, 0xd6, 0x99, - 0xfd, 0x51, 0x47, 0x0e, 0x8d, 0x3a, 0x7d, 0x47, 0x97, 0x99, 0x88, 0xd1, 0x05, 0x3d, 0x47, 0x16, - 0xbd, 0x8f, 0x8a, 0xef, 0x5a, 0x49, 0x6d, 0x1e, 0xcf, 0x83, 0x85, 0xe0, 0xad, 0x58, 0x83, 0x6b, - 0x95, 0xbe, 0x92, 0xbc, 0x47, 0x82, 0x63, 0xfb, 0x3b, 0xf3, 0xef, 0xe3, 0xbd, 0xd0, 0xdc, 0x3a, - 0xd9, 0xbe, 0x17, 0x1a, 0x79, 0xe3, 0x37, 0xe9, 0x62, 0x43, 0x8a, 0x70, 0xf6, 0xde, 0xe0, 0x4e, - 0x5c, 0x2c, 0x68, 0x88, 0x20, 0xd1, 0xf4, 0x05, 0xf8, 0x8b, 0x32, 0x4c, 0xd5, 0xb1, 0xb3, 0xaa, - 0x5d, 0x36, 0x77, 0x1d, 0xa4, 0x89, 0x6e, 0xcf, 0x3d, 0x03, 0xf2, 0x1d, 0xf2, 0x0b, 0xbb, 0xe6, - 0xff, 0x4c, 0xdf, 0xfd, 0x2d, 0xe2, 0xfb, 0x43, 0x49, 0xab, 0x2c, 0x3f, 0x1f, 0xcb, 0x45, 0x64, - 0x77, 0xd4, 0xe7, 0x6e, 0x24, 0x5b, 0x3b, 0x89, 0xf6, 0x4e, 0xa3, 0x8a, 0x4e, 0x1f, 0x96, 0x9f, - 0x92, 0x61, 0xb6, 0x8e, 0x9d, 0x8a, 0xbd, 0xa4, 0xed, 0x99, 0x96, 0xee, 0xe0, 0xf0, 0x3d, 0x9f, - 0xf1, 0xd0, 0x9c, 0x06, 0xd0, 0xfd, 0xdf, 0x58, 0x84, 0xa9, 0x50, 0x0a, 0xfa, 0xad, 0xa4, 0x8e, - 0x42, 0x1c, 0x1f, 0x23, 0x01, 0x21, 0x91, 0x8f, 0x45, 0x5c, 0xf1, 0xe9, 0x03, 0xf1, 0x39, 0x89, - 0x01, 0x51, 0xb4, 0x5a, 0xdb, 0xfa, 0x1e, 0x6e, 0x27, 0x04, 0xc2, 0xfb, 0x2d, 0x00, 0xc2, 0x27, - 0x94, 0xd8, 0x7d, 0x85, 0xe3, 0x63, 0x14, 0xee, 0x2b, 0x71, 0x04, 0xc7, 0x12, 0x24, 0xca, 0xed, - 0x7a, 0xd8, 0x7a, 0xe6, 0xbd, 0xa2, 0x62, 0x0d, 0x4c, 0x36, 0x29, 0x6c, 0xb2, 0x0d, 0xd5, 0xb1, - 0xd0, 0xb2, 0x07, 0xe9, 0x74, 0x36, 0x8d, 0x8e, 0xa5, 0x6f, 0xd1, 0xe9, 0x0b, 0xfd, 0x1d, 0x32, - 0x9c, 0xf0, 0xa3, 0xa7, 0xd4, 0xb1, 0xb3, 0xa8, 0xd9, 0xdb, 0x17, 0x4c, 0xcd, 0x6a, 0xa3, 0xd2, - 0x08, 0x4e, 0xfc, 0xa1, 0xcf, 0x86, 0x41, 0xa8, 0xf2, 0x20, 0xf4, 0x75, 0x15, 0xed, 0xcb, 0xcb, - 0x28, 0x3a, 0x99, 0x58, 0x6f, 0xd6, 0xdf, 0xf1, 0xc1, 0xfa, 0x21, 0x0e, 0xac, 0xbb, 0x87, 0x65, - 0x31, 0x7d, 0xe0, 0x7e, 0x85, 0x8e, 0x08, 0x21, 0xaf, 0xe6, 0x07, 0x45, 0x01, 0x8b, 0xf0, 0x6a, - 0x95, 0x23, 0xbd, 0x5a, 0x87, 0x1a, 0x23, 0x06, 0x7a, 0x24, 0xa7, 0x3b, 0x46, 0x1c, 0xa2, 0xb7, - 0xf1, 0x5b, 0x64, 0x28, 0x90, 0xf0, 0x59, 0x21, 0x8f, 0xef, 0x70, 0x34, 0xea, 0x78, 0x74, 0xf6, - 0x79, 0x97, 0x4f, 0x24, 0xf5, 0x2e, 0x47, 0x6f, 0x4e, 0xea, 0x43, 0xde, 0xcb, 0xed, 0x48, 0x10, - 0x4b, 0xe4, 0x22, 0x3e, 0x80, 0x83, 0xf4, 0x41, 0xfb, 0x6f, 0x32, 0x80, 0xdb, 0xa0, 0xd9, 0xd9, - 0x87, 0x67, 0x89, 0xc2, 0x75, 0x4b, 0xd8, 0xaf, 0xde, 0x05, 0xea, 0x44, 0x0f, 0x50, 0x94, 0x62, - 0x70, 0xaa, 0xe2, 0xd1, 0xa4, 0xbe, 0x95, 0x01, 0x57, 0x23, 0x81, 0x25, 0x91, 0xb7, 0x65, 0x64, - 0xd9, 0xe9, 0x03, 0xf2, 0x3f, 0x24, 0xc8, 0x35, 0xcc, 0x3a, 0x76, 0x0e, 0x6e, 0x0a, 0x24, 0x3e, - 0xb6, 0x4f, 0xca, 0x1d, 0xc5, 0xb1, 0xfd, 0x7e, 0x84, 0xc6, 0x10, 0x8d, 0x4c, 0x82, 0x99, 0x86, - 0x59, 0xf2, 0x17, 0xa7, 0xc4, 0x7d, 0x55, 0xc5, 0xef, 0xd4, 0xf6, 0x2b, 0x18, 0x14, 0x73, 0xa0, - 0x3b, 0xb5, 0x07, 0xd3, 0x4b, 0x5f, 0x6e, 0x77, 0xc0, 0xd1, 0x0d, 0xa3, 0x6d, 0xaa, 0xb8, 0x6d, - 0xb2, 0x95, 0x6e, 0x45, 0x81, 0xec, 0xae, 0xd1, 0x36, 0x09, 0xcb, 0x39, 0x95, 0x3c, 0xbb, 0x69, - 0x16, 0x6e, 0x9b, 0xcc, 0x37, 0x80, 0x3c, 0xa3, 0x2f, 0xcb, 0x90, 0x75, 0xff, 0x15, 0x17, 0xf5, - 0x5b, 0xe4, 0x84, 0x81, 0x08, 0x5c, 0xf2, 0x23, 0xb1, 0x84, 0xee, 0x0d, 0xad, 0xfd, 0x53, 0x0f, - 0xd6, 0xeb, 0xa2, 0xca, 0x0b, 0x89, 0x22, 0x58, 0xf3, 0x57, 0x4e, 0xc1, 0xc4, 0x85, 0x8e, 0xd9, - 0xba, 0x18, 0x9c, 0x97, 0x67, 0xaf, 0xca, 0x4d, 0x90, 0xb3, 0x34, 0x63, 0x0b, 0xb3, 0x3d, 0x85, - 0xe3, 0x3d, 0x7d, 0x21, 0xf1, 0x7a, 0x51, 0x69, 0x16, 0xf4, 0xe6, 0x24, 0x21, 0x10, 0xfa, 0x54, - 0x3e, 0x99, 0x3e, 0x2c, 0x0e, 0x71, 0xb2, 0xac, 0x00, 0x33, 0xa5, 0x22, 0xbd, 0xbd, 0x7e, 0xad, - 0x76, 0xae, 0x5c, 0x90, 0x09, 0xcc, 0xae, 0x4c, 0x52, 0x84, 0xd9, 0x25, 0xff, 0x3d, 0x0b, 0x73, - 0x9f, 0xca, 0x1f, 0x06, 0xcc, 0x1f, 0x95, 0x60, 0x76, 0x55, 0xb7, 0x9d, 0x28, 0x6f, 0xff, 0x98, - 0xe8, 0xb9, 0x2f, 0x4a, 0x6a, 0x2a, 0x73, 0xe5, 0x08, 0x87, 0xcd, 0x4d, 0x64, 0x0e, 0xc7, 0x15, - 0x31, 0x9e, 0x63, 0x29, 0x84, 0x03, 0x7a, 0x87, 0xb4, 0xb0, 0x24, 0x13, 0x1b, 0x4a, 0x41, 0x21, - 0xe3, 0x37, 0x94, 0x22, 0xcb, 0x4e, 0x5f, 0xbe, 0x5f, 0x96, 0xe0, 0x98, 0x5b, 0x7c, 0xdc, 0xb2, - 0x54, 0xb4, 0x98, 0x07, 0x2e, 0x4b, 0x25, 0x5e, 0x19, 0xdf, 0xc7, 0xcb, 0x28, 0x56, 0xc6, 0x07, - 0x11, 0x1d, 0xb3, 0x98, 0x23, 0x96, 0x61, 0x07, 0x89, 0x39, 0x66, 0x19, 0x76, 0x78, 0x31, 0xc7, - 0x2f, 0xc5, 0x0e, 0x29, 0xe6, 0x43, 0x5b, 0x60, 0x7d, 0x8d, 0xec, 0x8b, 0x39, 0x72, 0x6d, 0x23, - 0x46, 0xcc, 0x89, 0x4f, 0xec, 0xa2, 0xb7, 0x0e, 0x29, 0xf8, 0x11, 0xaf, 0x6f, 0x0c, 0x03, 0xd3, - 0x21, 0xae, 0x71, 0xfc, 0xaa, 0x0c, 0x73, 0x8c, 0x8b, 0xfe, 0x53, 0xe6, 0x18, 0x8c, 0x12, 0x4f, - 0x99, 0x13, 0x9f, 0x01, 0xe2, 0x39, 0x1b, 0xff, 0x19, 0xa0, 0xd8, 0xf2, 0xd3, 0x07, 0xe7, 0x2b, - 0x59, 0x38, 0xe9, 0xb2, 0xb0, 0x66, 0xb6, 0xf5, 0xcd, 0xcb, 0x94, 0x8b, 0x73, 0x5a, 0x67, 0x17, - 0xdb, 0xe8, 0x5d, 0x92, 0x28, 0x4a, 0xff, 0x09, 0xc0, 0xec, 0x62, 0x8b, 0x06, 0x52, 0x63, 0x40, - 0xdd, 0x15, 0x55, 0xd9, 0xfd, 0x25, 0xf9, 0x97, 0xc9, 0xd4, 0x3c, 0x22, 0x6a, 0x88, 0x9e, 0x6b, - 0x15, 0x4e, 0xf9, 0x5f, 0x7a, 0x1d, 0x3c, 0x32, 0xfb, 0x1d, 0x3c, 0x6e, 0x04, 0x59, 0x6b, 0xb7, - 0x7d, 0xa8, 0x7a, 0x37, 0xb3, 0x49, 0x99, 0xaa, 0x9b, 0xc5, 0xcd, 0x69, 0xe3, 0xe0, 0x68, 0x5e, - 0x44, 0x4e, 0x1b, 0x3b, 0xca, 0x3c, 0xe4, 0xe9, 0x0d, 0xd9, 0xfe, 0x8a, 0x7e, 0xff, 0xcc, 0x2c, - 0x17, 0x6f, 0xda, 0xd5, 0x78, 0x35, 0xbc, 0x23, 0x91, 0x64, 0xfa, 0xf5, 0xd3, 0x81, 0x9d, 0xac, - 0x72, 0x0a, 0x76, 0xcf, 0xd0, 0x94, 0xc7, 0xb3, 0x1b, 0x56, 0xec, 0x76, 0x3b, 0x97, 0x1b, 0x2c, - 0xf8, 0x4a, 0xa2, 0xdd, 0xb0, 0x50, 0x0c, 0x17, 0xa9, 0x37, 0x86, 0x4b, 0xf2, 0xdd, 0x30, 0x8e, - 0x8f, 0x51, 0xec, 0x86, 0xc5, 0x11, 0x4c, 0x5f, 0xb4, 0x2f, 0x9b, 0xa4, 0x56, 0x33, 0x8b, 0xed, - 0xff, 0x9a, 0xfe, 0x9e, 0xd5, 0xc0, 0x3b, 0xbb, 0xf4, 0x0b, 0xfb, 0x1f, 0x7b, 0xa7, 0x89, 0xf2, - 0x34, 0xc8, 0x6f, 0x9a, 0xd6, 0x8e, 0xe6, 0x6d, 0xdc, 0xf7, 0x9e, 0x14, 0x61, 0xf1, 0xf4, 0x97, - 0x48, 0x1e, 0x95, 0xe5, 0x75, 0xe7, 0x23, 0xcf, 0xd6, 0xbb, 0x2c, 0xea, 0xa2, 0xfb, 0xa8, 0x5c, - 0x0f, 0xb3, 0x2c, 0xf8, 0x62, 0x15, 0xdb, 0x0e, 0x6e, 0xb3, 0x88, 0x15, 0x7c, 0xa2, 0x72, 0x16, - 0x66, 0x58, 0xc2, 0x92, 0xde, 0xc1, 0x36, 0x0b, 0x5a, 0xc1, 0xa5, 0x29, 0x27, 0x21, 0xaf, 0xdb, - 0xf7, 0xdb, 0xa6, 0x41, 0xfc, 0xff, 0x27, 0x55, 0xf6, 0xa6, 0xdc, 0x08, 0x47, 0x59, 0x3e, 0xdf, - 0x58, 0xa5, 0x07, 0x76, 0x7a, 0x93, 0x5d, 0xd5, 0x32, 0xcc, 0x75, 0xcb, 0xdc, 0xb2, 0xb0, 0x6d, - 0x93, 0x53, 0x53, 0x93, 0x6a, 0x28, 0x45, 0x79, 0x10, 0x8e, 0x75, 0x74, 0xe3, 0xa2, 0x4d, 0x82, - 0xf4, 0x2e, 0x31, 0xb7, 0xb1, 0x99, 0x3e, 0xc1, 0xb3, 0x43, 0x8d, 0x8d, 0xc9, 0x21, 0xfc, 0x8b, - 0xba, 0x9f, 0x0a, 0x7a, 0x49, 0x06, 0x66, 0xc2, 0x09, 0x8a, 0x06, 0x8a, 0xd7, 0x8d, 0xd9, 0xe7, - 0xb7, 0x75, 0x07, 0xbb, 0xc4, 0xd8, 0xd9, 0x94, 0xdb, 0x06, 0x14, 0xa6, 0xee, 0xfb, 0x51, 0xed, - 0x43, 0xcc, 0x15, 0x2a, 0xed, 0xa0, 0x88, 0x27, 0x98, 0xcd, 0x6c, 0x4b, 0x2e, 0x0d, 0x3d, 0x1b, - 0x94, 0xfd, 0xd4, 0x42, 0x5e, 0x1b, 0x99, 0x64, 0x5e, 0x1b, 0xca, 0x4d, 0x50, 0xd0, 0x3a, 0x1d, - 0xf3, 0x12, 0x6e, 0xfb, 0x64, 0x99, 0x6e, 0xed, 0x4b, 0x47, 0x9f, 0x1a, 0x66, 0x1e, 0x97, 0xf8, - 0x5a, 0x09, 0xb7, 0x51, 0xec, 0xb6, 0x5a, 0x18, 0xb7, 0xd9, 0x41, 0x33, 0xef, 0x35, 0xe1, 0x85, - 0x13, 0x89, 0x67, 0x7d, 0x87, 0x74, 0xe3, 0xc4, 0xfb, 0x4f, 0x40, 0x9e, 0xde, 0xde, 0x86, 0x5e, - 0x32, 0xd7, 0xb7, 0x6f, 0x98, 0xe3, 0xfb, 0x86, 0x0d, 0x98, 0x31, 0x4c, 0xb7, 0xb8, 0x75, 0xcd, - 0xd2, 0x76, 0xec, 0xb8, 0x45, 0x5d, 0x4a, 0xd7, 0x1f, 0xc1, 0xab, 0xa1, 0xdf, 0x56, 0x8e, 0xa8, - 0x1c, 0x19, 0xe5, 0xff, 0x07, 0x47, 0x2f, 0xb0, 0x80, 0x0c, 0x36, 0xa3, 0x2c, 0x45, 0xbb, 0x3c, - 0xf6, 0x50, 0x5e, 0xe0, 0xff, 0x5c, 0x39, 0xa2, 0xf6, 0x12, 0x53, 0x7e, 0x04, 0xe6, 0xdc, 0xd7, - 0xb6, 0x79, 0xc9, 0x63, 0x5c, 0x8e, 0xb6, 0xfb, 0x7a, 0xc8, 0xaf, 0x71, 0x3f, 0xae, 0x1c, 0x51, - 0x7b, 0x48, 0x29, 0x35, 0x80, 0x6d, 0x67, 0xa7, 0xc3, 0x08, 0x67, 0xa3, 0x55, 0xb2, 0x87, 0xf0, - 0x8a, 0xff, 0xd3, 0xca, 0x11, 0x35, 0x44, 0x42, 0x59, 0x85, 0x29, 0xe7, 0x61, 0x87, 0xd1, 0xcb, - 0x45, 0xfb, 0x1a, 0xf4, 0xd0, 0x6b, 0x78, 0xff, 0xac, 0x1c, 0x51, 0x03, 0x02, 0x4a, 0x05, 0x26, - 0xbb, 0x17, 0x18, 0xb1, 0x7c, 0x74, 0xff, 0xd4, 0x43, 0x6c, 0xfd, 0x82, 0x4f, 0xcb, 0xff, 0xdd, - 0x65, 0xac, 0x65, 0xef, 0x31, 0x5a, 0x13, 0xc2, 0x8c, 0x95, 0xbc, 0x7f, 0x5c, 0xc6, 0x7c, 0x02, - 0x4a, 0x05, 0xa6, 0x6c, 0x43, 0xeb, 0xda, 0xdb, 0xa6, 0x63, 0x9f, 0x9a, 0xec, 0x71, 0x4b, 0x8d, - 0xa6, 0x56, 0x67, 0xff, 0xa8, 0xc1, 0xdf, 0xca, 0xd3, 0xe0, 0xc4, 0x6e, 0xb7, 0xad, 0x39, 0xb8, - 0xfc, 0xb0, 0x6e, 0x3b, 0xba, 0xb1, 0xe5, 0x85, 0xf4, 0xa5, 0x9d, 0x7b, 0xff, 0x8f, 0xca, 0x3c, - 0x3b, 0xa0, 0x06, 0xa4, 0x6d, 0xa2, 0xde, 0xbd, 0x51, 0x5a, 0x6c, 0xe8, 0x5c, 0xda, 0x33, 0x21, - 0xeb, 0x7e, 0x22, 0x83, 0xc1, 0x5c, 0xff, 0x75, 0xd7, 0x5e, 0xdd, 0x21, 0x0d, 0xd8, 0xfd, 0xa9, - 0x67, 0x3c, 0x99, 0xd9, 0x37, 0x9e, 0x9c, 0x81, 0x69, 0xdd, 0x5e, 0xd3, 0xb7, 0xa8, 0x31, 0xcb, - 0x8e, 0x1f, 0x84, 0x93, 0xe8, 0xe4, 0xbf, 0x8a, 0x2f, 0xd1, 0x0b, 0x4b, 0x8e, 0x7a, 0x93, 0x7f, - 0x2f, 0x05, 0xdd, 0x00, 0x33, 0xe1, 0x46, 0x46, 0xaf, 0x80, 0xd5, 0x03, 0x53, 0x98, 0xbd, 0xa1, - 0xeb, 0x61, 0x8e, 0xd7, 0xe9, 0xd0, 0x88, 0x2f, 0x7b, 0x5d, 0x21, 0xba, 0x0e, 0x8e, 0xf6, 0x34, - 0x2c, 0x2f, 0xc4, 0x4b, 0x26, 0x08, 0xf1, 0x72, 0x06, 0x20, 0xd0, 0xe2, 0xbe, 0x64, 0xae, 0x85, - 0x29, 0x5f, 0x2f, 0xfb, 0x66, 0xf8, 0x62, 0x06, 0x26, 0x3d, 0x65, 0xeb, 0x97, 0xc1, 0x1d, 0x99, - 0x8c, 0xd0, 0x7e, 0x8e, 0x37, 0x32, 0x85, 0xd3, 0xdc, 0x61, 0x3d, 0xf0, 0xa2, 0x6e, 0xe8, 0x4e, - 0xc7, 0x3b, 0x89, 0xd8, 0x9b, 0xac, 0xac, 0x03, 0xe8, 0x04, 0xa3, 0x46, 0x70, 0x34, 0xf1, 0xd6, - 0x04, 0xed, 0x81, 0xea, 0x43, 0x88, 0xc6, 0xd9, 0xef, 0x63, 0xe7, 0x06, 0xa7, 0x20, 0x47, 0xe3, - 0xda, 0x1f, 0x51, 0xe6, 0x00, 0xca, 0xcf, 0x5a, 0x2f, 0xab, 0x95, 0x72, 0xb5, 0x54, 0x2e, 0x64, - 0xd0, 0xaf, 0x49, 0x30, 0xe5, 0x37, 0x82, 0xbe, 0x95, 0x2c, 0x33, 0xd5, 0x1a, 0x78, 0xcb, 0xe6, - 0xfe, 0x46, 0x15, 0x56, 0xb2, 0x67, 0xc0, 0x95, 0xbb, 0x36, 0x5e, 0xd2, 0x2d, 0xdb, 0x51, 0xcd, - 0x4b, 0x4b, 0xa6, 0x15, 0x0c, 0xac, 0x34, 0xa0, 0x6c, 0xd4, 0x67, 0xd7, 0xc0, 0x6b, 0x63, 0x72, - 0x46, 0x0d, 0x5b, 0x6c, 0xa1, 0x3e, 0x48, 0x70, 0xe9, 0x3a, 0x96, 0x66, 0xd8, 0x5d, 0xd3, 0xc6, - 0xaa, 0x79, 0xc9, 0x2e, 0x1a, 0xed, 0x92, 0xd9, 0xd9, 0xdd, 0x31, 0x6c, 0x66, 0xa2, 0x45, 0x7d, - 0x76, 0xa5, 0x43, 0xee, 0xd0, 0x9d, 0x03, 0x28, 0xd5, 0x56, 0x57, 0xcb, 0xa5, 0x46, 0xa5, 0x56, - 0x2d, 0x1c, 0x71, 0xa5, 0xd5, 0x28, 0x2e, 0xac, 0xba, 0xd2, 0xf9, 0x51, 0x98, 0xf4, 0xda, 0x34, - 0x8b, 0x4a, 0x93, 0xf1, 0xa2, 0xd2, 0x28, 0x45, 0x98, 0xf4, 0x5a, 0x39, 0x1b, 0x11, 0x9e, 0xd8, - 0x7b, 0x0a, 0x79, 0x47, 0xb3, 0x1c, 0x62, 0xa0, 0x78, 0x44, 0x16, 0x34, 0x1b, 0xab, 0xfe, 0x6f, - 0x67, 0x9f, 0xc2, 0x38, 0x50, 0x60, 0xae, 0xb8, 0xba, 0xda, 0xac, 0xa9, 0xcd, 0x6a, 0xad, 0xb1, - 0x52, 0xa9, 0x2e, 0xd3, 0x11, 0xb2, 0xb2, 0x5c, 0xad, 0xa9, 0x65, 0x3a, 0x40, 0xd6, 0x0b, 0x19, - 0x7a, 0x87, 0xf3, 0xc2, 0x24, 0xe4, 0xbb, 0x44, 0xba, 0xe8, 0xf3, 0x72, 0xc2, 0xf0, 0x03, 0x3e, - 0x4e, 0x11, 0xb7, 0xcc, 0x72, 0x47, 0x00, 0xa4, 0x3e, 0x47, 0x74, 0xcf, 0xc2, 0x0c, 0x35, 0xad, - 0x6d, 0xb2, 0x9b, 0x42, 0x90, 0x93, 0x55, 0x2e, 0x0d, 0x7d, 0x50, 0x4a, 0x10, 0x93, 0xa0, 0x2f, - 0x47, 0xc9, 0x8c, 0x8b, 0x3f, 0xcf, 0x0c, 0x77, 0x0b, 0x44, 0xa5, 0xda, 0x28, 0xab, 0xd5, 0xe2, - 0x2a, 0xcb, 0x22, 0x2b, 0xa7, 0xe0, 0x78, 0xb5, 0xc6, 0x42, 0x2c, 0xd6, 0x9b, 0x8d, 0x5a, 0xb3, - 0xb2, 0xb6, 0x5e, 0x53, 0x1b, 0x85, 0x9c, 0x72, 0x12, 0x14, 0xfa, 0xdc, 0xac, 0xd4, 0x9b, 0xa5, - 0x62, 0xb5, 0x54, 0x5e, 0x2d, 0x2f, 0x16, 0xf2, 0xca, 0x93, 0xe0, 0x3a, 0x7a, 0xab, 0x50, 0x6d, - 0xa9, 0xa9, 0xd6, 0xce, 0xd7, 0x5d, 0x04, 0xd5, 0xf2, 0x6a, 0xd1, 0x55, 0xa4, 0xd0, 0x5d, 0xce, - 0x13, 0xca, 0x15, 0x70, 0x94, 0x5c, 0xf4, 0xbe, 0x5a, 0x2b, 0x2e, 0xb2, 0xf2, 0x26, 0x95, 0x6b, - 0xe0, 0x54, 0xa5, 0x5a, 0xdf, 0x58, 0x5a, 0xaa, 0x94, 0x2a, 0xe5, 0x6a, 0xa3, 0xb9, 0x5e, 0x56, - 0xd7, 0x2a, 0xf5, 0xba, 0xfb, 0x6f, 0x61, 0x8a, 0xdc, 0x94, 0x4b, 0xfb, 0x4c, 0xf4, 0x4e, 0x19, - 0x66, 0xcf, 0x69, 0x1d, 0xdd, 0x1d, 0x28, 0xc8, 0x15, 0xda, 0x3d, 0xa7, 0x77, 0x1c, 0x72, 0xd5, - 0x36, 0xf3, 0xff, 0x27, 0x2f, 0xe8, 0x27, 0xe5, 0x84, 0xa7, 0x77, 0x18, 0x10, 0xb4, 0xc4, 0x79, - 0xae, 0xb4, 0x88, 0xb9, 0xe6, 0x2b, 0xa5, 0x04, 0xa7, 0x77, 0xc4, 0xc9, 0x27, 0x03, 0xff, 0xd7, - 0x47, 0x05, 0x7e, 0x01, 0x66, 0x36, 0xaa, 0xc5, 0x8d, 0xc6, 0x4a, 0x4d, 0xad, 0xfc, 0x30, 0x09, - 0xfe, 0x3e, 0x0b, 0x53, 0x4b, 0x35, 0x75, 0xa1, 0xb2, 0xb8, 0x58, 0xae, 0x16, 0x72, 0xca, 0x95, - 0x70, 0x45, 0xbd, 0xac, 0x9e, 0xab, 0x94, 0xca, 0xcd, 0x8d, 0x6a, 0xf1, 0x5c, 0xb1, 0xb2, 0x4a, - 0xfa, 0x88, 0x7c, 0xcc, 0xf5, 0xdf, 0x13, 0xe8, 0xc7, 0xb3, 0x00, 0xb4, 0xea, 0xe4, 0xee, 0xa3, - 0xd0, 0x25, 0xd1, 0x9f, 0x49, 0x3a, 0x69, 0x08, 0xc8, 0x44, 0xb4, 0xdf, 0x0a, 0x4c, 0x5a, 0xec, - 0x03, 0x5b, 0xcd, 0x1a, 0x44, 0x87, 0x3e, 0x7a, 0xd4, 0x54, 0xff, 0x77, 0xf4, 0xae, 0x24, 0x73, - 0x84, 0x48, 0xc6, 0x92, 0x21, 0xb9, 0x34, 0x1a, 0x20, 0xd1, 0x0b, 0x33, 0x30, 0xc7, 0x57, 0xcc, - 0xad, 0x04, 0x31, 0xa6, 0xc4, 0x2a, 0xc1, 0xff, 0x1c, 0x32, 0xb2, 0xce, 0x3e, 0x95, 0x0d, 0xa7, - 0xe0, 0xb5, 0x4c, 0x7a, 0x10, 0xdf, 0xb3, 0x58, 0x0a, 0x19, 0x97, 0x79, 0xd7, 0xe8, 0x28, 0x48, - 0xca, 0x04, 0xc8, 0x8d, 0x87, 0x9d, 0x82, 0x8c, 0xbe, 0x28, 0xc3, 0x2c, 0x77, 0x0b, 0x35, 0x7a, - 0x65, 0x46, 0xe4, 0x86, 0xd8, 0xd0, 0xfd, 0xd6, 0x99, 0x83, 0xde, 0x6f, 0x7d, 0xf6, 0x16, 0x98, - 0x60, 0x69, 0x44, 0xbe, 0xb5, 0xaa, 0x6b, 0x0a, 0x1c, 0x85, 0xe9, 0xe5, 0x72, 0xa3, 0x59, 0x6f, - 0x14, 0xd5, 0x46, 0x79, 0xb1, 0x90, 0x71, 0x07, 0xbe, 0xf2, 0xda, 0x7a, 0xe3, 0xc1, 0x82, 0x94, - 0xdc, 0x21, 0xb2, 0x97, 0x91, 0x31, 0x3b, 0x44, 0xc6, 0x15, 0x9f, 0xfe, 0x5c, 0xf5, 0x13, 0x32, - 0x14, 0x28, 0x07, 0xe5, 0x87, 0xbb, 0xd8, 0xd2, 0xb1, 0xd1, 0xc2, 0xe8, 0xa2, 0x48, 0x00, 0xd6, - 0x7d, 0xa1, 0x09, 0x49, 0x7f, 0x1e, 0xb2, 0x12, 0xe9, 0x4b, 0x8f, 0x81, 0x9d, 0xdd, 0x67, 0x60, - 0x7f, 0x3c, 0xa9, 0x47, 0x64, 0x2f, 0xbb, 0x23, 0x81, 0xec, 0x23, 0x49, 0x3c, 0x22, 0x07, 0x70, - 0x30, 0x96, 0xb8, 0xca, 0x11, 0xe3, 0x6f, 0x41, 0x46, 0x2f, 0x90, 0xe1, 0xe8, 0xa2, 0xe6, 0xe0, - 0x85, 0xcb, 0x0d, 0xef, 0x96, 0xc8, 0x88, 0x9b, 0x9d, 0x33, 0xfb, 0x6e, 0x76, 0x0e, 0x2e, 0x9a, - 0x94, 0x7a, 0x2e, 0x9a, 0x44, 0x6f, 0x4b, 0x7a, 0x86, 0xb2, 0x87, 0x87, 0x91, 0x05, 0x3f, 0x4e, - 0x76, 0x36, 0x32, 0x9e, 0x8b, 0xf4, 0x1b, 0xd8, 0x9b, 0xa6, 0xa0, 0x40, 0x59, 0x09, 0x39, 0xfd, - 0xfd, 0x22, 0xbb, 0x0c, 0xbd, 0x99, 0x20, 0xc6, 0xa2, 0x17, 0xb5, 0x42, 0xe2, 0xa3, 0x56, 0x70, - 0x6b, 0xc8, 0x72, 0xaf, 0xa3, 0x46, 0xd2, 0xce, 0x30, 0xe4, 0xe1, 0x17, 0x1d, 0xd6, 0x36, 0xbd, - 0xce, 0x30, 0xb6, 0xf8, 0xf1, 0x5c, 0xd8, 0xcb, 0xae, 0xd5, 0x2c, 0x8b, 0x22, 0x13, 0x7f, 0x2f, - 0x79, 0x52, 0x77, 0x6f, 0xce, 0xc3, 0x32, 0xe6, 0xb2, 0xee, 0xf4, 0xdc, 0xbd, 0x07, 0x71, 0x90, - 0x3e, 0x0a, 0xdf, 0x91, 0x20, 0x5b, 0x37, 0x2d, 0x67, 0x54, 0x18, 0x24, 0xdd, 0xa2, 0x0e, 0x49, - 0xa0, 0x1e, 0x3d, 0xe7, 0x4c, 0x6f, 0x8b, 0x3a, 0xbe, 0xfc, 0x31, 0x84, 0xa9, 0x3c, 0x0a, 0x73, - 0x94, 0x13, 0xff, 0x0e, 0x97, 0x6f, 0x4b, 0xb4, 0xbf, 0x7a, 0x40, 0x14, 0x11, 0xb2, 0xf1, 0xe1, - 0x6f, 0x11, 0x7b, 0xa0, 0x70, 0x69, 0xe8, 0xb5, 0x61, 0x5c, 0x16, 0x79, 0x5c, 0xfa, 0xcd, 0xb8, - 0xfd, 0x6b, 0x50, 0x46, 0xd5, 0x33, 0x25, 0x89, 0x78, 0x19, 0x53, 0x78, 0xfa, 0x88, 0x3c, 0x22, - 0x43, 0x9e, 0xb9, 0xe8, 0x8d, 0x14, 0x81, 0xa4, 0x2d, 0xc3, 0x17, 0x82, 0x98, 0x2b, 0x9f, 0x3c, - 0xea, 0x96, 0x11, 0x5f, 0x7e, 0xfa, 0x38, 0xfc, 0x3b, 0xf3, 0x3d, 0x2d, 0xee, 0x69, 0x7a, 0x47, - 0xbb, 0xd0, 0x49, 0x10, 0x69, 0xfa, 0x83, 0x09, 0x4f, 0xdb, 0xf9, 0x55, 0xe5, 0xca, 0x8b, 0x90, - 0xf8, 0x0f, 0xc0, 0x94, 0xc5, 0xed, 0xf5, 0xb9, 0x56, 0x54, 0x8f, 0xdf, 0x2f, 0xfb, 0xae, 0x06, - 0x39, 0x13, 0x1d, 0xad, 0x13, 0xe2, 0x67, 0x2c, 0x47, 0x81, 0xa6, 0x8b, 0xed, 0xf6, 0x12, 0xd6, - 0x9c, 0x5d, 0x0b, 0xb7, 0x13, 0x0d, 0x11, 0x56, 0xcf, 0x76, 0x68, 0x48, 0x12, 0x5c, 0xac, 0xc7, - 0x55, 0x1e, 0x9d, 0xa7, 0x0f, 0xe8, 0x0d, 0x3c, 0x5e, 0x46, 0xd2, 0x25, 0xbd, 0xd1, 0x87, 0xa4, - 0xc6, 0x41, 0xf2, 0xcc, 0xe1, 0x98, 0x48, 0x1f, 0x90, 0x5f, 0x96, 0x61, 0x8e, 0xda, 0x09, 0xa3, - 0xc6, 0xe4, 0xf7, 0x13, 0xba, 0xf4, 0x84, 0x6e, 0xc9, 0x0a, 0xb3, 0x33, 0x12, 0x58, 0x92, 0x38, - 0x00, 0x89, 0xf1, 0x91, 0x3e, 0x32, 0x9f, 0xca, 0x03, 0x84, 0xdc, 0x34, 0x3f, 0x98, 0x0f, 0xe2, - 0x2e, 0xa2, 0x37, 0xb3, 0xf9, 0x47, 0x9d, 0x0b, 0x02, 0x1e, 0x72, 0xc1, 0xf4, 0x37, 0xa4, 0xf8, - 0x44, 0xa1, 0x51, 0xe5, 0xcf, 0x13, 0xda, 0xbc, 0xcc, 0x49, 0x72, 0xe0, 0xe0, 0x3e, 0x64, 0x2f, - 0xf7, 0xa1, 0x04, 0xc6, 0xef, 0x20, 0x56, 0x92, 0xa1, 0xb6, 0x3a, 0xc4, 0xcc, 0xfe, 0x14, 0x1c, - 0x57, 0xcb, 0xc5, 0xc5, 0x5a, 0x75, 0xf5, 0xc1, 0xf0, 0x95, 0x49, 0x05, 0x39, 0x3c, 0x39, 0x49, - 0x05, 0xb6, 0x57, 0x27, 0xec, 0x03, 0x79, 0x59, 0xc5, 0xcd, 0x56, 0x42, 0x8b, 0x2b, 0x83, 0x7b, - 0x35, 0x01, 0xb2, 0x87, 0x89, 0xc2, 0x23, 0x10, 0x6a, 0x46, 0x3f, 0x2d, 0x43, 0x81, 0xf8, 0xfe, - 0x10, 0x2e, 0xd9, 0xdd, 0x78, 0x35, 0xde, 0x8b, 0xb3, 0x4b, 0xf7, 0x9f, 0x02, 0x2f, 0x4e, 0x2f, - 0x41, 0xb9, 0x01, 0xe6, 0x5a, 0xdb, 0xb8, 0x75, 0xb1, 0x62, 0x78, 0xfb, 0xea, 0x74, 0x13, 0xb6, - 0x27, 0x95, 0x07, 0xe6, 0x01, 0x1e, 0x18, 0x7e, 0x12, 0xcd, 0x0d, 0xd2, 0x61, 0xa6, 0x22, 0x70, - 0xf9, 0x23, 0x1f, 0x97, 0x2a, 0x87, 0xcb, 0x9d, 0x43, 0x51, 0x4d, 0x06, 0x4b, 0x75, 0x08, 0x58, - 0x10, 0x9c, 0xac, 0xad, 0x37, 0x2a, 0xb5, 0x6a, 0x73, 0xa3, 0x5e, 0x5e, 0x6c, 0x2e, 0x78, 0xe0, - 0xd4, 0x0b, 0x32, 0xfa, 0xaa, 0x04, 0x13, 0x94, 0x2d, 0x1b, 0x3d, 0x39, 0x80, 0x60, 0xa0, 0xfb, - 0x2a, 0x7a, 0x93, 0x70, 0x30, 0x0a, 0x5f, 0x10, 0xac, 0x9c, 0x88, 0x7e, 0xea, 0x19, 0x30, 0x41, - 0x41, 0xf6, 0x56, 0xb4, 0x4e, 0x47, 0xf4, 0x52, 0x8c, 0x8c, 0xea, 0x65, 0x17, 0x0c, 0x4c, 0x31, - 0x80, 0x8d, 0xf4, 0x47, 0x96, 0xe7, 0x64, 0xa9, 0x19, 0x7c, 0x5e, 0x77, 0xb6, 0x89, 0x77, 0x2b, - 0xfa, 0x21, 0x91, 0xe5, 0xc5, 0x9b, 0x21, 0xb7, 0xe7, 0xe6, 0x1e, 0xe0, 0x29, 0x4c, 0x33, 0xa1, - 0x5f, 0x17, 0x8e, 0x83, 0xca, 0xe9, 0xa7, 0xcf, 0x53, 0x04, 0x38, 0x6b, 0x90, 0xed, 0xe8, 0xb6, - 0xc3, 0xc6, 0x8f, 0x3b, 0x12, 0x11, 0xf2, 0x1e, 0x2a, 0x0e, 0xde, 0x51, 0x09, 0x19, 0x74, 0x3f, - 0xcc, 0x84, 0x53, 0x05, 0xbc, 0xa5, 0x4f, 0xc1, 0x04, 0x3b, 0xc5, 0xc7, 0x96, 0x58, 0xbd, 0x57, - 0xc1, 0x65, 0x4d, 0xa1, 0xda, 0xa6, 0xaf, 0x03, 0xff, 0xf7, 0x51, 0x98, 0x58, 0xd1, 0x6d, 0xc7, - 0xb4, 0x2e, 0xa3, 0x47, 0x33, 0x30, 0x71, 0x0e, 0x5b, 0xb6, 0x6e, 0x1a, 0xfb, 0x5c, 0x0d, 0xce, - 0xc0, 0x74, 0xd7, 0xc2, 0x7b, 0xba, 0xb9, 0x6b, 0x07, 0x8b, 0x33, 0xe1, 0x24, 0x05, 0xc1, 0xa4, - 0xb6, 0xeb, 0x6c, 0x9b, 0x56, 0x10, 0xfc, 0xc3, 0x7b, 0x57, 0x4e, 0x03, 0xd0, 0xe7, 0xaa, 0xb6, - 0x83, 0x99, 0x03, 0x45, 0x28, 0x45, 0x51, 0x20, 0xeb, 0xe8, 0x3b, 0x98, 0x45, 0x03, 0x26, 0xcf, - 0xae, 0x80, 0x49, 0x64, 0x3d, 0x16, 0xc1, 0x50, 0x56, 0xbd, 0x57, 0xf4, 0x59, 0x19, 0xa6, 0x97, - 0xb1, 0xc3, 0x58, 0xb5, 0xd1, 0x8b, 0x32, 0x42, 0x17, 0x70, 0xb8, 0x63, 0x6c, 0x47, 0xb3, 0xbd, - 0xff, 0xfc, 0x25, 0x58, 0x3e, 0x31, 0x08, 0x4d, 0x2c, 0x87, 0xe3, 0x92, 0x93, 0x38, 0x75, 0x4e, - 0x85, 0xba, 0xc1, 0xb2, 0xcc, 0x6c, 0x13, 0x64, 0xff, 0x07, 0xf4, 0x76, 0x49, 0xf4, 0x8c, 0x37, - 0x93, 0xfd, 0x7c, 0xa8, 0x3e, 0x91, 0xdd, 0xd1, 0xe4, 0x1e, 0xcb, 0xb1, 0x2f, 0xe4, 0x7c, 0x98, - 0x12, 0x23, 0xa3, 0xfa, 0xb9, 0x05, 0x4f, 0x87, 0x0f, 0xe6, 0x24, 0x7d, 0x6d, 0xfc, 0xa6, 0x0c, - 0xd3, 0xf5, 0x6d, 0xf3, 0x92, 0x27, 0xc7, 0x1f, 0x15, 0x03, 0xf6, 0x1a, 0x98, 0xda, 0xeb, 0x01, - 0x35, 0x48, 0x88, 0xbe, 0x12, 0x1f, 0x3d, 0x5f, 0x4e, 0x0a, 0x53, 0x88, 0xb9, 0x91, 0x5f, 0x58, - 0xaf, 0x3c, 0x1d, 0x26, 0x18, 0xd7, 0x6c, 0xc9, 0x25, 0x1e, 0x60, 0x2f, 0x73, 0xb8, 0x82, 0x59, - 0xbe, 0x82, 0xc9, 0x90, 0x8f, 0xae, 0x5c, 0xfa, 0xc8, 0xff, 0x89, 0x44, 0x62, 0x83, 0x78, 0xc0, - 0x97, 0x46, 0x00, 0x3c, 0xfa, 0x56, 0x46, 0x74, 0x61, 0xd2, 0x97, 0x80, 0xcf, 0xc1, 0x81, 0x2e, - 0xd7, 0x19, 0x48, 0x2e, 0x7d, 0x79, 0xfe, 0x5a, 0x16, 0x66, 0x16, 0xf5, 0xcd, 0x4d, 0xbf, 0x93, - 0x7c, 0xb1, 0x60, 0x27, 0x19, 0xed, 0x0e, 0xe0, 0xda, 0xb9, 0xbb, 0x96, 0x85, 0x0d, 0xaf, 0x52, - 0xac, 0x39, 0xf5, 0xa4, 0x2a, 0x37, 0xc2, 0x51, 0x6f, 0x5c, 0x08, 0x77, 0x94, 0x53, 0x6a, 0x6f, - 0x32, 0xfa, 0x86, 0xf0, 0xae, 0x96, 0x27, 0xd1, 0x70, 0x95, 0x22, 0x1a, 0xe0, 0x5d, 0x30, 0xbb, - 0x4d, 0x73, 0x93, 0xa9, 0xbf, 0xd7, 0x59, 0x9e, 0xec, 0x89, 0xbd, 0xbc, 0x86, 0x6d, 0x5b, 0xdb, - 0xc2, 0x2a, 0x9f, 0xb9, 0xa7, 0xf9, 0xca, 0x49, 0x6e, 0x12, 0x13, 0xdb, 0x20, 0x13, 0xa8, 0xc9, - 0x18, 0xb4, 0xe3, 0x2c, 0x64, 0x97, 0xf4, 0x0e, 0x46, 0x3f, 0x23, 0xc1, 0x94, 0x8a, 0x5b, 0xa6, - 0xd1, 0x72, 0xdf, 0x42, 0xce, 0x41, 0xff, 0x98, 0x11, 0xbd, 0x41, 0xd3, 0xa5, 0x33, 0xef, 0xd3, - 0x88, 0x68, 0x37, 0x62, 0x37, 0x65, 0xc6, 0x92, 0x1a, 0xc3, 0x7d, 0x27, 0xee, 0xd4, 0x63, 0x73, - 0xb3, 0x63, 0x6a, 0xdc, 0xe2, 0x57, 0xaf, 0x29, 0x74, 0x13, 0x14, 0xbc, 0x23, 0x37, 0xa6, 0xb3, - 0xae, 0x1b, 0x86, 0x7f, 0xa6, 0x7b, 0x5f, 0x3a, 0xbf, 0x6f, 0x1b, 0x1b, 0x16, 0x87, 0xd4, 0x9d, - 0x95, 0x1e, 0xa1, 0xd9, 0x37, 0xc0, 0xdc, 0x85, 0xcb, 0x0e, 0xb6, 0x59, 0x2e, 0x56, 0x6c, 0x56, - 0xed, 0x49, 0x0d, 0x05, 0xb5, 0x8e, 0x0b, 0x9f, 0x13, 0x53, 0x60, 0x32, 0x51, 0xaf, 0x0c, 0x31, - 0x03, 0x3c, 0x0e, 0x85, 0x6a, 0x6d, 0xb1, 0x4c, 0x7c, 0xd5, 0x3c, 0xef, 0x9f, 0x2d, 0xf4, 0x0b, - 0x32, 0xcc, 0x10, 0x67, 0x12, 0x0f, 0x85, 0xeb, 0x04, 0xe6, 0x23, 0xe8, 0x31, 0x61, 0x3f, 0x36, - 0x52, 0xe5, 0x70, 0x01, 0xd1, 0x82, 0xde, 0xd4, 0x3b, 0xbd, 0x82, 0xce, 0xa9, 0x3d, 0xa9, 0x7d, - 0x00, 0x91, 0xfb, 0x02, 0xf2, 0xbb, 0x42, 0xce, 0x6c, 0x83, 0xb8, 0x3b, 0x2c, 0x54, 0x7e, 0x4f, - 0x86, 0x69, 0x77, 0x92, 0xe2, 0x81, 0x52, 0xe3, 0x40, 0x31, 0x8d, 0xce, 0xe5, 0x60, 0x59, 0xc4, - 0x7b, 0x4d, 0xd4, 0x48, 0xfe, 0x52, 0x78, 0xe6, 0x4e, 0x44, 0x14, 0xe2, 0x65, 0x4c, 0xf8, 0xbd, - 0x5b, 0x68, 0x3e, 0x3f, 0x80, 0xb9, 0xc3, 0x82, 0xef, 0xcb, 0x39, 0xc8, 0x6f, 0x74, 0x09, 0x72, - 0xbf, 0x2e, 0x8b, 0x04, 0x88, 0xdf, 0x77, 0x90, 0xc1, 0x35, 0xb3, 0x3a, 0x66, 0x4b, 0xeb, 0xac, - 0x07, 0x27, 0xc2, 0x82, 0x04, 0xe5, 0x4e, 0xe6, 0xdb, 0x48, 0x4f, 0x37, 0xde, 0x10, 0x1b, 0x3b, - 0x9d, 0xc8, 0x28, 0x74, 0x68, 0xe4, 0x66, 0x38, 0xd6, 0xd6, 0x6d, 0xed, 0x42, 0x07, 0x97, 0x8d, - 0x96, 0x75, 0x99, 0x8a, 0x83, 0x4d, 0xab, 0xf6, 0x7d, 0x50, 0xee, 0x86, 0x9c, 0xed, 0x5c, 0xee, - 0xd0, 0x79, 0x62, 0xf8, 0x8c, 0x49, 0x64, 0x51, 0x75, 0x37, 0xbb, 0x4a, 0xff, 0x0a, 0xbb, 0x28, - 0x4d, 0x08, 0x5e, 0x9f, 0xfd, 0x54, 0xc8, 0x9b, 0x96, 0xbe, 0xa5, 0xd3, 0xeb, 0x90, 0xe6, 0xf6, - 0x85, 0x08, 0xa4, 0xa6, 0x40, 0x8d, 0x64, 0x51, 0x59, 0x56, 0xe5, 0xe9, 0x30, 0xa5, 0xef, 0x68, - 0x5b, 0xf8, 0x01, 0xdd, 0xa0, 0x07, 0x28, 0xe7, 0x6e, 0x3f, 0xb5, 0xef, 0xf8, 0x0c, 0xfb, 0xae, - 0x06, 0x59, 0xd1, 0xbb, 0x25, 0xd1, 0x38, 0x46, 0xa4, 0x6e, 0x14, 0xd4, 0xb1, 0x5c, 0x23, 0x8e, - 0x5e, 0x21, 0x14, 0x61, 0x28, 0x9a, 0xad, 0xf4, 0x07, 0xef, 0x4f, 0x4b, 0x30, 0xb9, 0x68, 0x5e, - 0x32, 0x88, 0xa2, 0xdf, 0x21, 0x66, 0xeb, 0xf6, 0x39, 0xe4, 0xc8, 0xdf, 0xd2, 0x19, 0x7b, 0xa2, - 0x81, 0xd4, 0xd6, 0x2b, 0x32, 0x02, 0x86, 0xd8, 0x96, 0x23, 0x78, 0x77, 0x62, 0x5c, 0x39, 0xe9, - 0xcb, 0xf5, 0x4f, 0x65, 0xc8, 0x2e, 0x5a, 0x66, 0x17, 0xbd, 0x31, 0x93, 0xc0, 0x65, 0xa1, 0x6d, - 0x99, 0xdd, 0x06, 0xb9, 0xfc, 0x2c, 0x38, 0xc6, 0x11, 0x4e, 0x53, 0xee, 0x80, 0xc9, 0xae, 0x69, - 0xeb, 0x8e, 0x37, 0x8d, 0x98, 0xbb, 0xfd, 0x09, 0x7d, 0x5b, 0xf3, 0x3a, 0xcb, 0xa4, 0xfa, 0xd9, - 0xdd, 0x5e, 0x9b, 0x88, 0xd0, 0x95, 0x8b, 0x2b, 0x46, 0xef, 0x02, 0xb8, 0x9e, 0x54, 0xf4, 0x92, - 0x30, 0x92, 0xcf, 0xe4, 0x91, 0x7c, 0x62, 0x1f, 0x09, 0x5b, 0x66, 0x77, 0x24, 0x9b, 0x8c, 0x2f, - 0xf3, 0x51, 0xbd, 0x87, 0x43, 0xf5, 0x26, 0xa1, 0x32, 0xd3, 0x47, 0xf4, 0xdd, 0x59, 0x00, 0x62, - 0x66, 0x6c, 0xb8, 0x13, 0x20, 0x31, 0x1b, 0xeb, 0xa7, 0xb2, 0x21, 0x59, 0x16, 0x79, 0x59, 0x3e, - 0x39, 0xc2, 0x8a, 0x21, 0xe4, 0x23, 0x24, 0x5a, 0x84, 0xdc, 0xae, 0xfb, 0x99, 0x49, 0x54, 0x90, - 0x04, 0x79, 0x55, 0xe9, 0x9f, 0xe8, 0x4f, 0x32, 0x90, 0x23, 0x09, 0xca, 0x69, 0x00, 0x32, 0xb0, - 0xd3, 0x03, 0x41, 0x19, 0x32, 0x84, 0x87, 0x52, 0x88, 0xb6, 0xea, 0x6d, 0xf6, 0x99, 0x9a, 0xcc, - 0x41, 0x82, 0xfb, 0x37, 0x19, 0xee, 0x09, 0x2d, 0x66, 0x00, 0x84, 0x52, 0xdc, 0xbf, 0xc9, 0xdb, - 0x2a, 0xde, 0xa4, 0x71, 0xa9, 0xb3, 0x6a, 0x90, 0xe0, 0xff, 0xbd, 0xea, 0xdf, 0x66, 0xe6, 0xfd, - 0x4d, 0x52, 0xdc, 0xc9, 0x30, 0x51, 0xcb, 0x85, 0xa0, 0x88, 0x3c, 0xc9, 0xd4, 0x9b, 0x8c, 0x5e, - 0xed, 0xab, 0xcd, 0x22, 0xa7, 0x36, 0xb7, 0x26, 0x10, 0x6f, 0xfa, 0xca, 0xf3, 0xc5, 0x1c, 0x4c, - 0x55, 0xcd, 0x36, 0xd3, 0x9d, 0xd0, 0x84, 0xf1, 0x23, 0xb9, 0x44, 0x13, 0x46, 0x9f, 0x46, 0x84, - 0x82, 0xdc, 0xc7, 0x2b, 0x88, 0x18, 0x85, 0xb0, 0x7e, 0x28, 0x0b, 0x90, 0x27, 0xda, 0xbb, 0xff, - 0x9a, 0xac, 0x38, 0x12, 0x44, 0xb4, 0x2a, 0xfb, 0xf3, 0x3f, 0x9c, 0x8e, 0xfd, 0x57, 0xc8, 0x91, - 0x0a, 0xc6, 0xec, 0xee, 0xf0, 0x15, 0x95, 0xe2, 0x2b, 0x2a, 0xc7, 0x57, 0x34, 0xdb, 0x5b, 0xd1, - 0x24, 0xeb, 0x00, 0x51, 0x1a, 0x92, 0xbe, 0x8e, 0xff, 0xc3, 0x04, 0x40, 0x55, 0xdb, 0xd3, 0xb7, - 0xe8, 0xee, 0xf0, 0x67, 0xbd, 0xf9, 0x0f, 0xdb, 0xc7, 0xfd, 0x6f, 0xa1, 0x81, 0xf0, 0x0e, 0x98, - 0x60, 0xe3, 0x1e, 0xab, 0xc8, 0xb5, 0x5c, 0x45, 0x02, 0x2a, 0xd4, 0x2c, 0x7d, 0xd8, 0x51, 0xbd, - 0xfc, 0xdc, 0x8d, 0xbe, 0x52, 0xcf, 0x8d, 0xbe, 0xfd, 0xf7, 0x20, 0x22, 0xee, 0xf9, 0x45, 0xef, - 0x10, 0xf6, 0xe8, 0x0f, 0xf1, 0x13, 0xaa, 0x51, 0x44, 0x13, 0x7c, 0x2a, 0x4c, 0x98, 0xfe, 0x86, - 0xb6, 0x1c, 0xb9, 0x0e, 0x56, 0x31, 0x36, 0x4d, 0xd5, 0xcb, 0x29, 0xb8, 0xf9, 0x25, 0xc4, 0xc7, - 0x58, 0x0e, 0xcd, 0x9c, 0x5c, 0xf6, 0x62, 0x7c, 0xb9, 0xf5, 0x38, 0xaf, 0x3b, 0xdb, 0xab, 0xba, - 0x71, 0xd1, 0x46, 0xff, 0x59, 0xcc, 0x82, 0x0c, 0xe1, 0x2f, 0x25, 0xc3, 0x9f, 0x8f, 0xd9, 0x51, - 0xe7, 0x51, 0xbb, 0x3b, 0x8a, 0x4a, 0x7f, 0x6e, 0x23, 0x00, 0xbc, 0x13, 0xf2, 0x94, 0x51, 0xd6, - 0x89, 0x9e, 0x8d, 0xc4, 0xcf, 0xa7, 0xa4, 0xb2, 0x3f, 0xd0, 0xdb, 0x7d, 0x1c, 0xcf, 0x71, 0x38, - 0x2e, 0x1c, 0x88, 0xb3, 0xd4, 0x21, 0x3d, 0x7b, 0x1b, 0x4c, 0x30, 0x49, 0x2b, 0x73, 0xe1, 0x56, - 0x5c, 0x38, 0xa2, 0x00, 0xe4, 0xd7, 0xcc, 0x3d, 0xdc, 0x30, 0x0b, 0x19, 0xf7, 0xd9, 0xe5, 0xaf, - 0x61, 0x16, 0x24, 0xf4, 0xf2, 0x49, 0x98, 0xf4, 0x83, 0x2b, 0x7d, 0x5a, 0x82, 0x42, 0xc9, 0xc2, - 0x9a, 0x83, 0x97, 0x2c, 0x73, 0x87, 0xd6, 0x48, 0xdc, 0x3b, 0xf4, 0x97, 0x85, 0x5d, 0x3c, 0xfc, - 0xa0, 0x47, 0xbd, 0x85, 0x45, 0x60, 0x49, 0x17, 0x21, 0x25, 0x6f, 0x11, 0x12, 0xbd, 0x41, 0xc8, - 0xe5, 0x43, 0xb4, 0x94, 0xf4, 0x9b, 0xda, 0xc7, 0x25, 0xc8, 0x95, 0x3a, 0xa6, 0x81, 0xc3, 0x47, - 0x98, 0x06, 0x9e, 0x95, 0xe9, 0xbf, 0x13, 0x81, 0x9e, 0x23, 0x89, 0xda, 0x1a, 0x81, 0x00, 0xdc, - 0xb2, 0x05, 0x65, 0x2b, 0x36, 0x48, 0xc5, 0x92, 0x4e, 0x5f, 0xa0, 0x5f, 0x95, 0x60, 0x8a, 0xc6, - 0xc5, 0x29, 0x76, 0x3a, 0xe8, 0x09, 0x81, 0x50, 0xfb, 0x04, 0xa8, 0x42, 0xbf, 0x2b, 0xec, 0xa2, - 0xef, 0xd7, 0xca, 0xa7, 0x9d, 0x20, 0x40, 0x50, 0x32, 0x8f, 0x71, 0xb1, 0xbd, 0xb4, 0x81, 0x0c, - 0xa5, 0x2f, 0xea, 0xcf, 0x48, 0xae, 0x01, 0x60, 0x5c, 0x5c, 0xb7, 0xf0, 0x9e, 0x8e, 0x2f, 0xa1, - 0xab, 0x03, 0x61, 0xef, 0x0f, 0xfa, 0xf1, 0x3a, 0xe1, 0x45, 0x9c, 0x10, 0xc9, 0xc8, 0xad, 0xac, - 0xe9, 0x4e, 0x90, 0x89, 0xf5, 0xe2, 0xbd, 0x91, 0x58, 0x42, 0x64, 0xd4, 0x70, 0x76, 0xc1, 0x35, - 0x9b, 0x68, 0x2e, 0xd2, 0x17, 0xec, 0xfb, 0x26, 0x60, 0x72, 0xc3, 0xb0, 0xbb, 0x1d, 0xcd, 0xde, - 0x46, 0xdf, 0x96, 0x21, 0x4f, 0x2f, 0x67, 0x43, 0x3f, 0xc0, 0xc5, 0x16, 0xf8, 0xb1, 0x5d, 0x6c, - 0x79, 0x2e, 0x38, 0xf4, 0xa5, 0xff, 0xdd, 0xf1, 0xe8, 0xdd, 0xb2, 0xe8, 0x24, 0xd5, 0x2b, 0x34, - 0x74, 0x4b, 0x7f, 0xff, 0xe3, 0xec, 0x5d, 0xbd, 0xe5, 0xec, 0x5a, 0xfe, 0x4d, 0xe4, 0x4f, 0x11, - 0xa3, 0xb2, 0x4e, 0xff, 0x52, 0xfd, 0xdf, 0x91, 0x06, 0x13, 0x2c, 0x71, 0xdf, 0x76, 0xd2, 0xfe, - 0xf3, 0xb7, 0x27, 0x21, 0xaf, 0x59, 0x8e, 0x6e, 0x3b, 0x6c, 0x83, 0x95, 0xbd, 0xb9, 0xdd, 0x25, - 0x7d, 0xda, 0xb0, 0x3a, 0x5e, 0x14, 0x12, 0x3f, 0x01, 0xfd, 0x9e, 0xd0, 0xfc, 0x31, 0xbe, 0xe6, - 0xc9, 0x20, 0x7f, 0x60, 0x88, 0x35, 0xea, 0x2b, 0xe1, 0x0a, 0xb5, 0xd8, 0x28, 0x37, 0x69, 0xd0, - 0x0a, 0x3f, 0x3e, 0x45, 0x1b, 0xbd, 0x4d, 0x0e, 0xad, 0xdf, 0x5d, 0xe6, 0xc6, 0x08, 0x26, 0xc5, - 0x60, 0x8c, 0xf0, 0x13, 0x62, 0x76, 0xab, 0xb9, 0x45, 0x58, 0x59, 0x7c, 0x11, 0xf6, 0xb7, 0x85, - 0x77, 0x93, 0x7c, 0x51, 0x0e, 0x58, 0x03, 0x8c, 0xbb, 0xbc, 0xe9, 0x3d, 0x42, 0x3b, 0x43, 0x83, - 0x4a, 0x3a, 0x44, 0xd8, 0x5e, 0x3b, 0x01, 0x13, 0xcb, 0x5a, 0xa7, 0x83, 0xad, 0xcb, 0xee, 0x90, - 0x54, 0xf0, 0x38, 0x5c, 0xd3, 0x0c, 0x7d, 0x13, 0xdb, 0x4e, 0x7c, 0x67, 0xf9, 0x0e, 0xe1, 0xc0, - 0xc0, 0xac, 0x8c, 0xf9, 0x5e, 0xfa, 0x11, 0x32, 0xbf, 0x05, 0xb2, 0xba, 0xb1, 0x69, 0xb2, 0x2e, - 0xb3, 0x77, 0xd5, 0xde, 0xfb, 0x99, 0x4c, 0x5d, 0x48, 0x46, 0xc1, 0xd8, 0xc0, 0x82, 0x5c, 0xa4, - 0xdf, 0x73, 0xfe, 0x4e, 0x16, 0x66, 0x3d, 0x26, 0x2a, 0x46, 0x1b, 0x3f, 0x1c, 0x5e, 0x8a, 0xf9, - 0x85, 0xac, 0xe8, 0x71, 0xb0, 0xde, 0xfa, 0x10, 0x52, 0x11, 0x22, 0x6d, 0x00, 0xb4, 0x34, 0x07, - 0x6f, 0x99, 0x96, 0xee, 0xf7, 0x87, 0x4f, 0x4b, 0x42, 0xad, 0x44, 0xff, 0xbe, 0xac, 0x86, 0xe8, - 0x28, 0x77, 0xc3, 0x34, 0xf6, 0xcf, 0xdf, 0x7b, 0x4b, 0x35, 0xb1, 0x78, 0x85, 0xf3, 0xa3, 0xcf, - 0x08, 0x9d, 0x3a, 0x13, 0xa9, 0x66, 0x32, 0xcc, 0x9a, 0xc3, 0xb5, 0xa1, 0x8d, 0xea, 0x5a, 0x51, - 0xad, 0xaf, 0x14, 0x57, 0x57, 0x2b, 0xd5, 0x65, 0x3f, 0xf0, 0x8b, 0x02, 0x73, 0x8b, 0xb5, 0xf3, - 0xd5, 0x50, 0x64, 0x9e, 0x2c, 0x5a, 0x87, 0x49, 0x4f, 0x5e, 0xfd, 0x7c, 0x31, 0xc3, 0x32, 0x63, - 0xbe, 0x98, 0xa1, 0x24, 0xd7, 0x38, 0xd3, 0x5b, 0xbe, 0x83, 0x0e, 0x79, 0x46, 0x7f, 0xac, 0x41, - 0x8e, 0xac, 0xa9, 0xa3, 0xb7, 0x90, 0x6d, 0xc0, 0x6e, 0x47, 0x6b, 0x61, 0xb4, 0x93, 0xc0, 0x1a, - 0xf7, 0x6e, 0xaa, 0x90, 0xf6, 0xdd, 0x54, 0x41, 0x1e, 0x99, 0xd5, 0x77, 0xbc, 0xdf, 0x3a, 0xbe, - 0x4a, 0xb3, 0xf0, 0x07, 0xb4, 0x62, 0x77, 0x57, 0xe8, 0xf2, 0x3f, 0x63, 0x33, 0x42, 0x25, 0xa3, - 0x79, 0x4a, 0x66, 0x89, 0x8a, 0xed, 0xc3, 0xc4, 0x71, 0x34, 0x86, 0xdb, 0xd4, 0xb3, 0x90, 0xab, - 0x77, 0x3b, 0xba, 0x83, 0x7e, 0x55, 0x1a, 0x09, 0x66, 0xf4, 0x76, 0x11, 0x79, 0xe0, 0xed, 0x22, - 0xc1, 0xae, 0x6b, 0x56, 0x60, 0xd7, 0xb5, 0x81, 0x1f, 0x76, 0xf8, 0x5d, 0xd7, 0x3b, 0x58, 0xf0, - 0x36, 0xba, 0x67, 0xfb, 0xc4, 0x3e, 0x22, 0x25, 0xd5, 0xea, 0x13, 0x15, 0xf0, 0xec, 0x6d, 0x2c, - 0x38, 0x19, 0x40, 0x7e, 0xa1, 0xd6, 0x68, 0xd4, 0xd6, 0x0a, 0x47, 0x48, 0x54, 0x9b, 0xda, 0x3a, - 0x0d, 0x15, 0x53, 0xa9, 0x56, 0xcb, 0x6a, 0x41, 0x22, 0xe1, 0xd2, 0x2a, 0x8d, 0xd5, 0x72, 0x41, - 0xe6, 0x43, 0xcd, 0xc7, 0x9a, 0xdf, 0x7c, 0xd9, 0x69, 0xaa, 0x97, 0x98, 0x21, 0x1e, 0xcd, 0x4f, - 0xfa, 0xca, 0xf5, 0x4b, 0x32, 0xe4, 0xd6, 0xb0, 0xb5, 0x85, 0xd1, 0x8f, 0x25, 0xd8, 0xe4, 0xdb, - 0xd4, 0x2d, 0x9b, 0x06, 0x97, 0x0b, 0x36, 0xf9, 0xc2, 0x69, 0xca, 0xf5, 0x30, 0x6b, 0xe3, 0x96, - 0x69, 0xb4, 0xbd, 0x4c, 0xb4, 0x3f, 0xe2, 0x13, 0xf9, 0x6b, 0xfe, 0x05, 0x20, 0x23, 0x8c, 0x8e, - 0x64, 0xa7, 0x2e, 0x09, 0x30, 0xfd, 0x4a, 0x4d, 0x1f, 0x98, 0x6f, 0xc8, 0xee, 0x4f, 0xdd, 0xcb, - 0xe8, 0xa5, 0xc2, 0xbb, 0xaf, 0x37, 0x43, 0xfe, 0x82, 0x17, 0xa5, 0x58, 0x8e, 0xec, 0x8f, 0x59, - 0x1e, 0x65, 0x01, 0x8e, 0xd9, 0xb8, 0x83, 0x5b, 0x0e, 0x6e, 0xbb, 0x4d, 0x57, 0x1d, 0xd8, 0x29, - 0xec, 0xcf, 0x8e, 0xfe, 0x2c, 0x0c, 0xe0, 0x5d, 0x3c, 0x80, 0x37, 0xf4, 0x11, 0xa5, 0x5b, 0xa1, - 0x68, 0x5b, 0xd9, 0xad, 0x46, 0xbd, 0x63, 0xfa, 0x8b, 0xe2, 0xde, 0xbb, 0xfb, 0x6d, 0xdb, 0xd9, - 0xe9, 0x90, 0x6f, 0xec, 0x80, 0x81, 0xf7, 0xae, 0xcc, 0xc3, 0x84, 0x66, 0x5c, 0x26, 0x9f, 0xb2, - 0x31, 0xb5, 0xf6, 0x32, 0xa1, 0x97, 0xfb, 0xc8, 0xdf, 0xcb, 0x21, 0xff, 0x64, 0x31, 0x76, 0xd3, - 0x07, 0xfe, 0x27, 0x27, 0x20, 0xb7, 0xae, 0xd9, 0x0e, 0x46, 0xff, 0x97, 0x2c, 0x8a, 0xfc, 0x0d, - 0x30, 0xb7, 0x69, 0xb6, 0x76, 0x6d, 0xdc, 0xe6, 0x1b, 0x65, 0x4f, 0xea, 0x28, 0x30, 0x57, 0x6e, - 0x82, 0x82, 0x97, 0xc8, 0xc8, 0x7a, 0xdb, 0xf0, 0xfb, 0xd2, 0x49, 0xe0, 0x72, 0x7b, 0x5d, 0xb3, - 0x9c, 0xda, 0x26, 0x49, 0xf3, 0x03, 0x97, 0x87, 0x13, 0x39, 0xe8, 0xf3, 0x31, 0xd0, 0x4f, 0x44, - 0x43, 0x3f, 0x29, 0x00, 0xbd, 0x52, 0x84, 0xc9, 0x4d, 0xbd, 0x83, 0xc9, 0x0f, 0x53, 0xe4, 0x87, - 0x7e, 0x63, 0x12, 0x91, 0xbd, 0x3f, 0x26, 0x2d, 0xe9, 0x1d, 0xac, 0xfa, 0xbf, 0x79, 0x13, 0x19, - 0x08, 0x26, 0x32, 0xab, 0xd4, 0x9f, 0xd6, 0x35, 0xbc, 0x0c, 0x6d, 0x07, 0x7b, 0x8b, 0x6f, 0x06, - 0x3b, 0xdc, 0xd2, 0xd6, 0x1c, 0x8d, 0x80, 0x31, 0xa3, 0x92, 0x67, 0xde, 0x2f, 0x44, 0xee, 0xf5, - 0x0b, 0x79, 0x9e, 0x9c, 0xac, 0x47, 0xf4, 0x98, 0x8d, 0x68, 0x51, 0x17, 0x3c, 0x80, 0xa8, 0xa5, - 0xe8, 0xbf, 0xbb, 0xc0, 0xb4, 0x34, 0x0b, 0x3b, 0xeb, 0x61, 0x4f, 0x8c, 0x9c, 0xca, 0x27, 0x12, - 0x57, 0x3e, 0xbb, 0xae, 0xed, 0xd0, 0x40, 0xe7, 0x25, 0xf7, 0x1b, 0x73, 0xd1, 0xda, 0x97, 0x1e, - 0xf4, 0xbf, 0xb9, 0x51, 0xf7, 0xbf, 0xfd, 0xea, 0x98, 0x7e, 0x33, 0x7c, 0x65, 0x16, 0xe4, 0xd2, - 0xae, 0xf3, 0xb8, 0xee, 0x7e, 0xbf, 0x23, 0xec, 0xe7, 0xc2, 0xfa, 0xb3, 0xc8, 0x7b, 0xfd, 0xc7, - 0xd4, 0xfb, 0x26, 0xd4, 0x12, 0x31, 0x7f, 0x9a, 0xa8, 0xba, 0xa5, 0xaf, 0x23, 0x6f, 0x94, 0x7d, - 0x07, 0xcb, 0x47, 0x32, 0x07, 0x37, 0xcd, 0x11, 0xed, 0x9f, 0x42, 0x3d, 0x83, 0xff, 0xee, 0x75, - 0x3c, 0x59, 0x2e, 0x56, 0x1f, 0xd9, 0x5e, 0x27, 0xa2, 0x9c, 0x51, 0xe9, 0x0b, 0xfa, 0x35, 0x61, - 0xb7, 0x73, 0x2a, 0xb6, 0x58, 0x57, 0xc2, 0x64, 0x36, 0x95, 0xd8, 0xdd, 0xad, 0x31, 0xc5, 0xa6, - 0x0f, 0xd8, 0xd7, 0xc3, 0xae, 0x82, 0xc5, 0x03, 0x23, 0x86, 0x5e, 0x21, 0xbc, 0x1d, 0x45, 0xab, - 0x3d, 0x60, 0xbd, 0x30, 0x99, 0xbc, 0xc5, 0x36, 0xab, 0x62, 0x0b, 0x4e, 0x5f, 0xe2, 0x5f, 0x93, - 0x21, 0x4f, 0xb7, 0x20, 0xd1, 0xeb, 0x33, 0x09, 0x2e, 0xbd, 0x77, 0x78, 0x17, 0x42, 0xff, 0x3d, - 0xc9, 0x9a, 0x03, 0xe7, 0x6a, 0x98, 0x4d, 0xe4, 0x6a, 0xc8, 0x9f, 0xe3, 0x14, 0x68, 0x47, 0xb4, - 0x8e, 0x29, 0x4f, 0x27, 0x93, 0xb4, 0xb0, 0xbe, 0x0c, 0xa5, 0x8f, 0xf7, 0x4f, 0xe7, 0x60, 0x86, - 0x16, 0x7d, 0x5e, 0x6f, 0x6f, 0x61, 0x07, 0xbd, 0x4d, 0xfa, 0xee, 0x41, 0x5d, 0xa9, 0xc2, 0xcc, - 0x25, 0xc2, 0x36, 0xbd, 0x91, 0x85, 0xad, 0x5c, 0xdc, 0x14, 0xbb, 0xee, 0x41, 0xeb, 0xe9, 0xdd, - 0xe1, 0xc2, 0xfd, 0xef, 0xca, 0x98, 0x2e, 0xf8, 0x53, 0x07, 0xae, 0x3c, 0x31, 0xb2, 0xc2, 0x49, - 0xca, 0x49, 0xc8, 0xef, 0xe9, 0xf8, 0x52, 0xa5, 0xcd, 0xac, 0x5b, 0xf6, 0x86, 0xfe, 0x40, 0x78, - 0xdf, 0x36, 0x0c, 0x37, 0xe3, 0x25, 0x5d, 0x2d, 0x14, 0xdb, 0xbd, 0x1d, 0xc8, 0xd6, 0x18, 0xce, - 0x14, 0xf3, 0x77, 0xa3, 0x96, 0x12, 0x28, 0x62, 0x94, 0xe1, 0xcc, 0x87, 0xf2, 0x88, 0x3d, 0xb1, - 0x42, 0x05, 0x30, 0xe2, 0x6b, 0x53, 0xc5, 0xe2, 0x4b, 0x0c, 0x28, 0x3a, 0x7d, 0xc9, 0xbf, 0x5a, - 0x86, 0xa9, 0x3a, 0x76, 0x96, 0x74, 0xdc, 0x69, 0xdb, 0xc8, 0x3a, 0xb8, 0x69, 0x74, 0x0b, 0xe4, - 0x37, 0x09, 0xb1, 0x41, 0xe7, 0x16, 0x58, 0x36, 0xf4, 0x4a, 0x49, 0x74, 0x47, 0x98, 0xad, 0xbe, - 0x79, 0xdc, 0x8e, 0x04, 0x26, 0x31, 0x8f, 0xde, 0xf8, 0x92, 0xc7, 0x10, 0xd8, 0x56, 0x86, 0x19, - 0x76, 0x99, 0x62, 0xb1, 0xa3, 0x6f, 0x19, 0x68, 0x77, 0x04, 0x2d, 0x44, 0xb9, 0x15, 0x72, 0x9a, - 0x4b, 0x8d, 0x6d, 0xbd, 0xa2, 0xbe, 0x9d, 0x27, 0x29, 0x4f, 0xa5, 0x19, 0x13, 0x84, 0x91, 0x0c, - 0x14, 0xdb, 0xe3, 0x79, 0x8c, 0x61, 0x24, 0x07, 0x16, 0x9e, 0x3e, 0x62, 0x5f, 0x90, 0xe1, 0x38, - 0x63, 0xe0, 0x1c, 0xb6, 0x1c, 0xbd, 0xa5, 0x75, 0x28, 0x72, 0x2f, 0xcc, 0x8c, 0x02, 0xba, 0x15, - 0x98, 0xdd, 0x0b, 0x93, 0x65, 0x10, 0x9e, 0xed, 0x0b, 0x21, 0xc7, 0x80, 0xca, 0xff, 0x98, 0x20, - 0x1c, 0x1f, 0x27, 0x55, 0x8e, 0xe6, 0x18, 0xc3, 0xf1, 0x09, 0x33, 0x91, 0x3e, 0xc4, 0x2f, 0x61, - 0xa1, 0x79, 0x82, 0xee, 0xf3, 0xb3, 0xc2, 0xd8, 0x6e, 0xc0, 0x34, 0xc1, 0x92, 0xfe, 0xc8, 0x96, - 0x21, 0x62, 0x94, 0xd8, 0xef, 0x77, 0xd8, 0x85, 0x61, 0xfe, 0xbf, 0x6a, 0x98, 0x0e, 0x3a, 0x0f, - 0x10, 0x7c, 0x0a, 0x77, 0xd2, 0x99, 0xa8, 0x4e, 0x5a, 0x12, 0xeb, 0xa4, 0x5f, 0x27, 0x1c, 0x2c, - 0xa5, 0x3f, 0xdb, 0x07, 0x57, 0x0f, 0xb1, 0x30, 0x19, 0x83, 0x4b, 0x4f, 0x5f, 0x2f, 0x5e, 0x9e, - 0xed, 0xbd, 0x35, 0xff, 0x83, 0x23, 0x99, 0x4f, 0x85, 0xfb, 0x03, 0xb9, 0xa7, 0x3f, 0x38, 0x80, - 0x25, 0x7d, 0x23, 0x1c, 0xa5, 0x45, 0x94, 0x7c, 0xb6, 0x72, 0x34, 0x14, 0x44, 0x4f, 0x32, 0xfa, - 0xd0, 0x10, 0x4a, 0x30, 0xe8, 0x4a, 0xff, 0xb8, 0x4e, 0x2e, 0x99, 0xb1, 0x9b, 0x54, 0x41, 0xa2, - 0x38, 0x1b, 0x83, 0x5b, 0x68, 0x96, 0x5a, 0xbb, 0x1b, 0xe4, 0x4e, 0x37, 0xf4, 0x17, 0xd9, 0x51, - 0x8c, 0x08, 0xf7, 0x41, 0x96, 0xb8, 0xb8, 0xcb, 0x91, 0x4b, 0x1a, 0x41, 0x91, 0xc1, 0x85, 0x7b, - 0xf8, 0x61, 0x67, 0xe5, 0x88, 0x4a, 0xfe, 0x54, 0x6e, 0x82, 0xa3, 0x17, 0xb4, 0xd6, 0xc5, 0x2d, - 0xcb, 0xdc, 0x25, 0xb7, 0x5f, 0x99, 0xec, 0x1a, 0x2d, 0x72, 0x1d, 0x21, 0xff, 0x41, 0xb9, 0xdd, - 0x33, 0x1d, 0x72, 0x83, 0x4c, 0x87, 0x95, 0x23, 0xcc, 0x78, 0x50, 0x6e, 0xf3, 0x3b, 0x9d, 0x7c, - 0x6c, 0xa7, 0xb3, 0x72, 0xc4, 0xeb, 0x76, 0x94, 0x45, 0x98, 0x6c, 0xeb, 0x7b, 0x64, 0xab, 0x9a, - 0xcc, 0xba, 0x06, 0x1d, 0x5d, 0x5e, 0xd4, 0xf7, 0xe8, 0xc6, 0xf6, 0xca, 0x11, 0xd5, 0xff, 0x53, - 0x59, 0x86, 0x29, 0xb2, 0x2d, 0x40, 0xc8, 0x4c, 0x26, 0x3a, 0x96, 0xbc, 0x72, 0x44, 0x0d, 0xfe, - 0x75, 0xad, 0x8f, 0x2c, 0x39, 0xfb, 0x71, 0xaf, 0xb7, 0xdd, 0x9e, 0x49, 0xb4, 0xdd, 0xee, 0xca, - 0x82, 0x6e, 0xb8, 0x9f, 0x84, 0x5c, 0x8b, 0x48, 0x58, 0x62, 0x12, 0xa6, 0xaf, 0xca, 0x5d, 0x90, - 0xdd, 0xd1, 0x2c, 0x6f, 0xf2, 0x7c, 0xc3, 0x60, 0xba, 0x6b, 0x9a, 0x75, 0xd1, 0x45, 0xd0, 0xfd, - 0x6b, 0x61, 0x02, 0x72, 0x44, 0x70, 0xfe, 0x03, 0x7a, 0x63, 0x96, 0x9a, 0x21, 0x25, 0xd3, 0x70, - 0x87, 0xfd, 0x86, 0xe9, 0x1d, 0x90, 0xf9, 0x83, 0xcc, 0x68, 0x2c, 0xc8, 0xbe, 0xd7, 0xcc, 0xcb, - 0x91, 0xd7, 0xcc, 0xf7, 0xdc, 0x77, 0x9c, 0xed, 0xbd, 0xef, 0x38, 0x58, 0x3e, 0xc8, 0x0d, 0x76, - 0x54, 0xf9, 0xb3, 0x21, 0x4c, 0x97, 0x5e, 0x41, 0x44, 0xcf, 0xc0, 0x3b, 0xba, 0x11, 0xaa, 0xb3, - 0xf7, 0x9a, 0xb0, 0x53, 0x4a, 0x6a, 0xd4, 0x0c, 0x60, 0x2f, 0xfd, 0xbe, 0xe9, 0xb7, 0xb2, 0x70, - 0x8a, 0xde, 0xaa, 0xbd, 0x87, 0x1b, 0x26, 0x7f, 0xdf, 0x24, 0xfa, 0xd8, 0x48, 0x94, 0xa6, 0xcf, - 0x80, 0x23, 0xf7, 0x1d, 0x70, 0xf6, 0x1d, 0x52, 0xce, 0x0e, 0x38, 0xa4, 0x9c, 0x4b, 0xb6, 0x72, - 0xf8, 0xde, 0xb0, 0xfe, 0xac, 0xf3, 0xfa, 0x73, 0x67, 0x04, 0x40, 0xfd, 0xe4, 0x32, 0x12, 0xfb, - 0xe6, 0x2d, 0xbe, 0xa6, 0xd4, 0x39, 0x4d, 0xb9, 0x77, 0x78, 0x46, 0xd2, 0xd7, 0x96, 0xdf, 0xcf, - 0xc2, 0x15, 0x01, 0x33, 0x55, 0x7c, 0x89, 0x29, 0xca, 0xa7, 0x47, 0xa2, 0x28, 0xc9, 0x63, 0x20, - 0xa4, 0xad, 0x31, 0x7f, 0x22, 0x7c, 0x76, 0xa8, 0x17, 0x28, 0x5f, 0x36, 0x11, 0xca, 0x72, 0x12, - 0xf2, 0xb4, 0x87, 0x61, 0xd0, 0xb0, 0xb7, 0x84, 0xdd, 0x8d, 0xd8, 0x89, 0x23, 0x51, 0xde, 0xc6, - 0xa0, 0x3f, 0x6c, 0x5d, 0xa3, 0xb1, 0x6b, 0x19, 0x15, 0xc3, 0x31, 0xd1, 0x4f, 0x8c, 0x44, 0x71, - 0x7c, 0x6f, 0x38, 0x79, 0x18, 0x6f, 0xb8, 0xa1, 0x56, 0x39, 0xbc, 0x1a, 0x1c, 0xca, 0x2a, 0x47, - 0x44, 0xe1, 0xe9, 0xe3, 0xf7, 0x66, 0x19, 0x4e, 0xb2, 0xc9, 0xd6, 0x02, 0x6f, 0x21, 0xa2, 0x07, - 0x47, 0x01, 0xe4, 0x71, 0xcf, 0x4c, 0x62, 0xb7, 0x9c, 0x91, 0x17, 0xfe, 0xa4, 0x54, 0xec, 0xfd, - 0x0e, 0xdc, 0x74, 0xb0, 0x87, 0xc3, 0x91, 0x20, 0x25, 0x76, 0xad, 0x43, 0x02, 0x36, 0xd2, 0xc7, - 0xec, 0xc5, 0x32, 0xe4, 0xe9, 0x39, 0x2d, 0xb4, 0x91, 0x8a, 0xc3, 0x04, 0x1f, 0xe5, 0x59, 0x60, - 0x47, 0x2e, 0xf1, 0x25, 0xf7, 0xe9, 0xed, 0xc5, 0x1d, 0xd2, 0x2d, 0xf6, 0xdf, 0x90, 0x60, 0xba, - 0x8e, 0x9d, 0x92, 0x66, 0x59, 0xba, 0xb6, 0x35, 0x2a, 0x8f, 0x6f, 0x51, 0xef, 0x61, 0xf4, 0xcd, - 0x8c, 0xe8, 0x79, 0x1a, 0x7f, 0x21, 0xdc, 0x63, 0x35, 0x22, 0x96, 0xe0, 0xa3, 0x42, 0x67, 0x66, - 0x06, 0x51, 0x1b, 0x83, 0xc7, 0xb6, 0x04, 0x13, 0xde, 0x59, 0xbc, 0x5b, 0xb8, 0xf3, 0x99, 0xdb, - 0xce, 0x8e, 0x77, 0x0c, 0x86, 0x3c, 0xef, 0x3f, 0x03, 0x86, 0x5e, 0x96, 0xd0, 0x51, 0x3e, 0xfe, - 0x20, 0x61, 0xb2, 0x36, 0x96, 0xc4, 0x1d, 0xfe, 0xb0, 0x8e, 0x0e, 0xfe, 0xee, 0x04, 0x5b, 0x8e, - 0x5c, 0xd5, 0x1c, 0xfc, 0x30, 0xfa, 0xac, 0x0c, 0x13, 0x75, 0xec, 0xb8, 0xe3, 0x2d, 0x77, 0xb9, - 0xe9, 0xb0, 0x1a, 0xae, 0x84, 0x56, 0x3c, 0xa6, 0xd8, 0x1a, 0xc6, 0xfd, 0x30, 0xd5, 0xb5, 0xcc, - 0x16, 0xb6, 0x6d, 0xb6, 0x7a, 0x11, 0x76, 0x54, 0xeb, 0x37, 0xfa, 0x13, 0xd6, 0xe6, 0xd7, 0xbd, - 0x7f, 0xd4, 0xe0, 0xf7, 0xa4, 0x66, 0x00, 0xa5, 0xc4, 0x2a, 0x38, 0x6e, 0x33, 0x20, 0xae, 0xf0, - 0xf4, 0x81, 0xfe, 0xa4, 0x0c, 0x33, 0x75, 0xec, 0xf8, 0x52, 0x4c, 0xb0, 0xc9, 0x11, 0x0d, 0x2f, - 0x07, 0xa5, 0x7c, 0x30, 0x28, 0xc5, 0xaf, 0x06, 0xe4, 0xa5, 0xe9, 0x13, 0x1b, 0xe3, 0xd5, 0x80, - 0x62, 0x1c, 0x8c, 0xe1, 0xf8, 0xda, 0x13, 0x61, 0x8a, 0xf0, 0x42, 0x1a, 0xec, 0xcf, 0x66, 0x83, - 0xc6, 0xfb, 0xb9, 0x94, 0x1a, 0xef, 0xdd, 0x90, 0xdb, 0xd1, 0xac, 0x8b, 0x36, 0x69, 0xb8, 0xd3, - 0x22, 0x66, 0xfb, 0x9a, 0x9b, 0x5d, 0xa5, 0x7f, 0xf5, 0xf7, 0xd3, 0xcc, 0x25, 0xf3, 0xd3, 0x7c, - 0x54, 0x4a, 0x34, 0x12, 0xd2, 0xb9, 0xc3, 0x08, 0x9b, 0x7c, 0x82, 0x71, 0x33, 0xa6, 0xec, 0xf4, - 0x95, 0xe3, 0x85, 0x32, 0x4c, 0xba, 0xe3, 0x36, 0xb1, 0xc7, 0xcf, 0x1f, 0x5c, 0x1d, 0xfa, 0x1b, - 0xfa, 0x09, 0x7b, 0x60, 0x4f, 0x22, 0xa3, 0x33, 0xef, 0x13, 0xf4, 0xc0, 0x71, 0x85, 0xa7, 0x8f, - 0xc7, 0x5b, 0x29, 0x1e, 0xa4, 0x3d, 0xa0, 0xdf, 0x94, 0x41, 0x5e, 0xc6, 0xce, 0xb8, 0xad, 0xc8, - 0x37, 0x09, 0x87, 0x38, 0xe2, 0x04, 0x46, 0x78, 0x9e, 0x5f, 0xc6, 0xa3, 0x69, 0x40, 0x62, 0xb1, - 0x8d, 0x84, 0x18, 0x48, 0x1f, 0xb5, 0x77, 0x52, 0xd4, 0xe8, 0xe6, 0xc2, 0x8f, 0x8f, 0xa0, 0x57, - 0x1d, 0xef, 0xc2, 0x87, 0x27, 0x40, 0x42, 0xe3, 0xb0, 0xda, 0x5b, 0xbf, 0xc2, 0xc7, 0x72, 0x15, - 0x1f, 0xb8, 0x8d, 0x7d, 0x1b, 0xb7, 0x2e, 0xe2, 0x36, 0xfa, 0x91, 0x83, 0x43, 0x77, 0x0a, 0x26, - 0x5a, 0x94, 0x1a, 0x01, 0x6f, 0x52, 0xf5, 0x5e, 0x13, 0xdc, 0x2b, 0xcd, 0x77, 0x44, 0xf4, 0xf7, - 0x31, 0xde, 0x2b, 0x2d, 0x50, 0xfc, 0x18, 0xcc, 0x16, 0x3a, 0xcb, 0xa8, 0xb4, 0x4c, 0x03, 0xfd, - 0x97, 0x83, 0xc3, 0x72, 0x0d, 0x4c, 0xe9, 0x2d, 0xd3, 0x20, 0x61, 0x28, 0xbc, 0x43, 0x40, 0x7e, - 0x82, 0xf7, 0xb5, 0xbc, 0x63, 0x3e, 0xa4, 0xb3, 0x5d, 0xf3, 0x20, 0x61, 0x58, 0x63, 0xc2, 0x65, - 0xfd, 0xb0, 0x8c, 0x89, 0x3e, 0x65, 0xa7, 0x0f, 0xd9, 0x87, 0x02, 0xef, 0x36, 0xda, 0x15, 0x3e, - 0x2e, 0x56, 0x81, 0x87, 0x19, 0xce, 0xc2, 0xb5, 0x38, 0x94, 0xe1, 0x2c, 0x86, 0x81, 0x31, 0xdc, - 0x58, 0x11, 0xe0, 0x98, 0xfa, 0x1a, 0xf0, 0x01, 0xd0, 0x19, 0x9d, 0x79, 0x38, 0x24, 0x3a, 0x87, - 0x63, 0x22, 0xbe, 0x87, 0x85, 0xc8, 0x64, 0x16, 0x0f, 0xfa, 0xaf, 0xa3, 0x00, 0xe7, 0xce, 0x61, - 0xfc, 0x15, 0xa8, 0xb7, 0x42, 0x82, 0x1b, 0xb1, 0xf7, 0x49, 0xd0, 0xa5, 0x32, 0xc6, 0xbb, 0xe2, - 0x45, 0xca, 0x4f, 0x1f, 0xc0, 0x17, 0xc8, 0x30, 0x47, 0x7c, 0x04, 0x3a, 0x58, 0xb3, 0x68, 0x47, - 0x39, 0x12, 0x47, 0xf9, 0xb7, 0x0a, 0x07, 0xf8, 0xe1, 0xe5, 0x10, 0xf0, 0x31, 0x12, 0x28, 0xc4, - 0xa2, 0xfb, 0x08, 0xb2, 0x30, 0x96, 0x6d, 0x94, 0x82, 0xcf, 0x02, 0x53, 0xf1, 0xd1, 0xe0, 0x91, - 0xd0, 0x23, 0x97, 0x17, 0x86, 0xd7, 0xd8, 0xc6, 0xec, 0x91, 0x2b, 0xc2, 0x44, 0xfa, 0x98, 0xfc, - 0xe6, 0xad, 0x6c, 0xc1, 0xb9, 0x41, 0x2e, 0x8c, 0x7f, 0x45, 0xd6, 0x3f, 0xd1, 0xf6, 0xc9, 0x91, - 0x78, 0x60, 0x1e, 0x20, 0x20, 0xbe, 0x02, 0x59, 0xcb, 0xbc, 0x44, 0x97, 0xb6, 0x66, 0x55, 0xf2, - 0x4c, 0xaf, 0xa7, 0xec, 0xec, 0xee, 0x18, 0xf4, 0x64, 0xe8, 0xac, 0xea, 0xbd, 0x2a, 0xd7, 0xc3, - 0xec, 0x25, 0xdd, 0xd9, 0x5e, 0xc1, 0x5a, 0x1b, 0x5b, 0xaa, 0x79, 0x89, 0x78, 0xcc, 0x4d, 0xaa, - 0x7c, 0x22, 0xef, 0xbf, 0x22, 0x60, 0x5f, 0x92, 0x5b, 0xe4, 0xc7, 0x72, 0xfc, 0x2d, 0x89, 0xe5, - 0x19, 0xcd, 0x55, 0xfa, 0x0a, 0xf3, 0x2e, 0x19, 0xa6, 0x54, 0xf3, 0x12, 0x53, 0x92, 0xff, 0xe3, - 0x70, 0x75, 0x24, 0xf1, 0x44, 0x8f, 0x48, 0xce, 0x67, 0x7f, 0xec, 0x13, 0xbd, 0xd8, 0xe2, 0xc7, - 0x72, 0x72, 0x69, 0x46, 0x35, 0x2f, 0xd5, 0xb1, 0x43, 0x5b, 0x04, 0x6a, 0x8e, 0xc8, 0xc9, 0x5a, - 0xb7, 0x29, 0x41, 0x36, 0x0f, 0xf7, 0xdf, 0x93, 0xee, 0x22, 0xf8, 0x02, 0xf2, 0x59, 0x1c, 0xf7, - 0x2e, 0xc2, 0x40, 0x0e, 0xc6, 0x10, 0x23, 0x45, 0x86, 0x69, 0xd5, 0xbc, 0xe4, 0x0e, 0x0d, 0x4b, - 0x7a, 0xa7, 0x33, 0x9a, 0x11, 0x32, 0xa9, 0xf1, 0xef, 0x89, 0xc1, 0xe3, 0x62, 0xec, 0xc6, 0xff, - 0x00, 0x06, 0xd2, 0x87, 0xe1, 0x79, 0xb4, 0xb1, 0x78, 0x23, 0xb4, 0x31, 0x1a, 0x1c, 0x86, 0x6d, - 0x10, 0x3e, 0x1b, 0x87, 0xd6, 0x20, 0xa2, 0x38, 0x18, 0xcb, 0xce, 0xc9, 0x5c, 0x89, 0x0c, 0xf3, - 0xa3, 0x6d, 0x13, 0x6f, 0x4f, 0xe6, 0x9a, 0xc8, 0x86, 0x5d, 0x8e, 0x91, 0x91, 0xa0, 0x91, 0xc0, - 0x05, 0x51, 0x80, 0x87, 0xf4, 0xf1, 0x78, 0xbf, 0x0c, 0x33, 0x94, 0x85, 0xc7, 0x89, 0x15, 0x30, - 0x54, 0xa3, 0x0a, 0xd7, 0xe0, 0x70, 0x1a, 0x55, 0x0c, 0x07, 0x63, 0xb9, 0x15, 0xd4, 0xb5, 0xe3, - 0x86, 0x38, 0x3e, 0x1e, 0x85, 0xe0, 0xd0, 0xc6, 0xd8, 0x08, 0x8f, 0x90, 0x0f, 0x63, 0x8c, 0x1d, - 0xd2, 0x31, 0xf2, 0xe7, 0xf9, 0xad, 0x68, 0x94, 0x18, 0x1c, 0xa0, 0x29, 0x8c, 0x10, 0x86, 0x21, - 0x9b, 0xc2, 0x21, 0x21, 0xf1, 0x45, 0x19, 0x80, 0x32, 0xb0, 0x66, 0xee, 0x91, 0xcb, 0x7c, 0x46, - 0xd0, 0x9d, 0xf5, 0xba, 0xd5, 0xcb, 0x03, 0xdc, 0xea, 0x13, 0x86, 0x70, 0x49, 0xba, 0x12, 0x18, - 0x92, 0xb2, 0x5b, 0xc9, 0xb1, 0xaf, 0x04, 0xc6, 0x97, 0x9f, 0x3e, 0xc6, 0x8f, 0x51, 0x6b, 0x2e, - 0x38, 0x60, 0xfa, 0x2b, 0x23, 0x41, 0x39, 0x34, 0xfb, 0x97, 0xf9, 0xd9, 0xff, 0x01, 0xb0, 0x1d, - 0xd6, 0x46, 0x1c, 0x74, 0x70, 0x34, 0x7d, 0x1b, 0xf1, 0xf0, 0x0e, 0x88, 0xfe, 0x78, 0x16, 0x8e, - 0xb2, 0x4e, 0xe4, 0xbb, 0x01, 0xe2, 0x84, 0xe7, 0xf0, 0xb8, 0x4e, 0x72, 0x00, 0xca, 0xa3, 0x5a, - 0x90, 0x4a, 0xb2, 0x94, 0x29, 0xc0, 0xde, 0x58, 0x56, 0x37, 0xf2, 0xe5, 0x87, 0xbb, 0x9a, 0xd1, - 0x16, 0x0f, 0xf7, 0x3b, 0x00, 0x78, 0x6f, 0xad, 0x51, 0xe6, 0xd7, 0x1a, 0xfb, 0xac, 0x4c, 0x26, - 0xde, 0xb9, 0x26, 0x22, 0xa3, 0xec, 0x8e, 0x7d, 0xe7, 0x3a, 0xba, 0xec, 0xf4, 0x51, 0x7a, 0xbb, - 0x0c, 0xd9, 0xba, 0x69, 0x39, 0xe8, 0xf9, 0x49, 0x5a, 0x27, 0x95, 0x7c, 0x00, 0x92, 0xf7, 0xae, - 0x94, 0xb8, 0x5b, 0x9a, 0x6f, 0x89, 0x3f, 0xea, 0xac, 0x39, 0x1a, 0xf1, 0xea, 0x76, 0xcb, 0x0f, - 0x5d, 0xd7, 0x9c, 0x34, 0x9e, 0x0e, 0x95, 0x5f, 0x3d, 0xfa, 0x00, 0x46, 0x6a, 0xf1, 0x74, 0x22, - 0x4b, 0x4e, 0x1f, 0xb7, 0x57, 0x1d, 0x65, 0xbe, 0xad, 0x4b, 0x7a, 0x07, 0xa3, 0xe7, 0x53, 0x97, - 0x91, 0xaa, 0xb6, 0x83, 0xc5, 0x8f, 0xc4, 0xc4, 0xba, 0xb6, 0x92, 0xf8, 0xb2, 0x72, 0x10, 0x5f, - 0x36, 0x69, 0x83, 0xa2, 0x07, 0xd0, 0x29, 0x4b, 0xe3, 0x6e, 0x50, 0x31, 0x65, 0x8f, 0x25, 0x4e, - 0xe7, 0xb1, 0x3a, 0x76, 0xa8, 0x51, 0x59, 0xf3, 0x6e, 0x60, 0xf9, 0xd1, 0x91, 0x44, 0xec, 0xf4, - 0x2f, 0x78, 0x91, 0x7b, 0x2e, 0x78, 0x79, 0x57, 0x18, 0x9c, 0x35, 0x1e, 0x9c, 0x1f, 0x8c, 0x16, - 0x10, 0xcf, 0xe4, 0x48, 0x60, 0x7a, 0x93, 0x0f, 0xd3, 0x3a, 0x07, 0xd3, 0x5d, 0x43, 0x72, 0x91, - 0x3e, 0x60, 0x3f, 0x97, 0x83, 0xa3, 0x74, 0xd2, 0x5f, 0x34, 0xda, 0x2c, 0xc2, 0xea, 0xeb, 0xa5, - 0x43, 0xde, 0x6c, 0xdb, 0x1f, 0x82, 0x95, 0x8b, 0xe5, 0x9c, 0xeb, 0xbd, 0x1d, 0x7f, 0x81, 0x86, - 0x73, 0x75, 0x3b, 0x51, 0xb2, 0xd3, 0x26, 0x7e, 0x43, 0xbe, 0xff, 0x1f, 0x7f, 0x97, 0xd1, 0x84, - 0xf8, 0x5d, 0x46, 0x7f, 0x9a, 0x6c, 0xdd, 0x8e, 0x14, 0xdd, 0x23, 0xf0, 0x94, 0x6d, 0xa7, 0x04, - 0x2b, 0x7a, 0x02, 0xdc, 0x7d, 0x6f, 0xb8, 0x93, 0x05, 0x11, 0x44, 0x86, 0x74, 0x27, 0x23, 0x04, - 0x0e, 0xd3, 0x9d, 0x6c, 0x10, 0x03, 0x63, 0xb8, 0xd5, 0x3e, 0xc7, 0x76, 0xf3, 0x49, 0xbb, 0x41, - 0x7f, 0x25, 0xa5, 0x3e, 0x4a, 0x7f, 0x2b, 0x93, 0xc8, 0xff, 0x99, 0xf0, 0x15, 0x3f, 0x4c, 0x27, - 0xf1, 0x68, 0x8e, 0x23, 0x37, 0x86, 0x75, 0x23, 0x89, 0xf8, 0xa2, 0x9f, 0xd7, 0xdb, 0xce, 0xf6, - 0x88, 0x4e, 0x74, 0x5c, 0x72, 0x69, 0x79, 0xd7, 0x23, 0x93, 0x17, 0xf4, 0x6f, 0x99, 0x44, 0x21, - 0xa4, 0x7c, 0x91, 0x10, 0xb6, 0x22, 0x44, 0x9c, 0x20, 0xf0, 0x53, 0x2c, 0xbd, 0x31, 0x6a, 0xf4, - 0x39, 0xbd, 0x8d, 0xcd, 0xc7, 0xa1, 0x46, 0x13, 0xbe, 0x46, 0xa7, 0xd1, 0x71, 0xe4, 0xbe, 0x47, - 0x35, 0xda, 0x17, 0xc9, 0x88, 0x34, 0x3a, 0x96, 0x5e, 0xfa, 0x32, 0x7e, 0xd9, 0x0c, 0x9b, 0x48, - 0xad, 0xea, 0xc6, 0x45, 0xf4, 0xcf, 0x79, 0xef, 0x62, 0xe6, 0xf3, 0xba, 0xb3, 0xcd, 0x62, 0xc1, - 0xfc, 0xbe, 0xf0, 0xdd, 0x28, 0x43, 0xc4, 0x7b, 0xe1, 0xc3, 0x49, 0xe5, 0xf6, 0x85, 0x93, 0x2a, - 0xc2, 0xac, 0x6e, 0x38, 0xd8, 0x32, 0xb4, 0xce, 0x52, 0x47, 0xdb, 0xb2, 0x4f, 0x4d, 0xf4, 0xbd, - 0xbc, 0xae, 0x12, 0xca, 0xa3, 0xf2, 0x7f, 0x84, 0xaf, 0xaf, 0x9c, 0xe4, 0xaf, 0xaf, 0x8c, 0x88, - 0x7e, 0x35, 0x15, 0x1d, 0xfd, 0xca, 0x8f, 0x6e, 0x05, 0x83, 0x83, 0x63, 0x8b, 0xda, 0xc6, 0x09, - 0xc3, 0xfd, 0xdd, 0x22, 0x18, 0x85, 0xcd, 0x0f, 0xfd, 0xf8, 0x1b, 0x72, 0xa2, 0xd5, 0x3d, 0x57, - 0x11, 0xe6, 0x7b, 0x95, 0x20, 0xb1, 0x85, 0x1a, 0xae, 0xbc, 0xdc, 0x53, 0x79, 0xdf, 0xe4, 0xc9, - 0x0a, 0x98, 0x3c, 0x61, 0xa5, 0xca, 0x89, 0x29, 0x55, 0x92, 0xc5, 0x42, 0x91, 0xda, 0x8e, 0xe1, - 0x34, 0x52, 0x0e, 0x8e, 0x79, 0xd1, 0x6e, 0xbb, 0x5d, 0xac, 0x59, 0x9a, 0xd1, 0xc2, 0xe8, 0x43, - 0xd2, 0x28, 0xcc, 0xde, 0x25, 0x98, 0xd4, 0x5b, 0xa6, 0x51, 0xd7, 0x9f, 0xed, 0x5d, 0x2e, 0x17, - 0x1f, 0x64, 0x9d, 0x48, 0xa4, 0xc2, 0xfe, 0x50, 0xfd, 0x7f, 0x95, 0x0a, 0x4c, 0xb5, 0x34, 0xab, - 0x4d, 0x83, 0xf0, 0xe5, 0x7a, 0x2e, 0x72, 0x8a, 0x24, 0x54, 0xf2, 0x7e, 0x51, 0x83, 0xbf, 0x95, - 0x1a, 0x2f, 0xc4, 0x7c, 0x4f, 0x34, 0x8f, 0x48, 0x62, 0x8b, 0xc1, 0x4f, 0x9c, 0xcc, 0x5d, 0xe9, - 0x58, 0xb8, 0x43, 0xee, 0xa0, 0xa7, 0x3d, 0xc4, 0x94, 0x1a, 0x24, 0x24, 0x5d, 0x1e, 0x20, 0x45, - 0xed, 0x43, 0x63, 0xdc, 0xcb, 0x03, 0x42, 0x5c, 0xa4, 0xaf, 0x99, 0x6f, 0xc9, 0xc3, 0x2c, 0xed, - 0xd5, 0x98, 0x38, 0xd1, 0x0b, 0xc8, 0x15, 0xd2, 0xce, 0x03, 0xf8, 0x32, 0xaa, 0x1f, 0x7c, 0x4c, - 0x2e, 0x80, 0x7c, 0xd1, 0x0f, 0x38, 0xe8, 0x3e, 0x26, 0xdd, 0xb7, 0xf7, 0xf8, 0x9a, 0xa7, 0x3c, - 0x8d, 0x7b, 0xdf, 0x3e, 0xbe, 0xf8, 0xf4, 0xf1, 0xf9, 0x79, 0x19, 0xe4, 0x62, 0xbb, 0x8d, 0x5a, - 0x07, 0x87, 0xe2, 0x0c, 0x4c, 0x7b, 0x6d, 0x26, 0x88, 0x01, 0x19, 0x4e, 0x4a, 0xba, 0x08, 0xea, - 0xcb, 0xa6, 0xd8, 0x1e, 0xfb, 0xae, 0x42, 0x4c, 0xd9, 0xe9, 0x83, 0xf2, 0x2b, 0x13, 0xac, 0xd1, - 0x2c, 0x98, 0xe6, 0x45, 0x72, 0x54, 0xe6, 0xf9, 0x32, 0xe4, 0x96, 0xb0, 0xd3, 0xda, 0x1e, 0x51, - 0x9b, 0xd9, 0xb5, 0x3a, 0x5e, 0x9b, 0xd9, 0x77, 0x1f, 0xfe, 0x60, 0x1b, 0xd6, 0x63, 0x6b, 0x9e, - 0xb0, 0x34, 0xee, 0xe8, 0xce, 0xb1, 0xa5, 0xa7, 0x0f, 0xce, 0xbf, 0xc9, 0x30, 0xe7, 0xaf, 0x70, - 0x51, 0x4c, 0x7e, 0x2e, 0xf3, 0x78, 0x5b, 0xef, 0x44, 0x9f, 0x4e, 0x16, 0x22, 0xcd, 0x97, 0x29, - 0x5f, 0xb3, 0x94, 0x17, 0x16, 0x13, 0x04, 0x4f, 0x13, 0x63, 0x70, 0x0c, 0x33, 0x78, 0x19, 0x26, - 0x09, 0x43, 0x8b, 0xfa, 0x1e, 0x71, 0x1d, 0xe4, 0x16, 0x1a, 0x9f, 0x33, 0x92, 0x85, 0xc6, 0xbb, - 0xf8, 0x85, 0x46, 0xc1, 0x88, 0xc7, 0xde, 0x3a, 0x63, 0x42, 0x5f, 0x1a, 0xf7, 0xff, 0x91, 0x2f, - 0x33, 0x26, 0xf0, 0xa5, 0x19, 0x50, 0x7e, 0xfa, 0x88, 0xfe, 0xc6, 0x7f, 0x62, 0x9d, 0xad, 0xb7, - 0xa1, 0x8a, 0xfe, 0xe7, 0x31, 0xc8, 0x9e, 0x73, 0x1f, 0xfe, 0x77, 0x70, 0x23, 0xd6, 0x4b, 0x47, - 0x10, 0x9c, 0xe1, 0x1e, 0xc8, 0xba, 0xf4, 0xd9, 0xb4, 0xe5, 0x26, 0xb1, 0xdd, 0x5d, 0x97, 0x11, - 0x95, 0xfc, 0xa7, 0x9c, 0x84, 0xbc, 0x6d, 0xee, 0x5a, 0x2d, 0xd7, 0x7c, 0x76, 0x35, 0x86, 0xbd, - 0x25, 0x0d, 0x4a, 0xca, 0x91, 0x9e, 0x1f, 0x9d, 0xcb, 0x68, 0xe8, 0x82, 0x24, 0x99, 0xbb, 0x20, - 0x29, 0xc1, 0xfe, 0x81, 0x00, 0x6f, 0xe9, 0x6b, 0xc4, 0x5f, 0x91, 0xbb, 0x02, 0xdb, 0xa3, 0x82, - 0x3d, 0x42, 0x2c, 0x07, 0x55, 0x87, 0xa4, 0x0e, 0xdf, 0xbc, 0x68, 0xfd, 0x38, 0xf0, 0x63, 0x75, - 0xf8, 0x16, 0xe0, 0x61, 0x2c, 0xa7, 0xd4, 0xf3, 0xcc, 0x49, 0xf5, 0xc1, 0x51, 0xa2, 0x9b, 0xe5, - 0x94, 0xfe, 0x40, 0xe8, 0x8c, 0xd0, 0x79, 0x75, 0x68, 0x74, 0x0e, 0xc9, 0x7d, 0xf5, 0x0f, 0x65, - 0x12, 0x09, 0xd3, 0x33, 0x72, 0xc4, 0x2f, 0x3a, 0x4a, 0x0c, 0x91, 0x3b, 0x06, 0x73, 0x71, 0xa0, - 0x67, 0x87, 0x0f, 0x0d, 0xce, 0x8b, 0x2e, 0xc4, 0xff, 0xb8, 0x43, 0x83, 0x8b, 0x32, 0x92, 0x3e, - 0x90, 0xaf, 0xa1, 0x17, 0x8b, 0x15, 0x5b, 0x8e, 0xbe, 0x37, 0xe2, 0x96, 0xc6, 0x0f, 0x2f, 0x09, - 0xa3, 0x01, 0xef, 0x93, 0x10, 0xe5, 0x70, 0xdc, 0xd1, 0x80, 0xc5, 0xd8, 0x48, 0x1f, 0xa6, 0xbf, - 0xcd, 0xbb, 0xd2, 0x63, 0x6b, 0x33, 0xbf, 0xc9, 0x56, 0x03, 0xf0, 0xc1, 0xd1, 0x3a, 0x0b, 0x33, - 0xa1, 0xa9, 0xbf, 0x77, 0x61, 0x0d, 0x97, 0x96, 0xf4, 0xa0, 0xbb, 0x2f, 0xb2, 0x91, 0x2f, 0x0c, - 0x24, 0x58, 0xf0, 0x15, 0x61, 0x62, 0x2c, 0xf7, 0xc1, 0x79, 0x63, 0xd8, 0x98, 0xb0, 0xfa, 0xfd, - 0x30, 0x56, 0x35, 0x1e, 0xab, 0x3b, 0x44, 0xc4, 0x24, 0x36, 0xa6, 0x09, 0xcd, 0x1b, 0xdf, 0xec, - 0xc3, 0xa5, 0x72, 0x70, 0xdd, 0x33, 0x34, 0x1f, 0xe9, 0x23, 0xf6, 0xab, 0xb4, 0x3b, 0xac, 0x53, - 0x93, 0x7d, 0x34, 0xdd, 0x21, 0x9b, 0x0d, 0xc8, 0xdc, 0x6c, 0x20, 0xa1, 0xbf, 0x7d, 0xe0, 0x46, - 0xea, 0x31, 0x37, 0x08, 0xa2, 0xec, 0x88, 0xfd, 0xed, 0x07, 0x72, 0x90, 0x3e, 0x38, 0xff, 0x28, - 0x03, 0x2c, 0x5b, 0xe6, 0x6e, 0xb7, 0x66, 0xb5, 0xb1, 0x85, 0xfe, 0x26, 0x98, 0x00, 0xfc, 0xc2, - 0x08, 0x26, 0x00, 0xeb, 0x00, 0x5b, 0x3e, 0x71, 0xa6, 0xe1, 0xb7, 0x8a, 0x99, 0xfb, 0x01, 0x53, - 0x6a, 0x88, 0x06, 0x7f, 0xe5, 0xec, 0x0f, 0xf1, 0x18, 0xc7, 0xf5, 0x59, 0x01, 0xb9, 0x51, 0x4e, - 0x00, 0xde, 0xea, 0x63, 0xdd, 0xe0, 0xb0, 0xbe, 0xef, 0x00, 0x9c, 0xa4, 0x8f, 0xf9, 0x3f, 0x4d, - 0xc0, 0x34, 0xdd, 0xae, 0xa3, 0x32, 0xfd, 0xfb, 0x00, 0xf4, 0x5f, 0x19, 0x01, 0xe8, 0x1b, 0x30, - 0x63, 0x06, 0xd4, 0x69, 0x9f, 0x1a, 0x5e, 0x80, 0x89, 0x85, 0x3d, 0xc4, 0x97, 0xca, 0x91, 0x41, - 0x1f, 0x08, 0x23, 0xaf, 0xf2, 0xc8, 0xdf, 0x15, 0x23, 0xef, 0x10, 0xc5, 0x51, 0x42, 0xff, 0x36, - 0x1f, 0xfa, 0x0d, 0x0e, 0xfa, 0xe2, 0x41, 0x58, 0x19, 0x43, 0xb8, 0x7d, 0x19, 0xb2, 0xe4, 0x74, - 0xdc, 0x6f, 0xa5, 0x38, 0xbf, 0x3f, 0x05, 0x13, 0xa4, 0xc9, 0xfa, 0xf3, 0x0e, 0xef, 0xd5, 0xfd, - 0xa2, 0x6d, 0x3a, 0xd8, 0xf2, 0x3d, 0x16, 0xbc, 0x57, 0x97, 0x07, 0xcf, 0x2b, 0xd9, 0x3e, 0x95, - 0xa7, 0x1b, 0x91, 0x7e, 0xc2, 0xd0, 0x93, 0x92, 0xb0, 0xc4, 0x47, 0x76, 0x5e, 0x6e, 0x98, 0x49, - 0xc9, 0x00, 0x46, 0xd2, 0x07, 0xfe, 0x2f, 0xb2, 0x70, 0x8a, 0xae, 0x2a, 0x2d, 0x59, 0xe6, 0x4e, - 0xcf, 0xed, 0x56, 0xfa, 0xc1, 0x75, 0xe1, 0x06, 0x98, 0x73, 0x38, 0x7f, 0x6c, 0xa6, 0x13, 0x3d, - 0xa9, 0xe8, 0xcf, 0xc2, 0x3e, 0x15, 0xcf, 0xe2, 0x91, 0x5c, 0x88, 0x11, 0x60, 0x14, 0xef, 0x89, - 0x17, 0xea, 0x05, 0x19, 0x0d, 0x2d, 0x52, 0xc9, 0x43, 0xad, 0x59, 0xfa, 0x3a, 0x95, 0x13, 0xd1, - 0xa9, 0x77, 0xfb, 0x3a, 0xf5, 0x23, 0x9c, 0x4e, 0x2d, 0x1f, 0x5c, 0x24, 0xe9, 0xeb, 0xd6, 0x2b, - 0xfc, 0x8d, 0x21, 0x7f, 0xdb, 0x6e, 0x27, 0x85, 0xcd, 0xba, 0xb0, 0x3f, 0x52, 0x96, 0xf3, 0x47, - 0xe2, 0xef, 0xa3, 0x48, 0x30, 0x13, 0xe6, 0xb9, 0x8e, 0xd0, 0xa5, 0x39, 0x90, 0x74, 0x8f, 0x3b, - 0x49, 0x6f, 0x0f, 0x35, 0xd7, 0x8d, 0x2d, 0x68, 0x0c, 0x6b, 0x4b, 0x73, 0x90, 0x5f, 0xd2, 0x3b, - 0x0e, 0xb6, 0xd0, 0x63, 0x6c, 0xa6, 0xfb, 0x8a, 0x14, 0x07, 0x80, 0x45, 0xc8, 0x6f, 0x92, 0xd2, - 0x98, 0xc9, 0x7c, 0xb3, 0x58, 0xeb, 0xa1, 0x1c, 0xaa, 0xec, 0xdf, 0xa4, 0xd1, 0xf9, 0x7a, 0xc8, - 0x8c, 0x6c, 0x8a, 0x9c, 0x20, 0x3a, 0xdf, 0x60, 0x16, 0xc6, 0x72, 0x31, 0x55, 0x5e, 0xc5, 0x3b, - 0xee, 0x18, 0x7f, 0x31, 0x3d, 0x84, 0x0b, 0x20, 0xeb, 0x6d, 0x9b, 0x74, 0x8e, 0x53, 0xaa, 0xfb, - 0x98, 0xd4, 0x57, 0xa8, 0x57, 0x54, 0x94, 0xe5, 0x71, 0xfb, 0x0a, 0x09, 0x71, 0x91, 0x3e, 0x66, - 0xdf, 0x22, 0x8e, 0xa2, 0xdd, 0x8e, 0xd6, 0xc2, 0x2e, 0xf7, 0xa9, 0xa1, 0x46, 0x7b, 0xb2, 0xac, - 0xd7, 0x93, 0x85, 0xda, 0x69, 0xee, 0x00, 0xed, 0x74, 0xd8, 0x65, 0x48, 0x5f, 0xe6, 0xa4, 0xe2, - 0x87, 0xb6, 0x0c, 0x19, 0xcb, 0xc6, 0x18, 0xae, 0x1d, 0xf5, 0x0e, 0xd2, 0x8e, 0xb5, 0xb5, 0x0e, - 0xbb, 0x49, 0xc3, 0x84, 0x35, 0xb2, 0x43, 0xb3, 0xc3, 0x6c, 0xd2, 0x44, 0xf3, 0x30, 0x06, 0xb4, - 0xe6, 0x18, 0x5a, 0x9f, 0x62, 0xc3, 0x68, 0xca, 0xfb, 0xa4, 0xb6, 0x69, 0x39, 0xc9, 0xf6, 0x49, - 0x5d, 0xee, 0x54, 0xf2, 0x5f, 0xd2, 0x83, 0x57, 0xfc, 0xb9, 0xea, 0x51, 0x0d, 0x9f, 0x09, 0x0e, - 0x5e, 0x0d, 0x62, 0x20, 0x7d, 0x78, 0xdf, 0x70, 0x48, 0x83, 0xe7, 0xb0, 0xcd, 0x91, 0xb5, 0x81, - 0x91, 0x0d, 0x9d, 0xc3, 0x34, 0xc7, 0x68, 0x1e, 0xd2, 0xc7, 0xeb, 0xeb, 0xa1, 0x81, 0xf3, 0x75, - 0x63, 0x1c, 0x38, 0xbd, 0x96, 0x99, 0x1b, 0xb2, 0x65, 0x0e, 0xbb, 0xff, 0xc3, 0x64, 0x3d, 0xba, - 0x01, 0x73, 0x98, 0xfd, 0x9f, 0x18, 0x26, 0xd2, 0x47, 0xfc, 0xf5, 0x32, 0xe4, 0xea, 0xe3, 0x1f, - 0x2f, 0x87, 0x9d, 0x8b, 0x10, 0x59, 0xd5, 0x47, 0x36, 0x5c, 0x0e, 0x33, 0x17, 0x89, 0x64, 0x61, - 0x0c, 0x81, 0xf7, 0x8f, 0xc2, 0x0c, 0x59, 0x12, 0xf1, 0xb6, 0x59, 0xbf, 0xce, 0x46, 0xcd, 0x47, - 0x53, 0x6c, 0xab, 0xf7, 0xc3, 0xa4, 0xb7, 0x7f, 0xc7, 0x46, 0xce, 0x79, 0xb1, 0xf6, 0xe9, 0x71, - 0xa9, 0xfa, 0xff, 0x1f, 0xc8, 0x19, 0x62, 0xe4, 0x7b, 0xb5, 0xc3, 0x3a, 0x43, 0x1c, 0xea, 0x7e, - 0xed, 0x9f, 0x06, 0x23, 0xea, 0x7f, 0x49, 0x0f, 0xf3, 0xde, 0x7d, 0xdc, 0x6c, 0x9f, 0x7d, 0xdc, - 0x0f, 0x85, 0xb1, 0xac, 0xf3, 0x58, 0xde, 0x2d, 0x2a, 0xc2, 0x11, 0x8e, 0xb5, 0x6f, 0xf7, 0xe1, - 0x3c, 0xc7, 0xc1, 0xb9, 0x70, 0x20, 0x5e, 0xc6, 0x70, 0xf0, 0x31, 0x1b, 0x8c, 0xb9, 0x1f, 0x4e, - 0xb1, 0x1d, 0xf7, 0x9c, 0xaa, 0xc8, 0xee, 0x3b, 0x55, 0xc1, 0xb5, 0xf4, 0xdc, 0x01, 0x5b, 0xfa, - 0x87, 0xc3, 0xda, 0xd1, 0xe0, 0xb5, 0xe3, 0x1e, 0x71, 0x44, 0x46, 0x37, 0x32, 0xbf, 0xc3, 0x57, - 0x8f, 0xf3, 0x9c, 0x7a, 0x94, 0x0e, 0xc6, 0x4c, 0xfa, 0xfa, 0xf1, 0x47, 0xde, 0x84, 0xf6, 0x90, - 0xdb, 0xfb, 0xb0, 0x5b, 0xc5, 0x9c, 0x10, 0x47, 0x36, 0x72, 0x0f, 0xb3, 0x55, 0x3c, 0x88, 0x93, - 0x31, 0xc4, 0x62, 0x9b, 0x85, 0x69, 0xc2, 0xd3, 0x79, 0xbd, 0xbd, 0x85, 0x1d, 0xf4, 0x1b, 0xd4, - 0x47, 0xd1, 0x8b, 0x7c, 0x39, 0xa2, 0xf0, 0x44, 0x51, 0xe7, 0x5d, 0x93, 0x7a, 0x74, 0x50, 0x26, - 0xe7, 0x43, 0x0c, 0x8e, 0x3b, 0x82, 0xe2, 0x40, 0x0e, 0xd2, 0x87, 0xec, 0x03, 0xd4, 0xdd, 0x66, - 0x55, 0xbb, 0x6c, 0xee, 0x3a, 0xe8, 0x91, 0x11, 0x74, 0xd0, 0x0b, 0x90, 0xef, 0x10, 0x6a, 0xec, - 0x58, 0x46, 0xfc, 0x74, 0x87, 0x89, 0x80, 0x96, 0xaf, 0xb2, 0x3f, 0x93, 0x9e, 0xcd, 0x08, 0xe4, - 0x48, 0xe9, 0x8c, 0xfb, 0x6c, 0xc6, 0x80, 0xf2, 0xc7, 0x72, 0xc7, 0xce, 0xa4, 0x5b, 0xba, 0xbe, - 0xa3, 0x3b, 0x23, 0x8a, 0xe0, 0xd0, 0x71, 0x69, 0x79, 0x11, 0x1c, 0xc8, 0x4b, 0xd2, 0x13, 0xa3, - 0x21, 0xa9, 0xb8, 0xbf, 0x8f, 0xfb, 0xc4, 0x68, 0x7c, 0xf1, 0xe9, 0x63, 0xf2, 0x4b, 0xb4, 0x65, - 0x9d, 0xa3, 0xce, 0xb7, 0x29, 0xfa, 0xf5, 0x0e, 0xdd, 0x58, 0x28, 0x6b, 0x87, 0xd7, 0x58, 0xfa, - 0x96, 0x9f, 0x3e, 0x30, 0xff, 0xfd, 0xfb, 0x21, 0xb7, 0x88, 0x2f, 0xec, 0x6e, 0xa1, 0xbb, 0x60, - 0xb2, 0x61, 0x61, 0x5c, 0x31, 0x36, 0x4d, 0x57, 0xba, 0x8e, 0xfb, 0xec, 0x41, 0xc2, 0xde, 0x5c, - 0x3c, 0xb6, 0xb1, 0xd6, 0x0e, 0xce, 0x9f, 0x79, 0xaf, 0xe8, 0xa5, 0x12, 0x64, 0xeb, 0x8e, 0xe6, - 0xa0, 0x29, 0x1f, 0x5b, 0xf4, 0x48, 0x18, 0x8b, 0xbb, 0x78, 0x2c, 0x6e, 0xe0, 0x64, 0x41, 0x38, - 0x98, 0x77, 0xff, 0x8f, 0x00, 0x00, 0xc1, 0xe4, 0x43, 0xb6, 0x69, 0xb8, 0x39, 0xbc, 0x23, 0x90, - 0xde, 0x3b, 0x7a, 0xb9, 0x2f, 0xee, 0x7b, 0x39, 0x71, 0x3f, 0x59, 0xac, 0x88, 0x31, 0xac, 0xb4, - 0x49, 0x30, 0xe5, 0x8a, 0x76, 0x05, 0x6b, 0x6d, 0x1b, 0x7d, 0x5f, 0xa0, 0xfc, 0x11, 0x62, 0x46, - 0xef, 0x11, 0x0e, 0xc6, 0x49, 0x6b, 0xe5, 0x13, 0x8f, 0xf6, 0xe8, 0xf0, 0x36, 0xff, 0x25, 0x3e, - 0x18, 0xc9, 0x2d, 0x90, 0xd5, 0x8d, 0x4d, 0x93, 0xf9, 0x17, 0x5e, 0x1d, 0x41, 0xdb, 0xd5, 0x09, - 0x95, 0x64, 0x14, 0x8c, 0xd4, 0x19, 0xcf, 0xd6, 0x58, 0x2e, 0xbd, 0xcb, 0xba, 0xa5, 0xa3, 0xff, - 0xff, 0x40, 0x61, 0x2b, 0x0a, 0x64, 0xbb, 0x9a, 0xb3, 0xcd, 0x8a, 0x26, 0xcf, 0xae, 0x8d, 0xbc, - 0x6b, 0x68, 0x86, 0x69, 0x5c, 0xde, 0xd1, 0x9f, 0xed, 0xdf, 0xad, 0xcb, 0xa5, 0xb9, 0x9c, 0x6f, - 0x61, 0x03, 0x5b, 0x9a, 0x83, 0xeb, 0x7b, 0x5b, 0x64, 0x8e, 0x35, 0xa9, 0x86, 0x93, 0x12, 0xeb, - 0xbf, 0xcb, 0x71, 0xb4, 0xfe, 0x6f, 0xea, 0x1d, 0x4c, 0x22, 0x35, 0x31, 0xfd, 0xf7, 0xde, 0x13, - 0xe9, 0x7f, 0x9f, 0x22, 0xd2, 0x47, 0xe3, 0xdb, 0x12, 0xcc, 0xd4, 0x5d, 0x85, 0xab, 0xef, 0xee, - 0xec, 0x68, 0xd6, 0x65, 0x74, 0x5d, 0x80, 0x4a, 0x48, 0x35, 0x33, 0xbc, 0x5f, 0xca, 0x1f, 0x0a, - 0x5f, 0x2b, 0xcd, 0x9a, 0x76, 0xa8, 0x84, 0xc4, 0xed, 0xe0, 0x36, 0xc8, 0xb9, 0xea, 0xed, 0x79, - 0x5c, 0xc6, 0x36, 0x04, 0x9a, 0x53, 0x30, 0xa2, 0xd5, 0x40, 0xde, 0xc6, 0x10, 0x4d, 0x43, 0x82, - 0xa3, 0x75, 0x47, 0x6b, 0x5d, 0x5c, 0x36, 0x2d, 0x73, 0xd7, 0xd1, 0x0d, 0x6c, 0xa3, 0x27, 0x04, - 0x08, 0x78, 0xfa, 0x9f, 0x09, 0xf4, 0x1f, 0xfd, 0x7b, 0x46, 0x74, 0x14, 0xf5, 0xbb, 0xd5, 0x30, - 0xf9, 0x88, 0x00, 0x55, 0x62, 0xe3, 0xa2, 0x08, 0xc5, 0xf4, 0x85, 0xf6, 0x3a, 0x19, 0x0a, 0xe5, - 0x87, 0xbb, 0xa6, 0xe5, 0xac, 0x9a, 0x2d, 0xad, 0x63, 0x3b, 0xa6, 0x85, 0x51, 0x2d, 0x56, 0x6a, - 0x6e, 0x0f, 0xd3, 0x36, 0x5b, 0xc1, 0xe0, 0xc8, 0xde, 0xc2, 0x6a, 0x27, 0xf3, 0x3a, 0xfe, 0x01, - 0xe1, 0x5d, 0x46, 0x2a, 0x95, 0x5e, 0x8e, 0x22, 0xf4, 0xbc, 0x5f, 0x97, 0x96, 0xec, 0xb0, 0x84, - 0xd8, 0xce, 0xa3, 0x10, 0x53, 0x63, 0x58, 0x2a, 0x97, 0x60, 0xb6, 0xbe, 0x7b, 0xc1, 0x27, 0x62, - 0x87, 0x8d, 0x90, 0x57, 0x0a, 0x47, 0xa9, 0x60, 0x8a, 0x17, 0x26, 0x14, 0x21, 0xdf, 0xeb, 0x61, - 0xd6, 0x0e, 0x67, 0x63, 0x78, 0xf3, 0x89, 0x82, 0xd1, 0x29, 0x06, 0x97, 0x9a, 0xbe, 0x00, 0xdf, - 0x21, 0xc1, 0x6c, 0xad, 0x8b, 0x0d, 0xdc, 0xa6, 0x5e, 0x90, 0x9c, 0x00, 0x5f, 0x9a, 0x50, 0x80, - 0x1c, 0xa1, 0x08, 0x01, 0x06, 0x1e, 0xcb, 0x8b, 0x9e, 0xf0, 0x82, 0x84, 0x44, 0x82, 0x8b, 0x2b, - 0x2d, 0x7d, 0xc1, 0x7d, 0x5e, 0x82, 0x69, 0x75, 0xd7, 0x58, 0xb7, 0x4c, 0x77, 0x34, 0xb6, 0xd0, - 0xdd, 0x41, 0x07, 0x71, 0x33, 0x1c, 0x6b, 0xef, 0x5a, 0x64, 0xfd, 0xa9, 0x62, 0xd4, 0x71, 0xcb, - 0x34, 0xda, 0x36, 0xa9, 0x47, 0x4e, 0xdd, 0xff, 0xe1, 0xce, 0xec, 0xf3, 0xbf, 0x22, 0x67, 0xd0, - 0x0b, 0x84, 0x43, 0xdd, 0xd0, 0xca, 0x87, 0x8a, 0x16, 0xef, 0x09, 0x04, 0x03, 0xda, 0x0c, 0x2a, - 0x21, 0x7d, 0xe1, 0x7e, 0x4a, 0x02, 0xa5, 0xd8, 0x6a, 0x99, 0xbb, 0x86, 0x53, 0xc7, 0x1d, 0xdc, - 0x72, 0x1a, 0x96, 0xd6, 0xc2, 0x61, 0xfb, 0xb9, 0x00, 0x72, 0x5b, 0xb7, 0x58, 0x1f, 0xec, 0x3e, - 0x32, 0x39, 0xbe, 0x54, 0x78, 0xc7, 0x91, 0xd6, 0x72, 0x7f, 0x29, 0x09, 0xc4, 0x29, 0xb6, 0xaf, - 0x28, 0x58, 0x50, 0xfa, 0x52, 0xfd, 0xb0, 0x04, 0x53, 0x5e, 0x8f, 0xbd, 0x25, 0x22, 0xcc, 0x5f, - 0x4a, 0x38, 0x19, 0xf1, 0x89, 0x27, 0x90, 0xe1, 0x5b, 0x12, 0xcc, 0x2a, 0xa2, 0xe8, 0x27, 0x13, - 0x5d, 0x31, 0xb9, 0xe8, 0xdc, 0xd7, 0x6a, 0xad, 0xb9, 0x54, 0x5b, 0x5d, 0x2c, 0xab, 0x05, 0x19, - 0x3d, 0x26, 0x41, 0x76, 0x5d, 0x37, 0xb6, 0xc2, 0xd1, 0x95, 0x8e, 0xbb, 0x76, 0x64, 0x1b, 0x3f, - 0xcc, 0x5a, 0x3a, 0x7d, 0x51, 0x6e, 0x87, 0xe3, 0xc6, 0xee, 0xce, 0x05, 0x6c, 0xd5, 0x36, 0xc9, - 0x28, 0x6b, 0x37, 0xcc, 0x3a, 0x36, 0xa8, 0x11, 0x9a, 0x53, 0xfb, 0x7e, 0xe3, 0x4d, 0x30, 0x81, - 0xc9, 0x83, 0xcb, 0x49, 0x84, 0xc4, 0x7d, 0xa6, 0xa4, 0x10, 0x53, 0x89, 0xa6, 0x0d, 0x7d, 0x88, - 0xa7, 0xaf, 0xa9, 0x7f, 0x9c, 0x83, 0x13, 0x45, 0xe3, 0x32, 0xb1, 0x29, 0x68, 0x07, 0x5f, 0xda, - 0xd6, 0x8c, 0x2d, 0x4c, 0x06, 0x08, 0x5f, 0xe2, 0xe1, 0x10, 0xfd, 0x19, 0x3e, 0x44, 0xbf, 0xa2, - 0xc2, 0x84, 0x69, 0xb5, 0xb1, 0xb5, 0x70, 0x99, 0xf0, 0xd4, 0xbb, 0xec, 0xcc, 0xda, 0x64, 0xbf, - 0x22, 0xe6, 0x19, 0xf9, 0xf9, 0x1a, 0xfd, 0x5f, 0xf5, 0x08, 0x9d, 0xbd, 0x19, 0x26, 0x58, 0x9a, - 0x32, 0x03, 0x93, 0x35, 0x75, 0xb1, 0xac, 0x36, 0x2b, 0x8b, 0x85, 0x23, 0xca, 0x15, 0x70, 0xb4, - 0xd2, 0x28, 0xab, 0xc5, 0x46, 0xa5, 0x56, 0x6d, 0x92, 0xf4, 0x42, 0x06, 0x3d, 0x2f, 0x2b, 0xea, - 0xd9, 0x1b, 0xcf, 0x4c, 0x3f, 0x58, 0x55, 0x98, 0x68, 0xd1, 0x0c, 0x64, 0x08, 0x9d, 0x4e, 0x54, - 0x3b, 0x46, 0x90, 0x26, 0xa8, 0x1e, 0x21, 0xe5, 0x34, 0xc0, 0x25, 0xcb, 0x34, 0xb6, 0x82, 0x53, - 0x87, 0x93, 0x6a, 0x28, 0x05, 0x3d, 0x92, 0x81, 0x3c, 0xfd, 0x87, 0x5c, 0x49, 0x42, 0x9e, 0x02, - 0xc1, 0x7b, 0xef, 0xae, 0xc5, 0x4b, 0xe4, 0x15, 0x4c, 0xb4, 0xd8, 0xab, 0xab, 0x8b, 0x54, 0x06, - 0xd4, 0x12, 0x66, 0x55, 0xb9, 0x05, 0xf2, 0xf4, 0x5f, 0xe6, 0x75, 0x10, 0x1d, 0x5e, 0x94, 0x66, - 0x13, 0xf4, 0x53, 0x16, 0x97, 0x69, 0xfa, 0xda, 0xfc, 0x5e, 0x09, 0x26, 0xab, 0xd8, 0x29, 0x6d, - 0xe3, 0xd6, 0x45, 0xf4, 0x24, 0x7e, 0x01, 0xb4, 0xa3, 0x63, 0xc3, 0x79, 0x70, 0xa7, 0xe3, 0x2f, - 0x80, 0x7a, 0x09, 0xe8, 0xa7, 0xc3, 0x9d, 0xef, 0x7d, 0xbc, 0xfe, 0xdc, 0xd4, 0xa7, 0xae, 0x5e, - 0x09, 0x11, 0x2a, 0x73, 0x12, 0xf2, 0x16, 0xb6, 0x77, 0x3b, 0xde, 0x22, 0x1a, 0x7b, 0x43, 0xaf, - 0xf2, 0xc5, 0x59, 0xe2, 0xc4, 0x79, 0x8b, 0x78, 0x11, 0x63, 0x88, 0x57, 0x9a, 0x85, 0x89, 0x8a, - 0xa1, 0x3b, 0xba, 0xd6, 0x41, 0x2f, 0xc8, 0xc2, 0x6c, 0x1d, 0x3b, 0xeb, 0x9a, 0xa5, 0xed, 0x60, - 0x07, 0x5b, 0x36, 0xfa, 0x26, 0xdf, 0x27, 0x74, 0x3b, 0x9a, 0xb3, 0x69, 0x5a, 0x3b, 0x9e, 0x6a, - 0x7a, 0xef, 0xae, 0x6a, 0xee, 0x61, 0xcb, 0x0e, 0xf8, 0xf2, 0x5e, 0xdd, 0x2f, 0x97, 0x4c, 0xeb, - 0xa2, 0x3b, 0x08, 0xb2, 0x69, 0x1a, 0x7b, 0x75, 0xe9, 0x75, 0xcc, 0xad, 0x55, 0xbc, 0x87, 0xbd, - 0x70, 0x69, 0xfe, 0xbb, 0x3b, 0x17, 0x68, 0x9b, 0x55, 0xd3, 0x71, 0x3b, 0xed, 0x55, 0x73, 0x8b, - 0xc6, 0x8b, 0x9d, 0x54, 0xf9, 0xc4, 0x20, 0x97, 0xb6, 0x87, 0x49, 0xae, 0x7c, 0x38, 0x17, 0x4b, - 0x54, 0xe6, 0x41, 0xf1, 0x7f, 0x6b, 0xe0, 0x0e, 0xde, 0xc1, 0x8e, 0x75, 0x99, 0x5c, 0x0b, 0x31, - 0xa9, 0xf6, 0xf9, 0xc2, 0x06, 0x68, 0xf1, 0xc9, 0x3a, 0x93, 0xde, 0x3c, 0x27, 0xb9, 0x03, 0x4d, - 0xd6, 0x45, 0x28, 0x8e, 0xe5, 0xda, 0x2b, 0xd9, 0xb5, 0x66, 0x7e, 0x4d, 0x86, 0x2c, 0x19, 0x3c, - 0x5f, 0x9f, 0xe1, 0x56, 0x98, 0x76, 0xb0, 0x6d, 0x6b, 0x5b, 0xd8, 0x5b, 0x61, 0x62, 0xaf, 0xca, - 0x1d, 0x90, 0xeb, 0x10, 0x4c, 0xe9, 0xe0, 0x70, 0x1d, 0x57, 0x33, 0xd7, 0xc0, 0x70, 0x69, 0xf9, - 0x23, 0x01, 0x81, 0x5b, 0xa5, 0x7f, 0x9c, 0xbd, 0x1f, 0x72, 0x14, 0xfe, 0x29, 0xc8, 0x2d, 0x96, - 0x17, 0x36, 0x96, 0x0b, 0x47, 0xdc, 0x47, 0x8f, 0xbf, 0x29, 0xc8, 0x2d, 0x15, 0x1b, 0xc5, 0xd5, - 0x82, 0xe4, 0xd6, 0xa3, 0x52, 0x5d, 0xaa, 0x15, 0x64, 0x37, 0x71, 0xbd, 0x58, 0xad, 0x94, 0x0a, - 0x59, 0x65, 0x1a, 0x26, 0xce, 0x17, 0xd5, 0x6a, 0xa5, 0xba, 0x5c, 0xc8, 0xa1, 0xbf, 0x0d, 0xe3, - 0x77, 0x27, 0x8f, 0xdf, 0xf5, 0x51, 0x3c, 0xf5, 0x83, 0xec, 0xd7, 0x7d, 0xc8, 0xee, 0xe6, 0x20, - 0xfb, 0x7e, 0x11, 0x22, 0x63, 0x70, 0x67, 0xca, 0xc3, 0xc4, 0xba, 0x65, 0xb6, 0xb0, 0x6d, 0xa3, - 0x5f, 0x96, 0x20, 0x5f, 0xd2, 0x8c, 0x16, 0xee, 0xa0, 0xab, 0x02, 0xa8, 0xa8, 0xab, 0x68, 0xc6, - 0x3f, 0x2d, 0xf6, 0x8f, 0x19, 0xd1, 0xde, 0x8f, 0xd1, 0x9d, 0xa7, 0x34, 0x23, 0xe4, 0x23, 0xd6, - 0xcb, 0xc5, 0x92, 0x1a, 0xc3, 0xd5, 0x38, 0x12, 0x4c, 0xb1, 0xd5, 0x80, 0x0b, 0x38, 0x3c, 0x0f, - 0xff, 0x66, 0x46, 0x74, 0x72, 0xe8, 0xd5, 0xc0, 0x27, 0x13, 0x21, 0x0f, 0xb1, 0x89, 0xe0, 0x20, - 0x6a, 0x63, 0xd8, 0x3c, 0x94, 0x60, 0x7a, 0xc3, 0xb0, 0xfb, 0x09, 0x45, 0x3c, 0x8e, 0xbe, 0x57, - 0x8d, 0x10, 0xa1, 0x03, 0xc5, 0xd1, 0x1f, 0x4c, 0x2f, 0x7d, 0xc1, 0x7c, 0x33, 0x03, 0xc7, 0x97, - 0xb1, 0x81, 0x2d, 0xbd, 0x45, 0x6b, 0xe0, 0x49, 0xe2, 0x6e, 0x5e, 0x12, 0x4f, 0xe2, 0x38, 0xef, - 0xf7, 0x07, 0x2f, 0x81, 0x57, 0xf8, 0x12, 0xb8, 0x8f, 0x93, 0xc0, 0xcd, 0x82, 0x74, 0xc6, 0x70, - 0x1f, 0xfa, 0x14, 0xcc, 0x54, 0x4d, 0x47, 0xdf, 0xd4, 0x5b, 0xd4, 0x07, 0xed, 0x57, 0x65, 0xc8, - 0xae, 0xea, 0xb6, 0x83, 0x8a, 0x41, 0x77, 0x72, 0x06, 0xa6, 0x75, 0xa3, 0xd5, 0xd9, 0x6d, 0x63, - 0x15, 0x6b, 0xb4, 0x5f, 0x99, 0x54, 0xc3, 0x49, 0xc1, 0xd6, 0xbe, 0xcb, 0x96, 0xec, 0x6d, 0xed, - 0x7f, 0x5c, 0x78, 0x19, 0x26, 0xcc, 0x02, 0x09, 0x48, 0x19, 0x61, 0x77, 0x15, 0x61, 0xd6, 0x08, - 0x65, 0xf5, 0x0c, 0xf6, 0xde, 0x0b, 0x05, 0xc2, 0xe4, 0x54, 0xfe, 0x0f, 0xf4, 0x2e, 0xa1, 0xc6, - 0x3a, 0x88, 0xa1, 0x64, 0xc8, 0x2c, 0x0d, 0x31, 0x49, 0x56, 0x60, 0xae, 0x52, 0x6d, 0x94, 0xd5, - 0x6a, 0x71, 0x95, 0x65, 0x91, 0xd1, 0xb7, 0x25, 0xc8, 0xa9, 0xb8, 0xdb, 0xb9, 0x1c, 0x8e, 0x18, - 0xcd, 0x1c, 0xc5, 0x33, 0xbe, 0xa3, 0xb8, 0xb2, 0x04, 0xa0, 0xb5, 0xdc, 0x82, 0xc9, 0x95, 0x5a, - 0x52, 0xdf, 0x38, 0xa6, 0x5c, 0x05, 0x8b, 0x7e, 0x6e, 0x35, 0xf4, 0x27, 0x7a, 0xa1, 0xf0, 0xce, - 0x11, 0x47, 0x8d, 0x70, 0x18, 0xd1, 0x27, 0xbc, 0x5b, 0x68, 0xb3, 0x67, 0x20, 0xb9, 0xc3, 0x11, - 0xff, 0x17, 0x24, 0xc8, 0x36, 0xdc, 0xde, 0x32, 0xd4, 0x71, 0x7e, 0x6c, 0x38, 0x1d, 0x77, 0xc9, - 0x44, 0xe8, 0xf8, 0xbd, 0x30, 0x13, 0xd6, 0x58, 0xe6, 0x2a, 0x11, 0xab, 0xe2, 0xdc, 0x0f, 0xc3, - 0x68, 0x78, 0x1f, 0x76, 0x0e, 0x47, 0xc4, 0x1f, 0x79, 0x32, 0xc0, 0x1a, 0xde, 0xb9, 0x80, 0x2d, - 0x7b, 0x5b, 0xef, 0xa2, 0xbf, 0x93, 0x61, 0x6a, 0x19, 0x3b, 0x75, 0x47, 0x73, 0x76, 0xed, 0x9e, - 0xed, 0x4e, 0xc3, 0x2c, 0x69, 0xad, 0x6d, 0xcc, 0xba, 0x23, 0xef, 0x15, 0xbd, 0x4d, 0x16, 0xf5, - 0x27, 0x0a, 0xca, 0x99, 0xf7, 0xcb, 0x88, 0xc0, 0xe4, 0x29, 0x90, 0x6d, 0x6b, 0x8e, 0xc6, 0xb0, - 0xb8, 0xaa, 0x07, 0x8b, 0x80, 0x90, 0x4a, 0xb2, 0xa1, 0xdf, 0x91, 0x44, 0x1c, 0x8a, 0x04, 0xca, - 0x4f, 0x06, 0xc2, 0xbb, 0x32, 0x43, 0xa0, 0x70, 0x0c, 0x66, 0xab, 0xb5, 0x46, 0x73, 0xb5, 0xb6, - 0xbc, 0x5c, 0x76, 0x53, 0x0b, 0xb2, 0x72, 0x12, 0x94, 0xf5, 0xe2, 0x83, 0x6b, 0xe5, 0x6a, 0xa3, - 0x59, 0xad, 0x2d, 0x96, 0xd9, 0x9f, 0x59, 0xe5, 0x28, 0x4c, 0x97, 0x8a, 0xa5, 0x15, 0x2f, 0x21, - 0xa7, 0x9c, 0x82, 0xe3, 0x6b, 0xe5, 0xb5, 0x85, 0xb2, 0x5a, 0x5f, 0xa9, 0xac, 0x37, 0x5d, 0x32, - 0x4b, 0xb5, 0x8d, 0xea, 0x62, 0x21, 0xaf, 0x20, 0x38, 0x19, 0xfa, 0x72, 0x5e, 0xad, 0x55, 0x97, - 0x9b, 0xf5, 0x46, 0xb1, 0x51, 0x2e, 0x4c, 0x28, 0x57, 0xc0, 0xd1, 0x52, 0xb1, 0x4a, 0xb2, 0x97, - 0x6a, 0xd5, 0x6a, 0xb9, 0xd4, 0x28, 0x4c, 0xa2, 0x7f, 0xcf, 0xc2, 0x74, 0xc5, 0xae, 0x6a, 0x3b, - 0xf8, 0x9c, 0xd6, 0xd1, 0xdb, 0xe8, 0x05, 0xa1, 0x99, 0xc7, 0xf5, 0x30, 0x6b, 0xd1, 0x47, 0xdc, - 0x6e, 0xe8, 0x98, 0xa2, 0x39, 0xab, 0xf2, 0x89, 0xee, 0x9c, 0xdc, 0x20, 0x04, 0xbc, 0x39, 0x39, - 0x7d, 0x53, 0x16, 0x00, 0xe8, 0x53, 0x23, 0xb8, 0xdc, 0xf5, 0x6c, 0x6f, 0x6b, 0xd2, 0x76, 0xb0, - 0x8d, 0xad, 0x3d, 0xbd, 0x85, 0xbd, 0x9c, 0x6a, 0xe8, 0x2f, 0xf4, 0x45, 0x59, 0x74, 0x7f, 0x31, - 0x04, 0x6a, 0xa8, 0x3a, 0x11, 0xbd, 0xe1, 0xcf, 0xc8, 0x22, 0xbb, 0x83, 0x42, 0x24, 0x93, 0x69, - 0xca, 0x8b, 0xa5, 0xe1, 0x96, 0x6d, 0x1b, 0xb5, 0x5a, 0xb3, 0xbe, 0x52, 0x53, 0x1b, 0x05, 0x59, - 0x99, 0x81, 0x49, 0xf7, 0x75, 0xb5, 0x56, 0x5d, 0x2e, 0x64, 0x95, 0x13, 0x70, 0x6c, 0xa5, 0x58, - 0x6f, 0x56, 0xaa, 0xe7, 0x8a, 0xab, 0x95, 0xc5, 0x66, 0x69, 0xa5, 0xa8, 0xd6, 0x0b, 0x39, 0xe5, - 0x2a, 0x38, 0xd1, 0xa8, 0x94, 0xd5, 0xe6, 0x52, 0xb9, 0xd8, 0xd8, 0x50, 0xcb, 0xf5, 0x66, 0xb5, - 0xd6, 0xac, 0x16, 0xd7, 0xca, 0x85, 0xbc, 0xdb, 0xfc, 0xc9, 0xa7, 0x40, 0x6d, 0x26, 0xf6, 0x2b, - 0xe3, 0x64, 0x84, 0x32, 0x4e, 0xf5, 0x2a, 0x23, 0x84, 0xd5, 0x4a, 0x2d, 0xd7, 0xcb, 0xea, 0xb9, - 0x72, 0x61, 0xba, 0x9f, 0xae, 0xcd, 0x28, 0xc7, 0xa1, 0xe0, 0xf2, 0xd0, 0xac, 0xd4, 0xbd, 0x9c, - 0x8b, 0x85, 0x59, 0xf4, 0xe1, 0x3c, 0x9c, 0x54, 0xf1, 0x96, 0x6e, 0x3b, 0xd8, 0x5a, 0xd7, 0x2e, - 0xef, 0x60, 0xc3, 0xf1, 0x3a, 0xf9, 0x7f, 0x49, 0xac, 0x8c, 0x6b, 0x30, 0xdb, 0xa5, 0x34, 0xd6, - 0xb0, 0xb3, 0x6d, 0xb6, 0xd9, 0x28, 0xfc, 0xa4, 0xc8, 0x9e, 0x63, 0x7e, 0x3d, 0x9c, 0x5d, 0xe5, - 0xff, 0x0e, 0xe9, 0xb6, 0x1c, 0xa3, 0xdb, 0xd9, 0x61, 0x74, 0x5b, 0xb9, 0x06, 0xa6, 0x76, 0x6d, - 0x6c, 0x95, 0x77, 0x34, 0xbd, 0xe3, 0x5d, 0xce, 0xe9, 0x27, 0xa0, 0x37, 0x67, 0x45, 0x4f, 0xac, - 0x84, 0xea, 0xd2, 0x5f, 0x8c, 0x11, 0x7d, 0xeb, 0x69, 0x00, 0x56, 0xd9, 0x0d, 0xab, 0xc3, 0x94, - 0x35, 0x94, 0xe2, 0xf2, 0x77, 0x41, 0xef, 0x74, 0x74, 0x63, 0xcb, 0xdf, 0xf7, 0x0f, 0x12, 0xd0, - 0x8b, 0x65, 0x91, 0x13, 0x2c, 0x49, 0x79, 0x4b, 0xd6, 0x9a, 0x5e, 0x28, 0x8d, 0xb9, 0xdf, 0xdd, - 0xdf, 0x74, 0xf2, 0x4a, 0x01, 0x66, 0x48, 0x1a, 0x6b, 0x81, 0x85, 0x09, 0xb7, 0x0f, 0xf6, 0xc8, - 0xad, 0x95, 0x1b, 0x2b, 0xb5, 0x45, 0xff, 0xdb, 0xa4, 0x4b, 0xd2, 0x65, 0xa6, 0x58, 0x7d, 0x90, - 0xb4, 0xc6, 0x29, 0xe5, 0x09, 0x70, 0x55, 0xa8, 0xc3, 0x2e, 0xae, 0xaa, 0xe5, 0xe2, 0xe2, 0x83, - 0xcd, 0xf2, 0xb3, 0x2a, 0xf5, 0x46, 0x9d, 0x6f, 0x5c, 0x5e, 0x3b, 0x9a, 0x76, 0xf9, 0x2d, 0xaf, - 0x15, 0x2b, 0xab, 0xac, 0x7f, 0x5f, 0xaa, 0xa9, 0x6b, 0xc5, 0x46, 0x61, 0x06, 0xfd, 0x9a, 0x0c, - 0x85, 0x65, 0xec, 0xac, 0x9b, 0x96, 0xa3, 0x75, 0x56, 0x75, 0xe3, 0xe2, 0x86, 0xd5, 0xe1, 0x26, - 0x9b, 0xc2, 0x61, 0x3a, 0xf8, 0x21, 0x92, 0x23, 0x18, 0xbd, 0x23, 0xde, 0x25, 0xd9, 0x02, 0x65, - 0x0a, 0x12, 0xd0, 0x73, 0x24, 0x91, 0xe5, 0x6e, 0xf1, 0x52, 0x93, 0xe9, 0xc9, 0x73, 0xc7, 0x3d, - 0x3e, 0xf7, 0x41, 0x2d, 0x8f, 0x9e, 0x9f, 0x85, 0xc9, 0x25, 0xdd, 0xd0, 0x3a, 0xfa, 0xb3, 0xb9, - 0xf8, 0xa5, 0x41, 0x1f, 0x93, 0x89, 0xe9, 0x63, 0xa4, 0xa1, 0xc6, 0xcf, 0x5f, 0x94, 0x45, 0x97, - 0x17, 0x42, 0xb2, 0xf7, 0x98, 0x8c, 0x18, 0x3c, 0xdf, 0x27, 0x89, 0x2c, 0x2f, 0x0c, 0xa6, 0x97, - 0x0c, 0xc3, 0x8f, 0x7e, 0x77, 0xd8, 0x58, 0x3d, 0xed, 0x7b, 0xb2, 0x9f, 0x2a, 0x4c, 0xa1, 0x3f, - 0x97, 0x01, 0x2d, 0x63, 0xe7, 0x1c, 0xb6, 0xfc, 0xa9, 0x00, 0xe9, 0xf5, 0x99, 0xbd, 0x1d, 0x6a, - 0xb2, 0xaf, 0x0f, 0x03, 0x78, 0x9e, 0x07, 0xb0, 0x18, 0xd3, 0x78, 0x22, 0x48, 0x47, 0x34, 0xde, - 0x0a, 0xe4, 0x6d, 0xf2, 0x9d, 0xa9, 0xd9, 0x6d, 0xd1, 0xc3, 0x25, 0x21, 0x16, 0xa6, 0x4e, 0x09, - 0xab, 0x8c, 0x00, 0xfa, 0x96, 0x3f, 0x09, 0xfa, 0x61, 0x4e, 0x3b, 0x96, 0x0e, 0xcc, 0x6c, 0x32, - 0x7d, 0xb1, 0xd2, 0x55, 0x97, 0x7e, 0xf6, 0x0d, 0x7a, 0x5f, 0x0e, 0x8e, 0xf7, 0xab, 0x0e, 0xfa, - 0xdd, 0x0c, 0xb7, 0xc3, 0x8e, 0xc9, 0x90, 0x9f, 0x61, 0x1b, 0x88, 0xee, 0x8b, 0xf2, 0x34, 0x38, - 0xe1, 0x2f, 0xc3, 0x35, 0xcc, 0x2a, 0xbe, 0x64, 0x77, 0xb0, 0xe3, 0x60, 0x8b, 0x54, 0x6d, 0x52, - 0xed, 0xff, 0x51, 0x79, 0x06, 0x5c, 0xa9, 0x1b, 0xb6, 0xde, 0xc6, 0x56, 0x43, 0xef, 0xda, 0x45, - 0xa3, 0xdd, 0xd8, 0x75, 0x4c, 0x4b, 0xd7, 0xd8, 0x55, 0x92, 0x93, 0x6a, 0xd4, 0x67, 0xe5, 0x26, - 0x28, 0xe8, 0x76, 0xcd, 0xb8, 0x60, 0x6a, 0x56, 0x5b, 0x37, 0xb6, 0x56, 0x75, 0xdb, 0x61, 0x1e, - 0xc0, 0xfb, 0xd2, 0xd1, 0xdf, 0xcb, 0xa2, 0x87, 0xe9, 0x06, 0xc0, 0x1a, 0xd1, 0xa1, 0xfc, 0xb4, - 0x2c, 0x72, 0x3c, 0x2e, 0x19, 0xed, 0x64, 0xca, 0xf2, 0xbc, 0x71, 0x1b, 0x12, 0xfd, 0x47, 0x70, - 0xd2, 0xb5, 0xd0, 0x74, 0xcf, 0x10, 0x38, 0x57, 0x56, 0x2b, 0x4b, 0x95, 0xb2, 0x6b, 0x56, 0x9c, - 0x80, 0x63, 0xc1, 0xb7, 0xc5, 0x07, 0x9b, 0xf5, 0x72, 0xb5, 0x51, 0x98, 0x74, 0xfb, 0x29, 0x9a, - 0xbc, 0x54, 0xac, 0xac, 0x96, 0x17, 0x9b, 0x8d, 0x9a, 0xfb, 0x65, 0x71, 0x38, 0xd3, 0x02, 0x3d, - 0x92, 0x85, 0xa3, 0x44, 0xb6, 0x97, 0x89, 0x54, 0x5d, 0xa1, 0xf4, 0xf8, 0xda, 0xfa, 0x00, 0x4d, - 0x51, 0xf1, 0xa2, 0x4f, 0x0a, 0xdf, 0x94, 0x19, 0x82, 0xb0, 0xa7, 0x8c, 0x08, 0xcd, 0xf8, 0xa6, - 0x24, 0x12, 0xa1, 0x42, 0x98, 0x6c, 0x32, 0xa5, 0xf8, 0xd7, 0x71, 0x8f, 0x38, 0xd1, 0xe0, 0x13, - 0x2b, 0xb3, 0x44, 0x7e, 0x7e, 0xd6, 0x7a, 0x45, 0x25, 0xea, 0x30, 0x07, 0x40, 0x52, 0x88, 0x06, - 0x51, 0x3d, 0xe8, 0x3b, 0x5e, 0x45, 0xe9, 0x41, 0xb1, 0xd4, 0xa8, 0x9c, 0x2b, 0x47, 0xe9, 0xc1, - 0x27, 0x64, 0x98, 0x5c, 0xc6, 0x8e, 0x3b, 0xa7, 0xb2, 0xd1, 0x33, 0x05, 0xd6, 0x7f, 0x5c, 0x33, - 0xa6, 0x63, 0xb6, 0xb4, 0x8e, 0xbf, 0x0c, 0x40, 0xdf, 0xd0, 0x4f, 0x0d, 0x63, 0x82, 0x78, 0x45, - 0x47, 0x8c, 0x57, 0x3f, 0x08, 0x39, 0xc7, 0xfd, 0xcc, 0x96, 0xa1, 0xbf, 0x2f, 0x72, 0xb8, 0x72, - 0x89, 0x2c, 0x6a, 0x8e, 0xa6, 0xd2, 0xfc, 0xa1, 0xd1, 0x49, 0xd0, 0x76, 0x89, 0x60, 0xe4, 0xbb, - 0xd1, 0xfe, 0xfc, 0x5b, 0x19, 0x4e, 0xd0, 0xf6, 0x51, 0xec, 0x76, 0xeb, 0x8e, 0x69, 0x61, 0x15, - 0xb7, 0xb0, 0xde, 0x75, 0x7a, 0xd6, 0xf7, 0x2c, 0x9a, 0xea, 0x6d, 0x36, 0xb3, 0x57, 0xf4, 0x9b, - 0xb2, 0x68, 0x0c, 0xe6, 0x7d, 0xed, 0xb1, 0xa7, 0xbc, 0x88, 0xc6, 0xfe, 0x21, 0x49, 0x24, 0xaa, - 0x72, 0x42, 0xe2, 0xc9, 0x80, 0x7a, 0xff, 0x21, 0x00, 0xe5, 0xad, 0xdc, 0xa8, 0xe5, 0x52, 0xb9, - 0xb2, 0xee, 0x0e, 0x02, 0xd7, 0xc2, 0xd5, 0xeb, 0x1b, 0x6a, 0x69, 0xa5, 0x58, 0x2f, 0x37, 0xd5, - 0xf2, 0x72, 0xa5, 0xde, 0x60, 0x4e, 0x59, 0xf4, 0xaf, 0x09, 0xe5, 0x1a, 0x38, 0x55, 0xdf, 0x58, - 0xa8, 0x97, 0xd4, 0xca, 0x3a, 0x49, 0x57, 0xcb, 0xd5, 0xf2, 0x79, 0xf6, 0x75, 0x12, 0xbd, 0xa7, - 0x00, 0xd3, 0xee, 0x04, 0xa0, 0x4e, 0xe7, 0x05, 0xe8, 0x6b, 0x59, 0x98, 0x56, 0xb1, 0x6d, 0x76, - 0xf6, 0xc8, 0x1c, 0x61, 0x5c, 0x53, 0x8f, 0x6f, 0xc8, 0xa2, 0xe7, 0xb7, 0x43, 0xcc, 0xce, 0x87, - 0x18, 0x8d, 0x9e, 0x68, 0x6a, 0x7b, 0x9a, 0xde, 0xd1, 0x2e, 0xb0, 0xae, 0x66, 0x52, 0x0d, 0x12, - 0x94, 0x79, 0x50, 0xcc, 0x4b, 0x06, 0xb6, 0xea, 0xad, 0x4b, 0x65, 0x67, 0xbb, 0xd8, 0x6e, 0x5b, - 0xd8, 0xb6, 0xd9, 0xea, 0x45, 0x9f, 0x2f, 0xca, 0x8d, 0x70, 0x94, 0xa4, 0x86, 0x32, 0x53, 0x07, - 0x99, 0xde, 0x64, 0x3f, 0x67, 0xd1, 0xb8, 0xec, 0xe5, 0xcc, 0x85, 0x72, 0x06, 0xc9, 0xe1, 0xe3, - 0x12, 0x79, 0xfe, 0x94, 0xce, 0x19, 0x98, 0x36, 0xb4, 0x1d, 0x5c, 0x7e, 0xb8, 0xab, 0x5b, 0xd8, - 0x26, 0x8e, 0x31, 0xb2, 0x1a, 0x4e, 0x42, 0xef, 0x13, 0x3a, 0x6f, 0x2e, 0x26, 0xb1, 0x64, 0xba, - 0xbf, 0x3c, 0x84, 0xea, 0xf7, 0xe9, 0x67, 0x64, 0xf4, 0x1e, 0x19, 0x66, 0x18, 0x53, 0x45, 0xe3, - 0x72, 0xa5, 0x8d, 0xae, 0xe5, 0x8c, 0x5f, 0xcd, 0x4d, 0xf3, 0x8c, 0x5f, 0xf2, 0x82, 0x7e, 0x56, - 0x16, 0x75, 0x77, 0xee, 0x53, 0x71, 0x52, 0x46, 0xb4, 0xe3, 0xe8, 0xa6, 0xb9, 0xcb, 0x1c, 0x55, - 0x27, 0x55, 0xfa, 0x92, 0xe6, 0xa2, 0x1e, 0xfa, 0x03, 0x21, 0x67, 0x6a, 0xc1, 0x6a, 0x1c, 0x12, - 0x80, 0x1f, 0x91, 0x61, 0x8e, 0x71, 0x55, 0x67, 0xe7, 0x7c, 0x84, 0x0e, 0xbc, 0xfd, 0x9c, 0xb0, - 0x21, 0xd8, 0xa7, 0xfe, 0xac, 0xa4, 0xc7, 0x0d, 0x90, 0x1f, 0x10, 0x0a, 0x8e, 0x26, 0x5c, 0x91, - 0x43, 0x82, 0xf2, 0x2d, 0x59, 0x98, 0xde, 0xb0, 0xb1, 0xc5, 0xfc, 0xf6, 0xd1, 0xab, 0xb2, 0x20, - 0x2f, 0x63, 0x6e, 0x23, 0xf5, 0x45, 0xc2, 0x1e, 0xbe, 0xe1, 0xca, 0x86, 0x88, 0xba, 0x36, 0x52, - 0x04, 0x6c, 0x37, 0xc0, 0x1c, 0x15, 0x69, 0xd1, 0x71, 0x5c, 0x23, 0xd1, 0xf3, 0xa6, 0xed, 0x49, - 0x1d, 0xc5, 0x56, 0x11, 0x29, 0xcb, 0xcd, 0x52, 0x72, 0x79, 0x5a, 0xc5, 0x9b, 0x74, 0x3e, 0x9b, - 0x55, 0x7b, 0x52, 0x95, 0x5b, 0xe1, 0x0a, 0xb3, 0x8b, 0xe9, 0xf9, 0x95, 0x50, 0xe6, 0x1c, 0xc9, - 0xdc, 0xef, 0x13, 0xfa, 0x9a, 0x90, 0xaf, 0xae, 0xb8, 0x74, 0x92, 0xe9, 0x42, 0x77, 0x34, 0x26, - 0xc9, 0x71, 0x28, 0xb8, 0x39, 0xc8, 0xfe, 0x8b, 0x5a, 0xae, 0xd7, 0x56, 0xcf, 0x95, 0xfb, 0x2f, - 0x63, 0xe4, 0xd0, 0xf3, 0x64, 0x98, 0x5a, 0xb0, 0x4c, 0xad, 0xdd, 0xd2, 0x6c, 0x07, 0x7d, 0x4b, - 0x82, 0x99, 0x75, 0xed, 0x72, 0xc7, 0xd4, 0xda, 0xc4, 0xbf, 0xbf, 0xa7, 0x2f, 0xe8, 0xd2, 0x4f, - 0x5e, 0x5f, 0xc0, 0x5e, 0xf9, 0x83, 0x81, 0xfe, 0xd1, 0xbd, 0x8c, 0xc8, 0x85, 0x9a, 0xfe, 0x36, - 0x9f, 0xd4, 0x2f, 0x58, 0xa9, 0xc7, 0xd7, 0x7c, 0x98, 0xa7, 0x08, 0x8b, 0xf2, 0x3d, 0x62, 0xe1, - 0x47, 0x45, 0x48, 0x1e, 0xce, 0xae, 0xfc, 0xf3, 0x27, 0x21, 0xbf, 0x88, 0x89, 0x15, 0xf7, 0x3f, - 0x24, 0x98, 0xa8, 0x63, 0x87, 0x58, 0x70, 0x77, 0x70, 0x9e, 0xc2, 0x6d, 0x92, 0x21, 0x70, 0x62, - 0xf7, 0xde, 0xdd, 0xc9, 0x7a, 0xe8, 0xbc, 0x35, 0x79, 0x4e, 0xe0, 0x91, 0x48, 0xcb, 0x9d, 0x67, - 0x65, 0x1e, 0xc8, 0x23, 0x31, 0x96, 0x54, 0xfa, 0xbe, 0x56, 0x6f, 0x93, 0x98, 0x6b, 0x55, 0xa8, - 0xd7, 0xfb, 0x8d, 0xb0, 0x7e, 0xc6, 0x7a, 0x9b, 0x31, 0xe6, 0x63, 0x9c, 0xa3, 0x9e, 0x0a, 0x13, - 0x54, 0xe6, 0xde, 0x7c, 0xb4, 0xd7, 0x4f, 0x81, 0x92, 0x20, 0x67, 0xaf, 0xbd, 0x9c, 0x82, 0x2e, - 0x6a, 0xd1, 0x85, 0x8f, 0x25, 0x06, 0xc1, 0x4c, 0x15, 0x3b, 0x97, 0x4c, 0xeb, 0x62, 0xdd, 0xd1, - 0x1c, 0x8c, 0xfe, 0x55, 0x02, 0xb9, 0x8e, 0x9d, 0x70, 0xf4, 0x93, 0x2a, 0x1c, 0xa3, 0x15, 0x62, - 0x19, 0x49, 0xff, 0x4d, 0x2b, 0x72, 0xa6, 0xaf, 0x10, 0x42, 0xf9, 0xd4, 0xfd, 0xbf, 0xa2, 0x5f, - 0xee, 0x1b, 0xf4, 0x49, 0xea, 0x33, 0x69, 0x60, 0x92, 0x09, 0x33, 0xe8, 0x2a, 0x58, 0x84, 0x9e, - 0xbe, 0x57, 0xc8, 0xac, 0x16, 0xa3, 0x79, 0x38, 0x5d, 0xc1, 0x07, 0xae, 0x82, 0x6c, 0x69, 0x5b, - 0x73, 0xd0, 0x5b, 0x65, 0x80, 0x62, 0xbb, 0xbd, 0x46, 0x7d, 0xc0, 0xc3, 0x0e, 0x69, 0x67, 0x61, - 0xa6, 0xb5, 0xad, 0x05, 0x77, 0x9b, 0xd0, 0xfe, 0x80, 0x4b, 0x53, 0x9e, 0x16, 0x38, 0x93, 0x53, - 0xa9, 0xa2, 0x1e, 0x98, 0xdc, 0x32, 0x18, 0x6d, 0xdf, 0xd1, 0x9c, 0x0f, 0x85, 0x19, 0x7b, 0x84, - 0xce, 0xfd, 0x7d, 0x3e, 0x60, 0x2f, 0x7a, 0x0e, 0xc7, 0x48, 0xfb, 0x07, 0x6c, 0x82, 0x84, 0x84, - 0x27, 0xbd, 0xc5, 0x02, 0x7a, 0xc4, 0xf3, 0x35, 0x96, 0xd0, 0xb5, 0x4a, 0xb9, 0xad, 0x7b, 0xa2, - 0x65, 0x01, 0xb3, 0xd0, 0x0b, 0x33, 0xc9, 0xe0, 0x8b, 0x17, 0xdc, 0x7d, 0x30, 0x8b, 0xdb, 0xba, - 0x83, 0xbd, 0x5a, 0x32, 0x01, 0xc6, 0x41, 0xcc, 0xff, 0x80, 0x9e, 0x2b, 0x1c, 0x74, 0x8d, 0x08, - 0x74, 0x7f, 0x8d, 0x22, 0xda, 0x9f, 0x58, 0x18, 0x35, 0x31, 0x9a, 0xe9, 0x83, 0xf5, 0x53, 0x32, - 0x9c, 0x68, 0x98, 0x5b, 0x5b, 0x1d, 0xec, 0x89, 0x09, 0x53, 0xef, 0x4c, 0xa4, 0x8d, 0x12, 0x2e, - 0xb2, 0x13, 0x64, 0x3e, 0xa4, 0xfb, 0x47, 0xc9, 0xdc, 0x17, 0xfe, 0xc4, 0x54, 0xec, 0x2c, 0x8a, - 0x88, 0xab, 0x2f, 0x9f, 0x11, 0x28, 0x88, 0x05, 0x7c, 0x16, 0x26, 0x9b, 0x3e, 0x10, 0x9f, 0x93, - 0x60, 0x96, 0xde, 0x5c, 0xe9, 0x29, 0xe8, 0x03, 0x23, 0x04, 0x00, 0x7d, 0x2b, 0x23, 0xea, 0x67, - 0x4b, 0x64, 0xc2, 0x71, 0x12, 0x21, 0x62, 0xb1, 0xa0, 0x2a, 0x03, 0xc9, 0xa5, 0x2f, 0xda, 0x3f, - 0x91, 0x61, 0x7a, 0x19, 0x7b, 0x2d, 0xcd, 0x4e, 0xdc, 0x13, 0x9d, 0x85, 0x19, 0x72, 0x7d, 0x5b, - 0x8d, 0x1d, 0x93, 0xa4, 0xab, 0x66, 0x5c, 0x9a, 0x72, 0x3d, 0xcc, 0x5e, 0xc0, 0x9b, 0xa6, 0x85, - 0x6b, 0xdc, 0x59, 0x4a, 0x3e, 0x31, 0x22, 0x3c, 0x1d, 0x17, 0x07, 0x6d, 0x81, 0xc7, 0xe6, 0xe6, - 0xfd, 0xc2, 0x0c, 0x55, 0x25, 0x62, 0xcc, 0x79, 0x3a, 0x4c, 0x32, 0xe4, 0x3d, 0x33, 0x2d, 0xae, - 0x5f, 0xf4, 0xf3, 0xa2, 0xd7, 0xf8, 0x88, 0x96, 0x39, 0x44, 0x6f, 0x4b, 0xc2, 0xc4, 0x58, 0xee, - 0x77, 0x2f, 0x84, 0xca, 0x5f, 0xb8, 0x5c, 0x69, 0xdb, 0x68, 0x2d, 0x19, 0xa6, 0xa7, 0x01, 0xfc, - 0xc6, 0xe1, 0x85, 0xb5, 0x08, 0xa5, 0xf0, 0x91, 0xeb, 0x63, 0x0f, 0xea, 0xf5, 0x8a, 0x83, 0xb0, - 0x33, 0x62, 0x60, 0xc4, 0x0e, 0xf8, 0x89, 0x70, 0x92, 0x3e, 0x3a, 0x1f, 0x97, 0xe1, 0x84, 0x7f, - 0xfe, 0x68, 0x55, 0xb3, 0x83, 0x76, 0x57, 0x4a, 0x06, 0x11, 0x77, 0xe0, 0xc3, 0x6f, 0x2c, 0x5f, - 0x4f, 0x36, 0x66, 0xf4, 0xe5, 0x64, 0xb4, 0xe8, 0x28, 0x37, 0xc3, 0x31, 0x63, 0x77, 0xc7, 0x97, - 0x3a, 0x69, 0xf1, 0xac, 0x85, 0xef, 0xff, 0x90, 0x64, 0x64, 0x12, 0x61, 0x7e, 0x2c, 0x73, 0x4a, - 0xee, 0x48, 0xd7, 0x53, 0x12, 0xc1, 0x88, 0xfe, 0x39, 0x93, 0xa8, 0x77, 0x1b, 0x7c, 0xe6, 0x2b, - 0x41, 0x2f, 0x75, 0x88, 0x07, 0xbe, 0xce, 0x4e, 0x40, 0xae, 0xbc, 0xd3, 0x75, 0x2e, 0x9f, 0x7d, - 0x22, 0xcc, 0xd6, 0x1d, 0x0b, 0x6b, 0x3b, 0xa1, 0x9d, 0x01, 0xc7, 0xbc, 0x88, 0x0d, 0x6f, 0x67, - 0x80, 0xbc, 0xdc, 0x79, 0x07, 0x4c, 0x18, 0x66, 0x53, 0xdb, 0x75, 0xb6, 0x95, 0x6b, 0xf7, 0x1d, - 0xa9, 0x67, 0xe0, 0xd7, 0x58, 0x0c, 0xa3, 0x2f, 0xde, 0x45, 0xd6, 0x86, 0xf3, 0x86, 0x59, 0xdc, - 0x75, 0xb6, 0x17, 0xae, 0xf9, 0xc8, 0xdf, 0x9c, 0xce, 0x7c, 0xe2, 0x6f, 0x4e, 0x67, 0xbe, 0xf0, - 0x37, 0xa7, 0x33, 0x3f, 0xf7, 0xa5, 0xd3, 0x47, 0x3e, 0xf1, 0xa5, 0xd3, 0x47, 0x3e, 0xf7, 0xa5, - 0xd3, 0x47, 0x7e, 0x58, 0xea, 0x5e, 0xb8, 0x90, 0x27, 0x54, 0x9e, 0xfa, 0xff, 0x06, 0x00, 0x00, - 0xff, 0xff, 0x07, 0xc6, 0xed, 0x93, 0x99, 0x0b, 0x02, 0x00, + 0x28, 0x72, 0x10, 0x15, 0x15, 0x15, 0x10, 0x70, 0xf5, 0x80, 0x02, 0x72, 0x3f, 0xa0, 0x02, 0x72, + 0x91, 0x8b, 0x88, 0x08, 0x72, 0x11, 0xdd, 0x57, 0x90, 0x8b, 0x78, 0x3e, 0x72, 0x78, 0xf5, 0x3d, + 0x82, 0x28, 0xbc, 0xbe, 0x9f, 0x8c, 0x88, 0xbc, 0x44, 0x75, 0x65, 0x56, 0x64, 0x75, 0x65, 0xf5, + 0x22, 0xef, 0x7f, 0x99, 0x91, 0x91, 0x4f, 0x3c, 0xf1, 0x7c, 0x9f, 0x88, 0x78, 0x22, 0xe2, 0x89, + 0x27, 0xe0, 0x54, 0xf7, 0xc2, 0x2d, 0x5d, 0xcb, 0x74, 0x4c, 0xfb, 0x96, 0x96, 0xb9, 0xb3, 0xa3, + 0x19, 0x6d, 0x7b, 0x9e, 0xbc, 0x2b, 0x13, 0x9a, 0x71, 0xd9, 0xb9, 0xdc, 0xc5, 0xe8, 0xfa, 0xee, + 0xc5, 0xad, 0x5b, 0x3a, 0xfa, 0x85, 0x5b, 0xba, 0x17, 0x6e, 0xd9, 0x31, 0xdb, 0xb8, 0xe3, 0xfd, + 0x40, 0x5e, 0x58, 0x76, 0x74, 0x63, 0x54, 0xae, 0x8e, 0xd9, 0xd2, 0x3a, 0xb6, 0x63, 0x5a, 0x98, + 0xe5, 0x3c, 0x19, 0x14, 0x89, 0xf7, 0xb0, 0xe1, 0x78, 0x14, 0xae, 0xd9, 0x32, 0xcd, 0xad, 0x0e, + 0xa6, 0xdf, 0x2e, 0xec, 0x6e, 0xde, 0x62, 0x3b, 0xd6, 0x6e, 0xcb, 0x61, 0x5f, 0xcf, 0xf4, 0x7e, + 0x6d, 0x63, 0xbb, 0x65, 0xe9, 0x5d, 0xc7, 0xb4, 0x68, 0x8e, 0xb3, 0x5f, 0xfe, 0xc5, 0x49, 0x90, + 0xd5, 0x6e, 0x0b, 0x7d, 0x63, 0x02, 0xe4, 0x62, 0xb7, 0x8b, 0x3e, 0x20, 0x01, 0x2c, 0x63, 0xe7, + 0x1c, 0xb6, 0x6c, 0xdd, 0x34, 0xd0, 0x51, 0x98, 0x50, 0xf1, 0x8f, 0xed, 0x62, 0xdb, 0xb9, 0x33, + 0xfb, 0xfc, 0xaf, 0xc8, 0x19, 0xf4, 0xa8, 0x04, 0x93, 0x2a, 0xb6, 0xbb, 0xa6, 0x61, 0x63, 0xe5, + 0x3e, 0xc8, 0x61, 0xcb, 0x32, 0xad, 0x53, 0x99, 0x33, 0x99, 0x1b, 0xa7, 0x6f, 0xbf, 0x69, 0x9e, + 0x55, 0x7f, 0x5e, 0xed, 0xb6, 0xe6, 0x8b, 0xdd, 0xee, 0x7c, 0x40, 0x69, 0xde, 0xfb, 0x69, 0xbe, + 0xec, 0xfe, 0xa1, 0xd2, 0x1f, 0x95, 0x53, 0x30, 0xb1, 0x47, 0x33, 0x9c, 0x92, 0xce, 0x64, 0x6e, + 0x9c, 0x52, 0xbd, 0x57, 0xf7, 0x4b, 0x1b, 0x3b, 0x9a, 0xde, 0xb1, 0x4f, 0xc9, 0xf4, 0x0b, 0x7b, + 0x45, 0xaf, 0xca, 0x40, 0x8e, 0x10, 0x51, 0x4a, 0x90, 0x6d, 0x99, 0x6d, 0x4c, 0x8a, 0x9f, 0xbb, + 0xfd, 0x16, 0xf1, 0xe2, 0xe7, 0x4b, 0x66, 0x1b, 0xab, 0xe4, 0x67, 0xe5, 0x0c, 0x4c, 0x7b, 0x62, + 0x09, 0xd8, 0x08, 0x27, 0x9d, 0xbd, 0x1d, 0xb2, 0x6e, 0x7e, 0x65, 0x12, 0xb2, 0xd5, 0x8d, 0xd5, + 0xd5, 0xc2, 0x11, 0xe5, 0x18, 0xcc, 0x6e, 0x54, 0x1f, 0xa8, 0xd6, 0xce, 0x57, 0x9b, 0x65, 0x55, + 0xad, 0xa9, 0x85, 0x8c, 0x32, 0x0b, 0x53, 0x0b, 0xc5, 0xc5, 0x66, 0xa5, 0xba, 0xbe, 0xd1, 0x28, + 0x48, 0xe8, 0xe5, 0x32, 0xcc, 0xd5, 0xb1, 0xb3, 0x88, 0xf7, 0xf4, 0x16, 0xae, 0x3b, 0x9a, 0x83, + 0xd1, 0x8b, 0x32, 0xbe, 0x30, 0x95, 0x0d, 0xb7, 0x50, 0xff, 0x13, 0xab, 0xc0, 0x53, 0xf7, 0x55, + 0x80, 0xa7, 0x30, 0xcf, 0xfe, 0x9e, 0x0f, 0xa5, 0xa9, 0x61, 0x3a, 0x67, 0x9f, 0x02, 0xd3, 0xa1, + 0x6f, 0xca, 0x1c, 0xc0, 0x42, 0xb1, 0xf4, 0xc0, 0xb2, 0x5a, 0xdb, 0xa8, 0x2e, 0x16, 0x8e, 0xb8, + 0xef, 0x4b, 0x35, 0xb5, 0xcc, 0xde, 0x33, 0xe8, 0x5b, 0x99, 0x10, 0x98, 0x8b, 0x3c, 0x98, 0xf3, + 0x83, 0x99, 0xe9, 0x03, 0x28, 0xfa, 0x2d, 0x1f, 0x9c, 0x65, 0x0e, 0x9c, 0xa7, 0x26, 0x23, 0x97, + 0x3e, 0x40, 0x8f, 0x48, 0x30, 0x59, 0xdf, 0xde, 0x75, 0xda, 0xe6, 0x25, 0x03, 0x4d, 0xf9, 0xc8, + 0xa0, 0xaf, 0x85, 0x65, 0x72, 0x0f, 0x2f, 0x93, 0x1b, 0xf7, 0x57, 0x82, 0x51, 0x88, 0x90, 0xc6, + 0x6f, 0xf8, 0xd2, 0x28, 0x72, 0xd2, 0x78, 0x8a, 0x28, 0xa1, 0xf4, 0xe5, 0xf0, 0xab, 0xcf, 0x80, + 0x5c, 0xbd, 0xab, 0xb5, 0x30, 0xfa, 0xa8, 0x0c, 0x33, 0xab, 0x58, 0xdb, 0xc3, 0xc5, 0x6e, 0xd7, + 0x32, 0xf7, 0x30, 0x2a, 0x05, 0xfa, 0x7a, 0x0a, 0x26, 0x6c, 0x37, 0x53, 0xa5, 0x4d, 0x6a, 0x30, + 0xa5, 0x7a, 0xaf, 0xca, 0x69, 0x00, 0xbd, 0x8d, 0x0d, 0x47, 0x77, 0x74, 0x6c, 0x9f, 0x92, 0xce, + 0xc8, 0x37, 0x4e, 0xa9, 0xa1, 0x14, 0xf4, 0x0d, 0x49, 0x54, 0xc7, 0x08, 0x17, 0xf3, 0x61, 0x0e, + 0x22, 0xa4, 0xfa, 0x6a, 0x49, 0x44, 0xc7, 0x06, 0x92, 0x4b, 0x26, 0xdb, 0xd7, 0x67, 0x92, 0x0b, + 0xd7, 0xcd, 0x51, 0xad, 0x35, 0xeb, 0x1b, 0xa5, 0x95, 0x66, 0x7d, 0xbd, 0x58, 0x2a, 0x17, 0xb0, + 0x72, 0x1c, 0x0a, 0xe4, 0xb1, 0x59, 0xa9, 0x37, 0x17, 0xcb, 0xab, 0xe5, 0x46, 0x79, 0xb1, 0xb0, + 0xa9, 0x28, 0x30, 0xa7, 0x96, 0x7f, 0x68, 0xa3, 0x5c, 0x6f, 0x34, 0x97, 0x8a, 0x95, 0xd5, 0xf2, + 0x62, 0x61, 0xcb, 0xfd, 0x79, 0xb5, 0xb2, 0x56, 0x69, 0x34, 0xd5, 0x72, 0xb1, 0xb4, 0x52, 0x5e, + 0x2c, 0x6c, 0x2b, 0x57, 0xc2, 0x15, 0xd5, 0x5a, 0xb3, 0xb8, 0xbe, 0xae, 0xd6, 0xce, 0x95, 0x9b, + 0xec, 0x8f, 0x7a, 0x41, 0xa7, 0x05, 0x35, 0x9a, 0xf5, 0x95, 0xa2, 0x5a, 0x2e, 0x2e, 0xac, 0x96, + 0x0b, 0x0f, 0xa1, 0xe7, 0xca, 0x30, 0xbb, 0xa6, 0x5d, 0xc4, 0xf5, 0x6d, 0xcd, 0xc2, 0xda, 0x85, + 0x0e, 0x46, 0xd7, 0x09, 0xe0, 0x89, 0x3e, 0x1a, 0xc6, 0xab, 0xcc, 0xe3, 0x75, 0x4b, 0x1f, 0x01, + 0x73, 0x45, 0x44, 0x00, 0xf6, 0x2f, 0x7e, 0x33, 0x58, 0xe1, 0x00, 0x7b, 0x5a, 0x42, 0x7a, 0xc9, + 0x10, 0xfb, 0x89, 0xc7, 0x01, 0x62, 0xe8, 0x31, 0x19, 0xe6, 0x2a, 0xc6, 0x9e, 0xee, 0xe0, 0x65, + 0x6c, 0x60, 0xcb, 0x1d, 0x07, 0x84, 0x60, 0x78, 0x54, 0x0e, 0xc1, 0xb0, 0xc4, 0xc3, 0x70, 0x6b, + 0x1f, 0xb1, 0xf1, 0x65, 0x44, 0x8c, 0xb6, 0xd7, 0xc0, 0x94, 0x4e, 0xf2, 0x95, 0xf4, 0x36, 0x93, + 0x58, 0x90, 0xa0, 0x5c, 0x0f, 0xb3, 0xf4, 0x65, 0x49, 0xef, 0xe0, 0x07, 0xf0, 0x65, 0x36, 0xee, + 0xf2, 0x89, 0xe8, 0x67, 0xfd, 0xc6, 0x57, 0xe1, 0xb0, 0xfc, 0x81, 0xa4, 0x4c, 0x25, 0x03, 0xf3, + 0x25, 0x8f, 0x87, 0xe6, 0xb7, 0xaf, 0x95, 0xe9, 0xe8, 0x3b, 0x12, 0x4c, 0xd7, 0x1d, 0xb3, 0xeb, + 0xaa, 0xac, 0x6e, 0x6c, 0x89, 0x81, 0xfb, 0xa1, 0x70, 0x1b, 0x2b, 0xf1, 0xe0, 0x3e, 0xa5, 0x8f, + 0x1c, 0x43, 0x05, 0x44, 0xb4, 0xb0, 0x6f, 0xf8, 0x2d, 0x6c, 0x89, 0x43, 0xe5, 0xf6, 0x44, 0xd4, + 0xbe, 0x0b, 0xdb, 0xd7, 0x4b, 0x64, 0x28, 0x78, 0x6a, 0xe6, 0x94, 0x76, 0x2d, 0x0b, 0x1b, 0x8e, + 0x18, 0x08, 0x7f, 0x15, 0x06, 0x61, 0x85, 0x07, 0xe1, 0xf6, 0x18, 0x65, 0xf6, 0x4a, 0x49, 0xb1, + 0x8d, 0xbd, 0xc7, 0x47, 0xf3, 0x01, 0x0e, 0xcd, 0x1f, 0x4c, 0xce, 0x56, 0x32, 0x48, 0x57, 0x86, + 0x40, 0xf4, 0x38, 0x14, 0xdc, 0x31, 0xa9, 0xd4, 0xa8, 0x9c, 0x2b, 0x37, 0x2b, 0xd5, 0x73, 0x95, + 0x46, 0xb9, 0x80, 0xd1, 0x2f, 0xc8, 0x30, 0x43, 0x59, 0x53, 0xf1, 0x9e, 0x79, 0x51, 0xb0, 0xd7, + 0x7b, 0x2c, 0xa1, 0xb1, 0x10, 0x2e, 0x21, 0xa2, 0x65, 0xfc, 0x4c, 0x02, 0x63, 0x21, 0x86, 0xdc, + 0xe3, 0xa9, 0xb7, 0xda, 0xd7, 0x0c, 0xb6, 0xfa, 0xb4, 0x96, 0xbe, 0xbd, 0xd5, 0x4b, 0xb2, 0x00, + 0xb4, 0x92, 0xe7, 0x74, 0x7c, 0x09, 0xad, 0x05, 0x98, 0x70, 0x6a, 0x9b, 0x19, 0xa8, 0xb6, 0x52, + 0x3f, 0xb5, 0x7d, 0x7b, 0x78, 0xcc, 0x5a, 0xe0, 0xd1, 0xbb, 0x39, 0x52, 0xdc, 0x2e, 0x27, 0xd1, + 0xb3, 0x43, 0x4f, 0x51, 0x24, 0xde, 0xea, 0xbc, 0x06, 0xa6, 0xc8, 0x63, 0x55, 0xdb, 0xc1, 0xac, + 0x0d, 0x05, 0x09, 0xca, 0x59, 0x98, 0xa1, 0x19, 0x5b, 0xa6, 0xe1, 0xd6, 0x27, 0x4b, 0x32, 0x70, + 0x69, 0x2e, 0x88, 0x2d, 0x0b, 0x6b, 0x8e, 0x69, 0x11, 0x1a, 0x39, 0x0a, 0x62, 0x28, 0x09, 0x7d, + 0xd5, 0x6f, 0x85, 0x65, 0x4e, 0x73, 0x6e, 0x4b, 0x52, 0x95, 0x64, 0x7a, 0xb3, 0x37, 0x5c, 0xfb, + 0xa3, 0xad, 0xae, 0xe9, 0xa2, 0xbd, 0x44, 0xa6, 0x76, 0x58, 0x39, 0x09, 0x0a, 0x4b, 0x75, 0xf3, + 0x96, 0x6a, 0xd5, 0x46, 0xb9, 0xda, 0x28, 0x6c, 0xf6, 0xd5, 0xa8, 0x2d, 0xf4, 0xea, 0x2c, 0x64, + 0xef, 0x37, 0x75, 0x03, 0x3d, 0x92, 0xe1, 0x54, 0xc2, 0xc0, 0xce, 0x25, 0xd3, 0xba, 0xe8, 0x37, + 0xd4, 0x20, 0x21, 0x1e, 0x9b, 0x40, 0x95, 0xe4, 0x81, 0xaa, 0x94, 0xed, 0xa7, 0x4a, 0x3f, 0x1f, + 0x56, 0xa5, 0xbb, 0x78, 0x55, 0xba, 0xa1, 0x8f, 0xfc, 0x5d, 0xe6, 0x23, 0x3a, 0x80, 0x0f, 0xfa, + 0x1d, 0xc0, 0xbd, 0x1c, 0x8c, 0x4f, 0x16, 0x23, 0x93, 0x0c, 0xc0, 0xcf, 0xa5, 0xda, 0xf0, 0xfb, + 0x41, 0xbd, 0x15, 0x01, 0xf5, 0x76, 0x9f, 0x3e, 0x41, 0xdf, 0xdf, 0x75, 0x3c, 0xb4, 0xbf, 0x9b, + 0xb8, 0xa8, 0x9c, 0x80, 0x63, 0x8b, 0x95, 0xa5, 0xa5, 0xb2, 0x5a, 0xae, 0x36, 0x9a, 0xd5, 0x72, + 0xe3, 0x7c, 0x4d, 0x7d, 0xa0, 0xd0, 0x41, 0xaf, 0x92, 0x01, 0x5c, 0x09, 0x95, 0x34, 0xa3, 0x85, + 0x3b, 0x62, 0x3d, 0xfa, 0xff, 0x92, 0x92, 0xf5, 0x09, 0x01, 0xfd, 0x08, 0x38, 0x5f, 0x26, 0x89, + 0xb7, 0xca, 0x48, 0x62, 0xc9, 0x40, 0x7d, 0xed, 0xe3, 0xc1, 0xf6, 0xbc, 0x02, 0x8e, 0x7a, 0xf4, + 0x58, 0xf6, 0xfe, 0xd3, 0xbe, 0x37, 0x64, 0x61, 0x8e, 0xc1, 0xe2, 0xcd, 0xe3, 0x9f, 0x9f, 0x11, + 0x99, 0xc8, 0x23, 0x98, 0x64, 0xd3, 0x76, 0xaf, 0x7b, 0xf7, 0xdf, 0x95, 0x65, 0x98, 0xee, 0x62, + 0x6b, 0x47, 0xb7, 0x6d, 0xdd, 0x34, 0xe8, 0x82, 0xdc, 0xdc, 0xed, 0x4f, 0xf4, 0x25, 0x4e, 0xd6, + 0x2e, 0xe7, 0xd7, 0x35, 0xcb, 0xd1, 0x5b, 0x7a, 0x57, 0x33, 0x9c, 0xf5, 0x20, 0xb3, 0x1a, 0xfe, + 0x13, 0xbd, 0x38, 0xe1, 0xb4, 0x86, 0xaf, 0x49, 0x84, 0x4a, 0xfc, 0x41, 0x82, 0x29, 0x49, 0x2c, + 0xc1, 0x64, 0x6a, 0xf1, 0x81, 0x54, 0xd5, 0xa2, 0x0f, 0xde, 0x5b, 0xca, 0x55, 0x70, 0xa2, 0x52, + 0x2d, 0xd5, 0x54, 0xb5, 0x5c, 0x6a, 0x34, 0xd7, 0xcb, 0xea, 0x5a, 0xa5, 0x5e, 0xaf, 0xd4, 0xaa, + 0xf5, 0x83, 0xb4, 0x76, 0xf4, 0x11, 0xd9, 0xd7, 0x98, 0x45, 0xdc, 0xea, 0xe8, 0x06, 0x46, 0xf7, + 0x1e, 0x50, 0x61, 0xf8, 0x55, 0x1f, 0x71, 0x9c, 0x59, 0xf9, 0x11, 0x38, 0xbf, 0x32, 0x39, 0xce, + 0xfd, 0x09, 0xfe, 0x07, 0x6e, 0xfe, 0x8f, 0xc9, 0x70, 0x2c, 0xd4, 0x10, 0x55, 0xbc, 0x33, 0xb2, + 0x95, 0xbc, 0x9f, 0x08, 0xb7, 0xdd, 0x0a, 0x8f, 0x69, 0x3f, 0x6b, 0x7a, 0x1f, 0x1b, 0x11, 0xb0, + 0xbe, 0xd6, 0x87, 0x75, 0x95, 0x83, 0xf5, 0x19, 0x43, 0xd0, 0x4c, 0x86, 0xec, 0xef, 0xa5, 0x8a, + 0xec, 0x55, 0x70, 0x62, 0xbd, 0xa8, 0x36, 0x2a, 0xa5, 0xca, 0x7a, 0xd1, 0x1d, 0x47, 0x43, 0x43, + 0x76, 0x84, 0xb9, 0xce, 0x83, 0xde, 0x17, 0xdf, 0x77, 0x67, 0xe1, 0x9a, 0xfe, 0x1d, 0x6d, 0x69, + 0x5b, 0x33, 0xb6, 0x30, 0xd2, 0x45, 0xa0, 0x5e, 0x84, 0x89, 0x16, 0xc9, 0x4e, 0x71, 0x0e, 0x6f, + 0xdd, 0xc4, 0xf4, 0xe5, 0xb4, 0x04, 0xd5, 0xfb, 0x15, 0xbd, 0x39, 0xac, 0x10, 0x0d, 0x5e, 0x21, + 0xee, 0x89, 0x07, 0x6f, 0x1f, 0xdf, 0x11, 0xba, 0xf1, 0x71, 0x5f, 0x37, 0xce, 0x73, 0xba, 0x51, + 0x3a, 0x18, 0xf9, 0x64, 0x6a, 0xf2, 0x27, 0x8f, 0x87, 0x0e, 0x20, 0x52, 0x9b, 0xf4, 0xe8, 0x51, + 0xa1, 0x6f, 0x77, 0xff, 0x0a, 0x19, 0xf2, 0x8b, 0xb8, 0x83, 0x45, 0x57, 0x22, 0xbf, 0x2e, 0x89, + 0x6e, 0x88, 0x50, 0x18, 0x28, 0xed, 0xe8, 0xd5, 0x11, 0x47, 0xdf, 0xc1, 0xb6, 0xa3, 0xed, 0x74, + 0x89, 0xa8, 0x65, 0x35, 0x48, 0x40, 0x3f, 0x29, 0x89, 0x6c, 0x97, 0xc4, 0x14, 0xf3, 0x1f, 0x63, + 0x4d, 0xf1, 0x93, 0x12, 0x4c, 0xd6, 0xb1, 0x53, 0xb3, 0xda, 0xd8, 0x42, 0xf5, 0x00, 0xa3, 0x33, + 0x30, 0x4d, 0x40, 0x71, 0xa7, 0x99, 0x3e, 0x4e, 0xe1, 0x24, 0xe5, 0x06, 0x98, 0xf3, 0x5f, 0xc9, + 0xef, 0xac, 0x1b, 0xef, 0x49, 0x45, 0xff, 0x98, 0x11, 0xdd, 0xc5, 0x65, 0x4b, 0x86, 0x8c, 0x9b, + 0x88, 0x56, 0x2a, 0xb6, 0x23, 0x1b, 0x4b, 0x2a, 0xfd, 0x8d, 0xae, 0x37, 0x4a, 0x00, 0x1b, 0x86, + 0xed, 0xc9, 0xf5, 0xc9, 0x09, 0xe4, 0x8a, 0xfe, 0x39, 0x93, 0x6c, 0x16, 0x13, 0x94, 0x13, 0x21, + 0xb1, 0xdf, 0x4c, 0xb0, 0xb6, 0x10, 0x49, 0x2c, 0x7d, 0x99, 0x7d, 0x71, 0x0e, 0xf2, 0xe7, 0xb5, + 0x4e, 0x07, 0x3b, 0xe8, 0x4b, 0x12, 0xe4, 0x4b, 0x16, 0xd6, 0x1c, 0x1c, 0x16, 0x1d, 0x82, 0x49, + 0xcb, 0x34, 0x9d, 0x75, 0xcd, 0xd9, 0x66, 0x72, 0xf3, 0xdf, 0x99, 0xc3, 0xc0, 0xef, 0x86, 0xbb, + 0x8f, 0x7b, 0x79, 0xd1, 0x7d, 0x3f, 0x57, 0x5b, 0x5a, 0xd0, 0x3c, 0x2d, 0x24, 0xa2, 0xff, 0x40, + 0x30, 0xb9, 0x63, 0xe0, 0x1d, 0xd3, 0xd0, 0x5b, 0x9e, 0xcd, 0xe9, 0xbd, 0xa3, 0xf7, 0xfa, 0x32, + 0x5d, 0xe0, 0x64, 0x3a, 0x2f, 0x5c, 0x4a, 0x32, 0x81, 0xd6, 0x87, 0xe8, 0x3d, 0xae, 0x85, 0xab, + 0x69, 0x67, 0xd0, 0x6c, 0xd4, 0x9a, 0x25, 0xb5, 0x5c, 0x6c, 0x94, 0x9b, 0xab, 0xb5, 0x52, 0x71, + 0xb5, 0xa9, 0x96, 0xd7, 0x6b, 0x05, 0x8c, 0xfe, 0x4e, 0x72, 0x85, 0xdb, 0x32, 0xf7, 0xb0, 0x85, + 0x96, 0x85, 0xe4, 0x1c, 0x27, 0x13, 0x86, 0xc1, 0xcf, 0x0b, 0x3b, 0x6d, 0x30, 0xe9, 0x30, 0x0e, + 0x22, 0x94, 0xf7, 0x7d, 0x42, 0xcd, 0x3d, 0x96, 0xd4, 0xe3, 0x40, 0xd2, 0xff, 0x5b, 0x82, 0x89, + 0x92, 0x69, 0xec, 0x61, 0xcb, 0x09, 0xcf, 0x77, 0xc2, 0xd2, 0xcc, 0xf0, 0xd2, 0x74, 0x07, 0x49, + 0x6c, 0x38, 0x96, 0xd9, 0xf5, 0x26, 0x3c, 0xde, 0x2b, 0xfa, 0xed, 0xa4, 0x12, 0x66, 0x25, 0x47, + 0x2f, 0x7c, 0xf6, 0x2f, 0x88, 0x63, 0x4f, 0xee, 0x69, 0x00, 0xaf, 0x4a, 0x82, 0x4b, 0x7f, 0x06, + 0xd2, 0xef, 0x52, 0x3e, 0x2f, 0xc3, 0x2c, 0x6d, 0x7c, 0x75, 0x4c, 0x2c, 0x34, 0x54, 0x0b, 0x2f, + 0x39, 0xf6, 0x08, 0x7f, 0xe5, 0x08, 0x27, 0xfe, 0xbc, 0xd6, 0xed, 0xfa, 0xcb, 0xcf, 0x2b, 0x47, + 0x54, 0xf6, 0x4e, 0xd5, 0x7c, 0x21, 0x0f, 0x59, 0x6d, 0xd7, 0xd9, 0x46, 0xdf, 0x11, 0x9e, 0x7c, + 0x72, 0x9d, 0x01, 0xe3, 0x27, 0x02, 0x92, 0xe3, 0x90, 0x73, 0xcc, 0x8b, 0xd8, 0x93, 0x03, 0x7d, + 0x71, 0xe1, 0xd0, 0xba, 0xdd, 0x06, 0xf9, 0xc0, 0xe0, 0xf0, 0xde, 0x5d, 0x5b, 0x47, 0x6b, 0xb5, + 0xcc, 0x5d, 0xc3, 0xa9, 0x78, 0x4b, 0xd0, 0x41, 0x02, 0xfa, 0x6c, 0x46, 0x64, 0x32, 0x2b, 0xc0, + 0x60, 0x32, 0xc8, 0x2e, 0x0c, 0xd1, 0x94, 0xe6, 0xe1, 0xa6, 0xe2, 0xfa, 0x7a, 0xb3, 0x51, 0x7b, + 0xa0, 0x5c, 0x0d, 0x0c, 0xcf, 0x66, 0xa5, 0xda, 0x6c, 0xac, 0x94, 0x9b, 0xa5, 0x0d, 0x95, 0xac, + 0x13, 0x16, 0x4b, 0xa5, 0xda, 0x46, 0xb5, 0x51, 0xc0, 0xe8, 0x75, 0x12, 0xcc, 0x94, 0x3a, 0xa6, + 0xed, 0x23, 0x7c, 0x6d, 0x80, 0xb0, 0x2f, 0xc6, 0x4c, 0x48, 0x8c, 0xe8, 0xdf, 0x32, 0xa2, 0x4e, + 0x07, 0x9e, 0x40, 0x42, 0xe4, 0x23, 0x7a, 0xa9, 0xdf, 0x16, 0x72, 0x3a, 0x18, 0x4c, 0x2f, 0xfd, + 0x26, 0xf1, 0x99, 0x7b, 0x60, 0xa2, 0x48, 0x15, 0x03, 0xfd, 0x4d, 0x06, 0xf2, 0x25, 0xd3, 0xd8, + 0xd4, 0xb7, 0x5c, 0x63, 0x0e, 0x1b, 0xda, 0x85, 0x0e, 0x5e, 0xd4, 0x1c, 0x6d, 0x4f, 0xc7, 0x97, + 0x48, 0x05, 0x26, 0xd5, 0x9e, 0x54, 0x97, 0x29, 0x96, 0x82, 0x2f, 0xec, 0x6e, 0x11, 0xa6, 0x26, + 0xd5, 0x70, 0x92, 0xf2, 0x0c, 0xb8, 0x92, 0xbe, 0xae, 0x5b, 0xd8, 0xc2, 0x1d, 0xac, 0xd9, 0xd8, + 0x9d, 0x16, 0x19, 0xb8, 0x43, 0x94, 0x76, 0x52, 0x8d, 0xfa, 0xac, 0x9c, 0x85, 0x19, 0xfa, 0x89, + 0x98, 0x22, 0x36, 0x51, 0xe3, 0x49, 0x95, 0x4b, 0x53, 0x9e, 0x02, 0x39, 0xfc, 0xb0, 0x63, 0x69, + 0xa7, 0xda, 0x04, 0xaf, 0x2b, 0xe7, 0xa9, 0xd7, 0xe1, 0xbc, 0xe7, 0x75, 0x38, 0x5f, 0x27, 0x3e, + 0x89, 0x2a, 0xcd, 0x85, 0x3e, 0x32, 0xe9, 0x1b, 0x12, 0xaf, 0x93, 0x03, 0xc5, 0x50, 0x20, 0x6b, + 0x68, 0x3b, 0x98, 0xe9, 0x05, 0x79, 0x56, 0x6e, 0x82, 0xa3, 0xda, 0x9e, 0xe6, 0x68, 0xd6, 0xaa, + 0xd9, 0xd2, 0x3a, 0x64, 0xf0, 0xf3, 0x5a, 0x7e, 0xef, 0x07, 0xb2, 0x23, 0xe4, 0x98, 0x16, 0x26, + 0xb9, 0xbc, 0x1d, 0x21, 0x2f, 0xc1, 0xa5, 0xae, 0xb7, 0x4c, 0x83, 0xf0, 0x2f, 0xab, 0xe4, 0xd9, + 0x95, 0x4a, 0x5b, 0xb7, 0xdd, 0x8a, 0x10, 0x2a, 0x55, 0xba, 0xb5, 0x51, 0xbf, 0x6c, 0xb4, 0xc8, + 0x6e, 0xd0, 0xa4, 0x1a, 0xf5, 0x59, 0x59, 0x80, 0x69, 0xb6, 0x11, 0xb2, 0xe6, 0xea, 0x55, 0x9e, + 0xe8, 0xd5, 0x19, 0xde, 0xa7, 0x8b, 0xe2, 0x39, 0x5f, 0x0d, 0xf2, 0xa9, 0xe1, 0x9f, 0x94, 0xfb, + 0xe0, 0x6a, 0xf6, 0x5a, 0xda, 0xb5, 0x1d, 0x73, 0x87, 0x82, 0xbe, 0xa4, 0x77, 0x68, 0x0d, 0x26, + 0x48, 0x0d, 0xe2, 0xb2, 0x28, 0xb7, 0xc3, 0xf1, 0xae, 0x85, 0x37, 0xb1, 0xf5, 0xa0, 0xb6, 0xb3, + 0xfb, 0x70, 0xc3, 0xd2, 0x0c, 0xbb, 0x6b, 0x5a, 0xce, 0xa9, 0x49, 0xc2, 0x7c, 0xdf, 0x6f, 0xca, + 0xcd, 0x70, 0xec, 0x21, 0xdb, 0x34, 0x8a, 0x5d, 0x7d, 0x55, 0xb7, 0x1d, 0x6c, 0x14, 0xdb, 0x6d, + 0xeb, 0xd4, 0x14, 0x29, 0x6b, 0xff, 0x07, 0xd6, 0xad, 0x4e, 0x42, 0x9e, 0x0a, 0x1b, 0xbd, 0x28, + 0x27, 0xec, 0xfc, 0xc9, 0xaa, 0x1f, 0x6b, 0xcc, 0xdd, 0x0a, 0x13, 0xac, 0x3f, 0x24, 0xb0, 0x4e, + 0xdf, 0x7e, 0xb2, 0x67, 0x15, 0x82, 0x51, 0x51, 0xbd, 0x6c, 0xca, 0x53, 0x21, 0xdf, 0x22, 0x42, + 0x20, 0x08, 0x4f, 0xdf, 0x7e, 0x75, 0xff, 0x42, 0x49, 0x16, 0x95, 0x65, 0x45, 0x7f, 0x29, 0x0b, + 0xf9, 0x8b, 0xc6, 0x71, 0x9c, 0xac, 0x0f, 0xf8, 0xaa, 0x34, 0x44, 0x27, 0x7b, 0x33, 0xdc, 0xc8, + 0x7a, 0x50, 0x66, 0xad, 0x2c, 0x36, 0x17, 0x36, 0xbc, 0xa9, 0xa3, 0x6b, 0xc3, 0xd4, 0x1b, 0x45, + 0xd5, 0x9d, 0xf7, 0x2f, 0xba, 0x53, 0xce, 0x9b, 0xe0, 0x86, 0x01, 0xb9, 0xcb, 0x8d, 0x66, 0xb5, + 0xb8, 0x56, 0x2e, 0x6c, 0xf2, 0x96, 0x50, 0xbd, 0x51, 0x5b, 0x6f, 0xaa, 0x1b, 0xd5, 0x6a, 0xa5, + 0xba, 0x4c, 0x89, 0xb9, 0x06, 0xe4, 0xc9, 0x20, 0xc3, 0x79, 0xb5, 0xd2, 0x28, 0x37, 0x4b, 0xb5, + 0xea, 0x52, 0x65, 0xb9, 0xa0, 0x0f, 0x32, 0xa3, 0x1e, 0x52, 0xce, 0xc0, 0x35, 0x1c, 0x27, 0x95, + 0x5a, 0xd5, 0x9d, 0x07, 0x97, 0x8a, 0xd5, 0x52, 0xd9, 0x9d, 0xf4, 0x5e, 0x54, 0x10, 0x9c, 0xa0, + 0xe4, 0x9a, 0x4b, 0x95, 0xd5, 0xf0, 0xd6, 0xd5, 0x87, 0x32, 0xca, 0x29, 0xb8, 0x22, 0xfc, 0xad, + 0x52, 0x3d, 0x57, 0x5c, 0xad, 0x2c, 0x16, 0x3e, 0x9c, 0x51, 0xae, 0x87, 0x6b, 0xb9, 0xbf, 0xe8, + 0x2e, 0x54, 0xb3, 0xb2, 0xd8, 0x5c, 0xab, 0xd4, 0xd7, 0x8a, 0x8d, 0xd2, 0x4a, 0xe1, 0x23, 0x64, + 0x76, 0xe1, 0x9b, 0xcb, 0x21, 0x27, 0xce, 0x97, 0x84, 0x2d, 0x80, 0x22, 0xaf, 0xa8, 0x4f, 0xee, + 0x0b, 0x7b, 0xbc, 0xc5, 0xfb, 0x01, 0x7f, 0x2c, 0x59, 0xe4, 0x54, 0xe8, 0xd6, 0x04, 0xb4, 0x92, + 0xe9, 0x50, 0x63, 0x08, 0x15, 0x3a, 0x03, 0xd7, 0x54, 0xcb, 0x14, 0x29, 0xb5, 0x5c, 0xaa, 0x9d, + 0x2b, 0xab, 0xcd, 0xf3, 0xc5, 0xd5, 0xd5, 0x72, 0xa3, 0xb9, 0x54, 0x51, 0xeb, 0x8d, 0xc2, 0x26, + 0xfa, 0x67, 0xc9, 0x5f, 0xfb, 0x09, 0x49, 0xeb, 0x6f, 0xa4, 0xa4, 0xcd, 0x3a, 0x76, 0x8d, 0xe7, + 0x07, 0x20, 0x6f, 0x3b, 0x9a, 0xb3, 0x6b, 0xb3, 0x56, 0xfd, 0x84, 0xfe, 0xad, 0x7a, 0xbe, 0x4e, + 0x32, 0xa9, 0x2c, 0x33, 0xfa, 0xcb, 0x4c, 0x92, 0x66, 0x3a, 0x82, 0xe5, 0x1f, 0x7d, 0x08, 0x11, + 0x9f, 0x06, 0xe4, 0x69, 0x7b, 0xa5, 0xde, 0x2c, 0xae, 0xaa, 0xe5, 0xe2, 0xe2, 0x83, 0xfe, 0xa2, + 0x0f, 0x56, 0x4e, 0xc0, 0xb1, 0x8d, 0x6a, 0x71, 0x61, 0xb5, 0x4c, 0x9a, 0x4b, 0xad, 0x5a, 0x2d, + 0x97, 0x5c, 0xb9, 0xff, 0x24, 0xd9, 0x62, 0x71, 0xed, 0x6d, 0xc2, 0xb7, 0x6b, 0x13, 0x85, 0xe4, + 0xff, 0x15, 0x61, 0x4f, 0xa4, 0x40, 0xc3, 0xc2, 0xb4, 0x46, 0x8b, 0xc3, 0x67, 0x85, 0x9c, 0x8f, + 0x84, 0x38, 0x49, 0x86, 0xc7, 0x7f, 0x1e, 0x02, 0x8f, 0x13, 0x70, 0x2c, 0x8c, 0x07, 0x71, 0x42, + 0x8a, 0x86, 0xe1, 0x45, 0x53, 0x90, 0xaf, 0xe3, 0x0e, 0x6e, 0x39, 0xe8, 0x31, 0x29, 0x30, 0x3d, + 0xe6, 0x40, 0xf2, 0x9d, 0x5e, 0x24, 0xbd, 0xcd, 0x4d, 0xb6, 0xa5, 0x9e, 0xc9, 0x76, 0x8c, 0xd1, + 0x20, 0x27, 0x32, 0x1a, 0xb2, 0x29, 0x18, 0x0d, 0xb9, 0xe1, 0x8d, 0x86, 0x7c, 0x52, 0xa3, 0x61, + 0x22, 0xd6, 0x68, 0x40, 0xbf, 0x99, 0x4f, 0xda, 0xa7, 0x50, 0x60, 0x0e, 0xd7, 0x54, 0xf8, 0x5f, + 0xd9, 0x24, 0x7d, 0x50, 0x5f, 0x8e, 0x93, 0xe9, 0xfc, 0x77, 0xe4, 0x14, 0x96, 0x36, 0x94, 0xeb, + 0xe0, 0xda, 0xe0, 0xbd, 0x59, 0x7e, 0x56, 0xa5, 0xde, 0xa8, 0x13, 0xfb, 0xa0, 0x54, 0x53, 0xd5, + 0x8d, 0x75, 0xba, 0x3e, 0x7d, 0x12, 0x94, 0x80, 0x8a, 0xba, 0x51, 0xa5, 0xd6, 0xc0, 0x16, 0x4f, + 0x7d, 0xa9, 0x52, 0x5d, 0x6c, 0xfa, 0x2d, 0xac, 0xba, 0x54, 0x2b, 0x6c, 0xbb, 0xd3, 0xc1, 0x10, + 0x75, 0x77, 0x38, 0x67, 0x25, 0x14, 0xab, 0x8b, 0xcd, 0xb5, 0x6a, 0x79, 0xad, 0x56, 0xad, 0x94, + 0x48, 0x7a, 0xbd, 0xdc, 0x28, 0xe8, 0xee, 0xb0, 0xd4, 0x63, 0x7f, 0xd4, 0xcb, 0x45, 0xb5, 0xb4, + 0x52, 0x56, 0x69, 0x91, 0x0f, 0x29, 0x37, 0xc0, 0xd9, 0x62, 0xb5, 0xd6, 0x70, 0x53, 0x8a, 0xd5, + 0x07, 0x1b, 0x0f, 0xae, 0x97, 0x9b, 0xeb, 0x6a, 0xad, 0x54, 0xae, 0xd7, 0xdd, 0x56, 0xcd, 0xac, + 0x95, 0x42, 0x47, 0xb9, 0x07, 0xee, 0x0c, 0xb1, 0x56, 0x6e, 0x90, 0xcd, 0xd0, 0xb5, 0x1a, 0xf1, + 0x87, 0x59, 0x2c, 0x37, 0x57, 0x8a, 0xf5, 0x66, 0xa5, 0x5a, 0xaa, 0xad, 0xad, 0x17, 0x1b, 0x15, + 0xb7, 0xf1, 0xaf, 0xab, 0xb5, 0x46, 0xad, 0x79, 0xae, 0xac, 0xd6, 0x2b, 0xb5, 0x6a, 0xc1, 0x70, + 0xab, 0x1c, 0xea, 0x2d, 0xbc, 0x5e, 0xdb, 0x54, 0xae, 0x81, 0x53, 0x5e, 0xfa, 0x6a, 0xcd, 0x15, + 0x74, 0xc8, 0x7e, 0xe9, 0xa6, 0x6a, 0xbf, 0xfc, 0xab, 0x04, 0xd9, 0xba, 0x63, 0x76, 0xd1, 0xf7, + 0x07, 0xdd, 0xd1, 0x69, 0x00, 0x8b, 0xec, 0x6d, 0xba, 0x33, 0x3c, 0x36, 0xe7, 0x0b, 0xa5, 0xa0, + 0x3f, 0x16, 0xde, 0x90, 0x09, 0x7a, 0x78, 0xb3, 0x1b, 0x61, 0xd9, 0x7c, 0x4b, 0xec, 0x84, 0x4a, + 0x34, 0xa1, 0x64, 0xfa, 0xfe, 0x33, 0xc3, 0x6c, 0xb9, 0x20, 0x38, 0x19, 0x82, 0xcd, 0x95, 0xbf, + 0xa7, 0x12, 0x58, 0xb9, 0x12, 0xae, 0xe8, 0x51, 0x2e, 0xa2, 0x53, 0x9b, 0xca, 0xf7, 0xc1, 0x13, + 0x42, 0xea, 0x5d, 0x5e, 0xab, 0x9d, 0x2b, 0xfb, 0x8a, 0xbc, 0x58, 0x6c, 0x14, 0x0b, 0x5b, 0xe8, + 0x93, 0x32, 0x64, 0xd7, 0xcc, 0xbd, 0xde, 0x7d, 0x30, 0x03, 0x5f, 0x0a, 0xad, 0xb3, 0x7a, 0xaf, + 0xbc, 0x47, 0xbe, 0x90, 0xd8, 0xd7, 0xa2, 0xf7, 0xbc, 0x3f, 0x2b, 0x25, 0x11, 0xfb, 0xda, 0x41, + 0x37, 0xba, 0xff, 0x7e, 0x18, 0xb1, 0x47, 0x88, 0x16, 0x2b, 0x67, 0xe1, 0x74, 0xf0, 0xa1, 0xb2, + 0x58, 0xae, 0x36, 0x2a, 0x4b, 0x0f, 0x06, 0xc2, 0xad, 0xa8, 0x42, 0xe2, 0x1f, 0xd4, 0x8d, 0xc5, + 0xcf, 0x4b, 0x4e, 0xc1, 0xf1, 0xe0, 0xdb, 0x72, 0xb9, 0xe1, 0x7d, 0x79, 0x08, 0x3d, 0x92, 0x83, + 0x19, 0xda, 0xad, 0x6f, 0x74, 0xdb, 0x9a, 0x83, 0xd1, 0x53, 0x03, 0x74, 0x6f, 0x84, 0xa3, 0x95, + 0xf5, 0xa5, 0x7a, 0xdd, 0x31, 0x2d, 0x6d, 0x0b, 0x93, 0x71, 0x8c, 0x4a, 0xab, 0x37, 0x19, 0xbd, + 0x55, 0x78, 0x0d, 0x91, 0x1f, 0x4a, 0x68, 0x99, 0x11, 0xa8, 0x7f, 0x5e, 0x68, 0xcd, 0x4f, 0x80, + 0x60, 0x32, 0xf4, 0x1f, 0x1a, 0x71, 0x9b, 0x8b, 0xc6, 0x65, 0xf3, 0xec, 0xf3, 0x24, 0x98, 0x6a, + 0xe8, 0x3b, 0xf8, 0xd9, 0xa6, 0x81, 0x6d, 0x65, 0x02, 0xe4, 0xe5, 0xb5, 0x46, 0xe1, 0x88, 0xfb, + 0xe0, 0x9a, 0x60, 0x19, 0xf2, 0x50, 0x76, 0x0b, 0x70, 0x1f, 0x8a, 0x8d, 0x82, 0xec, 0x3e, 0xac, + 0x95, 0x1b, 0x85, 0xac, 0xfb, 0x50, 0x2d, 0x37, 0x0a, 0x39, 0xf7, 0x61, 0x7d, 0xb5, 0x51, 0xc8, + 0xbb, 0x0f, 0x95, 0x7a, 0xa3, 0x30, 0xe1, 0x3e, 0x2c, 0xd4, 0x1b, 0x85, 0x49, 0xf7, 0xe1, 0x5c, + 0xbd, 0x51, 0x98, 0x72, 0x1f, 0x4a, 0x8d, 0x46, 0x01, 0xdc, 0x87, 0xfb, 0xeb, 0x8d, 0xc2, 0xb4, + 0xfb, 0x50, 0x2c, 0x35, 0x0a, 0x33, 0xe4, 0xa1, 0xdc, 0x28, 0xcc, 0xba, 0x0f, 0xf5, 0x7a, 0xa3, + 0x30, 0x47, 0x28, 0xd7, 0x1b, 0x85, 0xa3, 0xa4, 0xac, 0x4a, 0xa3, 0x50, 0x70, 0x1f, 0x56, 0xea, + 0x8d, 0xc2, 0x31, 0x92, 0xb9, 0xde, 0x28, 0x28, 0xa4, 0xd0, 0x7a, 0xa3, 0x70, 0x05, 0xc9, 0x53, + 0x6f, 0x14, 0x8e, 0x93, 0x22, 0xea, 0x8d, 0xc2, 0x09, 0xc2, 0x46, 0xb9, 0x51, 0x38, 0x49, 0xf2, + 0xa8, 0x8d, 0xc2, 0x95, 0xe4, 0x53, 0xb5, 0x51, 0x38, 0x45, 0x18, 0x2b, 0x37, 0x0a, 0x57, 0x91, + 0x07, 0xb5, 0x51, 0x40, 0xe4, 0x53, 0xb1, 0x51, 0xb8, 0x1a, 0x3d, 0x01, 0xa6, 0x96, 0xb1, 0x43, + 0x41, 0x44, 0x05, 0x90, 0x97, 0xb1, 0x13, 0x36, 0xfa, 0xbf, 0x28, 0xc3, 0x95, 0x6c, 0xa2, 0xb8, + 0x64, 0x99, 0x3b, 0xab, 0x78, 0x4b, 0x6b, 0x5d, 0x2e, 0x3f, 0xec, 0x1a, 0x5c, 0xe1, 0x3d, 0x5f, + 0x05, 0xb2, 0xdd, 0xa0, 0x33, 0x22, 0xcf, 0xb1, 0xf6, 0xa9, 0xb7, 0xd0, 0x25, 0x07, 0x0b, 0x5d, + 0xcc, 0x22, 0xfb, 0xa7, 0xb0, 0x46, 0x73, 0x6b, 0xd3, 0x99, 0x9e, 0xb5, 0x69, 0xb7, 0x99, 0x74, + 0xb1, 0x65, 0x9b, 0x86, 0xd6, 0xa9, 0x33, 0xa7, 0x00, 0xba, 0xa2, 0xd6, 0x9b, 0xac, 0xfc, 0x90, + 0xd7, 0x32, 0xa8, 0x55, 0xf6, 0xcc, 0xb8, 0xf9, 0x70, 0x6f, 0x35, 0x23, 0x1a, 0xc9, 0x47, 0xfc, + 0x46, 0xd2, 0xe0, 0x1a, 0xc9, 0x7d, 0x07, 0xa0, 0x9d, 0xac, 0xbd, 0x54, 0x86, 0x9b, 0x88, 0x04, + 0x2e, 0xb3, 0xde, 0x52, 0xb8, 0x8c, 0x3e, 0x29, 0xc1, 0xc9, 0xb2, 0xd1, 0x6f, 0x3e, 0x10, 0xd6, + 0x85, 0xd7, 0x85, 0xa1, 0x59, 0xe7, 0x45, 0x7a, 0x67, 0xdf, 0x6a, 0xf7, 0xa7, 0x19, 0x21, 0xd1, + 0x8f, 0xf9, 0x12, 0xad, 0x73, 0x12, 0xbd, 0x77, 0x78, 0xd2, 0xc9, 0x04, 0x5a, 0x1d, 0x69, 0x07, + 0x94, 0x45, 0x5f, 0x92, 0xe0, 0x18, 0xf5, 0xeb, 0xb9, 0x9f, 0x4e, 0x3f, 0x48, 0x97, 0xcd, 0x9b, + 0x50, 0x9d, 0x60, 0xaa, 0x42, 0xf5, 0x3b, 0x94, 0x82, 0x5e, 0x1d, 0x16, 0xf8, 0x03, 0xbc, 0xc0, + 0x23, 0x3a, 0xe3, 0xde, 0xe2, 0x22, 0x64, 0xfd, 0x61, 0x5f, 0xd6, 0x55, 0x4e, 0xd6, 0x77, 0x0e, + 0x45, 0xf5, 0x70, 0xc5, 0xfc, 0xd5, 0x2c, 0x3c, 0x81, 0x72, 0xc8, 0x14, 0x81, 0x76, 0x66, 0x45, + 0xa3, 0xad, 0x62, 0xdb, 0xd1, 0x2c, 0x87, 0x3b, 0xd2, 0xde, 0x33, 0xbf, 0xcd, 0xa4, 0x30, 0xbf, + 0x95, 0x06, 0xce, 0x6f, 0xd1, 0x5b, 0xc2, 0x56, 0xda, 0x79, 0x1e, 0xd9, 0x62, 0x0c, 0x06, 0x11, + 0x35, 0x8c, 0x6a, 0x51, 0xbe, 0xf9, 0xf6, 0xc3, 0x1c, 0xca, 0x4b, 0x07, 0x2e, 0x21, 0x19, 0xe2, + 0x7f, 0x3c, 0x5a, 0x73, 0x3a, 0x1b, 0xfe, 0xc6, 0xdb, 0x7e, 0x85, 0x76, 0xaa, 0xf3, 0xa0, 0x17, + 0x4f, 0xc2, 0x14, 0xe9, 0x72, 0x56, 0x75, 0xe3, 0xa2, 0x3b, 0x36, 0xce, 0x54, 0xf1, 0xa5, 0xd2, + 0xb6, 0xd6, 0xe9, 0x60, 0x63, 0x0b, 0xa3, 0x87, 0x38, 0x03, 0x5d, 0xeb, 0x76, 0xab, 0xc1, 0x56, + 0x91, 0xf7, 0xaa, 0xdc, 0x0b, 0x39, 0xbb, 0x65, 0x76, 0x31, 0x11, 0xd4, 0x5c, 0xc8, 0xb9, 0x84, + 0x5f, 0xee, 0x2a, 0xee, 0x3a, 0xdb, 0xf3, 0xa4, 0xac, 0x62, 0x57, 0xaf, 0xbb, 0x3f, 0xa8, 0xf4, + 0x3f, 0x36, 0x4e, 0x7e, 0xa5, 0x6f, 0x67, 0x9c, 0x89, 0xe9, 0x8c, 0x7d, 0xc6, 0xe7, 0xc3, 0x4c, + 0x47, 0xac, 0x64, 0x9c, 0x81, 0xe9, 0x96, 0x97, 0xc5, 0x3f, 0x3b, 0x13, 0x4e, 0x42, 0x5f, 0x4e, + 0xd4, 0x5d, 0x0b, 0x15, 0x9e, 0x4c, 0xab, 0xf0, 0x88, 0xed, 0xc5, 0x13, 0x70, 0xac, 0x51, 0xab, + 0x35, 0xd7, 0x8a, 0xd5, 0x07, 0x83, 0x33, 0xeb, 0x9b, 0xe8, 0x65, 0x59, 0x98, 0xab, 0x9b, 0x9d, + 0x3d, 0x1c, 0xe0, 0x5c, 0xe1, 0x9c, 0xb2, 0xc2, 0x72, 0xca, 0xec, 0x93, 0x93, 0x72, 0x12, 0xf2, + 0x9a, 0x61, 0x5f, 0xc2, 0x9e, 0x0d, 0xcf, 0xde, 0x18, 0x8c, 0xef, 0x0e, 0x77, 0x04, 0x2a, 0x0f, + 0xe3, 0x5d, 0x03, 0x24, 0xc9, 0x73, 0x15, 0x01, 0xe4, 0x59, 0x98, 0xb1, 0xe9, 0x86, 0x71, 0x23, + 0xe4, 0x17, 0xc0, 0xa5, 0x11, 0x16, 0xa9, 0xc7, 0x82, 0xcc, 0x58, 0x24, 0x6f, 0xe8, 0x55, 0x7e, + 0xff, 0xb1, 0xc1, 0x41, 0x5c, 0x3c, 0x08, 0x63, 0xc9, 0x40, 0x7e, 0xc5, 0xa8, 0x67, 0xe2, 0xa7, + 0xe0, 0x38, 0x6b, 0xf6, 0xcd, 0xd2, 0x4a, 0x71, 0x75, 0xb5, 0x5c, 0x5d, 0x2e, 0x37, 0x2b, 0x8b, + 0x74, 0x03, 0x2a, 0x48, 0x29, 0x36, 0x1a, 0xe5, 0xb5, 0xf5, 0x46, 0xbd, 0x59, 0x7e, 0x56, 0xa9, + 0x5c, 0x5e, 0x24, 0x6e, 0x91, 0xe4, 0x5c, 0x93, 0xe7, 0xc0, 0x5a, 0xac, 0xd6, 0xcf, 0x97, 0xd5, + 0xc2, 0xf6, 0xd9, 0x22, 0x4c, 0x87, 0x06, 0x0a, 0x97, 0xbb, 0x45, 0xbc, 0xa9, 0xed, 0x76, 0x98, + 0x4d, 0x5d, 0x38, 0xe2, 0x72, 0x47, 0x64, 0x53, 0x33, 0x3a, 0x97, 0x0b, 0x19, 0xa5, 0x00, 0x33, + 0xe1, 0x31, 0xa1, 0x20, 0xa1, 0x37, 0x5e, 0x03, 0x53, 0xe7, 0x4d, 0xeb, 0x22, 0xf1, 0xe5, 0x43, + 0xef, 0xa0, 0xb1, 0x6d, 0xbc, 0x53, 0xc2, 0x21, 0x03, 0xec, 0x15, 0xe2, 0x1e, 0x23, 0x1e, 0xb5, + 0xf9, 0x81, 0x27, 0x81, 0xcf, 0xc0, 0xf4, 0x25, 0x2f, 0x77, 0xd0, 0xd2, 0x43, 0x49, 0xe8, 0xbf, + 0x8b, 0xf9, 0x80, 0x0c, 0x2e, 0x32, 0x7d, 0x1f, 0x85, 0x37, 0x48, 0x90, 0x5f, 0xc6, 0x4e, 0xb1, + 0xd3, 0x09, 0xcb, 0xed, 0xa5, 0xc2, 0xa7, 0xbb, 0xb8, 0x4a, 0x14, 0x3b, 0x9d, 0xe8, 0x46, 0x15, + 0x12, 0x90, 0x77, 0x0a, 0x81, 0x4b, 0x13, 0xf4, 0x9d, 0x1c, 0x50, 0x60, 0xfa, 0x12, 0x7b, 0xaf, + 0xec, 0xfb, 0x39, 0x3c, 0x1a, 0x32, 0x93, 0x6e, 0x0b, 0xe2, 0x1a, 0x65, 0xe2, 0xfd, 0x25, 0xbc, + 0x7c, 0xca, 0x03, 0x30, 0xb1, 0x6b, 0xe3, 0x92, 0x66, 0x7b, 0x43, 0x1b, 0x5f, 0xd3, 0xda, 0x85, + 0x87, 0x70, 0xcb, 0x99, 0xaf, 0xec, 0xb8, 0x13, 0x9f, 0x0d, 0x9a, 0xd1, 0x0f, 0x15, 0xc4, 0xde, + 0x55, 0x8f, 0x82, 0x3b, 0x79, 0xbc, 0xa4, 0x3b, 0xdb, 0xa5, 0x6d, 0xcd, 0x61, 0x3b, 0x16, 0xfe, + 0x3b, 0x7a, 0xd1, 0x10, 0x70, 0xc6, 0xee, 0xf0, 0x47, 0x1e, 0x12, 0x4d, 0x0c, 0xe2, 0x08, 0xb6, + 0xe5, 0x87, 0x01, 0xf1, 0x1f, 0x24, 0xc8, 0xd6, 0xba, 0xd8, 0x10, 0x3e, 0x11, 0xe5, 0xcb, 0x56, + 0xea, 0x91, 0xed, 0xab, 0xc4, 0x3d, 0x04, 0xfd, 0x4a, 0xbb, 0x25, 0x47, 0x48, 0xf6, 0x16, 0xc8, + 0xea, 0xc6, 0xa6, 0xc9, 0x2c, 0xdb, 0xab, 0x23, 0x6c, 0x9d, 0x8a, 0xb1, 0x69, 0xaa, 0x24, 0xa3, + 0xa8, 0x73, 0x60, 0x5c, 0xd9, 0xe9, 0x8b, 0xfb, 0x6b, 0x93, 0x90, 0xa7, 0xea, 0x8c, 0x5e, 0x22, + 0x83, 0x5c, 0x6c, 0xb7, 0x23, 0x04, 0x2f, 0xed, 0x13, 0xbc, 0x49, 0x7e, 0xf3, 0x31, 0xf1, 0xdf, + 0xf9, 0x80, 0x36, 0x82, 0x7d, 0x3b, 0x6b, 0x52, 0xc5, 0x76, 0x3b, 0xda, 0x0f, 0xd9, 0x2f, 0x50, + 0xe2, 0x0b, 0x0c, 0xb7, 0x70, 0x59, 0xac, 0x85, 0x27, 0x1e, 0x08, 0x22, 0xf9, 0x4b, 0x1f, 0xa2, + 0x7f, 0x92, 0x60, 0x62, 0x55, 0xb7, 0x1d, 0x17, 0x9b, 0xa2, 0x08, 0x36, 0xd7, 0xc0, 0x94, 0x27, + 0x1a, 0xb7, 0xcb, 0x73, 0xfb, 0xf3, 0x20, 0x81, 0x9f, 0x89, 0xdf, 0xcf, 0xa3, 0xf3, 0xb4, 0xf8, + 0xda, 0x33, 0x2e, 0xa2, 0x4f, 0x9a, 0x04, 0xc5, 0x4a, 0xbd, 0xc5, 0xfe, 0xae, 0x2f, 0xf0, 0x35, + 0x4e, 0xe0, 0x77, 0x0c, 0x53, 0x64, 0xfa, 0x42, 0xff, 0x94, 0x04, 0xe0, 0x96, 0xcd, 0x8e, 0xf3, + 0x3d, 0x89, 0x3b, 0xa4, 0x1f, 0x23, 0xdd, 0x97, 0x85, 0xa5, 0xbb, 0xc6, 0x4b, 0xf7, 0x07, 0x07, + 0x57, 0x35, 0xee, 0xd8, 0x9e, 0x52, 0x00, 0x59, 0xf7, 0x45, 0xeb, 0x3e, 0xa2, 0x37, 0xf8, 0x42, + 0x5d, 0xe7, 0x84, 0x7a, 0xd7, 0x90, 0x25, 0xa5, 0x2f, 0xd7, 0xbf, 0x92, 0x60, 0xa2, 0x8e, 0x1d, + 0xb7, 0x9b, 0x44, 0xe7, 0x44, 0x7a, 0xf8, 0x50, 0xdb, 0x96, 0x04, 0xdb, 0xf6, 0x37, 0x33, 0xa2, + 0xc1, 0x7e, 0x02, 0xc9, 0x30, 0x9e, 0x22, 0x56, 0x1f, 0x1e, 0x15, 0x0a, 0xf6, 0x33, 0x88, 0x5a, + 0xfa, 0xd2, 0x7d, 0x9d, 0xe4, 0xbb, 0x5b, 0xf0, 0xa7, 0x6d, 0xc2, 0x66, 0x71, 0x66, 0xbf, 0x59, + 0x2c, 0x7e, 0xda, 0x26, 0x5c, 0xc7, 0x68, 0xef, 0x81, 0xc4, 0xc6, 0xc6, 0x08, 0x36, 0xf6, 0x87, + 0x91, 0xd7, 0x73, 0x65, 0xc8, 0xb3, 0x1d, 0x80, 0x7b, 0xe3, 0x77, 0x00, 0x06, 0x4f, 0x2d, 0xde, + 0x3e, 0x84, 0x29, 0x17, 0xb7, 0x2c, 0xef, 0xb3, 0x21, 0x85, 0xd8, 0xb8, 0x19, 0x72, 0x24, 0x1a, + 0x29, 0x1b, 0xe7, 0x02, 0x9f, 0x0c, 0x8f, 0x44, 0xd9, 0xfd, 0xaa, 0xd2, 0x4c, 0x89, 0x51, 0x18, + 0xc1, 0x4a, 0xfe, 0x30, 0x28, 0xbc, 0x55, 0x01, 0x58, 0xdf, 0xbd, 0xd0, 0xd1, 0xed, 0x6d, 0xdd, + 0xd8, 0x42, 0xff, 0x9e, 0x81, 0x19, 0xf6, 0x4a, 0x83, 0x6a, 0xc6, 0x9a, 0x7f, 0x91, 0x46, 0x41, + 0x01, 0xe4, 0x5d, 0x4b, 0x67, 0xcb, 0x00, 0xee, 0xa3, 0x72, 0xb7, 0xef, 0x9e, 0x95, 0xed, 0x09, + 0xa7, 0xe0, 0x8a, 0x21, 0xe0, 0x60, 0x3e, 0x54, 0x7a, 0xe0, 0xa6, 0x15, 0x8e, 0x9c, 0x9a, 0xe3, + 0x23, 0xa7, 0x72, 0x67, 0x2c, 0xf3, 0x3d, 0x67, 0x2c, 0x5d, 0x1c, 0x6d, 0xfd, 0xd9, 0x98, 0xf8, + 0xef, 0xc8, 0x2a, 0x79, 0x76, 0xff, 0x78, 0xc8, 0xd4, 0x0d, 0xb2, 0xa9, 0xc3, 0xdc, 0x87, 0x83, + 0x04, 0xf4, 0x9e, 0x60, 0x22, 0x63, 0x0a, 0x5a, 0xc1, 0x09, 0xc4, 0xc0, 0x95, 0x9d, 0xed, 0x2d, + 0xfb, 0xfd, 0xc2, 0x91, 0xd2, 0x42, 0x02, 0x8b, 0x9d, 0x92, 0x30, 0x0e, 0x24, 0x9f, 0x83, 0xd0, + 0xae, 0x6c, 0x5c, 0x77, 0x3a, 0x88, 0x7e, 0x32, 0xc5, 0xdc, 0x19, 0x62, 0xf1, 0x45, 0x81, 0x39, + 0xef, 0xe4, 0x69, 0x6d, 0xe1, 0xfe, 0x72, 0xa9, 0x51, 0xc0, 0xfb, 0x4f, 0xa3, 0x92, 0x73, 0xa7, + 0xf4, 0x8c, 0x69, 0xb0, 0xc0, 0x82, 0xfe, 0xa7, 0x04, 0x79, 0x66, 0x3b, 0xdc, 0x7b, 0x40, 0x08, + 0xd1, 0xcb, 0x87, 0x81, 0x24, 0x36, 0x00, 0xc0, 0x47, 0x93, 0x02, 0x30, 0x02, 0x6b, 0xe1, 0xc1, + 0xd4, 0x00, 0x40, 0xff, 0x22, 0x41, 0xd6, 0xb5, 0x69, 0xc4, 0x8e, 0x57, 0x7f, 0x44, 0xd8, 0x55, + 0x39, 0x24, 0x00, 0x97, 0x7c, 0x84, 0x7e, 0x2f, 0xc0, 0x54, 0x97, 0x66, 0xf4, 0x0f, 0xf7, 0x5f, + 0x2f, 0xd0, 0xb3, 0x60, 0x35, 0xf8, 0x0d, 0xbd, 0x4d, 0xc8, 0xdd, 0x39, 0x9e, 0x9f, 0x64, 0x70, + 0x94, 0x47, 0x71, 0x12, 0x7b, 0x13, 0x7d, 0x5b, 0x02, 0x50, 0xb1, 0x6d, 0x76, 0xf6, 0xf0, 0x86, + 0xa5, 0xa3, 0xab, 0x03, 0x00, 0x58, 0xb3, 0xcf, 0x04, 0xcd, 0xfe, 0xe3, 0x61, 0xc1, 0x2f, 0xf3, + 0x82, 0xbf, 0x2d, 0x5a, 0xf3, 0x3c, 0xe2, 0x11, 0xe2, 0xbf, 0x07, 0x26, 0x98, 0x1c, 0x99, 0x81, + 0x28, 0x26, 0x7c, 0xef, 0x27, 0xf4, 0x4e, 0x5f, 0xf4, 0xf7, 0x73, 0xa2, 0x7f, 0x7a, 0x62, 0x8e, + 0x92, 0x01, 0x50, 0x1a, 0x02, 0x80, 0xa3, 0x30, 0xed, 0x01, 0xb0, 0xa1, 0x56, 0x0a, 0x18, 0xbd, + 0x59, 0x26, 0x3e, 0x0f, 0x74, 0xa4, 0x3a, 0x78, 0x4f, 0xf3, 0x25, 0xe1, 0x99, 0x7b, 0x48, 0x1e, + 0x7e, 0xf9, 0x29, 0x01, 0xf4, 0x67, 0x42, 0x53, 0x75, 0x01, 0x86, 0x1e, 0x2f, 0xfd, 0xd5, 0xd9, + 0x32, 0xcc, 0x72, 0x26, 0x86, 0x72, 0x0a, 0x8e, 0x73, 0x09, 0x74, 0xbc, 0x6b, 0x17, 0x8e, 0x28, + 0x08, 0x4e, 0x72, 0x5f, 0xd8, 0x0b, 0x6e, 0x17, 0x32, 0xe8, 0xeb, 0x9f, 0xce, 0xf8, 0x8b, 0x37, + 0x6f, 0xcf, 0xb2, 0x65, 0xb3, 0x0f, 0xf2, 0xf1, 0xe4, 0x5a, 0xa6, 0xe1, 0xe0, 0x87, 0x43, 0x3e, + 0x27, 0x7e, 0x42, 0xac, 0xd5, 0x70, 0x0a, 0x26, 0x1c, 0x2b, 0xec, 0x87, 0xe2, 0xbd, 0x86, 0x15, + 0x2b, 0xc7, 0x2b, 0x56, 0x15, 0xce, 0xea, 0x46, 0xab, 0xb3, 0xdb, 0xc6, 0x2a, 0xee, 0x68, 0xae, + 0x0c, 0xed, 0xa2, 0xbd, 0x88, 0xbb, 0xd8, 0x68, 0x63, 0xc3, 0xa1, 0x7c, 0x7a, 0xe7, 0xd9, 0x04, + 0x72, 0xf2, 0xca, 0x78, 0x37, 0xaf, 0x8c, 0x4f, 0xea, 0xb7, 0x1e, 0x1b, 0xb3, 0x78, 0x77, 0x07, + 0x00, 0xad, 0xdb, 0x39, 0x1d, 0x5f, 0x62, 0x6a, 0x78, 0x55, 0xcf, 0x12, 0x5e, 0xcd, 0xcf, 0xa0, + 0x86, 0x32, 0xa3, 0xc7, 0x7c, 0xf5, 0xbb, 0x8f, 0x53, 0xbf, 0x9b, 0x05, 0x59, 0x48, 0xa6, 0x75, + 0xdd, 0x21, 0xb4, 0x6e, 0x16, 0xa6, 0x82, 0xad, 0x61, 0x59, 0xb9, 0x0a, 0x4e, 0x78, 0x3e, 0xbd, + 0xd5, 0x72, 0x79, 0xb1, 0xde, 0xdc, 0x58, 0x5f, 0x56, 0x8b, 0x8b, 0xe5, 0x02, 0xb8, 0xfa, 0x49, + 0xf5, 0xd2, 0x77, 0xc5, 0xcd, 0xa2, 0x4f, 0x4b, 0x90, 0x23, 0x87, 0x31, 0xd1, 0x8f, 0x8e, 0x48, + 0x73, 0x6c, 0xce, 0x83, 0xc9, 0x1f, 0x77, 0xc5, 0xe3, 0xbc, 0x33, 0x61, 0x12, 0xae, 0x0e, 0x14, + 0xe7, 0x3d, 0x86, 0x50, 0xfa, 0xd3, 0x1a, 0xb7, 0x49, 0xd6, 0xb7, 0xcd, 0x4b, 0xdf, 0xcb, 0x4d, + 0xd2, 0xad, 0xff, 0x21, 0x37, 0xc9, 0x3e, 0x2c, 0x8c, 0xbd, 0x49, 0xf6, 0x69, 0x77, 0x31, 0xcd, + 0x14, 0x3d, 0x27, 0xe7, 0xcf, 0xff, 0x9e, 0x27, 0x1d, 0x68, 0x23, 0xab, 0x08, 0xb3, 0xba, 0xe1, + 0x60, 0xcb, 0xd0, 0x3a, 0x4b, 0x1d, 0x6d, 0xcb, 0xb3, 0x4f, 0x7b, 0x77, 0x2f, 0x2a, 0xa1, 0x3c, + 0x2a, 0xff, 0x87, 0x72, 0x1a, 0xc0, 0xc1, 0x3b, 0xdd, 0x8e, 0xe6, 0x04, 0xaa, 0x17, 0x4a, 0x09, + 0x6b, 0x5f, 0x96, 0xd7, 0xbe, 0x5b, 0xe1, 0x0a, 0x0a, 0x5a, 0xe3, 0x72, 0x17, 0x6f, 0x18, 0xfa, + 0x8f, 0xed, 0x92, 0xf0, 0xa3, 0x54, 0x47, 0xfb, 0x7d, 0xe2, 0xb6, 0x73, 0xf2, 0x3d, 0xdb, 0x39, + 0xff, 0x20, 0x1c, 0xd6, 0xc4, 0x6b, 0xf5, 0x03, 0xc2, 0x9a, 0xf8, 0x2d, 0x4d, 0xee, 0x69, 0x69, + 0xfe, 0x22, 0x4b, 0x56, 0x60, 0x91, 0x25, 0x8c, 0x4a, 0x4e, 0x70, 0x81, 0xf2, 0x95, 0x42, 0x71, + 0x53, 0xe2, 0xaa, 0x31, 0x86, 0x05, 0x70, 0x19, 0xe6, 0x68, 0xd1, 0x0b, 0xa6, 0x79, 0x71, 0x47, + 0xb3, 0x2e, 0x22, 0xeb, 0x40, 0xaa, 0x18, 0xbb, 0x97, 0x14, 0xb9, 0x41, 0xfa, 0x31, 0xe1, 0x39, + 0x03, 0x27, 0x2e, 0x8f, 0xe7, 0xf1, 0x6c, 0x26, 0xbd, 0x46, 0x68, 0x0a, 0x21, 0xc2, 0x60, 0xfa, + 0xb8, 0xfe, 0x89, 0x8f, 0xab, 0xd7, 0xd1, 0x87, 0xd7, 0xe1, 0x47, 0x89, 0x2b, 0xfa, 0xfc, 0x70, + 0xd8, 0x79, 0x7c, 0x0d, 0x81, 0x5d, 0x01, 0xe4, 0x8b, 0xbe, 0xeb, 0x8f, 0xfb, 0x18, 0xae, 0x50, + 0x36, 0x3d, 0x34, 0x23, 0x58, 0x1e, 0x0b, 0x9a, 0xc7, 0x79, 0x16, 0x6a, 0xdd, 0x54, 0x31, 0xfd, + 0x9c, 0xf0, 0xfe, 0x56, 0x5f, 0x01, 0x51, 0xee, 0xc6, 0xd3, 0x2a, 0xc5, 0x36, 0xc7, 0xc4, 0xd9, + 0x4c, 0x1f, 0xcd, 0x17, 0xe6, 0x60, 0xca, 0x0b, 0x3c, 0x43, 0xee, 0x45, 0xf2, 0x31, 0x3c, 0x09, + 0x79, 0xdb, 0xdc, 0xb5, 0x5a, 0x98, 0xed, 0x38, 0xb2, 0xb7, 0x21, 0x76, 0xc7, 0x06, 0x8e, 0xe7, + 0xfb, 0x4c, 0x86, 0x6c, 0x62, 0x93, 0x21, 0xda, 0x20, 0x8d, 0x1b, 0xe0, 0x5f, 0x24, 0x1c, 0xcc, + 0x9e, 0xc3, 0xac, 0x8e, 0x9d, 0xc7, 0xe3, 0x18, 0xff, 0x47, 0x42, 0x7b, 0x2f, 0x03, 0x6a, 0x92, + 0x4c, 0xe5, 0x6a, 0x43, 0x18, 0xaa, 0x57, 0xc3, 0x95, 0x5e, 0x0e, 0x66, 0xa1, 0x12, 0x8b, 0x74, + 0x43, 0x5d, 0x2d, 0xc8, 0xe8, 0xb9, 0x59, 0x28, 0x50, 0xd6, 0x6a, 0xbe, 0xb1, 0x86, 0x5e, 0x9a, + 0x39, 0x6c, 0x8b, 0x34, 0x7a, 0x8a, 0xf9, 0x09, 0x49, 0x34, 0x60, 0x2e, 0x27, 0xf8, 0xa0, 0x76, + 0x11, 0x9a, 0x34, 0x44, 0x33, 0x8b, 0x51, 0x3e, 0xf4, 0x3b, 0x19, 0x91, 0xf8, 0xbb, 0x62, 0x2c, + 0x8e, 0x21, 0x58, 0x52, 0xd6, 0x8b, 0x1f, 0xb6, 0x64, 0x99, 0x3b, 0x1b, 0x56, 0x07, 0xfd, 0x9f, + 0x42, 0xe1, 0xcd, 0x23, 0xcc, 0x7f, 0x29, 0xda, 0xfc, 0x27, 0x4b, 0xc6, 0x9d, 0x60, 0xaf, 0xaa, + 0x33, 0xc4, 0xf0, 0xad, 0xdc, 0x00, 0x73, 0x5a, 0xbb, 0xbd, 0xae, 0x6d, 0xe1, 0x92, 0x3b, 0xaf, + 0x36, 0x1c, 0x16, 0x5b, 0xa8, 0x27, 0x35, 0xb6, 0x2b, 0x12, 0x5f, 0x07, 0xe5, 0x40, 0x62, 0xf2, + 0x19, 0xcb, 0xf0, 0xe6, 0x0e, 0x09, 0xad, 0x6d, 0x2d, 0x88, 0x74, 0xc6, 0xde, 0x04, 0x3d, 0x9b, + 0x04, 0xf8, 0x4e, 0x5f, 0xb3, 0xfe, 0x40, 0x82, 0x09, 0x57, 0xde, 0xc5, 0x76, 0x1b, 0x3d, 0x91, + 0x0b, 0x08, 0x18, 0xe9, 0x5b, 0xf6, 0xd3, 0xc2, 0x4e, 0x7d, 0x5e, 0x0d, 0x29, 0xfd, 0x08, 0x4c, + 0x02, 0x21, 0x4a, 0x9c, 0x10, 0xc5, 0x7c, 0xf7, 0x62, 0x8b, 0x48, 0x5f, 0x7c, 0x1f, 0x91, 0x60, + 0xd6, 0x9b, 0x47, 0x2c, 0x61, 0xa7, 0xb5, 0x8d, 0xee, 0x10, 0x5d, 0x68, 0x62, 0x2d, 0xcd, 0xdf, + 0x93, 0xed, 0xa0, 0xef, 0x64, 0x12, 0xaa, 0x3c, 0x57, 0x72, 0xc4, 0x2a, 0x5d, 0x22, 0x5d, 0x8c, + 0x23, 0x98, 0xbe, 0x30, 0x1f, 0x93, 0x00, 0x1a, 0xa6, 0x3f, 0xd7, 0x3d, 0x80, 0x24, 0x7f, 0x41, + 0x78, 0xbb, 0x96, 0x55, 0x3c, 0x28, 0x36, 0x79, 0xcf, 0x21, 0xe8, 0x9a, 0x34, 0xa8, 0xa4, 0xb1, + 0xb4, 0xf5, 0xa9, 0xc5, 0xdd, 0x6e, 0x47, 0x6f, 0x69, 0x4e, 0xaf, 0x3f, 0x5d, 0xb4, 0x78, 0xc9, + 0xa5, 0xa1, 0x89, 0x8c, 0x42, 0xbf, 0x8c, 0x08, 0x59, 0xd2, 0xd0, 0x33, 0x92, 0x17, 0x7a, 0x46, + 0xd0, 0x47, 0x66, 0x00, 0xf1, 0x31, 0xa8, 0xa7, 0x0c, 0x47, 0x6b, 0x5d, 0x6c, 0x2c, 0x58, 0x58, + 0x6b, 0xb7, 0xac, 0xdd, 0x9d, 0x0b, 0x76, 0xd8, 0x19, 0x34, 0x5e, 0x47, 0x43, 0x4b, 0xc7, 0x12, + 0xb7, 0x74, 0x8c, 0x7e, 0x4a, 0x16, 0x0d, 0x84, 0x14, 0xda, 0xe0, 0x08, 0xf1, 0x30, 0xc4, 0x50, + 0x97, 0xc8, 0x85, 0xa9, 0x67, 0x95, 0x38, 0x9b, 0x64, 0x95, 0xf8, 0xb5, 0x42, 0x61, 0x95, 0x84, + 0xea, 0x35, 0x16, 0x4f, 0xb4, 0xb9, 0x3a, 0x76, 0x22, 0xe0, 0xbd, 0x1e, 0x66, 0x2f, 0x04, 0x5f, + 0x7c, 0x88, 0xf9, 0xc4, 0x3e, 0xfe, 0xa1, 0xaf, 0x4b, 0xba, 0x02, 0xc3, 0xb3, 0x10, 0x81, 0xae, + 0x8f, 0xa0, 0x24, 0xe2, 0x84, 0x96, 0x68, 0x39, 0x25, 0xb6, 0xfc, 0xf4, 0x51, 0x78, 0xbf, 0x04, + 0xd3, 0xe4, 0x2a, 0xd4, 0x85, 0xcb, 0xe4, 0x58, 0xa4, 0xa0, 0x51, 0xf2, 0xc2, 0xb0, 0x98, 0x15, + 0xc8, 0x76, 0x74, 0xe3, 0xa2, 0xe7, 0x3d, 0xe8, 0x3e, 0x07, 0x17, 0xeb, 0x49, 0x7d, 0x2e, 0xd6, + 0xf3, 0xf7, 0x29, 0xfc, 0x72, 0x0f, 0x74, 0xd3, 0xf3, 0x40, 0x72, 0xe9, 0x8b, 0xf1, 0xef, 0xb2, + 0x90, 0xaf, 0x63, 0xcd, 0x6a, 0x6d, 0xa3, 0xb7, 0x4b, 0x7d, 0xa7, 0x0a, 0x93, 0xfc, 0x54, 0x61, + 0x09, 0x26, 0x36, 0xf5, 0x8e, 0x83, 0x2d, 0xea, 0x51, 0x1d, 0xee, 0xda, 0x69, 0x13, 0x5f, 0xe8, + 0x98, 0xad, 0x8b, 0xf3, 0xcc, 0x74, 0x9f, 0xf7, 0x02, 0xb1, 0xce, 0x2f, 0x91, 0x9f, 0x54, 0xef, + 0x67, 0xd7, 0x20, 0xb4, 0x4d, 0xcb, 0x89, 0xba, 0x63, 0x23, 0x82, 0x4a, 0xdd, 0xb4, 0x1c, 0x95, + 0xfe, 0xe8, 0xc2, 0xbc, 0xb9, 0xdb, 0xe9, 0x34, 0xf0, 0xc3, 0x8e, 0x37, 0x6d, 0xf3, 0xde, 0x5d, + 0x63, 0xd1, 0xdc, 0xdc, 0xb4, 0x31, 0x5d, 0x34, 0xc8, 0xa9, 0xec, 0x4d, 0x39, 0x0e, 0xb9, 0x8e, + 0xbe, 0xa3, 0xd3, 0x89, 0x46, 0x4e, 0xa5, 0x2f, 0xca, 0x4d, 0x50, 0x08, 0xe6, 0x38, 0x94, 0xd1, + 0x53, 0x79, 0xd2, 0x34, 0xf7, 0xa5, 0xbb, 0x3a, 0x73, 0x11, 0x5f, 0xb6, 0x4f, 0x4d, 0x90, 0xef, + 0xe4, 0x99, 0x3f, 0xbe, 0x22, 0xb2, 0xdf, 0x41, 0x25, 0x1e, 0x3d, 0x83, 0xb5, 0x70, 0xcb, 0xb4, + 0xda, 0x9e, 0x6c, 0xa2, 0x27, 0x18, 0x2c, 0x5f, 0xb2, 0x5d, 0x8a, 0xbe, 0x85, 0xa7, 0xaf, 0x69, + 0x6f, 0xc9, 0xbb, 0xdd, 0xa6, 0x5b, 0xf4, 0x79, 0xdd, 0xd9, 0x5e, 0xc3, 0x8e, 0x86, 0xfe, 0x4e, + 0xee, 0xab, 0x71, 0xd3, 0xff, 0x9f, 0xc6, 0x0d, 0xd0, 0x38, 0x1a, 0x06, 0xcb, 0xd9, 0xb5, 0x0c, + 0x57, 0x8e, 0xcc, 0x2b, 0x35, 0x94, 0xa2, 0xdc, 0x05, 0x57, 0x05, 0x6f, 0xde, 0x52, 0xe9, 0x22, + 0x9b, 0xb6, 0x4e, 0x91, 0xec, 0xd1, 0x19, 0x94, 0x75, 0xb8, 0x8e, 0x7e, 0x5c, 0x69, 0xac, 0xad, + 0xae, 0xe8, 0x5b, 0xdb, 0x1d, 0x7d, 0x6b, 0xdb, 0xb1, 0x2b, 0x86, 0xed, 0x60, 0xad, 0x5d, 0xdb, + 0x54, 0xe9, 0xed, 0x38, 0x40, 0xe8, 0x88, 0x64, 0xe5, 0x3d, 0xae, 0xc5, 0x46, 0xb7, 0xb0, 0xa6, + 0x44, 0xb4, 0x94, 0xa7, 0xbb, 0x2d, 0xc5, 0xde, 0xed, 0xf8, 0x98, 0x5e, 0xd3, 0x83, 0x69, 0xa0, + 0xea, 0xbb, 0x1d, 0xd2, 0x5c, 0x48, 0xe6, 0xa4, 0xe3, 0x5c, 0x0c, 0x27, 0xe9, 0x37, 0x9b, 0xff, + 0x27, 0x0f, 0xb9, 0x65, 0x4b, 0xeb, 0x6e, 0xa3, 0xe7, 0x86, 0xfa, 0xe7, 0x51, 0xb5, 0x09, 0x5f, + 0x3b, 0xa5, 0x41, 0xda, 0x29, 0x0f, 0xd0, 0xce, 0x6c, 0x48, 0x3b, 0xa3, 0x17, 0x95, 0xcf, 0xc2, + 0x4c, 0xcb, 0xec, 0x74, 0x70, 0xcb, 0x95, 0x47, 0xa5, 0x4d, 0x56, 0x73, 0xa6, 0x54, 0x2e, 0x8d, + 0x04, 0xab, 0xc6, 0x4e, 0x9d, 0xae, 0xa1, 0x53, 0xa5, 0x0f, 0x12, 0xd0, 0x4b, 0x25, 0xc8, 0x96, + 0xdb, 0x5b, 0x98, 0x5b, 0x67, 0xcf, 0x84, 0xd6, 0xd9, 0x4f, 0x42, 0xde, 0xd1, 0xac, 0x2d, 0xec, + 0x78, 0xeb, 0x04, 0xf4, 0xcd, 0x8f, 0xa1, 0x2d, 0x87, 0x62, 0x68, 0xff, 0x20, 0x64, 0x5d, 0x99, + 0x31, 0x27, 0xf3, 0xeb, 0xfa, 0xc1, 0x4f, 0x64, 0x3f, 0xef, 0x96, 0x38, 0xef, 0xd6, 0x5a, 0x25, + 0x3f, 0xf4, 0x62, 0x9d, 0xdb, 0x87, 0x35, 0xb9, 0xe8, 0xb3, 0x65, 0x1a, 0x95, 0x1d, 0x6d, 0x0b, + 0xb3, 0x6a, 0x06, 0x09, 0xde, 0xd7, 0xf2, 0x8e, 0xf9, 0x90, 0xce, 0xa2, 0x45, 0x06, 0x09, 0x6e, + 0x15, 0xb6, 0xf5, 0x76, 0x1b, 0x1b, 0xac, 0x65, 0xb3, 0xb7, 0xb3, 0xa7, 0x21, 0xeb, 0xf2, 0xe0, + 0xea, 0x8f, 0x6b, 0x2c, 0x14, 0x8e, 0x28, 0x33, 0x6e, 0xb3, 0xa2, 0x8d, 0xb7, 0x90, 0xe1, 0xd7, + 0x54, 0x45, 0xdc, 0x76, 0x68, 0xe5, 0xfa, 0x37, 0xae, 0xa7, 0x40, 0xce, 0x30, 0xdb, 0x78, 0xe0, + 0x20, 0x44, 0x73, 0x29, 0x4f, 0x83, 0x1c, 0x6e, 0xbb, 0xbd, 0x82, 0x4c, 0xb2, 0x9f, 0x8e, 0x97, + 0xa5, 0x4a, 0x33, 0x27, 0xf3, 0x0d, 0xea, 0xc7, 0x6d, 0xfa, 0x0d, 0xf0, 0x67, 0x27, 0xe0, 0x28, + 0xed, 0x03, 0xea, 0xbb, 0x17, 0x5c, 0x52, 0x17, 0x30, 0x7a, 0xb4, 0xff, 0xc0, 0x75, 0x94, 0x57, + 0xf6, 0xe3, 0x90, 0xb3, 0x77, 0x2f, 0xf8, 0x46, 0x28, 0x7d, 0x09, 0x37, 0x5d, 0x69, 0x24, 0xc3, + 0x99, 0x3c, 0xec, 0x70, 0xc6, 0x0d, 0x4d, 0xb2, 0xd7, 0xf8, 0x83, 0x81, 0x8c, 0x1e, 0x8f, 0xf0, + 0x06, 0xb2, 0x7e, 0xc3, 0xd0, 0x29, 0x98, 0xd0, 0x36, 0x1d, 0x6c, 0x05, 0x66, 0x22, 0x7b, 0x75, + 0x87, 0xca, 0x0b, 0x78, 0xd3, 0xb4, 0x5c, 0xb1, 0xd0, 0x10, 0xea, 0xfe, 0x7b, 0xa8, 0xe5, 0x02, + 0xb7, 0x43, 0x76, 0x33, 0x1c, 0x33, 0xcc, 0x45, 0xdc, 0x65, 0x72, 0xa6, 0x28, 0xce, 0x92, 0x16, + 0xb0, 0xff, 0xc3, 0xbe, 0xae, 0x64, 0x6e, 0x7f, 0x57, 0x82, 0x3e, 0x9e, 0x74, 0xce, 0xdc, 0x03, + 0xf4, 0xc8, 0x2c, 0x34, 0xe5, 0x99, 0x30, 0xd3, 0x66, 0x2e, 0x5a, 0x2d, 0xdd, 0x6f, 0x25, 0x91, + 0xff, 0x71, 0x99, 0x03, 0x45, 0xca, 0x86, 0x15, 0x69, 0x19, 0x26, 0xc9, 0x41, 0x66, 0x57, 0x93, + 0x72, 0x3d, 0x2e, 0xf1, 0x64, 0x5a, 0xe7, 0x57, 0x2a, 0x24, 0xb6, 0xf9, 0x12, 0xfb, 0x45, 0xf5, + 0x7f, 0x4e, 0x36, 0xfb, 0x8e, 0x97, 0x50, 0xfa, 0xcd, 0xf1, 0x77, 0xf3, 0x70, 0x55, 0xc9, 0x32, + 0x6d, 0x9b, 0x9c, 0x81, 0xe9, 0x6d, 0x98, 0xbf, 0x2d, 0x71, 0xb7, 0x69, 0x3c, 0xae, 0x9b, 0x5f, + 0xbf, 0x06, 0x35, 0xbe, 0xa6, 0xf1, 0x25, 0xe1, 0x10, 0x30, 0xfe, 0xfe, 0x43, 0x84, 0xd0, 0xbf, + 0x37, 0x1a, 0xc9, 0x5b, 0x32, 0x22, 0x51, 0x69, 0x12, 0xca, 0x2a, 0xfd, 0xe6, 0xf2, 0x39, 0x09, + 0xae, 0xee, 0xe5, 0x66, 0xc3, 0xb0, 0xfd, 0x06, 0x73, 0xed, 0x80, 0xf6, 0xc2, 0x47, 0x31, 0x89, + 0xbd, 0xc7, 0x32, 0xa2, 0xee, 0xa1, 0xd2, 0x22, 0x16, 0x4b, 0x82, 0x13, 0x35, 0x71, 0xf7, 0x58, + 0x26, 0x26, 0x9f, 0xbe, 0x70, 0x3f, 0x91, 0x85, 0xa3, 0xcb, 0x96, 0xb9, 0xdb, 0xb5, 0x83, 0x1e, + 0xe8, 0x6f, 0xfa, 0x6f, 0xb8, 0xe6, 0x45, 0x4c, 0x83, 0x33, 0x30, 0x6d, 0x31, 0x6b, 0x2e, 0xd8, + 0x7e, 0x0d, 0x27, 0x85, 0x7b, 0x2f, 0xf9, 0x20, 0xbd, 0x57, 0xd0, 0xcf, 0x64, 0xb9, 0x7e, 0xa6, + 0xb7, 0xe7, 0xc8, 0xf5, 0xe9, 0x39, 0xfe, 0x5a, 0x4a, 0x38, 0xa8, 0xf6, 0x88, 0x28, 0xa2, 0xbf, + 0x28, 0x41, 0x7e, 0x8b, 0x64, 0x64, 0xdd, 0xc5, 0x93, 0xc5, 0x6a, 0x46, 0x88, 0xab, 0xec, 0xd7, + 0x40, 0xae, 0x72, 0x58, 0x87, 0x13, 0x0d, 0x70, 0xf1, 0xdc, 0xa6, 0xaf, 0x54, 0xaf, 0xca, 0xc2, + 0x8c, 0x5f, 0x7a, 0xa5, 0x6d, 0xa3, 0x17, 0xf6, 0xd7, 0xa8, 0x59, 0x11, 0x8d, 0xda, 0xb7, 0xce, + 0xec, 0x8f, 0x3a, 0x72, 0x68, 0xd4, 0xe9, 0x3b, 0xba, 0xcc, 0x44, 0x8c, 0x2e, 0xe8, 0x39, 0xb2, + 0xe8, 0x7d, 0x54, 0x7c, 0xd7, 0x4a, 0x6a, 0xf3, 0x78, 0x1e, 0x2c, 0x04, 0x6f, 0xc5, 0x1a, 0x5c, + 0xab, 0xf4, 0x95, 0xe4, 0x5d, 0x12, 0x1c, 0xdb, 0xdf, 0x99, 0x7f, 0x1f, 0xef, 0x85, 0xe6, 0xd6, + 0xc9, 0xf6, 0xbd, 0xd0, 0xc8, 0x1b, 0xbf, 0x49, 0x17, 0x1b, 0x52, 0x84, 0xb3, 0xf7, 0x06, 0x77, + 0xe2, 0x62, 0x41, 0x43, 0x04, 0x89, 0xa6, 0x2f, 0xc0, 0x5f, 0x94, 0x61, 0xaa, 0x8e, 0x9d, 0x55, + 0xed, 0xb2, 0xb9, 0xeb, 0x20, 0x4d, 0x74, 0x7b, 0xee, 0x19, 0x90, 0xef, 0x90, 0x5f, 0xd8, 0x35, + 0xff, 0x67, 0xfa, 0xee, 0x6f, 0x11, 0xdf, 0x1f, 0x4a, 0x5a, 0x65, 0xf9, 0xf9, 0x58, 0x2e, 0x22, + 0xbb, 0xa3, 0x3e, 0x77, 0x23, 0xd9, 0xda, 0x49, 0xb4, 0x77, 0x1a, 0x55, 0x74, 0xfa, 0xb0, 0xfc, + 0x94, 0x0c, 0xb3, 0x75, 0xec, 0x54, 0xec, 0x25, 0x6d, 0xcf, 0xb4, 0x74, 0x07, 0x87, 0xef, 0xf9, + 0x8c, 0x87, 0xe6, 0x34, 0x80, 0xee, 0xff, 0xc6, 0x22, 0x4c, 0x85, 0x52, 0xd0, 0xef, 0x24, 0x75, + 0x14, 0xe2, 0xf8, 0x18, 0x09, 0x08, 0x89, 0x7c, 0x2c, 0xe2, 0x8a, 0x4f, 0x1f, 0x88, 0xcf, 0x4a, + 0x0c, 0x88, 0xa2, 0xd5, 0xda, 0xd6, 0xf7, 0x70, 0x3b, 0x21, 0x10, 0xde, 0x6f, 0x01, 0x10, 0x3e, + 0xa1, 0xc4, 0xee, 0x2b, 0x1c, 0x1f, 0xa3, 0x70, 0x5f, 0x89, 0x23, 0x38, 0x96, 0x20, 0x51, 0x6e, + 0xd7, 0xc3, 0xd6, 0x33, 0xef, 0x15, 0x15, 0x6b, 0x60, 0xb2, 0x49, 0x61, 0x93, 0x6d, 0xa8, 0x8e, + 0x85, 0x96, 0x3d, 0x48, 0xa7, 0xb3, 0x69, 0x74, 0x2c, 0x7d, 0x8b, 0x4e, 0x5f, 0xe8, 0x6f, 0x93, + 0xe1, 0x84, 0x1f, 0x3d, 0xa5, 0x8e, 0x9d, 0x45, 0xcd, 0xde, 0xbe, 0x60, 0x6a, 0x56, 0x1b, 0x95, + 0x46, 0x70, 0xe2, 0x0f, 0x7d, 0x26, 0x0c, 0x42, 0x95, 0x07, 0xa1, 0xaf, 0xab, 0x68, 0x5f, 0x5e, + 0x46, 0xd1, 0xc9, 0xc4, 0x7a, 0xb3, 0xfe, 0x9e, 0x0f, 0xd6, 0x0f, 0x71, 0x60, 0xdd, 0x3d, 0x2c, + 0x8b, 0xe9, 0x03, 0xf7, 0x2b, 0x74, 0x44, 0x08, 0x79, 0x35, 0x3f, 0x28, 0x0a, 0x58, 0x84, 0x57, + 0xab, 0x1c, 0xe9, 0xd5, 0x3a, 0xd4, 0x18, 0x31, 0xd0, 0x23, 0x39, 0xdd, 0x31, 0xe2, 0x10, 0xbd, + 0x8d, 0xdf, 0x24, 0x43, 0x81, 0x84, 0xcf, 0x0a, 0x79, 0x7c, 0x87, 0xa3, 0x51, 0xc7, 0xa3, 0xb3, + 0xcf, 0xbb, 0x7c, 0x22, 0xa9, 0x77, 0x39, 0x7a, 0x63, 0x52, 0x1f, 0xf2, 0x5e, 0x6e, 0x47, 0x82, + 0x58, 0x22, 0x17, 0xf1, 0x01, 0x1c, 0xa4, 0x0f, 0xda, 0x7f, 0x93, 0x01, 0xdc, 0x06, 0xcd, 0xce, + 0x3e, 0x3c, 0x4b, 0x14, 0xae, 0x5b, 0xc2, 0x7e, 0xf5, 0x2e, 0x50, 0x27, 0x7a, 0x80, 0xa2, 0x14, + 0x83, 0x53, 0x15, 0x8f, 0x26, 0xf5, 0xad, 0x0c, 0xb8, 0x1a, 0x09, 0x2c, 0x89, 0xbc, 0x2d, 0x23, + 0xcb, 0x4e, 0x1f, 0x90, 0xff, 0x21, 0x41, 0xae, 0x61, 0xd6, 0xb1, 0x73, 0x70, 0x53, 0x20, 0xf1, + 0xb1, 0x7d, 0x52, 0xee, 0x28, 0x8e, 0xed, 0xf7, 0x23, 0x34, 0x86, 0x68, 0x64, 0x12, 0xcc, 0x34, + 0xcc, 0x92, 0xbf, 0x38, 0x25, 0xee, 0xab, 0x2a, 0x7e, 0xa7, 0xb6, 0x5f, 0xc1, 0xa0, 0x98, 0x03, + 0xdd, 0xa9, 0x3d, 0x98, 0x5e, 0xfa, 0x72, 0xbb, 0x03, 0x8e, 0x6e, 0x18, 0x6d, 0x53, 0xc5, 0x6d, + 0x93, 0xad, 0x74, 0x2b, 0x0a, 0x64, 0x77, 0x8d, 0xb6, 0x49, 0x58, 0xce, 0xa9, 0xe4, 0xd9, 0x4d, + 0xb3, 0x70, 0xdb, 0x64, 0xbe, 0x01, 0xe4, 0x19, 0x7d, 0x49, 0x86, 0xac, 0xfb, 0xaf, 0xb8, 0xa8, + 0xdf, 0x24, 0x27, 0x0c, 0x44, 0xe0, 0x92, 0x1f, 0x89, 0x25, 0x74, 0x6f, 0x68, 0xed, 0x9f, 0x7a, + 0xb0, 0x5e, 0x17, 0x55, 0x5e, 0x48, 0x14, 0xc1, 0x9a, 0xbf, 0x72, 0x0a, 0x26, 0x2e, 0x74, 0xcc, + 0xd6, 0xc5, 0xe0, 0xbc, 0x3c, 0x7b, 0x55, 0x6e, 0x82, 0x9c, 0xa5, 0x19, 0x5b, 0x98, 0xed, 0x29, + 0x1c, 0xef, 0xe9, 0x0b, 0x89, 0xd7, 0x8b, 0x4a, 0xb3, 0xa0, 0x37, 0x26, 0x09, 0x81, 0xd0, 0xa7, + 0xf2, 0xc9, 0xf4, 0x61, 0x71, 0x88, 0x93, 0x65, 0x05, 0x98, 0x29, 0x15, 0xe9, 0xed, 0xf5, 0x6b, + 0xb5, 0x73, 0xe5, 0x82, 0x4c, 0x60, 0x76, 0x65, 0x92, 0x22, 0xcc, 0x2e, 0xf9, 0xef, 0x59, 0x98, + 0xfb, 0x54, 0xfe, 0x30, 0x60, 0xfe, 0x88, 0x04, 0xb3, 0xab, 0xba, 0xed, 0x44, 0x79, 0xfb, 0xc7, + 0x44, 0xcf, 0x7d, 0x51, 0x52, 0x53, 0x99, 0x2b, 0x47, 0x38, 0x6c, 0x6e, 0x22, 0x73, 0x38, 0xae, + 0x88, 0xf1, 0x1c, 0x4b, 0x21, 0x1c, 0xd0, 0x3b, 0xa4, 0x85, 0x25, 0x99, 0xd8, 0x50, 0x0a, 0x0a, + 0x19, 0xbf, 0xa1, 0x14, 0x59, 0x76, 0xfa, 0xf2, 0xfd, 0x92, 0x04, 0xc7, 0xdc, 0xe2, 0xe3, 0x96, + 0xa5, 0xa2, 0xc5, 0x3c, 0x70, 0x59, 0x2a, 0xf1, 0xca, 0xf8, 0x3e, 0x5e, 0x46, 0xb1, 0x32, 0x3e, + 0x88, 0xe8, 0x98, 0xc5, 0x1c, 0xb1, 0x0c, 0x3b, 0x48, 0xcc, 0x31, 0xcb, 0xb0, 0xc3, 0x8b, 0x39, + 0x7e, 0x29, 0x76, 0x48, 0x31, 0x1f, 0xda, 0x02, 0xeb, 0x6f, 0xca, 0xbe, 0x98, 0x23, 0xd7, 0x36, + 0x62, 0xc4, 0x9c, 0xf8, 0xc4, 0x2e, 0x7a, 0xf3, 0x90, 0x82, 0x1f, 0xf1, 0xfa, 0xc6, 0x30, 0x30, + 0x1d, 0xe2, 0x1a, 0xc7, 0xaf, 0xca, 0x30, 0xc7, 0xb8, 0xe8, 0x3f, 0x65, 0x8e, 0xc1, 0x28, 0xf1, + 0x94, 0x39, 0xf1, 0x19, 0x20, 0x9e, 0xb3, 0xf1, 0x9f, 0x01, 0x8a, 0x2d, 0x3f, 0x7d, 0x70, 0xbe, + 0x92, 0x85, 0x93, 0x2e, 0x0b, 0x6b, 0x66, 0x5b, 0xdf, 0xbc, 0x4c, 0xb9, 0x38, 0xa7, 0x75, 0x76, + 0xb1, 0x8d, 0xde, 0x21, 0x89, 0xa2, 0xf4, 0x9f, 0x00, 0xcc, 0x2e, 0xb6, 0x68, 0x20, 0x35, 0x06, + 0xd4, 0x5d, 0x51, 0x95, 0xdd, 0x5f, 0x92, 0x7f, 0x99, 0x4c, 0xcd, 0x23, 0xa2, 0x86, 0xe8, 0xb9, + 0x56, 0xe1, 0x94, 0xff, 0xa5, 0xd7, 0xc1, 0x23, 0xb3, 0xdf, 0xc1, 0xe3, 0x46, 0x90, 0xb5, 0x76, + 0xdb, 0x87, 0xaa, 0x77, 0x33, 0x9b, 0x94, 0xa9, 0xba, 0x59, 0xdc, 0x9c, 0x36, 0x0e, 0x8e, 0xe6, + 0x45, 0xe4, 0xb4, 0xb1, 0xa3, 0xcc, 0x43, 0x9e, 0xde, 0x90, 0xed, 0xaf, 0xe8, 0xf7, 0xcf, 0xcc, + 0x72, 0xf1, 0xa6, 0x5d, 0x8d, 0x57, 0xc3, 0x3b, 0x12, 0x49, 0xa6, 0x5f, 0x3f, 0x1d, 0xd8, 0xc9, + 0x2a, 0xa7, 0x60, 0xf7, 0x0c, 0x4d, 0x79, 0x3c, 0xbb, 0x61, 0xc5, 0x6e, 0xb7, 0x73, 0xb9, 0xc1, + 0x82, 0xaf, 0x24, 0xda, 0x0d, 0x0b, 0xc5, 0x70, 0x91, 0x7a, 0x63, 0xb8, 0x24, 0xdf, 0x0d, 0xe3, + 0xf8, 0x18, 0xc5, 0x6e, 0x58, 0x1c, 0xc1, 0xf4, 0x45, 0xfb, 0xe1, 0x49, 0x6a, 0x35, 0xb3, 0xd8, + 0xfe, 0x1f, 0xef, 0xef, 0x59, 0x0d, 0xbc, 0xb3, 0x4b, 0xbf, 0xb0, 0xff, 0xb1, 0x77, 0x9a, 0x28, + 0x4f, 0x83, 0xfc, 0xa6, 0x69, 0xed, 0x68, 0xde, 0xc6, 0x7d, 0xef, 0x49, 0x11, 0x16, 0x4f, 0x7f, + 0x89, 0xe4, 0x51, 0x59, 0x5e, 0x77, 0x3e, 0xf2, 0x6c, 0xbd, 0xcb, 0xa2, 0x2e, 0xba, 0x8f, 0xca, + 0xf5, 0x30, 0xcb, 0x82, 0x2f, 0x56, 0xb1, 0xed, 0xe0, 0x36, 0x8b, 0x58, 0xc1, 0x27, 0x2a, 0x67, + 0x61, 0x86, 0x25, 0x2c, 0xe9, 0x1d, 0x6c, 0xb3, 0xa0, 0x15, 0x5c, 0x9a, 0x72, 0x12, 0xf2, 0xba, + 0x7d, 0xbf, 0x6d, 0x1a, 0xc4, 0xff, 0x7f, 0x52, 0x65, 0x6f, 0xca, 0x8d, 0x70, 0x94, 0xe5, 0xf3, + 0x8d, 0x55, 0x7a, 0x60, 0xa7, 0x37, 0xd9, 0x55, 0x2d, 0xc3, 0x5c, 0xb7, 0xcc, 0x2d, 0x0b, 0xdb, + 0x36, 0x39, 0x35, 0x35, 0xa9, 0x86, 0x52, 0x94, 0x07, 0xe1, 0x58, 0x47, 0x37, 0x2e, 0xda, 0x24, + 0x48, 0xef, 0x12, 0x73, 0x1b, 0x9b, 0xe9, 0x13, 0x3c, 0x3b, 0xd4, 0xd8, 0x98, 0x1c, 0xc2, 0xbf, + 0xa8, 0xfb, 0xa9, 0x28, 0x37, 0x41, 0x81, 0x71, 0xb3, 0xa0, 0xb5, 0x2e, 0x92, 0xef, 0xcc, 0x1d, + 0x75, 0x5f, 0x3a, 0x7a, 0x49, 0x06, 0x66, 0xb8, 0x9f, 0x35, 0x50, 0xbc, 0x2e, 0xcf, 0x3e, 0xbf, + 0xad, 0x3b, 0xd8, 0x2d, 0x98, 0x9d, 0x63, 0xb9, 0x6d, 0x00, 0x63, 0xea, 0xbe, 0x1f, 0xd5, 0x3e, + 0xc4, 0x5c, 0x00, 0x68, 0x67, 0x46, 0xbc, 0xc6, 0x6c, 0x66, 0x87, 0x72, 0x69, 0xe8, 0xd9, 0xa0, + 0xec, 0xa7, 0x16, 0xf2, 0xf0, 0xc8, 0x24, 0xf3, 0xf0, 0x70, 0x65, 0xa2, 0x75, 0x3a, 0xe6, 0x25, + 0xdc, 0xf6, 0xc9, 0x32, 0x3d, 0xdc, 0x97, 0x8e, 0x3e, 0x39, 0xcc, 0x9c, 0x2f, 0xf1, 0x15, 0x14, + 0x6e, 0x03, 0xda, 0x6d, 0xb5, 0x30, 0x6e, 0xb3, 0x43, 0x69, 0xde, 0x6b, 0xc2, 0xcb, 0x29, 0x12, + 0xcf, 0x10, 0x0f, 0xe9, 0x76, 0x8a, 0xf7, 0x9e, 0x80, 0x3c, 0xbd, 0xe9, 0x0d, 0xbd, 0x64, 0xae, + 0x6f, 0x3f, 0x32, 0xc7, 0xf7, 0x23, 0x1b, 0x30, 0x63, 0x98, 0x6e, 0x71, 0xeb, 0x9a, 0xa5, 0xed, + 0xd8, 0x71, 0x0b, 0xc0, 0x94, 0xae, 0x3f, 0xda, 0x57, 0x43, 0xbf, 0xad, 0x1c, 0x51, 0x39, 0x32, + 0xca, 0xff, 0x0f, 0x8e, 0x5e, 0x60, 0xc1, 0x1b, 0x6c, 0x46, 0x59, 0x8a, 0x76, 0x8f, 0xec, 0xa1, + 0xbc, 0xc0, 0xff, 0xb9, 0x72, 0x44, 0xed, 0x25, 0xa6, 0xfc, 0x08, 0xcc, 0xb9, 0xaf, 0x6d, 0xf3, + 0x92, 0xc7, 0xb8, 0x1c, 0x6d, 0x23, 0xf6, 0x90, 0x5f, 0xe3, 0x7e, 0x5c, 0x39, 0xa2, 0xf6, 0x90, + 0x52, 0x6a, 0x00, 0xdb, 0xce, 0x4e, 0x87, 0x11, 0xce, 0x46, 0xab, 0x64, 0x0f, 0xe1, 0x15, 0xff, + 0xa7, 0x95, 0x23, 0x6a, 0x88, 0x84, 0xb2, 0x0a, 0x53, 0xce, 0xc3, 0x0e, 0xa3, 0x97, 0x8b, 0xf6, + 0x4b, 0xe8, 0xa1, 0xd7, 0xf0, 0xfe, 0x59, 0x39, 0xa2, 0x06, 0x04, 0x94, 0x0a, 0x4c, 0x76, 0x2f, + 0x30, 0x62, 0xf9, 0xe8, 0xbe, 0xac, 0x87, 0xd8, 0xfa, 0x05, 0x9f, 0x96, 0xff, 0xbb, 0xcb, 0x58, + 0xcb, 0xde, 0x63, 0xb4, 0x26, 0x84, 0x19, 0x2b, 0x79, 0xff, 0xb8, 0x8c, 0xf9, 0x04, 0x94, 0x0a, + 0x4c, 0xd9, 0x86, 0xd6, 0xb5, 0xb7, 0x4d, 0xc7, 0x3e, 0x35, 0xd9, 0xe3, 0xc2, 0x1a, 0x4d, 0xad, + 0xce, 0xfe, 0x51, 0x83, 0xbf, 0x95, 0xa7, 0xc1, 0x89, 0xdd, 0x6e, 0x5b, 0x73, 0x70, 0xf9, 0x61, + 0xdd, 0x76, 0x74, 0x63, 0xcb, 0x0b, 0xff, 0x4b, 0x07, 0x82, 0xfe, 0x1f, 0x95, 0x79, 0x76, 0x98, + 0x0d, 0x48, 0xdb, 0x44, 0xbd, 0xfb, 0xa8, 0xb4, 0xd8, 0xd0, 0x19, 0xb6, 0x67, 0x42, 0xd6, 0xfd, + 0x44, 0x06, 0x8e, 0xb9, 0xfe, 0x6b, 0xb4, 0xbd, 0xba, 0x43, 0x1a, 0xb0, 0xfb, 0x53, 0xcf, 0xd8, + 0x33, 0xb3, 0x6f, 0xec, 0x39, 0x03, 0xd3, 0xba, 0xbd, 0xa6, 0x6f, 0x51, 0xc3, 0x97, 0x8d, 0x0d, + 0xe1, 0x24, 0xba, 0x50, 0x50, 0xc5, 0x97, 0xe8, 0xe5, 0x26, 0x47, 0xbd, 0x85, 0x02, 0x2f, 0x05, + 0xdd, 0x00, 0x33, 0xe1, 0x46, 0x46, 0xaf, 0x8b, 0xd5, 0x03, 0xb3, 0x99, 0xbd, 0xa1, 0xeb, 0x61, + 0x8e, 0xd7, 0xe9, 0x90, 0x75, 0x20, 0x7b, 0x5d, 0x21, 0xba, 0x0e, 0x8e, 0xf6, 0x34, 0x2c, 0x2f, + 0x1c, 0x4c, 0x26, 0x08, 0x07, 0x73, 0x06, 0x20, 0xd0, 0xe2, 0xbe, 0x64, 0xae, 0x85, 0x29, 0x5f, + 0x2f, 0xfb, 0x66, 0xf8, 0x42, 0x06, 0x26, 0x3d, 0x65, 0xeb, 0x97, 0xc1, 0x1d, 0x99, 0x8c, 0xd0, + 0xde, 0x8f, 0x37, 0x32, 0x85, 0xd3, 0x5c, 0x13, 0x20, 0xf0, 0xb8, 0x6e, 0xe8, 0x4e, 0xc7, 0x3b, + 0xb5, 0xd8, 0x9b, 0xac, 0xac, 0x03, 0xe8, 0x04, 0xa3, 0x46, 0x70, 0x8c, 0xf1, 0xd6, 0x04, 0xed, + 0x81, 0xea, 0x43, 0x88, 0xc6, 0xd9, 0xef, 0x63, 0x67, 0x0c, 0xa7, 0x20, 0x47, 0x63, 0xe0, 0x1f, + 0x51, 0xe6, 0x00, 0xca, 0xcf, 0x5a, 0x2f, 0xab, 0x95, 0x72, 0xb5, 0x54, 0x2e, 0x64, 0xd0, 0xaf, + 0x49, 0x30, 0xe5, 0x37, 0x82, 0xbe, 0x95, 0x2c, 0x33, 0xd5, 0x1a, 0x78, 0x23, 0xe7, 0xfe, 0x46, + 0x15, 0x56, 0xb2, 0x67, 0xc0, 0x95, 0xbb, 0x36, 0x5e, 0xd2, 0x2d, 0xdb, 0x51, 0xcd, 0x4b, 0x4b, + 0xa6, 0x15, 0x0c, 0xac, 0x34, 0xf8, 0x6c, 0xd4, 0x67, 0xd7, 0x18, 0x6c, 0x63, 0x72, 0x9e, 0x0d, + 0x5b, 0x6c, 0x51, 0x3f, 0x48, 0x70, 0xe9, 0x3a, 0x96, 0x66, 0xd8, 0x5d, 0xd3, 0xc6, 0xaa, 0x79, + 0xc9, 0x2e, 0x1a, 0xed, 0x92, 0xd9, 0xd9, 0xdd, 0x31, 0x6c, 0x66, 0xce, 0x45, 0x7d, 0x76, 0xa5, + 0x43, 0xee, 0xdb, 0x9d, 0x03, 0x28, 0xd5, 0x56, 0x57, 0xcb, 0xa5, 0x46, 0xa5, 0x56, 0x2d, 0x1c, + 0x71, 0xa5, 0xd5, 0x28, 0x2e, 0xac, 0xba, 0xd2, 0xf9, 0x51, 0x98, 0xf4, 0xda, 0x34, 0x8b, 0x60, + 0x93, 0xf1, 0x22, 0xd8, 0x28, 0x45, 0x98, 0xf4, 0x5a, 0x39, 0x1b, 0x11, 0x9e, 0xd8, 0x7b, 0x62, + 0x79, 0x47, 0xb3, 0x1c, 0x62, 0xa0, 0x78, 0x44, 0x16, 0x34, 0x1b, 0xab, 0xfe, 0x6f, 0x67, 0x9f, + 0xc2, 0x38, 0x50, 0x60, 0xae, 0xb8, 0xba, 0xda, 0xac, 0xa9, 0xcd, 0x6a, 0xad, 0xb1, 0x52, 0xa9, + 0x2e, 0xd3, 0x11, 0xb2, 0xb2, 0x5c, 0xad, 0xa9, 0x65, 0x3a, 0x40, 0xd6, 0x0b, 0x19, 0x7a, 0xdf, + 0xf3, 0xc2, 0x24, 0xe4, 0xbb, 0x44, 0xba, 0xe8, 0x73, 0x72, 0xc2, 0x50, 0x05, 0x3e, 0x4e, 0x11, + 0x37, 0xd2, 0x72, 0xc7, 0x05, 0xa4, 0x3e, 0xc7, 0x79, 0xcf, 0xc2, 0x0c, 0x35, 0xc3, 0x6d, 0xb2, + 0xf3, 0x42, 0x90, 0x93, 0x55, 0x2e, 0x0d, 0xbd, 0x5f, 0x4a, 0x10, 0xbf, 0xa0, 0x2f, 0x47, 0xc9, + 0x8c, 0x8b, 0xbf, 0xc8, 0x0c, 0x77, 0x63, 0x44, 0xa5, 0xda, 0x28, 0xab, 0xd5, 0xe2, 0x2a, 0xcb, + 0x22, 0x2b, 0xa7, 0xe0, 0x78, 0xb5, 0xc6, 0xc2, 0x31, 0xd6, 0x9b, 0x8d, 0x5a, 0xb3, 0xb2, 0xb6, + 0x5e, 0x53, 0x1b, 0x85, 0x9c, 0x72, 0x12, 0x14, 0xfa, 0xdc, 0xac, 0xd4, 0x9b, 0xa5, 0x62, 0xb5, + 0x54, 0x5e, 0x2d, 0x2f, 0x16, 0xf2, 0xca, 0x93, 0xe0, 0x3a, 0x7a, 0x03, 0x51, 0x6d, 0xa9, 0xa9, + 0xd6, 0xce, 0xd7, 0x5d, 0x04, 0xd5, 0xf2, 0x6a, 0xd1, 0x55, 0xa4, 0xd0, 0xbd, 0xcf, 0x13, 0xca, + 0x15, 0x70, 0x94, 0x5c, 0x0a, 0xbf, 0x5a, 0x2b, 0x2e, 0xb2, 0xf2, 0x26, 0x95, 0x6b, 0xe0, 0x54, + 0xa5, 0x5a, 0xdf, 0x58, 0x5a, 0xaa, 0x94, 0x2a, 0xe5, 0x6a, 0xa3, 0xb9, 0x5e, 0x56, 0xd7, 0x2a, + 0xf5, 0xba, 0xfb, 0x6f, 0x61, 0x8a, 0xdc, 0xaa, 0x4b, 0xfb, 0x4c, 0xf4, 0x76, 0x19, 0x66, 0xcf, + 0x69, 0x1d, 0xdd, 0x1d, 0x28, 0xc8, 0x75, 0xdb, 0x3d, 0x27, 0x7d, 0x1c, 0x72, 0x2d, 0x37, 0x3b, + 0x2b, 0x40, 0x5e, 0xd0, 0x4f, 0xca, 0x09, 0x4f, 0xfa, 0x30, 0x20, 0x68, 0x89, 0xf3, 0x5c, 0x69, + 0x11, 0xf3, 0xd2, 0x57, 0x4a, 0x09, 0x4e, 0xfa, 0x88, 0x93, 0x4f, 0x06, 0xfe, 0xaf, 0x8f, 0x0a, + 0xfc, 0x02, 0xcc, 0x6c, 0x54, 0x8b, 0x1b, 0x8d, 0x95, 0x9a, 0x5a, 0xf9, 0x61, 0x12, 0x28, 0x7e, + 0x16, 0xa6, 0x96, 0x6a, 0xea, 0x42, 0x65, 0x71, 0xb1, 0x5c, 0x2d, 0xe4, 0x94, 0x2b, 0xe1, 0x8a, + 0x7a, 0x59, 0x3d, 0x57, 0x29, 0x95, 0x9b, 0x1b, 0xd5, 0xe2, 0xb9, 0x62, 0x65, 0x95, 0xf4, 0x11, + 0xf9, 0x98, 0xab, 0xc2, 0x27, 0xd0, 0x8f, 0x67, 0x01, 0x68, 0xd5, 0xc9, 0x3d, 0x49, 0xa1, 0x0b, + 0xa5, 0x3f, 0x9d, 0x74, 0xd2, 0x10, 0x90, 0x89, 0x68, 0xbf, 0x15, 0x98, 0xb4, 0xd8, 0x07, 0xb6, + 0xf2, 0x35, 0x88, 0x0e, 0x7d, 0xf4, 0xa8, 0xa9, 0xfe, 0xef, 0xe8, 0x1d, 0x49, 0xe6, 0x08, 0x91, + 0x8c, 0x25, 0x43, 0x72, 0x69, 0x34, 0x40, 0xa2, 0x17, 0x66, 0x60, 0x8e, 0xaf, 0x98, 0x5b, 0x09, + 0x62, 0x4c, 0x89, 0x55, 0x82, 0xff, 0x39, 0x64, 0x64, 0x9d, 0x7d, 0x2a, 0x1b, 0x4e, 0xc1, 0x6b, + 0x99, 0xf4, 0xd0, 0xbe, 0x67, 0xb1, 0x14, 0x32, 0x2e, 0xf3, 0xae, 0xd1, 0x51, 0x90, 0x94, 0x09, + 0x90, 0x1b, 0x0f, 0x3b, 0x05, 0x19, 0x7d, 0x41, 0x86, 0x59, 0xee, 0xc6, 0x6a, 0xf4, 0xca, 0x8c, + 0xc8, 0x6d, 0xb2, 0xa1, 0xbb, 0xb0, 0x33, 0x07, 0xbd, 0x0b, 0xfb, 0xec, 0x2d, 0x30, 0xc1, 0xd2, + 0x88, 0x7c, 0x6b, 0x55, 0xd7, 0x14, 0x38, 0x0a, 0xd3, 0xcb, 0xe5, 0x46, 0xb3, 0xde, 0x28, 0xaa, + 0x8d, 0xf2, 0x62, 0x21, 0xe3, 0x0e, 0x7c, 0xe5, 0xb5, 0xf5, 0xc6, 0x83, 0x05, 0x29, 0xb9, 0xf3, + 0x64, 0x2f, 0x23, 0x63, 0x76, 0x9e, 0x8c, 0x2b, 0x3e, 0xfd, 0xb9, 0xea, 0xc7, 0x65, 0x28, 0x50, + 0x0e, 0xca, 0x0f, 0x77, 0xb1, 0xa5, 0x63, 0xa3, 0x85, 0xd1, 0x45, 0x91, 0x60, 0xad, 0xfb, 0xc2, + 0x18, 0x92, 0xfe, 0x3c, 0x64, 0x25, 0xd2, 0x97, 0x1e, 0x03, 0x3b, 0xbb, 0xcf, 0xc0, 0xfe, 0x58, + 0x52, 0xef, 0xc9, 0x5e, 0x76, 0x47, 0x02, 0xd9, 0x87, 0x92, 0x78, 0x4f, 0x0e, 0xe0, 0x60, 0x2c, + 0x31, 0x98, 0x23, 0xc6, 0xdf, 0x82, 0x8c, 0x5e, 0x20, 0xc3, 0xd1, 0x45, 0xcd, 0xc1, 0x0b, 0x97, + 0x1b, 0xde, 0x8d, 0x92, 0x11, 0xb7, 0x40, 0x67, 0xf6, 0xdd, 0x02, 0x1d, 0x5c, 0x4a, 0x29, 0xf5, + 0x5c, 0x4a, 0x89, 0xde, 0x92, 0xf4, 0xbc, 0x65, 0x0f, 0x0f, 0x23, 0x0b, 0x94, 0x9c, 0xec, 0x1c, + 0x65, 0x3c, 0x17, 0xe9, 0x37, 0xb0, 0x37, 0x4c, 0x41, 0x81, 0xb2, 0x12, 0x72, 0x10, 0xfc, 0x45, + 0x76, 0x71, 0x7a, 0x33, 0x41, 0x3c, 0x46, 0x2f, 0xc2, 0x85, 0xc4, 0x47, 0xb8, 0xe0, 0xd6, 0x9b, + 0xe5, 0x5e, 0xa7, 0x8e, 0xa4, 0x9d, 0x61, 0xc8, 0x1b, 0x30, 0x3a, 0x04, 0x6e, 0x7a, 0x9d, 0x61, + 0x6c, 0xf1, 0xe3, 0xb9, 0xdc, 0x97, 0x5d, 0xc1, 0x59, 0x16, 0x45, 0x26, 0xfe, 0x0e, 0xf3, 0xa4, + 0xae, 0xe1, 0x9c, 0x37, 0x66, 0xcc, 0xc5, 0xde, 0xe9, 0xb9, 0x86, 0x0f, 0xe2, 0x20, 0x7d, 0x14, + 0xbe, 0x23, 0x41, 0xb6, 0x6e, 0x5a, 0xce, 0xa8, 0x30, 0x48, 0xba, 0x9d, 0x1d, 0x92, 0x40, 0x3d, + 0x7a, 0xce, 0x99, 0xde, 0x76, 0x76, 0x7c, 0xf9, 0x63, 0x08, 0x69, 0x79, 0x14, 0xe6, 0x28, 0x27, + 0xfe, 0x7d, 0x2f, 0xdf, 0x96, 0x68, 0x7f, 0xf5, 0x80, 0x28, 0x22, 0x64, 0xe3, 0xc3, 0xdf, 0x4e, + 0xf6, 0x40, 0xe1, 0xd2, 0xd0, 0x6f, 0x87, 0x71, 0x59, 0xe4, 0x71, 0xe9, 0x37, 0xe3, 0xf6, 0xaf, + 0x4c, 0x19, 0x55, 0xcf, 0x94, 0x24, 0x3a, 0x66, 0x4c, 0xe1, 0xe9, 0x23, 0xf2, 0x88, 0x0c, 0x79, + 0xe6, 0xce, 0x37, 0x52, 0x04, 0x92, 0xb6, 0x0c, 0x5f, 0x08, 0x62, 0x6e, 0x7f, 0xf2, 0xa8, 0x5b, + 0x46, 0x7c, 0xf9, 0xe9, 0xe3, 0xf0, 0xef, 0xcc, 0x4f, 0xb5, 0xb8, 0xa7, 0xe9, 0x1d, 0xed, 0x42, + 0x27, 0x41, 0x54, 0xea, 0xf7, 0x27, 0x3c, 0x99, 0xe7, 0x57, 0x95, 0x2b, 0x2f, 0x42, 0xe2, 0x3f, + 0x00, 0x53, 0x16, 0xb7, 0xd7, 0xe7, 0x5a, 0x51, 0x3d, 0x3e, 0xc2, 0xec, 0xbb, 0x1a, 0xe4, 0x4c, + 0x74, 0x0c, 0x4f, 0x88, 0x9f, 0xb1, 0x1c, 0x1b, 0x9a, 0x2e, 0xb6, 0xdb, 0x4b, 0x58, 0x73, 0x76, + 0x2d, 0xdc, 0x4e, 0x34, 0x44, 0x58, 0x3d, 0xdb, 0xa1, 0x21, 0x49, 0x70, 0x71, 0x21, 0x57, 0x79, + 0x74, 0x9e, 0x3e, 0xa0, 0x37, 0xf0, 0x78, 0x19, 0x49, 0x97, 0xf4, 0x7a, 0x1f, 0x92, 0x1a, 0x07, + 0xc9, 0x33, 0x87, 0x63, 0x22, 0x7d, 0x40, 0x7e, 0x59, 0x86, 0x39, 0x6a, 0x27, 0x8c, 0x1a, 0x93, + 0x3f, 0x4c, 0xe8, 0xfe, 0x13, 0xba, 0x51, 0x2b, 0xcc, 0xce, 0x48, 0x60, 0x49, 0xe2, 0x2c, 0x24, + 0xc6, 0x47, 0xfa, 0xc8, 0x7c, 0x32, 0x0f, 0x10, 0x72, 0xe9, 0x7c, 0x7f, 0x3e, 0x88, 0xd1, 0x88, + 0xde, 0xc8, 0xe6, 0x1f, 0x75, 0x2e, 0x60, 0x78, 0xc8, 0x5d, 0xd3, 0xdf, 0x90, 0xe2, 0x13, 0x85, + 0x46, 0x95, 0xbf, 0x48, 0x68, 0xf3, 0x32, 0x87, 0xca, 0x81, 0x83, 0xfb, 0x90, 0xbd, 0xdc, 0x07, + 0x12, 0x18, 0xbf, 0x83, 0x58, 0x49, 0x86, 0xda, 0xea, 0x10, 0x33, 0xfb, 0x53, 0x70, 0x5c, 0x2d, + 0x17, 0x17, 0x6b, 0xd5, 0xd5, 0x07, 0xc3, 0xd7, 0x2b, 0x15, 0xe4, 0xf0, 0xe4, 0x24, 0x15, 0xd8, + 0x5e, 0x9d, 0xb0, 0x0f, 0xe4, 0x65, 0x15, 0x37, 0x5b, 0x09, 0x2d, 0xae, 0x0c, 0xee, 0xd5, 0x04, + 0xc8, 0x1e, 0x26, 0x0a, 0x8f, 0x40, 0xa8, 0x19, 0xfd, 0xb4, 0x0c, 0x05, 0xe2, 0xfb, 0x43, 0xb8, + 0x64, 0xf7, 0xe8, 0xd5, 0x78, 0x8f, 0xcf, 0x2e, 0xdd, 0x7f, 0x0a, 0x3c, 0x3e, 0xbd, 0x04, 0xe5, + 0x06, 0x98, 0x6b, 0x6d, 0xe3, 0xd6, 0xc5, 0x8a, 0xe1, 0xed, 0xab, 0xd3, 0x4d, 0xd8, 0x9e, 0x54, + 0x1e, 0x98, 0x07, 0x78, 0x60, 0xf8, 0x49, 0x34, 0x37, 0x48, 0x87, 0x99, 0x8a, 0xc0, 0xe5, 0xc3, + 0x3e, 0x2e, 0x55, 0x0e, 0x97, 0x3b, 0x87, 0xa2, 0x9a, 0x0c, 0x96, 0xea, 0x10, 0xb0, 0x20, 0x38, + 0x59, 0x5b, 0x6f, 0x54, 0x6a, 0xd5, 0xe6, 0x46, 0xbd, 0xbc, 0xd8, 0x5c, 0xf0, 0xc0, 0xa9, 0x17, + 0x64, 0xf4, 0x55, 0x09, 0x26, 0x28, 0x5b, 0x36, 0x7a, 0x72, 0x00, 0xc1, 0x40, 0x57, 0x57, 0xf4, + 0x06, 0xe1, 0xc0, 0x15, 0xbe, 0x20, 0x58, 0x39, 0x11, 0xfd, 0xd4, 0x33, 0x60, 0x82, 0x82, 0xec, + 0xad, 0x68, 0x9d, 0x8e, 0xe8, 0xa5, 0x18, 0x19, 0xd5, 0xcb, 0x2e, 0x18, 0xc4, 0x62, 0x00, 0x1b, + 0xe9, 0x8f, 0x2c, 0xcf, 0xc9, 0x52, 0x33, 0xf8, 0xbc, 0xee, 0x6c, 0x13, 0x4f, 0x58, 0xf4, 0x43, + 0x22, 0xcb, 0x8b, 0x37, 0x43, 0x6e, 0xcf, 0xcd, 0x3d, 0xc0, 0xab, 0x98, 0x66, 0x42, 0xbf, 0x2e, + 0x1c, 0x33, 0x95, 0xd3, 0x4f, 0x9f, 0xa7, 0x08, 0x70, 0xd6, 0x20, 0xdb, 0xd1, 0x6d, 0x87, 0x8d, + 0x1f, 0x77, 0x24, 0x22, 0xe4, 0x3d, 0x54, 0x1c, 0xbc, 0xa3, 0x12, 0x32, 0xe8, 0x7e, 0x98, 0x09, + 0xa7, 0x0a, 0x78, 0x56, 0x9f, 0x82, 0x09, 0x76, 0xe2, 0x8f, 0x2d, 0xb1, 0x7a, 0xaf, 0x82, 0xcb, + 0x9a, 0x42, 0xb5, 0x4d, 0x5f, 0x07, 0xfe, 0xef, 0xa3, 0x30, 0xb1, 0xa2, 0xdb, 0x8e, 0x69, 0x5d, + 0x46, 0x8f, 0x66, 0x60, 0xe2, 0x1c, 0xb6, 0x6c, 0xdd, 0x34, 0xf6, 0xb9, 0x1a, 0x9c, 0x81, 0xe9, + 0xae, 0x85, 0xf7, 0x74, 0x73, 0xd7, 0x0e, 0x16, 0x67, 0xc2, 0x49, 0x0a, 0x82, 0x49, 0x6d, 0xd7, + 0xd9, 0x36, 0xad, 0x20, 0x50, 0x88, 0xf7, 0xae, 0x9c, 0x06, 0xa0, 0xcf, 0x55, 0x6d, 0x07, 0x33, + 0x07, 0x8a, 0x50, 0x8a, 0xa2, 0x40, 0xd6, 0xd1, 0x77, 0x30, 0x8b, 0x1c, 0x4c, 0x9e, 0x5d, 0x01, + 0x93, 0x28, 0x7c, 0x2c, 0xda, 0xa1, 0xac, 0x7a, 0xaf, 0xe8, 0x33, 0x32, 0x4c, 0x2f, 0x63, 0x87, + 0xb1, 0x6a, 0xa3, 0x17, 0x65, 0x84, 0x2e, 0xeb, 0x70, 0xc7, 0xd8, 0x8e, 0x66, 0x7b, 0xff, 0xf9, + 0x4b, 0xb0, 0x7c, 0x62, 0x10, 0xc6, 0x58, 0x0e, 0xc7, 0x30, 0x27, 0x31, 0xed, 0x9c, 0x0a, 0x75, + 0x46, 0x65, 0x99, 0xd9, 0x26, 0xc8, 0xfe, 0x0f, 0xe8, 0xad, 0x92, 0xe8, 0x79, 0x70, 0x26, 0xfb, + 0xf9, 0x50, 0x7d, 0x22, 0xbb, 0xa3, 0xc9, 0x3d, 0x96, 0x63, 0x5f, 0x78, 0xfa, 0x30, 0x25, 0x46, + 0x46, 0xf5, 0x73, 0x0b, 0x9e, 0x24, 0x1f, 0xcc, 0x49, 0xfa, 0xda, 0xf8, 0x4d, 0x19, 0xa6, 0xeb, + 0xdb, 0xe6, 0x25, 0x4f, 0x8e, 0x3f, 0x2a, 0x06, 0xec, 0x35, 0x30, 0xb5, 0xd7, 0x03, 0x6a, 0x90, + 0x10, 0x7d, 0x7d, 0x3e, 0x7a, 0xbe, 0x9c, 0x14, 0xa6, 0x10, 0x73, 0x23, 0xbf, 0xdc, 0x5e, 0x79, + 0x3a, 0x4c, 0x30, 0xae, 0xd9, 0x92, 0x4b, 0x3c, 0xc0, 0x5e, 0xe6, 0x70, 0x05, 0xb3, 0x7c, 0x05, + 0x93, 0x21, 0x1f, 0x5d, 0xb9, 0xf4, 0x91, 0xff, 0x53, 0x89, 0xc4, 0x11, 0xf1, 0x80, 0x2f, 0x8d, + 0x00, 0x78, 0xf4, 0xad, 0x8c, 0xe8, 0xc2, 0xa4, 0x2f, 0x01, 0x9f, 0x83, 0x03, 0x5d, 0xc4, 0x33, + 0x90, 0x5c, 0xfa, 0xf2, 0xfc, 0xb5, 0x2c, 0xcc, 0x2c, 0xea, 0x9b, 0x9b, 0x7e, 0x27, 0xf9, 0x62, + 0xc1, 0x4e, 0x32, 0xda, 0x1d, 0xc0, 0xb5, 0x73, 0x77, 0x2d, 0x0b, 0x1b, 0x5e, 0xa5, 0x58, 0x73, + 0xea, 0x49, 0x55, 0x6e, 0x84, 0xa3, 0xde, 0xb8, 0x10, 0xee, 0x28, 0xa7, 0xd4, 0xde, 0x64, 0xf4, + 0x0d, 0xe1, 0x5d, 0x2d, 0x4f, 0xa2, 0xe1, 0x2a, 0x45, 0x34, 0xc0, 0xbb, 0x60, 0x76, 0x9b, 0xe6, + 0x26, 0x53, 0x7f, 0xaf, 0xb3, 0x3c, 0xd9, 0x13, 0xa7, 0x79, 0x0d, 0xdb, 0xb6, 0xb6, 0x85, 0x55, + 0x3e, 0x73, 0x4f, 0xf3, 0x95, 0x93, 0xdc, 0x3a, 0x26, 0xb6, 0x41, 0x26, 0x50, 0x93, 0x31, 0x68, + 0xc7, 0x59, 0xc8, 0x2e, 0xe9, 0x1d, 0x8c, 0x7e, 0x46, 0x82, 0x29, 0x15, 0xb7, 0x4c, 0xa3, 0xe5, + 0xbe, 0x85, 0x9c, 0x83, 0xfe, 0x31, 0x23, 0x7a, 0xdb, 0xa6, 0x4b, 0x67, 0xde, 0xa7, 0x11, 0xd1, + 0x6e, 0xc4, 0x6e, 0xd5, 0x8c, 0x25, 0x35, 0x86, 0xbb, 0x51, 0xdc, 0xa9, 0xc7, 0xe6, 0x66, 0xc7, + 0xd4, 0xb8, 0xc5, 0xaf, 0x5e, 0x53, 0x28, 0x38, 0xac, 0x52, 0x35, 0x9d, 0x75, 0xdd, 0x30, 0xfc, + 0xf3, 0xdf, 0xfb, 0xd2, 0xf9, 0x7d, 0xdb, 0xd8, 0x10, 0x3a, 0xa4, 0xee, 0xac, 0xf4, 0x08, 0xcd, + 0xbe, 0x01, 0xe6, 0x2e, 0x5c, 0x76, 0xb0, 0xcd, 0x72, 0xb1, 0x62, 0xb3, 0x6a, 0x4f, 0x6a, 0x28, + 0x00, 0x76, 0x5c, 0xa8, 0x9d, 0x98, 0x02, 0x93, 0x89, 0x7a, 0x65, 0x88, 0x19, 0xe0, 0x71, 0x28, + 0x54, 0x6b, 0x8b, 0x65, 0xe2, 0xab, 0xe6, 0x79, 0xff, 0x6c, 0xa1, 0x5f, 0x90, 0x61, 0x86, 0x38, + 0x93, 0x78, 0x28, 0x5c, 0x27, 0x30, 0x1f, 0x41, 0x8f, 0x09, 0xfb, 0xb1, 0x91, 0x2a, 0x87, 0x0b, + 0x88, 0x16, 0xf4, 0xa6, 0xde, 0xe9, 0x15, 0x74, 0x4e, 0xed, 0x49, 0xed, 0x03, 0x88, 0xdc, 0x17, + 0x90, 0xdf, 0x17, 0x72, 0x66, 0x1b, 0xc4, 0xdd, 0x61, 0xa1, 0xf2, 0x07, 0x32, 0x4c, 0xbb, 0x93, + 0x14, 0x0f, 0x94, 0x1a, 0x07, 0x8a, 0x69, 0x74, 0x2e, 0x07, 0xcb, 0x22, 0xde, 0x6b, 0xa2, 0x46, + 0xf2, 0x57, 0xc2, 0x33, 0x77, 0x22, 0xa2, 0x10, 0x2f, 0x63, 0xc2, 0xef, 0x9d, 0x42, 0xf3, 0xf9, + 0x01, 0xcc, 0x1d, 0x16, 0x7c, 0x5f, 0xca, 0x41, 0x7e, 0xa3, 0x4b, 0x90, 0xfb, 0x75, 0x59, 0x24, + 0x98, 0xfc, 0xbe, 0x83, 0x0c, 0xae, 0x99, 0xd5, 0x31, 0x5b, 0x5a, 0x67, 0x3d, 0x38, 0x11, 0x16, + 0x24, 0x28, 0x77, 0x32, 0xdf, 0x46, 0x7a, 0x12, 0xf2, 0x86, 0xd8, 0x38, 0xeb, 0x44, 0x46, 0xa1, + 0x43, 0x23, 0x37, 0xc3, 0xb1, 0xb6, 0x6e, 0x6b, 0x17, 0x3a, 0xb8, 0x6c, 0xb4, 0xac, 0xcb, 0x54, + 0x1c, 0x6c, 0x5a, 0xb5, 0xef, 0x83, 0x72, 0x37, 0xe4, 0x6c, 0xe7, 0x72, 0x87, 0xce, 0x13, 0xc3, + 0x67, 0x4c, 0x22, 0x8b, 0xaa, 0xbb, 0xd9, 0x55, 0xfa, 0x57, 0xd8, 0x45, 0x69, 0x42, 0xf0, 0xaa, + 0xed, 0xa7, 0x42, 0xde, 0xb4, 0xf4, 0x2d, 0x9d, 0x5e, 0x9d, 0x34, 0xb7, 0x2f, 0x9c, 0x20, 0x35, + 0x05, 0x6a, 0x24, 0x8b, 0xca, 0xb2, 0x2a, 0x4f, 0x87, 0x29, 0x7d, 0x47, 0xdb, 0xc2, 0x0f, 0xe8, + 0x06, 0x3d, 0x6c, 0x39, 0x77, 0xfb, 0xa9, 0x7d, 0xc7, 0x67, 0xd8, 0x77, 0x35, 0xc8, 0x8a, 0xde, + 0x29, 0x89, 0xc6, 0x3c, 0x22, 0x75, 0xa3, 0xa0, 0x8e, 0xe5, 0xca, 0x71, 0xf4, 0x0a, 0xa1, 0x68, + 0x44, 0xd1, 0x6c, 0xa5, 0x3f, 0x78, 0x7f, 0x4a, 0x82, 0xc9, 0x45, 0xf3, 0x92, 0x41, 0x14, 0xfd, + 0x0e, 0x31, 0x5b, 0xb7, 0xcf, 0x21, 0x47, 0xfe, 0x46, 0xcf, 0xd8, 0x13, 0x0d, 0xa4, 0xb6, 0x5e, + 0x91, 0x11, 0x30, 0xc4, 0xb6, 0x1c, 0xc1, 0x7b, 0x16, 0xe3, 0xca, 0x49, 0x5f, 0xae, 0x7f, 0x26, + 0x43, 0x76, 0xd1, 0x32, 0xbb, 0xe8, 0xf5, 0x99, 0x04, 0x2e, 0x0b, 0x6d, 0xcb, 0xec, 0x36, 0xc8, + 0x45, 0x69, 0xc1, 0x31, 0x8e, 0x70, 0x9a, 0x72, 0x07, 0x4c, 0x76, 0x4d, 0x5b, 0x77, 0xbc, 0x69, + 0xc4, 0xdc, 0xed, 0x4f, 0xe8, 0xdb, 0x9a, 0xd7, 0x59, 0x26, 0xd5, 0xcf, 0xee, 0xf6, 0xda, 0x44, + 0x84, 0xae, 0x5c, 0x5c, 0x31, 0x7a, 0x97, 0xc5, 0xf5, 0xa4, 0xa2, 0x97, 0x84, 0x91, 0x7c, 0x26, + 0x8f, 0xe4, 0x13, 0xfb, 0x48, 0xd8, 0x32, 0xbb, 0x23, 0xd9, 0x64, 0x7c, 0x99, 0x8f, 0xea, 0x3d, + 0x1c, 0xaa, 0x37, 0x09, 0x95, 0x99, 0x3e, 0xa2, 0xef, 0xcc, 0x02, 0x10, 0x33, 0x63, 0xc3, 0x9d, + 0x00, 0x89, 0xd9, 0x58, 0x3f, 0x95, 0x0d, 0xc9, 0xb2, 0xc8, 0xcb, 0xf2, 0xc9, 0x11, 0x56, 0x0c, + 0x21, 0x1f, 0x21, 0xd1, 0x22, 0xe4, 0x76, 0xdd, 0xcf, 0x4c, 0xa2, 0x82, 0x24, 0xc8, 0xab, 0x4a, + 0xff, 0x44, 0x7f, 0x9a, 0x81, 0x1c, 0x49, 0x50, 0x4e, 0x03, 0x90, 0x81, 0x9d, 0x1e, 0x08, 0xca, + 0x90, 0x21, 0x3c, 0x94, 0x42, 0xb4, 0x55, 0x6f, 0xb3, 0xcf, 0xd4, 0x64, 0x0e, 0x12, 0xdc, 0xbf, + 0xc9, 0x70, 0x4f, 0x68, 0x31, 0x03, 0x20, 0x94, 0xe2, 0xfe, 0x4d, 0xde, 0x56, 0xf1, 0x26, 0x8d, + 0x61, 0x9d, 0x55, 0x83, 0x04, 0xff, 0xef, 0x55, 0xff, 0xe6, 0x33, 0xef, 0x6f, 0x92, 0xe2, 0x4e, + 0x86, 0x89, 0x5a, 0x2e, 0x04, 0x45, 0xe4, 0x49, 0xa6, 0xde, 0x64, 0xf4, 0x6a, 0x5f, 0x6d, 0x16, + 0x39, 0xb5, 0xb9, 0x35, 0x81, 0x78, 0xd3, 0x57, 0x9e, 0x2f, 0xe4, 0x60, 0xaa, 0x6a, 0xb6, 0x99, + 0xee, 0x84, 0x26, 0x8c, 0x1f, 0xca, 0x25, 0x9a, 0x30, 0xfa, 0x34, 0x22, 0x14, 0xe4, 0x3e, 0x5e, + 0x41, 0xc4, 0x28, 0x84, 0xf5, 0x43, 0x59, 0x80, 0x3c, 0xd1, 0xde, 0xfd, 0x57, 0x6a, 0xc5, 0x91, + 0x20, 0xa2, 0x55, 0xd9, 0x9f, 0xff, 0xe1, 0x74, 0xec, 0xbf, 0x42, 0x8e, 0x54, 0x30, 0x66, 0x77, + 0x87, 0xaf, 0xa8, 0x14, 0x5f, 0x51, 0x39, 0xbe, 0xa2, 0xd9, 0xde, 0x8a, 0x26, 0x59, 0x07, 0x88, + 0xd2, 0x90, 0xf4, 0x75, 0xfc, 0x1f, 0x26, 0x00, 0xaa, 0xda, 0x9e, 0xbe, 0x45, 0x77, 0x87, 0x3f, + 0xe3, 0xcd, 0x7f, 0xd8, 0x3e, 0xee, 0x7f, 0x0b, 0x0d, 0x84, 0x77, 0xc0, 0x04, 0x1b, 0xf7, 0x58, + 0x45, 0xae, 0xe5, 0x2a, 0x12, 0x50, 0xa1, 0x66, 0xe9, 0xc3, 0x8e, 0xea, 0xe5, 0xe7, 0x6e, 0xff, + 0x95, 0x7a, 0x6e, 0xff, 0xed, 0xbf, 0x07, 0x11, 0x71, 0x27, 0x30, 0x7a, 0x9b, 0xb0, 0x47, 0x7f, + 0x88, 0x9f, 0x50, 0x8d, 0x22, 0x9a, 0xe0, 0x53, 0x61, 0xc2, 0xf4, 0x37, 0xb4, 0xe5, 0xc8, 0x75, + 0xb0, 0x8a, 0xb1, 0x69, 0xaa, 0x5e, 0x4e, 0xc1, 0xcd, 0x2f, 0x21, 0x3e, 0xc6, 0x72, 0x68, 0xe6, + 0xe4, 0xb2, 0x17, 0x0f, 0xcc, 0xad, 0xc7, 0x79, 0xdd, 0xd9, 0x5e, 0x25, 0x51, 0x46, 0xfe, 0xb3, + 0x98, 0x05, 0x19, 0xc2, 0x5f, 0x4a, 0x86, 0x3f, 0x1f, 0xb3, 0xa3, 0xce, 0xa3, 0x76, 0x77, 0x14, + 0x95, 0xfe, 0xdc, 0x46, 0x00, 0x78, 0x27, 0xe4, 0x29, 0xa3, 0xac, 0x13, 0x3d, 0x1b, 0x89, 0x9f, + 0x4f, 0x49, 0x65, 0x7f, 0xa0, 0xb7, 0xfa, 0x38, 0x9e, 0xe3, 0x70, 0x5c, 0x38, 0x10, 0x67, 0xa9, + 0x43, 0x7a, 0xf6, 0x36, 0x98, 0x60, 0x92, 0x56, 0xe6, 0xc2, 0xad, 0xb8, 0x70, 0x44, 0x01, 0xc8, + 0xaf, 0x99, 0x7b, 0xb8, 0x61, 0x16, 0x32, 0xee, 0xb3, 0xcb, 0x5f, 0xc3, 0x2c, 0x48, 0xe8, 0xe5, + 0x93, 0x30, 0xe9, 0x07, 0x62, 0xfa, 0x94, 0x04, 0x85, 0x92, 0x85, 0x35, 0x07, 0x2f, 0x59, 0xe6, + 0x0e, 0xad, 0x91, 0xb8, 0x77, 0xe8, 0x2f, 0x0b, 0xbb, 0x78, 0xf8, 0x01, 0x92, 0x7a, 0x0b, 0x8b, + 0xc0, 0x92, 0x2e, 0x42, 0x4a, 0xde, 0x22, 0x24, 0x7a, 0x9d, 0x90, 0xcb, 0x87, 0x68, 0x29, 0xe9, + 0x37, 0xb5, 0x8f, 0x49, 0x90, 0x2b, 0x75, 0x4c, 0x03, 0x87, 0x8f, 0x30, 0x0d, 0x3c, 0x2b, 0xd3, + 0x7f, 0x27, 0x02, 0x3d, 0x47, 0x12, 0xb5, 0x35, 0x02, 0x01, 0xb8, 0x65, 0x0b, 0xca, 0x56, 0x6c, + 0x90, 0x8a, 0x25, 0x9d, 0xbe, 0x40, 0xbf, 0x2a, 0xc1, 0x14, 0x8d, 0x8b, 0x53, 0xec, 0x74, 0xd0, + 0x13, 0x02, 0xa1, 0xf6, 0x09, 0x66, 0x85, 0x7e, 0x5f, 0xd8, 0x45, 0xdf, 0xaf, 0x95, 0x4f, 0x3b, + 0x41, 0x80, 0xa0, 0x64, 0x1e, 0xe3, 0x62, 0x7b, 0x69, 0x03, 0x19, 0x4a, 0x5f, 0xd4, 0x9f, 0x96, + 0x5c, 0x03, 0xc0, 0xb8, 0xb8, 0x6e, 0xe1, 0x3d, 0x1d, 0x5f, 0x42, 0x57, 0x07, 0xc2, 0xde, 0x1f, + 0xf4, 0xe3, 0x35, 0xc2, 0x8b, 0x38, 0x21, 0x92, 0x91, 0x5b, 0x59, 0xd3, 0x9d, 0x20, 0x13, 0xeb, + 0xc5, 0x7b, 0x23, 0xb1, 0x84, 0xc8, 0xa8, 0xe1, 0xec, 0x82, 0x6b, 0x36, 0xd1, 0x5c, 0xa4, 0x2f, + 0xd8, 0xf7, 0x4c, 0xc0, 0xe4, 0x86, 0x61, 0x77, 0x3b, 0x9a, 0xbd, 0x8d, 0xbe, 0x2d, 0x43, 0x9e, + 0x5e, 0xe4, 0x86, 0x7e, 0x80, 0x8b, 0x2d, 0xf0, 0x63, 0xbb, 0xd8, 0xf2, 0x5c, 0x70, 0xe8, 0x4b, + 0xff, 0x7b, 0xe6, 0xd1, 0x3b, 0x65, 0xd1, 0x49, 0xaa, 0x57, 0x68, 0xe8, 0x46, 0xff, 0xfe, 0xc7, + 0xd9, 0xbb, 0x7a, 0xcb, 0xd9, 0xb5, 0xfc, 0x5b, 0xcb, 0x9f, 0x22, 0x46, 0x65, 0x9d, 0xfe, 0xa5, + 0xfa, 0xbf, 0x23, 0x0d, 0x26, 0x58, 0xe2, 0xbe, 0xed, 0xa4, 0xfd, 0xe7, 0x6f, 0x4f, 0x42, 0x5e, + 0xb3, 0x1c, 0xdd, 0x76, 0xd8, 0x06, 0x2b, 0x7b, 0x73, 0xbb, 0x4b, 0xfa, 0xb4, 0x61, 0x75, 0xbc, + 0x28, 0x24, 0x7e, 0x02, 0xfa, 0x03, 0xa1, 0xf9, 0x63, 0x7c, 0xcd, 0x93, 0x41, 0xfe, 0xc0, 0x10, + 0x6b, 0xd4, 0x57, 0xc2, 0x15, 0x6a, 0xb1, 0x51, 0x6e, 0xd2, 0xa0, 0x15, 0x7e, 0x7c, 0x8a, 0x36, + 0x7a, 0x8b, 0x1c, 0x5a, 0xbf, 0xbb, 0xcc, 0x8d, 0x11, 0x4c, 0x8a, 0xc1, 0x18, 0xe1, 0x27, 0xc4, + 0xec, 0x56, 0x73, 0x8b, 0xb0, 0xb2, 0xf8, 0x22, 0xec, 0xef, 0x0a, 0xef, 0x26, 0xf9, 0xa2, 0x1c, + 0xb0, 0x06, 0x18, 0x77, 0xd1, 0xd3, 0xbb, 0x84, 0x76, 0x86, 0x06, 0x95, 0x74, 0x88, 0xb0, 0xfd, + 0xf6, 0x04, 0x4c, 0x2c, 0x6b, 0x9d, 0x0e, 0xb6, 0x2e, 0xbb, 0x43, 0x52, 0xc1, 0xe3, 0x70, 0x4d, + 0x33, 0xf4, 0x4d, 0x6c, 0x3b, 0xf1, 0x9d, 0xe5, 0xdb, 0x84, 0x83, 0x08, 0xb3, 0x32, 0xe6, 0x7b, + 0xe9, 0x47, 0xc8, 0xfc, 0x16, 0xc8, 0xea, 0xc6, 0xa6, 0xc9, 0xba, 0xcc, 0xde, 0x55, 0x7b, 0xef, + 0x67, 0x32, 0x75, 0x21, 0x19, 0x05, 0xe3, 0x08, 0x0b, 0x72, 0x91, 0x7e, 0xcf, 0xf9, 0x7b, 0x59, + 0x98, 0xf5, 0x98, 0xa8, 0x18, 0x6d, 0xfc, 0x70, 0x78, 0x29, 0xe6, 0x17, 0xb2, 0xa2, 0xc7, 0xc1, + 0x7a, 0xeb, 0x43, 0x48, 0x45, 0x88, 0xb4, 0x01, 0xd0, 0xd2, 0x1c, 0xbc, 0x65, 0x5a, 0xba, 0xdf, + 0x1f, 0x3e, 0x2d, 0x09, 0xb5, 0x12, 0xfd, 0xfb, 0xb2, 0x1a, 0xa2, 0xa3, 0xdc, 0x0d, 0xd3, 0xd8, + 0x3f, 0x7f, 0xef, 0x2d, 0xd5, 0xc4, 0xe2, 0x15, 0xce, 0x8f, 0x3e, 0x2d, 0x74, 0xea, 0x4c, 0xa4, + 0x9a, 0xc9, 0x30, 0x6b, 0x0e, 0xd7, 0x86, 0x36, 0xaa, 0x6b, 0x45, 0xb5, 0xbe, 0x52, 0x5c, 0x5d, + 0xad, 0x54, 0x97, 0xfd, 0xc0, 0x2f, 0x0a, 0xcc, 0x2d, 0xd6, 0xce, 0x57, 0x43, 0x91, 0x79, 0xb2, + 0x68, 0x1d, 0x26, 0x3d, 0x79, 0xf5, 0xf3, 0xc5, 0x0c, 0xcb, 0x8c, 0xf9, 0x62, 0x86, 0x92, 0x5c, + 0xe3, 0x4c, 0x6f, 0xf9, 0x0e, 0x3a, 0xe4, 0x19, 0xfd, 0x89, 0x06, 0x39, 0xb2, 0xa6, 0x8e, 0xde, + 0x44, 0xb6, 0x01, 0xbb, 0x1d, 0xad, 0x85, 0xd1, 0x4e, 0x02, 0x6b, 0xdc, 0xbb, 0xd5, 0x42, 0xda, + 0x77, 0xab, 0x05, 0x79, 0x64, 0x56, 0xdf, 0xf1, 0x7e, 0xeb, 0xf8, 0x2a, 0xcd, 0xc2, 0x1f, 0xd0, + 0x8a, 0xdd, 0x5d, 0xa1, 0xcb, 0xff, 0x8c, 0xcd, 0x08, 0x95, 0x8c, 0xe6, 0x29, 0x99, 0x25, 0x2a, + 0xb6, 0x0f, 0x13, 0xc7, 0xd1, 0x18, 0x6e, 0x5e, 0xcf, 0x42, 0xae, 0xde, 0xed, 0xe8, 0x0e, 0xfa, + 0x55, 0x69, 0x24, 0x98, 0xd1, 0x9b, 0x48, 0xe4, 0x81, 0x37, 0x91, 0x04, 0xbb, 0xae, 0x59, 0x81, + 0x5d, 0xd7, 0x06, 0x7e, 0xd8, 0xe1, 0x77, 0x5d, 0xef, 0x60, 0xc1, 0xdb, 0xe8, 0x9e, 0xed, 0x13, + 0xfb, 0x88, 0x94, 0x54, 0xab, 0x4f, 0x54, 0xc0, 0xb3, 0xb7, 0xb1, 0xe0, 0x64, 0x00, 0xf9, 0x85, + 0x5a, 0xa3, 0x51, 0x5b, 0x2b, 0x1c, 0x21, 0x51, 0x6d, 0x6a, 0xeb, 0x34, 0x54, 0x4c, 0xa5, 0x5a, + 0x2d, 0xab, 0x05, 0x89, 0x84, 0x4b, 0xab, 0x34, 0x56, 0xcb, 0x05, 0x99, 0x0f, 0x4b, 0x1f, 0x6b, + 0x7e, 0xf3, 0x65, 0xa7, 0xa9, 0x5e, 0x62, 0x86, 0x78, 0x34, 0x3f, 0xe9, 0x2b, 0xd7, 0x2f, 0xc9, + 0x90, 0x5b, 0xc3, 0xd6, 0x16, 0x46, 0x3f, 0x96, 0x60, 0x93, 0x6f, 0x53, 0xb7, 0x6c, 0x1a, 0x5c, + 0x2e, 0xd8, 0xe4, 0x0b, 0xa7, 0x29, 0xd7, 0xc3, 0xac, 0x8d, 0x5b, 0xa6, 0xd1, 0xf6, 0x32, 0xd1, + 0xfe, 0x88, 0x4f, 0x44, 0x2f, 0x4d, 0x08, 0x19, 0x61, 0x74, 0x24, 0x3b, 0x75, 0x49, 0x80, 0xe9, + 0x57, 0x6a, 0xfa, 0xc0, 0x7c, 0x43, 0x76, 0x7f, 0xea, 0x5e, 0x46, 0x2f, 0x15, 0xde, 0x7d, 0xbd, + 0x19, 0xf2, 0x17, 0xbc, 0x28, 0xc5, 0x72, 0x64, 0x7f, 0xcc, 0xf2, 0x28, 0x0b, 0x70, 0xcc, 0xc6, + 0x1d, 0xdc, 0x72, 0x70, 0xdb, 0x6d, 0xba, 0xea, 0xc0, 0x4e, 0x61, 0x7f, 0x76, 0xf4, 0xe7, 0x61, + 0x00, 0xef, 0xe2, 0x01, 0xbc, 0xa1, 0x8f, 0x28, 0xdd, 0x0a, 0x45, 0xdb, 0xca, 0x6e, 0x35, 0xea, + 0x1d, 0xd3, 0x5f, 0x14, 0xf7, 0xde, 0xdd, 0x6f, 0xdb, 0xce, 0x4e, 0x87, 0x7c, 0x63, 0x07, 0x0c, + 0xbc, 0x77, 0x65, 0x1e, 0x26, 0x34, 0xe3, 0x32, 0xf9, 0x94, 0x8d, 0xa9, 0xb5, 0x97, 0x09, 0xbd, + 0xdc, 0x47, 0xfe, 0x5e, 0x0e, 0xf9, 0x27, 0x8b, 0xb1, 0x9b, 0x3e, 0xf0, 0x3f, 0x39, 0x01, 0xb9, + 0x75, 0xcd, 0x76, 0x30, 0xfa, 0xbf, 0x64, 0x51, 0xe4, 0x6f, 0x80, 0xb9, 0x4d, 0xb3, 0xb5, 0x6b, + 0xe3, 0x36, 0xdf, 0x28, 0x7b, 0x52, 0x47, 0x81, 0xb9, 0x72, 0x13, 0x14, 0xbc, 0x44, 0x46, 0xd6, + 0xdb, 0x86, 0xdf, 0x97, 0x4e, 0x82, 0x9c, 0xdb, 0xeb, 0x9a, 0xe5, 0xd4, 0x36, 0x49, 0x9a, 0x1f, + 0xe4, 0x3c, 0x9c, 0xc8, 0x41, 0x9f, 0x8f, 0x81, 0x7e, 0x22, 0x1a, 0xfa, 0x49, 0x01, 0xe8, 0x95, + 0x22, 0x4c, 0x6e, 0xea, 0x1d, 0x4c, 0x7e, 0x98, 0x22, 0x3f, 0xf4, 0x1b, 0x93, 0x88, 0xec, 0xfd, + 0x31, 0x69, 0x49, 0xef, 0x60, 0xd5, 0xff, 0xcd, 0x9b, 0xc8, 0x40, 0x30, 0x91, 0x59, 0xa5, 0xfe, + 0xb4, 0xae, 0xe1, 0x65, 0x68, 0x3b, 0xd8, 0x5b, 0x7c, 0x33, 0xd8, 0xe1, 0x96, 0xb6, 0xe6, 0x68, + 0x04, 0x8c, 0x19, 0x95, 0x3c, 0xf3, 0x7e, 0x21, 0x72, 0xaf, 0x5f, 0xc8, 0xf3, 0xe4, 0x64, 0x3d, + 0xa2, 0xc7, 0x6c, 0x44, 0x8b, 0xba, 0xe0, 0x01, 0x44, 0x2d, 0x45, 0xff, 0xdd, 0x05, 0xa6, 0xa5, + 0x59, 0xd8, 0x59, 0x0f, 0x7b, 0x62, 0xe4, 0x54, 0x3e, 0x91, 0xb8, 0xf2, 0xd9, 0x75, 0x6d, 0x87, + 0x06, 0x3a, 0x2f, 0xb9, 0xdf, 0x98, 0x8b, 0xd6, 0xbe, 0xf4, 0xa0, 0xff, 0xcd, 0x8d, 0xba, 0xff, + 0xed, 0x57, 0xc7, 0xf4, 0x9b, 0xe1, 0x2b, 0xb3, 0x20, 0x97, 0x76, 0x9d, 0xc7, 0x75, 0xf7, 0xfb, + 0x1d, 0x61, 0x3f, 0x17, 0xd6, 0x9f, 0xed, 0x3a, 0x87, 0xdb, 0xfb, 0x26, 0xd4, 0x12, 0x31, 0x7f, + 0x9a, 0xa8, 0xba, 0xa5, 0xaf, 0x23, 0xaf, 0x97, 0x7d, 0x07, 0xcb, 0x47, 0x32, 0x07, 0x37, 0xcd, + 0x11, 0xed, 0x9f, 0x42, 0x3d, 0x83, 0xff, 0xee, 0x75, 0x3c, 0x59, 0x2e, 0x56, 0x1f, 0xd9, 0x5e, + 0x27, 0xa2, 0x9c, 0x51, 0xe9, 0x0b, 0xfa, 0x35, 0x61, 0xb7, 0x73, 0x2a, 0xb6, 0x58, 0x57, 0xc2, + 0x64, 0x36, 0x95, 0xd8, 0x3d, 0xaf, 0x31, 0xc5, 0xa6, 0x0f, 0xd8, 0xd7, 0xc3, 0xae, 0x82, 0xc5, + 0x03, 0x23, 0x86, 0x5e, 0x21, 0xbc, 0x1d, 0x45, 0xab, 0x3d, 0x60, 0xbd, 0x30, 0x99, 0xbc, 0xc5, + 0x36, 0xab, 0x62, 0x0b, 0x4e, 0x5f, 0xe2, 0x5f, 0x93, 0x21, 0x4f, 0xb7, 0x20, 0xd1, 0x6b, 0x33, + 0x09, 0x2e, 0xc8, 0x77, 0x78, 0x17, 0x42, 0xff, 0x3d, 0xc9, 0x9a, 0x03, 0xe7, 0x6a, 0x98, 0x4d, + 0xe4, 0x6a, 0xc8, 0x9f, 0xe3, 0x14, 0x68, 0x47, 0xb4, 0x8e, 0x29, 0x4f, 0x27, 0x93, 0xb4, 0xb0, + 0xbe, 0x0c, 0xa5, 0x8f, 0xf7, 0x4f, 0xe7, 0x60, 0x86, 0x16, 0x7d, 0x5e, 0x6f, 0x6f, 0x61, 0x07, + 0xbd, 0x45, 0xfa, 0xee, 0x41, 0x5d, 0xa9, 0xc2, 0xcc, 0x25, 0xc2, 0x36, 0xbd, 0x91, 0x85, 0xad, + 0x5c, 0xdc, 0x14, 0xbb, 0xee, 0x41, 0xeb, 0xe9, 0xdd, 0xe1, 0xc2, 0xfd, 0xef, 0xca, 0x98, 0x2e, + 0xf8, 0x53, 0x07, 0xae, 0x3c, 0x31, 0xb2, 0xc2, 0x49, 0xca, 0x49, 0xc8, 0xef, 0xe9, 0xf8, 0x52, + 0xa5, 0xcd, 0xac, 0x5b, 0xf6, 0x86, 0xfe, 0x48, 0x78, 0xdf, 0x36, 0x0c, 0x37, 0xe3, 0x25, 0x5d, + 0x2d, 0x14, 0xdb, 0xbd, 0x1d, 0xc8, 0xd6, 0x18, 0xce, 0x14, 0xf3, 0xf7, 0xa8, 0x96, 0x12, 0x28, + 0x62, 0x94, 0xe1, 0xcc, 0x87, 0xf2, 0x88, 0x3d, 0xb1, 0x42, 0x05, 0x30, 0xe2, 0x2b, 0x56, 0xc5, + 0xe2, 0x4b, 0x0c, 0x28, 0x3a, 0x7d, 0xc9, 0xbf, 0x5a, 0x86, 0xa9, 0x3a, 0x76, 0x96, 0x74, 0xdc, + 0x69, 0xdb, 0xc8, 0x3a, 0xb8, 0x69, 0x74, 0x0b, 0xe4, 0x37, 0x09, 0xb1, 0x41, 0xe7, 0x16, 0x58, + 0x36, 0xf4, 0x4a, 0x49, 0x74, 0x47, 0x98, 0xad, 0xbe, 0x79, 0xdc, 0x8e, 0x04, 0x26, 0x31, 0x8f, + 0xde, 0xf8, 0x92, 0xc7, 0x10, 0xd8, 0x56, 0x86, 0x19, 0x76, 0xf1, 0x62, 0xb1, 0xa3, 0x6f, 0x19, + 0x68, 0x77, 0x04, 0x2d, 0x44, 0xb9, 0x15, 0x72, 0x9a, 0x4b, 0x8d, 0x6d, 0xbd, 0xa2, 0xbe, 0x9d, + 0x27, 0x29, 0x4f, 0xa5, 0x19, 0x13, 0x84, 0x91, 0x0c, 0x14, 0xdb, 0xe3, 0x79, 0x8c, 0x61, 0x24, + 0x07, 0x16, 0x9e, 0x3e, 0x62, 0x9f, 0x97, 0xe1, 0x38, 0x63, 0xe0, 0x1c, 0xb6, 0x1c, 0xbd, 0xa5, + 0x75, 0x28, 0x72, 0x2f, 0xcc, 0x8c, 0x02, 0xba, 0x15, 0x98, 0xdd, 0x0b, 0x93, 0x65, 0x10, 0x9e, + 0xed, 0x0b, 0x21, 0xc7, 0x80, 0xca, 0xff, 0x98, 0x20, 0x1c, 0x1f, 0x27, 0x55, 0x8e, 0xe6, 0x18, + 0xc3, 0xf1, 0x09, 0x33, 0x91, 0x3e, 0xc4, 0x2f, 0x61, 0xa1, 0x79, 0x82, 0xee, 0xf3, 0x33, 0xc2, + 0xd8, 0x6e, 0xc0, 0x34, 0xc1, 0x92, 0xfe, 0xc8, 0x96, 0x21, 0x62, 0x94, 0xd8, 0xef, 0x77, 0xd8, + 0x85, 0x61, 0xfe, 0xbf, 0x6a, 0x98, 0x0e, 0x3a, 0x0f, 0x10, 0x7c, 0x0a, 0x77, 0xd2, 0x99, 0xa8, + 0x4e, 0x5a, 0x12, 0xeb, 0xa4, 0x5f, 0x23, 0x1c, 0x2c, 0xa5, 0x3f, 0xdb, 0x07, 0x57, 0x0f, 0xb1, + 0x30, 0x19, 0x83, 0x4b, 0x4f, 0x5f, 0x2f, 0x5e, 0x9e, 0xed, 0xbd, 0x61, 0xff, 0xfd, 0x23, 0x99, + 0x4f, 0x85, 0xfb, 0x03, 0xb9, 0xa7, 0x3f, 0x38, 0x80, 0x25, 0x7d, 0x23, 0x1c, 0xa5, 0x45, 0x94, + 0x7c, 0xb6, 0x72, 0x34, 0x14, 0x44, 0x4f, 0x32, 0xfa, 0xc0, 0x10, 0x4a, 0x30, 0xe8, 0xfa, 0xff, + 0xb8, 0x4e, 0x2e, 0x99, 0xb1, 0x9b, 0x54, 0x41, 0xa2, 0x38, 0x1b, 0x83, 0x5b, 0x68, 0x96, 0x5a, + 0xbb, 0x1b, 0xe4, 0x4e, 0x37, 0xf4, 0x97, 0xd9, 0x51, 0x8c, 0x08, 0xf7, 0x41, 0x96, 0xb8, 0xb8, + 0xcb, 0x91, 0x4b, 0x1a, 0x41, 0x91, 0xc1, 0x85, 0x7b, 0xf8, 0x61, 0x67, 0xe5, 0x88, 0x4a, 0xfe, + 0x54, 0x6e, 0x82, 0xa3, 0x17, 0xb4, 0xd6, 0xc5, 0x2d, 0xcb, 0xdc, 0x25, 0xb7, 0x5f, 0x99, 0xec, + 0x1a, 0x2d, 0x72, 0x1d, 0x21, 0xff, 0x41, 0xb9, 0xdd, 0x33, 0x1d, 0x72, 0x83, 0x4c, 0x87, 0x95, + 0x23, 0xcc, 0x78, 0x50, 0x6e, 0xf3, 0x3b, 0x9d, 0x7c, 0x6c, 0xa7, 0xb3, 0x72, 0xc4, 0xeb, 0x76, + 0x94, 0x45, 0x98, 0x6c, 0xeb, 0x7b, 0x64, 0xab, 0x9a, 0xcc, 0xba, 0x06, 0x1d, 0x5d, 0x5e, 0xd4, + 0xf7, 0xe8, 0xc6, 0xf6, 0xca, 0x11, 0xd5, 0xff, 0x53, 0x59, 0x86, 0x29, 0xb2, 0x2d, 0x40, 0xc8, + 0x4c, 0x26, 0x3a, 0x96, 0xbc, 0x72, 0x44, 0x0d, 0xfe, 0x75, 0xad, 0x8f, 0x2c, 0x39, 0xfb, 0x71, + 0xaf, 0xb7, 0xdd, 0x9e, 0x49, 0xb4, 0xdd, 0xee, 0xca, 0x82, 0x6e, 0xb8, 0x9f, 0x84, 0x5c, 0x8b, + 0x48, 0x58, 0x62, 0x12, 0xa6, 0xaf, 0xca, 0x5d, 0x90, 0xdd, 0xd1, 0x2c, 0x6f, 0xf2, 0x7c, 0xc3, + 0x60, 0xba, 0x6b, 0x9a, 0x75, 0xd1, 0x45, 0xd0, 0xfd, 0x6b, 0x61, 0x02, 0x72, 0x44, 0x70, 0xfe, + 0x03, 0x7a, 0x7d, 0x96, 0x9a, 0x21, 0x25, 0xd3, 0x70, 0x87, 0xfd, 0x86, 0xe9, 0x1d, 0x90, 0xf9, + 0xa3, 0xcc, 0x68, 0x2c, 0xc8, 0xbe, 0x57, 0xd2, 0xcb, 0x91, 0x57, 0xd2, 0xf7, 0xdc, 0x8d, 0x9c, + 0xed, 0xbd, 0x1b, 0x39, 0x58, 0x3e, 0xc8, 0x0d, 0x76, 0x54, 0xf9, 0xf3, 0x21, 0x4c, 0x97, 0x5e, + 0x41, 0x44, 0xcf, 0xc0, 0x3b, 0xba, 0x11, 0xaa, 0xb3, 0xf7, 0x9a, 0xb0, 0x53, 0x4a, 0x6a, 0xd4, + 0x0c, 0x60, 0x2f, 0xfd, 0xbe, 0xe9, 0x77, 0xb2, 0x70, 0x8a, 0xde, 0xc0, 0xbd, 0x87, 0x1b, 0x26, + 0x7f, 0xdf, 0x24, 0xfa, 0xe8, 0x48, 0x94, 0xa6, 0xcf, 0x80, 0x23, 0xf7, 0x1d, 0x70, 0xf6, 0x1d, + 0x52, 0xce, 0x0e, 0x38, 0xa4, 0x9c, 0x4b, 0xb6, 0x72, 0xf8, 0xee, 0xb0, 0xfe, 0xac, 0xf3, 0xfa, + 0x73, 0x67, 0x04, 0x40, 0xfd, 0xe4, 0x32, 0x12, 0xfb, 0xe6, 0x4d, 0xbe, 0xa6, 0xd4, 0x39, 0x4d, + 0xb9, 0x77, 0x78, 0x46, 0xd2, 0xd7, 0x96, 0x3f, 0xcc, 0xc2, 0x15, 0x01, 0x33, 0x55, 0x7c, 0x89, + 0x29, 0xca, 0xa7, 0x46, 0xa2, 0x28, 0xc9, 0x63, 0x20, 0xa4, 0xad, 0x31, 0x7f, 0x2a, 0x7c, 0x76, + 0xa8, 0x17, 0x28, 0x5f, 0x36, 0x11, 0xca, 0x72, 0x12, 0xf2, 0xb4, 0x87, 0x61, 0xd0, 0xb0, 0xb7, + 0x84, 0xdd, 0x8d, 0xd8, 0x89, 0x23, 0x51, 0xde, 0xc6, 0xa0, 0x3f, 0x6c, 0x5d, 0xa3, 0xb1, 0x6b, + 0x19, 0x15, 0xc3, 0x31, 0xd1, 0x4f, 0x8c, 0x44, 0x71, 0x7c, 0x6f, 0x38, 0x79, 0x18, 0x6f, 0xb8, + 0xa1, 0x56, 0x39, 0xbc, 0x1a, 0x1c, 0xca, 0x2a, 0x47, 0x44, 0xe1, 0xe9, 0xe3, 0xf7, 0x46, 0x19, + 0x4e, 0xb2, 0xc9, 0xd6, 0x02, 0x6f, 0x21, 0xa2, 0x07, 0x47, 0x01, 0xe4, 0x71, 0xcf, 0x4c, 0x62, + 0xb7, 0x9c, 0x91, 0x17, 0xfe, 0xa4, 0x54, 0xec, 0xfd, 0x0e, 0xdc, 0x74, 0xb0, 0x87, 0xc3, 0x91, + 0x20, 0x25, 0x76, 0xad, 0x43, 0x02, 0x36, 0xd2, 0xc7, 0xec, 0xc5, 0x32, 0xe4, 0xe9, 0x39, 0x2d, + 0xb4, 0x91, 0x8a, 0xc3, 0x04, 0x1f, 0xe5, 0x59, 0x60, 0x47, 0x2e, 0xf1, 0x25, 0xf7, 0xe9, 0xed, + 0xc5, 0x1d, 0xd2, 0x2d, 0xf6, 0xdf, 0x90, 0x60, 0xba, 0x8e, 0x9d, 0x92, 0x66, 0x59, 0xba, 0xb6, + 0x35, 0x2a, 0x8f, 0x6f, 0x51, 0xef, 0x61, 0xf4, 0xcd, 0x8c, 0xe8, 0x79, 0x1a, 0x7f, 0x21, 0xdc, + 0x63, 0x35, 0x22, 0x96, 0xe0, 0xa3, 0x42, 0x67, 0x66, 0x06, 0x51, 0x1b, 0x83, 0xc7, 0xb6, 0x04, + 0x13, 0xde, 0x59, 0xbc, 0x5b, 0xb8, 0xf3, 0x99, 0xdb, 0xce, 0x8e, 0x77, 0x0c, 0x86, 0x3c, 0xef, + 0x3f, 0x03, 0x86, 0x5e, 0x96, 0xd0, 0x51, 0x3e, 0xfe, 0x20, 0x61, 0xb2, 0x36, 0x96, 0xc4, 0x1d, + 0xfe, 0xb0, 0x8e, 0x0e, 0xfe, 0xfe, 0x04, 0x5b, 0x8e, 0x5c, 0xd5, 0x1c, 0xfc, 0x30, 0xfa, 0x8c, + 0x0c, 0x13, 0x75, 0xec, 0xb8, 0xe3, 0x2d, 0x77, 0xb9, 0xe9, 0xb0, 0x1a, 0xae, 0x84, 0x56, 0x3c, + 0xa6, 0xd8, 0x1a, 0xc6, 0xfd, 0x30, 0xd5, 0xb5, 0xcc, 0x16, 0xb6, 0x6d, 0xb6, 0x7a, 0x11, 0x76, + 0x54, 0xeb, 0x37, 0xfa, 0x13, 0xd6, 0xe6, 0xd7, 0xbd, 0x7f, 0xd4, 0xe0, 0xf7, 0xa4, 0x66, 0x00, + 0xa5, 0xc4, 0x2a, 0x38, 0x6e, 0x33, 0x20, 0xae, 0xf0, 0xf4, 0x81, 0xfe, 0x84, 0x0c, 0x33, 0x75, + 0xec, 0xf8, 0x52, 0x4c, 0xb0, 0xc9, 0x11, 0x0d, 0x2f, 0x07, 0xa5, 0x7c, 0x30, 0x28, 0xc5, 0xaf, + 0x06, 0xe4, 0xa5, 0xe9, 0x13, 0x1b, 0xe3, 0xd5, 0x80, 0x62, 0x1c, 0x8c, 0xe1, 0xf8, 0xda, 0x13, + 0x61, 0x8a, 0xf0, 0x42, 0x1a, 0xec, 0xcf, 0x66, 0x83, 0xc6, 0xfb, 0xd9, 0x94, 0x1a, 0xef, 0xdd, + 0x90, 0xdb, 0xd1, 0xac, 0x8b, 0x36, 0x69, 0xb8, 0xd3, 0x22, 0x66, 0xfb, 0x9a, 0x9b, 0x5d, 0xa5, + 0x7f, 0xf5, 0xf7, 0xd3, 0xcc, 0x25, 0xf3, 0xd3, 0x7c, 0x54, 0x4a, 0x34, 0x12, 0xd2, 0xb9, 0xc3, + 0x08, 0x9b, 0x7c, 0x82, 0x71, 0x33, 0xa6, 0xec, 0xf4, 0x95, 0xe3, 0x85, 0x32, 0x4c, 0xba, 0xe3, + 0x36, 0xb1, 0xc7, 0xcf, 0x1f, 0x5c, 0x1d, 0xfa, 0x1b, 0xfa, 0x09, 0x7b, 0x60, 0x4f, 0x22, 0xa3, + 0x33, 0xef, 0x13, 0xf4, 0xc0, 0x71, 0x85, 0xa7, 0x8f, 0xc7, 0x9b, 0x29, 0x1e, 0xa4, 0x3d, 0xa0, + 0xdf, 0x92, 0x41, 0x5e, 0xc6, 0xce, 0xb8, 0xad, 0xc8, 0x37, 0x08, 0x87, 0x38, 0xe2, 0x04, 0x46, + 0x78, 0x9e, 0x5f, 0xc6, 0xa3, 0x69, 0x40, 0x62, 0xb1, 0x8d, 0x84, 0x18, 0x48, 0x1f, 0xb5, 0xb7, + 0x53, 0xd4, 0xe8, 0xe6, 0xc2, 0x8f, 0x8f, 0xa0, 0x57, 0x1d, 0xef, 0xc2, 0x87, 0x27, 0x40, 0x42, + 0xe3, 0xb0, 0xda, 0x5b, 0xbf, 0xc2, 0xc7, 0x72, 0x15, 0x1f, 0xb8, 0x8d, 0x7d, 0x1b, 0xb7, 0x2e, + 0xe2, 0x36, 0xfa, 0x91, 0x83, 0x43, 0x77, 0x0a, 0x26, 0x5a, 0x94, 0x1a, 0x01, 0x6f, 0x52, 0xf5, + 0x5e, 0x13, 0xdc, 0x2b, 0xcd, 0x77, 0x44, 0xf4, 0xf7, 0x31, 0xde, 0x2b, 0x2d, 0x50, 0xfc, 0x18, + 0xcc, 0x16, 0x3a, 0xcb, 0xa8, 0xb4, 0x4c, 0x03, 0xfd, 0x97, 0x83, 0xc3, 0x72, 0x0d, 0x4c, 0xe9, + 0x2d, 0xd3, 0x20, 0x61, 0x28, 0xbc, 0x43, 0x40, 0x7e, 0x82, 0xf7, 0xb5, 0xbc, 0x63, 0x3e, 0xa4, + 0xb3, 0x5d, 0xf3, 0x20, 0x61, 0x58, 0x63, 0xc2, 0x65, 0xfd, 0xb0, 0x8c, 0x89, 0x3e, 0x65, 0xa7, + 0x0f, 0xd9, 0x07, 0x02, 0xef, 0x36, 0xda, 0x15, 0x3e, 0x2e, 0x56, 0x81, 0x87, 0x19, 0xce, 0xc2, + 0xb5, 0x38, 0x94, 0xe1, 0x2c, 0x86, 0x81, 0x31, 0xdc, 0x58, 0x11, 0xe0, 0x98, 0xfa, 0x1a, 0xf0, + 0x01, 0xd0, 0x19, 0x9d, 0x79, 0x38, 0x24, 0x3a, 0x87, 0x63, 0x22, 0xbe, 0x8b, 0x85, 0xc8, 0x64, + 0x16, 0x0f, 0xfa, 0xaf, 0xa3, 0x00, 0xe7, 0xce, 0x61, 0xfc, 0x15, 0xa8, 0xb7, 0x42, 0x82, 0x1b, + 0xb1, 0xf7, 0x49, 0xd0, 0xa5, 0x32, 0xc6, 0xbb, 0xe2, 0x45, 0xca, 0x4f, 0x1f, 0xc0, 0x17, 0xc8, + 0x30, 0x47, 0x7c, 0x04, 0x3a, 0x58, 0xb3, 0x68, 0x47, 0x39, 0x12, 0x47, 0xf9, 0x37, 0x0b, 0x07, + 0xf8, 0xe1, 0xe5, 0x10, 0xf0, 0x31, 0x12, 0x28, 0xc4, 0xa2, 0xfb, 0x08, 0xb2, 0x30, 0x96, 0x6d, + 0x94, 0x82, 0xcf, 0x02, 0x53, 0xf1, 0xd1, 0xe0, 0x91, 0xd0, 0x23, 0x97, 0x17, 0x86, 0xd7, 0xd8, + 0xc6, 0xec, 0x91, 0x2b, 0xc2, 0x44, 0xfa, 0x98, 0xfc, 0xd6, 0xad, 0x6c, 0xc1, 0xb9, 0x41, 0x2e, + 0x8c, 0x7f, 0x45, 0xd6, 0x3f, 0xd1, 0xf6, 0x89, 0x91, 0x78, 0x60, 0x1e, 0x20, 0x20, 0xbe, 0x02, + 0x59, 0xcb, 0xbc, 0x44, 0x97, 0xb6, 0x66, 0x55, 0xf2, 0x4c, 0xaf, 0xa7, 0xec, 0xec, 0xee, 0x18, + 0xf4, 0x64, 0xe8, 0xac, 0xea, 0xbd, 0x2a, 0xd7, 0xc3, 0xec, 0x25, 0xdd, 0xd9, 0x5e, 0xc1, 0x5a, + 0x1b, 0x5b, 0xaa, 0x79, 0x89, 0x78, 0xcc, 0x4d, 0xaa, 0x7c, 0x22, 0xef, 0xbf, 0x22, 0x60, 0x5f, + 0x92, 0x5b, 0xe4, 0xc7, 0x72, 0xfc, 0x2d, 0x89, 0xe5, 0x19, 0xcd, 0x55, 0xfa, 0x0a, 0xf3, 0x0e, + 0x19, 0xa6, 0x54, 0xf3, 0x12, 0x53, 0x92, 0xff, 0xe3, 0x70, 0x75, 0x24, 0xf1, 0x44, 0x8f, 0x48, + 0xce, 0x67, 0x7f, 0xec, 0x13, 0xbd, 0xd8, 0xe2, 0xc7, 0x72, 0x72, 0x69, 0x46, 0x35, 0x2f, 0xd5, + 0xb1, 0x43, 0x5b, 0x04, 0x6a, 0x8e, 0xc8, 0xc9, 0x5a, 0xb7, 0x29, 0x41, 0x36, 0x0f, 0xf7, 0xdf, + 0x93, 0xee, 0x22, 0xf8, 0x02, 0xf2, 0x59, 0x1c, 0xf7, 0x2e, 0xc2, 0x40, 0x0e, 0xc6, 0x10, 0x23, + 0x45, 0x86, 0x69, 0xd5, 0xbc, 0xe4, 0x0e, 0x0d, 0x4b, 0x7a, 0xa7, 0x33, 0x9a, 0x11, 0x32, 0xa9, + 0xf1, 0xef, 0x89, 0xc1, 0xe3, 0x62, 0xec, 0xc6, 0xff, 0x00, 0x06, 0xd2, 0x87, 0xe1, 0x79, 0xb4, + 0xb1, 0x78, 0x23, 0xb4, 0x31, 0x1a, 0x1c, 0x86, 0x6d, 0x10, 0x3e, 0x1b, 0x87, 0xd6, 0x20, 0xa2, + 0x38, 0x18, 0xcb, 0xce, 0xc9, 0x5c, 0x89, 0x0c, 0xf3, 0xa3, 0x6d, 0x13, 0x6f, 0x4d, 0xe6, 0x9a, + 0xc8, 0x86, 0x5d, 0x8e, 0x91, 0x91, 0xa0, 0x91, 0xc0, 0x05, 0x51, 0x80, 0x87, 0xf4, 0xf1, 0x78, + 0xaf, 0x0c, 0x33, 0x94, 0x85, 0xc7, 0x89, 0x15, 0x30, 0x54, 0xa3, 0x0a, 0xd7, 0xe0, 0x70, 0x1a, + 0x55, 0x0c, 0x07, 0x63, 0xb9, 0x15, 0xd4, 0xb5, 0xe3, 0x86, 0x38, 0x3e, 0x1e, 0x85, 0xe0, 0xd0, + 0xc6, 0xd8, 0x08, 0x8f, 0x90, 0x0f, 0x63, 0x8c, 0x1d, 0xd2, 0x31, 0xf2, 0xe7, 0xf9, 0xad, 0x68, + 0x94, 0x18, 0x1c, 0xa0, 0x29, 0x8c, 0x10, 0x86, 0x21, 0x9b, 0xc2, 0x21, 0x21, 0xf1, 0x05, 0x19, + 0x80, 0x32, 0xb0, 0x66, 0xee, 0x91, 0xcb, 0x7c, 0x46, 0xd0, 0x9d, 0xf5, 0xba, 0xd5, 0xcb, 0x03, + 0xdc, 0xea, 0x13, 0x86, 0x70, 0x49, 0xba, 0x12, 0x18, 0x92, 0xb2, 0x5b, 0xc9, 0xb1, 0xaf, 0x04, + 0xc6, 0x97, 0x9f, 0x3e, 0xc6, 0x8f, 0x51, 0x6b, 0x2e, 0x38, 0x60, 0xfa, 0x2b, 0x23, 0x41, 0x39, + 0x34, 0xfb, 0x97, 0xf9, 0xd9, 0xff, 0x01, 0xb0, 0x1d, 0xd6, 0x46, 0x1c, 0x74, 0x70, 0x34, 0x7d, + 0x1b, 0xf1, 0xf0, 0x0e, 0x88, 0xfe, 0x78, 0x16, 0x8e, 0xb2, 0x4e, 0xe4, 0xbb, 0x01, 0xe2, 0x84, + 0xe7, 0xf0, 0xb8, 0x4e, 0x72, 0x00, 0xca, 0xa3, 0x5a, 0x90, 0x4a, 0xb2, 0x94, 0x29, 0xc0, 0xde, + 0x58, 0x56, 0x37, 0xf2, 0xe5, 0x87, 0xbb, 0x9a, 0xd1, 0x16, 0x0f, 0xf7, 0x3b, 0x00, 0x78, 0x6f, + 0xad, 0x51, 0xe6, 0xd7, 0x1a, 0xfb, 0xac, 0x4c, 0x26, 0xde, 0xb9, 0x26, 0x22, 0xa3, 0xec, 0x8e, + 0x7d, 0xe7, 0x3a, 0xba, 0xec, 0xf4, 0x51, 0x7a, 0xab, 0x0c, 0xd9, 0xba, 0x69, 0x39, 0xe8, 0xf9, + 0x49, 0x5a, 0x27, 0x95, 0x7c, 0x00, 0x92, 0xf7, 0xae, 0x94, 0xb8, 0x5b, 0x9a, 0x6f, 0x89, 0x3f, + 0xea, 0xac, 0x39, 0x1a, 0xf1, 0xea, 0x76, 0xcb, 0x0f, 0x5d, 0xd7, 0x9c, 0x34, 0x9e, 0x0e, 0x95, + 0x5f, 0x3d, 0xfa, 0x00, 0x46, 0x6a, 0xf1, 0x74, 0x22, 0x4b, 0x4e, 0x1f, 0xb7, 0x57, 0x1d, 0x65, + 0xbe, 0xad, 0x4b, 0x7a, 0x07, 0xa3, 0xe7, 0x53, 0x97, 0x91, 0xaa, 0xb6, 0x83, 0xc5, 0x8f, 0xc4, + 0xc4, 0xba, 0xb6, 0x92, 0xf8, 0xb2, 0x72, 0x10, 0x5f, 0x36, 0x69, 0x83, 0xa2, 0x07, 0xd0, 0x29, + 0x4b, 0xe3, 0x6e, 0x50, 0x31, 0x65, 0x8f, 0x25, 0x4e, 0xe7, 0xb1, 0x3a, 0x76, 0xa8, 0x51, 0x59, + 0xf3, 0x6e, 0x60, 0xf9, 0xd1, 0x91, 0x44, 0xec, 0xf4, 0x2f, 0x78, 0x91, 0x7b, 0x2e, 0x78, 0x79, + 0x47, 0x18, 0x9c, 0x35, 0x1e, 0x9c, 0x1f, 0x8c, 0x16, 0x10, 0xcf, 0xe4, 0x48, 0x60, 0x7a, 0x83, + 0x0f, 0xd3, 0x3a, 0x07, 0xd3, 0x5d, 0x43, 0x72, 0x91, 0x3e, 0x60, 0x3f, 0x97, 0x83, 0xa3, 0x74, + 0xd2, 0x5f, 0x34, 0xda, 0x2c, 0xc2, 0xea, 0x6b, 0xa5, 0x43, 0xde, 0x6c, 0xdb, 0x1f, 0x82, 0x95, + 0x8b, 0xe5, 0x9c, 0xeb, 0xbd, 0x1d, 0x7f, 0x81, 0x86, 0x73, 0x75, 0x3b, 0x51, 0xb2, 0xd3, 0x26, + 0x7e, 0x43, 0xbe, 0xff, 0x1f, 0x7f, 0x97, 0xd1, 0x84, 0xf8, 0x5d, 0x46, 0x7f, 0x96, 0x6c, 0xdd, + 0x8e, 0x14, 0xdd, 0x23, 0xf0, 0x94, 0x6d, 0xa7, 0x04, 0x2b, 0x7a, 0x02, 0xdc, 0x7d, 0x6f, 0xb8, + 0x93, 0x05, 0x11, 0x44, 0x86, 0x74, 0x27, 0x23, 0x04, 0x0e, 0xd3, 0x9d, 0x6c, 0x10, 0x03, 0x63, + 0xb8, 0xd5, 0x3e, 0xc7, 0x76, 0xf3, 0x49, 0xbb, 0x41, 0x7f, 0x2d, 0xa5, 0x3e, 0x4a, 0x7f, 0x2b, + 0x93, 0xc8, 0xff, 0x99, 0xf0, 0x15, 0x3f, 0x4c, 0x27, 0xf1, 0x68, 0x8e, 0x23, 0x37, 0x86, 0x75, + 0x23, 0x89, 0xf8, 0xa2, 0x9f, 0xd7, 0xdb, 0xce, 0xf6, 0x88, 0x4e, 0x74, 0x5c, 0x72, 0x69, 0x79, + 0xd7, 0x23, 0x93, 0x17, 0xf4, 0x6f, 0x99, 0x44, 0x21, 0xa4, 0x7c, 0x91, 0x10, 0xb6, 0x22, 0x44, + 0x9c, 0x20, 0xf0, 0x53, 0x2c, 0xbd, 0x31, 0x6a, 0xf4, 0x39, 0xbd, 0x8d, 0xcd, 0xc7, 0xa1, 0x46, + 0x13, 0xbe, 0x46, 0xa7, 0xd1, 0x71, 0xe4, 0xbe, 0x47, 0x35, 0xda, 0x17, 0xc9, 0x88, 0x34, 0x3a, + 0x96, 0x5e, 0xfa, 0x32, 0x7e, 0xd9, 0x0c, 0x9b, 0x48, 0xad, 0xea, 0xc6, 0x45, 0xf4, 0xcf, 0x79, + 0xef, 0x62, 0xe6, 0xf3, 0xba, 0xb3, 0xcd, 0x62, 0xc1, 0xfc, 0xa1, 0xf0, 0xdd, 0x28, 0x43, 0xc4, + 0x7b, 0xe1, 0xc3, 0x49, 0xe5, 0xf6, 0x85, 0x93, 0x2a, 0xc2, 0xac, 0x6e, 0x38, 0xd8, 0x32, 0xb4, + 0xce, 0x52, 0x47, 0xdb, 0xb2, 0x4f, 0x4d, 0xf4, 0xbd, 0xbc, 0xae, 0x12, 0xca, 0xa3, 0xf2, 0x7f, + 0x84, 0xaf, 0xaf, 0x9c, 0xe4, 0xaf, 0xaf, 0x8c, 0x88, 0x7e, 0x35, 0x15, 0x1d, 0xfd, 0xca, 0x8f, + 0x6e, 0x05, 0x83, 0x83, 0x63, 0x8b, 0xda, 0xc6, 0x09, 0xc3, 0xfd, 0xdd, 0x22, 0x18, 0x85, 0xcd, + 0x0f, 0xfd, 0xf8, 0x1b, 0x72, 0xa2, 0xd5, 0x3d, 0x57, 0x11, 0xe6, 0x7b, 0x95, 0x20, 0xb1, 0x85, + 0x1a, 0xae, 0xbc, 0xdc, 0x53, 0x79, 0xdf, 0xe4, 0xc9, 0x0a, 0x98, 0x3c, 0x61, 0xa5, 0xca, 0x89, + 0x29, 0x55, 0x92, 0xc5, 0x42, 0x91, 0xda, 0x8e, 0xe1, 0x34, 0x52, 0x0e, 0x8e, 0x79, 0xd1, 0x6e, + 0xbb, 0x5d, 0xac, 0x59, 0x9a, 0xd1, 0xc2, 0xe8, 0x03, 0xd2, 0x28, 0xcc, 0xde, 0x25, 0x98, 0xd4, + 0x5b, 0xa6, 0x51, 0xd7, 0x9f, 0xed, 0x5d, 0x2e, 0x17, 0x1f, 0x64, 0x9d, 0x48, 0xa4, 0xc2, 0xfe, + 0x50, 0xfd, 0x7f, 0x95, 0x0a, 0x4c, 0xb5, 0x34, 0xab, 0x4d, 0x83, 0xf0, 0xe5, 0x7a, 0x2e, 0x72, + 0x8a, 0x24, 0x54, 0xf2, 0x7e, 0x51, 0x83, 0xbf, 0x95, 0x1a, 0x2f, 0xc4, 0x7c, 0x4f, 0x34, 0x8f, + 0x48, 0x62, 0x8b, 0xc1, 0x4f, 0x9c, 0xcc, 0x5d, 0xe9, 0x58, 0xb8, 0x43, 0xee, 0xa0, 0xa7, 0x3d, + 0xc4, 0x94, 0x1a, 0x24, 0x24, 0x5d, 0x1e, 0x20, 0x45, 0xed, 0x43, 0x63, 0xdc, 0xcb, 0x03, 0x42, + 0x5c, 0xa4, 0xaf, 0x99, 0x6f, 0xca, 0xc3, 0x2c, 0xed, 0xd5, 0x98, 0x38, 0xd1, 0x0b, 0xc8, 0x15, + 0xd2, 0xce, 0x03, 0xf8, 0x32, 0xaa, 0x1f, 0x7c, 0x4c, 0x2e, 0x80, 0x7c, 0xd1, 0x0f, 0x38, 0xe8, + 0x3e, 0x26, 0xdd, 0xb7, 0xf7, 0xf8, 0x9a, 0xa7, 0x3c, 0x8d, 0x7b, 0xdf, 0x3e, 0xbe, 0xf8, 0xf4, + 0xf1, 0xf9, 0x79, 0x19, 0xe4, 0x62, 0xbb, 0x8d, 0x5a, 0x07, 0x87, 0xe2, 0x0c, 0x4c, 0x7b, 0x6d, + 0x26, 0x88, 0x01, 0x19, 0x4e, 0x4a, 0xba, 0x08, 0xea, 0xcb, 0xa6, 0xd8, 0x1e, 0xfb, 0xae, 0x42, + 0x4c, 0xd9, 0xe9, 0x83, 0xf2, 0x2b, 0x13, 0xac, 0xd1, 0x2c, 0x98, 0xe6, 0x45, 0x72, 0x54, 0xe6, + 0xf9, 0x32, 0xe4, 0x96, 0xb0, 0xd3, 0xda, 0x1e, 0x51, 0x9b, 0xd9, 0xb5, 0x3a, 0x5e, 0x9b, 0xd9, + 0x77, 0x1f, 0xfe, 0x60, 0x1b, 0xd6, 0x63, 0x6b, 0x9e, 0xb0, 0x34, 0xee, 0xe8, 0xce, 0xb1, 0xa5, + 0xa7, 0x0f, 0xce, 0xbf, 0xc9, 0x30, 0xe7, 0xaf, 0x70, 0x51, 0x4c, 0x7e, 0x2e, 0xf3, 0x78, 0x5b, + 0xef, 0x44, 0x9f, 0x4a, 0x16, 0x22, 0xcd, 0x97, 0x29, 0x5f, 0xb3, 0x94, 0x17, 0x16, 0x13, 0x04, + 0x4f, 0x13, 0x63, 0x70, 0x0c, 0x33, 0x78, 0x19, 0x26, 0x09, 0x43, 0x8b, 0xfa, 0x1e, 0x71, 0x1d, + 0xe4, 0x16, 0x1a, 0x9f, 0x33, 0x92, 0x85, 0xc6, 0xbb, 0xf8, 0x85, 0x46, 0xc1, 0x88, 0xc7, 0xde, + 0x3a, 0x63, 0x42, 0x5f, 0x1a, 0xf7, 0xff, 0x91, 0x2f, 0x33, 0x26, 0xf0, 0xa5, 0x19, 0x50, 0x7e, + 0xfa, 0x88, 0xfe, 0xc6, 0x7f, 0x62, 0x9d, 0xad, 0xb7, 0xa1, 0x8a, 0xfe, 0xe7, 0x31, 0xc8, 0x9e, + 0x73, 0x1f, 0xfe, 0x77, 0x70, 0x23, 0xd6, 0x4b, 0x47, 0x10, 0x9c, 0xe1, 0x1e, 0xc8, 0xba, 0xf4, + 0xd9, 0xb4, 0xe5, 0x26, 0xb1, 0xdd, 0x5d, 0x97, 0x11, 0x95, 0xfc, 0xa7, 0x9c, 0x84, 0xbc, 0x6d, + 0xee, 0x5a, 0x2d, 0xd7, 0x7c, 0x76, 0x35, 0x86, 0xbd, 0x25, 0x0d, 0x4a, 0xca, 0x91, 0x9e, 0x1f, + 0x9d, 0xcb, 0x68, 0xe8, 0x82, 0x24, 0x99, 0xbb, 0x20, 0x29, 0xc1, 0xfe, 0x81, 0x00, 0x6f, 0xe9, + 0x6b, 0xc4, 0x5f, 0x93, 0xbb, 0x02, 0xdb, 0xa3, 0x82, 0x3d, 0x42, 0x2c, 0x07, 0x55, 0x87, 0xa4, + 0x0e, 0xdf, 0xbc, 0x68, 0xfd, 0x38, 0xf0, 0x63, 0x75, 0xf8, 0x16, 0xe0, 0x61, 0x2c, 0xa7, 0xd4, + 0xf3, 0xcc, 0x49, 0xf5, 0xc1, 0x51, 0xa2, 0x9b, 0xe5, 0x94, 0xfe, 0x40, 0xe8, 0x8c, 0xd0, 0x79, + 0x75, 0x68, 0x74, 0x0e, 0xc9, 0x7d, 0xf5, 0x8f, 0x65, 0x12, 0x09, 0xd3, 0x33, 0x72, 0xc4, 0x2f, + 0x3a, 0x4a, 0x0c, 0x91, 0x3b, 0x06, 0x73, 0x71, 0xa0, 0x67, 0x87, 0x0f, 0x0d, 0xce, 0x8b, 0x2e, + 0xc4, 0xff, 0xb8, 0x43, 0x83, 0x8b, 0x32, 0x92, 0x3e, 0x90, 0xbf, 0x49, 0x2f, 0x16, 0x2b, 0xb6, + 0x1c, 0x7d, 0x6f, 0xc4, 0x2d, 0x8d, 0x1f, 0x5e, 0x12, 0x46, 0x03, 0xde, 0x27, 0x21, 0xca, 0xe1, + 0xb8, 0xa3, 0x01, 0x8b, 0xb1, 0x91, 0x3e, 0x4c, 0x5f, 0xce, 0xbb, 0xd2, 0x63, 0x6b, 0x33, 0xbf, + 0xc5, 0x56, 0x03, 0xf0, 0xc1, 0xd1, 0x3a, 0x0b, 0x33, 0xa1, 0xa9, 0xbf, 0x77, 0x61, 0x0d, 0x97, + 0x96, 0xf4, 0xa0, 0xbb, 0x2f, 0xb2, 0x91, 0x2f, 0x0c, 0x24, 0x58, 0xf0, 0x15, 0x61, 0x62, 0x2c, + 0xf7, 0xc1, 0x79, 0x63, 0xd8, 0x98, 0xb0, 0xfa, 0xc3, 0x30, 0x56, 0x35, 0x1e, 0xab, 0x3b, 0x44, + 0xc4, 0x24, 0x36, 0xa6, 0x09, 0xcd, 0x1b, 0xdf, 0xe8, 0xc3, 0xa5, 0x72, 0x70, 0xdd, 0x33, 0x34, + 0x1f, 0xe9, 0x23, 0xf6, 0xab, 0xb4, 0x3b, 0xac, 0x53, 0x93, 0x7d, 0x34, 0xdd, 0x21, 0x9b, 0x0d, + 0xc8, 0xdc, 0x6c, 0x20, 0xa1, 0xbf, 0x7d, 0xe0, 0x46, 0xea, 0x31, 0x37, 0x08, 0xa2, 0xec, 0x88, + 0xfd, 0xed, 0x07, 0x72, 0x90, 0x3e, 0x38, 0xff, 0x28, 0x03, 0x2c, 0x5b, 0xe6, 0x6e, 0xb7, 0x66, + 0xb5, 0xb1, 0x85, 0xfe, 0x36, 0x98, 0x00, 0xfc, 0xc2, 0x08, 0x26, 0x00, 0xeb, 0x00, 0x5b, 0x3e, + 0x71, 0xa6, 0xe1, 0xb7, 0x8a, 0x99, 0xfb, 0x01, 0x53, 0x6a, 0x88, 0x06, 0x7f, 0xe5, 0xec, 0x0f, + 0xf1, 0x18, 0xc7, 0xf5, 0x59, 0x01, 0xb9, 0x51, 0x4e, 0x00, 0xde, 0xec, 0x63, 0xdd, 0xe0, 0xb0, + 0xbe, 0xef, 0x00, 0x9c, 0xa4, 0x8f, 0xf9, 0x3f, 0x4d, 0xc0, 0x34, 0xdd, 0xae, 0xa3, 0x32, 0xfd, + 0xfb, 0x00, 0xf4, 0x5f, 0x19, 0x01, 0xe8, 0x1b, 0x30, 0x63, 0x06, 0xd4, 0x69, 0x9f, 0x1a, 0x5e, + 0x80, 0x89, 0x85, 0x3d, 0xc4, 0x97, 0xca, 0x91, 0x41, 0xef, 0x0b, 0x23, 0xaf, 0xf2, 0xc8, 0xdf, + 0x15, 0x23, 0xef, 0x10, 0xc5, 0x51, 0x42, 0xff, 0x16, 0x1f, 0xfa, 0x0d, 0x0e, 0xfa, 0xe2, 0x41, + 0x58, 0x19, 0x43, 0xb8, 0x7d, 0x19, 0xb2, 0xe4, 0x74, 0xdc, 0xef, 0xa4, 0x38, 0xbf, 0x3f, 0x05, + 0x13, 0xa4, 0xc9, 0xfa, 0xf3, 0x0e, 0xef, 0xd5, 0xfd, 0xa2, 0x6d, 0x3a, 0xd8, 0xf2, 0x3d, 0x16, + 0xbc, 0x57, 0x97, 0x07, 0xcf, 0x2b, 0xd9, 0x3e, 0x95, 0xa7, 0x1b, 0x91, 0x7e, 0xc2, 0xd0, 0x93, + 0x92, 0xb0, 0xc4, 0x47, 0x76, 0x5e, 0x6e, 0x98, 0x49, 0xc9, 0x00, 0x46, 0xd2, 0x07, 0xfe, 0x2f, + 0xb3, 0x70, 0x8a, 0xae, 0x2a, 0x2d, 0x59, 0xe6, 0x4e, 0xcf, 0xed, 0x56, 0xfa, 0xc1, 0x75, 0xe1, + 0x06, 0x98, 0x73, 0x38, 0x7f, 0x6c, 0xa6, 0x13, 0x3d, 0xa9, 0xe8, 0xcf, 0xc3, 0x3e, 0x15, 0xcf, + 0xe2, 0x91, 0x5c, 0x88, 0x11, 0x60, 0x14, 0xef, 0x89, 0x17, 0xea, 0x05, 0x19, 0x0d, 0x2d, 0x52, + 0xc9, 0x43, 0xad, 0x59, 0xfa, 0x3a, 0x95, 0x13, 0xd1, 0xa9, 0x77, 0xfa, 0x3a, 0xf5, 0x23, 0x9c, + 0x4e, 0x2d, 0x1f, 0x5c, 0x24, 0xe9, 0xeb, 0xd6, 0x2b, 0xfc, 0x8d, 0x21, 0x7f, 0xdb, 0x6e, 0x27, + 0x85, 0xcd, 0xba, 0xb0, 0x3f, 0x52, 0x96, 0xf3, 0x47, 0xe2, 0xef, 0xa3, 0x48, 0x30, 0x13, 0xe6, + 0xb9, 0x8e, 0xd0, 0xa5, 0x39, 0x90, 0x74, 0x8f, 0x3b, 0x49, 0x6f, 0x0f, 0x35, 0xd7, 0x8d, 0x2d, + 0x68, 0x0c, 0x6b, 0x4b, 0x73, 0x90, 0x5f, 0xd2, 0x3b, 0x0e, 0xb6, 0xd0, 0x63, 0x6c, 0xa6, 0xfb, + 0x8a, 0x14, 0x07, 0x80, 0x45, 0xc8, 0x6f, 0x92, 0xd2, 0x98, 0xc9, 0x7c, 0xb3, 0x58, 0xeb, 0xa1, + 0x1c, 0xaa, 0xec, 0xdf, 0xa4, 0xd1, 0xf9, 0x7a, 0xc8, 0x8c, 0x6c, 0x8a, 0x9c, 0x20, 0x3a, 0xdf, + 0x60, 0x16, 0xc6, 0x72, 0x31, 0x55, 0x5e, 0xc5, 0x3b, 0xee, 0x18, 0x7f, 0x31, 0x3d, 0x84, 0x0b, + 0x20, 0xeb, 0x6d, 0x9b, 0x74, 0x8e, 0x53, 0xaa, 0xfb, 0x98, 0xd4, 0x57, 0xa8, 0x57, 0x54, 0x94, + 0xe5, 0x71, 0xfb, 0x0a, 0x09, 0x71, 0x91, 0x3e, 0x66, 0xdf, 0x22, 0x8e, 0xa2, 0xdd, 0x8e, 0xd6, + 0xc2, 0x2e, 0xf7, 0xa9, 0xa1, 0x46, 0x7b, 0xb2, 0xac, 0xd7, 0x93, 0x85, 0xda, 0x69, 0xee, 0x00, + 0xed, 0x74, 0xd8, 0x65, 0x48, 0x5f, 0xe6, 0xa4, 0xe2, 0x87, 0xb6, 0x0c, 0x19, 0xcb, 0xc6, 0x18, + 0xae, 0x1d, 0xf5, 0x0e, 0xd2, 0x8e, 0xb5, 0xb5, 0x0e, 0xbb, 0x49, 0xc3, 0x84, 0x35, 0xb2, 0x43, + 0xb3, 0xc3, 0x6c, 0xd2, 0x44, 0xf3, 0x30, 0x06, 0xb4, 0xe6, 0x18, 0x5a, 0x9f, 0x64, 0xc3, 0x68, + 0xca, 0xfb, 0xa4, 0xb6, 0x69, 0x39, 0xc9, 0xf6, 0x49, 0x5d, 0xee, 0x54, 0xf2, 0x5f, 0xd2, 0x83, + 0x57, 0xfc, 0xb9, 0xea, 0x51, 0x0d, 0x9f, 0x09, 0x0e, 0x5e, 0x0d, 0x62, 0x20, 0x7d, 0x78, 0x5f, + 0x77, 0x48, 0x83, 0xe7, 0xb0, 0xcd, 0x91, 0xb5, 0x81, 0x91, 0x0d, 0x9d, 0xc3, 0x34, 0xc7, 0x68, + 0x1e, 0xd2, 0xc7, 0xeb, 0xeb, 0xa1, 0x81, 0xf3, 0x35, 0x63, 0x1c, 0x38, 0xbd, 0x96, 0x99, 0x1b, + 0xb2, 0x65, 0x0e, 0xbb, 0xff, 0xc3, 0x64, 0x3d, 0xba, 0x01, 0x73, 0x98, 0xfd, 0x9f, 0x18, 0x26, + 0xd2, 0x47, 0xfc, 0xb5, 0x32, 0xe4, 0xea, 0xe3, 0x1f, 0x2f, 0x87, 0x9d, 0x8b, 0x10, 0x59, 0xd5, + 0x47, 0x36, 0x5c, 0x0e, 0x33, 0x17, 0x89, 0x64, 0x61, 0x0c, 0x81, 0xf7, 0x8f, 0xc2, 0x0c, 0x59, + 0x12, 0xf1, 0xb6, 0x59, 0xbf, 0xce, 0x46, 0xcd, 0x47, 0x53, 0x6c, 0xab, 0xf7, 0xc3, 0xa4, 0xb7, + 0x7f, 0xc7, 0x46, 0xce, 0x79, 0xb1, 0xf6, 0xe9, 0x71, 0xa9, 0xfa, 0xff, 0x1f, 0xc8, 0x19, 0x62, + 0xe4, 0x7b, 0xb5, 0xc3, 0x3a, 0x43, 0x1c, 0xea, 0x7e, 0xed, 0x9f, 0x05, 0x23, 0xea, 0x7f, 0x49, + 0x0f, 0xf3, 0xde, 0x7d, 0xdc, 0x6c, 0x9f, 0x7d, 0xdc, 0x0f, 0x84, 0xb1, 0xac, 0xf3, 0x58, 0xde, + 0x2d, 0x2a, 0xc2, 0x11, 0x8e, 0xb5, 0x6f, 0xf5, 0xe1, 0x3c, 0xc7, 0xc1, 0xb9, 0x70, 0x20, 0x5e, + 0xc6, 0x70, 0xf0, 0x31, 0x1b, 0x8c, 0xb9, 0x1f, 0x4c, 0xb1, 0x1d, 0xf7, 0x9c, 0xaa, 0xc8, 0xee, + 0x3b, 0x55, 0xc1, 0xb5, 0xf4, 0xdc, 0x01, 0x5b, 0xfa, 0x07, 0xc3, 0xda, 0xd1, 0xe0, 0xb5, 0xe3, + 0x1e, 0x71, 0x44, 0x46, 0x37, 0x32, 0xbf, 0xcd, 0x57, 0x8f, 0xf3, 0x9c, 0x7a, 0x94, 0x0e, 0xc6, + 0x4c, 0xfa, 0xfa, 0xf1, 0x61, 0x6f, 0x42, 0x7b, 0xc8, 0xed, 0x7d, 0xd8, 0xad, 0x62, 0x4e, 0x88, + 0x23, 0x1b, 0xb9, 0x87, 0xd9, 0x2a, 0x1e, 0xc4, 0xc9, 0x18, 0x62, 0xb1, 0xcd, 0xc2, 0x34, 0xe1, + 0xe9, 0xbc, 0xde, 0xde, 0xc2, 0x0e, 0xfa, 0x0d, 0xea, 0xa3, 0xe8, 0x45, 0xbe, 0x1c, 0x51, 0x78, + 0xa2, 0xa8, 0xf3, 0xae, 0x49, 0x3d, 0x3a, 0x28, 0x93, 0xf3, 0x21, 0x06, 0xc7, 0x1d, 0x41, 0x71, + 0x20, 0x07, 0xe9, 0x43, 0xf6, 0x3e, 0xea, 0x6e, 0xb3, 0xaa, 0x5d, 0x36, 0x77, 0x1d, 0xf4, 0xc8, + 0x08, 0x3a, 0xe8, 0x05, 0xc8, 0x77, 0x08, 0x35, 0x76, 0x2c, 0x23, 0x7e, 0xba, 0xc3, 0x44, 0x40, + 0xcb, 0x57, 0xd9, 0x9f, 0x49, 0xcf, 0x66, 0x04, 0x72, 0xa4, 0x74, 0xc6, 0x7d, 0x36, 0x63, 0x40, + 0xf9, 0x63, 0xb9, 0x63, 0x67, 0xd2, 0x2d, 0x5d, 0xdf, 0xd1, 0x9d, 0x11, 0x45, 0x70, 0xe8, 0xb8, + 0xb4, 0xbc, 0x08, 0x0e, 0xe4, 0x25, 0xe9, 0x89, 0xd1, 0x90, 0x54, 0xdc, 0xdf, 0xc7, 0x7d, 0x62, + 0x34, 0xbe, 0xf8, 0xf4, 0x31, 0xf9, 0x25, 0xda, 0xb2, 0xce, 0x51, 0xe7, 0xdb, 0x14, 0xfd, 0x7a, + 0x87, 0x6e, 0x2c, 0x94, 0xb5, 0xc3, 0x6b, 0x2c, 0x7d, 0xcb, 0x4f, 0x1f, 0x98, 0xff, 0xfe, 0xfd, + 0x90, 0x5b, 0xc4, 0x17, 0x76, 0xb7, 0xd0, 0x5d, 0x30, 0xd9, 0xb0, 0x30, 0xae, 0x18, 0x9b, 0xa6, + 0x2b, 0x5d, 0xc7, 0x7d, 0xf6, 0x20, 0x61, 0x6f, 0x2e, 0x1e, 0xdb, 0x58, 0x6b, 0x07, 0xe7, 0xcf, + 0xbc, 0x57, 0xf4, 0x52, 0x09, 0xb2, 0x75, 0x47, 0x73, 0xd0, 0x94, 0x8f, 0x2d, 0x7a, 0x24, 0x8c, + 0xc5, 0x5d, 0x3c, 0x16, 0x37, 0x70, 0xb2, 0x20, 0x1c, 0xcc, 0xbb, 0xff, 0x47, 0x00, 0x80, 0x60, + 0xf2, 0x21, 0xdb, 0x34, 0xdc, 0x1c, 0xde, 0x11, 0x48, 0xef, 0x1d, 0xbd, 0xdc, 0x17, 0xf7, 0xbd, + 0x9c, 0xb8, 0x9f, 0x2c, 0x56, 0xc4, 0x18, 0x56, 0xda, 0x24, 0x98, 0x72, 0x45, 0xbb, 0x82, 0xb5, + 0xb6, 0x8d, 0xbe, 0x2f, 0x50, 0xfe, 0x08, 0x31, 0xa3, 0x77, 0x09, 0x07, 0xe3, 0xa4, 0xb5, 0xf2, + 0x89, 0x47, 0x7b, 0x74, 0x78, 0x9b, 0xff, 0x12, 0x1f, 0x8c, 0xe4, 0x16, 0xc8, 0xea, 0xc6, 0xa6, + 0xc9, 0xfc, 0x0b, 0xaf, 0x8e, 0xa0, 0xed, 0xea, 0x84, 0x4a, 0x32, 0x0a, 0x46, 0xea, 0x8c, 0x67, + 0x6b, 0x2c, 0x97, 0xde, 0x65, 0xdd, 0xd2, 0xd1, 0xff, 0x7f, 0xa0, 0xb0, 0x15, 0x05, 0xb2, 0x5d, + 0xcd, 0xd9, 0x66, 0x45, 0x93, 0x67, 0xd7, 0x46, 0xde, 0x35, 0x34, 0xc3, 0x34, 0x2e, 0xef, 0xe8, + 0xcf, 0xf6, 0xef, 0xd6, 0xe5, 0xd2, 0x5c, 0xce, 0xb7, 0xb0, 0x81, 0x2d, 0xcd, 0xc1, 0xf5, 0xbd, + 0x2d, 0x32, 0xc7, 0x9a, 0x54, 0xc3, 0x49, 0x89, 0xf5, 0xdf, 0xe5, 0x38, 0x5a, 0xff, 0x37, 0xf5, + 0x0e, 0x26, 0x91, 0x9a, 0x98, 0xfe, 0x7b, 0xef, 0x89, 0xf4, 0xbf, 0x4f, 0x11, 0xe9, 0xa3, 0xf1, + 0x6d, 0x09, 0x66, 0xea, 0xae, 0xc2, 0xd5, 0x77, 0x77, 0x76, 0x34, 0xeb, 0x32, 0xba, 0x2e, 0x40, + 0x25, 0xa4, 0x9a, 0x19, 0xde, 0x2f, 0xe5, 0x8f, 0x85, 0xaf, 0x95, 0x66, 0x4d, 0x3b, 0x54, 0x42, + 0xe2, 0x76, 0x70, 0x1b, 0xe4, 0x5c, 0xf5, 0xf6, 0x3c, 0x2e, 0x63, 0x1b, 0x02, 0xcd, 0x29, 0x18, + 0xd1, 0x6a, 0x20, 0x6f, 0x63, 0x88, 0xa6, 0x21, 0xc1, 0xd1, 0xba, 0xa3, 0xb5, 0x2e, 0x2e, 0x9b, + 0x96, 0xb9, 0xeb, 0xe8, 0x06, 0xb6, 0xd1, 0x13, 0x02, 0x04, 0x3c, 0xfd, 0xcf, 0x04, 0xfa, 0x8f, + 0xfe, 0x3d, 0x23, 0x3a, 0x8a, 0xfa, 0xdd, 0x6a, 0x98, 0x7c, 0x44, 0x80, 0x2a, 0xb1, 0x71, 0x51, + 0x84, 0x62, 0xfa, 0x42, 0x7b, 0x8d, 0x0c, 0x85, 0xf2, 0xc3, 0x5d, 0xd3, 0x72, 0x56, 0xcd, 0x96, + 0xd6, 0xb1, 0x1d, 0xd3, 0xc2, 0xa8, 0x16, 0x2b, 0x35, 0xb7, 0x87, 0x69, 0x9b, 0xad, 0x60, 0x70, + 0x64, 0x6f, 0x61, 0xb5, 0x93, 0x79, 0x1d, 0x7f, 0x9f, 0xf0, 0x2e, 0x23, 0x95, 0x4a, 0x2f, 0x47, + 0x11, 0x7a, 0xde, 0xaf, 0x4b, 0x4b, 0x76, 0x58, 0x42, 0x6c, 0xe7, 0x51, 0x88, 0xa9, 0x31, 0x2c, + 0x95, 0x4b, 0x30, 0x5b, 0xdf, 0xbd, 0xe0, 0x13, 0xb1, 0xc3, 0x46, 0xc8, 0x2b, 0x85, 0xa3, 0x54, + 0x30, 0xc5, 0x0b, 0x13, 0x8a, 0x90, 0xef, 0xf5, 0x30, 0x6b, 0x87, 0xb3, 0x31, 0xbc, 0xf9, 0x44, + 0xc1, 0xe8, 0x14, 0x83, 0x4b, 0x4d, 0x5f, 0x80, 0x6f, 0x93, 0x60, 0xb6, 0xd6, 0xc5, 0x06, 0x6e, + 0x53, 0x2f, 0x48, 0x4e, 0x80, 0x2f, 0x4d, 0x28, 0x40, 0x8e, 0x50, 0x84, 0x00, 0x03, 0x8f, 0xe5, + 0x45, 0x4f, 0x78, 0x41, 0x42, 0x22, 0xc1, 0xc5, 0x95, 0x96, 0xbe, 0xe0, 0x3e, 0x27, 0xc1, 0xb4, + 0xba, 0x6b, 0xac, 0x5b, 0xa6, 0x3b, 0x1a, 0x5b, 0xe8, 0xee, 0xa0, 0x83, 0xb8, 0x19, 0x8e, 0xb5, + 0x77, 0x2d, 0xb2, 0xfe, 0x54, 0x31, 0xea, 0xb8, 0x65, 0x1a, 0x6d, 0x9b, 0xd4, 0x23, 0xa7, 0xee, + 0xff, 0x70, 0x67, 0xf6, 0xf9, 0x5f, 0x91, 0x33, 0xe8, 0x05, 0xc2, 0xa1, 0x6e, 0x68, 0xe5, 0x43, + 0x45, 0x8b, 0xf7, 0x04, 0x82, 0x01, 0x6d, 0x06, 0x95, 0x90, 0xbe, 0x70, 0x3f, 0x29, 0x81, 0x52, + 0x6c, 0xb5, 0xcc, 0x5d, 0xc3, 0xa9, 0xe3, 0x0e, 0x6e, 0x39, 0x0d, 0x4b, 0x6b, 0xe1, 0xb0, 0xfd, + 0x5c, 0x00, 0xb9, 0xad, 0x5b, 0xac, 0x0f, 0x76, 0x1f, 0x99, 0x1c, 0x5f, 0x2a, 0xbc, 0xe3, 0x48, + 0x6b, 0xb9, 0xbf, 0x94, 0x04, 0xe2, 0x14, 0xdb, 0x57, 0x14, 0x2c, 0x28, 0x7d, 0xa9, 0x7e, 0x50, + 0x82, 0x29, 0xaf, 0xc7, 0xde, 0x12, 0x11, 0xe6, 0x2f, 0x25, 0x9c, 0x8c, 0xf8, 0xc4, 0x13, 0xc8, + 0xf0, 0x4d, 0x09, 0x66, 0x15, 0x51, 0xf4, 0x93, 0x89, 0xae, 0x98, 0x5c, 0x74, 0xee, 0x6b, 0xb5, + 0xd6, 0x5c, 0xaa, 0xad, 0x2e, 0x96, 0xd5, 0x82, 0x8c, 0x1e, 0x93, 0x20, 0xbb, 0xae, 0x1b, 0x5b, + 0xe1, 0xe8, 0x4a, 0xc7, 0x5d, 0x3b, 0xb2, 0x8d, 0x1f, 0x66, 0x2d, 0x9d, 0xbe, 0x28, 0xb7, 0xc3, + 0x71, 0x63, 0x77, 0xe7, 0x02, 0xb6, 0x6a, 0x9b, 0x64, 0x94, 0xb5, 0x1b, 0x66, 0x1d, 0x1b, 0xd4, + 0x08, 0xcd, 0xa9, 0x7d, 0xbf, 0xf1, 0x26, 0x98, 0xc0, 0xe4, 0xc1, 0xe5, 0x24, 0x42, 0xe2, 0x3e, + 0x53, 0x52, 0x88, 0xa9, 0x44, 0xd3, 0x86, 0x3e, 0xc4, 0xd3, 0xd7, 0xd4, 0x3f, 0xc9, 0xc1, 0x89, + 0xa2, 0x71, 0x99, 0xd8, 0x14, 0xb4, 0x83, 0x2f, 0x6d, 0x6b, 0xc6, 0x16, 0x26, 0x03, 0x84, 0x2f, + 0xf1, 0x70, 0x88, 0xfe, 0x0c, 0x1f, 0xa2, 0x5f, 0x51, 0x61, 0xc2, 0xb4, 0xda, 0xd8, 0x5a, 0xb8, + 0x4c, 0x78, 0xea, 0x5d, 0x76, 0x66, 0x6d, 0xb2, 0x5f, 0x11, 0xf3, 0x8c, 0xfc, 0x7c, 0x8d, 0xfe, + 0xaf, 0x7a, 0x84, 0xce, 0xde, 0x0c, 0x13, 0x2c, 0x4d, 0x99, 0x81, 0xc9, 0x9a, 0xba, 0x58, 0x56, + 0x9b, 0x95, 0xc5, 0xc2, 0x11, 0xe5, 0x0a, 0x38, 0x5a, 0x69, 0x94, 0xd5, 0x62, 0xa3, 0x52, 0xab, + 0x36, 0x49, 0x7a, 0x21, 0x83, 0x9e, 0x97, 0x15, 0xf5, 0xec, 0x8d, 0x67, 0xa6, 0x1f, 0xac, 0x2a, + 0x4c, 0xb4, 0x68, 0x06, 0x32, 0x84, 0x4e, 0x27, 0xaa, 0x1d, 0x23, 0x48, 0x13, 0x54, 0x8f, 0x90, + 0x72, 0x1a, 0xe0, 0x92, 0x65, 0x1a, 0x5b, 0xc1, 0xa9, 0xc3, 0x49, 0x35, 0x94, 0x82, 0x1e, 0xc9, + 0x40, 0x9e, 0xfe, 0x43, 0xae, 0x24, 0x21, 0x4f, 0x81, 0xe0, 0xbd, 0x77, 0xd7, 0xe2, 0x25, 0xf2, + 0x0a, 0x26, 0x5a, 0xec, 0xd5, 0xd5, 0x45, 0x2a, 0x03, 0x6a, 0x09, 0xb3, 0xaa, 0xdc, 0x02, 0x79, + 0xfa, 0x2f, 0xf3, 0x3a, 0x88, 0x0e, 0x2f, 0x4a, 0xb3, 0x09, 0xfa, 0x29, 0x8b, 0xcb, 0x34, 0x7d, + 0x6d, 0x7e, 0xb7, 0x04, 0x93, 0x55, 0xec, 0x94, 0xb6, 0x71, 0xeb, 0x22, 0x7a, 0x12, 0xbf, 0x00, + 0xda, 0xd1, 0xb1, 0xe1, 0x3c, 0xb8, 0xd3, 0xf1, 0x17, 0x40, 0xbd, 0x04, 0xf4, 0xd3, 0xe1, 0xce, + 0xf7, 0x3e, 0x5e, 0x7f, 0x6e, 0xea, 0x53, 0x57, 0xaf, 0x84, 0x08, 0x95, 0x39, 0x09, 0x79, 0x0b, + 0xdb, 0xbb, 0x1d, 0x6f, 0x11, 0x8d, 0xbd, 0xa1, 0x57, 0xf9, 0xe2, 0x2c, 0x71, 0xe2, 0xbc, 0x45, + 0xbc, 0x88, 0x31, 0xc4, 0x2b, 0xcd, 0xc2, 0x44, 0xc5, 0xd0, 0x1d, 0x5d, 0xeb, 0xa0, 0x17, 0x64, + 0x61, 0xb6, 0x8e, 0x9d, 0x75, 0xcd, 0xd2, 0x76, 0xb0, 0x83, 0x2d, 0x1b, 0x7d, 0x93, 0xef, 0x13, + 0xba, 0x1d, 0xcd, 0xd9, 0x34, 0xad, 0x1d, 0x4f, 0x35, 0xbd, 0x77, 0x57, 0x35, 0xf7, 0xb0, 0x65, + 0x07, 0x7c, 0x79, 0xaf, 0xee, 0x97, 0x4b, 0xa6, 0x75, 0xd1, 0x1d, 0x04, 0xd9, 0x34, 0x8d, 0xbd, + 0xba, 0xf4, 0x3a, 0xe6, 0xd6, 0x2a, 0xde, 0xc3, 0x5e, 0xb8, 0x34, 0xff, 0xdd, 0x9d, 0x0b, 0xb4, + 0xcd, 0xaa, 0xe9, 0xb8, 0x9d, 0xf6, 0xaa, 0xb9, 0x45, 0xe3, 0xc5, 0x4e, 0xaa, 0x7c, 0x62, 0x90, + 0x4b, 0xdb, 0xc3, 0x24, 0x57, 0x3e, 0x9c, 0x8b, 0x25, 0x2a, 0xf3, 0xa0, 0xf8, 0xbf, 0x35, 0x70, + 0x07, 0xef, 0x60, 0xc7, 0xba, 0x4c, 0xae, 0x85, 0x98, 0x54, 0xfb, 0x7c, 0x61, 0x03, 0xb4, 0xf8, + 0x64, 0x9d, 0x49, 0x6f, 0x9e, 0x93, 0xdc, 0x81, 0x26, 0xeb, 0x22, 0x14, 0xc7, 0x72, 0xed, 0x95, + 0xec, 0x5a, 0x33, 0xbf, 0x26, 0x43, 0x96, 0x0c, 0x9e, 0xaf, 0xcd, 0x70, 0x2b, 0x4c, 0x3b, 0xd8, + 0xb6, 0xb5, 0x2d, 0xec, 0xad, 0x30, 0xb1, 0x57, 0xe5, 0x0e, 0xc8, 0x75, 0x08, 0xa6, 0x74, 0x70, + 0xb8, 0x8e, 0xab, 0x99, 0x6b, 0x60, 0xb8, 0xb4, 0xfc, 0x91, 0x80, 0xc0, 0xad, 0xd2, 0x3f, 0xce, + 0xde, 0x0f, 0x39, 0x0a, 0xff, 0x14, 0xe4, 0x16, 0xcb, 0x0b, 0x1b, 0xcb, 0x85, 0x23, 0xee, 0xa3, + 0xc7, 0xdf, 0x14, 0xe4, 0x96, 0x8a, 0x8d, 0xe2, 0x6a, 0x41, 0x72, 0xeb, 0x51, 0xa9, 0x2e, 0xd5, + 0x0a, 0xb2, 0x9b, 0xb8, 0x5e, 0xac, 0x56, 0x4a, 0x85, 0xac, 0x32, 0x0d, 0x13, 0xe7, 0x8b, 0x6a, + 0xb5, 0x52, 0x5d, 0x2e, 0xe4, 0xd0, 0x97, 0xc3, 0xf8, 0xdd, 0xc9, 0xe3, 0x77, 0x7d, 0x14, 0x4f, + 0xfd, 0x20, 0xfb, 0x75, 0x1f, 0xb2, 0xbb, 0x39, 0xc8, 0xbe, 0x5f, 0x84, 0xc8, 0x18, 0xdc, 0x99, + 0xf2, 0x30, 0xb1, 0x6e, 0x99, 0x2d, 0x6c, 0xdb, 0xe8, 0x97, 0x25, 0xc8, 0x97, 0x34, 0xa3, 0x85, + 0x3b, 0xe8, 0xaa, 0x00, 0x2a, 0xea, 0x2a, 0x9a, 0xf1, 0x4f, 0x8b, 0xfd, 0x63, 0x46, 0xb4, 0xf7, + 0x63, 0x74, 0xe7, 0x29, 0xcd, 0x08, 0xf9, 0x88, 0xf5, 0x72, 0xb1, 0xa4, 0xc6, 0x70, 0x35, 0x8e, + 0x04, 0x53, 0x6c, 0x35, 0xe0, 0x02, 0x0e, 0xcf, 0xc3, 0xbf, 0x99, 0x11, 0x9d, 0x1c, 0x7a, 0x35, + 0xf0, 0xc9, 0x44, 0xc8, 0x43, 0x6c, 0x22, 0x38, 0x88, 0xda, 0x18, 0x36, 0x0f, 0x25, 0x98, 0xde, + 0x30, 0xec, 0x7e, 0x42, 0x11, 0x8f, 0xa3, 0xef, 0x55, 0x23, 0x44, 0xe8, 0x40, 0x71, 0xf4, 0x07, + 0xd3, 0x4b, 0x5f, 0x30, 0xdf, 0xcc, 0xc0, 0xf1, 0x65, 0x6c, 0x60, 0x4b, 0x6f, 0xd1, 0x1a, 0x78, + 0x92, 0xb8, 0x9b, 0x97, 0xc4, 0x93, 0x38, 0xce, 0xfb, 0xfd, 0xc1, 0x4b, 0xe0, 0x15, 0xbe, 0x04, + 0xee, 0xe3, 0x24, 0x70, 0xb3, 0x20, 0x9d, 0x31, 0xdc, 0x87, 0x3e, 0x05, 0x33, 0x55, 0xd3, 0xd1, + 0x37, 0xf5, 0x16, 0xf5, 0x41, 0xfb, 0x55, 0x19, 0xb2, 0xab, 0xba, 0xed, 0xa0, 0x62, 0xd0, 0x9d, + 0x9c, 0x81, 0x69, 0xdd, 0x68, 0x75, 0x76, 0xdb, 0x58, 0xc5, 0x1a, 0xed, 0x57, 0x26, 0xd5, 0x70, + 0x52, 0xb0, 0xb5, 0xef, 0xb2, 0x25, 0x7b, 0x5b, 0xfb, 0x1f, 0x13, 0x5e, 0x86, 0x09, 0xb3, 0x40, + 0x02, 0x52, 0x46, 0xd8, 0x5d, 0x45, 0x98, 0x35, 0x42, 0x59, 0x3d, 0x83, 0xbd, 0xf7, 0x42, 0x81, + 0x30, 0x39, 0x95, 0xff, 0x03, 0xbd, 0x43, 0xa8, 0xb1, 0x0e, 0x62, 0x28, 0x19, 0x32, 0x4b, 0x43, + 0x4c, 0x92, 0x15, 0x98, 0xab, 0x54, 0x1b, 0x65, 0xb5, 0x5a, 0x5c, 0x65, 0x59, 0x64, 0xf4, 0x6d, + 0x09, 0x72, 0x2a, 0xee, 0x76, 0x2e, 0x87, 0x23, 0x46, 0x33, 0x47, 0xf1, 0x8c, 0xef, 0x28, 0xae, + 0x2c, 0x01, 0x68, 0x2d, 0xb7, 0x60, 0x72, 0xa5, 0x96, 0xd4, 0x37, 0x8e, 0x29, 0x57, 0xc1, 0xa2, + 0x9f, 0x5b, 0x0d, 0xfd, 0x89, 0x5e, 0x28, 0xbc, 0x73, 0xc4, 0x51, 0x23, 0x1c, 0x46, 0xf4, 0x09, + 0xef, 0x14, 0xda, 0xec, 0x19, 0x48, 0xee, 0x70, 0xc4, 0xff, 0x79, 0x09, 0xb2, 0x0d, 0xb7, 0xb7, + 0x0c, 0x75, 0x9c, 0x1f, 0x1d, 0x4e, 0xc7, 0x5d, 0x32, 0x11, 0x3a, 0x7e, 0x2f, 0xcc, 0x84, 0x35, + 0x96, 0xb9, 0x4a, 0xc4, 0xaa, 0x38, 0xf7, 0xc3, 0x30, 0x1a, 0xde, 0x87, 0x9d, 0xc3, 0x11, 0xf1, + 0x87, 0x9e, 0x0c, 0xb0, 0x86, 0x77, 0x2e, 0x60, 0xcb, 0xde, 0xd6, 0xbb, 0xe8, 0xef, 0x64, 0x98, + 0x5a, 0xc6, 0x4e, 0xdd, 0xd1, 0x9c, 0x5d, 0xbb, 0x67, 0xbb, 0xd3, 0x30, 0x4b, 0x5a, 0x6b, 0x1b, + 0xb3, 0xee, 0xc8, 0x7b, 0x45, 0x6f, 0x91, 0x45, 0xfd, 0x89, 0x82, 0x72, 0xe6, 0xfd, 0x32, 0x22, + 0x30, 0x79, 0x0a, 0x64, 0xdb, 0x9a, 0xa3, 0x31, 0x2c, 0xae, 0xea, 0xc1, 0x22, 0x20, 0xa4, 0x92, + 0x6c, 0xe8, 0xf7, 0x24, 0x11, 0x87, 0x22, 0x81, 0xf2, 0x93, 0x81, 0xf0, 0x8e, 0xcc, 0x10, 0x28, + 0x1c, 0x83, 0xd9, 0x6a, 0xad, 0xd1, 0x5c, 0xad, 0x2d, 0x2f, 0x97, 0xdd, 0xd4, 0x82, 0xac, 0x9c, + 0x04, 0x65, 0xbd, 0xf8, 0xe0, 0x5a, 0xb9, 0xda, 0x68, 0x56, 0x6b, 0x8b, 0x65, 0xf6, 0x67, 0x56, + 0x39, 0x0a, 0xd3, 0xa5, 0x62, 0x69, 0xc5, 0x4b, 0xc8, 0x29, 0xa7, 0xe0, 0xf8, 0x5a, 0x79, 0x6d, + 0xa1, 0xac, 0xd6, 0x57, 0x2a, 0xeb, 0x4d, 0x97, 0xcc, 0x52, 0x6d, 0xa3, 0xba, 0x58, 0xc8, 0x2b, + 0x08, 0x4e, 0x86, 0xbe, 0x9c, 0x57, 0x6b, 0xd5, 0xe5, 0x66, 0xbd, 0x51, 0x6c, 0x94, 0x0b, 0x13, + 0xca, 0x15, 0x70, 0xb4, 0x54, 0xac, 0x92, 0xec, 0xa5, 0x5a, 0xb5, 0x5a, 0x2e, 0x35, 0x0a, 0x93, + 0xe8, 0xdf, 0xb3, 0x30, 0x5d, 0xb1, 0xab, 0xda, 0x0e, 0x3e, 0xa7, 0x75, 0xf4, 0x36, 0x7a, 0x41, + 0x68, 0xe6, 0x71, 0x3d, 0xcc, 0x5a, 0xf4, 0x11, 0xb7, 0x1b, 0x3a, 0xa6, 0x68, 0xce, 0xaa, 0x7c, + 0xa2, 0x3b, 0x27, 0x37, 0x08, 0x01, 0x6f, 0x4e, 0x4e, 0xdf, 0x94, 0x05, 0x00, 0xfa, 0xd4, 0x08, + 0x2e, 0x77, 0x3d, 0xdb, 0xdb, 0x9a, 0xb4, 0x1d, 0x6c, 0x63, 0x6b, 0x4f, 0x6f, 0x61, 0x2f, 0xa7, + 0x1a, 0xfa, 0x0b, 0x7d, 0x41, 0x16, 0xdd, 0x5f, 0x0c, 0x81, 0x1a, 0xaa, 0x4e, 0x44, 0x6f, 0xf8, + 0x33, 0xb2, 0xc8, 0xee, 0xa0, 0x10, 0xc9, 0x64, 0x9a, 0xf2, 0x62, 0x69, 0xb8, 0x65, 0xdb, 0x46, + 0xad, 0xd6, 0xac, 0xaf, 0xd4, 0xd4, 0x46, 0x41, 0x56, 0x66, 0x60, 0xd2, 0x7d, 0x5d, 0xad, 0x55, + 0x97, 0x0b, 0x59, 0xe5, 0x04, 0x1c, 0x5b, 0x29, 0xd6, 0x9b, 0x95, 0xea, 0xb9, 0xe2, 0x6a, 0x65, + 0xb1, 0x59, 0x5a, 0x29, 0xaa, 0xf5, 0x42, 0x4e, 0xb9, 0x0a, 0x4e, 0x34, 0x2a, 0x65, 0xb5, 0xb9, + 0x54, 0x2e, 0x36, 0x36, 0xd4, 0x72, 0xbd, 0x59, 0xad, 0x35, 0xab, 0xc5, 0xb5, 0x72, 0x21, 0xef, + 0x36, 0x7f, 0xf2, 0x29, 0x50, 0x9b, 0x89, 0xfd, 0xca, 0x38, 0x19, 0xa1, 0x8c, 0x53, 0xbd, 0xca, + 0x08, 0x61, 0xb5, 0x52, 0xcb, 0xf5, 0xb2, 0x7a, 0xae, 0x5c, 0x98, 0xee, 0xa7, 0x6b, 0x33, 0xca, + 0x71, 0x28, 0xb8, 0x3c, 0x34, 0x2b, 0x75, 0x2f, 0xe7, 0x62, 0x61, 0x16, 0x7d, 0x30, 0x0f, 0x27, + 0x55, 0xbc, 0xa5, 0xdb, 0x0e, 0xb6, 0xd6, 0xb5, 0xcb, 0x3b, 0xd8, 0x70, 0xbc, 0x4e, 0xfe, 0x5f, + 0x12, 0x2b, 0xe3, 0x1a, 0xcc, 0x76, 0x29, 0x8d, 0x35, 0xec, 0x6c, 0x9b, 0x6d, 0x36, 0x0a, 0x3f, + 0x29, 0xb2, 0xe7, 0x98, 0x5f, 0x0f, 0x67, 0x57, 0xf9, 0xbf, 0x43, 0xba, 0x2d, 0xc7, 0xe8, 0x76, + 0x76, 0x18, 0xdd, 0x56, 0xae, 0x81, 0xa9, 0x5d, 0x1b, 0x5b, 0xe5, 0x1d, 0x4d, 0xef, 0x78, 0x97, + 0x73, 0xfa, 0x09, 0xe8, 0x8d, 0x59, 0xd1, 0x13, 0x2b, 0xa1, 0xba, 0xf4, 0x17, 0x63, 0x44, 0xdf, + 0x7a, 0x1a, 0x80, 0x55, 0x76, 0xc3, 0xea, 0x30, 0x65, 0x0d, 0xa5, 0xb8, 0xfc, 0x5d, 0xd0, 0x3b, + 0x1d, 0xdd, 0xd8, 0xf2, 0xf7, 0xfd, 0x83, 0x04, 0xf4, 0x62, 0x59, 0xe4, 0x04, 0x4b, 0x52, 0xde, + 0x92, 0xb5, 0xa6, 0x17, 0x4a, 0x63, 0xee, 0x77, 0xf7, 0x37, 0x9d, 0xbc, 0x52, 0x80, 0x19, 0x92, + 0xc6, 0x5a, 0x60, 0x61, 0xc2, 0xed, 0x83, 0x3d, 0x72, 0x6b, 0xe5, 0xc6, 0x4a, 0x6d, 0xd1, 0xff, + 0x36, 0xe9, 0x92, 0x74, 0x99, 0x29, 0x56, 0x1f, 0x24, 0xad, 0x71, 0x4a, 0x79, 0x02, 0x5c, 0x15, + 0xea, 0xb0, 0x8b, 0xab, 0x6a, 0xb9, 0xb8, 0xf8, 0x60, 0xb3, 0xfc, 0xac, 0x4a, 0xbd, 0x51, 0xe7, + 0x1b, 0x97, 0xd7, 0x8e, 0xa6, 0x5d, 0x7e, 0xcb, 0x6b, 0xc5, 0xca, 0x2a, 0xeb, 0xdf, 0x97, 0x6a, + 0xea, 0x5a, 0xb1, 0x51, 0x98, 0x41, 0xbf, 0x26, 0x43, 0x61, 0x19, 0x3b, 0xeb, 0xa6, 0xe5, 0x68, + 0x9d, 0x55, 0xdd, 0xb8, 0xb8, 0x61, 0x75, 0xb8, 0xc9, 0xa6, 0x70, 0x98, 0x0e, 0x7e, 0x88, 0xe4, + 0x08, 0x46, 0xef, 0x88, 0x77, 0x49, 0xb6, 0x40, 0x99, 0x82, 0x04, 0xf4, 0x1c, 0x49, 0x64, 0xb9, + 0x5b, 0xbc, 0xd4, 0x64, 0x7a, 0xf2, 0xdc, 0x71, 0x8f, 0xcf, 0x7d, 0x50, 0xcb, 0xa3, 0xe7, 0x67, + 0x61, 0x72, 0x49, 0x37, 0xb4, 0x8e, 0xfe, 0x6c, 0x2e, 0x7e, 0x69, 0xd0, 0xc7, 0x64, 0x62, 0xfa, + 0x18, 0x69, 0xa8, 0xf1, 0xf3, 0x17, 0x65, 0xd1, 0xe5, 0x85, 0x90, 0xec, 0x3d, 0x26, 0x23, 0x06, + 0xcf, 0xf7, 0x48, 0x22, 0xcb, 0x0b, 0x83, 0xe9, 0x25, 0xc3, 0xf0, 0x23, 0xdf, 0x1d, 0x36, 0x56, + 0x4f, 0xfb, 0x9e, 0xec, 0xa7, 0x0a, 0x53, 0xe8, 0x2f, 0x64, 0x40, 0xcb, 0xd8, 0x39, 0x87, 0x2d, + 0x7f, 0x2a, 0x40, 0x7a, 0x7d, 0x66, 0x6f, 0x87, 0x9a, 0xec, 0x6b, 0xc3, 0x00, 0x9e, 0xe7, 0x01, + 0x2c, 0xc6, 0x34, 0x9e, 0x08, 0xd2, 0x11, 0x8d, 0xb7, 0x02, 0x79, 0x9b, 0x7c, 0x67, 0x6a, 0x76, + 0x5b, 0xf4, 0x70, 0x49, 0x88, 0x85, 0xa9, 0x53, 0xc2, 0x2a, 0x23, 0x80, 0xbe, 0xe5, 0x4f, 0x82, + 0x7e, 0x98, 0xd3, 0x8e, 0xa5, 0x03, 0x33, 0x9b, 0x4c, 0x5f, 0xac, 0x74, 0xd5, 0xa5, 0x9f, 0x7d, + 0x83, 0xde, 0x93, 0x83, 0xe3, 0xfd, 0xaa, 0x83, 0x7e, 0x3f, 0xc3, 0xed, 0xb0, 0x63, 0x32, 0xe4, + 0x67, 0xd8, 0x06, 0xa2, 0xfb, 0xa2, 0x3c, 0x0d, 0x4e, 0xf8, 0xcb, 0x70, 0x0d, 0xb3, 0x8a, 0x2f, + 0xd9, 0x1d, 0xec, 0x38, 0xd8, 0x22, 0x55, 0x9b, 0x54, 0xfb, 0x7f, 0x54, 0x9e, 0x01, 0x57, 0xea, + 0x86, 0xad, 0xb7, 0xb1, 0xd5, 0xd0, 0xbb, 0x76, 0xd1, 0x68, 0x37, 0x76, 0x1d, 0xd3, 0xd2, 0x35, + 0x76, 0x95, 0xe4, 0xa4, 0x1a, 0xf5, 0x59, 0xb9, 0x09, 0x0a, 0xba, 0x5d, 0x33, 0x2e, 0x98, 0x9a, + 0xd5, 0xd6, 0x8d, 0xad, 0x55, 0xdd, 0x76, 0x98, 0x07, 0xf0, 0xbe, 0x74, 0xf4, 0xf7, 0xb2, 0xe8, + 0x61, 0xba, 0x01, 0xb0, 0x46, 0x74, 0x28, 0x3f, 0x2d, 0x8b, 0x1c, 0x8f, 0x4b, 0x46, 0x3b, 0x99, + 0xb2, 0x3c, 0x6f, 0xdc, 0x86, 0x44, 0xff, 0x11, 0x9c, 0x74, 0x2d, 0x34, 0xdd, 0x33, 0x04, 0xce, + 0x95, 0xd5, 0xca, 0x52, 0xa5, 0xec, 0x9a, 0x15, 0x27, 0xe0, 0x58, 0xf0, 0x6d, 0xf1, 0xc1, 0x66, + 0xbd, 0x5c, 0x6d, 0x14, 0x26, 0xdd, 0x7e, 0x8a, 0x26, 0x2f, 0x15, 0x2b, 0xab, 0xe5, 0xc5, 0x66, + 0xa3, 0xe6, 0x7e, 0x59, 0x1c, 0xce, 0xb4, 0x40, 0x8f, 0x64, 0xe1, 0x28, 0x91, 0xed, 0x65, 0x22, + 0x55, 0x57, 0x28, 0x3d, 0xbe, 0xb6, 0x3e, 0x40, 0x53, 0x54, 0xbc, 0xe8, 0x13, 0xc2, 0x37, 0x65, + 0x86, 0x20, 0xec, 0x29, 0x23, 0x42, 0x33, 0xbe, 0x29, 0x89, 0x44, 0xa8, 0x10, 0x26, 0x9b, 0x4c, + 0x29, 0xfe, 0x75, 0xdc, 0x23, 0x4e, 0x34, 0xf8, 0xc4, 0xca, 0x2c, 0x91, 0x9f, 0x9f, 0xb5, 0x5e, + 0x51, 0x89, 0x3a, 0xcc, 0x01, 0x90, 0x14, 0xa2, 0x41, 0x54, 0x0f, 0xfa, 0x8e, 0x57, 0x51, 0x7a, + 0x50, 0x2c, 0x35, 0x2a, 0xe7, 0xca, 0x51, 0x7a, 0xf0, 0x71, 0x19, 0x26, 0x97, 0xb1, 0xe3, 0xce, + 0xa9, 0x6c, 0xf4, 0x4c, 0x81, 0xf5, 0x1f, 0xd7, 0x8c, 0xe9, 0x98, 0x2d, 0xad, 0xe3, 0x2f, 0x03, + 0xd0, 0x37, 0xf4, 0x53, 0xc3, 0x98, 0x20, 0x5e, 0xd1, 0x11, 0xe3, 0xd5, 0x0f, 0x42, 0xce, 0x71, + 0x3f, 0xb3, 0x65, 0xe8, 0xef, 0x8b, 0x1c, 0xae, 0x5c, 0x22, 0x8b, 0x9a, 0xa3, 0xa9, 0x34, 0x7f, + 0x68, 0x74, 0x12, 0xb4, 0x5d, 0x22, 0x18, 0xf9, 0x6e, 0xb4, 0x3f, 0xbf, 0x2c, 0xc3, 0x09, 0xda, + 0x3e, 0x8a, 0xdd, 0x6e, 0xdd, 0x31, 0x2d, 0xac, 0xe2, 0x16, 0xd6, 0xbb, 0x4e, 0xcf, 0xfa, 0x9e, + 0x45, 0x53, 0xbd, 0xcd, 0x66, 0xf6, 0x8a, 0x7e, 0x4b, 0x16, 0x8d, 0xc1, 0xbc, 0xaf, 0x3d, 0xf6, + 0x94, 0x17, 0xd1, 0xd8, 0x3f, 0x20, 0x89, 0x44, 0x55, 0x4e, 0x48, 0x3c, 0x19, 0x50, 0xef, 0x3d, + 0x04, 0xa0, 0xbc, 0x95, 0x1b, 0xb5, 0x5c, 0x2a, 0x57, 0xd6, 0xdd, 0x41, 0xe0, 0x5a, 0xb8, 0x7a, + 0x7d, 0x43, 0x2d, 0xad, 0x14, 0xeb, 0xe5, 0xa6, 0x5a, 0x5e, 0xae, 0xd4, 0x1b, 0xcc, 0x29, 0x8b, + 0xfe, 0x35, 0xa1, 0x5c, 0x03, 0xa7, 0xea, 0x1b, 0x0b, 0xf5, 0x92, 0x5a, 0x59, 0x27, 0xe9, 0x6a, + 0xb9, 0x5a, 0x3e, 0xcf, 0xbe, 0x4e, 0xa2, 0x77, 0x15, 0x60, 0xda, 0x9d, 0x00, 0xd4, 0xe9, 0xbc, + 0x00, 0x7d, 0x2d, 0x0b, 0xd3, 0x2a, 0xb6, 0xcd, 0xce, 0x1e, 0x99, 0x23, 0x8c, 0x6b, 0xea, 0xf1, + 0x0d, 0x59, 0xf4, 0xfc, 0x76, 0x88, 0xd9, 0xf9, 0x10, 0xa3, 0xd1, 0x13, 0x4d, 0x6d, 0x4f, 0xd3, + 0x3b, 0xda, 0x05, 0xd6, 0xd5, 0x4c, 0xaa, 0x41, 0x82, 0x32, 0x0f, 0x8a, 0x79, 0xc9, 0xc0, 0x56, + 0xbd, 0x75, 0xa9, 0xec, 0x6c, 0x17, 0xdb, 0x6d, 0x0b, 0xdb, 0x36, 0x5b, 0xbd, 0xe8, 0xf3, 0x45, + 0xb9, 0x11, 0x8e, 0x92, 0xd4, 0x50, 0x66, 0xea, 0x20, 0xd3, 0x9b, 0xec, 0xe7, 0x2c, 0x1a, 0x97, + 0xbd, 0x9c, 0xb9, 0x50, 0xce, 0x20, 0x39, 0x7c, 0x5c, 0x22, 0xcf, 0x9f, 0xd2, 0x39, 0x03, 0xd3, + 0x86, 0xb6, 0x83, 0xcb, 0x0f, 0x77, 0x75, 0x0b, 0xdb, 0xc4, 0x31, 0x46, 0x56, 0xc3, 0x49, 0xe8, + 0x3d, 0x42, 0xe7, 0xcd, 0xc5, 0x24, 0x96, 0x4c, 0xf7, 0x97, 0x87, 0x50, 0xfd, 0x3e, 0xfd, 0x8c, + 0x8c, 0xde, 0x25, 0xc3, 0x0c, 0x63, 0xaa, 0x68, 0x5c, 0xae, 0xb4, 0xd1, 0xb5, 0x9c, 0xf1, 0xab, + 0xb9, 0x69, 0x9e, 0xf1, 0x4b, 0x5e, 0xd0, 0xcf, 0xca, 0xa2, 0xee, 0xce, 0x7d, 0x2a, 0x4e, 0xca, + 0x88, 0x76, 0x1c, 0xdd, 0x34, 0x77, 0x99, 0xa3, 0xea, 0xa4, 0x4a, 0x5f, 0xd2, 0x5c, 0xd4, 0x43, + 0x7f, 0x24, 0xe4, 0x4c, 0x2d, 0x58, 0x8d, 0x43, 0x02, 0xf0, 0x43, 0x32, 0xcc, 0x31, 0xae, 0xea, + 0xec, 0x9c, 0x8f, 0xd0, 0x81, 0xb7, 0x9f, 0x13, 0x36, 0x04, 0xfb, 0xd4, 0x9f, 0x95, 0xf4, 0xb8, + 0x01, 0xf2, 0x7d, 0x42, 0xc1, 0xd1, 0x84, 0x2b, 0x72, 0x48, 0x50, 0xbe, 0x29, 0x0b, 0xd3, 0x1b, + 0x36, 0xb6, 0x98, 0xdf, 0x3e, 0x7a, 0x55, 0x16, 0xe4, 0x65, 0xcc, 0x6d, 0xa4, 0xbe, 0x48, 0xd8, + 0xc3, 0x37, 0x5c, 0xd9, 0x10, 0x51, 0xd7, 0x46, 0x8a, 0x80, 0xed, 0x06, 0x98, 0xa3, 0x22, 0x2d, + 0x3a, 0x8e, 0x6b, 0x24, 0x7a, 0xde, 0xb4, 0x3d, 0xa9, 0xa3, 0xd8, 0x2a, 0x22, 0x65, 0xb9, 0x59, + 0x4a, 0x2e, 0x4f, 0xab, 0x78, 0x93, 0xce, 0x67, 0xb3, 0x6a, 0x4f, 0xaa, 0x72, 0x2b, 0x5c, 0x61, + 0x76, 0x31, 0x3d, 0xbf, 0x12, 0xca, 0x9c, 0x23, 0x99, 0xfb, 0x7d, 0x42, 0x5f, 0x13, 0xf2, 0xd5, + 0x15, 0x97, 0x4e, 0x32, 0x5d, 0xe8, 0x8e, 0xc6, 0x24, 0x39, 0x0e, 0x05, 0x37, 0x07, 0xd9, 0x7f, + 0x51, 0xcb, 0xf5, 0xda, 0xea, 0xb9, 0x72, 0xff, 0x65, 0x8c, 0x1c, 0x7a, 0x9e, 0x0c, 0x53, 0x0b, + 0x96, 0xa9, 0xb5, 0x5b, 0x9a, 0xed, 0xa0, 0x6f, 0x49, 0x30, 0xb3, 0xae, 0x5d, 0xee, 0x98, 0x5a, + 0x9b, 0xf8, 0xf7, 0xf7, 0xf4, 0x05, 0x5d, 0xfa, 0xc9, 0xeb, 0x0b, 0xd8, 0x2b, 0x7f, 0x30, 0xd0, + 0x3f, 0xba, 0x97, 0x11, 0xb9, 0x50, 0xd3, 0xdf, 0xe6, 0x93, 0xfa, 0x05, 0x2b, 0xf5, 0xf8, 0x9a, + 0x0f, 0xf3, 0x14, 0x61, 0x51, 0xbe, 0x4b, 0x2c, 0xfc, 0xa8, 0x08, 0xc9, 0xc3, 0xd9, 0x95, 0x7f, + 0xfe, 0x24, 0xe4, 0x17, 0x31, 0xb1, 0xe2, 0xfe, 0x87, 0x04, 0x13, 0x75, 0xec, 0x10, 0x0b, 0xee, + 0x0e, 0xce, 0x53, 0xb8, 0x4d, 0x32, 0x04, 0x4e, 0xec, 0xde, 0xbb, 0x3b, 0x59, 0x0f, 0x9d, 0xb7, + 0x26, 0xcf, 0x09, 0x3c, 0x12, 0x69, 0xb9, 0xf3, 0xac, 0xcc, 0x03, 0x79, 0x24, 0xc6, 0x92, 0x4a, + 0xdf, 0xd7, 0xea, 0x2d, 0x12, 0x73, 0xad, 0x0a, 0xf5, 0x7a, 0xbf, 0x11, 0xd6, 0xcf, 0x58, 0x6f, + 0x33, 0xc6, 0x7c, 0x8c, 0x73, 0xd4, 0x53, 0x61, 0x82, 0xca, 0xdc, 0x9b, 0x8f, 0xf6, 0xfa, 0x29, + 0x50, 0x12, 0xe4, 0xec, 0xb5, 0x97, 0x53, 0xd0, 0x45, 0x2d, 0xba, 0xf0, 0xb1, 0xc4, 0x20, 0x98, + 0xa9, 0x62, 0xe7, 0x92, 0x69, 0x5d, 0xac, 0x3b, 0x9a, 0x83, 0xd1, 0xbf, 0x4a, 0x20, 0xd7, 0xb1, + 0x13, 0x8e, 0x7e, 0x52, 0x85, 0x63, 0xb4, 0x42, 0x2c, 0x23, 0xe9, 0xbf, 0x69, 0x45, 0xce, 0xf4, + 0x15, 0x42, 0x28, 0x9f, 0xba, 0xff, 0x57, 0xf4, 0xcb, 0x7d, 0x83, 0x3e, 0x49, 0x7d, 0x26, 0x0d, + 0x4c, 0x32, 0x61, 0x06, 0x5d, 0x05, 0x8b, 0xd0, 0xd3, 0x77, 0x0b, 0x99, 0xd5, 0x62, 0x34, 0x0f, + 0xa7, 0x2b, 0x78, 0xdf, 0x55, 0x90, 0x2d, 0x6d, 0x6b, 0x0e, 0x7a, 0xb3, 0x0c, 0x50, 0x6c, 0xb7, + 0xd7, 0xa8, 0x0f, 0x78, 0xd8, 0x21, 0xed, 0x2c, 0xcc, 0xb4, 0xb6, 0xb5, 0xe0, 0x6e, 0x13, 0xda, + 0x1f, 0x70, 0x69, 0xca, 0xd3, 0x02, 0x67, 0x72, 0x2a, 0x55, 0xd4, 0x03, 0x93, 0x5b, 0x06, 0xa3, + 0xed, 0x3b, 0x9a, 0xf3, 0xa1, 0x30, 0x63, 0x8f, 0xd0, 0xb9, 0xbf, 0xcf, 0x07, 0xec, 0x45, 0xcf, + 0xe1, 0x18, 0x69, 0xff, 0x80, 0x4d, 0x90, 0x90, 0xf0, 0xa4, 0xb7, 0x58, 0x40, 0x8f, 0x78, 0xbe, + 0xc6, 0x12, 0xba, 0x56, 0x29, 0xb7, 0x75, 0x4f, 0xb4, 0x2c, 0x60, 0x16, 0x7a, 0x61, 0x26, 0x19, + 0x7c, 0xf1, 0x82, 0xbb, 0x0f, 0x66, 0x71, 0x5b, 0x77, 0xb0, 0x57, 0x4b, 0x26, 0xc0, 0x38, 0x88, + 0xf9, 0x1f, 0xd0, 0x73, 0x85, 0x83, 0xae, 0x11, 0x81, 0xee, 0xaf, 0x51, 0x44, 0xfb, 0x13, 0x0b, + 0xa3, 0x26, 0x46, 0x33, 0x7d, 0xb0, 0x7e, 0x4a, 0x86, 0x13, 0x0d, 0x73, 0x6b, 0xab, 0x83, 0x3d, + 0x31, 0x61, 0xea, 0x9d, 0x89, 0xb4, 0x51, 0xc2, 0x45, 0x76, 0x82, 0xcc, 0x87, 0x74, 0xff, 0x28, + 0x99, 0xfb, 0xc2, 0x9f, 0x98, 0x8a, 0x9d, 0x45, 0x11, 0x71, 0xf5, 0xe5, 0x33, 0x02, 0x05, 0xb1, + 0x80, 0xcf, 0xc2, 0x64, 0xd3, 0x07, 0xe2, 0xb3, 0x12, 0xcc, 0xd2, 0x9b, 0x2b, 0x3d, 0x05, 0x7d, + 0x60, 0x84, 0x00, 0xa0, 0x6f, 0x65, 0x44, 0xfd, 0x6c, 0x89, 0x4c, 0x38, 0x4e, 0x22, 0x44, 0x2c, + 0x16, 0x54, 0x65, 0x20, 0xb9, 0xf4, 0x45, 0xfb, 0xa7, 0x32, 0x4c, 0x2f, 0x63, 0xaf, 0xa5, 0xd9, + 0x89, 0x7b, 0xa2, 0xb3, 0x30, 0x43, 0xae, 0x6f, 0xab, 0xb1, 0x63, 0x92, 0x74, 0xd5, 0x8c, 0x4b, + 0x53, 0xae, 0x87, 0xd9, 0x0b, 0x78, 0xd3, 0xb4, 0x70, 0x8d, 0x3b, 0x4b, 0xc9, 0x27, 0x46, 0x84, + 0xa7, 0xe3, 0xe2, 0xa0, 0x2d, 0xf0, 0xd8, 0xdc, 0xbc, 0x5f, 0x98, 0xa1, 0xaa, 0x44, 0x8c, 0x39, + 0x4f, 0x87, 0x49, 0x86, 0xbc, 0x67, 0xa6, 0xc5, 0xf5, 0x8b, 0x7e, 0x5e, 0xf4, 0x9b, 0x3e, 0xa2, + 0x65, 0x0e, 0xd1, 0xdb, 0x92, 0x30, 0x31, 0x96, 0xfb, 0xdd, 0x0b, 0xa1, 0xf2, 0x17, 0x2e, 0x57, + 0xda, 0x36, 0x5a, 0x4b, 0x86, 0xe9, 0x69, 0x00, 0xbf, 0x71, 0x78, 0x61, 0x2d, 0x42, 0x29, 0x7c, + 0xe4, 0xfa, 0xd8, 0x83, 0x7a, 0xbd, 0xe2, 0x20, 0xec, 0x8c, 0x18, 0x18, 0xb1, 0x03, 0x7e, 0x22, + 0x9c, 0xa4, 0x8f, 0xce, 0xc7, 0x64, 0x38, 0xe1, 0x9f, 0x3f, 0x5a, 0xd5, 0xec, 0xa0, 0xdd, 0x95, + 0x92, 0x41, 0xc4, 0x1d, 0xf8, 0xf0, 0x1b, 0xcb, 0xd7, 0x93, 0x8d, 0x19, 0x7d, 0x39, 0x19, 0x2d, + 0x3a, 0xca, 0xcd, 0x70, 0xcc, 0xd8, 0xdd, 0xf1, 0xa5, 0x4e, 0x5a, 0x3c, 0x6b, 0xe1, 0xfb, 0x3f, + 0x24, 0x19, 0x99, 0x44, 0x98, 0x1f, 0xcb, 0x9c, 0x92, 0x3b, 0xd2, 0xf5, 0x94, 0x44, 0x30, 0xa2, + 0x7f, 0xce, 0x24, 0xea, 0xdd, 0x06, 0x9f, 0xf9, 0x4a, 0xd0, 0x4b, 0x1d, 0xe2, 0x81, 0xaf, 0xb3, + 0x13, 0x90, 0x2b, 0xef, 0x74, 0x9d, 0xcb, 0x67, 0x9f, 0x08, 0xb3, 0x75, 0xc7, 0xc2, 0xda, 0x4e, + 0x68, 0x67, 0xc0, 0x31, 0x2f, 0x62, 0xc3, 0xdb, 0x19, 0x20, 0x2f, 0x77, 0xde, 0x01, 0x13, 0x86, + 0xd9, 0xd4, 0x76, 0x9d, 0x6d, 0xe5, 0xda, 0x7d, 0x47, 0xea, 0x19, 0xf8, 0x35, 0x16, 0xc3, 0xe8, + 0x0b, 0x77, 0x91, 0xb5, 0xe1, 0xbc, 0x61, 0x16, 0x77, 0x9d, 0xed, 0x85, 0x6b, 0x3e, 0xf4, 0xb7, + 0xa7, 0x33, 0x1f, 0xff, 0xdb, 0xd3, 0x99, 0xcf, 0xff, 0xed, 0xe9, 0xcc, 0xcf, 0x7d, 0xf1, 0xf4, + 0x91, 0x8f, 0x7f, 0xf1, 0xf4, 0x91, 0xcf, 0x7e, 0xf1, 0xf4, 0x91, 0x1f, 0x96, 0xba, 0x17, 0x2e, + 0xe4, 0x09, 0x95, 0xa7, 0xfe, 0xbf, 0x01, 0x00, 0x00, 0xff, 0xff, 0x3c, 0x7e, 0x47, 0xee, 0xc5, + 0x0b, 0x02, 0x00, } func (m *Rpc) Marshal() (dAtA []byte, err error) { @@ -88856,6 +88865,16 @@ func (m *RpcObjectListExportRequest) MarshalToSizedBuffer(dAtA []byte) (int, err _ = i var l int _ = l + if m.IncludeBacklinks { + i-- + if m.IncludeBacklinks { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x68 + } if m.LinksStateFilters != nil { { size, err := m.LinksStateFilters.MarshalToSizedBuffer(dAtA[:i]) @@ -125555,6 +125574,9 @@ func (m *RpcObjectListExportRequest) Size() (n int) { l = m.LinksStateFilters.Size() n += 1 + l + sovCommands(uint64(l)) } + if m.IncludeBacklinks { + n += 2 + } return n } @@ -179457,6 +179479,26 @@ func (m *RpcObjectListExportRequest) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex + case 13: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field IncludeBacklinks", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowCommands + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.IncludeBacklinks = bool(v != 0) default: iNdEx = preIndex skippy, err := skipCommands(dAtA[iNdEx:]) diff --git a/pb/protos/commands.proto b/pb/protos/commands.proto index f7f42efdd..fc639f56e 100644 --- a/pb/protos/commands.proto +++ b/pb/protos/commands.proto @@ -2783,6 +2783,7 @@ message Rpc { // for integrations like raycast and web publishing bool noProgress = 11; StateFilters linksStateFilters = 12; + bool includeBacklinks = 13; } message StateFilters { repeated RelationsWhiteList relationsWhiteList = 1; From 311c7f1a64d0d444fab20e8ece9c72fec7ae8c1d Mon Sep 17 00:00:00 2001 From: AnastasiaShemyakinskaya Date: Tue, 28 Jan 2025 15:09:28 +0100 Subject: [PATCH 186/195] GO-4961: remove duplicate code Signed-off-by: AnastasiaShemyakinskaya --- core/block/object/objectlink/dependent_objects_test.go | 4 ---- 1 file changed, 4 deletions(-) diff --git a/core/block/object/objectlink/dependent_objects_test.go b/core/block/object/objectlink/dependent_objects_test.go index 6b97068be..87b8df451 100644 --- a/core/block/object/objectlink/dependent_objects_test.go +++ b/core/block/object/objectlink/dependent_objects_test.go @@ -339,10 +339,6 @@ func TestState_DepSmartIdsLinksDetailsAndRelations(t *testing.T) { objectIDs := DependentObjectIDs(stateWithLinks, converter, Flags{Blocks: true, Relations: true, Details: true}) assert.Len(t, objectIDs, 14) // 4 links + 5 relations + 3 options + 1 fileID + 1 date }) - t.Run("blocks, relations and details option are turned on: get ids from blocks, relations and details", func(t *testing.T) { - objectIDs := DependentObjectIDs(stateWithLinks, converter, Flags{Blocks: true, Relations: true, Details: true}) - assert.Len(t, objectIDs, 14) // 4 links + 5 relations + 3 options + 1 fileID + 1 date - }) } func TestState_DepSmartIdsLinksCreatorModifierWorkspace(t *testing.T) { From 5908ca1cdf93b17f2279b4b5e284db04067a2e16 Mon Sep 17 00:00:00 2001 From: Jannis Metrikat <120120832+jmetrikat@users.noreply.github.com> Date: Tue, 28 Jan 2025 18:30:39 +0100 Subject: [PATCH 187/195] GO-4459: Refactor search tests --- core/api/internal/object/service.go | 4 +- core/api/internal/search/service_test.go | 144 +++++++++++++---------- core/api/internal/space/service.go | 4 +- 3 files changed, 87 insertions(+), 65 deletions(-) diff --git a/core/api/internal/object/service.go b/core/api/internal/object/service.go index 59f14ee2d..91efda7b2 100644 --- a/core/api/internal/object/service.go +++ b/core/api/internal/object/service.go @@ -457,7 +457,7 @@ func (s *ObjectService) GetDetails(resp *pb.RpcObjectShowResponse) []Detail { { Id: "last_modified_by", Details: map[string]interface{}{ - "details": s.spaceService.GetParticipantDetails(s.mw, s.AccountInfo, resp.ObjectView.Details[0].Details.Fields[bundle.RelationKeySpaceId.String()].GetStringValue(), lastModifiedById), + "details": s.spaceService.GetParticipantDetails(s.mw, resp.ObjectView.Details[0].Details.Fields[bundle.RelationKeySpaceId.String()].GetStringValue(), lastModifiedById), }, }, { @@ -469,7 +469,7 @@ func (s *ObjectService) GetDetails(resp *pb.RpcObjectShowResponse) []Detail { { Id: "created_by", Details: map[string]interface{}{ - "details": s.spaceService.GetParticipantDetails(s.mw, s.AccountInfo, resp.ObjectView.Details[0].Details.Fields[bundle.RelationKeySpaceId.String()].GetStringValue(), creatorId), + "details": s.spaceService.GetParticipantDetails(s.mw, resp.ObjectView.Details[0].Details.Fields[bundle.RelationKeySpaceId.String()].GetStringValue(), creatorId), }, }, { diff --git a/core/api/internal/search/service_test.go b/core/api/internal/search/service_test.go index 8cf6b94cf..494386b3f 100644 --- a/core/api/internal/search/service_test.go +++ b/core/api/internal/search/service_test.go @@ -18,11 +18,29 @@ import ( ) const ( - offset = 0 - limit = 100 - techSpaceId = "tech-space-id" - gatewayUrl = "http://localhost:31006" - mockedObjectTypeName = "mocked-object-type-name" + offset = 0 + limit = 100 + techSpaceId = "tech-space-id" + gatewayUrl = "http://localhost:31006" + mockedSpaceId = "mocked-space-id" + mockedSearchTerm = "mocked-search-term" + mockedObjectId = "mocked-object-id" + mockedObjectName = "mocked-object-name" + mockedRootId = "mocked-root-id" + mockedParticipantId = "mocked-participant-id" + mockedType = "mocked-type" + mockedTagId1 = "mocked-tag-id-1" + mockedTagValue1 = "mocked-tag-value-1" + mockedTagColor1 = "mocked-tag-color-1" + mockedTagId2 = "mocked-tag-id-2" + mockedTagValue2 = "mocked-tag-value-2" + mockedTagColor2 = "mocked-tag-color-2" + mockedObjectTypeName = "mocked-object-type-name" + mockedParticipantName = "mocked-participant-name" + mockedParticipantIcon = "mocked-participant-icon" + mockedParticipantImage = "mocked-participant-image" + mockedParticipantIdentity = "mocked-participant-identity" + mockedParticipantGlobalName = "mocked-participant-global-name" ) type fixture struct { @@ -34,7 +52,7 @@ func newFixture(t *testing.T) *fixture { mw := mock_service.NewMockClientCommandsServer(t) spaceService := space.NewService(mw) - spaceService.AccountInfo = &model.AccountInfo{TechSpaceId: techSpaceId} + spaceService.AccountInfo = &model.AccountInfo{TechSpaceId: techSpaceId, GatewayUrl: gatewayUrl} objectService := object.NewService(mw, spaceService) objectService.AccountInfo = &model.AccountInfo{TechSpaceId: techSpaceId} searchService := NewService(mw, spaceService, objectService) @@ -49,7 +67,7 @@ func newFixture(t *testing.T) *fixture { } } -func TestSearchService_Search(t *testing.T) { +func TestSearchService_GlobalSearch(t *testing.T) { t.Run("objects found globally", func(t *testing.T) { // given ctx := context.Background() @@ -85,7 +103,7 @@ func TestSearchService_Search(t *testing.T) { Records: []*types.Struct{ { Fields: map[string]*types.Value{ - bundle.RelationKeyTargetSpaceId.String(): pbtypes.String("space-1"), + bundle.RelationKeyTargetSpaceId.String(): pbtypes.String(mockedSpaceId), }, }, }, @@ -94,18 +112,18 @@ func TestSearchService_Search(t *testing.T) { // Mock workspace opening fx.mwMock.On("WorkspaceOpen", mock.Anything, &pb.RpcWorkspaceOpenRequest{ - SpaceId: "space-1", + SpaceId: mockedSpaceId, WithChat: true, }).Return(&pb.RpcWorkspaceOpenResponse{ Info: &model.AccountInfo{ - TechSpaceId: "space-1", + TechSpaceId: mockedSpaceId, }, Error: &pb.RpcWorkspaceOpenResponseError{Code: pb.RpcWorkspaceOpenResponseError_NULL}, }).Once() - // Mock objects in space-1 + // Mock objects in space fx.mwMock.On("ObjectSearch", mock.Anything, &pb.RpcObjectSearchRequest{ - SpaceId: "space-1", + SpaceId: mockedSpaceId, Filters: []*model.BlockContentDataviewFilter{ { Operator: model.BlockContentDataviewFilter_And, @@ -138,13 +156,13 @@ func TestSearchService_Search(t *testing.T) { Operator: model.BlockContentDataviewFilter_No, RelationKey: bundle.RelationKeyName.String(), Condition: model.BlockContentDataviewFilter_Like, - Value: pbtypes.String("search-term"), + Value: pbtypes.String(mockedSearchTerm), }, { Operator: model.BlockContentDataviewFilter_No, RelationKey: bundle.RelationKeySnippet.String(), Condition: model.BlockContentDataviewFilter_Like, - Value: pbtypes.String("search-term"), + Value: pbtypes.String(mockedSearchTerm), }, }, }, @@ -164,9 +182,9 @@ func TestSearchService_Search(t *testing.T) { Records: []*types.Struct{ { Fields: map[string]*types.Value{ - bundle.RelationKeyId.String(): pbtypes.String("obj-global-1"), - bundle.RelationKeyName.String(): pbtypes.String("Global Object"), - bundle.RelationKeySpaceId.String(): pbtypes.String("space-1"), + bundle.RelationKeyId.String(): pbtypes.String(mockedObjectId), + bundle.RelationKeyName.String(): pbtypes.String(mockedObjectName), + bundle.RelationKeySpaceId.String(): pbtypes.String(mockedSpaceId), }, }, }, @@ -175,14 +193,14 @@ func TestSearchService_Search(t *testing.T) { // Mock object show for object blocks and details fx.mwMock.On("ObjectShow", mock.Anything, &pb.RpcObjectShowRequest{ - SpaceId: "space-1", - ObjectId: "obj-global-1", + SpaceId: mockedSpaceId, + ObjectId: mockedObjectId, }).Return(&pb.RpcObjectShowResponse{ ObjectView: &model.ObjectView{ - RootId: "root-123", + RootId: mockedRootId, Blocks: []*model.Block{ { - Id: "root-123", + Id: mockedRootId, Restrictions: &model.BlockRestrictions{ Read: false, Edit: false, @@ -190,7 +208,7 @@ func TestSearchService_Search(t *testing.T) { Drag: false, DropOn: false, }, - ChildrenIds: []string{"header", "text-block", "relation-block"}, + ChildrenIds: []string{"header", "text-block"}, }, { Id: "header", @@ -215,46 +233,46 @@ func TestSearchService_Search(t *testing.T) { }, Details: []*model.ObjectViewDetailsSet{ { - Id: "root-123", + Id: mockedRootId, Details: &types.Struct{ Fields: map[string]*types.Value{ - bundle.RelationKeyId.String(): pbtypes.String("obj-global-1"), - bundle.RelationKeyName.String(): pbtypes.String("Global Object"), + bundle.RelationKeyId.String(): pbtypes.String(mockedObjectId), + bundle.RelationKeyName.String(): pbtypes.String(mockedObjectName), bundle.RelationKeyLayout.String(): pbtypes.Int64(int64(model.ObjectType_basic)), bundle.RelationKeyIconEmoji.String(): pbtypes.String("🌐"), bundle.RelationKeyLastModifiedDate.String(): pbtypes.Float64(999999), - bundle.RelationKeyLastModifiedBy.String(): pbtypes.String("participant-id"), + bundle.RelationKeyLastModifiedBy.String(): pbtypes.String(mockedParticipantId), bundle.RelationKeyCreatedDate.String(): pbtypes.Float64(888888), - bundle.RelationKeyCreator.String(): pbtypes.String("participant-id"), - bundle.RelationKeySpaceId.String(): pbtypes.String("space-1"), - bundle.RelationKeyType.String(): pbtypes.String("type-1"), - bundle.RelationKeyTag.String(): pbtypes.StringList([]string{"tag-1", "tag-2"}), + bundle.RelationKeyCreator.String(): pbtypes.String(mockedParticipantId), + bundle.RelationKeySpaceId.String(): pbtypes.String(mockedSpaceId), + bundle.RelationKeyType.String(): pbtypes.String(mockedType), + bundle.RelationKeyTag.String(): pbtypes.StringList([]string{mockedTagId1, mockedTagId2}), }, }, }, { - Id: "participant-id", + Id: mockedParticipantId, Details: &types.Struct{ Fields: map[string]*types.Value{ - bundle.RelationKeyId.String(): pbtypes.String("participant-id"), + bundle.RelationKeyId.String(): pbtypes.String(mockedParticipantId), }, }, }, { - Id: "tag-1", + Id: mockedTagId1, Details: &types.Struct{ Fields: map[string]*types.Value{ - bundle.RelationKeyName.String(): pbtypes.String("Important"), - bundle.RelationKeyRelationOptionColor.String(): pbtypes.String("red"), + bundle.RelationKeyName.String(): pbtypes.String(mockedTagValue1), + bundle.RelationKeyRelationOptionColor.String(): pbtypes.String(mockedTagColor1), }, }, }, { - Id: "tag-2", + Id: mockedTagId2, Details: &types.Struct{ Fields: map[string]*types.Value{ - bundle.RelationKeyName.String(): pbtypes.String("Optional"), - bundle.RelationKeyRelationOptionColor.String(): pbtypes.String("blue"), + bundle.RelationKeyName.String(): pbtypes.String(mockedTagValue2), + bundle.RelationKeyRelationOptionColor.String(): pbtypes.String(mockedTagColor2), }, }, }, @@ -265,13 +283,13 @@ func TestSearchService_Search(t *testing.T) { // Mock type resolution fx.mwMock.On("ObjectSearch", mock.Anything, &pb.RpcObjectSearchRequest{ - SpaceId: "space-1", + SpaceId: mockedSpaceId, Filters: []*model.BlockContentDataviewFilter{ { Operator: model.BlockContentDataviewFilter_No, RelationKey: bundle.RelationKeyId.String(), Condition: model.BlockContentDataviewFilter_Equal, - Value: pbtypes.String("type-1"), + Value: pbtypes.String(mockedType), }, }, Keys: []string{bundle.RelationKeyName.String()}, @@ -288,13 +306,13 @@ func TestSearchService_Search(t *testing.T) { // Mock participant details fx.mwMock.On("ObjectSearch", mock.Anything, &pb.RpcObjectSearchRequest{ - SpaceId: "space-1", + SpaceId: mockedSpaceId, Filters: []*model.BlockContentDataviewFilter{ { Operator: model.BlockContentDataviewFilter_No, RelationKey: bundle.RelationKeyId.String(), Condition: model.BlockContentDataviewFilter_Equal, - Value: pbtypes.String("participant-id"), + Value: pbtypes.String(mockedParticipantId), }, }, Keys: []string{bundle.RelationKeyId.String(), @@ -309,12 +327,12 @@ func TestSearchService_Search(t *testing.T) { Records: []*types.Struct{ { Fields: map[string]*types.Value{ - bundle.RelationKeyId.String(): pbtypes.String("participant-id"), - bundle.RelationKeyName.String(): pbtypes.String("Participant Name"), - bundle.RelationKeyIconEmoji.String(): pbtypes.String("emoji"), - bundle.RelationKeyIconImage.String(): pbtypes.String("image-url"), - bundle.RelationKeyIdentity.String(): pbtypes.String("identity"), - bundle.RelationKeyGlobalName.String(): pbtypes.String("global-name"), + bundle.RelationKeyId.String(): pbtypes.String(mockedParticipantId), + bundle.RelationKeyName.String(): pbtypes.String(mockedParticipantName), + bundle.RelationKeyIconEmoji.String(): pbtypes.String(mockedParticipantIcon), + bundle.RelationKeyIconImage.String(): pbtypes.String(mockedParticipantImage), + bundle.RelationKeyIdentity.String(): pbtypes.String(mockedParticipantIdentity), + bundle.RelationKeyGlobalName.String(): pbtypes.String(mockedParticipantGlobalName), bundle.RelationKeyParticipantPermissions.String(): pbtypes.Int64(int64(model.ParticipantPermissions_Reader)), }, }, @@ -323,16 +341,16 @@ func TestSearchService_Search(t *testing.T) { }).Twice() // when - objects, total, hasMore, err := fx.GlobalSearch(ctx, SearchRequest{Query: "search-term", Types: []string{}, Sort: SortOptions{Direction: "desc", Timestamp: "last_modified_date"}}, offset, limit) + objects, total, hasMore, err := fx.GlobalSearch(ctx, SearchRequest{Query: mockedSearchTerm, Types: []string{}, Sort: SortOptions{Direction: "desc", Timestamp: "last_modified_date"}}, offset, limit) // then require.NoError(t, err) require.Len(t, objects, 1) require.Equal(t, mockedObjectTypeName, objects[0].Type) - require.Equal(t, "space-1", objects[0].SpaceId) - require.Equal(t, "Global Object", objects[0].Name) - require.Equal(t, "obj-global-1", objects[0].Id) - require.Equal(t, "basic", objects[0].Layout) + require.Equal(t, mockedSpaceId, objects[0].SpaceId) + require.Equal(t, mockedObjectName, objects[0].Name) + require.Equal(t, mockedObjectId, objects[0].Id) + require.Equal(t, model.ObjectTypeLayout_name[int32(model.ObjectType_basic)], objects[0].Layout) require.Equal(t, "🌐", objects[0].Icon) require.Equal(t, "This is a sample text block", objects[0].Blocks[2].Text.Text) @@ -343,9 +361,13 @@ func TestSearchService_Search(t *testing.T) { } else if detail.Id == "last_modified_date" { require.Equal(t, "1970-01-12T13:46:39Z", detail.Details["last_modified_date"]) } else if detail.Id == "created_by" { - require.Equal(t, "participant-id", detail.Details["details"].(space.Member).Id) + require.Equal(t, mockedParticipantId, detail.Details["details"].(space.Member).Id) + require.Equal(t, mockedParticipantName, detail.Details["details"].(space.Member).Name) + require.Equal(t, gatewayUrl+"/image/"+mockedParticipantImage, detail.Details["details"].(space.Member).Icon) + require.Equal(t, mockedParticipantIdentity, detail.Details["details"].(space.Member).Identity) + require.Equal(t, mockedParticipantGlobalName, detail.Details["details"].(space.Member).GlobalName) } else if detail.Id == "last_modified_by" { - require.Equal(t, "participant-id", detail.Details["details"].(space.Member).Id) + require.Equal(t, mockedParticipantId, detail.Details["details"].(space.Member).Id) } } @@ -359,12 +381,12 @@ func TestSearchService_Search(t *testing.T) { } } require.Len(t, tags, 2) - require.Equal(t, "tag-1", tags[0].Id) - require.Equal(t, "Important", tags[0].Name) - require.Equal(t, "red", tags[0].Color) - require.Equal(t, "tag-2", tags[1].Id) - require.Equal(t, "Optional", tags[1].Name) - require.Equal(t, "blue", tags[1].Color) + require.Equal(t, mockedTagId1, tags[0].Id) + require.Equal(t, mockedTagValue1, tags[0].Name) + require.Equal(t, mockedTagColor1, tags[0].Color) + require.Equal(t, mockedTagId2, tags[1].Id) + require.Equal(t, mockedTagValue2, tags[1].Name) + require.Equal(t, mockedTagColor2, tags[1].Color) require.Equal(t, 1, total) require.False(t, hasMore) diff --git a/core/api/internal/space/service.go b/core/api/internal/space/service.go index 9aff17913..9a617b847 100644 --- a/core/api/internal/space/service.go +++ b/core/api/internal/space/service.go @@ -174,7 +174,7 @@ func (s *SpaceService) ListMembers(ctx context.Context, spaceId string, offset i return members, total, hasMore, nil } -func (s *SpaceService) GetParticipantDetails(mw service.ClientCommandsServer, accountInfo *model.AccountInfo, spaceId string, participantId string) Member { +func (s *SpaceService) GetParticipantDetails(mw service.ClientCommandsServer, spaceId string, participantId string) Member { resp := mw.ObjectSearch(context.Background(), &pb.RpcObjectSearchRequest{ SpaceId: spaceId, Filters: []*model.BlockContentDataviewFilter{ @@ -196,7 +196,7 @@ func (s *SpaceService) GetParticipantDetails(mw service.ClientCommandsServer, ac return Member{} } - icon := util.GetIconFromEmojiOrImage(accountInfo, "", resp.Records[0].Fields[bundle.RelationKeyIconImage.String()].GetStringValue()) + icon := util.GetIconFromEmojiOrImage(s.AccountInfo, "", resp.Records[0].Fields[bundle.RelationKeyIconImage.String()].GetStringValue()) return Member{ Type: "member", From 60b6b6e4b7e850b677d4876a80df18b48867ec58 Mon Sep 17 00:00:00 2001 From: Jannis Metrikat <120120832+jmetrikat@users.noreply.github.com> Date: Tue, 28 Jan 2025 18:44:38 +0100 Subject: [PATCH 188/195] GO-4459: Add tests for new type and template endpoint --- core/api/internal/object/service_test.go | 125 +++++++++++++++++++++++ 1 file changed, 125 insertions(+) diff --git a/core/api/internal/object/service_test.go b/core/api/internal/object/service_test.go index d7c485775..10ba7e1c4 100644 --- a/core/api/internal/object/service_test.go +++ b/core/api/internal/object/service_test.go @@ -29,6 +29,13 @@ const ( mockedObjectSnippet = "mocked-object-snippet" mockedObjectIcon = "🔍" mockedObjectTypeUniqueKey = "ot-page" + mockedTypeId = "mocked-type-id" + mockedTypeName = "mocked-type-name" + mockedTypeUniqueKey = "mocked-type-unique-key" + mockedTypeIcon = "📝" + mockedTemplateId = "mocked-template-id" + mockedTemplateName = "mocked-template-name" + mockedTemplateIcon = "📃" ) type fixture struct { @@ -571,6 +578,67 @@ func TestObjectService_ListTypes(t *testing.T) { }) } +func TestObjectService_GetType(t *testing.T) { + t.Run("type found", func(t *testing.T) { + // given + ctx := context.Background() + fx := newFixture(t) + + fx.mwMock.On("ObjectShow", mock.Anything, &pb.RpcObjectShowRequest{ + SpaceId: mockedSpaceId, + ObjectId: mockedTypeId, + }).Return(&pb.RpcObjectShowResponse{ + Error: &pb.RpcObjectShowResponseError{Code: pb.RpcObjectShowResponseError_NULL}, + ObjectView: &model.ObjectView{ + Details: []*model.ObjectViewDetailsSet{ + { + Details: &types.Struct{ + Fields: map[string]*types.Value{ + bundle.RelationKeyId.String(): pbtypes.String(mockedTypeId), + bundle.RelationKeyName.String(): pbtypes.String(mockedTypeName), + bundle.RelationKeyUniqueKey.String(): pbtypes.String(mockedTypeUniqueKey), + bundle.RelationKeyIconEmoji.String(): pbtypes.String(mockedTypeIcon), + bundle.RelationKeyRecommendedLayout.String(): pbtypes.Float64(float64(model.ObjectType_basic)), + }, + }, + }, + }, + }, + }).Once() + + // when + objType, err := fx.GetType(ctx, mockedSpaceId, mockedTypeId) + + // then + require.NoError(t, err) + require.Equal(t, mockedTypeId, objType.Id) + require.Equal(t, mockedTypeName, objType.Name) + require.Equal(t, mockedTypeUniqueKey, objType.UniqueKey) + require.Equal(t, mockedTypeIcon, objType.Icon) + require.Equal(t, model.ObjectTypeLayout_name[int32(model.ObjectType_basic)], objType.RecommendedLayout) + }) + + t.Run("type not found", func(t *testing.T) { + // given + ctx := context.Background() + fx := newFixture(t) + + fx.mwMock.On("ObjectShow", mock.Anything, &pb.RpcObjectShowRequest{ + SpaceId: mockedSpaceId, + ObjectId: mockedTypeId, + }).Return(&pb.RpcObjectShowResponse{ + Error: &pb.RpcObjectShowResponseError{Code: pb.RpcObjectShowResponseError_NOT_FOUND}, + }).Once() + + // when + objType, err := fx.GetType(ctx, mockedSpaceId, mockedTypeId) + + // then + require.ErrorIs(t, err, ErrTypeNotFound) + require.Empty(t, objType) + }) +} + func TestObjectService_ListTemplates(t *testing.T) { t.Run("templates found", func(t *testing.T) { // given @@ -654,3 +722,60 @@ func TestObjectService_ListTemplates(t *testing.T) { require.False(t, hasMore) }) } + +func TestObjectService_GetTemplate(t *testing.T) { + t.Run("template found", func(t *testing.T) { + // given + ctx := context.Background() + fx := newFixture(t) + + fx.mwMock.On("ObjectShow", mock.Anything, &pb.RpcObjectShowRequest{ + SpaceId: mockedSpaceId, + ObjectId: mockedTemplateId, + }).Return(&pb.RpcObjectShowResponse{ + Error: &pb.RpcObjectShowResponseError{Code: pb.RpcObjectShowResponseError_NULL}, + ObjectView: &model.ObjectView{ + Details: []*model.ObjectViewDetailsSet{ + { + Details: &types.Struct{ + Fields: map[string]*types.Value{ + bundle.RelationKeyId.String(): pbtypes.String(mockedTemplateId), + bundle.RelationKeyName.String(): pbtypes.String(mockedTemplateName), + bundle.RelationKeyIconEmoji.String(): pbtypes.String(mockedTemplateIcon), + }, + }, + }, + }, + }, + }).Once() + + // when + template, err := fx.GetTemplate(ctx, mockedSpaceId, mockedObjectType, mockedTemplateId) + + // then + require.NoError(t, err) + require.Equal(t, mockedTemplateId, template.Id) + require.Equal(t, mockedTemplateName, template.Name) + require.Equal(t, mockedTemplateIcon, template.Icon) + }) + + t.Run("template not found", func(t *testing.T) { + // given + ctx := context.Background() + fx := newFixture(t) + + fx.mwMock.On("ObjectShow", mock.Anything, &pb.RpcObjectShowRequest{ + SpaceId: mockedSpaceId, + ObjectId: mockedTemplateId, + }).Return(&pb.RpcObjectShowResponse{ + Error: &pb.RpcObjectShowResponseError{Code: pb.RpcObjectShowResponseError_NOT_FOUND}, + }).Once() + + // when + template, err := fx.GetTemplate(ctx, mockedSpaceId, mockedTypeId, mockedTemplateId) + + // then + require.ErrorIs(t, err, ErrTemplateNotFound) + require.Empty(t, template) + }) +} From 12ffaeba4299f2d077966560648095beed4247f6 Mon Sep 17 00:00:00 2001 From: Jannis Metrikat <120120832+jmetrikat@users.noreply.github.com> Date: Tue, 28 Jan 2025 18:56:51 +0100 Subject: [PATCH 189/195] GO-4459: Return single sort instead of slice in prepareSorts --- core/api/internal/search/service.go | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/core/api/internal/search/service.go b/core/api/internal/search/service.go index 42dcd2ceb..58c783ef3 100644 --- a/core/api/internal/search/service.go +++ b/core/api/internal/search/service.go @@ -48,7 +48,7 @@ func (s *SearchService) GlobalSearch(ctx context.Context, request SearchRequest, baseFilters := s.prepareBaseFilters() queryFilters := s.prepareQueryFilter(request.Query) sorts := s.prepareSorts(request.Sort) - dateToSortAfter := sorts[0].RelationKey + dateToSortAfter := sorts.RelationKey allResponses := make([]*pb.RpcObjectSearchResponse, 0, len(spaces)) for _, space := range spaces { @@ -59,7 +59,7 @@ func (s *SearchService) GlobalSearch(ctx context.Context, request SearchRequest, objResp := s.mw.ObjectSearch(ctx, &pb.RpcObjectSearchRequest{ SpaceId: space.Id, Filters: filters, - Sorts: sorts, + Sorts: []*model.BlockContentDataviewSort{sorts}, Keys: []string{bundle.RelationKeyId.String(), bundle.RelationKeySpaceId.String(), dateToSortAfter}, Limit: int32(offset + limit), // nolint: gosec }) @@ -118,12 +118,12 @@ func (s *SearchService) Search(ctx context.Context, spaceId string, request Sear filters := s.combineFilters(model.BlockContentDataviewFilter_And, baseFilters, queryFilters, typeFilters) sorts := s.prepareSorts(request.Sort) - dateToSortAfter := sorts[0].RelationKey + dateToSortAfter := sorts.RelationKey resp := s.mw.ObjectSearch(ctx, &pb.RpcObjectSearchRequest{ SpaceId: spaceId, Filters: filters, - Sorts: sorts, + Sorts: []*model.BlockContentDataviewSort{sorts}, Keys: []string{bundle.RelationKeyId.String(), bundle.RelationKeySpaceId.String(), dateToSortAfter}, }) @@ -262,14 +262,14 @@ func (s *SearchService) prepareObjectTypeFilters(spaceId string, objectTypes []s } // prepareSorts returns a sort filter based on the given sort parameters -func (s *SearchService) prepareSorts(sort SortOptions) []*model.BlockContentDataviewSort { - return []*model.BlockContentDataviewSort{{ +func (s *SearchService) prepareSorts(sort SortOptions) *model.BlockContentDataviewSort { + return &model.BlockContentDataviewSort{ RelationKey: s.getSortRelationKey(sort.Timestamp), Type: s.getSortDirection(sort.Direction), Format: model.RelationFormat_date, IncludeTime: true, EmptyPlacement: model.BlockContentDataviewSort_NotSpecified, - }} + } } // getSortRelationKey returns the relation key for the given sort timestamp From 58e85ba22473de21447db29e115ab88120bafd01 Mon Sep 17 00:00:00 2001 From: Jannis Metrikat <120120832+jmetrikat@users.noreply.github.com> Date: Tue, 28 Jan 2025 19:26:32 +0100 Subject: [PATCH 190/195] GO-4459: Add tests for single space search endpoint --- core/api/internal/search/service_test.go | 202 +++++++++++++++++++++++ 1 file changed, 202 insertions(+) diff --git a/core/api/internal/search/service_test.go b/core/api/internal/search/service_test.go index 494386b3f..1f248690f 100644 --- a/core/api/internal/search/service_test.go +++ b/core/api/internal/search/service_test.go @@ -392,3 +392,205 @@ func TestSearchService_GlobalSearch(t *testing.T) { require.False(t, hasMore) }) } + +func TestSearchService_Search(t *testing.T) { + t.Run("objects found in a specific space", func(t *testing.T) { + // given + ctx := context.Background() + fx := newFixture(t) + + // Mock objects in space + fx.mwMock.On("ObjectSearch", mock.Anything, &pb.RpcObjectSearchRequest{ + SpaceId: mockedSpaceId, + Filters: []*model.BlockContentDataviewFilter{ + { + Operator: model.BlockContentDataviewFilter_And, + NestedFilters: []*model.BlockContentDataviewFilter{ + { + Operator: model.BlockContentDataviewFilter_No, + RelationKey: bundle.RelationKeyLayout.String(), + Condition: model.BlockContentDataviewFilter_In, + Value: pbtypes.IntList([]int{ + int(model.ObjectType_basic), + int(model.ObjectType_profile), + int(model.ObjectType_todo), + int(model.ObjectType_note), + int(model.ObjectType_bookmark), + int(model.ObjectType_set), + int(model.ObjectType_collection), + int(model.ObjectType_participant), + }...), + }, + { + Operator: model.BlockContentDataviewFilter_No, + RelationKey: bundle.RelationKeyIsHidden.String(), + Condition: model.BlockContentDataviewFilter_NotEqual, + Value: pbtypes.Bool(true), + }, + { + Operator: model.BlockContentDataviewFilter_Or, + NestedFilters: []*model.BlockContentDataviewFilter{ + { + Operator: model.BlockContentDataviewFilter_No, + RelationKey: bundle.RelationKeyName.String(), + Condition: model.BlockContentDataviewFilter_Like, + Value: pbtypes.String(mockedSearchTerm), + }, + { + Operator: model.BlockContentDataviewFilter_No, + RelationKey: bundle.RelationKeySnippet.String(), + Condition: model.BlockContentDataviewFilter_Like, + Value: pbtypes.String(mockedSearchTerm), + }, + }, + }, + }, + }, + }, + Sorts: []*model.BlockContentDataviewSort{{ + RelationKey: bundle.RelationKeyLastModifiedDate.String(), + Type: model.BlockContentDataviewSort_Desc, + Format: model.RelationFormat_date, + IncludeTime: true, + EmptyPlacement: model.BlockContentDataviewSort_NotSpecified, + }}, + Keys: []string{bundle.RelationKeyId.String(), bundle.RelationKeySpaceId.String(), bundle.RelationKeyLastModifiedDate.String()}, + }).Return(&pb.RpcObjectSearchResponse{ + Records: []*types.Struct{ + { + Fields: map[string]*types.Value{ + bundle.RelationKeyId.String(): pbtypes.String(mockedObjectId), + bundle.RelationKeyName.String(): pbtypes.String(mockedObjectName), + bundle.RelationKeySpaceId.String(): pbtypes.String(mockedSpaceId), + }, + }, + }, + Error: &pb.RpcObjectSearchResponseError{Code: pb.RpcObjectSearchResponseError_NULL}, + }).Once() + + // Mock object show for object details + fx.mwMock.On("ObjectShow", mock.Anything, &pb.RpcObjectShowRequest{ + SpaceId: mockedSpaceId, + ObjectId: mockedObjectId, + }).Return(&pb.RpcObjectShowResponse{ + ObjectView: &model.ObjectView{ + RootId: mockedRootId, + Details: []*model.ObjectViewDetailsSet{ + { + Details: &types.Struct{ + Fields: map[string]*types.Value{ + bundle.RelationKeyId.String(): pbtypes.String(mockedObjectId), + bundle.RelationKeyName.String(): pbtypes.String(mockedObjectName), + bundle.RelationKeyLayout.String(): pbtypes.Int64(int64(model.ObjectType_basic)), + bundle.RelationKeyLastModifiedDate.String(): pbtypes.Float64(999999), + bundle.RelationKeySpaceId.String(): pbtypes.String(mockedSpaceId), + bundle.RelationKeyType.String(): pbtypes.String(mockedType), + }, + }, + }, + }, + }, + Error: &pb.RpcObjectShowResponseError{Code: pb.RpcObjectShowResponseError_NULL}, + }).Once() + + // Mock type resolution + fx.mwMock.On("ObjectSearch", mock.Anything, &pb.RpcObjectSearchRequest{ + SpaceId: mockedSpaceId, + Filters: []*model.BlockContentDataviewFilter{ + { + Operator: model.BlockContentDataviewFilter_No, + RelationKey: bundle.RelationKeyId.String(), + Condition: model.BlockContentDataviewFilter_Equal, + Value: pbtypes.String(mockedType), + }, + }, + Keys: []string{bundle.RelationKeyName.String()}, + }).Return(&pb.RpcObjectSearchResponse{ + Records: []*types.Struct{ + { + Fields: map[string]*types.Value{ + bundle.RelationKeyName.String(): pbtypes.String(mockedObjectTypeName), + }, + }, + }, + Error: &pb.RpcObjectSearchResponseError{Code: pb.RpcObjectSearchResponseError_NULL}, + }).Once() + + // Mock participant details + fx.mwMock.On("ObjectSearch", mock.Anything, &pb.RpcObjectSearchRequest{ + SpaceId: mockedSpaceId, + Filters: []*model.BlockContentDataviewFilter{ + { + Operator: model.BlockContentDataviewFilter_No, + RelationKey: bundle.RelationKeyId.String(), + Condition: model.BlockContentDataviewFilter_Equal, + Value: pbtypes.String(""), + }, + }, + Keys: []string{bundle.RelationKeyId.String(), + bundle.RelationKeyName.String(), + bundle.RelationKeyIconEmoji.String(), + bundle.RelationKeyIconImage.String(), + bundle.RelationKeyIdentity.String(), + bundle.RelationKeyGlobalName.String(), + bundle.RelationKeyParticipantPermissions.String(), + }, + }).Return(&pb.RpcObjectSearchResponse{ + Records: []*types.Struct{}, + Error: &pb.RpcObjectSearchResponseError{Code: pb.RpcObjectSearchResponseError_NULL}, + }).Twice() + + // when + objects, total, hasMore, err := fx.Search(ctx, mockedSpaceId, SearchRequest{Query: mockedSearchTerm, Types: []string{}, Sort: SortOptions{Direction: "desc", Timestamp: "last_modified_date"}}, offset, limit) + + // then + require.NoError(t, err) + require.Len(t, objects, 1) + require.Equal(t, mockedObjectName, objects[0].Name) + require.Equal(t, mockedObjectId, objects[0].Id) + require.Equal(t, mockedSpaceId, objects[0].SpaceId) + require.Equal(t, model.ObjectTypeLayout_name[int32(model.ObjectType_basic)], objects[0].Layout) + + require.Equal(t, 1, total) + require.False(t, hasMore) + }) + + t.Run("no objects found in space", func(t *testing.T) { + // given + ctx := context.Background() + fx := newFixture(t) + + fx.mwMock.On("ObjectSearch", mock.Anything, mock.Anything).Return(&pb.RpcObjectSearchResponse{ + Records: []*types.Struct{}, + Error: &pb.RpcObjectSearchResponseError{Code: pb.RpcObjectSearchResponseError_NULL}, + }).Once() + + // when + objects, total, hasMore, err := fx.Search(ctx, mockedSpaceId, SearchRequest{Query: mockedSearchTerm, Types: []string{}, Sort: SortOptions{Direction: "desc", Timestamp: "last_modified_date"}}, offset, limit) + + // then + require.NoError(t, err) + require.Len(t, objects, 0) + require.Equal(t, 0, total) + require.False(t, hasMore) + }) + + t.Run("error during search", func(t *testing.T) { + // given + ctx := context.Background() + fx := newFixture(t) + + fx.mwMock.On("ObjectSearch", mock.Anything, mock.Anything).Return(&pb.RpcObjectSearchResponse{ + Error: &pb.RpcObjectSearchResponseError{Code: pb.RpcObjectSearchResponseError_UNKNOWN_ERROR}, + }).Once() + + // when + objects, total, hasMore, err := fx.Search(ctx, mockedSpaceId, SearchRequest{Query: mockedSearchTerm, Types: []string{}, Sort: SortOptions{Direction: "desc", Timestamp: "last_modified_date"}}, offset, limit) + + // then + require.Error(t, err) + require.Empty(t, objects) + require.Equal(t, 0, total) + require.False(t, hasMore) + }) +} From 1fd4ad454b2b6724778c44d51dba077d54bb1eb7 Mon Sep 17 00:00:00 2001 From: Jannis Metrikat <120120832+jmetrikat@users.noreply.github.com> Date: Tue, 28 Jan 2025 21:13:12 +0100 Subject: [PATCH 191/195] GO-4459: Improve swagger --- core/api/docs/docs.go | 83 ++++++++++++++++++++--------- core/api/docs/swagger.json | 83 ++++++++++++++++++++--------- core/api/docs/swagger.yaml | 73 +++++++++++++++++-------- core/api/internal/auth/model.go | 4 +- core/api/internal/export/handler.go | 2 +- core/api/internal/export/model.go | 4 +- core/api/internal/object/model.go | 8 +-- core/api/internal/search/handler.go | 26 ++++----- core/api/internal/search/model.go | 4 +- core/api/internal/space/handler.go | 2 +- core/api/internal/space/model.go | 4 +- 11 files changed, 193 insertions(+), 100 deletions(-) diff --git a/core/api/docs/docs.go b/core/api/docs/docs.go index 2264a46c9..838673118 100644 --- a/core/api/docs/docs.go +++ b/core/api/docs/docs.go @@ -159,13 +159,7 @@ const docTemplate = `{ "200": { "description": "List of objects", "schema": { - "type": "object", - "additionalProperties": { - "type": "array", - "items": { - "$ref": "#/definitions/object.Object" - } - } + "$ref": "#/definitions/pagination.PaginatedResponse-object_Object" } }, "401": { @@ -246,12 +240,12 @@ const docTemplate = `{ "summary": "Create space", "parameters": [ { - "description": "Space Name", + "description": "Space to create", "name": "name", "in": "body", "required": true, "schema": { - "type": "string" + "$ref": "#/definitions/space.CreateSpaceRequest" } } ], @@ -599,6 +593,10 @@ const docTemplate = `{ "required": true }, { + "enum": [ + "markdown", + "protobuf" + ], "type": "string", "description": "Export format", "name": "format", @@ -683,13 +681,7 @@ const docTemplate = `{ "200": { "description": "List of objects", "schema": { - "type": "object", - "additionalProperties": { - "type": "array", - "items": { - "$ref": "#/definitions/object.Object" - } - } + "$ref": "#/definitions/pagination.PaginatedResponse-object_Object" } }, "401": { @@ -965,11 +957,11 @@ const docTemplate = `{ "properties": { "app_key": { "type": "string", - "example": "" + "example": "zhSG/zQRmgADyilWPtgdnfo1qD60oK02/SVgi1GaFt6=" }, "session_token": { "type": "string", - "example": "" + "example": "eyJhbGciOeJIRzI1NiIsInR5cCI6IkpXVCJ1.eyJzZWVkIjaiY0dmVndlUnAifQ.Y1EZecYnwmvMkrXKOa2XJnAbaRt34urBabe06tmDQII" } } }, @@ -977,7 +969,8 @@ const docTemplate = `{ "type": "object", "properties": { "path": { - "type": "string" + "type": "string", + "example": "/path/to/export" } } }, @@ -987,7 +980,10 @@ const docTemplate = `{ "align": { "type": "string", "enum": [ - "AlignLeft|AlignCenter|AlignRight|AlignJustify" + "AlignLeft", + "AlignCenter", + "AlignRight", + "AlignJustify" ], "example": "AlignLeft" }, @@ -1017,7 +1013,9 @@ const docTemplate = `{ "vertical_align": { "type": "string", "enum": [ - "VerticalAlignTop|VerticalAlignMiddle|VerticalAlignBottom" + "VerticalAlignTop", + "VerticalAlignMiddle", + "VerticalAlignBottom" ], "example": "VerticalAlignTop" } @@ -1066,7 +1064,12 @@ const docTemplate = `{ "id": { "type": "string", "enum": [ - "last_modified_date|last_modified_by|created_date|created_by|last_opened_date|tags" + "last_modified_date", + "last_modified_by", + "created_date", + "created_by", + "last_opened_date", + "tags" ], "example": "last_modified_date" } @@ -1208,7 +1211,20 @@ const docTemplate = `{ "style": { "type": "string", "enum": [ - "Paragraph|Header1|Header2|Header3|Header4|Quote|Code|Title|Checkbox|Marked|Numbered|Toggle|Description|Callout" + "Paragraph", + "Header1", + "Header2", + "Header3", + "Header4", + "Quote", + "Code", + "Title", + "Checkbox", + "Marked", + "Numbered", + "Toggle", + "Description", + "Callout" ], "example": "Paragraph" }, @@ -1374,18 +1390,30 @@ const docTemplate = `{ "type": "string", "default": "desc", "enum": [ - "asc|desc" + "asc", + "desc" ] }, "timestamp": { "type": "string", "default": "last_modified_date", "enum": [ - "created_date|last_modified_date|last_opened_date" + "created_date", + "last_modified_date", + "last_opened_date" ] } } }, + "space.CreateSpaceRequest": { + "type": "object", + "properties": { + "name": { + "type": "string", + "example": "New Space" + } + } + }, "space.CreateSpaceResponse": { "type": "object", "properties": { @@ -1420,7 +1448,10 @@ const docTemplate = `{ "role": { "type": "string", "enum": [ - "Reader|Writer|Owner|NoPermission" + "Reader", + "Writer", + "Owner", + "NoPermission" ], "example": "Owner" }, diff --git a/core/api/docs/swagger.json b/core/api/docs/swagger.json index 1d99fd5f6..cf8fe16d3 100644 --- a/core/api/docs/swagger.json +++ b/core/api/docs/swagger.json @@ -153,13 +153,7 @@ "200": { "description": "List of objects", "schema": { - "type": "object", - "additionalProperties": { - "type": "array", - "items": { - "$ref": "#/definitions/object.Object" - } - } + "$ref": "#/definitions/pagination.PaginatedResponse-object_Object" } }, "401": { @@ -240,12 +234,12 @@ "summary": "Create space", "parameters": [ { - "description": "Space Name", + "description": "Space to create", "name": "name", "in": "body", "required": true, "schema": { - "type": "string" + "$ref": "#/definitions/space.CreateSpaceRequest" } } ], @@ -593,6 +587,10 @@ "required": true }, { + "enum": [ + "markdown", + "protobuf" + ], "type": "string", "description": "Export format", "name": "format", @@ -677,13 +675,7 @@ "200": { "description": "List of objects", "schema": { - "type": "object", - "additionalProperties": { - "type": "array", - "items": { - "$ref": "#/definitions/object.Object" - } - } + "$ref": "#/definitions/pagination.PaginatedResponse-object_Object" } }, "401": { @@ -959,11 +951,11 @@ "properties": { "app_key": { "type": "string", - "example": "" + "example": "zhSG/zQRmgADyilWPtgdnfo1qD60oK02/SVgi1GaFt6=" }, "session_token": { "type": "string", - "example": "" + "example": "eyJhbGciOeJIRzI1NiIsInR5cCI6IkpXVCJ1.eyJzZWVkIjaiY0dmVndlUnAifQ.Y1EZecYnwmvMkrXKOa2XJnAbaRt34urBabe06tmDQII" } } }, @@ -971,7 +963,8 @@ "type": "object", "properties": { "path": { - "type": "string" + "type": "string", + "example": "/path/to/export" } } }, @@ -981,7 +974,10 @@ "align": { "type": "string", "enum": [ - "AlignLeft|AlignCenter|AlignRight|AlignJustify" + "AlignLeft", + "AlignCenter", + "AlignRight", + "AlignJustify" ], "example": "AlignLeft" }, @@ -1011,7 +1007,9 @@ "vertical_align": { "type": "string", "enum": [ - "VerticalAlignTop|VerticalAlignMiddle|VerticalAlignBottom" + "VerticalAlignTop", + "VerticalAlignMiddle", + "VerticalAlignBottom" ], "example": "VerticalAlignTop" } @@ -1060,7 +1058,12 @@ "id": { "type": "string", "enum": [ - "last_modified_date|last_modified_by|created_date|created_by|last_opened_date|tags" + "last_modified_date", + "last_modified_by", + "created_date", + "created_by", + "last_opened_date", + "tags" ], "example": "last_modified_date" } @@ -1202,7 +1205,20 @@ "style": { "type": "string", "enum": [ - "Paragraph|Header1|Header2|Header3|Header4|Quote|Code|Title|Checkbox|Marked|Numbered|Toggle|Description|Callout" + "Paragraph", + "Header1", + "Header2", + "Header3", + "Header4", + "Quote", + "Code", + "Title", + "Checkbox", + "Marked", + "Numbered", + "Toggle", + "Description", + "Callout" ], "example": "Paragraph" }, @@ -1368,18 +1384,30 @@ "type": "string", "default": "desc", "enum": [ - "asc|desc" + "asc", + "desc" ] }, "timestamp": { "type": "string", "default": "last_modified_date", "enum": [ - "created_date|last_modified_date|last_opened_date" + "created_date", + "last_modified_date", + "last_opened_date" ] } } }, + "space.CreateSpaceRequest": { + "type": "object", + "properties": { + "name": { + "type": "string", + "example": "New Space" + } + } + }, "space.CreateSpaceResponse": { "type": "object", "properties": { @@ -1414,7 +1442,10 @@ "role": { "type": "string", "enum": [ - "Reader|Writer|Owner|NoPermission" + "Reader", + "Writer", + "Owner", + "NoPermission" ], "example": "Owner" }, diff --git a/core/api/docs/swagger.yaml b/core/api/docs/swagger.yaml index b91cdd6f7..550a59d1c 100644 --- a/core/api/docs/swagger.yaml +++ b/core/api/docs/swagger.yaml @@ -9,22 +9,26 @@ definitions: auth.TokenResponse: properties: app_key: - example: "" + example: zhSG/zQRmgADyilWPtgdnfo1qD60oK02/SVgi1GaFt6= type: string session_token: - example: "" + example: eyJhbGciOeJIRzI1NiIsInR5cCI6IkpXVCJ1.eyJzZWVkIjaiY0dmVndlUnAifQ.Y1EZecYnwmvMkrXKOa2XJnAbaRt34urBabe06tmDQII type: string type: object export.ObjectExportResponse: properties: path: + example: /path/to/export type: string type: object object.Block: properties: align: enum: - - AlignLeft|AlignCenter|AlignRight|AlignJustify + - AlignLeft + - AlignCenter + - AlignRight + - AlignJustify example: AlignLeft type: string background_color: @@ -45,7 +49,9 @@ definitions: $ref: '#/definitions/object.Text' vertical_align: enum: - - VerticalAlignTop|VerticalAlignMiddle|VerticalAlignBottom + - VerticalAlignTop + - VerticalAlignMiddle + - VerticalAlignBottom example: VerticalAlignTop type: string type: object @@ -80,7 +86,12 @@ definitions: type: object id: enum: - - last_modified_date|last_modified_by|created_date|created_by|last_opened_date|tags + - last_modified_date + - last_modified_by + - created_date + - created_by + - last_opened_date + - tags example: last_modified_date type: string type: object @@ -178,7 +189,20 @@ definitions: type: string style: enum: - - Paragraph|Header1|Header2|Header3|Header4|Quote|Code|Title|Checkbox|Marked|Numbered|Toggle|Description|Callout + - Paragraph + - Header1 + - Header2 + - Header3 + - Header4 + - Quote + - Code + - Title + - Checkbox + - Marked + - Numbered + - Toggle + - Description + - Callout example: Paragraph type: string text: @@ -291,12 +315,21 @@ definitions: direction: default: desc enum: - - asc|desc + - asc + - desc type: string timestamp: default: last_modified_date enum: - - created_date|last_modified_date|last_opened_date + - created_date + - last_modified_date + - last_opened_date + type: string + type: object + space.CreateSpaceRequest: + properties: + name: + example: New Space type: string type: object space.CreateSpaceResponse: @@ -323,7 +356,10 @@ definitions: type: string role: enum: - - Reader|Writer|Owner|NoPermission + - Reader + - Writer + - Owner + - NoPermission example: Owner type: string type: @@ -538,11 +574,7 @@ paths: "200": description: List of objects schema: - additionalProperties: - items: - $ref: '#/definitions/object.Object' - type: array - type: object + $ref: '#/definitions/pagination.PaginatedResponse-object_Object' "401": description: Unauthorized schema: @@ -593,12 +625,12 @@ paths: consumes: - application/json parameters: - - description: Space Name + - description: Space to create in: body name: name required: true schema: - type: string + $ref: '#/definitions/space.CreateSpaceRequest' produces: - application/json responses: @@ -831,6 +863,9 @@ paths: required: true type: string - description: Export format + enum: + - markdown + - protobuf in: path name: format required: true @@ -891,11 +926,7 @@ paths: "200": description: List of objects schema: - additionalProperties: - items: - $ref: '#/definitions/object.Object' - type: array - type: object + $ref: '#/definitions/pagination.PaginatedResponse-object_Object' "401": description: Unauthorized schema: diff --git a/core/api/internal/auth/model.go b/core/api/internal/auth/model.go index e3e4af2c4..2d34926f5 100644 --- a/core/api/internal/auth/model.go +++ b/core/api/internal/auth/model.go @@ -5,6 +5,6 @@ type DisplayCodeResponse struct { } type TokenResponse struct { - SessionToken string `json:"session_token" example:""` - AppKey string `json:"app_key" example:""` + SessionToken string `json:"session_token" example:"eyJhbGciOeJIRzI1NiIsInR5cCI6IkpXVCJ1.eyJzZWVkIjaiY0dmVndlUnAifQ.Y1EZecYnwmvMkrXKOa2XJnAbaRt34urBabe06tmDQII"` + AppKey string `json:"app_key" example:"zhSG/zQRmgADyilWPtgdnfo1qD60oK02/SVgi1GaFt6="` } diff --git a/core/api/internal/export/handler.go b/core/api/internal/export/handler.go index ee259630e..c2ae3a2f8 100644 --- a/core/api/internal/export/handler.go +++ b/core/api/internal/export/handler.go @@ -16,7 +16,7 @@ import ( // @Produce json // @Param space_id path string true "Space ID" // @Param object_id path string true "Object ID" -// @Param format path string true "Export format" +// @Param format path string true "Export format" Enums(markdown,protobuf) // @Success 200 {object} ObjectExportResponse "Object exported successfully" // @Failure 400 {object} util.ValidationError "Bad request" // @Failure 401 {object} util.UnauthorizedError "Unauthorized" diff --git a/core/api/internal/export/model.go b/core/api/internal/export/model.go index f4f464d10..dde242246 100644 --- a/core/api/internal/export/model.go +++ b/core/api/internal/export/model.go @@ -1,9 +1,9 @@ package export type ObjectExportRequest struct { - Path string `json:"path"` + Path string `json:"path" example:"/path/to/export"` } type ObjectExportResponse struct { - Path string `json:"path"` + Path string `json:"path" example:"/path/to/export"` } diff --git a/core/api/internal/object/model.go b/core/api/internal/object/model.go index 21a680370..70ba449aa 100644 --- a/core/api/internal/object/model.go +++ b/core/api/internal/object/model.go @@ -31,15 +31,15 @@ type Block struct { Id string `json:"id" example:"64394517de52ad5acb89c66c"` ChildrenIds []string `json:"children_ids" example:"['6797ce8ecda913cde14b02dc']"` BackgroundColor string `json:"background_color" example:"red"` - Align string `json:"align" enums:"AlignLeft|AlignCenter|AlignRight|AlignJustify" example:"AlignLeft"` - VerticalAlign string `json:"vertical_align" enums:"VerticalAlignTop|VerticalAlignMiddle|VerticalAlignBottom" example:"VerticalAlignTop"` + Align string `json:"align" enums:"AlignLeft,AlignCenter,AlignRight,AlignJustify" example:"AlignLeft"` + VerticalAlign string `json:"vertical_align" enums:"VerticalAlignTop,VerticalAlignMiddle,VerticalAlignBottom" example:"VerticalAlignTop"` Text *Text `json:"text,omitempty"` File *File `json:"file,omitempty"` } type Text struct { Text string `json:"text" example:"Some text"` - Style string `json:"style" enums:"Paragraph|Header1|Header2|Header3|Header4|Quote|Code|Title|Checkbox|Marked|Numbered|Toggle|Description|Callout" example:"Paragraph"` + Style string `json:"style" enums:"Paragraph,Header1,Header2,Header3,Header4,Quote,Code,Title,Checkbox,Marked,Numbered,Toggle,Description,Callout" example:"Paragraph"` Checked bool `json:"checked" example:"true"` Color string `json:"color" example:"red"` Icon string `json:"icon" example:"📄"` @@ -58,7 +58,7 @@ type File struct { } type Detail struct { - Id string `json:"id" enums:"last_modified_date|last_modified_by|created_date|created_by|last_opened_date|tags" example:"last_modified_date"` + Id string `json:"id" enums:"last_modified_date,last_modified_by,created_date,created_by,last_opened_date,tags" example:"last_modified_date"` Details map[string]interface{} `json:"details"` } diff --git a/core/api/internal/search/handler.go b/core/api/internal/search/handler.go index 4a6e70c36..e3ffe62ed 100644 --- a/core/api/internal/search/handler.go +++ b/core/api/internal/search/handler.go @@ -15,12 +15,12 @@ import ( // @Tags search // @Accept json // @Produce json -// @Param offset query int false "The number of items to skip before starting to collect the result set" default(0) -// @Param limit query int false "The number of items to return" default(100) maximum(1000) -// @Param request body SearchRequest true "Search parameters" -// @Success 200 {object} map[string][]object.Object "List of objects" -// @Failure 401 {object} util.UnauthorizedError "Unauthorized" -// @Failure 500 {object} util.ServerError "Internal server error" +// @Param offset query int false "The number of items to skip before starting to collect the result set" default(0) +// @Param limit query int false "The number of items to return" default(100) maximum(1000) +// @Param request body SearchRequest true "Search parameters" +// @Success 200 {object} pagination.PaginatedResponse[object.Object] "List of objects" +// @Failure 401 {object} util.UnauthorizedError "Unauthorized" +// @Failure 500 {object} util.ServerError "Internal server error" // @Router /search [post] func GlobalSearchHandler(s *SearchService) gin.HandlerFunc { return func(c *gin.Context) { @@ -55,13 +55,13 @@ func GlobalSearchHandler(s *SearchService) gin.HandlerFunc { // @Tags search // @Accept json // @Produce json -// @Param space_id path string true "Space ID" -// @Param offset query int false "The number of items to skip before starting to collect the result set" default(0) -// @Param limit query int false "The number of items to return" default(100) maximum(1000) -// @Param request body SearchRequest true "Search parameters" -// @Success 200 {object} map[string][]object.Object "List of objects" -// @Failure 401 {object} util.UnauthorizedError "Unauthorized" -// @Failure 500 {object} util.ServerError "Internal server error" +// @Param space_id path string true "Space ID" +// @Param offset query int false "The number of items to skip before starting to collect the result set" default(0) +// @Param limit query int false "The number of items to return" default(100) maximum(1000) +// @Param request body SearchRequest true "Search parameters" +// @Success 200 {object} pagination.PaginatedResponse[object.Object] "List of objects" +// @Failure 401 {object} util.UnauthorizedError "Unauthorized" +// @Failure 500 {object} util.ServerError "Internal server error" // @Router /spaces/{space_id}/search [post] func SearchHandler(s *SearchService) gin.HandlerFunc { return func(c *gin.Context) { diff --git a/core/api/internal/search/model.go b/core/api/internal/search/model.go index ca64946eb..f52cf59e4 100644 --- a/core/api/internal/search/model.go +++ b/core/api/internal/search/model.go @@ -7,6 +7,6 @@ type SearchRequest struct { } type SortOptions struct { - Direction string `json:"direction" enums:"asc|desc" default:"desc"` - Timestamp string `json:"timestamp" enums:"created_date|last_modified_date|last_opened_date" default:"last_modified_date"` + Direction string `json:"direction" enums:"asc,desc" default:"desc"` + Timestamp string `json:"timestamp" enums:"created_date,last_modified_date,last_opened_date" default:"last_modified_date"` } diff --git a/core/api/internal/space/handler.go b/core/api/internal/space/handler.go index 714bf8e7b..2a6ca043d 100644 --- a/core/api/internal/space/handler.go +++ b/core/api/internal/space/handler.go @@ -48,7 +48,7 @@ func GetSpacesHandler(s *SpaceService) gin.HandlerFunc { // @Tags spaces // @Accept json // @Produce json -// @Param name body string true "Space Name" +// @Param name body CreateSpaceRequest true "Space to create" // @Success 200 {object} CreateSpaceResponse "Space created successfully" // @Failure 400 {object} util.ValidationError "Bad request" // @Failure 401 {object} util.UnauthorizedError "Unauthorized" diff --git a/core/api/internal/space/model.go b/core/api/internal/space/model.go index a0747a6f1..d13951c3f 100644 --- a/core/api/internal/space/model.go +++ b/core/api/internal/space/model.go @@ -1,7 +1,7 @@ package space type CreateSpaceRequest struct { - Name string `json:"name"` + Name string `json:"name" example:"New Space"` } type CreateSpaceResponse struct { @@ -37,5 +37,5 @@ type Member struct { Icon string `json:"icon" example:"http://127.0.0.1:31006/image/bafybeieptz5hvcy6txplcvphjbbh5yjc2zqhmihs3owkh5oab4ezauzqay?width=100"` Identity string `json:"identity" example:"AAjEaEwPF4nkEh7AWkqEnzcQ8HziGB4ETjiTpvRCQvWnSMDZ"` GlobalName string `json:"global_name" example:"john.any"` - Role string `json:"role" enums:"Reader|Writer|Owner|NoPermission" example:"Owner"` + Role string `json:"role" enums:"Reader,Writer,Owner,NoPermission" example:"Owner"` } From 205db1994b0f1a744453538265bd7e779dffd94e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 29 Jan 2025 11:49:34 +0100 Subject: [PATCH 192/195] Bump github.com/samber/lo from 1.49.0 to 1.49.1 (#2060) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index d6574d880..829142b21 100644 --- a/go.mod +++ b/go.mod @@ -85,7 +85,7 @@ require ( github.com/prometheus/client_golang v1.20.5 github.com/pseudomuto/protoc-gen-doc v1.5.1 github.com/rwcarlsen/goexif v0.0.0-20190401172101-9e8deecbddbd - github.com/samber/lo v1.49.0 + github.com/samber/lo v1.49.1 github.com/sasha-s/go-deadlock v0.3.5 github.com/shirou/gopsutil/v3 v3.24.5 github.com/srwiley/oksvg v0.0.0-20221011165216-be6e8873101c diff --git a/go.sum b/go.sum index ad91aade9..99d0be11d 100644 --- a/go.sum +++ b/go.sum @@ -979,8 +979,8 @@ github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQD github.com/rwcarlsen/goexif v0.0.0-20190401172101-9e8deecbddbd h1:CmH9+J6ZSsIjUK3dcGsnCnO41eRBOnY12zwkn5qVwgc= github.com/rwcarlsen/goexif v0.0.0-20190401172101-9e8deecbddbd/go.mod h1:hPqNNc0+uJM6H+SuU8sEs5K5IQeKccPqeSjfgcKGgPk= github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= -github.com/samber/lo v1.49.0 h1:AGnTnQrg1jpFuwECPUSoxZCfVH5W22b605kWSry3YxM= -github.com/samber/lo v1.49.0/go.mod h1:dO6KHFzUKXgP8LDhU0oI8d2hekjXnGOu0DB8Jecxd6o= +github.com/samber/lo v1.49.1 h1:4BIFyVfuQSEpluc7Fua+j1NolZHiEHEpaSEKdsH0tew= +github.com/samber/lo v1.49.1/go.mod h1:dO6KHFzUKXgP8LDhU0oI8d2hekjXnGOu0DB8Jecxd6o= github.com/samuel/go-zookeeper v0.0.0-20190923202752-2cc03de413da/go.mod h1:gi+0XIa01GRL2eRQVjQkKGqKF3SF9vZR/HnPullcV2E= github.com/sasha-s/go-deadlock v0.3.5 h1:tNCOEEDG6tBqrNDOX35j/7hL5FcFViG6awUGROb2NsU= github.com/sasha-s/go-deadlock v0.3.5/go.mod h1:bugP6EGbdGYObIlx7pUZtWqlvo8k9H6vCBBsiChJQ5U= From 425ee7b016594ae6ddb14599b419c78fac4471a6 Mon Sep 17 00:00:00 2001 From: AnastasiaShemyakinskaya Date: Wed, 29 Jan 2025 12:58:06 +0100 Subject: [PATCH 193/195] GO-4968: fix flaky test Signed-off-by: AnastasiaShemyakinskaya --- core/publish/service_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/publish/service_test.go b/core/publish/service_test.go index 6aa175172..bcf12a4f2 100644 --- a/core/publish/service_test.go +++ b/core/publish/service_test.go @@ -677,7 +677,7 @@ func prepareExporterWithFile(t *testing.T, objectTypeId string, spaceService *mo objectType.SetType(smartblock.SmartBlockTypeObjectType) file := smarttest.New(fileId) - fileDoc := objectType.NewState().SetDetails(domain.NewDetailsFromMap(map[domain.RelationKey]domain.Value{ + fileDoc := file.NewState().SetDetails(domain.NewDetailsFromMap(map[domain.RelationKey]domain.Value{ bundle.RelationKeyId: domain.String(fileId), bundle.RelationKeyType: domain.String(objectTypeId), bundle.RelationKeyFileId: domain.String(fileId), From 1c9a3b84e48a814320d01f374228cdf45af5a8a8 Mon Sep 17 00:00:00 2001 From: Roman Khafizianov Date: Wed, 29 Jan 2025 21:17:33 +0100 Subject: [PATCH 194/195] GO-4972 archive sync detail indexation fix (#2064) --- core/indexer/fulltext.go | 12 ++++++++++-- core/indexer/spaceindexer.go | 9 ++++++--- core/syncstatus/detailsupdater/updater.go | 9 +++++++++ pkg/lib/core/smartblock/smartblock.go | 14 ++++++++++---- .../localstore/objectstore/spaceindex/queries.go | 4 ++-- 5 files changed, 37 insertions(+), 11 deletions(-) diff --git a/core/indexer/fulltext.go b/core/indexer/fulltext.go index 79013fbc1..b4344f25a 100644 --- a/core/indexer/fulltext.go +++ b/core/indexer/fulltext.go @@ -151,9 +151,11 @@ var filesLayouts = map[model.ObjectTypeLayout]struct{}{ func (i *indexer) prepareSearchDocument(ctx context.Context, id string) (docs []ftsearch.SearchDoc, err error) { ctx = context.WithValue(ctx, metrics.CtxKeyEntrypoint, "index_fulltext") + var fulltextSkipped bool err = cache.DoContext(i.picker, ctx, id, func(sb smartblock2.SmartBlock) error { - indexDetails, _ := sb.Type().Indexable() - if !indexDetails { + fulltext, _, _ := sb.Type().Indexable() + if !fulltext { + fulltextSkipped = true return nil } @@ -234,6 +236,12 @@ func (i *indexer) prepareSearchDocument(ctx context.Context, id string) (docs [] return nil }) + if fulltextSkipped { + // todo: this should be removed. objects which is not supposed to be added to fulltext index should not be added to the queue + // but now it happens in the ftInit that some objects still can be added to the queue + // we need to avoid TryRemoveFromCache in this case + return docs, nil + } _, cacheErr := i.picker.TryRemoveFromCache(ctx, id) if cacheErr != nil { log.With("objectId", id).Errorf("object cache remove: %v", err) diff --git a/core/indexer/spaceindexer.go b/core/indexer/spaceindexer.go index 36b266b3c..6bfe56678 100644 --- a/core/indexer/spaceindexer.go +++ b/core/indexer/spaceindexer.go @@ -142,7 +142,7 @@ func (i *spaceIndexer) index(ctx context.Context, info smartblock.DocInfo, optio } } - indexDetails, indexLinks := info.SmartblockType.Indexable() + _, indexDetails, indexLinks := info.SmartblockType.Indexable() if !indexDetails && !indexLinks { return nil } @@ -192,8 +192,11 @@ func (i *spaceIndexer) index(ctx context.Context, info smartblock.DocInfo, optio if !(opts.SkipFullTextIfHeadsNotChanged && lastIndexedHash == headHashToIndex) { // Use component's context because ctx from parameter contains transaction - if err := i.objectStore.AddToIndexQueue(i.runCtx, info.Id); err != nil { - log.With("objectID", info.Id).Errorf("can't add id to index queue: %v", err) + fulltext, _, _ := info.SmartblockType.Indexable() + if fulltext { + if err := i.objectStore.AddToIndexQueue(i.runCtx, info.Id); err != nil { + log.With("objectID", info.Id).Errorf("can't add id to index queue: %v", err) + } } } } else { diff --git a/core/syncstatus/detailsupdater/updater.go b/core/syncstatus/detailsupdater/updater.go index 53daa12bc..ddb2f7390 100644 --- a/core/syncstatus/detailsupdater/updater.go +++ b/core/syncstatus/detailsupdater/updater.go @@ -198,6 +198,7 @@ func (u *syncStatusUpdater) updateObjectDetails(syncStatusDetails *syncStatusDet if details == nil { details = domain.NewDetails() } + // todo: make the checks consistent here and in setSyncDetails if !u.isLayoutSuitableForSyncRelations(details) { return details, false, nil } @@ -223,6 +224,14 @@ func (u *syncStatusUpdater) updateObjectDetails(syncStatusDetails *syncStatusDet func (u *syncStatusUpdater) setSyncDetails(sb smartblock.SmartBlock, status domain.ObjectSyncStatus, syncError domain.SyncError) error { if !slices.Contains(helper.SyncRelationsSmartblockTypes(), sb.Type()) { + if sb.LocalDetails().Has(bundle.RelationKeySyncStatus) { + // do cleanup because of previous sync relations indexation problem + st := sb.NewState() + st.LocalDetails().Delete(bundle.RelationKeySyncDate) + st.LocalDetails().Delete(bundle.RelationKeySyncStatus) + st.LocalDetails().Delete(bundle.RelationKeySyncError) + return sb.Apply(st, smartblock.KeepInternalFlags) + } return nil } st := sb.NewState() diff --git a/pkg/lib/core/smartblock/smartblock.go b/pkg/lib/core/smartblock/smartblock.go index ce55b923f..971850506 100644 --- a/pkg/lib/core/smartblock/smartblock.go +++ b/pkg/lib/core/smartblock/smartblock.go @@ -70,13 +70,19 @@ func (sbt SmartBlockType) IsOneOf(sbts ...SmartBlockType) bool { } // Indexable determines if the object of specific type need to be proceeded by the indexer in order to appear in sets -func (sbt SmartBlockType) Indexable() (details, outgoingLinks bool) { +func (sbt SmartBlockType) Indexable() (fulltext, details, outgoingLinks bool) { switch sbt { case SmartBlockTypeDate, SmartBlockTypeAccountOld, SmartBlockTypeNotificationObject, SmartBlockTypeDevicesObject: - return false, false + return false, false, false case SmartBlockTypeWidget, SmartBlockTypeArchive, SmartBlockTypeHome: - return true, false + return false, true, false + case SmartBlockTypeWorkspace, + SmartBlockTypeAccountObject, + SmartBlockTypeChatObject, + SmartBlockTypeChatDerivedObject, + SmartBlockTypeSpaceView: + return false, true, true default: - return true, true + return true, true, true } } diff --git a/pkg/lib/localstore/objectstore/spaceindex/queries.go b/pkg/lib/localstore/objectstore/spaceindex/queries.go index 6cb0c3ca9..4f6edf516 100644 --- a/pkg/lib/localstore/objectstore/spaceindex/queries.go +++ b/pkg/lib/localstore/objectstore/spaceindex/queries.go @@ -174,7 +174,7 @@ func (s *dsObjectStore) QueryFromFulltext(results []database.FulltextResult, par for _, res := range results { // Don't use spaceID because expected objects are virtual if sbt, err := typeprovider.SmartblockTypeFromID(res.Path.ObjectId); err == nil { - if indexDetails, _ := sbt.Indexable(); !indexDetails && s.sourceService != nil { + if _, indexDetails, _ := sbt.Indexable(); !indexDetails && s.sourceService != nil { details, err := s.sourceService.DetailsFromIdBasedSource(domain.FullID{ ObjectID: res.Path.ObjectId, SpaceID: s.SpaceId(), @@ -428,7 +428,7 @@ func (s *dsObjectStore) QueryByIds(ids []string) (records []database.Record, err for _, id := range ids { // Don't use spaceID because expected objects are virtual if sbt, err := typeprovider.SmartblockTypeFromID(id); err == nil { - if indexDetails, _ := sbt.Indexable(); !indexDetails && s.sourceService != nil { + if _, indexDetails, _ := sbt.Indexable(); !indexDetails && s.sourceService != nil { details, err := s.sourceService.DetailsFromIdBasedSource(domain.FullID{ ObjectID: id, SpaceID: s.SpaceId(), From 7acd04da63430b1c1813538f8f53dd363fbd9ff7 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 29 Jan 2025 21:20:10 +0100 Subject: [PATCH 195/195] Bump github.com/golang/glog from 1.2.3 to 1.2.4 (#2061) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 829142b21..c031bfa6f 100644 --- a/go.mod +++ b/go.mod @@ -186,7 +186,7 @@ require ( github.com/gogs/chardet v0.0.0-20211120154057-b7413eaefb8f // indirect github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 // indirect github.com/golang/geo v0.0.0-20210211234256-740aa86cb551 // indirect - github.com/golang/glog v1.2.3 // indirect + github.com/golang/glog v1.2.4 // indirect github.com/golang/protobuf v1.5.4 // indirect github.com/google/flatbuffers v1.12.1 // indirect github.com/google/go-querystring v1.1.0 // indirect diff --git a/go.sum b/go.sum index 99d0be11d..432e76faa 100644 --- a/go.sum +++ b/go.sum @@ -415,8 +415,8 @@ github.com/golang/geo v0.0.0-20200319012246-673a6f80352d/go.mod h1:QZ0nwyI2jOfgR github.com/golang/geo v0.0.0-20210211234256-740aa86cb551 h1:gtexQ/VGyN+VVFRXSFiguSNcXmS6rkKT+X7FdIrTtfo= github.com/golang/geo v0.0.0-20210211234256-740aa86cb551/go.mod h1:QZ0nwyI2jOfgRAoBvP+ab5aRr7c9x7lhGEJrKvBwjWI= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/glog v1.2.3 h1:oDTdz9f5VGVVNGu/Q7UXKWYsD0873HXLHdJUNBsSEKM= -github.com/golang/glog v1.2.3/go.mod h1:6AhwSGph0fcJtXVM/PEHPqZlFeoLxhs7/t5UDAwmO+w= +github.com/golang/glog v1.2.4 h1:CNNw5U8lSiiBk7druxtSHHTsRWcxKoac6kZKm2peBBc= +github.com/golang/glog v1.2.4/go.mod h1:6AhwSGph0fcJtXVM/PEHPqZlFeoLxhs7/t5UDAwmO+w= github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=