From 87e69bf885931cce52b9b2b6b425bf847a54dd5a Mon Sep 17 00:00:00 2001 From: "Carol A. Scott" Date: Thu, 9 May 2019 09:30:11 -0700 Subject: [PATCH] Adding edges endpoint to public API (#2793) This change adds an endpoint to the public API to allow us to query Prometheus for edge data, in order to display identity information for connections between Linkerd proxies. This PR only includes changes to the controller and protobuf. --- controller/api/public/client.go | 6 + controller/api/public/edges.go | 144 ++++ controller/api/public/http_server.go | 24 + controller/api/public/http_server_test.go | 5 + controller/api/public/test_helper.go | 6 + controller/gen/public/public.pb.go | 810 +++++++++++++++------- proto/public.proto | 25 + 7 files changed, 784 insertions(+), 236 deletions(-) create mode 100644 controller/api/public/edges.go diff --git a/controller/api/public/client.go b/controller/api/public/client.go index 08309a692..503c05a0b 100644 --- a/controller/api/public/client.go +++ b/controller/api/public/client.go @@ -51,6 +51,12 @@ func (c *grpcOverHTTPClient) StatSummary(ctx context.Context, req *pb.StatSummar return &msg, err } +func (c *grpcOverHTTPClient) Edges(ctx context.Context, req *pb.EdgesRequest, _ ...grpc.CallOption) (*pb.EdgesResponse, error) { + var msg pb.EdgesResponse + err := c.apiRequest(ctx, "Edges", req, &msg) + return &msg, err +} + func (c *grpcOverHTTPClient) TopRoutes(ctx context.Context, req *pb.TopRoutesRequest, _ ...grpc.CallOption) (*pb.TopRoutesResponse, error) { var msg pb.TopRoutesResponse err := c.apiRequest(ctx, "TopRoutes", req, &msg) diff --git a/controller/api/public/edges.go b/controller/api/public/edges.go new file mode 100644 index 000000000..173250a77 --- /dev/null +++ b/controller/api/public/edges.go @@ -0,0 +1,144 @@ +package public + +import ( + "context" + "errors" + "fmt" + + pb "github.com/linkerd/linkerd2/controller/gen/public" + "github.com/prometheus/common/model" + log "github.com/sirupsen/logrus" +) + +const ( + inboundIdentityQuery = "count(response_total%s) by (%s, client_id)" + outboundIdentityQuery = "count(response_total%s) by (%s, dst_%s, server_id, no_tls_reason)" +) + +var formatMsg = map[string]string{ + "disabled": "Disabled", + "loopback": "Loopback", + "no_authority_in_http_request": "No Authority In HTTP Request", + "not_http": "Not HTTP", + "not_provided_by_remote": "Not Provided By Remote", + "not_provided_by_service_discovery": "Not Provided By Service Discovery", +} + +func (s *grpcServer) Edges(ctx context.Context, req *pb.EdgesRequest) (*pb.EdgesResponse, error) { + log.Debugf("Edges request: %+v", req) + if req.GetSelector().GetResource() == nil { + return edgesError(req, "Edges request missing Selector Resource"), nil + } + + edges, err := s.getEdges(ctx, req) + if err != nil { + return edgesError(req, err.Error()), nil + } + + return &pb.EdgesResponse{ + Response: &pb.EdgesResponse_Ok_{ + Ok: &pb.EdgesResponse_Ok{ + Edges: edges, + }, + }, + }, nil +} + +func edgesError(req *pb.EdgesRequest, message string) *pb.EdgesResponse { + return &pb.EdgesResponse{ + Response: &pb.EdgesResponse_Error{ + Error: &pb.ResourceError{ + Resource: req.GetSelector().GetResource(), + Error: message, + }, + }, + } +} + +func (s *grpcServer) getEdges(ctx context.Context, req *pb.EdgesRequest) ([]*pb.Edge, error) { + labelNames := promGroupByLabelNames(req.Selector.Resource) + if len(labelNames) != 2 { + return nil, errors.New("unexpected resource selector") + } + resourceType := string(labelNames[1]) // skipping first name which is always namespace + labels := promQueryLabels(req.Selector.Resource) + labelsOutbound := labels.Merge(promDirectionLabels("outbound")) + labelsInbound := labels.Merge(promDirectionLabels("inbound")) + + inboundQuery := fmt.Sprintf(inboundIdentityQuery, labelsInbound, resourceType) + outboundQuery := fmt.Sprintf(outboundIdentityQuery, labelsOutbound, resourceType, resourceType) + + inboundResult, err := s.queryProm(ctx, inboundQuery) + if err != nil { + return nil, err + } + + outboundResult, err := s.queryProm(ctx, outboundQuery) + if err != nil { + return nil, err + } + + edge := processEdgeMetrics(inboundResult, outboundResult, resourceType) + return edge, nil +} + +func processEdgeMetrics(inbound, outbound model.Vector, resourceType string) []*pb.Edge { + edges := []*pb.Edge{} + dstIndex := map[model.LabelValue]model.Metric{} + srcIndex := map[model.LabelValue][]model.Metric{} + resourceReplacementInbound := resourceType + resourceReplacementOutbound := "dst_" + resourceType + + for _, sample := range inbound { + // skip any inbound results that do not have a client_id, because this means + // the communication was one-sided (i.e. a probe or another instance where + // the src/dst are not both known) in future the edges command will support + // one-sided edges + if _, ok := sample.Metric[model.LabelName("client_id")]; ok { + key := sample.Metric[model.LabelName(resourceReplacementInbound)] + dstIndex[key] = sample.Metric + } + } + + for _, sample := range outbound { + // skip any outbound results that do not have a server_id for same reason as + // above section + if _, ok := sample.Metric[model.LabelName("server_id")]; ok { + key := sample.Metric[model.LabelName(resourceReplacementOutbound)] + if _, ok := srcIndex[key]; !ok { + srcIndex[key] = []model.Metric{} + } + srcIndex[key] = append(srcIndex[key], sample.Metric) + } + } + + for key, sources := range srcIndex { + for _, src := range sources { + dst, ok := dstIndex[key] + if !ok { + log.Errorf("missing resource in destination metrics: %s", key) + continue + } + msg := "" + if val, ok := src[model.LabelName("no_tls_reason")]; ok { + msg = formatMsg[string(val)] + } + edge := &pb.Edge{ + Src: &pb.Resource{ + Name: string(src[model.LabelName(resourceType)]), + Type: resourceType, + }, + Dst: &pb.Resource{ + Name: string(dst[model.LabelName(resourceType)]), + Type: resourceType, + }, + ClientId: string(dst[model.LabelName("client_id")]), + ServerId: string(src[model.LabelName("server_id")]), + NoIdentityMsg: msg, + } + edges = append(edges, edge) + } + } + + return edges +} diff --git a/controller/api/public/http_server.go b/controller/api/public/http_server.go index 5d2fe9f64..87f6c2cf9 100644 --- a/controller/api/public/http_server.go +++ b/controller/api/public/http_server.go @@ -26,6 +26,7 @@ var ( tapByResourcePath = fullURLPathFor("TapByResource") selfCheckPath = fullURLPathFor("SelfCheck") endpointsPath = fullURLPathFor("Endpoints") + edgesPath = fullURLPathFor("Edges") configPath = fullURLPathFor("Config") ) @@ -61,6 +62,8 @@ func (h *handler) ServeHTTP(w http.ResponseWriter, req *http.Request) { h.handleSelfCheck(w, req) case endpointsPath: h.handleEndpoints(w, req) + case edgesPath: + h.handleEdges(w, req) case configPath: h.handleConfig(w, req) default: @@ -90,6 +93,27 @@ func (h *handler) handleStatSummary(w http.ResponseWriter, req *http.Request) { } } +func (h *handler) handleEdges(w http.ResponseWriter, req *http.Request) { + var protoRequest pb.EdgesRequest + + err := httpRequestToProto(req, &protoRequest) + if err != nil { + writeErrorToHTTPResponse(w, err) + return + } + + rsp, err := h.grpcServer.Edges(req.Context(), &protoRequest) + if err != nil { + writeErrorToHTTPResponse(w, err) + return + } + err = writeProtoToHTTPResponse(w, rsp) + if err != nil { + writeErrorToHTTPResponse(w, err) + return + } +} + func (h *handler) handleTopRoutes(w http.ResponseWriter, req *http.Request) { var protoRequest pb.TopRoutesRequest diff --git a/controller/api/public/http_server_test.go b/controller/api/public/http_server_test.go index b1749ef0e..f13dea73f 100644 --- a/controller/api/public/http_server_test.go +++ b/controller/api/public/http_server_test.go @@ -36,6 +36,11 @@ func (m *mockGrpcServer) TopRoutes(ctx context.Context, req *pb.TopRoutesRequest return m.ResponseToReturn.(*pb.TopRoutesResponse), m.ErrorToReturn } +func (m *mockGrpcServer) Edges(ctx context.Context, req *pb.EdgesRequest) (*pb.EdgesResponse, error) { + m.LastRequestReceived = req + return m.ResponseToReturn.(*pb.EdgesResponse), m.ErrorToReturn +} + func (m *mockGrpcServer) Version(ctx context.Context, req *pb.Empty) (*pb.VersionInfo, error) { m.LastRequestReceived = req return m.ResponseToReturn.(*pb.VersionInfo), m.ErrorToReturn diff --git a/controller/api/public/test_helper.go b/controller/api/public/test_helper.go index ba6bee3d7..8fa13072f 100644 --- a/controller/api/public/test_helper.go +++ b/controller/api/public/test_helper.go @@ -27,6 +27,7 @@ type MockAPIClient struct { ListServicesResponseToReturn *pb.ListServicesResponse StatSummaryResponseToReturn *pb.StatSummaryResponse TopRoutesResponseToReturn *pb.TopRoutesResponse + EdgesResponseToReturn *pb.EdgesResponse SelfCheckResponseToReturn *healthcheckPb.SelfCheckResponse ConfigResponseToReturn *configPb.All APITapClientToReturn pb.Api_TapClient @@ -44,6 +45,11 @@ func (c *MockAPIClient) TopRoutes(ctx context.Context, in *pb.TopRoutesRequest, return c.TopRoutesResponseToReturn, c.ErrorToReturn } +// Edges provides a mock of a Public API method. +func (c *MockAPIClient) Edges(ctx context.Context, in *pb.EdgesRequest, opts ...grpc.CallOption) (*pb.EdgesResponse, error) { + return c.EdgesResponseToReturn, c.ErrorToReturn +} + // Version provides a mock of a Public API method. func (c *MockAPIClient) Version(ctx context.Context, in *pb.Empty, opts ...grpc.CallOption) (*pb.VersionInfo, error) { return c.VersionInfoToReturn, c.ErrorToReturn diff --git a/controller/gen/public/public.pb.go b/controller/gen/public/public.pb.go index ac3faa742..8219cf4cf 100644 --- a/controller/gen/public/public.pb.go +++ b/controller/gen/public/public.pb.go @@ -67,7 +67,7 @@ func (x HttpMethod_Registered) String() string { return proto.EnumName(HttpMethod_Registered_name, int32(x)) } func (HttpMethod_Registered) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_public_8b7d79a666eb4d6b, []int{10, 0} + return fileDescriptor_public_e3e3347d5819a629, []int{10, 0} } type Scheme_Registered int32 @@ -90,7 +90,7 @@ func (x Scheme_Registered) String() string { return proto.EnumName(Scheme_Registered_name, int32(x)) } func (Scheme_Registered) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_public_8b7d79a666eb4d6b, []int{11, 0} + return fileDescriptor_public_e3e3347d5819a629, []int{11, 0} } type TapEvent_ProxyDirection int32 @@ -116,7 +116,7 @@ func (x TapEvent_ProxyDirection) String() string { return proto.EnumName(TapEvent_ProxyDirection_name, int32(x)) } func (TapEvent_ProxyDirection) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_public_8b7d79a666eb4d6b, []int{16, 0} + return fileDescriptor_public_e3e3347d5819a629, []int{16, 0} } type Empty struct { @@ -129,7 +129,7 @@ func (m *Empty) Reset() { *m = Empty{} } func (m *Empty) String() string { return proto.CompactTextString(m) } func (*Empty) ProtoMessage() {} func (*Empty) Descriptor() ([]byte, []int) { - return fileDescriptor_public_8b7d79a666eb4d6b, []int{0} + return fileDescriptor_public_e3e3347d5819a629, []int{0} } func (m *Empty) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_Empty.Unmarshal(m, b) @@ -162,7 +162,7 @@ func (m *VersionInfo) Reset() { *m = VersionInfo{} } func (m *VersionInfo) String() string { return proto.CompactTextString(m) } func (*VersionInfo) ProtoMessage() {} func (*VersionInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_public_8b7d79a666eb4d6b, []int{1} + return fileDescriptor_public_e3e3347d5819a629, []int{1} } func (m *VersionInfo) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_VersionInfo.Unmarshal(m, b) @@ -214,7 +214,7 @@ func (m *ListServicesRequest) Reset() { *m = ListServicesRequest{} } func (m *ListServicesRequest) String() string { return proto.CompactTextString(m) } func (*ListServicesRequest) ProtoMessage() {} func (*ListServicesRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_public_8b7d79a666eb4d6b, []int{2} + return fileDescriptor_public_e3e3347d5819a629, []int{2} } func (m *ListServicesRequest) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_ListServicesRequest.Unmarshal(m, b) @@ -252,7 +252,7 @@ func (m *ListServicesResponse) Reset() { *m = ListServicesResponse{} } func (m *ListServicesResponse) String() string { return proto.CompactTextString(m) } func (*ListServicesResponse) ProtoMessage() {} func (*ListServicesResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_public_8b7d79a666eb4d6b, []int{3} + return fileDescriptor_public_e3e3347d5819a629, []int{3} } func (m *ListServicesResponse) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_ListServicesResponse.Unmarshal(m, b) @@ -291,7 +291,7 @@ func (m *Service) Reset() { *m = Service{} } func (m *Service) String() string { return proto.CompactTextString(m) } func (*Service) ProtoMessage() {} func (*Service) Descriptor() ([]byte, []int) { - return fileDescriptor_public_8b7d79a666eb4d6b, []int{4} + return fileDescriptor_public_e3e3347d5819a629, []int{4} } func (m *Service) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_Service.Unmarshal(m, b) @@ -337,7 +337,7 @@ func (m *ListPodsRequest) Reset() { *m = ListPodsRequest{} } func (m *ListPodsRequest) String() string { return proto.CompactTextString(m) } func (*ListPodsRequest) ProtoMessage() {} func (*ListPodsRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_public_8b7d79a666eb4d6b, []int{5} + return fileDescriptor_public_e3e3347d5819a629, []int{5} } func (m *ListPodsRequest) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_ListPodsRequest.Unmarshal(m, b) @@ -383,7 +383,7 @@ func (m *ListPodsResponse) Reset() { *m = ListPodsResponse{} } func (m *ListPodsResponse) String() string { return proto.CompactTextString(m) } func (*ListPodsResponse) ProtoMessage() {} func (*ListPodsResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_public_8b7d79a666eb4d6b, []int{6} + return fileDescriptor_public_e3e3347d5819a629, []int{6} } func (m *ListPodsResponse) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_ListPodsResponse.Unmarshal(m, b) @@ -439,7 +439,7 @@ func (m *Pod) Reset() { *m = Pod{} } func (m *Pod) String() string { return proto.CompactTextString(m) } func (*Pod) ProtoMessage() {} func (*Pod) Descriptor() ([]byte, []int) { - return fileDescriptor_public_8b7d79a666eb4d6b, []int{7} + return fileDescriptor_public_e3e3347d5819a629, []int{7} } func (m *Pod) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_Pod.Unmarshal(m, b) @@ -776,7 +776,7 @@ func (m *TapRequest) Reset() { *m = TapRequest{} } func (m *TapRequest) String() string { return proto.CompactTextString(m) } func (*TapRequest) ProtoMessage() {} func (*TapRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_public_8b7d79a666eb4d6b, []int{8} + return fileDescriptor_public_e3e3347d5819a629, []int{8} } func (m *TapRequest) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_TapRequest.Unmarshal(m, b) @@ -979,7 +979,7 @@ func (m *TapByResourceRequest) Reset() { *m = TapByResourceRequest{} } func (m *TapByResourceRequest) String() string { return proto.CompactTextString(m) } func (*TapByResourceRequest) ProtoMessage() {} func (*TapByResourceRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_public_8b7d79a666eb4d6b, []int{9} + return fileDescriptor_public_e3e3347d5819a629, []int{9} } func (m *TapByResourceRequest) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_TapByResourceRequest.Unmarshal(m, b) @@ -1037,7 +1037,7 @@ func (m *TapByResourceRequest_Match) Reset() { *m = TapByResourceRequest func (m *TapByResourceRequest_Match) String() string { return proto.CompactTextString(m) } func (*TapByResourceRequest_Match) ProtoMessage() {} func (*TapByResourceRequest_Match) Descriptor() ([]byte, []int) { - return fileDescriptor_public_8b7d79a666eb4d6b, []int{9, 0} + return fileDescriptor_public_e3e3347d5819a629, []int{9, 0} } func (m *TapByResourceRequest_Match) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_TapByResourceRequest_Match.Unmarshal(m, b) @@ -1275,7 +1275,7 @@ func (m *TapByResourceRequest_Match_Seq) Reset() { *m = TapByResourceReq func (m *TapByResourceRequest_Match_Seq) String() string { return proto.CompactTextString(m) } func (*TapByResourceRequest_Match_Seq) ProtoMessage() {} func (*TapByResourceRequest_Match_Seq) Descriptor() ([]byte, []int) { - return fileDescriptor_public_8b7d79a666eb4d6b, []int{9, 0, 0} + return fileDescriptor_public_e3e3347d5819a629, []int{9, 0, 0} } func (m *TapByResourceRequest_Match_Seq) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_TapByResourceRequest_Match_Seq.Unmarshal(m, b) @@ -1318,7 +1318,7 @@ func (m *TapByResourceRequest_Match_Http) Reset() { *m = TapByResourceRe func (m *TapByResourceRequest_Match_Http) String() string { return proto.CompactTextString(m) } func (*TapByResourceRequest_Match_Http) ProtoMessage() {} func (*TapByResourceRequest_Match_Http) Descriptor() ([]byte, []int) { - return fileDescriptor_public_8b7d79a666eb4d6b, []int{9, 0, 1} + return fileDescriptor_public_e3e3347d5819a629, []int{9, 0, 1} } func (m *TapByResourceRequest_Match_Http) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_TapByResourceRequest_Match_Http.Unmarshal(m, b) @@ -1511,7 +1511,7 @@ func (m *HttpMethod) Reset() { *m = HttpMethod{} } func (m *HttpMethod) String() string { return proto.CompactTextString(m) } func (*HttpMethod) ProtoMessage() {} func (*HttpMethod) Descriptor() ([]byte, []int) { - return fileDescriptor_public_8b7d79a666eb4d6b, []int{10} + return fileDescriptor_public_e3e3347d5819a629, []int{10} } func (m *HttpMethod) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_HttpMethod.Unmarshal(m, b) @@ -1647,7 +1647,7 @@ func (m *Scheme) Reset() { *m = Scheme{} } func (m *Scheme) String() string { return proto.CompactTextString(m) } func (*Scheme) ProtoMessage() {} func (*Scheme) Descriptor() ([]byte, []int) { - return fileDescriptor_public_8b7d79a666eb4d6b, []int{11} + return fileDescriptor_public_e3e3347d5819a629, []int{11} } func (m *Scheme) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_Scheme.Unmarshal(m, b) @@ -1783,7 +1783,7 @@ func (m *IPAddress) Reset() { *m = IPAddress{} } func (m *IPAddress) String() string { return proto.CompactTextString(m) } func (*IPAddress) ProtoMessage() {} func (*IPAddress) Descriptor() ([]byte, []int) { - return fileDescriptor_public_8b7d79a666eb4d6b, []int{12} + return fileDescriptor_public_e3e3347d5819a629, []int{12} } func (m *IPAddress) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_IPAddress.Unmarshal(m, b) @@ -1921,7 +1921,7 @@ func (m *IPv6) Reset() { *m = IPv6{} } func (m *IPv6) String() string { return proto.CompactTextString(m) } func (*IPv6) ProtoMessage() {} func (*IPv6) Descriptor() ([]byte, []int) { - return fileDescriptor_public_8b7d79a666eb4d6b, []int{13} + return fileDescriptor_public_e3e3347d5819a629, []int{13} } func (m *IPv6) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_IPv6.Unmarshal(m, b) @@ -1967,7 +1967,7 @@ func (m *TcpAddress) Reset() { *m = TcpAddress{} } func (m *TcpAddress) String() string { return proto.CompactTextString(m) } func (*TcpAddress) ProtoMessage() {} func (*TcpAddress) Descriptor() ([]byte, []int) { - return fileDescriptor_public_8b7d79a666eb4d6b, []int{14} + return fileDescriptor_public_e3e3347d5819a629, []int{14} } func (m *TcpAddress) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_TcpAddress.Unmarshal(m, b) @@ -2015,7 +2015,7 @@ func (m *Eos) Reset() { *m = Eos{} } func (m *Eos) String() string { return proto.CompactTextString(m) } func (*Eos) ProtoMessage() {} func (*Eos) Descriptor() ([]byte, []int) { - return fileDescriptor_public_8b7d79a666eb4d6b, []int{15} + return fileDescriptor_public_e3e3347d5819a629, []int{15} } func (m *Eos) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_Eos.Unmarshal(m, b) @@ -2155,7 +2155,7 @@ func (m *TapEvent) Reset() { *m = TapEvent{} } func (m *TapEvent) String() string { return proto.CompactTextString(m) } func (*TapEvent) ProtoMessage() {} func (*TapEvent) Descriptor() ([]byte, []int) { - return fileDescriptor_public_8b7d79a666eb4d6b, []int{16} + return fileDescriptor_public_e3e3347d5819a629, []int{16} } func (m *TapEvent) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_TapEvent.Unmarshal(m, b) @@ -2307,7 +2307,7 @@ func (m *TapEvent_EndpointMeta) Reset() { *m = TapEvent_EndpointMeta{} } func (m *TapEvent_EndpointMeta) String() string { return proto.CompactTextString(m) } func (*TapEvent_EndpointMeta) ProtoMessage() {} func (*TapEvent_EndpointMeta) Descriptor() ([]byte, []int) { - return fileDescriptor_public_8b7d79a666eb4d6b, []int{16, 0} + return fileDescriptor_public_e3e3347d5819a629, []int{16, 0} } func (m *TapEvent_EndpointMeta) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_TapEvent_EndpointMeta.Unmarshal(m, b) @@ -2345,7 +2345,7 @@ func (m *TapEvent_RouteMeta) Reset() { *m = TapEvent_RouteMeta{} } func (m *TapEvent_RouteMeta) String() string { return proto.CompactTextString(m) } func (*TapEvent_RouteMeta) ProtoMessage() {} func (*TapEvent_RouteMeta) Descriptor() ([]byte, []int) { - return fileDescriptor_public_8b7d79a666eb4d6b, []int{16, 1} + return fileDescriptor_public_e3e3347d5819a629, []int{16, 1} } func (m *TapEvent_RouteMeta) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_TapEvent_RouteMeta.Unmarshal(m, b) @@ -2387,7 +2387,7 @@ func (m *TapEvent_Http) Reset() { *m = TapEvent_Http{} } func (m *TapEvent_Http) String() string { return proto.CompactTextString(m) } func (*TapEvent_Http) ProtoMessage() {} func (*TapEvent_Http) Descriptor() ([]byte, []int) { - return fileDescriptor_public_8b7d79a666eb4d6b, []int{16, 2} + return fileDescriptor_public_e3e3347d5819a629, []int{16, 2} } func (m *TapEvent_Http) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_TapEvent_Http.Unmarshal(m, b) @@ -2564,7 +2564,7 @@ func (m *TapEvent_Http_StreamId) Reset() { *m = TapEvent_Http_StreamId{} func (m *TapEvent_Http_StreamId) String() string { return proto.CompactTextString(m) } func (*TapEvent_Http_StreamId) ProtoMessage() {} func (*TapEvent_Http_StreamId) Descriptor() ([]byte, []int) { - return fileDescriptor_public_8b7d79a666eb4d6b, []int{16, 2, 0} + return fileDescriptor_public_e3e3347d5819a629, []int{16, 2, 0} } func (m *TapEvent_Http_StreamId) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_TapEvent_Http_StreamId.Unmarshal(m, b) @@ -2613,7 +2613,7 @@ func (m *TapEvent_Http_RequestInit) Reset() { *m = TapEvent_Http_Request func (m *TapEvent_Http_RequestInit) String() string { return proto.CompactTextString(m) } func (*TapEvent_Http_RequestInit) ProtoMessage() {} func (*TapEvent_Http_RequestInit) Descriptor() ([]byte, []int) { - return fileDescriptor_public_8b7d79a666eb4d6b, []int{16, 2, 1} + return fileDescriptor_public_e3e3347d5819a629, []int{16, 2, 1} } func (m *TapEvent_Http_RequestInit) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_TapEvent_Http_RequestInit.Unmarshal(m, b) @@ -2681,7 +2681,7 @@ func (m *TapEvent_Http_ResponseInit) Reset() { *m = TapEvent_Http_Respon func (m *TapEvent_Http_ResponseInit) String() string { return proto.CompactTextString(m) } func (*TapEvent_Http_ResponseInit) ProtoMessage() {} func (*TapEvent_Http_ResponseInit) Descriptor() ([]byte, []int) { - return fileDescriptor_public_8b7d79a666eb4d6b, []int{16, 2, 2} + return fileDescriptor_public_e3e3347d5819a629, []int{16, 2, 2} } func (m *TapEvent_Http_ResponseInit) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_TapEvent_Http_ResponseInit.Unmarshal(m, b) @@ -2737,7 +2737,7 @@ func (m *TapEvent_Http_ResponseEnd) Reset() { *m = TapEvent_Http_Respons func (m *TapEvent_Http_ResponseEnd) String() string { return proto.CompactTextString(m) } func (*TapEvent_Http_ResponseEnd) ProtoMessage() {} func (*TapEvent_Http_ResponseEnd) Descriptor() ([]byte, []int) { - return fileDescriptor_public_8b7d79a666eb4d6b, []int{16, 2, 3} + return fileDescriptor_public_e3e3347d5819a629, []int{16, 2, 3} } func (m *TapEvent_Http_ResponseEnd) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_TapEvent_Http_ResponseEnd.Unmarshal(m, b) @@ -2803,7 +2803,7 @@ func (m *ApiError) Reset() { *m = ApiError{} } func (m *ApiError) String() string { return proto.CompactTextString(m) } func (*ApiError) ProtoMessage() {} func (*ApiError) Descriptor() ([]byte, []int) { - return fileDescriptor_public_8b7d79a666eb4d6b, []int{17} + return fileDescriptor_public_e3e3347d5819a629, []int{17} } func (m *ApiError) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_ApiError.Unmarshal(m, b) @@ -2841,7 +2841,7 @@ func (m *PodErrors) Reset() { *m = PodErrors{} } func (m *PodErrors) String() string { return proto.CompactTextString(m) } func (*PodErrors) ProtoMessage() {} func (*PodErrors) Descriptor() ([]byte, []int) { - return fileDescriptor_public_8b7d79a666eb4d6b, []int{18} + return fileDescriptor_public_e3e3347d5819a629, []int{18} } func (m *PodErrors) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_PodErrors.Unmarshal(m, b) @@ -2881,7 +2881,7 @@ func (m *PodErrors_PodError) Reset() { *m = PodErrors_PodError{} } func (m *PodErrors_PodError) String() string { return proto.CompactTextString(m) } func (*PodErrors_PodError) ProtoMessage() {} func (*PodErrors_PodError) Descriptor() ([]byte, []int) { - return fileDescriptor_public_8b7d79a666eb4d6b, []int{18, 0} + return fileDescriptor_public_e3e3347d5819a629, []int{18, 0} } func (m *PodErrors_PodError) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_PodErrors_PodError.Unmarshal(m, b) @@ -2995,7 +2995,7 @@ func (m *PodErrors_PodError_ContainerError) Reset() { *m = PodErrors_Pod func (m *PodErrors_PodError_ContainerError) String() string { return proto.CompactTextString(m) } func (*PodErrors_PodError_ContainerError) ProtoMessage() {} func (*PodErrors_PodError_ContainerError) Descriptor() ([]byte, []int) { - return fileDescriptor_public_8b7d79a666eb4d6b, []int{18, 0, 0} + return fileDescriptor_public_e3e3347d5819a629, []int{18, 0, 0} } func (m *PodErrors_PodError_ContainerError) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_PodErrors_PodError_ContainerError.Unmarshal(m, b) @@ -3066,7 +3066,7 @@ func (m *Resource) Reset() { *m = Resource{} } func (m *Resource) String() string { return proto.CompactTextString(m) } func (*Resource) ProtoMessage() {} func (*Resource) Descriptor() ([]byte, []int) { - return fileDescriptor_public_8b7d79a666eb4d6b, []int{19} + return fileDescriptor_public_e3e3347d5819a629, []int{19} } func (m *Resource) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_Resource.Unmarshal(m, b) @@ -3125,7 +3125,7 @@ func (m *ResourceSelection) Reset() { *m = ResourceSelection{} } func (m *ResourceSelection) String() string { return proto.CompactTextString(m) } func (*ResourceSelection) ProtoMessage() {} func (*ResourceSelection) Descriptor() ([]byte, []int) { - return fileDescriptor_public_8b7d79a666eb4d6b, []int{20} + return fileDescriptor_public_e3e3347d5819a629, []int{20} } func (m *ResourceSelection) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_ResourceSelection.Unmarshal(m, b) @@ -3171,7 +3171,7 @@ func (m *ResourceError) Reset() { *m = ResourceError{} } func (m *ResourceError) String() string { return proto.CompactTextString(m) } func (*ResourceError) ProtoMessage() {} func (*ResourceError) Descriptor() ([]byte, []int) { - return fileDescriptor_public_8b7d79a666eb4d6b, []int{21} + return fileDescriptor_public_e3e3347d5819a629, []int{21} } func (m *ResourceError) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_ResourceError.Unmarshal(m, b) @@ -3224,7 +3224,7 @@ func (m *StatSummaryRequest) Reset() { *m = StatSummaryRequest{} } func (m *StatSummaryRequest) String() string { return proto.CompactTextString(m) } func (*StatSummaryRequest) ProtoMessage() {} func (*StatSummaryRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_public_8b7d79a666eb4d6b, []int{22} + return fileDescriptor_public_e3e3347d5819a629, []int{22} } func (m *StatSummaryRequest) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_StatSummaryRequest.Unmarshal(m, b) @@ -3429,7 +3429,7 @@ func (m *StatSummaryResponse) Reset() { *m = StatSummaryResponse{} } func (m *StatSummaryResponse) String() string { return proto.CompactTextString(m) } func (*StatSummaryResponse) ProtoMessage() {} func (*StatSummaryResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_public_8b7d79a666eb4d6b, []int{23} + return fileDescriptor_public_e3e3347d5819a629, []int{23} } func (m *StatSummaryResponse) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_StatSummaryResponse.Unmarshal(m, b) @@ -3571,7 +3571,7 @@ func (m *StatSummaryResponse_Ok) Reset() { *m = StatSummaryResponse_Ok{} func (m *StatSummaryResponse_Ok) String() string { return proto.CompactTextString(m) } func (*StatSummaryResponse_Ok) ProtoMessage() {} func (*StatSummaryResponse_Ok) Descriptor() ([]byte, []int) { - return fileDescriptor_public_8b7d79a666eb4d6b, []int{23, 0} + return fileDescriptor_public_e3e3347d5819a629, []int{23, 0} } func (m *StatSummaryResponse_Ok) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_StatSummaryResponse_Ok.Unmarshal(m, b) @@ -3615,7 +3615,7 @@ func (m *BasicStats) Reset() { *m = BasicStats{} } func (m *BasicStats) String() string { return proto.CompactTextString(m) } func (*BasicStats) ProtoMessage() {} func (*BasicStats) Descriptor() ([]byte, []int) { - return fileDescriptor_public_8b7d79a666eb4d6b, []int{24} + return fileDescriptor_public_e3e3347d5819a629, []int{24} } func (m *BasicStats) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_BasicStats.Unmarshal(m, b) @@ -3700,7 +3700,7 @@ func (m *TcpStats) Reset() { *m = TcpStats{} } func (m *TcpStats) String() string { return proto.CompactTextString(m) } func (*TcpStats) ProtoMessage() {} func (*TcpStats) Descriptor() ([]byte, []int) { - return fileDescriptor_public_8b7d79a666eb4d6b, []int{25} + return fileDescriptor_public_e3e3347d5819a629, []int{25} } func (m *TcpStats) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_TcpStats.Unmarshal(m, b) @@ -3754,7 +3754,7 @@ func (m *StatTable) Reset() { *m = StatTable{} } func (m *StatTable) String() string { return proto.CompactTextString(m) } func (*StatTable) ProtoMessage() {} func (*StatTable) Descriptor() ([]byte, []int) { - return fileDescriptor_public_8b7d79a666eb4d6b, []int{26} + return fileDescriptor_public_e3e3347d5819a629, []int{26} } func (m *StatTable) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_StatTable.Unmarshal(m, b) @@ -3864,7 +3864,7 @@ func (m *StatTable_PodGroup) Reset() { *m = StatTable_PodGroup{} } func (m *StatTable_PodGroup) String() string { return proto.CompactTextString(m) } func (*StatTable_PodGroup) ProtoMessage() {} func (*StatTable_PodGroup) Descriptor() ([]byte, []int) { - return fileDescriptor_public_8b7d79a666eb4d6b, []int{26, 0} + return fileDescriptor_public_e3e3347d5819a629, []int{26, 0} } func (m *StatTable_PodGroup) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_StatTable_PodGroup.Unmarshal(m, b) @@ -3913,7 +3913,7 @@ func (m *StatTable_PodGroup_Row) Reset() { *m = StatTable_PodGroup_Row{} func (m *StatTable_PodGroup_Row) String() string { return proto.CompactTextString(m) } func (*StatTable_PodGroup_Row) ProtoMessage() {} func (*StatTable_PodGroup_Row) Descriptor() ([]byte, []int) { - return fileDescriptor_public_8b7d79a666eb4d6b, []int{26, 0, 0} + return fileDescriptor_public_e3e3347d5819a629, []int{26, 0, 0} } func (m *StatTable_PodGroup_Row) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_StatTable_PodGroup_Row.Unmarshal(m, b) @@ -3989,6 +3989,297 @@ func (m *StatTable_PodGroup_Row) GetErrorsByPod() map[string]*PodErrors { return nil } +type EdgesRequest struct { + Selector *ResourceSelection `protobuf:"bytes,1,opt,name=selector,proto3" json:"selector,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *EdgesRequest) Reset() { *m = EdgesRequest{} } +func (m *EdgesRequest) String() string { return proto.CompactTextString(m) } +func (*EdgesRequest) ProtoMessage() {} +func (*EdgesRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_public_e3e3347d5819a629, []int{27} +} +func (m *EdgesRequest) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_EdgesRequest.Unmarshal(m, b) +} +func (m *EdgesRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_EdgesRequest.Marshal(b, m, deterministic) +} +func (dst *EdgesRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_EdgesRequest.Merge(dst, src) +} +func (m *EdgesRequest) XXX_Size() int { + return xxx_messageInfo_EdgesRequest.Size(m) +} +func (m *EdgesRequest) XXX_DiscardUnknown() { + xxx_messageInfo_EdgesRequest.DiscardUnknown(m) +} + +var xxx_messageInfo_EdgesRequest proto.InternalMessageInfo + +func (m *EdgesRequest) GetSelector() *ResourceSelection { + if m != nil { + return m.Selector + } + return nil +} + +type EdgesResponse struct { + // Types that are valid to be assigned to Response: + // *EdgesResponse_Ok_ + // *EdgesResponse_Error + Response isEdgesResponse_Response `protobuf_oneof:"response"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *EdgesResponse) Reset() { *m = EdgesResponse{} } +func (m *EdgesResponse) String() string { return proto.CompactTextString(m) } +func (*EdgesResponse) ProtoMessage() {} +func (*EdgesResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_public_e3e3347d5819a629, []int{28} +} +func (m *EdgesResponse) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_EdgesResponse.Unmarshal(m, b) +} +func (m *EdgesResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_EdgesResponse.Marshal(b, m, deterministic) +} +func (dst *EdgesResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_EdgesResponse.Merge(dst, src) +} +func (m *EdgesResponse) XXX_Size() int { + return xxx_messageInfo_EdgesResponse.Size(m) +} +func (m *EdgesResponse) XXX_DiscardUnknown() { + xxx_messageInfo_EdgesResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_EdgesResponse proto.InternalMessageInfo + +type isEdgesResponse_Response interface { + isEdgesResponse_Response() +} + +type EdgesResponse_Ok_ struct { + Ok *EdgesResponse_Ok `protobuf:"bytes,1,opt,name=ok,proto3,oneof"` +} + +type EdgesResponse_Error struct { + Error *ResourceError `protobuf:"bytes,2,opt,name=error,proto3,oneof"` +} + +func (*EdgesResponse_Ok_) isEdgesResponse_Response() {} + +func (*EdgesResponse_Error) isEdgesResponse_Response() {} + +func (m *EdgesResponse) GetResponse() isEdgesResponse_Response { + if m != nil { + return m.Response + } + return nil +} + +func (m *EdgesResponse) GetOk() *EdgesResponse_Ok { + if x, ok := m.GetResponse().(*EdgesResponse_Ok_); ok { + return x.Ok + } + return nil +} + +func (m *EdgesResponse) GetError() *ResourceError { + if x, ok := m.GetResponse().(*EdgesResponse_Error); ok { + return x.Error + } + return nil +} + +// XXX_OneofFuncs is for the internal use of the proto package. +func (*EdgesResponse) XXX_OneofFuncs() (func(msg proto.Message, b *proto.Buffer) error, func(msg proto.Message, tag, wire int, b *proto.Buffer) (bool, error), func(msg proto.Message) (n int), []interface{}) { + return _EdgesResponse_OneofMarshaler, _EdgesResponse_OneofUnmarshaler, _EdgesResponse_OneofSizer, []interface{}{ + (*EdgesResponse_Ok_)(nil), + (*EdgesResponse_Error)(nil), + } +} + +func _EdgesResponse_OneofMarshaler(msg proto.Message, b *proto.Buffer) error { + m := msg.(*EdgesResponse) + // response + switch x := m.Response.(type) { + case *EdgesResponse_Ok_: + b.EncodeVarint(1<<3 | proto.WireBytes) + if err := b.EncodeMessage(x.Ok); err != nil { + return err + } + case *EdgesResponse_Error: + b.EncodeVarint(2<<3 | proto.WireBytes) + if err := b.EncodeMessage(x.Error); err != nil { + return err + } + case nil: + default: + return fmt.Errorf("EdgesResponse.Response has unexpected type %T", x) + } + return nil +} + +func _EdgesResponse_OneofUnmarshaler(msg proto.Message, tag, wire int, b *proto.Buffer) (bool, error) { + m := msg.(*EdgesResponse) + switch tag { + case 1: // response.ok + if wire != proto.WireBytes { + return true, proto.ErrInternalBadWireType + } + msg := new(EdgesResponse_Ok) + err := b.DecodeMessage(msg) + m.Response = &EdgesResponse_Ok_{msg} + return true, err + case 2: // response.error + if wire != proto.WireBytes { + return true, proto.ErrInternalBadWireType + } + msg := new(ResourceError) + err := b.DecodeMessage(msg) + m.Response = &EdgesResponse_Error{msg} + return true, err + default: + return false, nil + } +} + +func _EdgesResponse_OneofSizer(msg proto.Message) (n int) { + m := msg.(*EdgesResponse) + // response + switch x := m.Response.(type) { + case *EdgesResponse_Ok_: + s := proto.Size(x.Ok) + n += 1 // tag and wire + n += proto.SizeVarint(uint64(s)) + n += s + case *EdgesResponse_Error: + s := proto.Size(x.Error) + n += 1 // tag and wire + n += proto.SizeVarint(uint64(s)) + n += s + case nil: + default: + panic(fmt.Sprintf("proto: unexpected type %T in oneof", x)) + } + return n +} + +type EdgesResponse_Ok struct { + Edges []*Edge `protobuf:"bytes,1,rep,name=edges,proto3" json:"edges,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *EdgesResponse_Ok) Reset() { *m = EdgesResponse_Ok{} } +func (m *EdgesResponse_Ok) String() string { return proto.CompactTextString(m) } +func (*EdgesResponse_Ok) ProtoMessage() {} +func (*EdgesResponse_Ok) Descriptor() ([]byte, []int) { + return fileDescriptor_public_e3e3347d5819a629, []int{28, 0} +} +func (m *EdgesResponse_Ok) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_EdgesResponse_Ok.Unmarshal(m, b) +} +func (m *EdgesResponse_Ok) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_EdgesResponse_Ok.Marshal(b, m, deterministic) +} +func (dst *EdgesResponse_Ok) XXX_Merge(src proto.Message) { + xxx_messageInfo_EdgesResponse_Ok.Merge(dst, src) +} +func (m *EdgesResponse_Ok) XXX_Size() int { + return xxx_messageInfo_EdgesResponse_Ok.Size(m) +} +func (m *EdgesResponse_Ok) XXX_DiscardUnknown() { + xxx_messageInfo_EdgesResponse_Ok.DiscardUnknown(m) +} + +var xxx_messageInfo_EdgesResponse_Ok proto.InternalMessageInfo + +func (m *EdgesResponse_Ok) GetEdges() []*Edge { + if m != nil { + return m.Edges + } + return nil +} + +type Edge struct { + Src *Resource `protobuf:"bytes,1,opt,name=src,proto3" json:"src,omitempty"` + Dst *Resource `protobuf:"bytes,2,opt,name=dst,proto3" json:"dst,omitempty"` + ClientId string `protobuf:"bytes,3,opt,name=client_id,json=clientId,proto3" json:"client_id,omitempty"` + ServerId string `protobuf:"bytes,4,opt,name=server_id,json=serverId,proto3" json:"server_id,omitempty"` + NoIdentityMsg string `protobuf:"bytes,5,opt,name=no_identity_msg,json=noIdentityMsg,proto3" json:"no_identity_msg,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *Edge) Reset() { *m = Edge{} } +func (m *Edge) String() string { return proto.CompactTextString(m) } +func (*Edge) ProtoMessage() {} +func (*Edge) Descriptor() ([]byte, []int) { + return fileDescriptor_public_e3e3347d5819a629, []int{29} +} +func (m *Edge) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_Edge.Unmarshal(m, b) +} +func (m *Edge) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_Edge.Marshal(b, m, deterministic) +} +func (dst *Edge) XXX_Merge(src proto.Message) { + xxx_messageInfo_Edge.Merge(dst, src) +} +func (m *Edge) XXX_Size() int { + return xxx_messageInfo_Edge.Size(m) +} +func (m *Edge) XXX_DiscardUnknown() { + xxx_messageInfo_Edge.DiscardUnknown(m) +} + +var xxx_messageInfo_Edge proto.InternalMessageInfo + +func (m *Edge) GetSrc() *Resource { + if m != nil { + return m.Src + } + return nil +} + +func (m *Edge) GetDst() *Resource { + if m != nil { + return m.Dst + } + return nil +} + +func (m *Edge) GetClientId() string { + if m != nil { + return m.ClientId + } + return "" +} + +func (m *Edge) GetServerId() string { + if m != nil { + return m.ServerId + } + return "" +} + +func (m *Edge) GetNoIdentityMsg() string { + if m != nil { + return m.NoIdentityMsg + } + return "" +} + type TopRoutesRequest struct { Selector *ResourceSelection `protobuf:"bytes,1,opt,name=selector,proto3" json:"selector,omitempty"` TimeWindow string `protobuf:"bytes,2,opt,name=time_window,json=timeWindow,proto3" json:"time_window,omitempty"` @@ -4005,7 +4296,7 @@ func (m *TopRoutesRequest) Reset() { *m = TopRoutesRequest{} } func (m *TopRoutesRequest) String() string { return proto.CompactTextString(m) } func (*TopRoutesRequest) ProtoMessage() {} func (*TopRoutesRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_public_8b7d79a666eb4d6b, []int{27} + return fileDescriptor_public_e3e3347d5819a629, []int{30} } func (m *TopRoutesRequest) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_TopRoutesRequest.Unmarshal(m, b) @@ -4164,7 +4455,7 @@ func (m *TopRoutesResponse) Reset() { *m = TopRoutesResponse{} } func (m *TopRoutesResponse) String() string { return proto.CompactTextString(m) } func (*TopRoutesResponse) ProtoMessage() {} func (*TopRoutesResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_public_8b7d79a666eb4d6b, []int{28} + return fileDescriptor_public_e3e3347d5819a629, []int{31} } func (m *TopRoutesResponse) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_TopRoutesResponse.Unmarshal(m, b) @@ -4306,7 +4597,7 @@ func (m *TopRoutesResponse_Ok) Reset() { *m = TopRoutesResponse_Ok{} } func (m *TopRoutesResponse_Ok) String() string { return proto.CompactTextString(m) } func (*TopRoutesResponse_Ok) ProtoMessage() {} func (*TopRoutesResponse_Ok) Descriptor() ([]byte, []int) { - return fileDescriptor_public_8b7d79a666eb4d6b, []int{28, 0} + return fileDescriptor_public_e3e3347d5819a629, []int{31, 0} } func (m *TopRoutesResponse_Ok) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_TopRoutesResponse_Ok.Unmarshal(m, b) @@ -4345,7 +4636,7 @@ func (m *RouteTable) Reset() { *m = RouteTable{} } func (m *RouteTable) String() string { return proto.CompactTextString(m) } func (*RouteTable) ProtoMessage() {} func (*RouteTable) Descriptor() ([]byte, []int) { - return fileDescriptor_public_8b7d79a666eb4d6b, []int{29} + return fileDescriptor_public_e3e3347d5819a629, []int{32} } func (m *RouteTable) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_RouteTable.Unmarshal(m, b) @@ -4393,7 +4684,7 @@ func (m *RouteTable_Row) Reset() { *m = RouteTable_Row{} } func (m *RouteTable_Row) String() string { return proto.CompactTextString(m) } func (*RouteTable_Row) ProtoMessage() {} func (*RouteTable_Row) Descriptor() ([]byte, []int) { - return fileDescriptor_public_8b7d79a666eb4d6b, []int{29, 0} + return fileDescriptor_public_e3e3347d5819a629, []int{32, 0} } func (m *RouteTable_Row) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_RouteTable_Row.Unmarshal(m, b) @@ -4487,6 +4778,10 @@ func init() { proto.RegisterType((*StatTable_PodGroup)(nil), "linkerd2.public.StatTable.PodGroup") proto.RegisterType((*StatTable_PodGroup_Row)(nil), "linkerd2.public.StatTable.PodGroup.Row") proto.RegisterMapType((map[string]*PodErrors)(nil), "linkerd2.public.StatTable.PodGroup.Row.ErrorsByPodEntry") + proto.RegisterType((*EdgesRequest)(nil), "linkerd2.public.EdgesRequest") + proto.RegisterType((*EdgesResponse)(nil), "linkerd2.public.EdgesResponse") + proto.RegisterType((*EdgesResponse_Ok)(nil), "linkerd2.public.EdgesResponse.Ok") + proto.RegisterType((*Edge)(nil), "linkerd2.public.Edge") proto.RegisterType((*TopRoutesRequest)(nil), "linkerd2.public.TopRoutesRequest") proto.RegisterType((*TopRoutesResponse)(nil), "linkerd2.public.TopRoutesResponse") proto.RegisterType((*TopRoutesResponse_Ok)(nil), "linkerd2.public.TopRoutesResponse.Ok") @@ -4510,6 +4805,7 @@ const _ = grpc.SupportPackageIsVersion4 // For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream. type ApiClient interface { StatSummary(ctx context.Context, in *StatSummaryRequest, opts ...grpc.CallOption) (*StatSummaryResponse, error) + Edges(ctx context.Context, in *EdgesRequest, opts ...grpc.CallOption) (*EdgesResponse, error) TopRoutes(ctx context.Context, in *TopRoutesRequest, opts ...grpc.CallOption) (*TopRoutesResponse, error) ListPods(ctx context.Context, in *ListPodsRequest, opts ...grpc.CallOption) (*ListPodsResponse, error) ListServices(ctx context.Context, in *ListServicesRequest, opts ...grpc.CallOption) (*ListServicesResponse, error) @@ -4539,6 +4835,15 @@ func (c *apiClient) StatSummary(ctx context.Context, in *StatSummaryRequest, opt return out, nil } +func (c *apiClient) Edges(ctx context.Context, in *EdgesRequest, opts ...grpc.CallOption) (*EdgesResponse, error) { + out := new(EdgesResponse) + err := c.cc.Invoke(ctx, "/linkerd2.public.Api/Edges", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + func (c *apiClient) TopRoutes(ctx context.Context, in *TopRoutesRequest, opts ...grpc.CallOption) (*TopRoutesResponse, error) { out := new(TopRoutesResponse) err := c.cc.Invoke(ctx, "/linkerd2.public.Api/TopRoutes", in, out, opts...) @@ -4661,6 +4966,7 @@ func (c *apiClient) Config(ctx context.Context, in *Empty, opts ...grpc.CallOpti // ApiServer is the server API for Api service. type ApiServer interface { StatSummary(context.Context, *StatSummaryRequest) (*StatSummaryResponse, error) + Edges(context.Context, *EdgesRequest) (*EdgesResponse, error) TopRoutes(context.Context, *TopRoutesRequest) (*TopRoutesResponse, error) ListPods(context.Context, *ListPodsRequest) (*ListPodsResponse, error) ListServices(context.Context, *ListServicesRequest) (*ListServicesResponse, error) @@ -4695,6 +5001,24 @@ func _Api_StatSummary_Handler(srv interface{}, ctx context.Context, dec func(int return interceptor(ctx, in, info, handler) } +func _Api_Edges_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(EdgesRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ApiServer).Edges(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/linkerd2.public.Api/Edges", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ApiServer).Edges(ctx, req.(*EdgesRequest)) + } + return interceptor(ctx, in, info, handler) +} + func _Api_TopRoutes_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(TopRoutesRequest) if err := dec(in); err != nil { @@ -4853,6 +5177,10 @@ var _Api_serviceDesc = grpc.ServiceDesc{ MethodName: "StatSummary", Handler: _Api_StatSummary_Handler, }, + { + MethodName: "Edges", + Handler: _Api_Edges_Handler, + }, { MethodName: "TopRoutes", Handler: _Api_TopRoutes_Handler, @@ -4893,191 +5221,201 @@ var _Api_serviceDesc = grpc.ServiceDesc{ Metadata: "public.proto", } -func init() { proto.RegisterFile("public.proto", fileDescriptor_public_8b7d79a666eb4d6b) } +func init() { proto.RegisterFile("public.proto", fileDescriptor_public_e3e3347d5819a629) } -var fileDescriptor_public_8b7d79a666eb4d6b = []byte{ - // 2922 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xd4, 0x1a, 0x4d, 0x73, 0x1b, 0x49, - 0x55, 0xdf, 0x1f, 0x4f, 0xb2, 0xad, 0x74, 0xbc, 0x41, 0x3b, 0xbb, 0x64, 0x9d, 0xc9, 0xc7, 0x9a, - 0x2c, 0xc8, 0x5e, 0x67, 0x93, 0x8d, 0x37, 0xcb, 0x87, 0x65, 0x6b, 0x63, 0x83, 0x63, 0x6b, 0x5b, - 0x0a, 0x5b, 0x95, 0x5a, 0x4a, 0x35, 0xd6, 0xb4, 0xed, 0xc1, 0xa3, 0xe9, 0xc9, 0x4c, 0x2b, 0x5e, - 0x5d, 0x39, 0x51, 0x45, 0x51, 0x9c, 0x38, 0x73, 0xa4, 0xa0, 0xb8, 0x70, 0xe1, 0x4f, 0xc0, 0x95, - 0xe2, 0x06, 0x37, 0x2e, 0x5b, 0x1c, 0xa8, 0xe2, 0xc4, 0x81, 0xa2, 0xfa, 0x6b, 0x34, 0x63, 0x49, - 0xfe, 0x08, 0x1c, 0xe0, 0xa4, 0x7e, 0xaf, 0xdf, 0x7b, 0xfd, 0xbe, 0xfa, 0xbd, 0xee, 0x1e, 0x41, - 0xd5, 0x1f, 0x1e, 0xb8, 0x4e, 0xbf, 0xe1, 0x07, 0x94, 0x51, 0xb4, 0xe0, 0x3a, 0xde, 0x09, 0x09, - 0xec, 0xb5, 0x86, 0x44, 0x1b, 0x37, 0x8f, 0x28, 0x3d, 0x72, 0xc9, 0x8a, 0x98, 0x3e, 0x18, 0x1e, - 0xae, 0xd8, 0xc3, 0xc0, 0x62, 0x0e, 0xf5, 0x24, 0x83, 0x51, 0xef, 0xd3, 0xc1, 0x80, 0x7a, 0x2b, - 0xc7, 0xc4, 0x72, 0xd9, 0x71, 0xff, 0x98, 0xf4, 0x4f, 0xd4, 0xcc, 0xf5, 0x3e, 0xf5, 0x0e, 0x9d, - 0xa3, 0x15, 0xf9, 0x23, 0x91, 0x66, 0x11, 0xf2, 0xad, 0x81, 0xcf, 0x46, 0xe6, 0x4b, 0xa8, 0x7c, - 0x9f, 0x04, 0xa1, 0x43, 0xbd, 0x1d, 0xef, 0x90, 0xa2, 0xb7, 0xa1, 0x7c, 0x44, 0x15, 0xa2, 0x9e, - 0x5e, 0x4a, 0x2f, 0x97, 0xf1, 0x18, 0xc1, 0x67, 0x0f, 0x86, 0x8e, 0x6b, 0x6f, 0x59, 0x8c, 0xd4, - 0x33, 0x72, 0x36, 0x42, 0xa0, 0x7b, 0x30, 0x1f, 0x10, 0x97, 0x58, 0x21, 0xd1, 0x02, 0xb2, 0x82, - 0xe4, 0x0c, 0xd6, 0x7c, 0x00, 0xd7, 0x77, 0x9d, 0x90, 0x75, 0x48, 0xf0, 0xca, 0xe9, 0x93, 0x10, - 0x93, 0x97, 0x43, 0x12, 0x32, 0x2e, 0xdc, 0xb3, 0x06, 0x24, 0xf4, 0xad, 0x3e, 0xd1, 0x4b, 0x47, - 0x08, 0x73, 0x17, 0x16, 0x93, 0x4c, 0xa1, 0x4f, 0xbd, 0x90, 0xa0, 0x0f, 0xa0, 0x14, 0x2a, 0x5c, - 0x3d, 0xbd, 0x94, 0x5d, 0xae, 0xac, 0xd5, 0x1b, 0x67, 0x7c, 0xd7, 0x50, 0x4c, 0x38, 0xa2, 0x34, - 0x9f, 0x40, 0x51, 0x21, 0x11, 0x82, 0x1c, 0x5f, 0x45, 0xad, 0x28, 0xc6, 0x49, 0x55, 0x32, 0x67, - 0x55, 0x09, 0x61, 0x81, 0xab, 0xd2, 0xa6, 0x76, 0xa4, 0xfb, 0xd2, 0x84, 0xee, 0xcd, 0x4c, 0x3d, - 0x1d, 0x63, 0x42, 0xdf, 0xe2, 0x7a, 0xba, 0xa4, 0xcf, 0x68, 0x20, 0x24, 0x56, 0xd6, 0xcc, 0x09, - 0x3d, 0x31, 0x09, 0xe9, 0x30, 0xe8, 0x93, 0x8e, 0x20, 0x74, 0xa8, 0x87, 0x23, 0x1e, 0xf3, 0x63, - 0xa8, 0x8d, 0x17, 0x55, 0xb6, 0x2f, 0x43, 0xce, 0xa7, 0xb6, 0xb6, 0x7b, 0x71, 0x42, 0x5e, 0x9b, - 0xda, 0x58, 0x50, 0x98, 0xff, 0xcc, 0x41, 0xb6, 0x4d, 0xed, 0xa9, 0xc6, 0x2e, 0x42, 0xde, 0xa7, - 0xf6, 0x4e, 0x5b, 0x19, 0x2a, 0x01, 0xb4, 0x04, 0x60, 0x13, 0xdf, 0xa5, 0xa3, 0x01, 0xf1, 0x98, - 0x0c, 0xe4, 0x76, 0x0a, 0xc7, 0x70, 0xe8, 0x16, 0x54, 0x02, 0xe2, 0xbb, 0x4e, 0xdf, 0xea, 0x85, - 0x84, 0xd5, 0x41, 0x93, 0x28, 0x64, 0x87, 0x30, 0xf4, 0x21, 0xdc, 0x50, 0x10, 0xb7, 0xa6, 0xd7, - 0xa7, 0x1e, 0x0b, 0xa8, 0xeb, 0x92, 0xa0, 0x5e, 0x51, 0xd4, 0x6f, 0xc4, 0xe6, 0x37, 0xa3, 0x69, - 0x74, 0x1b, 0xaa, 0x21, 0xb3, 0x18, 0x39, 0x1c, 0xba, 0x42, 0x78, 0x55, 0x91, 0x57, 0x34, 0x96, - 0x4b, 0x7f, 0x07, 0xc0, 0xb6, 0xc8, 0x80, 0x7a, 0x82, 0x64, 0x4e, 0x91, 0x94, 0x25, 0x8e, 0x13, - 0x20, 0xc8, 0xfe, 0x90, 0x1e, 0xd4, 0xe7, 0xd5, 0x0c, 0x07, 0xd0, 0x0d, 0x28, 0x70, 0x19, 0xc3, - 0xb0, 0x9e, 0x13, 0xe6, 0x2a, 0x88, 0x7b, 0xc1, 0xb2, 0x6d, 0x62, 0xd7, 0xf3, 0x4b, 0xe9, 0xe5, - 0x12, 0x96, 0x00, 0xda, 0x84, 0x85, 0xd0, 0xf1, 0xfa, 0x64, 0xd7, 0x0a, 0x19, 0x26, 0x3e, 0x0d, - 0x58, 0xbd, 0x20, 0x82, 0xf7, 0x66, 0x43, 0xee, 0xc7, 0x86, 0xde, 0x8f, 0x8d, 0x2d, 0xb5, 0x1f, - 0xf1, 0x59, 0x0e, 0xb4, 0x0a, 0xd7, 0xc7, 0x96, 0xef, 0x45, 0x69, 0x52, 0x14, 0xeb, 0x4f, 0x9b, - 0x42, 0x26, 0x54, 0x15, 0xba, 0xed, 0x5a, 0x1e, 0xa9, 0x97, 0x84, 0x4e, 0x09, 0x1c, 0x7a, 0x1f, - 0x0a, 0x43, 0x9f, 0x39, 0x03, 0x52, 0x2f, 0x5f, 0xa4, 0x91, 0x22, 0x44, 0x37, 0x01, 0xfc, 0x80, - 0x7e, 0x31, 0xc2, 0xc4, 0xb2, 0x47, 0xf5, 0x05, 0x21, 0x34, 0x86, 0xe1, 0xcb, 0x0a, 0x48, 0x6f, - 0xdf, 0x9a, 0xd0, 0x30, 0x81, 0x43, 0xcb, 0xb0, 0x10, 0xa8, 0x34, 0xd5, 0x64, 0xd7, 0x04, 0xd9, - 0x59, 0x74, 0xb3, 0x08, 0x79, 0x7a, 0xea, 0x91, 0xc0, 0xfc, 0x75, 0x06, 0xa0, 0x6b, 0xf9, 0x7a, - 0xaf, 0x20, 0xc8, 0xfa, 0xd4, 0x96, 0x29, 0xc8, 0xa3, 0xe2, 0x53, 0xfb, 0x4c, 0xb6, 0x65, 0xa6, - 0x64, 0xdb, 0x0d, 0x28, 0x0c, 0xac, 0x2f, 0xb0, 0x1f, 0x8a, 0x5c, 0xcc, 0x60, 0x05, 0x71, 0x3c, - 0xa3, 0x6d, 0x1e, 0x18, 0x1e, 0xcf, 0x39, 0xac, 0x20, 0x9e, 0xe9, 0x8c, 0xee, 0xb4, 0x45, 0x38, - 0xcb, 0x58, 0x8c, 0x91, 0x01, 0xa5, 0xc3, 0x80, 0x0e, 0xda, 0x3a, 0x8c, 0x73, 0x38, 0x82, 0xb9, - 0x1c, 0x3e, 0xde, 0x69, 0xab, 0xb8, 0x28, 0x48, 0xe4, 0x4b, 0xff, 0x98, 0x0c, 0x64, 0x10, 0x78, - 0xbe, 0x08, 0x48, 0xe8, 0x43, 0xd8, 0x31, 0xb5, 0x85, 0xfb, 0xcb, 0x58, 0x41, 0xbc, 0x74, 0x58, - 0x43, 0x76, 0x4c, 0x03, 0x87, 0x8d, 0xe4, 0x9e, 0xc0, 0x63, 0x04, 0xd7, 0xca, 0xb7, 0xd8, 0xb1, - 0x4c, 0x7f, 0x2c, 0xc6, 0x1f, 0x65, 0xea, 0xe9, 0x66, 0x09, 0x0a, 0xcc, 0x0a, 0x8e, 0x08, 0x33, - 0xff, 0x9a, 0x87, 0xc5, 0xae, 0xe5, 0x37, 0x47, 0xba, 0x18, 0x68, 0xb7, 0x7d, 0xa4, 0x49, 0x84, - 0xe7, 0x2e, 0x57, 0x3e, 0x14, 0x07, 0xda, 0x80, 0xfc, 0xc0, 0x62, 0xfd, 0x63, 0x55, 0x79, 0xde, - 0x9b, 0x60, 0x9d, 0xb6, 0x62, 0xe3, 0x19, 0x67, 0xc1, 0x92, 0x73, 0x96, 0xff, 0x8d, 0xdf, 0xe5, - 0x20, 0x2f, 0x08, 0xd1, 0x26, 0x64, 0x2d, 0xd7, 0x55, 0xda, 0xad, 0x5c, 0x61, 0x89, 0x46, 0x87, - 0xbc, 0xe4, 0x89, 0x60, 0xb9, 0xae, 0x10, 0xe2, 0x8d, 0x94, 0x9e, 0xaf, 0x25, 0xc4, 0x1b, 0xa1, - 0x6f, 0x43, 0xd6, 0xa3, 0xb2, 0x68, 0x5d, 0xcd, 0x58, 0x2e, 0xc0, 0xa3, 0x0c, 0x6d, 0x43, 0xd5, - 0x26, 0x21, 0x73, 0x3c, 0xb1, 0x7f, 0x64, 0xa9, 0xb8, 0x94, 0xc7, 0xb7, 0x53, 0x38, 0xc1, 0x89, - 0x3e, 0x81, 0xdc, 0x31, 0x63, 0xbe, 0x48, 0xc3, 0xca, 0xda, 0xea, 0x55, 0x0c, 0xda, 0x66, 0xcc, - 0xdf, 0x4e, 0x61, 0xc1, 0x6f, 0xec, 0x42, 0xb6, 0x43, 0x5e, 0xa2, 0x16, 0x14, 0x45, 0x38, 0xa2, - 0x66, 0x77, 0xa5, 0x50, 0x6a, 0x5e, 0x63, 0x04, 0x39, 0x2e, 0x1d, 0xd5, 0xa3, 0xe4, 0xd6, 0xbb, - 0x51, 0xa7, 0x77, 0x3d, 0x4a, 0x6f, 0xbd, 0x19, 0x75, 0x82, 0xdf, 0x8c, 0x27, 0xb8, 0xee, 0x0b, - 0xb1, 0x14, 0x5f, 0x54, 0x29, 0x9e, 0x53, 0x53, 0x02, 0xe2, 0xc5, 0x40, 0x2c, 0x1e, 0x0d, 0xcc, - 0x7f, 0xa4, 0x01, 0xb8, 0x12, 0xcf, 0xa4, 0xd8, 0x6d, 0x80, 0x80, 0x1c, 0x39, 0x21, 0x23, 0x01, - 0x91, 0xc5, 0x61, 0x7e, 0xed, 0xde, 0x84, 0x71, 0x63, 0x86, 0x06, 0x8e, 0xa8, 0x65, 0xd3, 0xd1, - 0x10, 0xba, 0x03, 0xd5, 0xa1, 0x17, 0x93, 0xa5, 0x0d, 0x48, 0x60, 0x4d, 0x0f, 0x60, 0x2c, 0x01, - 0x15, 0x21, 0xfb, 0xb4, 0xd5, 0xad, 0xa5, 0x50, 0x09, 0x72, 0xed, 0xfd, 0x4e, 0xb7, 0x96, 0xe6, - 0xa8, 0xf6, 0xf3, 0x6e, 0x2d, 0x83, 0x00, 0x0a, 0x5b, 0xad, 0xdd, 0x56, 0xb7, 0x55, 0xcb, 0xa2, - 0x32, 0xe4, 0xdb, 0x1b, 0xdd, 0xcd, 0xed, 0x5a, 0x0e, 0x55, 0xa0, 0xb8, 0xdf, 0xee, 0xee, 0xec, - 0xef, 0x75, 0x6a, 0x79, 0x0e, 0x6c, 0xee, 0xef, 0xed, 0xb5, 0x36, 0xbb, 0xb5, 0x02, 0x97, 0xb1, - 0xdd, 0xda, 0xd8, 0xaa, 0x15, 0x39, 0x79, 0x17, 0x6f, 0x6c, 0xb6, 0x6a, 0xa5, 0x66, 0x01, 0x72, - 0x6c, 0xe4, 0x13, 0xf3, 0x17, 0x69, 0x28, 0x74, 0xa4, 0x8f, 0xb7, 0xa6, 0x98, 0x3c, 0x99, 0x63, - 0x92, 0xf8, 0x3f, 0x35, 0xf7, 0x56, 0xc2, 0x5c, 0xae, 0x61, 0xb7, 0xdb, 0xae, 0xa5, 0xb8, 0x86, - 0x7c, 0xd4, 0xa9, 0xa5, 0x23, 0x0d, 0xbb, 0x50, 0xde, 0x69, 0x6f, 0xd8, 0x76, 0x40, 0x42, 0xde, - 0x16, 0x73, 0x8e, 0xff, 0xea, 0x03, 0xa1, 0x5d, 0x91, 0x47, 0x93, 0x43, 0xe8, 0x3d, 0x81, 0x7d, - 0xa4, 0xb6, 0xe9, 0x1b, 0x13, 0x3a, 0xef, 0xb4, 0x5f, 0x3d, 0x52, 0xc4, 0x8f, 0x9a, 0x39, 0xc8, - 0x38, 0xbe, 0xb9, 0x0a, 0x39, 0x8e, 0xe5, 0x7d, 0xf6, 0xd0, 0x09, 0x42, 0x59, 0xc5, 0x0a, 0x58, - 0x02, 0xbc, 0x2e, 0xba, 0x56, 0x28, 0x2b, 0x7f, 0x01, 0x8b, 0xb1, 0xb9, 0x0b, 0xd0, 0xed, 0xfb, - 0x5a, 0x91, 0xfb, 0x5c, 0x8a, 0x2a, 0x2e, 0xc6, 0x94, 0x05, 0x15, 0x1d, 0xce, 0x38, 0xbe, 0xa8, - 0xb2, 0xbc, 0xc6, 0x67, 0x44, 0x8d, 0x17, 0x63, 0xd3, 0x86, 0x6c, 0x8b, 0x72, 0x31, 0xb5, 0xa3, - 0xc0, 0xef, 0xf7, 0x64, 0xd7, 0xef, 0xf5, 0xa9, 0x2d, 0x73, 0x7f, 0x6e, 0x3b, 0x85, 0xe7, 0xf9, - 0x4c, 0x47, 0x4c, 0x6c, 0x52, 0x9b, 0x70, 0xda, 0x80, 0x84, 0x84, 0xf5, 0x48, 0x10, 0xd0, 0x40, - 0xd2, 0x66, 0x34, 0xad, 0x98, 0x69, 0xf1, 0x09, 0x4e, 0xdb, 0xcc, 0x43, 0x96, 0x78, 0xb6, 0xf9, - 0xc7, 0x79, 0x28, 0x75, 0x2d, 0xbf, 0xf5, 0x8a, 0xb7, 0xac, 0x07, 0x50, 0x90, 0xbb, 0x50, 0xa9, - 0xfd, 0xd6, 0xe4, 0x5e, 0x8d, 0xec, 0xc3, 0x8a, 0x14, 0x3d, 0x85, 0x8a, 0x1c, 0xf5, 0x06, 0x84, - 0x59, 0xaa, 0x6e, 0xdc, 0x9b, 0xb6, 0xcb, 0xc5, 0x22, 0x8d, 0x96, 0x67, 0xfb, 0xd4, 0xf1, 0xd8, - 0x33, 0xc2, 0x2c, 0x0c, 0x92, 0x95, 0x8f, 0xd1, 0x37, 0xa1, 0x12, 0xab, 0x44, 0x2a, 0x54, 0xe7, - 0xaa, 0x10, 0xa7, 0x47, 0x9f, 0x42, 0x2d, 0x06, 0x4a, 0x65, 0x72, 0x57, 0x52, 0x66, 0x21, 0xc6, - 0x2f, 0x34, 0x6a, 0x02, 0x04, 0x74, 0xc8, 0x94, 0x65, 0x45, 0x21, 0xec, 0xf6, 0x6c, 0x61, 0x98, - 0xd3, 0x0a, 0x49, 0xe5, 0x40, 0x0f, 0xd1, 0xa7, 0xb0, 0x20, 0x8e, 0x23, 0x3d, 0xdb, 0x09, 0x64, - 0xc9, 0x15, 0x9d, 0x7c, 0x7e, 0x6d, 0x79, 0xb6, 0xa0, 0x36, 0x67, 0xd8, 0xd2, 0xf4, 0x78, 0xde, - 0x4f, 0xc0, 0xe8, 0x03, 0x55, 0xa2, 0x65, 0xbb, 0xb8, 0x39, 0x5b, 0x4e, 0xa2, 0x20, 0xff, 0x3c, - 0x0d, 0xd5, 0xb8, 0xb9, 0xe8, 0xbb, 0x50, 0x70, 0xad, 0x03, 0xe2, 0xea, 0xca, 0xbc, 0x76, 0x39, - 0x37, 0x35, 0x76, 0x05, 0x53, 0xcb, 0x63, 0xc1, 0x08, 0x2b, 0x09, 0xc6, 0x3a, 0x54, 0x62, 0x68, - 0x54, 0x83, 0xec, 0x09, 0x19, 0xa9, 0x43, 0x3b, 0x1f, 0xf2, 0x5d, 0xf4, 0xca, 0x72, 0x87, 0xfa, - 0x72, 0x22, 0x81, 0x8f, 0x32, 0x8f, 0xd3, 0xc6, 0xcf, 0xd2, 0x50, 0x8e, 0x3c, 0x87, 0x9e, 0x9e, - 0x51, 0x6a, 0xe5, 0x12, 0xee, 0xfe, 0x6f, 0x6b, 0xf4, 0xaf, 0xa2, 0xea, 0x36, 0xfb, 0x50, 0x0d, - 0x64, 0x3f, 0xea, 0x39, 0x9e, 0xa3, 0xcf, 0x31, 0xf7, 0xcf, 0x77, 0x78, 0x43, 0xb5, 0xb0, 0x1d, - 0xcf, 0x61, 0xfc, 0x02, 0x10, 0x8c, 0x41, 0x84, 0x61, 0x2e, 0x50, 0x77, 0x21, 0x29, 0xf1, 0x9c, - 0xe3, 0x4d, 0x42, 0xa2, 0xe4, 0x51, 0x22, 0xab, 0x41, 0x0c, 0x96, 0x4a, 0x2a, 0x99, 0xc4, 0xb3, - 0x55, 0x56, 0xdc, 0xbf, 0xa4, 0xc8, 0x96, 0x67, 0x4b, 0x25, 0x23, 0xd0, 0x78, 0x04, 0xa5, 0x0e, - 0x0b, 0x88, 0x35, 0xd8, 0x11, 0xd7, 0xaf, 0x03, 0x2b, 0x54, 0x15, 0x07, 0x8b, 0xb1, 0xbc, 0x90, - 0xf0, 0x79, 0xa1, 0x7d, 0x0e, 0x2b, 0xc8, 0xf8, 0x73, 0x1a, 0x2a, 0x31, 0xdb, 0xd1, 0x87, 0x90, - 0x71, 0x6c, 0xe5, 0xb3, 0x77, 0x2f, 0x50, 0x47, 0x2f, 0x88, 0x33, 0x8e, 0xcd, 0xcb, 0x50, 0xac, - 0x95, 0x4f, 0xab, 0x01, 0xe3, 0xae, 0x1a, 0x75, 0xf9, 0x95, 0xe8, 0x64, 0x20, 0x1d, 0xf0, 0x95, - 0x19, 0x7d, 0x29, 0x3a, 0x30, 0x24, 0xce, 0xbd, 0xb9, 0x59, 0xe7, 0xde, 0xfc, 0xf8, 0xdc, 0x6b, - 0xfc, 0x36, 0x0d, 0xd5, 0x78, 0x28, 0x5e, 0xdf, 0xc2, 0xa7, 0x80, 0xc4, 0x9d, 0xab, 0x97, 0x48, - 0xaf, 0xcc, 0x45, 0xd7, 0xa2, 0x9a, 0x60, 0x8a, 0xfb, 0xf8, 0x1d, 0xa8, 0xf0, 0xcd, 0xad, 0xba, - 0x83, 0x30, 0x7d, 0x0e, 0x03, 0x47, 0xc9, 0xb6, 0x60, 0xfc, 0x2a, 0xc3, 0x83, 0x12, 0x05, 0xf7, - 0x7f, 0x40, 0xe5, 0x1d, 0xb8, 0xae, 0x05, 0xc5, 0x77, 0x42, 0xf6, 0x22, 0x49, 0xd7, 0x94, 0xa4, - 0x98, 0xff, 0xef, 0xc2, 0x7c, 0x24, 0xe4, 0x60, 0xc4, 0x88, 0x3c, 0xf7, 0xe6, 0x70, 0xb4, 0xc9, - 0x9a, 0x1c, 0x89, 0xee, 0x41, 0x96, 0xd0, 0x50, 0x75, 0xa6, 0xc9, 0x47, 0x87, 0x16, 0x0d, 0x31, - 0x27, 0xe0, 0x27, 0x3d, 0xc2, 0xad, 0x37, 0x1f, 0xc3, 0x7c, 0xb2, 0x04, 0xf3, 0xe3, 0xd2, 0xf3, - 0xbd, 0xef, 0xed, 0xed, 0x7f, 0xb6, 0x57, 0x4b, 0x71, 0x60, 0x67, 0xaf, 0xb9, 0xff, 0x7c, 0x6f, - 0xab, 0x96, 0x46, 0x55, 0x28, 0xed, 0x3f, 0xef, 0x4a, 0x28, 0x33, 0x16, 0xb1, 0x04, 0xa5, 0x0d, - 0xdf, 0x11, 0xed, 0x96, 0x57, 0x1a, 0xd1, 0x90, 0x55, 0xf5, 0x91, 0x00, 0xbf, 0x64, 0x96, 0xdb, - 0xd4, 0x16, 0x24, 0x21, 0x7a, 0x02, 0x05, 0x81, 0xd6, 0x75, 0xef, 0xf6, 0xb4, 0xb7, 0x11, 0x49, - 0x1b, 0x8d, 0xb0, 0x62, 0x31, 0xfe, 0x92, 0x86, 0x92, 0x46, 0x22, 0x0c, 0x65, 0x7e, 0xed, 0xb6, - 0x1c, 0x8f, 0x04, 0x2a, 0xd0, 0x6b, 0x97, 0x10, 0xd6, 0xd8, 0xd4, 0x4c, 0x02, 0xe4, 0x47, 0xe4, - 0x48, 0x8c, 0xf1, 0x0a, 0xe6, 0x93, 0xd3, 0xa8, 0x0e, 0xc5, 0x01, 0x09, 0x43, 0xeb, 0x48, 0x3f, - 0xcd, 0x68, 0x90, 0xef, 0xab, 0xf1, 0xfa, 0xea, 0x29, 0x2a, 0x42, 0x70, 0x5f, 0x38, 0x03, 0xce, - 0x25, 0x5f, 0xda, 0x24, 0xc0, 0x4b, 0x4a, 0x40, 0xac, 0x90, 0x7a, 0xfa, 0x8d, 0x43, 0x42, 0xc2, - 0x9d, 0xc2, 0x59, 0x6d, 0x28, 0xe9, 0x1b, 0xc2, 0xf9, 0xcf, 0x6e, 0xe2, 0x1a, 0x3d, 0xf2, 0x75, - 0x55, 0x17, 0xe3, 0xe8, 0x11, 0x29, 0x3b, 0x7e, 0x44, 0x32, 0x5f, 0xc2, 0xb5, 0x89, 0xcb, 0x10, - 0x7a, 0x08, 0x25, 0xfd, 0x28, 0xa0, 0x5c, 0xf7, 0xe6, 0xcc, 0x2b, 0x14, 0x8e, 0x48, 0x79, 0x1e, - 0x8a, 0xae, 0xd3, 0x4b, 0x3c, 0x98, 0x95, 0xf1, 0x9c, 0xc0, 0x76, 0xf4, 0x8b, 0xd8, 0xe7, 0x30, - 0xa7, 0x99, 0xa5, 0x13, 0x5f, 0x73, 0xb9, 0x28, 0x9f, 0x32, 0xf1, 0x7c, 0xfa, 0x32, 0x03, 0x88, - 0x6f, 0xfa, 0xce, 0x70, 0x30, 0xb0, 0x82, 0x91, 0xbe, 0x85, 0xc7, 0x9f, 0xf1, 0xd2, 0x57, 0x7f, - 0xc6, 0xe3, 0x15, 0x86, 0x39, 0x03, 0xd2, 0x3b, 0x75, 0x3c, 0x9b, 0x9e, 0xaa, 0x25, 0x81, 0xa3, - 0x3e, 0x13, 0x18, 0xf4, 0x75, 0xc8, 0x79, 0xd4, 0xd3, 0x65, 0xf7, 0xc6, 0xe4, 0xf6, 0x1a, 0xf8, - 0x6c, 0xc4, 0x4f, 0x21, 0x9c, 0x0a, 0x7d, 0x0c, 0x15, 0x46, 0x7b, 0x91, 0xd5, 0xb9, 0x0b, 0xac, - 0xe6, 0x57, 0x07, 0x46, 0xa3, 0xd0, 0x7f, 0x07, 0xe6, 0x0e, 0x03, 0x3a, 0x18, 0xf3, 0xe7, 0x2f, - 0xe6, 0xaf, 0x72, 0x8e, 0x48, 0xc2, 0x57, 0x01, 0xc2, 0x13, 0x47, 0x16, 0xcc, 0x50, 0x9c, 0xc4, - 0x4a, 0xb8, 0xcc, 0x31, 0xdc, 0x75, 0x21, 0x7a, 0x0b, 0xca, 0xac, 0xaf, 0x67, 0x8b, 0x62, 0xb6, - 0xc4, 0xfa, 0x72, 0xb2, 0x09, 0x50, 0xa2, 0x43, 0x76, 0x40, 0x87, 0x9e, 0x6d, 0xfe, 0x29, 0x0d, - 0xd7, 0x13, 0xde, 0x56, 0x2f, 0x9c, 0xeb, 0x90, 0xa1, 0x27, 0x33, 0xeb, 0xeb, 0x14, 0x8e, 0xc6, - 0xfe, 0xc9, 0x76, 0x0a, 0x67, 0xe8, 0x09, 0x7a, 0x14, 0x0f, 0xeb, 0xb4, 0x73, 0x5d, 0x22, 0x79, - 0xb6, 0x53, 0x2a, 0xf0, 0xc6, 0x06, 0x64, 0xf6, 0x4f, 0xd0, 0x13, 0x10, 0x4f, 0x8d, 0x3d, 0x66, - 0x1d, 0xb8, 0xd1, 0x65, 0xdb, 0x98, 0xaa, 0x41, 0x97, 0x93, 0x60, 0x08, 0xf5, 0x50, 0x58, 0xa6, - 0x4b, 0xa6, 0xf9, 0x9b, 0x0c, 0x40, 0xd3, 0x0a, 0x9d, 0xbe, 0xf4, 0xc8, 0x6d, 0x98, 0x0b, 0x87, - 0xfd, 0x3e, 0x09, 0xf9, 0xdd, 0x63, 0xe8, 0xc9, 0x43, 0x50, 0x0e, 0x57, 0x15, 0x72, 0x93, 0xe3, - 0x38, 0xd1, 0xa1, 0xe5, 0xb8, 0xc3, 0x80, 0x28, 0x22, 0x79, 0x32, 0xa8, 0x2a, 0xa4, 0x24, 0xba, - 0xc3, 0x77, 0x09, 0x23, 0x5e, 0x7f, 0xd4, 0x1b, 0x84, 0x3d, 0xff, 0xe1, 0xaa, 0x48, 0x99, 0x1c, - 0xae, 0x2a, 0xec, 0xb3, 0xb0, 0xfd, 0x70, 0xf5, 0x2c, 0xd5, 0xfa, 0x43, 0x55, 0xd3, 0x63, 0x54, - 0xeb, 0x0f, 0x27, 0xa8, 0xd6, 0x45, 0x26, 0x24, 0xa9, 0xd6, 0xd1, 0x2a, 0x2c, 0x5a, 0x7d, 0x36, - 0xb4, 0xdc, 0x5e, 0xd2, 0x84, 0x82, 0xa0, 0x45, 0x72, 0xae, 0x13, 0x37, 0x64, 0xcc, 0x91, 0xb4, - 0xa7, 0x18, 0xe7, 0xf8, 0x24, 0x66, 0x95, 0xf9, 0x93, 0x34, 0x94, 0xba, 0x2a, 0x43, 0xd0, 0xd7, - 0xa0, 0x46, 0x7d, 0x22, 0xde, 0x8d, 0x3d, 0xb9, 0x93, 0x42, 0xe5, 0xaf, 0x05, 0x8e, 0xdf, 0x1c, - 0xa3, 0xd1, 0x32, 0xbf, 0xab, 0x59, 0xb6, 0xec, 0x5b, 0x3d, 0x46, 0x99, 0xe5, 0x2a, 0xaf, 0xcd, - 0x73, 0xbc, 0xe8, 0x5c, 0x5d, 0x8e, 0x45, 0xf7, 0xe1, 0xda, 0x69, 0xe0, 0x30, 0x92, 0x20, 0x95, - 0xae, 0x5b, 0x10, 0x13, 0x63, 0x5a, 0xf3, 0x97, 0x79, 0x28, 0x47, 0x21, 0x46, 0x4d, 0x28, 0xfb, - 0xd4, 0xee, 0x1d, 0x05, 0x74, 0xa8, 0x6f, 0xa2, 0xb7, 0x67, 0x67, 0x04, 0x6f, 0x05, 0x4f, 0x39, - 0xe9, 0x76, 0x0a, 0x97, 0x7c, 0x35, 0x36, 0xfe, 0x90, 0x13, 0xbd, 0x45, 0x00, 0xe8, 0x09, 0xe4, - 0x02, 0x7a, 0xaa, 0xb3, 0xeb, 0xdd, 0x4b, 0xc8, 0x6a, 0x60, 0x7a, 0x8a, 0x05, 0x93, 0xf1, 0xa3, - 0x1c, 0x64, 0x31, 0x3d, 0x7d, 0xdd, 0xaa, 0x77, 0x61, 0x21, 0x5a, 0x86, 0xda, 0x80, 0x84, 0xc7, - 0xc4, 0xee, 0x71, 0xa3, 0x65, 0xdc, 0xa4, 0x9b, 0xe6, 0x25, 0xbe, 0x4d, 0x6d, 0x19, 0xe5, 0xfb, - 0x70, 0x2d, 0x18, 0x7a, 0x9e, 0xe3, 0x1d, 0xc5, 0x48, 0x65, 0x9a, 0x2d, 0xa8, 0x89, 0x88, 0x76, - 0x19, 0x6a, 0x3c, 0x15, 0x12, 0x52, 0x65, 0xfe, 0xcc, 0x4b, 0x7c, 0x44, 0xf9, 0x3e, 0xe4, 0x65, - 0xdd, 0xc8, 0xcf, 0x38, 0xb5, 0x8e, 0x77, 0x15, 0x96, 0x94, 0xe8, 0x51, 0xbc, 0xdc, 0x94, 0x66, - 0xf8, 0x42, 0x67, 0xd7, 0xb8, 0x12, 0xa1, 0xcf, 0x61, 0x4e, 0xb6, 0xfe, 0xde, 0xc1, 0x88, 0xeb, - 0x55, 0x2f, 0x8a, 0x80, 0x3c, 0xbe, 0x64, 0x40, 0x1a, 0xb2, 0xf7, 0x37, 0x47, 0xbc, 0xf9, 0x8b, - 0x5b, 0x53, 0x85, 0x8c, 0x31, 0xc6, 0x0b, 0xa8, 0x9d, 0x25, 0x98, 0x72, 0x7f, 0x5a, 0x8d, 0xdf, - 0x9f, 0xa6, 0x95, 0x9a, 0xe8, 0x8c, 0x11, 0xbb, 0x5b, 0xf1, 0x8e, 0x2e, 0x2a, 0x94, 0xf9, 0x65, - 0x1a, 0x6a, 0x5d, 0xea, 0x8b, 0x4b, 0x5c, 0xf8, 0xff, 0xd1, 0xac, 0x8a, 0x57, 0x6a, 0x56, 0x89, - 0x76, 0xf1, 0xfb, 0x34, 0x5c, 0x8b, 0x59, 0xab, 0x9a, 0xc5, 0x6b, 0x56, 0x7c, 0x7e, 0x88, 0xa7, - 0x27, 0xca, 0x86, 0xbb, 0x93, 0xf9, 0x72, 0x76, 0x9d, 0xa8, 0xc5, 0x18, 0xeb, 0xa2, 0x55, 0x3c, - 0x80, 0x82, 0x78, 0x9f, 0xd0, 0xfb, 0x78, 0x32, 0x53, 0x05, 0xbf, 0x6c, 0x13, 0x8a, 0x34, 0xd1, - 0x22, 0xfe, 0x96, 0x06, 0x18, 0x93, 0xa0, 0x07, 0x89, 0xaa, 0xf0, 0xce, 0x39, 0xd2, 0xc6, 0xd5, - 0x00, 0x19, 0xb1, 0x2a, 0x20, 0xe3, 0x14, 0xc1, 0xc6, 0x4f, 0xd3, 0xb2, 0x52, 0x2c, 0x42, 0x5e, - 0xac, 0xae, 0x0f, 0xce, 0x02, 0xb8, 0x38, 0xc8, 0x89, 0x9b, 0x5d, 0xe1, 0xec, 0xcd, 0xee, 0xea, - 0xdb, 0x74, 0xed, 0xef, 0x79, 0xc8, 0x6e, 0xf8, 0x0e, 0x7a, 0x01, 0x95, 0x58, 0x07, 0x47, 0xb7, - 0xcf, 0xef, 0xef, 0x22, 0xa5, 0x8d, 0x3b, 0x97, 0x39, 0x04, 0x98, 0x29, 0xd4, 0x85, 0x72, 0x14, - 0x38, 0x74, 0xeb, 0xbc, 0xa0, 0x4a, 0xb9, 0xe6, 0xc5, 0x71, 0x37, 0x53, 0xe8, 0x53, 0x28, 0xe9, - 0x8f, 0xb0, 0x68, 0x69, 0x82, 0xe3, 0xcc, 0x47, 0x61, 0xe3, 0xd6, 0x39, 0x14, 0x91, 0xc8, 0x1f, - 0x40, 0x35, 0xfe, 0x5d, 0x1b, 0xdd, 0x99, 0xca, 0x74, 0xe6, 0x5b, 0xb9, 0x71, 0xf7, 0x02, 0xaa, - 0x48, 0xfc, 0x16, 0x64, 0xbb, 0x96, 0x8f, 0xde, 0x9a, 0x76, 0x37, 0xd5, 0xc2, 0xde, 0x9c, 0x79, - 0x71, 0x35, 0xb3, 0x3f, 0xce, 0xa4, 0x57, 0xd3, 0xe8, 0x39, 0xcc, 0x25, 0x3e, 0x2b, 0xa0, 0xbb, - 0x97, 0xfa, 0xec, 0x70, 0x9e, 0xe4, 0xd4, 0x6a, 0x1a, 0x6d, 0x40, 0x51, 0x7f, 0x56, 0x9c, 0x51, - 0x3b, 0x8c, 0xb7, 0x27, 0xf0, 0xb1, 0x7f, 0x2b, 0x98, 0x29, 0xe4, 0x42, 0xb9, 0x43, 0xdc, 0xc3, - 0xcd, 0x63, 0xd2, 0x3f, 0x41, 0xdf, 0x18, 0x13, 0xcb, 0x7f, 0x43, 0x34, 0xe2, 0xff, 0x86, 0x88, - 0xe8, 0xb4, 0x76, 0x8d, 0xcb, 0x92, 0x47, 0xde, 0x7c, 0x0c, 0x85, 0x4d, 0xf1, 0x2f, 0x8a, 0x99, - 0xfa, 0x2e, 0xc6, 0x65, 0x8a, 0xff, 0x5b, 0x6c, 0xb8, 0xae, 0x99, 0x6a, 0x3e, 0x78, 0xf1, 0xfe, - 0x91, 0xc3, 0x8e, 0x87, 0x07, 0x7c, 0xa9, 0x15, 0x45, 0xa3, 0x7f, 0xd7, 0x56, 0xc6, 0x1f, 0x81, - 0x57, 0x8e, 0x88, 0xb7, 0x22, 0x45, 0x1e, 0x14, 0xc4, 0xb5, 0xfd, 0xc1, 0xbf, 0x03, 0x00, 0x00, - 0xff, 0xff, 0x05, 0x14, 0x18, 0x26, 0x1b, 0x22, 0x00, 0x00, +var fileDescriptor_public_e3e3347d5819a629 = []byte{ + // 3077 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xd4, 0x5a, 0x3b, 0x70, 0x23, 0xc7, + 0xd1, 0xc6, 0xe2, 0x8d, 0x06, 0x40, 0xe2, 0xe6, 0xa8, 0xfb, 0x21, 0x48, 0x3a, 0xdd, 0xed, 0x3d, + 0xc4, 0xff, 0xee, 0xff, 0x41, 0x1e, 0xa9, 0x3b, 0x1d, 0x75, 0xf2, 0x83, 0x20, 0xa1, 0x23, 0x6c, + 0x1e, 0x09, 0x2d, 0x70, 0x56, 0x95, 0x4a, 0x2e, 0xd4, 0x12, 0x3b, 0x04, 0xd7, 0x5c, 0xec, 0xec, + 0xed, 0x0e, 0x48, 0x21, 0x75, 0xe4, 0x2a, 0x97, 0xcb, 0x91, 0x63, 0x87, 0x2e, 0xbb, 0x9c, 0x38, + 0x71, 0xa2, 0xcc, 0xa9, 0x9d, 0xba, 0x9c, 0xd9, 0x99, 0x13, 0x95, 0x33, 0x47, 0x0e, 0x5c, 0xae, + 0x79, 0x2d, 0x76, 0x09, 0x80, 0x8f, 0x93, 0x03, 0x3b, 0xc2, 0x74, 0xcf, 0xd7, 0x3d, 0xdd, 0x33, + 0x3d, 0xdd, 0x33, 0x83, 0x85, 0x92, 0x37, 0x3a, 0x70, 0xec, 0x7e, 0xdd, 0xf3, 0x09, 0x25, 0x68, + 0xd1, 0xb1, 0xdd, 0x63, 0xec, 0x5b, 0x6b, 0x75, 0xc1, 0xae, 0xdd, 0x1c, 0x10, 0x32, 0x70, 0xf0, + 0x0a, 0xef, 0x3e, 0x18, 0x1d, 0xae, 0x58, 0x23, 0xdf, 0xa4, 0x36, 0x71, 0x85, 0x40, 0xad, 0xda, + 0x27, 0xc3, 0x21, 0x71, 0x57, 0x8e, 0xb0, 0xe9, 0xd0, 0xa3, 0xfe, 0x11, 0xee, 0x1f, 0xcb, 0x9e, + 0xeb, 0x7d, 0xe2, 0x1e, 0xda, 0x83, 0x15, 0xf1, 0x23, 0x98, 0x7a, 0x0e, 0x32, 0xcd, 0xa1, 0x47, + 0xc7, 0xfa, 0x2b, 0x28, 0x7e, 0x0f, 0xfb, 0x81, 0x4d, 0xdc, 0x96, 0x7b, 0x48, 0xd0, 0xdb, 0x50, + 0x18, 0x10, 0xc9, 0xa8, 0x6a, 0xb7, 0xb4, 0xe5, 0x82, 0x31, 0x61, 0xb0, 0xde, 0x83, 0x91, 0xed, + 0x58, 0xdb, 0x26, 0xc5, 0xd5, 0xa4, 0xe8, 0x0d, 0x19, 0xe8, 0x3e, 0x2c, 0xf8, 0xd8, 0xc1, 0x66, + 0x80, 0x95, 0x82, 0x14, 0x87, 0x9c, 0xe1, 0xea, 0xeb, 0x70, 0x7d, 0xd7, 0x0e, 0x68, 0x07, 0xfb, + 0x27, 0x76, 0x1f, 0x07, 0x06, 0x7e, 0x35, 0xc2, 0x01, 0x65, 0xca, 0x5d, 0x73, 0x88, 0x03, 0xcf, + 0xec, 0x63, 0x35, 0x74, 0xc8, 0xd0, 0x77, 0x61, 0x29, 0x2e, 0x14, 0x78, 0xc4, 0x0d, 0x30, 0x7a, + 0x1f, 0xf2, 0x81, 0xe4, 0x55, 0xb5, 0x5b, 0xa9, 0xe5, 0xe2, 0x5a, 0xb5, 0x7e, 0x66, 0xee, 0xea, + 0x52, 0xc8, 0x08, 0x91, 0xfa, 0x33, 0xc8, 0x49, 0x26, 0x42, 0x90, 0x66, 0xa3, 0xc8, 0x11, 0x79, + 0x3b, 0x6e, 0x4a, 0xf2, 0xac, 0x29, 0x01, 0x2c, 0x32, 0x53, 0xda, 0xc4, 0x0a, 0x6d, 0xbf, 0x35, + 0x65, 0x7b, 0x23, 0x59, 0xd5, 0x22, 0x42, 0xe8, 0x9b, 0xcc, 0x4e, 0x07, 0xf7, 0x29, 0xf1, 0xb9, + 0xc6, 0xe2, 0x9a, 0x3e, 0x65, 0xa7, 0x81, 0x03, 0x32, 0xf2, 0xfb, 0xb8, 0xc3, 0x81, 0x36, 0x71, + 0x8d, 0x50, 0x46, 0xff, 0x08, 0x2a, 0x93, 0x41, 0xa5, 0xef, 0xcb, 0x90, 0xf6, 0x88, 0xa5, 0xfc, + 0x5e, 0x9a, 0xd2, 0xd7, 0x26, 0x96, 0xc1, 0x11, 0xfa, 0x3f, 0xd2, 0x90, 0x6a, 0x13, 0x6b, 0xa6, + 0xb3, 0x4b, 0x90, 0xf1, 0x88, 0xd5, 0x6a, 0x4b, 0x47, 0x05, 0x81, 0x6e, 0x01, 0x58, 0xd8, 0x73, + 0xc8, 0x78, 0x88, 0x5d, 0x2a, 0x16, 0x72, 0x27, 0x61, 0x44, 0x78, 0xe8, 0x36, 0x14, 0x7d, 0xec, + 0x39, 0x76, 0xdf, 0xec, 0x05, 0x98, 0x56, 0x41, 0x41, 0x24, 0xb3, 0x83, 0x29, 0xfa, 0x00, 0x6e, + 0x48, 0x8a, 0x79, 0xd3, 0xeb, 0x13, 0x97, 0xfa, 0xc4, 0x71, 0xb0, 0x5f, 0x2d, 0x4a, 0xf4, 0x1b, + 0x91, 0xfe, 0xad, 0xb0, 0x1b, 0xdd, 0x81, 0x52, 0x40, 0x4d, 0x8a, 0x0f, 0x47, 0x0e, 0x57, 0x5e, + 0x92, 0xf0, 0xa2, 0xe2, 0x32, 0xed, 0xef, 0x02, 0x58, 0x26, 0x1e, 0x12, 0x97, 0x43, 0xca, 0x12, + 0x52, 0x10, 0x3c, 0x06, 0x40, 0x90, 0xfa, 0x01, 0x39, 0xa8, 0x2e, 0xc8, 0x1e, 0x46, 0xa0, 0x1b, + 0x90, 0x65, 0x3a, 0x46, 0x41, 0x35, 0xcd, 0xdd, 0x95, 0x14, 0x9b, 0x05, 0xd3, 0xb2, 0xb0, 0x55, + 0xcd, 0xdc, 0xd2, 0x96, 0xf3, 0x86, 0x20, 0xd0, 0x16, 0x2c, 0x06, 0xb6, 0xdb, 0xc7, 0xbb, 0x66, + 0x40, 0x0d, 0xec, 0x11, 0x9f, 0x56, 0xb3, 0x7c, 0xf1, 0xde, 0xac, 0x8b, 0xfd, 0x58, 0x57, 0xfb, + 0xb1, 0xbe, 0x2d, 0xf7, 0xa3, 0x71, 0x56, 0x02, 0xad, 0xc2, 0xf5, 0x89, 0xe7, 0x7b, 0x61, 0x98, + 0xe4, 0xf8, 0xf8, 0xb3, 0xba, 0x90, 0x0e, 0x25, 0xc9, 0x6e, 0x3b, 0xa6, 0x8b, 0xab, 0x79, 0x6e, + 0x53, 0x8c, 0x87, 0x1e, 0x41, 0x76, 0xe4, 0x51, 0x7b, 0x88, 0xab, 0x85, 0x8b, 0x2c, 0x92, 0x40, + 0x74, 0x13, 0xc0, 0xf3, 0xc9, 0x17, 0x63, 0x03, 0x9b, 0xd6, 0xb8, 0xba, 0xc8, 0x95, 0x46, 0x38, + 0x6c, 0x58, 0x4e, 0xa9, 0xed, 0x5b, 0xe1, 0x16, 0xc6, 0x78, 0x68, 0x19, 0x16, 0x7d, 0x19, 0xa6, + 0x0a, 0x76, 0x8d, 0xc3, 0xce, 0xb2, 0x1b, 0x39, 0xc8, 0x90, 0x53, 0x17, 0xfb, 0xfa, 0xaf, 0x92, + 0x00, 0x5d, 0xd3, 0x53, 0x7b, 0x05, 0x41, 0xca, 0x23, 0x96, 0x08, 0x41, 0xb6, 0x2a, 0x1e, 0xb1, + 0xce, 0x44, 0x5b, 0x72, 0x46, 0xb4, 0xdd, 0x80, 0xec, 0xd0, 0xfc, 0xc2, 0xf0, 0x02, 0x1e, 0x8b, + 0x49, 0x43, 0x52, 0x8c, 0x4f, 0x49, 0x9b, 0x2d, 0x0c, 0x5b, 0xcf, 0xb2, 0x21, 0x29, 0x16, 0xe9, + 0x94, 0xb4, 0xda, 0x7c, 0x39, 0x0b, 0x06, 0x6f, 0xa3, 0x1a, 0xe4, 0x0f, 0x7d, 0x32, 0x6c, 0xab, + 0x65, 0x2c, 0x1b, 0x21, 0xcd, 0xf4, 0xb0, 0x76, 0xab, 0x2d, 0xd7, 0x45, 0x52, 0x3c, 0x5e, 0xfa, + 0x47, 0x78, 0x28, 0x16, 0x81, 0xc5, 0x0b, 0xa7, 0xb8, 0x3d, 0x98, 0x1e, 0x11, 0x8b, 0x4f, 0x7f, + 0xc1, 0x90, 0x14, 0x4b, 0x1d, 0xe6, 0x88, 0x1e, 0x11, 0xdf, 0xa6, 0x63, 0xb1, 0x27, 0x8c, 0x09, + 0x83, 0x59, 0xe5, 0x99, 0xf4, 0x48, 0x84, 0xbf, 0xc1, 0xdb, 0x1f, 0x26, 0xab, 0x5a, 0x23, 0x0f, + 0x59, 0x6a, 0xfa, 0x03, 0x4c, 0xf5, 0xbf, 0x66, 0x60, 0xa9, 0x6b, 0x7a, 0x8d, 0xb1, 0x4a, 0x06, + 0x6a, 0xda, 0x3e, 0x54, 0x10, 0x3e, 0x73, 0x97, 0x4b, 0x1f, 0x52, 0x02, 0x6d, 0x42, 0x66, 0x68, + 0xd2, 0xfe, 0x91, 0xcc, 0x3c, 0x0f, 0xa7, 0x44, 0x67, 0x8d, 0x58, 0x7f, 0xc1, 0x44, 0x0c, 0x21, + 0x39, 0x6f, 0xfe, 0x6b, 0xbf, 0x4d, 0x43, 0x86, 0x03, 0xd1, 0x16, 0xa4, 0x4c, 0xc7, 0x91, 0xd6, + 0xad, 0x5c, 0x61, 0x88, 0x7a, 0x07, 0xbf, 0x62, 0x81, 0x60, 0x3a, 0x0e, 0x57, 0xe2, 0x8e, 0xa5, + 0x9d, 0xaf, 0xa5, 0xc4, 0x1d, 0xa3, 0x6f, 0x41, 0xca, 0x25, 0x22, 0x69, 0x5d, 0xcd, 0x59, 0xa6, + 0xc0, 0x25, 0x14, 0xed, 0x40, 0xc9, 0xc2, 0x01, 0xb5, 0x5d, 0xbe, 0x7f, 0x44, 0xaa, 0xb8, 0xd4, + 0x8c, 0xef, 0x24, 0x8c, 0x98, 0x24, 0xfa, 0x18, 0xd2, 0x47, 0x94, 0x7a, 0x3c, 0x0c, 0x8b, 0x6b, + 0xab, 0x57, 0x71, 0x68, 0x87, 0x52, 0x6f, 0x27, 0x61, 0x70, 0xf9, 0xda, 0x2e, 0xa4, 0x3a, 0xf8, + 0x15, 0x6a, 0x42, 0x8e, 0x2f, 0x47, 0x58, 0xec, 0xae, 0xb4, 0x94, 0x4a, 0xb6, 0x36, 0x86, 0x34, + 0xd3, 0x8e, 0xaa, 0x61, 0x70, 0xab, 0xdd, 0xa8, 0xc2, 0xbb, 0x1a, 0x86, 0xb7, 0xda, 0x8c, 0x2a, + 0xc0, 0x6f, 0x46, 0x03, 0x5c, 0xd5, 0x85, 0x48, 0x88, 0x2f, 0xc9, 0x10, 0x4f, 0xcb, 0x2e, 0x4e, + 0xb1, 0x64, 0xc0, 0x07, 0x0f, 0x1b, 0xfa, 0xdf, 0x35, 0x00, 0x66, 0xc4, 0x0b, 0xa1, 0x76, 0x07, + 0xc0, 0xc7, 0x03, 0x3b, 0xa0, 0xd8, 0xc7, 0x22, 0x39, 0x2c, 0xac, 0xdd, 0x9f, 0x72, 0x6e, 0x22, + 0x50, 0x37, 0x42, 0xb4, 0x28, 0x3a, 0x8a, 0x42, 0x77, 0xa1, 0x34, 0x72, 0x23, 0xba, 0x94, 0x03, + 0x31, 0xae, 0xee, 0x02, 0x4c, 0x34, 0xa0, 0x1c, 0xa4, 0x9e, 0x37, 0xbb, 0x95, 0x04, 0xca, 0x43, + 0xba, 0xbd, 0xdf, 0xe9, 0x56, 0x34, 0xc6, 0x6a, 0xbf, 0xec, 0x56, 0x92, 0x08, 0x20, 0xbb, 0xdd, + 0xdc, 0x6d, 0x76, 0x9b, 0x95, 0x14, 0x2a, 0x40, 0xa6, 0xbd, 0xd9, 0xdd, 0xda, 0xa9, 0xa4, 0x51, + 0x11, 0x72, 0xfb, 0xed, 0x6e, 0x6b, 0x7f, 0xaf, 0x53, 0xc9, 0x30, 0x62, 0x6b, 0x7f, 0x6f, 0xaf, + 0xb9, 0xd5, 0xad, 0x64, 0x99, 0x8e, 0x9d, 0xe6, 0xe6, 0x76, 0x25, 0xc7, 0xe0, 0x5d, 0x63, 0x73, + 0xab, 0x59, 0xc9, 0x37, 0xb2, 0x90, 0xa6, 0x63, 0x0f, 0xeb, 0x3f, 0xd7, 0x20, 0xdb, 0x11, 0x73, + 0xbc, 0x3d, 0xc3, 0xe5, 0xe9, 0x18, 0x13, 0xe0, 0xaf, 0xeb, 0xee, 0xed, 0x98, 0xbb, 0xcc, 0xc2, + 0x6e, 0xb7, 0x5d, 0x49, 0x30, 0x0b, 0x59, 0xab, 0x53, 0xd1, 0x42, 0x0b, 0xbb, 0x50, 0x68, 0xb5, + 0x37, 0x2d, 0xcb, 0xc7, 0x01, 0x2b, 0x8b, 0x69, 0xdb, 0x3b, 0x79, 0x9f, 0x5b, 0x97, 0x63, 0xab, + 0xc9, 0x28, 0xf4, 0x90, 0x73, 0x9f, 0xc8, 0x6d, 0xfa, 0xc6, 0x94, 0xcd, 0xad, 0xf6, 0xc9, 0x13, + 0x09, 0x7e, 0xd2, 0x48, 0x43, 0xd2, 0xf6, 0xf4, 0x55, 0x48, 0x33, 0x2e, 0xab, 0xb3, 0x87, 0xb6, + 0x1f, 0x88, 0x2c, 0x96, 0x35, 0x04, 0xc1, 0xf2, 0xa2, 0x63, 0x06, 0x22, 0xf3, 0x67, 0x0d, 0xde, + 0xd6, 0x77, 0x01, 0xba, 0x7d, 0x4f, 0x19, 0xf2, 0x80, 0x69, 0x91, 0xc9, 0xa5, 0x36, 0x63, 0x40, + 0x89, 0x33, 0x92, 0xb6, 0xc7, 0xb3, 0x2c, 0xcb, 0xf1, 0x49, 0x9e, 0xe3, 0x79, 0x5b, 0xb7, 0x20, + 0xd5, 0x24, 0x4c, 0x4d, 0x65, 0xe0, 0x7b, 0xfd, 0x9e, 0xa8, 0xfa, 0xbd, 0x3e, 0xb1, 0x44, 0xec, + 0x97, 0x77, 0x12, 0xc6, 0x02, 0xeb, 0xe9, 0xf0, 0x8e, 0x2d, 0x62, 0x61, 0x86, 0xf5, 0x71, 0x80, + 0x69, 0x0f, 0xfb, 0x3e, 0xf1, 0x05, 0x36, 0xa9, 0xb0, 0xbc, 0xa7, 0xc9, 0x3a, 0x18, 0xb6, 0x91, + 0x81, 0x14, 0x76, 0x2d, 0xfd, 0x8f, 0x0b, 0x90, 0xef, 0x9a, 0x5e, 0xf3, 0x84, 0x95, 0xac, 0x75, + 0xc8, 0x8a, 0x5d, 0x28, 0xcd, 0x7e, 0x6b, 0x7a, 0xaf, 0x86, 0xfe, 0x19, 0x12, 0x8a, 0x9e, 0x43, + 0x51, 0xb4, 0x7a, 0x43, 0x4c, 0x4d, 0x99, 0x37, 0xee, 0xcf, 0xda, 0xe5, 0x7c, 0x90, 0x7a, 0xd3, + 0xb5, 0x3c, 0x62, 0xbb, 0xf4, 0x05, 0xa6, 0xa6, 0x01, 0x42, 0x94, 0xb5, 0xd1, 0x37, 0xa0, 0x18, + 0xc9, 0x44, 0x72, 0xa9, 0xce, 0x35, 0x21, 0x8a, 0x47, 0x9f, 0x40, 0x25, 0x42, 0x0a, 0x63, 0xd2, + 0x57, 0x32, 0x66, 0x31, 0x22, 0xcf, 0x2d, 0x6a, 0x00, 0xf8, 0x64, 0x44, 0xa5, 0x67, 0x39, 0xae, + 0xec, 0xce, 0x7c, 0x65, 0x06, 0xc3, 0x72, 0x4d, 0x05, 0x5f, 0x35, 0xd1, 0x27, 0xb0, 0xc8, 0x8f, + 0x23, 0x3d, 0xcb, 0xf6, 0x45, 0xca, 0xe5, 0x95, 0x7c, 0x61, 0x6d, 0x79, 0xbe, 0xa2, 0x36, 0x13, + 0xd8, 0x56, 0x78, 0x63, 0xc1, 0x8b, 0xd1, 0xe8, 0x7d, 0x99, 0xa2, 0x45, 0xb9, 0xb8, 0x39, 0x5f, + 0x4f, 0x2c, 0x21, 0xff, 0x4c, 0x83, 0x52, 0xd4, 0x5d, 0xf4, 0x1d, 0xc8, 0x3a, 0xe6, 0x01, 0x76, + 0x54, 0x66, 0x5e, 0xbb, 0xdc, 0x34, 0xd5, 0x77, 0xb9, 0x50, 0xd3, 0xa5, 0xfe, 0xd8, 0x90, 0x1a, + 0x6a, 0x1b, 0x50, 0x8c, 0xb0, 0x51, 0x05, 0x52, 0xc7, 0x78, 0x2c, 0x0f, 0xed, 0xac, 0xc9, 0x76, + 0xd1, 0x89, 0xe9, 0x8c, 0xd4, 0xe5, 0x44, 0x10, 0x1f, 0x26, 0x9f, 0x6a, 0xb5, 0x9f, 0x6a, 0x50, + 0x08, 0x67, 0x0e, 0x3d, 0x3f, 0x63, 0xd4, 0xca, 0x25, 0xa6, 0xfb, 0xdf, 0x6d, 0xd1, 0x3f, 0x73, + 0xb2, 0xda, 0xec, 0x43, 0xc9, 0x17, 0xf5, 0xa8, 0x67, 0xbb, 0xb6, 0x3a, 0xc7, 0x3c, 0x38, 0x7f, + 0xc2, 0xeb, 0xb2, 0x84, 0xb5, 0x5c, 0x9b, 0xb2, 0x0b, 0x80, 0x3f, 0x21, 0x91, 0x01, 0x65, 0x5f, + 0xde, 0x85, 0x84, 0xc6, 0x73, 0x8e, 0x37, 0x31, 0x8d, 0x42, 0x46, 0xaa, 0x2c, 0xf9, 0x11, 0x5a, + 0x18, 0x29, 0x75, 0x62, 0xd7, 0x92, 0x51, 0xf1, 0xe0, 0x92, 0x2a, 0x9b, 0xae, 0x25, 0x8c, 0x0c, + 0xc9, 0xda, 0x13, 0xc8, 0x77, 0xa8, 0x8f, 0xcd, 0x61, 0x8b, 0x5f, 0xbf, 0x0e, 0xcc, 0x40, 0x66, + 0x1c, 0x83, 0xb7, 0xc5, 0x85, 0x84, 0xf5, 0x73, 0xeb, 0xd3, 0x86, 0xa4, 0x6a, 0x7f, 0xd6, 0xa0, + 0x18, 0xf1, 0x1d, 0x7d, 0x00, 0x49, 0xdb, 0x92, 0x73, 0xf6, 0xde, 0x05, 0xe6, 0xa8, 0x01, 0x8d, + 0xa4, 0x6d, 0xb1, 0x34, 0x14, 0x29, 0xe5, 0xb3, 0x72, 0xc0, 0xa4, 0xaa, 0x86, 0x55, 0x7e, 0x25, + 0x3c, 0x19, 0x88, 0x09, 0xf8, 0x9f, 0x39, 0x75, 0x29, 0x3c, 0x30, 0xc4, 0xce, 0xbd, 0xe9, 0x79, + 0xe7, 0xde, 0xcc, 0xe4, 0xdc, 0x5b, 0xfb, 0x8d, 0x06, 0xa5, 0xe8, 0x52, 0xbc, 0xbe, 0x87, 0xcf, + 0x01, 0xf1, 0x3b, 0x57, 0x2f, 0x16, 0x5e, 0xc9, 0x8b, 0xae, 0x45, 0x15, 0x2e, 0x14, 0x9d, 0xe3, + 0x77, 0xa1, 0xc8, 0x36, 0xb7, 0xac, 0x0e, 0xdc, 0xf5, 0xb2, 0x01, 0x8c, 0x25, 0xca, 0x42, 0xed, + 0x97, 0x49, 0xb6, 0x28, 0xe1, 0xe2, 0xfe, 0x07, 0x98, 0xdc, 0x82, 0xeb, 0x4a, 0x51, 0x74, 0x27, + 0xa4, 0x2e, 0xd2, 0x74, 0x4d, 0x6a, 0x8a, 0xcc, 0xff, 0x3d, 0x58, 0x08, 0x95, 0x1c, 0x8c, 0x29, + 0x16, 0xe7, 0xde, 0xb4, 0x11, 0x6e, 0xb2, 0x06, 0x63, 0xa2, 0xfb, 0x90, 0xc2, 0x24, 0x90, 0x95, + 0x69, 0xfa, 0xd1, 0xa1, 0x49, 0x02, 0x83, 0x01, 0xd8, 0x49, 0x0f, 0x33, 0xef, 0xf5, 0xa7, 0xb0, + 0x10, 0x4f, 0xc1, 0xec, 0xb8, 0xf4, 0x72, 0xef, 0xbb, 0x7b, 0xfb, 0x9f, 0xee, 0x55, 0x12, 0x8c, + 0x68, 0xed, 0x35, 0xf6, 0x5f, 0xee, 0x6d, 0x57, 0x34, 0x54, 0x82, 0xfc, 0xfe, 0xcb, 0xae, 0xa0, + 0x92, 0x13, 0x15, 0xb7, 0x20, 0xbf, 0xe9, 0xd9, 0xbc, 0xdc, 0xb2, 0x4c, 0xc3, 0x0b, 0xb2, 0xcc, + 0x3e, 0x82, 0x60, 0x97, 0xcc, 0x42, 0x9b, 0x58, 0x1c, 0x12, 0xa0, 0x67, 0x90, 0xe5, 0x6c, 0x95, + 0xf7, 0xee, 0xcc, 0x7a, 0x1b, 0x11, 0xd8, 0xb0, 0x65, 0x48, 0x91, 0xda, 0x5f, 0x34, 0xc8, 0x2b, + 0x26, 0x32, 0xa0, 0xc0, 0xae, 0xdd, 0xa6, 0xed, 0x62, 0x5f, 0x2e, 0xf4, 0xda, 0x25, 0x94, 0xd5, + 0xb7, 0x94, 0x10, 0x27, 0xd9, 0x11, 0x39, 0x54, 0x53, 0x3b, 0x81, 0x85, 0x78, 0x37, 0xaa, 0x42, + 0x6e, 0x88, 0x83, 0xc0, 0x1c, 0xa8, 0xa7, 0x19, 0x45, 0xb2, 0x7d, 0x35, 0x19, 0x5f, 0x3e, 0x45, + 0x85, 0x0c, 0x36, 0x17, 0xf6, 0x90, 0x49, 0x89, 0x97, 0x36, 0x41, 0xb0, 0x94, 0xe2, 0x63, 0x33, + 0x20, 0xae, 0x7a, 0xe3, 0x10, 0x14, 0x9f, 0x4e, 0x3e, 0x59, 0x6d, 0xc8, 0xab, 0x1b, 0xc2, 0xf9, + 0xcf, 0x6e, 0xfc, 0x1a, 0x3d, 0xf6, 0x54, 0x56, 0xe7, 0xed, 0xf0, 0x11, 0x29, 0x35, 0x79, 0x44, + 0xd2, 0x5f, 0xc1, 0xb5, 0xa9, 0xcb, 0x10, 0x7a, 0x0c, 0x79, 0xf5, 0x28, 0x20, 0xa7, 0xee, 0xcd, + 0xb9, 0x57, 0x28, 0x23, 0x84, 0xb2, 0x38, 0xe4, 0x55, 0xa7, 0x17, 0x7b, 0x30, 0x2b, 0x18, 0x65, + 0xce, 0xed, 0xa8, 0x17, 0xb1, 0xcf, 0xa1, 0xac, 0x84, 0xc5, 0x24, 0xbe, 0xe6, 0x70, 0x61, 0x3c, + 0x25, 0xa3, 0xf1, 0xf4, 0x55, 0x12, 0x10, 0xdb, 0xf4, 0x9d, 0xd1, 0x70, 0x68, 0xfa, 0x63, 0x75, + 0x0b, 0x8f, 0x3e, 0xe3, 0x69, 0x57, 0x7f, 0xc6, 0x63, 0x19, 0x86, 0xda, 0x43, 0xdc, 0x3b, 0xb5, + 0x5d, 0x8b, 0x9c, 0xca, 0x21, 0x81, 0xb1, 0x3e, 0xe5, 0x1c, 0xf4, 0x7f, 0x90, 0x76, 0x89, 0xab, + 0xd2, 0xee, 0x8d, 0xe9, 0xed, 0x35, 0xf4, 0xe8, 0x98, 0x9d, 0x42, 0x18, 0x0a, 0x7d, 0x04, 0x45, + 0x4a, 0x7a, 0xa1, 0xd7, 0xe9, 0x0b, 0xbc, 0x66, 0x57, 0x07, 0x4a, 0xc2, 0xa5, 0xff, 0x36, 0x94, + 0x0f, 0x7d, 0x32, 0x9c, 0xc8, 0x67, 0x2e, 0x96, 0x2f, 0x31, 0x89, 0x50, 0xc3, 0x3b, 0x00, 0xc1, + 0xb1, 0x2d, 0x12, 0x66, 0xc0, 0x4f, 0x62, 0x79, 0xa3, 0xc0, 0x38, 0x6c, 0xea, 0x02, 0xf4, 0x16, + 0x14, 0x68, 0x5f, 0xf5, 0xe6, 0x78, 0x6f, 0x9e, 0xf6, 0x45, 0x67, 0x03, 0x20, 0x4f, 0x46, 0xf4, + 0x80, 0x8c, 0x5c, 0x4b, 0xff, 0x93, 0x06, 0xd7, 0x63, 0xb3, 0x2d, 0x5f, 0x38, 0x37, 0x20, 0x49, + 0x8e, 0xe7, 0xe6, 0xd7, 0x19, 0x12, 0xf5, 0xfd, 0xe3, 0x9d, 0x84, 0x91, 0x24, 0xc7, 0xe8, 0x49, + 0x74, 0x59, 0x67, 0x9d, 0xeb, 0x62, 0xc1, 0xb3, 0x93, 0x90, 0x0b, 0x5f, 0xdb, 0x84, 0xe4, 0xfe, + 0x31, 0x7a, 0x06, 0xfc, 0xa9, 0xb1, 0x47, 0xcd, 0x03, 0x27, 0xbc, 0x6c, 0xd7, 0x66, 0x5a, 0xd0, + 0x65, 0x10, 0x03, 0x02, 0xd5, 0xe4, 0x9e, 0xa9, 0x94, 0xa9, 0xff, 0x3a, 0x09, 0xd0, 0x30, 0x03, + 0xbb, 0x2f, 0x66, 0xe4, 0x0e, 0x94, 0x83, 0x51, 0xbf, 0x8f, 0x03, 0x76, 0xf7, 0x18, 0xb9, 0xe2, + 0x10, 0x94, 0x36, 0x4a, 0x92, 0xb9, 0xc5, 0x78, 0x0c, 0x74, 0x68, 0xda, 0xce, 0xc8, 0xc7, 0x12, + 0x24, 0x4e, 0x06, 0x25, 0xc9, 0x14, 0xa0, 0xbb, 0x6c, 0x97, 0x50, 0xec, 0xf6, 0xc7, 0xbd, 0x61, + 0xd0, 0xf3, 0x1e, 0xaf, 0xf2, 0x90, 0x49, 0x1b, 0x25, 0xc9, 0x7d, 0x11, 0xb4, 0x1f, 0xaf, 0x9e, + 0x45, 0x6d, 0x3c, 0x96, 0x39, 0x3d, 0x82, 0xda, 0x78, 0x3c, 0x85, 0xda, 0xe0, 0x91, 0x10, 0x47, + 0x6d, 0xa0, 0x55, 0x58, 0x32, 0xfb, 0x74, 0x64, 0x3a, 0xbd, 0xb8, 0x0b, 0x59, 0x8e, 0x45, 0xa2, + 0xaf, 0x13, 0x75, 0x64, 0x22, 0x11, 0xf7, 0x27, 0x17, 0x95, 0xf8, 0x38, 0xe2, 0x95, 0xfe, 0x63, + 0x0d, 0xf2, 0x5d, 0x19, 0x21, 0xe8, 0x7f, 0xa1, 0x42, 0x3c, 0xcc, 0xdf, 0x8d, 0x5d, 0xb1, 0x93, + 0x02, 0x39, 0x5f, 0x8b, 0x8c, 0xbf, 0x35, 0x61, 0xa3, 0x65, 0x76, 0x57, 0x33, 0x2d, 0x51, 0xb7, + 0x7a, 0x94, 0x50, 0xd3, 0x91, 0xb3, 0xb6, 0xc0, 0xf8, 0xbc, 0x72, 0x75, 0x19, 0x17, 0x3d, 0x80, + 0x6b, 0xa7, 0xbe, 0x4d, 0x71, 0x0c, 0x2a, 0xa6, 0x6e, 0x91, 0x77, 0x4c, 0xb0, 0xfa, 0x2f, 0x32, + 0x50, 0x08, 0x97, 0x18, 0x35, 0xa0, 0xe0, 0x11, 0xab, 0x37, 0xf0, 0xc9, 0x48, 0xdd, 0x44, 0xef, + 0xcc, 0x8f, 0x08, 0x56, 0x0a, 0x9e, 0x33, 0xe8, 0x4e, 0xc2, 0xc8, 0x7b, 0xb2, 0x5d, 0xfb, 0x43, + 0x9a, 0xd7, 0x16, 0x4e, 0xa0, 0x67, 0x90, 0xf6, 0xc9, 0xa9, 0x8a, 0xae, 0xf7, 0x2e, 0xa1, 0xab, + 0x6e, 0x90, 0x53, 0x83, 0x0b, 0xd5, 0x7e, 0x98, 0x86, 0x94, 0x41, 0x4e, 0x5f, 0x37, 0xeb, 0x5d, + 0x98, 0x88, 0x96, 0xa1, 0x32, 0xc4, 0xc1, 0x11, 0xb6, 0x7a, 0xcc, 0x69, 0xb1, 0x6e, 0x62, 0x9a, + 0x16, 0x04, 0xbf, 0x4d, 0x2c, 0xb1, 0xca, 0x0f, 0xe0, 0x9a, 0x3f, 0x72, 0x5d, 0xdb, 0x1d, 0x44, + 0xa0, 0x22, 0xcc, 0x16, 0x65, 0x47, 0x88, 0x5d, 0x86, 0x0a, 0x0b, 0x85, 0x98, 0x56, 0x11, 0x3f, + 0x0b, 0x82, 0x1f, 0x22, 0x1f, 0x41, 0x46, 0xe4, 0x8d, 0xcc, 0x9c, 0x53, 0xeb, 0x64, 0x57, 0x19, + 0x02, 0x89, 0x9e, 0x44, 0xd3, 0x4d, 0x7e, 0xce, 0x5c, 0xa8, 0xe8, 0x9a, 0x64, 0x22, 0xf4, 0x39, + 0x94, 0x45, 0xe9, 0xef, 0x1d, 0x8c, 0x99, 0x5d, 0xd5, 0x1c, 0x5f, 0x90, 0xa7, 0x97, 0x5c, 0x90, + 0xba, 0xa8, 0xfd, 0x8d, 0x31, 0x2b, 0xfe, 0xfc, 0xd6, 0x54, 0xc4, 0x13, 0x4e, 0xed, 0x33, 0xa8, + 0x9c, 0x05, 0xcc, 0xb8, 0x3f, 0xad, 0x46, 0xef, 0x4f, 0xb3, 0x52, 0x4d, 0x78, 0xc6, 0x88, 0xdc, + 0xad, 0x58, 0x45, 0xe7, 0x19, 0x4a, 0xdf, 0x83, 0x52, 0xd3, 0x1a, 0x4c, 0xfe, 0x4c, 0xfb, 0x9a, + 0x75, 0x4a, 0xff, 0x52, 0x83, 0xb2, 0x54, 0x28, 0x53, 0xf1, 0x7a, 0x24, 0x15, 0xdf, 0x9e, 0x2e, + 0x4b, 0x51, 0xec, 0xd7, 0x4f, 0xc2, 0x8f, 0x78, 0x12, 0x7e, 0x08, 0x19, 0xcc, 0xf4, 0xca, 0x0d, + 0xf2, 0xc6, 0xcc, 0x51, 0x0d, 0x81, 0x89, 0x25, 0xdd, 0xdf, 0x69, 0x90, 0x66, 0x7d, 0xe8, 0x21, + 0xa4, 0x02, 0xbf, 0x7f, 0xf1, 0xbe, 0x60, 0x28, 0x06, 0xb6, 0x82, 0xc9, 0x21, 0x7c, 0x3e, 0xd8, + 0x0a, 0x28, 0x2b, 0x6d, 0x7d, 0xc7, 0xc6, 0x2e, 0xed, 0xd9, 0x96, 0x3c, 0x09, 0xe5, 0x05, 0xa3, + 0x65, 0xb1, 0xce, 0x00, 0xfb, 0x27, 0xd8, 0x67, 0x9d, 0xe2, 0x0c, 0x96, 0x17, 0x8c, 0x96, 0x85, + 0xee, 0xc3, 0xa2, 0x4b, 0x7a, 0xb6, 0x85, 0x5d, 0x6a, 0x53, 0x96, 0x70, 0x07, 0xf2, 0x5a, 0x54, + 0x76, 0x49, 0x4b, 0x72, 0x5f, 0x04, 0x03, 0xfd, 0x2b, 0x0d, 0x2a, 0x5d, 0xe2, 0xf1, 0x7b, 0x79, + 0xf0, 0xdf, 0x71, 0xfe, 0xc8, 0x5d, 0xe9, 0xfc, 0x11, 0x3b, 0x01, 0xfc, 0x5e, 0x83, 0x6b, 0x11, + 0x6f, 0x65, 0xd0, 0xbd, 0x66, 0xfc, 0xb0, 0x7b, 0x19, 0x39, 0x96, 0x3e, 0xdc, 0x9b, 0x4e, 0x01, + 0x67, 0xc7, 0x09, 0x03, 0xb6, 0xb6, 0xc1, 0x03, 0x6f, 0x1d, 0xb2, 0xfc, 0xc9, 0x49, 0x45, 0xde, + 0x74, 0xf2, 0xe1, 0xf2, 0xa2, 0xf2, 0x4b, 0x68, 0x2c, 0x00, 0xff, 0xa6, 0x01, 0x4c, 0x20, 0x68, + 0x3d, 0x96, 0xe8, 0xdf, 0x3d, 0x47, 0xdb, 0x24, 0xc1, 0xa3, 0x5a, 0x24, 0xb1, 0x8b, 0x75, 0x0a, + 0xe9, 0xda, 0x4f, 0x34, 0x91, 0xfc, 0x97, 0x20, 0xc3, 0x47, 0x57, 0x77, 0x21, 0x4e, 0x5c, 0xbc, + 0xc8, 0xb1, 0xcb, 0x7a, 0xf6, 0xec, 0x65, 0xfd, 0xea, 0x99, 0x77, 0xed, 0xcb, 0x2c, 0xa4, 0x36, + 0x3d, 0x1b, 0x7d, 0x06, 0xc5, 0xc8, 0xa1, 0x0c, 0xdd, 0x39, 0xff, 0xc8, 0xc6, 0x43, 0xba, 0x76, + 0xf7, 0x32, 0xe7, 0x3a, 0x3d, 0x81, 0x76, 0x20, 0xc3, 0xb3, 0x0c, 0x7a, 0x67, 0x5e, 0xf6, 0x11, + 0xfa, 0x6e, 0x9e, 0x9f, 0x9c, 0xf4, 0x04, 0xea, 0x42, 0x21, 0x0c, 0x01, 0x74, 0xfb, 0xbc, 0xf0, + 0x10, 0x1a, 0xf5, 0x8b, 0x23, 0x48, 0x4f, 0xa0, 0x4f, 0x20, 0xaf, 0xfe, 0xa1, 0x47, 0xb7, 0xa6, + 0x24, 0xce, 0x7c, 0x31, 0x50, 0xbb, 0x7d, 0x0e, 0x22, 0x54, 0xf9, 0x7d, 0x28, 0x45, 0x3f, 0x7a, + 0x40, 0x77, 0x67, 0x0a, 0x9d, 0xf9, 0x90, 0xa2, 0x76, 0xef, 0x02, 0x54, 0xa8, 0x7e, 0x1b, 0x52, + 0x5d, 0xd3, 0x43, 0x6f, 0xcd, 0x7a, 0xb8, 0x50, 0xca, 0xde, 0x9c, 0xfb, 0xaa, 0xa1, 0xa7, 0x7e, + 0x94, 0xd4, 0x56, 0x35, 0xf4, 0x12, 0xca, 0xb1, 0xff, 0x9c, 0xd0, 0xbd, 0x4b, 0xfd, 0x27, 0x75, + 0x9e, 0xe6, 0xc4, 0xaa, 0x86, 0x36, 0x21, 0xa7, 0xfe, 0x73, 0x9e, 0x93, 0x85, 0x6a, 0x6f, 0x4f, + 0xf1, 0x23, 0x9f, 0xb2, 0xe8, 0x09, 0xe4, 0x40, 0xa1, 0x83, 0x9d, 0xc3, 0xad, 0x23, 0xdc, 0x3f, + 0x46, 0xff, 0x3f, 0x01, 0x8b, 0x4f, 0x65, 0xea, 0xd1, 0x4f, 0x65, 0x42, 0x9c, 0xb2, 0xae, 0x7e, + 0x59, 0x78, 0x38, 0x9b, 0x4f, 0x21, 0xbb, 0xc5, 0x3f, 0xb1, 0x99, 0x6b, 0xef, 0x52, 0x54, 0x27, + 0xff, 0x18, 0x67, 0xd3, 0x71, 0xf4, 0x44, 0x63, 0xfd, 0xb3, 0x47, 0x03, 0x9b, 0x1e, 0x8d, 0x0e, + 0xd8, 0x50, 0x2b, 0x12, 0xa3, 0x7e, 0xd7, 0x56, 0x26, 0x5f, 0x08, 0xac, 0x0c, 0xb0, 0xbb, 0x22, + 0x54, 0x1e, 0x64, 0xf9, 0x9b, 0xce, 0xfa, 0xbf, 0x02, 0x00, 0x00, 0xff, 0xff, 0x90, 0x49, 0x8c, + 0x1d, 0x38, 0x24, 0x00, 0x00, } diff --git a/proto/public.proto b/proto/public.proto index 0ee3b8dc0..1cc435df5 100644 --- a/proto/public.proto +++ b/proto/public.proto @@ -378,6 +378,29 @@ message StatTable { } } +message EdgesRequest { + ResourceSelection selector = 1; +} + +message EdgesResponse { + oneof response { + Ok ok = 1; + ResourceError error = 2; + } + + message Ok { + repeated Edge edges = 1; + } +} + +message Edge { + Resource src = 1; + Resource dst = 2; + string client_id = 3; + string server_id = 4; + string no_identity_msg = 5; +} + message TopRoutesRequest { ResourceSelection selector = 1; string time_window = 2; @@ -415,6 +438,8 @@ message RouteTable { service Api { rpc StatSummary(StatSummaryRequest) returns (StatSummaryResponse) {} + rpc Edges(EdgesRequest) returns (EdgesResponse) {} + rpc TopRoutes(TopRoutesRequest) returns (TopRoutesResponse) {} rpc ListPods(ListPodsRequest) returns (ListPodsResponse) {}