diff --git a/go.mod b/go.mod index 18d4e8a852..04152eae0e 100644 --- a/go.mod +++ b/go.mod @@ -136,6 +136,8 @@ require ( github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 // indirect github.com/godbus/dbus/v5 v5.0.6 // indirect github.com/golangci/modinfo v0.3.4 // indirect + github.com/gosimple/slug v1.14.0 // indirect + github.com/gosimple/unidecode v1.0.1 // indirect github.com/jjti/go-spancheck v0.6.1 // indirect github.com/lasiar/canonicalheader v1.1.1 // indirect github.com/opencontainers/runtime-spec v1.0.3-0.20210326190908-1c3f411f0417 // indirect diff --git a/go.sum b/go.sum index a7b95ba371..c8fdec275f 100644 --- a/go.sum +++ b/go.sum @@ -1135,6 +1135,10 @@ github.com/gordonklaus/ineffassign v0.1.0/go.mod h1:Qcp2HIAYhR7mNUVSIxZww3Guk4it github.com/gorilla/websocket v1.4.1/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc= github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/gosimple/slug v1.14.0 h1:RtTL/71mJNDfpUbCOmnf/XFkzKRtD6wL6Uy+3akm4Es= +github.com/gosimple/slug v1.14.0/go.mod h1:UiRaFH+GEilHstLUmcBgWcI42viBN7mAb818JrYOeFQ= +github.com/gosimple/unidecode v1.0.1 h1:hZzFTMMqSswvf0LBJZCZgThIZrpDHFXux9KeGmn6T/o= +github.com/gosimple/unidecode v1.0.1/go.mod h1:CP0Cr1Y1kogOtx0bJblKzsVWrqYaqfNOnHzpgWw4Awc= github.com/gostaticanalysis/analysisutil v0.7.1 h1:ZMCjoue3DtDWQ5WyU16YbjbQEQ3VuzwxALrpYd+HeKk= github.com/gostaticanalysis/analysisutil v0.7.1/go.mod h1:v21E3hY37WKMGSnbsw2S/ojApNWb6C1//mXO48CXbVc= github.com/gostaticanalysis/comment v1.4.1/go.mod h1:ih6ZxzTHLdadaiSnF5WY3dxUoXfXAlTaRzuaNDlSado= diff --git a/internal/services/steelthreadtesting/definitions.go b/internal/services/steelthreadtesting/definitions.go new file mode 100644 index 0000000000..ac39c44d40 --- /dev/null +++ b/internal/services/steelthreadtesting/definitions.go @@ -0,0 +1,49 @@ +//go:build steelthread +// +build steelthread + +package steelthreadtesting + +import v1 "github.com/authzed/authzed-go/proto/authzed/api/v1" + +type steelThreadTestCase struct { + name string + datafile string + operations []steelThreadOperationCase +} + +type steelThreadOperationCase struct { + name string + operationName string + arguments map[string]any +} + +type stOperation func(parameters map[string]any, client v1.PermissionsServiceClient) (any, error) + +var steelThreadTestCases = []steelThreadTestCase{ + { + name: "basic lookup subjects", + datafile: "basic-document.yaml", + operations: []steelThreadOperationCase{ + { + name: "uncursored lookup subjects for somedoc", + operationName: "lookupSubjects", + arguments: map[string]any{ + "resource_type": "document", + "resource_object_id": "somedoc", + "permission": "view", + "subject_type": "user", + }, + }, + { + name: "uncursored lookup subjects for public doc", + operationName: "lookupSubjects", + arguments: map[string]any{ + "resource_type": "document", + "resource_object_id": "publicdoc", + "permission": "view", + "subject_type": "user", + }, + }, + }, + }, +} diff --git a/internal/services/steelthreadtesting/operations.go b/internal/services/steelthreadtesting/operations.go new file mode 100644 index 0000000000..ef31a4c6a4 --- /dev/null +++ b/internal/services/steelthreadtesting/operations.go @@ -0,0 +1,101 @@ +//go:build steelthread +// +build steelthread + +package steelthreadtesting + +import ( + "context" + "errors" + "io" + "sort" + "strings" + "time" + + v1 "github.com/authzed/authzed-go/proto/authzed/api/v1" + "gopkg.in/yaml.v3" + + "github.com/authzed/spicedb/pkg/genutil/mapz" +) + +func lookupSubjects(parameters map[string]any, client v1.PermissionsServiceClient) (any, error) { + ctx, cancel := context.WithTimeout(context.Background(), 60*time.Second) + defer cancel() + + r, err := client.LookupSubjects(ctx, &v1.LookupSubjectsRequest{ + Resource: &v1.ObjectReference{ + ObjectType: parameters["resource_type"].(string), + ObjectId: parameters["resource_object_id"].(string), + }, + Permission: parameters["permission"].(string), + SubjectObjectType: parameters["subject_type"].(string), + Consistency: &v1.Consistency{ + Requirement: &v1.Consistency_FullyConsistent{ + FullyConsistent: true, + }, + }, + }) + if err != nil { + return nil, err + } + + foundSubjects := mapz.NewSet[string]() + for { + resp, err := r.Recv() + if err != nil { + if errors.Is(err, io.EOF) { + break + } + + return nil, err + } + + if !foundSubjects.Add(formatResolvedSubject(resp)) { + return nil, errors.New("duplicate subject found") + } + } + + foundSubjectsSlice := foundSubjects.AsSlice() + sort.Strings(foundSubjectsSlice) + + yamlNodes := make([]yaml.Node, 0, len(foundSubjectsSlice)) + for _, subject := range foundSubjectsSlice { + yamlNodes = append(yamlNodes, yaml.Node{ + Kind: yaml.ScalarNode, + Value: subject, + Style: yaml.SingleQuotedStyle, + }) + } + return yamlNodes, nil +} + +var operations = map[string]stOperation{ + "lookupSubjects": lookupSubjects, +} + +func formatResolvedSubject(sub *v1.LookupSubjectsResponse) string { + var sb strings.Builder + sb.WriteString(sub.Subject.SubjectObjectId) + + if len(sub.ExcludedSubjects) > 0 { + excludedSubjectStrings := make([]string, 0, len(sub.ExcludedSubjects)) + for _, excluded := range sub.ExcludedSubjects { + excludedSubjectString := excluded.SubjectObjectId + if excluded.Permissionship == v1.LookupPermissionship_LOOKUP_PERMISSIONSHIP_CONDITIONAL_PERMISSION { + excludedSubjectString += " (conditional)" + } + + excludedSubjectStrings = append(excludedSubjectStrings, excludedSubjectString) + } + sort.Strings(excludedSubjectStrings) + + sb.WriteString(" - [") + sb.WriteString(strings.Join(excludedSubjectStrings, ", ")) + sb.WriteString("]") + } + + if sub.Subject.Permissionship == v1.LookupPermissionship_LOOKUP_PERMISSIONSHIP_CONDITIONAL_PERMISSION { + sb.WriteString(" (conditional)") + } + + return sb.String() +} diff --git a/internal/services/steelthreadtesting/steelresults/basic-lookup-subjects-uncursored-lookup-subjects-for-public-doc-results.yaml b/internal/services/steelthreadtesting/steelresults/basic-lookup-subjects-uncursored-lookup-subjects-for-public-doc-results.yaml new file mode 100644 index 0000000000..9de75aa710 --- /dev/null +++ b/internal/services/steelthreadtesting/steelresults/basic-lookup-subjects-uncursored-lookup-subjects-for-public-doc-results.yaml @@ -0,0 +1,7 @@ +--- +- '* - [user-0, user-1, user-2, user-3, user-4, user-5]' +- 'user-10' +- 'user-6' +- 'user-7' +- 'user-8' +- 'user-9' diff --git a/internal/services/steelthreadtesting/steelresults/basic-lookup-subjects-uncursored-lookup-subjects-for-somedoc-results.yaml b/internal/services/steelthreadtesting/steelresults/basic-lookup-subjects-uncursored-lookup-subjects-for-somedoc-results.yaml new file mode 100644 index 0000000000..91b1c13a05 --- /dev/null +++ b/internal/services/steelthreadtesting/steelresults/basic-lookup-subjects-uncursored-lookup-subjects-for-somedoc-results.yaml @@ -0,0 +1,1601 @@ +--- +- 'admin-user-1' +- 'admin-user-2' +- 'admin-user-3' +- 'another-admin-user-1' +- 'another-admin-user-2' +- 'another-member-user-1' +- 'another-member-user-2' +- 'group-0-member-0' +- 'group-0-member-1' +- 'group-0-member-2' +- 'group-0-member-3' +- 'group-0-member-4' +- 'group-0-member-5' +- 'group-0-member-6' +- 'group-0-member-7' +- 'group-0-member-8' +- 'group-0-member-9' +- 'group-1-member-0' +- 'group-1-member-1' +- 'group-1-member-2' +- 'group-1-member-3' +- 'group-1-member-4' +- 'group-1-member-5' +- 'group-1-member-6' +- 'group-1-member-7' +- 'group-1-member-8' +- 'group-1-member-9' +- 'group-10-member-0' +- 'group-10-member-1' +- 'group-10-member-2' +- 'group-10-member-3' +- 'group-10-member-4' +- 'group-10-member-5' +- 'group-10-member-6' +- 'group-10-member-7' +- 'group-10-member-8' +- 'group-10-member-9' +- 'group-11-member-0' +- 'group-11-member-1' +- 'group-11-member-2' +- 'group-11-member-3' +- 'group-11-member-4' +- 'group-11-member-5' +- 'group-11-member-6' +- 'group-11-member-7' +- 'group-11-member-8' +- 'group-11-member-9' +- 'group-12-member-0' +- 'group-12-member-1' +- 'group-12-member-2' +- 'group-12-member-3' +- 'group-12-member-4' +- 'group-12-member-5' +- 'group-12-member-6' +- 'group-12-member-7' +- 'group-12-member-8' +- 'group-12-member-9' +- 'group-13-member-0' +- 'group-13-member-1' +- 'group-13-member-2' +- 'group-13-member-3' +- 'group-13-member-4' +- 'group-13-member-5' +- 'group-13-member-6' +- 'group-13-member-7' +- 'group-13-member-8' +- 'group-13-member-9' +- 'group-14-member-0' +- 'group-14-member-1' +- 'group-14-member-2' +- 'group-14-member-3' +- 'group-14-member-4' +- 'group-14-member-5' +- 'group-14-member-6' +- 'group-14-member-7' +- 'group-14-member-8' +- 'group-14-member-9' +- 'group-15-member-0' +- 'group-15-member-1' +- 'group-15-member-2' +- 'group-15-member-3' +- 'group-15-member-4' +- 'group-15-member-5' +- 'group-15-member-6' +- 'group-15-member-7' +- 'group-15-member-8' +- 'group-15-member-9' +- 'group-16-member-0' +- 'group-16-member-1' +- 'group-16-member-2' +- 'group-16-member-3' +- 'group-16-member-4' +- 'group-16-member-5' +- 'group-16-member-6' +- 'group-16-member-7' +- 'group-16-member-8' +- 'group-16-member-9' +- 'group-17-member-0' +- 'group-17-member-1' +- 'group-17-member-2' +- 'group-17-member-3' +- 'group-17-member-4' +- 'group-17-member-5' +- 'group-17-member-6' +- 'group-17-member-7' +- 'group-17-member-8' +- 'group-17-member-9' +- 'group-18-member-0' +- 'group-18-member-1' +- 'group-18-member-2' +- 'group-18-member-3' +- 'group-18-member-4' +- 'group-18-member-5' +- 'group-18-member-6' +- 'group-18-member-7' +- 'group-18-member-8' +- 'group-18-member-9' +- 'group-19-member-0' +- 'group-19-member-1' +- 'group-19-member-2' +- 'group-19-member-3' +- 'group-19-member-4' +- 'group-19-member-5' +- 'group-19-member-6' +- 'group-19-member-7' +- 'group-19-member-8' +- 'group-19-member-9' +- 'group-2-member-0' +- 'group-2-member-1' +- 'group-2-member-2' +- 'group-2-member-3' +- 'group-2-member-4' +- 'group-2-member-5' +- 'group-2-member-6' +- 'group-2-member-7' +- 'group-2-member-8' +- 'group-2-member-9' +- 'group-20-member-0' +- 'group-20-member-1' +- 'group-20-member-2' +- 'group-20-member-3' +- 'group-20-member-4' +- 'group-20-member-5' +- 'group-20-member-6' +- 'group-20-member-7' +- 'group-20-member-8' +- 'group-20-member-9' +- 'group-21-member-0' +- 'group-21-member-1' +- 'group-21-member-2' +- 'group-21-member-3' +- 'group-21-member-4' +- 'group-21-member-5' +- 'group-21-member-6' +- 'group-21-member-7' +- 'group-21-member-8' +- 'group-21-member-9' +- 'group-22-member-0' +- 'group-22-member-1' +- 'group-22-member-2' +- 'group-22-member-3' +- 'group-22-member-4' +- 'group-22-member-5' +- 'group-22-member-6' +- 'group-22-member-7' +- 'group-22-member-8' +- 'group-22-member-9' +- 'group-23-member-0' +- 'group-23-member-1' +- 'group-23-member-2' +- 'group-23-member-3' +- 'group-23-member-4' +- 'group-23-member-5' +- 'group-23-member-6' +- 'group-23-member-7' +- 'group-23-member-8' +- 'group-23-member-9' +- 'group-24-member-0' +- 'group-24-member-1' +- 'group-24-member-2' +- 'group-24-member-3' +- 'group-24-member-4' +- 'group-24-member-5' +- 'group-24-member-6' +- 'group-24-member-7' +- 'group-24-member-8' +- 'group-24-member-9' +- 'group-25-member-0' +- 'group-25-member-1' +- 'group-25-member-2' +- 'group-25-member-3' +- 'group-25-member-4' +- 'group-25-member-5' +- 'group-25-member-6' +- 'group-25-member-7' +- 'group-25-member-8' +- 'group-25-member-9' +- 'group-26-member-0' +- 'group-26-member-1' +- 'group-26-member-2' +- 'group-26-member-3' +- 'group-26-member-4' +- 'group-26-member-5' +- 'group-26-member-6' +- 'group-26-member-7' +- 'group-26-member-8' +- 'group-26-member-9' +- 'group-27-member-0' +- 'group-27-member-1' +- 'group-27-member-2' +- 'group-27-member-3' +- 'group-27-member-4' +- 'group-27-member-5' +- 'group-27-member-6' +- 'group-27-member-7' +- 'group-27-member-8' +- 'group-27-member-9' +- 'group-28-member-0' +- 'group-28-member-1' +- 'group-28-member-2' +- 'group-28-member-3' +- 'group-28-member-4' +- 'group-28-member-5' +- 'group-28-member-6' +- 'group-28-member-7' +- 'group-28-member-8' +- 'group-28-member-9' +- 'group-29-member-0' +- 'group-29-member-1' +- 'group-29-member-2' +- 'group-29-member-3' +- 'group-29-member-4' +- 'group-29-member-5' +- 'group-29-member-6' +- 'group-29-member-7' +- 'group-29-member-8' +- 'group-29-member-9' +- 'group-3-member-0' +- 'group-3-member-1' +- 'group-3-member-2' +- 'group-3-member-3' +- 'group-3-member-4' +- 'group-3-member-5' +- 'group-3-member-6' +- 'group-3-member-7' +- 'group-3-member-8' +- 'group-3-member-9' +- 'group-30-member-0' +- 'group-30-member-1' +- 'group-30-member-2' +- 'group-30-member-3' +- 'group-30-member-4' +- 'group-30-member-5' +- 'group-30-member-6' +- 'group-30-member-7' +- 'group-30-member-8' +- 'group-30-member-9' +- 'group-31-member-0' +- 'group-31-member-1' +- 'group-31-member-2' +- 'group-31-member-3' +- 'group-31-member-4' +- 'group-31-member-5' +- 'group-31-member-6' +- 'group-31-member-7' +- 'group-31-member-8' +- 'group-31-member-9' +- 'group-32-member-0' +- 'group-32-member-1' +- 'group-32-member-2' +- 'group-32-member-3' +- 'group-32-member-4' +- 'group-32-member-5' +- 'group-32-member-6' +- 'group-32-member-7' +- 'group-32-member-8' +- 'group-32-member-9' +- 'group-33-member-0' +- 'group-33-member-1' +- 'group-33-member-2' +- 'group-33-member-3' +- 'group-33-member-4' +- 'group-33-member-5' +- 'group-33-member-6' +- 'group-33-member-7' +- 'group-33-member-8' +- 'group-33-member-9' +- 'group-34-member-0' +- 'group-34-member-1' +- 'group-34-member-2' +- 'group-34-member-3' +- 'group-34-member-4' +- 'group-34-member-5' +- 'group-34-member-6' +- 'group-34-member-7' +- 'group-34-member-8' +- 'group-34-member-9' +- 'group-35-member-0' +- 'group-35-member-1' +- 'group-35-member-2' +- 'group-35-member-3' +- 'group-35-member-4' +- 'group-35-member-5' +- 'group-35-member-6' +- 'group-35-member-7' +- 'group-35-member-8' +- 'group-35-member-9' +- 'group-36-member-0' +- 'group-36-member-1' +- 'group-36-member-2' +- 'group-36-member-3' +- 'group-36-member-4' +- 'group-36-member-5' +- 'group-36-member-6' +- 'group-36-member-7' +- 'group-36-member-8' +- 'group-36-member-9' +- 'group-37-member-0' +- 'group-37-member-1' +- 'group-37-member-2' +- 'group-37-member-3' +- 'group-37-member-4' +- 'group-37-member-5' +- 'group-37-member-6' +- 'group-37-member-7' +- 'group-37-member-8' +- 'group-37-member-9' +- 'group-38-member-0' +- 'group-38-member-1' +- 'group-38-member-2' +- 'group-38-member-3' +- 'group-38-member-4' +- 'group-38-member-5' +- 'group-38-member-6' +- 'group-38-member-7' +- 'group-38-member-8' +- 'group-38-member-9' +- 'group-39-member-0' +- 'group-39-member-1' +- 'group-39-member-2' +- 'group-39-member-3' +- 'group-39-member-4' +- 'group-39-member-5' +- 'group-39-member-6' +- 'group-39-member-7' +- 'group-39-member-8' +- 'group-39-member-9' +- 'group-4-member-0' +- 'group-4-member-1' +- 'group-4-member-2' +- 'group-4-member-3' +- 'group-4-member-4' +- 'group-4-member-5' +- 'group-4-member-6' +- 'group-4-member-7' +- 'group-4-member-8' +- 'group-4-member-9' +- 'group-40-member-0' +- 'group-40-member-1' +- 'group-40-member-2' +- 'group-40-member-3' +- 'group-40-member-4' +- 'group-40-member-5' +- 'group-40-member-6' +- 'group-40-member-7' +- 'group-40-member-8' +- 'group-40-member-9' +- 'group-41-member-0' +- 'group-41-member-1' +- 'group-41-member-2' +- 'group-41-member-3' +- 'group-41-member-4' +- 'group-41-member-5' +- 'group-41-member-6' +- 'group-41-member-7' +- 'group-41-member-8' +- 'group-41-member-9' +- 'group-42-member-0' +- 'group-42-member-1' +- 'group-42-member-2' +- 'group-42-member-3' +- 'group-42-member-4' +- 'group-42-member-5' +- 'group-42-member-6' +- 'group-42-member-7' +- 'group-42-member-8' +- 'group-42-member-9' +- 'group-43-member-0' +- 'group-43-member-1' +- 'group-43-member-2' +- 'group-43-member-3' +- 'group-43-member-4' +- 'group-43-member-5' +- 'group-43-member-6' +- 'group-43-member-7' +- 'group-43-member-8' +- 'group-43-member-9' +- 'group-44-member-0' +- 'group-44-member-1' +- 'group-44-member-2' +- 'group-44-member-3' +- 'group-44-member-4' +- 'group-44-member-5' +- 'group-44-member-6' +- 'group-44-member-7' +- 'group-44-member-8' +- 'group-44-member-9' +- 'group-45-member-0' +- 'group-45-member-1' +- 'group-45-member-2' +- 'group-45-member-3' +- 'group-45-member-4' +- 'group-45-member-5' +- 'group-45-member-6' +- 'group-45-member-7' +- 'group-45-member-8' +- 'group-45-member-9' +- 'group-46-member-0' +- 'group-46-member-1' +- 'group-46-member-2' +- 'group-46-member-3' +- 'group-46-member-4' +- 'group-46-member-5' +- 'group-46-member-6' +- 'group-46-member-7' +- 'group-46-member-8' +- 'group-46-member-9' +- 'group-47-member-0' +- 'group-47-member-1' +- 'group-47-member-2' +- 'group-47-member-3' +- 'group-47-member-4' +- 'group-47-member-5' +- 'group-47-member-6' +- 'group-47-member-7' +- 'group-47-member-8' +- 'group-47-member-9' +- 'group-48-member-0' +- 'group-48-member-1' +- 'group-48-member-2' +- 'group-48-member-3' +- 'group-48-member-4' +- 'group-48-member-5' +- 'group-48-member-6' +- 'group-48-member-7' +- 'group-48-member-8' +- 'group-48-member-9' +- 'group-49-member-0' +- 'group-49-member-1' +- 'group-49-member-2' +- 'group-49-member-3' +- 'group-49-member-4' +- 'group-49-member-5' +- 'group-49-member-6' +- 'group-49-member-7' +- 'group-49-member-8' +- 'group-49-member-9' +- 'group-5-member-0' +- 'group-5-member-1' +- 'group-5-member-2' +- 'group-5-member-3' +- 'group-5-member-4' +- 'group-5-member-5' +- 'group-5-member-6' +- 'group-5-member-7' +- 'group-5-member-8' +- 'group-5-member-9' +- 'group-6-member-0' +- 'group-6-member-1' +- 'group-6-member-2' +- 'group-6-member-3' +- 'group-6-member-4' +- 'group-6-member-5' +- 'group-6-member-6' +- 'group-6-member-7' +- 'group-6-member-8' +- 'group-6-member-9' +- 'group-7-member-0' +- 'group-7-member-1' +- 'group-7-member-2' +- 'group-7-member-3' +- 'group-7-member-4' +- 'group-7-member-5' +- 'group-7-member-6' +- 'group-7-member-7' +- 'group-7-member-8' +- 'group-7-member-9' +- 'group-8-member-0' +- 'group-8-member-1' +- 'group-8-member-2' +- 'group-8-member-3' +- 'group-8-member-4' +- 'group-8-member-5' +- 'group-8-member-6' +- 'group-8-member-7' +- 'group-8-member-8' +- 'group-8-member-9' +- 'group-9-member-0' +- 'group-9-member-1' +- 'group-9-member-2' +- 'group-9-member-3' +- 'group-9-member-4' +- 'group-9-member-5' +- 'group-9-member-6' +- 'group-9-member-7' +- 'group-9-member-8' +- 'group-9-member-9' +- 'member-user-1' +- 'member-user-2' +- 'member-user-3' +- 'parent-group-0-admin-0' +- 'parent-group-0-admin-1' +- 'parent-group-0-admin-2' +- 'parent-group-0-admin-3' +- 'parent-group-0-admin-4' +- 'parent-group-0-admin-5' +- 'parent-group-0-admin-6' +- 'parent-group-0-admin-7' +- 'parent-group-0-admin-8' +- 'parent-group-0-admin-9' +- 'parent-group-0-member-0' +- 'parent-group-0-member-1' +- 'parent-group-0-member-2' +- 'parent-group-0-member-3' +- 'parent-group-0-member-4' +- 'parent-group-0-member-5' +- 'parent-group-0-member-6' +- 'parent-group-0-member-7' +- 'parent-group-0-member-8' +- 'parent-group-0-member-9' +- 'parent-group-1-admin-0' +- 'parent-group-1-admin-1' +- 'parent-group-1-admin-2' +- 'parent-group-1-admin-3' +- 'parent-group-1-admin-4' +- 'parent-group-1-admin-5' +- 'parent-group-1-admin-6' +- 'parent-group-1-admin-7' +- 'parent-group-1-admin-8' +- 'parent-group-1-admin-9' +- 'parent-group-1-member-0' +- 'parent-group-1-member-1' +- 'parent-group-1-member-2' +- 'parent-group-1-member-3' +- 'parent-group-1-member-4' +- 'parent-group-1-member-5' +- 'parent-group-1-member-6' +- 'parent-group-1-member-7' +- 'parent-group-1-member-8' +- 'parent-group-1-member-9' +- 'parent-group-10-admin-0' +- 'parent-group-10-admin-1' +- 'parent-group-10-admin-2' +- 'parent-group-10-admin-3' +- 'parent-group-10-admin-4' +- 'parent-group-10-admin-5' +- 'parent-group-10-admin-6' +- 'parent-group-10-admin-7' +- 'parent-group-10-admin-8' +- 'parent-group-10-admin-9' +- 'parent-group-10-member-0' +- 'parent-group-10-member-1' +- 'parent-group-10-member-2' +- 'parent-group-10-member-3' +- 'parent-group-10-member-4' +- 'parent-group-10-member-5' +- 'parent-group-10-member-6' +- 'parent-group-10-member-7' +- 'parent-group-10-member-8' +- 'parent-group-10-member-9' +- 'parent-group-11-admin-0' +- 'parent-group-11-admin-1' +- 'parent-group-11-admin-2' +- 'parent-group-11-admin-3' +- 'parent-group-11-admin-4' +- 'parent-group-11-admin-5' +- 'parent-group-11-admin-6' +- 'parent-group-11-admin-7' +- 'parent-group-11-admin-8' +- 'parent-group-11-admin-9' +- 'parent-group-11-member-0' +- 'parent-group-11-member-1' +- 'parent-group-11-member-2' +- 'parent-group-11-member-3' +- 'parent-group-11-member-4' +- 'parent-group-11-member-5' +- 'parent-group-11-member-6' +- 'parent-group-11-member-7' +- 'parent-group-11-member-8' +- 'parent-group-11-member-9' +- 'parent-group-12-admin-0' +- 'parent-group-12-admin-1' +- 'parent-group-12-admin-2' +- 'parent-group-12-admin-3' +- 'parent-group-12-admin-4' +- 'parent-group-12-admin-5' +- 'parent-group-12-admin-6' +- 'parent-group-12-admin-7' +- 'parent-group-12-admin-8' +- 'parent-group-12-admin-9' +- 'parent-group-12-member-0' +- 'parent-group-12-member-1' +- 'parent-group-12-member-2' +- 'parent-group-12-member-3' +- 'parent-group-12-member-4' +- 'parent-group-12-member-5' +- 'parent-group-12-member-6' +- 'parent-group-12-member-7' +- 'parent-group-12-member-8' +- 'parent-group-12-member-9' +- 'parent-group-13-admin-0' +- 'parent-group-13-admin-1' +- 'parent-group-13-admin-2' +- 'parent-group-13-admin-3' +- 'parent-group-13-admin-4' +- 'parent-group-13-admin-5' +- 'parent-group-13-admin-6' +- 'parent-group-13-admin-7' +- 'parent-group-13-admin-8' +- 'parent-group-13-admin-9' +- 'parent-group-13-member-0' +- 'parent-group-13-member-1' +- 'parent-group-13-member-2' +- 'parent-group-13-member-3' +- 'parent-group-13-member-4' +- 'parent-group-13-member-5' +- 'parent-group-13-member-6' +- 'parent-group-13-member-7' +- 'parent-group-13-member-8' +- 'parent-group-13-member-9' +- 'parent-group-14-admin-0' +- 'parent-group-14-admin-1' +- 'parent-group-14-admin-2' +- 'parent-group-14-admin-3' +- 'parent-group-14-admin-4' +- 'parent-group-14-admin-5' +- 'parent-group-14-admin-6' +- 'parent-group-14-admin-7' +- 'parent-group-14-admin-8' +- 'parent-group-14-admin-9' +- 'parent-group-14-member-0' +- 'parent-group-14-member-1' +- 'parent-group-14-member-2' +- 'parent-group-14-member-3' +- 'parent-group-14-member-4' +- 'parent-group-14-member-5' +- 'parent-group-14-member-6' +- 'parent-group-14-member-7' +- 'parent-group-14-member-8' +- 'parent-group-14-member-9' +- 'parent-group-15-admin-0' +- 'parent-group-15-admin-1' +- 'parent-group-15-admin-2' +- 'parent-group-15-admin-3' +- 'parent-group-15-admin-4' +- 'parent-group-15-admin-5' +- 'parent-group-15-admin-6' +- 'parent-group-15-admin-7' +- 'parent-group-15-admin-8' +- 'parent-group-15-admin-9' +- 'parent-group-15-member-0' +- 'parent-group-15-member-1' +- 'parent-group-15-member-2' +- 'parent-group-15-member-3' +- 'parent-group-15-member-4' +- 'parent-group-15-member-5' +- 'parent-group-15-member-6' +- 'parent-group-15-member-7' +- 'parent-group-15-member-8' +- 'parent-group-15-member-9' +- 'parent-group-16-admin-0' +- 'parent-group-16-admin-1' +- 'parent-group-16-admin-2' +- 'parent-group-16-admin-3' +- 'parent-group-16-admin-4' +- 'parent-group-16-admin-5' +- 'parent-group-16-admin-6' +- 'parent-group-16-admin-7' +- 'parent-group-16-admin-8' +- 'parent-group-16-admin-9' +- 'parent-group-16-member-0' +- 'parent-group-16-member-1' +- 'parent-group-16-member-2' +- 'parent-group-16-member-3' +- 'parent-group-16-member-4' +- 'parent-group-16-member-5' +- 'parent-group-16-member-6' +- 'parent-group-16-member-7' +- 'parent-group-16-member-8' +- 'parent-group-16-member-9' +- 'parent-group-17-admin-0' +- 'parent-group-17-admin-1' +- 'parent-group-17-admin-2' +- 'parent-group-17-admin-3' +- 'parent-group-17-admin-4' +- 'parent-group-17-admin-5' +- 'parent-group-17-admin-6' +- 'parent-group-17-admin-7' +- 'parent-group-17-admin-8' +- 'parent-group-17-admin-9' +- 'parent-group-17-member-0' +- 'parent-group-17-member-1' +- 'parent-group-17-member-2' +- 'parent-group-17-member-3' +- 'parent-group-17-member-4' +- 'parent-group-17-member-5' +- 'parent-group-17-member-6' +- 'parent-group-17-member-7' +- 'parent-group-17-member-8' +- 'parent-group-17-member-9' +- 'parent-group-18-admin-0' +- 'parent-group-18-admin-1' +- 'parent-group-18-admin-2' +- 'parent-group-18-admin-3' +- 'parent-group-18-admin-4' +- 'parent-group-18-admin-5' +- 'parent-group-18-admin-6' +- 'parent-group-18-admin-7' +- 'parent-group-18-admin-8' +- 'parent-group-18-admin-9' +- 'parent-group-18-member-0' +- 'parent-group-18-member-1' +- 'parent-group-18-member-2' +- 'parent-group-18-member-3' +- 'parent-group-18-member-4' +- 'parent-group-18-member-5' +- 'parent-group-18-member-6' +- 'parent-group-18-member-7' +- 'parent-group-18-member-8' +- 'parent-group-18-member-9' +- 'parent-group-19-admin-0' +- 'parent-group-19-admin-1' +- 'parent-group-19-admin-2' +- 'parent-group-19-admin-3' +- 'parent-group-19-admin-4' +- 'parent-group-19-admin-5' +- 'parent-group-19-admin-6' +- 'parent-group-19-admin-7' +- 'parent-group-19-admin-8' +- 'parent-group-19-admin-9' +- 'parent-group-19-member-0' +- 'parent-group-19-member-1' +- 'parent-group-19-member-2' +- 'parent-group-19-member-3' +- 'parent-group-19-member-4' +- 'parent-group-19-member-5' +- 'parent-group-19-member-6' +- 'parent-group-19-member-7' +- 'parent-group-19-member-8' +- 'parent-group-19-member-9' +- 'parent-group-2-admin-0' +- 'parent-group-2-admin-1' +- 'parent-group-2-admin-2' +- 'parent-group-2-admin-3' +- 'parent-group-2-admin-4' +- 'parent-group-2-admin-5' +- 'parent-group-2-admin-6' +- 'parent-group-2-admin-7' +- 'parent-group-2-admin-8' +- 'parent-group-2-admin-9' +- 'parent-group-2-member-0' +- 'parent-group-2-member-1' +- 'parent-group-2-member-2' +- 'parent-group-2-member-3' +- 'parent-group-2-member-4' +- 'parent-group-2-member-5' +- 'parent-group-2-member-6' +- 'parent-group-2-member-7' +- 'parent-group-2-member-8' +- 'parent-group-2-member-9' +- 'parent-group-20-admin-0' +- 'parent-group-20-admin-1' +- 'parent-group-20-admin-2' +- 'parent-group-20-admin-3' +- 'parent-group-20-admin-4' +- 'parent-group-20-admin-5' +- 'parent-group-20-admin-6' +- 'parent-group-20-admin-7' +- 'parent-group-20-admin-8' +- 'parent-group-20-admin-9' +- 'parent-group-20-member-0' +- 'parent-group-20-member-1' +- 'parent-group-20-member-2' +- 'parent-group-20-member-3' +- 'parent-group-20-member-4' +- 'parent-group-20-member-5' +- 'parent-group-20-member-6' +- 'parent-group-20-member-7' +- 'parent-group-20-member-8' +- 'parent-group-20-member-9' +- 'parent-group-21-admin-0' +- 'parent-group-21-admin-1' +- 'parent-group-21-admin-2' +- 'parent-group-21-admin-3' +- 'parent-group-21-admin-4' +- 'parent-group-21-admin-5' +- 'parent-group-21-admin-6' +- 'parent-group-21-admin-7' +- 'parent-group-21-admin-8' +- 'parent-group-21-admin-9' +- 'parent-group-21-member-0' +- 'parent-group-21-member-1' +- 'parent-group-21-member-2' +- 'parent-group-21-member-3' +- 'parent-group-21-member-4' +- 'parent-group-21-member-5' +- 'parent-group-21-member-6' +- 'parent-group-21-member-7' +- 'parent-group-21-member-8' +- 'parent-group-21-member-9' +- 'parent-group-22-admin-0' +- 'parent-group-22-admin-1' +- 'parent-group-22-admin-2' +- 'parent-group-22-admin-3' +- 'parent-group-22-admin-4' +- 'parent-group-22-admin-5' +- 'parent-group-22-admin-6' +- 'parent-group-22-admin-7' +- 'parent-group-22-admin-8' +- 'parent-group-22-admin-9' +- 'parent-group-22-member-0' +- 'parent-group-22-member-1' +- 'parent-group-22-member-2' +- 'parent-group-22-member-3' +- 'parent-group-22-member-4' +- 'parent-group-22-member-5' +- 'parent-group-22-member-6' +- 'parent-group-22-member-7' +- 'parent-group-22-member-8' +- 'parent-group-22-member-9' +- 'parent-group-23-admin-0' +- 'parent-group-23-admin-1' +- 'parent-group-23-admin-2' +- 'parent-group-23-admin-3' +- 'parent-group-23-admin-4' +- 'parent-group-23-admin-5' +- 'parent-group-23-admin-6' +- 'parent-group-23-admin-7' +- 'parent-group-23-admin-8' +- 'parent-group-23-admin-9' +- 'parent-group-23-member-0' +- 'parent-group-23-member-1' +- 'parent-group-23-member-2' +- 'parent-group-23-member-3' +- 'parent-group-23-member-4' +- 'parent-group-23-member-5' +- 'parent-group-23-member-6' +- 'parent-group-23-member-7' +- 'parent-group-23-member-8' +- 'parent-group-23-member-9' +- 'parent-group-24-admin-0' +- 'parent-group-24-admin-1' +- 'parent-group-24-admin-2' +- 'parent-group-24-admin-3' +- 'parent-group-24-admin-4' +- 'parent-group-24-admin-5' +- 'parent-group-24-admin-6' +- 'parent-group-24-admin-7' +- 'parent-group-24-admin-8' +- 'parent-group-24-admin-9' +- 'parent-group-24-member-0' +- 'parent-group-24-member-1' +- 'parent-group-24-member-2' +- 'parent-group-24-member-3' +- 'parent-group-24-member-4' +- 'parent-group-24-member-5' +- 'parent-group-24-member-6' +- 'parent-group-24-member-7' +- 'parent-group-24-member-8' +- 'parent-group-24-member-9' +- 'parent-group-25-admin-0' +- 'parent-group-25-admin-1' +- 'parent-group-25-admin-2' +- 'parent-group-25-admin-3' +- 'parent-group-25-admin-4' +- 'parent-group-25-admin-5' +- 'parent-group-25-admin-6' +- 'parent-group-25-admin-7' +- 'parent-group-25-admin-8' +- 'parent-group-25-admin-9' +- 'parent-group-25-member-0' +- 'parent-group-25-member-1' +- 'parent-group-25-member-2' +- 'parent-group-25-member-3' +- 'parent-group-25-member-4' +- 'parent-group-25-member-5' +- 'parent-group-25-member-6' +- 'parent-group-25-member-7' +- 'parent-group-25-member-8' +- 'parent-group-25-member-9' +- 'parent-group-26-admin-0' +- 'parent-group-26-admin-1' +- 'parent-group-26-admin-2' +- 'parent-group-26-admin-3' +- 'parent-group-26-admin-4' +- 'parent-group-26-admin-5' +- 'parent-group-26-admin-6' +- 'parent-group-26-admin-7' +- 'parent-group-26-admin-8' +- 'parent-group-26-admin-9' +- 'parent-group-26-member-0' +- 'parent-group-26-member-1' +- 'parent-group-26-member-2' +- 'parent-group-26-member-3' +- 'parent-group-26-member-4' +- 'parent-group-26-member-5' +- 'parent-group-26-member-6' +- 'parent-group-26-member-7' +- 'parent-group-26-member-8' +- 'parent-group-26-member-9' +- 'parent-group-27-admin-0' +- 'parent-group-27-admin-1' +- 'parent-group-27-admin-2' +- 'parent-group-27-admin-3' +- 'parent-group-27-admin-4' +- 'parent-group-27-admin-5' +- 'parent-group-27-admin-6' +- 'parent-group-27-admin-7' +- 'parent-group-27-admin-8' +- 'parent-group-27-admin-9' +- 'parent-group-27-member-0' +- 'parent-group-27-member-1' +- 'parent-group-27-member-2' +- 'parent-group-27-member-3' +- 'parent-group-27-member-4' +- 'parent-group-27-member-5' +- 'parent-group-27-member-6' +- 'parent-group-27-member-7' +- 'parent-group-27-member-8' +- 'parent-group-27-member-9' +- 'parent-group-28-admin-0' +- 'parent-group-28-admin-1' +- 'parent-group-28-admin-2' +- 'parent-group-28-admin-3' +- 'parent-group-28-admin-4' +- 'parent-group-28-admin-5' +- 'parent-group-28-admin-6' +- 'parent-group-28-admin-7' +- 'parent-group-28-admin-8' +- 'parent-group-28-admin-9' +- 'parent-group-28-member-0' +- 'parent-group-28-member-1' +- 'parent-group-28-member-2' +- 'parent-group-28-member-3' +- 'parent-group-28-member-4' +- 'parent-group-28-member-5' +- 'parent-group-28-member-6' +- 'parent-group-28-member-7' +- 'parent-group-28-member-8' +- 'parent-group-28-member-9' +- 'parent-group-29-admin-0' +- 'parent-group-29-admin-1' +- 'parent-group-29-admin-2' +- 'parent-group-29-admin-3' +- 'parent-group-29-admin-4' +- 'parent-group-29-admin-5' +- 'parent-group-29-admin-6' +- 'parent-group-29-admin-7' +- 'parent-group-29-admin-8' +- 'parent-group-29-admin-9' +- 'parent-group-29-member-0' +- 'parent-group-29-member-1' +- 'parent-group-29-member-2' +- 'parent-group-29-member-3' +- 'parent-group-29-member-4' +- 'parent-group-29-member-5' +- 'parent-group-29-member-6' +- 'parent-group-29-member-7' +- 'parent-group-29-member-8' +- 'parent-group-29-member-9' +- 'parent-group-3-admin-0' +- 'parent-group-3-admin-1' +- 'parent-group-3-admin-2' +- 'parent-group-3-admin-3' +- 'parent-group-3-admin-4' +- 'parent-group-3-admin-5' +- 'parent-group-3-admin-6' +- 'parent-group-3-admin-7' +- 'parent-group-3-admin-8' +- 'parent-group-3-admin-9' +- 'parent-group-3-member-0' +- 'parent-group-3-member-1' +- 'parent-group-3-member-2' +- 'parent-group-3-member-3' +- 'parent-group-3-member-4' +- 'parent-group-3-member-5' +- 'parent-group-3-member-6' +- 'parent-group-3-member-7' +- 'parent-group-3-member-8' +- 'parent-group-3-member-9' +- 'parent-group-30-admin-0' +- 'parent-group-30-admin-1' +- 'parent-group-30-admin-2' +- 'parent-group-30-admin-3' +- 'parent-group-30-admin-4' +- 'parent-group-30-admin-5' +- 'parent-group-30-admin-6' +- 'parent-group-30-admin-7' +- 'parent-group-30-admin-8' +- 'parent-group-30-admin-9' +- 'parent-group-30-member-0' +- 'parent-group-30-member-1' +- 'parent-group-30-member-2' +- 'parent-group-30-member-3' +- 'parent-group-30-member-4' +- 'parent-group-30-member-5' +- 'parent-group-30-member-6' +- 'parent-group-30-member-7' +- 'parent-group-30-member-8' +- 'parent-group-30-member-9' +- 'parent-group-31-admin-0' +- 'parent-group-31-admin-1' +- 'parent-group-31-admin-2' +- 'parent-group-31-admin-3' +- 'parent-group-31-admin-4' +- 'parent-group-31-admin-5' +- 'parent-group-31-admin-6' +- 'parent-group-31-admin-7' +- 'parent-group-31-admin-8' +- 'parent-group-31-admin-9' +- 'parent-group-31-member-0' +- 'parent-group-31-member-1' +- 'parent-group-31-member-2' +- 'parent-group-31-member-3' +- 'parent-group-31-member-4' +- 'parent-group-31-member-5' +- 'parent-group-31-member-6' +- 'parent-group-31-member-7' +- 'parent-group-31-member-8' +- 'parent-group-31-member-9' +- 'parent-group-32-admin-0' +- 'parent-group-32-admin-1' +- 'parent-group-32-admin-2' +- 'parent-group-32-admin-3' +- 'parent-group-32-admin-4' +- 'parent-group-32-admin-5' +- 'parent-group-32-admin-6' +- 'parent-group-32-admin-7' +- 'parent-group-32-admin-8' +- 'parent-group-32-admin-9' +- 'parent-group-32-member-0' +- 'parent-group-32-member-1' +- 'parent-group-32-member-2' +- 'parent-group-32-member-3' +- 'parent-group-32-member-4' +- 'parent-group-32-member-5' +- 'parent-group-32-member-6' +- 'parent-group-32-member-7' +- 'parent-group-32-member-8' +- 'parent-group-32-member-9' +- 'parent-group-33-admin-0' +- 'parent-group-33-admin-1' +- 'parent-group-33-admin-2' +- 'parent-group-33-admin-3' +- 'parent-group-33-admin-4' +- 'parent-group-33-admin-5' +- 'parent-group-33-admin-6' +- 'parent-group-33-admin-7' +- 'parent-group-33-admin-8' +- 'parent-group-33-admin-9' +- 'parent-group-33-member-0' +- 'parent-group-33-member-1' +- 'parent-group-33-member-2' +- 'parent-group-33-member-3' +- 'parent-group-33-member-4' +- 'parent-group-33-member-5' +- 'parent-group-33-member-6' +- 'parent-group-33-member-7' +- 'parent-group-33-member-8' +- 'parent-group-33-member-9' +- 'parent-group-34-admin-0' +- 'parent-group-34-admin-1' +- 'parent-group-34-admin-2' +- 'parent-group-34-admin-3' +- 'parent-group-34-admin-4' +- 'parent-group-34-admin-5' +- 'parent-group-34-admin-6' +- 'parent-group-34-admin-7' +- 'parent-group-34-admin-8' +- 'parent-group-34-admin-9' +- 'parent-group-34-member-0' +- 'parent-group-34-member-1' +- 'parent-group-34-member-2' +- 'parent-group-34-member-3' +- 'parent-group-34-member-4' +- 'parent-group-34-member-5' +- 'parent-group-34-member-6' +- 'parent-group-34-member-7' +- 'parent-group-34-member-8' +- 'parent-group-34-member-9' +- 'parent-group-35-admin-0' +- 'parent-group-35-admin-1' +- 'parent-group-35-admin-2' +- 'parent-group-35-admin-3' +- 'parent-group-35-admin-4' +- 'parent-group-35-admin-5' +- 'parent-group-35-admin-6' +- 'parent-group-35-admin-7' +- 'parent-group-35-admin-8' +- 'parent-group-35-admin-9' +- 'parent-group-35-member-0' +- 'parent-group-35-member-1' +- 'parent-group-35-member-2' +- 'parent-group-35-member-3' +- 'parent-group-35-member-4' +- 'parent-group-35-member-5' +- 'parent-group-35-member-6' +- 'parent-group-35-member-7' +- 'parent-group-35-member-8' +- 'parent-group-35-member-9' +- 'parent-group-36-admin-0' +- 'parent-group-36-admin-1' +- 'parent-group-36-admin-2' +- 'parent-group-36-admin-3' +- 'parent-group-36-admin-4' +- 'parent-group-36-admin-5' +- 'parent-group-36-admin-6' +- 'parent-group-36-admin-7' +- 'parent-group-36-admin-8' +- 'parent-group-36-admin-9' +- 'parent-group-36-member-0' +- 'parent-group-36-member-1' +- 'parent-group-36-member-2' +- 'parent-group-36-member-3' +- 'parent-group-36-member-4' +- 'parent-group-36-member-5' +- 'parent-group-36-member-6' +- 'parent-group-36-member-7' +- 'parent-group-36-member-8' +- 'parent-group-36-member-9' +- 'parent-group-37-admin-0' +- 'parent-group-37-admin-1' +- 'parent-group-37-admin-2' +- 'parent-group-37-admin-3' +- 'parent-group-37-admin-4' +- 'parent-group-37-admin-5' +- 'parent-group-37-admin-6' +- 'parent-group-37-admin-7' +- 'parent-group-37-admin-8' +- 'parent-group-37-admin-9' +- 'parent-group-37-member-0' +- 'parent-group-37-member-1' +- 'parent-group-37-member-2' +- 'parent-group-37-member-3' +- 'parent-group-37-member-4' +- 'parent-group-37-member-5' +- 'parent-group-37-member-6' +- 'parent-group-37-member-7' +- 'parent-group-37-member-8' +- 'parent-group-37-member-9' +- 'parent-group-38-admin-0' +- 'parent-group-38-admin-1' +- 'parent-group-38-admin-2' +- 'parent-group-38-admin-3' +- 'parent-group-38-admin-4' +- 'parent-group-38-admin-5' +- 'parent-group-38-admin-6' +- 'parent-group-38-admin-7' +- 'parent-group-38-admin-8' +- 'parent-group-38-admin-9' +- 'parent-group-38-member-0' +- 'parent-group-38-member-1' +- 'parent-group-38-member-2' +- 'parent-group-38-member-3' +- 'parent-group-38-member-4' +- 'parent-group-38-member-5' +- 'parent-group-38-member-6' +- 'parent-group-38-member-7' +- 'parent-group-38-member-8' +- 'parent-group-38-member-9' +- 'parent-group-39-admin-0' +- 'parent-group-39-admin-1' +- 'parent-group-39-admin-2' +- 'parent-group-39-admin-3' +- 'parent-group-39-admin-4' +- 'parent-group-39-admin-5' +- 'parent-group-39-admin-6' +- 'parent-group-39-admin-7' +- 'parent-group-39-admin-8' +- 'parent-group-39-admin-9' +- 'parent-group-39-member-0' +- 'parent-group-39-member-1' +- 'parent-group-39-member-2' +- 'parent-group-39-member-3' +- 'parent-group-39-member-4' +- 'parent-group-39-member-5' +- 'parent-group-39-member-6' +- 'parent-group-39-member-7' +- 'parent-group-39-member-8' +- 'parent-group-39-member-9' +- 'parent-group-4-admin-0' +- 'parent-group-4-admin-1' +- 'parent-group-4-admin-2' +- 'parent-group-4-admin-3' +- 'parent-group-4-admin-4' +- 'parent-group-4-admin-5' +- 'parent-group-4-admin-6' +- 'parent-group-4-admin-7' +- 'parent-group-4-admin-8' +- 'parent-group-4-admin-9' +- 'parent-group-4-member-0' +- 'parent-group-4-member-1' +- 'parent-group-4-member-2' +- 'parent-group-4-member-3' +- 'parent-group-4-member-4' +- 'parent-group-4-member-5' +- 'parent-group-4-member-6' +- 'parent-group-4-member-7' +- 'parent-group-4-member-8' +- 'parent-group-4-member-9' +- 'parent-group-40-admin-0' +- 'parent-group-40-admin-1' +- 'parent-group-40-admin-2' +- 'parent-group-40-admin-3' +- 'parent-group-40-admin-4' +- 'parent-group-40-admin-5' +- 'parent-group-40-admin-6' +- 'parent-group-40-admin-7' +- 'parent-group-40-admin-8' +- 'parent-group-40-admin-9' +- 'parent-group-40-member-0' +- 'parent-group-40-member-1' +- 'parent-group-40-member-2' +- 'parent-group-40-member-3' +- 'parent-group-40-member-4' +- 'parent-group-40-member-5' +- 'parent-group-40-member-6' +- 'parent-group-40-member-7' +- 'parent-group-40-member-8' +- 'parent-group-40-member-9' +- 'parent-group-41-admin-0' +- 'parent-group-41-admin-1' +- 'parent-group-41-admin-2' +- 'parent-group-41-admin-3' +- 'parent-group-41-admin-4' +- 'parent-group-41-admin-5' +- 'parent-group-41-admin-6' +- 'parent-group-41-admin-7' +- 'parent-group-41-admin-8' +- 'parent-group-41-admin-9' +- 'parent-group-41-member-0' +- 'parent-group-41-member-1' +- 'parent-group-41-member-2' +- 'parent-group-41-member-3' +- 'parent-group-41-member-4' +- 'parent-group-41-member-5' +- 'parent-group-41-member-6' +- 'parent-group-41-member-7' +- 'parent-group-41-member-8' +- 'parent-group-41-member-9' +- 'parent-group-42-admin-0' +- 'parent-group-42-admin-1' +- 'parent-group-42-admin-2' +- 'parent-group-42-admin-3' +- 'parent-group-42-admin-4' +- 'parent-group-42-admin-5' +- 'parent-group-42-admin-6' +- 'parent-group-42-admin-7' +- 'parent-group-42-admin-8' +- 'parent-group-42-admin-9' +- 'parent-group-42-member-0' +- 'parent-group-42-member-1' +- 'parent-group-42-member-2' +- 'parent-group-42-member-3' +- 'parent-group-42-member-4' +- 'parent-group-42-member-5' +- 'parent-group-42-member-6' +- 'parent-group-42-member-7' +- 'parent-group-42-member-8' +- 'parent-group-42-member-9' +- 'parent-group-43-admin-0' +- 'parent-group-43-admin-1' +- 'parent-group-43-admin-2' +- 'parent-group-43-admin-3' +- 'parent-group-43-admin-4' +- 'parent-group-43-admin-5' +- 'parent-group-43-admin-6' +- 'parent-group-43-admin-7' +- 'parent-group-43-admin-8' +- 'parent-group-43-admin-9' +- 'parent-group-43-member-0' +- 'parent-group-43-member-1' +- 'parent-group-43-member-2' +- 'parent-group-43-member-3' +- 'parent-group-43-member-4' +- 'parent-group-43-member-5' +- 'parent-group-43-member-6' +- 'parent-group-43-member-7' +- 'parent-group-43-member-8' +- 'parent-group-43-member-9' +- 'parent-group-44-admin-0' +- 'parent-group-44-admin-1' +- 'parent-group-44-admin-2' +- 'parent-group-44-admin-3' +- 'parent-group-44-admin-4' +- 'parent-group-44-admin-5' +- 'parent-group-44-admin-6' +- 'parent-group-44-admin-7' +- 'parent-group-44-admin-8' +- 'parent-group-44-admin-9' +- 'parent-group-44-member-0' +- 'parent-group-44-member-1' +- 'parent-group-44-member-2' +- 'parent-group-44-member-3' +- 'parent-group-44-member-4' +- 'parent-group-44-member-5' +- 'parent-group-44-member-6' +- 'parent-group-44-member-7' +- 'parent-group-44-member-8' +- 'parent-group-44-member-9' +- 'parent-group-45-admin-0' +- 'parent-group-45-admin-1' +- 'parent-group-45-admin-2' +- 'parent-group-45-admin-3' +- 'parent-group-45-admin-4' +- 'parent-group-45-admin-5' +- 'parent-group-45-admin-6' +- 'parent-group-45-admin-7' +- 'parent-group-45-admin-8' +- 'parent-group-45-admin-9' +- 'parent-group-45-member-0' +- 'parent-group-45-member-1' +- 'parent-group-45-member-2' +- 'parent-group-45-member-3' +- 'parent-group-45-member-4' +- 'parent-group-45-member-5' +- 'parent-group-45-member-6' +- 'parent-group-45-member-7' +- 'parent-group-45-member-8' +- 'parent-group-45-member-9' +- 'parent-group-46-admin-0' +- 'parent-group-46-admin-1' +- 'parent-group-46-admin-2' +- 'parent-group-46-admin-3' +- 'parent-group-46-admin-4' +- 'parent-group-46-admin-5' +- 'parent-group-46-admin-6' +- 'parent-group-46-admin-7' +- 'parent-group-46-admin-8' +- 'parent-group-46-admin-9' +- 'parent-group-46-member-0' +- 'parent-group-46-member-1' +- 'parent-group-46-member-2' +- 'parent-group-46-member-3' +- 'parent-group-46-member-4' +- 'parent-group-46-member-5' +- 'parent-group-46-member-6' +- 'parent-group-46-member-7' +- 'parent-group-46-member-8' +- 'parent-group-46-member-9' +- 'parent-group-47-admin-0' +- 'parent-group-47-admin-1' +- 'parent-group-47-admin-2' +- 'parent-group-47-admin-3' +- 'parent-group-47-admin-4' +- 'parent-group-47-admin-5' +- 'parent-group-47-admin-6' +- 'parent-group-47-admin-7' +- 'parent-group-47-admin-8' +- 'parent-group-47-admin-9' +- 'parent-group-47-member-0' +- 'parent-group-47-member-1' +- 'parent-group-47-member-2' +- 'parent-group-47-member-3' +- 'parent-group-47-member-4' +- 'parent-group-47-member-5' +- 'parent-group-47-member-6' +- 'parent-group-47-member-7' +- 'parent-group-47-member-8' +- 'parent-group-47-member-9' +- 'parent-group-48-admin-0' +- 'parent-group-48-admin-1' +- 'parent-group-48-admin-2' +- 'parent-group-48-admin-3' +- 'parent-group-48-admin-4' +- 'parent-group-48-admin-5' +- 'parent-group-48-admin-6' +- 'parent-group-48-admin-7' +- 'parent-group-48-admin-8' +- 'parent-group-48-admin-9' +- 'parent-group-48-member-0' +- 'parent-group-48-member-1' +- 'parent-group-48-member-2' +- 'parent-group-48-member-3' +- 'parent-group-48-member-4' +- 'parent-group-48-member-5' +- 'parent-group-48-member-6' +- 'parent-group-48-member-7' +- 'parent-group-48-member-8' +- 'parent-group-48-member-9' +- 'parent-group-49-admin-0' +- 'parent-group-49-admin-1' +- 'parent-group-49-admin-2' +- 'parent-group-49-admin-3' +- 'parent-group-49-admin-4' +- 'parent-group-49-admin-5' +- 'parent-group-49-admin-6' +- 'parent-group-49-admin-7' +- 'parent-group-49-admin-8' +- 'parent-group-49-admin-9' +- 'parent-group-49-member-0' +- 'parent-group-49-member-1' +- 'parent-group-49-member-2' +- 'parent-group-49-member-3' +- 'parent-group-49-member-4' +- 'parent-group-49-member-5' +- 'parent-group-49-member-6' +- 'parent-group-49-member-7' +- 'parent-group-49-member-8' +- 'parent-group-49-member-9' +- 'parent-group-5-admin-0' +- 'parent-group-5-admin-1' +- 'parent-group-5-admin-2' +- 'parent-group-5-admin-3' +- 'parent-group-5-admin-4' +- 'parent-group-5-admin-5' +- 'parent-group-5-admin-6' +- 'parent-group-5-admin-7' +- 'parent-group-5-admin-8' +- 'parent-group-5-admin-9' +- 'parent-group-5-member-0' +- 'parent-group-5-member-1' +- 'parent-group-5-member-2' +- 'parent-group-5-member-3' +- 'parent-group-5-member-4' +- 'parent-group-5-member-5' +- 'parent-group-5-member-6' +- 'parent-group-5-member-7' +- 'parent-group-5-member-8' +- 'parent-group-5-member-9' +- 'parent-group-6-admin-0' +- 'parent-group-6-admin-1' +- 'parent-group-6-admin-2' +- 'parent-group-6-admin-3' +- 'parent-group-6-admin-4' +- 'parent-group-6-admin-5' +- 'parent-group-6-admin-6' +- 'parent-group-6-admin-7' +- 'parent-group-6-admin-8' +- 'parent-group-6-admin-9' +- 'parent-group-6-member-0' +- 'parent-group-6-member-1' +- 'parent-group-6-member-2' +- 'parent-group-6-member-3' +- 'parent-group-6-member-4' +- 'parent-group-6-member-5' +- 'parent-group-6-member-6' +- 'parent-group-6-member-7' +- 'parent-group-6-member-8' +- 'parent-group-6-member-9' +- 'parent-group-7-admin-0' +- 'parent-group-7-admin-1' +- 'parent-group-7-admin-2' +- 'parent-group-7-admin-3' +- 'parent-group-7-admin-4' +- 'parent-group-7-admin-5' +- 'parent-group-7-admin-6' +- 'parent-group-7-admin-7' +- 'parent-group-7-admin-8' +- 'parent-group-7-admin-9' +- 'parent-group-7-member-0' +- 'parent-group-7-member-1' +- 'parent-group-7-member-2' +- 'parent-group-7-member-3' +- 'parent-group-7-member-4' +- 'parent-group-7-member-5' +- 'parent-group-7-member-6' +- 'parent-group-7-member-7' +- 'parent-group-7-member-8' +- 'parent-group-7-member-9' +- 'parent-group-8-admin-0' +- 'parent-group-8-admin-1' +- 'parent-group-8-admin-2' +- 'parent-group-8-admin-3' +- 'parent-group-8-admin-4' +- 'parent-group-8-admin-5' +- 'parent-group-8-admin-6' +- 'parent-group-8-admin-7' +- 'parent-group-8-admin-8' +- 'parent-group-8-admin-9' +- 'parent-group-8-member-0' +- 'parent-group-8-member-1' +- 'parent-group-8-member-2' +- 'parent-group-8-member-3' +- 'parent-group-8-member-4' +- 'parent-group-8-member-5' +- 'parent-group-8-member-6' +- 'parent-group-8-member-7' +- 'parent-group-8-member-8' +- 'parent-group-8-member-9' +- 'parent-group-9-admin-0' +- 'parent-group-9-admin-1' +- 'parent-group-9-admin-2' +- 'parent-group-9-admin-3' +- 'parent-group-9-admin-4' +- 'parent-group-9-admin-5' +- 'parent-group-9-admin-6' +- 'parent-group-9-admin-7' +- 'parent-group-9-admin-8' +- 'parent-group-9-admin-9' +- 'parent-group-9-member-0' +- 'parent-group-9-member-1' +- 'parent-group-9-member-2' +- 'parent-group-9-member-3' +- 'parent-group-9-member-4' +- 'parent-group-9-member-5' +- 'parent-group-9-member-6' +- 'parent-group-9-member-7' +- 'parent-group-9-member-8' +- 'parent-group-9-member-9' +- 'user-0' +- 'user-1' +- 'user-10' +- 'user-11' +- 'user-12' +- 'user-13' +- 'user-14' +- 'user-15' +- 'user-16' +- 'user-17' +- 'user-18' +- 'user-19' +- 'user-2' +- 'user-20' +- 'user-21' +- 'user-22' +- 'user-23' +- 'user-24' +- 'user-25' +- 'user-26' +- 'user-27' +- 'user-28' +- 'user-29' +- 'user-3' +- 'user-30' +- 'user-31' +- 'user-32' +- 'user-33' +- 'user-34' +- 'user-35' +- 'user-36' +- 'user-37' +- 'user-38' +- 'user-39' +- 'user-4' +- 'user-40' +- 'user-41' +- 'user-42' +- 'user-43' +- 'user-44' +- 'user-45' +- 'user-46' +- 'user-47' +- 'user-48' +- 'user-49' +- 'user-5' +- 'user-50' +- 'user-51' +- 'user-52' +- 'user-53' +- 'user-54' +- 'user-55' +- 'user-56' +- 'user-57' +- 'user-58' +- 'user-59' +- 'user-6' +- 'user-60' +- 'user-61' +- 'user-62' +- 'user-63' +- 'user-64' +- 'user-65' +- 'user-66' +- 'user-67' +- 'user-68' +- 'user-69' +- 'user-7' +- 'user-70' +- 'user-71' +- 'user-72' +- 'user-73' +- 'user-74' +- 'user-75' +- 'user-76' +- 'user-77' +- 'user-78' +- 'user-79' +- 'user-8' +- 'user-80' +- 'user-81' +- 'user-82' +- 'user-83' +- 'user-84' +- 'user-85' +- 'user-86' +- 'user-87' +- 'user-88' +- 'user-89' +- 'user-9' diff --git a/internal/services/steelthreadtesting/steelthread_test.go b/internal/services/steelthreadtesting/steelthread_test.go new file mode 100644 index 0000000000..55beb9747f --- /dev/null +++ b/internal/services/steelthreadtesting/steelthread_test.go @@ -0,0 +1,75 @@ +//go:build steelthread +// +build steelthread + +package steelthreadtesting + +import ( + "context" + "fmt" + "os" + "testing" + "time" + + yamlv3 "gopkg.in/yaml.v3" + + v1 "github.com/authzed/authzed-go/proto/authzed/api/v1" + "github.com/authzed/spicedb/internal/testserver" + "github.com/authzed/spicedb/pkg/datastore" + "github.com/authzed/spicedb/pkg/validationfile" + "github.com/dustin/go-humanize" + "github.com/gosimple/slug" + "github.com/stretchr/testify/require" +) + +const defaultConnBufferSize = humanize.MiByte + +func TestSteelThreads(t *testing.T) { + for _, tc := range steelThreadTestCases { + t.Run(tc.name, func(t *testing.T) { + req := require.New(t) + + ctx, cancel := context.WithTimeout(context.Background(), 60*time.Second) + defer cancel() + + clientConn, cleanup, _, _ := testserver.NewTestServer(req, 0, 0, false, func(ds datastore.Datastore, require *require.Assertions) (datastore.Datastore, datastore.Revision) { + // Load in the data. + _, rev, err := validationfile.PopulateFromFiles(ctx, ds, []string{"testdata/" + tc.datafile}) + require.NoError(err) + + return ds, rev + }) + + t.Cleanup(cleanup) + + psClient := v1.NewPermissionsServiceClient(clientConn) + for _, operationInfo := range tc.operations { + t.Run(operationInfo.name, func(t *testing.T) { + handler, ok := operations[operationInfo.operationName] + require.True(t, ok, "operation not found: %s", operationInfo.name) + + result, err := handler(operationInfo.arguments, psClient) + require.NoError(t, err) + + // Generate the actual results file. + actual, err := yamlv3.Marshal(result) + require.NoError(t, err) + + // Read in the expected results file. + resultsFileName := fmt.Sprintf("steelresults/%s-%s-results.yaml", slug.Make(tc.name), slug.Make(operationInfo.name)) + + if os.Getenv("REGENERATE_STEEL_RESULTS") == "true" { + err := os.WriteFile(resultsFileName, []byte("---\n"+string(actual)), 0o644) + require.NoError(t, err) + return + } + + expected, err := os.ReadFile(resultsFileName) + require.NoError(t, err) + + // Compare the actual and expected results. + require.Equal(t, string(expected), "---\n"+string(actual)) + }) + } + }) + } +} diff --git a/internal/services/steelthreadtesting/testdata/basic-document.yaml b/internal/services/steelthreadtesting/testdata/basic-document.yaml new file mode 100644 index 0000000000..3fd7ba6b1e --- /dev/null +++ b/internal/services/steelthreadtesting/testdata/basic-document.yaml @@ -0,0 +1,1794 @@ +--- +schema: |+ + definition user {} + + definition organization { + relation admin: user + relation member: user + permission is_member = member + admin + } + + definition group { + relation direct_member: user | group#member + relation admin: user + permission member = direct_member + admin + } + + definition document { + relation banned: user + relation viewer: user | user:* | group#member + relation org: organization + + permission edit = org->is_member + permission view = (viewer - banned) + edit + } + +relationships: | + // 100 direct users + // for userid in range(0, 100) + // document:somedoc#viewer@user:user-{userid} + document:somedoc#viewer@user:user-0 + document:somedoc#viewer@user:user-1 + document:somedoc#viewer@user:user-2 + document:somedoc#viewer@user:user-3 + document:somedoc#viewer@user:user-4 + document:somedoc#viewer@user:user-5 + document:somedoc#viewer@user:user-6 + document:somedoc#viewer@user:user-7 + document:somedoc#viewer@user:user-8 + document:somedoc#viewer@user:user-9 + document:somedoc#viewer@user:user-10 + document:somedoc#viewer@user:user-11 + document:somedoc#viewer@user:user-12 + document:somedoc#viewer@user:user-13 + document:somedoc#viewer@user:user-14 + document:somedoc#viewer@user:user-15 + document:somedoc#viewer@user:user-16 + document:somedoc#viewer@user:user-17 + document:somedoc#viewer@user:user-18 + document:somedoc#viewer@user:user-19 + document:somedoc#viewer@user:user-20 + document:somedoc#viewer@user:user-21 + document:somedoc#viewer@user:user-22 + document:somedoc#viewer@user:user-23 + document:somedoc#viewer@user:user-24 + document:somedoc#viewer@user:user-25 + document:somedoc#viewer@user:user-26 + document:somedoc#viewer@user:user-27 + document:somedoc#viewer@user:user-28 + document:somedoc#viewer@user:user-29 + document:somedoc#viewer@user:user-30 + document:somedoc#viewer@user:user-31 + document:somedoc#viewer@user:user-32 + document:somedoc#viewer@user:user-33 + document:somedoc#viewer@user:user-34 + document:somedoc#viewer@user:user-35 + document:somedoc#viewer@user:user-36 + document:somedoc#viewer@user:user-37 + document:somedoc#viewer@user:user-38 + document:somedoc#viewer@user:user-39 + document:somedoc#viewer@user:user-40 + document:somedoc#viewer@user:user-41 + document:somedoc#viewer@user:user-42 + document:somedoc#viewer@user:user-43 + document:somedoc#viewer@user:user-44 + document:somedoc#viewer@user:user-45 + document:somedoc#viewer@user:user-46 + document:somedoc#viewer@user:user-47 + document:somedoc#viewer@user:user-48 + document:somedoc#viewer@user:user-49 + document:somedoc#viewer@user:user-50 + document:somedoc#viewer@user:user-51 + document:somedoc#viewer@user:user-52 + document:somedoc#viewer@user:user-53 + document:somedoc#viewer@user:user-54 + document:somedoc#viewer@user:user-55 + document:somedoc#viewer@user:user-56 + document:somedoc#viewer@user:user-57 + document:somedoc#viewer@user:user-58 + document:somedoc#viewer@user:user-59 + document:somedoc#viewer@user:user-60 + document:somedoc#viewer@user:user-61 + document:somedoc#viewer@user:user-62 + document:somedoc#viewer@user:user-63 + document:somedoc#viewer@user:user-64 + document:somedoc#viewer@user:user-65 + document:somedoc#viewer@user:user-66 + document:somedoc#viewer@user:user-67 + document:somedoc#viewer@user:user-68 + document:somedoc#viewer@user:user-69 + document:somedoc#viewer@user:user-70 + document:somedoc#viewer@user:user-71 + document:somedoc#viewer@user:user-72 + document:somedoc#viewer@user:user-73 + document:somedoc#viewer@user:user-74 + document:somedoc#viewer@user:user-75 + document:somedoc#viewer@user:user-76 + document:somedoc#viewer@user:user-77 + document:somedoc#viewer@user:user-78 + document:somedoc#viewer@user:user-79 + document:somedoc#viewer@user:user-80 + document:somedoc#viewer@user:user-81 + document:somedoc#viewer@user:user-82 + document:somedoc#viewer@user:user-83 + document:somedoc#viewer@user:user-84 + document:somedoc#viewer@user:user-85 + document:somedoc#viewer@user:user-86 + document:somedoc#viewer@user:user-87 + document:somedoc#viewer@user:user-88 + document:somedoc#viewer@user:user-89 + document:somedoc#viewer@user:user-90 + document:somedoc#viewer@user:user-91 + document:somedoc#viewer@user:user-92 + document:somedoc#viewer@user:user-93 + document:somedoc#viewer@user:user-94 + document:somedoc#viewer@user:user-95 + document:somedoc#viewer@user:user-96 + document:somedoc#viewer@user:user-97 + document:somedoc#viewer@user:user-98 + document:somedoc#viewer@user:user-99 + + // Organizations + document:somedoc#org@organization:someorg + document:somedoc#org@organization:anotherorg + + organization:someorg#admin@user:admin-user-1 + organization:someorg#admin@user:admin-user-2 + organization:someorg#admin@user:admin-user-3 + organization:someorg#member@user:member-user-1 + organization:someorg#member@user:member-user-2 + organization:someorg#member@user:member-user-3 + + organization:anotherorg#admin@user:another-admin-user-1 + organization:anotherorg#admin@user:another-admin-user-2 + organization:anotherorg#admin@user:admin-user-2 + organization:anotherorg#member@user:another-member-user-1 + organization:anotherorg#member@user:another-member-user-2 + organization:anotherorg#member@user:member-user-2 + + // 50 groups for the document, each with 10 direct members and one indirect team, each with 10 admins and members. + // for groupid in range(0, 50): + // document:somedoc#viewer@group:group-{groupid}#member + // group:group-{groupid}#direct_member@group:parent-group-{groupid}#member + // for user in range(0, 10): + // group:group-{groupid}#direct_member@user:group-{groupid}-member-{userid} + // group:parent-group-{groupid}#admin@user:parent-group-{groupid}-admin-{userid} + // group:parent-group-{groupid}#direct_member@user:parent-group-{groupid}-member-{userid} + document:somedoc#viewer@group:group-0#member + group:group-0#direct_member@group:parent-group-0#member + group:group-0#direct_member@user:group-0-member-0 + group:parent-group-0#admin@user:parent-group-0-admin-0 + group:parent-group-0#direct_member@user:parent-group-0-member-0 + group:group-0#direct_member@user:group-0-member-1 + group:parent-group-0#admin@user:parent-group-0-admin-1 + group:parent-group-0#direct_member@user:parent-group-0-member-1 + group:group-0#direct_member@user:group-0-member-2 + group:parent-group-0#admin@user:parent-group-0-admin-2 + group:parent-group-0#direct_member@user:parent-group-0-member-2 + group:group-0#direct_member@user:group-0-member-3 + group:parent-group-0#admin@user:parent-group-0-admin-3 + group:parent-group-0#direct_member@user:parent-group-0-member-3 + group:group-0#direct_member@user:group-0-member-4 + group:parent-group-0#admin@user:parent-group-0-admin-4 + group:parent-group-0#direct_member@user:parent-group-0-member-4 + group:group-0#direct_member@user:group-0-member-5 + group:parent-group-0#admin@user:parent-group-0-admin-5 + group:parent-group-0#direct_member@user:parent-group-0-member-5 + group:group-0#direct_member@user:group-0-member-6 + group:parent-group-0#admin@user:parent-group-0-admin-6 + group:parent-group-0#direct_member@user:parent-group-0-member-6 + group:group-0#direct_member@user:group-0-member-7 + group:parent-group-0#admin@user:parent-group-0-admin-7 + group:parent-group-0#direct_member@user:parent-group-0-member-7 + group:group-0#direct_member@user:group-0-member-8 + group:parent-group-0#admin@user:parent-group-0-admin-8 + group:parent-group-0#direct_member@user:parent-group-0-member-8 + group:group-0#direct_member@user:group-0-member-9 + group:parent-group-0#admin@user:parent-group-0-admin-9 + group:parent-group-0#direct_member@user:parent-group-0-member-9 + document:somedoc#viewer@group:group-1#member + group:group-1#direct_member@group:parent-group-1#member + group:group-1#direct_member@user:group-1-member-0 + group:parent-group-1#admin@user:parent-group-1-admin-0 + group:parent-group-1#direct_member@user:parent-group-1-member-0 + group:group-1#direct_member@user:group-1-member-1 + group:parent-group-1#admin@user:parent-group-1-admin-1 + group:parent-group-1#direct_member@user:parent-group-1-member-1 + group:group-1#direct_member@user:group-1-member-2 + group:parent-group-1#admin@user:parent-group-1-admin-2 + group:parent-group-1#direct_member@user:parent-group-1-member-2 + group:group-1#direct_member@user:group-1-member-3 + group:parent-group-1#admin@user:parent-group-1-admin-3 + group:parent-group-1#direct_member@user:parent-group-1-member-3 + group:group-1#direct_member@user:group-1-member-4 + group:parent-group-1#admin@user:parent-group-1-admin-4 + group:parent-group-1#direct_member@user:parent-group-1-member-4 + group:group-1#direct_member@user:group-1-member-5 + group:parent-group-1#admin@user:parent-group-1-admin-5 + group:parent-group-1#direct_member@user:parent-group-1-member-5 + group:group-1#direct_member@user:group-1-member-6 + group:parent-group-1#admin@user:parent-group-1-admin-6 + group:parent-group-1#direct_member@user:parent-group-1-member-6 + group:group-1#direct_member@user:group-1-member-7 + group:parent-group-1#admin@user:parent-group-1-admin-7 + group:parent-group-1#direct_member@user:parent-group-1-member-7 + group:group-1#direct_member@user:group-1-member-8 + group:parent-group-1#admin@user:parent-group-1-admin-8 + group:parent-group-1#direct_member@user:parent-group-1-member-8 + group:group-1#direct_member@user:group-1-member-9 + group:parent-group-1#admin@user:parent-group-1-admin-9 + group:parent-group-1#direct_member@user:parent-group-1-member-9 + document:somedoc#viewer@group:group-2#member + group:group-2#direct_member@group:parent-group-2#member + group:group-2#direct_member@user:group-2-member-0 + group:parent-group-2#admin@user:parent-group-2-admin-0 + group:parent-group-2#direct_member@user:parent-group-2-member-0 + group:group-2#direct_member@user:group-2-member-1 + group:parent-group-2#admin@user:parent-group-2-admin-1 + group:parent-group-2#direct_member@user:parent-group-2-member-1 + group:group-2#direct_member@user:group-2-member-2 + group:parent-group-2#admin@user:parent-group-2-admin-2 + group:parent-group-2#direct_member@user:parent-group-2-member-2 + group:group-2#direct_member@user:group-2-member-3 + group:parent-group-2#admin@user:parent-group-2-admin-3 + group:parent-group-2#direct_member@user:parent-group-2-member-3 + group:group-2#direct_member@user:group-2-member-4 + group:parent-group-2#admin@user:parent-group-2-admin-4 + group:parent-group-2#direct_member@user:parent-group-2-member-4 + group:group-2#direct_member@user:group-2-member-5 + group:parent-group-2#admin@user:parent-group-2-admin-5 + group:parent-group-2#direct_member@user:parent-group-2-member-5 + group:group-2#direct_member@user:group-2-member-6 + group:parent-group-2#admin@user:parent-group-2-admin-6 + group:parent-group-2#direct_member@user:parent-group-2-member-6 + group:group-2#direct_member@user:group-2-member-7 + group:parent-group-2#admin@user:parent-group-2-admin-7 + group:parent-group-2#direct_member@user:parent-group-2-member-7 + group:group-2#direct_member@user:group-2-member-8 + group:parent-group-2#admin@user:parent-group-2-admin-8 + group:parent-group-2#direct_member@user:parent-group-2-member-8 + group:group-2#direct_member@user:group-2-member-9 + group:parent-group-2#admin@user:parent-group-2-admin-9 + group:parent-group-2#direct_member@user:parent-group-2-member-9 + document:somedoc#viewer@group:group-3#member + group:group-3#direct_member@group:parent-group-3#member + group:group-3#direct_member@user:group-3-member-0 + group:parent-group-3#admin@user:parent-group-3-admin-0 + group:parent-group-3#direct_member@user:parent-group-3-member-0 + group:group-3#direct_member@user:group-3-member-1 + group:parent-group-3#admin@user:parent-group-3-admin-1 + group:parent-group-3#direct_member@user:parent-group-3-member-1 + group:group-3#direct_member@user:group-3-member-2 + group:parent-group-3#admin@user:parent-group-3-admin-2 + group:parent-group-3#direct_member@user:parent-group-3-member-2 + group:group-3#direct_member@user:group-3-member-3 + group:parent-group-3#admin@user:parent-group-3-admin-3 + group:parent-group-3#direct_member@user:parent-group-3-member-3 + group:group-3#direct_member@user:group-3-member-4 + group:parent-group-3#admin@user:parent-group-3-admin-4 + group:parent-group-3#direct_member@user:parent-group-3-member-4 + group:group-3#direct_member@user:group-3-member-5 + group:parent-group-3#admin@user:parent-group-3-admin-5 + group:parent-group-3#direct_member@user:parent-group-3-member-5 + group:group-3#direct_member@user:group-3-member-6 + group:parent-group-3#admin@user:parent-group-3-admin-6 + group:parent-group-3#direct_member@user:parent-group-3-member-6 + group:group-3#direct_member@user:group-3-member-7 + group:parent-group-3#admin@user:parent-group-3-admin-7 + group:parent-group-3#direct_member@user:parent-group-3-member-7 + group:group-3#direct_member@user:group-3-member-8 + group:parent-group-3#admin@user:parent-group-3-admin-8 + group:parent-group-3#direct_member@user:parent-group-3-member-8 + group:group-3#direct_member@user:group-3-member-9 + group:parent-group-3#admin@user:parent-group-3-admin-9 + group:parent-group-3#direct_member@user:parent-group-3-member-9 + document:somedoc#viewer@group:group-4#member + group:group-4#direct_member@group:parent-group-4#member + group:group-4#direct_member@user:group-4-member-0 + group:parent-group-4#admin@user:parent-group-4-admin-0 + group:parent-group-4#direct_member@user:parent-group-4-member-0 + group:group-4#direct_member@user:group-4-member-1 + group:parent-group-4#admin@user:parent-group-4-admin-1 + group:parent-group-4#direct_member@user:parent-group-4-member-1 + group:group-4#direct_member@user:group-4-member-2 + group:parent-group-4#admin@user:parent-group-4-admin-2 + group:parent-group-4#direct_member@user:parent-group-4-member-2 + group:group-4#direct_member@user:group-4-member-3 + group:parent-group-4#admin@user:parent-group-4-admin-3 + group:parent-group-4#direct_member@user:parent-group-4-member-3 + group:group-4#direct_member@user:group-4-member-4 + group:parent-group-4#admin@user:parent-group-4-admin-4 + group:parent-group-4#direct_member@user:parent-group-4-member-4 + group:group-4#direct_member@user:group-4-member-5 + group:parent-group-4#admin@user:parent-group-4-admin-5 + group:parent-group-4#direct_member@user:parent-group-4-member-5 + group:group-4#direct_member@user:group-4-member-6 + group:parent-group-4#admin@user:parent-group-4-admin-6 + group:parent-group-4#direct_member@user:parent-group-4-member-6 + group:group-4#direct_member@user:group-4-member-7 + group:parent-group-4#admin@user:parent-group-4-admin-7 + group:parent-group-4#direct_member@user:parent-group-4-member-7 + group:group-4#direct_member@user:group-4-member-8 + group:parent-group-4#admin@user:parent-group-4-admin-8 + group:parent-group-4#direct_member@user:parent-group-4-member-8 + group:group-4#direct_member@user:group-4-member-9 + group:parent-group-4#admin@user:parent-group-4-admin-9 + group:parent-group-4#direct_member@user:parent-group-4-member-9 + document:somedoc#viewer@group:group-5#member + group:group-5#direct_member@group:parent-group-5#member + group:group-5#direct_member@user:group-5-member-0 + group:parent-group-5#admin@user:parent-group-5-admin-0 + group:parent-group-5#direct_member@user:parent-group-5-member-0 + group:group-5#direct_member@user:group-5-member-1 + group:parent-group-5#admin@user:parent-group-5-admin-1 + group:parent-group-5#direct_member@user:parent-group-5-member-1 + group:group-5#direct_member@user:group-5-member-2 + group:parent-group-5#admin@user:parent-group-5-admin-2 + group:parent-group-5#direct_member@user:parent-group-5-member-2 + group:group-5#direct_member@user:group-5-member-3 + group:parent-group-5#admin@user:parent-group-5-admin-3 + group:parent-group-5#direct_member@user:parent-group-5-member-3 + group:group-5#direct_member@user:group-5-member-4 + group:parent-group-5#admin@user:parent-group-5-admin-4 + group:parent-group-5#direct_member@user:parent-group-5-member-4 + group:group-5#direct_member@user:group-5-member-5 + group:parent-group-5#admin@user:parent-group-5-admin-5 + group:parent-group-5#direct_member@user:parent-group-5-member-5 + group:group-5#direct_member@user:group-5-member-6 + group:parent-group-5#admin@user:parent-group-5-admin-6 + group:parent-group-5#direct_member@user:parent-group-5-member-6 + group:group-5#direct_member@user:group-5-member-7 + group:parent-group-5#admin@user:parent-group-5-admin-7 + group:parent-group-5#direct_member@user:parent-group-5-member-7 + group:group-5#direct_member@user:group-5-member-8 + group:parent-group-5#admin@user:parent-group-5-admin-8 + group:parent-group-5#direct_member@user:parent-group-5-member-8 + group:group-5#direct_member@user:group-5-member-9 + group:parent-group-5#admin@user:parent-group-5-admin-9 + group:parent-group-5#direct_member@user:parent-group-5-member-9 + document:somedoc#viewer@group:group-6#member + group:group-6#direct_member@group:parent-group-6#member + group:group-6#direct_member@user:group-6-member-0 + group:parent-group-6#admin@user:parent-group-6-admin-0 + group:parent-group-6#direct_member@user:parent-group-6-member-0 + group:group-6#direct_member@user:group-6-member-1 + group:parent-group-6#admin@user:parent-group-6-admin-1 + group:parent-group-6#direct_member@user:parent-group-6-member-1 + group:group-6#direct_member@user:group-6-member-2 + group:parent-group-6#admin@user:parent-group-6-admin-2 + group:parent-group-6#direct_member@user:parent-group-6-member-2 + group:group-6#direct_member@user:group-6-member-3 + group:parent-group-6#admin@user:parent-group-6-admin-3 + group:parent-group-6#direct_member@user:parent-group-6-member-3 + group:group-6#direct_member@user:group-6-member-4 + group:parent-group-6#admin@user:parent-group-6-admin-4 + group:parent-group-6#direct_member@user:parent-group-6-member-4 + group:group-6#direct_member@user:group-6-member-5 + group:parent-group-6#admin@user:parent-group-6-admin-5 + group:parent-group-6#direct_member@user:parent-group-6-member-5 + group:group-6#direct_member@user:group-6-member-6 + group:parent-group-6#admin@user:parent-group-6-admin-6 + group:parent-group-6#direct_member@user:parent-group-6-member-6 + group:group-6#direct_member@user:group-6-member-7 + group:parent-group-6#admin@user:parent-group-6-admin-7 + group:parent-group-6#direct_member@user:parent-group-6-member-7 + group:group-6#direct_member@user:group-6-member-8 + group:parent-group-6#admin@user:parent-group-6-admin-8 + group:parent-group-6#direct_member@user:parent-group-6-member-8 + group:group-6#direct_member@user:group-6-member-9 + group:parent-group-6#admin@user:parent-group-6-admin-9 + group:parent-group-6#direct_member@user:parent-group-6-member-9 + document:somedoc#viewer@group:group-7#member + group:group-7#direct_member@group:parent-group-7#member + group:group-7#direct_member@user:group-7-member-0 + group:parent-group-7#admin@user:parent-group-7-admin-0 + group:parent-group-7#direct_member@user:parent-group-7-member-0 + group:group-7#direct_member@user:group-7-member-1 + group:parent-group-7#admin@user:parent-group-7-admin-1 + group:parent-group-7#direct_member@user:parent-group-7-member-1 + group:group-7#direct_member@user:group-7-member-2 + group:parent-group-7#admin@user:parent-group-7-admin-2 + group:parent-group-7#direct_member@user:parent-group-7-member-2 + group:group-7#direct_member@user:group-7-member-3 + group:parent-group-7#admin@user:parent-group-7-admin-3 + group:parent-group-7#direct_member@user:parent-group-7-member-3 + group:group-7#direct_member@user:group-7-member-4 + group:parent-group-7#admin@user:parent-group-7-admin-4 + group:parent-group-7#direct_member@user:parent-group-7-member-4 + group:group-7#direct_member@user:group-7-member-5 + group:parent-group-7#admin@user:parent-group-7-admin-5 + group:parent-group-7#direct_member@user:parent-group-7-member-5 + group:group-7#direct_member@user:group-7-member-6 + group:parent-group-7#admin@user:parent-group-7-admin-6 + group:parent-group-7#direct_member@user:parent-group-7-member-6 + group:group-7#direct_member@user:group-7-member-7 + group:parent-group-7#admin@user:parent-group-7-admin-7 + group:parent-group-7#direct_member@user:parent-group-7-member-7 + group:group-7#direct_member@user:group-7-member-8 + group:parent-group-7#admin@user:parent-group-7-admin-8 + group:parent-group-7#direct_member@user:parent-group-7-member-8 + group:group-7#direct_member@user:group-7-member-9 + group:parent-group-7#admin@user:parent-group-7-admin-9 + group:parent-group-7#direct_member@user:parent-group-7-member-9 + document:somedoc#viewer@group:group-8#member + group:group-8#direct_member@group:parent-group-8#member + group:group-8#direct_member@user:group-8-member-0 + group:parent-group-8#admin@user:parent-group-8-admin-0 + group:parent-group-8#direct_member@user:parent-group-8-member-0 + group:group-8#direct_member@user:group-8-member-1 + group:parent-group-8#admin@user:parent-group-8-admin-1 + group:parent-group-8#direct_member@user:parent-group-8-member-1 + group:group-8#direct_member@user:group-8-member-2 + group:parent-group-8#admin@user:parent-group-8-admin-2 + group:parent-group-8#direct_member@user:parent-group-8-member-2 + group:group-8#direct_member@user:group-8-member-3 + group:parent-group-8#admin@user:parent-group-8-admin-3 + group:parent-group-8#direct_member@user:parent-group-8-member-3 + group:group-8#direct_member@user:group-8-member-4 + group:parent-group-8#admin@user:parent-group-8-admin-4 + group:parent-group-8#direct_member@user:parent-group-8-member-4 + group:group-8#direct_member@user:group-8-member-5 + group:parent-group-8#admin@user:parent-group-8-admin-5 + group:parent-group-8#direct_member@user:parent-group-8-member-5 + group:group-8#direct_member@user:group-8-member-6 + group:parent-group-8#admin@user:parent-group-8-admin-6 + group:parent-group-8#direct_member@user:parent-group-8-member-6 + group:group-8#direct_member@user:group-8-member-7 + group:parent-group-8#admin@user:parent-group-8-admin-7 + group:parent-group-8#direct_member@user:parent-group-8-member-7 + group:group-8#direct_member@user:group-8-member-8 + group:parent-group-8#admin@user:parent-group-8-admin-8 + group:parent-group-8#direct_member@user:parent-group-8-member-8 + group:group-8#direct_member@user:group-8-member-9 + group:parent-group-8#admin@user:parent-group-8-admin-9 + group:parent-group-8#direct_member@user:parent-group-8-member-9 + document:somedoc#viewer@group:group-9#member + group:group-9#direct_member@group:parent-group-9#member + group:group-9#direct_member@user:group-9-member-0 + group:parent-group-9#admin@user:parent-group-9-admin-0 + group:parent-group-9#direct_member@user:parent-group-9-member-0 + group:group-9#direct_member@user:group-9-member-1 + group:parent-group-9#admin@user:parent-group-9-admin-1 + group:parent-group-9#direct_member@user:parent-group-9-member-1 + group:group-9#direct_member@user:group-9-member-2 + group:parent-group-9#admin@user:parent-group-9-admin-2 + group:parent-group-9#direct_member@user:parent-group-9-member-2 + group:group-9#direct_member@user:group-9-member-3 + group:parent-group-9#admin@user:parent-group-9-admin-3 + group:parent-group-9#direct_member@user:parent-group-9-member-3 + group:group-9#direct_member@user:group-9-member-4 + group:parent-group-9#admin@user:parent-group-9-admin-4 + group:parent-group-9#direct_member@user:parent-group-9-member-4 + group:group-9#direct_member@user:group-9-member-5 + group:parent-group-9#admin@user:parent-group-9-admin-5 + group:parent-group-9#direct_member@user:parent-group-9-member-5 + group:group-9#direct_member@user:group-9-member-6 + group:parent-group-9#admin@user:parent-group-9-admin-6 + group:parent-group-9#direct_member@user:parent-group-9-member-6 + group:group-9#direct_member@user:group-9-member-7 + group:parent-group-9#admin@user:parent-group-9-admin-7 + group:parent-group-9#direct_member@user:parent-group-9-member-7 + group:group-9#direct_member@user:group-9-member-8 + group:parent-group-9#admin@user:parent-group-9-admin-8 + group:parent-group-9#direct_member@user:parent-group-9-member-8 + group:group-9#direct_member@user:group-9-member-9 + group:parent-group-9#admin@user:parent-group-9-admin-9 + group:parent-group-9#direct_member@user:parent-group-9-member-9 + document:somedoc#viewer@group:group-10#member + group:group-10#direct_member@group:parent-group-10#member + group:group-10#direct_member@user:group-10-member-0 + group:parent-group-10#admin@user:parent-group-10-admin-0 + group:parent-group-10#direct_member@user:parent-group-10-member-0 + group:group-10#direct_member@user:group-10-member-1 + group:parent-group-10#admin@user:parent-group-10-admin-1 + group:parent-group-10#direct_member@user:parent-group-10-member-1 + group:group-10#direct_member@user:group-10-member-2 + group:parent-group-10#admin@user:parent-group-10-admin-2 + group:parent-group-10#direct_member@user:parent-group-10-member-2 + group:group-10#direct_member@user:group-10-member-3 + group:parent-group-10#admin@user:parent-group-10-admin-3 + group:parent-group-10#direct_member@user:parent-group-10-member-3 + group:group-10#direct_member@user:group-10-member-4 + group:parent-group-10#admin@user:parent-group-10-admin-4 + group:parent-group-10#direct_member@user:parent-group-10-member-4 + group:group-10#direct_member@user:group-10-member-5 + group:parent-group-10#admin@user:parent-group-10-admin-5 + group:parent-group-10#direct_member@user:parent-group-10-member-5 + group:group-10#direct_member@user:group-10-member-6 + group:parent-group-10#admin@user:parent-group-10-admin-6 + group:parent-group-10#direct_member@user:parent-group-10-member-6 + group:group-10#direct_member@user:group-10-member-7 + group:parent-group-10#admin@user:parent-group-10-admin-7 + group:parent-group-10#direct_member@user:parent-group-10-member-7 + group:group-10#direct_member@user:group-10-member-8 + group:parent-group-10#admin@user:parent-group-10-admin-8 + group:parent-group-10#direct_member@user:parent-group-10-member-8 + group:group-10#direct_member@user:group-10-member-9 + group:parent-group-10#admin@user:parent-group-10-admin-9 + group:parent-group-10#direct_member@user:parent-group-10-member-9 + document:somedoc#viewer@group:group-11#member + group:group-11#direct_member@group:parent-group-11#member + group:group-11#direct_member@user:group-11-member-0 + group:parent-group-11#admin@user:parent-group-11-admin-0 + group:parent-group-11#direct_member@user:parent-group-11-member-0 + group:group-11#direct_member@user:group-11-member-1 + group:parent-group-11#admin@user:parent-group-11-admin-1 + group:parent-group-11#direct_member@user:parent-group-11-member-1 + group:group-11#direct_member@user:group-11-member-2 + group:parent-group-11#admin@user:parent-group-11-admin-2 + group:parent-group-11#direct_member@user:parent-group-11-member-2 + group:group-11#direct_member@user:group-11-member-3 + group:parent-group-11#admin@user:parent-group-11-admin-3 + group:parent-group-11#direct_member@user:parent-group-11-member-3 + group:group-11#direct_member@user:group-11-member-4 + group:parent-group-11#admin@user:parent-group-11-admin-4 + group:parent-group-11#direct_member@user:parent-group-11-member-4 + group:group-11#direct_member@user:group-11-member-5 + group:parent-group-11#admin@user:parent-group-11-admin-5 + group:parent-group-11#direct_member@user:parent-group-11-member-5 + group:group-11#direct_member@user:group-11-member-6 + group:parent-group-11#admin@user:parent-group-11-admin-6 + group:parent-group-11#direct_member@user:parent-group-11-member-6 + group:group-11#direct_member@user:group-11-member-7 + group:parent-group-11#admin@user:parent-group-11-admin-7 + group:parent-group-11#direct_member@user:parent-group-11-member-7 + group:group-11#direct_member@user:group-11-member-8 + group:parent-group-11#admin@user:parent-group-11-admin-8 + group:parent-group-11#direct_member@user:parent-group-11-member-8 + group:group-11#direct_member@user:group-11-member-9 + group:parent-group-11#admin@user:parent-group-11-admin-9 + group:parent-group-11#direct_member@user:parent-group-11-member-9 + document:somedoc#viewer@group:group-12#member + group:group-12#direct_member@group:parent-group-12#member + group:group-12#direct_member@user:group-12-member-0 + group:parent-group-12#admin@user:parent-group-12-admin-0 + group:parent-group-12#direct_member@user:parent-group-12-member-0 + group:group-12#direct_member@user:group-12-member-1 + group:parent-group-12#admin@user:parent-group-12-admin-1 + group:parent-group-12#direct_member@user:parent-group-12-member-1 + group:group-12#direct_member@user:group-12-member-2 + group:parent-group-12#admin@user:parent-group-12-admin-2 + group:parent-group-12#direct_member@user:parent-group-12-member-2 + group:group-12#direct_member@user:group-12-member-3 + group:parent-group-12#admin@user:parent-group-12-admin-3 + group:parent-group-12#direct_member@user:parent-group-12-member-3 + group:group-12#direct_member@user:group-12-member-4 + group:parent-group-12#admin@user:parent-group-12-admin-4 + group:parent-group-12#direct_member@user:parent-group-12-member-4 + group:group-12#direct_member@user:group-12-member-5 + group:parent-group-12#admin@user:parent-group-12-admin-5 + group:parent-group-12#direct_member@user:parent-group-12-member-5 + group:group-12#direct_member@user:group-12-member-6 + group:parent-group-12#admin@user:parent-group-12-admin-6 + group:parent-group-12#direct_member@user:parent-group-12-member-6 + group:group-12#direct_member@user:group-12-member-7 + group:parent-group-12#admin@user:parent-group-12-admin-7 + group:parent-group-12#direct_member@user:parent-group-12-member-7 + group:group-12#direct_member@user:group-12-member-8 + group:parent-group-12#admin@user:parent-group-12-admin-8 + group:parent-group-12#direct_member@user:parent-group-12-member-8 + group:group-12#direct_member@user:group-12-member-9 + group:parent-group-12#admin@user:parent-group-12-admin-9 + group:parent-group-12#direct_member@user:parent-group-12-member-9 + document:somedoc#viewer@group:group-13#member + group:group-13#direct_member@group:parent-group-13#member + group:group-13#direct_member@user:group-13-member-0 + group:parent-group-13#admin@user:parent-group-13-admin-0 + group:parent-group-13#direct_member@user:parent-group-13-member-0 + group:group-13#direct_member@user:group-13-member-1 + group:parent-group-13#admin@user:parent-group-13-admin-1 + group:parent-group-13#direct_member@user:parent-group-13-member-1 + group:group-13#direct_member@user:group-13-member-2 + group:parent-group-13#admin@user:parent-group-13-admin-2 + group:parent-group-13#direct_member@user:parent-group-13-member-2 + group:group-13#direct_member@user:group-13-member-3 + group:parent-group-13#admin@user:parent-group-13-admin-3 + group:parent-group-13#direct_member@user:parent-group-13-member-3 + group:group-13#direct_member@user:group-13-member-4 + group:parent-group-13#admin@user:parent-group-13-admin-4 + group:parent-group-13#direct_member@user:parent-group-13-member-4 + group:group-13#direct_member@user:group-13-member-5 + group:parent-group-13#admin@user:parent-group-13-admin-5 + group:parent-group-13#direct_member@user:parent-group-13-member-5 + group:group-13#direct_member@user:group-13-member-6 + group:parent-group-13#admin@user:parent-group-13-admin-6 + group:parent-group-13#direct_member@user:parent-group-13-member-6 + group:group-13#direct_member@user:group-13-member-7 + group:parent-group-13#admin@user:parent-group-13-admin-7 + group:parent-group-13#direct_member@user:parent-group-13-member-7 + group:group-13#direct_member@user:group-13-member-8 + group:parent-group-13#admin@user:parent-group-13-admin-8 + group:parent-group-13#direct_member@user:parent-group-13-member-8 + group:group-13#direct_member@user:group-13-member-9 + group:parent-group-13#admin@user:parent-group-13-admin-9 + group:parent-group-13#direct_member@user:parent-group-13-member-9 + document:somedoc#viewer@group:group-14#member + group:group-14#direct_member@group:parent-group-14#member + group:group-14#direct_member@user:group-14-member-0 + group:parent-group-14#admin@user:parent-group-14-admin-0 + group:parent-group-14#direct_member@user:parent-group-14-member-0 + group:group-14#direct_member@user:group-14-member-1 + group:parent-group-14#admin@user:parent-group-14-admin-1 + group:parent-group-14#direct_member@user:parent-group-14-member-1 + group:group-14#direct_member@user:group-14-member-2 + group:parent-group-14#admin@user:parent-group-14-admin-2 + group:parent-group-14#direct_member@user:parent-group-14-member-2 + group:group-14#direct_member@user:group-14-member-3 + group:parent-group-14#admin@user:parent-group-14-admin-3 + group:parent-group-14#direct_member@user:parent-group-14-member-3 + group:group-14#direct_member@user:group-14-member-4 + group:parent-group-14#admin@user:parent-group-14-admin-4 + group:parent-group-14#direct_member@user:parent-group-14-member-4 + group:group-14#direct_member@user:group-14-member-5 + group:parent-group-14#admin@user:parent-group-14-admin-5 + group:parent-group-14#direct_member@user:parent-group-14-member-5 + group:group-14#direct_member@user:group-14-member-6 + group:parent-group-14#admin@user:parent-group-14-admin-6 + group:parent-group-14#direct_member@user:parent-group-14-member-6 + group:group-14#direct_member@user:group-14-member-7 + group:parent-group-14#admin@user:parent-group-14-admin-7 + group:parent-group-14#direct_member@user:parent-group-14-member-7 + group:group-14#direct_member@user:group-14-member-8 + group:parent-group-14#admin@user:parent-group-14-admin-8 + group:parent-group-14#direct_member@user:parent-group-14-member-8 + group:group-14#direct_member@user:group-14-member-9 + group:parent-group-14#admin@user:parent-group-14-admin-9 + group:parent-group-14#direct_member@user:parent-group-14-member-9 + document:somedoc#viewer@group:group-15#member + group:group-15#direct_member@group:parent-group-15#member + group:group-15#direct_member@user:group-15-member-0 + group:parent-group-15#admin@user:parent-group-15-admin-0 + group:parent-group-15#direct_member@user:parent-group-15-member-0 + group:group-15#direct_member@user:group-15-member-1 + group:parent-group-15#admin@user:parent-group-15-admin-1 + group:parent-group-15#direct_member@user:parent-group-15-member-1 + group:group-15#direct_member@user:group-15-member-2 + group:parent-group-15#admin@user:parent-group-15-admin-2 + group:parent-group-15#direct_member@user:parent-group-15-member-2 + group:group-15#direct_member@user:group-15-member-3 + group:parent-group-15#admin@user:parent-group-15-admin-3 + group:parent-group-15#direct_member@user:parent-group-15-member-3 + group:group-15#direct_member@user:group-15-member-4 + group:parent-group-15#admin@user:parent-group-15-admin-4 + group:parent-group-15#direct_member@user:parent-group-15-member-4 + group:group-15#direct_member@user:group-15-member-5 + group:parent-group-15#admin@user:parent-group-15-admin-5 + group:parent-group-15#direct_member@user:parent-group-15-member-5 + group:group-15#direct_member@user:group-15-member-6 + group:parent-group-15#admin@user:parent-group-15-admin-6 + group:parent-group-15#direct_member@user:parent-group-15-member-6 + group:group-15#direct_member@user:group-15-member-7 + group:parent-group-15#admin@user:parent-group-15-admin-7 + group:parent-group-15#direct_member@user:parent-group-15-member-7 + group:group-15#direct_member@user:group-15-member-8 + group:parent-group-15#admin@user:parent-group-15-admin-8 + group:parent-group-15#direct_member@user:parent-group-15-member-8 + group:group-15#direct_member@user:group-15-member-9 + group:parent-group-15#admin@user:parent-group-15-admin-9 + group:parent-group-15#direct_member@user:parent-group-15-member-9 + document:somedoc#viewer@group:group-16#member + group:group-16#direct_member@group:parent-group-16#member + group:group-16#direct_member@user:group-16-member-0 + group:parent-group-16#admin@user:parent-group-16-admin-0 + group:parent-group-16#direct_member@user:parent-group-16-member-0 + group:group-16#direct_member@user:group-16-member-1 + group:parent-group-16#admin@user:parent-group-16-admin-1 + group:parent-group-16#direct_member@user:parent-group-16-member-1 + group:group-16#direct_member@user:group-16-member-2 + group:parent-group-16#admin@user:parent-group-16-admin-2 + group:parent-group-16#direct_member@user:parent-group-16-member-2 + group:group-16#direct_member@user:group-16-member-3 + group:parent-group-16#admin@user:parent-group-16-admin-3 + group:parent-group-16#direct_member@user:parent-group-16-member-3 + group:group-16#direct_member@user:group-16-member-4 + group:parent-group-16#admin@user:parent-group-16-admin-4 + group:parent-group-16#direct_member@user:parent-group-16-member-4 + group:group-16#direct_member@user:group-16-member-5 + group:parent-group-16#admin@user:parent-group-16-admin-5 + group:parent-group-16#direct_member@user:parent-group-16-member-5 + group:group-16#direct_member@user:group-16-member-6 + group:parent-group-16#admin@user:parent-group-16-admin-6 + group:parent-group-16#direct_member@user:parent-group-16-member-6 + group:group-16#direct_member@user:group-16-member-7 + group:parent-group-16#admin@user:parent-group-16-admin-7 + group:parent-group-16#direct_member@user:parent-group-16-member-7 + group:group-16#direct_member@user:group-16-member-8 + group:parent-group-16#admin@user:parent-group-16-admin-8 + group:parent-group-16#direct_member@user:parent-group-16-member-8 + group:group-16#direct_member@user:group-16-member-9 + group:parent-group-16#admin@user:parent-group-16-admin-9 + group:parent-group-16#direct_member@user:parent-group-16-member-9 + document:somedoc#viewer@group:group-17#member + group:group-17#direct_member@group:parent-group-17#member + group:group-17#direct_member@user:group-17-member-0 + group:parent-group-17#admin@user:parent-group-17-admin-0 + group:parent-group-17#direct_member@user:parent-group-17-member-0 + group:group-17#direct_member@user:group-17-member-1 + group:parent-group-17#admin@user:parent-group-17-admin-1 + group:parent-group-17#direct_member@user:parent-group-17-member-1 + group:group-17#direct_member@user:group-17-member-2 + group:parent-group-17#admin@user:parent-group-17-admin-2 + group:parent-group-17#direct_member@user:parent-group-17-member-2 + group:group-17#direct_member@user:group-17-member-3 + group:parent-group-17#admin@user:parent-group-17-admin-3 + group:parent-group-17#direct_member@user:parent-group-17-member-3 + group:group-17#direct_member@user:group-17-member-4 + group:parent-group-17#admin@user:parent-group-17-admin-4 + group:parent-group-17#direct_member@user:parent-group-17-member-4 + group:group-17#direct_member@user:group-17-member-5 + group:parent-group-17#admin@user:parent-group-17-admin-5 + group:parent-group-17#direct_member@user:parent-group-17-member-5 + group:group-17#direct_member@user:group-17-member-6 + group:parent-group-17#admin@user:parent-group-17-admin-6 + group:parent-group-17#direct_member@user:parent-group-17-member-6 + group:group-17#direct_member@user:group-17-member-7 + group:parent-group-17#admin@user:parent-group-17-admin-7 + group:parent-group-17#direct_member@user:parent-group-17-member-7 + group:group-17#direct_member@user:group-17-member-8 + group:parent-group-17#admin@user:parent-group-17-admin-8 + group:parent-group-17#direct_member@user:parent-group-17-member-8 + group:group-17#direct_member@user:group-17-member-9 + group:parent-group-17#admin@user:parent-group-17-admin-9 + group:parent-group-17#direct_member@user:parent-group-17-member-9 + document:somedoc#viewer@group:group-18#member + group:group-18#direct_member@group:parent-group-18#member + group:group-18#direct_member@user:group-18-member-0 + group:parent-group-18#admin@user:parent-group-18-admin-0 + group:parent-group-18#direct_member@user:parent-group-18-member-0 + group:group-18#direct_member@user:group-18-member-1 + group:parent-group-18#admin@user:parent-group-18-admin-1 + group:parent-group-18#direct_member@user:parent-group-18-member-1 + group:group-18#direct_member@user:group-18-member-2 + group:parent-group-18#admin@user:parent-group-18-admin-2 + group:parent-group-18#direct_member@user:parent-group-18-member-2 + group:group-18#direct_member@user:group-18-member-3 + group:parent-group-18#admin@user:parent-group-18-admin-3 + group:parent-group-18#direct_member@user:parent-group-18-member-3 + group:group-18#direct_member@user:group-18-member-4 + group:parent-group-18#admin@user:parent-group-18-admin-4 + group:parent-group-18#direct_member@user:parent-group-18-member-4 + group:group-18#direct_member@user:group-18-member-5 + group:parent-group-18#admin@user:parent-group-18-admin-5 + group:parent-group-18#direct_member@user:parent-group-18-member-5 + group:group-18#direct_member@user:group-18-member-6 + group:parent-group-18#admin@user:parent-group-18-admin-6 + group:parent-group-18#direct_member@user:parent-group-18-member-6 + group:group-18#direct_member@user:group-18-member-7 + group:parent-group-18#admin@user:parent-group-18-admin-7 + group:parent-group-18#direct_member@user:parent-group-18-member-7 + group:group-18#direct_member@user:group-18-member-8 + group:parent-group-18#admin@user:parent-group-18-admin-8 + group:parent-group-18#direct_member@user:parent-group-18-member-8 + group:group-18#direct_member@user:group-18-member-9 + group:parent-group-18#admin@user:parent-group-18-admin-9 + group:parent-group-18#direct_member@user:parent-group-18-member-9 + document:somedoc#viewer@group:group-19#member + group:group-19#direct_member@group:parent-group-19#member + group:group-19#direct_member@user:group-19-member-0 + group:parent-group-19#admin@user:parent-group-19-admin-0 + group:parent-group-19#direct_member@user:parent-group-19-member-0 + group:group-19#direct_member@user:group-19-member-1 + group:parent-group-19#admin@user:parent-group-19-admin-1 + group:parent-group-19#direct_member@user:parent-group-19-member-1 + group:group-19#direct_member@user:group-19-member-2 + group:parent-group-19#admin@user:parent-group-19-admin-2 + group:parent-group-19#direct_member@user:parent-group-19-member-2 + group:group-19#direct_member@user:group-19-member-3 + group:parent-group-19#admin@user:parent-group-19-admin-3 + group:parent-group-19#direct_member@user:parent-group-19-member-3 + group:group-19#direct_member@user:group-19-member-4 + group:parent-group-19#admin@user:parent-group-19-admin-4 + group:parent-group-19#direct_member@user:parent-group-19-member-4 + group:group-19#direct_member@user:group-19-member-5 + group:parent-group-19#admin@user:parent-group-19-admin-5 + group:parent-group-19#direct_member@user:parent-group-19-member-5 + group:group-19#direct_member@user:group-19-member-6 + group:parent-group-19#admin@user:parent-group-19-admin-6 + group:parent-group-19#direct_member@user:parent-group-19-member-6 + group:group-19#direct_member@user:group-19-member-7 + group:parent-group-19#admin@user:parent-group-19-admin-7 + group:parent-group-19#direct_member@user:parent-group-19-member-7 + group:group-19#direct_member@user:group-19-member-8 + group:parent-group-19#admin@user:parent-group-19-admin-8 + group:parent-group-19#direct_member@user:parent-group-19-member-8 + group:group-19#direct_member@user:group-19-member-9 + group:parent-group-19#admin@user:parent-group-19-admin-9 + group:parent-group-19#direct_member@user:parent-group-19-member-9 + document:somedoc#viewer@group:group-20#member + group:group-20#direct_member@group:parent-group-20#member + group:group-20#direct_member@user:group-20-member-0 + group:parent-group-20#admin@user:parent-group-20-admin-0 + group:parent-group-20#direct_member@user:parent-group-20-member-0 + group:group-20#direct_member@user:group-20-member-1 + group:parent-group-20#admin@user:parent-group-20-admin-1 + group:parent-group-20#direct_member@user:parent-group-20-member-1 + group:group-20#direct_member@user:group-20-member-2 + group:parent-group-20#admin@user:parent-group-20-admin-2 + group:parent-group-20#direct_member@user:parent-group-20-member-2 + group:group-20#direct_member@user:group-20-member-3 + group:parent-group-20#admin@user:parent-group-20-admin-3 + group:parent-group-20#direct_member@user:parent-group-20-member-3 + group:group-20#direct_member@user:group-20-member-4 + group:parent-group-20#admin@user:parent-group-20-admin-4 + group:parent-group-20#direct_member@user:parent-group-20-member-4 + group:group-20#direct_member@user:group-20-member-5 + group:parent-group-20#admin@user:parent-group-20-admin-5 + group:parent-group-20#direct_member@user:parent-group-20-member-5 + group:group-20#direct_member@user:group-20-member-6 + group:parent-group-20#admin@user:parent-group-20-admin-6 + group:parent-group-20#direct_member@user:parent-group-20-member-6 + group:group-20#direct_member@user:group-20-member-7 + group:parent-group-20#admin@user:parent-group-20-admin-7 + group:parent-group-20#direct_member@user:parent-group-20-member-7 + group:group-20#direct_member@user:group-20-member-8 + group:parent-group-20#admin@user:parent-group-20-admin-8 + group:parent-group-20#direct_member@user:parent-group-20-member-8 + group:group-20#direct_member@user:group-20-member-9 + group:parent-group-20#admin@user:parent-group-20-admin-9 + group:parent-group-20#direct_member@user:parent-group-20-member-9 + document:somedoc#viewer@group:group-21#member + group:group-21#direct_member@group:parent-group-21#member + group:group-21#direct_member@user:group-21-member-0 + group:parent-group-21#admin@user:parent-group-21-admin-0 + group:parent-group-21#direct_member@user:parent-group-21-member-0 + group:group-21#direct_member@user:group-21-member-1 + group:parent-group-21#admin@user:parent-group-21-admin-1 + group:parent-group-21#direct_member@user:parent-group-21-member-1 + group:group-21#direct_member@user:group-21-member-2 + group:parent-group-21#admin@user:parent-group-21-admin-2 + group:parent-group-21#direct_member@user:parent-group-21-member-2 + group:group-21#direct_member@user:group-21-member-3 + group:parent-group-21#admin@user:parent-group-21-admin-3 + group:parent-group-21#direct_member@user:parent-group-21-member-3 + group:group-21#direct_member@user:group-21-member-4 + group:parent-group-21#admin@user:parent-group-21-admin-4 + group:parent-group-21#direct_member@user:parent-group-21-member-4 + group:group-21#direct_member@user:group-21-member-5 + group:parent-group-21#admin@user:parent-group-21-admin-5 + group:parent-group-21#direct_member@user:parent-group-21-member-5 + group:group-21#direct_member@user:group-21-member-6 + group:parent-group-21#admin@user:parent-group-21-admin-6 + group:parent-group-21#direct_member@user:parent-group-21-member-6 + group:group-21#direct_member@user:group-21-member-7 + group:parent-group-21#admin@user:parent-group-21-admin-7 + group:parent-group-21#direct_member@user:parent-group-21-member-7 + group:group-21#direct_member@user:group-21-member-8 + group:parent-group-21#admin@user:parent-group-21-admin-8 + group:parent-group-21#direct_member@user:parent-group-21-member-8 + group:group-21#direct_member@user:group-21-member-9 + group:parent-group-21#admin@user:parent-group-21-admin-9 + group:parent-group-21#direct_member@user:parent-group-21-member-9 + document:somedoc#viewer@group:group-22#member + group:group-22#direct_member@group:parent-group-22#member + group:group-22#direct_member@user:group-22-member-0 + group:parent-group-22#admin@user:parent-group-22-admin-0 + group:parent-group-22#direct_member@user:parent-group-22-member-0 + group:group-22#direct_member@user:group-22-member-1 + group:parent-group-22#admin@user:parent-group-22-admin-1 + group:parent-group-22#direct_member@user:parent-group-22-member-1 + group:group-22#direct_member@user:group-22-member-2 + group:parent-group-22#admin@user:parent-group-22-admin-2 + group:parent-group-22#direct_member@user:parent-group-22-member-2 + group:group-22#direct_member@user:group-22-member-3 + group:parent-group-22#admin@user:parent-group-22-admin-3 + group:parent-group-22#direct_member@user:parent-group-22-member-3 + group:group-22#direct_member@user:group-22-member-4 + group:parent-group-22#admin@user:parent-group-22-admin-4 + group:parent-group-22#direct_member@user:parent-group-22-member-4 + group:group-22#direct_member@user:group-22-member-5 + group:parent-group-22#admin@user:parent-group-22-admin-5 + group:parent-group-22#direct_member@user:parent-group-22-member-5 + group:group-22#direct_member@user:group-22-member-6 + group:parent-group-22#admin@user:parent-group-22-admin-6 + group:parent-group-22#direct_member@user:parent-group-22-member-6 + group:group-22#direct_member@user:group-22-member-7 + group:parent-group-22#admin@user:parent-group-22-admin-7 + group:parent-group-22#direct_member@user:parent-group-22-member-7 + group:group-22#direct_member@user:group-22-member-8 + group:parent-group-22#admin@user:parent-group-22-admin-8 + group:parent-group-22#direct_member@user:parent-group-22-member-8 + group:group-22#direct_member@user:group-22-member-9 + group:parent-group-22#admin@user:parent-group-22-admin-9 + group:parent-group-22#direct_member@user:parent-group-22-member-9 + document:somedoc#viewer@group:group-23#member + group:group-23#direct_member@group:parent-group-23#member + group:group-23#direct_member@user:group-23-member-0 + group:parent-group-23#admin@user:parent-group-23-admin-0 + group:parent-group-23#direct_member@user:parent-group-23-member-0 + group:group-23#direct_member@user:group-23-member-1 + group:parent-group-23#admin@user:parent-group-23-admin-1 + group:parent-group-23#direct_member@user:parent-group-23-member-1 + group:group-23#direct_member@user:group-23-member-2 + group:parent-group-23#admin@user:parent-group-23-admin-2 + group:parent-group-23#direct_member@user:parent-group-23-member-2 + group:group-23#direct_member@user:group-23-member-3 + group:parent-group-23#admin@user:parent-group-23-admin-3 + group:parent-group-23#direct_member@user:parent-group-23-member-3 + group:group-23#direct_member@user:group-23-member-4 + group:parent-group-23#admin@user:parent-group-23-admin-4 + group:parent-group-23#direct_member@user:parent-group-23-member-4 + group:group-23#direct_member@user:group-23-member-5 + group:parent-group-23#admin@user:parent-group-23-admin-5 + group:parent-group-23#direct_member@user:parent-group-23-member-5 + group:group-23#direct_member@user:group-23-member-6 + group:parent-group-23#admin@user:parent-group-23-admin-6 + group:parent-group-23#direct_member@user:parent-group-23-member-6 + group:group-23#direct_member@user:group-23-member-7 + group:parent-group-23#admin@user:parent-group-23-admin-7 + group:parent-group-23#direct_member@user:parent-group-23-member-7 + group:group-23#direct_member@user:group-23-member-8 + group:parent-group-23#admin@user:parent-group-23-admin-8 + group:parent-group-23#direct_member@user:parent-group-23-member-8 + group:group-23#direct_member@user:group-23-member-9 + group:parent-group-23#admin@user:parent-group-23-admin-9 + group:parent-group-23#direct_member@user:parent-group-23-member-9 + document:somedoc#viewer@group:group-24#member + group:group-24#direct_member@group:parent-group-24#member + group:group-24#direct_member@user:group-24-member-0 + group:parent-group-24#admin@user:parent-group-24-admin-0 + group:parent-group-24#direct_member@user:parent-group-24-member-0 + group:group-24#direct_member@user:group-24-member-1 + group:parent-group-24#admin@user:parent-group-24-admin-1 + group:parent-group-24#direct_member@user:parent-group-24-member-1 + group:group-24#direct_member@user:group-24-member-2 + group:parent-group-24#admin@user:parent-group-24-admin-2 + group:parent-group-24#direct_member@user:parent-group-24-member-2 + group:group-24#direct_member@user:group-24-member-3 + group:parent-group-24#admin@user:parent-group-24-admin-3 + group:parent-group-24#direct_member@user:parent-group-24-member-3 + group:group-24#direct_member@user:group-24-member-4 + group:parent-group-24#admin@user:parent-group-24-admin-4 + group:parent-group-24#direct_member@user:parent-group-24-member-4 + group:group-24#direct_member@user:group-24-member-5 + group:parent-group-24#admin@user:parent-group-24-admin-5 + group:parent-group-24#direct_member@user:parent-group-24-member-5 + group:group-24#direct_member@user:group-24-member-6 + group:parent-group-24#admin@user:parent-group-24-admin-6 + group:parent-group-24#direct_member@user:parent-group-24-member-6 + group:group-24#direct_member@user:group-24-member-7 + group:parent-group-24#admin@user:parent-group-24-admin-7 + group:parent-group-24#direct_member@user:parent-group-24-member-7 + group:group-24#direct_member@user:group-24-member-8 + group:parent-group-24#admin@user:parent-group-24-admin-8 + group:parent-group-24#direct_member@user:parent-group-24-member-8 + group:group-24#direct_member@user:group-24-member-9 + group:parent-group-24#admin@user:parent-group-24-admin-9 + group:parent-group-24#direct_member@user:parent-group-24-member-9 + document:somedoc#viewer@group:group-25#member + group:group-25#direct_member@group:parent-group-25#member + group:group-25#direct_member@user:group-25-member-0 + group:parent-group-25#admin@user:parent-group-25-admin-0 + group:parent-group-25#direct_member@user:parent-group-25-member-0 + group:group-25#direct_member@user:group-25-member-1 + group:parent-group-25#admin@user:parent-group-25-admin-1 + group:parent-group-25#direct_member@user:parent-group-25-member-1 + group:group-25#direct_member@user:group-25-member-2 + group:parent-group-25#admin@user:parent-group-25-admin-2 + group:parent-group-25#direct_member@user:parent-group-25-member-2 + group:group-25#direct_member@user:group-25-member-3 + group:parent-group-25#admin@user:parent-group-25-admin-3 + group:parent-group-25#direct_member@user:parent-group-25-member-3 + group:group-25#direct_member@user:group-25-member-4 + group:parent-group-25#admin@user:parent-group-25-admin-4 + group:parent-group-25#direct_member@user:parent-group-25-member-4 + group:group-25#direct_member@user:group-25-member-5 + group:parent-group-25#admin@user:parent-group-25-admin-5 + group:parent-group-25#direct_member@user:parent-group-25-member-5 + group:group-25#direct_member@user:group-25-member-6 + group:parent-group-25#admin@user:parent-group-25-admin-6 + group:parent-group-25#direct_member@user:parent-group-25-member-6 + group:group-25#direct_member@user:group-25-member-7 + group:parent-group-25#admin@user:parent-group-25-admin-7 + group:parent-group-25#direct_member@user:parent-group-25-member-7 + group:group-25#direct_member@user:group-25-member-8 + group:parent-group-25#admin@user:parent-group-25-admin-8 + group:parent-group-25#direct_member@user:parent-group-25-member-8 + group:group-25#direct_member@user:group-25-member-9 + group:parent-group-25#admin@user:parent-group-25-admin-9 + group:parent-group-25#direct_member@user:parent-group-25-member-9 + document:somedoc#viewer@group:group-26#member + group:group-26#direct_member@group:parent-group-26#member + group:group-26#direct_member@user:group-26-member-0 + group:parent-group-26#admin@user:parent-group-26-admin-0 + group:parent-group-26#direct_member@user:parent-group-26-member-0 + group:group-26#direct_member@user:group-26-member-1 + group:parent-group-26#admin@user:parent-group-26-admin-1 + group:parent-group-26#direct_member@user:parent-group-26-member-1 + group:group-26#direct_member@user:group-26-member-2 + group:parent-group-26#admin@user:parent-group-26-admin-2 + group:parent-group-26#direct_member@user:parent-group-26-member-2 + group:group-26#direct_member@user:group-26-member-3 + group:parent-group-26#admin@user:parent-group-26-admin-3 + group:parent-group-26#direct_member@user:parent-group-26-member-3 + group:group-26#direct_member@user:group-26-member-4 + group:parent-group-26#admin@user:parent-group-26-admin-4 + group:parent-group-26#direct_member@user:parent-group-26-member-4 + group:group-26#direct_member@user:group-26-member-5 + group:parent-group-26#admin@user:parent-group-26-admin-5 + group:parent-group-26#direct_member@user:parent-group-26-member-5 + group:group-26#direct_member@user:group-26-member-6 + group:parent-group-26#admin@user:parent-group-26-admin-6 + group:parent-group-26#direct_member@user:parent-group-26-member-6 + group:group-26#direct_member@user:group-26-member-7 + group:parent-group-26#admin@user:parent-group-26-admin-7 + group:parent-group-26#direct_member@user:parent-group-26-member-7 + group:group-26#direct_member@user:group-26-member-8 + group:parent-group-26#admin@user:parent-group-26-admin-8 + group:parent-group-26#direct_member@user:parent-group-26-member-8 + group:group-26#direct_member@user:group-26-member-9 + group:parent-group-26#admin@user:parent-group-26-admin-9 + group:parent-group-26#direct_member@user:parent-group-26-member-9 + document:somedoc#viewer@group:group-27#member + group:group-27#direct_member@group:parent-group-27#member + group:group-27#direct_member@user:group-27-member-0 + group:parent-group-27#admin@user:parent-group-27-admin-0 + group:parent-group-27#direct_member@user:parent-group-27-member-0 + group:group-27#direct_member@user:group-27-member-1 + group:parent-group-27#admin@user:parent-group-27-admin-1 + group:parent-group-27#direct_member@user:parent-group-27-member-1 + group:group-27#direct_member@user:group-27-member-2 + group:parent-group-27#admin@user:parent-group-27-admin-2 + group:parent-group-27#direct_member@user:parent-group-27-member-2 + group:group-27#direct_member@user:group-27-member-3 + group:parent-group-27#admin@user:parent-group-27-admin-3 + group:parent-group-27#direct_member@user:parent-group-27-member-3 + group:group-27#direct_member@user:group-27-member-4 + group:parent-group-27#admin@user:parent-group-27-admin-4 + group:parent-group-27#direct_member@user:parent-group-27-member-4 + group:group-27#direct_member@user:group-27-member-5 + group:parent-group-27#admin@user:parent-group-27-admin-5 + group:parent-group-27#direct_member@user:parent-group-27-member-5 + group:group-27#direct_member@user:group-27-member-6 + group:parent-group-27#admin@user:parent-group-27-admin-6 + group:parent-group-27#direct_member@user:parent-group-27-member-6 + group:group-27#direct_member@user:group-27-member-7 + group:parent-group-27#admin@user:parent-group-27-admin-7 + group:parent-group-27#direct_member@user:parent-group-27-member-7 + group:group-27#direct_member@user:group-27-member-8 + group:parent-group-27#admin@user:parent-group-27-admin-8 + group:parent-group-27#direct_member@user:parent-group-27-member-8 + group:group-27#direct_member@user:group-27-member-9 + group:parent-group-27#admin@user:parent-group-27-admin-9 + group:parent-group-27#direct_member@user:parent-group-27-member-9 + document:somedoc#viewer@group:group-28#member + group:group-28#direct_member@group:parent-group-28#member + group:group-28#direct_member@user:group-28-member-0 + group:parent-group-28#admin@user:parent-group-28-admin-0 + group:parent-group-28#direct_member@user:parent-group-28-member-0 + group:group-28#direct_member@user:group-28-member-1 + group:parent-group-28#admin@user:parent-group-28-admin-1 + group:parent-group-28#direct_member@user:parent-group-28-member-1 + group:group-28#direct_member@user:group-28-member-2 + group:parent-group-28#admin@user:parent-group-28-admin-2 + group:parent-group-28#direct_member@user:parent-group-28-member-2 + group:group-28#direct_member@user:group-28-member-3 + group:parent-group-28#admin@user:parent-group-28-admin-3 + group:parent-group-28#direct_member@user:parent-group-28-member-3 + group:group-28#direct_member@user:group-28-member-4 + group:parent-group-28#admin@user:parent-group-28-admin-4 + group:parent-group-28#direct_member@user:parent-group-28-member-4 + group:group-28#direct_member@user:group-28-member-5 + group:parent-group-28#admin@user:parent-group-28-admin-5 + group:parent-group-28#direct_member@user:parent-group-28-member-5 + group:group-28#direct_member@user:group-28-member-6 + group:parent-group-28#admin@user:parent-group-28-admin-6 + group:parent-group-28#direct_member@user:parent-group-28-member-6 + group:group-28#direct_member@user:group-28-member-7 + group:parent-group-28#admin@user:parent-group-28-admin-7 + group:parent-group-28#direct_member@user:parent-group-28-member-7 + group:group-28#direct_member@user:group-28-member-8 + group:parent-group-28#admin@user:parent-group-28-admin-8 + group:parent-group-28#direct_member@user:parent-group-28-member-8 + group:group-28#direct_member@user:group-28-member-9 + group:parent-group-28#admin@user:parent-group-28-admin-9 + group:parent-group-28#direct_member@user:parent-group-28-member-9 + document:somedoc#viewer@group:group-29#member + group:group-29#direct_member@group:parent-group-29#member + group:group-29#direct_member@user:group-29-member-0 + group:parent-group-29#admin@user:parent-group-29-admin-0 + group:parent-group-29#direct_member@user:parent-group-29-member-0 + group:group-29#direct_member@user:group-29-member-1 + group:parent-group-29#admin@user:parent-group-29-admin-1 + group:parent-group-29#direct_member@user:parent-group-29-member-1 + group:group-29#direct_member@user:group-29-member-2 + group:parent-group-29#admin@user:parent-group-29-admin-2 + group:parent-group-29#direct_member@user:parent-group-29-member-2 + group:group-29#direct_member@user:group-29-member-3 + group:parent-group-29#admin@user:parent-group-29-admin-3 + group:parent-group-29#direct_member@user:parent-group-29-member-3 + group:group-29#direct_member@user:group-29-member-4 + group:parent-group-29#admin@user:parent-group-29-admin-4 + group:parent-group-29#direct_member@user:parent-group-29-member-4 + group:group-29#direct_member@user:group-29-member-5 + group:parent-group-29#admin@user:parent-group-29-admin-5 + group:parent-group-29#direct_member@user:parent-group-29-member-5 + group:group-29#direct_member@user:group-29-member-6 + group:parent-group-29#admin@user:parent-group-29-admin-6 + group:parent-group-29#direct_member@user:parent-group-29-member-6 + group:group-29#direct_member@user:group-29-member-7 + group:parent-group-29#admin@user:parent-group-29-admin-7 + group:parent-group-29#direct_member@user:parent-group-29-member-7 + group:group-29#direct_member@user:group-29-member-8 + group:parent-group-29#admin@user:parent-group-29-admin-8 + group:parent-group-29#direct_member@user:parent-group-29-member-8 + group:group-29#direct_member@user:group-29-member-9 + group:parent-group-29#admin@user:parent-group-29-admin-9 + group:parent-group-29#direct_member@user:parent-group-29-member-9 + document:somedoc#viewer@group:group-30#member + group:group-30#direct_member@group:parent-group-30#member + group:group-30#direct_member@user:group-30-member-0 + group:parent-group-30#admin@user:parent-group-30-admin-0 + group:parent-group-30#direct_member@user:parent-group-30-member-0 + group:group-30#direct_member@user:group-30-member-1 + group:parent-group-30#admin@user:parent-group-30-admin-1 + group:parent-group-30#direct_member@user:parent-group-30-member-1 + group:group-30#direct_member@user:group-30-member-2 + group:parent-group-30#admin@user:parent-group-30-admin-2 + group:parent-group-30#direct_member@user:parent-group-30-member-2 + group:group-30#direct_member@user:group-30-member-3 + group:parent-group-30#admin@user:parent-group-30-admin-3 + group:parent-group-30#direct_member@user:parent-group-30-member-3 + group:group-30#direct_member@user:group-30-member-4 + group:parent-group-30#admin@user:parent-group-30-admin-4 + group:parent-group-30#direct_member@user:parent-group-30-member-4 + group:group-30#direct_member@user:group-30-member-5 + group:parent-group-30#admin@user:parent-group-30-admin-5 + group:parent-group-30#direct_member@user:parent-group-30-member-5 + group:group-30#direct_member@user:group-30-member-6 + group:parent-group-30#admin@user:parent-group-30-admin-6 + group:parent-group-30#direct_member@user:parent-group-30-member-6 + group:group-30#direct_member@user:group-30-member-7 + group:parent-group-30#admin@user:parent-group-30-admin-7 + group:parent-group-30#direct_member@user:parent-group-30-member-7 + group:group-30#direct_member@user:group-30-member-8 + group:parent-group-30#admin@user:parent-group-30-admin-8 + group:parent-group-30#direct_member@user:parent-group-30-member-8 + group:group-30#direct_member@user:group-30-member-9 + group:parent-group-30#admin@user:parent-group-30-admin-9 + group:parent-group-30#direct_member@user:parent-group-30-member-9 + document:somedoc#viewer@group:group-31#member + group:group-31#direct_member@group:parent-group-31#member + group:group-31#direct_member@user:group-31-member-0 + group:parent-group-31#admin@user:parent-group-31-admin-0 + group:parent-group-31#direct_member@user:parent-group-31-member-0 + group:group-31#direct_member@user:group-31-member-1 + group:parent-group-31#admin@user:parent-group-31-admin-1 + group:parent-group-31#direct_member@user:parent-group-31-member-1 + group:group-31#direct_member@user:group-31-member-2 + group:parent-group-31#admin@user:parent-group-31-admin-2 + group:parent-group-31#direct_member@user:parent-group-31-member-2 + group:group-31#direct_member@user:group-31-member-3 + group:parent-group-31#admin@user:parent-group-31-admin-3 + group:parent-group-31#direct_member@user:parent-group-31-member-3 + group:group-31#direct_member@user:group-31-member-4 + group:parent-group-31#admin@user:parent-group-31-admin-4 + group:parent-group-31#direct_member@user:parent-group-31-member-4 + group:group-31#direct_member@user:group-31-member-5 + group:parent-group-31#admin@user:parent-group-31-admin-5 + group:parent-group-31#direct_member@user:parent-group-31-member-5 + group:group-31#direct_member@user:group-31-member-6 + group:parent-group-31#admin@user:parent-group-31-admin-6 + group:parent-group-31#direct_member@user:parent-group-31-member-6 + group:group-31#direct_member@user:group-31-member-7 + group:parent-group-31#admin@user:parent-group-31-admin-7 + group:parent-group-31#direct_member@user:parent-group-31-member-7 + group:group-31#direct_member@user:group-31-member-8 + group:parent-group-31#admin@user:parent-group-31-admin-8 + group:parent-group-31#direct_member@user:parent-group-31-member-8 + group:group-31#direct_member@user:group-31-member-9 + group:parent-group-31#admin@user:parent-group-31-admin-9 + group:parent-group-31#direct_member@user:parent-group-31-member-9 + document:somedoc#viewer@group:group-32#member + group:group-32#direct_member@group:parent-group-32#member + group:group-32#direct_member@user:group-32-member-0 + group:parent-group-32#admin@user:parent-group-32-admin-0 + group:parent-group-32#direct_member@user:parent-group-32-member-0 + group:group-32#direct_member@user:group-32-member-1 + group:parent-group-32#admin@user:parent-group-32-admin-1 + group:parent-group-32#direct_member@user:parent-group-32-member-1 + group:group-32#direct_member@user:group-32-member-2 + group:parent-group-32#admin@user:parent-group-32-admin-2 + group:parent-group-32#direct_member@user:parent-group-32-member-2 + group:group-32#direct_member@user:group-32-member-3 + group:parent-group-32#admin@user:parent-group-32-admin-3 + group:parent-group-32#direct_member@user:parent-group-32-member-3 + group:group-32#direct_member@user:group-32-member-4 + group:parent-group-32#admin@user:parent-group-32-admin-4 + group:parent-group-32#direct_member@user:parent-group-32-member-4 + group:group-32#direct_member@user:group-32-member-5 + group:parent-group-32#admin@user:parent-group-32-admin-5 + group:parent-group-32#direct_member@user:parent-group-32-member-5 + group:group-32#direct_member@user:group-32-member-6 + group:parent-group-32#admin@user:parent-group-32-admin-6 + group:parent-group-32#direct_member@user:parent-group-32-member-6 + group:group-32#direct_member@user:group-32-member-7 + group:parent-group-32#admin@user:parent-group-32-admin-7 + group:parent-group-32#direct_member@user:parent-group-32-member-7 + group:group-32#direct_member@user:group-32-member-8 + group:parent-group-32#admin@user:parent-group-32-admin-8 + group:parent-group-32#direct_member@user:parent-group-32-member-8 + group:group-32#direct_member@user:group-32-member-9 + group:parent-group-32#admin@user:parent-group-32-admin-9 + group:parent-group-32#direct_member@user:parent-group-32-member-9 + document:somedoc#viewer@group:group-33#member + group:group-33#direct_member@group:parent-group-33#member + group:group-33#direct_member@user:group-33-member-0 + group:parent-group-33#admin@user:parent-group-33-admin-0 + group:parent-group-33#direct_member@user:parent-group-33-member-0 + group:group-33#direct_member@user:group-33-member-1 + group:parent-group-33#admin@user:parent-group-33-admin-1 + group:parent-group-33#direct_member@user:parent-group-33-member-1 + group:group-33#direct_member@user:group-33-member-2 + group:parent-group-33#admin@user:parent-group-33-admin-2 + group:parent-group-33#direct_member@user:parent-group-33-member-2 + group:group-33#direct_member@user:group-33-member-3 + group:parent-group-33#admin@user:parent-group-33-admin-3 + group:parent-group-33#direct_member@user:parent-group-33-member-3 + group:group-33#direct_member@user:group-33-member-4 + group:parent-group-33#admin@user:parent-group-33-admin-4 + group:parent-group-33#direct_member@user:parent-group-33-member-4 + group:group-33#direct_member@user:group-33-member-5 + group:parent-group-33#admin@user:parent-group-33-admin-5 + group:parent-group-33#direct_member@user:parent-group-33-member-5 + group:group-33#direct_member@user:group-33-member-6 + group:parent-group-33#admin@user:parent-group-33-admin-6 + group:parent-group-33#direct_member@user:parent-group-33-member-6 + group:group-33#direct_member@user:group-33-member-7 + group:parent-group-33#admin@user:parent-group-33-admin-7 + group:parent-group-33#direct_member@user:parent-group-33-member-7 + group:group-33#direct_member@user:group-33-member-8 + group:parent-group-33#admin@user:parent-group-33-admin-8 + group:parent-group-33#direct_member@user:parent-group-33-member-8 + group:group-33#direct_member@user:group-33-member-9 + group:parent-group-33#admin@user:parent-group-33-admin-9 + group:parent-group-33#direct_member@user:parent-group-33-member-9 + document:somedoc#viewer@group:group-34#member + group:group-34#direct_member@group:parent-group-34#member + group:group-34#direct_member@user:group-34-member-0 + group:parent-group-34#admin@user:parent-group-34-admin-0 + group:parent-group-34#direct_member@user:parent-group-34-member-0 + group:group-34#direct_member@user:group-34-member-1 + group:parent-group-34#admin@user:parent-group-34-admin-1 + group:parent-group-34#direct_member@user:parent-group-34-member-1 + group:group-34#direct_member@user:group-34-member-2 + group:parent-group-34#admin@user:parent-group-34-admin-2 + group:parent-group-34#direct_member@user:parent-group-34-member-2 + group:group-34#direct_member@user:group-34-member-3 + group:parent-group-34#admin@user:parent-group-34-admin-3 + group:parent-group-34#direct_member@user:parent-group-34-member-3 + group:group-34#direct_member@user:group-34-member-4 + group:parent-group-34#admin@user:parent-group-34-admin-4 + group:parent-group-34#direct_member@user:parent-group-34-member-4 + group:group-34#direct_member@user:group-34-member-5 + group:parent-group-34#admin@user:parent-group-34-admin-5 + group:parent-group-34#direct_member@user:parent-group-34-member-5 + group:group-34#direct_member@user:group-34-member-6 + group:parent-group-34#admin@user:parent-group-34-admin-6 + group:parent-group-34#direct_member@user:parent-group-34-member-6 + group:group-34#direct_member@user:group-34-member-7 + group:parent-group-34#admin@user:parent-group-34-admin-7 + group:parent-group-34#direct_member@user:parent-group-34-member-7 + group:group-34#direct_member@user:group-34-member-8 + group:parent-group-34#admin@user:parent-group-34-admin-8 + group:parent-group-34#direct_member@user:parent-group-34-member-8 + group:group-34#direct_member@user:group-34-member-9 + group:parent-group-34#admin@user:parent-group-34-admin-9 + group:parent-group-34#direct_member@user:parent-group-34-member-9 + document:somedoc#viewer@group:group-35#member + group:group-35#direct_member@group:parent-group-35#member + group:group-35#direct_member@user:group-35-member-0 + group:parent-group-35#admin@user:parent-group-35-admin-0 + group:parent-group-35#direct_member@user:parent-group-35-member-0 + group:group-35#direct_member@user:group-35-member-1 + group:parent-group-35#admin@user:parent-group-35-admin-1 + group:parent-group-35#direct_member@user:parent-group-35-member-1 + group:group-35#direct_member@user:group-35-member-2 + group:parent-group-35#admin@user:parent-group-35-admin-2 + group:parent-group-35#direct_member@user:parent-group-35-member-2 + group:group-35#direct_member@user:group-35-member-3 + group:parent-group-35#admin@user:parent-group-35-admin-3 + group:parent-group-35#direct_member@user:parent-group-35-member-3 + group:group-35#direct_member@user:group-35-member-4 + group:parent-group-35#admin@user:parent-group-35-admin-4 + group:parent-group-35#direct_member@user:parent-group-35-member-4 + group:group-35#direct_member@user:group-35-member-5 + group:parent-group-35#admin@user:parent-group-35-admin-5 + group:parent-group-35#direct_member@user:parent-group-35-member-5 + group:group-35#direct_member@user:group-35-member-6 + group:parent-group-35#admin@user:parent-group-35-admin-6 + group:parent-group-35#direct_member@user:parent-group-35-member-6 + group:group-35#direct_member@user:group-35-member-7 + group:parent-group-35#admin@user:parent-group-35-admin-7 + group:parent-group-35#direct_member@user:parent-group-35-member-7 + group:group-35#direct_member@user:group-35-member-8 + group:parent-group-35#admin@user:parent-group-35-admin-8 + group:parent-group-35#direct_member@user:parent-group-35-member-8 + group:group-35#direct_member@user:group-35-member-9 + group:parent-group-35#admin@user:parent-group-35-admin-9 + group:parent-group-35#direct_member@user:parent-group-35-member-9 + document:somedoc#viewer@group:group-36#member + group:group-36#direct_member@group:parent-group-36#member + group:group-36#direct_member@user:group-36-member-0 + group:parent-group-36#admin@user:parent-group-36-admin-0 + group:parent-group-36#direct_member@user:parent-group-36-member-0 + group:group-36#direct_member@user:group-36-member-1 + group:parent-group-36#admin@user:parent-group-36-admin-1 + group:parent-group-36#direct_member@user:parent-group-36-member-1 + group:group-36#direct_member@user:group-36-member-2 + group:parent-group-36#admin@user:parent-group-36-admin-2 + group:parent-group-36#direct_member@user:parent-group-36-member-2 + group:group-36#direct_member@user:group-36-member-3 + group:parent-group-36#admin@user:parent-group-36-admin-3 + group:parent-group-36#direct_member@user:parent-group-36-member-3 + group:group-36#direct_member@user:group-36-member-4 + group:parent-group-36#admin@user:parent-group-36-admin-4 + group:parent-group-36#direct_member@user:parent-group-36-member-4 + group:group-36#direct_member@user:group-36-member-5 + group:parent-group-36#admin@user:parent-group-36-admin-5 + group:parent-group-36#direct_member@user:parent-group-36-member-5 + group:group-36#direct_member@user:group-36-member-6 + group:parent-group-36#admin@user:parent-group-36-admin-6 + group:parent-group-36#direct_member@user:parent-group-36-member-6 + group:group-36#direct_member@user:group-36-member-7 + group:parent-group-36#admin@user:parent-group-36-admin-7 + group:parent-group-36#direct_member@user:parent-group-36-member-7 + group:group-36#direct_member@user:group-36-member-8 + group:parent-group-36#admin@user:parent-group-36-admin-8 + group:parent-group-36#direct_member@user:parent-group-36-member-8 + group:group-36#direct_member@user:group-36-member-9 + group:parent-group-36#admin@user:parent-group-36-admin-9 + group:parent-group-36#direct_member@user:parent-group-36-member-9 + document:somedoc#viewer@group:group-37#member + group:group-37#direct_member@group:parent-group-37#member + group:group-37#direct_member@user:group-37-member-0 + group:parent-group-37#admin@user:parent-group-37-admin-0 + group:parent-group-37#direct_member@user:parent-group-37-member-0 + group:group-37#direct_member@user:group-37-member-1 + group:parent-group-37#admin@user:parent-group-37-admin-1 + group:parent-group-37#direct_member@user:parent-group-37-member-1 + group:group-37#direct_member@user:group-37-member-2 + group:parent-group-37#admin@user:parent-group-37-admin-2 + group:parent-group-37#direct_member@user:parent-group-37-member-2 + group:group-37#direct_member@user:group-37-member-3 + group:parent-group-37#admin@user:parent-group-37-admin-3 + group:parent-group-37#direct_member@user:parent-group-37-member-3 + group:group-37#direct_member@user:group-37-member-4 + group:parent-group-37#admin@user:parent-group-37-admin-4 + group:parent-group-37#direct_member@user:parent-group-37-member-4 + group:group-37#direct_member@user:group-37-member-5 + group:parent-group-37#admin@user:parent-group-37-admin-5 + group:parent-group-37#direct_member@user:parent-group-37-member-5 + group:group-37#direct_member@user:group-37-member-6 + group:parent-group-37#admin@user:parent-group-37-admin-6 + group:parent-group-37#direct_member@user:parent-group-37-member-6 + group:group-37#direct_member@user:group-37-member-7 + group:parent-group-37#admin@user:parent-group-37-admin-7 + group:parent-group-37#direct_member@user:parent-group-37-member-7 + group:group-37#direct_member@user:group-37-member-8 + group:parent-group-37#admin@user:parent-group-37-admin-8 + group:parent-group-37#direct_member@user:parent-group-37-member-8 + group:group-37#direct_member@user:group-37-member-9 + group:parent-group-37#admin@user:parent-group-37-admin-9 + group:parent-group-37#direct_member@user:parent-group-37-member-9 + document:somedoc#viewer@group:group-38#member + group:group-38#direct_member@group:parent-group-38#member + group:group-38#direct_member@user:group-38-member-0 + group:parent-group-38#admin@user:parent-group-38-admin-0 + group:parent-group-38#direct_member@user:parent-group-38-member-0 + group:group-38#direct_member@user:group-38-member-1 + group:parent-group-38#admin@user:parent-group-38-admin-1 + group:parent-group-38#direct_member@user:parent-group-38-member-1 + group:group-38#direct_member@user:group-38-member-2 + group:parent-group-38#admin@user:parent-group-38-admin-2 + group:parent-group-38#direct_member@user:parent-group-38-member-2 + group:group-38#direct_member@user:group-38-member-3 + group:parent-group-38#admin@user:parent-group-38-admin-3 + group:parent-group-38#direct_member@user:parent-group-38-member-3 + group:group-38#direct_member@user:group-38-member-4 + group:parent-group-38#admin@user:parent-group-38-admin-4 + group:parent-group-38#direct_member@user:parent-group-38-member-4 + group:group-38#direct_member@user:group-38-member-5 + group:parent-group-38#admin@user:parent-group-38-admin-5 + group:parent-group-38#direct_member@user:parent-group-38-member-5 + group:group-38#direct_member@user:group-38-member-6 + group:parent-group-38#admin@user:parent-group-38-admin-6 + group:parent-group-38#direct_member@user:parent-group-38-member-6 + group:group-38#direct_member@user:group-38-member-7 + group:parent-group-38#admin@user:parent-group-38-admin-7 + group:parent-group-38#direct_member@user:parent-group-38-member-7 + group:group-38#direct_member@user:group-38-member-8 + group:parent-group-38#admin@user:parent-group-38-admin-8 + group:parent-group-38#direct_member@user:parent-group-38-member-8 + group:group-38#direct_member@user:group-38-member-9 + group:parent-group-38#admin@user:parent-group-38-admin-9 + group:parent-group-38#direct_member@user:parent-group-38-member-9 + document:somedoc#viewer@group:group-39#member + group:group-39#direct_member@group:parent-group-39#member + group:group-39#direct_member@user:group-39-member-0 + group:parent-group-39#admin@user:parent-group-39-admin-0 + group:parent-group-39#direct_member@user:parent-group-39-member-0 + group:group-39#direct_member@user:group-39-member-1 + group:parent-group-39#admin@user:parent-group-39-admin-1 + group:parent-group-39#direct_member@user:parent-group-39-member-1 + group:group-39#direct_member@user:group-39-member-2 + group:parent-group-39#admin@user:parent-group-39-admin-2 + group:parent-group-39#direct_member@user:parent-group-39-member-2 + group:group-39#direct_member@user:group-39-member-3 + group:parent-group-39#admin@user:parent-group-39-admin-3 + group:parent-group-39#direct_member@user:parent-group-39-member-3 + group:group-39#direct_member@user:group-39-member-4 + group:parent-group-39#admin@user:parent-group-39-admin-4 + group:parent-group-39#direct_member@user:parent-group-39-member-4 + group:group-39#direct_member@user:group-39-member-5 + group:parent-group-39#admin@user:parent-group-39-admin-5 + group:parent-group-39#direct_member@user:parent-group-39-member-5 + group:group-39#direct_member@user:group-39-member-6 + group:parent-group-39#admin@user:parent-group-39-admin-6 + group:parent-group-39#direct_member@user:parent-group-39-member-6 + group:group-39#direct_member@user:group-39-member-7 + group:parent-group-39#admin@user:parent-group-39-admin-7 + group:parent-group-39#direct_member@user:parent-group-39-member-7 + group:group-39#direct_member@user:group-39-member-8 + group:parent-group-39#admin@user:parent-group-39-admin-8 + group:parent-group-39#direct_member@user:parent-group-39-member-8 + group:group-39#direct_member@user:group-39-member-9 + group:parent-group-39#admin@user:parent-group-39-admin-9 + group:parent-group-39#direct_member@user:parent-group-39-member-9 + document:somedoc#viewer@group:group-40#member + group:group-40#direct_member@group:parent-group-40#member + group:group-40#direct_member@user:group-40-member-0 + group:parent-group-40#admin@user:parent-group-40-admin-0 + group:parent-group-40#direct_member@user:parent-group-40-member-0 + group:group-40#direct_member@user:group-40-member-1 + group:parent-group-40#admin@user:parent-group-40-admin-1 + group:parent-group-40#direct_member@user:parent-group-40-member-1 + group:group-40#direct_member@user:group-40-member-2 + group:parent-group-40#admin@user:parent-group-40-admin-2 + group:parent-group-40#direct_member@user:parent-group-40-member-2 + group:group-40#direct_member@user:group-40-member-3 + group:parent-group-40#admin@user:parent-group-40-admin-3 + group:parent-group-40#direct_member@user:parent-group-40-member-3 + group:group-40#direct_member@user:group-40-member-4 + group:parent-group-40#admin@user:parent-group-40-admin-4 + group:parent-group-40#direct_member@user:parent-group-40-member-4 + group:group-40#direct_member@user:group-40-member-5 + group:parent-group-40#admin@user:parent-group-40-admin-5 + group:parent-group-40#direct_member@user:parent-group-40-member-5 + group:group-40#direct_member@user:group-40-member-6 + group:parent-group-40#admin@user:parent-group-40-admin-6 + group:parent-group-40#direct_member@user:parent-group-40-member-6 + group:group-40#direct_member@user:group-40-member-7 + group:parent-group-40#admin@user:parent-group-40-admin-7 + group:parent-group-40#direct_member@user:parent-group-40-member-7 + group:group-40#direct_member@user:group-40-member-8 + group:parent-group-40#admin@user:parent-group-40-admin-8 + group:parent-group-40#direct_member@user:parent-group-40-member-8 + group:group-40#direct_member@user:group-40-member-9 + group:parent-group-40#admin@user:parent-group-40-admin-9 + group:parent-group-40#direct_member@user:parent-group-40-member-9 + document:somedoc#viewer@group:group-41#member + group:group-41#direct_member@group:parent-group-41#member + group:group-41#direct_member@user:group-41-member-0 + group:parent-group-41#admin@user:parent-group-41-admin-0 + group:parent-group-41#direct_member@user:parent-group-41-member-0 + group:group-41#direct_member@user:group-41-member-1 + group:parent-group-41#admin@user:parent-group-41-admin-1 + group:parent-group-41#direct_member@user:parent-group-41-member-1 + group:group-41#direct_member@user:group-41-member-2 + group:parent-group-41#admin@user:parent-group-41-admin-2 + group:parent-group-41#direct_member@user:parent-group-41-member-2 + group:group-41#direct_member@user:group-41-member-3 + group:parent-group-41#admin@user:parent-group-41-admin-3 + group:parent-group-41#direct_member@user:parent-group-41-member-3 + group:group-41#direct_member@user:group-41-member-4 + group:parent-group-41#admin@user:parent-group-41-admin-4 + group:parent-group-41#direct_member@user:parent-group-41-member-4 + group:group-41#direct_member@user:group-41-member-5 + group:parent-group-41#admin@user:parent-group-41-admin-5 + group:parent-group-41#direct_member@user:parent-group-41-member-5 + group:group-41#direct_member@user:group-41-member-6 + group:parent-group-41#admin@user:parent-group-41-admin-6 + group:parent-group-41#direct_member@user:parent-group-41-member-6 + group:group-41#direct_member@user:group-41-member-7 + group:parent-group-41#admin@user:parent-group-41-admin-7 + group:parent-group-41#direct_member@user:parent-group-41-member-7 + group:group-41#direct_member@user:group-41-member-8 + group:parent-group-41#admin@user:parent-group-41-admin-8 + group:parent-group-41#direct_member@user:parent-group-41-member-8 + group:group-41#direct_member@user:group-41-member-9 + group:parent-group-41#admin@user:parent-group-41-admin-9 + group:parent-group-41#direct_member@user:parent-group-41-member-9 + document:somedoc#viewer@group:group-42#member + group:group-42#direct_member@group:parent-group-42#member + group:group-42#direct_member@user:group-42-member-0 + group:parent-group-42#admin@user:parent-group-42-admin-0 + group:parent-group-42#direct_member@user:parent-group-42-member-0 + group:group-42#direct_member@user:group-42-member-1 + group:parent-group-42#admin@user:parent-group-42-admin-1 + group:parent-group-42#direct_member@user:parent-group-42-member-1 + group:group-42#direct_member@user:group-42-member-2 + group:parent-group-42#admin@user:parent-group-42-admin-2 + group:parent-group-42#direct_member@user:parent-group-42-member-2 + group:group-42#direct_member@user:group-42-member-3 + group:parent-group-42#admin@user:parent-group-42-admin-3 + group:parent-group-42#direct_member@user:parent-group-42-member-3 + group:group-42#direct_member@user:group-42-member-4 + group:parent-group-42#admin@user:parent-group-42-admin-4 + group:parent-group-42#direct_member@user:parent-group-42-member-4 + group:group-42#direct_member@user:group-42-member-5 + group:parent-group-42#admin@user:parent-group-42-admin-5 + group:parent-group-42#direct_member@user:parent-group-42-member-5 + group:group-42#direct_member@user:group-42-member-6 + group:parent-group-42#admin@user:parent-group-42-admin-6 + group:parent-group-42#direct_member@user:parent-group-42-member-6 + group:group-42#direct_member@user:group-42-member-7 + group:parent-group-42#admin@user:parent-group-42-admin-7 + group:parent-group-42#direct_member@user:parent-group-42-member-7 + group:group-42#direct_member@user:group-42-member-8 + group:parent-group-42#admin@user:parent-group-42-admin-8 + group:parent-group-42#direct_member@user:parent-group-42-member-8 + group:group-42#direct_member@user:group-42-member-9 + group:parent-group-42#admin@user:parent-group-42-admin-9 + group:parent-group-42#direct_member@user:parent-group-42-member-9 + document:somedoc#viewer@group:group-43#member + group:group-43#direct_member@group:parent-group-43#member + group:group-43#direct_member@user:group-43-member-0 + group:parent-group-43#admin@user:parent-group-43-admin-0 + group:parent-group-43#direct_member@user:parent-group-43-member-0 + group:group-43#direct_member@user:group-43-member-1 + group:parent-group-43#admin@user:parent-group-43-admin-1 + group:parent-group-43#direct_member@user:parent-group-43-member-1 + group:group-43#direct_member@user:group-43-member-2 + group:parent-group-43#admin@user:parent-group-43-admin-2 + group:parent-group-43#direct_member@user:parent-group-43-member-2 + group:group-43#direct_member@user:group-43-member-3 + group:parent-group-43#admin@user:parent-group-43-admin-3 + group:parent-group-43#direct_member@user:parent-group-43-member-3 + group:group-43#direct_member@user:group-43-member-4 + group:parent-group-43#admin@user:parent-group-43-admin-4 + group:parent-group-43#direct_member@user:parent-group-43-member-4 + group:group-43#direct_member@user:group-43-member-5 + group:parent-group-43#admin@user:parent-group-43-admin-5 + group:parent-group-43#direct_member@user:parent-group-43-member-5 + group:group-43#direct_member@user:group-43-member-6 + group:parent-group-43#admin@user:parent-group-43-admin-6 + group:parent-group-43#direct_member@user:parent-group-43-member-6 + group:group-43#direct_member@user:group-43-member-7 + group:parent-group-43#admin@user:parent-group-43-admin-7 + group:parent-group-43#direct_member@user:parent-group-43-member-7 + group:group-43#direct_member@user:group-43-member-8 + group:parent-group-43#admin@user:parent-group-43-admin-8 + group:parent-group-43#direct_member@user:parent-group-43-member-8 + group:group-43#direct_member@user:group-43-member-9 + group:parent-group-43#admin@user:parent-group-43-admin-9 + group:parent-group-43#direct_member@user:parent-group-43-member-9 + document:somedoc#viewer@group:group-44#member + group:group-44#direct_member@group:parent-group-44#member + group:group-44#direct_member@user:group-44-member-0 + group:parent-group-44#admin@user:parent-group-44-admin-0 + group:parent-group-44#direct_member@user:parent-group-44-member-0 + group:group-44#direct_member@user:group-44-member-1 + group:parent-group-44#admin@user:parent-group-44-admin-1 + group:parent-group-44#direct_member@user:parent-group-44-member-1 + group:group-44#direct_member@user:group-44-member-2 + group:parent-group-44#admin@user:parent-group-44-admin-2 + group:parent-group-44#direct_member@user:parent-group-44-member-2 + group:group-44#direct_member@user:group-44-member-3 + group:parent-group-44#admin@user:parent-group-44-admin-3 + group:parent-group-44#direct_member@user:parent-group-44-member-3 + group:group-44#direct_member@user:group-44-member-4 + group:parent-group-44#admin@user:parent-group-44-admin-4 + group:parent-group-44#direct_member@user:parent-group-44-member-4 + group:group-44#direct_member@user:group-44-member-5 + group:parent-group-44#admin@user:parent-group-44-admin-5 + group:parent-group-44#direct_member@user:parent-group-44-member-5 + group:group-44#direct_member@user:group-44-member-6 + group:parent-group-44#admin@user:parent-group-44-admin-6 + group:parent-group-44#direct_member@user:parent-group-44-member-6 + group:group-44#direct_member@user:group-44-member-7 + group:parent-group-44#admin@user:parent-group-44-admin-7 + group:parent-group-44#direct_member@user:parent-group-44-member-7 + group:group-44#direct_member@user:group-44-member-8 + group:parent-group-44#admin@user:parent-group-44-admin-8 + group:parent-group-44#direct_member@user:parent-group-44-member-8 + group:group-44#direct_member@user:group-44-member-9 + group:parent-group-44#admin@user:parent-group-44-admin-9 + group:parent-group-44#direct_member@user:parent-group-44-member-9 + document:somedoc#viewer@group:group-45#member + group:group-45#direct_member@group:parent-group-45#member + group:group-45#direct_member@user:group-45-member-0 + group:parent-group-45#admin@user:parent-group-45-admin-0 + group:parent-group-45#direct_member@user:parent-group-45-member-0 + group:group-45#direct_member@user:group-45-member-1 + group:parent-group-45#admin@user:parent-group-45-admin-1 + group:parent-group-45#direct_member@user:parent-group-45-member-1 + group:group-45#direct_member@user:group-45-member-2 + group:parent-group-45#admin@user:parent-group-45-admin-2 + group:parent-group-45#direct_member@user:parent-group-45-member-2 + group:group-45#direct_member@user:group-45-member-3 + group:parent-group-45#admin@user:parent-group-45-admin-3 + group:parent-group-45#direct_member@user:parent-group-45-member-3 + group:group-45#direct_member@user:group-45-member-4 + group:parent-group-45#admin@user:parent-group-45-admin-4 + group:parent-group-45#direct_member@user:parent-group-45-member-4 + group:group-45#direct_member@user:group-45-member-5 + group:parent-group-45#admin@user:parent-group-45-admin-5 + group:parent-group-45#direct_member@user:parent-group-45-member-5 + group:group-45#direct_member@user:group-45-member-6 + group:parent-group-45#admin@user:parent-group-45-admin-6 + group:parent-group-45#direct_member@user:parent-group-45-member-6 + group:group-45#direct_member@user:group-45-member-7 + group:parent-group-45#admin@user:parent-group-45-admin-7 + group:parent-group-45#direct_member@user:parent-group-45-member-7 + group:group-45#direct_member@user:group-45-member-8 + group:parent-group-45#admin@user:parent-group-45-admin-8 + group:parent-group-45#direct_member@user:parent-group-45-member-8 + group:group-45#direct_member@user:group-45-member-9 + group:parent-group-45#admin@user:parent-group-45-admin-9 + group:parent-group-45#direct_member@user:parent-group-45-member-9 + document:somedoc#viewer@group:group-46#member + group:group-46#direct_member@group:parent-group-46#member + group:group-46#direct_member@user:group-46-member-0 + group:parent-group-46#admin@user:parent-group-46-admin-0 + group:parent-group-46#direct_member@user:parent-group-46-member-0 + group:group-46#direct_member@user:group-46-member-1 + group:parent-group-46#admin@user:parent-group-46-admin-1 + group:parent-group-46#direct_member@user:parent-group-46-member-1 + group:group-46#direct_member@user:group-46-member-2 + group:parent-group-46#admin@user:parent-group-46-admin-2 + group:parent-group-46#direct_member@user:parent-group-46-member-2 + group:group-46#direct_member@user:group-46-member-3 + group:parent-group-46#admin@user:parent-group-46-admin-3 + group:parent-group-46#direct_member@user:parent-group-46-member-3 + group:group-46#direct_member@user:group-46-member-4 + group:parent-group-46#admin@user:parent-group-46-admin-4 + group:parent-group-46#direct_member@user:parent-group-46-member-4 + group:group-46#direct_member@user:group-46-member-5 + group:parent-group-46#admin@user:parent-group-46-admin-5 + group:parent-group-46#direct_member@user:parent-group-46-member-5 + group:group-46#direct_member@user:group-46-member-6 + group:parent-group-46#admin@user:parent-group-46-admin-6 + group:parent-group-46#direct_member@user:parent-group-46-member-6 + group:group-46#direct_member@user:group-46-member-7 + group:parent-group-46#admin@user:parent-group-46-admin-7 + group:parent-group-46#direct_member@user:parent-group-46-member-7 + group:group-46#direct_member@user:group-46-member-8 + group:parent-group-46#admin@user:parent-group-46-admin-8 + group:parent-group-46#direct_member@user:parent-group-46-member-8 + group:group-46#direct_member@user:group-46-member-9 + group:parent-group-46#admin@user:parent-group-46-admin-9 + group:parent-group-46#direct_member@user:parent-group-46-member-9 + document:somedoc#viewer@group:group-47#member + group:group-47#direct_member@group:parent-group-47#member + group:group-47#direct_member@user:group-47-member-0 + group:parent-group-47#admin@user:parent-group-47-admin-0 + group:parent-group-47#direct_member@user:parent-group-47-member-0 + group:group-47#direct_member@user:group-47-member-1 + group:parent-group-47#admin@user:parent-group-47-admin-1 + group:parent-group-47#direct_member@user:parent-group-47-member-1 + group:group-47#direct_member@user:group-47-member-2 + group:parent-group-47#admin@user:parent-group-47-admin-2 + group:parent-group-47#direct_member@user:parent-group-47-member-2 + group:group-47#direct_member@user:group-47-member-3 + group:parent-group-47#admin@user:parent-group-47-admin-3 + group:parent-group-47#direct_member@user:parent-group-47-member-3 + group:group-47#direct_member@user:group-47-member-4 + group:parent-group-47#admin@user:parent-group-47-admin-4 + group:parent-group-47#direct_member@user:parent-group-47-member-4 + group:group-47#direct_member@user:group-47-member-5 + group:parent-group-47#admin@user:parent-group-47-admin-5 + group:parent-group-47#direct_member@user:parent-group-47-member-5 + group:group-47#direct_member@user:group-47-member-6 + group:parent-group-47#admin@user:parent-group-47-admin-6 + group:parent-group-47#direct_member@user:parent-group-47-member-6 + group:group-47#direct_member@user:group-47-member-7 + group:parent-group-47#admin@user:parent-group-47-admin-7 + group:parent-group-47#direct_member@user:parent-group-47-member-7 + group:group-47#direct_member@user:group-47-member-8 + group:parent-group-47#admin@user:parent-group-47-admin-8 + group:parent-group-47#direct_member@user:parent-group-47-member-8 + group:group-47#direct_member@user:group-47-member-9 + group:parent-group-47#admin@user:parent-group-47-admin-9 + group:parent-group-47#direct_member@user:parent-group-47-member-9 + document:somedoc#viewer@group:group-48#member + group:group-48#direct_member@group:parent-group-48#member + group:group-48#direct_member@user:group-48-member-0 + group:parent-group-48#admin@user:parent-group-48-admin-0 + group:parent-group-48#direct_member@user:parent-group-48-member-0 + group:group-48#direct_member@user:group-48-member-1 + group:parent-group-48#admin@user:parent-group-48-admin-1 + group:parent-group-48#direct_member@user:parent-group-48-member-1 + group:group-48#direct_member@user:group-48-member-2 + group:parent-group-48#admin@user:parent-group-48-admin-2 + group:parent-group-48#direct_member@user:parent-group-48-member-2 + group:group-48#direct_member@user:group-48-member-3 + group:parent-group-48#admin@user:parent-group-48-admin-3 + group:parent-group-48#direct_member@user:parent-group-48-member-3 + group:group-48#direct_member@user:group-48-member-4 + group:parent-group-48#admin@user:parent-group-48-admin-4 + group:parent-group-48#direct_member@user:parent-group-48-member-4 + group:group-48#direct_member@user:group-48-member-5 + group:parent-group-48#admin@user:parent-group-48-admin-5 + group:parent-group-48#direct_member@user:parent-group-48-member-5 + group:group-48#direct_member@user:group-48-member-6 + group:parent-group-48#admin@user:parent-group-48-admin-6 + group:parent-group-48#direct_member@user:parent-group-48-member-6 + group:group-48#direct_member@user:group-48-member-7 + group:parent-group-48#admin@user:parent-group-48-admin-7 + group:parent-group-48#direct_member@user:parent-group-48-member-7 + group:group-48#direct_member@user:group-48-member-8 + group:parent-group-48#admin@user:parent-group-48-admin-8 + group:parent-group-48#direct_member@user:parent-group-48-member-8 + group:group-48#direct_member@user:group-48-member-9 + group:parent-group-48#admin@user:parent-group-48-admin-9 + group:parent-group-48#direct_member@user:parent-group-48-member-9 + document:somedoc#viewer@group:group-49#member + group:group-49#direct_member@group:parent-group-49#member + group:group-49#direct_member@user:group-49-member-0 + group:parent-group-49#admin@user:parent-group-49-admin-0 + group:parent-group-49#direct_member@user:parent-group-49-member-0 + group:group-49#direct_member@user:group-49-member-1 + group:parent-group-49#admin@user:parent-group-49-admin-1 + group:parent-group-49#direct_member@user:parent-group-49-member-1 + group:group-49#direct_member@user:group-49-member-2 + group:parent-group-49#admin@user:parent-group-49-admin-2 + group:parent-group-49#direct_member@user:parent-group-49-member-2 + group:group-49#direct_member@user:group-49-member-3 + group:parent-group-49#admin@user:parent-group-49-admin-3 + group:parent-group-49#direct_member@user:parent-group-49-member-3 + group:group-49#direct_member@user:group-49-member-4 + group:parent-group-49#admin@user:parent-group-49-admin-4 + group:parent-group-49#direct_member@user:parent-group-49-member-4 + group:group-49#direct_member@user:group-49-member-5 + group:parent-group-49#admin@user:parent-group-49-admin-5 + group:parent-group-49#direct_member@user:parent-group-49-member-5 + group:group-49#direct_member@user:group-49-member-6 + group:parent-group-49#admin@user:parent-group-49-admin-6 + group:parent-group-49#direct_member@user:parent-group-49-member-6 + group:group-49#direct_member@user:group-49-member-7 + group:parent-group-49#admin@user:parent-group-49-admin-7 + group:parent-group-49#direct_member@user:parent-group-49-member-7 + group:group-49#direct_member@user:group-49-member-8 + group:parent-group-49#admin@user:parent-group-49-admin-8 + group:parent-group-49#direct_member@user:parent-group-49-member-8 + group:group-49#direct_member@user:group-49-member-9 + group:parent-group-49#admin@user:parent-group-49-admin-9 + group:parent-group-49#direct_member@user:parent-group-49-member-9 + + // Users 90-99 are banned. + // for userid in range(90, 100) + // document:somedoc#banned@user:user-{userid} + document:somedoc#banned@user:user-90 + document:somedoc#banned@user:user-91 + document:somedoc#banned@user:user-92 + document:somedoc#banned@user:user-93 + document:somedoc#banned@user:user-94 + document:somedoc#banned@user:user-95 + document:somedoc#banned@user:user-96 + document:somedoc#banned@user:user-97 + document:somedoc#banned@user:user-98 + document:somedoc#banned@user:user-99 + + // Direct users for public doc. + document:publicdoc#viewer@user:user-0 + document:publicdoc#viewer@user:user-1 + document:publicdoc#viewer@user:user-2 + document:publicdoc#viewer@user:user-3 + document:publicdoc#viewer@user:user-4 + document:publicdoc#viewer@user:user-5 + document:publicdoc#viewer@user:user-6 + document:publicdoc#viewer@user:user-7 + document:publicdoc#viewer@user:user-8 + document:publicdoc#viewer@user:user-9 + document:publicdoc#viewer@user:user-10 + + // Mark the document as public. + document:publicdoc#viewer@user:* + + // Ban users 0-5 + document:publicdoc#banned@user:user-0 + document:publicdoc#banned@user:user-1 + document:publicdoc#banned@user:user-2 + document:publicdoc#banned@user:user-3 + document:publicdoc#banned@user:user-4 + document:publicdoc#banned@user:user-5 diff --git a/magefiles/test.go b/magefiles/test.go index b6d0f7a4ee..22d4c43165 100644 --- a/magefiles/test.go +++ b/magefiles/test.go @@ -48,6 +48,20 @@ func (Test) Integration() error { return goTest("./internal/services/integrationtesting/...", "-tags", "ci,docker", "-timeout", "15m") } +// Steelthread Run steelthread tests +func (Test) Steelthread() error { + fmt.Println("running steel thread tests") + return goTest("./internal/services/steelthreadtesting/...", "-tags", "steelthread", "-timeout", "15m", "-v") +} + +// RegenSteelthread Regenerate the steelthread tests +func (Test) RegenSteelthread() error { + fmt.Println("regenerating steel thread tests") + return RunSh(goCmdForTests(), WithV(), WithDir("."), WithEnv(map[string]string{ + "REGENERATE_STEEL_RESULTS": "true", + }), WithArgs("test", "./internal/services/steelthreadtesting/...", "-tags", "steelthread", "-timeout", "15m", "-v"))("go") +} + // Analyzers Run the analyzer unit tests func (Test) Analyzers() error { return goDirTest("./tools/analyzers", "./...")