diff --git a/CHANGELOG.md b/CHANGELOG.md index dc2a063923..0fe94a9524 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,12 +1,37 @@ -# Changes between v4.1.2 and v4.1.3-alpha1 +# Changes between v4.2.0-rc1 and v4.2.0-rc2 -[See Full Changelog](https://github.com/pydio/cells/compare/v4.1.2...v4.1.3-alpha1) +[See Full Changelog](https://github.com/pydio/cells/compare/v4.2.0-rc1...v4.2.0-rc2) -- [#22212ab](https://github.com/pydio/cells/commit/22212abfc5b88f20e184f080a27bc2e2aee06075): Finally remove unused variable -- [#b318e17](https://github.com/pydio/cells/commit/b318e172303f6450dbcc103804113b6a60e9a158): Check presigned v4 -- [#13ba122](https://github.com/pydio/cells/commit/13ba12233069c79f94b90b3303440686a260ab5b): remove unnecessary test -- [#a066ca3](https://github.com/pydio/cells/commit/a066ca3130571aa3945d2369ecaebc09f4363e9f): Change ctype detection rule, again -- [#9e83f27](https://github.com/pydio/cells/commit/9e83f271513eed566f8471aea0969906f067ee40): Next development cycle -- [#b049eb3](https://github.com/pydio/cells/commit/b049eb36f315409b968608215362572c8b11d252): Change ctype detection rule -- [#5be6170](https://github.com/pydio/cells/commit/5be6170d081bed0788590541c716a5767e245389): Change ctype detection rule -- [#259fbfd](https://github.com/pydio/cells/commit/259fbfdd1c909d32ae2dc366163bc027b6722b90): Change ctype detection from black to white-list +- [#c864883](https://github.com/pydio/cells/commit/c864883afbad3eec1c1845ff9fc38e4ed14de4d0): Change activities display in RailPanel, show Watch button in Public Link field. +- [#9d9be24](https://github.com/pydio/cells/commit/9d9be24f533137581d3eb42ac4fd783756941f09): Forgotten string + DE/FR translation +- [#709bab2](https://github.com/pydio/cells/commit/709bab2a8ec81cd77e4789f776faaa5c05831642): Forgotten string + DE/FR translation +- [#8f355c3](https://github.com/pydio/cells/commit/8f355c3cb5759598cf2f46ffdc00ec7ee00de171): Forgotten i18n string and display glitches +- [#49a2069](https://github.com/pydio/cells/commit/49a206923dceb8cfd99463b0ebbd53047f571b98): Ecxlude reserved slugs for specific agents +- [#95674e2](https://github.com/pydio/cells/commit/95674e2a825a51ad853af5a08c633879ca790f66): Check presigned v4 +- [#b7f3d61](https://github.com/pydio/cells/commit/b7f3d6115f57ead5097ed201b68e71b81fd9cf4b): Change ctype detection from black to white-list +- [#92bf8ef](https://github.com/pydio/cells/commit/92bf8ef63efbd3ef217534e3d36333fbd6beaa29): Display glitches in Console + dark mode +- [#b0e73cf](https://github.com/pydio/cells/commit/b0e73cfb659107b9578b9efa9ac84caaf99c335c): Clear roles by default at user creation. +- [#dc49f87](https://github.com/pydio/cells/commit/dc49f878e5befe694e23d40047fdd5855efcdc71): Mod update again +- [#0dff1c8](https://github.com/pydio/cells/commit/0dff1c89c890d1749f84620a2187d752e4822ef6): DE/FR messages have been missed by first sync +- [#6972dbd](https://github.com/pydio/cells/commit/6972dbd500e6395b18d38f6bd3044609f5c381be): DE/FR messages have been missed by first sync +- [#e5823ca](https://github.com/pydio/cells/commit/e5823ca982afcdfdfe42e14815923b49e2f732f9): New message + DE/FR translations +- [#523f96a](https://github.com/pydio/cells/commit/523f96a9f923109c946848152d1abbf94eebb8a6): Mod update +- [#511e9f3](https://github.com/pydio/cells/commit/511e9f34c7fc2f44bdc386f1d0fe6a7100c5dadf): New message + DE/FR translations +- [#a68e517](https://github.com/pydio/cells/commit/a68e517897d27f6ce8ee4ac24f5e02fb96798892): Update PydioCoreActions +- [#2bd0038](https://github.com/pydio/cells/commit/2bd0038ffe861e8c32640ee8a53195accbc4441f): Rework Cell/Workspace Card and watcher +- [#4298194](https://github.com/pydio/cells/commit/4298194ba9132821c51c0f9c0eb46acec2956169): Fix meta "selection as steps" display +- [#e946090](https://github.com/pydio/cells/commit/e946090aeca57d07716d09fb176820f87d23392a): Fix left chevron 'parent folder' color +- [#eaa18a3](https://github.com/pydio/cells/commit/eaa18a3b7cdc6988e0ce9d43de15263cc4d72a42): Change mimefont to less shiny color +- [#a03280d](https://github.com/pydio/cells/commit/a03280d36eb4645c1716947970d10901d3014842): Remove error message and returning default value for non-parsable url +- [#37494da](https://github.com/pydio/cells/commit/37494da159fda6dad0686c0f653c90b7e7d4850f): Re-add DE/FR translation after merge +- [#2ca67f4](https://github.com/pydio/cells/commit/2ca67f473eb4fdbb7ce84421c061b368aaf7a097): Re-add DE/FR translation after merge +- [#34a8367](https://github.com/pydio/cells/commit/34a83677a2f503884d02aa1a15b3149b28339bc1): Merge remote-tracking branch 'origin/main' +- [#67a7aae](https://github.com/pydio/cells/commit/67a7aaeabec597d5ff4664e9eb9b03d77aa34e5c): Bump cells-sdk +- [#83f1cd7](https://github.com/pydio/cells/commit/83f1cd7496a155860b9f842d49d8597cc5b22875): Fix uploader popover glitch +- [#642655f](https://github.com/pydio/cells/commit/642655f50372aed678f204f9717e1f07deadf781): Temporary remove translations to avoid conflicts +- [#c1e827f](https://github.com/pydio/cells/commit/c1e827f293f54950ceb5a7be35c2250dfbbc4c42): Temporary remove translations to avoid conflicts +- [#b536f8a](https://github.com/pydio/cells/commit/b536f8a3bdcbd7aa5644a78f88ce38db7e758740): Fix glitches after legacy message removal +- [#e1eb881](https://github.com/pydio/cells/commit/e1eb8812120334b3bca61d0d2dffbaff7fede530): Fix glitches after legacy message removal +- [#cfb4817](https://github.com/pydio/cells/commit/cfb4817a9c83a07d7114b944657f4c2656d1f2ab): Unused code and i18n +- [#dc629af](https://github.com/pydio/cells/commit/dc629af80c824c22f0217fd7952f08a6fa64b7fd): DarkMode Recent Locations in Copy Dialog +- [#4769234](https://github.com/pydio/cells/commit/4769234d3363bd76280fb4ea23b5299cb8107722): Fix glitches in custom sharelink diff --git a/Makefile b/Makefile index bb78b2e3fa..6e6c7cc6d0 100644 --- a/Makefile +++ b/Makefile @@ -1,4 +1,4 @@ -DEV_VERSION=4.1.3-dev +DEV_VERSION=4.2.0-dev ENV=env GOOS=linux TODAY:=$(shell date -u +%Y-%m-%dT%H:%M:%S) TIMESTAMP:=$(shell date -u +%Y%m%d%H%M%S) diff --git a/broker/activity/lang/box/de.all.json b/broker/activity/lang/box/de.all.json index 1238f1b96d..109efd3c59 100644 --- a/broker/activity/lang/box/de.all.json +++ b/broker/activity/lang/box/de.all.json @@ -9,7 +9,7 @@ "other": "Auf {{.Object}} wurde von {{.Actor}} zugegriffen" }, "Cell": { - "other": "Zelle" + "other": "Cell" }, "CreatedBy": { "other": "Erstellt von {{.Actor}}" @@ -81,6 +81,6 @@ "other": "{{.Object}} verschoben von {{.Actor}}" }, "Workspace": { - "other": "Arbeitsplatz" + "other": "Workspace" } } \ No newline at end of file diff --git a/broker/mailer/lang/box/fr-ca.all.json b/broker/mailer/lang/box/fr-ca.all.json index de33a772da..ddc312ad9e 100644 --- a/broker/mailer/lang/box/fr-ca.all.json +++ b/broker/mailer/lang/box/fr-ca.all.json @@ -144,7 +144,7 @@ "other": "Adresse d'expédition utilisée par défaut lors de l'envoi de mail. Utilisez un mail de support réel plutôt qu'un \"no-reply\"." }, "Mail.Config.FixOutlookDisplay": { - "other": "Outlook Clients Fix (disable CSS inlining)" + "other": "Fix pour MS Outlook (désactiver CSS)" }, "Mail.Config.Queue.Label": { "other": "File d'attente" @@ -204,10 +204,10 @@ "other": "Mot de passe de l'utilisateur pour se connecter au serveur SMTP" }, "Mail.Config.Smtp.Security.Label": { - "other": "Connection Security" + "other": "Sécurité de la connexion" }, "Mail.Config.Smtp.Security.Description": { - "other": "Protocol used for securing connection. Clear is not supported, if required use a custom Sendmail instead." + "other": "Le protocole utilisé pour sécuriser la connexion. Si une connexion en clair est requise, utilisez plutôt un Sendmail personnalisé." }, "Mail.Config.Smtp.SkipVerify.Label": { "other": "Certificat auto-signé" diff --git a/cmd/admin-clean-acls.go b/cmd/admin-clean-acls.go new file mode 100644 index 0000000000..5c6dc0097a --- /dev/null +++ b/cmd/admin-clean-acls.go @@ -0,0 +1,105 @@ +/* + * Copyright (c) 2019-2021. Abstrium SAS + * This file is part of Pydio Cells. + * + * Pydio Cells is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Pydio Cells is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with Pydio Cells. If not, see . + * + * The latest code can be found at . + */ + +package cmd + +import ( + "fmt" + "github.com/pydio/cells/v4/common/proto/idm" + "os" + "strconv" + "time" + + "github.com/pydio/cells/v4/common/client/grpc" + "github.com/spf13/cobra" + + "github.com/pydio/cells/v4/common" +) + +var ( + cleanAclAfter string + cleanAclBefore string +) + +var dataCleanACLsCmd = &cobra.Command{ + Use: "acls", + Short: "Clean Expired ACLs", + Long: ` +DESCRIPTION + + When deleted after a node deletion, ACLs are not really deleted but only expired, to be able to restore them + if necessary. This can lead to keep unused data, and particularly shared links information that may prevent users to + re-use an existing custom link value. Use this command to definitely delete expired ACLs based on a period. + + Parameters accept either timestamps or durations. In the later case, corresponding time is computed using "Now - Duration". + +EXAMPLES + + Clean all ACLs expired before last 24h + + $ ` + os.Args[0] + ` clean admin acls --before 24h + +`, + Run: func(cmd *cobra.Command, args []string) { + if cleanAclAfter == "" && cleanAclBefore == "" { + cmd.Println("Please provide at least one of --after | --before") + cmd.Help() + return + } + + req := &idm.DeleteACLRequest{} + if ea, err := strconv.ParseInt(cleanAclAfter, 10, 64); err == nil && ea > 0 { + req.ExpiredAfter = ea + } else if d, er := time.ParseDuration(cleanAclAfter); er == nil { + req.ExpiredAfter = time.Now().Add(-d).Unix() + } + if eb, err := strconv.ParseInt(cleanAclBefore, 10, 64); err == nil && eb > 0 { + req.ExpiredBefore = eb + } else if d, er := time.ParseDuration(cleanAclBefore); er == nil { + req.ExpiredBefore = time.Now().Add(-d).Unix() + } + + if req.ExpiredAfter == 0 && req.ExpiredBefore == 0 { + cmd.Println("[ERROR] please provide at least one valid parameter") + cmd.Help() + return + } + + aclClient := idm.NewACLServiceClient(grpc.GetClientConnFromCtx(ctx, common.ServiceAcl)) + resp, e := aclClient.DeleteACL(ctx, req) + if e != nil { + cmd.Println("[ERROR] " + e.Error()) + cmd.Help() + return + } + if resp.GetRowsDeleted() > 0 { + + cmd.Println(fmt.Sprintf("Definitely deleted %d ACLs (period %v-%v)", resp.GetRowsDeleted(), time.Unix(req.ExpiredAfter, 0), time.Unix(req.ExpiredBefore, 0))) + } else { + cmd.Println(fmt.Sprintf("Nothing to delete for period %v-%v", time.Unix(req.ExpiredAfter, 0), time.Unix(req.ExpiredBefore, 0))) + } + }, +} + +func init() { + dataCleanACLsCmd.PersistentFlags().StringVarP(&cleanAclAfter, "after", "a", "", "Expiration date is greater than...") + dataCleanACLsCmd.PersistentFlags().StringVarP(&cleanAclBefore, "before", "b", "240h", "Expiration date is lower than...") + CleanCmd.AddCommand(dataCleanACLsCmd) +} diff --git a/common/config/migrations/4.1.99.go b/common/config/migrations/4.1.99.go new file mode 100644 index 0000000000..ef128c8330 --- /dev/null +++ b/common/config/migrations/4.1.99.go @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2019-2022. Abstrium SAS + * This file is part of Pydio Cells. + * + * Pydio Cells is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Pydio Cells is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with Pydio Cells. If not, see . + * + * The latest code can be found at . + */ + +package migrations + +import ( + "github.com/hashicorp/go-version" + + "github.com/pydio/cells/v4/common/utils/configx" +) + +func init() { + v, _ := version.NewVersion("4.1.99") + add(v, getMigration(upgradeDefaultWebTheme)) +} + +// upgradeDefaultWebTheme change preset theme value to material +func upgradeDefaultWebTheme(conf configx.Values) error { + + theme := conf.Val("frontend", "plugin", "gui.ajax", "GUI_THEME") + if theme.String() == "light" { + _ = theme.Set("mui3") + } + + return nil +} diff --git a/common/dao/abstract.go b/common/dao/abstract.go index 41b406f28c..bacffe6be3 100644 --- a/common/dao/abstract.go +++ b/common/dao/abstract.go @@ -141,7 +141,7 @@ func (h *abstract) Name() string { if u, e := url.Parse(su); e == nil { su = u.Redacted() } else { - fmt.Println("cannot parse dao url for naming", e.Error()) + return "[non-parsable redacted url]" } return su } diff --git a/common/etl/stores/cells/local/api_store.go b/common/etl/stores/cells/local/api_store.go index 57ba21499c..a532e008d2 100644 --- a/common/etl/stores/cells/local/api_store.go +++ b/common/etl/stores/cells/local/api_store.go @@ -516,9 +516,9 @@ func (apiStore *ApiStore) createShareLink(ctx context.Context, ownerUser *idm.Us var user *idm.User var err error aclClient := idm.NewACLServiceClient(grpc.GetClientConnFromCtx(apiStore.runtime, common.ServiceAcl)) - shareClient := share.NewClient(apiStore.runtime) + shareClient := share.NewClient(apiStore.runtime, nil) - workspace, _, err = shareClient.GetOrCreateWorkspace(ctx, ownerUser, "", idm.WorkspaceScope_LINK, link.Label, link.Description, false) + workspace, _, err = shareClient.GetOrCreateWorkspace(ctx, ownerUser, "", idm.WorkspaceScope_LINK, link.Label, "", link.Description, false) if err != nil { return err } @@ -573,8 +573,8 @@ func (apiStore *ApiStore) createShareLink(ctx context.Context, ownerUser *idm.Us func (apiStore *ApiStore) createCell(ctx context.Context, ownerUser *idm.User, cell *rest.Cell) error { - shareClient := share.NewClient(apiStore.runtime) - workspace, _, err := shareClient.GetOrCreateWorkspace(ctx, ownerUser, "", idm.WorkspaceScope_ROOM, cell.Label, cell.Description, false) + shareClient := share.NewClient(apiStore.runtime, nil) + workspace, _, err := shareClient.GetOrCreateWorkspace(ctx, ownerUser, "", idm.WorkspaceScope_ROOM, cell.Label, "", cell.Description, false) if err != nil { return err } diff --git a/common/forms/field.go b/common/forms/field.go index 31e3965ef4..a2c0996141 100644 --- a/common/forms/field.go +++ b/common/forms/field.go @@ -45,14 +45,24 @@ func (b *FormField) Serialize(T i18n.TranslateFunc) (params []*SerialFormParam) if b.Default != nil { switch b.Type { case ParamHidden, ParamString, ParamTextarea, ParamSelect, ParamAutoComplete, ParamAutoCompleteTree: - defaultValue = b.Default.(string) + if s, ok := b.Default.(string); ok { + defaultValue = s + } else { + fmt.Println("[WARNING] Wrong Default Format, expected string, got", b.Default) + } case ParamBool: defaultValue = "false" - if b.Default.(bool) { + if bo, ok := b.Default.(bool); ok && bo { defaultValue = "true" + } else { + fmt.Println("[WARNING] Wrong Default Format, expected bool, got", b.Default) } case ParamInteger: - defaultValue = fmt.Sprintf("%v", b.Default.(int)) + if in, ok := b.Default.(int); ok { + defaultValue = fmt.Sprintf("%v", in) + } else { + fmt.Println("[WARNING] Wrong Default Format, expected integer, got", b.Default) + } } } diff --git a/common/naming.go b/common/naming.go index 39f3af700a..084d52b55f 100644 --- a/common/naming.go +++ b/common/naming.go @@ -217,6 +217,7 @@ const ( MetaFlagChildrenCount = "ChildrenCount" MetaFlagChildrenFolders = "ChildrenFolders" MetaFlagChildrenFiles = "ChildrenFiles" + MetaFlagRecursiveCount = "RecursiveCount" MetaFlagWorkspaceSkipRecycle = "ws_skip_recycle" MetaFlagContentLock = "content_lock" MetaFlagWorkspacesShares = "workspaces_shares" @@ -226,8 +227,9 @@ const ( MetaFlagWorkspaceRepoDisplay = "repository_display" MetaFlagWorkspaceEventId = "EventWorkspaceId" - IdmWsInternalHomepageID = "homepage" - IdmWsInternalSettingsID = "settings" + IdmWsInternalHomepageID = "homepage" + IdmWsInternalSettingsID = "settings" + IdmWsInternalDirectoryID = "directory" ) var ( @@ -244,8 +246,9 @@ var ( } IdmWsInternalReservedSlugs = map[string]string{ - IdmWsInternalSettingsID: "settings", - IdmWsInternalHomepageID: "welcome", + IdmWsInternalSettingsID: "settings", + IdmWsInternalHomepageID: "welcome", + IdmWsInternalDirectoryID: "directory", } ) diff --git a/common/nodes/ancestors.go b/common/nodes/ancestors.go index d9f8dc55a2..fcb327bf8d 100644 --- a/common/nodes/ancestors.go +++ b/common/nodes/ancestors.go @@ -134,13 +134,12 @@ func BuildAncestorsList(ctx context.Context, treeClient tree.NodeProviderClient, func storeParents(dirPath string, parents []*tree.Node) { if len(parents) > 0 { _ = getAncestorsParentsCache().Set(dirPath, parents) - //fmt.Println("Storing "+dirPath+" with ", len(parents), " nodes, first is ", parents[0].GetPath()) } } // BuildAncestorsListOrParent builds ancestors list when the node does not exist yet, by trying to find all existing parents. -func BuildAncestorsListOrParent(ctx context.Context, treeClient tree.NodeProviderClient, node *tree.Node) (parentUuids []*tree.Node, err error) { - parents, err := BuildAncestorsList(ctx, treeClient, node) +func BuildAncestorsListOrParent(ctx context.Context, treeClient tree.NodeProviderClient, node *tree.Node) (parents []*tree.Node, err error) { + parents, err = BuildAncestorsList(ctx, treeClient, node) nodePathParts := strings.Split(node.Path, "/") if err != nil && len(nodePathParts) > 1 { // Try to list parent node right @@ -148,8 +147,8 @@ func BuildAncestorsListOrParent(ctx context.Context, treeClient tree.NodeProvide parentNode.Path = strings.Join(nodePathParts[0:len(nodePathParts)-1], "/") parents, err = BuildAncestorsListOrParent(ctx, treeClient, parentNode) if err != nil { - return parents, err + return } } - return parents, nil + return } diff --git a/common/nodes/compose/compose_test.go b/common/nodes/compose/compose_test.go index 60d76a482e..fe1a267fea 100644 --- a/common/nodes/compose/compose_test.go +++ b/common/nodes/compose/compose_test.go @@ -18,7 +18,7 @@ * The latest code can be found at . */ -package compose +package compose_test import ( "context" @@ -31,6 +31,7 @@ import ( "github.com/pydio/cells/v4/common/client/grpc" "github.com/pydio/cells/v4/common/config/mock" "github.com/pydio/cells/v4/common/nodes" + "github.com/pydio/cells/v4/common/nodes/compose" nodescontext "github.com/pydio/cells/v4/common/nodes/context" "github.com/pydio/cells/v4/common/nodes/models" omock "github.com/pydio/cells/v4/common/nodes/objects/mock" @@ -95,7 +96,7 @@ func TestPersonalResolution(t *testing.T) { reg, _ := registry.OpenRegistry(ctx, "mem:///") ctx = servicecontext.WithRegistry(ctx, reg) ctx = nodescontext.WithSourcesPool(ctx, nodes.NewTestPool(ctx)) - client := PathClient(ctx) + client := compose.PathClient(ctx) Convey("Test personal file", t, func() { user, e := permissions.SearchUniqueUser(ctx, "admin", "") diff --git a/common/proto/idm/cells-idm.pb.go b/common/proto/idm/cells-idm.pb.go index 7f55a42821..eb372525fd 100644 --- a/common/proto/idm/cells-idm.pb.go +++ b/common/proto/idm/cells-idm.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.27.1 -// protoc v3.18.1 +// protoc-gen-go v1.28.1 +// protoc (unknown) // source: cells-idm.proto package idm @@ -324,7 +324,7 @@ func (x UpdateUserMetaRequest_UserMetaOp) Number() protoreflect.EnumNumber { // Deprecated: Use UpdateUserMetaRequest_UserMetaOp.Descriptor instead. func (UpdateUserMetaRequest_UserMetaOp) EnumDescriptor() ([]byte, []int) { - return file_cells_idm_proto_rawDescGZIP(), []int{41, 0} + return file_cells_idm_proto_rawDescGZIP(), []int{43, 0} } type UpdateUserMetaNamespaceRequest_UserMetaNsOp int32 @@ -370,11 +370,13 @@ func (x UpdateUserMetaNamespaceRequest_UserMetaNsOp) Number() protoreflect.EnumN // Deprecated: Use UpdateUserMetaNamespaceRequest_UserMetaNsOp.Descriptor instead. func (UpdateUserMetaNamespaceRequest_UserMetaNsOp) EnumDescriptor() ([]byte, []int) { - return file_cells_idm_proto_rawDescGZIP(), []int{45, 0} + return file_cells_idm_proto_rawDescGZIP(), []int{47, 0} } // ***************************************************************************** -// Messages structure +// +// Messages structure +// // ***************************************************************************** type CreateRoleRequest struct { state protoimpl.MessageState @@ -843,17 +845,17 @@ type RoleSingleQuery struct { // Look for roles by Uuid Uuid []string `protobuf:"bytes,1,rep,name=Uuid,proto3" json:"Uuid,omitempty"` - // Look for roles by label, eventually using wildchar + // Look for roles by label, eventually using "wildchar" Label string `protobuf:"bytes,2,opt,name=Label,proto3" json:"Label,omitempty"` - // Look for team roles only + // Look up for roles associated with a Team IsTeam bool `protobuf:"varint,3,opt,name=IsTeam,proto3" json:"IsTeam,omitempty"` - // Look for group roles only + // Look for roles associated with a Group IsGroupRole bool `protobuf:"varint,4,opt,name=IsGroupRole,proto3" json:"IsGroupRole,omitempty"` - // Look for user roles only + // Look for roles associated with a User IsUserRole bool `protobuf:"varint,5,opt,name=IsUserRole,proto3" json:"IsUserRole,omitempty"` // Look for roles that have any value in the autoApplies field HasAutoApply bool `protobuf:"varint,6,opt,name=HasAutoApply,proto3" json:"HasAutoApply,omitempty"` - // Negate the query + // Internal - Negate the query Not bool `protobuf:"varint,7,opt,name=not,proto3" json:"not,omitempty"` } @@ -939,7 +941,9 @@ func (x *RoleSingleQuery) GetNot() bool { } // ***************************************************************************** -// Messages structure +// +// Messages structure +// // ***************************************************************************** type CreateUserRequest struct { state protoimpl.MessageState @@ -1525,26 +1529,34 @@ type UserSingleQuery struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Uuid string `protobuf:"bytes,11,opt,name=Uuid,proto3" json:"Uuid,omitempty"` - Login string `protobuf:"bytes,1,opt,name=Login,proto3" json:"Login,omitempty"` + // Lookup a user by its Uuid + Uuid string `protobuf:"bytes,11,opt,name=Uuid,proto3" json:"Uuid,omitempty"` + // Lookup a user by Login + Login string `protobuf:"bytes,1,opt,name=Login,proto3" json:"Login,omitempty"` + // Lookup by hashed password, probably never used Password string `protobuf:"bytes,2,opt,name=Password,proto3" json:"Password,omitempty"` - // Search on group path, and if so, search recursively + // List users below a specific on group path GroupPath string `protobuf:"bytes,3,opt,name=GroupPath,proto3" json:"GroupPath,omitempty"` - Recursive bool `protobuf:"varint,4,opt,name=Recursive,proto3" json:"Recursive,omitempty"` - // Search a specific group by path + // When searching on group path, load all users and groups recursively + Recursive bool `protobuf:"varint,4,opt,name=Recursive,proto3" json:"Recursive,omitempty"` + // Search one specific Group by its path FullPath string `protobuf:"bytes,12,opt,name=FullPath,proto3" json:"FullPath,omitempty"` - // Search on attribute - AttributeName string `protobuf:"bytes,5,opt,name=AttributeName,proto3" json:"AttributeName,omitempty"` - AttributeValue string `protobuf:"bytes,6,opt,name=AttributeValue,proto3" json:"AttributeValue,omitempty"` - AttributeAnyValue bool `protobuf:"varint,7,opt,name=AttributeAnyValue,proto3" json:"AttributeAnyValue,omitempty"` - // Search on roles - HasRole string `protobuf:"bytes,8,opt,name=HasRole,proto3" json:"HasRole,omitempty"` + // Search on attribute, to be combined with AttributeValue + AttributeName string `protobuf:"bytes,5,opt,name=AttributeName,proto3" json:"AttributeName,omitempty"` + // Value used for comparison + AttributeValue string `protobuf:"bytes,6,opt,name=AttributeValue,proto3" json:"AttributeValue,omitempty"` + // Search for the existence of the AttributeName, whatever its value + AttributeAnyValue bool `protobuf:"varint,7,opt,name=AttributeAnyValue,proto3" json:"AttributeAnyValue,omitempty"` + // Search users having a specific role UUID + HasRole string `protobuf:"bytes,8,opt,name=HasRole,proto3" json:"HasRole,omitempty"` + // Filter/Search by NodeType (generally user or group) NodeType NodeType `protobuf:"varint,9,opt,name=NodeType,proto3,enum=idm.NodeType" json:"NodeType,omitempty"` - // Shortcut for pydio:profile attribute + // Lookup by profile name (e.g. admin, standard, shared). This is a shortcut for searching on the pydio:profile attribute HasProfile string `protobuf:"bytes,13,opt,name=HasProfile,proto3" json:"HasProfile,omitempty"` - // Compare to last connection date, starting with > or < + // Lookup by last connection date. Must be a timestamp with a leading comparison symbol ('<' or '>') ConnectedSince string `protobuf:"bytes,14,opt,name=ConnectedSince,proto3" json:"ConnectedSince,omitempty"` - Not bool `protobuf:"varint,10,opt,name=not,proto3" json:"not,omitempty"` + // Internal - Negate the query/filter result + Not bool `protobuf:"varint,10,opt,name=not,proto3" json:"not,omitempty"` } func (x *UserSingleQuery) Reset() { @@ -1678,7 +1690,9 @@ func (x *UserSingleQuery) GetNot() bool { } // ***************************************************************************** -// Messages structure +// +// Messages structure +// // ***************************************************************************** type CreateWorkspaceRequest struct { state protoimpl.MessageState @@ -2106,16 +2120,26 @@ type WorkspaceSingleQuery struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Uuid string `protobuf:"bytes,1,opt,name=uuid,proto3" json:"uuid,omitempty"` - Label string `protobuf:"bytes,2,opt,name=label,proto3" json:"label,omitempty"` - Description string `protobuf:"bytes,3,opt,name=description,proto3" json:"description,omitempty"` - Slug string `protobuf:"bytes,4,opt,name=slug,proto3" json:"slug,omitempty"` - Scope WorkspaceScope `protobuf:"varint,5,opt,name=scope,proto3,enum=idm.WorkspaceScope" json:"scope,omitempty"` - LastUpdated string `protobuf:"bytes,7,opt,name=LastUpdated,proto3" json:"LastUpdated,omitempty"` - HasAttribute string `protobuf:"bytes,8,opt,name=HasAttribute,proto3" json:"HasAttribute,omitempty"` - AttributeName string `protobuf:"bytes,9,opt,name=AttributeName,proto3" json:"AttributeName,omitempty"` - AttributeValue string `protobuf:"bytes,10,opt,name=AttributeValue,proto3" json:"AttributeValue,omitempty"` - Not bool `protobuf:"varint,6,opt,name=not,proto3" json:"not,omitempty"` + // Lookup by workspace Uuid + Uuid string `protobuf:"bytes,1,opt,name=uuid,proto3" json:"uuid,omitempty"` + // Lookup by workspace Label + Label string `protobuf:"bytes,2,opt,name=label,proto3" json:"label,omitempty"` + // Lookup by description + Description string `protobuf:"bytes,3,opt,name=description,proto3" json:"description,omitempty"` + // Select workspace by slug + Slug string `protobuf:"bytes,4,opt,name=slug,proto3" json:"slug,omitempty"` + // Restrict to a specific workspace type + Scope WorkspaceScope `protobuf:"varint,5,opt,name=scope,proto3,enum=idm.WorkspaceScope" json:"scope,omitempty"` + // Compared to workspace update date (Golang duration with a leading comparator < or >) + LastUpdated string `protobuf:"bytes,7,opt,name=LastUpdated,proto3" json:"LastUpdated,omitempty"` + // Lookup for the presence of a specific attribute, whatever its value + HasAttribute string `protobuf:"bytes,8,opt,name=HasAttribute,proto3" json:"HasAttribute,omitempty"` + // Lookup for an attribute, to be used in combination with AttributeValue + AttributeName string `protobuf:"bytes,9,opt,name=AttributeName,proto3" json:"AttributeName,omitempty"` + // Value used for comparison + AttributeValue string `protobuf:"bytes,10,opt,name=AttributeValue,proto3" json:"AttributeValue,omitempty"` + // Internal - Negate the query result + Not bool `protobuf:"varint,6,opt,name=not,proto3" json:"not,omitempty"` } func (x *WorkspaceSingleQuery) Reset() { @@ -2221,7 +2245,9 @@ func (x *WorkspaceSingleQuery) GetNot() bool { } // ***************************************************************************** -// ACL Messages structure +// +// ACL Messages structure +// // ***************************************************************************** type CreateACLRequest struct { state protoimpl.MessageState @@ -2432,7 +2458,9 @@ type DeleteACLRequest struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Query *service.Query `protobuf:"bytes,1,opt,name=Query,proto3" json:"Query,omitempty"` + Query *service.Query `protobuf:"bytes,1,opt,name=Query,proto3" json:"Query,omitempty"` + ExpiredAfter int64 `protobuf:"varint,2,opt,name=ExpiredAfter,proto3" json:"ExpiredAfter,omitempty"` + ExpiredBefore int64 `protobuf:"varint,3,opt,name=ExpiredBefore,proto3" json:"ExpiredBefore,omitempty"` } func (x *DeleteACLRequest) Reset() { @@ -2474,6 +2502,20 @@ func (x *DeleteACLRequest) GetQuery() *service.Query { return nil } +func (x *DeleteACLRequest) GetExpiredAfter() int64 { + if x != nil { + return x.ExpiredAfter + } + return 0 +} + +func (x *DeleteACLRequest) GetExpiredBefore() int64 { + if x != nil { + return x.ExpiredBefore + } + return 0 +} + type DeleteACLResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -2526,7 +2568,9 @@ type SearchACLRequest struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Query *service.Query `protobuf:"bytes,1,opt,name=Query,proto3" json:"Query,omitempty"` + Query *service.Query `protobuf:"bytes,1,opt,name=Query,proto3" json:"Query,omitempty"` + ExpiredAfter int64 `protobuf:"varint,2,opt,name=ExpiredAfter,proto3" json:"ExpiredAfter,omitempty"` + ExpiredBefore int64 `protobuf:"varint,3,opt,name=ExpiredBefore,proto3" json:"ExpiredBefore,omitempty"` } func (x *SearchACLRequest) Reset() { @@ -2568,6 +2612,20 @@ func (x *SearchACLRequest) GetQuery() *service.Query { return nil } +func (x *SearchACLRequest) GetExpiredAfter() int64 { + if x != nil { + return x.ExpiredAfter + } + return 0 +} + +func (x *SearchACLRequest) GetExpiredBefore() int64 { + if x != nil { + return x.ExpiredBefore + } + return 0 +} + type SearchACLResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -2615,19 +2673,131 @@ func (x *SearchACLResponse) GetACL() *ACL { return nil } +type RestoreACLRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Query *service.Query `protobuf:"bytes,1,opt,name=Query,proto3" json:"Query,omitempty"` + ExpiredAfter int64 `protobuf:"varint,2,opt,name=ExpiredAfter,proto3" json:"ExpiredAfter,omitempty"` + ExpiredBefore int64 `protobuf:"varint,3,opt,name=ExpiredBefore,proto3" json:"ExpiredBefore,omitempty"` +} + +func (x *RestoreACLRequest) Reset() { + *x = RestoreACLRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_cells_idm_proto_msgTypes[36] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *RestoreACLRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*RestoreACLRequest) ProtoMessage() {} + +func (x *RestoreACLRequest) ProtoReflect() protoreflect.Message { + mi := &file_cells_idm_proto_msgTypes[36] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use RestoreACLRequest.ProtoReflect.Descriptor instead. +func (*RestoreACLRequest) Descriptor() ([]byte, []int) { + return file_cells_idm_proto_rawDescGZIP(), []int{36} +} + +func (x *RestoreACLRequest) GetQuery() *service.Query { + if x != nil { + return x.Query + } + return nil +} + +func (x *RestoreACLRequest) GetExpiredAfter() int64 { + if x != nil { + return x.ExpiredAfter + } + return 0 +} + +func (x *RestoreACLRequest) GetExpiredBefore() int64 { + if x != nil { + return x.ExpiredBefore + } + return 0 +} + +type RestoreACLResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Rows int64 `protobuf:"varint,1,opt,name=Rows,proto3" json:"Rows,omitempty"` +} + +func (x *RestoreACLResponse) Reset() { + *x = RestoreACLResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_cells_idm_proto_msgTypes[37] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *RestoreACLResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*RestoreACLResponse) ProtoMessage() {} + +func (x *RestoreACLResponse) ProtoReflect() protoreflect.Message { + mi := &file_cells_idm_proto_msgTypes[37] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use RestoreACLResponse.ProtoReflect.Descriptor instead. +func (*RestoreACLResponse) Descriptor() ([]byte, []int) { + return file_cells_idm_proto_rawDescGZIP(), []int{37} +} + +func (x *RestoreACLResponse) GetRows() int64 { + if x != nil { + return x.Rows + } + return 0 +} + type ACLAction struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Name string `protobuf:"bytes,1,opt,name=Name,proto3" json:"Name,omitempty"` + // ACL Action name, most frequent values are "read" or "write" + Name string `protobuf:"bytes,1,opt,name=Name,proto3" json:"Name,omitempty"` + // ACL Action value Value string `protobuf:"bytes,2,opt,name=Value,proto3" json:"Value,omitempty"` } func (x *ACLAction) Reset() { *x = ACLAction{} if protoimpl.UnsafeEnabled { - mi := &file_cells_idm_proto_msgTypes[36] + mi := &file_cells_idm_proto_msgTypes[38] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2640,7 +2810,7 @@ func (x *ACLAction) String() string { func (*ACLAction) ProtoMessage() {} func (x *ACLAction) ProtoReflect() protoreflect.Message { - mi := &file_cells_idm_proto_msgTypes[36] + mi := &file_cells_idm_proto_msgTypes[38] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2653,7 +2823,7 @@ func (x *ACLAction) ProtoReflect() protoreflect.Message { // Deprecated: Use ACLAction.ProtoReflect.Descriptor instead. func (*ACLAction) Descriptor() ([]byte, []int) { - return file_cells_idm_proto_rawDescGZIP(), []int{36} + return file_cells_idm_proto_rawDescGZIP(), []int{38} } func (x *ACLAction) GetName() string { @@ -2692,7 +2862,7 @@ type ACL struct { func (x *ACL) Reset() { *x = ACL{} if protoimpl.UnsafeEnabled { - mi := &file_cells_idm_proto_msgTypes[37] + mi := &file_cells_idm_proto_msgTypes[39] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2705,7 +2875,7 @@ func (x *ACL) String() string { func (*ACL) ProtoMessage() {} func (x *ACL) ProtoReflect() protoreflect.Message { - mi := &file_cells_idm_proto_msgTypes[37] + mi := &file_cells_idm_proto_msgTypes[39] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2718,7 +2888,7 @@ func (x *ACL) ProtoReflect() protoreflect.Message { // Deprecated: Use ACL.ProtoReflect.Descriptor instead. func (*ACL) Descriptor() ([]byte, []int) { - return file_cells_idm_proto_rawDescGZIP(), []int{37} + return file_cells_idm_proto_rawDescGZIP(), []int{39} } func (x *ACL) GetID() string { @@ -2761,17 +2931,22 @@ type ACLSingleQuery struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Actions []*ACLAction `protobuf:"bytes,1,rep,name=Actions,proto3" json:"Actions,omitempty"` - RoleIDs []string `protobuf:"bytes,2,rep,name=RoleIDs,proto3" json:"RoleIDs,omitempty"` - WorkspaceIDs []string `protobuf:"bytes,3,rep,name=WorkspaceIDs,proto3" json:"WorkspaceIDs,omitempty"` - NodeIDs []string `protobuf:"bytes,4,rep,name=NodeIDs,proto3" json:"NodeIDs,omitempty"` - Not bool `protobuf:"varint,5,opt,name=not,proto3" json:"not,omitempty"` + // List of Actions to lookup + Actions []*ACLAction `protobuf:"bytes,1,rep,name=Actions,proto3" json:"Actions,omitempty"` + // Filter by one or more role UUID + RoleIDs []string `protobuf:"bytes,2,rep,name=RoleIDs,proto3" json:"RoleIDs,omitempty"` + // Filter by one or more workspace UUID + WorkspaceIDs []string `protobuf:"bytes,3,rep,name=WorkspaceIDs,proto3" json:"WorkspaceIDs,omitempty"` + // Filter by one or more node UUID + NodeIDs []string `protobuf:"bytes,4,rep,name=NodeIDs,proto3" json:"NodeIDs,omitempty"` + // Internal - Negate query + Not bool `protobuf:"varint,5,opt,name=not,proto3" json:"not,omitempty"` } func (x *ACLSingleQuery) Reset() { *x = ACLSingleQuery{} if protoimpl.UnsafeEnabled { - mi := &file_cells_idm_proto_msgTypes[38] + mi := &file_cells_idm_proto_msgTypes[40] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2784,7 +2959,7 @@ func (x *ACLSingleQuery) String() string { func (*ACLSingleQuery) ProtoMessage() {} func (x *ACLSingleQuery) ProtoReflect() protoreflect.Message { - mi := &file_cells_idm_proto_msgTypes[38] + mi := &file_cells_idm_proto_msgTypes[40] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2797,7 +2972,7 @@ func (x *ACLSingleQuery) ProtoReflect() protoreflect.Message { // Deprecated: Use ACLSingleQuery.ProtoReflect.Descriptor instead. func (*ACLSingleQuery) Descriptor() ([]byte, []int) { - return file_cells_idm_proto_rawDescGZIP(), []int{38} + return file_cells_idm_proto_rawDescGZIP(), []int{40} } func (x *ACLSingleQuery) GetActions() []*ACLAction { @@ -2860,7 +3035,7 @@ type UserMeta struct { func (x *UserMeta) Reset() { *x = UserMeta{} if protoimpl.UnsafeEnabled { - mi := &file_cells_idm_proto_msgTypes[39] + mi := &file_cells_idm_proto_msgTypes[41] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2873,7 +3048,7 @@ func (x *UserMeta) String() string { func (*UserMeta) ProtoMessage() {} func (x *UserMeta) ProtoReflect() protoreflect.Message { - mi := &file_cells_idm_proto_msgTypes[39] + mi := &file_cells_idm_proto_msgTypes[41] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2886,7 +3061,7 @@ func (x *UserMeta) ProtoReflect() protoreflect.Message { // Deprecated: Use UserMeta.ProtoReflect.Descriptor instead. func (*UserMeta) Descriptor() ([]byte, []int) { - return file_cells_idm_proto_rawDescGZIP(), []int{39} + return file_cells_idm_proto_rawDescGZIP(), []int{41} } func (x *UserMeta) GetUuid() string { @@ -2963,7 +3138,7 @@ type UserMetaNamespace struct { func (x *UserMetaNamespace) Reset() { *x = UserMetaNamespace{} if protoimpl.UnsafeEnabled { - mi := &file_cells_idm_proto_msgTypes[40] + mi := &file_cells_idm_proto_msgTypes[42] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2976,7 +3151,7 @@ func (x *UserMetaNamespace) String() string { func (*UserMetaNamespace) ProtoMessage() {} func (x *UserMetaNamespace) ProtoReflect() protoreflect.Message { - mi := &file_cells_idm_proto_msgTypes[40] + mi := &file_cells_idm_proto_msgTypes[42] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2989,7 +3164,7 @@ func (x *UserMetaNamespace) ProtoReflect() protoreflect.Message { // Deprecated: Use UserMetaNamespace.ProtoReflect.Descriptor instead. func (*UserMetaNamespace) Descriptor() ([]byte, []int) { - return file_cells_idm_proto_rawDescGZIP(), []int{40} + return file_cells_idm_proto_rawDescGZIP(), []int{42} } func (x *UserMetaNamespace) GetNamespace() string { @@ -3056,7 +3231,7 @@ type UpdateUserMetaRequest struct { func (x *UpdateUserMetaRequest) Reset() { *x = UpdateUserMetaRequest{} if protoimpl.UnsafeEnabled { - mi := &file_cells_idm_proto_msgTypes[41] + mi := &file_cells_idm_proto_msgTypes[43] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3069,7 +3244,7 @@ func (x *UpdateUserMetaRequest) String() string { func (*UpdateUserMetaRequest) ProtoMessage() {} func (x *UpdateUserMetaRequest) ProtoReflect() protoreflect.Message { - mi := &file_cells_idm_proto_msgTypes[41] + mi := &file_cells_idm_proto_msgTypes[43] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3082,7 +3257,7 @@ func (x *UpdateUserMetaRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use UpdateUserMetaRequest.ProtoReflect.Descriptor instead. func (*UpdateUserMetaRequest) Descriptor() ([]byte, []int) { - return file_cells_idm_proto_rawDescGZIP(), []int{41} + return file_cells_idm_proto_rawDescGZIP(), []int{43} } func (x *UpdateUserMetaRequest) GetOperation() UpdateUserMetaRequest_UserMetaOp { @@ -3112,7 +3287,7 @@ type UpdateUserMetaResponse struct { func (x *UpdateUserMetaResponse) Reset() { *x = UpdateUserMetaResponse{} if protoimpl.UnsafeEnabled { - mi := &file_cells_idm_proto_msgTypes[42] + mi := &file_cells_idm_proto_msgTypes[44] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3125,7 +3300,7 @@ func (x *UpdateUserMetaResponse) String() string { func (*UpdateUserMetaResponse) ProtoMessage() {} func (x *UpdateUserMetaResponse) ProtoReflect() protoreflect.Message { - mi := &file_cells_idm_proto_msgTypes[42] + mi := &file_cells_idm_proto_msgTypes[44] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3138,7 +3313,7 @@ func (x *UpdateUserMetaResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use UpdateUserMetaResponse.ProtoReflect.Descriptor instead. func (*UpdateUserMetaResponse) Descriptor() ([]byte, []int) { - return file_cells_idm_proto_rawDescGZIP(), []int{42} + return file_cells_idm_proto_rawDescGZIP(), []int{44} } func (x *UpdateUserMetaResponse) GetMetaDatas() []*UserMeta { @@ -3169,7 +3344,7 @@ type SearchUserMetaRequest struct { func (x *SearchUserMetaRequest) Reset() { *x = SearchUserMetaRequest{} if protoimpl.UnsafeEnabled { - mi := &file_cells_idm_proto_msgTypes[43] + mi := &file_cells_idm_proto_msgTypes[45] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3182,7 +3357,7 @@ func (x *SearchUserMetaRequest) String() string { func (*SearchUserMetaRequest) ProtoMessage() {} func (x *SearchUserMetaRequest) ProtoReflect() protoreflect.Message { - mi := &file_cells_idm_proto_msgTypes[43] + mi := &file_cells_idm_proto_msgTypes[45] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3195,7 +3370,7 @@ func (x *SearchUserMetaRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use SearchUserMetaRequest.ProtoReflect.Descriptor instead. func (*SearchUserMetaRequest) Descriptor() ([]byte, []int) { - return file_cells_idm_proto_rawDescGZIP(), []int{43} + return file_cells_idm_proto_rawDescGZIP(), []int{45} } func (x *SearchUserMetaRequest) GetMetaUuids() []string { @@ -3245,7 +3420,7 @@ type SearchUserMetaResponse struct { func (x *SearchUserMetaResponse) Reset() { *x = SearchUserMetaResponse{} if protoimpl.UnsafeEnabled { - mi := &file_cells_idm_proto_msgTypes[44] + mi := &file_cells_idm_proto_msgTypes[46] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3258,7 +3433,7 @@ func (x *SearchUserMetaResponse) String() string { func (*SearchUserMetaResponse) ProtoMessage() {} func (x *SearchUserMetaResponse) ProtoReflect() protoreflect.Message { - mi := &file_cells_idm_proto_msgTypes[44] + mi := &file_cells_idm_proto_msgTypes[46] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3271,7 +3446,7 @@ func (x *SearchUserMetaResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use SearchUserMetaResponse.ProtoReflect.Descriptor instead. func (*SearchUserMetaResponse) Descriptor() ([]byte, []int) { - return file_cells_idm_proto_rawDescGZIP(), []int{44} + return file_cells_idm_proto_rawDescGZIP(), []int{46} } func (x *SearchUserMetaResponse) GetUserMeta() *UserMeta { @@ -3294,7 +3469,7 @@ type UpdateUserMetaNamespaceRequest struct { func (x *UpdateUserMetaNamespaceRequest) Reset() { *x = UpdateUserMetaNamespaceRequest{} if protoimpl.UnsafeEnabled { - mi := &file_cells_idm_proto_msgTypes[45] + mi := &file_cells_idm_proto_msgTypes[47] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3307,7 +3482,7 @@ func (x *UpdateUserMetaNamespaceRequest) String() string { func (*UpdateUserMetaNamespaceRequest) ProtoMessage() {} func (x *UpdateUserMetaNamespaceRequest) ProtoReflect() protoreflect.Message { - mi := &file_cells_idm_proto_msgTypes[45] + mi := &file_cells_idm_proto_msgTypes[47] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3320,7 +3495,7 @@ func (x *UpdateUserMetaNamespaceRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use UpdateUserMetaNamespaceRequest.ProtoReflect.Descriptor instead. func (*UpdateUserMetaNamespaceRequest) Descriptor() ([]byte, []int) { - return file_cells_idm_proto_rawDescGZIP(), []int{45} + return file_cells_idm_proto_rawDescGZIP(), []int{47} } func (x *UpdateUserMetaNamespaceRequest) GetOperation() UpdateUserMetaNamespaceRequest_UserMetaNsOp { @@ -3349,7 +3524,7 @@ type UpdateUserMetaNamespaceResponse struct { func (x *UpdateUserMetaNamespaceResponse) Reset() { *x = UpdateUserMetaNamespaceResponse{} if protoimpl.UnsafeEnabled { - mi := &file_cells_idm_proto_msgTypes[46] + mi := &file_cells_idm_proto_msgTypes[48] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3362,7 +3537,7 @@ func (x *UpdateUserMetaNamespaceResponse) String() string { func (*UpdateUserMetaNamespaceResponse) ProtoMessage() {} func (x *UpdateUserMetaNamespaceResponse) ProtoReflect() protoreflect.Message { - mi := &file_cells_idm_proto_msgTypes[46] + mi := &file_cells_idm_proto_msgTypes[48] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3375,7 +3550,7 @@ func (x *UpdateUserMetaNamespaceResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use UpdateUserMetaNamespaceResponse.ProtoReflect.Descriptor instead. func (*UpdateUserMetaNamespaceResponse) Descriptor() ([]byte, []int) { - return file_cells_idm_proto_rawDescGZIP(), []int{46} + return file_cells_idm_proto_rawDescGZIP(), []int{48} } func (x *UpdateUserMetaNamespaceResponse) GetNamespaces() []*UserMetaNamespace { @@ -3395,7 +3570,7 @@ type ListUserMetaNamespaceRequest struct { func (x *ListUserMetaNamespaceRequest) Reset() { *x = ListUserMetaNamespaceRequest{} if protoimpl.UnsafeEnabled { - mi := &file_cells_idm_proto_msgTypes[47] + mi := &file_cells_idm_proto_msgTypes[49] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3408,7 +3583,7 @@ func (x *ListUserMetaNamespaceRequest) String() string { func (*ListUserMetaNamespaceRequest) ProtoMessage() {} func (x *ListUserMetaNamespaceRequest) ProtoReflect() protoreflect.Message { - mi := &file_cells_idm_proto_msgTypes[47] + mi := &file_cells_idm_proto_msgTypes[49] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3421,7 +3596,7 @@ func (x *ListUserMetaNamespaceRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ListUserMetaNamespaceRequest.ProtoReflect.Descriptor instead. func (*ListUserMetaNamespaceRequest) Descriptor() ([]byte, []int) { - return file_cells_idm_proto_rawDescGZIP(), []int{47} + return file_cells_idm_proto_rawDescGZIP(), []int{49} } // Collection of results @@ -3436,7 +3611,7 @@ type ListUserMetaNamespaceResponse struct { func (x *ListUserMetaNamespaceResponse) Reset() { *x = ListUserMetaNamespaceResponse{} if protoimpl.UnsafeEnabled { - mi := &file_cells_idm_proto_msgTypes[48] + mi := &file_cells_idm_proto_msgTypes[50] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3449,7 +3624,7 @@ func (x *ListUserMetaNamespaceResponse) String() string { func (*ListUserMetaNamespaceResponse) ProtoMessage() {} func (x *ListUserMetaNamespaceResponse) ProtoReflect() protoreflect.Message { - mi := &file_cells_idm_proto_msgTypes[48] + mi := &file_cells_idm_proto_msgTypes[50] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3462,7 +3637,7 @@ func (x *ListUserMetaNamespaceResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ListUserMetaNamespaceResponse.ProtoReflect.Descriptor instead. func (*ListUserMetaNamespaceResponse) Descriptor() ([]byte, []int) { - return file_cells_idm_proto_rawDescGZIP(), []int{48} + return file_cells_idm_proto_rawDescGZIP(), []int{50} } func (x *ListUserMetaNamespaceResponse) GetUserMetaNamespace() *UserMetaNamespace { @@ -3491,7 +3666,7 @@ type ChangeEvent struct { func (x *ChangeEvent) Reset() { *x = ChangeEvent{} if protoimpl.UnsafeEnabled { - mi := &file_cells_idm_proto_msgTypes[49] + mi := &file_cells_idm_proto_msgTypes[51] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3504,7 +3679,7 @@ func (x *ChangeEvent) String() string { func (*ChangeEvent) ProtoMessage() {} func (x *ChangeEvent) ProtoReflect() protoreflect.Message { - mi := &file_cells_idm_proto_msgTypes[49] + mi := &file_cells_idm_proto_msgTypes[51] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3517,7 +3692,7 @@ func (x *ChangeEvent) ProtoReflect() protoreflect.Message { // Deprecated: Use ChangeEvent.ProtoReflect.Descriptor instead. func (*ChangeEvent) Descriptor() ([]byte, []int) { - return file_cells_idm_proto_rawDescGZIP(), []int{49} + return file_cells_idm_proto_rawDescGZIP(), []int{51} } func (x *ChangeEvent) GetJsonType() string { @@ -3593,7 +3768,7 @@ type PolicyEngineRequest struct { func (x *PolicyEngineRequest) Reset() { *x = PolicyEngineRequest{} if protoimpl.UnsafeEnabled { - mi := &file_cells_idm_proto_msgTypes[50] + mi := &file_cells_idm_proto_msgTypes[52] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3606,7 +3781,7 @@ func (x *PolicyEngineRequest) String() string { func (*PolicyEngineRequest) ProtoMessage() {} func (x *PolicyEngineRequest) ProtoReflect() protoreflect.Message { - mi := &file_cells_idm_proto_msgTypes[50] + mi := &file_cells_idm_proto_msgTypes[52] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3619,7 +3794,7 @@ func (x *PolicyEngineRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use PolicyEngineRequest.ProtoReflect.Descriptor instead. func (*PolicyEngineRequest) Descriptor() ([]byte, []int) { - return file_cells_idm_proto_rawDescGZIP(), []int{50} + return file_cells_idm_proto_rawDescGZIP(), []int{52} } func (x *PolicyEngineRequest) GetResource() string { @@ -3663,7 +3838,7 @@ type PolicyEngineResponse struct { func (x *PolicyEngineResponse) Reset() { *x = PolicyEngineResponse{} if protoimpl.UnsafeEnabled { - mi := &file_cells_idm_proto_msgTypes[51] + mi := &file_cells_idm_proto_msgTypes[53] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3676,7 +3851,7 @@ func (x *PolicyEngineResponse) String() string { func (*PolicyEngineResponse) ProtoMessage() {} func (x *PolicyEngineResponse) ProtoReflect() protoreflect.Message { - mi := &file_cells_idm_proto_msgTypes[51] + mi := &file_cells_idm_proto_msgTypes[53] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3689,7 +3864,7 @@ func (x *PolicyEngineResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use PolicyEngineResponse.ProtoReflect.Descriptor instead. func (*PolicyEngineResponse) Descriptor() ([]byte, []int) { - return file_cells_idm_proto_rawDescGZIP(), []int{51} + return file_cells_idm_proto_rawDescGZIP(), []int{53} } func (x *PolicyEngineResponse) GetAllowed() bool { @@ -3725,7 +3900,7 @@ type PolicyCondition struct { func (x *PolicyCondition) Reset() { *x = PolicyCondition{} if protoimpl.UnsafeEnabled { - mi := &file_cells_idm_proto_msgTypes[52] + mi := &file_cells_idm_proto_msgTypes[54] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3738,7 +3913,7 @@ func (x *PolicyCondition) String() string { func (*PolicyCondition) ProtoMessage() {} func (x *PolicyCondition) ProtoReflect() protoreflect.Message { - mi := &file_cells_idm_proto_msgTypes[52] + mi := &file_cells_idm_proto_msgTypes[54] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3751,7 +3926,7 @@ func (x *PolicyCondition) ProtoReflect() protoreflect.Message { // Deprecated: Use PolicyCondition.ProtoReflect.Descriptor instead. func (*PolicyCondition) Descriptor() ([]byte, []int) { - return file_cells_idm_proto_rawDescGZIP(), []int{52} + return file_cells_idm_proto_rawDescGZIP(), []int{54} } func (x *PolicyCondition) GetType() string { @@ -3785,7 +3960,7 @@ type Policy struct { func (x *Policy) Reset() { *x = Policy{} if protoimpl.UnsafeEnabled { - mi := &file_cells_idm_proto_msgTypes[53] + mi := &file_cells_idm_proto_msgTypes[55] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3798,7 +3973,7 @@ func (x *Policy) String() string { func (*Policy) ProtoMessage() {} func (x *Policy) ProtoReflect() protoreflect.Message { - mi := &file_cells_idm_proto_msgTypes[53] + mi := &file_cells_idm_proto_msgTypes[55] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3811,7 +3986,7 @@ func (x *Policy) ProtoReflect() protoreflect.Message { // Deprecated: Use Policy.ProtoReflect.Descriptor instead. func (*Policy) Descriptor() ([]byte, []int) { - return file_cells_idm_proto_rawDescGZIP(), []int{53} + return file_cells_idm_proto_rawDescGZIP(), []int{55} } func (x *Policy) GetId() string { @@ -3880,7 +4055,7 @@ type PolicyGroup struct { func (x *PolicyGroup) Reset() { *x = PolicyGroup{} if protoimpl.UnsafeEnabled { - mi := &file_cells_idm_proto_msgTypes[54] + mi := &file_cells_idm_proto_msgTypes[56] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3893,7 +4068,7 @@ func (x *PolicyGroup) String() string { func (*PolicyGroup) ProtoMessage() {} func (x *PolicyGroup) ProtoReflect() protoreflect.Message { - mi := &file_cells_idm_proto_msgTypes[54] + mi := &file_cells_idm_proto_msgTypes[56] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3906,7 +4081,7 @@ func (x *PolicyGroup) ProtoReflect() protoreflect.Message { // Deprecated: Use PolicyGroup.ProtoReflect.Descriptor instead. func (*PolicyGroup) Descriptor() ([]byte, []int) { - return file_cells_idm_proto_rawDescGZIP(), []int{54} + return file_cells_idm_proto_rawDescGZIP(), []int{56} } func (x *PolicyGroup) GetUuid() string { @@ -3970,7 +4145,7 @@ type StorePolicyGroupRequest struct { func (x *StorePolicyGroupRequest) Reset() { *x = StorePolicyGroupRequest{} if protoimpl.UnsafeEnabled { - mi := &file_cells_idm_proto_msgTypes[55] + mi := &file_cells_idm_proto_msgTypes[57] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3983,7 +4158,7 @@ func (x *StorePolicyGroupRequest) String() string { func (*StorePolicyGroupRequest) ProtoMessage() {} func (x *StorePolicyGroupRequest) ProtoReflect() protoreflect.Message { - mi := &file_cells_idm_proto_msgTypes[55] + mi := &file_cells_idm_proto_msgTypes[57] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3996,7 +4171,7 @@ func (x *StorePolicyGroupRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use StorePolicyGroupRequest.ProtoReflect.Descriptor instead. func (*StorePolicyGroupRequest) Descriptor() ([]byte, []int) { - return file_cells_idm_proto_rawDescGZIP(), []int{55} + return file_cells_idm_proto_rawDescGZIP(), []int{57} } func (x *StorePolicyGroupRequest) GetPolicyGroup() *PolicyGroup { @@ -4017,7 +4192,7 @@ type StorePolicyGroupResponse struct { func (x *StorePolicyGroupResponse) Reset() { *x = StorePolicyGroupResponse{} if protoimpl.UnsafeEnabled { - mi := &file_cells_idm_proto_msgTypes[56] + mi := &file_cells_idm_proto_msgTypes[58] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4030,7 +4205,7 @@ func (x *StorePolicyGroupResponse) String() string { func (*StorePolicyGroupResponse) ProtoMessage() {} func (x *StorePolicyGroupResponse) ProtoReflect() protoreflect.Message { - mi := &file_cells_idm_proto_msgTypes[56] + mi := &file_cells_idm_proto_msgTypes[58] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4043,7 +4218,7 @@ func (x *StorePolicyGroupResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use StorePolicyGroupResponse.ProtoReflect.Descriptor instead. func (*StorePolicyGroupResponse) Descriptor() ([]byte, []int) { - return file_cells_idm_proto_rawDescGZIP(), []int{56} + return file_cells_idm_proto_rawDescGZIP(), []int{58} } func (x *StorePolicyGroupResponse) GetPolicyGroup() *PolicyGroup { @@ -4064,7 +4239,7 @@ type DeletePolicyGroupRequest struct { func (x *DeletePolicyGroupRequest) Reset() { *x = DeletePolicyGroupRequest{} if protoimpl.UnsafeEnabled { - mi := &file_cells_idm_proto_msgTypes[57] + mi := &file_cells_idm_proto_msgTypes[59] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4077,7 +4252,7 @@ func (x *DeletePolicyGroupRequest) String() string { func (*DeletePolicyGroupRequest) ProtoMessage() {} func (x *DeletePolicyGroupRequest) ProtoReflect() protoreflect.Message { - mi := &file_cells_idm_proto_msgTypes[57] + mi := &file_cells_idm_proto_msgTypes[59] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4090,7 +4265,7 @@ func (x *DeletePolicyGroupRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use DeletePolicyGroupRequest.ProtoReflect.Descriptor instead. func (*DeletePolicyGroupRequest) Descriptor() ([]byte, []int) { - return file_cells_idm_proto_rawDescGZIP(), []int{57} + return file_cells_idm_proto_rawDescGZIP(), []int{59} } func (x *DeletePolicyGroupRequest) GetPolicyGroup() *PolicyGroup { @@ -4111,7 +4286,7 @@ type DeletePolicyGroupResponse struct { func (x *DeletePolicyGroupResponse) Reset() { *x = DeletePolicyGroupResponse{} if protoimpl.UnsafeEnabled { - mi := &file_cells_idm_proto_msgTypes[58] + mi := &file_cells_idm_proto_msgTypes[60] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4124,7 +4299,7 @@ func (x *DeletePolicyGroupResponse) String() string { func (*DeletePolicyGroupResponse) ProtoMessage() {} func (x *DeletePolicyGroupResponse) ProtoReflect() protoreflect.Message { - mi := &file_cells_idm_proto_msgTypes[58] + mi := &file_cells_idm_proto_msgTypes[60] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4137,7 +4312,7 @@ func (x *DeletePolicyGroupResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use DeletePolicyGroupResponse.ProtoReflect.Descriptor instead. func (*DeletePolicyGroupResponse) Descriptor() ([]byte, []int) { - return file_cells_idm_proto_rawDescGZIP(), []int{58} + return file_cells_idm_proto_rawDescGZIP(), []int{60} } func (x *DeletePolicyGroupResponse) GetSuccess() bool { @@ -4158,7 +4333,7 @@ type ListPolicyGroupsRequest struct { func (x *ListPolicyGroupsRequest) Reset() { *x = ListPolicyGroupsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_cells_idm_proto_msgTypes[59] + mi := &file_cells_idm_proto_msgTypes[61] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4171,7 +4346,7 @@ func (x *ListPolicyGroupsRequest) String() string { func (*ListPolicyGroupsRequest) ProtoMessage() {} func (x *ListPolicyGroupsRequest) ProtoReflect() protoreflect.Message { - mi := &file_cells_idm_proto_msgTypes[59] + mi := &file_cells_idm_proto_msgTypes[61] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4184,7 +4359,7 @@ func (x *ListPolicyGroupsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ListPolicyGroupsRequest.ProtoReflect.Descriptor instead. func (*ListPolicyGroupsRequest) Descriptor() ([]byte, []int) { - return file_cells_idm_proto_rawDescGZIP(), []int{59} + return file_cells_idm_proto_rawDescGZIP(), []int{61} } func (x *ListPolicyGroupsRequest) GetFilter() string { @@ -4206,7 +4381,7 @@ type ListPolicyGroupsResponse struct { func (x *ListPolicyGroupsResponse) Reset() { *x = ListPolicyGroupsResponse{} if protoimpl.UnsafeEnabled { - mi := &file_cells_idm_proto_msgTypes[60] + mi := &file_cells_idm_proto_msgTypes[62] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4219,7 +4394,7 @@ func (x *ListPolicyGroupsResponse) String() string { func (*ListPolicyGroupsResponse) ProtoMessage() {} func (x *ListPolicyGroupsResponse) ProtoReflect() protoreflect.Message { - mi := &file_cells_idm_proto_msgTypes[60] + mi := &file_cells_idm_proto_msgTypes[62] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4232,7 +4407,7 @@ func (x *ListPolicyGroupsResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ListPolicyGroupsResponse.ProtoReflect.Descriptor instead. func (*ListPolicyGroupsResponse) Descriptor() ([]byte, []int) { - return file_cells_idm_proto_rawDescGZIP(), []int{60} + return file_cells_idm_proto_rawDescGZIP(), []int{62} } func (x *ListPolicyGroupsResponse) GetPolicyGroups() []*PolicyGroup { @@ -4503,414 +4678,438 @@ var file_cells_idm_proto_rawDesc = []byte{ 0x74, 0x61, 0x6d, 0x70, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x22, 0x27, 0x0a, 0x11, 0x45, 0x78, 0x70, 0x69, 0x72, 0x65, 0x41, 0x43, 0x4c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x52, 0x6f, - 0x77, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x04, 0x52, 0x6f, 0x77, 0x73, 0x22, 0x38, - 0x0a, 0x10, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x41, 0x43, 0x4c, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x24, 0x0a, 0x05, 0x51, 0x75, 0x65, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x0e, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, - 0x79, 0x52, 0x05, 0x51, 0x75, 0x65, 0x72, 0x79, 0x22, 0x35, 0x0a, 0x11, 0x44, 0x65, 0x6c, 0x65, - 0x74, 0x65, 0x41, 0x43, 0x4c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x20, 0x0a, - 0x0b, 0x52, 0x6f, 0x77, 0x73, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x03, 0x52, 0x0b, 0x52, 0x6f, 0x77, 0x73, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x22, - 0x38, 0x0a, 0x10, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x41, 0x43, 0x4c, 0x52, 0x65, 0x71, 0x75, + 0x77, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x04, 0x52, 0x6f, 0x77, 0x73, 0x22, 0x82, + 0x01, 0x0a, 0x10, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x41, 0x43, 0x4c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x24, 0x0a, 0x05, 0x51, 0x75, 0x65, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, - 0x72, 0x79, 0x52, 0x05, 0x51, 0x75, 0x65, 0x72, 0x79, 0x22, 0x2f, 0x0a, 0x11, 0x53, 0x65, 0x61, - 0x72, 0x63, 0x68, 0x41, 0x43, 0x4c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a, - 0x0a, 0x03, 0x41, 0x43, 0x4c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x08, 0x2e, 0x69, 0x64, - 0x6d, 0x2e, 0x41, 0x43, 0x4c, 0x52, 0x03, 0x41, 0x43, 0x4c, 0x22, 0x35, 0x0a, 0x09, 0x41, 0x43, - 0x4c, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x56, - 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x56, 0x61, 0x6c, 0x75, - 0x65, 0x22, 0x8f, 0x01, 0x0a, 0x03, 0x41, 0x43, 0x4c, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x49, 0x44, 0x12, 0x26, 0x0a, 0x06, 0x41, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x69, 0x64, 0x6d, 0x2e, - 0x41, 0x43, 0x4c, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x06, 0x41, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x12, 0x16, 0x0a, 0x06, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x44, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x06, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x44, 0x12, 0x20, 0x0a, 0x0b, 0x57, 0x6f, 0x72, - 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x49, 0x44, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, - 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x49, 0x44, 0x12, 0x16, 0x0a, 0x06, 0x4e, - 0x6f, 0x64, 0x65, 0x49, 0x44, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x4e, 0x6f, 0x64, - 0x65, 0x49, 0x44, 0x22, 0xa4, 0x01, 0x0a, 0x0e, 0x41, 0x43, 0x4c, 0x53, 0x69, 0x6e, 0x67, 0x6c, - 0x65, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0x28, 0x0a, 0x07, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x69, 0x64, 0x6d, 0x2e, 0x41, 0x43, - 0x4c, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x07, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x12, 0x18, 0x0a, 0x07, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x44, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, - 0x09, 0x52, 0x07, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x44, 0x73, 0x12, 0x22, 0x0a, 0x0c, 0x57, 0x6f, - 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x49, 0x44, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, - 0x52, 0x0c, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x49, 0x44, 0x73, 0x12, 0x18, - 0x0a, 0x07, 0x4e, 0x6f, 0x64, 0x65, 0x49, 0x44, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, - 0x07, 0x4e, 0x6f, 0x64, 0x65, 0x49, 0x44, 0x73, 0x12, 0x10, 0x0a, 0x03, 0x6e, 0x6f, 0x74, 0x18, - 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x03, 0x6e, 0x6f, 0x74, 0x22, 0x95, 0x02, 0x0a, 0x08, 0x55, - 0x73, 0x65, 0x72, 0x4d, 0x65, 0x74, 0x61, 0x12, 0x12, 0x0a, 0x04, 0x55, 0x75, 0x69, 0x64, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x55, 0x75, 0x69, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x4e, - 0x6f, 0x64, 0x65, 0x55, 0x75, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x4e, - 0x6f, 0x64, 0x65, 0x55, 0x75, 0x69, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x4e, 0x61, 0x6d, 0x65, 0x73, - 0x70, 0x61, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x4e, 0x61, 0x6d, 0x65, - 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x4a, 0x73, 0x6f, 0x6e, 0x56, 0x61, 0x6c, - 0x75, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x4a, 0x73, 0x6f, 0x6e, 0x56, 0x61, - 0x6c, 0x75, 0x65, 0x12, 0x33, 0x0a, 0x08, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x18, - 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, - 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x08, - 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x12, 0x38, 0x0a, 0x17, 0x50, 0x6f, 0x6c, 0x69, - 0x63, 0x69, 0x65, 0x73, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x45, 0x64, 0x69, 0x74, 0x61, - 0x62, 0x6c, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x17, 0x50, 0x6f, 0x6c, 0x69, 0x63, - 0x69, 0x65, 0x73, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x45, 0x64, 0x69, 0x74, 0x61, 0x62, - 0x6c, 0x65, 0x12, 0x2e, 0x0a, 0x0c, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x64, 0x4e, 0x6f, - 0x64, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0a, 0x2e, 0x74, 0x72, 0x65, 0x65, 0x2e, - 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x0c, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x64, 0x4e, 0x6f, - 0x64, 0x65, 0x22, 0x92, 0x02, 0x0a, 0x11, 0x55, 0x73, 0x65, 0x72, 0x4d, 0x65, 0x74, 0x61, 0x4e, - 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x4e, 0x61, 0x6d, 0x65, - 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x4e, 0x61, 0x6d, - 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x12, 0x14, 0x0a, 0x05, - 0x4f, 0x72, 0x64, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x4f, 0x72, 0x64, - 0x65, 0x72, 0x12, 0x1c, 0x0a, 0x09, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x61, 0x62, 0x6c, 0x65, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x61, 0x62, 0x6c, 0x65, - 0x12, 0x26, 0x0a, 0x0e, 0x4a, 0x73, 0x6f, 0x6e, 0x44, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, - 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x4a, 0x73, 0x6f, 0x6e, 0x44, 0x65, - 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x33, 0x0a, 0x08, 0x50, 0x6f, 0x6c, 0x69, - 0x63, 0x69, 0x65, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x73, 0x65, 0x72, - 0x76, 0x69, 0x63, 0x65, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x50, 0x6f, 0x6c, - 0x69, 0x63, 0x79, 0x52, 0x08, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x12, 0x38, 0x0a, + 0x72, 0x79, 0x52, 0x05, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0x22, 0x0a, 0x0c, 0x45, 0x78, 0x70, + 0x69, 0x72, 0x65, 0x64, 0x41, 0x66, 0x74, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, + 0x0c, 0x45, 0x78, 0x70, 0x69, 0x72, 0x65, 0x64, 0x41, 0x66, 0x74, 0x65, 0x72, 0x12, 0x24, 0x0a, + 0x0d, 0x45, 0x78, 0x70, 0x69, 0x72, 0x65, 0x64, 0x42, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x03, 0x52, 0x0d, 0x45, 0x78, 0x70, 0x69, 0x72, 0x65, 0x64, 0x42, 0x65, 0x66, + 0x6f, 0x72, 0x65, 0x22, 0x35, 0x0a, 0x11, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x41, 0x43, 0x4c, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x52, 0x6f, 0x77, 0x73, + 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x52, + 0x6f, 0x77, 0x73, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x22, 0x82, 0x01, 0x0a, 0x10, 0x53, + 0x65, 0x61, 0x72, 0x63, 0x68, 0x41, 0x43, 0x4c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x24, 0x0a, 0x05, 0x51, 0x75, 0x65, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, + 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x05, + 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0x22, 0x0a, 0x0c, 0x45, 0x78, 0x70, 0x69, 0x72, 0x65, 0x64, + 0x41, 0x66, 0x74, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, 0x45, 0x78, 0x70, + 0x69, 0x72, 0x65, 0x64, 0x41, 0x66, 0x74, 0x65, 0x72, 0x12, 0x24, 0x0a, 0x0d, 0x45, 0x78, 0x70, + 0x69, 0x72, 0x65, 0x64, 0x42, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, + 0x52, 0x0d, 0x45, 0x78, 0x70, 0x69, 0x72, 0x65, 0x64, 0x42, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x22, + 0x2f, 0x0a, 0x11, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x41, 0x43, 0x4c, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a, 0x0a, 0x03, 0x41, 0x43, 0x4c, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x08, 0x2e, 0x69, 0x64, 0x6d, 0x2e, 0x41, 0x43, 0x4c, 0x52, 0x03, 0x41, 0x43, 0x4c, + 0x22, 0x83, 0x01, 0x0a, 0x11, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x41, 0x43, 0x4c, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x24, 0x0a, 0x05, 0x51, 0x75, 0x65, 0x72, 0x79, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, + 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x05, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0x22, 0x0a, 0x0c, + 0x45, 0x78, 0x70, 0x69, 0x72, 0x65, 0x64, 0x41, 0x66, 0x74, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x03, 0x52, 0x0c, 0x45, 0x78, 0x70, 0x69, 0x72, 0x65, 0x64, 0x41, 0x66, 0x74, 0x65, 0x72, + 0x12, 0x24, 0x0a, 0x0d, 0x45, 0x78, 0x70, 0x69, 0x72, 0x65, 0x64, 0x42, 0x65, 0x66, 0x6f, 0x72, + 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0d, 0x45, 0x78, 0x70, 0x69, 0x72, 0x65, 0x64, + 0x42, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x22, 0x28, 0x0a, 0x12, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, + 0x65, 0x41, 0x43, 0x4c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x12, 0x0a, 0x04, + 0x52, 0x6f, 0x77, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x04, 0x52, 0x6f, 0x77, 0x73, + 0x22, 0x35, 0x0a, 0x09, 0x41, 0x43, 0x4c, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, + 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, + 0x65, 0x12, 0x14, 0x0a, 0x05, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x05, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x8f, 0x01, 0x0a, 0x03, 0x41, 0x43, 0x4c, 0x12, + 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x49, 0x44, 0x12, + 0x26, 0x0a, 0x06, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x0e, 0x2e, 0x69, 0x64, 0x6d, 0x2e, 0x41, 0x43, 0x4c, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, + 0x06, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x16, 0x0a, 0x06, 0x52, 0x6f, 0x6c, 0x65, 0x49, + 0x44, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x44, 0x12, + 0x20, 0x0a, 0x0b, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x49, 0x44, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x49, + 0x44, 0x12, 0x16, 0x0a, 0x06, 0x4e, 0x6f, 0x64, 0x65, 0x49, 0x44, 0x18, 0x05, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x06, 0x4e, 0x6f, 0x64, 0x65, 0x49, 0x44, 0x22, 0xa4, 0x01, 0x0a, 0x0e, 0x41, 0x43, + 0x4c, 0x53, 0x69, 0x6e, 0x67, 0x6c, 0x65, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0x28, 0x0a, 0x07, + 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0e, 0x2e, + 0x69, 0x64, 0x6d, 0x2e, 0x41, 0x43, 0x4c, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x07, 0x41, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x44, + 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x44, 0x73, + 0x12, 0x22, 0x0a, 0x0c, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x49, 0x44, 0x73, + 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0c, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, + 0x65, 0x49, 0x44, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x4e, 0x6f, 0x64, 0x65, 0x49, 0x44, 0x73, 0x18, + 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x4e, 0x6f, 0x64, 0x65, 0x49, 0x44, 0x73, 0x12, 0x10, + 0x0a, 0x03, 0x6e, 0x6f, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x03, 0x6e, 0x6f, 0x74, + 0x22, 0x95, 0x02, 0x0a, 0x08, 0x55, 0x73, 0x65, 0x72, 0x4d, 0x65, 0x74, 0x61, 0x12, 0x12, 0x0a, + 0x04, 0x55, 0x75, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x55, 0x75, 0x69, + 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x4e, 0x6f, 0x64, 0x65, 0x55, 0x75, 0x69, 0x64, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x08, 0x4e, 0x6f, 0x64, 0x65, 0x55, 0x75, 0x69, 0x64, 0x12, 0x1c, 0x0a, + 0x09, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x09, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x4a, + 0x73, 0x6f, 0x6e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, + 0x4a, 0x73, 0x6f, 0x6e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x33, 0x0a, 0x08, 0x50, 0x6f, 0x6c, + 0x69, 0x63, 0x69, 0x65, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x73, 0x65, + 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x50, 0x6f, + 0x6c, 0x69, 0x63, 0x79, 0x52, 0x08, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x12, 0x38, + 0x0a, 0x17, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, + 0x74, 0x45, 0x64, 0x69, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x17, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, - 0x45, 0x64, 0x69, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x17, - 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x45, - 0x64, 0x69, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x22, 0xac, 0x01, 0x0a, 0x15, 0x55, 0x70, 0x64, 0x61, - 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x4d, 0x65, 0x74, 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x43, 0x0a, 0x09, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0e, 0x32, 0x25, 0x2e, 0x69, 0x64, 0x6d, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, - 0x65, 0x55, 0x73, 0x65, 0x72, 0x4d, 0x65, 0x74, 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x2e, 0x55, 0x73, 0x65, 0x72, 0x4d, 0x65, 0x74, 0x61, 0x4f, 0x70, 0x52, 0x09, 0x4f, 0x70, 0x65, - 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2b, 0x0a, 0x09, 0x4d, 0x65, 0x74, 0x61, 0x44, 0x61, + 0x45, 0x64, 0x69, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x2e, 0x0a, 0x0c, 0x52, 0x65, 0x73, 0x6f, + 0x6c, 0x76, 0x65, 0x64, 0x4e, 0x6f, 0x64, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0a, + 0x2e, 0x74, 0x72, 0x65, 0x65, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x0c, 0x52, 0x65, 0x73, 0x6f, + 0x6c, 0x76, 0x65, 0x64, 0x4e, 0x6f, 0x64, 0x65, 0x22, 0x92, 0x02, 0x0a, 0x11, 0x55, 0x73, 0x65, + 0x72, 0x4d, 0x65, 0x74, 0x61, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x1c, + 0x0a, 0x09, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x09, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, + 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x4c, 0x61, 0x62, + 0x65, 0x6c, 0x12, 0x14, 0x0a, 0x05, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x05, 0x52, 0x05, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x12, 0x1c, 0x0a, 0x09, 0x49, 0x6e, 0x64, 0x65, + 0x78, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x49, 0x6e, 0x64, + 0x65, 0x78, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x26, 0x0a, 0x0e, 0x4a, 0x73, 0x6f, 0x6e, 0x44, 0x65, + 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, + 0x4a, 0x73, 0x6f, 0x6e, 0x44, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x33, + 0x0a, 0x08, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x17, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, + 0x72, 0x63, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x08, 0x50, 0x6f, 0x6c, 0x69, 0x63, + 0x69, 0x65, 0x73, 0x12, 0x38, 0x0a, 0x17, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x43, + 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x45, 0x64, 0x69, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x07, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x17, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x43, 0x6f, + 0x6e, 0x74, 0x65, 0x78, 0x74, 0x45, 0x64, 0x69, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x22, 0xac, 0x01, + 0x0a, 0x15, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x4d, 0x65, 0x74, 0x61, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x43, 0x0a, 0x09, 0x4f, 0x70, 0x65, 0x72, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x25, 0x2e, 0x69, 0x64, 0x6d, + 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x4d, 0x65, 0x74, 0x61, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x4d, 0x65, 0x74, 0x61, 0x4f, + 0x70, 0x52, 0x09, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2b, 0x0a, 0x09, + 0x4d, 0x65, 0x74, 0x61, 0x44, 0x61, 0x74, 0x61, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x0d, 0x2e, 0x69, 0x64, 0x6d, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x4d, 0x65, 0x74, 0x61, 0x52, 0x09, + 0x4d, 0x65, 0x74, 0x61, 0x44, 0x61, 0x74, 0x61, 0x73, 0x22, 0x21, 0x0a, 0x0a, 0x55, 0x73, 0x65, + 0x72, 0x4d, 0x65, 0x74, 0x61, 0x4f, 0x70, 0x12, 0x07, 0x0a, 0x03, 0x50, 0x55, 0x54, 0x10, 0x00, + 0x12, 0x0a, 0x0a, 0x06, 0x44, 0x45, 0x4c, 0x45, 0x54, 0x45, 0x10, 0x01, 0x22, 0x45, 0x0a, 0x16, + 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x4d, 0x65, 0x74, 0x61, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2b, 0x0a, 0x09, 0x4d, 0x65, 0x74, 0x61, 0x44, 0x61, 0x74, 0x61, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x69, 0x64, 0x6d, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x4d, 0x65, 0x74, 0x61, 0x52, 0x09, 0x4d, 0x65, 0x74, 0x61, 0x44, 0x61, - 0x74, 0x61, 0x73, 0x22, 0x21, 0x0a, 0x0a, 0x55, 0x73, 0x65, 0x72, 0x4d, 0x65, 0x74, 0x61, 0x4f, - 0x70, 0x12, 0x07, 0x0a, 0x03, 0x50, 0x55, 0x54, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x44, 0x45, - 0x4c, 0x45, 0x54, 0x45, 0x10, 0x01, 0x22, 0x45, 0x0a, 0x16, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, - 0x55, 0x73, 0x65, 0x72, 0x4d, 0x65, 0x74, 0x61, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x2b, 0x0a, 0x09, 0x4d, 0x65, 0x74, 0x61, 0x44, 0x61, 0x74, 0x61, 0x73, 0x18, 0x03, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x69, 0x64, 0x6d, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x4d, 0x65, - 0x74, 0x61, 0x52, 0x09, 0x4d, 0x65, 0x74, 0x61, 0x44, 0x61, 0x74, 0x61, 0x73, 0x22, 0xe9, 0x01, - 0x0a, 0x15, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x55, 0x73, 0x65, 0x72, 0x4d, 0x65, 0x74, 0x61, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x4d, 0x65, 0x74, 0x61, 0x55, - 0x75, 0x69, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x4d, 0x65, 0x74, 0x61, - 0x55, 0x75, 0x69, 0x64, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x4e, 0x6f, 0x64, 0x65, 0x55, 0x75, 0x69, - 0x64, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x4e, 0x6f, 0x64, 0x65, 0x55, 0x75, - 0x69, 0x64, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, - 0x65, 0x12, 0x32, 0x0a, 0x14, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, 0x75, 0x62, - 0x6a, 0x65, 0x63, 0x74, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x14, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, 0x75, 0x62, 0x6a, 0x65, 0x63, 0x74, - 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x12, 0x42, 0x0a, 0x0d, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, - 0x65, 0x51, 0x75, 0x65, 0x72, 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x73, - 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x50, - 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x0d, 0x52, 0x65, 0x73, 0x6f, - 0x75, 0x72, 0x63, 0x65, 0x51, 0x75, 0x65, 0x72, 0x79, 0x22, 0x43, 0x0a, 0x16, 0x53, 0x65, 0x61, - 0x72, 0x63, 0x68, 0x55, 0x73, 0x65, 0x72, 0x4d, 0x65, 0x74, 0x61, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x29, 0x0a, 0x08, 0x55, 0x73, 0x65, 0x72, 0x4d, 0x65, 0x74, 0x61, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x69, 0x64, 0x6d, 0x2e, 0x55, 0x73, 0x65, 0x72, - 0x4d, 0x65, 0x74, 0x61, 0x52, 0x08, 0x55, 0x73, 0x65, 0x72, 0x4d, 0x65, 0x74, 0x61, 0x22, 0xcd, - 0x01, 0x0a, 0x1e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x4d, 0x65, 0x74, - 0x61, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x4e, 0x0a, 0x09, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0e, 0x32, 0x30, 0x2e, 0x69, 0x64, 0x6d, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, - 0x65, 0x55, 0x73, 0x65, 0x72, 0x4d, 0x65, 0x74, 0x61, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, - 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x4d, 0x65, - 0x74, 0x61, 0x4e, 0x73, 0x4f, 0x70, 0x52, 0x09, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x12, 0x36, 0x0a, 0x0a, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x18, - 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x69, 0x64, 0x6d, 0x2e, 0x55, 0x73, 0x65, 0x72, - 0x4d, 0x65, 0x74, 0x61, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x0a, 0x4e, - 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x22, 0x23, 0x0a, 0x0c, 0x55, 0x73, 0x65, - 0x72, 0x4d, 0x65, 0x74, 0x61, 0x4e, 0x73, 0x4f, 0x70, 0x12, 0x07, 0x0a, 0x03, 0x50, 0x55, 0x54, - 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x44, 0x45, 0x4c, 0x45, 0x54, 0x45, 0x10, 0x01, 0x22, 0x59, - 0x0a, 0x1f, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x4d, 0x65, 0x74, 0x61, - 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x12, 0x36, 0x0a, 0x0a, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x18, - 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x69, 0x64, 0x6d, 0x2e, 0x55, 0x73, 0x65, 0x72, - 0x4d, 0x65, 0x74, 0x61, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x0a, 0x4e, - 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x22, 0x1e, 0x0a, 0x1c, 0x4c, 0x69, 0x73, - 0x74, 0x55, 0x73, 0x65, 0x72, 0x4d, 0x65, 0x74, 0x61, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, - 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x65, 0x0a, 0x1d, 0x4c, 0x69, 0x73, - 0x74, 0x55, 0x73, 0x65, 0x72, 0x4d, 0x65, 0x74, 0x61, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, - 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x44, 0x0a, 0x11, 0x55, 0x73, - 0x65, 0x72, 0x4d, 0x65, 0x74, 0x61, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x69, 0x64, 0x6d, 0x2e, 0x55, 0x73, 0x65, 0x72, - 0x4d, 0x65, 0x74, 0x61, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x11, 0x55, + 0x74, 0x61, 0x73, 0x22, 0xe9, 0x01, 0x0a, 0x15, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x55, 0x73, + 0x65, 0x72, 0x4d, 0x65, 0x74, 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, + 0x09, 0x4d, 0x65, 0x74, 0x61, 0x55, 0x75, 0x69, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, + 0x52, 0x09, 0x4d, 0x65, 0x74, 0x61, 0x55, 0x75, 0x69, 0x64, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x4e, + 0x6f, 0x64, 0x65, 0x55, 0x75, 0x69, 0x64, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, + 0x4e, 0x6f, 0x64, 0x65, 0x55, 0x75, 0x69, 0x64, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x4e, 0x61, 0x6d, + 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x4e, 0x61, + 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x32, 0x0a, 0x14, 0x52, 0x65, 0x73, 0x6f, 0x75, + 0x72, 0x63, 0x65, 0x53, 0x75, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x14, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, + 0x75, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x12, 0x42, 0x0a, 0x0d, 0x52, + 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x51, 0x75, 0x65, 0x72, 0x79, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x52, 0x65, 0x73, + 0x6f, 0x75, 0x72, 0x63, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x51, 0x75, 0x65, 0x72, 0x79, + 0x52, 0x0d, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x51, 0x75, 0x65, 0x72, 0x79, 0x22, + 0x43, 0x0a, 0x16, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x55, 0x73, 0x65, 0x72, 0x4d, 0x65, 0x74, + 0x61, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x29, 0x0a, 0x08, 0x55, 0x73, 0x65, + 0x72, 0x4d, 0x65, 0x74, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x69, 0x64, + 0x6d, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x4d, 0x65, 0x74, 0x61, 0x52, 0x08, 0x55, 0x73, 0x65, 0x72, + 0x4d, 0x65, 0x74, 0x61, 0x22, 0xcd, 0x01, 0x0a, 0x1e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x4d, 0x65, 0x74, 0x61, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, - 0x22, 0x97, 0x03, 0x0a, 0x0b, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, - 0x12, 0x17, 0x0a, 0x08, 0x6a, 0x73, 0x6f, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x05, 0x40, 0x74, 0x79, 0x70, 0x65, 0x12, 0x28, 0x0a, 0x04, 0x54, 0x79, 0x70, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x14, 0x2e, 0x69, 0x64, 0x6d, 0x2e, 0x43, 0x68, - 0x61, 0x6e, 0x67, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x54, - 0x79, 0x70, 0x65, 0x12, 0x1d, 0x0a, 0x04, 0x55, 0x73, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x09, 0x2e, 0x69, 0x64, 0x6d, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x52, 0x04, 0x55, 0x73, - 0x65, 0x72, 0x12, 0x1d, 0x0a, 0x04, 0x52, 0x6f, 0x6c, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x09, 0x2e, 0x69, 0x64, 0x6d, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x52, 0x04, 0x52, 0x6f, 0x6c, - 0x65, 0x12, 0x2c, 0x0a, 0x09, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x05, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x69, 0x64, 0x6d, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x73, - 0x70, 0x61, 0x63, 0x65, 0x52, 0x09, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, - 0x1a, 0x0a, 0x03, 0x41, 0x63, 0x6c, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x08, 0x2e, 0x69, - 0x64, 0x6d, 0x2e, 0x41, 0x43, 0x4c, 0x52, 0x03, 0x41, 0x63, 0x6c, 0x12, 0x3c, 0x0a, 0x0d, 0x4d, - 0x65, 0x74, 0x61, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x08, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x69, 0x64, 0x6d, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x4d, 0x65, 0x74, - 0x61, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x0d, 0x4d, 0x65, 0x74, 0x61, - 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x40, 0x0a, 0x0a, 0x41, 0x74, 0x74, - 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, - 0x69, 0x64, 0x6d, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x2e, - 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, - 0x0a, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x1a, 0x3d, 0x0a, 0x0f, 0x41, - 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, - 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, - 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xe2, 0x01, 0x0a, 0x13, 0x50, - 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x45, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x16, - 0x0a, 0x06, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, - 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x53, 0x75, 0x62, 0x6a, 0x65, 0x63, - 0x74, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x08, 0x53, 0x75, 0x62, 0x6a, 0x65, 0x63, - 0x74, 0x73, 0x12, 0x3f, 0x0a, 0x07, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x18, 0x04, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x69, 0x64, 0x6d, 0x2e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, - 0x45, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x43, 0x6f, - 0x6e, 0x74, 0x65, 0x78, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x07, 0x43, 0x6f, 0x6e, 0x74, - 0x65, 0x78, 0x74, 0x1a, 0x3a, 0x0a, 0x0c, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, - 0x76, 0x0a, 0x14, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x45, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x41, 0x6c, 0x6c, 0x6f, 0x77, - 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x41, 0x6c, 0x6c, 0x6f, 0x77, 0x65, - 0x64, 0x12, 0x22, 0x0a, 0x0c, 0x45, 0x78, 0x70, 0x6c, 0x69, 0x63, 0x69, 0x74, 0x44, 0x65, 0x6e, - 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x45, 0x78, 0x70, 0x6c, 0x69, 0x63, 0x69, - 0x74, 0x44, 0x65, 0x6e, 0x79, 0x12, 0x20, 0x0a, 0x0b, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, - 0x44, 0x65, 0x6e, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x44, 0x65, 0x66, 0x61, - 0x75, 0x6c, 0x74, 0x44, 0x65, 0x6e, 0x79, 0x22, 0x47, 0x0a, 0x0f, 0x50, 0x6f, 0x6c, 0x69, 0x63, - 0x79, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, - 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x20, - 0x0a, 0x0b, 0x6a, 0x73, 0x6f, 0x6e, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0b, 0x6a, 0x73, 0x6f, 0x6e, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x22, 0xcb, 0x02, 0x0a, 0x06, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x0e, 0x0a, 0x02, 0x69, - 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x20, 0x0a, 0x0b, 0x64, - 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1a, 0x0a, - 0x08, 0x73, 0x75, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, - 0x08, 0x73, 0x75, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x72, 0x65, 0x73, - 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x72, 0x65, - 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x12, 0x29, 0x0a, 0x06, 0x65, 0x66, 0x66, 0x65, 0x63, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, - 0x0e, 0x32, 0x11, 0x2e, 0x69, 0x64, 0x6d, 0x2e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x45, 0x66, - 0x66, 0x65, 0x63, 0x74, 0x52, 0x06, 0x65, 0x66, 0x66, 0x65, 0x63, 0x74, 0x12, 0x3b, 0x0a, 0x0a, - 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x1b, 0x2e, 0x69, 0x64, 0x6d, 0x2e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x43, 0x6f, - 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x63, - 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x53, 0x0a, 0x0f, 0x43, 0x6f, 0x6e, - 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, - 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2a, - 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, - 0x69, 0x64, 0x6d, 0x2e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, - 0x69, 0x6f, 0x6e, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x80, - 0x02, 0x0a, 0x0b, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x12, 0x12, - 0x0a, 0x04, 0x55, 0x75, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x55, 0x75, - 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, - 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x44, 0x65, 0x73, - 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1c, 0x0a, 0x09, 0x4f, 0x77, 0x6e, 0x65, - 0x72, 0x55, 0x75, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x4f, 0x77, 0x6e, - 0x65, 0x72, 0x55, 0x75, 0x69, 0x64, 0x12, 0x3e, 0x0a, 0x0d, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, - 0x63, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x18, 0x2e, - 0x69, 0x64, 0x6d, 0x2e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, - 0x63, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x0d, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, - 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x12, 0x20, 0x0a, 0x0b, 0x4c, 0x61, 0x73, 0x74, 0x55, 0x70, - 0x64, 0x61, 0x74, 0x65, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0b, 0x4c, 0x61, 0x73, - 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x12, 0x27, 0x0a, 0x08, 0x50, 0x6f, 0x6c, 0x69, - 0x63, 0x69, 0x65, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0b, 0x2e, 0x69, 0x64, 0x6d, - 0x2e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x08, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, - 0x73, 0x22, 0x4d, 0x0a, 0x17, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, - 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x32, 0x0a, 0x0b, - 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x10, 0x2e, 0x69, 0x64, 0x6d, 0x2e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x47, 0x72, - 0x6f, 0x75, 0x70, 0x52, 0x0b, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x47, 0x72, 0x6f, 0x75, 0x70, - 0x22, 0x4e, 0x0a, 0x18, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x47, - 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x32, 0x0a, 0x0b, - 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x10, 0x2e, 0x69, 0x64, 0x6d, 0x2e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x47, 0x72, - 0x6f, 0x75, 0x70, 0x52, 0x0b, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x47, 0x72, 0x6f, 0x75, 0x70, - 0x22, 0x4e, 0x0a, 0x18, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, - 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x32, 0x0a, 0x0b, - 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x10, 0x2e, 0x69, 0x64, 0x6d, 0x2e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x47, 0x72, - 0x6f, 0x75, 0x70, 0x52, 0x0b, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x47, 0x72, 0x6f, 0x75, 0x70, - 0x22, 0x35, 0x0a, 0x19, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, - 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, - 0x07, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, - 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x22, 0x31, 0x0a, 0x17, 0x4c, 0x69, 0x73, 0x74, 0x50, - 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x06, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x22, 0x66, 0x0a, 0x18, 0x4c, 0x69, - 0x73, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x34, 0x0a, 0x0c, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, - 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x69, - 0x64, 0x6d, 0x2e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x0c, - 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x12, 0x14, 0x0a, 0x05, - 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x54, 0x6f, 0x74, - 0x61, 0x6c, 0x2a, 0x2c, 0x0a, 0x08, 0x4e, 0x6f, 0x64, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0b, - 0x0a, 0x07, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x08, 0x0a, 0x04, 0x55, - 0x53, 0x45, 0x52, 0x10, 0x01, 0x12, 0x09, 0x0a, 0x05, 0x47, 0x52, 0x4f, 0x55, 0x50, 0x10, 0x02, - 0x2a, 0x38, 0x0a, 0x0e, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x53, 0x63, 0x6f, - 0x70, 0x65, 0x12, 0x07, 0x0a, 0x03, 0x41, 0x4e, 0x59, 0x10, 0x00, 0x12, 0x09, 0x0a, 0x05, 0x41, - 0x44, 0x4d, 0x49, 0x4e, 0x10, 0x01, 0x12, 0x08, 0x0a, 0x04, 0x52, 0x4f, 0x4f, 0x4d, 0x10, 0x02, - 0x12, 0x08, 0x0a, 0x04, 0x4c, 0x49, 0x4e, 0x4b, 0x10, 0x03, 0x2a, 0x56, 0x0a, 0x0f, 0x43, 0x68, - 0x61, 0x6e, 0x67, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0a, 0x0a, - 0x06, 0x43, 0x52, 0x45, 0x41, 0x54, 0x45, 0x10, 0x00, 0x12, 0x08, 0x0a, 0x04, 0x52, 0x45, 0x41, - 0x44, 0x10, 0x01, 0x12, 0x0a, 0x0a, 0x06, 0x55, 0x50, 0x44, 0x41, 0x54, 0x45, 0x10, 0x02, 0x12, - 0x0a, 0x0a, 0x06, 0x44, 0x45, 0x4c, 0x45, 0x54, 0x45, 0x10, 0x03, 0x12, 0x09, 0x0a, 0x05, 0x4c, - 0x4f, 0x47, 0x49, 0x4e, 0x10, 0x04, 0x12, 0x0a, 0x0a, 0x06, 0x4c, 0x4f, 0x47, 0x4f, 0x55, 0x54, - 0x10, 0x05, 0x2a, 0x30, 0x0a, 0x0c, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x45, 0x66, 0x66, 0x65, - 0x63, 0x74, 0x12, 0x0b, 0x0a, 0x07, 0x75, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x10, 0x00, 0x12, - 0x08, 0x0a, 0x04, 0x64, 0x65, 0x6e, 0x79, 0x10, 0x01, 0x12, 0x09, 0x0a, 0x05, 0x61, 0x6c, 0x6c, - 0x6f, 0x77, 0x10, 0x02, 0x2a, 0x32, 0x0a, 0x13, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, - 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x12, 0x08, 0x0a, 0x04, 0x72, - 0x65, 0x73, 0x74, 0x10, 0x00, 0x12, 0x07, 0x0a, 0x03, 0x61, 0x63, 0x6c, 0x10, 0x01, 0x12, 0x08, - 0x0a, 0x04, 0x6f, 0x69, 0x64, 0x63, 0x10, 0x02, 0x32, 0xd6, 0x02, 0x0a, 0x0b, 0x52, 0x6f, 0x6c, - 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x3f, 0x0a, 0x0a, 0x43, 0x72, 0x65, 0x61, - 0x74, 0x65, 0x52, 0x6f, 0x6c, 0x65, 0x12, 0x16, 0x2e, 0x69, 0x64, 0x6d, 0x2e, 0x43, 0x72, 0x65, - 0x61, 0x74, 0x65, 0x52, 0x6f, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, - 0x2e, 0x69, 0x64, 0x6d, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x6f, 0x6c, 0x65, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x3f, 0x0a, 0x0a, 0x44, 0x65, 0x6c, - 0x65, 0x74, 0x65, 0x52, 0x6f, 0x6c, 0x65, 0x12, 0x16, 0x2e, 0x69, 0x64, 0x6d, 0x2e, 0x44, 0x65, - 0x6c, 0x65, 0x74, 0x65, 0x52, 0x6f, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x17, 0x2e, 0x69, 0x64, 0x6d, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x6f, 0x6c, 0x65, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x41, 0x0a, 0x0a, 0x53, 0x65, - 0x61, 0x72, 0x63, 0x68, 0x52, 0x6f, 0x6c, 0x65, 0x12, 0x16, 0x2e, 0x69, 0x64, 0x6d, 0x2e, 0x53, - 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x6f, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x17, 0x2e, 0x69, 0x64, 0x6d, 0x2e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x6f, 0x6c, - 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x30, 0x01, 0x12, 0x43, 0x0a, - 0x0a, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x52, 0x6f, 0x6c, 0x65, 0x12, 0x16, 0x2e, 0x69, 0x64, - 0x6d, 0x2e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x6f, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x69, 0x64, 0x6d, 0x2e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, - 0x52, 0x6f, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x28, 0x01, - 0x30, 0x01, 0x12, 0x3d, 0x0a, 0x09, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x12, - 0x16, 0x2e, 0x69, 0x64, 0x6d, 0x2e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x6f, 0x6c, 0x65, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x69, 0x64, 0x6d, 0x2e, 0x43, 0x6f, - 0x75, 0x6e, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x00, 0x32, 0x91, 0x03, 0x0a, 0x0b, 0x55, 0x73, 0x65, 0x72, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, - 0x65, 0x12, 0x3f, 0x0a, 0x0a, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x12, - 0x16, 0x2e, 0x69, 0x64, 0x6d, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x69, 0x64, 0x6d, 0x2e, 0x43, 0x72, - 0x65, 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x00, 0x12, 0x3f, 0x0a, 0x0a, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, - 0x12, 0x16, 0x2e, 0x69, 0x64, 0x6d, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x55, 0x73, 0x65, - 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x69, 0x64, 0x6d, 0x2e, 0x44, - 0x65, 0x6c, 0x65, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x00, 0x12, 0x39, 0x0a, 0x08, 0x42, 0x69, 0x6e, 0x64, 0x55, 0x73, 0x65, 0x72, 0x12, - 0x14, 0x2e, 0x69, 0x64, 0x6d, 0x2e, 0x42, 0x69, 0x6e, 0x64, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x15, 0x2e, 0x69, 0x64, 0x6d, 0x2e, 0x42, 0x69, 0x6e, 0x64, - 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x3d, - 0x0a, 0x09, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x55, 0x73, 0x65, 0x72, 0x12, 0x16, 0x2e, 0x69, 0x64, - 0x6d, 0x2e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x69, 0x64, 0x6d, 0x2e, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x55, - 0x73, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x41, 0x0a, - 0x0a, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x55, 0x73, 0x65, 0x72, 0x12, 0x16, 0x2e, 0x69, 0x64, - 0x6d, 0x2e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x69, 0x64, 0x6d, 0x2e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, - 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x30, 0x01, - 0x12, 0x43, 0x0a, 0x0a, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x55, 0x73, 0x65, 0x72, 0x12, 0x16, - 0x2e, 0x69, 0x64, 0x6d, 0x2e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x55, 0x73, 0x65, 0x72, 0x52, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x4e, 0x0a, 0x09, 0x4f, 0x70, 0x65, 0x72, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x30, 0x2e, 0x69, 0x64, 0x6d, + 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x4d, 0x65, 0x74, 0x61, 0x4e, + 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, + 0x55, 0x73, 0x65, 0x72, 0x4d, 0x65, 0x74, 0x61, 0x4e, 0x73, 0x4f, 0x70, 0x52, 0x09, 0x4f, 0x70, + 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x36, 0x0a, 0x0a, 0x4e, 0x61, 0x6d, 0x65, 0x73, + 0x70, 0x61, 0x63, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x69, 0x64, + 0x6d, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x4d, 0x65, 0x74, 0x61, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, + 0x61, 0x63, 0x65, 0x52, 0x0a, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x22, + 0x23, 0x0a, 0x0c, 0x55, 0x73, 0x65, 0x72, 0x4d, 0x65, 0x74, 0x61, 0x4e, 0x73, 0x4f, 0x70, 0x12, + 0x07, 0x0a, 0x03, 0x50, 0x55, 0x54, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x44, 0x45, 0x4c, 0x45, + 0x54, 0x45, 0x10, 0x01, 0x22, 0x59, 0x0a, 0x1f, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x55, 0x73, + 0x65, 0x72, 0x4d, 0x65, 0x74, 0x61, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x36, 0x0a, 0x0a, 0x4e, 0x61, 0x6d, 0x65, 0x73, + 0x70, 0x61, 0x63, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x69, 0x64, + 0x6d, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x4d, 0x65, 0x74, 0x61, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, + 0x61, 0x63, 0x65, 0x52, 0x0a, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x22, + 0x1e, 0x0a, 0x1c, 0x4c, 0x69, 0x73, 0x74, 0x55, 0x73, 0x65, 0x72, 0x4d, 0x65, 0x74, 0x61, 0x4e, + 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, + 0x65, 0x0a, 0x1d, 0x4c, 0x69, 0x73, 0x74, 0x55, 0x73, 0x65, 0x72, 0x4d, 0x65, 0x74, 0x61, 0x4e, + 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x44, 0x0a, 0x11, 0x55, 0x73, 0x65, 0x72, 0x4d, 0x65, 0x74, 0x61, 0x4e, 0x61, 0x6d, 0x65, + 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x69, 0x64, + 0x6d, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x4d, 0x65, 0x74, 0x61, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, + 0x61, 0x63, 0x65, 0x52, 0x11, 0x55, 0x73, 0x65, 0x72, 0x4d, 0x65, 0x74, 0x61, 0x4e, 0x61, 0x6d, + 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x22, 0x97, 0x03, 0x0a, 0x0b, 0x43, 0x68, 0x61, 0x6e, 0x67, + 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x17, 0x0a, 0x08, 0x6a, 0x73, 0x6f, 0x6e, 0x54, 0x79, + 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x40, 0x74, 0x79, 0x70, 0x65, 0x12, + 0x28, 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x14, 0x2e, + 0x69, 0x64, 0x6d, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x54, + 0x79, 0x70, 0x65, 0x52, 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1d, 0x0a, 0x04, 0x55, 0x73, 0x65, + 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x09, 0x2e, 0x69, 0x64, 0x6d, 0x2e, 0x55, 0x73, + 0x65, 0x72, 0x52, 0x04, 0x55, 0x73, 0x65, 0x72, 0x12, 0x1d, 0x0a, 0x04, 0x52, 0x6f, 0x6c, 0x65, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x09, 0x2e, 0x69, 0x64, 0x6d, 0x2e, 0x52, 0x6f, 0x6c, + 0x65, 0x52, 0x04, 0x52, 0x6f, 0x6c, 0x65, 0x12, 0x2c, 0x0a, 0x09, 0x57, 0x6f, 0x72, 0x6b, 0x73, + 0x70, 0x61, 0x63, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x69, 0x64, 0x6d, + 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x09, 0x57, 0x6f, 0x72, 0x6b, + 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x1a, 0x0a, 0x03, 0x41, 0x63, 0x6c, 0x18, 0x06, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x08, 0x2e, 0x69, 0x64, 0x6d, 0x2e, 0x41, 0x43, 0x4c, 0x52, 0x03, 0x41, 0x63, + 0x6c, 0x12, 0x3c, 0x0a, 0x0d, 0x4d, 0x65, 0x74, 0x61, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, + 0x63, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x69, 0x64, 0x6d, 0x2e, 0x55, + 0x73, 0x65, 0x72, 0x4d, 0x65, 0x74, 0x61, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, + 0x52, 0x0d, 0x4d, 0x65, 0x74, 0x61, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, + 0x40, 0x0a, 0x0a, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x18, 0x07, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x69, 0x64, 0x6d, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, + 0x45, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, + 0x73, 0x1a, 0x3d, 0x0a, 0x0f, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, + 0x22, 0xe2, 0x01, 0x0a, 0x13, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x45, 0x6e, 0x67, 0x69, 0x6e, + 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x52, 0x65, 0x73, 0x6f, + 0x75, 0x72, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x52, 0x65, 0x73, 0x6f, + 0x75, 0x72, 0x63, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1a, 0x0a, 0x08, + 0x53, 0x75, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x08, + 0x53, 0x75, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x12, 0x3f, 0x0a, 0x07, 0x43, 0x6f, 0x6e, 0x74, + 0x65, 0x78, 0x74, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x69, 0x64, 0x6d, 0x2e, + 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x45, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x52, 0x07, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x1a, 0x3a, 0x0a, 0x0c, 0x43, 0x6f, 0x6e, + 0x74, 0x65, 0x78, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x76, 0x0a, 0x14, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x45, + 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, + 0x07, 0x41, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, + 0x41, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x12, 0x22, 0x0a, 0x0c, 0x45, 0x78, 0x70, 0x6c, 0x69, + 0x63, 0x69, 0x74, 0x44, 0x65, 0x6e, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x45, + 0x78, 0x70, 0x6c, 0x69, 0x63, 0x69, 0x74, 0x44, 0x65, 0x6e, 0x79, 0x12, 0x20, 0x0a, 0x0b, 0x44, + 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x44, 0x65, 0x6e, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x0b, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x44, 0x65, 0x6e, 0x79, 0x22, 0x47, 0x0a, + 0x0f, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, + 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, + 0x74, 0x79, 0x70, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x6a, 0x73, 0x6f, 0x6e, 0x4f, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x6a, 0x73, 0x6f, 0x6e, 0x4f, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0xcb, 0x02, 0x0a, 0x06, 0x50, 0x6f, 0x6c, 0x69, 0x63, + 0x79, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, + 0x64, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x75, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x18, + 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x08, 0x73, 0x75, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x12, + 0x1c, 0x0a, 0x09, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x18, 0x04, 0x20, 0x03, + 0x28, 0x09, 0x52, 0x09, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x12, 0x18, 0x0a, + 0x07, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, + 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x29, 0x0a, 0x06, 0x65, 0x66, 0x66, 0x65, 0x63, + 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x11, 0x2e, 0x69, 0x64, 0x6d, 0x2e, 0x50, 0x6f, + 0x6c, 0x69, 0x63, 0x79, 0x45, 0x66, 0x66, 0x65, 0x63, 0x74, 0x52, 0x06, 0x65, 0x66, 0x66, 0x65, + 0x63, 0x74, 0x12, 0x3b, 0x0a, 0x0a, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x69, 0x64, 0x6d, 0x2e, 0x50, 0x6f, 0x6c, + 0x69, 0x63, 0x79, 0x2e, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x52, 0x0a, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, + 0x53, 0x0a, 0x0f, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2a, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x69, 0x64, 0x6d, 0x2e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, + 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x3a, 0x02, 0x38, 0x01, 0x22, 0x80, 0x02, 0x0a, 0x0b, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x47, + 0x72, 0x6f, 0x75, 0x70, 0x12, 0x12, 0x0a, 0x04, 0x55, 0x75, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x04, 0x55, 0x75, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, + 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0b, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1c, + 0x0a, 0x09, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x55, 0x75, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x09, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x55, 0x75, 0x69, 0x64, 0x12, 0x3e, 0x0a, 0x0d, + 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x0e, 0x32, 0x18, 0x2e, 0x69, 0x64, 0x6d, 0x2e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, + 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x0d, 0x52, + 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x12, 0x20, 0x0a, 0x0b, + 0x4c, 0x61, 0x73, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, + 0x05, 0x52, 0x0b, 0x4c, 0x61, 0x73, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x12, 0x27, + 0x0a, 0x08, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x0b, 0x2e, 0x69, 0x64, 0x6d, 0x2e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x08, 0x50, + 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x22, 0x4d, 0x0a, 0x17, 0x53, 0x74, 0x6f, 0x72, 0x65, + 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x32, 0x0a, 0x0b, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x47, 0x72, 0x6f, 0x75, + 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x69, 0x64, 0x6d, 0x2e, 0x50, 0x6f, + 0x6c, 0x69, 0x63, 0x79, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x0b, 0x50, 0x6f, 0x6c, 0x69, 0x63, + 0x79, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x22, 0x4e, 0x0a, 0x18, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x50, + 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x32, 0x0a, 0x0b, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x47, 0x72, 0x6f, 0x75, + 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x69, 0x64, 0x6d, 0x2e, 0x50, 0x6f, + 0x6c, 0x69, 0x63, 0x79, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x0b, 0x50, 0x6f, 0x6c, 0x69, 0x63, + 0x79, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x22, 0x4e, 0x0a, 0x18, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, + 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x32, 0x0a, 0x0b, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x47, 0x72, 0x6f, 0x75, + 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x69, 0x64, 0x6d, 0x2e, 0x50, 0x6f, + 0x6c, 0x69, 0x63, 0x79, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x0b, 0x50, 0x6f, 0x6c, 0x69, 0x63, + 0x79, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x22, 0x35, 0x0a, 0x19, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, + 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x22, 0x31, 0x0a, + 0x17, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x47, 0x72, 0x6f, 0x75, 0x70, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x46, 0x69, 0x6c, 0x74, + 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, + 0x22, 0x66, 0x0a, 0x18, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x47, 0x72, + 0x6f, 0x75, 0x70, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x34, 0x0a, 0x0c, + 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x18, 0x01, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x69, 0x64, 0x6d, 0x2e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x47, + 0x72, 0x6f, 0x75, 0x70, 0x52, 0x0c, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x47, 0x72, 0x6f, 0x75, + 0x70, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x05, 0x52, 0x05, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x2a, 0x2c, 0x0a, 0x08, 0x4e, 0x6f, 0x64, 0x65, + 0x54, 0x79, 0x70, 0x65, 0x12, 0x0b, 0x0a, 0x07, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, + 0x00, 0x12, 0x08, 0x0a, 0x04, 0x55, 0x53, 0x45, 0x52, 0x10, 0x01, 0x12, 0x09, 0x0a, 0x05, 0x47, + 0x52, 0x4f, 0x55, 0x50, 0x10, 0x02, 0x2a, 0x38, 0x0a, 0x0e, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, + 0x61, 0x63, 0x65, 0x53, 0x63, 0x6f, 0x70, 0x65, 0x12, 0x07, 0x0a, 0x03, 0x41, 0x4e, 0x59, 0x10, + 0x00, 0x12, 0x09, 0x0a, 0x05, 0x41, 0x44, 0x4d, 0x49, 0x4e, 0x10, 0x01, 0x12, 0x08, 0x0a, 0x04, + 0x52, 0x4f, 0x4f, 0x4d, 0x10, 0x02, 0x12, 0x08, 0x0a, 0x04, 0x4c, 0x49, 0x4e, 0x4b, 0x10, 0x03, + 0x2a, 0x56, 0x0a, 0x0f, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x54, + 0x79, 0x70, 0x65, 0x12, 0x0a, 0x0a, 0x06, 0x43, 0x52, 0x45, 0x41, 0x54, 0x45, 0x10, 0x00, 0x12, + 0x08, 0x0a, 0x04, 0x52, 0x45, 0x41, 0x44, 0x10, 0x01, 0x12, 0x0a, 0x0a, 0x06, 0x55, 0x50, 0x44, + 0x41, 0x54, 0x45, 0x10, 0x02, 0x12, 0x0a, 0x0a, 0x06, 0x44, 0x45, 0x4c, 0x45, 0x54, 0x45, 0x10, + 0x03, 0x12, 0x09, 0x0a, 0x05, 0x4c, 0x4f, 0x47, 0x49, 0x4e, 0x10, 0x04, 0x12, 0x0a, 0x0a, 0x06, + 0x4c, 0x4f, 0x47, 0x4f, 0x55, 0x54, 0x10, 0x05, 0x2a, 0x30, 0x0a, 0x0c, 0x50, 0x6f, 0x6c, 0x69, + 0x63, 0x79, 0x45, 0x66, 0x66, 0x65, 0x63, 0x74, 0x12, 0x0b, 0x0a, 0x07, 0x75, 0x6e, 0x6b, 0x6e, + 0x6f, 0x77, 0x6e, 0x10, 0x00, 0x12, 0x08, 0x0a, 0x04, 0x64, 0x65, 0x6e, 0x79, 0x10, 0x01, 0x12, + 0x09, 0x0a, 0x05, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x10, 0x02, 0x2a, 0x32, 0x0a, 0x13, 0x50, 0x6f, + 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x47, 0x72, 0x6f, 0x75, + 0x70, 0x12, 0x08, 0x0a, 0x04, 0x72, 0x65, 0x73, 0x74, 0x10, 0x00, 0x12, 0x07, 0x0a, 0x03, 0x61, + 0x63, 0x6c, 0x10, 0x01, 0x12, 0x08, 0x0a, 0x04, 0x6f, 0x69, 0x64, 0x63, 0x10, 0x02, 0x32, 0xd6, + 0x02, 0x0a, 0x0b, 0x52, 0x6f, 0x6c, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x3f, + 0x0a, 0x0a, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x6f, 0x6c, 0x65, 0x12, 0x16, 0x2e, 0x69, + 0x64, 0x6d, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x6f, 0x6c, 0x65, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x69, 0x64, 0x6d, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, + 0x65, 0x52, 0x6f, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, + 0x3f, 0x0a, 0x0a, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x6f, 0x6c, 0x65, 0x12, 0x16, 0x2e, + 0x69, 0x64, 0x6d, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x6f, 0x6c, 0x65, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x69, 0x64, 0x6d, 0x2e, 0x44, 0x65, 0x6c, 0x65, + 0x74, 0x65, 0x52, 0x6f, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, + 0x12, 0x41, 0x0a, 0x0a, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x6f, 0x6c, 0x65, 0x12, 0x16, + 0x2e, 0x69, 0x64, 0x6d, 0x2e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x6f, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x69, 0x64, 0x6d, 0x2e, 0x53, 0x65, 0x61, - 0x72, 0x63, 0x68, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x00, 0x28, 0x01, 0x30, 0x01, 0x32, 0xd8, 0x02, 0x0a, 0x10, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, - 0x61, 0x63, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x4e, 0x0a, 0x0f, 0x43, 0x72, - 0x65, 0x61, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x1b, 0x2e, - 0x69, 0x64, 0x6d, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, - 0x61, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x69, 0x64, 0x6d, - 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x4e, 0x0a, 0x0f, 0x44, 0x65, - 0x6c, 0x65, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x1b, 0x2e, - 0x69, 0x64, 0x6d, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, - 0x61, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x69, 0x64, 0x6d, - 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x50, 0x0a, 0x0f, 0x53, 0x65, - 0x61, 0x72, 0x63, 0x68, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x1b, 0x2e, - 0x69, 0x64, 0x6d, 0x2e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, - 0x61, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x69, 0x64, 0x6d, - 0x2e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x30, 0x01, 0x12, 0x52, 0x0a, 0x0f, - 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, - 0x1b, 0x2e, 0x69, 0x64, 0x6d, 0x2e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x57, 0x6f, 0x72, 0x6b, - 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x69, - 0x64, 0x6d, 0x2e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, - 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x28, 0x01, 0x30, 0x01, - 0x32, 0xc8, 0x02, 0x0a, 0x0a, 0x41, 0x43, 0x4c, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, - 0x3c, 0x0a, 0x09, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x41, 0x43, 0x4c, 0x12, 0x15, 0x2e, 0x69, - 0x64, 0x6d, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x41, 0x43, 0x4c, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x69, 0x64, 0x6d, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, - 0x41, 0x43, 0x4c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x3c, 0x0a, - 0x09, 0x45, 0x78, 0x70, 0x69, 0x72, 0x65, 0x41, 0x43, 0x4c, 0x12, 0x15, 0x2e, 0x69, 0x64, 0x6d, - 0x2e, 0x45, 0x78, 0x70, 0x69, 0x72, 0x65, 0x41, 0x43, 0x4c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x16, 0x2e, 0x69, 0x64, 0x6d, 0x2e, 0x45, 0x78, 0x70, 0x69, 0x72, 0x65, 0x41, 0x43, - 0x4c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x3c, 0x0a, 0x09, 0x44, - 0x65, 0x6c, 0x65, 0x74, 0x65, 0x41, 0x43, 0x4c, 0x12, 0x15, 0x2e, 0x69, 0x64, 0x6d, 0x2e, 0x44, - 0x65, 0x6c, 0x65, 0x74, 0x65, 0x41, 0x43, 0x4c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x16, 0x2e, 0x69, 0x64, 0x6d, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x41, 0x43, 0x4c, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x3e, 0x0a, 0x09, 0x53, 0x65, 0x61, - 0x72, 0x63, 0x68, 0x41, 0x43, 0x4c, 0x12, 0x15, 0x2e, 0x69, 0x64, 0x6d, 0x2e, 0x53, 0x65, 0x61, - 0x72, 0x63, 0x68, 0x41, 0x43, 0x4c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, - 0x69, 0x64, 0x6d, 0x2e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x41, 0x43, 0x4c, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x30, 0x01, 0x12, 0x40, 0x0a, 0x09, 0x53, 0x74, 0x72, - 0x65, 0x61, 0x6d, 0x41, 0x43, 0x4c, 0x12, 0x15, 0x2e, 0x69, 0x64, 0x6d, 0x2e, 0x53, 0x65, 0x61, - 0x72, 0x63, 0x68, 0x41, 0x43, 0x4c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, - 0x69, 0x64, 0x6d, 0x2e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x41, 0x43, 0x4c, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x28, 0x01, 0x30, 0x01, 0x32, 0xf9, 0x02, 0x0a, 0x0f, - 0x55, 0x73, 0x65, 0x72, 0x4d, 0x65, 0x74, 0x61, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, - 0x4b, 0x0a, 0x0e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x4d, 0x65, 0x74, - 0x61, 0x12, 0x1a, 0x2e, 0x69, 0x64, 0x6d, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x55, 0x73, - 0x65, 0x72, 0x4d, 0x65, 0x74, 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, + 0x72, 0x63, 0x68, 0x52, 0x6f, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x00, 0x30, 0x01, 0x12, 0x43, 0x0a, 0x0a, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x52, 0x6f, 0x6c, + 0x65, 0x12, 0x16, 0x2e, 0x69, 0x64, 0x6d, 0x2e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x6f, + 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x69, 0x64, 0x6d, 0x2e, + 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x6f, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x00, 0x28, 0x01, 0x30, 0x01, 0x12, 0x3d, 0x0a, 0x09, 0x43, 0x6f, 0x75, 0x6e, + 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x12, 0x16, 0x2e, 0x69, 0x64, 0x6d, 0x2e, 0x53, 0x65, 0x61, 0x72, + 0x63, 0x68, 0x52, 0x6f, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, + 0x69, 0x64, 0x6d, 0x2e, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x32, 0x91, 0x03, 0x0a, 0x0b, 0x55, 0x73, 0x65, 0x72, + 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x3f, 0x0a, 0x0a, 0x43, 0x72, 0x65, 0x61, 0x74, + 0x65, 0x55, 0x73, 0x65, 0x72, 0x12, 0x16, 0x2e, 0x69, 0x64, 0x6d, 0x2e, 0x43, 0x72, 0x65, 0x61, + 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, + 0x69, 0x64, 0x6d, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x3f, 0x0a, 0x0a, 0x44, 0x65, 0x6c, 0x65, + 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x12, 0x16, 0x2e, 0x69, 0x64, 0x6d, 0x2e, 0x44, 0x65, 0x6c, + 0x65, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, + 0x2e, 0x69, 0x64, 0x6d, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x39, 0x0a, 0x08, 0x42, 0x69, 0x6e, + 0x64, 0x55, 0x73, 0x65, 0x72, 0x12, 0x14, 0x2e, 0x69, 0x64, 0x6d, 0x2e, 0x42, 0x69, 0x6e, 0x64, + 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x15, 0x2e, 0x69, 0x64, + 0x6d, 0x2e, 0x42, 0x69, 0x6e, 0x64, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x00, 0x12, 0x3d, 0x0a, 0x09, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x55, 0x73, 0x65, + 0x72, 0x12, 0x16, 0x2e, 0x69, 0x64, 0x6d, 0x2e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x55, 0x73, + 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x69, 0x64, 0x6d, 0x2e, + 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x00, 0x12, 0x41, 0x0a, 0x0a, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x55, 0x73, 0x65, + 0x72, 0x12, 0x16, 0x2e, 0x69, 0x64, 0x6d, 0x2e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x55, 0x73, + 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x69, 0x64, 0x6d, 0x2e, + 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x00, 0x30, 0x01, 0x12, 0x43, 0x0a, 0x0a, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, + 0x55, 0x73, 0x65, 0x72, 0x12, 0x16, 0x2e, 0x69, 0x64, 0x6d, 0x2e, 0x53, 0x65, 0x61, 0x72, 0x63, + 0x68, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x69, + 0x64, 0x6d, 0x2e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x28, 0x01, 0x30, 0x01, 0x32, 0xd8, 0x02, 0x0a, 0x10, + 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, + 0x12, 0x4e, 0x0a, 0x0f, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, + 0x61, 0x63, 0x65, 0x12, 0x1b, 0x2e, 0x69, 0x64, 0x6d, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, + 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x1c, 0x2e, 0x69, 0x64, 0x6d, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x57, 0x6f, 0x72, + 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, + 0x12, 0x4e, 0x0a, 0x0f, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, + 0x61, 0x63, 0x65, 0x12, 0x1b, 0x2e, 0x69, 0x64, 0x6d, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, + 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x1c, 0x2e, 0x69, 0x64, 0x6d, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x57, 0x6f, 0x72, + 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, + 0x12, 0x50, 0x0a, 0x0f, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, + 0x61, 0x63, 0x65, 0x12, 0x1b, 0x2e, 0x69, 0x64, 0x6d, 0x2e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, + 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x1c, 0x2e, 0x69, 0x64, 0x6d, 0x2e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x57, 0x6f, 0x72, + 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, + 0x30, 0x01, 0x12, 0x52, 0x0a, 0x0f, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x57, 0x6f, 0x72, 0x6b, + 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x1b, 0x2e, 0x69, 0x64, 0x6d, 0x2e, 0x53, 0x65, 0x61, 0x72, + 0x63, 0x68, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x69, 0x64, 0x6d, 0x2e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x57, + 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x00, 0x28, 0x01, 0x30, 0x01, 0x32, 0x89, 0x03, 0x0a, 0x0a, 0x41, 0x43, 0x4c, 0x53, 0x65, + 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x3c, 0x0a, 0x09, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x41, + 0x43, 0x4c, 0x12, 0x15, 0x2e, 0x69, 0x64, 0x6d, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x41, + 0x43, 0x4c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x69, 0x64, 0x6d, 0x2e, + 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x41, 0x43, 0x4c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x00, 0x12, 0x3c, 0x0a, 0x09, 0x45, 0x78, 0x70, 0x69, 0x72, 0x65, 0x41, 0x43, 0x4c, + 0x12, 0x15, 0x2e, 0x69, 0x64, 0x6d, 0x2e, 0x45, 0x78, 0x70, 0x69, 0x72, 0x65, 0x41, 0x43, 0x4c, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x69, 0x64, 0x6d, 0x2e, 0x45, 0x78, + 0x70, 0x69, 0x72, 0x65, 0x41, 0x43, 0x4c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x00, 0x12, 0x3c, 0x0a, 0x09, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x41, 0x43, 0x4c, 0x12, 0x15, + 0x2e, 0x69, 0x64, 0x6d, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x41, 0x43, 0x4c, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x69, 0x64, 0x6d, 0x2e, 0x44, 0x65, 0x6c, 0x65, + 0x74, 0x65, 0x41, 0x43, 0x4c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, + 0x3e, 0x0a, 0x09, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x41, 0x43, 0x4c, 0x12, 0x15, 0x2e, 0x69, + 0x64, 0x6d, 0x2e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x41, 0x43, 0x4c, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x69, 0x64, 0x6d, 0x2e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, + 0x41, 0x43, 0x4c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x30, 0x01, 0x12, + 0x40, 0x0a, 0x09, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x41, 0x43, 0x4c, 0x12, 0x15, 0x2e, 0x69, + 0x64, 0x6d, 0x2e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x41, 0x43, 0x4c, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x69, 0x64, 0x6d, 0x2e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, + 0x41, 0x43, 0x4c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x28, 0x01, 0x30, + 0x01, 0x12, 0x3f, 0x0a, 0x0a, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x41, 0x43, 0x4c, 0x12, + 0x16, 0x2e, 0x69, 0x64, 0x6d, 0x2e, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x41, 0x43, 0x4c, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x69, 0x64, 0x6d, 0x2e, 0x52, 0x65, + 0x73, 0x74, 0x6f, 0x72, 0x65, 0x41, 0x43, 0x4c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x00, 0x32, 0xf9, 0x02, 0x0a, 0x0f, 0x55, 0x73, 0x65, 0x72, 0x4d, 0x65, 0x74, 0x61, 0x53, + 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x4b, 0x0a, 0x0e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, + 0x55, 0x73, 0x65, 0x72, 0x4d, 0x65, 0x74, 0x61, 0x12, 0x1a, 0x2e, 0x69, 0x64, 0x6d, 0x2e, 0x55, + 0x70, 0x64, 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x4d, 0x65, 0x74, 0x61, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x69, 0x64, 0x6d, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, + 0x65, 0x55, 0x73, 0x65, 0x72, 0x4d, 0x65, 0x74, 0x61, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x00, 0x12, 0x4d, 0x0a, 0x0e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x55, 0x73, 0x65, + 0x72, 0x4d, 0x65, 0x74, 0x61, 0x12, 0x1a, 0x2e, 0x69, 0x64, 0x6d, 0x2e, 0x53, 0x65, 0x61, 0x72, + 0x63, 0x68, 0x55, 0x73, 0x65, 0x72, 0x4d, 0x65, 0x74, 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x1b, 0x2e, 0x69, 0x64, 0x6d, 0x2e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x55, 0x73, + 0x65, 0x72, 0x4d, 0x65, 0x74, 0x61, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, + 0x30, 0x01, 0x12, 0x66, 0x0a, 0x17, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, + 0x4d, 0x65, 0x74, 0x61, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x23, 0x2e, 0x69, 0x64, 0x6d, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x4d, 0x65, - 0x74, 0x61, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x4d, 0x0a, 0x0e, - 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x55, 0x73, 0x65, 0x72, 0x4d, 0x65, 0x74, 0x61, 0x12, 0x1a, - 0x2e, 0x69, 0x64, 0x6d, 0x2e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x55, 0x73, 0x65, 0x72, 0x4d, - 0x65, 0x74, 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x69, 0x64, 0x6d, - 0x2e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x55, 0x73, 0x65, 0x72, 0x4d, 0x65, 0x74, 0x61, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x30, 0x01, 0x12, 0x66, 0x0a, 0x17, 0x55, - 0x70, 0x64, 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x4d, 0x65, 0x74, 0x61, 0x4e, 0x61, 0x6d, - 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x23, 0x2e, 0x69, 0x64, 0x6d, 0x2e, 0x55, 0x70, 0x64, - 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x4d, 0x65, 0x74, 0x61, 0x4e, 0x61, 0x6d, 0x65, 0x73, - 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x69, 0x64, - 0x6d, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x4d, 0x65, 0x74, 0x61, - 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x00, 0x12, 0x62, 0x0a, 0x15, 0x4c, 0x69, 0x73, 0x74, 0x55, 0x73, 0x65, 0x72, 0x4d, - 0x65, 0x74, 0x61, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x21, 0x2e, 0x69, - 0x64, 0x6d, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x55, 0x73, 0x65, 0x72, 0x4d, 0x65, 0x74, 0x61, 0x4e, - 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x22, 0x2e, 0x69, 0x64, 0x6d, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x55, 0x73, 0x65, 0x72, 0x4d, 0x65, - 0x74, 0x61, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x00, 0x30, 0x01, 0x32, 0xd5, 0x02, 0x0a, 0x13, 0x50, 0x6f, 0x6c, 0x69, - 0x63, 0x79, 0x45, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, - 0x42, 0x0a, 0x09, 0x49, 0x73, 0x41, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x12, 0x18, 0x2e, 0x69, - 0x64, 0x6d, 0x2e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x45, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x69, 0x64, 0x6d, 0x2e, 0x50, 0x6f, 0x6c, - 0x69, 0x63, 0x79, 0x45, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x00, 0x12, 0x51, 0x0a, 0x10, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x50, 0x6f, 0x6c, 0x69, - 0x63, 0x79, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x12, 0x1c, 0x2e, 0x69, 0x64, 0x6d, 0x2e, 0x53, 0x74, - 0x6f, 0x72, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x69, 0x64, 0x6d, 0x2e, 0x53, 0x74, 0x6f, 0x72, + 0x74, 0x61, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x69, 0x64, 0x6d, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x55, + 0x73, 0x65, 0x72, 0x4d, 0x65, 0x74, 0x61, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x62, 0x0a, 0x15, 0x4c, 0x69, + 0x73, 0x74, 0x55, 0x73, 0x65, 0x72, 0x4d, 0x65, 0x74, 0x61, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, + 0x61, 0x63, 0x65, 0x12, 0x21, 0x2e, 0x69, 0x64, 0x6d, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x55, 0x73, + 0x65, 0x72, 0x4d, 0x65, 0x74, 0x61, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x69, 0x64, 0x6d, 0x2e, 0x4c, 0x69, 0x73, + 0x74, 0x55, 0x73, 0x65, 0x72, 0x4d, 0x65, 0x74, 0x61, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, + 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x30, 0x01, 0x32, 0xd5, + 0x02, 0x0a, 0x13, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x45, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x53, + 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x42, 0x0a, 0x09, 0x49, 0x73, 0x41, 0x6c, 0x6c, 0x6f, + 0x77, 0x65, 0x64, 0x12, 0x18, 0x2e, 0x69, 0x64, 0x6d, 0x2e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, + 0x45, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, + 0x69, 0x64, 0x6d, 0x2e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x45, 0x6e, 0x67, 0x69, 0x6e, 0x65, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x51, 0x0a, 0x10, 0x53, 0x74, + 0x6f, 0x72, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x12, 0x1c, + 0x2e, 0x69, 0x64, 0x6d, 0x2e, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, + 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x69, + 0x64, 0x6d, 0x2e, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x47, 0x72, + 0x6f, 0x75, 0x70, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x51, 0x0a, + 0x10, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x47, 0x72, 0x6f, 0x75, 0x70, + 0x73, 0x12, 0x1c, 0x2e, 0x69, 0x64, 0x6d, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x6f, 0x6c, 0x69, + 0x63, 0x79, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x1d, 0x2e, 0x69, 0x64, 0x6d, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, + 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, + 0x12, 0x54, 0x0a, 0x11, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, + 0x47, 0x72, 0x6f, 0x75, 0x70, 0x12, 0x1d, 0x2e, 0x69, 0x64, 0x6d, 0x2e, 0x44, 0x65, 0x6c, 0x65, + 0x74, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x69, 0x64, 0x6d, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x51, 0x0a, 0x10, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x6f, - 0x6c, 0x69, 0x63, 0x79, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x12, 0x1c, 0x2e, 0x69, 0x64, 0x6d, - 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x47, 0x72, 0x6f, 0x75, 0x70, - 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x69, 0x64, 0x6d, 0x2e, 0x4c, - 0x69, 0x73, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x54, 0x0a, 0x11, 0x44, 0x65, 0x6c, - 0x65, 0x74, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x12, 0x1d, - 0x2e, 0x69, 0x64, 0x6d, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, - 0x79, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, - 0x69, 0x64, 0x6d, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, - 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x42, - 0x29, 0x5a, 0x27, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x70, 0x79, - 0x64, 0x69, 0x6f, 0x2f, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, - 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x69, 0x64, 0x6d, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x33, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x42, 0x29, 0x5a, 0x27, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, + 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x70, 0x79, 0x64, 0x69, 0x6f, 0x2f, 0x63, 0x65, 0x6c, 0x6c, 0x73, + 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x69, 0x64, + 0x6d, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -4926,7 +5125,7 @@ func file_cells_idm_proto_rawDescGZIP() []byte { } var file_cells_idm_proto_enumTypes = make([]protoimpl.EnumInfo, 7) -var file_cells_idm_proto_msgTypes = make([]protoimpl.MessageInfo, 66) +var file_cells_idm_proto_msgTypes = make([]protoimpl.MessageInfo, 68) var file_cells_idm_proto_goTypes = []interface{}{ (NodeType)(0), // 0: idm.NodeType (WorkspaceScope)(0), // 1: idm.WorkspaceScope @@ -4971,166 +5170,171 @@ var file_cells_idm_proto_goTypes = []interface{}{ (*DeleteACLResponse)(nil), // 40: idm.DeleteACLResponse (*SearchACLRequest)(nil), // 41: idm.SearchACLRequest (*SearchACLResponse)(nil), // 42: idm.SearchACLResponse - (*ACLAction)(nil), // 43: idm.ACLAction - (*ACL)(nil), // 44: idm.ACL - (*ACLSingleQuery)(nil), // 45: idm.ACLSingleQuery - (*UserMeta)(nil), // 46: idm.UserMeta - (*UserMetaNamespace)(nil), // 47: idm.UserMetaNamespace - (*UpdateUserMetaRequest)(nil), // 48: idm.UpdateUserMetaRequest - (*UpdateUserMetaResponse)(nil), // 49: idm.UpdateUserMetaResponse - (*SearchUserMetaRequest)(nil), // 50: idm.SearchUserMetaRequest - (*SearchUserMetaResponse)(nil), // 51: idm.SearchUserMetaResponse - (*UpdateUserMetaNamespaceRequest)(nil), // 52: idm.UpdateUserMetaNamespaceRequest - (*UpdateUserMetaNamespaceResponse)(nil), // 53: idm.UpdateUserMetaNamespaceResponse - (*ListUserMetaNamespaceRequest)(nil), // 54: idm.ListUserMetaNamespaceRequest - (*ListUserMetaNamespaceResponse)(nil), // 55: idm.ListUserMetaNamespaceResponse - (*ChangeEvent)(nil), // 56: idm.ChangeEvent - (*PolicyEngineRequest)(nil), // 57: idm.PolicyEngineRequest - (*PolicyEngineResponse)(nil), // 58: idm.PolicyEngineResponse - (*PolicyCondition)(nil), // 59: idm.PolicyCondition - (*Policy)(nil), // 60: idm.Policy - (*PolicyGroup)(nil), // 61: idm.PolicyGroup - (*StorePolicyGroupRequest)(nil), // 62: idm.StorePolicyGroupRequest - (*StorePolicyGroupResponse)(nil), // 63: idm.StorePolicyGroupResponse - (*DeletePolicyGroupRequest)(nil), // 64: idm.DeletePolicyGroupRequest - (*DeletePolicyGroupResponse)(nil), // 65: idm.DeletePolicyGroupResponse - (*ListPolicyGroupsRequest)(nil), // 66: idm.ListPolicyGroupsRequest - (*ListPolicyGroupsResponse)(nil), // 67: idm.ListPolicyGroupsResponse - nil, // 68: idm.User.AttributesEntry - nil, // 69: idm.Workspace.RootNodesEntry - nil, // 70: idm.ChangeEvent.AttributesEntry - nil, // 71: idm.PolicyEngineRequest.ContextEntry - nil, // 72: idm.Policy.ConditionsEntry - (*service.Query)(nil), // 73: service.Query - (*service.ResourcePolicy)(nil), // 74: service.ResourcePolicy - (*tree.Node)(nil), // 75: tree.Node - (*service.ResourcePolicyQuery)(nil), // 76: service.ResourcePolicyQuery + (*RestoreACLRequest)(nil), // 43: idm.RestoreACLRequest + (*RestoreACLResponse)(nil), // 44: idm.RestoreACLResponse + (*ACLAction)(nil), // 45: idm.ACLAction + (*ACL)(nil), // 46: idm.ACL + (*ACLSingleQuery)(nil), // 47: idm.ACLSingleQuery + (*UserMeta)(nil), // 48: idm.UserMeta + (*UserMetaNamespace)(nil), // 49: idm.UserMetaNamespace + (*UpdateUserMetaRequest)(nil), // 50: idm.UpdateUserMetaRequest + (*UpdateUserMetaResponse)(nil), // 51: idm.UpdateUserMetaResponse + (*SearchUserMetaRequest)(nil), // 52: idm.SearchUserMetaRequest + (*SearchUserMetaResponse)(nil), // 53: idm.SearchUserMetaResponse + (*UpdateUserMetaNamespaceRequest)(nil), // 54: idm.UpdateUserMetaNamespaceRequest + (*UpdateUserMetaNamespaceResponse)(nil), // 55: idm.UpdateUserMetaNamespaceResponse + (*ListUserMetaNamespaceRequest)(nil), // 56: idm.ListUserMetaNamespaceRequest + (*ListUserMetaNamespaceResponse)(nil), // 57: idm.ListUserMetaNamespaceResponse + (*ChangeEvent)(nil), // 58: idm.ChangeEvent + (*PolicyEngineRequest)(nil), // 59: idm.PolicyEngineRequest + (*PolicyEngineResponse)(nil), // 60: idm.PolicyEngineResponse + (*PolicyCondition)(nil), // 61: idm.PolicyCondition + (*Policy)(nil), // 62: idm.Policy + (*PolicyGroup)(nil), // 63: idm.PolicyGroup + (*StorePolicyGroupRequest)(nil), // 64: idm.StorePolicyGroupRequest + (*StorePolicyGroupResponse)(nil), // 65: idm.StorePolicyGroupResponse + (*DeletePolicyGroupRequest)(nil), // 66: idm.DeletePolicyGroupRequest + (*DeletePolicyGroupResponse)(nil), // 67: idm.DeletePolicyGroupResponse + (*ListPolicyGroupsRequest)(nil), // 68: idm.ListPolicyGroupsRequest + (*ListPolicyGroupsResponse)(nil), // 69: idm.ListPolicyGroupsResponse + nil, // 70: idm.User.AttributesEntry + nil, // 71: idm.Workspace.RootNodesEntry + nil, // 72: idm.ChangeEvent.AttributesEntry + nil, // 73: idm.PolicyEngineRequest.ContextEntry + nil, // 74: idm.Policy.ConditionsEntry + (*service.Query)(nil), // 75: service.Query + (*service.ResourcePolicy)(nil), // 76: service.ResourcePolicy + (*tree.Node)(nil), // 77: tree.Node + (*service.ResourcePolicyQuery)(nil), // 78: service.ResourcePolicyQuery } var file_cells_idm_proto_depIdxs = []int32{ 14, // 0: idm.CreateRoleRequest.Role:type_name -> idm.Role 14, // 1: idm.CreateRoleResponse.Role:type_name -> idm.Role - 73, // 2: idm.DeleteRoleRequest.Query:type_name -> service.Query - 73, // 3: idm.SearchRoleRequest.Query:type_name -> service.Query + 75, // 2: idm.DeleteRoleRequest.Query:type_name -> service.Query + 75, // 3: idm.SearchRoleRequest.Query:type_name -> service.Query 14, // 4: idm.SearchRoleResponse.Role:type_name -> idm.Role - 74, // 5: idm.Role.Policies:type_name -> service.ResourcePolicy + 76, // 5: idm.Role.Policies:type_name -> service.ResourcePolicy 25, // 6: idm.CreateUserRequest.User:type_name -> idm.User 25, // 7: idm.CreateUserResponse.User:type_name -> idm.User 25, // 8: idm.BindUserResponse.User:type_name -> idm.User - 73, // 9: idm.DeleteUserRequest.Query:type_name -> service.Query - 73, // 10: idm.SearchUserRequest.Query:type_name -> service.Query + 75, // 9: idm.DeleteUserRequest.Query:type_name -> service.Query + 75, // 10: idm.SearchUserRequest.Query:type_name -> service.Query 25, // 11: idm.SearchUserResponse.User:type_name -> idm.User - 68, // 12: idm.User.Attributes:type_name -> idm.User.AttributesEntry + 70, // 12: idm.User.Attributes:type_name -> idm.User.AttributesEntry 14, // 13: idm.User.Roles:type_name -> idm.Role - 74, // 14: idm.User.Policies:type_name -> service.ResourcePolicy + 76, // 14: idm.User.Policies:type_name -> service.ResourcePolicy 0, // 15: idm.UserSingleQuery.NodeType:type_name -> idm.NodeType 33, // 16: idm.CreateWorkspaceRequest.Workspace:type_name -> idm.Workspace 33, // 17: idm.CreateWorkspaceResponse.Workspace:type_name -> idm.Workspace - 73, // 18: idm.DeleteWorkspaceRequest.Query:type_name -> service.Query - 73, // 19: idm.SearchWorkspaceRequest.Query:type_name -> service.Query + 75, // 18: idm.DeleteWorkspaceRequest.Query:type_name -> service.Query + 75, // 19: idm.SearchWorkspaceRequest.Query:type_name -> service.Query 33, // 20: idm.SearchWorkspaceResponse.Workspace:type_name -> idm.Workspace 1, // 21: idm.Workspace.Scope:type_name -> idm.WorkspaceScope - 74, // 22: idm.Workspace.Policies:type_name -> service.ResourcePolicy - 69, // 23: idm.Workspace.RootNodes:type_name -> idm.Workspace.RootNodesEntry + 76, // 22: idm.Workspace.Policies:type_name -> service.ResourcePolicy + 71, // 23: idm.Workspace.RootNodes:type_name -> idm.Workspace.RootNodesEntry 1, // 24: idm.WorkspaceSingleQuery.scope:type_name -> idm.WorkspaceScope - 44, // 25: idm.CreateACLRequest.ACL:type_name -> idm.ACL - 44, // 26: idm.CreateACLResponse.ACL:type_name -> idm.ACL - 73, // 27: idm.ExpireACLRequest.Query:type_name -> service.Query - 73, // 28: idm.DeleteACLRequest.Query:type_name -> service.Query - 73, // 29: idm.SearchACLRequest.Query:type_name -> service.Query - 44, // 30: idm.SearchACLResponse.ACL:type_name -> idm.ACL - 43, // 31: idm.ACL.Action:type_name -> idm.ACLAction - 43, // 32: idm.ACLSingleQuery.Actions:type_name -> idm.ACLAction - 74, // 33: idm.UserMeta.Policies:type_name -> service.ResourcePolicy - 75, // 34: idm.UserMeta.ResolvedNode:type_name -> tree.Node - 74, // 35: idm.UserMetaNamespace.Policies:type_name -> service.ResourcePolicy - 5, // 36: idm.UpdateUserMetaRequest.Operation:type_name -> idm.UpdateUserMetaRequest.UserMetaOp - 46, // 37: idm.UpdateUserMetaRequest.MetaDatas:type_name -> idm.UserMeta - 46, // 38: idm.UpdateUserMetaResponse.MetaDatas:type_name -> idm.UserMeta - 76, // 39: idm.SearchUserMetaRequest.ResourceQuery:type_name -> service.ResourcePolicyQuery - 46, // 40: idm.SearchUserMetaResponse.UserMeta:type_name -> idm.UserMeta - 6, // 41: idm.UpdateUserMetaNamespaceRequest.Operation:type_name -> idm.UpdateUserMetaNamespaceRequest.UserMetaNsOp - 47, // 42: idm.UpdateUserMetaNamespaceRequest.Namespaces:type_name -> idm.UserMetaNamespace - 47, // 43: idm.UpdateUserMetaNamespaceResponse.Namespaces:type_name -> idm.UserMetaNamespace - 47, // 44: idm.ListUserMetaNamespaceResponse.UserMetaNamespace:type_name -> idm.UserMetaNamespace - 2, // 45: idm.ChangeEvent.Type:type_name -> idm.ChangeEventType - 25, // 46: idm.ChangeEvent.User:type_name -> idm.User - 14, // 47: idm.ChangeEvent.Role:type_name -> idm.Role - 33, // 48: idm.ChangeEvent.Workspace:type_name -> idm.Workspace - 44, // 49: idm.ChangeEvent.Acl:type_name -> idm.ACL - 47, // 50: idm.ChangeEvent.MetaNamespace:type_name -> idm.UserMetaNamespace - 70, // 51: idm.ChangeEvent.Attributes:type_name -> idm.ChangeEvent.AttributesEntry - 71, // 52: idm.PolicyEngineRequest.Context:type_name -> idm.PolicyEngineRequest.ContextEntry - 3, // 53: idm.Policy.effect:type_name -> idm.PolicyEffect - 72, // 54: idm.Policy.conditions:type_name -> idm.Policy.ConditionsEntry - 4, // 55: idm.PolicyGroup.ResourceGroup:type_name -> idm.PolicyResourceGroup - 60, // 56: idm.PolicyGroup.Policies:type_name -> idm.Policy - 61, // 57: idm.StorePolicyGroupRequest.PolicyGroup:type_name -> idm.PolicyGroup - 61, // 58: idm.StorePolicyGroupResponse.PolicyGroup:type_name -> idm.PolicyGroup - 61, // 59: idm.DeletePolicyGroupRequest.PolicyGroup:type_name -> idm.PolicyGroup - 61, // 60: idm.ListPolicyGroupsResponse.PolicyGroups:type_name -> idm.PolicyGroup - 75, // 61: idm.Workspace.RootNodesEntry.value:type_name -> tree.Node - 59, // 62: idm.Policy.ConditionsEntry.value:type_name -> idm.PolicyCondition - 7, // 63: idm.RoleService.CreateRole:input_type -> idm.CreateRoleRequest - 9, // 64: idm.RoleService.DeleteRole:input_type -> idm.DeleteRoleRequest - 11, // 65: idm.RoleService.SearchRole:input_type -> idm.SearchRoleRequest - 11, // 66: idm.RoleService.StreamRole:input_type -> idm.SearchRoleRequest - 11, // 67: idm.RoleService.CountRole:input_type -> idm.SearchRoleRequest - 16, // 68: idm.UserService.CreateUser:input_type -> idm.CreateUserRequest - 20, // 69: idm.UserService.DeleteUser:input_type -> idm.DeleteUserRequest - 18, // 70: idm.UserService.BindUser:input_type -> idm.BindUserRequest - 22, // 71: idm.UserService.CountUser:input_type -> idm.SearchUserRequest - 22, // 72: idm.UserService.SearchUser:input_type -> idm.SearchUserRequest - 22, // 73: idm.UserService.StreamUser:input_type -> idm.SearchUserRequest - 27, // 74: idm.WorkspaceService.CreateWorkspace:input_type -> idm.CreateWorkspaceRequest - 29, // 75: idm.WorkspaceService.DeleteWorkspace:input_type -> idm.DeleteWorkspaceRequest - 31, // 76: idm.WorkspaceService.SearchWorkspace:input_type -> idm.SearchWorkspaceRequest - 31, // 77: idm.WorkspaceService.StreamWorkspace:input_type -> idm.SearchWorkspaceRequest - 35, // 78: idm.ACLService.CreateACL:input_type -> idm.CreateACLRequest - 37, // 79: idm.ACLService.ExpireACL:input_type -> idm.ExpireACLRequest - 39, // 80: idm.ACLService.DeleteACL:input_type -> idm.DeleteACLRequest - 41, // 81: idm.ACLService.SearchACL:input_type -> idm.SearchACLRequest - 41, // 82: idm.ACLService.StreamACL:input_type -> idm.SearchACLRequest - 48, // 83: idm.UserMetaService.UpdateUserMeta:input_type -> idm.UpdateUserMetaRequest - 50, // 84: idm.UserMetaService.SearchUserMeta:input_type -> idm.SearchUserMetaRequest - 52, // 85: idm.UserMetaService.UpdateUserMetaNamespace:input_type -> idm.UpdateUserMetaNamespaceRequest - 54, // 86: idm.UserMetaService.ListUserMetaNamespace:input_type -> idm.ListUserMetaNamespaceRequest - 57, // 87: idm.PolicyEngineService.IsAllowed:input_type -> idm.PolicyEngineRequest - 62, // 88: idm.PolicyEngineService.StorePolicyGroup:input_type -> idm.StorePolicyGroupRequest - 66, // 89: idm.PolicyEngineService.ListPolicyGroups:input_type -> idm.ListPolicyGroupsRequest - 64, // 90: idm.PolicyEngineService.DeletePolicyGroup:input_type -> idm.DeletePolicyGroupRequest - 8, // 91: idm.RoleService.CreateRole:output_type -> idm.CreateRoleResponse - 10, // 92: idm.RoleService.DeleteRole:output_type -> idm.DeleteRoleResponse - 12, // 93: idm.RoleService.SearchRole:output_type -> idm.SearchRoleResponse - 12, // 94: idm.RoleService.StreamRole:output_type -> idm.SearchRoleResponse - 13, // 95: idm.RoleService.CountRole:output_type -> idm.CountRoleResponse - 17, // 96: idm.UserService.CreateUser:output_type -> idm.CreateUserResponse - 21, // 97: idm.UserService.DeleteUser:output_type -> idm.DeleteUserResponse - 19, // 98: idm.UserService.BindUser:output_type -> idm.BindUserResponse - 24, // 99: idm.UserService.CountUser:output_type -> idm.CountUserResponse - 23, // 100: idm.UserService.SearchUser:output_type -> idm.SearchUserResponse - 23, // 101: idm.UserService.StreamUser:output_type -> idm.SearchUserResponse - 28, // 102: idm.WorkspaceService.CreateWorkspace:output_type -> idm.CreateWorkspaceResponse - 30, // 103: idm.WorkspaceService.DeleteWorkspace:output_type -> idm.DeleteWorkspaceResponse - 32, // 104: idm.WorkspaceService.SearchWorkspace:output_type -> idm.SearchWorkspaceResponse - 32, // 105: idm.WorkspaceService.StreamWorkspace:output_type -> idm.SearchWorkspaceResponse - 36, // 106: idm.ACLService.CreateACL:output_type -> idm.CreateACLResponse - 38, // 107: idm.ACLService.ExpireACL:output_type -> idm.ExpireACLResponse - 40, // 108: idm.ACLService.DeleteACL:output_type -> idm.DeleteACLResponse - 42, // 109: idm.ACLService.SearchACL:output_type -> idm.SearchACLResponse - 42, // 110: idm.ACLService.StreamACL:output_type -> idm.SearchACLResponse - 49, // 111: idm.UserMetaService.UpdateUserMeta:output_type -> idm.UpdateUserMetaResponse - 51, // 112: idm.UserMetaService.SearchUserMeta:output_type -> idm.SearchUserMetaResponse - 53, // 113: idm.UserMetaService.UpdateUserMetaNamespace:output_type -> idm.UpdateUserMetaNamespaceResponse - 55, // 114: idm.UserMetaService.ListUserMetaNamespace:output_type -> idm.ListUserMetaNamespaceResponse - 58, // 115: idm.PolicyEngineService.IsAllowed:output_type -> idm.PolicyEngineResponse - 63, // 116: idm.PolicyEngineService.StorePolicyGroup:output_type -> idm.StorePolicyGroupResponse - 67, // 117: idm.PolicyEngineService.ListPolicyGroups:output_type -> idm.ListPolicyGroupsResponse - 65, // 118: idm.PolicyEngineService.DeletePolicyGroup:output_type -> idm.DeletePolicyGroupResponse - 91, // [91:119] is the sub-list for method output_type - 63, // [63:91] is the sub-list for method input_type - 63, // [63:63] is the sub-list for extension type_name - 63, // [63:63] is the sub-list for extension extendee - 0, // [0:63] is the sub-list for field type_name + 46, // 25: idm.CreateACLRequest.ACL:type_name -> idm.ACL + 46, // 26: idm.CreateACLResponse.ACL:type_name -> idm.ACL + 75, // 27: idm.ExpireACLRequest.Query:type_name -> service.Query + 75, // 28: idm.DeleteACLRequest.Query:type_name -> service.Query + 75, // 29: idm.SearchACLRequest.Query:type_name -> service.Query + 46, // 30: idm.SearchACLResponse.ACL:type_name -> idm.ACL + 75, // 31: idm.RestoreACLRequest.Query:type_name -> service.Query + 45, // 32: idm.ACL.Action:type_name -> idm.ACLAction + 45, // 33: idm.ACLSingleQuery.Actions:type_name -> idm.ACLAction + 76, // 34: idm.UserMeta.Policies:type_name -> service.ResourcePolicy + 77, // 35: idm.UserMeta.ResolvedNode:type_name -> tree.Node + 76, // 36: idm.UserMetaNamespace.Policies:type_name -> service.ResourcePolicy + 5, // 37: idm.UpdateUserMetaRequest.Operation:type_name -> idm.UpdateUserMetaRequest.UserMetaOp + 48, // 38: idm.UpdateUserMetaRequest.MetaDatas:type_name -> idm.UserMeta + 48, // 39: idm.UpdateUserMetaResponse.MetaDatas:type_name -> idm.UserMeta + 78, // 40: idm.SearchUserMetaRequest.ResourceQuery:type_name -> service.ResourcePolicyQuery + 48, // 41: idm.SearchUserMetaResponse.UserMeta:type_name -> idm.UserMeta + 6, // 42: idm.UpdateUserMetaNamespaceRequest.Operation:type_name -> idm.UpdateUserMetaNamespaceRequest.UserMetaNsOp + 49, // 43: idm.UpdateUserMetaNamespaceRequest.Namespaces:type_name -> idm.UserMetaNamespace + 49, // 44: idm.UpdateUserMetaNamespaceResponse.Namespaces:type_name -> idm.UserMetaNamespace + 49, // 45: idm.ListUserMetaNamespaceResponse.UserMetaNamespace:type_name -> idm.UserMetaNamespace + 2, // 46: idm.ChangeEvent.Type:type_name -> idm.ChangeEventType + 25, // 47: idm.ChangeEvent.User:type_name -> idm.User + 14, // 48: idm.ChangeEvent.Role:type_name -> idm.Role + 33, // 49: idm.ChangeEvent.Workspace:type_name -> idm.Workspace + 46, // 50: idm.ChangeEvent.Acl:type_name -> idm.ACL + 49, // 51: idm.ChangeEvent.MetaNamespace:type_name -> idm.UserMetaNamespace + 72, // 52: idm.ChangeEvent.Attributes:type_name -> idm.ChangeEvent.AttributesEntry + 73, // 53: idm.PolicyEngineRequest.Context:type_name -> idm.PolicyEngineRequest.ContextEntry + 3, // 54: idm.Policy.effect:type_name -> idm.PolicyEffect + 74, // 55: idm.Policy.conditions:type_name -> idm.Policy.ConditionsEntry + 4, // 56: idm.PolicyGroup.ResourceGroup:type_name -> idm.PolicyResourceGroup + 62, // 57: idm.PolicyGroup.Policies:type_name -> idm.Policy + 63, // 58: idm.StorePolicyGroupRequest.PolicyGroup:type_name -> idm.PolicyGroup + 63, // 59: idm.StorePolicyGroupResponse.PolicyGroup:type_name -> idm.PolicyGroup + 63, // 60: idm.DeletePolicyGroupRequest.PolicyGroup:type_name -> idm.PolicyGroup + 63, // 61: idm.ListPolicyGroupsResponse.PolicyGroups:type_name -> idm.PolicyGroup + 77, // 62: idm.Workspace.RootNodesEntry.value:type_name -> tree.Node + 61, // 63: idm.Policy.ConditionsEntry.value:type_name -> idm.PolicyCondition + 7, // 64: idm.RoleService.CreateRole:input_type -> idm.CreateRoleRequest + 9, // 65: idm.RoleService.DeleteRole:input_type -> idm.DeleteRoleRequest + 11, // 66: idm.RoleService.SearchRole:input_type -> idm.SearchRoleRequest + 11, // 67: idm.RoleService.StreamRole:input_type -> idm.SearchRoleRequest + 11, // 68: idm.RoleService.CountRole:input_type -> idm.SearchRoleRequest + 16, // 69: idm.UserService.CreateUser:input_type -> idm.CreateUserRequest + 20, // 70: idm.UserService.DeleteUser:input_type -> idm.DeleteUserRequest + 18, // 71: idm.UserService.BindUser:input_type -> idm.BindUserRequest + 22, // 72: idm.UserService.CountUser:input_type -> idm.SearchUserRequest + 22, // 73: idm.UserService.SearchUser:input_type -> idm.SearchUserRequest + 22, // 74: idm.UserService.StreamUser:input_type -> idm.SearchUserRequest + 27, // 75: idm.WorkspaceService.CreateWorkspace:input_type -> idm.CreateWorkspaceRequest + 29, // 76: idm.WorkspaceService.DeleteWorkspace:input_type -> idm.DeleteWorkspaceRequest + 31, // 77: idm.WorkspaceService.SearchWorkspace:input_type -> idm.SearchWorkspaceRequest + 31, // 78: idm.WorkspaceService.StreamWorkspace:input_type -> idm.SearchWorkspaceRequest + 35, // 79: idm.ACLService.CreateACL:input_type -> idm.CreateACLRequest + 37, // 80: idm.ACLService.ExpireACL:input_type -> idm.ExpireACLRequest + 39, // 81: idm.ACLService.DeleteACL:input_type -> idm.DeleteACLRequest + 41, // 82: idm.ACLService.SearchACL:input_type -> idm.SearchACLRequest + 41, // 83: idm.ACLService.StreamACL:input_type -> idm.SearchACLRequest + 43, // 84: idm.ACLService.RestoreACL:input_type -> idm.RestoreACLRequest + 50, // 85: idm.UserMetaService.UpdateUserMeta:input_type -> idm.UpdateUserMetaRequest + 52, // 86: idm.UserMetaService.SearchUserMeta:input_type -> idm.SearchUserMetaRequest + 54, // 87: idm.UserMetaService.UpdateUserMetaNamespace:input_type -> idm.UpdateUserMetaNamespaceRequest + 56, // 88: idm.UserMetaService.ListUserMetaNamespace:input_type -> idm.ListUserMetaNamespaceRequest + 59, // 89: idm.PolicyEngineService.IsAllowed:input_type -> idm.PolicyEngineRequest + 64, // 90: idm.PolicyEngineService.StorePolicyGroup:input_type -> idm.StorePolicyGroupRequest + 68, // 91: idm.PolicyEngineService.ListPolicyGroups:input_type -> idm.ListPolicyGroupsRequest + 66, // 92: idm.PolicyEngineService.DeletePolicyGroup:input_type -> idm.DeletePolicyGroupRequest + 8, // 93: idm.RoleService.CreateRole:output_type -> idm.CreateRoleResponse + 10, // 94: idm.RoleService.DeleteRole:output_type -> idm.DeleteRoleResponse + 12, // 95: idm.RoleService.SearchRole:output_type -> idm.SearchRoleResponse + 12, // 96: idm.RoleService.StreamRole:output_type -> idm.SearchRoleResponse + 13, // 97: idm.RoleService.CountRole:output_type -> idm.CountRoleResponse + 17, // 98: idm.UserService.CreateUser:output_type -> idm.CreateUserResponse + 21, // 99: idm.UserService.DeleteUser:output_type -> idm.DeleteUserResponse + 19, // 100: idm.UserService.BindUser:output_type -> idm.BindUserResponse + 24, // 101: idm.UserService.CountUser:output_type -> idm.CountUserResponse + 23, // 102: idm.UserService.SearchUser:output_type -> idm.SearchUserResponse + 23, // 103: idm.UserService.StreamUser:output_type -> idm.SearchUserResponse + 28, // 104: idm.WorkspaceService.CreateWorkspace:output_type -> idm.CreateWorkspaceResponse + 30, // 105: idm.WorkspaceService.DeleteWorkspace:output_type -> idm.DeleteWorkspaceResponse + 32, // 106: idm.WorkspaceService.SearchWorkspace:output_type -> idm.SearchWorkspaceResponse + 32, // 107: idm.WorkspaceService.StreamWorkspace:output_type -> idm.SearchWorkspaceResponse + 36, // 108: idm.ACLService.CreateACL:output_type -> idm.CreateACLResponse + 38, // 109: idm.ACLService.ExpireACL:output_type -> idm.ExpireACLResponse + 40, // 110: idm.ACLService.DeleteACL:output_type -> idm.DeleteACLResponse + 42, // 111: idm.ACLService.SearchACL:output_type -> idm.SearchACLResponse + 42, // 112: idm.ACLService.StreamACL:output_type -> idm.SearchACLResponse + 44, // 113: idm.ACLService.RestoreACL:output_type -> idm.RestoreACLResponse + 51, // 114: idm.UserMetaService.UpdateUserMeta:output_type -> idm.UpdateUserMetaResponse + 53, // 115: idm.UserMetaService.SearchUserMeta:output_type -> idm.SearchUserMetaResponse + 55, // 116: idm.UserMetaService.UpdateUserMetaNamespace:output_type -> idm.UpdateUserMetaNamespaceResponse + 57, // 117: idm.UserMetaService.ListUserMetaNamespace:output_type -> idm.ListUserMetaNamespaceResponse + 60, // 118: idm.PolicyEngineService.IsAllowed:output_type -> idm.PolicyEngineResponse + 65, // 119: idm.PolicyEngineService.StorePolicyGroup:output_type -> idm.StorePolicyGroupResponse + 69, // 120: idm.PolicyEngineService.ListPolicyGroups:output_type -> idm.ListPolicyGroupsResponse + 67, // 121: idm.PolicyEngineService.DeletePolicyGroup:output_type -> idm.DeletePolicyGroupResponse + 93, // [93:122] is the sub-list for method output_type + 64, // [64:93] is the sub-list for method input_type + 64, // [64:64] is the sub-list for extension type_name + 64, // [64:64] is the sub-list for extension extendee + 0, // [0:64] is the sub-list for field type_name } func init() { file_cells_idm_proto_init() } @@ -5572,7 +5776,7 @@ func file_cells_idm_proto_init() { } } file_cells_idm_proto_msgTypes[36].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ACLAction); i { + switch v := v.(*RestoreACLRequest); i { case 0: return &v.state case 1: @@ -5584,7 +5788,7 @@ func file_cells_idm_proto_init() { } } file_cells_idm_proto_msgTypes[37].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ACL); i { + switch v := v.(*RestoreACLResponse); i { case 0: return &v.state case 1: @@ -5596,7 +5800,7 @@ func file_cells_idm_proto_init() { } } file_cells_idm_proto_msgTypes[38].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ACLSingleQuery); i { + switch v := v.(*ACLAction); i { case 0: return &v.state case 1: @@ -5608,7 +5812,7 @@ func file_cells_idm_proto_init() { } } file_cells_idm_proto_msgTypes[39].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UserMeta); i { + switch v := v.(*ACL); i { case 0: return &v.state case 1: @@ -5620,7 +5824,7 @@ func file_cells_idm_proto_init() { } } file_cells_idm_proto_msgTypes[40].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UserMetaNamespace); i { + switch v := v.(*ACLSingleQuery); i { case 0: return &v.state case 1: @@ -5632,7 +5836,7 @@ func file_cells_idm_proto_init() { } } file_cells_idm_proto_msgTypes[41].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UpdateUserMetaRequest); i { + switch v := v.(*UserMeta); i { case 0: return &v.state case 1: @@ -5644,7 +5848,7 @@ func file_cells_idm_proto_init() { } } file_cells_idm_proto_msgTypes[42].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UpdateUserMetaResponse); i { + switch v := v.(*UserMetaNamespace); i { case 0: return &v.state case 1: @@ -5656,7 +5860,7 @@ func file_cells_idm_proto_init() { } } file_cells_idm_proto_msgTypes[43].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SearchUserMetaRequest); i { + switch v := v.(*UpdateUserMetaRequest); i { case 0: return &v.state case 1: @@ -5668,7 +5872,7 @@ func file_cells_idm_proto_init() { } } file_cells_idm_proto_msgTypes[44].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SearchUserMetaResponse); i { + switch v := v.(*UpdateUserMetaResponse); i { case 0: return &v.state case 1: @@ -5680,7 +5884,7 @@ func file_cells_idm_proto_init() { } } file_cells_idm_proto_msgTypes[45].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UpdateUserMetaNamespaceRequest); i { + switch v := v.(*SearchUserMetaRequest); i { case 0: return &v.state case 1: @@ -5692,7 +5896,7 @@ func file_cells_idm_proto_init() { } } file_cells_idm_proto_msgTypes[46].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UpdateUserMetaNamespaceResponse); i { + switch v := v.(*SearchUserMetaResponse); i { case 0: return &v.state case 1: @@ -5704,7 +5908,7 @@ func file_cells_idm_proto_init() { } } file_cells_idm_proto_msgTypes[47].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListUserMetaNamespaceRequest); i { + switch v := v.(*UpdateUserMetaNamespaceRequest); i { case 0: return &v.state case 1: @@ -5716,7 +5920,7 @@ func file_cells_idm_proto_init() { } } file_cells_idm_proto_msgTypes[48].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListUserMetaNamespaceResponse); i { + switch v := v.(*UpdateUserMetaNamespaceResponse); i { case 0: return &v.state case 1: @@ -5728,7 +5932,7 @@ func file_cells_idm_proto_init() { } } file_cells_idm_proto_msgTypes[49].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ChangeEvent); i { + switch v := v.(*ListUserMetaNamespaceRequest); i { case 0: return &v.state case 1: @@ -5740,7 +5944,7 @@ func file_cells_idm_proto_init() { } } file_cells_idm_proto_msgTypes[50].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PolicyEngineRequest); i { + switch v := v.(*ListUserMetaNamespaceResponse); i { case 0: return &v.state case 1: @@ -5752,7 +5956,7 @@ func file_cells_idm_proto_init() { } } file_cells_idm_proto_msgTypes[51].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PolicyEngineResponse); i { + switch v := v.(*ChangeEvent); i { case 0: return &v.state case 1: @@ -5764,7 +5968,7 @@ func file_cells_idm_proto_init() { } } file_cells_idm_proto_msgTypes[52].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PolicyCondition); i { + switch v := v.(*PolicyEngineRequest); i { case 0: return &v.state case 1: @@ -5776,7 +5980,7 @@ func file_cells_idm_proto_init() { } } file_cells_idm_proto_msgTypes[53].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Policy); i { + switch v := v.(*PolicyEngineResponse); i { case 0: return &v.state case 1: @@ -5788,7 +5992,7 @@ func file_cells_idm_proto_init() { } } file_cells_idm_proto_msgTypes[54].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PolicyGroup); i { + switch v := v.(*PolicyCondition); i { case 0: return &v.state case 1: @@ -5800,7 +6004,7 @@ func file_cells_idm_proto_init() { } } file_cells_idm_proto_msgTypes[55].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*StorePolicyGroupRequest); i { + switch v := v.(*Policy); i { case 0: return &v.state case 1: @@ -5812,7 +6016,7 @@ func file_cells_idm_proto_init() { } } file_cells_idm_proto_msgTypes[56].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*StorePolicyGroupResponse); i { + switch v := v.(*PolicyGroup); i { case 0: return &v.state case 1: @@ -5824,7 +6028,7 @@ func file_cells_idm_proto_init() { } } file_cells_idm_proto_msgTypes[57].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DeletePolicyGroupRequest); i { + switch v := v.(*StorePolicyGroupRequest); i { case 0: return &v.state case 1: @@ -5836,7 +6040,7 @@ func file_cells_idm_proto_init() { } } file_cells_idm_proto_msgTypes[58].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DeletePolicyGroupResponse); i { + switch v := v.(*StorePolicyGroupResponse); i { case 0: return &v.state case 1: @@ -5848,7 +6052,7 @@ func file_cells_idm_proto_init() { } } file_cells_idm_proto_msgTypes[59].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListPolicyGroupsRequest); i { + switch v := v.(*DeletePolicyGroupRequest); i { case 0: return &v.state case 1: @@ -5860,6 +6064,30 @@ func file_cells_idm_proto_init() { } } file_cells_idm_proto_msgTypes[60].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DeletePolicyGroupResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_cells_idm_proto_msgTypes[61].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ListPolicyGroupsRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_cells_idm_proto_msgTypes[62].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ListPolicyGroupsResponse); i { case 0: return &v.state @@ -5878,7 +6106,7 @@ func file_cells_idm_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_cells_idm_proto_rawDesc, NumEnums: 7, - NumMessages: 66, + NumMessages: 68, NumExtensions: 0, NumServices: 6, }, diff --git a/common/proto/idm/cells-idm.proto b/common/proto/idm/cells-idm.proto index 0b3ec59e71..c0950a2f10 100644 --- a/common/proto/idm/cells-idm.proto +++ b/common/proto/idm/cells-idm.proto @@ -316,11 +316,18 @@ message WorkspaceSingleQuery { // ACL Services // ***************************************************************************** service ACLService { + // Insert a new ACL rpc CreateACL (CreateACLRequest) returns (CreateACLResponse) {}; + // Set an expiration date that invalidates an ACL without deleting it rpc ExpireACL (ExpireACLRequest) returns (ExpireACLResponse) {}; + // Definitely delete an ACL rpc DeleteACL (DeleteACLRequest) returns (DeleteACLResponse) {}; + // Search ACLs by Query or Expiration period rpc SearchACL (SearchACLRequest) returns (stream SearchACLResponse) {}; + // Stream version of Search ACL rpc StreamACL (stream SearchACLRequest) returns (stream SearchACLResponse) {}; + // Restore ACLs based on Query and Expiration period + rpc RestoreACL (RestoreACLRequest) returns (RestoreACLResponse) {}; } // ***************************************************************************** @@ -346,6 +353,8 @@ message ExpireACLResponse{ message DeleteACLRequest{ service.Query Query = 1; + int64 ExpiredAfter = 2; + int64 ExpiredBefore = 3; } message DeleteACLResponse{ @@ -354,12 +363,26 @@ message DeleteACLResponse{ message SearchACLRequest{ service.Query Query = 1; + int64 ExpiredAfter = 2; + int64 ExpiredBefore = 3; } message SearchACLResponse{ ACL ACL = 1; } +message RestoreACLRequest{ + service.Query Query = 1; + int64 ExpiredAfter = 2; + int64 ExpiredBefore = 3; +} + +message RestoreACLResponse{ + int64 Rows = 1; +} + + + message ACLAction{ // ACL Action name, most frequent values are "read" or "write" string Name = 1; diff --git a/common/proto/idm/cells-idm.validator.pb.go b/common/proto/idm/cells-idm.validator.pb.go index 3e5da2743a..c76e00f3a2 100644 --- a/common/proto/idm/cells-idm.validator.pb.go +++ b/common/proto/idm/cells-idm.validator.pb.go @@ -7,9 +7,9 @@ import ( fmt "fmt" math "math" proto "google.golang.org/protobuf/proto" + _ "github.com/pydio/cells/v4/common/proto/service" _ "github.com/pydio/cells/v4/common/proto/tree" _ "github.com/mwitkow/go-proto-validators" - _ "github.com/pydio/cells/v4/common/proto/service" github_com_mwitkow_go_proto_validators "github.com/mwitkow/go-proto-validators" ) @@ -275,6 +275,17 @@ func (this *SearchACLResponse) Validate() error { } return nil } +func (this *RestoreACLRequest) Validate() error { + if this.Query != nil { + if err := github_com_mwitkow_go_proto_validators.CallValidatorIfExists(this.Query); err != nil { + return github_com_mwitkow_go_proto_validators.FieldError("Query", err) + } + } + return nil +} +func (this *RestoreACLResponse) Validate() error { + return nil +} func (this *ACLAction) Validate() error { return nil } diff --git a/common/proto/idm/cells-idm_grpc.enhanced.pb.go b/common/proto/idm/cells-idm_grpc.enhanced.pb.go index 11875ed6e1..086d9b2302 100644 --- a/common/proto/idm/cells-idm_grpc.enhanced.pb.go +++ b/common/proto/idm/cells-idm_grpc.enhanced.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go-grpc. DO NOT EDIT. // versions: // - protoc-gen-go-grpc v1.1.0 -// - protoc v3.18.1 +// - protoc (unknown) // source: cells-idm.proto package idm @@ -359,6 +359,8 @@ type NamedACLServiceServer interface { } type ACLServiceEnhancedServer map[string]NamedACLServiceServer +// Insert a new ACL + func (m ACLServiceEnhancedServer) CreateACL(ctx context.Context, r *CreateACLRequest) (*CreateACLResponse, error) { md, ok := metadata.FromIncomingContext(ctx) if !ok || len(md.Get("targetname")) == 0 { @@ -374,6 +376,8 @@ func (m ACLServiceEnhancedServer) CreateACL(ctx context.Context, r *CreateACLReq return nil, status.Errorf(codes.Unimplemented, "method CreateACL not implemented") } +// Set an expiration date that invalidates an ACL without deleting it + func (m ACLServiceEnhancedServer) ExpireACL(ctx context.Context, r *ExpireACLRequest) (*ExpireACLResponse, error) { md, ok := metadata.FromIncomingContext(ctx) if !ok || len(md.Get("targetname")) == 0 { @@ -389,6 +393,8 @@ func (m ACLServiceEnhancedServer) ExpireACL(ctx context.Context, r *ExpireACLReq return nil, status.Errorf(codes.Unimplemented, "method ExpireACL not implemented") } +// Definitely delete an ACL + func (m ACLServiceEnhancedServer) DeleteACL(ctx context.Context, r *DeleteACLRequest) (*DeleteACLResponse, error) { md, ok := metadata.FromIncomingContext(ctx) if !ok || len(md.Get("targetname")) == 0 { @@ -404,6 +410,8 @@ func (m ACLServiceEnhancedServer) DeleteACL(ctx context.Context, r *DeleteACLReq return nil, status.Errorf(codes.Unimplemented, "method DeleteACL not implemented") } +// Search ACLs by Query or Expiration period + func (m ACLServiceEnhancedServer) SearchACL(r *SearchACLRequest, s ACLService_SearchACLServer) error { md, ok := metadata.FromIncomingContext(s.Context()) if !ok || len(md.Get("targetname")) == 0 { @@ -419,6 +427,8 @@ func (m ACLServiceEnhancedServer) SearchACL(r *SearchACLRequest, s ACLService_Se return status.Errorf(codes.Unimplemented, "method SearchACL not implemented") } +// Stream version of Search ACL + func (m ACLServiceEnhancedServer) StreamACL(s ACLService_StreamACLServer) error { md, ok := metadata.FromIncomingContext(s.Context()) if !ok || len(md.Get("targetname")) == 0 { @@ -433,6 +443,23 @@ func (m ACLServiceEnhancedServer) StreamACL(s ACLService_StreamACLServer) error } return status.Errorf(codes.Unimplemented, "method StreamACL not implemented") } + +// Restore ACLs based on Query and Expiration period + +func (m ACLServiceEnhancedServer) RestoreACL(ctx context.Context, r *RestoreACLRequest) (*RestoreACLResponse, error) { + md, ok := metadata.FromIncomingContext(ctx) + if !ok || len(md.Get("targetname")) == 0 { + return nil, status.Errorf(codes.FailedPrecondition, "method RestoreACL should have a context") + } + enhancedACLServiceServersLock.RLock() + defer enhancedACLServiceServersLock.RUnlock() + for _, mm := range m { + if mm.Name() == md.Get("targetname")[0] { + return mm.RestoreACL(ctx, r) + } + } + return nil, status.Errorf(codes.Unimplemented, "method RestoreACL not implemented") +} func (m ACLServiceEnhancedServer) mustEmbedUnimplementedACLServiceServer() {} func RegisterACLServiceEnhancedServer(s grpc.ServiceRegistrar, srv NamedACLServiceServer) { enhancedACLServiceServersLock.Lock() diff --git a/common/proto/idm/cells-idm_grpc.pb.go b/common/proto/idm/cells-idm_grpc.pb.go index 29ac99170e..17b541b038 100644 --- a/common/proto/idm/cells-idm_grpc.pb.go +++ b/common/proto/idm/cells-idm_grpc.pb.go @@ -888,11 +888,18 @@ var WorkspaceService_ServiceDesc = grpc.ServiceDesc{ // // For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. type ACLServiceClient interface { + // Insert a new ACL CreateACL(ctx context.Context, in *CreateACLRequest, opts ...grpc.CallOption) (*CreateACLResponse, error) + // Set an expiration date that invalidates an ACL without deleting it ExpireACL(ctx context.Context, in *ExpireACLRequest, opts ...grpc.CallOption) (*ExpireACLResponse, error) + // Definitely delete an ACL DeleteACL(ctx context.Context, in *DeleteACLRequest, opts ...grpc.CallOption) (*DeleteACLResponse, error) + // Search ACLs by Query or Expiration period SearchACL(ctx context.Context, in *SearchACLRequest, opts ...grpc.CallOption) (ACLService_SearchACLClient, error) + // Stream version of Search ACL StreamACL(ctx context.Context, opts ...grpc.CallOption) (ACLService_StreamACLClient, error) + // Restore ACLs based on Query and Expiration period + RestoreACL(ctx context.Context, in *RestoreACLRequest, opts ...grpc.CallOption) (*RestoreACLResponse, error) } type aCLServiceClient struct { @@ -993,15 +1000,31 @@ func (x *aCLServiceStreamACLClient) Recv() (*SearchACLResponse, error) { return m, nil } +func (c *aCLServiceClient) RestoreACL(ctx context.Context, in *RestoreACLRequest, opts ...grpc.CallOption) (*RestoreACLResponse, error) { + out := new(RestoreACLResponse) + err := c.cc.Invoke(ctx, "/idm.ACLService/RestoreACL", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + // ACLServiceServer is the server API for ACLService service. // All implementations must embed UnimplementedACLServiceServer // for forward compatibility type ACLServiceServer interface { + // Insert a new ACL CreateACL(context.Context, *CreateACLRequest) (*CreateACLResponse, error) + // Set an expiration date that invalidates an ACL without deleting it ExpireACL(context.Context, *ExpireACLRequest) (*ExpireACLResponse, error) + // Definitely delete an ACL DeleteACL(context.Context, *DeleteACLRequest) (*DeleteACLResponse, error) + // Search ACLs by Query or Expiration period SearchACL(*SearchACLRequest, ACLService_SearchACLServer) error + // Stream version of Search ACL StreamACL(ACLService_StreamACLServer) error + // Restore ACLs based on Query and Expiration period + RestoreACL(context.Context, *RestoreACLRequest) (*RestoreACLResponse, error) mustEmbedUnimplementedACLServiceServer() } @@ -1024,6 +1047,9 @@ func (UnimplementedACLServiceServer) SearchACL(*SearchACLRequest, ACLService_Sea func (UnimplementedACLServiceServer) StreamACL(ACLService_StreamACLServer) error { return status.Errorf(codes.Unimplemented, "method StreamACL not implemented") } +func (UnimplementedACLServiceServer) RestoreACL(context.Context, *RestoreACLRequest) (*RestoreACLResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method RestoreACL not implemented") +} func (UnimplementedACLServiceServer) mustEmbedUnimplementedACLServiceServer() {} // UnsafeACLServiceServer may be embedded to opt out of forward compatibility for this service. @@ -1138,6 +1164,24 @@ func (x *aCLServiceStreamACLServer) Recv() (*SearchACLRequest, error) { return m, nil } +func _ACLService_RestoreACL_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(RestoreACLRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ACLServiceServer).RestoreACL(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/idm.ACLService/RestoreACL", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ACLServiceServer).RestoreACL(ctx, req.(*RestoreACLRequest)) + } + return interceptor(ctx, in, info, handler) +} + // ACLService_ServiceDesc is the grpc.ServiceDesc for ACLService service. // It's only intended for direct use with grpc.RegisterService, // and not to be introspected or modified (even as a copy) @@ -1157,6 +1201,10 @@ var ACLService_ServiceDesc = grpc.ServiceDesc{ MethodName: "DeleteACL", Handler: _ACLService_DeleteACL_Handler, }, + { + MethodName: "RestoreACL", + Handler: _ACLService_RestoreACL_Handler, + }, }, Streams: []grpc.StreamDesc{ { diff --git a/common/proto/idm/cells-idm_grpc.stub.pb.go b/common/proto/idm/cells-idm_grpc.stub.pb.go index d924e31453..04754a9fca 100644 --- a/common/proto/idm/cells-idm_grpc.stub.pb.go +++ b/common/proto/idm/cells-idm_grpc.stub.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go-grpc. DO NOT EDIT. // versions: // - protoc-gen-go-client-stub v1.1.0 -// - protoc v3.18.1 +// - protoc (unknown) // source: cells-idm.proto package idm @@ -12,6 +12,7 @@ import ( stubs "github.com/pydio/cells/v4/common/server/stubs" grpc "google.golang.org/grpc" io "io" + time "time" ) // This is a compile-time assertion to ensure that this generated file @@ -59,10 +60,14 @@ func (s *RoleServiceStub) NewStream(ctx context.Context, desc *grpc.StreamDesc, case "/idm.RoleService/SearchRole": st := &RoleServiceStub_SearchRoleStreamer{} st.Init(ctx, func(i interface{}) error { - defer func() { - close(st.RespChan) + go func() { + defer func() { + close(st.RespChan) + }() + s.RoleServiceServer.SearchRole(i.(*SearchRoleRequest), st) }() - return s.RoleServiceServer.SearchRole(i.(*SearchRoleRequest), st) + <-time.After(100 * time.Millisecond) + return nil }) return st, nil case "/idm.RoleService/StreamRole": @@ -146,10 +151,14 @@ func (s *UserServiceStub) NewStream(ctx context.Context, desc *grpc.StreamDesc, case "/idm.UserService/SearchUser": st := &UserServiceStub_SearchUserStreamer{} st.Init(ctx, func(i interface{}) error { - defer func() { - close(st.RespChan) + go func() { + defer func() { + close(st.RespChan) + }() + s.UserServiceServer.SearchUser(i.(*SearchUserRequest), st) }() - return s.UserServiceServer.SearchUser(i.(*SearchUserRequest), st) + <-time.After(100 * time.Millisecond) + return nil }) return st, nil case "/idm.UserService/StreamUser": @@ -219,10 +228,14 @@ func (s *WorkspaceServiceStub) NewStream(ctx context.Context, desc *grpc.StreamD case "/idm.WorkspaceService/SearchWorkspace": st := &WorkspaceServiceStub_SearchWorkspaceStreamer{} st.Init(ctx, func(i interface{}) error { - defer func() { - close(st.RespChan) + go func() { + defer func() { + close(st.RespChan) + }() + s.WorkspaceServiceServer.SearchWorkspace(i.(*SearchWorkspaceRequest), st) }() - return s.WorkspaceServiceServer.SearchWorkspace(i.(*SearchWorkspaceRequest), st) + <-time.After(100 * time.Millisecond) + return nil }) return st, nil case "/idm.WorkspaceService/StreamWorkspace": @@ -288,6 +301,13 @@ func (s *ACLServiceStub) Invoke(ctx context.Context, method string, args interfa } else { e = er } + case "/idm.ACLService/RestoreACL": + resp, er := s.ACLServiceServer.RestoreACL(ctx, args.(*RestoreACLRequest)) + if er == nil { + e = stubs.AssignToInterface(resp, reply) + } else { + e = er + } default: e = fmt.Errorf(method + " not implemented") } @@ -299,10 +319,14 @@ func (s *ACLServiceStub) NewStream(ctx context.Context, desc *grpc.StreamDesc, m case "/idm.ACLService/SearchACL": st := &ACLServiceStub_SearchACLStreamer{} st.Init(ctx, func(i interface{}) error { - defer func() { - close(st.RespChan) + go func() { + defer func() { + close(st.RespChan) + }() + s.ACLServiceServer.SearchACL(i.(*SearchACLRequest), st) }() - return s.ACLServiceServer.SearchACL(i.(*SearchACLRequest), st) + <-time.After(100 * time.Millisecond) + return nil }) return st, nil case "/idm.ACLService/StreamACL": @@ -372,19 +396,27 @@ func (s *UserMetaServiceStub) NewStream(ctx context.Context, desc *grpc.StreamDe case "/idm.UserMetaService/SearchUserMeta": st := &UserMetaServiceStub_SearchUserMetaStreamer{} st.Init(ctx, func(i interface{}) error { - defer func() { - close(st.RespChan) + go func() { + defer func() { + close(st.RespChan) + }() + s.UserMetaServiceServer.SearchUserMeta(i.(*SearchUserMetaRequest), st) }() - return s.UserMetaServiceServer.SearchUserMeta(i.(*SearchUserMetaRequest), st) + <-time.After(100 * time.Millisecond) + return nil }) return st, nil case "/idm.UserMetaService/ListUserMetaNamespace": st := &UserMetaServiceStub_ListUserMetaNamespaceStreamer{} st.Init(ctx, func(i interface{}) error { - defer func() { - close(st.RespChan) + go func() { + defer func() { + close(st.RespChan) + }() + s.UserMetaServiceServer.ListUserMetaNamespace(i.(*ListUserMetaNamespaceRequest), st) }() - return s.UserMetaServiceServer.ListUserMetaNamespace(i.(*ListUserMetaNamespaceRequest), st) + <-time.After(100 * time.Millisecond) + return nil }) return st, nil } diff --git a/common/proto/idm/ws-attributes.go b/common/proto/idm/ws-attributes.go index ff547d4454..7a420f8c7b 100644 --- a/common/proto/idm/ws-attributes.go +++ b/common/proto/idm/ws-attributes.go @@ -27,11 +27,12 @@ import ( ) type WsAttributes struct { - AllowSync bool `json:"ALLOW_SYNC,omitempty"` - SkipRecycle bool `json:"SKIP_RECYCLE,omitempty"` - DefaultRights string `json:"DEFAULT_RIGHTS,omitempty"` - QuotaValue string `json:"QUOTA,omitempty"` - MetaLayout string `json:"META_LAYOUT,omitempty"` + AllowSync bool `json:"ALLOW_SYNC,omitempty"` + SkipRecycle bool `json:"SKIP_RECYCLE,omitempty"` + DefaultRights string `json:"DEFAULT_RIGHTS,omitempty"` + QuotaValue string `json:"QUOTA,omitempty"` + MetaLayout string `json:"META_LAYOUT,omitempty"` + ShareExpiration int64 `json:"shareExpiration,omitempty"` } func (m *Workspace) LoadAttributes() *WsAttributes { diff --git a/common/proto/jobs/action-message.go b/common/proto/jobs/action-message.go index 7066187792..ed632eee26 100644 --- a/common/proto/jobs/action-message.go +++ b/common/proto/jobs/action-message.go @@ -22,6 +22,8 @@ package jobs import ( "fmt" + json "github.com/pydio/cells/v4/common/utils/jsonx" + "google.golang.org/protobuf/encoding/protojson" "time" "go.uber.org/zap/zapcore" @@ -84,6 +86,35 @@ func (a *ActionMessage) StackedVars() map[string]interface{} { return vv } +func (a *ActionMessage) ScanVar(name string, output interface{}) error { + // first find content + l := len(a.OutputChain) + var data string + var found bool + for i := l - 1; i >= 0; i-- { + if a.OutputChain[i].Vars != nil { + if d, o := a.OutputChain[i].Vars[name]; o { + data = d + found = true + break + } + } + } + if !found { + return fmt.Errorf("var not found") + } + if mess, ok := output.(proto.Message); ok { + if er := protojson.Unmarshal([]byte(data), mess); er != nil { + return er + } else { + output = mess + return nil + } + } else { + return json.Unmarshal([]byte(data), output) + } +} + func (a *ActionMessage) WithNode(n *tree.Node) *ActionMessage { b := a.Clone() diff --git a/common/proto/jobs/action-output.go b/common/proto/jobs/action-output.go index ef545e0b68..521110b065 100644 --- a/common/proto/jobs/action-output.go +++ b/common/proto/jobs/action-output.go @@ -21,10 +21,12 @@ package jobs import ( - json "github.com/pydio/cells/v4/common/utils/jsonx" "go.uber.org/zap/zapcore" + "google.golang.org/protobuf/encoding/protojson" + "google.golang.org/protobuf/proto" "github.com/pydio/cells/v4/common/utils/configx" + json "github.com/pydio/cells/v4/common/utils/jsonx" ) type actionOutputLogArray []*ActionOutput @@ -93,7 +95,12 @@ func (m *ActionOutput) SetVar(key string, value interface{}) { if m.Vars == nil { m.Vars = make(map[string]string) } - jv, _ := json.Marshal(value) + var jv []byte + if mess, ok := value.(proto.Message); ok { + jv, _ = protojson.Marshal(mess) + } else { + jv, _ = json.Marshal(value) + } m.Vars[key] = string(jv) } diff --git a/common/proto/jobs/action.go b/common/proto/jobs/action.go index 3fc3a74911..268e931809 100644 --- a/common/proto/jobs/action.go +++ b/common/proto/jobs/action.go @@ -173,6 +173,9 @@ func (a *Action) FanOutSelector(ctx context.Context, selector InputSelector, inp var timeoutCancel context.CancelFunc logger := log.TasksLogger(a.debugLogContext(ctx, false, selector)) logger.Debug("ZAPS", zap.Object("Input", input)) + if selector.GetClearInput() { + input = selector.ApplyClearInput(input) + } go func() { var count = 0 for { @@ -241,6 +244,9 @@ func (a *Action) CollectSelector(ctx context.Context, selector InputSelector, in logger := log.TasksLogger(a.debugLogContext(ctx, false, selector)) logger.Debug("ZAPS", zap.Object("Input", input)) + if selector.GetClearInput() { + input = selector.ApplyClearInput(input) + } var timeoutCancel context.CancelFunc wire := make(chan interface{}) selectDone := make(chan bool, 1) diff --git a/common/proto/jobs/cells-jobs.pb.go b/common/proto/jobs/cells-jobs.pb.go index 3f78616b70..6bba256a87 100644 --- a/common/proto/jobs/cells-jobs.pb.go +++ b/common/proto/jobs/cells-jobs.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.27.1 -// protoc v3.18.1 +// protoc-gen-go v1.28.1 +// protoc (unknown) // source: cells-jobs.proto package jobs @@ -171,9 +171,9 @@ func (ContextMetaFilterType) EnumDescriptor() ([]byte, []int) { return file_cells_jobs_proto_rawDescGZIP(), []int{2} } -/////////////////// +// ///////////////// // TASK SERVICE // -/////////////////// +// ///////////////// type TaskStatus int32 const ( @@ -305,9 +305,9 @@ func (Command) EnumDescriptor() ([]byte, []int) { return file_cells_jobs_proto_rawDescGZIP(), []int{4} } -/////////////////// +// ///////////////// // JOB SERVICE // -/////////////////// +// ///////////////// type NodesSelector struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -330,6 +330,8 @@ type NodesSelector struct { Description string `protobuf:"bytes,7,opt,name=Description,proto3" json:"Description,omitempty"` // Optional Timeout for this selector Timeout string `protobuf:"bytes,8,opt,name=Timeout,proto3" json:"Timeout,omitempty"` + // Clear previous selection + ClearInput bool `protobuf:"varint,10,opt,name=ClearInput,proto3" json:"ClearInput,omitempty"` } func (x *NodesSelector) Reset() { @@ -420,6 +422,13 @@ func (x *NodesSelector) GetTimeout() string { return "" } +func (x *NodesSelector) GetClearInput() bool { + if x != nil { + return x.ClearInput + } + return false +} + // Generic container for select/filter idm objects type IdmSelector struct { state protoimpl.MessageState @@ -442,6 +451,8 @@ type IdmSelector struct { Description string `protobuf:"bytes,6,opt,name=Description,proto3" json:"Description,omitempty"` // Optional Timeout for this selector Timeout string `protobuf:"bytes,7,opt,name=Timeout,proto3" json:"Timeout,omitempty"` + // Clear previous selection + ClearInput bool `protobuf:"varint,9,opt,name=ClearInput,proto3" json:"ClearInput,omitempty"` } func (x *IdmSelector) Reset() { @@ -532,6 +543,13 @@ func (x *IdmSelector) GetTimeout() string { return "" } +func (x *IdmSelector) GetClearInput() bool { + if x != nil { + return x.ClearInput + } + return false +} + // Select or filter users - should be replaced by more generic IdmSelector type UsersSelector struct { state protoimpl.MessageState @@ -553,6 +571,8 @@ type UsersSelector struct { Description string `protobuf:"bytes,7,opt,name=Description,proto3" json:"Description,omitempty"` // Optional Timeout for this selector Timeout string `protobuf:"bytes,8,opt,name=Timeout,proto3" json:"Timeout,omitempty"` + // Clear previous selection + ClearInput bool `protobuf:"varint,9,opt,name=ClearInput,proto3" json:"ClearInput,omitempty"` } func (x *UsersSelector) Reset() { @@ -636,6 +656,13 @@ func (x *UsersSelector) GetTimeout() string { return "" } +func (x *UsersSelector) GetClearInput() bool { + if x != nil { + return x.ClearInput + } + return false +} + // Selector/Filter for DataSource objects type DataSourceSelector struct { state protoimpl.MessageState @@ -658,6 +685,8 @@ type DataSourceSelector struct { Query *service.Query `protobuf:"bytes,6,opt,name=Query,proto3" json:"Query,omitempty"` // Optional Timeout for this selector Timeout string `protobuf:"bytes,7,opt,name=Timeout,proto3" json:"Timeout,omitempty"` + // Clear previous selection + ClearInput bool `protobuf:"varint,9,opt,name=ClearInput,proto3" json:"ClearInput,omitempty"` } func (x *DataSourceSelector) Reset() { @@ -748,18 +777,33 @@ func (x *DataSourceSelector) GetTimeout() string { return "" } +func (x *DataSourceSelector) GetClearInput() bool { + if x != nil { + return x.ClearInput + } + return false +} + +// Atomic query for TriggerFilter type TriggerFilterQuery struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - IsSchedule bool `protobuf:"varint,1,opt,name=IsSchedule,proto3" json:"IsSchedule,omitempty"` - IsManual bool `protobuf:"varint,2,opt,name=IsManual,proto3" json:"IsManual,omitempty"` - IsApiHook bool `protobuf:"varint,4,opt,name=IsApiHook,proto3" json:"IsApiHook,omitempty"` - ApiHookSlug string `protobuf:"bytes,5,opt,name=ApiHookSlug,proto3" json:"ApiHookSlug,omitempty"` - RunParameterName string `protobuf:"bytes,6,opt,name=RunParameterName,proto3" json:"RunParameterName,omitempty"` - RunParameterValue string `protobuf:"bytes,7,opt,name=RunParameterValue,proto3" json:"RunParameterValue,omitempty"` - EventNames []string `protobuf:"bytes,3,rep,name=EventNames,proto3" json:"EventNames,omitempty"` + // Event was triggered by a programed schedule + IsSchedule bool `protobuf:"varint,1,opt,name=IsSchedule,proto3" json:"IsSchedule,omitempty"` + // Event was triggered manually in the CellsFlows/Scheduler console + IsManual bool `protobuf:"varint,2,opt,name=IsManual,proto3" json:"IsManual,omitempty"` + // Event was triggered by a WebHook (can be in the user space) + IsApiHook bool `protobuf:"varint,4,opt,name=IsApiHook,proto3" json:"IsApiHook,omitempty"` + // Event was triggered by a specific WebHook (by its unique slug) + ApiHookSlug string `protobuf:"bytes,5,opt,name=ApiHookSlug,proto3" json:"ApiHookSlug,omitempty"` + // Filter by a name/value on a runtime defined parameter + RunParameterName string `protobuf:"bytes,6,opt,name=RunParameterName,proto3" json:"RunParameterName,omitempty"` + // Combined with RunParameterName, value used for comparison + RunParameterValue string `protobuf:"bytes,7,opt,name=RunParameterValue,proto3" json:"RunParameterValue,omitempty"` + // Event was trigger by one of these Events + EventNames []string `protobuf:"bytes,3,rep,name=EventNames,proto3" json:"EventNames,omitempty"` } func (x *TriggerFilterQuery) Reset() { @@ -1059,9 +1103,9 @@ type ContextMetaSingleQuery struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - // Condition applies to FieldName + // Field on which the Condition test will be applied FieldName string `protobuf:"bytes,1,opt,name=FieldName,proto3" json:"FieldName,omitempty"` - // PolicyCondition + // One of the available conditions as defined for Security Policies Condition *idm.PolicyCondition `protobuf:"bytes,2,opt,name=Condition,proto3" json:"Condition,omitempty"` } @@ -1431,6 +1475,8 @@ type Job struct { Schedule *Schedule `protobuf:"bytes,6,opt,name=Schedule,proto3" json:"Schedule,omitempty"` // Start task as soon as job is inserted AutoStart bool `protobuf:"varint,7,opt,name=AutoStart,proto3" json:"AutoStart,omitempty"` + // Start task as soon as server is started + AutoRestart bool `protobuf:"varint,29,opt,name=AutoRestart,proto3" json:"AutoRestart,omitempty"` // Remove job automatically once it is finished (success only) AutoClean bool `protobuf:"varint,11,opt,name=AutoClean,proto3" json:"AutoClean,omitempty"` // Chain of actions to perform @@ -1574,6 +1620,13 @@ func (x *Job) GetAutoStart() bool { return false } +func (x *Job) GetAutoRestart() bool { + if x != nil { + return x.AutoRestart + } + return false +} + func (x *Job) GetAutoClean() bool { if x != nil { return x.AutoClean @@ -3689,7 +3742,7 @@ var file_cells_jobs_proto_rawDesc = []byte{ 0x73, 0x2d, 0x69, 0x64, 0x6d, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1a, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x2d, 0x61, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x12, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x2d, 0x6f, - 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xed, 0x01, 0x0a, 0x0d, + 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x8d, 0x02, 0x0a, 0x0d, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x10, 0x0a, 0x03, 0x41, 0x6c, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x03, 0x41, 0x6c, 0x6c, 0x12, 0x16, 0x0a, 0x06, 0x50, 0x61, 0x74, 0x68, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, @@ -3704,7 +3757,9 @@ var file_cells_jobs_proto_rawDesc = []byte{ 0x20, 0x0a, 0x0b, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x08, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x07, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x22, 0xfe, 0x01, 0x0a, 0x0b, + 0x28, 0x09, 0x52, 0x07, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x43, + 0x6c, 0x65, 0x61, 0x72, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x0a, 0x43, 0x6c, 0x65, 0x61, 0x72, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x22, 0x9e, 0x02, 0x0a, 0x0b, 0x49, 0x64, 0x6d, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x29, 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x15, 0x2e, 0x6a, 0x6f, 0x62, 0x73, 0x2e, 0x49, 0x64, 0x6d, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x54, 0x79, 0x70, 0x65, @@ -3720,7 +3775,9 @@ var file_cells_jobs_proto_rawDesc = []byte{ 0x12, 0x20, 0x0a, 0x0b, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x07, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x07, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x22, 0xd4, 0x01, 0x0a, + 0x01, 0x28, 0x09, 0x52, 0x07, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x12, 0x1e, 0x0a, 0x0a, + 0x43, 0x6c, 0x65, 0x61, 0x72, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x0a, 0x43, 0x6c, 0x65, 0x61, 0x72, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x22, 0xf4, 0x01, 0x0a, 0x0d, 0x55, 0x73, 0x65, 0x72, 0x73, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x10, 0x0a, 0x03, 0x41, 0x6c, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x03, 0x41, 0x6c, 0x6c, 0x12, 0x1f, 0x0a, 0x05, 0x55, 0x73, 0x65, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, @@ -3734,7 +3791,9 @@ var file_cells_jobs_proto_rawDesc = []byte{ 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x54, 0x69, 0x6d, 0x65, - 0x6f, 0x75, 0x74, 0x22, 0x8c, 0x02, 0x0a, 0x12, 0x44, 0x61, 0x74, 0x61, 0x53, 0x6f, 0x75, 0x72, + 0x6f, 0x75, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x43, 0x6c, 0x65, 0x61, 0x72, 0x49, 0x6e, 0x70, 0x75, + 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x43, 0x6c, 0x65, 0x61, 0x72, 0x49, 0x6e, + 0x70, 0x75, 0x74, 0x22, 0xac, 0x02, 0x0a, 0x12, 0x44, 0x61, 0x74, 0x61, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x12, 0x20, 0x0a, 0x0b, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, @@ -3751,6 +3810,8 @@ var file_cells_jobs_proto_rawDesc = []byte{ 0x0b, 0x32, 0x0e, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x05, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0x18, 0x0a, 0x07, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x54, 0x69, 0x6d, 0x65, 0x6f, + 0x75, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x43, 0x6c, 0x65, 0x61, 0x72, 0x49, 0x6e, 0x70, 0x75, 0x74, + 0x18, 0x09, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x43, 0x6c, 0x65, 0x61, 0x72, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x22, 0x8a, 0x02, 0x0a, 0x12, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0x1e, 0x0a, 0x0a, 0x49, 0x73, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x49, @@ -3876,7 +3937,7 @@ var file_cells_jobs_proto_rawDesc = []byte{ 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, - 0x01, 0x22, 0xa2, 0x09, 0x0a, 0x03, 0x4a, 0x6f, 0x62, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, + 0x01, 0x22, 0xc4, 0x09, 0x0a, 0x03, 0x4a, 0x6f, 0x62, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x49, 0x44, 0x12, 0x14, 0x0a, 0x05, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x12, 0x14, 0x0a, 0x05, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, @@ -3896,415 +3957,417 @@ var file_cells_jobs_proto_rawDesc = []byte{ 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x52, 0x08, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x41, 0x75, 0x74, 0x6f, 0x53, 0x74, 0x61, 0x72, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x41, 0x75, 0x74, 0x6f, 0x53, 0x74, 0x61, 0x72, 0x74, 0x12, - 0x1c, 0x0a, 0x09, 0x41, 0x75, 0x74, 0x6f, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x18, 0x0b, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x09, 0x41, 0x75, 0x74, 0x6f, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x12, 0x26, 0x0a, - 0x07, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0c, - 0x2e, 0x6a, 0x6f, 0x62, 0x73, 0x2e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x07, 0x41, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x2e, 0x0a, 0x0b, 0x4d, 0x65, 0x72, 0x67, 0x65, 0x41, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x18, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x6a, 0x6f, 0x62, - 0x73, 0x2e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0b, 0x4d, 0x65, 0x72, 0x67, 0x65, 0x41, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x26, 0x0a, 0x0e, 0x4d, 0x61, 0x78, 0x43, 0x6f, 0x6e, 0x63, - 0x75, 0x72, 0x72, 0x65, 0x6e, 0x63, 0x79, 0x18, 0x09, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0e, 0x4d, - 0x61, 0x78, 0x43, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x63, 0x79, 0x12, 0x2c, 0x0a, - 0x11, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x53, 0x69, 0x6c, 0x65, 0x6e, 0x74, 0x55, 0x70, 0x64, 0x61, - 0x74, 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x08, 0x52, 0x11, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x53, - 0x69, 0x6c, 0x65, 0x6e, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x20, 0x0a, 0x05, 0x54, - 0x61, 0x73, 0x6b, 0x73, 0x18, 0x0e, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0a, 0x2e, 0x6a, 0x6f, 0x62, - 0x73, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x05, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x3d, 0x0a, - 0x0f, 0x4e, 0x6f, 0x64, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, - 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6a, 0x6f, 0x62, 0x73, 0x2e, 0x4e, 0x6f, - 0x64, 0x65, 0x73, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x0f, 0x4e, 0x6f, 0x64, - 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x3d, 0x0a, 0x0f, - 0x55, 0x73, 0x65, 0x72, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x18, - 0x10, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6a, 0x6f, 0x62, 0x73, 0x2e, 0x55, 0x73, 0x65, - 0x72, 0x73, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x0f, 0x55, 0x73, 0x65, 0x72, - 0x45, 0x76, 0x65, 0x6e, 0x74, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x2f, 0x0a, 0x09, 0x49, - 0x64, 0x6d, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x18, 0x11, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, - 0x2e, 0x6a, 0x6f, 0x62, 0x73, 0x2e, 0x49, 0x64, 0x6d, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, - 0x72, 0x52, 0x09, 0x49, 0x64, 0x6d, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x45, 0x0a, 0x11, - 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x46, 0x69, 0x6c, 0x74, 0x65, - 0x72, 0x18, 0x12, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x6a, 0x6f, 0x62, 0x73, 0x2e, 0x43, - 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, - 0x52, 0x11, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x46, 0x69, 0x6c, - 0x74, 0x65, 0x72, 0x12, 0x44, 0x0a, 0x10, 0x44, 0x61, 0x74, 0x61, 0x53, 0x6f, 0x75, 0x72, 0x63, - 0x65, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x18, 0x15, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, - 0x6a, 0x6f, 0x62, 0x73, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, - 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x10, 0x44, 0x61, 0x74, 0x61, 0x53, 0x6f, 0x75, - 0x72, 0x63, 0x65, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x32, 0x0a, 0x0a, 0x50, 0x61, 0x72, - 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x18, 0x13, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e, - 0x6a, 0x6f, 0x62, 0x73, 0x2e, 0x4a, 0x6f, 0x62, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, - 0x72, 0x52, 0x0a, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x12, 0x4a, 0x0a, - 0x15, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x44, 0x65, 0x70, 0x65, 0x6e, 0x64, - 0x65, 0x6e, 0x63, 0x69, 0x65, 0x73, 0x18, 0x16, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x67, - 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x41, - 0x6e, 0x79, 0x52, 0x15, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x44, 0x65, 0x70, - 0x65, 0x6e, 0x64, 0x65, 0x6e, 0x63, 0x69, 0x65, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x54, 0x69, 0x6d, - 0x65, 0x6f, 0x75, 0x74, 0x18, 0x17, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x54, 0x69, 0x6d, 0x65, - 0x6f, 0x75, 0x74, 0x12, 0x3c, 0x0a, 0x0b, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x4d, 0x65, - 0x74, 0x61, 0x18, 0x1b, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x6a, 0x6f, 0x62, 0x73, 0x2e, - 0x4a, 0x6f, 0x62, 0x2e, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x4d, 0x65, 0x74, 0x61, 0x45, - 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0b, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x4d, 0x65, 0x74, - 0x61, 0x12, 0x23, 0x0a, 0x05, 0x48, 0x6f, 0x6f, 0x6b, 0x73, 0x18, 0x1c, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x0d, 0x2e, 0x6a, 0x6f, 0x62, 0x73, 0x2e, 0x4a, 0x6f, 0x62, 0x48, 0x6f, 0x6f, 0x6b, 0x52, - 0x05, 0x48, 0x6f, 0x6f, 0x6b, 0x73, 0x1a, 0x3e, 0x0a, 0x10, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, - 0x6e, 0x4d, 0x65, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, + 0x20, 0x0a, 0x0b, 0x41, 0x75, 0x74, 0x6f, 0x52, 0x65, 0x73, 0x74, 0x61, 0x72, 0x74, 0x18, 0x1d, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x41, 0x75, 0x74, 0x6f, 0x52, 0x65, 0x73, 0x74, 0x61, 0x72, + 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x41, 0x75, 0x74, 0x6f, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x18, 0x0b, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x41, 0x75, 0x74, 0x6f, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x12, + 0x26, 0x0a, 0x07, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x0c, 0x2e, 0x6a, 0x6f, 0x62, 0x73, 0x2e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x07, + 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x2e, 0x0a, 0x0b, 0x4d, 0x65, 0x72, 0x67, 0x65, + 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x18, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x6a, + 0x6f, 0x62, 0x73, 0x2e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0b, 0x4d, 0x65, 0x72, 0x67, + 0x65, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x26, 0x0a, 0x0e, 0x4d, 0x61, 0x78, 0x43, 0x6f, + 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x63, 0x79, 0x18, 0x09, 0x20, 0x01, 0x28, 0x05, 0x52, + 0x0e, 0x4d, 0x61, 0x78, 0x43, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x63, 0x79, 0x12, + 0x2c, 0x0a, 0x11, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x53, 0x69, 0x6c, 0x65, 0x6e, 0x74, 0x55, 0x70, + 0x64, 0x61, 0x74, 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x08, 0x52, 0x11, 0x54, 0x61, 0x73, 0x6b, + 0x73, 0x53, 0x69, 0x6c, 0x65, 0x6e, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x20, 0x0a, + 0x05, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x0e, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0a, 0x2e, 0x6a, + 0x6f, 0x62, 0x73, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x05, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, + 0x3d, 0x0a, 0x0f, 0x4e, 0x6f, 0x64, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x46, 0x69, 0x6c, 0x74, + 0x65, 0x72, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6a, 0x6f, 0x62, 0x73, 0x2e, + 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x0f, 0x4e, + 0x6f, 0x64, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x3d, + 0x0a, 0x0f, 0x55, 0x73, 0x65, 0x72, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x46, 0x69, 0x6c, 0x74, 0x65, + 0x72, 0x18, 0x10, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6a, 0x6f, 0x62, 0x73, 0x2e, 0x55, + 0x73, 0x65, 0x72, 0x73, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x0f, 0x55, 0x73, + 0x65, 0x72, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x2f, 0x0a, + 0x09, 0x49, 0x64, 0x6d, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x18, 0x11, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x11, 0x2e, 0x6a, 0x6f, 0x62, 0x73, 0x2e, 0x49, 0x64, 0x6d, 0x53, 0x65, 0x6c, 0x65, 0x63, + 0x74, 0x6f, 0x72, 0x52, 0x09, 0x49, 0x64, 0x6d, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x45, + 0x0a, 0x11, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x46, 0x69, 0x6c, + 0x74, 0x65, 0x72, 0x18, 0x12, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x6a, 0x6f, 0x62, 0x73, + 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x46, 0x69, 0x6c, 0x74, + 0x65, 0x72, 0x52, 0x11, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x46, + 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x44, 0x0a, 0x10, 0x44, 0x61, 0x74, 0x61, 0x53, 0x6f, 0x75, + 0x72, 0x63, 0x65, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x18, 0x15, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x18, 0x2e, 0x6a, 0x6f, 0x62, 0x73, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x53, 0x6f, 0x75, 0x72, 0x63, + 0x65, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x10, 0x44, 0x61, 0x74, 0x61, 0x53, + 0x6f, 0x75, 0x72, 0x63, 0x65, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x32, 0x0a, 0x0a, 0x50, + 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x18, 0x13, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x12, 0x2e, 0x6a, 0x6f, 0x62, 0x73, 0x2e, 0x4a, 0x6f, 0x62, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, + 0x74, 0x65, 0x72, 0x52, 0x0a, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x12, + 0x4a, 0x0a, 0x15, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x44, 0x65, 0x70, 0x65, + 0x6e, 0x64, 0x65, 0x6e, 0x63, 0x69, 0x65, 0x73, 0x18, 0x16, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, + 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, + 0x2e, 0x41, 0x6e, 0x79, 0x52, 0x15, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x44, + 0x65, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x6e, 0x63, 0x69, 0x65, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x54, + 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x17, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x54, 0x69, + 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x12, 0x3c, 0x0a, 0x0b, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, + 0x4d, 0x65, 0x74, 0x61, 0x18, 0x1b, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x6a, 0x6f, 0x62, + 0x73, 0x2e, 0x4a, 0x6f, 0x62, 0x2e, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x4d, 0x65, 0x74, + 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0b, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x4d, + 0x65, 0x74, 0x61, 0x12, 0x23, 0x0a, 0x05, 0x48, 0x6f, 0x6f, 0x6b, 0x73, 0x18, 0x1c, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x6a, 0x6f, 0x62, 0x73, 0x2e, 0x4a, 0x6f, 0x62, 0x48, 0x6f, 0x6f, + 0x6b, 0x52, 0x05, 0x48, 0x6f, 0x6f, 0x6b, 0x73, 0x1a, 0x3e, 0x0a, 0x10, 0x56, 0x65, 0x72, 0x73, + 0x69, 0x6f, 0x6e, 0x4d, 0x65, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, + 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, + 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x98, 0x03, 0x0a, 0x07, 0x4a, 0x6f, 0x62, + 0x48, 0x6f, 0x6f, 0x6b, 0x12, 0x18, 0x0a, 0x07, 0x41, 0x70, 0x69, 0x53, 0x6c, 0x75, 0x67, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x41, 0x70, 0x69, 0x53, 0x6c, 0x75, 0x67, 0x12, 0x4f, + 0x0a, 0x10, 0x50, 0x72, 0x65, 0x73, 0x65, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, + 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x6a, 0x6f, 0x62, 0x73, 0x2e, + 0x4a, 0x6f, 0x62, 0x48, 0x6f, 0x6f, 0x6b, 0x2e, 0x50, 0x72, 0x65, 0x73, 0x65, 0x74, 0x50, 0x61, + 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x10, 0x50, + 0x72, 0x65, 0x73, 0x65, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x12, + 0x32, 0x0a, 0x14, 0x41, 0x6c, 0x6c, 0x6f, 0x77, 0x4f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, + 0x50, 0x72, 0x65, 0x73, 0x65, 0x74, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x14, 0x41, + 0x6c, 0x6c, 0x6f, 0x77, 0x4f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x50, 0x72, 0x65, 0x73, + 0x65, 0x74, 0x73, 0x12, 0x37, 0x0a, 0x08, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, + 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x6a, 0x6f, 0x62, 0x73, 0x2e, 0x4a, 0x6f, 0x62, + 0x48, 0x6f, 0x6f, 0x6b, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x52, 0x08, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x33, 0x0a, 0x08, + 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, + 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, + 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x08, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, + 0x73, 0x1a, 0x43, 0x0a, 0x15, 0x50, 0x72, 0x65, 0x73, 0x65, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, + 0x65, 0x74, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x98, 0x03, 0x0a, 0x07, 0x4a, 0x6f, 0x62, 0x48, 0x6f, - 0x6f, 0x6b, 0x12, 0x18, 0x0a, 0x07, 0x41, 0x70, 0x69, 0x53, 0x6c, 0x75, 0x67, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x07, 0x41, 0x70, 0x69, 0x53, 0x6c, 0x75, 0x67, 0x12, 0x4f, 0x0a, 0x10, - 0x50, 0x72, 0x65, 0x73, 0x65, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, - 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x6a, 0x6f, 0x62, 0x73, 0x2e, 0x4a, 0x6f, - 0x62, 0x48, 0x6f, 0x6f, 0x6b, 0x2e, 0x50, 0x72, 0x65, 0x73, 0x65, 0x74, 0x50, 0x61, 0x72, 0x61, - 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x10, 0x50, 0x72, 0x65, - 0x73, 0x65, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x12, 0x32, 0x0a, - 0x14, 0x41, 0x6c, 0x6c, 0x6f, 0x77, 0x4f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x50, 0x72, - 0x65, 0x73, 0x65, 0x74, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x14, 0x41, 0x6c, 0x6c, - 0x6f, 0x77, 0x4f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x50, 0x72, 0x65, 0x73, 0x65, 0x74, - 0x73, 0x12, 0x37, 0x0a, 0x08, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x04, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x6a, 0x6f, 0x62, 0x73, 0x2e, 0x4a, 0x6f, 0x62, 0x48, 0x6f, - 0x6f, 0x6b, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, - 0x52, 0x08, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x33, 0x0a, 0x08, 0x50, 0x6f, - 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x73, - 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x50, - 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x08, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x1a, - 0x43, 0x0a, 0x15, 0x50, 0x72, 0x65, 0x73, 0x65, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, - 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x3b, 0x0a, 0x0d, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, - 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, - 0x01, 0x22, 0xae, 0x01, 0x0a, 0x0c, 0x4a, 0x6f, 0x62, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, - 0x65, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, - 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x44, 0x65, 0x73, - 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x56, 0x61, 0x6c, 0x75, - 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x1c, - 0x0a, 0x09, 0x4d, 0x61, 0x6e, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x09, 0x4d, 0x61, 0x6e, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x12, 0x0a, 0x04, - 0x54, 0x79, 0x70, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x54, 0x79, 0x70, 0x65, - 0x12, 0x20, 0x0a, 0x0b, 0x4a, 0x73, 0x6f, 0x6e, 0x43, 0x68, 0x6f, 0x69, 0x63, 0x65, 0x73, 0x18, - 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x4a, 0x73, 0x6f, 0x6e, 0x43, 0x68, 0x6f, 0x69, 0x63, - 0x65, 0x73, 0x22, 0x5b, 0x0a, 0x0e, 0x4a, 0x6f, 0x62, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x45, - 0x76, 0x65, 0x6e, 0x74, 0x12, 0x29, 0x0a, 0x0a, 0x4a, 0x6f, 0x62, 0x55, 0x70, 0x64, 0x61, 0x74, - 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x09, 0x2e, 0x6a, 0x6f, 0x62, 0x73, 0x2e, - 0x4a, 0x6f, 0x62, 0x52, 0x0a, 0x4a, 0x6f, 0x62, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x12, - 0x1e, 0x0a, 0x0a, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x64, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0a, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x64, 0x22, - 0x5c, 0x0a, 0x0f, 0x54, 0x61, 0x73, 0x6b, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x45, 0x76, 0x65, - 0x6e, 0x74, 0x12, 0x2c, 0x0a, 0x0b, 0x54, 0x61, 0x73, 0x6b, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, - 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0a, 0x2e, 0x6a, 0x6f, 0x62, 0x73, 0x2e, 0x54, - 0x61, 0x73, 0x6b, 0x52, 0x0b, 0x54, 0x61, 0x73, 0x6b, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, - 0x12, 0x1b, 0x0a, 0x03, 0x4a, 0x6f, 0x62, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x09, 0x2e, - 0x6a, 0x6f, 0x62, 0x73, 0x2e, 0x4a, 0x6f, 0x62, 0x52, 0x03, 0x4a, 0x6f, 0x62, 0x22, 0x2c, 0x0a, - 0x0d, 0x50, 0x75, 0x74, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, - 0x0a, 0x03, 0x4a, 0x6f, 0x62, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x09, 0x2e, 0x6a, 0x6f, - 0x62, 0x73, 0x2e, 0x4a, 0x6f, 0x62, 0x52, 0x03, 0x4a, 0x6f, 0x62, 0x22, 0x2d, 0x0a, 0x0e, 0x50, - 0x75, 0x74, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1b, 0x0a, - 0x03, 0x4a, 0x6f, 0x62, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x09, 0x2e, 0x6a, 0x6f, 0x62, - 0x73, 0x2e, 0x4a, 0x6f, 0x62, 0x52, 0x03, 0x4a, 0x6f, 0x62, 0x22, 0x55, 0x0a, 0x0d, 0x47, 0x65, - 0x74, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x4a, - 0x6f, 0x62, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x4a, 0x6f, 0x62, 0x49, - 0x44, 0x12, 0x2e, 0x0a, 0x09, 0x4c, 0x6f, 0x61, 0x64, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x0e, 0x32, 0x10, 0x2e, 0x6a, 0x6f, 0x62, 0x73, 0x2e, 0x54, 0x61, 0x73, 0x6b, - 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x09, 0x4c, 0x6f, 0x61, 0x64, 0x54, 0x61, 0x73, 0x6b, - 0x73, 0x22, 0x2d, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x1b, 0x0a, 0x03, 0x4a, 0x6f, 0x62, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x09, 0x2e, 0x6a, 0x6f, 0x62, 0x73, 0x2e, 0x4a, 0x6f, 0x62, 0x52, 0x03, 0x4a, 0x6f, 0x62, - 0x22, 0x4e, 0x0a, 0x10, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x4a, 0x6f, 0x62, 0x49, 0x44, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x05, 0x4a, 0x6f, 0x62, 0x49, 0x44, 0x12, 0x24, 0x0a, 0x0d, 0x43, 0x6c, - 0x65, 0x61, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x4a, 0x6f, 0x62, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x0d, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x4a, 0x6f, 0x62, 0x73, - 0x22, 0x4f, 0x0a, 0x11, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x12, - 0x20, 0x0a, 0x0b, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x05, 0x52, 0x0b, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, 0x6f, 0x75, 0x6e, - 0x74, 0x22, 0xf1, 0x01, 0x0a, 0x0f, 0x4c, 0x69, 0x73, 0x74, 0x4a, 0x6f, 0x62, 0x73, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x12, 0x1e, 0x0a, 0x0a, 0x45, - 0x76, 0x65, 0x6e, 0x74, 0x73, 0x4f, 0x6e, 0x6c, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x0a, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x4f, 0x6e, 0x6c, 0x79, 0x12, 0x1e, 0x0a, 0x0a, 0x54, - 0x69, 0x6d, 0x65, 0x72, 0x73, 0x4f, 0x6e, 0x6c, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x0a, 0x54, 0x69, 0x6d, 0x65, 0x72, 0x73, 0x4f, 0x6e, 0x6c, 0x79, 0x12, 0x2e, 0x0a, 0x09, 0x4c, - 0x6f, 0x61, 0x64, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x10, - 0x2e, 0x6a, 0x6f, 0x62, 0x73, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x52, 0x09, 0x4c, 0x6f, 0x61, 0x64, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x4a, - 0x6f, 0x62, 0x49, 0x44, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x4a, 0x6f, 0x62, - 0x49, 0x44, 0x73, 0x12, 0x20, 0x0a, 0x0b, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x4f, 0x66, 0x66, 0x73, - 0x65, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0b, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x4f, - 0x66, 0x66, 0x73, 0x65, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x4c, 0x69, - 0x6d, 0x69, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x54, 0x61, 0x73, 0x6b, 0x73, - 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x22, 0x2f, 0x0a, 0x10, 0x4c, 0x69, 0x73, 0x74, 0x4a, 0x6f, 0x62, - 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1b, 0x0a, 0x03, 0x4a, 0x6f, 0x62, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x09, 0x2e, 0x6a, 0x6f, 0x62, 0x73, 0x2e, 0x4a, 0x6f, - 0x62, 0x52, 0x03, 0x4a, 0x6f, 0x62, 0x22, 0x52, 0x0a, 0x10, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x61, - 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x4a, 0x6f, - 0x62, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x4a, 0x6f, 0x62, 0x49, 0x44, - 0x12, 0x28, 0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, + 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x3b, 0x0a, 0x0d, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, + 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, + 0x02, 0x38, 0x01, 0x22, 0xae, 0x01, 0x0a, 0x0c, 0x4a, 0x6f, 0x62, 0x50, 0x61, 0x72, 0x61, 0x6d, + 0x65, 0x74, 0x65, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x44, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x44, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x56, 0x61, + 0x6c, 0x75, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x56, 0x61, 0x6c, 0x75, 0x65, + 0x12, 0x1c, 0x0a, 0x09, 0x4d, 0x61, 0x6e, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x79, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x09, 0x4d, 0x61, 0x6e, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x12, + 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x54, 0x79, + 0x70, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x4a, 0x73, 0x6f, 0x6e, 0x43, 0x68, 0x6f, 0x69, 0x63, 0x65, + 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x4a, 0x73, 0x6f, 0x6e, 0x43, 0x68, 0x6f, + 0x69, 0x63, 0x65, 0x73, 0x22, 0x5b, 0x0a, 0x0e, 0x4a, 0x6f, 0x62, 0x43, 0x68, 0x61, 0x6e, 0x67, + 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x29, 0x0a, 0x0a, 0x4a, 0x6f, 0x62, 0x55, 0x70, 0x64, + 0x61, 0x74, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x09, 0x2e, 0x6a, 0x6f, 0x62, + 0x73, 0x2e, 0x4a, 0x6f, 0x62, 0x52, 0x0a, 0x4a, 0x6f, 0x62, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, + 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x64, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, + 0x64, 0x22, 0x5c, 0x0a, 0x0f, 0x54, 0x61, 0x73, 0x6b, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x45, + 0x76, 0x65, 0x6e, 0x74, 0x12, 0x2c, 0x0a, 0x0b, 0x54, 0x61, 0x73, 0x6b, 0x55, 0x70, 0x64, 0x61, + 0x74, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0a, 0x2e, 0x6a, 0x6f, 0x62, 0x73, + 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x0b, 0x54, 0x61, 0x73, 0x6b, 0x55, 0x70, 0x64, 0x61, 0x74, + 0x65, 0x64, 0x12, 0x1b, 0x0a, 0x03, 0x4a, 0x6f, 0x62, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x09, 0x2e, 0x6a, 0x6f, 0x62, 0x73, 0x2e, 0x4a, 0x6f, 0x62, 0x52, 0x03, 0x4a, 0x6f, 0x62, 0x22, + 0x2c, 0x0a, 0x0d, 0x50, 0x75, 0x74, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x1b, 0x0a, 0x03, 0x4a, 0x6f, 0x62, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x09, 0x2e, + 0x6a, 0x6f, 0x62, 0x73, 0x2e, 0x4a, 0x6f, 0x62, 0x52, 0x03, 0x4a, 0x6f, 0x62, 0x22, 0x2d, 0x0a, + 0x0e, 0x50, 0x75, 0x74, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x1b, 0x0a, 0x03, 0x4a, 0x6f, 0x62, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x09, 0x2e, 0x6a, + 0x6f, 0x62, 0x73, 0x2e, 0x4a, 0x6f, 0x62, 0x52, 0x03, 0x4a, 0x6f, 0x62, 0x22, 0x55, 0x0a, 0x0d, + 0x47, 0x65, 0x74, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, + 0x05, 0x4a, 0x6f, 0x62, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x4a, 0x6f, + 0x62, 0x49, 0x44, 0x12, 0x2e, 0x0a, 0x09, 0x4c, 0x6f, 0x61, 0x64, 0x54, 0x61, 0x73, 0x6b, 0x73, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x10, 0x2e, 0x6a, 0x6f, 0x62, 0x73, 0x2e, 0x54, 0x61, + 0x73, 0x6b, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x09, 0x4c, 0x6f, 0x61, 0x64, 0x54, 0x61, + 0x73, 0x6b, 0x73, 0x22, 0x2d, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1b, 0x0a, 0x03, 0x4a, 0x6f, 0x62, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x09, 0x2e, 0x6a, 0x6f, 0x62, 0x73, 0x2e, 0x4a, 0x6f, 0x62, 0x52, 0x03, 0x4a, + 0x6f, 0x62, 0x22, 0x4e, 0x0a, 0x10, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4a, 0x6f, 0x62, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x4a, 0x6f, 0x62, 0x49, 0x44, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x4a, 0x6f, 0x62, 0x49, 0x44, 0x12, 0x24, 0x0a, 0x0d, + 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x4a, 0x6f, 0x62, 0x73, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x0d, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x4a, 0x6f, + 0x62, 0x73, 0x22, 0x4f, 0x0a, 0x11, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4a, 0x6f, 0x62, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x53, 0x75, 0x63, 0x63, 0x65, + 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, + 0x73, 0x12, 0x20, 0x0a, 0x0b, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0b, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, 0x6f, + 0x75, 0x6e, 0x74, 0x22, 0xf1, 0x01, 0x0a, 0x0f, 0x4c, 0x69, 0x73, 0x74, 0x4a, 0x6f, 0x62, 0x73, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x4f, 0x77, 0x6e, 0x65, 0x72, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x12, 0x1e, 0x0a, + 0x0a, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x4f, 0x6e, 0x6c, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x0a, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x4f, 0x6e, 0x6c, 0x79, 0x12, 0x1e, 0x0a, + 0x0a, 0x54, 0x69, 0x6d, 0x65, 0x72, 0x73, 0x4f, 0x6e, 0x6c, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x0a, 0x54, 0x69, 0x6d, 0x65, 0x72, 0x73, 0x4f, 0x6e, 0x6c, 0x79, 0x12, 0x2e, 0x0a, + 0x09, 0x4c, 0x6f, 0x61, 0x64, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x10, 0x2e, 0x6a, 0x6f, 0x62, 0x73, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x53, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x52, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x33, 0x0a, 0x11, 0x4c, 0x69, - 0x73, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x1e, 0x0a, 0x04, 0x54, 0x61, 0x73, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0a, 0x2e, - 0x6a, 0x6f, 0x62, 0x73, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x04, 0x54, 0x61, 0x73, 0x6b, 0x22, - 0x30, 0x0a, 0x0e, 0x50, 0x75, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x1e, 0x0a, 0x04, 0x54, 0x61, 0x73, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x75, 0x73, 0x52, 0x09, 0x4c, 0x6f, 0x61, 0x64, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x16, 0x0a, + 0x06, 0x4a, 0x6f, 0x62, 0x49, 0x44, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x4a, + 0x6f, 0x62, 0x49, 0x44, 0x73, 0x12, 0x20, 0x0a, 0x0b, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x4f, 0x66, + 0x66, 0x73, 0x65, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0b, 0x54, 0x61, 0x73, 0x6b, + 0x73, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x54, 0x61, 0x73, 0x6b, 0x73, + 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x54, 0x61, 0x73, + 0x6b, 0x73, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x22, 0x2f, 0x0a, 0x10, 0x4c, 0x69, 0x73, 0x74, 0x4a, + 0x6f, 0x62, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1b, 0x0a, 0x03, 0x4a, + 0x6f, 0x62, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x09, 0x2e, 0x6a, 0x6f, 0x62, 0x73, 0x2e, + 0x4a, 0x6f, 0x62, 0x52, 0x03, 0x4a, 0x6f, 0x62, 0x22, 0x52, 0x0a, 0x10, 0x4c, 0x69, 0x73, 0x74, + 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, + 0x4a, 0x6f, 0x62, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x4a, 0x6f, 0x62, + 0x49, 0x44, 0x12, 0x28, 0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0e, 0x32, 0x10, 0x2e, 0x6a, 0x6f, 0x62, 0x73, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x53, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x33, 0x0a, 0x11, + 0x4c, 0x69, 0x73, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x1e, 0x0a, 0x04, 0x54, 0x61, 0x73, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0a, 0x2e, 0x6a, 0x6f, 0x62, 0x73, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x04, 0x54, 0x61, 0x73, - 0x6b, 0x22, 0x31, 0x0a, 0x0f, 0x50, 0x75, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1e, 0x0a, 0x04, 0x54, 0x61, 0x73, 0x6b, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x0a, 0x2e, 0x6a, 0x6f, 0x62, 0x73, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x04, - 0x54, 0x61, 0x73, 0x6b, 0x22, 0x8c, 0x01, 0x0a, 0x12, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x54, - 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x4a, - 0x6f, 0x62, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x4a, 0x6f, 0x62, 0x49, - 0x64, 0x12, 0x16, 0x0a, 0x06, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x44, 0x18, 0x02, 0x20, 0x03, 0x28, - 0x09, 0x52, 0x06, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x44, 0x12, 0x28, 0x0a, 0x06, 0x53, 0x74, 0x61, - 0x74, 0x75, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x10, 0x2e, 0x6a, 0x6f, 0x62, 0x73, - 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x53, 0x74, 0x61, - 0x74, 0x75, 0x73, 0x12, 0x1e, 0x0a, 0x0a, 0x50, 0x72, 0x75, 0x6e, 0x65, 0x4c, 0x69, 0x6d, 0x69, - 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x50, 0x72, 0x75, 0x6e, 0x65, 0x4c, 0x69, - 0x6d, 0x69, 0x74, 0x22, 0x2f, 0x0a, 0x13, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x54, 0x61, 0x73, - 0x6b, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x44, 0x65, - 0x6c, 0x65, 0x74, 0x65, 0x64, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x44, 0x65, 0x6c, - 0x65, 0x74, 0x65, 0x64, 0x22, 0x2f, 0x0a, 0x17, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x53, 0x74, - 0x75, 0x63, 0x6b, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x14, 0x0a, 0x05, 0x53, 0x69, 0x6e, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, - 0x53, 0x69, 0x6e, 0x63, 0x65, 0x22, 0x3e, 0x0a, 0x18, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x53, - 0x74, 0x75, 0x63, 0x6b, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x46, 0x69, 0x78, 0x65, 0x64, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x64, - 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0c, 0x46, 0x69, 0x78, 0x65, 0x64, 0x54, 0x61, - 0x73, 0x6b, 0x49, 0x64, 0x73, 0x22, 0xff, 0x02, 0x0a, 0x04, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x0e, - 0x0a, 0x02, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x49, 0x44, 0x12, 0x14, - 0x0a, 0x05, 0x4a, 0x6f, 0x62, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x4a, - 0x6f, 0x62, 0x49, 0x44, 0x12, 0x28, 0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x0e, 0x32, 0x10, 0x2e, 0x6a, 0x6f, 0x62, 0x73, 0x2e, 0x54, 0x61, 0x73, 0x6b, - 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x24, - 0x0a, 0x0d, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x4d, 0x65, 0x73, - 0x73, 0x61, 0x67, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x4f, - 0x77, 0x6e, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x54, 0x72, 0x69, 0x67, - 0x67, 0x65, 0x72, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x12, 0x1c, 0x0a, 0x09, 0x53, 0x74, 0x61, 0x72, - 0x74, 0x54, 0x69, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x53, 0x74, 0x61, - 0x72, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x45, 0x6e, 0x64, 0x54, 0x69, 0x6d, - 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x05, 0x52, 0x07, 0x45, 0x6e, 0x64, 0x54, 0x69, 0x6d, 0x65, - 0x12, 0x18, 0x0a, 0x07, 0x43, 0x61, 0x6e, 0x53, 0x74, 0x6f, 0x70, 0x18, 0x08, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x07, 0x43, 0x61, 0x6e, 0x53, 0x74, 0x6f, 0x70, 0x12, 0x1a, 0x0a, 0x08, 0x43, 0x61, - 0x6e, 0x50, 0x61, 0x75, 0x73, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x43, 0x61, - 0x6e, 0x50, 0x61, 0x75, 0x73, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x48, 0x61, 0x73, 0x50, 0x72, 0x6f, - 0x67, 0x72, 0x65, 0x73, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x48, 0x61, 0x73, - 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x50, 0x72, 0x6f, 0x67, - 0x72, 0x65, 0x73, 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x02, 0x52, 0x08, 0x50, 0x72, 0x6f, 0x67, - 0x72, 0x65, 0x73, 0x73, 0x12, 0x31, 0x0a, 0x0b, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x4c, - 0x6f, 0x67, 0x73, 0x18, 0x0c, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x6a, 0x6f, 0x62, 0x73, - 0x2e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x6f, 0x67, 0x52, 0x0b, 0x41, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x4c, 0x6f, 0x67, 0x73, 0x22, 0x84, 0x02, 0x0a, 0x0b, 0x43, 0x74, 0x72, 0x6c, - 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x1f, 0x0a, 0x03, 0x43, 0x6d, 0x64, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0e, 0x32, 0x0d, 0x2e, 0x6a, 0x6f, 0x62, 0x73, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, - 0x61, 0x6e, 0x64, 0x52, 0x03, 0x43, 0x6d, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x4a, 0x6f, 0x62, 0x49, - 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x4a, 0x6f, 0x62, 0x49, 0x64, 0x12, 0x16, - 0x0a, 0x06, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, - 0x54, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x49, - 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x49, 0x64, - 0x12, 0x4a, 0x0a, 0x0d, 0x52, 0x75, 0x6e, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, - 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x6a, 0x6f, 0x62, 0x73, 0x2e, 0x43, - 0x74, 0x72, 0x6c, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x2e, 0x52, 0x75, 0x6e, 0x50, 0x61, - 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0d, 0x52, - 0x75, 0x6e, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x1a, 0x40, 0x0a, 0x12, - 0x52, 0x75, 0x6e, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x27, - 0x0a, 0x13, 0x43, 0x74, 0x72, 0x6c, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x4d, 0x73, 0x67, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x03, 0x4d, 0x73, 0x67, 0x22, 0xa5, 0x01, 0x0a, 0x09, 0x41, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x4c, 0x6f, 0x67, 0x12, 0x24, 0x0a, 0x06, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x6a, 0x6f, 0x62, 0x73, 0x2e, 0x41, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x52, 0x06, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x37, 0x0a, 0x0c, 0x49, - 0x6e, 0x70, 0x75, 0x74, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x6b, 0x22, 0x30, 0x0a, 0x0e, 0x50, 0x75, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x1e, 0x0a, 0x04, 0x54, 0x61, 0x73, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x0a, 0x2e, 0x6a, 0x6f, 0x62, 0x73, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x04, 0x54, + 0x61, 0x73, 0x6b, 0x22, 0x31, 0x0a, 0x0f, 0x50, 0x75, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1e, 0x0a, 0x04, 0x54, 0x61, 0x73, 0x6b, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0a, 0x2e, 0x6a, 0x6f, 0x62, 0x73, 0x2e, 0x54, 0x61, 0x73, 0x6b, + 0x52, 0x04, 0x54, 0x61, 0x73, 0x6b, 0x22, 0x8c, 0x01, 0x0a, 0x12, 0x44, 0x65, 0x6c, 0x65, 0x74, + 0x65, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, + 0x05, 0x4a, 0x6f, 0x62, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x4a, 0x6f, + 0x62, 0x49, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x44, 0x18, 0x02, 0x20, + 0x03, 0x28, 0x09, 0x52, 0x06, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x44, 0x12, 0x28, 0x0a, 0x06, 0x53, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x10, 0x2e, 0x6a, 0x6f, + 0x62, 0x73, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x53, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1e, 0x0a, 0x0a, 0x50, 0x72, 0x75, 0x6e, 0x65, 0x4c, 0x69, + 0x6d, 0x69, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x50, 0x72, 0x75, 0x6e, 0x65, + 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x22, 0x2f, 0x0a, 0x13, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x54, + 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, + 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x44, + 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x22, 0x2f, 0x0a, 0x17, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, + 0x53, 0x74, 0x75, 0x63, 0x6b, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x14, 0x0a, 0x05, 0x53, 0x69, 0x6e, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, + 0x52, 0x05, 0x53, 0x69, 0x6e, 0x63, 0x65, 0x22, 0x3e, 0x0a, 0x18, 0x44, 0x65, 0x74, 0x65, 0x63, + 0x74, 0x53, 0x74, 0x75, 0x63, 0x6b, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x46, 0x69, 0x78, 0x65, 0x64, 0x54, 0x61, 0x73, 0x6b, + 0x49, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0c, 0x46, 0x69, 0x78, 0x65, 0x64, + 0x54, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x73, 0x22, 0xff, 0x02, 0x0a, 0x04, 0x54, 0x61, 0x73, 0x6b, + 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x49, 0x44, + 0x12, 0x14, 0x0a, 0x05, 0x4a, 0x6f, 0x62, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x05, 0x4a, 0x6f, 0x62, 0x49, 0x44, 0x12, 0x28, 0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x10, 0x2e, 0x6a, 0x6f, 0x62, 0x73, 0x2e, 0x54, 0x61, + 0x73, 0x6b, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x12, 0x24, 0x0a, 0x0d, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, + 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x4d, + 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, + 0x72, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x54, 0x72, + 0x69, 0x67, 0x67, 0x65, 0x72, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x12, 0x1c, 0x0a, 0x09, 0x53, 0x74, + 0x61, 0x72, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x53, + 0x74, 0x61, 0x72, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x45, 0x6e, 0x64, 0x54, + 0x69, 0x6d, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x05, 0x52, 0x07, 0x45, 0x6e, 0x64, 0x54, 0x69, + 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x43, 0x61, 0x6e, 0x53, 0x74, 0x6f, 0x70, 0x18, 0x08, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x07, 0x43, 0x61, 0x6e, 0x53, 0x74, 0x6f, 0x70, 0x12, 0x1a, 0x0a, 0x08, + 0x43, 0x61, 0x6e, 0x50, 0x61, 0x75, 0x73, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, + 0x43, 0x61, 0x6e, 0x50, 0x61, 0x75, 0x73, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x48, 0x61, 0x73, 0x50, + 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x48, + 0x61, 0x73, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x50, 0x72, + 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x02, 0x52, 0x08, 0x50, 0x72, + 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x12, 0x31, 0x0a, 0x0b, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x4c, 0x6f, 0x67, 0x73, 0x18, 0x0c, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x6a, 0x6f, + 0x62, 0x73, 0x2e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x6f, 0x67, 0x52, 0x0b, 0x41, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x4c, 0x6f, 0x67, 0x73, 0x22, 0x84, 0x02, 0x0a, 0x0b, 0x43, 0x74, + 0x72, 0x6c, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x1f, 0x0a, 0x03, 0x43, 0x6d, 0x64, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x0d, 0x2e, 0x6a, 0x6f, 0x62, 0x73, 0x2e, 0x43, 0x6f, + 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x03, 0x43, 0x6d, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x4a, 0x6f, + 0x62, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x4a, 0x6f, 0x62, 0x49, 0x64, + 0x12, 0x16, 0x0a, 0x06, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x06, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x4f, 0x77, 0x6e, 0x65, + 0x72, 0x49, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x4f, 0x77, 0x6e, 0x65, 0x72, + 0x49, 0x64, 0x12, 0x4a, 0x0a, 0x0d, 0x52, 0x75, 0x6e, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, + 0x65, 0x72, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x6a, 0x6f, 0x62, 0x73, + 0x2e, 0x43, 0x74, 0x72, 0x6c, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x2e, 0x52, 0x75, 0x6e, + 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, + 0x0d, 0x52, 0x75, 0x6e, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x1a, 0x40, + 0x0a, 0x12, 0x52, 0x75, 0x6e, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, + 0x22, 0x27, 0x0a, 0x13, 0x43, 0x74, 0x72, 0x6c, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x4d, 0x73, 0x67, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x4d, 0x73, 0x67, 0x22, 0xa5, 0x01, 0x0a, 0x09, 0x41, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x6f, 0x67, 0x12, 0x24, 0x0a, 0x06, 0x41, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x6a, 0x6f, 0x62, 0x73, 0x2e, 0x41, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x06, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x37, 0x0a, + 0x0c, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6a, 0x6f, 0x62, 0x73, 0x2e, 0x41, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x0c, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x4d, + 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x39, 0x0a, 0x0d, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, + 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, + 0x6a, 0x6f, 0x62, 0x73, 0x2e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x65, 0x73, 0x73, 0x61, + 0x67, 0x65, 0x52, 0x0d, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, + 0x65, 0x22, 0xf4, 0x02, 0x0a, 0x0f, 0x4a, 0x6f, 0x62, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, + 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x4a, 0x6f, 0x62, 0x49, 0x44, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x4a, 0x6f, 0x62, 0x49, 0x44, 0x12, 0x2a, 0x0a, 0x08, 0x53, + 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, + 0x6a, 0x6f, 0x62, 0x73, 0x2e, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x52, 0x08, 0x53, + 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x52, 0x75, 0x6e, 0x4e, 0x6f, + 0x77, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x52, 0x75, 0x6e, 0x4e, 0x6f, 0x77, 0x12, + 0x1c, 0x0a, 0x09, 0x52, 0x75, 0x6e, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x09, 0x52, 0x75, 0x6e, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x12, 0x4e, 0x0a, + 0x0d, 0x52, 0x75, 0x6e, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x18, 0x05, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x6a, 0x6f, 0x62, 0x73, 0x2e, 0x4a, 0x6f, 0x62, 0x54, + 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x52, 0x75, 0x6e, 0x50, + 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0d, + 0x52, 0x75, 0x6e, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x12, 0x1a, 0x0a, + 0x08, 0x48, 0x6f, 0x6f, 0x6b, 0x53, 0x6c, 0x75, 0x67, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x08, 0x48, 0x6f, 0x6f, 0x6b, 0x53, 0x6c, 0x75, 0x67, 0x12, 0x3b, 0x0a, 0x0e, 0x54, 0x72, 0x69, + 0x67, 0x67, 0x65, 0x72, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6a, 0x6f, 0x62, 0x73, 0x2e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4d, - 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x0c, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x4d, 0x65, 0x73, - 0x73, 0x61, 0x67, 0x65, 0x12, 0x39, 0x0a, 0x0d, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x4d, 0x65, - 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6a, 0x6f, - 0x62, 0x73, 0x2e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, - 0x52, 0x0d, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, - 0xf4, 0x02, 0x0a, 0x0f, 0x4a, 0x6f, 0x62, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x45, 0x76, - 0x65, 0x6e, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x4a, 0x6f, 0x62, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x05, 0x4a, 0x6f, 0x62, 0x49, 0x44, 0x12, 0x2a, 0x0a, 0x08, 0x53, 0x63, 0x68, - 0x65, 0x64, 0x75, 0x6c, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x6a, 0x6f, - 0x62, 0x73, 0x2e, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x52, 0x08, 0x53, 0x63, 0x68, - 0x65, 0x64, 0x75, 0x6c, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x52, 0x75, 0x6e, 0x4e, 0x6f, 0x77, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x52, 0x75, 0x6e, 0x4e, 0x6f, 0x77, 0x12, 0x1c, 0x0a, - 0x09, 0x52, 0x75, 0x6e, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x09, 0x52, 0x75, 0x6e, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x12, 0x4e, 0x0a, 0x0d, 0x52, - 0x75, 0x6e, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x18, 0x05, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x6a, 0x6f, 0x62, 0x73, 0x2e, 0x4a, 0x6f, 0x62, 0x54, 0x72, 0x69, - 0x67, 0x67, 0x65, 0x72, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x52, 0x75, 0x6e, 0x50, 0x61, 0x72, - 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0d, 0x52, 0x75, - 0x6e, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x48, - 0x6f, 0x6f, 0x6b, 0x53, 0x6c, 0x75, 0x67, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x48, - 0x6f, 0x6f, 0x6b, 0x53, 0x6c, 0x75, 0x67, 0x12, 0x3b, 0x0a, 0x0e, 0x54, 0x72, 0x69, 0x67, 0x67, - 0x65, 0x72, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x13, 0x2e, 0x6a, 0x6f, 0x62, 0x73, 0x2e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x65, 0x73, - 0x73, 0x61, 0x67, 0x65, 0x52, 0x0e, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x4d, 0x65, 0x73, - 0x73, 0x61, 0x67, 0x65, 0x1a, 0x40, 0x0a, 0x12, 0x52, 0x75, 0x6e, 0x50, 0x61, 0x72, 0x61, 0x6d, - 0x65, 0x74, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, - 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xb9, 0x02, 0x0a, 0x0c, 0x41, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x53, 0x75, 0x63, 0x63, 0x65, - 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, - 0x73, 0x12, 0x18, 0x0a, 0x07, 0x52, 0x61, 0x77, 0x42, 0x6f, 0x64, 0x79, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x0c, 0x52, 0x07, 0x52, 0x61, 0x77, 0x42, 0x6f, 0x64, 0x79, 0x12, 0x1e, 0x0a, 0x0a, 0x53, - 0x74, 0x72, 0x69, 0x6e, 0x67, 0x42, 0x6f, 0x64, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0a, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x42, 0x6f, 0x64, 0x79, 0x12, 0x1a, 0x0a, 0x08, 0x4a, - 0x73, 0x6f, 0x6e, 0x42, 0x6f, 0x64, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x08, 0x4a, - 0x73, 0x6f, 0x6e, 0x42, 0x6f, 0x64, 0x79, 0x12, 0x20, 0x0a, 0x0b, 0x45, 0x72, 0x72, 0x6f, 0x72, - 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x45, 0x72, - 0x72, 0x6f, 0x72, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x12, 0x18, 0x0a, 0x07, 0x49, 0x67, 0x6e, - 0x6f, 0x72, 0x65, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x49, 0x67, 0x6e, 0x6f, - 0x72, 0x65, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x54, 0x69, 0x6d, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, - 0x05, 0x52, 0x04, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x30, 0x0a, 0x04, 0x56, 0x61, 0x72, 0x73, 0x18, - 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x6a, 0x6f, 0x62, 0x73, 0x2e, 0x41, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x2e, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x52, 0x04, 0x56, 0x61, 0x72, 0x73, 0x1a, 0x37, 0x0a, 0x09, 0x56, 0x61, 0x72, - 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, - 0x38, 0x01, 0x22, 0xc9, 0x04, 0x0a, 0x17, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4f, 0x75, 0x74, - 0x70, 0x75, 0x74, 0x53, 0x69, 0x6e, 0x67, 0x6c, 0x65, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0x1c, - 0x0a, 0x09, 0x49, 0x73, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x09, 0x49, 0x73, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x12, 0x2a, 0x0a, 0x10, - 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x42, 0x6f, 0x64, 0x79, 0x52, 0x65, 0x67, 0x65, 0x78, 0x70, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x42, 0x6f, - 0x64, 0x79, 0x52, 0x65, 0x67, 0x65, 0x78, 0x70, 0x12, 0x3c, 0x0a, 0x19, 0x53, 0x74, 0x72, 0x69, - 0x6e, 0x67, 0x42, 0x6f, 0x64, 0x79, 0x53, 0x69, 0x7a, 0x65, 0x47, 0x72, 0x65, 0x61, 0x74, 0x65, - 0x72, 0x54, 0x68, 0x61, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x19, 0x53, 0x74, 0x72, - 0x69, 0x6e, 0x67, 0x42, 0x6f, 0x64, 0x79, 0x53, 0x69, 0x7a, 0x65, 0x47, 0x72, 0x65, 0x61, 0x74, - 0x65, 0x72, 0x54, 0x68, 0x61, 0x6e, 0x12, 0x3c, 0x0a, 0x19, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, - 0x42, 0x6f, 0x64, 0x79, 0x53, 0x69, 0x7a, 0x65, 0x53, 0x6d, 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x54, - 0x68, 0x61, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x19, 0x53, 0x74, 0x72, 0x69, 0x6e, - 0x67, 0x42, 0x6f, 0x64, 0x79, 0x53, 0x69, 0x7a, 0x65, 0x53, 0x6d, 0x61, 0x6c, 0x6c, 0x65, 0x72, - 0x54, 0x68, 0x61, 0x6e, 0x12, 0x26, 0x0a, 0x0e, 0x4a, 0x73, 0x6f, 0x6e, 0x42, 0x6f, 0x64, 0x79, - 0x52, 0x65, 0x67, 0x65, 0x78, 0x70, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x4a, 0x73, - 0x6f, 0x6e, 0x42, 0x6f, 0x64, 0x79, 0x52, 0x65, 0x67, 0x65, 0x78, 0x70, 0x12, 0x26, 0x0a, 0x0e, - 0x4a, 0x73, 0x6f, 0x6e, 0x42, 0x6f, 0x64, 0x79, 0x48, 0x61, 0x73, 0x4b, 0x65, 0x79, 0x18, 0x06, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x4a, 0x73, 0x6f, 0x6e, 0x42, 0x6f, 0x64, 0x79, 0x48, 0x61, - 0x73, 0x4b, 0x65, 0x79, 0x12, 0x38, 0x0a, 0x17, 0x4a, 0x73, 0x6f, 0x6e, 0x42, 0x6f, 0x64, 0x79, - 0x53, 0x69, 0x7a, 0x65, 0x47, 0x72, 0x65, 0x61, 0x74, 0x65, 0x72, 0x54, 0x68, 0x61, 0x6e, 0x18, - 0x07, 0x20, 0x01, 0x28, 0x05, 0x52, 0x17, 0x4a, 0x73, 0x6f, 0x6e, 0x42, 0x6f, 0x64, 0x79, 0x53, - 0x69, 0x7a, 0x65, 0x47, 0x72, 0x65, 0x61, 0x74, 0x65, 0x72, 0x54, 0x68, 0x61, 0x6e, 0x12, 0x38, - 0x0a, 0x17, 0x4a, 0x73, 0x6f, 0x6e, 0x42, 0x6f, 0x64, 0x79, 0x53, 0x69, 0x7a, 0x65, 0x53, 0x6d, - 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x54, 0x68, 0x61, 0x6e, 0x18, 0x08, 0x20, 0x01, 0x28, 0x05, 0x52, - 0x17, 0x4a, 0x73, 0x6f, 0x6e, 0x42, 0x6f, 0x64, 0x79, 0x53, 0x69, 0x7a, 0x65, 0x53, 0x6d, 0x61, - 0x6c, 0x6c, 0x65, 0x72, 0x54, 0x68, 0x61, 0x6e, 0x12, 0x1e, 0x0a, 0x0a, 0x54, 0x61, 0x73, 0x6b, - 0x54, 0x69, 0x6d, 0x65, 0x47, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x54, 0x61, - 0x73, 0x6b, 0x54, 0x69, 0x6d, 0x65, 0x47, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x54, 0x61, 0x73, 0x6b, - 0x54, 0x69, 0x6d, 0x65, 0x4c, 0x74, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x54, 0x61, - 0x73, 0x6b, 0x54, 0x69, 0x6d, 0x65, 0x4c, 0x74, 0x12, 0x2c, 0x0a, 0x11, 0x45, 0x72, 0x72, 0x6f, - 0x72, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x67, 0x65, 0x78, 0x70, 0x18, 0x0b, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x11, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, - 0x52, 0x65, 0x67, 0x65, 0x78, 0x70, 0x12, 0x24, 0x0a, 0x0d, 0x46, 0x72, 0x65, 0x65, 0x43, 0x6f, - 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x46, - 0x72, 0x65, 0x65, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x10, 0x0a, 0x03, - 0x4e, 0x6f, 0x74, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x08, 0x52, 0x03, 0x4e, 0x6f, 0x74, 0x22, 0x8b, - 0x03, 0x0a, 0x0d, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, - 0x12, 0x2a, 0x0a, 0x05, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x14, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, - 0x66, 0x2e, 0x41, 0x6e, 0x79, 0x52, 0x05, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x20, 0x0a, 0x05, - 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0a, 0x2e, 0x74, 0x72, - 0x65, 0x65, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x05, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x12, 0x1f, - 0x0a, 0x05, 0x55, 0x73, 0x65, 0x72, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x09, 0x2e, - 0x69, 0x64, 0x6d, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x52, 0x05, 0x55, 0x73, 0x65, 0x72, 0x73, 0x12, - 0x1f, 0x0a, 0x05, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x09, - 0x2e, 0x69, 0x64, 0x6d, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x52, 0x05, 0x52, 0x6f, 0x6c, 0x65, 0x73, - 0x12, 0x2e, 0x0a, 0x0a, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x18, 0x07, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x69, 0x64, 0x6d, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x73, - 0x70, 0x61, 0x63, 0x65, 0x52, 0x0a, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, - 0x12, 0x1c, 0x0a, 0x04, 0x41, 0x63, 0x6c, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x08, - 0x2e, 0x69, 0x64, 0x6d, 0x2e, 0x41, 0x43, 0x4c, 0x52, 0x04, 0x41, 0x63, 0x6c, 0x73, 0x12, 0x30, - 0x0a, 0x0a, 0x41, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x69, 0x65, 0x73, 0x18, 0x04, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x61, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, 0x2e, 0x4f, 0x62, - 0x6a, 0x65, 0x63, 0x74, 0x52, 0x0a, 0x41, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x69, 0x65, 0x73, - 0x12, 0x34, 0x0a, 0x0b, 0x44, 0x61, 0x74, 0x61, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x18, - 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x44, - 0x61, 0x74, 0x61, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x0b, 0x44, 0x61, 0x74, 0x61, 0x53, - 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x12, 0x34, 0x0a, 0x0b, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, - 0x43, 0x68, 0x61, 0x69, 0x6e, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x6a, 0x6f, - 0x62, 0x73, 0x2e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x52, - 0x0b, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x2a, 0x3d, 0x0a, 0x0f, - 0x49, 0x64, 0x6d, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x54, 0x79, 0x70, 0x65, 0x12, - 0x08, 0x0a, 0x04, 0x55, 0x73, 0x65, 0x72, 0x10, 0x00, 0x12, 0x08, 0x0a, 0x04, 0x52, 0x6f, 0x6c, - 0x65, 0x10, 0x01, 0x12, 0x0d, 0x0a, 0x09, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, - 0x10, 0x02, 0x12, 0x07, 0x0a, 0x03, 0x41, 0x63, 0x6c, 0x10, 0x03, 0x2a, 0x34, 0x0a, 0x16, 0x44, - 0x61, 0x74, 0x61, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, - 0x72, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0e, 0x0a, 0x0a, 0x44, 0x61, 0x74, 0x61, 0x53, 0x6f, 0x75, - 0x72, 0x63, 0x65, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x10, - 0x01, 0x2a, 0x39, 0x0a, 0x15, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x4d, 0x65, 0x74, 0x61, - 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0f, 0x0a, 0x0b, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x10, 0x00, 0x12, 0x0f, 0x0a, 0x0b, 0x43, - 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x55, 0x73, 0x65, 0x72, 0x10, 0x01, 0x2a, 0x7b, 0x0a, 0x0a, - 0x54, 0x61, 0x73, 0x6b, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x0b, 0x0a, 0x07, 0x55, 0x6e, - 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x10, 0x00, 0x12, 0x08, 0x0a, 0x04, 0x49, 0x64, 0x6c, 0x65, 0x10, - 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x52, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x10, 0x02, 0x12, 0x0c, - 0x0a, 0x08, 0x46, 0x69, 0x6e, 0x69, 0x73, 0x68, 0x65, 0x64, 0x10, 0x03, 0x12, 0x0f, 0x0a, 0x0b, - 0x49, 0x6e, 0x74, 0x65, 0x72, 0x72, 0x75, 0x70, 0x74, 0x65, 0x64, 0x10, 0x04, 0x12, 0x0a, 0x0a, - 0x06, 0x50, 0x61, 0x75, 0x73, 0x65, 0x64, 0x10, 0x05, 0x12, 0x07, 0x0a, 0x03, 0x41, 0x6e, 0x79, - 0x10, 0x06, 0x12, 0x09, 0x0a, 0x05, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x10, 0x07, 0x12, 0x0a, 0x0a, - 0x06, 0x51, 0x75, 0x65, 0x75, 0x65, 0x64, 0x10, 0x08, 0x2a, 0x67, 0x0a, 0x07, 0x43, 0x6f, 0x6d, - 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x08, 0x0a, 0x04, 0x4e, 0x6f, 0x6e, 0x65, 0x10, 0x00, 0x12, 0x09, - 0x0a, 0x05, 0x50, 0x61, 0x75, 0x73, 0x65, 0x10, 0x01, 0x12, 0x0a, 0x0a, 0x06, 0x52, 0x65, 0x73, - 0x75, 0x6d, 0x65, 0x10, 0x02, 0x12, 0x08, 0x0a, 0x04, 0x53, 0x74, 0x6f, 0x70, 0x10, 0x03, 0x12, - 0x0a, 0x0a, 0x06, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x10, 0x04, 0x12, 0x0b, 0x0a, 0x07, 0x52, - 0x75, 0x6e, 0x4f, 0x6e, 0x63, 0x65, 0x10, 0x05, 0x12, 0x0c, 0x0a, 0x08, 0x49, 0x6e, 0x61, 0x63, - 0x74, 0x69, 0x76, 0x65, 0x10, 0x06, 0x12, 0x0a, 0x0a, 0x06, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, - 0x10, 0x07, 0x32, 0xd2, 0x04, 0x0a, 0x0a, 0x4a, 0x6f, 0x62, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, - 0x65, 0x12, 0x35, 0x0a, 0x06, 0x50, 0x75, 0x74, 0x4a, 0x6f, 0x62, 0x12, 0x13, 0x2e, 0x6a, 0x6f, - 0x62, 0x73, 0x2e, 0x50, 0x75, 0x74, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x14, 0x2e, 0x6a, 0x6f, 0x62, 0x73, 0x2e, 0x50, 0x75, 0x74, 0x4a, 0x6f, 0x62, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x35, 0x0a, 0x06, 0x47, 0x65, 0x74, 0x4a, - 0x6f, 0x62, 0x12, 0x13, 0x2e, 0x6a, 0x6f, 0x62, 0x73, 0x2e, 0x47, 0x65, 0x74, 0x4a, 0x6f, 0x62, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x6a, 0x6f, 0x62, 0x73, 0x2e, 0x47, - 0x65, 0x74, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, - 0x3e, 0x0a, 0x09, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4a, 0x6f, 0x62, 0x12, 0x16, 0x2e, 0x6a, - 0x6f, 0x62, 0x73, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x6a, 0x6f, 0x62, 0x73, 0x2e, 0x44, 0x65, 0x6c, 0x65, - 0x74, 0x65, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, - 0x3d, 0x0a, 0x08, 0x4c, 0x69, 0x73, 0x74, 0x4a, 0x6f, 0x62, 0x73, 0x12, 0x15, 0x2e, 0x6a, 0x6f, - 0x62, 0x73, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4a, 0x6f, 0x62, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x6a, 0x6f, 0x62, 0x73, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4a, 0x6f, - 0x62, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x30, 0x01, 0x12, 0x38, - 0x0a, 0x07, 0x50, 0x75, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x14, 0x2e, 0x6a, 0x6f, 0x62, 0x73, - 0x2e, 0x50, 0x75, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x15, 0x2e, 0x6a, 0x6f, 0x62, 0x73, 0x2e, 0x50, 0x75, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x0d, 0x50, 0x75, 0x74, 0x54, - 0x61, 0x73, 0x6b, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x12, 0x14, 0x2e, 0x6a, 0x6f, 0x62, 0x73, - 0x2e, 0x50, 0x75, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x15, 0x2e, 0x6a, 0x6f, 0x62, 0x73, 0x2e, 0x50, 0x75, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x28, 0x01, 0x30, 0x01, 0x12, 0x40, 0x0a, 0x09, - 0x4c, 0x69, 0x73, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x16, 0x2e, 0x6a, 0x6f, 0x62, 0x73, - 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x17, 0x2e, 0x6a, 0x6f, 0x62, 0x73, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x61, 0x73, - 0x6b, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x30, 0x01, 0x12, 0x44, - 0x0a, 0x0b, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x18, 0x2e, - 0x6a, 0x6f, 0x62, 0x73, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x73, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x6a, 0x6f, 0x62, 0x73, 0x2e, 0x44, - 0x65, 0x6c, 0x65, 0x74, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x00, 0x12, 0x51, 0x0a, 0x10, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x53, 0x74, - 0x75, 0x63, 0x6b, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x1d, 0x2e, 0x6a, 0x6f, 0x62, 0x73, 0x2e, - 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x53, 0x74, 0x75, 0x63, 0x6b, 0x54, 0x61, 0x73, 0x6b, 0x73, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x6a, 0x6f, 0x62, 0x73, 0x2e, 0x44, - 0x65, 0x74, 0x65, 0x63, 0x74, 0x53, 0x74, 0x75, 0x63, 0x6b, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x32, 0x48, 0x0a, 0x0b, 0x54, 0x61, 0x73, 0x6b, 0x53, - 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x39, 0x0a, 0x07, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x12, 0x11, 0x2e, 0x6a, 0x6f, 0x62, 0x73, 0x2e, 0x43, 0x74, 0x72, 0x6c, 0x43, 0x6f, 0x6d, - 0x6d, 0x61, 0x6e, 0x64, 0x1a, 0x19, 0x2e, 0x6a, 0x6f, 0x62, 0x73, 0x2e, 0x43, 0x74, 0x72, 0x6c, - 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x00, 0x42, 0x2a, 0x5a, 0x28, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, - 0x70, 0x79, 0x64, 0x69, 0x6f, 0x2f, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, - 0x6f, 0x6e, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x6a, 0x6f, 0x62, 0x73, 0x62, 0x06, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x0e, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x4d, + 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x1a, 0x40, 0x0a, 0x12, 0x52, 0x75, 0x6e, 0x50, 0x61, 0x72, + 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, + 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, + 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xb9, 0x02, 0x0a, 0x0c, 0x41, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x53, 0x75, 0x63, + 0x63, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x53, 0x75, 0x63, 0x63, + 0x65, 0x73, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x52, 0x61, 0x77, 0x42, 0x6f, 0x64, 0x79, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x52, 0x61, 0x77, 0x42, 0x6f, 0x64, 0x79, 0x12, 0x1e, 0x0a, + 0x0a, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x42, 0x6f, 0x64, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0a, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x42, 0x6f, 0x64, 0x79, 0x12, 0x1a, 0x0a, + 0x08, 0x4a, 0x73, 0x6f, 0x6e, 0x42, 0x6f, 0x64, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, + 0x08, 0x4a, 0x73, 0x6f, 0x6e, 0x42, 0x6f, 0x64, 0x79, 0x12, 0x20, 0x0a, 0x0b, 0x45, 0x72, 0x72, + 0x6f, 0x72, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, + 0x45, 0x72, 0x72, 0x6f, 0x72, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x12, 0x18, 0x0a, 0x07, 0x49, + 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x49, 0x67, + 0x6e, 0x6f, 0x72, 0x65, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x54, 0x69, 0x6d, 0x65, 0x18, 0x07, 0x20, + 0x01, 0x28, 0x05, 0x52, 0x04, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x30, 0x0a, 0x04, 0x56, 0x61, 0x72, + 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x6a, 0x6f, 0x62, 0x73, 0x2e, 0x41, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x2e, 0x56, 0x61, 0x72, 0x73, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x56, 0x61, 0x72, 0x73, 0x1a, 0x37, 0x0a, 0x09, 0x56, + 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x3a, 0x02, 0x38, 0x01, 0x22, 0xc9, 0x04, 0x0a, 0x17, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4f, + 0x75, 0x74, 0x70, 0x75, 0x74, 0x53, 0x69, 0x6e, 0x67, 0x6c, 0x65, 0x51, 0x75, 0x65, 0x72, 0x79, + 0x12, 0x1c, 0x0a, 0x09, 0x49, 0x73, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x09, 0x49, 0x73, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x12, 0x2a, + 0x0a, 0x10, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x42, 0x6f, 0x64, 0x79, 0x52, 0x65, 0x67, 0x65, + 0x78, 0x70, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, + 0x42, 0x6f, 0x64, 0x79, 0x52, 0x65, 0x67, 0x65, 0x78, 0x70, 0x12, 0x3c, 0x0a, 0x19, 0x53, 0x74, + 0x72, 0x69, 0x6e, 0x67, 0x42, 0x6f, 0x64, 0x79, 0x53, 0x69, 0x7a, 0x65, 0x47, 0x72, 0x65, 0x61, + 0x74, 0x65, 0x72, 0x54, 0x68, 0x61, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x19, 0x53, + 0x74, 0x72, 0x69, 0x6e, 0x67, 0x42, 0x6f, 0x64, 0x79, 0x53, 0x69, 0x7a, 0x65, 0x47, 0x72, 0x65, + 0x61, 0x74, 0x65, 0x72, 0x54, 0x68, 0x61, 0x6e, 0x12, 0x3c, 0x0a, 0x19, 0x53, 0x74, 0x72, 0x69, + 0x6e, 0x67, 0x42, 0x6f, 0x64, 0x79, 0x53, 0x69, 0x7a, 0x65, 0x53, 0x6d, 0x61, 0x6c, 0x6c, 0x65, + 0x72, 0x54, 0x68, 0x61, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x19, 0x53, 0x74, 0x72, + 0x69, 0x6e, 0x67, 0x42, 0x6f, 0x64, 0x79, 0x53, 0x69, 0x7a, 0x65, 0x53, 0x6d, 0x61, 0x6c, 0x6c, + 0x65, 0x72, 0x54, 0x68, 0x61, 0x6e, 0x12, 0x26, 0x0a, 0x0e, 0x4a, 0x73, 0x6f, 0x6e, 0x42, 0x6f, + 0x64, 0x79, 0x52, 0x65, 0x67, 0x65, 0x78, 0x70, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, + 0x4a, 0x73, 0x6f, 0x6e, 0x42, 0x6f, 0x64, 0x79, 0x52, 0x65, 0x67, 0x65, 0x78, 0x70, 0x12, 0x26, + 0x0a, 0x0e, 0x4a, 0x73, 0x6f, 0x6e, 0x42, 0x6f, 0x64, 0x79, 0x48, 0x61, 0x73, 0x4b, 0x65, 0x79, + 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x4a, 0x73, 0x6f, 0x6e, 0x42, 0x6f, 0x64, 0x79, + 0x48, 0x61, 0x73, 0x4b, 0x65, 0x79, 0x12, 0x38, 0x0a, 0x17, 0x4a, 0x73, 0x6f, 0x6e, 0x42, 0x6f, + 0x64, 0x79, 0x53, 0x69, 0x7a, 0x65, 0x47, 0x72, 0x65, 0x61, 0x74, 0x65, 0x72, 0x54, 0x68, 0x61, + 0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, 0x05, 0x52, 0x17, 0x4a, 0x73, 0x6f, 0x6e, 0x42, 0x6f, 0x64, + 0x79, 0x53, 0x69, 0x7a, 0x65, 0x47, 0x72, 0x65, 0x61, 0x74, 0x65, 0x72, 0x54, 0x68, 0x61, 0x6e, + 0x12, 0x38, 0x0a, 0x17, 0x4a, 0x73, 0x6f, 0x6e, 0x42, 0x6f, 0x64, 0x79, 0x53, 0x69, 0x7a, 0x65, + 0x53, 0x6d, 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x54, 0x68, 0x61, 0x6e, 0x18, 0x08, 0x20, 0x01, 0x28, + 0x05, 0x52, 0x17, 0x4a, 0x73, 0x6f, 0x6e, 0x42, 0x6f, 0x64, 0x79, 0x53, 0x69, 0x7a, 0x65, 0x53, + 0x6d, 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x54, 0x68, 0x61, 0x6e, 0x12, 0x1e, 0x0a, 0x0a, 0x54, 0x61, + 0x73, 0x6b, 0x54, 0x69, 0x6d, 0x65, 0x47, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, + 0x54, 0x61, 0x73, 0x6b, 0x54, 0x69, 0x6d, 0x65, 0x47, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x54, 0x61, + 0x73, 0x6b, 0x54, 0x69, 0x6d, 0x65, 0x4c, 0x74, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, + 0x54, 0x61, 0x73, 0x6b, 0x54, 0x69, 0x6d, 0x65, 0x4c, 0x74, 0x12, 0x2c, 0x0a, 0x11, 0x45, 0x72, + 0x72, 0x6f, 0x72, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x67, 0x65, 0x78, 0x70, 0x18, + 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x53, 0x74, 0x72, 0x69, + 0x6e, 0x67, 0x52, 0x65, 0x67, 0x65, 0x78, 0x70, 0x12, 0x24, 0x0a, 0x0d, 0x46, 0x72, 0x65, 0x65, + 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0d, 0x46, 0x72, 0x65, 0x65, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x10, + 0x0a, 0x03, 0x4e, 0x6f, 0x74, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x08, 0x52, 0x03, 0x4e, 0x6f, 0x74, + 0x22, 0x8b, 0x03, 0x0a, 0x0d, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x65, 0x73, 0x73, 0x61, + 0x67, 0x65, 0x12, 0x2a, 0x0a, 0x05, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x14, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x62, 0x75, 0x66, 0x2e, 0x41, 0x6e, 0x79, 0x52, 0x05, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x20, + 0x0a, 0x05, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0a, 0x2e, + 0x74, 0x72, 0x65, 0x65, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x05, 0x4e, 0x6f, 0x64, 0x65, 0x73, + 0x12, 0x1f, 0x0a, 0x05, 0x55, 0x73, 0x65, 0x72, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x09, 0x2e, 0x69, 0x64, 0x6d, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x52, 0x05, 0x55, 0x73, 0x65, 0x72, + 0x73, 0x12, 0x1f, 0x0a, 0x05, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x09, 0x2e, 0x69, 0x64, 0x6d, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x52, 0x05, 0x52, 0x6f, 0x6c, + 0x65, 0x73, 0x12, 0x2e, 0x0a, 0x0a, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, + 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x69, 0x64, 0x6d, 0x2e, 0x57, 0x6f, 0x72, + 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x0a, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, + 0x65, 0x73, 0x12, 0x1c, 0x0a, 0x04, 0x41, 0x63, 0x6c, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x08, 0x2e, 0x69, 0x64, 0x6d, 0x2e, 0x41, 0x43, 0x4c, 0x52, 0x04, 0x41, 0x63, 0x6c, 0x73, + 0x12, 0x30, 0x0a, 0x0a, 0x41, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x69, 0x65, 0x73, 0x18, 0x04, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x61, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, 0x2e, + 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x0a, 0x41, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x69, + 0x65, 0x73, 0x12, 0x34, 0x0a, 0x0b, 0x44, 0x61, 0x74, 0x61, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, + 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, + 0x2e, 0x44, 0x61, 0x74, 0x61, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x0b, 0x44, 0x61, 0x74, + 0x61, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x12, 0x34, 0x0a, 0x0b, 0x4f, 0x75, 0x74, 0x70, + 0x75, 0x74, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e, + 0x6a, 0x6f, 0x62, 0x73, 0x2e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4f, 0x75, 0x74, 0x70, 0x75, + 0x74, 0x52, 0x0b, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x2a, 0x3d, + 0x0a, 0x0f, 0x49, 0x64, 0x6d, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x54, 0x79, 0x70, + 0x65, 0x12, 0x08, 0x0a, 0x04, 0x55, 0x73, 0x65, 0x72, 0x10, 0x00, 0x12, 0x08, 0x0a, 0x04, 0x52, + 0x6f, 0x6c, 0x65, 0x10, 0x01, 0x12, 0x0d, 0x0a, 0x09, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, + 0x63, 0x65, 0x10, 0x02, 0x12, 0x07, 0x0a, 0x03, 0x41, 0x63, 0x6c, 0x10, 0x03, 0x2a, 0x34, 0x0a, + 0x16, 0x44, 0x61, 0x74, 0x61, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, 0x65, 0x6c, 0x65, 0x63, + 0x74, 0x6f, 0x72, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0e, 0x0a, 0x0a, 0x44, 0x61, 0x74, 0x61, 0x53, + 0x6f, 0x75, 0x72, 0x63, 0x65, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x4f, 0x62, 0x6a, 0x65, 0x63, + 0x74, 0x10, 0x01, 0x2a, 0x39, 0x0a, 0x15, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x4d, 0x65, + 0x74, 0x61, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0f, 0x0a, 0x0b, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x10, 0x00, 0x12, 0x0f, 0x0a, + 0x0b, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x55, 0x73, 0x65, 0x72, 0x10, 0x01, 0x2a, 0x7b, + 0x0a, 0x0a, 0x54, 0x61, 0x73, 0x6b, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x0b, 0x0a, 0x07, + 0x55, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x10, 0x00, 0x12, 0x08, 0x0a, 0x04, 0x49, 0x64, 0x6c, + 0x65, 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x52, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x10, 0x02, + 0x12, 0x0c, 0x0a, 0x08, 0x46, 0x69, 0x6e, 0x69, 0x73, 0x68, 0x65, 0x64, 0x10, 0x03, 0x12, 0x0f, + 0x0a, 0x0b, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x72, 0x75, 0x70, 0x74, 0x65, 0x64, 0x10, 0x04, 0x12, + 0x0a, 0x0a, 0x06, 0x50, 0x61, 0x75, 0x73, 0x65, 0x64, 0x10, 0x05, 0x12, 0x07, 0x0a, 0x03, 0x41, + 0x6e, 0x79, 0x10, 0x06, 0x12, 0x09, 0x0a, 0x05, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x10, 0x07, 0x12, + 0x0a, 0x0a, 0x06, 0x51, 0x75, 0x65, 0x75, 0x65, 0x64, 0x10, 0x08, 0x2a, 0x67, 0x0a, 0x07, 0x43, + 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x08, 0x0a, 0x04, 0x4e, 0x6f, 0x6e, 0x65, 0x10, 0x00, + 0x12, 0x09, 0x0a, 0x05, 0x50, 0x61, 0x75, 0x73, 0x65, 0x10, 0x01, 0x12, 0x0a, 0x0a, 0x06, 0x52, + 0x65, 0x73, 0x75, 0x6d, 0x65, 0x10, 0x02, 0x12, 0x08, 0x0a, 0x04, 0x53, 0x74, 0x6f, 0x70, 0x10, + 0x03, 0x12, 0x0a, 0x0a, 0x06, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x10, 0x04, 0x12, 0x0b, 0x0a, + 0x07, 0x52, 0x75, 0x6e, 0x4f, 0x6e, 0x63, 0x65, 0x10, 0x05, 0x12, 0x0c, 0x0a, 0x08, 0x49, 0x6e, + 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x10, 0x06, 0x12, 0x0a, 0x0a, 0x06, 0x41, 0x63, 0x74, 0x69, + 0x76, 0x65, 0x10, 0x07, 0x32, 0xd2, 0x04, 0x0a, 0x0a, 0x4a, 0x6f, 0x62, 0x53, 0x65, 0x72, 0x76, + 0x69, 0x63, 0x65, 0x12, 0x35, 0x0a, 0x06, 0x50, 0x75, 0x74, 0x4a, 0x6f, 0x62, 0x12, 0x13, 0x2e, + 0x6a, 0x6f, 0x62, 0x73, 0x2e, 0x50, 0x75, 0x74, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x6a, 0x6f, 0x62, 0x73, 0x2e, 0x50, 0x75, 0x74, 0x4a, 0x6f, 0x62, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x35, 0x0a, 0x06, 0x47, 0x65, + 0x74, 0x4a, 0x6f, 0x62, 0x12, 0x13, 0x2e, 0x6a, 0x6f, 0x62, 0x73, 0x2e, 0x47, 0x65, 0x74, 0x4a, + 0x6f, 0x62, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x6a, 0x6f, 0x62, 0x73, + 0x2e, 0x47, 0x65, 0x74, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x00, 0x12, 0x3e, 0x0a, 0x09, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4a, 0x6f, 0x62, 0x12, 0x16, + 0x2e, 0x6a, 0x6f, 0x62, 0x73, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4a, 0x6f, 0x62, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x6a, 0x6f, 0x62, 0x73, 0x2e, 0x44, 0x65, + 0x6c, 0x65, 0x74, 0x65, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x00, 0x12, 0x3d, 0x0a, 0x08, 0x4c, 0x69, 0x73, 0x74, 0x4a, 0x6f, 0x62, 0x73, 0x12, 0x15, 0x2e, + 0x6a, 0x6f, 0x62, 0x73, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4a, 0x6f, 0x62, 0x73, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x6a, 0x6f, 0x62, 0x73, 0x2e, 0x4c, 0x69, 0x73, 0x74, + 0x4a, 0x6f, 0x62, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x30, 0x01, + 0x12, 0x38, 0x0a, 0x07, 0x50, 0x75, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x14, 0x2e, 0x6a, 0x6f, + 0x62, 0x73, 0x2e, 0x50, 0x75, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x15, 0x2e, 0x6a, 0x6f, 0x62, 0x73, 0x2e, 0x50, 0x75, 0x74, 0x54, 0x61, 0x73, 0x6b, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x0d, 0x50, 0x75, + 0x74, 0x54, 0x61, 0x73, 0x6b, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x12, 0x14, 0x2e, 0x6a, 0x6f, + 0x62, 0x73, 0x2e, 0x50, 0x75, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x15, 0x2e, 0x6a, 0x6f, 0x62, 0x73, 0x2e, 0x50, 0x75, 0x74, 0x54, 0x61, 0x73, 0x6b, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x28, 0x01, 0x30, 0x01, 0x12, 0x40, + 0x0a, 0x09, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x16, 0x2e, 0x6a, 0x6f, + 0x62, 0x73, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x6a, 0x6f, 0x62, 0x73, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x54, + 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x30, 0x01, + 0x12, 0x44, 0x0a, 0x0b, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, + 0x18, 0x2e, 0x6a, 0x6f, 0x62, 0x73, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x54, 0x61, 0x73, + 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x6a, 0x6f, 0x62, 0x73, + 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x51, 0x0a, 0x10, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, + 0x53, 0x74, 0x75, 0x63, 0x6b, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x1d, 0x2e, 0x6a, 0x6f, 0x62, + 0x73, 0x2e, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x53, 0x74, 0x75, 0x63, 0x6b, 0x54, 0x61, 0x73, + 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x6a, 0x6f, 0x62, 0x73, + 0x2e, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x53, 0x74, 0x75, 0x63, 0x6b, 0x54, 0x61, 0x73, 0x6b, + 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x32, 0x48, 0x0a, 0x0b, 0x54, 0x61, 0x73, + 0x6b, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x39, 0x0a, 0x07, 0x43, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x12, 0x11, 0x2e, 0x6a, 0x6f, 0x62, 0x73, 0x2e, 0x43, 0x74, 0x72, 0x6c, 0x43, + 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x1a, 0x19, 0x2e, 0x6a, 0x6f, 0x62, 0x73, 0x2e, 0x43, 0x74, + 0x72, 0x6c, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x00, 0x42, 0x2a, 0x5a, 0x28, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, + 0x6d, 0x2f, 0x70, 0x79, 0x64, 0x69, 0x6f, 0x2f, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x2f, 0x63, 0x6f, + 0x6d, 0x6d, 0x6f, 0x6e, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x6a, 0x6f, 0x62, 0x73, 0x62, + 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( diff --git a/common/proto/jobs/cells-jobs.proto b/common/proto/jobs/cells-jobs.proto index b010c9dd32..ff0f3195db 100644 --- a/common/proto/jobs/cells-jobs.proto +++ b/common/proto/jobs/cells-jobs.proto @@ -32,6 +32,8 @@ message NodesSelector { string Description = 7; // Optional Timeout for this selector string Timeout = 8; + // Clear previous selection + bool ClearInput = 10; } // Possible values for IdmSelector.Type @@ -60,6 +62,8 @@ message IdmSelector { string Description = 6; // Optional Timeout for this selector string Timeout = 7; + // Clear previous selection + bool ClearInput = 9; } // Select or filter users - should be replaced by more generic IdmSelector @@ -79,6 +83,8 @@ message UsersSelector { string Description = 7; // Optional Timeout for this selector string Timeout = 8; + // Clear previous selection + bool ClearInput = 9; } enum DataSourceSelectorType { @@ -104,6 +110,8 @@ message DataSourceSelector { service.Query Query = 6; // Optional Timeout for this selector string Timeout = 7; + // Clear previous selection + bool ClearInput = 9; } // Atomic query for TriggerFilter @@ -263,6 +271,8 @@ message Job { Schedule Schedule = 6; // Start task as soon as job is inserted bool AutoStart = 7; + // Start task as soon as server is started + bool AutoRestart = 29; // Remove job automatically once it is finished (success only) bool AutoClean = 11; diff --git a/common/proto/jobs/cells-jobs.validator.pb.go b/common/proto/jobs/cells-jobs.validator.pb.go index 7f9cecd3b5..836b5eb0cd 100644 --- a/common/proto/jobs/cells-jobs.validator.pb.go +++ b/common/proto/jobs/cells-jobs.validator.pb.go @@ -7,12 +7,12 @@ import ( fmt "fmt" math "math" proto "google.golang.org/protobuf/proto" + _ "github.com/pydio/cells/v4/common/proto/activity" + _ "github.com/pydio/cells/v4/common/proto/object" _ "google.golang.org/protobuf/types/known/anypb" _ "github.com/pydio/cells/v4/common/proto/service" _ "github.com/pydio/cells/v4/common/proto/tree" _ "github.com/pydio/cells/v4/common/proto/idm" - _ "github.com/pydio/cells/v4/common/proto/activity" - _ "github.com/pydio/cells/v4/common/proto/object" github_com_mwitkow_go_proto_validators "github.com/mwitkow/go-proto-validators" ) diff --git a/common/proto/jobs/cells-jobs_grpc.enhanced.pb.go b/common/proto/jobs/cells-jobs_grpc.enhanced.pb.go index c7691ace1d..8056eef479 100644 --- a/common/proto/jobs/cells-jobs_grpc.enhanced.pb.go +++ b/common/proto/jobs/cells-jobs_grpc.enhanced.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go-grpc. DO NOT EDIT. // versions: // - protoc-gen-go-grpc v1.1.0 -// - protoc v3.18.1 +// - protoc (unknown) // source: cells-jobs.proto package jobs diff --git a/common/proto/jobs/ds-selector.go b/common/proto/jobs/ds-selector.go index 5d82ae3f19..6624e22393 100644 --- a/common/proto/jobs/ds-selector.go +++ b/common/proto/jobs/ds-selector.go @@ -35,6 +35,10 @@ func (m *DataSourceSelector) FilterID() string { return "DataSourceFilter" } +func (m *DataSourceSelector) ApplyClearInput(msg *ActionMessage) *ActionMessage { + return msg.WithDataSource(nil) +} + func (m *DataSourceSelector) Filter(ctx context.Context, input *ActionMessage) (*ActionMessage, *ActionMessage, bool) { var passed, excluded []*object.DataSource for _, ds := range input.DataSources { diff --git a/common/proto/jobs/idm-selector.go b/common/proto/jobs/idm-selector.go index ebb9eac299..f775f25d20 100644 --- a/common/proto/jobs/idm-selector.go +++ b/common/proto/jobs/idm-selector.go @@ -48,6 +48,21 @@ func (m *IdmSelector) FilterID() string { return "IdmFilter" } +func (m *IdmSelector) ApplyClearInput(msg *ActionMessage) *ActionMessage { + switch m.Type { + case IdmSelectorType_User: + return msg.WithUser(nil) + case IdmSelectorType_Role: + return msg.WithRole(nil) + case IdmSelectorType_Acl: + return msg.WithAcl(nil) + case IdmSelectorType_Workspace: + return msg.WithWorkspace(nil) + default: + return msg + } +} + // Select IDM Objects by a given query func (m *IdmSelector) Select(ctx context.Context, input *ActionMessage, objects chan interface{}, done chan bool) error { diff --git a/common/proto/jobs/nodes-selector.go b/common/proto/jobs/nodes-selector.go index d81d4758c1..cdb4463a89 100644 --- a/common/proto/jobs/nodes-selector.go +++ b/common/proto/jobs/nodes-selector.go @@ -73,6 +73,10 @@ func (n *NodesSelector) FilterID() string { return "NodesFilter" } +func (n *NodesSelector) ApplyClearInput(msg *ActionMessage) *ActionMessage { + return msg.WithNode(nil) +} + func (n *NodesSelector) Select(ctx context.Context, input *ActionMessage, objects chan interface{}, done chan bool) error { defer func() { done <- true diff --git a/common/proto/jobs/selector.go b/common/proto/jobs/selector.go index 755a820c3e..a793d7960b 100644 --- a/common/proto/jobs/selector.go +++ b/common/proto/jobs/selector.go @@ -38,6 +38,8 @@ type InputSelector interface { MultipleSelection() bool GetTimeout() string SelectorID() string + GetClearInput() bool + ApplyClearInput(msg *ActionMessage) *ActionMessage } type InputFilter interface { diff --git a/common/proto/jobs/users-selector.go b/common/proto/jobs/users-selector.go index 09ff99513c..1618f4923a 100644 --- a/common/proto/jobs/users-selector.go +++ b/common/proto/jobs/users-selector.go @@ -40,6 +40,10 @@ func (m *UsersSelector) SelectorID() string { return "UsersSelector" } +func (m *UsersSelector) ApplyClearInput(msg *ActionMessage) *ActionMessage { + return msg.WithUser(nil) +} + // Select performs a query on the User Service to load a list of users. The more generic IdmSelector should be used instead. func (m *UsersSelector) Select(ctx context.Context, input *ActionMessage, objects chan interface{}, done chan bool) error { diff --git a/common/proto/rest/cellsapi-config.validator.pb.go b/common/proto/rest/cellsapi-config.validator.pb.go index 0f1819f1bb..a0dd8cfcb0 100644 --- a/common/proto/rest/cellsapi-config.validator.pb.go +++ b/common/proto/rest/cellsapi-config.validator.pb.go @@ -7,10 +7,10 @@ import ( fmt "fmt" math "math" proto "google.golang.org/protobuf/proto" - _ "github.com/pydio/cells/v4/common/proto/install" _ "github.com/pydio/cells/v4/common/proto/tree" _ "github.com/pydio/cells/v4/common/proto/object" _ "github.com/pydio/cells/v4/common/proto/ctl" + _ "github.com/pydio/cells/v4/common/proto/install" github_com_mwitkow_go_proto_validators "github.com/mwitkow/go-proto-validators" ) diff --git a/common/proto/rest/cellsapi-data.pb.go b/common/proto/rest/cellsapi-data.pb.go index a23e9ec088..675319c2cb 100644 --- a/common/proto/rest/cellsapi-data.pb.go +++ b/common/proto/rest/cellsapi-data.pb.go @@ -370,6 +370,12 @@ type GetBulkMetaRequest struct { Offset int32 `protobuf:"varint,5,opt,name=Offset,proto3" json:"Offset,omitempty"` // Limit number of results Limit int32 `protobuf:"varint,6,opt,name=Limit,proto3" json:"Limit,omitempty"` + // Remote Sort on specific field + SortField string `protobuf:"bytes,7,opt,name=SortField,proto3" json:"SortField,omitempty"` + // Sort descending (otherwise ascending) + SortDirDesc bool `protobuf:"varint,8,opt,name=SortDirDesc,proto3" json:"SortDirDesc,omitempty"` + // Children Filtering + Filters map[string]string `protobuf:"bytes,9,rep,name=Filters,proto3" json:"Filters,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` } func (x *GetBulkMetaRequest) Reset() { @@ -439,6 +445,27 @@ func (x *GetBulkMetaRequest) GetLimit() int32 { return 0 } +func (x *GetBulkMetaRequest) GetSortField() string { + if x != nil { + return x.SortField + } + return "" +} + +func (x *GetBulkMetaRequest) GetSortDirDesc() bool { + if x != nil { + return x.SortDirDesc + } + return false +} + +func (x *GetBulkMetaRequest) GetFilters() map[string]string { + if x != nil { + return x.Filters + } + return nil +} + type BulkMetaResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -1267,7 +1294,7 @@ var file_cellsapi_data_proto_rawDesc = []byte{ 0x50, 0x61, 0x74, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x61, 0x74, 0x68, 0x12, 0x1c, 0x0a, 0x09, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, - 0x63, 0x65, 0x22, 0xa8, 0x01, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x42, 0x75, 0x6c, 0x6b, 0x4d, 0x65, + 0x63, 0x65, 0x22, 0xe5, 0x02, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x42, 0x75, 0x6c, 0x6b, 0x4d, 0x65, 0x74, 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x61, 0x74, 0x68, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x61, 0x74, 0x68, 0x73, 0x12, 0x2a, 0x0a, 0x10, 0x41, 0x6c, 0x6c, 0x4d, 0x65, @@ -1277,91 +1304,103 @@ var file_cellsapi_data_proto_rawDesc = []byte{ 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x4c, 0x69, 0x6d, 0x69, 0x74, - 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x22, 0x66, 0x0a, - 0x10, 0x42, 0x75, 0x6c, 0x6b, 0x4d, 0x65, 0x74, 0x61, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x12, 0x20, 0x0a, 0x05, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x0a, 0x2e, 0x74, 0x72, 0x65, 0x65, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x05, 0x4e, 0x6f, - 0x64, 0x65, 0x73, 0x12, 0x30, 0x0a, 0x0a, 0x50, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x72, 0x65, 0x73, 0x74, 0x2e, 0x50, - 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x50, 0x61, 0x67, 0x69, 0x6e, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x25, 0x0a, 0x0f, 0x48, 0x65, 0x61, 0x64, 0x4e, 0x6f, 0x64, - 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x6f, 0x64, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x6f, 0x64, 0x65, 0x22, 0x32, 0x0a, 0x10, - 0x48, 0x65, 0x61, 0x64, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x1e, 0x0a, 0x04, 0x4e, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0a, - 0x2e, 0x74, 0x72, 0x65, 0x65, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x04, 0x4e, 0x6f, 0x64, 0x65, - 0x22, 0x78, 0x0a, 0x12, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x05, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x18, - 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0a, 0x2e, 0x74, 0x72, 0x65, 0x65, 0x2e, 0x4e, 0x6f, 0x64, - 0x65, 0x52, 0x05, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x52, 0x65, 0x63, 0x75, - 0x72, 0x73, 0x69, 0x76, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x52, 0x65, 0x63, - 0x75, 0x72, 0x73, 0x69, 0x76, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, - 0x74, 0x65, 0x55, 0x55, 0x49, 0x44, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x54, 0x65, - 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x55, 0x55, 0x49, 0x44, 0x22, 0x78, 0x0a, 0x16, 0x43, 0x72, - 0x65, 0x61, 0x74, 0x65, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x05, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x18, 0x01, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x0a, 0x2e, 0x74, 0x72, 0x65, 0x65, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x52, - 0x05, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x12, 0x22, 0x0a, 0x0c, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, - 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x54, 0x61, - 0x72, 0x67, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x50, 0x65, - 0x72, 0x73, 0x69, 0x73, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x50, 0x65, 0x72, - 0x73, 0x69, 0x73, 0x74, 0x22, 0x61, 0x0a, 0x17, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, 0x65, - 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x24, 0x0a, 0x0d, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x55, 0x49, 0x44, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x55, 0x55, 0x49, 0x44, 0x12, 0x20, 0x0a, 0x05, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x18, 0x02, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0a, 0x2e, 0x74, 0x72, 0x65, 0x65, 0x2e, 0x4e, 0x6f, 0x64, 0x65, - 0x52, 0x05, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x22, 0x5d, 0x0a, 0x0f, 0x4e, 0x6f, 0x64, 0x65, 0x73, - 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x22, 0x0a, 0x06, 0x50, 0x61, - 0x72, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0a, 0x2e, 0x74, 0x72, 0x65, - 0x65, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x06, 0x50, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x12, 0x26, - 0x0a, 0x08, 0x43, 0x68, 0x69, 0x6c, 0x64, 0x72, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x0a, 0x2e, 0x74, 0x72, 0x65, 0x65, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x08, 0x43, 0x68, - 0x69, 0x6c, 0x64, 0x72, 0x65, 0x6e, 0x22, 0x82, 0x01, 0x0a, 0x12, 0x44, 0x65, 0x6c, 0x65, 0x74, - 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, - 0x05, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0a, 0x2e, 0x74, - 0x72, 0x65, 0x65, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x05, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x12, - 0x1c, 0x0a, 0x09, 0x52, 0x65, 0x63, 0x75, 0x72, 0x73, 0x69, 0x76, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x09, 0x52, 0x65, 0x63, 0x75, 0x72, 0x73, 0x69, 0x76, 0x65, 0x12, 0x2c, 0x0a, - 0x11, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x50, 0x65, 0x72, 0x6d, 0x61, 0x6e, 0x65, 0x6e, 0x74, - 0x6c, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x11, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, - 0x50, 0x65, 0x72, 0x6d, 0x61, 0x6e, 0x65, 0x6e, 0x74, 0x6c, 0x79, 0x22, 0x5b, 0x0a, 0x13, 0x42, - 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x73, 0x75, - 0x6c, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x55, 0x75, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x04, 0x55, 0x75, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x12, 0x1a, 0x0a, 0x08, - 0x4e, 0x6f, 0x64, 0x65, 0x55, 0x75, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, - 0x4e, 0x6f, 0x64, 0x65, 0x55, 0x75, 0x69, 0x64, 0x22, 0x50, 0x0a, 0x13, 0x44, 0x65, 0x6c, 0x65, - 0x74, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x39, 0x0a, 0x0a, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4a, 0x6f, 0x62, 0x73, 0x18, 0x01, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x72, 0x65, 0x73, 0x74, 0x2e, 0x42, 0x61, 0x63, 0x6b, 0x67, - 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, 0x0a, - 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4a, 0x6f, 0x62, 0x73, 0x22, 0x37, 0x0a, 0x13, 0x52, 0x65, - 0x73, 0x74, 0x6f, 0x72, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x1c, 0x0a, + 0x09, 0x53, 0x6f, 0x72, 0x74, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x09, 0x53, 0x6f, 0x72, 0x74, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x20, 0x0a, 0x0b, 0x53, + 0x6f, 0x72, 0x74, 0x44, 0x69, 0x72, 0x44, 0x65, 0x73, 0x63, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x0b, 0x53, 0x6f, 0x72, 0x74, 0x44, 0x69, 0x72, 0x44, 0x65, 0x73, 0x63, 0x12, 0x3f, 0x0a, + 0x07, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x25, + 0x2e, 0x72, 0x65, 0x73, 0x74, 0x2e, 0x47, 0x65, 0x74, 0x42, 0x75, 0x6c, 0x6b, 0x4d, 0x65, 0x74, + 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x07, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x1a, 0x3a, + 0x0a, 0x0c, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, + 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, + 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x66, 0x0a, 0x10, 0x42, 0x75, + 0x6c, 0x6b, 0x4d, 0x65, 0x74, 0x61, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x20, + 0x0a, 0x05, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0a, 0x2e, + 0x74, 0x72, 0x65, 0x65, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x05, 0x4e, 0x6f, 0x64, 0x65, 0x73, + 0x12, 0x30, 0x0a, 0x0a, 0x50, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x72, 0x65, 0x73, 0x74, 0x2e, 0x50, 0x61, 0x67, 0x69, + 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x50, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x22, 0x25, 0x0a, 0x0f, 0x48, 0x65, 0x61, 0x64, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x6f, 0x64, 0x65, 0x22, 0x32, 0x0a, 0x10, 0x48, 0x65, 0x61, + 0x64, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1e, 0x0a, + 0x04, 0x4e, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0a, 0x2e, 0x74, 0x72, + 0x65, 0x65, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x04, 0x4e, 0x6f, 0x64, 0x65, 0x22, 0x78, 0x0a, + 0x12, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x05, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x0a, 0x2e, 0x74, 0x72, 0x65, 0x65, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x05, + 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x52, 0x65, 0x63, 0x75, 0x72, 0x73, 0x69, + 0x76, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x52, 0x65, 0x63, 0x75, 0x72, 0x73, + 0x69, 0x76, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x55, + 0x55, 0x49, 0x44, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x54, 0x65, 0x6d, 0x70, 0x6c, + 0x61, 0x74, 0x65, 0x55, 0x55, 0x49, 0x44, 0x22, 0x78, 0x0a, 0x16, 0x43, 0x72, 0x65, 0x61, 0x74, + 0x65, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x05, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0a, 0x2e, 0x74, 0x72, 0x65, 0x65, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x05, 0x4e, 0x6f, - 0x64, 0x65, 0x73, 0x22, 0x53, 0x0a, 0x14, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x4e, 0x6f, - 0x64, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3b, 0x0a, 0x0b, 0x52, - 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x4a, 0x6f, 0x62, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, + 0x64, 0x65, 0x73, 0x12, 0x22, 0x0a, 0x0c, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x41, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x54, 0x61, 0x72, 0x67, 0x65, + 0x74, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x50, 0x65, 0x72, 0x73, 0x69, + 0x73, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x50, 0x65, 0x72, 0x73, 0x69, 0x73, + 0x74, 0x22, 0x61, 0x0a, 0x17, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, 0x65, 0x6c, 0x65, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x24, 0x0a, 0x0d, + 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x55, 0x49, 0x44, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0d, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x55, + 0x49, 0x44, 0x12, 0x20, 0x0a, 0x05, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x0a, 0x2e, 0x74, 0x72, 0x65, 0x65, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x05, 0x4e, + 0x6f, 0x64, 0x65, 0x73, 0x22, 0x5d, 0x0a, 0x0f, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x43, 0x6f, 0x6c, + 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x22, 0x0a, 0x06, 0x50, 0x61, 0x72, 0x65, 0x6e, + 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0a, 0x2e, 0x74, 0x72, 0x65, 0x65, 0x2e, 0x4e, + 0x6f, 0x64, 0x65, 0x52, 0x06, 0x50, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x12, 0x26, 0x0a, 0x08, 0x43, + 0x68, 0x69, 0x6c, 0x64, 0x72, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0a, 0x2e, + 0x74, 0x72, 0x65, 0x65, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x08, 0x43, 0x68, 0x69, 0x6c, 0x64, + 0x72, 0x65, 0x6e, 0x22, 0x82, 0x01, 0x0a, 0x12, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4e, 0x6f, + 0x64, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x05, 0x4e, 0x6f, + 0x64, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0a, 0x2e, 0x74, 0x72, 0x65, 0x65, + 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x05, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x12, 0x1c, 0x0a, 0x09, + 0x52, 0x65, 0x63, 0x75, 0x72, 0x73, 0x69, 0x76, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x09, 0x52, 0x65, 0x63, 0x75, 0x72, 0x73, 0x69, 0x76, 0x65, 0x12, 0x2c, 0x0a, 0x11, 0x52, 0x65, + 0x6d, 0x6f, 0x76, 0x65, 0x50, 0x65, 0x72, 0x6d, 0x61, 0x6e, 0x65, 0x6e, 0x74, 0x6c, 0x79, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x11, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x50, 0x65, 0x72, + 0x6d, 0x61, 0x6e, 0x65, 0x6e, 0x74, 0x6c, 0x79, 0x22, 0x5b, 0x0a, 0x13, 0x42, 0x61, 0x63, 0x6b, + 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, + 0x12, 0x0a, 0x04, 0x55, 0x75, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x55, + 0x75, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x05, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x12, 0x1a, 0x0a, 0x08, 0x4e, 0x6f, 0x64, + 0x65, 0x55, 0x75, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x4e, 0x6f, 0x64, + 0x65, 0x55, 0x75, 0x69, 0x64, 0x22, 0x50, 0x0a, 0x13, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4e, + 0x6f, 0x64, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x39, 0x0a, 0x0a, + 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4a, 0x6f, 0x62, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x72, 0x65, 0x73, 0x74, 0x2e, 0x42, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, - 0x6e, 0x64, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, 0x0b, 0x52, 0x65, 0x73, - 0x74, 0x6f, 0x72, 0x65, 0x4a, 0x6f, 0x62, 0x73, 0x22, 0x7c, 0x0a, 0x13, 0x4c, 0x69, 0x73, 0x74, - 0x44, 0x6f, 0x63, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x18, 0x0a, 0x07, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x07, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x49, 0x44, 0x12, 0x2d, 0x0a, 0x05, 0x51, 0x75, 0x65, - 0x72, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x64, 0x6f, 0x63, 0x73, 0x74, - 0x6f, 0x72, 0x65, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x51, 0x75, 0x65, 0x72, - 0x79, 0x52, 0x05, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0x1c, 0x0a, 0x09, 0x43, 0x6f, 0x75, 0x6e, - 0x74, 0x4f, 0x6e, 0x6c, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x43, 0x6f, 0x75, - 0x6e, 0x74, 0x4f, 0x6e, 0x6c, 0x79, 0x22, 0x52, 0x0a, 0x12, 0x44, 0x6f, 0x63, 0x73, 0x74, 0x6f, - 0x72, 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x26, 0x0a, 0x04, - 0x44, 0x6f, 0x63, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x64, 0x6f, 0x63, - 0x73, 0x74, 0x6f, 0x72, 0x65, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x04, - 0x44, 0x6f, 0x63, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x03, 0x52, 0x05, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x42, 0x2a, 0x5a, 0x28, 0x67, 0x69, - 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x70, 0x79, 0x64, 0x69, 0x6f, 0x2f, 0x63, - 0x65, 0x6c, 0x6c, 0x73, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2f, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x2f, 0x72, 0x65, 0x73, 0x74, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x6e, 0x64, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, 0x0a, 0x44, 0x65, 0x6c, + 0x65, 0x74, 0x65, 0x4a, 0x6f, 0x62, 0x73, 0x22, 0x37, 0x0a, 0x13, 0x52, 0x65, 0x73, 0x74, 0x6f, + 0x72, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, + 0x0a, 0x05, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0a, 0x2e, + 0x74, 0x72, 0x65, 0x65, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x05, 0x4e, 0x6f, 0x64, 0x65, 0x73, + 0x22, 0x53, 0x0a, 0x14, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x73, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3b, 0x0a, 0x0b, 0x52, 0x65, 0x73, 0x74, + 0x6f, 0x72, 0x65, 0x4a, 0x6f, 0x62, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, + 0x72, 0x65, 0x73, 0x74, 0x2e, 0x42, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x4a, + 0x6f, 0x62, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, 0x0b, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, + 0x65, 0x4a, 0x6f, 0x62, 0x73, 0x22, 0x7c, 0x0a, 0x13, 0x4c, 0x69, 0x73, 0x74, 0x44, 0x6f, 0x63, + 0x73, 0x74, 0x6f, 0x72, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, + 0x53, 0x74, 0x6f, 0x72, 0x65, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x53, + 0x74, 0x6f, 0x72, 0x65, 0x49, 0x44, 0x12, 0x2d, 0x0a, 0x05, 0x51, 0x75, 0x65, 0x72, 0x79, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x64, 0x6f, 0x63, 0x73, 0x74, 0x6f, 0x72, 0x65, + 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x05, + 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0x1c, 0x0a, 0x09, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x4f, 0x6e, + 0x6c, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x4f, + 0x6e, 0x6c, 0x79, 0x22, 0x52, 0x0a, 0x12, 0x44, 0x6f, 0x63, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x43, + 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x26, 0x0a, 0x04, 0x44, 0x6f, 0x63, + 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x64, 0x6f, 0x63, 0x73, 0x74, 0x6f, + 0x72, 0x65, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x04, 0x44, 0x6f, 0x63, + 0x73, 0x12, 0x14, 0x0a, 0x05, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, + 0x52, 0x05, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x42, 0x2a, 0x5a, 0x28, 0x67, 0x69, 0x74, 0x68, 0x75, + 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x70, 0x79, 0x64, 0x69, 0x6f, 0x2f, 0x63, 0x65, 0x6c, 0x6c, + 0x73, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x72, + 0x65, 0x73, 0x74, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -1376,7 +1415,7 @@ func file_cellsapi_data_proto_rawDescGZIP() []byte { return file_cellsapi_data_proto_rawDescData } -var file_cellsapi_data_proto_msgTypes = make([]protoimpl.MessageInfo, 20) +var file_cellsapi_data_proto_msgTypes = make([]protoimpl.MessageInfo, 21) var file_cellsapi_data_proto_goTypes = []interface{}{ (*SearchResults)(nil), // 0: rest.SearchResults (*Pagination)(nil), // 1: rest.Pagination @@ -1398,34 +1437,36 @@ var file_cellsapi_data_proto_goTypes = []interface{}{ (*RestoreNodesResponse)(nil), // 17: rest.RestoreNodesResponse (*ListDocstoreRequest)(nil), // 18: rest.ListDocstoreRequest (*DocstoreCollection)(nil), // 19: rest.DocstoreCollection - (*tree.Node)(nil), // 20: tree.Node - (*tree.SearchFacet)(nil), // 21: tree.SearchFacet - (*docstore.DocumentQuery)(nil), // 22: docstore.DocumentQuery - (*docstore.Document)(nil), // 23: docstore.Document + nil, // 20: rest.GetBulkMetaRequest.FiltersEntry + (*tree.Node)(nil), // 21: tree.Node + (*tree.SearchFacet)(nil), // 22: tree.SearchFacet + (*docstore.DocumentQuery)(nil), // 23: docstore.DocumentQuery + (*docstore.Document)(nil), // 24: docstore.Document } var file_cellsapi_data_proto_depIdxs = []int32{ - 20, // 0: rest.SearchResults.Results:type_name -> tree.Node - 21, // 1: rest.SearchResults.Facets:type_name -> tree.SearchFacet + 21, // 0: rest.SearchResults.Results:type_name -> tree.Node + 22, // 1: rest.SearchResults.Facets:type_name -> tree.SearchFacet 2, // 2: rest.MetaCollection.Metadatas:type_name -> rest.Metadata - 20, // 3: rest.BulkMetaResponse.Nodes:type_name -> tree.Node - 1, // 4: rest.BulkMetaResponse.Pagination:type_name -> rest.Pagination - 20, // 5: rest.HeadNodeResponse.Node:type_name -> tree.Node - 20, // 6: rest.CreateNodesRequest.Nodes:type_name -> tree.Node - 20, // 7: rest.CreateSelectionRequest.Nodes:type_name -> tree.Node - 20, // 8: rest.CreateSelectionResponse.Nodes:type_name -> tree.Node - 20, // 9: rest.NodesCollection.Parent:type_name -> tree.Node - 20, // 10: rest.NodesCollection.Children:type_name -> tree.Node - 20, // 11: rest.DeleteNodesRequest.Nodes:type_name -> tree.Node - 14, // 12: rest.DeleteNodesResponse.DeleteJobs:type_name -> rest.BackgroundJobResult - 20, // 13: rest.RestoreNodesRequest.Nodes:type_name -> tree.Node - 14, // 14: rest.RestoreNodesResponse.RestoreJobs:type_name -> rest.BackgroundJobResult - 22, // 15: rest.ListDocstoreRequest.Query:type_name -> docstore.DocumentQuery - 23, // 16: rest.DocstoreCollection.Docs:type_name -> docstore.Document - 17, // [17:17] is the sub-list for method output_type - 17, // [17:17] is the sub-list for method input_type - 17, // [17:17] is the sub-list for extension type_name - 17, // [17:17] is the sub-list for extension extendee - 0, // [0:17] is the sub-list for field type_name + 20, // 3: rest.GetBulkMetaRequest.Filters:type_name -> rest.GetBulkMetaRequest.FiltersEntry + 21, // 4: rest.BulkMetaResponse.Nodes:type_name -> tree.Node + 1, // 5: rest.BulkMetaResponse.Pagination:type_name -> rest.Pagination + 21, // 6: rest.HeadNodeResponse.Node:type_name -> tree.Node + 21, // 7: rest.CreateNodesRequest.Nodes:type_name -> tree.Node + 21, // 8: rest.CreateSelectionRequest.Nodes:type_name -> tree.Node + 21, // 9: rest.CreateSelectionResponse.Nodes:type_name -> tree.Node + 21, // 10: rest.NodesCollection.Parent:type_name -> tree.Node + 21, // 11: rest.NodesCollection.Children:type_name -> tree.Node + 21, // 12: rest.DeleteNodesRequest.Nodes:type_name -> tree.Node + 14, // 13: rest.DeleteNodesResponse.DeleteJobs:type_name -> rest.BackgroundJobResult + 21, // 14: rest.RestoreNodesRequest.Nodes:type_name -> tree.Node + 14, // 15: rest.RestoreNodesResponse.RestoreJobs:type_name -> rest.BackgroundJobResult + 23, // 16: rest.ListDocstoreRequest.Query:type_name -> docstore.DocumentQuery + 24, // 17: rest.DocstoreCollection.Docs:type_name -> docstore.Document + 18, // [18:18] is the sub-list for method output_type + 18, // [18:18] is the sub-list for method input_type + 18, // [18:18] is the sub-list for extension type_name + 18, // [18:18] is the sub-list for extension extendee + 0, // [0:18] is the sub-list for field type_name } func init() { file_cellsapi_data_proto_init() } @@ -1681,7 +1722,7 @@ func file_cellsapi_data_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_cellsapi_data_proto_rawDesc, NumEnums: 0, - NumMessages: 20, + NumMessages: 21, NumExtensions: 0, NumServices: 0, }, diff --git a/common/proto/rest/cellsapi-data.proto b/common/proto/rest/cellsapi-data.proto index 0e0b6f6881..c380e9934e 100644 --- a/common/proto/rest/cellsapi-data.proto +++ b/common/proto/rest/cellsapi-data.proto @@ -60,6 +60,12 @@ message GetBulkMetaRequest{ int32 Offset = 5; // Limit number of results int32 Limit = 6; + // Remote Sort on specific field + string SortField = 7; + // Sort descending (otherwise ascending) + bool SortDirDesc = 8; + // Children Filtering + map Filters = 9; } message BulkMetaResponse{ diff --git a/common/proto/rest/cellsapi-data.validator.pb.go b/common/proto/rest/cellsapi-data.validator.pb.go index 3a95b9ab6f..1e154bc6b6 100644 --- a/common/proto/rest/cellsapi-data.validator.pb.go +++ b/common/proto/rest/cellsapi-data.validator.pb.go @@ -54,6 +54,7 @@ func (this *MetaNamespaceRequest) Validate() error { return nil } func (this *GetBulkMetaRequest) Validate() error { + // Validation of proto3 map<> fields is unsupported. return nil } func (this *BulkMetaResponse) Validate() error { diff --git a/common/proto/rest/cellsapi-graph.validator.pb.go b/common/proto/rest/cellsapi-graph.validator.pb.go index a3d8b604df..7ed62c58c5 100644 --- a/common/proto/rest/cellsapi-graph.validator.pb.go +++ b/common/proto/rest/cellsapi-graph.validator.pb.go @@ -7,8 +7,8 @@ import ( fmt "fmt" math "math" proto "google.golang.org/protobuf/proto" - _ "github.com/pydio/cells/v4/common/proto/tree" _ "github.com/pydio/cells/v4/common/proto/idm" + _ "github.com/pydio/cells/v4/common/proto/tree" github_com_mwitkow_go_proto_validators "github.com/mwitkow/go-proto-validators" ) diff --git a/common/proto/rest/cellsapi-rest.swagger.json b/common/proto/rest/cellsapi-rest.swagger.json index 40872ed5cb..c2508b46cd 100644 --- a/common/proto/rest/cellsapi-rest.swagger.json +++ b/common/proto/rest/cellsapi-rest.swagger.json @@ -2061,6 +2061,10 @@ "title": "Select all", "type": "boolean" }, + "ClearInput": { + "title": "Clear previous selection", + "type": "boolean" + }, "Collect": { "title": "Collect results", "type": "boolean" @@ -2146,6 +2150,10 @@ "title": "Load all objects", "type": "boolean" }, + "ClearInput": { + "title": "Clear previous selection", + "type": "boolean" + }, "Collect": { "title": "Pass a slice of objects to one action, or trigger all actions in parallel", "type": "boolean" @@ -2202,6 +2210,10 @@ "title": "Remove job automatically once it is finished (success only)", "type": "boolean" }, + "AutoRestart": { + "title": "Start task as soon as server is started", + "type": "boolean" + }, "AutoStart": { "title": "Start task as soon as job is inserted", "type": "boolean" @@ -2437,6 +2449,10 @@ "title": "Select all files - ignore any other condition", "type": "boolean" }, + "ClearInput": { + "title": "Clear previous selection", + "type": "boolean" + }, "Collect": { "title": "Whether to trigger one action per node or one action\nwith all nodes as selection", "type": "boolean" @@ -2577,6 +2593,10 @@ "title": "Select all users", "type": "boolean" }, + "ClearInput": { + "title": "Clear previous selection", + "type": "boolean" + }, "Collect": { "title": "Wether to trigger one action per user or one action\nwith all user as a selection", "type": "boolean" @@ -3294,6 +3314,11 @@ "title": "Access control for this Cell", "type": "object" }, + "AccessEnd": { + "format": "int64", + "title": "Timestamp after which the share is disabled", + "type": "string" + }, "Description": { "title": "Long description of the Cell (max 1000 chars)", "type": "string" @@ -3782,6 +3807,13 @@ "title": "Whether to query all services for the metadata they can contribute to enrich the node", "type": "boolean" }, + "Filters": { + "additionalProperties": { + "type": "string" + }, + "title": "Children Filtering", + "type": "object" + }, "Limit": { "format": "int32", "title": "Limit number of results", @@ -3799,6 +3831,14 @@ "title": "Start listing at a given position", "type": "integer" }, + "SortDirDesc": { + "title": "Sort descending (otherwise ascending)", + "type": "boolean" + }, + "SortField": { + "title": "Remote Sort on specific field", + "type": "string" + }, "Versions": { "title": "Load Versions of the given node", "type": "boolean" @@ -5162,6 +5202,14 @@ "title": "Send back all children of the node", "type": "boolean" }, + "SortDirDesc": { + "title": "Sort descending (otherwise ascending)", + "type": "boolean" + }, + "SortField": { + "title": "Remote Sort on specific field", + "type": "string" + }, "StatFlags": { "items": { "format": "int64", diff --git a/common/proto/rest/cellsapi-rest.validator.pb.go b/common/proto/rest/cellsapi-rest.validator.pb.go index 52857f951f..309305977e 100644 --- a/common/proto/rest/cellsapi-rest.validator.pb.go +++ b/common/proto/rest/cellsapi-rest.validator.pb.go @@ -7,19 +7,19 @@ import ( fmt "fmt" math "math" proto "google.golang.org/protobuf/proto" - _ "github.com/pydio/cells/v4/common/proto/jobs" - _ "github.com/pydio/cells/v4/common/proto/install" _ "github.com/pydio/cells/v4/common/proto/tree" - _ "github.com/pydio/cells/v4/common/proto/activity" - _ "github.com/pydio/cells/v4/common/proto/log" - _ "github.com/pydio/cells/v4/common/proto/ctl" - _ "github.com/pydio/cells/v4/common/proto/mailer" _ "github.com/pydio/cells/v4/common/proto/object" - _ "github.com/pydio/cells/v4/common/proto/update" + _ "github.com/pydio/cells/v4/common/proto/ctl" + _ "github.com/pydio/cells/v4/common/proto/registry" + _ "github.com/pydio/cells/v4/common/proto/activity" _ "github.com/pydio/cells/v4/common/proto/idm" + _ "github.com/pydio/cells/v4/common/proto/mailer" _ "github.com/pydio/cells/v4/common/proto/encryption" - _ "github.com/pydio/cells/v4/common/proto/registry" + _ "github.com/pydio/cells/v4/common/proto/log" _ "google.golang.org/genproto/googleapis/api/annotations" + _ "github.com/pydio/cells/v4/common/proto/jobs" + _ "github.com/pydio/cells/v4/common/proto/install" + _ "github.com/pydio/cells/v4/common/proto/update" _ "github.com/grpc-ecosystem/grpc-gateway/v2/protoc-gen-openapiv2/options" ) diff --git a/common/proto/rest/cellsapi-share.pb.go b/common/proto/rest/cellsapi-share.pb.go index 16ee068358..a6dccdf045 100644 --- a/common/proto/rest/cellsapi-share.pb.go +++ b/common/proto/rest/cellsapi-share.pb.go @@ -236,6 +236,8 @@ type Cell struct { RootNodes []*tree.Node `protobuf:"bytes,4,rep,name=RootNodes,proto3" json:"RootNodes,omitempty"` // Access control for this Cell ACLs map[string]*CellAcl `protobuf:"bytes,5,rep,name=ACLs,proto3" json:"ACLs,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + // Timestamp after which the share is disabled + AccessEnd int64 `protobuf:"varint,8,opt,name=AccessEnd,proto3" json:"AccessEnd,omitempty"` // Associated access policies Policies []*service.ResourcePolicy `protobuf:"bytes,6,rep,name=Policies,proto3" json:"Policies,omitempty"` // Whether these policies are currently editable @@ -309,6 +311,13 @@ func (x *Cell) GetACLs() map[string]*CellAcl { return nil } +func (x *Cell) GetAccessEnd() int64 { + if x != nil { + return x.AccessEnd + } + return 0 +} + func (x *Cell) GetPolicies() []*service.ResourcePolicy { if x != nil { return x.Policies @@ -1391,7 +1400,7 @@ var file_cellsapi_share_proto_rawDesc = []byte{ 0x75, 0x70, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x09, 0x2e, 0x69, 0x64, 0x6d, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x52, 0x05, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x12, 0x1d, 0x0a, 0x04, 0x52, 0x6f, 0x6c, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x09, 0x2e, 0x69, 0x64, 0x6d, 0x2e, 0x52, - 0x6f, 0x6c, 0x65, 0x52, 0x04, 0x52, 0x6f, 0x6c, 0x65, 0x22, 0xef, 0x02, 0x0a, 0x04, 0x43, 0x65, + 0x6f, 0x6c, 0x65, 0x52, 0x04, 0x52, 0x6f, 0x6c, 0x65, 0x22, 0x8d, 0x03, 0x0a, 0x04, 0x43, 0x65, 0x6c, 0x6c, 0x12, 0x12, 0x0a, 0x04, 0x55, 0x75, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x55, 0x75, 0x69, 0x64, 0x12, 0x1d, 0x0a, 0x05, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xe2, 0xdf, 0x1f, 0x03, 0x78, 0xf4, 0x03, 0x52, 0x05, @@ -1403,177 +1412,178 @@ var file_cellsapi_share_proto_rawDesc = []byte{ 0x09, 0x52, 0x6f, 0x6f, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x12, 0x28, 0x0a, 0x04, 0x41, 0x43, 0x4c, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x72, 0x65, 0x73, 0x74, 0x2e, 0x43, 0x65, 0x6c, 0x6c, 0x2e, 0x41, 0x43, 0x4c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, - 0x41, 0x43, 0x4c, 0x73, 0x12, 0x33, 0x0a, 0x08, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, - 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, - 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, - 0x08, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x12, 0x38, 0x0a, 0x17, 0x50, 0x6f, 0x6c, - 0x69, 0x63, 0x69, 0x65, 0x73, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x45, 0x64, 0x69, 0x74, - 0x61, 0x62, 0x6c, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x17, 0x50, 0x6f, 0x6c, 0x69, - 0x63, 0x69, 0x65, 0x73, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x45, 0x64, 0x69, 0x74, 0x61, - 0x62, 0x6c, 0x65, 0x1a, 0x46, 0x0a, 0x09, 0x41, 0x43, 0x4c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, - 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, - 0x65, 0x79, 0x12, 0x23, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x0d, 0x2e, 0x72, 0x65, 0x73, 0x74, 0x2e, 0x43, 0x65, 0x6c, 0x6c, 0x41, 0x63, 0x6c, - 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x55, 0x0a, 0x13, 0x53, - 0x68, 0x61, 0x72, 0x65, 0x4c, 0x69, 0x6e, 0x6b, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x55, 0x73, - 0x65, 0x72, 0x12, 0x18, 0x0a, 0x07, 0x44, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x07, 0x44, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x12, 0x24, 0x0a, 0x0d, - 0x44, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x05, 0x52, 0x0d, 0x44, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x43, 0x6f, 0x75, - 0x6e, 0x74, 0x22, 0xec, 0x06, 0x0a, 0x09, 0x53, 0x68, 0x61, 0x72, 0x65, 0x4c, 0x69, 0x6e, 0x6b, - 0x12, 0x12, 0x0a, 0x04, 0x55, 0x75, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, - 0x55, 0x75, 0x69, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x4c, 0x69, 0x6e, 0x6b, 0x48, 0x61, 0x73, 0x68, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x4c, 0x69, 0x6e, 0x6b, 0x48, 0x61, 0x73, 0x68, - 0x12, 0x18, 0x0a, 0x07, 0x4c, 0x69, 0x6e, 0x6b, 0x55, 0x72, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x07, 0x4c, 0x69, 0x6e, 0x6b, 0x55, 0x72, 0x6c, 0x12, 0x1d, 0x0a, 0x05, 0x4c, 0x61, - 0x62, 0x65, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xe2, 0xdf, 0x1f, 0x03, 0x78, - 0xf4, 0x03, 0x52, 0x05, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x12, 0x29, 0x0a, 0x0b, 0x44, 0x65, 0x73, - 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, - 0xe2, 0xdf, 0x1f, 0x03, 0x78, 0xe8, 0x07, 0x52, 0x0b, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, - 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x55, 0x73, 0x65, 0x72, 0x55, 0x75, 0x69, 0x64, - 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x55, 0x73, 0x65, 0x72, 0x55, 0x75, 0x69, 0x64, - 0x12, 0x1c, 0x0a, 0x09, 0x55, 0x73, 0x65, 0x72, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x18, 0x07, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x09, 0x55, 0x73, 0x65, 0x72, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x12, 0x2a, - 0x0a, 0x10, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x52, 0x65, 0x71, 0x75, 0x69, 0x72, - 0x65, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, - 0x72, 0x64, 0x52, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x12, 0x20, 0x0a, 0x0b, 0x41, 0x63, - 0x63, 0x65, 0x73, 0x73, 0x53, 0x74, 0x61, 0x72, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x03, 0x52, - 0x0b, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x53, 0x74, 0x61, 0x72, 0x74, 0x12, 0x1c, 0x0a, 0x09, - 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x45, 0x6e, 0x64, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x03, 0x52, - 0x09, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x45, 0x6e, 0x64, 0x12, 0x22, 0x0a, 0x0c, 0x4d, 0x61, - 0x78, 0x44, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x03, - 0x52, 0x0c, 0x4d, 0x61, 0x78, 0x44, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x12, 0x2a, - 0x0a, 0x10, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x44, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, - 0x64, 0x73, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x03, 0x52, 0x10, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, - 0x74, 0x44, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x12, 0x2a, 0x0a, 0x10, 0x56, 0x69, - 0x65, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x0d, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x56, 0x69, 0x65, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, - 0x74, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x42, 0x0a, 0x0b, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, - 0x55, 0x73, 0x65, 0x72, 0x73, 0x18, 0x0e, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x72, 0x65, - 0x73, 0x74, 0x2e, 0x53, 0x68, 0x61, 0x72, 0x65, 0x4c, 0x69, 0x6e, 0x6b, 0x2e, 0x54, 0x61, 0x72, - 0x67, 0x65, 0x74, 0x55, 0x73, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0b, 0x54, - 0x61, 0x72, 0x67, 0x65, 0x74, 0x55, 0x73, 0x65, 0x72, 0x73, 0x12, 0x34, 0x0a, 0x15, 0x52, 0x65, - 0x73, 0x74, 0x72, 0x69, 0x63, 0x74, 0x54, 0x6f, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x55, 0x73, - 0x65, 0x72, 0x73, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x08, 0x52, 0x15, 0x52, 0x65, 0x73, 0x74, 0x72, - 0x69, 0x63, 0x74, 0x54, 0x6f, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x55, 0x73, 0x65, 0x72, 0x73, - 0x12, 0x28, 0x0a, 0x09, 0x52, 0x6f, 0x6f, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x18, 0x10, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x0a, 0x2e, 0x74, 0x72, 0x65, 0x65, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x52, - 0x09, 0x52, 0x6f, 0x6f, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x12, 0x3b, 0x0a, 0x0b, 0x50, 0x65, - 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x11, 0x20, 0x03, 0x28, 0x0e, 0x32, - 0x19, 0x2e, 0x72, 0x65, 0x73, 0x74, 0x2e, 0x53, 0x68, 0x61, 0x72, 0x65, 0x4c, 0x69, 0x6e, 0x6b, - 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0b, 0x50, 0x65, 0x72, 0x6d, - 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x33, 0x0a, 0x08, 0x50, 0x6f, 0x6c, 0x69, 0x63, - 0x69, 0x65, 0x73, 0x18, 0x12, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x73, 0x65, 0x72, 0x76, - 0x69, 0x63, 0x65, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x50, 0x6f, 0x6c, 0x69, - 0x63, 0x79, 0x52, 0x08, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x12, 0x38, 0x0a, 0x17, - 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x45, - 0x64, 0x69, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x13, 0x20, 0x01, 0x28, 0x08, 0x52, 0x17, 0x50, - 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x45, 0x64, - 0x69, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x1a, 0x59, 0x0a, 0x10, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, - 0x55, 0x73, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, - 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2f, 0x0a, 0x05, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x72, 0x65, - 0x73, 0x74, 0x2e, 0x53, 0x68, 0x61, 0x72, 0x65, 0x4c, 0x69, 0x6e, 0x6b, 0x54, 0x61, 0x72, 0x67, - 0x65, 0x74, 0x55, 0x73, 0x65, 0x72, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, - 0x01, 0x22, 0x5a, 0x0a, 0x0e, 0x50, 0x75, 0x74, 0x43, 0x65, 0x6c, 0x6c, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x1e, 0x0a, 0x04, 0x52, 0x6f, 0x6f, 0x6d, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x0a, 0x2e, 0x72, 0x65, 0x73, 0x74, 0x2e, 0x43, 0x65, 0x6c, 0x6c, 0x52, 0x04, 0x52, - 0x6f, 0x6f, 0x6d, 0x12, 0x28, 0x0a, 0x0f, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x45, 0x6d, 0x70, - 0x74, 0x79, 0x52, 0x6f, 0x6f, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, 0x43, 0x72, - 0x65, 0x61, 0x74, 0x65, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x52, 0x6f, 0x6f, 0x74, 0x22, 0x24, 0x0a, - 0x0e, 0x47, 0x65, 0x74, 0x43, 0x65, 0x6c, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x12, 0x0a, 0x04, 0x55, 0x75, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x55, - 0x75, 0x69, 0x64, 0x22, 0x27, 0x0a, 0x11, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, 0x65, 0x6c, - 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x55, 0x75, 0x69, 0x64, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x55, 0x75, 0x69, 0x64, 0x22, 0x2e, 0x0a, 0x12, - 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, 0x65, 0x6c, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x07, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x22, 0x29, 0x0a, 0x13, - 0x47, 0x65, 0x74, 0x53, 0x68, 0x61, 0x72, 0x65, 0x4c, 0x69, 0x6e, 0x6b, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x55, 0x75, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x04, 0x55, 0x75, 0x69, 0x64, 0x22, 0xea, 0x01, 0x0a, 0x13, 0x50, 0x75, 0x74, 0x53, - 0x68, 0x61, 0x72, 0x65, 0x4c, 0x69, 0x6e, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x2d, 0x0a, 0x09, 0x53, 0x68, 0x61, 0x72, 0x65, 0x4c, 0x69, 0x6e, 0x6b, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x72, 0x65, 0x73, 0x74, 0x2e, 0x53, 0x68, 0x61, 0x72, 0x65, 0x4c, - 0x69, 0x6e, 0x6b, 0x52, 0x09, 0x53, 0x68, 0x61, 0x72, 0x65, 0x4c, 0x69, 0x6e, 0x6b, 0x12, 0x28, - 0x0a, 0x0f, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, - 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, - 0x64, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x26, 0x0a, 0x0e, 0x43, 0x72, 0x65, 0x61, - 0x74, 0x65, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, - 0x12, 0x26, 0x0a, 0x0e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, - 0x72, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, - 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x2a, 0x0a, 0x10, 0x55, 0x70, 0x64, 0x61, - 0x74, 0x65, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x48, 0x61, 0x73, 0x68, 0x18, 0x05, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x10, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, - 0x48, 0x61, 0x73, 0x68, 0x22, 0x2c, 0x0a, 0x16, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x53, 0x68, - 0x61, 0x72, 0x65, 0x4c, 0x69, 0x6e, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, - 0x0a, 0x04, 0x55, 0x75, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x55, 0x75, - 0x69, 0x64, 0x22, 0x33, 0x0a, 0x17, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x53, 0x68, 0x61, 0x72, - 0x65, 0x4c, 0x69, 0x6e, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, - 0x07, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, - 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x22, 0x8a, 0x02, 0x0a, 0x1a, 0x4c, 0x69, 0x73, 0x74, - 0x53, 0x68, 0x61, 0x72, 0x65, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x4c, 0x0a, 0x09, 0x53, 0x68, 0x61, 0x72, 0x65, 0x54, - 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2e, 0x2e, 0x72, 0x65, 0x73, 0x74, - 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x68, 0x61, 0x72, 0x65, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, - 0x72, 0x63, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x4c, 0x69, 0x73, 0x74, - 0x53, 0x68, 0x61, 0x72, 0x65, 0x54, 0x79, 0x70, 0x65, 0x52, 0x09, 0x53, 0x68, 0x61, 0x72, 0x65, - 0x54, 0x79, 0x70, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x53, 0x75, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x53, 0x75, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x26, - 0x0a, 0x0e, 0x4f, 0x77, 0x6e, 0x65, 0x64, 0x42, 0x79, 0x53, 0x75, 0x62, 0x6a, 0x65, 0x63, 0x74, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x4f, 0x77, 0x6e, 0x65, 0x64, 0x42, 0x79, 0x53, - 0x75, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, - 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x12, 0x14, - 0x0a, 0x05, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x4c, - 0x69, 0x6d, 0x69, 0x74, 0x22, 0x2e, 0x0a, 0x0d, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x68, 0x61, 0x72, - 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x07, 0x0a, 0x03, 0x41, 0x4e, 0x59, 0x10, 0x00, 0x12, 0x09, - 0x0a, 0x05, 0x4c, 0x49, 0x4e, 0x4b, 0x53, 0x10, 0x01, 0x12, 0x09, 0x0a, 0x05, 0x43, 0x45, 0x4c, - 0x4c, 0x53, 0x10, 0x02, 0x22, 0xaa, 0x02, 0x0a, 0x1b, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x68, 0x61, - 0x72, 0x65, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4e, 0x0a, 0x09, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, - 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x72, 0x65, 0x73, 0x74, 0x2e, 0x4c, - 0x69, 0x73, 0x74, 0x53, 0x68, 0x61, 0x72, 0x65, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, - 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x53, 0x68, 0x61, 0x72, 0x65, - 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x09, 0x52, 0x65, 0x73, 0x6f, 0x75, - 0x72, 0x63, 0x65, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x12, 0x14, 0x0a, 0x05, - 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x4c, 0x69, 0x6d, - 0x69, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x05, 0x52, 0x05, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x1a, 0x77, 0x0a, 0x0e, 0x53, 0x68, 0x61, 0x72, - 0x65, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x1e, 0x0a, 0x04, 0x4e, 0x6f, - 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0a, 0x2e, 0x74, 0x72, 0x65, 0x65, 0x2e, - 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x04, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x23, 0x0a, 0x04, 0x4c, 0x69, - 0x6e, 0x6b, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x72, 0x65, 0x73, 0x74, 0x2e, - 0x53, 0x68, 0x61, 0x72, 0x65, 0x4c, 0x69, 0x6e, 0x6b, 0x52, 0x04, 0x4c, 0x69, 0x6e, 0x6b, 0x12, - 0x20, 0x0a, 0x05, 0x43, 0x65, 0x6c, 0x6c, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0a, - 0x2e, 0x72, 0x65, 0x73, 0x74, 0x2e, 0x43, 0x65, 0x6c, 0x6c, 0x52, 0x05, 0x43, 0x65, 0x6c, 0x6c, - 0x73, 0x22, 0x65, 0x0a, 0x1a, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x53, 0x68, 0x61, 0x72, 0x65, - 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x12, 0x0a, 0x04, 0x55, 0x75, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x55, - 0x75, 0x69, 0x64, 0x12, 0x33, 0x0a, 0x08, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x18, - 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, - 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x08, - 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x22, 0xa6, 0x01, 0x0a, 0x1b, 0x55, 0x70, 0x64, - 0x61, 0x74, 0x65, 0x53, 0x68, 0x61, 0x72, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x53, 0x75, 0x63, 0x63, - 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x53, 0x75, 0x63, 0x63, 0x65, - 0x73, 0x73, 0x12, 0x33, 0x0a, 0x08, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x18, 0x02, + 0x41, 0x43, 0x4c, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x45, 0x6e, + 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x45, + 0x6e, 0x64, 0x12, 0x33, 0x0a, 0x08, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x08, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x12, 0x38, 0x0a, 0x17, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x45, 0x64, 0x69, 0x74, 0x61, 0x62, - 0x6c, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x17, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, + 0x6c, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x17, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x45, 0x64, 0x69, 0x74, 0x61, 0x62, 0x6c, - 0x65, 0x2a, 0x4a, 0x0a, 0x13, 0x53, 0x68, 0x61, 0x72, 0x65, 0x4c, 0x69, 0x6e, 0x6b, 0x41, 0x63, - 0x63, 0x65, 0x73, 0x73, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0c, 0x0a, 0x08, 0x4e, 0x6f, 0x41, 0x63, - 0x63, 0x65, 0x73, 0x73, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x50, 0x72, 0x65, 0x76, 0x69, 0x65, - 0x77, 0x10, 0x01, 0x12, 0x0c, 0x0a, 0x08, 0x44, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x10, - 0x02, 0x12, 0x0a, 0x0a, 0x06, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x10, 0x03, 0x42, 0x2a, 0x5a, - 0x28, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x70, 0x79, 0x64, 0x69, - 0x6f, 0x2f, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2f, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x72, 0x65, 0x73, 0x74, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x33, + 0x65, 0x1a, 0x46, 0x0a, 0x09, 0x41, 0x43, 0x4c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, + 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, + 0x12, 0x23, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x0d, 0x2e, 0x72, 0x65, 0x73, 0x74, 0x2e, 0x43, 0x65, 0x6c, 0x6c, 0x41, 0x63, 0x6c, 0x52, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x55, 0x0a, 0x13, 0x53, 0x68, 0x61, + 0x72, 0x65, 0x4c, 0x69, 0x6e, 0x6b, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x55, 0x73, 0x65, 0x72, + 0x12, 0x18, 0x0a, 0x07, 0x44, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x07, 0x44, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x12, 0x24, 0x0a, 0x0d, 0x44, 0x6f, + 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x05, 0x52, 0x0d, 0x44, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x43, 0x6f, 0x75, 0x6e, 0x74, + 0x22, 0xec, 0x06, 0x0a, 0x09, 0x53, 0x68, 0x61, 0x72, 0x65, 0x4c, 0x69, 0x6e, 0x6b, 0x12, 0x12, + 0x0a, 0x04, 0x55, 0x75, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x55, 0x75, + 0x69, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x4c, 0x69, 0x6e, 0x6b, 0x48, 0x61, 0x73, 0x68, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x4c, 0x69, 0x6e, 0x6b, 0x48, 0x61, 0x73, 0x68, 0x12, 0x18, + 0x0a, 0x07, 0x4c, 0x69, 0x6e, 0x6b, 0x55, 0x72, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x07, 0x4c, 0x69, 0x6e, 0x6b, 0x55, 0x72, 0x6c, 0x12, 0x1d, 0x0a, 0x05, 0x4c, 0x61, 0x62, 0x65, + 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xe2, 0xdf, 0x1f, 0x03, 0x78, 0xf4, 0x03, + 0x52, 0x05, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x12, 0x29, 0x0a, 0x0b, 0x44, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xe2, 0xdf, + 0x1f, 0x03, 0x78, 0xe8, 0x07, 0x52, 0x0b, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x55, 0x73, 0x65, 0x72, 0x55, 0x75, 0x69, 0x64, 0x18, 0x06, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x55, 0x73, 0x65, 0x72, 0x55, 0x75, 0x69, 0x64, 0x12, 0x1c, + 0x0a, 0x09, 0x55, 0x73, 0x65, 0x72, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x09, 0x55, 0x73, 0x65, 0x72, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x12, 0x2a, 0x0a, 0x10, + 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x52, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, + 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, + 0x52, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x12, 0x20, 0x0a, 0x0b, 0x41, 0x63, 0x63, 0x65, + 0x73, 0x73, 0x53, 0x74, 0x61, 0x72, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x41, + 0x63, 0x63, 0x65, 0x73, 0x73, 0x53, 0x74, 0x61, 0x72, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x41, 0x63, + 0x63, 0x65, 0x73, 0x73, 0x45, 0x6e, 0x64, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x41, + 0x63, 0x63, 0x65, 0x73, 0x73, 0x45, 0x6e, 0x64, 0x12, 0x22, 0x0a, 0x0c, 0x4d, 0x61, 0x78, 0x44, + 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, + 0x4d, 0x61, 0x78, 0x44, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x12, 0x2a, 0x0a, 0x10, + 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x44, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x73, + 0x18, 0x0c, 0x20, 0x01, 0x28, 0x03, 0x52, 0x10, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x44, + 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x12, 0x2a, 0x0a, 0x10, 0x56, 0x69, 0x65, 0x77, + 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x0d, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x10, 0x56, 0x69, 0x65, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, + 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x42, 0x0a, 0x0b, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x55, 0x73, + 0x65, 0x72, 0x73, 0x18, 0x0e, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x72, 0x65, 0x73, 0x74, + 0x2e, 0x53, 0x68, 0x61, 0x72, 0x65, 0x4c, 0x69, 0x6e, 0x6b, 0x2e, 0x54, 0x61, 0x72, 0x67, 0x65, + 0x74, 0x55, 0x73, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0b, 0x54, 0x61, 0x72, + 0x67, 0x65, 0x74, 0x55, 0x73, 0x65, 0x72, 0x73, 0x12, 0x34, 0x0a, 0x15, 0x52, 0x65, 0x73, 0x74, + 0x72, 0x69, 0x63, 0x74, 0x54, 0x6f, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x55, 0x73, 0x65, 0x72, + 0x73, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x08, 0x52, 0x15, 0x52, 0x65, 0x73, 0x74, 0x72, 0x69, 0x63, + 0x74, 0x54, 0x6f, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x55, 0x73, 0x65, 0x72, 0x73, 0x12, 0x28, + 0x0a, 0x09, 0x52, 0x6f, 0x6f, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x18, 0x10, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x0a, 0x2e, 0x74, 0x72, 0x65, 0x65, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x09, 0x52, + 0x6f, 0x6f, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x12, 0x3b, 0x0a, 0x0b, 0x50, 0x65, 0x72, 0x6d, + 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x11, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x19, 0x2e, + 0x72, 0x65, 0x73, 0x74, 0x2e, 0x53, 0x68, 0x61, 0x72, 0x65, 0x4c, 0x69, 0x6e, 0x6b, 0x41, 0x63, + 0x63, 0x65, 0x73, 0x73, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0b, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, + 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x33, 0x0a, 0x08, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, + 0x73, 0x18, 0x12, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, + 0x65, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, + 0x52, 0x08, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x12, 0x38, 0x0a, 0x17, 0x50, 0x6f, + 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x45, 0x64, 0x69, + 0x74, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x13, 0x20, 0x01, 0x28, 0x08, 0x52, 0x17, 0x50, 0x6f, 0x6c, + 0x69, 0x63, 0x69, 0x65, 0x73, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x45, 0x64, 0x69, 0x74, + 0x61, 0x62, 0x6c, 0x65, 0x1a, 0x59, 0x0a, 0x10, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x55, 0x73, + 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2f, 0x0a, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x72, 0x65, 0x73, 0x74, + 0x2e, 0x53, 0x68, 0x61, 0x72, 0x65, 0x4c, 0x69, 0x6e, 0x6b, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, + 0x55, 0x73, 0x65, 0x72, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, + 0x5a, 0x0a, 0x0e, 0x50, 0x75, 0x74, 0x43, 0x65, 0x6c, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x1e, 0x0a, 0x04, 0x52, 0x6f, 0x6f, 0x6d, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x0a, 0x2e, 0x72, 0x65, 0x73, 0x74, 0x2e, 0x43, 0x65, 0x6c, 0x6c, 0x52, 0x04, 0x52, 0x6f, 0x6f, + 0x6d, 0x12, 0x28, 0x0a, 0x0f, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x45, 0x6d, 0x70, 0x74, 0x79, + 0x52, 0x6f, 0x6f, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, 0x43, 0x72, 0x65, 0x61, + 0x74, 0x65, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x52, 0x6f, 0x6f, 0x74, 0x22, 0x24, 0x0a, 0x0e, 0x47, + 0x65, 0x74, 0x43, 0x65, 0x6c, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, + 0x04, 0x55, 0x75, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x55, 0x75, 0x69, + 0x64, 0x22, 0x27, 0x0a, 0x11, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, 0x65, 0x6c, 0x6c, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x55, 0x75, 0x69, 0x64, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x55, 0x75, 0x69, 0x64, 0x22, 0x2e, 0x0a, 0x12, 0x44, 0x65, + 0x6c, 0x65, 0x74, 0x65, 0x43, 0x65, 0x6c, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x18, 0x0a, 0x07, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x07, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x22, 0x29, 0x0a, 0x13, 0x47, 0x65, + 0x74, 0x53, 0x68, 0x61, 0x72, 0x65, 0x4c, 0x69, 0x6e, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x12, 0x0a, 0x04, 0x55, 0x75, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x04, 0x55, 0x75, 0x69, 0x64, 0x22, 0xea, 0x01, 0x0a, 0x13, 0x50, 0x75, 0x74, 0x53, 0x68, 0x61, + 0x72, 0x65, 0x4c, 0x69, 0x6e, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2d, 0x0a, + 0x09, 0x53, 0x68, 0x61, 0x72, 0x65, 0x4c, 0x69, 0x6e, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x0f, 0x2e, 0x72, 0x65, 0x73, 0x74, 0x2e, 0x53, 0x68, 0x61, 0x72, 0x65, 0x4c, 0x69, 0x6e, + 0x6b, 0x52, 0x09, 0x53, 0x68, 0x61, 0x72, 0x65, 0x4c, 0x69, 0x6e, 0x6b, 0x12, 0x28, 0x0a, 0x0f, + 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x45, + 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x26, 0x0a, 0x0e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, + 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, + 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x26, + 0x0a, 0x0e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x50, 0x61, + 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x2a, 0x0a, 0x10, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, + 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x48, 0x61, 0x73, 0x68, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x10, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x48, 0x61, + 0x73, 0x68, 0x22, 0x2c, 0x0a, 0x16, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x53, 0x68, 0x61, 0x72, + 0x65, 0x4c, 0x69, 0x6e, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, + 0x55, 0x75, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x55, 0x75, 0x69, 0x64, + 0x22, 0x33, 0x0a, 0x17, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x53, 0x68, 0x61, 0x72, 0x65, 0x4c, + 0x69, 0x6e, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x53, + 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x53, 0x75, + 0x63, 0x63, 0x65, 0x73, 0x73, 0x22, 0x8a, 0x02, 0x0a, 0x1a, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x68, + 0x61, 0x72, 0x65, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x4c, 0x0a, 0x09, 0x53, 0x68, 0x61, 0x72, 0x65, 0x54, 0x79, 0x70, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2e, 0x2e, 0x72, 0x65, 0x73, 0x74, 0x2e, 0x4c, + 0x69, 0x73, 0x74, 0x53, 0x68, 0x61, 0x72, 0x65, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, + 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x68, + 0x61, 0x72, 0x65, 0x54, 0x79, 0x70, 0x65, 0x52, 0x09, 0x53, 0x68, 0x61, 0x72, 0x65, 0x54, 0x79, + 0x70, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x53, 0x75, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x07, 0x53, 0x75, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x26, 0x0a, 0x0e, + 0x4f, 0x77, 0x6e, 0x65, 0x64, 0x42, 0x79, 0x53, 0x75, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x4f, 0x77, 0x6e, 0x65, 0x64, 0x42, 0x79, 0x53, 0x75, 0x62, + 0x6a, 0x65, 0x63, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x12, 0x14, 0x0a, 0x05, + 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x4c, 0x69, 0x6d, + 0x69, 0x74, 0x22, 0x2e, 0x0a, 0x0d, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x68, 0x61, 0x72, 0x65, 0x54, + 0x79, 0x70, 0x65, 0x12, 0x07, 0x0a, 0x03, 0x41, 0x4e, 0x59, 0x10, 0x00, 0x12, 0x09, 0x0a, 0x05, + 0x4c, 0x49, 0x4e, 0x4b, 0x53, 0x10, 0x01, 0x12, 0x09, 0x0a, 0x05, 0x43, 0x45, 0x4c, 0x4c, 0x53, + 0x10, 0x02, 0x22, 0xaa, 0x02, 0x0a, 0x1b, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x68, 0x61, 0x72, 0x65, + 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x4e, 0x0a, 0x09, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x18, + 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x72, 0x65, 0x73, 0x74, 0x2e, 0x4c, 0x69, 0x73, + 0x74, 0x53, 0x68, 0x61, 0x72, 0x65, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x53, 0x68, 0x61, 0x72, 0x65, 0x64, 0x52, + 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x09, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, + 0x65, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x05, 0x52, 0x06, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x4c, 0x69, + 0x6d, 0x69, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x4c, 0x69, 0x6d, 0x69, 0x74, + 0x12, 0x14, 0x0a, 0x05, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, + 0x05, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x1a, 0x77, 0x0a, 0x0e, 0x53, 0x68, 0x61, 0x72, 0x65, 0x64, + 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x1e, 0x0a, 0x04, 0x4e, 0x6f, 0x64, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0a, 0x2e, 0x74, 0x72, 0x65, 0x65, 0x2e, 0x4e, 0x6f, + 0x64, 0x65, 0x52, 0x04, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x23, 0x0a, 0x04, 0x4c, 0x69, 0x6e, 0x6b, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x72, 0x65, 0x73, 0x74, 0x2e, 0x53, 0x68, + 0x61, 0x72, 0x65, 0x4c, 0x69, 0x6e, 0x6b, 0x52, 0x04, 0x4c, 0x69, 0x6e, 0x6b, 0x12, 0x20, 0x0a, + 0x05, 0x43, 0x65, 0x6c, 0x6c, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0a, 0x2e, 0x72, + 0x65, 0x73, 0x74, 0x2e, 0x43, 0x65, 0x6c, 0x6c, 0x52, 0x05, 0x43, 0x65, 0x6c, 0x6c, 0x73, 0x22, + 0x65, 0x0a, 0x1a, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x53, 0x68, 0x61, 0x72, 0x65, 0x50, 0x6f, + 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, + 0x04, 0x55, 0x75, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x55, 0x75, 0x69, + 0x64, 0x12, 0x33, 0x0a, 0x08, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x18, 0x02, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x52, 0x65, + 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x08, 0x50, 0x6f, + 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x22, 0xa6, 0x01, 0x0a, 0x1b, 0x55, 0x70, 0x64, 0x61, 0x74, + 0x65, 0x53, 0x68, 0x61, 0x72, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, + 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, + 0x12, 0x33, 0x0a, 0x08, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x52, 0x65, 0x73, + 0x6f, 0x75, 0x72, 0x63, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x08, 0x50, 0x6f, 0x6c, + 0x69, 0x63, 0x69, 0x65, 0x73, 0x12, 0x38, 0x0a, 0x17, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, + 0x73, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x45, 0x64, 0x69, 0x74, 0x61, 0x62, 0x6c, 0x65, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x17, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, + 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x45, 0x64, 0x69, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2a, + 0x4a, 0x0a, 0x13, 0x53, 0x68, 0x61, 0x72, 0x65, 0x4c, 0x69, 0x6e, 0x6b, 0x41, 0x63, 0x63, 0x65, + 0x73, 0x73, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0c, 0x0a, 0x08, 0x4e, 0x6f, 0x41, 0x63, 0x63, 0x65, + 0x73, 0x73, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x50, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x10, + 0x01, 0x12, 0x0c, 0x0a, 0x08, 0x44, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x10, 0x02, 0x12, + 0x0a, 0x0a, 0x06, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x10, 0x03, 0x42, 0x2a, 0x5a, 0x28, 0x67, + 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x70, 0x79, 0x64, 0x69, 0x6f, 0x2f, + 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2f, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x2f, 0x72, 0x65, 0x73, 0x74, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( diff --git a/common/proto/rest/cellsapi-share.proto b/common/proto/rest/cellsapi-share.proto index e601acf4ca..1f663b1393 100644 --- a/common/proto/rest/cellsapi-share.proto +++ b/common/proto/rest/cellsapi-share.proto @@ -37,6 +37,8 @@ message Cell { repeated tree.Node RootNodes = 4; // Access control for this Cell map ACLs = 5; + // Timestamp after which the share is disabled + int64 AccessEnd = 8; // Associated access policies repeated service.ResourcePolicy Policies = 6; // Whether these policies are currently editable diff --git a/common/proto/rest/cellsapi-share.validator.pb.go b/common/proto/rest/cellsapi-share.validator.pb.go index 3a62c1acee..2a54a4f9c4 100644 --- a/common/proto/rest/cellsapi-share.validator.pb.go +++ b/common/proto/rest/cellsapi-share.validator.pb.go @@ -7,10 +7,10 @@ import ( fmt "fmt" math "math" proto "google.golang.org/protobuf/proto" + _ "github.com/mwitkow/go-proto-validators" _ "github.com/pydio/cells/v4/common/proto/service" _ "github.com/pydio/cells/v4/common/proto/idm" _ "github.com/pydio/cells/v4/common/proto/tree" - _ "github.com/mwitkow/go-proto-validators" github_com_mwitkow_go_proto_validators "github.com/mwitkow/go-proto-validators" ) diff --git a/common/proto/tree/cells-tree.pb.go b/common/proto/tree/cells-tree.pb.go index c3a2045739..d4a38a2113 100644 --- a/common/proto/tree/cells-tree.pb.go +++ b/common/proto/tree/cells-tree.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.27.1 -// protoc v3.18.1 +// protoc-gen-go v1.28.1 +// protoc (unknown) // source: cells-tree.proto package tree @@ -398,6 +398,10 @@ type ListNodesRequest struct { FilterType NodeType `protobuf:"varint,6,opt,name=FilterType,proto3,enum=tree.NodeType" json:"FilterType,omitempty"` // Generic Details Flags StatFlags []uint32 `protobuf:"varint,9,rep,packed,name=StatFlags,proto3" json:"StatFlags,omitempty"` + // Remote Sort on specific field + SortField string `protobuf:"bytes,10,opt,name=SortField,proto3" json:"SortField,omitempty"` + // Sort descending (otherwise ascending) + SortDirDesc bool `protobuf:"varint,11,opt,name=SortDirDesc,proto3" json:"SortDirDesc,omitempty"` // Sends the list of commits for a given node (Deprecated) WithCommits bool `protobuf:"varint,8,opt,name=WithCommits,proto3" json:"WithCommits,omitempty"` } @@ -490,6 +494,20 @@ func (x *ListNodesRequest) GetStatFlags() []uint32 { return nil } +func (x *ListNodesRequest) GetSortField() string { + if x != nil { + return x.SortField + } + return "" +} + +func (x *ListNodesRequest) GetSortDirDesc() bool { + if x != nil { + return x.SortDirDesc + } + return false +} + func (x *ListNodesRequest) GetWithCommits() bool { if x != nil { return x.WithCommits @@ -550,6 +568,7 @@ type WrappingStreamerResponse struct { unknownFields protoimpl.UnknownFields // Types that are assignable to Data: + // // *WrappingStreamerResponse_ListNodesResponse // *WrappingStreamerResponse_NodeChangeEvent Data isWrappingStreamerResponse_Data `protobuf_oneof:"Data"` @@ -2788,37 +2807,47 @@ type Query struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - // Preset list of nodes by Path + // List of nodes paths, exactly matching Paths []string `protobuf:"bytes,13,rep,name=Paths,proto3" json:"Paths,omitempty"` - // Limit to a given subtree + // Recursive listing of nodes below a given path. Combine with the PathDepth parameter to limit request results PathPrefix []string `protobuf:"bytes,1,rep,name=PathPrefix,proto3" json:"PathPrefix,omitempty"` - // Range for size + // Range for file size - size bigger than MinSize int64 `protobuf:"varint,2,opt,name=MinSize,proto3" json:"MinSize,omitempty"` + // Range for file size - size is smaller than MaxSize int64 `protobuf:"varint,3,opt,name=MaxSize,proto3" json:"MaxSize,omitempty"` - // Range for date + // Range for modification date - node was modified after this date MinDate int64 `protobuf:"varint,4,opt,name=MinDate,proto3" json:"MinDate,omitempty"` + // Range for modification date - node was modified before this date MaxDate int64 `protobuf:"varint,5,opt,name=MaxDate,proto3" json:"MaxDate,omitempty"` - // Pass a duration with > or < to compute MinDate / MaxDate + // Compute MinDate/MaxDate with a Golang duration with a leading comparator (> or <) + // Duration may contain "s" second, "m" minute, "d" day. + // Example: ">10m" for files modified before 10minutes ago DurationDate string `protobuf:"bytes,16,opt,name=DurationDate,proto3" json:"DurationDate,omitempty"` - // Limit to a given node type + // Limit to a given node type (file or folder) Type NodeType `protobuf:"varint,6,opt,name=Type,proto3,enum=tree.NodeType" json:"Type,omitempty"` - // Search in filename + // Lookup by file basename FileName string `protobuf:"bytes,7,opt,name=FileName,proto3" json:"FileName,omitempty"` - // Search in content + // Search in textual content (if search engine has this feature enabled) Content string `protobuf:"bytes,8,opt,name=Content,proto3" json:"Content,omitempty"` - // Search in either filename or content (but at least one of them) + // Search in either filename or content (if search engine has this feature enabled) FileNameOrContent string `protobuf:"bytes,17,opt,name=FileNameOrContent,proto3" json:"FileNameOrContent,omitempty"` - // Free Query String (for metadata) + // Bleve-like search query to search for a specific metadata value. + // When querying nodes, this will redirect this query to the Search Engine. When filtering an input, this will load an in-memory bleve engine to evaluate the node. + // + // Bleve query string format is a space separated list of `[+-]key:value`, where node meta keys must be prepended with "Meta." + // For Example, for tags: `+Meta.usermeta-tags:myvalue` FreeString string `protobuf:"bytes,9,opt,name=FreeString,proto3" json:"FreeString,omitempty"` - // Look for a specific eTag value + // Look for a specific ETag value, may only be useful to lookup for files with __temporary__ ETag ETag string `protobuf:"bytes,18,opt,name=ETag,proto3" json:"ETag,omitempty"` - // Search files by extension + // Search files by their extension, use pipe symbol | if you wish to allow many extensions. + // Example png|pdf|jpg Extension string `protobuf:"bytes,10,opt,name=Extension,proto3" json:"Extension,omitempty"` // Search geographically GeoQuery *GeoQuery `protobuf:"bytes,11,opt,name=GeoQuery,proto3" json:"GeoQuery,omitempty"` - // Limit to a given level of the tree - can be used in filters + // Restrict recursive listing to a given level of the tree starting from root. + // Special value "-1" should list only one level in the folder defined by PathPrefix PathDepth int32 `protobuf:"varint,12,opt,name=PathDepth,proto3" json:"PathDepth,omitempty"` - // Preset list of Node by UUIDs + // Preset list of specific node defined by their UUIDs UUIDs []string `protobuf:"bytes,15,rep,name=UUIDs,proto3" json:"UUIDs,omitempty"` // Negate this query Not bool `protobuf:"varint,14,opt,name=Not,proto3" json:"Not,omitempty"` @@ -3752,7 +3781,7 @@ var file_cells_tree_proto_rawDesc = []byte{ 0x12, 0x18, 0x0a, 0x07, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x12, 0x1e, 0x0a, 0x04, 0x4e, 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0a, 0x2e, 0x74, 0x72, 0x65, 0x65, 0x2e, - 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x04, 0x4e, 0x6f, 0x64, 0x65, 0x22, 0xb0, 0x02, 0x0a, 0x10, 0x4c, + 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x04, 0x4e, 0x6f, 0x64, 0x65, 0x22, 0xf0, 0x02, 0x0a, 0x10, 0x4c, 0x69, 0x73, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1e, 0x0a, 0x04, 0x4e, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0a, 0x2e, 0x74, 0x72, 0x65, 0x65, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x04, 0x4e, 0x6f, 0x64, 0x65, 0x12, @@ -3769,7 +3798,11 @@ var file_cells_tree_proto_rawDesc = []byte{ 0x0e, 0x32, 0x0e, 0x2e, 0x74, 0x72, 0x65, 0x65, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0a, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x53, 0x74, 0x61, 0x74, 0x46, 0x6c, 0x61, 0x67, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0d, - 0x52, 0x09, 0x53, 0x74, 0x61, 0x74, 0x46, 0x6c, 0x61, 0x67, 0x73, 0x12, 0x20, 0x0a, 0x0b, 0x57, + 0x52, 0x09, 0x53, 0x74, 0x61, 0x74, 0x46, 0x6c, 0x61, 0x67, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x53, + 0x6f, 0x72, 0x74, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, + 0x53, 0x6f, 0x72, 0x74, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x20, 0x0a, 0x0b, 0x53, 0x6f, 0x72, + 0x74, 0x44, 0x69, 0x72, 0x44, 0x65, 0x73, 0x63, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, + 0x53, 0x6f, 0x72, 0x74, 0x44, 0x69, 0x72, 0x44, 0x65, 0x73, 0x63, 0x12, 0x20, 0x0a, 0x0b, 0x57, 0x69, 0x74, 0x68, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x57, 0x69, 0x74, 0x68, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x73, 0x22, 0x33, 0x0a, 0x11, 0x4c, 0x69, 0x73, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, diff --git a/common/proto/tree/cells-tree.proto b/common/proto/tree/cells-tree.proto index 464ca8bbbd..570833c405 100644 --- a/common/proto/tree/cells-tree.proto +++ b/common/proto/tree/cells-tree.proto @@ -62,6 +62,11 @@ message ListNodesRequest { // Generic Details Flags repeated uint32 StatFlags = 9; + // Remote Sort on specific field + string SortField = 10; + // Sort descending (otherwise ascending) + bool SortDirDesc = 11; + // Sends the list of commits for a given node (Deprecated) bool WithCommits = 8; } diff --git a/common/proto/tree/cells-tree_grpc.enhanced.pb.go b/common/proto/tree/cells-tree_grpc.enhanced.pb.go index ec82575432..fbd23487b6 100644 --- a/common/proto/tree/cells-tree_grpc.enhanced.pb.go +++ b/common/proto/tree/cells-tree_grpc.enhanced.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go-grpc. DO NOT EDIT. // versions: // - protoc-gen-go-grpc v1.1.0 -// - protoc v3.18.1 +// - protoc (unknown) // source: cells-tree.proto package tree diff --git a/common/proto/tree/cells-tree_grpc.stub.pb.go b/common/proto/tree/cells-tree_grpc.stub.pb.go index 48f7d4669b..49a4f5be58 100644 --- a/common/proto/tree/cells-tree_grpc.stub.pb.go +++ b/common/proto/tree/cells-tree_grpc.stub.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go-grpc. DO NOT EDIT. // versions: -// - protoc-gen-go-client-stub v1.1.0 -// - protoc v3.18.1 +// - protoc-gen-go-client-stub v1.2.0 +// - protoc (unknown) // source: cells-tree.proto package tree @@ -12,6 +12,7 @@ import ( stubs "github.com/pydio/cells/v4/common/server/stubs" grpc "google.golang.org/grpc" io "io" + time "time" ) // This is a compile-time assertion to ensure that this generated file @@ -45,10 +46,15 @@ func (s *NodeProviderStub) NewStream(ctx context.Context, desc *grpc.StreamDesc, case "/tree.NodeProvider/ListNodes": st := &NodeProviderStub_ListNodesStreamer{} st.Init(ctx, func(i interface{}) error { - defer func() { - close(st.RespChan) + var e error + go func() { + defer func() { + close(st.RespChan) + }() + e = s.NodeProviderServer.ListNodes(i.(*ListNodesRequest), st) }() - return s.NodeProviderServer.ListNodes(i.(*ListNodesRequest), st) + <-time.After(100 * time.Millisecond) + return e }) return st, nil } @@ -124,10 +130,15 @@ func (s *NodeChangesStreamerStub) NewStream(ctx context.Context, desc *grpc.Stre case "/tree.NodeChangesStreamer/StreamChanges": st := &NodeChangesStreamerStub_StreamChangesStreamer{} st.Init(ctx, func(i interface{}) error { - defer func() { - close(st.RespChan) + var e error + go func() { + defer func() { + close(st.RespChan) + }() + e = s.NodeChangesStreamerServer.StreamChanges(i.(*StreamChangesRequest), st) }() - return s.NodeChangesStreamerServer.StreamChanges(i.(*StreamChangesRequest), st) + <-time.After(100 * time.Millisecond) + return e }) return st, nil } @@ -368,10 +379,15 @@ func (s *NodeEventsProviderStub) NewStream(ctx context.Context, desc *grpc.Strea case "/tree.NodeEventsProvider/WatchNode": st := &NodeEventsProviderStub_WatchNodeStreamer{} st.Init(ctx, func(i interface{}) error { - defer func() { - close(st.RespChan) + var e error + go func() { + defer func() { + close(st.RespChan) + }() + e = s.NodeEventsProviderServer.WatchNode(i.(*WatchNodeRequest), st) }() - return s.NodeEventsProviderServer.WatchNode(i.(*WatchNodeRequest), st) + <-time.After(100 * time.Millisecond) + return e }) return st, nil } @@ -406,10 +422,15 @@ func (s *SearcherStub) NewStream(ctx context.Context, desc *grpc.StreamDesc, met case "/tree.Searcher/Search": st := &SearcherStub_SearchStreamer{} st.Init(ctx, func(i interface{}) error { - defer func() { - close(st.RespChan) + var e error + go func() { + defer func() { + close(st.RespChan) + }() + e = s.SearcherServer.Search(i.(*SearchRequest), st) }() - return s.SearcherServer.Search(i.(*SearchRequest), st) + <-time.After(100 * time.Millisecond) + return e }) return st, nil } @@ -512,10 +533,15 @@ func (s *NodeVersionerStub) NewStream(ctx context.Context, desc *grpc.StreamDesc case "/tree.NodeVersioner/ListVersions": st := &NodeVersionerStub_ListVersionsStreamer{} st.Init(ctx, func(i interface{}) error { - defer func() { - close(st.RespChan) + var e error + go func() { + defer func() { + close(st.RespChan) + }() + e = s.NodeVersionerServer.ListVersions(i.(*ListVersionsRequest), st) }() - return s.NodeVersionerServer.ListVersions(i.(*ListVersionsRequest), st) + <-time.After(100 * time.Millisecond) + return e }) return st, nil } @@ -582,10 +608,15 @@ func (s *SyncChangesStub) NewStream(ctx context.Context, desc *grpc.StreamDesc, case "/tree.SyncChanges/Search": st := &SyncChangesStub_SearchStreamer{} st.Init(ctx, func(i interface{}) error { - defer func() { - close(st.RespChan) + var e error + go func() { + defer func() { + close(st.RespChan) + }() + e = s.SyncChangesServer.Search(i.(*SearchSyncChangeRequest), st) }() - return s.SyncChangesServer.Search(i.(*SearchSyncChangeRequest), st) + <-time.After(100 * time.Millisecond) + return e }) return st, nil } diff --git a/common/proto/tree/meta-filter.go b/common/proto/tree/meta-filter.go index b06da506c5..e2e704947b 100644 --- a/common/proto/tree/meta-filter.go +++ b/common/proto/tree/meta-filter.go @@ -38,6 +38,12 @@ const ( MetaFilterSize = "size" MetaFilterETag = "etag" MetaFilterDepth = "depth" + + MetaSortTime = "mtime" + MetaSortSize = "size" + MetaSortName = "name" + MetaSortMPath = "mpath1,mpath2,mpath3,mpath4" + MetaSortType = "leaf" ) var ( @@ -62,6 +68,9 @@ type MetaFilter struct { negativeGrep *regexp.Regexp eTag *regexp.Regexp intComps []cmp + + sortField string + sortDesc bool } // NewMetaFilter creates a meta filter looking for request node metadata specific keys. @@ -107,7 +116,7 @@ func (m *MetaFilter) LimitDepth() int { // HasSQLFilters returns true if MetaFilter has one of grep (unless forced), negativeGrep, filterType or int comparators set. func (m *MetaFilter) HasSQLFilters() bool { - return (m.grep != nil && !m.forceGrep) || m.negativeGrep != nil || m.filterType != NodeType_UNKNOWN || len(m.intComps) > 0 || m.eTag != nil + return (m.grep != nil && !m.forceGrep) || m.negativeGrep != nil || m.filterType != NodeType_UNKNOWN || len(m.intComps) > 0 || m.eTag != nil || m.HasSort() } // ParseType register a node filter type @@ -225,6 +234,45 @@ func (m *MetaFilter) Where() (where string, args []interface{}) { return strings.Join(ww, " and "), args } +func (m *MetaFilter) validSortField(sortField string) bool { + return sortField == MetaSortName || sortField == MetaSortTime || sortField == MetaSortSize || + sortField == MetaSortType || sortField == MetaSortMPath +} + +// AddSort adds a sort instruction +func (m *MetaFilter) AddSort(defaultField, sortField string, sortDesc bool) { + var filtered []string + for _, f := range strings.Split(sortField, ",") { + f = strings.TrimSpace(f) + if m.validSortField(f) { + filtered = append(filtered, f) + } + } + sortField = strings.Join(filtered, ",") + m.sortField = sortField + m.sortDesc = sortDesc + if m.sortDesc && m.sortField == "" { + m.sortField = defaultField + } else if m.sortField == defaultField && !sortDesc { + m.sortField = "" + m.sortDesc = false + } +} + +// HasSort checks if sortField is not empty +func (m *MetaFilter) HasSort() bool { + return m.sortField != "" +} + +// OrderBy creates SQL instruction to be appended +func (m *MetaFilter) OrderBy() string { + dir := "ASC" + if m.sortDesc { + dir = "DESC" + } + return "ORDER BY " + m.sortField + " " + dir +} + func (m *MetaFilter) grepToLikes(field, g string, neg bool) (string, []interface{}) { var parts []string var arguments []interface{} diff --git a/common/proto/tree/node.go b/common/proto/tree/node.go index 4ac73e3ba1..49cb7296db 100644 --- a/common/proto/tree/node.go +++ b/common/proto/tree/node.go @@ -43,6 +43,7 @@ const ( StatFlagFolderSize StatFlagFolderCounts StatFlagMetaMinimal + StatFlagRecursiveCount StatFlagHeaderName = "x-pydio-read-stat-flags" ) @@ -71,6 +72,15 @@ func (f Flags) FolderCounts() bool { return false } +func (f Flags) RecursiveCount() bool { + for _, fl := range f { + if fl == StatFlagRecursiveCount { + return true + } + } + return false +} + func (f Flags) MinimalMetas() bool { for _, fl := range f { if fl == StatFlagMetaMinimal { diff --git a/common/service/frontend/user.go b/common/service/frontend/user.go index 59535e4d4c..b1bbf12f38 100644 --- a/common/service/frontend/user.go +++ b/common/service/frontend/user.go @@ -23,6 +23,7 @@ package frontend import ( "context" "encoding/base64" + "path" "strings" "go.uber.org/zap" @@ -32,7 +33,10 @@ import ( "github.com/pydio/cells/v4/common/config" "github.com/pydio/cells/v4/common/log" "github.com/pydio/cells/v4/common/nodes/abstract" + "github.com/pydio/cells/v4/common/nodes/compose" "github.com/pydio/cells/v4/common/proto/idm" + "github.com/pydio/cells/v4/common/proto/service" + "github.com/pydio/cells/v4/common/proto/tree" "github.com/pydio/cells/v4/common/utils/configx" "github.com/pydio/cells/v4/common/utils/i18n" json "github.com/pydio/cells/v4/common/utils/jsonx" @@ -330,8 +334,15 @@ func (u *User) publishWorkspaces(status RequestStatus, pool *PluginsPool) (works // Used to detect "personal files"-like workspace vNodeManager := abstract.GetVirtualNodesManager(status.RuntimeCtx) + var skipReserved bool + if status.Request != nil { + skipReserved = strings.Contains(status.Request.Header.Get("User-Agent"), "com.pydio.PydioPro;") + } for _, ws := range u.Workspaces { + if _, ok := common.IdmWsInternalReservedSlugs[ws.UUID]; ok && skipReserved { + continue + } repo := &Crepo{ Attrid: ws.UUID, Attraccess_type: ws.AccessType, @@ -344,10 +355,26 @@ func (u *User) publishWorkspaces(status RequestStatus, pool *PluginsPool) (works if ws.Description != "" { repo.Cdescription = &Cdescription{Cdata: ws.Description} } - if ws.Scope != idm.WorkspaceScope_ADMIN { + if ws.Scope == idm.WorkspaceScope_ROOM { repo.Attrowner = "shared" - repo.Attruser_editable_repository = "true" + // Use existing xml attribute to tell if user is owner or not + // The real "editable" aspect is linked to PoliciesContextEditable value + if u.isWorkspaceOwnerFromPolicy(ws.Workspace.Policies) { + repo.Attruser_editable_repository = "true" + } else { + repo.Attruser_editable_repository = "false" + } repo.Attrrepository_type = "cell" + } else if ws.Scope == idm.WorkspaceScope_LINK { + repo.Attrowner = "shared" + repo.Attrrepository_type = "link" + if ws.Label == "{{RefLabel}}" && len(ws.RootUUIDs) == 1 { + // Load unique node to re-build label + router := compose.UuidClient(status.RuntimeCtx) + if rsp, e := router.ReadNode(status.Request.Context(), &tree.ReadNodeRequest{Node: &tree.Node{Uuid: ws.RootUUIDs[0]}}); e == nil { + repo.Clabel = &Clabel{Cdata: path.Base(rsp.GetNode().GetPath())} + } + } } else { repo.Attrrepository_type = "workspace" if len(ws.RootUUIDs) == 1 { @@ -365,3 +392,12 @@ func (u *User) publishWorkspaces(status RequestStatus, pool *PluginsPool) (works return } + +func (u *User) isWorkspaceOwnerFromPolicy(policies []*service.ResourcePolicy) bool { + for _, pol := range policies { + if pol.Action == service.ResourcePolicyAction_OWNER { + return pol.Subject == u.UserObject.Uuid + } + } + return false +} diff --git a/common/sql/index/cache.go b/common/sql/index/cache.go index 74419fe1d5..5df96652f4 100644 --- a/common/sql/index/cache.go +++ b/common/sql/index/cache.go @@ -651,7 +651,7 @@ func (d *daocache) GetNodeFirstAvailableChildIndex(path mtree.MPath) (uint64, er } -func (d *daocache) GetNodeChildrenCounts(path mtree.MPath) (int, int) { +func (d *daocache) GetNodeChildrenCounts(path mtree.MPath, b bool) (int, int) { d.mutex.RLock() defer d.mutex.RUnlock() diff --git a/common/sql/index/cache_test.go b/common/sql/index/cache_test.go index 68c4ba526d..4bbeb9fa34 100644 --- a/common/sql/index/cache_test.go +++ b/common/sql/index/cache_test.go @@ -59,7 +59,7 @@ func TestMain(m *testing.M) { return NewDAO(d, "ROOT"), nil } var e error - if baseCacheDAO, e = dao.InitDAO(context.Background(), sqlite.Driver, sqlite.SharedMemDSN, "test", wrapper, options); e != nil { + if baseCacheDAO, e = dao.InitDAO(context.Background(), sqlite.Driver, sqlite.SharedMemDSN, "test_cache", wrapper, options); e != nil { panic(e) } m.Run() @@ -305,7 +305,7 @@ func TestMysqlWithCache(t *testing.T) { Convey("Test Getting the Children Count of a node", t, func() { newSession() - count, _ := getDAO(ctxWithCache).GetNodeChildrenCounts(mockLongNodeMPath) + count, _ := getDAO(ctxWithCache).GetNodeChildrenCounts(mockLongNodeMPath, false) getDAO(ctxWithCache).Flush(true) diff --git a/common/sql/index/dao.go b/common/sql/index/dao.go index 5abe2e2e9d..604ae4435f 100644 --- a/common/sql/index/dao.go +++ b/common/sql/index/dao.go @@ -60,7 +60,7 @@ type DAO interface { GetNodeChild(mtree.MPath, string) (*mtree.TreeNode, error) GetNodeLastChild(mtree.MPath) (*mtree.TreeNode, error) GetNodeFirstAvailableChildIndex(mtree.MPath) (uint64, error) - GetNodeChildrenCounts(mtree.MPath) (int, int) + GetNodeChildrenCounts(mtree.MPath, bool) (int, int) MoveNodeTree(nodeFrom *mtree.TreeNode, nodeTo *mtree.TreeNode) error ResyncDirtyEtags(rootNode *mtree.TreeNode) error diff --git a/common/sql/index/dao_test.go b/common/sql/index/dao_test.go index 9c687124d7..7d819e4049 100644 --- a/common/sql/index/dao_test.go +++ b/common/sql/index/dao_test.go @@ -35,10 +35,10 @@ import ( . "github.com/smartystreets/goconvey/convey" "github.com/pydio/cells/v4/common/dao" + "github.com/pydio/cells/v4/common/dao/sqlite" "github.com/pydio/cells/v4/common/proto/tree" servicecontext "github.com/pydio/cells/v4/common/service/context" "github.com/pydio/cells/v4/common/utils/mtree" - "github.com/pydio/cells/v4/common/dao/sqlite" ) var ( @@ -47,8 +47,8 @@ var ( func init() { v := viper.New() - v.SetDefault(runtime.KeyCache, "pm://") - v.SetDefault(runtime.KeyShortCache, "pm://") + v.SetDefault(runtime.KeyCache, "discard://") + v.SetDefault(runtime.KeyShortCache, "discard://") runtime.SetRuntime(v) ctx, cancel := context.WithCancel(context.Background()) @@ -59,7 +59,7 @@ func init() { return NewDAO(d, "ROOT"), nil } - d, er := dao.InitDAO(ctx, sqlite.Driver, "file::memnocache:?mode=memory&cache=shared", "test", wrapper, options) + d, er := dao.InitDAO(ctx, sqlite.Driver, "file::memnocache:?mode=memory&cache=shared", "test1", wrapper, options) if er != nil { panic(er) } else { @@ -67,6 +67,23 @@ func init() { } } +func makeDAO() dao.DAO { + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + wrapper := func(ctx context.Context, d dao.DAO) (dao.DAO, error) { + return NewDAO(d, "ROOT"), nil + } + v := viper.New() + v.SetDefault(runtime.KeyCache, "discard://") + v.SetDefault(runtime.KeyShortCache, "discard://") + runtime.SetRuntime(v) + d, er := dao.InitDAO(ctx, sqlite.Driver, "file::memnocache:?mode=memory&cache=shared", "test2", wrapper, options) + if er != nil { + panic(er) + } + return d +} + func TestMysql(t *testing.T) { // Adding a file @@ -220,7 +237,7 @@ func TestMysql(t *testing.T) { // Getting children count Convey("Test Getting the Children Count of a node", t, func() { - _, count := getDAO(ctxNoCache).GetNodeChildrenCounts(mockLongNodeMPath) + _, count := getDAO(ctxNoCache).GetNodeChildrenCounts(mockLongNodeMPath, false) So(count, ShouldEqual, 2) }) @@ -698,6 +715,7 @@ func TestArborescence(t *testing.T) { "personal/admin/Test Toto/Pydio-color-logo-4.png", "personal/admin/Test Toto/PydioCells Logos.zip", "personal/admin/Test Toto/STACK.txt", + "personal/admin/Test Toto/zzz.txt", // Last entry when sorting by name "personal/admin/Up", "personal/admin/Up/.DS_Store", "personal/admin/Up/.pydio", @@ -727,13 +745,48 @@ func TestArborescence(t *testing.T) { "personal/user/User Folder/.pydio", } + for i, n := range arborescence { + arborescence[i] = "ROOT/" + n + } + arborescence = append([]string{"ROOT"}, arborescence...) + + d := makeDAO().(DAO) + for _, path := range arborescence { - _, _, err := getDAO(ctxNoCache).Path(path, true) + _, _, err := d.Path(path, true) So(err, ShouldBeNil) } - getDAO(ctxNoCache).Flush(true) + e := d.Flush(true) + So(e, ShouldBeNil) + + Convey("List Arbo w/ conditions", func() { + c := d.GetNodeTree(context.Background(), mtree.MPath{1}) + var a []string + for n := range c { + if node, ok := n.(*mtree.TreeNode); ok { + a = append(a, node.GetStringMeta("name")) + } + } + So(len(a), ShouldEqual, len(arborescence)) + So(a[0], ShouldEqual, "ROOT") // Default sorting is MPATH + }) + + Convey("List Arbo w/ ordering", func() { + mf := tree.NewMetaFilter(&tree.Node{}) + mf.AddSort(tree.MetaSortMPath, tree.MetaSortName, true) + c := d.GetNodeTree(context.Background(), mtree.MPath{1}, mf) + var a []string + for n := range c { + if node, ok := n.(*mtree.TreeNode); ok { + a = append(a, node.GetStringMeta("name")) + } + } + So(len(a), ShouldEqual, len(arborescence)) + So(a[0], ShouldEqual, "zzz.txt") + }) + }) } diff --git a/common/sql/index/sql.go b/common/sql/index/sql.go index 102f19d059..81d21576b3 100644 --- a/common/sql/index/sql.go +++ b/common/sql/index/sql.go @@ -263,23 +263,31 @@ func init() { if len(other) > 1 && other[1] != "" { sub += " and " + other[1] } + orderBy := "ORDER BY mpath1, mpath2, mpath3, mpath4 ASC" + if len(other) > 2 && other[2] != "" { + orderBy = other[2] + } return fmt.Sprintf(` SELECT uuid, level, mpath1, mpath2, mpath3, mpath4, name, leaf, mtime, etag, size, mode FROM %%PREFIX%%_idx_tree WHERE %s and level >= ? - ORDER BY mpath1, mpath2, mpath3, mpath4`, sub), args + %s`, sub, orderBy), args } - queries["children"] = func(dao sql.DAO, mpathes ...string) (string, []interface{}) { - sub, args := getMPathLike([]byte(mpathes[0])) - if len(mpathes) > 1 && mpathes[1] != "" { - sub += " and " + mpathes[1] + queries["children"] = func(dao sql.DAO, other ...string) (string, []interface{}) { + sub, args := getMPathLike([]byte(other[0])) + if len(other) > 1 && other[1] != "" { + sub += " AND " + other[1] + } + orderBy := "ORDER BY name ASC" + if len(other) > 2 && other[2] != "" { + orderBy = other[2] } return fmt.Sprintf(` SELECT uuid, level, mpath1, mpath2, mpath3, mpath4, name, leaf, mtime, etag, size, mode FROM %%PREFIX%%_idx_tree WHERE %s AND level = ? - ORDER BY name`, sub), args + %s`, sub, orderBy), args } queries["child"] = func(dao sql.DAO, mpathes ...string) (string, []interface{}) { @@ -334,6 +342,14 @@ func init() { GROUP BY leaf`, sub), args } + queries["treeCount"] = func(dao sql.DAO, mpathes ...string) (string, []interface{}) { + sub, args := getMPathLike([]byte(mpathes[0])) + return fmt.Sprintf(` + select count(*) + FROM %%PREFIX%%_idx_tree + WHERE %s AND level > ?`, sub), args + } + queries["childrenIndexes"] = func(dao sql.DAO, mpathes ...string) (string, []interface{}) { sub, args := getMPathLike([]byte(mpathes[0])) return fmt.Sprintf(` @@ -983,7 +999,7 @@ func (dao *IndexSQL) GetNodeFirstAvailableChildIndex(reqPath mtree.MPath) (avail } // GetNodeChildrenCounts List -func (dao *IndexSQL) GetNodeChildrenCounts(path mtree.MPath) (int, int) { +func (dao *IndexSQL) GetNodeChildrenCounts(path mtree.MPath, recursive bool) (int, int) { dao.Lock() defer dao.Unlock() @@ -995,19 +1011,31 @@ func (dao *IndexSQL) GetNodeChildrenCounts(path mtree.MPath) (int, int) { var folderCount, fileCount int - // First we check if we already have an object with the same key - if stmt, args, e := dao.GetStmtWithArgs("childrenCount", mpath.String()); e == nil { - if rows, e := stmt.Query(append(args, len(path)+1)...); e == nil { + stmtName := "childrenCount" + refLevel := len(path) + 1 + if recursive { + stmtName = "treeCount" + refLevel = len(path) + } + + if stmt, args, e := dao.GetStmtWithArgs(stmtName, mpath.String()); e == nil { + if rows, e := stmt.Query(append(args, refLevel)...); e == nil { defer rows.Close() for rows.Next() { - var leaf bool var count int - if sE := rows.Scan(&leaf, &count); sE == nil { - if leaf { - fileCount = count - } else { + if recursive { + if sE := rows.Scan(&count); sE == nil { folderCount = count } + } else { + var leaf bool + if sE := rows.Scan(&leaf, &count); sE == nil { + if leaf { + fileCount = count + } else { + folderCount = count + } + } } } } @@ -1023,10 +1051,13 @@ func (dao *IndexSQL) GetNodeChildren(ctx context.Context, path mtree.MPath, filt // Use a buffered chan to give some air to mysql buffer c := make(chan interface{}, 10000) - var mfWhere string + var mfWhere, mfOrder string var mfArgs []interface{} if len(filter) > 0 { mfWhere, mfArgs = filter[0].Where() + if filter[0].HasSort() { + mfOrder = filter[0].OrderBy() + } } go func() { @@ -1048,7 +1079,7 @@ func (dao *IndexSQL) GetNodeChildren(ctx context.Context, path mtree.MPath, filt mpath := node.MPath // First we check if we already have an object with the same key - if stmt, args, e := dao.GetStmtWithArgs("children", mpath.String(), mfWhere); e == nil { + if stmt, args, e := dao.GetStmtWithArgs("children", mpath.String(), mfWhere, mfOrder); e == nil { args = append(args, mfArgs...) rows, ca, err = stmt.LongQuery(append(args, len(path)+1)...) defer ca() @@ -1095,10 +1126,13 @@ func (dao *IndexSQL) GetNodeTree(ctx context.Context, path mtree.MPath, filter . dao.Lock() c := make(chan interface{}) - var mfWhere string + var mfWhere, mfOrder string var mfArgs []interface{} if len(filter) > 0 { mfWhere, mfArgs = filter[0].Where() + if filter[0].HasSort() { + mfOrder = filter[0].OrderBy() + } } go func() { @@ -1121,7 +1155,7 @@ func (dao *IndexSQL) GetNodeTree(ctx context.Context, path mtree.MPath, filter . mpath := node.MPath // First we check if we already have an object with the same key - if stmt, args, e := dao.GetStmtWithArgs("tree", mpath.String(), mfWhere); e == nil { + if stmt, args, e := dao.GetStmtWithArgs("tree", mpath.String(), mfWhere, mfOrder); e == nil { args = append(args, mfArgs...) rows, ca, err = stmt.LongQuery(append(args, len(mpath)+1)...) defer ca() diff --git a/common/utils/permissions/access-list.go b/common/utils/permissions/access-list.go index e396d0a09c..315ae5cb56 100644 --- a/common/utils/permissions/access-list.go +++ b/common/utils/permissions/access-list.go @@ -22,6 +22,7 @@ package permissions import ( "context" + "github.com/pydio/cells/v4/common/utils/std" "sort" "strings" "sync" @@ -83,11 +84,12 @@ type AccessList struct { wsACLs []*idm.ACL frontACLs []*idm.ACL - masksByUUIDs map[string]Bitmask - masksByPaths map[string]Bitmask - maskBULock *sync.RWMutex - maskBPLock *sync.RWMutex - claimsScopes map[string]Bitmask + masksByUUIDs map[string]Bitmask + masksByPaths map[string]Bitmask + maskBULock *sync.RWMutex + maskBPLock *sync.RWMutex + maskRootsLock *sync.RWMutex + claimsScopes map[string]Bitmask hasClaimsScopes bool cacheKey string @@ -96,10 +98,11 @@ type AccessList struct { // NewAccessList creates a new AccessList. func NewAccessList(roles ...*idm.Role) *AccessList { acl := &AccessList{ - wss: make(map[string]*idm.Workspace), - orderedRoles: roles, - maskBPLock: &sync.RWMutex{}, - maskBULock: &sync.RWMutex{}, + wss: make(map[string]*idm.Workspace), + orderedRoles: roles, + maskBPLock: &sync.RWMutex{}, + maskBULock: &sync.RWMutex{}, + maskRootsLock: &sync.RWMutex{}, } return acl } @@ -126,6 +129,8 @@ func (a *AccessList) GetWorkspaces() map[string]*idm.Workspace { // LoadWorkspaces loads actual idm.Workspace objects using a WsLoader func (a *AccessList) LoadWorkspaces(ctx context.Context, loader WsLoader) error { + a.maskRootsLock.RLock() + defer a.maskRootsLock.RUnlock() if len(a.wssRootsMasks) == 0 { // nothing to do return nil @@ -182,7 +187,10 @@ func (a *AccessList) Flatten(ctx context.Context) { // GetWorkspacesRoots gets detected workspace root nodes that are then // used to populate the Workspace keys. func (a *AccessList) GetWorkspacesRoots() map[string]map[string]Bitmask { - return a.wssRootsMasks + a.maskRootsLock.RLock() + cl := std.CloneMap(a.wssRootsMasks) + a.maskRootsLock.RUnlock() + return cl } // GetNodesBitmasks returns internal bitmask @@ -218,15 +226,24 @@ func (a *AccessList) ReplicateBitmask(fromUuid, toUuid string, replaceInRoots .. if b, o := a.masksByUUIDs[fromUuid]; o { a.masksByUUIDs[toUuid] = b if replace { + a.maskRootsLock.Lock() // Replace in wssRootsMasks - for _, roots := range a.wssRootsMasks { - for rootId := range roots { + for maskId, roots := range a.wssRootsMasks { + nr := make(map[string]Bitmask) + modified := false + for rootId, current := range roots { if rootId == fromUuid { - delete(roots, fromUuid) - roots[toUuid] = b + nr[toUuid] = b + modified = true + } else { + nr[rootId] = current } } + if modified { + a.wssRootsMasks[maskId] = nr + } } + a.maskRootsLock.Unlock() } return true } @@ -235,6 +252,9 @@ func (a *AccessList) ReplicateBitmask(fromUuid, toUuid string, replaceInRoots .. // DetectedWsRights retrieves a map of accessible workspaces. func (a *AccessList) DetectedWsRights(ctx context.Context) map[string]SimpleRight { + a.maskRootsLock.RLock() + defer a.maskRootsLock.RUnlock() + results := make(map[string]SimpleRight) for wsId, wsNodes := range a.wssRootsMasks { rights := SimpleRight{} @@ -255,6 +275,9 @@ func (a *AccessList) DetectedWsRights(ctx context.Context) map[string]SimpleRigh // CanRead checks if a node has READ access. func (a *AccessList) CanRead(ctx context.Context, nodes ...*tree.Node) bool { + if len(nodes) == 0 { + return false + } if a.claimsScopesDeny(ctx, nodes[0], FlagRead) { return false } @@ -264,6 +287,9 @@ func (a *AccessList) CanRead(ctx context.Context, nodes ...*tree.Node) bool { // CanWrite checks if a node has WRITE access. func (a *AccessList) CanWrite(ctx context.Context, nodes ...*tree.Node) bool { + if len(nodes) == 0 { + return false + } if a.claimsScopesDeny(ctx, nodes[0], FlagWrite) { return false } @@ -282,6 +308,9 @@ func (a *AccessList) HasExplicitDeny(ctx context.Context, flag BitmaskFlag, node // CanReadWithResolver checks if a node has READ access, using VirtualPathResolver if necessary func (a *AccessList) CanReadWithResolver(ctx context.Context, resolver VirtualPathResolver, nodes ...*tree.Node) bool { + if len(nodes) == 0 { + return false + } a.replicateMasksResolved(ctx, resolver) if a.claimsScopesDeny(ctx, nodes[0], FlagRead) { return false @@ -292,6 +321,9 @@ func (a *AccessList) CanReadWithResolver(ctx context.Context, resolver VirtualPa // CanWriteWithResolver checks if a node has WRITE access, using VirtualPathResolver if necessary. func (a *AccessList) CanWriteWithResolver(ctx context.Context, resolver VirtualPathResolver, nodes ...*tree.Node) bool { + if len(nodes) == 0 { + return false + } a.replicateMasksResolved(ctx, resolver) if a.claimsScopesDeny(ctx, nodes[0], FlagWrite) { return false @@ -327,6 +359,9 @@ func (a *AccessList) CanWritePath(ctx context.Context, resolver VirtualPathResol // IsLocked checks if a node bitmask has a FlagLock value. func (a *AccessList) IsLocked(ctx context.Context, nodes ...*tree.Node) bool { // First we check for parents + if len(nodes) == 0 { + return false + } mask, _ := a.firstMaskForParents(ctx, nodes...) if mask.HasFlag(ctx, FlagLock, nodes[0]) { return true @@ -341,6 +376,8 @@ func (a *AccessList) IsLocked(ctx context.Context, nodes ...*tree.Node) bool { // BelongsToWorkspaces finds corresponding workspace parents for this node. func (a *AccessList) BelongsToWorkspaces(ctx context.Context, nodes ...*tree.Node) (workspaces []*idm.Workspace, workspacesRoots map[string]string) { + a.maskRootsLock.RLock() + defer a.maskRootsLock.RUnlock() foundWorkspaces := make(map[string]bool) workspacesRoots = make(map[string]string) diff --git a/common/utils/permissions/acl-cache.go b/common/utils/permissions/acl-cache.go index 4f4d7803b0..4319a0536a 100644 --- a/common/utils/permissions/acl-cache.go +++ b/common/utils/permissions/acl-cache.go @@ -75,8 +75,10 @@ func (a *AccessList) cache(key string) error { a.cacheKey = key a.maskBPLock.RLock() a.maskBULock.RLock() + a.maskRootsLock.RLock() defer a.maskBPLock.RUnlock() defer a.maskBULock.RUnlock() + defer a.maskRootsLock.RUnlock() m := &CachedAccessList{ OrderedRoles: a.orderedRoles, WsACLs: a.wsACLs, @@ -109,6 +111,7 @@ func newFromCache(key string) (*AccessList, bool) { // Re-init these maskBPLock: &sync.RWMutex{}, maskBULock: &sync.RWMutex{}, + maskRootsLock: &sync.RWMutex{}, wss: std.CloneMap(m.Wss), wssRootsMasks: std.CloneMap(m.WssRootsMasks), masksByUUIDs: std.CloneMap(m.MasksByUUIDs), diff --git a/data/meta/rest/rest.go b/data/meta/rest/rest.go index f1da037bcd..bf3fc07ef2 100644 --- a/data/meta/rest/rest.go +++ b/data/meta/rest/rest.go @@ -24,6 +24,7 @@ import ( "context" restful "github.com/emicklei/go-restful/v3" "go.uber.org/zap" + "google.golang.org/protobuf/proto" "math" "path" "path/filepath" @@ -154,29 +155,40 @@ func (h *Handler) GetBulkMeta(req *restful.Request, resp *restful.Response) { if e := folderNode.GetMeta(common.MetaFlagChildrenCount, &childrenCount); e == nil && childrenCount > 0 { total = childrenCount } - streamer, err := h.GetRouter().ListNodes(ctx, &tree.ListNodesRequest{ + listRequest := &tree.ListNodesRequest{ Node: folderNode, WithVersions: bulkRequest.Versions, Offset: int64(bulkRequest.Offset), Limit: int64(bulkRequest.Limit), - }) - if err != nil { - continue + SortField: bulkRequest.SortField, + SortDirDesc: bulkRequest.SortDirDesc, } - for { - r, er := streamer.Recv() - if er != nil { - break - } - if r == nil { - continue - } - if strings.HasPrefix(path.Base(r.Node.GetPath()), ".") { - continue + hasFilter := false + for k, v := range bulkRequest.GetFilters() { + if k == "type" { + switch v { + case "LEAF": + listRequest.FilterType = tree.NodeType_LEAF + hasFilter = true + if e := folderNode.GetMeta(common.MetaFlagChildrenFiles, &childrenCount); e == nil && childrenCount > 0 { + total = childrenCount + } + case "COLLECTION": + listRequest.FilterType = tree.NodeType_COLLECTION + hasFilter = true + if e := folderNode.GetMeta(common.MetaFlagChildrenFolders, &childrenCount); e == nil && childrenCount > 0 { + total = childrenCount + } + } } - childrenLoaded++ - output.Nodes = append(output.Nodes, r.Node.WithoutReservedMetas()) } + cc, countDiffers, er := h.fillChildren(ctx, listRequest, childrenCount) + if er != nil { + service.RestErrorDetect(req, resp, er) + return + } + childrenLoaded = int32(len(cc)) + output.Nodes = append(output.Nodes, cc...) if !bulkRequest.Versions { fNode := folderNode.Clone() @@ -213,6 +225,16 @@ func (h *Handler) GetBulkMeta(req *restful.Request, resp *restful.Response) { if crtPage < totalPages { nextOffset = bulkRequest.Offset + pageSize } + // If the first page is already smaller than the limit, then do not send pagination data + // List may have been filtered out + if countDiffers && !hasFilter { + if childrenLoaded < bulkRequest.Limit-1 { + // Assume it's the last + totalPages = crtPage + } else { + totalPages = -1 + } + } output.Pagination = &rest.Pagination{ Limit: pageSize, CurrentOffset: bulkRequest.Offset, @@ -330,3 +352,47 @@ func (h *Handler) loadNodeByPath(ctx context.Context, nodePath string, loadExten } return response.Node, nil } + +func (h *Handler) fillChildren(ctx context.Context, listRequest *tree.ListNodesRequest, knownCount int32) ([]*tree.Node, bool, error) { + + var oo []*tree.Node + var countDiffers bool + offset := listRequest.Offset + limit := listRequest.Limit + lr := proto.Clone(listRequest).(*tree.ListNodesRequest) + + for { + + log.Logger(ctx).Debug("Listing", zap.Int64("offset", offset), zap.Int64("limit", limit)) + lr.Offset = offset + lr.Limit = limit + streamer, err := h.GetRouter().ListNodes(ctx, lr) + if err != nil { + return oo, countDiffers, err + } + for { + r, er := streamer.Recv() + if er != nil { + break + } + if r == nil { + continue + } + if strings.HasPrefix(path.Base(r.Node.GetPath()), ".") { + continue + } + oo = append(oo, r.Node.WithoutReservedMetas()) + } + if len(oo) >= int(limit) { // limit is reached, break + break + } + if offset+limit >= int64(knownCount) { // This is last page, break + break + } + offset += limit + countDiffers = true + } + + return oo, countDiffers, nil + +} diff --git a/data/search/dao/bleve/codec.go b/data/search/dao/bleve/codec.go index 9cbbf99047..3c941e21d9 100644 --- a/data/search/dao/bleve/codec.go +++ b/data/search/dao/bleve/codec.go @@ -227,8 +227,17 @@ func (b *Codec) BuildQuery(qu interface{}, offset, limit int32) (interface{}, in dateRange.SetField("ModifTime") boolean.AddMust(dateRange) } - // Limit to a SubTree - if len(queryObject.PathPrefix) > 0 { + + // Limit to a set of Paths or to a SubTree (PathPrefix) + if len(queryObject.Paths) > 0 { + subQ := bleve.NewBooleanQuery() + for _, pa := range queryObject.Paths { + exact := bleve.NewMatchQuery(pa) + exact.SetField("Path") + subQ.AddShould(exact) + } + boolean.AddMust(subQ) + } else if len(queryObject.PathPrefix) > 0 { subQ := bleve.NewBooleanQuery() for _, pref := range queryObject.PathPrefix { prefix := bleve.NewPrefixQuery(pref) diff --git a/data/search/dao/indexer_test.go b/data/search/dao/indexer_test.go index 8855102579..b50d6c020a 100644 --- a/data/search/dao/indexer_test.go +++ b/data/search/dao/indexer_test.go @@ -405,6 +405,32 @@ func TestSearchNode(t *testing.T) { }) + Convey("Search Node by name with Exact Path", t, func() { + + queryObject := &tree.Query{ + Paths: []string{"/path/to"}, + } + results, e := search(ctx, server, queryObject) + So(e, ShouldBeNil) + So(results, ShouldHaveLength, 0) + + queryObject = &tree.Query{ + Paths: []string{"/path/to/node.txt2"}, + } + results, e = search(ctx, server, queryObject) + So(e, ShouldBeNil) + So(results, ShouldHaveLength, 0) + + queryObject = &tree.Query{ + Paths: []string{"/path/to/node.txt"}, + } + + results, e = search(ctx, server, queryObject) + So(e, ShouldBeNil) + So(results, ShouldHaveLength, 1) + + }) + Convey("Search Node by name with Path Prefix", t, func() { queryObject := &tree.Query{ diff --git a/data/search/dao/mongo/codec.go b/data/search/dao/mongo/codec.go index 719d1f602c..f399177c2d 100644 --- a/data/search/dao/mongo/codec.go +++ b/data/search/dao/mongo/codec.go @@ -176,13 +176,20 @@ func (m *Codex) BuildQuery(query interface{}, offset, limit int32) (interface{}, filters = append(filters, bson.E{"modif_time", bson.M{"$lte": dt}}) } - // Limit to a SubTree - if len(queryObject.PathPrefix) > 0 { + // Limit to a set of Paths or to a SubTree (PathPrefix) + if len(queryObject.Paths) > 0 { + ors := bson.A{} + for _, pa := range queryObject.Paths { + ors = append(ors, bson.M{"path": bson.M{"$regex": bsonx.Regex("^"+pa+"$", "i")}}) + } + filters = append(filters, bson.E{Key: "$or", Value: ors}) + + } else if len(queryObject.PathPrefix) > 0 { ors := bson.A{} for _, prefix := range queryObject.PathPrefix { ors = append(ors, bson.M{"path": bson.M{"$regex": bsonx.Regex("^"+prefix, "i")}}) } - filters = append(filters, bson.E{"$or", ors}) + filters = append(filters, bson.E{Key: "$or", Value: ors}) } if queryObject.Type > 0 { diff --git a/data/search/rest/rest.go b/data/search/rest/rest.go index 1d95f5d076..c65aebc43d 100644 --- a/data/search/rest/rest.go +++ b/data/search/rest/rest.go @@ -23,6 +23,9 @@ package rest import ( "context" + "github.com/pydio/cells/v4/common/service/resources" + "github.com/pydio/cells/v4/idm/share" + "regexp" "strings" restful "github.com/emicklei/go-restful/v3" @@ -71,6 +74,45 @@ func (s *Handler) getClient() tree.SearcherClient { return s.client } +func (s *Handler) sharedResourcesAsNodes(ctx context.Context, query *tree.Query) ([]*tree.Node, bool, error) { + scope, freeString, active := s.extractSharedMeta(query.FreeString) + if !active { + return nil, false, nil + } + // Replace FS + query.FreeString = freeString + + sc := share.NewClient(s.runtimeCtx, nil) + rr, e := sc.ListSharedResources(ctx, "", scope, true, resources.ResourceProviderHandler{}) + if e != nil { + return nil, false, e + } + var out []*tree.Node + for _, r := range rr { + out = append(out, r.Node) + } + return out, active, nil +} + +func (s *Handler) extractSharedMeta(freeString string) (scope idm.WorkspaceScope, newString string, has bool) { + rx, _ := regexp.Compile("((\\+)?Meta\\.shared_resource_type:(any|cell|link))") + matches := rx.FindAllStringSubmatch(freeString, -1) + if len(matches) == 1 && len(matches[0]) == 4 { + has = true + switch matches[0][3] { + case "any": + scope = idm.WorkspaceScope_ANY + case "cell": + scope = idm.WorkspaceScope_ROOM + case "link": + scope = idm.WorkspaceScope_LINK + } + newString = rx.ReplaceAllString(freeString, "") + newString = strings.TrimSpace(newString) + } + return +} + func (s *Handler) Nodes(req *restful.Request, rsp *restful.Response) { ctx := req.Request.Context() @@ -109,6 +151,14 @@ func (s *Handler) Nodes(req *restful.Request, rsp *restful.Response) { defer nodeStreamer.CloseSend() } + // TMP Load shared + sharedNodes, shared, er := s.sharedResourcesAsNodes(ctx, query) + if er != nil { + log.Logger(ctx).Error("cannot load shared resources") + service.RestErrorDetect(req, rsp, e) + return + } + err := router.WrapCallback(func(inputFilter nodes.FilterFunc, outputFilter nodes.FilterFunc) error { var userWorkspaces map[string]*idm.Workspace @@ -119,6 +169,22 @@ func (s *Handler) Nodes(req *restful.Request, rsp *restful.Response) { userWorkspaces = accessList.GetWorkspaces() } + if shared { + if len(sharedNodes) == 0 { + // Break now, return an empty result + return nil + } + for _, n := range sharedNodes { + p := n.GetPath() + ctx, n, e = inputFilter(ctx, n, "search-"+p) + if e != nil { + continue + } + log.Logger(ctx).Debug("Filtered Node & Context", zap.String("path", n.Path)) + query.Paths = append(query.Paths, n.Path) + } + } + if len(passedPrefix) > 0 { // Passed prefix prefixes = append(prefixes, passedPrefix) @@ -197,7 +263,6 @@ func (s *Handler) Nodes(req *restful.Request, rsp *restful.Response) { } } } - //metaLoader.LoadMetas(ctx, filtered) nn = append(nn, filtered.WithoutReservedMetas()) } } diff --git a/data/search/rest/rest_test.go b/data/search/rest/rest_test.go new file mode 100644 index 0000000000..b2da63d449 --- /dev/null +++ b/data/search/rest/rest_test.go @@ -0,0 +1,33 @@ +package rest + +import ( + "github.com/pydio/cells/v4/common/proto/idm" + . "github.com/smartystreets/goconvey/convey" + "testing" +) + +func TestRegexp(t *testing.T) { + Convey("Test shared regexp", t, func() { + s := &Handler{} + scope, newString, has := s.extractSharedMeta("+Meta.shared_resource_type:other") + So(has, ShouldBeFalse) + + scope, newString, has = s.extractSharedMeta("Meta.shared_resource_type") + So(has, ShouldBeFalse) + + scope, newString, has = s.extractSharedMeta("+Meta.shared_resource_type:any") + So(has, ShouldBeTrue) + So(scope, ShouldEqual, idm.WorkspaceScope_ANY) + So(newString, ShouldEqual, "") + + scope, newString, has = s.extractSharedMeta("+Meta.stuff:value +Meta.shared_resource_type:cell") + So(has, ShouldBeTrue) + So(scope, ShouldEqual, idm.WorkspaceScope_ROOM) + So(newString, ShouldEqual, "+Meta.stuff:value") + + scope, newString, has = s.extractSharedMeta("+Meta.shared_resource_type:link +Meta.stuff:value") + So(has, ShouldBeTrue) + So(scope, ShouldEqual, idm.WorkspaceScope_LINK) + So(newString, ShouldEqual, "+Meta.stuff:value") + }) +} diff --git a/data/source/index/grpc/handler.go b/data/source/index/grpc/handler.go index aeb4f07441..959a9b03c8 100644 --- a/data/source/index/grpc/handler.go +++ b/data/source/index/grpc/handler.go @@ -323,11 +323,15 @@ func (s *TreeServer) ReadNode(ctx context.Context, req *tree.ReadNodeRequest) (r s.setDataSourceMeta(node) if (req.WithExtendedStats || tree.StatFlags(req.StatFlags).FolderCounts()) && !node.IsLeaf() { - folderCount, fileCount := dao.GetNodeChildrenCounts(node.MPath) + folderCount, fileCount := dao.GetNodeChildrenCounts(node.MPath, false) node.SetMeta(common.MetaFlagChildrenCount, folderCount+fileCount) node.SetMeta(common.MetaFlagChildrenFolders, folderCount) node.SetMeta(common.MetaFlagChildrenFiles, fileCount) } + if tree.StatFlags(req.StatFlags).RecursiveCount() && !node.IsLeaf() { + total, _ := dao.GetNodeChildrenCounts(node.MPath, true) + node.SetMeta(common.MetaFlagRecursiveCount, total) + } resp.Node = node.Node @@ -399,6 +403,7 @@ func (s *TreeServer) ListNodes(req *tree.ListNodesRequest, resp tree.NodeProvide } else { reqNode := req.GetNode() reqPath := safePath(reqNode.GetPath()) + recursiveCounts := tree.StatFlags(req.StatFlags).RecursiveCount() path, _, err := dao.Path(reqPath, false) if err != nil { @@ -419,6 +424,11 @@ func (s *TreeServer) ListNodes(req *tree.ListNodesRequest, resp tree.NodeProvide // Additional filters metaFilter := tree.NewMetaFilter(reqNode) metaFilter.ParseType(req.FilterType) + if !req.Recursive { + metaFilter.AddSort(tree.MetaSortName, req.SortField, req.SortDirDesc) + } else { + metaFilter.AddSort(tree.MetaSortMPath, req.SortField, req.SortDirDesc) + } _ = metaFilter.Parse() sqlFilters := metaFilter.HasSQLFilters() limitDepth := metaFilter.LimitDepth() @@ -494,6 +504,10 @@ func (s *TreeServer) ListNodes(req *tree.ListNodesRequest, resp tree.NodeProvide if limitDepth > 0 && node.Level != limitDepth { continue } + if recursiveCounts && !node.IsLeaf() { + total, _ := dao.GetNodeChildrenCounts(node.MPath, true) + node.SetMeta(common.MetaFlagRecursiveCount, total) + } if err := resp.Send(&tree.ListNodesResponse{Node: node.Node}); err != nil { return err } diff --git a/data/tree/grpc/handler.go b/data/tree/grpc/handler.go index dc14e122fd..30265aeeb0 100644 --- a/data/tree/grpc/handler.go +++ b/data/tree/grpc/handler.go @@ -443,8 +443,11 @@ func (s *TreeServer) ListNodesWithLimit(ctx context.Context, metaStreamer meta.L Path: name, } outputNode.MustSetMeta(common.MetaNamespaceNodeName, name) - if size, er := s.dsSize(ctx, s.DataSources[name]); er == nil { + if size, counts, er := s.dsSize(ctx, s.DataSources[name], req.StatFlags); er == nil { outputNode.Size = size + if tree.StatFlags(req.StatFlags).RecursiveCount() { + outputNode.MustSetMeta(common.MetaFlagRecursiveCount, counts) + } } else { log.Logger(ctx).Error("Cannot compute DataSource size, skipping", zap.String("dsName", name), zap.Error(er)) } @@ -460,13 +463,18 @@ func (s *TreeServer) ListNodesWithLimit(ctx context.Context, metaStreamer meta.L if req.Recursive && limitDepth != 1 { subNode := node.Clone() subNode.Path = name - s.ListNodesWithLimit(ctx, metaStreamer, &tree.ListNodesRequest{ + er := s.ListNodesWithLimit(ctx, metaStreamer, &tree.ListNodesRequest{ Node: subNode, Recursive: true, - WithVersions: req.WithVersions, - StatFlags: req.StatFlags, - FilterType: req.FilterType, + WithVersions: req.GetWithVersions(), + StatFlags: req.GetStatFlags(), + FilterType: req.GetFilterType(), + SortField: req.GetSortField(), + SortDirDesc: req.GetSortDirDesc(), }, resp, cursorIndex, numberSent) + if er != nil { + return er + } } if checkLimit() { return nil @@ -483,8 +491,10 @@ func (s *TreeServer) ListNodesWithLimit(ctx context.Context, metaStreamer meta.L Node: reqNode, Recursive: req.Recursive, //Limit: req.Limit, - StatFlags: req.StatFlags, - FilterType: req.FilterType, + StatFlags: req.GetStatFlags(), + FilterType: req.GetFilterType(), + SortField: req.GetSortField(), + SortDirDesc: req.GetSortDirDesc(), } log.Logger(ctx).Debug("List Nodes With Offset / Limit", zap.Int64("offset", offset), zap.Int64("limit", limit)) @@ -535,22 +545,28 @@ func (s *TreeServer) ListNodesWithLimit(ctx context.Context, metaStreamer meta.L return errors.NotFound(node.GetPath(), "Not found") } -func (s *TreeServer) dsSize(ctx context.Context, ds DataSource) (int64, error) { +func (s *TreeServer) dsSize(ctx context.Context, ds DataSource, flags []uint32) (int64, int, error) { st, er := ds.reader.ListNodes(ctx, &tree.ListNodesRequest{ - Node: &tree.Node{Path: ""}, + Node: &tree.Node{Path: ""}, + StatFlags: flags, }, grpc.WaitForReady(false)) if er != nil { - return 0, er + return 0, 0, er } var size int64 + var count int for { if r, e := st.Recv(); e != nil { break } else { size += r.GetNode().GetSize() + var rc int + if err := r.GetNode().GetMeta(common.MetaFlagRecursiveCount, &rc); err == nil { + count += rc + } } } - return size, nil + return size, count, nil } // UpdateNode implementation for the TreeServer diff --git a/data/versions/lang/box/fr-ca.all.json b/data/versions/lang/box/fr-ca.all.json index c8d04bbbc8..fae24935da 100644 --- a/data/versions/lang/box/fr-ca.all.json +++ b/data/versions/lang/box/fr-ca.all.json @@ -16,8 +16,8 @@ "other": "Suppression des versions pour les documents supprimés" }, "Job.Pruning.StatusDone": { - "one": "Successfully removed {{.Count}} version", - "other": "Successfully removed {{.Count}} versions." + "one": "{{.Count}} version a été supprimée avec succès", + "other": "{{.Count}} versions ont été supprimées avec succès." }, "Config.GroupPolicy.Title": { "other": "Stratégie" diff --git a/discovery/config/lang/box/de.all.json b/discovery/config/lang/box/de.all.json index d6c3d34ac7..a817612cbf 100644 --- a/discovery/config/lang/box/de.all.json +++ b/discovery/config/lang/box/de.all.json @@ -372,7 +372,7 @@ "other": "Öffentlicher Link" }, "workspaceSingleQuery.scope.ROOM": { - "other": "Zelle" + "other": "Cell" }, "workspaceSingleQuery.slug": { "other": "Slug" diff --git a/discovery/config/lang/box/fr-ca.all.json b/discovery/config/lang/box/fr-ca.all.json index 0a1a9946c2..c3dd8666da 100644 --- a/discovery/config/lang/box/fr-ca.all.json +++ b/discovery/config/lang/box/fr-ca.all.json @@ -99,10 +99,10 @@ "other": "occurrences (expr. reg)" }, "conditionPathGlobCondition.glob": { - "other": "pattern" + "other": "motif" }, "conditionBooleanCondition.value": { - "other": "True" + "other": "Vrai" }, "contextMetaCondition.CIDRCondition": { "other": "Condition CIDR" @@ -135,10 +135,10 @@ "other": "Date postérieure à" }, "contextMetaCondition.PathGlobCondition": { - "other": "Glob Matcher" + "other": "Expression Glob" }, "contextMetaCondition.BooleanCondition": { - "other": "Boolean Value" + "other": "Valeur booléenne" }, "contextMetaField.ContentType": { "other": "Type de contenu" @@ -156,10 +156,10 @@ "other": "Hôte de la requête" }, "contextMetaField.RequestHost": { - "other": "Request Host" + "other": "Hôte (complet) de la requête" }, "contextMetaField.RequestPort": { - "other": "Request Port" + "other": "Port de la requête" }, "contextMetaField.RequestMethod": { "other": "Méthode de la requête" @@ -450,16 +450,16 @@ "other": "Programmation calendaire" }, "triggerFilterQuery.IsApiHook": { - "other": "Triggered by Webhook" + "other": "Déclenché par Webhook" }, "triggerFilterQuery.ApiHookSlug": { - "other": "Webhook Api Slug" + "other": "Segment de l'API du hook" }, "triggerFilterQuery.RunParameterName": { - "other": "Run Parameter Name" + "other": "Nom du paramètre de Flow" }, "triggerFilterQuery.RunParameterValue": { - "other": "Run Parameter Value" + "other": "Valeur du paramètre de Flow" }, "triggerFilterQuery.IsManual": { "other": "Manuel" diff --git a/discovery/install/assets/src/res/i18n/de.all.json b/discovery/install/assets/src/res/i18n/de.all.json index 07c91962c5..4d475d8a18 100644 --- a/discovery/install/assets/src/res/i18n/de.all.json +++ b/discovery/install/assets/src/res/i18n/de.all.json @@ -24,7 +24,7 @@ "other": "Bitte stellen Sie sicher, dass Ihre Datenbank MySQL Version 5.6 oder höher läuft" }, "database.installDetected": { - "other": "In dieser Datenbank scheint eine Installation der Zellen bereits eingerichtet zu sein. Bitte bestätigen Sie das Fortfahren oder " + "other": "Es scheint bereits eine Cells-Installation in dieser Datenbank eingerichtet zu sein. Bitte bestätigen Sie, um fortzufahren, oder " }, "database.installDetected.retry": { "other": "mit neuem Wert erneut versuchen" @@ -60,7 +60,7 @@ "other": "Erweiterte Einstellungen anzeigen" }, "advanced.default.datasource": { - "other": "Beim Start wird eine Standarddatenquelle zum Speichern persönlicher Daten und Zellendaten des Benutzers erstellt. Sie können später weitere Datenquellen erstellen." + "other": "Beim Start wird eine Standarddatenquelle zum Speichern persönlicher Daten und Cells-daten des Benutzers erstellt. Sie können später weitere Datenquellen erstellen." }, "advanced.mongo.title": { "other": "MongoDB Verbindung konfigurieren" diff --git a/discovery/install/assets/src/res/i18n/fr-ca.all.json b/discovery/install/assets/src/res/i18n/fr-ca.all.json index b98691a64f..581faed39b 100644 --- a/discovery/install/assets/src/res/i18n/fr-ca.all.json +++ b/discovery/install/assets/src/res/i18n/fr-ca.all.json @@ -63,31 +63,31 @@ "other": "Une DataSource par défaut est créée au démarrage pour stocker les données personnelles des utilisateurs et les données des Cells. Vous pourrez créer d'autres DataSource plus tard." }, "advanced.mongo.title": { - "other": "Configure a MongoDB Connection" + "other": "Configurer une connexion MongoDB" }, "advanced.mongo.legend": { - "other": "This is better for scalability, and required for clustering deployment. If you do not have a Mongo DB ready, this can be done later." + "other": "Ceci est recommandé pour la scalabilité, et nécessaire pour le déploiement en multi-noeuds. Si vous n'avez pas encore de MongoDB, vous pouvez faire cette configuration et basculer plus tard." }, "advanced.mongo.host": { - "other": "Server host" + "other": "Hôte du serveur" }, "advanced.mongo.port": { - "other": "Server port" + "other": "Port du serveur" }, "advanced.mongo.db": { - "other": "Database Name" + "other": "Base de données" }, "advanced.mongo.username": { - "other": "Username" + "other": "Utilisateur" }, "advanced.mongo.password": { - "other": "Password" + "other": "Mot de passe" }, "advanced.mongo.authSource": { - "other": "Auth DB" + "other": "BD d'authentification" }, "advanced.mongo.validate": { - "other": "Test connection" + "other": "Tester la connexion" }, "license.stepLabel": { "other": "Licence Entreprise" @@ -117,7 +117,7 @@ "other": "Lancer l'installation" }, "apply.title": { - "other": "Please be patient while Pydio Cells is being installed..." + "other": "Veuillez patienter pendant l'installation de Pydio Cells..." }, "apply.success": { "other": "L'installation a été effectuée avec succès et les services sont en cours de démarrage, l'installateur rechargera la page lorsque les services auront été redémarrés." @@ -225,7 +225,7 @@ "other": "Amazon / Compatible S3 (stocker dans des buckets S3)" }, "form.dsS3Custom.label": { - "other": "URL, append ?minio=true if Minio." + "other": "URL, ajouter ?minio=true pour Minio." }, "form.dsS3Custom.legend": { "other": "Laissez vide pour AWS" diff --git a/frontend/front-srv/assets/.gitignore b/frontend/front-srv/assets/.gitignore index 40b92c2eaf..819a558c56 100644 --- a/frontend/front-srv/assets/.gitignore +++ b/frontend/front-srv/assets/.gitignore @@ -1 +1,2 @@ -*/res/build \ No newline at end of file +*/res/build +**/*.min.js.LICENSE.txt \ No newline at end of file diff --git a/frontend/front-srv/assets/Gruntfile.js b/frontend/front-srv/assets/Gruntfile.js deleted file mode 100644 index ff4ace601b..0000000000 --- a/frontend/front-srv/assets/Gruntfile.js +++ /dev/null @@ -1,27 +0,0 @@ -module.exports = function(grunt) { - - const fs = require('fs'); - const dirs = fs.readdirSync('./').filter(f => fs.existsSync("./"+f + '/Gruntfile.js')); - console.log(dirs) - - grunt.initConfig({ - subgrunt: { - options: { - // Task-specific options go here. - npmInstall:false - }, - all: dirs, - watch: { - options:{ - limit:dirs.length - }, - projects: dirs.reduce((acc,curr)=> (acc[curr]='watch', acc),{}) - } - }, - }) - - - grunt.loadNpmTasks('grunt-subgrunt'); - grunt.registerTask('watch', ['subgrunt:watch']); - grunt.registerTask('default', ['subgrunt:all']); -} \ No newline at end of file diff --git a/frontend/front-srv/assets/access.directory/manifest.xml b/frontend/front-srv/assets/access.directory/manifest.xml new file mode 100644 index 0000000000..858ca54423 --- /dev/null +++ b/frontend/front-srv/assets/access.directory/manifest.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/frontend/front-srv/assets/access.gateway/Gruntfile.js b/frontend/front-srv/assets/access.gateway/Gruntfile.js deleted file mode 100644 index e2d91fe67c..0000000000 --- a/frontend/front-srv/assets/access.gateway/Gruntfile.js +++ /dev/null @@ -1,8 +0,0 @@ -module.exports = function(grunt) { - - const {initConfig, loadNpmTasks, registerTasks} = require('../gruntConfigCommon.js') - grunt.initConfig(initConfig('FSActions')); - loadNpmTasks(grunt); - registerTasks(grunt); - -}; diff --git a/frontend/front-srv/assets/access.gateway/i18n/editor.picker/de.all.json b/frontend/front-srv/assets/access.gateway/i18n/editor.picker/de.all.json index ae0a241bee..d36b68ee9f 100644 --- a/frontend/front-srv/assets/access.gateway/i18n/editor.picker/de.all.json +++ b/frontend/front-srv/assets/access.gateway/i18n/editor.picker/de.all.json @@ -18,7 +18,7 @@ "other": "Aktion für %s auswählen..." }, "drop.cell.share.legend": { - "other": "Neue Element zu dieser Zelle hinzufügen" + "other": "Neue Element zu dieser Cell hinzufügen" }, "drop.cell.copymove.legend": { "other": "Innerhalb %s" diff --git a/frontend/front-srv/assets/access.gateway/manifest.xml b/frontend/front-srv/assets/access.gateway/manifest.xml index 1a2497c6ba..9aabbed740 100644 --- a/frontend/front-srv/assets/access.gateway/manifest.xml +++ b/frontend/front-srv/assets/access.gateway/manifest.xml @@ -1,7 +1,7 @@ - + diff --git a/frontend/front-srv/assets/access.gateway/package.json b/frontend/front-srv/assets/access.gateway/package.json index 2f52970fc5..9515c73713 100644 --- a/frontend/front-srv/assets/access.gateway/package.json +++ b/frontend/front-srv/assets/access.gateway/package.json @@ -11,11 +11,13 @@ "babel-plugin-add-module-exports": "^1.0.4", "@babel/preset-env": "^7.14.7", "@babel/preset-react": "^7.14.5", - "grunt-babel": "^8.0.0", - "grunt-browserify": "^6.0.0", - "grunt-contrib-compress": "^2.0.0", - "grunt-contrib-copy": "^1.0.0", - "grunt-contrib-uglify": "^5.0.1", - "grunt-contrib-watch": "^1.1.0" + "babel-loader": "^9.1.2", + "babel-plugin-add-module-exports": "^1.0.4", + "compression-webpack-plugin": "^10.0.0", + "webpack": "^5.75.0", + "webpack-cli": "^5.0.1" + }, + "scripts": { + "build": "webpack --config webpack.config.js" } } diff --git a/frontend/front-srv/assets/access.gateway/res/dist/FSActions.min.js b/frontend/front-srv/assets/access.gateway/res/dist/FSActions.min.js index 628e82ea2c..1545fe4dc0 100644 --- a/frontend/front-srv/assets/access.gateway/res/dist/FSActions.min.js +++ b/frontend/front-srv/assets/access.gateway/res/dist/FSActions.min.js @@ -1 +1,2 @@ -!function(e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):("undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this).FSActions=e()}(function(){return function n(r,i,a){function l(t,e){if(!i[t]){if(!r[t]){var o="function"==typeof require&&require;if(!e&&o)return o(t,!0);if(s)return s(t,!0);throw(e=new Error("Cannot find module '"+t+"'")).code="MODULE_NOT_FOUND",e}o=i[t]={exports:{}},r[t][0].call(o.exports,function(e){return l(r[t][1][e]||e)},o,o.exports,n,r,i,a)}return i[t].exports}for(var s="function"==typeof require&&require,e=0;ee.length)&&(t=e.length);for(var o=0,n=new Array(t);o{"use strict";var e={455:e=>{e.exports=require("material-ui")},757:e=>{e.exports=require("pydio")},880:e=>{e.exports=require("pydio/http/api")},603:e=>{e.exports=require("pydio/model/data-model")},262:e=>{e.exports=require("pydio/util/dom")},180:e=>{e.exports=require("pydio/util/func")},763:e=>{e.exports=require("pydio/util/lang")},689:e=>{e.exports=require("react")}},t={};function o(r){var n=t[r];if(void 0!==n)return n.exports;var i=t[r]={exports:{}};return e[r](i,i.exports,o),i.exports}o.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return o.d(t,{a:t}),t},o.d=(e,t)=>{for(var r in t)o.o(t,r)&&!o.o(e,r)&&Object.defineProperty(e,r,{enumerable:!0,get:t[r]})},o.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),o.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),o.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})};var r={};(()=>{function e(e){return function(t,o){var r=o&&o.length?o[0]:null;e.UI.openCurrentSelectionInEditor(r)}}o.r(r),o.d(r,{Callbacks:()=>Je,CrossWsDropDialog:()=>Re,Listeners:()=>et,OtherEditorPickerDialog:()=>m,TreeDialog:()=>J,UploadDialog:()=>oe});const t=require("create-react-class");var n=o.n(t);const i=require("prop-types");var a=o.n(i),s=o(689),l=o(455),c=l.FontIcon,u=l.ListItem,d=l.List,p=l.FlatButton,f=o(757),g=o(603),h=o(763),y=f.requireLib("boot").ActionDialogMixin,m=n()({displayName:"OtherEditorPickerDialog",propTypes:{pydio:a().instanceOf(f),selection:a().instanceOf(g)},mixins:[y],getButtons:function(e){var t=[],o=this.props.pydio.MessageHash;return t.push(s.createElement(p,{key:"clear",label:MessageHash["openother.5"],primary:!1,onClick:this.clearAssociations})),t.push(s.createElement(p,{label:o[54],primary:!0,keyboardFocused:!0,onClick:this.props.onDismiss})),t},getDefaultProps:function(){return{dialogTitleId:"openother.2",dialogIsModal:!1,dialogSize:"sm",dialogPadding:0}},findActiveEditors:function(e){var t=[],o=!1,r=this.props.pydio;return null==this.user||this.user.canWrite()||(o=!0),r.Registry.getActiveExtensionByType("editor").forEach((function(e){o&&e.write||e.openable&&t.push(e)})),t},clearAssociations:function(){var e,t,o=this.props.selection.getUniqueNode().getAjxpMime();try{t=(e=this.props.pydio.user.getPreference("gui_preferences",!0)).other_editor_extensions}catch(e){}if(t&&t[o]){var r,n=t[o];this.props.pydio.Registry.getActiveExtensionByType("editor").forEach((function(e){e.editorClass===n&&(r=e)})),r&&-1!==r.mimes.indexOf(o)&&(r.mimes=h.arrayWithout(r.mimes,r.mimes.indexOf(o))),delete t[o],e.other_editor_extensions=t,this.props.pydio.user.setPreference("gui_preferences",e,!0),this.props.pydio.user.savePreference("gui_preferences")}this.props.onDismiss()},selectEditor:function(t,o){var r=this.props,n=r.pydio,i=r.selection.getUniqueNode().getAjxpMime();t.mimes.push(i);var a=n.user;if(a){var s=a.getPreference("gui_preferences",!0)||{},l=s.other_editor_extensions||{};l[i]=t.editorClass,s.other_editor_extensions=l,a.setPreference("gui_preferences",s,!0),a.savePreference("gui_preferences"),e(n)(null,[t]),this.dismiss()}},render:function(){var e=this,t=this.findActiveEditors("*").map((function(t){var o=s.createElement(c,{className:t.icon_class});return s.createElement(u,{onClick:e.selectEditor.bind(e,t),primaryText:t.text,secondaryText:t.title,leftIcon:o})}));return s.createElement(d,{style:{maxHeight:320,overflowY:"scroll",width:"100%",borderTop:"1px solid #e0e0e0"}},t)}}),v=o(689),b=o.n(v),w=o(757),x=o.n(w),C=o(763),E=o.n(C);const S=require("cells-sdk");var P=o(603),R=o.n(P),O=o(455);const _=require("material-ui/styles");function T(e){return T="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},T(e)}function N(e){return function(e){if(Array.isArray(e))return k(e)}(e)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(e)||U(e)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function M(e,t){var o=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),o.push.apply(o,r)}return o}function I(e){for(var t=1;te.length)&&(t=e.length);for(var o=0,r=new Array(t);o0&&void 0!==arguments[0]?arguments[0]:null,n=this.props.pydio,i=n.user,a=i.getRepositoriesList().get(i.activeRepository).getLabel();null!==r&&"__CURRENT__"!==r?(e=r,a=i.getCrossRepositories().get(r).getLabel()):null===r&&(!i.canWrite()&&i.canCrossRepositoryCopy()&&i.hasCrossRepositories()&&(e=i.getCrossRepositories().keys().next().value,a=i.getCrossRepositories().get(e).getLabel()),n.getContextHolder().getContextNode().isRoot()||(t=n.getContextHolder().getContextNode().getPath()));var s={filters:{type:"COLLECTION"}},l=R().RemoteDataModelFactory(e?I(I({},s),{},{tmp_repository_id:e}):s,a),c=l.getRootNode();return e&&c.getMetadata().set("repository_id",e),t?(n.getContextHolder().getRootNode().getChildren().forEach((function(e){c.addChild(e)})),l.loadPathInfoAsync(t,function(e){l.requireContextChange(e)}.bind(this))):(c.observeOnce("loaded",(function(){o.forceUpdate()})),c.load(l.getAjxpNodeProvider())),l.observe("context_changed",(function(){o.forceUpdate()})),l},onNodeSelected:function(e){var t=this.state.dataModel;t.setContextNode(e),e.load(t.getAjxpNodeProvider())},createNewFolder:function(){var e=this,t=this.props.pydio,o=this.state,r=o.dataModel,n=o.newFolderInput,i=r.getContextNode(),a=t.user.getActiveRepositoryObject().getSlug();"__CURRENT__"!==this.state.wsId&&(a=t.user.getRepositoriesList().get(this.state.wsId).getSlug());var s=new S.TreeServiceApi(PydioApi.getRestClient()),l=new S.RestCreateNodesRequest,c=a+E().trimRight(i.getPath(),"/")+"/"+n,u=new S.TreeNode;u.Path=c,u.Type=S.TreeNodeType.constructFromObject("COLLECTION"),l.Nodes=[u],s.createNodes(l).then((function(t){i.observeOnce("loaded",(function(){var e=("/"===i.getPath()?"":i.getPath())+"/"+n,t=i.getChildren().get(e);t&&r.setContextNode(t)})),setTimeout((function(){return i.reload(r.getAjxpNodeProvider())}),1e3),e.setState({newFolderFormOpen:!1,newFolderInput:""})}))},toggleNewFolderForm:function(){var e=this,t=!this.state.newFolderFormOpen;this.setState({newFolderFormOpen:t},(function(){t&&e.refs.newfolder_input.focus()}))},buildWsSelector:function(){var e=this.props.pydio,t=e.user,o=this.state.wsId,r=b().createElement("div",{style:{height:30}});if(t&&t.canCrossRepositoryCopy()&&t.hasCrossRepositories()){var n=[],i=[];if(t.canWrite()){var a=t.getActiveRepositoryObject();n.push(b().createElement(O.MenuItem,{key:"current",value:"__CURRENT__",primaryText:a.getLabel()+" - "+e.MessageHash[372],leftIcon:b().createElement(O.FontIcon,{style:{fontSize:20,height:20,top:a.getOwner()?5:1},className:a.getOwner()?"icomoon-cells":"mdi mdi-folder"})})),n.push(b().createElement(O.Divider,null))}t.getCrossRepositories().forEach((function(e,t){i.push({label:e.getLabel(),owner:!!e.getOwner(),item:b().createElement(O.MenuItem,{key:t,value:t,primaryText:e.getLabel(),leftIcon:b().createElement(O.FontIcon,{style:{fontSize:20,height:20,top:e.getOwner()?5:1},className:e.getOwner()?"icomoon-cells":"mdi mdi-folder"})})})})),i.sort((function(e,t){return e.owner===t.owner?e.label.localeCompare(t.label,void 0,{numeric:!0}):e.owner?1:-1})),n=[].concat(N(n),N(i.map((function(e){return e.item})))),r=b().createElement("div",null,b().createElement(F,{fullWidth:!0,variant:"v2",floatingLabelText:e.MessageHash[455],value:o,onChange:this.handleRepositoryChange.bind(this)},n))}return r},buildRecentLocations:function(){var e,t=this,o=this.props.pydio,r=o.user;if(!J.RecentPlaces||!J.RecentPlaces.length)return e;var n=this.props.submitValue;return b().createElement("div",{style:{borderBottom:"1px solid #e0e0e0",padding:"3px 7px 1px",backgroundColor:"#F6F6F8"}},b().createElement("div",{style:{color:"rgba(0,0,0,.3)",fontSize:12}},o.MessageHash["action.copymove.recent"]),b().createElement("div",{style:{display:"flex",flexWrap:"wrap",paddingTop:2}},J.RecentPlaces.map((function(e){var o,i=L(e.split(":"),2),a=i[0],s=i[1],l=s;if(r&&r.getRepositoriesList().has(a)){var c=r.getRepositoriesList().get(a);o=b().createElement(O.Avatar,{style:{fontSize:12,height:24,width:24,fontWeight:500}},c.getLettersBadge()),l=c.getLabel()+s}return b().createElement(O.Chip,{style:{margin:"0 3px 4px 0"},labelStyle:{lineHeight:"24px"},title:l,onClick:function(){n(s,a),t.dismiss()}},o,s)}))))},render:function(){var e=this,t=this.props,o=t.pydio,r=t.submitValue,n=this.state,i=n.newFolderFormOpen,a=n.dataModel,s=n.newFolderInput,l=this.buildWsSelector();return b().createElement("div",{style:{width:"100%"}},J.RecentPlaces&&J.RecentPlaces.length>0&&b().createElement(G,{recentPlaces:J.RecentPlaces,pydio:o,submitValue:r,dismiss:function(){return e.dismiss()}}),l,b().createElement(O.Paper,{zDepth:0,style:{height:300,overflowX:"auto",color:"var(--md-sys-color-on-surface-variant)",fontSize:14,padding:"6px 0px",backgroundColor:"var(--md-sys-color-surface-variant)",marginTop:4,borderBottom:"1px solid #e0e0e0",borderRadius:"2px 2px 0 0"}},b().createElement("div",{style:{marginTop:-6,marginLeft:-5}},b().createElement(H,{pydio:o,dataModel:a,onNodeSelected:this.onNodeSelected.bind(this),showRoot:!0,draggable:!1,rootLabel:o.MessageHash["action.copymove.root"],getItemStyle:function(e){return a.getContextNode()===e?{fontWeight:500,backgroundColor:"var(--md-sys-color-secondary)",color:"var(--md-sys-color-on-secondary)"}:{}},getRightIcon:function(t){return a.getContextNode()===t?b().createElement(O.IconButton,{iconClassName:"mdi mdi-folder-plus",style:{height:18,width:18,padding:0,marginRight:0},iconStyle:{opacity:.5,fontSize:18},tooltip:o.MessageHash[154],tooltipPosition:"bottom-left",onClick:function(){return e.toggleNewFolderForm()}}):null}}))),b().createElement(O.Paper,{className:"bezier-transitions",zDepth:0,style:{position:"relative",height:i?60:0,overflow:i?"visible":"hidden",opacity:i?1:0,padding:0,marginTop:i?0:4}},b().createElement(A,{fullWidth:!0,floatingLabelText:o.MessageHash[173],ref:"newfolder_input",variant:"v2",value:s,onKeyDown:function(t){"Enter"===t.key&&s&&e.createNewFolder()},onChange:function(t,o){return e.setState({newFolderInput:o})}}),b().createElement("div",{style:{position:"absolute",bottom:-2,right:0}},b().createElement(O.IconButton,{iconClassName:"mdi mdi-check",iconStyle:{color:"#546E7A"},tooltip:this.props.pydio.MessageHash[48],onClick:function(){e.createNewFolder()}}),b().createElement(O.IconButton,{iconClassName:"mdi mdi-close",iconStyle:{color:"#546E7A"},tooltip:this.props.pydio.MessageHash[54],onClick:function(){return e.toggleNewFolderForm()}}))))}});function V(e){return V="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},V(e)}function Y(){return Y=Object.assign?Object.assign.bind():function(e){for(var t=1;t1&&b().createElement(te,{tabs:t,dismiss:r}),o,!s&&b().createElement("div",{style:{padding:"100px 40px",textAlign:"center",color:"rgba(0,0,0,.5)"}},this.props.pydio.MessageHash[466]))}});const re=require("pydio/model/meta-node-provider");var ne=o.n(re),ie=o(880),ae=o.n(ie);const se=require("pydio/model/cell");var le=o.n(se),ce=o(880);function ue(e){return function(t,o,r,n){var i=e.user.getActiveRepositoryObject().getSlug(),a=i;if(n){var s=e.user.getRepositoriesList().get(n);s&&(a=s.getSlug())}var l=o.getSelectedNodes(),c={nodes:l.map((function(e){return i+e.getPath()})),target:a+r,targetParent:!0};ce.getRestClient().userJob(t,c).then((function(o){"move"===t?l.forEach((function(t){var r=e.MessageHash["background.move."+(t.isLeaf()?"file":"folder")];t.getMetadata().set("pending_operation",r),t.getMetadata().set("pending_operation_uuid",o.JobUuid),t.notify("meta_replaced",t)})):e.UI.displayMessage("SUCCESS",e.MessageHash["background.copy.selection"]),e.getContextHolder().setSelectedNodes([])})).catch((function(t){var o=t.Detail||t.message||t;e.UI.displayMessage("ERROR",o)}))}}function de(e){return de="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},de(e)}function pe(e,t){for(var o=0;o1&&void 0!==arguments[1]?arguments[1]:null;ue(e)("copy",o,t,r)}})}}(Ge),move:function(e){var t=e.MessageHash,o=function(e,t){var o=t.getMetadata().has("repository_id");if(t.getMetadata().has("local:dropFunc"))t.getMetadata().has("local:canDropFunc")&&t.getMetadata().get("local:canDropFunc")(e,t);else{if(t.isLeaf()||t.getPath()===e.getPath()||!o&&E().trimRight(t.getPath(),"/")===je().getDirname(e.getPath()))throw new Error("Cannot drop on leaf or on same path");if(t.getMetadata().has("virtual_root"))throw new Error("Cannot drop on virtual root");if(e.getMetadata().has("ws_root"))throw new Error("Cannot move roots around");if("true"===t.getMetadata().get("node_readonly")||t.getMetadata().has("workspaceEntry")&&!t.getMetadata().get("workspaceEntry").allowCrossRepositoryCopy)throw new Error("Cannot drop on this branch (readonly)")}};return function(r){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null;if(n&&n instanceof Array&&n.length&&n[0]instanceof Ue&&(n=n[0]),n&&n instanceof Ue){if(n.getStep()===Ue.STEP_CAN_DROP){var i=n.getTarget(),a=n.getSource();return o(a,i),!1}if(n.getStep()===Ue.STEP_END_DRAG){try{o(n.getSource(),n.getTarget())}catch(e){return}var s=r.getDataModel(),l=n.getTarget().getPath(),c=null;if(n.getTarget().getMetadata().has("repository_id")){c=n.getTarget().getMetadata().get("repository_id");var u=n.getTarget().getMetadata().get("workspaceEntry");if(u&&"cell"===u.getRepositoryType())return void e.UI.openComponentInModal("FSActions","CrossWsDropDialog",{target:n.getTarget(),source:n.getSource(),dropEffect:n.getDropEffect()||"move",cellWs:u})}else if(n.getTarget().getMetadata().has("local:dropFunc"))return void n.getTarget().getMetadata().get("local:dropFunc")("dnd",n.getSource(),n.getTarget());var d=ue(e),p=n.getSource();if(-1===s.getSelectedNodes().indexOf(p)){var f=new PydioDataModel;f.setContextNode(s.getContextNode()),f.setSelectedNodes([n.getSource()]),d(n.getDropEffect()||"move",f,l,c)}else d(n.getDropEffect()||"move",s,l,c)}}else{var g=e.getUserSelection();e.UI.openComponentInModal("FSActions","TreeDialog",{isMove:!0,dialogTitle:t[160],submitValue:function(t){var o=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null;ue(e)("move",g,t,o)}})}}}(Ge),upload:function(e){return function(t,o){var r={};o&&o.length&&(r={uploaderProps:o[0]}),e.UI.openComponentInModal("FSActions","UploadDialog",r)}}(Ge),download:De(Ge),downloadPDF:function(e){return function(){var t=e.getUserSelection().getUniqueNode(),o=ae().getClient(),r=je().getBasename(t.getPath()).replace(t.getAjxpMime(),"pdf"),n=navigator.userAgent||"",i=-1!==n.indexOf("iPhone")||-1!==n.indexOf("iPod")||-1!==n.indexOf("iPad")||-1!==n.indexOf("iOs"),a=e.UI&&e.UI.hasHiddenDownloadForm();o.buildPresignedGetUrl(t,null,"",{Bucket:"io",Key:"pydio-thumbstore/"+t.getMetadata().get("PDFPreview"),Expires:600},r).then((function(t){i||!a?document.location.href=t:e.UI.sendDownloadToHiddenForm(e.getUserSelection(),{presignedUrl:t})}))}}(Ge),downloadAll:function(e){return function(){var t=e.getContextHolder();t.setSelectedNodes([t.getRootNode()]),De(e)()}}(Ge),emptyRecycle:function(e){var t=e.MessageHash;return function(){e.UI.openComponentInModal("PydioReactUI","ConfirmDialog",{message:t[177],dialogTitleId:220,validCallback:function(){var t=e.user.getActiveRepositoryObject().getSlug(),o=new S.RestDeleteNodesRequest,r=new S.TreeServiceApi(ae().getRestClient()),n=new S.TreeNode;n.Path=t+"/recycle_bin",o.Nodes=[n],r.deleteNodes(o).then((function(t){t.DeleteJobs&&t.DeleteJobs.forEach((function(t){e.UI.displayMessage("SUCCESS",t.Label)})),e.getContextHolder().requireContextChange(e.getContextHolder().getRootNode())})).catch((function(t){e.UI.displayMessage("ERROR",t.Title||t.message)}))}})}}(Ge),restore:function(e){return function(){var t=e.getContextHolder().getSelectedNodes(),o=e.user.getActiveRepositoryObject().getSlug(),r=new S.RestRestoreNodesRequest,n=new S.TreeServiceApi(ae().getRestClient());r.Nodes=t.map((function(e){var t=new S.TreeNode;return t.Path=o+e.getPath(),t})),n.restoreNodes(r).then((function(o){o.RestoreJobs&&o.RestoreJobs.length&&t.forEach((function(e){o.RestoreJobs.forEach((function(t){t.NodeUuid===e.getMetadata().get("uuid")&&(e.getMetadata().set("pending_operation",t.Label),e.getMetadata().set("pending_operation_uuid",t.Uuid),e.notify("meta_replaced",e))}))})),e.getContextHolder().setSelectedNodes([])}))}}(Ge),openInEditor:e(Ge),ajxpLink:function(e){return function(){var t,o=Fe.getUrlFromBase(),r=e.repositoryId||(e.user?e.user.activeRepository:null);if(e.user){var n=e.user.repositories.get(r).getSlug();n&&(r="ws-"+n)}t=He.trimRight(o,"/")+"/"+r+e.getUserSelection().getUniqueNode().getPath(),e.UI.openComponentInModal("PydioReactUI","PromptDialog",{dialogTitleId:369,fieldLabelId:296,defaultValue:t,submitValue:Ae.Empty})}}(Ge),openOtherEditorPicker:Be(Ge),lock:function(e){return function(){var t=new S.UserMetaServiceApi(ae().getRestClient()),o=new S.IdmUpdateUserMetaRequest,r=e.getContextHolder().getUniqueNode(),n=new S.IdmUserMeta;n.NodeUuid=r.getMetadata().get("uuid"),n.Namespace="content_lock",n.JsonValue=e.user.id;var i=r.getMetadata().get("sl_locked");o.Operation=i?"DELETE":"PUT",o.MetaDatas=[n],t.updateUserMeta(o).then((function(t){e.getContextHolder().requireNodeReload(r)}))}}(Ge),goTo:function(e){return function(){var t=e.getContextHolder().getUniqueNode();e.goTo(t)}}(Ge)};function Ve(e){return Ve="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},Ve(e)}function Ye(){Ye=function(){return e};var e={},t=Object.prototype,o=t.hasOwnProperty,r=Object.defineProperty||function(e,t,o){e[t]=o.value},n="function"==typeof Symbol?Symbol:{},i=n.iterator||"@@iterator",a=n.asyncIterator||"@@asyncIterator",s=n.toStringTag||"@@toStringTag";function l(e,t,o){return Object.defineProperty(e,t,{value:o,enumerable:!0,configurable:!0,writable:!0}),e[t]}try{l({},"")}catch(e){l=function(e,t,o){return e[t]=o}}function c(e,t,o,n){var i=t&&t.prototype instanceof p?t:p,a=Object.create(i.prototype),s=new P(n||[]);return r(a,"_invoke",{value:x(e,o,s)}),a}function u(e,t,o){try{return{type:"normal",arg:e.call(t,o)}}catch(e){return{type:"throw",arg:e}}}e.wrap=c;var d={};function p(){}function f(){}function g(){}var h={};l(h,i,(function(){return this}));var y=Object.getPrototypeOf,m=y&&y(y(R([])));m&&m!==t&&o.call(m,i)&&(h=m);var v=g.prototype=p.prototype=Object.create(h);function b(e){["next","throw","return"].forEach((function(t){l(e,t,(function(e){return this._invoke(t,e)}))}))}function w(e,t){function n(r,i,a,s){var l=u(e[r],e,i);if("throw"!==l.type){var c=l.arg,d=c.value;return d&&"object"==Ve(d)&&o.call(d,"__await")?t.resolve(d.__await).then((function(e){n("next",e,a,s)}),(function(e){n("throw",e,a,s)})):t.resolve(d).then((function(e){c.value=e,a(c)}),(function(e){return n("throw",e,a,s)}))}s(l.arg)}var i;r(this,"_invoke",{value:function(e,o){function r(){return new t((function(t,r){n(e,o,t,r)}))}return i=i?i.then(r,r):r()}})}function x(e,t,o){var r="suspendedStart";return function(n,i){if("executing"===r)throw new Error("Generator is already running");if("completed"===r){if("throw"===n)throw i;return{value:void 0,done:!0}}for(o.method=n,o.arg=i;;){var a=o.delegate;if(a){var s=C(a,o);if(s){if(s===d)continue;return s}}if("next"===o.method)o.sent=o._sent=o.arg;else if("throw"===o.method){if("suspendedStart"===r)throw r="completed",o.arg;o.dispatchException(o.arg)}else"return"===o.method&&o.abrupt("return",o.arg);r="executing";var l=u(e,t,o);if("normal"===l.type){if(r=o.done?"completed":"suspendedYield",l.arg===d)continue;return{value:l.arg,done:o.done}}"throw"===l.type&&(r="completed",o.method="throw",o.arg=l.arg)}}}function C(e,t){var o=t.method,r=e.iterator[o];if(void 0===r)return t.delegate=null,"throw"===o&&e.iterator.return&&(t.method="return",t.arg=void 0,C(e,t),"throw"===t.method)||"return"!==o&&(t.method="throw",t.arg=new TypeError("The iterator does not provide a '"+o+"' method")),d;var n=u(r,e.iterator,t.arg);if("throw"===n.type)return t.method="throw",t.arg=n.arg,t.delegate=null,d;var i=n.arg;return i?i.done?(t[e.resultName]=i.value,t.next=e.nextLoc,"return"!==t.method&&(t.method="next",t.arg=void 0),t.delegate=null,d):i:(t.method="throw",t.arg=new TypeError("iterator result is not an object"),t.delegate=null,d)}function E(e){var t={tryLoc:e[0]};1 in e&&(t.catchLoc=e[1]),2 in e&&(t.finallyLoc=e[2],t.afterLoc=e[3]),this.tryEntries.push(t)}function S(e){var t=e.completion||{};t.type="normal",delete t.arg,e.completion=t}function P(e){this.tryEntries=[{tryLoc:"root"}],e.forEach(E,this),this.reset(!0)}function R(e){if(e){var t=e[i];if(t)return t.call(e);if("function"==typeof e.next)return e;if(!isNaN(e.length)){var r=-1,n=function t(){for(;++r=0;--n){var i=this.tryEntries[n],a=i.completion;if("root"===i.tryLoc)return r("end");if(i.tryLoc<=this.prev){var s=o.call(i,"catchLoc"),l=o.call(i,"finallyLoc");if(s&&l){if(this.prev=0;--r){var n=this.tryEntries[r];if(n.tryLoc<=this.prev&&o.call(n,"finallyLoc")&&this.prev=0;--t){var o=this.tryEntries[t];if(o.finallyLoc===e)return this.complete(o.completion,o.afterLoc),S(o),d}},catch:function(e){for(var t=this.tryEntries.length-1;t>=0;--t){var o=this.tryEntries[t];if(o.tryLoc===e){var r=o.completion;if("throw"===r.type){var n=r.arg;S(o)}return n}}throw new Error("illegal catch attempt")},delegateYield:function(e,t,o){return this.delegate={iterator:R(e),resultName:t,nextLoc:o},"next"===this.method&&(this.arg=void 0),d}},e}function Ke(e,t,o,r,n,i,a){try{var s=e[i](a),l=s.value}catch(e){return void o(e)}s.done?t(l):Promise.resolve(l).then(r,n)}function Xe(e,t){for(var o=0;o-1&&(!d&&u>0&&r.push({separator:!0}),d=!0),r.push({name:e.text,alt:e.title,isDefault:0===u,icon_class:e.icon_class,callback:function(t){this.apply([e])}.bind(this)}),u++))}.bind(this)),r.push({name:o["openother.1"],alt:o["openother.2"],isDefault:0===u,icon_class:"mdi mdi-view-list",callback:t})),u||r.push({name:o[324],alt:o[324],callback:function(e){}}),r}}(Ze),lockSelectionChange:function(e){return function(){var t=e.getController().getActionByName("sl_lock"),o=e.getUserSelection().getUniqueNode();t&&o&&(t.selectionContext.allowedMimes=[],o.getMetadata().get("sl_locked")?(t.setIconClassName("mdi mdi-lock-outline"),t.setLabel("meta.simple_lock.3"),o.getMetadata().get("sl_mylock")||(t.selectionContext.allowedMimes=["fake_extension_that_never_exists"])):(t.setIconClassName("mdi mdi-lock-outline"),t.setLabel("meta.simple_lock.1")))}}(Ze),deleteTemplateByUuid:function(){}}})(),window.FSActions=r})(); \ No newline at end of file diff --git a/frontend/front-srv/assets/access.gateway/res/dist/FSActions.min.js.LICENSE.txt b/frontend/front-srv/assets/access.gateway/res/dist/FSActions.min.js.LICENSE.txt new file mode 100644 index 0000000000..ae386fb79c --- /dev/null +++ b/frontend/front-srv/assets/access.gateway/res/dist/FSActions.min.js.LICENSE.txt @@ -0,0 +1 @@ +/*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/facebook/regenerator/blob/main/LICENSE */ diff --git a/frontend/front-srv/assets/access.gateway/res/dist/FSActions.min.js.gz b/frontend/front-srv/assets/access.gateway/res/dist/FSActions.min.js.gz index e461560872..274cf8c3a1 100644 Binary files a/frontend/front-srv/assets/access.gateway/res/dist/FSActions.min.js.gz and b/frontend/front-srv/assets/access.gateway/res/dist/FSActions.min.js.gz differ diff --git a/frontend/front-srv/assets/access.gateway/res/js/callback/copy.js b/frontend/front-srv/assets/access.gateway/res/js/callback/copy.js index 4cf42fd530..8bc03e61de 100644 --- a/frontend/front-srv/assets/access.gateway/res/js/callback/copy.js +++ b/frontend/front-srv/assets/access.gateway/res/js/callback/copy.js @@ -18,6 +18,8 @@ * The latest code can be found at . */ +import moveLoader from './applyCopyOrMove' + export default function (pydio) { const {MessageHash} = pydio; @@ -25,7 +27,7 @@ export default function (pydio) { // + Handle copy in same folder, move in same folder let selection = pydio.getUserSelection(); const submit = function(path, wsId = null){ - require('./applyCopyOrMove')(pydio)('copy', selection, path, wsId); + moveLoader(pydio)('copy', selection, path, wsId); }; pydio.UI.openComponentInModal('FSActions', 'TreeDialog', { diff --git a/frontend/front-srv/assets/access.gateway/res/js/callback/downloadAll.js b/frontend/front-srv/assets/access.gateway/res/js/callback/downloadAll.js index a2fbb2a666..dbd18ec3dc 100644 --- a/frontend/front-srv/assets/access.gateway/res/js/callback/downloadAll.js +++ b/frontend/front-srv/assets/access.gateway/res/js/callback/downloadAll.js @@ -18,12 +18,14 @@ * The latest code can be found at . */ +import dlLoader from './download' + export default function (pydio) { return function(){ let dm = pydio.getContextHolder(); dm.setSelectedNodes([dm.getRootNode()]); - require('./download')(pydio)(); + dlLoader(pydio)(); } } \ No newline at end of file diff --git a/frontend/front-srv/assets/access.gateway/res/js/callback/index.js b/frontend/front-srv/assets/access.gateway/res/js/callback/index.js index ef1624ceb8..377fb2d897 100644 --- a/frontend/front-srv/assets/access.gateway/res/js/callback/index.js +++ b/frontend/front-srv/assets/access.gateway/res/js/callback/index.js @@ -19,27 +19,46 @@ */ let pydio = global.pydio; +import ls from './ls' +import mkdir from './mkdir' +import deletef from './deleteAction' +import {renameFunction as rename, callback as renameCallback} from './rename' +import applycopy from './applyCopyOrMove' +import copy from './copy' +import move from './move' +import upload from './upload' +import download from './download' +import downloadPDF from './downloadPDF' +import downloadAll from './downloadAll' +import emptyRecycle from './emptyRecycle' +import restore from './restore' +import openInEditor from './openInEditor' +import ajxpLink from './ajxpLink' +import openOtherEditorPicker from './openOtherEditorPicker' +import lock from './lock' +import goTo from './goto' const Callbacks = { - ls : require('./ls')(pydio), - mkdir : require('./mkdir')(pydio), - deleteAction : require('./deleteAction')(pydio), - rename : require('./rename').renameFunction, - renameCallback : require('./rename').callback, - applyCopyOrMove : require('./applyCopyOrMove')(pydio), - copy : require('./copy')(pydio), - move : require('./move')(pydio), - upload : require('./upload')(pydio), - download : require('./download')(pydio), - downloadPDF : require('./downloadPDF')(pydio), - downloadAll : require('./downloadAll')(pydio), - emptyRecycle : require('./emptyRecycle')(pydio), - restore : require('./restore')(pydio), - openInEditor : require('./openInEditor')(pydio), - ajxpLink : require('./ajxpLink')(pydio), - openOtherEditorPicker : require('./openOtherEditorPicker')(pydio), - lock : require('./lock')(pydio), - goTo : require('./goto')(pydio) + ls : ls(pydio), + mkdir : mkdir(pydio), + deleteAction : deletef(pydio), + rename, + renameCallback, + applyCopyOrMove : applycopy(pydio), + copy : copy(pydio), + move : move(pydio), + upload : upload(pydio), + download : download(pydio), + downloadPDF : downloadPDF(pydio), + downloadAll : downloadAll(pydio), + + emptyRecycle : emptyRecycle(pydio), + restore : restore(pydio), + openInEditor : openInEditor(pydio), + ajxpLink : ajxpLink(pydio), + openOtherEditorPicker : openOtherEditorPicker(pydio), + lock : lock(pydio), + goTo : goTo(pydio) }; export {Callbacks as default} \ No newline at end of file diff --git a/frontend/front-srv/assets/access.gateway/res/js/callback/move.js b/frontend/front-srv/assets/access.gateway/res/js/callback/move.js index da205b8c05..9ed0c37b4f 100644 --- a/frontend/front-srv/assets/access.gateway/res/js/callback/move.js +++ b/frontend/front-srv/assets/access.gateway/res/js/callback/move.js @@ -20,6 +20,7 @@ import PathUtils from "pydio/util/path"; import LangUtils from "pydio/util/lang"; +import moveLoader from './applyCopyOrMove' const {DNDActionParameter} = require('pydio').requireLib('components'); export default function (pydio) { @@ -91,7 +92,7 @@ export default function (pydio) { dndActionParameter.getTarget().getMetadata().get('local:dropFunc')('dnd', dndActionParameter.getSource(), dndActionParameter.getTarget()) return; } - const moveFunction = require('./applyCopyOrMove')(pydio); + const moveFunction = moveLoader(pydio); const sourceNode = dndActionParameter.getSource(); const selectedNodes = selection.getSelectedNodes(); if(selectedNodes.indexOf(sourceNode) === -1){ @@ -111,7 +112,7 @@ export default function (pydio) { let selection = pydio.getUserSelection(); const submit = function(path, wsId = null){ - require('./applyCopyOrMove')(pydio)('move', selection, path, wsId); + moveLoader(pydio)('move', selection, path, wsId); }; pydio.UI.openComponentInModal('FSActions', 'TreeDialog', { diff --git a/frontend/front-srv/assets/access.gateway/res/js/dialog/CrossWsDropDialog.js b/frontend/front-srv/assets/access.gateway/res/js/dialog/CrossWsDropDialog.js index 757ccd9031..e9bdfc92a7 100644 --- a/frontend/front-srv/assets/access.gateway/res/js/dialog/CrossWsDropDialog.js +++ b/frontend/front-srv/assets/access.gateway/res/js/dialog/CrossWsDropDialog.js @@ -30,6 +30,7 @@ import {MetaServiceApi,RestGetBulkMetaRequest, TreeNode} from 'cells-sdk'; import CellModel from 'pydio/model/cell' import {muiThemeable} from 'material-ui/styles' import PropTypes from 'prop-types' +import moveLoader from '../callback/applyCopyOrMove' class CrossWsContent extends React.Component{ constructor(props){ @@ -70,7 +71,7 @@ class CrossWsContent extends React.Component{ move(targetNode){ const {source, cellWs, pydio, dropEffect} = this.props; - const moveFunction = require('../callback/applyCopyOrMove')(Pydio.getInstance()); + const moveFunction = moveLoader(Pydio.getInstance()); let selection = pydio.getContextHolder(); const selectedNodes = selection.getSelectedNodes(); if(selectedNodes.indexOf(source) === -1){ @@ -151,7 +152,7 @@ let CrossWsDropDialog = createReactClass({ let actions = []; const mess = this.props.pydio.MessageHash; actions.push(); actions.push( { + const {user} = pydio; + const styles = {}; + if(muiTheme.userTheme === 'material') { // oldschool + styles.root = {borderBottom: '1px solid #e0e0e0', padding: '3px 7px 1px', backgroundColor: '#F6F6F8'} + styles.hint = {color: 'rgba(0,0,0,.3)', fontSize: 12} + } else { + styles.root = {backgroundColor:muiTheme.palette.mui3['surface-variant']} + styles.hint = {color: muiTheme.palette.mui3['on-surface-variant'], fontSize: 12} + styles.chipBG = muiTheme.palette.mui3['inverse-primary'] + styles.avatarBG = muiTheme.palette.mui3['primary-container'] + styles.avatarColor = muiTheme.palette.mui3['on-primary-container'] + } + return ( +
+
{pydio.MessageHash['action.copymove.recent']}
+
{recentPlaces.map( p => { + const [ws, path] = p.split(":") + let avatar; + let tooltip = path; + if(user && user.getRepositoriesList().has(ws)){ + // Show workspace letters + const repo = user.getRepositoriesList().get(ws) + avatar = ( + {repo.getLettersBadge()} + ); + tooltip = repo.getLabel() + path; + } + return { + submitValue(path, ws); + dismiss(); + }} + >{avatar}{path} + })}
+
+ ) +} + +RecentLocations = muiThemeable()(RecentLocations) + +let TreeDialog = createReactClass({ propTypes:{ isMove:PropTypes.bool.isRequired, @@ -38,9 +89,9 @@ const TreeDialog = createReactClass({ }, mixins:[ - PydioReactUI.ActionDialogMixin, - PydioReactUI.CancelButtonProviderMixin, - PydioReactUI.SubmitButtonProviderMixin + ActionDialogMixin, + CancelButtonProviderMixin, + SubmitButtonProviderMixin ], getDefaultProps(){ @@ -99,7 +150,8 @@ const TreeDialog = createReactClass({ startPath = pydio.getContextHolder().getContextNode().getPath(); } } - const dm = PydioDataModel.RemoteDataModelFactory(repoId ? {tmp_repository_id:repoId} : {}, repoLabel); + const modelProperties = {filters:{type:'COLLECTION'}} + const dm = PydioDataModel.RemoteDataModelFactory(repoId ? {...modelProperties, tmp_repository_id:repoId} : modelProperties, repoLabel); const root = dm.getRootNode(); if(repoId) { root.getMetadata().set('repository_id', repoId); @@ -263,17 +315,18 @@ const TreeDialog = createReactClass({ }, render(){ - const {pydio} = this.props; + const {pydio, submitValue} = this.props; const {newFolderFormOpen, dataModel, newFolderInput} = this.state; const wsSelector = this.buildWsSelector(); - const recentPlaces = this.buildRecentLocations(); return (
- {recentPlaces} + {TreeDialog.RecentPlaces && TreeDialog.RecentPlaces.length > 0 && + this.dismiss()}/> + } {wsSelector} - +
{ + // Selected case if(dataModel.getContextNode() === node){ - return {fontWeight: 500, backgroundColor:'#ebebef'} + return { + fontWeight: 500, + backgroundColor:'var(--md-sys-color-secondary)', + color: 'var(--md-sys-color-on-secondary)' + } } return {} }} @@ -292,7 +350,7 @@ const TreeDialog = createReactClass({ if(dataModel.getContextNode() === node){ return (
{this.createNewFolder() }}/> - this.toggleNewFolderForm()}/> + this.toggleNewFolderForm()}/>
diff --git a/frontend/front-srv/assets/access.gateway/res/js/dialog/UploadDialog.js b/frontend/front-srv/assets/access.gateway/res/js/dialog/UploadDialog.js index 53066345fc..71598aebc6 100644 --- a/frontend/front-srv/assets/access.gateway/res/js/dialog/UploadDialog.js +++ b/frontend/front-srv/assets/access.gateway/res/js/dialog/UploadDialog.js @@ -29,9 +29,11 @@ class TopBar extends React.Component{ render(){ const {tabs, dismiss, muiTheme} = this.props; + const br = muiTheme.borderRadius + const {mui3} = muiTheme.palette return( -
- +
+ {tabs} @@ -81,7 +83,7 @@ let UploadDialog = createReactClass({ const dismiss = () => {this.dismiss()}; const {uploaders, current, loaded} = this.state; uploaders.map((uploader) => { - tabs.push({this.setState({current:uploader})}}/>); + tabs.push({this.setState({current:uploader})}} style={{textTransform:'none'}}/>); }); if(current){ let parts = current.moduleName.split('.'); diff --git a/frontend/front-srv/assets/access.gateway/res/js/listener/index.js b/frontend/front-srv/assets/access.gateway/res/js/listener/index.js index 3f236695e0..c0f9b3edd0 100644 --- a/frontend/front-srv/assets/access.gateway/res/js/listener/index.js +++ b/frontend/front-srv/assets/access.gateway/res/js/listener/index.js @@ -19,15 +19,23 @@ */ const pydio = global.pydio; +import mkfileDynamicBuilder from "./mkfileDynamicBuilder"; +import downloadSelectionChange from "./downloadSelectionChange"; +import downloadAllInit from "./downloadAllInit"; +import compressUiSelectionChange from "./compressUiSelectionChange"; +import copyContextChange from "./copyContextChange"; +import openWithDynamicBuilder from "./openWithDynamicBuilder"; +import lockSelectionChange from "./lockSelectionChange"; + const Listeners = { - mkfileDynamicBuilder : require('./mkfileDynamicBuilder')(pydio), - downloadSelectionChange : require('./downloadSelectionChange')(pydio), - downloadAllInit : require('./downloadAllInit')(pydio), - compressUiSelectionChange : require('./compressUiSelectionChange')(pydio), - copyContextChange : require('./copyContextChange')(pydio), - openWithDynamicBuilder : require('./openWithDynamicBuilder')(pydio), - lockSelectionChange : require('./lockSelectionChange')(pydio), + mkfileDynamicBuilder : mkfileDynamicBuilder(pydio), + downloadSelectionChange : downloadSelectionChange(pydio), + downloadAllInit : downloadAllInit(pydio), + compressUiSelectionChange : compressUiSelectionChange(pydio), + copyContextChange : copyContextChange(pydio), + openWithDynamicBuilder : openWithDynamicBuilder(pydio), + lockSelectionChange : lockSelectionChange(pydio), deleteTemplateByUuid: ()=>{}, }; diff --git a/frontend/front-srv/assets/access.gateway/res/js/listener/openWithDynamicBuilder.js b/frontend/front-srv/assets/access.gateway/res/js/listener/openWithDynamicBuilder.js index bb4dd9f96a..0097b024e8 100644 --- a/frontend/front-srv/assets/access.gateway/res/js/listener/openWithDynamicBuilder.js +++ b/frontend/front-srv/assets/access.gateway/res/js/listener/openWithDynamicBuilder.js @@ -18,11 +18,12 @@ * The latest code can be found at . */ -const PathUtils = require('pydio/util/path') +import PathUtils from 'pydio/util/path' +import openOtherEditorPicker from "../callback/openOtherEditorPicker"; export default function(pydio) { - const openOtherEditorPicker = require('../callback/openOtherEditorPicker')(pydio) + const openOtherEditorPickerCallback = openOtherEditorPicker(pydio) let {MessageHash} = pydio; return function () { @@ -79,8 +80,8 @@ export default function(pydio) { name: MessageHash['openother.1'], alt: MessageHash['openother.2'], isDefault: (index === 0), - icon_class: 'icon-list-alt', - callback: openOtherEditorPicker + icon_class: 'mdi mdi-view-list', + callback: openOtherEditorPickerCallback }); } if (!index) { diff --git a/frontend/front-srv/assets/access.gateway/webpack.config.js b/frontend/front-srv/assets/access.gateway/webpack.config.js new file mode 100644 index 0000000000..8daf822ea7 --- /dev/null +++ b/frontend/front-srv/assets/access.gateway/webpack.config.js @@ -0,0 +1,10 @@ +// Generated using webpack-cli https://github.com/webpack/webpack-cli +const CompressionPlugin = require("compression-webpack-plugin"); +const path = require("path"); +const {configLoader} = require('../webpack-commons') + +const config = configLoader({FSActions:'./res/js/index.js'}, path.resolve(__dirname, 'res/dist'), CompressionPlugin) + +module.exports = () => { + return config; +}; diff --git a/frontend/front-srv/assets/access.homepage/Gruntfile.js b/frontend/front-srv/assets/access.homepage/Gruntfile.js deleted file mode 100644 index ef4db89a4a..0000000000 --- a/frontend/front-srv/assets/access.homepage/Gruntfile.js +++ /dev/null @@ -1,40 +0,0 @@ -module.exports = function(grunt) { - - const {initConfig, loadNpmTasks} = require('../gruntConfigCommon.js') - const basicConfig = initConfig('WelcomeComponents') - basicConfig.less = { - development: { - options: { - plugins: [ - new (require('less-plugin-autoprefix'))({browsers: ["last 2 versions, > 10%"]}) - ] - }, - files: { - "res/home.css": "res/home.less" - } - } - }; - basicConfig.compress.css = { - expand: true, - cwd: 'res', - src: ['home.css'], - dest: 'res', - ext: '.css.gz' - }; - basicConfig.watch.styles = { - files: ['res/*.less'], - tasks: ['less', 'compress'], - options: { - nospawn: true - } - }; - - - - grunt.initConfig(basicConfig); - - loadNpmTasks(grunt) - grunt.loadNpmTasks('assemble-less'); - grunt.registerTask('default', ['babel', 'browserify', 'uglify', 'less', 'compress']); - -}; diff --git a/frontend/front-srv/assets/access.homepage/ajxp_home.png b/frontend/front-srv/assets/access.homepage/ajxp_home.png deleted file mode 100644 index 87e495be1f..0000000000 Binary files a/frontend/front-srv/assets/access.homepage/ajxp_home.png and /dev/null differ diff --git a/frontend/front-srv/assets/access.homepage/manifest.xml b/frontend/front-srv/assets/access.homepage/manifest.xml index 0d091b4f6f..96a55145da 100644 --- a/frontend/front-srv/assets/access.homepage/manifest.xml +++ b/frontend/front-srv/assets/access.homepage/manifest.xml @@ -4,7 +4,6 @@ - diff --git a/frontend/front-srv/assets/access.homepage/package.json b/frontend/front-srv/assets/access.homepage/package.json index 96050b2be3..65dc3f75cf 100644 --- a/frontend/front-srv/assets/access.homepage/package.json +++ b/frontend/front-srv/assets/access.homepage/package.json @@ -6,21 +6,26 @@ "author": "Abstrium SAS", "license": "AGPL", "devDependencies": { - "assemble-less": "~0.7.0", "@babel/core": "^7.14.6", "@babel/plugin-proposal-decorators": "^7.14.5", - "babel-plugin-add-module-exports": "^1.0.4", "@babel/preset-env": "^7.14.7", "@babel/preset-react": "^7.14.5", - "grunt-babel": "^8.0.0", - "grunt-browserify": "^6.0.0", - "grunt-contrib-compress": "^2.0.0", - "grunt-contrib-copy": "^1.0.0", - "grunt-contrib-uglify": "^5.0.1", - "grunt-contrib-watch": "^1.1.0", - "less-plugin-autoprefix": "^2.0.0" + "assemble-less": "~0.7.0", + "babel-loader": "^9.1.2", + "babel-plugin-add-module-exports": "^1.0.4", + "compression-webpack-plugin": "^10.0.0", + "css-loader": "^6.7.3", + "less": "^4.1.3", + "less-loader": "^11.1.0", + "less-plugin-autoprefix": "^2.0.0", + "style-loader": "^3.3.1", + "webpack": "^5.75.0", + "webpack-cli": "^5.0.1" }, "dependencies": { "react-joyride": "^1.10.1" + }, + "scripts": { + "build": "webpack --config webpack.config.js" } } diff --git a/frontend/front-srv/assets/access.homepage/res/dist/WelcomeComponents.min.js b/frontend/front-srv/assets/access.homepage/res/dist/WelcomeComponents.min.js index ca914a761a..1b84a61d7d 100644 --- a/frontend/front-srv/assets/access.homepage/res/dist/WelcomeComponents.min.js +++ b/frontend/front-srv/assets/access.homepage/res/dist/WelcomeComponents.min.js @@ -1 +1 @@ -!function(e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):("undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this).WelcomeComponents=e()}(function(){return function n(o,i,u){function a(t,e){if(!i[t]){if(!o[t]){var r="function"==typeof require&&require;if(!e&&r)return r(t,!0);if(c)return c(t,!0);throw(e=new Error("Cannot find module '"+t+"'")).code="MODULE_NOT_FOUND",e}r=i[t]={exports:{}},o[t][0].call(r.exports,function(e){return a(o[t][1][e]||e)},r,r.exports,n,o,i,u)}return i[t].exports}for(var c="function"==typeof require&&require,e=0;e"']/g,Vu=RegExp($u.source),Yu=RegExp(Gu.source),Ju=/<%-([\s\S]+?)%>/g,Zu=/<%([\s\S]+?)%>/g,Qu=/<%=([\s\S]+?)%>/g,Ku=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,Xu=/^\w*$/,ea=/[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g,ta=/[\\^$.*+?()[\]{}|]/g,ra=RegExp(ta.source),na=/^\s+/,i=/\s/,oa=/\{(?:\n\/\* \[wrapped with .+\] \*\/)?\n?/,ia=/\{\n\/\* \[wrapped with (.+)\] \*/,ua=/,? & /,aa=/[^\x00-\x2f\x3a-\x40\x5b-\x60\x7b-\x7f]+/g,ca=/[()=,{}\[\]\/\s]/,la=/\\(\\)?/g,fa=/\$\{([^\\}]*(?:\\.[^\\}]*)*)\}/g,sa=/\w*$/,pa=/^[-+]0x[0-9a-f]+$/i,da=/^0b[01]+$/i,ya=/^\[object .+?Constructor\]$/,ha=/^0o[0-7]+$/i,ba=/^(?:0|[1-9]\d*)$/,va=/[\xc0-\xd6\xd8-\xf6\xf8-\xff\u0100-\u017f]/g,ga=/($^)/,ma=/['\n\r\u2028\u2029\\]/g,u="\\ud800-\\udfff",a="\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff",c="\\u2700-\\u27bf",e="a-z\\xdf-\\xf6\\xf8-\\xff",t="A-Z\\xc0-\\xd6\\xd8-\\xde",l="\\ufe0e\\ufe0f",f="\\xac\\xb1\\xd7\\xf7\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\xbf\\u2000-\\u206f \\t\\x0b\\f\\xa0\\ufeff\\n\\r\\u2028\\u2029\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000",s="['’]",r="["+u+"]",p="["+f+"]",d="["+a+"]",y="["+c+"]",h="["+e+"]",f="[^"+u+f+"\\d+"+c+e+t+"]",c="\\ud83c[\\udffb-\\udfff]",e="[^"+u+"]",b="(?:\\ud83c[\\udde6-\\uddff]){2}",n="[\\ud800-\\udbff][\\udc00-\\udfff]",t="["+t+"]",v="\\u200d",g="(?:"+h+"|"+f+")",f="(?:"+t+"|"+f+")",m="(?:['’](?:d|ll|m|re|s|t|ve))?",_="(?:['’](?:D|LL|M|RE|S|T|VE))?",w="(?:"+d+"|"+c+")"+"?",O="["+l+"]?",O=O+w+("(?:"+v+"(?:"+[e,b,n].join("|")+")"+O+w+")*"),w="(?:"+[y,b,n].join("|")+")"+O,y="(?:"+[e+d+"?",d,b,n,r].join("|")+")",_a=RegExp(s,"g"),wa=RegExp(d,"g"),j=RegExp(c+"(?="+c+")|"+y+O,"g"),Oa=RegExp([t+"?"+h+"+"+m+"(?="+[p,t,"$"].join("|")+")",f+"+"+_+"(?="+[p,t+g,"$"].join("|")+")",t+"?"+g+"+"+m,t+"+"+_,"\\d*(?:1ST|2ND|3RD|(?![123])\\dTH)(?=\\b|[a-z_])","\\d*(?:1st|2nd|3rd|(?![123])\\dth)(?=\\b|[A-Z_])","\\d+",w].join("|"),"g"),P=RegExp("["+v+u+a+l+"]"),ja=/[a-z][A-Z]|[A-Z]{2}[a-z]|[0-9][a-zA-Z]|[a-zA-Z][0-9]|[^a-zA-Z0-9 ]/,Pa=["Array","Buffer","DataView","Date","Error","Float32Array","Float64Array","Function","Int8Array","Int16Array","Int32Array","Map","Math","Object","Promise","RegExp","Set","String","Symbol","TypeError","Uint8Array","Uint8ClampedArray","Uint16Array","Uint32Array","WeakMap","_","clearTimeout","isFinite","parseInt","setTimeout"],Sa=-1,nu={},ou=(nu[Du]=nu[Mu]=nu[Au]=nu[Nu]=nu[Lu]=nu[zu]=nu[Bu]=nu[Wu]=nu[Uu]=!0,nu[Yi]=nu[Pu]=nu[Iu]=nu[Ji]=nu[ru]=nu[Zi]=nu[Su]=nu[Eu]=nu[Qi]=nu[Ki]=nu[Xi]=nu[eu]=nu[tu]=nu[Cu]=nu[Tu]=!1,{}),S=(ou[Yi]=ou[Pu]=ou[Iu]=ou[ru]=ou[Ji]=ou[Zi]=ou[Du]=ou[Mu]=ou[Au]=ou[Nu]=ou[Lu]=ou[Qi]=ou[Ki]=ou[Xi]=ou[eu]=ou[tu]=ou[Cu]=ou[Ru]=ou[zu]=ou[Bu]=ou[Wu]=ou[Uu]=!0,ou[Su]=ou[Eu]=ou[Tu]=!1,{"\\":"\\","'":"'","\n":"n","\r":"r","\u2028":"u2028","\u2029":"u2029"}),Ea=parseFloat,xa=parseInt,e="object"==typeof C&&C&&C.Object===Object&&C,b="object"==typeof self&&self&&self.Object===Object&&self,iu=e||b||Function("return this")(),n="object"==typeof T&&T&&!T.nodeType&&T,o=n&&"object"==typeof R&&R&&!R.nodeType&&R,ka=o&&o.exports===n,E=ka&&e.process,r=function(){try{var e=o&&o.require&&o.require("util").types;return e?e:E&&E.binding&&E.binding("util")}catch(e){}}(),Ca=r&&r.isArrayBuffer,Ra=r&&r.isDate,Ta=r&&r.isMap,Ia=r&&r.isRegExp,Da=r&&r.isSet,Ma=r&&r.isTypedArray;function uu(e,t,r){switch(r.length){case 0:return e.call(t);case 1:return e.call(t,r[0]);case 2:return e.call(t,r[0],r[1]);case 3:return e.call(t,r[0],r[1],r[2])}return e.apply(t,r)}function Aa(e,t,r,n){for(var o=-1,i=null==e?0:e.length;++o":">",'"':""","'":"'"});function ic(e){return"\\"+S[e]}function du(e){return P.test(e)}function uc(e){var r=-1,n=Array(e.size);return e.forEach(function(e,t){n[++r]=[t,e]}),n}function ac(t,r){return function(e){return t(r(e))}}function yu(e,t){for(var r=-1,n=e.length,o=0,i=[];++r",""":'"',"'":"'"});var vu=function o(e){var O=(e=null==e?iu:vu.defaults(iu.Object(),e,vu.pick(iu,Pa))).Array,i=e.Date,I=e.Error,D=e.Function,M=e.Math,h=e.Object,A=e.RegExp,F=e.String,j=e.TypeError,q=O.prototype,H=D.prototype,$=h.prototype,G=e["__core-js_shared__"],V=H.toString,N=$.hasOwnProperty,Y=0,J=(H=/[^.]+$/.exec(G&&G.keys&&G.keys.IE_PROTO||""))?"Symbol(src)_1."+H:"",Z=$.toString,Q=V.call(h),K=iu._,X=A("^"+V.call(N).replace(ta,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$"),H=ka?e.Buffer:Ui,t=e.Symbol,ee=e.Uint8Array,te=H?H.allocUnsafe:Ui,re=ac(h.getPrototypeOf,h),ne=h.create,oe=$.propertyIsEnumerable,ie=q.splice,ue=t?t.isConcatSpreadable:Ui,ae=t?t.iterator:Ui,ce=t?t.toStringTag:Ui,le=function(){try{var e=Qr(h,"defineProperty");return e({},"",{}),e}catch(e){}}(),fe=e.clearTimeout!==iu.clearTimeout&&e.clearTimeout,se=i&&i.now!==iu.Date.now&&i.now,pe=e.setTimeout!==iu.setTimeout&&e.setTimeout,de=M.ceil,ye=M.floor,he=h.getOwnPropertySymbols,H=H?H.isBuffer:Ui,be=e.isFinite,ve=q.join,ge=ac(h.keys,h),P=M.max,S=M.min,me=i.now,_e=e.parseInt,we=M.random,Oe=q.reverse,i=Qr(e,"DataView"),je=Qr(e,"Map"),Pe=Qr(e,"Promise"),Se=Qr(e,"Set"),e=Qr(e,"WeakMap"),Ee=Qr(h,"create"),xe=e&&new e,ke={},Ce=jn(i),Re=jn(je),Te=jn(Pe),Ie=jn(Se),De=jn(e),t=t?t.prototype:Ui,Me=t?t.valueOf:Ui,Ae=t?t.toString:Ui;function y(e){if(U(e)&&!W(e)&&!(e instanceof v)){if(e instanceof b)return e;if(N.call(e,"__wrapped__"))return Pn(e)}return new b(e)}var Ne=function(e){if(!w(e))return{};if(ne)return ne(e);Le.prototype=e;e=new Le;return Le.prototype=Ui,e};function Le(){}function ze(){}function b(e,t){this.__wrapped__=e,this.__actions__=[],this.__chain__=!!t,this.__index__=0,this.__values__=Ui}function v(e){this.__wrapped__=e,this.__actions__=[],this.__dir__=1,this.__filtered__=!1,this.__iteratees__=[],this.__takeCount__=Vi,this.__views__=[]}function Be(e){var t=-1,r=null==e?0:e.length;for(this.clear();++t>>0,t>>>=0,O(o));++n>>1,u=e[i];null!==u&&!m(u)&&(r?u<=t:u>>0)?(e=d(e))&&("string"==typeof t||null!=t&&!ko(t))&&!(t=l(t))&&du(e)?ar(bu(e),0,r):e.split(t,r):[]},y.spread=function(r,n){if("function"!=typeof r)throw new j(Fi);return n=null==n?0:P(x(n),0),u(function(e){var t=e[n],e=ar(e,0,n);return t&&fu(e,t),uu(r,this,e)})},y.tail=function(e){var t=null==e?0:e.length;return t?a(e,1,t):[]},y.take=function(e,t,r){return e&&e.length?a(e,0,(t=r||t===Ui?1:x(t))<0?0:t):[]},y.takeRight=function(e,t,r){var n=null==e?0:e.length;return n?a(e,(t=n-(t=r||t===Ui?1:x(t)))<0?0:t,n):[]},y.takeRightWhile=function(e,t){return e&&e.length?Xt(e,s(t,3),!1,!0):[]},y.takeWhile=function(e,t){return e&&e.length?Xt(e,s(t,3)):[]},y.tap=function(e,t){return t(e),e},y.throttle=function(e,t,r){var n=!0,o=!0;if("function"!=typeof e)throw new j(Fi);return w(r)&&(n="leading"in r?!!r.leading:n,o="trailing"in r?!!r.trailing:o),co(e,t,{leading:n,maxWait:t,trailing:o})},y.thru=Hn,y.toArray=Mo,y.toPairs=ti,y.toPairsIn=ri,y.toPath=function(e){return W(e)?lu(e,On):m(e)?[e]:E(wn(d(e)))},y.toPlainObject=Lo,y.transform=function(e,n,o){var t,r=W(e),i=r||_o(e)||To(e);return n=s(n,4),null==o&&(t=e&&e.constructor,o=i?r?new t:[]:w(e)&&Oo(t)?Ne(re(e)):{}),(i?au:st)(e,function(e,t,r){return n(o,e,t,r)}),o},y.unary=function(e){return oo(e,1)},y.union=In,y.unionBy=Dn,y.unionWith=Mn,y.uniq=function(e){return e&&e.length?Zt(e):[]},y.uniqBy=function(e,t){return e&&e.length?Zt(e,s(t,2)):[]},y.uniqWith=function(e,t){return t="function"==typeof t?t:Ui,e&&e.length?Zt(e,Ui,t):[]},y.unset=function(e,t){return null==e||Qt(e,t)},y.unzip=An,y.unzipWith=Nn,y.update=function(e,t,r){return null==e?e:Kt(e,t,or(r))},y.updateWith=function(e,t,r,n){return n="function"==typeof n?n:Ui,null==e?e:Kt(e,t,or(r),n)},y.values=ni,y.valuesIn=function(e){return null==e?[]:Xa(e,R(e))},y.without=Ln,y.words=yi,y.wrap=function(e,t){return po(or(t),e)},y.xor=zn,y.xorBy=Bn,y.xorWith=Wn,y.zip=Un,y.zipObject=function(e,t){return rr(e||[],t||[],Ye)},y.zipObjectDeep=function(e,t){return rr(e||[],t||[],Ft)},y.zipWith=Fn,y.entries=ti,y.entriesIn=ri,y.extend=Bo,y.extendWith=Wo,ji(y,y),y.add=Di,y.attempt=hi,y.camelCase=oi,y.capitalize=ii,y.ceil=Mi,y.clamp=function(e,t,r){return r===Ui&&(r=t,t=Ui),r!==Ui&&(r=(r=k(r))==r?r:0),t!==Ui&&(t=(t=k(t))==t?t:0),et(k(e),t,r)},y.clone=function(e){return g(e,4)},y.cloneDeep=function(e){return g(e,5)},y.cloneDeepWith=function(e,t){return g(e,5,t="function"==typeof t?t:Ui)},y.cloneWith=function(e,t){return g(e,4,t="function"==typeof t?t:Ui)},y.conformsTo=function(e,t){return null==t||tt(e,t,C(t))},y.deburr=ui,y.defaultTo=function(e,t){return null==e||e!=e?t:e},y.divide=Ai,y.endsWith=function(e,t,r){e=d(e),t=l(t);var n=e.length,n=r=r===Ui?n:et(x(r),0,n);return 0<=(r-=t.length)&&e.slice(r,n)==t},y.eq=B,y.escape=function(e){return(e=d(e))&&Yu.test(e)?e.replace(Gu,oc):e},y.escapeRegExp=function(e){return(e=d(e))&&ra.test(e)?e.replace(ta,"\\$&"):e},y.every=function(e,t,r){return(W(e)?La:ut)(e,s(t=r&&p(e,t,r)?Ui:t,3))},y.find=Vn,y.findIndex=Sn,y.findKey=function(e,t){return qa(e,s(t,3),st)},y.findLast=Yn,y.findLastIndex=En,y.findLastKey=function(e,t){return qa(e,s(t,3),pt)},y.floor=Ni,y.forEach=Jn,y.forEachRight=Zn,y.forIn=function(e,t){return null==e?e:lt(e,s(t,3),R)},y.forInRight=function(e,t){return null==e?e:ft(e,s(t,3),R)},y.forOwn=function(e,t){return e&&st(e,s(t,3))},y.forOwnRight=function(e,t){return e&&pt(e,s(t,3))},y.get=$o,y.gt=bo,y.gte=vo,y.has=function(e,t){return null!=e&&en(e,t,vt)},y.hasIn=Go,y.head=kn,y.identity=T,y.includes=function(e,t,r,n){return e=f(e)?e:ni(e),r=r&&!n?x(r):0,n=e.length,r<0&&(r=P(n+r,0)),Ro(e)?r<=n&&-1=S(t=t,r=r)&&e=this.__values__.length;return{done:e,value:e?Ui:this.__values__[this.__index__++]}},y.prototype.plant=function(e){for(var t,r=this;r instanceof ze;)var n=Pn(r),o=(n.__index__=0,n.__values__=Ui,t?o.__wrapped__=n:t=n,n),r=r.__wrapped__;return o.__wrapped__=e,t},y.prototype.reverse=function(){var e=this.__wrapped__;return e instanceof v?(e=e,(e=(e=this.__actions__.length?new v(this):e).reverse()).__actions__.push({func:Hn,args:[Tn],thisArg:Ui}),new b(e,this.__chain__)):this.thru(Tn)},y.prototype.toJSON=y.prototype.valueOf=y.prototype.value=function(){return er(this.__wrapped__,this.__actions__)},y.prototype.first=y.prototype.head,ae&&(y.prototype[ae]=function(){return this}),y}();o?((o.exports=vu)._=vu,n._=vu):iu._=vu}.call(this)}.call(this)}.call(this,"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{}],2:[function(_,w,O){!function(m){!function(){"use strict";function o(e){return(o="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(O,"__esModule",{value:!0}),O.default=void 0;var n=e(_("./DownloadApp")),r=e(_("../board/ColorPaper"));function e(e){return e&&e.__esModule?e:{default:e}}function t(t,e){var r,n=Object.keys(t);return Object.getOwnPropertySymbols&&(r=Object.getOwnPropertySymbols(t),e&&(r=r.filter(function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable})),n.push.apply(n,r)),n}function i(n){for(var e=1;e","").replace("","")}),h(d(r),"browse",function(){var e=0{"use strict";var e={689:e=>{e.exports=require("react")}},t={};function r(n){var o=t[n];if(void 0!==o)return o.exports;var i=t[n]={exports:{}};return e[n](i,i.exports,r),i.exports}r.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return r.d(t,{a:t}),t},r.d=(e,t)=>{for(var n in t)r.o(t,n)&&!r.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:t[n]})},r.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),r.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})};var n={};(()=>{r.r(n),r.d(n,{HomeDashboard:()=>ke});var e=r(689),t=r.n(e);const o=require("pydio");var i=r.n(o);const a=require("material-ui"),l=require("material-ui/styles");var c=r(689),s=function(e){var t,r=e.pydio,n=e.pluginName,o=e.pluginParameter,i=e.style,a=e.darkMode,l=e.className,s=r.Registry.getPluginConfigs(n).get(o);return s||(s=r.Registry.getDefaultImageFromParameters(n,o)),s&&(0===s.indexOf("plug/")?(-1!==s.indexOf("[mode]")&&(s=s.replace("[mode]",a?"dark":"light")),t=s):t=r.Parameters.get("ENDPOINT_REST_API")+"/frontend/binaries/GLOBAL/"+s),c.createElement("img",{alt:"application logo",src:t,style:i,className:l})};function u(e){return u="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},u(e)}function p(e,t){for(var r=0;r0&&void 0!==arguments[0]&&arguments[0],t=this.props,r=t.pydio,n=t.onFinish,o=r.user,i=o.getPreference("gui_preferences",!0);i["UserAccount.WelcomeModal.Shown"]=!0,e&&(i["WelcomeComponent.MUITour"]=!0,i["WelcomeComponent.Pydio8.TourGuide.Welcome"]=!0,n&&n()),o.setPreference("gui_preferences",i,!0),o.savePreference("gui_preferences")}},{key:"render",value:function(){var e=this;if(!this.state.started)return null;var t=this.props.getMessage,r=function(e){return t("ajax_gui.tour."+e)},n=[{title:r("theme.title"),text:React.createElement(g,{message:r}),selector:".mdi.mdi-theme-light-dark",position:"right-end"},{title:r("workspaces.title"),text:React.createElement(w,{message:r}),selector:".mdi-folder-multiple-outline",position:"right"},{title:r("globsearch.title"),text:React.createElement(S,{message:r}),selector:".home-search-form",position:"bottom"}];return React.createElement(y,{namespace:"PydioWorkspaces",componentName:"TourGuide",ref:"joyride",steps:n,run:!0,autoStart:!0,debug:!1,callback:function(t){"step:after"===t.type&&t.index===n.length-1&&e.discard(!0)},type:"continuous"})}}],r&&p(t.prototype,r),Object.defineProperty(t,"prototype",{writable:!1}),a}(e.Component);O=h(O);const E=require("pydio/util/path");var x=r.n(E);const P=require("pydio/util/dom");var R=r.n(P);function j(e){return j="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},j(e)}function T(e,t){for(var r=0;r758&&t().createElement(W,{pydio:d,facets:o,activeFacets:i,onToggleFacet:l,emptyStateView:t().createElement("div",{style:{fontWeight:500,padding:"10px 0px",fontSize:15}},d.MessageHash["user_home.search.facets.title"]),styles:S.facets,zDepth:g?0:void 0}),t().createElement(D,{containerStyle:{flex:1,marginLeft:10},className:"files-list vertical_fit",elementHeight:M.HEIGHT_TWO_LINES,entryRenderIcon:function(e){var r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return t().createElement(B,{loadThumbnail:!r.parentIsScrolling,node:e})},entryRenderActions:function(){return null},entryRenderSecondLine:function(e){var r=e.getPath(),n=e.getMetadata(),o=new Date;o.setTime(1e3*parseInt(n.get("ajxp_modiftime")));var i,a,l=z(o).fromNow();return parseInt(e.getMetadata().get("bytesize"))&&(i=x().roundFileSize(parseInt(e.getMetadata().get("bytesize")))),x().getDirname(r)&&(a=d.MessageHash["user_home.search.result.location"]+": "+x().getDirname(r)||"/"),t().createElement("div",null,l," ",i?t().createElement("span",null,"• ",i):""," ",a?t().createElement("span",null,"• ",a):null)},entryRenderGroupHeader:function(e,r){return t().createElement("div",{style:{fontSize:13,color:"#93a8b2",fontWeight:500,cursor:"pointer"},onClick:function(){return d.triggerRepositoryChange(e)}},r)},presetDataModel:s,presetRootNode:s.getSearchNode(),openCollection:function(e){d.goTo(e)},nodeClicked:function(e){d.goTo(e)},defaultGroupBy:"repository_id",groupByLabel:"repository_display",emptyStateProps:{iconClassName:"",primaryTextId:c?"searchengine.searching":478,style:{backgroundColor:"transparent"}}})),t().createElement("div",{style:{display:m?"none":"block",flex:1,overflowY:"auto",marginTop:40},id:"history-block"},this.props.children)),m&&t().createElement(a.IconButton,{iconClassName:"mdi mdi-close",style:S.close,onClick:function(){return h(!1)},tooltipPosition:"bottom-left",tooltip:d.MessageHash[86]}))}}],n&&T(r.prototype,n),Object.defineProperty(r,"prototype",{writable:!1}),c}(e.Component);H=L(H=A(H,"main","all")),H=(0,l.muiThemeable)()(H),require("pydio/model/node");const G=require("pydio/model/meta-node-provider");var U=r.n(G);const J=require("pydio/http/api");var V=r.n(J);const X=require("cells-sdk");function Y(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function K(e){for(var t=1;t=8||(u[n]=n,p.push(t().createElement(be,{key:n,pydio:r,muiTheme:o,node:e,title:e.getLabel(),legend:e.getMetadata().get("card_legend")})))})),t().createElement("div",{style:K({display:"flex",flexWrap:"wrap",justifyContent:"center"},n)},t().createElement(de,{ready:!l,showLoadingAnimation:!0,customPlaceholder:s},p))}}]),n}(t().Component);ge=se(ge);const ve=require("lodash");function we(e){return we="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},we(e)}function Se(){return Se=Object.assign?Object.assign.bind():function(e){for(var t=1;t span { - color: rgba(0, 0, 0, 0); -} -div.user-dashboard-main div.react-grid-layout.dashboard-layout .video-card div.tutorial_video_thumb .tutorial_title > span h2 { - letter-spacing: 0; - display: block; - white-space: nowrap; - text-overflow: ellipsis; - overflow: hidden; - font-weight: 400; - font-size: 16px; - color: white; - position: absolute; - bottom: 0; - left: 0; - right: 52px; - background-color: rgba(0, 0, 0, 0.43); - padding: 16px 0 16px 12px; - line-height: 20px; - margin: 0; - border-radius: 0 0 0 2px; -} -div.user-dashboard-main div.react-grid-layout.dashboard-layout .video-card div.tutorial_load_button { - display: block; - padding: 5px 18px 16px; - cursor: pointer; - text-align: right; - text-transform: uppercase; - font-weight: 500; - font-size: 15px; - color: #009688; -} -div.user-dashboard-main div.react-grid-layout.dashboard-layout div.recently-accessed-list.table-mode div.toolbarTableHeader.mui-toolbar { - border-radius: 2px 2px 0 0; - border-bottom: 0 !important; -} -div.user-dashboard-main div.react-grid-layout.dashboard-layout div.recently-accessed-list.table-mode div.toolbarTableHeader.mui-toolbar .mui-toolbar-group { - font-size: 16px !important; - font-weight: 400 !important; - color: #ffffff !important; -} -div.user-dashboard-main div.react-grid-layout.dashboard-layout div.recently-accessed-list.files-list .material-list-entry { - border-bottom: 1px solid rgba(255, 255, 255, 0.1); -} -div.user-dashboard-main div.react-grid-layout.dashboard-layout div.recently-accessed-list.files-list .material-list-entry .material-list-icon { - width: 64px; -} -div.user-dashboard-main div.react-grid-layout.dashboard-layout div.recently-accessed-list.files-list .material-list-entry .material-list-icon .covering-bg-preview, -div.user-dashboard-main div.react-grid-layout.dashboard-layout div.recently-accessed-list.files-list .material-list-entry .material-list-icon .mimefont-container { - height: 30px; - width: 30px; - margin: 14px; -} -div.user-dashboard-main div.react-grid-layout.dashboard-layout div.recently-accessed-list.files-list .material-list-entry .material-list-icon .mimefont-container { - background-color: transparent; - border: 1px solid white; -} -div.user-dashboard-main div.react-grid-layout.dashboard-layout div.recently-accessed-list.files-list .material-list-entry .material-list-icon .mimefont-container .mimefont { - color: #ffffff; - font-size: 17px; -} -div.user-dashboard-main div.react-grid-layout.dashboard-layout div.recently-accessed-list.files-list .material-list-entry .material-list-text { - color: white; - padding: 10px 0; -} -div.user-dashboard-main div.react-grid-layout.dashboard-layout div.recently-accessed-list.files-list .material-list-entry .material-list-text .material-list-line-2 { - color: rgba(255, 255, 255, 0.53); -} diff --git a/frontend/front-srv/assets/access.homepage/res/home.css.gz b/frontend/front-srv/assets/access.homepage/res/home.css.gz deleted file mode 100644 index b8a147122f..0000000000 Binary files a/frontend/front-srv/assets/access.homepage/res/home.css.gz and /dev/null differ diff --git a/frontend/front-srv/assets/access.homepage/res/home.less b/frontend/front-srv/assets/access.homepage/res/home.less deleted file mode 100644 index 521016a660..0000000000 --- a/frontend/front-srv/assets/access.homepage/res/home.less +++ /dev/null @@ -1,221 +0,0 @@ -@screenwidth-small: ~"only screen and (max-width: 420px)"; -@screenwidth-medium: ~"only screen and (max-width: 758px)"; - -@bezier_transition:all 550ms cubic-bezier(0.23, 1, 0.32, 1) 0ms; -@reactBoxShadowDepth1:0 3px 6px rgba(0,0,0,.16),0 3px 6px rgba(0,0,0,.23); -@keyframes fadein { - from { opacity: 0; } - to { opacity: 1; } -} - -.home-top-logo{ - height: 100px; -} - -div.user-dashboard-main{ - - .admin-helper-panel { - - position: absolute; - top: 55px; - bottom: 0; - padding-top: 0; - right: 260px; - z-index: 1400; - width: 316px; - background-color: rgba(255, 255, 255, 0.89); - - .mui-paper-container { - height: 100%; - overflow-y: auto; - } - h3 { - background-color: #FF6E40; - color: white; - text-align: left; - padding: 12px 12px 11px; - font-size: 17px; - } - .pydio-form-panel { - .pydio-form-group { - margin-top: 0; - } - } - .legend { - padding: 0 17px; - color: #878787; - font-size: 12px; - line-height: 17px; - } - .widget-type-selector { - border: 1px solid #E0E0E0; - margin-left: 16px; - border-radius: 3px; - margin-top: 8px; - width: 280px; - } - } - - - .home-dashboard { - position: static; - width: auto; - height: 100%; - padding: 0; - overflow: auto; - background-color: transparent; - } - - .home-center-paper{ - @media @screenwidth-medium{ - left: 10px !important; - right: 10px !important; - } - } - - div.react-grid-layout.dashboard-layout{ - - @media @screenwidth-medium{ - display: none; - } - - .video-card { - .tutorial_legend { - display:flex; - flex-direction:column; - height: 100%; - } - .tutorial_content{ - flex: 1; - padding: 16px; - position: relative; - overflow-y: auto; - font-size: 16px; - line-height: 1.6em; - h2{ - display:none; - } - ul{ - padding-left: 20px; - } - } - div.tutorial_video_thumb{ - height: 170px; - min-height: 170px; - background-color: black; - background-position: center center; - background-size: cover; - background-repeat: no-repeat; - border-radius: 2px; - position: relative; - .tutorial_prev, .tutorial_next, .tutorial_play{ - opacity: 0; - position: absolute; - z-index: 100; - color: rgba(255,255,255,0.83); - font-size: 30px; - background-color: rgba(0,0,0,0.43); - border-radius: 50%; - padding: 8px; - top: 41px; - left: 5px; - cursor: pointer; - transition: @bezier_transition; - &.tutorial_next{ - left: initial; - right: 5px; - } - &.tutorial_play{ - left: 94px; - opacity: 1; - background-color: rgba(255, 255, 255, 0.78); - color: rgba(0, 0, 0, 0.4); - font-size: 40px; - top: 36px; - } - } - &:hover{ - .tutorial_prev, .tutorial_next{ - opacity: 1; - } - } - .tutorial_title > span{ - color: rgba(0,0,0,0); - h2{ - letter-spacing: 0; - display: block; - white-space: nowrap; - text-overflow: ellipsis; - overflow: hidden; - font-weight: 400; - font-size: 16px; - color: white; - position:absolute; - bottom: 0; - left: 0; - right: 52px; - background-color: rgba(0,0,0,0.43); - padding: 16px 0 16px 12px; - line-height: 20px; - margin: 0; - border-radius: 0 0 0 2px; - } - } - } - div.tutorial_load_button { - display: block; - padding: 5px 18px 16px; - cursor: pointer; - text-align: right; - text-transform: uppercase; - font-weight: 500; - font-size: 15px; - color: #009688; - } - } - - div.recently-accessed-list{ - &.table-mode{ - div.toolbarTableHeader.mui-toolbar{ - border-radius: 2px 2px 0 0; - border-bottom: 0 !important; - .mui-toolbar-group{ - font-size: 16px !important; - font-weight: 400 !important; - color: rgb(255, 255, 255) !important; - } - } - } - &.files-list{ - .material-list-entry{ - border-bottom: 1px solid rgba(255, 255, 255, 0.1); - .material-list-icon { - width: 64px; - .covering-bg-preview, .mimefont-container{ - height: 30px; - width: 30px; - margin: 14px; - } - .mimefont-container{ - background-color: transparent; - border: 1px solid white; - .mimefont{ - color: #ffffff; - font-size:17px; - } - } - } - .material-list-text{ - color: white; - padding: 10px 0; - .material-list-line-2{ - color: rgba(255,255,255,0.53); - } - } - } - } - } - - } -} - diff --git a/frontend/front-srv/assets/access.homepage/res/i18n/conf/de.all.json b/frontend/front-srv/assets/access.homepage/res/i18n/conf/de.all.json index 9edc98db4b..e3fcc86f72 100644 --- a/frontend/front-srv/assets/access.homepage/res/i18n/conf/de.all.json +++ b/frontend/front-srv/assets/access.homepage/res/i18n/conf/de.all.json @@ -15,7 +15,7 @@ "other": "Link auf Videos, welche die ersten Schritte mit Pydio zeigen" }, "Enable cross-workspaces search form on home page": { - "other": "Arbeitsumgebungs übergreifende Suche auf der Willkommen-Seite" + "other": "Aktivieren Sie das übergreifende Workspaces-Suchformular auf der Hauptseite" }, "Let users connect easily to the latest mobile applications by displaying a QRCode": { "other": "Benutzer können, mit den Apps, diesen QRCode scannen um eine Verbindung zum Server zu konfigurieren" @@ -24,10 +24,10 @@ "other": "URL zum Mac-Sync-Client" }, "Open workspace by simple click": { - "other": "Arbeitsumgebung mit einfachem Klick öffnen" + "other": "Workspace mit einfachem Klick öffnen" }, "Open workspace by simple click instead of double click.": { - "other": "Arbeitsumgebung mit einfachem Klick öffnen statt mit Doppelklick." + "other": "Workspace mit einfachem Klick öffnen statt mit Doppelklick." }, "URL of the Android application": { "other": "URL zur Android-App (leave empty if you want to hide the block)" @@ -45,7 +45,7 @@ "other": "Willkommen-Seite" }, "Welcome Page displaying a list of workspaces": { - "other": "Willkommen-Seite auf der eine Liste mit Arbeitsumgebungen angezeigt wird" + "other": "Willkommen-Seite auf der eine Liste mit Workspaces angezeigt wird" }, "Windows PydioSync URL": { "other": "URL zum Windows-Sync-Client" diff --git a/frontend/front-srv/assets/access.homepage/res/i18n/de.all.json b/frontend/front-srv/assets/access.homepage/res/i18n/de.all.json index 914b672ede..9e87bbadbf 100644 --- a/frontend/front-srv/assets/access.homepage/res/i18n/de.all.json +++ b/frontend/front-srv/assets/access.homepage/res/i18n/de.all.json @@ -1,6 +1,6 @@ { "39": { - "other": "Unten finden Sie eine Liste der Arbeitsumgebungen auf die Sie zugreifen können. Diese können persönlich oder mit anderen Benutzern genutzt werden." + "other": "Unten finden Sie eine Liste der Workspaces, auf die Sie zugreifen können. Diese können persönlich oder gemeinsam mit anderen Benutzern genutzt werden." }, "40": { "other": "Willkommen, %s!" @@ -72,13 +72,13 @@ "other": "Windows" }, "62": { - "other": "

[How-to] Was ist ein Arbeitsbereich?

\n Diese Video erklärt Arbeitsbreiche APPLICATION_TITLE\n
    \n
  • Warum sind Arbeitsbereiche zentral in APPLICATION_TITLE?
  • \n
  • Was sind Arbeitsbereiche aus technischer Sicht?
  • \n
  • Wie helfe Sie Ihre Datei Arbeit zu organisieren?
  • \n
\n " + "other": "

[Anleitung] Was ist ein Workspace?

\n Dieses Video erklärt, was Workspaces in APPLICATION_TITLE sind\n
    \n
  • Warum sind Workspaces zentral in APPLICATION_TITLE?
  • \n
  • Was sind Workspaces aus technischer Sicht?
  • \n
  • Wie ermöglichen sie die Organisation Ihrer Daten?
  • \n
" }, "63": { "other": "

[How-to] Dateien zu APPLICATION_TITLE hochladen

\n Beginnen Sie mit APPLICATION_TITLE und erfahren Sie, wie Sie Dateien hochladen können.\n
    \n
  • Drag and Drop von Dateien in APPLICATION_TITLE
  • \n
  • Erstellen neuer Ordner
  • .\n
  • Dateien und Ordner umbenennen
  • \n
  • Download von Dateien auf Ihren Computer
  • \n
" }, "64": { - "other": "

[How-to] Durchsuchen und verwalten Sie Ihre Dateien

\n Dieses Video zeigt Ihnen verschiedene Tipps zur effizienten Verwaltung Ihrer Dateien in APPLICATION_TITLE.\n
    \n
  • Arbeitsbereichsübergreifende Suchleiste
  • \n
  • Inhaltsanzeigemodi, Tastenkombinationen
  • \n
  • Dateiesortierung
  • \n
  • Metadaten, Lesezeichen
  • \n
" + "other": "

[Anleitung] Suchen, durchsuchen und verwalten Ihrer Dateien

\n Dieses Video zeigt Ihnen verschiedene Tipps, um Ihre Dateien in APPLICATION_TITLE effizient zu verwalten\n
    \n
  • übergreifende Workspaces-Suchleiste
  • \n
  • Inhaltsanzeigemodi, Tastaturkürzel
  • \n
  • Dateien sortieren
  • \n
  • Meta-Daten, Lesezeichen
  • \n
\n " }, "65": { "other": "Mehr über APPLICATION_TITLE im YouTube-Kanal erfahren!" @@ -120,10 +120,10 @@ "other": "Einstellungen" }, "78": { - "other": "Wählen Sie eine Ziel-Arbeitsumgebung" + "other": "Wählen Sie eine Ziel-Workspace" }, "79": { - "other": "

[How-to] Austausch von Dateien und Ordnern

\n Dieses Tutorial zeigt Ihnen gewusst wie: Freigeben von Dateien und Ordnern, intern oder extern \n
    \n
  • Erstellen Anteil Links für externe Personen
  • \n
  • Freigeben von Dateien und Ordnern mit internen Mitarbeitern
  • \n
  • Freigabe eines Ordners als Arbeitsbereich
  • \n
  • Layoutoptionen der gemeinsame Ordner
  • \n
  • Erstellen einen Blind drop Ordner
  • \n
  • Verwalten von Benutzern und teilen Rechte
  • \n
\n " + "other": "

[Anleitung] Dateien und Ordner teilen

\n Dieses Tutorial zeigt Ihnen, wie Sie Dateien und Ordner intern oder extern teilen können\n
    \n
  • Erstellen von Freigabelinks für externe Personen
  • \n
  • Dateien und Ordner mit internen Mitarbeitern teilen
  • \n
  • Einen Ordner als Workspace teilen
  • \n
  • Layoutoptionen für geteilte Ordner
  • \n
  • Erstellen eines Blind Drop-Ordners
  • \n
  • Benutzer und Freigaberechte verwalten
  • \n
\n " }, "80": { "other": "

[How-to] Sharing : Sicherheit Features

\n Dieses Video durchläuft verschiedene Freigabeeinstellungen, die Ihnen helfen, Ihre Freigaben zu sichern\n
    \n
  • Passwort Schutz
  • \n
  • Ablauf Datum
  • \n
  • Anzahl der Downloads begrenzen
  • \n
\n " @@ -156,7 +156,7 @@ "other": "Zum Hochladen ausgehälte Datei" }, "90": { - "other": "Ziel-Arbeitsumgebung auswählen" + "other": "Ziel-Workspace auswählen" }, "91": { "other": "Dateien mit dem Sync-Client offline synchronisieren" @@ -246,6 +246,6 @@ "other": "Workspace" }, "reco.cell": { - "other": "Zelle" + "other": "Cell" } } \ No newline at end of file diff --git a/frontend/front-srv/assets/access.homepage/res/i18n/fr-ca.all.json b/frontend/front-srv/assets/access.homepage/res/i18n/fr-ca.all.json index 3d98728be7..bda389448e 100644 --- a/frontend/front-srv/assets/access.homepage/res/i18n/fr-ca.all.json +++ b/frontend/front-srv/assets/access.homepage/res/i18n/fr-ca.all.json @@ -240,7 +240,7 @@ "other": "Nom du fichier" }, "reco.bookmark": { - "other": "Bookmark" + "other": "Favori" }, "reco.workspace": { "other": "Workspace" diff --git a/frontend/front-srv/assets/access.homepage/res/images/movecards.gif b/frontend/front-srv/assets/access.homepage/res/images/movecards.gif deleted file mode 100644 index 11d477c32f..0000000000 Binary files a/frontend/front-srv/assets/access.homepage/res/images/movecards.gif and /dev/null differ diff --git a/frontend/front-srv/assets/access.homepage/res/js/apps/DlAppsCard.js b/frontend/front-srv/assets/access.homepage/res/js/apps/DlAppsCard.js index 14b85397f5..61d1b7fc8d 100644 --- a/frontend/front-srv/assets/access.homepage/res/js/apps/DlAppsCard.js +++ b/frontend/front-srv/assets/access.homepage/res/js/apps/DlAppsCard.js @@ -20,7 +20,6 @@ const React = require('react'); import DownloadApp from './DownloadApp' -import ColorPaper from '../board/ColorPaper' const {asGridItem} = require('pydio').requireLib('components'); class DlAppsPanel extends React.Component{ @@ -36,8 +35,8 @@ class DlAppsPanel extends React.Component{ key="dl_pydio_ios" configs={configs} configHref="URL_APP_IOSAPPSTORE" - containerClassName="icon-tablet" - iconClassName="icon-apple" + containerClassName="mdi mdi-cellphone-iphone" + iconClassName="mdi mdi-apple" messageId="user_home.59" tooltipId="user_home.70" /> @@ -52,8 +51,8 @@ class DlAppsPanel extends React.Component{ key="dl_pydio_android" configs={configs} configHref="URL_APP_ANDROID" - containerClassName="icon-mobile-phone" - iconClassName="icon-android" + containerClassName="mdi mdi-cellphone-android" + iconClassName="mdi mdi-android" messageId="user_home.58" tooltipId="user_home.71" /> @@ -67,8 +66,8 @@ class DlAppsPanel extends React.Component{ key="dl_pydio_win" configs={configs} configHref="URL_APP_SYNC_WIN" - containerClassName="icon-laptop" - iconClassName="icon-windows" + containerClassName="mdi mdi-laptop-windows" + iconClassName="mdi mdi-windows" messageId="user_home.61" tooltipId="user_home.68" /> @@ -82,8 +81,8 @@ class DlAppsPanel extends React.Component{ key="dl_pydio_mac" configs={configs} configHref="URL_APP_SYNC_MAC" - containerClassName="icon-desktop" - iconClassName="icon-apple" + containerClassName="mdi mdi-laptop-mac" + iconClassName="mdi mdi-apple" messageId="user_home.60" tooltipId="user_home.69" /> @@ -102,10 +101,10 @@ class DlAppsCard extends React.Component { render() { let props = {...this.props}; return ( - +
{this.props.pydio.MessageHash['user_home.91']}
- +
); } } diff --git a/frontend/front-srv/assets/access.homepage/res/js/apps/DownloadApp.js b/frontend/front-srv/assets/access.homepage/res/js/apps/DownloadApp.js index 9225c564ee..dc2edb586b 100644 --- a/frontend/front-srv/assets/access.homepage/res/js/apps/DownloadApp.js +++ b/frontend/front-srv/assets/access.homepage/res/js/apps/DownloadApp.js @@ -19,6 +19,7 @@ */ import React from 'react' import PropTypes from 'prop-types' +import {IconButton} from 'material-ui' class DownloadApp extends React.Component{ @@ -40,7 +41,7 @@ class DownloadApp extends React.Component{ const {pydio, iconClassName, tooltipId, configs, configHref} = this.props; return ( - +
{this.props.pydio.MessageHash['user_home.74']}
- +
- +
); } diff --git a/frontend/front-srv/assets/access.homepage/res/js/board/ColorPaper.js b/frontend/front-srv/assets/access.homepage/res/js/board/ColorPaper.js deleted file mode 100644 index c8c0bc1bab..0000000000 --- a/frontend/front-srv/assets/access.homepage/res/js/board/ColorPaper.js +++ /dev/null @@ -1,71 +0,0 @@ -const PropTypes = require('prop-types'); -/* - * Copyright 2007-2017 Charles du Jeu - Abstrium SAS - * This file is part of Pydio. - * - * Pydio is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Pydio is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with Pydio. If not, see . - * - * The latest code can be found at . - */ - -const React = require('react') -const {Paper} = require('material-ui') -import Palette from './Palette' - -/** - * Generic paper with a background color picked from palette - */ -class ColorPaper extends React.Component{ - - render(){ - - const tint = Palette[this.props.paletteIndex]; - - const style = { - ...this.props.style, - backgroundColor: tint, - color: 'white' - }; - - - return ( - - {this.props.getCloseButton ? this.props.getCloseButton() : this.props.closeButton} - {this.props.children} - - ); - } - -} - -ColorPaper.propTypes = { - /** - * Pass the proper style for grid layout - */ - style: PropTypes.object.isRequired, - /** - * Legacy way of passing the close button, use closeButton prop instead - */ - getCloseButton: PropTypes.func, - /** - * Passed by parent, through the asGridItem HOC - */ - closeButton: PropTypes.object, - /** - * An integer to choose which color to pick - */ - paletteIndex: PropTypes.number.isRequired -}; - -export {ColorPaper as default} \ No newline at end of file diff --git a/frontend/front-srv/assets/access.homepage/res/js/board/ConfigLogo.js b/frontend/front-srv/assets/access.homepage/res/js/board/ConfigLogo.js index 2182682085..641aaae9a8 100644 --- a/frontend/front-srv/assets/access.homepage/res/js/board/ConfigLogo.js +++ b/frontend/front-srv/assets/access.homepage/res/js/board/ConfigLogo.js @@ -20,23 +20,24 @@ const React = require('react') -class ConfigLogo extends React.Component{ - - render(){ - let logo = this.props.pydio.Registry.getPluginConfigs(this.props.pluginName).get(this.props.pluginParameter); - let url; - if(!logo){ - logo = this.props.pydio.Registry.getDefaultImageFromParameters(this.props.pluginName, this.props.pluginParameter); - } - if(logo){ - if(logo.indexOf('plug/') === 0){ - url = logo; - }else{ - url = this.props.pydio.Parameters.get('ENDPOINT_REST_API') + "/frontend/binaries/GLOBAL/" + logo; +const ConfigLogo =({pydio, pluginName, pluginParameter, style, darkMode, className})=> { + let logo = pydio.Registry.getPluginConfigs(pluginName).get(pluginParameter); + let url; + if(!logo){ + logo = pydio.Registry.getDefaultImageFromParameters(pluginName, pluginParameter); + } + if(logo){ + if(logo.indexOf('plug/') === 0){ + if(logo.indexOf('[mode]') !== -1){ + logo = logo.replace('[mode]', darkMode?'dark':'light') } + url = logo; + }else{ + url = pydio.Parameters.get('ENDPOINT_REST_API') + "/frontend/binaries/GLOBAL/" + logo; } - return } + return {"application } + export {ConfigLogo as default} \ No newline at end of file diff --git a/frontend/front-srv/assets/access.homepage/res/js/board/Facets.js b/frontend/front-srv/assets/access.homepage/res/js/board/Facets.js deleted file mode 100644 index f6111c8b42..0000000000 --- a/frontend/front-srv/assets/access.homepage/res/js/board/Facets.js +++ /dev/null @@ -1,160 +0,0 @@ -/* - * Copyright 2007-2020 Charles du Jeu - Abstrium SAS - * This file is part of Pydio. - * - * Pydio is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Pydio is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with Pydio. If not, see . - * - * The latest code can be found at . - */ -import React from 'react' -import {Chip, Avatar, Paper} from 'material-ui' - -class Facet extends React.Component { - - select(){ - const {onSelect, facet} = this.props; - onSelect(facet, true) - } - - clear(){ - const {onSelect, facet} = this.props; - onSelect(facet, false) - } - - render() { - const {facet, selected, m} = this.props; - let requestSelect, requestDelete; - const mFacet = (id) => { - const key = 'facet.label.' + id; - return m(key) === key ? id : m(key); - } - if(selected){ - requestDelete = () => this.clear() - } else { - requestSelect = () => this.select() - } - const cc = { - chip:{ - backgroundColor:selected?'#03a9f4':null, - labelColor:selected?'white':null - }, - avatar:{ - backgroundColor:selected?'#0288D1':null, - color:selected?'white':null - } - }; - return ( - {facet.Count} {mFacet(facet.Label)} - ); - } -} - -class Facets extends React.Component { - - isSelected(selected, facet){ - return selected.filter(s => (s.FieldName === facet.FieldName && s.Label === facet.Label)).length > 0 - } - - render() { - const {pydio, facets, onSelectFacet, selected=[]} = this.props; - const m = (id) => pydio.MessageHash['user_home.' + id] || id - const groups = {} - const groupKeys = { - 'NodeType':'type', - 'Extension':'extension', - 'Size':'size', - 'ModifTime':'modified', - 'Basename':'found', - 'Meta':'metadata', - } - const hasContentSelected = selected.filter(f => f.FieldName === 'TextContent').length > 0 - facets.forEach(f => { - let fName = f.FieldName; - if(fName.indexOf('Meta.') === 0) { - fName = 'Meta'; - } - if (fName === 'Basename' && hasContentSelected) { - return // Exclude Basename when TextContent is selected - } - if(fName === 'TextContent'){ // Group basename / TextContent - fName = 'Basename' - } - if (!groups[fName]) { - groups[fName] = []; - } - groups[fName].push(f); - }) - if (!Object.keys(groupKeys).filter(k => groups[k]).filter(k => { - const hasSelected = groups[k].filter(f => this.isSelected(selected, f)).length > 0 - return hasSelected || groups[k].length > 1 - }).length){ - return null; - } - const styles = { - container: { - position: 'absolute', - top: 90, - right: 'calc(50% + 350px)', - maxHeight:'calc(100% - 100px)', - overflowY: 'auto', - width: 200, - borderRadius: 6, - paddingBottom: 10 - }, - header : { - fontWeight: 500, - color: '#5c7784', - padding: 10, - fontSize: 15 - }, - subHeader: { - fontWeight: 500, - padding: '5px 10px', - color: 'rgba(92, 119, 132, 0.7)' - } - } - - return ( - -
{m('search.facets.title')}
- {Object.keys(groupKeys) - .filter(k => groups[k]) - .filter(k => { - const hasSelected = groups[k].filter(f => this.isSelected(selected, f)).length > 0 - return hasSelected || groups[k].length > 1 - }) - .map(k => { - return( -
-
{m('search.facet.' + groupKeys[k])}
-
- {groups[k].sort((a,b) => a.Label.localeCompare(b.Label)).map((f)=> { - return (); - })} -
-
- ); - })} -
- ); - } - -} - -export default Facets \ No newline at end of file diff --git a/frontend/front-srv/assets/access.homepage/res/js/board/HomeDashboard.js b/frontend/front-srv/assets/access.homepage/res/js/board/HomeDashboard.js index f9d3d1560c..c2835bc79f 100644 --- a/frontend/front-srv/assets/access.homepage/res/js/board/HomeDashboard.js +++ b/frontend/front-srv/assets/access.homepage/res/js/board/HomeDashboard.js @@ -68,40 +68,34 @@ class AltDashboard extends React.Component { const {drawerOpen, fullScreen, fullScreenTransition} = this.state; const appBarColor = new Color(muiTheme.appBar.color); - const colorHue = Color(muiTheme.palette.primary1Color).hsl().array()[0]; - const lightBg = new Color({h:colorHue,s:35,l:98}); - const fontColor = Color(muiTheme.palette.primary1Color).darken(0.1).alpha(0.87); - - - const styles = { - appBarStyle : { - backgroundColor: 'rgba(255, 255, 255, 0.50)', - height: fullScreen? 0: 200, - display: 'flex', - alignItems: 'center', - justifyContent: 'center' - }, - buttonsStyle : { - color: muiTheme.appBar.textColor - }, - iconButtonsStyle :{ - color: appBarColor.darken(0.4).toString() - }, - wsListsContainerStyle: { - flex: 1, - display:'flex', - flexDirection:'column', - alignItems:'center', - backgroundColor: 'white', - overflow:'hidden' - }, - wsListStyle:{ - backgroundColor : lightBg.toString(), - color : fontColor.toString(), - } - }; + const isMui3 = muiTheme.userTheme === 'mui3' + const {palette:{mui3}} = muiTheme + + const styles = muiTheme.buildFSTemplate({}) + styles.appBarStyle = { + backgroundColor: muiTheme.darkMode? 'rgba(0, 0, 0, 0.4)' : 'rgba(255, 255, 255, 0.40)', + height: fullScreen? 0: 200, + display: 'flex', + alignItems: 'center', + justifyContent: 'center' + } + styles.buttonsStyle = { + color: muiTheme.appBar.textColor + } + styles.iconButtonsStyle = { + color: appBarColor.darken(0.4).toString() + } + styles.wsListsContainerStyle = { + flex: 1, + display:'flex', + flexDirection:'column', + alignItems:'center', + backgroundColor: isMui3 ? mui3['surface']:'white', + overflow:'hidden', + } - let mainClasses = ['vertical_layout', 'vertical_fit', 'react-fs-template', 'user-dashboard-template']; + + let mainClasses = ['vertical_fit', 'react-fs-template', 'user-dashboard-template']; let tutorialComponent; if (this.showTutorial()) { @@ -111,12 +105,22 @@ class AltDashboard extends React.Component { } const headerHeight = 72; + let additionalStyle = {} + if(muiTheme.userTheme !== 'mui3'){ + additionalStyle = { + position:'absolute', + bottom:0, + top:0, + zIndex: 1000, + transform: drawerOpen?'translateX(0px)':'translateX(-250px)' + } + } + const leftPanelProps = { - style: {backgroundColor: 'transparent'}, + style: {...styles.leftPanel.masterStyle, ...additionalStyle}, headerHeight:headerHeight, onMouseOver:()=>{this.clearCloseTimeout()}, userWidgetProps: { - color: fontColor.toString(), mergeButtonInAvatar:true, popoverDirection:'left', actionBarStyle:{ @@ -126,12 +130,9 @@ class AltDashboard extends React.Component { height: headerHeight, display:'flex', alignItems:'center', - backgroundColor:lightBg.toString(), - boxShadow: 'none' + boxShadow: 'none', + background:'transparent' } - }, - workspacesListProps:{ - style:styles.wsListStyle } }; @@ -147,6 +148,7 @@ class AltDashboard extends React.Component { - - - -
+ {!isMui3 && + + + + } +
- + diff --git a/frontend/front-srv/assets/access.homepage/res/js/board/HomeSearchForm.js b/frontend/front-srv/assets/access.homepage/res/js/board/HomeSearchForm.js index 2475f5f9ae..98cfa69d03 100644 --- a/frontend/front-srv/assets/access.homepage/res/js/board/HomeSearchForm.js +++ b/frontend/front-srv/assets/access.homepage/res/js/board/HomeSearchForm.js @@ -59,15 +59,20 @@ class HomeSearchForm extends Component{ // From HOC const {searchTools, searchTools:{facets, activeFacets, toggleFacet, loading, dataModel, empty}} = this.props; - const {style, zDepth, pydio, fullScreen, fullScreenTransition, onFocusChange} = this.props; + const {style, zDepth, pydio, fullScreen, fullScreenTransition, onFocusChange, muiTheme} = this.props; + + const isMui3 = muiTheme.userTheme === 'mui3' + const {palette:{mui3}} = muiTheme + const whiteTransp = 'rgba(0,0,0,.53)'; const styles = { mainContainer: { - width:'100%', position:'absolute', top: fullScreen? 0 : 199, + left: isMui3?74:0, + right: 0, bottom: 0, transition: 'all 450ms cubic-bezier(0.23, 1, 0.32, 1) 0ms', display:'flex', @@ -80,15 +85,15 @@ class HomeSearchForm extends Component{ display:'flex', flexDirection:'column', alignItems:'center', - backgroundColor:'transparent', - padding: fullScreen ? '10px 50px': 0 + background:isMui3&&fullScreen?mui3['surface-1']:'transparent', + padding: fullScreen ? (isMui3 ? '10px 50px 10px 10px' : '10px 50px') : 0 }, textFieldContainer: { width:'100%', maxWidth:fullScreen?10000:700, display:'flex', alignItems:'center', - backgroundColor: '#eceff1', + background: isMui3?mui3['surface-variant']:'#eceff1', height: fullScreen?40:50, padding: '2px 4px', borderRadius: 50, @@ -98,7 +103,7 @@ class HomeSearchForm extends Component{ textInput: {color: 'inherit'}, textHint : {color: whiteTransp, overflow: 'hidden', whiteSpace: 'nowrap', textOverflow: 'ellipsis', width: '100%'}, magnifier: {color: whiteTransp, fontSize: 20, padding:'14px 8px'}, - close: {position:'absolute', right:0, zIndex: 2}, + close: {position:'absolute', right:2, top: 6, zIndex: 2}, searchForm:{ mainStyle:{ backgroundColor:'transparent', @@ -108,9 +113,12 @@ class HomeSearchForm extends Component{ completeMenuStyle:{width: '100%'}, inputStyle:{fontSize: 18}, hintStyle:{fontSize: 18}, - magnifierStyle:{fontSize: 20, color:'rgba(0,0,0,0.73)', marginRight: 10}, //{color: appBarTextColor.fade(0.1).toString()}, + magnifierStyle:{ + fontSize: 20, + marginRight: 10 + }, filterButton:{ - color:'#03a9f4', + color:muiTheme.palette.primary1Color, fontSize: 22, width:28, height: 28, @@ -122,10 +130,13 @@ class HomeSearchForm extends Component{ container: { width: 230, overflowY: 'auto', - color: '#5c7784', + background:mui3['surface-2'], + color: isMui3?mui3['on-surface-variant']:'#5c7784', + borderRadius: 0, + borderRight: isMui3?'1px solid '+mui3['outline-variant-50']:undefined, paddingLeft: 16, paddingRight: 16, - paddingTop: 10 + paddingTop: 10, }, header : { fontWeight: 500, @@ -197,8 +208,9 @@ class HomeSearchForm extends Component{ facets={facets} activeFacets={activeFacets} onToggleFacet={toggleFacet} - emptyStateView={
Filter Results... (no results)
} + emptyStateView={
{pydio.MessageHash['user_home.search.facets.title']}
} styles={styles.facets} + zDepth={isMui3?0:undefined} /> } {this.props.children}
- ); - } - -} +const {ThemeTogglerCard, Scheme} = Pydio.requireLib('workspaces') let WorkspacesCard = (props) => { @@ -99,19 +80,6 @@ let SearchCard = (props) => { }; -let WidgetsCard = (props) => { - - return ( -
-

{props.message('widget-cards')}

- - - -
- ); - -}; - class WelcomeTour extends Component{ constructor(props, context){ @@ -140,6 +108,7 @@ class WelcomeTour extends Component{ let guiPrefs = user.getPreference('gui_preferences', true); guiPrefs['UserAccount.WelcomeModal.Shown'] = true; if(finished) { + guiPrefs['WelcomeComponent.MUITour'] = true; guiPrefs['WelcomeComponent.Pydio8.TourGuide.Welcome'] = true; if(onFinish){ onFinish(); @@ -158,10 +127,16 @@ class WelcomeTour extends Component{ const message = (id) => getMessage('ajax_gui.tour.' + id); let tourguideSteps = [ + { + title : message('theme.title'), + text : , + selector :'.mdi.mdi-theme-light-dark', + position :'right-end' + }, { title : message('workspaces.title'), text : , - selector :'.user-workspaces-list', + selector :'.mdi-folder-multiple-outline', position :'right' }, { @@ -171,6 +146,7 @@ class WelcomeTour extends Component{ position : 'bottom' }, ]; + /* if(this.props.pydio.user){ let hasAccessRepo = false; this.props.pydio.user.getRepositoriesList().forEach((entry) => { @@ -186,7 +162,7 @@ class WelcomeTour extends Component{ position : 'right' }); } - } + }*/ const callback = (data) => { if(data.type === 'step:after' && data.index === tourguideSteps.length - 1 ){ diff --git a/frontend/front-srv/assets/access.homepage/res/js/index.js b/frontend/front-srv/assets/access.homepage/res/js/index.js index f8cdb29097..2efd8b7139 100644 --- a/frontend/front-srv/assets/access.homepage/res/js/index.js +++ b/frontend/front-srv/assets/access.homepage/res/js/index.js @@ -18,21 +18,8 @@ * The latest code can be found at . */ -import DlAppsCard from './apps/DlAppsCard' -import QRCodeCard from './apps/QRCodeCard' -import QuickSendCard from './quicksend/QuickSendCard' -import WorkspacePickerDialog from './quicksend/WorkspacePickerDialog' -import VideoCard from './videos/VideoCard' -import WorkspacesListCard from './workspaces/WorkspacesListCard' - import HomeDashboard from './board/HomeDashboard' export { - DlAppsCard, - QRCodeCard, - QuickSendCard, - WorkspacePickerDialog, - VideoCard, - WorkspacesListCard, HomeDashboard } \ No newline at end of file diff --git a/frontend/front-srv/assets/access.homepage/res/js/quicksend/QuickSendCard.js b/frontend/front-srv/assets/access.homepage/res/js/quicksend/QuickSendCard.js deleted file mode 100644 index 4c0d53e332..0000000000 --- a/frontend/front-srv/assets/access.homepage/res/js/quicksend/QuickSendCard.js +++ /dev/null @@ -1,113 +0,0 @@ -/* - * Copyright 2007-2017 Charles du Jeu - Abstrium SAS - * This file is part of Pydio. - * - * Pydio is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Pydio is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with Pydio. If not, see . - * - * The latest code can be found at . - */ - -import ColorPaper from '../board/ColorPaper' -const React = require('react') -const {CardTitle, CircularProgress} = require('material-ui') -const {asGridItem} = require('pydio').requireLib('components') -const {FileDropZone} = require('pydio').requireLib('form') - -const {NativeFileDropProvider} = require('pydio').requireLib('hoc'); -const BinaryDropZone = NativeFileDropProvider(FileDropZone, (items, files, props) => {}); - -class QuickSendCard extends React.Component { - - fileDroppedOrPicked = (event, monitor = null) => { - - let items, files; - if(monitor){ - let dataTransfer = monitor.getItem().dataTransfer; - if (dataTransfer.items.length && dataTransfer.items[0] && (dataTransfer.items[0].getAsEntry || dataTransfer.items[0].webkitGetAsEntry)) { - items = dataTransfer.items; - } - }else if(event.dataTransfer){ - items = event.dataTransfer.items || []; - files = event.dataTransfer.files; - }else if(event.target){ - files = event.target.files; - } - - let uploadItems = []; - if(window['UploaderModel'] && global.pydio.getController().getActionByName('upload')){ - UploaderModel.Store.getInstance().handleDropEventResults(items, files, new AjxpNode('/'), uploadItems); - } - return uploadItems; - }; - - onDrop = (files, event, source) => { - const items = this.fileDroppedOrPicked(event); - this.setState({uploadItems: items}); - this.props.pydio.UI.openComponentInModal('WelcomeComponents', 'WorkspacePickerDialog', { - onWorkspaceTouchTap: this.targetWorkspaceSelected.bind(this), - legend : (files && files[0] ?
{this.props.pydio.MessageHash['user_home.89']}: {files[0].name}
: undefined) - }); - }; - - targetWorkspaceSelected = (wsId) => { - const contextNode = new AjxpNode('/'); - contextNode.getMetadata().set('repository_id', wsId); - const {uploadItems} = this.state; - if(window['UploaderModel'] && global.pydio.getController().getActionByName('upload')){ - const instance = UploaderModel.Store.getInstance(); - uploadItems.forEach((item) => { - item.updateRepositoryId(wsId); - item.observe('status', () => { - this.setState({working:(item.getStatus() === 'loading') }); - }); - instance.pushFile(item); - }); - instance.processNext(); - } - }; - - render() { - const title = ; - const working = this.state && this.state.working; - - return ( - -
-
{this.props.pydio.MessageHash['user_home.88']}
-
- {working && - - } - {!working && - - - - } -
-
-
- ); - } -} - -QuickSendCard = asGridItem(QuickSendCard,global.pydio.MessageHash['user_home.93'],{gridWidth:2,gridHeight:10},[]); -export {QuickSendCard as default} \ No newline at end of file diff --git a/frontend/front-srv/assets/access.homepage/res/js/quicksend/WorkspacePickerDialog.js b/frontend/front-srv/assets/access.homepage/res/js/quicksend/WorkspacePickerDialog.js deleted file mode 100644 index 8263e0fd0e..0000000000 --- a/frontend/front-srv/assets/access.homepage/res/js/quicksend/WorkspacePickerDialog.js +++ /dev/null @@ -1,74 +0,0 @@ -/* - * Copyright 2007-2017 Charles du Jeu - Abstrium SAS - * This file is part of Pydio. - * - * Pydio is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Pydio is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with Pydio. If not, see . - * - * The latest code can be found at . - */ - -const React = require('react') -const createReactClass = require('create-react-class'); -const {ActionDialogMixin, CancelButtonProviderMixin} = require('pydio').requireLib('boot') -const {WorkspacesListMaterial} = require('pydio').requireLib('workspaces') - -const WorkspacePickerDialog = createReactClass({ - displayName: 'WorkspacePickerDialog', - - mixins: [ - ActionDialogMixin, - CancelButtonProviderMixin - ], - - getDefaultProps: function(){ - return { - dialogTitleId: 'user_home.90', - dialogSize: 'sm', - dialogPadding: false, - dialogIsModal: true, - dialogScrollBody: true - }; - }, - - submit: function(){ - this.dismiss(); - }, - - workspaceTouchTap: function(wsId){ - this.dismiss(); - this.props.onWorkspaceTouchTap(wsId); - }, - - render: function(){ - - const {pydio} = this.props; - return ( -
- {this.props.legend} - -
- ); - - }, -}); - -export {WorkspacePickerDialog as default} \ No newline at end of file diff --git a/frontend/front-srv/assets/access.homepage/res/js/recent/SmartRecents.js b/frontend/front-srv/assets/access.homepage/res/js/recent/SmartRecents.js index 0da7fc5ca7..11e44acc9d 100644 --- a/frontend/front-srv/assets/access.homepage/res/js/recent/SmartRecents.js +++ b/frontend/front-srv/assets/access.homepage/res/js/recent/SmartRecents.js @@ -261,7 +261,9 @@ class RecentCard extends React.Component{ render(){ const {opacity, hover} = this.state; - const styles={ + const {muiTheme} = this.props; + + let styles={ paper:{ width: 140, height: 160, margin: 10, @@ -287,6 +289,35 @@ class RecentCard extends React.Component{ title:{fontSize:14, marginTop: 10}, legend:{fontSize: 11, fontWeight: 500, color: '#9E9E9E'}, }; + if(muiTheme.userTheme === 'mui3') { + const {palette:{mui3}} = muiTheme + styles.paper = { + ...styles.paper, + width:160, + height: 190, + borderRadius: 12, + boxShadow: null, + margin: 4, + padding: 0, + paddingBottom: 6, + background:mui3['surface-1'], + color:mui3['on-surface'], + border: '1px solid ' + mui3['outline-variant-50'] + } + styles.preview = { + ...styles.preview, + borderRadius: 12, + boxShadow: null + } + styles.label = { + ...styles.label, + paddingLeft: 10, + textAlign: 'left' + } + styles.title.fontWeight = 500 + styles.legend.color = mui3['on-surface-variant'] + styles.legend.fontWeight = 400 + } const {title, legend, node, pydio} = this.props; return ( @@ -320,12 +351,24 @@ class SmartRecents extends React.Component{ render(){ + + const {pydio, style, muiTheme} = this.props; + const {nodes, loading} = this.state; + + let phStyle = {margin:10,width:140, height: 160, padding: 6, display:'flex', flexDirection:'column', alignItems:'center', borderRadius: 6} + if(muiTheme.userTheme === 'mui3') { + phStyle.width = 160; + phStyle.height = 190; + phStyle.margin=4; + phStyle.borderRadius=12; + } + const cardsPH = (
{[0,1,2,3,4,5,6,7].map(() => { return ( -
- +
+
@@ -334,9 +377,6 @@ class SmartRecents extends React.Component{
); - const {pydio, style} = this.props; - const {nodes, loading} = this.state; - if (!pydio.user || pydio.user.lock) { return
; } @@ -352,6 +392,7 @@ class SmartRecents extends React.Component{ - * This file is part of Pydio. - * - * Pydio is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Pydio is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with Pydio. If not, see . - * - * The latest code can be found at . - */ - -const React = require('react') -import PropTypes from 'prop-types' -const ReactDOM = require('react-dom') -const {asGridItem} = require('pydio').requireLib('components') -const {MenuItem, IconMenu} = require('material-ui') - -import VideoPlayer from './VideoPlayer' -import Palette from '../board/Palette' -import ColorPaper from '../board/ColorPaper' - -const PALETTE_INDEX = 4; - -/** - * Display a list of tutorial videos as a material card - */ -class VideoCard extends React.Component { - static propTypes = { - youtubeId : PropTypes.string, - contentMessageId : PropTypes.string - }; - - constructor(props) { - super(props); - this._videos = [ - ['qvsSeLXr-T4', 'user_home.63'], - ['HViCWPpyZ6k', 'user_home.79'], - ['jBRNqwannJM', 'user_home.80'], - ['2jl1EsML5v8', 'user_home.81'], - ['28-t4dvhE6c', 'user_home.82'], - ['fP0MVejnVZE', 'user_home.83'], - ['TXFz4w4trlQ', 'user_home.84'], - ['OjHtgnL_L7Y', 'user_home.85'], - ['ot2Nq-RAnYE', 'user_home.66'] - ]; - const k = Math.floor(Math.random() * this._videos.length); - const value = this._videos[k]; - - this.state = { - videoIndex : k, - youtubeId : value[0], - contentMessageId: value[1] - }; - } - - launchVideo = () => { - const url = "//www.youtube.com/embed/"+this.state.youtubeId+"?list=PLxzQJCqzktEbYm3U_O1EqFru0LsEFBca5&autoplay=1"; - this._videoDiv = document.createElement('div'); - document.body.appendChild(this._videoDiv); - ReactDOM.render(, this._videoDiv); - }; - - closePlayer = () => { - ReactDOM.unmountComponentAtNode(this._videoDiv); - document.body.removeChild(this._videoDiv); - }; - - getTitle = (messId) => { - const text = this.props.pydio.MessageHash[messId]; - return text.split('\n').shift().replace('

', '').replace('

', ''); - }; - - browse = (direction = 'next', event) => { - let nextIndex; - const {videoIndex} = this.state; - if(direction === 'next'){ - nextIndex = videoIndex < this._videos.length -1 ? videoIndex + 1 : 0; - }else{ - nextIndex = videoIndex > 0 ? videoIndex - 1 : this._videos.length - 1; - } - const value = this._videos[nextIndex]; - this.setState({ - videoIndex : nextIndex, - youtubeId : value[0], - contentMessageId: value[1] - }); - }; - - render() { - const MessageHash = this.props.pydio.MessageHash; - const htmlMessage = function(id){ - return {__html:MessageHash[id]}; - }; - const menus = this._videos.map(function(item, index){ - return {this.setState({youtubeId:item[0], contentMessageId:item[1], videoIndex: index})} }/>; - }.bind(this)); - let props = {...this.props}; - const {youtubeId, contentMessageId} = this.state; - props.className += ' video-card'; - - const tint = MaterialUI.Color(Palette[PALETTE_INDEX]).alpha(0.8).toString(); - return ( - {return this.props.closeButton}}> -
-
-
-
-
-
-
- - } - anchorOrigin={{horizontal: 'right', vertical: 'top'}} - targetOrigin={{horizontal: 'right', vertical: 'top'}} - >{menus} -
-
-
- - ); - } -} - -VideoCard = asGridItem(VideoCard,global.pydio.MessageHash['user_home.94'],{gridWidth:2,gridHeight:12},[]); -export {VideoCard as default} diff --git a/frontend/front-srv/assets/access.homepage/res/js/videos/VideoPlayer.js b/frontend/front-srv/assets/access.homepage/res/js/videos/VideoPlayer.js deleted file mode 100644 index 63514b4888..0000000000 --- a/frontend/front-srv/assets/access.homepage/res/js/videos/VideoPlayer.js +++ /dev/null @@ -1,44 +0,0 @@ -/* - * Copyright 2007-2017 Charles du Jeu - Abstrium SAS - * This file is part of Pydio. - * - * Pydio is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Pydio is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with Pydio. If not, see . - * - * The latest code can be found at . - */ - -import React from 'react' -import PropTypes from 'prop-types' - -class VideoPlayer extends React.Component{ - - render(){ - return ( -
-
-
-