diff --git a/admin.bash b/admin.bash index 3a05270e..768ded7f 100755 --- a/admin.bash +++ b/admin.bash @@ -56,7 +56,7 @@ declare -A COMMANDS=( ["print dam resource view roles"]='dam_curl_client "/dam/${API_VERSION?}/${REALM?}/resources/$4/views/$6/roles"' ["print dam resource view role "]='dam_curl_client "/dam/${API_VERSION?}/${REALM?}/resources/$4/views/$6/roles"' ["print dam resources"]='dam_curl_client "/dam/${API_VERSION?}/${REALM?}/resources"' - ["print dam adapters"]='dam_curl_client "/dam/${API_VERSION?}/${REALM?}/targetAdapters"' + ["print dam services"]='dam_curl_client "/dam/${API_VERSION?}/${REALM?}/services"' ["print dam personas"]='dam_curl_client "/dam/${API_VERSION?}/${REALM?}/testPersonas"' ["print dam roles"]='dam_curl_client "/dam/${API_VERSION?}/${REALM?}/damRoleCategories"' ["print dam translators"]='dam_curl_client "/dam/${API_VERSION?}/${REALM?}/passportTranslators"' diff --git a/apis.md b/apis.md index eea2f636..7bf756a4 100644 --- a/apis.md +++ b/apis.md @@ -270,14 +270,14 @@ DAM configuration. They filter out sensitive parts of the configuration. They require valid "client_id" and "client_secret" parameters on the request. * /dam/v1alpha/{realm}/client/{name} +* /dam/v1alpha/{realm}/damRoleCategories * /dam/v1alpha/{realm}/resources * /dam/v1alpha/{realm}/resources/{name} * /dam/v1alpha/{realm}/flatViews +* /dam/v1alpha/{realm}/passportTranslators * /dam/v1alpha/{realm}/resources/{name}/views * /dam/v1alpha/{realm}/resources/{name}/views/{view} * /dam/v1alpha/{realm}/resources/{name}/views/{view}/roles * /dam/v1alpha/{realm}/resources/{name}/views/{view}/roles/{role} -* /dam/v1alpha/{realm}/targetAdapters -* /dam/v1alpha/{realm}/passportTranslators -* /dam/v1alpha/{realm}/damRoleCategories +* /dam/v1alpha/{realm}/services * /dam/v1alpha/{realm}/testPersonas diff --git a/deploy/config/dam-static/adapter_master_gatekeeper_latest.json b/deploy/config/dam-static/adapter_master_gatekeeper_latest.json deleted file mode 100644 index 2f196eb6..00000000 --- a/deploy/config/dam-static/adapter_master_gatekeeper_latest.json +++ /dev/null @@ -1,43 +0,0 @@ -{ - "platform": "oauth", - "requirements": { - "targetRole": false, - "targetScope": true, - "aud": true - }, - "properties": { - "singleItem": true, - "isAggregate": false, - "canBeAggregated": false - }, - "itemFormats": { - "url": { - "variables": { - "aud": { - "type": "const", - "regexp": ".", - "ui": { - "label": "Audience", - "description": "A unique JWT audience for the token to distiguish this resource or view from all others" - } - }, - "url": { - "type": "const", - "regexp": "^(http://|https://).*$", - "ui": { - "label": "URL for the service", - "description": "Provide only one URL (i.e. one item) per resource view" - } - } - }, - "ui": { - "label": "Proxy URL" - } - } - }, - "ui": { - "description": "Generates scoped-down OAuth OIDC access tokens for use with a Gatekeeper Proxy (requires administrator to deploy a compatible reverse proxy underlying services)", - "label": "Gatekeeper Token", - "itemFormat": "http://{URL-FRAGMENT} or https://{URL-FRAGMENT}" - } -} diff --git a/deploy/config/dam-template/config_master_main_latest.json b/deploy/config/dam-template/config_master_main_latest.json index 46b4dd54..cfdfac13 100644 --- a/deploy/config/dam-template/config_master_main_latest.json +++ b/deploy/config/dam-template/config_master_main_latest.json @@ -163,14 +163,12 @@ }, "serviceTemplates": { "gcs": { - "serviceName": "token:gcp:sa", - "itemFormat": "gcs", + "serviceName": "gcs", "roles": { "viewer": { - "targetRoles": ["roles/storage.objectViewer"], - "targetScopes": [ - "https://www.googleapis.com/auth/cloud-platform" - ], + "serviceArgs": { + "roles": { "values": ["roles/storage.objectViewer"] } + }, "damRoleCategories": ["metadata", "list", "read"], "ui": { "label": "File Viewer", @@ -178,7 +176,9 @@ } }, "creator": { - "targetRoles": ["roles/storage.objectCreator"], + "serviceArgs": { + "roles": { "values": ["roles/storage.objectCreator"] } + }, "damRoleCategories": ["write"], "ui": { "label": "File Creator", @@ -186,13 +186,14 @@ } }, "editor": { - "targetRoles": [ - "roles/storage.objectViewer", - "roles/storage.objectCreator" - ], - "targetScopes": [ - "https://www.googleapis.com/auth/cloud-platform" - ], + "serviceArgs": { + "roles": { + "values": [ + "roles/storage.objectViewer", + "roles/storage.objectCreator" + ] + } + }, "damRoleCategories": ["metadata", "list", "read", "write"], "ui": { "label": "File Editor", diff --git a/deploy/config/dam-static/adapter_master_aggregator_latest.json b/deploy/metadata/adapter_aggregator.json similarity index 55% rename from deploy/config/dam-static/adapter_master_aggregator_latest.json rename to deploy/metadata/adapter_aggregator.json index d35b2a46..39f80e30 100644 --- a/deploy/config/dam-static/adapter_master_aggregator_latest.json +++ b/deploy/metadata/adapter_aggregator.json @@ -1,17 +1,14 @@ { - "platform": "dam", - "requirements": { - "targetRole": false, - "targetScope": false, - "aud": false - }, - "properties": { - "isAggregate": true, - "canBeAggregated": false - }, - "itemFormats": { - "view": { - "variables": { + "services": { + "aggregator": { + "platform": "dam", + "properties": { + "isAggregate": true, + "canBeAggregated": false + }, + "serviceVariables": { + }, + "itemVariables": { "resource": { "type": "const", "regexp": "^[A-Za-z][\\w\\-]*$", @@ -30,12 +27,9 @@ } }, "ui": { - "label": "Aggregate compatible views across resources" + "label": "View Aggregator", + "description": "Combines compatible views across resources to produce a single token with access to all of them" } } - }, - "ui": { - "description": "Combines compatible views across resources to produce a single token with access to all of them", - "label": "View Aggregator" } } diff --git a/deploy/metadata/adapter_gatekeeper.json b/deploy/metadata/adapter_gatekeeper.json new file mode 100644 index 00000000..ef26c7af --- /dev/null +++ b/deploy/metadata/adapter_gatekeeper.json @@ -0,0 +1,45 @@ +{ + "services": { + "gatekeeper": { + "platform": "oauth", + "properties": { + "singleItem": true, + "isAggregate": false, + "canBeAggregated": false + }, + "serviceVariables": { + "scopes": { + "type": "const", + "regexp": ".", + "ui": { + "label": "Scopes", + "description": "An identifier to include in the 'scope' claim as part of the token permission model" + } + } + }, + "itemVariables": { + "aud": { + "type": "const", + "regexp": ".", + "ui": { + "label": "Audience", + "description": "A unique JWT audience for the token to distiguish this resource or view from all others" + } + }, + "url": { + "type": "const", + "regexp": "^(http://|https://).*$", + "ui": { + "label": "URL for the service", + "description": "Provide only one URL (i.e. one item) per resource view" + } + } + }, + "ui": { + "description": "Generates scoped-down OAuth OIDC access tokens for use with a Gatekeeper Proxy (requires administrator to deploy a compatible reverse proxy underlying services)", + "label": "Gatekeeper Token", + "itemFormat": "http://{URL-FRAGMENT} or https://{URL-FRAGMENT}" + } + } + } +} diff --git a/deploy/config/dam-static/adapter_master_saw_latest.json b/deploy/metadata/adapter_saw.json similarity index 60% rename from deploy/config/dam-static/adapter_master_saw_latest.json rename to deploy/metadata/adapter_saw.json index fe6ebfca..6e8cd796 100644 --- a/deploy/config/dam-static/adapter_master_saw_latest.json +++ b/deploy/metadata/adapter_saw.json @@ -1,17 +1,31 @@ { - "platform": "gcp", - "requirements": { - "targetRole": true, - "targetScope": false, - "aud": false - }, - "properties": { - "isAggregate": false, - "canBeAggregated": true - }, - "itemFormats": { + "services": { "gcs": { - "variables": { + "platform": "gcp", + "properties": { + "isAggregate": false, + "canBeAggregated": true + }, + "serviceVariables": { + "roles": { + "type": "const", + "regexp": "^roles/.*$", + "ui": { + "label": "GCS Roles", + "description": "GCS standard or custom role name starting with 'roles/' prefix" + } + }, + "scopes": { + "type": "const", + "optional": true, + "regexp": ".", + "ui": { + "label": "GCP Scopes", + "description": "An advanced GCP identifier to include in the 'scope' claim as part of the token permission model. Default: 'https://www.googleapis.com/auth/cloud-platform'" + } + } + }, + "itemVariables": { "project": { "type": "const", "regexp": "^[a-z]([-a-z0-9]*[a-z0-9])?$", @@ -54,7 +68,31 @@ } }, "bigquery": { - "variables": { + "platform": "gcp", + "properties": { + "isAggregate": false, + "canBeAggregated": true + }, + "serviceVariables": { + "roles": { + "type": "const", + "regexp": "^roles/.*$", + "ui": { + "label": "BigQuery Roles", + "description": "BigQuery standard or custom role name starting with 'roles/' prefix" + } + }, + "scopes": { + "type": "const", + "optional": true, + "regexp": ".", + "ui": { + "label": "GCP Scopes", + "description": "An advanced GCP identifier to include in the 'scope' claim as part of the token permission model. Default: 'https://www.googleapis.com/auth/cloud-platform'" + } + } + }, + "itemVariables": { "project": { "type": "const", "regexp": "^[a-z]([-a-z0-9]*[a-z0-9])?$", @@ -78,9 +116,5 @@ "description": "Google BigQuery is an enterprise data warehouse that solves this problem by enabling super-fast SQL queries using the processing power of Google's infrastructure." } } - }, - "ui": { - "description": "Generates down-scoped Service Account access tokens for use on Google Cloud Platform (GCP)", - "label": "GCP Service Account Token" } } diff --git a/deploy/config/dam-static/role_master_en_latest.json b/deploy/metadata/dam_roles.json similarity index 100% rename from deploy/config/dam-static/role_master_en_latest.json rename to deploy/metadata/dam_roles.json diff --git a/lib/adapter/adapters.go b/lib/adapter/adapters.go index 67c3f674..5a15ca7a 100644 --- a/lib/adapter/adapters.go +++ b/lib/adapter/adapters.go @@ -74,8 +74,8 @@ type ServiceAdapter interface { // Platform returns the name identifier of the platform on which this adapter operates. Platform() string - // Descriptor returns a service descriptor. - Descriptor() *pb.ServiceDescriptor + // Descriptors returns a map of service descriptors. + Descriptors() map[string]*pb.ServiceDescriptor // IsAggregator returns true if this adapter requires TokenAction.Aggregates. IsAggregator() bool @@ -89,18 +89,20 @@ type ServiceAdapter interface { // ServiceAdapters includes all adapters that are registered with the system. type ServiceAdapters struct { - ByName map[string]ServiceAdapter - Descriptors map[string]*pb.ServiceDescriptor - VariableREs map[string]map[string]map[string]*regexp.Regexp // adapterName.itemFormat.variableName.regexp - errors []error + ByAdapterName map[string]ServiceAdapter + ByServiceName map[string]ServiceAdapter + Descriptors map[string]*pb.ServiceDescriptor + VariableREs map[string]map[string]*regexp.Regexp // serviceName.variableName.regexp + errors []error } // CreateAdapters registers and collects all adapters with the system. func CreateAdapters(store storage.Store, warehouse clouds.ResourceTokenCreator, secrets *pb.DamSecrets) (*ServiceAdapters, error) { adapters := &ServiceAdapters{ - ByName: make(map[string]ServiceAdapter), - Descriptors: make(map[string]*pb.ServiceDescriptor), - errors: []error{}, + ByAdapterName: make(map[string]ServiceAdapter), + ByServiceName: make(map[string]ServiceAdapter), + Descriptors: make(map[string]*pb.ServiceDescriptor), + errors: []error{}, } registerAdapter(adapters, store, warehouse, secrets, NewSawAdapter) registerAdapter(adapters, store, warehouse, secrets, NewGatekeeperAdapter) @@ -116,34 +118,30 @@ func CreateAdapters(store storage.Store, warehouse clouds.ResourceTokenCreator, } // GetItemVariables returns a map of variables and their values for a given view item. -func GetItemVariables(adapters *ServiceAdapters, ServiceAdapter, itemFormat string, item *pb.View_Item) (map[string]string, string, error) { - adapter, ok := adapters.Descriptors[ServiceAdapter] +func GetItemVariables(adapters *ServiceAdapters, adapterName string, item *pb.View_Item) (map[string]string, string, error) { + desc, ok := adapters.Descriptors[adapterName] if !ok { - return nil, httputil.StatusPath("ServiceAdapter"), fmt.Errorf("target adapter %q is undefined", ServiceAdapter) - } - format, ok := adapter.ItemFormats[itemFormat] - if !ok { - return nil, httputil.StatusPath("itemFormats", itemFormat), fmt.Errorf("target adapter %q item format %q is undefined", ServiceAdapter, itemFormat) + return nil, httputil.StatusPath("ServiceAdapter"), fmt.Errorf("target adapter %q is undefined", adapterName) } for varname, val := range item.Args { - v, ok := format.Variables[varname] + v, ok := desc.ItemVariables[varname] if !ok { - return nil, httputil.StatusPath("vars", varname), fmt.Errorf("target adapter %q item format %q variable %q is undefined", ServiceAdapter, itemFormat, varname) + return nil, httputil.StatusPath("vars", varname), fmt.Errorf("target service %q variable %q is undefined", adapterName, varname) } if !globalflags.Experimental && v.Experimental { - return nil, httputil.StatusPath("vars", varname), fmt.Errorf("target adapter %q item format %q variable %q is for experimental use only, not for use in this environment", ServiceAdapter, itemFormat, varname) + return nil, httputil.StatusPath("vars", varname), fmt.Errorf("target service %q variable %q is for experimental use only, not for use in this environment", adapterName, varname) } if len(val) == 0 { // Treat empty input the same as not provided so long as the variable name is valid. delete(item.Args, varname) continue } - re, ok := adapters.VariableREs[ServiceAdapter][itemFormat][varname] + re, ok := adapters.VariableREs[adapterName][varname] if !ok { continue } if !re.Match([]byte(val)) { - return nil, httputil.StatusPath("vars", varname), fmt.Errorf("target adapter %q item format %q variable %q value %q does not match expected regexp", ServiceAdapter, itemFormat, varname, val) + return nil, httputil.StatusPath("vars", varname), fmt.Errorf("target adapter %q variable %q value %q does not match expected regexp", adapterName, varname, val) } } return item.Args, "", nil @@ -163,37 +161,33 @@ func ResolveServiceRole(roleName string, view *pb.View, res *pb.Resource, cfg *p } func registerAdapter(adapters *ServiceAdapters, store storage.Store, warehouse clouds.ResourceTokenCreator, secrets *pb.DamSecrets, init func(storage.Store, clouds.ResourceTokenCreator, *pb.DamSecrets, *ServiceAdapters) (ServiceAdapter, error)) { - adapter, err := init(store, warehouse, secrets, adapters) + adapt, err := init(store, warehouse, secrets, adapters) if err != nil { adapters.errors = append(adapters.errors, err) return } - name := adapter.Name() - adapters.ByName[name] = adapter - adapters.Descriptors[name] = adapter.Descriptor() + adapters.ByAdapterName[adapt.Name()] = adapt + for k, v := range adapt.Descriptors() { + adapters.ByServiceName[k] = adapt + adapters.Descriptors[k] = v + } } -func createVariableREs(descriptors map[string]*pb.ServiceDescriptor) map[string]map[string]map[string]*regexp.Regexp { - // Create a compiled set of regular expressions for adapter variable formats - // of the form: map[]map[]map[]*regexp.Regexp. - varRE := make(map[string]map[string]map[string]*regexp.Regexp) +func createVariableREs(descriptors map[string]*pb.ServiceDescriptor) map[string]map[string]*regexp.Regexp { + // Create a compiled set of regular expressions for service variable formats + // of the form: map[]map[]*regexp.Regexp. + varRE := make(map[string]map[string]*regexp.Regexp) for k, v := range descriptors { - if len(v.ItemFormats) > 0 { - fEntry := make(map[string]map[string]*regexp.Regexp) - varRE[k] = fEntry - for fk, fv := range v.ItemFormats { - vEntry := make(map[string]*regexp.Regexp) - fEntry[fk] = vEntry - for vk, vv := range fv.Variables { - if len(vv.Regexp) > 0 { - restr := vv.Regexp - if vv.Type == "split_pattern" { - frag := stripAnchors(restr) - restr = "^" + frag + "(;" + frag + ")*$" - } - vEntry[vk] = regexp.MustCompile(restr) - } + vEntry := make(map[string]*regexp.Regexp) + varRE[k] = vEntry + for vk, vv := range v.ItemVariables { + if len(vv.Regexp) > 0 { + restr := vv.Regexp + if vv.Type == "split_pattern" { + frag := stripAnchors(restr) + restr = "^" + frag + "(;" + frag + ")*$" } + vEntry[vk] = regexp.MustCompile(restr) } } } @@ -209,3 +203,7 @@ func stripAnchors(restr string) string { } return restr } + +func adapterFilePath(name string) string { + return "deploy/metadata/adapter_" + name + ".json" +} diff --git a/lib/adapter/adapters_test.go b/lib/adapter/adapters_test.go index ea766896..d69e26cd 100644 --- a/lib/adapter/adapters_test.go +++ b/lib/adapter/adapters_test.go @@ -43,13 +43,13 @@ func TestCreateAdapters(t *testing.T) { if err != nil { t.Fatalf("CreateAdapters(store, warehouse): want success, got error: %v", err) } - if len(adapters.ByName) != expectedNumOfAdapters { - t.Errorf("count ByName: want %d, got %d", expectedNumOfAdapters, len(adapters.ByName)) + if len(adapters.ByAdapterName) != expectedNumOfAdapters { + t.Errorf("count ByName: want %d, got %d", expectedNumOfAdapters, len(adapters.ByAdapterName)) } - if len(adapters.ByName) != len(adapters.Descriptors) { - t.Errorf("count Descriptors should be same as count ByName: want %d, got %d", len(adapters.ByName), len(adapters.Descriptors)) + if len(adapters.ByServiceName) != len(adapters.Descriptors) { + t.Errorf("count Descriptors should be same as count ByName: want %d, got %d", len(adapters.ByServiceName), len(adapters.Descriptors)) } - for name, item := range adapters.ByName { + for name, item := range adapters.ByServiceName { if _, ok := adapters.Descriptors[name]; !ok { t.Errorf("entry %q appears in ByName but not in Descriptors", name) } @@ -61,22 +61,13 @@ func TestCreateAdapters(t *testing.T) { if desc == nil { t.Errorf("descriptor %q: want not nil, got nil", name) } - if len(desc.ItemFormats) > 0 { - vre, ok := adapters.VariableREs[name] - if !ok { - t.Fatalf("variable RE %q not found even though descriptor has ItemFormats", name) - } - if len(vre) != len(desc.ItemFormats) { - t.Errorf("variable RE %q count mismatch: want %d, got %d", name, len(desc.ItemFormats), len(vre)) - } - for fmtName, fmt := range desc.ItemFormats { - fre, ok := vre[fmtName] - if !ok { - t.Fatalf("variable RE %q item format %q missing", name, fmtName) - } - if len(fre) != len(fmt.Variables) { - t.Errorf("variable RE %q item format %q count mismatch: want %d, got %d", name, fmtName, len(fmt.Variables), len(fre)) - } + are, ok := adapters.VariableREs[name] + if !ok { + t.Fatalf("descriptor %q variable RE missing", name) + } + for varName := range desc.ItemVariables { + if _, ok := are[varName]; !ok { + t.Fatalf("descriptor %q variable %q RE entry missing", name, varName) } } } @@ -95,18 +86,21 @@ func TestGetItemVariables(t *testing.T) { t.Fatalf("CreateAdapters(store, warehouse): want success, got error: %v", err) } tests := []struct { - name string - item *pb.View_Item - expect map[string]string - fail bool + name string + service string + item *pb.View_Item + expect map[string]string + fail bool }{ { - name: "nil vars", - item: &pb.View_Item{}, - fail: false, + name: "nil vars", + service: "gcs", + item: &pb.View_Item{}, + fail: false, }, { - name: "empty vars", + name: "empty vars", + service: "gcs", item: &pb.View_Item{ Args: map[string]string{}, }, @@ -114,7 +108,8 @@ func TestGetItemVariables(t *testing.T) { fail: false, }, { - name: "bad variable name", + name: "bad variable name", + service: "gcs", item: &pb.View_Item{ Args: map[string]string{ "foo": "bar", @@ -123,7 +118,8 @@ func TestGetItemVariables(t *testing.T) { fail: true, }, { - name: "bad variable format", + name: "bad variable format", + service: "gcs", item: &pb.View_Item{ Args: map[string]string{ "bucket": "#$%#$%#$#", @@ -132,7 +128,8 @@ func TestGetItemVariables(t *testing.T) { fail: true, }, { - name: "good project and bucket", + name: "good project and bucket", + service: "gcs", item: &pb.View_Item{ Args: map[string]string{ "project": "foo", @@ -146,13 +143,13 @@ func TestGetItemVariables(t *testing.T) { fail: false, }, } - for _, test := range tests { - result, _, err := adapter.GetItemVariables(adapters, adapter.SawAdapterName, "gcs", test.item) - if test.fail != (err != nil) { - t.Fatalf("test %q error mismatch: want error %v, got error %v", test.name, test.fail, err) + for _, tc := range tests { + result, _, err := adapter.GetItemVariables(adapters, tc.service, tc.item) + if tc.fail != (err != nil) { + t.Fatalf("test %q error mismatch: want error %v, got error %v", tc.name, tc.fail, err) } - if err == nil && !reflect.DeepEqual(result, test.expect) { - t.Errorf("test %q results mismatch: want %v, got %v", test.name, test.expect, result) + if err == nil && !reflect.DeepEqual(result, tc.expect) { + t.Errorf("test %q results mismatch: want %v, got %v", tc.name, tc.expect, result) } } } @@ -212,17 +209,14 @@ func TestExperimentalVarsCheck(t *testing.T) { proto.Merge(&d, desc) fakeDesc := "fake" - fakeFormat := "foo" fakeVar := "testing" fakeVarValue := "test_value" - d.ItemFormats[fakeFormat] = &pb.ItemFormat{ - Variables: map[string]*pb.VariableFormat{ - fakeVar: &pb.VariableFormat{ - Regexp: ".", - Optional: true, - Experimental: true, - }, + d.ItemVariables = map[string]*pb.VariableFormat{ + fakeVar: &pb.VariableFormat{ + Regexp: ".", + Optional: true, + Experimental: true, }, } adapters.Descriptors[fakeDesc] = &d @@ -232,9 +226,9 @@ func TestExperimentalVarsCheck(t *testing.T) { globalflags.Experimental = true item := &pb.View_Item{Args: map[string]string{fakeVar: fakeVarValue}} - vars, path, err := adapter.GetItemVariables(adapters, fakeDesc, fakeFormat, item) + vars, path, err := adapter.GetItemVariables(adapters, fakeDesc, item) if err != nil { - t.Fatalf("GetItemVariables(adapters, %q, %q, %+v) failed at path %q: %v", fakeDesc, fakeFormat, item, path, err) + t.Fatalf("GetItemVariables(adapters, %q, %+v) failed at path %q: %v", fakeDesc, item, path, err) } if got, ok := vars[fakeVar]; !ok || got != fakeVarValue { t.Fatalf("item variable value not found or mismatch: got %q, want %q", got, fakeVarValue) @@ -242,8 +236,8 @@ func TestExperimentalVarsCheck(t *testing.T) { // Now test again with only one change to isolate Experimental behavior. globalflags.Experimental = false - vars, _, err = adapter.GetItemVariables(adapters, fakeDesc, fakeFormat, item) + vars, _, err = adapter.GetItemVariables(adapters, fakeDesc, item) if err == nil { - t.Fatalf("GetItemVariables(adapters, %q, %q, %+v) returned experimental variables in non-experimental mode: vars %+v", fakeDesc, fakeFormat, item, vars) + t.Fatalf("GetItemVariables(adapters, %q, %+v) returned experimental variables in non-experimental mode: vars %+v", fakeDesc, item, vars) } } diff --git a/lib/adapter/aggregator_adapter.go b/lib/adapter/aggregator_adapter.go index 1a2fb0ee..40ed58f0 100644 --- a/lib/adapter/aggregator_adapter.go +++ b/lib/adapter/aggregator_adapter.go @@ -21,6 +21,7 @@ import ( "github.com/GoogleCloudPlatform/healthcare-federated-access-services/lib/clouds" /* copybara-comment: clouds */ "github.com/GoogleCloudPlatform/healthcare-federated-access-services/lib/httputil" /* copybara-comment: httputil */ + "github.com/GoogleCloudPlatform/healthcare-federated-access-services/lib/srcutil" /* copybara-comment: srcutil */ "github.com/GoogleCloudPlatform/healthcare-federated-access-services/lib/storage" /* copybara-comment: storage */ pb "github.com/GoogleCloudPlatform/healthcare-federated-access-services/proto/dam/v1" /* copybara-comment: go_proto */ @@ -32,23 +33,24 @@ const ( // AggregatorAdapter combines views from other adapters. type AggregatorAdapter struct { - desc *pb.ServiceDescriptor + desc map[string]*pb.ServiceDescriptor sawAdapter ServiceAdapter } // NewAggregatorAdapter creates a AggregatorAdapter. func NewAggregatorAdapter(store storage.Store, warehouse clouds.ResourceTokenCreator, secrets *pb.DamSecrets, adapters *ServiceAdapters) (ServiceAdapter, error) { - var desc pb.ServiceDescriptor - if err := store.Read(AdapterDataType, storage.DefaultRealm, storage.DefaultUser, aggregatorName, storage.LatestRev, &desc); err != nil { - return nil, fmt.Errorf("reading %q descriptor: %v", aggregatorName, err) + var msg pb.ServicesResponse + path := adapterFilePath(aggregatorName) + if err := srcutil.LoadProto(path, &msg); err != nil { + return nil, fmt.Errorf("reading %q service descriptors from path %q: %v", aggregatorName, path, err) } - sawService, ok := adapters.ByName[SawAdapterName] + sawAdapter, ok := adapters.ByAdapterName[SawAdapterName] if !ok { return nil, fmt.Errorf("SAW adapter %q not available at time of view aggregator adapter initialization", SawAdapterName) } return &AggregatorAdapter{ - desc: &desc, - sawAdapter: sawService, + desc: msg.Services, + sawAdapter: sawAdapter, }, nil } @@ -62,8 +64,8 @@ func (a *AggregatorAdapter) Platform() string { return a.sawAdapter.Platform() } -// Descriptor returns a Service descriptor. -func (a *AggregatorAdapter) Descriptor() *pb.ServiceDescriptor { +// Descriptors returns a map of Service descriptors. +func (a *AggregatorAdapter) Descriptors() map[string]*pb.ServiceDescriptor { return a.desc } @@ -83,7 +85,7 @@ func (a *AggregatorAdapter) CheckConfig(templateName string, template *pb.Servic adapterName := "" adapterST := "" for iIdx, item := range view.Items { - vars, path, err := GetItemVariables(adapters, template.ServiceName, template.ItemFormat, item) + vars, path, err := GetItemVariables(adapters, template.ServiceName, item) if err != nil { return httputil.StatusPath("resources", resName, "views", viewName, "items", strconv.Itoa(iIdx), path), err } @@ -101,23 +103,27 @@ func (a *AggregatorAdapter) CheckConfig(templateName string, template *pb.Servic if !ok { return httputil.StatusPath("resources", refResName, "views", refViewName, "serviceTemplate"), fmt.Errorf("view service template %q not found", refView.ServiceTemplate) } + adapt, ok := adapters.ByServiceName[refSt.ServiceName] + if !ok { + return httputil.StatusPath("resources", refResName, "views", refViewName, "serviceTemplate"), fmt.Errorf("view service name %q not defined", refSt.ServiceName) + } if len(adapterName) == 0 { - adapterName = refSt.ServiceName + adapterName = adapt.Name() adapterST = refView.ServiceTemplate - } else if adapterName != refSt.ServiceName { - return httputil.StatusPath("resources", resName, "views", viewName, "items", strconv.Itoa(iIdx), "vars", "view"), fmt.Errorf("view service template %q target adapter %q does not match other items using target adapter %q", refView.ServiceTemplate, refSt.ServiceName, adapterName) + } else if adapterName != adapt.Name() { + return httputil.StatusPath("resources", resName, "views", viewName, "items", strconv.Itoa(iIdx), "vars", "view"), fmt.Errorf("view service template %q service adapter %q does not match other items using service adapter %q", refView.ServiceTemplate, refSt.ServiceName, adapterName) + } + desc, ok := adapters.Descriptors[refSt.ServiceName] + if !ok || desc == nil || desc.Properties == nil { + return httputil.StatusPath("serviceTemplates", adapterST, "serviceName", refSt.ServiceName), fmt.Errorf("lookup of descriptor properties for %q on adapter %q failed: desc:\n%+v", refSt.ServiceName, adapterName, desc) + } + if !desc.Properties.CanBeAggregated { + return httputil.StatusPath("serviceTemplates", adapterST, "targetService", "properties", "canBeAggregated"), fmt.Errorf("aggregation on service adapter %q not supported", adapterName) } } if adapterName == "" { return httputil.StatusPath("resources", resName, "views", viewName, "items"), fmt.Errorf("included views offer no items to aggregate") } - destService, ok := adapters.Descriptors[adapterName] - if !ok { - return httputil.StatusPath("serviceTemplates", adapterST, "targetService"), fmt.Errorf("target adapter %q not found", adapterName) - } - if !destService.Properties.CanBeAggregated { - return httputil.StatusPath("serviceTemplates", adapterST, "targetService", "properties", "canBeAggregated"), fmt.Errorf("aggregation on target adapter %q not supported", adapterName) - } return "", nil } diff --git a/lib/adapter/aggregator_adapter_test.go b/lib/adapter/aggregator_adapter_test.go index 845ab94f..ddae74aa 100644 --- a/lib/adapter/aggregator_adapter_test.go +++ b/lib/adapter/aggregator_adapter_test.go @@ -37,22 +37,29 @@ func TestAggregatorAdapter(t *testing.T) { t.Fatalf("reading secrets file: %v", err) } adapters := &adapter.ServiceAdapters{ - ByName: make(map[string]adapter.ServiceAdapter), - Descriptors: make(map[string]*pb.ServiceDescriptor), + ByAdapterName: make(map[string]adapter.ServiceAdapter), + ByServiceName: make(map[string]adapter.ServiceAdapter), + Descriptors: make(map[string]*pb.ServiceDescriptor), } saws, err := adapter.NewSawAdapter(store, warehouse, secrets, adapters) if err != nil { t.Fatalf("error creating SAW adapter: %v", err) } - adapters.ByName[saws.Name()] = saws - adapters.Descriptors[saws.Name()] = saws.Descriptor() + adapters.ByAdapterName[adapter.SawAdapterName] = saws + for k, v := range saws.Descriptors() { + adapters.ByServiceName[k] = saws + adapters.Descriptors[k] = v + } adapt, err := adapter.NewAggregatorAdapter(store, warehouse, secrets, adapters) if err != nil { t.Fatalf("new aggregator adapter: %v", err) } - adapters.ByName[adapt.Name()] = adapt - adapters.Descriptors[adapt.Name()] = adapt.Descriptor() + adapters.ByAdapterName[adapter.SawAdapterName] = adapt + for k, v := range adapt.Descriptors() { + adapters.ByServiceName[k] = adapt + adapters.Descriptors[k] = v + } var cfg pb.DamConfig cfgStore := storage.NewMemoryStorage("dam", "testdata/config") if err = cfgStore.Read(storage.ConfigDatatype, storage.DefaultRealm, storage.DefaultUser, storage.DefaultID, storage.LatestRev, &cfg); err != nil { diff --git a/lib/adapter/gatekeeper_adapter.go b/lib/adapter/gatekeeper_adapter.go index d40a008a..f3c4a9f5 100644 --- a/lib/adapter/gatekeeper_adapter.go +++ b/lib/adapter/gatekeeper_adapter.go @@ -25,6 +25,7 @@ import ( "github.com/pborman/uuid" /* copybara-comment */ "github.com/GoogleCloudPlatform/healthcare-federated-access-services/lib/clouds" /* copybara-comment: clouds */ "github.com/GoogleCloudPlatform/healthcare-federated-access-services/lib/httputil" /* copybara-comment: httputil */ + "github.com/GoogleCloudPlatform/healthcare-federated-access-services/lib/srcutil" /* copybara-comment: srcutil */ "github.com/GoogleCloudPlatform/healthcare-federated-access-services/lib/storage" /* copybara-comment: storage */ "github.com/GoogleCloudPlatform/healthcare-federated-access-services/lib/timeutil" /* copybara-comment: timeutil */ @@ -49,15 +50,16 @@ type GatekeeperToken struct { // GatekeeperAdapter generates downstream access tokens. type GatekeeperAdapter struct { - desc *pb.ServiceDescriptor + desc map[string]*pb.ServiceDescriptor privateKey string } // NewGatekeeperAdapter creates a GatekeeperAdapter. func NewGatekeeperAdapter(store storage.Store, warehouse clouds.ResourceTokenCreator, secrets *pb.DamSecrets, adapters *ServiceAdapters) (ServiceAdapter, error) { - var desc pb.ServiceDescriptor - if err := store.Read(AdapterDataType, storage.DefaultRealm, storage.DefaultUser, gatekeeperName, storage.LatestRev, &desc); err != nil { - return nil, fmt.Errorf("reading %q descriptor: %v", gatekeeperName, err) + var msg pb.ServicesResponse + path := adapterFilePath(gatekeeperName) + if err := srcutil.LoadProto(path, &msg); err != nil { + return nil, fmt.Errorf("reading %q service descriptors from path %q: %v", aggregatorName, path, err) } keys := secrets.GetGatekeeperTokenKeys() if keys == nil { @@ -65,7 +67,7 @@ func NewGatekeeperAdapter(store storage.Store, warehouse clouds.ResourceTokenCre } return &GatekeeperAdapter{ - desc: &desc, + desc: msg.Services, privateKey: keys.PrivateKey, }, nil } @@ -80,8 +82,8 @@ func (a *GatekeeperAdapter) Platform() string { return gatekeeperPlatform } -// Descriptor returns a ServiceAdapter descriptor. -func (a *GatekeeperAdapter) Descriptor() *pb.ServiceDescriptor { +// Descriptors returns a map of ServiceAdapter descriptors. +func (a *GatekeeperAdapter) Descriptors() map[string]*pb.ServiceDescriptor { return a.desc } @@ -110,7 +112,11 @@ func (a *GatekeeperAdapter) MintToken(ctx context.Context, input *Action) (*Mint } now := time.Now() aud := "" + // TODO: support standard audience formats instead of space-delimited. for _, item := range input.View.Items { + if item.Args == nil { + continue + } if a, ok := item.Args["aud"]; ok { if aud == "" { aud += " " @@ -118,6 +124,11 @@ func (a *GatekeeperAdapter) MintToken(ctx context.Context, input *Action) (*Mint aud += a } } + scopes := []string{} + arg, ok := input.ServiceRole.ServiceArgs["scopes"] + if ok { + scopes = arg.Values + } claims := &GatekeeperToken{ StandardClaims: &jwt.StandardClaims{ @@ -129,7 +140,7 @@ func (a *GatekeeperAdapter) MintToken(ctx context.Context, input *Action) (*Mint IssuedAt: now.Unix(), Id: uuid.New(), }, - Scopes: input.ServiceRole.TargetScopes, + Scopes: scopes, } jot := jwt.NewWithClaims(jwt.SigningMethodRS256, claims) diff --git a/lib/adapter/gatekeeper_adapter_test.go b/lib/adapter/gatekeeper_adapter_test.go index e9b04fbc..488d3ef8 100644 --- a/lib/adapter/gatekeeper_adapter_test.go +++ b/lib/adapter/gatekeeper_adapter_test.go @@ -36,8 +36,9 @@ func TestGatekeeperAdapter(t *testing.T) { t.Fatalf("reading secrets file: %v", err) } adapters := &adapter.ServiceAdapters{ - ByName: make(map[string]adapter.ServiceAdapter), - Descriptors: make(map[string]*pb.ServiceDescriptor), + ByAdapterName: make(map[string]adapter.ServiceAdapter), + ByServiceName: make(map[string]adapter.ServiceAdapter), + Descriptors: make(map[string]*pb.ServiceDescriptor), } adapt, err := adapter.NewGatekeeperAdapter(store, warehouse, secrets, adapters) if err != nil { diff --git a/lib/adapter/saw_adapter.go b/lib/adapter/saw_adapter.go index a5c39125..3c7e2f04 100644 --- a/lib/adapter/saw_adapter.go +++ b/lib/adapter/saw_adapter.go @@ -21,6 +21,7 @@ import ( "github.com/GoogleCloudPlatform/healthcare-federated-access-services/lib/clouds" /* copybara-comment: clouds */ "github.com/GoogleCloudPlatform/healthcare-federated-access-services/lib/ga4gh" /* copybara-comment: ga4gh */ "github.com/GoogleCloudPlatform/healthcare-federated-access-services/lib/httputil" /* copybara-comment: httputil */ + "github.com/GoogleCloudPlatform/healthcare-federated-access-services/lib/srcutil" /* copybara-comment: srcutil */ "github.com/GoogleCloudPlatform/healthcare-federated-access-services/lib/storage" /* copybara-comment: storage */ "github.com/GoogleCloudPlatform/healthcare-federated-access-services/lib/timeutil" /* copybara-comment: timeutil */ @@ -29,8 +30,7 @@ import ( const ( // SawAdapterName is the name identifier exposed in config files. - SawAdapterName = "token:gcp:sa" - sawName = "saw" + SawAdapterName = "saw" sawPlatform = "gcp" // SawMaxUserIDLength is the service account desc max length. SawMaxUserIDLength = 100 @@ -40,18 +40,19 @@ const ( // SawAdapter is a Service Account Warehouse (SAW) adapter. type SawAdapter struct { - desc *pb.ServiceDescriptor + desc map[string]*pb.ServiceDescriptor warehouse clouds.ResourceTokenCreator } // NewSawAdapter creates a Service Account Warehouse (SAW) adapter. func NewSawAdapter(store storage.Store, warehouse clouds.ResourceTokenCreator, secrets *pb.DamSecrets, adapters *ServiceAdapters) (ServiceAdapter, error) { - var desc pb.ServiceDescriptor - if err := store.Read(AdapterDataType, storage.DefaultRealm, storage.DefaultUser, sawName, storage.LatestRev, &desc); err != nil { - return nil, fmt.Errorf("reading %q descriptor: %v", sawName, err) + var msg pb.ServicesResponse + path := adapterFilePath(SawAdapterName) + if err := srcutil.LoadProto(path, &msg); err != nil { + return nil, fmt.Errorf("reading %q service descriptors from path %q: %v", aggregatorName, path, err) } return &SawAdapter{ - desc: &desc, + desc: msg.Services, warehouse: warehouse, }, nil } @@ -66,8 +67,8 @@ func (a *SawAdapter) Platform() string { return sawPlatform } -// Descriptor returns a ServiceDescriptor descriptor. -func (a *SawAdapter) Descriptor() *pb.ServiceDescriptor { +// Descriptors returns a map of ServiceDescriptor descriptor. +func (a *SawAdapter) Descriptors() map[string]*pb.ServiceDescriptor { return a.desc } @@ -79,7 +80,7 @@ func (a *SawAdapter) IsAggregator() bool { // CheckConfig validates that a new configuration is compatible with this adapter. func (a *SawAdapter) CheckConfig(templateName string, template *pb.ServiceTemplate, resName, viewName string, view *pb.View, cfg *pb.DamConfig, adapters *ServiceAdapters) (string, error) { if cfg.Options == nil || len(cfg.Options.GcpServiceAccountProject) == 0 { - return httputil.StatusPath("serviceTemplates", templateName, "targetAdapter"), fmt.Errorf("target adapter uses service accounts but options.gcpServiceAccountProject is not defined") + return httputil.StatusPath("serviceTemplates", templateName, "targetAdapter"), fmt.Errorf("service adapter uses service accounts but options.gcpServiceAccountProject is not defined") } return "", nil } @@ -108,13 +109,13 @@ func (a *SawAdapter) MintToken(ctx context.Context, input *Action) (*MintTokenRe func resourceTokenCreationParams(role string, template *pb.ServiceTemplate, sRole *pb.ServiceRole, view *pb.View, cfg *pb.DamConfig, format string) (*clouds.ResourceTokenCreationParams, error) { roles := []string{} - scopes := []string{} + scopes := []string{"https://www.googleapis.com/auth/cloud-platform"} if sRole != nil { - if len(sRole.TargetRoles) > 0 { - roles = append(roles, sRole.TargetRoles...) + if arg, ok := sRole.ServiceArgs["roles"]; ok { + roles = arg.Values } - if len(sRole.TargetScopes) > 0 { - scopes = append(scopes, sRole.TargetScopes...) + if arg, ok := sRole.ServiceArgs["scopes"]; ok { + scopes = arg.Values } } items := make([]map[string]string, len(view.Items)) diff --git a/lib/adapter/saw_adapter_test.go b/lib/adapter/saw_adapter_test.go index 08fb37e0..e975b5fd 100644 --- a/lib/adapter/saw_adapter_test.go +++ b/lib/adapter/saw_adapter_test.go @@ -37,8 +37,9 @@ func TestSawAdapter(t *testing.T) { t.Fatalf("reading secrets file: %v", err) } adapters := &adapter.ServiceAdapters{ - ByName: make(map[string]adapter.ServiceAdapter), - Descriptors: make(map[string]*pb.ServiceDescriptor), + ByAdapterName: make(map[string]adapter.ServiceAdapter), + ByServiceName: make(map[string]adapter.ServiceAdapter), + Descriptors: make(map[string]*pb.ServiceDescriptor), } adapt, err := adapter.NewSawAdapter(store, warehouse, secrets, adapters) if err != nil { @@ -170,7 +171,6 @@ func TestSawAdapter(t *testing.T) { "bucket": "dataset-example-payer-bucket2", "project": "dataset-example-project", "type": "requester-pays", - "paths": "/hello/there*;/goodbye/charlie", }, }, Roles: []string{"roles/storage.objectViewer"}, diff --git a/lib/dam/config.go b/lib/dam/config.go index f46ac259..7fd919b6 100644 --- a/lib/dam/config.go +++ b/lib/dam/config.go @@ -124,7 +124,7 @@ func (s *Service) GetFlatViews(w http.ResponseWriter, r *http.Request) { Metadata: meta, ServiceName: st.ServiceName, Platform: desc.Platform, - PlatformService: st.ItemFormat, + PlatformService: st.ServiceName, // for now it is the same name as ServiceName MaxTokenTtl: res.MaxTokenTtl, ResourceUi: res.Ui, ViewUi: v.Ui, @@ -287,8 +287,8 @@ func (s *Service) GetViewRole(w http.ResponseWriter, r *http.Request) { httputil.WriteProtoResp(w, proto.Message(&resp)) } -// GetTargetAdapters implements the corresponding REST API endpoint. -func (s *Service) GetTargetAdapters(w http.ResponseWriter, r *http.Request) { +// GetServiceDescriptors implements the corresponding REST API endpoint. +func (s *Service) GetServiceDescriptors(w http.ResponseWriter, r *http.Request) { out := &pb.ServicesResponse{ Services: s.adapters.Descriptors, } diff --git a/lib/dam/config_test.go b/lib/dam/config_test.go index 28063e76..aa9f6700 100644 --- a/lib/dam/config_test.go +++ b/lib/dam/config_test.go @@ -91,13 +91,13 @@ func TestConfigHandlers(t *testing.T) { { Method: "GET", Path: "/dam/v1alpha/test/flatViews", - Output: `*"views":{"/dataset_example/bq_read/viewer/http:gcp:bq/text/csv":{"resourcePath":"/dam/v1alpha/test/resources/dataset_example/views/bq_read/roles/viewer","umbrella":"dataset_example","resourceName":"dataset_example","viewName":"bq_read","roleName":"viewer","interfaceName":"http:gcp:bq","interfaceUri":"https://www.googleapis.com/bigquery/v1/projects/dataset-example-project","contentType":"*","metadata":{*},"serviceName":"token:gcp:sa","platform":"gcp","platformService":"bigquery","maxTokenTtl":"3h","resourceUi":{*},"viewUi":{*},"roleUi":{*},"roleCategories":["list","metadata","read"]},"/dataset_example/gcp/viewer/gcp:gs/application/bam":{"resourcePath":"/dam/v1alpha/test/resources/dataset_example/views/gcp/roles/viewer","umbrella":"dataset_example","resourceName":"dataset_example","viewName":"gcp","roleName":"viewer","interfaceName":"gcp:gs","interfaceUri":"gs://dataset-example-bucket2","contentType":"application/bam"*`, + Output: `*"views":{"/dataset_example/bq_read/viewer/http:gcp:bq/text/csv":{"resourcePath":"/dam/v1alpha/test/resources/dataset_example/views/bq_read/roles/viewer","umbrella":"dataset_example","resourceName":"dataset_example","viewName":"bq_read","roleName":"viewer","interfaceName":"http:gcp:bq","interfaceUri":"https://www.googleapis.com/bigquery/v1/projects/dataset-example-project","contentType":"*","metadata":{*},"serviceName":"bigquery","platform":"gcp","platformService":"bigquery","maxTokenTtl":"3h","resourceUi":{*},"viewUi":{*},"roleUi":{*},"roleCategories":["list","metadata","read"]*`, Status: http.StatusOK, }, { Method: "GET", - Path: "/dam/v1alpha/master/targetAdapters", - Output: `*"token:gcp:sa":{"platform":"gcp",*,*"properties":{"canBeAggregated":true},"itemFormats":{"bigquery":{"variables":{"dataset":*,"project":*},"ui":*},"gcs":{"variables":{"bucket":*,"paths":*,"project":*,"type":*}*`, + Path: "/dam/v1alpha/master/services", + Output: `*"gcs":{"platform":"gcp","serviceVariables":{*},"itemVariables":{"bucket":*,"paths":*,"project":*,"type":*},"properties":{"canBeAggregated":true}*`, Status: http.StatusOK, }, { diff --git a/lib/dam/dam.go b/lib/dam/dam.go index 8980e567..d73e85b2 100644 --- a/lib/dam/dam.go +++ b/lib/dam/dam.go @@ -46,6 +46,7 @@ import ( "github.com/GoogleCloudPlatform/healthcare-federated-access-services/lib/oathclients" /* copybara-comment: oathclients */ "github.com/GoogleCloudPlatform/healthcare-federated-access-services/lib/permissions" /* copybara-comment: permissions */ "github.com/GoogleCloudPlatform/healthcare-federated-access-services/lib/persona" /* copybara-comment: persona */ + "github.com/GoogleCloudPlatform/healthcare-federated-access-services/lib/srcutil" /* copybara-comment: srcutil */ "github.com/GoogleCloudPlatform/healthcare-federated-access-services/lib/storage" /* copybara-comment: storage */ "github.com/GoogleCloudPlatform/healthcare-federated-access-services/lib/timeutil" /* copybara-comment: timeutil */ "github.com/GoogleCloudPlatform/healthcare-federated-access-services/lib/translator" /* copybara-comment: translator */ @@ -139,10 +140,9 @@ type Options struct { // NewService create DAM service func NewService(params *Options) *Service { - fs := getFileStore(params.Store, damStaticService) var roleCat pb.DamRoleCategoriesResponse - if err := fs.Read("role", storage.DefaultRealm, storage.DefaultUser, "en", storage.LatestRev, &roleCat); err != nil { - glog.Fatalf("cannot load role categories: %v", err) + if err := srcutil.LoadProto("deploy/metadata/dam_roles.json", &roleCat); err != nil { + glog.Fatalf("cannot load role categories file %q: %v", "deploy/metadata/dam_roles.json", err) } perms, err := permissions.LoadPermissions(params.Store) if err != nil { @@ -192,11 +192,11 @@ func NewService(params *Options) *Service { if err != nil { glog.Fatalf("cannot load client secrets: %v", err) } - services, err := adapter.CreateAdapters(fs, params.Warehouse, secrets) + adapters, err := adapter.CreateAdapters(params.Store, params.Warehouse, secrets) if err != nil { glog.Fatalf("cannot load adapters: %v", err) } - s.adapters = services + s.adapters = adapters cfg, err := s.loadConfig(nil, storage.DefaultRealm) if err != nil { @@ -460,20 +460,20 @@ func (s *Service) getPassportIdentity(cfg *pb.DamConfig, tx storage.Tx, r *http. return id, http.StatusOK, nil } -func testPersona(ctx context.Context, personaName string, resources []string, cfg *pb.DamConfig, vopts ValidateCfgOpts) (string, []string, error) { +func testPersona(ctx context.Context, personaName string, resources []string, cfg *pb.DamConfig, vopts ValidateCfgOpts) (string, []string, []*ga4gh.RejectedVisa, error) { p := cfg.TestPersonas[personaName] id, err := persona.ToIdentity(personaName, p, defaultPersonaScope, "") if err != nil { - return "INVALID", nil, err + return "INVALID", nil, nil, err } state, got, err := resolveAccessList(ctx, id, resources, nil, nil, cfg, vopts) if err != nil { - return state, got, err + return state, got, id.RejectedVisas, err } if reflect.DeepEqual(p.Access, got) || (len(p.Access) == 0 && len(got) == 0) { - return "PASSED", got, nil + return "PASSED", got, id.RejectedVisas, nil } - return "FAILED", got, fmt.Errorf("access does not match expectations") + return "FAILED", got, id.RejectedVisas, fmt.Errorf("access does not match expectations") } // syncToHydra pushes the configuration of clients and secrets to Hydra. @@ -619,7 +619,7 @@ func resolveAggregates(srcRes *pb.Resource, srcView *pb.View, cfg *pb.DamConfig, } serviceName := "" for index, item := range srcView.Items { - vars, _, err := adapter.GetItemVariables(tas, st.ServiceName, st.ItemFormat, item) + vars, _, err := adapter.GetItemVariables(tas, st.ServiceName, item) if err != nil { return nil, fmt.Errorf("item %d: %v", index+1, err) } @@ -780,7 +780,7 @@ func makeViewInterfaces(srcView *pb.View, srcRes *pb.Resource, cfg *pb.DamConfig return out } for _, item := range entry.View.Items { - vars, _, err := adapter.GetItemVariables(tas, st.ServiceName, st.ItemFormat, item) + vars, _, err := adapter.GetItemVariables(tas, st.ServiceName, item) if err != nil { return out } @@ -1252,7 +1252,7 @@ func registerHandlers(r *mux.Router, s *Service) { r.HandleFunc(viewPath, auth.MustWithAuth(s.GetView, checker, auth.RequireClientIDAndSecret)).Methods(http.MethodGet) r.HandleFunc(rolesPath, auth.MustWithAuth(s.GetViewRoles, checker, auth.RequireClientIDAndSecret)).Methods(http.MethodGet) r.HandleFunc(rolePath, auth.MustWithAuth(s.GetViewRole, checker, auth.RequireClientIDAndSecret)).Methods(http.MethodGet) - r.HandleFunc(adaptersPath, auth.MustWithAuth(s.GetTargetAdapters, checker, auth.RequireClientIDAndSecret)).Methods(http.MethodGet) + r.HandleFunc(servicesPath, auth.MustWithAuth(s.GetServiceDescriptors, checker, auth.RequireClientIDAndSecret)).Methods(http.MethodGet) r.HandleFunc(translatorsPath, auth.MustWithAuth(s.GetPassportTranslators, checker, auth.RequireClientIDAndSecret)).Methods(http.MethodGet) r.HandleFunc(damRoleCategoriesPath, auth.MustWithAuth(s.GetDamRoleCategories, checker, auth.RequireClientIDAndSecret)).Methods(http.MethodGet) r.HandleFunc(testPersonasPath, auth.MustWithAuth(s.GetTestPersonas, checker, auth.RequireClientIDAndSecret)).Methods(http.MethodGet) diff --git a/lib/dam/dam_integrity.go b/lib/dam/dam_integrity.go index 2cfd4c42..db33a8b1 100644 --- a/lib/dam/dam_integrity.go +++ b/lib/dam/dam_integrity.go @@ -28,6 +28,7 @@ import ( "google.golang.org/grpc/status" /* copybara-comment */ "github.com/GoogleCloudPlatform/healthcare-federated-access-services/lib/adapter" /* copybara-comment: adapter */ "github.com/GoogleCloudPlatform/healthcare-federated-access-services/lib/check" /* copybara-comment: check */ + "github.com/GoogleCloudPlatform/healthcare-federated-access-services/lib/ga4gh" /* copybara-comment: ga4gh */ "github.com/GoogleCloudPlatform/healthcare-federated-access-services/lib/httputil" /* copybara-comment: httputil */ "github.com/GoogleCloudPlatform/healthcare-federated-access-services/lib/oathclients" /* copybara-comment: oathclients */ "github.com/GoogleCloudPlatform/healthcare-federated-access-services/lib/persona" /* copybara-comment: persona */ @@ -304,30 +305,22 @@ func checkServiceTemplate(name string, template *pb.ServiceTemplate, cfg *pb.Dam if len(template.ServiceName) == 0 { return httputil.NewInfoStatus(codes.InvalidArgument, httputil.StatusPath(cfgServiceTemplates, name, "serviceName"), "service is not specified") } - service, ok := vopts.Services.ByName[template.ServiceName] + service, ok := vopts.Services.ByServiceName[template.ServiceName] if !ok { return httputil.NewInfoStatus(codes.InvalidArgument, httputil.StatusPath(cfgServiceTemplates, name, "serviceName", template.ServiceName), "service is not a recognized by this DAM") } if path, err := service.CheckConfig(name, template, "", "", nil, cfg, vopts.Services); err != nil { return httputil.NewInfoStatus(codes.InvalidArgument, path, err.Error()) } - if len(template.ItemFormat) == 0 { - return httputil.NewInfoStatus(codes.InvalidArgument, httputil.StatusPath(cfgServiceTemplates, name, "itemFormat"), "item format is not specified") - } - if _, ok = service.Descriptor().ItemFormats[template.ItemFormat]; !ok { - return httputil.NewInfoStatus(codes.InvalidArgument, httputil.StatusPath(cfgServiceTemplates, name, "itemFormat"), fmt.Sprintf("item format %q is invalid", template.ItemFormat)) - } - if path, err := checkServiceRoles(template.ServiceRoles, name, template.ServiceName, template.ItemFormat, cfg, vopts); err != nil { + if path, err := checkServiceRoles(template.ServiceRoles, name, template.ServiceName, cfg, vopts); err != nil { return httputil.NewInfoStatus(codes.InvalidArgument, path, err.Error()) } varNames := make(map[string]bool) desc := vopts.Services.Descriptors[template.ServiceName] - for _, v := range desc.ItemFormats { - for varName, v := range v.Variables { - varNames[varName] = true - if v.Type != "const" && v.Type != "split_pattern" { - return httputil.NewInfoStatus(codes.Internal, httputil.StatusPath(cfgServiceTemplates, name, "itemFormats", template.ItemFormat, "variables", varName, "type"), fmt.Sprintf("variable type %q must be %q or %q", v.Type, "const", "split_pattern")) - } + for varName, v := range desc.ItemVariables { + varNames[varName] = true + if v.Type != "const" && v.Type != "split_pattern" { + return httputil.NewInfoStatus(codes.Internal, httputil.StatusPath("serviceDescriptors", template.ServiceName, "itemVariables", varName, "type"), fmt.Sprintf("variable type %q must be %q or %q", v.Type, "const", "split_pattern")) } } for k, v := range template.Interfaces { @@ -347,37 +340,28 @@ func checkServiceTemplate(name string, template *pb.ServiceTemplate, cfg *pb.Dam } func checkAccessRequirements(templateName string, template *pb.ServiceTemplate, resName, viewName string, view *pb.View, cfg *pb.DamConfig, vopts ValidateCfgOpts) (string, error) { - adapt, ok := vopts.Services.ByName[template.ServiceName] + adapt, ok := vopts.Services.ByServiceName[template.ServiceName] if !ok { return httputil.StatusPath("services"), fmt.Errorf("service template %q service %q is not a recognized by this DAM", templateName, template.ServiceName) } if path, err := adapt.CheckConfig(templateName, template, resName, viewName, view, cfg, vopts.Services); err != nil { return path, err } - if path, err := checkAccessRoles(view.Roles, templateName, template.ServiceName, template.ItemFormat, cfg, vopts); err != nil { + if path, err := checkAccessRoles(view.Roles, templateName, template.ServiceName, cfg, vopts); err != nil { return httputil.StatusPath("views", viewName, "roles", path), fmt.Errorf("view %q roles: %v", viewName, err) } - desc := adapt.Descriptor() - if desc.Requirements.Aud { - found := false - for _, item := range view.Items { - if item.Args["aud"] != "" { - found = true - break - } - } - if !found { - return httputil.StatusPath("views", viewName, "aud"), fmt.Errorf("view %q does not provide an audience", viewName) - } + desc, ok := vopts.Services.Descriptors[template.ServiceName] + if !ok { + return httputil.StatusPath("services", template.ServiceName), fmt.Errorf("internal error: service %q does not have a service descriptor", template.ServiceName) } - if len(desc.ItemFormats) > 0 && len(view.Items) == 0 { + if len(desc.ItemVariables) > 0 && len(view.Items) == 0 { return httputil.StatusPath("views", viewName, "items"), fmt.Errorf("view %q does not provide any target items", viewName) } - if len(desc.ItemFormats) > 0 && desc.Properties != nil && desc.Properties.SingleItem && len(view.Items) > 1 { + if len(desc.ItemVariables) > 0 && desc.Properties != nil && desc.Properties.SingleItem && len(view.Items) > 1 { return httputil.StatusPath("views", viewName, "items"), fmt.Errorf("view %q provides more than one item when only one was expected for service %q", viewName, template.ServiceName) } for idx, item := range view.Items { - vars, path, err := adapter.GetItemVariables(vopts.Services, template.ServiceName, template.ItemFormat, item) + vars, path, err := adapter.GetItemVariables(vopts.Services, template.ServiceName, item) if err != nil { return httputil.StatusPath("views", viewName, "items", strconv.Itoa(idx), path), err } @@ -388,7 +372,7 @@ func checkAccessRequirements(templateName string, template *pb.ServiceTemplate, return "", nil } -func checkAccessRoles(roles map[string]*pb.ViewRole, templateName, serviceName, itemFormat string, cfg *pb.DamConfig, vopts ValidateCfgOpts) (string, error) { +func checkAccessRoles(roles map[string]*pb.ViewRole, templateName, serviceName string, cfg *pb.DamConfig, vopts ValidateCfgOpts) (string, error) { if len(roles) == 0 { return "", fmt.Errorf("does not provide any roles") } @@ -424,7 +408,7 @@ func checkAccessRoles(roles map[string]*pb.ViewRole, templateName, serviceName, return "", nil } -func checkServiceRoles(roles map[string]*pb.ServiceRole, templateName, serviceName, itemFormat string, cfg *pb.DamConfig, vopts ValidateCfgOpts) (string, error) { +func checkServiceRoles(roles map[string]*pb.ServiceRole, templateName, serviceName string, cfg *pb.DamConfig, vopts ValidateCfgOpts) (string, error) { if len(roles) == 0 { return httputil.StatusPath(cfgServiceTemplates, templateName, "roles"), fmt.Errorf("no roles provided") } @@ -444,16 +428,31 @@ func checkServiceRoles(roles map[string]*pb.ServiceRole, templateName, serviceNa strings.Join(roleCategorySet(vopts.RoleCategories), ", ")) } } - if desc.Requirements.TargetRole && len(role.TargetRoles) == 0 { - return httputil.StatusPath(cfgServiceTemplates, templateName, "roles", rname, "targetRoles"), fmt.Errorf("role %q does not provide any target role assignments", rname) - } - for ri, rv := range role.TargetRoles { - if len(rv) == 0 { - return httputil.StatusPath(cfgServiceTemplates, templateName, "roles", rname, "targetRoles", strconv.Itoa(ri)), fmt.Errorf("target role is empty") + for vname, def := range desc.ServiceVariables { + arg, ok := role.ServiceArgs[vname] + if !ok { + if def.Optional { + continue + } + return httputil.StatusPath(cfgServiceTemplates, templateName, "roles", rname, "serviceArgs", vname), fmt.Errorf("missing required service argument %q", vname) + } + re, err := regexp.Compile(def.Regexp) + if err != nil { + return httputil.StatusPath("services", templateName, "serviceArgs", vname), fmt.Errorf("variable format regexp %q is not a valid regular expression", def.Regexp) + } + for ival, val := range arg.Values { + if len(val) == 0 { + return httputil.StatusPath(cfgServiceTemplates, templateName, "roles", rname, "serviceArgs", vname, "values", strconv.Itoa(ival)), fmt.Errorf("service argument value %d is empty", ival) + } + if !re.MatchString(val) { + return httputil.StatusPath(cfgServiceTemplates, templateName, "roles", rname, "serviceArgs", vname, "values", strconv.Itoa(ival)), fmt.Errorf("service argument value %q is not valid", val) + } } } - if desc.Requirements.TargetScope && len(role.TargetScopes) == 0 { - return httputil.StatusPath(cfgServiceTemplates, templateName, "roles", rname, "targetScopes"), fmt.Errorf("role %q does not provide any target scopes assignments", rname) + for aname := range role.ServiceArgs { + if _, ok := desc.ServiceVariables[aname]; !ok { + return httputil.StatusPath(cfgServiceTemplates, templateName, "roles", rname, "serviceArgs", aname), fmt.Errorf("service argument name %q is not a known input for service %q", aname, serviceName) + } } if path, err := check.CheckUI(role.Ui, true); err != nil { return httputil.StatusPath(cfgServiceTemplates, templateName, "roles", rname, path), fmt.Errorf("role %q: %v", rname, err) @@ -593,7 +592,7 @@ func runTests(ctx context.Context, cfg *pb.DamConfig, resources []string, vopts Passport: p.Passport, Access: p.Access, } - status, got, err := testPersona(ctx, pname, resources, cfg, vopts) + status, got, rejectedVisas, err := testPersona(ctx, pname, resources, cfg, vopts) e := "" if err == nil { passed++ @@ -601,10 +600,11 @@ func runTests(ctx context.Context, cfg *pb.DamConfig, resources []string, vopts e = err.Error() } results = append(results, &pb.GetTestResultsResponse_TestResult{ - Name: pname, - Result: status, - Access: got, - Error: e, + Name: pname, + Result: status, + Access: got, + RejectedVisas: makeRejectedVisas(rejectedVisas), + Error: e, }) calculateModification(pname, p.Access, got, modification, vopts) } @@ -626,6 +626,25 @@ func runTests(ctx context.Context, cfg *pb.DamConfig, resources []string, vopts } } +func makeRejectedVisas(rejected []*ga4gh.RejectedVisa) []*pb.GetTestResultsResponse_RejectedVisa { + if len(rejected) == 0 { + return nil + } + out := []*pb.GetTestResultsResponse_RejectedVisa{} + for _, reject := range rejected { + out = append(out, &pb.GetTestResultsResponse_RejectedVisa{ + Reason: reject.Rejection.Reason, + Field: reject.Rejection.Field, + Description: reject.Rejection.Description, + VisaType: string(reject.Assertion.Type), + Source: string(reject.Assertion.Source), + Value: string(reject.Assertion.Value), + By: string(reject.Assertion.By), + }) + } + return out +} + func hasTestError(tr *pb.GetTestResultsResponse) bool { return len(tr.Error) > 0 } diff --git a/lib/dam/dam_test.go b/lib/dam/dam_test.go index 6b2e4a43..bf37036a 100644 --- a/lib/dam/dam_test.go +++ b/lib/dam/dam_test.go @@ -599,7 +599,7 @@ func TestHandlers(t *testing.T) { Method: "GET", Path: "/dam/v1alpha/test/config/serviceTemplates/gcs", Persona: "admin", - Output: `*"serviceName":"token:gcp:sa"*`, + Output: `*"serviceName":"gcs"*`, Status: http.StatusOK, }, { @@ -623,10 +623,9 @@ func TestHandlers(t *testing.T) { Persona: "admin", Input: `{"item":{"interfaces":{"gcp:gs":"gs://${bucket}"},"ui":{"label":"foo","description":"bar"}, "roles": { "viewer": { - "targetRoles": ["roles/storage.objectViewer"], - "targetScopes": [ - "https://www.googleapis.com/auth/cloud-platform" - ], + "serviceArgs": { + "roles": {"values": ["roles/storage.objectViewer"]} + }, "damRoleCategories": ["metadata", "list", "read"], "ui": { "label": "File Viewer", diff --git a/lib/dam/endpoints.go b/lib/dam/endpoints.go index d68964b8..a00db327 100644 --- a/lib/dam/endpoints.go +++ b/lib/dam/endpoints.go @@ -99,7 +99,7 @@ const ( viewPath = "/dam/v1alpha/{realm}/resources/{name}/views/{view}" rolesPath = "/dam/v1alpha/{realm}/resources/{name}/views/{view}/roles" rolePath = "/dam/v1alpha/{realm}/resources/{name}/views/{view}/roles/{role}" - adaptersPath = "/dam/v1alpha/{realm}/targetAdapters" + servicesPath = "/dam/v1alpha/{realm}/services" translatorsPath = "/dam/v1alpha/{realm}/passportTranslators" damRoleCategoriesPath = "/dam/v1alpha/{realm}/damRoleCategories" testPersonasPath = "/dam/v1alpha/{realm}/testPersonas" diff --git a/lib/dam/token_flow.go b/lib/dam/token_flow.go index 75978904..c020252d 100644 --- a/lib/dam/token_flow.go +++ b/lib/dam/token_flow.go @@ -117,9 +117,9 @@ func (s *Service) generateResourceToken(ctx context.Context, clientID, resourceN if !ok { return nil, http.StatusInternalServerError, fmt.Errorf("view %q service template %q is not defined", viewName, view.ServiceTemplate) } - service := s.adapters.ByName[st.ServiceName] + adapt := s.adapters.ByServiceName[st.ServiceName] var aggregates []*adapter.AggregateView - if service.IsAggregator() { + if adapt.IsAggregator() { aggregates, err = resolveAggregates(res, view, cfg, s.adapters) if err != nil { return nil, http.StatusInternalServerError, err @@ -144,7 +144,7 @@ func (s *Service) generateResourceToken(ctx context.Context, clientID, resourceN View: view, TokenFormat: tokenFormat, } - result, err := service.MintToken(ctx, adapterAction) + result, err := adapt.MintToken(ctx, adapterAction) if err != nil { return nil, http.StatusServiceUnavailable, err } @@ -154,7 +154,7 @@ func (s *Service) generateResourceToken(ctx context.Context, clientID, resourceN Account: result.Account, AccessToken: result.Token, ExpiresIn: uint32(ttl.Seconds()), - Platform: service.Platform(), + Platform: adapt.Platform(), // TODO: remove these older fields Name: resourceName, View: makeView(viewName, view, res, cfg, s.hidePolicyBasis, s.adapters), diff --git a/lib/srcutil/srcutil.go b/lib/srcutil/srcutil.go index d0505721..964829cc 100644 --- a/lib/srcutil/srcutil.go +++ b/lib/srcutil/srcutil.go @@ -16,10 +16,15 @@ package srcutil import ( + "fmt" + "io" "io/ioutil" "os" "path/filepath" "strings" + + "github.com/golang/protobuf/jsonpb" /* copybara-comment */ + "github.com/golang/protobuf/proto" /* copybara-comment */ ) var ( @@ -54,6 +59,20 @@ func LoadFile(path string) (string, error) { return string(b), err } +// LoadProto reads a JSON proto message from a file. +func LoadProto(path string, msg proto.Message) error { + file, err := os.Open(Path(path)) + if err != nil { + return fmt.Errorf("file %q I/O error: %v", path, err) + } + defer file.Close() + + if err := jsonpb.Unmarshal(file, msg); err != nil && err != io.EOF { + return fmt.Errorf("file %q invalid JSON: %v", path, err) + } + return nil +} + func moduleRoot() string { projectRoot := os.Getenv("PROJECT_ROOT") return projectRoot diff --git a/lib/srcutil/srcutil_test.go b/lib/srcutil/srcutil_test.go index c44e5fec..0ef3effc 100644 --- a/lib/srcutil/srcutil_test.go +++ b/lib/srcutil/srcutil_test.go @@ -17,6 +17,9 @@ package srcutil import ( "path/filepath" "testing" + + "github.com/golang/protobuf/proto" /* copybara-comment */ + cpb "github.com/GoogleCloudPlatform/healthcare-federated-access-services/proto/common/v1" /* copybara-comment: go_proto */ ) const testfileContent string = `This is a text file for testing. @@ -71,3 +74,18 @@ func TestLoadFile(t *testing.T) { t.Fatalf("LoadFile(%v) doesn't match the contents of the file.", path) } } + +func TestLoadProto(t *testing.T) { + path := "lib/srcutil/testproto.json" + got := &cpb.Descriptor{} + if err := LoadProto(path, got); err != nil { + t.Fatalf("LoadProto(%q, _) failed: %v", path, err) + } + want := &cpb.Descriptor{ + Label: "hi", + Description: "there", + } + if !proto.Equal(want, got) { + t.Errorf("LoadProto(%q, _) mismatch: got %+v, want %+v", path, got, want) + } +} diff --git a/lib/srcutil/testproto.json b/lib/srcutil/testproto.json new file mode 100644 index 00000000..774daa9e --- /dev/null +++ b/lib/srcutil/testproto.json @@ -0,0 +1,4 @@ +{ + "label": "hi", + "description": "there" +} diff --git a/proto/dam/v1/dam_service.pb.go b/proto/dam/v1/dam_service.pb.go index 0a8cb471..03ac3485 100644 --- a/proto/dam/v1/dam_service.pb.go +++ b/proto/dam/v1/dam_service.pb.go @@ -64,7 +64,7 @@ func (x ResourceTokenRequestState_TokenType) String() string { } func (ResourceTokenRequestState_TokenType) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_b1b3693f36078fb7, []int{67, 0} + return fileDescriptor_b1b3693f36078fb7, []int{66, 0} } type DamConfig struct { @@ -638,10 +638,9 @@ func (m *Resource) GetUi() map[string]string { type ServiceTemplate struct { ServiceName string `protobuf:"bytes,1,opt,name=service_name,json=serviceName,proto3" json:"service_name,omitempty"` - ItemFormat string `protobuf:"bytes,2,opt,name=item_format,json=itemFormat,proto3" json:"item_format,omitempty"` - Interfaces map[string]string `protobuf:"bytes,3,rep,name=interfaces,proto3" json:"interfaces,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` - ServiceRoles map[string]*ServiceRole `protobuf:"bytes,4,rep,name=service_roles,json=roles,proto3" json:"service_roles,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` - Ui map[string]string `protobuf:"bytes,5,rep,name=ui,proto3" json:"ui,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + Interfaces map[string]string `protobuf:"bytes,2,rep,name=interfaces,proto3" json:"interfaces,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + ServiceRoles map[string]*ServiceRole `protobuf:"bytes,3,rep,name=service_roles,json=roles,proto3" json:"service_roles,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + Ui map[string]string `protobuf:"bytes,4,rep,name=ui,proto3" json:"ui,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` @@ -679,13 +678,6 @@ func (m *ServiceTemplate) GetServiceName() string { return "" } -func (m *ServiceTemplate) GetItemFormat() string { - if m != nil { - return m.ItemFormat - } - return "" -} - func (m *ServiceTemplate) GetInterfaces() map[string]string { if m != nil { return m.Interfaces @@ -708,13 +700,12 @@ func (m *ServiceTemplate) GetUi() map[string]string { } type ServiceRole struct { - TargetRoles []string `protobuf:"bytes,1,rep,name=target_roles,json=targetRoles,proto3" json:"target_roles,omitempty"` - TargetScopes []string `protobuf:"bytes,2,rep,name=target_scopes,json=targetScopes,proto3" json:"target_scopes,omitempty"` - DamRoleCategories []string `protobuf:"bytes,3,rep,name=dam_role_categories,json=damRoleCategories,proto3" json:"dam_role_categories,omitempty"` - Ui map[string]string `protobuf:"bytes,4,rep,name=ui,proto3" json:"ui,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + ServiceArgs map[string]*ServiceRole_ServiceArg `protobuf:"bytes,1,rep,name=service_args,json=serviceArgs,proto3" json:"service_args,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + DamRoleCategories []string `protobuf:"bytes,2,rep,name=dam_role_categories,json=damRoleCategories,proto3" json:"dam_role_categories,omitempty"` + Ui map[string]string `protobuf:"bytes,3,rep,name=ui,proto3" json:"ui,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` } func (m *ServiceRole) Reset() { *m = ServiceRole{} } @@ -742,30 +733,62 @@ func (m *ServiceRole) XXX_DiscardUnknown() { var xxx_messageInfo_ServiceRole proto.InternalMessageInfo -func (m *ServiceRole) GetTargetRoles() []string { +func (m *ServiceRole) GetServiceArgs() map[string]*ServiceRole_ServiceArg { if m != nil { - return m.TargetRoles + return m.ServiceArgs } return nil } -func (m *ServiceRole) GetTargetScopes() []string { +func (m *ServiceRole) GetDamRoleCategories() []string { if m != nil { - return m.TargetScopes + return m.DamRoleCategories } return nil } -func (m *ServiceRole) GetDamRoleCategories() []string { +func (m *ServiceRole) GetUi() map[string]string { if m != nil { - return m.DamRoleCategories + return m.Ui } return nil } -func (m *ServiceRole) GetUi() map[string]string { +type ServiceRole_ServiceArg struct { + Values []string `protobuf:"bytes,2,rep,name=values,proto3" json:"values,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *ServiceRole_ServiceArg) Reset() { *m = ServiceRole_ServiceArg{} } +func (m *ServiceRole_ServiceArg) String() string { return proto.CompactTextString(m) } +func (*ServiceRole_ServiceArg) ProtoMessage() {} +func (*ServiceRole_ServiceArg) Descriptor() ([]byte, []int) { + return fileDescriptor_b1b3693f36078fb7, []int{8, 0} +} + +func (m *ServiceRole_ServiceArg) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_ServiceRole_ServiceArg.Unmarshal(m, b) +} +func (m *ServiceRole_ServiceArg) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_ServiceRole_ServiceArg.Marshal(b, m, deterministic) +} +func (m *ServiceRole_ServiceArg) XXX_Merge(src proto.Message) { + xxx_messageInfo_ServiceRole_ServiceArg.Merge(m, src) +} +func (m *ServiceRole_ServiceArg) XXX_Size() int { + return xxx_messageInfo_ServiceRole_ServiceArg.Size(m) +} +func (m *ServiceRole_ServiceArg) XXX_DiscardUnknown() { + xxx_messageInfo_ServiceRole_ServiceArg.DiscardUnknown(m) +} + +var xxx_messageInfo_ServiceRole_ServiceArg proto.InternalMessageInfo + +func (m *ServiceRole_ServiceArg) GetValues() []string { if m != nil { - return m.Ui + return m.Values } return nil } @@ -999,14 +1022,14 @@ func (m *VisaType) GetUi() map[string]string { } type ServiceDescriptor struct { - Platform string `protobuf:"bytes,1,opt,name=platform,proto3" json:"platform,omitempty"` - Requirements *ServiceDescriptor_Requirements `protobuf:"bytes,2,opt,name=requirements,proto3" json:"requirements,omitempty"` - Properties *ServiceDescriptor_Properties `protobuf:"bytes,3,opt,name=properties,proto3" json:"properties,omitempty"` - ItemFormats map[string]*ItemFormat `protobuf:"bytes,4,rep,name=item_formats,json=itemFormats,proto3" json:"item_formats,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` - Ui map[string]string `protobuf:"bytes,5,rep,name=ui,proto3" json:"ui,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + Platform string `protobuf:"bytes,1,opt,name=platform,proto3" json:"platform,omitempty"` + ServiceVariables map[string]*VariableFormat `protobuf:"bytes,2,rep,name=service_variables,json=serviceVariables,proto3" json:"service_variables,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + ItemVariables map[string]*VariableFormat `protobuf:"bytes,3,rep,name=item_variables,json=itemVariables,proto3" json:"item_variables,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + Properties *ServiceDescriptor_Properties `protobuf:"bytes,4,opt,name=properties,proto3" json:"properties,omitempty"` + Ui map[string]string `protobuf:"bytes,6,rep,name=ui,proto3" json:"ui,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` } func (m *ServiceDescriptor) Reset() { *m = ServiceDescriptor{} } @@ -1041,23 +1064,23 @@ func (m *ServiceDescriptor) GetPlatform() string { return "" } -func (m *ServiceDescriptor) GetRequirements() *ServiceDescriptor_Requirements { +func (m *ServiceDescriptor) GetServiceVariables() map[string]*VariableFormat { if m != nil { - return m.Requirements + return m.ServiceVariables } return nil } -func (m *ServiceDescriptor) GetProperties() *ServiceDescriptor_Properties { +func (m *ServiceDescriptor) GetItemVariables() map[string]*VariableFormat { if m != nil { - return m.Properties + return m.ItemVariables } return nil } -func (m *ServiceDescriptor) GetItemFormats() map[string]*ItemFormat { +func (m *ServiceDescriptor) GetProperties() *ServiceDescriptor_Properties { if m != nil { - return m.ItemFormats + return m.Properties } return nil } @@ -1069,61 +1092,6 @@ func (m *ServiceDescriptor) GetUi() map[string]string { return nil } -type ServiceDescriptor_Requirements struct { - TargetRole bool `protobuf:"varint,1,opt,name=target_role,json=targetRole,proto3" json:"target_role,omitempty"` - TargetScope bool `protobuf:"varint,2,opt,name=target_scope,json=targetScope,proto3" json:"target_scope,omitempty"` - Aud bool `protobuf:"varint,3,opt,name=aud,proto3" json:"aud,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *ServiceDescriptor_Requirements) Reset() { *m = ServiceDescriptor_Requirements{} } -func (m *ServiceDescriptor_Requirements) String() string { return proto.CompactTextString(m) } -func (*ServiceDescriptor_Requirements) ProtoMessage() {} -func (*ServiceDescriptor_Requirements) Descriptor() ([]byte, []int) { - return fileDescriptor_b1b3693f36078fb7, []int{12, 0} -} - -func (m *ServiceDescriptor_Requirements) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_ServiceDescriptor_Requirements.Unmarshal(m, b) -} -func (m *ServiceDescriptor_Requirements) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_ServiceDescriptor_Requirements.Marshal(b, m, deterministic) -} -func (m *ServiceDescriptor_Requirements) XXX_Merge(src proto.Message) { - xxx_messageInfo_ServiceDescriptor_Requirements.Merge(m, src) -} -func (m *ServiceDescriptor_Requirements) XXX_Size() int { - return xxx_messageInfo_ServiceDescriptor_Requirements.Size(m) -} -func (m *ServiceDescriptor_Requirements) XXX_DiscardUnknown() { - xxx_messageInfo_ServiceDescriptor_Requirements.DiscardUnknown(m) -} - -var xxx_messageInfo_ServiceDescriptor_Requirements proto.InternalMessageInfo - -func (m *ServiceDescriptor_Requirements) GetTargetRole() bool { - if m != nil { - return m.TargetRole - } - return false -} - -func (m *ServiceDescriptor_Requirements) GetTargetScope() bool { - if m != nil { - return m.TargetScope - } - return false -} - -func (m *ServiceDescriptor_Requirements) GetAud() bool { - if m != nil { - return m.Aud - } - return false -} - type ServiceDescriptor_Properties struct { IsAggregate bool `protobuf:"varint,1,opt,name=is_aggregate,json=isAggregate,proto3" json:"is_aggregate,omitempty"` CanBeAggregated bool `protobuf:"varint,2,opt,name=can_be_aggregated,json=canBeAggregated,proto3" json:"can_be_aggregated,omitempty"` @@ -1137,7 +1105,7 @@ func (m *ServiceDescriptor_Properties) Reset() { *m = ServiceDescriptor_ func (m *ServiceDescriptor_Properties) String() string { return proto.CompactTextString(m) } func (*ServiceDescriptor_Properties) ProtoMessage() {} func (*ServiceDescriptor_Properties) Descriptor() ([]byte, []int) { - return fileDescriptor_b1b3693f36078fb7, []int{12, 1} + return fileDescriptor_b1b3693f36078fb7, []int{12, 0} } func (m *ServiceDescriptor_Properties) XXX_Unmarshal(b []byte) error { @@ -1179,53 +1147,6 @@ func (m *ServiceDescriptor_Properties) GetSingleItem() bool { return false } -type ItemFormat struct { - Variables map[string]*VariableFormat `protobuf:"bytes,1,rep,name=variables,proto3" json:"variables,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` - Ui map[string]string `protobuf:"bytes,2,rep,name=ui,proto3" json:"ui,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *ItemFormat) Reset() { *m = ItemFormat{} } -func (m *ItemFormat) String() string { return proto.CompactTextString(m) } -func (*ItemFormat) ProtoMessage() {} -func (*ItemFormat) Descriptor() ([]byte, []int) { - return fileDescriptor_b1b3693f36078fb7, []int{13} -} - -func (m *ItemFormat) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_ItemFormat.Unmarshal(m, b) -} -func (m *ItemFormat) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_ItemFormat.Marshal(b, m, deterministic) -} -func (m *ItemFormat) XXX_Merge(src proto.Message) { - xxx_messageInfo_ItemFormat.Merge(m, src) -} -func (m *ItemFormat) XXX_Size() int { - return xxx_messageInfo_ItemFormat.Size(m) -} -func (m *ItemFormat) XXX_DiscardUnknown() { - xxx_messageInfo_ItemFormat.DiscardUnknown(m) -} - -var xxx_messageInfo_ItemFormat proto.InternalMessageInfo - -func (m *ItemFormat) GetVariables() map[string]*VariableFormat { - if m != nil { - return m.Variables - } - return nil -} - -func (m *ItemFormat) GetUi() map[string]string { - if m != nil { - return m.Ui - } - return nil -} - type VariableFormat struct { Regexp string `protobuf:"bytes,1,opt,name=regexp,proto3" json:"regexp,omitempty"` Optional bool `protobuf:"varint,2,opt,name=optional,proto3" json:"optional,omitempty"` @@ -1245,7 +1166,7 @@ func (m *VariableFormat) Reset() { *m = VariableFormat{} } func (m *VariableFormat) String() string { return proto.CompactTextString(m) } func (*VariableFormat) ProtoMessage() {} func (*VariableFormat) Descriptor() ([]byte, []int) { - return fileDescriptor_b1b3693f36078fb7, []int{14} + return fileDescriptor_b1b3693f36078fb7, []int{13} } func (m *VariableFormat) XXX_Unmarshal(b []byte) error { @@ -1311,7 +1232,7 @@ func (m *Realm) Reset() { *m = Realm{} } func (m *Realm) String() string { return proto.CompactTextString(m) } func (*Realm) ProtoMessage() {} func (*Realm) Descriptor() ([]byte, []int) { - return fileDescriptor_b1b3693f36078fb7, []int{15} + return fileDescriptor_b1b3693f36078fb7, []int{14} } func (m *Realm) XXX_Unmarshal(b []byte) error { @@ -1344,7 +1265,7 @@ func (m *PassportTranslator) Reset() { *m = PassportTranslator{} } func (m *PassportTranslator) String() string { return proto.CompactTextString(m) } func (*PassportTranslator) ProtoMessage() {} func (*PassportTranslator) Descriptor() ([]byte, []int) { - return fileDescriptor_b1b3693f36078fb7, []int{16} + return fileDescriptor_b1b3693f36078fb7, []int{15} } func (m *PassportTranslator) XXX_Unmarshal(b []byte) error { @@ -1389,7 +1310,7 @@ func (m *GetInfoRequest) Reset() { *m = GetInfoRequest{} } func (m *GetInfoRequest) String() string { return proto.CompactTextString(m) } func (*GetInfoRequest) ProtoMessage() {} func (*GetInfoRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_b1b3693f36078fb7, []int{17} + return fileDescriptor_b1b3693f36078fb7, []int{16} } func (m *GetInfoRequest) XXX_Unmarshal(b []byte) error { @@ -1425,7 +1346,7 @@ func (m *GetInfoResponse) Reset() { *m = GetInfoResponse{} } func (m *GetInfoResponse) String() string { return proto.CompactTextString(m) } func (*GetInfoResponse) ProtoMessage() {} func (*GetInfoResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_b1b3693f36078fb7, []int{18} + return fileDescriptor_b1b3693f36078fb7, []int{17} } func (m *GetInfoResponse) XXX_Unmarshal(b []byte) error { @@ -1492,7 +1413,7 @@ func (m *RealmRequest) Reset() { *m = RealmRequest{} } func (m *RealmRequest) String() string { return proto.CompactTextString(m) } func (*RealmRequest) ProtoMessage() {} func (*RealmRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_b1b3693f36078fb7, []int{19} + return fileDescriptor_b1b3693f36078fb7, []int{18} } func (m *RealmRequest) XXX_Unmarshal(b []byte) error { @@ -1530,7 +1451,7 @@ func (m *RealmResponse) Reset() { *m = RealmResponse{} } func (m *RealmResponse) String() string { return proto.CompactTextString(m) } func (*RealmResponse) ProtoMessage() {} func (*RealmResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_b1b3693f36078fb7, []int{20} + return fileDescriptor_b1b3693f36078fb7, []int{19} } func (m *RealmResponse) XXX_Unmarshal(b []byte) error { @@ -1563,7 +1484,7 @@ func (m *GetResourcesRequest) Reset() { *m = GetResourcesRequest{} } func (m *GetResourcesRequest) String() string { return proto.CompactTextString(m) } func (*GetResourcesRequest) ProtoMessage() {} func (*GetResourcesRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_b1b3693f36078fb7, []int{21} + return fileDescriptor_b1b3693f36078fb7, []int{20} } func (m *GetResourcesRequest) XXX_Unmarshal(b []byte) error { @@ -1609,7 +1530,7 @@ func (m *GetResourcesResponse) Reset() { *m = GetResourcesResponse{} } func (m *GetResourcesResponse) String() string { return proto.CompactTextString(m) } func (*GetResourcesResponse) ProtoMessage() {} func (*GetResourcesResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_b1b3693f36078fb7, []int{22} + return fileDescriptor_b1b3693f36078fb7, []int{21} } func (m *GetResourcesResponse) XXX_Unmarshal(b []byte) error { @@ -1647,7 +1568,7 @@ func (m *GetFlatViewsRequest) Reset() { *m = GetFlatViewsRequest{} } func (m *GetFlatViewsRequest) String() string { return proto.CompactTextString(m) } func (*GetFlatViewsRequest) ProtoMessage() {} func (*GetFlatViewsRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_b1b3693f36078fb7, []int{23} + return fileDescriptor_b1b3693f36078fb7, []int{22} } func (m *GetFlatViewsRequest) XXX_Unmarshal(b []byte) error { @@ -1679,7 +1600,7 @@ func (m *GetFlatViewsResponse) Reset() { *m = GetFlatViewsResponse{} } func (m *GetFlatViewsResponse) String() string { return proto.CompactTextString(m) } func (*GetFlatViewsResponse) ProtoMessage() {} func (*GetFlatViewsResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_b1b3693f36078fb7, []int{24} + return fileDescriptor_b1b3693f36078fb7, []int{23} } func (m *GetFlatViewsResponse) XXX_Unmarshal(b []byte) error { @@ -1734,7 +1655,7 @@ func (m *GetFlatViewsResponse_FlatView) Reset() { *m = GetFlatViewsRespo func (m *GetFlatViewsResponse_FlatView) String() string { return proto.CompactTextString(m) } func (*GetFlatViewsResponse_FlatView) ProtoMessage() {} func (*GetFlatViewsResponse_FlatView) Descriptor() ([]byte, []int) { - return fileDescriptor_b1b3693f36078fb7, []int{24, 0} + return fileDescriptor_b1b3693f36078fb7, []int{23, 0} } func (m *GetFlatViewsResponse_FlatView) XXX_Unmarshal(b []byte) error { @@ -1884,7 +1805,7 @@ func (m *GetResourceRequest) Reset() { *m = GetResourceRequest{} } func (m *GetResourceRequest) String() string { return proto.CompactTextString(m) } func (*GetResourceRequest) ProtoMessage() {} func (*GetResourceRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_b1b3693f36078fb7, []int{25} + return fileDescriptor_b1b3693f36078fb7, []int{24} } func (m *GetResourceRequest) XXX_Unmarshal(b []byte) error { @@ -1917,7 +1838,7 @@ func (m *GetResourceResponse) Reset() { *m = GetResourceResponse{} } func (m *GetResourceResponse) String() string { return proto.CompactTextString(m) } func (*GetResourceResponse) ProtoMessage() {} func (*GetResourceResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_b1b3693f36078fb7, []int{26} + return fileDescriptor_b1b3693f36078fb7, []int{25} } func (m *GetResourceResponse) XXX_Unmarshal(b []byte) error { @@ -1962,7 +1883,7 @@ func (m *GetViewsRequest) Reset() { *m = GetViewsRequest{} } func (m *GetViewsRequest) String() string { return proto.CompactTextString(m) } func (*GetViewsRequest) ProtoMessage() {} func (*GetViewsRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_b1b3693f36078fb7, []int{27} + return fileDescriptor_b1b3693f36078fb7, []int{26} } func (m *GetViewsRequest) XXX_Unmarshal(b []byte) error { @@ -1995,7 +1916,7 @@ func (m *GetViewsResponse) Reset() { *m = GetViewsResponse{} } func (m *GetViewsResponse) String() string { return proto.CompactTextString(m) } func (*GetViewsResponse) ProtoMessage() {} func (*GetViewsResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_b1b3693f36078fb7, []int{28} + return fileDescriptor_b1b3693f36078fb7, []int{27} } func (m *GetViewsResponse) XXX_Unmarshal(b []byte) error { @@ -2040,7 +1961,7 @@ func (m *GetViewRequest) Reset() { *m = GetViewRequest{} } func (m *GetViewRequest) String() string { return proto.CompactTextString(m) } func (*GetViewRequest) ProtoMessage() {} func (*GetViewRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_b1b3693f36078fb7, []int{29} + return fileDescriptor_b1b3693f36078fb7, []int{28} } func (m *GetViewRequest) XXX_Unmarshal(b []byte) error { @@ -2073,7 +1994,7 @@ func (m *GetViewResponse) Reset() { *m = GetViewResponse{} } func (m *GetViewResponse) String() string { return proto.CompactTextString(m) } func (*GetViewResponse) ProtoMessage() {} func (*GetViewResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_b1b3693f36078fb7, []int{30} + return fileDescriptor_b1b3693f36078fb7, []int{29} } func (m *GetViewResponse) XXX_Unmarshal(b []byte) error { @@ -2118,7 +2039,7 @@ func (m *GetViewRolesRequest) Reset() { *m = GetViewRolesRequest{} } func (m *GetViewRolesRequest) String() string { return proto.CompactTextString(m) } func (*GetViewRolesRequest) ProtoMessage() {} func (*GetViewRolesRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_b1b3693f36078fb7, []int{31} + return fileDescriptor_b1b3693f36078fb7, []int{30} } func (m *GetViewRolesRequest) XXX_Unmarshal(b []byte) error { @@ -2151,7 +2072,7 @@ func (m *GetViewRolesResponse) Reset() { *m = GetViewRolesResponse{} } func (m *GetViewRolesResponse) String() string { return proto.CompactTextString(m) } func (*GetViewRolesResponse) ProtoMessage() {} func (*GetViewRolesResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_b1b3693f36078fb7, []int{32} + return fileDescriptor_b1b3693f36078fb7, []int{31} } func (m *GetViewRolesResponse) XXX_Unmarshal(b []byte) error { @@ -2196,7 +2117,7 @@ func (m *GetViewRoleRequest) Reset() { *m = GetViewRoleRequest{} } func (m *GetViewRoleRequest) String() string { return proto.CompactTextString(m) } func (*GetViewRoleRequest) ProtoMessage() {} func (*GetViewRoleRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_b1b3693f36078fb7, []int{33} + return fileDescriptor_b1b3693f36078fb7, []int{32} } func (m *GetViewRoleRequest) XXX_Unmarshal(b []byte) error { @@ -2229,7 +2150,7 @@ func (m *GetViewRoleResponse) Reset() { *m = GetViewRoleResponse{} } func (m *GetViewRoleResponse) String() string { return proto.CompactTextString(m) } func (*GetViewRoleResponse) ProtoMessage() {} func (*GetViewRoleResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_b1b3693f36078fb7, []int{34} + return fileDescriptor_b1b3693f36078fb7, []int{33} } func (m *GetViewRoleResponse) XXX_Unmarshal(b []byte) error { @@ -2277,7 +2198,7 @@ func (m *GetTokenRequest) Reset() { *m = GetTokenRequest{} } func (m *GetTokenRequest) String() string { return proto.CompactTextString(m) } func (*GetTokenRequest) ProtoMessage() {} func (*GetTokenRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_b1b3693f36078fb7, []int{35} + return fileDescriptor_b1b3693f36078fb7, []int{34} } func (m *GetTokenRequest) XXX_Unmarshal(b []byte) error { @@ -2329,7 +2250,7 @@ func (m *GetTestResultsRequest) Reset() { *m = GetTestResultsRequest{} } func (m *GetTestResultsRequest) String() string { return proto.CompactTextString(m) } func (*GetTestResultsRequest) ProtoMessage() {} func (*GetTestResultsRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_b1b3693f36078fb7, []int{36} + return fileDescriptor_b1b3693f36078fb7, []int{35} } func (m *GetTestResultsRequest) XXX_Unmarshal(b []byte) error { @@ -2369,7 +2290,7 @@ func (m *GetTestResultsResponse) Reset() { *m = GetTestResultsResponse{} func (m *GetTestResultsResponse) String() string { return proto.CompactTextString(m) } func (*GetTestResultsResponse) ProtoMessage() {} func (*GetTestResultsResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_b1b3693f36078fb7, []int{37} + return fileDescriptor_b1b3693f36078fb7, []int{36} } func (m *GetTestResultsResponse) XXX_Unmarshal(b []byte) error { @@ -2453,23 +2374,110 @@ func (m *GetTestResultsResponse) GetError() string { return "" } +type GetTestResultsResponse_RejectedVisa struct { + Reason string `protobuf:"bytes,1,opt,name=reason,proto3" json:"reason,omitempty"` + Field string `protobuf:"bytes,2,opt,name=field,proto3" json:"field,omitempty"` + Description string `protobuf:"bytes,3,opt,name=description,proto3" json:"description,omitempty"` + VisaType string `protobuf:"bytes,4,opt,name=visa_type,json=visaType,proto3" json:"visa_type,omitempty"` + Source string `protobuf:"bytes,5,opt,name=source,proto3" json:"source,omitempty"` + Value string `protobuf:"bytes,6,opt,name=value,proto3" json:"value,omitempty"` + By string `protobuf:"bytes,7,opt,name=by,proto3" json:"by,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *GetTestResultsResponse_RejectedVisa) Reset() { *m = GetTestResultsResponse_RejectedVisa{} } +func (m *GetTestResultsResponse_RejectedVisa) String() string { return proto.CompactTextString(m) } +func (*GetTestResultsResponse_RejectedVisa) ProtoMessage() {} +func (*GetTestResultsResponse_RejectedVisa) Descriptor() ([]byte, []int) { + return fileDescriptor_b1b3693f36078fb7, []int{36, 0} +} + +func (m *GetTestResultsResponse_RejectedVisa) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_GetTestResultsResponse_RejectedVisa.Unmarshal(m, b) +} +func (m *GetTestResultsResponse_RejectedVisa) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_GetTestResultsResponse_RejectedVisa.Marshal(b, m, deterministic) +} +func (m *GetTestResultsResponse_RejectedVisa) XXX_Merge(src proto.Message) { + xxx_messageInfo_GetTestResultsResponse_RejectedVisa.Merge(m, src) +} +func (m *GetTestResultsResponse_RejectedVisa) XXX_Size() int { + return xxx_messageInfo_GetTestResultsResponse_RejectedVisa.Size(m) +} +func (m *GetTestResultsResponse_RejectedVisa) XXX_DiscardUnknown() { + xxx_messageInfo_GetTestResultsResponse_RejectedVisa.DiscardUnknown(m) +} + +var xxx_messageInfo_GetTestResultsResponse_RejectedVisa proto.InternalMessageInfo + +func (m *GetTestResultsResponse_RejectedVisa) GetReason() string { + if m != nil { + return m.Reason + } + return "" +} + +func (m *GetTestResultsResponse_RejectedVisa) GetField() string { + if m != nil { + return m.Field + } + return "" +} + +func (m *GetTestResultsResponse_RejectedVisa) GetDescription() string { + if m != nil { + return m.Description + } + return "" +} + +func (m *GetTestResultsResponse_RejectedVisa) GetVisaType() string { + if m != nil { + return m.VisaType + } + return "" +} + +func (m *GetTestResultsResponse_RejectedVisa) GetSource() string { + if m != nil { + return m.Source + } + return "" +} + +func (m *GetTestResultsResponse_RejectedVisa) GetValue() string { + if m != nil { + return m.Value + } + return "" +} + +func (m *GetTestResultsResponse_RejectedVisa) GetBy() string { + if m != nil { + return m.By + } + return "" +} + type GetTestResultsResponse_TestResult struct { - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` - Result string `protobuf:"bytes,2,opt,name=result,proto3" json:"result,omitempty"` - Access []string `protobuf:"bytes,3,rep,name=access,proto3" json:"access,omitempty"` - NoAccess map[string]string `protobuf:"bytes,4,rep,name=no_access,json=noAccess,proto3" json:"no_access,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` - RejectedVisas map[string]string `protobuf:"bytes,5,rep,name=rejected_visas,json=rejectedVisas,proto3" json:"rejected_visas,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` - Error string `protobuf:"bytes,6,opt,name=error,proto3" json:"error,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + Result string `protobuf:"bytes,2,opt,name=result,proto3" json:"result,omitempty"` + Access []string `protobuf:"bytes,3,rep,name=access,proto3" json:"access,omitempty"` + NoAccess map[string]string `protobuf:"bytes,4,rep,name=no_access,json=noAccess,proto3" json:"no_access,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + RejectedVisas []*GetTestResultsResponse_RejectedVisa `protobuf:"bytes,5,rep,name=rejected_visas,json=rejectedVisas,proto3" json:"rejected_visas,omitempty"` + Error string `protobuf:"bytes,6,opt,name=error,proto3" json:"error,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` } func (m *GetTestResultsResponse_TestResult) Reset() { *m = GetTestResultsResponse_TestResult{} } func (m *GetTestResultsResponse_TestResult) String() string { return proto.CompactTextString(m) } func (*GetTestResultsResponse_TestResult) ProtoMessage() {} func (*GetTestResultsResponse_TestResult) Descriptor() ([]byte, []int) { - return fileDescriptor_b1b3693f36078fb7, []int{37, 0} + return fileDescriptor_b1b3693f36078fb7, []int{36, 1} } func (m *GetTestResultsResponse_TestResult) XXX_Unmarshal(b []byte) error { @@ -2518,7 +2526,7 @@ func (m *GetTestResultsResponse_TestResult) GetNoAccess() map[string]string { return nil } -func (m *GetTestResultsResponse_TestResult) GetRejectedVisas() map[string]string { +func (m *GetTestResultsResponse_TestResult) GetRejectedVisas() []*GetTestResultsResponse_RejectedVisa { if m != nil { return m.RejectedVisas } @@ -2542,7 +2550,7 @@ func (m *ServicesRequest) Reset() { *m = ServicesRequest{} } func (m *ServicesRequest) String() string { return proto.CompactTextString(m) } func (*ServicesRequest) ProtoMessage() {} func (*ServicesRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_b1b3693f36078fb7, []int{38} + return fileDescriptor_b1b3693f36078fb7, []int{37} } func (m *ServicesRequest) XXX_Unmarshal(b []byte) error { @@ -2574,7 +2582,7 @@ func (m *ServicesResponse) Reset() { *m = ServicesResponse{} } func (m *ServicesResponse) String() string { return proto.CompactTextString(m) } func (*ServicesResponse) ProtoMessage() {} func (*ServicesResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_b1b3693f36078fb7, []int{39} + return fileDescriptor_b1b3693f36078fb7, []int{38} } func (m *ServicesResponse) XXX_Unmarshal(b []byte) error { @@ -2612,7 +2620,7 @@ func (m *PassportTranslatorsRequest) Reset() { *m = PassportTranslatorsR func (m *PassportTranslatorsRequest) String() string { return proto.CompactTextString(m) } func (*PassportTranslatorsRequest) ProtoMessage() {} func (*PassportTranslatorsRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_b1b3693f36078fb7, []int{40} + return fileDescriptor_b1b3693f36078fb7, []int{39} } func (m *PassportTranslatorsRequest) XXX_Unmarshal(b []byte) error { @@ -2644,7 +2652,7 @@ func (m *PassportTranslatorsResponse) Reset() { *m = PassportTranslators func (m *PassportTranslatorsResponse) String() string { return proto.CompactTextString(m) } func (*PassportTranslatorsResponse) ProtoMessage() {} func (*PassportTranslatorsResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_b1b3693f36078fb7, []int{41} + return fileDescriptor_b1b3693f36078fb7, []int{40} } func (m *PassportTranslatorsResponse) XXX_Unmarshal(b []byte) error { @@ -2682,7 +2690,7 @@ func (m *DamRoleCategoriesRequest) Reset() { *m = DamRoleCategoriesReque func (m *DamRoleCategoriesRequest) String() string { return proto.CompactTextString(m) } func (*DamRoleCategoriesRequest) ProtoMessage() {} func (*DamRoleCategoriesRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_b1b3693f36078fb7, []int{42} + return fileDescriptor_b1b3693f36078fb7, []int{41} } func (m *DamRoleCategoriesRequest) XXX_Unmarshal(b []byte) error { @@ -2715,7 +2723,7 @@ func (m *RoleCategory) Reset() { *m = RoleCategory{} } func (m *RoleCategory) String() string { return proto.CompactTextString(m) } func (*RoleCategory) ProtoMessage() {} func (*RoleCategory) Descriptor() ([]byte, []int) { - return fileDescriptor_b1b3693f36078fb7, []int{43} + return fileDescriptor_b1b3693f36078fb7, []int{42} } func (m *RoleCategory) XXX_Unmarshal(b []byte) error { @@ -2761,7 +2769,7 @@ func (m *DamRoleCategoriesResponse) Reset() { *m = DamRoleCategoriesResp func (m *DamRoleCategoriesResponse) String() string { return proto.CompactTextString(m) } func (*DamRoleCategoriesResponse) ProtoMessage() {} func (*DamRoleCategoriesResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_b1b3693f36078fb7, []int{44} + return fileDescriptor_b1b3693f36078fb7, []int{43} } func (m *DamRoleCategoriesResponse) XXX_Unmarshal(b []byte) error { @@ -2799,7 +2807,7 @@ func (m *GetTestPersonasRequest) Reset() { *m = GetTestPersonasRequest{} func (m *GetTestPersonasRequest) String() string { return proto.CompactTextString(m) } func (*GetTestPersonasRequest) ProtoMessage() {} func (*GetTestPersonasRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_b1b3693f36078fb7, []int{45} + return fileDescriptor_b1b3693f36078fb7, []int{44} } func (m *GetTestPersonasRequest) XXX_Unmarshal(b []byte) error { @@ -2832,7 +2840,7 @@ func (m *GetTestPersonasResponse) Reset() { *m = GetTestPersonasResponse func (m *GetTestPersonasResponse) String() string { return proto.CompactTextString(m) } func (*GetTestPersonasResponse) ProtoMessage() {} func (*GetTestPersonasResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_b1b3693f36078fb7, []int{46} + return fileDescriptor_b1b3693f36078fb7, []int{45} } func (m *GetTestPersonasResponse) XXX_Unmarshal(b []byte) error { @@ -2877,7 +2885,7 @@ func (m *BackgroundProcessesRequest) Reset() { *m = BackgroundProcessesR func (m *BackgroundProcessesRequest) String() string { return proto.CompactTextString(m) } func (*BackgroundProcessesRequest) ProtoMessage() {} func (*BackgroundProcessesRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_b1b3693f36078fb7, []int{47} + return fileDescriptor_b1b3693f36078fb7, []int{46} } func (m *BackgroundProcessesRequest) XXX_Unmarshal(b []byte) error { @@ -2909,7 +2917,7 @@ func (m *BackgroundProcessesResponse) Reset() { *m = BackgroundProcesses func (m *BackgroundProcessesResponse) String() string { return proto.CompactTextString(m) } func (*BackgroundProcessesResponse) ProtoMessage() {} func (*BackgroundProcessesResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_b1b3693f36078fb7, []int{48} + return fileDescriptor_b1b3693f36078fb7, []int{47} } func (m *BackgroundProcessesResponse) XXX_Unmarshal(b []byte) error { @@ -2947,7 +2955,7 @@ func (m *BackgroundProcessRequest) Reset() { *m = BackgroundProcessReque func (m *BackgroundProcessRequest) String() string { return proto.CompactTextString(m) } func (*BackgroundProcessRequest) ProtoMessage() {} func (*BackgroundProcessRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_b1b3693f36078fb7, []int{49} + return fileDescriptor_b1b3693f36078fb7, []int{48} } func (m *BackgroundProcessRequest) XXX_Unmarshal(b []byte) error { @@ -2979,7 +2987,7 @@ func (m *BackgroundProcessResponse) Reset() { *m = BackgroundProcessResp func (m *BackgroundProcessResponse) String() string { return proto.CompactTextString(m) } func (*BackgroundProcessResponse) ProtoMessage() {} func (*BackgroundProcessResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_b1b3693f36078fb7, []int{50} + return fileDescriptor_b1b3693f36078fb7, []int{49} } func (m *BackgroundProcessResponse) XXX_Unmarshal(b []byte) error { @@ -3017,7 +3025,7 @@ func (m *TokensRequest) Reset() { *m = TokensRequest{} } func (m *TokensRequest) String() string { return proto.CompactTextString(m) } func (*TokensRequest) ProtoMessage() {} func (*TokensRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_b1b3693f36078fb7, []int{51} + return fileDescriptor_b1b3693f36078fb7, []int{50} } func (m *TokensRequest) XXX_Unmarshal(b []byte) error { @@ -3049,7 +3057,7 @@ func (m *TokensResponse) Reset() { *m = TokensResponse{} } func (m *TokensResponse) String() string { return proto.CompactTextString(m) } func (*TokensResponse) ProtoMessage() {} func (*TokensResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_b1b3693f36078fb7, []int{52} + return fileDescriptor_b1b3693f36078fb7, []int{51} } func (m *TokensResponse) XXX_Unmarshal(b []byte) error { @@ -3087,7 +3095,7 @@ func (m *TokenRequest) Reset() { *m = TokenRequest{} } func (m *TokenRequest) String() string { return proto.CompactTextString(m) } func (*TokenRequest) ProtoMessage() {} func (*TokenRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_b1b3693f36078fb7, []int{53} + return fileDescriptor_b1b3693f36078fb7, []int{52} } func (m *TokenRequest) XXX_Unmarshal(b []byte) error { @@ -3119,7 +3127,7 @@ func (m *TokenResponse) Reset() { *m = TokenResponse{} } func (m *TokenResponse) String() string { return proto.CompactTextString(m) } func (*TokenResponse) ProtoMessage() {} func (*TokenResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_b1b3693f36078fb7, []int{54} + return fileDescriptor_b1b3693f36078fb7, []int{53} } func (m *TokenResponse) XXX_Unmarshal(b []byte) error { @@ -3160,7 +3168,7 @@ func (m *ConfigModification) Reset() { *m = ConfigModification{} } func (m *ConfigModification) String() string { return proto.CompactTextString(m) } func (*ConfigModification) ProtoMessage() {} func (*ConfigModification) Descriptor() ([]byte, []int) { - return fileDescriptor_b1b3693f36078fb7, []int{55} + return fileDescriptor_b1b3693f36078fb7, []int{54} } func (m *ConfigModification) XXX_Unmarshal(b []byte) error { @@ -3217,7 +3225,7 @@ func (m *ConfigModification_PersonaModification) Reset() { func (m *ConfigModification_PersonaModification) String() string { return proto.CompactTextString(m) } func (*ConfigModification_PersonaModification) ProtoMessage() {} func (*ConfigModification_PersonaModification) Descriptor() ([]byte, []int) { - return fileDescriptor_b1b3693f36078fb7, []int{55, 0} + return fileDescriptor_b1b3693f36078fb7, []int{54, 0} } func (m *ConfigModification_PersonaModification) XXX_Unmarshal(b []byte) error { @@ -3270,7 +3278,7 @@ func (m *ConfigResponse) Reset() { *m = ConfigResponse{} } func (m *ConfigResponse) String() string { return proto.CompactTextString(m) } func (*ConfigResponse) ProtoMessage() {} func (*ConfigResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_b1b3693f36078fb7, []int{56} + return fileDescriptor_b1b3693f36078fb7, []int{55} } func (m *ConfigResponse) XXX_Unmarshal(b []byte) error { @@ -3303,7 +3311,7 @@ func (m *ConfigRequest) Reset() { *m = ConfigRequest{} } func (m *ConfigRequest) String() string { return proto.CompactTextString(m) } func (*ConfigRequest) ProtoMessage() {} func (*ConfigRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_b1b3693f36078fb7, []int{57} + return fileDescriptor_b1b3693f36078fb7, []int{56} } func (m *ConfigRequest) XXX_Unmarshal(b []byte) error { @@ -3350,7 +3358,7 @@ func (m *ConfigResourceRequest) Reset() { *m = ConfigResourceRequest{} } func (m *ConfigResourceRequest) String() string { return proto.CompactTextString(m) } func (*ConfigResourceRequest) ProtoMessage() {} func (*ConfigResourceRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_b1b3693f36078fb7, []int{58} + return fileDescriptor_b1b3693f36078fb7, []int{57} } func (m *ConfigResourceRequest) XXX_Unmarshal(b []byte) error { @@ -3397,7 +3405,7 @@ func (m *ConfigViewRequest) Reset() { *m = ConfigViewRequest{} } func (m *ConfigViewRequest) String() string { return proto.CompactTextString(m) } func (*ConfigViewRequest) ProtoMessage() {} func (*ConfigViewRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_b1b3693f36078fb7, []int{59} + return fileDescriptor_b1b3693f36078fb7, []int{58} } func (m *ConfigViewRequest) XXX_Unmarshal(b []byte) error { @@ -3444,7 +3452,7 @@ func (m *ConfigTrustedIssuerRequest) Reset() { *m = ConfigTrustedIssuerR func (m *ConfigTrustedIssuerRequest) String() string { return proto.CompactTextString(m) } func (*ConfigTrustedIssuerRequest) ProtoMessage() {} func (*ConfigTrustedIssuerRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_b1b3693f36078fb7, []int{60} + return fileDescriptor_b1b3693f36078fb7, []int{59} } func (m *ConfigTrustedIssuerRequest) XXX_Unmarshal(b []byte) error { @@ -3491,7 +3499,7 @@ func (m *ConfigTrustedSourceRequest) Reset() { *m = ConfigTrustedSourceR func (m *ConfigTrustedSourceRequest) String() string { return proto.CompactTextString(m) } func (*ConfigTrustedSourceRequest) ProtoMessage() {} func (*ConfigTrustedSourceRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_b1b3693f36078fb7, []int{61} + return fileDescriptor_b1b3693f36078fb7, []int{60} } func (m *ConfigTrustedSourceRequest) XXX_Unmarshal(b []byte) error { @@ -3538,7 +3546,7 @@ func (m *ConfigPolicyRequest) Reset() { *m = ConfigPolicyRequest{} } func (m *ConfigPolicyRequest) String() string { return proto.CompactTextString(m) } func (*ConfigPolicyRequest) ProtoMessage() {} func (*ConfigPolicyRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_b1b3693f36078fb7, []int{62} + return fileDescriptor_b1b3693f36078fb7, []int{61} } func (m *ConfigPolicyRequest) XXX_Unmarshal(b []byte) error { @@ -3585,7 +3593,7 @@ func (m *ConfigOptionsRequest) Reset() { *m = ConfigOptionsRequest{} } func (m *ConfigOptionsRequest) String() string { return proto.CompactTextString(m) } func (*ConfigOptionsRequest) ProtoMessage() {} func (*ConfigOptionsRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_b1b3693f36078fb7, []int{63} + return fileDescriptor_b1b3693f36078fb7, []int{62} } func (m *ConfigOptionsRequest) XXX_Unmarshal(b []byte) error { @@ -3632,7 +3640,7 @@ func (m *ConfigVisaTypeRequest) Reset() { *m = ConfigVisaTypeRequest{} } func (m *ConfigVisaTypeRequest) String() string { return proto.CompactTextString(m) } func (*ConfigVisaTypeRequest) ProtoMessage() {} func (*ConfigVisaTypeRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_b1b3693f36078fb7, []int{64} + return fileDescriptor_b1b3693f36078fb7, []int{63} } func (m *ConfigVisaTypeRequest) XXX_Unmarshal(b []byte) error { @@ -3679,7 +3687,7 @@ func (m *ConfigServiceTemplateRequest) Reset() { *m = ConfigServiceTempl func (m *ConfigServiceTemplateRequest) String() string { return proto.CompactTextString(m) } func (*ConfigServiceTemplateRequest) ProtoMessage() {} func (*ConfigServiceTemplateRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_b1b3693f36078fb7, []int{65} + return fileDescriptor_b1b3693f36078fb7, []int{64} } func (m *ConfigServiceTemplateRequest) XXX_Unmarshal(b []byte) error { @@ -3726,7 +3734,7 @@ func (m *ConfigTestPersonaRequest) Reset() { *m = ConfigTestPersonaReque func (m *ConfigTestPersonaRequest) String() string { return proto.CompactTextString(m) } func (*ConfigTestPersonaRequest) ProtoMessage() {} func (*ConfigTestPersonaRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_b1b3693f36078fb7, []int{66} + return fileDescriptor_b1b3693f36078fb7, []int{65} } func (m *ConfigTestPersonaRequest) XXX_Unmarshal(b []byte) error { @@ -3785,7 +3793,7 @@ func (m *ResourceTokenRequestState) Reset() { *m = ResourceTokenRequestS func (m *ResourceTokenRequestState) String() string { return proto.CompactTextString(m) } func (*ResourceTokenRequestState) ProtoMessage() {} func (*ResourceTokenRequestState) Descriptor() ([]byte, []int) { - return fileDescriptor_b1b3693f36078fb7, []int{67} + return fileDescriptor_b1b3693f36078fb7, []int{66} } func (m *ResourceTokenRequestState) XXX_Unmarshal(b []byte) error { @@ -3923,7 +3931,7 @@ func (m *ResourceTokenRequestState_Resource) Reset() { *m = ResourceToke func (m *ResourceTokenRequestState_Resource) String() string { return proto.CompactTextString(m) } func (*ResourceTokenRequestState_Resource) ProtoMessage() {} func (*ResourceTokenRequestState_Resource) Descriptor() ([]byte, []int) { - return fileDescriptor_b1b3693f36078fb7, []int{67, 0} + return fileDescriptor_b1b3693f36078fb7, []int{66, 0} } func (m *ResourceTokenRequestState_Resource) XXX_Unmarshal(b []byte) error { @@ -3999,7 +4007,7 @@ func (m *AuthCode) Reset() { *m = AuthCode{} } func (m *AuthCode) String() string { return proto.CompactTextString(m) } func (*AuthCode) ProtoMessage() {} func (*AuthCode) Descriptor() ([]byte, []int) { - return fileDescriptor_b1b3693f36078fb7, []int{68} + return fileDescriptor_b1b3693f36078fb7, []int{67} } func (m *AuthCode) XXX_Unmarshal(b []byte) error { @@ -4055,7 +4063,7 @@ func (m *ResourceTokens) Reset() { *m = ResourceTokens{} } func (m *ResourceTokens) String() string { return proto.CompactTextString(m) } func (*ResourceTokens) ProtoMessage() {} func (*ResourceTokens) Descriptor() ([]byte, []int) { - return fileDescriptor_b1b3693f36078fb7, []int{69} + return fileDescriptor_b1b3693f36078fb7, []int{68} } func (m *ResourceTokens) XXX_Unmarshal(b []byte) error { @@ -4110,7 +4118,7 @@ func (m *ResourceTokens_Descriptor) Reset() { *m = ResourceTokens_Descri func (m *ResourceTokens_Descriptor) String() string { return proto.CompactTextString(m) } func (*ResourceTokens_Descriptor) ProtoMessage() {} func (*ResourceTokens_Descriptor) Descriptor() ([]byte, []int) { - return fileDescriptor_b1b3693f36078fb7, []int{69, 0} + return fileDescriptor_b1b3693f36078fb7, []int{68, 0} } func (m *ResourceTokens_Descriptor) XXX_Unmarshal(b []byte) error { @@ -4176,7 +4184,7 @@ func (m *ResourceTokens_ResourceToken) Reset() { *m = ResourceTokens_Res func (m *ResourceTokens_ResourceToken) String() string { return proto.CompactTextString(m) } func (*ResourceTokens_ResourceToken) ProtoMessage() {} func (*ResourceTokens_ResourceToken) Descriptor() ([]byte, []int) { - return fileDescriptor_b1b3693f36078fb7, []int{69, 1} + return fileDescriptor_b1b3693f36078fb7, []int{68, 1} } func (m *ResourceTokens_ResourceToken) XXX_Unmarshal(b []byte) error { @@ -4320,7 +4328,9 @@ func init() { proto.RegisterMapType((map[string]*ServiceRole)(nil), "dam.v1.ServiceTemplate.ServiceRolesEntry") proto.RegisterMapType((map[string]string)(nil), "dam.v1.ServiceTemplate.UiEntry") proto.RegisterType((*ServiceRole)(nil), "dam.v1.ServiceRole") + proto.RegisterMapType((map[string]*ServiceRole_ServiceArg)(nil), "dam.v1.ServiceRole.ServiceArgsEntry") proto.RegisterMapType((map[string]string)(nil), "dam.v1.ServiceRole.UiEntry") + proto.RegisterType((*ServiceRole_ServiceArg)(nil), "dam.v1.ServiceRole.ServiceArg") proto.RegisterType((*ViewRole)(nil), "dam.v1.ViewRole") proto.RegisterMapType((map[string]bool)(nil), "dam.v1.ViewRole.ComputedPolicyBasisEntry") proto.RegisterType((*ViewRole_ViewPolicy)(nil), "dam.v1.ViewRole.ViewPolicy") @@ -4330,13 +4340,10 @@ func init() { proto.RegisterType((*VisaType)(nil), "dam.v1.VisaType") proto.RegisterMapType((map[string]string)(nil), "dam.v1.VisaType.UiEntry") proto.RegisterType((*ServiceDescriptor)(nil), "dam.v1.ServiceDescriptor") - proto.RegisterMapType((map[string]*ItemFormat)(nil), "dam.v1.ServiceDescriptor.ItemFormatsEntry") + proto.RegisterMapType((map[string]*VariableFormat)(nil), "dam.v1.ServiceDescriptor.ItemVariablesEntry") + proto.RegisterMapType((map[string]*VariableFormat)(nil), "dam.v1.ServiceDescriptor.ServiceVariablesEntry") proto.RegisterMapType((map[string]string)(nil), "dam.v1.ServiceDescriptor.UiEntry") - proto.RegisterType((*ServiceDescriptor_Requirements)(nil), "dam.v1.ServiceDescriptor.Requirements") proto.RegisterType((*ServiceDescriptor_Properties)(nil), "dam.v1.ServiceDescriptor.Properties") - proto.RegisterType((*ItemFormat)(nil), "dam.v1.ItemFormat") - proto.RegisterMapType((map[string]string)(nil), "dam.v1.ItemFormat.UiEntry") - proto.RegisterMapType((map[string]*VariableFormat)(nil), "dam.v1.ItemFormat.VariablesEntry") proto.RegisterType((*VariableFormat)(nil), "dam.v1.VariableFormat") proto.RegisterMapType((map[string]string)(nil), "dam.v1.VariableFormat.UiEntry") proto.RegisterType((*Realm)(nil), "dam.v1.Realm") @@ -4374,9 +4381,9 @@ func init() { proto.RegisterType((*GetTestResultsRequest)(nil), "dam.v1.GetTestResultsRequest") proto.RegisterType((*GetTestResultsResponse)(nil), "dam.v1.GetTestResultsResponse") proto.RegisterMapType((map[string]*v1.TestPersona)(nil), "dam.v1.GetTestResultsResponse.PersonasEntry") + proto.RegisterType((*GetTestResultsResponse_RejectedVisa)(nil), "dam.v1.GetTestResultsResponse.RejectedVisa") proto.RegisterType((*GetTestResultsResponse_TestResult)(nil), "dam.v1.GetTestResultsResponse.TestResult") proto.RegisterMapType((map[string]string)(nil), "dam.v1.GetTestResultsResponse.TestResult.NoAccessEntry") - proto.RegisterMapType((map[string]string)(nil), "dam.v1.GetTestResultsResponse.TestResult.RejectedVisasEntry") proto.RegisterType((*ServicesRequest)(nil), "dam.v1.ServicesRequest") proto.RegisterType((*ServicesResponse)(nil), "dam.v1.ServicesResponse") proto.RegisterMapType((map[string]*ServiceDescriptor)(nil), "dam.v1.ServicesResponse.ServicesEntry") @@ -4429,270 +4436,270 @@ func init() { func init() { proto.RegisterFile("proto/dam/v1/dam_service.proto", fileDescriptor_b1b3693f36078fb7) } var fileDescriptor_b1b3693f36078fb7 = []byte{ - // 4229 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xc4, 0x5b, 0x5b, 0x6f, 0x1b, 0xc9, - 0x72, 0xce, 0x50, 0x37, 0xb2, 0x48, 0xea, 0xd2, 0x92, 0x6d, 0x7a, 0x2c, 0x7b, 0x65, 0xae, 0xbd, - 0xbe, 0xad, 0xa9, 0x63, 0x2f, 0x36, 0xde, 0xfb, 0xc6, 0x96, 0x6c, 0xaf, 0x76, 0x63, 0x5b, 0x67, - 0x24, 0x1b, 0x27, 0x9b, 0x83, 0x0c, 0x5a, 0x9c, 0x16, 0x35, 0xc7, 0xe4, 0x0c, 0x4f, 0xcf, 0x50, - 0xb6, 0x80, 0x04, 0x48, 0xb0, 0x40, 0x82, 0xe4, 0xbc, 0x9e, 0x1f, 0x90, 0xf7, 0x20, 0x0b, 0x24, - 0x6f, 0x01, 0x02, 0x24, 0xbf, 0x20, 0x08, 0xf2, 0x92, 0xa7, 0x3c, 0xe4, 0xf2, 0x12, 0xe4, 0x2d, - 0xc8, 0x0f, 0x08, 0xfa, 0x3a, 0xdd, 0x33, 0x43, 0x5d, 0x76, 0x19, 0xe4, 0xc5, 0x66, 0x57, 0x57, - 0x7d, 0x53, 0xdd, 0x5d, 0x5d, 0x55, 0x5d, 0xdd, 0x82, 0x2b, 0x43, 0x1a, 0xa7, 0xf1, 0x7a, 0x80, - 0x07, 0xeb, 0x87, 0xf7, 0xd8, 0x7f, 0x7e, 0x42, 0xe8, 0x61, 0xd8, 0x25, 0x1d, 0xde, 0x81, 0x66, - 0x03, 0x3c, 0xe8, 0x1c, 0xde, 0x73, 0x57, 0x05, 0x5f, 0x37, 0x1e, 0x0c, 0xe2, 0x88, 0xb1, 0x8a, - 0x5f, 0x82, 0xcb, 0xbd, 0x9a, 0xef, 0x8d, 0xf1, 0x28, 0x3d, 0xe8, 0xf6, 0x43, 0x12, 0xa5, 0x92, - 0x45, 0x7e, 0x68, 0x48, 0xe3, 0x2e, 0x49, 0x12, 0xc6, 0x23, 0x7f, 0x8a, 0xfe, 0xf6, 0x3f, 0xd4, - 0xa1, 0xb6, 0x89, 0x07, 0x1b, 0x71, 0xb4, 0x1f, 0xf6, 0x50, 0x0b, 0xe6, 0x0e, 0x09, 0x4d, 0xc2, - 0x38, 0x6a, 0x39, 0x6b, 0xce, 0xcd, 0x9a, 0xa7, 0x9a, 0xc8, 0x85, 0x2a, 0x25, 0x87, 0x21, 0xef, - 0xaa, 0xac, 0x39, 0x37, 0xa7, 0x3c, 0xdd, 0x46, 0xef, 0x40, 0x9d, 0xa9, 0x10, 0xa6, 0x7e, 0x1a, - 0x0e, 0x48, 0x6b, 0x6a, 0xcd, 0xb9, 0xe9, 0x78, 0x20, 0x48, 0xbb, 0xe1, 0x80, 0xa0, 0xe7, 0xb0, - 0x90, 0xd2, 0x51, 0x92, 0x92, 0xc0, 0x0f, 0x93, 0x64, 0x44, 0x68, 0xd2, 0x9a, 0x5e, 0x9b, 0xba, - 0x59, 0xbf, 0x7f, 0xbd, 0x23, 0xc6, 0xd9, 0xd1, 0x2a, 0x74, 0x76, 0x05, 0xe3, 0x96, 0xe0, 0x7b, - 0x1c, 0xa5, 0xf4, 0xc8, 0x9b, 0x4f, 0x2d, 0xa2, 0x89, 0x97, 0xc4, 0x23, 0xda, 0x25, 0x49, 0x6b, - 0xe6, 0x04, 0xbc, 0x1d, 0xc1, 0x67, 0xe3, 0x49, 0x22, 0xfa, 0x14, 0xaa, 0xc3, 0xb8, 0x1f, 0x76, - 0x43, 0x92, 0xb4, 0x66, 0x39, 0xd0, 0x3b, 0x45, 0xa0, 0x6d, 0xc9, 0x21, 0x20, 0xb4, 0x00, 0xfa, - 0x02, 0x6a, 0x94, 0x28, 0x35, 0xe6, 0xb8, 0xf4, 0x5a, 0x51, 0xda, 0x53, 0x2c, 0x42, 0x3c, 0x13, - 0x41, 0x1f, 0xc1, 0x9c, 0x58, 0xb1, 0xa4, 0x55, 0xe5, 0xd2, 0x57, 0x8a, 0xd2, 0x1b, 0x82, 0x41, - 0xc8, 0x2a, 0x76, 0xb4, 0x0b, 0x4b, 0xd2, 0x6a, 0xfc, 0x94, 0x0c, 0x86, 0x7d, 0x9c, 0x92, 0xa4, - 0x55, 0xe3, 0x18, 0x37, 0x8a, 0x18, 0x3b, 0x82, 0x75, 0x57, 0x71, 0x0a, 0xb0, 0xc5, 0x24, 0x47, - 0x46, 0x5f, 0x02, 0x1c, 0x86, 0x09, 0xf6, 0xd3, 0xa3, 0x21, 0x49, 0x5a, 0x30, 0x6e, 0x40, 0xaf, - 0xc2, 0x04, 0xef, 0x32, 0x16, 0x39, 0xa0, 0x43, 0xd5, 0x46, 0x5f, 0x41, 0x33, 0x25, 0x49, 0xea, - 0x0f, 0x09, 0x4d, 0xe2, 0x08, 0x27, 0xad, 0x3a, 0xc7, 0x78, 0xb7, 0x64, 0x6d, 0x48, 0x92, 0x6e, - 0x4b, 0x2e, 0x01, 0xd3, 0x48, 0x0d, 0x12, 0x5a, 0x87, 0xb9, 0x78, 0x98, 0x86, 0x71, 0x94, 0xb4, - 0x1a, 0x6b, 0xce, 0xcd, 0xfa, 0xfd, 0x73, 0x0a, 0x43, 0x00, 0xbc, 0x10, 0x9d, 0x9e, 0xe2, 0x42, - 0xb7, 0xa0, 0x32, 0x0a, 0x5b, 0x4d, 0xfe, 0xbd, 0x8b, 0xc5, 0xef, 0xbd, 0x0c, 0xc5, 0x57, 0x2a, - 0xa3, 0xd0, 0xfd, 0x19, 0x2c, 0x97, 0x98, 0x1a, 0x5a, 0x84, 0xa9, 0xd7, 0xe4, 0x48, 0x5a, 0x3f, - 0xfb, 0x89, 0xee, 0xc0, 0xcc, 0x21, 0xee, 0x8f, 0x08, 0x37, 0x7b, 0x43, 0x05, 0x4b, 0xda, 0x13, - 0x3c, 0x9f, 0x54, 0x3e, 0x72, 0x0c, 0x64, 0xd3, 0xe8, 0xce, 0x8e, 0x2c, 0xa4, 0x4d, 0xe4, 0x6f, - 0xa0, 0x69, 0x59, 0x61, 0x09, 0xe6, 0x35, 0x1b, 0x73, 0x5e, 0x61, 0x72, 0xb9, 0x23, 0x13, 0xec, - 0x39, 0xcc, 0xdb, 0x46, 0x59, 0x82, 0xf6, 0x9e, 0x8d, 0xb6, 0xa8, 0xd0, 0x94, 0xa0, 0x89, 0xf7, - 0x35, 0x34, 0x4c, 0x33, 0x3d, 0x8d, 0x6e, 0xd2, 0x99, 0x09, 0x31, 0x13, 0xeb, 0xe7, 0x70, 0xae, - 0xd4, 0x5c, 0x4b, 0x40, 0xef, 0xda, 0xa0, 0x17, 0x94, 0x8a, 0x39, 0xf9, 0xdc, 0xc8, 0x6d, 0xeb, - 0x3d, 0xc3, 0xc8, 0x95, 0xa0, 0x89, 0xb7, 0x0b, 0x4b, 0x05, 0x4b, 0x2e, 0x81, 0xbc, 0x65, 0x43, - 0x2e, 0xab, 0xe1, 0x1b, 0xb2, 0x26, 0xea, 0x87, 0x30, 0x27, 0xed, 0xb5, 0x04, 0x6b, 0xc5, 0xc4, - 0xaa, 0x19, 0x62, 0xed, 0x5f, 0x55, 0xa0, 0x69, 0x99, 0x26, 0x3a, 0x0f, 0xb3, 0xc2, 0xeb, 0x4a, - 0x00, 0xd9, 0x42, 0x37, 0x98, 0x17, 0xc5, 0x51, 0xc2, 0xa6, 0xc7, 0x1f, 0x25, 0x61, 0xd4, 0x93, - 0x68, 0xf3, 0x9a, 0xfc, 0x92, 0x51, 0xd1, 0x25, 0xa8, 0x09, 0x97, 0xe3, 0x87, 0x01, 0xf7, 0xee, - 0x35, 0xaf, 0x2a, 0x08, 0x5b, 0x01, 0xba, 0x08, 0x55, 0x16, 0x74, 0xfc, 0x11, 0xed, 0xb7, 0xa6, - 0x45, 0xcc, 0x60, 0xed, 0x97, 0xb4, 0xcf, 0xe4, 0xd2, 0xf8, 0x35, 0x89, 0x78, 0xdf, 0x8c, 0x90, - 0xe3, 0x04, 0xd6, 0x79, 0x97, 0x6f, 0x55, 0xe1, 0x6d, 0x2f, 0x97, 0xee, 0x29, 0x6b, 0xbb, 0xfe, - 0xc0, 0xd9, 0xf8, 0xde, 0xd1, 0xb3, 0x21, 0xb6, 0x13, 0x0b, 0x71, 0xca, 0x59, 0x3b, 0x6b, 0x53, - 0x4c, 0x5d, 0xe5, 0x88, 0x2f, 0x5b, 0x8e, 0xaf, 0xc2, 0x3b, 0x0d, 0xb7, 0x26, 0x14, 0x9e, 0x2a, - 0x55, 0x58, 0x60, 0x4f, 0x42, 0xe1, 0x7f, 0xac, 0xc0, 0xac, 0xd8, 0xab, 0xe8, 0x0e, 0xcc, 0xe2, - 0xe8, 0xc8, 0x8f, 0xf7, 0xb9, 0xa2, 0xf5, 0xfb, 0x2b, 0x7a, 0xbf, 0xc4, 0x51, 0x10, 0x32, 0x87, - 0xb7, 0x43, 0x52, 0x6f, 0x06, 0x47, 0x47, 0x2f, 0xf6, 0xd1, 0xb7, 0xb0, 0x72, 0x88, 0x69, 0x88, - 0xf7, 0xfa, 0xc4, 0x0f, 0xc8, 0x7e, 0x18, 0x85, 0xc2, 0x6f, 0x56, 0xec, 0x70, 0x20, 0xa0, 0x3b, - 0xaf, 0x24, 0xeb, 0x66, 0xc6, 0x29, 0x34, 0x5f, 0x3e, 0x2c, 0xf6, 0xa0, 0xf7, 0x8c, 0x91, 0x9f, - 0xcf, 0x21, 0x99, 0x43, 0xfe, 0x3d, 0x68, 0x8d, 0x03, 0x2e, 0x99, 0x83, 0xf7, 0xed, 0xed, 0xa0, - 0x81, 0x15, 0xc4, 0x93, 0x98, 0x0e, 0x70, 0x3a, 0x81, 0x1d, 0xf1, 0x67, 0xb3, 0x30, 0xfd, 0x2a, - 0x24, 0x6f, 0xd0, 0x2d, 0x58, 0xcc, 0xc7, 0x4b, 0x89, 0xb0, 0x90, 0x8b, 0x82, 0xe8, 0x37, 0xa1, - 0x3a, 0x20, 0x29, 0x0e, 0x70, 0x8a, 0xe5, 0x14, 0xba, 0x99, 0x07, 0x20, 0x6f, 0x3a, 0xcf, 0x64, - 0xa7, 0x4c, 0x06, 0x14, 0x2f, 0x7a, 0x17, 0x9a, 0xdd, 0x38, 0x4a, 0xd9, 0x5e, 0x11, 0x66, 0x34, - 0xc5, 0xcd, 0xa8, 0x21, 0x89, 0xca, 0x92, 0x66, 0x68, 0xdc, 0x27, 0x2a, 0x09, 0xba, 0x60, 0x21, - 0x7b, 0xac, 0x47, 0xc0, 0x0a, 0x2e, 0x74, 0x15, 0x1a, 0x01, 0xd9, 0xc7, 0xa3, 0x7e, 0xea, 0x33, - 0x82, 0xdc, 0x49, 0x75, 0x49, 0x63, 0xfc, 0xe8, 0x06, 0xcc, 0x84, 0x29, 0x19, 0xa8, 0xec, 0x65, - 0xc9, 0x42, 0xdc, 0x4a, 0xc9, 0xc0, 0x13, 0xfd, 0xe8, 0x1a, 0x5f, 0xca, 0x39, 0x69, 0x4f, 0x26, - 0x97, 0xb1, 0x90, 0xe8, 0x19, 0x2c, 0x77, 0xe3, 0xc1, 0x70, 0xc4, 0x13, 0xb6, 0x28, 0x25, 0x74, - 0x1f, 0xb3, 0xfd, 0x22, 0xd2, 0x93, 0x6b, 0x96, 0xd8, 0x86, 0xe4, 0xdb, 0xd2, 0x6c, 0x02, 0x06, - 0x32, 0x39, 0x77, 0x08, 0xd3, 0x4c, 0x07, 0xb4, 0x0e, 0xd3, 0x98, 0xf6, 0x12, 0x69, 0xce, 0x97, - 0x0a, 0x4a, 0x76, 0x1e, 0xd2, 0x9e, 0x14, 0xe7, 0x8c, 0xee, 0x03, 0xa8, 0x69, 0xd2, 0x59, 0x96, - 0xdc, 0xfd, 0x14, 0x9a, 0xd6, 0x0a, 0x9d, 0x49, 0xf8, 0x6b, 0x80, 0x6c, 0x11, 0xce, 0x14, 0x1a, - 0xc8, 0x1b, 0x26, 0xf8, 0xe3, 0x4d, 0xd6, 0xfd, 0x19, 0x5c, 0x18, 0x33, 0xb1, 0x25, 0x30, 0x37, - 0x6c, 0x7d, 0xf4, 0xe2, 0x6b, 0x49, 0x73, 0x33, 0x5c, 0x86, 0x9a, 0xa6, 0x33, 0xac, 0x11, 0x0d, - 0xa5, 0x1f, 0x64, 0x3f, 0xdb, 0x7f, 0x5f, 0x81, 0xaa, 0x0a, 0xee, 0x2c, 0xe7, 0x1f, 0x0d, 0xf6, - 0x28, 0xe9, 0xf7, 0xb1, 0xfc, 0x9e, 0x6e, 0xa3, 0x7b, 0x30, 0x73, 0x18, 0x92, 0x37, 0xca, 0xc1, - 0x5c, 0xca, 0x67, 0x06, 0x7c, 0x36, 0x94, 0x1d, 0x73, 0x4e, 0xe6, 0x79, 0x55, 0xa2, 0x2b, 0x76, - 0x85, 0x4e, 0x64, 0xdb, 0xd0, 0x1c, 0xe0, 0xb7, 0xbe, 0x08, 0x16, 0x69, 0xaa, 0x02, 0x49, 0x7d, - 0x80, 0xdf, 0xee, 0x32, 0xda, 0x6e, 0xda, 0x47, 0x37, 0xb9, 0xe5, 0x8a, 0x34, 0xbf, 0x55, 0xf8, - 0x9a, 0xe9, 0x86, 0x9e, 0x00, 0x64, 0x1f, 0x2f, 0x99, 0xaf, 0xb6, 0x3d, 0x5f, 0x0d, 0x6b, 0xfd, - 0x7e, 0xbc, 0xbb, 0xf9, 0x8f, 0x29, 0x58, 0xc8, 0x25, 0x1f, 0x6c, 0x0b, 0x2b, 0xcf, 0x13, 0xe1, - 0x81, 0xf2, 0x3a, 0x75, 0x49, 0x7b, 0x8e, 0x07, 0x84, 0x1d, 0xa2, 0xd8, 0x16, 0xf5, 0xf7, 0xb9, - 0xdb, 0x93, 0xb0, 0xc0, 0x48, 0xc2, 0x11, 0xa2, 0xa7, 0x60, 0xec, 0x29, 0xe9, 0x8d, 0x6f, 0x8c, - 0xc9, 0x76, 0x3a, 0xc7, 0x6c, 0x47, 0xf4, 0x14, 0x9a, 0x4a, 0x19, 0xd3, 0x0d, 0xdd, 0x1a, 0x87, - 0x25, 0xdb, 0x45, 0xc7, 0xb4, 0x6e, 0x2c, 0xc9, 0x3b, 0xe3, 0xa4, 0xcd, 0x95, 0xf9, 0x1c, 0x16, - 0x4e, 0x36, 0xe7, 0xf1, 0xbb, 0x62, 0x17, 0x96, 0x0a, 0xba, 0x9c, 0x26, 0xcf, 0xb2, 0x35, 0x9b, - 0xcc, 0x16, 0x6d, 0xff, 0xa7, 0x03, 0x75, 0x03, 0x91, 0x2d, 0x71, 0x8a, 0x69, 0x8f, 0xa4, 0x72, - 0x52, 0xc5, 0xa6, 0xaa, 0x0b, 0x1a, 0xd7, 0x97, 0x05, 0x07, 0xc9, 0x92, 0x74, 0xe3, 0x2c, 0xc7, - 0x90, 0x72, 0x3b, 0x9c, 0x86, 0x3a, 0xb0, 0x1c, 0xe0, 0x01, 0x07, 0xf1, 0xbb, 0x38, 0x25, 0xbd, - 0x98, 0x86, 0x3a, 0x8e, 0x2c, 0x05, 0x78, 0xc0, 0xb0, 0x36, 0x74, 0x07, 0xba, 0xc3, 0x17, 0x61, - 0xda, 0xde, 0x85, 0x86, 0x62, 0x93, 0x48, 0x4a, 0xfe, 0x62, 0x0a, 0xaa, 0xca, 0xbb, 0xa1, 0x07, - 0xc6, 0x61, 0xb9, 0xc4, 0x93, 0xf3, 0x6f, 0xb2, 0x1f, 0xf2, 0xc4, 0x91, 0x1d, 0x94, 0x7f, 0x02, - 0x2d, 0x1d, 0x55, 0xf2, 0xc3, 0x13, 0x33, 0x31, 0x4f, 0xed, 0xb1, 0xbd, 0x84, 0x73, 0x5a, 0x82, - 0xc3, 0x1c, 0xf9, 0x7b, 0x38, 0x09, 0x95, 0xf5, 0xdf, 0x2a, 0x7c, 0x57, 0x39, 0x4d, 0xf1, 0xed, - 0x47, 0x8c, 0x57, 0x0c, 0xbe, 0x3e, 0xcc, 0x28, 0xee, 0xaf, 0x1d, 0xe1, 0x21, 0x64, 0x9e, 0x85, - 0x60, 0xda, 0xd8, 0x94, 0xfc, 0x37, 0xfa, 0x58, 0x86, 0xaa, 0x8a, 0x5d, 0x56, 0x28, 0x19, 0xe0, - 0xe4, 0x82, 0xd6, 0x13, 0x68, 0x8d, 0xd3, 0xff, 0x24, 0x9c, 0xaa, 0xb5, 0x5a, 0xd3, 0xd0, 0xb4, - 0xce, 0xc7, 0xe8, 0x03, 0x38, 0x4f, 0x09, 0x0e, 0xfc, 0x38, 0xea, 0x1f, 0xf9, 0x03, 0x9c, 0xa4, - 0x84, 0xfa, 0x94, 0xe0, 0xfe, 0x80, 0x03, 0x56, 0xbd, 0x65, 0xd6, 0xfb, 0x22, 0xea, 0x1f, 0x3d, - 0xe3, 0x7d, 0x1e, 0xeb, 0x42, 0x77, 0x01, 0xbd, 0x39, 0x08, 0x53, 0xd2, 0x0f, 0x79, 0xa1, 0x85, - 0xf3, 0xab, 0x85, 0x5a, 0x32, 0x7a, 0x38, 0x77, 0x82, 0xb6, 0xa0, 0xdd, 0xeb, 0x0e, 0xfd, 0x01, - 0x8e, 0x70, 0x8f, 0x04, 0xfe, 0x6b, 0x72, 0x94, 0xf8, 0xcc, 0xa9, 0x53, 0xf2, 0xcb, 0x11, 0xe1, - 0x08, 0xcc, 0xb1, 0x8b, 0xd3, 0xc3, 0xe5, 0x5e, 0x77, 0xf8, 0x4c, 0x30, 0x7e, 0x43, 0x8e, 0x92, - 0x67, 0xf8, 0xad, 0xa7, 0xb8, 0x98, 0xab, 0xff, 0x02, 0x56, 0x0b, 0x50, 0x43, 0x42, 0x7d, 0xdc, - 0xed, 0xc6, 0xa3, 0x28, 0xe5, 0xd1, 0x61, 0xc6, 0x6b, 0xd9, 0x20, 0xdb, 0x84, 0x3e, 0x14, 0xfd, - 0xe8, 0x73, 0xb8, 0xc4, 0xe4, 0x95, 0x93, 0x93, 0x62, 0xfe, 0x90, 0xc6, 0xbf, 0x20, 0xdd, 0x54, - 0xe6, 0x4f, 0x4c, 0x5c, 0x6e, 0x13, 0x29, 0xb7, 0x2d, 0xfa, 0xd1, 0xef, 0xc0, 0x8a, 0xb6, 0xba, - 0x80, 0x24, 0x5d, 0x1a, 0x0e, 0xd3, 0x98, 0xaa, 0xdc, 0xaa, 0x53, 0x5a, 0x82, 0xd0, 0x96, 0xb7, - 0x99, 0x09, 0x48, 0xcb, 0x33, 0x20, 0xd0, 0x87, 0x70, 0x81, 0x69, 0x16, 0xe2, 0x81, 0xbf, 0x17, - 0xf6, 0xfb, 0x61, 0xd4, 0xd3, 0x5a, 0xcd, 0x71, 0xad, 0x56, 0x7a, 0xdd, 0xe1, 0x16, 0x1e, 0x3c, - 0x12, 0x9d, 0x52, 0x23, 0xf7, 0xdb, 0xcc, 0x32, 0xf2, 0xf8, 0x25, 0x96, 0x71, 0xd3, 0xf6, 0x7f, - 0x48, 0x1d, 0x1b, 0x32, 0x51, 0xd3, 0x5a, 0x5e, 0xb3, 0xad, 0x2d, 0xce, 0x38, 0x32, 0xc6, 0x56, - 0xec, 0x18, 0xab, 0x7a, 0x27, 0xe1, 0x48, 0xfe, 0x7a, 0x46, 0xbb, 0xf0, 0x4c, 0x1b, 0x96, 0x67, - 0xb0, 0x58, 0xc1, 0x22, 0x9f, 0xca, 0x33, 0x54, 0x1b, 0x7d, 0x0d, 0x0d, 0x66, 0x41, 0x21, 0x25, - 0x03, 0x9e, 0x39, 0x88, 0x31, 0xbd, 0x97, 0x73, 0x74, 0x19, 0x58, 0xc7, 0x33, 0xb8, 0x3d, 0x4b, - 0x16, 0x6d, 0x02, 0x0c, 0x69, 0x3c, 0x24, 0x34, 0x15, 0x1e, 0xd5, 0x31, 0xb3, 0xd9, 0x22, 0xd2, - 0xb6, 0xe6, 0xf5, 0x0c, 0x39, 0xf4, 0x0c, 0x1a, 0x46, 0xa0, 0x56, 0xd1, 0xf3, 0xf6, 0x78, 0x9c, - 0x2d, 0x1d, 0xc3, 0x95, 0x49, 0x64, 0x51, 0x3d, 0x41, 0xf7, 0x8c, 0x20, 0x7a, 0x75, 0x3c, 0x88, - 0x39, 0xf9, 0x01, 0x34, 0xcc, 0x51, 0xb2, 0xd4, 0xc1, 0x08, 0x3d, 0x72, 0x4f, 0x43, 0x16, 0x79, - 0x8c, 0xd8, 0xc4, 0x03, 0x8f, 0x74, 0x19, 0x75, 0x23, 0xee, 0xb0, 0x55, 0xc4, 0x23, 0x71, 0xba, - 0xaf, 0x7a, 0xec, 0xa7, 0xfb, 0xfb, 0x00, 0xd9, 0x0c, 0x30, 0x88, 0x30, 0xf1, 0x71, 0xaf, 0x47, - 0x49, 0x4f, 0x9d, 0x9b, 0xaa, 0x5e, 0x3d, 0x4c, 0x1e, 0x2a, 0x12, 0xba, 0x0d, 0x4b, 0x5d, 0x1c, - 0xf9, 0x7b, 0x24, 0x63, 0x0b, 0xe4, 0xa7, 0x16, 0xba, 0x38, 0x7a, 0x44, 0x34, 0x6b, 0xc0, 0x54, - 0x4e, 0xc2, 0xa8, 0xd7, 0x27, 0x3e, 0x9b, 0x0b, 0xf9, 0x59, 0x10, 0x24, 0x36, 0x5f, 0xae, 0x07, - 0x8b, 0xf9, 0x79, 0x3b, 0x8d, 0xa9, 0xab, 0xd4, 0x57, 0x8b, 0x4e, 0x20, 0xd2, 0xff, 0x71, 0x05, - 0x20, 0x03, 0x44, 0x5f, 0x42, 0x4d, 0x1d, 0x92, 0x55, 0x00, 0xbc, 0x5a, 0xfc, 0xae, 0x3e, 0xc6, - 0xea, 0xfa, 0xa8, 0x6a, 0xa3, 0xdb, 0xc6, 0x2e, 0x73, 0x4b, 0x24, 0xcd, 0xa5, 0xde, 0x85, 0x79, - 0x1b, 0xe8, 0xff, 0xf3, 0x20, 0xfd, 0xef, 0x4e, 0xa6, 0x8d, 0x9c, 0x8c, 0xf3, 0x30, 0x4b, 0x49, - 0x8f, 0xbc, 0x1d, 0xaa, 0xda, 0x92, 0x68, 0xb1, 0x2d, 0x2d, 0x6a, 0xb2, 0xb8, 0x2f, 0x4d, 0x40, - 0xb7, 0x51, 0xc7, 0x28, 0x27, 0x5c, 0x29, 0x57, 0xd6, 0x3a, 0x8d, 0x22, 0x98, 0x66, 0x67, 0x69, - 0x79, 0x28, 0xe0, 0xbf, 0x51, 0x1b, 0x1a, 0xe4, 0xed, 0x90, 0xd0, 0x90, 0xed, 0x00, 0x2c, 0xaa, - 0x4b, 0x55, 0xcf, 0xa2, 0xfd, 0xd0, 0x51, 0xce, 0xc1, 0x0c, 0x0f, 0x69, 0xed, 0xef, 0x1d, 0x40, - 0xdb, 0x38, 0x49, 0x86, 0x31, 0x4d, 0x77, 0x65, 0x45, 0x2c, 0xa6, 0x2c, 0x2e, 0xb2, 0xf0, 0x80, - 0xd3, 0x70, 0x8f, 0x99, 0xaf, 0xbc, 0xcf, 0x10, 0xe9, 0xde, 0x52, 0xd6, 0xa3, 0xee, 0x2a, 0xee, - 0x1b, 0xab, 0xdd, 0xd6, 0xc5, 0x93, 0x02, 0xec, 0x24, 0xbc, 0xeb, 0x22, 0xcc, 0x3f, 0x25, 0xe9, - 0x56, 0xb4, 0x1f, 0xcb, 0x70, 0xda, 0xfe, 0x37, 0x07, 0x16, 0x34, 0x29, 0x19, 0xc6, 0x51, 0x42, - 0x4a, 0xd3, 0x1d, 0x17, 0xaa, 0xf2, 0xa2, 0x47, 0x45, 0x78, 0xdd, 0x46, 0x97, 0x01, 0x92, 0x14, - 0x53, 0xe3, 0x72, 0x67, 0xca, 0xab, 0x71, 0x0a, 0xbf, 0xdb, 0x69, 0xc1, 0xdc, 0x20, 0x0e, 0x46, - 0xea, 0x1c, 0x51, 0xf3, 0x54, 0xb3, 0xfc, 0x78, 0x90, 0xd3, 0x66, 0x12, 0xc3, 0xbe, 0xc7, 0xdc, - 0x21, 0xee, 0x0f, 0xe4, 0xa0, 0xd1, 0x55, 0x98, 0xe6, 0x4e, 0xc5, 0xe1, 0xdb, 0xa1, 0x99, 0x9d, - 0x15, 0x19, 0x0f, 0xef, 0x6a, 0x2f, 0x40, 0x53, 0x8a, 0x08, 0x35, 0xda, 0x4f, 0x61, 0xf9, 0x29, - 0x49, 0x75, 0x3d, 0x5c, 0x41, 0x9d, 0x87, 0xd9, 0xfd, 0xb0, 0x9f, 0x66, 0xa5, 0x53, 0xd1, 0x62, - 0x83, 0x0e, 0xa3, 0x6e, 0x7f, 0x14, 0x28, 0x75, 0x54, 0xb3, 0xfd, 0x57, 0x0e, 0xac, 0xd8, 0x48, - 0x72, 0xda, 0xb7, 0xcc, 0x6b, 0x22, 0xe1, 0x36, 0xee, 0x18, 0x93, 0x52, 0x10, 0x18, 0x7f, 0x63, - 0x34, 0xe9, 0xca, 0x7d, 0xfb, 0x1c, 0x1f, 0xfc, 0x93, 0x3e, 0x4e, 0xf9, 0xb9, 0x59, 0x19, 0xcf, - 0xdf, 0xd6, 0xf8, 0x50, 0x0c, 0xba, 0x1c, 0xca, 0xe7, 0xea, 0xec, 0xef, 0xd8, 0x87, 0xd0, 0x32, - 0xe6, 0x62, 0x1d, 0xc0, 0xfd, 0xae, 0x0a, 0x55, 0xc5, 0xc7, 0xce, 0x44, 0x6a, 0x60, 0xfe, 0x10, - 0xa7, 0x07, 0x72, 0x0c, 0x0d, 0x45, 0xdc, 0xc6, 0xe9, 0x81, 0x55, 0x88, 0xa8, 0xe4, 0x0a, 0x11, - 0x26, 0x00, 0xb7, 0xeb, 0x29, 0x1b, 0x80, 0x1f, 0xae, 0x2f, 0x41, 0x8d, 0x7d, 0x5b, 0x30, 0x08, - 0x3f, 0x52, 0x65, 0x04, 0xd5, 0xc9, 0x8f, 0x23, 0xbc, 0x53, 0x96, 0xa9, 0x19, 0x81, 0x77, 0x5e, - 0x87, 0x79, 0x7d, 0x74, 0x16, 0x1c, 0xb3, 0x9c, 0xa3, 0xa9, 0xa9, 0x9c, 0xed, 0x5d, 0xc8, 0x08, - 0xfe, 0x88, 0x86, 0x32, 0x9d, 0x6b, 0x68, 0xe2, 0x4b, 0x1a, 0xb2, 0x18, 0x6a, 0x16, 0x07, 0x5b, - 0x55, 0x51, 0x05, 0x30, 0x6a, 0x83, 0xe8, 0x85, 0x51, 0x77, 0x14, 0x37, 0x79, 0x1f, 0x1c, 0x3b, - 0xbb, 0x8a, 0x32, 0xb6, 0x20, 0x99, 0xaf, 0x3c, 0x40, 0xb1, 0xf2, 0x60, 0xa6, 0x5f, 0xf5, 0x5c, - 0xfa, 0x75, 0x0b, 0x16, 0xd5, 0x6f, 0x95, 0x4f, 0xf3, 0xab, 0xb8, 0x9a, 0xb7, 0xa0, 0xe8, 0x32, - 0x57, 0x29, 0x16, 0x71, 0x9a, 0xc5, 0x22, 0xce, 0x2b, 0xa8, 0xeb, 0xc5, 0x1a, 0x85, 0xad, 0x79, - 0x3e, 0xc2, 0x0f, 0x4f, 0x37, 0x42, 0x65, 0xb9, 0xca, 0x63, 0x00, 0xd5, 0x04, 0xf4, 0x35, 0xcc, - 0xf1, 0xf5, 0x1d, 0x85, 0xad, 0x05, 0x8e, 0x79, 0xef, 0x74, 0x98, 0xec, 0x1f, 0x85, 0x37, 0x7b, - 0xc8, 0x1b, 0x0c, 0x8b, 0x9b, 0xc3, 0x28, 0x6c, 0x2d, 0x9e, 0x05, 0x8b, 0x65, 0x5a, 0x1a, 0x8b, - 0xf2, 0x06, 0xba, 0x01, 0x0b, 0xf9, 0x93, 0xee, 0x52, 0xd9, 0x49, 0xf7, 0xc7, 0x15, 0x2c, 0x3f, - 0x87, 0x85, 0xdc, 0xe4, 0x9c, 0x49, 0xfc, 0x63, 0xa8, 0x1b, 0xf3, 0x70, 0x56, 0x51, 0x63, 0xd8, - 0x67, 0x12, 0xf5, 0x4f, 0xa8, 0xd2, 0x7d, 0x6a, 0x3b, 0xb0, 0xeb, 0xa7, 0x5a, 0x04, 0xd3, 0xab, - 0xad, 0x00, 0x32, 0xfc, 0xaa, 0x72, 0x6a, 0xbf, 0x6b, 0x39, 0x7a, 0xed, 0xd2, 0xde, 0x87, 0xaa, - 0x32, 0x27, 0x19, 0x37, 0x8a, 0x1e, 0x53, 0x73, 0xb0, 0xb0, 0x80, 0xbb, 0x5d, 0x92, 0xa8, 0x60, - 0x29, 0x5b, 0xed, 0x25, 0x1e, 0x6d, 0x2d, 0x27, 0xfa, 0x97, 0x0e, 0x2c, 0x66, 0x34, 0xf9, 0xb5, - 0x8f, 0x6d, 0x07, 0xfa, 0xae, 0x31, 0xb6, 0x13, 0x9c, 0xe7, 0xb8, 0x4f, 0x4f, 0xaa, 0xe8, 0x29, - 0x73, 0x08, 0x4e, 0x95, 0x23, 0xf8, 0x46, 0x0f, 0x4a, 0xeb, 0xbf, 0x06, 0xd3, 0x4c, 0x1b, 0x39, - 0x53, 0x36, 0x16, 0xef, 0x19, 0x3b, 0x43, 0x22, 0xd4, 0xa8, 0x32, 0x8a, 0x9e, 0xa5, 0xbf, 0x11, - 0x51, 0xd3, 0xa0, 0x67, 0xa1, 0x26, 0x2b, 0xa7, 0xd9, 0xa1, 0xa6, 0xc0, 0x5c, 0x72, 0x75, 0x32, - 0x6e, 0xb6, 0x26, 0x58, 0xe2, 0x97, 0x76, 0xa6, 0x7b, 0xe4, 0x88, 0x76, 0xac, 0x81, 0xea, 0xf1, - 0x5c, 0x83, 0x69, 0x7d, 0x46, 0x2b, 0xc3, 0xe5, 0xbd, 0x63, 0x67, 0xef, 0x15, 0x5f, 0x0a, 0xee, - 0x4d, 0x8d, 0x0c, 0x85, 0x92, 0x74, 0x44, 0xa3, 0x2c, 0x01, 0x67, 0x2d, 0x74, 0x11, 0xaa, 0xcc, - 0x99, 0xf8, 0xa3, 0x44, 0xa7, 0x28, 0xac, 0xfd, 0x32, 0xe1, 0x47, 0xbd, 0xac, 0x14, 0xc3, 0x7e, - 0xb6, 0x2f, 0xc0, 0x39, 0x86, 0x4b, 0x12, 0xb6, 0x31, 0x46, 0xfd, 0x54, 0xaf, 0xcb, 0x77, 0x73, - 0x70, 0x3e, 0xdf, 0x23, 0x47, 0xf2, 0xc3, 0x9e, 0x0a, 0xad, 0x42, 0x8d, 0xa5, 0x91, 0x49, 0x8a, - 0x07, 0x43, 0xf9, 0x50, 0x28, 0x23, 0xa0, 0xaf, 0xa0, 0xaa, 0x1f, 0x8d, 0x88, 0x63, 0xf5, 0xfb, - 0xc6, 0x82, 0x97, 0x68, 0xd1, 0xb1, 0x5f, 0x8f, 0x68, 0x69, 0xf4, 0xdb, 0xc0, 0x5f, 0x92, 0xf8, - 0x54, 0xf0, 0xcb, 0x2c, 0xf4, 0xd6, 0x09, 0x68, 0x19, 0xcd, 0xab, 0xa7, 0x59, 0x3f, 0xfa, 0x02, - 0x1a, 0x83, 0x38, 0x08, 0xf7, 0xc3, 0x2e, 0x66, 0x67, 0x18, 0x9e, 0x02, 0x18, 0x67, 0x37, 0x51, - 0x09, 0x7a, 0x66, 0x70, 0x78, 0x16, 0x3f, 0x9b, 0x11, 0xf2, 0x96, 0x74, 0x47, 0xec, 0x40, 0x3c, - 0xc7, 0x8b, 0x57, 0xba, 0xcd, 0x16, 0x70, 0x88, 0x93, 0x84, 0x04, 0x3c, 0x1d, 0x98, 0xf1, 0x64, - 0x8b, 0x79, 0x4e, 0x42, 0x69, 0x4c, 0x5b, 0x35, 0xe1, 0x39, 0x79, 0xc3, 0xfd, 0xf3, 0x29, 0x80, - 0x4c, 0xcb, 0xd2, 0x5c, 0x9e, 0x5b, 0x04, 0xeb, 0x95, 0xeb, 0x2e, 0x5b, 0x86, 0x51, 0x4d, 0x99, - 0x46, 0x85, 0x76, 0xa1, 0x16, 0xc5, 0xbe, 0xec, 0x12, 0xb3, 0xfe, 0xe0, 0xd4, 0xf3, 0xd4, 0x79, - 0x1e, 0x3f, 0xe4, 0x92, 0x72, 0x01, 0x22, 0xd9, 0x44, 0x5d, 0x98, 0xa7, 0xe4, 0x17, 0xa4, 0x9b, - 0x92, 0xc0, 0x3f, 0x0c, 0x13, 0xac, 0x96, 0xe0, 0xb3, 0xd3, 0x43, 0x7b, 0x52, 0xfe, 0x15, 0x13, - 0x17, 0xf8, 0x4d, 0x6a, 0xd2, 0xb2, 0x39, 0x9a, 0x35, 0xe7, 0xe8, 0x53, 0x68, 0x5a, 0x5a, 0x9d, - 0x29, 0x2c, 0xfd, 0x16, 0xa0, 0xe2, 0x77, 0xcf, 0x84, 0xb0, 0x0d, 0xcd, 0xc9, 0xbe, 0x04, 0x61, - 0x61, 0x45, 0x26, 0x59, 0x7a, 0x63, 0x7e, 0xef, 0xc0, 0x62, 0x46, 0x93, 0x5b, 0xf2, 0x11, 0x54, - 0x65, 0x8e, 0xa6, 0xfc, 0x65, 0xbe, 0x4e, 0x96, 0xcd, 0xb3, 0x22, 0xc8, 0x75, 0x53, 0x72, 0xee, - 0x2b, 0x68, 0x5a, 0x5d, 0x25, 0xda, 0xaf, 0xdb, 0xda, 0x5f, 0x1c, 0x5b, 0xb4, 0x32, 0xc7, 0xb0, - 0x0a, 0x6e, 0xf1, 0xd0, 0xab, 0x87, 0xf3, 0xdf, 0x0e, 0x5c, 0x2a, 0xed, 0x96, 0x23, 0x8b, 0x61, - 0x65, 0x28, 0xbb, 0xfd, 0x34, 0xeb, 0x97, 0xa3, 0xfc, 0x6c, 0xfc, 0xb1, 0xda, 0xf0, 0x14, 0xc5, - 0x3e, 0xf9, 0xe4, 0x61, 0x58, 0xec, 0x71, 0xf7, 0xa0, 0x35, 0x4e, 0xa0, 0x64, 0x46, 0x7e, 0x62, - 0xcf, 0x88, 0x3b, 0x5e, 0x1f, 0x73, 0x4a, 0x5c, 0x68, 0x6d, 0xe6, 0xaf, 0x73, 0xd4, 0x84, 0xfc, - 0xa9, 0x03, 0x0d, 0xa3, 0x87, 0xdb, 0x5b, 0x4c, 0x03, 0x79, 0x10, 0x9d, 0xf1, 0x44, 0x03, 0xbd, - 0x6f, 0x14, 0x17, 0x56, 0x75, 0xc2, 0x62, 0xc8, 0x4d, 0xe2, 0x7c, 0xfd, 0xaf, 0x0e, 0x5c, 0x2c, - 0x51, 0x54, 0x2e, 0xcd, 0x41, 0xf9, 0x7d, 0x95, 0x58, 0x99, 0x8f, 0x8c, 0x37, 0x78, 0xe5, 0xf2, - 0xc5, 0x1e, 0xa1, 0x6f, 0xf1, 0xa6, 0xcb, 0xfd, 0x16, 0xce, 0x97, 0x33, 0x97, 0x8c, 0xe6, 0xb6, - 0xbd, 0x22, 0x2b, 0x65, 0x73, 0x63, 0x8e, 0xb1, 0xa5, 0xe3, 0x9c, 0xda, 0xbb, 0x6a, 0x25, 0xfe, - 0xb9, 0x02, 0x17, 0x0a, 0x5d, 0xfa, 0x4c, 0x9f, 0xc5, 0x2b, 0x31, 0xe0, 0xbb, 0x39, 0xf7, 0x96, - 0x17, 0x19, 0x1b, 0xb0, 0x7e, 0x0e, 0x0b, 0x49, 0x8a, 0xa3, 0x00, 0xd3, 0xc0, 0xef, 0xf6, 0x71, - 0x38, 0x50, 0x77, 0x4f, 0x1f, 0x9c, 0x84, 0xb8, 0x23, 0xc5, 0x36, 0xb8, 0x94, 0x7c, 0xe0, 0x9a, - 0x58, 0xc4, 0xc9, 0xfb, 0x24, 0xf7, 0x21, 0x2c, 0x97, 0x7c, 0xf8, 0x4c, 0x76, 0xb5, 0x0a, 0xee, - 0x23, 0xdc, 0x7d, 0xdd, 0xa3, 0xf1, 0x28, 0x0a, 0xb6, 0xc5, 0xab, 0xe4, 0x6c, 0x07, 0xfc, 0x9d, - 0x03, 0x97, 0x4a, 0xbb, 0xe5, 0xdc, 0x6f, 0x43, 0x6d, 0xa8, 0x88, 0x72, 0xf2, 0xef, 0xab, 0xa9, - 0x3a, 0x46, 0xae, 0xa3, 0x29, 0xb2, 0xac, 0xa2, 0x41, 0xdc, 0xe7, 0x30, 0x6f, 0x77, 0x9e, 0x26, - 0x31, 0x54, 0xaf, 0xa9, 0xa5, 0x64, 0x6e, 0x7f, 0x17, 0x14, 0x51, 0xa3, 0x7b, 0x0a, 0x17, 0x4b, - 0xfa, 0xe4, 0xd0, 0x6e, 0xc3, 0x9c, 0x84, 0xd5, 0x79, 0x62, 0xfe, 0x33, 0x8a, 0xa1, 0xbd, 0x00, - 0x4d, 0x9e, 0x0f, 0x6a, 0xe4, 0x2f, 0x61, 0x5e, 0x11, 0x24, 0xdc, 0x5d, 0x98, 0xe5, 0x87, 0x72, - 0x35, 0x4d, 0xe7, 0xf4, 0xd2, 0x32, 0xaa, 0x3a, 0x76, 0x7a, 0x92, 0xa9, 0x3d, 0x0f, 0x0d, 0x33, - 0xc3, 0x6c, 0x7f, 0x26, 0xbf, 0xa0, 0xf1, 0xee, 0xc0, 0x0c, 0x67, 0x95, 0xca, 0x8d, 0x81, 0x13, - 0x3c, 0xed, 0x3f, 0x9c, 0x02, 0x54, 0xcc, 0x8f, 0xac, 0x1c, 0xd1, 0xc9, 0xe5, 0x88, 0x3f, 0xcd, - 0xbf, 0x1f, 0xae, 0xd8, 0xa9, 0x60, 0x11, 0xee, 0xc4, 0x87, 0xc4, 0x17, 0x60, 0x2e, 0xa0, 0x47, - 0x3e, 0x1d, 0x45, 0xf2, 0xaa, 0x61, 0x36, 0xa0, 0x47, 0xde, 0x28, 0x72, 0x7f, 0x09, 0xcb, 0x92, - 0xc9, 0x52, 0x2f, 0xcb, 0x95, 0x1c, 0x2b, 0x57, 0xba, 0x0c, 0x80, 0x83, 0xc0, 0xb7, 0x92, 0xf3, - 0x1a, 0x0e, 0x02, 0x99, 0xf4, 0xf0, 0x5a, 0xd4, 0x20, 0x3e, 0x24, 0xbe, 0x95, 0x69, 0x35, 0x04, - 0x51, 0x30, 0xb9, 0xf1, 0xe9, 0x5e, 0x8b, 0x6e, 0xda, 0x96, 0xd6, 0x39, 0x66, 0xf4, 0x25, 0x23, - 0xc8, 0x1d, 0xe9, 0x84, 0x90, 0xae, 0x76, 0x1e, 0xaa, 0x0b, 0x62, 0x75, 0x8a, 0xb8, 0x6e, 0x95, - 0x4c, 0x97, 0x0a, 0x2f, 0xa7, 0x45, 0xd9, 0xb4, 0x90, 0x07, 0x57, 0xce, 0x96, 0x07, 0xb7, 0xff, - 0x00, 0xce, 0x69, 0x4d, 0xcc, 0x53, 0x39, 0x3b, 0x16, 0x19, 0xdf, 0x2f, 0x1e, 0xbd, 0x27, 0xf3, - 0xf9, 0x11, 0x2c, 0x09, 0x1e, 0xe3, 0x78, 0xcb, 0xce, 0xb2, 0xc6, 0xa7, 0x73, 0x67, 0xd9, 0x89, - 0x7c, 0xf6, 0x4f, 0x1c, 0x70, 0x05, 0x93, 0xfd, 0x64, 0x5c, 0x2a, 0x70, 0xcb, 0x52, 0x60, 0xcc, - 0xf3, 0xf2, 0xff, 0x23, 0x4d, 0x76, 0xac, 0x55, 0x38, 0x5e, 0x93, 0x9d, 0x49, 0x2e, 0xc5, 0x11, - 0x2c, 0x0b, 0x1e, 0xf9, 0x4a, 0x44, 0x6a, 0xd0, 0xb6, 0x34, 0xc8, 0x3f, 0x5e, 0x9f, 0xcc, 0xa7, - 0xff, 0xc8, 0x81, 0x15, 0xfb, 0xcf, 0x07, 0x8e, 0x1f, 0xbe, 0xcd, 0x3b, 0xe1, 0x8d, 0xa0, 0x9f, - 0x93, 0x1f, 0xbf, 0x11, 0x34, 0xdb, 0x64, 0x3e, 0xff, 0x2b, 0x07, 0x56, 0x05, 0x53, 0xfe, 0x95, - 0xbc, 0x54, 0xe3, 0x8e, 0xa5, 0xc6, 0xd8, 0x37, 0xf5, 0x93, 0xd1, 0xe6, 0x3b, 0x07, 0x5a, 0xd2, - 0x2a, 0x8d, 0x5c, 0x43, 0x6a, 0x72, 0xc3, 0xd2, 0xa4, 0x34, 0x2b, 0x99, 0x8c, 0x16, 0xff, 0x34, - 0x03, 0x17, 0x95, 0xbf, 0x31, 0xe3, 0xdf, 0x4e, 0x8a, 0x53, 0x82, 0xbe, 0x94, 0x77, 0x90, 0x8d, - 0x35, 0xe7, 0xe6, 0x7c, 0x76, 0x71, 0x33, 0x56, 0x40, 0x04, 0x43, 0xb1, 0x64, 0xfc, 0xc2, 0xf2, - 0xab, 0xe2, 0xf5, 0xcf, 0xed, 0x93, 0x51, 0xb4, 0x03, 0x34, 0xfe, 0x5e, 0xe8, 0x1d, 0xf3, 0x35, - 0x3e, 0x4f, 0xaa, 0x1e, 0x55, 0x5a, 0x8e, 0xf1, 0x22, 0xbf, 0x05, 0x33, 0x09, 0x93, 0x16, 0x15, - 0x1e, 0xde, 0x29, 0x08, 0x2c, 0xac, 0xed, 0xd1, 0xf8, 0x35, 0xa1, 0xf2, 0x0e, 0x44, 0xb6, 0xd0, - 0x15, 0x16, 0x8d, 0x83, 0x90, 0xea, 0xd7, 0x31, 0x02, 0x51, 0xd1, 0x54, 0xc5, 0x68, 0x96, 0x07, - 0x6a, 0xf6, 0x13, 0xdd, 0x86, 0x25, 0x2a, 0xa3, 0x89, 0xff, 0x9a, 0x1c, 0xf9, 0xfb, 0x61, 0x9f, - 0xf0, 0xd2, 0x46, 0xd5, 0x5b, 0x50, 0x1d, 0xdf, 0x90, 0xa3, 0x27, 0x61, 0x9f, 0xa0, 0x55, 0xa8, - 0x75, 0x0f, 0x70, 0xbf, 0x4f, 0xa2, 0x9e, 0xba, 0xf3, 0xc8, 0x08, 0xc6, 0x5f, 0x27, 0xd4, 0xac, - 0xbf, 0x4e, 0x68, 0xc1, 0x5c, 0x32, 0xda, 0xe3, 0x4f, 0x63, 0xc4, 0x9d, 0x85, 0x6a, 0xb2, 0x28, - 0x4b, 0x86, 0x71, 0xf7, 0xc0, 0x4f, 0x48, 0x37, 0x8e, 0x82, 0x84, 0x5f, 0x5a, 0x4c, 0x79, 0x0d, - 0x4e, 0xdc, 0x11, 0x34, 0x96, 0x76, 0x8a, 0x17, 0x4e, 0xe2, 0x16, 0x42, 0x34, 0xd0, 0x15, 0x80, - 0x30, 0x20, 0x51, 0x1a, 0xf2, 0x17, 0x20, 0xf3, 0x3c, 0x3a, 0x1b, 0x14, 0xf7, 0xd7, 0x8e, 0xf1, - 0xfc, 0x55, 0x43, 0x38, 0x26, 0x84, 0x6b, 0x54, 0x8a, 0xe5, 0x5d, 0x94, 0xae, 0x0b, 0x23, 0x59, - 0x17, 0x15, 0xa5, 0x35, 0x51, 0x09, 0x45, 0xb2, 0xe2, 0x27, 0x6f, 0xaf, 0x79, 0x7d, 0x6f, 0x15, - 0x6a, 0xfa, 0x62, 0x48, 0xde, 0x38, 0x65, 0x04, 0xf1, 0x2a, 0xb7, 0x2f, 0x6b, 0x1a, 0xec, 0x67, - 0xfb, 0x01, 0xd4, 0xb4, 0x3d, 0xa1, 0x05, 0xa8, 0xbf, 0x7c, 0xbe, 0xb3, 0xfd, 0x78, 0x63, 0xeb, - 0xc9, 0xd6, 0xe3, 0xcd, 0xc5, 0xdf, 0x40, 0x75, 0x98, 0xdb, 0x7c, 0xb8, 0xfb, 0x70, 0xe7, 0xf1, - 0xee, 0xa2, 0x83, 0x1a, 0x50, 0x7d, 0xfc, 0x7c, 0x73, 0xfb, 0xc5, 0xd6, 0xf3, 0xdd, 0xc5, 0x4a, - 0x7b, 0x1f, 0xaa, 0x0f, 0x47, 0xe9, 0xc1, 0x46, 0x1c, 0x10, 0xdb, 0x6e, 0x9c, 0x12, 0xbb, 0x59, - 0x51, 0x76, 0x23, 0x33, 0x75, 0x61, 0x33, 0x85, 0xd9, 0x9e, 0x2a, 0xce, 0x76, 0xfb, 0x5f, 0xe6, - 0xb2, 0x2b, 0x49, 0x91, 0x7d, 0xa2, 0x8d, 0xa2, 0xc1, 0x5f, 0x2f, 0x35, 0xf8, 0xe4, 0x98, 0xbf, - 0x8d, 0xfb, 0xc4, 0x2a, 0x84, 0x1a, 0x17, 0xe8, 0x39, 0x04, 0xb3, 0x06, 0xa5, 0x72, 0xb5, 0x52, - 0xc5, 0x9b, 0xb6, 0xe2, 0xee, 0x7f, 0x39, 0x00, 0xc6, 0x4b, 0xa4, 0x9f, 0x5a, 0x6f, 0x6c, 0x1d, - 0xfb, 0xfa, 0x27, 0xf7, 0x4d, 0xf3, 0x85, 0xcf, 0x31, 0xaf, 0x6d, 0xcd, 0x5a, 0xae, 0x63, 0xa4, - 0x92, 0x6b, 0x50, 0x1f, 0x12, 0x3a, 0x08, 0x13, 0x71, 0xeb, 0x2e, 0x32, 0x45, 0x93, 0xe4, 0x6e, - 0x9f, 0xe6, 0xb5, 0xec, 0x59, 0x1e, 0x7f, 0xbb, 0xff, 0x53, 0x81, 0xa6, 0x35, 0x0a, 0xb6, 0xcb, - 0xd4, 0xab, 0x3a, 0x59, 0xc5, 0x95, 0x4d, 0xd4, 0x86, 0x86, 0xd0, 0x54, 0xdc, 0xe8, 0x49, 0xed, - 0x2d, 0x1a, 0xdb, 0x4e, 0xf2, 0xba, 0x8f, 0xf9, 0x46, 0x61, 0xf5, 0x06, 0x45, 0xe4, 0xc3, 0xfb, - 0x94, 0x24, 0x07, 0x12, 0x64, 0xba, 0x1c, 0x84, 0xbc, 0x1d, 0x86, 0x94, 0x24, 0x7e, 0x18, 0xf1, - 0xdd, 0xd0, 0xf4, 0x0c, 0x0a, 0xdb, 0x70, 0x61, 0x20, 0xe5, 0xc5, 0x9e, 0xd0, 0x6d, 0xd6, 0x67, - 0x79, 0x9f, 0x9a, 0xa7, 0xdb, 0xd6, 0xb5, 0x66, 0x35, 0x77, 0xad, 0x79, 0x5e, 0xd6, 0x4d, 0x6b, - 0x7a, 0x1b, 0x88, 0xda, 0xe9, 0x35, 0xb9, 0x81, 0xa1, 0x98, 0x0c, 0x0a, 0x2e, 0xbe, 0xa5, 0x57, - 0x84, 0x3b, 0xac, 0x6b, 0x61, 0xee, 0x12, 0x5b, 0xea, 0x58, 0xd4, 0xc8, 0xdc, 0x2e, 0x27, 0xb8, - 0xfe, 0x29, 0xee, 0xeb, 0x1f, 0xd8, 0xeb, 0x78, 0xf5, 0x44, 0xa3, 0xb3, 0xef, 0xd2, 0xea, 0xc7, - 0xd7, 0x3b, 0x3f, 0xb1, 0xd1, 0xaf, 0x9d, 0xb0, 0x11, 0x45, 0x20, 0xca, 0x3e, 0xf0, 0xc8, 0xfb, - 0x76, 0xbb, 0x17, 0xa6, 0x07, 0xa3, 0x3d, 0x16, 0x7f, 0xd7, 0x9f, 0xc6, 0x71, 0xaf, 0x4f, 0x36, - 0xfa, 0xf1, 0x28, 0xd8, 0x96, 0x33, 0xba, 0x7e, 0x40, 0x70, 0x3f, 0x3d, 0xe8, 0x62, 0x4a, 0xee, - 0xee, 0x93, 0x80, 0x50, 0x9c, 0x92, 0xe0, 0xae, 0x58, 0xe7, 0xbb, 0xaa, 0xb8, 0xb8, 0x6e, 0xfe, - 0xd1, 0xf3, 0xde, 0x2c, 0x6f, 0x7d, 0xf0, 0xbf, 0x01, 0x00, 0x00, 0xff, 0xff, 0xfb, 0x31, 0xf0, - 0x3d, 0x0b, 0x3d, 0x00, 0x00, + // 4228 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xc4, 0x3b, 0xcb, 0x6e, 0x1c, 0x49, + 0x72, 0xae, 0xe6, 0xa3, 0xbb, 0xa3, 0x1f, 0x24, 0x93, 0x94, 0xd4, 0x2a, 0x3d, 0x86, 0x6a, 0x49, + 0xa3, 0xd7, 0x88, 0x5c, 0x69, 0x3c, 0xd6, 0x3c, 0x76, 0x66, 0x20, 0x91, 0x92, 0x86, 0x33, 0x96, + 0xc4, 0x2d, 0x52, 0xc2, 0x78, 0x76, 0xb0, 0x85, 0x62, 0x57, 0xb2, 0x59, 0xab, 0xea, 0xaa, 0xde, + 0xac, 0x6a, 0x4a, 0x0d, 0xd8, 0x80, 0x8d, 0x3d, 0x18, 0xf6, 0x5e, 0xf7, 0x2f, 0x0c, 0x0f, 0xe0, + 0xe3, 0x02, 0x06, 0x6c, 0xc0, 0x07, 0x9f, 0x6c, 0x18, 0xbe, 0xf8, 0xe4, 0x83, 0xed, 0xa3, 0x7d, + 0x30, 0x0c, 0x7f, 0x80, 0x91, 0xcf, 0xca, 0xac, 0xaa, 0xe6, 0x63, 0xa6, 0x8d, 0xbd, 0x48, 0x9d, + 0x91, 0x11, 0x51, 0x91, 0x91, 0x91, 0xf1, 0xca, 0x24, 0x5c, 0x1e, 0x92, 0x38, 0x8d, 0xd7, 0x7d, + 0x6f, 0xb0, 0x7e, 0x78, 0x8f, 0xfe, 0xe7, 0x26, 0x98, 0x1c, 0x06, 0x3d, 0xbc, 0xc6, 0x26, 0xd0, + 0xbc, 0xef, 0x0d, 0xd6, 0x0e, 0xef, 0xd9, 0x17, 0x39, 0x5e, 0x2f, 0x1e, 0x0c, 0xe2, 0x88, 0xa2, + 0xf2, 0x5f, 0x1c, 0xcb, 0xbe, 0x92, 0x9f, 0x8d, 0xbd, 0x51, 0x7a, 0xd0, 0x0b, 0x03, 0x1c, 0xa5, + 0x02, 0x45, 0x7c, 0x68, 0x48, 0xe2, 0x1e, 0x4e, 0x12, 0x8a, 0x23, 0x7e, 0xf2, 0xf9, 0xee, 0x3f, + 0x36, 0xa0, 0xbe, 0xe9, 0x0d, 0x36, 0xe2, 0x68, 0x3f, 0xe8, 0xa3, 0x0e, 0x54, 0x0f, 0x31, 0x49, + 0x82, 0x38, 0xea, 0x58, 0xab, 0xd6, 0xcd, 0xba, 0x23, 0x87, 0xc8, 0x86, 0x1a, 0xc1, 0x87, 0x01, + 0x9b, 0xaa, 0xac, 0x5a, 0x37, 0x67, 0x1c, 0x35, 0x46, 0xef, 0x40, 0x83, 0x8a, 0x10, 0xa4, 0x6e, + 0x1a, 0x0c, 0x70, 0x67, 0x66, 0xd5, 0xba, 0x69, 0x39, 0xc0, 0x41, 0xbb, 0xc1, 0x00, 0xa3, 0xe7, + 0xb0, 0x90, 0x92, 0x51, 0x92, 0x62, 0xdf, 0x0d, 0x92, 0x64, 0x84, 0x49, 0xd2, 0x99, 0x5d, 0x9d, + 0xb9, 0xd9, 0xb8, 0x7f, 0x7d, 0x8d, 0xaf, 0x73, 0x4d, 0x89, 0xb0, 0xb6, 0xcb, 0x11, 0xb7, 0x38, + 0xde, 0xe3, 0x28, 0x25, 0x63, 0xa7, 0x9d, 0x1a, 0x40, 0x9d, 0x5f, 0x12, 0x8f, 0x48, 0x0f, 0x27, + 0x9d, 0xb9, 0x63, 0xf8, 0xed, 0x70, 0x3c, 0x93, 0x9f, 0x00, 0xa2, 0x4f, 0xa0, 0x36, 0x8c, 0xc3, + 0xa0, 0x17, 0xe0, 0xa4, 0x33, 0xcf, 0x18, 0xbd, 0x53, 0x64, 0xb4, 0x2d, 0x30, 0x38, 0x0b, 0x45, + 0x80, 0x3e, 0x83, 0x3a, 0xc1, 0x52, 0x8c, 0x2a, 0xa3, 0x5e, 0x2d, 0x52, 0x3b, 0x12, 0x85, 0x93, + 0x67, 0x24, 0xe8, 0x43, 0xa8, 0xf2, 0x1d, 0x4b, 0x3a, 0x35, 0x46, 0x7d, 0xb9, 0x48, 0xbd, 0xc1, + 0x11, 0x38, 0xad, 0x44, 0x47, 0xbb, 0xb0, 0x24, 0xac, 0xc6, 0x4d, 0xf1, 0x60, 0x18, 0x7a, 0x29, + 0x4e, 0x3a, 0x75, 0xc6, 0xe3, 0x46, 0x91, 0xc7, 0x0e, 0x47, 0xdd, 0x95, 0x98, 0x9c, 0xd9, 0x62, + 0x92, 0x03, 0xa3, 0xcf, 0x01, 0x0e, 0x83, 0xc4, 0x73, 0xd3, 0xf1, 0x10, 0x27, 0x1d, 0x98, 0xb4, + 0xa0, 0x57, 0x41, 0xe2, 0xed, 0x52, 0x14, 0xb1, 0xa0, 0x43, 0x39, 0x46, 0x5f, 0x40, 0x2b, 0xc5, + 0x49, 0xea, 0x0e, 0x31, 0x49, 0xe2, 0xc8, 0x4b, 0x3a, 0x0d, 0xc6, 0xe3, 0x6a, 0xc9, 0xde, 0xe0, + 0x24, 0xdd, 0x16, 0x58, 0x9c, 0x4d, 0x33, 0xd5, 0x40, 0x68, 0x1d, 0xaa, 0xf1, 0x30, 0x0d, 0xe2, + 0x28, 0xe9, 0x34, 0x57, 0xad, 0x9b, 0x8d, 0xfb, 0x67, 0x24, 0x0f, 0xce, 0xe0, 0x05, 0x9f, 0x74, + 0x24, 0x16, 0xba, 0x05, 0x95, 0x51, 0xd0, 0x69, 0xb1, 0xef, 0x9d, 0x2f, 0x7e, 0xef, 0x65, 0xc0, + 0xbf, 0x52, 0x19, 0x05, 0xf6, 0xd7, 0xb0, 0x5c, 0x62, 0x6a, 0x68, 0x11, 0x66, 0x5e, 0xe3, 0xb1, + 0xb0, 0x7e, 0xfa, 0x13, 0xdd, 0x81, 0xb9, 0x43, 0x2f, 0x1c, 0x61, 0x66, 0xf6, 0x9a, 0x08, 0x06, + 0xb5, 0xc3, 0x71, 0x3e, 0xae, 0x7c, 0x68, 0x69, 0x9c, 0x75, 0xa3, 0x3b, 0x3d, 0x67, 0x4e, 0xad, + 0x73, 0xfe, 0x0a, 0x5a, 0x86, 0x15, 0x96, 0xf0, 0xbc, 0x66, 0xf2, 0x6c, 0x4b, 0x9e, 0x8c, 0x6e, + 0xac, 0x33, 0x7b, 0x0e, 0x6d, 0xd3, 0x28, 0x4b, 0xb8, 0xbd, 0x6b, 0x72, 0x5b, 0x94, 0xdc, 0x24, + 0xa1, 0xce, 0xef, 0x4b, 0x68, 0xea, 0x66, 0x7a, 0x12, 0xd9, 0x84, 0x33, 0xe3, 0x64, 0x3a, 0xaf, + 0x6f, 0xe1, 0x4c, 0xa9, 0xb9, 0x96, 0x30, 0xbd, 0x6b, 0x32, 0x3d, 0x27, 0x45, 0xcc, 0xd1, 0xe7, + 0x56, 0x6e, 0x5a, 0xef, 0x29, 0x56, 0x2e, 0x09, 0x75, 0x7e, 0xbb, 0xb0, 0x54, 0xb0, 0xe4, 0x12, + 0x96, 0xb7, 0x4c, 0x96, 0xcb, 0x72, 0xf9, 0x1a, 0xad, 0xce, 0xf5, 0x03, 0xa8, 0x0a, 0x7b, 0x2d, + 0xe1, 0xb5, 0xa2, 0xf3, 0xaa, 0x6b, 0x64, 0xdd, 0x5f, 0x55, 0xa0, 0x65, 0x98, 0x26, 0x3a, 0x0b, + 0xf3, 0xdc, 0xeb, 0x0a, 0x06, 0x62, 0x84, 0x6e, 0x50, 0x2f, 0xea, 0x45, 0x09, 0x55, 0x8f, 0x3b, + 0x4a, 0x82, 0xa8, 0x2f, 0xb8, 0xb5, 0x15, 0xf8, 0x25, 0x85, 0xa2, 0x0b, 0x50, 0xe7, 0x2e, 0xc7, + 0x0d, 0x7c, 0xe6, 0xdd, 0xeb, 0x4e, 0x8d, 0x03, 0xb6, 0x7c, 0x74, 0x1e, 0x6a, 0x34, 0xe8, 0xb8, + 0x23, 0x12, 0x76, 0x66, 0x79, 0xcc, 0xa0, 0xe3, 0x97, 0x24, 0xa4, 0x74, 0x69, 0xfc, 0x1a, 0x47, + 0x6c, 0x6e, 0x8e, 0xd3, 0x31, 0x00, 0x9d, 0xbc, 0xcb, 0x8e, 0x2a, 0xf7, 0xb6, 0x97, 0x4a, 0xcf, + 0x94, 0x71, 0x5c, 0xbf, 0xa7, 0x36, 0xbe, 0xb3, 0x94, 0x36, 0xf8, 0x71, 0xa2, 0x21, 0x4e, 0x3a, + 0x6b, 0x6b, 0x75, 0x86, 0x8a, 0x2b, 0x1d, 0xf1, 0x25, 0xc3, 0xf1, 0x55, 0xd8, 0xa4, 0xe6, 0xd6, + 0xb8, 0xc0, 0x33, 0xa5, 0x02, 0x73, 0xde, 0xd3, 0x10, 0xf8, 0x9f, 0x2a, 0x30, 0xcf, 0xcf, 0x2a, + 0xba, 0x03, 0xf3, 0x5e, 0x34, 0x76, 0xe3, 0x7d, 0x26, 0x68, 0xe3, 0xfe, 0x8a, 0x3a, 0x2f, 0x71, + 0xe4, 0x07, 0xd4, 0xe1, 0xed, 0xe0, 0xd4, 0x99, 0xf3, 0xa2, 0xf1, 0x8b, 0x7d, 0xf4, 0x0d, 0xac, + 0x1c, 0x7a, 0x24, 0xf0, 0xf6, 0x42, 0xec, 0xfa, 0x78, 0x3f, 0x88, 0x02, 0xee, 0x37, 0x2b, 0x66, + 0x38, 0xe0, 0xac, 0xd7, 0x5e, 0x09, 0xd4, 0xcd, 0x0c, 0x93, 0x4b, 0xbe, 0x7c, 0x58, 0x9c, 0x41, + 0xef, 0x6a, 0x2b, 0x3f, 0x9b, 0xe3, 0xa4, 0x2f, 0xf9, 0x67, 0xd0, 0x99, 0xc4, 0xb8, 0x44, 0x07, + 0xef, 0x99, 0xc7, 0x41, 0x31, 0x96, 0x2c, 0x9e, 0xc4, 0x64, 0xe0, 0xa5, 0x53, 0x38, 0x11, 0x7f, + 0x3e, 0x0f, 0xb3, 0xaf, 0x02, 0xfc, 0x06, 0xdd, 0x82, 0xc5, 0x7c, 0xbc, 0x14, 0x1c, 0x16, 0x72, + 0x51, 0x10, 0xfd, 0x1e, 0xd4, 0x06, 0x38, 0xf5, 0x7c, 0x2f, 0xf5, 0x84, 0x0a, 0xed, 0xcc, 0x03, + 0xe0, 0x37, 0x6b, 0xcf, 0xc4, 0xa4, 0x48, 0x06, 0x24, 0x2e, 0xba, 0x0a, 0xad, 0x5e, 0x1c, 0xa5, + 0xf4, 0xac, 0x70, 0x33, 0x9a, 0x61, 0x66, 0xd4, 0x14, 0x40, 0x69, 0x49, 0x73, 0x24, 0x0e, 0xb1, + 0x4c, 0x82, 0xce, 0x19, 0x9c, 0x1d, 0x3a, 0xc3, 0xd9, 0x72, 0x2c, 0x74, 0x05, 0x9a, 0x3e, 0xde, + 0xf7, 0x46, 0x61, 0xea, 0x52, 0x80, 0x38, 0x49, 0x0d, 0x01, 0xa3, 0xf8, 0xe8, 0x06, 0xcc, 0x05, + 0x29, 0x1e, 0xc8, 0xec, 0x65, 0xc9, 0xe0, 0xb8, 0x95, 0xe2, 0x81, 0xc3, 0xe7, 0xd1, 0x35, 0xb6, + 0x95, 0x55, 0x61, 0x4f, 0x3a, 0x96, 0xb6, 0x91, 0xe8, 0x19, 0x2c, 0xf7, 0xe2, 0xc1, 0x70, 0xc4, + 0x12, 0xb6, 0x28, 0xc5, 0x64, 0xdf, 0xa3, 0xe7, 0x85, 0xa7, 0x27, 0xd7, 0x0c, 0xb2, 0x0d, 0x81, + 0xb7, 0xa5, 0xd0, 0x38, 0x1b, 0xc8, 0xe8, 0xec, 0x21, 0xcc, 0x52, 0x19, 0xd0, 0x3a, 0xcc, 0x7a, + 0xa4, 0x9f, 0x08, 0x73, 0xbe, 0x50, 0x10, 0x72, 0xed, 0x21, 0xe9, 0x0b, 0x72, 0x86, 0x68, 0x3f, + 0x80, 0xba, 0x02, 0x9d, 0x66, 0xcb, 0xed, 0x4f, 0xa0, 0x65, 0xec, 0xd0, 0xa9, 0x88, 0xbf, 0x04, + 0xc8, 0x36, 0xe1, 0x54, 0xa1, 0x01, 0xbf, 0xa1, 0x84, 0x3f, 0xdc, 0x64, 0xed, 0xaf, 0xe1, 0xdc, + 0x04, 0xc5, 0x96, 0xb0, 0xb9, 0x61, 0xca, 0xa3, 0x36, 0x5f, 0x51, 0xea, 0x87, 0xe1, 0x12, 0xd4, + 0x15, 0x9c, 0xf2, 0x1a, 0x91, 0x40, 0xf8, 0x41, 0xfa, 0xb3, 0xfb, 0xb7, 0x15, 0xa8, 0xc9, 0xe0, + 0x4e, 0x73, 0xfe, 0xd1, 0x60, 0x8f, 0xe0, 0x30, 0xf4, 0xc4, 0xf7, 0xd4, 0x18, 0xdd, 0x83, 0xb9, + 0xc3, 0x00, 0xbf, 0x91, 0x0e, 0xe6, 0x42, 0x3e, 0x33, 0x60, 0xda, 0x90, 0x76, 0xcc, 0x30, 0xa9, + 0xe7, 0x95, 0x89, 0x2e, 0x3f, 0x15, 0x2a, 0x91, 0xed, 0x42, 0x6b, 0xe0, 0xbd, 0x75, 0x79, 0xb0, + 0x48, 0x53, 0x19, 0x48, 0x1a, 0x03, 0xef, 0xed, 0x2e, 0x85, 0xed, 0xa6, 0x21, 0xba, 0xc9, 0x2c, + 0x97, 0xa7, 0xf9, 0x9d, 0xc2, 0xd7, 0x74, 0x37, 0xf4, 0x04, 0x20, 0xfb, 0x78, 0x89, 0xbe, 0xba, + 0xa6, 0xbe, 0x9a, 0xc6, 0xfe, 0xfd, 0x70, 0x77, 0xf3, 0x77, 0x33, 0xb0, 0x90, 0x4b, 0x3e, 0xe8, + 0x11, 0x96, 0x9e, 0x27, 0xf2, 0x06, 0xd2, 0xeb, 0x34, 0x04, 0xec, 0xb9, 0x37, 0xc0, 0xe8, 0x29, + 0x68, 0x47, 0x26, 0xef, 0xb6, 0x73, 0xfc, 0xd6, 0x8e, 0x38, 0x6d, 0xe8, 0x29, 0xb4, 0xe4, 0xb7, + 0xb8, 0x97, 0xe1, 0x8e, 0xfb, 0xd6, 0x24, 0x5e, 0x62, 0x5c, 0xf4, 0x3b, 0xeb, 0x4c, 0xe3, 0xb3, + 0x66, 0x3d, 0x94, 0xa7, 0xd6, 0x15, 0xff, 0x29, 0x2c, 0x1c, 0x6f, 0xad, 0x93, 0x8d, 0x7e, 0x17, + 0x96, 0x0a, 0xb2, 0x9c, 0x24, 0x8d, 0x32, 0x25, 0x9b, 0xce, 0x09, 0xec, 0xfe, 0x77, 0x05, 0x1a, + 0x1a, 0x47, 0xf4, 0x34, 0xdb, 0x41, 0xcd, 0x87, 0x5d, 0x2b, 0xf9, 0xb8, 0xfc, 0x9d, 0x39, 0x33, + 0xb9, 0xcf, 0x14, 0x82, 0xd6, 0x60, 0x99, 0x96, 0xfb, 0x54, 0xc5, 0x6e, 0xcf, 0x4b, 0x71, 0x3f, + 0x26, 0x81, 0x4a, 0x37, 0x96, 0x7c, 0x6f, 0x40, 0x79, 0x6c, 0xa8, 0x09, 0x74, 0x47, 0x0b, 0xbe, + 0x17, 0xca, 0x3e, 0xa7, 0xef, 0xc0, 0x35, 0x80, 0xec, 0xeb, 0x34, 0xf1, 0x63, 0x0b, 0x92, 0xdc, + 0xc5, 0xc8, 0xfe, 0x19, 0x2c, 0xe6, 0x65, 0x2c, 0xd1, 0xcd, 0xef, 0x9a, 0x7a, 0xbe, 0x7c, 0xf4, + 0x52, 0xa7, 0xa0, 0xf2, 0xbf, 0x98, 0x81, 0x9a, 0xf4, 0xa1, 0xe8, 0x81, 0x56, 0x92, 0x97, 0xc4, + 0x0b, 0xf6, 0x75, 0xfa, 0x43, 0xd4, 0x35, 0x59, 0x39, 0xfe, 0x23, 0xe8, 0xa8, 0xd8, 0x55, 0xae, + 0xe4, 0x36, 0x31, 0x35, 0xfc, 0x12, 0xce, 0x28, 0x0a, 0xc6, 0x66, 0xec, 0xee, 0x79, 0x49, 0x50, + 0x38, 0x38, 0xea, 0xbb, 0xd2, 0x35, 0xf3, 0x6f, 0x3f, 0xa2, 0xb8, 0x62, 0xa3, 0x87, 0x19, 0xc4, + 0xfe, 0xb5, 0xc5, 0xfd, 0x90, 0xc8, 0xe6, 0x10, 0xcc, 0x6a, 0x47, 0x9f, 0xfd, 0x46, 0x1f, 0x89, + 0x80, 0x58, 0x31, 0x9b, 0x17, 0x25, 0x0b, 0x9c, 0x5e, 0x68, 0x7c, 0x02, 0x9d, 0x49, 0xf2, 0x1f, + 0xc7, 0xa7, 0x66, 0xec, 0xd6, 0x2c, 0xb4, 0x8c, 0x2a, 0x1c, 0xbd, 0x0f, 0x67, 0x09, 0xf6, 0x7c, + 0x37, 0x8e, 0xc2, 0xb1, 0x3b, 0xf0, 0x92, 0x14, 0x13, 0x97, 0x60, 0x2f, 0x1c, 0x30, 0x86, 0x35, + 0x67, 0x99, 0xce, 0xbe, 0x88, 0xc2, 0xf1, 0x33, 0x36, 0xe7, 0xd0, 0x29, 0x74, 0x17, 0xd0, 0x9b, + 0x83, 0x20, 0xc5, 0x61, 0xc0, 0xda, 0x39, 0x0c, 0x5f, 0x9d, 0x06, 0x6d, 0x86, 0x61, 0x27, 0x68, + 0x0b, 0xba, 0xfd, 0xde, 0xd0, 0x1d, 0x78, 0x91, 0xd7, 0xc7, 0xbe, 0xfb, 0x1a, 0x8f, 0x13, 0x97, + 0x86, 0x0e, 0x82, 0x7f, 0x31, 0xc2, 0x8c, 0x03, 0x0d, 0x1f, 0xbc, 0x46, 0xb9, 0xd4, 0xef, 0x0d, + 0x9f, 0x71, 0xc4, 0xaf, 0xf0, 0x38, 0x79, 0xe6, 0xbd, 0x75, 0x24, 0x16, 0x0d, 0x28, 0x9f, 0xc1, + 0xc5, 0x02, 0xab, 0x21, 0x26, 0xae, 0xd7, 0xeb, 0xc5, 0xa3, 0x28, 0x65, 0x31, 0x68, 0xce, 0xe9, + 0x98, 0x4c, 0xb6, 0x31, 0x79, 0xc8, 0xe7, 0xd1, 0xa7, 0x70, 0x81, 0xd2, 0x2b, 0xaf, 0xc0, 0xc1, + 0xee, 0x90, 0xc4, 0x3f, 0xc7, 0xbd, 0x54, 0x64, 0x69, 0x94, 0x5c, 0x1e, 0x12, 0x8e, 0xb0, 0xcd, + 0xe7, 0xd1, 0x1f, 0xc0, 0x8a, 0xb2, 0x3a, 0x1f, 0x27, 0x3d, 0x12, 0x0c, 0xd3, 0x98, 0xc8, 0x0c, + 0x6e, 0xad, 0xb4, 0xd1, 0xa1, 0x2c, 0x6f, 0x33, 0x23, 0x10, 0x96, 0xa7, 0xb1, 0x40, 0x1f, 0xc0, + 0x39, 0x2a, 0x59, 0xe0, 0x0d, 0xdc, 0xbd, 0x20, 0x0c, 0x83, 0xa8, 0xaf, 0xa4, 0xaa, 0x32, 0xa9, + 0x56, 0xfa, 0xbd, 0xe1, 0x96, 0x37, 0x78, 0xc4, 0x27, 0x85, 0x44, 0xf6, 0x37, 0x99, 0x65, 0xe4, + 0xf9, 0x97, 0x58, 0xc6, 0x4d, 0xd3, 0x3d, 0x20, 0x59, 0x9c, 0x64, 0xa4, 0xba, 0xb5, 0xbc, 0xa6, + 0x47, 0x9b, 0x57, 0x52, 0x22, 0x92, 0x57, 0xcc, 0x48, 0x2e, 0x67, 0xa7, 0x51, 0x43, 0xfd, 0xfd, + 0x9c, 0x8a, 0x24, 0x99, 0x34, 0x34, 0x9b, 0xa1, 0x21, 0x6b, 0x3f, 0x26, 0x03, 0x99, 0xcd, 0xc8, + 0x31, 0xfa, 0x36, 0xeb, 0xa4, 0xc9, 0x02, 0x48, 0x9e, 0xca, 0xf5, 0x9c, 0xdf, 0xcb, 0x38, 0x4a, + 0x88, 0x2c, 0x58, 0x72, 0x1d, 0x35, 0x05, 0x46, 0x3b, 0xd0, 0xa6, 0xd9, 0xb7, 0xc6, 0x9a, 0x7b, + 0x96, 0xf7, 0x26, 0xb3, 0xa6, 0xe9, 0x70, 0x8e, 0x6f, 0x2b, 0xd0, 0x61, 0x68, 0x13, 0x60, 0x48, + 0xe2, 0x21, 0x26, 0x69, 0xc0, 0x2a, 0x09, 0xab, 0x24, 0x1c, 0x69, 0x0c, 0xb7, 0x15, 0xae, 0xa3, + 0xd1, 0xa1, 0x7b, 0x5a, 0x15, 0x7e, 0x65, 0x32, 0xb5, 0xbe, 0x29, 0x7f, 0x08, 0x90, 0x31, 0xa3, + 0x99, 0x4d, 0x90, 0xb8, 0x5e, 0xbf, 0x4f, 0x70, 0x5f, 0xd6, 0x53, 0x35, 0xa7, 0x11, 0x24, 0x0f, + 0x25, 0x08, 0xdd, 0x86, 0xa5, 0x9e, 0x17, 0xb9, 0x7b, 0x38, 0x43, 0xf3, 0x85, 0x3f, 0x59, 0xe8, + 0x79, 0xd1, 0x23, 0xac, 0x50, 0x7d, 0xf4, 0x0e, 0x34, 0x92, 0x20, 0xea, 0x87, 0xd8, 0xa5, 0xab, + 0x65, 0x07, 0xb9, 0xe6, 0x00, 0x07, 0x51, 0x9d, 0xd8, 0x3f, 0x55, 0x9d, 0x21, 0x53, 0x3d, 0x53, + 0x29, 0x30, 0xbf, 0x06, 0x54, 0x54, 0xfc, 0x6f, 0xb3, 0x74, 0xfd, 0x0f, 0x0b, 0xda, 0x26, 0x53, + 0x1a, 0xd4, 0x09, 0xee, 0xe3, 0xb7, 0x43, 0xd9, 0xcd, 0xe1, 0x23, 0x6a, 0xde, 0xbc, 0x0b, 0xea, + 0x85, 0x42, 0xb9, 0x6a, 0x8c, 0xd6, 0xb4, 0x1c, 0xe2, 0x72, 0xb9, 0xb0, 0x46, 0xfd, 0x87, 0x60, + 0x96, 0x56, 0xaf, 0x22, 0x0d, 0x67, 0xbf, 0x51, 0x17, 0x9a, 0xf8, 0xed, 0x10, 0x93, 0x60, 0x80, + 0xa3, 0xd4, 0xe3, 0xfd, 0x9c, 0x9a, 0x63, 0xc0, 0xbe, 0xef, 0x2a, 0xab, 0x30, 0xc7, 0xdc, 0x7b, + 0xf7, 0x3b, 0x0b, 0xd0, 0xb6, 0x97, 0x24, 0xc3, 0x98, 0xa4, 0xbb, 0xa2, 0x07, 0x15, 0x13, 0x1a, + 0x23, 0xa8, 0xab, 0xf4, 0xd2, 0x60, 0x8f, 0x1a, 0x86, 0xb8, 0x41, 0xe0, 0x55, 0xcb, 0x52, 0x36, + 0x23, 0x6f, 0x07, 0xee, 0x6b, 0xfe, 0xa5, 0xab, 0xda, 0x15, 0x05, 0xb6, 0xd3, 0xf0, 0x34, 0x8b, + 0xd0, 0x7e, 0x8a, 0xd3, 0xad, 0x68, 0x3f, 0x16, 0xa1, 0xa5, 0xfb, 0xef, 0x16, 0x2c, 0x28, 0x50, + 0x32, 0x8c, 0xa3, 0x04, 0x97, 0x86, 0x7e, 0x1b, 0x6a, 0xe2, 0x6a, 0x45, 0x46, 0x3b, 0x35, 0x46, + 0x97, 0x00, 0x92, 0xd4, 0x23, 0xda, 0x75, 0xca, 0x8c, 0x53, 0x67, 0x10, 0x76, 0x9b, 0xd2, 0x81, + 0xea, 0x20, 0xf6, 0x47, 0xb2, 0x81, 0x50, 0x77, 0xe4, 0x50, 0x64, 0xec, 0x73, 0x66, 0xc6, 0x9e, + 0x93, 0x66, 0x1a, 0xcb, 0xbe, 0x07, 0x4d, 0xb6, 0x61, 0x62, 0xd1, 0xe8, 0x0a, 0xcc, 0xb2, 0xe3, + 0x6a, 0xb1, 0xe3, 0xd0, 0xca, 0xaa, 0x33, 0x8a, 0xc3, 0xa6, 0xba, 0x0b, 0xd0, 0x12, 0x24, 0x5c, + 0x8c, 0xee, 0x53, 0x58, 0x7e, 0x8a, 0x53, 0xd5, 0x81, 0x96, 0xac, 0xce, 0xc2, 0xfc, 0x7e, 0x10, + 0xa6, 0x59, 0xb3, 0x92, 0x8f, 0xe8, 0xa2, 0x83, 0xa8, 0x17, 0x8e, 0x7c, 0x29, 0x8e, 0x1c, 0x76, + 0xff, 0xca, 0x82, 0x15, 0x93, 0x93, 0x50, 0xfb, 0x96, 0x7e, 0x31, 0xc3, 0x73, 0xc8, 0x3b, 0x9a, + 0x52, 0x0a, 0x04, 0x93, 0xef, 0x68, 0xa6, 0xdd, 0x2b, 0xef, 0x9e, 0x61, 0x8b, 0x7f, 0x12, 0x7a, + 0x29, 0xab, 0x54, 0xa5, 0xf1, 0xfc, 0x75, 0x9d, 0x2d, 0x45, 0x83, 0x8b, 0xa5, 0x7c, 0x2a, 0xab, + 0x6d, 0xcb, 0xac, 0x0b, 0xcb, 0x90, 0x8b, 0x95, 0xb7, 0xfd, 0xcb, 0x1a, 0xd4, 0x24, 0x1e, 0xba, + 0x0a, 0x2d, 0xb9, 0x30, 0x77, 0xe8, 0xa5, 0x07, 0x62, 0x0d, 0x4d, 0x09, 0xdc, 0xf6, 0xd2, 0x03, + 0xa3, 0xf4, 0xaf, 0xe4, 0x4a, 0x7f, 0x9d, 0x01, 0xb3, 0xeb, 0x19, 0x93, 0x01, 0x2b, 0x67, 0x2f, + 0x40, 0x9d, 0x7e, 0x9b, 0x23, 0x70, 0x3f, 0x52, 0xa3, 0x00, 0x39, 0xc9, 0x52, 0x73, 0x36, 0x29, + 0x1a, 0xc3, 0x14, 0xc0, 0x26, 0xaf, 0x43, 0x5b, 0x55, 0xb3, 0x1c, 0x63, 0x9e, 0x61, 0xb4, 0x14, + 0x94, 0xa1, 0x5d, 0x85, 0x0c, 0xe0, 0x8e, 0x48, 0x20, 0x52, 0x9b, 0xa6, 0x02, 0xbe, 0x24, 0x01, + 0x8d, 0x4e, 0x7a, 0x3b, 0xae, 0x53, 0xe3, 0x75, 0xb7, 0xd6, 0x8d, 0x43, 0x2f, 0xb4, 0x4e, 0x1f, + 0xbf, 0x3b, 0x7b, 0xff, 0x48, 0xed, 0x4a, 0xc8, 0xc4, 0x16, 0x60, 0xbe, 0xd6, 0x87, 0x62, 0xad, + 0xaf, 0xa7, 0x22, 0x8d, 0x5c, 0x2a, 0x72, 0x0b, 0x16, 0xe5, 0x6f, 0x99, 0x5b, 0xb2, 0xcb, 0xaf, + 0xba, 0xb3, 0x20, 0xe1, 0x22, 0x00, 0x16, 0xdb, 0x26, 0xad, 0x62, 0xdb, 0xe4, 0x15, 0x34, 0xd4, + 0x66, 0x8d, 0x82, 0x4e, 0x9b, 0xad, 0xf0, 0x83, 0x93, 0xad, 0x50, 0x5a, 0xae, 0xf4, 0x18, 0x40, + 0x14, 0x00, 0x7d, 0x09, 0x55, 0xb6, 0xbf, 0xa3, 0xa0, 0xb3, 0xc0, 0x78, 0xde, 0x3b, 0x19, 0x4f, + 0xfa, 0x8f, 0xe4, 0x37, 0x7f, 0xc8, 0x06, 0x94, 0x17, 0x33, 0x87, 0x51, 0xd0, 0x59, 0x3c, 0x0d, + 0x2f, 0x5a, 0x23, 0x29, 0x5e, 0x84, 0x0d, 0xd0, 0x0d, 0x58, 0xc8, 0x57, 0x7d, 0x4b, 0x65, 0x55, + 0xdf, 0x0f, 0x6b, 0x11, 0x7e, 0x0a, 0x0b, 0x39, 0xe5, 0x9c, 0x8a, 0xfc, 0x23, 0x68, 0x68, 0x7a, + 0x38, 0x2d, 0xa9, 0xb6, 0xec, 0x53, 0x91, 0xba, 0xc7, 0xf4, 0xc5, 0x3e, 0x31, 0x1d, 0xd8, 0xf5, + 0x13, 0x6d, 0x82, 0xee, 0xd5, 0x56, 0x00, 0x69, 0x7e, 0x55, 0x3a, 0xb5, 0x9f, 0x1a, 0x8e, 0x5e, + 0xb9, 0xb4, 0xf7, 0xa0, 0x26, 0xcd, 0x49, 0xc4, 0x8d, 0xa2, 0xc7, 0x54, 0x18, 0x34, 0x2c, 0x78, + 0xbd, 0x1e, 0x4e, 0x54, 0x2b, 0x83, 0x8f, 0xba, 0x4b, 0x2c, 0xda, 0x1a, 0x4e, 0xf4, 0x2f, 0x2d, + 0x58, 0xcc, 0x60, 0xe2, 0x6b, 0x1f, 0x99, 0x0e, 0xf4, 0xaa, 0xb6, 0xb6, 0x63, 0x9c, 0xe7, 0xa4, + 0x4f, 0x4f, 0xab, 0xcd, 0x28, 0x72, 0x08, 0x06, 0x15, 0x2b, 0xf8, 0x4a, 0x2d, 0x4a, 0xc9, 0xbf, + 0x0a, 0xb3, 0x54, 0x1a, 0xa1, 0x29, 0x93, 0x17, 0x9b, 0x99, 0xa8, 0x21, 0x1e, 0x6a, 0x64, 0x4b, + 0x41, 0x69, 0xe9, 0x37, 0x3c, 0x6a, 0x6a, 0xf0, 0x2c, 0xd4, 0xf0, 0xb6, 0x61, 0x31, 0xd4, 0x14, + 0x90, 0x4b, 0x2e, 0x2b, 0x26, 0x69, 0x6b, 0x8a, 0x4d, 0x75, 0x61, 0x67, 0x6a, 0x46, 0xac, 0x68, + 0xc7, 0x58, 0xa8, 0x5a, 0xcf, 0x35, 0x98, 0x65, 0xb7, 0x26, 0xd6, 0x04, 0xbe, 0x6c, 0x76, 0xa2, + 0xf6, 0x5e, 0xb1, 0xad, 0x60, 0xde, 0x54, 0xcb, 0x50, 0x08, 0x4e, 0x47, 0x24, 0xca, 0x12, 0x70, + 0x3a, 0x42, 0xe7, 0xa1, 0x46, 0x9d, 0x89, 0x3b, 0x4a, 0x54, 0x8a, 0x42, 0xc7, 0x2f, 0x13, 0xd6, + 0x67, 0xcf, 0xda, 0x12, 0xf4, 0x67, 0xf7, 0x1c, 0x9c, 0xa1, 0x7c, 0x71, 0x42, 0x0f, 0xc6, 0x28, + 0x4c, 0xd5, 0xbe, 0xfc, 0x57, 0x15, 0xce, 0xe6, 0x67, 0xc4, 0x4a, 0xbe, 0xdf, 0xe3, 0x9c, 0x8b, + 0x50, 0xa7, 0x69, 0x64, 0x92, 0x7a, 0x83, 0xa1, 0x78, 0x9a, 0x93, 0x01, 0xd0, 0x17, 0x50, 0x53, + 0xcf, 0x34, 0x66, 0xcd, 0xa2, 0xb4, 0x5c, 0x8a, 0x35, 0xf3, 0xbd, 0x86, 0xa2, 0x46, 0xbf, 0x0f, + 0xec, 0xed, 0x86, 0x4b, 0x38, 0xbe, 0xc8, 0x42, 0x6f, 0x1d, 0xc3, 0x2d, 0x83, 0x39, 0x8d, 0x34, + 0x9b, 0x47, 0x9f, 0x41, 0x73, 0x10, 0xfb, 0xc1, 0x7e, 0xd0, 0xf3, 0x68, 0x0d, 0xc3, 0x52, 0x00, + 0xed, 0x0e, 0x8e, 0x77, 0x45, 0x9e, 0x69, 0x18, 0x8e, 0x81, 0x4f, 0x35, 0x82, 0xdf, 0xe2, 0xde, + 0x88, 0x96, 0x9a, 0x55, 0xd6, 0xc8, 0x51, 0x63, 0xba, 0x81, 0x43, 0x2f, 0x49, 0xb0, 0xcf, 0xd2, + 0x81, 0x39, 0x47, 0x8c, 0xa8, 0xe7, 0xc4, 0x84, 0xc4, 0xa4, 0x53, 0xe7, 0x9e, 0x93, 0x0d, 0xec, + 0xdf, 0x58, 0x34, 0xd9, 0xfd, 0x39, 0xee, 0xa5, 0xd8, 0x7f, 0x15, 0x24, 0x1e, 0xdf, 0x7f, 0x2f, + 0x89, 0xb5, 0xfd, 0xa7, 0x23, 0x4a, 0xbe, 0x1f, 0xe0, 0xd0, 0x97, 0x8e, 0x97, 0x0d, 0xd0, 0x2a, + 0xa8, 0xd6, 0x0c, 0x5d, 0xc7, 0x8c, 0xbc, 0xbb, 0x53, 0x20, 0x9e, 0x29, 0x89, 0x6b, 0xe7, 0x2c, + 0x53, 0x12, 0xbd, 0x92, 0xb3, 0x30, 0x2f, 0x7c, 0x24, 0x4f, 0x93, 0xc4, 0x28, 0xf3, 0xf2, 0xf3, + 0x9a, 0x97, 0x47, 0x6d, 0xa8, 0xec, 0x8d, 0x45, 0x22, 0x54, 0xd9, 0x1b, 0xdb, 0xff, 0x50, 0x01, + 0xc8, 0x34, 0x5c, 0x5a, 0x87, 0xb0, 0xd5, 0xd0, 0x59, 0x21, 0xb6, 0x18, 0x69, 0x07, 0x62, 0x46, + 0x3f, 0x10, 0x68, 0x17, 0xea, 0x51, 0xec, 0x8a, 0x29, 0x6e, 0x31, 0x0f, 0x4e, 0xbc, 0xc7, 0x6b, + 0xcf, 0xe3, 0x87, 0x8c, 0x52, 0x18, 0x4f, 0x24, 0x86, 0xc8, 0x81, 0x36, 0x11, 0x3a, 0x76, 0xe9, + 0xda, 0xa5, 0xf9, 0xdc, 0x39, 0x86, 0xb5, 0xbe, 0x31, 0x4e, 0x8b, 0x68, 0xa3, 0x24, 0xdb, 0xce, + 0x79, 0x7d, 0x3b, 0x3f, 0x81, 0x96, 0x21, 0xc4, 0xa9, 0x22, 0xe8, 0x36, 0xb4, 0xa6, 0xfb, 0xc8, + 0x83, 0xc6, 0x2f, 0x91, 0xcd, 0x29, 0x0f, 0xf0, 0x9d, 0xa5, 0xda, 0xf3, 0xd9, 0xd9, 0x7f, 0x04, + 0x35, 0x91, 0x0c, 0x4a, 0xc7, 0xfc, 0x6e, 0xae, 0x5b, 0x93, 0x29, 0x45, 0x02, 0x84, 0x92, 0x25, + 0x9d, 0xfd, 0x0a, 0x5a, 0xc6, 0x54, 0x89, 0xf4, 0xeb, 0xa6, 0xf4, 0xe7, 0x27, 0x76, 0x84, 0xf4, + 0x35, 0x5c, 0x04, 0xbb, 0x58, 0x5d, 0xab, 0xe5, 0xfc, 0x8f, 0x05, 0x17, 0x4a, 0xa7, 0xc5, 0xca, + 0x62, 0x58, 0x19, 0x8a, 0x69, 0x37, 0xcd, 0xe6, 0xc5, 0x2a, 0x7f, 0x3c, 0xb9, 0x7e, 0xd7, 0x5c, + 0x52, 0x71, 0x4e, 0xbc, 0x66, 0x18, 0x16, 0x67, 0xec, 0x3d, 0xe8, 0x4c, 0x22, 0x28, 0xd1, 0xc8, + 0x8f, 0x4c, 0x8d, 0xd8, 0x93, 0xe5, 0xd1, 0x55, 0x62, 0x43, 0x67, 0x33, 0x7f, 0x93, 0x23, 0x15, + 0xf2, 0x67, 0xd4, 0xa1, 0x64, 0x33, 0xcc, 0xde, 0x62, 0xe2, 0x8b, 0x8a, 0x77, 0xce, 0xe1, 0x03, + 0xf4, 0x9e, 0xd6, 0xc5, 0xb8, 0xa8, 0x32, 0x23, 0x8d, 0x6e, 0x1a, 0x85, 0xfc, 0xbf, 0x59, 0x70, + 0xbe, 0x44, 0x50, 0xb1, 0x35, 0x07, 0xe5, 0x57, 0x55, 0x7c, 0x67, 0x3e, 0xd4, 0x9e, 0xd7, 0x95, + 0xd3, 0x17, 0x67, 0xb8, 0xbc, 0xc5, 0x4b, 0x2e, 0xfb, 0x1b, 0x38, 0x5b, 0x8e, 0x5c, 0xb2, 0x9a, + 0xdb, 0xe6, 0x8e, 0xac, 0x94, 0xe9, 0x46, 0x5f, 0x63, 0x47, 0x05, 0x54, 0x79, 0x76, 0xe5, 0x4e, + 0xfc, 0x4b, 0x05, 0xce, 0x15, 0xa6, 0x54, 0xf3, 0x20, 0x0b, 0x8c, 0x7c, 0xc1, 0x77, 0x73, 0xbe, + 0x28, 0x4f, 0x32, 0x31, 0x32, 0x7e, 0x0b, 0x0b, 0x49, 0xea, 0x45, 0xbe, 0x47, 0x7c, 0xb7, 0x17, + 0x7a, 0xc1, 0x40, 0xb6, 0x96, 0xdf, 0x3f, 0x8e, 0xe3, 0x8e, 0x20, 0xdb, 0x60, 0x54, 0xe2, 0xed, + 0x6a, 0x62, 0x00, 0xa7, 0xef, 0x93, 0xec, 0x87, 0xb0, 0x5c, 0xf2, 0xe1, 0x53, 0xd9, 0xd5, 0x45, + 0xb0, 0x1f, 0x79, 0xbd, 0xd7, 0x7d, 0x12, 0x8f, 0x22, 0x7f, 0x9b, 0x3f, 0x38, 0xce, 0x4e, 0xc0, + 0xdf, 0x58, 0x70, 0xa1, 0x74, 0x5a, 0xe8, 0x7e, 0x1b, 0xea, 0x43, 0x09, 0x14, 0xca, 0xbf, 0x2f, + 0x55, 0x75, 0x04, 0xdd, 0x9a, 0x82, 0x88, 0xfe, 0x8d, 0x62, 0x62, 0x3f, 0x87, 0xb6, 0x39, 0x79, + 0x92, 0x0c, 0x54, 0x3e, 0x94, 0x16, 0x94, 0xb9, 0xf3, 0x5d, 0x10, 0x44, 0xae, 0xee, 0x29, 0x9c, + 0x2f, 0x99, 0x13, 0x4b, 0xbb, 0x0d, 0x55, 0xc1, 0x56, 0x25, 0xa4, 0xf9, 0xcf, 0x48, 0x84, 0xee, + 0x02, 0xb4, 0x58, 0xe2, 0xa9, 0x38, 0x7f, 0x0e, 0x6d, 0x09, 0x10, 0xec, 0xee, 0xc2, 0x3c, 0xab, + 0xfe, 0xa5, 0x9a, 0xce, 0xa8, 0xad, 0xa5, 0x50, 0x59, 0xdf, 0x3a, 0x02, 0xa9, 0xdb, 0x86, 0xa6, + 0x9e, 0xca, 0x76, 0x7f, 0x2c, 0xbe, 0xa0, 0xf8, 0xdd, 0x81, 0x39, 0x86, 0x2a, 0x84, 0x9b, 0xc0, + 0x8e, 0xe3, 0x74, 0xff, 0x78, 0x06, 0x50, 0x31, 0x11, 0x33, 0x92, 0x51, 0x2b, 0x97, 0x8c, 0xfe, + 0x24, 0xff, 0x34, 0xb8, 0x62, 0xe6, 0x9c, 0x45, 0x76, 0xc7, 0xbe, 0x11, 0x3e, 0x07, 0x55, 0x9f, + 0x8c, 0x5d, 0x32, 0x8a, 0xc4, 0x6d, 0xc1, 0xbc, 0x4f, 0xc6, 0xce, 0x28, 0xb2, 0x7f, 0x01, 0xcb, + 0x02, 0xc9, 0x10, 0x2f, 0x4b, 0x6c, 0x2c, 0x23, 0xb1, 0xb9, 0x04, 0xe0, 0xf9, 0xbe, 0x6b, 0x54, + 0x01, 0x75, 0xcf, 0xf7, 0x45, 0x86, 0xc2, 0x9a, 0x5e, 0x83, 0xf8, 0x10, 0xbb, 0x46, 0x5a, 0xd4, + 0xe4, 0x40, 0x8e, 0x64, 0xc7, 0x27, 0x7b, 0x08, 0xba, 0x69, 0x5a, 0xda, 0xda, 0x11, 0xab, 0x2f, + 0x59, 0x41, 0xae, 0x76, 0xe4, 0x44, 0xaa, 0xad, 0x7a, 0x28, 0x6f, 0x65, 0x65, 0xb9, 0x72, 0xdd, + 0xe8, 0xcd, 0x2e, 0x15, 0x1e, 0x45, 0xf3, 0xfe, 0x6c, 0x21, 0xe1, 0xae, 0x9c, 0x2e, 0xe1, 0xee, + 0xfe, 0x11, 0x9c, 0x51, 0x92, 0xe8, 0xe5, 0x3f, 0xad, 0xbf, 0xb4, 0xef, 0x17, 0x6b, 0xfc, 0xe9, + 0x7c, 0x7e, 0x04, 0x4b, 0x1c, 0x47, 0xab, 0xa3, 0x69, 0xd1, 0xac, 0x7d, 0x3a, 0x57, 0x34, 0x4f, + 0xe5, 0xb3, 0x7f, 0x6a, 0x81, 0xcd, 0x91, 0xcc, 0xd7, 0xe0, 0x42, 0x80, 0x5b, 0x86, 0x00, 0x13, + 0x5e, 0x8e, 0xff, 0x3f, 0x49, 0xb2, 0x63, 0xec, 0xc2, 0xd1, 0x92, 0xec, 0x4c, 0x73, 0x2b, 0xc6, + 0xb0, 0xcc, 0x71, 0xc4, 0xd3, 0x0c, 0x21, 0x41, 0xd7, 0x90, 0x20, 0xff, 0x2e, 0x7d, 0x3a, 0x9f, + 0xfe, 0x13, 0x0b, 0x56, 0xcc, 0xbf, 0x0c, 0x38, 0x7a, 0xf9, 0x26, 0xee, 0x94, 0x0f, 0x82, 0x7a, + 0x29, 0x7e, 0xf4, 0x41, 0x50, 0x68, 0xd3, 0xf9, 0xfc, 0xaf, 0x2c, 0xb8, 0xc8, 0x91, 0xf2, 0x0f, + 0xe0, 0x85, 0x18, 0x77, 0x0c, 0x31, 0x26, 0x3e, 0x97, 0x9f, 0x8e, 0x34, 0xbf, 0xb4, 0xa0, 0x23, + 0xac, 0x52, 0xcb, 0x35, 0x84, 0x24, 0x37, 0x0c, 0x49, 0x4a, 0xb3, 0x92, 0xe9, 0x48, 0xf1, 0xcf, + 0x73, 0x70, 0x5e, 0xfa, 0x1b, 0x3d, 0xfe, 0xed, 0xa4, 0x5e, 0x8a, 0xd1, 0xe7, 0xe2, 0xb2, 0xb3, + 0xb9, 0x6a, 0xdd, 0x6c, 0x67, 0x15, 0xe7, 0x44, 0x02, 0x1e, 0x0c, 0xf9, 0x96, 0xb1, 0x9b, 0xd1, + 0x2f, 0x8a, 0xf7, 0x4c, 0xb7, 0x8f, 0xe7, 0xa2, 0x1c, 0xa0, 0xf6, 0xa7, 0x40, 0xef, 0xe8, 0x0f, + 0xed, 0x59, 0x52, 0xf5, 0xa8, 0xd2, 0xb1, 0xb4, 0xc7, 0xf6, 0x1d, 0x98, 0x4b, 0x28, 0x35, 0xef, + 0x23, 0xb0, 0x49, 0x0e, 0xa0, 0x61, 0x6d, 0x8f, 0xc4, 0xaf, 0x31, 0x11, 0x2d, 0x04, 0x31, 0x42, + 0x97, 0x69, 0x34, 0xf6, 0x03, 0xa2, 0x9e, 0xa4, 0x70, 0x8e, 0x12, 0x26, 0x5b, 0x53, 0xf3, 0x2c, + 0x50, 0xd3, 0x9f, 0xe8, 0x36, 0x2c, 0x11, 0x11, 0x4d, 0xdc, 0xd7, 0x78, 0xec, 0xee, 0x07, 0x21, + 0x66, 0x3d, 0x85, 0x9a, 0xb3, 0x20, 0x27, 0xbe, 0xc2, 0xe3, 0x27, 0x41, 0x88, 0xd1, 0x45, 0xa8, + 0xf7, 0x0e, 0xbc, 0x30, 0xc4, 0x51, 0x5f, 0x5e, 0xae, 0x64, 0x00, 0xed, 0x0f, 0x0f, 0xea, 0xc6, + 0x1f, 0x1e, 0x74, 0xa0, 0x9a, 0x8c, 0xf6, 0xd8, 0x7b, 0x14, 0x7e, 0x39, 0x22, 0x87, 0x34, 0xca, + 0xe2, 0x61, 0xdc, 0x3b, 0x70, 0x13, 0xdc, 0x8b, 0x23, 0x3f, 0x61, 0xb7, 0x23, 0x33, 0x4e, 0x93, + 0x01, 0x77, 0x38, 0x8c, 0xa6, 0x9d, 0xfc, 0x59, 0x11, 0xbf, 0xee, 0xe0, 0x03, 0x74, 0x19, 0x20, + 0xf0, 0x71, 0x94, 0x06, 0xec, 0x3d, 0x44, 0x9b, 0x45, 0x67, 0x0d, 0x62, 0xff, 0xda, 0xd2, 0x5e, + 0xb6, 0x2a, 0x16, 0x96, 0xce, 0xc2, 0xd6, 0x5a, 0xd2, 0xe2, 0xd2, 0x4b, 0x35, 0xa0, 0x91, 0x68, + 0xc0, 0xf2, 0x06, 0x0e, 0x6f, 0xb9, 0x22, 0xd1, 0x5a, 0x14, 0xd7, 0xe4, 0xac, 0x91, 0x78, 0x11, + 0xea, 0xea, 0x06, 0x4a, 0xf4, 0x6c, 0x32, 0x00, 0x7f, 0x70, 0x1b, 0x8a, 0x8e, 0x04, 0xfd, 0xd9, + 0x7d, 0x00, 0x75, 0x65, 0x4f, 0x68, 0x01, 0x1a, 0x2f, 0x9f, 0xef, 0x6c, 0x3f, 0xde, 0xd8, 0x7a, + 0xb2, 0xf5, 0x78, 0x73, 0xf1, 0x77, 0x50, 0x03, 0xaa, 0x9b, 0x0f, 0x77, 0x1f, 0xee, 0x3c, 0xde, + 0x5d, 0xb4, 0x50, 0x13, 0x6a, 0x8f, 0x9f, 0x6f, 0x6e, 0xbf, 0xd8, 0x7a, 0xbe, 0xbb, 0x58, 0xe9, + 0xee, 0x43, 0xed, 0xe1, 0x28, 0x3d, 0xd8, 0x88, 0x7d, 0x6c, 0xda, 0x8d, 0x55, 0x62, 0x37, 0x2b, + 0xd2, 0x6e, 0x44, 0xa6, 0xce, 0x6d, 0xa6, 0xa0, 0xed, 0x99, 0xa2, 0xb6, 0xbb, 0xff, 0x5a, 0xcd, + 0xee, 0x3e, 0x79, 0xf6, 0x89, 0x36, 0x8a, 0x06, 0x7f, 0xbd, 0xd4, 0xe0, 0x93, 0x23, 0xfe, 0xec, + 0xed, 0x63, 0xa3, 0xe3, 0xaa, 0xdd, 0xd4, 0xe7, 0x38, 0xe8, 0x0d, 0x23, 0x99, 0xab, 0x95, 0x0a, + 0xde, 0x32, 0x05, 0xb7, 0xff, 0xd3, 0x02, 0xd0, 0x9e, 0xff, 0xfc, 0xc4, 0x78, 0x5f, 0x6b, 0x99, + 0xf7, 0x4c, 0xb9, 0x6f, 0xea, 0x0f, 0x71, 0x8e, 0x78, 0x69, 0xab, 0x37, 0x8d, 0x2d, 0x2d, 0x95, + 0x5c, 0x85, 0xc6, 0x10, 0x93, 0x41, 0x90, 0xf0, 0xeb, 0x7d, 0x9e, 0x29, 0xea, 0x20, 0x7b, 0xfb, + 0x24, 0x2f, 0x65, 0x4f, 0xf3, 0xae, 0xdb, 0xfe, 0xdf, 0x0a, 0xb4, 0x8c, 0x55, 0xd0, 0x53, 0x26, + 0x9f, 0xb2, 0x89, 0x76, 0xb1, 0x18, 0xa2, 0x2e, 0x34, 0xb9, 0xa4, 0xfc, 0xea, 0x50, 0x48, 0x6f, + 0xc0, 0xe8, 0x71, 0x12, 0xf7, 0x8a, 0xd4, 0x37, 0x72, 0xab, 0xd7, 0x20, 0x3c, 0x1f, 0xde, 0x27, + 0x38, 0x39, 0x10, 0x4c, 0x66, 0xcb, 0x99, 0xe0, 0xb7, 0xc3, 0x80, 0xe0, 0xc4, 0x0d, 0x22, 0x76, + 0x1a, 0x5a, 0x8e, 0x06, 0xa1, 0x07, 0x2e, 0xf0, 0x05, 0x3d, 0x3f, 0x13, 0x6a, 0x4c, 0xe7, 0x0c, + 0xef, 0x53, 0x77, 0xd4, 0xd8, 0xb8, 0x3f, 0xad, 0xe5, 0xee, 0x4f, 0xcf, 0x8a, 0x26, 0x67, 0x5d, + 0x1d, 0x03, 0xde, 0xe8, 0xbc, 0x26, 0x0e, 0x30, 0x14, 0x93, 0x41, 0x8e, 0xc5, 0x8e, 0xf4, 0x0a, + 0x77, 0x87, 0x0d, 0x45, 0xcc, 0x5c, 0x62, 0x47, 0x96, 0x45, 0xcd, 0xcc, 0xed, 0x32, 0x80, 0xed, + 0x9e, 0xe0, 0x61, 0xc0, 0x03, 0x73, 0x1f, 0xaf, 0x1c, 0x6b, 0x74, 0xe6, 0xa5, 0x5d, 0xe3, 0xe8, + 0x6e, 0xe5, 0xc7, 0x26, 0xf7, 0x6b, 0xc7, 0x1c, 0x44, 0x1e, 0x88, 0xb2, 0x0f, 0x3c, 0x72, 0xbe, + 0xd9, 0xee, 0x07, 0xe9, 0xc1, 0x68, 0x8f, 0xc6, 0xdf, 0xf5, 0xa7, 0x71, 0xdc, 0x0f, 0xf1, 0x46, + 0x18, 0x8f, 0xfc, 0x6d, 0xa1, 0xd1, 0xf5, 0x03, 0xec, 0x85, 0xe9, 0x41, 0xcf, 0x23, 0xf8, 0xee, + 0x3e, 0xf6, 0x31, 0xf1, 0x52, 0xec, 0xdf, 0xe5, 0xfb, 0x7c, 0x57, 0x36, 0x17, 0xd7, 0xf5, 0xbf, + 0x67, 0xde, 0x9b, 0x67, 0xa3, 0xf7, 0xff, 0x2f, 0x00, 0x00, 0xff, 0xff, 0xae, 0x35, 0x87, 0xb6, + 0xe6, 0x3c, 0x00, 0x00, } diff --git a/proto/dam/v1/dam_service.proto b/proto/dam/v1/dam_service.proto index d6d19383..7c6df4ac 100644 --- a/proto/dam/v1/dam_service.proto +++ b/proto/dam/v1/dam_service.proto @@ -91,17 +91,19 @@ message Resource { message ServiceTemplate { string service_name = 1; - string item_format = 2; - map interfaces = 3; - map service_roles = 4 [json_name = "roles"]; - map ui = 5; + map interfaces = 2; + map service_roles = 3 [json_name = "roles"]; + map ui = 4; } message ServiceRole { - repeated string target_roles = 1; - repeated string target_scopes = 2; - repeated string dam_role_categories = 3; - map ui = 4; + message ServiceArg { + repeated string values = 2; + } + + map service_args = 1; + repeated string dam_role_categories = 2; + map ui = 3; } message ViewRole { @@ -130,26 +132,16 @@ message VisaType { } message ServiceDescriptor { - message Requirements { - bool target_role = 1; - bool target_scope = 2; - bool aud = 3; - } message Properties { bool is_aggregate = 1; bool can_be_aggregated = 2; bool single_item = 3; } string platform = 1; - Requirements requirements = 2; - Properties properties = 3; - map item_formats = 4; - map ui = 5; -} - -message ItemFormat { - map variables = 1; - map ui = 2; + map service_variables = 2; + map item_variables = 3; + Properties properties = 4; + map ui = 6; } message VariableFormat { @@ -268,12 +260,21 @@ message GetTokenRequest { message GetTestResultsRequest {} message GetTestResultsResponse { + message RejectedVisa { + string reason = 1; + string field = 2; + string description = 3; + string visa_type = 4; + string source = 5; + string value = 6; + string by = 7; + } message TestResult { string name = 1; string result = 2; repeated string access = 3; map no_access = 4; - map rejected_visas = 5; + repeated RejectedVisa rejected_visas = 5; string error = 6; } diff --git a/testdata/config/dam-min/config_master_main_latest.json b/testdata/config/dam-min/config_master_main_latest.json index d5f084fd..3d45e304 100644 --- a/testdata/config/dam-min/config_master_main_latest.json +++ b/testdata/config/dam-min/config_master_main_latest.json @@ -103,14 +103,12 @@ }, "serviceTemplates": { "gcs": { - "serviceName": "token:gcp:sa", - "itemFormat": "gcs", + "serviceName": "gcs", "roles": { "viewer": { - "targetRoles": ["roles/storage.objectViewer"], - "targetScopes": [ - "https://www.googleapis.com/auth/cloud-platform" - ], + "serviceArgs": { + "roles": { "values": ["roles/storage.objectViewer"] } + }, "damRoleCategories": ["metadata", "list", "read"], "ui": { "label": "File Viewer", diff --git a/testdata/config/dam/config_master_main_latest.json b/testdata/config/dam/config_master_main_latest.json index 1595e8ac..0a7c257f 100644 --- a/testdata/config/dam/config_master_main_latest.json +++ b/testdata/config/dam/config_master_main_latest.json @@ -342,8 +342,7 @@ "args": { "project": "dataset-example-project", "bucket": "dataset-example-payer-bucket2", - "type": "requester-pays", - "paths": "/hello/there*;/goodbye/charlie" + "type": "requester-pays" } } ], @@ -501,13 +500,12 @@ }, "serviceTemplates": { "beacon": { - "serviceName": "token:jwt:gatekeeper", - "itemFormat": "url", + "serviceName": "gatekeeper", "roles" : { "basic_discovery": { - "targetScopes": [ - "registered" - ], + "serviceArgs": { + "scopes": { "values": ["registered"] } + }, "damRoleCategories": ["exists"], "ui": { "label": "Discovery Beacon Search without Metadata", @@ -515,10 +513,9 @@ } }, "discovery": { - "targetScopes": [ - "registered", - "controlled" - ], + "serviceArgs": { + "scopes": { "values": ["registered", "controlled"] } + }, "damRoleCategories": ["metadata"], "ui": { "label": "Discovery Beacon Search with Metadata", @@ -535,14 +532,12 @@ } }, "gcs": { - "serviceName": "token:gcp:sa", - "itemFormat": "gcs", + "serviceName": "gcs", "roles": { "viewer": { - "targetRoles": ["roles/storage.objectViewer"], - "targetScopes": [ - "https://www.googleapis.com/auth/cloud-platform" - ], + "serviceArgs": { + "roles": { "values": ["roles/storage.objectViewer"] } + }, "damRoleCategories": ["metadata", "list", "read"], "ui": { "label": "File Viewer", @@ -550,7 +545,9 @@ } }, "creator": { - "targetRoles": ["roles/storage.objectCreator"], + "serviceArgs": { + "roles": { "values": ["roles/storage.objectCreator"] } + }, "damRoleCategories": ["write"], "ui": { "label": "File Creator", @@ -558,13 +555,14 @@ } }, "editor": { - "targetRoles": [ - "roles/storage.objectViewer", - "roles/storage.objectCreator" - ], - "targetScopes": [ - "https://www.googleapis.com/auth/cloud-platform" - ], + "serviceArgs": { + "roles": { + "values": [ + "roles/storage.objectViewer", + "roles/storage.objectCreator" + ] + } + }, "damRoleCategories": ["metadata", "list", "read", "write"], "ui": { "label": "File Editor", @@ -582,14 +580,12 @@ } }, "bigquery": { - "serviceName": "token:gcp:sa", - "itemFormat": "bigquery", + "serviceName": "bigquery", "roles": { "viewer": { - "targetRoles": ["roles/BQReader"], - "targetScopes": [ - "https://www.googleapis.com/auth/cloud-platform" - ], + "serviceArgs": { + "roles": { "values": ["roles/BQReader"] } + }, "damRoleCategories": ["metadata", "list", "read"], "ui": { "label": "BigQuery Viewer", @@ -597,10 +593,9 @@ } }, "editor": { - "targetRoles": ["roles/bigquery.dataEditor"], - "targetScopes": [ - "https://www.googleapis.com/auth/cloud-platform" - ], + "serviceArgs": { + "roles": { "values": ["roles/bigquery.dataEditor"] } + }, "damRoleCategories": ["metadata", "list", "read", "write"], "ui": { "label": "BigQuery Editor", @@ -617,8 +612,7 @@ } }, "views": { - "serviceName": "token:aggregate:view", - "itemFormat": "view", + "serviceName": "aggregator", "roles": { "viewer": { "damRoleCategories": ["metadata", "list", "read"], @@ -772,7 +766,6 @@ }, "access": [ "dataset_example/bq_read/viewer", - "dataset_example/gcp/viewer", "dataset_example/gcs_payer/viewer", "dataset_example/gcs_read/viewer" ]