From 1fb4862affff865bdea9788814fee013c2703a73 Mon Sep 17 00:00:00 2001 From: Tedi Mitiku Date: Sun, 23 Mar 2025 18:40:11 -0400 Subject: [PATCH 01/48] impl update --- .../command_str_consts/command_str_consts.go | 1 + cli/cli/commands/service/add/add.go | 52 ++- cli/cli/commands/service/add/add_test.go | 24 +- cli/cli/commands/service/inspect/inspect.go | 104 ++++- cli/cli/commands/service/service.go | 2 + cli/cli/commands/service/update/update.go | 416 ++++++++++++++++++ 6 files changed, 544 insertions(+), 55 deletions(-) create mode 100644 cli/cli/commands/service/update/update.go diff --git a/cli/cli/command_str_consts/command_str_consts.go b/cli/cli/command_str_consts/command_str_consts.go index bf5ec0416e..819fdb17c3 100644 --- a/cli/cli/command_str_consts/command_str_consts.go +++ b/cli/cli/command_str_consts/command_str_consts.go @@ -64,6 +64,7 @@ const ( ServiceStartCmdStr = "start" ServiceStopCmdStr = "stop" ServiceInspectCmdStr = "inspect" + ServiceUpdateCmdStr = "update" StarlarkRunCmdStr = "run" TwitterCmdStr = "twitter" ConfigCmdStr = "config" diff --git a/cli/cli/commands/service/add/add.go b/cli/cli/commands/service/add/add.go index 15460c73c6..b43abb15c9 100644 --- a/cli/cli/commands/service/add/add.go +++ b/cli/cli/commands/service/add/add.go @@ -3,6 +3,7 @@ package add import ( "context" "fmt" + "github.com/kurtosis-tech/kurtosis/api/golang/core/lib/enclaves" "github.com/kurtosis-tech/kurtosis/api/golang/core/lib/starlark_run_config" "strconv" "strings" @@ -285,21 +286,9 @@ func run( ) } - starlarkScript := fmt.Sprintf(`def run(plan): - plan.add_service(name = "%s", config = %s) -`, serviceName, serviceConfigStarlark) - starlarkRunResult, err := enclaveCtx.RunStarlarkScriptBlocking(ctx, starlarkScript, starlark_run_config.NewRunStarlarkConfig()) + err = RunAddServiceStarlarkScript(ctx, serviceName, enclaveIdentifier, GetAddServiceStarlarkScript(serviceName, serviceConfigStarlark), enclaveCtx) if err != nil { - return stacktrace.Propagate(err, "An error has occurred when running Starlark to add service") - } - if starlarkRunResult.InterpretationError != nil { - return stacktrace.NewError("An error has occurred when adding service: %s\nThis is a bug in Kurtosis, please report.", starlarkRunResult.InterpretationError) - } - if len(starlarkRunResult.ValidationErrors) > 0 { - return stacktrace.NewError("An error occurred when validating add service '%v' to enclave '%v': %s", serviceName, enclaveIdentifier, starlarkRunResult.ValidationErrors) - } - if starlarkRunResult.ExecutionError != nil { - return stacktrace.NewError("An error occurred adding service '%v' to enclave '%v': %s", serviceName, enclaveIdentifier, starlarkRunResult.ExecutionError) + return err // already wrapped } serviceCtx, err := enclaveCtx.GetServiceContext(serviceName) if err != nil { @@ -390,6 +379,29 @@ func run( return nil } +func GetAddServiceStarlarkScript(serviceName string, serviceConfigStarlark string) string { + return fmt.Sprintf(`def run(plan): + plan.add_service(name = "%s", config = %s) +`, serviceName, serviceConfigStarlark) +} + +func RunAddServiceStarlarkScript(ctx context.Context, serviceName, enclaveIdentifier string, starlarkScript string, enclaveCtx *enclaves.EnclaveContext) error { + starlarkRunResult, err := enclaveCtx.RunStarlarkScriptBlocking(ctx, starlarkScript, starlark_run_config.NewRunStarlarkConfig()) + if err != nil { + return stacktrace.Propagate(err, "An error has occurred when running Starlark to add service") + } + if starlarkRunResult.InterpretationError != nil { + return stacktrace.NewError("An error has occurred when adding service: %s\nThis is a bug in Kurtosis, please report.", starlarkRunResult.InterpretationError) + } + if len(starlarkRunResult.ValidationErrors) > 0 { + return stacktrace.NewError("An error occurred when validating add service '%v' to enclave '%v': %s", serviceName, enclaveIdentifier, starlarkRunResult.ValidationErrors) + } + if starlarkRunResult.ExecutionError != nil { + return stacktrace.NewError("An error occurred adding service '%v' to enclave '%v': %s", serviceName, enclaveIdentifier, starlarkRunResult.ExecutionError) + } + return nil +} + // GetServiceConfigStarlark TODO(victor.colombo): Extract this to a more reasonable place func GetServiceConfigStarlark( image string, @@ -404,17 +416,17 @@ func GetServiceConfigStarlark( minMemoryMegaBytes int, privateIPAddressPlaceholder string, ) (string, error) { - envvarsMap, err := parseEnvVarsStr(envvarsStr) + envvarsMap, err := ParseEnvVarsStr(envvarsStr) if err != nil { return "", stacktrace.Propagate(err, "An error occurred parsing environment variables string '%v'", envvarsStr) } - ports, err := parsePortsStr(portsStr) + ports, err := ParsePortsStr(portsStr) if err != nil { return "", stacktrace.Propagate(err, "An error occurred parsing ports string '%v'", portsStr) } - filesArtifactMounts, err := parseFilesArtifactMountsStr(filesArtifactMountsStr) + filesArtifactMounts, err := ParseFilesArtifactMountsStr(filesArtifactMountsStr) if err != nil { return "", stacktrace.Propagate(err, "An error occurred parsing files artifact mounts string '%v'", filesArtifactMountsStr) } @@ -424,7 +436,7 @@ func GetServiceConfigStarlark( // Parses a string in the form KEY1=VALUE1,KEY2=VALUE2 into a map of strings // An empty string will result in an empty map // Empty strings will be skipped (e.g. ',,,' will result in an empty map) -func parseEnvVarsStr(envvarsStr string) (map[string]string, error) { +func ParseEnvVarsStr(envvarsStr string) (map[string]string, error) { result := map[string]string{} if envvarsStr == "" { return result, nil @@ -462,7 +474,7 @@ func parseEnvVarsStr(envvarsStr string) (map[string]string, error) { // Parses a string in the form PORTID1=1234,PORTID2=5678/udp // An empty string will result in an empty map // Empty strings will be skipped (e.g. ',,,' will result in an empty map) -func parsePortsStr(portsStr string) (map[string]*kurtosis_core_rpc_api_bindings.Port, error) { +func ParsePortsStr(portsStr string) (map[string]*kurtosis_core_rpc_api_bindings.Port, error) { result := map[string]*kurtosis_core_rpc_api_bindings.Port{} if strings.TrimSpace(portsStr) == "" { return result, nil @@ -591,7 +603,7 @@ func getTransportProtocolFromPortSpecString(portSpec string) (kurtosis_core_rpc_ return kurtosis_core_rpc_api_bindings.Port_TransportProtocol(transportProtocolEnumInt), nil } -func parseFilesArtifactMountsStr(filesArtifactMountsStr string) (map[string]string, error) { +func ParseFilesArtifactMountsStr(filesArtifactMountsStr string) (map[string]string, error) { result := map[string]string{} if strings.TrimSpace(filesArtifactMountsStr) == "" { return result, nil diff --git a/cli/cli/commands/service/add/add_test.go b/cli/cli/commands/service/add/add_test.go index b291ff0383..671f807752 100644 --- a/cli/cli/commands/service/add/add_test.go +++ b/cli/cli/commands/service/add/add_test.go @@ -140,17 +140,17 @@ func TestParsePortSpecstr_CustomProtocol(t *testing.T) { } func TestParsePortsStr_DuplicatePortsCauseError(t *testing.T) { - _, err := parsePortsStr("http=80/tcp,http=8080") + _, err := ParsePortsStr("http=80/tcp,http=8080") require.Error(t, err) } func TestParsePortsStr_EmptyPortIDCausesError(t *testing.T) { - _, err := parsePortsStr("=80/tcp") + _, err := ParsePortsStr("=80/tcp") require.Error(t, err) } func TestParsePortsStr_SuccessfulPortsString(t *testing.T) { - ports, err := parsePortsStr("port1=8080,port2=2900/udp") + ports, err := ParsePortsStr("port1=8080,port2=2900/udp") require.NoError(t, err) require.Equal(t, 2, len(ports)) @@ -166,7 +166,7 @@ func TestParsePortsStr_SuccessfulPortsString(t *testing.T) { } func TestParseEnvVarsStr_EqualSignInValueIsOkay(t *testing.T) { - envvars, err := parseEnvVarsStr("VAR=thing=otherthing") + envvars, err := ParseEnvVarsStr("VAR=thing=otherthing") require.NoError(t, err) require.Equal(t, 1, len(envvars)) @@ -176,7 +176,7 @@ func TestParseEnvVarsStr_EqualSignInValueIsOkay(t *testing.T) { } func TestParseEnvVarsStr_MultipleVarsAreOkay(t *testing.T) { - envvars, err := parseEnvVarsStr("VAR1=VALUE1,VAR2=VALUE2") + envvars, err := ParseEnvVarsStr("VAR1=VALUE1,VAR2=VALUE2") require.NoError(t, err) require.Equal(t, 2, len(envvars)) @@ -190,12 +190,12 @@ func TestParseEnvVarsStr_MultipleVarsAreOkay(t *testing.T) { } func TestParseEnvVarsStr_DuplicateVarNamesError(t *testing.T) { - _, err := parseEnvVarsStr("VAR1=VALUE1,VAR1=VALUE2") + _, err := ParseEnvVarsStr("VAR1=VALUE1,VAR1=VALUE2") require.Error(t, err) } func TestParseEnvVarsStr_EmptyDeclarations(t *testing.T) { - envvars, err := parseEnvVarsStr("VAR1=VALUE1,, , ,,") + envvars, err := ParseEnvVarsStr("VAR1=VALUE1,, , ,,") require.NoError(t, err) require.Equal(t, 1, len(envvars)) } @@ -206,7 +206,7 @@ func TestParseFilesArtifactMountStr_ValidParse(t *testing.T) { mountpoint1 := "/dest1" mountpoint2 := "/dest2" - result, err := parseFilesArtifactMountsStr(fmt.Sprintf( + result, err := ParseFilesArtifactMountsStr(fmt.Sprintf( "%v:%v,%v:%v", mountpoint1, artifactUuid1, @@ -231,7 +231,7 @@ func TestParseFilesArtifactMountStr_EmptyDeclarationsAreSkipped(t *testing.T) { mountpoint1 := "/dest1" mountpoint2 := "/dest2" - result, err := parseFilesArtifactMountsStr(fmt.Sprintf( + result, err := ParseFilesArtifactMountsStr(fmt.Sprintf( "%v:%v,,,,,%v:%v", mountpoint1, artifactUuid1, @@ -254,7 +254,7 @@ func TestParseFilesArtifactMountStr_TooManyArtifactUuidMountpointDelimitersIsErr artifactUuid := services.FilesArtifactUUID("1234") mountpoint := "/dest" - _, err := parseFilesArtifactMountsStr(fmt.Sprintf( + _, err := ParseFilesArtifactMountsStr(fmt.Sprintf( "%v::%v", artifactUuid, mountpoint, @@ -266,7 +266,7 @@ func TestParseFilesArtifactMountStr_TooFewArtifactUuidMountpointDelimitersIsErro artifactUuid := services.FilesArtifactUUID("1234") mountpoint := "/dest" - _, err := parseFilesArtifactMountsStr(fmt.Sprintf( + _, err := ParseFilesArtifactMountsStr(fmt.Sprintf( "%v%v", artifactUuid, mountpoint, @@ -279,7 +279,7 @@ func TestParseFilesArtifactMountStr_DuplicateArtifactUuids(t *testing.T) { mountpoint1 := "/dest1" mountpoint2 := "/dest2" - _, err := parseFilesArtifactMountsStr(fmt.Sprintf( + _, err := ParseFilesArtifactMountsStr(fmt.Sprintf( "%v:%v,%v:%v", artifactUuid, mountpoint1, diff --git a/cli/cli/commands/service/inspect/inspect.go b/cli/cli/commands/service/inspect/inspect.go index d89e2d7f6f..a512be1fad 100644 --- a/cli/cli/commands/service/inspect/inspect.go +++ b/cli/cli/commands/service/inspect/inspect.go @@ -7,7 +7,10 @@ package inspect import ( "context" + "encoding/json" "fmt" + "gopkg.in/yaml.v3" + "strings" "github.com/kurtosis-tech/kurtosis/api/golang/core/kurtosis_core_rpc_api_bindings" "github.com/kurtosis-tech/kurtosis/api/golang/engine/kurtosis_engine_rpc_api_bindings" @@ -38,14 +41,26 @@ const ( fullUuidFlagKey = "full-uuid" fullUuidFlagKeyDefault = "false" - serviceNameTitleName = "Name" - serviceUUIDTitleName = "UUID" - serviceStatusTitleName = "Status" - serviceImageTitleName = "Image" - servicePortsTitleName = "Ports" - serviceEntrypointArgsTitleName = "ENTRYPOINT" - serviceCmdArgsTitleName = "CMD" - serviceEnvVarsTitleName = "ENV" + outputFormatKey = "output" + outputFormatKeyShorthand = "o" + outputFormatKeyDefault = "" + yamlOutputFormat = "yaml" + + jsonOutputFormat = "json" + + ServiceNameTitleName = "Name" + ServiceUUIDTitleName = "UUID" + ServiceStatusTitleName = "Status" + ServiceImageTitleName = "Image" + ServicePortsTitleName = "Ports" + ServiceEntrypointArgsTitleName = "ENTRYPOINT" + ServiceCmdArgsTitleName = "CMD" + ServiceEnvVarsTitleName = "ENV" + ServiceFilesTitleName = "Files" + ServiceMaxCpuAllocationTitleName = "MaxCpu" + ServiceMinCpuAllocationTitleName = "MinCpu" + ServiceMemoryAllocationTitleName = "MaxMemory" + ServiceMinMemoryAllocationTitleName = "MinMemory" kurtosisBackendCtxKey = "kurtosis-backend" engineClientCtxKey = "engine-client" @@ -64,6 +79,13 @@ var ServiceInspectCmd = &engine_consuming_kurtosis_command.EngineConsumingKurtos Type: flags.FlagType_Bool, Default: fullUuidFlagKeyDefault, }, + { + Key: outputFormatKey, + Shorthand: outputFormatKeyShorthand, + Usage: "Format to output the result (yaml or json)", + Type: flags.FlagType_String, + Default: outputFormatKeyDefault, + }, }, Args: []*args.ArgConfig{ enclave_id_arg.NewEnclaveIdentifierArg( @@ -97,7 +119,7 @@ func run( serviceIdentifier, err := args.GetNonGreedyArg(serviceIdentifierArgKey) if err != nil { - return stacktrace.Propagate(err, "Expected a value for non-greedy enclave identifier arg '%v' but none was found; this is a bug in the Kurtosis CLI!", enclaveIdentifierArgKey) + return stacktrace.Propagate(err, "Expected a value for non-greedy enclave identifier arg '%v' but none was found; this is a bug in the Kurtosis CLI!", serviceIdentifier) } showFullUuid, err := flags.GetBool(fullUuidFlagKey) @@ -105,22 +127,33 @@ func run( return stacktrace.Propagate(err, "Expected a value for the '%v' flag but failed to get it", fullUuidFlagKey) } + outputFormat, err := flags.GetString(outputFormatKey) + if err != nil { + return stacktrace.Propagate(err, "Expected a value for the '%v' flag but failed to get it", outputFormatKey) + } + + outputFormat = strings.ToLower(strings.TrimSpace(outputFormat)) + if outputFormat != "" && outputFormat != jsonOutputFormat && outputFormat != yamlOutputFormat { + return stacktrace.NewError("Invalid output format '%s'; must be '%v' or '%v'", outputFormat, jsonOutputFormat, yamlOutputFormat) + } + kurtosisCtx, err := kurtosis_context.NewKurtosisContextFromLocalEngine() if err != nil { return stacktrace.Propagate(err, "An error occurred creating Kurtosis Context from local engine") } - if err = PrintServiceInspect(ctx, kurtosisBackend, kurtosisCtx, enclaveIdentifier, serviceIdentifier, showFullUuid); err != nil { + if _, err = PrintServiceInspect(ctx, kurtosisBackend, kurtosisCtx, enclaveIdentifier, serviceIdentifier, showFullUuid, outputFormat); err != nil { // this is already wrapped up return err } return nil } -func PrintServiceInspect(ctx context.Context, kurtosisBackend backend_interface.KurtosisBackend, kurtosisCtx *kurtosis_context.KurtosisContext, enclaveIdentifier string, serviceIdentifier string, showFullUuid bool) error { +func PrintServiceInspect(ctx context.Context, kurtosisBackend backend_interface.KurtosisBackend, kurtosisCtx *kurtosis_context.KurtosisContext, enclaveIdentifier string, serviceIdentifier string, showFullUuid bool, outputFormat string) (map[string]interface{}, error) { + var jsonMap map[string]interface{} enclaveInfo, err := kurtosisCtx.GetEnclave(ctx, enclaveIdentifier) if err != nil { - return stacktrace.Propagate(err, "An error occurred getting the enclave for identifier '%v'", enclaveIdentifier) + return jsonMap, stacktrace.Propagate(err, "An error occurred getting the enclave for identifier '%v'", enclaveIdentifier) } enclaveApiContainerStatus := enclaveInfo.ApiContainerStatus @@ -134,7 +167,7 @@ func PrintServiceInspect(ctx context.Context, kurtosisBackend backend_interface. } userServices, err = user_services.GetUserServiceInfoMapFromAPIContainer(ctx, enclaveInfo, serviceMap) if err != nil { - return stacktrace.Propagate(err, "Failed to get service info from API container in enclave '%v'", enclaveInfo.GetEnclaveUuid()) + return jsonMap, stacktrace.Propagate(err, "Failed to get service info from API container in enclave '%v'", enclaveInfo.GetEnclaveUuid()) } } @@ -143,43 +176,68 @@ func PrintServiceInspect(ctx context.Context, kurtosisBackend backend_interface. userService = userServiceInfo break } - out.PrintOutLn(fmt.Sprintf("%s: %s", serviceNameTitleName, userService.GetName())) + + if outputFormat != "" { + jsonMap[ServiceImageTitleName] = userService.GetContainer().GetImageName() + jsonMap[ServiceCmdArgsTitleName] = userService.GetContainer().GetCmdArgs() + jsonMap[ServiceEntrypointArgsTitleName] = userService.GetContainer().GetEntrypointArgs() + jsonMap[ServiceEnvVarsTitleName] = userService.GetContainer().GetEnvVars() + jsonMap[ServicePortsTitleName] = userService.GetPrivatePorts() + jsonMap["Files"] = "" + // TODO: add support for files + // How would we get files information? + var marshaled []byte + var err error + switch outputFormat { + case jsonOutputFormat: + marshaled, err = json.MarshalIndent(jsonMap, "", "") + case yamlOutputFormat: + marshaled, err = yaml.Marshal(jsonMap) + } + if err != nil { + return jsonMap, stacktrace.Propagate(err, "Failed to marshal service info to %s", outputFormat) + } + out.PrintOutLn(string(marshaled)) + return jsonMap, nil + } + + out.PrintOutLn(fmt.Sprintf("%s: %s", ServiceNameTitleName, userService.GetName())) uuidStr := userService.GetShortenedUuid() if showFullUuid { uuidStr = userService.GetServiceUuid() } - out.PrintOutLn(fmt.Sprintf("%s: %s", serviceUUIDTitleName, uuidStr)) + out.PrintOutLn(fmt.Sprintf("%s: %s", ServiceUUIDTitleName, uuidStr)) serviceStatus := userService.GetServiceStatus() serviceStatusStr := service_status_stringifier.ServiceStatusStringifier(serviceStatus) - out.PrintOutLn(fmt.Sprintf("%s: %s", serviceStatusTitleName, serviceStatusStr)) + out.PrintOutLn(fmt.Sprintf("%s: %s", ServiceStatusTitleName, serviceStatusStr)) - out.PrintOutLn(fmt.Sprintf("%s: %s", serviceImageTitleName, userService.GetContainer().GetImageName())) + out.PrintOutLn(fmt.Sprintf("%s: %s", ServiceImageTitleName, userService.GetContainer().GetImageName())) - out.PrintOutLn(fmt.Sprintf("%s:", servicePortsTitleName)) + out.PrintOutLn(fmt.Sprintf("%s:", ServicePortsTitleName)) portBindingLines, err := user_services.GetUserServicePortBindingStrings(userService) if err != nil { - return stacktrace.Propagate(err, "An error occurred getting the port binding strings") + return jsonMap, stacktrace.Propagate(err, "An error occurred getting the port binding strings") } for _, portBindingLine := range portBindingLines { out.PrintOutLn(fmt.Sprintf(" %s", portBindingLine)) } - out.PrintOutLn(fmt.Sprintf("%s:", serviceEntrypointArgsTitleName)) + out.PrintOutLn(fmt.Sprintf("%s:", ServiceEntrypointArgsTitleName)) for _, entrypointArg := range userService.GetContainer().GetEntrypointArgs() { out.PrintOutLn(fmt.Sprintf(" %s", entrypointArg)) } - out.PrintOutLn(fmt.Sprintf("%s:", serviceCmdArgsTitleName)) + out.PrintOutLn(fmt.Sprintf("%s:", ServiceCmdArgsTitleName)) for _, cmdArg := range userService.GetContainer().GetCmdArgs() { out.PrintOutLn(fmt.Sprintf(" %s", cmdArg)) } - out.PrintOutLn(fmt.Sprintf("%s:", serviceEnvVarsTitleName)) + out.PrintOutLn(fmt.Sprintf("%s:", ServiceEnvVarsTitleName)) for envVarKey, envVarVal := range userService.GetContainer().GetEnvVars() { out.PrintOutLn(fmt.Sprintf(" %s: %s", envVarKey, envVarVal)) } - return nil + return jsonMap, nil } diff --git a/cli/cli/commands/service/service.go b/cli/cli/commands/service/service.go index 8fc9ddbd6a..077ea473ab 100644 --- a/cli/cli/commands/service/service.go +++ b/cli/cli/commands/service/service.go @@ -15,6 +15,7 @@ import ( "github.com/kurtosis-tech/kurtosis/cli/cli/commands/service/shell" "github.com/kurtosis-tech/kurtosis/cli/cli/commands/service/start" "github.com/kurtosis-tech/kurtosis/cli/cli/commands/service/stop" + "github.com/kurtosis-tech/kurtosis/cli/cli/commands/service/update" "github.com/spf13/cobra" ) @@ -35,4 +36,5 @@ func init() { ServiceCmd.AddCommand(start.ServiceStartCmd.MustGetCobraCommand()) ServiceCmd.AddCommand(stop.ServiceStopCmd.MustGetCobraCommand()) ServiceCmd.AddCommand(inspect.ServiceInspectCmd.MustGetCobraCommand()) + ServiceCmd.AddCommand(update.ServiceUpdateCmd.MustGetCobraCommand()) } diff --git a/cli/cli/commands/service/update/update.go b/cli/cli/commands/service/update/update.go new file mode 100644 index 0000000000..cf08201e40 --- /dev/null +++ b/cli/cli/commands/service/update/update.go @@ -0,0 +1,416 @@ +package update + +import ( + "context" + "fmt" + "github.com/kurtosis-tech/kurtosis/api/golang/core/kurtosis_core_rpc_api_bindings" + "github.com/kurtosis-tech/kurtosis/api/golang/core/lib/services" + "github.com/kurtosis-tech/kurtosis/api/golang/engine/kurtosis_engine_rpc_api_bindings" + "github.com/kurtosis-tech/kurtosis/api/golang/engine/lib/kurtosis_context" + "github.com/kurtosis-tech/kurtosis/cli/cli/command_framework/highlevel/enclave_id_arg" + "github.com/kurtosis-tech/kurtosis/cli/cli/command_framework/highlevel/engine_consuming_kurtosis_command" + "github.com/kurtosis-tech/kurtosis/cli/cli/command_framework/highlevel/service_identifier_arg" + "github.com/kurtosis-tech/kurtosis/cli/cli/command_framework/lowlevel/args" + "github.com/kurtosis-tech/kurtosis/cli/cli/command_framework/lowlevel/flags" + "github.com/kurtosis-tech/kurtosis/cli/cli/command_str_consts" + "github.com/kurtosis-tech/kurtosis/cli/cli/commands/service/add" + "github.com/kurtosis-tech/kurtosis/cli/cli/commands/service/inspect" + "github.com/kurtosis-tech/kurtosis/container-engine-lib/lib/backend_interface" + "github.com/kurtosis-tech/kurtosis/core/server/api_container/server/startosis_engine/kurtosis_types/service_config" + "github.com/kurtosis-tech/kurtosis/metrics-library/golang/lib/metrics_client" + "github.com/kurtosis-tech/stacktrace" + "strings" +) + +const ( + enclaveIdentifierArgKey = "enclave" + isEnclaveIdArgOptional = false + isEnclaveIdArgGreedy = false + + serviceIdentifierArgKey = "service" + isServiceIdentifierArgOptional = false + isServiceIdentifierArgGreedy = false + + serviceImageFlagKey = "image" + cmdArgsFlagKey = "cmd" + entrypointBinaryFlagKey = "entrypoint" + + envvarsFlagKey = "env" + envvarKeyValueDelimiter = "=" + envvarDeclarationsDelimiter = "," + + portsFlagKey = "ports" + portIdSpecDelimiter = "=" + portNumberProtocolDelimiter = "/" + portDeclarationsDelimiter = "," + portApplicationProtocolDelimiter = ":" + + filesFlagKey = "files" + filesArtifactMountsDelimiter = "," + filesArtifactMountpointDelimiter = ":" + + kurtosisBackendCtxKey = "kurtosis-backend" + engineClientCtxKey = "engine-client" + + maybeApplicationProtocolSpecForHelp = "MAYBE_APPLICATION_PROTOCOL" + transportProtocolSpecForHelp = "TRANSPORT_PROTOCOL" + portNumberSpecForHelp = "PORT_NUMBER" + portIdSpecForHelp = "PORT_ID" +) + +var ( + defaultTransportProtocolStr = strings.ToLower(kurtosis_core_rpc_api_bindings.Port_TCP.String()) + serviceAddSpec = fmt.Sprintf( + `%v%v%v%v%v`, + maybeApplicationProtocolSpecForHelp, + portApplicationProtocolDelimiter, + portNumberSpecForHelp, + portNumberProtocolDelimiter, + transportProtocolSpecForHelp, + ) + serviceAddSpecWithPortId = fmt.Sprintf( + `%v%v%v`, + portIdSpecForHelp, + portIdSpecDelimiter, + serviceAddSpec, + ) +) + +var ServiceUpdateCmd = &engine_consuming_kurtosis_command.EngineConsumingKurtosisCommand{ + CommandStr: command_str_consts.ServiceUpdateCmdStr, + ShortDescription: "Update a service", + LongDescription: "Update a service", + KurtosisBackendContextKey: kurtosisBackendCtxKey, + EngineClientContextKey: engineClientCtxKey, + Flags: []*flags.FlagConfig{ + { + Key: serviceImageFlagKey, + Usage: "image", + Type: flags.FlagType_String, + Default: "", + }, + { + Key: cmdArgsFlagKey, + Usage: "cmd", + // TODO Make this a string list + Type: flags.FlagType_String, + Default: "", + }, + { + Key: entrypointBinaryFlagKey, + Usage: "ENTRYPOINT binary that will be used when running the container, overriding the image's default ENTRYPOINT", + // TODO Make this a string list + Type: flags.FlagType_String, + Default: "", + }, + { + // TODO We currently can't handle commas, so allow users to set the flag multiple times to set multiple envvars + Key: envvarsFlagKey, + Usage: fmt.Sprintf( + "String containing environment variables that will be set when running the container, in "+ + "the form \"KEY1%vVALUE1%vKEY2%vVALUE2\"", + envvarKeyValueDelimiter, + envvarDeclarationsDelimiter, + envvarKeyValueDelimiter, + ), + Type: flags.FlagType_String, + Default: "", + }, + { + Key: portsFlagKey, + Usage: fmt.Sprintf(`String containing declarations of ports that the container will listen on, in the form, %q`+ + ` where %q is a user friendly string for identifying the port, %q is required field, %q is an optional field which must be either`+ + ` '%v' or '%v' and defaults to '%v' if omitted and %q is user defined optional value. %v`, + serviceAddSpecWithPortId, + portIdSpecForHelp, + portNumberSpecForHelp, + transportProtocolSpecForHelp, + strings.ToLower(kurtosis_core_rpc_api_bindings.Port_TCP.String()), + strings.ToLower(kurtosis_core_rpc_api_bindings.Port_UDP.String()), + defaultTransportProtocolStr, + maybeApplicationProtocolSpecForHelp, + generateExampleForPortFlag(), + ), + Type: flags.FlagType_String, + Default: "", + }, + { + Key: filesFlagKey, + Usage: fmt.Sprintf( + "String containing declarations of files paths on the container -> artifact name where the contents of those "+ + "files artifacts should be mounted, in the form \"MOUNTPATH1%vARTIFACTNAME1%vMOUNTPATH2%vARTIFACTNAME2\" where "+ + "ARTIFACTNAME is the name returned by Kurtosis when uploading files to the enclave (e.g. via the '%v %v' command)", + filesArtifactMountpointDelimiter, + filesArtifactMountsDelimiter, + filesArtifactMountpointDelimiter, + command_str_consts.FilesCmdStr, + command_str_consts.FilesUploadCmdStr, + ), + Type: flags.FlagType_String, + Default: "", + }, + }, + Args: []*args.ArgConfig{ + enclave_id_arg.NewEnclaveIdentifierArg( + enclaveIdentifierArgKey, + engineClientCtxKey, + isEnclaveIdArgOptional, + isEnclaveIdArgGreedy, + ), + service_identifier_arg.NewServiceIdentifierArg( + serviceIdentifierArgKey, + enclaveIdentifierArgKey, + isServiceIdentifierArgGreedy, + isServiceIdentifierArgOptional, + ), + }, + RunFunc: run, +} + +func run( + ctx context.Context, + kurtosisBackend backend_interface.KurtosisBackend, + _ kurtosis_engine_rpc_api_bindings.EngineServiceClient, + _ metrics_client.MetricsClient, + flags *flags.ParsedFlags, + args *args.ParsedArgs, +) error { + enclaveIdentifier, err := args.GetNonGreedyArg(enclaveIdentifierArgKey) + if err != nil { + return stacktrace.Propagate(err, "Expected a value for non-greedy enclave identifier arg '%v' but none was found; this is a bug in the Kurtosis CLI!", enclaveIdentifierArgKey) + } + + // TODO: need to enforce this is always service name, and not service uuid or short uuid + serviceName, err := args.GetNonGreedyArg(serviceIdentifierArgKey) + if err != nil { + return stacktrace.Propagate(err, "Expected a value for non-greedy enclave identifier arg '%v' but none was found; this is a bug in the Kurtosis CLI!", serviceIdentifierArgKey) + } + + kurtosisCtx, err := kurtosis_context.NewKurtosisContextFromLocalEngine() + if err != nil { + return stacktrace.Propagate(err, "An error occurred creating Kurtosis Context from local engine") + } + + enclaveCtx, err := kurtosisCtx.GetEnclaveContext(ctx, enclaveIdentifier) + if err != nil { + return stacktrace.Propagate(err, "An error occurred getting an enclave context from enclave info for enclave '%v'", enclaveIdentifier) + } + + var overrideImage string + var overridePorts map[string]*kurtosis_core_rpc_api_bindings.Port + var overrideFilesArtifactsMountpoint map[string]string + var overrideEntrypoint []string + var overrideCmd []string + var overrideEnvVars map[string]string + + imageStr, err := flags.GetString(serviceImageFlagKey) + if err != nil { + return stacktrace.Propagate(err, "An error occurred getting the image using key '%v'", serviceImageFlagKey) + } + overrideImage = imageStr + + cmdStr, err := flags.GetString(cmdArgsFlagKey) + if err != nil { + return stacktrace.Propagate(err, "An error occurred getting the cmd using key '%v'", cmdArgsFlagKey) + } + if cmdStr != "" { + overrideCmd = []string{cmdStr} + } + + entrypointStr, err := flags.GetString(entrypointBinaryFlagKey) + if err != nil { + return stacktrace.Propagate(err, "An error occurred getting the ENTRYPOINT binary using key '%v'", entrypointBinaryFlagKey) + } + if entrypointStr != "" { + overrideEntrypoint = []string{entrypointStr} + } + + envVarsStr, err := flags.GetString(envvarsFlagKey) + if err != nil { + return stacktrace.Propagate(err, "An error occurred getting the env vars string using key '%v'", envvarsFlagKey) + } + if envVarsStr != "" { + overrideEnvVars, err = add.ParseEnvVarsStr(envVarsStr) + if err != nil { + return stacktrace.Propagate(err, "An error occurred parsing env vars string: %v", envVarsStr) + } + } + + portsStr, err := flags.GetString(portsFlagKey) + if err != nil { + return stacktrace.Propagate(err, "An error occurred getting the ports string using key '%v'", portsFlagKey) + } + if portsStr != "" { + overridePorts, err = add.ParsePortsStr(portsStr) + if err != nil { + return stacktrace.Propagate(err, "An error occurred parsing ports string: %v", portsStr) + } + } + + filesArtifactMountsStr, err := flags.GetString(filesFlagKey) + if err != nil { + return stacktrace.Propagate(err, "An error occurred getting the files artifact mounts string using key '%v'", filesFlagKey) + } + if filesArtifactMountsStr != "" { + overrideFilesArtifactsMountpoint, err = add.ParseFilesArtifactMountsStr(filesArtifactMountsStr) + if err != nil { + return stacktrace.Propagate(err, "An error occurred parsing files artifacts mount points string: %v", filesArtifactMountsStr) + } + } + + serviceInspectOutputMap, err := inspect.PrintServiceInspect(ctx, kurtosisBackend, kurtosisCtx, enclaveIdentifier, serviceName, false, "json") + if err != nil { + return stacktrace.Propagate(err, "An error occurred getting") + } + + var currImage string + if img, ok := serviceInspectOutputMap[inspect.ServiceImageTitleName]; ok { + currImage = img.(string) + } + + var currPorts map[string]*kurtosis_core_rpc_api_bindings.Port + if ports, ok := serviceInspectOutputMap[inspect.ServicePortsTitleName]; ok { + currPorts = ports.(map[string]*kurtosis_core_rpc_api_bindings.Port) + } + + var currFilesArtifactsMountpoint map[string]string + if filesArtifactsMountpoints, ok := serviceInspectOutputMap[inspect.ServiceFilesTitleName]; ok { + currFilesArtifactsMountpoint = filesArtifactsMountpoints.(map[string]string) + } + + var currEntrypoint []string + if entrypoint, ok := serviceInspectOutputMap[inspect.ServiceEntrypointArgsTitleName]; ok { + currEntrypoint = entrypoint.([]string) + } + + var currCmd []string + if cmd, ok := serviceInspectOutputMap[inspect.ServiceCmdArgsTitleName]; ok { + currCmd = cmd.([]string) + } + + var currEnvVarsMap map[string]string + if cmd, ok := serviceInspectOutputMap[inspect.ServiceEnvVarsTitleName]; ok { + currEnvVarsMap = cmd.(map[string]string) + } + + var currCpuAllocationMillicpus int + if cpuAlloc, ok := serviceInspectOutputMap[inspect.ServiceMaxCpuAllocationTitleName]; ok { + currCpuAllocationMillicpus = cpuAlloc.(int) + } + var currMemoryMegabytes int + if memoryAlloc, ok := serviceInspectOutputMap[inspect.ServiceMemoryAllocationTitleName]; ok { + currMemoryMegabytes = memoryAlloc.(int) + } + var currMinCpuMillicores int + if minCpuMillis, ok := serviceInspectOutputMap[inspect.ServiceMinCpuAllocationTitleName]; ok { + currMinCpuMillicores = minCpuMillis.(int) + } + var currMinMemoryBytes int + if minMem, ok := serviceInspectOutputMap[inspect.ServiceMinMemoryAllocationTitleName]; ok { + currMinMemoryBytes = minMem.(int) + } + + // merge + var mergedImage string + var mergedPorts map[string]*kurtosis_core_rpc_api_bindings.Port + var mergedFilesArtifactsMountpoint map[string]string + var mergedEntrypoint []string + var mergedCmd []string + var mergedEnvVarsMap map[string]string + + // if override image was provided, use that as the image, otherwise keep curr + if overrideImage != "" { + mergedImage = overrideImage + } else { + mergedImage = currImage + } + + // if override entrypoint was provided, use that as the entrypoint, otherwise keep curr + if len(overrideEntrypoint) > 0 { + mergedEntrypoint = overrideEntrypoint + } else { + mergedEntrypoint = currEntrypoint + } + + // if override cmd was provided, use that as the cmd, otherwise keep curr + if len(overrideCmd) > 0 { + mergedCmd = overrideCmd + } else { + mergedCmd = currCmd + } + + // combine current ports with override ports + for portId, port := range overridePorts { + mergedPorts[portId] = port + } + for portId, port := range currPorts { + mergedPorts[portId] = port + } + + // combine current env vars with override env vars + for key, val := range overrideEnvVars { + mergedEnvVarsMap[key] = val + } + for key, val := range currEnvVarsMap { + mergedEnvVarsMap[key] = val + } + + // combine current files artifacts mount points with override mount points + for key, val := range overrideFilesArtifactsMountpoint { + mergedFilesArtifactsMountpoint[key] = val + } + for key, val := range currFilesArtifactsMountpoint { + mergedFilesArtifactsMountpoint[key] = val + } + + var mergedCpuAllocationMillicpus int + mergedCpuAllocationMillicpus = currCpuAllocationMillicpus + + var mergedMemoryMegabytes int + mergedMemoryMegabytes = currMemoryMegabytes + + var mergedMinCpuMillicores int + mergedMinCpuMillicores = currMinCpuMillicores + + var mergedMinMemoryBytes int + mergedMinMemoryBytes = currMinMemoryBytes + + // call getServiceConfig + serviceConfigStr := services.GetServiceConfigStarlark( + mergedImage, + mergedPorts, + mergedFilesArtifactsMountpoint, // TODO: get in svc inspect + mergedEntrypoint, + mergedCmd, + mergedEnvVarsMap, + service_config.PrivateIpAddressPlaceholderAttr, + mergedCpuAllocationMillicpus, // TODO: get in svc inspect + mergedMemoryMegabytes, // TODO: get in svc inspect + mergedMinCpuMillicores, // TODO: get in svc inspect + mergedMinMemoryBytes) // TODO: get in service inspect + + // call run add service starlark script + addServiceStarlarkStr := add.GetAddServiceStarlarkScript(serviceName, serviceConfigStr) + + err = add.RunAddServiceStarlarkScript(ctx, serviceName, enclaveIdentifier, addServiceStarlarkStr, enclaveCtx) + if err != nil { + return err //already wrapped + } + + return nil +} + +func generateExampleForPortFlag() string { + return fmt.Sprintf( + `Example: "PORTID1%v1234%vudp%vPORTID2%vhttp%v5678%vPORTID3%vhttp%v6000%vudp"`, + portIdSpecDelimiter, + portNumberProtocolDelimiter, + portDeclarationsDelimiter, + portIdSpecDelimiter, + portApplicationProtocolDelimiter, + portDeclarationsDelimiter, + portIdSpecDelimiter, + portApplicationProtocolDelimiter, + portNumberProtocolDelimiter, + ) +} From 5ffef4ad9152aedaaaf4df71362946c04e052723 Mon Sep 17 00:00:00 2001 From: Tedi Mitiku Date: Sun, 23 Mar 2025 18:59:51 -0400 Subject: [PATCH 02/48] add a log --- cli/cli/commands/service/add/add.go | 14 +++++++------- cli/cli/commands/service/inspect/inspect.go | 8 ++++---- cli/cli/commands/service/update/update.go | 13 +++++++++---- 3 files changed, 20 insertions(+), 15 deletions(-) diff --git a/cli/cli/commands/service/add/add.go b/cli/cli/commands/service/add/add.go index b43abb15c9..dafa53c9da 100644 --- a/cli/cli/commands/service/add/add.go +++ b/cli/cli/commands/service/add/add.go @@ -286,7 +286,7 @@ func run( ) } - err = RunAddServiceStarlarkScript(ctx, serviceName, enclaveIdentifier, GetAddServiceStarlarkScript(serviceName, serviceConfigStarlark), enclaveCtx) + _, err = RunAddServiceStarlarkScript(ctx, serviceName, enclaveIdentifier, GetAddServiceStarlarkScript(serviceName, serviceConfigStarlark), enclaveCtx) if err != nil { return err // already wrapped } @@ -385,21 +385,21 @@ func GetAddServiceStarlarkScript(serviceName string, serviceConfigStarlark strin `, serviceName, serviceConfigStarlark) } -func RunAddServiceStarlarkScript(ctx context.Context, serviceName, enclaveIdentifier string, starlarkScript string, enclaveCtx *enclaves.EnclaveContext) error { +func RunAddServiceStarlarkScript(ctx context.Context, serviceName, enclaveIdentifier, starlarkScript string, enclaveCtx *enclaves.EnclaveContext) (*enclaves.StarlarkRunResult, error) { starlarkRunResult, err := enclaveCtx.RunStarlarkScriptBlocking(ctx, starlarkScript, starlark_run_config.NewRunStarlarkConfig()) if err != nil { - return stacktrace.Propagate(err, "An error has occurred when running Starlark to add service") + return nil, stacktrace.Propagate(err, "An error has occurred when running Starlark to add service") } if starlarkRunResult.InterpretationError != nil { - return stacktrace.NewError("An error has occurred when adding service: %s\nThis is a bug in Kurtosis, please report.", starlarkRunResult.InterpretationError) + return nil, stacktrace.NewError("An error has occurred when adding service: %s\nThis is a bug in Kurtosis, please report.", starlarkRunResult.InterpretationError) } if len(starlarkRunResult.ValidationErrors) > 0 { - return stacktrace.NewError("An error occurred when validating add service '%v' to enclave '%v': %s", serviceName, enclaveIdentifier, starlarkRunResult.ValidationErrors) + return nil, stacktrace.NewError("An error occurred when validating add service '%v' to enclave '%v': %s", serviceName, enclaveIdentifier, starlarkRunResult.ValidationErrors) } if starlarkRunResult.ExecutionError != nil { - return stacktrace.NewError("An error occurred adding service '%v' to enclave '%v': %s", serviceName, enclaveIdentifier, starlarkRunResult.ExecutionError) + return nil, stacktrace.NewError("An error occurred adding service '%v' to enclave '%v': %s", serviceName, enclaveIdentifier, starlarkRunResult.ExecutionError) } - return nil + return starlarkRunResult, nil } // GetServiceConfigStarlark TODO(victor.colombo): Extract this to a more reasonable place diff --git a/cli/cli/commands/service/inspect/inspect.go b/cli/cli/commands/service/inspect/inspect.go index a512be1fad..bc45a9cdb0 100644 --- a/cli/cli/commands/service/inspect/inspect.go +++ b/cli/cli/commands/service/inspect/inspect.go @@ -150,7 +150,7 @@ func run( } func PrintServiceInspect(ctx context.Context, kurtosisBackend backend_interface.KurtosisBackend, kurtosisCtx *kurtosis_context.KurtosisContext, enclaveIdentifier string, serviceIdentifier string, showFullUuid bool, outputFormat string) (map[string]interface{}, error) { - var jsonMap map[string]interface{} + jsonMap := map[string]interface{}{} enclaveInfo, err := kurtosisCtx.GetEnclave(ctx, enclaveIdentifier) if err != nil { return jsonMap, stacktrace.Propagate(err, "An error occurred getting the enclave for identifier '%v'", enclaveIdentifier) @@ -183,9 +183,9 @@ func PrintServiceInspect(ctx context.Context, kurtosisBackend backend_interface. jsonMap[ServiceEntrypointArgsTitleName] = userService.GetContainer().GetEntrypointArgs() jsonMap[ServiceEnvVarsTitleName] = userService.GetContainer().GetEnvVars() jsonMap[ServicePortsTitleName] = userService.GetPrivatePorts() - jsonMap["Files"] = "" - // TODO: add support for files - // How would we get files information? + + // TODO: add support for files artifacts entrypoint + var marshaled []byte var err error switch outputFormat { diff --git a/cli/cli/commands/service/update/update.go b/cli/cli/commands/service/update/update.go index cf08201e40..f0f195b4e6 100644 --- a/cli/cli/commands/service/update/update.go +++ b/cli/cli/commands/service/update/update.go @@ -15,10 +15,12 @@ import ( "github.com/kurtosis-tech/kurtosis/cli/cli/command_str_consts" "github.com/kurtosis-tech/kurtosis/cli/cli/commands/service/add" "github.com/kurtosis-tech/kurtosis/cli/cli/commands/service/inspect" + "github.com/kurtosis-tech/kurtosis/cli/cli/out" "github.com/kurtosis-tech/kurtosis/container-engine-lib/lib/backend_interface" "github.com/kurtosis-tech/kurtosis/core/server/api_container/server/startosis_engine/kurtosis_types/service_config" "github.com/kurtosis-tech/kurtosis/metrics-library/golang/lib/metrics_client" "github.com/kurtosis-tech/stacktrace" + "github.com/sirupsen/logrus" "strings" ) @@ -312,11 +314,8 @@ func run( // merge var mergedImage string - var mergedPorts map[string]*kurtosis_core_rpc_api_bindings.Port - var mergedFilesArtifactsMountpoint map[string]string var mergedEntrypoint []string var mergedCmd []string - var mergedEnvVarsMap map[string]string // if override image was provided, use that as the image, otherwise keep curr if overrideImage != "" { @@ -340,6 +339,7 @@ func run( } // combine current ports with override ports + mergedPorts := map[string]*kurtosis_core_rpc_api_bindings.Port{} for portId, port := range overridePorts { mergedPorts[portId] = port } @@ -348,6 +348,7 @@ func run( } // combine current env vars with override env vars + mergedEnvVarsMap := map[string]string{} for key, val := range overrideEnvVars { mergedEnvVarsMap[key] = val } @@ -356,6 +357,7 @@ func run( } // combine current files artifacts mount points with override mount points + mergedFilesArtifactsMountpoint := map[string]string{} for key, val := range overrideFilesArtifactsMountpoint { mergedFilesArtifactsMountpoint[key] = val } @@ -392,11 +394,14 @@ func run( // call run add service starlark script addServiceStarlarkStr := add.GetAddServiceStarlarkScript(serviceName, serviceConfigStr) - err = add.RunAddServiceStarlarkScript(ctx, serviceName, enclaveIdentifier, addServiceStarlarkStr, enclaveCtx) + logrus.Info("Running update service starlark for service '%v' in enclave '%v'...", serviceName, enclaveIdentifier) + starlarkRunResult, err := add.RunAddServiceStarlarkScript(ctx, serviceName, enclaveIdentifier, addServiceStarlarkStr, enclaveCtx) if err != nil { return err //already wrapped } + out.PrintOutLn(string(starlarkRunResult.RunOutput)) + return nil } From c2417cee7b95736252402d371ecaef5c748155cc Mon Sep 17 00:00:00 2001 From: Tedi Mitiku Date: Sun, 23 Mar 2025 19:01:46 -0400 Subject: [PATCH 03/48] dont print output for update --- cli/cli/commands/service/inspect/inspect.go | 8 +++++--- cli/cli/commands/service/update/update.go | 2 +- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/cli/cli/commands/service/inspect/inspect.go b/cli/cli/commands/service/inspect/inspect.go index bc45a9cdb0..ec4f577297 100644 --- a/cli/cli/commands/service/inspect/inspect.go +++ b/cli/cli/commands/service/inspect/inspect.go @@ -142,14 +142,14 @@ func run( return stacktrace.Propagate(err, "An error occurred creating Kurtosis Context from local engine") } - if _, err = PrintServiceInspect(ctx, kurtosisBackend, kurtosisCtx, enclaveIdentifier, serviceIdentifier, showFullUuid, outputFormat); err != nil { + if _, err = PrintServiceInspect(ctx, kurtosisBackend, kurtosisCtx, enclaveIdentifier, serviceIdentifier, showFullUuid, outputFormat, true); err != nil { // this is already wrapped up return err } return nil } -func PrintServiceInspect(ctx context.Context, kurtosisBackend backend_interface.KurtosisBackend, kurtosisCtx *kurtosis_context.KurtosisContext, enclaveIdentifier string, serviceIdentifier string, showFullUuid bool, outputFormat string) (map[string]interface{}, error) { +func PrintServiceInspect(ctx context.Context, kurtosisBackend backend_interface.KurtosisBackend, kurtosisCtx *kurtosis_context.KurtosisContext, enclaveIdentifier string, serviceIdentifier string, showFullUuid bool, outputFormat string, shouldPrintOutputFormat bool) (map[string]interface{}, error) { jsonMap := map[string]interface{}{} enclaveInfo, err := kurtosisCtx.GetEnclave(ctx, enclaveIdentifier) if err != nil { @@ -197,7 +197,9 @@ func PrintServiceInspect(ctx context.Context, kurtosisBackend backend_interface. if err != nil { return jsonMap, stacktrace.Propagate(err, "Failed to marshal service info to %s", outputFormat) } - out.PrintOutLn(string(marshaled)) + if shouldPrintOutputFormat { + out.PrintOutLn(string(marshaled)) + } return jsonMap, nil } diff --git a/cli/cli/commands/service/update/update.go b/cli/cli/commands/service/update/update.go index f0f195b4e6..6504e39c8b 100644 --- a/cli/cli/commands/service/update/update.go +++ b/cli/cli/commands/service/update/update.go @@ -260,7 +260,7 @@ func run( } } - serviceInspectOutputMap, err := inspect.PrintServiceInspect(ctx, kurtosisBackend, kurtosisCtx, enclaveIdentifier, serviceName, false, "json") + serviceInspectOutputMap, err := inspect.PrintServiceInspect(ctx, kurtosisBackend, kurtosisCtx, enclaveIdentifier, serviceName, false, "json", false) if err != nil { return stacktrace.Propagate(err, "An error occurred getting") } From 388a179ea7b1e9112e2c19a715580256cb14924c Mon Sep 17 00:00:00 2001 From: Tedi Mitiku Date: Tue, 25 Mar 2025 11:39:17 -0400 Subject: [PATCH 04/48] checkpoint --- .../api_container_service.pb.go | 1531 +++++----- .../binding_constructors.go | 10 + api/protobuf/core/api_container_service.proto | 11 + api/rust/src/api_container_api.rs | 14 + .../api_container_service_pb.d.ts | 20 + .../api_container_service_pb.js | 155 +- .../connect/api_container_service_pb.d.ts | 27 + .../connect/api_container_service_pb.js | 5 + .../src/engine/rest_api_bindings/types.d.ts | 2656 +++++++---------- cli/cli/commands/service/inspect/inspect.go | 1 + cli/cli/commands/service/update/update.go | 2 +- core/server/api_container/main.go | 34 +- .../server/api_container_service.go | 38 +- .../services_files_artifacts/repository.go | 89 + .../repository_test.go | 1 + .../services_files_artifacts.go | 48 + .../services_files_artifacts_test.go | 1 + 17 files changed, 2289 insertions(+), 2354 deletions(-) create mode 100644 core/server/api_container/server/service_network/services_files_artifacts/repository.go create mode 100644 core/server/api_container/server/service_network/services_files_artifacts/repository_test.go create mode 100644 core/server/api_container/server/service_network/services_files_artifacts/services_files_artifacts.go create mode 100644 core/server/api_container/server/service_network/services_files_artifacts/services_files_artifacts_test.go diff --git a/api/golang/core/kurtosis_core_rpc_api_bindings/api_container_service.pb.go b/api/golang/core/kurtosis_core_rpc_api_bindings/api_container_service.pb.go index 06d347f927..122193a8df 100644 --- a/api/golang/core/kurtosis_core_rpc_api_bindings/api_container_service.pb.go +++ b/api/golang/core/kurtosis_core_rpc_api_bindings/api_container_service.pb.go @@ -556,6 +556,12 @@ type ServiceInfo struct { ServiceStatus ServiceStatus `protobuf:"varint,8,opt,name=service_status,json=serviceStatus,proto3,enum=api_container_api.ServiceStatus" json:"service_status,omitempty"` // Docker container or Kubernetes pod container Container *Container `protobuf:"bytes,9,opt,name=container,proto3" json:"container,omitempty"` + // Mapping of directory paths on service to names of files artifacts that are mounted to that directory + ServiceDirPathsToFilesArtifactsIdentifiers map[string]string `protobuf:"bytes,10,rep,name=service_dir_paths_to_files_artifacts_identifiers,json=serviceDirPathsToFilesArtifactsIdentifiers,proto3" json:"service_dir_paths_to_files_artifacts_identifiers,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + MaxMillicpus uint32 `protobuf:"varint,11,opt,name=max_millicpus,json=maxMillicpus,proto3" json:"max_millicpus,omitempty"` + MinMillicpus uint32 `protobuf:"varint,12,opt,name=min_millicpus,json=minMillicpus,proto3" json:"min_millicpus,omitempty"` + MaxMemoryMegabytes uint32 `protobuf:"varint,13,opt,name=max_memory_megabytes,json=maxMemoryMegabytes,proto3" json:"max_memory_megabytes,omitempty"` + MinMemoryMegabytes uint32 `protobuf:"varint,14,opt,name=min_memory_megabytes,json=minMemoryMegabytes,proto3" json:"min_memory_megabytes,omitempty"` } func (x *ServiceInfo) Reset() { @@ -653,6 +659,41 @@ func (x *ServiceInfo) GetContainer() *Container { return nil } +func (x *ServiceInfo) GetServiceDirPathsToFilesArtifactsIdentifiers() map[string]string { + if x != nil { + return x.ServiceDirPathsToFilesArtifactsIdentifiers + } + return nil +} + +func (x *ServiceInfo) GetMaxMillicpus() uint32 { + if x != nil { + return x.MaxMillicpus + } + return 0 +} + +func (x *ServiceInfo) GetMinMillicpus() uint32 { + if x != nil { + return x.MinMillicpus + } + return 0 +} + +func (x *ServiceInfo) GetMaxMemoryMegabytes() uint32 { + if x != nil { + return x.MaxMemoryMegabytes + } + return 0 +} + +func (x *ServiceInfo) GetMinMemoryMegabytes() uint32 { + if x != nil { + return x.MinMemoryMegabytes + } + return 0 +} + type RunStarlarkScriptArgs struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -3572,7 +3613,7 @@ var file_api_container_service_proto_rawDesc = []byte{ 0x38, 0x01, 0x22, 0x2f, 0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x0b, 0x0a, 0x07, 0x53, 0x54, 0x4f, 0x50, 0x50, 0x45, 0x44, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x52, 0x55, 0x4e, 0x4e, 0x49, 0x4e, 0x47, 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, - 0x4e, 0x10, 0x02, 0x22, 0xbc, 0x05, 0x0a, 0x0b, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, + 0x4e, 0x10, 0x02, 0x22, 0x80, 0x09, 0x0a, 0x0b, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x21, 0x0a, 0x0c, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x75, 0x75, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x55, 0x75, 0x69, 0x64, 0x12, 0x26, 0x0a, 0x0f, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, @@ -3604,683 +3645,711 @@ var file_api_container_service_proto_rawDesc = []byte{ 0x0a, 0x09, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x52, - 0x09, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x1a, 0x58, 0x0a, 0x11, 0x50, 0x72, - 0x69, 0x76, 0x61, 0x74, 0x65, 0x50, 0x6f, 0x72, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, - 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, - 0x79, 0x12, 0x2d, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x17, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, - 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x50, 0x6f, 0x72, 0x74, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x5c, 0x0a, 0x15, 0x4d, 0x61, 0x79, 0x62, 0x65, 0x50, 0x75, 0x62, - 0x6c, 0x69, 0x63, 0x50, 0x6f, 0x72, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, - 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, - 0x2d, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, + 0x09, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x12, 0xb4, 0x01, 0x0a, 0x30, 0x73, + 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x64, 0x69, 0x72, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x73, + 0x5f, 0x74, 0x6f, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x5f, 0x61, 0x72, 0x74, 0x69, 0x66, 0x61, + 0x63, 0x74, 0x73, 0x5f, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x73, 0x18, + 0x0a, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x4e, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, + 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, + 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x44, 0x69, 0x72, + 0x50, 0x61, 0x74, 0x68, 0x73, 0x54, 0x6f, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x72, 0x74, 0x69, + 0x66, 0x61, 0x63, 0x74, 0x73, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x73, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x2a, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x44, 0x69, + 0x72, 0x50, 0x61, 0x74, 0x68, 0x73, 0x54, 0x6f, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x72, 0x74, + 0x69, 0x66, 0x61, 0x63, 0x74, 0x73, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, + 0x73, 0x12, 0x23, 0x0a, 0x0d, 0x6d, 0x61, 0x78, 0x5f, 0x6d, 0x69, 0x6c, 0x6c, 0x69, 0x63, 0x70, + 0x75, 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0c, 0x6d, 0x61, 0x78, 0x4d, 0x69, 0x6c, + 0x6c, 0x69, 0x63, 0x70, 0x75, 0x73, 0x12, 0x23, 0x0a, 0x0d, 0x6d, 0x69, 0x6e, 0x5f, 0x6d, 0x69, + 0x6c, 0x6c, 0x69, 0x63, 0x70, 0x75, 0x73, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0c, 0x6d, + 0x69, 0x6e, 0x4d, 0x69, 0x6c, 0x6c, 0x69, 0x63, 0x70, 0x75, 0x73, 0x12, 0x30, 0x0a, 0x14, 0x6d, + 0x61, 0x78, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x6d, 0x65, 0x67, 0x61, 0x62, 0x79, + 0x74, 0x65, 0x73, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x12, 0x6d, 0x61, 0x78, 0x4d, 0x65, + 0x6d, 0x6f, 0x72, 0x79, 0x4d, 0x65, 0x67, 0x61, 0x62, 0x79, 0x74, 0x65, 0x73, 0x12, 0x30, 0x0a, + 0x14, 0x6d, 0x69, 0x6e, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x6d, 0x65, 0x67, 0x61, + 0x62, 0x79, 0x74, 0x65, 0x73, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x12, 0x6d, 0x69, 0x6e, + 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x4d, 0x65, 0x67, 0x61, 0x62, 0x79, 0x74, 0x65, 0x73, 0x1a, + 0x58, 0x0a, 0x11, 0x50, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x50, 0x6f, 0x72, 0x74, 0x73, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2d, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, + 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x50, 0x6f, 0x72, 0x74, 0x52, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x5c, 0x0a, 0x15, 0x4d, 0x61, 0x79, + 0x62, 0x65, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x50, 0x6f, 0x72, 0x74, 0x73, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2d, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, + 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x50, 0x6f, 0x72, 0x74, 0x52, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x5d, 0x0a, 0x2f, 0x53, 0x65, 0x72, 0x76, 0x69, + 0x63, 0x65, 0x44, 0x69, 0x72, 0x50, 0x61, 0x74, 0x68, 0x73, 0x54, 0x6f, 0x46, 0x69, 0x6c, 0x65, + 0x73, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x73, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, + 0x66, 0x69, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, + 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xd0, 0x05, 0x0a, 0x15, 0x52, 0x75, 0x6e, 0x53, 0x74, + 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, 0x41, 0x72, 0x67, 0x73, + 0x12, 0x2b, 0x0a, 0x11, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x5f, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x73, 0x65, 0x72, + 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, 0x12, 0x30, 0x0a, + 0x11, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x5f, 0x70, 0x61, 0x72, 0x61, + 0x6d, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x10, 0x73, 0x65, 0x72, 0x69, + 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x88, 0x01, 0x01, 0x12, + 0x1c, 0x0a, 0x07, 0x64, 0x72, 0x79, 0x5f, 0x72, 0x75, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, + 0x48, 0x01, 0x52, 0x06, 0x64, 0x72, 0x79, 0x52, 0x75, 0x6e, 0x88, 0x01, 0x01, 0x12, 0x25, 0x0a, + 0x0b, 0x70, 0x61, 0x72, 0x61, 0x6c, 0x6c, 0x65, 0x6c, 0x69, 0x73, 0x6d, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x05, 0x48, 0x02, 0x52, 0x0b, 0x70, 0x61, 0x72, 0x61, 0x6c, 0x6c, 0x65, 0x6c, 0x69, 0x73, + 0x6d, 0x88, 0x01, 0x01, 0x12, 0x31, 0x0a, 0x12, 0x6d, 0x61, 0x69, 0x6e, 0x5f, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, + 0x48, 0x03, 0x52, 0x10, 0x6d, 0x61, 0x69, 0x6e, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x4e, 0x61, 0x6d, 0x65, 0x88, 0x01, 0x01, 0x12, 0x5b, 0x0a, 0x15, 0x65, 0x78, 0x70, 0x65, 0x72, + 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x5f, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, + 0x18, 0x06, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x26, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, + 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x4b, 0x75, 0x72, 0x74, 0x6f, + 0x73, 0x69, 0x73, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x46, 0x6c, 0x61, 0x67, 0x52, 0x14, + 0x65, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x46, 0x65, 0x61, 0x74, + 0x75, 0x72, 0x65, 0x73, 0x12, 0x2f, 0x0a, 0x11, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x5f, 0x69, 0x6e, + 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x48, + 0x04, 0x52, 0x0f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, + 0x49, 0x64, 0x88, 0x01, 0x01, 0x12, 0x27, 0x0a, 0x0d, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x5f, 0x75, + 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x48, 0x05, 0x52, 0x0b, + 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x55, 0x73, 0x65, 0x72, 0x49, 0x64, 0x88, 0x01, 0x01, 0x12, 0x59, + 0x0a, 0x13, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x5f, 0x64, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, + 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x24, 0x2e, 0x61, 0x70, + 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, + 0x49, 0x6d, 0x61, 0x67, 0x65, 0x44, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x4d, 0x6f, 0x64, + 0x65, 0x48, 0x06, 0x52, 0x11, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x44, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, + 0x61, 0x64, 0x4d, 0x6f, 0x64, 0x65, 0x88, 0x01, 0x01, 0x12, 0x2f, 0x0a, 0x11, 0x6e, 0x6f, 0x6e, + 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x69, 0x6e, 0x67, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x0a, + 0x20, 0x01, 0x28, 0x08, 0x48, 0x07, 0x52, 0x0f, 0x6e, 0x6f, 0x6e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, + 0x69, 0x6e, 0x67, 0x4d, 0x6f, 0x64, 0x65, 0x88, 0x01, 0x01, 0x42, 0x14, 0x0a, 0x12, 0x5f, 0x73, + 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, + 0x42, 0x0a, 0x0a, 0x08, 0x5f, 0x64, 0x72, 0x79, 0x5f, 0x72, 0x75, 0x6e, 0x42, 0x0e, 0x0a, 0x0c, + 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6c, 0x6c, 0x65, 0x6c, 0x69, 0x73, 0x6d, 0x42, 0x15, 0x0a, 0x13, + 0x5f, 0x6d, 0x61, 0x69, 0x6e, 0x5f, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, + 0x61, 0x6d, 0x65, 0x42, 0x14, 0x0a, 0x12, 0x5f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x5f, 0x69, 0x6e, + 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x63, 0x6c, + 0x6f, 0x75, 0x64, 0x5f, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x42, 0x16, 0x0a, 0x14, 0x5f, + 0x69, 0x6d, 0x61, 0x67, 0x65, 0x5f, 0x64, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x6d, + 0x6f, 0x64, 0x65, 0x42, 0x14, 0x0a, 0x12, 0x5f, 0x6e, 0x6f, 0x6e, 0x5f, 0x62, 0x6c, 0x6f, 0x63, + 0x6b, 0x69, 0x6e, 0x67, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x22, 0xf4, 0x07, 0x0a, 0x16, 0x52, 0x75, + 0x6e, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, + 0x41, 0x72, 0x67, 0x73, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x5f, + 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, + 0x65, 0x49, 0x64, 0x12, 0x16, 0x0a, 0x05, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x0c, 0x48, 0x00, 0x52, 0x05, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x12, 0x18, 0x0a, 0x06, 0x72, + 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x48, 0x00, 0x52, 0x06, 0x72, + 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x12, 0x30, 0x0a, 0x11, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, + 0x7a, 0x65, 0x64, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, + 0x48, 0x01, 0x52, 0x10, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x50, 0x61, + 0x72, 0x61, 0x6d, 0x73, 0x88, 0x01, 0x01, 0x12, 0x1c, 0x0a, 0x07, 0x64, 0x72, 0x79, 0x5f, 0x72, + 0x75, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x48, 0x02, 0x52, 0x06, 0x64, 0x72, 0x79, 0x52, + 0x75, 0x6e, 0x88, 0x01, 0x01, 0x12, 0x25, 0x0a, 0x0b, 0x70, 0x61, 0x72, 0x61, 0x6c, 0x6c, 0x65, + 0x6c, 0x69, 0x73, 0x6d, 0x18, 0x07, 0x20, 0x01, 0x28, 0x05, 0x48, 0x03, 0x52, 0x0b, 0x70, 0x61, + 0x72, 0x61, 0x6c, 0x6c, 0x65, 0x6c, 0x69, 0x73, 0x6d, 0x88, 0x01, 0x01, 0x12, 0x28, 0x0a, 0x0d, + 0x63, 0x6c, 0x6f, 0x6e, 0x65, 0x5f, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x18, 0x08, 0x20, + 0x01, 0x28, 0x08, 0x48, 0x04, 0x52, 0x0c, 0x63, 0x6c, 0x6f, 0x6e, 0x65, 0x50, 0x61, 0x63, 0x6b, + 0x61, 0x67, 0x65, 0x88, 0x01, 0x01, 0x12, 0x3f, 0x0a, 0x1a, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, + 0x76, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x5f, 0x74, 0x6f, 0x5f, 0x6d, 0x61, 0x69, 0x6e, 0x5f, + 0x66, 0x69, 0x6c, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x48, 0x05, 0x52, 0x16, 0x72, 0x65, + 0x6c, 0x61, 0x74, 0x69, 0x76, 0x65, 0x50, 0x61, 0x74, 0x68, 0x54, 0x6f, 0x4d, 0x61, 0x69, 0x6e, + 0x46, 0x69, 0x6c, 0x65, 0x88, 0x01, 0x01, 0x12, 0x31, 0x0a, 0x12, 0x6d, 0x61, 0x69, 0x6e, 0x5f, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x0a, 0x20, + 0x01, 0x28, 0x09, 0x48, 0x06, 0x52, 0x10, 0x6d, 0x61, 0x69, 0x6e, 0x46, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x88, 0x01, 0x01, 0x12, 0x5b, 0x0a, 0x15, 0x65, 0x78, + 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x5f, 0x66, 0x65, 0x61, 0x74, 0x75, + 0x72, 0x65, 0x73, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x26, 0x2e, 0x61, 0x70, 0x69, 0x5f, + 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x4b, 0x75, + 0x72, 0x74, 0x6f, 0x73, 0x69, 0x73, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x46, 0x6c, 0x61, + 0x67, 0x52, 0x14, 0x65, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x46, + 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x12, 0x2f, 0x0a, 0x11, 0x63, 0x6c, 0x6f, 0x75, 0x64, + 0x5f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x0c, 0x20, 0x01, + 0x28, 0x09, 0x48, 0x07, 0x52, 0x0f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x49, 0x6e, 0x73, 0x74, 0x61, + 0x6e, 0x63, 0x65, 0x49, 0x64, 0x88, 0x01, 0x01, 0x12, 0x27, 0x0a, 0x0d, 0x63, 0x6c, 0x6f, 0x75, + 0x64, 0x5f, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x48, + 0x08, 0x52, 0x0b, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x55, 0x73, 0x65, 0x72, 0x49, 0x64, 0x88, 0x01, + 0x01, 0x12, 0x59, 0x0a, 0x13, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x5f, 0x64, 0x6f, 0x77, 0x6e, 0x6c, + 0x6f, 0x61, 0x64, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x24, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, - 0x70, 0x69, 0x2e, 0x50, 0x6f, 0x72, 0x74, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, - 0x38, 0x01, 0x22, 0xd0, 0x05, 0x0a, 0x15, 0x52, 0x75, 0x6e, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, - 0x72, 0x6b, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, 0x41, 0x72, 0x67, 0x73, 0x12, 0x2b, 0x0a, 0x11, - 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x5f, 0x73, 0x63, 0x72, 0x69, 0x70, - 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, - 0x7a, 0x65, 0x64, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, 0x12, 0x30, 0x0a, 0x11, 0x73, 0x65, 0x72, - 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x10, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, - 0x65, 0x64, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x88, 0x01, 0x01, 0x12, 0x1c, 0x0a, 0x07, 0x64, - 0x72, 0x79, 0x5f, 0x72, 0x75, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x48, 0x01, 0x52, 0x06, - 0x64, 0x72, 0x79, 0x52, 0x75, 0x6e, 0x88, 0x01, 0x01, 0x12, 0x25, 0x0a, 0x0b, 0x70, 0x61, 0x72, - 0x61, 0x6c, 0x6c, 0x65, 0x6c, 0x69, 0x73, 0x6d, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x48, 0x02, - 0x52, 0x0b, 0x70, 0x61, 0x72, 0x61, 0x6c, 0x6c, 0x65, 0x6c, 0x69, 0x73, 0x6d, 0x88, 0x01, 0x01, - 0x12, 0x31, 0x0a, 0x12, 0x6d, 0x61, 0x69, 0x6e, 0x5f, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x48, 0x03, 0x52, 0x10, - 0x6d, 0x61, 0x69, 0x6e, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, - 0x88, 0x01, 0x01, 0x12, 0x5b, 0x0a, 0x15, 0x65, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, - 0x74, 0x61, 0x6c, 0x5f, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x18, 0x06, 0x20, 0x03, - 0x28, 0x0e, 0x32, 0x26, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, - 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x4b, 0x75, 0x72, 0x74, 0x6f, 0x73, 0x69, 0x73, 0x46, - 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x46, 0x6c, 0x61, 0x67, 0x52, 0x14, 0x65, 0x78, 0x70, 0x65, - 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, - 0x12, 0x2f, 0x0a, 0x11, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x5f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, - 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x48, 0x04, 0x52, 0x0f, 0x63, - 0x6c, 0x6f, 0x75, 0x64, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x64, 0x88, 0x01, - 0x01, 0x12, 0x27, 0x0a, 0x0d, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x5f, 0x75, 0x73, 0x65, 0x72, 0x5f, - 0x69, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x48, 0x05, 0x52, 0x0b, 0x63, 0x6c, 0x6f, 0x75, - 0x64, 0x55, 0x73, 0x65, 0x72, 0x49, 0x64, 0x88, 0x01, 0x01, 0x12, 0x59, 0x0a, 0x13, 0x69, 0x6d, - 0x61, 0x67, 0x65, 0x5f, 0x64, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x6d, 0x6f, 0x64, - 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x24, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, - 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x49, 0x6d, 0x61, 0x67, - 0x65, 0x44, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x4d, 0x6f, 0x64, 0x65, 0x48, 0x06, 0x52, - 0x11, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x44, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x4d, 0x6f, - 0x64, 0x65, 0x88, 0x01, 0x01, 0x12, 0x2f, 0x0a, 0x11, 0x6e, 0x6f, 0x6e, 0x5f, 0x62, 0x6c, 0x6f, - 0x63, 0x6b, 0x69, 0x6e, 0x67, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x08, - 0x48, 0x07, 0x52, 0x0f, 0x6e, 0x6f, 0x6e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x69, 0x6e, 0x67, 0x4d, - 0x6f, 0x64, 0x65, 0x88, 0x01, 0x01, 0x42, 0x14, 0x0a, 0x12, 0x5f, 0x73, 0x65, 0x72, 0x69, 0x61, - 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x42, 0x0a, 0x0a, 0x08, - 0x5f, 0x64, 0x72, 0x79, 0x5f, 0x72, 0x75, 0x6e, 0x42, 0x0e, 0x0a, 0x0c, 0x5f, 0x70, 0x61, 0x72, - 0x61, 0x6c, 0x6c, 0x65, 0x6c, 0x69, 0x73, 0x6d, 0x42, 0x15, 0x0a, 0x13, 0x5f, 0x6d, 0x61, 0x69, - 0x6e, 0x5f, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x42, - 0x14, 0x0a, 0x12, 0x5f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x5f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, - 0x63, 0x65, 0x5f, 0x69, 0x64, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x5f, - 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x42, 0x16, 0x0a, 0x14, 0x5f, 0x69, 0x6d, 0x61, 0x67, - 0x65, 0x5f, 0x64, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x42, - 0x14, 0x0a, 0x12, 0x5f, 0x6e, 0x6f, 0x6e, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x69, 0x6e, 0x67, - 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x22, 0xf4, 0x07, 0x0a, 0x16, 0x52, 0x75, 0x6e, 0x53, 0x74, 0x61, - 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x41, 0x72, 0x67, 0x73, - 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x49, 0x64, 0x12, - 0x16, 0x0a, 0x05, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x48, 0x00, - 0x52, 0x05, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x12, 0x18, 0x0a, 0x06, 0x72, 0x65, 0x6d, 0x6f, 0x74, - 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x48, 0x00, 0x52, 0x06, 0x72, 0x65, 0x6d, 0x6f, 0x74, - 0x65, 0x12, 0x30, 0x0a, 0x11, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x5f, - 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x10, - 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, - 0x88, 0x01, 0x01, 0x12, 0x1c, 0x0a, 0x07, 0x64, 0x72, 0x79, 0x5f, 0x72, 0x75, 0x6e, 0x18, 0x06, - 0x20, 0x01, 0x28, 0x08, 0x48, 0x02, 0x52, 0x06, 0x64, 0x72, 0x79, 0x52, 0x75, 0x6e, 0x88, 0x01, - 0x01, 0x12, 0x25, 0x0a, 0x0b, 0x70, 0x61, 0x72, 0x61, 0x6c, 0x6c, 0x65, 0x6c, 0x69, 0x73, 0x6d, - 0x18, 0x07, 0x20, 0x01, 0x28, 0x05, 0x48, 0x03, 0x52, 0x0b, 0x70, 0x61, 0x72, 0x61, 0x6c, 0x6c, - 0x65, 0x6c, 0x69, 0x73, 0x6d, 0x88, 0x01, 0x01, 0x12, 0x28, 0x0a, 0x0d, 0x63, 0x6c, 0x6f, 0x6e, - 0x65, 0x5f, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x48, - 0x04, 0x52, 0x0c, 0x63, 0x6c, 0x6f, 0x6e, 0x65, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x88, - 0x01, 0x01, 0x12, 0x3f, 0x0a, 0x1a, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x70, - 0x61, 0x74, 0x68, 0x5f, 0x74, 0x6f, 0x5f, 0x6d, 0x61, 0x69, 0x6e, 0x5f, 0x66, 0x69, 0x6c, 0x65, - 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x48, 0x05, 0x52, 0x16, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, - 0x76, 0x65, 0x50, 0x61, 0x74, 0x68, 0x54, 0x6f, 0x4d, 0x61, 0x69, 0x6e, 0x46, 0x69, 0x6c, 0x65, - 0x88, 0x01, 0x01, 0x12, 0x31, 0x0a, 0x12, 0x6d, 0x61, 0x69, 0x6e, 0x5f, 0x66, 0x75, 0x6e, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x48, - 0x06, 0x52, 0x10, 0x6d, 0x61, 0x69, 0x6e, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, - 0x61, 0x6d, 0x65, 0x88, 0x01, 0x01, 0x12, 0x5b, 0x0a, 0x15, 0x65, 0x78, 0x70, 0x65, 0x72, 0x69, - 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x5f, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x18, - 0x0b, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x26, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, - 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x4b, 0x75, 0x72, 0x74, 0x6f, 0x73, - 0x69, 0x73, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x46, 0x6c, 0x61, 0x67, 0x52, 0x14, 0x65, - 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x46, 0x65, 0x61, 0x74, 0x75, - 0x72, 0x65, 0x73, 0x12, 0x2f, 0x0a, 0x11, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x5f, 0x69, 0x6e, 0x73, - 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x48, 0x07, - 0x52, 0x0f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, - 0x64, 0x88, 0x01, 0x01, 0x12, 0x27, 0x0a, 0x0d, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x5f, 0x75, 0x73, - 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x48, 0x08, 0x52, 0x0b, 0x63, - 0x6c, 0x6f, 0x75, 0x64, 0x55, 0x73, 0x65, 0x72, 0x49, 0x64, 0x88, 0x01, 0x01, 0x12, 0x59, 0x0a, - 0x13, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x5f, 0x64, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x5f, - 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x24, 0x2e, 0x61, 0x70, 0x69, - 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x49, - 0x6d, 0x61, 0x67, 0x65, 0x44, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x4d, 0x6f, 0x64, 0x65, - 0x48, 0x09, 0x52, 0x11, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x44, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, - 0x64, 0x4d, 0x6f, 0x64, 0x65, 0x88, 0x01, 0x01, 0x12, 0x2f, 0x0a, 0x11, 0x6e, 0x6f, 0x6e, 0x5f, - 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x69, 0x6e, 0x67, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x0f, 0x20, - 0x01, 0x28, 0x08, 0x48, 0x0a, 0x52, 0x0f, 0x6e, 0x6f, 0x6e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x69, - 0x6e, 0x67, 0x4d, 0x6f, 0x64, 0x65, 0x88, 0x01, 0x01, 0x12, 0x2f, 0x0a, 0x11, 0x67, 0x69, 0x74, - 0x68, 0x75, 0x62, 0x5f, 0x61, 0x75, 0x74, 0x68, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x10, - 0x20, 0x01, 0x28, 0x09, 0x48, 0x0b, 0x52, 0x0f, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x41, 0x75, - 0x74, 0x68, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x88, 0x01, 0x01, 0x42, 0x1a, 0x0a, 0x18, 0x73, 0x74, - 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x5f, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x5f, 0x63, - 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x42, 0x14, 0x0a, 0x12, 0x5f, 0x73, 0x65, 0x72, 0x69, 0x61, - 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x42, 0x0a, 0x0a, 0x08, - 0x5f, 0x64, 0x72, 0x79, 0x5f, 0x72, 0x75, 0x6e, 0x42, 0x0e, 0x0a, 0x0c, 0x5f, 0x70, 0x61, 0x72, - 0x61, 0x6c, 0x6c, 0x65, 0x6c, 0x69, 0x73, 0x6d, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x63, 0x6c, 0x6f, - 0x6e, 0x65, 0x5f, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x42, 0x1d, 0x0a, 0x1b, 0x5f, 0x72, - 0x65, 0x6c, 0x61, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x5f, 0x74, 0x6f, 0x5f, - 0x6d, 0x61, 0x69, 0x6e, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x42, 0x15, 0x0a, 0x13, 0x5f, 0x6d, 0x61, - 0x69, 0x6e, 0x5f, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, - 0x42, 0x14, 0x0a, 0x12, 0x5f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x5f, 0x69, 0x6e, 0x73, 0x74, 0x61, - 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x63, 0x6c, 0x6f, 0x75, 0x64, - 0x5f, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x42, 0x16, 0x0a, 0x14, 0x5f, 0x69, 0x6d, 0x61, - 0x67, 0x65, 0x5f, 0x64, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x6d, 0x6f, 0x64, 0x65, - 0x42, 0x14, 0x0a, 0x12, 0x5f, 0x6e, 0x6f, 0x6e, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x69, 0x6e, - 0x67, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x42, 0x14, 0x0a, 0x12, 0x5f, 0x67, 0x69, 0x74, 0x68, 0x75, - 0x62, 0x5f, 0x61, 0x75, 0x74, 0x68, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0xb6, 0x04, 0x0a, - 0x17, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x52, 0x75, 0x6e, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x4c, 0x69, 0x6e, 0x65, 0x12, 0x4a, 0x0a, 0x0b, 0x69, 0x6e, 0x73, 0x74, - 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, + 0x70, 0x69, 0x2e, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x44, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, + 0x4d, 0x6f, 0x64, 0x65, 0x48, 0x09, 0x52, 0x11, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x44, 0x6f, 0x77, + 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x4d, 0x6f, 0x64, 0x65, 0x88, 0x01, 0x01, 0x12, 0x2f, 0x0a, 0x11, + 0x6e, 0x6f, 0x6e, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x69, 0x6e, 0x67, 0x5f, 0x6d, 0x6f, 0x64, + 0x65, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x08, 0x48, 0x0a, 0x52, 0x0f, 0x6e, 0x6f, 0x6e, 0x42, 0x6c, + 0x6f, 0x63, 0x6b, 0x69, 0x6e, 0x67, 0x4d, 0x6f, 0x64, 0x65, 0x88, 0x01, 0x01, 0x12, 0x2f, 0x0a, + 0x11, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x5f, 0x61, 0x75, 0x74, 0x68, 0x5f, 0x74, 0x6f, 0x6b, + 0x65, 0x6e, 0x18, 0x10, 0x20, 0x01, 0x28, 0x09, 0x48, 0x0b, 0x52, 0x0f, 0x67, 0x69, 0x74, 0x68, + 0x75, 0x62, 0x41, 0x75, 0x74, 0x68, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x88, 0x01, 0x01, 0x42, 0x1a, + 0x0a, 0x18, 0x73, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x5f, 0x70, 0x61, 0x63, 0x6b, 0x61, + 0x67, 0x65, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x42, 0x14, 0x0a, 0x12, 0x5f, 0x73, + 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, + 0x42, 0x0a, 0x0a, 0x08, 0x5f, 0x64, 0x72, 0x79, 0x5f, 0x72, 0x75, 0x6e, 0x42, 0x0e, 0x0a, 0x0c, + 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6c, 0x6c, 0x65, 0x6c, 0x69, 0x73, 0x6d, 0x42, 0x10, 0x0a, 0x0e, + 0x5f, 0x63, 0x6c, 0x6f, 0x6e, 0x65, 0x5f, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x42, 0x1d, + 0x0a, 0x1b, 0x5f, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x68, + 0x5f, 0x74, 0x6f, 0x5f, 0x6d, 0x61, 0x69, 0x6e, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x42, 0x15, 0x0a, + 0x13, 0x5f, 0x6d, 0x61, 0x69, 0x6e, 0x5f, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, + 0x6e, 0x61, 0x6d, 0x65, 0x42, 0x14, 0x0a, 0x12, 0x5f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x5f, 0x69, + 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x63, + 0x6c, 0x6f, 0x75, 0x64, 0x5f, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x42, 0x16, 0x0a, 0x14, + 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x5f, 0x64, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x5f, + 0x6d, 0x6f, 0x64, 0x65, 0x42, 0x14, 0x0a, 0x12, 0x5f, 0x6e, 0x6f, 0x6e, 0x5f, 0x62, 0x6c, 0x6f, + 0x63, 0x6b, 0x69, 0x6e, 0x67, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x42, 0x14, 0x0a, 0x12, 0x5f, 0x67, + 0x69, 0x74, 0x68, 0x75, 0x62, 0x5f, 0x61, 0x75, 0x74, 0x68, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, + 0x22, 0xb6, 0x04, 0x0a, 0x17, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x52, 0x75, 0x6e, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x4c, 0x69, 0x6e, 0x65, 0x12, 0x4a, 0x0a, 0x0b, + 0x69, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x26, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, + 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x49, 0x6e, + 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x00, 0x52, 0x0b, 0x69, 0x6e, 0x73, + 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x38, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, + 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, + 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, 0x61, 0x72, + 0x6c, 0x61, 0x72, 0x6b, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x48, 0x00, 0x52, 0x05, 0x65, 0x72, 0x72, + 0x6f, 0x72, 0x12, 0x4d, 0x0a, 0x0d, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x5f, 0x69, + 0x6e, 0x66, 0x6f, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x61, 0x70, 0x69, 0x5f, + 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, + 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x52, 0x75, 0x6e, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, + 0x73, 0x48, 0x00, 0x52, 0x0c, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x49, 0x6e, 0x66, + 0x6f, 0x12, 0x5d, 0x0a, 0x12, 0x69, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x5f, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x49, 0x6e, 0x73, 0x74, 0x72, 0x75, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x00, 0x52, 0x0b, 0x69, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x38, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, - 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, - 0x45, 0x72, 0x72, 0x6f, 0x72, 0x48, 0x00, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x4d, - 0x0a, 0x0d, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, - 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, - 0x72, 0x6b, 0x52, 0x75, 0x6e, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x48, 0x00, 0x52, - 0x0c, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x5d, 0x0a, - 0x12, 0x69, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x72, 0x65, 0x73, - 0x75, 0x6c, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x61, 0x70, 0x69, 0x5f, - 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, - 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x49, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x48, 0x00, 0x52, 0x11, 0x69, 0x6e, 0x73, 0x74, 0x72, - 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x5b, 0x0a, 0x12, - 0x72, 0x75, 0x6e, 0x5f, 0x66, 0x69, 0x6e, 0x69, 0x73, 0x68, 0x65, 0x64, 0x5f, 0x65, 0x76, 0x65, - 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, - 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, 0x61, - 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x52, 0x75, 0x6e, 0x46, 0x69, 0x6e, 0x69, 0x73, 0x68, 0x65, 0x64, - 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x10, 0x72, 0x75, 0x6e, 0x46, 0x69, 0x6e, 0x69, - 0x73, 0x68, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x3e, 0x0a, 0x07, 0x77, 0x61, 0x72, - 0x6e, 0x69, 0x6e, 0x67, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x61, 0x70, 0x69, - 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x53, - 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x57, 0x61, 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x48, 0x00, - 0x52, 0x07, 0x77, 0x61, 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x12, 0x35, 0x0a, 0x04, 0x69, 0x6e, 0x66, - 0x6f, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, - 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, 0x61, 0x72, - 0x6c, 0x61, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x48, 0x00, 0x52, 0x04, 0x69, 0x6e, 0x66, 0x6f, - 0x42, 0x13, 0x0a, 0x11, 0x72, 0x75, 0x6e, 0x5f, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x5f, 0x6c, 0x69, 0x6e, 0x65, 0x22, 0x31, 0x0a, 0x0c, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, - 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x21, 0x0a, 0x0c, 0x69, 0x6e, 0x66, 0x6f, 0x5f, 0x6d, 0x65, - 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x69, 0x6e, 0x66, - 0x6f, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x3a, 0x0a, 0x0f, 0x53, 0x74, 0x61, 0x72, - 0x6c, 0x61, 0x72, 0x6b, 0x57, 0x61, 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x12, 0x27, 0x0a, 0x0f, 0x77, - 0x61, 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x77, 0x61, 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x4d, 0x65, 0x73, - 0x73, 0x61, 0x67, 0x65, 0x22, 0xcd, 0x02, 0x0a, 0x13, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, - 0x6b, 0x49, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x4a, 0x0a, 0x08, - 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2e, - 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, - 0x70, 0x69, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x49, 0x6e, 0x73, 0x74, 0x72, - 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x08, - 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x29, 0x0a, 0x10, 0x69, 0x6e, 0x73, 0x74, - 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0f, 0x69, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, - 0x61, 0x6d, 0x65, 0x12, 0x47, 0x0a, 0x09, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, - 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, - 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x6c, - 0x61, 0x72, 0x6b, 0x49, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x41, 0x72, - 0x67, 0x52, 0x09, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x35, 0x0a, 0x16, - 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x69, 0x6e, 0x73, 0x74, 0x72, - 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x15, 0x65, 0x78, - 0x65, 0x63, 0x75, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x49, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x12, 0x1d, 0x0a, 0x0a, 0x69, 0x73, 0x5f, 0x73, 0x6b, 0x69, 0x70, 0x70, 0x65, - 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x69, 0x73, 0x53, 0x6b, 0x69, 0x70, 0x70, - 0x65, 0x64, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, - 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, - 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x5f, 0x0a, 0x19, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, - 0x49, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x75, 0x6c, - 0x74, 0x12, 0x42, 0x0a, 0x1d, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x5f, - 0x69, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x72, 0x65, 0x73, 0x75, - 0x6c, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x1b, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, - 0x69, 0x7a, 0x65, 0x64, 0x49, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, - 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0xa4, 0x01, 0x0a, 0x16, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, - 0x72, 0x6b, 0x49, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x41, 0x72, 0x67, - 0x12, 0x30, 0x0a, 0x14, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x5f, 0x61, - 0x72, 0x67, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, - 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x41, 0x72, 0x67, 0x56, 0x61, 0x6c, - 0x75, 0x65, 0x12, 0x1e, 0x0a, 0x08, 0x61, 0x72, 0x67, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x07, 0x61, 0x72, 0x67, 0x4e, 0x61, 0x6d, 0x65, 0x88, - 0x01, 0x01, 0x12, 0x2b, 0x0a, 0x11, 0x69, 0x73, 0x5f, 0x72, 0x65, 0x70, 0x72, 0x65, 0x73, 0x65, - 0x6e, 0x74, 0x61, 0x74, 0x69, 0x76, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, 0x69, - 0x73, 0x52, 0x65, 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x76, 0x65, 0x42, - 0x0b, 0x0a, 0x09, 0x5f, 0x61, 0x72, 0x67, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x65, 0x0a, 0x1b, - 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x49, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x66, - 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x66, - 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6c, 0x69, 0x6e, 0x65, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x6c, 0x69, 0x6e, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x63, - 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x63, 0x6f, 0x6c, - 0x75, 0x6d, 0x6e, 0x22, 0xac, 0x02, 0x0a, 0x0d, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, - 0x45, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x63, 0x0a, 0x14, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, - 0x65, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, - 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, - 0x49, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x72, - 0x72, 0x6f, 0x72, 0x48, 0x00, 0x52, 0x13, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x57, 0x0a, 0x10, 0x76, 0x61, - 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, - 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, - 0x6b, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x72, 0x72, 0x6f, 0x72, - 0x48, 0x00, 0x52, 0x0f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x72, - 0x72, 0x6f, 0x72, 0x12, 0x54, 0x0a, 0x0f, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, - 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x61, - 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, - 0x2e, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, - 0x6f, 0x6e, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x48, 0x00, 0x52, 0x0e, 0x65, 0x78, 0x65, 0x63, 0x75, - 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x42, 0x07, 0x0a, 0x05, 0x65, 0x72, 0x72, - 0x6f, 0x72, 0x22, 0x42, 0x0a, 0x1b, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x49, 0x6e, - 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x72, 0x72, 0x6f, - 0x72, 0x12, 0x23, 0x0a, 0x0d, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, - 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x4d, - 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x3e, 0x0a, 0x17, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, - 0x72, 0x6b, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x72, 0x72, 0x6f, - 0x72, 0x12, 0x23, 0x0a, 0x0d, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, - 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x4d, - 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x3d, 0x0a, 0x16, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, - 0x72, 0x6b, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x72, 0x72, 0x6f, 0x72, - 0x12, 0x23, 0x0a, 0x0d, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, - 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x4d, 0x65, - 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x92, 0x01, 0x0a, 0x13, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, - 0x72, 0x6b, 0x52, 0x75, 0x6e, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x12, 0x2a, 0x0a, - 0x11, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x74, 0x65, 0x70, 0x5f, 0x69, 0x6e, - 0x66, 0x6f, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0f, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, - 0x74, 0x53, 0x74, 0x65, 0x70, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1f, 0x0a, 0x0b, 0x74, 0x6f, 0x74, - 0x61, 0x6c, 0x5f, 0x73, 0x74, 0x65, 0x70, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, - 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x53, 0x74, 0x65, 0x70, 0x73, 0x12, 0x2e, 0x0a, 0x13, 0x63, 0x75, - 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x74, 0x65, 0x70, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, - 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x11, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, - 0x53, 0x74, 0x65, 0x70, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x22, 0x8e, 0x01, 0x0a, 0x18, 0x53, - 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x52, 0x75, 0x6e, 0x46, 0x69, 0x6e, 0x69, 0x73, 0x68, - 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x2a, 0x0a, 0x11, 0x69, 0x73, 0x5f, 0x72, 0x75, - 0x6e, 0x5f, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x66, 0x75, 0x6c, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x0f, 0x69, 0x73, 0x52, 0x75, 0x6e, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, - 0x66, 0x75, 0x6c, 0x12, 0x30, 0x0a, 0x11, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, - 0x64, 0x5f, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, - 0x52, 0x10, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x4f, 0x75, 0x74, 0x70, - 0x75, 0x74, 0x88, 0x01, 0x01, 0x42, 0x14, 0x0a, 0x12, 0x5f, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, - 0x69, 0x7a, 0x65, 0x64, 0x5f, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0xc5, 0x01, 0x0a, 0x0f, - 0x47, 0x65, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x41, 0x72, 0x67, 0x73, 0x12, - 0x6b, 0x0a, 0x13, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x65, 0x6e, 0x74, - 0x69, 0x66, 0x69, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x61, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x48, 0x00, 0x52, 0x11, 0x69, + 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, + 0x12, 0x5b, 0x0a, 0x12, 0x72, 0x75, 0x6e, 0x5f, 0x66, 0x69, 0x6e, 0x69, 0x73, 0x68, 0x65, 0x64, + 0x5f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, - 0x2e, 0x47, 0x65, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x41, 0x72, 0x67, 0x73, - 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, - 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x12, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, - 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x73, 0x1a, 0x45, 0x0a, 0x17, - 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, - 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, - 0x02, 0x38, 0x01, 0x22, 0xd1, 0x01, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, - 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x5a, 0x0a, 0x0c, 0x73, - 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x01, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x37, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, - 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, - 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, - 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0b, 0x73, 0x65, 0x72, 0x76, - 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x1a, 0x5e, 0x0a, 0x10, 0x53, 0x65, 0x72, 0x76, 0x69, - 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, - 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x34, 0x0a, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x61, - 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, - 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x72, 0x0a, 0x12, 0x53, 0x65, 0x72, 0x76, 0x69, - 0x63, 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x73, 0x12, 0x21, 0x0a, - 0x0c, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x75, 0x75, 0x69, 0x64, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0b, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x55, 0x75, 0x69, 0x64, - 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, - 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x65, 0x6e, 0x65, - 0x64, 0x5f, 0x75, 0x75, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x73, 0x68, - 0x6f, 0x72, 0x74, 0x65, 0x6e, 0x65, 0x64, 0x55, 0x75, 0x69, 0x64, 0x22, 0x83, 0x01, 0x0a, 0x32, - 0x47, 0x65, 0x74, 0x45, 0x78, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x41, 0x6e, 0x64, 0x48, 0x69, - 0x73, 0x74, 0x6f, 0x72, 0x69, 0x63, 0x61, 0x6c, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, - 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x4d, 0x0a, 0x0e, 0x61, 0x6c, 0x6c, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, - 0x69, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x52, 0x75, 0x6e, 0x46, 0x69, 0x6e, 0x69, + 0x73, 0x68, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x10, 0x72, 0x75, 0x6e, + 0x46, 0x69, 0x6e, 0x69, 0x73, 0x68, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x3e, 0x0a, + 0x07, 0x77, 0x61, 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, + 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, + 0x70, 0x69, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x57, 0x61, 0x72, 0x6e, 0x69, + 0x6e, 0x67, 0x48, 0x00, 0x52, 0x07, 0x77, 0x61, 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x12, 0x35, 0x0a, + 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x61, 0x70, + 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, + 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x48, 0x00, 0x52, 0x04, + 0x69, 0x6e, 0x66, 0x6f, 0x42, 0x13, 0x0a, 0x11, 0x72, 0x75, 0x6e, 0x5f, 0x72, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x5f, 0x6c, 0x69, 0x6e, 0x65, 0x22, 0x31, 0x0a, 0x0c, 0x53, 0x74, 0x61, + 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x21, 0x0a, 0x0c, 0x69, 0x6e, 0x66, + 0x6f, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0b, 0x69, 0x6e, 0x66, 0x6f, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x3a, 0x0a, 0x0f, + 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x57, 0x61, 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x12, + 0x27, 0x0a, 0x0f, 0x77, 0x61, 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, + 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x77, 0x61, 0x72, 0x6e, 0x69, 0x6e, + 0x67, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0xcd, 0x02, 0x0a, 0x13, 0x53, 0x74, 0x61, + 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x49, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x12, 0x4a, 0x0a, 0x08, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, + 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x49, + 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, + 0x6f, 0x6e, 0x52, 0x08, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x29, 0x0a, 0x10, + 0x69, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x69, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x47, 0x0a, 0x09, 0x61, 0x72, 0x67, 0x75, 0x6d, + 0x65, 0x6e, 0x74, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x53, + 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x49, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x41, 0x72, 0x67, 0x52, 0x09, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, + 0x12, 0x35, 0x0a, 0x16, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x69, + 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x15, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x49, 0x6e, 0x73, 0x74, + 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1d, 0x0a, 0x0a, 0x69, 0x73, 0x5f, 0x73, 0x6b, + 0x69, 0x70, 0x70, 0x65, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x69, 0x73, 0x53, + 0x6b, 0x69, 0x70, 0x70, 0x65, 0x64, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x5f, 0x0a, 0x19, 0x53, 0x74, 0x61, 0x72, + 0x6c, 0x61, 0x72, 0x6b, 0x49, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, + 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x42, 0x0a, 0x1d, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, + 0x7a, 0x65, 0x64, 0x5f, 0x69, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, + 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x1b, 0x73, 0x65, + 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x49, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0xa4, 0x01, 0x0a, 0x16, 0x53, 0x74, + 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x49, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x41, 0x72, 0x67, 0x12, 0x30, 0x0a, 0x14, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, + 0x65, 0x64, 0x5f, 0x61, 0x72, 0x67, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x12, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x41, 0x72, + 0x67, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x1e, 0x0a, 0x08, 0x61, 0x72, 0x67, 0x5f, 0x6e, 0x61, + 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x07, 0x61, 0x72, 0x67, 0x4e, + 0x61, 0x6d, 0x65, 0x88, 0x01, 0x01, 0x12, 0x2b, 0x0a, 0x11, 0x69, 0x73, 0x5f, 0x72, 0x65, 0x70, + 0x72, 0x65, 0x73, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x76, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x10, 0x69, 0x73, 0x52, 0x65, 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x74, 0x61, 0x74, + 0x69, 0x76, 0x65, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x61, 0x72, 0x67, 0x5f, 0x6e, 0x61, 0x6d, 0x65, + 0x22, 0x65, 0x0a, 0x1b, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x49, 0x6e, 0x73, 0x74, + 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, + 0x1a, 0x0a, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6c, + 0x69, 0x6e, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x6c, 0x69, 0x6e, 0x65, 0x12, + 0x16, 0x0a, 0x06, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, + 0x06, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x22, 0xac, 0x02, 0x0a, 0x0d, 0x53, 0x74, 0x61, 0x72, + 0x6c, 0x61, 0x72, 0x6b, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x63, 0x0a, 0x14, 0x69, 0x6e, 0x74, + 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x65, 0x72, 0x72, 0x6f, + 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, + 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, 0x61, 0x72, + 0x6c, 0x61, 0x72, 0x6b, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x48, 0x00, 0x52, 0x13, 0x69, 0x6e, 0x74, 0x65, 0x72, + 0x70, 0x72, 0x65, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x57, + 0x0a, 0x10, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x65, 0x72, 0x72, + 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, + 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, 0x61, + 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, + 0x72, 0x72, 0x6f, 0x72, 0x48, 0x00, 0x52, 0x0f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x54, 0x0a, 0x0f, 0x65, 0x78, 0x65, 0x63, 0x75, + 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x29, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, + 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x45, 0x78, 0x65, + 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x48, 0x00, 0x52, 0x0e, 0x65, + 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x42, 0x07, 0x0a, + 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x42, 0x0a, 0x1b, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, + 0x72, 0x6b, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x45, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x23, 0x0a, 0x0d, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x5f, 0x6d, + 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x65, 0x72, + 0x72, 0x6f, 0x72, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x3e, 0x0a, 0x17, 0x53, 0x74, + 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x45, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x23, 0x0a, 0x0d, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x5f, 0x6d, + 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x65, 0x72, + 0x72, 0x6f, 0x72, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x3d, 0x0a, 0x16, 0x53, 0x74, + 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x45, + 0x72, 0x72, 0x6f, 0x72, 0x12, 0x23, 0x0a, 0x0d, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x5f, 0x6d, 0x65, + 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x65, 0x72, 0x72, + 0x6f, 0x72, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x92, 0x01, 0x0a, 0x13, 0x53, 0x74, + 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x52, 0x75, 0x6e, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, + 0x73, 0x12, 0x2a, 0x0a, 0x11, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x74, 0x65, + 0x70, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0f, 0x63, 0x75, + 0x72, 0x72, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x65, 0x70, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1f, 0x0a, + 0x0b, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x73, 0x74, 0x65, 0x70, 0x73, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0d, 0x52, 0x0a, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x53, 0x74, 0x65, 0x70, 0x73, 0x12, 0x2e, + 0x0a, 0x13, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x74, 0x65, 0x70, 0x5f, 0x6e, + 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x11, 0x63, 0x75, 0x72, + 0x72, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x65, 0x70, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x22, 0x8e, + 0x01, 0x0a, 0x18, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x52, 0x75, 0x6e, 0x46, 0x69, + 0x6e, 0x69, 0x73, 0x68, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x2a, 0x0a, 0x11, 0x69, + 0x73, 0x5f, 0x72, 0x75, 0x6e, 0x5f, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x66, 0x75, 0x6c, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, 0x69, 0x73, 0x52, 0x75, 0x6e, 0x53, 0x75, 0x63, + 0x63, 0x65, 0x73, 0x73, 0x66, 0x75, 0x6c, 0x12, 0x30, 0x0a, 0x11, 0x73, 0x65, 0x72, 0x69, 0x61, + 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x5f, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x48, 0x00, 0x52, 0x10, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, + 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x88, 0x01, 0x01, 0x42, 0x14, 0x0a, 0x12, 0x5f, 0x73, 0x65, + 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x5f, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, + 0xc5, 0x01, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x41, + 0x72, 0x67, 0x73, 0x12, 0x6b, 0x0a, 0x13, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, + 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x3a, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, + 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, + 0x41, 0x72, 0x67, 0x73, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x65, 0x6e, + 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x12, 0x73, 0x65, + 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x73, + 0x1a, 0x45, 0x0a, 0x17, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, + 0x69, 0x66, 0x69, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, + 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xd1, 0x01, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x53, + 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x5a, 0x0a, 0x0c, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, + 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x37, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, + 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x65, 0x72, + 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x53, 0x65, + 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0b, + 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x1a, 0x5e, 0x0a, 0x10, 0x53, + 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, + 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, + 0x79, 0x12, 0x34, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1e, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, + 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, + 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x72, 0x0a, 0x12, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, - 0x73, 0x52, 0x0e, 0x61, 0x6c, 0x6c, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, - 0x73, 0x22, 0x63, 0x0a, 0x0f, 0x45, 0x78, 0x65, 0x63, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, - 0x41, 0x72, 0x67, 0x73, 0x12, 0x2d, 0x0a, 0x12, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, - 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x11, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, - 0x69, 0x65, 0x72, 0x12, 0x21, 0x0a, 0x0c, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x5f, 0x61, - 0x72, 0x67, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x6f, 0x6d, 0x6d, 0x61, - 0x6e, 0x64, 0x41, 0x72, 0x67, 0x73, 0x22, 0x51, 0x0a, 0x13, 0x45, 0x78, 0x65, 0x63, 0x43, 0x6f, - 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1b, 0x0a, - 0x09, 0x65, 0x78, 0x69, 0x74, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, - 0x52, 0x08, 0x65, 0x78, 0x69, 0x74, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x6c, 0x6f, - 0x67, 0x5f, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, - 0x6c, 0x6f, 0x67, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0xac, 0x03, 0x0a, 0x26, 0x57, 0x61, - 0x69, 0x74, 0x46, 0x6f, 0x72, 0x48, 0x74, 0x74, 0x70, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x64, 0x70, - 0x6f, 0x69, 0x6e, 0x74, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, - 0x41, 0x72, 0x67, 0x73, 0x12, 0x2d, 0x0a, 0x12, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, - 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x11, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, - 0x69, 0x65, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x0d, 0x52, 0x04, 0x70, 0x6f, 0x72, 0x74, 0x12, 0x17, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x88, 0x01, 0x01, - 0x12, 0x41, 0x0a, 0x1a, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x5f, 0x64, 0x65, 0x6c, 0x61, - 0x79, 0x5f, 0x6d, 0x69, 0x6c, 0x6c, 0x69, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x0d, 0x48, 0x01, 0x52, 0x18, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x44, - 0x65, 0x6c, 0x61, 0x79, 0x4d, 0x69, 0x6c, 0x6c, 0x69, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, - 0x88, 0x01, 0x01, 0x12, 0x1d, 0x0a, 0x07, 0x72, 0x65, 0x74, 0x72, 0x69, 0x65, 0x73, 0x18, 0x05, - 0x20, 0x01, 0x28, 0x0d, 0x48, 0x02, 0x52, 0x07, 0x72, 0x65, 0x74, 0x72, 0x69, 0x65, 0x73, 0x88, - 0x01, 0x01, 0x12, 0x41, 0x0a, 0x1a, 0x72, 0x65, 0x74, 0x72, 0x69, 0x65, 0x73, 0x5f, 0x64, 0x65, - 0x6c, 0x61, 0x79, 0x5f, 0x6d, 0x69, 0x6c, 0x6c, 0x69, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, - 0x18, 0x06, 0x20, 0x01, 0x28, 0x0d, 0x48, 0x03, 0x52, 0x18, 0x72, 0x65, 0x74, 0x72, 0x69, 0x65, - 0x73, 0x44, 0x65, 0x6c, 0x61, 0x79, 0x4d, 0x69, 0x6c, 0x6c, 0x69, 0x73, 0x65, 0x63, 0x6f, 0x6e, - 0x64, 0x73, 0x88, 0x01, 0x01, 0x12, 0x20, 0x0a, 0x09, 0x62, 0x6f, 0x64, 0x79, 0x5f, 0x74, 0x65, - 0x78, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x48, 0x04, 0x52, 0x08, 0x62, 0x6f, 0x64, 0x79, - 0x54, 0x65, 0x78, 0x74, 0x88, 0x01, 0x01, 0x42, 0x07, 0x0a, 0x05, 0x5f, 0x70, 0x61, 0x74, 0x68, - 0x42, 0x1d, 0x0a, 0x1b, 0x5f, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x5f, 0x64, 0x65, 0x6c, - 0x61, 0x79, 0x5f, 0x6d, 0x69, 0x6c, 0x6c, 0x69, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x42, - 0x0a, 0x0a, 0x08, 0x5f, 0x72, 0x65, 0x74, 0x72, 0x69, 0x65, 0x73, 0x42, 0x1d, 0x0a, 0x1b, 0x5f, - 0x72, 0x65, 0x74, 0x72, 0x69, 0x65, 0x73, 0x5f, 0x64, 0x65, 0x6c, 0x61, 0x79, 0x5f, 0x6d, 0x69, - 0x6c, 0x6c, 0x69, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x42, 0x0c, 0x0a, 0x0a, 0x5f, 0x62, - 0x6f, 0x64, 0x79, 0x5f, 0x74, 0x65, 0x78, 0x74, 0x22, 0xe6, 0x03, 0x0a, 0x27, 0x57, 0x61, 0x69, - 0x74, 0x46, 0x6f, 0x72, 0x48, 0x74, 0x74, 0x70, 0x50, 0x6f, 0x73, 0x74, 0x45, 0x6e, 0x64, 0x70, - 0x6f, 0x69, 0x6e, 0x74, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, - 0x41, 0x72, 0x67, 0x73, 0x12, 0x2d, 0x0a, 0x12, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, - 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x11, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, - 0x69, 0x65, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x0d, 0x52, 0x04, 0x70, 0x6f, 0x72, 0x74, 0x12, 0x17, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x88, 0x01, 0x01, - 0x12, 0x26, 0x0a, 0x0c, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x62, 0x6f, 0x64, 0x79, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x0b, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x42, 0x6f, 0x64, 0x79, 0x88, 0x01, 0x01, 0x12, 0x41, 0x0a, 0x1a, 0x69, 0x6e, 0x69, 0x74, - 0x69, 0x61, 0x6c, 0x5f, 0x64, 0x65, 0x6c, 0x61, 0x79, 0x5f, 0x6d, 0x69, 0x6c, 0x6c, 0x69, 0x73, - 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x48, 0x02, 0x52, 0x18, - 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x44, 0x65, 0x6c, 0x61, 0x79, 0x4d, 0x69, 0x6c, 0x6c, - 0x69, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x88, 0x01, 0x01, 0x12, 0x1d, 0x0a, 0x07, 0x72, - 0x65, 0x74, 0x72, 0x69, 0x65, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0d, 0x48, 0x03, 0x52, 0x07, - 0x72, 0x65, 0x74, 0x72, 0x69, 0x65, 0x73, 0x88, 0x01, 0x01, 0x12, 0x41, 0x0a, 0x1a, 0x72, 0x65, - 0x74, 0x72, 0x69, 0x65, 0x73, 0x5f, 0x64, 0x65, 0x6c, 0x61, 0x79, 0x5f, 0x6d, 0x69, 0x6c, 0x6c, - 0x69, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0d, 0x48, 0x04, - 0x52, 0x18, 0x72, 0x65, 0x74, 0x72, 0x69, 0x65, 0x73, 0x44, 0x65, 0x6c, 0x61, 0x79, 0x4d, 0x69, - 0x6c, 0x6c, 0x69, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x88, 0x01, 0x01, 0x12, 0x20, 0x0a, - 0x09, 0x62, 0x6f, 0x64, 0x79, 0x5f, 0x74, 0x65, 0x78, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, - 0x48, 0x05, 0x52, 0x08, 0x62, 0x6f, 0x64, 0x79, 0x54, 0x65, 0x78, 0x74, 0x88, 0x01, 0x01, 0x42, - 0x07, 0x0a, 0x05, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x42, 0x0f, 0x0a, 0x0d, 0x5f, 0x72, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x5f, 0x62, 0x6f, 0x64, 0x79, 0x42, 0x1d, 0x0a, 0x1b, 0x5f, 0x69, 0x6e, - 0x69, 0x74, 0x69, 0x61, 0x6c, 0x5f, 0x64, 0x65, 0x6c, 0x61, 0x79, 0x5f, 0x6d, 0x69, 0x6c, 0x6c, - 0x69, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x42, 0x0a, 0x0a, 0x08, 0x5f, 0x72, 0x65, 0x74, - 0x72, 0x69, 0x65, 0x73, 0x42, 0x1d, 0x0a, 0x1b, 0x5f, 0x72, 0x65, 0x74, 0x72, 0x69, 0x65, 0x73, + 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x75, 0x75, 0x69, + 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, + 0x55, 0x75, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x73, 0x68, 0x6f, 0x72, + 0x74, 0x65, 0x6e, 0x65, 0x64, 0x5f, 0x75, 0x75, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0d, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x65, 0x6e, 0x65, 0x64, 0x55, 0x75, 0x69, 0x64, 0x22, + 0x83, 0x01, 0x0a, 0x32, 0x47, 0x65, 0x74, 0x45, 0x78, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x41, + 0x6e, 0x64, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x69, 0x63, 0x61, 0x6c, 0x53, 0x65, 0x72, 0x76, + 0x69, 0x63, 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x73, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4d, 0x0a, 0x0e, 0x61, 0x6c, 0x6c, 0x49, 0x64, 0x65, + 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x25, + 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, + 0x70, 0x69, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, + 0x66, 0x69, 0x65, 0x72, 0x73, 0x52, 0x0e, 0x61, 0x6c, 0x6c, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, + 0x66, 0x69, 0x65, 0x72, 0x73, 0x22, 0x63, 0x0a, 0x0f, 0x45, 0x78, 0x65, 0x63, 0x43, 0x6f, 0x6d, + 0x6d, 0x61, 0x6e, 0x64, 0x41, 0x72, 0x67, 0x73, 0x12, 0x2d, 0x0a, 0x12, 0x73, 0x65, 0x72, 0x76, + 0x69, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x65, + 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x12, 0x21, 0x0a, 0x0c, 0x63, 0x6f, 0x6d, 0x6d, 0x61, + 0x6e, 0x64, 0x5f, 0x61, 0x72, 0x67, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0b, 0x63, + 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x41, 0x72, 0x67, 0x73, 0x22, 0x51, 0x0a, 0x13, 0x45, 0x78, + 0x65, 0x63, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x65, 0x78, 0x69, 0x74, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x65, 0x78, 0x69, 0x74, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x1d, + 0x0a, 0x0a, 0x6c, 0x6f, 0x67, 0x5f, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x09, 0x6c, 0x6f, 0x67, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0xac, 0x03, + 0x0a, 0x26, 0x57, 0x61, 0x69, 0x74, 0x46, 0x6f, 0x72, 0x48, 0x74, 0x74, 0x70, 0x47, 0x65, 0x74, + 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x69, + 0x6c, 0x69, 0x74, 0x79, 0x41, 0x72, 0x67, 0x73, 0x12, 0x2d, 0x0a, 0x12, 0x73, 0x65, 0x72, 0x76, + 0x69, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x65, + 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x6f, 0x72, 0x74, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x70, 0x6f, 0x72, 0x74, 0x12, 0x17, 0x0a, 0x04, 0x70, + 0x61, 0x74, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x04, 0x70, 0x61, 0x74, + 0x68, 0x88, 0x01, 0x01, 0x12, 0x41, 0x0a, 0x1a, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x5f, + 0x64, 0x65, 0x6c, 0x61, 0x79, 0x5f, 0x6d, 0x69, 0x6c, 0x6c, 0x69, 0x73, 0x65, 0x63, 0x6f, 0x6e, + 0x64, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x48, 0x01, 0x52, 0x18, 0x69, 0x6e, 0x69, 0x74, + 0x69, 0x61, 0x6c, 0x44, 0x65, 0x6c, 0x61, 0x79, 0x4d, 0x69, 0x6c, 0x6c, 0x69, 0x73, 0x65, 0x63, + 0x6f, 0x6e, 0x64, 0x73, 0x88, 0x01, 0x01, 0x12, 0x1d, 0x0a, 0x07, 0x72, 0x65, 0x74, 0x72, 0x69, + 0x65, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x48, 0x02, 0x52, 0x07, 0x72, 0x65, 0x74, 0x72, + 0x69, 0x65, 0x73, 0x88, 0x01, 0x01, 0x12, 0x41, 0x0a, 0x1a, 0x72, 0x65, 0x74, 0x72, 0x69, 0x65, + 0x73, 0x5f, 0x64, 0x65, 0x6c, 0x61, 0x79, 0x5f, 0x6d, 0x69, 0x6c, 0x6c, 0x69, 0x73, 0x65, 0x63, + 0x6f, 0x6e, 0x64, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0d, 0x48, 0x03, 0x52, 0x18, 0x72, 0x65, + 0x74, 0x72, 0x69, 0x65, 0x73, 0x44, 0x65, 0x6c, 0x61, 0x79, 0x4d, 0x69, 0x6c, 0x6c, 0x69, 0x73, + 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x88, 0x01, 0x01, 0x12, 0x20, 0x0a, 0x09, 0x62, 0x6f, 0x64, + 0x79, 0x5f, 0x74, 0x65, 0x78, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x48, 0x04, 0x52, 0x08, + 0x62, 0x6f, 0x64, 0x79, 0x54, 0x65, 0x78, 0x74, 0x88, 0x01, 0x01, 0x42, 0x07, 0x0a, 0x05, 0x5f, + 0x70, 0x61, 0x74, 0x68, 0x42, 0x1d, 0x0a, 0x1b, 0x5f, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x5f, 0x64, 0x65, 0x6c, 0x61, 0x79, 0x5f, 0x6d, 0x69, 0x6c, 0x6c, 0x69, 0x73, 0x65, 0x63, 0x6f, - 0x6e, 0x64, 0x73, 0x42, 0x0c, 0x0a, 0x0a, 0x5f, 0x62, 0x6f, 0x64, 0x79, 0x5f, 0x74, 0x65, 0x78, - 0x74, 0x22, 0x99, 0x01, 0x0a, 0x11, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x65, 0x64, 0x44, 0x61, - 0x74, 0x61, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x12, 0x2e, 0x0a, 0x13, 0x70, - 0x72, 0x65, 0x76, 0x69, 0x6f, 0x75, 0x73, 0x5f, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x5f, 0x68, 0x61, - 0x73, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x70, 0x72, 0x65, 0x76, 0x69, 0x6f, - 0x75, 0x73, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x48, 0x61, 0x73, 0x68, 0x12, 0x40, 0x0a, 0x08, 0x6d, - 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, - 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, - 0x69, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x4d, 0x65, 0x74, 0x61, 0x64, - 0x61, 0x74, 0x61, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x22, 0x27, 0x0a, - 0x11, 0x44, 0x61, 0x74, 0x61, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, - 0x74, 0x61, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x45, 0x0a, 0x1b, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, - 0x46, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x75, 0x75, 0x69, 0x64, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x04, 0x75, 0x75, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3b, 0x0a, - 0x19, 0x44, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x72, - 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x41, 0x72, 0x67, 0x73, 0x12, 0x1e, 0x0a, 0x0a, 0x69, 0x64, - 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, - 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x22, 0x41, 0x0a, 0x19, 0x53, 0x74, - 0x6f, 0x72, 0x65, 0x57, 0x65, 0x62, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x72, 0x74, 0x69, 0x66, - 0x61, 0x63, 0x74, 0x41, 0x72, 0x67, 0x73, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x72, 0x6c, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x72, 0x6c, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x33, 0x0a, - 0x1d, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x57, 0x65, 0x62, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x72, - 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x12, - 0x0a, 0x04, 0x75, 0x75, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x75, 0x75, - 0x69, 0x64, 0x22, 0x87, 0x01, 0x0a, 0x21, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x46, 0x69, 0x6c, 0x65, - 0x73, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x46, 0x72, 0x6f, 0x6d, 0x53, 0x65, 0x72, - 0x76, 0x69, 0x63, 0x65, 0x41, 0x72, 0x67, 0x73, 0x12, 0x2d, 0x0a, 0x12, 0x73, 0x65, 0x72, 0x76, + 0x6e, 0x64, 0x73, 0x42, 0x0a, 0x0a, 0x08, 0x5f, 0x72, 0x65, 0x74, 0x72, 0x69, 0x65, 0x73, 0x42, + 0x1d, 0x0a, 0x1b, 0x5f, 0x72, 0x65, 0x74, 0x72, 0x69, 0x65, 0x73, 0x5f, 0x64, 0x65, 0x6c, 0x61, + 0x79, 0x5f, 0x6d, 0x69, 0x6c, 0x6c, 0x69, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x42, 0x0c, + 0x0a, 0x0a, 0x5f, 0x62, 0x6f, 0x64, 0x79, 0x5f, 0x74, 0x65, 0x78, 0x74, 0x22, 0xe6, 0x03, 0x0a, + 0x27, 0x57, 0x61, 0x69, 0x74, 0x46, 0x6f, 0x72, 0x48, 0x74, 0x74, 0x70, 0x50, 0x6f, 0x73, 0x74, + 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x69, + 0x6c, 0x69, 0x74, 0x79, 0x41, 0x72, 0x67, 0x73, 0x12, 0x2d, 0x0a, 0x12, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x65, - 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x6f, 0x75, 0x72, 0x63, - 0x65, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x73, 0x6f, - 0x75, 0x72, 0x63, 0x65, 0x50, 0x61, 0x74, 0x68, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3b, 0x0a, 0x25, - 0x53, 0x74, 0x6f, 0x72, 0x65, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, - 0x63, 0x74, 0x46, 0x72, 0x6f, 0x6d, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x75, 0x75, 0x69, 0x64, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x04, 0x75, 0x75, 0x69, 0x64, 0x22, 0x52, 0x0a, 0x18, 0x46, 0x69, 0x6c, - 0x65, 0x73, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x41, 0x6e, - 0x64, 0x55, 0x75, 0x69, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, - 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, - 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x55, 0x75, 0x69, 0x64, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x55, 0x75, 0x69, 0x64, 0x22, 0x86, 0x01, - 0x0a, 0x26, 0x4c, 0x69, 0x73, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x72, 0x74, 0x69, 0x66, - 0x61, 0x63, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x41, 0x6e, 0x64, 0x55, 0x75, 0x69, 0x64, 0x73, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x5c, 0x0a, 0x14, 0x66, 0x69, 0x6c, 0x65, - 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x5f, 0x61, 0x6e, 0x64, 0x5f, 0x75, 0x75, 0x69, 0x64, 0x73, - 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, - 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x73, - 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x41, 0x6e, 0x64, 0x55, - 0x75, 0x69, 0x64, 0x52, 0x11, 0x66, 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x41, 0x6e, - 0x64, 0x55, 0x75, 0x69, 0x64, 0x73, 0x22, 0x81, 0x01, 0x0a, 0x23, 0x49, 0x6e, 0x73, 0x70, 0x65, - 0x63, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x43, - 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x5a, - 0x0a, 0x13, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x5f, 0x61, 0x6e, 0x64, - 0x5f, 0x75, 0x75, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x61, 0x70, - 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, - 0x46, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x4e, 0x61, 0x6d, - 0x65, 0x41, 0x6e, 0x64, 0x55, 0x75, 0x69, 0x64, 0x52, 0x10, 0x66, 0x69, 0x6c, 0x65, 0x4e, 0x61, - 0x6d, 0x65, 0x73, 0x41, 0x6e, 0x64, 0x55, 0x75, 0x69, 0x64, 0x22, 0x8b, 0x01, 0x0a, 0x24, 0x49, + 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x6f, 0x72, 0x74, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x70, 0x6f, 0x72, 0x74, 0x12, 0x17, 0x0a, 0x04, 0x70, + 0x61, 0x74, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x04, 0x70, 0x61, 0x74, + 0x68, 0x88, 0x01, 0x01, 0x12, 0x26, 0x0a, 0x0c, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, + 0x62, 0x6f, 0x64, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x0b, 0x72, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x42, 0x6f, 0x64, 0x79, 0x88, 0x01, 0x01, 0x12, 0x41, 0x0a, 0x1a, + 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x5f, 0x64, 0x65, 0x6c, 0x61, 0x79, 0x5f, 0x6d, 0x69, + 0x6c, 0x6c, 0x69, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, + 0x48, 0x02, 0x52, 0x18, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x44, 0x65, 0x6c, 0x61, 0x79, + 0x4d, 0x69, 0x6c, 0x6c, 0x69, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x88, 0x01, 0x01, 0x12, + 0x1d, 0x0a, 0x07, 0x72, 0x65, 0x74, 0x72, 0x69, 0x65, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0d, + 0x48, 0x03, 0x52, 0x07, 0x72, 0x65, 0x74, 0x72, 0x69, 0x65, 0x73, 0x88, 0x01, 0x01, 0x12, 0x41, + 0x0a, 0x1a, 0x72, 0x65, 0x74, 0x72, 0x69, 0x65, 0x73, 0x5f, 0x64, 0x65, 0x6c, 0x61, 0x79, 0x5f, + 0x6d, 0x69, 0x6c, 0x6c, 0x69, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x18, 0x07, 0x20, 0x01, + 0x28, 0x0d, 0x48, 0x04, 0x52, 0x18, 0x72, 0x65, 0x74, 0x72, 0x69, 0x65, 0x73, 0x44, 0x65, 0x6c, + 0x61, 0x79, 0x4d, 0x69, 0x6c, 0x6c, 0x69, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x88, 0x01, + 0x01, 0x12, 0x20, 0x0a, 0x09, 0x62, 0x6f, 0x64, 0x79, 0x5f, 0x74, 0x65, 0x78, 0x74, 0x18, 0x08, + 0x20, 0x01, 0x28, 0x09, 0x48, 0x05, 0x52, 0x08, 0x62, 0x6f, 0x64, 0x79, 0x54, 0x65, 0x78, 0x74, + 0x88, 0x01, 0x01, 0x42, 0x07, 0x0a, 0x05, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x42, 0x0f, 0x0a, 0x0d, + 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x62, 0x6f, 0x64, 0x79, 0x42, 0x1d, 0x0a, + 0x1b, 0x5f, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x5f, 0x64, 0x65, 0x6c, 0x61, 0x79, 0x5f, + 0x6d, 0x69, 0x6c, 0x6c, 0x69, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x42, 0x0a, 0x0a, 0x08, + 0x5f, 0x72, 0x65, 0x74, 0x72, 0x69, 0x65, 0x73, 0x42, 0x1d, 0x0a, 0x1b, 0x5f, 0x72, 0x65, 0x74, + 0x72, 0x69, 0x65, 0x73, 0x5f, 0x64, 0x65, 0x6c, 0x61, 0x79, 0x5f, 0x6d, 0x69, 0x6c, 0x6c, 0x69, + 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x42, 0x0c, 0x0a, 0x0a, 0x5f, 0x62, 0x6f, 0x64, 0x79, + 0x5f, 0x74, 0x65, 0x78, 0x74, 0x22, 0x99, 0x01, 0x0a, 0x11, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, + 0x65, 0x64, 0x44, 0x61, 0x74, 0x61, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x12, 0x12, 0x0a, 0x04, 0x64, + 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x12, + 0x2e, 0x0a, 0x13, 0x70, 0x72, 0x65, 0x76, 0x69, 0x6f, 0x75, 0x73, 0x5f, 0x63, 0x68, 0x75, 0x6e, + 0x6b, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x70, 0x72, + 0x65, 0x76, 0x69, 0x6f, 0x75, 0x73, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x48, 0x61, 0x73, 0x68, 0x12, + 0x40, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x24, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, + 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x4d, + 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, + 0x61, 0x22, 0x27, 0x0a, 0x11, 0x44, 0x61, 0x74, 0x61, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x4d, 0x65, + 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x45, 0x0a, 0x1b, 0x55, 0x70, + 0x6c, 0x6f, 0x61, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, + 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x75, 0x75, 0x69, + 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x75, 0x75, 0x69, 0x64, 0x12, 0x12, 0x0a, + 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, + 0x65, 0x22, 0x3b, 0x0a, 0x19, 0x44, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x46, 0x69, 0x6c, + 0x65, 0x73, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x41, 0x72, 0x67, 0x73, 0x12, 0x1e, + 0x0a, 0x0a, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0a, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x22, 0x41, + 0x0a, 0x19, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x57, 0x65, 0x62, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x41, + 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x41, 0x72, 0x67, 0x73, 0x12, 0x10, 0x0a, 0x03, 0x75, + 0x72, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x72, 0x6c, 0x12, 0x12, 0x0a, + 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, + 0x65, 0x22, 0x33, 0x0a, 0x1d, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x57, 0x65, 0x62, 0x46, 0x69, 0x6c, + 0x65, 0x73, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x75, 0x75, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x04, 0x75, 0x75, 0x69, 0x64, 0x22, 0x87, 0x01, 0x0a, 0x21, 0x53, 0x74, 0x6f, 0x72, 0x65, + 0x46, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x46, 0x72, 0x6f, + 0x6d, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x41, 0x72, 0x67, 0x73, 0x12, 0x2d, 0x0a, 0x12, + 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, + 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, + 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x12, 0x1f, 0x0a, 0x0b, 0x73, + 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0a, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x50, 0x61, 0x74, 0x68, 0x12, 0x12, 0x0a, 0x04, + 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, + 0x22, 0x3b, 0x0a, 0x25, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x72, + 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x46, 0x72, 0x6f, 0x6d, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, + 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x75, 0x75, 0x69, + 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x75, 0x75, 0x69, 0x64, 0x22, 0x52, 0x0a, + 0x18, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x4e, 0x61, + 0x6d, 0x65, 0x41, 0x6e, 0x64, 0x55, 0x75, 0x69, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x66, 0x69, 0x6c, + 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x66, 0x69, 0x6c, + 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x55, 0x75, 0x69, + 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x55, 0x75, 0x69, + 0x64, 0x22, 0x86, 0x01, 0x0a, 0x26, 0x4c, 0x69, 0x73, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x41, + 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x41, 0x6e, 0x64, 0x55, + 0x75, 0x69, 0x64, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x5c, 0x0a, 0x14, + 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x5f, 0x61, 0x6e, 0x64, 0x5f, 0x75, + 0x75, 0x69, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x61, 0x70, 0x69, + 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x46, + 0x69, 0x6c, 0x65, 0x73, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x4e, 0x61, 0x6d, 0x65, + 0x41, 0x6e, 0x64, 0x55, 0x75, 0x69, 0x64, 0x52, 0x11, 0x66, 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, + 0x65, 0x73, 0x41, 0x6e, 0x64, 0x55, 0x75, 0x69, 0x64, 0x73, 0x22, 0x81, 0x01, 0x0a, 0x23, 0x49, 0x6e, 0x73, 0x70, 0x65, 0x63, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x72, 0x74, 0x69, 0x66, - 0x61, 0x63, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x63, 0x0a, 0x11, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x64, 0x65, 0x73, 0x63, - 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x36, - 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, - 0x70, 0x69, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x43, - 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x46, 0x69, 0x6c, 0x65, 0x44, 0x65, 0x73, 0x63, 0x72, - 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x10, 0x66, 0x69, 0x6c, 0x65, 0x44, 0x65, 0x73, 0x63, - 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x86, 0x01, 0x0a, 0x23, 0x46, 0x69, 0x6c, - 0x65, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, - 0x73, 0x46, 0x69, 0x6c, 0x65, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, - 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, - 0x70, 0x61, 0x74, 0x68, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x04, 0x52, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x12, 0x26, 0x0a, 0x0c, 0x74, 0x65, 0x78, 0x74, - 0x5f, 0x70, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, - 0x52, 0x0b, 0x74, 0x65, 0x78, 0x74, 0x50, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x88, 0x01, 0x01, - 0x42, 0x0f, 0x0a, 0x0d, 0x5f, 0x74, 0x65, 0x78, 0x74, 0x5f, 0x70, 0x72, 0x65, 0x76, 0x69, 0x65, - 0x77, 0x22, 0x4b, 0x0a, 0x13, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x53, 0x65, 0x72, 0x76, - 0x69, 0x63, 0x65, 0x73, 0x41, 0x72, 0x67, 0x73, 0x12, 0x34, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x6e, - 0x65, 0x63, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1a, 0x2e, 0x61, 0x70, 0x69, 0x5f, - 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x43, 0x6f, - 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x22, 0x19, - 0x0a, 0x17, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, - 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xa2, 0x04, 0x0a, 0x16, 0x47, 0x65, - 0x74, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x52, 0x75, 0x6e, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x5f, - 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, - 0x65, 0x49, 0x64, 0x12, 0x2b, 0x0a, 0x11, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, - 0x64, 0x5f, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, - 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, - 0x12, 0x2b, 0x0a, 0x11, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x5f, 0x70, - 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x73, 0x65, 0x72, - 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x20, 0x0a, - 0x0b, 0x70, 0x61, 0x72, 0x61, 0x6c, 0x6c, 0x65, 0x6c, 0x69, 0x73, 0x6d, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x05, 0x52, 0x0b, 0x70, 0x61, 0x72, 0x61, 0x6c, 0x6c, 0x65, 0x6c, 0x69, 0x73, 0x6d, 0x12, - 0x3a, 0x0a, 0x1a, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x68, - 0x5f, 0x74, 0x6f, 0x5f, 0x6d, 0x61, 0x69, 0x6e, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x18, 0x05, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x16, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x76, 0x65, 0x50, 0x61, 0x74, - 0x68, 0x54, 0x6f, 0x4d, 0x61, 0x69, 0x6e, 0x46, 0x69, 0x6c, 0x65, 0x12, 0x2c, 0x0a, 0x12, 0x6d, - 0x61, 0x69, 0x6e, 0x5f, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, - 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x6d, 0x61, 0x69, 0x6e, 0x46, 0x75, 0x6e, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x5b, 0x0a, 0x15, 0x65, 0x78, 0x70, - 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x5f, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, - 0x65, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x26, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, - 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x4b, 0x75, 0x72, - 0x74, 0x6f, 0x73, 0x69, 0x73, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x46, 0x6c, 0x61, 0x67, - 0x52, 0x14, 0x65, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x46, 0x65, - 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x12, 0x47, 0x0a, 0x0e, 0x72, 0x65, 0x73, 0x74, 0x61, 0x72, - 0x74, 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x20, - 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, - 0x70, 0x69, 0x2e, 0x52, 0x65, 0x73, 0x74, 0x61, 0x72, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, - 0x52, 0x0d, 0x72, 0x65, 0x73, 0x74, 0x61, 0x72, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, - 0x3f, 0x0a, 0x19, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x5f, 0x73, 0x65, 0x72, 0x69, 0x61, - 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x09, 0x20, 0x01, - 0x28, 0x09, 0x48, 0x00, 0x52, 0x17, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x53, 0x65, 0x72, - 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x88, 0x01, 0x01, - 0x42, 0x1c, 0x0a, 0x1a, 0x5f, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x5f, 0x73, 0x65, 0x72, - 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x22, 0x27, - 0x0a, 0x08, 0x50, 0x6c, 0x61, 0x6e, 0x59, 0x61, 0x6d, 0x6c, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x6c, - 0x61, 0x6e, 0x5f, 0x79, 0x61, 0x6d, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, - 0x6c, 0x61, 0x6e, 0x59, 0x61, 0x6d, 0x6c, 0x22, 0xdb, 0x01, 0x0a, 0x1a, 0x53, 0x74, 0x61, 0x72, - 0x6c, 0x61, 0x72, 0x6b, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, 0x50, 0x6c, 0x61, 0x6e, 0x59, 0x61, - 0x6d, 0x6c, 0x41, 0x72, 0x67, 0x73, 0x12, 0x2b, 0x0a, 0x11, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, - 0x69, 0x7a, 0x65, 0x64, 0x5f, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x10, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x53, 0x63, 0x72, - 0x69, 0x70, 0x74, 0x12, 0x30, 0x0a, 0x11, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, - 0x64, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, - 0x52, 0x10, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x50, 0x61, 0x72, 0x61, - 0x6d, 0x73, 0x88, 0x01, 0x01, 0x12, 0x31, 0x0a, 0x12, 0x6d, 0x61, 0x69, 0x6e, 0x5f, 0x66, 0x75, - 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, - 0x09, 0x48, 0x01, 0x52, 0x10, 0x6d, 0x61, 0x69, 0x6e, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x88, 0x01, 0x01, 0x42, 0x14, 0x0a, 0x12, 0x5f, 0x73, 0x65, 0x72, - 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x42, 0x15, - 0x0a, 0x13, 0x5f, 0x6d, 0x61, 0x69, 0x6e, 0x5f, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0xcb, 0x02, 0x0a, 0x1b, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, - 0x72, 0x6b, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x50, 0x6c, 0x61, 0x6e, 0x59, 0x61, 0x6d, - 0x6c, 0x41, 0x72, 0x67, 0x73, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, - 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x70, 0x61, 0x63, 0x6b, 0x61, - 0x67, 0x65, 0x49, 0x64, 0x12, 0x30, 0x0a, 0x11, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, - 0x65, 0x64, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, - 0x00, 0x52, 0x10, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x50, 0x61, 0x72, - 0x61, 0x6d, 0x73, 0x88, 0x01, 0x01, 0x12, 0x1b, 0x0a, 0x09, 0x69, 0x73, 0x5f, 0x72, 0x65, 0x6d, - 0x6f, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x69, 0x73, 0x52, 0x65, 0x6d, - 0x6f, 0x74, 0x65, 0x12, 0x3f, 0x0a, 0x1a, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x76, 0x65, 0x5f, + 0x61, 0x63, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x5a, 0x0a, 0x13, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, + 0x5f, 0x61, 0x6e, 0x64, 0x5f, 0x75, 0x75, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x2b, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, + 0x61, 0x70, 0x69, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, + 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x41, 0x6e, 0x64, 0x55, 0x75, 0x69, 0x64, 0x52, 0x10, 0x66, 0x69, + 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x41, 0x6e, 0x64, 0x55, 0x75, 0x69, 0x64, 0x22, 0x8b, + 0x01, 0x0a, 0x24, 0x49, 0x6e, 0x73, 0x70, 0x65, 0x63, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x41, + 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x63, 0x0a, 0x11, 0x66, 0x69, 0x6c, 0x65, 0x5f, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x36, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, + 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x41, 0x72, 0x74, 0x69, 0x66, + 0x61, 0x63, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x46, 0x69, 0x6c, 0x65, 0x44, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x10, 0x66, 0x69, 0x6c, 0x65, + 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x86, 0x01, 0x0a, + 0x23, 0x46, 0x69, 0x6c, 0x65, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x43, 0x6f, 0x6e, + 0x74, 0x65, 0x6e, 0x74, 0x73, 0x46, 0x69, 0x6c, 0x65, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x69, 0x7a, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x12, 0x26, 0x0a, 0x0c, + 0x74, 0x65, 0x78, 0x74, 0x5f, 0x70, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x09, 0x48, 0x00, 0x52, 0x0b, 0x74, 0x65, 0x78, 0x74, 0x50, 0x72, 0x65, 0x76, 0x69, 0x65, + 0x77, 0x88, 0x01, 0x01, 0x42, 0x0f, 0x0a, 0x0d, 0x5f, 0x74, 0x65, 0x78, 0x74, 0x5f, 0x70, 0x72, + 0x65, 0x76, 0x69, 0x65, 0x77, 0x22, 0x4b, 0x0a, 0x13, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, + 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x41, 0x72, 0x67, 0x73, 0x12, 0x34, 0x0a, 0x07, + 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1a, 0x2e, + 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, + 0x69, 0x2e, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x6e, 0x65, + 0x63, 0x74, 0x22, 0x19, 0x0a, 0x17, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x53, 0x65, 0x72, + 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xa2, 0x04, + 0x0a, 0x16, 0x47, 0x65, 0x74, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x52, 0x75, 0x6e, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x61, 0x63, 0x6b, + 0x61, 0x67, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x70, 0x61, + 0x63, 0x6b, 0x61, 0x67, 0x65, 0x49, 0x64, 0x12, 0x2b, 0x0a, 0x11, 0x73, 0x65, 0x72, 0x69, 0x61, + 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x5f, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x10, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x53, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x12, 0x2b, 0x0a, 0x11, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, + 0x65, 0x64, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x10, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x50, 0x61, 0x72, 0x61, 0x6d, + 0x73, 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x61, 0x72, 0x61, 0x6c, 0x6c, 0x65, 0x6c, 0x69, 0x73, 0x6d, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0b, 0x70, 0x61, 0x72, 0x61, 0x6c, 0x6c, 0x65, 0x6c, + 0x69, 0x73, 0x6d, 0x12, 0x3a, 0x0a, 0x1a, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x5f, 0x74, 0x6f, 0x5f, 0x6d, 0x61, 0x69, 0x6e, 0x5f, 0x66, 0x69, 0x6c, - 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x16, 0x72, 0x65, 0x6c, 0x61, 0x74, - 0x69, 0x76, 0x65, 0x50, 0x61, 0x74, 0x68, 0x54, 0x6f, 0x4d, 0x61, 0x69, 0x6e, 0x46, 0x69, 0x6c, - 0x65, 0x88, 0x01, 0x01, 0x12, 0x31, 0x0a, 0x12, 0x6d, 0x61, 0x69, 0x6e, 0x5f, 0x66, 0x75, 0x6e, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, - 0x48, 0x02, 0x52, 0x10, 0x6d, 0x61, 0x69, 0x6e, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x4e, 0x61, 0x6d, 0x65, 0x88, 0x01, 0x01, 0x42, 0x14, 0x0a, 0x12, 0x5f, 0x73, 0x65, 0x72, 0x69, - 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x42, 0x1d, 0x0a, - 0x1b, 0x5f, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x5f, - 0x74, 0x6f, 0x5f, 0x6d, 0x61, 0x69, 0x6e, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x42, 0x15, 0x0a, 0x13, - 0x5f, 0x6d, 0x61, 0x69, 0x6e, 0x5f, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, - 0x61, 0x6d, 0x65, 0x2a, 0x36, 0x0a, 0x0d, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x12, 0x0b, 0x0a, 0x07, 0x53, 0x54, 0x4f, 0x50, 0x50, 0x45, 0x44, 0x10, - 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x52, 0x55, 0x4e, 0x4e, 0x49, 0x4e, 0x47, 0x10, 0x01, 0x12, 0x0b, - 0x0a, 0x07, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x02, 0x2a, 0x2c, 0x0a, 0x11, 0x49, - 0x6d, 0x61, 0x67, 0x65, 0x44, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x4d, 0x6f, 0x64, 0x65, - 0x12, 0x0a, 0x0a, 0x06, 0x61, 0x6c, 0x77, 0x61, 0x79, 0x73, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, - 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x10, 0x01, 0x2a, 0x26, 0x0a, 0x07, 0x43, 0x6f, 0x6e, - 0x6e, 0x65, 0x63, 0x74, 0x12, 0x0b, 0x0a, 0x07, 0x43, 0x4f, 0x4e, 0x4e, 0x45, 0x43, 0x54, 0x10, - 0x00, 0x12, 0x0e, 0x0a, 0x0a, 0x4e, 0x4f, 0x5f, 0x43, 0x4f, 0x4e, 0x4e, 0x45, 0x43, 0x54, 0x10, - 0x01, 0x2a, 0x32, 0x0a, 0x13, 0x4b, 0x75, 0x72, 0x74, 0x6f, 0x73, 0x69, 0x73, 0x46, 0x65, 0x61, - 0x74, 0x75, 0x72, 0x65, 0x46, 0x6c, 0x61, 0x67, 0x12, 0x1b, 0x0a, 0x17, 0x4e, 0x4f, 0x5f, 0x49, - 0x4e, 0x53, 0x54, 0x52, 0x55, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x53, 0x5f, 0x43, 0x41, 0x43, 0x48, - 0x49, 0x4e, 0x47, 0x10, 0x00, 0x2a, 0x26, 0x0a, 0x0d, 0x52, 0x65, 0x73, 0x74, 0x61, 0x72, 0x74, - 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x09, 0x0a, 0x05, 0x4e, 0x45, 0x56, 0x45, 0x52, 0x10, - 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x41, 0x4c, 0x57, 0x41, 0x59, 0x53, 0x10, 0x01, 0x32, 0xa6, 0x10, - 0x0a, 0x13, 0x41, 0x70, 0x69, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x53, 0x65, - 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x6d, 0x0a, 0x11, 0x52, 0x75, 0x6e, 0x53, 0x74, 0x61, 0x72, - 0x6c, 0x61, 0x72, 0x6b, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, 0x12, 0x28, 0x2e, 0x61, 0x70, 0x69, - 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x52, - 0x75, 0x6e, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x16, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x76, + 0x65, 0x50, 0x61, 0x74, 0x68, 0x54, 0x6f, 0x4d, 0x61, 0x69, 0x6e, 0x46, 0x69, 0x6c, 0x65, 0x12, + 0x2c, 0x0a, 0x12, 0x6d, 0x61, 0x69, 0x6e, 0x5f, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x6d, 0x61, 0x69, + 0x6e, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x5b, 0x0a, + 0x15, 0x65, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x5f, 0x66, 0x65, + 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x26, 0x2e, 0x61, + 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, + 0x2e, 0x4b, 0x75, 0x72, 0x74, 0x6f, 0x73, 0x69, 0x73, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, + 0x46, 0x6c, 0x61, 0x67, 0x52, 0x14, 0x65, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, + 0x61, 0x6c, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x12, 0x47, 0x0a, 0x0e, 0x72, 0x65, + 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x18, 0x08, 0x20, 0x01, + 0x28, 0x0e, 0x32, 0x20, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, + 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x65, 0x73, 0x74, 0x61, 0x72, 0x74, 0x50, 0x6f, + 0x6c, 0x69, 0x63, 0x79, 0x52, 0x0d, 0x72, 0x65, 0x73, 0x74, 0x61, 0x72, 0x74, 0x50, 0x6f, 0x6c, + 0x69, 0x63, 0x79, 0x12, 0x3f, 0x0a, 0x19, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x5f, 0x73, + 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, + 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x17, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, + 0x6c, 0x53, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x50, 0x61, 0x72, 0x61, 0x6d, + 0x73, 0x88, 0x01, 0x01, 0x42, 0x1c, 0x0a, 0x1a, 0x5f, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, + 0x5f, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x5f, 0x70, 0x61, 0x72, 0x61, + 0x6d, 0x73, 0x22, 0x27, 0x0a, 0x08, 0x50, 0x6c, 0x61, 0x6e, 0x59, 0x61, 0x6d, 0x6c, 0x12, 0x1b, + 0x0a, 0x09, 0x70, 0x6c, 0x61, 0x6e, 0x5f, 0x79, 0x61, 0x6d, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x08, 0x70, 0x6c, 0x61, 0x6e, 0x59, 0x61, 0x6d, 0x6c, 0x22, 0xdb, 0x01, 0x0a, 0x1a, + 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, 0x50, 0x6c, + 0x61, 0x6e, 0x59, 0x61, 0x6d, 0x6c, 0x41, 0x72, 0x67, 0x73, 0x12, 0x2b, 0x0a, 0x11, 0x73, 0x65, + 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x5f, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, + 0x64, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, 0x12, 0x30, 0x0a, 0x11, 0x73, 0x65, 0x72, 0x69, 0x61, + 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x48, 0x00, 0x52, 0x10, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, + 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x88, 0x01, 0x01, 0x12, 0x31, 0x0a, 0x12, 0x6d, 0x61, 0x69, + 0x6e, 0x5f, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, + 0x05, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x10, 0x6d, 0x61, 0x69, 0x6e, 0x46, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x88, 0x01, 0x01, 0x42, 0x14, 0x0a, 0x12, + 0x5f, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x5f, 0x70, 0x61, 0x72, 0x61, + 0x6d, 0x73, 0x42, 0x15, 0x0a, 0x13, 0x5f, 0x6d, 0x61, 0x69, 0x6e, 0x5f, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0xcb, 0x02, 0x0a, 0x1b, 0x53, 0x74, + 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x50, 0x6c, 0x61, + 0x6e, 0x59, 0x61, 0x6d, 0x6c, 0x41, 0x72, 0x67, 0x73, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x61, 0x63, + 0x6b, 0x61, 0x67, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x70, + 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x49, 0x64, 0x12, 0x30, 0x0a, 0x11, 0x73, 0x65, 0x72, 0x69, + 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x10, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, + 0x64, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x88, 0x01, 0x01, 0x12, 0x1b, 0x0a, 0x09, 0x69, 0x73, + 0x5f, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x69, + 0x73, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x12, 0x3f, 0x0a, 0x1a, 0x72, 0x65, 0x6c, 0x61, 0x74, + 0x69, 0x76, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x5f, 0x74, 0x6f, 0x5f, 0x6d, 0x61, 0x69, 0x6e, + 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x16, 0x72, + 0x65, 0x6c, 0x61, 0x74, 0x69, 0x76, 0x65, 0x50, 0x61, 0x74, 0x68, 0x54, 0x6f, 0x4d, 0x61, 0x69, + 0x6e, 0x46, 0x69, 0x6c, 0x65, 0x88, 0x01, 0x01, 0x12, 0x31, 0x0a, 0x12, 0x6d, 0x61, 0x69, 0x6e, + 0x5f, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x09, 0x48, 0x02, 0x52, 0x10, 0x6d, 0x61, 0x69, 0x6e, 0x46, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x88, 0x01, 0x01, 0x42, 0x14, 0x0a, 0x12, 0x5f, + 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, + 0x73, 0x42, 0x1d, 0x0a, 0x1b, 0x5f, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x70, + 0x61, 0x74, 0x68, 0x5f, 0x74, 0x6f, 0x5f, 0x6d, 0x61, 0x69, 0x6e, 0x5f, 0x66, 0x69, 0x6c, 0x65, + 0x42, 0x15, 0x0a, 0x13, 0x5f, 0x6d, 0x61, 0x69, 0x6e, 0x5f, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x2a, 0x36, 0x0a, 0x0d, 0x53, 0x65, 0x72, 0x76, 0x69, + 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x0b, 0x0a, 0x07, 0x53, 0x54, 0x4f, 0x50, + 0x50, 0x45, 0x44, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x52, 0x55, 0x4e, 0x4e, 0x49, 0x4e, 0x47, + 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x02, 0x2a, + 0x2c, 0x0a, 0x11, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x44, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, + 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x0a, 0x0a, 0x06, 0x61, 0x6c, 0x77, 0x61, 0x79, 0x73, 0x10, 0x00, + 0x12, 0x0b, 0x0a, 0x07, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x10, 0x01, 0x2a, 0x26, 0x0a, + 0x07, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x12, 0x0b, 0x0a, 0x07, 0x43, 0x4f, 0x4e, 0x4e, + 0x45, 0x43, 0x54, 0x10, 0x00, 0x12, 0x0e, 0x0a, 0x0a, 0x4e, 0x4f, 0x5f, 0x43, 0x4f, 0x4e, 0x4e, + 0x45, 0x43, 0x54, 0x10, 0x01, 0x2a, 0x32, 0x0a, 0x13, 0x4b, 0x75, 0x72, 0x74, 0x6f, 0x73, 0x69, + 0x73, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x46, 0x6c, 0x61, 0x67, 0x12, 0x1b, 0x0a, 0x17, + 0x4e, 0x4f, 0x5f, 0x49, 0x4e, 0x53, 0x54, 0x52, 0x55, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x53, 0x5f, + 0x43, 0x41, 0x43, 0x48, 0x49, 0x4e, 0x47, 0x10, 0x00, 0x2a, 0x26, 0x0a, 0x0d, 0x52, 0x65, 0x73, + 0x74, 0x61, 0x72, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x09, 0x0a, 0x05, 0x4e, 0x45, + 0x56, 0x45, 0x52, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x41, 0x4c, 0x57, 0x41, 0x59, 0x53, 0x10, + 0x01, 0x32, 0xa6, 0x10, 0x0a, 0x13, 0x41, 0x70, 0x69, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, + 0x65, 0x72, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x6d, 0x0a, 0x11, 0x52, 0x75, 0x6e, + 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, 0x12, 0x28, + 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, + 0x70, 0x69, 0x2e, 0x52, 0x75, 0x6e, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x53, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x41, 0x72, 0x67, 0x73, 0x1a, 0x2a, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, + 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, 0x61, + 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x52, 0x75, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x4c, 0x69, 0x6e, 0x65, 0x22, 0x00, 0x30, 0x01, 0x12, 0x59, 0x0a, 0x15, 0x55, 0x70, 0x6c, 0x6f, + 0x61, 0x64, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, + 0x65, 0x12, 0x24, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, + 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x65, 0x64, 0x44, 0x61, + 0x74, 0x61, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, + 0x00, 0x28, 0x01, 0x12, 0x6f, 0x0a, 0x12, 0x52, 0x75, 0x6e, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, + 0x72, 0x6b, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x12, 0x29, 0x2e, 0x61, 0x70, 0x69, 0x5f, + 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x75, + 0x6e, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x41, 0x72, 0x67, 0x73, 0x1a, 0x2a, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x52, 0x75, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x4c, 0x69, 0x6e, 0x65, - 0x22, 0x00, 0x30, 0x01, 0x12, 0x59, 0x0a, 0x15, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x53, 0x74, - 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x12, 0x24, 0x2e, - 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, - 0x69, 0x2e, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x65, 0x64, 0x44, 0x61, 0x74, 0x61, 0x43, 0x68, - 0x75, 0x6e, 0x6b, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x28, 0x01, 0x12, - 0x6f, 0x0a, 0x12, 0x52, 0x75, 0x6e, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x50, 0x61, - 0x63, 0x6b, 0x61, 0x67, 0x65, 0x12, 0x29, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, - 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x75, 0x6e, 0x53, 0x74, 0x61, - 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x41, 0x72, 0x67, 0x73, - 0x1a, 0x2a, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, - 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x52, 0x75, 0x6e, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x4c, 0x69, 0x6e, 0x65, 0x22, 0x00, 0x30, 0x01, - 0x12, 0x5b, 0x0a, 0x0b, 0x47, 0x65, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x12, - 0x22, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, - 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x41, - 0x72, 0x67, 0x73, 0x1a, 0x26, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, + 0x22, 0x00, 0x30, 0x01, 0x12, 0x5b, 0x0a, 0x0b, 0x47, 0x65, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, + 0x63, 0x65, 0x73, 0x12, 0x22, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, - 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x8d, 0x01, - 0x0a, 0x2a, 0x47, 0x65, 0x74, 0x45, 0x78, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x41, 0x6e, 0x64, - 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x69, 0x63, 0x61, 0x6c, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, - 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x73, 0x12, 0x16, 0x2e, 0x67, - 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, - 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x45, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, - 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x78, 0x69, 0x73, - 0x74, 0x69, 0x6e, 0x67, 0x41, 0x6e, 0x64, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x69, 0x63, 0x61, - 0x6c, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, - 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x5b, 0x0a, - 0x0b, 0x45, 0x78, 0x65, 0x63, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x22, 0x2e, 0x61, - 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, - 0x2e, 0x45, 0x78, 0x65, 0x63, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x41, 0x72, 0x67, 0x73, - 0x1a, 0x26, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, + 0x63, 0x65, 0x73, 0x41, 0x72, 0x67, 0x73, 0x1a, 0x26, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, + 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x53, + 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x00, 0x12, 0x8d, 0x01, 0x0a, 0x2a, 0x47, 0x65, 0x74, 0x45, 0x78, 0x69, 0x73, 0x74, 0x69, 0x6e, + 0x67, 0x41, 0x6e, 0x64, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x69, 0x63, 0x61, 0x6c, 0x53, 0x65, + 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x73, + 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, + 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x45, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, + 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, + 0x45, 0x78, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x41, 0x6e, 0x64, 0x48, 0x69, 0x73, 0x74, 0x6f, + 0x72, 0x69, 0x63, 0x61, 0x6c, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x65, 0x6e, + 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x00, 0x12, 0x5b, 0x0a, 0x0b, 0x45, 0x78, 0x65, 0x63, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, + 0x12, 0x22, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x79, 0x0a, 0x22, 0x57, 0x61, - 0x69, 0x74, 0x46, 0x6f, 0x72, 0x48, 0x74, 0x74, 0x70, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x64, 0x70, + 0x41, 0x72, 0x67, 0x73, 0x1a, 0x26, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, + 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x43, 0x6f, 0x6d, + 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x79, + 0x0a, 0x22, 0x57, 0x61, 0x69, 0x74, 0x46, 0x6f, 0x72, 0x48, 0x74, 0x74, 0x70, 0x47, 0x65, 0x74, + 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x69, + 0x6c, 0x69, 0x74, 0x79, 0x12, 0x39, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, + 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x57, 0x61, 0x69, 0x74, 0x46, 0x6f, 0x72, + 0x48, 0x74, 0x74, 0x70, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x41, + 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x41, 0x72, 0x67, 0x73, 0x1a, + 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, + 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x7b, 0x0a, 0x23, 0x57, 0x61, 0x69, + 0x74, 0x46, 0x6f, 0x72, 0x48, 0x74, 0x74, 0x70, 0x50, 0x6f, 0x73, 0x74, 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, - 0x12, 0x39, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, + 0x12, 0x3a, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x57, 0x61, 0x69, 0x74, 0x46, 0x6f, 0x72, 0x48, 0x74, 0x74, 0x70, - 0x47, 0x65, 0x74, 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x41, 0x76, 0x61, 0x69, 0x6c, - 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x41, 0x72, 0x67, 0x73, 0x1a, 0x16, 0x2e, 0x67, 0x6f, - 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, - 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x7b, 0x0a, 0x23, 0x57, 0x61, 0x69, 0x74, 0x46, 0x6f, 0x72, - 0x48, 0x74, 0x74, 0x70, 0x50, 0x6f, 0x73, 0x74, 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, - 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x12, 0x3a, 0x2e, 0x61, - 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, - 0x2e, 0x57, 0x61, 0x69, 0x74, 0x46, 0x6f, 0x72, 0x48, 0x74, 0x74, 0x70, 0x50, 0x6f, 0x73, 0x74, - 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x69, - 0x6c, 0x69, 0x74, 0x79, 0x41, 0x72, 0x67, 0x73, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, - 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, - 0x22, 0x00, 0x12, 0x6f, 0x0a, 0x13, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x46, 0x69, 0x6c, 0x65, - 0x73, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x12, 0x24, 0x2e, 0x61, 0x70, 0x69, 0x5f, - 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, - 0x72, 0x65, 0x61, 0x6d, 0x65, 0x64, 0x44, 0x61, 0x74, 0x61, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x1a, - 0x2e, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, - 0x61, 0x70, 0x69, 0x2e, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x41, - 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x00, 0x28, 0x01, 0x12, 0x6f, 0x0a, 0x15, 0x44, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x46, - 0x69, 0x6c, 0x65, 0x73, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x12, 0x2c, 0x2e, 0x61, - 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, - 0x2e, 0x44, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x72, - 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x41, 0x72, 0x67, 0x73, 0x1a, 0x24, 0x2e, 0x61, 0x70, 0x69, - 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x53, - 0x74, 0x72, 0x65, 0x61, 0x6d, 0x65, 0x64, 0x44, 0x61, 0x74, 0x61, 0x43, 0x68, 0x75, 0x6e, 0x6b, - 0x22, 0x00, 0x30, 0x01, 0x12, 0x79, 0x0a, 0x15, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x57, 0x65, 0x62, - 0x46, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x12, 0x2c, 0x2e, - 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, - 0x69, 0x2e, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x57, 0x65, 0x62, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x41, - 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x41, 0x72, 0x67, 0x73, 0x1a, 0x30, 0x2e, 0x61, 0x70, - 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, - 0x53, 0x74, 0x6f, 0x72, 0x65, 0x57, 0x65, 0x62, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x72, 0x74, - 0x69, 0x66, 0x61, 0x63, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, - 0x91, 0x01, 0x0a, 0x1d, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x72, - 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x46, 0x72, 0x6f, 0x6d, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, - 0x65, 0x12, 0x34, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, - 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x46, 0x69, 0x6c, 0x65, 0x73, - 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x46, 0x72, 0x6f, 0x6d, 0x53, 0x65, 0x72, 0x76, - 0x69, 0x63, 0x65, 0x41, 0x72, 0x67, 0x73, 0x1a, 0x38, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, - 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, 0x6f, 0x72, - 0x65, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x46, 0x72, - 0x6f, 0x6d, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x00, 0x12, 0x75, 0x0a, 0x1e, 0x4c, 0x69, 0x73, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x73, - 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x41, 0x6e, 0x64, - 0x55, 0x75, 0x69, 0x64, 0x73, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x39, 0x2e, + 0x50, 0x6f, 0x73, 0x74, 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x41, 0x76, 0x61, 0x69, + 0x6c, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x41, 0x72, 0x67, 0x73, 0x1a, 0x16, 0x2e, 0x67, + 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, + 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x6f, 0x0a, 0x13, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, + 0x46, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x12, 0x24, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, - 0x69, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x72, 0x74, 0x69, 0x66, - 0x61, 0x63, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x41, 0x6e, 0x64, 0x55, 0x75, 0x69, 0x64, 0x73, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x91, 0x01, 0x0a, 0x1c, 0x49, - 0x6e, 0x73, 0x70, 0x65, 0x63, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x72, 0x74, 0x69, 0x66, - 0x61, 0x63, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x36, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x65, 0x64, 0x44, 0x61, 0x74, 0x61, 0x43, 0x68, + 0x75, 0x6e, 0x6b, 0x1a, 0x2e, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, + 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x46, 0x69, + 0x6c, 0x65, 0x73, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x00, 0x28, 0x01, 0x12, 0x6f, 0x0a, 0x15, 0x44, 0x6f, 0x77, 0x6e, 0x6c, + 0x6f, 0x61, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, + 0x12, 0x2c, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, + 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x44, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x46, 0x69, 0x6c, + 0x65, 0x73, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x41, 0x72, 0x67, 0x73, 0x1a, 0x24, + 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, + 0x70, 0x69, 0x2e, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x65, 0x64, 0x44, 0x61, 0x74, 0x61, 0x43, + 0x68, 0x75, 0x6e, 0x6b, 0x22, 0x00, 0x30, 0x01, 0x12, 0x79, 0x0a, 0x15, 0x53, 0x74, 0x6f, 0x72, + 0x65, 0x57, 0x65, 0x62, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, + 0x74, 0x12, 0x2c, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, + 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x57, 0x65, 0x62, 0x46, 0x69, + 0x6c, 0x65, 0x73, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x41, 0x72, 0x67, 0x73, 0x1a, + 0x30, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, + 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x57, 0x65, 0x62, 0x46, 0x69, 0x6c, 0x65, + 0x73, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x00, 0x12, 0x91, 0x01, 0x0a, 0x1d, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x46, 0x69, 0x6c, + 0x65, 0x73, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x46, 0x72, 0x6f, 0x6d, 0x53, 0x65, + 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x34, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, + 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x46, + 0x69, 0x6c, 0x65, 0x73, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x46, 0x72, 0x6f, 0x6d, + 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x41, 0x72, 0x67, 0x73, 0x1a, 0x38, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, - 0x49, 0x6e, 0x73, 0x70, 0x65, 0x63, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x72, 0x74, 0x69, - 0x66, 0x61, 0x63, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x37, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, - 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x49, 0x6e, 0x73, 0x70, 0x65, 0x63, 0x74, 0x46, - 0x69, 0x6c, 0x65, 0x73, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x43, 0x6f, 0x6e, 0x74, - 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x67, - 0x0a, 0x0f, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, - 0x73, 0x12, 0x26, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, - 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x53, 0x65, 0x72, - 0x76, 0x69, 0x63, 0x65, 0x73, 0x41, 0x72, 0x67, 0x73, 0x1a, 0x2a, 0x2e, 0x61, 0x70, 0x69, 0x5f, - 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x43, 0x6f, - 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x55, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x53, 0x74, - 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x52, 0x75, 0x6e, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, + 0x53, 0x74, 0x6f, 0x72, 0x65, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, + 0x63, 0x74, 0x46, 0x72, 0x6f, 0x6d, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x75, 0x0a, 0x1e, 0x4c, 0x69, 0x73, 0x74, 0x46, + 0x69, 0x6c, 0x65, 0x73, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x4e, 0x61, 0x6d, 0x65, + 0x73, 0x41, 0x6e, 0x64, 0x55, 0x75, 0x69, 0x64, 0x73, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, - 0x79, 0x1a, 0x29, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, - 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, - 0x6b, 0x52, 0x75, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x69, - 0x0a, 0x19, 0x47, 0x65, 0x74, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x53, 0x63, 0x72, - 0x69, 0x70, 0x74, 0x50, 0x6c, 0x61, 0x6e, 0x59, 0x61, 0x6d, 0x6c, 0x12, 0x2d, 0x2e, 0x61, 0x70, + 0x79, 0x1a, 0x39, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, + 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x41, + 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x41, 0x6e, 0x64, 0x55, + 0x75, 0x69, 0x64, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x91, + 0x01, 0x0a, 0x1c, 0x49, 0x6e, 0x73, 0x70, 0x65, 0x63, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x41, + 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x12, + 0x36, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, + 0x61, 0x70, 0x69, 0x2e, 0x49, 0x6e, 0x73, 0x70, 0x65, 0x63, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x73, + 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x37, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, + 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x49, 0x6e, 0x73, 0x70, + 0x65, 0x63, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, + 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x00, 0x12, 0x67, 0x0a, 0x0f, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x53, 0x65, 0x72, + 0x76, 0x69, 0x63, 0x65, 0x73, 0x12, 0x26, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, + 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, + 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x41, 0x72, 0x67, 0x73, 0x1a, 0x2a, 0x2e, + 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, + 0x69, 0x2e, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, + 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x55, 0x0a, 0x0e, 0x47, + 0x65, 0x74, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x52, 0x75, 0x6e, 0x12, 0x16, 0x2e, + 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, + 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x29, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, + 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x74, 0x61, + 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x52, 0x75, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x00, 0x12, 0x69, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, + 0x6b, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, 0x50, 0x6c, 0x61, 0x6e, 0x59, 0x61, 0x6d, 0x6c, 0x12, + 0x2d, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, + 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x53, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x50, 0x6c, 0x61, 0x6e, 0x59, 0x61, 0x6d, 0x6c, 0x41, 0x72, 0x67, 0x73, 0x1a, 0x1b, + 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, + 0x70, 0x69, 0x2e, 0x50, 0x6c, 0x61, 0x6e, 0x59, 0x61, 0x6d, 0x6c, 0x22, 0x00, 0x12, 0x6b, 0x0a, + 0x1a, 0x47, 0x65, 0x74, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x50, 0x61, 0x63, 0x6b, + 0x61, 0x67, 0x65, 0x50, 0x6c, 0x61, 0x6e, 0x59, 0x61, 0x6d, 0x6c, 0x12, 0x2e, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, - 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, 0x50, 0x6c, - 0x61, 0x6e, 0x59, 0x61, 0x6d, 0x6c, 0x41, 0x72, 0x67, 0x73, 0x1a, 0x1b, 0x2e, 0x61, 0x70, 0x69, - 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x50, - 0x6c, 0x61, 0x6e, 0x59, 0x61, 0x6d, 0x6c, 0x22, 0x00, 0x12, 0x6b, 0x0a, 0x1a, 0x47, 0x65, 0x74, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x50, - 0x6c, 0x61, 0x6e, 0x59, 0x61, 0x6d, 0x6c, 0x12, 0x2e, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, - 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, 0x61, 0x72, - 0x6c, 0x61, 0x72, 0x6b, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x50, 0x6c, 0x61, 0x6e, 0x59, - 0x61, 0x6d, 0x6c, 0x41, 0x72, 0x67, 0x73, 0x1a, 0x1b, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, - 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x50, 0x6c, 0x61, 0x6e, - 0x59, 0x61, 0x6d, 0x6c, 0x22, 0x00, 0x42, 0x52, 0x5a, 0x50, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, - 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6b, 0x75, 0x72, 0x74, 0x6f, 0x73, 0x69, 0x73, 0x2d, 0x74, 0x65, - 0x63, 0x68, 0x2f, 0x6b, 0x75, 0x72, 0x74, 0x6f, 0x73, 0x69, 0x73, 0x2f, 0x61, 0x70, 0x69, 0x2f, - 0x67, 0x6f, 0x6c, 0x61, 0x6e, 0x67, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x6b, 0x75, 0x72, 0x74, - 0x6f, 0x73, 0x69, 0x73, 0x5f, 0x63, 0x6f, 0x72, 0x65, 0x5f, 0x72, 0x70, 0x63, 0x5f, 0x61, 0x70, - 0x69, 0x5f, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x73, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x33, + 0x6c, 0x61, 0x6e, 0x59, 0x61, 0x6d, 0x6c, 0x41, 0x72, 0x67, 0x73, 0x1a, 0x1b, 0x2e, 0x61, 0x70, + 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, + 0x50, 0x6c, 0x61, 0x6e, 0x59, 0x61, 0x6d, 0x6c, 0x22, 0x00, 0x42, 0x52, 0x5a, 0x50, 0x67, 0x69, + 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6b, 0x75, 0x72, 0x74, 0x6f, 0x73, 0x69, + 0x73, 0x2d, 0x74, 0x65, 0x63, 0x68, 0x2f, 0x6b, 0x75, 0x72, 0x74, 0x6f, 0x73, 0x69, 0x73, 0x2f, + 0x61, 0x70, 0x69, 0x2f, 0x67, 0x6f, 0x6c, 0x61, 0x6e, 0x67, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, + 0x6b, 0x75, 0x72, 0x74, 0x6f, 0x73, 0x69, 0x73, 0x5f, 0x63, 0x6f, 0x72, 0x65, 0x5f, 0x72, 0x70, + 0x63, 0x5f, 0x61, 0x70, 0x69, 0x5f, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x73, 0x62, 0x06, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -4296,7 +4365,7 @@ func file_api_container_service_proto_rawDescGZIP() []byte { } var file_api_container_service_proto_enumTypes = make([]protoimpl.EnumInfo, 7) -var file_api_container_service_proto_msgTypes = make([]protoimpl.MessageInfo, 50) +var file_api_container_service_proto_msgTypes = make([]protoimpl.MessageInfo, 51) var file_api_container_service_proto_goTypes = []interface{}{ (ServiceStatus)(0), // 0: api_container_api.ServiceStatus (ImageDownloadMode)(0), // 1: api_container_api.ImageDownloadMode @@ -4353,9 +4422,10 @@ var file_api_container_service_proto_goTypes = []interface{}{ nil, // 52: api_container_api.Container.EnvVarsEntry nil, // 53: api_container_api.ServiceInfo.PrivatePortsEntry nil, // 54: api_container_api.ServiceInfo.MaybePublicPortsEntry - nil, // 55: api_container_api.GetServicesArgs.ServiceIdentifiersEntry - nil, // 56: api_container_api.GetServicesResponse.ServiceInfoEntry - (*emptypb.Empty)(nil), // 57: google.protobuf.Empty + nil, // 55: api_container_api.ServiceInfo.ServiceDirPathsToFilesArtifactsIdentifiersEntry + nil, // 56: api_container_api.GetServicesArgs.ServiceIdentifiersEntry + nil, // 57: api_container_api.GetServicesResponse.ServiceInfoEntry + (*emptypb.Empty)(nil), // 58: google.protobuf.Empty } var file_api_container_service_proto_depIdxs = []int32{ 5, // 0: api_container_api.Port.transport_protocol:type_name -> api_container_api.Port.TransportProtocol @@ -4365,76 +4435,77 @@ var file_api_container_service_proto_depIdxs = []int32{ 54, // 4: api_container_api.ServiceInfo.maybe_public_ports:type_name -> api_container_api.ServiceInfo.MaybePublicPortsEntry 0, // 5: api_container_api.ServiceInfo.service_status:type_name -> api_container_api.ServiceStatus 8, // 6: api_container_api.ServiceInfo.container:type_name -> api_container_api.Container - 3, // 7: api_container_api.RunStarlarkScriptArgs.experimental_features:type_name -> api_container_api.KurtosisFeatureFlag - 1, // 8: api_container_api.RunStarlarkScriptArgs.image_download_mode:type_name -> api_container_api.ImageDownloadMode - 3, // 9: api_container_api.RunStarlarkPackageArgs.experimental_features:type_name -> api_container_api.KurtosisFeatureFlag - 1, // 10: api_container_api.RunStarlarkPackageArgs.image_download_mode:type_name -> api_container_api.ImageDownloadMode - 15, // 11: api_container_api.StarlarkRunResponseLine.instruction:type_name -> api_container_api.StarlarkInstruction - 19, // 12: api_container_api.StarlarkRunResponseLine.error:type_name -> api_container_api.StarlarkError - 23, // 13: api_container_api.StarlarkRunResponseLine.progress_info:type_name -> api_container_api.StarlarkRunProgress - 16, // 14: api_container_api.StarlarkRunResponseLine.instruction_result:type_name -> api_container_api.StarlarkInstructionResult - 24, // 15: api_container_api.StarlarkRunResponseLine.run_finished_event:type_name -> api_container_api.StarlarkRunFinishedEvent - 14, // 16: api_container_api.StarlarkRunResponseLine.warning:type_name -> api_container_api.StarlarkWarning - 13, // 17: api_container_api.StarlarkRunResponseLine.info:type_name -> api_container_api.StarlarkInfo - 18, // 18: api_container_api.StarlarkInstruction.position:type_name -> api_container_api.StarlarkInstructionPosition - 17, // 19: api_container_api.StarlarkInstruction.arguments:type_name -> api_container_api.StarlarkInstructionArg - 20, // 20: api_container_api.StarlarkError.interpretation_error:type_name -> api_container_api.StarlarkInterpretationError - 21, // 21: api_container_api.StarlarkError.validation_error:type_name -> api_container_api.StarlarkValidationError - 22, // 22: api_container_api.StarlarkError.execution_error:type_name -> api_container_api.StarlarkExecutionError - 55, // 23: api_container_api.GetServicesArgs.service_identifiers:type_name -> api_container_api.GetServicesArgs.ServiceIdentifiersEntry - 56, // 24: api_container_api.GetServicesResponse.service_info:type_name -> api_container_api.GetServicesResponse.ServiceInfoEntry - 27, // 25: api_container_api.GetExistingAndHistoricalServiceIdentifiersResponse.allIdentifiers:type_name -> api_container_api.ServiceIdentifiers - 34, // 26: api_container_api.StreamedDataChunk.metadata:type_name -> api_container_api.DataChunkMetadata - 41, // 27: api_container_api.ListFilesArtifactNamesAndUuidsResponse.file_names_and_uuids:type_name -> api_container_api.FilesArtifactNameAndUuid - 41, // 28: api_container_api.InspectFilesArtifactContentsRequest.file_names_and_uuid:type_name -> api_container_api.FilesArtifactNameAndUuid - 45, // 29: api_container_api.InspectFilesArtifactContentsResponse.file_descriptions:type_name -> api_container_api.FileArtifactContentsFileDescription - 2, // 30: api_container_api.ConnectServicesArgs.connect:type_name -> api_container_api.Connect - 3, // 31: api_container_api.GetStarlarkRunResponse.experimental_features:type_name -> api_container_api.KurtosisFeatureFlag - 4, // 32: api_container_api.GetStarlarkRunResponse.restart_policy:type_name -> api_container_api.RestartPolicy - 7, // 33: api_container_api.ServiceInfo.PrivatePortsEntry.value:type_name -> api_container_api.Port - 7, // 34: api_container_api.ServiceInfo.MaybePublicPortsEntry.value:type_name -> api_container_api.Port - 9, // 35: api_container_api.GetServicesResponse.ServiceInfoEntry.value:type_name -> api_container_api.ServiceInfo - 10, // 36: api_container_api.ApiContainerService.RunStarlarkScript:input_type -> api_container_api.RunStarlarkScriptArgs - 33, // 37: api_container_api.ApiContainerService.UploadStarlarkPackage:input_type -> api_container_api.StreamedDataChunk - 11, // 38: api_container_api.ApiContainerService.RunStarlarkPackage:input_type -> api_container_api.RunStarlarkPackageArgs - 25, // 39: api_container_api.ApiContainerService.GetServices:input_type -> api_container_api.GetServicesArgs - 57, // 40: api_container_api.ApiContainerService.GetExistingAndHistoricalServiceIdentifiers:input_type -> google.protobuf.Empty - 29, // 41: api_container_api.ApiContainerService.ExecCommand:input_type -> api_container_api.ExecCommandArgs - 31, // 42: api_container_api.ApiContainerService.WaitForHttpGetEndpointAvailability:input_type -> api_container_api.WaitForHttpGetEndpointAvailabilityArgs - 32, // 43: api_container_api.ApiContainerService.WaitForHttpPostEndpointAvailability:input_type -> api_container_api.WaitForHttpPostEndpointAvailabilityArgs - 33, // 44: api_container_api.ApiContainerService.UploadFilesArtifact:input_type -> api_container_api.StreamedDataChunk - 36, // 45: api_container_api.ApiContainerService.DownloadFilesArtifact:input_type -> api_container_api.DownloadFilesArtifactArgs - 37, // 46: api_container_api.ApiContainerService.StoreWebFilesArtifact:input_type -> api_container_api.StoreWebFilesArtifactArgs - 39, // 47: api_container_api.ApiContainerService.StoreFilesArtifactFromService:input_type -> api_container_api.StoreFilesArtifactFromServiceArgs - 57, // 48: api_container_api.ApiContainerService.ListFilesArtifactNamesAndUuids:input_type -> google.protobuf.Empty - 43, // 49: api_container_api.ApiContainerService.InspectFilesArtifactContents:input_type -> api_container_api.InspectFilesArtifactContentsRequest - 46, // 50: api_container_api.ApiContainerService.ConnectServices:input_type -> api_container_api.ConnectServicesArgs - 57, // 51: api_container_api.ApiContainerService.GetStarlarkRun:input_type -> google.protobuf.Empty - 50, // 52: api_container_api.ApiContainerService.GetStarlarkScriptPlanYaml:input_type -> api_container_api.StarlarkScriptPlanYamlArgs - 51, // 53: api_container_api.ApiContainerService.GetStarlarkPackagePlanYaml:input_type -> api_container_api.StarlarkPackagePlanYamlArgs - 12, // 54: api_container_api.ApiContainerService.RunStarlarkScript:output_type -> api_container_api.StarlarkRunResponseLine - 57, // 55: api_container_api.ApiContainerService.UploadStarlarkPackage:output_type -> google.protobuf.Empty - 12, // 56: api_container_api.ApiContainerService.RunStarlarkPackage:output_type -> api_container_api.StarlarkRunResponseLine - 26, // 57: api_container_api.ApiContainerService.GetServices:output_type -> api_container_api.GetServicesResponse - 28, // 58: api_container_api.ApiContainerService.GetExistingAndHistoricalServiceIdentifiers:output_type -> api_container_api.GetExistingAndHistoricalServiceIdentifiersResponse - 30, // 59: api_container_api.ApiContainerService.ExecCommand:output_type -> api_container_api.ExecCommandResponse - 57, // 60: api_container_api.ApiContainerService.WaitForHttpGetEndpointAvailability:output_type -> google.protobuf.Empty - 57, // 61: api_container_api.ApiContainerService.WaitForHttpPostEndpointAvailability:output_type -> google.protobuf.Empty - 35, // 62: api_container_api.ApiContainerService.UploadFilesArtifact:output_type -> api_container_api.UploadFilesArtifactResponse - 33, // 63: api_container_api.ApiContainerService.DownloadFilesArtifact:output_type -> api_container_api.StreamedDataChunk - 38, // 64: api_container_api.ApiContainerService.StoreWebFilesArtifact:output_type -> api_container_api.StoreWebFilesArtifactResponse - 40, // 65: api_container_api.ApiContainerService.StoreFilesArtifactFromService:output_type -> api_container_api.StoreFilesArtifactFromServiceResponse - 42, // 66: api_container_api.ApiContainerService.ListFilesArtifactNamesAndUuids:output_type -> api_container_api.ListFilesArtifactNamesAndUuidsResponse - 44, // 67: api_container_api.ApiContainerService.InspectFilesArtifactContents:output_type -> api_container_api.InspectFilesArtifactContentsResponse - 47, // 68: api_container_api.ApiContainerService.ConnectServices:output_type -> api_container_api.ConnectServicesResponse - 48, // 69: api_container_api.ApiContainerService.GetStarlarkRun:output_type -> api_container_api.GetStarlarkRunResponse - 49, // 70: api_container_api.ApiContainerService.GetStarlarkScriptPlanYaml:output_type -> api_container_api.PlanYaml - 49, // 71: api_container_api.ApiContainerService.GetStarlarkPackagePlanYaml:output_type -> api_container_api.PlanYaml - 54, // [54:72] is the sub-list for method output_type - 36, // [36:54] is the sub-list for method input_type - 36, // [36:36] is the sub-list for extension type_name - 36, // [36:36] is the sub-list for extension extendee - 0, // [0:36] is the sub-list for field type_name + 55, // 7: api_container_api.ServiceInfo.service_dir_paths_to_files_artifacts_identifiers:type_name -> api_container_api.ServiceInfo.ServiceDirPathsToFilesArtifactsIdentifiersEntry + 3, // 8: api_container_api.RunStarlarkScriptArgs.experimental_features:type_name -> api_container_api.KurtosisFeatureFlag + 1, // 9: api_container_api.RunStarlarkScriptArgs.image_download_mode:type_name -> api_container_api.ImageDownloadMode + 3, // 10: api_container_api.RunStarlarkPackageArgs.experimental_features:type_name -> api_container_api.KurtosisFeatureFlag + 1, // 11: api_container_api.RunStarlarkPackageArgs.image_download_mode:type_name -> api_container_api.ImageDownloadMode + 15, // 12: api_container_api.StarlarkRunResponseLine.instruction:type_name -> api_container_api.StarlarkInstruction + 19, // 13: api_container_api.StarlarkRunResponseLine.error:type_name -> api_container_api.StarlarkError + 23, // 14: api_container_api.StarlarkRunResponseLine.progress_info:type_name -> api_container_api.StarlarkRunProgress + 16, // 15: api_container_api.StarlarkRunResponseLine.instruction_result:type_name -> api_container_api.StarlarkInstructionResult + 24, // 16: api_container_api.StarlarkRunResponseLine.run_finished_event:type_name -> api_container_api.StarlarkRunFinishedEvent + 14, // 17: api_container_api.StarlarkRunResponseLine.warning:type_name -> api_container_api.StarlarkWarning + 13, // 18: api_container_api.StarlarkRunResponseLine.info:type_name -> api_container_api.StarlarkInfo + 18, // 19: api_container_api.StarlarkInstruction.position:type_name -> api_container_api.StarlarkInstructionPosition + 17, // 20: api_container_api.StarlarkInstruction.arguments:type_name -> api_container_api.StarlarkInstructionArg + 20, // 21: api_container_api.StarlarkError.interpretation_error:type_name -> api_container_api.StarlarkInterpretationError + 21, // 22: api_container_api.StarlarkError.validation_error:type_name -> api_container_api.StarlarkValidationError + 22, // 23: api_container_api.StarlarkError.execution_error:type_name -> api_container_api.StarlarkExecutionError + 56, // 24: api_container_api.GetServicesArgs.service_identifiers:type_name -> api_container_api.GetServicesArgs.ServiceIdentifiersEntry + 57, // 25: api_container_api.GetServicesResponse.service_info:type_name -> api_container_api.GetServicesResponse.ServiceInfoEntry + 27, // 26: api_container_api.GetExistingAndHistoricalServiceIdentifiersResponse.allIdentifiers:type_name -> api_container_api.ServiceIdentifiers + 34, // 27: api_container_api.StreamedDataChunk.metadata:type_name -> api_container_api.DataChunkMetadata + 41, // 28: api_container_api.ListFilesArtifactNamesAndUuidsResponse.file_names_and_uuids:type_name -> api_container_api.FilesArtifactNameAndUuid + 41, // 29: api_container_api.InspectFilesArtifactContentsRequest.file_names_and_uuid:type_name -> api_container_api.FilesArtifactNameAndUuid + 45, // 30: api_container_api.InspectFilesArtifactContentsResponse.file_descriptions:type_name -> api_container_api.FileArtifactContentsFileDescription + 2, // 31: api_container_api.ConnectServicesArgs.connect:type_name -> api_container_api.Connect + 3, // 32: api_container_api.GetStarlarkRunResponse.experimental_features:type_name -> api_container_api.KurtosisFeatureFlag + 4, // 33: api_container_api.GetStarlarkRunResponse.restart_policy:type_name -> api_container_api.RestartPolicy + 7, // 34: api_container_api.ServiceInfo.PrivatePortsEntry.value:type_name -> api_container_api.Port + 7, // 35: api_container_api.ServiceInfo.MaybePublicPortsEntry.value:type_name -> api_container_api.Port + 9, // 36: api_container_api.GetServicesResponse.ServiceInfoEntry.value:type_name -> api_container_api.ServiceInfo + 10, // 37: api_container_api.ApiContainerService.RunStarlarkScript:input_type -> api_container_api.RunStarlarkScriptArgs + 33, // 38: api_container_api.ApiContainerService.UploadStarlarkPackage:input_type -> api_container_api.StreamedDataChunk + 11, // 39: api_container_api.ApiContainerService.RunStarlarkPackage:input_type -> api_container_api.RunStarlarkPackageArgs + 25, // 40: api_container_api.ApiContainerService.GetServices:input_type -> api_container_api.GetServicesArgs + 58, // 41: api_container_api.ApiContainerService.GetExistingAndHistoricalServiceIdentifiers:input_type -> google.protobuf.Empty + 29, // 42: api_container_api.ApiContainerService.ExecCommand:input_type -> api_container_api.ExecCommandArgs + 31, // 43: api_container_api.ApiContainerService.WaitForHttpGetEndpointAvailability:input_type -> api_container_api.WaitForHttpGetEndpointAvailabilityArgs + 32, // 44: api_container_api.ApiContainerService.WaitForHttpPostEndpointAvailability:input_type -> api_container_api.WaitForHttpPostEndpointAvailabilityArgs + 33, // 45: api_container_api.ApiContainerService.UploadFilesArtifact:input_type -> api_container_api.StreamedDataChunk + 36, // 46: api_container_api.ApiContainerService.DownloadFilesArtifact:input_type -> api_container_api.DownloadFilesArtifactArgs + 37, // 47: api_container_api.ApiContainerService.StoreWebFilesArtifact:input_type -> api_container_api.StoreWebFilesArtifactArgs + 39, // 48: api_container_api.ApiContainerService.StoreFilesArtifactFromService:input_type -> api_container_api.StoreFilesArtifactFromServiceArgs + 58, // 49: api_container_api.ApiContainerService.ListFilesArtifactNamesAndUuids:input_type -> google.protobuf.Empty + 43, // 50: api_container_api.ApiContainerService.InspectFilesArtifactContents:input_type -> api_container_api.InspectFilesArtifactContentsRequest + 46, // 51: api_container_api.ApiContainerService.ConnectServices:input_type -> api_container_api.ConnectServicesArgs + 58, // 52: api_container_api.ApiContainerService.GetStarlarkRun:input_type -> google.protobuf.Empty + 50, // 53: api_container_api.ApiContainerService.GetStarlarkScriptPlanYaml:input_type -> api_container_api.StarlarkScriptPlanYamlArgs + 51, // 54: api_container_api.ApiContainerService.GetStarlarkPackagePlanYaml:input_type -> api_container_api.StarlarkPackagePlanYamlArgs + 12, // 55: api_container_api.ApiContainerService.RunStarlarkScript:output_type -> api_container_api.StarlarkRunResponseLine + 58, // 56: api_container_api.ApiContainerService.UploadStarlarkPackage:output_type -> google.protobuf.Empty + 12, // 57: api_container_api.ApiContainerService.RunStarlarkPackage:output_type -> api_container_api.StarlarkRunResponseLine + 26, // 58: api_container_api.ApiContainerService.GetServices:output_type -> api_container_api.GetServicesResponse + 28, // 59: api_container_api.ApiContainerService.GetExistingAndHistoricalServiceIdentifiers:output_type -> api_container_api.GetExistingAndHistoricalServiceIdentifiersResponse + 30, // 60: api_container_api.ApiContainerService.ExecCommand:output_type -> api_container_api.ExecCommandResponse + 58, // 61: api_container_api.ApiContainerService.WaitForHttpGetEndpointAvailability:output_type -> google.protobuf.Empty + 58, // 62: api_container_api.ApiContainerService.WaitForHttpPostEndpointAvailability:output_type -> google.protobuf.Empty + 35, // 63: api_container_api.ApiContainerService.UploadFilesArtifact:output_type -> api_container_api.UploadFilesArtifactResponse + 33, // 64: api_container_api.ApiContainerService.DownloadFilesArtifact:output_type -> api_container_api.StreamedDataChunk + 38, // 65: api_container_api.ApiContainerService.StoreWebFilesArtifact:output_type -> api_container_api.StoreWebFilesArtifactResponse + 40, // 66: api_container_api.ApiContainerService.StoreFilesArtifactFromService:output_type -> api_container_api.StoreFilesArtifactFromServiceResponse + 42, // 67: api_container_api.ApiContainerService.ListFilesArtifactNamesAndUuids:output_type -> api_container_api.ListFilesArtifactNamesAndUuidsResponse + 44, // 68: api_container_api.ApiContainerService.InspectFilesArtifactContents:output_type -> api_container_api.InspectFilesArtifactContentsResponse + 47, // 69: api_container_api.ApiContainerService.ConnectServices:output_type -> api_container_api.ConnectServicesResponse + 48, // 70: api_container_api.ApiContainerService.GetStarlarkRun:output_type -> api_container_api.GetStarlarkRunResponse + 49, // 71: api_container_api.ApiContainerService.GetStarlarkScriptPlanYaml:output_type -> api_container_api.PlanYaml + 49, // 72: api_container_api.ApiContainerService.GetStarlarkPackagePlanYaml:output_type -> api_container_api.PlanYaml + 55, // [55:73] is the sub-list for method output_type + 37, // [37:55] is the sub-list for method input_type + 37, // [37:37] is the sub-list for extension type_name + 37, // [37:37] is the sub-list for extension extendee + 0, // [0:37] is the sub-list for field type_name } func init() { file_api_container_service_proto_init() } @@ -5018,7 +5089,7 @@ func file_api_container_service_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_api_container_service_proto_rawDesc, NumEnums: 7, - NumMessages: 50, + NumMessages: 51, NumExtensions: 0, NumServices: 1, }, diff --git a/api/golang/core/lib/binding_constructors/binding_constructors.go b/api/golang/core/lib/binding_constructors/binding_constructors.go index d97b7ee228..83b864f720 100644 --- a/api/golang/core/lib/binding_constructors/binding_constructors.go +++ b/api/golang/core/lib/binding_constructors/binding_constructors.go @@ -362,6 +362,11 @@ func NewServiceInfo( maybePublicPorts map[string]*kurtosis_core_rpc_api_bindings.Port, serviceStatus kurtosis_core_rpc_api_bindings.ServiceStatus, container *kurtosis_core_rpc_api_bindings.Container, + serviceDirPathsToFilesArtifactsIdentifiers map[string]string, + minMillicpus uint32, + maxMillicpus uint32, + minMemoryMegabytes uint32, + maxMemoryMegabytes uint32, ) *kurtosis_core_rpc_api_bindings.ServiceInfo { return &kurtosis_core_rpc_api_bindings.ServiceInfo{ ServiceUuid: uuid, @@ -373,6 +378,11 @@ func NewServiceInfo( MaybePublicPorts: maybePublicPorts, ServiceStatus: serviceStatus, Container: container, + ServiceDirPathsToFilesArtifactsIdentifiers: serviceDirPathsToFilesArtifactsIdentifiers, + MaxMillicpus: maxMillicpus, + MinMillicpus: minMillicpus, + MaxMemoryMegabytes: maxMemoryMegabytes, + MinMemoryMegabytes: minMemoryMegabytes, } } diff --git a/api/protobuf/core/api_container_service.proto b/api/protobuf/core/api_container_service.proto index c29772ede3..8debba3823 100644 --- a/api/protobuf/core/api_container_service.proto +++ b/api/protobuf/core/api_container_service.proto @@ -142,6 +142,17 @@ message ServiceInfo { // Docker container or Kubernetes pod container Container container = 9; + + // Mapping of directory paths on service to names of files artifacts that are mounted to that directory + map service_dir_paths_to_files_artifacts_identifiers = 10; + + uint32 max_millicpus = 11; + + uint32 min_millicpus = 12; + + uint32 max_memory_megabytes = 13; + + uint32 min_memory_megabytes = 14; } // ============================================================================================== diff --git a/api/rust/src/api_container_api.rs b/api/rust/src/api_container_api.rs index 451c0e5848..fc2b79ce2e 100644 --- a/api/rust/src/api_container_api.rs +++ b/api/rust/src/api_container_api.rs @@ -159,6 +159,20 @@ pub struct ServiceInfo { /// Docker container or Kubernetes pod container #[prost(message, optional, tag = "9")] pub container: ::core::option::Option, + /// Mapping of directory paths on service to names of files artifacts that are mounted to that directory + #[prost(map = "string, string", tag = "10")] + pub service_dir_paths_to_files_artifacts_identifiers: ::std::collections::HashMap< + ::prost::alloc::string::String, + ::prost::alloc::string::String, + >, + #[prost(uint32, tag = "11")] + pub max_millicpus: u32, + #[prost(uint32, tag = "12")] + pub min_millicpus: u32, + #[prost(uint32, tag = "13")] + pub max_memory_megabytes: u32, + #[prost(uint32, tag = "14")] + pub min_memory_megabytes: u32, } #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] diff --git a/api/typescript/src/core/kurtosis_core_rpc_api_bindings/api_container_service_pb.d.ts b/api/typescript/src/core/kurtosis_core_rpc_api_bindings/api_container_service_pb.d.ts index bd338a52f8..93e261a939 100644 --- a/api/typescript/src/core/kurtosis_core_rpc_api_bindings/api_container_service_pb.d.ts +++ b/api/typescript/src/core/kurtosis_core_rpc_api_bindings/api_container_service_pb.d.ts @@ -135,6 +135,21 @@ export class ServiceInfo extends jspb.Message { hasContainer(): boolean; clearContainer(): ServiceInfo; + getServiceDirPathsToFilesArtifactsIdentifiersMap(): jspb.Map; + clearServiceDirPathsToFilesArtifactsIdentifiersMap(): ServiceInfo; + + getMaxMillicpus(): number; + setMaxMillicpus(value: number): ServiceInfo; + + getMinMillicpus(): number; + setMinMillicpus(value: number): ServiceInfo; + + getMaxMemoryMegabytes(): number; + setMaxMemoryMegabytes(value: number): ServiceInfo; + + getMinMemoryMegabytes(): number; + setMinMemoryMegabytes(value: number): ServiceInfo; + serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): ServiceInfo.AsObject; static toObject(includeInstance: boolean, msg: ServiceInfo): ServiceInfo.AsObject; @@ -154,6 +169,11 @@ export namespace ServiceInfo { shortenedUuid: string, serviceStatus: ServiceStatus, container?: Container.AsObject, + serviceDirPathsToFilesArtifactsIdentifiersMap: Array<[string, string]>, + maxMillicpus: number, + minMillicpus: number, + maxMemoryMegabytes: number, + minMemoryMegabytes: number, } } diff --git a/api/typescript/src/core/kurtosis_core_rpc_api_bindings/api_container_service_pb.js b/api/typescript/src/core/kurtosis_core_rpc_api_bindings/api_container_service_pb.js index fcf85dd28d..62aae1a8f7 100644 --- a/api/typescript/src/core/kurtosis_core_rpc_api_bindings/api_container_service_pb.js +++ b/api/typescript/src/core/kurtosis_core_rpc_api_bindings/api_container_service_pb.js @@ -1695,7 +1695,12 @@ proto.api_container_api.ServiceInfo.toObject = function(includeInstance, msg) { name: jspb.Message.getFieldWithDefault(msg, 6, ""), shortenedUuid: jspb.Message.getFieldWithDefault(msg, 7, ""), serviceStatus: jspb.Message.getFieldWithDefault(msg, 8, 0), - container: (f = msg.getContainer()) && proto.api_container_api.Container.toObject(includeInstance, f) + container: (f = msg.getContainer()) && proto.api_container_api.Container.toObject(includeInstance, f), + serviceDirPathsToFilesArtifactsIdentifiersMap: (f = msg.getServiceDirPathsToFilesArtifactsIdentifiersMap()) ? f.toObject(includeInstance, undefined) : [], + maxMillicpus: jspb.Message.getFieldWithDefault(msg, 11, 0), + minMillicpus: jspb.Message.getFieldWithDefault(msg, 12, 0), + maxMemoryMegabytes: jspb.Message.getFieldWithDefault(msg, 13, 0), + minMemoryMegabytes: jspb.Message.getFieldWithDefault(msg, 14, 0) }; if (includeInstance) { @@ -1773,6 +1778,28 @@ proto.api_container_api.ServiceInfo.deserializeBinaryFromReader = function(msg, reader.readMessage(value,proto.api_container_api.Container.deserializeBinaryFromReader); msg.setContainer(value); break; + case 10: + var value = msg.getServiceDirPathsToFilesArtifactsIdentifiersMap(); + reader.readMessage(value, function(message, reader) { + jspb.Map.deserializeBinary(message, reader, jspb.BinaryReader.prototype.readString, jspb.BinaryReader.prototype.readString, null, "", ""); + }); + break; + case 11: + var value = /** @type {number} */ (reader.readUint32()); + msg.setMaxMillicpus(value); + break; + case 12: + var value = /** @type {number} */ (reader.readUint32()); + msg.setMinMillicpus(value); + break; + case 13: + var value = /** @type {number} */ (reader.readUint32()); + msg.setMaxMemoryMegabytes(value); + break; + case 14: + var value = /** @type {number} */ (reader.readUint32()); + msg.setMinMemoryMegabytes(value); + break; default: reader.skipField(); break; @@ -1860,6 +1887,38 @@ proto.api_container_api.ServiceInfo.serializeBinaryToWriter = function(message, proto.api_container_api.Container.serializeBinaryToWriter ); } + f = message.getServiceDirPathsToFilesArtifactsIdentifiersMap(true); + if (f && f.getLength() > 0) { + f.serializeBinary(10, writer, jspb.BinaryWriter.prototype.writeString, jspb.BinaryWriter.prototype.writeString); + } + f = message.getMaxMillicpus(); + if (f !== 0) { + writer.writeUint32( + 11, + f + ); + } + f = message.getMinMillicpus(); + if (f !== 0) { + writer.writeUint32( + 12, + f + ); + } + f = message.getMaxMemoryMegabytes(); + if (f !== 0) { + writer.writeUint32( + 13, + f + ); + } + f = message.getMinMemoryMegabytes(); + if (f !== 0) { + writer.writeUint32( + 14, + f + ); + } }; @@ -2052,6 +2111,100 @@ proto.api_container_api.ServiceInfo.prototype.hasContainer = function() { }; +/** + * map service_dir_paths_to_files_artifacts_identifiers = 10; + * @param {boolean=} opt_noLazyCreate Do not create the map if + * empty, instead returning `undefined` + * @return {!jspb.Map} + */ +proto.api_container_api.ServiceInfo.prototype.getServiceDirPathsToFilesArtifactsIdentifiersMap = function(opt_noLazyCreate) { + return /** @type {!jspb.Map} */ ( + jspb.Message.getMapField(this, 10, opt_noLazyCreate, + null)); +}; + + +/** + * Clears values from the map. The map will be non-null. + * @return {!proto.api_container_api.ServiceInfo} returns this + */ +proto.api_container_api.ServiceInfo.prototype.clearServiceDirPathsToFilesArtifactsIdentifiersMap = function() { + this.getServiceDirPathsToFilesArtifactsIdentifiersMap().clear(); + return this;}; + + +/** + * optional uint32 max_millicpus = 11; + * @return {number} + */ +proto.api_container_api.ServiceInfo.prototype.getMaxMillicpus = function() { + return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 11, 0)); +}; + + +/** + * @param {number} value + * @return {!proto.api_container_api.ServiceInfo} returns this + */ +proto.api_container_api.ServiceInfo.prototype.setMaxMillicpus = function(value) { + return jspb.Message.setProto3IntField(this, 11, value); +}; + + +/** + * optional uint32 min_millicpus = 12; + * @return {number} + */ +proto.api_container_api.ServiceInfo.prototype.getMinMillicpus = function() { + return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 12, 0)); +}; + + +/** + * @param {number} value + * @return {!proto.api_container_api.ServiceInfo} returns this + */ +proto.api_container_api.ServiceInfo.prototype.setMinMillicpus = function(value) { + return jspb.Message.setProto3IntField(this, 12, value); +}; + + +/** + * optional uint32 max_memory_megabytes = 13; + * @return {number} + */ +proto.api_container_api.ServiceInfo.prototype.getMaxMemoryMegabytes = function() { + return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 13, 0)); +}; + + +/** + * @param {number} value + * @return {!proto.api_container_api.ServiceInfo} returns this + */ +proto.api_container_api.ServiceInfo.prototype.setMaxMemoryMegabytes = function(value) { + return jspb.Message.setProto3IntField(this, 13, value); +}; + + +/** + * optional uint32 min_memory_megabytes = 14; + * @return {number} + */ +proto.api_container_api.ServiceInfo.prototype.getMinMemoryMegabytes = function() { + return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 14, 0)); +}; + + +/** + * @param {number} value + * @return {!proto.api_container_api.ServiceInfo} returns this + */ +proto.api_container_api.ServiceInfo.prototype.setMinMemoryMegabytes = function(value) { + return jspb.Message.setProto3IntField(this, 14, value); +}; + + /** * List of repeated fields within this message type. diff --git a/api/typescript/src/core/kurtosis_core_rpc_api_bindings/connect/api_container_service_pb.d.ts b/api/typescript/src/core/kurtosis_core_rpc_api_bindings/connect/api_container_service_pb.d.ts index ed997492ac..aff6ac91f9 100644 --- a/api/typescript/src/core/kurtosis_core_rpc_api_bindings/connect/api_container_service_pb.d.ts +++ b/api/typescript/src/core/kurtosis_core_rpc_api_bindings/connect/api_container_service_pb.d.ts @@ -306,6 +306,33 @@ export declare class ServiceInfo extends Message { */ container?: Container; + /** + * Mapping of directory paths on service to names of files artifacts that are mounted to that directory + * + * @generated from field: map service_dir_paths_to_files_artifacts_identifiers = 10; + */ + serviceDirPathsToFilesArtifactsIdentifiers: { [key: string]: string }; + + /** + * @generated from field: uint32 max_millicpus = 11; + */ + maxMillicpus: number; + + /** + * @generated from field: uint32 min_millicpus = 12; + */ + minMillicpus: number; + + /** + * @generated from field: uint32 max_memory_megabytes = 13; + */ + maxMemoryMegabytes: number; + + /** + * @generated from field: uint32 min_memory_megabytes = 14; + */ + minMemoryMegabytes: number; + constructor(data?: PartialMessage); static readonly runtime: typeof proto3; diff --git a/api/typescript/src/core/kurtosis_core_rpc_api_bindings/connect/api_container_service_pb.js b/api/typescript/src/core/kurtosis_core_rpc_api_bindings/connect/api_container_service_pb.js index c19e43ab1c..0a7ef67a18 100644 --- a/api/typescript/src/core/kurtosis_core_rpc_api_bindings/connect/api_container_service_pb.js +++ b/api/typescript/src/core/kurtosis_core_rpc_api_bindings/connect/api_container_service_pb.js @@ -134,6 +134,11 @@ export const ServiceInfo = proto3.makeMessageType( { no: 7, name: "shortened_uuid", kind: "scalar", T: 9 /* ScalarType.STRING */ }, { no: 8, name: "service_status", kind: "enum", T: proto3.getEnumType(ServiceStatus) }, { no: 9, name: "container", kind: "message", T: Container }, + { no: 10, name: "service_dir_paths_to_files_artifacts_identifiers", kind: "map", K: 9 /* ScalarType.STRING */, V: {kind: "scalar", T: 9 /* ScalarType.STRING */} }, + { no: 11, name: "max_millicpus", kind: "scalar", T: 13 /* ScalarType.UINT32 */ }, + { no: 12, name: "min_millicpus", kind: "scalar", T: 13 /* ScalarType.UINT32 */ }, + { no: 13, name: "max_memory_megabytes", kind: "scalar", T: 13 /* ScalarType.UINT32 */ }, + { no: 14, name: "min_memory_megabytes", kind: "scalar", T: 13 /* ScalarType.UINT32 */ }, ], ); diff --git a/api/typescript/src/engine/rest_api_bindings/types.d.ts b/api/typescript/src/engine/rest_api_bindings/types.d.ts index 4c64ace51c..302f7d258b 100644 --- a/api/typescript/src/engine/rest_api_bindings/types.d.ts +++ b/api/typescript/src/engine/rest_api_bindings/types.d.ts @@ -3,1610 +3,1076 @@ * Do not make direct changes to the file. */ + export interface paths { - "/engine/info": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** Get engine info */ - get: { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Successful response */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["EngineInfo"]; - }; - }; - default: components["responses"]["NotOk"]; - }; - }; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/enclaves": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** List enclaves */ - get: { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Successful response */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - [key: string]: components["schemas"]["EnclaveInfo"] | undefined; - }; - }; - }; - default: components["responses"]["NotOk"]; - }; - }; - put?: never; - /** Create enclave */ - post: { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody: { - content: { - "application/json": components["schemas"]["CreateEnclave"]; - }; - }; - responses: { - /** @description Successful response */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["EnclaveInfo"]; - }; - }; - default: components["responses"]["NotOk"]; - }; - }; - /** - * Delete enclaves - * @description Delete stopped enclaves. TO delete all the enclaves use the query parameter `remove_all` - */ - delete: { - parameters: { - query?: { - /** @description If true, remove all enclaves. Otherwise only remove stopped enclaves. Default is false */ - remove_all?: components["parameters"]["remove_all"]; - }; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Successful response */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["DeletionSummary"]; - }; - }; - default: components["responses"]["NotOk"]; - }; - }; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/enclaves/history": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** List all enclave identifiers */ - get: { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Successful response */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["EnclaveIdentifiers"][]; - }; - }; - default: components["responses"]["NotOk"]; - }; - }; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/enclaves/{enclave_identifier}": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** Get enclave detailed info */ - get: { - parameters: { - query?: never; - header?: never; - path: { - /** @description UUID, shortened UUID, or name of the enclave */ - enclave_identifier: components["parameters"]["enclave_identifier"]; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Successful response */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["EnclaveInfo"]; - }; - }; - default: components["responses"]["NotOk"]; - }; - }; - put?: never; - post?: never; - /** Destroy enclave */ - delete: { - parameters: { - query?: never; - header?: never; - path: { - /** @description UUID, shortened UUID, or name of the enclave */ - enclave_identifier: components["parameters"]["enclave_identifier"]; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Successful response */ - 200: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - default: components["responses"]["NotOk"]; - }; - }; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/enclaves/{enclave_identifier}/status": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** Get enclave status */ - get: { - parameters: { - query?: never; - header?: never; - path: { - /** @description UUID, shortened UUID, or name of the enclave */ - enclave_identifier: components["parameters"]["enclave_identifier"]; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Successful response */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["EnclaveStatus"]; - }; - }; - default: components["responses"]["NotOk"]; - }; - }; - put?: never; - /** Set enclave status */ - post: { - parameters: { - query?: never; - header?: never; - path: { - /** @description UUID, shortened UUID, or name of the enclave */ - enclave_identifier: components["parameters"]["enclave_identifier"]; - }; - cookie?: never; - }; - requestBody: { - content: { - "application/json": components["schemas"]["EnclaveTargetStatus"]; - }; - }; - responses: { - /** @description Successful response */ - 200: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - default: components["responses"]["NotOk"]; - }; - }; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/enclaves/{enclave_identifier}/starlark": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** Get last Starlark run */ - get: { - parameters: { - query?: never; - header?: never; - path: { - /** @description UUID, shortened UUID, or name of the enclave */ - enclave_identifier: components["parameters"]["enclave_identifier"]; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Successful request */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["StarlarkDescription"]; - }; - }; - default: components["responses"]["NotOk"]; - }; - }; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/enclaves/{enclave_identifier}/starlark/packages": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get?: never; - put?: never; - /** - * Uploads a Starlark package - * @description Uploads a Starlark package. This step is required before the package can be executed with RunStarlarkPackage - */ - post: { - parameters: { - query?: never; - header?: never; - path: { - /** @description UUID, shortened UUID, or name of the enclave */ - enclave_identifier: components["parameters"]["enclave_identifier"]; - }; - cookie?: never; - }; - requestBody?: components["requestBodies"]["fileUploadBody"]; - responses: { - /** @description Success */ - 200: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - default: components["responses"]["NotOk"]; - }; - }; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/enclaves/{enclave_identifier}/starlark/packages/{package_id}": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get?: never; - put?: never; - /** - * Executes a Starlark package on the user's behalf - * @description The endpoint will trigger the execution and deployment of a Starlark package. By default, it'll - * return an async logs resource using `starlark_execution_uuid` that can be used to retrieve the logs - * via streaming. It's also possible to block the call and wait for the execution to complete using the - * query parameter `retrieve_logs_async`. - */ - post: { - parameters: { - query?: { - /** @description If false, block http response until all logs are available. Default is true */ - retrieve_logs_async?: components["parameters"]["retrieve_logs_async"]; - }; - header?: never; - path: { - /** @description UUID, shortened UUID, or name of the enclave */ - enclave_identifier: components["parameters"]["enclave_identifier"]; - /** @description The package identifier that will be executed */ - package_id: components["parameters"]["package_id"]; - }; - cookie?: never; - }; - requestBody: { - content: { - "application/json": components["schemas"]["RunStarlarkPackage"]; - }; - }; - responses: { - /** @description Successful request */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["StarlarkRunResponse"]; - }; - }; - default: components["responses"]["NotOk"]; - }; - }; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/enclaves/{enclave_identifier}/starlark/scripts": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get?: never; - put?: never; - /** - * Executes a Starlark script on the user's behalf - * @description The endpoint will trigger the execution and deployment of a Starlark file. By default, it'll - * return an async logs resource using `starlark_execution_uuid` that can be used to retrieve the logs - * via streaming. It's also possible to block the call and wait for the execution to complete using the - * query parameter `retrieve_logs_async`. - */ - post: { - parameters: { - query?: { - /** @description If false, block http response until all logs are available. Default is true */ - retrieve_logs_async?: components["parameters"]["retrieve_logs_async"]; - }; - header?: never; - path: { - /** @description UUID, shortened UUID, or name of the enclave */ - enclave_identifier: components["parameters"]["enclave_identifier"]; - }; - cookie?: never; - }; - requestBody: { - content: { - "application/json": components["schemas"]["RunStarlarkScript"]; - }; - }; - responses: { - /** @description Successful request */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["StarlarkRunResponse"]; - }; - }; - default: components["responses"]["NotOk"]; - }; - }; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/enclaves/{enclave_identifier}/services/{service_identifier}": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** Returns detailed information about a specific service */ - get: { - parameters: { - query?: never; - header?: never; - path: { - /** @description UUID, shortened UUID, or name of the enclave */ - enclave_identifier: components["parameters"]["enclave_identifier"]; - /** @description The service identifier of the container that the command should be executed in */ - service_identifier: components["parameters"]["service_identifier"]; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Successful request */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["ServiceInfo"]; - }; - }; - default: components["responses"]["NotOk"]; - }; - }; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/enclaves/{enclave_identifier}/services/history": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** Returns information about all existing & historical services */ - get: { - parameters: { - query?: never; - header?: never; - path: { - /** @description UUID, shortened UUID, or name of the enclave */ - enclave_identifier: components["parameters"]["enclave_identifier"]; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Successful request */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["ServiceIdentifiers"][]; - }; - }; - default: components["responses"]["NotOk"]; - }; - }; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/enclaves/{enclave_identifier}/services": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** Returns detailed information about alls services within the enclave */ - get: { - parameters: { - query?: { - /** @description Select services to get information */ - services?: string[]; - }; - header?: never; - path: { - /** @description UUID, shortened UUID, or name of the enclave */ - enclave_identifier: components["parameters"]["enclave_identifier"]; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Successful request */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - [key: string]: components["schemas"]["ServiceInfo"] | undefined; - }; - }; - }; - default: components["responses"]["NotOk"]; - }; - }; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/enclaves/{enclave_identifier}/services/{service_identifier}/command": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get?: never; - put?: never; - /** Executes the given command inside a running service's container */ - post: { - parameters: { - query?: never; - header?: never; - path: { - /** @description UUID, shortened UUID, or name of the enclave */ - enclave_identifier: components["parameters"]["enclave_identifier"]; - /** @description The service identifier of the container that the command should be executed in */ - service_identifier: components["parameters"]["service_identifier"]; - }; - cookie?: never; - }; - /** @description Exec Command */ - requestBody: { - content: { - "application/json": components["schemas"]["ExecCommand"]; - }; - }; - responses: { - /** @description Successful request */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["ExecCommandResult"]; - }; - }; - default: components["responses"]["NotOk"]; - }; - }; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/enclaves/{enclave_identifier}/services/{service_identifier}/endpoints/{port_number}/availability": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** - * Check for service availability - * @description Block until the given HTTP endpoint returns available, calling it through a HTTP request - */ - get: { - parameters: { - query?: { - /** @description The HTTP method used to check availability. Default is GET. */ - http_method?: components["parameters"]["http_method"]; - /** @description The path of the service to check. It mustn't start with the first slash. For instance `service/health` */ - path?: components["parameters"]["path"]; - /** @description The number of milliseconds to wait until executing the first HTTP call */ - initial_delay_milliseconds?: components["parameters"]["initial_delay_milliseconds"]; - /** @description Max number of HTTP call attempts that this will execute until giving up and returning an error */ - retries?: components["parameters"]["retries"]; - /** @description Number of milliseconds to wait between retries */ - retries_delay_milliseconds?: components["parameters"]["retries_delay_milliseconds"]; - /** @description If the endpoint returns this value, the service will be marked as available (e.g. Hello World). */ - expected_response?: components["parameters"]["expected_response"]; - /** @description If the http_method is set to POST, this value will be send as the body of the availability request. */ - request_body?: components["parameters"]["request_body"]; - }; - header?: never; - path: { - /** @description UUID, shortened UUID, or name of the enclave */ - enclave_identifier: components["parameters"]["enclave_identifier"]; - /** @description The service identifier of the container that the command should be executed in */ - service_identifier: components["parameters"]["service_identifier"]; - /** @description The port number to check availability */ - port_number: components["parameters"]["port_number"]; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Success */ - 200: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - default: components["responses"]["NotOk"]; - }; - }; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/enclaves/{enclave_identifier}/artifacts": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** List all files artifacts */ - get: { - parameters: { - query?: never; - header?: never; - path: { - /** @description UUID, shortened UUID, or name of the enclave */ - enclave_identifier: components["parameters"]["enclave_identifier"]; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Successful request */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["FileArtifactReference"][]; - }; - }; - default: components["responses"]["NotOk"]; - }; - }; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/enclaves/{enclave_identifier}/artifacts/{artifact_identifier}": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** Inspect the content of a file artifact */ - get: { - parameters: { - query?: never; - header?: never; - path: { - /** @description UUID, shortened UUID, or name of the enclave */ - enclave_identifier: components["parameters"]["enclave_identifier"]; - /** @description The artifact name or uuid */ - artifact_identifier: components["parameters"]["artifact_identifier"]; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Successful request */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["FileArtifactDescription"][]; - }; - }; - default: components["responses"]["NotOk"]; - }; - }; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/enclaves/{enclave_identifier}/artifacts/{artifact_identifier}/download": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** Downloads a files artifact from the Kurtosis File System */ - get: { - parameters: { - query?: never; - header?: never; - path: { - /** @description UUID, shortened UUID, or name of the enclave */ - enclave_identifier: components["parameters"]["enclave_identifier"]; - /** @description The artifact name or uuid */ - artifact_identifier: components["parameters"]["artifact_identifier"]; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Successful request */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/octet-stream": string; - }; - }; - default: components["responses"]["NotOk"]; - }; - }; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/enclaves/{enclave_identifier}/artifacts/local-file": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get?: never; - put?: never; - /** Uploads local file artifact to the Kurtosis File System */ - post: { - parameters: { - query?: never; - header?: never; - path: { - /** @description UUID, shortened UUID, or name of the enclave */ - enclave_identifier: components["parameters"]["enclave_identifier"]; - }; - cookie?: never; - }; - requestBody?: components["requestBodies"]["fileUploadBody"]; - responses: { - /** @description Successful request */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - [key: string]: components["schemas"]["FileArtifactUploadResult"] | undefined; - }; - }; - }; - default: components["responses"]["NotOk"]; - }; - }; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/enclaves/{enclave_identifier}/artifacts/remote-file": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get?: never; - put?: never; - /** - * Add remote file to Kurtosis File System - * @description Tells the API container to download a files artifact from the web to the Kurtosis File System - */ - post: { - parameters: { - query?: never; - header?: never; - path: { - /** @description UUID, shortened UUID, or name of the enclave */ - enclave_identifier: components["parameters"]["enclave_identifier"]; - }; - cookie?: never; - }; - /** @description Store Web Files Artifact */ - requestBody: { - content: { - "application/json": components["schemas"]["StoreWebFilesArtifact"]; - }; - }; - responses: { - /** @description Successful request */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["FileArtifactReference"]; - }; - }; - default: components["responses"]["NotOk"]; - }; - }; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/enclaves/{enclave_identifier}/artifacts/services/{service_identifier}": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get?: never; - put?: never; - /** - * Add service's file to Kurtosis File System - * @description Tells the API container to copy a files artifact from a service to the Kurtosis File System - */ - post: { - parameters: { - query?: never; - header?: never; - path: { - /** @description UUID, shortened UUID, or name of the enclave */ - enclave_identifier: components["parameters"]["enclave_identifier"]; - /** @description The service identifier of the container that the command should be executed in */ - service_identifier: components["parameters"]["service_identifier"]; - }; - cookie?: never; - }; - requestBody: { - content: { - "application/json": components["schemas"]["StoreFilesArtifactFromService"]; - }; - }; - responses: { - /** @description Successful request */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["FileArtifactReference"]; - }; - }; - default: components["responses"]["NotOk"]; - }; - }; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/enclaves/{enclave_identifier}/services/connection": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get?: never; - put?: never; - /** User services port forwarding */ - post: { - parameters: { - query?: never; - header?: never; - path: { - /** @description UUID, shortened UUID, or name of the enclave */ - enclave_identifier: components["parameters"]["enclave_identifier"]; - }; - cookie?: never; - }; - requestBody: { - content: { - "application/json": components["schemas"]["Connect"]; - }; - }; - responses: { - /** @description Successful request */ - 200: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - default: components["responses"]["NotOk"]; - }; - }; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/enclaves/{enclave_identifier}/logs": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** - * Get enclave's services logs - * @description Get multiple enclave services logs concurrently. This endpoint can stream the logs by either starting - * a Websocket connection (recommended) or legacy HTTP streaming. - */ - get: { - parameters: { - query: { - service_uuid_set: components["parameters"]["service_uuid_set"]; - follow_logs?: components["parameters"]["follow_logs"]; - conjunctive_filters?: components["parameters"]["conjunctive_filters"]; - return_all_logs?: components["parameters"]["return_all_logs"]; - num_log_lines?: components["parameters"]["num_log_lines"]; - }; - header?: never; - path: { - /** @description UUID, shortened UUID, or name of the enclave */ - enclave_identifier: components["parameters"]["enclave_identifier"]; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Successful response */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["ServiceLogs"]; - }; - }; - default: components["responses"]["NotOk"]; - }; - }; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/enclaves/{enclave_identifier}/services/{service_identifier}/logs": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** - * Get service logs - * @description Get service logs. This endpoint can stream the logs by either starting - * a Websocket connection (recommended) or legacy HTTP streaming. - */ - get: { - parameters: { - query?: { - follow_logs?: components["parameters"]["follow_logs"]; - conjunctive_filters?: components["parameters"]["conjunctive_filters"]; - return_all_logs?: components["parameters"]["return_all_logs"]; - num_log_lines?: components["parameters"]["num_log_lines"]; - }; - header?: never; - path: { - /** @description UUID, shortened UUID, or name of the enclave */ - enclave_identifier: components["parameters"]["enclave_identifier"]; - /** @description The service identifier of the container that the command should be executed in */ - service_identifier: components["parameters"]["service_identifier"]; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Successful response */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["ServiceLogs"]; - }; - }; - default: components["responses"]["NotOk"]; - }; - }; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/starlark/executions/{starlark_execution_uuid}/logs": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** - * Get Starlark execution logs - * @description Stream the logs of an Starlark execution that were initiated using `retrieve_logs_async`. - * The async logs can be consumed only once and expire after consumption or 2 hours after creation. - * This endpoint can stream the logs by either starting a Websocket connection (recommended) or - * legacy HTTP streaming. - */ - get: { - parameters: { - query?: never; - header?: never; - path: { - /** @description The unique identifier to track the execution of a Starlark script or package */ - starlark_execution_uuid: components["parameters"]["starlark_execution_uuid"]; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Successful request */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["StarlarkRunResponseLine"][]; - }; - }; - default: components["responses"]["NotOk"]; - }; - }; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; + "/engine/info": { + /** Get engine info */ + get: { + responses: { + /** @description Successful response */ + 200: { + content: { + "application/json": components["schemas"]["EngineInfo"]; + }; + }; + default: components["responses"]["NotOk"]; + }; + }; + }; + "/enclaves": { + /** List enclaves */ + get: { + responses: { + /** @description Successful response */ + 200: { + content: { + "application/json": { + [key: string]: components["schemas"]["EnclaveInfo"]; + }; + }; + }; + default: components["responses"]["NotOk"]; + }; + }; + /** Create enclave */ + post: { + requestBody: { + content: { + "application/json": components["schemas"]["CreateEnclave"]; + }; + }; + responses: { + /** @description Successful response */ + 200: { + content: { + "application/json": components["schemas"]["EnclaveInfo"]; + }; + }; + default: components["responses"]["NotOk"]; + }; + }; + /** + * Delete enclaves + * @description Delete stopped enclaves. TO delete all the enclaves use the query parameter `remove_all` + */ + delete: { + parameters: { + query?: { + remove_all?: components["parameters"]["remove_all"]; + }; + }; + responses: { + /** @description Successful response */ + 200: { + content: { + "application/json": components["schemas"]["DeletionSummary"]; + }; + }; + default: components["responses"]["NotOk"]; + }; + }; + }; + "/enclaves/history": { + /** List all enclave identifiers */ + get: { + responses: { + /** @description Successful response */ + 200: { + content: { + "application/json": components["schemas"]["EnclaveIdentifiers"][]; + }; + }; + default: components["responses"]["NotOk"]; + }; + }; + }; + "/enclaves/{enclave_identifier}": { + /** Get enclave detailed info */ + get: { + parameters: { + path: { + enclave_identifier: components["parameters"]["enclave_identifier"]; + }; + }; + responses: { + /** @description Successful response */ + 200: { + content: { + "application/json": components["schemas"]["EnclaveInfo"]; + }; + }; + default: components["responses"]["NotOk"]; + }; + }; + /** Destroy enclave */ + delete: { + parameters: { + path: { + enclave_identifier: components["parameters"]["enclave_identifier"]; + }; + }; + responses: { + /** @description Successful response */ + 200: { + content: never; + }; + default: components["responses"]["NotOk"]; + }; + }; + }; + "/enclaves/{enclave_identifier}/status": { + /** Get enclave status */ + get: { + parameters: { + path: { + enclave_identifier: components["parameters"]["enclave_identifier"]; + }; + }; + responses: { + /** @description Successful response */ + 200: { + content: { + "application/json": components["schemas"]["EnclaveStatus"]; + }; + }; + default: components["responses"]["NotOk"]; + }; + }; + /** Set enclave status */ + post: { + parameters: { + path: { + enclave_identifier: components["parameters"]["enclave_identifier"]; + }; + }; + requestBody: { + content: { + "application/json": components["schemas"]["EnclaveTargetStatus"]; + }; + }; + responses: { + /** @description Successful response */ + 200: { + content: never; + }; + default: components["responses"]["NotOk"]; + }; }; + }; + "/enclaves/{enclave_identifier}/starlark": { + /** Get last Starlark run */ + get: { + parameters: { + path: { + enclave_identifier: components["parameters"]["enclave_identifier"]; + }; + }; + responses: { + /** @description Successful request */ + 200: { + content: { + "application/json": components["schemas"]["StarlarkDescription"]; + }; + }; + default: components["responses"]["NotOk"]; + }; + }; + }; + "/enclaves/{enclave_identifier}/starlark/packages": { + /** + * Uploads a Starlark package + * @description Uploads a Starlark package. This step is required before the package can be executed with RunStarlarkPackage + */ + post: { + parameters: { + path: { + enclave_identifier: components["parameters"]["enclave_identifier"]; + }; + }; + requestBody: components["requestBodies"]["fileUploadBody"]; + responses: { + /** @description Success */ + 200: { + content: never; + }; + default: components["responses"]["NotOk"]; + }; + }; + }; + "/enclaves/{enclave_identifier}/starlark/packages/{package_id}": { + /** + * Executes a Starlark package on the user's behalf + * @description The endpoint will trigger the execution and deployment of a Starlark package. By default, it'll + * return an async logs resource using `starlark_execution_uuid` that can be used to retrieve the logs + * via streaming. It's also possible to block the call and wait for the execution to complete using the + * query parameter `retrieve_logs_async`. + */ + post: { + parameters: { + query?: { + retrieve_logs_async?: components["parameters"]["retrieve_logs_async"]; + }; + path: { + enclave_identifier: components["parameters"]["enclave_identifier"]; + package_id: components["parameters"]["package_id"]; + }; + }; + requestBody: { + content: { + "application/json": components["schemas"]["RunStarlarkPackage"]; + }; + }; + responses: { + /** @description Successful request */ + 200: { + content: { + "application/json": components["schemas"]["StarlarkRunResponse"]; + }; + }; + default: components["responses"]["NotOk"]; + }; + }; + }; + "/enclaves/{enclave_identifier}/starlark/scripts": { + /** + * Executes a Starlark script on the user's behalf + * @description The endpoint will trigger the execution and deployment of a Starlark file. By default, it'll + * return an async logs resource using `starlark_execution_uuid` that can be used to retrieve the logs + * via streaming. It's also possible to block the call and wait for the execution to complete using the + * query parameter `retrieve_logs_async`. + */ + post: { + parameters: { + query?: { + retrieve_logs_async?: components["parameters"]["retrieve_logs_async"]; + }; + path: { + enclave_identifier: components["parameters"]["enclave_identifier"]; + }; + }; + requestBody: { + content: { + "application/json": components["schemas"]["RunStarlarkScript"]; + }; + }; + responses: { + /** @description Successful request */ + 200: { + content: { + "application/json": components["schemas"]["StarlarkRunResponse"]; + }; + }; + default: components["responses"]["NotOk"]; + }; + }; + }; + "/enclaves/{enclave_identifier}/services/{service_identifier}": { + /** Returns detailed information about a specific service */ + get: { + parameters: { + path: { + enclave_identifier: components["parameters"]["enclave_identifier"]; + service_identifier: components["parameters"]["service_identifier"]; + }; + }; + responses: { + /** @description Successful request */ + 200: { + content: { + "application/json": components["schemas"]["ServiceInfo"]; + }; + }; + default: components["responses"]["NotOk"]; + }; + }; + }; + "/enclaves/{enclave_identifier}/services/history": { + /** Returns information about all existing & historical services */ + get: { + parameters: { + path: { + enclave_identifier: components["parameters"]["enclave_identifier"]; + }; + }; + responses: { + /** @description Successful request */ + 200: { + content: { + "application/json": components["schemas"]["ServiceIdentifiers"][]; + }; + }; + default: components["responses"]["NotOk"]; + }; + }; + }; + "/enclaves/{enclave_identifier}/services": { + /** Returns detailed information about alls services within the enclave */ + get: { + parameters: { + query?: { + /** @description Select services to get information */ + services?: string[]; + }; + path: { + enclave_identifier: components["parameters"]["enclave_identifier"]; + }; + }; + responses: { + /** @description Successful request */ + 200: { + content: { + "application/json": { + [key: string]: components["schemas"]["ServiceInfo"]; + }; + }; + }; + default: components["responses"]["NotOk"]; + }; + }; + }; + "/enclaves/{enclave_identifier}/services/{service_identifier}/command": { + /** Executes the given command inside a running service's container */ + post: { + parameters: { + path: { + enclave_identifier: components["parameters"]["enclave_identifier"]; + service_identifier: components["parameters"]["service_identifier"]; + }; + }; + /** @description Exec Command */ + requestBody: { + content: { + "application/json": components["schemas"]["ExecCommand"]; + }; + }; + responses: { + /** @description Successful request */ + 200: { + content: { + "application/json": components["schemas"]["ExecCommandResult"]; + }; + }; + default: components["responses"]["NotOk"]; + }; + }; + }; + "/enclaves/{enclave_identifier}/services/{service_identifier}/endpoints/{port_number}/availability": { + /** + * Check for service availability + * @description Block until the given HTTP endpoint returns available, calling it through a HTTP request + */ + get: { + parameters: { + query?: { + http_method?: components["parameters"]["http_method"]; + path?: components["parameters"]["path"]; + initial_delay_milliseconds?: components["parameters"]["initial_delay_milliseconds"]; + retries?: components["parameters"]["retries"]; + retries_delay_milliseconds?: components["parameters"]["retries_delay_milliseconds"]; + expected_response?: components["parameters"]["expected_response"]; + request_body?: components["parameters"]["request_body"]; + }; + path: { + enclave_identifier: components["parameters"]["enclave_identifier"]; + service_identifier: components["parameters"]["service_identifier"]; + port_number: components["parameters"]["port_number"]; + }; + }; + responses: { + /** @description Success */ + 200: { + content: never; + }; + default: components["responses"]["NotOk"]; + }; + }; + }; + "/enclaves/{enclave_identifier}/artifacts": { + /** List all files artifacts */ + get: { + parameters: { + path: { + enclave_identifier: components["parameters"]["enclave_identifier"]; + }; + }; + responses: { + /** @description Successful request */ + 200: { + content: { + "application/json": components["schemas"]["FileArtifactReference"][]; + }; + }; + default: components["responses"]["NotOk"]; + }; + }; + }; + "/enclaves/{enclave_identifier}/artifacts/{artifact_identifier}": { + /** Inspect the content of a file artifact */ + get: { + parameters: { + path: { + enclave_identifier: components["parameters"]["enclave_identifier"]; + artifact_identifier: components["parameters"]["artifact_identifier"]; + }; + }; + responses: { + /** @description Successful request */ + 200: { + content: { + "application/json": components["schemas"]["FileArtifactDescription"][]; + }; + }; + default: components["responses"]["NotOk"]; + }; + }; + }; + "/enclaves/{enclave_identifier}/artifacts/{artifact_identifier}/download": { + /** Downloads a files artifact from the Kurtosis File System */ + get: { + parameters: { + path: { + enclave_identifier: components["parameters"]["enclave_identifier"]; + artifact_identifier: components["parameters"]["artifact_identifier"]; + }; + }; + responses: { + /** @description Successful request */ + 200: { + content: { + "application/octet-stream": string; + }; + }; + default: components["responses"]["NotOk"]; + }; + }; + }; + "/enclaves/{enclave_identifier}/artifacts/local-file": { + /** Uploads local file artifact to the Kurtosis File System */ + post: { + parameters: { + path: { + enclave_identifier: components["parameters"]["enclave_identifier"]; + }; + }; + requestBody: components["requestBodies"]["fileUploadBody"]; + responses: { + /** @description Successful request */ + 200: { + content: { + "application/json": { + [key: string]: components["schemas"]["FileArtifactUploadResult"]; + }; + }; + }; + default: components["responses"]["NotOk"]; + }; + }; + }; + "/enclaves/{enclave_identifier}/artifacts/remote-file": { + /** + * Add remote file to Kurtosis File System + * @description Tells the API container to download a files artifact from the web to the Kurtosis File System + */ + post: { + parameters: { + path: { + enclave_identifier: components["parameters"]["enclave_identifier"]; + }; + }; + /** @description Store Web Files Artifact */ + requestBody: { + content: { + "application/json": components["schemas"]["StoreWebFilesArtifact"]; + }; + }; + responses: { + /** @description Successful request */ + 200: { + content: { + "application/json": components["schemas"]["FileArtifactReference"]; + }; + }; + default: components["responses"]["NotOk"]; + }; + }; + }; + "/enclaves/{enclave_identifier}/artifacts/services/{service_identifier}": { + /** + * Add service's file to Kurtosis File System + * @description Tells the API container to copy a files artifact from a service to the Kurtosis File System + */ + post: { + parameters: { + path: { + enclave_identifier: components["parameters"]["enclave_identifier"]; + service_identifier: components["parameters"]["service_identifier"]; + }; + }; + requestBody: { + content: { + "application/json": components["schemas"]["StoreFilesArtifactFromService"]; + }; + }; + responses: { + /** @description Successful request */ + 200: { + content: { + "application/json": components["schemas"]["FileArtifactReference"]; + }; + }; + default: components["responses"]["NotOk"]; + }; + }; + }; + "/enclaves/{enclave_identifier}/services/connection": { + /** User services port forwarding */ + post: { + parameters: { + path: { + enclave_identifier: components["parameters"]["enclave_identifier"]; + }; + }; + requestBody: { + content: { + "application/json": components["schemas"]["Connect"]; + }; + }; + responses: { + /** @description Successful request */ + 200: { + content: never; + }; + default: components["responses"]["NotOk"]; + }; + }; + }; + "/enclaves/{enclave_identifier}/logs": { + /** + * Get enclave's services logs + * @description Get multiple enclave services logs concurrently. This endpoint can stream the logs by either starting + * a Websocket connection (recommended) or legacy HTTP streaming. + */ + get: { + parameters: { + query: { + service_uuid_set: components["parameters"]["service_uuid_set"]; + follow_logs?: components["parameters"]["follow_logs"]; + conjunctive_filters?: components["parameters"]["conjunctive_filters"]; + return_all_logs?: components["parameters"]["return_all_logs"]; + num_log_lines?: components["parameters"]["num_log_lines"]; + }; + path: { + enclave_identifier: components["parameters"]["enclave_identifier"]; + }; + }; + responses: { + /** @description Successful response */ + 200: { + content: { + "application/json": components["schemas"]["ServiceLogs"]; + }; + }; + default: components["responses"]["NotOk"]; + }; + }; + }; + "/enclaves/{enclave_identifier}/services/{service_identifier}/logs": { + /** + * Get service logs + * @description Get service logs. This endpoint can stream the logs by either starting + * a Websocket connection (recommended) or legacy HTTP streaming. + */ + get: { + parameters: { + query?: { + follow_logs?: components["parameters"]["follow_logs"]; + conjunctive_filters?: components["parameters"]["conjunctive_filters"]; + return_all_logs?: components["parameters"]["return_all_logs"]; + num_log_lines?: components["parameters"]["num_log_lines"]; + }; + path: { + enclave_identifier: components["parameters"]["enclave_identifier"]; + service_identifier: components["parameters"]["service_identifier"]; + }; + }; + responses: { + /** @description Successful response */ + 200: { + content: { + "application/json": components["schemas"]["ServiceLogs"]; + }; + }; + default: components["responses"]["NotOk"]; + }; + }; + }; + "/starlark/executions/{starlark_execution_uuid}/logs": { + /** + * Get Starlark execution logs + * @description Stream the logs of an Starlark execution that were initiated using `retrieve_logs_async`. + * The async logs can be consumed only once and expire after consumption or 2 hours after creation. + * This endpoint can stream the logs by either starting a Websocket connection (recommended) or + * legacy HTTP streaming. + */ + get: { + parameters: { + path: { + starlark_execution_uuid: components["parameters"]["starlark_execution_uuid"]; + }; + }; + responses: { + /** @description Successful request */ + 200: { + content: { + "application/json": components["schemas"]["StarlarkRunResponseLine"][]; + }; + }; + default: components["responses"]["NotOk"]; + }; + }; + }; } + export type webhooks = Record; + export interface components { - schemas: { - /** @enum {string} */ - ResponseType: "ERROR" | "INFO" | "WARNING"; - ResponseInfo: { - type: components["schemas"]["ResponseType"]; - message: string; - /** Format: uint32 */ - code: number; - }; - EngineInfo: { - engine_version: string; - }; - CreateEnclave: { - enclave_name: string; - api_container_version_tag: string; - /** @description Enclave log level, defaults to INFO */ - api_container_log_level?: string; - /** @description Enclave mode, defaults to TEST */ - mode?: components["schemas"]["EnclaveMode"]; - /** @description Whether the APIC's container should run with the debug server to receive a remote debug connection */ - should_apic_run_in_debug_mode?: components["schemas"]["ApiContainerDebugMode"]; - }; - /** @enum {string} */ - EnclaveMode: "TEST" | "PRODUCTION"; - /** @enum {string} */ - EnclaveStatus: "RUNNING" | "STOPPED" | "EMPTY"; - /** @enum {string} */ - EnclaveTargetStatus: "STOP"; - /** @enum {string} */ - ApiContainerStatus: "RUNNING" | "STOPPED" | "NON_EXISTENT"; - /** - * @default false - * @enum {boolean} - */ - ApiContainerDebugMode: false | true; - EnclaveInfo: { - enclave_uuid: string; - name: string; - shortened_uuid: string; - containers_status: components["schemas"]["EnclaveStatus"]; - api_container_status: components["schemas"]["ApiContainerStatus"]; - api_container_info?: components["schemas"]["EnclaveAPIContainerInfo"]; - api_container_host_machine_info?: components["schemas"]["EnclaveAPIContainerHostMachineInfo"]; - creation_time: components["schemas"]["Timestamp"]; - mode: components["schemas"]["EnclaveMode"]; - }; - EnclaveAPIContainerInfo: { - container_id: string; - ip_inside_enclave: string; - grpc_port_inside_enclave: number; - bridge_ip_address: string; - }; - EnclaveAPIContainerHostMachineInfo: { - ip_on_host_machine: string; - grpc_port_on_host_machine: number; - }; - EnclaveIdentifiers: { - enclave_uuid: string; - name: string; - shortened_uuid: string; - }; - EnclaveNameAndUuid: { - name: string; - uuid: string; - }; - DeletionSummary: { - removed_enclave_name_and_uuids?: components["schemas"]["EnclaveNameAndUuid"][]; - }; - /** Format: date-time */ - Timestamp: string; - /** @description Shared Objects (Used By Multiple Endpoints) */ - Port: { - /** Format: int32 */ - number: number; - transport_protocol: components["schemas"]["TransportProtocol"]; - application_protocol?: string; - /** @description The wait timeout duration in string */ - wait_timeout?: string; - }; - /** @enum {string} */ - HttpMethodAvailability: "GET" | "POST"; - Container: { - status: components["schemas"]["ContainerStatus"]; - image_name: string; - entrypoint_args: string[]; - cmd_args: string[]; - env_vars: { - [key: string]: string | undefined; - }; - }; - /** - * @description 0 - STOPPED - * 1 - RUNNING - * 2 - UNKNOWN - * @enum {string} - */ - ServiceStatus: "STOPPED" | "RUNNING" | "UNKNOWN"; - /** - * @description 0 - ALWAYS - * 1 - MISSING - * @enum {string} - */ - ImageDownloadMode: "ALWAYS" | "MISSING"; - ServiceInfo: { - /** @description UUID of the service */ - service_uuid: string; - /** @description The IP address of the service inside the enclave */ - private_ip_addr: string; - private_ports: { - [key: string]: components["schemas"]["Port"] | undefined; - }; - /** @description Public IP address *outside* the enclave where the service is reachable - * NOTE: Will be empty if the service isn't running, the service didn't define any ports, or the backend doesn't support reporting public service info */ - public_ip_addr?: string; - public_ports?: { - [key: string]: components["schemas"]["Port"] | undefined; - }; - /** @description Name of the service */ - name: string; - /** @description Shortened uuid of the service */ - shortened_uuid: string; - service_status: components["schemas"]["ServiceStatus"]; - container: components["schemas"]["Container"]; - }; - /** - * @description 0 - CONNECT // Best effort port forwarding - * 1 - NO_CONNECT // Port forwarding disabled - * @enum {string} - */ - Connect: "CONNECT" | "NO_CONNECT"; - RunStarlarkScript: { - serialized_script: string; - /** @description Parameters data for the Starlark package main function */ - params?: { - [key: string]: unknown; - }; - /** @description Defaults to false */ - dry_run?: boolean; - /** - * Format: int32 - * @description Defaults to 4 - */ - parallelism?: number; - /** @description The name of the main function, the default value is "run" */ - main_function_name?: string; - experimental_features?: components["schemas"]["KurtosisFeatureFlag"][]; - /** @description Defaults to empty */ - cloud_instance_id?: string; - /** @description Defaults to empty */ - cloud_user_id?: string; - image_download_mode?: components["schemas"]["ImageDownloadMode"]; - /** @description Defaults to false */ - non_blocking_mode?: boolean; - }; - RunStarlarkPackage: { - /** @description Parameters data for the Starlark package main function */ - params?: { - [key: string]: unknown; - }; - /** @description Defaults to false */ - dry_run?: boolean; - /** - * Format: int32 - * @description Defaults to 4 - */ - parallelism?: number; - /** @description Whether the package should be cloned or not. - * If false, then the package will be pulled from the APIC local package store. If it's a local package then is must - * have been uploaded using UploadStarlarkPackage prior to calling RunStarlarkPackage. - * If true, then the package will be cloned from GitHub before execution starts */ - clone_package?: boolean; - /** @description The relative main file filepath, the default value is the "main.star" file in the root of a package */ - relative_path_to_main_file?: string; - /** @description The name of the main function, the default value is "run" */ - main_function_name?: string; - experimental_features?: components["schemas"]["KurtosisFeatureFlag"][]; - /** @description Defaults to empty */ - cloud_instance_id?: string; - /** @description Defaults to empty */ - cloud_user_id?: string; - image_download_mode?: components["schemas"]["ImageDownloadMode"]; - /** @description Defaults to false */ - non_blocking_mode?: boolean; - /** @description Defaults to empty */ - github_auth_token?: string; - }; - /** - * @description 0 - NO_INSTRUCTIONS_CACHING - * @enum {string} - */ - KurtosisFeatureFlag: "NO_INSTRUCTIONS_CACHING"; - /** @description Starlark Execution Logs */ - StarlarkRunLogs: components["schemas"]["StarlarkRunResponseLine"][]; - /** @description Starlark Execution Response */ - StarlarkRunResponseLine: components["schemas"]["StarlarkInstruction"] | components["schemas"]["StarlarkError"] | components["schemas"]["StarlarkRunProgress"] | components["schemas"]["StarlarkInstructionResult"] | components["schemas"]["StarlarkRunFinishedEvent"] | components["schemas"]["StarlarkWarning"] | components["schemas"]["StarlarkInfo"]; - StarlarkInfo: { - info: { - instruction: { - info_message: string; - }; - }; - }; - StarlarkWarning: { - warning: { - warning_message: string; - }; - }; - StarlarkInstruction: { - position?: components["schemas"]["StarlarkInstructionPosition"]; - instruction_name: string; - arguments: components["schemas"]["StarlarkInstructionArgument"][]; - executable_instruction: string; - is_skipped: boolean; - }; - StarlarkInstructionResult: { - instruction_result: { - serialized_instruction_result: string; - }; - }; - StarlarkInstructionArgument: { - serialized_arg_value: string; - arg_name?: string; - is_representative: boolean; - }; - StarlarkInstructionPosition: { - filename: string; - /** Format: int32 */ - line: number; - /** Format: int32 */ - column: number; - }; - StarlarkError: { - error: components["schemas"]["StarlarkInterpretationError"] | components["schemas"]["StarlarkValidationError"] | components["schemas"]["StarlarkExecutionError"]; - }; - StarlarkInterpretationError: { - interpretation_error: { - error_message: string; - }; - }; - StarlarkValidationError: { - validation_error: { - error_message: string; - }; - }; - StarlarkExecutionError: { - execution_error: { - error_message: string; - }; - }; - StarlarkRunProgress: { - progress_info: { - current_step_info: string[]; - /** Format: int32 */ - total_steps: number; - /** Format: int32 */ - current_step_number: number; - }; - }; - StarlarkRunFinishedEvent: { - run_finished_event: { - is_run_successful: boolean; - serialized_output?: string; - }; - }; - /** @description Use it to asynchronously retrieve the execution logs via Websockets or http streaming */ - AsyncStarlarkExecutionLogs: { - /** @description Execution UUID to asynchronously retrieve the execution logs */ - async_starlark_execution_logs: { - starlark_execution_uuid: string; - }; - }; - StarlarkRunResponse: { - starlark_execution_logs?: components["schemas"]["AsyncStarlarkExecutionLogs"] | components["schemas"]["StarlarkRunLogs"]; - }; - /** @description An service identifier is a collection of uuid, name and shortened uuid */ - ServiceIdentifiers: { - /** @description UUID of the service */ - service_uuid: string; - /** @description Name of the service */ - name: string; - /** @description The shortened uuid of the service */ - shortened_uuid: string; - }; - /** @description Exec Command */ - ExecCommand: { - command_args: string[]; - }; - ExecCommandResult: { - /** Format: int32 */ - exit_code: number; - /** @description Assumes UTF-8 encoding */ - log_output: string; - }; - FileArtifactUploadResult: { - file_artifact_upload_result?: components["schemas"]["FileArtifactReference"] | components["schemas"]["ResponseInfo"]; - }; - /** @description Files Artifact identifier */ - FileArtifactReference: { - /** @description UUID of the files artifact, for use when referencing it in the future */ - uuid: string; - /** @description UUID of the files artifact, for use when referencing it in the future */ - name: string; - }; - /** @description Store Web Files Artifact */ - StoreWebFilesArtifact: { - /** @description URL to download the artifact from */ - url: string; - /** @description The name of the files artifact */ - name: string; - }; - StoreFilesArtifactFromService: { - /** @description The absolute source path where the source files will be copied from */ - source_path: string; - /** @description The name of the files artifact */ - name: string; - }; - FileArtifactDescription: { - /** @description Path relative to the file artifact */ - path: string; - /** - * Format: int64 - * @description Size of the file, in bytes - */ - size: number; - /** @description A bit of text content, if the file allows (similar to UNIX's 'head') */ - text_preview?: string; - }; - /** - * @description 0 - NEVER - * 1 - ALWAYS - * @enum {string} - */ - RestartPolicy: "NEVER" | "ALWAYS"; - StarlarkDescription: { - package_id: string; - serialized_script: string; - serialized_params: string; - /** Format: int32 */ - parallelism: number; - relative_path_to_main_file: string; - main_function_name: string; - experimental_features: components["schemas"]["KurtosisFeatureFlag"][]; - restart_policy: components["schemas"]["RestartPolicy"]; - }; - /** - * @description 0 - TCP - * 1 - SCTP - * 2 - UDP - * @enum {string} - */ - TransportProtocol: "TCP" | "SCTP" | "UDP"; - /** - * @description 0 - STOPPED - * 1 - RUNNING - * 2 - UNKNOWN - * @enum {string} - */ - ContainerStatus: "STOPPED" | "RUNNING" | "UNKNOWN"; - ServiceLogs: { - service_logs_by_service_uuid?: { - [key: string]: components["schemas"]["LogLine"] | undefined; - }; - not_found_service_uuid_set?: string[]; - }; - LogLine: { - line: string[]; - timestamp: components["schemas"]["Timestamp"]; - }; - LogLineFilter: { - operator: components["schemas"]["LogLineOperator"]; - text_pattern: string; - }; - /** @enum {string} */ - LogLineOperator: "DOES_CONTAIN_TEXT" | "DOES_NOT_CONTAIN_TEXT" | "DOES_CONTAIN_MATCH_REGEX" | "DOES_NOT_CONTAIN_MATCH_REGEX"; + schemas: { + /** @enum {string} */ + ResponseType: "ERROR" | "INFO" | "WARNING"; + ResponseInfo: { + type: components["schemas"]["ResponseType"]; + message: string; + /** Format: uint32 */ + code: number; }; - responses: { - /** @description Unexpected error */ - NotOk: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["ResponseInfo"]; - }; - }; + EngineInfo: { + engine_version: string; + }; + CreateEnclave: { + enclave_name: string; + api_container_version_tag: string; + /** @description Enclave log level, defaults to INFO */ + api_container_log_level?: string; + /** @description Enclave mode, defaults to TEST */ + mode?: components["schemas"]["EnclaveMode"]; + /** @description Whether the APIC's container should run with the debug server to receive a remote debug connection */ + should_apic_run_in_debug_mode?: components["schemas"]["ApiContainerDebugMode"]; + }; + /** @enum {string} */ + EnclaveMode: "TEST" | "PRODUCTION"; + /** @enum {string} */ + EnclaveStatus: "RUNNING" | "STOPPED" | "EMPTY"; + /** @enum {string} */ + EnclaveTargetStatus: "STOP"; + /** @enum {string} */ + ApiContainerStatus: "RUNNING" | "STOPPED" | "NON_EXISTENT"; + /** + * @default false + * @enum {boolean} + */ + ApiContainerDebugMode: false | true; + EnclaveInfo: { + enclave_uuid: string; + name: string; + shortened_uuid: string; + containers_status: components["schemas"]["EnclaveStatus"]; + api_container_status: components["schemas"]["ApiContainerStatus"]; + api_container_info?: components["schemas"]["EnclaveAPIContainerInfo"]; + api_container_host_machine_info?: components["schemas"]["EnclaveAPIContainerHostMachineInfo"]; + creation_time: components["schemas"]["Timestamp"]; + mode: components["schemas"]["EnclaveMode"]; + }; + EnclaveAPIContainerInfo: { + container_id: string; + ip_inside_enclave: string; + grpc_port_inside_enclave: number; + bridge_ip_address: string; + }; + EnclaveAPIContainerHostMachineInfo: { + ip_on_host_machine: string; + grpc_port_on_host_machine: number; + }; + EnclaveIdentifiers: { + enclave_uuid: string; + name: string; + shortened_uuid: string; + }; + EnclaveNameAndUuid: { + name: string; + uuid: string; + }; + DeletionSummary: { + removed_enclave_name_and_uuids?: components["schemas"]["EnclaveNameAndUuid"][]; + }; + /** Format: date-time */ + Timestamp: string; + /** @description Shared Objects (Used By Multiple Endpoints) */ + Port: { + /** Format: int32 */ + number: number; + transport_protocol: components["schemas"]["TransportProtocol"]; + application_protocol?: string; + /** @description The wait timeout duration in string */ + wait_timeout?: string; + }; + /** @enum {string} */ + HttpMethodAvailability: "GET" | "POST"; + Container: { + status: components["schemas"]["ContainerStatus"]; + image_name: string; + entrypoint_args: string[]; + cmd_args: string[]; + env_vars: { + [key: string]: string; + }; + }; + /** + * @description 0 - STOPPED + * 1 - RUNNING + * 2 - UNKNOWN + * @enum {string} + */ + ServiceStatus: "STOPPED" | "RUNNING" | "UNKNOWN"; + /** + * @description 0 - ALWAYS + * 1 - MISSING + * @enum {string} + */ + ImageDownloadMode: "ALWAYS" | "MISSING"; + ServiceInfo: { + /** @description UUID of the service */ + service_uuid: string; + /** @description The IP address of the service inside the enclave */ + private_ip_addr: string; + private_ports: { + [key: string]: components["schemas"]["Port"]; + }; + /** + * @description Public IP address *outside* the enclave where the service is reachable + * NOTE: Will be empty if the service isn't running, the service didn't define any ports, or the backend doesn't support reporting public service info + */ + public_ip_addr?: string; + public_ports?: { + [key: string]: components["schemas"]["Port"]; + }; + /** @description Name of the service */ + name: string; + /** @description Shortened uuid of the service */ + shortened_uuid: string; + service_status: components["schemas"]["ServiceStatus"]; + container: components["schemas"]["Container"]; + }; + /** + * @description 0 - CONNECT // Best effort port forwarding + * 1 - NO_CONNECT // Port forwarding disabled + * @enum {string} + */ + Connect: "CONNECT" | "NO_CONNECT"; + RunStarlarkScript: { + serialized_script: string; + /** @description Parameters data for the Starlark package main function */ + params?: { + [key: string]: unknown; + }; + /** @description Defaults to false */ + dry_run?: boolean; + /** + * Format: int32 + * @description Defaults to 4 + */ + parallelism?: number; + /** @description The name of the main function, the default value is "run" */ + main_function_name?: string; + experimental_features?: components["schemas"]["KurtosisFeatureFlag"][]; + /** @description Defaults to empty */ + cloud_instance_id?: string; + /** @description Defaults to empty */ + cloud_user_id?: string; + image_download_mode?: components["schemas"]["ImageDownloadMode"]; + /** @description Defaults to false */ + non_blocking_mode?: boolean; + }; + RunStarlarkPackage: { + /** @description Parameters data for the Starlark package main function */ + params?: { + [key: string]: unknown; + }; + /** @description Defaults to false */ + dry_run?: boolean; + /** + * Format: int32 + * @description Defaults to 4 + */ + parallelism?: number; + /** + * @description Whether the package should be cloned or not. + * If false, then the package will be pulled from the APIC local package store. If it's a local package then is must + * have been uploaded using UploadStarlarkPackage prior to calling RunStarlarkPackage. + * If true, then the package will be cloned from GitHub before execution starts + */ + clone_package?: boolean; + /** @description The relative main file filepath, the default value is the "main.star" file in the root of a package */ + relative_path_to_main_file?: string; + /** @description The name of the main function, the default value is "run" */ + main_function_name?: string; + experimental_features?: components["schemas"]["KurtosisFeatureFlag"][]; + /** @description Defaults to empty */ + cloud_instance_id?: string; + /** @description Defaults to empty */ + cloud_user_id?: string; + image_download_mode?: components["schemas"]["ImageDownloadMode"]; + /** @description Defaults to false */ + non_blocking_mode?: boolean; + /** @description Defaults to empty */ + github_auth_token?: string; + }; + /** + * @description 0 - NO_INSTRUCTIONS_CACHING + * @enum {string} + */ + KurtosisFeatureFlag: "NO_INSTRUCTIONS_CACHING"; + /** @description Starlark Execution Logs */ + StarlarkRunLogs: components["schemas"]["StarlarkRunResponseLine"][]; + /** @description Starlark Execution Response */ + StarlarkRunResponseLine: components["schemas"]["StarlarkInstruction"] | components["schemas"]["StarlarkError"] | components["schemas"]["StarlarkRunProgress"] | components["schemas"]["StarlarkInstructionResult"] | components["schemas"]["StarlarkRunFinishedEvent"] | components["schemas"]["StarlarkWarning"] | components["schemas"]["StarlarkInfo"]; + StarlarkInfo: { + info: { + instruction: { + info_message: string; + }; + }; + }; + StarlarkWarning: { + warning: { + warning_message: string; + }; + }; + StarlarkInstruction: { + position?: components["schemas"]["StarlarkInstructionPosition"]; + instruction_name: string; + arguments: components["schemas"]["StarlarkInstructionArgument"][]; + executable_instruction: string; + is_skipped: boolean; + }; + StarlarkInstructionResult: { + instruction_result: { + serialized_instruction_result: string; + }; + }; + StarlarkInstructionArgument: { + serialized_arg_value: string; + arg_name?: string; + is_representative: boolean; + }; + StarlarkInstructionPosition: { + filename: string; + /** Format: int32 */ + line: number; + /** Format: int32 */ + column: number; + }; + StarlarkError: { + error: components["schemas"]["StarlarkInterpretationError"] | components["schemas"]["StarlarkValidationError"] | components["schemas"]["StarlarkExecutionError"]; }; - parameters: { - /** @description UUID, shortened UUID, or name of the enclave */ - enclave_identifier: string; - /** @description The service identifier of the container that the command should be executed in */ - service_identifier: string; - /** @description The unique identifier to track the execution of a Starlark script or package */ + StarlarkInterpretationError: { + interpretation_error: { + error_message: string; + }; + }; + StarlarkValidationError: { + validation_error: { + error_message: string; + }; + }; + StarlarkExecutionError: { + execution_error: { + error_message: string; + }; + }; + StarlarkRunProgress: { + progress_info: { + current_step_info: string[]; + /** Format: int32 */ + total_steps: number; + /** Format: int32 */ + current_step_number: number; + }; + }; + StarlarkRunFinishedEvent: { + run_finished_event: { + is_run_successful: boolean; + serialized_output?: string; + }; + }; + /** @description Use it to asynchronously retrieve the execution logs via Websockets or http streaming */ + AsyncStarlarkExecutionLogs: { + /** @description Execution UUID to asynchronously retrieve the execution logs */ + async_starlark_execution_logs: { starlark_execution_uuid: string; - service_uuid_set: string[]; - /** @description If false, block http response until all logs are available. Default is true */ - retrieve_logs_async: boolean; - /** @description If true, remove all enclaves. Otherwise only remove stopped enclaves. Default is false */ - remove_all: boolean; - /** @description The port number to check availability */ - port_number: number; - /** @description The HTTP method used to check availability. Default is GET. */ - http_method: components["schemas"]["HttpMethodAvailability"]; - /** @description The path of the service to check. It mustn't start with the first slash. For instance `service/health` */ - path: string; - /** @description The number of milliseconds to wait until executing the first HTTP call */ - initial_delay_milliseconds: number; - /** @description Max number of HTTP call attempts that this will execute until giving up and returning an error */ - retries: number; - /** @description Number of milliseconds to wait between retries */ - retries_delay_milliseconds: number; - /** @description If the endpoint returns this value, the service will be marked as available (e.g. Hello World). */ - expected_response: string; - /** @description If the http_method is set to POST, this value will be send as the body of the availability request. */ - request_body: string; - /** @description The artifact name or uuid */ - artifact_identifier: string; - /** @description The package identifier that will be executed */ - package_id: string; - follow_logs: boolean; - conjunctive_filters: components["schemas"]["LogLineFilter"][]; - return_all_logs: boolean; - num_log_lines: number; - }; - requestBodies: { - fileUploadBody: { - content: { - "multipart/form-data": string; - }; - }; + }; + }; + StarlarkRunResponse: { + starlark_execution_logs?: components["schemas"]["AsyncStarlarkExecutionLogs"] | components["schemas"]["StarlarkRunLogs"]; + }; + /** @description An service identifier is a collection of uuid, name and shortened uuid */ + ServiceIdentifiers: { + /** @description UUID of the service */ + service_uuid: string; + /** @description Name of the service */ + name: string; + /** @description The shortened uuid of the service */ + shortened_uuid: string; + }; + /** @description Exec Command */ + ExecCommand: { + command_args: string[]; + }; + ExecCommandResult: { + /** Format: int32 */ + exit_code: number; + /** @description Assumes UTF-8 encoding */ + log_output: string; + }; + FileArtifactUploadResult: { + file_artifact_upload_result?: components["schemas"]["FileArtifactReference"] | components["schemas"]["ResponseInfo"]; + }; + /** @description Files Artifact identifier */ + FileArtifactReference: { + /** @description UUID of the files artifact, for use when referencing it in the future */ + uuid: string; + /** @description UUID of the files artifact, for use when referencing it in the future */ + name: string; }; - headers: never; - pathItems: never; + /** @description Store Web Files Artifact */ + StoreWebFilesArtifact: { + /** @description URL to download the artifact from */ + url: string; + /** @description The name of the files artifact */ + name: string; + }; + StoreFilesArtifactFromService: { + /** @description The absolute source path where the source files will be copied from */ + source_path: string; + /** @description The name of the files artifact */ + name: string; + }; + FileArtifactDescription: { + /** @description Path relative to the file artifact */ + path: string; + /** + * Format: int64 + * @description Size of the file, in bytes + */ + size: number; + /** @description A bit of text content, if the file allows (similar to UNIX's 'head') */ + text_preview?: string; + }; + /** + * @description 0 - NEVER + * 1 - ALWAYS + * @enum {string} + */ + RestartPolicy: "NEVER" | "ALWAYS"; + StarlarkDescription: { + package_id: string; + serialized_script: string; + serialized_params: string; + /** Format: int32 */ + parallelism: number; + relative_path_to_main_file: string; + main_function_name: string; + experimental_features: components["schemas"]["KurtosisFeatureFlag"][]; + restart_policy: components["schemas"]["RestartPolicy"]; + }; + /** + * @description 0 - TCP + * 1 - SCTP + * 2 - UDP + * @enum {string} + */ + TransportProtocol: "TCP" | "SCTP" | "UDP"; + /** + * @description 0 - STOPPED + * 1 - RUNNING + * 2 - UNKNOWN + * @enum {string} + */ + ContainerStatus: "STOPPED" | "RUNNING" | "UNKNOWN"; + ServiceLogs: { + service_logs_by_service_uuid?: { + [key: string]: components["schemas"]["LogLine"]; + }; + not_found_service_uuid_set?: string[]; + }; + LogLine: { + line: string[]; + timestamp: components["schemas"]["Timestamp"]; + }; + LogLineFilter: { + operator: components["schemas"]["LogLineOperator"]; + text_pattern: string; + }; + /** @enum {string} */ + LogLineOperator: "DOES_CONTAIN_TEXT" | "DOES_NOT_CONTAIN_TEXT" | "DOES_CONTAIN_MATCH_REGEX" | "DOES_NOT_CONTAIN_MATCH_REGEX"; + }; + responses: { + /** @description Unexpected error */ + NotOk: { + content: { + "application/json": components["schemas"]["ResponseInfo"]; + }; + }; + }; + parameters: { + /** @description UUID, shortened UUID, or name of the enclave */ + enclave_identifier: string; + /** @description The service identifier of the container that the command should be executed in */ + service_identifier: string; + /** @description The unique identifier to track the execution of a Starlark script or package */ + starlark_execution_uuid: string; + service_uuid_set: string[]; + /** @description If false, block http response until all logs are available. Default is true */ + retrieve_logs_async?: boolean; + /** @description If true, remove all enclaves. Otherwise only remove stopped enclaves. Default is false */ + remove_all?: boolean; + /** @description The port number to check availability */ + port_number: number; + /** @description The HTTP method used to check availability. Default is GET. */ + http_method?: components["schemas"]["HttpMethodAvailability"]; + /** @description The path of the service to check. It mustn't start with the first slash. For instance `service/health` */ + path?: string; + /** @description The number of milliseconds to wait until executing the first HTTP call */ + initial_delay_milliseconds?: number; + /** @description Max number of HTTP call attempts that this will execute until giving up and returning an error */ + retries?: number; + /** @description Number of milliseconds to wait between retries */ + retries_delay_milliseconds?: number; + /** @description If the endpoint returns this value, the service will be marked as available (e.g. Hello World). */ + expected_response?: string; + /** @description If the http_method is set to POST, this value will be send as the body of the availability request. */ + request_body?: string; + /** @description The artifact name or uuid */ + artifact_identifier: string; + /** @description The package identifier that will be executed */ + package_id: string; + follow_logs?: boolean; + conjunctive_filters?: components["schemas"]["LogLineFilter"][]; + return_all_logs?: boolean; + num_log_lines?: number; + }; + requestBodies: { + fileUploadBody?: { + content: { + "multipart/form-data": string; + }; + }; + }; + headers: never; + pathItems: never; } + export type $defs = Record; + +export type external = Record; + export type operations = Record; diff --git a/cli/cli/commands/service/inspect/inspect.go b/cli/cli/commands/service/inspect/inspect.go index ec4f577297..110155e453 100644 --- a/cli/cli/commands/service/inspect/inspect.go +++ b/cli/cli/commands/service/inspect/inspect.go @@ -185,6 +185,7 @@ func PrintServiceInspect(ctx context.Context, kurtosisBackend backend_interface. jsonMap[ServicePortsTitleName] = userService.GetPrivatePorts() // TODO: add support for files artifacts entrypoint + // TODO: add support for cpu min max memory var marshaled []byte var err error diff --git a/cli/cli/commands/service/update/update.go b/cli/cli/commands/service/update/update.go index 6504e39c8b..b18a665dfd 100644 --- a/cli/cli/commands/service/update/update.go +++ b/cli/cli/commands/service/update/update.go @@ -394,7 +394,7 @@ func run( // call run add service starlark script addServiceStarlarkStr := add.GetAddServiceStarlarkScript(serviceName, serviceConfigStr) - logrus.Info("Running update service starlark for service '%v' in enclave '%v'...", serviceName, enclaveIdentifier) + logrus.Infof("Running update service starlark for service '%v' in enclave '%v'...", serviceName, enclaveIdentifier) starlarkRunResult, err := add.RunAddServiceStarlarkScript(ctx, serviceName, enclaveIdentifier, addServiceStarlarkStr, enclaveCtx) if err != nil { return err //already wrapped diff --git a/core/server/api_container/main.go b/core/server/api_container/main.go index 80332bbbd2..1e29148540 100644 --- a/core/server/api_container/main.go +++ b/core/server/api_container/main.go @@ -173,7 +173,18 @@ func runMain() error { return stacktrace.NewError("Backend type '%v' was not recognized by API container.", serverArgs.KurtosisBackendType.String()) } - serviceNetwork, err := createServiceNetwork(kurtosisBackend, enclaveDataDir, serverArgs, ownIpAddress, enclaveDb) + starlarkValueSerde := createStarlarkValueSerde() + runtimeValueStore, err := runtime_value_store.CreateRuntimeValueStore(starlarkValueSerde, enclaveDb) + if err != nil { + return stacktrace.Propagate(err, "An error occurred creating the runtime value store") + } + + interpretationTimeValueStore, err := interpretation_time_value_store.CreateInterpretationTimeValueStore(enclaveDb, starlarkValueSerde) + if err != nil { + return stacktrace.Propagate(err, "An error occurred while creating the interpretation time value store") + } + + serviceNetwork, err := createServiceNetwork(kurtosisBackend, enclaveDataDir, serverArgs, ownIpAddress, enclaveDb, interpretationTimeValueStore) if err != nil { return stacktrace.Propagate(err, "An error occurred creating the service network") } @@ -203,17 +214,6 @@ func runMain() error { } }() - starlarkValueSerde := createStarlarkValueSerde() - runtimeValueStore, err := runtime_value_store.CreateRuntimeValueStore(starlarkValueSerde, enclaveDb) - if err != nil { - return stacktrace.Propagate(err, "An error occurred creating the runtime value store") - } - - interpretationTimeValueStore, err := interpretation_time_value_store.CreateInterpretationTimeValueStore(enclaveDb, starlarkValueSerde) - if err != nil { - return stacktrace.Propagate(err, "an error occurred while creating the interpretation time value store") - } - // Load the current enclave plan, in case the enclave is being restarted enclavePlan, err := enclave_plan_persistence.Load(enclaveDb) if err != nil { @@ -247,6 +247,7 @@ func runMain() error { metricsClient, githubAuthProvider, starlarkRunRepository, + interpretationTimeValueStore, ) if err != nil { return stacktrace.Propagate(err, "An error occurred creating the API container service") @@ -277,6 +278,7 @@ func createServiceNetwork( args *args.APIContainerArgs, ownIpAddress net.IP, enclaveDb *enclave_db.EnclaveDB, + interpretationTimeValueStore *interpretation_time_value_store.InterpretationTimeValueStore, ) (service_network.ServiceNetwork, error) { enclaveIdStr := args.EnclaveUUID enclaveUuid := enclave.EnclaveUUID(enclaveIdStr) @@ -287,13 +289,7 @@ func createServiceNetwork( args.Version, ) - serviceNetwork, err := service_network.NewDefaultServiceNetwork( - enclaveUuid, - apiContainerInfo, - kurtosisBackend, - enclaveDataDir, - enclaveDb, - ) + serviceNetwork, err := service_network.NewDefaultServiceNetwork(enclaveUuid, apiContainerInfo, kurtosisBackend, enclaveDataDir, enclaveDb, interpretationTimeValueStore) if err != nil { return nil, stacktrace.Propagate(err, "An error occurred while creating the default service network") diff --git a/core/server/api_container/server/api_container_service.go b/core/server/api_container/server/api_container_service.go index 656346d21b..7fe62e8f11 100644 --- a/core/server/api_container/server/api_container_service.go +++ b/core/server/api_container/server/api_container_service.go @@ -16,6 +16,7 @@ import ( "github.com/kurtosis-tech/kurtosis/core/server/api_container/server/startosis_engine/docker_compose_transpiler" "github.com/kurtosis-tech/kurtosis/core/server/api_container/server/startosis_engine/enclave_structure" "github.com/kurtosis-tech/kurtosis/core/server/api_container/server/startosis_engine/instructions_plan/resolver" + "github.com/kurtosis-tech/kurtosis/core/server/api_container/server/startosis_engine/interpretation_time_value_store" "github.com/kurtosis-tech/kurtosis/core/server/api_container/server/startosis_engine/plan_yaml" "github.com/kurtosis-tech/kurtosis/core/server/api_container/server/startosis_engine/starlark_run" "github.com/kurtosis-tech/kurtosis/core/server/api_container/server/startosis_engine/startosis_packages/git_package_content_provider" @@ -101,6 +102,8 @@ type ApiContainerService struct { metricsClient metrics_client.MetricsClient githubAuthProvider *git_package_content_provider.GitHubPackageAuthProvider + + interpretationTimeValueStore *interpretation_time_value_store.InterpretationTimeValueStore } func NewApiContainerService( @@ -113,6 +116,7 @@ func NewApiContainerService( metricsClient metrics_client.MetricsClient, githubAuthProvider *git_package_content_provider.GitHubPackageAuthProvider, starlarkRunRepository *starlark_run.StarlarkRunRepository, + interpretationTimeValueStore *interpretation_time_value_store.InterpretationTimeValueStore, ) (*ApiContainerService, error) { if err := initStarlarkRun(starlarkRunRepository, restartPolicy); err != nil { @@ -120,14 +124,15 @@ func NewApiContainerService( } service := &ApiContainerService{ - filesArtifactStore: filesArtifactStore, - serviceNetwork: serviceNetwork, - startosisRunner: startosisRunner, - startosisInterpreter: startosisInterpreter, - packageContentProvider: startosisModuleContentProvider, - starlarkRunRepository: starlarkRunRepository, - metricsClient: metricsClient, - githubAuthProvider: githubAuthProvider, + filesArtifactStore: filesArtifactStore, + serviceNetwork: serviceNetwork, + startosisRunner: startosisRunner, + startosisInterpreter: startosisInterpreter, + packageContentProvider: startosisModuleContentProvider, + starlarkRunRepository: starlarkRunRepository, + metricsClient: metricsClient, + githubAuthProvider: githubAuthProvider, + interpretationTimeValueStore: interpretationTimeValueStore, } return service, nil @@ -884,6 +889,10 @@ func (apicService *ApiContainerService) getServiceInfoForIdentifier(ctx context. ) if err != nil { return nil, stacktrace.Propagate(err, "An error occurred getting info for service '%v'", serviceIdentifier) + } + serviceConfig, err := apicService.interpretationTimeValueStore.GetServiceConfig(serviceObj.GetRegistration().GetName()) + if err != nil { + } serviceInfo, err := getServiceInfoFromServiceObj(serviceObj) if err != nil { @@ -1085,6 +1094,13 @@ func getServiceInfoFromServiceObj(serviceObj *service.Service) (*kurtosis_core_r EnvVars: serviceContainer.GetEnvVars(), } + serviceDirPathsToFilesArtifactsIdentifiers := map[string]string{} + + maxMillicpus := uint32(0) + minMillicpus := uint32(0) + maxMemoryMegabytes := uint32(0) + minMemoryMegabytes := uint32(0) + serviceInfoResponse := binding_constructors.NewServiceInfo( serviceUuidStr, serviceNameStr, @@ -1095,7 +1111,13 @@ func getServiceInfoFromServiceObj(serviceObj *service.Service) (*kurtosis_core_r publicApiPorts, serviceStatus, serviceInfoContainer, + serviceDirPathsToFilesArtifactsIdentifiers, + maxMillicpus, + minMillicpus, + maxMemoryMegabytes, + minMemoryMegabytes, ) + return serviceInfoResponse, nil } diff --git a/core/server/api_container/server/service_network/services_files_artifacts/repository.go b/core/server/api_container/server/service_network/services_files_artifacts/repository.go new file mode 100644 index 0000000000..7dbc0b7520 --- /dev/null +++ b/core/server/api_container/server/service_network/services_files_artifacts/repository.go @@ -0,0 +1,89 @@ +package services_files_artifacts + +import ( + "encoding/json" + "github.com/kurtosis-tech/kurtosis/container-engine-lib/lib/database_accessors/consts" + "github.com/kurtosis-tech/kurtosis/container-engine-lib/lib/database_accessors/enclave_db" + "github.com/kurtosis-tech/stacktrace" + "github.com/sirupsen/logrus" + bolt "go.etcd.io/bbolt" +) + +var ( + servicesFilesArtifactsBucketName = []byte("services-files-artifacts-repository") + servicesFilesArtifactsSliceKey = []byte("service-files-artifacts-slice") +) + +type ServicesFilesArtifactsRepository struct { + enclaveDb *enclave_db.EnclaveDB +} + +func GetOrCreateNewServicesFilesArtifactsRepository(enclaveDb *enclave_db.EnclaveDB) (*ServicesFilesArtifactsRepository, error) { + if err := enclaveDb.Update(func(tx *bolt.Tx) error { + bucket, err := tx.CreateBucketIfNotExists(servicesFilesArtifactsBucketName) + if err != nil { + return stacktrace.Propagate(err, "An error occurred while creating the services files artifacts identifiers database bucket") + } + logrus.Debugf("Services files artifacts bucket identifier: '%+v'", bucket) + + return nil + }); err != nil { + return nil, stacktrace.Propagate(err, "An error occurred while building the services files artifacts repository") + } + + servicesFilesArtifactsRepository := &ServicesFilesArtifactsRepository{ + enclaveDb: enclaveDb, + } + + return servicesFilesArtifactsRepository, nil +} + +func (repository *ServicesFilesArtifactsRepository) AddServicesFilesArtifacts( + servicesFilesArtifactsObj *servicesFilesArtifacts, +) error { + + if err := repository.enclaveDb.Update(func(tx *bolt.Tx) error { + bucket := tx.Bucket(servicesFilesArtifactsBucketName) + + // retrieve the list from the bucket + servicesFilesArtifacts, err := getServicesFilesArtifactsFromBucket(bucket) + if err != nil { + return stacktrace.Propagate(err, "An error occurred getting service identifiers from bucket with name '%s'", servicesFilesArtifactsBucketName) + } + + // add the new element + servicesFilesArtifacts = append(servicesFilesArtifacts, servicesFilesArtifactsObj) + servicesFilesArtifactsPtr := &servicesFilesArtifacts + jsonBytes, err := json.Marshal(servicesFilesArtifactsPtr) + if err != nil { + return stacktrace.Propagate(err, "An error occurred marshalling service identifiers '%+v'", servicesFilesArtifacts) + } + + // save it to disk + if err := bucket.Put(servicesFilesArtifactsSliceKey, jsonBytes); err != nil { + return stacktrace.Propagate(err, "An error occurred while saving service identifiers '%+v' into the enclave db", servicesFilesArtifacts) + } + return nil + }); err != nil { + return stacktrace.Propagate(err, "An error occurred while adding service identifier '%v' into the enclave db", servicesFilesArtifactsObj) + } + return nil +} + +func getServicesFilesArtifactsFromBucket(bucket *bolt.Bucket) ([]*servicesFilesArtifacts, error) { + + // first get the list + servicesFilesArtifactsBytes := bucket.Get(servicesFilesArtifactsSliceKey) + // for empty list case + if servicesFilesArtifactsBytes == nil { + servicesFilesArtifactsBytes = consts.EmptyValueForJsonList + } + servicesFilesArtifacts := []*servicesFilesArtifacts{} + servicesFilesArtifactsPtr := &servicesFilesArtifacts + + if err := json.Unmarshal(servicesFilesArtifactsBytes, servicesFilesArtifactsPtr); err != nil { + return nil, stacktrace.Propagate(err, "An error occurred unmarshalling service identifiers") + } + + return servicesFilesArtifacts, nil +} diff --git a/core/server/api_container/server/service_network/services_files_artifacts/repository_test.go b/core/server/api_container/server/service_network/services_files_artifacts/repository_test.go new file mode 100644 index 0000000000..38343554e1 --- /dev/null +++ b/core/server/api_container/server/service_network/services_files_artifacts/repository_test.go @@ -0,0 +1 @@ +package services_files_artifacts diff --git a/core/server/api_container/server/service_network/services_files_artifacts/services_files_artifacts.go b/core/server/api_container/server/service_network/services_files_artifacts/services_files_artifacts.go new file mode 100644 index 0000000000..085170bb48 --- /dev/null +++ b/core/server/api_container/server/service_network/services_files_artifacts/services_files_artifacts.go @@ -0,0 +1,48 @@ +package services_files_artifacts + +import ( + "encoding/json" + "github.com/kurtosis-tech/kurtosis/container-engine-lib/lib/backend_interface/objects/service" + "github.com/kurtosis-tech/stacktrace" +) + +const ( + uuidKey = "uuid" + serviceDirPathsToFilesArtifactsIdentifiersKey = "services-to-files-artifacts" +) + +type servicesFilesArtifacts struct { + uuid service.ServiceUUID + + serviceDirPathsToFilesArtifactIdentifiers map[string]string +} + +func NewServicesFilesArtifactsObj(uuid service.ServiceUUID, serviceDirPathsToFilesArtifactsIdentifiers map[string]string) *servicesFilesArtifacts { + return &servicesFilesArtifacts{uuid: uuid, serviceDirPathsToFilesArtifactIdentifiers: serviceDirPathsToFilesArtifactsIdentifiers} +} + +func (servicesFilesArtifacts *servicesFilesArtifacts) GetUuid() service.ServiceUUID { + return servicesFilesArtifacts.uuid +} + +func (servicesFilesArtifacts *servicesFilesArtifacts) GetServiceDirPathsToFilesArtifactsIdentifiers() map[string]string { + return servicesFilesArtifacts.serviceDirPathsToFilesArtifactIdentifiers +} + +func (servicesFilesArtifacts *servicesFilesArtifacts) MarshalJSON() ([]byte, error) { + + data := map[string]string{} + + return json.Marshal(data) +} + +func (servicesFilesArtifacts *servicesFilesArtifacts) UnmarshalJSON(data []byte) error { + + unmarshalledMapPtr := &map[string]string{} + + if err := json.Unmarshal(data, unmarshalledMapPtr); err != nil { + return stacktrace.Propagate(err, "An error occurred unmarshalling map") + } + + return nil +} diff --git a/core/server/api_container/server/service_network/services_files_artifacts/services_files_artifacts_test.go b/core/server/api_container/server/service_network/services_files_artifacts/services_files_artifacts_test.go new file mode 100644 index 0000000000..38343554e1 --- /dev/null +++ b/core/server/api_container/server/service_network/services_files_artifacts/services_files_artifacts_test.go @@ -0,0 +1 @@ +package services_files_artifacts From c135adc39835326c0974773b1caed0b95fe46246 Mon Sep 17 00:00:00 2001 From: Tedi Mitiku Date: Tue, 25 Mar 2025 21:17:25 -0400 Subject: [PATCH 05/48] get files artifacts --- .../api_container_service.pb.go | 2107 +++++++++-------- .../binding_constructors.go | 11 +- api/protobuf/core/api_container_service.proto | 6 +- api/rust/src/api_container_api.rs | 12 +- .../api_container_service_pb.d.ts | 24 +- .../api_container_service_pb.js | 192 +- .../connect/api_container_service_pb.d.ts | 28 +- .../connect/api_container_service_pb.js | 12 +- cli/cli/commands/service/inspect/inspect.go | 8 +- cli/cli/commands/service/update/update.go | 8 +- core/server/api_container/main.go | 5 +- .../server/api_container_service.go | 17 +- 12 files changed, 1381 insertions(+), 1049 deletions(-) diff --git a/api/golang/core/kurtosis_core_rpc_api_bindings/api_container_service.pb.go b/api/golang/core/kurtosis_core_rpc_api_bindings/api_container_service.pb.go index 122193a8df..adf2c390bc 100644 --- a/api/golang/core/kurtosis_core_rpc_api_bindings/api_container_service.pb.go +++ b/api/golang/core/kurtosis_core_rpc_api_bindings/api_container_service.pb.go @@ -527,6 +527,53 @@ func (x *Container) GetEnvVars() map[string]string { return nil } +type FilesArtifactsList struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + FilesArtifactsIdentifiers []string `protobuf:"bytes,1,rep,name=files_artifacts_identifiers,json=filesArtifactsIdentifiers,proto3" json:"files_artifacts_identifiers,omitempty"` +} + +func (x *FilesArtifactsList) Reset() { + *x = FilesArtifactsList{} + if protoimpl.UnsafeEnabled { + mi := &file_api_container_service_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *FilesArtifactsList) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*FilesArtifactsList) ProtoMessage() {} + +func (x *FilesArtifactsList) ProtoReflect() protoreflect.Message { + mi := &file_api_container_service_proto_msgTypes[2] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use FilesArtifactsList.ProtoReflect.Descriptor instead. +func (*FilesArtifactsList) Descriptor() ([]byte, []int) { + return file_api_container_service_proto_rawDescGZIP(), []int{2} +} + +func (x *FilesArtifactsList) GetFilesArtifactsIdentifiers() []string { + if x != nil { + return x.FilesArtifactsIdentifiers + } + return nil +} + type ServiceInfo struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -557,17 +604,17 @@ type ServiceInfo struct { // Docker container or Kubernetes pod container Container *Container `protobuf:"bytes,9,opt,name=container,proto3" json:"container,omitempty"` // Mapping of directory paths on service to names of files artifacts that are mounted to that directory - ServiceDirPathsToFilesArtifactsIdentifiers map[string]string `protobuf:"bytes,10,rep,name=service_dir_paths_to_files_artifacts_identifiers,json=serviceDirPathsToFilesArtifactsIdentifiers,proto3" json:"service_dir_paths_to_files_artifacts_identifiers,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` - MaxMillicpus uint32 `protobuf:"varint,11,opt,name=max_millicpus,json=maxMillicpus,proto3" json:"max_millicpus,omitempty"` - MinMillicpus uint32 `protobuf:"varint,12,opt,name=min_millicpus,json=minMillicpus,proto3" json:"min_millicpus,omitempty"` - MaxMemoryMegabytes uint32 `protobuf:"varint,13,opt,name=max_memory_megabytes,json=maxMemoryMegabytes,proto3" json:"max_memory_megabytes,omitempty"` - MinMemoryMegabytes uint32 `protobuf:"varint,14,opt,name=min_memory_megabytes,json=minMemoryMegabytes,proto3" json:"min_memory_megabytes,omitempty"` + ServiceDirPathsToFilesArtifactsIdentifiers map[string]*FilesArtifactsList `protobuf:"bytes,10,rep,name=service_dir_paths_to_files_artifacts_identifiers,json=serviceDirPathsToFilesArtifactsIdentifiers,proto3" json:"service_dir_paths_to_files_artifacts_identifiers,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + MaxMillicpus uint32 `protobuf:"varint,11,opt,name=max_millicpus,json=maxMillicpus,proto3" json:"max_millicpus,omitempty"` + MinMillicpus uint32 `protobuf:"varint,12,opt,name=min_millicpus,json=minMillicpus,proto3" json:"min_millicpus,omitempty"` + MaxMemoryMegabytes uint32 `protobuf:"varint,13,opt,name=max_memory_megabytes,json=maxMemoryMegabytes,proto3" json:"max_memory_megabytes,omitempty"` + MinMemoryMegabytes uint32 `protobuf:"varint,14,opt,name=min_memory_megabytes,json=minMemoryMegabytes,proto3" json:"min_memory_megabytes,omitempty"` } func (x *ServiceInfo) Reset() { *x = ServiceInfo{} if protoimpl.UnsafeEnabled { - mi := &file_api_container_service_proto_msgTypes[2] + mi := &file_api_container_service_proto_msgTypes[3] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -580,7 +627,7 @@ func (x *ServiceInfo) String() string { func (*ServiceInfo) ProtoMessage() {} func (x *ServiceInfo) ProtoReflect() protoreflect.Message { - mi := &file_api_container_service_proto_msgTypes[2] + mi := &file_api_container_service_proto_msgTypes[3] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -593,7 +640,7 @@ func (x *ServiceInfo) ProtoReflect() protoreflect.Message { // Deprecated: Use ServiceInfo.ProtoReflect.Descriptor instead. func (*ServiceInfo) Descriptor() ([]byte, []int) { - return file_api_container_service_proto_rawDescGZIP(), []int{2} + return file_api_container_service_proto_rawDescGZIP(), []int{3} } func (x *ServiceInfo) GetServiceUuid() string { @@ -659,7 +706,7 @@ func (x *ServiceInfo) GetContainer() *Container { return nil } -func (x *ServiceInfo) GetServiceDirPathsToFilesArtifactsIdentifiers() map[string]string { +func (x *ServiceInfo) GetServiceDirPathsToFilesArtifactsIdentifiers() map[string]*FilesArtifactsList { if x != nil { return x.ServiceDirPathsToFilesArtifactsIdentifiers } @@ -721,7 +768,7 @@ type RunStarlarkScriptArgs struct { func (x *RunStarlarkScriptArgs) Reset() { *x = RunStarlarkScriptArgs{} if protoimpl.UnsafeEnabled { - mi := &file_api_container_service_proto_msgTypes[3] + mi := &file_api_container_service_proto_msgTypes[4] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -734,7 +781,7 @@ func (x *RunStarlarkScriptArgs) String() string { func (*RunStarlarkScriptArgs) ProtoMessage() {} func (x *RunStarlarkScriptArgs) ProtoReflect() protoreflect.Message { - mi := &file_api_container_service_proto_msgTypes[3] + mi := &file_api_container_service_proto_msgTypes[4] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -747,7 +794,7 @@ func (x *RunStarlarkScriptArgs) ProtoReflect() protoreflect.Message { // Deprecated: Use RunStarlarkScriptArgs.ProtoReflect.Descriptor instead. func (*RunStarlarkScriptArgs) Descriptor() ([]byte, []int) { - return file_api_container_service_proto_rawDescGZIP(), []int{3} + return file_api_container_service_proto_rawDescGZIP(), []int{4} } func (x *RunStarlarkScriptArgs) GetSerializedScript() string { @@ -869,7 +916,7 @@ type RunStarlarkPackageArgs struct { func (x *RunStarlarkPackageArgs) Reset() { *x = RunStarlarkPackageArgs{} if protoimpl.UnsafeEnabled { - mi := &file_api_container_service_proto_msgTypes[4] + mi := &file_api_container_service_proto_msgTypes[5] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -882,7 +929,7 @@ func (x *RunStarlarkPackageArgs) String() string { func (*RunStarlarkPackageArgs) ProtoMessage() {} func (x *RunStarlarkPackageArgs) ProtoReflect() protoreflect.Message { - mi := &file_api_container_service_proto_msgTypes[4] + mi := &file_api_container_service_proto_msgTypes[5] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -895,7 +942,7 @@ func (x *RunStarlarkPackageArgs) ProtoReflect() protoreflect.Message { // Deprecated: Use RunStarlarkPackageArgs.ProtoReflect.Descriptor instead. func (*RunStarlarkPackageArgs) Descriptor() ([]byte, []int) { - return file_api_container_service_proto_rawDescGZIP(), []int{4} + return file_api_container_service_proto_rawDescGZIP(), []int{5} } func (x *RunStarlarkPackageArgs) GetPackageId() string { @@ -1051,7 +1098,7 @@ type StarlarkRunResponseLine struct { func (x *StarlarkRunResponseLine) Reset() { *x = StarlarkRunResponseLine{} if protoimpl.UnsafeEnabled { - mi := &file_api_container_service_proto_msgTypes[5] + mi := &file_api_container_service_proto_msgTypes[6] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1064,7 +1111,7 @@ func (x *StarlarkRunResponseLine) String() string { func (*StarlarkRunResponseLine) ProtoMessage() {} func (x *StarlarkRunResponseLine) ProtoReflect() protoreflect.Message { - mi := &file_api_container_service_proto_msgTypes[5] + mi := &file_api_container_service_proto_msgTypes[6] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1077,7 +1124,7 @@ func (x *StarlarkRunResponseLine) ProtoReflect() protoreflect.Message { // Deprecated: Use StarlarkRunResponseLine.ProtoReflect.Descriptor instead. func (*StarlarkRunResponseLine) Descriptor() ([]byte, []int) { - return file_api_container_service_proto_rawDescGZIP(), []int{5} + return file_api_container_service_proto_rawDescGZIP(), []int{6} } func (m *StarlarkRunResponseLine) GetRunResponseLine() isStarlarkRunResponseLine_RunResponseLine { @@ -1193,7 +1240,7 @@ type StarlarkInfo struct { func (x *StarlarkInfo) Reset() { *x = StarlarkInfo{} if protoimpl.UnsafeEnabled { - mi := &file_api_container_service_proto_msgTypes[6] + mi := &file_api_container_service_proto_msgTypes[7] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1206,7 +1253,7 @@ func (x *StarlarkInfo) String() string { func (*StarlarkInfo) ProtoMessage() {} func (x *StarlarkInfo) ProtoReflect() protoreflect.Message { - mi := &file_api_container_service_proto_msgTypes[6] + mi := &file_api_container_service_proto_msgTypes[7] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1219,7 +1266,7 @@ func (x *StarlarkInfo) ProtoReflect() protoreflect.Message { // Deprecated: Use StarlarkInfo.ProtoReflect.Descriptor instead. func (*StarlarkInfo) Descriptor() ([]byte, []int) { - return file_api_container_service_proto_rawDescGZIP(), []int{6} + return file_api_container_service_proto_rawDescGZIP(), []int{7} } func (x *StarlarkInfo) GetInfoMessage() string { @@ -1240,7 +1287,7 @@ type StarlarkWarning struct { func (x *StarlarkWarning) Reset() { *x = StarlarkWarning{} if protoimpl.UnsafeEnabled { - mi := &file_api_container_service_proto_msgTypes[7] + mi := &file_api_container_service_proto_msgTypes[8] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1253,7 +1300,7 @@ func (x *StarlarkWarning) String() string { func (*StarlarkWarning) ProtoMessage() {} func (x *StarlarkWarning) ProtoReflect() protoreflect.Message { - mi := &file_api_container_service_proto_msgTypes[7] + mi := &file_api_container_service_proto_msgTypes[8] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1266,7 +1313,7 @@ func (x *StarlarkWarning) ProtoReflect() protoreflect.Message { // Deprecated: Use StarlarkWarning.ProtoReflect.Descriptor instead. func (*StarlarkWarning) Descriptor() ([]byte, []int) { - return file_api_container_service_proto_rawDescGZIP(), []int{7} + return file_api_container_service_proto_rawDescGZIP(), []int{8} } func (x *StarlarkWarning) GetWarningMessage() string { @@ -1292,7 +1339,7 @@ type StarlarkInstruction struct { func (x *StarlarkInstruction) Reset() { *x = StarlarkInstruction{} if protoimpl.UnsafeEnabled { - mi := &file_api_container_service_proto_msgTypes[8] + mi := &file_api_container_service_proto_msgTypes[9] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1305,7 +1352,7 @@ func (x *StarlarkInstruction) String() string { func (*StarlarkInstruction) ProtoMessage() {} func (x *StarlarkInstruction) ProtoReflect() protoreflect.Message { - mi := &file_api_container_service_proto_msgTypes[8] + mi := &file_api_container_service_proto_msgTypes[9] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1318,7 +1365,7 @@ func (x *StarlarkInstruction) ProtoReflect() protoreflect.Message { // Deprecated: Use StarlarkInstruction.ProtoReflect.Descriptor instead. func (*StarlarkInstruction) Descriptor() ([]byte, []int) { - return file_api_container_service_proto_rawDescGZIP(), []int{8} + return file_api_container_service_proto_rawDescGZIP(), []int{9} } func (x *StarlarkInstruction) GetPosition() *StarlarkInstructionPosition { @@ -1374,7 +1421,7 @@ type StarlarkInstructionResult struct { func (x *StarlarkInstructionResult) Reset() { *x = StarlarkInstructionResult{} if protoimpl.UnsafeEnabled { - mi := &file_api_container_service_proto_msgTypes[9] + mi := &file_api_container_service_proto_msgTypes[10] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1387,7 +1434,7 @@ func (x *StarlarkInstructionResult) String() string { func (*StarlarkInstructionResult) ProtoMessage() {} func (x *StarlarkInstructionResult) ProtoReflect() protoreflect.Message { - mi := &file_api_container_service_proto_msgTypes[9] + mi := &file_api_container_service_proto_msgTypes[10] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1400,7 +1447,7 @@ func (x *StarlarkInstructionResult) ProtoReflect() protoreflect.Message { // Deprecated: Use StarlarkInstructionResult.ProtoReflect.Descriptor instead. func (*StarlarkInstructionResult) Descriptor() ([]byte, []int) { - return file_api_container_service_proto_rawDescGZIP(), []int{9} + return file_api_container_service_proto_rawDescGZIP(), []int{10} } func (x *StarlarkInstructionResult) GetSerializedInstructionResult() string { @@ -1423,7 +1470,7 @@ type StarlarkInstructionArg struct { func (x *StarlarkInstructionArg) Reset() { *x = StarlarkInstructionArg{} if protoimpl.UnsafeEnabled { - mi := &file_api_container_service_proto_msgTypes[10] + mi := &file_api_container_service_proto_msgTypes[11] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1436,7 +1483,7 @@ func (x *StarlarkInstructionArg) String() string { func (*StarlarkInstructionArg) ProtoMessage() {} func (x *StarlarkInstructionArg) ProtoReflect() protoreflect.Message { - mi := &file_api_container_service_proto_msgTypes[10] + mi := &file_api_container_service_proto_msgTypes[11] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1449,7 +1496,7 @@ func (x *StarlarkInstructionArg) ProtoReflect() protoreflect.Message { // Deprecated: Use StarlarkInstructionArg.ProtoReflect.Descriptor instead. func (*StarlarkInstructionArg) Descriptor() ([]byte, []int) { - return file_api_container_service_proto_rawDescGZIP(), []int{10} + return file_api_container_service_proto_rawDescGZIP(), []int{11} } func (x *StarlarkInstructionArg) GetSerializedArgValue() string { @@ -1486,7 +1533,7 @@ type StarlarkInstructionPosition struct { func (x *StarlarkInstructionPosition) Reset() { *x = StarlarkInstructionPosition{} if protoimpl.UnsafeEnabled { - mi := &file_api_container_service_proto_msgTypes[11] + mi := &file_api_container_service_proto_msgTypes[12] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1499,7 +1546,7 @@ func (x *StarlarkInstructionPosition) String() string { func (*StarlarkInstructionPosition) ProtoMessage() {} func (x *StarlarkInstructionPosition) ProtoReflect() protoreflect.Message { - mi := &file_api_container_service_proto_msgTypes[11] + mi := &file_api_container_service_proto_msgTypes[12] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1512,7 +1559,7 @@ func (x *StarlarkInstructionPosition) ProtoReflect() protoreflect.Message { // Deprecated: Use StarlarkInstructionPosition.ProtoReflect.Descriptor instead. func (*StarlarkInstructionPosition) Descriptor() ([]byte, []int) { - return file_api_container_service_proto_rawDescGZIP(), []int{11} + return file_api_container_service_proto_rawDescGZIP(), []int{12} } func (x *StarlarkInstructionPosition) GetFilename() string { @@ -1552,7 +1599,7 @@ type StarlarkError struct { func (x *StarlarkError) Reset() { *x = StarlarkError{} if protoimpl.UnsafeEnabled { - mi := &file_api_container_service_proto_msgTypes[12] + mi := &file_api_container_service_proto_msgTypes[13] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1565,7 +1612,7 @@ func (x *StarlarkError) String() string { func (*StarlarkError) ProtoMessage() {} func (x *StarlarkError) ProtoReflect() protoreflect.Message { - mi := &file_api_container_service_proto_msgTypes[12] + mi := &file_api_container_service_proto_msgTypes[13] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1578,7 +1625,7 @@ func (x *StarlarkError) ProtoReflect() protoreflect.Message { // Deprecated: Use StarlarkError.ProtoReflect.Descriptor instead. func (*StarlarkError) Descriptor() ([]byte, []int) { - return file_api_container_service_proto_rawDescGZIP(), []int{12} + return file_api_container_service_proto_rawDescGZIP(), []int{13} } func (m *StarlarkError) GetError() isStarlarkError_Error { @@ -1642,7 +1689,7 @@ type StarlarkInterpretationError struct { func (x *StarlarkInterpretationError) Reset() { *x = StarlarkInterpretationError{} if protoimpl.UnsafeEnabled { - mi := &file_api_container_service_proto_msgTypes[13] + mi := &file_api_container_service_proto_msgTypes[14] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1655,7 +1702,7 @@ func (x *StarlarkInterpretationError) String() string { func (*StarlarkInterpretationError) ProtoMessage() {} func (x *StarlarkInterpretationError) ProtoReflect() protoreflect.Message { - mi := &file_api_container_service_proto_msgTypes[13] + mi := &file_api_container_service_proto_msgTypes[14] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1668,7 +1715,7 @@ func (x *StarlarkInterpretationError) ProtoReflect() protoreflect.Message { // Deprecated: Use StarlarkInterpretationError.ProtoReflect.Descriptor instead. func (*StarlarkInterpretationError) Descriptor() ([]byte, []int) { - return file_api_container_service_proto_rawDescGZIP(), []int{13} + return file_api_container_service_proto_rawDescGZIP(), []int{14} } func (x *StarlarkInterpretationError) GetErrorMessage() string { @@ -1689,7 +1736,7 @@ type StarlarkValidationError struct { func (x *StarlarkValidationError) Reset() { *x = StarlarkValidationError{} if protoimpl.UnsafeEnabled { - mi := &file_api_container_service_proto_msgTypes[14] + mi := &file_api_container_service_proto_msgTypes[15] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1702,7 +1749,7 @@ func (x *StarlarkValidationError) String() string { func (*StarlarkValidationError) ProtoMessage() {} func (x *StarlarkValidationError) ProtoReflect() protoreflect.Message { - mi := &file_api_container_service_proto_msgTypes[14] + mi := &file_api_container_service_proto_msgTypes[15] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1715,7 +1762,7 @@ func (x *StarlarkValidationError) ProtoReflect() protoreflect.Message { // Deprecated: Use StarlarkValidationError.ProtoReflect.Descriptor instead. func (*StarlarkValidationError) Descriptor() ([]byte, []int) { - return file_api_container_service_proto_rawDescGZIP(), []int{14} + return file_api_container_service_proto_rawDescGZIP(), []int{15} } func (x *StarlarkValidationError) GetErrorMessage() string { @@ -1736,7 +1783,7 @@ type StarlarkExecutionError struct { func (x *StarlarkExecutionError) Reset() { *x = StarlarkExecutionError{} if protoimpl.UnsafeEnabled { - mi := &file_api_container_service_proto_msgTypes[15] + mi := &file_api_container_service_proto_msgTypes[16] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1749,7 +1796,7 @@ func (x *StarlarkExecutionError) String() string { func (*StarlarkExecutionError) ProtoMessage() {} func (x *StarlarkExecutionError) ProtoReflect() protoreflect.Message { - mi := &file_api_container_service_proto_msgTypes[15] + mi := &file_api_container_service_proto_msgTypes[16] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1762,7 +1809,7 @@ func (x *StarlarkExecutionError) ProtoReflect() protoreflect.Message { // Deprecated: Use StarlarkExecutionError.ProtoReflect.Descriptor instead. func (*StarlarkExecutionError) Descriptor() ([]byte, []int) { - return file_api_container_service_proto_rawDescGZIP(), []int{15} + return file_api_container_service_proto_rawDescGZIP(), []int{16} } func (x *StarlarkExecutionError) GetErrorMessage() string { @@ -1785,7 +1832,7 @@ type StarlarkRunProgress struct { func (x *StarlarkRunProgress) Reset() { *x = StarlarkRunProgress{} if protoimpl.UnsafeEnabled { - mi := &file_api_container_service_proto_msgTypes[16] + mi := &file_api_container_service_proto_msgTypes[17] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1798,7 +1845,7 @@ func (x *StarlarkRunProgress) String() string { func (*StarlarkRunProgress) ProtoMessage() {} func (x *StarlarkRunProgress) ProtoReflect() protoreflect.Message { - mi := &file_api_container_service_proto_msgTypes[16] + mi := &file_api_container_service_proto_msgTypes[17] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1811,7 +1858,7 @@ func (x *StarlarkRunProgress) ProtoReflect() protoreflect.Message { // Deprecated: Use StarlarkRunProgress.ProtoReflect.Descriptor instead. func (*StarlarkRunProgress) Descriptor() ([]byte, []int) { - return file_api_container_service_proto_rawDescGZIP(), []int{16} + return file_api_container_service_proto_rawDescGZIP(), []int{17} } func (x *StarlarkRunProgress) GetCurrentStepInfo() []string { @@ -1847,7 +1894,7 @@ type StarlarkRunFinishedEvent struct { func (x *StarlarkRunFinishedEvent) Reset() { *x = StarlarkRunFinishedEvent{} if protoimpl.UnsafeEnabled { - mi := &file_api_container_service_proto_msgTypes[17] + mi := &file_api_container_service_proto_msgTypes[18] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1860,7 +1907,7 @@ func (x *StarlarkRunFinishedEvent) String() string { func (*StarlarkRunFinishedEvent) ProtoMessage() {} func (x *StarlarkRunFinishedEvent) ProtoReflect() protoreflect.Message { - mi := &file_api_container_service_proto_msgTypes[17] + mi := &file_api_container_service_proto_msgTypes[18] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1873,7 +1920,7 @@ func (x *StarlarkRunFinishedEvent) ProtoReflect() protoreflect.Message { // Deprecated: Use StarlarkRunFinishedEvent.ProtoReflect.Descriptor instead. func (*StarlarkRunFinishedEvent) Descriptor() ([]byte, []int) { - return file_api_container_service_proto_rawDescGZIP(), []int{17} + return file_api_container_service_proto_rawDescGZIP(), []int{18} } func (x *StarlarkRunFinishedEvent) GetIsRunSuccessful() bool { @@ -1908,7 +1955,7 @@ type GetServicesArgs struct { func (x *GetServicesArgs) Reset() { *x = GetServicesArgs{} if protoimpl.UnsafeEnabled { - mi := &file_api_container_service_proto_msgTypes[18] + mi := &file_api_container_service_proto_msgTypes[19] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1921,7 +1968,7 @@ func (x *GetServicesArgs) String() string { func (*GetServicesArgs) ProtoMessage() {} func (x *GetServicesArgs) ProtoReflect() protoreflect.Message { - mi := &file_api_container_service_proto_msgTypes[18] + mi := &file_api_container_service_proto_msgTypes[19] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1934,7 +1981,7 @@ func (x *GetServicesArgs) ProtoReflect() protoreflect.Message { // Deprecated: Use GetServicesArgs.ProtoReflect.Descriptor instead. func (*GetServicesArgs) Descriptor() ([]byte, []int) { - return file_api_container_service_proto_rawDescGZIP(), []int{18} + return file_api_container_service_proto_rawDescGZIP(), []int{19} } func (x *GetServicesArgs) GetServiceIdentifiers() map[string]bool { @@ -1956,7 +2003,7 @@ type GetServicesResponse struct { func (x *GetServicesResponse) Reset() { *x = GetServicesResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_container_service_proto_msgTypes[19] + mi := &file_api_container_service_proto_msgTypes[20] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1969,7 +2016,7 @@ func (x *GetServicesResponse) String() string { func (*GetServicesResponse) ProtoMessage() {} func (x *GetServicesResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_container_service_proto_msgTypes[19] + mi := &file_api_container_service_proto_msgTypes[20] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1982,7 +2029,7 @@ func (x *GetServicesResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetServicesResponse.ProtoReflect.Descriptor instead. func (*GetServicesResponse) Descriptor() ([]byte, []int) { - return file_api_container_service_proto_rawDescGZIP(), []int{19} + return file_api_container_service_proto_rawDescGZIP(), []int{20} } func (x *GetServicesResponse) GetServiceInfo() map[string]*ServiceInfo { @@ -2009,7 +2056,7 @@ type ServiceIdentifiers struct { func (x *ServiceIdentifiers) Reset() { *x = ServiceIdentifiers{} if protoimpl.UnsafeEnabled { - mi := &file_api_container_service_proto_msgTypes[20] + mi := &file_api_container_service_proto_msgTypes[21] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2022,7 +2069,7 @@ func (x *ServiceIdentifiers) String() string { func (*ServiceIdentifiers) ProtoMessage() {} func (x *ServiceIdentifiers) ProtoReflect() protoreflect.Message { - mi := &file_api_container_service_proto_msgTypes[20] + mi := &file_api_container_service_proto_msgTypes[21] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2035,7 +2082,7 @@ func (x *ServiceIdentifiers) ProtoReflect() protoreflect.Message { // Deprecated: Use ServiceIdentifiers.ProtoReflect.Descriptor instead. func (*ServiceIdentifiers) Descriptor() ([]byte, []int) { - return file_api_container_service_proto_rawDescGZIP(), []int{20} + return file_api_container_service_proto_rawDescGZIP(), []int{21} } func (x *ServiceIdentifiers) GetServiceUuid() string { @@ -2070,7 +2117,7 @@ type GetExistingAndHistoricalServiceIdentifiersResponse struct { func (x *GetExistingAndHistoricalServiceIdentifiersResponse) Reset() { *x = GetExistingAndHistoricalServiceIdentifiersResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_container_service_proto_msgTypes[21] + mi := &file_api_container_service_proto_msgTypes[22] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2083,7 +2130,7 @@ func (x *GetExistingAndHistoricalServiceIdentifiersResponse) String() string { func (*GetExistingAndHistoricalServiceIdentifiersResponse) ProtoMessage() {} func (x *GetExistingAndHistoricalServiceIdentifiersResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_container_service_proto_msgTypes[21] + mi := &file_api_container_service_proto_msgTypes[22] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2096,7 +2143,7 @@ func (x *GetExistingAndHistoricalServiceIdentifiersResponse) ProtoReflect() prot // Deprecated: Use GetExistingAndHistoricalServiceIdentifiersResponse.ProtoReflect.Descriptor instead. func (*GetExistingAndHistoricalServiceIdentifiersResponse) Descriptor() ([]byte, []int) { - return file_api_container_service_proto_rawDescGZIP(), []int{21} + return file_api_container_service_proto_rawDescGZIP(), []int{22} } func (x *GetExistingAndHistoricalServiceIdentifiersResponse) GetAllIdentifiers() []*ServiceIdentifiers { @@ -2124,7 +2171,7 @@ type ExecCommandArgs struct { func (x *ExecCommandArgs) Reset() { *x = ExecCommandArgs{} if protoimpl.UnsafeEnabled { - mi := &file_api_container_service_proto_msgTypes[22] + mi := &file_api_container_service_proto_msgTypes[23] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2137,7 +2184,7 @@ func (x *ExecCommandArgs) String() string { func (*ExecCommandArgs) ProtoMessage() {} func (x *ExecCommandArgs) ProtoReflect() protoreflect.Message { - mi := &file_api_container_service_proto_msgTypes[22] + mi := &file_api_container_service_proto_msgTypes[23] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2150,7 +2197,7 @@ func (x *ExecCommandArgs) ProtoReflect() protoreflect.Message { // Deprecated: Use ExecCommandArgs.ProtoReflect.Descriptor instead. func (*ExecCommandArgs) Descriptor() ([]byte, []int) { - return file_api_container_service_proto_rawDescGZIP(), []int{22} + return file_api_container_service_proto_rawDescGZIP(), []int{23} } func (x *ExecCommandArgs) GetServiceIdentifier() string { @@ -2180,7 +2227,7 @@ type ExecCommandResponse struct { func (x *ExecCommandResponse) Reset() { *x = ExecCommandResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_container_service_proto_msgTypes[23] + mi := &file_api_container_service_proto_msgTypes[24] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2193,7 +2240,7 @@ func (x *ExecCommandResponse) String() string { func (*ExecCommandResponse) ProtoMessage() {} func (x *ExecCommandResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_container_service_proto_msgTypes[23] + mi := &file_api_container_service_proto_msgTypes[24] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2206,7 +2253,7 @@ func (x *ExecCommandResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ExecCommandResponse.ProtoReflect.Descriptor instead. func (*ExecCommandResponse) Descriptor() ([]byte, []int) { - return file_api_container_service_proto_rawDescGZIP(), []int{23} + return file_api_container_service_proto_rawDescGZIP(), []int{24} } func (x *ExecCommandResponse) GetExitCode() int32 { @@ -2252,7 +2299,7 @@ type WaitForHttpGetEndpointAvailabilityArgs struct { func (x *WaitForHttpGetEndpointAvailabilityArgs) Reset() { *x = WaitForHttpGetEndpointAvailabilityArgs{} if protoimpl.UnsafeEnabled { - mi := &file_api_container_service_proto_msgTypes[24] + mi := &file_api_container_service_proto_msgTypes[25] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2265,7 +2312,7 @@ func (x *WaitForHttpGetEndpointAvailabilityArgs) String() string { func (*WaitForHttpGetEndpointAvailabilityArgs) ProtoMessage() {} func (x *WaitForHttpGetEndpointAvailabilityArgs) ProtoReflect() protoreflect.Message { - mi := &file_api_container_service_proto_msgTypes[24] + mi := &file_api_container_service_proto_msgTypes[25] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2278,7 +2325,7 @@ func (x *WaitForHttpGetEndpointAvailabilityArgs) ProtoReflect() protoreflect.Mes // Deprecated: Use WaitForHttpGetEndpointAvailabilityArgs.ProtoReflect.Descriptor instead. func (*WaitForHttpGetEndpointAvailabilityArgs) Descriptor() ([]byte, []int) { - return file_api_container_service_proto_rawDescGZIP(), []int{24} + return file_api_container_service_proto_rawDescGZIP(), []int{25} } func (x *WaitForHttpGetEndpointAvailabilityArgs) GetServiceIdentifier() string { @@ -2361,7 +2408,7 @@ type WaitForHttpPostEndpointAvailabilityArgs struct { func (x *WaitForHttpPostEndpointAvailabilityArgs) Reset() { *x = WaitForHttpPostEndpointAvailabilityArgs{} if protoimpl.UnsafeEnabled { - mi := &file_api_container_service_proto_msgTypes[25] + mi := &file_api_container_service_proto_msgTypes[26] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2374,7 +2421,7 @@ func (x *WaitForHttpPostEndpointAvailabilityArgs) String() string { func (*WaitForHttpPostEndpointAvailabilityArgs) ProtoMessage() {} func (x *WaitForHttpPostEndpointAvailabilityArgs) ProtoReflect() protoreflect.Message { - mi := &file_api_container_service_proto_msgTypes[25] + mi := &file_api_container_service_proto_msgTypes[26] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2387,7 +2434,7 @@ func (x *WaitForHttpPostEndpointAvailabilityArgs) ProtoReflect() protoreflect.Me // Deprecated: Use WaitForHttpPostEndpointAvailabilityArgs.ProtoReflect.Descriptor instead. func (*WaitForHttpPostEndpointAvailabilityArgs) Descriptor() ([]byte, []int) { - return file_api_container_service_proto_rawDescGZIP(), []int{25} + return file_api_container_service_proto_rawDescGZIP(), []int{26} } func (x *WaitForHttpPostEndpointAvailabilityArgs) GetServiceIdentifier() string { @@ -2469,7 +2516,7 @@ type StreamedDataChunk struct { func (x *StreamedDataChunk) Reset() { *x = StreamedDataChunk{} if protoimpl.UnsafeEnabled { - mi := &file_api_container_service_proto_msgTypes[26] + mi := &file_api_container_service_proto_msgTypes[27] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2482,7 +2529,7 @@ func (x *StreamedDataChunk) String() string { func (*StreamedDataChunk) ProtoMessage() {} func (x *StreamedDataChunk) ProtoReflect() protoreflect.Message { - mi := &file_api_container_service_proto_msgTypes[26] + mi := &file_api_container_service_proto_msgTypes[27] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2495,7 +2542,7 @@ func (x *StreamedDataChunk) ProtoReflect() protoreflect.Message { // Deprecated: Use StreamedDataChunk.ProtoReflect.Descriptor instead. func (*StreamedDataChunk) Descriptor() ([]byte, []int) { - return file_api_container_service_proto_rawDescGZIP(), []int{26} + return file_api_container_service_proto_rawDescGZIP(), []int{27} } func (x *StreamedDataChunk) GetData() []byte { @@ -2530,7 +2577,7 @@ type DataChunkMetadata struct { func (x *DataChunkMetadata) Reset() { *x = DataChunkMetadata{} if protoimpl.UnsafeEnabled { - mi := &file_api_container_service_proto_msgTypes[27] + mi := &file_api_container_service_proto_msgTypes[28] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2543,7 +2590,7 @@ func (x *DataChunkMetadata) String() string { func (*DataChunkMetadata) ProtoMessage() {} func (x *DataChunkMetadata) ProtoReflect() protoreflect.Message { - mi := &file_api_container_service_proto_msgTypes[27] + mi := &file_api_container_service_proto_msgTypes[28] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2556,7 +2603,7 @@ func (x *DataChunkMetadata) ProtoReflect() protoreflect.Message { // Deprecated: Use DataChunkMetadata.ProtoReflect.Descriptor instead. func (*DataChunkMetadata) Descriptor() ([]byte, []int) { - return file_api_container_service_proto_rawDescGZIP(), []int{27} + return file_api_container_service_proto_rawDescGZIP(), []int{28} } func (x *DataChunkMetadata) GetName() string { @@ -2585,7 +2632,7 @@ type UploadFilesArtifactResponse struct { func (x *UploadFilesArtifactResponse) Reset() { *x = UploadFilesArtifactResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_container_service_proto_msgTypes[28] + mi := &file_api_container_service_proto_msgTypes[29] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2598,7 +2645,7 @@ func (x *UploadFilesArtifactResponse) String() string { func (*UploadFilesArtifactResponse) ProtoMessage() {} func (x *UploadFilesArtifactResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_container_service_proto_msgTypes[28] + mi := &file_api_container_service_proto_msgTypes[29] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2611,7 +2658,7 @@ func (x *UploadFilesArtifactResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use UploadFilesArtifactResponse.ProtoReflect.Descriptor instead. func (*UploadFilesArtifactResponse) Descriptor() ([]byte, []int) { - return file_api_container_service_proto_rawDescGZIP(), []int{28} + return file_api_container_service_proto_rawDescGZIP(), []int{29} } func (x *UploadFilesArtifactResponse) GetUuid() string { @@ -2645,7 +2692,7 @@ type DownloadFilesArtifactArgs struct { func (x *DownloadFilesArtifactArgs) Reset() { *x = DownloadFilesArtifactArgs{} if protoimpl.UnsafeEnabled { - mi := &file_api_container_service_proto_msgTypes[29] + mi := &file_api_container_service_proto_msgTypes[30] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2658,7 +2705,7 @@ func (x *DownloadFilesArtifactArgs) String() string { func (*DownloadFilesArtifactArgs) ProtoMessage() {} func (x *DownloadFilesArtifactArgs) ProtoReflect() protoreflect.Message { - mi := &file_api_container_service_proto_msgTypes[29] + mi := &file_api_container_service_proto_msgTypes[30] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2671,7 +2718,7 @@ func (x *DownloadFilesArtifactArgs) ProtoReflect() protoreflect.Message { // Deprecated: Use DownloadFilesArtifactArgs.ProtoReflect.Descriptor instead. func (*DownloadFilesArtifactArgs) Descriptor() ([]byte, []int) { - return file_api_container_service_proto_rawDescGZIP(), []int{29} + return file_api_container_service_proto_rawDescGZIP(), []int{30} } func (x *DownloadFilesArtifactArgs) GetIdentifier() string { @@ -2700,7 +2747,7 @@ type StoreWebFilesArtifactArgs struct { func (x *StoreWebFilesArtifactArgs) Reset() { *x = StoreWebFilesArtifactArgs{} if protoimpl.UnsafeEnabled { - mi := &file_api_container_service_proto_msgTypes[30] + mi := &file_api_container_service_proto_msgTypes[31] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2713,7 +2760,7 @@ func (x *StoreWebFilesArtifactArgs) String() string { func (*StoreWebFilesArtifactArgs) ProtoMessage() {} func (x *StoreWebFilesArtifactArgs) ProtoReflect() protoreflect.Message { - mi := &file_api_container_service_proto_msgTypes[30] + mi := &file_api_container_service_proto_msgTypes[31] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2726,7 +2773,7 @@ func (x *StoreWebFilesArtifactArgs) ProtoReflect() protoreflect.Message { // Deprecated: Use StoreWebFilesArtifactArgs.ProtoReflect.Descriptor instead. func (*StoreWebFilesArtifactArgs) Descriptor() ([]byte, []int) { - return file_api_container_service_proto_rawDescGZIP(), []int{30} + return file_api_container_service_proto_rawDescGZIP(), []int{31} } func (x *StoreWebFilesArtifactArgs) GetUrl() string { @@ -2755,7 +2802,7 @@ type StoreWebFilesArtifactResponse struct { func (x *StoreWebFilesArtifactResponse) Reset() { *x = StoreWebFilesArtifactResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_container_service_proto_msgTypes[31] + mi := &file_api_container_service_proto_msgTypes[32] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2768,7 +2815,7 @@ func (x *StoreWebFilesArtifactResponse) String() string { func (*StoreWebFilesArtifactResponse) ProtoMessage() {} func (x *StoreWebFilesArtifactResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_container_service_proto_msgTypes[31] + mi := &file_api_container_service_proto_msgTypes[32] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2781,7 +2828,7 @@ func (x *StoreWebFilesArtifactResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use StoreWebFilesArtifactResponse.ProtoReflect.Descriptor instead. func (*StoreWebFilesArtifactResponse) Descriptor() ([]byte, []int) { - return file_api_container_service_proto_rawDescGZIP(), []int{31} + return file_api_container_service_proto_rawDescGZIP(), []int{32} } func (x *StoreWebFilesArtifactResponse) GetUuid() string { @@ -2807,7 +2854,7 @@ type StoreFilesArtifactFromServiceArgs struct { func (x *StoreFilesArtifactFromServiceArgs) Reset() { *x = StoreFilesArtifactFromServiceArgs{} if protoimpl.UnsafeEnabled { - mi := &file_api_container_service_proto_msgTypes[32] + mi := &file_api_container_service_proto_msgTypes[33] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2820,7 +2867,7 @@ func (x *StoreFilesArtifactFromServiceArgs) String() string { func (*StoreFilesArtifactFromServiceArgs) ProtoMessage() {} func (x *StoreFilesArtifactFromServiceArgs) ProtoReflect() protoreflect.Message { - mi := &file_api_container_service_proto_msgTypes[32] + mi := &file_api_container_service_proto_msgTypes[33] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2833,7 +2880,7 @@ func (x *StoreFilesArtifactFromServiceArgs) ProtoReflect() protoreflect.Message // Deprecated: Use StoreFilesArtifactFromServiceArgs.ProtoReflect.Descriptor instead. func (*StoreFilesArtifactFromServiceArgs) Descriptor() ([]byte, []int) { - return file_api_container_service_proto_rawDescGZIP(), []int{32} + return file_api_container_service_proto_rawDescGZIP(), []int{33} } func (x *StoreFilesArtifactFromServiceArgs) GetServiceIdentifier() string { @@ -2869,7 +2916,7 @@ type StoreFilesArtifactFromServiceResponse struct { func (x *StoreFilesArtifactFromServiceResponse) Reset() { *x = StoreFilesArtifactFromServiceResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_container_service_proto_msgTypes[33] + mi := &file_api_container_service_proto_msgTypes[34] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2882,7 +2929,7 @@ func (x *StoreFilesArtifactFromServiceResponse) String() string { func (*StoreFilesArtifactFromServiceResponse) ProtoMessage() {} func (x *StoreFilesArtifactFromServiceResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_container_service_proto_msgTypes[33] + mi := &file_api_container_service_proto_msgTypes[34] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2895,7 +2942,7 @@ func (x *StoreFilesArtifactFromServiceResponse) ProtoReflect() protoreflect.Mess // Deprecated: Use StoreFilesArtifactFromServiceResponse.ProtoReflect.Descriptor instead. func (*StoreFilesArtifactFromServiceResponse) Descriptor() ([]byte, []int) { - return file_api_container_service_proto_rawDescGZIP(), []int{33} + return file_api_container_service_proto_rawDescGZIP(), []int{34} } func (x *StoreFilesArtifactFromServiceResponse) GetUuid() string { @@ -2919,7 +2966,7 @@ type FilesArtifactNameAndUuid struct { func (x *FilesArtifactNameAndUuid) Reset() { *x = FilesArtifactNameAndUuid{} if protoimpl.UnsafeEnabled { - mi := &file_api_container_service_proto_msgTypes[34] + mi := &file_api_container_service_proto_msgTypes[35] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2932,7 +2979,7 @@ func (x *FilesArtifactNameAndUuid) String() string { func (*FilesArtifactNameAndUuid) ProtoMessage() {} func (x *FilesArtifactNameAndUuid) ProtoReflect() protoreflect.Message { - mi := &file_api_container_service_proto_msgTypes[34] + mi := &file_api_container_service_proto_msgTypes[35] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2945,7 +2992,7 @@ func (x *FilesArtifactNameAndUuid) ProtoReflect() protoreflect.Message { // Deprecated: Use FilesArtifactNameAndUuid.ProtoReflect.Descriptor instead. func (*FilesArtifactNameAndUuid) Descriptor() ([]byte, []int) { - return file_api_container_service_proto_rawDescGZIP(), []int{34} + return file_api_container_service_proto_rawDescGZIP(), []int{35} } func (x *FilesArtifactNameAndUuid) GetFileName() string { @@ -2973,7 +3020,7 @@ type ListFilesArtifactNamesAndUuidsResponse struct { func (x *ListFilesArtifactNamesAndUuidsResponse) Reset() { *x = ListFilesArtifactNamesAndUuidsResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_container_service_proto_msgTypes[35] + mi := &file_api_container_service_proto_msgTypes[36] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2986,7 +3033,7 @@ func (x *ListFilesArtifactNamesAndUuidsResponse) String() string { func (*ListFilesArtifactNamesAndUuidsResponse) ProtoMessage() {} func (x *ListFilesArtifactNamesAndUuidsResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_container_service_proto_msgTypes[35] + mi := &file_api_container_service_proto_msgTypes[36] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2999,7 +3046,7 @@ func (x *ListFilesArtifactNamesAndUuidsResponse) ProtoReflect() protoreflect.Mes // Deprecated: Use ListFilesArtifactNamesAndUuidsResponse.ProtoReflect.Descriptor instead. func (*ListFilesArtifactNamesAndUuidsResponse) Descriptor() ([]byte, []int) { - return file_api_container_service_proto_rawDescGZIP(), []int{35} + return file_api_container_service_proto_rawDescGZIP(), []int{36} } func (x *ListFilesArtifactNamesAndUuidsResponse) GetFileNamesAndUuids() []*FilesArtifactNameAndUuid { @@ -3020,7 +3067,7 @@ type InspectFilesArtifactContentsRequest struct { func (x *InspectFilesArtifactContentsRequest) Reset() { *x = InspectFilesArtifactContentsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_container_service_proto_msgTypes[36] + mi := &file_api_container_service_proto_msgTypes[37] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3033,7 +3080,7 @@ func (x *InspectFilesArtifactContentsRequest) String() string { func (*InspectFilesArtifactContentsRequest) ProtoMessage() {} func (x *InspectFilesArtifactContentsRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_container_service_proto_msgTypes[36] + mi := &file_api_container_service_proto_msgTypes[37] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3046,7 +3093,7 @@ func (x *InspectFilesArtifactContentsRequest) ProtoReflect() protoreflect.Messag // Deprecated: Use InspectFilesArtifactContentsRequest.ProtoReflect.Descriptor instead. func (*InspectFilesArtifactContentsRequest) Descriptor() ([]byte, []int) { - return file_api_container_service_proto_rawDescGZIP(), []int{36} + return file_api_container_service_proto_rawDescGZIP(), []int{37} } func (x *InspectFilesArtifactContentsRequest) GetFileNamesAndUuid() *FilesArtifactNameAndUuid { @@ -3067,7 +3114,7 @@ type InspectFilesArtifactContentsResponse struct { func (x *InspectFilesArtifactContentsResponse) Reset() { *x = InspectFilesArtifactContentsResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_container_service_proto_msgTypes[37] + mi := &file_api_container_service_proto_msgTypes[38] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3080,7 +3127,7 @@ func (x *InspectFilesArtifactContentsResponse) String() string { func (*InspectFilesArtifactContentsResponse) ProtoMessage() {} func (x *InspectFilesArtifactContentsResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_container_service_proto_msgTypes[37] + mi := &file_api_container_service_proto_msgTypes[38] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3093,7 +3140,7 @@ func (x *InspectFilesArtifactContentsResponse) ProtoReflect() protoreflect.Messa // Deprecated: Use InspectFilesArtifactContentsResponse.ProtoReflect.Descriptor instead. func (*InspectFilesArtifactContentsResponse) Descriptor() ([]byte, []int) { - return file_api_container_service_proto_rawDescGZIP(), []int{37} + return file_api_container_service_proto_rawDescGZIP(), []int{38} } func (x *InspectFilesArtifactContentsResponse) GetFileDescriptions() []*FileArtifactContentsFileDescription { @@ -3119,7 +3166,7 @@ type FileArtifactContentsFileDescription struct { func (x *FileArtifactContentsFileDescription) Reset() { *x = FileArtifactContentsFileDescription{} if protoimpl.UnsafeEnabled { - mi := &file_api_container_service_proto_msgTypes[38] + mi := &file_api_container_service_proto_msgTypes[39] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3132,7 +3179,7 @@ func (x *FileArtifactContentsFileDescription) String() string { func (*FileArtifactContentsFileDescription) ProtoMessage() {} func (x *FileArtifactContentsFileDescription) ProtoReflect() protoreflect.Message { - mi := &file_api_container_service_proto_msgTypes[38] + mi := &file_api_container_service_proto_msgTypes[39] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3145,7 +3192,7 @@ func (x *FileArtifactContentsFileDescription) ProtoReflect() protoreflect.Messag // Deprecated: Use FileArtifactContentsFileDescription.ProtoReflect.Descriptor instead. func (*FileArtifactContentsFileDescription) Descriptor() ([]byte, []int) { - return file_api_container_service_proto_rawDescGZIP(), []int{38} + return file_api_container_service_proto_rawDescGZIP(), []int{39} } func (x *FileArtifactContentsFileDescription) GetPath() string { @@ -3180,7 +3227,7 @@ type ConnectServicesArgs struct { func (x *ConnectServicesArgs) Reset() { *x = ConnectServicesArgs{} if protoimpl.UnsafeEnabled { - mi := &file_api_container_service_proto_msgTypes[39] + mi := &file_api_container_service_proto_msgTypes[40] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3193,7 +3240,7 @@ func (x *ConnectServicesArgs) String() string { func (*ConnectServicesArgs) ProtoMessage() {} func (x *ConnectServicesArgs) ProtoReflect() protoreflect.Message { - mi := &file_api_container_service_proto_msgTypes[39] + mi := &file_api_container_service_proto_msgTypes[40] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3206,7 +3253,7 @@ func (x *ConnectServicesArgs) ProtoReflect() protoreflect.Message { // Deprecated: Use ConnectServicesArgs.ProtoReflect.Descriptor instead. func (*ConnectServicesArgs) Descriptor() ([]byte, []int) { - return file_api_container_service_proto_rawDescGZIP(), []int{39} + return file_api_container_service_proto_rawDescGZIP(), []int{40} } func (x *ConnectServicesArgs) GetConnect() Connect { @@ -3225,7 +3272,7 @@ type ConnectServicesResponse struct { func (x *ConnectServicesResponse) Reset() { *x = ConnectServicesResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_container_service_proto_msgTypes[40] + mi := &file_api_container_service_proto_msgTypes[41] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3238,7 +3285,7 @@ func (x *ConnectServicesResponse) String() string { func (*ConnectServicesResponse) ProtoMessage() {} func (x *ConnectServicesResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_container_service_proto_msgTypes[40] + mi := &file_api_container_service_proto_msgTypes[41] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3251,7 +3298,7 @@ func (x *ConnectServicesResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ConnectServicesResponse.ProtoReflect.Descriptor instead. func (*ConnectServicesResponse) Descriptor() ([]byte, []int) { - return file_api_container_service_proto_rawDescGZIP(), []int{40} + return file_api_container_service_proto_rawDescGZIP(), []int{41} } type GetStarlarkRunResponse struct { @@ -3274,7 +3321,7 @@ type GetStarlarkRunResponse struct { func (x *GetStarlarkRunResponse) Reset() { *x = GetStarlarkRunResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_container_service_proto_msgTypes[41] + mi := &file_api_container_service_proto_msgTypes[42] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3287,7 +3334,7 @@ func (x *GetStarlarkRunResponse) String() string { func (*GetStarlarkRunResponse) ProtoMessage() {} func (x *GetStarlarkRunResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_container_service_proto_msgTypes[41] + mi := &file_api_container_service_proto_msgTypes[42] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3300,7 +3347,7 @@ func (x *GetStarlarkRunResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetStarlarkRunResponse.ProtoReflect.Descriptor instead. func (*GetStarlarkRunResponse) Descriptor() ([]byte, []int) { - return file_api_container_service_proto_rawDescGZIP(), []int{41} + return file_api_container_service_proto_rawDescGZIP(), []int{42} } func (x *GetStarlarkRunResponse) GetPackageId() string { @@ -3377,7 +3424,7 @@ type PlanYaml struct { func (x *PlanYaml) Reset() { *x = PlanYaml{} if protoimpl.UnsafeEnabled { - mi := &file_api_container_service_proto_msgTypes[42] + mi := &file_api_container_service_proto_msgTypes[43] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3390,7 +3437,7 @@ func (x *PlanYaml) String() string { func (*PlanYaml) ProtoMessage() {} func (x *PlanYaml) ProtoReflect() protoreflect.Message { - mi := &file_api_container_service_proto_msgTypes[42] + mi := &file_api_container_service_proto_msgTypes[43] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3403,7 +3450,7 @@ func (x *PlanYaml) ProtoReflect() protoreflect.Message { // Deprecated: Use PlanYaml.ProtoReflect.Descriptor instead. func (*PlanYaml) Descriptor() ([]byte, []int) { - return file_api_container_service_proto_rawDescGZIP(), []int{42} + return file_api_container_service_proto_rawDescGZIP(), []int{43} } func (x *PlanYaml) GetPlanYaml() string { @@ -3427,7 +3474,7 @@ type StarlarkScriptPlanYamlArgs struct { func (x *StarlarkScriptPlanYamlArgs) Reset() { *x = StarlarkScriptPlanYamlArgs{} if protoimpl.UnsafeEnabled { - mi := &file_api_container_service_proto_msgTypes[43] + mi := &file_api_container_service_proto_msgTypes[44] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3440,7 +3487,7 @@ func (x *StarlarkScriptPlanYamlArgs) String() string { func (*StarlarkScriptPlanYamlArgs) ProtoMessage() {} func (x *StarlarkScriptPlanYamlArgs) ProtoReflect() protoreflect.Message { - mi := &file_api_container_service_proto_msgTypes[43] + mi := &file_api_container_service_proto_msgTypes[44] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3453,7 +3500,7 @@ func (x *StarlarkScriptPlanYamlArgs) ProtoReflect() protoreflect.Message { // Deprecated: Use StarlarkScriptPlanYamlArgs.ProtoReflect.Descriptor instead. func (*StarlarkScriptPlanYamlArgs) Descriptor() ([]byte, []int) { - return file_api_container_service_proto_rawDescGZIP(), []int{43} + return file_api_container_service_proto_rawDescGZIP(), []int{44} } func (x *StarlarkScriptPlanYamlArgs) GetSerializedScript() string { @@ -3497,7 +3544,7 @@ type StarlarkPackagePlanYamlArgs struct { func (x *StarlarkPackagePlanYamlArgs) Reset() { *x = StarlarkPackagePlanYamlArgs{} if protoimpl.UnsafeEnabled { - mi := &file_api_container_service_proto_msgTypes[44] + mi := &file_api_container_service_proto_msgTypes[45] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3510,7 +3557,7 @@ func (x *StarlarkPackagePlanYamlArgs) String() string { func (*StarlarkPackagePlanYamlArgs) ProtoMessage() {} func (x *StarlarkPackagePlanYamlArgs) ProtoReflect() protoreflect.Message { - mi := &file_api_container_service_proto_msgTypes[44] + mi := &file_api_container_service_proto_msgTypes[45] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3523,7 +3570,7 @@ func (x *StarlarkPackagePlanYamlArgs) ProtoReflect() protoreflect.Message { // Deprecated: Use StarlarkPackagePlanYamlArgs.ProtoReflect.Descriptor instead. func (*StarlarkPackagePlanYamlArgs) Descriptor() ([]byte, []int) { - return file_api_container_service_proto_rawDescGZIP(), []int{44} + return file_api_container_service_proto_rawDescGZIP(), []int{45} } func (x *StarlarkPackagePlanYamlArgs) GetPackageId() string { @@ -3613,743 +3660,751 @@ var file_api_container_service_proto_rawDesc = []byte{ 0x38, 0x01, 0x22, 0x2f, 0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x0b, 0x0a, 0x07, 0x53, 0x54, 0x4f, 0x50, 0x50, 0x45, 0x44, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x52, 0x55, 0x4e, 0x4e, 0x49, 0x4e, 0x47, 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, - 0x4e, 0x10, 0x02, 0x22, 0x80, 0x09, 0x0a, 0x0b, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, - 0x6e, 0x66, 0x6f, 0x12, 0x21, 0x0a, 0x0c, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x75, - 0x75, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x73, 0x65, 0x72, 0x76, 0x69, - 0x63, 0x65, 0x55, 0x75, 0x69, 0x64, 0x12, 0x26, 0x0a, 0x0f, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, - 0x65, 0x5f, 0x69, 0x70, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0d, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x49, 0x70, 0x41, 0x64, 0x64, 0x72, 0x12, 0x55, - 0x0a, 0x0d, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x5f, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x18, - 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, - 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, - 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x50, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x50, 0x6f, 0x72, - 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, - 0x50, 0x6f, 0x72, 0x74, 0x73, 0x12, 0x2f, 0x0a, 0x14, 0x6d, 0x61, 0x79, 0x62, 0x65, 0x5f, 0x70, - 0x75, 0x62, 0x6c, 0x69, 0x63, 0x5f, 0x69, 0x70, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x11, 0x6d, 0x61, 0x79, 0x62, 0x65, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, - 0x49, 0x70, 0x41, 0x64, 0x64, 0x72, 0x12, 0x62, 0x0a, 0x12, 0x6d, 0x61, 0x79, 0x62, 0x65, 0x5f, - 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x5f, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x18, 0x05, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, - 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, - 0x66, 0x6f, 0x2e, 0x4d, 0x61, 0x79, 0x62, 0x65, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x50, 0x6f, - 0x72, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x10, 0x6d, 0x61, 0x79, 0x62, 0x65, 0x50, - 0x75, 0x62, 0x6c, 0x69, 0x63, 0x50, 0x6f, 0x72, 0x74, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, - 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x25, - 0x0a, 0x0e, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x65, 0x6e, 0x65, 0x64, 0x5f, 0x75, 0x75, 0x69, 0x64, - 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x65, 0x6e, 0x65, - 0x64, 0x55, 0x75, 0x69, 0x64, 0x12, 0x47, 0x0a, 0x0e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, - 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x20, 0x2e, - 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, - 0x69, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, - 0x0d, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x3a, - 0x0a, 0x09, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x18, 0x09, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x1c, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, - 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x52, - 0x09, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x12, 0xb4, 0x01, 0x0a, 0x30, 0x73, - 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x64, 0x69, 0x72, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x73, - 0x5f, 0x74, 0x6f, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x5f, 0x61, 0x72, 0x74, 0x69, 0x66, 0x61, - 0x63, 0x74, 0x73, 0x5f, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x73, 0x18, - 0x0a, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x4e, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, - 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, - 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x44, 0x69, 0x72, - 0x50, 0x61, 0x74, 0x68, 0x73, 0x54, 0x6f, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x72, 0x74, 0x69, - 0x66, 0x61, 0x63, 0x74, 0x73, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x73, - 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x2a, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x44, 0x69, - 0x72, 0x50, 0x61, 0x74, 0x68, 0x73, 0x54, 0x6f, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x72, 0x74, - 0x69, 0x66, 0x61, 0x63, 0x74, 0x73, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, - 0x73, 0x12, 0x23, 0x0a, 0x0d, 0x6d, 0x61, 0x78, 0x5f, 0x6d, 0x69, 0x6c, 0x6c, 0x69, 0x63, 0x70, - 0x75, 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0c, 0x6d, 0x61, 0x78, 0x4d, 0x69, 0x6c, - 0x6c, 0x69, 0x63, 0x70, 0x75, 0x73, 0x12, 0x23, 0x0a, 0x0d, 0x6d, 0x69, 0x6e, 0x5f, 0x6d, 0x69, - 0x6c, 0x6c, 0x69, 0x63, 0x70, 0x75, 0x73, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0c, 0x6d, - 0x69, 0x6e, 0x4d, 0x69, 0x6c, 0x6c, 0x69, 0x63, 0x70, 0x75, 0x73, 0x12, 0x30, 0x0a, 0x14, 0x6d, - 0x61, 0x78, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x6d, 0x65, 0x67, 0x61, 0x62, 0x79, - 0x74, 0x65, 0x73, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x12, 0x6d, 0x61, 0x78, 0x4d, 0x65, - 0x6d, 0x6f, 0x72, 0x79, 0x4d, 0x65, 0x67, 0x61, 0x62, 0x79, 0x74, 0x65, 0x73, 0x12, 0x30, 0x0a, - 0x14, 0x6d, 0x69, 0x6e, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x6d, 0x65, 0x67, 0x61, - 0x62, 0x79, 0x74, 0x65, 0x73, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x12, 0x6d, 0x69, 0x6e, - 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x4d, 0x65, 0x67, 0x61, 0x62, 0x79, 0x74, 0x65, 0x73, 0x1a, - 0x58, 0x0a, 0x11, 0x50, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x50, 0x6f, 0x72, 0x74, 0x73, 0x45, - 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2d, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, - 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x50, 0x6f, 0x72, 0x74, 0x52, 0x05, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x5c, 0x0a, 0x15, 0x4d, 0x61, 0x79, - 0x62, 0x65, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x50, 0x6f, 0x72, 0x74, 0x73, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2d, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, - 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x50, 0x6f, 0x72, 0x74, 0x52, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x5d, 0x0a, 0x2f, 0x53, 0x65, 0x72, 0x76, 0x69, - 0x63, 0x65, 0x44, 0x69, 0x72, 0x50, 0x61, 0x74, 0x68, 0x73, 0x54, 0x6f, 0x46, 0x69, 0x6c, 0x65, - 0x73, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x73, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, - 0x66, 0x69, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, - 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xd0, 0x05, 0x0a, 0x15, 0x52, 0x75, 0x6e, 0x53, 0x74, - 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, 0x41, 0x72, 0x67, 0x73, - 0x12, 0x2b, 0x0a, 0x11, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x5f, 0x73, - 0x63, 0x72, 0x69, 0x70, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x73, 0x65, 0x72, - 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, 0x12, 0x30, 0x0a, - 0x11, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x5f, 0x70, 0x61, 0x72, 0x61, - 0x6d, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x10, 0x73, 0x65, 0x72, 0x69, - 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x88, 0x01, 0x01, 0x12, - 0x1c, 0x0a, 0x07, 0x64, 0x72, 0x79, 0x5f, 0x72, 0x75, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, - 0x48, 0x01, 0x52, 0x06, 0x64, 0x72, 0x79, 0x52, 0x75, 0x6e, 0x88, 0x01, 0x01, 0x12, 0x25, 0x0a, - 0x0b, 0x70, 0x61, 0x72, 0x61, 0x6c, 0x6c, 0x65, 0x6c, 0x69, 0x73, 0x6d, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x05, 0x48, 0x02, 0x52, 0x0b, 0x70, 0x61, 0x72, 0x61, 0x6c, 0x6c, 0x65, 0x6c, 0x69, 0x73, - 0x6d, 0x88, 0x01, 0x01, 0x12, 0x31, 0x0a, 0x12, 0x6d, 0x61, 0x69, 0x6e, 0x5f, 0x66, 0x75, 0x6e, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, - 0x48, 0x03, 0x52, 0x10, 0x6d, 0x61, 0x69, 0x6e, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x4e, 0x61, 0x6d, 0x65, 0x88, 0x01, 0x01, 0x12, 0x5b, 0x0a, 0x15, 0x65, 0x78, 0x70, 0x65, 0x72, - 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x5f, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, - 0x18, 0x06, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x26, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, - 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x4b, 0x75, 0x72, 0x74, 0x6f, - 0x73, 0x69, 0x73, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x46, 0x6c, 0x61, 0x67, 0x52, 0x14, - 0x65, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x46, 0x65, 0x61, 0x74, - 0x75, 0x72, 0x65, 0x73, 0x12, 0x2f, 0x0a, 0x11, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x5f, 0x69, 0x6e, - 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x48, - 0x04, 0x52, 0x0f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, - 0x49, 0x64, 0x88, 0x01, 0x01, 0x12, 0x27, 0x0a, 0x0d, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x5f, 0x75, - 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x48, 0x05, 0x52, 0x0b, - 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x55, 0x73, 0x65, 0x72, 0x49, 0x64, 0x88, 0x01, 0x01, 0x12, 0x59, - 0x0a, 0x13, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x5f, 0x64, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, - 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x24, 0x2e, 0x61, 0x70, + 0x4e, 0x10, 0x02, 0x22, 0x54, 0x0a, 0x12, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x72, 0x74, 0x69, + 0x66, 0x61, 0x63, 0x74, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x3e, 0x0a, 0x1b, 0x66, 0x69, 0x6c, + 0x65, 0x73, 0x5f, 0x61, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x73, 0x5f, 0x69, 0x64, 0x65, + 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x19, + 0x66, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x73, 0x49, 0x64, + 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x73, 0x22, 0xa8, 0x09, 0x0a, 0x0b, 0x53, 0x65, + 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x21, 0x0a, 0x0c, 0x73, 0x65, 0x72, + 0x76, 0x69, 0x63, 0x65, 0x5f, 0x75, 0x75, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0b, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x55, 0x75, 0x69, 0x64, 0x12, 0x26, 0x0a, 0x0f, + 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x5f, 0x69, 0x70, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x49, 0x70, + 0x41, 0x64, 0x64, 0x72, 0x12, 0x55, 0x0a, 0x0d, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x5f, + 0x70, 0x6f, 0x72, 0x74, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, - 0x49, 0x6d, 0x61, 0x67, 0x65, 0x44, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x4d, 0x6f, 0x64, - 0x65, 0x48, 0x06, 0x52, 0x11, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x44, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, - 0x61, 0x64, 0x4d, 0x6f, 0x64, 0x65, 0x88, 0x01, 0x01, 0x12, 0x2f, 0x0a, 0x11, 0x6e, 0x6f, 0x6e, - 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x69, 0x6e, 0x67, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x0a, - 0x20, 0x01, 0x28, 0x08, 0x48, 0x07, 0x52, 0x0f, 0x6e, 0x6f, 0x6e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, - 0x69, 0x6e, 0x67, 0x4d, 0x6f, 0x64, 0x65, 0x88, 0x01, 0x01, 0x42, 0x14, 0x0a, 0x12, 0x5f, 0x73, + 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x50, 0x72, 0x69, 0x76, + 0x61, 0x74, 0x65, 0x50, 0x6f, 0x72, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, 0x70, + 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x50, 0x6f, 0x72, 0x74, 0x73, 0x12, 0x2f, 0x0a, 0x14, 0x6d, + 0x61, 0x79, 0x62, 0x65, 0x5f, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x5f, 0x69, 0x70, 0x5f, 0x61, + 0x64, 0x64, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x6d, 0x61, 0x79, 0x62, 0x65, + 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x49, 0x70, 0x41, 0x64, 0x64, 0x72, 0x12, 0x62, 0x0a, 0x12, + 0x6d, 0x61, 0x79, 0x62, 0x65, 0x5f, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x5f, 0x70, 0x6f, 0x72, + 0x74, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, + 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x65, 0x72, + 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x4d, 0x61, 0x79, 0x62, 0x65, 0x50, 0x75, + 0x62, 0x6c, 0x69, 0x63, 0x50, 0x6f, 0x72, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x10, + 0x6d, 0x61, 0x79, 0x62, 0x65, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x50, 0x6f, 0x72, 0x74, 0x73, + 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, + 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x65, 0x6e, 0x65, + 0x64, 0x5f, 0x75, 0x75, 0x69, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x73, 0x68, + 0x6f, 0x72, 0x74, 0x65, 0x6e, 0x65, 0x64, 0x55, 0x75, 0x69, 0x64, 0x12, 0x47, 0x0a, 0x0e, 0x73, + 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x08, 0x20, + 0x01, 0x28, 0x0e, 0x32, 0x20, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, + 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x0d, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x12, 0x3a, 0x0a, 0x09, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, + 0x72, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, + 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x43, 0x6f, 0x6e, 0x74, + 0x61, 0x69, 0x6e, 0x65, 0x72, 0x52, 0x09, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, + 0x12, 0xb4, 0x01, 0x0a, 0x30, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x64, 0x69, 0x72, + 0x5f, 0x70, 0x61, 0x74, 0x68, 0x73, 0x5f, 0x74, 0x6f, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x5f, + 0x61, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x73, 0x5f, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, + 0x66, 0x69, 0x65, 0x72, 0x73, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x4e, 0x2e, 0x61, 0x70, + 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, + 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x53, 0x65, 0x72, 0x76, + 0x69, 0x63, 0x65, 0x44, 0x69, 0x72, 0x50, 0x61, 0x74, 0x68, 0x73, 0x54, 0x6f, 0x46, 0x69, 0x6c, + 0x65, 0x73, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x73, 0x49, 0x64, 0x65, 0x6e, 0x74, + 0x69, 0x66, 0x69, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x2a, 0x73, 0x65, 0x72, + 0x76, 0x69, 0x63, 0x65, 0x44, 0x69, 0x72, 0x50, 0x61, 0x74, 0x68, 0x73, 0x54, 0x6f, 0x46, 0x69, + 0x6c, 0x65, 0x73, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x73, 0x49, 0x64, 0x65, 0x6e, + 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x73, 0x12, 0x23, 0x0a, 0x0d, 0x6d, 0x61, 0x78, 0x5f, 0x6d, + 0x69, 0x6c, 0x6c, 0x69, 0x63, 0x70, 0x75, 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0c, + 0x6d, 0x61, 0x78, 0x4d, 0x69, 0x6c, 0x6c, 0x69, 0x63, 0x70, 0x75, 0x73, 0x12, 0x23, 0x0a, 0x0d, + 0x6d, 0x69, 0x6e, 0x5f, 0x6d, 0x69, 0x6c, 0x6c, 0x69, 0x63, 0x70, 0x75, 0x73, 0x18, 0x0c, 0x20, + 0x01, 0x28, 0x0d, 0x52, 0x0c, 0x6d, 0x69, 0x6e, 0x4d, 0x69, 0x6c, 0x6c, 0x69, 0x63, 0x70, 0x75, + 0x73, 0x12, 0x30, 0x0a, 0x14, 0x6d, 0x61, 0x78, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, + 0x6d, 0x65, 0x67, 0x61, 0x62, 0x79, 0x74, 0x65, 0x73, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0d, 0x52, + 0x12, 0x6d, 0x61, 0x78, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x4d, 0x65, 0x67, 0x61, 0x62, 0x79, + 0x74, 0x65, 0x73, 0x12, 0x30, 0x0a, 0x14, 0x6d, 0x69, 0x6e, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, + 0x79, 0x5f, 0x6d, 0x65, 0x67, 0x61, 0x62, 0x79, 0x74, 0x65, 0x73, 0x18, 0x0e, 0x20, 0x01, 0x28, + 0x0d, 0x52, 0x12, 0x6d, 0x69, 0x6e, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x4d, 0x65, 0x67, 0x61, + 0x62, 0x79, 0x74, 0x65, 0x73, 0x1a, 0x58, 0x0a, 0x11, 0x50, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, + 0x50, 0x6f, 0x72, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, + 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2d, 0x0a, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x61, 0x70, + 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, + 0x50, 0x6f, 0x72, 0x74, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, + 0x5c, 0x0a, 0x15, 0x4d, 0x61, 0x79, 0x62, 0x65, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x50, 0x6f, + 0x72, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2d, 0x0a, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x61, 0x70, 0x69, 0x5f, + 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x50, 0x6f, + 0x72, 0x74, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x84, 0x01, + 0x0a, 0x2f, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x44, 0x69, 0x72, 0x50, 0x61, 0x74, 0x68, + 0x73, 0x54, 0x6f, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, + 0x73, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, + 0x6b, 0x65, 0x79, 0x12, 0x3b, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, + 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x72, 0x74, 0x69, + 0x66, 0x61, 0x63, 0x74, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x3a, 0x02, 0x38, 0x01, 0x22, 0xd0, 0x05, 0x0a, 0x15, 0x52, 0x75, 0x6e, 0x53, 0x74, 0x61, 0x72, + 0x6c, 0x61, 0x72, 0x6b, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, 0x41, 0x72, 0x67, 0x73, 0x12, 0x2b, + 0x0a, 0x11, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x5f, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x73, 0x65, 0x72, 0x69, 0x61, + 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, 0x12, 0x30, 0x0a, 0x11, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, - 0x42, 0x0a, 0x0a, 0x08, 0x5f, 0x64, 0x72, 0x79, 0x5f, 0x72, 0x75, 0x6e, 0x42, 0x0e, 0x0a, 0x0c, - 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6c, 0x6c, 0x65, 0x6c, 0x69, 0x73, 0x6d, 0x42, 0x15, 0x0a, 0x13, - 0x5f, 0x6d, 0x61, 0x69, 0x6e, 0x5f, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, - 0x61, 0x6d, 0x65, 0x42, 0x14, 0x0a, 0x12, 0x5f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x5f, 0x69, 0x6e, - 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x63, 0x6c, - 0x6f, 0x75, 0x64, 0x5f, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x42, 0x16, 0x0a, 0x14, 0x5f, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x10, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, + 0x69, 0x7a, 0x65, 0x64, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x88, 0x01, 0x01, 0x12, 0x1c, 0x0a, + 0x07, 0x64, 0x72, 0x79, 0x5f, 0x72, 0x75, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x48, 0x01, + 0x52, 0x06, 0x64, 0x72, 0x79, 0x52, 0x75, 0x6e, 0x88, 0x01, 0x01, 0x12, 0x25, 0x0a, 0x0b, 0x70, + 0x61, 0x72, 0x61, 0x6c, 0x6c, 0x65, 0x6c, 0x69, 0x73, 0x6d, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, + 0x48, 0x02, 0x52, 0x0b, 0x70, 0x61, 0x72, 0x61, 0x6c, 0x6c, 0x65, 0x6c, 0x69, 0x73, 0x6d, 0x88, + 0x01, 0x01, 0x12, 0x31, 0x0a, 0x12, 0x6d, 0x61, 0x69, 0x6e, 0x5f, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x48, 0x03, + 0x52, 0x10, 0x6d, 0x61, 0x69, 0x6e, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, + 0x6d, 0x65, 0x88, 0x01, 0x01, 0x12, 0x5b, 0x0a, 0x15, 0x65, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, + 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x5f, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x18, 0x06, + 0x20, 0x03, 0x28, 0x0e, 0x32, 0x26, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, + 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x4b, 0x75, 0x72, 0x74, 0x6f, 0x73, 0x69, + 0x73, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x46, 0x6c, 0x61, 0x67, 0x52, 0x14, 0x65, 0x78, + 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, + 0x65, 0x73, 0x12, 0x2f, 0x0a, 0x11, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x5f, 0x69, 0x6e, 0x73, 0x74, + 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x48, 0x04, 0x52, + 0x0f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x64, + 0x88, 0x01, 0x01, 0x12, 0x27, 0x0a, 0x0d, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x5f, 0x75, 0x73, 0x65, + 0x72, 0x5f, 0x69, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x48, 0x05, 0x52, 0x0b, 0x63, 0x6c, + 0x6f, 0x75, 0x64, 0x55, 0x73, 0x65, 0x72, 0x49, 0x64, 0x88, 0x01, 0x01, 0x12, 0x59, 0x0a, 0x13, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x5f, 0x64, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x6d, - 0x6f, 0x64, 0x65, 0x42, 0x14, 0x0a, 0x12, 0x5f, 0x6e, 0x6f, 0x6e, 0x5f, 0x62, 0x6c, 0x6f, 0x63, - 0x6b, 0x69, 0x6e, 0x67, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x22, 0xf4, 0x07, 0x0a, 0x16, 0x52, 0x75, - 0x6e, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, - 0x41, 0x72, 0x67, 0x73, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x5f, - 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, - 0x65, 0x49, 0x64, 0x12, 0x16, 0x0a, 0x05, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x0c, 0x48, 0x00, 0x52, 0x05, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x12, 0x18, 0x0a, 0x06, 0x72, - 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x48, 0x00, 0x52, 0x06, 0x72, - 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x12, 0x30, 0x0a, 0x11, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, - 0x7a, 0x65, 0x64, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, - 0x48, 0x01, 0x52, 0x10, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x50, 0x61, - 0x72, 0x61, 0x6d, 0x73, 0x88, 0x01, 0x01, 0x12, 0x1c, 0x0a, 0x07, 0x64, 0x72, 0x79, 0x5f, 0x72, - 0x75, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x48, 0x02, 0x52, 0x06, 0x64, 0x72, 0x79, 0x52, - 0x75, 0x6e, 0x88, 0x01, 0x01, 0x12, 0x25, 0x0a, 0x0b, 0x70, 0x61, 0x72, 0x61, 0x6c, 0x6c, 0x65, - 0x6c, 0x69, 0x73, 0x6d, 0x18, 0x07, 0x20, 0x01, 0x28, 0x05, 0x48, 0x03, 0x52, 0x0b, 0x70, 0x61, - 0x72, 0x61, 0x6c, 0x6c, 0x65, 0x6c, 0x69, 0x73, 0x6d, 0x88, 0x01, 0x01, 0x12, 0x28, 0x0a, 0x0d, - 0x63, 0x6c, 0x6f, 0x6e, 0x65, 0x5f, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x18, 0x08, 0x20, - 0x01, 0x28, 0x08, 0x48, 0x04, 0x52, 0x0c, 0x63, 0x6c, 0x6f, 0x6e, 0x65, 0x50, 0x61, 0x63, 0x6b, - 0x61, 0x67, 0x65, 0x88, 0x01, 0x01, 0x12, 0x3f, 0x0a, 0x1a, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, - 0x76, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x5f, 0x74, 0x6f, 0x5f, 0x6d, 0x61, 0x69, 0x6e, 0x5f, - 0x66, 0x69, 0x6c, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x48, 0x05, 0x52, 0x16, 0x72, 0x65, - 0x6c, 0x61, 0x74, 0x69, 0x76, 0x65, 0x50, 0x61, 0x74, 0x68, 0x54, 0x6f, 0x4d, 0x61, 0x69, 0x6e, - 0x46, 0x69, 0x6c, 0x65, 0x88, 0x01, 0x01, 0x12, 0x31, 0x0a, 0x12, 0x6d, 0x61, 0x69, 0x6e, 0x5f, - 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x0a, 0x20, - 0x01, 0x28, 0x09, 0x48, 0x06, 0x52, 0x10, 0x6d, 0x61, 0x69, 0x6e, 0x46, 0x75, 0x6e, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x88, 0x01, 0x01, 0x12, 0x5b, 0x0a, 0x15, 0x65, 0x78, - 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x5f, 0x66, 0x65, 0x61, 0x74, 0x75, - 0x72, 0x65, 0x73, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x26, 0x2e, 0x61, 0x70, 0x69, 0x5f, - 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x4b, 0x75, - 0x72, 0x74, 0x6f, 0x73, 0x69, 0x73, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x46, 0x6c, 0x61, - 0x67, 0x52, 0x14, 0x65, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x46, - 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x12, 0x2f, 0x0a, 0x11, 0x63, 0x6c, 0x6f, 0x75, 0x64, - 0x5f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x0c, 0x20, 0x01, - 0x28, 0x09, 0x48, 0x07, 0x52, 0x0f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x49, 0x6e, 0x73, 0x74, 0x61, - 0x6e, 0x63, 0x65, 0x49, 0x64, 0x88, 0x01, 0x01, 0x12, 0x27, 0x0a, 0x0d, 0x63, 0x6c, 0x6f, 0x75, - 0x64, 0x5f, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x48, - 0x08, 0x52, 0x0b, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x55, 0x73, 0x65, 0x72, 0x49, 0x64, 0x88, 0x01, - 0x01, 0x12, 0x59, 0x0a, 0x13, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x5f, 0x64, 0x6f, 0x77, 0x6e, 0x6c, - 0x6f, 0x61, 0x64, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x24, - 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, - 0x70, 0x69, 0x2e, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x44, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, - 0x4d, 0x6f, 0x64, 0x65, 0x48, 0x09, 0x52, 0x11, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x44, 0x6f, 0x77, - 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x4d, 0x6f, 0x64, 0x65, 0x88, 0x01, 0x01, 0x12, 0x2f, 0x0a, 0x11, - 0x6e, 0x6f, 0x6e, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x69, 0x6e, 0x67, 0x5f, 0x6d, 0x6f, 0x64, - 0x65, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x08, 0x48, 0x0a, 0x52, 0x0f, 0x6e, 0x6f, 0x6e, 0x42, 0x6c, - 0x6f, 0x63, 0x6b, 0x69, 0x6e, 0x67, 0x4d, 0x6f, 0x64, 0x65, 0x88, 0x01, 0x01, 0x12, 0x2f, 0x0a, - 0x11, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x5f, 0x61, 0x75, 0x74, 0x68, 0x5f, 0x74, 0x6f, 0x6b, - 0x65, 0x6e, 0x18, 0x10, 0x20, 0x01, 0x28, 0x09, 0x48, 0x0b, 0x52, 0x0f, 0x67, 0x69, 0x74, 0x68, - 0x75, 0x62, 0x41, 0x75, 0x74, 0x68, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x88, 0x01, 0x01, 0x42, 0x1a, - 0x0a, 0x18, 0x73, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x5f, 0x70, 0x61, 0x63, 0x6b, 0x61, - 0x67, 0x65, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x42, 0x14, 0x0a, 0x12, 0x5f, 0x73, - 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, - 0x42, 0x0a, 0x0a, 0x08, 0x5f, 0x64, 0x72, 0x79, 0x5f, 0x72, 0x75, 0x6e, 0x42, 0x0e, 0x0a, 0x0c, - 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6c, 0x6c, 0x65, 0x6c, 0x69, 0x73, 0x6d, 0x42, 0x10, 0x0a, 0x0e, - 0x5f, 0x63, 0x6c, 0x6f, 0x6e, 0x65, 0x5f, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x42, 0x1d, - 0x0a, 0x1b, 0x5f, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x68, - 0x5f, 0x74, 0x6f, 0x5f, 0x6d, 0x61, 0x69, 0x6e, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x42, 0x15, 0x0a, - 0x13, 0x5f, 0x6d, 0x61, 0x69, 0x6e, 0x5f, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, - 0x6e, 0x61, 0x6d, 0x65, 0x42, 0x14, 0x0a, 0x12, 0x5f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x5f, 0x69, - 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x63, - 0x6c, 0x6f, 0x75, 0x64, 0x5f, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x42, 0x16, 0x0a, 0x14, - 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x5f, 0x64, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x5f, - 0x6d, 0x6f, 0x64, 0x65, 0x42, 0x14, 0x0a, 0x12, 0x5f, 0x6e, 0x6f, 0x6e, 0x5f, 0x62, 0x6c, 0x6f, - 0x63, 0x6b, 0x69, 0x6e, 0x67, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x42, 0x14, 0x0a, 0x12, 0x5f, 0x67, + 0x6f, 0x64, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x24, 0x2e, 0x61, 0x70, 0x69, 0x5f, + 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x49, 0x6d, + 0x61, 0x67, 0x65, 0x44, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x4d, 0x6f, 0x64, 0x65, 0x48, + 0x06, 0x52, 0x11, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x44, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, + 0x4d, 0x6f, 0x64, 0x65, 0x88, 0x01, 0x01, 0x12, 0x2f, 0x0a, 0x11, 0x6e, 0x6f, 0x6e, 0x5f, 0x62, + 0x6c, 0x6f, 0x63, 0x6b, 0x69, 0x6e, 0x67, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x0a, 0x20, 0x01, + 0x28, 0x08, 0x48, 0x07, 0x52, 0x0f, 0x6e, 0x6f, 0x6e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x69, 0x6e, + 0x67, 0x4d, 0x6f, 0x64, 0x65, 0x88, 0x01, 0x01, 0x42, 0x14, 0x0a, 0x12, 0x5f, 0x73, 0x65, 0x72, + 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x42, 0x0a, + 0x0a, 0x08, 0x5f, 0x64, 0x72, 0x79, 0x5f, 0x72, 0x75, 0x6e, 0x42, 0x0e, 0x0a, 0x0c, 0x5f, 0x70, + 0x61, 0x72, 0x61, 0x6c, 0x6c, 0x65, 0x6c, 0x69, 0x73, 0x6d, 0x42, 0x15, 0x0a, 0x13, 0x5f, 0x6d, + 0x61, 0x69, 0x6e, 0x5f, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, + 0x65, 0x42, 0x14, 0x0a, 0x12, 0x5f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x5f, 0x69, 0x6e, 0x73, 0x74, + 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x63, 0x6c, 0x6f, 0x75, + 0x64, 0x5f, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x42, 0x16, 0x0a, 0x14, 0x5f, 0x69, 0x6d, + 0x61, 0x67, 0x65, 0x5f, 0x64, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x6d, 0x6f, 0x64, + 0x65, 0x42, 0x14, 0x0a, 0x12, 0x5f, 0x6e, 0x6f, 0x6e, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x69, + 0x6e, 0x67, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x22, 0xf4, 0x07, 0x0a, 0x16, 0x52, 0x75, 0x6e, 0x53, + 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x41, 0x72, + 0x67, 0x73, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x5f, 0x69, 0x64, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x49, + 0x64, 0x12, 0x16, 0x0a, 0x05, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, + 0x48, 0x00, 0x52, 0x05, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x12, 0x18, 0x0a, 0x06, 0x72, 0x65, 0x6d, + 0x6f, 0x74, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x48, 0x00, 0x52, 0x06, 0x72, 0x65, 0x6d, + 0x6f, 0x74, 0x65, 0x12, 0x30, 0x0a, 0x11, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, + 0x64, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, + 0x52, 0x10, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x50, 0x61, 0x72, 0x61, + 0x6d, 0x73, 0x88, 0x01, 0x01, 0x12, 0x1c, 0x0a, 0x07, 0x64, 0x72, 0x79, 0x5f, 0x72, 0x75, 0x6e, + 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x48, 0x02, 0x52, 0x06, 0x64, 0x72, 0x79, 0x52, 0x75, 0x6e, + 0x88, 0x01, 0x01, 0x12, 0x25, 0x0a, 0x0b, 0x70, 0x61, 0x72, 0x61, 0x6c, 0x6c, 0x65, 0x6c, 0x69, + 0x73, 0x6d, 0x18, 0x07, 0x20, 0x01, 0x28, 0x05, 0x48, 0x03, 0x52, 0x0b, 0x70, 0x61, 0x72, 0x61, + 0x6c, 0x6c, 0x65, 0x6c, 0x69, 0x73, 0x6d, 0x88, 0x01, 0x01, 0x12, 0x28, 0x0a, 0x0d, 0x63, 0x6c, + 0x6f, 0x6e, 0x65, 0x5f, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, + 0x08, 0x48, 0x04, 0x52, 0x0c, 0x63, 0x6c, 0x6f, 0x6e, 0x65, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, + 0x65, 0x88, 0x01, 0x01, 0x12, 0x3f, 0x0a, 0x1a, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x76, 0x65, + 0x5f, 0x70, 0x61, 0x74, 0x68, 0x5f, 0x74, 0x6f, 0x5f, 0x6d, 0x61, 0x69, 0x6e, 0x5f, 0x66, 0x69, + 0x6c, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x48, 0x05, 0x52, 0x16, 0x72, 0x65, 0x6c, 0x61, + 0x74, 0x69, 0x76, 0x65, 0x50, 0x61, 0x74, 0x68, 0x54, 0x6f, 0x4d, 0x61, 0x69, 0x6e, 0x46, 0x69, + 0x6c, 0x65, 0x88, 0x01, 0x01, 0x12, 0x31, 0x0a, 0x12, 0x6d, 0x61, 0x69, 0x6e, 0x5f, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, + 0x09, 0x48, 0x06, 0x52, 0x10, 0x6d, 0x61, 0x69, 0x6e, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x88, 0x01, 0x01, 0x12, 0x5b, 0x0a, 0x15, 0x65, 0x78, 0x70, 0x65, + 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x5f, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, + 0x73, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x26, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, + 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x4b, 0x75, 0x72, 0x74, + 0x6f, 0x73, 0x69, 0x73, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x46, 0x6c, 0x61, 0x67, 0x52, + 0x14, 0x65, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x46, 0x65, 0x61, + 0x74, 0x75, 0x72, 0x65, 0x73, 0x12, 0x2f, 0x0a, 0x11, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x5f, 0x69, + 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, + 0x48, 0x07, 0x52, 0x0f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, + 0x65, 0x49, 0x64, 0x88, 0x01, 0x01, 0x12, 0x27, 0x0a, 0x0d, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x5f, + 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x48, 0x08, 0x52, + 0x0b, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x55, 0x73, 0x65, 0x72, 0x49, 0x64, 0x88, 0x01, 0x01, 0x12, + 0x59, 0x0a, 0x13, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x5f, 0x64, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, + 0x64, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x24, 0x2e, 0x61, + 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, + 0x2e, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x44, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x4d, 0x6f, + 0x64, 0x65, 0x48, 0x09, 0x52, 0x11, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x44, 0x6f, 0x77, 0x6e, 0x6c, + 0x6f, 0x61, 0x64, 0x4d, 0x6f, 0x64, 0x65, 0x88, 0x01, 0x01, 0x12, 0x2f, 0x0a, 0x11, 0x6e, 0x6f, + 0x6e, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x69, 0x6e, 0x67, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x18, + 0x0f, 0x20, 0x01, 0x28, 0x08, 0x48, 0x0a, 0x52, 0x0f, 0x6e, 0x6f, 0x6e, 0x42, 0x6c, 0x6f, 0x63, + 0x6b, 0x69, 0x6e, 0x67, 0x4d, 0x6f, 0x64, 0x65, 0x88, 0x01, 0x01, 0x12, 0x2f, 0x0a, 0x11, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x5f, 0x61, 0x75, 0x74, 0x68, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, - 0x22, 0xb6, 0x04, 0x0a, 0x17, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x52, 0x75, 0x6e, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x4c, 0x69, 0x6e, 0x65, 0x12, 0x4a, 0x0a, 0x0b, - 0x69, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x26, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, - 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x49, 0x6e, - 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x00, 0x52, 0x0b, 0x69, 0x6e, 0x73, - 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x38, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, - 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, + 0x18, 0x10, 0x20, 0x01, 0x28, 0x09, 0x48, 0x0b, 0x52, 0x0f, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, + 0x41, 0x75, 0x74, 0x68, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x88, 0x01, 0x01, 0x42, 0x1a, 0x0a, 0x18, + 0x73, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x5f, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, + 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x42, 0x14, 0x0a, 0x12, 0x5f, 0x73, 0x65, 0x72, + 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x42, 0x0a, + 0x0a, 0x08, 0x5f, 0x64, 0x72, 0x79, 0x5f, 0x72, 0x75, 0x6e, 0x42, 0x0e, 0x0a, 0x0c, 0x5f, 0x70, + 0x61, 0x72, 0x61, 0x6c, 0x6c, 0x65, 0x6c, 0x69, 0x73, 0x6d, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x63, + 0x6c, 0x6f, 0x6e, 0x65, 0x5f, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x42, 0x1d, 0x0a, 0x1b, + 0x5f, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x5f, 0x74, + 0x6f, 0x5f, 0x6d, 0x61, 0x69, 0x6e, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x42, 0x15, 0x0a, 0x13, 0x5f, + 0x6d, 0x61, 0x69, 0x6e, 0x5f, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x61, + 0x6d, 0x65, 0x42, 0x14, 0x0a, 0x12, 0x5f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x5f, 0x69, 0x6e, 0x73, + 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x63, 0x6c, 0x6f, + 0x75, 0x64, 0x5f, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x42, 0x16, 0x0a, 0x14, 0x5f, 0x69, + 0x6d, 0x61, 0x67, 0x65, 0x5f, 0x64, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x6d, 0x6f, + 0x64, 0x65, 0x42, 0x14, 0x0a, 0x12, 0x5f, 0x6e, 0x6f, 0x6e, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, + 0x69, 0x6e, 0x67, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x42, 0x14, 0x0a, 0x12, 0x5f, 0x67, 0x69, 0x74, + 0x68, 0x75, 0x62, 0x5f, 0x61, 0x75, 0x74, 0x68, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0xb6, + 0x04, 0x0a, 0x17, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x52, 0x75, 0x6e, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x4c, 0x69, 0x6e, 0x65, 0x12, 0x4a, 0x0a, 0x0b, 0x69, 0x6e, + 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x26, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, + 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x49, 0x6e, 0x73, 0x74, + 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x00, 0x52, 0x0b, 0x69, 0x6e, 0x73, 0x74, 0x72, + 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x38, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, + 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, + 0x72, 0x6b, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x48, 0x00, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, + 0x12, 0x4d, 0x0a, 0x0d, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x5f, 0x69, 0x6e, 0x66, + 0x6f, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, 0x61, 0x72, - 0x6c, 0x61, 0x72, 0x6b, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x48, 0x00, 0x52, 0x05, 0x65, 0x72, 0x72, - 0x6f, 0x72, 0x12, 0x4d, 0x0a, 0x0d, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x5f, 0x69, - 0x6e, 0x66, 0x6f, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x61, 0x70, 0x69, 0x5f, - 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, - 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x52, 0x75, 0x6e, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, - 0x73, 0x48, 0x00, 0x52, 0x0c, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x49, 0x6e, 0x66, - 0x6f, 0x12, 0x5d, 0x0a, 0x12, 0x69, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x5f, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, - 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, - 0x69, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x49, 0x6e, 0x73, 0x74, 0x72, 0x75, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x48, 0x00, 0x52, 0x11, 0x69, - 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, - 0x12, 0x5b, 0x0a, 0x12, 0x72, 0x75, 0x6e, 0x5f, 0x66, 0x69, 0x6e, 0x69, 0x73, 0x68, 0x65, 0x64, - 0x5f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x61, - 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, - 0x2e, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x52, 0x75, 0x6e, 0x46, 0x69, 0x6e, 0x69, - 0x73, 0x68, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x10, 0x72, 0x75, 0x6e, - 0x46, 0x69, 0x6e, 0x69, 0x73, 0x68, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x3e, 0x0a, - 0x07, 0x77, 0x61, 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, - 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, - 0x70, 0x69, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x57, 0x61, 0x72, 0x6e, 0x69, - 0x6e, 0x67, 0x48, 0x00, 0x52, 0x07, 0x77, 0x61, 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x12, 0x35, 0x0a, - 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x61, 0x70, + 0x6c, 0x61, 0x72, 0x6b, 0x52, 0x75, 0x6e, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x48, + 0x00, 0x52, 0x0c, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x12, + 0x5d, 0x0a, 0x12, 0x69, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x72, + 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, - 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x48, 0x00, 0x52, 0x04, - 0x69, 0x6e, 0x66, 0x6f, 0x42, 0x13, 0x0a, 0x11, 0x72, 0x75, 0x6e, 0x5f, 0x72, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x5f, 0x6c, 0x69, 0x6e, 0x65, 0x22, 0x31, 0x0a, 0x0c, 0x53, 0x74, 0x61, - 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x21, 0x0a, 0x0c, 0x69, 0x6e, 0x66, - 0x6f, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0b, 0x69, 0x6e, 0x66, 0x6f, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x3a, 0x0a, 0x0f, - 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x57, 0x61, 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x12, - 0x27, 0x0a, 0x0f, 0x77, 0x61, 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, - 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x77, 0x61, 0x72, 0x6e, 0x69, 0x6e, - 0x67, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0xcd, 0x02, 0x0a, 0x13, 0x53, 0x74, 0x61, - 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x49, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x12, 0x4a, 0x0a, 0x08, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, - 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x49, - 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, - 0x6f, 0x6e, 0x52, 0x08, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x29, 0x0a, 0x10, - 0x69, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x69, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x47, 0x0a, 0x09, 0x61, 0x72, 0x67, 0x75, 0x6d, - 0x65, 0x6e, 0x74, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x61, 0x70, 0x69, + 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x49, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x48, 0x00, 0x52, 0x11, 0x69, 0x6e, 0x73, + 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x5b, + 0x0a, 0x12, 0x72, 0x75, 0x6e, 0x5f, 0x66, 0x69, 0x6e, 0x69, 0x73, 0x68, 0x65, 0x64, 0x5f, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x53, - 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x49, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x41, 0x72, 0x67, 0x52, 0x09, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, - 0x12, 0x35, 0x0a, 0x16, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x69, - 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x15, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x49, 0x6e, 0x73, 0x74, - 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1d, 0x0a, 0x0a, 0x69, 0x73, 0x5f, 0x73, 0x6b, - 0x69, 0x70, 0x70, 0x65, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x69, 0x73, 0x53, - 0x6b, 0x69, 0x70, 0x70, 0x65, 0x64, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, - 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, - 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x5f, 0x0a, 0x19, 0x53, 0x74, 0x61, 0x72, - 0x6c, 0x61, 0x72, 0x6b, 0x49, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, - 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x42, 0x0a, 0x1d, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, - 0x7a, 0x65, 0x64, 0x5f, 0x69, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, - 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x1b, 0x73, 0x65, - 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x49, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0xa4, 0x01, 0x0a, 0x16, 0x53, 0x74, - 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x49, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x41, 0x72, 0x67, 0x12, 0x30, 0x0a, 0x14, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, - 0x65, 0x64, 0x5f, 0x61, 0x72, 0x67, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x12, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x41, 0x72, - 0x67, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x1e, 0x0a, 0x08, 0x61, 0x72, 0x67, 0x5f, 0x6e, 0x61, - 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x07, 0x61, 0x72, 0x67, 0x4e, - 0x61, 0x6d, 0x65, 0x88, 0x01, 0x01, 0x12, 0x2b, 0x0a, 0x11, 0x69, 0x73, 0x5f, 0x72, 0x65, 0x70, - 0x72, 0x65, 0x73, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x76, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x10, 0x69, 0x73, 0x52, 0x65, 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x74, 0x61, 0x74, - 0x69, 0x76, 0x65, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x61, 0x72, 0x67, 0x5f, 0x6e, 0x61, 0x6d, 0x65, - 0x22, 0x65, 0x0a, 0x1b, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x49, 0x6e, 0x73, 0x74, - 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, - 0x1a, 0x0a, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6c, - 0x69, 0x6e, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x6c, 0x69, 0x6e, 0x65, 0x12, - 0x16, 0x0a, 0x06, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, - 0x06, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x22, 0xac, 0x02, 0x0a, 0x0d, 0x53, 0x74, 0x61, 0x72, - 0x6c, 0x61, 0x72, 0x6b, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x63, 0x0a, 0x14, 0x69, 0x6e, 0x74, - 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x65, 0x72, 0x72, 0x6f, - 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, - 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, 0x61, 0x72, - 0x6c, 0x61, 0x72, 0x6b, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x48, 0x00, 0x52, 0x13, 0x69, 0x6e, 0x74, 0x65, 0x72, - 0x70, 0x72, 0x65, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x57, - 0x0a, 0x10, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x65, 0x72, 0x72, - 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, + 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x52, 0x75, 0x6e, 0x46, 0x69, 0x6e, 0x69, 0x73, 0x68, + 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x10, 0x72, 0x75, 0x6e, 0x46, 0x69, + 0x6e, 0x69, 0x73, 0x68, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x3e, 0x0a, 0x07, 0x77, + 0x61, 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x61, + 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, + 0x2e, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x57, 0x61, 0x72, 0x6e, 0x69, 0x6e, 0x67, + 0x48, 0x00, 0x52, 0x07, 0x77, 0x61, 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x12, 0x35, 0x0a, 0x04, 0x69, + 0x6e, 0x66, 0x6f, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x61, 0x70, 0x69, 0x5f, + 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, + 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x48, 0x00, 0x52, 0x04, 0x69, 0x6e, + 0x66, 0x6f, 0x42, 0x13, 0x0a, 0x11, 0x72, 0x75, 0x6e, 0x5f, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x5f, 0x6c, 0x69, 0x6e, 0x65, 0x22, 0x31, 0x0a, 0x0c, 0x53, 0x74, 0x61, 0x72, 0x6c, + 0x61, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x21, 0x0a, 0x0c, 0x69, 0x6e, 0x66, 0x6f, 0x5f, + 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x69, + 0x6e, 0x66, 0x6f, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x3a, 0x0a, 0x0f, 0x53, 0x74, + 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x57, 0x61, 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x12, 0x27, 0x0a, + 0x0f, 0x77, 0x61, 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x77, 0x61, 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x4d, + 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0xcd, 0x02, 0x0a, 0x13, 0x53, 0x74, 0x61, 0x72, 0x6c, + 0x61, 0x72, 0x6b, 0x49, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x4a, + 0x0a, 0x08, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x2e, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, + 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x49, 0x6e, 0x73, + 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, + 0x52, 0x08, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x29, 0x0a, 0x10, 0x69, 0x6e, + 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x69, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x47, 0x0a, 0x09, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, 0x61, - 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, - 0x72, 0x72, 0x6f, 0x72, 0x48, 0x00, 0x52, 0x0f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x54, 0x0a, 0x0f, 0x65, 0x78, 0x65, 0x63, 0x75, - 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x29, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, - 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x45, 0x78, 0x65, - 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x48, 0x00, 0x52, 0x0e, 0x65, - 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x42, 0x07, 0x0a, - 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x42, 0x0a, 0x1b, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, + 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x49, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x41, 0x72, 0x67, 0x52, 0x09, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x35, + 0x0a, 0x16, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x69, 0x6e, 0x73, + 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x15, + 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x49, 0x6e, 0x73, 0x74, 0x72, 0x75, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1d, 0x0a, 0x0a, 0x69, 0x73, 0x5f, 0x73, 0x6b, 0x69, 0x70, + 0x70, 0x65, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x69, 0x73, 0x53, 0x6b, 0x69, + 0x70, 0x70, 0x65, 0x64, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x5f, 0x0a, 0x19, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, + 0x72, 0x6b, 0x49, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, + 0x75, 0x6c, 0x74, 0x12, 0x42, 0x0a, 0x1d, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, + 0x64, 0x5f, 0x69, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x72, 0x65, + 0x73, 0x75, 0x6c, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x1b, 0x73, 0x65, 0x72, 0x69, + 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x49, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0xa4, 0x01, 0x0a, 0x16, 0x53, 0x74, 0x61, 0x72, + 0x6c, 0x61, 0x72, 0x6b, 0x49, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x41, + 0x72, 0x67, 0x12, 0x30, 0x0a, 0x14, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, + 0x5f, 0x61, 0x72, 0x67, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x12, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x41, 0x72, 0x67, 0x56, + 0x61, 0x6c, 0x75, 0x65, 0x12, 0x1e, 0x0a, 0x08, 0x61, 0x72, 0x67, 0x5f, 0x6e, 0x61, 0x6d, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x07, 0x61, 0x72, 0x67, 0x4e, 0x61, 0x6d, + 0x65, 0x88, 0x01, 0x01, 0x12, 0x2b, 0x0a, 0x11, 0x69, 0x73, 0x5f, 0x72, 0x65, 0x70, 0x72, 0x65, + 0x73, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x76, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x10, 0x69, 0x73, 0x52, 0x65, 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x76, + 0x65, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x61, 0x72, 0x67, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x65, + 0x0a, 0x1b, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x49, 0x6e, 0x73, 0x74, 0x72, 0x75, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1a, 0x0a, + 0x08, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x08, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6c, 0x69, 0x6e, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x6c, 0x69, 0x6e, 0x65, 0x12, 0x16, 0x0a, + 0x06, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x63, + 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x22, 0xac, 0x02, 0x0a, 0x0d, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, + 0x72, 0x6b, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x63, 0x0a, 0x14, 0x69, 0x6e, 0x74, 0x65, 0x72, + 0x70, 0x72, 0x65, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, + 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x45, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x23, 0x0a, 0x0d, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x5f, 0x6d, - 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x65, 0x72, - 0x72, 0x6f, 0x72, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x3e, 0x0a, 0x17, 0x53, 0x74, - 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x45, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x23, 0x0a, 0x0d, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x5f, 0x6d, - 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x65, 0x72, - 0x72, 0x6f, 0x72, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x3d, 0x0a, 0x16, 0x53, 0x74, - 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x45, - 0x72, 0x72, 0x6f, 0x72, 0x12, 0x23, 0x0a, 0x0d, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x5f, 0x6d, 0x65, - 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x65, 0x72, 0x72, - 0x6f, 0x72, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x92, 0x01, 0x0a, 0x13, 0x53, 0x74, - 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x52, 0x75, 0x6e, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, - 0x73, 0x12, 0x2a, 0x0a, 0x11, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x74, 0x65, - 0x70, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0f, 0x63, 0x75, - 0x72, 0x72, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x65, 0x70, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1f, 0x0a, - 0x0b, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x73, 0x74, 0x65, 0x70, 0x73, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x0d, 0x52, 0x0a, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x53, 0x74, 0x65, 0x70, 0x73, 0x12, 0x2e, - 0x0a, 0x13, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x74, 0x65, 0x70, 0x5f, 0x6e, - 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x11, 0x63, 0x75, 0x72, - 0x72, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x65, 0x70, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x22, 0x8e, - 0x01, 0x0a, 0x18, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x52, 0x75, 0x6e, 0x46, 0x69, - 0x6e, 0x69, 0x73, 0x68, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x2a, 0x0a, 0x11, 0x69, - 0x73, 0x5f, 0x72, 0x75, 0x6e, 0x5f, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x66, 0x75, 0x6c, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, 0x69, 0x73, 0x52, 0x75, 0x6e, 0x53, 0x75, 0x63, - 0x63, 0x65, 0x73, 0x73, 0x66, 0x75, 0x6c, 0x12, 0x30, 0x0a, 0x11, 0x73, 0x65, 0x72, 0x69, 0x61, - 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x5f, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x48, 0x00, 0x52, 0x10, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, - 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x88, 0x01, 0x01, 0x42, 0x14, 0x0a, 0x12, 0x5f, 0x73, 0x65, - 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x5f, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, - 0xc5, 0x01, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x41, - 0x72, 0x67, 0x73, 0x12, 0x6b, 0x0a, 0x13, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, - 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x3a, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, - 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, - 0x41, 0x72, 0x67, 0x73, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x65, 0x6e, - 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x12, 0x73, 0x65, - 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x73, - 0x1a, 0x45, 0x0a, 0x17, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, - 0x69, 0x66, 0x69, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, - 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xd1, 0x01, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x53, - 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x5a, 0x0a, 0x0c, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, - 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x37, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, - 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x65, 0x72, - 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x53, 0x65, - 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0b, - 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x1a, 0x5e, 0x0a, 0x10, 0x53, - 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, - 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, - 0x79, 0x12, 0x34, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x1e, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, - 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, - 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x72, 0x0a, 0x12, 0x53, - 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, - 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x75, 0x75, 0x69, - 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, - 0x55, 0x75, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x73, 0x68, 0x6f, 0x72, - 0x74, 0x65, 0x6e, 0x65, 0x64, 0x5f, 0x75, 0x75, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0d, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x65, 0x6e, 0x65, 0x64, 0x55, 0x75, 0x69, 0x64, 0x22, - 0x83, 0x01, 0x0a, 0x32, 0x47, 0x65, 0x74, 0x45, 0x78, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x41, - 0x6e, 0x64, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x69, 0x63, 0x61, 0x6c, 0x53, 0x65, 0x72, 0x76, - 0x69, 0x63, 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x73, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4d, 0x0a, 0x0e, 0x61, 0x6c, 0x6c, 0x49, 0x64, 0x65, - 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x25, + 0x45, 0x72, 0x72, 0x6f, 0x72, 0x48, 0x00, 0x52, 0x13, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, + 0x65, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x57, 0x0a, 0x10, + 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, + 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x6c, + 0x61, 0x72, 0x6b, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x72, 0x72, + 0x6f, 0x72, 0x48, 0x00, 0x52, 0x0f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x45, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x54, 0x0a, 0x0f, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, + 0x6f, 0x6e, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, - 0x70, 0x69, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, - 0x66, 0x69, 0x65, 0x72, 0x73, 0x52, 0x0e, 0x61, 0x6c, 0x6c, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, - 0x66, 0x69, 0x65, 0x72, 0x73, 0x22, 0x63, 0x0a, 0x0f, 0x45, 0x78, 0x65, 0x63, 0x43, 0x6f, 0x6d, - 0x6d, 0x61, 0x6e, 0x64, 0x41, 0x72, 0x67, 0x73, 0x12, 0x2d, 0x0a, 0x12, 0x73, 0x65, 0x72, 0x76, - 0x69, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x65, - 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x12, 0x21, 0x0a, 0x0c, 0x63, 0x6f, 0x6d, 0x6d, 0x61, - 0x6e, 0x64, 0x5f, 0x61, 0x72, 0x67, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0b, 0x63, - 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x41, 0x72, 0x67, 0x73, 0x22, 0x51, 0x0a, 0x13, 0x45, 0x78, - 0x65, 0x63, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x65, 0x78, 0x69, 0x74, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x65, 0x78, 0x69, 0x74, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x1d, - 0x0a, 0x0a, 0x6c, 0x6f, 0x67, 0x5f, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x09, 0x6c, 0x6f, 0x67, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0xac, 0x03, - 0x0a, 0x26, 0x57, 0x61, 0x69, 0x74, 0x46, 0x6f, 0x72, 0x48, 0x74, 0x74, 0x70, 0x47, 0x65, 0x74, - 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x69, - 0x6c, 0x69, 0x74, 0x79, 0x41, 0x72, 0x67, 0x73, 0x12, 0x2d, 0x0a, 0x12, 0x73, 0x65, 0x72, 0x76, - 0x69, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x65, - 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x6f, 0x72, 0x74, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x70, 0x6f, 0x72, 0x74, 0x12, 0x17, 0x0a, 0x04, 0x70, - 0x61, 0x74, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x04, 0x70, 0x61, 0x74, - 0x68, 0x88, 0x01, 0x01, 0x12, 0x41, 0x0a, 0x1a, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x5f, + 0x70, 0x69, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x45, 0x78, 0x65, 0x63, 0x75, + 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x48, 0x00, 0x52, 0x0e, 0x65, 0x78, 0x65, + 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x42, 0x07, 0x0a, 0x05, 0x65, + 0x72, 0x72, 0x6f, 0x72, 0x22, 0x42, 0x0a, 0x1b, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, + 0x49, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x72, + 0x72, 0x6f, 0x72, 0x12, 0x23, 0x0a, 0x0d, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x5f, 0x6d, 0x65, 0x73, + 0x73, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x65, 0x72, 0x72, 0x6f, + 0x72, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x3e, 0x0a, 0x17, 0x53, 0x74, 0x61, 0x72, + 0x6c, 0x61, 0x72, 0x6b, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x72, + 0x72, 0x6f, 0x72, 0x12, 0x23, 0x0a, 0x0d, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x5f, 0x6d, 0x65, 0x73, + 0x73, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x65, 0x72, 0x72, 0x6f, + 0x72, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x3d, 0x0a, 0x16, 0x53, 0x74, 0x61, 0x72, + 0x6c, 0x61, 0x72, 0x6b, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x72, 0x72, + 0x6f, 0x72, 0x12, 0x23, 0x0a, 0x0d, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x5f, 0x6d, 0x65, 0x73, 0x73, + 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x65, 0x72, 0x72, 0x6f, 0x72, + 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x92, 0x01, 0x0a, 0x13, 0x53, 0x74, 0x61, 0x72, + 0x6c, 0x61, 0x72, 0x6b, 0x52, 0x75, 0x6e, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x12, + 0x2a, 0x0a, 0x11, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x74, 0x65, 0x70, 0x5f, + 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0f, 0x63, 0x75, 0x72, 0x72, + 0x65, 0x6e, 0x74, 0x53, 0x74, 0x65, 0x70, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1f, 0x0a, 0x0b, 0x74, + 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x73, 0x74, 0x65, 0x70, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, + 0x52, 0x0a, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x53, 0x74, 0x65, 0x70, 0x73, 0x12, 0x2e, 0x0a, 0x13, + 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x74, 0x65, 0x70, 0x5f, 0x6e, 0x75, 0x6d, + 0x62, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x11, 0x63, 0x75, 0x72, 0x72, 0x65, + 0x6e, 0x74, 0x53, 0x74, 0x65, 0x70, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x22, 0x8e, 0x01, 0x0a, + 0x18, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x52, 0x75, 0x6e, 0x46, 0x69, 0x6e, 0x69, + 0x73, 0x68, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x2a, 0x0a, 0x11, 0x69, 0x73, 0x5f, + 0x72, 0x75, 0x6e, 0x5f, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x66, 0x75, 0x6c, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, 0x69, 0x73, 0x52, 0x75, 0x6e, 0x53, 0x75, 0x63, 0x63, 0x65, + 0x73, 0x73, 0x66, 0x75, 0x6c, 0x12, 0x30, 0x0a, 0x11, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, + 0x7a, 0x65, 0x64, 0x5f, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x48, 0x00, 0x52, 0x10, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x4f, 0x75, + 0x74, 0x70, 0x75, 0x74, 0x88, 0x01, 0x01, 0x42, 0x14, 0x0a, 0x12, 0x5f, 0x73, 0x65, 0x72, 0x69, + 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x5f, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0xc5, 0x01, + 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x41, 0x72, 0x67, + 0x73, 0x12, 0x6b, 0x0a, 0x13, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x65, + 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3a, + 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, + 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x41, 0x72, + 0x67, 0x73, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, + 0x66, 0x69, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x12, 0x73, 0x65, 0x72, 0x76, + 0x69, 0x63, 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x73, 0x1a, 0x45, + 0x0a, 0x17, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, + 0x69, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xd1, 0x01, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x53, 0x65, 0x72, + 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x5a, 0x0a, + 0x0c, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x01, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x37, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, + 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, + 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x53, 0x65, 0x72, 0x76, + 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0b, 0x73, 0x65, + 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x1a, 0x5e, 0x0a, 0x10, 0x53, 0x65, 0x72, + 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, + 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, + 0x34, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, + 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, + 0x70, 0x69, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x72, 0x0a, 0x12, 0x53, 0x65, 0x72, + 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x73, 0x12, + 0x21, 0x0a, 0x0c, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x75, 0x75, 0x69, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x55, 0x75, + 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x65, + 0x6e, 0x65, 0x64, 0x5f, 0x75, 0x75, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, + 0x73, 0x68, 0x6f, 0x72, 0x74, 0x65, 0x6e, 0x65, 0x64, 0x55, 0x75, 0x69, 0x64, 0x22, 0x83, 0x01, + 0x0a, 0x32, 0x47, 0x65, 0x74, 0x45, 0x78, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x41, 0x6e, 0x64, + 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x69, 0x63, 0x61, 0x6c, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, + 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4d, 0x0a, 0x0e, 0x61, 0x6c, 0x6c, 0x49, 0x64, 0x65, 0x6e, 0x74, + 0x69, 0x66, 0x69, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x61, + 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, + 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, + 0x65, 0x72, 0x73, 0x52, 0x0e, 0x61, 0x6c, 0x6c, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, + 0x65, 0x72, 0x73, 0x22, 0x63, 0x0a, 0x0f, 0x45, 0x78, 0x65, 0x63, 0x43, 0x6f, 0x6d, 0x6d, 0x61, + 0x6e, 0x64, 0x41, 0x72, 0x67, 0x73, 0x12, 0x2d, 0x0a, 0x12, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, + 0x65, 0x5f, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x11, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, + 0x69, 0x66, 0x69, 0x65, 0x72, 0x12, 0x21, 0x0a, 0x0c, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, + 0x5f, 0x61, 0x72, 0x67, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x6f, 0x6d, + 0x6d, 0x61, 0x6e, 0x64, 0x41, 0x72, 0x67, 0x73, 0x22, 0x51, 0x0a, 0x13, 0x45, 0x78, 0x65, 0x63, + 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x1b, 0x0a, 0x09, 0x65, 0x78, 0x69, 0x74, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x05, 0x52, 0x08, 0x65, 0x78, 0x69, 0x74, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x1d, 0x0a, 0x0a, + 0x6c, 0x6f, 0x67, 0x5f, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x09, 0x6c, 0x6f, 0x67, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0xac, 0x03, 0x0a, 0x26, + 0x57, 0x61, 0x69, 0x74, 0x46, 0x6f, 0x72, 0x48, 0x74, 0x74, 0x70, 0x47, 0x65, 0x74, 0x45, 0x6e, + 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x69, 0x6c, 0x69, + 0x74, 0x79, 0x41, 0x72, 0x67, 0x73, 0x12, 0x2d, 0x0a, 0x12, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, + 0x65, 0x5f, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x11, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, + 0x69, 0x66, 0x69, 0x65, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x0d, 0x52, 0x04, 0x70, 0x6f, 0x72, 0x74, 0x12, 0x17, 0x0a, 0x04, 0x70, 0x61, 0x74, + 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x88, + 0x01, 0x01, 0x12, 0x41, 0x0a, 0x1a, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x5f, 0x64, 0x65, + 0x6c, 0x61, 0x79, 0x5f, 0x6d, 0x69, 0x6c, 0x6c, 0x69, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x48, 0x01, 0x52, 0x18, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, + 0x6c, 0x44, 0x65, 0x6c, 0x61, 0x79, 0x4d, 0x69, 0x6c, 0x6c, 0x69, 0x73, 0x65, 0x63, 0x6f, 0x6e, + 0x64, 0x73, 0x88, 0x01, 0x01, 0x12, 0x1d, 0x0a, 0x07, 0x72, 0x65, 0x74, 0x72, 0x69, 0x65, 0x73, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x48, 0x02, 0x52, 0x07, 0x72, 0x65, 0x74, 0x72, 0x69, 0x65, + 0x73, 0x88, 0x01, 0x01, 0x12, 0x41, 0x0a, 0x1a, 0x72, 0x65, 0x74, 0x72, 0x69, 0x65, 0x73, 0x5f, 0x64, 0x65, 0x6c, 0x61, 0x79, 0x5f, 0x6d, 0x69, 0x6c, 0x6c, 0x69, 0x73, 0x65, 0x63, 0x6f, 0x6e, - 0x64, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x48, 0x01, 0x52, 0x18, 0x69, 0x6e, 0x69, 0x74, - 0x69, 0x61, 0x6c, 0x44, 0x65, 0x6c, 0x61, 0x79, 0x4d, 0x69, 0x6c, 0x6c, 0x69, 0x73, 0x65, 0x63, - 0x6f, 0x6e, 0x64, 0x73, 0x88, 0x01, 0x01, 0x12, 0x1d, 0x0a, 0x07, 0x72, 0x65, 0x74, 0x72, 0x69, - 0x65, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x48, 0x02, 0x52, 0x07, 0x72, 0x65, 0x74, 0x72, - 0x69, 0x65, 0x73, 0x88, 0x01, 0x01, 0x12, 0x41, 0x0a, 0x1a, 0x72, 0x65, 0x74, 0x72, 0x69, 0x65, - 0x73, 0x5f, 0x64, 0x65, 0x6c, 0x61, 0x79, 0x5f, 0x6d, 0x69, 0x6c, 0x6c, 0x69, 0x73, 0x65, 0x63, - 0x6f, 0x6e, 0x64, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0d, 0x48, 0x03, 0x52, 0x18, 0x72, 0x65, - 0x74, 0x72, 0x69, 0x65, 0x73, 0x44, 0x65, 0x6c, 0x61, 0x79, 0x4d, 0x69, 0x6c, 0x6c, 0x69, 0x73, - 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x88, 0x01, 0x01, 0x12, 0x20, 0x0a, 0x09, 0x62, 0x6f, 0x64, - 0x79, 0x5f, 0x74, 0x65, 0x78, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x48, 0x04, 0x52, 0x08, - 0x62, 0x6f, 0x64, 0x79, 0x54, 0x65, 0x78, 0x74, 0x88, 0x01, 0x01, 0x42, 0x07, 0x0a, 0x05, 0x5f, - 0x70, 0x61, 0x74, 0x68, 0x42, 0x1d, 0x0a, 0x1b, 0x5f, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, - 0x5f, 0x64, 0x65, 0x6c, 0x61, 0x79, 0x5f, 0x6d, 0x69, 0x6c, 0x6c, 0x69, 0x73, 0x65, 0x63, 0x6f, - 0x6e, 0x64, 0x73, 0x42, 0x0a, 0x0a, 0x08, 0x5f, 0x72, 0x65, 0x74, 0x72, 0x69, 0x65, 0x73, 0x42, - 0x1d, 0x0a, 0x1b, 0x5f, 0x72, 0x65, 0x74, 0x72, 0x69, 0x65, 0x73, 0x5f, 0x64, 0x65, 0x6c, 0x61, - 0x79, 0x5f, 0x6d, 0x69, 0x6c, 0x6c, 0x69, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x42, 0x0c, - 0x0a, 0x0a, 0x5f, 0x62, 0x6f, 0x64, 0x79, 0x5f, 0x74, 0x65, 0x78, 0x74, 0x22, 0xe6, 0x03, 0x0a, - 0x27, 0x57, 0x61, 0x69, 0x74, 0x46, 0x6f, 0x72, 0x48, 0x74, 0x74, 0x70, 0x50, 0x6f, 0x73, 0x74, - 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x69, - 0x6c, 0x69, 0x74, 0x79, 0x41, 0x72, 0x67, 0x73, 0x12, 0x2d, 0x0a, 0x12, 0x73, 0x65, 0x72, 0x76, - 0x69, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x65, - 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x6f, 0x72, 0x74, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x70, 0x6f, 0x72, 0x74, 0x12, 0x17, 0x0a, 0x04, 0x70, - 0x61, 0x74, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x04, 0x70, 0x61, 0x74, - 0x68, 0x88, 0x01, 0x01, 0x12, 0x26, 0x0a, 0x0c, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, - 0x62, 0x6f, 0x64, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x0b, 0x72, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x42, 0x6f, 0x64, 0x79, 0x88, 0x01, 0x01, 0x12, 0x41, 0x0a, 0x1a, - 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x5f, 0x64, 0x65, 0x6c, 0x61, 0x79, 0x5f, 0x6d, 0x69, - 0x6c, 0x6c, 0x69, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, - 0x48, 0x02, 0x52, 0x18, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x44, 0x65, 0x6c, 0x61, 0x79, + 0x64, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0d, 0x48, 0x03, 0x52, 0x18, 0x72, 0x65, 0x74, 0x72, + 0x69, 0x65, 0x73, 0x44, 0x65, 0x6c, 0x61, 0x79, 0x4d, 0x69, 0x6c, 0x6c, 0x69, 0x73, 0x65, 0x63, + 0x6f, 0x6e, 0x64, 0x73, 0x88, 0x01, 0x01, 0x12, 0x20, 0x0a, 0x09, 0x62, 0x6f, 0x64, 0x79, 0x5f, + 0x74, 0x65, 0x78, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x48, 0x04, 0x52, 0x08, 0x62, 0x6f, + 0x64, 0x79, 0x54, 0x65, 0x78, 0x74, 0x88, 0x01, 0x01, 0x42, 0x07, 0x0a, 0x05, 0x5f, 0x70, 0x61, + 0x74, 0x68, 0x42, 0x1d, 0x0a, 0x1b, 0x5f, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x5f, 0x64, + 0x65, 0x6c, 0x61, 0x79, 0x5f, 0x6d, 0x69, 0x6c, 0x6c, 0x69, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, + 0x73, 0x42, 0x0a, 0x0a, 0x08, 0x5f, 0x72, 0x65, 0x74, 0x72, 0x69, 0x65, 0x73, 0x42, 0x1d, 0x0a, + 0x1b, 0x5f, 0x72, 0x65, 0x74, 0x72, 0x69, 0x65, 0x73, 0x5f, 0x64, 0x65, 0x6c, 0x61, 0x79, 0x5f, + 0x6d, 0x69, 0x6c, 0x6c, 0x69, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x42, 0x0c, 0x0a, 0x0a, + 0x5f, 0x62, 0x6f, 0x64, 0x79, 0x5f, 0x74, 0x65, 0x78, 0x74, 0x22, 0xe6, 0x03, 0x0a, 0x27, 0x57, + 0x61, 0x69, 0x74, 0x46, 0x6f, 0x72, 0x48, 0x74, 0x74, 0x70, 0x50, 0x6f, 0x73, 0x74, 0x45, 0x6e, + 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x69, 0x6c, 0x69, + 0x74, 0x79, 0x41, 0x72, 0x67, 0x73, 0x12, 0x2d, 0x0a, 0x12, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, + 0x65, 0x5f, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x11, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, + 0x69, 0x66, 0x69, 0x65, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x0d, 0x52, 0x04, 0x70, 0x6f, 0x72, 0x74, 0x12, 0x17, 0x0a, 0x04, 0x70, 0x61, 0x74, + 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x88, + 0x01, 0x01, 0x12, 0x26, 0x0a, 0x0c, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x62, 0x6f, + 0x64, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x0b, 0x72, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x42, 0x6f, 0x64, 0x79, 0x88, 0x01, 0x01, 0x12, 0x41, 0x0a, 0x1a, 0x69, 0x6e, + 0x69, 0x74, 0x69, 0x61, 0x6c, 0x5f, 0x64, 0x65, 0x6c, 0x61, 0x79, 0x5f, 0x6d, 0x69, 0x6c, 0x6c, + 0x69, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x48, 0x02, + 0x52, 0x18, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x44, 0x65, 0x6c, 0x61, 0x79, 0x4d, 0x69, + 0x6c, 0x6c, 0x69, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x88, 0x01, 0x01, 0x12, 0x1d, 0x0a, + 0x07, 0x72, 0x65, 0x74, 0x72, 0x69, 0x65, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0d, 0x48, 0x03, + 0x52, 0x07, 0x72, 0x65, 0x74, 0x72, 0x69, 0x65, 0x73, 0x88, 0x01, 0x01, 0x12, 0x41, 0x0a, 0x1a, + 0x72, 0x65, 0x74, 0x72, 0x69, 0x65, 0x73, 0x5f, 0x64, 0x65, 0x6c, 0x61, 0x79, 0x5f, 0x6d, 0x69, + 0x6c, 0x6c, 0x69, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0d, + 0x48, 0x04, 0x52, 0x18, 0x72, 0x65, 0x74, 0x72, 0x69, 0x65, 0x73, 0x44, 0x65, 0x6c, 0x61, 0x79, 0x4d, 0x69, 0x6c, 0x6c, 0x69, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x88, 0x01, 0x01, 0x12, - 0x1d, 0x0a, 0x07, 0x72, 0x65, 0x74, 0x72, 0x69, 0x65, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0d, - 0x48, 0x03, 0x52, 0x07, 0x72, 0x65, 0x74, 0x72, 0x69, 0x65, 0x73, 0x88, 0x01, 0x01, 0x12, 0x41, - 0x0a, 0x1a, 0x72, 0x65, 0x74, 0x72, 0x69, 0x65, 0x73, 0x5f, 0x64, 0x65, 0x6c, 0x61, 0x79, 0x5f, - 0x6d, 0x69, 0x6c, 0x6c, 0x69, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x18, 0x07, 0x20, 0x01, - 0x28, 0x0d, 0x48, 0x04, 0x52, 0x18, 0x72, 0x65, 0x74, 0x72, 0x69, 0x65, 0x73, 0x44, 0x65, 0x6c, - 0x61, 0x79, 0x4d, 0x69, 0x6c, 0x6c, 0x69, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x88, 0x01, - 0x01, 0x12, 0x20, 0x0a, 0x09, 0x62, 0x6f, 0x64, 0x79, 0x5f, 0x74, 0x65, 0x78, 0x74, 0x18, 0x08, - 0x20, 0x01, 0x28, 0x09, 0x48, 0x05, 0x52, 0x08, 0x62, 0x6f, 0x64, 0x79, 0x54, 0x65, 0x78, 0x74, - 0x88, 0x01, 0x01, 0x42, 0x07, 0x0a, 0x05, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x42, 0x0f, 0x0a, 0x0d, - 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x62, 0x6f, 0x64, 0x79, 0x42, 0x1d, 0x0a, - 0x1b, 0x5f, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x5f, 0x64, 0x65, 0x6c, 0x61, 0x79, 0x5f, - 0x6d, 0x69, 0x6c, 0x6c, 0x69, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x42, 0x0a, 0x0a, 0x08, - 0x5f, 0x72, 0x65, 0x74, 0x72, 0x69, 0x65, 0x73, 0x42, 0x1d, 0x0a, 0x1b, 0x5f, 0x72, 0x65, 0x74, - 0x72, 0x69, 0x65, 0x73, 0x5f, 0x64, 0x65, 0x6c, 0x61, 0x79, 0x5f, 0x6d, 0x69, 0x6c, 0x6c, 0x69, - 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x42, 0x0c, 0x0a, 0x0a, 0x5f, 0x62, 0x6f, 0x64, 0x79, - 0x5f, 0x74, 0x65, 0x78, 0x74, 0x22, 0x99, 0x01, 0x0a, 0x11, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, - 0x65, 0x64, 0x44, 0x61, 0x74, 0x61, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x12, 0x12, 0x0a, 0x04, 0x64, - 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x12, - 0x2e, 0x0a, 0x13, 0x70, 0x72, 0x65, 0x76, 0x69, 0x6f, 0x75, 0x73, 0x5f, 0x63, 0x68, 0x75, 0x6e, - 0x6b, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x70, 0x72, - 0x65, 0x76, 0x69, 0x6f, 0x75, 0x73, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x48, 0x61, 0x73, 0x68, 0x12, - 0x40, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x24, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, - 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x4d, - 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, - 0x61, 0x22, 0x27, 0x0a, 0x11, 0x44, 0x61, 0x74, 0x61, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x4d, 0x65, - 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x45, 0x0a, 0x1b, 0x55, 0x70, - 0x6c, 0x6f, 0x61, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, - 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x75, 0x75, 0x69, - 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x75, 0x75, 0x69, 0x64, 0x12, 0x12, 0x0a, - 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, - 0x65, 0x22, 0x3b, 0x0a, 0x19, 0x44, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x46, 0x69, 0x6c, - 0x65, 0x73, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x41, 0x72, 0x67, 0x73, 0x12, 0x1e, - 0x0a, 0x0a, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0a, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x22, 0x41, - 0x0a, 0x19, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x57, 0x65, 0x62, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x41, - 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x41, 0x72, 0x67, 0x73, 0x12, 0x10, 0x0a, 0x03, 0x75, - 0x72, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x72, 0x6c, 0x12, 0x12, 0x0a, - 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, - 0x65, 0x22, 0x33, 0x0a, 0x1d, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x57, 0x65, 0x62, 0x46, 0x69, 0x6c, - 0x65, 0x73, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x75, 0x75, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x04, 0x75, 0x75, 0x69, 0x64, 0x22, 0x87, 0x01, 0x0a, 0x21, 0x53, 0x74, 0x6f, 0x72, 0x65, - 0x46, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x46, 0x72, 0x6f, - 0x6d, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x41, 0x72, 0x67, 0x73, 0x12, 0x2d, 0x0a, 0x12, - 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, - 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, - 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x12, 0x1f, 0x0a, 0x0b, 0x73, - 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0a, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x50, 0x61, 0x74, 0x68, 0x12, 0x12, 0x0a, 0x04, - 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, - 0x22, 0x3b, 0x0a, 0x25, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x72, - 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x46, 0x72, 0x6f, 0x6d, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, - 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x75, 0x75, 0x69, - 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x75, 0x75, 0x69, 0x64, 0x22, 0x52, 0x0a, - 0x18, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x4e, 0x61, - 0x6d, 0x65, 0x41, 0x6e, 0x64, 0x55, 0x75, 0x69, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x66, 0x69, 0x6c, - 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x66, 0x69, 0x6c, - 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x55, 0x75, 0x69, - 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x55, 0x75, 0x69, - 0x64, 0x22, 0x86, 0x01, 0x0a, 0x26, 0x4c, 0x69, 0x73, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x41, - 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x41, 0x6e, 0x64, 0x55, - 0x75, 0x69, 0x64, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x5c, 0x0a, 0x14, - 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x5f, 0x61, 0x6e, 0x64, 0x5f, 0x75, - 0x75, 0x69, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x61, 0x70, 0x69, - 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x46, + 0x20, 0x0a, 0x09, 0x62, 0x6f, 0x64, 0x79, 0x5f, 0x74, 0x65, 0x78, 0x74, 0x18, 0x08, 0x20, 0x01, + 0x28, 0x09, 0x48, 0x05, 0x52, 0x08, 0x62, 0x6f, 0x64, 0x79, 0x54, 0x65, 0x78, 0x74, 0x88, 0x01, + 0x01, 0x42, 0x07, 0x0a, 0x05, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x42, 0x0f, 0x0a, 0x0d, 0x5f, 0x72, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x62, 0x6f, 0x64, 0x79, 0x42, 0x1d, 0x0a, 0x1b, 0x5f, + 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x5f, 0x64, 0x65, 0x6c, 0x61, 0x79, 0x5f, 0x6d, 0x69, + 0x6c, 0x6c, 0x69, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x42, 0x0a, 0x0a, 0x08, 0x5f, 0x72, + 0x65, 0x74, 0x72, 0x69, 0x65, 0x73, 0x42, 0x1d, 0x0a, 0x1b, 0x5f, 0x72, 0x65, 0x74, 0x72, 0x69, + 0x65, 0x73, 0x5f, 0x64, 0x65, 0x6c, 0x61, 0x79, 0x5f, 0x6d, 0x69, 0x6c, 0x6c, 0x69, 0x73, 0x65, + 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x42, 0x0c, 0x0a, 0x0a, 0x5f, 0x62, 0x6f, 0x64, 0x79, 0x5f, 0x74, + 0x65, 0x78, 0x74, 0x22, 0x99, 0x01, 0x0a, 0x11, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x65, 0x64, + 0x44, 0x61, 0x74, 0x61, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, + 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x12, 0x2e, 0x0a, + 0x13, 0x70, 0x72, 0x65, 0x76, 0x69, 0x6f, 0x75, 0x73, 0x5f, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x5f, + 0x68, 0x61, 0x73, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x70, 0x72, 0x65, 0x76, + 0x69, 0x6f, 0x75, 0x73, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x48, 0x61, 0x73, 0x68, 0x12, 0x40, 0x0a, + 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x24, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, + 0x61, 0x70, 0x69, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x4d, 0x65, 0x74, + 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x22, + 0x27, 0x0a, 0x11, 0x44, 0x61, 0x74, 0x61, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x4d, 0x65, 0x74, 0x61, + 0x64, 0x61, 0x74, 0x61, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x45, 0x0a, 0x1b, 0x55, 0x70, 0x6c, 0x6f, + 0x61, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x75, 0x75, 0x69, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x75, 0x75, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, + 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, + 0x3b, 0x0a, 0x19, 0x44, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x73, + 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x41, 0x72, 0x67, 0x73, 0x12, 0x1e, 0x0a, 0x0a, + 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0a, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x22, 0x41, 0x0a, 0x19, + 0x53, 0x74, 0x6f, 0x72, 0x65, 0x57, 0x65, 0x62, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x72, 0x74, + 0x69, 0x66, 0x61, 0x63, 0x74, 0x41, 0x72, 0x67, 0x73, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x72, 0x6c, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x72, 0x6c, 0x12, 0x12, 0x0a, 0x04, 0x6e, + 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, + 0x33, 0x0a, 0x1d, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x57, 0x65, 0x62, 0x46, 0x69, 0x6c, 0x65, 0x73, + 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x12, 0x0a, 0x04, 0x75, 0x75, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, + 0x75, 0x75, 0x69, 0x64, 0x22, 0x87, 0x01, 0x0a, 0x21, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x46, 0x69, + 0x6c, 0x65, 0x73, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x46, 0x72, 0x6f, 0x6d, 0x53, + 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x41, 0x72, 0x67, 0x73, 0x12, 0x2d, 0x0a, 0x12, 0x73, 0x65, + 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, + 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x6f, 0x75, + 0x72, 0x63, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, + 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x50, 0x61, 0x74, 0x68, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, + 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3b, + 0x0a, 0x25, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x72, 0x74, 0x69, + 0x66, 0x61, 0x63, 0x74, 0x46, 0x72, 0x6f, 0x6d, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x75, 0x75, 0x69, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x75, 0x75, 0x69, 0x64, 0x22, 0x52, 0x0a, 0x18, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x4e, 0x61, 0x6d, 0x65, - 0x41, 0x6e, 0x64, 0x55, 0x75, 0x69, 0x64, 0x52, 0x11, 0x66, 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, - 0x65, 0x73, 0x41, 0x6e, 0x64, 0x55, 0x75, 0x69, 0x64, 0x73, 0x22, 0x81, 0x01, 0x0a, 0x23, 0x49, - 0x6e, 0x73, 0x70, 0x65, 0x63, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x72, 0x74, 0x69, 0x66, - 0x61, 0x63, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x5a, 0x0a, 0x13, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, - 0x5f, 0x61, 0x6e, 0x64, 0x5f, 0x75, 0x75, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x2b, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, - 0x61, 0x70, 0x69, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, - 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x41, 0x6e, 0x64, 0x55, 0x75, 0x69, 0x64, 0x52, 0x10, 0x66, 0x69, - 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x41, 0x6e, 0x64, 0x55, 0x75, 0x69, 0x64, 0x22, 0x8b, - 0x01, 0x0a, 0x24, 0x49, 0x6e, 0x73, 0x70, 0x65, 0x63, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x41, - 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x63, 0x0a, 0x11, 0x66, 0x69, 0x6c, 0x65, 0x5f, - 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x36, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, - 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x41, 0x72, 0x74, 0x69, 0x66, - 0x61, 0x63, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x46, 0x69, 0x6c, 0x65, 0x44, - 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x10, 0x66, 0x69, 0x6c, 0x65, - 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x86, 0x01, 0x0a, - 0x23, 0x46, 0x69, 0x6c, 0x65, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x43, 0x6f, 0x6e, - 0x74, 0x65, 0x6e, 0x74, 0x73, 0x46, 0x69, 0x6c, 0x65, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, - 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x69, 0x7a, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x12, 0x26, 0x0a, 0x0c, - 0x74, 0x65, 0x78, 0x74, 0x5f, 0x70, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x09, 0x48, 0x00, 0x52, 0x0b, 0x74, 0x65, 0x78, 0x74, 0x50, 0x72, 0x65, 0x76, 0x69, 0x65, - 0x77, 0x88, 0x01, 0x01, 0x42, 0x0f, 0x0a, 0x0d, 0x5f, 0x74, 0x65, 0x78, 0x74, 0x5f, 0x70, 0x72, - 0x65, 0x76, 0x69, 0x65, 0x77, 0x22, 0x4b, 0x0a, 0x13, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, - 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x41, 0x72, 0x67, 0x73, 0x12, 0x34, 0x0a, 0x07, - 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1a, 0x2e, + 0x41, 0x6e, 0x64, 0x55, 0x75, 0x69, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x4e, + 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x4e, + 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x55, 0x75, 0x69, 0x64, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x55, 0x75, 0x69, 0x64, 0x22, + 0x86, 0x01, 0x0a, 0x26, 0x4c, 0x69, 0x73, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x72, 0x74, + 0x69, 0x66, 0x61, 0x63, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x41, 0x6e, 0x64, 0x55, 0x75, 0x69, + 0x64, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x5c, 0x0a, 0x14, 0x66, 0x69, + 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x5f, 0x61, 0x6e, 0x64, 0x5f, 0x75, 0x75, 0x69, + 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, + 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x46, 0x69, 0x6c, + 0x65, 0x73, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x41, 0x6e, + 0x64, 0x55, 0x75, 0x69, 0x64, 0x52, 0x11, 0x66, 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x73, + 0x41, 0x6e, 0x64, 0x55, 0x75, 0x69, 0x64, 0x73, 0x22, 0x81, 0x01, 0x0a, 0x23, 0x49, 0x6e, 0x73, + 0x70, 0x65, 0x63, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, + 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x5a, 0x0a, 0x13, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x5f, 0x61, + 0x6e, 0x64, 0x5f, 0x75, 0x75, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, - 0x69, 0x2e, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x6e, 0x65, - 0x63, 0x74, 0x22, 0x19, 0x0a, 0x17, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x53, 0x65, 0x72, - 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xa2, 0x04, - 0x0a, 0x16, 0x47, 0x65, 0x74, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x52, 0x75, 0x6e, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x61, 0x63, 0x6b, - 0x61, 0x67, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x70, 0x61, - 0x63, 0x6b, 0x61, 0x67, 0x65, 0x49, 0x64, 0x12, 0x2b, 0x0a, 0x11, 0x73, 0x65, 0x72, 0x69, 0x61, - 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x5f, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x10, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x53, 0x63, - 0x72, 0x69, 0x70, 0x74, 0x12, 0x2b, 0x0a, 0x11, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, - 0x65, 0x64, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x10, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x50, 0x61, 0x72, 0x61, 0x6d, - 0x73, 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x61, 0x72, 0x61, 0x6c, 0x6c, 0x65, 0x6c, 0x69, 0x73, 0x6d, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0b, 0x70, 0x61, 0x72, 0x61, 0x6c, 0x6c, 0x65, 0x6c, - 0x69, 0x73, 0x6d, 0x12, 0x3a, 0x0a, 0x1a, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x76, 0x65, 0x5f, - 0x70, 0x61, 0x74, 0x68, 0x5f, 0x74, 0x6f, 0x5f, 0x6d, 0x61, 0x69, 0x6e, 0x5f, 0x66, 0x69, 0x6c, - 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x16, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x76, - 0x65, 0x50, 0x61, 0x74, 0x68, 0x54, 0x6f, 0x4d, 0x61, 0x69, 0x6e, 0x46, 0x69, 0x6c, 0x65, 0x12, - 0x2c, 0x0a, 0x12, 0x6d, 0x61, 0x69, 0x6e, 0x5f, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x6d, 0x61, 0x69, - 0x6e, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x5b, 0x0a, - 0x15, 0x65, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x5f, 0x66, 0x65, - 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x26, 0x2e, 0x61, - 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, - 0x2e, 0x4b, 0x75, 0x72, 0x74, 0x6f, 0x73, 0x69, 0x73, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, - 0x46, 0x6c, 0x61, 0x67, 0x52, 0x14, 0x65, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, - 0x61, 0x6c, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x12, 0x47, 0x0a, 0x0e, 0x72, 0x65, - 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x18, 0x08, 0x20, 0x01, - 0x28, 0x0e, 0x32, 0x20, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, - 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x65, 0x73, 0x74, 0x61, 0x72, 0x74, 0x50, 0x6f, - 0x6c, 0x69, 0x63, 0x79, 0x52, 0x0d, 0x72, 0x65, 0x73, 0x74, 0x61, 0x72, 0x74, 0x50, 0x6f, 0x6c, - 0x69, 0x63, 0x79, 0x12, 0x3f, 0x0a, 0x19, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x5f, 0x73, + 0x69, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x4e, + 0x61, 0x6d, 0x65, 0x41, 0x6e, 0x64, 0x55, 0x75, 0x69, 0x64, 0x52, 0x10, 0x66, 0x69, 0x6c, 0x65, + 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x41, 0x6e, 0x64, 0x55, 0x75, 0x69, 0x64, 0x22, 0x8b, 0x01, 0x0a, + 0x24, 0x49, 0x6e, 0x73, 0x70, 0x65, 0x63, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x72, 0x74, + 0x69, 0x66, 0x61, 0x63, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x63, 0x0a, 0x11, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x36, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, + 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, + 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x46, 0x69, 0x6c, 0x65, 0x44, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x10, 0x66, 0x69, 0x6c, 0x65, 0x44, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x86, 0x01, 0x0a, 0x23, 0x46, + 0x69, 0x6c, 0x65, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x65, + 0x6e, 0x74, 0x73, 0x46, 0x69, 0x6c, 0x65, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x04, 0x52, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x12, 0x26, 0x0a, 0x0c, 0x74, 0x65, + 0x78, 0x74, 0x5f, 0x70, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, + 0x48, 0x00, 0x52, 0x0b, 0x74, 0x65, 0x78, 0x74, 0x50, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x88, + 0x01, 0x01, 0x42, 0x0f, 0x0a, 0x0d, 0x5f, 0x74, 0x65, 0x78, 0x74, 0x5f, 0x70, 0x72, 0x65, 0x76, + 0x69, 0x65, 0x77, 0x22, 0x4b, 0x0a, 0x13, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x53, 0x65, + 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x41, 0x72, 0x67, 0x73, 0x12, 0x34, 0x0a, 0x07, 0x63, 0x6f, + 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1a, 0x2e, 0x61, 0x70, + 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, + 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, + 0x22, 0x19, 0x0a, 0x17, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, + 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xa2, 0x04, 0x0a, 0x16, + 0x47, 0x65, 0x74, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x52, 0x75, 0x6e, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, + 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x70, 0x61, 0x63, 0x6b, + 0x61, 0x67, 0x65, 0x49, 0x64, 0x12, 0x2b, 0x0a, 0x11, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, + 0x7a, 0x65, 0x64, 0x5f, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x10, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x53, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x12, 0x2b, 0x0a, 0x11, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, + 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x73, + 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, + 0x20, 0x0a, 0x0b, 0x70, 0x61, 0x72, 0x61, 0x6c, 0x6c, 0x65, 0x6c, 0x69, 0x73, 0x6d, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x05, 0x52, 0x0b, 0x70, 0x61, 0x72, 0x61, 0x6c, 0x6c, 0x65, 0x6c, 0x69, 0x73, + 0x6d, 0x12, 0x3a, 0x0a, 0x1a, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x70, 0x61, + 0x74, 0x68, 0x5f, 0x74, 0x6f, 0x5f, 0x6d, 0x61, 0x69, 0x6e, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x18, + 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x16, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x76, 0x65, 0x50, + 0x61, 0x74, 0x68, 0x54, 0x6f, 0x4d, 0x61, 0x69, 0x6e, 0x46, 0x69, 0x6c, 0x65, 0x12, 0x2c, 0x0a, + 0x12, 0x6d, 0x61, 0x69, 0x6e, 0x5f, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, + 0x61, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x6d, 0x61, 0x69, 0x6e, 0x46, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x5b, 0x0a, 0x15, 0x65, + 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x5f, 0x66, 0x65, 0x61, 0x74, + 0x75, 0x72, 0x65, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x26, 0x2e, 0x61, 0x70, 0x69, + 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x4b, + 0x75, 0x72, 0x74, 0x6f, 0x73, 0x69, 0x73, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x46, 0x6c, + 0x61, 0x67, 0x52, 0x14, 0x65, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x6c, + 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x12, 0x47, 0x0a, 0x0e, 0x72, 0x65, 0x73, 0x74, + 0x61, 0x72, 0x74, 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0e, + 0x32, 0x20, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, + 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x65, 0x73, 0x74, 0x61, 0x72, 0x74, 0x50, 0x6f, 0x6c, 0x69, + 0x63, 0x79, 0x52, 0x0d, 0x72, 0x65, 0x73, 0x74, 0x61, 0x72, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, + 0x79, 0x12, 0x3f, 0x0a, 0x19, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x5f, 0x73, 0x65, 0x72, + 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x09, + 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x17, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x53, + 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x88, + 0x01, 0x01, 0x42, 0x1c, 0x0a, 0x1a, 0x5f, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x5f, 0x73, + 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, + 0x22, 0x27, 0x0a, 0x08, 0x50, 0x6c, 0x61, 0x6e, 0x59, 0x61, 0x6d, 0x6c, 0x12, 0x1b, 0x0a, 0x09, + 0x70, 0x6c, 0x61, 0x6e, 0x5f, 0x79, 0x61, 0x6d, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x08, 0x70, 0x6c, 0x61, 0x6e, 0x59, 0x61, 0x6d, 0x6c, 0x22, 0xdb, 0x01, 0x0a, 0x1a, 0x53, 0x74, + 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, 0x50, 0x6c, 0x61, 0x6e, + 0x59, 0x61, 0x6d, 0x6c, 0x41, 0x72, 0x67, 0x73, 0x12, 0x2b, 0x0a, 0x11, 0x73, 0x65, 0x72, 0x69, + 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x5f, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x10, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x53, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x12, 0x30, 0x0a, 0x11, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, + 0x7a, 0x65, 0x64, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x48, 0x00, 0x52, 0x10, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x50, 0x61, + 0x72, 0x61, 0x6d, 0x73, 0x88, 0x01, 0x01, 0x12, 0x31, 0x0a, 0x12, 0x6d, 0x61, 0x69, 0x6e, 0x5f, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x10, 0x6d, 0x61, 0x69, 0x6e, 0x46, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x88, 0x01, 0x01, 0x42, 0x14, 0x0a, 0x12, 0x5f, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, - 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x17, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, - 0x6c, 0x53, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x50, 0x61, 0x72, 0x61, 0x6d, - 0x73, 0x88, 0x01, 0x01, 0x42, 0x1c, 0x0a, 0x1a, 0x5f, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, - 0x5f, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x5f, 0x70, 0x61, 0x72, 0x61, - 0x6d, 0x73, 0x22, 0x27, 0x0a, 0x08, 0x50, 0x6c, 0x61, 0x6e, 0x59, 0x61, 0x6d, 0x6c, 0x12, 0x1b, - 0x0a, 0x09, 0x70, 0x6c, 0x61, 0x6e, 0x5f, 0x79, 0x61, 0x6d, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x08, 0x70, 0x6c, 0x61, 0x6e, 0x59, 0x61, 0x6d, 0x6c, 0x22, 0xdb, 0x01, 0x0a, 0x1a, - 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, 0x50, 0x6c, - 0x61, 0x6e, 0x59, 0x61, 0x6d, 0x6c, 0x41, 0x72, 0x67, 0x73, 0x12, 0x2b, 0x0a, 0x11, 0x73, 0x65, - 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x5f, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, - 0x64, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, 0x12, 0x30, 0x0a, 0x11, 0x73, 0x65, 0x72, 0x69, 0x61, - 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x48, 0x00, 0x52, 0x10, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, - 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x88, 0x01, 0x01, 0x12, 0x31, 0x0a, 0x12, 0x6d, 0x61, 0x69, - 0x6e, 0x5f, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, - 0x05, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x10, 0x6d, 0x61, 0x69, 0x6e, 0x46, 0x75, 0x6e, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x88, 0x01, 0x01, 0x42, 0x14, 0x0a, 0x12, - 0x5f, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x5f, 0x70, 0x61, 0x72, 0x61, - 0x6d, 0x73, 0x42, 0x15, 0x0a, 0x13, 0x5f, 0x6d, 0x61, 0x69, 0x6e, 0x5f, 0x66, 0x75, 0x6e, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0xcb, 0x02, 0x0a, 0x1b, 0x53, 0x74, - 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x50, 0x6c, 0x61, - 0x6e, 0x59, 0x61, 0x6d, 0x6c, 0x41, 0x72, 0x67, 0x73, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x61, 0x63, - 0x6b, 0x61, 0x67, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x70, - 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x49, 0x64, 0x12, 0x30, 0x0a, 0x11, 0x73, 0x65, 0x72, 0x69, - 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x10, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, - 0x64, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x88, 0x01, 0x01, 0x12, 0x1b, 0x0a, 0x09, 0x69, 0x73, - 0x5f, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x69, - 0x73, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x12, 0x3f, 0x0a, 0x1a, 0x72, 0x65, 0x6c, 0x61, 0x74, - 0x69, 0x76, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x5f, 0x74, 0x6f, 0x5f, 0x6d, 0x61, 0x69, 0x6e, - 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x16, 0x72, - 0x65, 0x6c, 0x61, 0x74, 0x69, 0x76, 0x65, 0x50, 0x61, 0x74, 0x68, 0x54, 0x6f, 0x4d, 0x61, 0x69, - 0x6e, 0x46, 0x69, 0x6c, 0x65, 0x88, 0x01, 0x01, 0x12, 0x31, 0x0a, 0x12, 0x6d, 0x61, 0x69, 0x6e, - 0x5f, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, - 0x20, 0x01, 0x28, 0x09, 0x48, 0x02, 0x52, 0x10, 0x6d, 0x61, 0x69, 0x6e, 0x46, 0x75, 0x6e, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x88, 0x01, 0x01, 0x42, 0x14, 0x0a, 0x12, 0x5f, - 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, - 0x73, 0x42, 0x1d, 0x0a, 0x1b, 0x5f, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x70, - 0x61, 0x74, 0x68, 0x5f, 0x74, 0x6f, 0x5f, 0x6d, 0x61, 0x69, 0x6e, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x42, 0x15, 0x0a, 0x13, 0x5f, 0x6d, 0x61, 0x69, 0x6e, 0x5f, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x2a, 0x36, 0x0a, 0x0d, 0x53, 0x65, 0x72, 0x76, 0x69, - 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x0b, 0x0a, 0x07, 0x53, 0x54, 0x4f, 0x50, - 0x50, 0x45, 0x44, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x52, 0x55, 0x4e, 0x4e, 0x49, 0x4e, 0x47, - 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x02, 0x2a, - 0x2c, 0x0a, 0x11, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x44, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, - 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x0a, 0x0a, 0x06, 0x61, 0x6c, 0x77, 0x61, 0x79, 0x73, 0x10, 0x00, - 0x12, 0x0b, 0x0a, 0x07, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x10, 0x01, 0x2a, 0x26, 0x0a, - 0x07, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x12, 0x0b, 0x0a, 0x07, 0x43, 0x4f, 0x4e, 0x4e, - 0x45, 0x43, 0x54, 0x10, 0x00, 0x12, 0x0e, 0x0a, 0x0a, 0x4e, 0x4f, 0x5f, 0x43, 0x4f, 0x4e, 0x4e, - 0x45, 0x43, 0x54, 0x10, 0x01, 0x2a, 0x32, 0x0a, 0x13, 0x4b, 0x75, 0x72, 0x74, 0x6f, 0x73, 0x69, - 0x73, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x46, 0x6c, 0x61, 0x67, 0x12, 0x1b, 0x0a, 0x17, - 0x4e, 0x4f, 0x5f, 0x49, 0x4e, 0x53, 0x54, 0x52, 0x55, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x53, 0x5f, - 0x43, 0x41, 0x43, 0x48, 0x49, 0x4e, 0x47, 0x10, 0x00, 0x2a, 0x26, 0x0a, 0x0d, 0x52, 0x65, 0x73, - 0x74, 0x61, 0x72, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x09, 0x0a, 0x05, 0x4e, 0x45, - 0x56, 0x45, 0x52, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x41, 0x4c, 0x57, 0x41, 0x59, 0x53, 0x10, - 0x01, 0x32, 0xa6, 0x10, 0x0a, 0x13, 0x41, 0x70, 0x69, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, - 0x65, 0x72, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x6d, 0x0a, 0x11, 0x52, 0x75, 0x6e, - 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, 0x12, 0x28, + 0x6f, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0xcb, 0x02, 0x0a, 0x1b, 0x53, 0x74, 0x61, 0x72, + 0x6c, 0x61, 0x72, 0x6b, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x50, 0x6c, 0x61, 0x6e, 0x59, + 0x61, 0x6d, 0x6c, 0x41, 0x72, 0x67, 0x73, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x61, 0x63, 0x6b, 0x61, + 0x67, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x70, 0x61, 0x63, + 0x6b, 0x61, 0x67, 0x65, 0x49, 0x64, 0x12, 0x30, 0x0a, 0x11, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, + 0x69, 0x7a, 0x65, 0x64, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x48, 0x00, 0x52, 0x10, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x50, + 0x61, 0x72, 0x61, 0x6d, 0x73, 0x88, 0x01, 0x01, 0x12, 0x1b, 0x0a, 0x09, 0x69, 0x73, 0x5f, 0x72, + 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x69, 0x73, 0x52, + 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x12, 0x3f, 0x0a, 0x1a, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x76, + 0x65, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x5f, 0x74, 0x6f, 0x5f, 0x6d, 0x61, 0x69, 0x6e, 0x5f, 0x66, + 0x69, 0x6c, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x16, 0x72, 0x65, 0x6c, + 0x61, 0x74, 0x69, 0x76, 0x65, 0x50, 0x61, 0x74, 0x68, 0x54, 0x6f, 0x4d, 0x61, 0x69, 0x6e, 0x46, + 0x69, 0x6c, 0x65, 0x88, 0x01, 0x01, 0x12, 0x31, 0x0a, 0x12, 0x6d, 0x61, 0x69, 0x6e, 0x5f, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x09, 0x48, 0x02, 0x52, 0x10, 0x6d, 0x61, 0x69, 0x6e, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x88, 0x01, 0x01, 0x42, 0x14, 0x0a, 0x12, 0x5f, 0x73, 0x65, + 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x42, + 0x1d, 0x0a, 0x1b, 0x5f, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x70, 0x61, 0x74, + 0x68, 0x5f, 0x74, 0x6f, 0x5f, 0x6d, 0x61, 0x69, 0x6e, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x42, 0x15, + 0x0a, 0x13, 0x5f, 0x6d, 0x61, 0x69, 0x6e, 0x5f, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x2a, 0x36, 0x0a, 0x0d, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, + 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x0b, 0x0a, 0x07, 0x53, 0x54, 0x4f, 0x50, 0x50, 0x45, + 0x44, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x52, 0x55, 0x4e, 0x4e, 0x49, 0x4e, 0x47, 0x10, 0x01, + 0x12, 0x0b, 0x0a, 0x07, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x02, 0x2a, 0x2c, 0x0a, + 0x11, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x44, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x4d, 0x6f, + 0x64, 0x65, 0x12, 0x0a, 0x0a, 0x06, 0x61, 0x6c, 0x77, 0x61, 0x79, 0x73, 0x10, 0x00, 0x12, 0x0b, + 0x0a, 0x07, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x10, 0x01, 0x2a, 0x26, 0x0a, 0x07, 0x43, + 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x12, 0x0b, 0x0a, 0x07, 0x43, 0x4f, 0x4e, 0x4e, 0x45, 0x43, + 0x54, 0x10, 0x00, 0x12, 0x0e, 0x0a, 0x0a, 0x4e, 0x4f, 0x5f, 0x43, 0x4f, 0x4e, 0x4e, 0x45, 0x43, + 0x54, 0x10, 0x01, 0x2a, 0x32, 0x0a, 0x13, 0x4b, 0x75, 0x72, 0x74, 0x6f, 0x73, 0x69, 0x73, 0x46, + 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x46, 0x6c, 0x61, 0x67, 0x12, 0x1b, 0x0a, 0x17, 0x4e, 0x4f, + 0x5f, 0x49, 0x4e, 0x53, 0x54, 0x52, 0x55, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x53, 0x5f, 0x43, 0x41, + 0x43, 0x48, 0x49, 0x4e, 0x47, 0x10, 0x00, 0x2a, 0x26, 0x0a, 0x0d, 0x52, 0x65, 0x73, 0x74, 0x61, + 0x72, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x09, 0x0a, 0x05, 0x4e, 0x45, 0x56, 0x45, + 0x52, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x41, 0x4c, 0x57, 0x41, 0x59, 0x53, 0x10, 0x01, 0x32, + 0xa6, 0x10, 0x0a, 0x13, 0x41, 0x70, 0x69, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, + 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x6d, 0x0a, 0x11, 0x52, 0x75, 0x6e, 0x53, 0x74, + 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, 0x12, 0x28, 0x2e, 0x61, + 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, + 0x2e, 0x52, 0x75, 0x6e, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x53, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x41, 0x72, 0x67, 0x73, 0x1a, 0x2a, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, + 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x6c, + 0x61, 0x72, 0x6b, 0x52, 0x75, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x4c, 0x69, + 0x6e, 0x65, 0x22, 0x00, 0x30, 0x01, 0x12, 0x59, 0x0a, 0x15, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, + 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x12, + 0x24, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, + 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x65, 0x64, 0x44, 0x61, 0x74, 0x61, + 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x28, + 0x01, 0x12, 0x6f, 0x0a, 0x12, 0x52, 0x75, 0x6e, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, + 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x12, 0x29, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, + 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x75, 0x6e, 0x53, + 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x41, 0x72, + 0x67, 0x73, 0x1a, 0x2a, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, + 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x52, + 0x75, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x4c, 0x69, 0x6e, 0x65, 0x22, 0x00, + 0x30, 0x01, 0x12, 0x5b, 0x0a, 0x0b, 0x47, 0x65, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, + 0x73, 0x12, 0x22, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, + 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, + 0x73, 0x41, 0x72, 0x67, 0x73, 0x1a, 0x26, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, + 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x65, 0x72, + 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, + 0x8d, 0x01, 0x0a, 0x2a, 0x47, 0x65, 0x74, 0x45, 0x78, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x41, + 0x6e, 0x64, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x69, 0x63, 0x61, 0x6c, 0x53, 0x65, 0x72, 0x76, + 0x69, 0x63, 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x73, 0x12, 0x16, + 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, + 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x45, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, + 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x78, + 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x41, 0x6e, 0x64, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x69, + 0x63, 0x61, 0x6c, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, + 0x66, 0x69, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, + 0x5b, 0x0a, 0x0b, 0x45, 0x78, 0x65, 0x63, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x22, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, - 0x70, 0x69, 0x2e, 0x52, 0x75, 0x6e, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x53, 0x63, - 0x72, 0x69, 0x70, 0x74, 0x41, 0x72, 0x67, 0x73, 0x1a, 0x2a, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, - 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, 0x61, - 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x52, 0x75, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x4c, 0x69, 0x6e, 0x65, 0x22, 0x00, 0x30, 0x01, 0x12, 0x59, 0x0a, 0x15, 0x55, 0x70, 0x6c, 0x6f, - 0x61, 0x64, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, - 0x65, 0x12, 0x24, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, - 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x65, 0x64, 0x44, 0x61, - 0x74, 0x61, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, - 0x00, 0x28, 0x01, 0x12, 0x6f, 0x0a, 0x12, 0x52, 0x75, 0x6e, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, - 0x72, 0x6b, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x12, 0x29, 0x2e, 0x61, 0x70, 0x69, 0x5f, - 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x75, - 0x6e, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, - 0x41, 0x72, 0x67, 0x73, 0x1a, 0x2a, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, - 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, - 0x6b, 0x52, 0x75, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x4c, 0x69, 0x6e, 0x65, - 0x22, 0x00, 0x30, 0x01, 0x12, 0x5b, 0x0a, 0x0b, 0x47, 0x65, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, - 0x63, 0x65, 0x73, 0x12, 0x22, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, - 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, - 0x63, 0x65, 0x73, 0x41, 0x72, 0x67, 0x73, 0x1a, 0x26, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, - 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x53, - 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x00, 0x12, 0x8d, 0x01, 0x0a, 0x2a, 0x47, 0x65, 0x74, 0x45, 0x78, 0x69, 0x73, 0x74, 0x69, 0x6e, - 0x67, 0x41, 0x6e, 0x64, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x69, 0x63, 0x61, 0x6c, 0x53, 0x65, - 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x73, - 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, - 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x45, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, - 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, - 0x45, 0x78, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x41, 0x6e, 0x64, 0x48, 0x69, 0x73, 0x74, 0x6f, - 0x72, 0x69, 0x63, 0x61, 0x6c, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x65, 0x6e, - 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x00, 0x12, 0x5b, 0x0a, 0x0b, 0x45, 0x78, 0x65, 0x63, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, - 0x12, 0x22, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, - 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, - 0x41, 0x72, 0x67, 0x73, 0x1a, 0x26, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, - 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x43, 0x6f, 0x6d, - 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x79, - 0x0a, 0x22, 0x57, 0x61, 0x69, 0x74, 0x46, 0x6f, 0x72, 0x48, 0x74, 0x74, 0x70, 0x47, 0x65, 0x74, - 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x69, - 0x6c, 0x69, 0x74, 0x79, 0x12, 0x39, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, - 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x57, 0x61, 0x69, 0x74, 0x46, 0x6f, 0x72, - 0x48, 0x74, 0x74, 0x70, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x41, - 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x41, 0x72, 0x67, 0x73, 0x1a, - 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, - 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x7b, 0x0a, 0x23, 0x57, 0x61, 0x69, - 0x74, 0x46, 0x6f, 0x72, 0x48, 0x74, 0x74, 0x70, 0x50, 0x6f, 0x73, 0x74, 0x45, 0x6e, 0x64, 0x70, - 0x6f, 0x69, 0x6e, 0x74, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, - 0x12, 0x3a, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, - 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x57, 0x61, 0x69, 0x74, 0x46, 0x6f, 0x72, 0x48, 0x74, 0x74, 0x70, - 0x50, 0x6f, 0x73, 0x74, 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x41, 0x76, 0x61, 0x69, - 0x6c, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x41, 0x72, 0x67, 0x73, 0x1a, 0x16, 0x2e, 0x67, - 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, - 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x6f, 0x0a, 0x13, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, - 0x46, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x12, 0x24, 0x2e, - 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, - 0x69, 0x2e, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x65, 0x64, 0x44, 0x61, 0x74, 0x61, 0x43, 0x68, - 0x75, 0x6e, 0x6b, 0x1a, 0x2e, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, - 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x46, 0x69, - 0x6c, 0x65, 0x73, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x00, 0x28, 0x01, 0x12, 0x6f, 0x0a, 0x15, 0x44, 0x6f, 0x77, 0x6e, 0x6c, - 0x6f, 0x61, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, - 0x12, 0x2c, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, - 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x44, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x46, 0x69, 0x6c, - 0x65, 0x73, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x41, 0x72, 0x67, 0x73, 0x1a, 0x24, + 0x70, 0x69, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x41, 0x72, + 0x67, 0x73, 0x1a, 0x26, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, + 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x43, 0x6f, 0x6d, 0x6d, 0x61, + 0x6e, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x79, 0x0a, 0x22, + 0x57, 0x61, 0x69, 0x74, 0x46, 0x6f, 0x72, 0x48, 0x74, 0x74, 0x70, 0x47, 0x65, 0x74, 0x45, 0x6e, + 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x69, 0x6c, 0x69, + 0x74, 0x79, 0x12, 0x39, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, + 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x57, 0x61, 0x69, 0x74, 0x46, 0x6f, 0x72, 0x48, 0x74, + 0x74, 0x70, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x41, 0x76, 0x61, + 0x69, 0x6c, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x41, 0x72, 0x67, 0x73, 0x1a, 0x16, 0x2e, + 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, + 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x7b, 0x0a, 0x23, 0x57, 0x61, 0x69, 0x74, 0x46, + 0x6f, 0x72, 0x48, 0x74, 0x74, 0x70, 0x50, 0x6f, 0x73, 0x74, 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, + 0x6e, 0x74, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x12, 0x3a, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, - 0x70, 0x69, 0x2e, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x65, 0x64, 0x44, 0x61, 0x74, 0x61, 0x43, - 0x68, 0x75, 0x6e, 0x6b, 0x22, 0x00, 0x30, 0x01, 0x12, 0x79, 0x0a, 0x15, 0x53, 0x74, 0x6f, 0x72, - 0x65, 0x57, 0x65, 0x62, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, - 0x74, 0x12, 0x2c, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, - 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x57, 0x65, 0x62, 0x46, 0x69, - 0x6c, 0x65, 0x73, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x41, 0x72, 0x67, 0x73, 0x1a, - 0x30, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, - 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x57, 0x65, 0x62, 0x46, 0x69, 0x6c, 0x65, + 0x70, 0x69, 0x2e, 0x57, 0x61, 0x69, 0x74, 0x46, 0x6f, 0x72, 0x48, 0x74, 0x74, 0x70, 0x50, 0x6f, + 0x73, 0x74, 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, + 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x41, 0x72, 0x67, 0x73, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, + 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, + 0x74, 0x79, 0x22, 0x00, 0x12, 0x6f, 0x0a, 0x13, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x46, 0x69, + 0x6c, 0x65, 0x73, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x12, 0x24, 0x2e, 0x61, 0x70, + 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, + 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x65, 0x64, 0x44, 0x61, 0x74, 0x61, 0x43, 0x68, 0x75, 0x6e, + 0x6b, 0x1a, 0x2e, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, + 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x00, 0x12, 0x91, 0x01, 0x0a, 0x1d, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x46, 0x69, 0x6c, + 0x65, 0x22, 0x00, 0x28, 0x01, 0x12, 0x6f, 0x0a, 0x15, 0x44, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, + 0x64, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x12, 0x2c, + 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, + 0x70, 0x69, 0x2e, 0x44, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x73, + 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x41, 0x72, 0x67, 0x73, 0x1a, 0x24, 0x2e, 0x61, + 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, + 0x2e, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x65, 0x64, 0x44, 0x61, 0x74, 0x61, 0x43, 0x68, 0x75, + 0x6e, 0x6b, 0x22, 0x00, 0x30, 0x01, 0x12, 0x79, 0x0a, 0x15, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x57, + 0x65, 0x62, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x12, + 0x2c, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, + 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x57, 0x65, 0x62, 0x46, 0x69, 0x6c, 0x65, + 0x73, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x41, 0x72, 0x67, 0x73, 0x1a, 0x30, 0x2e, + 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, + 0x69, 0x2e, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x57, 0x65, 0x62, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x41, + 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x00, 0x12, 0x91, 0x01, 0x0a, 0x1d, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x46, 0x69, 0x6c, 0x65, 0x73, + 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x46, 0x72, 0x6f, 0x6d, 0x53, 0x65, 0x72, 0x76, + 0x69, 0x63, 0x65, 0x12, 0x34, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, + 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x46, 0x72, 0x6f, 0x6d, 0x53, 0x65, - 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x34, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, - 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x46, - 0x69, 0x6c, 0x65, 0x73, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x46, 0x72, 0x6f, 0x6d, - 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x41, 0x72, 0x67, 0x73, 0x1a, 0x38, 0x2e, 0x61, 0x70, - 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, - 0x53, 0x74, 0x6f, 0x72, 0x65, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, - 0x63, 0x74, 0x46, 0x72, 0x6f, 0x6d, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x75, 0x0a, 0x1e, 0x4c, 0x69, 0x73, 0x74, 0x46, - 0x69, 0x6c, 0x65, 0x73, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x4e, 0x61, 0x6d, 0x65, - 0x73, 0x41, 0x6e, 0x64, 0x55, 0x75, 0x69, 0x64, 0x73, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, - 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, - 0x79, 0x1a, 0x39, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, - 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x41, - 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x41, 0x6e, 0x64, 0x55, - 0x75, 0x69, 0x64, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x91, - 0x01, 0x0a, 0x1c, 0x49, 0x6e, 0x73, 0x70, 0x65, 0x63, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x41, - 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x12, - 0x36, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, - 0x61, 0x70, 0x69, 0x2e, 0x49, 0x6e, 0x73, 0x70, 0x65, 0x63, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x73, - 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x37, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, - 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x49, 0x6e, 0x73, 0x70, - 0x65, 0x63, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, - 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x00, 0x12, 0x67, 0x0a, 0x0f, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x53, 0x65, 0x72, - 0x76, 0x69, 0x63, 0x65, 0x73, 0x12, 0x26, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, - 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, - 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x41, 0x72, 0x67, 0x73, 0x1a, 0x2a, 0x2e, + 0x72, 0x76, 0x69, 0x63, 0x65, 0x41, 0x72, 0x67, 0x73, 0x1a, 0x38, 0x2e, 0x61, 0x70, 0x69, 0x5f, + 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, + 0x6f, 0x72, 0x65, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, + 0x46, 0x72, 0x6f, 0x6d, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x75, 0x0a, 0x1e, 0x4c, 0x69, 0x73, 0x74, 0x46, 0x69, 0x6c, + 0x65, 0x73, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x41, + 0x6e, 0x64, 0x55, 0x75, 0x69, 0x64, 0x73, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, + 0x39, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, + 0x61, 0x70, 0x69, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x72, 0x74, + 0x69, 0x66, 0x61, 0x63, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x41, 0x6e, 0x64, 0x55, 0x75, 0x69, + 0x64, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x91, 0x01, 0x0a, + 0x1c, 0x49, 0x6e, 0x73, 0x70, 0x65, 0x63, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x72, 0x74, + 0x69, 0x66, 0x61, 0x63, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x36, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, - 0x69, 0x2e, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, - 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x55, 0x0a, 0x0e, 0x47, - 0x65, 0x74, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x52, 0x75, 0x6e, 0x12, 0x16, 0x2e, - 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, - 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x29, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, - 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x74, 0x61, - 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x52, 0x75, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x00, 0x12, 0x69, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, - 0x6b, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, 0x50, 0x6c, 0x61, 0x6e, 0x59, 0x61, 0x6d, 0x6c, 0x12, - 0x2d, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, - 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x53, 0x63, 0x72, 0x69, - 0x70, 0x74, 0x50, 0x6c, 0x61, 0x6e, 0x59, 0x61, 0x6d, 0x6c, 0x41, 0x72, 0x67, 0x73, 0x1a, 0x1b, - 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, - 0x70, 0x69, 0x2e, 0x50, 0x6c, 0x61, 0x6e, 0x59, 0x61, 0x6d, 0x6c, 0x22, 0x00, 0x12, 0x6b, 0x0a, - 0x1a, 0x47, 0x65, 0x74, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x50, 0x61, 0x63, 0x6b, - 0x61, 0x67, 0x65, 0x50, 0x6c, 0x61, 0x6e, 0x59, 0x61, 0x6d, 0x6c, 0x12, 0x2e, 0x2e, 0x61, 0x70, - 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, - 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x50, - 0x6c, 0x61, 0x6e, 0x59, 0x61, 0x6d, 0x6c, 0x41, 0x72, 0x67, 0x73, 0x1a, 0x1b, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x49, 0x6e, 0x73, 0x70, 0x65, 0x63, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x72, + 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x37, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, + 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x49, 0x6e, 0x73, 0x70, 0x65, 0x63, + 0x74, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x43, 0x6f, + 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, + 0x12, 0x67, 0x0a, 0x0f, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, + 0x63, 0x65, 0x73, 0x12, 0x26, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, + 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x53, + 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x41, 0x72, 0x67, 0x73, 0x1a, 0x2a, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, - 0x50, 0x6c, 0x61, 0x6e, 0x59, 0x61, 0x6d, 0x6c, 0x22, 0x00, 0x42, 0x52, 0x5a, 0x50, 0x67, 0x69, - 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6b, 0x75, 0x72, 0x74, 0x6f, 0x73, 0x69, - 0x73, 0x2d, 0x74, 0x65, 0x63, 0x68, 0x2f, 0x6b, 0x75, 0x72, 0x74, 0x6f, 0x73, 0x69, 0x73, 0x2f, - 0x61, 0x70, 0x69, 0x2f, 0x67, 0x6f, 0x6c, 0x61, 0x6e, 0x67, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, - 0x6b, 0x75, 0x72, 0x74, 0x6f, 0x73, 0x69, 0x73, 0x5f, 0x63, 0x6f, 0x72, 0x65, 0x5f, 0x72, 0x70, - 0x63, 0x5f, 0x61, 0x70, 0x69, 0x5f, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x73, 0x62, 0x06, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x55, 0x0a, 0x0e, 0x47, 0x65, 0x74, + 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x52, 0x75, 0x6e, 0x12, 0x16, 0x2e, 0x67, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, + 0x70, 0x74, 0x79, 0x1a, 0x29, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, + 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x74, 0x61, 0x72, 0x6c, + 0x61, 0x72, 0x6b, 0x52, 0x75, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, + 0x12, 0x69, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x53, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x50, 0x6c, 0x61, 0x6e, 0x59, 0x61, 0x6d, 0x6c, 0x12, 0x2d, 0x2e, + 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, + 0x69, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x50, 0x6c, 0x61, 0x6e, 0x59, 0x61, 0x6d, 0x6c, 0x41, 0x72, 0x67, 0x73, 0x1a, 0x1b, 0x2e, 0x61, + 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, + 0x2e, 0x50, 0x6c, 0x61, 0x6e, 0x59, 0x61, 0x6d, 0x6c, 0x22, 0x00, 0x12, 0x6b, 0x0a, 0x1a, 0x47, + 0x65, 0x74, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, + 0x65, 0x50, 0x6c, 0x61, 0x6e, 0x59, 0x61, 0x6d, 0x6c, 0x12, 0x2e, 0x2e, 0x61, 0x70, 0x69, 0x5f, + 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, + 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x50, 0x6c, 0x61, + 0x6e, 0x59, 0x61, 0x6d, 0x6c, 0x41, 0x72, 0x67, 0x73, 0x1a, 0x1b, 0x2e, 0x61, 0x70, 0x69, 0x5f, + 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x50, 0x6c, + 0x61, 0x6e, 0x59, 0x61, 0x6d, 0x6c, 0x22, 0x00, 0x42, 0x52, 0x5a, 0x50, 0x67, 0x69, 0x74, 0x68, + 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6b, 0x75, 0x72, 0x74, 0x6f, 0x73, 0x69, 0x73, 0x2d, + 0x74, 0x65, 0x63, 0x68, 0x2f, 0x6b, 0x75, 0x72, 0x74, 0x6f, 0x73, 0x69, 0x73, 0x2f, 0x61, 0x70, + 0x69, 0x2f, 0x67, 0x6f, 0x6c, 0x61, 0x6e, 0x67, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x6b, 0x75, + 0x72, 0x74, 0x6f, 0x73, 0x69, 0x73, 0x5f, 0x63, 0x6f, 0x72, 0x65, 0x5f, 0x72, 0x70, 0x63, 0x5f, + 0x61, 0x70, 0x69, 0x5f, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x73, 0x62, 0x06, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -4365,7 +4420,7 @@ func file_api_container_service_proto_rawDescGZIP() []byte { } var file_api_container_service_proto_enumTypes = make([]protoimpl.EnumInfo, 7) -var file_api_container_service_proto_msgTypes = make([]protoimpl.MessageInfo, 51) +var file_api_container_service_proto_msgTypes = make([]protoimpl.MessageInfo, 52) var file_api_container_service_proto_goTypes = []interface{}{ (ServiceStatus)(0), // 0: api_container_api.ServiceStatus (ImageDownloadMode)(0), // 1: api_container_api.ImageDownloadMode @@ -4376,136 +4431,138 @@ var file_api_container_service_proto_goTypes = []interface{}{ (Container_Status)(0), // 6: api_container_api.Container.Status (*Port)(nil), // 7: api_container_api.Port (*Container)(nil), // 8: api_container_api.Container - (*ServiceInfo)(nil), // 9: api_container_api.ServiceInfo - (*RunStarlarkScriptArgs)(nil), // 10: api_container_api.RunStarlarkScriptArgs - (*RunStarlarkPackageArgs)(nil), // 11: api_container_api.RunStarlarkPackageArgs - (*StarlarkRunResponseLine)(nil), // 12: api_container_api.StarlarkRunResponseLine - (*StarlarkInfo)(nil), // 13: api_container_api.StarlarkInfo - (*StarlarkWarning)(nil), // 14: api_container_api.StarlarkWarning - (*StarlarkInstruction)(nil), // 15: api_container_api.StarlarkInstruction - (*StarlarkInstructionResult)(nil), // 16: api_container_api.StarlarkInstructionResult - (*StarlarkInstructionArg)(nil), // 17: api_container_api.StarlarkInstructionArg - (*StarlarkInstructionPosition)(nil), // 18: api_container_api.StarlarkInstructionPosition - (*StarlarkError)(nil), // 19: api_container_api.StarlarkError - (*StarlarkInterpretationError)(nil), // 20: api_container_api.StarlarkInterpretationError - (*StarlarkValidationError)(nil), // 21: api_container_api.StarlarkValidationError - (*StarlarkExecutionError)(nil), // 22: api_container_api.StarlarkExecutionError - (*StarlarkRunProgress)(nil), // 23: api_container_api.StarlarkRunProgress - (*StarlarkRunFinishedEvent)(nil), // 24: api_container_api.StarlarkRunFinishedEvent - (*GetServicesArgs)(nil), // 25: api_container_api.GetServicesArgs - (*GetServicesResponse)(nil), // 26: api_container_api.GetServicesResponse - (*ServiceIdentifiers)(nil), // 27: api_container_api.ServiceIdentifiers - (*GetExistingAndHistoricalServiceIdentifiersResponse)(nil), // 28: api_container_api.GetExistingAndHistoricalServiceIdentifiersResponse - (*ExecCommandArgs)(nil), // 29: api_container_api.ExecCommandArgs - (*ExecCommandResponse)(nil), // 30: api_container_api.ExecCommandResponse - (*WaitForHttpGetEndpointAvailabilityArgs)(nil), // 31: api_container_api.WaitForHttpGetEndpointAvailabilityArgs - (*WaitForHttpPostEndpointAvailabilityArgs)(nil), // 32: api_container_api.WaitForHttpPostEndpointAvailabilityArgs - (*StreamedDataChunk)(nil), // 33: api_container_api.StreamedDataChunk - (*DataChunkMetadata)(nil), // 34: api_container_api.DataChunkMetadata - (*UploadFilesArtifactResponse)(nil), // 35: api_container_api.UploadFilesArtifactResponse - (*DownloadFilesArtifactArgs)(nil), // 36: api_container_api.DownloadFilesArtifactArgs - (*StoreWebFilesArtifactArgs)(nil), // 37: api_container_api.StoreWebFilesArtifactArgs - (*StoreWebFilesArtifactResponse)(nil), // 38: api_container_api.StoreWebFilesArtifactResponse - (*StoreFilesArtifactFromServiceArgs)(nil), // 39: api_container_api.StoreFilesArtifactFromServiceArgs - (*StoreFilesArtifactFromServiceResponse)(nil), // 40: api_container_api.StoreFilesArtifactFromServiceResponse - (*FilesArtifactNameAndUuid)(nil), // 41: api_container_api.FilesArtifactNameAndUuid - (*ListFilesArtifactNamesAndUuidsResponse)(nil), // 42: api_container_api.ListFilesArtifactNamesAndUuidsResponse - (*InspectFilesArtifactContentsRequest)(nil), // 43: api_container_api.InspectFilesArtifactContentsRequest - (*InspectFilesArtifactContentsResponse)(nil), // 44: api_container_api.InspectFilesArtifactContentsResponse - (*FileArtifactContentsFileDescription)(nil), // 45: api_container_api.FileArtifactContentsFileDescription - (*ConnectServicesArgs)(nil), // 46: api_container_api.ConnectServicesArgs - (*ConnectServicesResponse)(nil), // 47: api_container_api.ConnectServicesResponse - (*GetStarlarkRunResponse)(nil), // 48: api_container_api.GetStarlarkRunResponse - (*PlanYaml)(nil), // 49: api_container_api.PlanYaml - (*StarlarkScriptPlanYamlArgs)(nil), // 50: api_container_api.StarlarkScriptPlanYamlArgs - (*StarlarkPackagePlanYamlArgs)(nil), // 51: api_container_api.StarlarkPackagePlanYamlArgs - nil, // 52: api_container_api.Container.EnvVarsEntry - nil, // 53: api_container_api.ServiceInfo.PrivatePortsEntry - nil, // 54: api_container_api.ServiceInfo.MaybePublicPortsEntry - nil, // 55: api_container_api.ServiceInfo.ServiceDirPathsToFilesArtifactsIdentifiersEntry - nil, // 56: api_container_api.GetServicesArgs.ServiceIdentifiersEntry - nil, // 57: api_container_api.GetServicesResponse.ServiceInfoEntry - (*emptypb.Empty)(nil), // 58: google.protobuf.Empty + (*FilesArtifactsList)(nil), // 9: api_container_api.FilesArtifactsList + (*ServiceInfo)(nil), // 10: api_container_api.ServiceInfo + (*RunStarlarkScriptArgs)(nil), // 11: api_container_api.RunStarlarkScriptArgs + (*RunStarlarkPackageArgs)(nil), // 12: api_container_api.RunStarlarkPackageArgs + (*StarlarkRunResponseLine)(nil), // 13: api_container_api.StarlarkRunResponseLine + (*StarlarkInfo)(nil), // 14: api_container_api.StarlarkInfo + (*StarlarkWarning)(nil), // 15: api_container_api.StarlarkWarning + (*StarlarkInstruction)(nil), // 16: api_container_api.StarlarkInstruction + (*StarlarkInstructionResult)(nil), // 17: api_container_api.StarlarkInstructionResult + (*StarlarkInstructionArg)(nil), // 18: api_container_api.StarlarkInstructionArg + (*StarlarkInstructionPosition)(nil), // 19: api_container_api.StarlarkInstructionPosition + (*StarlarkError)(nil), // 20: api_container_api.StarlarkError + (*StarlarkInterpretationError)(nil), // 21: api_container_api.StarlarkInterpretationError + (*StarlarkValidationError)(nil), // 22: api_container_api.StarlarkValidationError + (*StarlarkExecutionError)(nil), // 23: api_container_api.StarlarkExecutionError + (*StarlarkRunProgress)(nil), // 24: api_container_api.StarlarkRunProgress + (*StarlarkRunFinishedEvent)(nil), // 25: api_container_api.StarlarkRunFinishedEvent + (*GetServicesArgs)(nil), // 26: api_container_api.GetServicesArgs + (*GetServicesResponse)(nil), // 27: api_container_api.GetServicesResponse + (*ServiceIdentifiers)(nil), // 28: api_container_api.ServiceIdentifiers + (*GetExistingAndHistoricalServiceIdentifiersResponse)(nil), // 29: api_container_api.GetExistingAndHistoricalServiceIdentifiersResponse + (*ExecCommandArgs)(nil), // 30: api_container_api.ExecCommandArgs + (*ExecCommandResponse)(nil), // 31: api_container_api.ExecCommandResponse + (*WaitForHttpGetEndpointAvailabilityArgs)(nil), // 32: api_container_api.WaitForHttpGetEndpointAvailabilityArgs + (*WaitForHttpPostEndpointAvailabilityArgs)(nil), // 33: api_container_api.WaitForHttpPostEndpointAvailabilityArgs + (*StreamedDataChunk)(nil), // 34: api_container_api.StreamedDataChunk + (*DataChunkMetadata)(nil), // 35: api_container_api.DataChunkMetadata + (*UploadFilesArtifactResponse)(nil), // 36: api_container_api.UploadFilesArtifactResponse + (*DownloadFilesArtifactArgs)(nil), // 37: api_container_api.DownloadFilesArtifactArgs + (*StoreWebFilesArtifactArgs)(nil), // 38: api_container_api.StoreWebFilesArtifactArgs + (*StoreWebFilesArtifactResponse)(nil), // 39: api_container_api.StoreWebFilesArtifactResponse + (*StoreFilesArtifactFromServiceArgs)(nil), // 40: api_container_api.StoreFilesArtifactFromServiceArgs + (*StoreFilesArtifactFromServiceResponse)(nil), // 41: api_container_api.StoreFilesArtifactFromServiceResponse + (*FilesArtifactNameAndUuid)(nil), // 42: api_container_api.FilesArtifactNameAndUuid + (*ListFilesArtifactNamesAndUuidsResponse)(nil), // 43: api_container_api.ListFilesArtifactNamesAndUuidsResponse + (*InspectFilesArtifactContentsRequest)(nil), // 44: api_container_api.InspectFilesArtifactContentsRequest + (*InspectFilesArtifactContentsResponse)(nil), // 45: api_container_api.InspectFilesArtifactContentsResponse + (*FileArtifactContentsFileDescription)(nil), // 46: api_container_api.FileArtifactContentsFileDescription + (*ConnectServicesArgs)(nil), // 47: api_container_api.ConnectServicesArgs + (*ConnectServicesResponse)(nil), // 48: api_container_api.ConnectServicesResponse + (*GetStarlarkRunResponse)(nil), // 49: api_container_api.GetStarlarkRunResponse + (*PlanYaml)(nil), // 50: api_container_api.PlanYaml + (*StarlarkScriptPlanYamlArgs)(nil), // 51: api_container_api.StarlarkScriptPlanYamlArgs + (*StarlarkPackagePlanYamlArgs)(nil), // 52: api_container_api.StarlarkPackagePlanYamlArgs + nil, // 53: api_container_api.Container.EnvVarsEntry + nil, // 54: api_container_api.ServiceInfo.PrivatePortsEntry + nil, // 55: api_container_api.ServiceInfo.MaybePublicPortsEntry + nil, // 56: api_container_api.ServiceInfo.ServiceDirPathsToFilesArtifactsIdentifiersEntry + nil, // 57: api_container_api.GetServicesArgs.ServiceIdentifiersEntry + nil, // 58: api_container_api.GetServicesResponse.ServiceInfoEntry + (*emptypb.Empty)(nil), // 59: google.protobuf.Empty } var file_api_container_service_proto_depIdxs = []int32{ 5, // 0: api_container_api.Port.transport_protocol:type_name -> api_container_api.Port.TransportProtocol 6, // 1: api_container_api.Container.status:type_name -> api_container_api.Container.Status - 52, // 2: api_container_api.Container.env_vars:type_name -> api_container_api.Container.EnvVarsEntry - 53, // 3: api_container_api.ServiceInfo.private_ports:type_name -> api_container_api.ServiceInfo.PrivatePortsEntry - 54, // 4: api_container_api.ServiceInfo.maybe_public_ports:type_name -> api_container_api.ServiceInfo.MaybePublicPortsEntry + 53, // 2: api_container_api.Container.env_vars:type_name -> api_container_api.Container.EnvVarsEntry + 54, // 3: api_container_api.ServiceInfo.private_ports:type_name -> api_container_api.ServiceInfo.PrivatePortsEntry + 55, // 4: api_container_api.ServiceInfo.maybe_public_ports:type_name -> api_container_api.ServiceInfo.MaybePublicPortsEntry 0, // 5: api_container_api.ServiceInfo.service_status:type_name -> api_container_api.ServiceStatus 8, // 6: api_container_api.ServiceInfo.container:type_name -> api_container_api.Container - 55, // 7: api_container_api.ServiceInfo.service_dir_paths_to_files_artifacts_identifiers:type_name -> api_container_api.ServiceInfo.ServiceDirPathsToFilesArtifactsIdentifiersEntry + 56, // 7: api_container_api.ServiceInfo.service_dir_paths_to_files_artifacts_identifiers:type_name -> api_container_api.ServiceInfo.ServiceDirPathsToFilesArtifactsIdentifiersEntry 3, // 8: api_container_api.RunStarlarkScriptArgs.experimental_features:type_name -> api_container_api.KurtosisFeatureFlag 1, // 9: api_container_api.RunStarlarkScriptArgs.image_download_mode:type_name -> api_container_api.ImageDownloadMode 3, // 10: api_container_api.RunStarlarkPackageArgs.experimental_features:type_name -> api_container_api.KurtosisFeatureFlag 1, // 11: api_container_api.RunStarlarkPackageArgs.image_download_mode:type_name -> api_container_api.ImageDownloadMode - 15, // 12: api_container_api.StarlarkRunResponseLine.instruction:type_name -> api_container_api.StarlarkInstruction - 19, // 13: api_container_api.StarlarkRunResponseLine.error:type_name -> api_container_api.StarlarkError - 23, // 14: api_container_api.StarlarkRunResponseLine.progress_info:type_name -> api_container_api.StarlarkRunProgress - 16, // 15: api_container_api.StarlarkRunResponseLine.instruction_result:type_name -> api_container_api.StarlarkInstructionResult - 24, // 16: api_container_api.StarlarkRunResponseLine.run_finished_event:type_name -> api_container_api.StarlarkRunFinishedEvent - 14, // 17: api_container_api.StarlarkRunResponseLine.warning:type_name -> api_container_api.StarlarkWarning - 13, // 18: api_container_api.StarlarkRunResponseLine.info:type_name -> api_container_api.StarlarkInfo - 18, // 19: api_container_api.StarlarkInstruction.position:type_name -> api_container_api.StarlarkInstructionPosition - 17, // 20: api_container_api.StarlarkInstruction.arguments:type_name -> api_container_api.StarlarkInstructionArg - 20, // 21: api_container_api.StarlarkError.interpretation_error:type_name -> api_container_api.StarlarkInterpretationError - 21, // 22: api_container_api.StarlarkError.validation_error:type_name -> api_container_api.StarlarkValidationError - 22, // 23: api_container_api.StarlarkError.execution_error:type_name -> api_container_api.StarlarkExecutionError - 56, // 24: api_container_api.GetServicesArgs.service_identifiers:type_name -> api_container_api.GetServicesArgs.ServiceIdentifiersEntry - 57, // 25: api_container_api.GetServicesResponse.service_info:type_name -> api_container_api.GetServicesResponse.ServiceInfoEntry - 27, // 26: api_container_api.GetExistingAndHistoricalServiceIdentifiersResponse.allIdentifiers:type_name -> api_container_api.ServiceIdentifiers - 34, // 27: api_container_api.StreamedDataChunk.metadata:type_name -> api_container_api.DataChunkMetadata - 41, // 28: api_container_api.ListFilesArtifactNamesAndUuidsResponse.file_names_and_uuids:type_name -> api_container_api.FilesArtifactNameAndUuid - 41, // 29: api_container_api.InspectFilesArtifactContentsRequest.file_names_and_uuid:type_name -> api_container_api.FilesArtifactNameAndUuid - 45, // 30: api_container_api.InspectFilesArtifactContentsResponse.file_descriptions:type_name -> api_container_api.FileArtifactContentsFileDescription + 16, // 12: api_container_api.StarlarkRunResponseLine.instruction:type_name -> api_container_api.StarlarkInstruction + 20, // 13: api_container_api.StarlarkRunResponseLine.error:type_name -> api_container_api.StarlarkError + 24, // 14: api_container_api.StarlarkRunResponseLine.progress_info:type_name -> api_container_api.StarlarkRunProgress + 17, // 15: api_container_api.StarlarkRunResponseLine.instruction_result:type_name -> api_container_api.StarlarkInstructionResult + 25, // 16: api_container_api.StarlarkRunResponseLine.run_finished_event:type_name -> api_container_api.StarlarkRunFinishedEvent + 15, // 17: api_container_api.StarlarkRunResponseLine.warning:type_name -> api_container_api.StarlarkWarning + 14, // 18: api_container_api.StarlarkRunResponseLine.info:type_name -> api_container_api.StarlarkInfo + 19, // 19: api_container_api.StarlarkInstruction.position:type_name -> api_container_api.StarlarkInstructionPosition + 18, // 20: api_container_api.StarlarkInstruction.arguments:type_name -> api_container_api.StarlarkInstructionArg + 21, // 21: api_container_api.StarlarkError.interpretation_error:type_name -> api_container_api.StarlarkInterpretationError + 22, // 22: api_container_api.StarlarkError.validation_error:type_name -> api_container_api.StarlarkValidationError + 23, // 23: api_container_api.StarlarkError.execution_error:type_name -> api_container_api.StarlarkExecutionError + 57, // 24: api_container_api.GetServicesArgs.service_identifiers:type_name -> api_container_api.GetServicesArgs.ServiceIdentifiersEntry + 58, // 25: api_container_api.GetServicesResponse.service_info:type_name -> api_container_api.GetServicesResponse.ServiceInfoEntry + 28, // 26: api_container_api.GetExistingAndHistoricalServiceIdentifiersResponse.allIdentifiers:type_name -> api_container_api.ServiceIdentifiers + 35, // 27: api_container_api.StreamedDataChunk.metadata:type_name -> api_container_api.DataChunkMetadata + 42, // 28: api_container_api.ListFilesArtifactNamesAndUuidsResponse.file_names_and_uuids:type_name -> api_container_api.FilesArtifactNameAndUuid + 42, // 29: api_container_api.InspectFilesArtifactContentsRequest.file_names_and_uuid:type_name -> api_container_api.FilesArtifactNameAndUuid + 46, // 30: api_container_api.InspectFilesArtifactContentsResponse.file_descriptions:type_name -> api_container_api.FileArtifactContentsFileDescription 2, // 31: api_container_api.ConnectServicesArgs.connect:type_name -> api_container_api.Connect 3, // 32: api_container_api.GetStarlarkRunResponse.experimental_features:type_name -> api_container_api.KurtosisFeatureFlag 4, // 33: api_container_api.GetStarlarkRunResponse.restart_policy:type_name -> api_container_api.RestartPolicy 7, // 34: api_container_api.ServiceInfo.PrivatePortsEntry.value:type_name -> api_container_api.Port 7, // 35: api_container_api.ServiceInfo.MaybePublicPortsEntry.value:type_name -> api_container_api.Port - 9, // 36: api_container_api.GetServicesResponse.ServiceInfoEntry.value:type_name -> api_container_api.ServiceInfo - 10, // 37: api_container_api.ApiContainerService.RunStarlarkScript:input_type -> api_container_api.RunStarlarkScriptArgs - 33, // 38: api_container_api.ApiContainerService.UploadStarlarkPackage:input_type -> api_container_api.StreamedDataChunk - 11, // 39: api_container_api.ApiContainerService.RunStarlarkPackage:input_type -> api_container_api.RunStarlarkPackageArgs - 25, // 40: api_container_api.ApiContainerService.GetServices:input_type -> api_container_api.GetServicesArgs - 58, // 41: api_container_api.ApiContainerService.GetExistingAndHistoricalServiceIdentifiers:input_type -> google.protobuf.Empty - 29, // 42: api_container_api.ApiContainerService.ExecCommand:input_type -> api_container_api.ExecCommandArgs - 31, // 43: api_container_api.ApiContainerService.WaitForHttpGetEndpointAvailability:input_type -> api_container_api.WaitForHttpGetEndpointAvailabilityArgs - 32, // 44: api_container_api.ApiContainerService.WaitForHttpPostEndpointAvailability:input_type -> api_container_api.WaitForHttpPostEndpointAvailabilityArgs - 33, // 45: api_container_api.ApiContainerService.UploadFilesArtifact:input_type -> api_container_api.StreamedDataChunk - 36, // 46: api_container_api.ApiContainerService.DownloadFilesArtifact:input_type -> api_container_api.DownloadFilesArtifactArgs - 37, // 47: api_container_api.ApiContainerService.StoreWebFilesArtifact:input_type -> api_container_api.StoreWebFilesArtifactArgs - 39, // 48: api_container_api.ApiContainerService.StoreFilesArtifactFromService:input_type -> api_container_api.StoreFilesArtifactFromServiceArgs - 58, // 49: api_container_api.ApiContainerService.ListFilesArtifactNamesAndUuids:input_type -> google.protobuf.Empty - 43, // 50: api_container_api.ApiContainerService.InspectFilesArtifactContents:input_type -> api_container_api.InspectFilesArtifactContentsRequest - 46, // 51: api_container_api.ApiContainerService.ConnectServices:input_type -> api_container_api.ConnectServicesArgs - 58, // 52: api_container_api.ApiContainerService.GetStarlarkRun:input_type -> google.protobuf.Empty - 50, // 53: api_container_api.ApiContainerService.GetStarlarkScriptPlanYaml:input_type -> api_container_api.StarlarkScriptPlanYamlArgs - 51, // 54: api_container_api.ApiContainerService.GetStarlarkPackagePlanYaml:input_type -> api_container_api.StarlarkPackagePlanYamlArgs - 12, // 55: api_container_api.ApiContainerService.RunStarlarkScript:output_type -> api_container_api.StarlarkRunResponseLine - 58, // 56: api_container_api.ApiContainerService.UploadStarlarkPackage:output_type -> google.protobuf.Empty - 12, // 57: api_container_api.ApiContainerService.RunStarlarkPackage:output_type -> api_container_api.StarlarkRunResponseLine - 26, // 58: api_container_api.ApiContainerService.GetServices:output_type -> api_container_api.GetServicesResponse - 28, // 59: api_container_api.ApiContainerService.GetExistingAndHistoricalServiceIdentifiers:output_type -> api_container_api.GetExistingAndHistoricalServiceIdentifiersResponse - 30, // 60: api_container_api.ApiContainerService.ExecCommand:output_type -> api_container_api.ExecCommandResponse - 58, // 61: api_container_api.ApiContainerService.WaitForHttpGetEndpointAvailability:output_type -> google.protobuf.Empty - 58, // 62: api_container_api.ApiContainerService.WaitForHttpPostEndpointAvailability:output_type -> google.protobuf.Empty - 35, // 63: api_container_api.ApiContainerService.UploadFilesArtifact:output_type -> api_container_api.UploadFilesArtifactResponse - 33, // 64: api_container_api.ApiContainerService.DownloadFilesArtifact:output_type -> api_container_api.StreamedDataChunk - 38, // 65: api_container_api.ApiContainerService.StoreWebFilesArtifact:output_type -> api_container_api.StoreWebFilesArtifactResponse - 40, // 66: api_container_api.ApiContainerService.StoreFilesArtifactFromService:output_type -> api_container_api.StoreFilesArtifactFromServiceResponse - 42, // 67: api_container_api.ApiContainerService.ListFilesArtifactNamesAndUuids:output_type -> api_container_api.ListFilesArtifactNamesAndUuidsResponse - 44, // 68: api_container_api.ApiContainerService.InspectFilesArtifactContents:output_type -> api_container_api.InspectFilesArtifactContentsResponse - 47, // 69: api_container_api.ApiContainerService.ConnectServices:output_type -> api_container_api.ConnectServicesResponse - 48, // 70: api_container_api.ApiContainerService.GetStarlarkRun:output_type -> api_container_api.GetStarlarkRunResponse - 49, // 71: api_container_api.ApiContainerService.GetStarlarkScriptPlanYaml:output_type -> api_container_api.PlanYaml - 49, // 72: api_container_api.ApiContainerService.GetStarlarkPackagePlanYaml:output_type -> api_container_api.PlanYaml - 55, // [55:73] is the sub-list for method output_type - 37, // [37:55] is the sub-list for method input_type - 37, // [37:37] is the sub-list for extension type_name - 37, // [37:37] is the sub-list for extension extendee - 0, // [0:37] is the sub-list for field type_name + 9, // 36: api_container_api.ServiceInfo.ServiceDirPathsToFilesArtifactsIdentifiersEntry.value:type_name -> api_container_api.FilesArtifactsList + 10, // 37: api_container_api.GetServicesResponse.ServiceInfoEntry.value:type_name -> api_container_api.ServiceInfo + 11, // 38: api_container_api.ApiContainerService.RunStarlarkScript:input_type -> api_container_api.RunStarlarkScriptArgs + 34, // 39: api_container_api.ApiContainerService.UploadStarlarkPackage:input_type -> api_container_api.StreamedDataChunk + 12, // 40: api_container_api.ApiContainerService.RunStarlarkPackage:input_type -> api_container_api.RunStarlarkPackageArgs + 26, // 41: api_container_api.ApiContainerService.GetServices:input_type -> api_container_api.GetServicesArgs + 59, // 42: api_container_api.ApiContainerService.GetExistingAndHistoricalServiceIdentifiers:input_type -> google.protobuf.Empty + 30, // 43: api_container_api.ApiContainerService.ExecCommand:input_type -> api_container_api.ExecCommandArgs + 32, // 44: api_container_api.ApiContainerService.WaitForHttpGetEndpointAvailability:input_type -> api_container_api.WaitForHttpGetEndpointAvailabilityArgs + 33, // 45: api_container_api.ApiContainerService.WaitForHttpPostEndpointAvailability:input_type -> api_container_api.WaitForHttpPostEndpointAvailabilityArgs + 34, // 46: api_container_api.ApiContainerService.UploadFilesArtifact:input_type -> api_container_api.StreamedDataChunk + 37, // 47: api_container_api.ApiContainerService.DownloadFilesArtifact:input_type -> api_container_api.DownloadFilesArtifactArgs + 38, // 48: api_container_api.ApiContainerService.StoreWebFilesArtifact:input_type -> api_container_api.StoreWebFilesArtifactArgs + 40, // 49: api_container_api.ApiContainerService.StoreFilesArtifactFromService:input_type -> api_container_api.StoreFilesArtifactFromServiceArgs + 59, // 50: api_container_api.ApiContainerService.ListFilesArtifactNamesAndUuids:input_type -> google.protobuf.Empty + 44, // 51: api_container_api.ApiContainerService.InspectFilesArtifactContents:input_type -> api_container_api.InspectFilesArtifactContentsRequest + 47, // 52: api_container_api.ApiContainerService.ConnectServices:input_type -> api_container_api.ConnectServicesArgs + 59, // 53: api_container_api.ApiContainerService.GetStarlarkRun:input_type -> google.protobuf.Empty + 51, // 54: api_container_api.ApiContainerService.GetStarlarkScriptPlanYaml:input_type -> api_container_api.StarlarkScriptPlanYamlArgs + 52, // 55: api_container_api.ApiContainerService.GetStarlarkPackagePlanYaml:input_type -> api_container_api.StarlarkPackagePlanYamlArgs + 13, // 56: api_container_api.ApiContainerService.RunStarlarkScript:output_type -> api_container_api.StarlarkRunResponseLine + 59, // 57: api_container_api.ApiContainerService.UploadStarlarkPackage:output_type -> google.protobuf.Empty + 13, // 58: api_container_api.ApiContainerService.RunStarlarkPackage:output_type -> api_container_api.StarlarkRunResponseLine + 27, // 59: api_container_api.ApiContainerService.GetServices:output_type -> api_container_api.GetServicesResponse + 29, // 60: api_container_api.ApiContainerService.GetExistingAndHistoricalServiceIdentifiers:output_type -> api_container_api.GetExistingAndHistoricalServiceIdentifiersResponse + 31, // 61: api_container_api.ApiContainerService.ExecCommand:output_type -> api_container_api.ExecCommandResponse + 59, // 62: api_container_api.ApiContainerService.WaitForHttpGetEndpointAvailability:output_type -> google.protobuf.Empty + 59, // 63: api_container_api.ApiContainerService.WaitForHttpPostEndpointAvailability:output_type -> google.protobuf.Empty + 36, // 64: api_container_api.ApiContainerService.UploadFilesArtifact:output_type -> api_container_api.UploadFilesArtifactResponse + 34, // 65: api_container_api.ApiContainerService.DownloadFilesArtifact:output_type -> api_container_api.StreamedDataChunk + 39, // 66: api_container_api.ApiContainerService.StoreWebFilesArtifact:output_type -> api_container_api.StoreWebFilesArtifactResponse + 41, // 67: api_container_api.ApiContainerService.StoreFilesArtifactFromService:output_type -> api_container_api.StoreFilesArtifactFromServiceResponse + 43, // 68: api_container_api.ApiContainerService.ListFilesArtifactNamesAndUuids:output_type -> api_container_api.ListFilesArtifactNamesAndUuidsResponse + 45, // 69: api_container_api.ApiContainerService.InspectFilesArtifactContents:output_type -> api_container_api.InspectFilesArtifactContentsResponse + 48, // 70: api_container_api.ApiContainerService.ConnectServices:output_type -> api_container_api.ConnectServicesResponse + 49, // 71: api_container_api.ApiContainerService.GetStarlarkRun:output_type -> api_container_api.GetStarlarkRunResponse + 50, // 72: api_container_api.ApiContainerService.GetStarlarkScriptPlanYaml:output_type -> api_container_api.PlanYaml + 50, // 73: api_container_api.ApiContainerService.GetStarlarkPackagePlanYaml:output_type -> api_container_api.PlanYaml + 56, // [56:74] is the sub-list for method output_type + 38, // [38:56] is the sub-list for method input_type + 38, // [38:38] is the sub-list for extension type_name + 38, // [38:38] is the sub-list for extension extendee + 0, // [0:38] is the sub-list for field type_name } func init() { file_api_container_service_proto_init() } @@ -4539,7 +4596,7 @@ func file_api_container_service_proto_init() { } } file_api_container_service_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ServiceInfo); i { + switch v := v.(*FilesArtifactsList); i { case 0: return &v.state case 1: @@ -4551,7 +4608,7 @@ func file_api_container_service_proto_init() { } } file_api_container_service_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*RunStarlarkScriptArgs); i { + switch v := v.(*ServiceInfo); i { case 0: return &v.state case 1: @@ -4563,7 +4620,7 @@ func file_api_container_service_proto_init() { } } file_api_container_service_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*RunStarlarkPackageArgs); i { + switch v := v.(*RunStarlarkScriptArgs); i { case 0: return &v.state case 1: @@ -4575,7 +4632,7 @@ func file_api_container_service_proto_init() { } } file_api_container_service_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*StarlarkRunResponseLine); i { + switch v := v.(*RunStarlarkPackageArgs); i { case 0: return &v.state case 1: @@ -4587,7 +4644,7 @@ func file_api_container_service_proto_init() { } } file_api_container_service_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*StarlarkInfo); i { + switch v := v.(*StarlarkRunResponseLine); i { case 0: return &v.state case 1: @@ -4599,7 +4656,7 @@ func file_api_container_service_proto_init() { } } file_api_container_service_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*StarlarkWarning); i { + switch v := v.(*StarlarkInfo); i { case 0: return &v.state case 1: @@ -4611,7 +4668,7 @@ func file_api_container_service_proto_init() { } } file_api_container_service_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*StarlarkInstruction); i { + switch v := v.(*StarlarkWarning); i { case 0: return &v.state case 1: @@ -4623,7 +4680,7 @@ func file_api_container_service_proto_init() { } } file_api_container_service_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*StarlarkInstructionResult); i { + switch v := v.(*StarlarkInstruction); i { case 0: return &v.state case 1: @@ -4635,7 +4692,7 @@ func file_api_container_service_proto_init() { } } file_api_container_service_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*StarlarkInstructionArg); i { + switch v := v.(*StarlarkInstructionResult); i { case 0: return &v.state case 1: @@ -4647,7 +4704,7 @@ func file_api_container_service_proto_init() { } } file_api_container_service_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*StarlarkInstructionPosition); i { + switch v := v.(*StarlarkInstructionArg); i { case 0: return &v.state case 1: @@ -4659,7 +4716,7 @@ func file_api_container_service_proto_init() { } } file_api_container_service_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*StarlarkError); i { + switch v := v.(*StarlarkInstructionPosition); i { case 0: return &v.state case 1: @@ -4671,7 +4728,7 @@ func file_api_container_service_proto_init() { } } file_api_container_service_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*StarlarkInterpretationError); i { + switch v := v.(*StarlarkError); i { case 0: return &v.state case 1: @@ -4683,7 +4740,7 @@ func file_api_container_service_proto_init() { } } file_api_container_service_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*StarlarkValidationError); i { + switch v := v.(*StarlarkInterpretationError); i { case 0: return &v.state case 1: @@ -4695,7 +4752,7 @@ func file_api_container_service_proto_init() { } } file_api_container_service_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*StarlarkExecutionError); i { + switch v := v.(*StarlarkValidationError); i { case 0: return &v.state case 1: @@ -4707,7 +4764,7 @@ func file_api_container_service_proto_init() { } } file_api_container_service_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*StarlarkRunProgress); i { + switch v := v.(*StarlarkExecutionError); i { case 0: return &v.state case 1: @@ -4719,7 +4776,7 @@ func file_api_container_service_proto_init() { } } file_api_container_service_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*StarlarkRunFinishedEvent); i { + switch v := v.(*StarlarkRunProgress); i { case 0: return &v.state case 1: @@ -4731,7 +4788,7 @@ func file_api_container_service_proto_init() { } } file_api_container_service_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetServicesArgs); i { + switch v := v.(*StarlarkRunFinishedEvent); i { case 0: return &v.state case 1: @@ -4743,7 +4800,7 @@ func file_api_container_service_proto_init() { } } file_api_container_service_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetServicesResponse); i { + switch v := v.(*GetServicesArgs); i { case 0: return &v.state case 1: @@ -4755,7 +4812,7 @@ func file_api_container_service_proto_init() { } } file_api_container_service_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ServiceIdentifiers); i { + switch v := v.(*GetServicesResponse); i { case 0: return &v.state case 1: @@ -4767,7 +4824,7 @@ func file_api_container_service_proto_init() { } } file_api_container_service_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetExistingAndHistoricalServiceIdentifiersResponse); i { + switch v := v.(*ServiceIdentifiers); i { case 0: return &v.state case 1: @@ -4779,7 +4836,7 @@ func file_api_container_service_proto_init() { } } file_api_container_service_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ExecCommandArgs); i { + switch v := v.(*GetExistingAndHistoricalServiceIdentifiersResponse); i { case 0: return &v.state case 1: @@ -4791,7 +4848,7 @@ func file_api_container_service_proto_init() { } } file_api_container_service_proto_msgTypes[23].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ExecCommandResponse); i { + switch v := v.(*ExecCommandArgs); i { case 0: return &v.state case 1: @@ -4803,7 +4860,7 @@ func file_api_container_service_proto_init() { } } file_api_container_service_proto_msgTypes[24].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*WaitForHttpGetEndpointAvailabilityArgs); i { + switch v := v.(*ExecCommandResponse); i { case 0: return &v.state case 1: @@ -4815,7 +4872,7 @@ func file_api_container_service_proto_init() { } } file_api_container_service_proto_msgTypes[25].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*WaitForHttpPostEndpointAvailabilityArgs); i { + switch v := v.(*WaitForHttpGetEndpointAvailabilityArgs); i { case 0: return &v.state case 1: @@ -4827,7 +4884,7 @@ func file_api_container_service_proto_init() { } } file_api_container_service_proto_msgTypes[26].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*StreamedDataChunk); i { + switch v := v.(*WaitForHttpPostEndpointAvailabilityArgs); i { case 0: return &v.state case 1: @@ -4839,7 +4896,7 @@ func file_api_container_service_proto_init() { } } file_api_container_service_proto_msgTypes[27].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DataChunkMetadata); i { + switch v := v.(*StreamedDataChunk); i { case 0: return &v.state case 1: @@ -4851,7 +4908,7 @@ func file_api_container_service_proto_init() { } } file_api_container_service_proto_msgTypes[28].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UploadFilesArtifactResponse); i { + switch v := v.(*DataChunkMetadata); i { case 0: return &v.state case 1: @@ -4863,7 +4920,7 @@ func file_api_container_service_proto_init() { } } file_api_container_service_proto_msgTypes[29].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DownloadFilesArtifactArgs); i { + switch v := v.(*UploadFilesArtifactResponse); i { case 0: return &v.state case 1: @@ -4875,7 +4932,7 @@ func file_api_container_service_proto_init() { } } file_api_container_service_proto_msgTypes[30].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*StoreWebFilesArtifactArgs); i { + switch v := v.(*DownloadFilesArtifactArgs); i { case 0: return &v.state case 1: @@ -4887,7 +4944,7 @@ func file_api_container_service_proto_init() { } } file_api_container_service_proto_msgTypes[31].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*StoreWebFilesArtifactResponse); i { + switch v := v.(*StoreWebFilesArtifactArgs); i { case 0: return &v.state case 1: @@ -4899,7 +4956,7 @@ func file_api_container_service_proto_init() { } } file_api_container_service_proto_msgTypes[32].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*StoreFilesArtifactFromServiceArgs); i { + switch v := v.(*StoreWebFilesArtifactResponse); i { case 0: return &v.state case 1: @@ -4911,7 +4968,7 @@ func file_api_container_service_proto_init() { } } file_api_container_service_proto_msgTypes[33].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*StoreFilesArtifactFromServiceResponse); i { + switch v := v.(*StoreFilesArtifactFromServiceArgs); i { case 0: return &v.state case 1: @@ -4923,7 +4980,7 @@ func file_api_container_service_proto_init() { } } file_api_container_service_proto_msgTypes[34].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*FilesArtifactNameAndUuid); i { + switch v := v.(*StoreFilesArtifactFromServiceResponse); i { case 0: return &v.state case 1: @@ -4935,7 +4992,7 @@ func file_api_container_service_proto_init() { } } file_api_container_service_proto_msgTypes[35].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListFilesArtifactNamesAndUuidsResponse); i { + switch v := v.(*FilesArtifactNameAndUuid); i { case 0: return &v.state case 1: @@ -4947,7 +5004,7 @@ func file_api_container_service_proto_init() { } } file_api_container_service_proto_msgTypes[36].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*InspectFilesArtifactContentsRequest); i { + switch v := v.(*ListFilesArtifactNamesAndUuidsResponse); i { case 0: return &v.state case 1: @@ -4959,7 +5016,7 @@ func file_api_container_service_proto_init() { } } file_api_container_service_proto_msgTypes[37].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*InspectFilesArtifactContentsResponse); i { + switch v := v.(*InspectFilesArtifactContentsRequest); i { case 0: return &v.state case 1: @@ -4971,7 +5028,7 @@ func file_api_container_service_proto_init() { } } file_api_container_service_proto_msgTypes[38].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*FileArtifactContentsFileDescription); i { + switch v := v.(*InspectFilesArtifactContentsResponse); i { case 0: return &v.state case 1: @@ -4983,7 +5040,7 @@ func file_api_container_service_proto_init() { } } file_api_container_service_proto_msgTypes[39].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ConnectServicesArgs); i { + switch v := v.(*FileArtifactContentsFileDescription); i { case 0: return &v.state case 1: @@ -4995,7 +5052,7 @@ func file_api_container_service_proto_init() { } } file_api_container_service_proto_msgTypes[40].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ConnectServicesResponse); i { + switch v := v.(*ConnectServicesArgs); i { case 0: return &v.state case 1: @@ -5007,7 +5064,7 @@ func file_api_container_service_proto_init() { } } file_api_container_service_proto_msgTypes[41].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetStarlarkRunResponse); i { + switch v := v.(*ConnectServicesResponse); i { case 0: return &v.state case 1: @@ -5019,7 +5076,7 @@ func file_api_container_service_proto_init() { } } file_api_container_service_proto_msgTypes[42].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PlanYaml); i { + switch v := v.(*GetStarlarkRunResponse); i { case 0: return &v.state case 1: @@ -5031,7 +5088,7 @@ func file_api_container_service_proto_init() { } } file_api_container_service_proto_msgTypes[43].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*StarlarkScriptPlanYamlArgs); i { + switch v := v.(*PlanYaml); i { case 0: return &v.state case 1: @@ -5043,6 +5100,18 @@ func file_api_container_service_proto_init() { } } file_api_container_service_proto_msgTypes[44].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*StarlarkScriptPlanYamlArgs); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_container_service_proto_msgTypes[45].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*StarlarkPackagePlanYamlArgs); i { case 0: return &v.state @@ -5056,12 +5125,12 @@ func file_api_container_service_proto_init() { } } file_api_container_service_proto_msgTypes[0].OneofWrappers = []interface{}{} - file_api_container_service_proto_msgTypes[3].OneofWrappers = []interface{}{} - file_api_container_service_proto_msgTypes[4].OneofWrappers = []interface{}{ + file_api_container_service_proto_msgTypes[4].OneofWrappers = []interface{}{} + file_api_container_service_proto_msgTypes[5].OneofWrappers = []interface{}{ (*RunStarlarkPackageArgs_Local)(nil), (*RunStarlarkPackageArgs_Remote)(nil), } - file_api_container_service_proto_msgTypes[5].OneofWrappers = []interface{}{ + file_api_container_service_proto_msgTypes[6].OneofWrappers = []interface{}{ (*StarlarkRunResponseLine_Instruction)(nil), (*StarlarkRunResponseLine_Error)(nil), (*StarlarkRunResponseLine_ProgressInfo)(nil), @@ -5070,26 +5139,26 @@ func file_api_container_service_proto_init() { (*StarlarkRunResponseLine_Warning)(nil), (*StarlarkRunResponseLine_Info)(nil), } - file_api_container_service_proto_msgTypes[10].OneofWrappers = []interface{}{} - file_api_container_service_proto_msgTypes[12].OneofWrappers = []interface{}{ + file_api_container_service_proto_msgTypes[11].OneofWrappers = []interface{}{} + file_api_container_service_proto_msgTypes[13].OneofWrappers = []interface{}{ (*StarlarkError_InterpretationError)(nil), (*StarlarkError_ValidationError)(nil), (*StarlarkError_ExecutionError)(nil), } - file_api_container_service_proto_msgTypes[17].OneofWrappers = []interface{}{} - file_api_container_service_proto_msgTypes[24].OneofWrappers = []interface{}{} + file_api_container_service_proto_msgTypes[18].OneofWrappers = []interface{}{} file_api_container_service_proto_msgTypes[25].OneofWrappers = []interface{}{} - file_api_container_service_proto_msgTypes[38].OneofWrappers = []interface{}{} - file_api_container_service_proto_msgTypes[41].OneofWrappers = []interface{}{} - file_api_container_service_proto_msgTypes[43].OneofWrappers = []interface{}{} + file_api_container_service_proto_msgTypes[26].OneofWrappers = []interface{}{} + file_api_container_service_proto_msgTypes[39].OneofWrappers = []interface{}{} + file_api_container_service_proto_msgTypes[42].OneofWrappers = []interface{}{} file_api_container_service_proto_msgTypes[44].OneofWrappers = []interface{}{} + file_api_container_service_proto_msgTypes[45].OneofWrappers = []interface{}{} type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_api_container_service_proto_rawDesc, NumEnums: 7, - NumMessages: 51, + NumMessages: 52, NumExtensions: 0, NumServices: 1, }, diff --git a/api/golang/core/lib/binding_constructors/binding_constructors.go b/api/golang/core/lib/binding_constructors/binding_constructors.go index 83b864f720..c46f9d3e4c 100644 --- a/api/golang/core/lib/binding_constructors/binding_constructors.go +++ b/api/golang/core/lib/binding_constructors/binding_constructors.go @@ -362,12 +362,19 @@ func NewServiceInfo( maybePublicPorts map[string]*kurtosis_core_rpc_api_bindings.Port, serviceStatus kurtosis_core_rpc_api_bindings.ServiceStatus, container *kurtosis_core_rpc_api_bindings.Container, - serviceDirPathsToFilesArtifactsIdentifiers map[string]string, + serviceDirPathsToFilesArtifactsIdentifiers map[string][]string, minMillicpus uint32, maxMillicpus uint32, minMemoryMegabytes uint32, maxMemoryMegabytes uint32, ) *kurtosis_core_rpc_api_bindings.ServiceInfo { + serviceDirPathsToFilesArtifactsList := map[string]*kurtosis_core_rpc_api_bindings.FilesArtifactsList{} + for serviceName, filesArtifactsIdentifiers := range serviceDirPathsToFilesArtifactsIdentifiers { + serviceDirPathsToFilesArtifactsList[serviceName] = &kurtosis_core_rpc_api_bindings.FilesArtifactsList{ + FilesArtifactsIdentifiers: filesArtifactsIdentifiers, + } + } + return &kurtosis_core_rpc_api_bindings.ServiceInfo{ ServiceUuid: uuid, Name: name, @@ -378,7 +385,7 @@ func NewServiceInfo( MaybePublicPorts: maybePublicPorts, ServiceStatus: serviceStatus, Container: container, - ServiceDirPathsToFilesArtifactsIdentifiers: serviceDirPathsToFilesArtifactsIdentifiers, + ServiceDirPathsToFilesArtifactsIdentifiers: serviceDirPathsToFilesArtifactsList, MaxMillicpus: maxMillicpus, MinMillicpus: minMillicpus, MaxMemoryMegabytes: maxMemoryMegabytes, diff --git a/api/protobuf/core/api_container_service.proto b/api/protobuf/core/api_container_service.proto index 8debba3823..648e6ae519 100644 --- a/api/protobuf/core/api_container_service.proto +++ b/api/protobuf/core/api_container_service.proto @@ -111,6 +111,10 @@ enum ImageDownloadMode { missing = 1; } +message FilesArtifactsList { + repeated string files_artifacts_identifiers = 1; +} + message ServiceInfo { // UUID of the service string service_uuid = 1; @@ -144,7 +148,7 @@ message ServiceInfo { Container container = 9; // Mapping of directory paths on service to names of files artifacts that are mounted to that directory - map service_dir_paths_to_files_artifacts_identifiers = 10; + map service_dir_paths_to_files_artifacts_identifiers = 10; uint32 max_millicpus = 11; diff --git a/api/rust/src/api_container_api.rs b/api/rust/src/api_container_api.rs index fc2b79ce2e..b46bd9ce98 100644 --- a/api/rust/src/api_container_api.rs +++ b/api/rust/src/api_container_api.rs @@ -124,6 +124,14 @@ pub mod container { } #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] +pub struct FilesArtifactsList { + #[prost(string, repeated, tag = "1")] + pub files_artifacts_identifiers: ::prost::alloc::vec::Vec< + ::prost::alloc::string::String, + >, +} +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] pub struct ServiceInfo { /// UUID of the service #[prost(string, tag = "1")] @@ -160,10 +168,10 @@ pub struct ServiceInfo { #[prost(message, optional, tag = "9")] pub container: ::core::option::Option, /// Mapping of directory paths on service to names of files artifacts that are mounted to that directory - #[prost(map = "string, string", tag = "10")] + #[prost(map = "string, message", tag = "10")] pub service_dir_paths_to_files_artifacts_identifiers: ::std::collections::HashMap< ::prost::alloc::string::String, - ::prost::alloc::string::String, + FilesArtifactsList, >, #[prost(uint32, tag = "11")] pub max_millicpus: u32, diff --git a/api/typescript/src/core/kurtosis_core_rpc_api_bindings/api_container_service_pb.d.ts b/api/typescript/src/core/kurtosis_core_rpc_api_bindings/api_container_service_pb.d.ts index 93e261a939..5cbee7ef97 100644 --- a/api/typescript/src/core/kurtosis_core_rpc_api_bindings/api_container_service_pb.d.ts +++ b/api/typescript/src/core/kurtosis_core_rpc_api_bindings/api_container_service_pb.d.ts @@ -105,6 +105,26 @@ export namespace Container { } } +export class FilesArtifactsList extends jspb.Message { + getFilesArtifactsIdentifiersList(): Array; + setFilesArtifactsIdentifiersList(value: Array): FilesArtifactsList; + clearFilesArtifactsIdentifiersList(): FilesArtifactsList; + addFilesArtifactsIdentifiers(value: string, index?: number): FilesArtifactsList; + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): FilesArtifactsList.AsObject; + static toObject(includeInstance: boolean, msg: FilesArtifactsList): FilesArtifactsList.AsObject; + static serializeBinaryToWriter(message: FilesArtifactsList, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): FilesArtifactsList; + static deserializeBinaryFromReader(message: FilesArtifactsList, reader: jspb.BinaryReader): FilesArtifactsList; +} + +export namespace FilesArtifactsList { + export type AsObject = { + filesArtifactsIdentifiersList: Array, + } +} + export class ServiceInfo extends jspb.Message { getServiceUuid(): string; setServiceUuid(value: string): ServiceInfo; @@ -135,7 +155,7 @@ export class ServiceInfo extends jspb.Message { hasContainer(): boolean; clearContainer(): ServiceInfo; - getServiceDirPathsToFilesArtifactsIdentifiersMap(): jspb.Map; + getServiceDirPathsToFilesArtifactsIdentifiersMap(): jspb.Map; clearServiceDirPathsToFilesArtifactsIdentifiersMap(): ServiceInfo; getMaxMillicpus(): number; @@ -169,7 +189,7 @@ export namespace ServiceInfo { shortenedUuid: string, serviceStatus: ServiceStatus, container?: Container.AsObject, - serviceDirPathsToFilesArtifactsIdentifiersMap: Array<[string, string]>, + serviceDirPathsToFilesArtifactsIdentifiersMap: Array<[string, FilesArtifactsList.AsObject]>, maxMillicpus: number, minMillicpus: number, maxMemoryMegabytes: number, diff --git a/api/typescript/src/core/kurtosis_core_rpc_api_bindings/api_container_service_pb.js b/api/typescript/src/core/kurtosis_core_rpc_api_bindings/api_container_service_pb.js index 62aae1a8f7..a6e452aa92 100644 --- a/api/typescript/src/core/kurtosis_core_rpc_api_bindings/api_container_service_pb.js +++ b/api/typescript/src/core/kurtosis_core_rpc_api_bindings/api_container_service_pb.js @@ -34,6 +34,7 @@ goog.exportSymbol('proto.api_container_api.ExecCommandArgs', null, global); goog.exportSymbol('proto.api_container_api.ExecCommandResponse', null, global); goog.exportSymbol('proto.api_container_api.FileArtifactContentsFileDescription', null, global); goog.exportSymbol('proto.api_container_api.FilesArtifactNameAndUuid', null, global); +goog.exportSymbol('proto.api_container_api.FilesArtifactsList', null, global); goog.exportSymbol('proto.api_container_api.GetExistingAndHistoricalServiceIdentifiersResponse', null, global); goog.exportSymbol('proto.api_container_api.GetServicesArgs', null, global); goog.exportSymbol('proto.api_container_api.GetServicesResponse', null, global); @@ -120,6 +121,27 @@ if (goog.DEBUG && !COMPILED) { */ proto.api_container_api.Container.displayName = 'proto.api_container_api.Container'; } +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.api_container_api.FilesArtifactsList = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, proto.api_container_api.FilesArtifactsList.repeatedFields_, null); +}; +goog.inherits(proto.api_container_api.FilesArtifactsList, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.api_container_api.FilesArtifactsList.displayName = 'proto.api_container_api.FilesArtifactsList'; +} /** * Generated by JsPbCodeGenerator. * @param {Array=} opt_data Optional initial data array, typically from a @@ -1656,6 +1678,162 @@ proto.api_container_api.Container.prototype.clearEnvVarsMap = function() { +/** + * List of repeated fields within this message type. + * @private {!Array} + * @const + */ +proto.api_container_api.FilesArtifactsList.repeatedFields_ = [1]; + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.api_container_api.FilesArtifactsList.prototype.toObject = function(opt_includeInstance) { + return proto.api_container_api.FilesArtifactsList.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.api_container_api.FilesArtifactsList} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.api_container_api.FilesArtifactsList.toObject = function(includeInstance, msg) { + var f, obj = { + filesArtifactsIdentifiersList: (f = jspb.Message.getRepeatedField(msg, 1)) == null ? undefined : f + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.api_container_api.FilesArtifactsList} + */ +proto.api_container_api.FilesArtifactsList.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.api_container_api.FilesArtifactsList; + return proto.api_container_api.FilesArtifactsList.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.api_container_api.FilesArtifactsList} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.api_container_api.FilesArtifactsList} + */ +proto.api_container_api.FilesArtifactsList.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {string} */ (reader.readString()); + msg.addFilesArtifactsIdentifiers(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.api_container_api.FilesArtifactsList.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.api_container_api.FilesArtifactsList.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.api_container_api.FilesArtifactsList} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.api_container_api.FilesArtifactsList.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getFilesArtifactsIdentifiersList(); + if (f.length > 0) { + writer.writeRepeatedString( + 1, + f + ); + } +}; + + +/** + * repeated string files_artifacts_identifiers = 1; + * @return {!Array} + */ +proto.api_container_api.FilesArtifactsList.prototype.getFilesArtifactsIdentifiersList = function() { + return /** @type {!Array} */ (jspb.Message.getRepeatedField(this, 1)); +}; + + +/** + * @param {!Array} value + * @return {!proto.api_container_api.FilesArtifactsList} returns this + */ +proto.api_container_api.FilesArtifactsList.prototype.setFilesArtifactsIdentifiersList = function(value) { + return jspb.Message.setField(this, 1, value || []); +}; + + +/** + * @param {string} value + * @param {number=} opt_index + * @return {!proto.api_container_api.FilesArtifactsList} returns this + */ +proto.api_container_api.FilesArtifactsList.prototype.addFilesArtifactsIdentifiers = function(value, opt_index) { + return jspb.Message.addToRepeatedField(this, 1, value, opt_index); +}; + + +/** + * Clears the list making it empty but non-null. + * @return {!proto.api_container_api.FilesArtifactsList} returns this + */ +proto.api_container_api.FilesArtifactsList.prototype.clearFilesArtifactsIdentifiersList = function() { + return this.setFilesArtifactsIdentifiersList([]); +}; + + + if (jspb.Message.GENERATE_TO_OBJECT) { @@ -1696,7 +1874,7 @@ proto.api_container_api.ServiceInfo.toObject = function(includeInstance, msg) { shortenedUuid: jspb.Message.getFieldWithDefault(msg, 7, ""), serviceStatus: jspb.Message.getFieldWithDefault(msg, 8, 0), container: (f = msg.getContainer()) && proto.api_container_api.Container.toObject(includeInstance, f), - serviceDirPathsToFilesArtifactsIdentifiersMap: (f = msg.getServiceDirPathsToFilesArtifactsIdentifiersMap()) ? f.toObject(includeInstance, undefined) : [], + serviceDirPathsToFilesArtifactsIdentifiersMap: (f = msg.getServiceDirPathsToFilesArtifactsIdentifiersMap()) ? f.toObject(includeInstance, proto.api_container_api.FilesArtifactsList.toObject) : [], maxMillicpus: jspb.Message.getFieldWithDefault(msg, 11, 0), minMillicpus: jspb.Message.getFieldWithDefault(msg, 12, 0), maxMemoryMegabytes: jspb.Message.getFieldWithDefault(msg, 13, 0), @@ -1781,7 +1959,7 @@ proto.api_container_api.ServiceInfo.deserializeBinaryFromReader = function(msg, case 10: var value = msg.getServiceDirPathsToFilesArtifactsIdentifiersMap(); reader.readMessage(value, function(message, reader) { - jspb.Map.deserializeBinary(message, reader, jspb.BinaryReader.prototype.readString, jspb.BinaryReader.prototype.readString, null, "", ""); + jspb.Map.deserializeBinary(message, reader, jspb.BinaryReader.prototype.readString, jspb.BinaryReader.prototype.readMessage, proto.api_container_api.FilesArtifactsList.deserializeBinaryFromReader, "", new proto.api_container_api.FilesArtifactsList()); }); break; case 11: @@ -1889,7 +2067,7 @@ proto.api_container_api.ServiceInfo.serializeBinaryToWriter = function(message, } f = message.getServiceDirPathsToFilesArtifactsIdentifiersMap(true); if (f && f.getLength() > 0) { - f.serializeBinary(10, writer, jspb.BinaryWriter.prototype.writeString, jspb.BinaryWriter.prototype.writeString); + f.serializeBinary(10, writer, jspb.BinaryWriter.prototype.writeString, jspb.BinaryWriter.prototype.writeMessage, proto.api_container_api.FilesArtifactsList.serializeBinaryToWriter); } f = message.getMaxMillicpus(); if (f !== 0) { @@ -2112,15 +2290,15 @@ proto.api_container_api.ServiceInfo.prototype.hasContainer = function() { /** - * map service_dir_paths_to_files_artifacts_identifiers = 10; + * map service_dir_paths_to_files_artifacts_identifiers = 10; * @param {boolean=} opt_noLazyCreate Do not create the map if * empty, instead returning `undefined` - * @return {!jspb.Map} + * @return {!jspb.Map} */ proto.api_container_api.ServiceInfo.prototype.getServiceDirPathsToFilesArtifactsIdentifiersMap = function(opt_noLazyCreate) { - return /** @type {!jspb.Map} */ ( + return /** @type {!jspb.Map} */ ( jspb.Message.getMapField(this, 10, opt_noLazyCreate, - null)); + proto.api_container_api.FilesArtifactsList)); }; diff --git a/api/typescript/src/core/kurtosis_core_rpc_api_bindings/connect/api_container_service_pb.d.ts b/api/typescript/src/core/kurtosis_core_rpc_api_bindings/connect/api_container_service_pb.d.ts index aff6ac91f9..caff3f6d67 100644 --- a/api/typescript/src/core/kurtosis_core_rpc_api_bindings/connect/api_container_service_pb.d.ts +++ b/api/typescript/src/core/kurtosis_core_rpc_api_bindings/connect/api_container_service_pb.d.ts @@ -235,6 +235,30 @@ export declare enum Container_Status { UNKNOWN = 2, } +/** + * @generated from message api_container_api.FilesArtifactsList + */ +export declare class FilesArtifactsList extends Message { + /** + * @generated from field: repeated string files_artifacts_identifiers = 1; + */ + filesArtifactsIdentifiers: string[]; + + constructor(data?: PartialMessage); + + static readonly runtime: typeof proto3; + static readonly typeName = "api_container_api.FilesArtifactsList"; + static readonly fields: FieldList; + + static fromBinary(bytes: Uint8Array, options?: Partial): FilesArtifactsList; + + static fromJson(jsonValue: JsonValue, options?: Partial): FilesArtifactsList; + + static fromJsonString(jsonString: string, options?: Partial): FilesArtifactsList; + + static equals(a: FilesArtifactsList | PlainMessage | undefined, b: FilesArtifactsList | PlainMessage | undefined): boolean; +} + /** * @generated from message api_container_api.ServiceInfo */ @@ -309,9 +333,9 @@ export declare class ServiceInfo extends Message { /** * Mapping of directory paths on service to names of files artifacts that are mounted to that directory * - * @generated from field: map service_dir_paths_to_files_artifacts_identifiers = 10; + * @generated from field: map service_dir_paths_to_files_artifacts_identifiers = 10; */ - serviceDirPathsToFilesArtifactsIdentifiers: { [key: string]: string }; + serviceDirPathsToFilesArtifactsIdentifiers: { [key: string]: FilesArtifactsList }; /** * @generated from field: uint32 max_millicpus = 11; diff --git a/api/typescript/src/core/kurtosis_core_rpc_api_bindings/connect/api_container_service_pb.js b/api/typescript/src/core/kurtosis_core_rpc_api_bindings/connect/api_container_service_pb.js index 0a7ef67a18..4423ef6949 100644 --- a/api/typescript/src/core/kurtosis_core_rpc_api_bindings/connect/api_container_service_pb.js +++ b/api/typescript/src/core/kurtosis_core_rpc_api_bindings/connect/api_container_service_pb.js @@ -119,6 +119,16 @@ export const Container_Status = proto3.makeEnum( ], ); +/** + * @generated from message api_container_api.FilesArtifactsList + */ +export const FilesArtifactsList = proto3.makeMessageType( + "api_container_api.FilesArtifactsList", + () => [ + { no: 1, name: "files_artifacts_identifiers", kind: "scalar", T: 9 /* ScalarType.STRING */, repeated: true }, + ], +); + /** * @generated from message api_container_api.ServiceInfo */ @@ -134,7 +144,7 @@ export const ServiceInfo = proto3.makeMessageType( { no: 7, name: "shortened_uuid", kind: "scalar", T: 9 /* ScalarType.STRING */ }, { no: 8, name: "service_status", kind: "enum", T: proto3.getEnumType(ServiceStatus) }, { no: 9, name: "container", kind: "message", T: Container }, - { no: 10, name: "service_dir_paths_to_files_artifacts_identifiers", kind: "map", K: 9 /* ScalarType.STRING */, V: {kind: "scalar", T: 9 /* ScalarType.STRING */} }, + { no: 10, name: "service_dir_paths_to_files_artifacts_identifiers", kind: "map", K: 9 /* ScalarType.STRING */, V: {kind: "message", T: FilesArtifactsList} }, { no: 11, name: "max_millicpus", kind: "scalar", T: 13 /* ScalarType.UINT32 */ }, { no: 12, name: "min_millicpus", kind: "scalar", T: 13 /* ScalarType.UINT32 */ }, { no: 13, name: "max_memory_megabytes", kind: "scalar", T: 13 /* ScalarType.UINT32 */ }, diff --git a/cli/cli/commands/service/inspect/inspect.go b/cli/cli/commands/service/inspect/inspect.go index 110155e453..1fffa1c35d 100644 --- a/cli/cli/commands/service/inspect/inspect.go +++ b/cli/cli/commands/service/inspect/inspect.go @@ -184,7 +184,13 @@ func PrintServiceInspect(ctx context.Context, kurtosisBackend backend_interface. jsonMap[ServiceEnvVarsTitleName] = userService.GetContainer().GetEnvVars() jsonMap[ServicePortsTitleName] = userService.GetPrivatePorts() - // TODO: add support for files artifacts entrypoint + serviceDirPathsToFilesArtifactsLists := userService.GetServiceDirPathsToFilesArtifactsIdentifiers() + serviceDirPathsToFilesArtifactsIdentifiers := map[string][]string{} + for serviceName, filesArtifactsList := range serviceDirPathsToFilesArtifactsLists { + serviceDirPathsToFilesArtifactsIdentifiers[serviceName] = filesArtifactsList.FilesArtifactsIdentifiers + } + + jsonMap[ServiceFilesTitleName] = serviceDirPathsToFilesArtifactsIdentifiers // TODO: add support for cpu min max memory var marshaled []byte diff --git a/cli/cli/commands/service/update/update.go b/cli/cli/commands/service/update/update.go index b18a665dfd..e6216bea0d 100644 --- a/cli/cli/commands/service/update/update.go +++ b/cli/cli/commands/service/update/update.go @@ -275,9 +275,12 @@ func run( currPorts = ports.(map[string]*kurtosis_core_rpc_api_bindings.Port) } - var currFilesArtifactsMountpoint map[string]string + currFilesArtifactsMountpoint := map[string]string{} if filesArtifactsMountpoints, ok := serviceInspectOutputMap[inspect.ServiceFilesTitleName]; ok { - currFilesArtifactsMountpoint = filesArtifactsMountpoints.(map[string]string) + currFilesArtifactsMountpointWithMultipleMounts := filesArtifactsMountpoints.(map[string][]string) + for svcName, mountpoints := range currFilesArtifactsMountpointWithMultipleMounts { + currFilesArtifactsMountpoint[svcName] = mountpoints[0] + } } var currEntrypoint []string @@ -390,6 +393,7 @@ func run( mergedMemoryMegabytes, // TODO: get in svc inspect mergedMinCpuMillicores, // TODO: get in svc inspect mergedMinMemoryBytes) // TODO: get in service inspect + //logrus.Infof("SERVICE CONFIG STRING: %v", serviceConfigStr) // call run add service starlark script addServiceStarlarkStr := add.GetAddServiceStarlarkScript(serviceName, serviceConfigStr) diff --git a/core/server/api_container/main.go b/core/server/api_container/main.go index 1e29148540..d6a7f3cf00 100644 --- a/core/server/api_container/main.go +++ b/core/server/api_container/main.go @@ -184,7 +184,7 @@ func runMain() error { return stacktrace.Propagate(err, "An error occurred while creating the interpretation time value store") } - serviceNetwork, err := createServiceNetwork(kurtosisBackend, enclaveDataDir, serverArgs, ownIpAddress, enclaveDb, interpretationTimeValueStore) + serviceNetwork, err := createServiceNetwork(kurtosisBackend, enclaveDataDir, serverArgs, ownIpAddress, enclaveDb) if err != nil { return stacktrace.Propagate(err, "An error occurred creating the service network") } @@ -278,7 +278,6 @@ func createServiceNetwork( args *args.APIContainerArgs, ownIpAddress net.IP, enclaveDb *enclave_db.EnclaveDB, - interpretationTimeValueStore *interpretation_time_value_store.InterpretationTimeValueStore, ) (service_network.ServiceNetwork, error) { enclaveIdStr := args.EnclaveUUID enclaveUuid := enclave.EnclaveUUID(enclaveIdStr) @@ -289,7 +288,7 @@ func createServiceNetwork( args.Version, ) - serviceNetwork, err := service_network.NewDefaultServiceNetwork(enclaveUuid, apiContainerInfo, kurtosisBackend, enclaveDataDir, enclaveDb, interpretationTimeValueStore) + serviceNetwork, err := service_network.NewDefaultServiceNetwork(enclaveUuid, apiContainerInfo, kurtosisBackend, enclaveDataDir, enclaveDb) if err != nil { return nil, stacktrace.Propagate(err, "An error occurred while creating the default service network") diff --git a/core/server/api_container/server/api_container_service.go b/core/server/api_container/server/api_container_service.go index 7fe62e8f11..8cea1e89c1 100644 --- a/core/server/api_container/server/api_container_service.go +++ b/core/server/api_container/server/api_container_service.go @@ -892,11 +892,16 @@ func (apicService *ApiContainerService) getServiceInfoForIdentifier(ctx context. } serviceConfig, err := apicService.interpretationTimeValueStore.GetServiceConfig(serviceObj.GetRegistration().GetName()) if err != nil { - + return nil, stacktrace.Propagate(err, "An error occurred getting service config from interpretation time value store.") } - serviceInfo, err := getServiceInfoFromServiceObj(serviceObj) + + filesArtifactsExpansions := serviceConfig.GetFilesArtifactsExpansion() + serviceDirPathsToFilesArtifactsMounts := filesArtifactsExpansions.ServiceDirpathsToArtifactIdentifiers + logrus.Infof("SERVICE DIR PATHS TO FILES ARTIFACTS IDENTIFIERS: %v", serviceDirPathsToFilesArtifactsMounts) + + serviceInfo, err := getServiceInfoFromServiceObj(serviceObj, serviceDirPathsToFilesArtifactsMounts) if err != nil { - return nil, stacktrace.Propagate(err, "an error occurred while converting service obj for service with id '%v' to service info", serviceIdentifier) + return nil, stacktrace.Propagate(err, "A error occurred while converting service obj for service with id '%v' to service info", serviceIdentifier) } return serviceInfo, nil } @@ -1045,7 +1050,7 @@ func (apicService *ApiContainerService) runStarlark( func getServiceInfosFromServiceObjs(services map[service.ServiceUUID]*service.Service) (map[string]*kurtosis_core_rpc_api_bindings.ServiceInfo, error) { serviceInfos := map[string]*kurtosis_core_rpc_api_bindings.ServiceInfo{} for uuid, serviceObj := range services { - serviceInfo, err := getServiceInfoFromServiceObj(serviceObj) + serviceInfo, err := getServiceInfoFromServiceObj(serviceObj, nil) if err != nil { return nil, stacktrace.Propagate(err, "there was an error converting the service obj for service with uuid '%v' and name '%v' to service info", uuid, serviceObj.GetRegistration().GetName()) } @@ -1054,7 +1059,7 @@ func getServiceInfosFromServiceObjs(services map[service.ServiceUUID]*service.Se return serviceInfos, nil } -func getServiceInfoFromServiceObj(serviceObj *service.Service) (*kurtosis_core_rpc_api_bindings.ServiceInfo, error) { +func getServiceInfoFromServiceObj(serviceObj *service.Service, serviceDirPathsToFilesArtifactsIdentifiers map[string][]string) (*kurtosis_core_rpc_api_bindings.ServiceInfo, error) { privatePorts := serviceObj.GetPrivatePorts() privateIp := serviceObj.GetRegistration().GetPrivateIP() maybePublicIp := serviceObj.GetMaybePublicIP() @@ -1094,8 +1099,6 @@ func getServiceInfoFromServiceObj(serviceObj *service.Service) (*kurtosis_core_r EnvVars: serviceContainer.GetEnvVars(), } - serviceDirPathsToFilesArtifactsIdentifiers := map[string]string{} - maxMillicpus := uint32(0) minMillicpus := uint32(0) maxMemoryMegabytes := uint32(0) From b7bd67e7dc331d7201a9aa8f53000da869b9a25b Mon Sep 17 00:00:00 2001 From: Tedi Mitiku Date: Thu, 27 Mar 2025 12:21:16 -0400 Subject: [PATCH 06/48] pass all svc config in proto, use json struct, refactor helpers --- .../binding_constructors.go | 8 +- .../lib/services/service_config_builder.go | 169 ++++++++- api/protobuf/core/api_container_service.proto | 37 +- cli/cli/commands/service/add/add.go | 272 +------------- cli/cli/commands/service/inspect/inspect.go | 90 ++--- cli/cli/commands/service/service.go | 355 ++++++++++++++++++ cli/cli/commands/service/update/update.go | 143 +++---- .../server/api_container_service.go | 22 +- .../golang/test_helpers/test_helpers.go | 8 +- 9 files changed, 666 insertions(+), 438 deletions(-) diff --git a/api/golang/core/lib/binding_constructors/binding_constructors.go b/api/golang/core/lib/binding_constructors/binding_constructors.go index c46f9d3e4c..3296480c28 100644 --- a/api/golang/core/lib/binding_constructors/binding_constructors.go +++ b/api/golang/core/lib/binding_constructors/binding_constructors.go @@ -362,18 +362,12 @@ func NewServiceInfo( maybePublicPorts map[string]*kurtosis_core_rpc_api_bindings.Port, serviceStatus kurtosis_core_rpc_api_bindings.ServiceStatus, container *kurtosis_core_rpc_api_bindings.Container, - serviceDirPathsToFilesArtifactsIdentifiers map[string][]string, + serviceDirPathsToFilesArtifactsList map[string]*kurtosis_core_rpc_api_bindings.FilesArtifactsList, minMillicpus uint32, maxMillicpus uint32, minMemoryMegabytes uint32, maxMemoryMegabytes uint32, ) *kurtosis_core_rpc_api_bindings.ServiceInfo { - serviceDirPathsToFilesArtifactsList := map[string]*kurtosis_core_rpc_api_bindings.FilesArtifactsList{} - for serviceName, filesArtifactsIdentifiers := range serviceDirPathsToFilesArtifactsIdentifiers { - serviceDirPathsToFilesArtifactsList[serviceName] = &kurtosis_core_rpc_api_bindings.FilesArtifactsList{ - FilesArtifactsIdentifiers: filesArtifactsIdentifiers, - } - } return &kurtosis_core_rpc_api_bindings.ServiceInfo{ ServiceUuid: uuid, diff --git a/api/golang/core/lib/services/service_config_builder.go b/api/golang/core/lib/services/service_config_builder.go index 5fc27502ac..01faa9f92a 100644 --- a/api/golang/core/lib/services/service_config_builder.go +++ b/api/golang/core/lib/services/service_config_builder.go @@ -9,6 +9,46 @@ import ( type FilesArtifactUUID string type FileArtifactName string +type Port struct { + Number uint32 `json:"number" yaml:"number"` + Transport int `json:"transport" yaml:"transport"` // e.g. "TCP", "UDP" + MaybeApplicationProtocol string `json:"maybe_application_protocol,omitempty" yaml:"maybe_application_protocol,omitempty"` + Wait string `json:"wait,omitempty" yaml:"wait,omitempty"` +} + +type User struct { + UID int `json:"uid" yaml:"uid"` + GID int `json:"gid,omitempty" yaml:"gid,omitempty"` +} + +type Toleration struct { + Key string `json:"key" yaml:"key"` + Value string `json:"value" yaml:"value"` + Operator string `json:"operator" yaml:"operator"` + Effect string `json:"effect" yaml:"effect"` + TolerationSeconds int64 `json:"toleration_seconds" yaml:"toleration_seconds"` +} + +type ServiceConfig struct { + Image string `json:"image" yaml:"image"` + PrivatePorts map[string]Port `json:"ports,omitempty" yaml:"ports,omitempty"` + PublicPorts map[string]Port `json:"public_ports,omitempty" yaml:"public_ports,omitempty"` + Files map[string]string `json:"files,omitempty" yaml:"files,omitempty"` + Entrypoint []string `json:"entrypoint,omitempty" yaml:"entrypoint,omitempty"` + Cmd []string `json:"cmd,omitempty" yaml:"cmd,omitempty"` + EnvVars map[string]string `json:"env_vars,omitempty" yaml:"env_vars,omitempty"` + PrivateIPAddressPlaceholder string `json:"private_ip_address_placeholder,omitempty" yaml:"private_ip_address_placeholder,omitempty"` + MaxMillicpus uint32 `json:"max_cpu,omitempty" yaml:"max_cpu,omitempty"` + MinMillicpus uint32 `json:"min_cpu,omitempty" yaml:"min_cpu,omitempty"` + MaxMemory uint32 `json:"max_memory,omitempty" yaml:"max_memory,omitempty"` + MinMemory uint32 `json:"min_memory,omitempty" yaml:"min_memory,omitempty"` + User *User `json:"user,omitempty" yaml:"user,omitempty"` + Tolerations []Toleration `json:"tolerations,omitempty" yaml:"tolerations,omitempty"` + Labels map[string]string `json:"labels,omitempty" yaml:"labels,omitempty"` + NodeSelectors map[string]string `json:"node_selectors,omitempty" yaml:"node_selectors,omitempty"` + TiniEnabled *bool `json:"tini_enabled,omitempty" yaml:"tini_enabled,omitempty"` +} + func portToStarlark(port *kurtosis_core_rpc_api_bindings.Port) string { starlarkFields := []string{} starlarkFields = append(starlarkFields, fmt.Sprintf(`number=%d`, port.GetNumber())) @@ -24,7 +64,7 @@ func portToStarlark(port *kurtosis_core_rpc_api_bindings.Port) string { return fmt.Sprintf("PortSpec(%s)", strings.Join(starlarkFields, ",")) } -func GetServiceConfigStarlark( +func GetSimpleServiceConfigStarlark( containerImageName string, privatePorts map[string]*kurtosis_core_rpc_api_bindings.Port, fileArtifactMountPoints map[string]string, @@ -89,3 +129,130 @@ func GetServiceConfigStarlark( return fmt.Sprintf("ServiceConfig(%s)", strings.Join(starlarkFields, ",")) } + +func GetFullServiceConfigStarlark( + containerImageName string, + privatePorts map[string]*kurtosis_core_rpc_api_bindings.Port, + fileArtifactMountPoints map[string]string, + entrypointArgs []string, + cmdArgs []string, + envVars map[string]string, + cpuAllocationMillicpus uint32, + memoryAllocationMegabytes uint32, + minCpuMilliCores uint32, + minMemoryMegaBytes uint32, + user *User, + tolerations []Toleration, + nodeSelectors map[string]string, + labels map[string]string, + tiniEnabled *bool, +) string { + starlarkFields := []string{} + starlarkFields = append(starlarkFields, fmt.Sprintf(`image=%q`, containerImageName)) + + // Ports + portStrings := []string{} + for portId, port := range privatePorts { + portStrings = append(portStrings, fmt.Sprintf(`%q: %s`, portId, portToStarlark(port))) + } + if len(portStrings) > 0 { + starlarkFields = append(starlarkFields, fmt.Sprintf(`ports={%s}`, strings.Join(portStrings, ","))) + } + + // Files + fileStrings := []string{} + for filePath, artifactName := range fileArtifactMountPoints { + fileStrings = append(fileStrings, fmt.Sprintf(`%q: %q`, filePath, artifactName)) + } + if len(fileStrings) > 0 { + starlarkFields = append(starlarkFields, fmt.Sprintf(`files={%s}`, strings.Join(fileStrings, ","))) + } + + // Entrypoint + if len(entrypointArgs) > 0 { + quotedEntrypointArgs := []string{} + for _, arg := range entrypointArgs { + quotedEntrypointArgs = append(quotedEntrypointArgs, fmt.Sprintf(`%q`, arg)) + } + starlarkFields = append(starlarkFields, fmt.Sprintf(`entrypoint=[%s]`, strings.Join(quotedEntrypointArgs, ", "))) + } + + // Cmd + if len(cmdArgs) > 0 { + quotedCmdArgs := []string{} + for _, arg := range cmdArgs { + quotedCmdArgs = append(quotedCmdArgs, fmt.Sprintf(`%q`, arg)) + } + starlarkFields = append(starlarkFields, fmt.Sprintf(`cmd=[%s]`, strings.Join(quotedCmdArgs, ", "))) + } + + // Env Vars + if len(envVars) > 0 { + envVarStrings := []string{} + for k, v := range envVars { + envVarStrings = append(envVarStrings, fmt.Sprintf(`%q: %q`, k, v)) + } + starlarkFields = append(starlarkFields, fmt.Sprintf(`env_vars={%s}`, strings.Join(envVarStrings, ","))) + } + + // Optional simple fields + if cpuAllocationMillicpus != 0 { + starlarkFields = append(starlarkFields, fmt.Sprintf(`max_cpu=%d`, cpuAllocationMillicpus)) + } + if memoryAllocationMegabytes != 0 { + starlarkFields = append(starlarkFields, fmt.Sprintf(`max_memory=%d`, memoryAllocationMegabytes)) + } + if minCpuMilliCores != 0 { + starlarkFields = append(starlarkFields, fmt.Sprintf(`min_cpu=%d`, minCpuMilliCores)) + } + if minMemoryMegaBytes != 0 { + starlarkFields = append(starlarkFields, fmt.Sprintf(`min_memory=%d`, minMemoryMegaBytes)) + } + + // User + if user != nil { + userStr := fmt.Sprintf("User(uid=%d", user.UID) + if user.GID != 0 { + userStr += fmt.Sprintf(", gid=%d", user.GID) + } + userStr += ")" + starlarkFields = append(starlarkFields, fmt.Sprintf(`user=%s`, userStr)) + } + + // Tolerations + if len(tolerations) > 0 { + tolerationStrs := []string{} + for _, t := range tolerations { + tolerationStrs = append(tolerationStrs, fmt.Sprintf( + `Toleration(key=%q, value=%q, operator=%q, effect=%q, toleration_seconds=%d)`, + t.Key, t.Value, t.Operator, t.Effect, t.TolerationSeconds, + )) + } + starlarkFields = append(starlarkFields, fmt.Sprintf(`tolerations=[%s]`, strings.Join(tolerationStrs, ", "))) + } + + // Node selectors + if len(nodeSelectors) > 0 { + selectorStrs := []string{} + for k, v := range nodeSelectors { + selectorStrs = append(selectorStrs, fmt.Sprintf(`%q: %q`, k, v)) + } + starlarkFields = append(starlarkFields, fmt.Sprintf(`node_selectors={%s}`, strings.Join(selectorStrs, ", "))) + } + + // Labels + if len(labels) > 0 { + labelStrs := []string{} + for k, v := range labels { + labelStrs = append(labelStrs, fmt.Sprintf(`%q: %q`, k, v)) + } + starlarkFields = append(starlarkFields, fmt.Sprintf(`labels={%s}`, strings.Join(labelStrs, ", "))) + } + + // Tini + if tiniEnabled != nil { + starlarkFields = append(starlarkFields, fmt.Sprintf(`tini_enabled=%t`, *tiniEnabled)) + } + + return fmt.Sprintf("ServiceConfig(%s)", strings.Join(starlarkFields, ", ")) +} diff --git a/api/protobuf/core/api_container_service.proto b/api/protobuf/core/api_container_service.proto index 648e6ae519..13c2663017 100644 --- a/api/protobuf/core/api_container_service.proto +++ b/api/protobuf/core/api_container_service.proto @@ -115,6 +115,26 @@ message FilesArtifactsList { repeated string files_artifacts_identifiers = 1; } +// Equivalent of user on ServiceConfig +message User { + string username = 1; + uint32 uid = 2; + uint32 gid = 3; +} + +// Equivalent of tolerations on ServiceConfig +message Toleration { + string key = 1; + + string operator = 2; + + string value = 3; + + string effect = 4; + + int64 toleration_seconds = 5; +} + message ServiceInfo { // UUID of the service string service_uuid = 1; @@ -148,7 +168,7 @@ message ServiceInfo { Container container = 9; // Mapping of directory paths on service to names of files artifacts that are mounted to that directory - map service_dir_paths_to_files_artifacts_identifiers = 10; + map service_dir_paths_to_files_artifacts_list = 10; uint32 max_millicpus = 11; @@ -157,6 +177,21 @@ message ServiceInfo { uint32 max_memory_megabytes = 13; uint32 min_memory_megabytes = 14; + + // Optional user identity for the service + optional User user = 15; + + // Optional list of Kubernetes tolerations + repeated Toleration tolerations = 16; + + // Optional node selectors for pod placement + map node_selectors = 17; + + // Optional labels + map labels = 18; + + // Whether Tini is enabled + optional bool tini_enabled = 19; } // ============================================================================================== diff --git a/cli/cli/commands/service/add/add.go b/cli/cli/commands/service/add/add.go index dafa53c9da..d58fb2a0e8 100644 --- a/cli/cli/commands/service/add/add.go +++ b/cli/cli/commands/service/add/add.go @@ -3,9 +3,7 @@ package add import ( "context" "fmt" - "github.com/kurtosis-tech/kurtosis/api/golang/core/lib/enclaves" - "github.com/kurtosis-tech/kurtosis/api/golang/core/lib/starlark_run_config" - "strconv" + "github.com/kurtosis-tech/kurtosis/cli/cli/commands/service" "strings" "github.com/kurtosis-tech/kurtosis/api/golang/core/kurtosis_core_rpc_api_bindings" @@ -51,8 +49,6 @@ const ( portNumberProtocolDelimiter = "/" portDeclarationsDelimiter = "," portApplicationProtocolDelimiter = ":" - portNumberUintParsingBase = 10 - portNumberUintParsingBits = 16 filesFlagKey = "files" filesArtifactMountsDelimiter = "," @@ -65,16 +61,6 @@ const ( privateIPAddressPlaceholderKey = "ip-address-placeholder" privateIPAddressPlaceholderDefault = "KURTOSIS_IP_ADDR_PLACEHOLDER" - // Each envvar should be KEY1=VALUE1, which means we should have two components to each envvar declaration - expectedNumberKeyValueComponentsInEnvvarDeclaration = 2 - portNumberIndex = 0 - transportProtocolIndex = 1 - expectedPortIdSpecComponentsCount = 2 - expectedMountFragmentsCount = 2 - - minRemainingPortSpecComponents = 1 - maxRemainingPortSpecComponents = 2 - emptyApplicationProtocol = "" linkDelimiter = "://" @@ -126,10 +112,10 @@ var ServiceAddCmd = &engine_consuming_kurtosis_command.EngineConsumingKurtosisCo Key: serviceNameArgKey, }, { - Key: serviceImageArgKey, + Key: service.ImageKey, }, { - Key: cmdArgsArgKey, + Key: service.CmdKey, IsOptional: true, IsGreedy: true, DefaultValue: []string{}, @@ -137,14 +123,14 @@ var ServiceAddCmd = &engine_consuming_kurtosis_command.EngineConsumingKurtosisCo }, Flags: []*flags.FlagConfig{ { - Key: entrypointBinaryFlagKey, + Key: service.EntrypointFlagKey, Usage: "ENTRYPOINT binary that will be used when running the container, overriding the image's default ENTRYPOINT", // TODO Make this a string list Type: flags.FlagType_String, }, { // TODO We currently can't handle commas, so allow users to set the flag multiple times to set multiple envvars - Key: envvarsFlagKey, + Key: service.EnvvarsFlagKey, Usage: fmt.Sprintf( "String containing environment variables that will be set when running the container, in "+ "the form \"KEY1%vVALUE1%vKEY2%vVALUE2\"", @@ -155,7 +141,7 @@ var ServiceAddCmd = &engine_consuming_kurtosis_command.EngineConsumingKurtosisCo Type: flags.FlagType_String, }, { - Key: portsFlagKey, + Key: service.PortsFlagKey, Usage: fmt.Sprintf(`String containing declarations of ports that the container will listen on, in the form, %q`+ ` where %q is a user friendly string for identifying the port, %q is required field, %q is an optional field which must be either`+ ` '%v' or '%v' and defaults to '%v' if omitted and %q is user defined optional value. %v`, @@ -172,7 +158,7 @@ var ServiceAddCmd = &engine_consuming_kurtosis_command.EngineConsumingKurtosisCo Type: flags.FlagType_String, }, { - Key: filesFlagKey, + Key: service.FilesFlagKey, Usage: fmt.Sprintf( "String containing declarations of files paths on the container -> artifact name where the contents of those "+ "files artifacts should be mounted, in the form \"MOUNTPATH1%vARTIFACTNAME1%vMOUNTPATH2%vARTIFACTNAME2\" where "+ @@ -286,7 +272,7 @@ func run( ) } - _, err = RunAddServiceStarlarkScript(ctx, serviceName, enclaveIdentifier, GetAddServiceStarlarkScript(serviceName, serviceConfigStarlark), enclaveCtx) + _, err = service.RunAddServiceStarlarkScript(ctx, serviceName, enclaveIdentifier, service.GetAddServiceStarlarkScript(serviceName, serviceConfigStarlark), enclaveCtx) if err != nil { return err // already wrapped } @@ -379,29 +365,6 @@ func run( return nil } -func GetAddServiceStarlarkScript(serviceName string, serviceConfigStarlark string) string { - return fmt.Sprintf(`def run(plan): - plan.add_service(name = "%s", config = %s) -`, serviceName, serviceConfigStarlark) -} - -func RunAddServiceStarlarkScript(ctx context.Context, serviceName, enclaveIdentifier, starlarkScript string, enclaveCtx *enclaves.EnclaveContext) (*enclaves.StarlarkRunResult, error) { - starlarkRunResult, err := enclaveCtx.RunStarlarkScriptBlocking(ctx, starlarkScript, starlark_run_config.NewRunStarlarkConfig()) - if err != nil { - return nil, stacktrace.Propagate(err, "An error has occurred when running Starlark to add service") - } - if starlarkRunResult.InterpretationError != nil { - return nil, stacktrace.NewError("An error has occurred when adding service: %s\nThis is a bug in Kurtosis, please report.", starlarkRunResult.InterpretationError) - } - if len(starlarkRunResult.ValidationErrors) > 0 { - return nil, stacktrace.NewError("An error occurred when validating add service '%v' to enclave '%v': %s", serviceName, enclaveIdentifier, starlarkRunResult.ValidationErrors) - } - if starlarkRunResult.ExecutionError != nil { - return nil, stacktrace.NewError("An error occurred adding service '%v' to enclave '%v': %s", serviceName, enclaveIdentifier, starlarkRunResult.ExecutionError) - } - return starlarkRunResult, nil -} - // GetServiceConfigStarlark TODO(victor.colombo): Extract this to a more reasonable place func GetServiceConfigStarlark( image string, @@ -416,232 +379,21 @@ func GetServiceConfigStarlark( minMemoryMegaBytes int, privateIPAddressPlaceholder string, ) (string, error) { - envvarsMap, err := ParseEnvVarsStr(envvarsStr) + envvarsMap, err := service.ParseEnvVarsStr(envvarsStr) if err != nil { return "", stacktrace.Propagate(err, "An error occurred parsing environment variables string '%v'", envvarsStr) } - ports, err := ParsePortsStr(portsStr) + ports, err := service.ParsePortsStr(portsStr) if err != nil { return "", stacktrace.Propagate(err, "An error occurred parsing ports string '%v'", portsStr) } - filesArtifactMounts, err := ParseFilesArtifactMountsStr(filesArtifactMountsStr) + filesArtifactMounts, err := service.ParseFilesArtifactMountsStr(filesArtifactMountsStr) if err != nil { return "", stacktrace.Propagate(err, "An error occurred parsing files artifact mounts string '%v'", filesArtifactMountsStr) } - return services.GetServiceConfigStarlark(image, ports, filesArtifactMounts, entrypoint, cmdArgs, envvarsMap, privateIPAddressPlaceholder, cpuAllocationMillicpus, memoryAllocationMegabytes, minCpuMilliCores, minMemoryMegaBytes), nil -} - -// Parses a string in the form KEY1=VALUE1,KEY2=VALUE2 into a map of strings -// An empty string will result in an empty map -// Empty strings will be skipped (e.g. ',,,' will result in an empty map) -func ParseEnvVarsStr(envvarsStr string) (map[string]string, error) { - result := map[string]string{} - if envvarsStr == "" { - return result, nil - } - - allEnvvarDeclarationStrs := strings.Split(envvarsStr, envvarDeclarationsDelimiter) - for _, envvarDeclarationStr := range allEnvvarDeclarationStrs { - if len(strings.TrimSpace(envvarDeclarationStr)) == 0 { - continue - } - - envvarKeyValueComponents := strings.SplitN(envvarDeclarationStr, envvarKeyValueDelimiter, expectedNumberKeyValueComponentsInEnvvarDeclaration) - if len(envvarKeyValueComponents) < expectedNumberKeyValueComponentsInEnvvarDeclaration { - return nil, stacktrace.NewError("Environment declaration string '%v' must be of the form KEY1%vVALUE1", envvarDeclarationStr, envvarKeyValueDelimiter) - } - key := envvarKeyValueComponents[0] - value := envvarKeyValueComponents[1] - - preexistingValue, found := result[key] - if found { - return nil, stacktrace.NewError( - "Cannot declare environment variable '%v' assigned to value '%v' because the key has previously been assigned to value '%v'", - key, - value, - preexistingValue, - ) - } - - result[key] = value - } - - return result, nil -} - -// Parses a string in the form PORTID1=1234,PORTID2=5678/udp -// An empty string will result in an empty map -// Empty strings will be skipped (e.g. ',,,' will result in an empty map) -func ParsePortsStr(portsStr string) (map[string]*kurtosis_core_rpc_api_bindings.Port, error) { - result := map[string]*kurtosis_core_rpc_api_bindings.Port{} - if strings.TrimSpace(portsStr) == "" { - return result, nil - } - - allPortDeclarationStrs := strings.Split(portsStr, portDeclarationsDelimiter) - for _, portDeclarationStr := range allPortDeclarationStrs { - if len(strings.TrimSpace(portDeclarationStr)) == 0 { - continue - } - - portIdSpecComponents := strings.Split(portDeclarationStr, portIdSpecDelimiter) - if len(portIdSpecComponents) != expectedPortIdSpecComponentsCount { - return nil, stacktrace.NewError("Port declaration string '%v' must be of the form PORTID%vSPEC", portDeclarationStr, portIdSpecDelimiter) - } - portId := portIdSpecComponents[0] - specStr := portIdSpecComponents[1] - if len(strings.TrimSpace(portId)) == 0 { - return nil, stacktrace.NewError("Port declaration with spec string '%v' has an empty port ID", specStr) - } - portSpec, err := parsePortSpecStr(specStr) - if err != nil { - return nil, stacktrace.Propagate(err, "An error occurred parsing port spec string '%v' for port with ID '%v'", specStr, portId) - } - - if _, found := result[portId]; found { - return nil, stacktrace.NewError( - "Cannot define port '%v' with spec '%v' because it is already defined", - portId, - specStr, - ) - } - - result[portId] = portSpec - } - - return result, nil -} - -func parsePortSpecStr(specStr string) (*kurtosis_core_rpc_api_bindings.Port, error) { - if len(strings.TrimSpace(specStr)) == 0 { - return nil, stacktrace.NewError("Cannot parse empty spec string") - } - - maybeApplicationProtocol, remainingPortSpec, err := getMaybeApplicationProtocolFromPortSpecString(specStr) - if err != nil { - return nil, stacktrace.Propagate(err, "Error occurred while parsing application protocol '%v' in port spec '%v'", maybeApplicationProtocol, specStr) - } - - remainingPortSpecComponents := strings.Split(remainingPortSpec, portNumberProtocolDelimiter) - numRemainingPortSpecComponents := len(remainingPortSpecComponents) - if numRemainingPortSpecComponents > maxRemainingPortSpecComponents { - return nil, stacktrace.NewError( - `Invalid port spec string, expected format is %q but got '%v'`, - serviceAddSpec, - specStr, - ) - } - - portNumberUint16, err := getPortNumberFromPortSpecString(remainingPortSpecComponents[portNumberIndex]) - if err != nil { - return nil, stacktrace.Propagate(err, "Error occurred while parsing port number '%v' in port spec '%v'", remainingPortSpecComponents[portNumberIndex], specStr) - } - - transportProtocol := defaultTransportProtocolStr - if numRemainingPortSpecComponents > minRemainingPortSpecComponents { - transportProtocol = remainingPortSpecComponents[transportProtocolIndex] - } - - transportProtocolFromEnum, err := getTransportProtocolFromPortSpecString(transportProtocol) - if err != nil { - return nil, stacktrace.Propagate(err, "Error occurred while parsing transport protocol '%v' in port spec '%v'", remainingPortSpecComponents[transportProtocolIndex], specStr) - } - return &kurtosis_core_rpc_api_bindings.Port{ - Number: portNumberUint16, - TransportProtocol: transportProtocolFromEnum, - MaybeApplicationProtocol: maybeApplicationProtocol, - MaybeWaitTimeout: defaultPortWaitTimeoutStr, //TODO we should add this to the port's arguments instead of using only a default value - Locked: nil, - Alias: nil, - }, nil -} - -/* -* -This method takes in port protocol string and parses it to get application protocol. -It looks for `:` delimiter and splits the string into array of at most size 2. If the length -of array is 2 then application protocol exists, otherwise it does not. This is basically what -strings.Cut() does. // TODO: use that instead once we update go version -*/ -func getMaybeApplicationProtocolFromPortSpecString(portProtocolStr string) (string, string, error) { - - beforeDelimiter, afterDelimiter, foundDelimiter := strings.Cut(portProtocolStr, portApplicationProtocolDelimiter) - - if !foundDelimiter { - return emptyApplicationProtocol, beforeDelimiter, nil - } - - if foundDelimiter && beforeDelimiter == emptyApplicationProtocol { - return emptyApplicationProtocol, "", stacktrace.NewError("optional application protocol argument cannot be empty") - } - - return beforeDelimiter, afterDelimiter, nil -} - -func getPortNumberFromPortSpecString(portNumberStr string) (uint32, error) { - portNumberUint64, err := strconv.ParseUint(portNumberStr, portNumberUintParsingBase, portNumberUintParsingBits) - if err != nil { - return 0, stacktrace.Propagate( - err, - "An error occurred parsing port number string '%v' with base '%v' and bits '%v'", - portNumberStr, - portNumberUintParsingBase, - portNumberUintParsingBits, - ) - } - portNumberUint32 := uint32(portNumberUint64) - return portNumberUint32, nil -} - -func getTransportProtocolFromPortSpecString(portSpec string) (kurtosis_core_rpc_api_bindings.Port_TransportProtocol, error) { - transportProtocolEnumInt, found := kurtosis_core_rpc_api_bindings.Port_TransportProtocol_value[strings.ToUpper(portSpec)] - if !found { - return 0, stacktrace.NewError("Unrecognized port protocol '%v'", portSpec) - } - return kurtosis_core_rpc_api_bindings.Port_TransportProtocol(transportProtocolEnumInt), nil -} - -func ParseFilesArtifactMountsStr(filesArtifactMountsStr string) (map[string]string, error) { - result := map[string]string{} - if strings.TrimSpace(filesArtifactMountsStr) == "" { - return result, nil - } - - // NOTE: we might actually want to allow the same artifact being mounted in multiple places - allMountStrs := strings.Split(filesArtifactMountsStr, filesArtifactMountsDelimiter) - for idx, mountStr := range allMountStrs { - trimmedMountStr := strings.TrimSpace(mountStr) - if len(trimmedMountStr) == 0 { - continue - } - - mountFragments := strings.Split(trimmedMountStr, filesArtifactMountpointDelimiter) - if len(mountFragments) != expectedMountFragmentsCount { - return nil, stacktrace.NewError( - "Files artifact mountpoint string %v was '%v' but should be in the form 'mountpoint%sfiles_artifact_name'", - idx, - trimmedMountStr, - filesArtifactMountpointDelimiter, - ) - } - mountpoint := mountFragments[0] - filesArtifactName := mountFragments[1] - - if existingName, found := result[mountpoint]; found { - return nil, stacktrace.NewError( - "Mountpoint '%v' is declared twice; once to artifact name '%v' and again to artifact name '%v'", - mountpoint, - existingName, - filesArtifactName, - ) - } - - result[mountpoint] = filesArtifactName - } - - return result, nil + return services.GetSimpleServiceConfigStarlark(image, ports, filesArtifactMounts, entrypoint, cmdArgs, envvarsMap, privateIPAddressPlaceholder, cpuAllocationMillicpus, memoryAllocationMegabytes, minCpuMilliCores, minMemoryMegaBytes), nil } func generateExampleForPortFlag() string { diff --git a/cli/cli/commands/service/inspect/inspect.go b/cli/cli/commands/service/inspect/inspect.go index 1fffa1c35d..bb66dfb108 100644 --- a/cli/cli/commands/service/inspect/inspect.go +++ b/cli/cli/commands/service/inspect/inspect.go @@ -9,6 +9,8 @@ import ( "context" "encoding/json" "fmt" + "github.com/kurtosis-tech/kurtosis/api/golang/core/lib/services" + "github.com/kurtosis-tech/kurtosis/cli/cli/commands/service" "gopkg.in/yaml.v3" "strings" @@ -48,19 +50,14 @@ const ( jsonOutputFormat = "json" - ServiceNameTitleName = "Name" - ServiceUUIDTitleName = "UUID" - ServiceStatusTitleName = "Status" - ServiceImageTitleName = "Image" - ServicePortsTitleName = "Ports" - ServiceEntrypointArgsTitleName = "ENTRYPOINT" - ServiceCmdArgsTitleName = "CMD" - ServiceEnvVarsTitleName = "ENV" - ServiceFilesTitleName = "Files" - ServiceMaxCpuAllocationTitleName = "MaxCpu" - ServiceMinCpuAllocationTitleName = "MinCpu" - ServiceMemoryAllocationTitleName = "MaxMemory" - ServiceMinMemoryAllocationTitleName = "MinMemory" + ServiceNameTitleName = "Name" + ServiceUUIDTitleName = "UUID" + ServiceStatusTitleName = "Status" + ServiceImageTitleName = "Image" + ServicePortsTitleName = "Ports" + ServiceEntrypointArgsTitleName = "ENTRYPOINT" + ServiceCmdArgsTitleName = "CMD" + ServiceEnvVarsTitleName = "ENV" kurtosisBackendCtxKey = "kurtosis-backend" engineClientCtxKey = "engine-client" @@ -142,72 +139,33 @@ func run( return stacktrace.Propagate(err, "An error occurred creating Kurtosis Context from local engine") } - if _, err = PrintServiceInspect(ctx, kurtosisBackend, kurtosisCtx, enclaveIdentifier, serviceIdentifier, showFullUuid, outputFormat, true); err != nil { + serviceInfo, serviceConfig, err := service.GetServiceInfo(ctx, kurtosisCtx, enclaveIdentifier, serviceIdentifier) + if err != nil { + return stacktrace.Propagate(err, "An error occurred getting service info of '%v' from '%v'.", enclaveIdentifier, serviceIdentifier) + } + + if err = PrintServiceInspect(serviceInfo, serviceConfig, showFullUuid, outputFormat); err != nil { // this is already wrapped up return err } return nil } -func PrintServiceInspect(ctx context.Context, kurtosisBackend backend_interface.KurtosisBackend, kurtosisCtx *kurtosis_context.KurtosisContext, enclaveIdentifier string, serviceIdentifier string, showFullUuid bool, outputFormat string, shouldPrintOutputFormat bool) (map[string]interface{}, error) { - jsonMap := map[string]interface{}{} - enclaveInfo, err := kurtosisCtx.GetEnclave(ctx, enclaveIdentifier) - if err != nil { - return jsonMap, stacktrace.Propagate(err, "An error occurred getting the enclave for identifier '%v'", enclaveIdentifier) - } - - enclaveApiContainerStatus := enclaveInfo.ApiContainerStatus - isApiContainerRunning := enclaveApiContainerStatus == kurtosis_engine_rpc_api_bindings.EnclaveAPIContainerStatus_EnclaveAPIContainerStatus_RUNNING - - userServices := map[string]*kurtosis_core_rpc_api_bindings.ServiceInfo{} - if isApiContainerRunning { - var err error - serviceMap := map[string]bool{ - serviceIdentifier: true, - } - userServices, err = user_services.GetUserServiceInfoMapFromAPIContainer(ctx, enclaveInfo, serviceMap) - if err != nil { - return jsonMap, stacktrace.Propagate(err, "Failed to get service info from API container in enclave '%v'", enclaveInfo.GetEnclaveUuid()) - } - } - - var userService *kurtosis_core_rpc_api_bindings.ServiceInfo - for _, userServiceInfo := range userServices { - userService = userServiceInfo - break - } - +func PrintServiceInspect(userService *kurtosis_core_rpc_api_bindings.ServiceInfo, userServiceConfig *services.ServiceConfig, showFullUuid bool, outputFormat string) error { if outputFormat != "" { - jsonMap[ServiceImageTitleName] = userService.GetContainer().GetImageName() - jsonMap[ServiceCmdArgsTitleName] = userService.GetContainer().GetCmdArgs() - jsonMap[ServiceEntrypointArgsTitleName] = userService.GetContainer().GetEntrypointArgs() - jsonMap[ServiceEnvVarsTitleName] = userService.GetContainer().GetEnvVars() - jsonMap[ServicePortsTitleName] = userService.GetPrivatePorts() - - serviceDirPathsToFilesArtifactsLists := userService.GetServiceDirPathsToFilesArtifactsIdentifiers() - serviceDirPathsToFilesArtifactsIdentifiers := map[string][]string{} - for serviceName, filesArtifactsList := range serviceDirPathsToFilesArtifactsLists { - serviceDirPathsToFilesArtifactsIdentifiers[serviceName] = filesArtifactsList.FilesArtifactsIdentifiers - } - - jsonMap[ServiceFilesTitleName] = serviceDirPathsToFilesArtifactsIdentifiers - // TODO: add support for cpu min max memory - var marshaled []byte var err error switch outputFormat { case jsonOutputFormat: - marshaled, err = json.MarshalIndent(jsonMap, "", "") + marshaled, err = json.MarshalIndent(userServiceConfig, "", " ") case yamlOutputFormat: - marshaled, err = yaml.Marshal(jsonMap) + marshaled, err = yaml.Marshal(userServiceConfig) } if err != nil { - return jsonMap, stacktrace.Propagate(err, "Failed to marshal service info to %s", outputFormat) + return stacktrace.Propagate(err, "Failed to marshal service info to %s", outputFormat) } - if shouldPrintOutputFormat { - out.PrintOutLn(string(marshaled)) - } - return jsonMap, nil + out.PrintOutLn(string(marshaled)) + return nil } out.PrintOutLn(fmt.Sprintf("%s: %s", ServiceNameTitleName, userService.GetName())) @@ -227,7 +185,7 @@ func PrintServiceInspect(ctx context.Context, kurtosisBackend backend_interface. out.PrintOutLn(fmt.Sprintf("%s:", ServicePortsTitleName)) portBindingLines, err := user_services.GetUserServicePortBindingStrings(userService) if err != nil { - return jsonMap, stacktrace.Propagate(err, "An error occurred getting the port binding strings") + return stacktrace.Propagate(err, "An error occurred getting the port binding strings") } for _, portBindingLine := range portBindingLines { out.PrintOutLn(fmt.Sprintf(" %s", portBindingLine)) @@ -248,5 +206,5 @@ func PrintServiceInspect(ctx context.Context, kurtosisBackend backend_interface. out.PrintOutLn(fmt.Sprintf(" %s: %s", envVarKey, envVarVal)) } - return jsonMap, nil + return nil } diff --git a/cli/cli/commands/service/service.go b/cli/cli/commands/service/service.go index 077ea473ab..19f6c5e9f8 100644 --- a/cli/cli/commands/service/service.go +++ b/cli/cli/commands/service/service.go @@ -6,6 +6,14 @@ package service import ( + "context" + "fmt" + "github.com/kurtosis-tech/kurtosis/api/golang/core/kurtosis_core_rpc_api_bindings" + "github.com/kurtosis-tech/kurtosis/api/golang/core/lib/enclaves" + "github.com/kurtosis-tech/kurtosis/api/golang/core/lib/services" + "github.com/kurtosis-tech/kurtosis/api/golang/core/lib/starlark_run_config" + "github.com/kurtosis-tech/kurtosis/api/golang/engine/kurtosis_engine_rpc_api_bindings" + "github.com/kurtosis-tech/kurtosis/api/golang/engine/lib/kurtosis_context" "github.com/kurtosis-tech/kurtosis/cli/cli/command_str_consts" "github.com/kurtosis-tech/kurtosis/cli/cli/commands/service/add" "github.com/kurtosis-tech/kurtosis/cli/cli/commands/service/exec" @@ -16,7 +24,70 @@ import ( "github.com/kurtosis-tech/kurtosis/cli/cli/commands/service/start" "github.com/kurtosis-tech/kurtosis/cli/cli/commands/service/stop" "github.com/kurtosis-tech/kurtosis/cli/cli/commands/service/update" + "github.com/kurtosis-tech/kurtosis/cli/cli/helpers/user_services" + "github.com/kurtosis-tech/stacktrace" "github.com/spf13/cobra" + "strconv" + "strings" +) + +const ( + ImageKey = "image" + CmdKey = "cmd" + EntrypointFlagKey = "entrypoint" + + EnvvarsFlagKey = "env" + envvarKeyValueDelimiter = "=" + envvarDeclarationsDelimiter = "," + + PortsFlagKey = "ports" + portIdSpecDelimiter = "=" + portNumberProtocolDelimiter = "/" + portDeclarationsDelimiter = "," + portApplicationProtocolDelimiter = ":" + portNumberUintParsingBase = 10 + portNumberUintParsingBits = 16 + + FilesFlagKey = "files" + filesArtifactMountsDelimiter = "," + filesArtifactMountpointDelimiter = ":" + + emptyApplicationProtocol = "" + + maybeApplicationProtocolSpecForHelp = "MAYBE_APPLICATION_PROTOCOL" + transportProtocolSpecForHelp = "TRANSPORT_PROTOCOL" + portNumberSpecForHelp = "PORT_NUMBER" + portIdSpecForHelp = "PORT_ID" + + // Each envvar should be KEY1=VALUE1, which means we should have two components to each envvar declaration + expectedNumberKeyValueComponentsInEnvvarDeclaration = 2 + portNumberIndex = 0 + transportProtocolIndex = 1 + expectedPortIdSpecComponentsCount = 2 + expectedMountFragmentsCount = 2 + + minRemainingPortSpecComponents = 1 + maxRemainingPortSpecComponents = 2 + + defaultPortWaitTimeoutStr = "30s" +) + +var ( + defaultTransportProtocolStr = strings.ToLower(kurtosis_core_rpc_api_bindings.Port_TCP.String()) + serviceAddSpec = fmt.Sprintf( + `%v%v%v%v%v`, + maybeApplicationProtocolSpecForHelp, + portApplicationProtocolDelimiter, + portNumberSpecForHelp, + portNumberProtocolDelimiter, + transportProtocolSpecForHelp, + ) + serviceAddSpecWithPortId = fmt.Sprintf( + `%v%v%v`, + portIdSpecForHelp, + portIdSpecDelimiter, + serviceAddSpec, + ) ) // ServiceCmd Suppressing exhaustruct requirement because this struct has ~40 properties @@ -38,3 +109,287 @@ func init() { ServiceCmd.AddCommand(inspect.ServiceInspectCmd.MustGetCobraCommand()) ServiceCmd.AddCommand(update.ServiceUpdateCmd.MustGetCobraCommand()) } + +// Helpers +func GetServiceInfo(ctx context.Context, kurtosisCtx *kurtosis_context.KurtosisContext, enclaveIdentifier, serviceIdentifier string) (*kurtosis_core_rpc_api_bindings.ServiceInfo, *services.ServiceConfig, error) { + enclaveInfo, err := kurtosisCtx.GetEnclave(ctx, enclaveIdentifier) + if err != nil { + return nil, nil, stacktrace.Propagate(err, "An error occurred getting the enclave for identifier '%v'", enclaveIdentifier) + } + + enclaveApiContainerStatus := enclaveInfo.ApiContainerStatus + isApiContainerRunning := enclaveApiContainerStatus == kurtosis_engine_rpc_api_bindings.EnclaveAPIContainerStatus_EnclaveAPIContainerStatus_RUNNING + + userServices := map[string]*kurtosis_core_rpc_api_bindings.ServiceInfo{} + if isApiContainerRunning { + var err error + serviceMap := map[string]bool{ + serviceIdentifier: true, + } + userServices, err = user_services.GetUserServiceInfoMapFromAPIContainer(ctx, enclaveInfo, serviceMap) + if err != nil { + return nil, nil, stacktrace.Propagate(err, "Failed to get service info from API container in enclave '%v'", enclaveInfo.GetEnclaveUuid()) + } + } + + var service *kurtosis_core_rpc_api_bindings.ServiceInfo + for _, serviceInfo := range userServices { + service = serviceInfo + break + } + + serviceConfig := &services.ServiceConfig{ + Image: service.GetContainer().GetImageName(), + PrivatePorts: nil, + PublicPorts: nil, + Files: nil, + Entrypoint: service.GetContainer().GetEntrypointArgs(), + Cmd: service.GetContainer().GetCmdArgs(), + EnvVars: service.GetContainer().GetEnvVars(), + PrivateIPAddressPlaceholder: "", + MaxMillicpus: service.GetMaxMillicpus(), + MinMillicpus: service.GetMinMillicpus(), + MaxMemory: service.GetMaxMemoryMegabytes(), + MinMemory: service.GetMinMemoryMegabytes(), + User: nil, + Tolerations: nil, + NodeSelectors: nil, + TiniEnabled: nil, + } + + return service, serviceConfig, nil +} + +func GetAddServiceStarlarkScript(serviceName string, serviceConfigStarlark string) string { + return fmt.Sprintf(`def run(plan): + plan.add_service(name = "%s", config = %s) +`, serviceName, serviceConfigStarlark) +} + +func RunAddServiceStarlarkScript(ctx context.Context, serviceName, enclaveIdentifier, starlarkScript string, enclaveCtx *enclaves.EnclaveContext) (*enclaves.StarlarkRunResult, error) { + starlarkRunResult, err := enclaveCtx.RunStarlarkScriptBlocking(ctx, starlarkScript, starlark_run_config.NewRunStarlarkConfig()) + if err != nil { + return nil, stacktrace.Propagate(err, "An error has occurred when running Starlark to add service") + } + if starlarkRunResult.InterpretationError != nil { + return nil, stacktrace.NewError("An error has occurred when adding service: %s\nThis is a bug in Kurtosis, please report.", starlarkRunResult.InterpretationError) + } + if len(starlarkRunResult.ValidationErrors) > 0 { + return nil, stacktrace.NewError("An error occurred when validating add service '%v' to enclave '%v': %s", serviceName, enclaveIdentifier, starlarkRunResult.ValidationErrors) + } + if starlarkRunResult.ExecutionError != nil { + return nil, stacktrace.NewError("An error occurred adding service '%v' to enclave '%v': %s", serviceName, enclaveIdentifier, starlarkRunResult.ExecutionError) + } + return starlarkRunResult, nil +} + +// Parses a string in the form KEY1=VALUE1,KEY2=VALUE2 into a map of strings +// An empty string will result in an empty map +// Empty strings will be skipped (e.g. ',,,' will result in an empty map) +func ParseEnvVarsStr(envvarsStr string) (map[string]string, error) { + result := map[string]string{} + if envvarsStr == "" { + return result, nil + } + + allEnvvarDeclarationStrs := strings.Split(envvarsStr, envvarDeclarationsDelimiter) + for _, envvarDeclarationStr := range allEnvvarDeclarationStrs { + if len(strings.TrimSpace(envvarDeclarationStr)) == 0 { + continue + } + + envvarKeyValueComponents := strings.SplitN(envvarDeclarationStr, envvarKeyValueDelimiter, expectedNumberKeyValueComponentsInEnvvarDeclaration) + if len(envvarKeyValueComponents) < expectedNumberKeyValueComponentsInEnvvarDeclaration { + return nil, stacktrace.NewError("Environment declaration string '%v' must be of the form KEY1%vVALUE1", envvarDeclarationStr, envvarKeyValueDelimiter) + } + key := envvarKeyValueComponents[0] + value := envvarKeyValueComponents[1] + + preexistingValue, found := result[key] + if found { + return nil, stacktrace.NewError( + "Cannot declare environment variable '%v' assigned to value '%v' because the key has previously been assigned to value '%v'", + key, + value, + preexistingValue, + ) + } + + result[key] = value + } + + return result, nil +} + +// Parses a string in the form PORTID1=1234,PORTID2=5678/udp +// An empty string will result in an empty map +// Empty strings will be skipped (e.g. ',,,' will result in an empty map) +func ParsePortsStr(portsStr string) (map[string]*kurtosis_core_rpc_api_bindings.Port, error) { + result := map[string]*kurtosis_core_rpc_api_bindings.Port{} + if strings.TrimSpace(portsStr) == "" { + return result, nil + } + + allPortDeclarationStrs := strings.Split(portsStr, portDeclarationsDelimiter) + for _, portDeclarationStr := range allPortDeclarationStrs { + if len(strings.TrimSpace(portDeclarationStr)) == 0 { + continue + } + + portIdSpecComponents := strings.Split(portDeclarationStr, portIdSpecDelimiter) + if len(portIdSpecComponents) != expectedPortIdSpecComponentsCount { + return nil, stacktrace.NewError("Port declaration string '%v' must be of the form PORTID%vSPEC", portDeclarationStr, portIdSpecDelimiter) + } + portId := portIdSpecComponents[0] + specStr := portIdSpecComponents[1] + if len(strings.TrimSpace(portId)) == 0 { + return nil, stacktrace.NewError("Port declaration with spec string '%v' has an empty port ID", specStr) + } + portSpec, err := parsePortSpecStr(specStr) + if err != nil { + return nil, stacktrace.Propagate(err, "An error occurred parsing port spec string '%v' for port with ID '%v'", specStr, portId) + } + + if _, found := result[portId]; found { + return nil, stacktrace.NewError( + "Cannot define port '%v' with spec '%v' because it is already defined", + portId, + specStr, + ) + } + + result[portId] = portSpec + } + + return result, nil +} + +func parsePortSpecStr(specStr string) (*kurtosis_core_rpc_api_bindings.Port, error) { + if len(strings.TrimSpace(specStr)) == 0 { + return nil, stacktrace.NewError("Cannot parse empty spec string") + } + + maybeApplicationProtocol, remainingPortSpec, err := getMaybeApplicationProtocolFromPortSpecString(specStr) + if err != nil { + return nil, stacktrace.Propagate(err, "Error occurred while parsing application protocol '%v' in port spec '%v'", maybeApplicationProtocol, specStr) + } + + remainingPortSpecComponents := strings.Split(remainingPortSpec, portNumberProtocolDelimiter) + numRemainingPortSpecComponents := len(remainingPortSpecComponents) + if numRemainingPortSpecComponents > maxRemainingPortSpecComponents { + return nil, stacktrace.NewError( + `Invalid port spec string, expected format is %q but got '%v'`, + serviceAddSpec, + specStr, + ) + } + + portNumberUint16, err := getPortNumberFromPortSpecString(remainingPortSpecComponents[portNumberIndex]) + if err != nil { + return nil, stacktrace.Propagate(err, "Error occurred while parsing port number '%v' in port spec '%v'", remainingPortSpecComponents[portNumberIndex], specStr) + } + + transportProtocol := defaultTransportProtocolStr + if numRemainingPortSpecComponents > minRemainingPortSpecComponents { + transportProtocol = remainingPortSpecComponents[transportProtocolIndex] + } + + transportProtocolFromEnum, err := getTransportProtocolFromPortSpecString(transportProtocol) + if err != nil { + return nil, stacktrace.Propagate(err, "Error occurred while parsing transport protocol '%v' in port spec '%v'", remainingPortSpecComponents[transportProtocolIndex], specStr) + } + return &kurtosis_core_rpc_api_bindings.Port{ + Number: portNumberUint16, + TransportProtocol: transportProtocolFromEnum, + MaybeApplicationProtocol: maybeApplicationProtocol, + MaybeWaitTimeout: defaultPortWaitTimeoutStr, //TODO we should add this to the port's arguments instead of using only a default value + Locked: nil, + Alias: nil, + }, nil +} + +/* +* +This method takes in port protocol string and parses it to get application protocol. +It looks for `:` delimiter and splits the string into array of at most size 2. If the length +of array is 2 then application protocol exists, otherwise it does not. This is basically what +strings.Cut() does. // TODO: use that instead once we update go version +*/ +func getMaybeApplicationProtocolFromPortSpecString(portProtocolStr string) (string, string, error) { + + beforeDelimiter, afterDelimiter, foundDelimiter := strings.Cut(portProtocolStr, portApplicationProtocolDelimiter) + + if !foundDelimiter { + return emptyApplicationProtocol, beforeDelimiter, nil + } + + if foundDelimiter && beforeDelimiter == emptyApplicationProtocol { + return emptyApplicationProtocol, "", stacktrace.NewError("optional application protocol argument cannot be empty") + } + + return beforeDelimiter, afterDelimiter, nil +} + +func getPortNumberFromPortSpecString(portNumberStr string) (uint32, error) { + portNumberUint64, err := strconv.ParseUint(portNumberStr, portNumberUintParsingBase, portNumberUintParsingBits) + if err != nil { + return 0, stacktrace.Propagate( + err, + "An error occurred parsing port number string '%v' with base '%v' and bits '%v'", + portNumberStr, + portNumberUintParsingBase, + portNumberUintParsingBits, + ) + } + portNumberUint32 := uint32(portNumberUint64) + return portNumberUint32, nil +} + +func getTransportProtocolFromPortSpecString(portSpec string) (kurtosis_core_rpc_api_bindings.Port_TransportProtocol, error) { + transportProtocolEnumInt, found := kurtosis_core_rpc_api_bindings.Port_TransportProtocol_value[strings.ToUpper(portSpec)] + if !found { + return 0, stacktrace.NewError("Unrecognized port protocol '%v'", portSpec) + } + return kurtosis_core_rpc_api_bindings.Port_TransportProtocol(transportProtocolEnumInt), nil +} + +func ParseFilesArtifactMountsStr(filesArtifactMountsStr string) (map[string]string, error) { + result := map[string]string{} + if strings.TrimSpace(filesArtifactMountsStr) == "" { + return result, nil + } + + // NOTE: we might actually want to allow the same artifact being mounted in multiple places + allMountStrs := strings.Split(filesArtifactMountsStr, filesArtifactMountsDelimiter) + for idx, mountStr := range allMountStrs { + trimmedMountStr := strings.TrimSpace(mountStr) + if len(trimmedMountStr) == 0 { + continue + } + + mountFragments := strings.Split(trimmedMountStr, filesArtifactMountpointDelimiter) + if len(mountFragments) != expectedMountFragmentsCount { + return nil, stacktrace.NewError( + "Files artifact mountpoint string %v was '%v' but should be in the form 'mountpoint%sfiles_artifact_name'", + idx, + trimmedMountStr, + filesArtifactMountpointDelimiter, + ) + } + mountpoint := mountFragments[0] + filesArtifactName := mountFragments[1] + + if existingName, found := result[mountpoint]; found { + return nil, stacktrace.NewError( + "Mountpoint '%v' is declared twice; once to artifact name '%v' and again to artifact name '%v'", + mountpoint, + existingName, + filesArtifactName, + ) + } + + result[mountpoint] = filesArtifactName + } + + return result, nil +} diff --git a/cli/cli/commands/service/update/update.go b/cli/cli/commands/service/update/update.go index e6216bea0d..b0acb04704 100644 --- a/cli/cli/commands/service/update/update.go +++ b/cli/cli/commands/service/update/update.go @@ -13,11 +13,9 @@ import ( "github.com/kurtosis-tech/kurtosis/cli/cli/command_framework/lowlevel/args" "github.com/kurtosis-tech/kurtosis/cli/cli/command_framework/lowlevel/flags" "github.com/kurtosis-tech/kurtosis/cli/cli/command_str_consts" - "github.com/kurtosis-tech/kurtosis/cli/cli/commands/service/add" - "github.com/kurtosis-tech/kurtosis/cli/cli/commands/service/inspect" + "github.com/kurtosis-tech/kurtosis/cli/cli/commands/service" "github.com/kurtosis-tech/kurtosis/cli/cli/out" "github.com/kurtosis-tech/kurtosis/container-engine-lib/lib/backend_interface" - "github.com/kurtosis-tech/kurtosis/core/server/api_container/server/startosis_engine/kurtosis_types/service_config" "github.com/kurtosis-tech/kurtosis/metrics-library/golang/lib/metrics_client" "github.com/kurtosis-tech/stacktrace" "github.com/sirupsen/logrus" @@ -86,20 +84,20 @@ var ServiceUpdateCmd = &engine_consuming_kurtosis_command.EngineConsumingKurtosi EngineClientContextKey: engineClientCtxKey, Flags: []*flags.FlagConfig{ { - Key: serviceImageFlagKey, + Key: service.ImageKey, Usage: "image", Type: flags.FlagType_String, Default: "", }, { - Key: cmdArgsFlagKey, + Key: service.CmdKey, Usage: "cmd", // TODO Make this a string list Type: flags.FlagType_String, Default: "", }, { - Key: entrypointBinaryFlagKey, + Key: service.EntrypointFlagKey, Usage: "ENTRYPOINT binary that will be used when running the container, overriding the image's default ENTRYPOINT", // TODO Make this a string list Type: flags.FlagType_String, @@ -107,7 +105,7 @@ var ServiceUpdateCmd = &engine_consuming_kurtosis_command.EngineConsumingKurtosi }, { // TODO We currently can't handle commas, so allow users to set the flag multiple times to set multiple envvars - Key: envvarsFlagKey, + Key: service.EnvvarsFlagKey, Usage: fmt.Sprintf( "String containing environment variables that will be set when running the container, in "+ "the form \"KEY1%vVALUE1%vKEY2%vVALUE2\"", @@ -119,7 +117,7 @@ var ServiceUpdateCmd = &engine_consuming_kurtosis_command.EngineConsumingKurtosi Default: "", }, { - Key: portsFlagKey, + Key: service.PortsFlagKey, Usage: fmt.Sprintf(`String containing declarations of ports that the container will listen on, in the form, %q`+ ` where %q is a user friendly string for identifying the port, %q is required field, %q is an optional field which must be either`+ ` '%v' or '%v' and defaults to '%v' if omitted and %q is user defined optional value. %v`, @@ -137,7 +135,7 @@ var ServiceUpdateCmd = &engine_consuming_kurtosis_command.EngineConsumingKurtosi Default: "", }, { - Key: filesFlagKey, + Key: service.FilesFlagKey, Usage: fmt.Sprintf( "String containing declarations of files paths on the container -> artifact name where the contents of those "+ "files artifacts should be mounted, in the form \"MOUNTPATH1%vARTIFACTNAME1%vMOUNTPATH2%vARTIFACTNAME2\" where "+ @@ -232,7 +230,7 @@ func run( return stacktrace.Propagate(err, "An error occurred getting the env vars string using key '%v'", envvarsFlagKey) } if envVarsStr != "" { - overrideEnvVars, err = add.ParseEnvVarsStr(envVarsStr) + overrideEnvVars, err = service.ParseEnvVarsStr(envVarsStr) if err != nil { return stacktrace.Propagate(err, "An error occurred parsing env vars string: %v", envVarsStr) } @@ -243,7 +241,7 @@ func run( return stacktrace.Propagate(err, "An error occurred getting the ports string using key '%v'", portsFlagKey) } if portsStr != "" { - overridePorts, err = add.ParsePortsStr(portsStr) + overridePorts, err = service.ParsePortsStr(portsStr) if err != nil { return stacktrace.Propagate(err, "An error occurred parsing ports string: %v", portsStr) } @@ -254,91 +252,40 @@ func run( return stacktrace.Propagate(err, "An error occurred getting the files artifact mounts string using key '%v'", filesFlagKey) } if filesArtifactMountsStr != "" { - overrideFilesArtifactsMountpoint, err = add.ParseFilesArtifactMountsStr(filesArtifactMountsStr) + overrideFilesArtifactsMountpoint, err = service.ParseFilesArtifactMountsStr(filesArtifactMountsStr) if err != nil { return stacktrace.Propagate(err, "An error occurred parsing files artifacts mount points string: %v", filesArtifactMountsStr) } } - serviceInspectOutputMap, err := inspect.PrintServiceInspect(ctx, kurtosisBackend, kurtosisCtx, enclaveIdentifier, serviceName, false, "json", false) + _, currServiceConfig, err := service.GetServiceInfo(ctx, kurtosisCtx, enclaveIdentifier, serviceName) if err != nil { - return stacktrace.Propagate(err, "An error occurred getting") + return stacktrace.Propagate(err, "An error occurred getting service info of service '%v' in enclave '%v'.", serviceName, enclaveIdentifier) } - var currImage string - if img, ok := serviceInspectOutputMap[inspect.ServiceImageTitleName]; ok { - currImage = img.(string) - } - - var currPorts map[string]*kurtosis_core_rpc_api_bindings.Port - if ports, ok := serviceInspectOutputMap[inspect.ServicePortsTitleName]; ok { - currPorts = ports.(map[string]*kurtosis_core_rpc_api_bindings.Port) - } - - currFilesArtifactsMountpoint := map[string]string{} - if filesArtifactsMountpoints, ok := serviceInspectOutputMap[inspect.ServiceFilesTitleName]; ok { - currFilesArtifactsMountpointWithMultipleMounts := filesArtifactsMountpoints.(map[string][]string) - for svcName, mountpoints := range currFilesArtifactsMountpointWithMultipleMounts { - currFilesArtifactsMountpoint[svcName] = mountpoints[0] - } - } - - var currEntrypoint []string - if entrypoint, ok := serviceInspectOutputMap[inspect.ServiceEntrypointArgsTitleName]; ok { - currEntrypoint = entrypoint.([]string) - } - - var currCmd []string - if cmd, ok := serviceInspectOutputMap[inspect.ServiceCmdArgsTitleName]; ok { - currCmd = cmd.([]string) - } - - var currEnvVarsMap map[string]string - if cmd, ok := serviceInspectOutputMap[inspect.ServiceEnvVarsTitleName]; ok { - currEnvVarsMap = cmd.(map[string]string) - } - - var currCpuAllocationMillicpus int - if cpuAlloc, ok := serviceInspectOutputMap[inspect.ServiceMaxCpuAllocationTitleName]; ok { - currCpuAllocationMillicpus = cpuAlloc.(int) - } - var currMemoryMegabytes int - if memoryAlloc, ok := serviceInspectOutputMap[inspect.ServiceMemoryAllocationTitleName]; ok { - currMemoryMegabytes = memoryAlloc.(int) - } - var currMinCpuMillicores int - if minCpuMillis, ok := serviceInspectOutputMap[inspect.ServiceMinCpuAllocationTitleName]; ok { - currMinCpuMillicores = minCpuMillis.(int) - } - var currMinMemoryBytes int - if minMem, ok := serviceInspectOutputMap[inspect.ServiceMinMemoryAllocationTitleName]; ok { - currMinMemoryBytes = minMem.(int) - } - - // merge - var mergedImage string - var mergedEntrypoint []string - var mergedCmd []string - + // merge overrides with existing service config // if override image was provided, use that as the image, otherwise keep curr + var mergedImage string if overrideImage != "" { mergedImage = overrideImage } else { - mergedImage = currImage + mergedImage = currServiceConfig.Image } // if override entrypoint was provided, use that as the entrypoint, otherwise keep curr + var mergedEntrypoint []string if len(overrideEntrypoint) > 0 { mergedEntrypoint = overrideEntrypoint } else { - mergedEntrypoint = currEntrypoint + mergedEntrypoint = currServiceConfig.Entrypoint } // if override cmd was provided, use that as the cmd, otherwise keep curr + var mergedCmd []string if len(overrideCmd) > 0 { mergedCmd = overrideCmd } else { - mergedCmd = currCmd + mergedCmd = currServiceConfig.Cmd } // combine current ports with override ports @@ -346,8 +293,16 @@ func run( for portId, port := range overridePorts { mergedPorts[portId] = port } - for portId, port := range currPorts { - mergedPorts[portId] = port + for portId, port := range currServiceConfig.PrivatePorts { + apiPort := &kurtosis_core_rpc_api_bindings.Port{ + Number: port.Number, + TransportProtocol: kurtosis_core_rpc_api_bindings.Port_TransportProtocol(port.Transport), + MaybeApplicationProtocol: port.MaybeApplicationProtocol, + MaybeWaitTimeout: port.Wait, + Locked: nil, + Alias: nil, + } + mergedPorts[portId] = apiPort } // combine current env vars with override env vars @@ -355,7 +310,7 @@ func run( for key, val := range overrideEnvVars { mergedEnvVarsMap[key] = val } - for key, val := range currEnvVarsMap { + for key, val := range currServiceConfig.EnvVars { mergedEnvVarsMap[key] = val } @@ -364,42 +319,34 @@ func run( for key, val := range overrideFilesArtifactsMountpoint { mergedFilesArtifactsMountpoint[key] = val } - for key, val := range currFilesArtifactsMountpoint { + for key, val := range currServiceConfig.Files { mergedFilesArtifactsMountpoint[key] = val } - var mergedCpuAllocationMillicpus int - mergedCpuAllocationMillicpus = currCpuAllocationMillicpus - - var mergedMemoryMegabytes int - mergedMemoryMegabytes = currMemoryMegabytes - - var mergedMinCpuMillicores int - mergedMinCpuMillicores = currMinCpuMillicores - - var mergedMinMemoryBytes int - mergedMinMemoryBytes = currMinMemoryBytes - // call getServiceConfig - serviceConfigStr := services.GetServiceConfigStarlark( + serviceConfigStr := services.GetFullServiceConfigStarlark( mergedImage, mergedPorts, - mergedFilesArtifactsMountpoint, // TODO: get in svc inspect + mergedFilesArtifactsMountpoint, mergedEntrypoint, mergedCmd, mergedEnvVarsMap, - service_config.PrivateIpAddressPlaceholderAttr, - mergedCpuAllocationMillicpus, // TODO: get in svc inspect - mergedMemoryMegabytes, // TODO: get in svc inspect - mergedMinCpuMillicores, // TODO: get in svc inspect - mergedMinMemoryBytes) // TODO: get in service inspect + currServiceConfig.MaxMillicpus, + currServiceConfig.MaxMemory, + currServiceConfig.MinMillicpus, + currServiceConfig.MinMemory, + currServiceConfig.User, + currServiceConfig.Tolerations, + currServiceConfig.NodeSelectors, + currServiceConfig.Labels, + currServiceConfig.TiniEnabled, + ) //logrus.Infof("SERVICE CONFIG STRING: %v", serviceConfigStr) - // call run add service starlark script - addServiceStarlarkStr := add.GetAddServiceStarlarkScript(serviceName, serviceConfigStr) + addServiceStarlarkStr := service.GetAddServiceStarlarkScript(serviceName, serviceConfigStr) logrus.Infof("Running update service starlark for service '%v' in enclave '%v'...", serviceName, enclaveIdentifier) - starlarkRunResult, err := add.RunAddServiceStarlarkScript(ctx, serviceName, enclaveIdentifier, addServiceStarlarkStr, enclaveCtx) + starlarkRunResult, err := service.RunAddServiceStarlarkScript(ctx, serviceName, enclaveIdentifier, addServiceStarlarkStr, enclaveCtx) if err != nil { return err //already wrapped } diff --git a/core/server/api_container/server/api_container_service.go b/core/server/api_container/server/api_container_service.go index 8cea1e89c1..b7052f611e 100644 --- a/core/server/api_container/server/api_container_service.go +++ b/core/server/api_container/server/api_container_service.go @@ -103,6 +103,11 @@ type ApiContainerService struct { githubAuthProvider *git_package_content_provider.GitHubPackageAuthProvider + // NOTE: interpretationTimeValueStore is modified by the StarlarkInterpreter - allowing this object to have access to it + // allows retrieving service configs of running services but it is NOT mutex protected, thus this object should never modify + // the interpretationTimeValueStore or it could mess with interpretation + // TODO: Either mutex protect the interpretationTimeValueStore OR compose the interpretationTimeValueStore of a separate mutex protected `serviceConfigRepository` object + // and allow both ApiContainerService and interpretationTimeValueStore to have access to that interpretationTimeValueStore *interpretation_time_value_store.InterpretationTimeValueStore } @@ -786,6 +791,17 @@ func transformPortSpecMapToApiPortsMap(apiPorts map[string]*port_spec.PortSpec) return result, nil } +func transformServiceDirPathsToFileArtifactsToApiPortsFilesArtifactsList(serviceDirPathsToFilesArtifactsIdentifiers map[string][]string) map[string]*kurtosis_core_rpc_api_bindings.FilesArtifactsList { + result := map[string]*kurtosis_core_rpc_api_bindings.FilesArtifactsList{} + for svcName, filesArtifactsIdentifiers := range serviceDirPathsToFilesArtifactsIdentifiers { + filesArtifactsList := &kurtosis_core_rpc_api_bindings.FilesArtifactsList{ + FilesArtifactsIdentifiers: filesArtifactsIdentifiers, + } + result[svcName] = filesArtifactsList + } + return result +} + func (apicService *ApiContainerService) waitForEndpointAvailability( ctx context.Context, serviceIdStr string, @@ -890,6 +906,8 @@ func (apicService *ApiContainerService) getServiceInfoForIdentifier(ctx context. if err != nil { return nil, stacktrace.Propagate(err, "An error occurred getting info for service '%v'", serviceIdentifier) } + + // serviceConfig, err := apicService.interpretationTimeValueStore.GetServiceConfig(serviceObj.GetRegistration().GetName()) if err != nil { return nil, stacktrace.Propagate(err, "An error occurred getting service config from interpretation time value store.") @@ -1104,6 +1122,8 @@ func getServiceInfoFromServiceObj(serviceObj *service.Service, serviceDirPathsTo maxMemoryMegabytes := uint32(0) minMemoryMegabytes := uint32(0) + serviceDirPathsToFilesArtifactsList := transformServiceDirPathsToFileArtifactsToApiPortsFilesArtifactsList(serviceDirPathsToFilesArtifactsIdentifiers) + serviceInfoResponse := binding_constructors.NewServiceInfo( serviceUuidStr, serviceNameStr, @@ -1114,7 +1134,7 @@ func getServiceInfoFromServiceObj(serviceObj *service.Service, serviceDirPathsTo publicApiPorts, serviceStatus, serviceInfoContainer, - serviceDirPathsToFilesArtifactsIdentifiers, + serviceDirPathsToFilesArtifactsList, maxMillicpus, minMillicpus, maxMemoryMegabytes, diff --git a/internal_testsuites/golang/test_helpers/test_helpers.go b/internal_testsuites/golang/test_helpers/test_helpers.go index 89d782e7cb..c8bc6e6cb5 100644 --- a/internal_testsuites/golang/test_helpers/test_helpers.go +++ b/internal_testsuites/golang/test_helpers/test_helpers.go @@ -589,7 +589,7 @@ func GenerateRandomTempFile(byteSize int, filePathOptional string) (string, func // // ==================================================================================================== func getDatastoreServiceConfigStarlark() string { - return services.GetServiceConfigStarlark(datastoreImage, map[string]*kurtosis_core_rpc_api_bindings.Port{datastorePortId: datastorePortSpec}, emptyFileArtifactMountPoints, emptyEntrypointArgs, emptyCmdArgs, emptyEnvVars, emptyPrivateIpAddrPlaceholder, emptyCpuAllocationMillicpus, emptyMemoryAllocationMegabytes, 0, 0) + return services.GetSimpleServiceConfigStarlark(datastoreImage, map[string]*kurtosis_core_rpc_api_bindings.Port{datastorePortId: datastorePortSpec}, emptyFileArtifactMountPoints, emptyEntrypointArgs, emptyCmdArgs, emptyEnvVars, emptyPrivateIpAddrPlaceholder, emptyCpuAllocationMillicpus, emptyMemoryAllocationMegabytes, 0, 0) } func getApiServiceServiceConfigStarlark(apiConfigArtifactName string) string { @@ -599,7 +599,7 @@ func getApiServiceServiceConfigStarlark(apiConfigArtifactName string) string { path.Join(configMountpathOnApiContainer, configFilename), } - return services.GetServiceConfigStarlark(apiServiceImage, map[string]*kurtosis_core_rpc_api_bindings.Port{apiPortId: apiPortSpec}, map[string]string{configMountpathOnApiContainer: apiConfigArtifactName}, emptyEntrypointArgs, startCmd, emptyEnvVars, emptyPrivateIpAddrPlaceholder, emptyCpuAllocationMillicpus, emptyMemoryAllocationMegabytes, 0, 0) + return services.GetSimpleServiceConfigStarlark(apiServiceImage, map[string]*kurtosis_core_rpc_api_bindings.Port{apiPortId: apiPortSpec}, map[string]string{configMountpathOnApiContainer: apiConfigArtifactName}, emptyEntrypointArgs, startCmd, emptyEnvVars, emptyPrivateIpAddrPlaceholder, emptyCpuAllocationMillicpus, emptyMemoryAllocationMegabytes, 0, 0) } func createApiConfigFile(datastoreIP string) (string, error) { @@ -653,7 +653,7 @@ func getFileServerServiceConfigStarlark(filesArtifactMountPoints map[string]serv filesArtifactMountPointsStr[k] = string(v) } - return services.GetServiceConfigStarlark(fileServerServiceImage, map[string]*kurtosis_core_rpc_api_bindings.Port{fileServerPortId: fileServerPortSpec}, filesArtifactMountPointsStr, emptyEntrypointArgs, emptyCmdArgs, emptyEnvVars, emptyPrivateIpAddrPlaceholder, emptyCpuAllocationMillicpus, emptyMemoryAllocationMegabytes, 0, 0) + return services.GetSimpleServiceConfigStarlark(fileServerServiceImage, map[string]*kurtosis_core_rpc_api_bindings.Port{fileServerPortId: fileServerPortSpec}, filesArtifactMountPointsStr, emptyEntrypointArgs, emptyCmdArgs, emptyEnvVars, emptyPrivateIpAddrPlaceholder, emptyCpuAllocationMillicpus, emptyMemoryAllocationMegabytes, 0, 0) } func createDatastoreClient(ipAddr string, portNum uint16) (datastore_rpc_api_bindings.DatastoreServiceClient, func(), error) { @@ -706,7 +706,7 @@ func getServiceWithLogLinesServiceConfigStarlark(logLines []string) string { cmdArgs := []string{echoLogLinesLoopCmdStr} - return services.GetServiceConfigStarlark(dockerGettingStartedImage, emptyPrivatePorts, emptyFileArtifactMountPoints, entrypointArgs, cmdArgs, emptyEnvVars, emptyPrivateIpAddrPlaceholder, emptyCpuAllocationMillicpus, emptyMemoryAllocationMegabytes, 0, 0) + return services.GetSimpleServiceConfigStarlark(dockerGettingStartedImage, emptyPrivatePorts, emptyFileArtifactMountPoints, entrypointArgs, cmdArgs, emptyEnvVars, emptyPrivateIpAddrPlaceholder, emptyCpuAllocationMillicpus, emptyMemoryAllocationMegabytes, 0, 0) } func SkipFlakyTest(t *testing.T, testName string) { From db8c239298a2fa5e299ca9e5a035e5c01f14d1d0 Mon Sep 17 00:00:00 2001 From: Tedi Mitiku Date: Thu, 27 Mar 2025 12:24:55 -0400 Subject: [PATCH 07/48] mv helpers --- cli/cli/commands/service/add/add.go | 22 +- cli/cli/commands/service/inspect/inspect.go | 4 +- cli/cli/commands/service/service.go | 355 ----------------- .../service_helpers/service_helpers.go | 359 ++++++++++++++++++ cli/cli/commands/service/update/update.go | 26 +- 5 files changed, 385 insertions(+), 381 deletions(-) create mode 100644 cli/cli/commands/service/service_helpers/service_helpers.go diff --git a/cli/cli/commands/service/add/add.go b/cli/cli/commands/service/add/add.go index d58fb2a0e8..07e2c21b2c 100644 --- a/cli/cli/commands/service/add/add.go +++ b/cli/cli/commands/service/add/add.go @@ -3,7 +3,7 @@ package add import ( "context" "fmt" - "github.com/kurtosis-tech/kurtosis/cli/cli/commands/service" + "github.com/kurtosis-tech/kurtosis/cli/cli/commands/service/service_helpers" "strings" "github.com/kurtosis-tech/kurtosis/api/golang/core/kurtosis_core_rpc_api_bindings" @@ -112,10 +112,10 @@ var ServiceAddCmd = &engine_consuming_kurtosis_command.EngineConsumingKurtosisCo Key: serviceNameArgKey, }, { - Key: service.ImageKey, + Key: service_helpers.ImageKey, }, { - Key: service.CmdKey, + Key: service_helpers.CmdKey, IsOptional: true, IsGreedy: true, DefaultValue: []string{}, @@ -123,14 +123,14 @@ var ServiceAddCmd = &engine_consuming_kurtosis_command.EngineConsumingKurtosisCo }, Flags: []*flags.FlagConfig{ { - Key: service.EntrypointFlagKey, + Key: service_helpers.EntrypointFlagKey, Usage: "ENTRYPOINT binary that will be used when running the container, overriding the image's default ENTRYPOINT", // TODO Make this a string list Type: flags.FlagType_String, }, { // TODO We currently can't handle commas, so allow users to set the flag multiple times to set multiple envvars - Key: service.EnvvarsFlagKey, + Key: service_helpers.EnvvarsFlagKey, Usage: fmt.Sprintf( "String containing environment variables that will be set when running the container, in "+ "the form \"KEY1%vVALUE1%vKEY2%vVALUE2\"", @@ -141,7 +141,7 @@ var ServiceAddCmd = &engine_consuming_kurtosis_command.EngineConsumingKurtosisCo Type: flags.FlagType_String, }, { - Key: service.PortsFlagKey, + Key: service_helpers.PortsFlagKey, Usage: fmt.Sprintf(`String containing declarations of ports that the container will listen on, in the form, %q`+ ` where %q is a user friendly string for identifying the port, %q is required field, %q is an optional field which must be either`+ ` '%v' or '%v' and defaults to '%v' if omitted and %q is user defined optional value. %v`, @@ -158,7 +158,7 @@ var ServiceAddCmd = &engine_consuming_kurtosis_command.EngineConsumingKurtosisCo Type: flags.FlagType_String, }, { - Key: service.FilesFlagKey, + Key: service_helpers.FilesFlagKey, Usage: fmt.Sprintf( "String containing declarations of files paths on the container -> artifact name where the contents of those "+ "files artifacts should be mounted, in the form \"MOUNTPATH1%vARTIFACTNAME1%vMOUNTPATH2%vARTIFACTNAME2\" where "+ @@ -272,7 +272,7 @@ func run( ) } - _, err = service.RunAddServiceStarlarkScript(ctx, serviceName, enclaveIdentifier, service.GetAddServiceStarlarkScript(serviceName, serviceConfigStarlark), enclaveCtx) + _, err = service_helpers.RunAddServiceStarlarkScript(ctx, serviceName, enclaveIdentifier, service_helpers.GetAddServiceStarlarkScript(serviceName, serviceConfigStarlark), enclaveCtx) if err != nil { return err // already wrapped } @@ -379,17 +379,17 @@ func GetServiceConfigStarlark( minMemoryMegaBytes int, privateIPAddressPlaceholder string, ) (string, error) { - envvarsMap, err := service.ParseEnvVarsStr(envvarsStr) + envvarsMap, err := service_helpers.ParseEnvVarsStr(envvarsStr) if err != nil { return "", stacktrace.Propagate(err, "An error occurred parsing environment variables string '%v'", envvarsStr) } - ports, err := service.ParsePortsStr(portsStr) + ports, err := service_helpers.ParsePortsStr(portsStr) if err != nil { return "", stacktrace.Propagate(err, "An error occurred parsing ports string '%v'", portsStr) } - filesArtifactMounts, err := service.ParseFilesArtifactMountsStr(filesArtifactMountsStr) + filesArtifactMounts, err := service_helpers.ParseFilesArtifactMountsStr(filesArtifactMountsStr) if err != nil { return "", stacktrace.Propagate(err, "An error occurred parsing files artifact mounts string '%v'", filesArtifactMountsStr) } diff --git a/cli/cli/commands/service/inspect/inspect.go b/cli/cli/commands/service/inspect/inspect.go index bb66dfb108..2fde2605a9 100644 --- a/cli/cli/commands/service/inspect/inspect.go +++ b/cli/cli/commands/service/inspect/inspect.go @@ -10,7 +10,7 @@ import ( "encoding/json" "fmt" "github.com/kurtosis-tech/kurtosis/api/golang/core/lib/services" - "github.com/kurtosis-tech/kurtosis/cli/cli/commands/service" + "github.com/kurtosis-tech/kurtosis/cli/cli/commands/service/service_helpers" "gopkg.in/yaml.v3" "strings" @@ -139,7 +139,7 @@ func run( return stacktrace.Propagate(err, "An error occurred creating Kurtosis Context from local engine") } - serviceInfo, serviceConfig, err := service.GetServiceInfo(ctx, kurtosisCtx, enclaveIdentifier, serviceIdentifier) + serviceInfo, serviceConfig, err := service_helpers.GetServiceInfo(ctx, kurtosisCtx, enclaveIdentifier, serviceIdentifier) if err != nil { return stacktrace.Propagate(err, "An error occurred getting service info of '%v' from '%v'.", enclaveIdentifier, serviceIdentifier) } diff --git a/cli/cli/commands/service/service.go b/cli/cli/commands/service/service.go index 19f6c5e9f8..077ea473ab 100644 --- a/cli/cli/commands/service/service.go +++ b/cli/cli/commands/service/service.go @@ -6,14 +6,6 @@ package service import ( - "context" - "fmt" - "github.com/kurtosis-tech/kurtosis/api/golang/core/kurtosis_core_rpc_api_bindings" - "github.com/kurtosis-tech/kurtosis/api/golang/core/lib/enclaves" - "github.com/kurtosis-tech/kurtosis/api/golang/core/lib/services" - "github.com/kurtosis-tech/kurtosis/api/golang/core/lib/starlark_run_config" - "github.com/kurtosis-tech/kurtosis/api/golang/engine/kurtosis_engine_rpc_api_bindings" - "github.com/kurtosis-tech/kurtosis/api/golang/engine/lib/kurtosis_context" "github.com/kurtosis-tech/kurtosis/cli/cli/command_str_consts" "github.com/kurtosis-tech/kurtosis/cli/cli/commands/service/add" "github.com/kurtosis-tech/kurtosis/cli/cli/commands/service/exec" @@ -24,70 +16,7 @@ import ( "github.com/kurtosis-tech/kurtosis/cli/cli/commands/service/start" "github.com/kurtosis-tech/kurtosis/cli/cli/commands/service/stop" "github.com/kurtosis-tech/kurtosis/cli/cli/commands/service/update" - "github.com/kurtosis-tech/kurtosis/cli/cli/helpers/user_services" - "github.com/kurtosis-tech/stacktrace" "github.com/spf13/cobra" - "strconv" - "strings" -) - -const ( - ImageKey = "image" - CmdKey = "cmd" - EntrypointFlagKey = "entrypoint" - - EnvvarsFlagKey = "env" - envvarKeyValueDelimiter = "=" - envvarDeclarationsDelimiter = "," - - PortsFlagKey = "ports" - portIdSpecDelimiter = "=" - portNumberProtocolDelimiter = "/" - portDeclarationsDelimiter = "," - portApplicationProtocolDelimiter = ":" - portNumberUintParsingBase = 10 - portNumberUintParsingBits = 16 - - FilesFlagKey = "files" - filesArtifactMountsDelimiter = "," - filesArtifactMountpointDelimiter = ":" - - emptyApplicationProtocol = "" - - maybeApplicationProtocolSpecForHelp = "MAYBE_APPLICATION_PROTOCOL" - transportProtocolSpecForHelp = "TRANSPORT_PROTOCOL" - portNumberSpecForHelp = "PORT_NUMBER" - portIdSpecForHelp = "PORT_ID" - - // Each envvar should be KEY1=VALUE1, which means we should have two components to each envvar declaration - expectedNumberKeyValueComponentsInEnvvarDeclaration = 2 - portNumberIndex = 0 - transportProtocolIndex = 1 - expectedPortIdSpecComponentsCount = 2 - expectedMountFragmentsCount = 2 - - minRemainingPortSpecComponents = 1 - maxRemainingPortSpecComponents = 2 - - defaultPortWaitTimeoutStr = "30s" -) - -var ( - defaultTransportProtocolStr = strings.ToLower(kurtosis_core_rpc_api_bindings.Port_TCP.String()) - serviceAddSpec = fmt.Sprintf( - `%v%v%v%v%v`, - maybeApplicationProtocolSpecForHelp, - portApplicationProtocolDelimiter, - portNumberSpecForHelp, - portNumberProtocolDelimiter, - transportProtocolSpecForHelp, - ) - serviceAddSpecWithPortId = fmt.Sprintf( - `%v%v%v`, - portIdSpecForHelp, - portIdSpecDelimiter, - serviceAddSpec, - ) ) // ServiceCmd Suppressing exhaustruct requirement because this struct has ~40 properties @@ -109,287 +38,3 @@ func init() { ServiceCmd.AddCommand(inspect.ServiceInspectCmd.MustGetCobraCommand()) ServiceCmd.AddCommand(update.ServiceUpdateCmd.MustGetCobraCommand()) } - -// Helpers -func GetServiceInfo(ctx context.Context, kurtosisCtx *kurtosis_context.KurtosisContext, enclaveIdentifier, serviceIdentifier string) (*kurtosis_core_rpc_api_bindings.ServiceInfo, *services.ServiceConfig, error) { - enclaveInfo, err := kurtosisCtx.GetEnclave(ctx, enclaveIdentifier) - if err != nil { - return nil, nil, stacktrace.Propagate(err, "An error occurred getting the enclave for identifier '%v'", enclaveIdentifier) - } - - enclaveApiContainerStatus := enclaveInfo.ApiContainerStatus - isApiContainerRunning := enclaveApiContainerStatus == kurtosis_engine_rpc_api_bindings.EnclaveAPIContainerStatus_EnclaveAPIContainerStatus_RUNNING - - userServices := map[string]*kurtosis_core_rpc_api_bindings.ServiceInfo{} - if isApiContainerRunning { - var err error - serviceMap := map[string]bool{ - serviceIdentifier: true, - } - userServices, err = user_services.GetUserServiceInfoMapFromAPIContainer(ctx, enclaveInfo, serviceMap) - if err != nil { - return nil, nil, stacktrace.Propagate(err, "Failed to get service info from API container in enclave '%v'", enclaveInfo.GetEnclaveUuid()) - } - } - - var service *kurtosis_core_rpc_api_bindings.ServiceInfo - for _, serviceInfo := range userServices { - service = serviceInfo - break - } - - serviceConfig := &services.ServiceConfig{ - Image: service.GetContainer().GetImageName(), - PrivatePorts: nil, - PublicPorts: nil, - Files: nil, - Entrypoint: service.GetContainer().GetEntrypointArgs(), - Cmd: service.GetContainer().GetCmdArgs(), - EnvVars: service.GetContainer().GetEnvVars(), - PrivateIPAddressPlaceholder: "", - MaxMillicpus: service.GetMaxMillicpus(), - MinMillicpus: service.GetMinMillicpus(), - MaxMemory: service.GetMaxMemoryMegabytes(), - MinMemory: service.GetMinMemoryMegabytes(), - User: nil, - Tolerations: nil, - NodeSelectors: nil, - TiniEnabled: nil, - } - - return service, serviceConfig, nil -} - -func GetAddServiceStarlarkScript(serviceName string, serviceConfigStarlark string) string { - return fmt.Sprintf(`def run(plan): - plan.add_service(name = "%s", config = %s) -`, serviceName, serviceConfigStarlark) -} - -func RunAddServiceStarlarkScript(ctx context.Context, serviceName, enclaveIdentifier, starlarkScript string, enclaveCtx *enclaves.EnclaveContext) (*enclaves.StarlarkRunResult, error) { - starlarkRunResult, err := enclaveCtx.RunStarlarkScriptBlocking(ctx, starlarkScript, starlark_run_config.NewRunStarlarkConfig()) - if err != nil { - return nil, stacktrace.Propagate(err, "An error has occurred when running Starlark to add service") - } - if starlarkRunResult.InterpretationError != nil { - return nil, stacktrace.NewError("An error has occurred when adding service: %s\nThis is a bug in Kurtosis, please report.", starlarkRunResult.InterpretationError) - } - if len(starlarkRunResult.ValidationErrors) > 0 { - return nil, stacktrace.NewError("An error occurred when validating add service '%v' to enclave '%v': %s", serviceName, enclaveIdentifier, starlarkRunResult.ValidationErrors) - } - if starlarkRunResult.ExecutionError != nil { - return nil, stacktrace.NewError("An error occurred adding service '%v' to enclave '%v': %s", serviceName, enclaveIdentifier, starlarkRunResult.ExecutionError) - } - return starlarkRunResult, nil -} - -// Parses a string in the form KEY1=VALUE1,KEY2=VALUE2 into a map of strings -// An empty string will result in an empty map -// Empty strings will be skipped (e.g. ',,,' will result in an empty map) -func ParseEnvVarsStr(envvarsStr string) (map[string]string, error) { - result := map[string]string{} - if envvarsStr == "" { - return result, nil - } - - allEnvvarDeclarationStrs := strings.Split(envvarsStr, envvarDeclarationsDelimiter) - for _, envvarDeclarationStr := range allEnvvarDeclarationStrs { - if len(strings.TrimSpace(envvarDeclarationStr)) == 0 { - continue - } - - envvarKeyValueComponents := strings.SplitN(envvarDeclarationStr, envvarKeyValueDelimiter, expectedNumberKeyValueComponentsInEnvvarDeclaration) - if len(envvarKeyValueComponents) < expectedNumberKeyValueComponentsInEnvvarDeclaration { - return nil, stacktrace.NewError("Environment declaration string '%v' must be of the form KEY1%vVALUE1", envvarDeclarationStr, envvarKeyValueDelimiter) - } - key := envvarKeyValueComponents[0] - value := envvarKeyValueComponents[1] - - preexistingValue, found := result[key] - if found { - return nil, stacktrace.NewError( - "Cannot declare environment variable '%v' assigned to value '%v' because the key has previously been assigned to value '%v'", - key, - value, - preexistingValue, - ) - } - - result[key] = value - } - - return result, nil -} - -// Parses a string in the form PORTID1=1234,PORTID2=5678/udp -// An empty string will result in an empty map -// Empty strings will be skipped (e.g. ',,,' will result in an empty map) -func ParsePortsStr(portsStr string) (map[string]*kurtosis_core_rpc_api_bindings.Port, error) { - result := map[string]*kurtosis_core_rpc_api_bindings.Port{} - if strings.TrimSpace(portsStr) == "" { - return result, nil - } - - allPortDeclarationStrs := strings.Split(portsStr, portDeclarationsDelimiter) - for _, portDeclarationStr := range allPortDeclarationStrs { - if len(strings.TrimSpace(portDeclarationStr)) == 0 { - continue - } - - portIdSpecComponents := strings.Split(portDeclarationStr, portIdSpecDelimiter) - if len(portIdSpecComponents) != expectedPortIdSpecComponentsCount { - return nil, stacktrace.NewError("Port declaration string '%v' must be of the form PORTID%vSPEC", portDeclarationStr, portIdSpecDelimiter) - } - portId := portIdSpecComponents[0] - specStr := portIdSpecComponents[1] - if len(strings.TrimSpace(portId)) == 0 { - return nil, stacktrace.NewError("Port declaration with spec string '%v' has an empty port ID", specStr) - } - portSpec, err := parsePortSpecStr(specStr) - if err != nil { - return nil, stacktrace.Propagate(err, "An error occurred parsing port spec string '%v' for port with ID '%v'", specStr, portId) - } - - if _, found := result[portId]; found { - return nil, stacktrace.NewError( - "Cannot define port '%v' with spec '%v' because it is already defined", - portId, - specStr, - ) - } - - result[portId] = portSpec - } - - return result, nil -} - -func parsePortSpecStr(specStr string) (*kurtosis_core_rpc_api_bindings.Port, error) { - if len(strings.TrimSpace(specStr)) == 0 { - return nil, stacktrace.NewError("Cannot parse empty spec string") - } - - maybeApplicationProtocol, remainingPortSpec, err := getMaybeApplicationProtocolFromPortSpecString(specStr) - if err != nil { - return nil, stacktrace.Propagate(err, "Error occurred while parsing application protocol '%v' in port spec '%v'", maybeApplicationProtocol, specStr) - } - - remainingPortSpecComponents := strings.Split(remainingPortSpec, portNumberProtocolDelimiter) - numRemainingPortSpecComponents := len(remainingPortSpecComponents) - if numRemainingPortSpecComponents > maxRemainingPortSpecComponents { - return nil, stacktrace.NewError( - `Invalid port spec string, expected format is %q but got '%v'`, - serviceAddSpec, - specStr, - ) - } - - portNumberUint16, err := getPortNumberFromPortSpecString(remainingPortSpecComponents[portNumberIndex]) - if err != nil { - return nil, stacktrace.Propagate(err, "Error occurred while parsing port number '%v' in port spec '%v'", remainingPortSpecComponents[portNumberIndex], specStr) - } - - transportProtocol := defaultTransportProtocolStr - if numRemainingPortSpecComponents > minRemainingPortSpecComponents { - transportProtocol = remainingPortSpecComponents[transportProtocolIndex] - } - - transportProtocolFromEnum, err := getTransportProtocolFromPortSpecString(transportProtocol) - if err != nil { - return nil, stacktrace.Propagate(err, "Error occurred while parsing transport protocol '%v' in port spec '%v'", remainingPortSpecComponents[transportProtocolIndex], specStr) - } - return &kurtosis_core_rpc_api_bindings.Port{ - Number: portNumberUint16, - TransportProtocol: transportProtocolFromEnum, - MaybeApplicationProtocol: maybeApplicationProtocol, - MaybeWaitTimeout: defaultPortWaitTimeoutStr, //TODO we should add this to the port's arguments instead of using only a default value - Locked: nil, - Alias: nil, - }, nil -} - -/* -* -This method takes in port protocol string and parses it to get application protocol. -It looks for `:` delimiter and splits the string into array of at most size 2. If the length -of array is 2 then application protocol exists, otherwise it does not. This is basically what -strings.Cut() does. // TODO: use that instead once we update go version -*/ -func getMaybeApplicationProtocolFromPortSpecString(portProtocolStr string) (string, string, error) { - - beforeDelimiter, afterDelimiter, foundDelimiter := strings.Cut(portProtocolStr, portApplicationProtocolDelimiter) - - if !foundDelimiter { - return emptyApplicationProtocol, beforeDelimiter, nil - } - - if foundDelimiter && beforeDelimiter == emptyApplicationProtocol { - return emptyApplicationProtocol, "", stacktrace.NewError("optional application protocol argument cannot be empty") - } - - return beforeDelimiter, afterDelimiter, nil -} - -func getPortNumberFromPortSpecString(portNumberStr string) (uint32, error) { - portNumberUint64, err := strconv.ParseUint(portNumberStr, portNumberUintParsingBase, portNumberUintParsingBits) - if err != nil { - return 0, stacktrace.Propagate( - err, - "An error occurred parsing port number string '%v' with base '%v' and bits '%v'", - portNumberStr, - portNumberUintParsingBase, - portNumberUintParsingBits, - ) - } - portNumberUint32 := uint32(portNumberUint64) - return portNumberUint32, nil -} - -func getTransportProtocolFromPortSpecString(portSpec string) (kurtosis_core_rpc_api_bindings.Port_TransportProtocol, error) { - transportProtocolEnumInt, found := kurtosis_core_rpc_api_bindings.Port_TransportProtocol_value[strings.ToUpper(portSpec)] - if !found { - return 0, stacktrace.NewError("Unrecognized port protocol '%v'", portSpec) - } - return kurtosis_core_rpc_api_bindings.Port_TransportProtocol(transportProtocolEnumInt), nil -} - -func ParseFilesArtifactMountsStr(filesArtifactMountsStr string) (map[string]string, error) { - result := map[string]string{} - if strings.TrimSpace(filesArtifactMountsStr) == "" { - return result, nil - } - - // NOTE: we might actually want to allow the same artifact being mounted in multiple places - allMountStrs := strings.Split(filesArtifactMountsStr, filesArtifactMountsDelimiter) - for idx, mountStr := range allMountStrs { - trimmedMountStr := strings.TrimSpace(mountStr) - if len(trimmedMountStr) == 0 { - continue - } - - mountFragments := strings.Split(trimmedMountStr, filesArtifactMountpointDelimiter) - if len(mountFragments) != expectedMountFragmentsCount { - return nil, stacktrace.NewError( - "Files artifact mountpoint string %v was '%v' but should be in the form 'mountpoint%sfiles_artifact_name'", - idx, - trimmedMountStr, - filesArtifactMountpointDelimiter, - ) - } - mountpoint := mountFragments[0] - filesArtifactName := mountFragments[1] - - if existingName, found := result[mountpoint]; found { - return nil, stacktrace.NewError( - "Mountpoint '%v' is declared twice; once to artifact name '%v' and again to artifact name '%v'", - mountpoint, - existingName, - filesArtifactName, - ) - } - - result[mountpoint] = filesArtifactName - } - - return result, nil -} diff --git a/cli/cli/commands/service/service_helpers/service_helpers.go b/cli/cli/commands/service/service_helpers/service_helpers.go new file mode 100644 index 0000000000..ee797df85a --- /dev/null +++ b/cli/cli/commands/service/service_helpers/service_helpers.go @@ -0,0 +1,359 @@ +package service_helpers + +import ( + "context" + "fmt" + "github.com/kurtosis-tech/kurtosis/api/golang/core/kurtosis_core_rpc_api_bindings" + "github.com/kurtosis-tech/kurtosis/api/golang/core/lib/enclaves" + "github.com/kurtosis-tech/kurtosis/api/golang/core/lib/services" + "github.com/kurtosis-tech/kurtosis/api/golang/core/lib/starlark_run_config" + "github.com/kurtosis-tech/kurtosis/api/golang/engine/kurtosis_engine_rpc_api_bindings" + "github.com/kurtosis-tech/kurtosis/api/golang/engine/lib/kurtosis_context" + "github.com/kurtosis-tech/kurtosis/cli/cli/helpers/user_services" + "github.com/kurtosis-tech/stacktrace" + "strconv" + "strings" +) + +const ( + ImageKey = "image" + CmdKey = "cmd" + EntrypointFlagKey = "entrypoint" + + EnvvarsFlagKey = "env" + envvarKeyValueDelimiter = "=" + envvarDeclarationsDelimiter = "," + + PortsFlagKey = "ports" + portIdSpecDelimiter = "=" + portNumberProtocolDelimiter = "/" + portDeclarationsDelimiter = "," + portApplicationProtocolDelimiter = ":" + portNumberUintParsingBase = 10 + portNumberUintParsingBits = 16 + + FilesFlagKey = "files" + filesArtifactMountsDelimiter = "," + filesArtifactMountpointDelimiter = ":" + + emptyApplicationProtocol = "" + + maybeApplicationProtocolSpecForHelp = "MAYBE_APPLICATION_PROTOCOL" + transportProtocolSpecForHelp = "TRANSPORT_PROTOCOL" + portNumberSpecForHelp = "PORT_NUMBER" + portIdSpecForHelp = "PORT_ID" + + // Each envvar should be KEY1=VALUE1, which means we should have two components to each envvar declaration + expectedNumberKeyValueComponentsInEnvvarDeclaration = 2 + portNumberIndex = 0 + transportProtocolIndex = 1 + expectedPortIdSpecComponentsCount = 2 + expectedMountFragmentsCount = 2 + + minRemainingPortSpecComponents = 1 + maxRemainingPortSpecComponents = 2 + + defaultPortWaitTimeoutStr = "30s" +) + +var ( + defaultTransportProtocolStr = strings.ToLower(kurtosis_core_rpc_api_bindings.Port_TCP.String()) + serviceAddSpec = fmt.Sprintf( + `%v%v%v%v%v`, + maybeApplicationProtocolSpecForHelp, + portApplicationProtocolDelimiter, + portNumberSpecForHelp, + portNumberProtocolDelimiter, + transportProtocolSpecForHelp, + ) + serviceAddSpecWithPortId = fmt.Sprintf( + `%v%v%v`, + portIdSpecForHelp, + portIdSpecDelimiter, + serviceAddSpec, + ) +) + +// Helpers +func GetServiceInfo(ctx context.Context, kurtosisCtx *kurtosis_context.KurtosisContext, enclaveIdentifier, serviceIdentifier string) (*kurtosis_core_rpc_api_bindings.ServiceInfo, *services.ServiceConfig, error) { + enclaveInfo, err := kurtosisCtx.GetEnclave(ctx, enclaveIdentifier) + if err != nil { + return nil, nil, stacktrace.Propagate(err, "An error occurred getting the enclave for identifier '%v'", enclaveIdentifier) + } + + enclaveApiContainerStatus := enclaveInfo.ApiContainerStatus + isApiContainerRunning := enclaveApiContainerStatus == kurtosis_engine_rpc_api_bindings.EnclaveAPIContainerStatus_EnclaveAPIContainerStatus_RUNNING + + userServices := map[string]*kurtosis_core_rpc_api_bindings.ServiceInfo{} + if isApiContainerRunning { + var err error + serviceMap := map[string]bool{ + serviceIdentifier: true, + } + userServices, err = user_services.GetUserServiceInfoMapFromAPIContainer(ctx, enclaveInfo, serviceMap) + if err != nil { + return nil, nil, stacktrace.Propagate(err, "Failed to get service info from API container in enclave '%v'", enclaveInfo.GetEnclaveUuid()) + } + } + + var service *kurtosis_core_rpc_api_bindings.ServiceInfo + for _, serviceInfo := range userServices { + service = serviceInfo + break + } + + serviceConfig := &services.ServiceConfig{ + Image: service.GetContainer().GetImageName(), + PrivatePorts: nil, + PublicPorts: nil, + Files: nil, + Entrypoint: service.GetContainer().GetEntrypointArgs(), + Cmd: service.GetContainer().GetCmdArgs(), + EnvVars: service.GetContainer().GetEnvVars(), + PrivateIPAddressPlaceholder: "", + MaxMillicpus: service.GetMaxMillicpus(), + MinMillicpus: service.GetMinMillicpus(), + MaxMemory: service.GetMaxMemoryMegabytes(), + MinMemory: service.GetMinMemoryMegabytes(), + User: nil, + Tolerations: nil, + NodeSelectors: nil, + TiniEnabled: nil, + } + + return service, serviceConfig, nil +} + +func GetAddServiceStarlarkScript(serviceName string, serviceConfigStarlark string) string { + return fmt.Sprintf(`def run(plan): + plan.add_service(name = "%s", config = %s) +`, serviceName, serviceConfigStarlark) +} + +func RunAddServiceStarlarkScript(ctx context.Context, serviceName, enclaveIdentifier, starlarkScript string, enclaveCtx *enclaves.EnclaveContext) (*enclaves.StarlarkRunResult, error) { + starlarkRunResult, err := enclaveCtx.RunStarlarkScriptBlocking(ctx, starlarkScript, starlark_run_config.NewRunStarlarkConfig()) + if err != nil { + return nil, stacktrace.Propagate(err, "An error has occurred when running Starlark to add service") + } + if starlarkRunResult.InterpretationError != nil { + return nil, stacktrace.NewError("An error has occurred when adding service: %s\nThis is a bug in Kurtosis, please report.", starlarkRunResult.InterpretationError) + } + if len(starlarkRunResult.ValidationErrors) > 0 { + return nil, stacktrace.NewError("An error occurred when validating add service '%v' to enclave '%v': %s", serviceName, enclaveIdentifier, starlarkRunResult.ValidationErrors) + } + if starlarkRunResult.ExecutionError != nil { + return nil, stacktrace.NewError("An error occurred adding service '%v' to enclave '%v': %s", serviceName, enclaveIdentifier, starlarkRunResult.ExecutionError) + } + return starlarkRunResult, nil +} + +// Parses a string in the form KEY1=VALUE1,KEY2=VALUE2 into a map of strings +// An empty string will result in an empty map +// Empty strings will be skipped (e.g. ',,,' will result in an empty map) +func ParseEnvVarsStr(envvarsStr string) (map[string]string, error) { + result := map[string]string{} + if envvarsStr == "" { + return result, nil + } + + allEnvvarDeclarationStrs := strings.Split(envvarsStr, envvarDeclarationsDelimiter) + for _, envvarDeclarationStr := range allEnvvarDeclarationStrs { + if len(strings.TrimSpace(envvarDeclarationStr)) == 0 { + continue + } + + envvarKeyValueComponents := strings.SplitN(envvarDeclarationStr, envvarKeyValueDelimiter, expectedNumberKeyValueComponentsInEnvvarDeclaration) + if len(envvarKeyValueComponents) < expectedNumberKeyValueComponentsInEnvvarDeclaration { + return nil, stacktrace.NewError("Environment declaration string '%v' must be of the form KEY1%vVALUE1", envvarDeclarationStr, envvarKeyValueDelimiter) + } + key := envvarKeyValueComponents[0] + value := envvarKeyValueComponents[1] + + preexistingValue, found := result[key] + if found { + return nil, stacktrace.NewError( + "Cannot declare environment variable '%v' assigned to value '%v' because the key has previously been assigned to value '%v'", + key, + value, + preexistingValue, + ) + } + + result[key] = value + } + + return result, nil +} + +// Parses a string in the form PORTID1=1234,PORTID2=5678/udp +// An empty string will result in an empty map +// Empty strings will be skipped (e.g. ',,,' will result in an empty map) +func ParsePortsStr(portsStr string) (map[string]*kurtosis_core_rpc_api_bindings.Port, error) { + result := map[string]*kurtosis_core_rpc_api_bindings.Port{} + if strings.TrimSpace(portsStr) == "" { + return result, nil + } + + allPortDeclarationStrs := strings.Split(portsStr, portDeclarationsDelimiter) + for _, portDeclarationStr := range allPortDeclarationStrs { + if len(strings.TrimSpace(portDeclarationStr)) == 0 { + continue + } + + portIdSpecComponents := strings.Split(portDeclarationStr, portIdSpecDelimiter) + if len(portIdSpecComponents) != expectedPortIdSpecComponentsCount { + return nil, stacktrace.NewError("Port declaration string '%v' must be of the form PORTID%vSPEC", portDeclarationStr, portIdSpecDelimiter) + } + portId := portIdSpecComponents[0] + specStr := portIdSpecComponents[1] + if len(strings.TrimSpace(portId)) == 0 { + return nil, stacktrace.NewError("Port declaration with spec string '%v' has an empty port ID", specStr) + } + portSpec, err := parsePortSpecStr(specStr) + if err != nil { + return nil, stacktrace.Propagate(err, "An error occurred parsing port spec string '%v' for port with ID '%v'", specStr, portId) + } + + if _, found := result[portId]; found { + return nil, stacktrace.NewError( + "Cannot define port '%v' with spec '%v' because it is already defined", + portId, + specStr, + ) + } + + result[portId] = portSpec + } + + return result, nil +} + +func parsePortSpecStr(specStr string) (*kurtosis_core_rpc_api_bindings.Port, error) { + if len(strings.TrimSpace(specStr)) == 0 { + return nil, stacktrace.NewError("Cannot parse empty spec string") + } + + maybeApplicationProtocol, remainingPortSpec, err := getMaybeApplicationProtocolFromPortSpecString(specStr) + if err != nil { + return nil, stacktrace.Propagate(err, "Error occurred while parsing application protocol '%v' in port spec '%v'", maybeApplicationProtocol, specStr) + } + + remainingPortSpecComponents := strings.Split(remainingPortSpec, portNumberProtocolDelimiter) + numRemainingPortSpecComponents := len(remainingPortSpecComponents) + if numRemainingPortSpecComponents > maxRemainingPortSpecComponents { + return nil, stacktrace.NewError( + `Invalid port spec string, expected format is %q but got '%v'`, + serviceAddSpec, + specStr, + ) + } + + portNumberUint16, err := getPortNumberFromPortSpecString(remainingPortSpecComponents[portNumberIndex]) + if err != nil { + return nil, stacktrace.Propagate(err, "Error occurred while parsing port number '%v' in port spec '%v'", remainingPortSpecComponents[portNumberIndex], specStr) + } + + transportProtocol := defaultTransportProtocolStr + if numRemainingPortSpecComponents > minRemainingPortSpecComponents { + transportProtocol = remainingPortSpecComponents[transportProtocolIndex] + } + + transportProtocolFromEnum, err := getTransportProtocolFromPortSpecString(transportProtocol) + if err != nil { + return nil, stacktrace.Propagate(err, "Error occurred while parsing transport protocol '%v' in port spec '%v'", remainingPortSpecComponents[transportProtocolIndex], specStr) + } + return &kurtosis_core_rpc_api_bindings.Port{ + Number: portNumberUint16, + TransportProtocol: transportProtocolFromEnum, + MaybeApplicationProtocol: maybeApplicationProtocol, + MaybeWaitTimeout: defaultPortWaitTimeoutStr, //TODO we should add this to the port's arguments instead of using only a default value + Locked: nil, + Alias: nil, + }, nil +} + +/* +* +This method takes in port protocol string and parses it to get application protocol. +It looks for `:` delimiter and splits the string into array of at most size 2. If the length +of array is 2 then application protocol exists, otherwise it does not. This is basically what +strings.Cut() does. // TODO: use that instead once we update go version +*/ +func getMaybeApplicationProtocolFromPortSpecString(portProtocolStr string) (string, string, error) { + + beforeDelimiter, afterDelimiter, foundDelimiter := strings.Cut(portProtocolStr, portApplicationProtocolDelimiter) + + if !foundDelimiter { + return emptyApplicationProtocol, beforeDelimiter, nil + } + + if foundDelimiter && beforeDelimiter == emptyApplicationProtocol { + return emptyApplicationProtocol, "", stacktrace.NewError("optional application protocol argument cannot be empty") + } + + return beforeDelimiter, afterDelimiter, nil +} + +func getPortNumberFromPortSpecString(portNumberStr string) (uint32, error) { + portNumberUint64, err := strconv.ParseUint(portNumberStr, portNumberUintParsingBase, portNumberUintParsingBits) + if err != nil { + return 0, stacktrace.Propagate( + err, + "An error occurred parsing port number string '%v' with base '%v' and bits '%v'", + portNumberStr, + portNumberUintParsingBase, + portNumberUintParsingBits, + ) + } + portNumberUint32 := uint32(portNumberUint64) + return portNumberUint32, nil +} + +func getTransportProtocolFromPortSpecString(portSpec string) (kurtosis_core_rpc_api_bindings.Port_TransportProtocol, error) { + transportProtocolEnumInt, found := kurtosis_core_rpc_api_bindings.Port_TransportProtocol_value[strings.ToUpper(portSpec)] + if !found { + return 0, stacktrace.NewError("Unrecognized port protocol '%v'", portSpec) + } + return kurtosis_core_rpc_api_bindings.Port_TransportProtocol(transportProtocolEnumInt), nil +} + +func ParseFilesArtifactMountsStr(filesArtifactMountsStr string) (map[string]string, error) { + result := map[string]string{} + if strings.TrimSpace(filesArtifactMountsStr) == "" { + return result, nil + } + + // NOTE: we might actually want to allow the same artifact being mounted in multiple places + allMountStrs := strings.Split(filesArtifactMountsStr, filesArtifactMountsDelimiter) + for idx, mountStr := range allMountStrs { + trimmedMountStr := strings.TrimSpace(mountStr) + if len(trimmedMountStr) == 0 { + continue + } + + mountFragments := strings.Split(trimmedMountStr, filesArtifactMountpointDelimiter) + if len(mountFragments) != expectedMountFragmentsCount { + return nil, stacktrace.NewError( + "Files artifact mountpoint string %v was '%v' but should be in the form 'mountpoint%sfiles_artifact_name'", + idx, + trimmedMountStr, + filesArtifactMountpointDelimiter, + ) + } + mountpoint := mountFragments[0] + filesArtifactName := mountFragments[1] + + if existingName, found := result[mountpoint]; found { + return nil, stacktrace.NewError( + "Mountpoint '%v' is declared twice; once to artifact name '%v' and again to artifact name '%v'", + mountpoint, + existingName, + filesArtifactName, + ) + } + + result[mountpoint] = filesArtifactName + } + + return result, nil +} diff --git a/cli/cli/commands/service/update/update.go b/cli/cli/commands/service/update/update.go index b0acb04704..6abb7f6efb 100644 --- a/cli/cli/commands/service/update/update.go +++ b/cli/cli/commands/service/update/update.go @@ -13,7 +13,7 @@ import ( "github.com/kurtosis-tech/kurtosis/cli/cli/command_framework/lowlevel/args" "github.com/kurtosis-tech/kurtosis/cli/cli/command_framework/lowlevel/flags" "github.com/kurtosis-tech/kurtosis/cli/cli/command_str_consts" - "github.com/kurtosis-tech/kurtosis/cli/cli/commands/service" + "github.com/kurtosis-tech/kurtosis/cli/cli/commands/service/service_helpers" "github.com/kurtosis-tech/kurtosis/cli/cli/out" "github.com/kurtosis-tech/kurtosis/container-engine-lib/lib/backend_interface" "github.com/kurtosis-tech/kurtosis/metrics-library/golang/lib/metrics_client" @@ -84,20 +84,20 @@ var ServiceUpdateCmd = &engine_consuming_kurtosis_command.EngineConsumingKurtosi EngineClientContextKey: engineClientCtxKey, Flags: []*flags.FlagConfig{ { - Key: service.ImageKey, + Key: service_helpers.ImageKey, Usage: "image", Type: flags.FlagType_String, Default: "", }, { - Key: service.CmdKey, + Key: service_helpers.CmdKey, Usage: "cmd", // TODO Make this a string list Type: flags.FlagType_String, Default: "", }, { - Key: service.EntrypointFlagKey, + Key: service_helpers.EntrypointFlagKey, Usage: "ENTRYPOINT binary that will be used when running the container, overriding the image's default ENTRYPOINT", // TODO Make this a string list Type: flags.FlagType_String, @@ -105,7 +105,7 @@ var ServiceUpdateCmd = &engine_consuming_kurtosis_command.EngineConsumingKurtosi }, { // TODO We currently can't handle commas, so allow users to set the flag multiple times to set multiple envvars - Key: service.EnvvarsFlagKey, + Key: service_helpers.EnvvarsFlagKey, Usage: fmt.Sprintf( "String containing environment variables that will be set when running the container, in "+ "the form \"KEY1%vVALUE1%vKEY2%vVALUE2\"", @@ -117,7 +117,7 @@ var ServiceUpdateCmd = &engine_consuming_kurtosis_command.EngineConsumingKurtosi Default: "", }, { - Key: service.PortsFlagKey, + Key: service_helpers.PortsFlagKey, Usage: fmt.Sprintf(`String containing declarations of ports that the container will listen on, in the form, %q`+ ` where %q is a user friendly string for identifying the port, %q is required field, %q is an optional field which must be either`+ ` '%v' or '%v' and defaults to '%v' if omitted and %q is user defined optional value. %v`, @@ -135,7 +135,7 @@ var ServiceUpdateCmd = &engine_consuming_kurtosis_command.EngineConsumingKurtosi Default: "", }, { - Key: service.FilesFlagKey, + Key: service_helpers.FilesFlagKey, Usage: fmt.Sprintf( "String containing declarations of files paths on the container -> artifact name where the contents of those "+ "files artifacts should be mounted, in the form \"MOUNTPATH1%vARTIFACTNAME1%vMOUNTPATH2%vARTIFACTNAME2\" where "+ @@ -230,7 +230,7 @@ func run( return stacktrace.Propagate(err, "An error occurred getting the env vars string using key '%v'", envvarsFlagKey) } if envVarsStr != "" { - overrideEnvVars, err = service.ParseEnvVarsStr(envVarsStr) + overrideEnvVars, err = service_helpers.ParseEnvVarsStr(envVarsStr) if err != nil { return stacktrace.Propagate(err, "An error occurred parsing env vars string: %v", envVarsStr) } @@ -241,7 +241,7 @@ func run( return stacktrace.Propagate(err, "An error occurred getting the ports string using key '%v'", portsFlagKey) } if portsStr != "" { - overridePorts, err = service.ParsePortsStr(portsStr) + overridePorts, err = service_helpers.ParsePortsStr(portsStr) if err != nil { return stacktrace.Propagate(err, "An error occurred parsing ports string: %v", portsStr) } @@ -252,13 +252,13 @@ func run( return stacktrace.Propagate(err, "An error occurred getting the files artifact mounts string using key '%v'", filesFlagKey) } if filesArtifactMountsStr != "" { - overrideFilesArtifactsMountpoint, err = service.ParseFilesArtifactMountsStr(filesArtifactMountsStr) + overrideFilesArtifactsMountpoint, err = service_helpers.ParseFilesArtifactMountsStr(filesArtifactMountsStr) if err != nil { return stacktrace.Propagate(err, "An error occurred parsing files artifacts mount points string: %v", filesArtifactMountsStr) } } - _, currServiceConfig, err := service.GetServiceInfo(ctx, kurtosisCtx, enclaveIdentifier, serviceName) + _, currServiceConfig, err := service_helpers.GetServiceInfo(ctx, kurtosisCtx, enclaveIdentifier, serviceName) if err != nil { return stacktrace.Propagate(err, "An error occurred getting service info of service '%v' in enclave '%v'.", serviceName, enclaveIdentifier) } @@ -343,10 +343,10 @@ func run( ) //logrus.Infof("SERVICE CONFIG STRING: %v", serviceConfigStr) - addServiceStarlarkStr := service.GetAddServiceStarlarkScript(serviceName, serviceConfigStr) + addServiceStarlarkStr := service_helpers.GetAddServiceStarlarkScript(serviceName, serviceConfigStr) logrus.Infof("Running update service starlark for service '%v' in enclave '%v'...", serviceName, enclaveIdentifier) - starlarkRunResult, err := service.RunAddServiceStarlarkScript(ctx, serviceName, enclaveIdentifier, addServiceStarlarkStr, enclaveCtx) + starlarkRunResult, err := service_helpers.RunAddServiceStarlarkScript(ctx, serviceName, enclaveIdentifier, addServiceStarlarkStr, enclaveCtx) if err != nil { return err //already wrapped } From 7d23796184b5a35a62cf4c4717c8d0a2a912ef8e Mon Sep 17 00:00:00 2001 From: Tedi Mitiku Date: Thu, 27 Mar 2025 16:17:41 -0400 Subject: [PATCH 08/48] mv tests --- .../add_test.go => service_helpers/service_helpers_test.go} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename cli/cli/commands/service/{add/add_test.go => service_helpers/service_helpers_test.go} (99%) diff --git a/cli/cli/commands/service/add/add_test.go b/cli/cli/commands/service/service_helpers/service_helpers_test.go similarity index 99% rename from cli/cli/commands/service/add/add_test.go rename to cli/cli/commands/service/service_helpers/service_helpers_test.go index 671f807752..c02e1e3e22 100644 --- a/cli/cli/commands/service/add/add_test.go +++ b/cli/cli/commands/service/service_helpers/service_helpers_test.go @@ -1,4 +1,4 @@ -package add +package service_helpers import ( "fmt" From 472e91ddbea3e2e11258a6488f7bc4f77123c80d Mon Sep 17 00:00:00 2001 From: Tedi Mitiku Date: Thu, 27 Mar 2025 16:26:40 -0400 Subject: [PATCH 09/48] add back in private ip addr placeholder --- api/golang/core/lib/services/service_config_builder.go | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/api/golang/core/lib/services/service_config_builder.go b/api/golang/core/lib/services/service_config_builder.go index 01faa9f92a..97c9424c20 100644 --- a/api/golang/core/lib/services/service_config_builder.go +++ b/api/golang/core/lib/services/service_config_builder.go @@ -146,6 +146,7 @@ func GetFullServiceConfigStarlark( nodeSelectors map[string]string, labels map[string]string, tiniEnabled *bool, + privateIpAddrPlaceholder string, ) string { starlarkFields := []string{} starlarkFields = append(starlarkFields, fmt.Sprintf(`image=%q`, containerImageName)) @@ -209,6 +210,10 @@ func GetFullServiceConfigStarlark( starlarkFields = append(starlarkFields, fmt.Sprintf(`min_memory=%d`, minMemoryMegaBytes)) } + if privateIpAddrPlaceholder != "" { + starlarkFields = append(starlarkFields, fmt.Sprintf(`private_ip_address_placeholder=%q`, privateIpAddrPlaceholder)) + } + // User if user != nil { userStr := fmt.Sprintf("User(uid=%d", user.UID) From 04f3574d49ec8dc527b3cd54befd3d799f703b2e Mon Sep 17 00:00:00 2001 From: Tedi Mitiku Date: Thu, 27 Mar 2025 16:55:16 -0400 Subject: [PATCH 10/48] add json-config to service add --- .../lib/services/service_config_builder.go | 16 +++ cli/cli/commands/service/add/add.go | 107 +++++++++++++++--- cli/cli/commands/service/update/update.go | 24 ++-- 3 files changed, 116 insertions(+), 31 deletions(-) diff --git a/api/golang/core/lib/services/service_config_builder.go b/api/golang/core/lib/services/service_config_builder.go index 97c9424c20..2483154c2d 100644 --- a/api/golang/core/lib/services/service_config_builder.go +++ b/api/golang/core/lib/services/service_config_builder.go @@ -261,3 +261,19 @@ func GetFullServiceConfigStarlark( return fmt.Sprintf("ServiceConfig(%s)", strings.Join(starlarkFields, ", ")) } + +func ConvertJsonPortToApiPort(jsonPorts map[string]Port) map[string]*kurtosis_core_rpc_api_bindings.Port { + apiPorts := map[string]*kurtosis_core_rpc_api_bindings.Port{} + for portId, port := range jsonPorts { + apiPort := &kurtosis_core_rpc_api_bindings.Port{ + Number: port.Number, + TransportProtocol: kurtosis_core_rpc_api_bindings.Port_TransportProtocol(port.Transport), + MaybeApplicationProtocol: port.MaybeApplicationProtocol, + MaybeWaitTimeout: port.Wait, + Locked: nil, + Alias: nil, + } + apiPorts[portId] = apiPort + } + return apiPorts +} diff --git a/cli/cli/commands/service/add/add.go b/cli/cli/commands/service/add/add.go index 07e2c21b2c..b23c8120a5 100644 --- a/cli/cli/commands/service/add/add.go +++ b/cli/cli/commands/service/add/add.go @@ -2,6 +2,7 @@ package add import ( "context" + "encoding/json" "fmt" "github.com/kurtosis-tech/kurtosis/cli/cli/commands/service/service_helpers" "strings" @@ -72,6 +73,9 @@ const ( fullUuidsFlagKey = "full-uuids" fullUuidFlagKeyDefault = "false" + JsonConfigFlagKey = "json-service-config" + JsonConfigFlagKeyDefault = "" + portMappingSeparatorForLogs = ", " defaultPortWaitTimeoutStr = "30s" @@ -183,6 +187,12 @@ var ServiceAddCmd = &engine_consuming_kurtosis_command.EngineConsumingKurtosisCo Type: flags.FlagType_Bool, Default: fullUuidFlagKeyDefault, }, + { + Key: JsonConfigFlagKey, + Usage: "If a json formatted service config string is provided via this flag, service add will parse the values in the json for the service. The format is identical to the json output format from kurtosis service inspect -o json.", + Type: flags.FlagType_String, + Default: JsonConfigFlagKeyDefault, + }, }, RunFunc: run, } @@ -245,6 +255,11 @@ func run( return stacktrace.Propagate(err, "Expected a value for the '%v' flag but failed to get it", fullUuidsFlagKey) } + jsonServiceConfigStr, err := flags.GetString(JsonConfigFlagKey) + if err != nil { + return stacktrace.Propagate(err, "An error occurred getting the json service config string using key '%v'.", JsonConfigFlagKey) + } + kurtosisCtx, err := kurtosis_context.NewKurtosisContextFromLocalEngine() if err != nil { return stacktrace.Propagate(err, "An error occurred connecting to the local Kurtosis engine") @@ -255,24 +270,63 @@ func run( return stacktrace.Propagate(err, "An error occurred getting an enclave context from enclave info for enclave '%v'", enclaveIdentifier) } - entrypoint := []string{} - if entrypointStr != "" { - entrypoint = append(entrypoint, entrypointStr) - } - serviceConfigStarlark, err := GetServiceConfigStarlark(image, portsStr, cmdArgs, entrypoint, envvarsStr, filesArtifactMountsStr, defaultLimits, defaultLimits, defaultLimits, defaultLimits, privateIPAddressPlaceholder) - if err != nil { - return stacktrace.Propagate( - err, - "An error occurred getting the container config to start image '%v' with CMD '%+v', ENTRYPOINT '%v', envvars '%v' and private IP address placeholder '%v'", - image, - cmdArgs, - entrypointStr, - envvarsStr, - privateIPAddressPlaceholder, + var serviceConfigStarlarkStr string + if jsonServiceConfigStr != "" { + var serviceConfigJson services.ServiceConfig + if err = json.Unmarshal([]byte(jsonServiceConfigStr), serviceConfigJson); err != nil { + return stacktrace.Propagate(err, "An error occurred unmarhsaling json service config string '%v'.", jsonServiceConfigStr) + } + ports + for portId, port := range currServiceConfig.PrivatePorts { + apiPort := &kurtosis_core_rpc_api_bindings.Port{ + Number: port.Number, + TransportProtocol: kurtosis_core_rpc_api_bindings.Port_TransportProtocol(port.Transport), + MaybeApplicationProtocol: port.MaybeApplicationProtocol, + MaybeWaitTimeout: port.Wait, + Locked: nil, + Alias: nil, + } + mergedPorts[portId] = apiPort + } + serviceConfigStarlarkStr = services.GetFullServiceConfigStarlark( + serviceConfigJson.Image, + serviceConfigJson.PrivatePorts, + serviceConfigJson.Files, + serviceConfigJson.Entrypoint, + serviceConfigJson.Cmd, + serviceConfigJson.EnvVars, + serviceConfigJson.MaxMillicpus, + serviceConfigJson.MaxMemory, + serviceConfigJson.MaxMemory, + serviceConfigJson.MinMemory, + serviceConfigJson.User, + serviceConfigJson.Tolerations, + serviceConfigJson.NodeSelectors, + serviceConfigJson.Labels, + serviceConfigJson.TiniEnabled, + serviceConfigJson.PrivateIPAddressPlaceholder, ) + + } else { + entrypoint := []string{} + if entrypointStr != "" { + entrypoint = append(entrypoint, entrypointStr) + } + serviceConfigStarlarkStr, err = GetServiceConfigStarlark(image, portsStr, cmdArgs, entrypoint, envvarsStr, filesArtifactMountsStr, defaultLimits, defaultLimits, defaultLimits, defaultLimits, privateIPAddressPlaceholder) + if err != nil { + return stacktrace.Propagate( + err, + "An error occurred getting the container config to start image '%v' with CMD '%+v', ENTRYPOINT '%v', envvars '%v' and private IP address placeholder '%v'", + image, + cmdArgs, + entrypointStr, + envvarsStr, + privateIPAddressPlaceholder, + ) + } } - _, err = service_helpers.RunAddServiceStarlarkScript(ctx, serviceName, enclaveIdentifier, service_helpers.GetAddServiceStarlarkScript(serviceName, serviceConfigStarlark), enclaveCtx) + _, err = service_helpers.RunAddServiceStarlarkScript(ctx, serviceName, enclaveIdentifier, service_helpers.GetAddServiceStarlarkScript(serviceName, serviceConfigStarlarkStr), enclaveCtx) if err != nil { return err // already wrapped } @@ -393,7 +447,28 @@ func GetServiceConfigStarlark( if err != nil { return "", stacktrace.Propagate(err, "An error occurred parsing files artifact mounts string '%v'", filesArtifactMountsStr) } - return services.GetSimpleServiceConfigStarlark(image, ports, filesArtifactMounts, entrypoint, cmdArgs, envvarsMap, privateIPAddressPlaceholder, cpuAllocationMillicpus, memoryAllocationMegabytes, minCpuMilliCores, minMemoryMegaBytes), nil + tiniEnabled := false + + emptyNodeSelecors := map[string]string{} + emptyLabels := map[string]string{} + emptyPrivateIpAddrPlaceholder := "" + return services.GetFullServiceConfigStarlark( + image, + ports, + filesArtifactMounts, + entrypoint, + cmdArgs, + envvarsMap, + uint32(cpuAllocationMillicpus), + uint32(memoryAllocationMegabytes), + uint32(minCpuMilliCores), + uint32(minMemoryMegaBytes), + nil, //empty user + nil, //empty tolerations + emptyNodeSelecors, + emptyLabels, + &tiniEnabled, + emptyPrivateIpAddrPlaceholder), nil } func generateExampleForPortFlag() string { diff --git a/cli/cli/commands/service/update/update.go b/cli/cli/commands/service/update/update.go index 6abb7f6efb..fd7d7af7e5 100644 --- a/cli/cli/commands/service/update/update.go +++ b/cli/cli/commands/service/update/update.go @@ -290,36 +290,29 @@ func run( // combine current ports with override ports mergedPorts := map[string]*kurtosis_core_rpc_api_bindings.Port{} - for portId, port := range overridePorts { + currApiPorts := services.ConvertJsonPortToApiPort(currServiceConfig.PrivatePorts) + for portId, port := range currApiPorts { mergedPorts[portId] = port } - for portId, port := range currServiceConfig.PrivatePorts { - apiPort := &kurtosis_core_rpc_api_bindings.Port{ - Number: port.Number, - TransportProtocol: kurtosis_core_rpc_api_bindings.Port_TransportProtocol(port.Transport), - MaybeApplicationProtocol: port.MaybeApplicationProtocol, - MaybeWaitTimeout: port.Wait, - Locked: nil, - Alias: nil, - } - mergedPorts[portId] = apiPort + for portId, port := range overridePorts { + mergedPorts[portId] = port } // combine current env vars with override env vars mergedEnvVarsMap := map[string]string{} - for key, val := range overrideEnvVars { + for key, val := range currServiceConfig.EnvVars { mergedEnvVarsMap[key] = val } - for key, val := range currServiceConfig.EnvVars { + for key, val := range overrideEnvVars { mergedEnvVarsMap[key] = val } // combine current files artifacts mount points with override mount points mergedFilesArtifactsMountpoint := map[string]string{} - for key, val := range overrideFilesArtifactsMountpoint { + for key, val := range currServiceConfig.Files { mergedFilesArtifactsMountpoint[key] = val } - for key, val := range currServiceConfig.Files { + for key, val := range overrideFilesArtifactsMountpoint { mergedFilesArtifactsMountpoint[key] = val } @@ -340,6 +333,7 @@ func run( currServiceConfig.NodeSelectors, currServiceConfig.Labels, currServiceConfig.TiniEnabled, + currServiceConfig.PrivateIPAddressPlaceholder, ) //logrus.Infof("SERVICE CONFIG STRING: %v", serviceConfigStr) From 7f6f4bcb00c0d884cfbe6335291dd23b76424fa4 Mon Sep 17 00:00:00 2001 From: Tedi Mitiku Date: Thu, 27 Mar 2025 17:01:22 -0400 Subject: [PATCH 11/48] add defaults to greedy args --- cli/cli/commands/service/add/add.go | 31 ++++++++++------------------- 1 file changed, 11 insertions(+), 20 deletions(-) diff --git a/cli/cli/commands/service/add/add.go b/cli/cli/commands/service/add/add.go index b23c8120a5..4bde54456b 100644 --- a/cli/cli/commands/service/add/add.go +++ b/cli/cli/commands/service/add/add.go @@ -130,7 +130,8 @@ var ServiceAddCmd = &engine_consuming_kurtosis_command.EngineConsumingKurtosisCo Key: service_helpers.EntrypointFlagKey, Usage: "ENTRYPOINT binary that will be used when running the container, overriding the image's default ENTRYPOINT", // TODO Make this a string list - Type: flags.FlagType_String, + Type: flags.FlagType_String, + Default: "", }, { // TODO We currently can't handle commas, so allow users to set the flag multiple times to set multiple envvars @@ -142,7 +143,8 @@ var ServiceAddCmd = &engine_consuming_kurtosis_command.EngineConsumingKurtosisCo envvarDeclarationsDelimiter, envvarKeyValueDelimiter, ), - Type: flags.FlagType_String, + Type: flags.FlagType_String, + Default: "", }, { Key: service_helpers.PortsFlagKey, @@ -159,7 +161,8 @@ var ServiceAddCmd = &engine_consuming_kurtosis_command.EngineConsumingKurtosisCo maybeApplicationProtocolSpecForHelp, generateExampleForPortFlag(), ), - Type: flags.FlagType_String, + Type: flags.FlagType_String, + Default: "", }, { Key: service_helpers.FilesFlagKey, @@ -173,7 +176,8 @@ var ServiceAddCmd = &engine_consuming_kurtosis_command.EngineConsumingKurtosisCo command_str_consts.FilesCmdStr, command_str_consts.FilesUploadCmdStr, ), - Type: flags.FlagType_String, + Type: flags.FlagType_String, + Default: "", }, { Key: privateIPAddressPlaceholderKey, @@ -273,24 +277,12 @@ func run( var serviceConfigStarlarkStr string if jsonServiceConfigStr != "" { var serviceConfigJson services.ServiceConfig - if err = json.Unmarshal([]byte(jsonServiceConfigStr), serviceConfigJson); err != nil { - return stacktrace.Propagate(err, "An error occurred unmarhsaling json service config string '%v'.", jsonServiceConfigStr) - } - ports - for portId, port := range currServiceConfig.PrivatePorts { - apiPort := &kurtosis_core_rpc_api_bindings.Port{ - Number: port.Number, - TransportProtocol: kurtosis_core_rpc_api_bindings.Port_TransportProtocol(port.Transport), - MaybeApplicationProtocol: port.MaybeApplicationProtocol, - MaybeWaitTimeout: port.Wait, - Locked: nil, - Alias: nil, - } - mergedPorts[portId] = apiPort + if err = json.Unmarshal([]byte(jsonServiceConfigStr), &serviceConfigJson); err != nil { + return stacktrace.Propagate(err, "An error occurred unmarshalling json service config string '%v'.", jsonServiceConfigStr) } serviceConfigStarlarkStr = services.GetFullServiceConfigStarlark( serviceConfigJson.Image, - serviceConfigJson.PrivatePorts, + services.ConvertJsonPortToApiPort(serviceConfigJson.PrivatePorts), serviceConfigJson.Files, serviceConfigJson.Entrypoint, serviceConfigJson.Cmd, @@ -306,7 +298,6 @@ func run( serviceConfigJson.TiniEnabled, serviceConfigJson.PrivateIPAddressPlaceholder, ) - } else { entrypoint := []string{} if entrypointStr != "" { From 023ce9d93ed4989ea0ce1263d8383164f22b954c Mon Sep 17 00:00:00 2001 From: Tedi Mitiku Date: Thu, 27 Mar 2025 19:39:48 -0400 Subject: [PATCH 12/48] add json config flag --- cli/cli/commands/service/add/add.go | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/cli/cli/commands/service/add/add.go b/cli/cli/commands/service/add/add.go index 4bde54456b..c82d7582cc 100644 --- a/cli/cli/commands/service/add/add.go +++ b/cli/cli/commands/service/add/add.go @@ -37,7 +37,7 @@ const ( serviceImageArgKey = "image" - cmdArgsArgKey = "cmd-arg" + cmdArgsFlagsKey = "cmd-arg" entrypointBinaryFlagKey = "entrypoint" @@ -126,6 +126,12 @@ var ServiceAddCmd = &engine_consuming_kurtosis_command.EngineConsumingKurtosisCo }, }, Flags: []*flags.FlagConfig{ + { + Key: service_helpers.CmdKey, + Usage: "CMD binary that will be used when running the container", + Type: flags.FlagType_String, + Default: "", + }, { Key: service_helpers.EntrypointFlagKey, Usage: "ENTRYPOINT binary that will be used when running the container, overriding the image's default ENTRYPOINT", @@ -224,10 +230,10 @@ func run( return stacktrace.Propagate(err, "An error occurred getting the service image value using key '%v'", serviceImageArgKey) } - cmdArgs, err := args.GetGreedyArg(cmdArgsArgKey) - if err != nil { - return stacktrace.Propagate(err, "An error occurred getting the CMD args using key '%v'", cmdArgsArgKey) - } + //cmdArgs, err := flags.GetString(cmdArgsFlagsKey) + //if err != nil { + // return stacktrace.Propagate(err, "An error occurred getting the CMD flag using key '%v'", cmdArgsFlagsKey) + //} entrypointStr, err := flags.GetString(entrypointBinaryFlagKey) if err != nil { @@ -303,13 +309,13 @@ func run( if entrypointStr != "" { entrypoint = append(entrypoint, entrypointStr) } - serviceConfigStarlarkStr, err = GetServiceConfigStarlark(image, portsStr, cmdArgs, entrypoint, envvarsStr, filesArtifactMountsStr, defaultLimits, defaultLimits, defaultLimits, defaultLimits, privateIPAddressPlaceholder) + serviceConfigStarlarkStr, err = GetServiceConfigStarlark(image, portsStr, strings.Split(" ", " "), entrypoint, envvarsStr, filesArtifactMountsStr, defaultLimits, defaultLimits, defaultLimits, defaultLimits, privateIPAddressPlaceholder) if err != nil { return stacktrace.Propagate( err, "An error occurred getting the container config to start image '%v' with CMD '%+v', ENTRYPOINT '%v', envvars '%v' and private IP address placeholder '%v'", image, - cmdArgs, + " ", entrypointStr, envvarsStr, privateIPAddressPlaceholder, From 3b0f7581a66143008e3640a094d4f9c165fb1ef2 Mon Sep 17 00:00:00 2001 From: Tedi Mitiku Date: Thu, 27 Mar 2025 20:47:26 -0400 Subject: [PATCH 13/48] use switch in print inspect --- cli/cli/commands/service/inspect/inspect.go | 32 ++++++++++++++------- 1 file changed, 21 insertions(+), 11 deletions(-) diff --git a/cli/cli/commands/service/inspect/inspect.go b/cli/cli/commands/service/inspect/inspect.go index 2fde2605a9..15a83133b0 100644 --- a/cli/cli/commands/service/inspect/inspect.go +++ b/cli/cli/commands/service/inspect/inspect.go @@ -61,6 +61,8 @@ const ( kurtosisBackendCtxKey = "kurtosis-backend" engineClientCtxKey = "engine-client" + + stdoutOutputFormat = "" ) var ServiceInspectCmd = &engine_consuming_kurtosis_command.EngineConsumingKurtosisCommand{ @@ -152,26 +154,35 @@ func run( } func PrintServiceInspect(userService *kurtosis_core_rpc_api_bindings.ServiceInfo, userServiceConfig *services.ServiceConfig, showFullUuid bool, outputFormat string) error { - if outputFormat != "" { - var marshaled []byte - var err error - switch outputFormat { - case jsonOutputFormat: - marshaled, err = json.MarshalIndent(userServiceConfig, "", " ") - case yamlOutputFormat: - marshaled, err = yaml.Marshal(userServiceConfig) + switch outputFormat { + case jsonOutputFormat: + marshaled, err := json.MarshalIndent(userServiceConfig, "", " ") + if err != nil { + return stacktrace.Propagate(err, "Failed to marshal service info to %s", outputFormat) } + out.PrintOutLn(string(marshaled)) + case yamlOutputFormat: + marshaled, err := yaml.Marshal(userServiceConfig) if err != nil { return stacktrace.Propagate(err, "Failed to marshal service info to %s", outputFormat) } out.PrintOutLn(string(marshaled)) - return nil + case stdoutOutputFormat: + err := printlnServiceInfo(userService, showFullUuid) + if err != nil { + return stacktrace.Propagate(err, "Failed to print service info to stdout.") + } + default: + return stacktrace.NewError("Unsupported output format '%v'", outputFormat) } + return nil +} +func printlnServiceInfo(userService *kurtosis_core_rpc_api_bindings.ServiceInfo, shouldShowFullUuid bool) error { out.PrintOutLn(fmt.Sprintf("%s: %s", ServiceNameTitleName, userService.GetName())) uuidStr := userService.GetShortenedUuid() - if showFullUuid { + if shouldShowFullUuid { uuidStr = userService.GetServiceUuid() } out.PrintOutLn(fmt.Sprintf("%s: %s", ServiceUUIDTitleName, uuidStr)) @@ -205,6 +216,5 @@ func PrintServiceInspect(userService *kurtosis_core_rpc_api_bindings.ServiceInfo for envVarKey, envVarVal := range userService.GetContainer().GetEnvVars() { out.PrintOutLn(fmt.Sprintf(" %s: %s", envVarKey, envVarVal)) } - return nil } From 054df425ea44bb738d8ed2708a8761f676da2061 Mon Sep 17 00:00:00 2001 From: Tedi Mitiku Date: Thu, 27 Mar 2025 20:53:34 -0400 Subject: [PATCH 14/48] rename default --- cli/cli/commands/service/inspect/inspect.go | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/cli/cli/commands/service/inspect/inspect.go b/cli/cli/commands/service/inspect/inspect.go index 15a83133b0..4c7d7078fc 100644 --- a/cli/cli/commands/service/inspect/inspect.go +++ b/cli/cli/commands/service/inspect/inspect.go @@ -45,10 +45,9 @@ const ( outputFormatKey = "output" outputFormatKeyShorthand = "o" - outputFormatKeyDefault = "" + stdoutOutputFormat = "" yamlOutputFormat = "yaml" - - jsonOutputFormat = "json" + jsonOutputFormat = "json" ServiceNameTitleName = "Name" ServiceUUIDTitleName = "UUID" @@ -61,8 +60,6 @@ const ( kurtosisBackendCtxKey = "kurtosis-backend" engineClientCtxKey = "engine-client" - - stdoutOutputFormat = "" ) var ServiceInspectCmd = &engine_consuming_kurtosis_command.EngineConsumingKurtosisCommand{ @@ -83,7 +80,7 @@ var ServiceInspectCmd = &engine_consuming_kurtosis_command.EngineConsumingKurtos Shorthand: outputFormatKeyShorthand, Usage: "Format to output the result (yaml or json)", Type: flags.FlagType_String, - Default: outputFormatKeyDefault, + Default: stdoutOutputFormat, }, }, Args: []*args.ArgConfig{ @@ -130,7 +127,6 @@ func run( if err != nil { return stacktrace.Propagate(err, "Expected a value for the '%v' flag but failed to get it", outputFormatKey) } - outputFormat = strings.ToLower(strings.TrimSpace(outputFormat)) if outputFormat != "" && outputFormat != jsonOutputFormat && outputFormat != yamlOutputFormat { return stacktrace.NewError("Invalid output format '%s'; must be '%v' or '%v'", outputFormat, jsonOutputFormat, yamlOutputFormat) From f2e2133db0164b180986ab03f1b2382a2008fcab Mon Sep 17 00:00:00 2001 From: Tedi Mitiku Date: Fri, 28 Mar 2025 12:23:52 -0400 Subject: [PATCH 15/48] complete converting api svc info to json svc config --- .../api_container_service.pb.go | 2341 +++++++++-------- .../binding_constructors.go | 28 +- .../lib/services/service_config_builder.go | 48 +- api/protobuf/core/api_container_service.proto | 2 + api/rust/src/api_container_api.rs | 49 +- .../api_container_service_pb.d.ts | 102 +- .../api_container_service_pb.js | 1117 ++++++-- .../connect/api_container_service_pb.d.ts | 121 +- .../connect/api_container_service_pb.js | 37 +- .../service_helpers/service_helpers.go | 17 +- 10 files changed, 2588 insertions(+), 1274 deletions(-) diff --git a/api/golang/core/kurtosis_core_rpc_api_bindings/api_container_service.pb.go b/api/golang/core/kurtosis_core_rpc_api_bindings/api_container_service.pb.go index adf2c390bc..9b17fdfebc 100644 --- a/api/golang/core/kurtosis_core_rpc_api_bindings/api_container_service.pb.go +++ b/api/golang/core/kurtosis_core_rpc_api_bindings/api_container_service.pb.go @@ -574,6 +574,150 @@ func (x *FilesArtifactsList) GetFilesArtifactsIdentifiers() []string { return nil } +// Equivalent of user on ServiceConfig +type User struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Username string `protobuf:"bytes,1,opt,name=username,proto3" json:"username,omitempty"` + Uid uint32 `protobuf:"varint,2,opt,name=uid,proto3" json:"uid,omitempty"` + Gid uint32 `protobuf:"varint,3,opt,name=gid,proto3" json:"gid,omitempty"` +} + +func (x *User) Reset() { + *x = User{} + if protoimpl.UnsafeEnabled { + mi := &file_api_container_service_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *User) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*User) ProtoMessage() {} + +func (x *User) ProtoReflect() protoreflect.Message { + mi := &file_api_container_service_proto_msgTypes[3] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use User.ProtoReflect.Descriptor instead. +func (*User) Descriptor() ([]byte, []int) { + return file_api_container_service_proto_rawDescGZIP(), []int{3} +} + +func (x *User) GetUsername() string { + if x != nil { + return x.Username + } + return "" +} + +func (x *User) GetUid() uint32 { + if x != nil { + return x.Uid + } + return 0 +} + +func (x *User) GetGid() uint32 { + if x != nil { + return x.Gid + } + return 0 +} + +// Equivalent of tolerations on ServiceConfig +type Toleration struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Key string `protobuf:"bytes,1,opt,name=key,proto3" json:"key,omitempty"` + Operator string `protobuf:"bytes,2,opt,name=operator,proto3" json:"operator,omitempty"` + Value string `protobuf:"bytes,3,opt,name=value,proto3" json:"value,omitempty"` + Effect string `protobuf:"bytes,4,opt,name=effect,proto3" json:"effect,omitempty"` + TolerationSeconds int64 `protobuf:"varint,5,opt,name=toleration_seconds,json=tolerationSeconds,proto3" json:"toleration_seconds,omitempty"` +} + +func (x *Toleration) Reset() { + *x = Toleration{} + if protoimpl.UnsafeEnabled { + mi := &file_api_container_service_proto_msgTypes[4] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Toleration) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Toleration) ProtoMessage() {} + +func (x *Toleration) ProtoReflect() protoreflect.Message { + mi := &file_api_container_service_proto_msgTypes[4] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Toleration.ProtoReflect.Descriptor instead. +func (*Toleration) Descriptor() ([]byte, []int) { + return file_api_container_service_proto_rawDescGZIP(), []int{4} +} + +func (x *Toleration) GetKey() string { + if x != nil { + return x.Key + } + return "" +} + +func (x *Toleration) GetOperator() string { + if x != nil { + return x.Operator + } + return "" +} + +func (x *Toleration) GetValue() string { + if x != nil { + return x.Value + } + return "" +} + +func (x *Toleration) GetEffect() string { + if x != nil { + return x.Effect + } + return "" +} + +func (x *Toleration) GetTolerationSeconds() int64 { + if x != nil { + return x.TolerationSeconds + } + return 0 +} + type ServiceInfo struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -604,17 +748,27 @@ type ServiceInfo struct { // Docker container or Kubernetes pod container Container *Container `protobuf:"bytes,9,opt,name=container,proto3" json:"container,omitempty"` // Mapping of directory paths on service to names of files artifacts that are mounted to that directory - ServiceDirPathsToFilesArtifactsIdentifiers map[string]*FilesArtifactsList `protobuf:"bytes,10,rep,name=service_dir_paths_to_files_artifacts_identifiers,json=serviceDirPathsToFilesArtifactsIdentifiers,proto3" json:"service_dir_paths_to_files_artifacts_identifiers,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` - MaxMillicpus uint32 `protobuf:"varint,11,opt,name=max_millicpus,json=maxMillicpus,proto3" json:"max_millicpus,omitempty"` - MinMillicpus uint32 `protobuf:"varint,12,opt,name=min_millicpus,json=minMillicpus,proto3" json:"min_millicpus,omitempty"` - MaxMemoryMegabytes uint32 `protobuf:"varint,13,opt,name=max_memory_megabytes,json=maxMemoryMegabytes,proto3" json:"max_memory_megabytes,omitempty"` - MinMemoryMegabytes uint32 `protobuf:"varint,14,opt,name=min_memory_megabytes,json=minMemoryMegabytes,proto3" json:"min_memory_megabytes,omitempty"` + ServiceDirPathsToFilesArtifactsList map[string]*FilesArtifactsList `protobuf:"bytes,10,rep,name=service_dir_paths_to_files_artifacts_list,json=serviceDirPathsToFilesArtifactsList,proto3" json:"service_dir_paths_to_files_artifacts_list,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + MaxMillicpus uint32 `protobuf:"varint,11,opt,name=max_millicpus,json=maxMillicpus,proto3" json:"max_millicpus,omitempty"` + MinMillicpus uint32 `protobuf:"varint,12,opt,name=min_millicpus,json=minMillicpus,proto3" json:"min_millicpus,omitempty"` + MaxMemoryMegabytes uint32 `protobuf:"varint,13,opt,name=max_memory_megabytes,json=maxMemoryMegabytes,proto3" json:"max_memory_megabytes,omitempty"` + MinMemoryMegabytes uint32 `protobuf:"varint,14,opt,name=min_memory_megabytes,json=minMemoryMegabytes,proto3" json:"min_memory_megabytes,omitempty"` + // Optional user identity for the service + User *User `protobuf:"bytes,15,opt,name=user,proto3,oneof" json:"user,omitempty"` + // Optional list of Kubernetes tolerations + Tolerations []*Toleration `protobuf:"bytes,16,rep,name=tolerations,proto3" json:"tolerations,omitempty"` + // Optional node selectors for pod placement + NodeSelectors map[string]string `protobuf:"bytes,17,rep,name=node_selectors,json=nodeSelectors,proto3" json:"node_selectors,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + // Optional labels + Labels map[string]string `protobuf:"bytes,18,rep,name=labels,proto3" json:"labels,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + // Whether Tini is enabled + TiniEnabled *bool `protobuf:"varint,19,opt,name=tini_enabled,json=tiniEnabled,proto3,oneof" json:"tini_enabled,omitempty"` } func (x *ServiceInfo) Reset() { *x = ServiceInfo{} if protoimpl.UnsafeEnabled { - mi := &file_api_container_service_proto_msgTypes[3] + mi := &file_api_container_service_proto_msgTypes[5] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -627,7 +781,7 @@ func (x *ServiceInfo) String() string { func (*ServiceInfo) ProtoMessage() {} func (x *ServiceInfo) ProtoReflect() protoreflect.Message { - mi := &file_api_container_service_proto_msgTypes[3] + mi := &file_api_container_service_proto_msgTypes[5] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -640,7 +794,7 @@ func (x *ServiceInfo) ProtoReflect() protoreflect.Message { // Deprecated: Use ServiceInfo.ProtoReflect.Descriptor instead. func (*ServiceInfo) Descriptor() ([]byte, []int) { - return file_api_container_service_proto_rawDescGZIP(), []int{3} + return file_api_container_service_proto_rawDescGZIP(), []int{5} } func (x *ServiceInfo) GetServiceUuid() string { @@ -706,9 +860,9 @@ func (x *ServiceInfo) GetContainer() *Container { return nil } -func (x *ServiceInfo) GetServiceDirPathsToFilesArtifactsIdentifiers() map[string]*FilesArtifactsList { +func (x *ServiceInfo) GetServiceDirPathsToFilesArtifactsList() map[string]*FilesArtifactsList { if x != nil { - return x.ServiceDirPathsToFilesArtifactsIdentifiers + return x.ServiceDirPathsToFilesArtifactsList } return nil } @@ -741,6 +895,41 @@ func (x *ServiceInfo) GetMinMemoryMegabytes() uint32 { return 0 } +func (x *ServiceInfo) GetUser() *User { + if x != nil { + return x.User + } + return nil +} + +func (x *ServiceInfo) GetTolerations() []*Toleration { + if x != nil { + return x.Tolerations + } + return nil +} + +func (x *ServiceInfo) GetNodeSelectors() map[string]string { + if x != nil { + return x.NodeSelectors + } + return nil +} + +func (x *ServiceInfo) GetLabels() map[string]string { + if x != nil { + return x.Labels + } + return nil +} + +func (x *ServiceInfo) GetTiniEnabled() bool { + if x != nil && x.TiniEnabled != nil { + return *x.TiniEnabled + } + return false +} + type RunStarlarkScriptArgs struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -768,7 +957,7 @@ type RunStarlarkScriptArgs struct { func (x *RunStarlarkScriptArgs) Reset() { *x = RunStarlarkScriptArgs{} if protoimpl.UnsafeEnabled { - mi := &file_api_container_service_proto_msgTypes[4] + mi := &file_api_container_service_proto_msgTypes[6] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -781,7 +970,7 @@ func (x *RunStarlarkScriptArgs) String() string { func (*RunStarlarkScriptArgs) ProtoMessage() {} func (x *RunStarlarkScriptArgs) ProtoReflect() protoreflect.Message { - mi := &file_api_container_service_proto_msgTypes[4] + mi := &file_api_container_service_proto_msgTypes[6] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -794,7 +983,7 @@ func (x *RunStarlarkScriptArgs) ProtoReflect() protoreflect.Message { // Deprecated: Use RunStarlarkScriptArgs.ProtoReflect.Descriptor instead. func (*RunStarlarkScriptArgs) Descriptor() ([]byte, []int) { - return file_api_container_service_proto_rawDescGZIP(), []int{4} + return file_api_container_service_proto_rawDescGZIP(), []int{6} } func (x *RunStarlarkScriptArgs) GetSerializedScript() string { @@ -916,7 +1105,7 @@ type RunStarlarkPackageArgs struct { func (x *RunStarlarkPackageArgs) Reset() { *x = RunStarlarkPackageArgs{} if protoimpl.UnsafeEnabled { - mi := &file_api_container_service_proto_msgTypes[5] + mi := &file_api_container_service_proto_msgTypes[7] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -929,7 +1118,7 @@ func (x *RunStarlarkPackageArgs) String() string { func (*RunStarlarkPackageArgs) ProtoMessage() {} func (x *RunStarlarkPackageArgs) ProtoReflect() protoreflect.Message { - mi := &file_api_container_service_proto_msgTypes[5] + mi := &file_api_container_service_proto_msgTypes[7] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -942,7 +1131,7 @@ func (x *RunStarlarkPackageArgs) ProtoReflect() protoreflect.Message { // Deprecated: Use RunStarlarkPackageArgs.ProtoReflect.Descriptor instead. func (*RunStarlarkPackageArgs) Descriptor() ([]byte, []int) { - return file_api_container_service_proto_rawDescGZIP(), []int{5} + return file_api_container_service_proto_rawDescGZIP(), []int{7} } func (x *RunStarlarkPackageArgs) GetPackageId() string { @@ -1098,7 +1287,7 @@ type StarlarkRunResponseLine struct { func (x *StarlarkRunResponseLine) Reset() { *x = StarlarkRunResponseLine{} if protoimpl.UnsafeEnabled { - mi := &file_api_container_service_proto_msgTypes[6] + mi := &file_api_container_service_proto_msgTypes[8] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1111,7 +1300,7 @@ func (x *StarlarkRunResponseLine) String() string { func (*StarlarkRunResponseLine) ProtoMessage() {} func (x *StarlarkRunResponseLine) ProtoReflect() protoreflect.Message { - mi := &file_api_container_service_proto_msgTypes[6] + mi := &file_api_container_service_proto_msgTypes[8] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1124,7 +1313,7 @@ func (x *StarlarkRunResponseLine) ProtoReflect() protoreflect.Message { // Deprecated: Use StarlarkRunResponseLine.ProtoReflect.Descriptor instead. func (*StarlarkRunResponseLine) Descriptor() ([]byte, []int) { - return file_api_container_service_proto_rawDescGZIP(), []int{6} + return file_api_container_service_proto_rawDescGZIP(), []int{8} } func (m *StarlarkRunResponseLine) GetRunResponseLine() isStarlarkRunResponseLine_RunResponseLine { @@ -1240,7 +1429,7 @@ type StarlarkInfo struct { func (x *StarlarkInfo) Reset() { *x = StarlarkInfo{} if protoimpl.UnsafeEnabled { - mi := &file_api_container_service_proto_msgTypes[7] + mi := &file_api_container_service_proto_msgTypes[9] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1253,7 +1442,7 @@ func (x *StarlarkInfo) String() string { func (*StarlarkInfo) ProtoMessage() {} func (x *StarlarkInfo) ProtoReflect() protoreflect.Message { - mi := &file_api_container_service_proto_msgTypes[7] + mi := &file_api_container_service_proto_msgTypes[9] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1266,7 +1455,7 @@ func (x *StarlarkInfo) ProtoReflect() protoreflect.Message { // Deprecated: Use StarlarkInfo.ProtoReflect.Descriptor instead. func (*StarlarkInfo) Descriptor() ([]byte, []int) { - return file_api_container_service_proto_rawDescGZIP(), []int{7} + return file_api_container_service_proto_rawDescGZIP(), []int{9} } func (x *StarlarkInfo) GetInfoMessage() string { @@ -1287,7 +1476,7 @@ type StarlarkWarning struct { func (x *StarlarkWarning) Reset() { *x = StarlarkWarning{} if protoimpl.UnsafeEnabled { - mi := &file_api_container_service_proto_msgTypes[8] + mi := &file_api_container_service_proto_msgTypes[10] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1300,7 +1489,7 @@ func (x *StarlarkWarning) String() string { func (*StarlarkWarning) ProtoMessage() {} func (x *StarlarkWarning) ProtoReflect() protoreflect.Message { - mi := &file_api_container_service_proto_msgTypes[8] + mi := &file_api_container_service_proto_msgTypes[10] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1313,7 +1502,7 @@ func (x *StarlarkWarning) ProtoReflect() protoreflect.Message { // Deprecated: Use StarlarkWarning.ProtoReflect.Descriptor instead. func (*StarlarkWarning) Descriptor() ([]byte, []int) { - return file_api_container_service_proto_rawDescGZIP(), []int{8} + return file_api_container_service_proto_rawDescGZIP(), []int{10} } func (x *StarlarkWarning) GetWarningMessage() string { @@ -1339,7 +1528,7 @@ type StarlarkInstruction struct { func (x *StarlarkInstruction) Reset() { *x = StarlarkInstruction{} if protoimpl.UnsafeEnabled { - mi := &file_api_container_service_proto_msgTypes[9] + mi := &file_api_container_service_proto_msgTypes[11] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1352,7 +1541,7 @@ func (x *StarlarkInstruction) String() string { func (*StarlarkInstruction) ProtoMessage() {} func (x *StarlarkInstruction) ProtoReflect() protoreflect.Message { - mi := &file_api_container_service_proto_msgTypes[9] + mi := &file_api_container_service_proto_msgTypes[11] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1365,7 +1554,7 @@ func (x *StarlarkInstruction) ProtoReflect() protoreflect.Message { // Deprecated: Use StarlarkInstruction.ProtoReflect.Descriptor instead. func (*StarlarkInstruction) Descriptor() ([]byte, []int) { - return file_api_container_service_proto_rawDescGZIP(), []int{9} + return file_api_container_service_proto_rawDescGZIP(), []int{11} } func (x *StarlarkInstruction) GetPosition() *StarlarkInstructionPosition { @@ -1421,7 +1610,7 @@ type StarlarkInstructionResult struct { func (x *StarlarkInstructionResult) Reset() { *x = StarlarkInstructionResult{} if protoimpl.UnsafeEnabled { - mi := &file_api_container_service_proto_msgTypes[10] + mi := &file_api_container_service_proto_msgTypes[12] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1434,7 +1623,7 @@ func (x *StarlarkInstructionResult) String() string { func (*StarlarkInstructionResult) ProtoMessage() {} func (x *StarlarkInstructionResult) ProtoReflect() protoreflect.Message { - mi := &file_api_container_service_proto_msgTypes[10] + mi := &file_api_container_service_proto_msgTypes[12] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1447,7 +1636,7 @@ func (x *StarlarkInstructionResult) ProtoReflect() protoreflect.Message { // Deprecated: Use StarlarkInstructionResult.ProtoReflect.Descriptor instead. func (*StarlarkInstructionResult) Descriptor() ([]byte, []int) { - return file_api_container_service_proto_rawDescGZIP(), []int{10} + return file_api_container_service_proto_rawDescGZIP(), []int{12} } func (x *StarlarkInstructionResult) GetSerializedInstructionResult() string { @@ -1470,7 +1659,7 @@ type StarlarkInstructionArg struct { func (x *StarlarkInstructionArg) Reset() { *x = StarlarkInstructionArg{} if protoimpl.UnsafeEnabled { - mi := &file_api_container_service_proto_msgTypes[11] + mi := &file_api_container_service_proto_msgTypes[13] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1483,7 +1672,7 @@ func (x *StarlarkInstructionArg) String() string { func (*StarlarkInstructionArg) ProtoMessage() {} func (x *StarlarkInstructionArg) ProtoReflect() protoreflect.Message { - mi := &file_api_container_service_proto_msgTypes[11] + mi := &file_api_container_service_proto_msgTypes[13] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1496,7 +1685,7 @@ func (x *StarlarkInstructionArg) ProtoReflect() protoreflect.Message { // Deprecated: Use StarlarkInstructionArg.ProtoReflect.Descriptor instead. func (*StarlarkInstructionArg) Descriptor() ([]byte, []int) { - return file_api_container_service_proto_rawDescGZIP(), []int{11} + return file_api_container_service_proto_rawDescGZIP(), []int{13} } func (x *StarlarkInstructionArg) GetSerializedArgValue() string { @@ -1533,7 +1722,7 @@ type StarlarkInstructionPosition struct { func (x *StarlarkInstructionPosition) Reset() { *x = StarlarkInstructionPosition{} if protoimpl.UnsafeEnabled { - mi := &file_api_container_service_proto_msgTypes[12] + mi := &file_api_container_service_proto_msgTypes[14] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1546,7 +1735,7 @@ func (x *StarlarkInstructionPosition) String() string { func (*StarlarkInstructionPosition) ProtoMessage() {} func (x *StarlarkInstructionPosition) ProtoReflect() protoreflect.Message { - mi := &file_api_container_service_proto_msgTypes[12] + mi := &file_api_container_service_proto_msgTypes[14] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1559,7 +1748,7 @@ func (x *StarlarkInstructionPosition) ProtoReflect() protoreflect.Message { // Deprecated: Use StarlarkInstructionPosition.ProtoReflect.Descriptor instead. func (*StarlarkInstructionPosition) Descriptor() ([]byte, []int) { - return file_api_container_service_proto_rawDescGZIP(), []int{12} + return file_api_container_service_proto_rawDescGZIP(), []int{14} } func (x *StarlarkInstructionPosition) GetFilename() string { @@ -1599,7 +1788,7 @@ type StarlarkError struct { func (x *StarlarkError) Reset() { *x = StarlarkError{} if protoimpl.UnsafeEnabled { - mi := &file_api_container_service_proto_msgTypes[13] + mi := &file_api_container_service_proto_msgTypes[15] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1612,7 +1801,7 @@ func (x *StarlarkError) String() string { func (*StarlarkError) ProtoMessage() {} func (x *StarlarkError) ProtoReflect() protoreflect.Message { - mi := &file_api_container_service_proto_msgTypes[13] + mi := &file_api_container_service_proto_msgTypes[15] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1625,7 +1814,7 @@ func (x *StarlarkError) ProtoReflect() protoreflect.Message { // Deprecated: Use StarlarkError.ProtoReflect.Descriptor instead. func (*StarlarkError) Descriptor() ([]byte, []int) { - return file_api_container_service_proto_rawDescGZIP(), []int{13} + return file_api_container_service_proto_rawDescGZIP(), []int{15} } func (m *StarlarkError) GetError() isStarlarkError_Error { @@ -1689,7 +1878,7 @@ type StarlarkInterpretationError struct { func (x *StarlarkInterpretationError) Reset() { *x = StarlarkInterpretationError{} if protoimpl.UnsafeEnabled { - mi := &file_api_container_service_proto_msgTypes[14] + mi := &file_api_container_service_proto_msgTypes[16] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1702,7 +1891,7 @@ func (x *StarlarkInterpretationError) String() string { func (*StarlarkInterpretationError) ProtoMessage() {} func (x *StarlarkInterpretationError) ProtoReflect() protoreflect.Message { - mi := &file_api_container_service_proto_msgTypes[14] + mi := &file_api_container_service_proto_msgTypes[16] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1715,7 +1904,7 @@ func (x *StarlarkInterpretationError) ProtoReflect() protoreflect.Message { // Deprecated: Use StarlarkInterpretationError.ProtoReflect.Descriptor instead. func (*StarlarkInterpretationError) Descriptor() ([]byte, []int) { - return file_api_container_service_proto_rawDescGZIP(), []int{14} + return file_api_container_service_proto_rawDescGZIP(), []int{16} } func (x *StarlarkInterpretationError) GetErrorMessage() string { @@ -1736,7 +1925,7 @@ type StarlarkValidationError struct { func (x *StarlarkValidationError) Reset() { *x = StarlarkValidationError{} if protoimpl.UnsafeEnabled { - mi := &file_api_container_service_proto_msgTypes[15] + mi := &file_api_container_service_proto_msgTypes[17] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1749,7 +1938,7 @@ func (x *StarlarkValidationError) String() string { func (*StarlarkValidationError) ProtoMessage() {} func (x *StarlarkValidationError) ProtoReflect() protoreflect.Message { - mi := &file_api_container_service_proto_msgTypes[15] + mi := &file_api_container_service_proto_msgTypes[17] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1762,7 +1951,7 @@ func (x *StarlarkValidationError) ProtoReflect() protoreflect.Message { // Deprecated: Use StarlarkValidationError.ProtoReflect.Descriptor instead. func (*StarlarkValidationError) Descriptor() ([]byte, []int) { - return file_api_container_service_proto_rawDescGZIP(), []int{15} + return file_api_container_service_proto_rawDescGZIP(), []int{17} } func (x *StarlarkValidationError) GetErrorMessage() string { @@ -1783,7 +1972,7 @@ type StarlarkExecutionError struct { func (x *StarlarkExecutionError) Reset() { *x = StarlarkExecutionError{} if protoimpl.UnsafeEnabled { - mi := &file_api_container_service_proto_msgTypes[16] + mi := &file_api_container_service_proto_msgTypes[18] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1796,7 +1985,7 @@ func (x *StarlarkExecutionError) String() string { func (*StarlarkExecutionError) ProtoMessage() {} func (x *StarlarkExecutionError) ProtoReflect() protoreflect.Message { - mi := &file_api_container_service_proto_msgTypes[16] + mi := &file_api_container_service_proto_msgTypes[18] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1809,7 +1998,7 @@ func (x *StarlarkExecutionError) ProtoReflect() protoreflect.Message { // Deprecated: Use StarlarkExecutionError.ProtoReflect.Descriptor instead. func (*StarlarkExecutionError) Descriptor() ([]byte, []int) { - return file_api_container_service_proto_rawDescGZIP(), []int{16} + return file_api_container_service_proto_rawDescGZIP(), []int{18} } func (x *StarlarkExecutionError) GetErrorMessage() string { @@ -1832,7 +2021,7 @@ type StarlarkRunProgress struct { func (x *StarlarkRunProgress) Reset() { *x = StarlarkRunProgress{} if protoimpl.UnsafeEnabled { - mi := &file_api_container_service_proto_msgTypes[17] + mi := &file_api_container_service_proto_msgTypes[19] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1845,7 +2034,7 @@ func (x *StarlarkRunProgress) String() string { func (*StarlarkRunProgress) ProtoMessage() {} func (x *StarlarkRunProgress) ProtoReflect() protoreflect.Message { - mi := &file_api_container_service_proto_msgTypes[17] + mi := &file_api_container_service_proto_msgTypes[19] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1858,7 +2047,7 @@ func (x *StarlarkRunProgress) ProtoReflect() protoreflect.Message { // Deprecated: Use StarlarkRunProgress.ProtoReflect.Descriptor instead. func (*StarlarkRunProgress) Descriptor() ([]byte, []int) { - return file_api_container_service_proto_rawDescGZIP(), []int{17} + return file_api_container_service_proto_rawDescGZIP(), []int{19} } func (x *StarlarkRunProgress) GetCurrentStepInfo() []string { @@ -1894,7 +2083,7 @@ type StarlarkRunFinishedEvent struct { func (x *StarlarkRunFinishedEvent) Reset() { *x = StarlarkRunFinishedEvent{} if protoimpl.UnsafeEnabled { - mi := &file_api_container_service_proto_msgTypes[18] + mi := &file_api_container_service_proto_msgTypes[20] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1907,7 +2096,7 @@ func (x *StarlarkRunFinishedEvent) String() string { func (*StarlarkRunFinishedEvent) ProtoMessage() {} func (x *StarlarkRunFinishedEvent) ProtoReflect() protoreflect.Message { - mi := &file_api_container_service_proto_msgTypes[18] + mi := &file_api_container_service_proto_msgTypes[20] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1920,7 +2109,7 @@ func (x *StarlarkRunFinishedEvent) ProtoReflect() protoreflect.Message { // Deprecated: Use StarlarkRunFinishedEvent.ProtoReflect.Descriptor instead. func (*StarlarkRunFinishedEvent) Descriptor() ([]byte, []int) { - return file_api_container_service_proto_rawDescGZIP(), []int{18} + return file_api_container_service_proto_rawDescGZIP(), []int{20} } func (x *StarlarkRunFinishedEvent) GetIsRunSuccessful() bool { @@ -1955,7 +2144,7 @@ type GetServicesArgs struct { func (x *GetServicesArgs) Reset() { *x = GetServicesArgs{} if protoimpl.UnsafeEnabled { - mi := &file_api_container_service_proto_msgTypes[19] + mi := &file_api_container_service_proto_msgTypes[21] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1968,7 +2157,7 @@ func (x *GetServicesArgs) String() string { func (*GetServicesArgs) ProtoMessage() {} func (x *GetServicesArgs) ProtoReflect() protoreflect.Message { - mi := &file_api_container_service_proto_msgTypes[19] + mi := &file_api_container_service_proto_msgTypes[21] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1981,7 +2170,7 @@ func (x *GetServicesArgs) ProtoReflect() protoreflect.Message { // Deprecated: Use GetServicesArgs.ProtoReflect.Descriptor instead. func (*GetServicesArgs) Descriptor() ([]byte, []int) { - return file_api_container_service_proto_rawDescGZIP(), []int{19} + return file_api_container_service_proto_rawDescGZIP(), []int{21} } func (x *GetServicesArgs) GetServiceIdentifiers() map[string]bool { @@ -2003,7 +2192,7 @@ type GetServicesResponse struct { func (x *GetServicesResponse) Reset() { *x = GetServicesResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_container_service_proto_msgTypes[20] + mi := &file_api_container_service_proto_msgTypes[22] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2016,7 +2205,7 @@ func (x *GetServicesResponse) String() string { func (*GetServicesResponse) ProtoMessage() {} func (x *GetServicesResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_container_service_proto_msgTypes[20] + mi := &file_api_container_service_proto_msgTypes[22] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2029,7 +2218,7 @@ func (x *GetServicesResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetServicesResponse.ProtoReflect.Descriptor instead. func (*GetServicesResponse) Descriptor() ([]byte, []int) { - return file_api_container_service_proto_rawDescGZIP(), []int{20} + return file_api_container_service_proto_rawDescGZIP(), []int{22} } func (x *GetServicesResponse) GetServiceInfo() map[string]*ServiceInfo { @@ -2056,7 +2245,7 @@ type ServiceIdentifiers struct { func (x *ServiceIdentifiers) Reset() { *x = ServiceIdentifiers{} if protoimpl.UnsafeEnabled { - mi := &file_api_container_service_proto_msgTypes[21] + mi := &file_api_container_service_proto_msgTypes[23] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2069,7 +2258,7 @@ func (x *ServiceIdentifiers) String() string { func (*ServiceIdentifiers) ProtoMessage() {} func (x *ServiceIdentifiers) ProtoReflect() protoreflect.Message { - mi := &file_api_container_service_proto_msgTypes[21] + mi := &file_api_container_service_proto_msgTypes[23] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2082,7 +2271,7 @@ func (x *ServiceIdentifiers) ProtoReflect() protoreflect.Message { // Deprecated: Use ServiceIdentifiers.ProtoReflect.Descriptor instead. func (*ServiceIdentifiers) Descriptor() ([]byte, []int) { - return file_api_container_service_proto_rawDescGZIP(), []int{21} + return file_api_container_service_proto_rawDescGZIP(), []int{23} } func (x *ServiceIdentifiers) GetServiceUuid() string { @@ -2117,7 +2306,7 @@ type GetExistingAndHistoricalServiceIdentifiersResponse struct { func (x *GetExistingAndHistoricalServiceIdentifiersResponse) Reset() { *x = GetExistingAndHistoricalServiceIdentifiersResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_container_service_proto_msgTypes[22] + mi := &file_api_container_service_proto_msgTypes[24] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2130,7 +2319,7 @@ func (x *GetExistingAndHistoricalServiceIdentifiersResponse) String() string { func (*GetExistingAndHistoricalServiceIdentifiersResponse) ProtoMessage() {} func (x *GetExistingAndHistoricalServiceIdentifiersResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_container_service_proto_msgTypes[22] + mi := &file_api_container_service_proto_msgTypes[24] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2143,7 +2332,7 @@ func (x *GetExistingAndHistoricalServiceIdentifiersResponse) ProtoReflect() prot // Deprecated: Use GetExistingAndHistoricalServiceIdentifiersResponse.ProtoReflect.Descriptor instead. func (*GetExistingAndHistoricalServiceIdentifiersResponse) Descriptor() ([]byte, []int) { - return file_api_container_service_proto_rawDescGZIP(), []int{22} + return file_api_container_service_proto_rawDescGZIP(), []int{24} } func (x *GetExistingAndHistoricalServiceIdentifiersResponse) GetAllIdentifiers() []*ServiceIdentifiers { @@ -2171,7 +2360,7 @@ type ExecCommandArgs struct { func (x *ExecCommandArgs) Reset() { *x = ExecCommandArgs{} if protoimpl.UnsafeEnabled { - mi := &file_api_container_service_proto_msgTypes[23] + mi := &file_api_container_service_proto_msgTypes[25] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2184,7 +2373,7 @@ func (x *ExecCommandArgs) String() string { func (*ExecCommandArgs) ProtoMessage() {} func (x *ExecCommandArgs) ProtoReflect() protoreflect.Message { - mi := &file_api_container_service_proto_msgTypes[23] + mi := &file_api_container_service_proto_msgTypes[25] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2197,7 +2386,7 @@ func (x *ExecCommandArgs) ProtoReflect() protoreflect.Message { // Deprecated: Use ExecCommandArgs.ProtoReflect.Descriptor instead. func (*ExecCommandArgs) Descriptor() ([]byte, []int) { - return file_api_container_service_proto_rawDescGZIP(), []int{23} + return file_api_container_service_proto_rawDescGZIP(), []int{25} } func (x *ExecCommandArgs) GetServiceIdentifier() string { @@ -2227,7 +2416,7 @@ type ExecCommandResponse struct { func (x *ExecCommandResponse) Reset() { *x = ExecCommandResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_container_service_proto_msgTypes[24] + mi := &file_api_container_service_proto_msgTypes[26] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2240,7 +2429,7 @@ func (x *ExecCommandResponse) String() string { func (*ExecCommandResponse) ProtoMessage() {} func (x *ExecCommandResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_container_service_proto_msgTypes[24] + mi := &file_api_container_service_proto_msgTypes[26] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2253,7 +2442,7 @@ func (x *ExecCommandResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ExecCommandResponse.ProtoReflect.Descriptor instead. func (*ExecCommandResponse) Descriptor() ([]byte, []int) { - return file_api_container_service_proto_rawDescGZIP(), []int{24} + return file_api_container_service_proto_rawDescGZIP(), []int{26} } func (x *ExecCommandResponse) GetExitCode() int32 { @@ -2299,7 +2488,7 @@ type WaitForHttpGetEndpointAvailabilityArgs struct { func (x *WaitForHttpGetEndpointAvailabilityArgs) Reset() { *x = WaitForHttpGetEndpointAvailabilityArgs{} if protoimpl.UnsafeEnabled { - mi := &file_api_container_service_proto_msgTypes[25] + mi := &file_api_container_service_proto_msgTypes[27] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2312,7 +2501,7 @@ func (x *WaitForHttpGetEndpointAvailabilityArgs) String() string { func (*WaitForHttpGetEndpointAvailabilityArgs) ProtoMessage() {} func (x *WaitForHttpGetEndpointAvailabilityArgs) ProtoReflect() protoreflect.Message { - mi := &file_api_container_service_proto_msgTypes[25] + mi := &file_api_container_service_proto_msgTypes[27] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2325,7 +2514,7 @@ func (x *WaitForHttpGetEndpointAvailabilityArgs) ProtoReflect() protoreflect.Mes // Deprecated: Use WaitForHttpGetEndpointAvailabilityArgs.ProtoReflect.Descriptor instead. func (*WaitForHttpGetEndpointAvailabilityArgs) Descriptor() ([]byte, []int) { - return file_api_container_service_proto_rawDescGZIP(), []int{25} + return file_api_container_service_proto_rawDescGZIP(), []int{27} } func (x *WaitForHttpGetEndpointAvailabilityArgs) GetServiceIdentifier() string { @@ -2408,7 +2597,7 @@ type WaitForHttpPostEndpointAvailabilityArgs struct { func (x *WaitForHttpPostEndpointAvailabilityArgs) Reset() { *x = WaitForHttpPostEndpointAvailabilityArgs{} if protoimpl.UnsafeEnabled { - mi := &file_api_container_service_proto_msgTypes[26] + mi := &file_api_container_service_proto_msgTypes[28] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2421,7 +2610,7 @@ func (x *WaitForHttpPostEndpointAvailabilityArgs) String() string { func (*WaitForHttpPostEndpointAvailabilityArgs) ProtoMessage() {} func (x *WaitForHttpPostEndpointAvailabilityArgs) ProtoReflect() protoreflect.Message { - mi := &file_api_container_service_proto_msgTypes[26] + mi := &file_api_container_service_proto_msgTypes[28] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2434,7 +2623,7 @@ func (x *WaitForHttpPostEndpointAvailabilityArgs) ProtoReflect() protoreflect.Me // Deprecated: Use WaitForHttpPostEndpointAvailabilityArgs.ProtoReflect.Descriptor instead. func (*WaitForHttpPostEndpointAvailabilityArgs) Descriptor() ([]byte, []int) { - return file_api_container_service_proto_rawDescGZIP(), []int{26} + return file_api_container_service_proto_rawDescGZIP(), []int{28} } func (x *WaitForHttpPostEndpointAvailabilityArgs) GetServiceIdentifier() string { @@ -2516,7 +2705,7 @@ type StreamedDataChunk struct { func (x *StreamedDataChunk) Reset() { *x = StreamedDataChunk{} if protoimpl.UnsafeEnabled { - mi := &file_api_container_service_proto_msgTypes[27] + mi := &file_api_container_service_proto_msgTypes[29] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2529,7 +2718,7 @@ func (x *StreamedDataChunk) String() string { func (*StreamedDataChunk) ProtoMessage() {} func (x *StreamedDataChunk) ProtoReflect() protoreflect.Message { - mi := &file_api_container_service_proto_msgTypes[27] + mi := &file_api_container_service_proto_msgTypes[29] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2542,7 +2731,7 @@ func (x *StreamedDataChunk) ProtoReflect() protoreflect.Message { // Deprecated: Use StreamedDataChunk.ProtoReflect.Descriptor instead. func (*StreamedDataChunk) Descriptor() ([]byte, []int) { - return file_api_container_service_proto_rawDescGZIP(), []int{27} + return file_api_container_service_proto_rawDescGZIP(), []int{29} } func (x *StreamedDataChunk) GetData() []byte { @@ -2577,7 +2766,7 @@ type DataChunkMetadata struct { func (x *DataChunkMetadata) Reset() { *x = DataChunkMetadata{} if protoimpl.UnsafeEnabled { - mi := &file_api_container_service_proto_msgTypes[28] + mi := &file_api_container_service_proto_msgTypes[30] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2590,7 +2779,7 @@ func (x *DataChunkMetadata) String() string { func (*DataChunkMetadata) ProtoMessage() {} func (x *DataChunkMetadata) ProtoReflect() protoreflect.Message { - mi := &file_api_container_service_proto_msgTypes[28] + mi := &file_api_container_service_proto_msgTypes[30] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2603,7 +2792,7 @@ func (x *DataChunkMetadata) ProtoReflect() protoreflect.Message { // Deprecated: Use DataChunkMetadata.ProtoReflect.Descriptor instead. func (*DataChunkMetadata) Descriptor() ([]byte, []int) { - return file_api_container_service_proto_rawDescGZIP(), []int{28} + return file_api_container_service_proto_rawDescGZIP(), []int{30} } func (x *DataChunkMetadata) GetName() string { @@ -2632,7 +2821,7 @@ type UploadFilesArtifactResponse struct { func (x *UploadFilesArtifactResponse) Reset() { *x = UploadFilesArtifactResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_container_service_proto_msgTypes[29] + mi := &file_api_container_service_proto_msgTypes[31] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2645,7 +2834,7 @@ func (x *UploadFilesArtifactResponse) String() string { func (*UploadFilesArtifactResponse) ProtoMessage() {} func (x *UploadFilesArtifactResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_container_service_proto_msgTypes[29] + mi := &file_api_container_service_proto_msgTypes[31] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2658,7 +2847,7 @@ func (x *UploadFilesArtifactResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use UploadFilesArtifactResponse.ProtoReflect.Descriptor instead. func (*UploadFilesArtifactResponse) Descriptor() ([]byte, []int) { - return file_api_container_service_proto_rawDescGZIP(), []int{29} + return file_api_container_service_proto_rawDescGZIP(), []int{31} } func (x *UploadFilesArtifactResponse) GetUuid() string { @@ -2692,7 +2881,7 @@ type DownloadFilesArtifactArgs struct { func (x *DownloadFilesArtifactArgs) Reset() { *x = DownloadFilesArtifactArgs{} if protoimpl.UnsafeEnabled { - mi := &file_api_container_service_proto_msgTypes[30] + mi := &file_api_container_service_proto_msgTypes[32] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2705,7 +2894,7 @@ func (x *DownloadFilesArtifactArgs) String() string { func (*DownloadFilesArtifactArgs) ProtoMessage() {} func (x *DownloadFilesArtifactArgs) ProtoReflect() protoreflect.Message { - mi := &file_api_container_service_proto_msgTypes[30] + mi := &file_api_container_service_proto_msgTypes[32] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2718,7 +2907,7 @@ func (x *DownloadFilesArtifactArgs) ProtoReflect() protoreflect.Message { // Deprecated: Use DownloadFilesArtifactArgs.ProtoReflect.Descriptor instead. func (*DownloadFilesArtifactArgs) Descriptor() ([]byte, []int) { - return file_api_container_service_proto_rawDescGZIP(), []int{30} + return file_api_container_service_proto_rawDescGZIP(), []int{32} } func (x *DownloadFilesArtifactArgs) GetIdentifier() string { @@ -2747,7 +2936,7 @@ type StoreWebFilesArtifactArgs struct { func (x *StoreWebFilesArtifactArgs) Reset() { *x = StoreWebFilesArtifactArgs{} if protoimpl.UnsafeEnabled { - mi := &file_api_container_service_proto_msgTypes[31] + mi := &file_api_container_service_proto_msgTypes[33] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2760,7 +2949,7 @@ func (x *StoreWebFilesArtifactArgs) String() string { func (*StoreWebFilesArtifactArgs) ProtoMessage() {} func (x *StoreWebFilesArtifactArgs) ProtoReflect() protoreflect.Message { - mi := &file_api_container_service_proto_msgTypes[31] + mi := &file_api_container_service_proto_msgTypes[33] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2773,7 +2962,7 @@ func (x *StoreWebFilesArtifactArgs) ProtoReflect() protoreflect.Message { // Deprecated: Use StoreWebFilesArtifactArgs.ProtoReflect.Descriptor instead. func (*StoreWebFilesArtifactArgs) Descriptor() ([]byte, []int) { - return file_api_container_service_proto_rawDescGZIP(), []int{31} + return file_api_container_service_proto_rawDescGZIP(), []int{33} } func (x *StoreWebFilesArtifactArgs) GetUrl() string { @@ -2802,7 +2991,7 @@ type StoreWebFilesArtifactResponse struct { func (x *StoreWebFilesArtifactResponse) Reset() { *x = StoreWebFilesArtifactResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_container_service_proto_msgTypes[32] + mi := &file_api_container_service_proto_msgTypes[34] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2815,7 +3004,7 @@ func (x *StoreWebFilesArtifactResponse) String() string { func (*StoreWebFilesArtifactResponse) ProtoMessage() {} func (x *StoreWebFilesArtifactResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_container_service_proto_msgTypes[32] + mi := &file_api_container_service_proto_msgTypes[34] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2828,7 +3017,7 @@ func (x *StoreWebFilesArtifactResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use StoreWebFilesArtifactResponse.ProtoReflect.Descriptor instead. func (*StoreWebFilesArtifactResponse) Descriptor() ([]byte, []int) { - return file_api_container_service_proto_rawDescGZIP(), []int{32} + return file_api_container_service_proto_rawDescGZIP(), []int{34} } func (x *StoreWebFilesArtifactResponse) GetUuid() string { @@ -2854,7 +3043,7 @@ type StoreFilesArtifactFromServiceArgs struct { func (x *StoreFilesArtifactFromServiceArgs) Reset() { *x = StoreFilesArtifactFromServiceArgs{} if protoimpl.UnsafeEnabled { - mi := &file_api_container_service_proto_msgTypes[33] + mi := &file_api_container_service_proto_msgTypes[35] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2867,7 +3056,7 @@ func (x *StoreFilesArtifactFromServiceArgs) String() string { func (*StoreFilesArtifactFromServiceArgs) ProtoMessage() {} func (x *StoreFilesArtifactFromServiceArgs) ProtoReflect() protoreflect.Message { - mi := &file_api_container_service_proto_msgTypes[33] + mi := &file_api_container_service_proto_msgTypes[35] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2880,7 +3069,7 @@ func (x *StoreFilesArtifactFromServiceArgs) ProtoReflect() protoreflect.Message // Deprecated: Use StoreFilesArtifactFromServiceArgs.ProtoReflect.Descriptor instead. func (*StoreFilesArtifactFromServiceArgs) Descriptor() ([]byte, []int) { - return file_api_container_service_proto_rawDescGZIP(), []int{33} + return file_api_container_service_proto_rawDescGZIP(), []int{35} } func (x *StoreFilesArtifactFromServiceArgs) GetServiceIdentifier() string { @@ -2916,7 +3105,7 @@ type StoreFilesArtifactFromServiceResponse struct { func (x *StoreFilesArtifactFromServiceResponse) Reset() { *x = StoreFilesArtifactFromServiceResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_container_service_proto_msgTypes[34] + mi := &file_api_container_service_proto_msgTypes[36] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2929,7 +3118,7 @@ func (x *StoreFilesArtifactFromServiceResponse) String() string { func (*StoreFilesArtifactFromServiceResponse) ProtoMessage() {} func (x *StoreFilesArtifactFromServiceResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_container_service_proto_msgTypes[34] + mi := &file_api_container_service_proto_msgTypes[36] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2942,7 +3131,7 @@ func (x *StoreFilesArtifactFromServiceResponse) ProtoReflect() protoreflect.Mess // Deprecated: Use StoreFilesArtifactFromServiceResponse.ProtoReflect.Descriptor instead. func (*StoreFilesArtifactFromServiceResponse) Descriptor() ([]byte, []int) { - return file_api_container_service_proto_rawDescGZIP(), []int{34} + return file_api_container_service_proto_rawDescGZIP(), []int{36} } func (x *StoreFilesArtifactFromServiceResponse) GetUuid() string { @@ -2966,7 +3155,7 @@ type FilesArtifactNameAndUuid struct { func (x *FilesArtifactNameAndUuid) Reset() { *x = FilesArtifactNameAndUuid{} if protoimpl.UnsafeEnabled { - mi := &file_api_container_service_proto_msgTypes[35] + mi := &file_api_container_service_proto_msgTypes[37] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2979,7 +3168,7 @@ func (x *FilesArtifactNameAndUuid) String() string { func (*FilesArtifactNameAndUuid) ProtoMessage() {} func (x *FilesArtifactNameAndUuid) ProtoReflect() protoreflect.Message { - mi := &file_api_container_service_proto_msgTypes[35] + mi := &file_api_container_service_proto_msgTypes[37] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2992,7 +3181,7 @@ func (x *FilesArtifactNameAndUuid) ProtoReflect() protoreflect.Message { // Deprecated: Use FilesArtifactNameAndUuid.ProtoReflect.Descriptor instead. func (*FilesArtifactNameAndUuid) Descriptor() ([]byte, []int) { - return file_api_container_service_proto_rawDescGZIP(), []int{35} + return file_api_container_service_proto_rawDescGZIP(), []int{37} } func (x *FilesArtifactNameAndUuid) GetFileName() string { @@ -3020,7 +3209,7 @@ type ListFilesArtifactNamesAndUuidsResponse struct { func (x *ListFilesArtifactNamesAndUuidsResponse) Reset() { *x = ListFilesArtifactNamesAndUuidsResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_container_service_proto_msgTypes[36] + mi := &file_api_container_service_proto_msgTypes[38] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3033,7 +3222,7 @@ func (x *ListFilesArtifactNamesAndUuidsResponse) String() string { func (*ListFilesArtifactNamesAndUuidsResponse) ProtoMessage() {} func (x *ListFilesArtifactNamesAndUuidsResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_container_service_proto_msgTypes[36] + mi := &file_api_container_service_proto_msgTypes[38] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3046,7 +3235,7 @@ func (x *ListFilesArtifactNamesAndUuidsResponse) ProtoReflect() protoreflect.Mes // Deprecated: Use ListFilesArtifactNamesAndUuidsResponse.ProtoReflect.Descriptor instead. func (*ListFilesArtifactNamesAndUuidsResponse) Descriptor() ([]byte, []int) { - return file_api_container_service_proto_rawDescGZIP(), []int{36} + return file_api_container_service_proto_rawDescGZIP(), []int{38} } func (x *ListFilesArtifactNamesAndUuidsResponse) GetFileNamesAndUuids() []*FilesArtifactNameAndUuid { @@ -3067,7 +3256,7 @@ type InspectFilesArtifactContentsRequest struct { func (x *InspectFilesArtifactContentsRequest) Reset() { *x = InspectFilesArtifactContentsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_container_service_proto_msgTypes[37] + mi := &file_api_container_service_proto_msgTypes[39] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3080,7 +3269,7 @@ func (x *InspectFilesArtifactContentsRequest) String() string { func (*InspectFilesArtifactContentsRequest) ProtoMessage() {} func (x *InspectFilesArtifactContentsRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_container_service_proto_msgTypes[37] + mi := &file_api_container_service_proto_msgTypes[39] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3093,7 +3282,7 @@ func (x *InspectFilesArtifactContentsRequest) ProtoReflect() protoreflect.Messag // Deprecated: Use InspectFilesArtifactContentsRequest.ProtoReflect.Descriptor instead. func (*InspectFilesArtifactContentsRequest) Descriptor() ([]byte, []int) { - return file_api_container_service_proto_rawDescGZIP(), []int{37} + return file_api_container_service_proto_rawDescGZIP(), []int{39} } func (x *InspectFilesArtifactContentsRequest) GetFileNamesAndUuid() *FilesArtifactNameAndUuid { @@ -3114,7 +3303,7 @@ type InspectFilesArtifactContentsResponse struct { func (x *InspectFilesArtifactContentsResponse) Reset() { *x = InspectFilesArtifactContentsResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_container_service_proto_msgTypes[38] + mi := &file_api_container_service_proto_msgTypes[40] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3127,7 +3316,7 @@ func (x *InspectFilesArtifactContentsResponse) String() string { func (*InspectFilesArtifactContentsResponse) ProtoMessage() {} func (x *InspectFilesArtifactContentsResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_container_service_proto_msgTypes[38] + mi := &file_api_container_service_proto_msgTypes[40] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3140,7 +3329,7 @@ func (x *InspectFilesArtifactContentsResponse) ProtoReflect() protoreflect.Messa // Deprecated: Use InspectFilesArtifactContentsResponse.ProtoReflect.Descriptor instead. func (*InspectFilesArtifactContentsResponse) Descriptor() ([]byte, []int) { - return file_api_container_service_proto_rawDescGZIP(), []int{38} + return file_api_container_service_proto_rawDescGZIP(), []int{40} } func (x *InspectFilesArtifactContentsResponse) GetFileDescriptions() []*FileArtifactContentsFileDescription { @@ -3166,7 +3355,7 @@ type FileArtifactContentsFileDescription struct { func (x *FileArtifactContentsFileDescription) Reset() { *x = FileArtifactContentsFileDescription{} if protoimpl.UnsafeEnabled { - mi := &file_api_container_service_proto_msgTypes[39] + mi := &file_api_container_service_proto_msgTypes[41] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3179,7 +3368,7 @@ func (x *FileArtifactContentsFileDescription) String() string { func (*FileArtifactContentsFileDescription) ProtoMessage() {} func (x *FileArtifactContentsFileDescription) ProtoReflect() protoreflect.Message { - mi := &file_api_container_service_proto_msgTypes[39] + mi := &file_api_container_service_proto_msgTypes[41] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3192,7 +3381,7 @@ func (x *FileArtifactContentsFileDescription) ProtoReflect() protoreflect.Messag // Deprecated: Use FileArtifactContentsFileDescription.ProtoReflect.Descriptor instead. func (*FileArtifactContentsFileDescription) Descriptor() ([]byte, []int) { - return file_api_container_service_proto_rawDescGZIP(), []int{39} + return file_api_container_service_proto_rawDescGZIP(), []int{41} } func (x *FileArtifactContentsFileDescription) GetPath() string { @@ -3227,7 +3416,7 @@ type ConnectServicesArgs struct { func (x *ConnectServicesArgs) Reset() { *x = ConnectServicesArgs{} if protoimpl.UnsafeEnabled { - mi := &file_api_container_service_proto_msgTypes[40] + mi := &file_api_container_service_proto_msgTypes[42] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3240,7 +3429,7 @@ func (x *ConnectServicesArgs) String() string { func (*ConnectServicesArgs) ProtoMessage() {} func (x *ConnectServicesArgs) ProtoReflect() protoreflect.Message { - mi := &file_api_container_service_proto_msgTypes[40] + mi := &file_api_container_service_proto_msgTypes[42] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3253,7 +3442,7 @@ func (x *ConnectServicesArgs) ProtoReflect() protoreflect.Message { // Deprecated: Use ConnectServicesArgs.ProtoReflect.Descriptor instead. func (*ConnectServicesArgs) Descriptor() ([]byte, []int) { - return file_api_container_service_proto_rawDescGZIP(), []int{40} + return file_api_container_service_proto_rawDescGZIP(), []int{42} } func (x *ConnectServicesArgs) GetConnect() Connect { @@ -3272,7 +3461,7 @@ type ConnectServicesResponse struct { func (x *ConnectServicesResponse) Reset() { *x = ConnectServicesResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_container_service_proto_msgTypes[41] + mi := &file_api_container_service_proto_msgTypes[43] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3285,7 +3474,7 @@ func (x *ConnectServicesResponse) String() string { func (*ConnectServicesResponse) ProtoMessage() {} func (x *ConnectServicesResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_container_service_proto_msgTypes[41] + mi := &file_api_container_service_proto_msgTypes[43] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3298,7 +3487,7 @@ func (x *ConnectServicesResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ConnectServicesResponse.ProtoReflect.Descriptor instead. func (*ConnectServicesResponse) Descriptor() ([]byte, []int) { - return file_api_container_service_proto_rawDescGZIP(), []int{41} + return file_api_container_service_proto_rawDescGZIP(), []int{43} } type GetStarlarkRunResponse struct { @@ -3321,7 +3510,7 @@ type GetStarlarkRunResponse struct { func (x *GetStarlarkRunResponse) Reset() { *x = GetStarlarkRunResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_container_service_proto_msgTypes[42] + mi := &file_api_container_service_proto_msgTypes[44] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3334,7 +3523,7 @@ func (x *GetStarlarkRunResponse) String() string { func (*GetStarlarkRunResponse) ProtoMessage() {} func (x *GetStarlarkRunResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_container_service_proto_msgTypes[42] + mi := &file_api_container_service_proto_msgTypes[44] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3347,7 +3536,7 @@ func (x *GetStarlarkRunResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetStarlarkRunResponse.ProtoReflect.Descriptor instead. func (*GetStarlarkRunResponse) Descriptor() ([]byte, []int) { - return file_api_container_service_proto_rawDescGZIP(), []int{42} + return file_api_container_service_proto_rawDescGZIP(), []int{44} } func (x *GetStarlarkRunResponse) GetPackageId() string { @@ -3424,7 +3613,7 @@ type PlanYaml struct { func (x *PlanYaml) Reset() { *x = PlanYaml{} if protoimpl.UnsafeEnabled { - mi := &file_api_container_service_proto_msgTypes[43] + mi := &file_api_container_service_proto_msgTypes[45] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3437,7 +3626,7 @@ func (x *PlanYaml) String() string { func (*PlanYaml) ProtoMessage() {} func (x *PlanYaml) ProtoReflect() protoreflect.Message { - mi := &file_api_container_service_proto_msgTypes[43] + mi := &file_api_container_service_proto_msgTypes[45] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3450,7 +3639,7 @@ func (x *PlanYaml) ProtoReflect() protoreflect.Message { // Deprecated: Use PlanYaml.ProtoReflect.Descriptor instead. func (*PlanYaml) Descriptor() ([]byte, []int) { - return file_api_container_service_proto_rawDescGZIP(), []int{43} + return file_api_container_service_proto_rawDescGZIP(), []int{45} } func (x *PlanYaml) GetPlanYaml() string { @@ -3474,7 +3663,7 @@ type StarlarkScriptPlanYamlArgs struct { func (x *StarlarkScriptPlanYamlArgs) Reset() { *x = StarlarkScriptPlanYamlArgs{} if protoimpl.UnsafeEnabled { - mi := &file_api_container_service_proto_msgTypes[44] + mi := &file_api_container_service_proto_msgTypes[46] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3487,7 +3676,7 @@ func (x *StarlarkScriptPlanYamlArgs) String() string { func (*StarlarkScriptPlanYamlArgs) ProtoMessage() {} func (x *StarlarkScriptPlanYamlArgs) ProtoReflect() protoreflect.Message { - mi := &file_api_container_service_proto_msgTypes[44] + mi := &file_api_container_service_proto_msgTypes[46] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3500,7 +3689,7 @@ func (x *StarlarkScriptPlanYamlArgs) ProtoReflect() protoreflect.Message { // Deprecated: Use StarlarkScriptPlanYamlArgs.ProtoReflect.Descriptor instead. func (*StarlarkScriptPlanYamlArgs) Descriptor() ([]byte, []int) { - return file_api_container_service_proto_rawDescGZIP(), []int{44} + return file_api_container_service_proto_rawDescGZIP(), []int{46} } func (x *StarlarkScriptPlanYamlArgs) GetSerializedScript() string { @@ -3544,7 +3733,7 @@ type StarlarkPackagePlanYamlArgs struct { func (x *StarlarkPackagePlanYamlArgs) Reset() { *x = StarlarkPackagePlanYamlArgs{} if protoimpl.UnsafeEnabled { - mi := &file_api_container_service_proto_msgTypes[45] + mi := &file_api_container_service_proto_msgTypes[47] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3557,7 +3746,7 @@ func (x *StarlarkPackagePlanYamlArgs) String() string { func (*StarlarkPackagePlanYamlArgs) ProtoMessage() {} func (x *StarlarkPackagePlanYamlArgs) ProtoReflect() protoreflect.Message { - mi := &file_api_container_service_proto_msgTypes[45] + mi := &file_api_container_service_proto_msgTypes[47] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3570,7 +3759,7 @@ func (x *StarlarkPackagePlanYamlArgs) ProtoReflect() protoreflect.Message { // Deprecated: Use StarlarkPackagePlanYamlArgs.ProtoReflect.Descriptor instead. func (*StarlarkPackagePlanYamlArgs) Descriptor() ([]byte, []int) { - return file_api_container_service_proto_rawDescGZIP(), []int{45} + return file_api_container_service_proto_rawDescGZIP(), []int{47} } func (x *StarlarkPackagePlanYamlArgs) GetPackageId() string { @@ -3665,746 +3854,787 @@ var file_api_container_service_proto_rawDesc = []byte{ 0x65, 0x73, 0x5f, 0x61, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x73, 0x5f, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x19, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x73, 0x49, 0x64, - 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x73, 0x22, 0xa8, 0x09, 0x0a, 0x0b, 0x53, 0x65, - 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x21, 0x0a, 0x0c, 0x73, 0x65, 0x72, - 0x76, 0x69, 0x63, 0x65, 0x5f, 0x75, 0x75, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0b, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x55, 0x75, 0x69, 0x64, 0x12, 0x26, 0x0a, 0x0f, - 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x5f, 0x69, 0x70, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x49, 0x70, - 0x41, 0x64, 0x64, 0x72, 0x12, 0x55, 0x0a, 0x0d, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x5f, - 0x70, 0x6f, 0x72, 0x74, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x61, 0x70, - 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, - 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x50, 0x72, 0x69, 0x76, - 0x61, 0x74, 0x65, 0x50, 0x6f, 0x72, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, 0x70, - 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x50, 0x6f, 0x72, 0x74, 0x73, 0x12, 0x2f, 0x0a, 0x14, 0x6d, - 0x61, 0x79, 0x62, 0x65, 0x5f, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x5f, 0x69, 0x70, 0x5f, 0x61, - 0x64, 0x64, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x6d, 0x61, 0x79, 0x62, 0x65, - 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x49, 0x70, 0x41, 0x64, 0x64, 0x72, 0x12, 0x62, 0x0a, 0x12, - 0x6d, 0x61, 0x79, 0x62, 0x65, 0x5f, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x5f, 0x70, 0x6f, 0x72, - 0x74, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, - 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x65, 0x72, - 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x4d, 0x61, 0x79, 0x62, 0x65, 0x50, 0x75, - 0x62, 0x6c, 0x69, 0x63, 0x50, 0x6f, 0x72, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x10, - 0x6d, 0x61, 0x79, 0x62, 0x65, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x50, 0x6f, 0x72, 0x74, 0x73, - 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, - 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x65, 0x6e, 0x65, - 0x64, 0x5f, 0x75, 0x75, 0x69, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x73, 0x68, - 0x6f, 0x72, 0x74, 0x65, 0x6e, 0x65, 0x64, 0x55, 0x75, 0x69, 0x64, 0x12, 0x47, 0x0a, 0x0e, 0x73, - 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x08, 0x20, - 0x01, 0x28, 0x0e, 0x32, 0x20, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, - 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, - 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x0d, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x12, 0x3a, 0x0a, 0x09, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, - 0x72, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, - 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x43, 0x6f, 0x6e, 0x74, - 0x61, 0x69, 0x6e, 0x65, 0x72, 0x52, 0x09, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, - 0x12, 0xb4, 0x01, 0x0a, 0x30, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x64, 0x69, 0x72, - 0x5f, 0x70, 0x61, 0x74, 0x68, 0x73, 0x5f, 0x74, 0x6f, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x5f, - 0x61, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x73, 0x5f, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, - 0x66, 0x69, 0x65, 0x72, 0x73, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x4e, 0x2e, 0x61, 0x70, - 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, - 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x53, 0x65, 0x72, 0x76, - 0x69, 0x63, 0x65, 0x44, 0x69, 0x72, 0x50, 0x61, 0x74, 0x68, 0x73, 0x54, 0x6f, 0x46, 0x69, 0x6c, - 0x65, 0x73, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x73, 0x49, 0x64, 0x65, 0x6e, 0x74, - 0x69, 0x66, 0x69, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x2a, 0x73, 0x65, 0x72, - 0x76, 0x69, 0x63, 0x65, 0x44, 0x69, 0x72, 0x50, 0x61, 0x74, 0x68, 0x73, 0x54, 0x6f, 0x46, 0x69, - 0x6c, 0x65, 0x73, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x73, 0x49, 0x64, 0x65, 0x6e, - 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x73, 0x12, 0x23, 0x0a, 0x0d, 0x6d, 0x61, 0x78, 0x5f, 0x6d, - 0x69, 0x6c, 0x6c, 0x69, 0x63, 0x70, 0x75, 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0c, - 0x6d, 0x61, 0x78, 0x4d, 0x69, 0x6c, 0x6c, 0x69, 0x63, 0x70, 0x75, 0x73, 0x12, 0x23, 0x0a, 0x0d, - 0x6d, 0x69, 0x6e, 0x5f, 0x6d, 0x69, 0x6c, 0x6c, 0x69, 0x63, 0x70, 0x75, 0x73, 0x18, 0x0c, 0x20, - 0x01, 0x28, 0x0d, 0x52, 0x0c, 0x6d, 0x69, 0x6e, 0x4d, 0x69, 0x6c, 0x6c, 0x69, 0x63, 0x70, 0x75, - 0x73, 0x12, 0x30, 0x0a, 0x14, 0x6d, 0x61, 0x78, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, - 0x6d, 0x65, 0x67, 0x61, 0x62, 0x79, 0x74, 0x65, 0x73, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0d, 0x52, - 0x12, 0x6d, 0x61, 0x78, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x4d, 0x65, 0x67, 0x61, 0x62, 0x79, - 0x74, 0x65, 0x73, 0x12, 0x30, 0x0a, 0x14, 0x6d, 0x69, 0x6e, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, - 0x79, 0x5f, 0x6d, 0x65, 0x67, 0x61, 0x62, 0x79, 0x74, 0x65, 0x73, 0x18, 0x0e, 0x20, 0x01, 0x28, - 0x0d, 0x52, 0x12, 0x6d, 0x69, 0x6e, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x4d, 0x65, 0x67, 0x61, - 0x62, 0x79, 0x74, 0x65, 0x73, 0x1a, 0x58, 0x0a, 0x11, 0x50, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, - 0x50, 0x6f, 0x72, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, - 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2d, 0x0a, 0x05, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x61, 0x70, - 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, - 0x50, 0x6f, 0x72, 0x74, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, - 0x5c, 0x0a, 0x15, 0x4d, 0x61, 0x79, 0x62, 0x65, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x50, 0x6f, - 0x72, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2d, 0x0a, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x61, 0x70, 0x69, 0x5f, - 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x50, 0x6f, - 0x72, 0x74, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x84, 0x01, - 0x0a, 0x2f, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x44, 0x69, 0x72, 0x50, 0x61, 0x74, 0x68, - 0x73, 0x54, 0x6f, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, - 0x73, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, - 0x6b, 0x65, 0x79, 0x12, 0x3b, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, - 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x72, 0x74, 0x69, - 0x66, 0x61, 0x63, 0x74, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x3a, 0x02, 0x38, 0x01, 0x22, 0xd0, 0x05, 0x0a, 0x15, 0x52, 0x75, 0x6e, 0x53, 0x74, 0x61, 0x72, - 0x6c, 0x61, 0x72, 0x6b, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, 0x41, 0x72, 0x67, 0x73, 0x12, 0x2b, - 0x0a, 0x11, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x5f, 0x73, 0x63, 0x72, - 0x69, 0x70, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x73, 0x65, 0x72, 0x69, 0x61, - 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, 0x12, 0x30, 0x0a, 0x11, 0x73, - 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x10, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, - 0x69, 0x7a, 0x65, 0x64, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x88, 0x01, 0x01, 0x12, 0x1c, 0x0a, - 0x07, 0x64, 0x72, 0x79, 0x5f, 0x72, 0x75, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x48, 0x01, - 0x52, 0x06, 0x64, 0x72, 0x79, 0x52, 0x75, 0x6e, 0x88, 0x01, 0x01, 0x12, 0x25, 0x0a, 0x0b, 0x70, - 0x61, 0x72, 0x61, 0x6c, 0x6c, 0x65, 0x6c, 0x69, 0x73, 0x6d, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, - 0x48, 0x02, 0x52, 0x0b, 0x70, 0x61, 0x72, 0x61, 0x6c, 0x6c, 0x65, 0x6c, 0x69, 0x73, 0x6d, 0x88, - 0x01, 0x01, 0x12, 0x31, 0x0a, 0x12, 0x6d, 0x61, 0x69, 0x6e, 0x5f, 0x66, 0x75, 0x6e, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x48, 0x03, - 0x52, 0x10, 0x6d, 0x61, 0x69, 0x6e, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, - 0x6d, 0x65, 0x88, 0x01, 0x01, 0x12, 0x5b, 0x0a, 0x15, 0x65, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, - 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x5f, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x18, 0x06, - 0x20, 0x03, 0x28, 0x0e, 0x32, 0x26, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, - 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x4b, 0x75, 0x72, 0x74, 0x6f, 0x73, 0x69, - 0x73, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x46, 0x6c, 0x61, 0x67, 0x52, 0x14, 0x65, 0x78, - 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, - 0x65, 0x73, 0x12, 0x2f, 0x0a, 0x11, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x5f, 0x69, 0x6e, 0x73, 0x74, - 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x48, 0x04, 0x52, - 0x0f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x64, - 0x88, 0x01, 0x01, 0x12, 0x27, 0x0a, 0x0d, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x5f, 0x75, 0x73, 0x65, - 0x72, 0x5f, 0x69, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x48, 0x05, 0x52, 0x0b, 0x63, 0x6c, - 0x6f, 0x75, 0x64, 0x55, 0x73, 0x65, 0x72, 0x49, 0x64, 0x88, 0x01, 0x01, 0x12, 0x59, 0x0a, 0x13, - 0x69, 0x6d, 0x61, 0x67, 0x65, 0x5f, 0x64, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x6d, - 0x6f, 0x64, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x24, 0x2e, 0x61, 0x70, 0x69, 0x5f, - 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x49, 0x6d, - 0x61, 0x67, 0x65, 0x44, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x4d, 0x6f, 0x64, 0x65, 0x48, - 0x06, 0x52, 0x11, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x44, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, - 0x4d, 0x6f, 0x64, 0x65, 0x88, 0x01, 0x01, 0x12, 0x2f, 0x0a, 0x11, 0x6e, 0x6f, 0x6e, 0x5f, 0x62, - 0x6c, 0x6f, 0x63, 0x6b, 0x69, 0x6e, 0x67, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x0a, 0x20, 0x01, - 0x28, 0x08, 0x48, 0x07, 0x52, 0x0f, 0x6e, 0x6f, 0x6e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x69, 0x6e, - 0x67, 0x4d, 0x6f, 0x64, 0x65, 0x88, 0x01, 0x01, 0x42, 0x14, 0x0a, 0x12, 0x5f, 0x73, 0x65, 0x72, - 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x42, 0x0a, - 0x0a, 0x08, 0x5f, 0x64, 0x72, 0x79, 0x5f, 0x72, 0x75, 0x6e, 0x42, 0x0e, 0x0a, 0x0c, 0x5f, 0x70, - 0x61, 0x72, 0x61, 0x6c, 0x6c, 0x65, 0x6c, 0x69, 0x73, 0x6d, 0x42, 0x15, 0x0a, 0x13, 0x5f, 0x6d, - 0x61, 0x69, 0x6e, 0x5f, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, - 0x65, 0x42, 0x14, 0x0a, 0x12, 0x5f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x5f, 0x69, 0x6e, 0x73, 0x74, - 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x63, 0x6c, 0x6f, 0x75, - 0x64, 0x5f, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x42, 0x16, 0x0a, 0x14, 0x5f, 0x69, 0x6d, - 0x61, 0x67, 0x65, 0x5f, 0x64, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x6d, 0x6f, 0x64, - 0x65, 0x42, 0x14, 0x0a, 0x12, 0x5f, 0x6e, 0x6f, 0x6e, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x69, - 0x6e, 0x67, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x22, 0xf4, 0x07, 0x0a, 0x16, 0x52, 0x75, 0x6e, 0x53, - 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x41, 0x72, - 0x67, 0x73, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x5f, 0x69, 0x64, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x49, - 0x64, 0x12, 0x16, 0x0a, 0x05, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, - 0x48, 0x00, 0x52, 0x05, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x12, 0x18, 0x0a, 0x06, 0x72, 0x65, 0x6d, - 0x6f, 0x74, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x48, 0x00, 0x52, 0x06, 0x72, 0x65, 0x6d, - 0x6f, 0x74, 0x65, 0x12, 0x30, 0x0a, 0x11, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, - 0x64, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, - 0x52, 0x10, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x50, 0x61, 0x72, 0x61, - 0x6d, 0x73, 0x88, 0x01, 0x01, 0x12, 0x1c, 0x0a, 0x07, 0x64, 0x72, 0x79, 0x5f, 0x72, 0x75, 0x6e, - 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x48, 0x02, 0x52, 0x06, 0x64, 0x72, 0x79, 0x52, 0x75, 0x6e, - 0x88, 0x01, 0x01, 0x12, 0x25, 0x0a, 0x0b, 0x70, 0x61, 0x72, 0x61, 0x6c, 0x6c, 0x65, 0x6c, 0x69, - 0x73, 0x6d, 0x18, 0x07, 0x20, 0x01, 0x28, 0x05, 0x48, 0x03, 0x52, 0x0b, 0x70, 0x61, 0x72, 0x61, - 0x6c, 0x6c, 0x65, 0x6c, 0x69, 0x73, 0x6d, 0x88, 0x01, 0x01, 0x12, 0x28, 0x0a, 0x0d, 0x63, 0x6c, - 0x6f, 0x6e, 0x65, 0x5f, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, - 0x08, 0x48, 0x04, 0x52, 0x0c, 0x63, 0x6c, 0x6f, 0x6e, 0x65, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, - 0x65, 0x88, 0x01, 0x01, 0x12, 0x3f, 0x0a, 0x1a, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x76, 0x65, - 0x5f, 0x70, 0x61, 0x74, 0x68, 0x5f, 0x74, 0x6f, 0x5f, 0x6d, 0x61, 0x69, 0x6e, 0x5f, 0x66, 0x69, - 0x6c, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x48, 0x05, 0x52, 0x16, 0x72, 0x65, 0x6c, 0x61, - 0x74, 0x69, 0x76, 0x65, 0x50, 0x61, 0x74, 0x68, 0x54, 0x6f, 0x4d, 0x61, 0x69, 0x6e, 0x46, 0x69, - 0x6c, 0x65, 0x88, 0x01, 0x01, 0x12, 0x31, 0x0a, 0x12, 0x6d, 0x61, 0x69, 0x6e, 0x5f, 0x66, 0x75, - 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, - 0x09, 0x48, 0x06, 0x52, 0x10, 0x6d, 0x61, 0x69, 0x6e, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x88, 0x01, 0x01, 0x12, 0x5b, 0x0a, 0x15, 0x65, 0x78, 0x70, 0x65, - 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x5f, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, - 0x73, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x26, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, - 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x4b, 0x75, 0x72, 0x74, - 0x6f, 0x73, 0x69, 0x73, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x46, 0x6c, 0x61, 0x67, 0x52, - 0x14, 0x65, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x46, 0x65, 0x61, - 0x74, 0x75, 0x72, 0x65, 0x73, 0x12, 0x2f, 0x0a, 0x11, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x5f, 0x69, - 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, - 0x48, 0x07, 0x52, 0x0f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, - 0x65, 0x49, 0x64, 0x88, 0x01, 0x01, 0x12, 0x27, 0x0a, 0x0d, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x5f, - 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x48, 0x08, 0x52, - 0x0b, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x55, 0x73, 0x65, 0x72, 0x49, 0x64, 0x88, 0x01, 0x01, 0x12, - 0x59, 0x0a, 0x13, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x5f, 0x64, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, - 0x64, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x24, 0x2e, 0x61, + 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x73, 0x22, 0x46, 0x0a, 0x04, 0x55, 0x73, 0x65, + 0x72, 0x12, 0x1a, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x10, 0x0a, + 0x03, 0x75, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x03, 0x75, 0x69, 0x64, 0x12, + 0x10, 0x0a, 0x03, 0x67, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x03, 0x67, 0x69, + 0x64, 0x22, 0x97, 0x01, 0x0a, 0x0a, 0x54, 0x6f, 0x6c, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, + 0x65, 0x79, 0x12, 0x1a, 0x0a, 0x08, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x12, 0x14, + 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x65, 0x66, 0x66, 0x65, 0x63, 0x74, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, 0x66, 0x66, 0x65, 0x63, 0x74, 0x12, 0x2d, 0x0a, 0x12, + 0x74, 0x6f, 0x6c, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x65, 0x63, 0x6f, 0x6e, + 0x64, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x11, 0x74, 0x6f, 0x6c, 0x65, 0x72, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x22, 0xdb, 0x0c, 0x0a, 0x0b, + 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x21, 0x0a, 0x0c, 0x73, + 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x75, 0x75, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0b, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x55, 0x75, 0x69, 0x64, 0x12, 0x26, + 0x0a, 0x0f, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x5f, 0x69, 0x70, 0x5f, 0x61, 0x64, 0x64, + 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, + 0x49, 0x70, 0x41, 0x64, 0x64, 0x72, 0x12, 0x55, 0x0a, 0x0d, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, + 0x65, 0x5f, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x30, 0x2e, + 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, + 0x69, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x50, 0x72, + 0x69, 0x76, 0x61, 0x74, 0x65, 0x50, 0x6f, 0x72, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, + 0x0c, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x50, 0x6f, 0x72, 0x74, 0x73, 0x12, 0x2f, 0x0a, + 0x14, 0x6d, 0x61, 0x79, 0x62, 0x65, 0x5f, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x5f, 0x69, 0x70, + 0x5f, 0x61, 0x64, 0x64, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x6d, 0x61, 0x79, + 0x62, 0x65, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x49, 0x70, 0x41, 0x64, 0x64, 0x72, 0x12, 0x62, + 0x0a, 0x12, 0x6d, 0x61, 0x79, 0x62, 0x65, 0x5f, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x5f, 0x70, + 0x6f, 0x72, 0x74, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x61, 0x70, 0x69, + 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x53, + 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x4d, 0x61, 0x79, 0x62, 0x65, + 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x50, 0x6f, 0x72, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x52, 0x10, 0x6d, 0x61, 0x79, 0x62, 0x65, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x50, 0x6f, 0x72, + 0x74, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x65, + 0x6e, 0x65, 0x64, 0x5f, 0x75, 0x75, 0x69, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, + 0x73, 0x68, 0x6f, 0x72, 0x74, 0x65, 0x6e, 0x65, 0x64, 0x55, 0x75, 0x69, 0x64, 0x12, 0x47, 0x0a, + 0x0e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, + 0x08, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x20, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, + 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, + 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x0d, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, + 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x3a, 0x0a, 0x09, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, + 0x6e, 0x65, 0x72, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x61, 0x70, 0x69, 0x5f, + 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x43, 0x6f, + 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x52, 0x09, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, + 0x65, 0x72, 0x12, 0x9f, 0x01, 0x0a, 0x29, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x64, + 0x69, 0x72, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x73, 0x5f, 0x74, 0x6f, 0x5f, 0x66, 0x69, 0x6c, 0x65, + 0x73, 0x5f, 0x61, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x73, 0x5f, 0x6c, 0x69, 0x73, 0x74, + 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x47, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, + 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, + 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x44, 0x69, + 0x72, 0x50, 0x61, 0x74, 0x68, 0x73, 0x54, 0x6f, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x72, 0x74, + 0x69, 0x66, 0x61, 0x63, 0x74, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, + 0x23, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x44, 0x69, 0x72, 0x50, 0x61, 0x74, 0x68, 0x73, + 0x54, 0x6f, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x73, + 0x4c, 0x69, 0x73, 0x74, 0x12, 0x23, 0x0a, 0x0d, 0x6d, 0x61, 0x78, 0x5f, 0x6d, 0x69, 0x6c, 0x6c, + 0x69, 0x63, 0x70, 0x75, 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0c, 0x6d, 0x61, 0x78, + 0x4d, 0x69, 0x6c, 0x6c, 0x69, 0x63, 0x70, 0x75, 0x73, 0x12, 0x23, 0x0a, 0x0d, 0x6d, 0x69, 0x6e, + 0x5f, 0x6d, 0x69, 0x6c, 0x6c, 0x69, 0x63, 0x70, 0x75, 0x73, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0d, + 0x52, 0x0c, 0x6d, 0x69, 0x6e, 0x4d, 0x69, 0x6c, 0x6c, 0x69, 0x63, 0x70, 0x75, 0x73, 0x12, 0x30, + 0x0a, 0x14, 0x6d, 0x61, 0x78, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x6d, 0x65, 0x67, + 0x61, 0x62, 0x79, 0x74, 0x65, 0x73, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x12, 0x6d, 0x61, + 0x78, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x4d, 0x65, 0x67, 0x61, 0x62, 0x79, 0x74, 0x65, 0x73, + 0x12, 0x30, 0x0a, 0x14, 0x6d, 0x69, 0x6e, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x6d, + 0x65, 0x67, 0x61, 0x62, 0x79, 0x74, 0x65, 0x73, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x12, + 0x6d, 0x69, 0x6e, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x4d, 0x65, 0x67, 0x61, 0x62, 0x79, 0x74, + 0x65, 0x73, 0x12, 0x30, 0x0a, 0x04, 0x75, 0x73, 0x65, 0x72, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x17, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, + 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x48, 0x00, 0x52, 0x04, 0x75, 0x73, 0x65, + 0x72, 0x88, 0x01, 0x01, 0x12, 0x3f, 0x0a, 0x0b, 0x74, 0x6f, 0x6c, 0x65, 0x72, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x18, 0x10, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x61, 0x70, 0x69, 0x5f, + 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x54, 0x6f, + 0x6c, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0b, 0x74, 0x6f, 0x6c, 0x65, 0x72, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x58, 0x0a, 0x0e, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x73, 0x65, + 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x18, 0x11, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x31, 0x2e, + 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, + 0x69, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x4e, 0x6f, + 0x64, 0x65, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x52, 0x0d, 0x6e, 0x6f, 0x64, 0x65, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x12, + 0x42, 0x0a, 0x06, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x12, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x2a, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, + 0x61, 0x70, 0x69, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, + 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x06, 0x6c, 0x61, 0x62, + 0x65, 0x6c, 0x73, 0x12, 0x26, 0x0a, 0x0c, 0x74, 0x69, 0x6e, 0x69, 0x5f, 0x65, 0x6e, 0x61, 0x62, + 0x6c, 0x65, 0x64, 0x18, 0x13, 0x20, 0x01, 0x28, 0x08, 0x48, 0x01, 0x52, 0x0b, 0x74, 0x69, 0x6e, + 0x69, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x88, 0x01, 0x01, 0x1a, 0x58, 0x0a, 0x11, 0x50, + 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x50, 0x6f, 0x72, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, + 0x65, 0x79, 0x12, 0x2d, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x17, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, + 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x50, 0x6f, 0x72, 0x74, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x5c, 0x0a, 0x15, 0x4d, 0x61, 0x79, 0x62, 0x65, 0x50, 0x75, + 0x62, 0x6c, 0x69, 0x63, 0x50, 0x6f, 0x72, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, + 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, + 0x12, 0x2d, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x17, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, + 0x61, 0x70, 0x69, 0x2e, 0x50, 0x6f, 0x72, 0x74, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, + 0x02, 0x38, 0x01, 0x1a, 0x7d, 0x0a, 0x28, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x44, 0x69, + 0x72, 0x50, 0x61, 0x74, 0x68, 0x73, 0x54, 0x6f, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x72, 0x74, + 0x69, 0x66, 0x61, 0x63, 0x74, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, + 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, + 0x79, 0x12, 0x3b, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x25, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, + 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, + 0x63, 0x74, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, + 0x38, 0x01, 0x1a, 0x40, 0x0a, 0x12, 0x4e, 0x6f, 0x64, 0x65, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, + 0x6f, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x39, 0x0a, 0x0b, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x42, + 0x07, 0x0a, 0x05, 0x5f, 0x75, 0x73, 0x65, 0x72, 0x42, 0x0f, 0x0a, 0x0d, 0x5f, 0x74, 0x69, 0x6e, + 0x69, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x22, 0xd0, 0x05, 0x0a, 0x15, 0x52, 0x75, + 0x6e, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, 0x41, + 0x72, 0x67, 0x73, 0x12, 0x2b, 0x0a, 0x11, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, + 0x64, 0x5f, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, + 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x12, 0x30, 0x0a, 0x11, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x5f, 0x70, + 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x10, 0x73, + 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x88, + 0x01, 0x01, 0x12, 0x1c, 0x0a, 0x07, 0x64, 0x72, 0x79, 0x5f, 0x72, 0x75, 0x6e, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x08, 0x48, 0x01, 0x52, 0x06, 0x64, 0x72, 0x79, 0x52, 0x75, 0x6e, 0x88, 0x01, 0x01, + 0x12, 0x25, 0x0a, 0x0b, 0x70, 0x61, 0x72, 0x61, 0x6c, 0x6c, 0x65, 0x6c, 0x69, 0x73, 0x6d, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x05, 0x48, 0x02, 0x52, 0x0b, 0x70, 0x61, 0x72, 0x61, 0x6c, 0x6c, 0x65, + 0x6c, 0x69, 0x73, 0x6d, 0x88, 0x01, 0x01, 0x12, 0x31, 0x0a, 0x12, 0x6d, 0x61, 0x69, 0x6e, 0x5f, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x09, 0x48, 0x03, 0x52, 0x10, 0x6d, 0x61, 0x69, 0x6e, 0x46, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x88, 0x01, 0x01, 0x12, 0x5b, 0x0a, 0x15, 0x65, 0x78, + 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x5f, 0x66, 0x65, 0x61, 0x74, 0x75, + 0x72, 0x65, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x26, 0x2e, 0x61, 0x70, 0x69, 0x5f, + 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x4b, 0x75, + 0x72, 0x74, 0x6f, 0x73, 0x69, 0x73, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x46, 0x6c, 0x61, + 0x67, 0x52, 0x14, 0x65, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x46, + 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x12, 0x2f, 0x0a, 0x11, 0x63, 0x6c, 0x6f, 0x75, 0x64, + 0x5f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x07, 0x20, 0x01, + 0x28, 0x09, 0x48, 0x04, 0x52, 0x0f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x49, 0x6e, 0x73, 0x74, 0x61, + 0x6e, 0x63, 0x65, 0x49, 0x64, 0x88, 0x01, 0x01, 0x12, 0x27, 0x0a, 0x0d, 0x63, 0x6c, 0x6f, 0x75, + 0x64, 0x5f, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x48, + 0x05, 0x52, 0x0b, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x55, 0x73, 0x65, 0x72, 0x49, 0x64, 0x88, 0x01, + 0x01, 0x12, 0x59, 0x0a, 0x13, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x5f, 0x64, 0x6f, 0x77, 0x6e, 0x6c, + 0x6f, 0x61, 0x64, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x24, + 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, + 0x70, 0x69, 0x2e, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x44, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, + 0x4d, 0x6f, 0x64, 0x65, 0x48, 0x06, 0x52, 0x11, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x44, 0x6f, 0x77, + 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x4d, 0x6f, 0x64, 0x65, 0x88, 0x01, 0x01, 0x12, 0x2f, 0x0a, 0x11, + 0x6e, 0x6f, 0x6e, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x69, 0x6e, 0x67, 0x5f, 0x6d, 0x6f, 0x64, + 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x08, 0x48, 0x07, 0x52, 0x0f, 0x6e, 0x6f, 0x6e, 0x42, 0x6c, + 0x6f, 0x63, 0x6b, 0x69, 0x6e, 0x67, 0x4d, 0x6f, 0x64, 0x65, 0x88, 0x01, 0x01, 0x42, 0x14, 0x0a, + 0x12, 0x5f, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x5f, 0x70, 0x61, 0x72, + 0x61, 0x6d, 0x73, 0x42, 0x0a, 0x0a, 0x08, 0x5f, 0x64, 0x72, 0x79, 0x5f, 0x72, 0x75, 0x6e, 0x42, + 0x0e, 0x0a, 0x0c, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6c, 0x6c, 0x65, 0x6c, 0x69, 0x73, 0x6d, 0x42, + 0x15, 0x0a, 0x13, 0x5f, 0x6d, 0x61, 0x69, 0x6e, 0x5f, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x42, 0x14, 0x0a, 0x12, 0x5f, 0x63, 0x6c, 0x6f, 0x75, 0x64, + 0x5f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x42, 0x10, 0x0a, 0x0e, + 0x5f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x5f, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x42, 0x16, + 0x0a, 0x14, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x5f, 0x64, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, + 0x64, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x42, 0x14, 0x0a, 0x12, 0x5f, 0x6e, 0x6f, 0x6e, 0x5f, 0x62, + 0x6c, 0x6f, 0x63, 0x6b, 0x69, 0x6e, 0x67, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x22, 0xf4, 0x07, 0x0a, + 0x16, 0x52, 0x75, 0x6e, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x50, 0x61, 0x63, 0x6b, + 0x61, 0x67, 0x65, 0x41, 0x72, 0x67, 0x73, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x61, 0x63, 0x6b, 0x61, + 0x67, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x70, 0x61, 0x63, + 0x6b, 0x61, 0x67, 0x65, 0x49, 0x64, 0x12, 0x16, 0x0a, 0x05, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x0c, 0x48, 0x00, 0x52, 0x05, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x12, 0x18, + 0x0a, 0x06, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x48, 0x00, + 0x52, 0x06, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x12, 0x30, 0x0a, 0x11, 0x73, 0x65, 0x72, 0x69, + 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x10, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, + 0x64, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x88, 0x01, 0x01, 0x12, 0x1c, 0x0a, 0x07, 0x64, 0x72, + 0x79, 0x5f, 0x72, 0x75, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x48, 0x02, 0x52, 0x06, 0x64, + 0x72, 0x79, 0x52, 0x75, 0x6e, 0x88, 0x01, 0x01, 0x12, 0x25, 0x0a, 0x0b, 0x70, 0x61, 0x72, 0x61, + 0x6c, 0x6c, 0x65, 0x6c, 0x69, 0x73, 0x6d, 0x18, 0x07, 0x20, 0x01, 0x28, 0x05, 0x48, 0x03, 0x52, + 0x0b, 0x70, 0x61, 0x72, 0x61, 0x6c, 0x6c, 0x65, 0x6c, 0x69, 0x73, 0x6d, 0x88, 0x01, 0x01, 0x12, + 0x28, 0x0a, 0x0d, 0x63, 0x6c, 0x6f, 0x6e, 0x65, 0x5f, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, + 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x48, 0x04, 0x52, 0x0c, 0x63, 0x6c, 0x6f, 0x6e, 0x65, 0x50, + 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x88, 0x01, 0x01, 0x12, 0x3f, 0x0a, 0x1a, 0x72, 0x65, 0x6c, + 0x61, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x5f, 0x74, 0x6f, 0x5f, 0x6d, 0x61, + 0x69, 0x6e, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x48, 0x05, 0x52, + 0x16, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x76, 0x65, 0x50, 0x61, 0x74, 0x68, 0x54, 0x6f, 0x4d, + 0x61, 0x69, 0x6e, 0x46, 0x69, 0x6c, 0x65, 0x88, 0x01, 0x01, 0x12, 0x31, 0x0a, 0x12, 0x6d, 0x61, + 0x69, 0x6e, 0x5f, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, + 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x48, 0x06, 0x52, 0x10, 0x6d, 0x61, 0x69, 0x6e, 0x46, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x88, 0x01, 0x01, 0x12, 0x5b, 0x0a, + 0x15, 0x65, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x5f, 0x66, 0x65, + 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x26, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, - 0x2e, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x44, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x4d, 0x6f, - 0x64, 0x65, 0x48, 0x09, 0x52, 0x11, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x44, 0x6f, 0x77, 0x6e, 0x6c, - 0x6f, 0x61, 0x64, 0x4d, 0x6f, 0x64, 0x65, 0x88, 0x01, 0x01, 0x12, 0x2f, 0x0a, 0x11, 0x6e, 0x6f, - 0x6e, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x69, 0x6e, 0x67, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x18, - 0x0f, 0x20, 0x01, 0x28, 0x08, 0x48, 0x0a, 0x52, 0x0f, 0x6e, 0x6f, 0x6e, 0x42, 0x6c, 0x6f, 0x63, - 0x6b, 0x69, 0x6e, 0x67, 0x4d, 0x6f, 0x64, 0x65, 0x88, 0x01, 0x01, 0x12, 0x2f, 0x0a, 0x11, 0x67, - 0x69, 0x74, 0x68, 0x75, 0x62, 0x5f, 0x61, 0x75, 0x74, 0x68, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, - 0x18, 0x10, 0x20, 0x01, 0x28, 0x09, 0x48, 0x0b, 0x52, 0x0f, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, - 0x41, 0x75, 0x74, 0x68, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x88, 0x01, 0x01, 0x42, 0x1a, 0x0a, 0x18, - 0x73, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x5f, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, - 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x42, 0x14, 0x0a, 0x12, 0x5f, 0x73, 0x65, 0x72, - 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x42, 0x0a, - 0x0a, 0x08, 0x5f, 0x64, 0x72, 0x79, 0x5f, 0x72, 0x75, 0x6e, 0x42, 0x0e, 0x0a, 0x0c, 0x5f, 0x70, - 0x61, 0x72, 0x61, 0x6c, 0x6c, 0x65, 0x6c, 0x69, 0x73, 0x6d, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x63, - 0x6c, 0x6f, 0x6e, 0x65, 0x5f, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x42, 0x1d, 0x0a, 0x1b, - 0x5f, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x5f, 0x74, - 0x6f, 0x5f, 0x6d, 0x61, 0x69, 0x6e, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x42, 0x15, 0x0a, 0x13, 0x5f, - 0x6d, 0x61, 0x69, 0x6e, 0x5f, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x61, - 0x6d, 0x65, 0x42, 0x14, 0x0a, 0x12, 0x5f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x5f, 0x69, 0x6e, 0x73, - 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x63, 0x6c, 0x6f, - 0x75, 0x64, 0x5f, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x42, 0x16, 0x0a, 0x14, 0x5f, 0x69, - 0x6d, 0x61, 0x67, 0x65, 0x5f, 0x64, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x6d, 0x6f, - 0x64, 0x65, 0x42, 0x14, 0x0a, 0x12, 0x5f, 0x6e, 0x6f, 0x6e, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, - 0x69, 0x6e, 0x67, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x42, 0x14, 0x0a, 0x12, 0x5f, 0x67, 0x69, 0x74, - 0x68, 0x75, 0x62, 0x5f, 0x61, 0x75, 0x74, 0x68, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0xb6, - 0x04, 0x0a, 0x17, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x52, 0x75, 0x6e, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x4c, 0x69, 0x6e, 0x65, 0x12, 0x4a, 0x0a, 0x0b, 0x69, 0x6e, - 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x26, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, - 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x49, 0x6e, 0x73, 0x74, - 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x00, 0x52, 0x0b, 0x69, 0x6e, 0x73, 0x74, 0x72, - 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x38, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, - 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, - 0x72, 0x6b, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x48, 0x00, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, - 0x12, 0x4d, 0x0a, 0x0d, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x5f, 0x69, 0x6e, 0x66, - 0x6f, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, - 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, 0x61, 0x72, - 0x6c, 0x61, 0x72, 0x6b, 0x52, 0x75, 0x6e, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x48, - 0x00, 0x52, 0x0c, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x12, - 0x5d, 0x0a, 0x12, 0x69, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x72, - 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x61, 0x70, - 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, - 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x49, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x48, 0x00, 0x52, 0x11, 0x69, 0x6e, 0x73, - 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x5b, - 0x0a, 0x12, 0x72, 0x75, 0x6e, 0x5f, 0x66, 0x69, 0x6e, 0x69, 0x73, 0x68, 0x65, 0x64, 0x5f, 0x65, - 0x76, 0x65, 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x4b, 0x75, 0x72, 0x74, 0x6f, 0x73, 0x69, 0x73, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, + 0x46, 0x6c, 0x61, 0x67, 0x52, 0x14, 0x65, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, + 0x61, 0x6c, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x12, 0x2f, 0x0a, 0x11, 0x63, 0x6c, + 0x6f, 0x75, 0x64, 0x5f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, + 0x0c, 0x20, 0x01, 0x28, 0x09, 0x48, 0x07, 0x52, 0x0f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x49, 0x6e, + 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x64, 0x88, 0x01, 0x01, 0x12, 0x27, 0x0a, 0x0d, 0x63, + 0x6c, 0x6f, 0x75, 0x64, 0x5f, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x0d, 0x20, 0x01, + 0x28, 0x09, 0x48, 0x08, 0x52, 0x0b, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x55, 0x73, 0x65, 0x72, 0x49, + 0x64, 0x88, 0x01, 0x01, 0x12, 0x59, 0x0a, 0x13, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x5f, 0x64, 0x6f, + 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x0e, 0x20, 0x01, 0x28, + 0x0e, 0x32, 0x24, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, + 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x44, 0x6f, 0x77, 0x6e, 0x6c, + 0x6f, 0x61, 0x64, 0x4d, 0x6f, 0x64, 0x65, 0x48, 0x09, 0x52, 0x11, 0x69, 0x6d, 0x61, 0x67, 0x65, + 0x44, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x4d, 0x6f, 0x64, 0x65, 0x88, 0x01, 0x01, 0x12, + 0x2f, 0x0a, 0x11, 0x6e, 0x6f, 0x6e, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x69, 0x6e, 0x67, 0x5f, + 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x08, 0x48, 0x0a, 0x52, 0x0f, 0x6e, 0x6f, + 0x6e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x69, 0x6e, 0x67, 0x4d, 0x6f, 0x64, 0x65, 0x88, 0x01, 0x01, + 0x12, 0x2f, 0x0a, 0x11, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x5f, 0x61, 0x75, 0x74, 0x68, 0x5f, + 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x10, 0x20, 0x01, 0x28, 0x09, 0x48, 0x0b, 0x52, 0x0f, 0x67, + 0x69, 0x74, 0x68, 0x75, 0x62, 0x41, 0x75, 0x74, 0x68, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x88, 0x01, + 0x01, 0x42, 0x1a, 0x0a, 0x18, 0x73, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x5f, 0x70, 0x61, + 0x63, 0x6b, 0x61, 0x67, 0x65, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x42, 0x14, 0x0a, + 0x12, 0x5f, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x5f, 0x70, 0x61, 0x72, + 0x61, 0x6d, 0x73, 0x42, 0x0a, 0x0a, 0x08, 0x5f, 0x64, 0x72, 0x79, 0x5f, 0x72, 0x75, 0x6e, 0x42, + 0x0e, 0x0a, 0x0c, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6c, 0x6c, 0x65, 0x6c, 0x69, 0x73, 0x6d, 0x42, + 0x10, 0x0a, 0x0e, 0x5f, 0x63, 0x6c, 0x6f, 0x6e, 0x65, 0x5f, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, + 0x65, 0x42, 0x1d, 0x0a, 0x1b, 0x5f, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x70, + 0x61, 0x74, 0x68, 0x5f, 0x74, 0x6f, 0x5f, 0x6d, 0x61, 0x69, 0x6e, 0x5f, 0x66, 0x69, 0x6c, 0x65, + 0x42, 0x15, 0x0a, 0x13, 0x5f, 0x6d, 0x61, 0x69, 0x6e, 0x5f, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x42, 0x14, 0x0a, 0x12, 0x5f, 0x63, 0x6c, 0x6f, 0x75, + 0x64, 0x5f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x42, 0x10, 0x0a, + 0x0e, 0x5f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x5f, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x42, + 0x16, 0x0a, 0x14, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x5f, 0x64, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, + 0x61, 0x64, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x42, 0x14, 0x0a, 0x12, 0x5f, 0x6e, 0x6f, 0x6e, 0x5f, + 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x69, 0x6e, 0x67, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x42, 0x14, 0x0a, + 0x12, 0x5f, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x5f, 0x61, 0x75, 0x74, 0x68, 0x5f, 0x74, 0x6f, + 0x6b, 0x65, 0x6e, 0x22, 0xb6, 0x04, 0x0a, 0x17, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, + 0x52, 0x75, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x4c, 0x69, 0x6e, 0x65, 0x12, + 0x4a, 0x0a, 0x0b, 0x69, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, + 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, + 0x6b, 0x49, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x00, 0x52, 0x0b, + 0x69, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x38, 0x0a, 0x05, 0x65, + 0x72, 0x72, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x53, - 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x52, 0x75, 0x6e, 0x46, 0x69, 0x6e, 0x69, 0x73, 0x68, - 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x10, 0x72, 0x75, 0x6e, 0x46, 0x69, - 0x6e, 0x69, 0x73, 0x68, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x3e, 0x0a, 0x07, 0x77, - 0x61, 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x61, + 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x48, 0x00, 0x52, 0x05, + 0x65, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x4d, 0x0a, 0x0d, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, + 0x73, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, - 0x2e, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x57, 0x61, 0x72, 0x6e, 0x69, 0x6e, 0x67, - 0x48, 0x00, 0x52, 0x07, 0x77, 0x61, 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x12, 0x35, 0x0a, 0x04, 0x69, - 0x6e, 0x66, 0x6f, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x61, 0x70, 0x69, 0x5f, - 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, - 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x48, 0x00, 0x52, 0x04, 0x69, 0x6e, - 0x66, 0x6f, 0x42, 0x13, 0x0a, 0x11, 0x72, 0x75, 0x6e, 0x5f, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x5f, 0x6c, 0x69, 0x6e, 0x65, 0x22, 0x31, 0x0a, 0x0c, 0x53, 0x74, 0x61, 0x72, 0x6c, - 0x61, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x21, 0x0a, 0x0c, 0x69, 0x6e, 0x66, 0x6f, 0x5f, - 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x69, - 0x6e, 0x66, 0x6f, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x3a, 0x0a, 0x0f, 0x53, 0x74, - 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x57, 0x61, 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x12, 0x27, 0x0a, - 0x0f, 0x77, 0x61, 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x77, 0x61, 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x4d, - 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0xcd, 0x02, 0x0a, 0x13, 0x53, 0x74, 0x61, 0x72, 0x6c, - 0x61, 0x72, 0x6b, 0x49, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x4a, - 0x0a, 0x08, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x2e, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, + 0x2e, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x52, 0x75, 0x6e, 0x50, 0x72, 0x6f, 0x67, + 0x72, 0x65, 0x73, 0x73, 0x48, 0x00, 0x52, 0x0c, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, + 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x5d, 0x0a, 0x12, 0x69, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x5f, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x2c, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x49, 0x6e, 0x73, - 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, - 0x52, 0x08, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x29, 0x0a, 0x10, 0x69, 0x6e, - 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x69, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x47, 0x0a, 0x09, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, - 0x74, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, - 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, 0x61, - 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x49, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x41, 0x72, 0x67, 0x52, 0x09, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x35, - 0x0a, 0x16, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x69, 0x6e, 0x73, - 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x15, - 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x49, 0x6e, 0x73, 0x74, 0x72, 0x75, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1d, 0x0a, 0x0a, 0x69, 0x73, 0x5f, 0x73, 0x6b, 0x69, 0x70, - 0x70, 0x65, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x69, 0x73, 0x53, 0x6b, 0x69, - 0x70, 0x70, 0x65, 0x64, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, - 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, - 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x5f, 0x0a, 0x19, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, - 0x72, 0x6b, 0x49, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, - 0x75, 0x6c, 0x74, 0x12, 0x42, 0x0a, 0x1d, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, - 0x64, 0x5f, 0x69, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x72, 0x65, - 0x73, 0x75, 0x6c, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x1b, 0x73, 0x65, 0x72, 0x69, - 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x49, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0xa4, 0x01, 0x0a, 0x16, 0x53, 0x74, 0x61, 0x72, - 0x6c, 0x61, 0x72, 0x6b, 0x49, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x41, - 0x72, 0x67, 0x12, 0x30, 0x0a, 0x14, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, - 0x5f, 0x61, 0x72, 0x67, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x12, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x41, 0x72, 0x67, 0x56, - 0x61, 0x6c, 0x75, 0x65, 0x12, 0x1e, 0x0a, 0x08, 0x61, 0x72, 0x67, 0x5f, 0x6e, 0x61, 0x6d, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x07, 0x61, 0x72, 0x67, 0x4e, 0x61, 0x6d, - 0x65, 0x88, 0x01, 0x01, 0x12, 0x2b, 0x0a, 0x11, 0x69, 0x73, 0x5f, 0x72, 0x65, 0x70, 0x72, 0x65, - 0x73, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x76, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x10, 0x69, 0x73, 0x52, 0x65, 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x76, - 0x65, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x61, 0x72, 0x67, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x65, - 0x0a, 0x1b, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x49, 0x6e, 0x73, 0x74, 0x72, 0x75, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1a, 0x0a, - 0x08, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x08, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6c, 0x69, 0x6e, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x6c, 0x69, 0x6e, 0x65, 0x12, 0x16, 0x0a, - 0x06, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x63, - 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x22, 0xac, 0x02, 0x0a, 0x0d, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, - 0x72, 0x6b, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x63, 0x0a, 0x14, 0x69, 0x6e, 0x74, 0x65, 0x72, - 0x70, 0x72, 0x65, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, + 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x48, 0x00, + 0x52, 0x11, 0x69, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, + 0x75, 0x6c, 0x74, 0x12, 0x5b, 0x0a, 0x12, 0x72, 0x75, 0x6e, 0x5f, 0x66, 0x69, 0x6e, 0x69, 0x73, + 0x68, 0x65, 0x64, 0x5f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x2b, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, + 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x52, 0x75, 0x6e, 0x46, + 0x69, 0x6e, 0x69, 0x73, 0x68, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x10, + 0x72, 0x75, 0x6e, 0x46, 0x69, 0x6e, 0x69, 0x73, 0x68, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, + 0x12, 0x3e, 0x0a, 0x07, 0x77, 0x61, 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x18, 0x06, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x22, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, + 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x57, 0x61, + 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x48, 0x00, 0x52, 0x07, 0x77, 0x61, 0x72, 0x6e, 0x69, 0x6e, 0x67, + 0x12, 0x35, 0x0a, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, + 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, + 0x70, 0x69, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x48, + 0x00, 0x52, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x42, 0x13, 0x0a, 0x11, 0x72, 0x75, 0x6e, 0x5f, 0x72, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x5f, 0x6c, 0x69, 0x6e, 0x65, 0x22, 0x31, 0x0a, 0x0c, + 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x21, 0x0a, 0x0c, + 0x69, 0x6e, 0x66, 0x6f, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0b, 0x69, 0x6e, 0x66, 0x6f, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, + 0x3a, 0x0a, 0x0f, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x57, 0x61, 0x72, 0x6e, 0x69, + 0x6e, 0x67, 0x12, 0x27, 0x0a, 0x0f, 0x77, 0x61, 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x5f, 0x6d, 0x65, + 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x77, 0x61, 0x72, + 0x6e, 0x69, 0x6e, 0x67, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0xcd, 0x02, 0x0a, 0x13, + 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x49, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x12, 0x4a, 0x0a, 0x08, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, - 0x72, 0x6b, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x45, 0x72, 0x72, 0x6f, 0x72, 0x48, 0x00, 0x52, 0x13, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, - 0x65, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x57, 0x0a, 0x10, - 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, - 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x6c, - 0x61, 0x72, 0x6b, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x72, 0x72, - 0x6f, 0x72, 0x48, 0x00, 0x52, 0x0f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x45, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x54, 0x0a, 0x0f, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, - 0x6f, 0x6e, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, - 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, - 0x70, 0x69, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x45, 0x78, 0x65, 0x63, 0x75, - 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x48, 0x00, 0x52, 0x0e, 0x65, 0x78, 0x65, - 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x42, 0x07, 0x0a, 0x05, 0x65, - 0x72, 0x72, 0x6f, 0x72, 0x22, 0x42, 0x0a, 0x1b, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, - 0x49, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x72, - 0x72, 0x6f, 0x72, 0x12, 0x23, 0x0a, 0x0d, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x5f, 0x6d, 0x65, 0x73, - 0x73, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x65, 0x72, 0x72, 0x6f, - 0x72, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x3e, 0x0a, 0x17, 0x53, 0x74, 0x61, 0x72, - 0x6c, 0x61, 0x72, 0x6b, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x72, - 0x72, 0x6f, 0x72, 0x12, 0x23, 0x0a, 0x0d, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x5f, 0x6d, 0x65, 0x73, - 0x73, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x65, 0x72, 0x72, 0x6f, - 0x72, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x3d, 0x0a, 0x16, 0x53, 0x74, 0x61, 0x72, - 0x6c, 0x61, 0x72, 0x6b, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x72, 0x72, - 0x6f, 0x72, 0x12, 0x23, 0x0a, 0x0d, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x5f, 0x6d, 0x65, 0x73, 0x73, - 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x65, 0x72, 0x72, 0x6f, 0x72, - 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x92, 0x01, 0x0a, 0x13, 0x53, 0x74, 0x61, 0x72, - 0x6c, 0x61, 0x72, 0x6b, 0x52, 0x75, 0x6e, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x12, - 0x2a, 0x0a, 0x11, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x74, 0x65, 0x70, 0x5f, - 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0f, 0x63, 0x75, 0x72, 0x72, - 0x65, 0x6e, 0x74, 0x53, 0x74, 0x65, 0x70, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1f, 0x0a, 0x0b, 0x74, - 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x73, 0x74, 0x65, 0x70, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, - 0x52, 0x0a, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x53, 0x74, 0x65, 0x70, 0x73, 0x12, 0x2e, 0x0a, 0x13, - 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x74, 0x65, 0x70, 0x5f, 0x6e, 0x75, 0x6d, - 0x62, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x11, 0x63, 0x75, 0x72, 0x72, 0x65, - 0x6e, 0x74, 0x53, 0x74, 0x65, 0x70, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x22, 0x8e, 0x01, 0x0a, - 0x18, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x52, 0x75, 0x6e, 0x46, 0x69, 0x6e, 0x69, - 0x73, 0x68, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x2a, 0x0a, 0x11, 0x69, 0x73, 0x5f, - 0x72, 0x75, 0x6e, 0x5f, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x66, 0x75, 0x6c, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, 0x69, 0x73, 0x52, 0x75, 0x6e, 0x53, 0x75, 0x63, 0x63, 0x65, - 0x73, 0x73, 0x66, 0x75, 0x6c, 0x12, 0x30, 0x0a, 0x11, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, - 0x7a, 0x65, 0x64, 0x5f, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x48, 0x00, 0x52, 0x10, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x4f, 0x75, - 0x74, 0x70, 0x75, 0x74, 0x88, 0x01, 0x01, 0x42, 0x14, 0x0a, 0x12, 0x5f, 0x73, 0x65, 0x72, 0x69, - 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x5f, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0xc5, 0x01, - 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x41, 0x72, 0x67, - 0x73, 0x12, 0x6b, 0x0a, 0x13, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x65, - 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3a, - 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, - 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x41, 0x72, - 0x67, 0x73, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, - 0x66, 0x69, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x12, 0x73, 0x65, 0x72, 0x76, - 0x69, 0x63, 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x73, 0x1a, 0x45, - 0x0a, 0x17, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, - 0x69, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xd1, 0x01, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x53, 0x65, 0x72, - 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x5a, 0x0a, - 0x0c, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x01, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x37, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, + 0x72, 0x6b, 0x49, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x73, + 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x08, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, + 0x29, 0x0a, 0x10, 0x69, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, + 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x69, 0x6e, 0x73, 0x74, 0x72, + 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x47, 0x0a, 0x09, 0x61, 0x72, + 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x29, 0x2e, + 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, + 0x69, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x49, 0x6e, 0x73, 0x74, 0x72, 0x75, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x41, 0x72, 0x67, 0x52, 0x09, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, + 0x6e, 0x74, 0x73, 0x12, 0x35, 0x0a, 0x16, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x61, 0x62, 0x6c, + 0x65, 0x5f, 0x69, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x15, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x49, + 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1d, 0x0a, 0x0a, 0x69, 0x73, + 0x5f, 0x73, 0x6b, 0x69, 0x70, 0x70, 0x65, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, + 0x69, 0x73, 0x53, 0x6b, 0x69, 0x70, 0x70, 0x65, 0x64, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x5f, 0x0a, 0x19, 0x53, + 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x49, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x42, 0x0a, 0x1d, 0x73, 0x65, 0x72, 0x69, + 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x5f, 0x69, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x5f, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x1b, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x49, 0x6e, 0x73, 0x74, 0x72, + 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0xa4, 0x01, 0x0a, + 0x16, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x49, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x41, 0x72, 0x67, 0x12, 0x30, 0x0a, 0x14, 0x73, 0x65, 0x72, 0x69, 0x61, + 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x5f, 0x61, 0x72, 0x67, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, + 0x64, 0x41, 0x72, 0x67, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x1e, 0x0a, 0x08, 0x61, 0x72, 0x67, + 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x07, 0x61, + 0x72, 0x67, 0x4e, 0x61, 0x6d, 0x65, 0x88, 0x01, 0x01, 0x12, 0x2b, 0x0a, 0x11, 0x69, 0x73, 0x5f, + 0x72, 0x65, 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x76, 0x65, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, 0x69, 0x73, 0x52, 0x65, 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, + 0x74, 0x61, 0x74, 0x69, 0x76, 0x65, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x61, 0x72, 0x67, 0x5f, 0x6e, + 0x61, 0x6d, 0x65, 0x22, 0x65, 0x0a, 0x1b, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x49, + 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, + 0x6f, 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, + 0x0a, 0x04, 0x6c, 0x69, 0x6e, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x6c, 0x69, + 0x6e, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x05, 0x52, 0x06, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x22, 0xac, 0x02, 0x0a, 0x0d, 0x53, + 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x63, 0x0a, 0x14, + 0x69, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x65, + 0x72, 0x72, 0x6f, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x61, 0x70, 0x69, + 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x53, + 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x48, 0x00, 0x52, 0x13, 0x69, 0x6e, + 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x72, 0x72, 0x6f, + 0x72, 0x12, 0x57, 0x0a, 0x10, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, + 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x61, 0x70, + 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, + 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x48, 0x00, 0x52, 0x0f, 0x76, 0x61, 0x6c, 0x69, 0x64, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x54, 0x0a, 0x0f, 0x65, 0x78, + 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, + 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, + 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x48, 0x00, + 0x52, 0x0e, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x72, 0x72, 0x6f, 0x72, + 0x42, 0x07, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x42, 0x0a, 0x1b, 0x53, 0x74, 0x61, + 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x23, 0x0a, 0x0d, 0x65, 0x72, 0x72, 0x6f, + 0x72, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0c, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x3e, 0x0a, + 0x17, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x23, 0x0a, 0x0d, 0x65, 0x72, 0x72, 0x6f, + 0x72, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0c, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x3d, 0x0a, + 0x16, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, + 0x6f, 0x6e, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x23, 0x0a, 0x0d, 0x65, 0x72, 0x72, 0x6f, 0x72, + 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, + 0x65, 0x72, 0x72, 0x6f, 0x72, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x92, 0x01, 0x0a, + 0x13, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x52, 0x75, 0x6e, 0x50, 0x72, 0x6f, 0x67, + 0x72, 0x65, 0x73, 0x73, 0x12, 0x2a, 0x0a, 0x11, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, + 0x73, 0x74, 0x65, 0x70, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, + 0x0f, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x65, 0x70, 0x49, 0x6e, 0x66, 0x6f, + 0x12, 0x1f, 0x0a, 0x0b, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x73, 0x74, 0x65, 0x70, 0x73, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x53, 0x74, 0x65, 0x70, + 0x73, 0x12, 0x2e, 0x0a, 0x13, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x74, 0x65, + 0x70, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x11, + 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x65, 0x70, 0x4e, 0x75, 0x6d, 0x62, 0x65, + 0x72, 0x22, 0x8e, 0x01, 0x0a, 0x18, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x52, 0x75, + 0x6e, 0x46, 0x69, 0x6e, 0x69, 0x73, 0x68, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x2a, + 0x0a, 0x11, 0x69, 0x73, 0x5f, 0x72, 0x75, 0x6e, 0x5f, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, + 0x66, 0x75, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, 0x69, 0x73, 0x52, 0x75, 0x6e, + 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x66, 0x75, 0x6c, 0x12, 0x30, 0x0a, 0x11, 0x73, 0x65, + 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x5f, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x10, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, + 0x7a, 0x65, 0x64, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x88, 0x01, 0x01, 0x42, 0x14, 0x0a, 0x12, + 0x5f, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x5f, 0x6f, 0x75, 0x74, 0x70, + 0x75, 0x74, 0x22, 0xc5, 0x01, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, + 0x65, 0x73, 0x41, 0x72, 0x67, 0x73, 0x12, 0x6b, 0x0a, 0x13, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, + 0x65, 0x5f, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, - 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x53, 0x65, 0x72, 0x76, - 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0b, 0x73, 0x65, - 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x1a, 0x5e, 0x0a, 0x10, 0x53, 0x65, 0x72, - 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, - 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, - 0x34, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, - 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, - 0x70, 0x69, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x72, 0x0a, 0x12, 0x53, 0x65, 0x72, - 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x73, 0x12, - 0x21, 0x0a, 0x0c, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x75, 0x75, 0x69, 0x64, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x55, 0x75, - 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x65, - 0x6e, 0x65, 0x64, 0x5f, 0x75, 0x75, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, - 0x73, 0x68, 0x6f, 0x72, 0x74, 0x65, 0x6e, 0x65, 0x64, 0x55, 0x75, 0x69, 0x64, 0x22, 0x83, 0x01, - 0x0a, 0x32, 0x47, 0x65, 0x74, 0x45, 0x78, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x41, 0x6e, 0x64, - 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x69, 0x63, 0x61, 0x6c, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, - 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4d, 0x0a, 0x0e, 0x61, 0x6c, 0x6c, 0x49, 0x64, 0x65, 0x6e, 0x74, - 0x69, 0x66, 0x69, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x61, - 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, - 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, - 0x65, 0x72, 0x73, 0x52, 0x0e, 0x61, 0x6c, 0x6c, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, - 0x65, 0x72, 0x73, 0x22, 0x63, 0x0a, 0x0f, 0x45, 0x78, 0x65, 0x63, 0x43, 0x6f, 0x6d, 0x6d, 0x61, - 0x6e, 0x64, 0x41, 0x72, 0x67, 0x73, 0x12, 0x2d, 0x0a, 0x12, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, - 0x65, 0x5f, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x11, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, - 0x69, 0x66, 0x69, 0x65, 0x72, 0x12, 0x21, 0x0a, 0x0c, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, - 0x5f, 0x61, 0x72, 0x67, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x6f, 0x6d, - 0x6d, 0x61, 0x6e, 0x64, 0x41, 0x72, 0x67, 0x73, 0x22, 0x51, 0x0a, 0x13, 0x45, 0x78, 0x65, 0x63, - 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x1b, 0x0a, 0x09, 0x65, 0x78, 0x69, 0x74, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x05, 0x52, 0x08, 0x65, 0x78, 0x69, 0x74, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x1d, 0x0a, 0x0a, - 0x6c, 0x6f, 0x67, 0x5f, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x09, 0x6c, 0x6f, 0x67, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0xac, 0x03, 0x0a, 0x26, - 0x57, 0x61, 0x69, 0x74, 0x46, 0x6f, 0x72, 0x48, 0x74, 0x74, 0x70, 0x47, 0x65, 0x74, 0x45, 0x6e, - 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x69, 0x6c, 0x69, - 0x74, 0x79, 0x41, 0x72, 0x67, 0x73, 0x12, 0x2d, 0x0a, 0x12, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, - 0x65, 0x5f, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x11, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, - 0x69, 0x66, 0x69, 0x65, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x0d, 0x52, 0x04, 0x70, 0x6f, 0x72, 0x74, 0x12, 0x17, 0x0a, 0x04, 0x70, 0x61, 0x74, - 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x88, - 0x01, 0x01, 0x12, 0x41, 0x0a, 0x1a, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x5f, 0x64, 0x65, - 0x6c, 0x61, 0x79, 0x5f, 0x6d, 0x69, 0x6c, 0x6c, 0x69, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x48, 0x01, 0x52, 0x18, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, - 0x6c, 0x44, 0x65, 0x6c, 0x61, 0x79, 0x4d, 0x69, 0x6c, 0x6c, 0x69, 0x73, 0x65, 0x63, 0x6f, 0x6e, - 0x64, 0x73, 0x88, 0x01, 0x01, 0x12, 0x1d, 0x0a, 0x07, 0x72, 0x65, 0x74, 0x72, 0x69, 0x65, 0x73, - 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x48, 0x02, 0x52, 0x07, 0x72, 0x65, 0x74, 0x72, 0x69, 0x65, - 0x73, 0x88, 0x01, 0x01, 0x12, 0x41, 0x0a, 0x1a, 0x72, 0x65, 0x74, 0x72, 0x69, 0x65, 0x73, 0x5f, - 0x64, 0x65, 0x6c, 0x61, 0x79, 0x5f, 0x6d, 0x69, 0x6c, 0x6c, 0x69, 0x73, 0x65, 0x63, 0x6f, 0x6e, - 0x64, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0d, 0x48, 0x03, 0x52, 0x18, 0x72, 0x65, 0x74, 0x72, - 0x69, 0x65, 0x73, 0x44, 0x65, 0x6c, 0x61, 0x79, 0x4d, 0x69, 0x6c, 0x6c, 0x69, 0x73, 0x65, 0x63, - 0x6f, 0x6e, 0x64, 0x73, 0x88, 0x01, 0x01, 0x12, 0x20, 0x0a, 0x09, 0x62, 0x6f, 0x64, 0x79, 0x5f, - 0x74, 0x65, 0x78, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x48, 0x04, 0x52, 0x08, 0x62, 0x6f, - 0x64, 0x79, 0x54, 0x65, 0x78, 0x74, 0x88, 0x01, 0x01, 0x42, 0x07, 0x0a, 0x05, 0x5f, 0x70, 0x61, - 0x74, 0x68, 0x42, 0x1d, 0x0a, 0x1b, 0x5f, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x5f, 0x64, + 0x63, 0x65, 0x73, 0x41, 0x72, 0x67, 0x73, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, + 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, + 0x12, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, + 0x65, 0x72, 0x73, 0x1a, 0x45, 0x0a, 0x17, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, + 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, + 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, + 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xd1, 0x01, 0x0a, 0x13, 0x47, + 0x65, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x5a, 0x0a, 0x0c, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, 0x6e, + 0x66, 0x6f, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x37, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, + 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, + 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x52, 0x0b, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x1a, 0x5e, + 0x0a, 0x10, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x03, 0x6b, 0x65, 0x79, 0x12, 0x34, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, + 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, + 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x72, + 0x0a, 0x12, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, + 0x69, 0x65, 0x72, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, + 0x75, 0x75, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x73, 0x65, 0x72, 0x76, + 0x69, 0x63, 0x65, 0x55, 0x75, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x73, + 0x68, 0x6f, 0x72, 0x74, 0x65, 0x6e, 0x65, 0x64, 0x5f, 0x75, 0x75, 0x69, 0x64, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0d, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x65, 0x6e, 0x65, 0x64, 0x55, 0x75, + 0x69, 0x64, 0x22, 0x83, 0x01, 0x0a, 0x32, 0x47, 0x65, 0x74, 0x45, 0x78, 0x69, 0x73, 0x74, 0x69, + 0x6e, 0x67, 0x41, 0x6e, 0x64, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x69, 0x63, 0x61, 0x6c, 0x53, + 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, + 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4d, 0x0a, 0x0e, 0x61, 0x6c, 0x6c, + 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x25, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, + 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x65, + 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x73, 0x52, 0x0e, 0x61, 0x6c, 0x6c, 0x49, 0x64, 0x65, + 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x73, 0x22, 0x63, 0x0a, 0x0f, 0x45, 0x78, 0x65, 0x63, + 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x41, 0x72, 0x67, 0x73, 0x12, 0x2d, 0x0a, 0x12, 0x73, + 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, + 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, + 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x12, 0x21, 0x0a, 0x0c, 0x63, 0x6f, + 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x5f, 0x61, 0x72, 0x67, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, + 0x52, 0x0b, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x41, 0x72, 0x67, 0x73, 0x22, 0x51, 0x0a, + 0x13, 0x45, 0x78, 0x65, 0x63, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x65, 0x78, 0x69, 0x74, 0x5f, 0x63, 0x6f, 0x64, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x65, 0x78, 0x69, 0x74, 0x43, 0x6f, 0x64, + 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x6c, 0x6f, 0x67, 0x5f, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6c, 0x6f, 0x67, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, + 0x22, 0xac, 0x03, 0x0a, 0x26, 0x57, 0x61, 0x69, 0x74, 0x46, 0x6f, 0x72, 0x48, 0x74, 0x74, 0x70, + 0x47, 0x65, 0x74, 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x41, 0x76, 0x61, 0x69, 0x6c, + 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x41, 0x72, 0x67, 0x73, 0x12, 0x2d, 0x0a, 0x12, 0x73, + 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, + 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, + 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x6f, + 0x72, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x70, 0x6f, 0x72, 0x74, 0x12, 0x17, + 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x04, + 0x70, 0x61, 0x74, 0x68, 0x88, 0x01, 0x01, 0x12, 0x41, 0x0a, 0x1a, 0x69, 0x6e, 0x69, 0x74, 0x69, + 0x61, 0x6c, 0x5f, 0x64, 0x65, 0x6c, 0x61, 0x79, 0x5f, 0x6d, 0x69, 0x6c, 0x6c, 0x69, 0x73, 0x65, + 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x48, 0x01, 0x52, 0x18, 0x69, + 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x44, 0x65, 0x6c, 0x61, 0x79, 0x4d, 0x69, 0x6c, 0x6c, 0x69, + 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x88, 0x01, 0x01, 0x12, 0x1d, 0x0a, 0x07, 0x72, 0x65, + 0x74, 0x72, 0x69, 0x65, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x48, 0x02, 0x52, 0x07, 0x72, + 0x65, 0x74, 0x72, 0x69, 0x65, 0x73, 0x88, 0x01, 0x01, 0x12, 0x41, 0x0a, 0x1a, 0x72, 0x65, 0x74, + 0x72, 0x69, 0x65, 0x73, 0x5f, 0x64, 0x65, 0x6c, 0x61, 0x79, 0x5f, 0x6d, 0x69, 0x6c, 0x6c, 0x69, + 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0d, 0x48, 0x03, 0x52, + 0x18, 0x72, 0x65, 0x74, 0x72, 0x69, 0x65, 0x73, 0x44, 0x65, 0x6c, 0x61, 0x79, 0x4d, 0x69, 0x6c, + 0x6c, 0x69, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x88, 0x01, 0x01, 0x12, 0x20, 0x0a, 0x09, + 0x62, 0x6f, 0x64, 0x79, 0x5f, 0x74, 0x65, 0x78, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x48, + 0x04, 0x52, 0x08, 0x62, 0x6f, 0x64, 0x79, 0x54, 0x65, 0x78, 0x74, 0x88, 0x01, 0x01, 0x42, 0x07, + 0x0a, 0x05, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x42, 0x1d, 0x0a, 0x1b, 0x5f, 0x69, 0x6e, 0x69, 0x74, + 0x69, 0x61, 0x6c, 0x5f, 0x64, 0x65, 0x6c, 0x61, 0x79, 0x5f, 0x6d, 0x69, 0x6c, 0x6c, 0x69, 0x73, + 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x42, 0x0a, 0x0a, 0x08, 0x5f, 0x72, 0x65, 0x74, 0x72, 0x69, + 0x65, 0x73, 0x42, 0x1d, 0x0a, 0x1b, 0x5f, 0x72, 0x65, 0x74, 0x72, 0x69, 0x65, 0x73, 0x5f, 0x64, 0x65, 0x6c, 0x61, 0x79, 0x5f, 0x6d, 0x69, 0x6c, 0x6c, 0x69, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, - 0x73, 0x42, 0x0a, 0x0a, 0x08, 0x5f, 0x72, 0x65, 0x74, 0x72, 0x69, 0x65, 0x73, 0x42, 0x1d, 0x0a, - 0x1b, 0x5f, 0x72, 0x65, 0x74, 0x72, 0x69, 0x65, 0x73, 0x5f, 0x64, 0x65, 0x6c, 0x61, 0x79, 0x5f, - 0x6d, 0x69, 0x6c, 0x6c, 0x69, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x42, 0x0c, 0x0a, 0x0a, - 0x5f, 0x62, 0x6f, 0x64, 0x79, 0x5f, 0x74, 0x65, 0x78, 0x74, 0x22, 0xe6, 0x03, 0x0a, 0x27, 0x57, - 0x61, 0x69, 0x74, 0x46, 0x6f, 0x72, 0x48, 0x74, 0x74, 0x70, 0x50, 0x6f, 0x73, 0x74, 0x45, 0x6e, - 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x69, 0x6c, 0x69, - 0x74, 0x79, 0x41, 0x72, 0x67, 0x73, 0x12, 0x2d, 0x0a, 0x12, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, - 0x65, 0x5f, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x11, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, - 0x69, 0x66, 0x69, 0x65, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x0d, 0x52, 0x04, 0x70, 0x6f, 0x72, 0x74, 0x12, 0x17, 0x0a, 0x04, 0x70, 0x61, 0x74, - 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x88, - 0x01, 0x01, 0x12, 0x26, 0x0a, 0x0c, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x62, 0x6f, - 0x64, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x0b, 0x72, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x42, 0x6f, 0x64, 0x79, 0x88, 0x01, 0x01, 0x12, 0x41, 0x0a, 0x1a, 0x69, 0x6e, - 0x69, 0x74, 0x69, 0x61, 0x6c, 0x5f, 0x64, 0x65, 0x6c, 0x61, 0x79, 0x5f, 0x6d, 0x69, 0x6c, 0x6c, - 0x69, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x48, 0x02, - 0x52, 0x18, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x44, 0x65, 0x6c, 0x61, 0x79, 0x4d, 0x69, - 0x6c, 0x6c, 0x69, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x88, 0x01, 0x01, 0x12, 0x1d, 0x0a, - 0x07, 0x72, 0x65, 0x74, 0x72, 0x69, 0x65, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0d, 0x48, 0x03, - 0x52, 0x07, 0x72, 0x65, 0x74, 0x72, 0x69, 0x65, 0x73, 0x88, 0x01, 0x01, 0x12, 0x41, 0x0a, 0x1a, + 0x73, 0x42, 0x0c, 0x0a, 0x0a, 0x5f, 0x62, 0x6f, 0x64, 0x79, 0x5f, 0x74, 0x65, 0x78, 0x74, 0x22, + 0xe6, 0x03, 0x0a, 0x27, 0x57, 0x61, 0x69, 0x74, 0x46, 0x6f, 0x72, 0x48, 0x74, 0x74, 0x70, 0x50, + 0x6f, 0x73, 0x74, 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x41, 0x76, 0x61, 0x69, 0x6c, + 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x41, 0x72, 0x67, 0x73, 0x12, 0x2d, 0x0a, 0x12, 0x73, + 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, + 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, + 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x6f, + 0x72, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x70, 0x6f, 0x72, 0x74, 0x12, 0x17, + 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x04, + 0x70, 0x61, 0x74, 0x68, 0x88, 0x01, 0x01, 0x12, 0x26, 0x0a, 0x0c, 0x72, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x5f, 0x62, 0x6f, 0x64, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, + 0x0b, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x42, 0x6f, 0x64, 0x79, 0x88, 0x01, 0x01, 0x12, + 0x41, 0x0a, 0x1a, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x5f, 0x64, 0x65, 0x6c, 0x61, 0x79, + 0x5f, 0x6d, 0x69, 0x6c, 0x6c, 0x69, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x0d, 0x48, 0x02, 0x52, 0x18, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x44, 0x65, + 0x6c, 0x61, 0x79, 0x4d, 0x69, 0x6c, 0x6c, 0x69, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x88, + 0x01, 0x01, 0x12, 0x1d, 0x0a, 0x07, 0x72, 0x65, 0x74, 0x72, 0x69, 0x65, 0x73, 0x18, 0x06, 0x20, + 0x01, 0x28, 0x0d, 0x48, 0x03, 0x52, 0x07, 0x72, 0x65, 0x74, 0x72, 0x69, 0x65, 0x73, 0x88, 0x01, + 0x01, 0x12, 0x41, 0x0a, 0x1a, 0x72, 0x65, 0x74, 0x72, 0x69, 0x65, 0x73, 0x5f, 0x64, 0x65, 0x6c, + 0x61, 0x79, 0x5f, 0x6d, 0x69, 0x6c, 0x6c, 0x69, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x18, + 0x07, 0x20, 0x01, 0x28, 0x0d, 0x48, 0x04, 0x52, 0x18, 0x72, 0x65, 0x74, 0x72, 0x69, 0x65, 0x73, + 0x44, 0x65, 0x6c, 0x61, 0x79, 0x4d, 0x69, 0x6c, 0x6c, 0x69, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, + 0x73, 0x88, 0x01, 0x01, 0x12, 0x20, 0x0a, 0x09, 0x62, 0x6f, 0x64, 0x79, 0x5f, 0x74, 0x65, 0x78, + 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x48, 0x05, 0x52, 0x08, 0x62, 0x6f, 0x64, 0x79, 0x54, + 0x65, 0x78, 0x74, 0x88, 0x01, 0x01, 0x42, 0x07, 0x0a, 0x05, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x42, + 0x0f, 0x0a, 0x0d, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x62, 0x6f, 0x64, 0x79, + 0x42, 0x1d, 0x0a, 0x1b, 0x5f, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x5f, 0x64, 0x65, 0x6c, + 0x61, 0x79, 0x5f, 0x6d, 0x69, 0x6c, 0x6c, 0x69, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x42, + 0x0a, 0x0a, 0x08, 0x5f, 0x72, 0x65, 0x74, 0x72, 0x69, 0x65, 0x73, 0x42, 0x1d, 0x0a, 0x1b, 0x5f, 0x72, 0x65, 0x74, 0x72, 0x69, 0x65, 0x73, 0x5f, 0x64, 0x65, 0x6c, 0x61, 0x79, 0x5f, 0x6d, 0x69, - 0x6c, 0x6c, 0x69, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0d, - 0x48, 0x04, 0x52, 0x18, 0x72, 0x65, 0x74, 0x72, 0x69, 0x65, 0x73, 0x44, 0x65, 0x6c, 0x61, 0x79, - 0x4d, 0x69, 0x6c, 0x6c, 0x69, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x88, 0x01, 0x01, 0x12, - 0x20, 0x0a, 0x09, 0x62, 0x6f, 0x64, 0x79, 0x5f, 0x74, 0x65, 0x78, 0x74, 0x18, 0x08, 0x20, 0x01, - 0x28, 0x09, 0x48, 0x05, 0x52, 0x08, 0x62, 0x6f, 0x64, 0x79, 0x54, 0x65, 0x78, 0x74, 0x88, 0x01, - 0x01, 0x42, 0x07, 0x0a, 0x05, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x42, 0x0f, 0x0a, 0x0d, 0x5f, 0x72, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x62, 0x6f, 0x64, 0x79, 0x42, 0x1d, 0x0a, 0x1b, 0x5f, - 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x5f, 0x64, 0x65, 0x6c, 0x61, 0x79, 0x5f, 0x6d, 0x69, - 0x6c, 0x6c, 0x69, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x42, 0x0a, 0x0a, 0x08, 0x5f, 0x72, - 0x65, 0x74, 0x72, 0x69, 0x65, 0x73, 0x42, 0x1d, 0x0a, 0x1b, 0x5f, 0x72, 0x65, 0x74, 0x72, 0x69, - 0x65, 0x73, 0x5f, 0x64, 0x65, 0x6c, 0x61, 0x79, 0x5f, 0x6d, 0x69, 0x6c, 0x6c, 0x69, 0x73, 0x65, - 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x42, 0x0c, 0x0a, 0x0a, 0x5f, 0x62, 0x6f, 0x64, 0x79, 0x5f, 0x74, - 0x65, 0x78, 0x74, 0x22, 0x99, 0x01, 0x0a, 0x11, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x65, 0x64, - 0x44, 0x61, 0x74, 0x61, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, - 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x12, 0x2e, 0x0a, - 0x13, 0x70, 0x72, 0x65, 0x76, 0x69, 0x6f, 0x75, 0x73, 0x5f, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x5f, - 0x68, 0x61, 0x73, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x70, 0x72, 0x65, 0x76, - 0x69, 0x6f, 0x75, 0x73, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x48, 0x61, 0x73, 0x68, 0x12, 0x40, 0x0a, - 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x24, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, - 0x61, 0x70, 0x69, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x4d, 0x65, 0x74, - 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x22, - 0x27, 0x0a, 0x11, 0x44, 0x61, 0x74, 0x61, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x4d, 0x65, 0x74, 0x61, - 0x64, 0x61, 0x74, 0x61, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x45, 0x0a, 0x1b, 0x55, 0x70, 0x6c, 0x6f, - 0x61, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x75, 0x75, 0x69, 0x64, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x75, 0x75, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, - 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, - 0x3b, 0x0a, 0x19, 0x44, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x73, - 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x41, 0x72, 0x67, 0x73, 0x12, 0x1e, 0x0a, 0x0a, - 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0a, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x22, 0x41, 0x0a, 0x19, - 0x53, 0x74, 0x6f, 0x72, 0x65, 0x57, 0x65, 0x62, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x72, 0x74, - 0x69, 0x66, 0x61, 0x63, 0x74, 0x41, 0x72, 0x67, 0x73, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x72, 0x6c, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x72, 0x6c, 0x12, 0x12, 0x0a, 0x04, 0x6e, - 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, - 0x33, 0x0a, 0x1d, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x57, 0x65, 0x62, 0x46, 0x69, 0x6c, 0x65, 0x73, - 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x12, 0x0a, 0x04, 0x75, 0x75, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, - 0x75, 0x75, 0x69, 0x64, 0x22, 0x87, 0x01, 0x0a, 0x21, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x46, 0x69, - 0x6c, 0x65, 0x73, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x46, 0x72, 0x6f, 0x6d, 0x53, - 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x41, 0x72, 0x67, 0x73, 0x12, 0x2d, 0x0a, 0x12, 0x73, 0x65, - 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, - 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x6f, 0x75, - 0x72, 0x63, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, - 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x50, 0x61, 0x74, 0x68, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, - 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3b, - 0x0a, 0x25, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x72, 0x74, 0x69, - 0x66, 0x61, 0x63, 0x74, 0x46, 0x72, 0x6f, 0x6d, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x75, 0x75, 0x69, 0x64, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x75, 0x75, 0x69, 0x64, 0x22, 0x52, 0x0a, 0x18, 0x46, - 0x69, 0x6c, 0x65, 0x73, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x4e, 0x61, 0x6d, 0x65, - 0x41, 0x6e, 0x64, 0x55, 0x75, 0x69, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x4e, - 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x4e, - 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x55, 0x75, 0x69, 0x64, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x55, 0x75, 0x69, 0x64, 0x22, - 0x86, 0x01, 0x0a, 0x26, 0x4c, 0x69, 0x73, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x72, 0x74, - 0x69, 0x66, 0x61, 0x63, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x41, 0x6e, 0x64, 0x55, 0x75, 0x69, - 0x64, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x5c, 0x0a, 0x14, 0x66, 0x69, - 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x5f, 0x61, 0x6e, 0x64, 0x5f, 0x75, 0x75, 0x69, - 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, - 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x46, 0x69, 0x6c, - 0x65, 0x73, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x41, 0x6e, - 0x64, 0x55, 0x75, 0x69, 0x64, 0x52, 0x11, 0x66, 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x73, - 0x41, 0x6e, 0x64, 0x55, 0x75, 0x69, 0x64, 0x73, 0x22, 0x81, 0x01, 0x0a, 0x23, 0x49, 0x6e, 0x73, - 0x70, 0x65, 0x63, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, - 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x5a, 0x0a, 0x13, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x5f, 0x61, - 0x6e, 0x64, 0x5f, 0x75, 0x75, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2b, 0x2e, + 0x6c, 0x6c, 0x69, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x42, 0x0c, 0x0a, 0x0a, 0x5f, 0x62, + 0x6f, 0x64, 0x79, 0x5f, 0x74, 0x65, 0x78, 0x74, 0x22, 0x99, 0x01, 0x0a, 0x11, 0x53, 0x74, 0x72, + 0x65, 0x61, 0x6d, 0x65, 0x64, 0x44, 0x61, 0x74, 0x61, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x12, 0x12, + 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x64, 0x61, + 0x74, 0x61, 0x12, 0x2e, 0x0a, 0x13, 0x70, 0x72, 0x65, 0x76, 0x69, 0x6f, 0x75, 0x73, 0x5f, 0x63, + 0x68, 0x75, 0x6e, 0x6b, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x11, 0x70, 0x72, 0x65, 0x76, 0x69, 0x6f, 0x75, 0x73, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x48, 0x61, + 0x73, 0x68, 0x12, 0x40, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, + 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x43, 0x68, 0x75, + 0x6e, 0x6b, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, + 0x64, 0x61, 0x74, 0x61, 0x22, 0x27, 0x0a, 0x11, 0x44, 0x61, 0x74, 0x61, 0x43, 0x68, 0x75, 0x6e, + 0x6b, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x45, 0x0a, + 0x1b, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x72, 0x74, 0x69, + 0x66, 0x61, 0x63, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x12, 0x0a, 0x04, + 0x75, 0x75, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x75, 0x75, 0x69, 0x64, + 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, + 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3b, 0x0a, 0x19, 0x44, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, + 0x46, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x41, 0x72, 0x67, + 0x73, 0x12, 0x1e, 0x0a, 0x0a, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, + 0x72, 0x22, 0x41, 0x0a, 0x19, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x57, 0x65, 0x62, 0x46, 0x69, 0x6c, + 0x65, 0x73, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x41, 0x72, 0x67, 0x73, 0x12, 0x10, + 0x0a, 0x03, 0x75, 0x72, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x72, 0x6c, + 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, + 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x33, 0x0a, 0x1d, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x57, 0x65, 0x62, + 0x46, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x75, 0x75, 0x69, 0x64, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x04, 0x75, 0x75, 0x69, 0x64, 0x22, 0x87, 0x01, 0x0a, 0x21, 0x53, 0x74, + 0x6f, 0x72, 0x65, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, + 0x46, 0x72, 0x6f, 0x6d, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x41, 0x72, 0x67, 0x73, 0x12, + 0x2d, 0x0a, 0x12, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x65, 0x6e, 0x74, + 0x69, 0x66, 0x69, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x73, 0x65, 0x72, + 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x12, 0x1f, + 0x0a, 0x0b, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0a, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x50, 0x61, 0x74, 0x68, 0x12, + 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, + 0x61, 0x6d, 0x65, 0x22, 0x3b, 0x0a, 0x25, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x46, 0x69, 0x6c, 0x65, + 0x73, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x46, 0x72, 0x6f, 0x6d, 0x53, 0x65, 0x72, + 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x12, 0x0a, 0x04, + 0x75, 0x75, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x75, 0x75, 0x69, 0x64, + 0x22, 0x52, 0x0a, 0x18, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, + 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x41, 0x6e, 0x64, 0x55, 0x75, 0x69, 0x64, 0x12, 0x1a, 0x0a, 0x08, + 0x66, 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, + 0x66, 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x66, 0x69, 0x6c, 0x65, + 0x55, 0x75, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x66, 0x69, 0x6c, 0x65, + 0x55, 0x75, 0x69, 0x64, 0x22, 0x86, 0x01, 0x0a, 0x26, 0x4c, 0x69, 0x73, 0x74, 0x46, 0x69, 0x6c, + 0x65, 0x73, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x41, + 0x6e, 0x64, 0x55, 0x75, 0x69, 0x64, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x5c, 0x0a, 0x14, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x5f, 0x61, 0x6e, + 0x64, 0x5f, 0x75, 0x75, 0x69, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x4e, - 0x61, 0x6d, 0x65, 0x41, 0x6e, 0x64, 0x55, 0x75, 0x69, 0x64, 0x52, 0x10, 0x66, 0x69, 0x6c, 0x65, - 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x41, 0x6e, 0x64, 0x55, 0x75, 0x69, 0x64, 0x22, 0x8b, 0x01, 0x0a, - 0x24, 0x49, 0x6e, 0x73, 0x70, 0x65, 0x63, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x72, 0x74, - 0x69, 0x66, 0x61, 0x63, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x63, 0x0a, 0x11, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x64, 0x65, - 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x36, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, - 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, - 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x46, 0x69, 0x6c, 0x65, 0x44, 0x65, 0x73, - 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x10, 0x66, 0x69, 0x6c, 0x65, 0x44, 0x65, - 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x86, 0x01, 0x0a, 0x23, 0x46, - 0x69, 0x6c, 0x65, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x65, - 0x6e, 0x74, 0x73, 0x46, 0x69, 0x6c, 0x65, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, - 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x04, 0x52, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x12, 0x26, 0x0a, 0x0c, 0x74, 0x65, - 0x78, 0x74, 0x5f, 0x70, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, - 0x48, 0x00, 0x52, 0x0b, 0x74, 0x65, 0x78, 0x74, 0x50, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x88, - 0x01, 0x01, 0x42, 0x0f, 0x0a, 0x0d, 0x5f, 0x74, 0x65, 0x78, 0x74, 0x5f, 0x70, 0x72, 0x65, 0x76, - 0x69, 0x65, 0x77, 0x22, 0x4b, 0x0a, 0x13, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x53, 0x65, - 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x41, 0x72, 0x67, 0x73, 0x12, 0x34, 0x0a, 0x07, 0x63, 0x6f, - 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1a, 0x2e, 0x61, 0x70, - 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, - 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, - 0x22, 0x19, 0x0a, 0x17, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, - 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xa2, 0x04, 0x0a, 0x16, - 0x47, 0x65, 0x74, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x52, 0x75, 0x6e, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, - 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x70, 0x61, 0x63, 0x6b, - 0x61, 0x67, 0x65, 0x49, 0x64, 0x12, 0x2b, 0x0a, 0x11, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, - 0x7a, 0x65, 0x64, 0x5f, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x10, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x53, 0x63, 0x72, 0x69, - 0x70, 0x74, 0x12, 0x2b, 0x0a, 0x11, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, - 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x73, - 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, - 0x20, 0x0a, 0x0b, 0x70, 0x61, 0x72, 0x61, 0x6c, 0x6c, 0x65, 0x6c, 0x69, 0x73, 0x6d, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x05, 0x52, 0x0b, 0x70, 0x61, 0x72, 0x61, 0x6c, 0x6c, 0x65, 0x6c, 0x69, 0x73, - 0x6d, 0x12, 0x3a, 0x0a, 0x1a, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x70, 0x61, - 0x74, 0x68, 0x5f, 0x74, 0x6f, 0x5f, 0x6d, 0x61, 0x69, 0x6e, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x18, - 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x16, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x76, 0x65, 0x50, - 0x61, 0x74, 0x68, 0x54, 0x6f, 0x4d, 0x61, 0x69, 0x6e, 0x46, 0x69, 0x6c, 0x65, 0x12, 0x2c, 0x0a, - 0x12, 0x6d, 0x61, 0x69, 0x6e, 0x5f, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, - 0x61, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x6d, 0x61, 0x69, 0x6e, 0x46, - 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x5b, 0x0a, 0x15, 0x65, - 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x5f, 0x66, 0x65, 0x61, 0x74, - 0x75, 0x72, 0x65, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x26, 0x2e, 0x61, 0x70, 0x69, - 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x4b, - 0x75, 0x72, 0x74, 0x6f, 0x73, 0x69, 0x73, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x46, 0x6c, - 0x61, 0x67, 0x52, 0x14, 0x65, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x6c, - 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x12, 0x47, 0x0a, 0x0e, 0x72, 0x65, 0x73, 0x74, - 0x61, 0x72, 0x74, 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0e, - 0x32, 0x20, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, - 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x65, 0x73, 0x74, 0x61, 0x72, 0x74, 0x50, 0x6f, 0x6c, 0x69, - 0x63, 0x79, 0x52, 0x0d, 0x72, 0x65, 0x73, 0x74, 0x61, 0x72, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, - 0x79, 0x12, 0x3f, 0x0a, 0x19, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x5f, 0x73, 0x65, 0x72, - 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x09, - 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x17, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x53, - 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x88, - 0x01, 0x01, 0x42, 0x1c, 0x0a, 0x1a, 0x5f, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x5f, 0x73, - 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, - 0x22, 0x27, 0x0a, 0x08, 0x50, 0x6c, 0x61, 0x6e, 0x59, 0x61, 0x6d, 0x6c, 0x12, 0x1b, 0x0a, 0x09, - 0x70, 0x6c, 0x61, 0x6e, 0x5f, 0x79, 0x61, 0x6d, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x08, 0x70, 0x6c, 0x61, 0x6e, 0x59, 0x61, 0x6d, 0x6c, 0x22, 0xdb, 0x01, 0x0a, 0x1a, 0x53, 0x74, - 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, 0x50, 0x6c, 0x61, 0x6e, - 0x59, 0x61, 0x6d, 0x6c, 0x41, 0x72, 0x67, 0x73, 0x12, 0x2b, 0x0a, 0x11, 0x73, 0x65, 0x72, 0x69, - 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x5f, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x10, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x53, - 0x63, 0x72, 0x69, 0x70, 0x74, 0x12, 0x30, 0x0a, 0x11, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, - 0x7a, 0x65, 0x64, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x48, 0x00, 0x52, 0x10, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x50, 0x61, - 0x72, 0x61, 0x6d, 0x73, 0x88, 0x01, 0x01, 0x12, 0x31, 0x0a, 0x12, 0x6d, 0x61, 0x69, 0x6e, 0x5f, - 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, - 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x10, 0x6d, 0x61, 0x69, 0x6e, 0x46, 0x75, 0x6e, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x88, 0x01, 0x01, 0x42, 0x14, 0x0a, 0x12, 0x5f, 0x73, + 0x61, 0x6d, 0x65, 0x41, 0x6e, 0x64, 0x55, 0x75, 0x69, 0x64, 0x52, 0x11, 0x66, 0x69, 0x6c, 0x65, + 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x41, 0x6e, 0x64, 0x55, 0x75, 0x69, 0x64, 0x73, 0x22, 0x81, 0x01, + 0x0a, 0x23, 0x49, 0x6e, 0x73, 0x70, 0x65, 0x63, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x72, + 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x5a, 0x0a, 0x13, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x6e, 0x61, + 0x6d, 0x65, 0x73, 0x5f, 0x61, 0x6e, 0x64, 0x5f, 0x75, 0x75, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, + 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x72, 0x74, 0x69, + 0x66, 0x61, 0x63, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x41, 0x6e, 0x64, 0x55, 0x75, 0x69, 0x64, 0x52, + 0x10, 0x66, 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x41, 0x6e, 0x64, 0x55, 0x75, 0x69, + 0x64, 0x22, 0x8b, 0x01, 0x0a, 0x24, 0x49, 0x6e, 0x73, 0x70, 0x65, 0x63, 0x74, 0x46, 0x69, 0x6c, + 0x65, 0x73, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, + 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x63, 0x0a, 0x11, 0x66, 0x69, + 0x6c, 0x65, 0x5f, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, + 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x36, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, + 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x41, 0x72, + 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x46, 0x69, + 0x6c, 0x65, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x10, 0x66, + 0x69, 0x6c, 0x65, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, + 0x86, 0x01, 0x0a, 0x23, 0x46, 0x69, 0x6c, 0x65, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, + 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x46, 0x69, 0x6c, 0x65, 0x44, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x12, 0x12, 0x0a, 0x04, 0x73, + 0x69, 0x7a, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x12, + 0x26, 0x0a, 0x0c, 0x74, 0x65, 0x78, 0x74, 0x5f, 0x70, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0b, 0x74, 0x65, 0x78, 0x74, 0x50, 0x72, 0x65, + 0x76, 0x69, 0x65, 0x77, 0x88, 0x01, 0x01, 0x42, 0x0f, 0x0a, 0x0d, 0x5f, 0x74, 0x65, 0x78, 0x74, + 0x5f, 0x70, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x22, 0x4b, 0x0a, 0x13, 0x43, 0x6f, 0x6e, 0x6e, + 0x65, 0x63, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x41, 0x72, 0x67, 0x73, 0x12, + 0x34, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, + 0x32, 0x1a, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, + 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x52, 0x07, 0x63, 0x6f, + 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x22, 0x19, 0x0a, 0x17, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, + 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0xa2, 0x04, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, + 0x52, 0x75, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x70, + 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x09, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x49, 0x64, 0x12, 0x2b, 0x0a, 0x11, 0x73, 0x65, + 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x5f, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, + 0x64, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, 0x12, 0x2b, 0x0a, 0x11, 0x73, 0x65, 0x72, 0x69, 0x61, + 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x10, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x50, 0x61, + 0x72, 0x61, 0x6d, 0x73, 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x61, 0x72, 0x61, 0x6c, 0x6c, 0x65, 0x6c, + 0x69, 0x73, 0x6d, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0b, 0x70, 0x61, 0x72, 0x61, 0x6c, + 0x6c, 0x65, 0x6c, 0x69, 0x73, 0x6d, 0x12, 0x3a, 0x0a, 0x1a, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, + 0x76, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x5f, 0x74, 0x6f, 0x5f, 0x6d, 0x61, 0x69, 0x6e, 0x5f, + 0x66, 0x69, 0x6c, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x16, 0x72, 0x65, 0x6c, 0x61, + 0x74, 0x69, 0x76, 0x65, 0x50, 0x61, 0x74, 0x68, 0x54, 0x6f, 0x4d, 0x61, 0x69, 0x6e, 0x46, 0x69, + 0x6c, 0x65, 0x12, 0x2c, 0x0a, 0x12, 0x6d, 0x61, 0x69, 0x6e, 0x5f, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, + 0x6d, 0x61, 0x69, 0x6e, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, + 0x12, 0x5b, 0x0a, 0x15, 0x65, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x6c, + 0x5f, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0e, 0x32, + 0x26, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, + 0x61, 0x70, 0x69, 0x2e, 0x4b, 0x75, 0x72, 0x74, 0x6f, 0x73, 0x69, 0x73, 0x46, 0x65, 0x61, 0x74, + 0x75, 0x72, 0x65, 0x46, 0x6c, 0x61, 0x67, 0x52, 0x14, 0x65, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, + 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x12, 0x47, 0x0a, + 0x0e, 0x72, 0x65, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x18, + 0x08, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x20, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, + 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x65, 0x73, 0x74, 0x61, 0x72, + 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x0d, 0x72, 0x65, 0x73, 0x74, 0x61, 0x72, 0x74, + 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x3f, 0x0a, 0x19, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, + 0x6c, 0x5f, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x5f, 0x70, 0x61, 0x72, + 0x61, 0x6d, 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x17, 0x69, 0x6e, 0x69, + 0x74, 0x69, 0x61, 0x6c, 0x53, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x50, 0x61, + 0x72, 0x61, 0x6d, 0x73, 0x88, 0x01, 0x01, 0x42, 0x1c, 0x0a, 0x1a, 0x5f, 0x69, 0x6e, 0x69, 0x74, + 0x69, 0x61, 0x6c, 0x5f, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x5f, 0x70, + 0x61, 0x72, 0x61, 0x6d, 0x73, 0x22, 0x27, 0x0a, 0x08, 0x50, 0x6c, 0x61, 0x6e, 0x59, 0x61, 0x6d, + 0x6c, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x6c, 0x61, 0x6e, 0x5f, 0x79, 0x61, 0x6d, 0x6c, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6c, 0x61, 0x6e, 0x59, 0x61, 0x6d, 0x6c, 0x22, 0xdb, + 0x01, 0x0a, 0x1a, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x53, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x50, 0x6c, 0x61, 0x6e, 0x59, 0x61, 0x6d, 0x6c, 0x41, 0x72, 0x67, 0x73, 0x12, 0x2b, 0x0a, + 0x11, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x5f, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, + 0x69, 0x7a, 0x65, 0x64, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, 0x12, 0x30, 0x0a, 0x11, 0x73, 0x65, + 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x10, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, + 0x7a, 0x65, 0x64, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x88, 0x01, 0x01, 0x12, 0x31, 0x0a, 0x12, + 0x6d, 0x61, 0x69, 0x6e, 0x5f, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x61, + 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x10, 0x6d, 0x61, 0x69, 0x6e, + 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x88, 0x01, 0x01, 0x42, + 0x14, 0x0a, 0x12, 0x5f, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x5f, 0x70, + 0x61, 0x72, 0x61, 0x6d, 0x73, 0x42, 0x15, 0x0a, 0x13, 0x5f, 0x6d, 0x61, 0x69, 0x6e, 0x5f, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0xcb, 0x02, 0x0a, + 0x1b, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, + 0x50, 0x6c, 0x61, 0x6e, 0x59, 0x61, 0x6d, 0x6c, 0x41, 0x72, 0x67, 0x73, 0x12, 0x1d, 0x0a, 0x0a, + 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x09, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x49, 0x64, 0x12, 0x30, 0x0a, 0x11, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, - 0x42, 0x15, 0x0a, 0x13, 0x5f, 0x6d, 0x61, 0x69, 0x6e, 0x5f, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0xcb, 0x02, 0x0a, 0x1b, 0x53, 0x74, 0x61, 0x72, - 0x6c, 0x61, 0x72, 0x6b, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x50, 0x6c, 0x61, 0x6e, 0x59, - 0x61, 0x6d, 0x6c, 0x41, 0x72, 0x67, 0x73, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x61, 0x63, 0x6b, 0x61, - 0x67, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x70, 0x61, 0x63, - 0x6b, 0x61, 0x67, 0x65, 0x49, 0x64, 0x12, 0x30, 0x0a, 0x11, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, - 0x69, 0x7a, 0x65, 0x64, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x48, 0x00, 0x52, 0x10, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x50, - 0x61, 0x72, 0x61, 0x6d, 0x73, 0x88, 0x01, 0x01, 0x12, 0x1b, 0x0a, 0x09, 0x69, 0x73, 0x5f, 0x72, - 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x69, 0x73, 0x52, - 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x12, 0x3f, 0x0a, 0x1a, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x76, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x10, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, + 0x69, 0x7a, 0x65, 0x64, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x88, 0x01, 0x01, 0x12, 0x1b, 0x0a, + 0x09, 0x69, 0x73, 0x5f, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x08, 0x69, 0x73, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x12, 0x3f, 0x0a, 0x1a, 0x72, 0x65, + 0x6c, 0x61, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x5f, 0x74, 0x6f, 0x5f, 0x6d, + 0x61, 0x69, 0x6e, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, + 0x52, 0x16, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x76, 0x65, 0x50, 0x61, 0x74, 0x68, 0x54, 0x6f, + 0x4d, 0x61, 0x69, 0x6e, 0x46, 0x69, 0x6c, 0x65, 0x88, 0x01, 0x01, 0x12, 0x31, 0x0a, 0x12, 0x6d, + 0x61, 0x69, 0x6e, 0x5f, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, + 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x48, 0x02, 0x52, 0x10, 0x6d, 0x61, 0x69, 0x6e, 0x46, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x88, 0x01, 0x01, 0x42, 0x14, + 0x0a, 0x12, 0x5f, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x5f, 0x70, 0x61, + 0x72, 0x61, 0x6d, 0x73, 0x42, 0x1d, 0x0a, 0x1b, 0x5f, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x5f, 0x74, 0x6f, 0x5f, 0x6d, 0x61, 0x69, 0x6e, 0x5f, 0x66, - 0x69, 0x6c, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x16, 0x72, 0x65, 0x6c, - 0x61, 0x74, 0x69, 0x76, 0x65, 0x50, 0x61, 0x74, 0x68, 0x54, 0x6f, 0x4d, 0x61, 0x69, 0x6e, 0x46, - 0x69, 0x6c, 0x65, 0x88, 0x01, 0x01, 0x12, 0x31, 0x0a, 0x12, 0x6d, 0x61, 0x69, 0x6e, 0x5f, 0x66, - 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, - 0x28, 0x09, 0x48, 0x02, 0x52, 0x10, 0x6d, 0x61, 0x69, 0x6e, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x88, 0x01, 0x01, 0x42, 0x14, 0x0a, 0x12, 0x5f, 0x73, 0x65, - 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x42, - 0x1d, 0x0a, 0x1b, 0x5f, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x70, 0x61, 0x74, - 0x68, 0x5f, 0x74, 0x6f, 0x5f, 0x6d, 0x61, 0x69, 0x6e, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x42, 0x15, - 0x0a, 0x13, 0x5f, 0x6d, 0x61, 0x69, 0x6e, 0x5f, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x2a, 0x36, 0x0a, 0x0d, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, - 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x0b, 0x0a, 0x07, 0x53, 0x54, 0x4f, 0x50, 0x50, 0x45, - 0x44, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x52, 0x55, 0x4e, 0x4e, 0x49, 0x4e, 0x47, 0x10, 0x01, - 0x12, 0x0b, 0x0a, 0x07, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x02, 0x2a, 0x2c, 0x0a, - 0x11, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x44, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x4d, 0x6f, - 0x64, 0x65, 0x12, 0x0a, 0x0a, 0x06, 0x61, 0x6c, 0x77, 0x61, 0x79, 0x73, 0x10, 0x00, 0x12, 0x0b, - 0x0a, 0x07, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x10, 0x01, 0x2a, 0x26, 0x0a, 0x07, 0x43, - 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x12, 0x0b, 0x0a, 0x07, 0x43, 0x4f, 0x4e, 0x4e, 0x45, 0x43, - 0x54, 0x10, 0x00, 0x12, 0x0e, 0x0a, 0x0a, 0x4e, 0x4f, 0x5f, 0x43, 0x4f, 0x4e, 0x4e, 0x45, 0x43, - 0x54, 0x10, 0x01, 0x2a, 0x32, 0x0a, 0x13, 0x4b, 0x75, 0x72, 0x74, 0x6f, 0x73, 0x69, 0x73, 0x46, - 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x46, 0x6c, 0x61, 0x67, 0x12, 0x1b, 0x0a, 0x17, 0x4e, 0x4f, - 0x5f, 0x49, 0x4e, 0x53, 0x54, 0x52, 0x55, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x53, 0x5f, 0x43, 0x41, - 0x43, 0x48, 0x49, 0x4e, 0x47, 0x10, 0x00, 0x2a, 0x26, 0x0a, 0x0d, 0x52, 0x65, 0x73, 0x74, 0x61, - 0x72, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x09, 0x0a, 0x05, 0x4e, 0x45, 0x56, 0x45, - 0x52, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x41, 0x4c, 0x57, 0x41, 0x59, 0x53, 0x10, 0x01, 0x32, - 0xa6, 0x10, 0x0a, 0x13, 0x41, 0x70, 0x69, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, - 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x6d, 0x0a, 0x11, 0x52, 0x75, 0x6e, 0x53, 0x74, - 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, 0x12, 0x28, 0x2e, 0x61, - 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, - 0x2e, 0x52, 0x75, 0x6e, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x53, 0x63, 0x72, 0x69, - 0x70, 0x74, 0x41, 0x72, 0x67, 0x73, 0x1a, 0x2a, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, - 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x6c, - 0x61, 0x72, 0x6b, 0x52, 0x75, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x4c, 0x69, - 0x6e, 0x65, 0x22, 0x00, 0x30, 0x01, 0x12, 0x59, 0x0a, 0x15, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, - 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x12, - 0x24, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, - 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x65, 0x64, 0x44, 0x61, 0x74, 0x61, - 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x28, - 0x01, 0x12, 0x6f, 0x0a, 0x12, 0x52, 0x75, 0x6e, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, - 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x12, 0x29, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, - 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x75, 0x6e, 0x53, - 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x41, 0x72, - 0x67, 0x73, 0x1a, 0x2a, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, - 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x52, - 0x75, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x4c, 0x69, 0x6e, 0x65, 0x22, 0x00, - 0x30, 0x01, 0x12, 0x5b, 0x0a, 0x0b, 0x47, 0x65, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, - 0x73, 0x12, 0x22, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, - 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, - 0x73, 0x41, 0x72, 0x67, 0x73, 0x1a, 0x26, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, - 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x65, 0x72, - 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, - 0x8d, 0x01, 0x0a, 0x2a, 0x47, 0x65, 0x74, 0x45, 0x78, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x41, - 0x6e, 0x64, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x69, 0x63, 0x61, 0x6c, 0x53, 0x65, 0x72, 0x76, - 0x69, 0x63, 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x73, 0x12, 0x16, - 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, - 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x45, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, - 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x78, - 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x41, 0x6e, 0x64, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x69, - 0x63, 0x61, 0x6c, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, - 0x66, 0x69, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, - 0x5b, 0x0a, 0x0b, 0x45, 0x78, 0x65, 0x63, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x22, - 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, - 0x70, 0x69, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x41, 0x72, - 0x67, 0x73, 0x1a, 0x26, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, - 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x43, 0x6f, 0x6d, 0x6d, 0x61, - 0x6e, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x79, 0x0a, 0x22, - 0x57, 0x61, 0x69, 0x74, 0x46, 0x6f, 0x72, 0x48, 0x74, 0x74, 0x70, 0x47, 0x65, 0x74, 0x45, 0x6e, - 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x69, 0x6c, 0x69, - 0x74, 0x79, 0x12, 0x39, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, - 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x57, 0x61, 0x69, 0x74, 0x46, 0x6f, 0x72, 0x48, 0x74, - 0x74, 0x70, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x41, 0x76, 0x61, - 0x69, 0x6c, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x41, 0x72, 0x67, 0x73, 0x1a, 0x16, 0x2e, - 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, - 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x7b, 0x0a, 0x23, 0x57, 0x61, 0x69, 0x74, 0x46, - 0x6f, 0x72, 0x48, 0x74, 0x74, 0x70, 0x50, 0x6f, 0x73, 0x74, 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, - 0x6e, 0x74, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x12, 0x3a, - 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, - 0x70, 0x69, 0x2e, 0x57, 0x61, 0x69, 0x74, 0x46, 0x6f, 0x72, 0x48, 0x74, 0x74, 0x70, 0x50, 0x6f, - 0x73, 0x74, 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, - 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x41, 0x72, 0x67, 0x73, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, + 0x69, 0x6c, 0x65, 0x42, 0x15, 0x0a, 0x13, 0x5f, 0x6d, 0x61, 0x69, 0x6e, 0x5f, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x2a, 0x36, 0x0a, 0x0d, 0x53, 0x65, + 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x0b, 0x0a, 0x07, 0x53, + 0x54, 0x4f, 0x50, 0x50, 0x45, 0x44, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x52, 0x55, 0x4e, 0x4e, + 0x49, 0x4e, 0x47, 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, + 0x10, 0x02, 0x2a, 0x2c, 0x0a, 0x11, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x44, 0x6f, 0x77, 0x6e, 0x6c, + 0x6f, 0x61, 0x64, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x0a, 0x0a, 0x06, 0x61, 0x6c, 0x77, 0x61, 0x79, + 0x73, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x10, 0x01, + 0x2a, 0x26, 0x0a, 0x07, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x12, 0x0b, 0x0a, 0x07, 0x43, + 0x4f, 0x4e, 0x4e, 0x45, 0x43, 0x54, 0x10, 0x00, 0x12, 0x0e, 0x0a, 0x0a, 0x4e, 0x4f, 0x5f, 0x43, + 0x4f, 0x4e, 0x4e, 0x45, 0x43, 0x54, 0x10, 0x01, 0x2a, 0x32, 0x0a, 0x13, 0x4b, 0x75, 0x72, 0x74, + 0x6f, 0x73, 0x69, 0x73, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x46, 0x6c, 0x61, 0x67, 0x12, + 0x1b, 0x0a, 0x17, 0x4e, 0x4f, 0x5f, 0x49, 0x4e, 0x53, 0x54, 0x52, 0x55, 0x43, 0x54, 0x49, 0x4f, + 0x4e, 0x53, 0x5f, 0x43, 0x41, 0x43, 0x48, 0x49, 0x4e, 0x47, 0x10, 0x00, 0x2a, 0x26, 0x0a, 0x0d, + 0x52, 0x65, 0x73, 0x74, 0x61, 0x72, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x09, 0x0a, + 0x05, 0x4e, 0x45, 0x56, 0x45, 0x52, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x41, 0x4c, 0x57, 0x41, + 0x59, 0x53, 0x10, 0x01, 0x32, 0xa6, 0x10, 0x0a, 0x13, 0x41, 0x70, 0x69, 0x43, 0x6f, 0x6e, 0x74, + 0x61, 0x69, 0x6e, 0x65, 0x72, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x6d, 0x0a, 0x11, + 0x52, 0x75, 0x6e, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x53, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x12, 0x28, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, + 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x75, 0x6e, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, + 0x6b, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, 0x41, 0x72, 0x67, 0x73, 0x1a, 0x2a, 0x2e, 0x61, 0x70, + 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, + 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x52, 0x75, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x4c, 0x69, 0x6e, 0x65, 0x22, 0x00, 0x30, 0x01, 0x12, 0x59, 0x0a, 0x15, 0x55, + 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x50, 0x61, 0x63, + 0x6b, 0x61, 0x67, 0x65, 0x12, 0x24, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, + 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x65, + 0x64, 0x44, 0x61, 0x74, 0x61, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, - 0x74, 0x79, 0x22, 0x00, 0x12, 0x6f, 0x0a, 0x13, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x46, 0x69, - 0x6c, 0x65, 0x73, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x12, 0x24, 0x2e, 0x61, 0x70, + 0x74, 0x79, 0x22, 0x00, 0x28, 0x01, 0x12, 0x6f, 0x0a, 0x12, 0x52, 0x75, 0x6e, 0x53, 0x74, 0x61, + 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x12, 0x29, 0x2e, 0x61, + 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, + 0x2e, 0x52, 0x75, 0x6e, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x50, 0x61, 0x63, 0x6b, + 0x61, 0x67, 0x65, 0x41, 0x72, 0x67, 0x73, 0x1a, 0x2a, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, + 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, 0x61, 0x72, + 0x6c, 0x61, 0x72, 0x6b, 0x52, 0x75, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x4c, + 0x69, 0x6e, 0x65, 0x22, 0x00, 0x30, 0x01, 0x12, 0x5b, 0x0a, 0x0b, 0x47, 0x65, 0x74, 0x53, 0x65, + 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x12, 0x22, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, + 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x65, + 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x41, 0x72, 0x67, 0x73, 0x1a, 0x26, 0x2e, 0x61, 0x70, 0x69, + 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x47, + 0x65, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x00, 0x12, 0x8d, 0x01, 0x0a, 0x2a, 0x47, 0x65, 0x74, 0x45, 0x78, 0x69, 0x73, + 0x74, 0x69, 0x6e, 0x67, 0x41, 0x6e, 0x64, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x69, 0x63, 0x61, + 0x6c, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, + 0x65, 0x72, 0x73, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x45, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, - 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x65, 0x64, 0x44, 0x61, 0x74, 0x61, 0x43, 0x68, 0x75, 0x6e, - 0x6b, 0x1a, 0x2e, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, - 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x46, 0x69, 0x6c, 0x65, - 0x73, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x00, 0x28, 0x01, 0x12, 0x6f, 0x0a, 0x15, 0x44, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, - 0x64, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x12, 0x2c, + 0x47, 0x65, 0x74, 0x45, 0x78, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x41, 0x6e, 0x64, 0x48, 0x69, + 0x73, 0x74, 0x6f, 0x72, 0x69, 0x63, 0x61, 0x6c, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, + 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x00, 0x12, 0x5b, 0x0a, 0x0b, 0x45, 0x78, 0x65, 0x63, 0x43, 0x6f, 0x6d, 0x6d, + 0x61, 0x6e, 0x64, 0x12, 0x22, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, + 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x43, 0x6f, 0x6d, 0x6d, + 0x61, 0x6e, 0x64, 0x41, 0x72, 0x67, 0x73, 0x1a, 0x26, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, + 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x45, 0x78, 0x65, 0x63, + 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x00, 0x12, 0x79, 0x0a, 0x22, 0x57, 0x61, 0x69, 0x74, 0x46, 0x6f, 0x72, 0x48, 0x74, 0x74, 0x70, + 0x47, 0x65, 0x74, 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x41, 0x76, 0x61, 0x69, 0x6c, + 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x12, 0x39, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, + 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x57, 0x61, 0x69, 0x74, + 0x46, 0x6f, 0x72, 0x48, 0x74, 0x74, 0x70, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, + 0x6e, 0x74, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x41, 0x72, + 0x67, 0x73, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x7b, 0x0a, 0x23, + 0x57, 0x61, 0x69, 0x74, 0x46, 0x6f, 0x72, 0x48, 0x74, 0x74, 0x70, 0x50, 0x6f, 0x73, 0x74, 0x45, + 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x69, 0x6c, + 0x69, 0x74, 0x79, 0x12, 0x3a, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, + 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x57, 0x61, 0x69, 0x74, 0x46, 0x6f, 0x72, 0x48, + 0x74, 0x74, 0x70, 0x50, 0x6f, 0x73, 0x74, 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x41, + 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x41, 0x72, 0x67, 0x73, 0x1a, + 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, + 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x6f, 0x0a, 0x13, 0x55, 0x70, 0x6c, + 0x6f, 0x61, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, + 0x12, 0x24, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, + 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x65, 0x64, 0x44, 0x61, 0x74, + 0x61, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x1a, 0x2e, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, + 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x55, 0x70, 0x6c, 0x6f, 0x61, + 0x64, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x28, 0x01, 0x12, 0x6f, 0x0a, 0x15, 0x44, 0x6f, + 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x72, 0x74, 0x69, 0x66, + 0x61, 0x63, 0x74, 0x12, 0x2c, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, + 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x44, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, + 0x46, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x41, 0x72, 0x67, + 0x73, 0x1a, 0x24, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, + 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x65, 0x64, 0x44, 0x61, + 0x74, 0x61, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x22, 0x00, 0x30, 0x01, 0x12, 0x79, 0x0a, 0x15, 0x53, + 0x74, 0x6f, 0x72, 0x65, 0x57, 0x65, 0x62, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x72, 0x74, 0x69, + 0x66, 0x61, 0x63, 0x74, 0x12, 0x2c, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, + 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x57, 0x65, + 0x62, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x41, 0x72, + 0x67, 0x73, 0x1a, 0x30, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, + 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x57, 0x65, 0x62, 0x46, + 0x69, 0x6c, 0x65, 0x73, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x91, 0x01, 0x0a, 0x1d, 0x53, 0x74, 0x6f, 0x72, 0x65, + 0x46, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x46, 0x72, 0x6f, + 0x6d, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x34, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, + 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, 0x6f, + 0x72, 0x65, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x46, + 0x72, 0x6f, 0x6d, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x41, 0x72, 0x67, 0x73, 0x1a, 0x38, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, - 0x70, 0x69, 0x2e, 0x44, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x73, - 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x41, 0x72, 0x67, 0x73, 0x1a, 0x24, 0x2e, 0x61, - 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, - 0x2e, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x65, 0x64, 0x44, 0x61, 0x74, 0x61, 0x43, 0x68, 0x75, - 0x6e, 0x6b, 0x22, 0x00, 0x30, 0x01, 0x12, 0x79, 0x0a, 0x15, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x57, - 0x65, 0x62, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x12, - 0x2c, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, - 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x57, 0x65, 0x62, 0x46, 0x69, 0x6c, 0x65, - 0x73, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x41, 0x72, 0x67, 0x73, 0x1a, 0x30, 0x2e, - 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, - 0x69, 0x2e, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x57, 0x65, 0x62, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x41, - 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x00, 0x12, 0x91, 0x01, 0x0a, 0x1d, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x46, 0x69, 0x6c, 0x65, 0x73, - 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x46, 0x72, 0x6f, 0x6d, 0x53, 0x65, 0x72, 0x76, - 0x69, 0x63, 0x65, 0x12, 0x34, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, - 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x46, 0x69, 0x6c, - 0x65, 0x73, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x46, 0x72, 0x6f, 0x6d, 0x53, 0x65, - 0x72, 0x76, 0x69, 0x63, 0x65, 0x41, 0x72, 0x67, 0x73, 0x1a, 0x38, 0x2e, 0x61, 0x70, 0x69, 0x5f, - 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, - 0x6f, 0x72, 0x65, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, - 0x46, 0x72, 0x6f, 0x6d, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x75, 0x0a, 0x1e, 0x4c, 0x69, 0x73, 0x74, 0x46, 0x69, 0x6c, + 0x70, 0x69, 0x2e, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x72, 0x74, + 0x69, 0x66, 0x61, 0x63, 0x74, 0x46, 0x72, 0x6f, 0x6d, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x75, 0x0a, 0x1e, 0x4c, 0x69, + 0x73, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x4e, + 0x61, 0x6d, 0x65, 0x73, 0x41, 0x6e, 0x64, 0x55, 0x75, 0x69, 0x64, 0x73, 0x12, 0x16, 0x2e, 0x67, + 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, + 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x39, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, + 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x41, - 0x6e, 0x64, 0x55, 0x75, 0x69, 0x64, 0x73, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, - 0x39, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, - 0x61, 0x70, 0x69, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x72, 0x74, - 0x69, 0x66, 0x61, 0x63, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x41, 0x6e, 0x64, 0x55, 0x75, 0x69, - 0x64, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x91, 0x01, 0x0a, - 0x1c, 0x49, 0x6e, 0x73, 0x70, 0x65, 0x63, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x72, 0x74, - 0x69, 0x66, 0x61, 0x63, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x36, 0x2e, - 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, - 0x69, 0x2e, 0x49, 0x6e, 0x73, 0x70, 0x65, 0x63, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x72, - 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x37, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, - 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x49, 0x6e, 0x73, 0x70, 0x65, 0x63, - 0x74, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x43, 0x6f, - 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, - 0x12, 0x67, 0x0a, 0x0f, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, - 0x63, 0x65, 0x73, 0x12, 0x26, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, - 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x53, - 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x41, 0x72, 0x67, 0x73, 0x1a, 0x2a, 0x2e, 0x61, 0x70, - 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, - 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x55, 0x0a, 0x0e, 0x47, 0x65, 0x74, - 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x52, 0x75, 0x6e, 0x12, 0x16, 0x2e, 0x67, 0x6f, - 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, - 0x70, 0x74, 0x79, 0x1a, 0x29, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, - 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x74, 0x61, 0x72, 0x6c, - 0x61, 0x72, 0x6b, 0x52, 0x75, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, - 0x12, 0x69, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x53, - 0x63, 0x72, 0x69, 0x70, 0x74, 0x50, 0x6c, 0x61, 0x6e, 0x59, 0x61, 0x6d, 0x6c, 0x12, 0x2d, 0x2e, - 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, - 0x69, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, - 0x50, 0x6c, 0x61, 0x6e, 0x59, 0x61, 0x6d, 0x6c, 0x41, 0x72, 0x67, 0x73, 0x1a, 0x1b, 0x2e, 0x61, - 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, - 0x2e, 0x50, 0x6c, 0x61, 0x6e, 0x59, 0x61, 0x6d, 0x6c, 0x22, 0x00, 0x12, 0x6b, 0x0a, 0x1a, 0x47, - 0x65, 0x74, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, - 0x65, 0x50, 0x6c, 0x61, 0x6e, 0x59, 0x61, 0x6d, 0x6c, 0x12, 0x2e, 0x2e, 0x61, 0x70, 0x69, 0x5f, - 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, - 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x50, 0x6c, 0x61, - 0x6e, 0x59, 0x61, 0x6d, 0x6c, 0x41, 0x72, 0x67, 0x73, 0x1a, 0x1b, 0x2e, 0x61, 0x70, 0x69, 0x5f, - 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x50, 0x6c, - 0x61, 0x6e, 0x59, 0x61, 0x6d, 0x6c, 0x22, 0x00, 0x42, 0x52, 0x5a, 0x50, 0x67, 0x69, 0x74, 0x68, - 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6b, 0x75, 0x72, 0x74, 0x6f, 0x73, 0x69, 0x73, 0x2d, - 0x74, 0x65, 0x63, 0x68, 0x2f, 0x6b, 0x75, 0x72, 0x74, 0x6f, 0x73, 0x69, 0x73, 0x2f, 0x61, 0x70, - 0x69, 0x2f, 0x67, 0x6f, 0x6c, 0x61, 0x6e, 0x67, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x6b, 0x75, - 0x72, 0x74, 0x6f, 0x73, 0x69, 0x73, 0x5f, 0x63, 0x6f, 0x72, 0x65, 0x5f, 0x72, 0x70, 0x63, 0x5f, - 0x61, 0x70, 0x69, 0x5f, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x73, 0x62, 0x06, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x33, + 0x6e, 0x64, 0x55, 0x75, 0x69, 0x64, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x00, 0x12, 0x91, 0x01, 0x0a, 0x1c, 0x49, 0x6e, 0x73, 0x70, 0x65, 0x63, 0x74, 0x46, 0x69, 0x6c, + 0x65, 0x73, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, + 0x74, 0x73, 0x12, 0x36, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, + 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x49, 0x6e, 0x73, 0x70, 0x65, 0x63, 0x74, 0x46, 0x69, + 0x6c, 0x65, 0x73, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x65, + 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x37, 0x2e, 0x61, 0x70, 0x69, + 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x49, + 0x6e, 0x73, 0x70, 0x65, 0x63, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x72, 0x74, 0x69, 0x66, + 0x61, 0x63, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x67, 0x0a, 0x0f, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, + 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x12, 0x26, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, + 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x43, 0x6f, 0x6e, + 0x6e, 0x65, 0x63, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x41, 0x72, 0x67, 0x73, + 0x1a, 0x2a, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, + 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x53, 0x65, 0x72, 0x76, + 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x55, + 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x52, 0x75, 0x6e, + 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, + 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x29, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, + 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, + 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x52, 0x75, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x69, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x53, 0x74, 0x61, 0x72, + 0x6c, 0x61, 0x72, 0x6b, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, 0x50, 0x6c, 0x61, 0x6e, 0x59, 0x61, + 0x6d, 0x6c, 0x12, 0x2d, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, + 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x53, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x50, 0x6c, 0x61, 0x6e, 0x59, 0x61, 0x6d, 0x6c, 0x41, 0x72, 0x67, + 0x73, 0x1a, 0x1b, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, + 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x50, 0x6c, 0x61, 0x6e, 0x59, 0x61, 0x6d, 0x6c, 0x22, 0x00, + 0x12, 0x6b, 0x0a, 0x1a, 0x47, 0x65, 0x74, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x50, + 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x50, 0x6c, 0x61, 0x6e, 0x59, 0x61, 0x6d, 0x6c, 0x12, 0x2e, + 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, + 0x70, 0x69, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x50, 0x61, 0x63, 0x6b, 0x61, + 0x67, 0x65, 0x50, 0x6c, 0x61, 0x6e, 0x59, 0x61, 0x6d, 0x6c, 0x41, 0x72, 0x67, 0x73, 0x1a, 0x1b, + 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, + 0x70, 0x69, 0x2e, 0x50, 0x6c, 0x61, 0x6e, 0x59, 0x61, 0x6d, 0x6c, 0x22, 0x00, 0x42, 0x52, 0x5a, + 0x50, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6b, 0x75, 0x72, 0x74, + 0x6f, 0x73, 0x69, 0x73, 0x2d, 0x74, 0x65, 0x63, 0x68, 0x2f, 0x6b, 0x75, 0x72, 0x74, 0x6f, 0x73, + 0x69, 0x73, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x67, 0x6f, 0x6c, 0x61, 0x6e, 0x67, 0x2f, 0x63, 0x6f, + 0x72, 0x65, 0x2f, 0x6b, 0x75, 0x72, 0x74, 0x6f, 0x73, 0x69, 0x73, 0x5f, 0x63, 0x6f, 0x72, 0x65, + 0x5f, 0x72, 0x70, 0x63, 0x5f, 0x61, 0x70, 0x69, 0x5f, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, + 0x73, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -4420,7 +4650,7 @@ func file_api_container_service_proto_rawDescGZIP() []byte { } var file_api_container_service_proto_enumTypes = make([]protoimpl.EnumInfo, 7) -var file_api_container_service_proto_msgTypes = make([]protoimpl.MessageInfo, 52) +var file_api_container_service_proto_msgTypes = make([]protoimpl.MessageInfo, 56) var file_api_container_service_proto_goTypes = []interface{}{ (ServiceStatus)(0), // 0: api_container_api.ServiceStatus (ImageDownloadMode)(0), // 1: api_container_api.ImageDownloadMode @@ -4432,137 +4662,145 @@ var file_api_container_service_proto_goTypes = []interface{}{ (*Port)(nil), // 7: api_container_api.Port (*Container)(nil), // 8: api_container_api.Container (*FilesArtifactsList)(nil), // 9: api_container_api.FilesArtifactsList - (*ServiceInfo)(nil), // 10: api_container_api.ServiceInfo - (*RunStarlarkScriptArgs)(nil), // 11: api_container_api.RunStarlarkScriptArgs - (*RunStarlarkPackageArgs)(nil), // 12: api_container_api.RunStarlarkPackageArgs - (*StarlarkRunResponseLine)(nil), // 13: api_container_api.StarlarkRunResponseLine - (*StarlarkInfo)(nil), // 14: api_container_api.StarlarkInfo - (*StarlarkWarning)(nil), // 15: api_container_api.StarlarkWarning - (*StarlarkInstruction)(nil), // 16: api_container_api.StarlarkInstruction - (*StarlarkInstructionResult)(nil), // 17: api_container_api.StarlarkInstructionResult - (*StarlarkInstructionArg)(nil), // 18: api_container_api.StarlarkInstructionArg - (*StarlarkInstructionPosition)(nil), // 19: api_container_api.StarlarkInstructionPosition - (*StarlarkError)(nil), // 20: api_container_api.StarlarkError - (*StarlarkInterpretationError)(nil), // 21: api_container_api.StarlarkInterpretationError - (*StarlarkValidationError)(nil), // 22: api_container_api.StarlarkValidationError - (*StarlarkExecutionError)(nil), // 23: api_container_api.StarlarkExecutionError - (*StarlarkRunProgress)(nil), // 24: api_container_api.StarlarkRunProgress - (*StarlarkRunFinishedEvent)(nil), // 25: api_container_api.StarlarkRunFinishedEvent - (*GetServicesArgs)(nil), // 26: api_container_api.GetServicesArgs - (*GetServicesResponse)(nil), // 27: api_container_api.GetServicesResponse - (*ServiceIdentifiers)(nil), // 28: api_container_api.ServiceIdentifiers - (*GetExistingAndHistoricalServiceIdentifiersResponse)(nil), // 29: api_container_api.GetExistingAndHistoricalServiceIdentifiersResponse - (*ExecCommandArgs)(nil), // 30: api_container_api.ExecCommandArgs - (*ExecCommandResponse)(nil), // 31: api_container_api.ExecCommandResponse - (*WaitForHttpGetEndpointAvailabilityArgs)(nil), // 32: api_container_api.WaitForHttpGetEndpointAvailabilityArgs - (*WaitForHttpPostEndpointAvailabilityArgs)(nil), // 33: api_container_api.WaitForHttpPostEndpointAvailabilityArgs - (*StreamedDataChunk)(nil), // 34: api_container_api.StreamedDataChunk - (*DataChunkMetadata)(nil), // 35: api_container_api.DataChunkMetadata - (*UploadFilesArtifactResponse)(nil), // 36: api_container_api.UploadFilesArtifactResponse - (*DownloadFilesArtifactArgs)(nil), // 37: api_container_api.DownloadFilesArtifactArgs - (*StoreWebFilesArtifactArgs)(nil), // 38: api_container_api.StoreWebFilesArtifactArgs - (*StoreWebFilesArtifactResponse)(nil), // 39: api_container_api.StoreWebFilesArtifactResponse - (*StoreFilesArtifactFromServiceArgs)(nil), // 40: api_container_api.StoreFilesArtifactFromServiceArgs - (*StoreFilesArtifactFromServiceResponse)(nil), // 41: api_container_api.StoreFilesArtifactFromServiceResponse - (*FilesArtifactNameAndUuid)(nil), // 42: api_container_api.FilesArtifactNameAndUuid - (*ListFilesArtifactNamesAndUuidsResponse)(nil), // 43: api_container_api.ListFilesArtifactNamesAndUuidsResponse - (*InspectFilesArtifactContentsRequest)(nil), // 44: api_container_api.InspectFilesArtifactContentsRequest - (*InspectFilesArtifactContentsResponse)(nil), // 45: api_container_api.InspectFilesArtifactContentsResponse - (*FileArtifactContentsFileDescription)(nil), // 46: api_container_api.FileArtifactContentsFileDescription - (*ConnectServicesArgs)(nil), // 47: api_container_api.ConnectServicesArgs - (*ConnectServicesResponse)(nil), // 48: api_container_api.ConnectServicesResponse - (*GetStarlarkRunResponse)(nil), // 49: api_container_api.GetStarlarkRunResponse - (*PlanYaml)(nil), // 50: api_container_api.PlanYaml - (*StarlarkScriptPlanYamlArgs)(nil), // 51: api_container_api.StarlarkScriptPlanYamlArgs - (*StarlarkPackagePlanYamlArgs)(nil), // 52: api_container_api.StarlarkPackagePlanYamlArgs - nil, // 53: api_container_api.Container.EnvVarsEntry - nil, // 54: api_container_api.ServiceInfo.PrivatePortsEntry - nil, // 55: api_container_api.ServiceInfo.MaybePublicPortsEntry - nil, // 56: api_container_api.ServiceInfo.ServiceDirPathsToFilesArtifactsIdentifiersEntry - nil, // 57: api_container_api.GetServicesArgs.ServiceIdentifiersEntry - nil, // 58: api_container_api.GetServicesResponse.ServiceInfoEntry - (*emptypb.Empty)(nil), // 59: google.protobuf.Empty + (*User)(nil), // 10: api_container_api.User + (*Toleration)(nil), // 11: api_container_api.Toleration + (*ServiceInfo)(nil), // 12: api_container_api.ServiceInfo + (*RunStarlarkScriptArgs)(nil), // 13: api_container_api.RunStarlarkScriptArgs + (*RunStarlarkPackageArgs)(nil), // 14: api_container_api.RunStarlarkPackageArgs + (*StarlarkRunResponseLine)(nil), // 15: api_container_api.StarlarkRunResponseLine + (*StarlarkInfo)(nil), // 16: api_container_api.StarlarkInfo + (*StarlarkWarning)(nil), // 17: api_container_api.StarlarkWarning + (*StarlarkInstruction)(nil), // 18: api_container_api.StarlarkInstruction + (*StarlarkInstructionResult)(nil), // 19: api_container_api.StarlarkInstructionResult + (*StarlarkInstructionArg)(nil), // 20: api_container_api.StarlarkInstructionArg + (*StarlarkInstructionPosition)(nil), // 21: api_container_api.StarlarkInstructionPosition + (*StarlarkError)(nil), // 22: api_container_api.StarlarkError + (*StarlarkInterpretationError)(nil), // 23: api_container_api.StarlarkInterpretationError + (*StarlarkValidationError)(nil), // 24: api_container_api.StarlarkValidationError + (*StarlarkExecutionError)(nil), // 25: api_container_api.StarlarkExecutionError + (*StarlarkRunProgress)(nil), // 26: api_container_api.StarlarkRunProgress + (*StarlarkRunFinishedEvent)(nil), // 27: api_container_api.StarlarkRunFinishedEvent + (*GetServicesArgs)(nil), // 28: api_container_api.GetServicesArgs + (*GetServicesResponse)(nil), // 29: api_container_api.GetServicesResponse + (*ServiceIdentifiers)(nil), // 30: api_container_api.ServiceIdentifiers + (*GetExistingAndHistoricalServiceIdentifiersResponse)(nil), // 31: api_container_api.GetExistingAndHistoricalServiceIdentifiersResponse + (*ExecCommandArgs)(nil), // 32: api_container_api.ExecCommandArgs + (*ExecCommandResponse)(nil), // 33: api_container_api.ExecCommandResponse + (*WaitForHttpGetEndpointAvailabilityArgs)(nil), // 34: api_container_api.WaitForHttpGetEndpointAvailabilityArgs + (*WaitForHttpPostEndpointAvailabilityArgs)(nil), // 35: api_container_api.WaitForHttpPostEndpointAvailabilityArgs + (*StreamedDataChunk)(nil), // 36: api_container_api.StreamedDataChunk + (*DataChunkMetadata)(nil), // 37: api_container_api.DataChunkMetadata + (*UploadFilesArtifactResponse)(nil), // 38: api_container_api.UploadFilesArtifactResponse + (*DownloadFilesArtifactArgs)(nil), // 39: api_container_api.DownloadFilesArtifactArgs + (*StoreWebFilesArtifactArgs)(nil), // 40: api_container_api.StoreWebFilesArtifactArgs + (*StoreWebFilesArtifactResponse)(nil), // 41: api_container_api.StoreWebFilesArtifactResponse + (*StoreFilesArtifactFromServiceArgs)(nil), // 42: api_container_api.StoreFilesArtifactFromServiceArgs + (*StoreFilesArtifactFromServiceResponse)(nil), // 43: api_container_api.StoreFilesArtifactFromServiceResponse + (*FilesArtifactNameAndUuid)(nil), // 44: api_container_api.FilesArtifactNameAndUuid + (*ListFilesArtifactNamesAndUuidsResponse)(nil), // 45: api_container_api.ListFilesArtifactNamesAndUuidsResponse + (*InspectFilesArtifactContentsRequest)(nil), // 46: api_container_api.InspectFilesArtifactContentsRequest + (*InspectFilesArtifactContentsResponse)(nil), // 47: api_container_api.InspectFilesArtifactContentsResponse + (*FileArtifactContentsFileDescription)(nil), // 48: api_container_api.FileArtifactContentsFileDescription + (*ConnectServicesArgs)(nil), // 49: api_container_api.ConnectServicesArgs + (*ConnectServicesResponse)(nil), // 50: api_container_api.ConnectServicesResponse + (*GetStarlarkRunResponse)(nil), // 51: api_container_api.GetStarlarkRunResponse + (*PlanYaml)(nil), // 52: api_container_api.PlanYaml + (*StarlarkScriptPlanYamlArgs)(nil), // 53: api_container_api.StarlarkScriptPlanYamlArgs + (*StarlarkPackagePlanYamlArgs)(nil), // 54: api_container_api.StarlarkPackagePlanYamlArgs + nil, // 55: api_container_api.Container.EnvVarsEntry + nil, // 56: api_container_api.ServiceInfo.PrivatePortsEntry + nil, // 57: api_container_api.ServiceInfo.MaybePublicPortsEntry + nil, // 58: api_container_api.ServiceInfo.ServiceDirPathsToFilesArtifactsListEntry + nil, // 59: api_container_api.ServiceInfo.NodeSelectorsEntry + nil, // 60: api_container_api.ServiceInfo.LabelsEntry + nil, // 61: api_container_api.GetServicesArgs.ServiceIdentifiersEntry + nil, // 62: api_container_api.GetServicesResponse.ServiceInfoEntry + (*emptypb.Empty)(nil), // 63: google.protobuf.Empty } var file_api_container_service_proto_depIdxs = []int32{ 5, // 0: api_container_api.Port.transport_protocol:type_name -> api_container_api.Port.TransportProtocol 6, // 1: api_container_api.Container.status:type_name -> api_container_api.Container.Status - 53, // 2: api_container_api.Container.env_vars:type_name -> api_container_api.Container.EnvVarsEntry - 54, // 3: api_container_api.ServiceInfo.private_ports:type_name -> api_container_api.ServiceInfo.PrivatePortsEntry - 55, // 4: api_container_api.ServiceInfo.maybe_public_ports:type_name -> api_container_api.ServiceInfo.MaybePublicPortsEntry + 55, // 2: api_container_api.Container.env_vars:type_name -> api_container_api.Container.EnvVarsEntry + 56, // 3: api_container_api.ServiceInfo.private_ports:type_name -> api_container_api.ServiceInfo.PrivatePortsEntry + 57, // 4: api_container_api.ServiceInfo.maybe_public_ports:type_name -> api_container_api.ServiceInfo.MaybePublicPortsEntry 0, // 5: api_container_api.ServiceInfo.service_status:type_name -> api_container_api.ServiceStatus 8, // 6: api_container_api.ServiceInfo.container:type_name -> api_container_api.Container - 56, // 7: api_container_api.ServiceInfo.service_dir_paths_to_files_artifacts_identifiers:type_name -> api_container_api.ServiceInfo.ServiceDirPathsToFilesArtifactsIdentifiersEntry - 3, // 8: api_container_api.RunStarlarkScriptArgs.experimental_features:type_name -> api_container_api.KurtosisFeatureFlag - 1, // 9: api_container_api.RunStarlarkScriptArgs.image_download_mode:type_name -> api_container_api.ImageDownloadMode - 3, // 10: api_container_api.RunStarlarkPackageArgs.experimental_features:type_name -> api_container_api.KurtosisFeatureFlag - 1, // 11: api_container_api.RunStarlarkPackageArgs.image_download_mode:type_name -> api_container_api.ImageDownloadMode - 16, // 12: api_container_api.StarlarkRunResponseLine.instruction:type_name -> api_container_api.StarlarkInstruction - 20, // 13: api_container_api.StarlarkRunResponseLine.error:type_name -> api_container_api.StarlarkError - 24, // 14: api_container_api.StarlarkRunResponseLine.progress_info:type_name -> api_container_api.StarlarkRunProgress - 17, // 15: api_container_api.StarlarkRunResponseLine.instruction_result:type_name -> api_container_api.StarlarkInstructionResult - 25, // 16: api_container_api.StarlarkRunResponseLine.run_finished_event:type_name -> api_container_api.StarlarkRunFinishedEvent - 15, // 17: api_container_api.StarlarkRunResponseLine.warning:type_name -> api_container_api.StarlarkWarning - 14, // 18: api_container_api.StarlarkRunResponseLine.info:type_name -> api_container_api.StarlarkInfo - 19, // 19: api_container_api.StarlarkInstruction.position:type_name -> api_container_api.StarlarkInstructionPosition - 18, // 20: api_container_api.StarlarkInstruction.arguments:type_name -> api_container_api.StarlarkInstructionArg - 21, // 21: api_container_api.StarlarkError.interpretation_error:type_name -> api_container_api.StarlarkInterpretationError - 22, // 22: api_container_api.StarlarkError.validation_error:type_name -> api_container_api.StarlarkValidationError - 23, // 23: api_container_api.StarlarkError.execution_error:type_name -> api_container_api.StarlarkExecutionError - 57, // 24: api_container_api.GetServicesArgs.service_identifiers:type_name -> api_container_api.GetServicesArgs.ServiceIdentifiersEntry - 58, // 25: api_container_api.GetServicesResponse.service_info:type_name -> api_container_api.GetServicesResponse.ServiceInfoEntry - 28, // 26: api_container_api.GetExistingAndHistoricalServiceIdentifiersResponse.allIdentifiers:type_name -> api_container_api.ServiceIdentifiers - 35, // 27: api_container_api.StreamedDataChunk.metadata:type_name -> api_container_api.DataChunkMetadata - 42, // 28: api_container_api.ListFilesArtifactNamesAndUuidsResponse.file_names_and_uuids:type_name -> api_container_api.FilesArtifactNameAndUuid - 42, // 29: api_container_api.InspectFilesArtifactContentsRequest.file_names_and_uuid:type_name -> api_container_api.FilesArtifactNameAndUuid - 46, // 30: api_container_api.InspectFilesArtifactContentsResponse.file_descriptions:type_name -> api_container_api.FileArtifactContentsFileDescription - 2, // 31: api_container_api.ConnectServicesArgs.connect:type_name -> api_container_api.Connect - 3, // 32: api_container_api.GetStarlarkRunResponse.experimental_features:type_name -> api_container_api.KurtosisFeatureFlag - 4, // 33: api_container_api.GetStarlarkRunResponse.restart_policy:type_name -> api_container_api.RestartPolicy - 7, // 34: api_container_api.ServiceInfo.PrivatePortsEntry.value:type_name -> api_container_api.Port - 7, // 35: api_container_api.ServiceInfo.MaybePublicPortsEntry.value:type_name -> api_container_api.Port - 9, // 36: api_container_api.ServiceInfo.ServiceDirPathsToFilesArtifactsIdentifiersEntry.value:type_name -> api_container_api.FilesArtifactsList - 10, // 37: api_container_api.GetServicesResponse.ServiceInfoEntry.value:type_name -> api_container_api.ServiceInfo - 11, // 38: api_container_api.ApiContainerService.RunStarlarkScript:input_type -> api_container_api.RunStarlarkScriptArgs - 34, // 39: api_container_api.ApiContainerService.UploadStarlarkPackage:input_type -> api_container_api.StreamedDataChunk - 12, // 40: api_container_api.ApiContainerService.RunStarlarkPackage:input_type -> api_container_api.RunStarlarkPackageArgs - 26, // 41: api_container_api.ApiContainerService.GetServices:input_type -> api_container_api.GetServicesArgs - 59, // 42: api_container_api.ApiContainerService.GetExistingAndHistoricalServiceIdentifiers:input_type -> google.protobuf.Empty - 30, // 43: api_container_api.ApiContainerService.ExecCommand:input_type -> api_container_api.ExecCommandArgs - 32, // 44: api_container_api.ApiContainerService.WaitForHttpGetEndpointAvailability:input_type -> api_container_api.WaitForHttpGetEndpointAvailabilityArgs - 33, // 45: api_container_api.ApiContainerService.WaitForHttpPostEndpointAvailability:input_type -> api_container_api.WaitForHttpPostEndpointAvailabilityArgs - 34, // 46: api_container_api.ApiContainerService.UploadFilesArtifact:input_type -> api_container_api.StreamedDataChunk - 37, // 47: api_container_api.ApiContainerService.DownloadFilesArtifact:input_type -> api_container_api.DownloadFilesArtifactArgs - 38, // 48: api_container_api.ApiContainerService.StoreWebFilesArtifact:input_type -> api_container_api.StoreWebFilesArtifactArgs - 40, // 49: api_container_api.ApiContainerService.StoreFilesArtifactFromService:input_type -> api_container_api.StoreFilesArtifactFromServiceArgs - 59, // 50: api_container_api.ApiContainerService.ListFilesArtifactNamesAndUuids:input_type -> google.protobuf.Empty - 44, // 51: api_container_api.ApiContainerService.InspectFilesArtifactContents:input_type -> api_container_api.InspectFilesArtifactContentsRequest - 47, // 52: api_container_api.ApiContainerService.ConnectServices:input_type -> api_container_api.ConnectServicesArgs - 59, // 53: api_container_api.ApiContainerService.GetStarlarkRun:input_type -> google.protobuf.Empty - 51, // 54: api_container_api.ApiContainerService.GetStarlarkScriptPlanYaml:input_type -> api_container_api.StarlarkScriptPlanYamlArgs - 52, // 55: api_container_api.ApiContainerService.GetStarlarkPackagePlanYaml:input_type -> api_container_api.StarlarkPackagePlanYamlArgs - 13, // 56: api_container_api.ApiContainerService.RunStarlarkScript:output_type -> api_container_api.StarlarkRunResponseLine - 59, // 57: api_container_api.ApiContainerService.UploadStarlarkPackage:output_type -> google.protobuf.Empty - 13, // 58: api_container_api.ApiContainerService.RunStarlarkPackage:output_type -> api_container_api.StarlarkRunResponseLine - 27, // 59: api_container_api.ApiContainerService.GetServices:output_type -> api_container_api.GetServicesResponse - 29, // 60: api_container_api.ApiContainerService.GetExistingAndHistoricalServiceIdentifiers:output_type -> api_container_api.GetExistingAndHistoricalServiceIdentifiersResponse - 31, // 61: api_container_api.ApiContainerService.ExecCommand:output_type -> api_container_api.ExecCommandResponse - 59, // 62: api_container_api.ApiContainerService.WaitForHttpGetEndpointAvailability:output_type -> google.protobuf.Empty - 59, // 63: api_container_api.ApiContainerService.WaitForHttpPostEndpointAvailability:output_type -> google.protobuf.Empty - 36, // 64: api_container_api.ApiContainerService.UploadFilesArtifact:output_type -> api_container_api.UploadFilesArtifactResponse - 34, // 65: api_container_api.ApiContainerService.DownloadFilesArtifact:output_type -> api_container_api.StreamedDataChunk - 39, // 66: api_container_api.ApiContainerService.StoreWebFilesArtifact:output_type -> api_container_api.StoreWebFilesArtifactResponse - 41, // 67: api_container_api.ApiContainerService.StoreFilesArtifactFromService:output_type -> api_container_api.StoreFilesArtifactFromServiceResponse - 43, // 68: api_container_api.ApiContainerService.ListFilesArtifactNamesAndUuids:output_type -> api_container_api.ListFilesArtifactNamesAndUuidsResponse - 45, // 69: api_container_api.ApiContainerService.InspectFilesArtifactContents:output_type -> api_container_api.InspectFilesArtifactContentsResponse - 48, // 70: api_container_api.ApiContainerService.ConnectServices:output_type -> api_container_api.ConnectServicesResponse - 49, // 71: api_container_api.ApiContainerService.GetStarlarkRun:output_type -> api_container_api.GetStarlarkRunResponse - 50, // 72: api_container_api.ApiContainerService.GetStarlarkScriptPlanYaml:output_type -> api_container_api.PlanYaml - 50, // 73: api_container_api.ApiContainerService.GetStarlarkPackagePlanYaml:output_type -> api_container_api.PlanYaml - 56, // [56:74] is the sub-list for method output_type - 38, // [38:56] is the sub-list for method input_type - 38, // [38:38] is the sub-list for extension type_name - 38, // [38:38] is the sub-list for extension extendee - 0, // [0:38] is the sub-list for field type_name + 58, // 7: api_container_api.ServiceInfo.service_dir_paths_to_files_artifacts_list:type_name -> api_container_api.ServiceInfo.ServiceDirPathsToFilesArtifactsListEntry + 10, // 8: api_container_api.ServiceInfo.user:type_name -> api_container_api.User + 11, // 9: api_container_api.ServiceInfo.tolerations:type_name -> api_container_api.Toleration + 59, // 10: api_container_api.ServiceInfo.node_selectors:type_name -> api_container_api.ServiceInfo.NodeSelectorsEntry + 60, // 11: api_container_api.ServiceInfo.labels:type_name -> api_container_api.ServiceInfo.LabelsEntry + 3, // 12: api_container_api.RunStarlarkScriptArgs.experimental_features:type_name -> api_container_api.KurtosisFeatureFlag + 1, // 13: api_container_api.RunStarlarkScriptArgs.image_download_mode:type_name -> api_container_api.ImageDownloadMode + 3, // 14: api_container_api.RunStarlarkPackageArgs.experimental_features:type_name -> api_container_api.KurtosisFeatureFlag + 1, // 15: api_container_api.RunStarlarkPackageArgs.image_download_mode:type_name -> api_container_api.ImageDownloadMode + 18, // 16: api_container_api.StarlarkRunResponseLine.instruction:type_name -> api_container_api.StarlarkInstruction + 22, // 17: api_container_api.StarlarkRunResponseLine.error:type_name -> api_container_api.StarlarkError + 26, // 18: api_container_api.StarlarkRunResponseLine.progress_info:type_name -> api_container_api.StarlarkRunProgress + 19, // 19: api_container_api.StarlarkRunResponseLine.instruction_result:type_name -> api_container_api.StarlarkInstructionResult + 27, // 20: api_container_api.StarlarkRunResponseLine.run_finished_event:type_name -> api_container_api.StarlarkRunFinishedEvent + 17, // 21: api_container_api.StarlarkRunResponseLine.warning:type_name -> api_container_api.StarlarkWarning + 16, // 22: api_container_api.StarlarkRunResponseLine.info:type_name -> api_container_api.StarlarkInfo + 21, // 23: api_container_api.StarlarkInstruction.position:type_name -> api_container_api.StarlarkInstructionPosition + 20, // 24: api_container_api.StarlarkInstruction.arguments:type_name -> api_container_api.StarlarkInstructionArg + 23, // 25: api_container_api.StarlarkError.interpretation_error:type_name -> api_container_api.StarlarkInterpretationError + 24, // 26: api_container_api.StarlarkError.validation_error:type_name -> api_container_api.StarlarkValidationError + 25, // 27: api_container_api.StarlarkError.execution_error:type_name -> api_container_api.StarlarkExecutionError + 61, // 28: api_container_api.GetServicesArgs.service_identifiers:type_name -> api_container_api.GetServicesArgs.ServiceIdentifiersEntry + 62, // 29: api_container_api.GetServicesResponse.service_info:type_name -> api_container_api.GetServicesResponse.ServiceInfoEntry + 30, // 30: api_container_api.GetExistingAndHistoricalServiceIdentifiersResponse.allIdentifiers:type_name -> api_container_api.ServiceIdentifiers + 37, // 31: api_container_api.StreamedDataChunk.metadata:type_name -> api_container_api.DataChunkMetadata + 44, // 32: api_container_api.ListFilesArtifactNamesAndUuidsResponse.file_names_and_uuids:type_name -> api_container_api.FilesArtifactNameAndUuid + 44, // 33: api_container_api.InspectFilesArtifactContentsRequest.file_names_and_uuid:type_name -> api_container_api.FilesArtifactNameAndUuid + 48, // 34: api_container_api.InspectFilesArtifactContentsResponse.file_descriptions:type_name -> api_container_api.FileArtifactContentsFileDescription + 2, // 35: api_container_api.ConnectServicesArgs.connect:type_name -> api_container_api.Connect + 3, // 36: api_container_api.GetStarlarkRunResponse.experimental_features:type_name -> api_container_api.KurtosisFeatureFlag + 4, // 37: api_container_api.GetStarlarkRunResponse.restart_policy:type_name -> api_container_api.RestartPolicy + 7, // 38: api_container_api.ServiceInfo.PrivatePortsEntry.value:type_name -> api_container_api.Port + 7, // 39: api_container_api.ServiceInfo.MaybePublicPortsEntry.value:type_name -> api_container_api.Port + 9, // 40: api_container_api.ServiceInfo.ServiceDirPathsToFilesArtifactsListEntry.value:type_name -> api_container_api.FilesArtifactsList + 12, // 41: api_container_api.GetServicesResponse.ServiceInfoEntry.value:type_name -> api_container_api.ServiceInfo + 13, // 42: api_container_api.ApiContainerService.RunStarlarkScript:input_type -> api_container_api.RunStarlarkScriptArgs + 36, // 43: api_container_api.ApiContainerService.UploadStarlarkPackage:input_type -> api_container_api.StreamedDataChunk + 14, // 44: api_container_api.ApiContainerService.RunStarlarkPackage:input_type -> api_container_api.RunStarlarkPackageArgs + 28, // 45: api_container_api.ApiContainerService.GetServices:input_type -> api_container_api.GetServicesArgs + 63, // 46: api_container_api.ApiContainerService.GetExistingAndHistoricalServiceIdentifiers:input_type -> google.protobuf.Empty + 32, // 47: api_container_api.ApiContainerService.ExecCommand:input_type -> api_container_api.ExecCommandArgs + 34, // 48: api_container_api.ApiContainerService.WaitForHttpGetEndpointAvailability:input_type -> api_container_api.WaitForHttpGetEndpointAvailabilityArgs + 35, // 49: api_container_api.ApiContainerService.WaitForHttpPostEndpointAvailability:input_type -> api_container_api.WaitForHttpPostEndpointAvailabilityArgs + 36, // 50: api_container_api.ApiContainerService.UploadFilesArtifact:input_type -> api_container_api.StreamedDataChunk + 39, // 51: api_container_api.ApiContainerService.DownloadFilesArtifact:input_type -> api_container_api.DownloadFilesArtifactArgs + 40, // 52: api_container_api.ApiContainerService.StoreWebFilesArtifact:input_type -> api_container_api.StoreWebFilesArtifactArgs + 42, // 53: api_container_api.ApiContainerService.StoreFilesArtifactFromService:input_type -> api_container_api.StoreFilesArtifactFromServiceArgs + 63, // 54: api_container_api.ApiContainerService.ListFilesArtifactNamesAndUuids:input_type -> google.protobuf.Empty + 46, // 55: api_container_api.ApiContainerService.InspectFilesArtifactContents:input_type -> api_container_api.InspectFilesArtifactContentsRequest + 49, // 56: api_container_api.ApiContainerService.ConnectServices:input_type -> api_container_api.ConnectServicesArgs + 63, // 57: api_container_api.ApiContainerService.GetStarlarkRun:input_type -> google.protobuf.Empty + 53, // 58: api_container_api.ApiContainerService.GetStarlarkScriptPlanYaml:input_type -> api_container_api.StarlarkScriptPlanYamlArgs + 54, // 59: api_container_api.ApiContainerService.GetStarlarkPackagePlanYaml:input_type -> api_container_api.StarlarkPackagePlanYamlArgs + 15, // 60: api_container_api.ApiContainerService.RunStarlarkScript:output_type -> api_container_api.StarlarkRunResponseLine + 63, // 61: api_container_api.ApiContainerService.UploadStarlarkPackage:output_type -> google.protobuf.Empty + 15, // 62: api_container_api.ApiContainerService.RunStarlarkPackage:output_type -> api_container_api.StarlarkRunResponseLine + 29, // 63: api_container_api.ApiContainerService.GetServices:output_type -> api_container_api.GetServicesResponse + 31, // 64: api_container_api.ApiContainerService.GetExistingAndHistoricalServiceIdentifiers:output_type -> api_container_api.GetExistingAndHistoricalServiceIdentifiersResponse + 33, // 65: api_container_api.ApiContainerService.ExecCommand:output_type -> api_container_api.ExecCommandResponse + 63, // 66: api_container_api.ApiContainerService.WaitForHttpGetEndpointAvailability:output_type -> google.protobuf.Empty + 63, // 67: api_container_api.ApiContainerService.WaitForHttpPostEndpointAvailability:output_type -> google.protobuf.Empty + 38, // 68: api_container_api.ApiContainerService.UploadFilesArtifact:output_type -> api_container_api.UploadFilesArtifactResponse + 36, // 69: api_container_api.ApiContainerService.DownloadFilesArtifact:output_type -> api_container_api.StreamedDataChunk + 41, // 70: api_container_api.ApiContainerService.StoreWebFilesArtifact:output_type -> api_container_api.StoreWebFilesArtifactResponse + 43, // 71: api_container_api.ApiContainerService.StoreFilesArtifactFromService:output_type -> api_container_api.StoreFilesArtifactFromServiceResponse + 45, // 72: api_container_api.ApiContainerService.ListFilesArtifactNamesAndUuids:output_type -> api_container_api.ListFilesArtifactNamesAndUuidsResponse + 47, // 73: api_container_api.ApiContainerService.InspectFilesArtifactContents:output_type -> api_container_api.InspectFilesArtifactContentsResponse + 50, // 74: api_container_api.ApiContainerService.ConnectServices:output_type -> api_container_api.ConnectServicesResponse + 51, // 75: api_container_api.ApiContainerService.GetStarlarkRun:output_type -> api_container_api.GetStarlarkRunResponse + 52, // 76: api_container_api.ApiContainerService.GetStarlarkScriptPlanYaml:output_type -> api_container_api.PlanYaml + 52, // 77: api_container_api.ApiContainerService.GetStarlarkPackagePlanYaml:output_type -> api_container_api.PlanYaml + 60, // [60:78] is the sub-list for method output_type + 42, // [42:60] is the sub-list for method input_type + 42, // [42:42] is the sub-list for extension type_name + 42, // [42:42] is the sub-list for extension extendee + 0, // [0:42] is the sub-list for field type_name } func init() { file_api_container_service_proto_init() } @@ -4608,7 +4846,7 @@ func file_api_container_service_proto_init() { } } file_api_container_service_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ServiceInfo); i { + switch v := v.(*User); i { case 0: return &v.state case 1: @@ -4620,7 +4858,7 @@ func file_api_container_service_proto_init() { } } file_api_container_service_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*RunStarlarkScriptArgs); i { + switch v := v.(*Toleration); i { case 0: return &v.state case 1: @@ -4632,7 +4870,7 @@ func file_api_container_service_proto_init() { } } file_api_container_service_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*RunStarlarkPackageArgs); i { + switch v := v.(*ServiceInfo); i { case 0: return &v.state case 1: @@ -4644,7 +4882,7 @@ func file_api_container_service_proto_init() { } } file_api_container_service_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*StarlarkRunResponseLine); i { + switch v := v.(*RunStarlarkScriptArgs); i { case 0: return &v.state case 1: @@ -4656,7 +4894,7 @@ func file_api_container_service_proto_init() { } } file_api_container_service_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*StarlarkInfo); i { + switch v := v.(*RunStarlarkPackageArgs); i { case 0: return &v.state case 1: @@ -4668,7 +4906,7 @@ func file_api_container_service_proto_init() { } } file_api_container_service_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*StarlarkWarning); i { + switch v := v.(*StarlarkRunResponseLine); i { case 0: return &v.state case 1: @@ -4680,7 +4918,7 @@ func file_api_container_service_proto_init() { } } file_api_container_service_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*StarlarkInstruction); i { + switch v := v.(*StarlarkInfo); i { case 0: return &v.state case 1: @@ -4692,7 +4930,7 @@ func file_api_container_service_proto_init() { } } file_api_container_service_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*StarlarkInstructionResult); i { + switch v := v.(*StarlarkWarning); i { case 0: return &v.state case 1: @@ -4704,7 +4942,7 @@ func file_api_container_service_proto_init() { } } file_api_container_service_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*StarlarkInstructionArg); i { + switch v := v.(*StarlarkInstruction); i { case 0: return &v.state case 1: @@ -4716,7 +4954,7 @@ func file_api_container_service_proto_init() { } } file_api_container_service_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*StarlarkInstructionPosition); i { + switch v := v.(*StarlarkInstructionResult); i { case 0: return &v.state case 1: @@ -4728,7 +4966,7 @@ func file_api_container_service_proto_init() { } } file_api_container_service_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*StarlarkError); i { + switch v := v.(*StarlarkInstructionArg); i { case 0: return &v.state case 1: @@ -4740,7 +4978,7 @@ func file_api_container_service_proto_init() { } } file_api_container_service_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*StarlarkInterpretationError); i { + switch v := v.(*StarlarkInstructionPosition); i { case 0: return &v.state case 1: @@ -4752,7 +4990,7 @@ func file_api_container_service_proto_init() { } } file_api_container_service_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*StarlarkValidationError); i { + switch v := v.(*StarlarkError); i { case 0: return &v.state case 1: @@ -4764,7 +5002,7 @@ func file_api_container_service_proto_init() { } } file_api_container_service_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*StarlarkExecutionError); i { + switch v := v.(*StarlarkInterpretationError); i { case 0: return &v.state case 1: @@ -4776,7 +5014,7 @@ func file_api_container_service_proto_init() { } } file_api_container_service_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*StarlarkRunProgress); i { + switch v := v.(*StarlarkValidationError); i { case 0: return &v.state case 1: @@ -4788,7 +5026,7 @@ func file_api_container_service_proto_init() { } } file_api_container_service_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*StarlarkRunFinishedEvent); i { + switch v := v.(*StarlarkExecutionError); i { case 0: return &v.state case 1: @@ -4800,7 +5038,7 @@ func file_api_container_service_proto_init() { } } file_api_container_service_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetServicesArgs); i { + switch v := v.(*StarlarkRunProgress); i { case 0: return &v.state case 1: @@ -4812,7 +5050,7 @@ func file_api_container_service_proto_init() { } } file_api_container_service_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetServicesResponse); i { + switch v := v.(*StarlarkRunFinishedEvent); i { case 0: return &v.state case 1: @@ -4824,7 +5062,7 @@ func file_api_container_service_proto_init() { } } file_api_container_service_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ServiceIdentifiers); i { + switch v := v.(*GetServicesArgs); i { case 0: return &v.state case 1: @@ -4836,7 +5074,7 @@ func file_api_container_service_proto_init() { } } file_api_container_service_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetExistingAndHistoricalServiceIdentifiersResponse); i { + switch v := v.(*GetServicesResponse); i { case 0: return &v.state case 1: @@ -4848,7 +5086,7 @@ func file_api_container_service_proto_init() { } } file_api_container_service_proto_msgTypes[23].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ExecCommandArgs); i { + switch v := v.(*ServiceIdentifiers); i { case 0: return &v.state case 1: @@ -4860,7 +5098,7 @@ func file_api_container_service_proto_init() { } } file_api_container_service_proto_msgTypes[24].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ExecCommandResponse); i { + switch v := v.(*GetExistingAndHistoricalServiceIdentifiersResponse); i { case 0: return &v.state case 1: @@ -4872,7 +5110,7 @@ func file_api_container_service_proto_init() { } } file_api_container_service_proto_msgTypes[25].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*WaitForHttpGetEndpointAvailabilityArgs); i { + switch v := v.(*ExecCommandArgs); i { case 0: return &v.state case 1: @@ -4884,7 +5122,7 @@ func file_api_container_service_proto_init() { } } file_api_container_service_proto_msgTypes[26].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*WaitForHttpPostEndpointAvailabilityArgs); i { + switch v := v.(*ExecCommandResponse); i { case 0: return &v.state case 1: @@ -4896,7 +5134,7 @@ func file_api_container_service_proto_init() { } } file_api_container_service_proto_msgTypes[27].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*StreamedDataChunk); i { + switch v := v.(*WaitForHttpGetEndpointAvailabilityArgs); i { case 0: return &v.state case 1: @@ -4908,7 +5146,7 @@ func file_api_container_service_proto_init() { } } file_api_container_service_proto_msgTypes[28].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DataChunkMetadata); i { + switch v := v.(*WaitForHttpPostEndpointAvailabilityArgs); i { case 0: return &v.state case 1: @@ -4920,7 +5158,7 @@ func file_api_container_service_proto_init() { } } file_api_container_service_proto_msgTypes[29].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UploadFilesArtifactResponse); i { + switch v := v.(*StreamedDataChunk); i { case 0: return &v.state case 1: @@ -4932,7 +5170,7 @@ func file_api_container_service_proto_init() { } } file_api_container_service_proto_msgTypes[30].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DownloadFilesArtifactArgs); i { + switch v := v.(*DataChunkMetadata); i { case 0: return &v.state case 1: @@ -4944,7 +5182,7 @@ func file_api_container_service_proto_init() { } } file_api_container_service_proto_msgTypes[31].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*StoreWebFilesArtifactArgs); i { + switch v := v.(*UploadFilesArtifactResponse); i { case 0: return &v.state case 1: @@ -4956,7 +5194,7 @@ func file_api_container_service_proto_init() { } } file_api_container_service_proto_msgTypes[32].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*StoreWebFilesArtifactResponse); i { + switch v := v.(*DownloadFilesArtifactArgs); i { case 0: return &v.state case 1: @@ -4968,7 +5206,7 @@ func file_api_container_service_proto_init() { } } file_api_container_service_proto_msgTypes[33].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*StoreFilesArtifactFromServiceArgs); i { + switch v := v.(*StoreWebFilesArtifactArgs); i { case 0: return &v.state case 1: @@ -4980,7 +5218,7 @@ func file_api_container_service_proto_init() { } } file_api_container_service_proto_msgTypes[34].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*StoreFilesArtifactFromServiceResponse); i { + switch v := v.(*StoreWebFilesArtifactResponse); i { case 0: return &v.state case 1: @@ -4992,7 +5230,7 @@ func file_api_container_service_proto_init() { } } file_api_container_service_proto_msgTypes[35].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*FilesArtifactNameAndUuid); i { + switch v := v.(*StoreFilesArtifactFromServiceArgs); i { case 0: return &v.state case 1: @@ -5004,7 +5242,7 @@ func file_api_container_service_proto_init() { } } file_api_container_service_proto_msgTypes[36].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListFilesArtifactNamesAndUuidsResponse); i { + switch v := v.(*StoreFilesArtifactFromServiceResponse); i { case 0: return &v.state case 1: @@ -5016,7 +5254,7 @@ func file_api_container_service_proto_init() { } } file_api_container_service_proto_msgTypes[37].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*InspectFilesArtifactContentsRequest); i { + switch v := v.(*FilesArtifactNameAndUuid); i { case 0: return &v.state case 1: @@ -5028,7 +5266,7 @@ func file_api_container_service_proto_init() { } } file_api_container_service_proto_msgTypes[38].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*InspectFilesArtifactContentsResponse); i { + switch v := v.(*ListFilesArtifactNamesAndUuidsResponse); i { case 0: return &v.state case 1: @@ -5040,7 +5278,7 @@ func file_api_container_service_proto_init() { } } file_api_container_service_proto_msgTypes[39].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*FileArtifactContentsFileDescription); i { + switch v := v.(*InspectFilesArtifactContentsRequest); i { case 0: return &v.state case 1: @@ -5052,7 +5290,7 @@ func file_api_container_service_proto_init() { } } file_api_container_service_proto_msgTypes[40].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ConnectServicesArgs); i { + switch v := v.(*InspectFilesArtifactContentsResponse); i { case 0: return &v.state case 1: @@ -5064,7 +5302,7 @@ func file_api_container_service_proto_init() { } } file_api_container_service_proto_msgTypes[41].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ConnectServicesResponse); i { + switch v := v.(*FileArtifactContentsFileDescription); i { case 0: return &v.state case 1: @@ -5076,7 +5314,7 @@ func file_api_container_service_proto_init() { } } file_api_container_service_proto_msgTypes[42].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetStarlarkRunResponse); i { + switch v := v.(*ConnectServicesArgs); i { case 0: return &v.state case 1: @@ -5088,7 +5326,7 @@ func file_api_container_service_proto_init() { } } file_api_container_service_proto_msgTypes[43].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PlanYaml); i { + switch v := v.(*ConnectServicesResponse); i { case 0: return &v.state case 1: @@ -5100,7 +5338,7 @@ func file_api_container_service_proto_init() { } } file_api_container_service_proto_msgTypes[44].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*StarlarkScriptPlanYamlArgs); i { + switch v := v.(*GetStarlarkRunResponse); i { case 0: return &v.state case 1: @@ -5112,6 +5350,30 @@ func file_api_container_service_proto_init() { } } file_api_container_service_proto_msgTypes[45].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*PlanYaml); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_container_service_proto_msgTypes[46].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*StarlarkScriptPlanYamlArgs); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_container_service_proto_msgTypes[47].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*StarlarkPackagePlanYamlArgs); i { case 0: return &v.state @@ -5125,12 +5387,13 @@ func file_api_container_service_proto_init() { } } file_api_container_service_proto_msgTypes[0].OneofWrappers = []interface{}{} - file_api_container_service_proto_msgTypes[4].OneofWrappers = []interface{}{} - file_api_container_service_proto_msgTypes[5].OneofWrappers = []interface{}{ + file_api_container_service_proto_msgTypes[5].OneofWrappers = []interface{}{} + file_api_container_service_proto_msgTypes[6].OneofWrappers = []interface{}{} + file_api_container_service_proto_msgTypes[7].OneofWrappers = []interface{}{ (*RunStarlarkPackageArgs_Local)(nil), (*RunStarlarkPackageArgs_Remote)(nil), } - file_api_container_service_proto_msgTypes[6].OneofWrappers = []interface{}{ + file_api_container_service_proto_msgTypes[8].OneofWrappers = []interface{}{ (*StarlarkRunResponseLine_Instruction)(nil), (*StarlarkRunResponseLine_Error)(nil), (*StarlarkRunResponseLine_ProgressInfo)(nil), @@ -5139,26 +5402,26 @@ func file_api_container_service_proto_init() { (*StarlarkRunResponseLine_Warning)(nil), (*StarlarkRunResponseLine_Info)(nil), } - file_api_container_service_proto_msgTypes[11].OneofWrappers = []interface{}{} - file_api_container_service_proto_msgTypes[13].OneofWrappers = []interface{}{ + file_api_container_service_proto_msgTypes[13].OneofWrappers = []interface{}{} + file_api_container_service_proto_msgTypes[15].OneofWrappers = []interface{}{ (*StarlarkError_InterpretationError)(nil), (*StarlarkError_ValidationError)(nil), (*StarlarkError_ExecutionError)(nil), } - file_api_container_service_proto_msgTypes[18].OneofWrappers = []interface{}{} - file_api_container_service_proto_msgTypes[25].OneofWrappers = []interface{}{} - file_api_container_service_proto_msgTypes[26].OneofWrappers = []interface{}{} - file_api_container_service_proto_msgTypes[39].OneofWrappers = []interface{}{} - file_api_container_service_proto_msgTypes[42].OneofWrappers = []interface{}{} + file_api_container_service_proto_msgTypes[20].OneofWrappers = []interface{}{} + file_api_container_service_proto_msgTypes[27].OneofWrappers = []interface{}{} + file_api_container_service_proto_msgTypes[28].OneofWrappers = []interface{}{} + file_api_container_service_proto_msgTypes[41].OneofWrappers = []interface{}{} file_api_container_service_proto_msgTypes[44].OneofWrappers = []interface{}{} - file_api_container_service_proto_msgTypes[45].OneofWrappers = []interface{}{} + file_api_container_service_proto_msgTypes[46].OneofWrappers = []interface{}{} + file_api_container_service_proto_msgTypes[47].OneofWrappers = []interface{}{} type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_api_container_service_proto_rawDesc, NumEnums: 7, - NumMessages: 52, + NumMessages: 56, NumExtensions: 0, NumServices: 1, }, diff --git a/api/golang/core/lib/binding_constructors/binding_constructors.go b/api/golang/core/lib/binding_constructors/binding_constructors.go index 3296480c28..33b9f212f7 100644 --- a/api/golang/core/lib/binding_constructors/binding_constructors.go +++ b/api/golang/core/lib/binding_constructors/binding_constructors.go @@ -370,20 +370,20 @@ func NewServiceInfo( ) *kurtosis_core_rpc_api_bindings.ServiceInfo { return &kurtosis_core_rpc_api_bindings.ServiceInfo{ - ServiceUuid: uuid, - Name: name, - ShortenedUuid: shortenedUuid, - PrivateIpAddr: privateIpAddr, - PrivatePorts: privatePorts, - MaybePublicIpAddr: maybePublicIpAddr, - MaybePublicPorts: maybePublicPorts, - ServiceStatus: serviceStatus, - Container: container, - ServiceDirPathsToFilesArtifactsIdentifiers: serviceDirPathsToFilesArtifactsList, - MaxMillicpus: maxMillicpus, - MinMillicpus: minMillicpus, - MaxMemoryMegabytes: maxMemoryMegabytes, - MinMemoryMegabytes: minMemoryMegabytes, + ServiceUuid: uuid, + Name: name, + ShortenedUuid: shortenedUuid, + PrivateIpAddr: privateIpAddr, + PrivatePorts: privatePorts, + MaybePublicIpAddr: maybePublicIpAddr, + MaybePublicPorts: maybePublicPorts, + ServiceStatus: serviceStatus, + Container: container, + ServiceDirPathsToFilesArtifactsList: serviceDirPathsToFilesArtifactsList, + MaxMillicpus: maxMillicpus, + MinMillicpus: minMillicpus, + MaxMemoryMegabytes: maxMemoryMegabytes, + MinMemoryMegabytes: minMemoryMegabytes, } } diff --git a/api/golang/core/lib/services/service_config_builder.go b/api/golang/core/lib/services/service_config_builder.go index 2483154c2d..b171fb876e 100644 --- a/api/golang/core/lib/services/service_config_builder.go +++ b/api/golang/core/lib/services/service_config_builder.go @@ -17,8 +17,8 @@ type Port struct { } type User struct { - UID int `json:"uid" yaml:"uid"` - GID int `json:"gid,omitempty" yaml:"gid,omitempty"` + UID uint32 `json:"uid" yaml:"uid"` + GID uint32 `json:"gid,omitempty" yaml:"gid,omitempty"` } type Toleration struct { @@ -277,3 +277,47 @@ func ConvertJsonPortToApiPort(jsonPorts map[string]Port) map[string]*kurtosis_co } return apiPorts } + +func ConvertApiPortToJsonPort(apiPorts map[string]*kurtosis_core_rpc_api_bindings.Port) map[string]Port { + jsonPorts := map[string]Port{} + for portId, apiPort := range apiPorts { + jsonPort := Port{ + Number: apiPort.GetNumber(), + Transport: int(apiPort.TransportProtocol), + MaybeApplicationProtocol: apiPort.GetMaybeApplicationProtocol(), + Wait: apiPort.GetMaybeWaitTimeout(), + } + jsonPorts[portId] = jsonPort + } + return jsonPorts +} + +func ConvertApiFilesArtifactsToJsonFiles(serviceDirPathsToFilesArtifactsList map[string]*kurtosis_core_rpc_api_bindings.FilesArtifactsList) map[string]string { + serviceDirPathsToFilesArtifacts := map[string]string{} + for serviceDirPath, filesArtifactsList := range serviceDirPathsToFilesArtifactsList { + filesArtifactsIdentifers := filesArtifactsList.GetFilesArtifactsIdentifiers() + serviceDirPathsToFilesArtifacts[serviceDirPath] = filesArtifactsIdentifers[0] + } + return serviceDirPathsToFilesArtifacts +} + +func ConvertApiUserToJsonUser(user *kurtosis_core_rpc_api_bindings.User) *User { + return &User{ + UID: user.GetUid(), + GID: user.GetGid(), + } +} + +func ConvertApiTolerationsToJsonTolerations(tolerations []*kurtosis_core_rpc_api_bindings.Toleration) []Toleration { + jsonTolerations := []Toleration{} + for _, apiToleration := range tolerations { + jsonTolerations = append(jsonTolerations, Toleration{ + Key: apiToleration.GetKey(), + Value: apiToleration.GetValue(), + Operator: apiToleration.GetOperator(), + Effect: apiToleration.GetEffect(), + TolerationSeconds: apiToleration.GetTolerationSeconds(), + }) + } + return jsonTolerations +} diff --git a/api/protobuf/core/api_container_service.proto b/api/protobuf/core/api_container_service.proto index 13c2663017..e83dd00868 100644 --- a/api/protobuf/core/api_container_service.proto +++ b/api/protobuf/core/api_container_service.proto @@ -118,7 +118,9 @@ message FilesArtifactsList { // Equivalent of user on ServiceConfig message User { string username = 1; + uint32 uid = 2; + uint32 gid = 3; } diff --git a/api/rust/src/api_container_api.rs b/api/rust/src/api_container_api.rs index b46bd9ce98..a759ab68ac 100644 --- a/api/rust/src/api_container_api.rs +++ b/api/rust/src/api_container_api.rs @@ -130,6 +130,32 @@ pub struct FilesArtifactsList { ::prost::alloc::string::String, >, } +/// Equivalent of user on ServiceConfig +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct User { + #[prost(string, tag = "1")] + pub username: ::prost::alloc::string::String, + #[prost(uint32, tag = "2")] + pub uid: u32, + #[prost(uint32, tag = "3")] + pub gid: u32, +} +/// Equivalent of tolerations on ServiceConfig +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct Toleration { + #[prost(string, tag = "1")] + pub key: ::prost::alloc::string::String, + #[prost(string, tag = "2")] + pub operator: ::prost::alloc::string::String, + #[prost(string, tag = "3")] + pub value: ::prost::alloc::string::String, + #[prost(string, tag = "4")] + pub effect: ::prost::alloc::string::String, + #[prost(int64, tag = "5")] + pub toleration_seconds: i64, +} #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct ServiceInfo { @@ -169,7 +195,7 @@ pub struct ServiceInfo { pub container: ::core::option::Option, /// Mapping of directory paths on service to names of files artifacts that are mounted to that directory #[prost(map = "string, message", tag = "10")] - pub service_dir_paths_to_files_artifacts_identifiers: ::std::collections::HashMap< + pub service_dir_paths_to_files_artifacts_list: ::std::collections::HashMap< ::prost::alloc::string::String, FilesArtifactsList, >, @@ -181,6 +207,27 @@ pub struct ServiceInfo { pub max_memory_megabytes: u32, #[prost(uint32, tag = "14")] pub min_memory_megabytes: u32, + /// Optional user identity for the service + #[prost(message, optional, tag = "15")] + pub user: ::core::option::Option, + /// Optional list of Kubernetes tolerations + #[prost(message, repeated, tag = "16")] + pub tolerations: ::prost::alloc::vec::Vec, + /// Optional node selectors for pod placement + #[prost(map = "string, string", tag = "17")] + pub node_selectors: ::std::collections::HashMap< + ::prost::alloc::string::String, + ::prost::alloc::string::String, + >, + /// Optional labels + #[prost(map = "string, string", tag = "18")] + pub labels: ::std::collections::HashMap< + ::prost::alloc::string::String, + ::prost::alloc::string::String, + >, + /// Whether Tini is enabled + #[prost(bool, optional, tag = "19")] + pub tini_enabled: ::core::option::Option, } #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] diff --git a/api/typescript/src/core/kurtosis_core_rpc_api_bindings/api_container_service_pb.d.ts b/api/typescript/src/core/kurtosis_core_rpc_api_bindings/api_container_service_pb.d.ts index 5cbee7ef97..5370cb79ad 100644 --- a/api/typescript/src/core/kurtosis_core_rpc_api_bindings/api_container_service_pb.d.ts +++ b/api/typescript/src/core/kurtosis_core_rpc_api_bindings/api_container_service_pb.d.ts @@ -125,6 +125,66 @@ export namespace FilesArtifactsList { } } +export class User extends jspb.Message { + getUsername(): string; + setUsername(value: string): User; + + getUid(): number; + setUid(value: number): User; + + getGid(): number; + setGid(value: number): User; + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): User.AsObject; + static toObject(includeInstance: boolean, msg: User): User.AsObject; + static serializeBinaryToWriter(message: User, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): User; + static deserializeBinaryFromReader(message: User, reader: jspb.BinaryReader): User; +} + +export namespace User { + export type AsObject = { + username: string, + uid: number, + gid: number, + } +} + +export class Toleration extends jspb.Message { + getKey(): string; + setKey(value: string): Toleration; + + getOperator(): string; + setOperator(value: string): Toleration; + + getValue(): string; + setValue(value: string): Toleration; + + getEffect(): string; + setEffect(value: string): Toleration; + + getTolerationSeconds(): number; + setTolerationSeconds(value: number): Toleration; + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): Toleration.AsObject; + static toObject(includeInstance: boolean, msg: Toleration): Toleration.AsObject; + static serializeBinaryToWriter(message: Toleration, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): Toleration; + static deserializeBinaryFromReader(message: Toleration, reader: jspb.BinaryReader): Toleration; +} + +export namespace Toleration { + export type AsObject = { + key: string, + operator: string, + value: string, + effect: string, + tolerationSeconds: number, + } +} + export class ServiceInfo extends jspb.Message { getServiceUuid(): string; setServiceUuid(value: string): ServiceInfo; @@ -155,8 +215,8 @@ export class ServiceInfo extends jspb.Message { hasContainer(): boolean; clearContainer(): ServiceInfo; - getServiceDirPathsToFilesArtifactsIdentifiersMap(): jspb.Map; - clearServiceDirPathsToFilesArtifactsIdentifiersMap(): ServiceInfo; + getServiceDirPathsToFilesArtifactsListMap(): jspb.Map; + clearServiceDirPathsToFilesArtifactsListMap(): ServiceInfo; getMaxMillicpus(): number; setMaxMillicpus(value: number): ServiceInfo; @@ -170,6 +230,27 @@ export class ServiceInfo extends jspb.Message { getMinMemoryMegabytes(): number; setMinMemoryMegabytes(value: number): ServiceInfo; + getUser(): User | undefined; + setUser(value?: User): ServiceInfo; + hasUser(): boolean; + clearUser(): ServiceInfo; + + getTolerationsList(): Array; + setTolerationsList(value: Array): ServiceInfo; + clearTolerationsList(): ServiceInfo; + addTolerations(value?: Toleration, index?: number): Toleration; + + getNodeSelectorsMap(): jspb.Map; + clearNodeSelectorsMap(): ServiceInfo; + + getLabelsMap(): jspb.Map; + clearLabelsMap(): ServiceInfo; + + getTiniEnabled(): boolean; + setTiniEnabled(value: boolean): ServiceInfo; + hasTiniEnabled(): boolean; + clearTiniEnabled(): ServiceInfo; + serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): ServiceInfo.AsObject; static toObject(includeInstance: boolean, msg: ServiceInfo): ServiceInfo.AsObject; @@ -189,11 +270,26 @@ export namespace ServiceInfo { shortenedUuid: string, serviceStatus: ServiceStatus, container?: Container.AsObject, - serviceDirPathsToFilesArtifactsIdentifiersMap: Array<[string, FilesArtifactsList.AsObject]>, + serviceDirPathsToFilesArtifactsListMap: Array<[string, FilesArtifactsList.AsObject]>, maxMillicpus: number, minMillicpus: number, maxMemoryMegabytes: number, minMemoryMegabytes: number, + user?: User.AsObject, + tolerationsList: Array, + nodeSelectorsMap: Array<[string, string]>, + labelsMap: Array<[string, string]>, + tiniEnabled?: boolean, + } + + export enum UserCase { + _USER_NOT_SET = 0, + USER = 15, + } + + export enum TiniEnabledCase { + _TINI_ENABLED_NOT_SET = 0, + TINI_ENABLED = 19, } } diff --git a/api/typescript/src/core/kurtosis_core_rpc_api_bindings/api_container_service_pb.js b/api/typescript/src/core/kurtosis_core_rpc_api_bindings/api_container_service_pb.js index a6e452aa92..a15ba6e760 100644 --- a/api/typescript/src/core/kurtosis_core_rpc_api_bindings/api_container_service_pb.js +++ b/api/typescript/src/core/kurtosis_core_rpc_api_bindings/api_container_service_pb.js @@ -76,7 +76,9 @@ goog.exportSymbol('proto.api_container_api.StoreFilesArtifactFromServiceResponse goog.exportSymbol('proto.api_container_api.StoreWebFilesArtifactArgs', null, global); goog.exportSymbol('proto.api_container_api.StoreWebFilesArtifactResponse', null, global); goog.exportSymbol('proto.api_container_api.StreamedDataChunk', null, global); +goog.exportSymbol('proto.api_container_api.Toleration', null, global); goog.exportSymbol('proto.api_container_api.UploadFilesArtifactResponse', null, global); +goog.exportSymbol('proto.api_container_api.User', null, global); goog.exportSymbol('proto.api_container_api.WaitForHttpGetEndpointAvailabilityArgs', null, global); goog.exportSymbol('proto.api_container_api.WaitForHttpPostEndpointAvailabilityArgs', null, global); /** @@ -152,9 +154,51 @@ if (goog.DEBUG && !COMPILED) { * @extends {jspb.Message} * @constructor */ -proto.api_container_api.ServiceInfo = function(opt_data) { +proto.api_container_api.User = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); +}; +goog.inherits(proto.api_container_api.User, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.api_container_api.User.displayName = 'proto.api_container_api.User'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.api_container_api.Toleration = function(opt_data) { jspb.Message.initialize(this, opt_data, 0, -1, null, null); }; +goog.inherits(proto.api_container_api.Toleration, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.api_container_api.Toleration.displayName = 'proto.api_container_api.Toleration'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.api_container_api.ServiceInfo = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, proto.api_container_api.ServiceInfo.repeatedFields_, null); +}; goog.inherits(proto.api_container_api.ServiceInfo, jspb.Message); if (goog.DEBUG && !COMPILED) { /** @@ -1849,8 +1893,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.api_container_api.ServiceInfo.prototype.toObject = function(opt_includeInstance) { - return proto.api_container_api.ServiceInfo.toObject(opt_includeInstance, this); +proto.api_container_api.User.prototype.toObject = function(opt_includeInstance) { + return proto.api_container_api.User.toObject(opt_includeInstance, this); }; @@ -1859,26 +1903,15 @@ proto.api_container_api.ServiceInfo.prototype.toObject = function(opt_includeIns * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.api_container_api.ServiceInfo} msg The msg instance to transform. + * @param {!proto.api_container_api.User} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.api_container_api.ServiceInfo.toObject = function(includeInstance, msg) { +proto.api_container_api.User.toObject = function(includeInstance, msg) { var f, obj = { - serviceUuid: jspb.Message.getFieldWithDefault(msg, 1, ""), - privateIpAddr: jspb.Message.getFieldWithDefault(msg, 2, ""), - privatePortsMap: (f = msg.getPrivatePortsMap()) ? f.toObject(includeInstance, proto.api_container_api.Port.toObject) : [], - maybePublicIpAddr: jspb.Message.getFieldWithDefault(msg, 4, ""), - maybePublicPortsMap: (f = msg.getMaybePublicPortsMap()) ? f.toObject(includeInstance, proto.api_container_api.Port.toObject) : [], - name: jspb.Message.getFieldWithDefault(msg, 6, ""), - shortenedUuid: jspb.Message.getFieldWithDefault(msg, 7, ""), - serviceStatus: jspb.Message.getFieldWithDefault(msg, 8, 0), - container: (f = msg.getContainer()) && proto.api_container_api.Container.toObject(includeInstance, f), - serviceDirPathsToFilesArtifactsIdentifiersMap: (f = msg.getServiceDirPathsToFilesArtifactsIdentifiersMap()) ? f.toObject(includeInstance, proto.api_container_api.FilesArtifactsList.toObject) : [], - maxMillicpus: jspb.Message.getFieldWithDefault(msg, 11, 0), - minMillicpus: jspb.Message.getFieldWithDefault(msg, 12, 0), - maxMemoryMegabytes: jspb.Message.getFieldWithDefault(msg, 13, 0), - minMemoryMegabytes: jspb.Message.getFieldWithDefault(msg, 14, 0) + username: jspb.Message.getFieldWithDefault(msg, 1, ""), + uid: jspb.Message.getFieldWithDefault(msg, 2, 0), + gid: jspb.Message.getFieldWithDefault(msg, 3, 0) }; if (includeInstance) { @@ -1892,23 +1925,23 @@ proto.api_container_api.ServiceInfo.toObject = function(includeInstance, msg) { /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.api_container_api.ServiceInfo} + * @return {!proto.api_container_api.User} */ -proto.api_container_api.ServiceInfo.deserializeBinary = function(bytes) { +proto.api_container_api.User.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.api_container_api.ServiceInfo; - return proto.api_container_api.ServiceInfo.deserializeBinaryFromReader(msg, reader); + var msg = new proto.api_container_api.User; + return proto.api_container_api.User.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.api_container_api.ServiceInfo} msg The message object to deserialize into. + * @param {!proto.api_container_api.User} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.api_container_api.ServiceInfo} + * @return {!proto.api_container_api.User} */ -proto.api_container_api.ServiceInfo.deserializeBinaryFromReader = function(msg, reader) { +proto.api_container_api.User.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -1917,66 +1950,15 @@ proto.api_container_api.ServiceInfo.deserializeBinaryFromReader = function(msg, switch (field) { case 1: var value = /** @type {string} */ (reader.readString()); - msg.setServiceUuid(value); + msg.setUsername(value); break; case 2: - var value = /** @type {string} */ (reader.readString()); - msg.setPrivateIpAddr(value); - break; - case 3: - var value = msg.getPrivatePortsMap(); - reader.readMessage(value, function(message, reader) { - jspb.Map.deserializeBinary(message, reader, jspb.BinaryReader.prototype.readString, jspb.BinaryReader.prototype.readMessage, proto.api_container_api.Port.deserializeBinaryFromReader, "", new proto.api_container_api.Port()); - }); - break; - case 4: - var value = /** @type {string} */ (reader.readString()); - msg.setMaybePublicIpAddr(value); - break; - case 5: - var value = msg.getMaybePublicPortsMap(); - reader.readMessage(value, function(message, reader) { - jspb.Map.deserializeBinary(message, reader, jspb.BinaryReader.prototype.readString, jspb.BinaryReader.prototype.readMessage, proto.api_container_api.Port.deserializeBinaryFromReader, "", new proto.api_container_api.Port()); - }); - break; - case 6: - var value = /** @type {string} */ (reader.readString()); - msg.setName(value); - break; - case 7: - var value = /** @type {string} */ (reader.readString()); - msg.setShortenedUuid(value); - break; - case 8: - var value = /** @type {!proto.api_container_api.ServiceStatus} */ (reader.readEnum()); - msg.setServiceStatus(value); - break; - case 9: - var value = new proto.api_container_api.Container; - reader.readMessage(value,proto.api_container_api.Container.deserializeBinaryFromReader); - msg.setContainer(value); - break; - case 10: - var value = msg.getServiceDirPathsToFilesArtifactsIdentifiersMap(); - reader.readMessage(value, function(message, reader) { - jspb.Map.deserializeBinary(message, reader, jspb.BinaryReader.prototype.readString, jspb.BinaryReader.prototype.readMessage, proto.api_container_api.FilesArtifactsList.deserializeBinaryFromReader, "", new proto.api_container_api.FilesArtifactsList()); - }); - break; - case 11: - var value = /** @type {number} */ (reader.readUint32()); - msg.setMaxMillicpus(value); - break; - case 12: - var value = /** @type {number} */ (reader.readUint32()); - msg.setMinMillicpus(value); - break; - case 13: var value = /** @type {number} */ (reader.readUint32()); - msg.setMaxMemoryMegabytes(value); + msg.setUid(value); break; - case 14: + case 3: var value = /** @type {number} */ (reader.readUint32()); - msg.setMinMemoryMegabytes(value); + msg.setGid(value); break; default: reader.skipField(); @@ -1991,9 +1973,9 @@ proto.api_container_api.ServiceInfo.deserializeBinaryFromReader = function(msg, * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.api_container_api.ServiceInfo.prototype.serializeBinary = function() { +proto.api_container_api.User.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.api_container_api.ServiceInfo.serializeBinaryToWriter(this, writer); + proto.api_container_api.User.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -2001,99 +1983,30 @@ proto.api_container_api.ServiceInfo.prototype.serializeBinary = function() { /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.api_container_api.ServiceInfo} message + * @param {!proto.api_container_api.User} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.api_container_api.ServiceInfo.serializeBinaryToWriter = function(message, writer) { +proto.api_container_api.User.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getServiceUuid(); + f = message.getUsername(); if (f.length > 0) { writer.writeString( 1, f ); } - f = message.getPrivateIpAddr(); - if (f.length > 0) { - writer.writeString( - 2, - f - ); - } - f = message.getPrivatePortsMap(true); - if (f && f.getLength() > 0) { - f.serializeBinary(3, writer, jspb.BinaryWriter.prototype.writeString, jspb.BinaryWriter.prototype.writeMessage, proto.api_container_api.Port.serializeBinaryToWriter); - } - f = message.getMaybePublicIpAddr(); - if (f.length > 0) { - writer.writeString( - 4, - f - ); - } - f = message.getMaybePublicPortsMap(true); - if (f && f.getLength() > 0) { - f.serializeBinary(5, writer, jspb.BinaryWriter.prototype.writeString, jspb.BinaryWriter.prototype.writeMessage, proto.api_container_api.Port.serializeBinaryToWriter); - } - f = message.getName(); - if (f.length > 0) { - writer.writeString( - 6, - f - ); - } - f = message.getShortenedUuid(); - if (f.length > 0) { - writer.writeString( - 7, - f - ); - } - f = message.getServiceStatus(); - if (f !== 0.0) { - writer.writeEnum( - 8, - f - ); - } - f = message.getContainer(); - if (f != null) { - writer.writeMessage( - 9, - f, - proto.api_container_api.Container.serializeBinaryToWriter - ); - } - f = message.getServiceDirPathsToFilesArtifactsIdentifiersMap(true); - if (f && f.getLength() > 0) { - f.serializeBinary(10, writer, jspb.BinaryWriter.prototype.writeString, jspb.BinaryWriter.prototype.writeMessage, proto.api_container_api.FilesArtifactsList.serializeBinaryToWriter); - } - f = message.getMaxMillicpus(); - if (f !== 0) { - writer.writeUint32( - 11, - f - ); - } - f = message.getMinMillicpus(); - if (f !== 0) { - writer.writeUint32( - 12, - f - ); - } - f = message.getMaxMemoryMegabytes(); + f = message.getUid(); if (f !== 0) { writer.writeUint32( - 13, + 2, f ); } - f = message.getMinMemoryMegabytes(); + f = message.getGid(); if (f !== 0) { writer.writeUint32( - 14, + 3, f ); } @@ -2101,87 +2014,728 @@ proto.api_container_api.ServiceInfo.serializeBinaryToWriter = function(message, /** - * optional string service_uuid = 1; + * optional string username = 1; * @return {string} */ -proto.api_container_api.ServiceInfo.prototype.getServiceUuid = function() { +proto.api_container_api.User.prototype.getUsername = function() { return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); }; /** * @param {string} value - * @return {!proto.api_container_api.ServiceInfo} returns this + * @return {!proto.api_container_api.User} returns this */ -proto.api_container_api.ServiceInfo.prototype.setServiceUuid = function(value) { +proto.api_container_api.User.prototype.setUsername = function(value) { return jspb.Message.setProto3StringField(this, 1, value); }; /** - * optional string private_ip_addr = 2; - * @return {string} + * optional uint32 uid = 2; + * @return {number} */ -proto.api_container_api.ServiceInfo.prototype.getPrivateIpAddr = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, "")); +proto.api_container_api.User.prototype.getUid = function() { + return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 2, 0)); }; /** - * @param {string} value - * @return {!proto.api_container_api.ServiceInfo} returns this + * @param {number} value + * @return {!proto.api_container_api.User} returns this */ -proto.api_container_api.ServiceInfo.prototype.setPrivateIpAddr = function(value) { - return jspb.Message.setProto3StringField(this, 2, value); +proto.api_container_api.User.prototype.setUid = function(value) { + return jspb.Message.setProto3IntField(this, 2, value); }; /** - * map private_ports = 3; - * @param {boolean=} opt_noLazyCreate Do not create the map if - * empty, instead returning `undefined` - * @return {!jspb.Map} + * optional uint32 gid = 3; + * @return {number} */ -proto.api_container_api.ServiceInfo.prototype.getPrivatePortsMap = function(opt_noLazyCreate) { - return /** @type {!jspb.Map} */ ( - jspb.Message.getMapField(this, 3, opt_noLazyCreate, - proto.api_container_api.Port)); +proto.api_container_api.User.prototype.getGid = function() { + return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 3, 0)); }; /** - * Clears values from the map. The map will be non-null. - * @return {!proto.api_container_api.ServiceInfo} returns this + * @param {number} value + * @return {!proto.api_container_api.User} returns this */ -proto.api_container_api.ServiceInfo.prototype.clearPrivatePortsMap = function() { - this.getPrivatePortsMap().clear(); - return this;}; +proto.api_container_api.User.prototype.setGid = function(value) { + return jspb.Message.setProto3IntField(this, 3, value); +}; + -/** - * optional string maybe_public_ip_addr = 4; - * @return {string} - */ -proto.api_container_api.ServiceInfo.prototype.getMaybePublicIpAddr = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 4, "")); -}; +if (jspb.Message.GENERATE_TO_OBJECT) { /** - * @param {string} value - * @return {!proto.api_container_api.ServiceInfo} returns this + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} */ -proto.api_container_api.ServiceInfo.prototype.setMaybePublicIpAddr = function(value) { - return jspb.Message.setProto3StringField(this, 4, value); +proto.api_container_api.Toleration.prototype.toObject = function(opt_includeInstance) { + return proto.api_container_api.Toleration.toObject(opt_includeInstance, this); }; /** - * map maybe_public_ports = 5; - * @param {boolean=} opt_noLazyCreate Do not create the map if - * empty, instead returning `undefined` - * @return {!jspb.Map} - */ + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.api_container_api.Toleration} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.api_container_api.Toleration.toObject = function(includeInstance, msg) { + var f, obj = { + key: jspb.Message.getFieldWithDefault(msg, 1, ""), + operator: jspb.Message.getFieldWithDefault(msg, 2, ""), + value: jspb.Message.getFieldWithDefault(msg, 3, ""), + effect: jspb.Message.getFieldWithDefault(msg, 4, ""), + tolerationSeconds: jspb.Message.getFieldWithDefault(msg, 5, 0) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.api_container_api.Toleration} + */ +proto.api_container_api.Toleration.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.api_container_api.Toleration; + return proto.api_container_api.Toleration.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.api_container_api.Toleration} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.api_container_api.Toleration} + */ +proto.api_container_api.Toleration.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {string} */ (reader.readString()); + msg.setKey(value); + break; + case 2: + var value = /** @type {string} */ (reader.readString()); + msg.setOperator(value); + break; + case 3: + var value = /** @type {string} */ (reader.readString()); + msg.setValue(value); + break; + case 4: + var value = /** @type {string} */ (reader.readString()); + msg.setEffect(value); + break; + case 5: + var value = /** @type {number} */ (reader.readInt64()); + msg.setTolerationSeconds(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.api_container_api.Toleration.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.api_container_api.Toleration.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.api_container_api.Toleration} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.api_container_api.Toleration.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getKey(); + if (f.length > 0) { + writer.writeString( + 1, + f + ); + } + f = message.getOperator(); + if (f.length > 0) { + writer.writeString( + 2, + f + ); + } + f = message.getValue(); + if (f.length > 0) { + writer.writeString( + 3, + f + ); + } + f = message.getEffect(); + if (f.length > 0) { + writer.writeString( + 4, + f + ); + } + f = message.getTolerationSeconds(); + if (f !== 0) { + writer.writeInt64( + 5, + f + ); + } +}; + + +/** + * optional string key = 1; + * @return {string} + */ +proto.api_container_api.Toleration.prototype.getKey = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); +}; + + +/** + * @param {string} value + * @return {!proto.api_container_api.Toleration} returns this + */ +proto.api_container_api.Toleration.prototype.setKey = function(value) { + return jspb.Message.setProto3StringField(this, 1, value); +}; + + +/** + * optional string operator = 2; + * @return {string} + */ +proto.api_container_api.Toleration.prototype.getOperator = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, "")); +}; + + +/** + * @param {string} value + * @return {!proto.api_container_api.Toleration} returns this + */ +proto.api_container_api.Toleration.prototype.setOperator = function(value) { + return jspb.Message.setProto3StringField(this, 2, value); +}; + + +/** + * optional string value = 3; + * @return {string} + */ +proto.api_container_api.Toleration.prototype.getValue = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 3, "")); +}; + + +/** + * @param {string} value + * @return {!proto.api_container_api.Toleration} returns this + */ +proto.api_container_api.Toleration.prototype.setValue = function(value) { + return jspb.Message.setProto3StringField(this, 3, value); +}; + + +/** + * optional string effect = 4; + * @return {string} + */ +proto.api_container_api.Toleration.prototype.getEffect = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 4, "")); +}; + + +/** + * @param {string} value + * @return {!proto.api_container_api.Toleration} returns this + */ +proto.api_container_api.Toleration.prototype.setEffect = function(value) { + return jspb.Message.setProto3StringField(this, 4, value); +}; + + +/** + * optional int64 toleration_seconds = 5; + * @return {number} + */ +proto.api_container_api.Toleration.prototype.getTolerationSeconds = function() { + return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 5, 0)); +}; + + +/** + * @param {number} value + * @return {!proto.api_container_api.Toleration} returns this + */ +proto.api_container_api.Toleration.prototype.setTolerationSeconds = function(value) { + return jspb.Message.setProto3IntField(this, 5, value); +}; + + + +/** + * List of repeated fields within this message type. + * @private {!Array} + * @const + */ +proto.api_container_api.ServiceInfo.repeatedFields_ = [16]; + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.api_container_api.ServiceInfo.prototype.toObject = function(opt_includeInstance) { + return proto.api_container_api.ServiceInfo.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.api_container_api.ServiceInfo} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.api_container_api.ServiceInfo.toObject = function(includeInstance, msg) { + var f, obj = { + serviceUuid: jspb.Message.getFieldWithDefault(msg, 1, ""), + privateIpAddr: jspb.Message.getFieldWithDefault(msg, 2, ""), + privatePortsMap: (f = msg.getPrivatePortsMap()) ? f.toObject(includeInstance, proto.api_container_api.Port.toObject) : [], + maybePublicIpAddr: jspb.Message.getFieldWithDefault(msg, 4, ""), + maybePublicPortsMap: (f = msg.getMaybePublicPortsMap()) ? f.toObject(includeInstance, proto.api_container_api.Port.toObject) : [], + name: jspb.Message.getFieldWithDefault(msg, 6, ""), + shortenedUuid: jspb.Message.getFieldWithDefault(msg, 7, ""), + serviceStatus: jspb.Message.getFieldWithDefault(msg, 8, 0), + container: (f = msg.getContainer()) && proto.api_container_api.Container.toObject(includeInstance, f), + serviceDirPathsToFilesArtifactsListMap: (f = msg.getServiceDirPathsToFilesArtifactsListMap()) ? f.toObject(includeInstance, proto.api_container_api.FilesArtifactsList.toObject) : [], + maxMillicpus: jspb.Message.getFieldWithDefault(msg, 11, 0), + minMillicpus: jspb.Message.getFieldWithDefault(msg, 12, 0), + maxMemoryMegabytes: jspb.Message.getFieldWithDefault(msg, 13, 0), + minMemoryMegabytes: jspb.Message.getFieldWithDefault(msg, 14, 0), + user: (f = msg.getUser()) && proto.api_container_api.User.toObject(includeInstance, f), + tolerationsList: jspb.Message.toObjectList(msg.getTolerationsList(), + proto.api_container_api.Toleration.toObject, includeInstance), + nodeSelectorsMap: (f = msg.getNodeSelectorsMap()) ? f.toObject(includeInstance, undefined) : [], + labelsMap: (f = msg.getLabelsMap()) ? f.toObject(includeInstance, undefined) : [], + tiniEnabled: jspb.Message.getBooleanFieldWithDefault(msg, 19, false) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.api_container_api.ServiceInfo} + */ +proto.api_container_api.ServiceInfo.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.api_container_api.ServiceInfo; + return proto.api_container_api.ServiceInfo.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.api_container_api.ServiceInfo} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.api_container_api.ServiceInfo} + */ +proto.api_container_api.ServiceInfo.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {string} */ (reader.readString()); + msg.setServiceUuid(value); + break; + case 2: + var value = /** @type {string} */ (reader.readString()); + msg.setPrivateIpAddr(value); + break; + case 3: + var value = msg.getPrivatePortsMap(); + reader.readMessage(value, function(message, reader) { + jspb.Map.deserializeBinary(message, reader, jspb.BinaryReader.prototype.readString, jspb.BinaryReader.prototype.readMessage, proto.api_container_api.Port.deserializeBinaryFromReader, "", new proto.api_container_api.Port()); + }); + break; + case 4: + var value = /** @type {string} */ (reader.readString()); + msg.setMaybePublicIpAddr(value); + break; + case 5: + var value = msg.getMaybePublicPortsMap(); + reader.readMessage(value, function(message, reader) { + jspb.Map.deserializeBinary(message, reader, jspb.BinaryReader.prototype.readString, jspb.BinaryReader.prototype.readMessage, proto.api_container_api.Port.deserializeBinaryFromReader, "", new proto.api_container_api.Port()); + }); + break; + case 6: + var value = /** @type {string} */ (reader.readString()); + msg.setName(value); + break; + case 7: + var value = /** @type {string} */ (reader.readString()); + msg.setShortenedUuid(value); + break; + case 8: + var value = /** @type {!proto.api_container_api.ServiceStatus} */ (reader.readEnum()); + msg.setServiceStatus(value); + break; + case 9: + var value = new proto.api_container_api.Container; + reader.readMessage(value,proto.api_container_api.Container.deserializeBinaryFromReader); + msg.setContainer(value); + break; + case 10: + var value = msg.getServiceDirPathsToFilesArtifactsListMap(); + reader.readMessage(value, function(message, reader) { + jspb.Map.deserializeBinary(message, reader, jspb.BinaryReader.prototype.readString, jspb.BinaryReader.prototype.readMessage, proto.api_container_api.FilesArtifactsList.deserializeBinaryFromReader, "", new proto.api_container_api.FilesArtifactsList()); + }); + break; + case 11: + var value = /** @type {number} */ (reader.readUint32()); + msg.setMaxMillicpus(value); + break; + case 12: + var value = /** @type {number} */ (reader.readUint32()); + msg.setMinMillicpus(value); + break; + case 13: + var value = /** @type {number} */ (reader.readUint32()); + msg.setMaxMemoryMegabytes(value); + break; + case 14: + var value = /** @type {number} */ (reader.readUint32()); + msg.setMinMemoryMegabytes(value); + break; + case 15: + var value = new proto.api_container_api.User; + reader.readMessage(value,proto.api_container_api.User.deserializeBinaryFromReader); + msg.setUser(value); + break; + case 16: + var value = new proto.api_container_api.Toleration; + reader.readMessage(value,proto.api_container_api.Toleration.deserializeBinaryFromReader); + msg.addTolerations(value); + break; + case 17: + var value = msg.getNodeSelectorsMap(); + reader.readMessage(value, function(message, reader) { + jspb.Map.deserializeBinary(message, reader, jspb.BinaryReader.prototype.readString, jspb.BinaryReader.prototype.readString, null, "", ""); + }); + break; + case 18: + var value = msg.getLabelsMap(); + reader.readMessage(value, function(message, reader) { + jspb.Map.deserializeBinary(message, reader, jspb.BinaryReader.prototype.readString, jspb.BinaryReader.prototype.readString, null, "", ""); + }); + break; + case 19: + var value = /** @type {boolean} */ (reader.readBool()); + msg.setTiniEnabled(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.api_container_api.ServiceInfo.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.api_container_api.ServiceInfo.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.api_container_api.ServiceInfo} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.api_container_api.ServiceInfo.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getServiceUuid(); + if (f.length > 0) { + writer.writeString( + 1, + f + ); + } + f = message.getPrivateIpAddr(); + if (f.length > 0) { + writer.writeString( + 2, + f + ); + } + f = message.getPrivatePortsMap(true); + if (f && f.getLength() > 0) { + f.serializeBinary(3, writer, jspb.BinaryWriter.prototype.writeString, jspb.BinaryWriter.prototype.writeMessage, proto.api_container_api.Port.serializeBinaryToWriter); + } + f = message.getMaybePublicIpAddr(); + if (f.length > 0) { + writer.writeString( + 4, + f + ); + } + f = message.getMaybePublicPortsMap(true); + if (f && f.getLength() > 0) { + f.serializeBinary(5, writer, jspb.BinaryWriter.prototype.writeString, jspb.BinaryWriter.prototype.writeMessage, proto.api_container_api.Port.serializeBinaryToWriter); + } + f = message.getName(); + if (f.length > 0) { + writer.writeString( + 6, + f + ); + } + f = message.getShortenedUuid(); + if (f.length > 0) { + writer.writeString( + 7, + f + ); + } + f = message.getServiceStatus(); + if (f !== 0.0) { + writer.writeEnum( + 8, + f + ); + } + f = message.getContainer(); + if (f != null) { + writer.writeMessage( + 9, + f, + proto.api_container_api.Container.serializeBinaryToWriter + ); + } + f = message.getServiceDirPathsToFilesArtifactsListMap(true); + if (f && f.getLength() > 0) { + f.serializeBinary(10, writer, jspb.BinaryWriter.prototype.writeString, jspb.BinaryWriter.prototype.writeMessage, proto.api_container_api.FilesArtifactsList.serializeBinaryToWriter); + } + f = message.getMaxMillicpus(); + if (f !== 0) { + writer.writeUint32( + 11, + f + ); + } + f = message.getMinMillicpus(); + if (f !== 0) { + writer.writeUint32( + 12, + f + ); + } + f = message.getMaxMemoryMegabytes(); + if (f !== 0) { + writer.writeUint32( + 13, + f + ); + } + f = message.getMinMemoryMegabytes(); + if (f !== 0) { + writer.writeUint32( + 14, + f + ); + } + f = message.getUser(); + if (f != null) { + writer.writeMessage( + 15, + f, + proto.api_container_api.User.serializeBinaryToWriter + ); + } + f = message.getTolerationsList(); + if (f.length > 0) { + writer.writeRepeatedMessage( + 16, + f, + proto.api_container_api.Toleration.serializeBinaryToWriter + ); + } + f = message.getNodeSelectorsMap(true); + if (f && f.getLength() > 0) { + f.serializeBinary(17, writer, jspb.BinaryWriter.prototype.writeString, jspb.BinaryWriter.prototype.writeString); + } + f = message.getLabelsMap(true); + if (f && f.getLength() > 0) { + f.serializeBinary(18, writer, jspb.BinaryWriter.prototype.writeString, jspb.BinaryWriter.prototype.writeString); + } + f = /** @type {boolean} */ (jspb.Message.getField(message, 19)); + if (f != null) { + writer.writeBool( + 19, + f + ); + } +}; + + +/** + * optional string service_uuid = 1; + * @return {string} + */ +proto.api_container_api.ServiceInfo.prototype.getServiceUuid = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); +}; + + +/** + * @param {string} value + * @return {!proto.api_container_api.ServiceInfo} returns this + */ +proto.api_container_api.ServiceInfo.prototype.setServiceUuid = function(value) { + return jspb.Message.setProto3StringField(this, 1, value); +}; + + +/** + * optional string private_ip_addr = 2; + * @return {string} + */ +proto.api_container_api.ServiceInfo.prototype.getPrivateIpAddr = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, "")); +}; + + +/** + * @param {string} value + * @return {!proto.api_container_api.ServiceInfo} returns this + */ +proto.api_container_api.ServiceInfo.prototype.setPrivateIpAddr = function(value) { + return jspb.Message.setProto3StringField(this, 2, value); +}; + + +/** + * map private_ports = 3; + * @param {boolean=} opt_noLazyCreate Do not create the map if + * empty, instead returning `undefined` + * @return {!jspb.Map} + */ +proto.api_container_api.ServiceInfo.prototype.getPrivatePortsMap = function(opt_noLazyCreate) { + return /** @type {!jspb.Map} */ ( + jspb.Message.getMapField(this, 3, opt_noLazyCreate, + proto.api_container_api.Port)); +}; + + +/** + * Clears values from the map. The map will be non-null. + * @return {!proto.api_container_api.ServiceInfo} returns this + */ +proto.api_container_api.ServiceInfo.prototype.clearPrivatePortsMap = function() { + this.getPrivatePortsMap().clear(); + return this;}; + + +/** + * optional string maybe_public_ip_addr = 4; + * @return {string} + */ +proto.api_container_api.ServiceInfo.prototype.getMaybePublicIpAddr = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 4, "")); +}; + + +/** + * @param {string} value + * @return {!proto.api_container_api.ServiceInfo} returns this + */ +proto.api_container_api.ServiceInfo.prototype.setMaybePublicIpAddr = function(value) { + return jspb.Message.setProto3StringField(this, 4, value); +}; + + +/** + * map maybe_public_ports = 5; + * @param {boolean=} opt_noLazyCreate Do not create the map if + * empty, instead returning `undefined` + * @return {!jspb.Map} + */ proto.api_container_api.ServiceInfo.prototype.getMaybePublicPortsMap = function(opt_noLazyCreate) { return /** @type {!jspb.Map} */ ( jspb.Message.getMapField(this, 5, opt_noLazyCreate, @@ -2290,12 +2844,12 @@ proto.api_container_api.ServiceInfo.prototype.hasContainer = function() { /** - * map service_dir_paths_to_files_artifacts_identifiers = 10; + * map service_dir_paths_to_files_artifacts_list = 10; * @param {boolean=} opt_noLazyCreate Do not create the map if * empty, instead returning `undefined` * @return {!jspb.Map} */ -proto.api_container_api.ServiceInfo.prototype.getServiceDirPathsToFilesArtifactsIdentifiersMap = function(opt_noLazyCreate) { +proto.api_container_api.ServiceInfo.prototype.getServiceDirPathsToFilesArtifactsListMap = function(opt_noLazyCreate) { return /** @type {!jspb.Map} */ ( jspb.Message.getMapField(this, 10, opt_noLazyCreate, proto.api_container_api.FilesArtifactsList)); @@ -2306,8 +2860,8 @@ proto.api_container_api.ServiceInfo.prototype.getServiceDirPathsToFilesArtifacts * Clears values from the map. The map will be non-null. * @return {!proto.api_container_api.ServiceInfo} returns this */ -proto.api_container_api.ServiceInfo.prototype.clearServiceDirPathsToFilesArtifactsIdentifiersMap = function() { - this.getServiceDirPathsToFilesArtifactsIdentifiersMap().clear(); +proto.api_container_api.ServiceInfo.prototype.clearServiceDirPathsToFilesArtifactsListMap = function() { + this.getServiceDirPathsToFilesArtifactsListMap().clear(); return this;}; @@ -2383,6 +2937,161 @@ proto.api_container_api.ServiceInfo.prototype.setMinMemoryMegabytes = function(v }; +/** + * optional User user = 15; + * @return {?proto.api_container_api.User} + */ +proto.api_container_api.ServiceInfo.prototype.getUser = function() { + return /** @type{?proto.api_container_api.User} */ ( + jspb.Message.getWrapperField(this, proto.api_container_api.User, 15)); +}; + + +/** + * @param {?proto.api_container_api.User|undefined} value + * @return {!proto.api_container_api.ServiceInfo} returns this +*/ +proto.api_container_api.ServiceInfo.prototype.setUser = function(value) { + return jspb.Message.setWrapperField(this, 15, value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.api_container_api.ServiceInfo} returns this + */ +proto.api_container_api.ServiceInfo.prototype.clearUser = function() { + return this.setUser(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.api_container_api.ServiceInfo.prototype.hasUser = function() { + return jspb.Message.getField(this, 15) != null; +}; + + +/** + * repeated Toleration tolerations = 16; + * @return {!Array} + */ +proto.api_container_api.ServiceInfo.prototype.getTolerationsList = function() { + return /** @type{!Array} */ ( + jspb.Message.getRepeatedWrapperField(this, proto.api_container_api.Toleration, 16)); +}; + + +/** + * @param {!Array} value + * @return {!proto.api_container_api.ServiceInfo} returns this +*/ +proto.api_container_api.ServiceInfo.prototype.setTolerationsList = function(value) { + return jspb.Message.setRepeatedWrapperField(this, 16, value); +}; + + +/** + * @param {!proto.api_container_api.Toleration=} opt_value + * @param {number=} opt_index + * @return {!proto.api_container_api.Toleration} + */ +proto.api_container_api.ServiceInfo.prototype.addTolerations = function(opt_value, opt_index) { + return jspb.Message.addToRepeatedWrapperField(this, 16, opt_value, proto.api_container_api.Toleration, opt_index); +}; + + +/** + * Clears the list making it empty but non-null. + * @return {!proto.api_container_api.ServiceInfo} returns this + */ +proto.api_container_api.ServiceInfo.prototype.clearTolerationsList = function() { + return this.setTolerationsList([]); +}; + + +/** + * map node_selectors = 17; + * @param {boolean=} opt_noLazyCreate Do not create the map if + * empty, instead returning `undefined` + * @return {!jspb.Map} + */ +proto.api_container_api.ServiceInfo.prototype.getNodeSelectorsMap = function(opt_noLazyCreate) { + return /** @type {!jspb.Map} */ ( + jspb.Message.getMapField(this, 17, opt_noLazyCreate, + null)); +}; + + +/** + * Clears values from the map. The map will be non-null. + * @return {!proto.api_container_api.ServiceInfo} returns this + */ +proto.api_container_api.ServiceInfo.prototype.clearNodeSelectorsMap = function() { + this.getNodeSelectorsMap().clear(); + return this;}; + + +/** + * map labels = 18; + * @param {boolean=} opt_noLazyCreate Do not create the map if + * empty, instead returning `undefined` + * @return {!jspb.Map} + */ +proto.api_container_api.ServiceInfo.prototype.getLabelsMap = function(opt_noLazyCreate) { + return /** @type {!jspb.Map} */ ( + jspb.Message.getMapField(this, 18, opt_noLazyCreate, + null)); +}; + + +/** + * Clears values from the map. The map will be non-null. + * @return {!proto.api_container_api.ServiceInfo} returns this + */ +proto.api_container_api.ServiceInfo.prototype.clearLabelsMap = function() { + this.getLabelsMap().clear(); + return this;}; + + +/** + * optional bool tini_enabled = 19; + * @return {boolean} + */ +proto.api_container_api.ServiceInfo.prototype.getTiniEnabled = function() { + return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 19, false)); +}; + + +/** + * @param {boolean} value + * @return {!proto.api_container_api.ServiceInfo} returns this + */ +proto.api_container_api.ServiceInfo.prototype.setTiniEnabled = function(value) { + return jspb.Message.setField(this, 19, value); +}; + + +/** + * Clears the field making it undefined. + * @return {!proto.api_container_api.ServiceInfo} returns this + */ +proto.api_container_api.ServiceInfo.prototype.clearTiniEnabled = function() { + return jspb.Message.setField(this, 19, undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.api_container_api.ServiceInfo.prototype.hasTiniEnabled = function() { + return jspb.Message.getField(this, 19) != null; +}; + + /** * List of repeated fields within this message type. diff --git a/api/typescript/src/core/kurtosis_core_rpc_api_bindings/connect/api_container_service_pb.d.ts b/api/typescript/src/core/kurtosis_core_rpc_api_bindings/connect/api_container_service_pb.d.ts index caff3f6d67..83d016d7a2 100644 --- a/api/typescript/src/core/kurtosis_core_rpc_api_bindings/connect/api_container_service_pb.d.ts +++ b/api/typescript/src/core/kurtosis_core_rpc_api_bindings/connect/api_container_service_pb.d.ts @@ -259,6 +259,88 @@ export declare class FilesArtifactsList extends Message { static equals(a: FilesArtifactsList | PlainMessage | undefined, b: FilesArtifactsList | PlainMessage | undefined): boolean; } +/** + * Equivalent of user on ServiceConfig + * + * @generated from message api_container_api.User + */ +export declare class User extends Message { + /** + * @generated from field: string username = 1; + */ + username: string; + + /** + * @generated from field: uint32 uid = 2; + */ + uid: number; + + /** + * @generated from field: uint32 gid = 3; + */ + gid: number; + + constructor(data?: PartialMessage); + + static readonly runtime: typeof proto3; + static readonly typeName = "api_container_api.User"; + static readonly fields: FieldList; + + static fromBinary(bytes: Uint8Array, options?: Partial): User; + + static fromJson(jsonValue: JsonValue, options?: Partial): User; + + static fromJsonString(jsonString: string, options?: Partial): User; + + static equals(a: User | PlainMessage | undefined, b: User | PlainMessage | undefined): boolean; +} + +/** + * Equivalent of tolerations on ServiceConfig + * + * @generated from message api_container_api.Toleration + */ +export declare class Toleration extends Message { + /** + * @generated from field: string key = 1; + */ + key: string; + + /** + * @generated from field: string operator = 2; + */ + operator: string; + + /** + * @generated from field: string value = 3; + */ + value: string; + + /** + * @generated from field: string effect = 4; + */ + effect: string; + + /** + * @generated from field: int64 toleration_seconds = 5; + */ + tolerationSeconds: bigint; + + constructor(data?: PartialMessage); + + static readonly runtime: typeof proto3; + static readonly typeName = "api_container_api.Toleration"; + static readonly fields: FieldList; + + static fromBinary(bytes: Uint8Array, options?: Partial): Toleration; + + static fromJson(jsonValue: JsonValue, options?: Partial): Toleration; + + static fromJsonString(jsonString: string, options?: Partial): Toleration; + + static equals(a: Toleration | PlainMessage | undefined, b: Toleration | PlainMessage | undefined): boolean; +} + /** * @generated from message api_container_api.ServiceInfo */ @@ -333,9 +415,9 @@ export declare class ServiceInfo extends Message { /** * Mapping of directory paths on service to names of files artifacts that are mounted to that directory * - * @generated from field: map service_dir_paths_to_files_artifacts_identifiers = 10; + * @generated from field: map service_dir_paths_to_files_artifacts_list = 10; */ - serviceDirPathsToFilesArtifactsIdentifiers: { [key: string]: FilesArtifactsList }; + serviceDirPathsToFilesArtifactsList: { [key: string]: FilesArtifactsList }; /** * @generated from field: uint32 max_millicpus = 11; @@ -357,6 +439,41 @@ export declare class ServiceInfo extends Message { */ minMemoryMegabytes: number; + /** + * Optional user identity for the service + * + * @generated from field: optional api_container_api.User user = 15; + */ + user?: User; + + /** + * Optional list of Kubernetes tolerations + * + * @generated from field: repeated api_container_api.Toleration tolerations = 16; + */ + tolerations: Toleration[]; + + /** + * Optional node selectors for pod placement + * + * @generated from field: map node_selectors = 17; + */ + nodeSelectors: { [key: string]: string }; + + /** + * Optional labels + * + * @generated from field: map labels = 18; + */ + labels: { [key: string]: string }; + + /** + * Whether Tini is enabled + * + * @generated from field: optional bool tini_enabled = 19; + */ + tiniEnabled?: boolean; + constructor(data?: PartialMessage); static readonly runtime: typeof proto3; diff --git a/api/typescript/src/core/kurtosis_core_rpc_api_bindings/connect/api_container_service_pb.js b/api/typescript/src/core/kurtosis_core_rpc_api_bindings/connect/api_container_service_pb.js index 4423ef6949..e6ac1e649e 100644 --- a/api/typescript/src/core/kurtosis_core_rpc_api_bindings/connect/api_container_service_pb.js +++ b/api/typescript/src/core/kurtosis_core_rpc_api_bindings/connect/api_container_service_pb.js @@ -129,6 +129,36 @@ export const FilesArtifactsList = proto3.makeMessageType( ], ); +/** + * Equivalent of user on ServiceConfig + * + * @generated from message api_container_api.User + */ +export const User = proto3.makeMessageType( + "api_container_api.User", + () => [ + { no: 1, name: "username", kind: "scalar", T: 9 /* ScalarType.STRING */ }, + { no: 2, name: "uid", kind: "scalar", T: 13 /* ScalarType.UINT32 */ }, + { no: 3, name: "gid", kind: "scalar", T: 13 /* ScalarType.UINT32 */ }, + ], +); + +/** + * Equivalent of tolerations on ServiceConfig + * + * @generated from message api_container_api.Toleration + */ +export const Toleration = proto3.makeMessageType( + "api_container_api.Toleration", + () => [ + { no: 1, name: "key", kind: "scalar", T: 9 /* ScalarType.STRING */ }, + { no: 2, name: "operator", kind: "scalar", T: 9 /* ScalarType.STRING */ }, + { no: 3, name: "value", kind: "scalar", T: 9 /* ScalarType.STRING */ }, + { no: 4, name: "effect", kind: "scalar", T: 9 /* ScalarType.STRING */ }, + { no: 5, name: "toleration_seconds", kind: "scalar", T: 3 /* ScalarType.INT64 */ }, + ], +); + /** * @generated from message api_container_api.ServiceInfo */ @@ -144,11 +174,16 @@ export const ServiceInfo = proto3.makeMessageType( { no: 7, name: "shortened_uuid", kind: "scalar", T: 9 /* ScalarType.STRING */ }, { no: 8, name: "service_status", kind: "enum", T: proto3.getEnumType(ServiceStatus) }, { no: 9, name: "container", kind: "message", T: Container }, - { no: 10, name: "service_dir_paths_to_files_artifacts_identifiers", kind: "map", K: 9 /* ScalarType.STRING */, V: {kind: "message", T: FilesArtifactsList} }, + { no: 10, name: "service_dir_paths_to_files_artifacts_list", kind: "map", K: 9 /* ScalarType.STRING */, V: {kind: "message", T: FilesArtifactsList} }, { no: 11, name: "max_millicpus", kind: "scalar", T: 13 /* ScalarType.UINT32 */ }, { no: 12, name: "min_millicpus", kind: "scalar", T: 13 /* ScalarType.UINT32 */ }, { no: 13, name: "max_memory_megabytes", kind: "scalar", T: 13 /* ScalarType.UINT32 */ }, { no: 14, name: "min_memory_megabytes", kind: "scalar", T: 13 /* ScalarType.UINT32 */ }, + { no: 15, name: "user", kind: "message", T: User, opt: true }, + { no: 16, name: "tolerations", kind: "message", T: Toleration, repeated: true }, + { no: 17, name: "node_selectors", kind: "map", K: 9 /* ScalarType.STRING */, V: {kind: "scalar", T: 9 /* ScalarType.STRING */} }, + { no: 18, name: "labels", kind: "map", K: 9 /* ScalarType.STRING */, V: {kind: "scalar", T: 9 /* ScalarType.STRING */} }, + { no: 19, name: "tini_enabled", kind: "scalar", T: 8 /* ScalarType.BOOL */, opt: true }, ], ); diff --git a/cli/cli/commands/service/service_helpers/service_helpers.go b/cli/cli/commands/service/service_helpers/service_helpers.go index ee797df85a..8b63d3488c 100644 --- a/cli/cli/commands/service/service_helpers/service_helpers.go +++ b/cli/cli/commands/service/service_helpers/service_helpers.go @@ -102,23 +102,24 @@ func GetServiceInfo(ctx context.Context, kurtosisCtx *kurtosis_context.KurtosisC break } + isTiniEnabled := service.GetTiniEnabled() serviceConfig := &services.ServiceConfig{ Image: service.GetContainer().GetImageName(), - PrivatePorts: nil, - PublicPorts: nil, - Files: nil, + PrivatePorts: services.ConvertApiPortToJsonPort(service.GetPrivatePorts()), + PublicPorts: services.ConvertApiPortToJsonPort(service.GetMaybePublicPorts()), + Files: services.ConvertApiFilesArtifactsToJsonFiles(service.GetServiceDirPathsToFilesArtifactsList()), Entrypoint: service.GetContainer().GetEntrypointArgs(), Cmd: service.GetContainer().GetCmdArgs(), EnvVars: service.GetContainer().GetEnvVars(), - PrivateIPAddressPlaceholder: "", + PrivateIPAddressPlaceholder: service.GetPrivateIpAddr(), MaxMillicpus: service.GetMaxMillicpus(), MinMillicpus: service.GetMinMillicpus(), MaxMemory: service.GetMaxMemoryMegabytes(), MinMemory: service.GetMinMemoryMegabytes(), - User: nil, - Tolerations: nil, - NodeSelectors: nil, - TiniEnabled: nil, + User: services.ConvertApiUserToJsonUser(service.GetUser()), + Tolerations: services.ConvertApiTolerationsToJsonTolerations(service.GetTolerations()), + NodeSelectors: service.GetNodeSelectors(), + TiniEnabled: &isTiniEnabled, } return service, serviceConfig, nil From 8b4b8dc472b239b2c8ff43458d07984b3dc680f9 Mon Sep 17 00:00:00 2001 From: Tedi Mitiku Date: Fri, 28 Mar 2025 13:24:51 -0400 Subject: [PATCH 16/48] parse multiple files artifacts into directory --- .../lib/services/service_config_builder.go | 70 +++++++++++-------- .../service_helpers/service_helpers.go | 16 ++--- .../service_helpers/service_helpers_test.go | 37 +++++++--- cli/cli/commands/service/update/update.go | 8 +-- .../golang/test_helpers/test_helpers.go | 8 +-- 5 files changed, 87 insertions(+), 52 deletions(-) diff --git a/api/golang/core/lib/services/service_config_builder.go b/api/golang/core/lib/services/service_config_builder.go index b171fb876e..bc912fcfaa 100644 --- a/api/golang/core/lib/services/service_config_builder.go +++ b/api/golang/core/lib/services/service_config_builder.go @@ -30,23 +30,23 @@ type Toleration struct { } type ServiceConfig struct { - Image string `json:"image" yaml:"image"` - PrivatePorts map[string]Port `json:"ports,omitempty" yaml:"ports,omitempty"` - PublicPorts map[string]Port `json:"public_ports,omitempty" yaml:"public_ports,omitempty"` - Files map[string]string `json:"files,omitempty" yaml:"files,omitempty"` - Entrypoint []string `json:"entrypoint,omitempty" yaml:"entrypoint,omitempty"` - Cmd []string `json:"cmd,omitempty" yaml:"cmd,omitempty"` - EnvVars map[string]string `json:"env_vars,omitempty" yaml:"env_vars,omitempty"` - PrivateIPAddressPlaceholder string `json:"private_ip_address_placeholder,omitempty" yaml:"private_ip_address_placeholder,omitempty"` - MaxMillicpus uint32 `json:"max_cpu,omitempty" yaml:"max_cpu,omitempty"` - MinMillicpus uint32 `json:"min_cpu,omitempty" yaml:"min_cpu,omitempty"` - MaxMemory uint32 `json:"max_memory,omitempty" yaml:"max_memory,omitempty"` - MinMemory uint32 `json:"min_memory,omitempty" yaml:"min_memory,omitempty"` - User *User `json:"user,omitempty" yaml:"user,omitempty"` - Tolerations []Toleration `json:"tolerations,omitempty" yaml:"tolerations,omitempty"` - Labels map[string]string `json:"labels,omitempty" yaml:"labels,omitempty"` - NodeSelectors map[string]string `json:"node_selectors,omitempty" yaml:"node_selectors,omitempty"` - TiniEnabled *bool `json:"tini_enabled,omitempty" yaml:"tini_enabled,omitempty"` + Image string `json:"image" yaml:"image"` + PrivatePorts map[string]Port `json:"ports,omitempty" yaml:"ports,omitempty"` + PublicPorts map[string]Port `json:"public_ports,omitempty" yaml:"public_ports,omitempty"` + Files map[string][]string `json:"files,omitempty" yaml:"files,omitempty"` + Entrypoint []string `json:"entrypoint,omitempty" yaml:"entrypoint,omitempty"` + Cmd []string `json:"cmd,omitempty" yaml:"cmd,omitempty"` + EnvVars map[string]string `json:"env_vars,omitempty" yaml:"env_vars,omitempty"` + PrivateIPAddressPlaceholder string `json:"private_ip_address_placeholder,omitempty" yaml:"private_ip_address_placeholder,omitempty"` + MaxMillicpus uint32 `json:"max_cpu,omitempty" yaml:"max_cpu,omitempty"` + MinMillicpus uint32 `json:"min_cpu,omitempty" yaml:"min_cpu,omitempty"` + MaxMemory uint32 `json:"max_memory,omitempty" yaml:"max_memory,omitempty"` + MinMemory uint32 `json:"min_memory,omitempty" yaml:"min_memory,omitempty"` + User *User `json:"user,omitempty" yaml:"user,omitempty"` + Tolerations []Toleration `json:"tolerations,omitempty" yaml:"tolerations,omitempty"` + Labels map[string]string `json:"labels,omitempty" yaml:"labels,omitempty"` + NodeSelectors map[string]string `json:"node_selectors,omitempty" yaml:"node_selectors,omitempty"` + TiniEnabled *bool `json:"tini_enabled,omitempty" yaml:"tini_enabled,omitempty"` } func portToStarlark(port *kurtosis_core_rpc_api_bindings.Port) string { @@ -67,7 +67,7 @@ func portToStarlark(port *kurtosis_core_rpc_api_bindings.Port) string { func GetSimpleServiceConfigStarlark( containerImageName string, privatePorts map[string]*kurtosis_core_rpc_api_bindings.Port, - fileArtifactMountPoints map[string]string, + fileArtifactMountPoints map[string][]string, entrypointArgs []string, cmdArgs []string, envVars map[string]string, @@ -88,10 +88,16 @@ func GetSimpleServiceConfigStarlark( starlarkFields = append(starlarkFields, fmt.Sprintf(`ports={%s}`, strings.Join(portStrings, ","))) fileStrings := []string{} - for filePath, artifactName := range fileArtifactMountPoints { - fileStrings = append(fileStrings, fmt.Sprintf(`%q: %q`, filePath, artifactName)) + for filePath, artifactNames := range fileArtifactMountPoints { + if len(artifactNames) > 1 { // if multiple files artifacts mounted, create a Directory + fileStrings = append(fileStrings, fmt.Sprintf(`%q: %q`, filePath, createDirectoryStarlarkStr(artifactNames))) + } else { + fileStrings = append(fileStrings, fmt.Sprintf(`%q: %q`, filePath, artifactNames[0])) + } + } + if len(fileStrings) > 0 { + starlarkFields = append(starlarkFields, fmt.Sprintf(`files={%s}`, strings.Join(fileStrings, ","))) } - starlarkFields = append(starlarkFields, fmt.Sprintf(`files={%s}`, strings.Join(fileStrings, ","))) quotedEntrypointArgs := []string{} for _, entrypointArg := range entrypointArgs { @@ -133,7 +139,7 @@ func GetSimpleServiceConfigStarlark( func GetFullServiceConfigStarlark( containerImageName string, privatePorts map[string]*kurtosis_core_rpc_api_bindings.Port, - fileArtifactMountPoints map[string]string, + fileArtifactMountPoints map[string][]string, entrypointArgs []string, cmdArgs []string, envVars map[string]string, @@ -162,8 +168,12 @@ func GetFullServiceConfigStarlark( // Files fileStrings := []string{} - for filePath, artifactName := range fileArtifactMountPoints { - fileStrings = append(fileStrings, fmt.Sprintf(`%q: %q`, filePath, artifactName)) + for filePath, artifactNames := range fileArtifactMountPoints { + if len(artifactNames) > 1 { // if multiple files artifacts mounted, create a Directory + fileStrings = append(fileStrings, fmt.Sprintf(`%q: %q`, filePath, createDirectoryStarlarkStr(artifactNames))) + } else { + fileStrings = append(fileStrings, fmt.Sprintf(`%q: %q`, filePath, artifactNames[0])) + } } if len(fileStrings) > 0 { starlarkFields = append(starlarkFields, fmt.Sprintf(`files={%s}`, strings.Join(fileStrings, ","))) @@ -292,11 +302,11 @@ func ConvertApiPortToJsonPort(apiPorts map[string]*kurtosis_core_rpc_api_binding return jsonPorts } -func ConvertApiFilesArtifactsToJsonFiles(serviceDirPathsToFilesArtifactsList map[string]*kurtosis_core_rpc_api_bindings.FilesArtifactsList) map[string]string { - serviceDirPathsToFilesArtifacts := map[string]string{} +func ConvertApiFilesArtifactsToJsonFiles(serviceDirPathsToFilesArtifactsList map[string]*kurtosis_core_rpc_api_bindings.FilesArtifactsList) map[string][]string { + serviceDirPathsToFilesArtifacts := map[string][]string{} for serviceDirPath, filesArtifactsList := range serviceDirPathsToFilesArtifactsList { - filesArtifactsIdentifers := filesArtifactsList.GetFilesArtifactsIdentifiers() - serviceDirPathsToFilesArtifacts[serviceDirPath] = filesArtifactsIdentifers[0] + filesArtifactsIdentifiers := filesArtifactsList.GetFilesArtifactsIdentifiers() + serviceDirPathsToFilesArtifacts[serviceDirPath] = filesArtifactsIdentifiers } return serviceDirPathsToFilesArtifacts } @@ -321,3 +331,7 @@ func ConvertApiTolerationsToJsonTolerations(tolerations []*kurtosis_core_rpc_api } return jsonTolerations } + +func createDirectoryStarlarkStr(artifactNames []string) string { + return fmt.Sprintf(`Directory(artifact_names=[%s])`, strings.Join(artifactNames, ", ")) +} diff --git a/cli/cli/commands/service/service_helpers/service_helpers.go b/cli/cli/commands/service/service_helpers/service_helpers.go index 8b63d3488c..0e8a33bcb1 100644 --- a/cli/cli/commands/service/service_helpers/service_helpers.go +++ b/cli/cli/commands/service/service_helpers/service_helpers.go @@ -35,6 +35,7 @@ const ( FilesFlagKey = "files" filesArtifactMountsDelimiter = "," filesArtifactMountpointDelimiter = ":" + multipleFilesArtifactsDelimiter = "|" emptyApplicationProtocol = "" @@ -318,8 +319,8 @@ func getTransportProtocolFromPortSpecString(portSpec string) (kurtosis_core_rpc_ return kurtosis_core_rpc_api_bindings.Port_TransportProtocol(transportProtocolEnumInt), nil } -func ParseFilesArtifactMountsStr(filesArtifactMountsStr string) (map[string]string, error) { - result := map[string]string{} +func ParseFilesArtifactMountsStr(filesArtifactMountsStr string) (map[string][]string, error) { + result := map[string][]string{} if strings.TrimSpace(filesArtifactMountsStr) == "" { return result, nil } @@ -342,18 +343,17 @@ func ParseFilesArtifactMountsStr(filesArtifactMountsStr string) (map[string]stri ) } mountpoint := mountFragments[0] - filesArtifactName := mountFragments[1] - - if existingName, found := result[mountpoint]; found { + filesArtifactNamesStr := mountFragments[1] + if existingNames, found := result[mountpoint]; found { return nil, stacktrace.NewError( "Mountpoint '%v' is declared twice; once to artifact name '%v' and again to artifact name '%v'", mountpoint, - existingName, - filesArtifactName, + existingNames, + filesArtifactNamesStr, ) } - result[mountpoint] = filesArtifactName + result[mountpoint] = strings.Split(filesArtifactNamesStr, multipleFilesArtifactsDelimiter) } return result, nil diff --git a/cli/cli/commands/service/service_helpers/service_helpers_test.go b/cli/cli/commands/service/service_helpers/service_helpers_test.go index c02e1e3e22..523459d64e 100644 --- a/cli/cli/commands/service/service_helpers/service_helpers_test.go +++ b/cli/cli/commands/service/service_helpers/service_helpers_test.go @@ -216,13 +216,13 @@ func TestParseFilesArtifactMountStr_ValidParse(t *testing.T) { require.NoError(t, err) require.Equal(t, 2, len(result)) - parsedArtifactUuid1, found := result[mountpoint1] + parsedArtifactsUuid1, found := result[mountpoint1] require.True(t, found) - require.Equal(t, artifactUuid1, parsedArtifactUuid1) + require.Equal(t, artifactUuid1, parsedArtifactsUuid1[0]) - parsedArtifactUuid2, found := result[mountpoint2] + parsedArtifactsUuid2, found := result[mountpoint2] require.True(t, found) - require.Equal(t, artifactUuid2, parsedArtifactUuid2) + require.Equal(t, artifactUuid2, parsedArtifactsUuid2[0]) } func TestParseFilesArtifactMountStr_EmptyDeclarationsAreSkipped(t *testing.T) { @@ -241,13 +241,13 @@ func TestParseFilesArtifactMountStr_EmptyDeclarationsAreSkipped(t *testing.T) { require.NoError(t, err) require.Equal(t, 2, len(result)) - parsedArtifactUuid1, found := result[mountpoint1] + parsedArtifactsUuid1, found := result[mountpoint1] require.True(t, found) - require.Equal(t, artifactUuid1, parsedArtifactUuid1) + require.Equal(t, artifactUuid1, parsedArtifactsUuid1[0]) - parsedArtifactUuid2, found := result[mountpoint2] + parsedArtifactsUuid2, found := result[mountpoint2] require.True(t, found) - require.Equal(t, artifactUuid2, parsedArtifactUuid2) + require.Equal(t, artifactUuid2, parsedArtifactsUuid2[0]) } func TestParseFilesArtifactMountStr_TooManyArtifactUuidMountpointDelimitersIsError(t *testing.T) { @@ -288,3 +288,24 @@ func TestParseFilesArtifactMountStr_DuplicateArtifactUuids(t *testing.T) { )) require.Error(t, err) } + +func TestParseMultipleFilesArtifactMountAtOneDirPathStr_ValidParse(t *testing.T) { + mountpoint1 := "/dest1" + artifactUuid1 := "1234" + artifactUuid2 := "4567" + + result, err := ParseFilesArtifactMountsStr(fmt.Sprintf( + "%v:%v|%v", + mountpoint1, + artifactUuid1, + artifactUuid2, + )) + require.NoError(t, err) + require.Equal(t, 1, len(result)) + + parsedArtifacts, found := result[mountpoint1] + require.True(t, found) + require.Len(t, parsedArtifacts, 2) + require.Equal(t, artifactUuid1, parsedArtifacts[0]) + require.Equal(t, artifactUuid2, parsedArtifacts[1]) +} diff --git a/cli/cli/commands/service/update/update.go b/cli/cli/commands/service/update/update.go index fd7d7af7e5..55e5b00934 100644 --- a/cli/cli/commands/service/update/update.go +++ b/cli/cli/commands/service/update/update.go @@ -85,13 +85,13 @@ var ServiceUpdateCmd = &engine_consuming_kurtosis_command.EngineConsumingKurtosi Flags: []*flags.FlagConfig{ { Key: service_helpers.ImageKey, - Usage: "image", + Usage: "Image to use for the service being updated.", Type: flags.FlagType_String, Default: "", }, { Key: service_helpers.CmdKey, - Usage: "cmd", + Usage: "CMD to run on the service once it is restarted by the update.", // TODO Make this a string list Type: flags.FlagType_String, Default: "", @@ -198,7 +198,7 @@ func run( var overrideImage string var overridePorts map[string]*kurtosis_core_rpc_api_bindings.Port - var overrideFilesArtifactsMountpoint map[string]string + var overrideFilesArtifactsMountpoint map[string][]string var overrideEntrypoint []string var overrideCmd []string var overrideEnvVars map[string]string @@ -308,7 +308,7 @@ func run( } // combine current files artifacts mount points with override mount points - mergedFilesArtifactsMountpoint := map[string]string{} + mergedFilesArtifactsMountpoint := map[string][]string{} for key, val := range currServiceConfig.Files { mergedFilesArtifactsMountpoint[key] = val } diff --git a/internal_testsuites/golang/test_helpers/test_helpers.go b/internal_testsuites/golang/test_helpers/test_helpers.go index 40b4698560..0074a6f746 100644 --- a/internal_testsuites/golang/test_helpers/test_helpers.go +++ b/internal_testsuites/golang/test_helpers/test_helpers.go @@ -111,7 +111,7 @@ def run(plan, args): var ( emptyPrivatePorts = map[string]*kurtosis_core_rpc_api_bindings.Port{} - emptyFileArtifactMountPoints = map[string]string{} + emptyFileArtifactMountPoints = map[string][]string{} emptyEntrypointArgs = []string{} emptyCmdArgs = []string{} emptyEnvVars = map[string]string{} @@ -598,7 +598,7 @@ func getApiServiceServiceConfigStarlark(apiConfigArtifactName string) string { path.Join(configMountpathOnApiContainer, configFilename), } - return services.GetSimpleServiceConfigStarlark(apiServiceImage, map[string]*kurtosis_core_rpc_api_bindings.Port{apiPortId: apiPortSpec}, map[string]string{configMountpathOnApiContainer: apiConfigArtifactName}, emptyEntrypointArgs, startCmd, emptyEnvVars, emptyPrivateIpAddrPlaceholder, emptyCpuAllocationMillicpus, emptyMemoryAllocationMegabytes, 0, 0) + return services.GetSimpleServiceConfigStarlark(apiServiceImage, map[string]*kurtosis_core_rpc_api_bindings.Port{apiPortId: apiPortSpec}, map[string][]string{configMountpathOnApiContainer: {apiConfigArtifactName}}, emptyEntrypointArgs, startCmd, emptyEnvVars, emptyPrivateIpAddrPlaceholder, emptyCpuAllocationMillicpus, emptyMemoryAllocationMegabytes, 0, 0) } func createApiConfigFile(datastoreIP string) (string, error) { @@ -647,9 +647,9 @@ func getFileContents(ipAddress string, portNum uint16, realtiveFilepath string) } func getFileServerServiceConfigStarlark(filesArtifactMountPoints map[string]services.FilesArtifactUUID) string { - filesArtifactMountPointsStr := map[string]string{} + filesArtifactMountPointsStr := map[string][]string{} for k, v := range filesArtifactMountPoints { - filesArtifactMountPointsStr[k] = string(v) + filesArtifactMountPointsStr[k] = []string{string(v)} } return services.GetSimpleServiceConfigStarlark(fileServerServiceImage, map[string]*kurtosis_core_rpc_api_bindings.Port{fileServerPortId: fileServerPortSpec}, filesArtifactMountPointsStr, emptyEntrypointArgs, emptyCmdArgs, emptyEnvVars, emptyPrivateIpAddrPlaceholder, emptyCpuAllocationMillicpus, emptyMemoryAllocationMegabytes, 0, 0) From 59d42830cec77ec0a66bf7688bbde9cba2f61b87 Mon Sep 17 00:00:00 2001 From: Tedi Mitiku Date: Fri, 28 Mar 2025 13:29:15 -0400 Subject: [PATCH 17/48] remvoe svc files artifacts repo --- .../services_files_artifacts/repository.go | 89 ------------------- .../repository_test.go | 1 - .../services_files_artifacts.go | 48 ---------- .../services_files_artifacts_test.go | 1 - 4 files changed, 139 deletions(-) delete mode 100644 core/server/api_container/server/service_network/services_files_artifacts/repository.go delete mode 100644 core/server/api_container/server/service_network/services_files_artifacts/repository_test.go delete mode 100644 core/server/api_container/server/service_network/services_files_artifacts/services_files_artifacts.go delete mode 100644 core/server/api_container/server/service_network/services_files_artifacts/services_files_artifacts_test.go diff --git a/core/server/api_container/server/service_network/services_files_artifacts/repository.go b/core/server/api_container/server/service_network/services_files_artifacts/repository.go deleted file mode 100644 index 7dbc0b7520..0000000000 --- a/core/server/api_container/server/service_network/services_files_artifacts/repository.go +++ /dev/null @@ -1,89 +0,0 @@ -package services_files_artifacts - -import ( - "encoding/json" - "github.com/kurtosis-tech/kurtosis/container-engine-lib/lib/database_accessors/consts" - "github.com/kurtosis-tech/kurtosis/container-engine-lib/lib/database_accessors/enclave_db" - "github.com/kurtosis-tech/stacktrace" - "github.com/sirupsen/logrus" - bolt "go.etcd.io/bbolt" -) - -var ( - servicesFilesArtifactsBucketName = []byte("services-files-artifacts-repository") - servicesFilesArtifactsSliceKey = []byte("service-files-artifacts-slice") -) - -type ServicesFilesArtifactsRepository struct { - enclaveDb *enclave_db.EnclaveDB -} - -func GetOrCreateNewServicesFilesArtifactsRepository(enclaveDb *enclave_db.EnclaveDB) (*ServicesFilesArtifactsRepository, error) { - if err := enclaveDb.Update(func(tx *bolt.Tx) error { - bucket, err := tx.CreateBucketIfNotExists(servicesFilesArtifactsBucketName) - if err != nil { - return stacktrace.Propagate(err, "An error occurred while creating the services files artifacts identifiers database bucket") - } - logrus.Debugf("Services files artifacts bucket identifier: '%+v'", bucket) - - return nil - }); err != nil { - return nil, stacktrace.Propagate(err, "An error occurred while building the services files artifacts repository") - } - - servicesFilesArtifactsRepository := &ServicesFilesArtifactsRepository{ - enclaveDb: enclaveDb, - } - - return servicesFilesArtifactsRepository, nil -} - -func (repository *ServicesFilesArtifactsRepository) AddServicesFilesArtifacts( - servicesFilesArtifactsObj *servicesFilesArtifacts, -) error { - - if err := repository.enclaveDb.Update(func(tx *bolt.Tx) error { - bucket := tx.Bucket(servicesFilesArtifactsBucketName) - - // retrieve the list from the bucket - servicesFilesArtifacts, err := getServicesFilesArtifactsFromBucket(bucket) - if err != nil { - return stacktrace.Propagate(err, "An error occurred getting service identifiers from bucket with name '%s'", servicesFilesArtifactsBucketName) - } - - // add the new element - servicesFilesArtifacts = append(servicesFilesArtifacts, servicesFilesArtifactsObj) - servicesFilesArtifactsPtr := &servicesFilesArtifacts - jsonBytes, err := json.Marshal(servicesFilesArtifactsPtr) - if err != nil { - return stacktrace.Propagate(err, "An error occurred marshalling service identifiers '%+v'", servicesFilesArtifacts) - } - - // save it to disk - if err := bucket.Put(servicesFilesArtifactsSliceKey, jsonBytes); err != nil { - return stacktrace.Propagate(err, "An error occurred while saving service identifiers '%+v' into the enclave db", servicesFilesArtifacts) - } - return nil - }); err != nil { - return stacktrace.Propagate(err, "An error occurred while adding service identifier '%v' into the enclave db", servicesFilesArtifactsObj) - } - return nil -} - -func getServicesFilesArtifactsFromBucket(bucket *bolt.Bucket) ([]*servicesFilesArtifacts, error) { - - // first get the list - servicesFilesArtifactsBytes := bucket.Get(servicesFilesArtifactsSliceKey) - // for empty list case - if servicesFilesArtifactsBytes == nil { - servicesFilesArtifactsBytes = consts.EmptyValueForJsonList - } - servicesFilesArtifacts := []*servicesFilesArtifacts{} - servicesFilesArtifactsPtr := &servicesFilesArtifacts - - if err := json.Unmarshal(servicesFilesArtifactsBytes, servicesFilesArtifactsPtr); err != nil { - return nil, stacktrace.Propagate(err, "An error occurred unmarshalling service identifiers") - } - - return servicesFilesArtifacts, nil -} diff --git a/core/server/api_container/server/service_network/services_files_artifacts/repository_test.go b/core/server/api_container/server/service_network/services_files_artifacts/repository_test.go deleted file mode 100644 index 38343554e1..0000000000 --- a/core/server/api_container/server/service_network/services_files_artifacts/repository_test.go +++ /dev/null @@ -1 +0,0 @@ -package services_files_artifacts diff --git a/core/server/api_container/server/service_network/services_files_artifacts/services_files_artifacts.go b/core/server/api_container/server/service_network/services_files_artifacts/services_files_artifacts.go deleted file mode 100644 index 085170bb48..0000000000 --- a/core/server/api_container/server/service_network/services_files_artifacts/services_files_artifacts.go +++ /dev/null @@ -1,48 +0,0 @@ -package services_files_artifacts - -import ( - "encoding/json" - "github.com/kurtosis-tech/kurtosis/container-engine-lib/lib/backend_interface/objects/service" - "github.com/kurtosis-tech/stacktrace" -) - -const ( - uuidKey = "uuid" - serviceDirPathsToFilesArtifactsIdentifiersKey = "services-to-files-artifacts" -) - -type servicesFilesArtifacts struct { - uuid service.ServiceUUID - - serviceDirPathsToFilesArtifactIdentifiers map[string]string -} - -func NewServicesFilesArtifactsObj(uuid service.ServiceUUID, serviceDirPathsToFilesArtifactsIdentifiers map[string]string) *servicesFilesArtifacts { - return &servicesFilesArtifacts{uuid: uuid, serviceDirPathsToFilesArtifactIdentifiers: serviceDirPathsToFilesArtifactsIdentifiers} -} - -func (servicesFilesArtifacts *servicesFilesArtifacts) GetUuid() service.ServiceUUID { - return servicesFilesArtifacts.uuid -} - -func (servicesFilesArtifacts *servicesFilesArtifacts) GetServiceDirPathsToFilesArtifactsIdentifiers() map[string]string { - return servicesFilesArtifacts.serviceDirPathsToFilesArtifactIdentifiers -} - -func (servicesFilesArtifacts *servicesFilesArtifacts) MarshalJSON() ([]byte, error) { - - data := map[string]string{} - - return json.Marshal(data) -} - -func (servicesFilesArtifacts *servicesFilesArtifacts) UnmarshalJSON(data []byte) error { - - unmarshalledMapPtr := &map[string]string{} - - if err := json.Unmarshal(data, unmarshalledMapPtr); err != nil { - return stacktrace.Propagate(err, "An error occurred unmarshalling map") - } - - return nil -} diff --git a/core/server/api_container/server/service_network/services_files_artifacts/services_files_artifacts_test.go b/core/server/api_container/server/service_network/services_files_artifacts/services_files_artifacts_test.go deleted file mode 100644 index 38343554e1..0000000000 --- a/core/server/api_container/server/service_network/services_files_artifacts/services_files_artifacts_test.go +++ /dev/null @@ -1 +0,0 @@ -package services_files_artifacts From 0d9e2b0d331b325d7f43d9363e79948f2dce1413 Mon Sep 17 00:00:00 2001 From: Tedi Mitiku Date: Fri, 28 Mar 2025 13:31:38 -0400 Subject: [PATCH 18/48] remove service files artifacts repo --- .../core/lib/binding_constructors/binding_constructors.go | 1 + cli/cli/commands/service/add/add.go | 4 ---- .../commands/service/service_helpers/service_helpers.go | 7 +------ core/files_artifacts_expander/main.go | 2 +- 4 files changed, 3 insertions(+), 11 deletions(-) diff --git a/api/golang/core/lib/binding_constructors/binding_constructors.go b/api/golang/core/lib/binding_constructors/binding_constructors.go index 33b9f212f7..00681c2a8a 100644 --- a/api/golang/core/lib/binding_constructors/binding_constructors.go +++ b/api/golang/core/lib/binding_constructors/binding_constructors.go @@ -384,6 +384,7 @@ func NewServiceInfo( MinMillicpus: minMillicpus, MaxMemoryMegabytes: maxMemoryMegabytes, MinMemoryMegabytes: minMemoryMegabytes, + User: nil, } } diff --git a/cli/cli/commands/service/add/add.go b/cli/cli/commands/service/add/add.go index c82d7582cc..5dc8f2fc70 100644 --- a/cli/cli/commands/service/add/add.go +++ b/cli/cli/commands/service/add/add.go @@ -37,8 +37,6 @@ const ( serviceImageArgKey = "image" - cmdArgsFlagsKey = "cmd-arg" - entrypointBinaryFlagKey = "entrypoint" envvarsFlagKey = "env" @@ -77,8 +75,6 @@ const ( JsonConfigFlagKeyDefault = "" portMappingSeparatorForLogs = ", " - - defaultPortWaitTimeoutStr = "30s" ) var ( diff --git a/cli/cli/commands/service/service_helpers/service_helpers.go b/cli/cli/commands/service/service_helpers/service_helpers.go index 0e8a33bcb1..c8b3cda0f8 100644 --- a/cli/cli/commands/service/service_helpers/service_helpers.go +++ b/cli/cli/commands/service/service_helpers/service_helpers.go @@ -67,12 +67,6 @@ var ( portNumberProtocolDelimiter, transportProtocolSpecForHelp, ) - serviceAddSpecWithPortId = fmt.Sprintf( - `%v%v%v`, - portIdSpecForHelp, - portIdSpecDelimiter, - serviceAddSpec, - ) ) // Helpers @@ -120,6 +114,7 @@ func GetServiceInfo(ctx context.Context, kurtosisCtx *kurtosis_context.KurtosisC User: services.ConvertApiUserToJsonUser(service.GetUser()), Tolerations: services.ConvertApiTolerationsToJsonTolerations(service.GetTolerations()), NodeSelectors: service.GetNodeSelectors(), + Labels: service.GetLabels(), TiniEnabled: &isTiniEnabled, } diff --git a/core/files_artifacts_expander/main.go b/core/files_artifacts_expander/main.go index b2e6a3854a..54f2a0dedf 100644 --- a/core/files_artifacts_expander/main.go +++ b/core/files_artifacts_expander/main.go @@ -111,7 +111,7 @@ func runMain() error { // NOTE: We don't use stacktrace here because the actual stacktraces we care about are the ones from the threads! return fmt.Errorf( - "The following errors occurred when trying to expand files artifacts:\n%v", + "the following errors occurred when trying to expand files artifacts:\n%v", strings.Join(allIndexedResultErrStrs, "\n\n"), ) } From fc1318f41e04e916ff41076b03b82669b800115f Mon Sep 17 00:00:00 2001 From: Tedi Mitiku Date: Fri, 28 Mar 2025 14:16:45 -0400 Subject: [PATCH 19/48] remove username from user proto --- .../api_container_service.pb.go | 1530 ++++++++--------- .../binding_constructors.go | 12 +- api/protobuf/core/api_container_service.proto | 6 +- api/rust/src/api_container_api.rs | 6 +- .../api_container_service_pb.d.ts | 4 - .../api_container_service_pb.js | 52 +- .../connect/api_container_service_pb.d.ts | 9 +- .../connect/api_container_service_pb.js | 5 +- .../server/api_container_service.go | 39 +- 9 files changed, 820 insertions(+), 843 deletions(-) diff --git a/api/golang/core/kurtosis_core_rpc_api_bindings/api_container_service.pb.go b/api/golang/core/kurtosis_core_rpc_api_bindings/api_container_service.pb.go index 9b17fdfebc..8588c10a92 100644 --- a/api/golang/core/kurtosis_core_rpc_api_bindings/api_container_service.pb.go +++ b/api/golang/core/kurtosis_core_rpc_api_bindings/api_container_service.pb.go @@ -580,9 +580,8 @@ type User struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Username string `protobuf:"bytes,1,opt,name=username,proto3" json:"username,omitempty"` - Uid uint32 `protobuf:"varint,2,opt,name=uid,proto3" json:"uid,omitempty"` - Gid uint32 `protobuf:"varint,3,opt,name=gid,proto3" json:"gid,omitempty"` + Uid uint32 `protobuf:"varint,1,opt,name=uid,proto3" json:"uid,omitempty"` + Gid uint32 `protobuf:"varint,2,opt,name=gid,proto3" json:"gid,omitempty"` } func (x *User) Reset() { @@ -617,13 +616,6 @@ func (*User) Descriptor() ([]byte, []int) { return file_api_container_service_proto_rawDescGZIP(), []int{3} } -func (x *User) GetUsername() string { - if x != nil { - return x.Username - } - return "" -} - func (x *User) GetUid() uint32 { if x != nil { return x.Uid @@ -3854,787 +3846,785 @@ var file_api_container_service_proto_rawDesc = []byte{ 0x65, 0x73, 0x5f, 0x61, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x73, 0x5f, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x19, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x73, 0x49, 0x64, - 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x73, 0x22, 0x46, 0x0a, 0x04, 0x55, 0x73, 0x65, - 0x72, 0x12, 0x1a, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x10, 0x0a, - 0x03, 0x75, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x03, 0x75, 0x69, 0x64, 0x12, - 0x10, 0x0a, 0x03, 0x67, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x03, 0x67, 0x69, - 0x64, 0x22, 0x97, 0x01, 0x0a, 0x0a, 0x54, 0x6f, 0x6c, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, - 0x65, 0x79, 0x12, 0x1a, 0x0a, 0x08, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x12, 0x14, - 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x65, 0x66, 0x66, 0x65, 0x63, 0x74, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, 0x66, 0x66, 0x65, 0x63, 0x74, 0x12, 0x2d, 0x0a, 0x12, - 0x74, 0x6f, 0x6c, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x65, 0x63, 0x6f, 0x6e, - 0x64, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x11, 0x74, 0x6f, 0x6c, 0x65, 0x72, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x22, 0xdb, 0x0c, 0x0a, 0x0b, - 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x21, 0x0a, 0x0c, 0x73, - 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x75, 0x75, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0b, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x55, 0x75, 0x69, 0x64, 0x12, 0x26, - 0x0a, 0x0f, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x5f, 0x69, 0x70, 0x5f, 0x61, 0x64, 0x64, - 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, - 0x49, 0x70, 0x41, 0x64, 0x64, 0x72, 0x12, 0x55, 0x0a, 0x0d, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, - 0x65, 0x5f, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x30, 0x2e, + 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x73, 0x22, 0x2a, 0x0a, 0x04, 0x55, 0x73, 0x65, + 0x72, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x03, + 0x75, 0x69, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x67, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, + 0x52, 0x03, 0x67, 0x69, 0x64, 0x22, 0x97, 0x01, 0x0a, 0x0a, 0x54, 0x6f, 0x6c, 0x65, 0x72, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x1a, 0x0a, 0x08, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, + 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, + 0x6f, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x65, 0x66, 0x66, 0x65, + 0x63, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, 0x66, 0x66, 0x65, 0x63, 0x74, + 0x12, 0x2d, 0x0a, 0x12, 0x74, 0x6f, 0x6c, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, + 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x11, 0x74, 0x6f, + 0x6c, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x22, + 0xdb, 0x0c, 0x0a, 0x0b, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, + 0x21, 0x0a, 0x0c, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x75, 0x75, 0x69, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x55, 0x75, + 0x69, 0x64, 0x12, 0x26, 0x0a, 0x0f, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x5f, 0x69, 0x70, + 0x5f, 0x61, 0x64, 0x64, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x70, 0x72, 0x69, + 0x76, 0x61, 0x74, 0x65, 0x49, 0x70, 0x41, 0x64, 0x64, 0x72, 0x12, 0x55, 0x0a, 0x0d, 0x70, 0x72, + 0x69, 0x76, 0x61, 0x74, 0x65, 0x5f, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x30, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, + 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, + 0x6f, 0x2e, 0x50, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x50, 0x6f, 0x72, 0x74, 0x73, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x52, 0x0c, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x50, 0x6f, 0x72, 0x74, + 0x73, 0x12, 0x2f, 0x0a, 0x14, 0x6d, 0x61, 0x79, 0x62, 0x65, 0x5f, 0x70, 0x75, 0x62, 0x6c, 0x69, + 0x63, 0x5f, 0x69, 0x70, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x11, 0x6d, 0x61, 0x79, 0x62, 0x65, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x49, 0x70, 0x41, 0x64, + 0x64, 0x72, 0x12, 0x62, 0x0a, 0x12, 0x6d, 0x61, 0x79, 0x62, 0x65, 0x5f, 0x70, 0x75, 0x62, 0x6c, + 0x69, 0x63, 0x5f, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x34, + 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, + 0x70, 0x69, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x4d, + 0x61, 0x79, 0x62, 0x65, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x50, 0x6f, 0x72, 0x74, 0x73, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x52, 0x10, 0x6d, 0x61, 0x79, 0x62, 0x65, 0x50, 0x75, 0x62, 0x6c, 0x69, + 0x63, 0x50, 0x6f, 0x72, 0x74, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x06, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x73, 0x68, + 0x6f, 0x72, 0x74, 0x65, 0x6e, 0x65, 0x64, 0x5f, 0x75, 0x75, 0x69, 0x64, 0x18, 0x07, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0d, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x65, 0x6e, 0x65, 0x64, 0x55, 0x75, 0x69, + 0x64, 0x12, 0x47, 0x0a, 0x0e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x73, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x20, 0x2e, 0x61, 0x70, 0x69, 0x5f, + 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x65, + 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x0d, 0x73, 0x65, 0x72, + 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x3a, 0x0a, 0x09, 0x63, 0x6f, + 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, - 0x69, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x50, 0x72, - 0x69, 0x76, 0x61, 0x74, 0x65, 0x50, 0x6f, 0x72, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, - 0x0c, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x50, 0x6f, 0x72, 0x74, 0x73, 0x12, 0x2f, 0x0a, - 0x14, 0x6d, 0x61, 0x79, 0x62, 0x65, 0x5f, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x5f, 0x69, 0x70, - 0x5f, 0x61, 0x64, 0x64, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x6d, 0x61, 0x79, - 0x62, 0x65, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x49, 0x70, 0x41, 0x64, 0x64, 0x72, 0x12, 0x62, - 0x0a, 0x12, 0x6d, 0x61, 0x79, 0x62, 0x65, 0x5f, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x5f, 0x70, - 0x6f, 0x72, 0x74, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x61, 0x70, 0x69, + 0x69, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x52, 0x09, 0x63, 0x6f, 0x6e, + 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x12, 0x9f, 0x01, 0x0a, 0x29, 0x73, 0x65, 0x72, 0x76, 0x69, + 0x63, 0x65, 0x5f, 0x64, 0x69, 0x72, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x73, 0x5f, 0x74, 0x6f, 0x5f, + 0x66, 0x69, 0x6c, 0x65, 0x73, 0x5f, 0x61, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x73, 0x5f, + 0x6c, 0x69, 0x73, 0x74, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x47, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x53, - 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x4d, 0x61, 0x79, 0x62, 0x65, - 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x50, 0x6f, 0x72, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, - 0x52, 0x10, 0x6d, 0x61, 0x79, 0x62, 0x65, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x50, 0x6f, 0x72, - 0x74, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x65, - 0x6e, 0x65, 0x64, 0x5f, 0x75, 0x75, 0x69, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, - 0x73, 0x68, 0x6f, 0x72, 0x74, 0x65, 0x6e, 0x65, 0x64, 0x55, 0x75, 0x69, 0x64, 0x12, 0x47, 0x0a, - 0x0e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, - 0x08, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x20, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, - 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, - 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x0d, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, - 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x3a, 0x0a, 0x09, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, - 0x6e, 0x65, 0x72, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x61, 0x70, 0x69, 0x5f, - 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x43, 0x6f, - 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x52, 0x09, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, - 0x65, 0x72, 0x12, 0x9f, 0x01, 0x0a, 0x29, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x64, - 0x69, 0x72, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x73, 0x5f, 0x74, 0x6f, 0x5f, 0x66, 0x69, 0x6c, 0x65, - 0x73, 0x5f, 0x61, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x73, 0x5f, 0x6c, 0x69, 0x73, 0x74, - 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x47, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, - 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, - 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x44, 0x69, - 0x72, 0x50, 0x61, 0x74, 0x68, 0x73, 0x54, 0x6f, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x72, 0x74, - 0x69, 0x66, 0x61, 0x63, 0x74, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, - 0x23, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x44, 0x69, 0x72, 0x50, 0x61, 0x74, 0x68, 0x73, - 0x54, 0x6f, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x73, - 0x4c, 0x69, 0x73, 0x74, 0x12, 0x23, 0x0a, 0x0d, 0x6d, 0x61, 0x78, 0x5f, 0x6d, 0x69, 0x6c, 0x6c, - 0x69, 0x63, 0x70, 0x75, 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0c, 0x6d, 0x61, 0x78, - 0x4d, 0x69, 0x6c, 0x6c, 0x69, 0x63, 0x70, 0x75, 0x73, 0x12, 0x23, 0x0a, 0x0d, 0x6d, 0x69, 0x6e, - 0x5f, 0x6d, 0x69, 0x6c, 0x6c, 0x69, 0x63, 0x70, 0x75, 0x73, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0d, - 0x52, 0x0c, 0x6d, 0x69, 0x6e, 0x4d, 0x69, 0x6c, 0x6c, 0x69, 0x63, 0x70, 0x75, 0x73, 0x12, 0x30, - 0x0a, 0x14, 0x6d, 0x61, 0x78, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x6d, 0x65, 0x67, - 0x61, 0x62, 0x79, 0x74, 0x65, 0x73, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x12, 0x6d, 0x61, - 0x78, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x4d, 0x65, 0x67, 0x61, 0x62, 0x79, 0x74, 0x65, 0x73, - 0x12, 0x30, 0x0a, 0x14, 0x6d, 0x69, 0x6e, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x6d, - 0x65, 0x67, 0x61, 0x62, 0x79, 0x74, 0x65, 0x73, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x12, - 0x6d, 0x69, 0x6e, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x4d, 0x65, 0x67, 0x61, 0x62, 0x79, 0x74, - 0x65, 0x73, 0x12, 0x30, 0x0a, 0x04, 0x75, 0x73, 0x65, 0x72, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x17, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, - 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x48, 0x00, 0x52, 0x04, 0x75, 0x73, 0x65, - 0x72, 0x88, 0x01, 0x01, 0x12, 0x3f, 0x0a, 0x0b, 0x74, 0x6f, 0x6c, 0x65, 0x72, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x18, 0x10, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x61, 0x70, 0x69, 0x5f, - 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x54, 0x6f, - 0x6c, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0b, 0x74, 0x6f, 0x6c, 0x65, 0x72, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x58, 0x0a, 0x0e, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x73, 0x65, - 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x18, 0x11, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x31, 0x2e, + 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, + 0x63, 0x65, 0x44, 0x69, 0x72, 0x50, 0x61, 0x74, 0x68, 0x73, 0x54, 0x6f, 0x46, 0x69, 0x6c, 0x65, + 0x73, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x52, 0x23, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x44, 0x69, 0x72, 0x50, + 0x61, 0x74, 0x68, 0x73, 0x54, 0x6f, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x72, 0x74, 0x69, 0x66, + 0x61, 0x63, 0x74, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x23, 0x0a, 0x0d, 0x6d, 0x61, 0x78, 0x5f, + 0x6d, 0x69, 0x6c, 0x6c, 0x69, 0x63, 0x70, 0x75, 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0d, 0x52, + 0x0c, 0x6d, 0x61, 0x78, 0x4d, 0x69, 0x6c, 0x6c, 0x69, 0x63, 0x70, 0x75, 0x73, 0x12, 0x23, 0x0a, + 0x0d, 0x6d, 0x69, 0x6e, 0x5f, 0x6d, 0x69, 0x6c, 0x6c, 0x69, 0x63, 0x70, 0x75, 0x73, 0x18, 0x0c, + 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0c, 0x6d, 0x69, 0x6e, 0x4d, 0x69, 0x6c, 0x6c, 0x69, 0x63, 0x70, + 0x75, 0x73, 0x12, 0x30, 0x0a, 0x14, 0x6d, 0x61, 0x78, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, + 0x5f, 0x6d, 0x65, 0x67, 0x61, 0x62, 0x79, 0x74, 0x65, 0x73, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0d, + 0x52, 0x12, 0x6d, 0x61, 0x78, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x4d, 0x65, 0x67, 0x61, 0x62, + 0x79, 0x74, 0x65, 0x73, 0x12, 0x30, 0x0a, 0x14, 0x6d, 0x69, 0x6e, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, + 0x72, 0x79, 0x5f, 0x6d, 0x65, 0x67, 0x61, 0x62, 0x79, 0x74, 0x65, 0x73, 0x18, 0x0e, 0x20, 0x01, + 0x28, 0x0d, 0x52, 0x12, 0x6d, 0x69, 0x6e, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x4d, 0x65, 0x67, + 0x61, 0x62, 0x79, 0x74, 0x65, 0x73, 0x12, 0x30, 0x0a, 0x04, 0x75, 0x73, 0x65, 0x72, 0x18, 0x0f, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, + 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x48, 0x00, 0x52, + 0x04, 0x75, 0x73, 0x65, 0x72, 0x88, 0x01, 0x01, 0x12, 0x3f, 0x0a, 0x0b, 0x74, 0x6f, 0x6c, 0x65, + 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x10, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, - 0x69, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x4e, 0x6f, - 0x64, 0x65, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, - 0x52, 0x0d, 0x6e, 0x6f, 0x64, 0x65, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x12, - 0x42, 0x0a, 0x06, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x12, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x2a, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, - 0x61, 0x70, 0x69, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, - 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x06, 0x6c, 0x61, 0x62, - 0x65, 0x6c, 0x73, 0x12, 0x26, 0x0a, 0x0c, 0x74, 0x69, 0x6e, 0x69, 0x5f, 0x65, 0x6e, 0x61, 0x62, - 0x6c, 0x65, 0x64, 0x18, 0x13, 0x20, 0x01, 0x28, 0x08, 0x48, 0x01, 0x52, 0x0b, 0x74, 0x69, 0x6e, - 0x69, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x88, 0x01, 0x01, 0x1a, 0x58, 0x0a, 0x11, 0x50, - 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x50, 0x6f, 0x72, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, - 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, - 0x65, 0x79, 0x12, 0x2d, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x17, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, - 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x50, 0x6f, 0x72, 0x74, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x5c, 0x0a, 0x15, 0x4d, 0x61, 0x79, 0x62, 0x65, 0x50, 0x75, - 0x62, 0x6c, 0x69, 0x63, 0x50, 0x6f, 0x72, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, - 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, - 0x12, 0x2d, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x17, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, - 0x61, 0x70, 0x69, 0x2e, 0x50, 0x6f, 0x72, 0x74, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, - 0x02, 0x38, 0x01, 0x1a, 0x7d, 0x0a, 0x28, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x44, 0x69, - 0x72, 0x50, 0x61, 0x74, 0x68, 0x73, 0x54, 0x6f, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x72, 0x74, - 0x69, 0x66, 0x61, 0x63, 0x74, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, - 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, - 0x79, 0x12, 0x3b, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x25, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, - 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, - 0x63, 0x74, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, - 0x38, 0x01, 0x1a, 0x40, 0x0a, 0x12, 0x4e, 0x6f, 0x64, 0x65, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, - 0x6f, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x39, 0x0a, 0x0b, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, + 0x69, 0x2e, 0x54, 0x6f, 0x6c, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0b, 0x74, 0x6f, + 0x6c, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x58, 0x0a, 0x0e, 0x6e, 0x6f, 0x64, + 0x65, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x18, 0x11, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x31, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, + 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, + 0x6f, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0d, 0x6e, 0x6f, 0x64, 0x65, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, + 0x6f, 0x72, 0x73, 0x12, 0x42, 0x0a, 0x06, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x12, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, + 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, + 0x6e, 0x66, 0x6f, 0x2e, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, + 0x06, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x12, 0x26, 0x0a, 0x0c, 0x74, 0x69, 0x6e, 0x69, 0x5f, + 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x13, 0x20, 0x01, 0x28, 0x08, 0x48, 0x01, 0x52, + 0x0b, 0x74, 0x69, 0x6e, 0x69, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x88, 0x01, 0x01, 0x1a, + 0x58, 0x0a, 0x11, 0x50, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x50, 0x6f, 0x72, 0x74, 0x73, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2d, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, + 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x50, 0x6f, 0x72, 0x74, 0x52, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x5c, 0x0a, 0x15, 0x4d, 0x61, 0x79, + 0x62, 0x65, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x50, 0x6f, 0x72, 0x74, 0x73, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2d, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, + 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x50, 0x6f, 0x72, 0x74, 0x52, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x7d, 0x0a, 0x28, 0x53, 0x65, 0x72, 0x76, 0x69, + 0x63, 0x65, 0x44, 0x69, 0x72, 0x50, 0x61, 0x74, 0x68, 0x73, 0x54, 0x6f, 0x46, 0x69, 0x6c, 0x65, + 0x73, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x42, - 0x07, 0x0a, 0x05, 0x5f, 0x75, 0x73, 0x65, 0x72, 0x42, 0x0f, 0x0a, 0x0d, 0x5f, 0x74, 0x69, 0x6e, - 0x69, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x22, 0xd0, 0x05, 0x0a, 0x15, 0x52, 0x75, - 0x6e, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, 0x41, - 0x72, 0x67, 0x73, 0x12, 0x2b, 0x0a, 0x11, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, - 0x64, 0x5f, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, - 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, - 0x12, 0x30, 0x0a, 0x11, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x5f, 0x70, - 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x10, 0x73, - 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x88, - 0x01, 0x01, 0x12, 0x1c, 0x0a, 0x07, 0x64, 0x72, 0x79, 0x5f, 0x72, 0x75, 0x6e, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x08, 0x48, 0x01, 0x52, 0x06, 0x64, 0x72, 0x79, 0x52, 0x75, 0x6e, 0x88, 0x01, 0x01, - 0x12, 0x25, 0x0a, 0x0b, 0x70, 0x61, 0x72, 0x61, 0x6c, 0x6c, 0x65, 0x6c, 0x69, 0x73, 0x6d, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x05, 0x48, 0x02, 0x52, 0x0b, 0x70, 0x61, 0x72, 0x61, 0x6c, 0x6c, 0x65, - 0x6c, 0x69, 0x73, 0x6d, 0x88, 0x01, 0x01, 0x12, 0x31, 0x0a, 0x12, 0x6d, 0x61, 0x69, 0x6e, 0x5f, - 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, - 0x01, 0x28, 0x09, 0x48, 0x03, 0x52, 0x10, 0x6d, 0x61, 0x69, 0x6e, 0x46, 0x75, 0x6e, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x88, 0x01, 0x01, 0x12, 0x5b, 0x0a, 0x15, 0x65, 0x78, - 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x5f, 0x66, 0x65, 0x61, 0x74, 0x75, - 0x72, 0x65, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x26, 0x2e, 0x61, 0x70, 0x69, 0x5f, - 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x4b, 0x75, - 0x72, 0x74, 0x6f, 0x73, 0x69, 0x73, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x46, 0x6c, 0x61, - 0x67, 0x52, 0x14, 0x65, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x46, - 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x12, 0x2f, 0x0a, 0x11, 0x63, 0x6c, 0x6f, 0x75, 0x64, - 0x5f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x07, 0x20, 0x01, - 0x28, 0x09, 0x48, 0x04, 0x52, 0x0f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x49, 0x6e, 0x73, 0x74, 0x61, - 0x6e, 0x63, 0x65, 0x49, 0x64, 0x88, 0x01, 0x01, 0x12, 0x27, 0x0a, 0x0d, 0x63, 0x6c, 0x6f, 0x75, - 0x64, 0x5f, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x48, - 0x05, 0x52, 0x0b, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x55, 0x73, 0x65, 0x72, 0x49, 0x64, 0x88, 0x01, - 0x01, 0x12, 0x59, 0x0a, 0x13, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x5f, 0x64, 0x6f, 0x77, 0x6e, 0x6c, - 0x6f, 0x61, 0x64, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x24, - 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, - 0x70, 0x69, 0x2e, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x44, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, - 0x4d, 0x6f, 0x64, 0x65, 0x48, 0x06, 0x52, 0x11, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x44, 0x6f, 0x77, - 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x4d, 0x6f, 0x64, 0x65, 0x88, 0x01, 0x01, 0x12, 0x2f, 0x0a, 0x11, + 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x3b, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, + 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x72, + 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x40, 0x0a, 0x12, 0x4e, 0x6f, 0x64, 0x65, 0x53, 0x65, + 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, + 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, + 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x39, 0x0a, 0x0b, 0x4c, 0x61, 0x62, 0x65, + 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, + 0x02, 0x38, 0x01, 0x42, 0x07, 0x0a, 0x05, 0x5f, 0x75, 0x73, 0x65, 0x72, 0x42, 0x0f, 0x0a, 0x0d, + 0x5f, 0x74, 0x69, 0x6e, 0x69, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x22, 0xd0, 0x05, + 0x0a, 0x15, 0x52, 0x75, 0x6e, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x53, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x41, 0x72, 0x67, 0x73, 0x12, 0x2b, 0x0a, 0x11, 0x73, 0x65, 0x72, 0x69, 0x61, + 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x5f, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x10, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x53, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x12, 0x30, 0x0a, 0x11, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, + 0x65, 0x64, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, + 0x00, 0x52, 0x10, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x50, 0x61, 0x72, + 0x61, 0x6d, 0x73, 0x88, 0x01, 0x01, 0x12, 0x1c, 0x0a, 0x07, 0x64, 0x72, 0x79, 0x5f, 0x72, 0x75, + 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x48, 0x01, 0x52, 0x06, 0x64, 0x72, 0x79, 0x52, 0x75, + 0x6e, 0x88, 0x01, 0x01, 0x12, 0x25, 0x0a, 0x0b, 0x70, 0x61, 0x72, 0x61, 0x6c, 0x6c, 0x65, 0x6c, + 0x69, 0x73, 0x6d, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x48, 0x02, 0x52, 0x0b, 0x70, 0x61, 0x72, + 0x61, 0x6c, 0x6c, 0x65, 0x6c, 0x69, 0x73, 0x6d, 0x88, 0x01, 0x01, 0x12, 0x31, 0x0a, 0x12, 0x6d, + 0x61, 0x69, 0x6e, 0x5f, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, + 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x48, 0x03, 0x52, 0x10, 0x6d, 0x61, 0x69, 0x6e, 0x46, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x88, 0x01, 0x01, 0x12, 0x5b, + 0x0a, 0x15, 0x65, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x5f, 0x66, + 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x26, 0x2e, + 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, + 0x69, 0x2e, 0x4b, 0x75, 0x72, 0x74, 0x6f, 0x73, 0x69, 0x73, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, + 0x65, 0x46, 0x6c, 0x61, 0x67, 0x52, 0x14, 0x65, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, + 0x74, 0x61, 0x6c, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x12, 0x2f, 0x0a, 0x11, 0x63, + 0x6c, 0x6f, 0x75, 0x64, 0x5f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x64, + 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x48, 0x04, 0x52, 0x0f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x49, + 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x64, 0x88, 0x01, 0x01, 0x12, 0x27, 0x0a, 0x0d, + 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x5f, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x08, 0x20, + 0x01, 0x28, 0x09, 0x48, 0x05, 0x52, 0x0b, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x55, 0x73, 0x65, 0x72, + 0x49, 0x64, 0x88, 0x01, 0x01, 0x12, 0x59, 0x0a, 0x13, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x5f, 0x64, + 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x09, 0x20, 0x01, + 0x28, 0x0e, 0x32, 0x24, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, + 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x44, 0x6f, 0x77, 0x6e, + 0x6c, 0x6f, 0x61, 0x64, 0x4d, 0x6f, 0x64, 0x65, 0x48, 0x06, 0x52, 0x11, 0x69, 0x6d, 0x61, 0x67, + 0x65, 0x44, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x4d, 0x6f, 0x64, 0x65, 0x88, 0x01, 0x01, + 0x12, 0x2f, 0x0a, 0x11, 0x6e, 0x6f, 0x6e, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x69, 0x6e, 0x67, + 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x08, 0x48, 0x07, 0x52, 0x0f, 0x6e, + 0x6f, 0x6e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x69, 0x6e, 0x67, 0x4d, 0x6f, 0x64, 0x65, 0x88, 0x01, + 0x01, 0x42, 0x14, 0x0a, 0x12, 0x5f, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, + 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x42, 0x0a, 0x0a, 0x08, 0x5f, 0x64, 0x72, 0x79, 0x5f, + 0x72, 0x75, 0x6e, 0x42, 0x0e, 0x0a, 0x0c, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6c, 0x6c, 0x65, 0x6c, + 0x69, 0x73, 0x6d, 0x42, 0x15, 0x0a, 0x13, 0x5f, 0x6d, 0x61, 0x69, 0x6e, 0x5f, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x42, 0x14, 0x0a, 0x12, 0x5f, 0x63, + 0x6c, 0x6f, 0x75, 0x64, 0x5f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x64, + 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x5f, 0x75, 0x73, 0x65, 0x72, 0x5f, + 0x69, 0x64, 0x42, 0x16, 0x0a, 0x14, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x5f, 0x64, 0x6f, 0x77, + 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x42, 0x14, 0x0a, 0x12, 0x5f, 0x6e, + 0x6f, 0x6e, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x69, 0x6e, 0x67, 0x5f, 0x6d, 0x6f, 0x64, 0x65, + 0x22, 0xf4, 0x07, 0x0a, 0x16, 0x52, 0x75, 0x6e, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, + 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x41, 0x72, 0x67, 0x73, 0x12, 0x1d, 0x0a, 0x0a, 0x70, + 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x09, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x49, 0x64, 0x12, 0x16, 0x0a, 0x05, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x48, 0x00, 0x52, 0x05, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x12, 0x18, 0x0a, 0x06, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x08, 0x48, 0x00, 0x52, 0x06, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x12, 0x30, 0x0a, 0x11, + 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, + 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x10, 0x73, 0x65, 0x72, 0x69, 0x61, + 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x88, 0x01, 0x01, 0x12, 0x1c, + 0x0a, 0x07, 0x64, 0x72, 0x79, 0x5f, 0x72, 0x75, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x48, + 0x02, 0x52, 0x06, 0x64, 0x72, 0x79, 0x52, 0x75, 0x6e, 0x88, 0x01, 0x01, 0x12, 0x25, 0x0a, 0x0b, + 0x70, 0x61, 0x72, 0x61, 0x6c, 0x6c, 0x65, 0x6c, 0x69, 0x73, 0x6d, 0x18, 0x07, 0x20, 0x01, 0x28, + 0x05, 0x48, 0x03, 0x52, 0x0b, 0x70, 0x61, 0x72, 0x61, 0x6c, 0x6c, 0x65, 0x6c, 0x69, 0x73, 0x6d, + 0x88, 0x01, 0x01, 0x12, 0x28, 0x0a, 0x0d, 0x63, 0x6c, 0x6f, 0x6e, 0x65, 0x5f, 0x70, 0x61, 0x63, + 0x6b, 0x61, 0x67, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x48, 0x04, 0x52, 0x0c, 0x63, 0x6c, + 0x6f, 0x6e, 0x65, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x88, 0x01, 0x01, 0x12, 0x3f, 0x0a, + 0x1a, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x5f, 0x74, + 0x6f, 0x5f, 0x6d, 0x61, 0x69, 0x6e, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, + 0x09, 0x48, 0x05, 0x52, 0x16, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x76, 0x65, 0x50, 0x61, 0x74, + 0x68, 0x54, 0x6f, 0x4d, 0x61, 0x69, 0x6e, 0x46, 0x69, 0x6c, 0x65, 0x88, 0x01, 0x01, 0x12, 0x31, + 0x0a, 0x12, 0x6d, 0x61, 0x69, 0x6e, 0x5f, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, + 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x48, 0x06, 0x52, 0x10, 0x6d, 0x61, + 0x69, 0x6e, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x88, 0x01, + 0x01, 0x12, 0x5b, 0x0a, 0x15, 0x65, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x61, + 0x6c, 0x5f, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x0e, + 0x32, 0x26, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, + 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x4b, 0x75, 0x72, 0x74, 0x6f, 0x73, 0x69, 0x73, 0x46, 0x65, 0x61, + 0x74, 0x75, 0x72, 0x65, 0x46, 0x6c, 0x61, 0x67, 0x52, 0x14, 0x65, 0x78, 0x70, 0x65, 0x72, 0x69, + 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x12, 0x2f, + 0x0a, 0x11, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x5f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, + 0x5f, 0x69, 0x64, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x48, 0x07, 0x52, 0x0f, 0x63, 0x6c, 0x6f, + 0x75, 0x64, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x64, 0x88, 0x01, 0x01, 0x12, + 0x27, 0x0a, 0x0d, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x5f, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, + 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x48, 0x08, 0x52, 0x0b, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x55, + 0x73, 0x65, 0x72, 0x49, 0x64, 0x88, 0x01, 0x01, 0x12, 0x59, 0x0a, 0x13, 0x69, 0x6d, 0x61, 0x67, + 0x65, 0x5f, 0x64, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x18, + 0x0e, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x24, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, + 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x44, + 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x4d, 0x6f, 0x64, 0x65, 0x48, 0x09, 0x52, 0x11, 0x69, + 0x6d, 0x61, 0x67, 0x65, 0x44, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x4d, 0x6f, 0x64, 0x65, + 0x88, 0x01, 0x01, 0x12, 0x2f, 0x0a, 0x11, 0x6e, 0x6f, 0x6e, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, + 0x69, 0x6e, 0x67, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x08, 0x48, 0x0a, + 0x52, 0x0f, 0x6e, 0x6f, 0x6e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x69, 0x6e, 0x67, 0x4d, 0x6f, 0x64, + 0x65, 0x88, 0x01, 0x01, 0x12, 0x2f, 0x0a, 0x11, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x5f, 0x61, + 0x75, 0x74, 0x68, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x10, 0x20, 0x01, 0x28, 0x09, 0x48, + 0x0b, 0x52, 0x0f, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x41, 0x75, 0x74, 0x68, 0x54, 0x6f, 0x6b, + 0x65, 0x6e, 0x88, 0x01, 0x01, 0x42, 0x1a, 0x0a, 0x18, 0x73, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, + 0x6b, 0x5f, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, + 0x74, 0x42, 0x14, 0x0a, 0x12, 0x5f, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, + 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x42, 0x0a, 0x0a, 0x08, 0x5f, 0x64, 0x72, 0x79, 0x5f, + 0x72, 0x75, 0x6e, 0x42, 0x0e, 0x0a, 0x0c, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6c, 0x6c, 0x65, 0x6c, + 0x69, 0x73, 0x6d, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x63, 0x6c, 0x6f, 0x6e, 0x65, 0x5f, 0x70, 0x61, + 0x63, 0x6b, 0x61, 0x67, 0x65, 0x42, 0x1d, 0x0a, 0x1b, 0x5f, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, + 0x76, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x5f, 0x74, 0x6f, 0x5f, 0x6d, 0x61, 0x69, 0x6e, 0x5f, + 0x66, 0x69, 0x6c, 0x65, 0x42, 0x15, 0x0a, 0x13, 0x5f, 0x6d, 0x61, 0x69, 0x6e, 0x5f, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x42, 0x14, 0x0a, 0x12, 0x5f, + 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x5f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, + 0x64, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x5f, 0x75, 0x73, 0x65, 0x72, + 0x5f, 0x69, 0x64, 0x42, 0x16, 0x0a, 0x14, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x5f, 0x64, 0x6f, + 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x42, 0x14, 0x0a, 0x12, 0x5f, 0x6e, 0x6f, 0x6e, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x69, 0x6e, 0x67, 0x5f, 0x6d, 0x6f, 0x64, - 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x08, 0x48, 0x07, 0x52, 0x0f, 0x6e, 0x6f, 0x6e, 0x42, 0x6c, - 0x6f, 0x63, 0x6b, 0x69, 0x6e, 0x67, 0x4d, 0x6f, 0x64, 0x65, 0x88, 0x01, 0x01, 0x42, 0x14, 0x0a, - 0x12, 0x5f, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x5f, 0x70, 0x61, 0x72, - 0x61, 0x6d, 0x73, 0x42, 0x0a, 0x0a, 0x08, 0x5f, 0x64, 0x72, 0x79, 0x5f, 0x72, 0x75, 0x6e, 0x42, - 0x0e, 0x0a, 0x0c, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6c, 0x6c, 0x65, 0x6c, 0x69, 0x73, 0x6d, 0x42, - 0x15, 0x0a, 0x13, 0x5f, 0x6d, 0x61, 0x69, 0x6e, 0x5f, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x42, 0x14, 0x0a, 0x12, 0x5f, 0x63, 0x6c, 0x6f, 0x75, 0x64, - 0x5f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x42, 0x10, 0x0a, 0x0e, - 0x5f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x5f, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x42, 0x16, - 0x0a, 0x14, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x5f, 0x64, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, - 0x64, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x42, 0x14, 0x0a, 0x12, 0x5f, 0x6e, 0x6f, 0x6e, 0x5f, 0x62, - 0x6c, 0x6f, 0x63, 0x6b, 0x69, 0x6e, 0x67, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x22, 0xf4, 0x07, 0x0a, - 0x16, 0x52, 0x75, 0x6e, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x50, 0x61, 0x63, 0x6b, - 0x61, 0x67, 0x65, 0x41, 0x72, 0x67, 0x73, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x61, 0x63, 0x6b, 0x61, - 0x67, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x70, 0x61, 0x63, - 0x6b, 0x61, 0x67, 0x65, 0x49, 0x64, 0x12, 0x16, 0x0a, 0x05, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x0c, 0x48, 0x00, 0x52, 0x05, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x12, 0x18, - 0x0a, 0x06, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x48, 0x00, - 0x52, 0x06, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x12, 0x30, 0x0a, 0x11, 0x73, 0x65, 0x72, 0x69, - 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x05, 0x20, - 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x10, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, - 0x64, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x88, 0x01, 0x01, 0x12, 0x1c, 0x0a, 0x07, 0x64, 0x72, - 0x79, 0x5f, 0x72, 0x75, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x48, 0x02, 0x52, 0x06, 0x64, - 0x72, 0x79, 0x52, 0x75, 0x6e, 0x88, 0x01, 0x01, 0x12, 0x25, 0x0a, 0x0b, 0x70, 0x61, 0x72, 0x61, - 0x6c, 0x6c, 0x65, 0x6c, 0x69, 0x73, 0x6d, 0x18, 0x07, 0x20, 0x01, 0x28, 0x05, 0x48, 0x03, 0x52, - 0x0b, 0x70, 0x61, 0x72, 0x61, 0x6c, 0x6c, 0x65, 0x6c, 0x69, 0x73, 0x6d, 0x88, 0x01, 0x01, 0x12, - 0x28, 0x0a, 0x0d, 0x63, 0x6c, 0x6f, 0x6e, 0x65, 0x5f, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, - 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x48, 0x04, 0x52, 0x0c, 0x63, 0x6c, 0x6f, 0x6e, 0x65, 0x50, - 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x88, 0x01, 0x01, 0x12, 0x3f, 0x0a, 0x1a, 0x72, 0x65, 0x6c, - 0x61, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x5f, 0x74, 0x6f, 0x5f, 0x6d, 0x61, - 0x69, 0x6e, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x48, 0x05, 0x52, - 0x16, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x76, 0x65, 0x50, 0x61, 0x74, 0x68, 0x54, 0x6f, 0x4d, - 0x61, 0x69, 0x6e, 0x46, 0x69, 0x6c, 0x65, 0x88, 0x01, 0x01, 0x12, 0x31, 0x0a, 0x12, 0x6d, 0x61, - 0x69, 0x6e, 0x5f, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, - 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x48, 0x06, 0x52, 0x10, 0x6d, 0x61, 0x69, 0x6e, 0x46, 0x75, - 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x88, 0x01, 0x01, 0x12, 0x5b, 0x0a, - 0x15, 0x65, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x5f, 0x66, 0x65, - 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x26, 0x2e, 0x61, - 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, - 0x2e, 0x4b, 0x75, 0x72, 0x74, 0x6f, 0x73, 0x69, 0x73, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, - 0x46, 0x6c, 0x61, 0x67, 0x52, 0x14, 0x65, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, - 0x61, 0x6c, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x12, 0x2f, 0x0a, 0x11, 0x63, 0x6c, - 0x6f, 0x75, 0x64, 0x5f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, - 0x0c, 0x20, 0x01, 0x28, 0x09, 0x48, 0x07, 0x52, 0x0f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x49, 0x6e, - 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x64, 0x88, 0x01, 0x01, 0x12, 0x27, 0x0a, 0x0d, 0x63, - 0x6c, 0x6f, 0x75, 0x64, 0x5f, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x0d, 0x20, 0x01, - 0x28, 0x09, 0x48, 0x08, 0x52, 0x0b, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x55, 0x73, 0x65, 0x72, 0x49, - 0x64, 0x88, 0x01, 0x01, 0x12, 0x59, 0x0a, 0x13, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x5f, 0x64, 0x6f, - 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x0e, 0x20, 0x01, 0x28, - 0x0e, 0x32, 0x24, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, - 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x44, 0x6f, 0x77, 0x6e, 0x6c, - 0x6f, 0x61, 0x64, 0x4d, 0x6f, 0x64, 0x65, 0x48, 0x09, 0x52, 0x11, 0x69, 0x6d, 0x61, 0x67, 0x65, - 0x44, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x4d, 0x6f, 0x64, 0x65, 0x88, 0x01, 0x01, 0x12, - 0x2f, 0x0a, 0x11, 0x6e, 0x6f, 0x6e, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x69, 0x6e, 0x67, 0x5f, - 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x08, 0x48, 0x0a, 0x52, 0x0f, 0x6e, 0x6f, - 0x6e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x69, 0x6e, 0x67, 0x4d, 0x6f, 0x64, 0x65, 0x88, 0x01, 0x01, - 0x12, 0x2f, 0x0a, 0x11, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x5f, 0x61, 0x75, 0x74, 0x68, 0x5f, - 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x10, 0x20, 0x01, 0x28, 0x09, 0x48, 0x0b, 0x52, 0x0f, 0x67, - 0x69, 0x74, 0x68, 0x75, 0x62, 0x41, 0x75, 0x74, 0x68, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x88, 0x01, - 0x01, 0x42, 0x1a, 0x0a, 0x18, 0x73, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x5f, 0x70, 0x61, - 0x63, 0x6b, 0x61, 0x67, 0x65, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x42, 0x14, 0x0a, - 0x12, 0x5f, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x5f, 0x70, 0x61, 0x72, - 0x61, 0x6d, 0x73, 0x42, 0x0a, 0x0a, 0x08, 0x5f, 0x64, 0x72, 0x79, 0x5f, 0x72, 0x75, 0x6e, 0x42, - 0x0e, 0x0a, 0x0c, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6c, 0x6c, 0x65, 0x6c, 0x69, 0x73, 0x6d, 0x42, - 0x10, 0x0a, 0x0e, 0x5f, 0x63, 0x6c, 0x6f, 0x6e, 0x65, 0x5f, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, - 0x65, 0x42, 0x1d, 0x0a, 0x1b, 0x5f, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x70, - 0x61, 0x74, 0x68, 0x5f, 0x74, 0x6f, 0x5f, 0x6d, 0x61, 0x69, 0x6e, 0x5f, 0x66, 0x69, 0x6c, 0x65, - 0x42, 0x15, 0x0a, 0x13, 0x5f, 0x6d, 0x61, 0x69, 0x6e, 0x5f, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x42, 0x14, 0x0a, 0x12, 0x5f, 0x63, 0x6c, 0x6f, 0x75, - 0x64, 0x5f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x42, 0x10, 0x0a, - 0x0e, 0x5f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x5f, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x42, - 0x16, 0x0a, 0x14, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x5f, 0x64, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, - 0x61, 0x64, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x42, 0x14, 0x0a, 0x12, 0x5f, 0x6e, 0x6f, 0x6e, 0x5f, - 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x69, 0x6e, 0x67, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x42, 0x14, 0x0a, - 0x12, 0x5f, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x5f, 0x61, 0x75, 0x74, 0x68, 0x5f, 0x74, 0x6f, - 0x6b, 0x65, 0x6e, 0x22, 0xb6, 0x04, 0x0a, 0x17, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, - 0x52, 0x75, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x4c, 0x69, 0x6e, 0x65, 0x12, - 0x4a, 0x0a, 0x0b, 0x69, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, - 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, - 0x6b, 0x49, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x00, 0x52, 0x0b, - 0x69, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x38, 0x0a, 0x05, 0x65, - 0x72, 0x72, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x61, 0x70, 0x69, - 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x53, - 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x48, 0x00, 0x52, 0x05, - 0x65, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x4d, 0x0a, 0x0d, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, - 0x73, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x61, - 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, - 0x2e, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x52, 0x75, 0x6e, 0x50, 0x72, 0x6f, 0x67, - 0x72, 0x65, 0x73, 0x73, 0x48, 0x00, 0x52, 0x0c, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, - 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x5d, 0x0a, 0x12, 0x69, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x5f, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x2c, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, - 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x49, 0x6e, 0x73, - 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x48, 0x00, - 0x52, 0x11, 0x69, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, - 0x75, 0x6c, 0x74, 0x12, 0x5b, 0x0a, 0x12, 0x72, 0x75, 0x6e, 0x5f, 0x66, 0x69, 0x6e, 0x69, 0x73, - 0x68, 0x65, 0x64, 0x5f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x2b, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, - 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x52, 0x75, 0x6e, 0x46, - 0x69, 0x6e, 0x69, 0x73, 0x68, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x10, - 0x72, 0x75, 0x6e, 0x46, 0x69, 0x6e, 0x69, 0x73, 0x68, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, - 0x12, 0x3e, 0x0a, 0x07, 0x77, 0x61, 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x18, 0x06, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x22, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, - 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x57, 0x61, - 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x48, 0x00, 0x52, 0x07, 0x77, 0x61, 0x72, 0x6e, 0x69, 0x6e, 0x67, - 0x12, 0x35, 0x0a, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, + 0x65, 0x42, 0x14, 0x0a, 0x12, 0x5f, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x5f, 0x61, 0x75, 0x74, + 0x68, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0xb6, 0x04, 0x0a, 0x17, 0x53, 0x74, 0x61, 0x72, + 0x6c, 0x61, 0x72, 0x6b, 0x52, 0x75, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x4c, + 0x69, 0x6e, 0x65, 0x12, 0x4a, 0x0a, 0x0b, 0x69, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, + 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, 0x61, + 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x49, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x48, 0x00, 0x52, 0x0b, 0x69, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, + 0x38, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, - 0x70, 0x69, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x48, - 0x00, 0x52, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x42, 0x13, 0x0a, 0x11, 0x72, 0x75, 0x6e, 0x5f, 0x72, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x5f, 0x6c, 0x69, 0x6e, 0x65, 0x22, 0x31, 0x0a, 0x0c, - 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x21, 0x0a, 0x0c, - 0x69, 0x6e, 0x66, 0x6f, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0b, 0x69, 0x6e, 0x66, 0x6f, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, - 0x3a, 0x0a, 0x0f, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x57, 0x61, 0x72, 0x6e, 0x69, - 0x6e, 0x67, 0x12, 0x27, 0x0a, 0x0f, 0x77, 0x61, 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x5f, 0x6d, 0x65, - 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x77, 0x61, 0x72, - 0x6e, 0x69, 0x6e, 0x67, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0xcd, 0x02, 0x0a, 0x13, - 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x49, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x12, 0x4a, 0x0a, 0x08, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, - 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, - 0x72, 0x6b, 0x49, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x73, - 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x08, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, - 0x29, 0x0a, 0x10, 0x69, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, - 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x69, 0x6e, 0x73, 0x74, 0x72, - 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x47, 0x0a, 0x09, 0x61, 0x72, - 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x29, 0x2e, - 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, - 0x69, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x49, 0x6e, 0x73, 0x74, 0x72, 0x75, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x41, 0x72, 0x67, 0x52, 0x09, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, - 0x6e, 0x74, 0x73, 0x12, 0x35, 0x0a, 0x16, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x61, 0x62, 0x6c, - 0x65, 0x5f, 0x69, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x15, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x49, - 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1d, 0x0a, 0x0a, 0x69, 0x73, - 0x5f, 0x73, 0x6b, 0x69, 0x70, 0x70, 0x65, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, - 0x69, 0x73, 0x53, 0x6b, 0x69, 0x70, 0x70, 0x65, 0x64, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, - 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, - 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x5f, 0x0a, 0x19, 0x53, - 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x49, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x42, 0x0a, 0x1d, 0x73, 0x65, 0x72, 0x69, - 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x5f, 0x69, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x5f, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x1b, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x49, 0x6e, 0x73, 0x74, 0x72, - 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0xa4, 0x01, 0x0a, - 0x16, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x49, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x41, 0x72, 0x67, 0x12, 0x30, 0x0a, 0x14, 0x73, 0x65, 0x72, 0x69, 0x61, - 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x5f, 0x61, 0x72, 0x67, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, - 0x64, 0x41, 0x72, 0x67, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x1e, 0x0a, 0x08, 0x61, 0x72, 0x67, - 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x07, 0x61, - 0x72, 0x67, 0x4e, 0x61, 0x6d, 0x65, 0x88, 0x01, 0x01, 0x12, 0x2b, 0x0a, 0x11, 0x69, 0x73, 0x5f, - 0x72, 0x65, 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x76, 0x65, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, 0x69, 0x73, 0x52, 0x65, 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, - 0x74, 0x61, 0x74, 0x69, 0x76, 0x65, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x61, 0x72, 0x67, 0x5f, 0x6e, - 0x61, 0x6d, 0x65, 0x22, 0x65, 0x0a, 0x1b, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x49, - 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, - 0x6f, 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, - 0x0a, 0x04, 0x6c, 0x69, 0x6e, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x6c, 0x69, - 0x6e, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x05, 0x52, 0x06, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x22, 0xac, 0x02, 0x0a, 0x0d, 0x53, - 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x63, 0x0a, 0x14, - 0x69, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x65, - 0x72, 0x72, 0x6f, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x61, 0x70, 0x69, - 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x53, - 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x48, 0x00, 0x52, 0x13, 0x69, 0x6e, - 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x72, 0x72, 0x6f, - 0x72, 0x12, 0x57, 0x0a, 0x10, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, - 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x61, 0x70, - 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, - 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x48, 0x00, 0x52, 0x0f, 0x76, 0x61, 0x6c, 0x69, 0x64, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x54, 0x0a, 0x0f, 0x65, 0x78, - 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, + 0x70, 0x69, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x45, 0x72, 0x72, 0x6f, 0x72, + 0x48, 0x00, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x4d, 0x0a, 0x0d, 0x70, 0x72, 0x6f, + 0x67, 0x72, 0x65, 0x73, 0x73, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x26, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, + 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x52, 0x75, 0x6e, + 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x48, 0x00, 0x52, 0x0c, 0x70, 0x72, 0x6f, 0x67, + 0x72, 0x65, 0x73, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x5d, 0x0a, 0x12, 0x69, 0x6e, 0x73, 0x74, + 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, + 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, + 0x6b, 0x49, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x75, + 0x6c, 0x74, 0x48, 0x00, 0x52, 0x11, 0x69, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x5b, 0x0a, 0x12, 0x72, 0x75, 0x6e, 0x5f, 0x66, + 0x69, 0x6e, 0x69, 0x73, 0x68, 0x65, 0x64, 0x5f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, - 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x48, 0x00, - 0x52, 0x0e, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x72, 0x72, 0x6f, 0x72, - 0x42, 0x07, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x42, 0x0a, 0x1b, 0x53, 0x74, 0x61, - 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x23, 0x0a, 0x0d, 0x65, 0x72, 0x72, 0x6f, - 0x72, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0c, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x3e, 0x0a, - 0x17, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x23, 0x0a, 0x0d, 0x65, 0x72, 0x72, 0x6f, - 0x72, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0c, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x3d, 0x0a, - 0x16, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, - 0x6f, 0x6e, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x23, 0x0a, 0x0d, 0x65, 0x72, 0x72, 0x6f, 0x72, - 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, - 0x65, 0x72, 0x72, 0x6f, 0x72, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x92, 0x01, 0x0a, - 0x13, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x52, 0x75, 0x6e, 0x50, 0x72, 0x6f, 0x67, - 0x72, 0x65, 0x73, 0x73, 0x12, 0x2a, 0x0a, 0x11, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, - 0x73, 0x74, 0x65, 0x70, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, - 0x0f, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x65, 0x70, 0x49, 0x6e, 0x66, 0x6f, - 0x12, 0x1f, 0x0a, 0x0b, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x73, 0x74, 0x65, 0x70, 0x73, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x53, 0x74, 0x65, 0x70, - 0x73, 0x12, 0x2e, 0x0a, 0x13, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x74, 0x65, - 0x70, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x11, - 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x65, 0x70, 0x4e, 0x75, 0x6d, 0x62, 0x65, - 0x72, 0x22, 0x8e, 0x01, 0x0a, 0x18, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x52, 0x75, - 0x6e, 0x46, 0x69, 0x6e, 0x69, 0x73, 0x68, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x2a, - 0x0a, 0x11, 0x69, 0x73, 0x5f, 0x72, 0x75, 0x6e, 0x5f, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, - 0x66, 0x75, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, 0x69, 0x73, 0x52, 0x75, 0x6e, - 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x66, 0x75, 0x6c, 0x12, 0x30, 0x0a, 0x11, 0x73, 0x65, - 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x5f, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x10, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, - 0x7a, 0x65, 0x64, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x88, 0x01, 0x01, 0x42, 0x14, 0x0a, 0x12, - 0x5f, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x5f, 0x6f, 0x75, 0x74, 0x70, - 0x75, 0x74, 0x22, 0xc5, 0x01, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, - 0x65, 0x73, 0x41, 0x72, 0x67, 0x73, 0x12, 0x6b, 0x0a, 0x13, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, - 0x65, 0x5f, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, - 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, - 0x63, 0x65, 0x73, 0x41, 0x72, 0x67, 0x73, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, - 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, - 0x12, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, - 0x65, 0x72, 0x73, 0x1a, 0x45, 0x0a, 0x17, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, - 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, - 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, - 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xd1, 0x01, 0x0a, 0x13, 0x47, - 0x65, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x5a, 0x0a, 0x0c, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, 0x6e, - 0x66, 0x6f, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x37, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, - 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, - 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x52, 0x0b, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x1a, 0x5e, - 0x0a, 0x10, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x45, 0x6e, 0x74, + 0x52, 0x75, 0x6e, 0x46, 0x69, 0x6e, 0x69, 0x73, 0x68, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, + 0x48, 0x00, 0x52, 0x10, 0x72, 0x75, 0x6e, 0x46, 0x69, 0x6e, 0x69, 0x73, 0x68, 0x65, 0x64, 0x45, + 0x76, 0x65, 0x6e, 0x74, 0x12, 0x3e, 0x0a, 0x07, 0x77, 0x61, 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x18, + 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, + 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, + 0x72, 0x6b, 0x57, 0x61, 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x48, 0x00, 0x52, 0x07, 0x77, 0x61, 0x72, + 0x6e, 0x69, 0x6e, 0x67, 0x12, 0x35, 0x0a, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x07, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, + 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x49, + 0x6e, 0x66, 0x6f, 0x48, 0x00, 0x52, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x42, 0x13, 0x0a, 0x11, 0x72, + 0x75, 0x6e, 0x5f, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x5f, 0x6c, 0x69, 0x6e, 0x65, + 0x22, 0x31, 0x0a, 0x0c, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, + 0x12, 0x21, 0x0a, 0x0c, 0x69, 0x6e, 0x66, 0x6f, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x69, 0x6e, 0x66, 0x6f, 0x4d, 0x65, 0x73, 0x73, + 0x61, 0x67, 0x65, 0x22, 0x3a, 0x0a, 0x0f, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x57, + 0x61, 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x12, 0x27, 0x0a, 0x0f, 0x77, 0x61, 0x72, 0x6e, 0x69, 0x6e, + 0x67, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0e, 0x77, 0x61, 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, + 0xcd, 0x02, 0x0a, 0x13, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x49, 0x6e, 0x73, 0x74, + 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x4a, 0x0a, 0x08, 0x70, 0x6f, 0x73, 0x69, 0x74, + 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x61, 0x70, 0x69, 0x5f, + 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, + 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x49, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x08, 0x70, 0x6f, 0x73, 0x69, 0x74, + 0x69, 0x6f, 0x6e, 0x12, 0x29, 0x0a, 0x10, 0x69, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x69, + 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x47, + 0x0a, 0x09, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x29, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, + 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x49, 0x6e, + 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x41, 0x72, 0x67, 0x52, 0x09, 0x61, 0x72, + 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x35, 0x0a, 0x16, 0x65, 0x78, 0x65, 0x63, 0x75, + 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x69, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x15, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x61, + 0x62, 0x6c, 0x65, 0x49, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1d, + 0x0a, 0x0a, 0x69, 0x73, 0x5f, 0x73, 0x6b, 0x69, 0x70, 0x70, 0x65, 0x64, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x09, 0x69, 0x73, 0x53, 0x6b, 0x69, 0x70, 0x70, 0x65, 0x64, 0x12, 0x20, 0x0a, + 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, + 0x5f, 0x0a, 0x19, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x49, 0x6e, 0x73, 0x74, 0x72, + 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x42, 0x0a, 0x1d, + 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x5f, 0x69, 0x6e, 0x73, 0x74, 0x72, + 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x1b, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x49, + 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, + 0x22, 0xa4, 0x01, 0x0a, 0x16, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x49, 0x6e, 0x73, + 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x41, 0x72, 0x67, 0x12, 0x30, 0x0a, 0x14, 0x73, + 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x5f, 0x61, 0x72, 0x67, 0x5f, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x73, 0x65, 0x72, 0x69, 0x61, + 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x41, 0x72, 0x67, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x1e, 0x0a, + 0x08, 0x61, 0x72, 0x67, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, + 0x00, 0x52, 0x07, 0x61, 0x72, 0x67, 0x4e, 0x61, 0x6d, 0x65, 0x88, 0x01, 0x01, 0x12, 0x2b, 0x0a, + 0x11, 0x69, 0x73, 0x5f, 0x72, 0x65, 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, + 0x76, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, 0x69, 0x73, 0x52, 0x65, 0x70, 0x72, + 0x65, 0x73, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x76, 0x65, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x61, + 0x72, 0x67, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x65, 0x0a, 0x1b, 0x53, 0x74, 0x61, 0x72, 0x6c, + 0x61, 0x72, 0x6b, 0x49, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, + 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, + 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, + 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6c, 0x69, 0x6e, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, + 0x52, 0x04, 0x6c, 0x69, 0x6e, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x22, 0xac, + 0x02, 0x0a, 0x0d, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x45, 0x72, 0x72, 0x6f, 0x72, + 0x12, 0x63, 0x0a, 0x14, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2e, + 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, + 0x70, 0x69, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x49, 0x6e, 0x74, 0x65, 0x72, + 0x70, 0x72, 0x65, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x48, 0x00, + 0x52, 0x13, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x45, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x57, 0x0a, 0x10, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x2a, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, + 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x56, 0x61, 0x6c, 0x69, + 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x48, 0x00, 0x52, 0x0f, 0x76, + 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x54, + 0x0a, 0x0f, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x65, 0x72, 0x72, 0x6f, + 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, + 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, 0x61, 0x72, + 0x6c, 0x61, 0x72, 0x6b, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x72, 0x72, + 0x6f, 0x72, 0x48, 0x00, 0x52, 0x0e, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x45, + 0x72, 0x72, 0x6f, 0x72, 0x42, 0x07, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x42, 0x0a, + 0x1b, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, + 0x65, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x23, 0x0a, 0x0d, + 0x65, 0x72, 0x72, 0x6f, 0x72, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0c, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, + 0x65, 0x22, 0x3e, 0x0a, 0x17, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x56, 0x61, 0x6c, + 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x23, 0x0a, 0x0d, + 0x65, 0x72, 0x72, 0x6f, 0x72, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0c, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, + 0x65, 0x22, 0x3d, 0x0a, 0x16, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x45, 0x78, 0x65, + 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x23, 0x0a, 0x0d, 0x65, + 0x72, 0x72, 0x6f, 0x72, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0c, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, + 0x22, 0x92, 0x01, 0x0a, 0x13, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x52, 0x75, 0x6e, + 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x12, 0x2a, 0x0a, 0x11, 0x63, 0x75, 0x72, 0x72, + 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x74, 0x65, 0x70, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x01, 0x20, + 0x03, 0x28, 0x09, 0x52, 0x0f, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x65, 0x70, + 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1f, 0x0a, 0x0b, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x73, 0x74, + 0x65, 0x70, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x74, 0x6f, 0x74, 0x61, 0x6c, + 0x53, 0x74, 0x65, 0x70, 0x73, 0x12, 0x2e, 0x0a, 0x13, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, + 0x5f, 0x73, 0x74, 0x65, 0x70, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x0d, 0x52, 0x11, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x65, 0x70, 0x4e, + 0x75, 0x6d, 0x62, 0x65, 0x72, 0x22, 0x8e, 0x01, 0x0a, 0x18, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, + 0x72, 0x6b, 0x52, 0x75, 0x6e, 0x46, 0x69, 0x6e, 0x69, 0x73, 0x68, 0x65, 0x64, 0x45, 0x76, 0x65, + 0x6e, 0x74, 0x12, 0x2a, 0x0a, 0x11, 0x69, 0x73, 0x5f, 0x72, 0x75, 0x6e, 0x5f, 0x73, 0x75, 0x63, + 0x63, 0x65, 0x73, 0x73, 0x66, 0x75, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, 0x69, + 0x73, 0x52, 0x75, 0x6e, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x66, 0x75, 0x6c, 0x12, 0x30, + 0x0a, 0x11, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x5f, 0x6f, 0x75, 0x74, + 0x70, 0x75, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x10, 0x73, 0x65, 0x72, + 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x88, 0x01, 0x01, + 0x42, 0x14, 0x0a, 0x12, 0x5f, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x5f, + 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0xc5, 0x01, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x53, 0x65, + 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x41, 0x72, 0x67, 0x73, 0x12, 0x6b, 0x0a, 0x13, 0x73, 0x65, + 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, + 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, + 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x53, + 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x41, 0x72, 0x67, 0x73, 0x2e, 0x53, 0x65, 0x72, 0x76, + 0x69, 0x63, 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x73, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x52, 0x12, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x65, 0x6e, + 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x73, 0x1a, 0x45, 0x0a, 0x17, 0x53, 0x65, 0x72, 0x76, 0x69, + 0x63, 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x03, 0x6b, 0x65, 0x79, 0x12, 0x34, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, - 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, - 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x72, - 0x0a, 0x12, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, - 0x69, 0x65, 0x72, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, - 0x75, 0x75, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x73, 0x65, 0x72, 0x76, - 0x69, 0x63, 0x65, 0x55, 0x75, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x73, - 0x68, 0x6f, 0x72, 0x74, 0x65, 0x6e, 0x65, 0x64, 0x5f, 0x75, 0x75, 0x69, 0x64, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0d, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x65, 0x6e, 0x65, 0x64, 0x55, 0x75, - 0x69, 0x64, 0x22, 0x83, 0x01, 0x0a, 0x32, 0x47, 0x65, 0x74, 0x45, 0x78, 0x69, 0x73, 0x74, 0x69, - 0x6e, 0x67, 0x41, 0x6e, 0x64, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x69, 0x63, 0x61, 0x6c, 0x53, - 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, - 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4d, 0x0a, 0x0e, 0x61, 0x6c, 0x6c, - 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x25, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, - 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x65, - 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x73, 0x52, 0x0e, 0x61, 0x6c, 0x6c, 0x49, 0x64, 0x65, - 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x73, 0x22, 0x63, 0x0a, 0x0f, 0x45, 0x78, 0x65, 0x63, - 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x41, 0x72, 0x67, 0x73, 0x12, 0x2d, 0x0a, 0x12, 0x73, - 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, - 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, - 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x12, 0x21, 0x0a, 0x0c, 0x63, 0x6f, - 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x5f, 0x61, 0x72, 0x67, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, - 0x52, 0x0b, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x41, 0x72, 0x67, 0x73, 0x22, 0x51, 0x0a, - 0x13, 0x45, 0x78, 0x65, 0x63, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x65, 0x78, 0x69, 0x74, 0x5f, 0x63, 0x6f, 0x64, - 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x65, 0x78, 0x69, 0x74, 0x43, 0x6f, 0x64, - 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x6c, 0x6f, 0x67, 0x5f, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6c, 0x6f, 0x67, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, - 0x22, 0xac, 0x03, 0x0a, 0x26, 0x57, 0x61, 0x69, 0x74, 0x46, 0x6f, 0x72, 0x48, 0x74, 0x74, 0x70, - 0x47, 0x65, 0x74, 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x41, 0x76, 0x61, 0x69, 0x6c, - 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x41, 0x72, 0x67, 0x73, 0x12, 0x2d, 0x0a, 0x12, 0x73, - 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, - 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, - 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x6f, - 0x72, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x70, 0x6f, 0x72, 0x74, 0x12, 0x17, - 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x04, - 0x70, 0x61, 0x74, 0x68, 0x88, 0x01, 0x01, 0x12, 0x41, 0x0a, 0x1a, 0x69, 0x6e, 0x69, 0x74, 0x69, - 0x61, 0x6c, 0x5f, 0x64, 0x65, 0x6c, 0x61, 0x79, 0x5f, 0x6d, 0x69, 0x6c, 0x6c, 0x69, 0x73, 0x65, - 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x48, 0x01, 0x52, 0x18, 0x69, - 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x44, 0x65, 0x6c, 0x61, 0x79, 0x4d, 0x69, 0x6c, 0x6c, 0x69, - 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x88, 0x01, 0x01, 0x12, 0x1d, 0x0a, 0x07, 0x72, 0x65, - 0x74, 0x72, 0x69, 0x65, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x48, 0x02, 0x52, 0x07, 0x72, - 0x65, 0x74, 0x72, 0x69, 0x65, 0x73, 0x88, 0x01, 0x01, 0x12, 0x41, 0x0a, 0x1a, 0x72, 0x65, 0x74, - 0x72, 0x69, 0x65, 0x73, 0x5f, 0x64, 0x65, 0x6c, 0x61, 0x79, 0x5f, 0x6d, 0x69, 0x6c, 0x6c, 0x69, - 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0d, 0x48, 0x03, 0x52, - 0x18, 0x72, 0x65, 0x74, 0x72, 0x69, 0x65, 0x73, 0x44, 0x65, 0x6c, 0x61, 0x79, 0x4d, 0x69, 0x6c, - 0x6c, 0x69, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x88, 0x01, 0x01, 0x12, 0x20, 0x0a, 0x09, - 0x62, 0x6f, 0x64, 0x79, 0x5f, 0x74, 0x65, 0x78, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x48, - 0x04, 0x52, 0x08, 0x62, 0x6f, 0x64, 0x79, 0x54, 0x65, 0x78, 0x74, 0x88, 0x01, 0x01, 0x42, 0x07, - 0x0a, 0x05, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x42, 0x1d, 0x0a, 0x1b, 0x5f, 0x69, 0x6e, 0x69, 0x74, - 0x69, 0x61, 0x6c, 0x5f, 0x64, 0x65, 0x6c, 0x61, 0x79, 0x5f, 0x6d, 0x69, 0x6c, 0x6c, 0x69, 0x73, - 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x42, 0x0a, 0x0a, 0x08, 0x5f, 0x72, 0x65, 0x74, 0x72, 0x69, - 0x65, 0x73, 0x42, 0x1d, 0x0a, 0x1b, 0x5f, 0x72, 0x65, 0x74, 0x72, 0x69, 0x65, 0x73, 0x5f, 0x64, - 0x65, 0x6c, 0x61, 0x79, 0x5f, 0x6d, 0x69, 0x6c, 0x6c, 0x69, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, - 0x73, 0x42, 0x0c, 0x0a, 0x0a, 0x5f, 0x62, 0x6f, 0x64, 0x79, 0x5f, 0x74, 0x65, 0x78, 0x74, 0x22, - 0xe6, 0x03, 0x0a, 0x27, 0x57, 0x61, 0x69, 0x74, 0x46, 0x6f, 0x72, 0x48, 0x74, 0x74, 0x70, 0x50, - 0x6f, 0x73, 0x74, 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x41, 0x76, 0x61, 0x69, 0x6c, - 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x41, 0x72, 0x67, 0x73, 0x12, 0x2d, 0x0a, 0x12, 0x73, - 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, - 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, - 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x6f, - 0x72, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x70, 0x6f, 0x72, 0x74, 0x12, 0x17, - 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x04, - 0x70, 0x61, 0x74, 0x68, 0x88, 0x01, 0x01, 0x12, 0x26, 0x0a, 0x0c, 0x72, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x5f, 0x62, 0x6f, 0x64, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, - 0x0b, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x42, 0x6f, 0x64, 0x79, 0x88, 0x01, 0x01, 0x12, - 0x41, 0x0a, 0x1a, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x5f, 0x64, 0x65, 0x6c, 0x61, 0x79, - 0x5f, 0x6d, 0x69, 0x6c, 0x6c, 0x69, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x18, 0x05, 0x20, - 0x01, 0x28, 0x0d, 0x48, 0x02, 0x52, 0x18, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x44, 0x65, - 0x6c, 0x61, 0x79, 0x4d, 0x69, 0x6c, 0x6c, 0x69, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x88, - 0x01, 0x01, 0x12, 0x1d, 0x0a, 0x07, 0x72, 0x65, 0x74, 0x72, 0x69, 0x65, 0x73, 0x18, 0x06, 0x20, - 0x01, 0x28, 0x0d, 0x48, 0x03, 0x52, 0x07, 0x72, 0x65, 0x74, 0x72, 0x69, 0x65, 0x73, 0x88, 0x01, - 0x01, 0x12, 0x41, 0x0a, 0x1a, 0x72, 0x65, 0x74, 0x72, 0x69, 0x65, 0x73, 0x5f, 0x64, 0x65, 0x6c, - 0x61, 0x79, 0x5f, 0x6d, 0x69, 0x6c, 0x6c, 0x69, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x18, - 0x07, 0x20, 0x01, 0x28, 0x0d, 0x48, 0x04, 0x52, 0x18, 0x72, 0x65, 0x74, 0x72, 0x69, 0x65, 0x73, - 0x44, 0x65, 0x6c, 0x61, 0x79, 0x4d, 0x69, 0x6c, 0x6c, 0x69, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, - 0x73, 0x88, 0x01, 0x01, 0x12, 0x20, 0x0a, 0x09, 0x62, 0x6f, 0x64, 0x79, 0x5f, 0x74, 0x65, 0x78, - 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x48, 0x05, 0x52, 0x08, 0x62, 0x6f, 0x64, 0x79, 0x54, - 0x65, 0x78, 0x74, 0x88, 0x01, 0x01, 0x42, 0x07, 0x0a, 0x05, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x42, - 0x0f, 0x0a, 0x0d, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x62, 0x6f, 0x64, 0x79, - 0x42, 0x1d, 0x0a, 0x1b, 0x5f, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x5f, 0x64, 0x65, 0x6c, - 0x61, 0x79, 0x5f, 0x6d, 0x69, 0x6c, 0x6c, 0x69, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x42, - 0x0a, 0x0a, 0x08, 0x5f, 0x72, 0x65, 0x74, 0x72, 0x69, 0x65, 0x73, 0x42, 0x1d, 0x0a, 0x1b, 0x5f, - 0x72, 0x65, 0x74, 0x72, 0x69, 0x65, 0x73, 0x5f, 0x64, 0x65, 0x6c, 0x61, 0x79, 0x5f, 0x6d, 0x69, - 0x6c, 0x6c, 0x69, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x42, 0x0c, 0x0a, 0x0a, 0x5f, 0x62, - 0x6f, 0x64, 0x79, 0x5f, 0x74, 0x65, 0x78, 0x74, 0x22, 0x99, 0x01, 0x0a, 0x11, 0x53, 0x74, 0x72, - 0x65, 0x61, 0x6d, 0x65, 0x64, 0x44, 0x61, 0x74, 0x61, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x12, 0x12, - 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x64, 0x61, - 0x74, 0x61, 0x12, 0x2e, 0x0a, 0x13, 0x70, 0x72, 0x65, 0x76, 0x69, 0x6f, 0x75, 0x73, 0x5f, 0x63, - 0x68, 0x75, 0x6e, 0x6b, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x11, 0x70, 0x72, 0x65, 0x76, 0x69, 0x6f, 0x75, 0x73, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x48, 0x61, - 0x73, 0x68, 0x12, 0x40, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, - 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x43, 0x68, 0x75, - 0x6e, 0x6b, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, - 0x64, 0x61, 0x74, 0x61, 0x22, 0x27, 0x0a, 0x11, 0x44, 0x61, 0x74, 0x61, 0x43, 0x68, 0x75, 0x6e, - 0x6b, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, - 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x45, 0x0a, - 0x1b, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x72, 0x74, 0x69, - 0x66, 0x61, 0x63, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x12, 0x0a, 0x04, - 0x75, 0x75, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x75, 0x75, 0x69, 0x64, - 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, - 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3b, 0x0a, 0x19, 0x44, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, - 0x46, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x41, 0x72, 0x67, - 0x73, 0x12, 0x1e, 0x0a, 0x0a, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, - 0x72, 0x22, 0x41, 0x0a, 0x19, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x57, 0x65, 0x62, 0x46, 0x69, 0x6c, - 0x65, 0x73, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x41, 0x72, 0x67, 0x73, 0x12, 0x10, - 0x0a, 0x03, 0x75, 0x72, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x72, 0x6c, - 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, - 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x33, 0x0a, 0x1d, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x57, 0x65, 0x62, - 0x46, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x75, 0x75, 0x69, 0x64, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x04, 0x75, 0x75, 0x69, 0x64, 0x22, 0x87, 0x01, 0x0a, 0x21, 0x53, 0x74, - 0x6f, 0x72, 0x65, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, - 0x46, 0x72, 0x6f, 0x6d, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x41, 0x72, 0x67, 0x73, 0x12, + 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xd1, + 0x01, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x5a, 0x0a, 0x0c, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, + 0x65, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x37, 0x2e, 0x61, + 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, + 0x2e, 0x47, 0x65, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0b, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, + 0x66, 0x6f, 0x1a, 0x5e, 0x0a, 0x10, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, + 0x6f, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x34, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, + 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x65, 0x72, 0x76, + 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, + 0x38, 0x01, 0x22, 0x72, 0x0a, 0x12, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x65, + 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x73, 0x65, 0x72, 0x76, + 0x69, 0x63, 0x65, 0x5f, 0x75, 0x75, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, + 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x55, 0x75, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, + 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, + 0x25, 0x0a, 0x0e, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x65, 0x6e, 0x65, 0x64, 0x5f, 0x75, 0x75, 0x69, + 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x65, 0x6e, + 0x65, 0x64, 0x55, 0x75, 0x69, 0x64, 0x22, 0x83, 0x01, 0x0a, 0x32, 0x47, 0x65, 0x74, 0x45, 0x78, + 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x41, 0x6e, 0x64, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x69, + 0x63, 0x61, 0x6c, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, + 0x66, 0x69, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4d, 0x0a, + 0x0e, 0x61, 0x6c, 0x6c, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x73, 0x18, + 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, + 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, + 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x73, 0x52, 0x0e, 0x61, 0x6c, + 0x6c, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x73, 0x22, 0x63, 0x0a, 0x0f, + 0x45, 0x78, 0x65, 0x63, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x41, 0x72, 0x67, 0x73, 0x12, 0x2d, 0x0a, 0x12, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x73, 0x65, 0x72, - 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x12, 0x1f, - 0x0a, 0x0b, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0a, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x50, 0x61, 0x74, 0x68, 0x12, - 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, - 0x61, 0x6d, 0x65, 0x22, 0x3b, 0x0a, 0x25, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x46, 0x69, 0x6c, 0x65, - 0x73, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x46, 0x72, 0x6f, 0x6d, 0x53, 0x65, 0x72, - 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x12, 0x0a, 0x04, - 0x75, 0x75, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x75, 0x75, 0x69, 0x64, - 0x22, 0x52, 0x0a, 0x18, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, - 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x41, 0x6e, 0x64, 0x55, 0x75, 0x69, 0x64, 0x12, 0x1a, 0x0a, 0x08, - 0x66, 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, - 0x66, 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x66, 0x69, 0x6c, 0x65, - 0x55, 0x75, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x66, 0x69, 0x6c, 0x65, - 0x55, 0x75, 0x69, 0x64, 0x22, 0x86, 0x01, 0x0a, 0x26, 0x4c, 0x69, 0x73, 0x74, 0x46, 0x69, 0x6c, - 0x65, 0x73, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x41, - 0x6e, 0x64, 0x55, 0x75, 0x69, 0x64, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x5c, 0x0a, 0x14, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x5f, 0x61, 0x6e, - 0x64, 0x5f, 0x75, 0x75, 0x69, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2b, 0x2e, - 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, - 0x69, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x4e, - 0x61, 0x6d, 0x65, 0x41, 0x6e, 0x64, 0x55, 0x75, 0x69, 0x64, 0x52, 0x11, 0x66, 0x69, 0x6c, 0x65, - 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x41, 0x6e, 0x64, 0x55, 0x75, 0x69, 0x64, 0x73, 0x22, 0x81, 0x01, - 0x0a, 0x23, 0x49, 0x6e, 0x73, 0x70, 0x65, 0x63, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x72, - 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x5a, 0x0a, 0x13, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x6e, 0x61, - 0x6d, 0x65, 0x73, 0x5f, 0x61, 0x6e, 0x64, 0x5f, 0x75, 0x75, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, - 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x72, 0x74, 0x69, - 0x66, 0x61, 0x63, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x41, 0x6e, 0x64, 0x55, 0x75, 0x69, 0x64, 0x52, - 0x10, 0x66, 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x41, 0x6e, 0x64, 0x55, 0x75, 0x69, - 0x64, 0x22, 0x8b, 0x01, 0x0a, 0x24, 0x49, 0x6e, 0x73, 0x70, 0x65, 0x63, 0x74, 0x46, 0x69, 0x6c, + 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x12, 0x21, + 0x0a, 0x0c, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x5f, 0x61, 0x72, 0x67, 0x73, 0x18, 0x02, + 0x20, 0x03, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x41, 0x72, 0x67, + 0x73, 0x22, 0x51, 0x0a, 0x13, 0x45, 0x78, 0x65, 0x63, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x65, 0x78, 0x69, 0x74, + 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x65, 0x78, 0x69, + 0x74, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x6c, 0x6f, 0x67, 0x5f, 0x6f, 0x75, 0x74, + 0x70, 0x75, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6c, 0x6f, 0x67, 0x4f, 0x75, + 0x74, 0x70, 0x75, 0x74, 0x22, 0xac, 0x03, 0x0a, 0x26, 0x57, 0x61, 0x69, 0x74, 0x46, 0x6f, 0x72, + 0x48, 0x74, 0x74, 0x70, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x41, + 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x41, 0x72, 0x67, 0x73, 0x12, + 0x2d, 0x0a, 0x12, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x65, 0x6e, 0x74, + 0x69, 0x66, 0x69, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x73, 0x65, 0x72, + 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x12, 0x12, + 0x0a, 0x04, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x70, 0x6f, + 0x72, 0x74, 0x12, 0x17, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, + 0x48, 0x00, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x88, 0x01, 0x01, 0x12, 0x41, 0x0a, 0x1a, 0x69, + 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x5f, 0x64, 0x65, 0x6c, 0x61, 0x79, 0x5f, 0x6d, 0x69, 0x6c, + 0x6c, 0x69, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x48, + 0x01, 0x52, 0x18, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x44, 0x65, 0x6c, 0x61, 0x79, 0x4d, + 0x69, 0x6c, 0x6c, 0x69, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x88, 0x01, 0x01, 0x12, 0x1d, + 0x0a, 0x07, 0x72, 0x65, 0x74, 0x72, 0x69, 0x65, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x48, + 0x02, 0x52, 0x07, 0x72, 0x65, 0x74, 0x72, 0x69, 0x65, 0x73, 0x88, 0x01, 0x01, 0x12, 0x41, 0x0a, + 0x1a, 0x72, 0x65, 0x74, 0x72, 0x69, 0x65, 0x73, 0x5f, 0x64, 0x65, 0x6c, 0x61, 0x79, 0x5f, 0x6d, + 0x69, 0x6c, 0x6c, 0x69, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, + 0x0d, 0x48, 0x03, 0x52, 0x18, 0x72, 0x65, 0x74, 0x72, 0x69, 0x65, 0x73, 0x44, 0x65, 0x6c, 0x61, + 0x79, 0x4d, 0x69, 0x6c, 0x6c, 0x69, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x88, 0x01, 0x01, + 0x12, 0x20, 0x0a, 0x09, 0x62, 0x6f, 0x64, 0x79, 0x5f, 0x74, 0x65, 0x78, 0x74, 0x18, 0x07, 0x20, + 0x01, 0x28, 0x09, 0x48, 0x04, 0x52, 0x08, 0x62, 0x6f, 0x64, 0x79, 0x54, 0x65, 0x78, 0x74, 0x88, + 0x01, 0x01, 0x42, 0x07, 0x0a, 0x05, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x42, 0x1d, 0x0a, 0x1b, 0x5f, + 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x5f, 0x64, 0x65, 0x6c, 0x61, 0x79, 0x5f, 0x6d, 0x69, + 0x6c, 0x6c, 0x69, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x42, 0x0a, 0x0a, 0x08, 0x5f, 0x72, + 0x65, 0x74, 0x72, 0x69, 0x65, 0x73, 0x42, 0x1d, 0x0a, 0x1b, 0x5f, 0x72, 0x65, 0x74, 0x72, 0x69, + 0x65, 0x73, 0x5f, 0x64, 0x65, 0x6c, 0x61, 0x79, 0x5f, 0x6d, 0x69, 0x6c, 0x6c, 0x69, 0x73, 0x65, + 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x42, 0x0c, 0x0a, 0x0a, 0x5f, 0x62, 0x6f, 0x64, 0x79, 0x5f, 0x74, + 0x65, 0x78, 0x74, 0x22, 0xe6, 0x03, 0x0a, 0x27, 0x57, 0x61, 0x69, 0x74, 0x46, 0x6f, 0x72, 0x48, + 0x74, 0x74, 0x70, 0x50, 0x6f, 0x73, 0x74, 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x41, + 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x41, 0x72, 0x67, 0x73, 0x12, + 0x2d, 0x0a, 0x12, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x65, 0x6e, 0x74, + 0x69, 0x66, 0x69, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x73, 0x65, 0x72, + 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x12, 0x12, + 0x0a, 0x04, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x70, 0x6f, + 0x72, 0x74, 0x12, 0x17, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, + 0x48, 0x00, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x88, 0x01, 0x01, 0x12, 0x26, 0x0a, 0x0c, 0x72, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x62, 0x6f, 0x64, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x09, 0x48, 0x01, 0x52, 0x0b, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x42, 0x6f, 0x64, 0x79, + 0x88, 0x01, 0x01, 0x12, 0x41, 0x0a, 0x1a, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x5f, 0x64, + 0x65, 0x6c, 0x61, 0x79, 0x5f, 0x6d, 0x69, 0x6c, 0x6c, 0x69, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, + 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x48, 0x02, 0x52, 0x18, 0x69, 0x6e, 0x69, 0x74, 0x69, + 0x61, 0x6c, 0x44, 0x65, 0x6c, 0x61, 0x79, 0x4d, 0x69, 0x6c, 0x6c, 0x69, 0x73, 0x65, 0x63, 0x6f, + 0x6e, 0x64, 0x73, 0x88, 0x01, 0x01, 0x12, 0x1d, 0x0a, 0x07, 0x72, 0x65, 0x74, 0x72, 0x69, 0x65, + 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0d, 0x48, 0x03, 0x52, 0x07, 0x72, 0x65, 0x74, 0x72, 0x69, + 0x65, 0x73, 0x88, 0x01, 0x01, 0x12, 0x41, 0x0a, 0x1a, 0x72, 0x65, 0x74, 0x72, 0x69, 0x65, 0x73, + 0x5f, 0x64, 0x65, 0x6c, 0x61, 0x79, 0x5f, 0x6d, 0x69, 0x6c, 0x6c, 0x69, 0x73, 0x65, 0x63, 0x6f, + 0x6e, 0x64, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0d, 0x48, 0x04, 0x52, 0x18, 0x72, 0x65, 0x74, + 0x72, 0x69, 0x65, 0x73, 0x44, 0x65, 0x6c, 0x61, 0x79, 0x4d, 0x69, 0x6c, 0x6c, 0x69, 0x73, 0x65, + 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x88, 0x01, 0x01, 0x12, 0x20, 0x0a, 0x09, 0x62, 0x6f, 0x64, 0x79, + 0x5f, 0x74, 0x65, 0x78, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x48, 0x05, 0x52, 0x08, 0x62, + 0x6f, 0x64, 0x79, 0x54, 0x65, 0x78, 0x74, 0x88, 0x01, 0x01, 0x42, 0x07, 0x0a, 0x05, 0x5f, 0x70, + 0x61, 0x74, 0x68, 0x42, 0x0f, 0x0a, 0x0d, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, + 0x62, 0x6f, 0x64, 0x79, 0x42, 0x1d, 0x0a, 0x1b, 0x5f, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, + 0x5f, 0x64, 0x65, 0x6c, 0x61, 0x79, 0x5f, 0x6d, 0x69, 0x6c, 0x6c, 0x69, 0x73, 0x65, 0x63, 0x6f, + 0x6e, 0x64, 0x73, 0x42, 0x0a, 0x0a, 0x08, 0x5f, 0x72, 0x65, 0x74, 0x72, 0x69, 0x65, 0x73, 0x42, + 0x1d, 0x0a, 0x1b, 0x5f, 0x72, 0x65, 0x74, 0x72, 0x69, 0x65, 0x73, 0x5f, 0x64, 0x65, 0x6c, 0x61, + 0x79, 0x5f, 0x6d, 0x69, 0x6c, 0x6c, 0x69, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x42, 0x0c, + 0x0a, 0x0a, 0x5f, 0x62, 0x6f, 0x64, 0x79, 0x5f, 0x74, 0x65, 0x78, 0x74, 0x22, 0x99, 0x01, 0x0a, + 0x11, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x65, 0x64, 0x44, 0x61, 0x74, 0x61, 0x43, 0x68, 0x75, + 0x6e, 0x6b, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, + 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x12, 0x2e, 0x0a, 0x13, 0x70, 0x72, 0x65, 0x76, 0x69, 0x6f, + 0x75, 0x73, 0x5f, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x11, 0x70, 0x72, 0x65, 0x76, 0x69, 0x6f, 0x75, 0x73, 0x43, 0x68, 0x75, + 0x6e, 0x6b, 0x48, 0x61, 0x73, 0x68, 0x12, 0x40, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, + 0x74, 0x61, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, + 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x44, 0x61, 0x74, + 0x61, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x08, + 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x22, 0x27, 0x0a, 0x11, 0x44, 0x61, 0x74, 0x61, + 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x12, 0x0a, + 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, + 0x65, 0x22, 0x45, 0x0a, 0x1b, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x73, + 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x12, 0x0a, 0x04, 0x75, 0x75, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, + 0x75, 0x75, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3b, 0x0a, 0x19, 0x44, 0x6f, 0x77, 0x6e, + 0x6c, 0x6f, 0x61, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, + 0x74, 0x41, 0x72, 0x67, 0x73, 0x12, 0x1e, 0x0a, 0x0a, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, + 0x69, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x69, 0x64, 0x65, 0x6e, 0x74, + 0x69, 0x66, 0x69, 0x65, 0x72, 0x22, 0x41, 0x0a, 0x19, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x57, 0x65, + 0x62, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x41, 0x72, + 0x67, 0x73, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x72, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x03, 0x75, 0x72, 0x6c, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x33, 0x0a, 0x1d, 0x53, 0x74, 0x6f, 0x72, + 0x65, 0x57, 0x65, 0x62, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, + 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x75, 0x75, 0x69, + 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x75, 0x75, 0x69, 0x64, 0x22, 0x87, 0x01, + 0x0a, 0x21, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x72, 0x74, 0x69, + 0x66, 0x61, 0x63, 0x74, 0x46, 0x72, 0x6f, 0x6d, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x41, + 0x72, 0x67, 0x73, 0x12, 0x2d, 0x0a, 0x12, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, + 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x11, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, + 0x65, 0x72, 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x70, 0x61, 0x74, + 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x50, + 0x61, 0x74, 0x68, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3b, 0x0a, 0x25, 0x53, 0x74, 0x6f, 0x72, 0x65, + 0x46, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x46, 0x72, 0x6f, + 0x6d, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x12, 0x0a, 0x04, 0x75, 0x75, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, + 0x75, 0x75, 0x69, 0x64, 0x22, 0x52, 0x0a, 0x18, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x72, 0x74, + 0x69, 0x66, 0x61, 0x63, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x41, 0x6e, 0x64, 0x55, 0x75, 0x69, 0x64, + 0x12, 0x1a, 0x0a, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, + 0x66, 0x69, 0x6c, 0x65, 0x55, 0x75, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, + 0x66, 0x69, 0x6c, 0x65, 0x55, 0x75, 0x69, 0x64, 0x22, 0x86, 0x01, 0x0a, 0x26, 0x4c, 0x69, 0x73, + 0x74, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x4e, 0x61, + 0x6d, 0x65, 0x73, 0x41, 0x6e, 0x64, 0x55, 0x75, 0x69, 0x64, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x5c, 0x0a, 0x14, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, + 0x73, 0x5f, 0x61, 0x6e, 0x64, 0x5f, 0x75, 0x75, 0x69, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x2b, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, + 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x72, 0x74, 0x69, 0x66, + 0x61, 0x63, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x41, 0x6e, 0x64, 0x55, 0x75, 0x69, 0x64, 0x52, 0x11, + 0x66, 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x41, 0x6e, 0x64, 0x55, 0x75, 0x69, 0x64, + 0x73, 0x22, 0x81, 0x01, 0x0a, 0x23, 0x49, 0x6e, 0x73, 0x70, 0x65, 0x63, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, - 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x63, 0x0a, 0x11, 0x66, 0x69, - 0x6c, 0x65, 0x5f, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, - 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x36, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, - 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x41, 0x72, - 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x46, 0x69, - 0x6c, 0x65, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x10, 0x66, - 0x69, 0x6c, 0x65, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, - 0x86, 0x01, 0x0a, 0x23, 0x46, 0x69, 0x6c, 0x65, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, - 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x46, 0x69, 0x6c, 0x65, 0x44, 0x65, 0x73, 0x63, - 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x12, 0x12, 0x0a, 0x04, 0x73, - 0x69, 0x7a, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x12, - 0x26, 0x0a, 0x0c, 0x74, 0x65, 0x78, 0x74, 0x5f, 0x70, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0b, 0x74, 0x65, 0x78, 0x74, 0x50, 0x72, 0x65, - 0x76, 0x69, 0x65, 0x77, 0x88, 0x01, 0x01, 0x42, 0x0f, 0x0a, 0x0d, 0x5f, 0x74, 0x65, 0x78, 0x74, - 0x5f, 0x70, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x22, 0x4b, 0x0a, 0x13, 0x43, 0x6f, 0x6e, 0x6e, - 0x65, 0x63, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x41, 0x72, 0x67, 0x73, 0x12, - 0x34, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, - 0x32, 0x1a, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, - 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x52, 0x07, 0x63, 0x6f, - 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x22, 0x19, 0x0a, 0x17, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, - 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0xa2, 0x04, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, - 0x52, 0x75, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x70, - 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x09, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x49, 0x64, 0x12, 0x2b, 0x0a, 0x11, 0x73, 0x65, - 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x5f, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, - 0x64, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, 0x12, 0x2b, 0x0a, 0x11, 0x73, 0x65, 0x72, 0x69, 0x61, - 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x10, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x50, 0x61, - 0x72, 0x61, 0x6d, 0x73, 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x61, 0x72, 0x61, 0x6c, 0x6c, 0x65, 0x6c, - 0x69, 0x73, 0x6d, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0b, 0x70, 0x61, 0x72, 0x61, 0x6c, - 0x6c, 0x65, 0x6c, 0x69, 0x73, 0x6d, 0x12, 0x3a, 0x0a, 0x1a, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, - 0x76, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x5f, 0x74, 0x6f, 0x5f, 0x6d, 0x61, 0x69, 0x6e, 0x5f, - 0x66, 0x69, 0x6c, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x16, 0x72, 0x65, 0x6c, 0x61, - 0x74, 0x69, 0x76, 0x65, 0x50, 0x61, 0x74, 0x68, 0x54, 0x6f, 0x4d, 0x61, 0x69, 0x6e, 0x46, 0x69, - 0x6c, 0x65, 0x12, 0x2c, 0x0a, 0x12, 0x6d, 0x61, 0x69, 0x6e, 0x5f, 0x66, 0x75, 0x6e, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, - 0x6d, 0x61, 0x69, 0x6e, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, - 0x12, 0x5b, 0x0a, 0x15, 0x65, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x6c, - 0x5f, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0e, 0x32, - 0x26, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, - 0x61, 0x70, 0x69, 0x2e, 0x4b, 0x75, 0x72, 0x74, 0x6f, 0x73, 0x69, 0x73, 0x46, 0x65, 0x61, 0x74, - 0x75, 0x72, 0x65, 0x46, 0x6c, 0x61, 0x67, 0x52, 0x14, 0x65, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, - 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x12, 0x47, 0x0a, - 0x0e, 0x72, 0x65, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x18, - 0x08, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x20, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, - 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x65, 0x73, 0x74, 0x61, 0x72, - 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x0d, 0x72, 0x65, 0x73, 0x74, 0x61, 0x72, 0x74, - 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x3f, 0x0a, 0x19, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, - 0x6c, 0x5f, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x5f, 0x70, 0x61, 0x72, - 0x61, 0x6d, 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x17, 0x69, 0x6e, 0x69, - 0x74, 0x69, 0x61, 0x6c, 0x53, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x50, 0x61, - 0x72, 0x61, 0x6d, 0x73, 0x88, 0x01, 0x01, 0x42, 0x1c, 0x0a, 0x1a, 0x5f, 0x69, 0x6e, 0x69, 0x74, - 0x69, 0x61, 0x6c, 0x5f, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x5f, 0x70, - 0x61, 0x72, 0x61, 0x6d, 0x73, 0x22, 0x27, 0x0a, 0x08, 0x50, 0x6c, 0x61, 0x6e, 0x59, 0x61, 0x6d, - 0x6c, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x6c, 0x61, 0x6e, 0x5f, 0x79, 0x61, 0x6d, 0x6c, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6c, 0x61, 0x6e, 0x59, 0x61, 0x6d, 0x6c, 0x22, 0xdb, - 0x01, 0x0a, 0x1a, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x53, 0x63, 0x72, 0x69, 0x70, - 0x74, 0x50, 0x6c, 0x61, 0x6e, 0x59, 0x61, 0x6d, 0x6c, 0x41, 0x72, 0x67, 0x73, 0x12, 0x2b, 0x0a, - 0x11, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x5f, 0x73, 0x63, 0x72, 0x69, - 0x70, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, - 0x69, 0x7a, 0x65, 0x64, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, 0x12, 0x30, 0x0a, 0x11, 0x73, 0x65, - 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x10, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, - 0x7a, 0x65, 0x64, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x88, 0x01, 0x01, 0x12, 0x31, 0x0a, 0x12, - 0x6d, 0x61, 0x69, 0x6e, 0x5f, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x61, - 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x10, 0x6d, 0x61, 0x69, 0x6e, - 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x88, 0x01, 0x01, 0x42, - 0x14, 0x0a, 0x12, 0x5f, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x5f, 0x70, - 0x61, 0x72, 0x61, 0x6d, 0x73, 0x42, 0x15, 0x0a, 0x13, 0x5f, 0x6d, 0x61, 0x69, 0x6e, 0x5f, 0x66, - 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0xcb, 0x02, 0x0a, - 0x1b, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, - 0x50, 0x6c, 0x61, 0x6e, 0x59, 0x61, 0x6d, 0x6c, 0x41, 0x72, 0x67, 0x73, 0x12, 0x1d, 0x0a, 0x0a, - 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x09, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x49, 0x64, 0x12, 0x30, 0x0a, 0x11, 0x73, + 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x5a, 0x0a, 0x13, 0x66, 0x69, 0x6c, + 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x5f, 0x61, 0x6e, 0x64, 0x5f, 0x75, 0x75, 0x69, 0x64, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, + 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x73, + 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x41, 0x6e, 0x64, 0x55, + 0x75, 0x69, 0x64, 0x52, 0x10, 0x66, 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x41, 0x6e, + 0x64, 0x55, 0x75, 0x69, 0x64, 0x22, 0x8b, 0x01, 0x0a, 0x24, 0x49, 0x6e, 0x73, 0x70, 0x65, 0x63, + 0x74, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x43, 0x6f, + 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x63, + 0x0a, 0x11, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x36, 0x2e, 0x61, 0x70, 0x69, 0x5f, + 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x46, 0x69, + 0x6c, 0x65, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, + 0x74, 0x73, 0x46, 0x69, 0x6c, 0x65, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x52, 0x10, 0x66, 0x69, 0x6c, 0x65, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x22, 0x86, 0x01, 0x0a, 0x23, 0x46, 0x69, 0x6c, 0x65, 0x41, 0x72, 0x74, 0x69, + 0x66, 0x61, 0x63, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x46, 0x69, 0x6c, 0x65, + 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x70, + 0x61, 0x74, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x12, + 0x12, 0x0a, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x04, 0x73, + 0x69, 0x7a, 0x65, 0x12, 0x26, 0x0a, 0x0c, 0x74, 0x65, 0x78, 0x74, 0x5f, 0x70, 0x72, 0x65, 0x76, + 0x69, 0x65, 0x77, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0b, 0x74, 0x65, 0x78, + 0x74, 0x50, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x88, 0x01, 0x01, 0x42, 0x0f, 0x0a, 0x0d, 0x5f, + 0x74, 0x65, 0x78, 0x74, 0x5f, 0x70, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x22, 0x4b, 0x0a, 0x13, + 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x41, + 0x72, 0x67, 0x73, 0x12, 0x34, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1a, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, + 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, + 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x22, 0x19, 0x0a, 0x17, 0x43, 0x6f, 0x6e, + 0x6e, 0x65, 0x63, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xa2, 0x04, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x53, 0x74, 0x61, 0x72, + 0x6c, 0x61, 0x72, 0x6b, 0x52, 0x75, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x1d, 0x0a, 0x0a, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x09, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x49, 0x64, 0x12, 0x2b, + 0x0a, 0x11, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x5f, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x73, 0x65, 0x72, 0x69, 0x61, + 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, 0x12, 0x2b, 0x0a, 0x11, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x10, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, - 0x69, 0x7a, 0x65, 0x64, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x88, 0x01, 0x01, 0x12, 0x1b, 0x0a, - 0x09, 0x69, 0x73, 0x5f, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x08, 0x69, 0x73, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x12, 0x3f, 0x0a, 0x1a, 0x72, 0x65, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, + 0x65, 0x64, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x61, 0x72, 0x61, + 0x6c, 0x6c, 0x65, 0x6c, 0x69, 0x73, 0x6d, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0b, 0x70, + 0x61, 0x72, 0x61, 0x6c, 0x6c, 0x65, 0x6c, 0x69, 0x73, 0x6d, 0x12, 0x3a, 0x0a, 0x1a, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x5f, 0x74, 0x6f, 0x5f, 0x6d, - 0x61, 0x69, 0x6e, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, - 0x52, 0x16, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x76, 0x65, 0x50, 0x61, 0x74, 0x68, 0x54, 0x6f, - 0x4d, 0x61, 0x69, 0x6e, 0x46, 0x69, 0x6c, 0x65, 0x88, 0x01, 0x01, 0x12, 0x31, 0x0a, 0x12, 0x6d, - 0x61, 0x69, 0x6e, 0x5f, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, - 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x48, 0x02, 0x52, 0x10, 0x6d, 0x61, 0x69, 0x6e, 0x46, - 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x88, 0x01, 0x01, 0x42, 0x14, - 0x0a, 0x12, 0x5f, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x5f, 0x70, 0x61, - 0x72, 0x61, 0x6d, 0x73, 0x42, 0x1d, 0x0a, 0x1b, 0x5f, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x76, - 0x65, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x5f, 0x74, 0x6f, 0x5f, 0x6d, 0x61, 0x69, 0x6e, 0x5f, 0x66, - 0x69, 0x6c, 0x65, 0x42, 0x15, 0x0a, 0x13, 0x5f, 0x6d, 0x61, 0x69, 0x6e, 0x5f, 0x66, 0x75, 0x6e, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x2a, 0x36, 0x0a, 0x0d, 0x53, 0x65, - 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x0b, 0x0a, 0x07, 0x53, - 0x54, 0x4f, 0x50, 0x50, 0x45, 0x44, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x52, 0x55, 0x4e, 0x4e, - 0x49, 0x4e, 0x47, 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, - 0x10, 0x02, 0x2a, 0x2c, 0x0a, 0x11, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x44, 0x6f, 0x77, 0x6e, 0x6c, - 0x6f, 0x61, 0x64, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x0a, 0x0a, 0x06, 0x61, 0x6c, 0x77, 0x61, 0x79, - 0x73, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x10, 0x01, - 0x2a, 0x26, 0x0a, 0x07, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x12, 0x0b, 0x0a, 0x07, 0x43, - 0x4f, 0x4e, 0x4e, 0x45, 0x43, 0x54, 0x10, 0x00, 0x12, 0x0e, 0x0a, 0x0a, 0x4e, 0x4f, 0x5f, 0x43, - 0x4f, 0x4e, 0x4e, 0x45, 0x43, 0x54, 0x10, 0x01, 0x2a, 0x32, 0x0a, 0x13, 0x4b, 0x75, 0x72, 0x74, - 0x6f, 0x73, 0x69, 0x73, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x46, 0x6c, 0x61, 0x67, 0x12, - 0x1b, 0x0a, 0x17, 0x4e, 0x4f, 0x5f, 0x49, 0x4e, 0x53, 0x54, 0x52, 0x55, 0x43, 0x54, 0x49, 0x4f, - 0x4e, 0x53, 0x5f, 0x43, 0x41, 0x43, 0x48, 0x49, 0x4e, 0x47, 0x10, 0x00, 0x2a, 0x26, 0x0a, 0x0d, - 0x52, 0x65, 0x73, 0x74, 0x61, 0x72, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x09, 0x0a, - 0x05, 0x4e, 0x45, 0x56, 0x45, 0x52, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x41, 0x4c, 0x57, 0x41, - 0x59, 0x53, 0x10, 0x01, 0x32, 0xa6, 0x10, 0x0a, 0x13, 0x41, 0x70, 0x69, 0x43, 0x6f, 0x6e, 0x74, - 0x61, 0x69, 0x6e, 0x65, 0x72, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x6d, 0x0a, 0x11, - 0x52, 0x75, 0x6e, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x53, 0x63, 0x72, 0x69, 0x70, - 0x74, 0x12, 0x28, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, - 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x75, 0x6e, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, - 0x6b, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, 0x41, 0x72, 0x67, 0x73, 0x1a, 0x2a, 0x2e, 0x61, 0x70, + 0x61, 0x69, 0x6e, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x16, + 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x76, 0x65, 0x50, 0x61, 0x74, 0x68, 0x54, 0x6f, 0x4d, 0x61, + 0x69, 0x6e, 0x46, 0x69, 0x6c, 0x65, 0x12, 0x2c, 0x0a, 0x12, 0x6d, 0x61, 0x69, 0x6e, 0x5f, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x10, 0x6d, 0x61, 0x69, 0x6e, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x5b, 0x0a, 0x15, 0x65, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, + 0x6e, 0x74, 0x61, 0x6c, 0x5f, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x18, 0x07, 0x20, + 0x03, 0x28, 0x0e, 0x32, 0x26, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, + 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x4b, 0x75, 0x72, 0x74, 0x6f, 0x73, 0x69, 0x73, + 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x46, 0x6c, 0x61, 0x67, 0x52, 0x14, 0x65, 0x78, 0x70, + 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, + 0x73, 0x12, 0x47, 0x0a, 0x0e, 0x72, 0x65, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x70, 0x6f, 0x6c, + 0x69, 0x63, 0x79, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x20, 0x2e, 0x61, 0x70, 0x69, 0x5f, + 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x65, + 0x73, 0x74, 0x61, 0x72, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x0d, 0x72, 0x65, 0x73, + 0x74, 0x61, 0x72, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x3f, 0x0a, 0x19, 0x69, 0x6e, + 0x69, 0x74, 0x69, 0x61, 0x6c, 0x5f, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, + 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, + 0x17, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x53, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, + 0x65, 0x64, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x88, 0x01, 0x01, 0x42, 0x1c, 0x0a, 0x1a, 0x5f, + 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x5f, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, + 0x65, 0x64, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x22, 0x27, 0x0a, 0x08, 0x50, 0x6c, 0x61, + 0x6e, 0x59, 0x61, 0x6d, 0x6c, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x6c, 0x61, 0x6e, 0x5f, 0x79, 0x61, + 0x6d, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6c, 0x61, 0x6e, 0x59, 0x61, + 0x6d, 0x6c, 0x22, 0xdb, 0x01, 0x0a, 0x1a, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x53, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x50, 0x6c, 0x61, 0x6e, 0x59, 0x61, 0x6d, 0x6c, 0x41, 0x72, 0x67, + 0x73, 0x12, 0x2b, 0x0a, 0x11, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x5f, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x73, 0x65, + 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, 0x12, 0x30, + 0x0a, 0x11, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x5f, 0x70, 0x61, 0x72, + 0x61, 0x6d, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x10, 0x73, 0x65, 0x72, + 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x88, 0x01, 0x01, + 0x12, 0x31, 0x0a, 0x12, 0x6d, 0x61, 0x69, 0x6e, 0x5f, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x10, + 0x6d, 0x61, 0x69, 0x6e, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, + 0x88, 0x01, 0x01, 0x42, 0x14, 0x0a, 0x12, 0x5f, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, + 0x65, 0x64, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x42, 0x15, 0x0a, 0x13, 0x5f, 0x6d, 0x61, + 0x69, 0x6e, 0x5f, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, + 0x22, 0xcb, 0x02, 0x0a, 0x1b, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x50, 0x61, 0x63, + 0x6b, 0x61, 0x67, 0x65, 0x50, 0x6c, 0x61, 0x6e, 0x59, 0x61, 0x6d, 0x6c, 0x41, 0x72, 0x67, 0x73, + 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x49, 0x64, 0x12, + 0x30, 0x0a, 0x11, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x5f, 0x70, 0x61, + 0x72, 0x61, 0x6d, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x10, 0x73, 0x65, + 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x88, 0x01, + 0x01, 0x12, 0x1b, 0x0a, 0x09, 0x69, 0x73, 0x5f, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x69, 0x73, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x12, 0x3f, + 0x0a, 0x1a, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x5f, + 0x74, 0x6f, 0x5f, 0x6d, 0x61, 0x69, 0x6e, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x09, 0x48, 0x01, 0x52, 0x16, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x76, 0x65, 0x50, 0x61, + 0x74, 0x68, 0x54, 0x6f, 0x4d, 0x61, 0x69, 0x6e, 0x46, 0x69, 0x6c, 0x65, 0x88, 0x01, 0x01, 0x12, + 0x31, 0x0a, 0x12, 0x6d, 0x61, 0x69, 0x6e, 0x5f, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x48, 0x02, 0x52, 0x10, 0x6d, + 0x61, 0x69, 0x6e, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x88, + 0x01, 0x01, 0x42, 0x14, 0x0a, 0x12, 0x5f, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, + 0x64, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x42, 0x1d, 0x0a, 0x1b, 0x5f, 0x72, 0x65, 0x6c, + 0x61, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x5f, 0x74, 0x6f, 0x5f, 0x6d, 0x61, + 0x69, 0x6e, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x42, 0x15, 0x0a, 0x13, 0x5f, 0x6d, 0x61, 0x69, 0x6e, + 0x5f, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x2a, 0x36, + 0x0a, 0x0d, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, + 0x0b, 0x0a, 0x07, 0x53, 0x54, 0x4f, 0x50, 0x50, 0x45, 0x44, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, + 0x52, 0x55, 0x4e, 0x4e, 0x49, 0x4e, 0x47, 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x55, 0x4e, 0x4b, + 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x02, 0x2a, 0x2c, 0x0a, 0x11, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x44, + 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x0a, 0x0a, 0x06, 0x61, + 0x6c, 0x77, 0x61, 0x79, 0x73, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x6d, 0x69, 0x73, 0x73, 0x69, + 0x6e, 0x67, 0x10, 0x01, 0x2a, 0x26, 0x0a, 0x07, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x12, + 0x0b, 0x0a, 0x07, 0x43, 0x4f, 0x4e, 0x4e, 0x45, 0x43, 0x54, 0x10, 0x00, 0x12, 0x0e, 0x0a, 0x0a, + 0x4e, 0x4f, 0x5f, 0x43, 0x4f, 0x4e, 0x4e, 0x45, 0x43, 0x54, 0x10, 0x01, 0x2a, 0x32, 0x0a, 0x13, + 0x4b, 0x75, 0x72, 0x74, 0x6f, 0x73, 0x69, 0x73, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x46, + 0x6c, 0x61, 0x67, 0x12, 0x1b, 0x0a, 0x17, 0x4e, 0x4f, 0x5f, 0x49, 0x4e, 0x53, 0x54, 0x52, 0x55, + 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x53, 0x5f, 0x43, 0x41, 0x43, 0x48, 0x49, 0x4e, 0x47, 0x10, 0x00, + 0x2a, 0x26, 0x0a, 0x0d, 0x52, 0x65, 0x73, 0x74, 0x61, 0x72, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, + 0x79, 0x12, 0x09, 0x0a, 0x05, 0x4e, 0x45, 0x56, 0x45, 0x52, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, + 0x41, 0x4c, 0x57, 0x41, 0x59, 0x53, 0x10, 0x01, 0x32, 0xa6, 0x10, 0x0a, 0x13, 0x41, 0x70, 0x69, + 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, + 0x12, 0x6d, 0x0a, 0x11, 0x52, 0x75, 0x6e, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x53, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x12, 0x28, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, + 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x75, 0x6e, 0x53, 0x74, 0x61, + 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, 0x41, 0x72, 0x67, 0x73, 0x1a, + 0x2a, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, + 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x52, 0x75, 0x6e, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x4c, 0x69, 0x6e, 0x65, 0x22, 0x00, 0x30, 0x01, 0x12, + 0x59, 0x0a, 0x15, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, + 0x6b, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x12, 0x24, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, + 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, 0x72, + 0x65, 0x61, 0x6d, 0x65, 0x64, 0x44, 0x61, 0x74, 0x61, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x1a, 0x16, + 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, + 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x28, 0x01, 0x12, 0x6f, 0x0a, 0x12, 0x52, 0x75, + 0x6e, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, + 0x12, 0x29, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, + 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x75, 0x6e, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, + 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x41, 0x72, 0x67, 0x73, 0x1a, 0x2a, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x52, 0x75, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x4c, 0x69, 0x6e, 0x65, 0x22, 0x00, 0x30, 0x01, 0x12, 0x59, 0x0a, 0x15, 0x55, - 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x50, 0x61, 0x63, - 0x6b, 0x61, 0x67, 0x65, 0x12, 0x24, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, - 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x65, - 0x64, 0x44, 0x61, 0x74, 0x61, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, - 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, - 0x74, 0x79, 0x22, 0x00, 0x28, 0x01, 0x12, 0x6f, 0x0a, 0x12, 0x52, 0x75, 0x6e, 0x53, 0x74, 0x61, - 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x12, 0x29, 0x2e, 0x61, - 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, - 0x2e, 0x52, 0x75, 0x6e, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x50, 0x61, 0x63, 0x6b, - 0x61, 0x67, 0x65, 0x41, 0x72, 0x67, 0x73, 0x1a, 0x2a, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, - 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, 0x61, 0x72, - 0x6c, 0x61, 0x72, 0x6b, 0x52, 0x75, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x4c, - 0x69, 0x6e, 0x65, 0x22, 0x00, 0x30, 0x01, 0x12, 0x5b, 0x0a, 0x0b, 0x47, 0x65, 0x74, 0x53, 0x65, - 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x12, 0x22, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, - 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x65, - 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x41, 0x72, 0x67, 0x73, 0x1a, 0x26, 0x2e, 0x61, 0x70, 0x69, + 0x6e, 0x73, 0x65, 0x4c, 0x69, 0x6e, 0x65, 0x22, 0x00, 0x30, 0x01, 0x12, 0x5b, 0x0a, 0x0b, 0x47, + 0x65, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x12, 0x22, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x47, - 0x65, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x00, 0x12, 0x8d, 0x01, 0x0a, 0x2a, 0x47, 0x65, 0x74, 0x45, 0x78, 0x69, 0x73, - 0x74, 0x69, 0x6e, 0x67, 0x41, 0x6e, 0x64, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x69, 0x63, 0x61, - 0x6c, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, - 0x65, 0x72, 0x73, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x45, 0x2e, 0x61, 0x70, - 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, - 0x47, 0x65, 0x74, 0x45, 0x78, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x41, 0x6e, 0x64, 0x48, 0x69, - 0x73, 0x74, 0x6f, 0x72, 0x69, 0x63, 0x61, 0x6c, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, - 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x00, 0x12, 0x5b, 0x0a, 0x0b, 0x45, 0x78, 0x65, 0x63, 0x43, 0x6f, 0x6d, 0x6d, - 0x61, 0x6e, 0x64, 0x12, 0x22, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, - 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x43, 0x6f, 0x6d, 0x6d, - 0x61, 0x6e, 0x64, 0x41, 0x72, 0x67, 0x73, 0x1a, 0x26, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, + 0x65, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x41, 0x72, 0x67, 0x73, 0x1a, 0x26, + 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, + 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x8d, 0x01, 0x0a, 0x2a, 0x47, 0x65, 0x74, + 0x45, 0x78, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x41, 0x6e, 0x64, 0x48, 0x69, 0x73, 0x74, 0x6f, + 0x72, 0x69, 0x63, 0x61, 0x6c, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x65, 0x6e, + 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x73, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, + 0x45, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, + 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x78, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x41, + 0x6e, 0x64, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x69, 0x63, 0x61, 0x6c, 0x53, 0x65, 0x72, 0x76, + 0x69, 0x63, 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x73, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x5b, 0x0a, 0x0b, 0x45, 0x78, 0x65, 0x63, + 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x22, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x45, 0x78, 0x65, 0x63, - 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x00, 0x12, 0x79, 0x0a, 0x22, 0x57, 0x61, 0x69, 0x74, 0x46, 0x6f, 0x72, 0x48, 0x74, 0x74, 0x70, - 0x47, 0x65, 0x74, 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x41, 0x76, 0x61, 0x69, 0x6c, - 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x12, 0x39, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, + 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x41, 0x72, 0x67, 0x73, 0x1a, 0x26, 0x2e, 0x61, 0x70, + 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, + 0x45, 0x78, 0x65, 0x63, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x79, 0x0a, 0x22, 0x57, 0x61, 0x69, 0x74, 0x46, 0x6f, 0x72, + 0x48, 0x74, 0x74, 0x70, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x41, + 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x12, 0x39, 0x2e, 0x61, 0x70, + 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, + 0x57, 0x61, 0x69, 0x74, 0x46, 0x6f, 0x72, 0x48, 0x74, 0x74, 0x70, 0x47, 0x65, 0x74, 0x45, 0x6e, + 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x69, 0x6c, 0x69, + 0x74, 0x79, 0x41, 0x72, 0x67, 0x73, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, + 0x12, 0x7b, 0x0a, 0x23, 0x57, 0x61, 0x69, 0x74, 0x46, 0x6f, 0x72, 0x48, 0x74, 0x74, 0x70, 0x50, + 0x6f, 0x73, 0x74, 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x41, 0x76, 0x61, 0x69, 0x6c, + 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x12, 0x3a, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x57, 0x61, 0x69, 0x74, - 0x46, 0x6f, 0x72, 0x48, 0x74, 0x74, 0x70, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, - 0x6e, 0x74, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x41, 0x72, - 0x67, 0x73, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x7b, 0x0a, 0x23, - 0x57, 0x61, 0x69, 0x74, 0x46, 0x6f, 0x72, 0x48, 0x74, 0x74, 0x70, 0x50, 0x6f, 0x73, 0x74, 0x45, - 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x69, 0x6c, - 0x69, 0x74, 0x79, 0x12, 0x3a, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, - 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x57, 0x61, 0x69, 0x74, 0x46, 0x6f, 0x72, 0x48, - 0x74, 0x74, 0x70, 0x50, 0x6f, 0x73, 0x74, 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x41, - 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x41, 0x72, 0x67, 0x73, 0x1a, - 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, - 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x6f, 0x0a, 0x13, 0x55, 0x70, 0x6c, - 0x6f, 0x61, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, - 0x12, 0x24, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, - 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x65, 0x64, 0x44, 0x61, 0x74, - 0x61, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x1a, 0x2e, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, - 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x55, 0x70, 0x6c, 0x6f, 0x61, - 0x64, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x28, 0x01, 0x12, 0x6f, 0x0a, 0x15, 0x44, 0x6f, - 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x72, 0x74, 0x69, 0x66, - 0x61, 0x63, 0x74, 0x12, 0x2c, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, - 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x44, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, - 0x46, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x41, 0x72, 0x67, - 0x73, 0x1a, 0x24, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, - 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x65, 0x64, 0x44, 0x61, - 0x74, 0x61, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x22, 0x00, 0x30, 0x01, 0x12, 0x79, 0x0a, 0x15, 0x53, - 0x74, 0x6f, 0x72, 0x65, 0x57, 0x65, 0x62, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x72, 0x74, 0x69, - 0x66, 0x61, 0x63, 0x74, 0x12, 0x2c, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, - 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x57, 0x65, - 0x62, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x41, 0x72, - 0x67, 0x73, 0x1a, 0x30, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, - 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x57, 0x65, 0x62, 0x46, - 0x69, 0x6c, 0x65, 0x73, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x91, 0x01, 0x0a, 0x1d, 0x53, 0x74, 0x6f, 0x72, 0x65, - 0x46, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x46, 0x72, 0x6f, - 0x6d, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x34, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, + 0x46, 0x6f, 0x72, 0x48, 0x74, 0x74, 0x70, 0x50, 0x6f, 0x73, 0x74, 0x45, 0x6e, 0x64, 0x70, 0x6f, + 0x69, 0x6e, 0x74, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x41, + 0x72, 0x67, 0x73, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x6f, 0x0a, + 0x13, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x72, 0x74, 0x69, + 0x66, 0x61, 0x63, 0x74, 0x12, 0x24, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, + 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x65, + 0x64, 0x44, 0x61, 0x74, 0x61, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x1a, 0x2e, 0x2e, 0x61, 0x70, 0x69, + 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x55, + 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, + 0x63, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x28, 0x01, 0x12, 0x6f, + 0x0a, 0x15, 0x44, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x41, + 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x12, 0x2c, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, + 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x44, 0x6f, 0x77, 0x6e, + 0x6c, 0x6f, 0x61, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, + 0x74, 0x41, 0x72, 0x67, 0x73, 0x1a, 0x24, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, + 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, + 0x65, 0x64, 0x44, 0x61, 0x74, 0x61, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x22, 0x00, 0x30, 0x01, 0x12, + 0x79, 0x0a, 0x15, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x57, 0x65, 0x62, 0x46, 0x69, 0x6c, 0x65, 0x73, + 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x12, 0x2c, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, 0x6f, - 0x72, 0x65, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x46, - 0x72, 0x6f, 0x6d, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x41, 0x72, 0x67, 0x73, 0x1a, 0x38, - 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, - 0x70, 0x69, 0x2e, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x72, 0x74, - 0x69, 0x66, 0x61, 0x63, 0x74, 0x46, 0x72, 0x6f, 0x6d, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x75, 0x0a, 0x1e, 0x4c, 0x69, - 0x73, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x4e, - 0x61, 0x6d, 0x65, 0x73, 0x41, 0x6e, 0x64, 0x55, 0x75, 0x69, 0x64, 0x73, 0x12, 0x16, 0x2e, 0x67, - 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, - 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x39, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, - 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x46, 0x69, 0x6c, - 0x65, 0x73, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x41, - 0x6e, 0x64, 0x55, 0x75, 0x69, 0x64, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x00, 0x12, 0x91, 0x01, 0x0a, 0x1c, 0x49, 0x6e, 0x73, 0x70, 0x65, 0x63, 0x74, 0x46, 0x69, 0x6c, - 0x65, 0x73, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, - 0x74, 0x73, 0x12, 0x36, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, - 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x49, 0x6e, 0x73, 0x70, 0x65, 0x63, 0x74, 0x46, 0x69, - 0x6c, 0x65, 0x73, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x65, - 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x37, 0x2e, 0x61, 0x70, 0x69, - 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x49, - 0x6e, 0x73, 0x70, 0x65, 0x63, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x72, 0x74, 0x69, 0x66, - 0x61, 0x63, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x67, 0x0a, 0x0f, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, - 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x12, 0x26, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, - 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x43, 0x6f, 0x6e, - 0x6e, 0x65, 0x63, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x41, 0x72, 0x67, 0x73, - 0x1a, 0x2a, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, - 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x53, 0x65, 0x72, 0x76, - 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x55, - 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x52, 0x75, 0x6e, + 0x72, 0x65, 0x57, 0x65, 0x62, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, + 0x63, 0x74, 0x41, 0x72, 0x67, 0x73, 0x1a, 0x30, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, + 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, 0x6f, 0x72, 0x65, + 0x57, 0x65, 0x62, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x91, 0x01, 0x0a, 0x1d, 0x53, + 0x74, 0x6f, 0x72, 0x65, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, + 0x74, 0x46, 0x72, 0x6f, 0x6d, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x34, 0x2e, 0x61, + 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, + 0x2e, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x72, 0x74, 0x69, 0x66, + 0x61, 0x63, 0x74, 0x46, 0x72, 0x6f, 0x6d, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x41, 0x72, + 0x67, 0x73, 0x1a, 0x38, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, + 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x46, 0x69, 0x6c, 0x65, + 0x73, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x46, 0x72, 0x6f, 0x6d, 0x53, 0x65, 0x72, + 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x75, + 0x0a, 0x1e, 0x4c, 0x69, 0x73, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x72, 0x74, 0x69, 0x66, + 0x61, 0x63, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x41, 0x6e, 0x64, 0x55, 0x75, 0x69, 0x64, 0x73, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, - 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x29, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, - 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, - 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x52, 0x75, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x69, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x53, 0x74, 0x61, 0x72, - 0x6c, 0x61, 0x72, 0x6b, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, 0x50, 0x6c, 0x61, 0x6e, 0x59, 0x61, - 0x6d, 0x6c, 0x12, 0x2d, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, - 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x53, - 0x63, 0x72, 0x69, 0x70, 0x74, 0x50, 0x6c, 0x61, 0x6e, 0x59, 0x61, 0x6d, 0x6c, 0x41, 0x72, 0x67, - 0x73, 0x1a, 0x1b, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, - 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x50, 0x6c, 0x61, 0x6e, 0x59, 0x61, 0x6d, 0x6c, 0x22, 0x00, - 0x12, 0x6b, 0x0a, 0x1a, 0x47, 0x65, 0x74, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x50, - 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x50, 0x6c, 0x61, 0x6e, 0x59, 0x61, 0x6d, 0x6c, 0x12, 0x2e, - 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, - 0x70, 0x69, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x50, 0x61, 0x63, 0x6b, 0x61, - 0x67, 0x65, 0x50, 0x6c, 0x61, 0x6e, 0x59, 0x61, 0x6d, 0x6c, 0x41, 0x72, 0x67, 0x73, 0x1a, 0x1b, + 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x39, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, + 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x4c, 0x69, 0x73, + 0x74, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x4e, 0x61, + 0x6d, 0x65, 0x73, 0x41, 0x6e, 0x64, 0x55, 0x75, 0x69, 0x64, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x91, 0x01, 0x0a, 0x1c, 0x49, 0x6e, 0x73, 0x70, 0x65, 0x63, + 0x74, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x43, 0x6f, + 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x36, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, + 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x49, 0x6e, 0x73, 0x70, 0x65, + 0x63, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x43, + 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x37, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, - 0x70, 0x69, 0x2e, 0x50, 0x6c, 0x61, 0x6e, 0x59, 0x61, 0x6d, 0x6c, 0x22, 0x00, 0x42, 0x52, 0x5a, - 0x50, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6b, 0x75, 0x72, 0x74, - 0x6f, 0x73, 0x69, 0x73, 0x2d, 0x74, 0x65, 0x63, 0x68, 0x2f, 0x6b, 0x75, 0x72, 0x74, 0x6f, 0x73, - 0x69, 0x73, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x67, 0x6f, 0x6c, 0x61, 0x6e, 0x67, 0x2f, 0x63, 0x6f, - 0x72, 0x65, 0x2f, 0x6b, 0x75, 0x72, 0x74, 0x6f, 0x73, 0x69, 0x73, 0x5f, 0x63, 0x6f, 0x72, 0x65, - 0x5f, 0x72, 0x70, 0x63, 0x5f, 0x61, 0x70, 0x69, 0x5f, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, - 0x73, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x70, 0x69, 0x2e, 0x49, 0x6e, 0x73, 0x70, 0x65, 0x63, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x41, + 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x67, 0x0a, 0x0f, 0x43, 0x6f, 0x6e, + 0x6e, 0x65, 0x63, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x12, 0x26, 0x2e, 0x61, + 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, + 0x2e, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, + 0x41, 0x72, 0x67, 0x73, 0x1a, 0x2a, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, + 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, + 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x00, 0x12, 0x55, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, + 0x6b, 0x52, 0x75, 0x6e, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x29, 0x2e, 0x61, + 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, + 0x2e, 0x47, 0x65, 0x74, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x52, 0x75, 0x6e, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x69, 0x0a, 0x19, 0x47, 0x65, 0x74, + 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, 0x50, 0x6c, + 0x61, 0x6e, 0x59, 0x61, 0x6d, 0x6c, 0x12, 0x2d, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, + 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x6c, + 0x61, 0x72, 0x6b, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, 0x50, 0x6c, 0x61, 0x6e, 0x59, 0x61, 0x6d, + 0x6c, 0x41, 0x72, 0x67, 0x73, 0x1a, 0x1b, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, + 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x50, 0x6c, 0x61, 0x6e, 0x59, 0x61, + 0x6d, 0x6c, 0x22, 0x00, 0x12, 0x6b, 0x0a, 0x1a, 0x47, 0x65, 0x74, 0x53, 0x74, 0x61, 0x72, 0x6c, + 0x61, 0x72, 0x6b, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x50, 0x6c, 0x61, 0x6e, 0x59, 0x61, + 0x6d, 0x6c, 0x12, 0x2e, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, + 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x50, + 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x50, 0x6c, 0x61, 0x6e, 0x59, 0x61, 0x6d, 0x6c, 0x41, 0x72, + 0x67, 0x73, 0x1a, 0x1b, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, + 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x50, 0x6c, 0x61, 0x6e, 0x59, 0x61, 0x6d, 0x6c, 0x22, + 0x00, 0x42, 0x52, 0x5a, 0x50, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, + 0x6b, 0x75, 0x72, 0x74, 0x6f, 0x73, 0x69, 0x73, 0x2d, 0x74, 0x65, 0x63, 0x68, 0x2f, 0x6b, 0x75, + 0x72, 0x74, 0x6f, 0x73, 0x69, 0x73, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x67, 0x6f, 0x6c, 0x61, 0x6e, + 0x67, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x6b, 0x75, 0x72, 0x74, 0x6f, 0x73, 0x69, 0x73, 0x5f, + 0x63, 0x6f, 0x72, 0x65, 0x5f, 0x72, 0x70, 0x63, 0x5f, 0x61, 0x70, 0x69, 0x5f, 0x62, 0x69, 0x6e, + 0x64, 0x69, 0x6e, 0x67, 0x73, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( diff --git a/api/golang/core/lib/binding_constructors/binding_constructors.go b/api/golang/core/lib/binding_constructors/binding_constructors.go index 00681c2a8a..2fec7d4b11 100644 --- a/api/golang/core/lib/binding_constructors/binding_constructors.go +++ b/api/golang/core/lib/binding_constructors/binding_constructors.go @@ -367,8 +367,12 @@ func NewServiceInfo( maxMillicpus uint32, minMemoryMegabytes uint32, maxMemoryMegabytes uint32, + user *kurtosis_core_rpc_api_bindings.User, + tolerations []*kurtosis_core_rpc_api_bindings.Toleration, + nodeSelectors map[string]string, + labels map[string]string, + tiniEnabled bool, ) *kurtosis_core_rpc_api_bindings.ServiceInfo { - return &kurtosis_core_rpc_api_bindings.ServiceInfo{ ServiceUuid: uuid, Name: name, @@ -384,7 +388,11 @@ func NewServiceInfo( MinMillicpus: minMillicpus, MaxMemoryMegabytes: maxMemoryMegabytes, MinMemoryMegabytes: minMemoryMegabytes, - User: nil, + User: user, + Tolerations: tolerations, + NodeSelectors: nodeSelectors, + Labels: labels, + TiniEnabled: &tiniEnabled, } } diff --git a/api/protobuf/core/api_container_service.proto b/api/protobuf/core/api_container_service.proto index e83dd00868..cc8394c8ce 100644 --- a/api/protobuf/core/api_container_service.proto +++ b/api/protobuf/core/api_container_service.proto @@ -117,11 +117,9 @@ message FilesArtifactsList { // Equivalent of user on ServiceConfig message User { - string username = 1; + uint32 uid = 1; - uint32 uid = 2; - - uint32 gid = 3; + uint32 gid = 2; } // Equivalent of tolerations on ServiceConfig diff --git a/api/rust/src/api_container_api.rs b/api/rust/src/api_container_api.rs index a759ab68ac..2df10e26b7 100644 --- a/api/rust/src/api_container_api.rs +++ b/api/rust/src/api_container_api.rs @@ -134,11 +134,9 @@ pub struct FilesArtifactsList { #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct User { - #[prost(string, tag = "1")] - pub username: ::prost::alloc::string::String, - #[prost(uint32, tag = "2")] + #[prost(uint32, tag = "1")] pub uid: u32, - #[prost(uint32, tag = "3")] + #[prost(uint32, tag = "2")] pub gid: u32, } /// Equivalent of tolerations on ServiceConfig diff --git a/api/typescript/src/core/kurtosis_core_rpc_api_bindings/api_container_service_pb.d.ts b/api/typescript/src/core/kurtosis_core_rpc_api_bindings/api_container_service_pb.d.ts index 5370cb79ad..0b4c687438 100644 --- a/api/typescript/src/core/kurtosis_core_rpc_api_bindings/api_container_service_pb.d.ts +++ b/api/typescript/src/core/kurtosis_core_rpc_api_bindings/api_container_service_pb.d.ts @@ -126,9 +126,6 @@ export namespace FilesArtifactsList { } export class User extends jspb.Message { - getUsername(): string; - setUsername(value: string): User; - getUid(): number; setUid(value: number): User; @@ -145,7 +142,6 @@ export class User extends jspb.Message { export namespace User { export type AsObject = { - username: string, uid: number, gid: number, } diff --git a/api/typescript/src/core/kurtosis_core_rpc_api_bindings/api_container_service_pb.js b/api/typescript/src/core/kurtosis_core_rpc_api_bindings/api_container_service_pb.js index a15ba6e760..bfa76271e3 100644 --- a/api/typescript/src/core/kurtosis_core_rpc_api_bindings/api_container_service_pb.js +++ b/api/typescript/src/core/kurtosis_core_rpc_api_bindings/api_container_service_pb.js @@ -1909,9 +1909,8 @@ proto.api_container_api.User.prototype.toObject = function(opt_includeInstance) */ proto.api_container_api.User.toObject = function(includeInstance, msg) { var f, obj = { - username: jspb.Message.getFieldWithDefault(msg, 1, ""), - uid: jspb.Message.getFieldWithDefault(msg, 2, 0), - gid: jspb.Message.getFieldWithDefault(msg, 3, 0) + uid: jspb.Message.getFieldWithDefault(msg, 1, 0), + gid: jspb.Message.getFieldWithDefault(msg, 2, 0) }; if (includeInstance) { @@ -1949,14 +1948,10 @@ proto.api_container_api.User.deserializeBinaryFromReader = function(msg, reader) var field = reader.getFieldNumber(); switch (field) { case 1: - var value = /** @type {string} */ (reader.readString()); - msg.setUsername(value); - break; - case 2: var value = /** @type {number} */ (reader.readUint32()); msg.setUid(value); break; - case 3: + case 2: var value = /** @type {number} */ (reader.readUint32()); msg.setGid(value); break; @@ -1989,24 +1984,17 @@ proto.api_container_api.User.prototype.serializeBinary = function() { */ proto.api_container_api.User.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getUsername(); - if (f.length > 0) { - writer.writeString( - 1, - f - ); - } f = message.getUid(); if (f !== 0) { writer.writeUint32( - 2, + 1, f ); } f = message.getGid(); if (f !== 0) { writer.writeUint32( - 3, + 2, f ); } @@ -2014,29 +2002,11 @@ proto.api_container_api.User.serializeBinaryToWriter = function(message, writer) /** - * optional string username = 1; - * @return {string} - */ -proto.api_container_api.User.prototype.getUsername = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); -}; - - -/** - * @param {string} value - * @return {!proto.api_container_api.User} returns this - */ -proto.api_container_api.User.prototype.setUsername = function(value) { - return jspb.Message.setProto3StringField(this, 1, value); -}; - - -/** - * optional uint32 uid = 2; + * optional uint32 uid = 1; * @return {number} */ proto.api_container_api.User.prototype.getUid = function() { - return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 2, 0)); + return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 1, 0)); }; @@ -2045,16 +2015,16 @@ proto.api_container_api.User.prototype.getUid = function() { * @return {!proto.api_container_api.User} returns this */ proto.api_container_api.User.prototype.setUid = function(value) { - return jspb.Message.setProto3IntField(this, 2, value); + return jspb.Message.setProto3IntField(this, 1, value); }; /** - * optional uint32 gid = 3; + * optional uint32 gid = 2; * @return {number} */ proto.api_container_api.User.prototype.getGid = function() { - return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 3, 0)); + return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 2, 0)); }; @@ -2063,7 +2033,7 @@ proto.api_container_api.User.prototype.getGid = function() { * @return {!proto.api_container_api.User} returns this */ proto.api_container_api.User.prototype.setGid = function(value) { - return jspb.Message.setProto3IntField(this, 3, value); + return jspb.Message.setProto3IntField(this, 2, value); }; diff --git a/api/typescript/src/core/kurtosis_core_rpc_api_bindings/connect/api_container_service_pb.d.ts b/api/typescript/src/core/kurtosis_core_rpc_api_bindings/connect/api_container_service_pb.d.ts index 83d016d7a2..f4571130a0 100644 --- a/api/typescript/src/core/kurtosis_core_rpc_api_bindings/connect/api_container_service_pb.d.ts +++ b/api/typescript/src/core/kurtosis_core_rpc_api_bindings/connect/api_container_service_pb.d.ts @@ -266,17 +266,12 @@ export declare class FilesArtifactsList extends Message { */ export declare class User extends Message { /** - * @generated from field: string username = 1; - */ - username: string; - - /** - * @generated from field: uint32 uid = 2; + * @generated from field: uint32 uid = 1; */ uid: number; /** - * @generated from field: uint32 gid = 3; + * @generated from field: uint32 gid = 2; */ gid: number; diff --git a/api/typescript/src/core/kurtosis_core_rpc_api_bindings/connect/api_container_service_pb.js b/api/typescript/src/core/kurtosis_core_rpc_api_bindings/connect/api_container_service_pb.js index e6ac1e649e..4d0676658f 100644 --- a/api/typescript/src/core/kurtosis_core_rpc_api_bindings/connect/api_container_service_pb.js +++ b/api/typescript/src/core/kurtosis_core_rpc_api_bindings/connect/api_container_service_pb.js @@ -137,9 +137,8 @@ export const FilesArtifactsList = proto3.makeMessageType( export const User = proto3.makeMessageType( "api_container_api.User", () => [ - { no: 1, name: "username", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - { no: 2, name: "uid", kind: "scalar", T: 13 /* ScalarType.UINT32 */ }, - { no: 3, name: "gid", kind: "scalar", T: 13 /* ScalarType.UINT32 */ }, + { no: 1, name: "uid", kind: "scalar", T: 13 /* ScalarType.UINT32 */ }, + { no: 2, name: "gid", kind: "scalar", T: 13 /* ScalarType.UINT32 */ }, ], ); diff --git a/core/server/api_container/server/api_container_service.go b/core/server/api_container/server/api_container_service.go index 1a3fe0583d..0b5eb04a98 100644 --- a/core/server/api_container/server/api_container_service.go +++ b/core/server/api_container/server/api_container_service.go @@ -908,17 +908,12 @@ func (apicService *ApiContainerService) getServiceInfoForIdentifier(ctx context. return nil, stacktrace.Propagate(err, "An error occurred getting info for service '%v'", serviceIdentifier) } - // serviceConfig, err := apicService.interpretationTimeValueStore.GetServiceConfig(serviceObj.GetRegistration().GetName()) if err != nil { return nil, stacktrace.Propagate(err, "An error occurred getting service config from interpretation time value store.") } - filesArtifactsExpansions := serviceConfig.GetFilesArtifactsExpansion() - serviceDirPathsToFilesArtifactsMounts := filesArtifactsExpansions.ServiceDirpathsToArtifactIdentifiers - logrus.Infof("SERVICE DIR PATHS TO FILES ARTIFACTS IDENTIFIERS: %v", serviceDirPathsToFilesArtifactsMounts) - - serviceInfo, err := getServiceInfoFromServiceObj(serviceObj, serviceDirPathsToFilesArtifactsMounts) + serviceInfo, err := getServiceInfoFromServiceObj(serviceObj, serviceConfig) if err != nil { return nil, stacktrace.Propagate(err, "A error occurred while converting service obj for service with id '%v' to service info", serviceIdentifier) } @@ -1078,7 +1073,7 @@ func getServiceInfosFromServiceObjs(services map[service.ServiceUUID]*service.Se return serviceInfos, nil } -func getServiceInfoFromServiceObj(serviceObj *service.Service, serviceDirPathsToFilesArtifactsIdentifiers map[string][]string) (*kurtosis_core_rpc_api_bindings.ServiceInfo, error) { +func getServiceInfoFromServiceObj(serviceObj *service.Service, serviceConfig *service.ServiceConfig) (*kurtosis_core_rpc_api_bindings.ServiceInfo, error) { privatePorts := serviceObj.GetPrivatePorts() privateIp := serviceObj.GetRegistration().GetPrivateIP() maybePublicIp := serviceObj.GetMaybePublicIP() @@ -1123,7 +1118,30 @@ func getServiceInfoFromServiceObj(serviceObj *service.Service, serviceDirPathsTo maxMemoryMegabytes := uint32(0) minMemoryMegabytes := uint32(0) - serviceDirPathsToFilesArtifactsList := transformServiceDirPathsToFileArtifactsToApiPortsFilesArtifactsList(serviceDirPathsToFilesArtifactsIdentifiers) + serviceDirPathsToFilesArtifactsList := transformServiceDirPathsToFileArtifactsToApiPortsFilesArtifactsList(serviceConfig.GetFilesArtifactsExpansion().ServiceDirpathsToArtifactIdentifiers) + + user := serviceConfig.GetUser() + var gid uint32 = 0 + userGid, existsGuid := user.GetGID() + if existsGuid { + gid = uint32(userGid) + } + apiUser := &kurtosis_core_rpc_api_bindings.User{ + Uid: uint32(user.GetUID()), + Gid: gid, + } + + tolerations := serviceConfig.GetTolerations() + apiTolerations := []*kurtosis_core_rpc_api_bindings.Toleration{} + for _, toleration := range tolerations { + apiTolerations = append(apiTolerations, &kurtosis_core_rpc_api_bindings.Toleration{ + Key: toleration.Key, + Operator: string(toleration.Operator), + Value: toleration.Value, + Effect: string(toleration.Effect), + TolerationSeconds: *toleration.TolerationSeconds, + }) + } serviceInfoResponse := binding_constructors.NewServiceInfo( serviceUuidStr, @@ -1140,6 +1158,11 @@ func getServiceInfoFromServiceObj(serviceObj *service.Service, serviceDirPathsTo minMillicpus, maxMemoryMegabytes, minMemoryMegabytes, + apiUser, + apiTolerations, + serviceConfig.GetNodeSelectors(), + serviceConfig.GetLabels(), + serviceConfig.GetTiniEnabled(), ) return serviceInfoResponse, nil From 9c59dd678c425c431d3c93ba280117abf74b3150 Mon Sep 17 00:00:00 2001 From: Tedi Mitiku Date: Fri, 28 Mar 2025 15:18:37 -0400 Subject: [PATCH 20/48] add log --- cli/cli/commands/service/add/add.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cli/cli/commands/service/add/add.go b/cli/cli/commands/service/add/add.go index 5dc8f2fc70..205d79aab1 100644 --- a/cli/cli/commands/service/add/add.go +++ b/cli/cli/commands/service/add/add.go @@ -318,6 +318,7 @@ func run( ) } } + logrus.Infof("SERVICE CONFIG STARLARK: ") _, err = service_helpers.RunAddServiceStarlarkScript(ctx, serviceName, enclaveIdentifier, service_helpers.GetAddServiceStarlarkScript(serviceName, serviceConfigStarlarkStr), enclaveCtx) if err != nil { @@ -444,7 +445,6 @@ func GetServiceConfigStarlark( emptyNodeSelecors := map[string]string{} emptyLabels := map[string]string{} - emptyPrivateIpAddrPlaceholder := "" return services.GetFullServiceConfigStarlark( image, ports, @@ -461,7 +461,7 @@ func GetServiceConfigStarlark( emptyNodeSelecors, emptyLabels, &tiniEnabled, - emptyPrivateIpAddrPlaceholder), nil + privateIPAddressPlaceholder), nil } func generateExampleForPortFlag() string { From cd7fb70b2f6989c765f6c82c12c03a8eff802deb Mon Sep 17 00:00:00 2001 From: Tedi Mitiku Date: Fri, 28 Mar 2025 15:22:05 -0400 Subject: [PATCH 21/48] add service config starlark --- cli/cli/commands/service/add/add.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cli/cli/commands/service/add/add.go b/cli/cli/commands/service/add/add.go index 205d79aab1..743c79f085 100644 --- a/cli/cli/commands/service/add/add.go +++ b/cli/cli/commands/service/add/add.go @@ -318,7 +318,7 @@ func run( ) } } - logrus.Infof("SERVICE CONFIG STARLARK: ") + logrus.Infof("SERVICE CONFIG STARLARK: %v", serviceConfigStarlarkStr) _, err = service_helpers.RunAddServiceStarlarkScript(ctx, serviceName, enclaveIdentifier, service_helpers.GetAddServiceStarlarkScript(serviceName, serviceConfigStarlarkStr), enclaveCtx) if err != nil { From da585956d4c2233932fcd95355231df88e67f683 Mon Sep 17 00:00:00 2001 From: Tedi Mitiku Date: Fri, 28 Mar 2025 15:31:07 -0400 Subject: [PATCH 22/48] fix tini --- api/golang/core/lib/services/service_config_builder.go | 8 ++++++-- cli/cli/commands/service/add/add.go | 6 ++++-- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/api/golang/core/lib/services/service_config_builder.go b/api/golang/core/lib/services/service_config_builder.go index bc912fcfaa..819c7d3f56 100644 --- a/api/golang/core/lib/services/service_config_builder.go +++ b/api/golang/core/lib/services/service_config_builder.go @@ -6,6 +6,10 @@ import ( "strings" ) +const ( + tiniEnabledStr = "True" +) + type FilesArtifactUUID string type FileArtifactName string @@ -265,8 +269,8 @@ func GetFullServiceConfigStarlark( } // Tini - if tiniEnabled != nil { - starlarkFields = append(starlarkFields, fmt.Sprintf(`tini_enabled=%t`, *tiniEnabled)) + if *tiniEnabled { + starlarkFields = append(starlarkFields, fmt.Sprintf(`tini_enabled=%s`, tiniEnabledStr)) } return fmt.Sprintf("ServiceConfig(%s)", strings.Join(starlarkFields, ", ")) diff --git a/cli/cli/commands/service/add/add.go b/cli/cli/commands/service/add/add.go index 743c79f085..a6a03ac315 100644 --- a/cli/cli/commands/service/add/add.go +++ b/cli/cli/commands/service/add/add.go @@ -305,7 +305,7 @@ func run( if entrypointStr != "" { entrypoint = append(entrypoint, entrypointStr) } - serviceConfigStarlarkStr, err = GetServiceConfigStarlark(image, portsStr, strings.Split(" ", " "), entrypoint, envvarsStr, filesArtifactMountsStr, defaultLimits, defaultLimits, defaultLimits, defaultLimits, privateIPAddressPlaceholder) + serviceConfigStarlarkStr, err = GetServiceConfigStarlark(image, portsStr, []string{}, entrypoint, envvarsStr, filesArtifactMountsStr, defaultLimits, defaultLimits, defaultLimits, defaultLimits, privateIPAddressPlaceholder) if err != nil { return stacktrace.Propagate( err, @@ -320,7 +320,9 @@ func run( } logrus.Infof("SERVICE CONFIG STARLARK: %v", serviceConfigStarlarkStr) - _, err = service_helpers.RunAddServiceStarlarkScript(ctx, serviceName, enclaveIdentifier, service_helpers.GetAddServiceStarlarkScript(serviceName, serviceConfigStarlarkStr), enclaveCtx) + addServiceStarlark := service_helpers.GetAddServiceStarlarkScript(serviceName, serviceConfigStarlarkStr) + logrus.Infof("ADD SERVICE STARLARK SCRIPT: %v", addServiceStarlark) + _, err = service_helpers.RunAddServiceStarlarkScript(ctx, serviceName, enclaveIdentifier, addServiceStarlark, enclaveCtx) if err != nil { return err // already wrapped } From 4928791f77a7873af6e2dd9c353f34c701f8b060 Mon Sep 17 00:00:00 2001 From: Tedi Mitiku Date: Mon, 31 Mar 2025 15:01:42 -0400 Subject: [PATCH 23/48] add nil checks --- cli/cli/commands/service/add/add.go | 2 +- .../server/api_container_service.go | 28 ++++++++++++------- engine/server/go.mod | 1 + 3 files changed, 20 insertions(+), 11 deletions(-) diff --git a/cli/cli/commands/service/add/add.go b/cli/cli/commands/service/add/add.go index a6a03ac315..1758d052f9 100644 --- a/cli/cli/commands/service/add/add.go +++ b/cli/cli/commands/service/add/add.go @@ -58,7 +58,7 @@ const ( engineClientCtxKey = "engine-client" privateIPAddressPlaceholderKey = "ip-address-placeholder" - privateIPAddressPlaceholderDefault = "KURTOSIS_IP_ADDR_PLACEHOLDER" + privateIPAddressPlaceholderDefault = "" emptyApplicationProtocol = "" linkDelimiter = "://" diff --git a/core/server/api_container/server/api_container_service.go b/core/server/api_container/server/api_container_service.go index 0b5eb04a98..7320dbe196 100644 --- a/core/server/api_container/server/api_container_service.go +++ b/core/server/api_container/server/api_container_service.go @@ -12,6 +12,7 @@ import ( "compress/gzip" "context" "fmt" + "github.com/kurtosis-tech/kurtosis/container-engine-lib/lib/backend_interface/objects/service_user" "github.com/kurtosis-tech/kurtosis/core/server/api_container/server/startosis_engine" "github.com/kurtosis-tech/kurtosis/core/server/api_container/server/startosis_engine/docker_compose_transpiler" "github.com/kurtosis-tech/kurtosis/core/server/api_container/server/startosis_engine/enclave_structure" @@ -1118,17 +1119,24 @@ func getServiceInfoFromServiceObj(serviceObj *service.Service, serviceConfig *se maxMemoryMegabytes := uint32(0) minMemoryMegabytes := uint32(0) - serviceDirPathsToFilesArtifactsList := transformServiceDirPathsToFileArtifactsToApiPortsFilesArtifactsList(serviceConfig.GetFilesArtifactsExpansion().ServiceDirpathsToArtifactIdentifiers) - - user := serviceConfig.GetUser() - var gid uint32 = 0 - userGid, existsGuid := user.GetGID() - if existsGuid { - gid = uint32(userGid) + serviceDirPathsToFilesArtifactsList := map[string]*kurtosis_core_rpc_api_bindings.FilesArtifactsList{} + if serviceConfig.GetFilesArtifactsExpansion() != nil { + serviceDirPathsToFilesArtifactsList = transformServiceDirPathsToFileArtifactsToApiPortsFilesArtifactsList(serviceConfig.GetFilesArtifactsExpansion().ServiceDirpathsToArtifactIdentifiers) } - apiUser := &kurtosis_core_rpc_api_bindings.User{ - Uid: uint32(user.GetUID()), - Gid: gid, + + var user *service_user.ServiceUser + var apiUser *kurtosis_core_rpc_api_bindings.User + if serviceConfig.GetUser() != nil { + user = serviceConfig.GetUser() + var gid uint32 = 0 + userGid, existsGuid := user.GetGID() + if existsGuid { + gid = uint32(userGid) + } + apiUser = &kurtosis_core_rpc_api_bindings.User{ + Uid: uint32(user.GetUID()), + Gid: gid, + } } tolerations := serviceConfig.GetTolerations() diff --git a/engine/server/go.mod b/engine/server/go.mod index c91c3290ea..e823125a5a 100644 --- a/engine/server/go.mod +++ b/engine/server/go.mod @@ -107,6 +107,7 @@ require ( github.com/kurtosis-tech/kurtosis/cloud/api/golang v0.0.0-20230828153722-32770ca96513 // indirect github.com/kurtosis-tech/kurtosis/contexts-config-store v0.0.0 // indirect github.com/kurtosis-tech/kurtosis/enclave-manager/api/golang v0.0.0-20230828153722-32770ca96513 // indirect + github.com/kurtosis-tech/kurtosis/kurtosis_version v0.0.0 // indirect github.com/kurtosis-tech/kurtosis/path-compression v0.0.0-20240307154559-64d2929cd265 // indirect github.com/labstack/gommon v0.4.0 // indirect github.com/mailru/easyjson v0.7.7 // indirect From 6a969f2bdb90de736e09613227e24ef4fd027606 Mon Sep 17 00:00:00 2001 From: Tedi Mitiku Date: Mon, 31 Mar 2025 15:33:56 -0400 Subject: [PATCH 24/48] add log --- core/server/api_container/server/api_container_service.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/core/server/api_container/server/api_container_service.go b/core/server/api_container/server/api_container_service.go index 7320dbe196..1cee26b697 100644 --- a/core/server/api_container/server/api_container_service.go +++ b/core/server/api_container/server/api_container_service.go @@ -1120,6 +1120,9 @@ func getServiceInfoFromServiceObj(serviceObj *service.Service, serviceConfig *se minMemoryMegabytes := uint32(0) serviceDirPathsToFilesArtifactsList := map[string]*kurtosis_core_rpc_api_bindings.FilesArtifactsList{} + svcFilesArtifactsExpansions := serviceConfig.GetFilesArtifactsExpansion() + + logrus.Infof("GET FILES ARTIFACTS EXPANSION: %v", svcFilesArtifactsExpansions) if serviceConfig.GetFilesArtifactsExpansion() != nil { serviceDirPathsToFilesArtifactsList = transformServiceDirPathsToFileArtifactsToApiPortsFilesArtifactsList(serviceConfig.GetFilesArtifactsExpansion().ServiceDirpathsToArtifactIdentifiers) } From 43222b5c5fe3974486a1bcfff6da7115401f1165 Mon Sep 17 00:00:00 2001 From: Tedi Mitiku Date: Mon, 31 Mar 2025 15:34:54 -0400 Subject: [PATCH 25/48] seprate --- .../lib/backend_interface/objects/service/service_config.go | 3 ++- core/server/api_container/server/api_container_service.go | 1 + 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/container-engine-lib/lib/backend_interface/objects/service/service_config.go b/container-engine-lib/lib/backend_interface/objects/service/service_config.go index f336c6345c..266d3c7507 100644 --- a/container-engine-lib/lib/backend_interface/objects/service/service_config.go +++ b/container-engine-lib/lib/backend_interface/objects/service/service_config.go @@ -166,7 +166,8 @@ func (serviceConfig *ServiceConfig) GetEnvVars() map[string]string { } func (serviceConfig *ServiceConfig) GetFilesArtifactsExpansion() *service_directory.FilesArtifactsExpansion { - return serviceConfig.privateServiceConfig.FilesArtifactExpansion + privateServiceCfg := serviceConfig.privateServiceConfig + return privateServiceCfg.FilesArtifactExpansion } func (serviceConfig *ServiceConfig) GetPersistentDirectories() *service_directory.PersistentDirectories { diff --git a/core/server/api_container/server/api_container_service.go b/core/server/api_container/server/api_container_service.go index 1cee26b697..95a366358f 100644 --- a/core/server/api_container/server/api_container_service.go +++ b/core/server/api_container/server/api_container_service.go @@ -1120,6 +1120,7 @@ func getServiceInfoFromServiceObj(serviceObj *service.Service, serviceConfig *se minMemoryMegabytes := uint32(0) serviceDirPathsToFilesArtifactsList := map[string]*kurtosis_core_rpc_api_bindings.FilesArtifactsList{} + svcFilesArtifactsExpansions := serviceConfig.GetFilesArtifactsExpansion() logrus.Infof("GET FILES ARTIFACTS EXPANSION: %v", svcFilesArtifactsExpansions) From 54c22dec24e31b05c9c15aff311095343b4b11ac Mon Sep 17 00:00:00 2001 From: Tedi Mitiku Date: Mon, 31 Mar 2025 17:33:32 -0400 Subject: [PATCH 26/48] log in itvs --- .../backend_interface/objects/service/service_config.go | 8 ++++++++ .../interpretation_time_value_store.go | 5 +++++ 2 files changed, 13 insertions(+) diff --git a/container-engine-lib/lib/backend_interface/objects/service/service_config.go b/container-engine-lib/lib/backend_interface/objects/service/service_config.go index 266d3c7507..d976bf8509 100644 --- a/container-engine-lib/lib/backend_interface/objects/service/service_config.go +++ b/container-engine-lib/lib/backend_interface/objects/service/service_config.go @@ -10,6 +10,7 @@ import ( "github.com/kurtosis-tech/kurtosis/container-engine-lib/lib/backend_interface/objects/service_directory" "github.com/kurtosis-tech/kurtosis/container-engine-lib/lib/backend_interface/objects/service_user" "github.com/kurtosis-tech/stacktrace" + "github.com/sirupsen/logrus" v1 "k8s.io/api/core/v1" ) @@ -165,7 +166,14 @@ func (serviceConfig *ServiceConfig) GetEnvVars() map[string]string { return serviceConfig.privateServiceConfig.EnvVars } +func (serviceConfig *ServiceConfig) ExistsPrivateServiceConfig() bool { + logrus.Infof("CHECKING") + return serviceConfig.privateServiceConfig == nil +} + func (serviceConfig *ServiceConfig) GetFilesArtifactsExpansion() *service_directory.FilesArtifactsExpansion { + logrus.Infof("GETTING SERVICE CONFIG") + logrus.Infof("IS SERVICE CONFIG EMPTY: %v", serviceConfig.privateServiceConfig == nil) privateServiceCfg := serviceConfig.privateServiceConfig return privateServiceCfg.FilesArtifactExpansion } diff --git a/core/server/api_container/server/startosis_engine/interpretation_time_value_store/interpretation_time_value_store.go b/core/server/api_container/server/startosis_engine/interpretation_time_value_store/interpretation_time_value_store.go index 036801977f..1fea175569 100644 --- a/core/server/api_container/server/startosis_engine/interpretation_time_value_store/interpretation_time_value_store.go +++ b/core/server/api_container/server/startosis_engine/interpretation_time_value_store/interpretation_time_value_store.go @@ -5,6 +5,7 @@ import ( "github.com/kurtosis-tech/kurtosis/container-engine-lib/lib/database_accessors/enclave_db" "github.com/kurtosis-tech/kurtosis/core/server/api_container/server/startosis_engine/kurtosis_types" "github.com/kurtosis-tech/stacktrace" + "github.com/sirupsen/logrus" ) type InterpretationTimeValueStore struct { @@ -58,10 +59,14 @@ func (itvs *InterpretationTimeValueStore) RemoveService(name service.ServiceName } func (itvs *InterpretationTimeValueStore) PutServiceConfig(name service.ServiceName, serviceConfig *service.ServiceConfig) { + logrus.Infof("PUTTING '%v' IN INTERPRETATION TIME VALUE STORE", name) + exists := serviceConfig.ExistsPrivateServiceConfig() + logrus.Infof("IS IS TRUE: %v", exists) itvs.serviceConfigValues[name] = serviceConfig } func (itvs *InterpretationTimeValueStore) GetServiceConfig(name service.ServiceName) (*service.ServiceConfig, error) { + logrus.Infof("GETTING SERVICE CONFIG '%v'", name) serviceConfig, ok := itvs.serviceConfigValues[name] if !ok { return nil, stacktrace.NewError("Did not find new service config for '%v' in interpretation time value store.", name) From 3e92f7dac6841ca2895714d31db5950954f1f128 Mon Sep 17 00:00:00 2001 From: Tedi Mitiku Date: Mon, 31 Mar 2025 17:48:02 -0400 Subject: [PATCH 27/48] remove logs --- .../objects/service/service_config.go | 11 +---------- .../api_container/server/api_container_service.go | 13 +++++++++---- .../interpretation_time_value_store.go | 5 ----- 3 files changed, 10 insertions(+), 19 deletions(-) diff --git a/container-engine-lib/lib/backend_interface/objects/service/service_config.go b/container-engine-lib/lib/backend_interface/objects/service/service_config.go index d976bf8509..f336c6345c 100644 --- a/container-engine-lib/lib/backend_interface/objects/service/service_config.go +++ b/container-engine-lib/lib/backend_interface/objects/service/service_config.go @@ -10,7 +10,6 @@ import ( "github.com/kurtosis-tech/kurtosis/container-engine-lib/lib/backend_interface/objects/service_directory" "github.com/kurtosis-tech/kurtosis/container-engine-lib/lib/backend_interface/objects/service_user" "github.com/kurtosis-tech/stacktrace" - "github.com/sirupsen/logrus" v1 "k8s.io/api/core/v1" ) @@ -166,16 +165,8 @@ func (serviceConfig *ServiceConfig) GetEnvVars() map[string]string { return serviceConfig.privateServiceConfig.EnvVars } -func (serviceConfig *ServiceConfig) ExistsPrivateServiceConfig() bool { - logrus.Infof("CHECKING") - return serviceConfig.privateServiceConfig == nil -} - func (serviceConfig *ServiceConfig) GetFilesArtifactsExpansion() *service_directory.FilesArtifactsExpansion { - logrus.Infof("GETTING SERVICE CONFIG") - logrus.Infof("IS SERVICE CONFIG EMPTY: %v", serviceConfig.privateServiceConfig == nil) - privateServiceCfg := serviceConfig.privateServiceConfig - return privateServiceCfg.FilesArtifactExpansion + return serviceConfig.privateServiceConfig.FilesArtifactExpansion } func (serviceConfig *ServiceConfig) GetPersistentDirectories() *service_directory.PersistentDirectories { diff --git a/core/server/api_container/server/api_container_service.go b/core/server/api_container/server/api_container_service.go index 95a366358f..45fee11ff8 100644 --- a/core/server/api_container/server/api_container_service.go +++ b/core/server/api_container/server/api_container_service.go @@ -464,7 +464,8 @@ func (apicService *ApiContainerService) GetServices(ctx context.Context, args *k if err != nil { return nil, stacktrace.Propagate(err, "an error occurred while fetching all services from the backend") } - serviceInfos, err = getServiceInfosFromServiceObjs(allServices) + + serviceInfos, err = apicService.getServiceInfosFromServiceObjs(allServices) if err != nil { return nil, stacktrace.Propagate(err, "an error occurred while converting the service obj into service info") } @@ -1062,12 +1063,16 @@ func (apicService *ApiContainerService) runStarlark( } } -func getServiceInfosFromServiceObjs(services map[service.ServiceUUID]*service.Service) (map[string]*kurtosis_core_rpc_api_bindings.ServiceInfo, error) { +func (apicService *ApiContainerService) getServiceInfosFromServiceObjs(services map[service.ServiceUUID]*service.Service) (map[string]*kurtosis_core_rpc_api_bindings.ServiceInfo, error) { serviceInfos := map[string]*kurtosis_core_rpc_api_bindings.ServiceInfo{} for uuid, serviceObj := range services { - serviceInfo, err := getServiceInfoFromServiceObj(serviceObj, nil) + serviceConfig, err := apicService.interpretationTimeValueStore.GetServiceConfig(serviceObj.GetRegistration().GetName()) + if err != nil { + return nil, stacktrace.Propagate(err, "An error occurred getting service config from interpretation time value store.") + } + serviceInfo, err := getServiceInfoFromServiceObj(serviceObj, serviceConfig) if err != nil { - return nil, stacktrace.Propagate(err, "there was an error converting the service obj for service with uuid '%v' and name '%v' to service info", uuid, serviceObj.GetRegistration().GetName()) + return nil, stacktrace.Propagate(err, "There was an error converting the service obj for service with uuid '%v' and name '%v' to service info", uuid, serviceObj.GetRegistration().GetName()) } serviceInfos[serviceInfo.Name] = serviceInfo } diff --git a/core/server/api_container/server/startosis_engine/interpretation_time_value_store/interpretation_time_value_store.go b/core/server/api_container/server/startosis_engine/interpretation_time_value_store/interpretation_time_value_store.go index 1fea175569..036801977f 100644 --- a/core/server/api_container/server/startosis_engine/interpretation_time_value_store/interpretation_time_value_store.go +++ b/core/server/api_container/server/startosis_engine/interpretation_time_value_store/interpretation_time_value_store.go @@ -5,7 +5,6 @@ import ( "github.com/kurtosis-tech/kurtosis/container-engine-lib/lib/database_accessors/enclave_db" "github.com/kurtosis-tech/kurtosis/core/server/api_container/server/startosis_engine/kurtosis_types" "github.com/kurtosis-tech/stacktrace" - "github.com/sirupsen/logrus" ) type InterpretationTimeValueStore struct { @@ -59,14 +58,10 @@ func (itvs *InterpretationTimeValueStore) RemoveService(name service.ServiceName } func (itvs *InterpretationTimeValueStore) PutServiceConfig(name service.ServiceName, serviceConfig *service.ServiceConfig) { - logrus.Infof("PUTTING '%v' IN INTERPRETATION TIME VALUE STORE", name) - exists := serviceConfig.ExistsPrivateServiceConfig() - logrus.Infof("IS IS TRUE: %v", exists) itvs.serviceConfigValues[name] = serviceConfig } func (itvs *InterpretationTimeValueStore) GetServiceConfig(name service.ServiceName) (*service.ServiceConfig, error) { - logrus.Infof("GETTING SERVICE CONFIG '%v'", name) serviceConfig, ok := itvs.serviceConfigValues[name] if !ok { return nil, stacktrace.NewError("Did not find new service config for '%v' in interpretation time value store.", name) From 790a75fe457619e8a26c1e71e6f48d3c976ddaa9 Mon Sep 17 00:00:00 2001 From: Tedi Mitiku Date: Mon, 31 Mar 2025 18:24:56 -0400 Subject: [PATCH 28/48] process json service config input --- cli/cli/commands/service/add/add.go | 44 ++++++++++++++++++++++------- 1 file changed, 34 insertions(+), 10 deletions(-) diff --git a/cli/cli/commands/service/add/add.go b/cli/cli/commands/service/add/add.go index 1758d052f9..6a57ed9aad 100644 --- a/cli/cli/commands/service/add/add.go +++ b/cli/cli/commands/service/add/add.go @@ -5,6 +5,8 @@ import ( "encoding/json" "fmt" "github.com/kurtosis-tech/kurtosis/cli/cli/commands/service/service_helpers" + "io" + "os" "strings" "github.com/kurtosis-tech/kurtosis/api/golang/core/kurtosis_core_rpc_api_bindings" @@ -71,8 +73,9 @@ const ( fullUuidsFlagKey = "full-uuids" fullUuidFlagKeyDefault = "false" - JsonConfigFlagKey = "json-service-config" - JsonConfigFlagKeyDefault = "" + JsonConfigFlagKey = "json-service-config" + JsonConfigFlagKeyDefault = "" + readJsonConfigFromStdinInput = "-" portMappingSeparatorForLogs = ", " ) @@ -112,13 +115,9 @@ var ServiceAddCmd = &engine_consuming_kurtosis_command.EngineConsumingKurtosisCo Key: serviceNameArgKey, }, { - Key: service_helpers.ImageKey, - }, - { - Key: service_helpers.CmdKey, + Key: service_helpers.ImageKey, IsOptional: true, - IsGreedy: true, - DefaultValue: []string{}, + DefaultValue: "", }, }, Flags: []*flags.FlagConfig{ @@ -261,10 +260,14 @@ func run( return stacktrace.Propagate(err, "Expected a value for the '%v' flag but failed to get it", fullUuidsFlagKey) } - jsonServiceConfigStr, err := flags.GetString(JsonConfigFlagKey) + jsonServiceConfigFlagValue, err := flags.GetString(JsonConfigFlagKey) if err != nil { return stacktrace.Propagate(err, "An error occurred getting the json service config string using key '%v'.", JsonConfigFlagKey) } + jsonServiceConfigStr, err := processJsonServiceConfigFlagInput(jsonServiceConfigFlagValue) + if err != nil { + return err // already wrapped + } kurtosisCtx, err := kurtosis_context.NewKurtosisContextFromLocalEngine() if err != nil { @@ -280,7 +283,7 @@ func run( if jsonServiceConfigStr != "" { var serviceConfigJson services.ServiceConfig if err = json.Unmarshal([]byte(jsonServiceConfigStr), &serviceConfigJson); err != nil { - return stacktrace.Propagate(err, "An error occurred unmarshalling json service config string '%v'.", jsonServiceConfigStr) + return stacktrace.Propagate(err, "An error occurred unmarshalling json service config string:\n '%v'.", jsonServiceConfigStr) } serviceConfigStarlarkStr = services.GetFullServiceConfigStarlark( serviceConfigJson.Image, @@ -480,3 +483,24 @@ func generateExampleForPortFlag() string { portNumberProtocolDelimiter, ) } + +func processJsonServiceConfigFlagInput(jsonServiceConfigFlagInput string) (string, error) { + var configBytes []byte + var err error + switch { + case jsonServiceConfigFlagInput == JsonConfigFlagKeyDefault: + return JsonConfigFlagKeyDefault, nil + case jsonServiceConfigFlagInput == readJsonConfigFromStdinInput: + configBytes, err = io.ReadAll(os.Stdin) + if err != nil { + return "", stacktrace.Propagate(err, "An error occurred reading json service config from stdin.") + } + default: + configBytes, err = os.ReadFile(jsonServiceConfigFlagInput) + if err != nil { + logrus.Warnf("Received err when attempting to read service config as string: %v", err) + logrus.Warn("Attempting to read json service config input as a string instead.") + } + } + return string(configBytes), nil +} From b65f2c46b61f9e393568bdc40ba7b87f328bfe0d Mon Sep 17 00:00:00 2001 From: Tedi Mitiku Date: Mon, 31 Mar 2025 18:32:51 -0400 Subject: [PATCH 29/48] tagged switch lint --- cli/cli/commands/service/add/add.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/cli/cli/commands/service/add/add.go b/cli/cli/commands/service/add/add.go index 6a57ed9aad..ea8bf8d734 100644 --- a/cli/cli/commands/service/add/add.go +++ b/cli/cli/commands/service/add/add.go @@ -487,10 +487,10 @@ func generateExampleForPortFlag() string { func processJsonServiceConfigFlagInput(jsonServiceConfigFlagInput string) (string, error) { var configBytes []byte var err error - switch { - case jsonServiceConfigFlagInput == JsonConfigFlagKeyDefault: + switch jsonServiceConfigFlagInput { + case JsonConfigFlagKeyDefault: return JsonConfigFlagKeyDefault, nil - case jsonServiceConfigFlagInput == readJsonConfigFromStdinInput: + case readJsonConfigFromStdinInput: configBytes, err = io.ReadAll(os.Stdin) if err != nil { return "", stacktrace.Propagate(err, "An error occurred reading json service config from stdin.") From 1f61224f20191c85388f21860067539b2353a1c0 Mon Sep 17 00:00:00 2001 From: Tedi Mitiku Date: Tue, 8 Apr 2025 21:09:31 -0400 Subject: [PATCH 30/48] fixes --- .../objects/service/service_config.go | 34 ++++++++++++++++++- .../server/api_container_service.go | 7 +++- 2 files changed, 39 insertions(+), 2 deletions(-) diff --git a/container-engine-lib/lib/backend_interface/objects/service/service_config.go b/container-engine-lib/lib/backend_interface/objects/service/service_config.go index f336c6345c..9f446a1bd1 100644 --- a/container-engine-lib/lib/backend_interface/objects/service/service_config.go +++ b/container-engine-lib/lib/backend_interface/objects/service/service_config.go @@ -264,7 +264,6 @@ func (serviceConfig *ServiceConfig) GetTiniEnabled() bool { } func (serviceConfig *ServiceConfig) UnmarshalJSON(data []byte) error { - // Suppressing exhaustruct requirement because we want an object with zero values // nolint: exhaustruct unmarshalledPrivateStructPtr := &privateServiceConfig{} @@ -276,3 +275,36 @@ func (serviceConfig *ServiceConfig) UnmarshalJSON(data []byte) error { serviceConfig.privateServiceConfig = unmarshalledPrivateStructPtr return nil } + +func GetEmptyServiceConfig() *ServiceConfig { + emptyServiceConfig, _ := CreateServiceConfig( + "", + nil, + nil, + nil, + map[string]*port_spec.PortSpec{}, + map[string]*port_spec.PortSpec{}, + []string{}, + []string{}, + map[string]string{}, + &service_directory.FilesArtifactsExpansion{ + ExpanderImage: "", + ExpanderEnvVars: nil, + ServiceDirpathsToArtifactIdentifiers: nil, + ExpanderDirpathsToServiceDirpaths: nil, + }, + &service_directory.PersistentDirectories{}, + 0, + 0, + "", + 0, + 1, + map[string]string{}, + nil, + []v1.Toleration{}, + map[string]string{}, + image_download_mode.ImageDownloadMode_Always, + false, + ) + return emptyServiceConfig +} diff --git a/core/server/api_container/server/api_container_service.go b/core/server/api_container/server/api_container_service.go index 45fee11ff8..5e13a93afb 100644 --- a/core/server/api_container/server/api_container_service.go +++ b/core/server/api_container/server/api_container_service.go @@ -1066,9 +1066,14 @@ func (apicService *ApiContainerService) runStarlark( func (apicService *ApiContainerService) getServiceInfosFromServiceObjs(services map[service.ServiceUUID]*service.Service) (map[string]*kurtosis_core_rpc_api_bindings.ServiceInfo, error) { serviceInfos := map[string]*kurtosis_core_rpc_api_bindings.ServiceInfo{} for uuid, serviceObj := range services { + var serviceConfig *service.ServiceConfig serviceConfig, err := apicService.interpretationTimeValueStore.GetServiceConfig(serviceObj.GetRegistration().GetName()) if err != nil { - return nil, stacktrace.Propagate(err, "An error occurred getting service config from interpretation time value store.") + // if no service config was found, instead of failing - we just give an empty service config + // this is because the service config info in the interpretationTimeValueStore is not persisted to the enclave db yet + // so on apic restarts the information will be lost - but we still want to service information about existing services + // in the future, service config information should be persisted + serviceConfig = service.GetEmptyServiceConfig() } serviceInfo, err := getServiceInfoFromServiceObj(serviceObj, serviceConfig) if err != nil { From c676e19526ab3810299f59acdde1fd889a145156 Mon Sep 17 00:00:00 2001 From: Tedi Mitiku Date: Tue, 8 Apr 2025 21:13:14 -0400 Subject: [PATCH 31/48] use empty service config --- .../server/api_container_service.go | 20 ++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/core/server/api_container/server/api_container_service.go b/core/server/api_container/server/api_container_service.go index 5e13a93afb..c1e73cab1b 100644 --- a/core/server/api_container/server/api_container_service.go +++ b/core/server/api_container/server/api_container_service.go @@ -910,9 +910,14 @@ func (apicService *ApiContainerService) getServiceInfoForIdentifier(ctx context. return nil, stacktrace.Propagate(err, "An error occurred getting info for service '%v'", serviceIdentifier) } - serviceConfig, err := apicService.interpretationTimeValueStore.GetServiceConfig(serviceObj.GetRegistration().GetName()) + var serviceConfig *service.ServiceConfig + serviceConfig, err = apicService.interpretationTimeValueStore.GetServiceConfig(serviceObj.GetRegistration().GetName()) if err != nil { - return nil, stacktrace.Propagate(err, "An error occurred getting service config from interpretation time value store.") + // if no service config was found, instead of failing - we just give an empty service config + // this is because the service config info in the interpretationTimeValueStore is not persisted to the enclave db yet + // so on apic restarts the information will be lost - but we still want to service information about existing services + // in the future, service config information should be persisted + serviceConfig = service.GetEmptyServiceConfig() } serviceInfo, err := getServiceInfoFromServiceObj(serviceObj, serviceConfig) @@ -1124,16 +1129,13 @@ func getServiceInfoFromServiceObj(serviceObj *service.Service, serviceConfig *se EnvVars: serviceContainer.GetEnvVars(), } - maxMillicpus := uint32(0) - minMillicpus := uint32(0) - maxMemoryMegabytes := uint32(0) - minMemoryMegabytes := uint32(0) + maxMillicpus := uint32(serviceConfig.GetCPUAllocationMillicpus()) + minMillicpus := uint32(serviceConfig.GetMinCPUAllocationMillicpus()) + maxMemoryMegabytes := uint32(serviceConfig.GetMemoryAllocationMegabytes()) + minMemoryMegabytes := uint32(serviceConfig.GetMinMemoryAllocationMegabytes()) serviceDirPathsToFilesArtifactsList := map[string]*kurtosis_core_rpc_api_bindings.FilesArtifactsList{} - svcFilesArtifactsExpansions := serviceConfig.GetFilesArtifactsExpansion() - - logrus.Infof("GET FILES ARTIFACTS EXPANSION: %v", svcFilesArtifactsExpansions) if serviceConfig.GetFilesArtifactsExpansion() != nil { serviceDirPathsToFilesArtifactsList = transformServiceDirPathsToFileArtifactsToApiPortsFilesArtifactsList(serviceConfig.GetFilesArtifactsExpansion().ServiceDirpathsToArtifactIdentifiers) } From eebced35e9fce949537fd27248e11e0058409043 Mon Sep 17 00:00:00 2001 From: Tedi Mitiku Date: Wed, 9 Apr 2025 14:00:27 -0400 Subject: [PATCH 32/48] lint --- .../lib/backend_interface/objects/service/service_config.go | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/container-engine-lib/lib/backend_interface/objects/service/service_config.go b/container-engine-lib/lib/backend_interface/objects/service/service_config.go index 9f446a1bd1..4cff91373e 100644 --- a/container-engine-lib/lib/backend_interface/objects/service/service_config.go +++ b/container-engine-lib/lib/backend_interface/objects/service/service_config.go @@ -293,7 +293,9 @@ func GetEmptyServiceConfig() *ServiceConfig { ServiceDirpathsToArtifactIdentifiers: nil, ExpanderDirpathsToServiceDirpaths: nil, }, - &service_directory.PersistentDirectories{}, + &service_directory.PersistentDirectories{ + ServiceDirpathToPersistentDirectory: map[string]service_directory.PersistentDirectory{}, + }, 0, 0, "", From 662f411f768f90373e71a577dc0bf2da185aeb7f Mon Sep 17 00:00:00 2001 From: Tedi Mitiku Date: Wed, 9 Apr 2025 14:24:41 -0400 Subject: [PATCH 33/48] refactor consts --- cli/cli/commands/service/add/add.go | 114 ++++++++---------- .../service_helpers/service_helpers.go | 110 ++++++++--------- cli/cli/commands/service/update/update.go | 100 ++++++--------- 3 files changed, 141 insertions(+), 183 deletions(-) diff --git a/cli/cli/commands/service/add/add.go b/cli/cli/commands/service/add/add.go index ea8bf8d734..f18c2252e4 100644 --- a/cli/cli/commands/service/add/add.go +++ b/cli/cli/commands/service/add/add.go @@ -37,24 +37,7 @@ const ( serviceNameTitleKey = "Name" serviceUuidTitleKey = "UUID" - serviceImageArgKey = "image" - - entrypointBinaryFlagKey = "entrypoint" - - envvarsFlagKey = "env" - envvarKeyValueDelimiter = "=" - envvarDeclarationsDelimiter = "," - - portsFlagKey = "ports" - portIdSpecDelimiter = "=" - portNumberProtocolDelimiter = "/" - portDeclarationsDelimiter = "," - portApplicationProtocolDelimiter = ":" - - filesFlagKey = "files" - filesArtifactMountsDelimiter = "," - filesArtifactMountpointDelimiter = ":" - defaultLimits = 0 + defaultLimits = 0 kurtosisBackendCtxKey = "kurtosis-backend" engineClientCtxKey = "engine-client" @@ -65,11 +48,6 @@ const ( emptyApplicationProtocol = "" linkDelimiter = "://" - maybeApplicationProtocolSpecForHelp = "MAYBE_APPLICATION_PROTOCOL" - transportProtocolSpecForHelp = "TRANSPORT_PROTOCOL" - portNumberSpecForHelp = "PORT_NUMBER" - portIdSpecForHelp = "PORT_ID" - fullUuidsFlagKey = "full-uuids" fullUuidFlagKeyDefault = "false" @@ -84,16 +62,16 @@ var ( defaultTransportProtocolStr = strings.ToLower(kurtosis_core_rpc_api_bindings.Port_TCP.String()) serviceAddSpec = fmt.Sprintf( `%v%v%v%v%v`, - maybeApplicationProtocolSpecForHelp, - portApplicationProtocolDelimiter, - portNumberSpecForHelp, - portNumberProtocolDelimiter, - transportProtocolSpecForHelp, + service_helpers.MaybeApplicationProtocolSpecForHelp, + service_helpers.PortApplicationProtocolDelimiter, + service_helpers.PortNumberSpecForHelp, + service_helpers.PortNumberProtocolDelimiter, + service_helpers.TransportProtocolSpecForHelp, ) serviceAddSpecWithPortId = fmt.Sprintf( `%v%v%v`, - portIdSpecForHelp, - portIdSpecDelimiter, + service_helpers.PortIdSpecForHelp, + service_helpers.PortIdSpecDelimiter, serviceAddSpec, ) ) @@ -140,9 +118,9 @@ var ServiceAddCmd = &engine_consuming_kurtosis_command.EngineConsumingKurtosisCo Usage: fmt.Sprintf( "String containing environment variables that will be set when running the container, in "+ "the form \"KEY1%vVALUE1%vKEY2%vVALUE2\"", - envvarKeyValueDelimiter, - envvarDeclarationsDelimiter, - envvarKeyValueDelimiter, + service_helpers.EnvvarKeyValueDelimiter, + service_helpers.EnvvarDeclarationsDelimiter, + service_helpers.EnvvarKeyValueDelimiter, ), Type: flags.FlagType_String, Default: "", @@ -153,13 +131,13 @@ var ServiceAddCmd = &engine_consuming_kurtosis_command.EngineConsumingKurtosisCo ` where %q is a user friendly string for identifying the port, %q is required field, %q is an optional field which must be either`+ ` '%v' or '%v' and defaults to '%v' if omitted and %q is user defined optional value. %v`, serviceAddSpecWithPortId, - portIdSpecForHelp, - portNumberSpecForHelp, - transportProtocolSpecForHelp, + service_helpers.PortIdSpecForHelp, + service_helpers.PortNumberSpecForHelp, + service_helpers.TransportProtocolSpecForHelp, strings.ToLower(kurtosis_core_rpc_api_bindings.Port_TCP.String()), strings.ToLower(kurtosis_core_rpc_api_bindings.Port_UDP.String()), defaultTransportProtocolStr, - maybeApplicationProtocolSpecForHelp, + service_helpers.MaybeApplicationProtocolSpecForHelp, generateExampleForPortFlag(), ), Type: flags.FlagType_String, @@ -171,9 +149,9 @@ var ServiceAddCmd = &engine_consuming_kurtosis_command.EngineConsumingKurtosisCo "String containing declarations of files paths on the container -> artifact name where the contents of those "+ "files artifacts should be mounted, in the form \"MOUNTPATH1%vARTIFACTNAME1%vMOUNTPATH2%vARTIFACTNAME2\" where "+ "ARTIFACTNAME is the name returned by Kurtosis when uploading files to the enclave (e.g. via the '%v %v' command)", - filesArtifactMountpointDelimiter, - filesArtifactMountsDelimiter, - filesArtifactMountpointDelimiter, + service_helpers.FilesArtifactMountpointDelimiter, + service_helpers.FilesArtifactMountsDelimiter, + service_helpers.FilesArtifactMountpointDelimiter, command_str_consts.FilesCmdStr, command_str_consts.FilesUploadCmdStr, ), @@ -220,34 +198,34 @@ func run( return stacktrace.Propagate(err, "An error occurred getting the service name value using key '%v'", serviceNameArgKey) } - image, err := args.GetNonGreedyArg(serviceImageArgKey) + image, err := args.GetNonGreedyArg(service_helpers.ImageKey) if err != nil { - return stacktrace.Propagate(err, "An error occurred getting the service image value using key '%v'", serviceImageArgKey) + return stacktrace.Propagate(err, "An error occurred getting the service image value using key '%v'", service_helpers.ImageKey) } - //cmdArgs, err := flags.GetString(cmdArgsFlagsKey) - //if err != nil { - // return stacktrace.Propagate(err, "An error occurred getting the CMD flag using key '%v'", cmdArgsFlagsKey) - //} + entrypointStr, err := flags.GetString(service_helpers.EntrypointFlagKey) + if err != nil { + return stacktrace.Propagate(err, "An error occurred getting the ENTRYPOINT binary using key '%v'", service_helpers.EntrypointFlagKey) + } - entrypointStr, err := flags.GetString(entrypointBinaryFlagKey) + cmdStr, err := flags.GetString(service_helpers.CmdKey) if err != nil { - return stacktrace.Propagate(err, "An error occurred getting the ENTRYPOINT binary using key '%v'", entrypointBinaryFlagKey) + return stacktrace.Propagate(err, "An error occurred getting the CMD using key '%v'", service_helpers.CmdKey) } - envvarsStr, err := flags.GetString(envvarsFlagKey) + envvarsStr, err := flags.GetString(service_helpers.EnvvarsFlagKey) if err != nil { - return stacktrace.Propagate(err, "An error occurred getting the env vars string using key '%v'", envvarsFlagKey) + return stacktrace.Propagate(err, "An error occurred getting the env vars string using key '%v'", service_helpers.EnvvarsFlagKey) } - portsStr, err := flags.GetString(portsFlagKey) + portsStr, err := flags.GetString(service_helpers.PortsFlagKey) if err != nil { - return stacktrace.Propagate(err, "An error occurred getting the ports string using key '%v'", portsFlagKey) + return stacktrace.Propagate(err, "An error occurred getting the ports string using key '%v'", service_helpers.PortsFlagKey) } - filesArtifactMountsStr, err := flags.GetString(filesFlagKey) + filesArtifactMountsStr, err := flags.GetString(service_helpers.FilesFlagKey) if err != nil { - return stacktrace.Propagate(err, "An error occurred getting the files artifact mounts string using key '%v'", filesFlagKey) + return stacktrace.Propagate(err, "An error occurred getting the files artifact mounts string using key '%v'", service_helpers.FilesFlagKey) } privateIPAddressPlaceholder, err := flags.GetString(privateIPAddressPlaceholderKey) @@ -308,13 +286,17 @@ func run( if entrypointStr != "" { entrypoint = append(entrypoint, entrypointStr) } - serviceConfigStarlarkStr, err = GetServiceConfigStarlark(image, portsStr, []string{}, entrypoint, envvarsStr, filesArtifactMountsStr, defaultLimits, defaultLimits, defaultLimits, defaultLimits, privateIPAddressPlaceholder) + cmd := []string{} + if cmdStr != "" { + cmd = strings.Split(cmdStr, " ") + } + serviceConfigStarlarkStr, err = GetServiceConfigStarlark(image, portsStr, cmd, entrypoint, envvarsStr, filesArtifactMountsStr, defaultLimits, defaultLimits, defaultLimits, defaultLimits, privateIPAddressPlaceholder) if err != nil { return stacktrace.Propagate( err, - "An error occurred getting the container config to start image '%v' with CMD '%+v', ENTRYPOINT '%v', envvars '%v' and private IP address placeholder '%v'", + "An error occurred getting the container config to start image '%v' with CMD '%v', ENTRYPOINT '%v', envvars '%v' and private IP address placeholder '%v'", image, - " ", + cmdStr, entrypointStr, envvarsStr, privateIPAddressPlaceholder, @@ -472,15 +454,15 @@ func GetServiceConfigStarlark( func generateExampleForPortFlag() string { return fmt.Sprintf( `Example: "PORTID1%v1234%vudp%vPORTID2%vhttp%v5678%vPORTID3%vhttp%v6000%vudp"`, - portIdSpecDelimiter, - portNumberProtocolDelimiter, - portDeclarationsDelimiter, - portIdSpecDelimiter, - portApplicationProtocolDelimiter, - portDeclarationsDelimiter, - portIdSpecDelimiter, - portApplicationProtocolDelimiter, - portNumberProtocolDelimiter, + service_helpers.PortIdSpecDelimiter, + service_helpers.PortNumberProtocolDelimiter, + service_helpers.PortDeclarationsDelimiter, + service_helpers.PortIdSpecDelimiter, + service_helpers.PortApplicationProtocolDelimiter, + service_helpers.PortDeclarationsDelimiter, + service_helpers.PortIdSpecDelimiter, + service_helpers.PortApplicationProtocolDelimiter, + service_helpers.PortNumberProtocolDelimiter, ) } diff --git a/cli/cli/commands/service/service_helpers/service_helpers.go b/cli/cli/commands/service/service_helpers/service_helpers.go index c8b3cda0f8..772c0d7a67 100644 --- a/cli/cli/commands/service/service_helpers/service_helpers.go +++ b/cli/cli/commands/service/service_helpers/service_helpers.go @@ -21,38 +21,38 @@ const ( EntrypointFlagKey = "entrypoint" EnvvarsFlagKey = "env" - envvarKeyValueDelimiter = "=" - envvarDeclarationsDelimiter = "," + EnvvarKeyValueDelimiter = "=" + EnvvarDeclarationsDelimiter = "," PortsFlagKey = "ports" - portIdSpecDelimiter = "=" - portNumberProtocolDelimiter = "/" - portDeclarationsDelimiter = "," - portApplicationProtocolDelimiter = ":" - portNumberUintParsingBase = 10 - portNumberUintParsingBits = 16 + PortIdSpecDelimiter = "=" + PortNumberProtocolDelimiter = "/" + PortDeclarationsDelimiter = "," + PortApplicationProtocolDelimiter = ":" + PortNumberUintParsingBase = 10 + PortNumberUintParsingBits = 16 FilesFlagKey = "files" - filesArtifactMountsDelimiter = "," - filesArtifactMountpointDelimiter = ":" - multipleFilesArtifactsDelimiter = "|" + FilesArtifactMountsDelimiter = "," + FilesArtifactMountpointDelimiter = ":" + MultipleFilesArtifactsDelimiter = "|" - emptyApplicationProtocol = "" + EmptyApplicationProtocol = "" - maybeApplicationProtocolSpecForHelp = "MAYBE_APPLICATION_PROTOCOL" - transportProtocolSpecForHelp = "TRANSPORT_PROTOCOL" - portNumberSpecForHelp = "PORT_NUMBER" - portIdSpecForHelp = "PORT_ID" + MaybeApplicationProtocolSpecForHelp = "MAYBE_APPLICATION_PROTOCOL" + TransportProtocolSpecForHelp = "TRANSPORT_PROTOCOL" + PortNumberSpecForHelp = "PORT_NUMBER" + PortIdSpecForHelp = "PORT_ID" // Each envvar should be KEY1=VALUE1, which means we should have two components to each envvar declaration - expectedNumberKeyValueComponentsInEnvvarDeclaration = 2 - portNumberIndex = 0 - transportProtocolIndex = 1 - expectedPortIdSpecComponentsCount = 2 - expectedMountFragmentsCount = 2 + ExpectedNumberKeyValueComponentsInEnvvarDeclaration = 2 + PortNumberIndex = 0 + TransportProtocolIndex = 1 + ExpectedPortIdSpecComponentsCount = 2 + ExpectedMountFragmentsCount = 2 - minRemainingPortSpecComponents = 1 - maxRemainingPortSpecComponents = 2 + MinRemainingPortSpecComponents = 1 + MaxRemainingPortSpecComponents = 2 defaultPortWaitTimeoutStr = "30s" ) @@ -61,11 +61,11 @@ var ( defaultTransportProtocolStr = strings.ToLower(kurtosis_core_rpc_api_bindings.Port_TCP.String()) serviceAddSpec = fmt.Sprintf( `%v%v%v%v%v`, - maybeApplicationProtocolSpecForHelp, - portApplicationProtocolDelimiter, - portNumberSpecForHelp, - portNumberProtocolDelimiter, - transportProtocolSpecForHelp, + MaybeApplicationProtocolSpecForHelp, + PortApplicationProtocolDelimiter, + PortNumberSpecForHelp, + PortNumberProtocolDelimiter, + TransportProtocolSpecForHelp, ) ) @@ -153,15 +153,15 @@ func ParseEnvVarsStr(envvarsStr string) (map[string]string, error) { return result, nil } - allEnvvarDeclarationStrs := strings.Split(envvarsStr, envvarDeclarationsDelimiter) + allEnvvarDeclarationStrs := strings.Split(envvarsStr, EnvvarDeclarationsDelimiter) for _, envvarDeclarationStr := range allEnvvarDeclarationStrs { if len(strings.TrimSpace(envvarDeclarationStr)) == 0 { continue } - envvarKeyValueComponents := strings.SplitN(envvarDeclarationStr, envvarKeyValueDelimiter, expectedNumberKeyValueComponentsInEnvvarDeclaration) - if len(envvarKeyValueComponents) < expectedNumberKeyValueComponentsInEnvvarDeclaration { - return nil, stacktrace.NewError("Environment declaration string '%v' must be of the form KEY1%vVALUE1", envvarDeclarationStr, envvarKeyValueDelimiter) + envvarKeyValueComponents := strings.SplitN(envvarDeclarationStr, EnvvarKeyValueDelimiter, ExpectedNumberKeyValueComponentsInEnvvarDeclaration) + if len(envvarKeyValueComponents) < ExpectedNumberKeyValueComponentsInEnvvarDeclaration { + return nil, stacktrace.NewError("Environment declaration string '%v' must be of the form KEY1%vVALUE1", envvarDeclarationStr, EnvvarKeyValueDelimiter) } key := envvarKeyValueComponents[0] value := envvarKeyValueComponents[1] @@ -191,15 +191,15 @@ func ParsePortsStr(portsStr string) (map[string]*kurtosis_core_rpc_api_bindings. return result, nil } - allPortDeclarationStrs := strings.Split(portsStr, portDeclarationsDelimiter) + allPortDeclarationStrs := strings.Split(portsStr, PortDeclarationsDelimiter) for _, portDeclarationStr := range allPortDeclarationStrs { if len(strings.TrimSpace(portDeclarationStr)) == 0 { continue } - portIdSpecComponents := strings.Split(portDeclarationStr, portIdSpecDelimiter) - if len(portIdSpecComponents) != expectedPortIdSpecComponentsCount { - return nil, stacktrace.NewError("Port declaration string '%v' must be of the form PORTID%vSPEC", portDeclarationStr, portIdSpecDelimiter) + portIdSpecComponents := strings.Split(portDeclarationStr, PortIdSpecDelimiter) + if len(portIdSpecComponents) != ExpectedPortIdSpecComponentsCount { + return nil, stacktrace.NewError("Port declaration string '%v' must be of the form PORTID%vSPEC", portDeclarationStr, PortIdSpecDelimiter) } portId := portIdSpecComponents[0] specStr := portIdSpecComponents[1] @@ -235,9 +235,9 @@ func parsePortSpecStr(specStr string) (*kurtosis_core_rpc_api_bindings.Port, err return nil, stacktrace.Propagate(err, "Error occurred while parsing application protocol '%v' in port spec '%v'", maybeApplicationProtocol, specStr) } - remainingPortSpecComponents := strings.Split(remainingPortSpec, portNumberProtocolDelimiter) + remainingPortSpecComponents := strings.Split(remainingPortSpec, PortNumberProtocolDelimiter) numRemainingPortSpecComponents := len(remainingPortSpecComponents) - if numRemainingPortSpecComponents > maxRemainingPortSpecComponents { + if numRemainingPortSpecComponents > MaxRemainingPortSpecComponents { return nil, stacktrace.NewError( `Invalid port spec string, expected format is %q but got '%v'`, serviceAddSpec, @@ -245,19 +245,19 @@ func parsePortSpecStr(specStr string) (*kurtosis_core_rpc_api_bindings.Port, err ) } - portNumberUint16, err := getPortNumberFromPortSpecString(remainingPortSpecComponents[portNumberIndex]) + portNumberUint16, err := getPortNumberFromPortSpecString(remainingPortSpecComponents[PortNumberIndex]) if err != nil { - return nil, stacktrace.Propagate(err, "Error occurred while parsing port number '%v' in port spec '%v'", remainingPortSpecComponents[portNumberIndex], specStr) + return nil, stacktrace.Propagate(err, "Error occurred while parsing port number '%v' in port spec '%v'", remainingPortSpecComponents[PortNumberIndex], specStr) } transportProtocol := defaultTransportProtocolStr - if numRemainingPortSpecComponents > minRemainingPortSpecComponents { - transportProtocol = remainingPortSpecComponents[transportProtocolIndex] + if numRemainingPortSpecComponents > MinRemainingPortSpecComponents { + transportProtocol = remainingPortSpecComponents[TransportProtocolIndex] } transportProtocolFromEnum, err := getTransportProtocolFromPortSpecString(transportProtocol) if err != nil { - return nil, stacktrace.Propagate(err, "Error occurred while parsing transport protocol '%v' in port spec '%v'", remainingPortSpecComponents[transportProtocolIndex], specStr) + return nil, stacktrace.Propagate(err, "Error occurred while parsing transport protocol '%v' in port spec '%v'", remainingPortSpecComponents[TransportProtocolIndex], specStr) } return &kurtosis_core_rpc_api_bindings.Port{ Number: portNumberUint16, @@ -278,28 +278,28 @@ strings.Cut() does. // TODO: use that instead once we update go version */ func getMaybeApplicationProtocolFromPortSpecString(portProtocolStr string) (string, string, error) { - beforeDelimiter, afterDelimiter, foundDelimiter := strings.Cut(portProtocolStr, portApplicationProtocolDelimiter) + beforeDelimiter, afterDelimiter, foundDelimiter := strings.Cut(portProtocolStr, PortApplicationProtocolDelimiter) if !foundDelimiter { - return emptyApplicationProtocol, beforeDelimiter, nil + return EmptyApplicationProtocol, beforeDelimiter, nil } - if foundDelimiter && beforeDelimiter == emptyApplicationProtocol { - return emptyApplicationProtocol, "", stacktrace.NewError("optional application protocol argument cannot be empty") + if foundDelimiter && beforeDelimiter == EmptyApplicationProtocol { + return EmptyApplicationProtocol, "", stacktrace.NewError("optional application protocol argument cannot be empty") } return beforeDelimiter, afterDelimiter, nil } func getPortNumberFromPortSpecString(portNumberStr string) (uint32, error) { - portNumberUint64, err := strconv.ParseUint(portNumberStr, portNumberUintParsingBase, portNumberUintParsingBits) + portNumberUint64, err := strconv.ParseUint(portNumberStr, PortNumberUintParsingBase, PortNumberUintParsingBits) if err != nil { return 0, stacktrace.Propagate( err, "An error occurred parsing port number string '%v' with base '%v' and bits '%v'", portNumberStr, - portNumberUintParsingBase, - portNumberUintParsingBits, + PortNumberUintParsingBase, + PortNumberUintParsingBits, ) } portNumberUint32 := uint32(portNumberUint64) @@ -321,20 +321,20 @@ func ParseFilesArtifactMountsStr(filesArtifactMountsStr string) (map[string][]st } // NOTE: we might actually want to allow the same artifact being mounted in multiple places - allMountStrs := strings.Split(filesArtifactMountsStr, filesArtifactMountsDelimiter) + allMountStrs := strings.Split(filesArtifactMountsStr, FilesArtifactMountsDelimiter) for idx, mountStr := range allMountStrs { trimmedMountStr := strings.TrimSpace(mountStr) if len(trimmedMountStr) == 0 { continue } - mountFragments := strings.Split(trimmedMountStr, filesArtifactMountpointDelimiter) - if len(mountFragments) != expectedMountFragmentsCount { + mountFragments := strings.Split(trimmedMountStr, FilesArtifactMountpointDelimiter) + if len(mountFragments) != ExpectedMountFragmentsCount { return nil, stacktrace.NewError( "Files artifact mountpoint string %v was '%v' but should be in the form 'mountpoint%sfiles_artifact_name'", idx, trimmedMountStr, - filesArtifactMountpointDelimiter, + FilesArtifactMountpointDelimiter, ) } mountpoint := mountFragments[0] @@ -348,7 +348,7 @@ func ParseFilesArtifactMountsStr(filesArtifactMountsStr string) (map[string][]st ) } - result[mountpoint] = strings.Split(filesArtifactNamesStr, multipleFilesArtifactsDelimiter) + result[mountpoint] = strings.Split(filesArtifactNamesStr, MultipleFilesArtifactsDelimiter) } return result, nil diff --git a/cli/cli/commands/service/update/update.go b/cli/cli/commands/service/update/update.go index 55e5b00934..f668b406e2 100644 --- a/cli/cli/commands/service/update/update.go +++ b/cli/cli/commands/service/update/update.go @@ -31,47 +31,24 @@ const ( isServiceIdentifierArgOptional = false isServiceIdentifierArgGreedy = false - serviceImageFlagKey = "image" - cmdArgsFlagKey = "cmd" - entrypointBinaryFlagKey = "entrypoint" - - envvarsFlagKey = "env" - envvarKeyValueDelimiter = "=" - envvarDeclarationsDelimiter = "," - - portsFlagKey = "ports" - portIdSpecDelimiter = "=" - portNumberProtocolDelimiter = "/" - portDeclarationsDelimiter = "," - portApplicationProtocolDelimiter = ":" - - filesFlagKey = "files" - filesArtifactMountsDelimiter = "," - filesArtifactMountpointDelimiter = ":" - kurtosisBackendCtxKey = "kurtosis-backend" engineClientCtxKey = "engine-client" - - maybeApplicationProtocolSpecForHelp = "MAYBE_APPLICATION_PROTOCOL" - transportProtocolSpecForHelp = "TRANSPORT_PROTOCOL" - portNumberSpecForHelp = "PORT_NUMBER" - portIdSpecForHelp = "PORT_ID" ) var ( defaultTransportProtocolStr = strings.ToLower(kurtosis_core_rpc_api_bindings.Port_TCP.String()) serviceAddSpec = fmt.Sprintf( `%v%v%v%v%v`, - maybeApplicationProtocolSpecForHelp, - portApplicationProtocolDelimiter, - portNumberSpecForHelp, - portNumberProtocolDelimiter, - transportProtocolSpecForHelp, + service_helpers.MaybeApplicationProtocolSpecForHelp, + service_helpers.PortApplicationProtocolDelimiter, + service_helpers.PortNumberSpecForHelp, + service_helpers.PortNumberProtocolDelimiter, + service_helpers.TransportProtocolSpecForHelp, ) serviceAddSpecWithPortId = fmt.Sprintf( `%v%v%v`, - portIdSpecForHelp, - portIdSpecDelimiter, + service_helpers.PortIdSpecForHelp, + service_helpers.PortIdSpecDelimiter, serviceAddSpec, ) ) @@ -109,9 +86,9 @@ var ServiceUpdateCmd = &engine_consuming_kurtosis_command.EngineConsumingKurtosi Usage: fmt.Sprintf( "String containing environment variables that will be set when running the container, in "+ "the form \"KEY1%vVALUE1%vKEY2%vVALUE2\"", - envvarKeyValueDelimiter, - envvarDeclarationsDelimiter, - envvarKeyValueDelimiter, + service_helpers.EnvvarKeyValueDelimiter, + service_helpers.EnvvarDeclarationsDelimiter, + service_helpers.EnvvarKeyValueDelimiter, ), Type: flags.FlagType_String, Default: "", @@ -122,13 +99,13 @@ var ServiceUpdateCmd = &engine_consuming_kurtosis_command.EngineConsumingKurtosi ` where %q is a user friendly string for identifying the port, %q is required field, %q is an optional field which must be either`+ ` '%v' or '%v' and defaults to '%v' if omitted and %q is user defined optional value. %v`, serviceAddSpecWithPortId, - portIdSpecForHelp, - portNumberSpecForHelp, - transportProtocolSpecForHelp, + service_helpers.PortIdSpecForHelp, + service_helpers.PortNumberSpecForHelp, + service_helpers.TransportProtocolSpecForHelp, strings.ToLower(kurtosis_core_rpc_api_bindings.Port_TCP.String()), strings.ToLower(kurtosis_core_rpc_api_bindings.Port_UDP.String()), defaultTransportProtocolStr, - maybeApplicationProtocolSpecForHelp, + service_helpers.MaybeApplicationProtocolSpecForHelp, generateExampleForPortFlag(), ), Type: flags.FlagType_String, @@ -140,9 +117,9 @@ var ServiceUpdateCmd = &engine_consuming_kurtosis_command.EngineConsumingKurtosi "String containing declarations of files paths on the container -> artifact name where the contents of those "+ "files artifacts should be mounted, in the form \"MOUNTPATH1%vARTIFACTNAME1%vMOUNTPATH2%vARTIFACTNAME2\" where "+ "ARTIFACTNAME is the name returned by Kurtosis when uploading files to the enclave (e.g. via the '%v %v' command)", - filesArtifactMountpointDelimiter, - filesArtifactMountsDelimiter, - filesArtifactMountpointDelimiter, + service_helpers.FilesArtifactMountpointDelimiter, + service_helpers.FilesArtifactMountsDelimiter, + service_helpers.FilesArtifactMountpointDelimiter, command_str_consts.FilesCmdStr, command_str_consts.FilesUploadCmdStr, ), @@ -203,31 +180,31 @@ func run( var overrideCmd []string var overrideEnvVars map[string]string - imageStr, err := flags.GetString(serviceImageFlagKey) + imageStr, err := flags.GetString(service_helpers.ImageKey) if err != nil { - return stacktrace.Propagate(err, "An error occurred getting the image using key '%v'", serviceImageFlagKey) + return stacktrace.Propagate(err, "An error occurred getting the image using key '%v'", service_helpers.ImageKey) } overrideImage = imageStr - cmdStr, err := flags.GetString(cmdArgsFlagKey) + cmdStr, err := flags.GetString(service_helpers.CmdKey) if err != nil { - return stacktrace.Propagate(err, "An error occurred getting the cmd using key '%v'", cmdArgsFlagKey) + return stacktrace.Propagate(err, "An error occurred getting the cmd using key '%v'", service_helpers.CmdKey) } if cmdStr != "" { overrideCmd = []string{cmdStr} } - entrypointStr, err := flags.GetString(entrypointBinaryFlagKey) + entrypointStr, err := flags.GetString(service_helpers.EntrypointFlagKey) if err != nil { - return stacktrace.Propagate(err, "An error occurred getting the ENTRYPOINT binary using key '%v'", entrypointBinaryFlagKey) + return stacktrace.Propagate(err, "An error occurred getting the ENTRYPOINT binary using key '%v'", service_helpers.EntrypointFlagKey) } if entrypointStr != "" { overrideEntrypoint = []string{entrypointStr} } - envVarsStr, err := flags.GetString(envvarsFlagKey) + envVarsStr, err := flags.GetString(service_helpers.EnvvarsFlagKey) if err != nil { - return stacktrace.Propagate(err, "An error occurred getting the env vars string using key '%v'", envvarsFlagKey) + return stacktrace.Propagate(err, "An error occurred getting the env vars string using key '%v'", service_helpers.EnvvarsFlagKey) } if envVarsStr != "" { overrideEnvVars, err = service_helpers.ParseEnvVarsStr(envVarsStr) @@ -236,9 +213,9 @@ func run( } } - portsStr, err := flags.GetString(portsFlagKey) + portsStr, err := flags.GetString(service_helpers.PortsFlagKey) if err != nil { - return stacktrace.Propagate(err, "An error occurred getting the ports string using key '%v'", portsFlagKey) + return stacktrace.Propagate(err, "An error occurred getting the ports string using key '%v'", service_helpers.PortsFlagKey) } if portsStr != "" { overridePorts, err = service_helpers.ParsePortsStr(portsStr) @@ -247,9 +224,9 @@ func run( } } - filesArtifactMountsStr, err := flags.GetString(filesFlagKey) + filesArtifactMountsStr, err := flags.GetString(service_helpers.FilesFlagKey) if err != nil { - return stacktrace.Propagate(err, "An error occurred getting the files artifact mounts string using key '%v'", filesFlagKey) + return stacktrace.Propagate(err, "An error occurred getting the files artifact mounts string using key '%v'", service_helpers.FilesFlagKey) } if filesArtifactMountsStr != "" { overrideFilesArtifactsMountpoint, err = service_helpers.ParseFilesArtifactMountsStr(filesArtifactMountsStr) @@ -335,7 +312,6 @@ func run( currServiceConfig.TiniEnabled, currServiceConfig.PrivateIPAddressPlaceholder, ) - //logrus.Infof("SERVICE CONFIG STRING: %v", serviceConfigStr) addServiceStarlarkStr := service_helpers.GetAddServiceStarlarkScript(serviceName, serviceConfigStr) @@ -353,14 +329,14 @@ func run( func generateExampleForPortFlag() string { return fmt.Sprintf( `Example: "PORTID1%v1234%vudp%vPORTID2%vhttp%v5678%vPORTID3%vhttp%v6000%vudp"`, - portIdSpecDelimiter, - portNumberProtocolDelimiter, - portDeclarationsDelimiter, - portIdSpecDelimiter, - portApplicationProtocolDelimiter, - portDeclarationsDelimiter, - portIdSpecDelimiter, - portApplicationProtocolDelimiter, - portNumberProtocolDelimiter, + service_helpers.PortIdSpecDelimiter, + service_helpers.PortNumberProtocolDelimiter, + service_helpers.PortDeclarationsDelimiter, + service_helpers.PortIdSpecDelimiter, + service_helpers.PortApplicationProtocolDelimiter, + service_helpers.PortDeclarationsDelimiter, + service_helpers.PortIdSpecDelimiter, + service_helpers.PortApplicationProtocolDelimiter, + service_helpers.PortNumberProtocolDelimiter, ) } From cab1581ada7b706fce7cb1d2808862e89ac68d73 Mon Sep 17 00:00:00 2001 From: Tedi Mitiku Date: Wed, 9 Apr 2025 14:30:39 -0400 Subject: [PATCH 34/48] fix entrypoint and cmd str --- cli/cli/commands/service/add/add.go | 10 +++++----- .../service/service_helpers/service_helpers.go | 7 ++++--- cli/cli/commands/service/update/update.go | 4 ++-- 3 files changed, 11 insertions(+), 10 deletions(-) diff --git a/cli/cli/commands/service/add/add.go b/cli/cli/commands/service/add/add.go index f18c2252e4..71939f50a1 100644 --- a/cli/cli/commands/service/add/add.go +++ b/cli/cli/commands/service/add/add.go @@ -213,7 +213,7 @@ func run( return stacktrace.Propagate(err, "An error occurred getting the CMD using key '%v'", service_helpers.CmdKey) } - envvarsStr, err := flags.GetString(service_helpers.EnvvarsFlagKey) + envVarsStr, err := flags.GetString(service_helpers.EnvvarsFlagKey) if err != nil { return stacktrace.Propagate(err, "An error occurred getting the env vars string using key '%v'", service_helpers.EnvvarsFlagKey) } @@ -284,13 +284,13 @@ func run( } else { entrypoint := []string{} if entrypointStr != "" { - entrypoint = append(entrypoint, entrypointStr) + entrypoint = strings.Split(cmdStr, service_helpers.EntrypointAndCmdDelimiter) } cmd := []string{} if cmdStr != "" { - cmd = strings.Split(cmdStr, " ") + cmd = strings.Split(cmdStr, service_helpers.EntrypointAndCmdDelimiter) } - serviceConfigStarlarkStr, err = GetServiceConfigStarlark(image, portsStr, cmd, entrypoint, envvarsStr, filesArtifactMountsStr, defaultLimits, defaultLimits, defaultLimits, defaultLimits, privateIPAddressPlaceholder) + serviceConfigStarlarkStr, err = GetServiceConfigStarlark(image, portsStr, cmd, entrypoint, envVarsStr, filesArtifactMountsStr, defaultLimits, defaultLimits, defaultLimits, defaultLimits, privateIPAddressPlaceholder) if err != nil { return stacktrace.Propagate( err, @@ -298,7 +298,7 @@ func run( image, cmdStr, entrypointStr, - envvarsStr, + envVarsStr, privateIPAddressPlaceholder, ) } diff --git a/cli/cli/commands/service/service_helpers/service_helpers.go b/cli/cli/commands/service/service_helpers/service_helpers.go index 772c0d7a67..3efe3d44f8 100644 --- a/cli/cli/commands/service/service_helpers/service_helpers.go +++ b/cli/cli/commands/service/service_helpers/service_helpers.go @@ -16,9 +16,10 @@ import ( ) const ( - ImageKey = "image" - CmdKey = "cmd" - EntrypointFlagKey = "entrypoint" + ImageKey = "image" + CmdKey = "cmd" + EntrypointFlagKey = "entrypoint" + EntrypointAndCmdDelimiter = " " EnvvarsFlagKey = "env" EnvvarKeyValueDelimiter = "=" diff --git a/cli/cli/commands/service/update/update.go b/cli/cli/commands/service/update/update.go index f668b406e2..f82d89e141 100644 --- a/cli/cli/commands/service/update/update.go +++ b/cli/cli/commands/service/update/update.go @@ -191,7 +191,7 @@ func run( return stacktrace.Propagate(err, "An error occurred getting the cmd using key '%v'", service_helpers.CmdKey) } if cmdStr != "" { - overrideCmd = []string{cmdStr} + overrideCmd = strings.Split(cmdStr, service_helpers.EntrypointAndCmdDelimiter) } entrypointStr, err := flags.GetString(service_helpers.EntrypointFlagKey) @@ -199,7 +199,7 @@ func run( return stacktrace.Propagate(err, "An error occurred getting the ENTRYPOINT binary using key '%v'", service_helpers.EntrypointFlagKey) } if entrypointStr != "" { - overrideEntrypoint = []string{entrypointStr} + overrideEntrypoint = strings.Split(entrypointStr, service_helpers.EntrypointAndCmdDelimiter) } envVarsStr, err := flags.GetString(service_helpers.EnvvarsFlagKey) From 748f2dbd808ff81d979a28aee364c57deebb635c Mon Sep 17 00:00:00 2001 From: Tedi Mitiku Date: Wed, 9 Apr 2025 14:54:50 -0400 Subject: [PATCH 35/48] explain how to add directories --- cli/cli/commands/service/add/add.go | 18 +++++++++++------ cli/cli/commands/service/inspect/inspect.go | 20 +++++++++---------- .../service_helpers/service_helpers.go | 4 ++-- cli/cli/commands/service/update/update.go | 5 ++++- core/server/api_container/main.go | 8 +++++++- .../server/api_container_service.go | 2 +- 6 files changed, 36 insertions(+), 21 deletions(-) diff --git a/cli/cli/commands/service/add/add.go b/cli/cli/commands/service/add/add.go index 71939f50a1..f263366f03 100644 --- a/cli/cli/commands/service/add/add.go +++ b/cli/cli/commands/service/add/add.go @@ -4,6 +4,7 @@ import ( "context" "encoding/json" "fmt" + "github.com/kurtosis-tech/kurtosis/cli/cli/commands/service/inspect" "github.com/kurtosis-tech/kurtosis/cli/cli/commands/service/service_helpers" "io" "os" @@ -171,8 +172,15 @@ var ServiceAddCmd = &engine_consuming_kurtosis_command.EngineConsumingKurtosisCo Default: fullUuidFlagKeyDefault, }, { - Key: JsonConfigFlagKey, - Usage: "If a json formatted service config string is provided via this flag, service add will parse the values in the json for the service. The format is identical to the json output format from kurtosis service inspect -o json.", + Key: JsonConfigFlagKey, + Usage: fmt.Sprintf("If a json formatted service config string is provided via stdin using '%v' value for this flag, service will parse the values in the json for the service config. If The format is identical to the json output format from %v %v %v %v %v. If stdin value not provided, attempts to read from a filepath provided in the input.", + readJsonConfigFromStdinInput, + command_str_consts.KurtosisCmdStr, + command_str_consts.ServiceCmdStr, + command_str_consts.ServiceInspectCmdStr, + inspect.OutputFormatKeyShorthand, + inspect.JsonOutputFormat, + ), Type: flags.FlagType_String, Default: JsonConfigFlagKeyDefault, }, @@ -303,10 +311,8 @@ func run( ) } } - logrus.Infof("SERVICE CONFIG STARLARK: %v", serviceConfigStarlarkStr) addServiceStarlark := service_helpers.GetAddServiceStarlarkScript(serviceName, serviceConfigStarlarkStr) - logrus.Infof("ADD SERVICE STARLARK SCRIPT: %v", addServiceStarlark) _, err = service_helpers.RunAddServiceStarlarkScript(ctx, serviceName, enclaveIdentifier, addServiceStarlark, enclaveCtx) if err != nil { return err // already wrapped @@ -478,10 +484,10 @@ func processJsonServiceConfigFlagInput(jsonServiceConfigFlagInput string) (strin return "", stacktrace.Propagate(err, "An error occurred reading json service config from stdin.") } default: + logrus.Info("No json provided via stdin so attempting to read json service config input from file '%v' instead.", jsonServiceConfigFlagInput) configBytes, err = os.ReadFile(jsonServiceConfigFlagInput) if err != nil { - logrus.Warnf("Received err when attempting to read service config as string: %v", err) - logrus.Warn("Attempting to read json service config input as a string instead.") + return "", stacktrace.Propagate(err, "An error occurred err when attempting to read service config from file '%v'.", jsonServiceConfigFlagInput) } } return string(configBytes), nil diff --git a/cli/cli/commands/service/inspect/inspect.go b/cli/cli/commands/service/inspect/inspect.go index 4c7d7078fc..632fa915ec 100644 --- a/cli/cli/commands/service/inspect/inspect.go +++ b/cli/cli/commands/service/inspect/inspect.go @@ -44,10 +44,10 @@ const ( fullUuidFlagKeyDefault = "false" outputFormatKey = "output" - outputFormatKeyShorthand = "o" + OutputFormatKeyShorthand = "o" stdoutOutputFormat = "" yamlOutputFormat = "yaml" - jsonOutputFormat = "json" + JsonOutputFormat = "json" ServiceNameTitleName = "Name" ServiceUUIDTitleName = "UUID" @@ -77,7 +77,7 @@ var ServiceInspectCmd = &engine_consuming_kurtosis_command.EngineConsumingKurtos }, { Key: outputFormatKey, - Shorthand: outputFormatKeyShorthand, + Shorthand: OutputFormatKeyShorthand, Usage: "Format to output the result (yaml or json)", Type: flags.FlagType_String, Default: stdoutOutputFormat, @@ -128,8 +128,8 @@ func run( return stacktrace.Propagate(err, "Expected a value for the '%v' flag but failed to get it", outputFormatKey) } outputFormat = strings.ToLower(strings.TrimSpace(outputFormat)) - if outputFormat != "" && outputFormat != jsonOutputFormat && outputFormat != yamlOutputFormat { - return stacktrace.NewError("Invalid output format '%s'; must be '%v' or '%v'", outputFormat, jsonOutputFormat, yamlOutputFormat) + if outputFormat != "" && outputFormat != JsonOutputFormat && outputFormat != yamlOutputFormat { + return stacktrace.NewError("Invalid output format '%s'; must be '%v' or '%v'", outputFormat, JsonOutputFormat, yamlOutputFormat) } kurtosisCtx, err := kurtosis_context.NewKurtosisContextFromLocalEngine() @@ -151,18 +151,18 @@ func run( func PrintServiceInspect(userService *kurtosis_core_rpc_api_bindings.ServiceInfo, userServiceConfig *services.ServiceConfig, showFullUuid bool, outputFormat string) error { switch outputFormat { - case jsonOutputFormat: - marshaled, err := json.MarshalIndent(userServiceConfig, "", " ") + case JsonOutputFormat: + jsonServiceConfigStr, err := json.MarshalIndent(userServiceConfig, "", " ") if err != nil { return stacktrace.Propagate(err, "Failed to marshal service info to %s", outputFormat) } - out.PrintOutLn(string(marshaled)) + out.PrintOutLn(string(jsonServiceConfigStr)) case yamlOutputFormat: - marshaled, err := yaml.Marshal(userServiceConfig) + yamlServiceConfigStr, err := yaml.Marshal(userServiceConfig) if err != nil { return stacktrace.Propagate(err, "Failed to marshal service info to %s", outputFormat) } - out.PrintOutLn(string(marshaled)) + out.PrintOutLn(string(yamlServiceConfigStr)) case stdoutOutputFormat: err := printlnServiceInfo(userService, showFullUuid) if err != nil { diff --git a/cli/cli/commands/service/service_helpers/service_helpers.go b/cli/cli/commands/service/service_helpers/service_helpers.go index 3efe3d44f8..db1e62b8e2 100644 --- a/cli/cli/commands/service/service_helpers/service_helpers.go +++ b/cli/cli/commands/service/service_helpers/service_helpers.go @@ -36,7 +36,7 @@ const ( FilesFlagKey = "files" FilesArtifactMountsDelimiter = "," FilesArtifactMountpointDelimiter = ":" - MultipleFilesArtifactsDelimiter = "|" + FilesMultipleArtifactsDelimiter = "|" EmptyApplicationProtocol = "" @@ -349,7 +349,7 @@ func ParseFilesArtifactMountsStr(filesArtifactMountsStr string) (map[string][]st ) } - result[mountpoint] = strings.Split(filesArtifactNamesStr, MultipleFilesArtifactsDelimiter) + result[mountpoint] = strings.Split(filesArtifactNamesStr, FilesMultipleArtifactsDelimiter) } return result, nil diff --git a/cli/cli/commands/service/update/update.go b/cli/cli/commands/service/update/update.go index f82d89e141..e6295a8a07 100644 --- a/cli/cli/commands/service/update/update.go +++ b/cli/cli/commands/service/update/update.go @@ -116,12 +116,15 @@ var ServiceUpdateCmd = &engine_consuming_kurtosis_command.EngineConsumingKurtosi Usage: fmt.Sprintf( "String containing declarations of files paths on the container -> artifact name where the contents of those "+ "files artifacts should be mounted, in the form \"MOUNTPATH1%vARTIFACTNAME1%vMOUNTPATH2%vARTIFACTNAME2\" where "+ - "ARTIFACTNAME is the name returned by Kurtosis when uploading files to the enclave (e.g. via the '%v %v' command)", + "ARTIFACTNAME is the name returned by Kurtosis when uploading files to the enclave (e.g. via the '%v %v' command)"+ + "directories can be mounted by mounting multiple artifacts to the same mountpath, in the form, \"MOUNTPATH1%vARTIFACTNAME1%vARTIFACTNAME2\"", service_helpers.FilesArtifactMountpointDelimiter, service_helpers.FilesArtifactMountsDelimiter, service_helpers.FilesArtifactMountpointDelimiter, command_str_consts.FilesCmdStr, command_str_consts.FilesUploadCmdStr, + service_helpers.FilesArtifactMountpointDelimiter, + service_helpers.FilesMultipleArtifactsDelimiter, ), Type: flags.FlagType_String, Default: "", diff --git a/core/server/api_container/main.go b/core/server/api_container/main.go index d6a7f3cf00..0b6ad4878f 100644 --- a/core/server/api_container/main.go +++ b/core/server/api_container/main.go @@ -288,7 +288,13 @@ func createServiceNetwork( args.Version, ) - serviceNetwork, err := service_network.NewDefaultServiceNetwork(enclaveUuid, apiContainerInfo, kurtosisBackend, enclaveDataDir, enclaveDb) + serviceNetwork, err := service_network.NewDefaultServiceNetwork( + enclaveUuid, + apiContainerInfo, + kurtosisBackend, + enclaveDataDir, + enclaveDb, + ) if err != nil { return nil, stacktrace.Propagate(err, "An error occurred while creating the default service network") diff --git a/core/server/api_container/server/api_container_service.go b/core/server/api_container/server/api_container_service.go index c1e73cab1b..8e3814afb3 100644 --- a/core/server/api_container/server/api_container_service.go +++ b/core/server/api_container/server/api_container_service.go @@ -104,7 +104,7 @@ type ApiContainerService struct { githubAuthProvider *git_package_content_provider.GitHubPackageAuthProvider - // NOTE: interpretationTimeValueStore is modified by the StarlarkInterpreter - allowing this object to have access to it + // NOTE: interpretationTimeValueStore is modified by the StarlarkInterpreter - allowing APIContainer to have access to it // allows retrieving service configs of running services but it is NOT mutex protected, thus this object should never modify // the interpretationTimeValueStore or it could mess with interpretation // TODO: Either mutex protect the interpretationTimeValueStore OR compose the interpretationTimeValueStore of a separate mutex protected `serviceConfigRepository` object From ca527638cf5b0d94476f2582e3c1aab304c88224 Mon Sep 17 00:00:00 2001 From: Tedi Mitiku Date: Wed, 9 Apr 2025 14:58:32 -0400 Subject: [PATCH 36/48] more clarifications --- cli/cli/commands/service/add/add.go | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/cli/cli/commands/service/add/add.go b/cli/cli/commands/service/add/add.go index f263366f03..914f613809 100644 --- a/cli/cli/commands/service/add/add.go +++ b/cli/cli/commands/service/add/add.go @@ -149,12 +149,15 @@ var ServiceAddCmd = &engine_consuming_kurtosis_command.EngineConsumingKurtosisCo Usage: fmt.Sprintf( "String containing declarations of files paths on the container -> artifact name where the contents of those "+ "files artifacts should be mounted, in the form \"MOUNTPATH1%vARTIFACTNAME1%vMOUNTPATH2%vARTIFACTNAME2\" where "+ - "ARTIFACTNAME is the name returned by Kurtosis when uploading files to the enclave (e.g. via the '%v %v' command)", + "ARTIFACTNAME is the name returned by Kurtosis when uploading files to the enclave (e.g. via the '%v %v' command)."+ + "directories can be mounted by mounting multiple artifacts to the same mountpath, in the form, \"MOUNTPATH1%vARTIFACTNAME1%vARTIFACTNAME2\"", service_helpers.FilesArtifactMountpointDelimiter, service_helpers.FilesArtifactMountsDelimiter, service_helpers.FilesArtifactMountpointDelimiter, command_str_consts.FilesCmdStr, command_str_consts.FilesUploadCmdStr, + service_helpers.FilesArtifactMountpointDelimiter, + service_helpers.FilesMultipleArtifactsDelimiter, ), Type: flags.FlagType_String, Default: "", @@ -173,7 +176,10 @@ var ServiceAddCmd = &engine_consuming_kurtosis_command.EngineConsumingKurtosisCo }, { Key: JsonConfigFlagKey, - Usage: fmt.Sprintf("If a json formatted service config string is provided via stdin using '%v' value for this flag, service will parse the values in the json for the service config. If The format is identical to the json output format from %v %v %v %v %v. If stdin value not provided, attempts to read from a filepath provided in the input.", + Usage: fmt.Sprintf("If a json formatted service config string is provided via stdin using '%v' value for this flag,"+ + "stdin will get parsed to json and used as values for the service config."+ + "The json format should be identical to the json output format from %v %v %v %v %v."+ + "If stdin value not provided, will assume input is a filepath to a service config json and attempts to read from it.", readJsonConfigFromStdinInput, command_str_consts.KurtosisCmdStr, command_str_consts.ServiceCmdStr, From b1f155cb089a802687c8d066d043756619365f39 Mon Sep 17 00:00:00 2001 From: Tedi Mitiku Date: Wed, 9 Apr 2025 15:03:58 -0400 Subject: [PATCH 37/48] fix --- cli/cli/commands/service/add/add.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cli/cli/commands/service/add/add.go b/cli/cli/commands/service/add/add.go index 914f613809..00335c66e8 100644 --- a/cli/cli/commands/service/add/add.go +++ b/cli/cli/commands/service/add/add.go @@ -490,7 +490,7 @@ func processJsonServiceConfigFlagInput(jsonServiceConfigFlagInput string) (strin return "", stacktrace.Propagate(err, "An error occurred reading json service config from stdin.") } default: - logrus.Info("No json provided via stdin so attempting to read json service config input from file '%v' instead.", jsonServiceConfigFlagInput) + logrus.Infof("No json provided via stdin so attempting to read json service config input from file '%v' instead.", jsonServiceConfigFlagInput) configBytes, err = os.ReadFile(jsonServiceConfigFlagInput) if err != nil { return "", stacktrace.Propagate(err, "An error occurred err when attempting to read service config from file '%v'.", jsonServiceConfigFlagInput) From 59fc313264ed86ba734978ccf60f97669ac71415 Mon Sep 17 00:00:00 2001 From: Tedi Mitiku Date: Thu, 10 Apr 2025 16:50:19 -0400 Subject: [PATCH 38/48] add new events to be tracked --- .../lib/services/service_config_builder.go | 13 +++-- .../service_helpers/service_helpers.go | 2 +- cli/cli/commands/service/update/update.go | 5 +- .../golang/lib/event/event_types.go | 51 +++++++++++++++++++ .../lib/metrics_client/do_nothing_client.go | 18 +++++++ .../golang/lib/metrics_client/is_ci.go | 1 - .../lib/metrics_client/metrics_client.go | 3 ++ .../lib/metrics_client/segment_client.go | 24 +++++++++ 8 files changed, 110 insertions(+), 7 deletions(-) diff --git a/api/golang/core/lib/services/service_config_builder.go b/api/golang/core/lib/services/service_config_builder.go index 819c7d3f56..d8da684506 100644 --- a/api/golang/core/lib/services/service_config_builder.go +++ b/api/golang/core/lib/services/service_config_builder.go @@ -94,7 +94,7 @@ func GetSimpleServiceConfigStarlark( fileStrings := []string{} for filePath, artifactNames := range fileArtifactMountPoints { if len(artifactNames) > 1 { // if multiple files artifacts mounted, create a Directory - fileStrings = append(fileStrings, fmt.Sprintf(`%q: %q`, filePath, createDirectoryStarlarkStr(artifactNames))) + fileStrings = append(fileStrings, fmt.Sprintf(`%q: %s`, filePath, createDirectoryStarlarkStr(artifactNames))) } else { fileStrings = append(fileStrings, fmt.Sprintf(`%q: %q`, filePath, artifactNames[0])) } @@ -174,7 +174,7 @@ func GetFullServiceConfigStarlark( fileStrings := []string{} for filePath, artifactNames := range fileArtifactMountPoints { if len(artifactNames) > 1 { // if multiple files artifacts mounted, create a Directory - fileStrings = append(fileStrings, fmt.Sprintf(`%q: %q`, filePath, createDirectoryStarlarkStr(artifactNames))) + fileStrings = append(fileStrings, fmt.Sprintf(`%q: %s`, filePath, createDirectoryStarlarkStr(artifactNames))) } else { fileStrings = append(fileStrings, fmt.Sprintf(`%q: %q`, filePath, artifactNames[0])) } @@ -316,6 +316,9 @@ func ConvertApiFilesArtifactsToJsonFiles(serviceDirPathsToFilesArtifactsList map } func ConvertApiUserToJsonUser(user *kurtosis_core_rpc_api_bindings.User) *User { + if user == nil { + return nil + } return &User{ UID: user.GetUid(), GID: user.GetGid(), @@ -337,5 +340,9 @@ func ConvertApiTolerationsToJsonTolerations(tolerations []*kurtosis_core_rpc_api } func createDirectoryStarlarkStr(artifactNames []string) string { - return fmt.Sprintf(`Directory(artifact_names=[%s])`, strings.Join(artifactNames, ", ")) + quoted := make([]string, len(artifactNames)) + for i, name := range artifactNames { + quoted[i] = fmt.Sprintf("%q", name) // adds double quotes around each string needed for identifying artifacts + } + return fmt.Sprintf("Directory(artifact_names=[%s])", strings.Join(quoted, ", ")) } diff --git a/cli/cli/commands/service/service_helpers/service_helpers.go b/cli/cli/commands/service/service_helpers/service_helpers.go index db1e62b8e2..7fcda93b4a 100644 --- a/cli/cli/commands/service/service_helpers/service_helpers.go +++ b/cli/cli/commands/service/service_helpers/service_helpers.go @@ -107,7 +107,7 @@ func GetServiceInfo(ctx context.Context, kurtosisCtx *kurtosis_context.KurtosisC Entrypoint: service.GetContainer().GetEntrypointArgs(), Cmd: service.GetContainer().GetCmdArgs(), EnvVars: service.GetContainer().GetEnvVars(), - PrivateIPAddressPlaceholder: service.GetPrivateIpAddr(), + PrivateIPAddressPlaceholder: "", // leave empty for now MaxMillicpus: service.GetMaxMillicpus(), MinMillicpus: service.GetMinMillicpus(), MaxMemory: service.GetMaxMemoryMegabytes(), diff --git a/cli/cli/commands/service/update/update.go b/cli/cli/commands/service/update/update.go index e6295a8a07..8c384b744a 100644 --- a/cli/cli/commands/service/update/update.go +++ b/cli/cli/commands/service/update/update.go @@ -194,7 +194,7 @@ func run( return stacktrace.Propagate(err, "An error occurred getting the cmd using key '%v'", service_helpers.CmdKey) } if cmdStr != "" { - overrideCmd = strings.Split(cmdStr, service_helpers.EntrypointAndCmdDelimiter) + overrideCmd = []string{cmdStr} } entrypointStr, err := flags.GetString(service_helpers.EntrypointFlagKey) @@ -202,7 +202,7 @@ func run( return stacktrace.Propagate(err, "An error occurred getting the ENTRYPOINT binary using key '%v'", service_helpers.EntrypointFlagKey) } if entrypointStr != "" { - overrideEntrypoint = strings.Split(entrypointStr, service_helpers.EntrypointAndCmdDelimiter) + overrideEntrypoint = []string{entrypointStr} } envVarsStr, err := flags.GetString(service_helpers.EnvvarsFlagKey) @@ -317,6 +317,7 @@ func run( ) addServiceStarlarkStr := service_helpers.GetAddServiceStarlarkScript(serviceName, serviceConfigStr) + logrus.Infof("Update Service Starlark:\n%v", addServiceStarlarkStr) logrus.Infof("Running update service starlark for service '%v' in enclave '%v'...", serviceName, enclaveIdentifier) starlarkRunResult, err := service_helpers.RunAddServiceStarlarkScript(ctx, serviceName, enclaveIdentifier, addServiceStarlarkStr, enclaveCtx) diff --git a/metrics-library/golang/lib/event/event_types.go b/metrics-library/golang/lib/event/event_types.go index f5bcb44224..2367d0bdda 100644 --- a/metrics-library/golang/lib/event/event_types.go +++ b/metrics-library/golang/lib/event/event_types.go @@ -36,6 +36,9 @@ const ( stopAction = "stop" destroyAction = "destroy" runAction = "run" + updateAction = "update" + serviceStartAction = "service-start" + serviceStopAction = "service-stop" runFinishedAction = "run-finished" analyticsToggleAction = "analytics-toggle" ) @@ -110,6 +113,54 @@ func NewKurtosisRunEvent(packageId string, isRemote bool, isDryRun bool, isScrip return event } +func NewStartServiceEvent(packageId string, isRemote bool, isDryRun bool, isScript bool) *Event { + isRemotePackageStr := fmt.Sprintf("%v", isRemote) + isDryRunStr := fmt.Sprintf("%v", isDryRun) + isScriptStr := fmt.Sprintf("%v", isScript) + + properties := map[string]string{ + packageIdKey: packageId, + isRemotePackageKey: isRemotePackageStr, + isDryRunKey: isDryRunStr, + isScriptKey: isScriptStr, + } + + event := newEvent(kurtosisCategory, serviceStartAction, properties) + return event +} + +func NewStopServiceEvent(packageId string, isRemote bool, isDryRun bool, isScript bool) *Event { + isRemotePackageStr := fmt.Sprintf("%v", isRemote) + isDryRunStr := fmt.Sprintf("%v", isDryRun) + isScriptStr := fmt.Sprintf("%v", isScript) + + properties := map[string]string{ + packageIdKey: packageId, + isRemotePackageKey: isRemotePackageStr, + isDryRunKey: isDryRunStr, + isScriptKey: isScriptStr, + } + + event := newEvent(kurtosisCategory, serviceStopAction, properties) + return event +} + +func NewUpdateServiceEvent(packageId string, isRemote bool, isDryRun bool, isScript bool) *Event { + isRemotePackageStr := fmt.Sprintf("%v", isRemote) + isDryRunStr := fmt.Sprintf("%v", isDryRun) + isScriptStr := fmt.Sprintf("%v", isScript) + + properties := map[string]string{ + packageIdKey: packageId, + isRemotePackageKey: isRemotePackageStr, + isDryRunKey: isDryRunStr, + isScriptKey: isScriptStr, + } + + event := newEvent(kurtosisCategory, updateAction, properties) + return event +} + func NewKurtosisRunFinishedEvent(packageId string, numServices int, isSuccess bool) *Event { numServicesStr := fmt.Sprintf("%v", numServices) isSuccessStr := fmt.Sprintf("%v", isSuccess) diff --git a/metrics-library/golang/lib/metrics_client/do_nothing_client.go b/metrics-library/golang/lib/metrics_client/do_nothing_client.go index 4dc7c3fb20..b51ca26137 100644 --- a/metrics-library/golang/lib/metrics_client/do_nothing_client.go +++ b/metrics-library/golang/lib/metrics_client/do_nothing_client.go @@ -49,6 +49,24 @@ func (client *doNothingClient) TrackKurtosisRun(packageId string, isRemote bool, return nil } +func (client *doNothingClient) TrackServiceUpdate(packageId string, isRemote bool, isDryRun bool, isScript bool) error { + logrus.Debugf("Do-nothing metrics client TrackServiceUpdate called with arguments packageId '%v', isRemote '%v', isDryRun '%v', isScript '%v'; skipping sending event", packageId, isRemote, isDryRun, isScript) + client.callback.Success() + return nil +} + +func (client *doNothingClient) TrackStartService(packageId string, isRemote bool, isDryRun bool, isScript bool) error { + logrus.Debugf("Do-nothing metrics client TrackStartService called with arguments packageId '%v', isRemote '%v', isDryRun '%v', isScript '%v'; skipping sending event", packageId, isRemote, isDryRun, isScript) + client.callback.Success() + return nil +} + +func (client *doNothingClient) TrackStopService(packageId string, isRemote bool, isDryRun bool, isScript bool) error { + logrus.Debugf("Do-nothing metrics client TrackStopService called with arguments packageId '%v', isRemote '%v', isDryRun '%v', isScript '%v'; skipping sending event", packageId, isRemote, isDryRun, isScript) + client.callback.Success() + return nil +} + func (client *doNothingClient) TrackKurtosisRunFinishedEvent(packageId string, numberOfServices int, isSuccess bool) error { logrus.Debugf("Do-nothing metrics client TrackKurtosisRunFinishedEvent called with arguments packageId '%v', numberOfServices '%v', isSuccess '%v'; skipping sending event", packageId, numberOfServices, isSuccess) client.callback.Success() diff --git a/metrics-library/golang/lib/metrics_client/is_ci.go b/metrics-library/golang/lib/metrics_client/is_ci.go index 87eb17e889..095d1c03aa 100644 --- a/metrics-library/golang/lib/metrics_client/is_ci.go +++ b/metrics-library/golang/lib/metrics_client/is_ci.go @@ -25,7 +25,6 @@ var ciEnvironmentVariables = []string{ "TEAMCITY_VERSION", // Travis "TRAVIS", - // Platform Agnostic Variables "CI", } diff --git a/metrics-library/golang/lib/metrics_client/metrics_client.go b/metrics-library/golang/lib/metrics_client/metrics_client.go index 07b85578fc..dd69ad8fb8 100644 --- a/metrics-library/golang/lib/metrics_client/metrics_client.go +++ b/metrics-library/golang/lib/metrics_client/metrics_client.go @@ -7,6 +7,9 @@ type MetricsClient interface { TrackStopEnclave(enclaveId string) error TrackDestroyEnclave(enclaveId string) error TrackKurtosisRun(packageId string, isRemote bool, isDryRun bool, isScript bool) error + TrackServiceUpdate(packageId string, isRemote bool, isDryRun bool, isScript bool) error + TrackStartService(packageId string, isRemote bool, isDryRun bool, isScript bool) error + TrackStopService(packageId string, isRemote bool, isDryRun bool, isScript bool) error TrackKurtosisRunFinishedEvent(packageId string, numberOfServices int, isSuccess bool) error TrackKurtosisAnalyticsToggle(analyticsStatus bool) error close() (err error) diff --git a/metrics-library/golang/lib/metrics_client/segment_client.go b/metrics-library/golang/lib/metrics_client/segment_client.go index 0631c51ace..9e93d83a81 100644 --- a/metrics-library/golang/lib/metrics_client/segment_client.go +++ b/metrics-library/golang/lib/metrics_client/segment_client.go @@ -145,6 +145,30 @@ func (segment *segmentClient) TrackKurtosisRun(packageId string, isRemote bool, return nil } +func (segment *segmentClient) TrackServiceUpdate(packageId string, isRemote bool, isDryRun bool, isScript bool) error { + newEvent := event.NewUpdateServiceEvent(packageId, isRemote, isDryRun, isScript) + if err := segment.track(newEvent); err != nil { + return stacktrace.Propagate(err, "An error occurred tracking service update event") + } + return nil +} + +func (segment *segmentClient) TrackStartService(packageId string, isRemote bool, isDryRun bool, isScript bool) error { + newEvent := event.NewStartServiceEvent(packageId, isRemote, isDryRun, isScript) + if err := segment.track(newEvent); err != nil { + return stacktrace.Propagate(err, "An error occurred tracking start service event") + } + return nil +} + +func (segment *segmentClient) TrackStopService(packageId string, isRemote bool, isDryRun bool, isScript bool) error { + newEvent := event.NewStopServiceEvent(packageId, isRemote, isDryRun, isScript) + if err := segment.track(newEvent); err != nil { + return stacktrace.Propagate(err, "An error occurred tracking stop service event") + } + return nil +} + func (segment *segmentClient) TrackKurtosisRunFinishedEvent(packageId string, numberOfServices int, isSuccess bool) error { newEvent := event.NewKurtosisRunFinishedEvent(packageId, numberOfServices, isSuccess) if err := segment.track(newEvent); err != nil { From 45d42d268816c029c289d9c4ba8be926578e9fec Mon Sep 17 00:00:00 2001 From: Tedi Mitiku Date: Thu, 10 Apr 2025 17:11:30 -0400 Subject: [PATCH 39/48] change fields --- cli/cli/commands/service/update/update.go | 11 +++++++++++ metrics-library/golang/lib/event/event_types.go | 6 +++--- .../golang/lib/metrics_client/do_nothing_client.go | 12 ++++++------ .../golang/lib/metrics_client/metrics_client.go | 6 +++--- .../golang/lib/metrics_client/segment_client.go | 6 +++--- 5 files changed, 26 insertions(+), 15 deletions(-) diff --git a/cli/cli/commands/service/update/update.go b/cli/cli/commands/service/update/update.go index 8c384b744a..7e67abe28d 100644 --- a/cli/cli/commands/service/update/update.go +++ b/cli/cli/commands/service/update/update.go @@ -14,6 +14,7 @@ import ( "github.com/kurtosis-tech/kurtosis/cli/cli/command_framework/lowlevel/flags" "github.com/kurtosis-tech/kurtosis/cli/cli/command_str_consts" "github.com/kurtosis-tech/kurtosis/cli/cli/commands/service/service_helpers" + "github.com/kurtosis-tech/kurtosis/cli/cli/helpers/metrics_client_factory" "github.com/kurtosis-tech/kurtosis/cli/cli/out" "github.com/kurtosis-tech/kurtosis/container-engine-lib/lib/backend_interface" "github.com/kurtosis-tech/kurtosis/metrics-library/golang/lib/metrics_client" @@ -176,6 +177,16 @@ func run( return stacktrace.Propagate(err, "An error occurred getting an enclave context from enclave info for enclave '%v'", enclaveIdentifier) } + metricsClient, closeMetricsClientFunc, err := metrics_client_factory.GetMetricsClient() + if err != nil { + return stacktrace.Propagate(err, "An error occurred getting metrics client.") + } + err = metricsClient.TrackServiceUpdate(enclaveIdentifier, serviceName) + if err != nil { + return stacktrace.Propagate(err, "An error occurred tracking service update metric.") + } + defer closeMetricsClientFunc() + var overrideImage string var overridePorts map[string]*kurtosis_core_rpc_api_bindings.Port var overrideFilesArtifactsMountpoint map[string][]string diff --git a/metrics-library/golang/lib/event/event_types.go b/metrics-library/golang/lib/event/event_types.go index 2367d0bdda..545554d60c 100644 --- a/metrics-library/golang/lib/event/event_types.go +++ b/metrics-library/golang/lib/event/event_types.go @@ -113,7 +113,7 @@ func NewKurtosisRunEvent(packageId string, isRemote bool, isDryRun bool, isScrip return event } -func NewStartServiceEvent(packageId string, isRemote bool, isDryRun bool, isScript bool) *Event { +func NewStartServiceEvent(enclaveId string, serviceId string) *Event { isRemotePackageStr := fmt.Sprintf("%v", isRemote) isDryRunStr := fmt.Sprintf("%v", isDryRun) isScriptStr := fmt.Sprintf("%v", isScript) @@ -129,7 +129,7 @@ func NewStartServiceEvent(packageId string, isRemote bool, isDryRun bool, isScri return event } -func NewStopServiceEvent(packageId string, isRemote bool, isDryRun bool, isScript bool) *Event { +func NewStopServiceEvent(enclaveId string, serviceId string) *Event { isRemotePackageStr := fmt.Sprintf("%v", isRemote) isDryRunStr := fmt.Sprintf("%v", isDryRun) isScriptStr := fmt.Sprintf("%v", isScript) @@ -145,7 +145,7 @@ func NewStopServiceEvent(packageId string, isRemote bool, isDryRun bool, isScrip return event } -func NewUpdateServiceEvent(packageId string, isRemote bool, isDryRun bool, isScript bool) *Event { +func NewUpdateServiceEvent(enclaveId string, serviceId string) *Event { isRemotePackageStr := fmt.Sprintf("%v", isRemote) isDryRunStr := fmt.Sprintf("%v", isDryRun) isScriptStr := fmt.Sprintf("%v", isScript) diff --git a/metrics-library/golang/lib/metrics_client/do_nothing_client.go b/metrics-library/golang/lib/metrics_client/do_nothing_client.go index b51ca26137..1ec0800460 100644 --- a/metrics-library/golang/lib/metrics_client/do_nothing_client.go +++ b/metrics-library/golang/lib/metrics_client/do_nothing_client.go @@ -49,20 +49,20 @@ func (client *doNothingClient) TrackKurtosisRun(packageId string, isRemote bool, return nil } -func (client *doNothingClient) TrackServiceUpdate(packageId string, isRemote bool, isDryRun bool, isScript bool) error { - logrus.Debugf("Do-nothing metrics client TrackServiceUpdate called with arguments packageId '%v', isRemote '%v', isDryRun '%v', isScript '%v'; skipping sending event", packageId, isRemote, isDryRun, isScript) +func (client *doNothingClient) TrackServiceUpdate(enclaveId string, serviceId string) error { + logrus.Debugf("Do-nothing metrics client TrackServiceUpdate called with arguments enclaveId '%v', serviceId '%v'", enclaveId, serviceId) client.callback.Success() return nil } -func (client *doNothingClient) TrackStartService(packageId string, isRemote bool, isDryRun bool, isScript bool) error { - logrus.Debugf("Do-nothing metrics client TrackStartService called with arguments packageId '%v', isRemote '%v', isDryRun '%v', isScript '%v'; skipping sending event", packageId, isRemote, isDryRun, isScript) +func (client *doNothingClient) TrackStartService(enclaveId string, serviceId string) error { + logrus.Debugf("Do-nothing metrics client TrackStartService called with arguments enclaveId '%v', serviceId '%v'", enclaveId, serviceId) client.callback.Success() return nil } -func (client *doNothingClient) TrackStopService(packageId string, isRemote bool, isDryRun bool, isScript bool) error { - logrus.Debugf("Do-nothing metrics client TrackStopService called with arguments packageId '%v', isRemote '%v', isDryRun '%v', isScript '%v'; skipping sending event", packageId, isRemote, isDryRun, isScript) +func (client *doNothingClient) TrackStopService(enclaveId string, serviceId string) error { + logrus.Debugf("Do-nothing metrics client TrackStopService called with arguments enclaveId '%v', serviceId '%v'", enclaveId, serviceId) client.callback.Success() return nil } diff --git a/metrics-library/golang/lib/metrics_client/metrics_client.go b/metrics-library/golang/lib/metrics_client/metrics_client.go index dd69ad8fb8..ec3be04d29 100644 --- a/metrics-library/golang/lib/metrics_client/metrics_client.go +++ b/metrics-library/golang/lib/metrics_client/metrics_client.go @@ -7,9 +7,9 @@ type MetricsClient interface { TrackStopEnclave(enclaveId string) error TrackDestroyEnclave(enclaveId string) error TrackKurtosisRun(packageId string, isRemote bool, isDryRun bool, isScript bool) error - TrackServiceUpdate(packageId string, isRemote bool, isDryRun bool, isScript bool) error - TrackStartService(packageId string, isRemote bool, isDryRun bool, isScript bool) error - TrackStopService(packageId string, isRemote bool, isDryRun bool, isScript bool) error + TrackServiceUpdate(enclaveId string, serviceId string) error + TrackStartService(enclaveId string, serviceId string) error + TrackStopService(enclaveId string, serviceId string) error TrackKurtosisRunFinishedEvent(packageId string, numberOfServices int, isSuccess bool) error TrackKurtosisAnalyticsToggle(analyticsStatus bool) error close() (err error) diff --git a/metrics-library/golang/lib/metrics_client/segment_client.go b/metrics-library/golang/lib/metrics_client/segment_client.go index 9e93d83a81..8318eb1b7a 100644 --- a/metrics-library/golang/lib/metrics_client/segment_client.go +++ b/metrics-library/golang/lib/metrics_client/segment_client.go @@ -145,7 +145,7 @@ func (segment *segmentClient) TrackKurtosisRun(packageId string, isRemote bool, return nil } -func (segment *segmentClient) TrackServiceUpdate(packageId string, isRemote bool, isDryRun bool, isScript bool) error { +func (segment *segmentClient) TrackServiceUpdate(enclaveId string, serviceId string) error { newEvent := event.NewUpdateServiceEvent(packageId, isRemote, isDryRun, isScript) if err := segment.track(newEvent); err != nil { return stacktrace.Propagate(err, "An error occurred tracking service update event") @@ -153,7 +153,7 @@ func (segment *segmentClient) TrackServiceUpdate(packageId string, isRemote bool return nil } -func (segment *segmentClient) TrackStartService(packageId string, isRemote bool, isDryRun bool, isScript bool) error { +func (segment *segmentClient) TrackStartService(enclaveId string, serviceId string) error { newEvent := event.NewStartServiceEvent(packageId, isRemote, isDryRun, isScript) if err := segment.track(newEvent); err != nil { return stacktrace.Propagate(err, "An error occurred tracking start service event") @@ -161,7 +161,7 @@ func (segment *segmentClient) TrackStartService(packageId string, isRemote bool, return nil } -func (segment *segmentClient) TrackStopService(packageId string, isRemote bool, isDryRun bool, isScript bool) error { +func (segment *segmentClient) TrackStopService(enclaveId string, serviceId string) error { newEvent := event.NewStopServiceEvent(packageId, isRemote, isDryRun, isScript) if err := segment.track(newEvent); err != nil { return stacktrace.Propagate(err, "An error occurred tracking stop service event") From 8e146f67e8597c6facc2a98d6f8ca1fa47bc4705 Mon Sep 17 00:00:00 2001 From: Tedi Mitiku Date: Thu, 10 Apr 2025 19:10:11 -0400 Subject: [PATCH 40/48] track metrics --- cli/cli/commands/service/start/start.go | 13 ++++++++ cli/cli/commands/service/stop/stop.go | 12 +++++++ cli/cli/commands/service/update/update.go | 3 +- .../golang/lib/event/event_types.go | 31 +++++-------------- .../lib/metrics_client/segment_client.go | 6 ++-- 5 files changed, 37 insertions(+), 28 deletions(-) diff --git a/cli/cli/commands/service/start/start.go b/cli/cli/commands/service/start/start.go index 73206466f3..a667be2aa8 100644 --- a/cli/cli/commands/service/start/start.go +++ b/cli/cli/commands/service/start/start.go @@ -4,6 +4,7 @@ import ( "context" "fmt" "github.com/kurtosis-tech/kurtosis/api/golang/core/lib/starlark_run_config" + "github.com/kurtosis-tech/kurtosis/cli/cli/helpers/metrics_client_factory" "github.com/sirupsen/logrus" "github.com/kurtosis-tech/kurtosis/api/golang/core/lib/enclaves" @@ -91,6 +92,12 @@ func run( return stacktrace.Propagate(err, "An error occurred getting an enclave context from enclave info for enclave '%v'", enclaveIdentifier) } + metricsClient, closeMetricsClientFunc, err := metrics_client_factory.GetMetricsClient() + if err != nil { + return stacktrace.Propagate(err, "An error occurred getting metrics client.") + } + defer closeMetricsClientFunc() + for _, serviceIdentifier := range serviceIdentifiers { logrus.Infof("Starting service '%v'", serviceIdentifier) serviceContext, err := enclaveCtx.GetServiceContext(serviceIdentifier) @@ -100,9 +107,15 @@ func run( serviceName := serviceContext.GetServiceName() + err = metricsClient.TrackStartService(enclaveIdentifier, string(serviceName)) + if err != nil { + return stacktrace.Propagate(err, "An error occurred tracking service update metric.") + } + if err := startServiceStarlarkCommand(ctx, enclaveCtx, serviceName); err != nil { return stacktrace.Propagate(err, "An error occurred starting service '%v' from enclave '%v'", serviceIdentifier, enclaveIdentifier) } + } return nil } diff --git a/cli/cli/commands/service/stop/stop.go b/cli/cli/commands/service/stop/stop.go index 4c69b8e17e..d6accfe025 100644 --- a/cli/cli/commands/service/stop/stop.go +++ b/cli/cli/commands/service/stop/stop.go @@ -10,6 +10,7 @@ import ( "github.com/kurtosis-tech/kurtosis/cli/cli/command_framework/lowlevel/args" "github.com/kurtosis-tech/kurtosis/cli/cli/command_framework/lowlevel/flags" "github.com/kurtosis-tech/kurtosis/cli/cli/command_str_consts" + "github.com/kurtosis-tech/kurtosis/cli/cli/helpers/metrics_client_factory" "github.com/kurtosis-tech/kurtosis/cli/cli/helpers/shared_starlark_calls" "github.com/kurtosis-tech/kurtosis/container-engine-lib/lib/backend_interface" "github.com/kurtosis-tech/kurtosis/metrics-library/golang/lib/metrics_client" @@ -82,6 +83,12 @@ func run( return stacktrace.Propagate(err, "An error occurred getting an enclave context from enclave info for enclave '%v'", enclaveIdentifier) } + metricsClient, closeMetricsClientFunc, err := metrics_client_factory.GetMetricsClient() + if err != nil { + return stacktrace.Propagate(err, "An error occurred getting metrics client.") + } + defer closeMetricsClientFunc() + for _, serviceIdentifier := range serviceIdentifiers { logrus.Infof("Stopping service '%v'", serviceIdentifier) serviceContext, err := enclaveCtx.GetServiceContext(serviceIdentifier) @@ -91,6 +98,11 @@ func run( serviceName := serviceContext.GetServiceName() + err = metricsClient.TrackStopService(enclaveIdentifier, string(serviceName)) + if err != nil { + return stacktrace.Propagate(err, "An error occurred tracking service update metric.") + } + if err := shared_starlark_calls.StopServiceStarlarkCommand(ctx, enclaveCtx, serviceName); err != nil { return stacktrace.Propagate(err, "An error occurred stopping service '%v' from enclave '%v'", serviceIdentifier, enclaveIdentifier) } diff --git a/cli/cli/commands/service/update/update.go b/cli/cli/commands/service/update/update.go index 7e67abe28d..a82a3adfed 100644 --- a/cli/cli/commands/service/update/update.go +++ b/cli/cli/commands/service/update/update.go @@ -181,11 +181,12 @@ func run( if err != nil { return stacktrace.Propagate(err, "An error occurred getting metrics client.") } + defer closeMetricsClientFunc() + err = metricsClient.TrackServiceUpdate(enclaveIdentifier, serviceName) if err != nil { return stacktrace.Propagate(err, "An error occurred tracking service update metric.") } - defer closeMetricsClientFunc() var overrideImage string var overridePorts map[string]*kurtosis_core_rpc_api_bindings.Port diff --git a/metrics-library/golang/lib/event/event_types.go b/metrics-library/golang/lib/event/event_types.go index 545554d60c..80e144896f 100644 --- a/metrics-library/golang/lib/event/event_types.go +++ b/metrics-library/golang/lib/event/event_types.go @@ -10,6 +10,7 @@ const ( // We are following these naming conventions for event's data // https://segment.com/docs/getting-started/04-full-install/#event-naming-best-practices enclaveIDPropertyKey = "enclave_id" + serviceIDPropertyKey = "service_id" didUserAcceptSendingMetricsKey = "did_user_accept_sending_metrics" packageIdKey = "package_id" isRemotePackageKey = "is_remote_package" @@ -114,15 +115,9 @@ func NewKurtosisRunEvent(packageId string, isRemote bool, isDryRun bool, isScrip } func NewStartServiceEvent(enclaveId string, serviceId string) *Event { - isRemotePackageStr := fmt.Sprintf("%v", isRemote) - isDryRunStr := fmt.Sprintf("%v", isDryRun) - isScriptStr := fmt.Sprintf("%v", isScript) - properties := map[string]string{ - packageIdKey: packageId, - isRemotePackageKey: isRemotePackageStr, - isDryRunKey: isDryRunStr, - isScriptKey: isScriptStr, + enclaveIDPropertyKey: enclaveId, + serviceIDPropertyKey: serviceId, } event := newEvent(kurtosisCategory, serviceStartAction, properties) @@ -130,15 +125,9 @@ func NewStartServiceEvent(enclaveId string, serviceId string) *Event { } func NewStopServiceEvent(enclaveId string, serviceId string) *Event { - isRemotePackageStr := fmt.Sprintf("%v", isRemote) - isDryRunStr := fmt.Sprintf("%v", isDryRun) - isScriptStr := fmt.Sprintf("%v", isScript) - properties := map[string]string{ - packageIdKey: packageId, - isRemotePackageKey: isRemotePackageStr, - isDryRunKey: isDryRunStr, - isScriptKey: isScriptStr, + enclaveIDPropertyKey: enclaveId, + serviceIDPropertyKey: serviceId, } event := newEvent(kurtosisCategory, serviceStopAction, properties) @@ -146,15 +135,9 @@ func NewStopServiceEvent(enclaveId string, serviceId string) *Event { } func NewUpdateServiceEvent(enclaveId string, serviceId string) *Event { - isRemotePackageStr := fmt.Sprintf("%v", isRemote) - isDryRunStr := fmt.Sprintf("%v", isDryRun) - isScriptStr := fmt.Sprintf("%v", isScript) - properties := map[string]string{ - packageIdKey: packageId, - isRemotePackageKey: isRemotePackageStr, - isDryRunKey: isDryRunStr, - isScriptKey: isScriptStr, + enclaveIDPropertyKey: enclaveId, + serviceIDPropertyKey: serviceId, } event := newEvent(kurtosisCategory, updateAction, properties) diff --git a/metrics-library/golang/lib/metrics_client/segment_client.go b/metrics-library/golang/lib/metrics_client/segment_client.go index 8318eb1b7a..ca85ff83c8 100644 --- a/metrics-library/golang/lib/metrics_client/segment_client.go +++ b/metrics-library/golang/lib/metrics_client/segment_client.go @@ -146,7 +146,7 @@ func (segment *segmentClient) TrackKurtosisRun(packageId string, isRemote bool, } func (segment *segmentClient) TrackServiceUpdate(enclaveId string, serviceId string) error { - newEvent := event.NewUpdateServiceEvent(packageId, isRemote, isDryRun, isScript) + newEvent := event.NewUpdateServiceEvent(enclaveId, serviceId) if err := segment.track(newEvent); err != nil { return stacktrace.Propagate(err, "An error occurred tracking service update event") } @@ -154,7 +154,7 @@ func (segment *segmentClient) TrackServiceUpdate(enclaveId string, serviceId str } func (segment *segmentClient) TrackStartService(enclaveId string, serviceId string) error { - newEvent := event.NewStartServiceEvent(packageId, isRemote, isDryRun, isScript) + newEvent := event.NewStartServiceEvent(enclaveId, serviceId) if err := segment.track(newEvent); err != nil { return stacktrace.Propagate(err, "An error occurred tracking start service event") } @@ -162,7 +162,7 @@ func (segment *segmentClient) TrackStartService(enclaveId string, serviceId stri } func (segment *segmentClient) TrackStopService(enclaveId string, serviceId string) error { - newEvent := event.NewStopServiceEvent(packageId, isRemote, isDryRun, isScript) + newEvent := event.NewStopServiceEvent(enclaveId, serviceId) if err := segment.track(newEvent); err != nil { return stacktrace.Propagate(err, "An error occurred tracking stop service event") } From c4a7a615f38485183701cec0277589cb272a7de4 Mon Sep 17 00:00:00 2001 From: Tedi Mitiku Date: Fri, 11 Apr 2025 16:31:43 -0400 Subject: [PATCH 41/48] refactor --- cli/cli/commands/service/update/update.go | 265 +++++++++++------- .../objects/service/service_config.go | 2 +- 2 files changed, 165 insertions(+), 102 deletions(-) diff --git a/cli/cli/commands/service/update/update.go b/cli/cli/commands/service/update/update.go index e6295a8a07..2403252ee6 100644 --- a/cli/cli/commands/service/update/update.go +++ b/cli/cli/commands/service/update/update.go @@ -176,144 +176,69 @@ func run( return stacktrace.Propagate(err, "An error occurred getting an enclave context from enclave info for enclave '%v'", enclaveIdentifier) } - var overrideImage string - var overridePorts map[string]*kurtosis_core_rpc_api_bindings.Port - var overrideFilesArtifactsMountpoint map[string][]string - var overrideEntrypoint []string - var overrideCmd []string - var overrideEnvVars map[string]string - imageStr, err := flags.GetString(service_helpers.ImageKey) if err != nil { return stacktrace.Propagate(err, "An error occurred getting the image using key '%v'", service_helpers.ImageKey) } - overrideImage = imageStr cmdStr, err := flags.GetString(service_helpers.CmdKey) if err != nil { return stacktrace.Propagate(err, "An error occurred getting the cmd using key '%v'", service_helpers.CmdKey) } - if cmdStr != "" { - overrideCmd = strings.Split(cmdStr, service_helpers.EntrypointAndCmdDelimiter) - } entrypointStr, err := flags.GetString(service_helpers.EntrypointFlagKey) if err != nil { return stacktrace.Propagate(err, "An error occurred getting the ENTRYPOINT binary using key '%v'", service_helpers.EntrypointFlagKey) } - if entrypointStr != "" { - overrideEntrypoint = strings.Split(entrypointStr, service_helpers.EntrypointAndCmdDelimiter) - } envVarsStr, err := flags.GetString(service_helpers.EnvvarsFlagKey) if err != nil { return stacktrace.Propagate(err, "An error occurred getting the env vars string using key '%v'", service_helpers.EnvvarsFlagKey) } - if envVarsStr != "" { - overrideEnvVars, err = service_helpers.ParseEnvVarsStr(envVarsStr) - if err != nil { - return stacktrace.Propagate(err, "An error occurred parsing env vars string: %v", envVarsStr) - } - } portsStr, err := flags.GetString(service_helpers.PortsFlagKey) if err != nil { return stacktrace.Propagate(err, "An error occurred getting the ports string using key '%v'", service_helpers.PortsFlagKey) } - if portsStr != "" { - overridePorts, err = service_helpers.ParsePortsStr(portsStr) - if err != nil { - return stacktrace.Propagate(err, "An error occurred parsing ports string: %v", portsStr) - } - } filesArtifactMountsStr, err := flags.GetString(service_helpers.FilesFlagKey) if err != nil { return stacktrace.Propagate(err, "An error occurred getting the files artifact mounts string using key '%v'", service_helpers.FilesFlagKey) } - if filesArtifactMountsStr != "" { - overrideFilesArtifactsMountpoint, err = service_helpers.ParseFilesArtifactMountsStr(filesArtifactMountsStr) - if err != nil { - return stacktrace.Propagate(err, "An error occurred parsing files artifacts mount points string: %v", filesArtifactMountsStr) - } - } + + overridesServiceConfig, err := parseOverridesServiceConfigFromFlags( + imageStr, + entrypointStr, + cmdStr, + filesArtifactMountsStr, + envVarsStr, + portsStr) _, currServiceConfig, err := service_helpers.GetServiceInfo(ctx, kurtosisCtx, enclaveIdentifier, serviceName) if err != nil { return stacktrace.Propagate(err, "An error occurred getting service info of service '%v' in enclave '%v'.", serviceName, enclaveIdentifier) } - // merge overrides with existing service config - // if override image was provided, use that as the image, otherwise keep curr - var mergedImage string - if overrideImage != "" { - mergedImage = overrideImage - } else { - mergedImage = currServiceConfig.Image - } - - // if override entrypoint was provided, use that as the entrypoint, otherwise keep curr - var mergedEntrypoint []string - if len(overrideEntrypoint) > 0 { - mergedEntrypoint = overrideEntrypoint - } else { - mergedEntrypoint = currServiceConfig.Entrypoint - } - - // if override cmd was provided, use that as the cmd, otherwise keep curr - var mergedCmd []string - if len(overrideCmd) > 0 { - mergedCmd = overrideCmd - } else { - mergedCmd = currServiceConfig.Cmd - } - - // combine current ports with override ports - mergedPorts := map[string]*kurtosis_core_rpc_api_bindings.Port{} - currApiPorts := services.ConvertJsonPortToApiPort(currServiceConfig.PrivatePorts) - for portId, port := range currApiPorts { - mergedPorts[portId] = port - } - for portId, port := range overridePorts { - mergedPorts[portId] = port - } - - // combine current env vars with override env vars - mergedEnvVarsMap := map[string]string{} - for key, val := range currServiceConfig.EnvVars { - mergedEnvVarsMap[key] = val - } - for key, val := range overrideEnvVars { - mergedEnvVarsMap[key] = val - } - - // combine current files artifacts mount points with override mount points - mergedFilesArtifactsMountpoint := map[string][]string{} - for key, val := range currServiceConfig.Files { - mergedFilesArtifactsMountpoint[key] = val - } - for key, val := range overrideFilesArtifactsMountpoint { - mergedFilesArtifactsMountpoint[key] = val - } + updatedServiceConfig := createUpdatedServiceConfigFromOverrides(overridesServiceConfig, currServiceConfig) // call getServiceConfig serviceConfigStr := services.GetFullServiceConfigStarlark( - mergedImage, - mergedPorts, - mergedFilesArtifactsMountpoint, - mergedEntrypoint, - mergedCmd, - mergedEnvVarsMap, - currServiceConfig.MaxMillicpus, - currServiceConfig.MaxMemory, - currServiceConfig.MinMillicpus, - currServiceConfig.MinMemory, - currServiceConfig.User, - currServiceConfig.Tolerations, - currServiceConfig.NodeSelectors, - currServiceConfig.Labels, - currServiceConfig.TiniEnabled, - currServiceConfig.PrivateIPAddressPlaceholder, + updatedServiceConfig.Image, + services.ConvertJsonPortToApiPort(updatedServiceConfig.PrivatePorts), + updatedServiceConfig.Files, + updatedServiceConfig.Entrypoint, + updatedServiceConfig.Cmd, + updatedServiceConfig.EnvVars, + updatedServiceConfig.MaxMillicpus, + updatedServiceConfig.MaxMemory, + updatedServiceConfig.MinMillicpus, + updatedServiceConfig.MinMemory, + updatedServiceConfig.User, + updatedServiceConfig.Tolerations, + updatedServiceConfig.NodeSelectors, + updatedServiceConfig.Labels, + updatedServiceConfig.TiniEnabled, + updatedServiceConfig.PrivateIPAddressPlaceholder, ) addServiceStarlarkStr := service_helpers.GetAddServiceStarlarkScript(serviceName, serviceConfigStr) @@ -325,7 +250,6 @@ func run( } out.PrintOutLn(string(starlarkRunResult.RunOutput)) - return nil } @@ -343,3 +267,142 @@ func generateExampleForPortFlag() string { service_helpers.PortNumberProtocolDelimiter, ) } + +func parseOverridesServiceConfigFromFlags( + image string, + entrypoint string, + cmd string, + filesArtifactsMount string, + envVars string, + ports string) (*services.ServiceConfig, error) { + var err error + overrideImage := image + + var overrideCmd []string + if cmd != "" { + overrideCmd = []string{cmd} + } + + var overrideEntrypoint []string + if entrypoint != "" { + overrideEntrypoint = []string{entrypoint} + } + + var overrideEnvVars map[string]string + if envVars != "" { + overrideEnvVars, err = service_helpers.ParseEnvVarsStr(envVars) + if err != nil { + return nil, stacktrace.Propagate(err, "An error occurred parsing env vars string: %v", envVars) + } + } + + var overridePorts map[string]*kurtosis_core_rpc_api_bindings.Port + if ports != "" { + overridePorts, err = service_helpers.ParsePortsStr(ports) + if err != nil { + return nil, stacktrace.Propagate(err, "An error occurred parsing ports string: %v", ports) + } + } + + var overrideFilesArtifactsMountpoint map[string][]string + if filesArtifactsMount != "" { + overrideFilesArtifactsMountpoint, err = service_helpers.ParseFilesArtifactMountsStr(filesArtifactsMount) + if err != nil { + return nil, stacktrace.Propagate(err, "An error occurred parsing files artifacts mount points string: %v", filesArtifactsMount) + } + } + + return &services.ServiceConfig{ + Image: overrideImage, + PrivatePorts: services.ConvertApiPortToJsonPort(overridePorts), + PublicPorts: nil, + Files: overrideFilesArtifactsMountpoint, + Entrypoint: overrideEntrypoint, + Cmd: overrideCmd, + EnvVars: overrideEnvVars, + PrivateIPAddressPlaceholder: "", + MaxMillicpus: 0, + MinMillicpus: 0, + MaxMemory: 0, + MinMemory: 0, + User: nil, + Tolerations: nil, + Labels: nil, + NodeSelectors: nil, + TiniEnabled: nil, + }, nil +} + +func createUpdatedServiceConfigFromOverrides(overridesServiceConfig, currServiceConfig *services.ServiceConfig) *services.ServiceConfig { + // merge overrides with existing service config + // if override image was provided, use that as the image, otherwise keep curr + var updatedImage string + if overridesServiceConfig.Image != "" { + updatedImage = overridesServiceConfig.Image + } else { + updatedImage = currServiceConfig.Image + } + + // if override entrypoint was provided, use that as the entrypoint, otherwise keep curr + var updatedEntrypoint []string + if len(overridesServiceConfig.Entrypoint) > 0 { + updatedEntrypoint = overridesServiceConfig.Entrypoint + } else { + updatedEntrypoint = currServiceConfig.Entrypoint + } + + // if override cmd was provided, use that as the cmd, otherwise keep curr + var updatedCmd []string + if len(overridesServiceConfig.Cmd) > 0 { + updatedCmd = overridesServiceConfig.Cmd + } else { + updatedCmd = currServiceConfig.Cmd + } + + // combine current ports with override ports + updatedPorts := map[string]services.Port{} + for portId, port := range currServiceConfig.PrivatePorts { + updatedPorts[portId] = port + } + for portId, port := range overridesServiceConfig.PrivatePorts { + updatedPorts[portId] = port + } + + // combine current env vars with override env vars + updatedEnvVarsMap := map[string]string{} + for key, val := range currServiceConfig.EnvVars { + updatedEnvVarsMap[key] = val + } + for key, val := range overridesServiceConfig.EnvVars { + updatedEnvVarsMap[key] = val + } + + // combine current files artifacts mount points with override mount points + updatedFilesArtifactsMountpoint := map[string][]string{} + for key, val := range currServiceConfig.Files { + updatedFilesArtifactsMountpoint[key] = val + } + for key, val := range overridesServiceConfig.Files { + updatedFilesArtifactsMountpoint[key] = val + } + + return &services.ServiceConfig{ + Image: updatedImage, + PrivatePorts: updatedPorts, + PublicPorts: nil, + Files: updatedFilesArtifactsMountpoint, + Entrypoint: updatedEntrypoint, + Cmd: updatedCmd, + EnvVars: updatedEnvVarsMap, + PrivateIPAddressPlaceholder: "", + MaxMillicpus: 0, + MinMillicpus: 0, + MaxMemory: 0, + MinMemory: 0, + User: nil, + Tolerations: nil, + Labels: nil, + NodeSelectors: nil, + TiniEnabled: nil, + } +} diff --git a/container-engine-lib/lib/backend_interface/objects/service/service_config.go b/container-engine-lib/lib/backend_interface/objects/service/service_config.go index 4cff91373e..eb79d9ff08 100644 --- a/container-engine-lib/lib/backend_interface/objects/service/service_config.go +++ b/container-engine-lib/lib/backend_interface/objects/service/service_config.go @@ -300,7 +300,7 @@ func GetEmptyServiceConfig() *ServiceConfig { 0, "", 0, - 1, + 0, map[string]string{}, nil, []v1.Toleration{}, From acebc73e7e26b2a089fb738fe5d57e80cf0e428b Mon Sep 17 00:00:00 2001 From: Tedi Mitiku Date: Fri, 11 Apr 2025 16:48:22 -0400 Subject: [PATCH 42/48] add unit tests --- cli/cli/commands/service/update/update.go | 1 - .../commands/service/update/update_test.go | 192 ++++++++++++++++++ 2 files changed, 192 insertions(+), 1 deletion(-) create mode 100644 cli/cli/commands/service/update/update_test.go diff --git a/cli/cli/commands/service/update/update.go b/cli/cli/commands/service/update/update.go index 2403252ee6..11311664d9 100644 --- a/cli/cli/commands/service/update/update.go +++ b/cli/cli/commands/service/update/update.go @@ -334,7 +334,6 @@ func parseOverridesServiceConfigFromFlags( } func createUpdatedServiceConfigFromOverrides(overridesServiceConfig, currServiceConfig *services.ServiceConfig) *services.ServiceConfig { - // merge overrides with existing service config // if override image was provided, use that as the image, otherwise keep curr var updatedImage string if overridesServiceConfig.Image != "" { diff --git a/cli/cli/commands/service/update/update_test.go b/cli/cli/commands/service/update/update_test.go new file mode 100644 index 0000000000..9bd2c3092d --- /dev/null +++ b/cli/cli/commands/service/update/update_test.go @@ -0,0 +1,192 @@ +package update + +import ( + "testing" + + "github.com/kurtosis-tech/kurtosis/api/golang/core/lib/services" + "github.com/stretchr/testify/require" +) + +func TestCreateUpdatedServiceConfigFromOverrides(t *testing.T) { + testCases := []struct { + name string + currConfig *services.ServiceConfig + overrideConfig *services.ServiceConfig + expectedUpdatedConfig *services.ServiceConfig + }{ + { + name: "override image, entrypoint, cmd, env vars, ports, and files", + currConfig: &services.ServiceConfig{ + Image: "old-image", + PrivatePorts: map[string]services.Port{"port1": {Number: 8080}}, + Files: map[string][]string{"/mnt/data": {"artifactA"}}, + Entrypoint: []string{"old-entry"}, + Cmd: []string{"old-cmd"}, + EnvVars: map[string]string{"FOO": "old"}, + PublicPorts: nil, + PrivateIPAddressPlaceholder: "", + MaxMillicpus: 0, + MinMillicpus: 0, + MaxMemory: 0, + MinMemory: 0, + User: nil, + Tolerations: nil, + Labels: nil, + NodeSelectors: nil, + TiniEnabled: nil, + }, + overrideConfig: &services.ServiceConfig{ + Image: "new-image", + Entrypoint: []string{"new-entry"}, + Cmd: []string{"new-cmd"}, + PrivatePorts: map[string]services.Port{"port2": {Number: 9090}}, + Files: map[string][]string{"/mnt/config": {"artifactB"}}, + EnvVars: map[string]string{"FOO": "new", "BAR": "added"}, + PublicPorts: nil, + PrivateIPAddressPlaceholder: "", + MaxMillicpus: 0, + MinMillicpus: 0, + MaxMemory: 0, + MinMemory: 0, + User: nil, + Tolerations: nil, + Labels: nil, + NodeSelectors: nil, + TiniEnabled: nil, + }, + expectedUpdatedConfig: &services.ServiceConfig{ + Image: "new-image", + Entrypoint: []string{"new-entry"}, + Cmd: []string{"new-cmd"}, + PrivatePorts: map[string]services.Port{"port1": {Number: 8080}, "port2": {Number: 9090}}, + Files: map[string][]string{"/mnt/data": {"artifactA"}, "/mnt/config": {"artifactB"}}, + EnvVars: map[string]string{"FOO": "new", "BAR": "added"}, + PublicPorts: nil, + PrivateIPAddressPlaceholder: "", + MaxMillicpus: 0, + MinMillicpus: 0, + MaxMemory: 0, + MinMemory: 0, + User: nil, + Tolerations: nil, + Labels: nil, + NodeSelectors: nil, + TiniEnabled: nil, + }, + }, + { + name: "no overrides applied", + currConfig: &services.ServiceConfig{ + Image: "base-image", + Entrypoint: []string{"entry"}, + Cmd: []string{"cmd"}, + PrivatePorts: map[string]services.Port{"http": {Number: 80}}, + Files: map[string][]string{"/data": {"foo"}}, + EnvVars: map[string]string{"KEY": "VAL"}, + PublicPorts: nil, + PrivateIPAddressPlaceholder: "", + MaxMillicpus: 0, + MinMillicpus: 0, + MaxMemory: 0, + MinMemory: 0, + User: nil, + Tolerations: nil, + Labels: nil, + NodeSelectors: nil, + TiniEnabled: nil, + }, + overrideConfig: &services.ServiceConfig{}, + expectedUpdatedConfig: &services.ServiceConfig{ + Image: "base-image", + Entrypoint: []string{"entry"}, + Cmd: []string{"cmd"}, + PrivatePorts: map[string]services.Port{"http": {Number: 80}}, + Files: map[string][]string{"/data": {"foo"}}, + EnvVars: map[string]string{"KEY": "VAL"}, + PublicPorts: nil, + PrivateIPAddressPlaceholder: "", + MaxMillicpus: 0, + MinMillicpus: 0, + MaxMemory: 0, + MinMemory: 0, + User: nil, + Tolerations: nil, + Labels: nil, + NodeSelectors: nil, + TiniEnabled: nil, + }, + }, + { + name: "override overwrites duplicate env var and port", + currConfig: &services.ServiceConfig{ + Image: "original", + PrivatePorts: map[string]services.Port{"p": {Number: 1000}}, + EnvVars: map[string]string{"K1": "V1"}, + Files: map[string][]string{}, + PublicPorts: nil, + Entrypoint: nil, + Cmd: nil, + PrivateIPAddressPlaceholder: "", + MaxMillicpus: 0, + MinMillicpus: 0, + MaxMemory: 0, + MinMemory: 0, + User: nil, + Tolerations: nil, + Labels: nil, + NodeSelectors: nil, + TiniEnabled: nil, + }, + overrideConfig: &services.ServiceConfig{ + Image: "", + PrivatePorts: map[string]services.Port{"p": {Number: 2000}}, + EnvVars: map[string]string{"K1": "override"}, + Files: map[string][]string{}, + PublicPorts: nil, + Entrypoint: nil, + Cmd: nil, + PrivateIPAddressPlaceholder: "", + MaxMillicpus: 0, + MinMillicpus: 0, + MaxMemory: 0, + MinMemory: 0, + User: nil, + Tolerations: nil, + Labels: nil, + NodeSelectors: nil, + TiniEnabled: nil, + }, + expectedUpdatedConfig: &services.ServiceConfig{ + Image: "original", + PrivatePorts: map[string]services.Port{"p": {Number: 2000}}, + EnvVars: map[string]string{"K1": "override"}, + Files: map[string][]string{}, + PublicPorts: nil, + Entrypoint: nil, + Cmd: nil, + PrivateIPAddressPlaceholder: "", + MaxMillicpus: 0, + MinMillicpus: 0, + MaxMemory: 0, + MinMemory: 0, + User: nil, + Tolerations: nil, + Labels: nil, + NodeSelectors: nil, + TiniEnabled: nil, + }, + }, + } + + for _, tc := range testCases { + t.Run(tc.name, func(t *testing.T) { + updated := createUpdatedServiceConfigFromOverrides(tc.overrideConfig, tc.currConfig) + require.Equal(t, tc.expectedUpdatedConfig.Image, updated.Image) + require.Equal(t, tc.expectedUpdatedConfig.Entrypoint, updated.Entrypoint) + require.Equal(t, tc.expectedUpdatedConfig.Cmd, updated.Cmd) + require.Equal(t, tc.expectedUpdatedConfig.EnvVars, updated.EnvVars) + require.Equal(t, tc.expectedUpdatedConfig.PrivatePorts, updated.PrivatePorts) + require.Equal(t, tc.expectedUpdatedConfig.Files, updated.Files) + }) + } +} From b1d1ad437ae57ab96c55e0a893630b02351ef2ac Mon Sep 17 00:00:00 2001 From: Tedi Mitiku Date: Fri, 11 Apr 2025 17:09:38 -0400 Subject: [PATCH 43/48] add ci test --- .circleci/config.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.circleci/config.yml b/.circleci/config.yml index aa7aba6629..5102828457 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -881,6 +881,9 @@ jobs: - run: "${KURTOSIS_BINPATH} files storeservice test-enclave test1 /usr/local/apache2/conf/httpd.conf --name stored-file" - run: "${KURTOSIS_BINPATH} files download test-enclave stored-file ." + # Service update + - run: "${KURTOSIS_BINPATH} service update test-enclave test1 --image httpd:2.4.63 --env-var update=test;where=ci --ports http=90 --cmd httpd-background --files /root/somewhere:rendered-file|stored-file" + # Check Dump Contains files - run: "${KURTOSIS_BINPATH} enclave dump test-enclave test-dump" - run: "ls test-dump/files/rendered-file" From cd0797632e719baf8373f68fb2fb15d9cb38e42c Mon Sep 17 00:00:00 2001 From: Tedi Mitiku Date: Fri, 11 Apr 2025 17:23:34 -0400 Subject: [PATCH 44/48] add ci test --- .circleci/config.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 5102828457..04e99a73b5 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -882,7 +882,7 @@ jobs: - run: "${KURTOSIS_BINPATH} files download test-enclave stored-file ." # Service update - - run: "${KURTOSIS_BINPATH} service update test-enclave test1 --image httpd:2.4.63 --env-var update=test;where=ci --ports http=90 --cmd httpd-background --files /root/somewhere:rendered-file|stored-file" + - run: "${KURTOSIS_BINPATH} service update test-enclave test1 --image httpd:2.4.63 --env-var update=test;where=ci --ports http=90 --files /root/somewhere:rendered-file|stored-file" # Check Dump Contains files - run: "${KURTOSIS_BINPATH} enclave dump test-enclave test-dump" From 3e2ba8199da0f96bcbf1c2f75aa8a5730d522e72 Mon Sep 17 00:00:00 2001 From: Tedi Mitiku Date: Fri, 11 Apr 2025 17:24:32 -0400 Subject: [PATCH 45/48] fix directory creation --- api/golang/core/lib/services/service_config_builder.go | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/api/golang/core/lib/services/service_config_builder.go b/api/golang/core/lib/services/service_config_builder.go index 819c7d3f56..73dbac6187 100644 --- a/api/golang/core/lib/services/service_config_builder.go +++ b/api/golang/core/lib/services/service_config_builder.go @@ -94,7 +94,7 @@ func GetSimpleServiceConfigStarlark( fileStrings := []string{} for filePath, artifactNames := range fileArtifactMountPoints { if len(artifactNames) > 1 { // if multiple files artifacts mounted, create a Directory - fileStrings = append(fileStrings, fmt.Sprintf(`%q: %q`, filePath, createDirectoryStarlarkStr(artifactNames))) + fileStrings = append(fileStrings, fmt.Sprintf(`%q: %s`, filePath, createDirectoryStarlarkStr(artifactNames))) } else { fileStrings = append(fileStrings, fmt.Sprintf(`%q: %q`, filePath, artifactNames[0])) } @@ -174,7 +174,7 @@ func GetFullServiceConfigStarlark( fileStrings := []string{} for filePath, artifactNames := range fileArtifactMountPoints { if len(artifactNames) > 1 { // if multiple files artifacts mounted, create a Directory - fileStrings = append(fileStrings, fmt.Sprintf(`%q: %q`, filePath, createDirectoryStarlarkStr(artifactNames))) + fileStrings = append(fileStrings, fmt.Sprintf(`%q: %s`, filePath, createDirectoryStarlarkStr(artifactNames))) } else { fileStrings = append(fileStrings, fmt.Sprintf(`%q: %q`, filePath, artifactNames[0])) } @@ -337,5 +337,9 @@ func ConvertApiTolerationsToJsonTolerations(tolerations []*kurtosis_core_rpc_api } func createDirectoryStarlarkStr(artifactNames []string) string { - return fmt.Sprintf(`Directory(artifact_names=[%s])`, strings.Join(artifactNames, ", ")) + quoted := make([]string, len(artifactNames)) + for i, name := range artifactNames { + quoted[i] = fmt.Sprintf("%q", name) // adds double quotes around each string + } + return fmt.Sprintf("Directory(artifact_names=[%s])", strings.Join(quoted, ", ")) } From 2a9b20bac1ea84a7004da5abed009e16b1fdc47d Mon Sep 17 00:00:00 2001 From: Tedi Mitiku Date: Fri, 11 Apr 2025 17:44:49 -0400 Subject: [PATCH 46/48] fix directory creation --- .circleci/config.yml | 2 +- api/golang/core/lib/services/service_config_builder.go | 4 ++-- cli/cli/commands/service/service_helpers/service_helpers.go | 2 ++ 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 04e99a73b5..c45fb984d8 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -882,7 +882,7 @@ jobs: - run: "${KURTOSIS_BINPATH} files download test-enclave stored-file ." # Service update - - run: "${KURTOSIS_BINPATH} service update test-enclave test1 --image httpd:2.4.63 --env-var update=test;where=ci --ports http=90 --files /root/somewhere:rendered-file|stored-file" + - run: "${KURTOSIS_BINPATH} service update test-enclave test1 --image httpd:2.4.63 --env 'update=test;where=ci' --ports http=80 --files '/root/somewhere:rendered-file|stored-file'" # Check Dump Contains files - run: "${KURTOSIS_BINPATH} enclave dump test-enclave test-dump" diff --git a/api/golang/core/lib/services/service_config_builder.go b/api/golang/core/lib/services/service_config_builder.go index 73dbac6187..1500712dd5 100644 --- a/api/golang/core/lib/services/service_config_builder.go +++ b/api/golang/core/lib/services/service_config_builder.go @@ -269,8 +269,8 @@ func GetFullServiceConfigStarlark( } // Tini - if *tiniEnabled { - starlarkFields = append(starlarkFields, fmt.Sprintf(`tini_enabled=%s`, tiniEnabledStr)) + if tiniEnabled != nil && !*tiniEnabled { + starlarkFields = append(starlarkFields, `tini_enabled=False`) } return fmt.Sprintf("ServiceConfig(%s)", strings.Join(starlarkFields, ", ")) diff --git a/cli/cli/commands/service/service_helpers/service_helpers.go b/cli/cli/commands/service/service_helpers/service_helpers.go index db1e62b8e2..7dec6ea676 100644 --- a/cli/cli/commands/service/service_helpers/service_helpers.go +++ b/cli/cli/commands/service/service_helpers/service_helpers.go @@ -11,6 +11,7 @@ import ( "github.com/kurtosis-tech/kurtosis/api/golang/engine/lib/kurtosis_context" "github.com/kurtosis-tech/kurtosis/cli/cli/helpers/user_services" "github.com/kurtosis-tech/stacktrace" + "github.com/sirupsen/logrus" "strconv" "strings" ) @@ -129,6 +130,7 @@ func GetAddServiceStarlarkScript(serviceName string, serviceConfigStarlark strin } func RunAddServiceStarlarkScript(ctx context.Context, serviceName, enclaveIdentifier, starlarkScript string, enclaveCtx *enclaves.EnclaveContext) (*enclaves.StarlarkRunResult, error) { + logrus.Infof("ADD SERVICE STARLARK:\n%v", starlarkScript) starlarkRunResult, err := enclaveCtx.RunStarlarkScriptBlocking(ctx, starlarkScript, starlark_run_config.NewRunStarlarkConfig()) if err != nil { return nil, stacktrace.Propagate(err, "An error has occurred when running Starlark to add service") From e934101f4541abdbb0eb9d231df704fb21474de2 Mon Sep 17 00:00:00 2001 From: Tedi Mitiku Date: Fri, 11 Apr 2025 17:54:28 -0400 Subject: [PATCH 47/48] lint --- .../lib/services/service_config_builder.go | 4 - cli/cli/commands/service/update/update.go | 13 +- .../commands/service/update/update_test.go | 128 ++++++++++++++---- 3 files changed, 115 insertions(+), 30 deletions(-) diff --git a/api/golang/core/lib/services/service_config_builder.go b/api/golang/core/lib/services/service_config_builder.go index 1500712dd5..f46de5dd85 100644 --- a/api/golang/core/lib/services/service_config_builder.go +++ b/api/golang/core/lib/services/service_config_builder.go @@ -6,10 +6,6 @@ import ( "strings" ) -const ( - tiniEnabledStr = "True" -) - type FilesArtifactUUID string type FileArtifactName string diff --git a/cli/cli/commands/service/update/update.go b/cli/cli/commands/service/update/update.go index 11311664d9..af500cdb03 100644 --- a/cli/cli/commands/service/update/update.go +++ b/cli/cli/commands/service/update/update.go @@ -212,7 +212,18 @@ func run( cmdStr, filesArtifactMountsStr, envVarsStr, - portsStr) + portsStr, + ) + if err != nil { + return stacktrace.Propagate(err, "An error occurred parsing overrides service config from flags image '%v', entrypoint '%v', cmd '%v', files artifacts mount '%v', env vars '%v', and ports '%v'.", + imageStr, + entrypointStr, + cmdStr, + filesArtifactMountsStr, + envVarsStr, + portsStr, + ) + } _, currServiceConfig, err := service_helpers.GetServiceInfo(ctx, kurtosisCtx, enclaveIdentifier, serviceName) if err != nil { diff --git a/cli/cli/commands/service/update/update_test.go b/cli/cli/commands/service/update/update_test.go index 9bd2c3092d..ade6387d61 100644 --- a/cli/cli/commands/service/update/update_test.go +++ b/cli/cli/commands/service/update/update_test.go @@ -17,8 +17,14 @@ func TestCreateUpdatedServiceConfigFromOverrides(t *testing.T) { { name: "override image, entrypoint, cmd, env vars, ports, and files", currConfig: &services.ServiceConfig{ - Image: "old-image", - PrivatePorts: map[string]services.Port{"port1": {Number: 8080}}, + Image: "old-image", + PrivatePorts: map[string]services.Port{ + "port1": { + Number: 8080, + Transport: 0, + MaybeApplicationProtocol: "", + Wait: "", + }}, Files: map[string][]string{"/mnt/data": {"artifactA"}}, Entrypoint: []string{"old-entry"}, Cmd: []string{"old-cmd"}, @@ -36,10 +42,17 @@ func TestCreateUpdatedServiceConfigFromOverrides(t *testing.T) { TiniEnabled: nil, }, overrideConfig: &services.ServiceConfig{ - Image: "new-image", - Entrypoint: []string{"new-entry"}, - Cmd: []string{"new-cmd"}, - PrivatePorts: map[string]services.Port{"port2": {Number: 9090}}, + Image: "new-image", + Entrypoint: []string{"new-entry"}, + Cmd: []string{"new-cmd"}, + PrivatePorts: map[string]services.Port{ + "port2": { + Number: 9090, + Transport: 0, + MaybeApplicationProtocol: "", + Wait: "", + }, + }, Files: map[string][]string{"/mnt/config": {"artifactB"}}, EnvVars: map[string]string{"FOO": "new", "BAR": "added"}, PublicPorts: nil, @@ -55,10 +68,23 @@ func TestCreateUpdatedServiceConfigFromOverrides(t *testing.T) { TiniEnabled: nil, }, expectedUpdatedConfig: &services.ServiceConfig{ - Image: "new-image", - Entrypoint: []string{"new-entry"}, - Cmd: []string{"new-cmd"}, - PrivatePorts: map[string]services.Port{"port1": {Number: 8080}, "port2": {Number: 9090}}, + Image: "new-image", + Entrypoint: []string{"new-entry"}, + Cmd: []string{"new-cmd"}, + PrivatePorts: map[string]services.Port{ + "port1": { + Number: 8080, + Transport: 0, + MaybeApplicationProtocol: "", + Wait: "", + }, + "port2": { + Number: 9090, + Transport: 0, + MaybeApplicationProtocol: "", + Wait: "", + }, + }, Files: map[string][]string{"/mnt/data": {"artifactA"}, "/mnt/config": {"artifactB"}}, EnvVars: map[string]string{"FOO": "new", "BAR": "added"}, PublicPorts: nil, @@ -77,10 +103,17 @@ func TestCreateUpdatedServiceConfigFromOverrides(t *testing.T) { { name: "no overrides applied", currConfig: &services.ServiceConfig{ - Image: "base-image", - Entrypoint: []string{"entry"}, - Cmd: []string{"cmd"}, - PrivatePorts: map[string]services.Port{"http": {Number: 80}}, + Image: "base-image", + Entrypoint: []string{"entry"}, + Cmd: []string{"cmd"}, + PrivatePorts: map[string]services.Port{ + "http": { + Number: 80, + Transport: 0, + MaybeApplicationProtocol: "", + Wait: "", + }, + }, Files: map[string][]string{"/data": {"foo"}}, EnvVars: map[string]string{"KEY": "VAL"}, PublicPorts: nil, @@ -95,12 +128,36 @@ func TestCreateUpdatedServiceConfigFromOverrides(t *testing.T) { NodeSelectors: nil, TiniEnabled: nil, }, - overrideConfig: &services.ServiceConfig{}, + overrideConfig: &services.ServiceConfig{ + Image: "", + PrivatePorts: nil, + PublicPorts: nil, + Files: nil, + Entrypoint: nil, + Cmd: nil, + EnvVars: nil, + PrivateIPAddressPlaceholder: "", + MaxMillicpus: 0, + MinMillicpus: 0, + MaxMemory: 0, + MinMemory: 0, + User: nil, + Tolerations: nil, + Labels: nil, + NodeSelectors: nil, + TiniEnabled: nil, + }, expectedUpdatedConfig: &services.ServiceConfig{ - Image: "base-image", - Entrypoint: []string{"entry"}, - Cmd: []string{"cmd"}, - PrivatePorts: map[string]services.Port{"http": {Number: 80}}, + Image: "base-image", + Entrypoint: []string{"entry"}, + Cmd: []string{"cmd"}, + PrivatePorts: map[string]services.Port{ + "http": { + Number: 80, + Transport: 0, + MaybeApplicationProtocol: "", + Wait: "", + }}, Files: map[string][]string{"/data": {"foo"}}, EnvVars: map[string]string{"KEY": "VAL"}, PublicPorts: nil, @@ -119,8 +176,15 @@ func TestCreateUpdatedServiceConfigFromOverrides(t *testing.T) { { name: "override overwrites duplicate env var and port", currConfig: &services.ServiceConfig{ - Image: "original", - PrivatePorts: map[string]services.Port{"p": {Number: 1000}}, + Image: "original", + PrivatePorts: map[string]services.Port{ + "p": { + Number: 1000, + Transport: 0, + MaybeApplicationProtocol: "", + Wait: "", + }, + }, EnvVars: map[string]string{"K1": "V1"}, Files: map[string][]string{}, PublicPorts: nil, @@ -138,8 +202,15 @@ func TestCreateUpdatedServiceConfigFromOverrides(t *testing.T) { TiniEnabled: nil, }, overrideConfig: &services.ServiceConfig{ - Image: "", - PrivatePorts: map[string]services.Port{"p": {Number: 2000}}, + Image: "", + PrivatePorts: map[string]services.Port{ + "p": { + Number: 2000, + Transport: 0, + MaybeApplicationProtocol: "", + Wait: "", + }, + }, EnvVars: map[string]string{"K1": "override"}, Files: map[string][]string{}, PublicPorts: nil, @@ -157,8 +228,15 @@ func TestCreateUpdatedServiceConfigFromOverrides(t *testing.T) { TiniEnabled: nil, }, expectedUpdatedConfig: &services.ServiceConfig{ - Image: "original", - PrivatePorts: map[string]services.Port{"p": {Number: 2000}}, + Image: "original", + PrivatePorts: map[string]services.Port{ + "p": { + Number: 2000, + Transport: 0, + MaybeApplicationProtocol: "", + Wait: "", + }, + }, EnvVars: map[string]string{"K1": "override"}, Files: map[string][]string{}, PublicPorts: nil, From 8f3036cefb837ce29c0859dbe8672c797c6eea4f Mon Sep 17 00:00:00 2001 From: Tedi Mitiku Date: Wed, 16 Apr 2025 15:10:42 -0400 Subject: [PATCH 48/48] lint --- cli/cli/commands/service/start/start.go | 6 +++++- cli/cli/commands/service/stop/stop.go | 6 +++++- cli/cli/commands/service/update/update.go | 6 +++++- 3 files changed, 15 insertions(+), 3 deletions(-) diff --git a/cli/cli/commands/service/start/start.go b/cli/cli/commands/service/start/start.go index a667be2aa8..f32571492a 100644 --- a/cli/cli/commands/service/start/start.go +++ b/cli/cli/commands/service/start/start.go @@ -96,7 +96,11 @@ func run( if err != nil { return stacktrace.Propagate(err, "An error occurred getting metrics client.") } - defer closeMetricsClientFunc() + defer func() { + if err = closeMetricsClientFunc(); err != nil { + logrus.Warnf("An error occurred closing metrics client:\n%v", closeMetricsClientFunc()) + } + }() for _, serviceIdentifier := range serviceIdentifiers { logrus.Infof("Starting service '%v'", serviceIdentifier) diff --git a/cli/cli/commands/service/stop/stop.go b/cli/cli/commands/service/stop/stop.go index d6accfe025..f784290141 100644 --- a/cli/cli/commands/service/stop/stop.go +++ b/cli/cli/commands/service/stop/stop.go @@ -87,7 +87,11 @@ func run( if err != nil { return stacktrace.Propagate(err, "An error occurred getting metrics client.") } - defer closeMetricsClientFunc() + defer func() { + if err = closeMetricsClientFunc(); err != nil { + logrus.Warnf("An error occurred closing metrics client:\n%v", closeMetricsClientFunc()) + } + }() for _, serviceIdentifier := range serviceIdentifiers { logrus.Infof("Stopping service '%v'", serviceIdentifier) diff --git a/cli/cli/commands/service/update/update.go b/cli/cli/commands/service/update/update.go index 3cc201efcc..98611577c4 100644 --- a/cli/cli/commands/service/update/update.go +++ b/cli/cli/commands/service/update/update.go @@ -180,7 +180,11 @@ func run( if err != nil { return stacktrace.Propagate(err, "An error occurred getting metrics client.") } - defer closeMetricsClientFunc() + defer func() { + if err = closeMetricsClientFunc(); err != nil { + logrus.Warnf("An error occurred closing metrics client:\n%v", closeMetricsClientFunc()) + } + }() err = metricsClient.TrackServiceUpdate(enclaveIdentifier, serviceName) if err != nil {