diff --git a/controller/BUILD.bazel b/controller/BUILD.bazel index 581ba3b4..803b7da4 100644 --- a/controller/BUILD.bazel +++ b/controller/BUILD.bazel @@ -16,7 +16,9 @@ go_library( deps = [ "//config", "//core/common", + "//core/errors", "//core/storage", + "//internal/mapper", "//orchestrator", "//tangopb", "@com_github_uber_go_tally//:tally", @@ -48,6 +50,7 @@ go_test( "@com_github_stretchr_testify//require", "@com_github_uber_go_tally//:tally", "@org_uber_go_mock//gomock", + "@org_uber_go_yarpc//yarpcerrors", "@org_uber_go_zap//:zap", "@org_uber_go_zap//zaptest", ], diff --git a/controller/errors.go b/controller/errors.go index 7a0d0691..e135b3b4 100644 --- a/controller/errors.go +++ b/controller/errors.go @@ -15,44 +15,23 @@ package controller import ( - "context" - "errors" - "github.com/uber-go/tally" - "github.com/uber/tango/core/common" -) - -// failure_reason tag values for errors that originate in the controller itself. -// Errors from the orchestrator carry their own reason via common.ClassifiedError. -// Shared reasons live in core/common as common.FailureReason*. -const ( - // Reading a cached target graph from storage failed. - failureReasonGraphFetch = "graph_fetch" - // Streaming a response message back to the client failed. - failureReasonSend = "send" - // Diffing two target graphs failed. - failureReasonCompare = "compare" - // Reading a stored treehash from storage failed (not a cache miss). - failureReasonTreehashRead = "treehash_read" + tangoerrors "github.com/uber/tango/core/errors" ) -// emitFailureMetric tags the failure counter with the reason and type from the -// error's ClassifiedError. Context errors are recognised explicitly; everything -// else falls back to unknown/infra. +// emitFailureMetric tags the failure counter with the error code and failure +// source extracted from the error's TangoError classification. func emitFailureMetric(scope tally.Scope, err error) { - var ce common.ClassifiedError - switch { - case errors.As(err, &ce): - // already classified — use the error's own reason and type - case errors.Is(err, context.Canceled): - ce = common.WithReason(common.FailureReasonCancelled, common.ErrorTypeUser, err) - case errors.Is(err, context.DeadlineExceeded): - ce = common.WithReason(common.FailureReasonDeadlineExceeded, common.ErrorTypeUser, err) - default: - ce = common.WithReason(common.FailureReasonUnknown, common.ErrorTypeInfra, err) - } scope.Tagged(map[string]string{ - "failure_type": ce.Type(), - "failure_reason": ce.Reason(), + "error_code": tangoerrors.GetErrorCode(err).String(), + "failure_source": tangoerrors.GetFailureSource(err).String(), }).Counter("failure_type").Inc(1) } + +func newControllerInfraError(err error) error { + return tangoerrors.NewInfra(tangoerrors.FailureSourceController, err) +} + +func newControllerUserError(err error) error { + return tangoerrors.NewUser(tangoerrors.FailureSourceController, err) +} diff --git a/controller/getchangedtargets.go b/controller/getchangedtargets.go index a6123ab3..253f7169 100644 --- a/controller/getchangedtargets.go +++ b/controller/getchangedtargets.go @@ -23,6 +23,7 @@ import ( "github.com/uber/tango/core/common" "github.com/uber/tango/core/storage" + "github.com/uber/tango/internal/mapper" pb "github.com/uber/tango/tangopb" "go.uber.org/zap" ) @@ -47,12 +48,13 @@ func (c *controller) GetChangedTargets(request *pb.GetChangedTargetsRequest, str if retErr != nil { scope.Counter("failure").Inc(1) emitFailureMetric(scope, retErr) + retErr = mapper.ToProtoError(retErr) } else { scope.Counter("success").Inc(1) } }() if err := validateGetChangedTargetsRequest(request); err != nil { - return common.WithReason(common.FailureReasonValidation, common.ErrorTypeUser, err) + return newControllerUserError(err) } scope = scope.Tagged(map[string]string{"repo": common.ToShortRemote(request.GetFirstRevision().GetRemote())}) ctx, cancelLink := c.linkRequestCtx(stream.Context()) @@ -83,7 +85,7 @@ func (c *controller) GetChangedTargets(request *pb.GetChangedTargetsRequest, str treehash1, treehash2, err := readTreehashParallel(ctx, c.storage, request.GetFirstRevision(), request.GetSecondRevision()) if err != nil { logger.Error("GetChangedTargets: Failed to read revision treehash", zap.Error(err)) - return common.WithReason(failureReasonTreehashRead, common.ErrorTypeInfra, err) + return err } if treehash1 != "" && treehash2 != "" { cacheKey := common.GetComparedTargetsCachePath(request.GetFirstRevision().GetRemote(), treehash1, treehash2, request.GetRequestOptions()) @@ -97,11 +99,6 @@ func (c *controller) GetChangedTargets(request *pb.GetChangedTargetsRequest, str var cached []*pb.GetChangedTargetsResponse var readErr error for { - if err := ctx.Err(); err != nil { - cachedReader.Close() - // Client gave up while we were draining the cache. Surface as a user-cancelled error. - return common.WithReason(common.FailureReasonCancelled, common.ErrorTypeUser, err) - } var resp *pb.GetChangedTargetsResponse resp, readErr = cachedReader.Read() if readErr == io.EOF { @@ -127,7 +124,7 @@ func (c *controller) GetChangedTargets(request *pb.GetChangedTargetsRequest, str scope.Timer("cache_read_duration").Record(cacheReadDuration) if sendErr := sendTrimmedChangedTargets(stream, cached, maxDist, request.GetOutputConfig()); sendErr != nil { logger.Error("GetChangedTargets: Failed to send cached response", zap.Error(sendErr)) - return common.WithReason(failureReasonSend, common.ErrorTypeInfra, fmt.Errorf("failed to send cached response: %w", sendErr)) + return newControllerInfraError(fmt.Errorf("send cached response: %w", sendErr)) } totalDuration := time.Since(start) logger.Info("GetChangedTargets: Successfully streamed from cache", @@ -228,11 +225,6 @@ func (c *controller) GetChangedTargets(request *pb.GetChangedTargetsRequest, str ) scope.Timer("graph_fetch_duration").Record(graphFetchDuration) - if ctx.Err() != nil { - // If the context was cancelled by the upstream, just return the original error without additional augmentation - return common.WithReason(common.FailureReasonCancelled, common.ErrorTypeUser, ctx.Err()) - } - // Process errors, only aggregating the ones that are original ones and not a result of the other job being cancelled var err error for i, job := range jobs { @@ -260,11 +252,8 @@ func (c *controller) GetChangedTargets(request *pb.GetChangedTargetsRequest, str firstGraph = nil secondGraph = nil if err != nil { - if ctx.Err() != nil { - return common.WithReason(common.FailureReasonCancelled, common.ErrorTypeUser, ctx.Err()) - } logger.Error("GetChangedTargets: Failed to compare target graphs", zap.Error(err)) - return common.WithReason(failureReasonCompare, common.ErrorTypeInfra, fmt.Errorf("failed to compare target graphs: %w", err)) + return newControllerInfraError(fmt.Errorf("compare target graphs: %w", err)) } compareDuration := time.Since(compareStart) logger.Info("GetChangedTargets: Target graphs compared", @@ -307,7 +296,7 @@ func (c *controller) GetChangedTargets(request *pb.GetChangedTargetsRequest, str sendStart := time.Now() if err := sendTrimmedChangedTargets(stream, changedTargetsResponses, maxDist, request.GetOutputConfig()); err != nil { logger.Error("GetChangedTargets: Failed to send response", zap.Error(err)) - return common.WithReason(failureReasonSend, common.ErrorTypeInfra, fmt.Errorf("failed to send response: %w", err)) + return newControllerInfraError(fmt.Errorf("send response: %w", err)) } sendDuration := time.Since(sendStart) scope.Timer("send_duration").Record(sendDuration) diff --git a/controller/getchangedtargets_test.go b/controller/getchangedtargets_test.go index 1e854fc0..099fb1b9 100644 --- a/controller/getchangedtargets_test.go +++ b/controller/getchangedtargets_test.go @@ -27,13 +27,13 @@ import ( gogio "github.com/gogo/protobuf/io" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" - "github.com/uber/tango/core/common" "github.com/uber/tango/core/storage" storagemock "github.com/uber/tango/core/storage/storagemock" orchestratormock "github.com/uber/tango/orchestrator/orchestratormock" pb "github.com/uber/tango/tangopb" tangomock "github.com/uber/tango/tangopb/tangopbmock" "go.uber.org/mock/gomock" + "go.uber.org/yarpc/yarpcerrors" "go.uber.org/zap" "go.uber.org/zap/zaptest" ) @@ -158,7 +158,9 @@ func TestGetChangedTargets_ValidationError(t *testing.T) { c := NewController(context.Background(), Params{Logger: zap.NewNop(), Orchestrator: orchestratormock.NewMockOrchestrator(ctrl)}) err := c.GetChangedTargets(nil, stream) - assert.EqualError(t, err, "request cannot be nil") + require.Error(t, err) + assert.Equal(t, yarpcerrors.CodeInvalidArgument, yarpcerrors.FromError(err).Code()) + assert.Contains(t, err.Error(), "request cannot be nil") } func TestGetChangedTargets_CacheHit(t *testing.T) { @@ -219,7 +221,7 @@ func TestGetChangedTargets_TreehashReadError(t *testing.T) { storagemock := storagemock.NewMockStorage(ctrl) // A non-NotFound storage error on a treehash read must surface as a failed - // request (with failureReasonTreehashRead) rather than be silently treated + // request rather than be silently treated // as a cache miss. Both revision treehashes are read in parallel, so two Get // calls happen; the handler returns the first failure (and drops the // cancelled sibling's error) before any graph fetch happens. @@ -241,11 +243,6 @@ func TestGetChangedTargets_TreehashReadError(t *testing.T) { err := c.GetChangedTargets(request, stream) require.Error(t, err) - require.ErrorIs(t, err, injected) - var ce common.ClassifiedError - require.True(t, errors.As(err, &ce), "expected ClassifiedError, got %T", err) - assert.Equal(t, failureReasonTreehashRead, ce.Reason()) - assert.Equal(t, common.ErrorTypeInfra, ce.Type()) } func TestReadTreehash(t *testing.T) { diff --git a/controller/gettargetgraph.go b/controller/gettargetgraph.go index 84a1717c..b0aceae5 100644 --- a/controller/gettargetgraph.go +++ b/controller/gettargetgraph.go @@ -22,6 +22,7 @@ import ( "time" "github.com/uber/tango/core/common" + "github.com/uber/tango/internal/mapper" "github.com/uber/tango/orchestrator" "github.com/uber/tango/core/storage" @@ -37,6 +38,7 @@ func (c *controller) GetTargetGraph(request *pb.GetTargetGraphRequest, stream pb if retErr != nil { scope.Counter("failure").Inc(1) emitFailureMetric(scope, retErr) + retErr = mapper.ToProtoError(retErr) } else { scope.Counter("success").Inc(1) } @@ -73,12 +75,12 @@ func (c *controller) GetTargetGraph(request *pb.GetTargetGraphRequest, stream pb return nil } if err != nil { - return common.WithReason(failureReasonGraphFetch, common.ErrorTypeInfra, err) + return err } toSend := applyOptimizedTargetsOutputConfigToChunk(graphStreamChunk, outputConfig) err = stream.Send(toSend) if err != nil { - return common.WithReason(failureReasonSend, common.ErrorTypeInfra, fmt.Errorf("send graph: %w", err)) + return newControllerInfraError(fmt.Errorf("send graph: %w", err)) } } } @@ -92,16 +94,16 @@ func (c *controller) GetTargetGraph(request *pb.GetTargetGraphRequest, stream pb func (c *controller) getGraph(ctx context.Context, buildDescription *pb.BuildDescription, requestOptions *pb.RequestOptions, bypassCache bool) (storage.GraphReader, error) { start := time.Now() if buildDescription == nil { - return nil, errors.New("build description is empty or invalid") + return nil, newControllerUserError(errors.New("build description is empty or invalid")) } if buildDescription.GetBaseSha() == "" || buildDescription.GetRemote() == "" { - return nil, fmt.Errorf("build description is missing required fields: base_sha: %s, remote: %s", buildDescription.GetBaseSha(), buildDescription.GetRemote()) + return nil, newControllerUserError(fmt.Errorf("build description is missing required fields: base_sha: %s, remote: %s", buildDescription.GetBaseSha(), buildDescription.GetRemote())) } logger := c.logger.With( zap.Any("build_description", buildDescription), ) if !bypassCache { - // Look up the the git treehash based on cache path + // Look up the git treehash based on cache path treehashCachePath := common.GetTreehashCachePath(buildDescription) treehashResponse, err := c.storage.Get(ctx, storage.DownloadRequest{Key: treehashCachePath}) if err != nil { @@ -118,7 +120,7 @@ func (c *controller) getGraph(ctx context.Context, buildDescription *pb.BuildDes treehashBytes, err := io.ReadAll(treehashResponse.ReadCloser) if err != nil { logger.Error("getGraph: Error reading treehash", zap.Error(err)) - return nil, err + return nil, newControllerInfraError(err) } logger.Info("getGraph: treehash found") treehashPath := common.GetGraphByTreeHash(buildDescription.GetRemote(), string(treehashBytes), buildDescription.GetStrategy(), requestOptions) @@ -126,12 +128,9 @@ func (c *controller) getGraph(ctx context.Context, buildDescription *pb.BuildDes storageStart := time.Now() graphReader, err := storage.NewGraphReader(ctx, c.storage, treehashPath) if err != nil { - if ctx.Err() != nil { - return nil, common.WithReason(common.FailureReasonCancelled, common.ErrorTypeUser, ctx.Err()) - } if !storage.IsNotFound(err) { logger.Error("getGraph: Error reading graph from Storage", zap.Error(err)) - return nil, common.WithReason(failureReasonGraphFetch, common.ErrorTypeInfra, err) + return nil, err } logger.Warn("getGraph: graph not found at treehash path", zap.Error(err)) } else { @@ -152,14 +151,7 @@ func (c *controller) getGraph(ctx context.Context, buildDescription *pb.BuildDes computeStart := time.Now() graphReader, err := c.orchestrator.GetTargetGraph(ctx, orchestrator.GetTargetGraphParam{Req: &pb.GetTargetGraphRequest{BuildDescription: buildDescription, RequestOptions: requestOptions}, BypassCache: bypassCache}) if err != nil { - if ctx.Err() != nil { - return nil, common.WithReason(common.FailureReasonCancelled, common.ErrorTypeUser, ctx.Err()) - } - var ce common.ClassifiedError - if errors.As(err, &ce) { - return nil, err - } - return nil, common.WithReason(failureReasonGraphFetch, common.ErrorTypeInfra, err) + return nil, err } logger.Info("getGraph: computed target graph", zap.Duration("compute_duration", time.Since(computeStart)), diff --git a/controller/gettargetgraph_test.go b/controller/gettargetgraph_test.go index e62856fc..e7dfc57c 100644 --- a/controller/gettargetgraph_test.go +++ b/controller/gettargetgraph_test.go @@ -24,13 +24,13 @@ import ( gogio "github.com/gogo/protobuf/io" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" - "github.com/uber/tango/core/common" "github.com/uber/tango/core/storage" storagemock "github.com/uber/tango/core/storage/storagemock" orchestratormock "github.com/uber/tango/orchestrator/orchestratormock" pb "github.com/uber/tango/tangopb" tangomock "github.com/uber/tango/tangopb/tangopbmock" "go.uber.org/mock/gomock" + "go.uber.org/yarpc/yarpcerrors" "go.uber.org/zap/zaptest" ) @@ -248,10 +248,6 @@ func TestGetTargetGraph_GraphFetchError(t *testing.T) { BuildDescription: &pb.BuildDescription{Remote: "repo:go-code", BaseSha: "sha"}, }, stream) require.Error(t, err) - var ce common.ClassifiedError - require.True(t, errors.As(err, &ce)) - assert.Equal(t, failureReasonGraphFetch, ce.Reason()) - assert.Equal(t, common.ErrorTypeInfra, ce.Type()) } // New coverage: io.ReadFrom fails on graph read -> error returned. @@ -341,7 +337,7 @@ func TestGetTargetGraph_GraphReadCancelled(t *testing.T) { store := storagemock.NewMockStorage(ctrl) gomock.InOrder( store.EXPECT().Get(gomock.Any(), gomock.Any()).Return(storage.DownloadResponse{ReadCloser: newMockReadCloser([]byte("treehash-abc"))}, nil), - store.EXPECT().Get(gomock.Any(), gomock.Any()).Return(storage.DownloadResponse{}, errors.New("context canceled")), + store.EXPECT().Get(gomock.Any(), gomock.Any()).Return(storage.DownloadResponse{}, context.Canceled), ) c := NewController(context.Background(), Params{ Logger: zaptest.NewLogger(t), @@ -351,10 +347,7 @@ func TestGetTargetGraph_GraphReadCancelled(t *testing.T) { BuildDescription: &pb.BuildDescription{Remote: "repo:go-code", BaseSha: "sha"}, }, stream) require.Error(t, err) - var ce common.ClassifiedError - require.True(t, errors.As(err, &ce)) - assert.Equal(t, common.FailureReasonCancelled, ce.Reason()) - assert.Equal(t, common.ErrorTypeUser, ce.Type()) + assert.Equal(t, yarpcerrors.CodeCancelled, yarpcerrors.FromError(err).Code()) } func TestGetTargetGraph_OrchestratorCancelled(t *testing.T) { @@ -366,7 +359,7 @@ func TestGetTargetGraph_OrchestratorCancelled(t *testing.T) { store := storagemock.NewMockStorage(ctrl) store.EXPECT().Get(gomock.Any(), gomock.Any()).Return(storage.DownloadResponse{}, &storage.NotFoundError{Path: "x"}) orch := orchestratormock.NewMockOrchestrator(ctrl) - orch.EXPECT().GetTargetGraph(gomock.Any(), gomock.Any()).Return(nil, errors.New("context canceled")) + orch.EXPECT().GetTargetGraph(gomock.Any(), gomock.Any()).Return(nil, context.Canceled) c := NewController(context.Background(), Params{ Logger: zaptest.NewLogger(t), Storage: store, @@ -376,10 +369,7 @@ func TestGetTargetGraph_OrchestratorCancelled(t *testing.T) { BuildDescription: &pb.BuildDescription{Remote: "repo:go-code", BaseSha: "sha"}, }, stream) require.Error(t, err) - var ce common.ClassifiedError - require.True(t, errors.As(err, &ce)) - assert.Equal(t, common.FailureReasonCancelled, ce.Reason()) - assert.Equal(t, common.ErrorTypeUser, ce.Type()) + assert.Equal(t, yarpcerrors.CodeCancelled, yarpcerrors.FromError(err).Code()) } func newMockReadCloser(data []byte) io.ReadCloser { diff --git a/core/errors/BUILD.bazel b/core/errors/BUILD.bazel new file mode 100644 index 00000000..8f221530 --- /dev/null +++ b/core/errors/BUILD.bazel @@ -0,0 +1,18 @@ +load("@rules_go//go:def.bzl", "go_library", "go_test") + +go_library( + name = "errors", + srcs = ["errors.go"], + importpath = "github.com/uber/tango/core/errors", + visibility = ["//visibility:public"], +) + +go_test( + name = "errors_test", + srcs = ["errors_test.go"], + embed = [":errors"], + deps = [ + "@com_github_stretchr_testify//assert", + "@com_github_stretchr_testify//require", + ], +) diff --git a/core/errors/errors.go b/core/errors/errors.go new file mode 100644 index 00000000..45e74d1e --- /dev/null +++ b/core/errors/errors.go @@ -0,0 +1,182 @@ +package errors + +import ( + "context" + stderrs "errors" + "fmt" + "io" +) + +// ErrorCode mirrors the proto ErrorCode enum and classifies a TangoError as +// a user error or an infra error (retryable or not). +type ErrorCode int + +const ( + ErrorUnknown ErrorCode = iota + ErrorCancelled + ErrorUser + ErrorInfra + ErrorInfraRetryable +) + +// String returns the string form of the code: "cancelled", "user", "infra", +// "infra_retryable", or "unknown" as the default. +func (code ErrorCode) String() string { + switch code { + case ErrorCancelled: + return "cancelled" + case ErrorUser: + return "user" + case ErrorInfra: + return "infra" + case ErrorInfraRetryable: + return "infra_retryable" + default: + return "unknown" + } +} + +// FailureSource represents the component where an error occurred. +type FailureSource interface { + source() + String() string +} + +type source string + +func (s source) source() {} +func (s source) String() string { return string(s) } + +var ( + // FailureSourceUnknown is used as a fallback when no other source applies. + FailureSourceUnknown FailureSource = source("unknown") + // FailureSourceGit represents failures in git operations. + FailureSourceGit FailureSource = source("git") + // FailureSourceBazel represents failures in bazel operations. + FailureSourceBazel FailureSource = source("bazel") + // FailureSourceITG represents failures in ITG cache, changeanalyzer, and graph. + FailureSourceITG FailureSource = source("itg") + // FailureSourceStorage represents failures in storage. + FailureSourceStorage FailureSource = source("storage") + // FailureSourceConfig represents failures in config parser. + FailureSourceConfig FailureSource = source("config") + // FailureSourceController represents failures in controller. + FailureSourceController FailureSource = source("controller") + // FailureSourceTargetHasher represents failures in target hasher. + FailureSourceTargetHasher FailureSource = source("targethasher") + // FailureSourceOrchestrator represents failures in orchestrator. + FailureSourceOrchestrator FailureSource = source("orchestrator") + // FailureSourceRepoManager represents failures in repo manager. + FailureSourceRepoManager FailureSource = source("repomanager") +) + +// TangoError is Tango's internal error type, carrying the underlying error, its `FailureSource`, and its `ErrorCode`. +// The `mapper` package uses the error and error code to build the proto `TangoError` for the RPC response, and metrics emitters use the failure source and error code as metric tags. +type TangoError struct { + failureSource FailureSource + err error + errorCode ErrorCode +} + +// Error returns the underlying error's message. +func (te *TangoError) Error() string { + return te.err.Error() +} + +// Unwrap returns the underlying error, so errors.Is / errors.As can traverse a TangoError. +func (te *TangoError) Unwrap() error { + return te.err +} + +// Format implements fmt.Formatter. %s and %v print the underlying error +// message. %+v additionally includes the error code and failure source, and +// recurses into a wrapped error's %+v formatting when it also implements +// fmt.Formatter. +func (te *TangoError) Format(f fmt.State, verb rune) { + switch verb { + case 'v': + if f.Flag('+') { + fmt.Fprintf(f, "%s (error_code=%s, failure_source=%s)", te.Error(), te.errorCode, te.failureSource) + return + } + io.WriteString(f, te.Error()) + case 's': + io.WriteString(f, te.Error()) + case 'q': + fmt.Fprintf(f, "%q", te.Error()) + } +} + +// NewInfra wraps err as a TangoError classified ErrorInfra. +func NewInfra(src FailureSource, err error) error { + return newError(src, err, ErrorInfra) +} + +// NewUser wraps err as a TangoError classified ErrorUser. +func NewUser(src FailureSource, err error) error { + return newError(src, err, ErrorUser) +} + +// NewInfraRetryable wraps err as a TangoError classified ErrorInfraRetryable. +func NewInfraRetryable(src FailureSource, err error) error { + return newError(src, err, ErrorInfraRetryable) +} + +func newError(src FailureSource, err error, code ErrorCode) error { + if err == nil { + return nil + } + + if src == nil { + src = FailureSourceUnknown + } + + var te *TangoError + if stderrs.As(err, &te) { + src = te.failureSource + code = te.errorCode + } + + if stderrs.Is(err, context.Canceled) { + code = ErrorCancelled + } + + return &TangoError{ + failureSource: src, + err: err, + errorCode: code, + } +} + +// GetErrorCode extracts the ErrorCode from err. +// If err is context.Canceled, ErrorCancelled is returned. +// If err wraps a TangoError, its code is returned. +// Otherwise ErrorUnknown is returned. +func GetErrorCode(err error) ErrorCode { + code := ErrorUnknown + + if stderrs.Is(err, context.Canceled) { + code = ErrorCancelled + } + + var te *TangoError + if stderrs.As(err, &te) { + code = te.errorCode + } + + return code +} + +// GetFailureSource extracts the FailureSource from err. +// If err wraps a TangoError, its source is returned. +// Otherwise FailureSourceUnknown is returned. +func GetFailureSource(err error) FailureSource { + source := FailureSourceUnknown + + var te *TangoError + if stderrs.As(err, &te) { + source = te.failureSource + } + + return source +} diff --git a/core/errors/errors_test.go b/core/errors/errors_test.go new file mode 100644 index 00000000..4f39f3a2 --- /dev/null +++ b/core/errors/errors_test.go @@ -0,0 +1,87 @@ +package errors + +import ( + stderrs "errors" + "fmt" + "testing" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +func TestNewError_Constructors(t *testing.T) { + underlying := stderrs.New("boom") + + tests := []struct { + name string + newErr func(FailureSource, error) error + source FailureSource + wantCode ErrorCode + }{ + { + name: "infra", + newErr: NewInfra, + source: FailureSourceGit, + wantCode: ErrorInfra, + }, + { + name: "user", + newErr: NewUser, + source: FailureSourceConfig, + wantCode: ErrorUser, + }, + { + name: "infra retryable", + newErr: NewInfraRetryable, + source: FailureSourceStorage, + wantCode: ErrorInfraRetryable, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + err := tt.newErr(tt.source, underlying) + + var te *TangoError + require.True(t, stderrs.As(err, &te)) + assert.Equal(t, tt.source, te.failureSource) + assert.Equal(t, tt.wantCode, te.errorCode) + assert.Equal(t, underlying.Error(), te.Error()) + }) + } +} + +func TestNewError_NilSourceDefaultsToUnknown(t *testing.T) { + err := NewInfra(nil, stderrs.New("boom")) + + var te *TangoError + require.True(t, stderrs.As(err, &te)) + assert.Equal(t, FailureSourceUnknown, te.failureSource) +} + +func TestNewError_RewrappingPreservesOriginalClassification(t *testing.T) { + inner := NewUser(FailureSourceConfig, stderrs.New("original")) + + outer := NewInfra(FailureSourceGit, inner) + + var te *TangoError + require.True(t, stderrs.As(outer, &te)) + assert.Equal(t, FailureSourceConfig, te.failureSource) + assert.Equal(t, ErrorUser, te.errorCode) +} + +func TestFailureSource_String(t *testing.T) { + assert.Equal(t, "fake-source", source("fake-source").String()) +} + +func TestTangoError_Format(t *testing.T) { + err := NewUser(FailureSourceConfig, stderrs.New("boom")) + + var te *TangoError + require.True(t, stderrs.As(err, &te)) + + assert.Equal(t, "boom", fmt.Sprintf("%v", te)) + assert.Equal(t, "boom", fmt.Sprintf("%s", te)) + assert.Equal(t, `"boom"`, fmt.Sprintf("%q", te)) + assert.Equal(t, "boom (error_code=user, failure_source=config)", fmt.Sprintf("%+v", te)) +} diff --git a/internal/mapper/BUILD.bazel b/internal/mapper/BUILD.bazel new file mode 100644 index 00000000..31c3d90b --- /dev/null +++ b/internal/mapper/BUILD.bazel @@ -0,0 +1,28 @@ +load("@rules_go//go:def.bzl", "go_library", "go_test") + +go_library( + name = "mapper", + srcs = ["errors.go"], + importpath = "github.com/uber/tango/internal/mapper", + visibility = ["//visibility:public"], + deps = [ + "//core/errors", + "//tangopb", + "@org_uber_go_yarpc//encoding/protobuf", + "@org_uber_go_yarpc//yarpcerrors", + ], +) + +go_test( + name = "mapper_test", + srcs = ["errors_test.go"], + embed = [":mapper"], + deps = [ + "//core/errors", + "//tangopb", + "@com_github_stretchr_testify//assert", + "@com_github_stretchr_testify//require", + "@org_uber_go_yarpc//encoding/protobuf", + "@org_uber_go_yarpc//yarpcerrors", + ], +) diff --git a/internal/mapper/errors.go b/internal/mapper/errors.go new file mode 100644 index 00000000..c2e9d6a2 --- /dev/null +++ b/internal/mapper/errors.go @@ -0,0 +1,54 @@ +package mapper + +import ( + tangoerrors "github.com/uber/tango/core/errors" + "github.com/uber/tango/tangopb" + "go.uber.org/yarpc/encoding/protobuf" + "go.uber.org/yarpc/yarpcerrors" +) + +// ToProtoError converts err into a YARPC error with a TangoError detail. +func ToProtoError(err error) error { + if err == nil { + return nil + } + + tangoCode := tangoerrors.GetErrorCode(err) + + return protobuf.NewError( + toYARPCCode(tangoCode), + err.Error(), + protobuf.WithErrorDetails(&tangopb.TangoError{ + Code: toProtoErrorCode(tangoCode), + Message: err.Error(), + }), + ) +} + +func toYARPCCode(code tangoerrors.ErrorCode) yarpcerrors.Code { + switch code { + case tangoerrors.ErrorCancelled: + return yarpcerrors.CodeCancelled + case tangoerrors.ErrorUser: + return yarpcerrors.CodeInvalidArgument + case tangoerrors.ErrorInfra, tangoerrors.ErrorInfraRetryable: + return yarpcerrors.CodeInternal + default: + return yarpcerrors.CodeUnknown + } +} + +func toProtoErrorCode(code tangoerrors.ErrorCode) tangopb.ErrorCode { + switch code { + case tangoerrors.ErrorCancelled: + return tangopb.ERROR_CANCELLED + case tangoerrors.ErrorUser: + return tangopb.ERROR_USER + case tangoerrors.ErrorInfra: + return tangopb.ERROR_INFRA + case tangoerrors.ErrorInfraRetryable: + return tangopb.ERROR_INFRA_RETRYABLE + default: + return tangopb.ERROR_UNKNOWN + } +} diff --git a/internal/mapper/errors_test.go b/internal/mapper/errors_test.go new file mode 100644 index 00000000..0603ecdc --- /dev/null +++ b/internal/mapper/errors_test.go @@ -0,0 +1,104 @@ +package mapper + +import ( + "context" + stderrs "errors" + "testing" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + tangoerrors "github.com/uber/tango/core/errors" + "github.com/uber/tango/tangopb" + "go.uber.org/yarpc/encoding/protobuf" + "go.uber.org/yarpc/yarpcerrors" +) + +func TestToProtoError(t *testing.T) { + tests := []struct { + name string + err error + wantCode tangopb.ErrorCode + wantYARPC yarpcerrors.Code + }{ + { + name: "context canceled", + err: context.Canceled, + wantCode: tangopb.ERROR_CANCELLED, + wantYARPC: yarpcerrors.CodeCancelled, + }, + { + name: "classified error", + err: tangoerrors.NewUser(tangoerrors.FailureSourceConfig, stderrs.New("bad input")), + wantCode: tangopb.ERROR_USER, + wantYARPC: yarpcerrors.CodeInvalidArgument, + }, + { + name: "unclassified error", + err: stderrs.New("plain error"), + wantCode: tangopb.ERROR_UNKNOWN, + wantYARPC: yarpcerrors.CodeUnknown, + }, + { + name: "wrapped classified error", + err: stderrs.Join(tangoerrors.NewUser(tangoerrors.FailureSourceConfig, stderrs.New("bad input"))), + wantCode: tangopb.ERROR_USER, + wantYARPC: yarpcerrors.CodeInvalidArgument, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + err := ToProtoError(tt.err) + require.Error(t, err) + + assert.Equal(t, tt.wantYARPC, yarpcerrors.FromError(err).Code()) + + details := protobuf.GetErrorDetails(err) + require.Len(t, details, 1) + tangoErr, ok := details[0].(*tangopb.TangoError) + require.True(t, ok) + assert.Equal(t, tt.wantCode, tangoErr.Code) + assert.Equal(t, tt.err.Error(), tangoErr.Message) + }) + } +} + +func TestToProtoErrorCode(t *testing.T) { + tests := []struct { + name string + code tangoerrors.ErrorCode + want tangopb.ErrorCode + }{ + {name: "cancelled", code: tangoerrors.ErrorCancelled, want: tangopb.ERROR_CANCELLED}, + {name: "user", code: tangoerrors.ErrorUser, want: tangopb.ERROR_USER}, + {name: "infra", code: tangoerrors.ErrorInfra, want: tangopb.ERROR_INFRA}, + {name: "infra retryable", code: tangoerrors.ErrorInfraRetryable, want: tangopb.ERROR_INFRA_RETRYABLE}, + {name: "unknown", code: tangoerrors.ErrorUnknown, want: tangopb.ERROR_UNKNOWN}, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + assert.Equal(t, tt.want, toProtoErrorCode(tt.code)) + }) + } +} + +func TestToYARPCCode(t *testing.T) { + tests := []struct { + name string + code tangoerrors.ErrorCode + want yarpcerrors.Code + }{ + {name: "cancelled", code: tangoerrors.ErrorCancelled, want: yarpcerrors.CodeCancelled}, + {name: "user", code: tangoerrors.ErrorUser, want: yarpcerrors.CodeInvalidArgument}, + {name: "infra", code: tangoerrors.ErrorInfra, want: yarpcerrors.CodeInternal}, + {name: "infra retryable", code: tangoerrors.ErrorInfraRetryable, want: yarpcerrors.CodeInternal}, + {name: "unknown", code: tangoerrors.ErrorUnknown, want: yarpcerrors.CodeUnknown}, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + assert.Equal(t, tt.want, toYARPCCode(tt.code)) + }) + } +} diff --git a/proto/tango.proto b/proto/tango.proto index 66fb8ccd..0945323c 100644 --- a/proto/tango.proto +++ b/proto/tango.proto @@ -7,6 +7,19 @@ option java_multiple_files = true; option java_outer_classname = "TangoProto"; option java_package = "com.uber.tango"; +enum ErrorCode { + ERROR_UNKNOWN = 0; + ERROR_CANCELLED = 1; + ERROR_USER = 2; + ERROR_INFRA = 3; + ERROR_INFRA_RETRYABLE = 4; +} + +message TangoError { + ErrorCode code = 1; + string message = 2; +} + // Request represents a single change request with a URL and optional commit SHA. message Request { // The URL of the change request (e.g., a GitHub pull request URL or Phabricator diff URL) diff --git a/tangopb/tango.pb.go b/tangopb/tango.pb.go index eb16fe8c..ca4ddea8 100644 --- a/tangopb/tango.pb.go +++ b/tangopb/tango.pb.go @@ -27,6 +27,36 @@ var _ = math.Inf // proto package needs to be updated. const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package +type ErrorCode int32 + +const ( + ERROR_UNKNOWN ErrorCode = 0 + ERROR_CANCELLED ErrorCode = 1 + ERROR_USER ErrorCode = 2 + ERROR_INFRA ErrorCode = 3 + ERROR_INFRA_RETRYABLE ErrorCode = 4 +) + +var ErrorCode_name = map[int32]string{ + 0: "ERROR_UNKNOWN", + 1: "ERROR_CANCELLED", + 2: "ERROR_USER", + 3: "ERROR_INFRA", + 4: "ERROR_INFRA_RETRYABLE", +} + +var ErrorCode_value = map[string]int32{ + "ERROR_UNKNOWN": 0, + "ERROR_CANCELLED": 1, + "ERROR_USER": 2, + "ERROR_INFRA": 3, + "ERROR_INFRA_RETRYABLE": 4, +} + +func (ErrorCode) EnumDescriptor() ([]byte, []int) { + return fileDescriptor_c4210c857dbeec96, []int{0} +} + // ComputationStrategy controls the computation strategy to use for the target graph type ComputationStrategy int32 @@ -56,16 +86,23 @@ var ComputationStrategy_value = map[string]int32{ } func (ComputationStrategy) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_c4210c857dbeec96, []int{0} + return fileDescriptor_c4210c857dbeec96, []int{1} } -// Enum for ChangeType +// ChangeType classifies how a target changed between two revisions in a +// GetChangedTargets response. Each ChangedTarget carries one value, set +// from the second revision's perspective. type ChangeType int32 const ( + // Default-initialized sentinel; never explicitly set. Used as emptiness check only. CHANGE_TYPE_INVALID ChangeType = 0 - CHANGE_TYPE_NEW ChangeType = 1 + // Target was added in the second revision. + CHANGE_TYPE_NEW ChangeType = 1 + // Target was removed in the second revision. CHANGE_TYPE_DELETED ChangeType = 2 + // Target is present in both revisions but differs (hash, attributes, or direct-deps changed, + // or it transitively consumes something that changed). CHANGE_TYPE_CHANGED ChangeType = 3 ) @@ -84,7 +121,58 @@ var ChangeType_value = map[string]int32{ } func (ChangeType) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_c4210c857dbeec96, []int{1} + return fileDescriptor_c4210c857dbeec96, []int{2} +} + +type TangoError struct { + Code ErrorCode `protobuf:"varint,1,opt,name=code,proto3,enum=uber.tango.ErrorCode" json:"code,omitempty"` + Message string `protobuf:"bytes,2,opt,name=message,proto3" json:"message,omitempty"` +} + +func (m *TangoError) Reset() { *m = TangoError{} } +func (*TangoError) ProtoMessage() {} +func (*TangoError) Descriptor() ([]byte, []int) { + return fileDescriptor_c4210c857dbeec96, []int{0} +} +func (m *TangoError) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *TangoError) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_TangoError.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *TangoError) XXX_Merge(src proto.Message) { + xxx_messageInfo_TangoError.Merge(m, src) +} +func (m *TangoError) XXX_Size() int { + return m.Size() +} +func (m *TangoError) XXX_DiscardUnknown() { + xxx_messageInfo_TangoError.DiscardUnknown(m) +} + +var xxx_messageInfo_TangoError proto.InternalMessageInfo + +func (m *TangoError) GetCode() ErrorCode { + if m != nil { + return m.Code + } + return ERROR_UNKNOWN +} + +func (m *TangoError) GetMessage() string { + if m != nil { + return m.Message + } + return "" } // Request represents a single change request with a URL and optional commit SHA. @@ -98,7 +186,7 @@ type Request struct { func (m *Request) Reset() { *m = Request{} } func (*Request) ProtoMessage() {} func (*Request) Descriptor() ([]byte, []int) { - return fileDescriptor_c4210c857dbeec96, []int{0} + return fileDescriptor_c4210c857dbeec96, []int{1} } func (m *Request) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -159,7 +247,7 @@ type BuildDescription struct { func (m *BuildDescription) Reset() { *m = BuildDescription{} } func (*BuildDescription) ProtoMessage() {} func (*BuildDescription) Descriptor() ([]byte, []int) { - return fileDescriptor_c4210c857dbeec96, []int{1} + return fileDescriptor_c4210c857dbeec96, []int{2} } func (m *BuildDescription) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -228,15 +316,23 @@ type OutputConfig struct { // Indicates if only root targets (i.e. targets that are not depended on by any other targets) should be included in the response RootsOnly bool `protobuf:"varint,4,opt,name=roots_only,json=rootsOnly,proto3" json:"roots_only,omitempty"` // Maximum BFS distance from a distance-0 seed to include in the response. - // 0 (default) means no distance filtering. Positive values limit results: 1 = only seeds, - // 2 = seeds + their immediate reverse deps, etc. See ChangedTarget.distance for what counts as a seed. + // Semantics match ChangedTarget.distance: -1 = no filtering (default behavior), + // 0 = only seeds, 1 = seeds and their immediate reverse deps, etc. + // See ChangedTarget.distance for what counts as a seed. + // + // Defaults: when the enclosing OutputConfig is omitted entirely, the server + // treats max_distance as -1 (no filtering). When OutputConfig is provided, + // max_distance is taken at face value — note that proto3's wire default for + // an unset scalar is 0, which under this contract means "filter to seeds + // only". Clients that want unfiltered results while supplying other + // OutputConfig fields must set max_distance to -1 explicitly. MaxDistance int32 `protobuf:"varint,5,opt,name=max_distance,json=maxDistance,proto3" json:"max_distance,omitempty"` } func (m *OutputConfig) Reset() { *m = OutputConfig{} } func (*OutputConfig) ProtoMessage() {} func (*OutputConfig) Descriptor() ([]byte, []int) { - return fileDescriptor_c4210c857dbeec96, []int{2} + return fileDescriptor_c4210c857dbeec96, []int{3} } func (m *OutputConfig) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -311,7 +407,7 @@ type RequestOptions struct { func (m *RequestOptions) Reset() { *m = RequestOptions{} } func (*RequestOptions) ProtoMessage() {} func (*RequestOptions) Descriptor() ([]byte, []int) { - return fileDescriptor_c4210c857dbeec96, []int{3} + return fileDescriptor_c4210c857dbeec96, []int{4} } func (m *RequestOptions) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -371,7 +467,7 @@ type OptimizedTarget struct { func (m *OptimizedTarget) Reset() { *m = OptimizedTarget{} } func (*OptimizedTarget) ProtoMessage() {} func (*OptimizedTarget) Descriptor() ([]byte, []int) { - return fileDescriptor_c4210c857dbeec96, []int{4} + return fileDescriptor_c4210c857dbeec96, []int{5} } func (m *OptimizedTarget) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -465,7 +561,7 @@ type OptimizedTargets struct { func (m *OptimizedTargets) Reset() { *m = OptimizedTargets{} } func (*OptimizedTargets) ProtoMessage() {} func (*OptimizedTargets) Descriptor() ([]byte, []int) { - return fileDescriptor_c4210c857dbeec96, []int{5} + return fileDescriptor_c4210c857dbeec96, []int{6} } func (m *OptimizedTargets) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -510,7 +606,7 @@ type ChangedTargets struct { func (m *ChangedTargets) Reset() { *m = ChangedTargets{} } func (*ChangedTargets) ProtoMessage() {} func (*ChangedTargets) Descriptor() ([]byte, []int) { - return fileDescriptor_c4210c857dbeec96, []int{6} + return fileDescriptor_c4210c857dbeec96, []int{7} } func (m *ChangedTargets) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -548,21 +644,27 @@ func (m *ChangedTargets) GetChangedTargets() []*ChangedTarget { // ChangedTarget represents a changed target and its associated optimized targets. type ChangedTarget struct { - ChangeType ChangeType `protobuf:"varint,1,opt,name=change_type,json=changeType,proto3,enum=uber.tango.ChangeType" json:"change_type,omitempty"` - OldTarget *OptimizedTarget `protobuf:"bytes,2,opt,name=old_target,json=oldTarget,proto3" json:"old_target,omitempty"` - NewTarget *OptimizedTarget `protobuf:"bytes,3,opt,name=new_target,json=newTarget,proto3" json:"new_target,omitempty"` + // Type of the change. + ChangeType ChangeType `protobuf:"varint,1,opt,name=change_type,json=changeType,proto3,enum=uber.tango.ChangeType" json:"change_type,omitempty"` + // The old target before the change (first revision). + OldTarget *OptimizedTarget `protobuf:"bytes,2,opt,name=old_target,json=oldTarget,proto3" json:"old_target,omitempty"` + // The new target after the change (second revision). + NewTarget *OptimizedTarget `protobuf:"bytes,3,opt,name=new_target,json=newTarget,proto3" json:"new_target,omitempty"` // Distance from the nearest distance-0 seed in the reverse dependency graph. - // A seed is a directly changed source file, a rule whose own configuration (attributes or - // direct deps) changed, or a NEW/DELETED target. A rule whose only change is that it - // consumes a changed source file (own config unchanged) ends up at distance >= 1. - // -1 means the distance is not set (e.g., targets unreachable from any seed). + // A seed is a directly changed source file, a NEW/DELETED target, or a + // CHANGED rule whose hash change is not fully explained by a direct dep + // having also changed — i.e. its own configuration (attributes or + // dep-name set) changed, or the hasher saw an input we don't track + // explicitly (tags, root/external, etc.). Only a CHANGED rule whose + // hash change is purely transitive (a direct dep changed and this rule's + // own config did not) ends up at distance >= 1. Distance int32 `protobuf:"varint,4,opt,name=distance,proto3" json:"distance,omitempty"` } func (m *ChangedTarget) Reset() { *m = ChangedTarget{} } func (*ChangedTarget) ProtoMessage() {} func (*ChangedTarget) Descriptor() ([]byte, []int) { - return fileDescriptor_c4210c857dbeec96, []int{7} + return fileDescriptor_c4210c857dbeec96, []int{8} } func (m *ChangedTarget) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -636,7 +738,7 @@ type Metadata struct { func (m *Metadata) Reset() { *m = Metadata{} } func (*Metadata) ProtoMessage() {} func (*Metadata) Descriptor() ([]byte, []int) { - return fileDescriptor_c4210c857dbeec96, []int{8} + return fileDescriptor_c4210c857dbeec96, []int{9} } func (m *Metadata) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -715,7 +817,7 @@ type GetTargetGraphRequest struct { func (m *GetTargetGraphRequest) Reset() { *m = GetTargetGraphRequest{} } func (*GetTargetGraphRequest) ProtoMessage() {} func (*GetTargetGraphRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_c4210c857dbeec96, []int{9} + return fileDescriptor_c4210c857dbeec96, []int{10} } func (m *GetTargetGraphRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -785,7 +887,7 @@ type GetTargetGraphResponse struct { func (m *GetTargetGraphResponse) Reset() { *m = GetTargetGraphResponse{} } func (*GetTargetGraphResponse) ProtoMessage() {} func (*GetTargetGraphResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_c4210c857dbeec96, []int{10} + return fileDescriptor_c4210c857dbeec96, []int{11} } func (m *GetTargetGraphResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -878,7 +980,7 @@ type GetChangedTargetsRequest struct { func (m *GetChangedTargetsRequest) Reset() { *m = GetChangedTargetsRequest{} } func (*GetChangedTargetsRequest) ProtoMessage() {} func (*GetChangedTargetsRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_c4210c857dbeec96, []int{11} + return fileDescriptor_c4210c857dbeec96, []int{12} } func (m *GetChangedTargetsRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -955,7 +1057,7 @@ type GetChangedTargetsResponse struct { func (m *GetChangedTargetsResponse) Reset() { *m = GetChangedTargetsResponse{} } func (*GetChangedTargetsResponse) ProtoMessage() {} func (*GetChangedTargetsResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_c4210c857dbeec96, []int{12} + return fileDescriptor_c4210c857dbeec96, []int{13} } func (m *GetChangedTargetsResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1048,7 +1150,7 @@ type GetChangedTargetGraphRequest struct { func (m *GetChangedTargetGraphRequest) Reset() { *m = GetChangedTargetGraphRequest{} } func (*GetChangedTargetGraphRequest) ProtoMessage() {} func (*GetChangedTargetGraphRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_c4210c857dbeec96, []int{13} + return fileDescriptor_c4210c857dbeec96, []int{14} } func (m *GetChangedTargetGraphRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1125,7 +1227,7 @@ type GetChangedTargetGraphResponse struct { func (m *GetChangedTargetGraphResponse) Reset() { *m = GetChangedTargetGraphResponse{} } func (*GetChangedTargetGraphResponse) ProtoMessage() {} func (*GetChangedTargetGraphResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_c4210c857dbeec96, []int{14} + return fileDescriptor_c4210c857dbeec96, []int{15} } func (m *GetChangedTargetGraphResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1201,8 +1303,10 @@ func (*GetChangedTargetGraphResponse) XXX_OneofWrappers() []interface{} { } func init() { + proto.RegisterEnum("uber.tango.ErrorCode", ErrorCode_name, ErrorCode_value) proto.RegisterEnum("uber.tango.ComputationStrategy", ComputationStrategy_name, ComputationStrategy_value) proto.RegisterEnum("uber.tango.ChangeType", ChangeType_name, ChangeType_value) + proto.RegisterType((*TangoError)(nil), "uber.tango.TangoError") proto.RegisterType((*Request)(nil), "uber.tango.Request") proto.RegisterType((*BuildDescription)(nil), "uber.tango.BuildDescription") proto.RegisterType((*OutputConfig)(nil), "uber.tango.OutputConfig") @@ -1229,110 +1333,110 @@ func init() { func init() { proto.RegisterFile("tango.proto", fileDescriptor_c4210c857dbeec96) } var fileDescriptor_c4210c857dbeec96 = []byte{ - // 1616 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x58, 0x3f, 0x6c, 0xdb, 0x56, - 0x1a, 0x17, 0xf5, 0xc7, 0xa6, 0x3f, 0xd9, 0x92, 0xfc, 0xec, 0x53, 0x64, 0x39, 0x51, 0x64, 0x22, - 0x01, 0x9c, 0xe4, 0xe2, 0x1c, 0x1c, 0x04, 0x97, 0xcb, 0x21, 0x40, 0x6c, 0x99, 0xb1, 0x85, 0x24, - 0xb2, 0x41, 0xcb, 0x39, 0xe4, 0x32, 0x10, 0x14, 0xf9, 0x22, 0x13, 0x27, 0x91, 0x3a, 0xf2, 0x29, - 0xb1, 0x83, 0x1b, 0x6e, 0xcd, 0x52, 0x74, 0xec, 0xd4, 0xa1, 0x53, 0xf7, 0x6e, 0x9d, 0xda, 0xad, - 0x28, 0x50, 0x20, 0x45, 0x51, 0x20, 0x43, 0x87, 0xc6, 0x59, 0x3a, 0x66, 0xea, 0x5c, 0xbc, 0xc7, - 0x47, 0x8a, 0x94, 0xe8, 0x7f, 0x75, 0x87, 0x0e, 0xd9, 0xc8, 0xef, 0xcf, 0xef, 0xfb, 0xde, 0xf7, - 0x87, 0xdf, 0xf7, 0x08, 0x59, 0xa2, 0x59, 0x6d, 0x7b, 0xa9, 0xe7, 0xd8, 0xc4, 0x46, 0xd0, 0x6f, - 0x61, 0x67, 0x89, 0x51, 0xa4, 0x9b, 0x30, 0xae, 0xe0, 0xff, 0xf6, 0xb1, 0x4b, 0x50, 0x01, 0x52, - 0x7d, 0xa7, 0x53, 0x12, 0xaa, 0xc2, 0xe2, 0x84, 0x42, 0x1f, 0x51, 0x11, 0xc6, 0x74, 0xbb, 0xdb, - 0x35, 0x49, 0x29, 0xc9, 0x88, 0xfc, 0x4d, 0xfa, 0x42, 0x80, 0xc2, 0x6a, 0xdf, 0xec, 0x18, 0x6b, - 0xd8, 0xd5, 0x1d, 0xb3, 0x47, 0x4c, 0xdb, 0xa2, 0xc2, 0x0e, 0xee, 0xda, 0x04, 0x73, 0x04, 0xfe, - 0x86, 0xe6, 0x40, 0x6c, 0x69, 0x2e, 0x56, 0xdd, 0x5d, 0x8d, 0xc3, 0x8c, 0xd3, 0xf7, 0xed, 0x5d, - 0x0d, 0xdd, 0x00, 0xd1, 0xf1, 0x8c, 0xbb, 0xa5, 0x54, 0x35, 0xb5, 0x98, 0x5d, 0x9e, 0x59, 0x1a, - 0xf8, 0xb6, 0xc4, 0x1d, 0x53, 0x02, 0x21, 0xf4, 0x4f, 0x10, 0x5d, 0xe2, 0x68, 0x04, 0xb7, 0xf7, - 0x4b, 0xe9, 0xaa, 0xb0, 0x98, 0x5b, 0xbe, 0x18, 0x56, 0xa8, 0xd9, 0xdd, 0x5e, 0x9f, 0x68, 0xd4, - 0x9d, 0x6d, 0x2e, 0xa6, 0x04, 0x0a, 0xd2, 0xaf, 0x02, 0x4c, 0x6e, 0xf6, 0x49, 0xaf, 0x4f, 0x6a, - 0xb6, 0xf5, 0xcc, 0x6c, 0xa3, 0x05, 0x98, 0x34, 0x2d, 0xbd, 0xd3, 0x37, 0xb0, 0x4a, 0xb4, 0xb6, - 0xcb, 0xfc, 0x16, 0x95, 0x2c, 0xa7, 0x35, 0xb5, 0xb6, 0x8b, 0xae, 0x03, 0xf2, 0x45, 0x34, 0x42, - 0x1c, 0xb3, 0xd5, 0x27, 0xd8, 0x65, 0xc7, 0x10, 0x95, 0x69, 0xce, 0x59, 0x09, 0x18, 0xe8, 0x32, - 0xe4, 0x7c, 0xf1, 0x5d, 0xcd, 0xdd, 0xc5, 0xf4, 0x58, 0x54, 0x74, 0x8a, 0x53, 0x37, 0x18, 0x11, - 0x5d, 0x00, 0x70, 0x6c, 0x9b, 0xb8, 0xaa, 0x6d, 0x75, 0xbc, 0x83, 0x88, 0xca, 0x04, 0xa3, 0x6c, - 0x5a, 0x9d, 0x7d, 0x74, 0x0d, 0xa6, 0x75, 0x76, 0x12, 0xac, 0x1a, 0xa6, 0x4b, 0x34, 0x4b, 0xc7, - 0x6e, 0x29, 0xc3, 0xa4, 0x0a, 0x9c, 0xb1, 0xe6, 0xd3, 0xe9, 0x21, 0xba, 0xda, 0x5e, 0x20, 0x58, - 0x1a, 0xab, 0x0a, 0x8b, 0x19, 0x25, 0xdb, 0xd5, 0xf6, 0x7c, 0x19, 0xe9, 0x01, 0xe4, 0x78, 0x28, - 0x37, 0x59, 0xaa, 0x5c, 0xf4, 0x0f, 0x98, 0xc3, 0x7b, 0xc4, 0xd1, 0x54, 0xbc, 0xe7, 0x79, 0xfb, - 0xcc, 0xec, 0x60, 0x57, 0x75, 0x70, 0x1b, 0xef, 0x95, 0x84, 0x6a, 0x6a, 0x71, 0x42, 0x29, 0x32, - 0x01, 0xd9, 0xe3, 0xdf, 0xa7, 0x6c, 0x85, 0x72, 0xa5, 0x1f, 0x92, 0x90, 0xa7, 0x30, 0x5d, 0xf3, - 0x25, 0x36, 0x9a, 0x9a, 0xd3, 0xc6, 0x04, 0xe5, 0x20, 0x69, 0x1a, 0x2c, 0x7c, 0x19, 0x25, 0x69, - 0x1a, 0x08, 0x41, 0x9a, 0x1e, 0x9f, 0xa7, 0x9b, 0x3d, 0xa3, 0x1b, 0x30, 0x63, 0x98, 0x0e, 0xd6, - 0x89, 0x6a, 0xe0, 0x1e, 0xb6, 0x0c, 0x6c, 0xe9, 0x26, 0xf6, 0xd2, 0x9e, 0x51, 0x90, 0xc7, 0x5a, - 0x0b, 0x71, 0x28, 0x08, 0xcb, 0x4a, 0x9a, 0x49, 0xb0, 0x67, 0x34, 0x0f, 0x13, 0x4e, 0xbf, 0x83, - 0x55, 0xb2, 0xdf, 0xc3, 0x2c, 0x22, 0x19, 0x45, 0xa4, 0x84, 0xe6, 0x7e, 0x0f, 0x53, 0x05, 0x1a, - 0x43, 0x16, 0x01, 0x51, 0x61, 0xcf, 0xa8, 0x0c, 0x22, 0xde, 0x23, 0xd8, 0xb1, 0xb4, 0x4e, 0x69, - 0x9c, 0xd1, 0x83, 0x77, 0xf4, 0x00, 0x20, 0x94, 0x53, 0x91, 0xd5, 0xdf, 0xb5, 0x70, 0x39, 0x0d, - 0x1d, 0x73, 0x69, 0x90, 0x68, 0xd9, 0x22, 0xce, 0xbe, 0x12, 0x52, 0x2f, 0xdf, 0x85, 0xfc, 0x10, - 0x9b, 0xf6, 0xd3, 0x7f, 0xf0, 0x3e, 0x0f, 0x0b, 0x7d, 0x44, 0xb3, 0x90, 0x79, 0xae, 0x75, 0xfa, - 0x98, 0x05, 0x26, 0xa3, 0x78, 0x2f, 0x77, 0x92, 0xb7, 0x05, 0xa9, 0x0e, 0x85, 0x21, 0x6b, 0x2e, - 0xba, 0x05, 0xe3, 0xc4, 0x7b, 0x64, 0x29, 0xc9, 0x2e, 0xcf, 0x1f, 0xe1, 0x9c, 0xe2, 0xcb, 0x4a, - 0x4d, 0xc8, 0xd5, 0x76, 0x35, 0xab, 0x3d, 0x00, 0x5a, 0x85, 0xbc, 0xee, 0x51, 0xd4, 0x28, 0xe0, - 0x5c, 0xa4, 0x79, 0xc2, 0x4a, 0x4a, 0x4e, 0x8f, 0x60, 0x48, 0x3f, 0x09, 0x30, 0x15, 0x91, 0x40, - 0x7f, 0x87, 0xac, 0x27, 0xe3, 0x65, 0x43, 0x60, 0xed, 0x58, 0x1c, 0x45, 0xa4, 0xb9, 0x51, 0x40, - 0x0f, 0x9e, 0xd1, 0x1d, 0x00, 0xbb, 0xe3, 0xbb, 0xc2, 0x42, 0x71, 0xcc, 0xd1, 0x26, 0xec, 0x8e, - 0x6f, 0xf4, 0x0e, 0x80, 0x85, 0x5f, 0xf8, 0xba, 0xa9, 0x13, 0xe8, 0x5a, 0xf8, 0x05, 0xd7, 0x2d, - 0x83, 0x18, 0x74, 0x49, 0xda, 0xab, 0x1d, 0xff, 0x5d, 0xfa, 0x7a, 0x0c, 0xc4, 0x47, 0x98, 0x68, - 0x86, 0x46, 0x34, 0xb4, 0x03, 0xd3, 0x9e, 0x01, 0xd5, 0x34, 0xd4, 0xae, 0xd6, 0xeb, 0x99, 0x56, - 0x9b, 0x47, 0xec, 0x4a, 0xd8, 0x96, 0xaf, 0xb0, 0xe4, 0x19, 0xa8, 0x1b, 0x8f, 0x3c, 0x59, 0xaf, - 0x3a, 0xf2, 0x24, 0x4a, 0xa5, 0xb0, 0x41, 0xf1, 0x06, 0xb0, 0xc9, 0x23, 0x60, 0x15, 0x5e, 0xd9, - 0x51, 0x58, 0x27, 0x4a, 0x45, 0x32, 0xfd, 0xb8, 0xb7, 0x03, 0x40, 0xef, 0x3b, 0x7a, 0xe9, 0x10, - 0x3f, 0xdb, 0x11, 0x2c, 0x20, 0x01, 0x01, 0x19, 0x50, 0x0c, 0xca, 0x59, 0xb5, 0xb4, 0xee, 0xc0, - 0xc5, 0x34, 0x43, 0x5c, 0x8a, 0x45, 0x0c, 0x6a, 0xbe, 0xa1, 0x75, 0xa3, 0x7e, 0xce, 0x6a, 0x31, - 0x2c, 0xf4, 0x12, 0x2a, 0x03, 0x2b, 0x2e, 0x71, 0x4c, 0xab, 0xad, 0xb2, 0x2e, 0x08, 0xac, 0x65, - 0x98, 0xb5, 0x5b, 0x47, 0x5b, 0xdb, 0x66, 0x9a, 0x8f, 0xa9, 0x62, 0xc4, 0xe8, 0xbc, 0x76, 0xb8, - 0x44, 0x79, 0x15, 0x66, 0xe3, 0x12, 0x75, 0x5c, 0x9f, 0x4e, 0x84, 0xfa, 0x94, 0x62, 0xc4, 0x65, - 0xe5, 0x54, 0x18, 0x77, 0x21, 0x3f, 0x94, 0x88, 0x53, 0xa9, 0xaf, 0xc3, 0xdc, 0xa1, 0x51, 0x3f, - 0x15, 0x50, 0x03, 0xaa, 0xc7, 0x05, 0xf4, 0x34, 0x78, 0xd2, 0xab, 0x24, 0xfc, 0x65, 0x1d, 0x13, - 0x2f, 0xc6, 0xeb, 0x8e, 0xd6, 0xdb, 0xf5, 0x37, 0x8b, 0x3a, 0x4c, 0xb7, 0xe8, 0xba, 0xa0, 0x1a, - 0x83, 0x7d, 0x81, 0x61, 0x66, 0x97, 0xcf, 0x87, 0x13, 0x3d, 0xbc, 0x53, 0x28, 0x85, 0xd6, 0xf0, - 0x96, 0x71, 0x17, 0xa6, 0x6c, 0x36, 0xc3, 0x55, 0x9d, 0x0d, 0x71, 0xfe, 0xfd, 0x28, 0x45, 0xbe, - 0x01, 0xa1, 0x21, 0xaf, 0x4c, 0xda, 0xe1, 0x91, 0x5f, 0x83, 0x3c, 0x5f, 0x26, 0x54, 0xdb, 0x9b, - 0x85, 0xfc, 0x23, 0x52, 0x8e, 0x59, 0x3c, 0xf8, 0xb4, 0x54, 0x72, 0x4e, 0x74, 0x7a, 0x2e, 0xc0, - 0x64, 0x6b, 0xbf, 0xa7, 0xb9, 0xae, 0xaa, 0x6b, 0xfa, 0x2e, 0xe6, 0x03, 0x3c, 0xeb, 0xd1, 0x6a, - 0x94, 0x24, 0x7d, 0x24, 0x40, 0x71, 0x38, 0x16, 0x6e, 0xcf, 0xb6, 0x5c, 0x8c, 0x6e, 0x87, 0x3f, - 0xeb, 0x23, 0x21, 0x18, 0x9e, 0x02, 0x1b, 0x89, 0xe0, 0xcb, 0x8e, 0x96, 0x41, 0xec, 0xf2, 0x56, - 0xe0, 0xc7, 0x9e, 0x8d, 0x6b, 0x93, 0x8d, 0x84, 0x12, 0xc8, 0xad, 0x8e, 0x41, 0xda, 0x24, 0xb8, - 0x2b, 0x7d, 0x97, 0x84, 0xd2, 0x3a, 0x26, 0xd1, 0xc9, 0xe0, 0xe7, 0xa7, 0x06, 0xb9, 0x67, 0xa6, - 0xe3, 0x12, 0xd5, 0xc1, 0xcf, 0x4d, 0xf7, 0xa4, 0xc9, 0x99, 0x62, 0x3a, 0x0a, 0x57, 0x41, 0x32, - 0xe4, 0x5d, 0xac, 0xdb, 0x96, 0x31, 0x40, 0x49, 0x9e, 0x00, 0x25, 0xe7, 0x29, 0x05, 0x30, 0x23, - 0x09, 0x4e, 0x9d, 0x35, 0xc1, 0xe9, 0x33, 0x27, 0x38, 0x33, 0x9a, 0xe0, 0x4f, 0x05, 0x98, 0x8b, - 0x89, 0x27, 0xcf, 0xb1, 0x1c, 0x37, 0x71, 0x47, 0xbc, 0x88, 0x2a, 0x6f, 0x24, 0x86, 0x87, 0xee, - 0x99, 0x12, 0xfe, 0x7d, 0x12, 0xce, 0x0f, 0x3b, 0x18, 0x69, 0xca, 0x0f, 0x49, 0x3f, 0x75, 0xd2, - 0x3f, 0x13, 0xe0, 0xc2, 0x21, 0x31, 0xfd, 0xf3, 0x24, 0xfe, 0xc7, 0x24, 0x54, 0x47, 0x2a, 0x73, - 0xc5, 0x32, 0x64, 0xa3, 0x8d, 0x3f, 0x74, 0xfc, 0xef, 0x4f, 0xfe, 0x57, 0x02, 0x2c, 0x1c, 0x11, - 0x57, 0x5e, 0x00, 0x2a, 0xcc, 0x0d, 0x15, 0x80, 0xaa, 0x59, 0x86, 0x8a, 0xa9, 0x10, 0x8f, 0xb1, - 0x74, 0x78, 0x29, 0xf8, 0x70, 0x1b, 0x09, 0xa5, 0xa8, 0xc7, 0x72, 0xce, 0x54, 0x1a, 0xf7, 0x20, - 0x4d, 0x41, 0xe8, 0x35, 0xca, 0xb5, 0xfb, 0x8e, 0x8e, 0xd5, 0xe0, 0xda, 0x26, 0x7a, 0x84, 0xba, - 0x41, 0x99, 0xc1, 0xf6, 0xcb, 0x2f, 0x2a, 0xa2, 0xbf, 0xca, 0x4a, 0xdf, 0x26, 0xa1, 0x18, 0xef, - 0xf2, 0x1f, 0x71, 0xcb, 0x40, 0xf7, 0x60, 0x4a, 0x33, 0x8c, 0x10, 0x42, 0xf2, 0xf8, 0x8b, 0xcf, - 0x24, 0xd3, 0xf0, 0x11, 0xd6, 0x68, 0x35, 0x74, 0xed, 0xe7, 0x21, 0x8c, 0xd4, 0xf1, 0x18, 0x39, - 0xae, 0xe3, 0xa3, 0x5c, 0x07, 0x7a, 0x6f, 0xe0, 0x59, 0xf3, 0xf6, 0xdf, 0x42, 0x58, 0x9f, 0x9e, - 0x58, 0x11, 0x2d, 0xfc, 0xc2, 0x3b, 0xfa, 0x2d, 0x98, 0xf2, 0x8d, 0x7a, 0x2a, 0x99, 0x43, 0x54, - 0x26, 0xb9, 0x18, 0x53, 0xbb, 0xfa, 0x89, 0x00, 0x33, 0x31, 0xbf, 0x2c, 0x50, 0x15, 0xce, 0xd7, - 0x36, 0x1f, 0x6d, 0xed, 0x34, 0x57, 0x9a, 0xf5, 0xcd, 0x86, 0xba, 0xdd, 0x54, 0x56, 0x9a, 0xf2, - 0xfa, 0x13, 0xb5, 0xde, 0x78, 0xbc, 0xf2, 0xb0, 0xbe, 0x56, 0x48, 0xa0, 0x0a, 0x94, 0x63, 0x25, - 0x76, 0x1a, 0xdb, 0x72, 0xb3, 0x20, 0x1c, 0xca, 0xdf, 0xde, 0x90, 0x1f, 0x3e, 0x2c, 0x24, 0xd1, - 0x45, 0x98, 0x8f, 0xe5, 0x37, 0x56, 0x9a, 0xf5, 0xc7, 0x72, 0x21, 0x75, 0xf5, 0x95, 0x00, 0x30, - 0xb8, 0xbe, 0xa1, 0x73, 0x30, 0x53, 0xdb, 0x58, 0x69, 0xac, 0xcb, 0x6a, 0xf3, 0xc9, 0x96, 0x1c, - 0x72, 0x64, 0x06, 0xf2, 0x61, 0x46, 0x43, 0xfe, 0x57, 0x41, 0x40, 0x45, 0x40, 0x61, 0xe2, 0x5a, - 0x5d, 0x91, 0x6b, 0xcd, 0x42, 0x12, 0x95, 0x60, 0x36, 0x8a, 0xc2, 0x39, 0x29, 0x34, 0x0f, 0xe7, - 0xc2, 0x9c, 0x9d, 0xc6, 0xf6, 0x96, 0x5c, 0xab, 0xdf, 0xaf, 0xcb, 0x6b, 0x85, 0xf4, 0xf2, 0x97, - 0x29, 0xc8, 0x34, 0x69, 0x0c, 0xd1, 0x53, 0xc8, 0x45, 0x97, 0x2a, 0xb4, 0x10, 0x0e, 0x71, 0xec, - 0xf2, 0x59, 0x96, 0x8e, 0x12, 0xf1, 0xba, 0x56, 0x4a, 0xfc, 0x4d, 0x40, 0x06, 0x4c, 0x8f, 0xb4, - 0x37, 0xba, 0x34, 0xa4, 0x1c, 0xbb, 0x3f, 0x95, 0x2f, 0x1f, 0x23, 0x15, 0xb2, 0xd2, 0x63, 0x3b, - 0xf2, 0xe8, 0x04, 0x41, 0x8b, 0x47, 0x61, 0x44, 0x0e, 0x74, 0xe5, 0x04, 0x92, 0x21, 0x8b, 0xff, - 0x8b, 0x59, 0x54, 0x82, 0xa6, 0xfd, 0xeb, 0x91, 0x9e, 0x0f, 0x4d, 0x8d, 0xf2, 0xf5, 0x13, 0x4a, - 0x0f, 0xac, 0xaf, 0x3e, 0x7d, 0xfd, 0xb6, 0x92, 0x78, 0xf3, 0xb6, 0x92, 0x78, 0xff, 0xb6, 0x22, - 0xfc, 0xff, 0xa0, 0x22, 0x7c, 0x7e, 0x50, 0x11, 0xbe, 0x39, 0xa8, 0x08, 0xaf, 0x0f, 0x2a, 0xc2, - 0xcf, 0x07, 0x15, 0xe1, 0x97, 0x83, 0x4a, 0xe2, 0xfd, 0x41, 0x45, 0xf8, 0xf8, 0x5d, 0x25, 0xf1, - 0xfa, 0x5d, 0x25, 0xf1, 0xe6, 0x5d, 0x25, 0x01, 0x39, 0xdd, 0xee, 0x86, 0x6c, 0xad, 0x02, 0xcb, - 0xff, 0x96, 0x63, 0x13, 0x7b, 0x4b, 0xf8, 0xf7, 0x38, 0x23, 0xf6, 0x5a, 0xad, 0x31, 0xf6, 0x3f, - 0xf3, 0xe6, 0x6f, 0x01, 0x00, 0x00, 0xff, 0xff, 0x44, 0x4a, 0xde, 0xeb, 0xde, 0x14, 0x00, 0x00, + // 1502 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x58, 0xbf, 0x6f, 0xdb, 0xc6, + 0x17, 0x17, 0xf5, 0xc3, 0x96, 0x9e, 0x6c, 0x89, 0x3e, 0x3b, 0xfe, 0xca, 0x72, 0xc2, 0x38, 0x44, + 0x02, 0x38, 0xf9, 0xa2, 0x4e, 0xe1, 0x20, 0x68, 0x9a, 0x22, 0x83, 0x2c, 0x31, 0xb6, 0x10, 0x47, + 0x76, 0xcf, 0x72, 0x82, 0x34, 0x03, 0x71, 0x22, 0x2f, 0x32, 0x51, 0x89, 0x54, 0xc9, 0x53, 0x62, + 0x67, 0xea, 0xda, 0xa5, 0xe8, 0xd8, 0xa9, 0x43, 0xa7, 0xee, 0x5d, 0xbb, 0x74, 0x6b, 0x87, 0x02, + 0x29, 0xba, 0x64, 0xe8, 0xd0, 0x38, 0x4b, 0xc7, 0xfc, 0x09, 0x05, 0xef, 0x28, 0x8a, 0x94, 0xe5, + 0x5f, 0xc8, 0xd2, 0xa1, 0xdb, 0xdd, 0xfb, 0xf1, 0x79, 0xef, 0xde, 0xe7, 0xee, 0xde, 0x91, 0x90, + 0x67, 0xc4, 0x6e, 0x3b, 0x2b, 0x3d, 0xd7, 0x61, 0x0e, 0x82, 0x7e, 0x8b, 0xba, 0x2b, 0x5c, 0xa2, + 0x7e, 0x0a, 0xd0, 0xf4, 0x07, 0x9a, 0xeb, 0x3a, 0x2e, 0xba, 0x0e, 0x69, 0xc3, 0x31, 0x69, 0x49, + 0x5a, 0x92, 0x96, 0x0b, 0xab, 0x17, 0x56, 0x86, 0x86, 0x2b, 0xdc, 0xa0, 0xea, 0x98, 0x14, 0x73, + 0x13, 0x54, 0x82, 0xc9, 0x2e, 0xf5, 0x3c, 0xd2, 0xa6, 0xa5, 0xe4, 0x92, 0xb4, 0x9c, 0xc3, 0x83, + 0xa9, 0x7a, 0x0b, 0x26, 0x31, 0xfd, 0xa2, 0x4f, 0x3d, 0x86, 0x64, 0x48, 0xf5, 0xdd, 0x0e, 0x87, + 0xcb, 0x61, 0x7f, 0x88, 0xe6, 0x61, 0xc2, 0x70, 0xba, 0x5d, 0x8b, 0x05, 0x5e, 0xc1, 0x4c, 0xfd, + 0x51, 0x02, 0x79, 0xad, 0x6f, 0x75, 0xcc, 0x1a, 0xf5, 0x0c, 0xd7, 0xea, 0x31, 0xcb, 0xb1, 0x7d, + 0x63, 0x97, 0x76, 0x1d, 0x46, 0x03, 0x84, 0x60, 0x86, 0x16, 0x20, 0xdb, 0x22, 0x1e, 0xd5, 0xbd, + 0x3d, 0x32, 0x08, 0xee, 0xcf, 0x77, 0xf6, 0x08, 0xba, 0x09, 0x59, 0x57, 0x04, 0xf7, 0x4a, 0xa9, + 0xa5, 0xd4, 0x72, 0x7e, 0x75, 0x36, 0xba, 0x8a, 0x20, 0x31, 0x1c, 0x1a, 0xa1, 0x4f, 0x20, 0xeb, + 0x31, 0x97, 0x30, 0xda, 0x3e, 0x28, 0xa5, 0xf9, 0xb2, 0x2f, 0x47, 0x1d, 0xaa, 0x4e, 0xb7, 0xd7, + 0x67, 0xc4, 0x4f, 0x67, 0x27, 0x30, 0xc3, 0xa1, 0x83, 0xfa, 0xab, 0x04, 0x53, 0x5b, 0x7d, 0xd6, + 0xeb, 0xb3, 0xaa, 0x63, 0x3f, 0xb3, 0xda, 0xe8, 0x0a, 0x4c, 0x59, 0xb6, 0xd1, 0xe9, 0x9b, 0x54, + 0x67, 0xa4, 0xed, 0xf1, 0xbc, 0xb3, 0x38, 0x1f, 0xc8, 0x9a, 0xa4, 0xed, 0xa1, 0x0f, 0x00, 0x0d, + 0x4c, 0x08, 0x63, 0xae, 0xd5, 0xea, 0x33, 0xea, 0xf1, 0x65, 0x64, 0xf1, 0x4c, 0xa0, 0xa9, 0x84, + 0x0a, 0x74, 0x0d, 0x0a, 0x03, 0xf3, 0x3d, 0xe2, 0xed, 0x51, 0x7f, 0x59, 0xbe, 0xe9, 0x74, 0x20, + 0xdd, 0xe0, 0x42, 0x74, 0x09, 0xc0, 0x75, 0x1c, 0xe6, 0xe9, 0x8e, 0xdd, 0x11, 0x0b, 0xc9, 0xe2, + 0x1c, 0x97, 0x6c, 0xd9, 0x9d, 0x03, 0x3f, 0xaf, 0x2e, 0xd9, 0xd7, 0x4d, 0xcb, 0x63, 0xc4, 0x36, + 0x68, 0x29, 0xb3, 0x24, 0x2d, 0x67, 0x70, 0xbe, 0x4b, 0xf6, 0x6b, 0x81, 0x48, 0x7d, 0x00, 0x85, + 0xa0, 0x3a, 0x5b, 0xbc, 0xfa, 0x1e, 0xfa, 0x18, 0x16, 0xe8, 0x3e, 0x73, 0x89, 0x4e, 0xf7, 0x45, + 0x02, 0xcf, 0xac, 0x0e, 0xf5, 0x74, 0x97, 0xb6, 0xe9, 0x7e, 0x49, 0x5a, 0x4a, 0x2d, 0xe7, 0xf0, + 0x3c, 0x37, 0xd0, 0x84, 0xfe, 0xbe, 0xaf, 0xc6, 0xbe, 0x56, 0xfd, 0x23, 0x09, 0x45, 0x1f, 0xa6, + 0x6b, 0xbd, 0xa4, 0x66, 0x93, 0xb8, 0x6d, 0xca, 0x50, 0x01, 0x92, 0x96, 0xc9, 0x2b, 0x92, 0xc1, + 0x49, 0xcb, 0x44, 0x08, 0xd2, 0xfe, 0x8a, 0x02, 0x06, 0xf9, 0x18, 0xdd, 0x84, 0x59, 0xd3, 0x72, + 0xa9, 0xc1, 0x74, 0x93, 0xf6, 0xa8, 0x6d, 0x52, 0xdb, 0xb0, 0xa8, 0x60, 0x32, 0x83, 0x91, 0x50, + 0xd5, 0x22, 0x1a, 0x1f, 0x84, 0x17, 0x3a, 0xcd, 0x2d, 0xf8, 0x18, 0x2d, 0x42, 0xce, 0xed, 0x77, + 0xa8, 0xce, 0x0e, 0x7a, 0x83, 0x95, 0x66, 0x7d, 0x41, 0xf3, 0xa0, 0x47, 0x7d, 0x07, 0xbf, 0x2c, + 0xa5, 0x09, 0x5e, 0x22, 0x3e, 0x46, 0x65, 0xc8, 0xd2, 0x7d, 0x46, 0x5d, 0x9b, 0x74, 0x4a, 0x93, + 0x5c, 0x1e, 0xce, 0xd1, 0x03, 0x80, 0x08, 0x4d, 0x59, 0xbe, 0xa5, 0xfe, 0x1f, 0xdd, 0x21, 0x23, + 0xcb, 0x5c, 0x19, 0x72, 0xa7, 0xd9, 0xcc, 0x3d, 0xc0, 0x11, 0xf7, 0xf2, 0x3d, 0x28, 0x8e, 0xa8, + 0xfd, 0x23, 0xf2, 0x39, 0x3d, 0x08, 0xca, 0xe2, 0x0f, 0xd1, 0x1c, 0x64, 0x9e, 0x93, 0x4e, 0x5f, + 0x9c, 0xab, 0x0c, 0x16, 0x93, 0xbb, 0xc9, 0x3b, 0x92, 0x5a, 0x07, 0x79, 0x24, 0x9a, 0x87, 0x6e, + 0xc3, 0x24, 0x13, 0x43, 0x4e, 0x49, 0x7e, 0x75, 0xf1, 0x84, 0xe4, 0xf0, 0xc0, 0x56, 0x6d, 0x42, + 0xa1, 0xba, 0x47, 0xec, 0xf6, 0x10, 0x68, 0x0d, 0x8a, 0x86, 0x90, 0xe8, 0x71, 0xc0, 0x85, 0xd8, + 0x79, 0x88, 0x3a, 0xe1, 0x82, 0x11, 0xc3, 0x50, 0xff, 0x94, 0x60, 0x3a, 0x66, 0x81, 0x3e, 0x82, + 0xbc, 0xb0, 0x11, 0x6c, 0x88, 0x8b, 0x65, 0xfe, 0x28, 0xa2, 0xcf, 0x0d, 0x06, 0x23, 0x1c, 0xa3, + 0xbb, 0x00, 0x4e, 0x67, 0x90, 0x0a, 0x2f, 0xc5, 0x29, 0x4b, 0xcb, 0x39, 0x9d, 0x41, 0xd0, 0xbb, + 0x00, 0x36, 0x7d, 0x31, 0xf0, 0x4d, 0x9d, 0xc1, 0xd7, 0xa6, 0x2f, 0x02, 0xdf, 0x32, 0x64, 0xc3, + 0x53, 0x92, 0x16, 0x7b, 0x67, 0x30, 0x57, 0x7f, 0x9e, 0x80, 0xec, 0x43, 0xca, 0x88, 0x49, 0x18, + 0x41, 0xbb, 0x30, 0x23, 0x02, 0xe8, 0x96, 0xa9, 0x77, 0x49, 0xaf, 0x67, 0xd9, 0xed, 0xa0, 0x62, + 0xd7, 0xa3, 0xb1, 0x06, 0x0e, 0x2b, 0x22, 0x40, 0xdd, 0x7c, 0x28, 0x6c, 0xc5, 0xee, 0x28, 0xb2, + 0xb8, 0xd4, 0x87, 0x0d, 0x37, 0x6f, 0x08, 0x9b, 0x3c, 0x01, 0x16, 0x07, 0x3b, 0x3b, 0x0e, 0xeb, + 0xc6, 0xa5, 0x48, 0xf3, 0x5b, 0x40, 0x3b, 0x04, 0x14, 0x57, 0xe3, 0xd5, 0x63, 0xf2, 0x6c, 0xc7, + 0xb0, 0x80, 0x85, 0x02, 0x64, 0xc2, 0x7c, 0xb8, 0x9d, 0x75, 0x9b, 0x74, 0x87, 0x29, 0xa6, 0x39, + 0xe2, 0xca, 0x58, 0xc4, 0x70, 0xcf, 0x37, 0x48, 0x37, 0x9e, 0xe7, 0x1c, 0x19, 0xa3, 0x42, 0x2f, + 0x41, 0x19, 0x46, 0xf1, 0x98, 0x6b, 0xd9, 0x6d, 0x9d, 0x9f, 0x82, 0x30, 0x5a, 0x86, 0x47, 0xbb, + 0x7d, 0x72, 0xb4, 0x1d, 0xee, 0xf9, 0xc8, 0x77, 0x8c, 0x05, 0x5d, 0x24, 0xc7, 0x5b, 0x94, 0xd7, + 0x60, 0x6e, 0x1c, 0x51, 0xa7, 0x9d, 0xd3, 0x5c, 0xe4, 0x9c, 0xfa, 0x18, 0xe3, 0x58, 0x39, 0x17, + 0xc6, 0x3d, 0x28, 0x8e, 0x10, 0x71, 0x2e, 0xf7, 0x75, 0x58, 0x38, 0xb6, 0xea, 0xe7, 0x02, 0x6a, + 0xc0, 0xd2, 0x69, 0x05, 0x3d, 0x0f, 0x9e, 0xfa, 0x55, 0x12, 0x2e, 0xac, 0x53, 0x26, 0x6a, 0xbc, + 0xee, 0x92, 0xde, 0xde, 0xe0, 0xb1, 0x50, 0x87, 0x99, 0x96, 0xff, 0x02, 0xd0, 0xcd, 0xe1, 0x13, + 0x80, 0x63, 0xe6, 0x57, 0x2f, 0x46, 0x89, 0x1e, 0x7d, 0x26, 0x60, 0xb9, 0x35, 0xfa, 0x70, 0xb8, + 0x07, 0xd3, 0x0e, 0x6f, 0xcb, 0xba, 0xc1, 0xfb, 0x72, 0x70, 0x7f, 0x94, 0x62, 0x77, 0x40, 0xa4, + 0x6f, 0xe3, 0x29, 0x27, 0xda, 0xc5, 0xab, 0x50, 0x0c, 0xde, 0x07, 0xba, 0x23, 0x7a, 0x61, 0x70, + 0x89, 0x94, 0xc7, 0xbc, 0x25, 0x82, 0x6e, 0x89, 0x0b, 0x6e, 0xbc, 0x7b, 0x5e, 0x81, 0xa9, 0xd6, + 0x41, 0x8f, 0x78, 0x9e, 0x6e, 0x10, 0x63, 0x8f, 0x06, 0x3d, 0x39, 0x2f, 0x64, 0x55, 0x5f, 0xa4, + 0x7e, 0x2d, 0xc1, 0xfc, 0x68, 0x2d, 0xbc, 0x9e, 0x63, 0x7b, 0x14, 0xdd, 0x89, 0x5e, 0xeb, 0x47, + 0x4a, 0x30, 0xda, 0x05, 0x36, 0x12, 0xe1, 0xcd, 0x8e, 0x56, 0x21, 0xdb, 0x0d, 0x8e, 0x42, 0xb0, + 0xec, 0xb9, 0x71, 0xc7, 0x64, 0x23, 0x81, 0x43, 0xbb, 0xb5, 0x09, 0x48, 0x5b, 0x8c, 0x76, 0xd5, + 0xdf, 0x92, 0x50, 0x5a, 0xa7, 0x2c, 0xde, 0x19, 0x06, 0xfc, 0x54, 0xa1, 0xf0, 0xcc, 0x72, 0x3d, + 0xa6, 0xbb, 0xf4, 0xb9, 0xe5, 0x9d, 0x95, 0x9c, 0x69, 0xee, 0x83, 0x03, 0x17, 0xa4, 0x41, 0xd1, + 0xa3, 0x86, 0x63, 0x9b, 0x43, 0x94, 0xe4, 0x19, 0x50, 0x0a, 0xc2, 0x29, 0x84, 0x39, 0x42, 0x70, + 0xea, 0x7d, 0x09, 0x4e, 0xbf, 0x37, 0xc1, 0x99, 0xa3, 0x04, 0x7f, 0x27, 0xc1, 0xc2, 0x98, 0x7a, + 0x06, 0x1c, 0x6b, 0xe3, 0x3a, 0xee, 0x91, 0x2c, 0xe2, 0xce, 0x1b, 0x89, 0xd1, 0xa6, 0xfb, 0x5e, + 0x84, 0xff, 0x9e, 0x84, 0x8b, 0xa3, 0x09, 0xc6, 0x0e, 0xe5, 0x7f, 0xa4, 0x9f, 0x9b, 0xf4, 0xef, + 0x25, 0xb8, 0x74, 0x4c, 0x4d, 0xff, 0x35, 0xc4, 0xdf, 0x70, 0x20, 0x17, 0x7e, 0xd1, 0xa1, 0x19, + 0x98, 0xd6, 0x30, 0xde, 0xc2, 0xfa, 0x6e, 0xe3, 0x41, 0x63, 0xeb, 0x71, 0x43, 0x4e, 0xa0, 0x59, + 0x28, 0x0a, 0x51, 0xb5, 0xd2, 0xa8, 0x6a, 0x9b, 0x9b, 0x5a, 0x4d, 0x96, 0x50, 0x01, 0x20, 0xb0, + 0xdb, 0xd1, 0xb0, 0x9c, 0x44, 0x45, 0xc8, 0x8b, 0x79, 0xbd, 0x71, 0x1f, 0x57, 0xe4, 0x14, 0x5a, + 0x80, 0x0b, 0x11, 0x81, 0x8e, 0xb5, 0x26, 0x7e, 0x52, 0x59, 0xdb, 0xd4, 0xe4, 0xf4, 0x8d, 0x6f, + 0x25, 0x98, 0x1d, 0xf3, 0x31, 0x85, 0x96, 0xe0, 0x62, 0x75, 0xeb, 0xe1, 0xf6, 0x6e, 0xb3, 0xd2, + 0xac, 0x6f, 0x35, 0xf4, 0x9d, 0x26, 0xae, 0x34, 0xb5, 0xf5, 0x27, 0x7a, 0xbd, 0xf1, 0xa8, 0xb2, + 0x59, 0xaf, 0xc9, 0x09, 0xa4, 0x40, 0x79, 0xac, 0xc5, 0x6e, 0x63, 0x47, 0x6b, 0xca, 0xd2, 0xb1, + 0xfa, 0x9d, 0x0d, 0x6d, 0x73, 0x53, 0x4e, 0xa2, 0xcb, 0xb0, 0x38, 0x56, 0xdf, 0xa8, 0x34, 0xeb, + 0x8f, 0x34, 0x39, 0x75, 0xa3, 0x03, 0x30, 0x7c, 0x84, 0xa2, 0xff, 0xc1, 0x6c, 0x75, 0xa3, 0xd2, + 0x58, 0xd7, 0xf4, 0xe6, 0x93, 0x6d, 0x2d, 0x92, 0xc7, 0x2c, 0x14, 0xa3, 0x8a, 0x86, 0xf6, 0x58, + 0x96, 0x46, 0xad, 0x6b, 0xda, 0xa6, 0xd6, 0xd4, 0x6a, 0x72, 0x72, 0x54, 0x21, 0xc6, 0x35, 0x39, + 0xb5, 0xfa, 0x53, 0x12, 0x32, 0xfc, 0x93, 0x1b, 0x3d, 0x85, 0x42, 0xfc, 0xf6, 0x47, 0x57, 0xa2, + 0xfc, 0x8d, 0xed, 0x92, 0x65, 0xf5, 0x24, 0x13, 0xb1, 0xbf, 0xd4, 0xc4, 0x87, 0x12, 0x32, 0x61, + 0xe6, 0xc8, 0xcd, 0x83, 0xae, 0x8e, 0x38, 0x8f, 0xbd, 0xe8, 0xcb, 0xd7, 0x4e, 0xb1, 0x8a, 0x44, + 0xe9, 0xf1, 0x66, 0x7e, 0x74, 0xab, 0xa3, 0xe5, 0x93, 0x30, 0x62, 0x0b, 0xba, 0x7e, 0x06, 0xcb, + 0x61, 0xc4, 0xb5, 0xa7, 0xaf, 0xde, 0x28, 0x89, 0xd7, 0x6f, 0x94, 0xc4, 0xbb, 0x37, 0x8a, 0xf4, + 0xe5, 0xa1, 0x22, 0xfd, 0x70, 0xa8, 0x48, 0xbf, 0x1c, 0x2a, 0xd2, 0xab, 0x43, 0x45, 0xfa, 0xeb, + 0x50, 0x91, 0xfe, 0x3e, 0x54, 0x12, 0xef, 0x0e, 0x15, 0xe9, 0x9b, 0xb7, 0x4a, 0xe2, 0xd5, 0x5b, + 0x25, 0xf1, 0xfa, 0xad, 0x92, 0x80, 0x82, 0xe1, 0x74, 0x23, 0x71, 0xd6, 0xc4, 0x4f, 0x8f, 0x6d, + 0xd7, 0x61, 0xce, 0xb6, 0xf4, 0xd9, 0x24, 0x17, 0xf6, 0x5a, 0xad, 0x09, 0xfe, 0x83, 0xe4, 0xd6, + 0x3f, 0x01, 0x00, 0x00, 0xff, 0xff, 0x2d, 0xd7, 0xb8, 0x66, 0x2f, 0x11, 0x00, 0x00, +} + +func (x ErrorCode) String() string { + s, ok := ErrorCode_name[int32(x)] + if ok { + return s + } + return strconv.Itoa(int(x)) } - func (x ComputationStrategy) String() string { s, ok := ComputationStrategy_name[int32(x)] if ok { @@ -1347,6 +1451,33 @@ func (x ChangeType) String() string { } return strconv.Itoa(int(x)) } +func (this *TangoError) Equal(that interface{}) bool { + if that == nil { + return this == nil + } + + that1, ok := that.(*TangoError) + if !ok { + that2, ok := that.(TangoError) + if ok { + that1 = &that2 + } else { + return false + } + } + if that1 == nil { + return this == nil + } else if this == nil { + return false + } + if this.Code != that1.Code { + return false + } + if this.Message != that1.Message { + return false + } + return true +} func (this *Request) Equal(that interface{}) bool { if that == nil { return this == nil @@ -2028,6 +2159,17 @@ func (this *GetChangedTargetGraphResponse_Metadata) Equal(that interface{}) bool } return true } +func (this *TangoError) GoString() string { + if this == nil { + return "nil" + } + s := make([]string, 0, 6) + s = append(s, "&tangopb.TangoError{") + s = append(s, "Code: "+fmt.Sprintf("%#v", this.Code)+",\n") + s = append(s, "Message: "+fmt.Sprintf("%#v", this.Message)+",\n") + s = append(s, "}") + return strings.Join(s, "") +} func (this *Request) GoString() string { if this == nil { return "nil" @@ -2058,7 +2200,7 @@ func (this *OutputConfig) GoString() string { if this == nil { return "nil" } - s := make([]string, 0, 10) + s := make([]string, 0, 9) s = append(s, "&tangopb.OutputConfig{") s = append(s, "IncludeTags: "+fmt.Sprintf("%#v", this.IncludeTags)+",\n") s = append(s, "IncludeAttributes: "+fmt.Sprintf("%#v", this.IncludeAttributes)+",\n") @@ -2377,6 +2519,41 @@ func valueToGoStringTango(v interface{}, typ string) string { pv := reflect.Indirect(rv).Interface() return fmt.Sprintf("func(v %v) *%v { return &v } ( %#v )", typ, typ, pv) } +func (m *TangoError) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *TangoError) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *TangoError) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.Message) > 0 { + i -= len(m.Message) + copy(dAtA[i:], m.Message) + i = encodeVarintTango(dAtA, i, uint64(len(m.Message))) + i-- + dAtA[i] = 0x12 + } + if m.Code != 0 { + i = encodeVarintTango(dAtA, i, uint64(m.Code)) + i-- + dAtA[i] = 0x8 + } + return len(dAtA) - i, nil +} + func (m *Request) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -3375,7 +3552,6 @@ func (m *GetChangedTargetGraphResponse_Metadata) MarshalToSizedBuffer(dAtA []byt } return len(dAtA) - i, nil } - func encodeVarintTango(dAtA []byte, offset int, v uint64) int { offset -= sovTango(v) base := offset @@ -3387,6 +3563,22 @@ func encodeVarintTango(dAtA []byte, offset int, v uint64) int { dAtA[offset] = uint8(v) return base } +func (m *TangoError) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Code != 0 { + n += 1 + sovTango(uint64(m.Code)) + } + l = len(m.Message) + if l > 0 { + n += 1 + l + sovTango(uint64(l)) + } + return n +} + func (m *Request) Size() (n int) { if m == nil { return 0 @@ -3806,12 +3998,24 @@ func (m *GetChangedTargetGraphResponse_Metadata) Size() (n int) { } return n } + func sovTango(x uint64) (n int) { return (math_bits.Len64(x|1) + 6) / 7 } func sozTango(x uint64) (n int) { return sovTango(uint64((x << 1) ^ uint64((int64(x) >> 63)))) } +func (this *TangoError) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&TangoError{`, + `Code:` + fmt.Sprintf("%v", this.Code) + `,`, + `Message:` + fmt.Sprintf("%v", this.Message) + `,`, + `}`, + }, "") + return s +} func (this *Request) String() string { if this == nil { return "nil" @@ -4138,6 +4342,107 @@ func valueToStringTango(v interface{}) string { pv := reflect.Indirect(rv).Interface() return fmt.Sprintf("*%v", pv) } +func (m *TangoError) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTango + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: TangoError: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: TangoError: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Code", wireType) + } + m.Code = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTango + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Code |= ErrorCode(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Message", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTango + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTango + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTango + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Message = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipTango(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthTango + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} func (m *Request) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 diff --git a/tangopb/tango.pb.yarpc.go b/tangopb/tango.pb.yarpc.go index dea80b0c..26d51071 100644 --- a/tangopb/tango.pb.yarpc.go +++ b/tangopb/tango.pb.yarpc.go @@ -463,103 +463,96 @@ var ( var yarpcFileDescriptorClosurec4210c857dbeec96 = [][]byte{ // tango.proto []byte{ - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x58, 0x4b, 0x6f, 0xdb, 0x46, - 0x10, 0x36, 0x29, 0xc9, 0xa6, 0x47, 0xb6, 0x24, 0xaf, 0x5d, 0x45, 0x96, 0xf3, 0x90, 0x89, 0x04, - 0x75, 0x92, 0xc6, 0x29, 0x1c, 0x04, 0x4d, 0x53, 0x04, 0x88, 0x2d, 0x33, 0xb6, 0x90, 0x44, 0x36, - 0x68, 0x39, 0x45, 0xda, 0x03, 0xb1, 0x22, 0x37, 0x32, 0x51, 0x89, 0x54, 0xc9, 0x55, 0x62, 0x07, - 0xfd, 0x03, 0xb9, 0xf4, 0xdc, 0x53, 0x0f, 0xfd, 0x0b, 0xbd, 0xf5, 0xd4, 0x5e, 0x0b, 0xf4, 0x50, - 0x14, 0xbd, 0xf5, 0x77, 0xf4, 0x5c, 0xec, 0x72, 0x49, 0x91, 0x12, 0xfd, 0xaa, 0x7b, 0xe8, 0x21, - 0x37, 0x72, 0x1e, 0xdf, 0xcc, 0xce, 0x83, 0x33, 0x4b, 0xc8, 0x53, 0xec, 0x74, 0xdc, 0xd5, 0xbe, - 0xe7, 0x52, 0x17, 0xc1, 0xa0, 0x4d, 0xbc, 0x55, 0x4e, 0x51, 0xef, 0xc1, 0x94, 0x4e, 0xbe, 0x1e, - 0x10, 0x9f, 0xa2, 0x12, 0x64, 0x06, 0x5e, 0xb7, 0x22, 0xd5, 0xa4, 0x95, 0x69, 0x9d, 0x3d, 0xa2, - 0x32, 0x4c, 0x9a, 0x6e, 0xaf, 0x67, 0xd3, 0x8a, 0xcc, 0x89, 0xe2, 0x4d, 0xfd, 0x51, 0x82, 0xd2, - 0xc6, 0xc0, 0xee, 0x5a, 0x9b, 0xc4, 0x37, 0x3d, 0xbb, 0x4f, 0x6d, 0xd7, 0x61, 0xc2, 0x1e, 0xe9, - 0xb9, 0x94, 0x08, 0x04, 0xf1, 0x86, 0x16, 0x41, 0x69, 0x63, 0x9f, 0x18, 0xfe, 0x01, 0x16, 0x30, - 0x53, 0xec, 0x7d, 0xef, 0x00, 0xa3, 0xbb, 0xa0, 0x78, 0x81, 0x71, 0xbf, 0x92, 0xa9, 0x65, 0x56, - 0xf2, 0x6b, 0xf3, 0xab, 0x43, 0xdf, 0x56, 0x85, 0x63, 0x7a, 0x24, 0x84, 0x3e, 0x03, 0xc5, 0xa7, - 0x1e, 0xa6, 0xa4, 0x73, 0x54, 0xc9, 0xd6, 0xa4, 0x95, 0xc2, 0xda, 0xb5, 0xb8, 0x42, 0xdd, 0xed, - 0xf5, 0x07, 0x14, 0x33, 0x77, 0xf6, 0x84, 0x98, 0x1e, 0x29, 0xa8, 0x7f, 0x4b, 0x30, 0xb3, 0x33, - 0xa0, 0xfd, 0x01, 0xad, 0xbb, 0xce, 0x2b, 0xbb, 0x83, 0x96, 0x61, 0xc6, 0x76, 0xcc, 0xee, 0xc0, - 0x22, 0x06, 0xc5, 0x1d, 0x9f, 0xfb, 0xad, 0xe8, 0x79, 0x41, 0x6b, 0xe1, 0x8e, 0x8f, 0xee, 0x00, - 0x0a, 0x45, 0x30, 0xa5, 0x9e, 0xdd, 0x1e, 0x50, 0xe2, 0xf3, 0x63, 0x28, 0xfa, 0x9c, 0xe0, 0xac, - 0x47, 0x0c, 0x74, 0x03, 0x0a, 0xa1, 0xf8, 0x01, 0xf6, 0x0f, 0x08, 0x3b, 0x16, 0x13, 0x9d, 0x15, - 0xd4, 0x6d, 0x4e, 0x44, 0x57, 0x00, 0x3c, 0xd7, 0xa5, 0xbe, 0xe1, 0x3a, 0xdd, 0xe0, 0x20, 0x8a, - 0x3e, 0xcd, 0x29, 0x3b, 0x4e, 0xf7, 0x08, 0xdd, 0x86, 0x39, 0x93, 0x9f, 0x84, 0x18, 0x96, 0xed, - 0x53, 0xec, 0x98, 0xc4, 0xaf, 0xe4, 0xb8, 0x54, 0x49, 0x30, 0x36, 0x43, 0x3a, 0x3b, 0x44, 0x0f, - 0x1f, 0x46, 0x82, 0x95, 0xc9, 0x9a, 0xb4, 0x92, 0xd3, 0xf3, 0x3d, 0x7c, 0x18, 0xca, 0xa8, 0x4f, - 0xa1, 0x20, 0x42, 0xb9, 0xc3, 0x53, 0xe5, 0xa3, 0x4f, 0x61, 0x91, 0x1c, 0x52, 0x0f, 0x1b, 0xe4, - 0x30, 0xf0, 0xf6, 0x95, 0xdd, 0x25, 0xbe, 0xe1, 0x91, 0x0e, 0x39, 0xac, 0x48, 0xb5, 0xcc, 0xca, - 0xb4, 0x5e, 0xe6, 0x02, 0x5a, 0xc0, 0x7f, 0xc2, 0xd8, 0x3a, 0xe3, 0xaa, 0x7f, 0xc8, 0x50, 0x64, - 0x30, 0x3d, 0xfb, 0x2d, 0xb1, 0x5a, 0xd8, 0xeb, 0x10, 0x8a, 0x0a, 0x20, 0xdb, 0x16, 0x0f, 0x5f, - 0x4e, 0x97, 0x6d, 0x0b, 0x21, 0xc8, 0xb2, 0xe3, 0x8b, 0x74, 0xf3, 0x67, 0x74, 0x17, 0xe6, 0x2d, - 0xdb, 0x23, 0x26, 0x35, 0x2c, 0xd2, 0x27, 0x8e, 0x45, 0x1c, 0xd3, 0x26, 0x41, 0xda, 0x73, 0x3a, - 0x0a, 0x58, 0x9b, 0x31, 0x0e, 0x03, 0xe1, 0x59, 0xc9, 0x72, 0x09, 0xfe, 0x8c, 0x96, 0x60, 0xda, - 0x1b, 0x74, 0x89, 0x41, 0x8f, 0xfa, 0x84, 0x47, 0x24, 0xa7, 0x2b, 0x8c, 0xd0, 0x3a, 0xea, 0x13, - 0xa6, 0xc0, 0x62, 0xc8, 0x23, 0xa0, 0xe8, 0xfc, 0x19, 0x55, 0x41, 0x21, 0x87, 0x94, 0x78, 0x0e, - 0xee, 0x56, 0xa6, 0x38, 0x3d, 0x7a, 0x47, 0x4f, 0x01, 0x62, 0x39, 0x55, 0x78, 0xfd, 0xdd, 0x8e, - 0x97, 0xd3, 0xc8, 0x31, 0x57, 0x87, 0x89, 0xd6, 0x1c, 0xea, 0x1d, 0xe9, 0x31, 0xf5, 0xea, 0x23, - 0x28, 0x8e, 0xb0, 0x59, 0x3f, 0x7d, 0x45, 0x8e, 0x44, 0x58, 0xd8, 0x23, 0x5a, 0x80, 0xdc, 0x6b, - 0xdc, 0x1d, 0x10, 0x1e, 0x98, 0x9c, 0x1e, 0xbc, 0x3c, 0x94, 0x1f, 0x48, 0x6a, 0x03, 0x4a, 0x23, - 0xd6, 0x7c, 0x74, 0x1f, 0xa6, 0x68, 0xf0, 0xc8, 0x53, 0x92, 0x5f, 0x5b, 0x3a, 0xc1, 0x39, 0x3d, - 0x94, 0x55, 0x5b, 0x50, 0xa8, 0x1f, 0x60, 0xa7, 0x33, 0x04, 0xda, 0x80, 0xa2, 0x19, 0x50, 0x8c, - 0x24, 0xe0, 0x62, 0xa2, 0x79, 0xe2, 0x4a, 0x7a, 0xc1, 0x4c, 0x60, 0xa8, 0x7f, 0x49, 0x30, 0x9b, - 0x90, 0x40, 0x9f, 0x40, 0x3e, 0x90, 0x09, 0xb2, 0x21, 0xf1, 0x76, 0x2c, 0x8f, 0x23, 0xb2, 0xdc, - 0xe8, 0x60, 0x46, 0xcf, 0xe8, 0x21, 0x80, 0xdb, 0x0d, 0x5d, 0xe1, 0xa1, 0x38, 0xe5, 0x68, 0xd3, - 0x6e, 0x37, 0x34, 0xfa, 0x10, 0xc0, 0x21, 0x6f, 0x42, 0xdd, 0xcc, 0x19, 0x74, 0x1d, 0xf2, 0x46, - 0xe8, 0x56, 0x41, 0x89, 0xba, 0x24, 0x1b, 0xd4, 0x4e, 0xf8, 0xae, 0xfe, 0x32, 0x09, 0xca, 0x73, - 0x42, 0xb1, 0x85, 0x29, 0x46, 0xfb, 0x30, 0x17, 0x18, 0x30, 0x6c, 0xcb, 0xe8, 0xe1, 0x7e, 0xdf, - 0x76, 0x3a, 0x22, 0x62, 0x37, 0xe3, 0xb6, 0x42, 0x85, 0xd5, 0xc0, 0x40, 0xc3, 0x7a, 0x1e, 0xc8, - 0x06, 0xd5, 0x51, 0xa4, 0x49, 0x2a, 0x83, 0x8d, 0x8a, 0x37, 0x82, 0x95, 0x4f, 0x80, 0xd5, 0x45, - 0x65, 0x27, 0x61, 0xbd, 0x24, 0x15, 0x69, 0xec, 0xe3, 0xde, 0x89, 0x00, 0x83, 0xef, 0xe8, 0xf5, - 0x63, 0xfc, 0xec, 0x24, 0xb0, 0x80, 0x46, 0x04, 0x64, 0x41, 0x39, 0x2a, 0x67, 0xc3, 0xc1, 0xbd, - 0xa1, 0x8b, 0x59, 0x8e, 0xb8, 0x9a, 0x8a, 0x18, 0xd5, 0x7c, 0x13, 0xf7, 0x92, 0x7e, 0x2e, 0xe0, - 0x14, 0x16, 0x7a, 0x0b, 0x57, 0x87, 0x56, 0x7c, 0xea, 0xd9, 0x4e, 0xc7, 0xe0, 0x5d, 0x10, 0x59, - 0xcb, 0x71, 0x6b, 0xf7, 0x4f, 0xb6, 0xb6, 0xc7, 0x35, 0x5f, 0x30, 0xc5, 0x84, 0xd1, 0x25, 0x7c, - 0xbc, 0x44, 0x75, 0x03, 0x16, 0xd2, 0x12, 0x75, 0x5a, 0x9f, 0x4e, 0xc7, 0xfa, 0x94, 0x61, 0xa4, - 0x65, 0xe5, 0x5c, 0x18, 0x8f, 0xa0, 0x38, 0x92, 0x88, 0x73, 0xa9, 0x6f, 0xc1, 0xe2, 0xb1, 0x51, - 0x3f, 0x17, 0x50, 0x13, 0x6a, 0xa7, 0x05, 0xf4, 0x3c, 0x78, 0xea, 0x3b, 0x19, 0x3e, 0xd8, 0x22, - 0x34, 0x88, 0xf1, 0x96, 0x87, 0xfb, 0x07, 0xe1, 0x66, 0xd1, 0x80, 0xb9, 0x36, 0x5b, 0x17, 0x0c, - 0x6b, 0xb8, 0x2f, 0x70, 0xcc, 0xfc, 0xda, 0xe5, 0x78, 0xa2, 0x47, 0x77, 0x0a, 0xbd, 0xd4, 0x1e, - 0xdd, 0x32, 0x1e, 0xc1, 0xac, 0xcb, 0x67, 0xb8, 0x61, 0xf2, 0x21, 0x2e, 0xbe, 0x1f, 0x95, 0xc4, - 0x37, 0x20, 0x36, 0xe4, 0xf5, 0x19, 0x37, 0x3e, 0xf2, 0xeb, 0x50, 0x14, 0xcb, 0x84, 0xe1, 0x06, - 0xb3, 0x50, 0x7c, 0x44, 0xaa, 0x29, 0x8b, 0x87, 0x98, 0x96, 0x7a, 0xc1, 0x4b, 0x4e, 0xcf, 0x65, - 0x98, 0x69, 0x1f, 0xf5, 0xb1, 0xef, 0x1b, 0x26, 0x36, 0x0f, 0x88, 0x18, 0xe0, 0xf9, 0x80, 0x56, - 0x67, 0x24, 0xf5, 0x5b, 0x09, 0xca, 0xa3, 0xb1, 0xf0, 0xfb, 0xae, 0xe3, 0x13, 0xf4, 0x20, 0xfe, - 0x59, 0x1f, 0x0b, 0xc1, 0xe8, 0x14, 0xd8, 0x9e, 0x88, 0xbe, 0xec, 0x68, 0x0d, 0x94, 0x9e, 0x68, - 0x05, 0x71, 0xec, 0x85, 0xb4, 0x36, 0xd9, 0x9e, 0xd0, 0x23, 0xb9, 0x8d, 0x49, 0xc8, 0xda, 0x94, - 0xf4, 0xd4, 0xdf, 0x64, 0xa8, 0x6c, 0x11, 0x9a, 0x9c, 0x0c, 0x61, 0x7e, 0xea, 0x50, 0x78, 0x65, - 0x7b, 0x3e, 0x35, 0x3c, 0xf2, 0xda, 0xf6, 0xcf, 0x9a, 0x9c, 0x59, 0xae, 0xa3, 0x0b, 0x15, 0xa4, - 0x41, 0xd1, 0x27, 0xa6, 0xeb, 0x58, 0x43, 0x14, 0xf9, 0x0c, 0x28, 0x85, 0x40, 0x29, 0x82, 0x19, - 0x4b, 0x70, 0xe6, 0xa2, 0x09, 0xce, 0x5e, 0x38, 0xc1, 0xb9, 0xf1, 0x04, 0x7f, 0x2f, 0xc1, 0x62, - 0x4a, 0x3c, 0x45, 0x8e, 0xb5, 0xb4, 0x89, 0x3b, 0xe6, 0x45, 0x52, 0x79, 0x7b, 0x62, 0x74, 0xe8, - 0x5e, 0x28, 0xe1, 0xbf, 0xcb, 0x70, 0x79, 0xd4, 0xc1, 0x44, 0x53, 0xbe, 0x4f, 0xfa, 0xb9, 0x93, - 0xfe, 0x83, 0x04, 0x57, 0x8e, 0x89, 0xe9, 0xff, 0x27, 0xf1, 0x7f, 0xca, 0x50, 0x1b, 0xab, 0xcc, - 0x75, 0xc7, 0xd2, 0xac, 0x0e, 0x79, 0xdf, 0xf1, 0xff, 0x3e, 0xf9, 0x3f, 0x4b, 0xb0, 0x7c, 0x42, - 0x5c, 0x45, 0x01, 0x18, 0xb0, 0x38, 0x52, 0x00, 0x06, 0x76, 0x2c, 0x83, 0x30, 0x21, 0x11, 0x63, - 0xf5, 0xf8, 0x52, 0x08, 0xe1, 0xb6, 0x27, 0xf4, 0xb2, 0x99, 0xca, 0xb9, 0x50, 0x69, 0x3c, 0x86, - 0x2c, 0x03, 0x61, 0xd7, 0x28, 0xdf, 0x1d, 0x78, 0x26, 0x31, 0xa2, 0x6b, 0x9b, 0x12, 0x10, 0x1a, - 0x16, 0x63, 0x46, 0xdb, 0xaf, 0xb8, 0xa8, 0x28, 0xe1, 0x2a, 0xab, 0xfe, 0x2a, 0x43, 0x39, 0xdd, - 0xe5, 0xff, 0xe2, 0x96, 0x81, 0x1e, 0xc3, 0x2c, 0xb6, 0xac, 0x18, 0x82, 0x7c, 0xfa, 0xc5, 0x67, - 0x86, 0x6b, 0x84, 0x08, 0x9b, 0xac, 0x1a, 0x7a, 0xee, 0xeb, 0x18, 0x46, 0xe6, 0x74, 0x8c, 0x82, - 0xd0, 0x09, 0x51, 0xee, 0x00, 0xbb, 0x37, 0x88, 0xac, 0x05, 0xfb, 0x6f, 0x29, 0xae, 0xcf, 0x4e, - 0xac, 0x2b, 0x0e, 0x79, 0x13, 0x1c, 0xfd, 0x3e, 0xcc, 0x86, 0x46, 0x03, 0x95, 0xdc, 0x31, 0x2a, - 0x33, 0x42, 0x8c, 0xab, 0xdd, 0xfa, 0x4e, 0x82, 0xf9, 0x94, 0x5f, 0x16, 0xa8, 0x06, 0x97, 0xeb, - 0x3b, 0xcf, 0x77, 0xf7, 0x5b, 0xeb, 0xad, 0xc6, 0x4e, 0xd3, 0xd8, 0x6b, 0xe9, 0xeb, 0x2d, 0x6d, - 0xeb, 0xa5, 0xd1, 0x68, 0xbe, 0x58, 0x7f, 0xd6, 0xd8, 0x2c, 0x4d, 0xa0, 0xab, 0x50, 0x4d, 0x95, - 0xd8, 0x6f, 0xee, 0x69, 0xad, 0x92, 0x74, 0x2c, 0x7f, 0x6f, 0x5b, 0x7b, 0xf6, 0xac, 0x24, 0xa3, - 0x6b, 0xb0, 0x94, 0xca, 0x6f, 0xae, 0xb7, 0x1a, 0x2f, 0xb4, 0x52, 0xe6, 0xd6, 0x3b, 0x09, 0x60, - 0x78, 0x7d, 0x43, 0x97, 0x60, 0xbe, 0xbe, 0xbd, 0xde, 0xdc, 0xd2, 0x8c, 0xd6, 0xcb, 0x5d, 0x2d, - 0xe6, 0xc8, 0x3c, 0x14, 0xe3, 0x8c, 0xa6, 0xf6, 0x79, 0x49, 0x42, 0x65, 0x40, 0x71, 0xe2, 0x66, - 0x43, 0xd7, 0xea, 0xad, 0x92, 0x8c, 0x2a, 0xb0, 0x90, 0x44, 0x11, 0x9c, 0x0c, 0x5a, 0x82, 0x4b, - 0x71, 0xce, 0x7e, 0x73, 0x6f, 0x57, 0xab, 0x37, 0x9e, 0x34, 0xb4, 0xcd, 0x52, 0x76, 0xed, 0xa7, - 0x0c, 0xe4, 0x5a, 0x2c, 0x86, 0xe8, 0x4b, 0x28, 0x24, 0x97, 0x2a, 0xb4, 0x1c, 0x0f, 0x71, 0xea, - 0xf2, 0x59, 0x55, 0x4f, 0x12, 0x09, 0xba, 0x56, 0x9d, 0xf8, 0x58, 0x42, 0x16, 0xcc, 0x8d, 0xb5, - 0x37, 0xba, 0x3e, 0xa2, 0x9c, 0xba, 0x3f, 0x55, 0x6f, 0x9c, 0x22, 0x15, 0xb3, 0xd2, 0xe7, 0x3b, - 0xf2, 0xf8, 0x04, 0x41, 0x2b, 0x27, 0x61, 0x24, 0x0e, 0x74, 0xf3, 0x0c, 0x92, 0x31, 0x8b, 0xdf, - 0xa4, 0x2c, 0x2a, 0x51, 0xd3, 0x7e, 0x74, 0xa2, 0xe7, 0x23, 0x53, 0xa3, 0x7a, 0xe7, 0x8c, 0xd2, - 0x43, 0xeb, 0x1b, 0x1f, 0x42, 0xc1, 0x74, 0x7b, 0x31, 0xbd, 0x0d, 0xe0, 0xb9, 0xdc, 0xf5, 0x5c, - 0xea, 0xee, 0x4a, 0x5f, 0x4c, 0x71, 0x62, 0xbf, 0xdd, 0x9e, 0xe4, 0xff, 0x26, 0xef, 0xfd, 0x13, - 0x00, 0x00, 0xff, 0xff, 0x1f, 0xa0, 0x74, 0x84, 0xaa, 0x14, 0x00, 0x00, + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x58, 0x3b, 0x73, 0xdb, 0xc6, + 0x16, 0x16, 0x40, 0x52, 0x22, 0x0f, 0x25, 0x12, 0x5a, 0xc9, 0xba, 0x14, 0xe5, 0x87, 0x8c, 0xb1, + 0xe7, 0xca, 0xbe, 0x73, 0xe5, 0x3b, 0xf2, 0x78, 0xae, 0xe3, 0x8c, 0x0b, 0x8a, 0x84, 0x25, 0x8e, + 0x65, 0x4a, 0x59, 0x41, 0xf6, 0x38, 0x29, 0x30, 0x4b, 0x60, 0x4d, 0x61, 0x42, 0x3c, 0x02, 0x2c, + 0x6d, 0xd1, 0xff, 0x20, 0x4d, 0xea, 0x54, 0x29, 0xf2, 0x17, 0xd2, 0xa6, 0x49, 0x99, 0x22, 0x45, + 0x26, 0x6d, 0x7e, 0x4c, 0x06, 0xbb, 0x20, 0x08, 0x90, 0xd4, 0x6b, 0xdc, 0xa4, 0x48, 0xb7, 0x7b, + 0x1e, 0xdf, 0x39, 0x7b, 0xbe, 0xdd, 0x3d, 0x0b, 0x40, 0x99, 0x11, 0xb7, 0xe7, 0x6d, 0xfb, 0x81, + 0xc7, 0x3c, 0x04, 0x83, 0x2e, 0x0d, 0xb6, 0xb9, 0x44, 0xfd, 0x02, 0x40, 0x8f, 0x06, 0x5a, 0x10, + 0x78, 0x01, 0x7a, 0x00, 0x79, 0xd3, 0xb3, 0x68, 0x4d, 0xda, 0x94, 0xb6, 0x2a, 0x3b, 0x37, 0xb6, + 0xc7, 0x86, 0xdb, 0xdc, 0xa0, 0xe9, 0x59, 0x14, 0x73, 0x13, 0x54, 0x83, 0x05, 0x87, 0x86, 0x21, + 0xe9, 0xd1, 0x9a, 0xbc, 0x29, 0x6d, 0x95, 0xf0, 0x68, 0xaa, 0x3e, 0x86, 0x05, 0x4c, 0xbf, 0x19, + 0xd0, 0x90, 0x21, 0x05, 0x72, 0x83, 0xa0, 0xcf, 0xe1, 0x4a, 0x38, 0x1a, 0xa2, 0x35, 0x98, 0x37, + 0x3d, 0xc7, 0xb1, 0x59, 0xec, 0x15, 0xcf, 0xd4, 0x9f, 0x24, 0x50, 0x76, 0x07, 0x76, 0xdf, 0x6a, + 0xd1, 0xd0, 0x0c, 0x6c, 0x9f, 0xd9, 0x9e, 0x1b, 0x19, 0x07, 0xd4, 0xf1, 0x18, 0x8d, 0x11, 0xe2, + 0x19, 0x5a, 0x87, 0x62, 0x97, 0x84, 0xd4, 0x08, 0x4f, 0xc9, 0x28, 0x78, 0x34, 0x3f, 0x3e, 0x25, + 0xe8, 0x11, 0x14, 0x03, 0x11, 0x3c, 0xac, 0xe5, 0x36, 0x73, 0x5b, 0xe5, 0x9d, 0x95, 0xf4, 0x2a, + 0xe2, 0xc4, 0x70, 0x62, 0x84, 0x3e, 0x87, 0x62, 0xc8, 0x02, 0xc2, 0x68, 0x6f, 0x58, 0xcb, 0xf3, + 0x65, 0xdf, 0x49, 0x3b, 0x34, 0x3d, 0xc7, 0x1f, 0x30, 0x12, 0xa5, 0x73, 0x1c, 0x9b, 0xe1, 0xc4, + 0x41, 0xfd, 0x55, 0x82, 0xc5, 0xc3, 0x01, 0xf3, 0x07, 0xac, 0xe9, 0xb9, 0xef, 0xec, 0x1e, 0xba, + 0x0b, 0x8b, 0xb6, 0x6b, 0xf6, 0x07, 0x16, 0x35, 0x18, 0xe9, 0x85, 0x3c, 0xef, 0x22, 0x2e, 0xc7, + 0x32, 0x9d, 0xf4, 0x42, 0xf4, 0x5f, 0x40, 0x23, 0x13, 0xc2, 0x58, 0x60, 0x77, 0x07, 0x8c, 0x86, + 0x7c, 0x19, 0x45, 0xbc, 0x1c, 0x6b, 0x1a, 0x89, 0x02, 0xdd, 0x87, 0xca, 0xc8, 0xfc, 0x94, 0x84, + 0xa7, 0x34, 0x5a, 0x56, 0x64, 0xba, 0x14, 0x4b, 0xf7, 0xb9, 0x10, 0xdd, 0x02, 0x08, 0x3c, 0x8f, + 0x85, 0x86, 0xe7, 0xf6, 0xc5, 0x42, 0x8a, 0xb8, 0xc4, 0x25, 0x87, 0x6e, 0x7f, 0x18, 0xe5, 0xe5, + 0x90, 0x33, 0xc3, 0xb2, 0x43, 0x46, 0x5c, 0x93, 0xd6, 0x0a, 0x9b, 0xd2, 0x56, 0x01, 0x97, 0x1d, + 0x72, 0xd6, 0x8a, 0x45, 0xea, 0x4b, 0xa8, 0xc4, 0xd5, 0x39, 0xe4, 0xd5, 0x0f, 0xd1, 0x67, 0xb0, + 0x4e, 0xcf, 0x58, 0x40, 0x0c, 0x7a, 0x26, 0x12, 0x78, 0x67, 0xf7, 0x69, 0x68, 0x04, 0xb4, 0x47, + 0xcf, 0x6a, 0xd2, 0x66, 0x6e, 0xab, 0x84, 0xd7, 0xb8, 0x81, 0x26, 0xf4, 0x2f, 0x22, 0x35, 0x8e, + 0xb4, 0xea, 0x1f, 0x32, 0x54, 0x23, 0x18, 0xc7, 0xfe, 0x48, 0x2d, 0x9d, 0x04, 0x3d, 0xca, 0x50, + 0x05, 0x64, 0xdb, 0xe2, 0x15, 0x29, 0x60, 0xd9, 0xb6, 0x10, 0x82, 0x7c, 0xb4, 0xa2, 0x98, 0x41, + 0x3e, 0x46, 0x8f, 0x60, 0xc5, 0xb2, 0x03, 0x6a, 0x32, 0xc3, 0xa2, 0x3e, 0x75, 0x2d, 0xea, 0x9a, + 0x36, 0x15, 0x4c, 0x16, 0x30, 0x12, 0xaa, 0x56, 0x4a, 0x13, 0x81, 0xf0, 0x42, 0xe7, 0xb9, 0x05, + 0x1f, 0xa3, 0x0d, 0x28, 0x05, 0x83, 0x3e, 0x35, 0xd8, 0xd0, 0x1f, 0xad, 0xb4, 0x18, 0x09, 0xf4, + 0xa1, 0x4f, 0x23, 0x87, 0xa8, 0x2c, 0xb5, 0x79, 0x5e, 0x22, 0x3e, 0x46, 0x75, 0x28, 0xd2, 0x33, + 0x46, 0x03, 0x97, 0xf4, 0x6b, 0x0b, 0x5c, 0x9e, 0xcc, 0xd1, 0x4b, 0x80, 0x14, 0x4d, 0x45, 0xbe, + 0xa5, 0xfe, 0x93, 0xde, 0x21, 0x13, 0xcb, 0xdc, 0x1e, 0x73, 0xa7, 0xb9, 0x2c, 0x18, 0xe2, 0x94, + 0x7b, 0xfd, 0x39, 0x54, 0x27, 0xd4, 0xd1, 0x11, 0xf9, 0x9a, 0x0e, 0xe3, 0xb2, 0x44, 0x43, 0xb4, + 0x0a, 0x85, 0xf7, 0xa4, 0x3f, 0x10, 0xe7, 0xaa, 0x80, 0xc5, 0xe4, 0x99, 0xfc, 0x54, 0x52, 0xdb, + 0xa0, 0x4c, 0x44, 0x0b, 0xd1, 0x13, 0x58, 0x60, 0x62, 0xc8, 0x29, 0x29, 0xef, 0x6c, 0x5c, 0x90, + 0x1c, 0x1e, 0xd9, 0xaa, 0x3a, 0x54, 0x9a, 0xa7, 0xc4, 0xed, 0x8d, 0x81, 0x76, 0xa1, 0x6a, 0x0a, + 0x89, 0x91, 0x05, 0x5c, 0xcf, 0x9c, 0x87, 0xb4, 0x13, 0xae, 0x98, 0x19, 0x0c, 0xf5, 0x4f, 0x09, + 0x96, 0x32, 0x16, 0xe8, 0xff, 0x50, 0x16, 0x36, 0x82, 0x0d, 0x71, 0xb1, 0xac, 0x4d, 0x23, 0x46, + 0xdc, 0x60, 0x30, 0x93, 0x31, 0x7a, 0x06, 0xe0, 0xf5, 0x47, 0xa9, 0xf0, 0x52, 0x5c, 0xb2, 0xb4, + 0x92, 0xd7, 0x1f, 0x05, 0x7d, 0x06, 0xe0, 0xd2, 0x0f, 0x23, 0xdf, 0xdc, 0x15, 0x7c, 0x5d, 0xfa, + 0x21, 0xf6, 0xad, 0x43, 0x31, 0x39, 0x25, 0x79, 0xb1, 0x77, 0x46, 0x73, 0xf5, 0x97, 0x79, 0x28, + 0xbe, 0xa2, 0x8c, 0x58, 0x84, 0x11, 0x74, 0x02, 0xcb, 0x22, 0x80, 0x61, 0x5b, 0x86, 0x43, 0x7c, + 0xdf, 0x76, 0x7b, 0x71, 0xc5, 0x1e, 0xa4, 0x63, 0x8d, 0x1c, 0xb6, 0x45, 0x80, 0xb6, 0xf5, 0x4a, + 0xd8, 0x8a, 0xdd, 0x51, 0x65, 0x59, 0x69, 0x04, 0x9b, 0x6c, 0xde, 0x04, 0x56, 0xbe, 0x00, 0x16, + 0xc7, 0x3b, 0x3b, 0x0b, 0x1b, 0x64, 0xa5, 0x48, 0x8b, 0x5a, 0x40, 0x2f, 0x01, 0x14, 0x57, 0xe3, + 0xbd, 0x73, 0xf2, 0xec, 0x65, 0xb0, 0x80, 0x25, 0x02, 0x64, 0xc1, 0x5a, 0xb2, 0x9d, 0x0d, 0x97, + 0x38, 0xe3, 0x14, 0xf3, 0x1c, 0x71, 0x7b, 0x26, 0x62, 0xb2, 0xe7, 0x3b, 0xc4, 0xc9, 0xe6, 0xb9, + 0x4a, 0x66, 0xa8, 0xd0, 0x47, 0xb8, 0x3d, 0x8e, 0x12, 0xb2, 0xc0, 0x76, 0x7b, 0x06, 0x3f, 0x05, + 0x49, 0xb4, 0x02, 0x8f, 0xf6, 0xe4, 0xe2, 0x68, 0xc7, 0xdc, 0xf3, 0x75, 0xe4, 0x98, 0x09, 0xba, + 0x41, 0xce, 0xb7, 0xa8, 0xef, 0xc2, 0xea, 0x2c, 0xa2, 0x2e, 0x3b, 0xa7, 0xa5, 0xd4, 0x39, 0x8d, + 0x30, 0x66, 0xb1, 0x72, 0x2d, 0x8c, 0xe7, 0x50, 0x9d, 0x20, 0xe2, 0x5a, 0xee, 0x7b, 0xb0, 0x7e, + 0x6e, 0xd5, 0xaf, 0x05, 0xd4, 0x81, 0xcd, 0xcb, 0x0a, 0x7a, 0x1d, 0x3c, 0xf5, 0x5b, 0x19, 0x6e, + 0xec, 0x51, 0x26, 0x6a, 0xbc, 0x17, 0x10, 0xff, 0x74, 0xf4, 0x58, 0x68, 0xc3, 0x72, 0x37, 0x7a, + 0x01, 0x18, 0xd6, 0xf8, 0x09, 0xc0, 0x31, 0xcb, 0x3b, 0x37, 0xd3, 0x44, 0x4f, 0x3e, 0x13, 0xb0, + 0xd2, 0x9d, 0x7c, 0x38, 0x3c, 0x87, 0x25, 0x8f, 0xb7, 0x65, 0xc3, 0xe4, 0x7d, 0x39, 0xbe, 0x3f, + 0x6a, 0x99, 0x3b, 0x20, 0xd5, 0xb7, 0xf1, 0xa2, 0x97, 0xee, 0xe2, 0x4d, 0xa8, 0xc6, 0xef, 0x03, + 0xc3, 0x13, 0xbd, 0x30, 0xbe, 0x44, 0xea, 0x33, 0xde, 0x12, 0x71, 0xb7, 0xc4, 0x95, 0x20, 0xdb, + 0x3d, 0xef, 0xc2, 0x62, 0x77, 0xe8, 0x93, 0x30, 0x34, 0x4c, 0x62, 0x9e, 0xd2, 0xb8, 0x27, 0x97, + 0x85, 0xac, 0x19, 0x89, 0xd4, 0xef, 0x24, 0x58, 0x9b, 0xac, 0x45, 0xe8, 0x7b, 0x6e, 0x48, 0xd1, + 0xd3, 0xf4, 0xb5, 0x3e, 0x55, 0x82, 0xc9, 0x2e, 0xb0, 0x3f, 0x97, 0xdc, 0xec, 0x68, 0x07, 0x8a, + 0x4e, 0x7c, 0x14, 0xe2, 0x65, 0xaf, 0xce, 0x3a, 0x26, 0xfb, 0x73, 0x38, 0xb1, 0xdb, 0x9d, 0x87, + 0xbc, 0xcd, 0xa8, 0xa3, 0xfe, 0x26, 0x43, 0x6d, 0x8f, 0xb2, 0x6c, 0x67, 0x18, 0xf1, 0xd3, 0x84, + 0xca, 0x3b, 0x3b, 0x08, 0x99, 0x11, 0xd0, 0xf7, 0x76, 0x78, 0x55, 0x72, 0x96, 0xb8, 0x0f, 0x8e, + 0x5d, 0x90, 0x06, 0xd5, 0x90, 0x9a, 0x9e, 0x6b, 0x8d, 0x51, 0xe4, 0x2b, 0xa0, 0x54, 0x84, 0x53, + 0x02, 0x33, 0x45, 0x70, 0xee, 0x53, 0x09, 0xce, 0x7f, 0x32, 0xc1, 0x85, 0x69, 0x82, 0x7f, 0x90, + 0x60, 0x7d, 0x46, 0x3d, 0x63, 0x8e, 0xb5, 0x59, 0x1d, 0x77, 0x2a, 0x8b, 0xac, 0xf3, 0xfe, 0xdc, + 0x64, 0xd3, 0xfd, 0x24, 0xc2, 0x7f, 0x97, 0xe1, 0xe6, 0x64, 0x82, 0x99, 0x43, 0xf9, 0x0f, 0xe9, + 0xd7, 0x26, 0xfd, 0x47, 0x09, 0x6e, 0x9d, 0x53, 0xd3, 0xbf, 0x0d, 0xf1, 0x0f, 0x3d, 0x28, 0x25, + 0x5f, 0x74, 0x68, 0x19, 0x96, 0x34, 0x8c, 0x0f, 0xb1, 0x71, 0xd2, 0x79, 0xd9, 0x39, 0x7c, 0xd3, + 0x51, 0xe6, 0xd0, 0x0a, 0x54, 0x85, 0xa8, 0xd9, 0xe8, 0x34, 0xb5, 0x83, 0x03, 0xad, 0xa5, 0x48, + 0xa8, 0x02, 0x10, 0xdb, 0x1d, 0x6b, 0x58, 0x91, 0x51, 0x15, 0xca, 0x62, 0xde, 0xee, 0xbc, 0xc0, + 0x0d, 0x25, 0x87, 0xd6, 0xe1, 0x46, 0x4a, 0x60, 0x60, 0x4d, 0xc7, 0x6f, 0x1b, 0xbb, 0x07, 0x9a, + 0x92, 0x7f, 0xf8, 0xbd, 0x04, 0x2b, 0x33, 0x3e, 0xa6, 0xd0, 0x26, 0xdc, 0x6c, 0x1e, 0xbe, 0x3a, + 0x3a, 0xd1, 0x1b, 0x7a, 0xfb, 0xb0, 0x63, 0x1c, 0xeb, 0xb8, 0xa1, 0x6b, 0x7b, 0x6f, 0x8d, 0x76, + 0xe7, 0x75, 0xe3, 0xa0, 0xdd, 0x52, 0xe6, 0xd0, 0x6d, 0xa8, 0xcf, 0xb4, 0x38, 0xe9, 0x1c, 0x6b, + 0xba, 0x22, 0x9d, 0xab, 0x3f, 0xde, 0xd7, 0x0e, 0x0e, 0x14, 0x19, 0xdd, 0x81, 0x8d, 0x99, 0xfa, + 0x4e, 0x43, 0x6f, 0xbf, 0xd6, 0x94, 0xdc, 0xc3, 0x3e, 0xc0, 0xf8, 0x11, 0x8a, 0xfe, 0x05, 0x2b, + 0xcd, 0xfd, 0x46, 0x67, 0x4f, 0x33, 0xf4, 0xb7, 0x47, 0x5a, 0x2a, 0x8f, 0x15, 0xa8, 0xa6, 0x15, + 0x1d, 0xed, 0x8d, 0x22, 0x4d, 0x5a, 0xb7, 0xb4, 0x03, 0x4d, 0xd7, 0x5a, 0x8a, 0x3c, 0xa9, 0x10, + 0xe3, 0x96, 0x92, 0xdb, 0xf9, 0x59, 0x86, 0x02, 0xff, 0xe4, 0x46, 0x5f, 0x41, 0x25, 0x7b, 0xfb, + 0xa3, 0xbb, 0x69, 0xfe, 0x66, 0x76, 0xc9, 0xba, 0x7a, 0x91, 0x89, 0xd8, 0x5f, 0xea, 0xdc, 0xff, + 0x24, 0x64, 0xc1, 0xf2, 0xd4, 0xcd, 0x83, 0xee, 0x4d, 0x38, 0xcf, 0xbc, 0xe8, 0xeb, 0xf7, 0x2f, + 0xb1, 0x4a, 0x45, 0xf1, 0x79, 0x33, 0x9f, 0xde, 0xea, 0x68, 0xeb, 0x22, 0x8c, 0xcc, 0x82, 0x1e, + 0x5c, 0xc1, 0x72, 0x1c, 0x71, 0xf7, 0xdf, 0x50, 0x31, 0x3d, 0x27, 0xe5, 0xb3, 0x2b, 0x7e, 0x60, + 0x1c, 0x05, 0x1e, 0xf3, 0x8e, 0xa4, 0x2f, 0x17, 0xb8, 0xd0, 0xef, 0x76, 0xe7, 0xf9, 0xcf, 0x8e, + 0xc7, 0x7f, 0x05, 0x00, 0x00, 0xff, 0xff, 0x5e, 0x79, 0x74, 0xd3, 0xfb, 0x10, 0x00, 0x00, }, }