VOL-1848 API for setting and querying loglevel of api-server;
Add source-router to support routing UpdateLogLevel to cores;
Add logging endpoints to rocore

Change-Id: I89eea3599ea3006fe92e6917221cd1fd235ec5e4
diff --git a/Gopkg.lock b/Gopkg.lock
index ab75a27..ea23d79 100644
--- a/Gopkg.lock
+++ b/Gopkg.lock
@@ -300,7 +300,7 @@
   version = "1.0.1"
 
 [[projects]]
-  digest = "1:5ede0ad5117fba74316edc0e824a820b8e3f7fa7e7a9bbbe6807a074dab26360"
+  digest = "1:bca55336c1cf0f6a5c10ab41d49b5a3022872677553815b4e74ba4337a16b27f"
   name = "github.com/opencord/voltha-protos"
   packages = [
     "go/afrouter",
@@ -312,8 +312,8 @@
     "go/voltha",
   ]
   pruneopts = "T"
-  revision = "792553b747df7f751d864f7c638aa5b667c0993e"
-  version = "1.0.0"
+  revision = "78ea333b402a315e5d755cb438fc842d8449882a"
+  version = "1.0.1"
 
 [[projects]]
   branch = "master"
diff --git a/Gopkg.toml b/Gopkg.toml
index 024ee67..e96b529 100644
--- a/Gopkg.toml
+++ b/Gopkg.toml
@@ -77,7 +77,7 @@
 
 [[constraint]]
   name = "github.com/opencord/voltha-protos"
-  version = "1.0.0"
+  version = "1.0.1"
 
 [[override]]
   name = "go.etcd.io/etcd"
diff --git a/afrouter/afrouter/affinity-router.go b/afrouter/afrouter/affinity-router.go
index 583d0a7..7a3168e 100644
--- a/afrouter/afrouter/affinity-router.go
+++ b/afrouter/afrouter/affinity-router.go
@@ -26,6 +26,7 @@
 	"strconv"
 )
 
+// TODO: Used in multiple routers, should move to common file
 const (
 	PKG_MTHD_PKG  int = 1
 	PKG_MTHD_MTHD int = 2
@@ -180,6 +181,7 @@
 	return false
 }
 
+// TODO: Used in multiple routers, should move to common file
 func needMethod(mthd string, conf *RouteConfig) bool {
 	for _, m := range conf.Methods {
 		if mthd == m {
@@ -265,7 +267,7 @@
 	}
 }
 
-func (ar AffinityRouter) Route(sel interface{}) *backend {
+func (ar AffinityRouter) Route(sel interface{}) (*backend, *connection) {
 	switch sl := sel.(type) {
 	case *requestFrame:
 		log.Debugf("Route called for requestFrame with method %s", sl.methodInfo.method)
@@ -276,17 +278,17 @@
 			log.Debugf("Method '%s' affinity binds on reply", sl.methodInfo.method)
 			// Just round robin route the southbound request
 			if *ar.currentBackend, err = ar.cluster.nextBackend(*ar.currentBackend, BackendSequenceRoundRobin); err == nil {
-				return *ar.currentBackend
+				return *ar.currentBackend, nil
 			} else {
 				sl.err = err
-				return nil
+				return nil, nil
 			}
 		}
 		// Not a south affinity binding method, proceed with north affinity binding.
 		if selector, err := ar.decodeProtoField(sl.payload, ar.methodMap[sl.methodInfo.method]); err == nil {
 			log.Debugf("Establishing affinity for selector: %s", selector)
 			if rtrn, ok := ar.affinity[selector]; ok {
-				return rtrn
+				return rtrn, nil
 			} else {
 				// The selector isn't in the map, create a new affinity mapping
 				log.Debugf("MUST CREATE A NEW AFFINITY MAP ENTRY!!")
@@ -295,19 +297,19 @@
 					ar.setAffinity(selector, *ar.currentBackend)
 					//ar.affinity[selector] = *ar.currentBackend
 					//log.Debugf("New affinity set to backend %s",(*ar.currentBackend).name)
-					return *ar.currentBackend
+					return *ar.currentBackend, nil
 				} else {
 					sl.err = err
-					return nil
+					return nil, nil
 				}
 			}
 		}
 	default:
 		log.Errorf("Internal: invalid data type in Route call %v", sel)
-		return nil
+		return nil, nil
 	}
 	log.Errorf("Bad lookup in affinity map %v", ar.affinity)
-	return nil
+	return nil, nil
 }
 
 func (ar AffinityRouter) GetMetaKeyVal(serverStream grpc.ServerStream) (string, string, error) {
diff --git a/afrouter/afrouter/api.go b/afrouter/afrouter/api.go
index 3e47ef8..8b72897 100644
--- a/afrouter/afrouter/api.go
+++ b/afrouter/afrouter/api.go
@@ -21,6 +21,7 @@
 	"fmt"
 	"github.com/opencord/voltha-go/common/log"
 	pb "github.com/opencord/voltha-protos/go/afrouter"
+	common_pb "github.com/opencord/voltha-protos/go/common"
 	"golang.org/x/net/context"
 	"google.golang.org/grpc"
 	"net"
@@ -210,6 +211,47 @@
 	return &pb.Count{Count: uint32(runtime.NumGoroutine())}, nil
 }
 
+func (aa ArouterApi) UpdateLogLevel(ctx context.Context, in *common_pb.Logging) (*pb.Empty, error) {
+	intLevel := int(in.Level)
+
+	if in.PackageName == "" {
+		log.SetAllLogLevel(intLevel)
+		log.SetDefaultLogLevel(intLevel)
+	} else if in.PackageName == "default" {
+		log.SetDefaultLogLevel(intLevel)
+	} else {
+		log.SetPackageLogLevel(in.PackageName, intLevel)
+	}
+
+	return &pb.Empty{}, nil
+}
+
+func (aa ArouterApi) GetLogLevels(ctx context.Context, in *common_pb.LoggingComponent) (*common_pb.Loggings, error) {
+	logLevels := &common_pb.Loggings{}
+
+	// do the per-package log levels
+	for _, packageName := range log.GetPackageNames() {
+		level, err := log.GetPackageLogLevel(packageName)
+		if err != nil {
+			return nil, err
+		}
+		logLevel := &common_pb.Logging{
+			ComponentName: in.ComponentName,
+			PackageName:   packageName,
+			Level:         common_pb.LogLevel_LogLevel(level)}
+		logLevels.Items = append(logLevels.Items, logLevel)
+	}
+
+	// now do the default log level
+	logLevel := &common_pb.Logging{
+		ComponentName: in.ComponentName,
+		PackageName:   "default",
+		Level:         common_pb.LogLevel_LogLevel(log.GetDefaultLogLevel())}
+	logLevels.Items = append(logLevels.Items, logLevel)
+
+	return logLevels, nil
+}
+
 func (aa *ArouterApi) serve() {
 	// Start a serving thread
 	go func() {
diff --git a/afrouter/afrouter/backend.go b/afrouter/afrouter/backend.go
index 3c7815d..3db98c5 100644
--- a/afrouter/afrouter/backend.go
+++ b/afrouter/afrouter/backend.go
@@ -111,8 +111,18 @@
 	// connections are non-existent.
 	var atLeastOne = false
 	var errStr strings.Builder
+
 	log.Debugf("There are %d/%d streams to open", len(be.openConns), len(be.connections))
+	if nf.connection != nil {
+		// Debug statement triggered by source router. Other routers have no connection preference.
+		log.Debugf("Looking for connection %s", nf.connection.name)
+	}
 	for cn, conn := range be.openConns {
+		// If source-router was used, it will indicate a specific connection to be used
+		if nf.connection != nil && nf.connection != cn {
+			continue
+		}
+
 		log.Debugf("Opening stream for connection '%s'", cn.name)
 		if stream, err := grpc.NewClientStream(r.ctx, clientStreamDescForProxying, conn, r.methodInfo.all); err != nil {
 			log.Debugf("Failed to create a client stream '%s', %v", cn.name, err)
diff --git a/afrouter/afrouter/binding-router.go b/afrouter/afrouter/binding-router.go
index dd73756..2e72571 100644
--- a/afrouter/afrouter/binding-router.go
+++ b/afrouter/afrouter/binding-router.go
@@ -80,37 +80,37 @@
 func (br BindingRouter) ReplyHandler(v interface{}) error {
 	return nil
 }
-func (br BindingRouter) Route(sel interface{}) *backend {
+func (br BindingRouter) Route(sel interface{}) (*backend, *connection) {
 	var err error
 	switch sl := sel.(type) {
 	case *requestFrame:
 		if b, ok := br.bindings[sl.metaVal]; ok == true { // binding exists, just return it
-			return b
+			return b, nil
 		} else { // establish a new binding or error.
 			if sl.metaVal != "" {
 				err = errors.New(fmt.Sprintf("Attempt to route on non-existent metadata value '%s' in key '%s'",
 					sl.metaVal, sl.metaKey))
 				log.Error(err)
 				sl.err = err
-				return nil
+				return nil, nil
 			}
 			if sl.methodInfo.method != br.bindingMethod {
 				err = errors.New(fmt.Sprintf("Binding must occur with method %s but attempted with method %s",
 					br.bindingMethod, sl.methodInfo.method))
 				log.Error(err)
 				sl.err = err
-				return nil
+				return nil, nil
 			}
 			log.Debugf("MUST CREATE A NEW BINDING MAP ENTRY!!")
 			if len(br.bindings) < len(br.beCluster.backends) {
 				if *br.currentBackend, err = br.beCluster.nextBackend(*br.currentBackend, BackendSequenceRoundRobin); err == nil {
 					// Use the name of the backend as the metaVal for this new binding
 					br.bindings[(*br.currentBackend).name] = *br.currentBackend
-					return *br.currentBackend
+					return *br.currentBackend, nil
 				} else {
 					log.Error(err)
 					sl.err = err
-					return nil
+					return nil, nil
 				}
 			} else {
 				err = errors.New(fmt.Sprintf("Backends exhausted in attempt to bind for metakey '%s' with value '%s'",
@@ -119,9 +119,9 @@
 				sl.err = err
 			}
 		}
-		return nil
+		return nil, nil
 	default:
-		return nil
+		return nil, nil
 	}
 }
 
diff --git a/afrouter/afrouter/cluster.go b/afrouter/afrouter/cluster.go
index e33db67..7fc581b 100644
--- a/afrouter/afrouter/cluster.go
+++ b/afrouter/afrouter/cluster.go
@@ -157,6 +157,7 @@
 	if err := src.RecvMsg(f); err != nil {
 		return nil, err
 	}
+	log.Debugf("Assigned backend %s", f.backend.name)
 	// Check that the backend was routable and actually has connections open.
 	// If it doesn't then return a nil backend to indicate this
 	if f.backend == nil {
diff --git a/afrouter/afrouter/codec.go b/afrouter/afrouter/codec.go
index 7ea6ef2..27f4619 100644
--- a/afrouter/afrouter/codec.go
+++ b/afrouter/afrouter/codec.go
@@ -50,6 +50,7 @@
 	payload    []byte
 	router     Router
 	backend    *backend
+	connection *connection // optional, if the router preferred one connection over another
 	err        error
 	methodInfo methodDetails
 	serialNo   uint64
@@ -79,12 +80,13 @@
 		t.payload = data
 		// This is were the afinity value is pulled from the payload
 		// and the backend selected.
-		t.backend = t.router.Route(v)
+		t.backend, t.connection = t.router.Route(v)
 		name := "<nil>"
 		if t.backend != nil {
 			name = t.backend.name
 		}
 		log.Debugf("Routing returned %s for method %s", name, t.methodInfo.method)
+
 		return nil
 	default:
 		return cdc.parentCodec.Unmarshal(data, v)
diff --git a/afrouter/afrouter/enums.go b/afrouter/afrouter/enums.go
index 02b1d3d..1847191 100644
--- a/afrouter/afrouter/enums.go
+++ b/afrouter/afrouter/enums.go
@@ -133,11 +133,12 @@
 	RouteTypeRpcAffinityHeader
 	RouteTypeBinding
 	RouteTypeRoundRobin
+	RouteTypeSource
 )
 
 // String names for display in error messages.
-var stringToRouteType = map[string]routeType{"rpc_affinity_message": RouteTypeRpcAffinityMessage, "rpc_affinity_header": RouteTypeRpcAffinityHeader, "binding": RouteTypeBinding, "round_robin": RouteTypeRoundRobin}
-var routeTypeToString = map[routeType]string{RouteTypeRpcAffinityMessage: "rpc_affinity_message", RouteTypeRpcAffinityHeader: "rpc_affinity_header", RouteTypeBinding: "binding", RouteTypeRoundRobin: "round_robin"}
+var stringToRouteType = map[string]routeType{"rpc_affinity_message": RouteTypeRpcAffinityMessage, "rpc_affinity_header": RouteTypeRpcAffinityHeader, "binding": RouteTypeBinding, "round_robin": RouteTypeRoundRobin, "source": RouteTypeSource}
+var routeTypeToString = map[routeType]string{RouteTypeRpcAffinityMessage: "rpc_affinity_message", RouteTypeRpcAffinityHeader: "rpc_affinity_header", RouteTypeBinding: "binding", RouteTypeRoundRobin: "round_robin", RouteTypeSource: "source"}
 
 func (t routeType) String() string {
 	if str, have := routeTypeToString[t]; have {
diff --git a/afrouter/afrouter/method-router.go b/afrouter/afrouter/method-router.go
index fd3b974..56d025e 100644
--- a/afrouter/afrouter/method-router.go
+++ b/afrouter/afrouter/method-router.go
@@ -176,16 +176,16 @@
 	return nil
 }
 
-func (mr MethodRouter) Route(sel interface{}) *backend {
+func (mr MethodRouter) Route(sel interface{}) (*backend, *connection) {
 	switch sl := sel.(type) {
 	case *requestFrame:
 		if r, ok := mr.methodRouter[sl.metaKey][sl.methodInfo.method]; ok {
 			return r.Route(sel)
 		}
 		log.Errorf("Attept to route on non-existent method '%s'", sl.methodInfo.method)
-		return nil
+		return nil, nil
 	default:
-		return nil
+		return nil, nil
 	}
 }
 
diff --git a/afrouter/afrouter/round-robin-router.go b/afrouter/afrouter/round-robin-router.go
index 60ff457..b5f031e 100644
--- a/afrouter/afrouter/round-robin-router.go
+++ b/afrouter/afrouter/round-robin-router.go
@@ -92,20 +92,20 @@
 	return rr.name
 }
 
-func (rr RoundRobinRouter) Route(sel interface{}) *backend {
+func (rr RoundRobinRouter) Route(sel interface{}) (*backend, *connection) {
 	var err error
 	switch sl := sel.(type) {
 	case *requestFrame:
 		// Since this is a round robin router just get the next backend
 		if *rr.currentBackend, err = rr.cluster.nextBackend(*rr.currentBackend, BackendSequenceRoundRobin); err == nil {
-			return *rr.currentBackend
+			return *rr.currentBackend, nil
 		} else {
 			sl.err = err
-			return nil
+			return nil, nil
 		}
 	default:
 		log.Errorf("Internal: invalid data type in Route call %v", sel)
-		return nil
+		return nil, nil
 	}
 }
 
diff --git a/afrouter/afrouter/router.go b/afrouter/afrouter/router.go
index 1bd2d6e..7abbceb 100644
--- a/afrouter/afrouter/router.go
+++ b/afrouter/afrouter/router.go
@@ -27,7 +27,11 @@
 // The router interface
 type Router interface {
 	Name() string
-	Route(interface{}) *backend
+
+	// Route() returns a backend and a connection. The connection is optional and if unspecified, then any
+	// connection on the backend may be used.
+	Route(interface{}) (*backend, *connection)
+
 	Service() string
 	IsStreaming(string) (bool, bool)
 	BackendCluster(string, string) (*cluster, error)
@@ -64,6 +68,12 @@
 			allRouters[rconf.Name+config.Name] = r
 		}
 		return r, err
+	case RouteTypeSource:
+		r, err := newSourceRouter(rconf, config)
+		if err == nil {
+			allRouters[rconf.Name+config.Name] = r
+		}
+		return r, err
 	default:
 		return nil, errors.New(fmt.Sprintf("Internal error, undefined router type: %s", config.Type))
 	}
diff --git a/afrouter/afrouter/source-router.go b/afrouter/afrouter/source-router.go
new file mode 100644
index 0000000..c9f94ef
--- /dev/null
+++ b/afrouter/afrouter/source-router.go
@@ -0,0 +1,320 @@
+/*
+ * Copyright 2018-present Open Networking Foundation
+
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+
+ * http://www.apache.org/licenses/LICENSE-2.0
+
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package afrouter
+
+/* Source-Router
+
+   This router implements source routing where the caller identifies the
+   component the message should be routed to. The `RouteField` should be
+   configured with the gRPC field name to inspect to determine the
+   destination. This field is assumed to be a string. That string will
+   then be used to identify a particular connection on a particular
+   backend.
+
+   The source-router must be configured with a backend cluster, as all routers
+   must identify a backend cluster. However, that backend cluster
+   is merely a placeholder and is not used by the source-router. The
+   source-router's Route() function will return whatever backend cluster is
+   specified by the `RouteField`.
+*/
+
+import (
+	"errors"
+	"fmt"
+	"github.com/golang/protobuf/proto"
+	pb "github.com/golang/protobuf/protoc-gen-go/descriptor"
+	"github.com/opencord/voltha-go/common/log"
+	"google.golang.org/grpc"
+	"io/ioutil"
+	"regexp"
+	"strconv"
+)
+
+type SourceRouter struct {
+	name string
+	//association     associationType
+	routingField    string
+	grpcService     string
+	protoDescriptor *pb.FileDescriptorSet
+	methodMap       map[string]byte
+	cluster         *cluster
+}
+
+func newSourceRouter(rconf *RouterConfig, config *RouteConfig) (Router, error) {
+	var err error = nil
+	var rtrn_err = false
+	var pkg_re = regexp.MustCompile(`^(\.[^.]+\.)(.+)$`)
+	// Validate the configuration
+
+	// A name must exist
+	if config.Name == "" {
+		log.Error("A router 'name' must be specified")
+		rtrn_err = true
+	}
+
+	if rconf.ProtoPackage == "" {
+		log.Error("A 'package' must be specified")
+		rtrn_err = true
+	}
+
+	if rconf.ProtoService == "" {
+		log.Error("A 'service' must be specified")
+		rtrn_err = true
+	}
+
+	if config.RouteField == "" {
+		log.Error("A 'routing_field' must be specified")
+		rtrn_err = true
+	}
+
+	// TODO The overrieds section is currently not being used
+	// so the router will route all methods based on the
+	// routing_field. This needs to be added so that methods
+	// can have different routing fields.
+	dr := SourceRouter{
+		name:        config.Name,
+		grpcService: rconf.ProtoService,
+		methodMap:   make(map[string]byte),
+	}
+
+	// Load the protobuf descriptor file
+	dr.protoDescriptor = &pb.FileDescriptorSet{}
+	fb, err := ioutil.ReadFile(rconf.ProtoFile)
+	if err != nil {
+		log.Errorf("Could not open proto file '%s'", rconf.ProtoFile)
+		rtrn_err = true
+	}
+	err = proto.Unmarshal(fb, dr.protoDescriptor)
+	if err != nil {
+		log.Errorf("Could not unmarshal %s, %v", "proto.pb", err)
+		rtrn_err = true
+	}
+
+	// Build the routing structure based on the loaded protobuf
+	// descriptor file and the config information.
+	type key struct {
+		method string
+		field  string
+	}
+	var msgs = make(map[key]byte)
+	for _, f := range dr.protoDescriptor.File {
+		// Build a temporary map of message types by name.
+		for _, m := range f.MessageType {
+			for _, fld := range m.Field {
+				log.Debugf("Processing message '%s', field '%s'", *m.Name, *fld.Name)
+				msgs[key{*m.Name, *fld.Name}] = byte(*fld.Number)
+			}
+		}
+	}
+	log.Debugf("The map contains: %v", msgs)
+	for _, f := range dr.protoDescriptor.File {
+		if *f.Package == rconf.ProtoPackage {
+			for _, s := range f.Service {
+				if *s.Name == rconf.ProtoService {
+					log.Debugf("Loading package data '%s' for service '%s' for router '%s'", *f.Package, *s.Name, dr.name)
+					// Now create a map keyed by method name with the value being the
+					// field number of the route selector.
+					var ok bool
+					for _, m := range s.Method {
+						// Find the input type in the messages and extract the
+						// field number and save it for future reference.
+						log.Debugf("Processing method '%s'", *m.Name)
+						// Determine if this is a method we're supposed to be processing.
+						if needMethod(*m.Name, config) {
+							log.Debugf("Enabling method '%s'", *m.Name)
+							pkg_methd := pkg_re.FindStringSubmatch(*m.InputType)
+							if pkg_methd == nil {
+								log.Errorf("Regular expression didn't match input type '%s'", *m.InputType)
+								rtrn_err = true
+							}
+							// The input type has the package name prepended to it. Remove it.
+							//in := (*m.InputType)[len(rconf.ProtoPackage)+2:]
+							in := pkg_methd[PKG_MTHD_MTHD]
+							dr.methodMap[*m.Name], ok = msgs[key{in, config.RouteField}]
+							if !ok {
+								log.Errorf("Method '%s' has no field named '%s' in it's parameter message '%s'",
+									*m.Name, config.RouteField, in)
+								rtrn_err = true
+							}
+						}
+					}
+				}
+			}
+		}
+	}
+
+	// We need to pick a cluster, because server will call cluster.handler. The choice we make doesn't
+	// matter, as we can return a different cluster from Route().
+	ok := true
+	if dr.cluster, ok = clusters[config.backendCluster.Name]; !ok {
+		if dr.cluster, err = newBackendCluster(config.backendCluster); err != nil {
+			log.Errorf("Could not create a backend for router %s", config.Name)
+			rtrn_err = true
+		}
+	}
+
+	if rtrn_err {
+		return dr, errors.New(fmt.Sprintf("Failed to create a new router '%s'", dr.name))
+	}
+
+	return dr, nil
+}
+
+func (ar SourceRouter) Service() string {
+	return ar.grpcService
+}
+
+func (ar SourceRouter) Name() string {
+	return ar.name
+}
+
+func (ar SourceRouter) skipField(data *[]byte, idx *int) error {
+	switch (*data)[*idx] & 3 {
+	case 0: // Varint
+		// skip the field number/type
+		*idx++
+		// if the msb is set, then more bytes to follow
+		for (*data)[*idx] >= 128 {
+			*idx++
+		}
+		// the last byte doesn't have the msb set
+		*idx++
+	case 1: // 64 bit
+		*idx += 9
+	case 2: // Length delimited
+		// skip the field number / type
+		*idx++
+		// read a varint that tells length of string
+		b := proto.NewBuffer((*data)[*idx:])
+		t, _ := b.DecodeVarint()
+		// skip the length varint and the string bytes
+		// TODO: This assumes the varint was one byte long -- max string length is 127 bytes
+		*idx += int(t) + 1
+	case 3: // Deprecated
+	case 4: // Deprecated
+	case 5: // 32 bit
+		*idx += 5
+	}
+	return nil
+}
+
+func (ar SourceRouter) decodeProtoField(payload []byte, fieldId byte) (string, error) {
+	idx := 0
+	b := proto.NewBuffer([]byte{})
+	//b.DebugPrint("The Buffer", payload)
+	for { // Find the route selector field
+		log.Debugf("Decoding source value attributeNumber: %d from %v at index %d", fieldId, payload, idx)
+		log.Debugf("Attempting match with payload: %d, methodTable: %d", payload[idx], fieldId)
+		if payload[idx]>>3 == fieldId {
+			log.Debugf("Method match with payload: %d, methodTable: %d", payload[idx], fieldId)
+			// TODO: Consider supporting other selector types.... Way, way in the future
+			// ok, the future is now, support strings as well... ugh.
+			var selector string
+			switch payload[idx] & 3 {
+			case 0: // Integer
+				b.SetBuf(payload[idx+1:])
+				v, e := b.DecodeVarint()
+				if e == nil {
+					log.Debugf("Decoded the ing field: %v", v)
+					selector = strconv.Itoa(int(v))
+				} else {
+					log.Errorf("Failed to decode varint %v", e)
+					return "", e
+				}
+			case 2: // Length delimited AKA string
+				b.SetBuf(payload[idx+1:])
+				v, e := b.DecodeStringBytes()
+				if e == nil {
+					log.Debugf("Decoded the string field: %v", v)
+					selector = v
+				} else {
+					log.Errorf("Failed to decode string %v", e)
+					return "", e
+				}
+			default:
+				err := errors.New(fmt.Sprintf("Only integer and string route selectors are permitted"))
+				log.Error(err)
+				return "", err
+			}
+			return selector, nil
+		} else if err := ar.skipField(&payload, &idx); err != nil {
+			log.Errorf("Parsing message failed %v", err)
+			return "", err
+		}
+	}
+}
+
+func (ar SourceRouter) Route(sel interface{}) (*backend, *connection) {
+	log.Debugf("SourceRouter sel %v", sel)
+	switch sl := sel.(type) {
+	case *requestFrame:
+		log.Debugf("Route called for nbFrame with method %s", sl.methodInfo.method)
+		// Not a south affinity binding method, proceed with north affinity binding.
+		if selector, err := ar.decodeProtoField(sl.payload, ar.methodMap[sl.methodInfo.method]); err == nil {
+			// selector is
+
+			for _, cluster := range clusters {
+				for _, backend := range cluster.backends {
+					log.Debugf("Checking backend %s", backend.name)
+					for _, connection := range backend.connections {
+						log.Debugf("Checking connection %s", connection.name)
+						// caller specified a backend and a connection
+						if backend.name+"."+connection.name == selector {
+							return backend, connection
+						}
+					}
+					// caller specified just a backend
+					if backend.name == selector {
+						return backend, nil
+					}
+				}
+			}
+			sl.err = fmt.Errorf("Backend %s not found", selector)
+			return nil, nil
+		}
+	default:
+		log.Errorf("Internal: invalid data type in Route call %v", sel)
+		return nil, nil
+	}
+	log.Errorf("Bad routing in SourceRouter:Route")
+	return nil, nil
+}
+
+func (ar SourceRouter) GetMetaKeyVal(serverStream grpc.ServerStream) (string, string, error) {
+	return "", "", nil
+}
+
+func (ar SourceRouter) IsStreaming(_ string) (bool, bool) {
+	panic("not implemented")
+}
+
+func (ar SourceRouter) BackendCluster(mthd string, metaKey string) (*cluster, error) {
+	// unsupported?
+	return ar.cluster, nil
+}
+
+func (ar SourceRouter) FindBackendCluster(beName string) *cluster {
+	// unsupported?
+	if beName == ar.cluster.name {
+		return ar.cluster
+	}
+	return nil
+}
+
+func (rr SourceRouter) ReplyHandler(sel interface{}) error { // This is a no-op
+	return nil
+}
diff --git a/afrouter/afrouter/source-router_test.go b/afrouter/afrouter/source-router_test.go
new file mode 100644
index 0000000..3d35d6e
--- /dev/null
+++ b/afrouter/afrouter/source-router_test.go
@@ -0,0 +1,140 @@
+/*
+ * Portions copyright 2019-present Open Networking Foundation
+ * Original copyright 2019-present Ciena Corporation
+ *
+ * Licensed under the Apache License, Version 2.0 (the"github.com/stretchr/testify/assert" "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package afrouter
+
+import (
+	//	"github.com/fullstorydev/grpcurl"
+	"github.com/golang/protobuf/proto"
+	//	descpb "github.com/golang/protobuf/protoc-gen-go/descriptor"
+	//	"github.com/jhump/protoreflect/dynamic"
+	"github.com/opencord/voltha-go/common/log"
+	common_pb "github.com/opencord/voltha-protos/go/common"
+	"github.com/stretchr/testify/assert"
+	//"io/ioutil"
+	"testing"
+)
+
+const (
+	PROTOFILE = "../../vendor/github.com/opencord/voltha-protos/go/voltha.pb"
+)
+
+func init() {
+	log.SetDefaultLogger(log.JSON, log.DebugLevel, nil)
+	log.AddPackage(log.JSON, log.WarnLevel, nil)
+}
+
+func MakeTestConfig() (*ConnectionConfig, *BackendConfig, *BackendClusterConfig, *RouteConfig, *RouterConfig) {
+	connectionConfig := ConnectionConfig{
+		Name: "ro_vcore01",
+		Addr: "foo",
+		Port: "123",
+	}
+
+	backendConfig := BackendConfig{
+		Name:        "ro_vcore0",
+		Type:        BackendSingleServer,
+		Connections: []ConnectionConfig{connectionConfig},
+	}
+
+	backendClusterConfig := BackendClusterConfig{
+		Name:     "ro_vcore",
+		Backends: []BackendConfig{backendConfig},
+	}
+
+	routeConfig := RouteConfig{
+		Name:           "logger",
+		Type:           RouteTypeSource,
+		RouteField:     "component_name",
+		BackendCluster: "ro_vcore",
+		backendCluster: &backendClusterConfig,
+		Methods:        []string{"UpdateLogLevel", "GetLogLevel"},
+	}
+
+	routerConfig := RouterConfig{
+		Name:         "vcore",
+		ProtoService: "VolthaService",
+		ProtoPackage: "voltha",
+		Routes:       []RouteConfig{routeConfig},
+		ProtoFile:    PROTOFILE,
+	}
+	return &connectionConfig, &backendConfig, &backendClusterConfig, &routeConfig, &routerConfig
+}
+
+func TestSourceRouterInit(t *testing.T) {
+	_, _, _, routeConfig, routerConfig := MakeTestConfig()
+
+	router, err := newSourceRouter(routerConfig, routeConfig)
+
+	assert.NotEqual(t, router, nil)
+	assert.Equal(t, err, nil)
+
+	assert.Equal(t, router.Service(), "VolthaService")
+	assert.Equal(t, router.Name(), "logger")
+
+	cluster, err := router.BackendCluster("foo", "bar")
+	assert.Equal(t, cluster, clusters["ro_vcore"])
+	assert.Equal(t, err, nil)
+
+	assert.Equal(t, router.FindBackendCluster("ro_vcore"), clusters["ro_vcore"])
+	assert.Equal(t, router.ReplyHandler("foo"), nil)
+}
+
+func TestDecodeProtoField(t *testing.T) {
+	_, _, _, routeConfig, routerConfig := MakeTestConfig()
+
+	router, err := newSourceRouter(routerConfig, routeConfig)
+	assert.Equal(t, err, nil)
+
+	loggingMessage := &common_pb.Logging{Level: 1,
+		PackageName:   "default",
+		ComponentName: "ro_vcore0.ro_vcore01"}
+
+	loggingData, err := proto.Marshal(loggingMessage)
+	assert.Equal(t, err, nil)
+
+	s, err := router.(SourceRouter).decodeProtoField(loggingData, 2) // field 2 is package_name
+	assert.Equal(t, s, "default")
+
+	s, err = router.(SourceRouter).decodeProtoField(loggingData, 3) // field 2 is component_name
+	assert.Equal(t, s, "ro_vcore0.ro_vcore01")
+}
+
+func TestRoute(t *testing.T) {
+	_, _, _, routeConfig, routerConfig := MakeTestConfig()
+
+	router, err := newSourceRouter(routerConfig, routeConfig)
+	assert.Equal(t, err, nil)
+
+	loggingMessage := &common_pb.Logging{Level: 1,
+		PackageName:   "default",
+		ComponentName: "ro_vcore0.ro_vcore01"}
+
+	loggingData, err := proto.Marshal(loggingMessage)
+	assert.Equal(t, err, nil)
+
+	sel := &requestFrame{payload: loggingData,
+		err:        nil,
+		methodInfo: newMethodDetails("/volta.VolthaService/UpdateLogLevel")}
+
+	backend, connection := router.Route(sel)
+
+	assert.Equal(t, sel.err, nil)
+	assert.NotEqual(t, backend, nil)
+	assert.Equal(t, backend.name, "ro_vcore0")
+	assert.NotEqual(t, connection, nil)
+	assert.Equal(t, connection.name, "ro_vcore01")
+}
diff --git a/afrouter/arouter.json b/afrouter/arouter.json
index 5036402..debfcd7 100644
--- a/afrouter/arouter.json
+++ b/afrouter/arouter.json
@@ -79,6 +79,17 @@
           ]
         },
         {
+          "name": "logger",
+          "proto_descriptor": "voltha.pb",
+          "type": "source",
+          "routing_field": "component_name",
+          "backend_cluster": "ro_vcore",
+          "methods": [
+            "UpdateLogLevel",
+            "GetLogLevels"
+          ]
+        },
+        {
           "name": "read_only",
           "type": "round_robin",
           "association": "round_robin",
diff --git a/common/log/log.go b/common/log/log.go
index 33100dc..fe3a4e0 100644
--- a/common/log/log.go
+++ b/common/log/log.go
@@ -286,6 +286,17 @@
 	return nil
 }
 
+// Return a list of all packages that have individually-configured loggers
+func GetPackageNames() []string {
+	i := 0
+	keys := make([]string, len(loggers))
+	for k := range loggers {
+		keys[i] = k
+		i++
+	}
+	return keys
+}
+
 // UpdateLogger deletes the logger associated with a caller's package and creates a new logger with the
 // defaultFields.  If a calling package is holding on to a Logger reference obtained from AddPackage invocation, then
 // that package needs to invoke UpdateLogger if it needs to make changes to the default fields and obtain a new logger
@@ -371,6 +382,11 @@
 	return 0, errors.New(fmt.Sprintf("unknown-package-%s", name))
 }
 
+//GetDefaultLogLevel gets the log level used for packages that don't have specific loggers
+func GetDefaultLogLevel() int {
+	return levelToInt(cfg.Level.Level())
+}
+
 //SetLogLevel sets the log level for the logger corresponding to the caller's package
 func SetLogLevel(level int) error {
 	pkgName, _, _, _ := getCallerInfo()
@@ -382,6 +398,11 @@
 	return nil
 }
 
+//SetDefaultLogLevel sets the log level used for packages that don't have specific loggers
+func SetDefaultLogLevel(level int) {
+	setLevel(cfg, level)
+}
+
 // CleanUp flushed any buffered log entries. Applications should take care to call
 // CleanUp before exiting.
 func CleanUp() error {
diff --git a/ro_core/core/grpc_nbi_api_handler.go b/ro_core/core/grpc_nbi_api_handler.go
index e2c6843..c68b230 100644
--- a/ro_core/core/grpc_nbi_api_handler.go
+++ b/ro_core/core/grpc_nbi_api_handler.go
@@ -73,6 +73,47 @@
 	}
 }
 
+func (handler *APIHandler) UpdateLogLevel(ctx context.Context, logging *voltha.Logging) (*empty.Empty, error) {
+	log.Debugw("UpdateLogLevel-request", log.Fields{"package": logging.PackageName, "intval": int(logging.Level)})
+	out := new(empty.Empty)
+	if logging.PackageName == "" {
+		log.SetAllLogLevel(int(logging.Level))
+		log.SetDefaultLogLevel(int(logging.Level))
+	} else if logging.PackageName == "default" {
+		log.SetDefaultLogLevel(int(logging.Level))
+	} else {
+		log.SetPackageLogLevel(logging.PackageName, int(logging.Level))
+	}
+
+	return out, nil
+}
+
+func (aa APIHandler) GetLogLevels(ctx context.Context, in *voltha.LoggingComponent) (*voltha.Loggings, error) {
+	logLevels := &voltha.Loggings{}
+
+	// do the per-package log levels
+	for _, packageName := range log.GetPackageNames() {
+		level, err := log.GetPackageLogLevel(packageName)
+		if err != nil {
+			return nil, err
+		}
+		logLevel := &voltha.Logging{
+			ComponentName: in.ComponentName,
+			PackageName:   packageName,
+			Level:         voltha.LogLevel_LogLevel(level)}
+		logLevels.Items = append(logLevels.Items, logLevel)
+	}
+
+	// now do the default log level
+	logLevel := &voltha.Logging{
+		ComponentName: in.ComponentName,
+		PackageName:   "default",
+		Level:         voltha.LogLevel_LogLevel(log.GetDefaultLogLevel())}
+	logLevels.Items = append(logLevels.Items, logLevel)
+
+	return logLevels, nil
+}
+
 // GetVoltha returns the contents of all components (i.e. devices, logical_devices, ...)
 func (handler *APIHandler) GetVoltha(ctx context.Context, empty *empty.Empty) (*voltha.Voltha, error) {
 	log.Debug("GetVoltha")
diff --git a/rw_core/core/grpc_nbi_api_handler.go b/rw_core/core/grpc_nbi_api_handler.go
index 8cc1dc4..7f45875 100755
--- a/rw_core/core/grpc_nbi_api_handler.go
+++ b/rw_core/core/grpc_nbi_api_handler.go
@@ -204,12 +204,42 @@
 	out := new(empty.Empty)
 	if logging.PackageName == "" {
 		log.SetAllLogLevel(int(logging.Level))
+		log.SetDefaultLogLevel(int(logging.Level))
+	} else if logging.PackageName == "default" {
+		log.SetDefaultLogLevel(int(logging.Level))
 	} else {
 		log.SetPackageLogLevel(logging.PackageName, int(logging.Level))
 	}
+
 	return out, nil
 }
 
+func (aa APIHandler) GetLogLevels(ctx context.Context, in *voltha.LoggingComponent) (*voltha.Loggings, error) {
+	logLevels := &voltha.Loggings{}
+
+	// do the per-package log levels
+	for _, packageName := range log.GetPackageNames() {
+		level, err := log.GetPackageLogLevel(packageName)
+		if err != nil {
+			return nil, err
+		}
+		logLevel := &voltha.Logging{
+			ComponentName: in.ComponentName,
+			PackageName:   packageName,
+			Level:         voltha.LogLevel_LogLevel(level)}
+		logLevels.Items = append(logLevels.Items, logLevel)
+	}
+
+	// now do the default log level
+	logLevel := &voltha.Logging{
+		ComponentName: in.ComponentName,
+		PackageName:   "default",
+		Level:         voltha.LogLevel_LogLevel(log.GetDefaultLogLevel())}
+	logLevels.Items = append(logLevels.Items, logLevel)
+
+	return logLevels, nil
+}
+
 func (handler *APIHandler) GetLogicalDevicePort(ctx context.Context, id *voltha.LogicalPortId) (*voltha.LogicalPort, error) {
 	log.Debugw("GetLogicalDevicePort-request", log.Fields{"id": *id})
 
diff --git a/vendor/github.com/opencord/voltha-protos/VERSION b/vendor/github.com/opencord/voltha-protos/VERSION
index 3eefcb9..7dea76e 100644
--- a/vendor/github.com/opencord/voltha-protos/VERSION
+++ b/vendor/github.com/opencord/voltha-protos/VERSION
@@ -1 +1 @@
-1.0.0
+1.0.1
diff --git a/vendor/github.com/opencord/voltha-protos/go/afrouter/afrouter.pb.go b/vendor/github.com/opencord/voltha-protos/go/afrouter/afrouter.pb.go
index 0091b88..51c17e1 100644
--- a/vendor/github.com/opencord/voltha-protos/go/afrouter/afrouter.pb.go
+++ b/vendor/github.com/opencord/voltha-protos/go/afrouter/afrouter.pb.go
@@ -7,6 +7,7 @@
 	context "context"
 	fmt "fmt"
 	proto "github.com/golang/protobuf/proto"
+	common "github.com/opencord/voltha-protos/go/common"
 	grpc "google.golang.org/grpc"
 	math "math"
 )
@@ -324,33 +325,36 @@
 func init() { proto.RegisterFile("voltha_protos/afrouter.proto", fileDescriptor_be7e2f565b9e1c96) }
 
 var fileDescriptor_be7e2f565b9e1c96 = []byte{
-	// 401 bytes of a gzipped FileDescriptorProto
-	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x74, 0x92, 0x41, 0x8b, 0xdb, 0x30,
-	0x10, 0x85, 0xd7, 0x89, 0xed, 0x78, 0xa7, 0x64, 0x77, 0x2b, 0x4a, 0x11, 0x4b, 0x5b, 0x82, 0x4f,
-	0xb9, 0x6c, 0x0c, 0x5d, 0x4a, 0xcf, 0xad, 0x29, 0xb9, 0xf4, 0xe4, 0xdc, 0x7a, 0x29, 0x8e, 0x2c,
-	0x3b, 0x22, 0x89, 0xc6, 0x48, 0x72, 0x20, 0xd0, 0x9f, 0xd5, 0x73, 0x7f, 0x5b, 0x91, 0x64, 0xc7,
-	0x29, 0x74, 0x6f, 0xef, 0x7b, 0x63, 0x59, 0xf3, 0x34, 0x03, 0xef, 0x4e, 0x78, 0x30, 0xbb, 0xf2,
-	0x67, 0xab, 0xd0, 0xa0, 0xce, 0xca, 0x5a, 0x61, 0x67, 0xb8, 0x5a, 0x39, 0x26, 0xc9, 0xc0, 0xe9,
-	0x77, 0x88, 0x0b, 0xae, 0xbb, 0x83, 0x21, 0x14, 0x66, 0xba, 0x63, 0x8c, 0x6b, 0x4d, 0x83, 0x45,
-	0xb0, 0x4c, 0x8a, 0x01, 0xc9, 0x1b, 0x88, 0xb8, 0x52, 0xa8, 0xe8, 0x64, 0x11, 0x2c, 0x6f, 0x0b,
-	0x0f, 0x84, 0x40, 0x28, 0x64, 0x8d, 0x74, 0xea, 0x4c, 0xa7, 0xd3, 0x19, 0x44, 0xdf, 0x8e, 0xad,
-	0x39, 0xa7, 0xef, 0x21, 0xca, 0xb1, 0x93, 0xc6, 0x9e, 0x65, 0x56, 0xb8, 0x7f, 0xce, 0x0b, 0x0f,
-	0xe9, 0x9f, 0x00, 0xc2, 0x1c, 0xa5, 0x24, 0x6f, 0x21, 0xd6, 0x5c, 0x9d, 0xb8, 0x72, 0xf5, 0xdb,
-	0xa2, 0x27, 0xf2, 0x00, 0xd3, 0x76, 0xdf, 0xf4, 0x17, 0x5a, 0x69, 0x1d, 0x7d, 0x62, 0xfd, 0x6d,
-	0x56, 0xda, 0x86, 0xd9, 0xa1, 0xd3, 0x86, 0x2b, 0x1a, 0x3a, 0x77, 0x40, 0x5b, 0xd9, 0x96, 0x6c,
-	0xcf, 0x65, 0x45, 0x23, 0x5f, 0xe9, 0x91, 0x7c, 0x00, 0x60, 0x28, 0x25, 0x67, 0x46, 0xa0, 0xa4,
-	0xb1, 0x2b, 0x5e, 0x39, 0x36, 0x54, 0x59, 0x55, 0x8a, 0xce, 0x7c, 0x28, 0xab, 0xad, 0xd7, 0xa2,
-	0x32, 0x34, 0x59, 0x04, 0xcb, 0xb0, 0x70, 0x3a, 0xfd, 0x05, 0xc9, 0x97, 0xba, 0x16, 0x52, 0x98,
-	0xb3, 0xcd, 0xe0, 0x1f, 0x73, 0xc8, 0xe0, 0xc9, 0x46, 0x77, 0x6a, 0x78, 0x36, 0x07, 0xd7, 0x5d,
-	0x4f, 0x5f, 0xec, 0x3a, 0xfc, 0xb7, 0xeb, 0x3b, 0x98, 0x88, 0x21, 0xca, 0x44, 0x54, 0x1f, 0x7f,
-	0x07, 0x30, 0xcf, 0x51, 0xd6, 0xa2, 0xe9, 0x54, 0xe9, 0xfa, 0x7e, 0x86, 0xf9, 0x86, 0x9b, 0x7c,
-	0x0c, 0x72, 0xb7, 0xba, 0x8c, 0xdc, 0xba, 0x8f, 0x0f, 0x23, 0xfb, 0x79, 0xa7, 0x37, 0xe4, 0x13,
-	0xbc, 0xda, 0x70, 0x73, 0xc9, 0x41, 0xc6, 0x4f, 0x06, 0xef, 0xbf, 0xc7, 0x3e, 0xc3, 0xeb, 0x35,
-	0x37, 0x6b, 0xb4, 0xbe, 0x90, 0xdc, 0xcf, 0xf9, 0x7e, 0xfc, 0xd0, 0x6d, 0xc0, 0xe3, 0xfd, 0x75,
-	0x03, 0x76, 0xe6, 0x37, 0x5f, 0xb3, 0x1f, 0x4f, 0x8d, 0x30, 0xbb, 0x6e, 0xbb, 0x62, 0x78, 0xcc,
-	0xb0, 0xe5, 0x92, 0xa1, 0xaa, 0x32, 0xbf, 0xa9, 0x4f, 0xfd, 0xa6, 0x36, 0x78, 0x59, 0xd6, 0x6d,
-	0xec, 0xbc, 0xe7, 0xbf, 0x01, 0x00, 0x00, 0xff, 0xff, 0x6e, 0x03, 0xc8, 0x69, 0xcd, 0x02, 0x00,
-	0x00,
+	// 463 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x74, 0x53, 0xcb, 0x8e, 0xd3, 0x30,
+	0x14, 0x6d, 0xda, 0xf4, 0x31, 0x17, 0xfa, 0xc0, 0x42, 0xc8, 0x8a, 0x00, 0x55, 0x59, 0x75, 0x33,
+	0xad, 0xc4, 0x80, 0xd8, 0xb0, 0x81, 0x08, 0x75, 0xd3, 0x55, 0x46, 0x6c, 0xd8, 0xa0, 0xd4, 0x71,
+	0x32, 0xd6, 0xb4, 0xbe, 0x91, 0xed, 0x54, 0x1a, 0x89, 0x0f, 0xe2, 0x2b, 0xf8, 0x36, 0x64, 0x3b,
+	0xe9, 0x4b, 0xcc, 0xee, 0x9c, 0x73, 0xef, 0xb5, 0xcf, 0xf1, 0x03, 0xde, 0x1e, 0x70, 0x67, 0x1e,
+	0xb2, 0x5f, 0x95, 0x42, 0x83, 0x7a, 0x95, 0x15, 0x0a, 0x6b, 0xc3, 0xd5, 0xd2, 0x71, 0x32, 0x6a,
+	0x79, 0x14, 0x5d, 0xf6, 0x31, 0xdc, 0xef, 0x51, 0xfa, 0xae, 0x78, 0x03, 0x83, 0x94, 0xeb, 0x7a,
+	0x67, 0x08, 0x85, 0xa1, 0xae, 0x19, 0xe3, 0x5a, 0xd3, 0x60, 0x1e, 0x2c, 0x46, 0x69, 0x4b, 0xc9,
+	0x6b, 0xe8, 0x73, 0xa5, 0x50, 0xd1, 0xee, 0x3c, 0x58, 0xdc, 0xa4, 0x9e, 0x10, 0x02, 0xa1, 0x90,
+	0x05, 0xd2, 0x9e, 0x13, 0x1d, 0x8e, 0x87, 0xd0, 0xff, 0xbe, 0xaf, 0xcc, 0x53, 0xfc, 0x0e, 0xfa,
+	0x09, 0xd6, 0xd2, 0xd8, 0x59, 0x66, 0x81, 0x5b, 0x73, 0x9c, 0x7a, 0x12, 0xff, 0x0d, 0x20, 0x4c,
+	0x50, 0x4a, 0xf2, 0x06, 0x06, 0x9a, 0xab, 0x03, 0x57, 0xae, 0x7e, 0x93, 0x36, 0x8c, 0xcc, 0xa0,
+	0x57, 0x3d, 0x96, 0xcd, 0x86, 0x16, 0x5a, 0x45, 0x1f, 0x58, 0xb3, 0x9b, 0x85, 0xd6, 0x30, 0xdb,
+	0xd5, 0xda, 0x70, 0x45, 0x43, 0xa7, 0xb6, 0xd4, 0x56, 0xb6, 0x19, 0x7b, 0xe4, 0x32, 0xa7, 0x7d,
+	0x5f, 0x69, 0x28, 0x79, 0x0f, 0xc0, 0x50, 0x4a, 0xce, 0x8c, 0x40, 0x49, 0x07, 0xae, 0x78, 0xa6,
+	0xd8, 0x50, 0x59, 0x9e, 0x2b, 0x3a, 0xf4, 0xa1, 0x2c, 0xb6, 0x5a, 0x85, 0xca, 0xd0, 0xd1, 0x3c,
+	0x58, 0x84, 0xa9, 0xc3, 0xf1, 0x6f, 0x18, 0x7d, 0x2d, 0x0a, 0x21, 0x85, 0x79, 0xb2, 0x19, 0xfc,
+	0x41, 0xb7, 0x19, 0x3c, 0xb3, 0xd1, 0x1d, 0x6a, 0x8f, 0xcd, 0x91, 0x73, 0xd7, 0xbd, 0x67, 0x5d,
+	0x87, 0x97, 0xae, 0x27, 0xd0, 0x15, 0x6d, 0x94, 0xae, 0xc8, 0x3f, 0xfc, 0xe9, 0xc2, 0x38, 0x41,
+	0x59, 0x88, 0xb2, 0x56, 0x99, 0xf3, 0x7d, 0x07, 0xe3, 0x7b, 0x6e, 0x92, 0x53, 0x90, 0xc9, 0xf2,
+	0xf8, 0x1c, 0xac, 0x1a, 0xcd, 0x4e, 0xdc, 0xdf, 0x77, 0xdc, 0x21, 0x9f, 0xe0, 0xc5, 0x3d, 0x37,
+	0xc7, 0x1c, 0xe4, 0xd4, 0xd2, 0x6a, 0xff, 0x1d, 0xfb, 0x0c, 0xaf, 0xd6, 0xdc, 0xac, 0xd1, 0xea,
+	0x42, 0x72, 0x7f, 0xcf, 0xd3, 0x53, 0xa3, 0x7b, 0x01, 0xd1, 0xf4, 0xdc, 0x80, 0xbd, 0xf3, 0x0e,
+	0xf9, 0x08, 0x93, 0x1f, 0x55, 0x9e, 0x19, 0xbe, 0xc1, 0x72, 0xc3, 0x0f, 0x7c, 0x47, 0xa6, 0xcb,
+	0xe6, 0x31, 0x6e, 0xb0, 0x2c, 0x85, 0x2c, 0xa3, 0xeb, 0x65, 0xe2, 0x0e, 0xf9, 0x02, 0x2f, 0xd7,
+	0xdc, 0xb4, 0x23, 0x9a, 0xd0, 0xab, 0x99, 0x04, 0xf7, 0x15, 0x4a, 0x2e, 0x4d, 0x34, 0xbb, 0xaa,
+	0xe8, 0xb8, 0xf3, 0x6d, 0xf5, 0xf3, 0xb6, 0x14, 0xe6, 0xa1, 0xde, 0xda, 0xda, 0x0a, 0x2b, 0x2e,
+	0x19, 0xaa, 0x7c, 0xe5, 0x7f, 0xc4, 0x6d, 0xf3, 0x23, 0x4a, 0x3c, 0x7e, 0x9e, 0xed, 0xc0, 0x69,
+	0x77, 0xff, 0x02, 0x00, 0x00, 0xff, 0xff, 0xec, 0x41, 0x8b, 0x29, 0x5d, 0x03, 0x00, 0x00,
 }
 
 // Reference imports to suppress errors if they are not otherwise used.
@@ -368,6 +372,8 @@
 	SetConnection(ctx context.Context, in *Conn, opts ...grpc.CallOption) (*Result, error)
 	SetAffinity(ctx context.Context, in *Affinity, opts ...grpc.CallOption) (*Result, error)
 	GetGoroutineCount(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*Count, error)
+	UpdateLogLevel(ctx context.Context, in *common.Logging, opts ...grpc.CallOption) (*Empty, error)
+	GetLogLevels(ctx context.Context, in *common.LoggingComponent, opts ...grpc.CallOption) (*common.Loggings, error)
 }
 
 type configurationClient struct {
@@ -405,11 +411,31 @@
 	return out, nil
 }
 
+func (c *configurationClient) UpdateLogLevel(ctx context.Context, in *common.Logging, opts ...grpc.CallOption) (*Empty, error) {
+	out := new(Empty)
+	err := c.cc.Invoke(ctx, "/afrouter.Configuration/UpdateLogLevel", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *configurationClient) GetLogLevels(ctx context.Context, in *common.LoggingComponent, opts ...grpc.CallOption) (*common.Loggings, error) {
+	out := new(common.Loggings)
+	err := c.cc.Invoke(ctx, "/afrouter.Configuration/GetLogLevels", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
 // ConfigurationServer is the server API for Configuration service.
 type ConfigurationServer interface {
 	SetConnection(context.Context, *Conn) (*Result, error)
 	SetAffinity(context.Context, *Affinity) (*Result, error)
 	GetGoroutineCount(context.Context, *Empty) (*Count, error)
+	UpdateLogLevel(context.Context, *common.Logging) (*Empty, error)
+	GetLogLevels(context.Context, *common.LoggingComponent) (*common.Loggings, error)
 }
 
 func RegisterConfigurationServer(s *grpc.Server, srv ConfigurationServer) {
@@ -470,6 +496,42 @@
 	return interceptor(ctx, in, info, handler)
 }
 
+func _Configuration_UpdateLogLevel_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(common.Logging)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(ConfigurationServer).UpdateLogLevel(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/afrouter.Configuration/UpdateLogLevel",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(ConfigurationServer).UpdateLogLevel(ctx, req.(*common.Logging))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _Configuration_GetLogLevels_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(common.LoggingComponent)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(ConfigurationServer).GetLogLevels(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/afrouter.Configuration/GetLogLevels",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(ConfigurationServer).GetLogLevels(ctx, req.(*common.LoggingComponent))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
 var _Configuration_serviceDesc = grpc.ServiceDesc{
 	ServiceName: "afrouter.Configuration",
 	HandlerType: (*ConfigurationServer)(nil),
@@ -486,6 +548,14 @@
 			MethodName: "GetGoroutineCount",
 			Handler:    _Configuration_GetGoroutineCount_Handler,
 		},
+		{
+			MethodName: "UpdateLogLevel",
+			Handler:    _Configuration_UpdateLogLevel_Handler,
+		},
+		{
+			MethodName: "GetLogLevels",
+			Handler:    _Configuration_GetLogLevels_Handler,
+		},
 	},
 	Streams:  []grpc.StreamDesc{},
 	Metadata: "voltha_protos/afrouter.proto",
diff --git a/vendor/github.com/opencord/voltha-protos/go/common/common.pb.go b/vendor/github.com/opencord/voltha-protos/go/common/common.pb.go
index d4dd0b0..c50262b 100644
--- a/vendor/github.com/opencord/voltha-protos/go/common/common.pb.go
+++ b/vendor/github.com/opencord/voltha-protos/go/common/common.pb.go
@@ -122,7 +122,7 @@
 }
 
 func (AdminState_AdminState) EnumDescriptor() ([]byte, []int) {
-	return fileDescriptor_c2e3fd231961e826, []int{3, 0}
+	return fileDescriptor_c2e3fd231961e826, []int{6, 0}
 }
 
 // Operational Status
@@ -166,7 +166,7 @@
 }
 
 func (OperStatus_OperStatus) EnumDescriptor() ([]byte, []int) {
-	return fileDescriptor_c2e3fd231961e826, []int{4, 0}
+	return fileDescriptor_c2e3fd231961e826, []int{7, 0}
 }
 
 // Connectivity Status
@@ -198,7 +198,7 @@
 }
 
 func (ConnectStatus_ConnectStatus) EnumDescriptor() ([]byte, []int) {
-	return fileDescriptor_c2e3fd231961e826, []int{5, 0}
+	return fileDescriptor_c2e3fd231961e826, []int{8, 0}
 }
 
 type OperationResp_OperationReturnCode int32
@@ -226,7 +226,7 @@
 }
 
 func (OperationResp_OperationReturnCode) EnumDescriptor() ([]byte, []int) {
-	return fileDescriptor_c2e3fd231961e826, []int{6, 0}
+	return fileDescriptor_c2e3fd231961e826, []int{9, 0}
 }
 
 // Convey a resource identifier
@@ -340,6 +340,141 @@
 
 var xxx_messageInfo_LogLevel proto.InternalMessageInfo
 
+type Logging struct {
+	Level                LogLevel_LogLevel `protobuf:"varint,1,opt,name=level,proto3,enum=common.LogLevel_LogLevel" json:"level,omitempty"`
+	PackageName          string            `protobuf:"bytes,2,opt,name=package_name,json=packageName,proto3" json:"package_name,omitempty"`
+	ComponentName        string            `protobuf:"bytes,3,opt,name=component_name,json=componentName,proto3" json:"component_name,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}          `json:"-"`
+	XXX_unrecognized     []byte            `json:"-"`
+	XXX_sizecache        int32             `json:"-"`
+}
+
+func (m *Logging) Reset()         { *m = Logging{} }
+func (m *Logging) String() string { return proto.CompactTextString(m) }
+func (*Logging) ProtoMessage()    {}
+func (*Logging) Descriptor() ([]byte, []int) {
+	return fileDescriptor_c2e3fd231961e826, []int{3}
+}
+
+func (m *Logging) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_Logging.Unmarshal(m, b)
+}
+func (m *Logging) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_Logging.Marshal(b, m, deterministic)
+}
+func (m *Logging) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_Logging.Merge(m, src)
+}
+func (m *Logging) XXX_Size() int {
+	return xxx_messageInfo_Logging.Size(m)
+}
+func (m *Logging) XXX_DiscardUnknown() {
+	xxx_messageInfo_Logging.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_Logging proto.InternalMessageInfo
+
+func (m *Logging) GetLevel() LogLevel_LogLevel {
+	if m != nil {
+		return m.Level
+	}
+	return LogLevel_DEBUG
+}
+
+func (m *Logging) GetPackageName() string {
+	if m != nil {
+		return m.PackageName
+	}
+	return ""
+}
+
+func (m *Logging) GetComponentName() string {
+	if m != nil {
+		return m.ComponentName
+	}
+	return ""
+}
+
+// For GetLogLevels(), select component to query
+type LoggingComponent struct {
+	ComponentName        string   `protobuf:"bytes,1,opt,name=component_name,json=componentName,proto3" json:"component_name,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *LoggingComponent) Reset()         { *m = LoggingComponent{} }
+func (m *LoggingComponent) String() string { return proto.CompactTextString(m) }
+func (*LoggingComponent) ProtoMessage()    {}
+func (*LoggingComponent) Descriptor() ([]byte, []int) {
+	return fileDescriptor_c2e3fd231961e826, []int{4}
+}
+
+func (m *LoggingComponent) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_LoggingComponent.Unmarshal(m, b)
+}
+func (m *LoggingComponent) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_LoggingComponent.Marshal(b, m, deterministic)
+}
+func (m *LoggingComponent) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_LoggingComponent.Merge(m, src)
+}
+func (m *LoggingComponent) XXX_Size() int {
+	return xxx_messageInfo_LoggingComponent.Size(m)
+}
+func (m *LoggingComponent) XXX_DiscardUnknown() {
+	xxx_messageInfo_LoggingComponent.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_LoggingComponent proto.InternalMessageInfo
+
+func (m *LoggingComponent) GetComponentName() string {
+	if m != nil {
+		return m.ComponentName
+	}
+	return ""
+}
+
+// For returning multiple log levels
+type Loggings struct {
+	Items                []*Logging `protobuf:"bytes,1,rep,name=items,proto3" json:"items,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}   `json:"-"`
+	XXX_unrecognized     []byte     `json:"-"`
+	XXX_sizecache        int32      `json:"-"`
+}
+
+func (m *Loggings) Reset()         { *m = Loggings{} }
+func (m *Loggings) String() string { return proto.CompactTextString(m) }
+func (*Loggings) ProtoMessage()    {}
+func (*Loggings) Descriptor() ([]byte, []int) {
+	return fileDescriptor_c2e3fd231961e826, []int{5}
+}
+
+func (m *Loggings) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_Loggings.Unmarshal(m, b)
+}
+func (m *Loggings) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_Loggings.Marshal(b, m, deterministic)
+}
+func (m *Loggings) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_Loggings.Merge(m, src)
+}
+func (m *Loggings) XXX_Size() int {
+	return xxx_messageInfo_Loggings.Size(m)
+}
+func (m *Loggings) XXX_DiscardUnknown() {
+	xxx_messageInfo_Loggings.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_Loggings proto.InternalMessageInfo
+
+func (m *Loggings) GetItems() []*Logging {
+	if m != nil {
+		return m.Items
+	}
+	return nil
+}
+
 type AdminState struct {
 	XXX_NoUnkeyedLiteral struct{} `json:"-"`
 	XXX_unrecognized     []byte   `json:"-"`
@@ -350,7 +485,7 @@
 func (m *AdminState) String() string { return proto.CompactTextString(m) }
 func (*AdminState) ProtoMessage()    {}
 func (*AdminState) Descriptor() ([]byte, []int) {
-	return fileDescriptor_c2e3fd231961e826, []int{3}
+	return fileDescriptor_c2e3fd231961e826, []int{6}
 }
 
 func (m *AdminState) XXX_Unmarshal(b []byte) error {
@@ -381,7 +516,7 @@
 func (m *OperStatus) String() string { return proto.CompactTextString(m) }
 func (*OperStatus) ProtoMessage()    {}
 func (*OperStatus) Descriptor() ([]byte, []int) {
-	return fileDescriptor_c2e3fd231961e826, []int{4}
+	return fileDescriptor_c2e3fd231961e826, []int{7}
 }
 
 func (m *OperStatus) XXX_Unmarshal(b []byte) error {
@@ -412,7 +547,7 @@
 func (m *ConnectStatus) String() string { return proto.CompactTextString(m) }
 func (*ConnectStatus) ProtoMessage()    {}
 func (*ConnectStatus) Descriptor() ([]byte, []int) {
-	return fileDescriptor_c2e3fd231961e826, []int{5}
+	return fileDescriptor_c2e3fd231961e826, []int{8}
 }
 
 func (m *ConnectStatus) XXX_Unmarshal(b []byte) error {
@@ -447,7 +582,7 @@
 func (m *OperationResp) String() string { return proto.CompactTextString(m) }
 func (*OperationResp) ProtoMessage()    {}
 func (*OperationResp) Descriptor() ([]byte, []int) {
-	return fileDescriptor_c2e3fd231961e826, []int{6}
+	return fileDescriptor_c2e3fd231961e826, []int{9}
 }
 
 func (m *OperationResp) XXX_Unmarshal(b []byte) error {
@@ -492,6 +627,9 @@
 	proto.RegisterType((*ID)(nil), "common.ID")
 	proto.RegisterType((*IDs)(nil), "common.IDs")
 	proto.RegisterType((*LogLevel)(nil), "common.LogLevel")
+	proto.RegisterType((*Logging)(nil), "common.Logging")
+	proto.RegisterType((*LoggingComponent)(nil), "common.LoggingComponent")
+	proto.RegisterType((*Loggings)(nil), "common.Loggings")
 	proto.RegisterType((*AdminState)(nil), "common.AdminState")
 	proto.RegisterType((*OperStatus)(nil), "common.OperStatus")
 	proto.RegisterType((*ConnectStatus)(nil), "common.ConnectStatus")
@@ -501,41 +639,47 @@
 func init() { proto.RegisterFile("voltha_protos/common.proto", fileDescriptor_c2e3fd231961e826) }
 
 var fileDescriptor_c2e3fd231961e826 = []byte{
-	// 562 bytes of a gzipped FileDescriptorProto
-	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x6c, 0x53, 0x4f, 0x4f, 0xdb, 0x4e,
-	0x10, 0x8d, 0x9d, 0x3f, 0xc0, 0x04, 0x82, 0x7f, 0xfb, 0x2b, 0x12, 0x45, 0xad, 0x14, 0xf9, 0x02,
-	0x6d, 0x05, 0x48, 0xf4, 0x56, 0xb5, 0x87, 0xc5, 0x5e, 0xd2, 0x15, 0x66, 0x37, 0x5a, 0xdb, 0x20,
-	0xf5, 0x40, 0x64, 0xe2, 0x25, 0x58, 0x4a, 0xbc, 0x56, 0xbc, 0x20, 0x71, 0xec, 0x07, 0xec, 0x57,
-	0xe8, 0x67, 0xe8, 0xa9, 0xe7, 0x6a, 0xed, 0xa0, 0x24, 0x55, 0x6f, 0x7e, 0x6f, 0x66, 0xe7, 0xcd,
-	0xf3, 0xcc, 0xc0, 0xc1, 0x93, 0x9a, 0xea, 0x87, 0x64, 0x54, 0xcc, 0x95, 0x56, 0xe5, 0xe9, 0x58,
-	0xcd, 0x66, 0x2a, 0x3f, 0xa9, 0x10, 0xea, 0xd4, 0xe8, 0xa0, 0xbf, 0x9e, 0xf3, 0x9c, 0xe4, 0x93,
-	0x91, 0x2a, 0x74, 0xa6, 0xf2, 0xb2, 0xce, 0x74, 0x5f, 0x81, 0x4d, 0x7d, 0xd4, 0x03, 0x3b, 0x4b,
-	0xf7, 0xad, 0xbe, 0x75, 0xb4, 0x25, 0xec, 0x2c, 0x75, 0x0f, 0xa1, 0x49, 0xfd, 0x12, 0xf5, 0xa1,
-	0x9d, 0x69, 0x39, 0x2b, 0xf7, 0xad, 0x7e, 0xf3, 0xa8, 0x7b, 0x06, 0x27, 0x0b, 0x11, 0xea, 0x8b,
-	0x3a, 0xe0, 0x8e, 0x61, 0x33, 0x50, 0x93, 0x40, 0x3e, 0xc9, 0xa9, 0x3b, 0x5c, 0x7e, 0xa3, 0x2d,
-	0x68, 0xfb, 0xe4, 0x3c, 0x1e, 0x38, 0x0d, 0xb4, 0x09, 0x2d, 0xca, 0x2e, 0xb8, 0x63, 0xa1, 0x2e,
-	0x6c, 0xdc, 0x60, 0xc1, 0x28, 0x1b, 0x38, 0xb6, 0xc9, 0x20, 0x42, 0x70, 0xe1, 0x34, 0xd1, 0x36,
-	0x6c, 0x7a, 0x82, 0x46, 0xd4, 0xc3, 0x81, 0xd3, 0x32, 0x81, 0x0b, 0x1c, 0xe1, 0xc0, 0x69, 0x7f,
-	0x6a, 0xff, 0xfa, 0xfd, 0xe3, 0x6d, 0xc3, 0xfd, 0x6e, 0x01, 0xe0, 0x74, 0x96, 0xe5, 0xa1, 0x4e,
-	0xb4, 0x74, 0xa7, 0xab, 0xc8, 0x14, 0x8d, 0xd9, 0x25, 0xe3, 0x37, 0xcc, 0x69, 0x20, 0x04, 0xbd,
-	0xa1, 0x20, 0x43, 0xc1, 0xaf, 0x69, 0x48, 0x39, 0x23, 0x7e, 0xad, 0x4a, 0x18, 0x3e, 0x0f, 0x88,
-	0xef, 0xd8, 0x46, 0xca, 0xa7, 0x61, 0x8d, 0x9a, 0x68, 0x0f, 0xfe, 0xf3, 0xf9, 0x0d, 0x0b, 0x38,
-	0xf6, 0x29, 0x1b, 0x8c, 0xe8, 0x15, 0x1e, 0x10, 0xa7, 0x65, 0x5e, 0xf8, 0x24, 0x20, 0x11, 0xf1,
-	0x97, 0x3d, 0x94, 0x00, 0xbc, 0x90, 0x73, 0xa3, 0xf9, 0x58, 0xba, 0xb7, 0xab, 0x68, 0xbd, 0x85,
-	0x1e, 0x80, 0x4f, 0x43, 0x8f, 0x5f, 0x13, 0x51, 0xc9, 0xf7, 0x00, 0xb0, 0x17, 0xd1, 0x6b, 0x1c,
-	0xd5, 0xbe, 0xbb, 0xb0, 0x11, 0x91, 0xb0, 0x02, 0x4d, 0x04, 0xd0, 0xa9, 0x82, 0x46, 0x15, 0xa0,
-	0x73, 0x81, 0x69, 0xb0, 0x2a, 0x1a, 0xc1, 0x8e, 0xa7, 0xf2, 0x5c, 0x8e, 0xf5, 0x42, 0xf7, 0xf3,
-	0x5f, 0xc4, 0xba, 0xf4, 0x2e, 0x74, 0x63, 0x26, 0x08, 0xf6, 0xbe, 0x1a, 0x83, 0x8e, 0x85, 0x76,
-	0x60, 0x6b, 0x09, 0xed, 0x97, 0xaa, 0x3f, 0x2d, 0xd8, 0x31, 0xdd, 0x27, 0x66, 0x0f, 0x84, 0x2c,
-	0x0b, 0xf4, 0x05, 0x5a, 0x63, 0x95, 0xca, 0x6a, 0x01, 0x7a, 0x67, 0xef, 0x5e, 0xc6, 0xbc, 0x96,
-	0xb4, 0x8a, 0xf4, 0xe3, 0x3c, 0xf7, 0x54, 0x2a, 0x45, 0xf5, 0x0c, 0x1d, 0xc2, 0x6e, 0x92, 0xa6,
-	0x99, 0x89, 0x25, 0xd3, 0x51, 0x96, 0xdf, 0xab, 0x7d, 0xbb, 0x5a, 0xa5, 0xde, 0x92, 0xa6, 0xf9,
-	0xbd, 0x72, 0x6f, 0xe1, 0xff, 0x7f, 0x54, 0x31, 0x63, 0xe0, 0x43, 0x22, 0x70, 0x44, 0x39, 0x1b,
-	0x85, 0xb1, 0xe7, 0x91, 0x30, 0x74, 0x1a, 0xeb, 0xb4, 0xf9, 0x35, 0xb1, 0x30, 0xa6, 0x5e, 0xc3,
-	0xde, 0x92, 0x8e, 0x59, 0x18, 0x0f, 0x87, 0x5c, 0x98, 0x59, 0xbd, 0x18, 0x7c, 0xff, 0x06, 0xb6,
-	0x23, 0x59, 0xea, 0x2b, 0x95, 0xca, 0x4b, 0xf9, 0x5c, 0x9a, 0xa1, 0x27, 0x45, 0x36, 0xd2, 0xb2,
-	0xd4, 0x4e, 0xe3, 0xfc, 0xf8, 0xdb, 0x87, 0x49, 0xa6, 0x1f, 0x1e, 0xef, 0x8c, 0xcd, 0x53, 0x55,
-	0xc8, 0x7c, 0xac, 0xe6, 0xe9, 0x69, 0x7d, 0x29, 0xc7, 0x8b, 0x4b, 0x99, 0xa8, 0xc5, 0x41, 0xdd,
-	0x75, 0x2a, 0xe6, 0xe3, 0x9f, 0x00, 0x00, 0x00, 0xff, 0xff, 0xbd, 0x16, 0xe2, 0xd0, 0x6f, 0x03,
-	0x00, 0x00,
+	// 661 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x6c, 0x54, 0x4d, 0x4f, 0xdb, 0x4a,
+	0x14, 0x8d, 0xf3, 0x05, 0xdc, 0x90, 0xe0, 0x37, 0xef, 0x21, 0x01, 0x7a, 0x95, 0x52, 0x4b, 0x08,
+	0xda, 0x0a, 0xa2, 0xd2, 0x55, 0xab, 0x76, 0x61, 0xec, 0x21, 0x1d, 0x61, 0xc6, 0xd1, 0xd8, 0x01,
+	0xa9, 0x0b, 0x22, 0x13, 0x0f, 0xc6, 0x6a, 0x32, 0x63, 0xc5, 0x06, 0x89, 0x65, 0xa5, 0xfe, 0xbd,
+	0xfe, 0x85, 0xfe, 0x86, 0xae, 0xba, 0xae, 0xc6, 0x76, 0x48, 0x52, 0xb1, 0xf3, 0x39, 0x73, 0xae,
+	0xcf, 0xbd, 0xe7, 0x8e, 0x06, 0xf6, 0x1e, 0xe4, 0x24, 0xbb, 0x0b, 0x46, 0xc9, 0x4c, 0x66, 0x32,
+	0xed, 0x8d, 0xe5, 0x74, 0x2a, 0xc5, 0x71, 0x8e, 0x50, 0xb3, 0x40, 0x7b, 0xdd, 0x55, 0xcd, 0x63,
+	0x20, 0xa2, 0x91, 0x4c, 0xb2, 0x58, 0x8a, 0xb4, 0x50, 0x1a, 0xff, 0x41, 0x95, 0xd8, 0xa8, 0x03,
+	0xd5, 0x38, 0xdc, 0xd1, 0xba, 0xda, 0xe1, 0x06, 0xab, 0xc6, 0xa1, 0x71, 0x00, 0x35, 0x62, 0xa7,
+	0xa8, 0x0b, 0x8d, 0x38, 0xe3, 0xd3, 0x74, 0x47, 0xeb, 0xd6, 0x0e, 0x5b, 0x27, 0x70, 0x5c, 0x9a,
+	0x10, 0x9b, 0x15, 0x07, 0xc6, 0x18, 0xd6, 0x1d, 0x19, 0x39, 0xfc, 0x81, 0x4f, 0x8c, 0xc1, 0xe2,
+	0x1b, 0x6d, 0x40, 0xc3, 0xc6, 0xa7, 0xc3, 0xbe, 0x5e, 0x41, 0xeb, 0x50, 0x27, 0xf4, 0xcc, 0xd5,
+	0x35, 0xd4, 0x82, 0xb5, 0x2b, 0x93, 0x51, 0x42, 0xfb, 0x7a, 0x55, 0x29, 0x30, 0x63, 0x2e, 0xd3,
+	0x6b, 0x68, 0x13, 0xd6, 0x2d, 0x46, 0x7c, 0x62, 0x99, 0x8e, 0x5e, 0x57, 0x07, 0x67, 0xa6, 0x6f,
+	0x3a, 0x7a, 0xe3, 0x43, 0xe3, 0xd7, 0xef, 0x1f, 0x2f, 0x2a, 0xc6, 0x77, 0x0d, 0xd6, 0x1c, 0x19,
+	0x45, 0xb1, 0x88, 0x50, 0x0f, 0x1a, 0x13, 0xe5, 0x90, 0x37, 0xdb, 0x39, 0xd9, 0x9d, 0xb7, 0x34,
+	0x77, 0x7e, 0xfa, 0x60, 0x85, 0x0e, 0xbd, 0x84, 0xcd, 0x24, 0x18, 0x7f, 0x0d, 0x22, 0x3e, 0x12,
+	0xc1, 0x94, 0xef, 0x54, 0xf3, 0x21, 0x5b, 0x25, 0x47, 0x83, 0x29, 0x47, 0xfb, 0xd0, 0x19, 0xcb,
+	0x69, 0x22, 0x05, 0x17, 0x59, 0x21, 0xaa, 0xe5, 0xa2, 0xf6, 0x13, 0xab, 0x64, 0xc6, 0x7b, 0xd0,
+	0xcb, 0x2e, 0xac, 0x39, 0xff, 0x4c, 0xa9, 0xf6, 0x5c, 0xe9, 0xdb, 0x3c, 0x1a, 0x55, 0x9a, 0xa2,
+	0xfd, 0xd5, 0x50, 0xb7, 0x96, 0x26, 0x50, 0x82, 0x79, 0xb2, 0xdf, 0x34, 0x00, 0x33, 0x9c, 0xc6,
+	0xc2, 0xcb, 0x82, 0x8c, 0x1b, 0x93, 0x65, 0xa4, 0x92, 0x1c, 0xd2, 0x73, 0xea, 0x5e, 0x51, 0xbd,
+	0x82, 0x10, 0x74, 0x06, 0x0c, 0x0f, 0x98, 0x7b, 0x49, 0x3c, 0xe2, 0x52, 0x6c, 0x17, 0x51, 0x63,
+	0x6a, 0x9e, 0x3a, 0xd8, 0xd6, 0xab, 0x2a, 0x5f, 0x9b, 0x78, 0x05, 0xaa, 0xa1, 0x6d, 0xf8, 0xc7,
+	0x76, 0xaf, 0xa8, 0xe3, 0x9a, 0x36, 0xa1, 0xfd, 0x11, 0xb9, 0x30, 0xfb, 0x58, 0xaf, 0xab, 0x0a,
+	0x1b, 0x3b, 0xd8, 0xc7, 0xf6, 0x22, 0xf8, 0x14, 0xc0, 0x4d, 0xf8, 0x4c, 0x79, 0xde, 0xa7, 0xc6,
+	0xf5, 0x32, 0x5a, 0x6d, 0xa1, 0x03, 0x60, 0x13, 0xcf, 0x72, 0x2f, 0x31, 0xcb, 0xed, 0x3b, 0x00,
+	0xa6, 0xe5, 0x93, 0x4b, 0xd3, 0x2f, 0x96, 0xdd, 0x82, 0x35, 0x1f, 0x7b, 0x39, 0xa8, 0x21, 0x80,
+	0x66, 0x7e, 0xa8, 0x5c, 0x01, 0x9a, 0x67, 0x26, 0x71, 0x96, 0x4d, 0x7d, 0x68, 0x5b, 0x52, 0x08,
+	0x3e, 0xce, 0x4a, 0xdf, 0x8f, 0x7f, 0x11, 0xab, 0xd6, 0x5b, 0xd0, 0x1a, 0x52, 0x86, 0x4d, 0xeb,
+	0xb3, 0x1a, 0x50, 0xd7, 0x50, 0x1b, 0x36, 0x16, 0xb0, 0x3a, 0xff, 0xeb, 0x4f, 0x0d, 0xda, 0xaa,
+	0xfb, 0x40, 0x5d, 0x7e, 0xc6, 0xd3, 0x04, 0x7d, 0x82, 0xfa, 0x58, 0x86, 0xbc, 0xbc, 0x48, 0xaf,
+	0xe6, 0x6b, 0x58, 0x11, 0x2d, 0xa3, 0xec, 0x7e, 0x26, 0x2c, 0x19, 0x72, 0x96, 0x97, 0xa1, 0x03,
+	0xd8, 0x0a, 0xc2, 0x30, 0x56, 0x67, 0xc1, 0x64, 0x14, 0x8b, 0x5b, 0x59, 0x5e, 0xad, 0xce, 0x82,
+	0x26, 0xe2, 0x56, 0x1a, 0xd7, 0xf0, 0xef, 0x33, 0x7f, 0x51, 0x6b, 0x70, 0x07, 0x98, 0x99, 0x3e,
+	0x71, 0xe9, 0xc8, 0x1b, 0x5a, 0x16, 0xf6, 0x3c, 0xbd, 0xb2, 0x4a, 0xab, 0x68, 0x86, 0x4c, 0x0d,
+	0xb5, 0x0b, 0xdb, 0x0b, 0x7a, 0x48, 0xbd, 0xe1, 0x60, 0xe0, 0x32, 0xb5, 0xab, 0xf9, 0x80, 0xaf,
+	0xff, 0x87, 0x4d, 0x9f, 0xa7, 0xd9, 0x85, 0x0c, 0xf9, 0x39, 0x7f, 0x4c, 0xd5, 0xd2, 0x83, 0x24,
+	0x1e, 0x65, 0x3c, 0xcd, 0xf4, 0xca, 0xe9, 0xd1, 0x97, 0x37, 0x51, 0x9c, 0xdd, 0xdd, 0xdf, 0xa8,
+	0x31, 0x7b, 0x32, 0xe1, 0x62, 0x2c, 0x67, 0x61, 0xaf, 0x78, 0x1e, 0x8e, 0xca, 0xe7, 0x21, 0x92,
+	0xe5, 0x2b, 0x72, 0xd3, 0xcc, 0x99, 0x77, 0x7f, 0x02, 0x00, 0x00, 0xff, 0xff, 0xa8, 0xd4, 0xbf,
+	0xf3, 0x64, 0x04, 0x00, 0x00,
 }
diff --git a/vendor/github.com/opencord/voltha-protos/go/inter_container/inter_container.pb.go b/vendor/github.com/opencord/voltha-protos/go/inter_container/inter_container.pb.go
index 15ef51b..650452a 100644
--- a/vendor/github.com/opencord/voltha-protos/go/inter_container/inter_container.pb.go
+++ b/vendor/github.com/opencord/voltha-protos/go/inter_container/inter_container.pb.go
@@ -33,6 +33,15 @@
 // LogLevel from public import voltha_protos/common.proto
 type LogLevel = common.LogLevel
 
+// Logging from public import voltha_protos/common.proto
+type Logging = common.Logging
+
+// LoggingComponent from public import voltha_protos/common.proto
+type LoggingComponent = common.LoggingComponent
+
+// Loggings from public import voltha_protos/common.proto
+type Loggings = common.Loggings
+
 // AdminState from public import voltha_protos/common.proto
 type AdminState = common.AdminState
 
@@ -130,9 +139,6 @@
 // AlarmFilters from public import voltha_protos/voltha.proto
 type AlarmFilters = voltha.AlarmFilters
 
-// Logging from public import voltha_protos/voltha.proto
-type Logging = voltha.Logging
-
 // CoreInstance from public import voltha_protos/voltha.proto
 type CoreInstance = voltha.CoreInstance
 
diff --git a/vendor/github.com/opencord/voltha-protos/go/voltha.pb b/vendor/github.com/opencord/voltha-protos/go/voltha.pb
index 9089554..427ca42 100644
--- a/vendor/github.com/opencord/voltha-protos/go/voltha.pb
+++ b/vendor/github.com/opencord/voltha-protos/go/voltha.pb
Binary files differ
diff --git a/vendor/github.com/opencord/voltha-protos/go/voltha/voltha.pb.go b/vendor/github.com/opencord/voltha-protos/go/voltha/voltha.pb.go
index 9d1498c..17eaecf 100644
--- a/vendor/github.com/opencord/voltha-protos/go/voltha/voltha.pb.go
+++ b/vendor/github.com/opencord/voltha-protos/go/voltha/voltha.pb.go
@@ -53,6 +53,15 @@
 // LogLevel from public import voltha_protos/common.proto
 type LogLevel = common.LogLevel
 
+// Logging from public import voltha_protos/common.proto
+type Logging = common.Logging
+
+// LoggingComponent from public import voltha_protos/common.proto
+type LoggingComponent = common.LoggingComponent
+
+// Loggings from public import voltha_protos/common.proto
+type Loggings = common.Loggings
+
 // AdminState from public import voltha_protos/common.proto
 type AdminState = common.AdminState
 
@@ -1326,7 +1335,7 @@
 }
 
 func (SelfTestResponse_SelfTestResult) EnumDescriptor() ([]byte, []int) {
-	return fileDescriptor_e084f1a60ce7016c, []int{10, 0}
+	return fileDescriptor_e084f1a60ce7016c, []int{9, 0}
 }
 
 type DeviceGroup struct {
@@ -1587,53 +1596,6 @@
 	return nil
 }
 
-type Logging struct {
-	Level                common.LogLevel_LogLevel `protobuf:"varint,1,opt,name=level,proto3,enum=common.LogLevel_LogLevel" json:"level,omitempty"`
-	PackageName          string                   `protobuf:"bytes,2,opt,name=package_name,json=packageName,proto3" json:"package_name,omitempty"`
-	XXX_NoUnkeyedLiteral struct{}                 `json:"-"`
-	XXX_unrecognized     []byte                   `json:"-"`
-	XXX_sizecache        int32                    `json:"-"`
-}
-
-func (m *Logging) Reset()         { *m = Logging{} }
-func (m *Logging) String() string { return proto.CompactTextString(m) }
-func (*Logging) ProtoMessage()    {}
-func (*Logging) Descriptor() ([]byte, []int) {
-	return fileDescriptor_e084f1a60ce7016c, []int{6}
-}
-
-func (m *Logging) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_Logging.Unmarshal(m, b)
-}
-func (m *Logging) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_Logging.Marshal(b, m, deterministic)
-}
-func (m *Logging) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_Logging.Merge(m, src)
-}
-func (m *Logging) XXX_Size() int {
-	return xxx_messageInfo_Logging.Size(m)
-}
-func (m *Logging) XXX_DiscardUnknown() {
-	xxx_messageInfo_Logging.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_Logging proto.InternalMessageInfo
-
-func (m *Logging) GetLevel() common.LogLevel_LogLevel {
-	if m != nil {
-		return m.Level
-	}
-	return common.LogLevel_DEBUG
-}
-
-func (m *Logging) GetPackageName() string {
-	if m != nil {
-		return m.PackageName
-	}
-	return ""
-}
-
 // CoreInstance represents a core instance.  It is data held in memory when a core
 // is running.  This data is not persistent.
 type CoreInstance struct {
@@ -1648,7 +1610,7 @@
 func (m *CoreInstance) String() string { return proto.CompactTextString(m) }
 func (*CoreInstance) ProtoMessage()    {}
 func (*CoreInstance) Descriptor() ([]byte, []int) {
-	return fileDescriptor_e084f1a60ce7016c, []int{7}
+	return fileDescriptor_e084f1a60ce7016c, []int{6}
 }
 
 func (m *CoreInstance) XXX_Unmarshal(b []byte) error {
@@ -1694,7 +1656,7 @@
 func (m *CoreInstances) String() string { return proto.CompactTextString(m) }
 func (*CoreInstances) ProtoMessage()    {}
 func (*CoreInstances) Descriptor() ([]byte, []int) {
-	return fileDescriptor_e084f1a60ce7016c, []int{8}
+	return fileDescriptor_e084f1a60ce7016c, []int{7}
 }
 
 func (m *CoreInstances) XXX_Unmarshal(b []byte) error {
@@ -1744,7 +1706,7 @@
 func (m *Voltha) String() string { return proto.CompactTextString(m) }
 func (*Voltha) ProtoMessage()    {}
 func (*Voltha) Descriptor() ([]byte, []int) {
-	return fileDescriptor_e084f1a60ce7016c, []int{9}
+	return fileDescriptor_e084f1a60ce7016c, []int{8}
 }
 
 func (m *Voltha) XXX_Unmarshal(b []byte) error {
@@ -1840,7 +1802,7 @@
 func (m *SelfTestResponse) String() string { return proto.CompactTextString(m) }
 func (*SelfTestResponse) ProtoMessage()    {}
 func (*SelfTestResponse) Descriptor() ([]byte, []int) {
-	return fileDescriptor_e084f1a60ce7016c, []int{10}
+	return fileDescriptor_e084f1a60ce7016c, []int{9}
 }
 
 func (m *SelfTestResponse) XXX_Unmarshal(b []byte) error {
@@ -1882,7 +1844,7 @@
 func (m *OfAgentSubscriber) String() string { return proto.CompactTextString(m) }
 func (*OfAgentSubscriber) ProtoMessage()    {}
 func (*OfAgentSubscriber) Descriptor() ([]byte, []int) {
-	return fileDescriptor_e084f1a60ce7016c, []int{11}
+	return fileDescriptor_e084f1a60ce7016c, []int{10}
 }
 
 func (m *OfAgentSubscriber) XXX_Unmarshal(b []byte) error {
@@ -1932,7 +1894,7 @@
 func (m *Membership) String() string { return proto.CompactTextString(m) }
 func (*Membership) ProtoMessage()    {}
 func (*Membership) Descriptor() ([]byte, []int) {
-	return fileDescriptor_e084f1a60ce7016c, []int{12}
+	return fileDescriptor_e084f1a60ce7016c, []int{11}
 }
 
 func (m *Membership) XXX_Unmarshal(b []byte) error {
@@ -1980,7 +1942,7 @@
 func (m *FlowMetadata) String() string { return proto.CompactTextString(m) }
 func (*FlowMetadata) ProtoMessage()    {}
 func (*FlowMetadata) Descriptor() ([]byte, []int) {
-	return fileDescriptor_e084f1a60ce7016c, []int{13}
+	return fileDescriptor_e084f1a60ce7016c, []int{12}
 }
 
 func (m *FlowMetadata) XXX_Unmarshal(b []byte) error {
@@ -2017,7 +1979,6 @@
 	proto.RegisterType((*AlarmFilterRule)(nil), "voltha.AlarmFilterRule")
 	proto.RegisterType((*AlarmFilter)(nil), "voltha.AlarmFilter")
 	proto.RegisterType((*AlarmFilters)(nil), "voltha.AlarmFilters")
-	proto.RegisterType((*Logging)(nil), "voltha.Logging")
 	proto.RegisterType((*CoreInstance)(nil), "voltha.CoreInstance")
 	proto.RegisterType((*CoreInstances)(nil), "voltha.CoreInstances")
 	proto.RegisterType((*Voltha)(nil), "voltha.Voltha")
@@ -2030,164 +1991,163 @@
 func init() { proto.RegisterFile("voltha_protos/voltha.proto", fileDescriptor_e084f1a60ce7016c) }
 
 var fileDescriptor_e084f1a60ce7016c = []byte{
-	// 2505 bytes of a gzipped FileDescriptorProto
-	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xc4, 0x5a, 0x5b, 0x73, 0xdb, 0xc6,
-	0xf5, 0x17, 0x75, 0xd7, 0x21, 0x29, 0x92, 0x47, 0x37, 0x9a, 0x92, 0x62, 0x69, 0x13, 0x5f, 0xfe,
-	0x4a, 0x44, 0xc6, 0x56, 0xec, 0xf9, 0xd7, 0x69, 0x26, 0xb5, 0x2e, 0x56, 0x59, 0xcb, 0x12, 0x0b,
-	0x5a, 0x76, 0xdb, 0xc4, 0xc3, 0x01, 0x89, 0x15, 0x85, 0x31, 0x08, 0xb0, 0x58, 0x50, 0xae, 0xc6,
-	0xcd, 0xb4, 0x93, 0x5e, 0xa7, 0x8f, 0xcd, 0x57, 0xe8, 0x53, 0xa7, 0xfd, 0x28, 0x7e, 0xea, 0x17,
-	0xe8, 0x74, 0xfa, 0xd0, 0xc7, 0x3e, 0xb9, 0x7d, 0xec, 0xec, 0x05, 0x14, 0x40, 0x00, 0xba, 0xa4,
-	0x99, 0xe9, 0x93, 0x88, 0x3d, 0x67, 0x7f, 0xbf, 0xdf, 0x9e, 0xdd, 0x3d, 0x7b, 0xb0, 0x10, 0x94,
-	0x4e, 0x1c, 0xcb, 0x3b, 0xd6, 0x1b, 0x5d, 0xd7, 0xf1, 0x1c, 0x56, 0x91, 0x4f, 0x65, 0xf1, 0x84,
-	0xe3, 0xf2, 0xa9, 0xb4, 0xd4, 0x76, 0x9c, 0xb6, 0x45, 0x2b, 0x7a, 0xd7, 0xac, 0xe8, 0xb6, 0xed,
-	0x78, 0xba, 0x67, 0x3a, 0x36, 0x93, 0x5e, 0xa5, 0x45, 0x65, 0x15, 0x4f, 0xcd, 0xde, 0x51, 0x85,
-	0x76, 0xba, 0xde, 0xa9, 0x32, 0x16, 0xc3, 0xf0, 0x1d, 0xea, 0x29, 0xf0, 0xd2, 0x00, 0x71, 0xcb,
-	0xe9, 0x74, 0x1c, 0x3b, 0xde, 0x76, 0x4c, 0x75, 0xcb, 0x3b, 0x56, 0x36, 0x12, 0xb6, 0x59, 0x4e,
-	0xdb, 0x6c, 0xe9, 0x56, 0xc3, 0xa0, 0x27, 0x66, 0x8b, 0xc6, 0xf7, 0x0f, 0xd9, 0x16, 0xc3, 0x36,
-	0xdd, 0xd0, 0xbb, 0x1e, 0x75, 0x95, 0xf1, 0x7a, 0xd8, 0xe8, 0x74, 0xa9, 0x7d, 0x64, 0x39, 0xaf,
-	0x1a, 0x77, 0x36, 0x12, 0x1c, 0x3a, 0x2d, 0xb3, 0xd1, 0x31, 0x9b, 0x0d, 0xa3, 0xa9, 0x1c, 0x56,
-	0x63, 0x1c, 0x74, 0x4b, 0x77, 0x3b, 0x67, 0x2e, 0x2b, 0x61, 0x97, 0x53, 0xdd, 0x6e, 0x37, 0x9c,
-	0x6e, 0x20, 0xa4, 0xe4, 0x0f, 0x29, 0x48, 0x6f, 0x0b, 0xd1, 0xbb, 0xae, 0xd3, 0xeb, 0xe2, 0x1c,
-	0x0c, 0x9b, 0x46, 0x31, 0xb5, 0x92, 0xba, 0x3d, 0xb5, 0x39, 0xf6, 0x8f, 0xb7, 0x6f, 0x96, 0x53,
-	0xda, 0xb0, 0x69, 0x60, 0x15, 0x72, 0xe1, 0xe1, 0xb3, 0xe2, 0xf0, 0xca, 0xc8, 0xed, 0xf4, 0xdd,
-	0xb9, 0xb2, 0x9a, 0xc7, 0x3d, 0x69, 0x96, 0x58, 0x9b, 0x53, 0x7f, 0x7b, 0xfb, 0x66, 0x79, 0x94,
-	0x63, 0x69, 0xd3, 0x56, 0xd0, 0xc2, 0x70, 0x03, 0x26, 0x7c, 0x88, 0x11, 0x01, 0x31, 0xed, 0x43,
-	0x44, 0xfb, 0xfa, 0x9e, 0xe4, 0x5b, 0x90, 0x09, 0xa8, 0x64, 0xf8, 0x7f, 0x30, 0x66, 0x7a, 0xb4,
-	0xc3, 0x8a, 0x29, 0x01, 0x31, 0x13, 0x86, 0x10, 0x4e, 0x9a, 0xf4, 0x20, 0x3f, 0x03, 0x7c, 0xc8,
-	0xa3, 0xf2, 0xc8, 0xb4, 0x3c, 0xea, 0x6a, 0x3d, 0x8b, 0x3e, 0xa6, 0xa7, 0xa4, 0x19, 0xd7, 0x8a,
-	0xe3, 0x9c, 0x35, 0x3f, 0x84, 0x93, 0x30, 0xea, 0x9d, 0x76, 0x69, 0x3e, 0x85, 0x19, 0x98, 0x64,
-	0xf4, 0x84, 0xba, 0xa6, 0x77, 0x9a, 0x1f, 0xc6, 0x1c, 0xa4, 0x5d, 0xca, 0x9c, 0x9e, 0xdb, 0xa2,
-	0x0d, 0xd3, 0xc8, 0x8f, 0x70, 0x73, 0x4b, 0xf7, 0x68, 0xdb, 0x71, 0x4f, 0xf3, 0xa3, 0x98, 0x85,
-	0x29, 0x29, 0x98, 0x1b, 0xc7, 0x1e, 0x8c, 0xfd, 0xf3, 0xed, 0x9b, 0xe5, 0x21, 0x72, 0x0c, 0xb9,
-	0x01, 0x2a, 0xfc, 0x14, 0x46, 0x5e, 0xd2, 0x53, 0x11, 0xe6, 0xe9, 0xbb, 0xeb, 0xbe, 0xf8, 0xa8,
-	0xa0, 0x98, 0x26, 0x8d, 0xf7, 0xc4, 0x59, 0x18, 0x3b, 0xd1, 0xad, 0x1e, 0x2d, 0x0e, 0xf3, 0x99,
-	0xd2, 0xe4, 0x03, 0xa9, 0x43, 0x3a, 0xd0, 0x21, 0x69, 0x2e, 0xd7, 0x61, 0xcc, 0xed, 0x59, 0xfd,
-	0x19, 0x5c, 0x48, 0xa0, 0xd7, 0xa4, 0x17, 0xf9, 0x04, 0x32, 0x01, 0x0b, 0xc3, 0x75, 0x98, 0x38,
-	0x92, 0x3f, 0x07, 0x83, 0x1f, 0x04, 0xf0, 0x7d, 0xc8, 0x0b, 0x98, 0xd8, 0x73, 0xda, 0x6d, 0xd3,
-	0x6e, 0x63, 0x05, 0xc6, 0x2c, 0x7a, 0x42, 0x2d, 0x35, 0xee, 0x6b, 0x65, 0xb5, 0x13, 0xf7, 0x9c,
-	0xf6, 0x1e, 0x6f, 0xef, 0xff, 0xd0, 0xa4, 0x1f, 0xae, 0x42, 0xa6, 0xab, 0xb7, 0x5e, 0xea, 0x6d,
-	0xda, 0xb0, 0xf5, 0x8e, 0x3f, 0xd8, 0xb4, 0x6a, 0xdb, 0xd7, 0x3b, 0x94, 0xb8, 0x90, 0xd9, 0x72,
-	0x5c, 0x5a, 0xb5, 0x99, 0xa7, 0xdb, 0x2d, 0x8a, 0x37, 0x21, 0x6d, 0xaa, 0xdf, 0x8d, 0xc1, 0xc1,
-	0x83, 0x6f, 0xa9, 0x1a, 0xb8, 0x01, 0xe3, 0x72, 0xaf, 0x0b, 0xd0, 0xf4, 0xdd, 0x59, 0x7f, 0x10,
-	0xdf, 0x15, 0xad, 0x75, 0x4f, 0xf7, 0x7a, 0x6c, 0x73, 0x8c, 0x2f, 0xc5, 0x21, 0x4d, 0xb9, 0x3e,
-	0x18, 0xfb, 0x37, 0xc7, 0x21, 0x9b, 0x90, 0x0d, 0x72, 0x32, 0x5c, 0x0b, 0xaf, 0xc6, 0x3e, 0x56,
-	0xd0, 0x4b, 0x2d, 0x47, 0x1f, 0xe3, 0xaf, 0xa3, 0x30, 0xfe, 0x4c, 0x78, 0xe1, 0x75, 0x98, 0x38,
-	0xa1, 0x2e, 0x33, 0x1d, 0x3b, 0x2c, 0xd7, 0x6f, 0xc5, 0xfb, 0x30, 0xa9, 0x72, 0x87, 0x3f, 0x67,
-	0xb9, 0x7e, 0xc8, 0x65, 0x7b, 0x70, 0xcf, 0xf4, 0x7d, 0xe3, 0x36, 0xed, 0xc8, 0x7f, 0xbf, 0x69,
-	0x47, 0x2f, 0xbb, 0x69, 0xf1, 0x3b, 0x90, 0x51, 0xdb, 0x81, 0x6f, 0x26, 0x56, 0x1c, 0x13, 0x3d,
-	0x31, 0xdc, 0xf3, 0xe9, 0x69, 0x37, 0xd4, 0x3b, 0x6d, 0xf4, 0x9b, 0x19, 0x6e, 0x41, 0x56, 0x21,
-	0xb4, 0xc5, 0xbe, 0x2f, 0x8e, 0x27, 0x6e, 0xf7, 0x20, 0x86, 0xa2, 0x55, 0xb9, 0x62, 0x0b, 0xb2,
-	0x32, 0x2d, 0xfa, 0xcb, 0x76, 0x22, 0x71, 0xd9, 0x86, 0x40, 0xf4, 0xe0, 0xaa, 0xff, 0x3e, 0x14,
-	0xce, 0x32, 0xb0, 0xee, 0xe9, 0x4d, 0x9d, 0xd1, 0xe2, 0x92, 0x02, 0xe2, 0x96, 0xf2, 0x13, 0xb3,
-	0x29, 0xe5, 0x6c, 0xeb, 0x9e, 0xbe, 0x99, 0xe7, 0x40, 0xe9, 0x40, 0x3e, 0xd0, 0x72, 0xdc, 0x8b,
-	0x3b, 0xa9, 0xde, 0xf8, 0x1c, 0x66, 0x82, 0x39, 0xdb, 0x07, 0x5d, 0x56, 0x53, 0x24, 0x40, 0x85,
-	0xb6, 0x73, 0x61, 0x85, 0x2c, 0xe9, 0xa6, 0x10, 0xfc, 0x25, 0xf6, 0xa7, 0x14, 0xe4, 0xeb, 0xd4,
-	0x3a, 0x7a, 0x4a, 0x99, 0xa7, 0x51, 0xd6, 0x75, 0x6c, 0xc6, 0x33, 0xcf, 0xb8, 0x4b, 0x59, 0xcf,
-	0xf2, 0xd4, 0x26, 0xbc, 0xe5, 0x47, 0x61, 0xd0, 0x33, 0xd8, 0xd0, 0xb3, 0x3c, 0x4d, 0x75, 0x23,
-	0x35, 0x98, 0x0e, 0x5b, 0x30, 0x0d, 0x13, 0xf5, 0xc3, 0xad, 0xad, 0x9d, 0x7a, 0x3d, 0x3f, 0xc4,
-	0x1f, 0x1e, 0x3d, 0xac, 0xee, 0x1d, 0x6a, 0x3b, 0xf9, 0x14, 0x16, 0x20, 0xbb, 0x7f, 0xf0, 0xb4,
-	0x51, 0x3f, 0xac, 0xd5, 0x0e, 0xb4, 0xa7, 0x3b, 0xdb, 0xf9, 0x61, 0xde, 0x74, 0xb8, 0xff, 0x78,
-	0xff, 0xe0, 0xf9, 0x7e, 0x63, 0x47, 0xd3, 0x0e, 0xb4, 0xfc, 0x88, 0x9f, 0x26, 0x0f, 0xa0, 0x70,
-	0x70, 0xf4, 0xb0, 0x4d, 0x6d, 0xaf, 0xde, 0x6b, 0xb2, 0x96, 0x6b, 0x36, 0xa9, 0x8b, 0xcb, 0x00,
-	0xce, 0x91, 0xce, 0x1b, 0xfb, 0xbb, 0x59, 0x9b, 0x52, 0x2d, 0x55, 0x03, 0x17, 0x61, 0x4a, 0x9d,
-	0x70, 0xa6, 0xa1, 0xb2, 0xc3, 0xa4, 0x6c, 0xa8, 0x1a, 0xe4, 0x63, 0x80, 0x27, 0xb4, 0xd3, 0xa4,
-	0x2e, 0x3b, 0x36, 0xbb, 0x1c, 0x49, 0xac, 0x21, 0x99, 0x49, 0x14, 0x92, 0x68, 0xe1, 0x79, 0x04,
-	0xa7, 0x45, 0xae, 0x94, 0x10, 0xc3, 0xa6, 0x41, 0x76, 0x20, 0xf3, 0xc8, 0x72, 0x5e, 0x3d, 0xa1,
-	0x9e, 0xce, 0x67, 0x06, 0xef, 0xc1, 0x78, 0x87, 0x06, 0x92, 0xde, 0x72, 0x39, 0x78, 0x62, 0x3b,
-	0x47, 0xdd, 0x86, 0x30, 0x37, 0x5a, 0x8e, 0x7d, 0x64, 0xb6, 0x35, 0xe5, 0x7c, 0xf7, 0xcf, 0x15,
-	0xc8, 0xca, 0x6d, 0x5e, 0xa7, 0x2e, 0x9f, 0x32, 0x3c, 0x80, 0xe9, 0xc3, 0xae, 0xa1, 0x7b, 0xd4,
-	0x4f, 0x76, 0x98, 0x0b, 0xec, 0x46, 0x9e, 0x27, 0x4b, 0xf3, 0x65, 0x59, 0xe7, 0x94, 0xfd, 0x3a,
-	0xa7, 0xbc, 0xc3, 0xeb, 0x1c, 0x32, 0xfb, 0xe5, 0x5f, 0xfe, 0xfe, 0xd5, 0xf0, 0x34, 0x66, 0x44,
-	0x79, 0x74, 0x72, 0x87, 0x57, 0x24, 0x0c, 0x9f, 0x43, 0x76, 0x97, 0x7a, 0x81, 0x91, 0x26, 0x74,
-	0x2f, 0xf5, 0x37, 0xde, 0x99, 0x2f, 0x29, 0x09, 0xc8, 0x59, 0x44, 0x1f, 0xb2, 0x73, 0x86, 0xf3,
-	0x02, 0xf2, 0x52, 0x69, 0x00, 0x3b, 0x06, 0x23, 0x51, 0xee, 0xb2, 0xc0, 0x5e, 0x20, 0x31, 0xd8,
-	0x0f, 0x52, 0x6b, 0xb8, 0x0d, 0x53, 0xbb, 0xd4, 0x53, 0x39, 0x30, 0x49, 0x73, 0x3f, 0xcd, 0x48,
-	0x3f, 0x92, 0x13, 0x98, 0x53, 0x38, 0xa1, 0x30, 0xb1, 0x07, 0x85, 0x3d, 0x93, 0x79, 0xe1, 0x7c,
-	0x9c, 0x84, 0x36, 0x17, 0x97, 0x98, 0x19, 0xb9, 0xf3, 0xbb, 0x7f, 0xbd, 0x59, 0x9e, 0x50, 0x39,
-	0x5c, 0xfc, 0x46, 0xf9, 0x5b, 0x90, 0xcd, 0x60, 0xc1, 0x1f, 0x80, 0xd9, 0x67, 0xa8, 0x43, 0x6e,
-	0x97, 0x86, 0x58, 0x11, 0xfc, 0xe3, 0xac, 0xba, 0x5d, 0x8a, 0x3d, 0x01, 0xc8, 0x3b, 0x02, 0xaf,
-	0x88, 0xf3, 0x11, 0xbc, 0xca, 0x6b, 0xd3, 0xf8, 0x02, 0x75, 0xc8, 0xf0, 0xb1, 0x3c, 0xf4, 0xf3,
-	0x77, 0xd2, 0x30, 0xf2, 0x03, 0xd9, 0x9f, 0x91, 0x5b, 0x5c, 0x35, 0x9c, 0x1d, 0x13, 0x82, 0x08,
-	0x31, 0xef, 0x13, 0xf5, 0x8f, 0x84, 0xd7, 0x80, 0x9c, 0x62, 0x2f, 0x9c, 0xdd, 0x93, 0x88, 0xe6,
-	0x63, 0xcf, 0x09, 0x46, 0xee, 0x71, 0xba, 0x42, 0xe4, 0x74, 0x11, 0xac, 0xd7, 0x70, 0x21, 0xb0,
-	0x3c, 0x83, 0x66, 0xfc, 0x0c, 0xf2, 0xbb, 0x34, 0xcc, 0x1d, 0x8a, 0x5a, 0xfc, 0xb1, 0x44, 0xde,
-	0x13, 0xb8, 0xef, 0xe0, 0x52, 0x02, 0xae, 0x0c, 0x9e, 0x0b, 0xf3, 0x91, 0x91, 0xd5, 0x1c, 0xd7,
-	0x63, 0xf1, 0x13, 0xa3, 0xfc, 0x84, 0x07, 0xb9, 0xaf, 0x16, 0x40, 0x97, 0x3f, 0x09, 0xb6, 0xf7,
-	0x90, 0x9c, 0xc7, 0x56, 0x11, 0x9e, 0xf8, 0x8b, 0x14, 0xcc, 0x0e, 0x8e, 0x88, 0x23, 0xe2, 0x5c,
-	0x0c, 0x4d, 0xd5, 0x28, 0xcd, 0xc4, 0x34, 0x93, 0x4f, 0x39, 0xf9, 0x38, 0x8c, 0x72, 0x48, 0xc1,
-	0x5d, 0xc6, 0x0f, 0x2e, 0xe6, 0xae, 0xbc, 0xe6, 0x7f, 0x1a, 0x7c, 0xe4, 0xbf, 0x4a, 0xc1, 0xc2,
-	0x8e, 0xad, 0x37, 0x2d, 0x7a, 0x69, 0x21, 0x49, 0x5b, 0xf6, 0x63, 0x21, 0xe0, 0x1e, 0xd9, 0xb8,
-	0x8a, 0x80, 0x0a, 0x15, 0xe4, 0xf8, 0x9b, 0x14, 0x14, 0xb7, 0x4d, 0xf6, 0x8d, 0x08, 0xf9, 0xb6,
-	0x10, 0x72, 0x9f, 0x7c, 0x74, 0x25, 0x21, 0x86, 0x64, 0xc7, 0x9f, 0xc6, 0xac, 0x05, 0x9e, 0xcd,
-	0xc3, 0x6b, 0x01, 0x43, 0x29, 0x5c, 0xd8, 0xc9, 0xa6, 0x5a, 0x09, 0xbc, 0x35, 0x9a, 0x0a, 0x2e,
-	0x5a, 0x15, 0xa2, 0x17, 0x5f, 0x15, 0x4b, 0xfd, 0x14, 0x1f, 0x16, 0xf0, 0x54, 0xc8, 0x5b, 0x8a,
-	0x10, 0x8b, 0x76, 0xd9, 0x27, 0x31, 0x24, 0xeb, 0x42, 0xc2, 0x2d, 0x72, 0x09, 0x09, 0x3c, 0xbd,
-	0xfe, 0x32, 0x05, 0xcb, 0x31, 0x2a, 0x9e, 0xf0, 0x73, 0x49, 0xca, 0x58, 0x0c, 0xc9, 0x10, 0x86,
-	0x27, 0x8e, 0x71, 0x81, 0x8a, 0xb2, 0x50, 0x71, 0x9b, 0xbc, 0x7b, 0xae, 0x0a, 0x79, 0xfa, 0x71,
-	0x19, 0x3f, 0x4f, 0xc1, 0x42, 0x64, 0x2e, 0x04, 0x57, 0x78, 0x32, 0x66, 0xa2, 0x62, 0x18, 0xd9,
-	0xe6, 0x33, 0x30, 0xe9, 0x9f, 0xbc, 0x91, 0xe9, 0xb8, 0x81, 0x97, 0x51, 0x81, 0xbf, 0x4f, 0xc1,
-	0x62, 0xec, 0x72, 0x50, 0xf5, 0x61, 0x50, 0xc6, 0x42, 0x64, 0x6a, 0xa4, 0x13, 0xd9, 0xe7, 0xec,
-	0x59, 0x48, 0x0b, 0x93, 0x2c, 0x46, 0x23, 0x7a, 0xd6, 0xf0, 0xf6, 0x85, 0x73, 0xa3, 0xfa, 0xe2,
-	0x57, 0x29, 0x58, 0x4d, 0x58, 0x24, 0x82, 0x51, 0x4e, 0xd1, 0x6a, 0xbc, 0x9c, 0xcb, 0x2c, 0x97,
-	0x0d, 0x21, 0x69, 0x9d, 0x5c, 0x5a, 0x12, 0x9f, 0xad, 0x17, 0x90, 0xe6, 0x91, 0xba, 0xe8, 0x5c,
-	0xc8, 0x85, 0xeb, 0x6f, 0x46, 0x6e, 0xf0, 0x58, 0x4c, 0xf5, 0xdf, 0x11, 0x04, 0x75, 0x01, 0x73,
-	0x3e, 0xb5, 0x7f, 0x00, 0x18, 0x90, 0x3d, 0x83, 0xaf, 0x1a, 0xc9, 0x04, 0xe9, 0xb3, 0x29, 0x61,
-	0xa4, 0xcc, 0xc1, 0x45, 0x4d, 0x7e, 0xde, 0xd9, 0x2c, 0x39, 0x4c, 0x83, 0xe1, 0x21, 0xe4, 0x35,
-	0xda, 0x72, 0xec, 0x96, 0x69, 0x51, 0x7f, 0x24, 0x41, 0xc0, 0xc4, 0x90, 0x2d, 0x09, 0xcc, 0x79,
-	0x12, 0xc5, 0xe4, 0xb1, 0xd9, 0x11, 0xf5, 0x4a, 0xcc, 0xb1, 0x35, 0xf0, 0x2a, 0xe4, 0xc3, 0xe0,
-	0xec, 0xc0, 0xf0, 0xe5, 0x39, 0xf5, 0x3d, 0xc8, 0x6c, 0xb9, 0x54, 0xf7, 0x94, 0x34, 0x1c, 0xe8,
-	0x1d, 0x41, 0x53, 0x15, 0x1a, 0x19, 0x0c, 0x26, 0x97, 0xf4, 0x1c, 0x32, 0x32, 0xf1, 0xc7, 0xa8,
-	0x4a, 0x1a, 0xe4, 0xbb, 0x02, 0x6f, 0x99, 0x2c, 0xc6, 0xa9, 0xf3, 0x53, 0xf9, 0x0f, 0x21, 0xab,
-	0x32, 0xf9, 0x15, 0x90, 0xd5, 0x39, 0x4d, 0x96, 0x62, 0x91, 0xfd, 0xdc, 0xfc, 0x1c, 0x32, 0x1a,
-	0x6d, 0x3a, 0x8e, 0xf7, 0x8d, 0x69, 0x76, 0x05, 0x1c, 0x07, 0xde, 0xa6, 0x16, 0xf5, 0xbe, 0x46,
-	0x30, 0xd6, 0xe2, 0x81, 0x0d, 0x01, 0x87, 0x3d, 0xc8, 0x6e, 0x3b, 0xaf, 0x6c, 0xcb, 0xd1, 0x8d,
-	0x6a, 0x47, 0x6f, 0xd3, 0xb3, 0xb3, 0x4c, 0x3c, 0xfa, 0xb6, 0xd2, 0x9c, 0x4f, 0x78, 0xd0, 0xa5,
-	0xae, 0xb8, 0xb7, 0xe4, 0xef, 0x52, 0xe4, 0xbe, 0xe0, 0xf8, 0x90, 0xbc, 0x1f, 0xcb, 0x61, 0x72,
-	0x88, 0x86, 0xa1, 0x30, 0x58, 0xe5, 0x35, 0x7f, 0x3d, 0xf9, 0x82, 0x4f, 0xee, 0x97, 0x29, 0x98,
-	0xdf, 0xa5, 0x5e, 0x88, 0x43, 0x5e, 0x4b, 0x24, 0x0b, 0x88, 0x6b, 0x26, 0x0f, 0x84, 0x80, 0x8f,
-	0xf0, 0xee, 0x15, 0x04, 0x54, 0x98, 0x64, 0xea, 0x89, 0x92, 0x2d, 0x84, 0x77, 0x45, 0x76, 0x95,
-	0x87, 0xf0, 0x2a, 0xc3, 0xc7, 0x23, 0x59, 0xa6, 0x86, 0x90, 0xd8, 0xc0, 0x8c, 0xc6, 0xb1, 0x31,
-	0xf2, 0x81, 0xa0, 0xbb, 0x89, 0xef, 0x5d, 0x86, 0x0e, 0x7f, 0x02, 0x33, 0x5b, 0xbc, 0x00, 0xb7,
-	0x2e, 0x39, 0xc2, 0xd8, 0x09, 0x56, 0x23, 0x5c, 0xbb, 0xd2, 0x08, 0x7f, 0x9b, 0x82, 0x99, 0x87,
-	0x2d, 0xcf, 0x3c, 0xd1, 0x3d, 0x2a, 0x58, 0x64, 0x3a, 0xbf, 0x22, 0xf5, 0x96, 0xa0, 0xfe, 0x84,
-	0xfc, 0xff, 0x55, 0xa6, 0x56, 0x36, 0xf7, 0x04, 0x1f, 0x5f, 0x68, 0xbf, 0x4e, 0x41, 0x41, 0xa3,
-	0x27, 0xd4, 0xf5, 0xfe, 0x27, 0x42, 0x5c, 0x41, 0xcd, 0x85, 0x7c, 0x0e, 0xb9, 0xb3, 0xe3, 0x21,
-	0x5a, 0xbb, 0x67, 0x7d, 0x45, 0xb2, 0x68, 0x2f, 0x47, 0x8a, 0xf6, 0x25, 0x2c, 0xc5, 0xd2, 0xcb,
-	0x62, 0xfd, 0x05, 0xcc, 0x04, 0xd0, 0x3b, 0x5b, 0xe2, 0x45, 0x3d, 0xcc, 0x50, 0xe8, 0x33, 0xf8,
-	0x66, 0x72, 0x4b, 0x20, 0xaf, 0xe2, 0xf5, 0x78, 0xe4, 0x8e, 0x7a, 0xe1, 0x67, 0x68, 0xc3, 0x9c,
-	0x8c, 0xdc, 0x20, 0x41, 0x14, 0x34, 0x31, 0x1d, 0xad, 0xc9, 0x2a, 0x93, 0x5c, 0x44, 0xc6, 0x83,
-	0xd5, 0x09, 0x06, 0xeb, 0x72, 0xc5, 0xed, 0x83, 0x73, 0x8b, 0xdb, 0xa4, 0xe8, 0xf5, 0x8b, 0xda,
-	0xd9, 0x30, 0xdf, 0x55, 0xaa, 0xa7, 0x47, 0x97, 0xa8, 0x9e, 0x08, 0xae, 0x24, 0xf2, 0xfb, 0x55,
-	0x93, 0x13, 0x1c, 0xb4, 0xbc, 0x22, 0x4c, 0x2a, 0x21, 0x66, 0xa2, 0xd7, 0x8c, 0x8c, 0x54, 0x38,
-	0xeb, 0x74, 0xf8, 0x5a, 0x32, 0xfe, 0xb4, 0x96, 0x36, 0xd4, 0xc4, 0xe5, 0xca, 0x19, 0xc4, 0x40,
-	0x8c, 0x23, 0x14, 0x64, 0x55, 0xc0, 0x2d, 0xe2, 0xb5, 0x38, 0x38, 0x59, 0x01, 0x30, 0xc8, 0x9f,
-	0x0d, 0x42, 0x45, 0x31, 0x69, 0x14, 0xb3, 0x31, 0x37, 0x9d, 0xea, 0xc2, 0x22, 0x37, 0x70, 0x37,
-	0x2a, 0x6f, 0x5b, 0x70, 0x6e, 0x80, 0x58, 0x45, 0xee, 0x11, 0xe4, 0xeb, 0x9e, 0x4b, 0xf5, 0x4e,
-	0x4d, 0x6f, 0xbd, 0xa4, 0x1e, 0x3b, 0xe8, 0x79, 0x38, 0x1f, 0x9a, 0x2e, 0x69, 0x38, 0xe8, 0x79,
-	0x89, 0xcb, 0x73, 0xe8, 0x76, 0x0a, 0x77, 0x44, 0x71, 0x45, 0xcd, 0x13, 0xaa, 0x80, 0xaa, 0xf6,
-	0x39, 0xd7, 0x2d, 0x51, 0xfc, 0xaa, 0x4d, 0x86, 0x3e, 0x4c, 0xe1, 0x63, 0x98, 0x51, 0x30, 0x5b,
-	0xc7, 0xba, 0xdd, 0xa6, 0x3b, 0x27, 0xd4, 0xf6, 0x92, 0xc3, 0x50, 0x0c, 0x21, 0x05, 0xba, 0x08,
-	0xb0, 0x43, 0x98, 0xee, 0x4f, 0x92, 0xfc, 0x8a, 0x15, 0x7e, 0xb3, 0x88, 0x86, 0x90, 0x90, 0xf8,
-	0x25, 0xaf, 0xa2, 0x25, 0xe7, 0xa9, 0x01, 0x05, 0x59, 0xa9, 0x05, 0xbf, 0xa9, 0xc4, 0xdd, 0x1a,
-	0x97, 0xe2, 0x1a, 0xc9, 0x8a, 0xa0, 0x28, 0x91, 0xfe, 0x84, 0x84, 0x2e, 0xa1, 0xf9, 0x16, 0x96,
-	0xba, 0x83, 0xe8, 0xb1, 0xba, 0x83, 0xa0, 0x11, 0xdd, 0x21, 0x50, 0xa9, 0xdb, 0x80, 0x82, 0xcc,
-	0x44, 0x5f, 0x4f, 0xf7, 0x0d, 0x41, 0x71, 0xbd, 0x74, 0x0e, 0x05, 0x17, 0xff, 0x19, 0x14, 0x64,
-	0xb9, 0x95, 0xa4, 0x3f, 0x69, 0x15, 0xa9, 0x21, 0xac, 0x9d, 0x37, 0x84, 0x86, 0xdc, 0x22, 0xa1,
-	0xef, 0x4e, 0x17, 0x6e, 0x91, 0xa0, 0xb7, 0x7f, 0xf9, 0x88, 0xf1, 0xd1, 0xc7, 0x3d, 0x51, 0xcc,
-	0x8b, 0xa3, 0x8d, 0xc5, 0x17, 0xf3, 0xd2, 0xe6, 0x57, 0x88, 0xb8, 0x98, 0x7c, 0xb0, 0x31, 0xfc,
-	0x01, 0x4c, 0xfa, 0x77, 0xe2, 0x21, 0xb0, 0x62, 0xd2, 0xe5, 0x3a, 0xb9, 0x29, 0x60, 0x57, 0xc8,
-	0x3b, 0xb1, 0xb0, 0x8c, 0x5a, 0x47, 0x0d, 0x8f, 0xa3, 0x3d, 0x13, 0xf5, 0x57, 0xe8, 0xd3, 0xc2,
-	0xe0, 0x6b, 0x73, 0xe4, 0xdb, 0x43, 0x34, 0x07, 0xf1, 0xcd, 0xc3, 0xfd, 0xd4, 0x6b, 0xb1, 0xd9,
-	0xc4, 0xcf, 0x01, 0xfd, 0xa5, 0x97, 0x80, 0x1c, 0xff, 0x01, 0x22, 0x1a, 0x8f, 0x30, 0xb6, 0x88,
-	0x32, 0x32, 0xc8, 0xd6, 0xcd, 0x4e, 0xcf, 0xf2, 0xd7, 0x20, 0x2e, 0xf5, 0x03, 0x11, 0x6c, 0xd6,
-	0xe8, 0x8f, 0x7b, 0x94, 0x79, 0x49, 0x35, 0x45, 0xe4, 0xc2, 0x23, 0x1c, 0x23, 0x85, 0xd4, 0xe0,
-	0x48, 0x7c, 0x41, 0x6e, 0xc1, 0x54, 0xff, 0xc3, 0x01, 0x5e, 0xf3, 0x09, 0x23, 0x9f, 0x14, 0x4a,
-	0xc9, 0x26, 0x32, 0xb4, 0x69, 0xc2, 0x8c, 0xe3, 0xb6, 0x45, 0xb6, 0x69, 0x39, 0xae, 0xa1, 0x5c,
-	0x37, 0x33, 0xf2, 0xfa, 0xb9, 0x26, 0x3e, 0xa3, 0xff, 0xe8, 0xfd, 0xb6, 0xe9, 0x1d, 0xf7, 0x9a,
-	0x5c, 0x75, 0xc5, 0xf7, 0x54, 0xff, 0xce, 0xb0, 0xae, 0xbe, 0xb4, 0xb7, 0x1d, 0xd5, 0xf0, 0xc7,
-	0xe1, 0xf9, 0x03, 0x1f, 0xec, 0x59, 0xf0, 0x2a, 0xbb, 0x36, 0x5c, 0x1b, 0xa9, 0x8d, 0xd6, 0xc6,
-	0x6a, 0xe3, 0xb5, 0x89, 0xda, 0x64, 0x73, 0x5c, 0x74, 0xdc, 0xf8, 0x4f, 0x00, 0x00, 0x00, 0xff,
-	0xff, 0xf2, 0x60, 0x62, 0xf5, 0x25, 0x21, 0x00, 0x00,
+	// 2493 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xc4, 0x5a, 0x5b, 0x73, 0x1b, 0x49,
+	0x15, 0xb6, 0x7c, 0xf7, 0x91, 0x64, 0x49, 0x2d, 0x5f, 0xb4, 0xb2, 0x9d, 0x38, 0xbd, 0xb9, 0xe1,
+	0x5d, 0x4b, 0x49, 0xbc, 0x49, 0x41, 0x96, 0xad, 0x25, 0x96, 0x1d, 0x23, 0xe2, 0xd8, 0x62, 0x14,
+	0x27, 0xc0, 0x6e, 0x4a, 0x35, 0xd2, 0xb4, 0xe5, 0xa9, 0x1d, 0xcd, 0x88, 0xe9, 0x96, 0x82, 0x2b,
+	0x6c, 0x41, 0x85, 0x6b, 0xf1, 0xc8, 0xfe, 0x05, 0x9e, 0x28, 0xfe, 0x4a, 0x9e, 0xf8, 0x03, 0x14,
+	0xc5, 0x03, 0x8f, 0x3c, 0x05, 0x1e, 0xa9, 0xbe, 0x8c, 0x34, 0xa3, 0x99, 0xf1, 0x65, 0xd9, 0x2a,
+	0x9e, 0x62, 0xf5, 0x39, 0xf3, 0x7d, 0x5f, 0x9f, 0x3e, 0xdd, 0xe7, 0x4c, 0x4f, 0xa0, 0xd8, 0x77,
+	0x2c, 0x76, 0xa2, 0x37, 0xba, 0xae, 0xc3, 0x1c, 0x5a, 0x96, 0xbf, 0x4a, 0xe2, 0x17, 0x9a, 0x96,
+	0xbf, 0x8a, 0xab, 0x6d, 0xc7, 0x69, 0x5b, 0xa4, 0xac, 0x77, 0xcd, 0xb2, 0x6e, 0xdb, 0x0e, 0xd3,
+	0x99, 0xe9, 0xd8, 0x54, 0x7a, 0x15, 0x57, 0x94, 0x55, 0xfc, 0x6a, 0xf6, 0x8e, 0xcb, 0xa4, 0xd3,
+	0x65, 0xa7, 0xca, 0x58, 0x08, 0xc2, 0x77, 0x08, 0x53, 0xe0, 0xc5, 0x11, 0xe2, 0x96, 0xd3, 0xe9,
+	0x38, 0x76, 0xb4, 0xed, 0x84, 0xe8, 0x16, 0x3b, 0x51, 0x36, 0x1c, 0xb4, 0x59, 0x4e, 0xdb, 0x6c,
+	0xe9, 0x56, 0xc3, 0x20, 0x7d, 0xb3, 0x45, 0xa2, 0x9f, 0x0f, 0xd8, 0x56, 0x82, 0x36, 0xdd, 0xd0,
+	0xbb, 0x8c, 0xb8, 0xca, 0x78, 0x35, 0x68, 0x74, 0xba, 0xc4, 0x3e, 0xb6, 0x9c, 0x57, 0x8d, 0xbb,
+	0x5b, 0x31, 0x0e, 0x9d, 0x96, 0xd9, 0xe8, 0x98, 0xcd, 0x86, 0xd1, 0x54, 0x0e, 0xd7, 0x22, 0x1c,
+	0x74, 0x4b, 0x77, 0x3b, 0x43, 0x97, 0xf5, 0xa0, 0xcb, 0xa9, 0x6e, 0xb7, 0x1b, 0x4e, 0xd7, 0x17,
+	0x52, 0xfc, 0xa7, 0x04, 0x24, 0x77, 0x84, 0xe8, 0x3d, 0xd7, 0xe9, 0x75, 0xd1, 0x22, 0x8c, 0x9b,
+	0x46, 0x21, 0xb1, 0x9e, 0xb8, 0x3d, 0xb7, 0x3d, 0xf5, 0xcf, 0x77, 0x6f, 0xd7, 0x12, 0xda, 0xb8,
+	0x69, 0xa0, 0x2a, 0x64, 0x82, 0xd3, 0xa7, 0x85, 0xf1, 0xf5, 0x89, 0xdb, 0xc9, 0x7b, 0x8b, 0x25,
+	0xb5, 0x8e, 0xfb, 0xd2, 0x2c, 0xb1, 0xb6, 0xe7, 0xfe, 0xfe, 0xee, 0xed, 0xda, 0x24, 0xc7, 0xd2,
+	0xe6, 0x2d, 0xbf, 0x85, 0xa2, 0x2d, 0x98, 0xf1, 0x20, 0x26, 0x04, 0xc4, 0xbc, 0x07, 0x11, 0x7e,
+	0xd6, 0xf3, 0xc4, 0xdf, 0x81, 0x94, 0x4f, 0x25, 0x45, 0xdf, 0x82, 0x29, 0x93, 0x91, 0x0e, 0x2d,
+	0x24, 0x04, 0x44, 0x3e, 0x08, 0x21, 0x9c, 0x34, 0xe9, 0x81, 0x7f, 0x01, 0xe8, 0x11, 0x8f, 0xca,
+	0x63, 0xd3, 0x62, 0xc4, 0xd5, 0x7a, 0x16, 0x79, 0x42, 0x4e, 0x71, 0x33, 0x6a, 0x14, 0x4d, 0x73,
+	0xd6, 0xec, 0x18, 0x9a, 0x85, 0x49, 0x76, 0xda, 0x25, 0xd9, 0x04, 0x4a, 0xc1, 0x2c, 0x25, 0x7d,
+	0xe2, 0x9a, 0xec, 0x34, 0x3b, 0x8e, 0x32, 0x90, 0x74, 0x09, 0x75, 0x7a, 0x6e, 0x8b, 0x34, 0x4c,
+	0x23, 0x3b, 0xc1, 0xcd, 0x2d, 0x9d, 0x91, 0xb6, 0xe3, 0x9e, 0x66, 0x27, 0x51, 0x1a, 0xe6, 0xa4,
+	0x60, 0x6e, 0x9c, 0x7a, 0x38, 0xf5, 0xaf, 0x77, 0x6f, 0xd7, 0xc6, 0xf0, 0x09, 0x64, 0x46, 0xa8,
+	0xd0, 0xa7, 0x30, 0xf1, 0x05, 0x39, 0x15, 0x61, 0x9e, 0xbf, 0xb7, 0xe9, 0x89, 0x0f, 0x0b, 0x8a,
+	0x18, 0xd2, 0xf8, 0x93, 0x68, 0x01, 0xa6, 0xfa, 0xba, 0xd5, 0x23, 0x85, 0x71, 0xbe, 0x52, 0x9a,
+	0xfc, 0x81, 0xeb, 0x90, 0xf4, 0x3d, 0x10, 0xb7, 0x96, 0x9b, 0x30, 0xe5, 0xf6, 0xac, 0xc1, 0x0a,
+	0x2e, 0xc7, 0xd0, 0x6b, 0xd2, 0x0b, 0x7f, 0x02, 0x29, 0x9f, 0x85, 0xa2, 0x4d, 0x98, 0x39, 0x96,
+	0x7f, 0x8e, 0x06, 0xdf, 0x0f, 0xe0, 0xf9, 0x60, 0x17, 0x52, 0x15, 0xc7, 0x25, 0x55, 0x9b, 0x32,
+	0xdd, 0x6e, 0x11, 0x74, 0x13, 0x92, 0xa6, 0xfa, 0xbb, 0x31, 0xaa, 0x0e, 0x3c, 0x4b, 0xd5, 0x40,
+	0x5b, 0x30, 0x2d, 0x37, 0xa3, 0x98, 0x62, 0xf2, 0xde, 0x82, 0xc7, 0xf2, 0x7d, 0x31, 0x5a, 0x67,
+	0x3a, 0xeb, 0xd1, 0xed, 0x29, 0x9e, 0x2b, 0x63, 0x9a, 0x72, 0x7d, 0x38, 0xf5, 0x1f, 0x8e, 0x83,
+	0xb7, 0x21, 0xed, 0xe7, 0xa4, 0x68, 0x23, 0x98, 0x2e, 0x03, 0x2c, 0xbf, 0x97, 0xca, 0x17, 0x0f,
+	0xe3, 0x6f, 0x93, 0x30, 0xfd, 0x5c, 0x78, 0xa1, 0xab, 0x30, 0xd3, 0x27, 0x2e, 0x35, 0x1d, 0x3b,
+	0x28, 0xd7, 0x1b, 0x45, 0x0f, 0x60, 0x56, 0x6d, 0x6e, 0x2f, 0xa8, 0x99, 0x41, 0x4c, 0xe4, 0xb8,
+	0x3f, 0xa9, 0x07, 0xbe, 0x51, 0xbb, 0x6a, 0xe2, 0x7f, 0xdf, 0x55, 0x93, 0x17, 0xdd, 0x55, 0xe8,
+	0x7b, 0x90, 0x52, 0xf9, 0xca, 0xb3, 0x9d, 0x16, 0xa6, 0xc4, 0x93, 0x28, 0xf8, 0xe4, 0xb3, 0xd3,
+	0x6e, 0xe0, 0xe9, 0xa4, 0x31, 0x18, 0xa6, 0xa8, 0x02, 0x69, 0x85, 0xd0, 0x16, 0x1b, 0xb3, 0x30,
+	0x1d, 0xbb, 0x1f, 0xfd, 0x18, 0x8a, 0x56, 0x6d, 0xe6, 0x0a, 0xa4, 0xe5, 0xb9, 0xe5, 0xe5, 0xd5,
+	0x4c, 0x6c, 0x5e, 0x05, 0x40, 0x74, 0x7f, 0x5a, 0xfe, 0x10, 0x72, 0xc3, 0x23, 0x52, 0x67, 0x7a,
+	0x53, 0xa7, 0xa4, 0xb0, 0xaa, 0x80, 0xb8, 0xa5, 0xf4, 0xd4, 0x6c, 0x4a, 0x39, 0x3b, 0x3a, 0xd3,
+	0xb7, 0xb3, 0x1c, 0x28, 0xe9, 0xdb, 0xb0, 0x5a, 0x86, 0x7b, 0x71, 0x27, 0xf5, 0x34, 0x7a, 0x01,
+	0x79, 0xff, 0xa1, 0xea, 0x81, 0xae, 0xa9, 0x25, 0x12, 0xa0, 0x42, 0xdb, 0x99, 0xb0, 0x42, 0x96,
+	0x74, 0x53, 0x08, 0x5e, 0x8a, 0xfd, 0x25, 0x01, 0xd9, 0x3a, 0xb1, 0x8e, 0x9f, 0x11, 0xca, 0x34,
+	0x42, 0xbb, 0x8e, 0x4d, 0xf9, 0xd1, 0x30, 0xed, 0x12, 0xda, 0xb3, 0x98, 0x3a, 0x1d, 0x6e, 0x79,
+	0x51, 0x18, 0xf5, 0xf4, 0x0f, 0xf4, 0x2c, 0xa6, 0xa9, 0xc7, 0x70, 0x0d, 0xe6, 0x83, 0x16, 0x94,
+	0x84, 0x99, 0xfa, 0x51, 0xa5, 0xb2, 0x5b, 0xaf, 0x67, 0xc7, 0xf8, 0x8f, 0xc7, 0x8f, 0xaa, 0xfb,
+	0x47, 0xda, 0x6e, 0x36, 0x81, 0x72, 0x90, 0x3e, 0x38, 0x7c, 0xd6, 0xa8, 0x1f, 0xd5, 0x6a, 0x87,
+	0xda, 0xb3, 0xdd, 0x9d, 0xec, 0x38, 0x1f, 0x3a, 0x3a, 0x78, 0x72, 0x70, 0xf8, 0xe2, 0xa0, 0xb1,
+	0xab, 0x69, 0x87, 0x5a, 0x76, 0xc2, 0x3b, 0xc7, 0x0e, 0x21, 0x77, 0x78, 0xfc, 0xa8, 0x4d, 0x6c,
+	0x56, 0xef, 0x35, 0x69, 0xcb, 0x35, 0x9b, 0xc4, 0x45, 0x6b, 0x00, 0xce, 0xb1, 0xce, 0x07, 0x07,
+	0xbb, 0x59, 0x9b, 0x53, 0x23, 0x55, 0x03, 0xad, 0xc0, 0x9c, 0x2a, 0x41, 0xa6, 0xa1, 0xce, 0xaa,
+	0x59, 0x39, 0x50, 0x35, 0xf0, 0xc7, 0x00, 0x4f, 0x49, 0xa7, 0x49, 0x5c, 0x7a, 0x62, 0x76, 0x39,
+	0x92, 0xc8, 0xa1, 0x86, 0xad, 0x77, 0x88, 0x87, 0x24, 0x46, 0x0e, 0xf4, 0x0e, 0x41, 0xf3, 0xe2,
+	0x30, 0x93, 0x10, 0xe3, 0xa6, 0x81, 0x77, 0x21, 0xf5, 0xd8, 0x72, 0x5e, 0x3d, 0x25, 0x4c, 0xe7,
+	0x2b, 0x83, 0xee, 0xc3, 0x74, 0x87, 0xf8, 0x4e, 0xa5, 0xb5, 0x92, 0xbf, 0xa4, 0x3a, 0xc7, 0xdd,
+	0x86, 0x30, 0x37, 0x5a, 0x8e, 0x7d, 0x6c, 0xb6, 0x35, 0xe5, 0x7c, 0xef, 0xcd, 0x1d, 0x48, 0xcb,
+	0x6d, 0x5e, 0x27, 0x2e, 0x5f, 0x32, 0xa4, 0xc1, 0xfc, 0x51, 0xd7, 0xd0, 0x19, 0xd9, 0x77, 0xda,
+	0xfb, 0xa4, 0x4f, 0x2c, 0x94, 0x29, 0xa9, 0x96, 0x61, 0xdf, 0x69, 0xb7, 0x4d, 0xbb, 0x5d, 0x5c,
+	0x2a, 0xc9, 0x46, 0xa4, 0xe4, 0x35, 0x22, 0xa5, 0x5d, 0xde, 0x88, 0xe0, 0xe5, 0x37, 0x7f, 0xfd,
+	0xc7, 0x57, 0xe3, 0x39, 0x9c, 0x12, 0xfd, 0x4b, 0xff, 0x2e, 0x6f, 0x19, 0xe8, 0xc3, 0xc4, 0x06,
+	0xaa, 0x41, 0x6a, 0x8f, 0x30, 0x0f, 0x90, 0xa2, 0xc2, 0x08, 0x62, 0xc5, 0xe9, 0x74, 0x1d, 0x9b,
+	0xd8, 0xac, 0x98, 0x1d, 0xb1, 0x50, 0xbc, 0x20, 0x40, 0xe7, 0x51, 0x00, 0x14, 0xbd, 0x80, 0xf4,
+	0x1e, 0x61, 0xbe, 0xf0, 0xc5, 0x68, 0x2a, 0x0e, 0x76, 0xf3, 0xd0, 0x17, 0x17, 0x05, 0xe4, 0x02,
+	0x42, 0x1e, 0x64, 0x67, 0x88, 0xf3, 0x12, 0xb2, 0x72, 0xfa, 0x3e, 0xec, 0x08, 0x8c, 0xd8, 0x18,
+	0xac, 0x09, 0xec, 0x65, 0x1c, 0x81, 0xcd, 0x23, 0xb1, 0x03, 0x73, 0x7b, 0x84, 0xa9, 0x83, 0x35,
+	0x4e, 0xf3, 0xe0, 0xec, 0x92, 0x7e, 0x38, 0x23, 0x30, 0xe7, 0xd0, 0x8c, 0xc2, 0x44, 0x3d, 0xc8,
+	0xed, 0x9b, 0x94, 0x05, 0x0f, 0xf9, 0x38, 0xb4, 0xc5, 0xa8, 0xd3, 0x9e, 0xe2, 0xbb, 0x7f, 0xf8,
+	0xf7, 0xdb, 0xb5, 0x19, 0x55, 0x18, 0xc4, 0xdf, 0x48, 0xfe, 0x2d, 0xc8, 0xf2, 0x28, 0xe7, 0x4d,
+	0xc0, 0x1c, 0x30, 0xd4, 0x21, 0xb3, 0x47, 0x02, 0xac, 0x08, 0xbc, 0xf5, 0xaa, 0xee, 0x14, 0x23,
+	0xcb, 0x0a, 0xbe, 0x22, 0xf0, 0x0a, 0x68, 0x29, 0x84, 0x57, 0x7e, 0x6d, 0x1a, 0x5f, 0x22, 0x1d,
+	0x52, 0x7c, 0x2e, 0x8f, 0xbc, 0xa2, 0x10, 0x37, 0x8d, 0xec, 0x48, 0x49, 0xa1, 0xf8, 0x16, 0x57,
+	0x0d, 0xc3, 0xda, 0x23, 0x88, 0x10, 0xca, 0x7a, 0x44, 0x83, 0x3a, 0xf3, 0x1a, 0x10, 0xa7, 0xd8,
+	0x0f, 0x96, 0x8c, 0x38, 0xa2, 0xa5, 0xc8, 0xe2, 0x43, 0xf1, 0x7d, 0x4e, 0x97, 0x0b, 0x95, 0x2c,
+	0xc1, 0xfa, 0x1e, 0x5a, 0xf6, 0xa5, 0xa7, 0xdf, 0x8c, 0x3e, 0x83, 0xac, 0xcc, 0xfd, 0x21, 0x56,
+	0x20, 0x6a, 0xd1, 0xb5, 0x0e, 0x5f, 0x17, 0xb8, 0x57, 0xd0, 0x6a, 0x0c, 0xae, 0x0c, 0x9e, 0x0b,
+	0x4b, 0xa1, 0x99, 0xd5, 0x1c, 0x97, 0xd1, 0xe8, 0x85, 0x51, 0x7e, 0xc2, 0x03, 0x3f, 0x50, 0x09,
+	0xd0, 0xe5, 0xbf, 0x04, 0xdb, 0x75, 0x84, 0xcf, 0x62, 0x2b, 0x0b, 0x4f, 0xf4, 0xab, 0x04, 0x2c,
+	0x8c, 0xce, 0x88, 0x23, 0xa2, 0xc5, 0x08, 0x9a, 0xaa, 0x51, 0xcc, 0x47, 0x0c, 0xe3, 0x4f, 0x39,
+	0xf9, 0x34, 0x4c, 0x72, 0x48, 0xc1, 0x5d, 0x42, 0x1f, 0x9e, 0xcf, 0x5d, 0x7e, 0xcd, 0xff, 0x69,
+	0xf0, 0x99, 0xff, 0x26, 0x01, 0xcb, 0xbb, 0xb6, 0xde, 0xb4, 0xc8, 0x85, 0x85, 0xc4, 0x6d, 0xd9,
+	0x8f, 0x85, 0x80, 0xfb, 0x78, 0xeb, 0x32, 0x02, 0xca, 0x44, 0x90, 0xa3, 0xdf, 0x25, 0xa0, 0xb0,
+	0x63, 0xd2, 0x6f, 0x44, 0xc8, 0x77, 0x85, 0x90, 0x07, 0xf8, 0xa3, 0x4b, 0x09, 0x31, 0x24, 0x3b,
+	0xfa, 0x79, 0x44, 0x2e, 0xf0, 0x12, 0x11, 0xcc, 0x05, 0x14, 0xa8, 0x0b, 0xc2, 0x8e, 0xb7, 0x55,
+	0x26, 0xf0, 0xd1, 0xf0, 0x51, 0x70, 0x5e, 0x56, 0x88, 0xa7, 0x78, 0x56, 0xac, 0x0e, 0xea, 0x46,
+	0x50, 0xc0, 0x33, 0x21, 0x6f, 0x35, 0x44, 0x2c, 0xc6, 0xe5, 0x33, 0xb1, 0x21, 0xd9, 0x14, 0x12,
+	0x6e, 0xe1, 0x0b, 0x48, 0xe0, 0xc7, 0xeb, 0xaf, 0x13, 0xb0, 0x16, 0xa1, 0xe2, 0x29, 0x2f, 0x76,
+	0x52, 0xc6, 0x4a, 0x40, 0x86, 0x30, 0x3c, 0x75, 0x8c, 0x73, 0x54, 0x94, 0x84, 0x8a, 0xdb, 0xf8,
+	0xfd, 0x33, 0x55, 0xc8, 0x92, 0xca, 0x65, 0xfc, 0x32, 0x01, 0xcb, 0xa1, 0xb5, 0x10, 0x5c, 0xc1,
+	0xc5, 0xc8, 0x87, 0xc5, 0x50, 0xbc, 0xc3, 0x57, 0x60, 0xd6, 0x2b, 0xe7, 0xa1, 0xe5, 0xb8, 0x81,
+	0x2e, 0xa2, 0x02, 0xfd, 0x31, 0x01, 0x2b, 0x91, 0xe9, 0xa0, 0x9a, 0x4e, 0xbf, 0x8c, 0xe5, 0xd0,
+	0xd2, 0x48, 0x27, 0x7c, 0xc0, 0xd9, 0xd3, 0x90, 0x14, 0x26, 0xd9, 0xe1, 0x86, 0xf4, 0x6c, 0xa0,
+	0xdb, 0xe7, 0xae, 0x8d, 0x7a, 0x16, 0x7d, 0x95, 0x80, 0x6b, 0x31, 0x49, 0x22, 0x18, 0xe5, 0x12,
+	0x5d, 0x8b, 0x96, 0x73, 0x91, 0x74, 0xd9, 0x12, 0x92, 0x36, 0xf1, 0x85, 0x25, 0xf1, 0xd5, 0x7a,
+	0x09, 0x49, 0x1e, 0xa9, 0xf3, 0xea, 0x42, 0x26, 0xd8, 0xd4, 0x53, 0x7c, 0x83, 0xc7, 0x62, 0x6e,
+	0xf0, 0xe2, 0x21, 0x9b, 0x1f, 0x94, 0xf1, 0xa8, 0xbd, 0x02, 0x60, 0x40, 0x7a, 0x08, 0x5f, 0x35,
+	0xe2, 0x09, 0x92, 0xc3, 0x25, 0xa1, 0xb8, 0xc4, 0xc1, 0x45, 0xa3, 0x7f, 0x56, 0x6d, 0x96, 0x1c,
+	0xa6, 0x41, 0xd1, 0x11, 0x64, 0x35, 0xd2, 0x72, 0xec, 0x96, 0x69, 0x11, 0x6f, 0x26, 0x7e, 0xc0,
+	0xd8, 0x90, 0xad, 0x0a, 0xcc, 0x25, 0x1c, 0xc6, 0xe4, 0xb1, 0xd9, 0x15, 0xfd, 0x4a, 0x44, 0xd9,
+	0x1a, 0x79, 0xbf, 0xf2, 0x60, 0xd0, 0xc2, 0xc8, 0xf4, 0x65, 0x9d, 0xfa, 0x01, 0xa4, 0x2a, 0x2e,
+	0xd1, 0x99, 0x92, 0x86, 0x46, 0x9e, 0x0e, 0xa1, 0xa9, 0x0e, 0x0d, 0x8f, 0x06, 0x93, 0x4b, 0x7a,
+	0x01, 0x29, 0x79, 0xf0, 0x47, 0xa8, 0x8a, 0x9b, 0xe4, 0xfb, 0x02, 0x6f, 0x0d, 0xaf, 0x44, 0xa9,
+	0xf3, 0x8e, 0xf2, 0x1f, 0x43, 0x5a, 0x9d, 0xe4, 0x97, 0x40, 0x56, 0x75, 0x1a, 0xaf, 0x46, 0x22,
+	0x7b, 0x67, 0xf3, 0x0b, 0x48, 0x69, 0xa4, 0xe9, 0x38, 0xec, 0x1b, 0xd3, 0xec, 0x0a, 0x38, 0x0e,
+	0xbc, 0x43, 0x2c, 0xc2, 0xbe, 0x46, 0x30, 0x36, 0xa2, 0x81, 0x0d, 0x01, 0x87, 0x7a, 0x90, 0xde,
+	0x71, 0x5e, 0xd9, 0x96, 0xa3, 0x1b, 0xd5, 0x8e, 0xde, 0x26, 0xc3, 0x5a, 0x26, 0x7e, 0x7a, 0xb6,
+	0xe2, 0xa2, 0x47, 0x78, 0xd8, 0x25, 0xae, 0xb8, 0xad, 0xe4, 0x2f, 0x68, 0xf8, 0x81, 0xe0, 0xb8,
+	0x83, 0x3f, 0x88, 0xe4, 0x30, 0x39, 0x44, 0xc3, 0x50, 0x18, 0xb4, 0xfc, 0x9a, 0xbf, 0xf3, 0x7c,
+	0xc9, 0x17, 0xf7, 0x4d, 0x02, 0x96, 0xf6, 0x08, 0x0b, 0x70, 0xc8, 0xbb, 0x8e, 0x78, 0x01, 0x51,
+	0xc3, 0xf8, 0xa1, 0x10, 0xf0, 0x11, 0xba, 0x77, 0x09, 0x01, 0x65, 0x2a, 0x99, 0x7a, 0xa2, 0x65,
+	0x0b, 0xe0, 0x5d, 0x92, 0x5d, 0x9d, 0x43, 0xe8, 0x32, 0xd3, 0x47, 0xc7, 0xb2, 0x4d, 0x0d, 0x20,
+	0xd1, 0x91, 0x15, 0x8d, 0x62, 0xa3, 0xf8, 0x43, 0x41, 0x77, 0x13, 0x5d, 0xbf, 0x08, 0x1d, 0xfa,
+	0x19, 0xe4, 0x2b, 0xbc, 0x01, 0xb7, 0x2e, 0x38, 0xc3, 0xc8, 0x05, 0x56, 0x33, 0xdc, 0xb8, 0xd4,
+	0x0c, 0x7f, 0x9f, 0x80, 0xfc, 0xa3, 0x16, 0x33, 0xfb, 0x3a, 0x23, 0x82, 0x45, 0x1e, 0xe7, 0x97,
+	0xa4, 0xae, 0x08, 0xea, 0x4f, 0xf0, 0xb7, 0x2f, 0xb3, 0xb4, 0x72, 0xb8, 0x27, 0xf8, 0x78, 0xa2,
+	0xfd, 0x36, 0x01, 0x39, 0x8d, 0xf4, 0x89, 0xcb, 0xfe, 0x2f, 0x42, 0x5c, 0x41, 0xcd, 0x85, 0x7c,
+	0x0e, 0x99, 0x61, 0x79, 0x08, 0xf7, 0xee, 0x69, 0x4f, 0x91, 0x6c, 0xda, 0x4b, 0xa1, 0xa6, 0x7d,
+	0x15, 0x15, 0x23, 0xe9, 0x65, 0xb3, 0xfe, 0x12, 0xf2, 0x3e, 0xf4, 0x4e, 0x45, 0xbc, 0xfd, 0x07,
+	0x19, 0x72, 0x03, 0x06, 0xcf, 0x8c, 0x6f, 0x09, 0xe4, 0x6b, 0xe8, 0x6a, 0x34, 0x72, 0x47, 0xdd,
+	0x22, 0x50, 0x64, 0xc3, 0xa2, 0x8c, 0xdc, 0x28, 0x41, 0x18, 0x34, 0xf6, 0x38, 0xda, 0x90, 0x5d,
+	0x26, 0x3e, 0x8f, 0x8c, 0x07, 0xab, 0xe3, 0x0f, 0xd6, 0xc5, 0x9a, 0xdb, 0x87, 0x67, 0x36, 0xb7,
+	0x71, 0xd1, 0x1b, 0x34, 0xb5, 0x0b, 0x41, 0xbe, 0xcb, 0x74, 0x4f, 0x8f, 0x2f, 0xd0, 0x3d, 0x61,
+	0xb4, 0x1e, 0xcb, 0xef, 0x75, 0x4d, 0x8e, 0x7f, 0xd2, 0xf2, 0xde, 0x31, 0xae, 0x85, 0xc8, 0x87,
+	0xef, 0x2e, 0x29, 0x2e, 0x73, 0xd6, 0xf9, 0xe0, 0x5d, 0x67, 0x74, 0xb5, 0x96, 0x36, 0xa4, 0x89,
+	0xcb, 0x95, 0x21, 0xc4, 0x48, 0x8c, 0x43, 0x14, 0xf8, 0x9a, 0x80, 0x5b, 0x41, 0xef, 0x45, 0xc1,
+	0xc9, 0x0e, 0x80, 0x42, 0x76, 0x38, 0x09, 0x15, 0xc5, 0xb8, 0x59, 0x2c, 0x44, 0x5c, 0x9f, 0xaa,
+	0x0b, 0x8b, 0xcc, 0xc8, 0x85, 0xab, 0xbc, 0x6d, 0x41, 0x8b, 0x23, 0xc4, 0x2a, 0x72, 0x8f, 0x21,
+	0x5b, 0x67, 0x2e, 0xd1, 0x3b, 0x35, 0xbd, 0xf5, 0x05, 0x61, 0xf4, 0xb0, 0xc7, 0xd0, 0x52, 0x60,
+	0xb9, 0xa4, 0xe1, 0xb0, 0xc7, 0x62, 0xd3, 0x73, 0xec, 0x76, 0x02, 0xed, 0x8a, 0xe6, 0x8a, 0x98,
+	0x7d, 0xa2, 0x80, 0xaa, 0xf6, 0x19, 0xd7, 0x2d, 0x61, 0xfc, 0xaa, 0x8d, 0xc7, 0xee, 0x24, 0xd0,
+	0x13, 0xc8, 0x2b, 0x98, 0xca, 0x89, 0x6e, 0xb7, 0xc9, 0x6e, 0x9f, 0xd8, 0x2c, 0x3e, 0x0c, 0x85,
+	0x00, 0x92, 0xef, 0x11, 0x01, 0x76, 0x04, 0xf3, 0x83, 0x45, 0x92, 0xdf, 0xae, 0x82, 0x6f, 0x16,
+	0xe1, 0x10, 0x62, 0x1c, 0x9d, 0xf2, 0x2a, 0x5a, 0x72, 0x9d, 0x1a, 0x90, 0x93, 0x9d, 0x9a, 0xff,
+	0x4b, 0x4a, 0xd4, 0x55, 0x74, 0x31, 0x6a, 0x10, 0xaf, 0x0b, 0x8a, 0x22, 0x1e, 0x2c, 0x48, 0xe0,
+	0x66, 0x9b, 0x6f, 0x61, 0xa9, 0xdb, 0x8f, 0x1e, 0xa9, 0xdb, 0x0f, 0x1a, 0xd2, 0x1d, 0x00, 0x95,
+	0xba, 0x0d, 0xc8, 0xc9, 0x93, 0xe8, 0xeb, 0xe9, 0xbe, 0x21, 0x28, 0xae, 0x16, 0xcf, 0xa0, 0xe0,
+	0xe2, 0x3f, 0x83, 0x9c, 0x6c, 0xb7, 0xe2, 0xf4, 0xc7, 0x65, 0x91, 0x9a, 0xc2, 0xc6, 0x59, 0x53,
+	0x68, 0xc8, 0x2d, 0x12, 0xf8, 0xda, 0x74, 0xee, 0x16, 0xf1, 0x7b, 0x7b, 0x97, 0x8f, 0x28, 0x3a,
+	0xfa, 0x68, 0x5f, 0x34, 0xf3, 0xa2, 0xb4, 0xd1, 0xe8, 0x66, 0x5e, 0xda, 0xbc, 0x0e, 0x11, 0xad,
+	0xc4, 0x17, 0x36, 0x8a, 0x7e, 0x04, 0xb3, 0xde, 0x45, 0x7b, 0x00, 0xac, 0x10, 0x77, 0x63, 0x8f,
+	0x6f, 0x0a, 0xd8, 0x75, 0x7c, 0x25, 0x12, 0x96, 0x12, 0xeb, 0xb8, 0xc1, 0x38, 0xda, 0x73, 0xd1,
+	0x7f, 0x05, 0xbe, 0x57, 0x8c, 0xbe, 0x36, 0x87, 0x3e, 0x68, 0x84, 0xcf, 0x20, 0xbe, 0x79, 0xb8,
+	0x9f, 0x7a, 0x2d, 0x36, 0x9b, 0xe8, 0x73, 0x40, 0x5e, 0xea, 0xc5, 0x20, 0x47, 0x7f, 0xd5, 0x08,
+	0xc7, 0x23, 0x88, 0x2d, 0xa2, 0x8c, 0x28, 0xa4, 0xeb, 0x66, 0xa7, 0x67, 0x79, 0x39, 0x88, 0x56,
+	0x07, 0x81, 0xf0, 0x0f, 0x6b, 0xe4, 0xa7, 0x3d, 0x42, 0x59, 0x5c, 0x4f, 0x11, 0xba, 0xf0, 0x08,
+	0xc6, 0x48, 0x21, 0x35, 0x38, 0x12, 0x4f, 0xc8, 0x0a, 0xcc, 0x0d, 0xbe, 0x46, 0xa0, 0xf7, 0x3c,
+	0xc2, 0xd0, 0x77, 0x8a, 0x62, 0xbc, 0x09, 0x8f, 0x6d, 0x9b, 0x90, 0x77, 0xdc, 0xb6, 0x38, 0x6d,
+	0x5a, 0x8e, 0x6b, 0x28, 0xd7, 0xed, 0x94, 0xbc, 0x7e, 0xae, 0x89, 0x8f, 0xe7, 0x3f, 0xf9, 0xa0,
+	0x6d, 0xb2, 0x93, 0x5e, 0x93, 0xab, 0x2e, 0x7b, 0x9e, 0xea, 0x3f, 0x31, 0x6c, 0xaa, 0xef, 0xeb,
+	0x6d, 0x47, 0x0d, 0xfc, 0x79, 0x7c, 0xe9, 0xd0, 0x03, 0x7b, 0xee, 0xbf, 0xca, 0xae, 0x8d, 0xd7,
+	0x26, 0x6a, 0x93, 0xb5, 0xa9, 0xda, 0x74, 0x6d, 0xa6, 0x36, 0xdb, 0x9c, 0x16, 0x0f, 0x6e, 0xfd,
+	0x37, 0x00, 0x00, 0xff, 0xff, 0x23, 0x82, 0x59, 0x22, 0x1b, 0x21, 0x00, 0x00,
 }
 
 // Reference imports to suppress errors if they are not otherwise used.
@@ -2203,7 +2163,8 @@
 // For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
 type VolthaServiceClient interface {
 	// Get more information on a given physical device
-	UpdateLogLevel(ctx context.Context, in *Logging, opts ...grpc.CallOption) (*empty.Empty, error)
+	UpdateLogLevel(ctx context.Context, in *common.Logging, opts ...grpc.CallOption) (*empty.Empty, error)
+	GetLogLevels(ctx context.Context, in *common.LoggingComponent, opts ...grpc.CallOption) (*common.Loggings, error)
 	// Get the membership group of a Voltha Core
 	GetMembership(ctx context.Context, in *empty.Empty, opts ...grpc.CallOption) (*Membership, error)
 	// Set the membership group of a Voltha Core
@@ -2336,7 +2297,7 @@
 	return &volthaServiceClient{cc}
 }
 
-func (c *volthaServiceClient) UpdateLogLevel(ctx context.Context, in *Logging, opts ...grpc.CallOption) (*empty.Empty, error) {
+func (c *volthaServiceClient) UpdateLogLevel(ctx context.Context, in *common.Logging, opts ...grpc.CallOption) (*empty.Empty, error) {
 	out := new(empty.Empty)
 	err := c.cc.Invoke(ctx, "/voltha.VolthaService/UpdateLogLevel", in, out, opts...)
 	if err != nil {
@@ -2345,6 +2306,15 @@
 	return out, nil
 }
 
+func (c *volthaServiceClient) GetLogLevels(ctx context.Context, in *common.LoggingComponent, opts ...grpc.CallOption) (*common.Loggings, error) {
+	out := new(common.Loggings)
+	err := c.cc.Invoke(ctx, "/voltha.VolthaService/GetLogLevels", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
 func (c *volthaServiceClient) GetMembership(ctx context.Context, in *empty.Empty, opts ...grpc.CallOption) (*Membership, error) {
 	out := new(Membership)
 	err := c.cc.Invoke(ctx, "/voltha.VolthaService/GetMembership", in, out, opts...)
@@ -2932,7 +2902,8 @@
 // VolthaServiceServer is the server API for VolthaService service.
 type VolthaServiceServer interface {
 	// Get more information on a given physical device
-	UpdateLogLevel(context.Context, *Logging) (*empty.Empty, error)
+	UpdateLogLevel(context.Context, *common.Logging) (*empty.Empty, error)
+	GetLogLevels(context.Context, *common.LoggingComponent) (*common.Loggings, error)
 	// Get the membership group of a Voltha Core
 	GetMembership(context.Context, *empty.Empty) (*Membership, error)
 	// Set the membership group of a Voltha Core
@@ -3062,7 +3033,7 @@
 }
 
 func _VolthaService_UpdateLogLevel_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
-	in := new(Logging)
+	in := new(common.Logging)
 	if err := dec(in); err != nil {
 		return nil, err
 	}
@@ -3074,7 +3045,25 @@
 		FullMethod: "/voltha.VolthaService/UpdateLogLevel",
 	}
 	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
-		return srv.(VolthaServiceServer).UpdateLogLevel(ctx, req.(*Logging))
+		return srv.(VolthaServiceServer).UpdateLogLevel(ctx, req.(*common.Logging))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _VolthaService_GetLogLevels_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(common.LoggingComponent)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(VolthaServiceServer).GetLogLevels(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/voltha.VolthaService/GetLogLevels",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(VolthaServiceServer).GetLogLevels(ctx, req.(*common.LoggingComponent))
 	}
 	return interceptor(ctx, in, info, handler)
 }
@@ -4128,6 +4117,10 @@
 			Handler:    _VolthaService_UpdateLogLevel_Handler,
 		},
 		{
+			MethodName: "GetLogLevels",
+			Handler:    _VolthaService_GetLogLevels_Handler,
+		},
+		{
 			MethodName: "GetMembership",
 			Handler:    _VolthaService_GetMembership_Handler,
 		},
diff --git a/vendor/github.com/opencord/voltha-protos/protos/voltha_protos/afrouter.proto b/vendor/github.com/opencord/voltha-protos/protos/voltha_protos/afrouter.proto
index 2f2ec00..c10a00f 100644
--- a/vendor/github.com/opencord/voltha-protos/protos/voltha_protos/afrouter.proto
+++ b/vendor/github.com/opencord/voltha-protos/protos/voltha_protos/afrouter.proto
@@ -6,10 +6,15 @@
 
 package afrouter;
 
+// For logging
+import "voltha_protos/common.proto";
+
 service Configuration {
-    	rpc SetConnection (Conn) returns (Result) {}
+   	rpc SetConnection (Conn) returns (Result) {}
 	rpc SetAffinity(Affinity) returns (Result) {}
 	rpc GetGoroutineCount(Empty) returns (Count) {}
+	rpc UpdateLogLevel(common.Logging) returns (Empty) {}
+	rpc GetLogLevels(common.LoggingComponent) returns (common.Loggings) {}
 }
 
 message Result {
@@ -43,3 +48,4 @@
 	string backend = 4;
 	string id = 5;
 }
+
diff --git a/vendor/github.com/opencord/voltha-protos/protos/voltha_protos/common.proto b/vendor/github.com/opencord/voltha-protos/protos/voltha_protos/common.proto
index 880c4ad..f5e68c4 100644
--- a/vendor/github.com/opencord/voltha-protos/protos/voltha_protos/common.proto
+++ b/vendor/github.com/opencord/voltha-protos/protos/voltha_protos/common.proto
@@ -34,6 +34,22 @@
     }
 }
 
+message Logging {
+    common.LogLevel.LogLevel level = 1;
+    string package_name = 2;
+    string component_name = 3;
+}
+
+// For GetLogLevels(), select component to query
+message LoggingComponent {
+    string component_name = 1;
+}
+
+// For returning multiple log levels
+message Loggings {
+	repeated Logging items = 1;
+}
+
 message AdminState {
     option (yang_child_rule) = MOVE_TO_PARENT_LEVEL;
 
diff --git a/vendor/github.com/opencord/voltha-protos/protos/voltha_protos/voltha.proto b/vendor/github.com/opencord/voltha-protos/protos/voltha_protos/voltha.proto
index 75199aa..5e45033 100644
--- a/vendor/github.com/opencord/voltha-protos/protos/voltha_protos/voltha.proto
+++ b/vendor/github.com/opencord/voltha-protos/protos/voltha_protos/voltha.proto
@@ -70,11 +70,6 @@
     repeated AlarmFilter filters = 1;
 }
 
-message Logging {
-    common.LogLevel.LogLevel level = 1;
-    string package_name = 2;
-}
-
 // CoreInstance represents a core instance.  It is data held in memory when a core
 // is running.  This data is not persistent.
 message CoreInstance {
@@ -163,7 +158,14 @@
 service VolthaService {
 
     // Get more information on a given physical device
-    rpc UpdateLogLevel(Logging) returns(google.protobuf.Empty) {
+    rpc UpdateLogLevel(common.Logging) returns(google.protobuf.Empty) {
+        option (google.api.http) = {
+            post: "/api/v1/logs"
+            body: "*"
+        };
+    }
+
+    rpc GetLogLevels(common.LoggingComponent) returns (common.Loggings) {
         option (google.api.http) = {
             get: "/api/v1/logs"
         };