VOL-2463 : Enable and disable pon/NNI port Core changes

Change-Id: I7671daf47bad2e2a1ba183d458941e033d529ced
diff --git a/common/core/northbound/grpc/default_api_handler.go b/common/core/northbound/grpc/default_api_handler.go
index 38f98fe..f74a1f6 100644
--- a/common/core/northbound/grpc/default_api_handler.go
+++ b/common/core/northbound/grpc/default_api_handler.go
@@ -385,3 +385,12 @@
 	log.Debugw("ListLogicalDeviceMeters-unimplemented", log.Fields{"id": id})
 	return nil, nil
 }
+
+func (handler *DefaultAPIHandler) EnablePort(ctx context.Context, port *voltha.Port) (*empty.Empty, error) {
+	log.Debugw("EnablePort-unimplemented", log.Fields{"id": port.DeviceId})
+	return nil, nil
+}
+func (handler *DefaultAPIHandler) DisablePort(ctx context.Context, port *voltha.Port) (*empty.Empty, error) {
+	log.Debugw("DisablePort-unimplemented", log.Fields{"id": port.DeviceId})
+	return nil, nil
+}
diff --git a/go.mod b/go.mod
index 4b3f386..c63b854 100644
--- a/go.mod
+++ b/go.mod
@@ -7,8 +7,8 @@
 	github.com/golang/protobuf v1.3.2
 	github.com/google/uuid v1.1.1
 	github.com/gyuho/goraph v0.0.0-20160328020532-d460590d53a9
-	github.com/opencord/voltha-lib-go/v3 v3.0.5
-	github.com/opencord/voltha-protos/v3 v3.2.1
+	github.com/opencord/voltha-lib-go/v3 v3.0.6
+	github.com/opencord/voltha-protos/v3 v3.2.2
 	github.com/phayes/freeport v0.0.0-20180830031419-95f893ade6f2
 	github.com/stretchr/testify v1.4.0
 	google.golang.org/grpc v1.24.0
diff --git a/go.sum b/go.sum
index d77665d..be10954 100644
--- a/go.sum
+++ b/go.sum
@@ -192,10 +192,12 @@
 github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
 github.com/onsi/gomega v1.4.2 h1:3mYCb7aPxS/RU7TI1y4rkEn1oKmPRjNJLNEXgw7MH2I=
 github.com/onsi/gomega v1.4.2/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY=
-github.com/opencord/voltha-lib-go/v3 v3.0.5 h1:xeHpxUPg3DEFORhGWKhyk/b3+kKnNAfGeoeNkJqPjyU=
-github.com/opencord/voltha-lib-go/v3 v3.0.5/go.mod h1:l/AgBlYqXEiHLHS6NR654Q7m5BfX5YVnrpykf7kOmGw=
+github.com/opencord/voltha-lib-go/v3 v3.0.6 h1:J58Pquledy94urZ5Wp+COXkS9VZTIi6TbaHdVNVCT/Y=
+github.com/opencord/voltha-lib-go/v3 v3.0.6/go.mod h1:l/AgBlYqXEiHLHS6NR654Q7m5BfX5YVnrpykf7kOmGw=
 github.com/opencord/voltha-protos/v3 v3.2.1 h1:5CAxtWzHqDMNItBRklDkXN5YwE9b6vuCXr5UKTAuJBg=
 github.com/opencord/voltha-protos/v3 v3.2.1/go.mod h1:RIGHt7b80BHpHh3ceodknh0DxUjUHCWSbYbZqRx7Og0=
+github.com/opencord/voltha-protos/v3 v3.2.2 h1:Fdg2T6xtUjVZPBWV636/mMH6lYggalQ2e7uFPoOhZDc=
+github.com/opencord/voltha-protos/v3 v3.2.2/go.mod h1:RIGHt7b80BHpHh3ceodknh0DxUjUHCWSbYbZqRx7Og0=
 github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=
 github.com/pascaldekloe/goe v0.1.0 h1:cBOtyMzM9HTpWjXfbbunk26uA6nG3a8n06Wieeh0MwY=
 github.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=
diff --git a/rw_core/core/adapter_proxy.go b/rw_core/core/adapter_proxy.go
index ef767bd..b7798ad 100755
--- a/rw_core/core/adapter_proxy.go
+++ b/rw_core/core/adapter_proxy.go
@@ -564,3 +564,51 @@
 	log.Debugw("SimulateAlarm-response", log.Fields{"replyTopic": replyToTopic, "deviceid": device.Id, "success": success})
 	return unPackResponse(rpc, device.Id, success, result)
 }
+
+func (ap *AdapterProxy) disablePort(ctx context.Context, device *voltha.Device, port *voltha.Port) error {
+	log.Debugw("disablePort", log.Fields{"device-id": device.Id, "port-no": port.PortNo})
+	rpc := "disable_port"
+	deviceID := &ic.StrType{Val: device.Id}
+	toTopic := ap.getAdapterTopic(device.Adapter)
+	// Use a device specific topic to send the request.  The adapter handling the device creates a device
+	// specific topic
+	args := make([]*kafka.KVArg, 2)
+	args[0] = &kafka.KVArg{
+		Key:   "deviceId",
+		Value: deviceID,
+	}
+
+	args[1] = &kafka.KVArg{
+		Key:   "port",
+		Value: port,
+	}
+
+	replyToTopic := ap.getCoreTopic()
+	success, result := ap.kafkaICProxy.InvokeRPC(ctx, rpc, &toTopic, &replyToTopic, true, device.Id, args...)
+	log.Debugw("disablePort-response", log.Fields{"device-id": device.Id, "port-no": port.PortNo, "success": success})
+	return unPackResponse(rpc, device.Id, success, result)
+}
+
+func (ap *AdapterProxy) enablePort(ctx context.Context, device *voltha.Device, port *voltha.Port) error {
+	log.Debugw("enablePort", log.Fields{"device-id": device.Id, "port-no": port.PortNo})
+	rpc := "enable_port"
+	deviceID := &ic.StrType{Val: device.Id}
+	toTopic := ap.getAdapterTopic(device.Adapter)
+	// Use a device specific topic to send the request.  The adapter handling the device creates a device
+	// specific topic
+	args := make([]*kafka.KVArg, 2)
+	args[0] = &kafka.KVArg{
+		Key:   "deviceId",
+		Value: deviceID,
+	}
+
+	args[1] = &kafka.KVArg{
+		Key:   "port",
+		Value: port,
+	}
+
+	replyToTopic := ap.getCoreTopic()
+	success, result := ap.kafkaICProxy.InvokeRPC(ctx, rpc, &toTopic, &replyToTopic, true, device.Id, args...)
+	log.Debugw("enablePort-response", log.Fields{"device-id": device.Id, "port-no": port.PortNo, "success": success})
+	return unPackResponse(rpc, device.Id, success, result)
+}
diff --git a/rw_core/core/device_agent.go b/rw_core/core/device_agent.go
index 913f9e4..7dd5062 100755
--- a/rw_core/core/device_agent.go
+++ b/rw_core/core/device_agent.go
@@ -1167,28 +1167,13 @@
 	return agent.updateDeviceInStoreWithoutLock(ctx, cloned, false, "")
 }
 
-func (agent *DeviceAgent) enablePorts(ctx context.Context) error {
-	agent.lockDevice.Lock()
-	defer agent.lockDevice.Unlock()
-
-	cloned := agent.getDeviceWithoutLock()
-
-	for _, port := range cloned.Ports {
-		port.AdminState = voltha.AdminState_ENABLED
-		port.OperStatus = voltha.OperStatus_ACTIVE
-	}
-	// Store the device
-	return agent.updateDeviceInStoreWithoutLock(ctx, cloned, false, "")
-}
-
-func (agent *DeviceAgent) disablePorts(ctx context.Context) error {
-	log.Debugw("disablePorts", log.Fields{"deviceid": agent.deviceID})
+func (agent *DeviceAgent) updatePortsOperState(ctx context.Context, operStatus voltha.OperStatus_Types) error {
+	log.Debugw("updatePortsOperState", log.Fields{"device-id": agent.deviceID})
 	agent.lockDevice.Lock()
 	defer agent.lockDevice.Unlock()
 	cloned := agent.getDeviceWithoutLock()
 	for _, port := range cloned.Ports {
-		port.AdminState = voltha.AdminState_DISABLED
-		port.OperStatus = voltha.OperStatus_UNKNOWN
+		port.OperStatus = operStatus
 	}
 	// Store the device
 	return agent.updateDeviceInStoreWithoutLock(ctx, cloned, false, "")
@@ -1208,12 +1193,6 @@
 	for _, port := range cloned.Ports {
 		if port.Type == portType && port.PortNo == portNo {
 			port.OperStatus = operStatus
-			// Set the admin status to ENABLED if the operational status is ACTIVE
-			// TODO: Set by northbound system?
-			if operStatus == voltha.OperStatus_ACTIVE {
-				port.AdminState = voltha.AdminState_ENABLED
-			}
-			break
 		}
 	}
 	log.Debugw("portStatusUpdate", log.Fields{"deviceId": cloned.Id})
@@ -1263,11 +1242,8 @@
 		}
 	}
 	cp := proto.Clone(port).(*voltha.Port)
-	// Set the admin state of the port to ENABLE if the operational state is ACTIVE
-	// TODO: Set by northbound system?
-	if cp.OperStatus == voltha.OperStatus_ACTIVE {
-		cp.AdminState = voltha.AdminState_ENABLED
-	}
+	// Set the admin state of the port to ENABLE
+	cp.AdminState = voltha.AdminState_ENABLED
 	cloned.Ports = append(cloned.Ports, cp)
 	// Store the device
 	return agent.updateDeviceInStoreWithoutLock(ctx, cloned, false, "")
@@ -1394,3 +1370,73 @@
 	// Store the device
 	return agent.updateDeviceInStoreWithoutLock(ctx, cloned, false, "")
 }
+
+func (agent *DeviceAgent) disablePort(ctx context.Context, Port *voltha.Port) error {
+	var cp *voltha.Port
+	agent.lockDevice.Lock()
+	defer agent.lockDevice.Unlock()
+	log.Debugw("disablePort", log.Fields{"device-id": agent.deviceID, "port-no": Port.PortNo})
+	// Get the most up to date the device info
+	device := agent.getDeviceWithoutLock()
+	for _, port := range device.Ports {
+		if port.PortNo == Port.PortNo {
+			port.AdminState = voltha.AdminState_DISABLED
+			cp = proto.Clone(port).(*voltha.Port)
+			break
+
+		}
+	}
+	if cp == nil {
+		return status.Errorf(codes.InvalidArgument, "%v", Port.PortNo)
+	}
+
+	if cp.Type != voltha.Port_PON_OLT {
+		return status.Errorf(codes.InvalidArgument, "Disabling of Port Type %v unimplemented", cp.Type)
+	}
+	// Store the device
+	if err := agent.updateDeviceInStoreWithoutLock(ctx, device, false, ""); err != nil {
+		log.Debugw("updateDeviceInStoreWithoutLock error ", log.Fields{"device-id": agent.deviceID, "port-no": Port.PortNo, "error": err})
+		return err
+	}
+	//send request to adapter
+	if err := agent.adapterProxy.disablePort(ctx, device, cp); err != nil {
+		log.Debugw("DisablePort-error", log.Fields{"device-id": agent.deviceID, "port-no": Port.PortNo, "error": err})
+		return err
+	}
+	return nil
+}
+
+func (agent *DeviceAgent) enablePort(ctx context.Context, Port *voltha.Port) error {
+	var cp *voltha.Port
+	agent.lockDevice.Lock()
+	defer agent.lockDevice.Unlock()
+	log.Debugw("enablePort", log.Fields{"device-id": agent.deviceID, "port-no": Port.PortNo})
+	// Get the most up to date the device info
+	device := agent.getDeviceWithoutLock()
+	for _, port := range device.Ports {
+		if port.PortNo == Port.PortNo {
+			port.AdminState = voltha.AdminState_ENABLED
+			cp = proto.Clone(port).(*voltha.Port)
+			break
+		}
+	}
+
+	if cp == nil {
+		return status.Errorf(codes.InvalidArgument, "%v", Port.PortNo)
+	}
+
+	if cp.Type != voltha.Port_PON_OLT {
+		return status.Errorf(codes.InvalidArgument, "Enabling of Port Type %v unimplemented", cp.Type)
+	}
+	// Store the device
+	if err := agent.updateDeviceInStoreWithoutLock(ctx, device, false, ""); err != nil {
+		log.Debugw("updateDeviceInStoreWithoutLock error ", log.Fields{"device-id": agent.deviceID, "port-no": Port.PortNo, "error": err})
+		return err
+	}
+	//send request to adapter
+	if err := agent.adapterProxy.enablePort(ctx, device, cp); err != nil {
+		log.Debugw("EnablePort-error", log.Fields{"device-id": agent.deviceID, "port-no": Port.PortNo, "error": err})
+		return err
+	}
+	return nil
+}
diff --git a/rw_core/core/device_manager.go b/rw_core/core/device_manager.go
index 6d87143..df94772 100755
--- a/rw_core/core/device_manager.go
+++ b/rw_core/core/device_manager.go
@@ -918,19 +918,16 @@
 func (dMgr *DeviceManager) updatePortsState(ctx context.Context, deviceID string, state voltha.OperStatus_Types) error {
 	log.Debugw("updatePortsState", log.Fields{"deviceid": deviceID})
 
-	var adminState voltha.AdminState_Types
 	if agent := dMgr.getDeviceAgent(ctx, deviceID); agent != nil {
 		switch state {
 		case voltha.OperStatus_ACTIVE:
-			adminState = voltha.AdminState_ENABLED
-			if err := agent.enablePorts(ctx); err != nil {
-				log.Warnw("enable-all-ports-failed", log.Fields{"deviceId": deviceID, "error": err})
+			if err := agent.updatePortsOperState(ctx, state); err != nil {
+				log.Warnw("updatePortsOperState-failed", log.Fields{"deviceId": deviceID, "error": err})
 				return err
 			}
 		case voltha.OperStatus_UNKNOWN:
-			adminState = voltha.AdminState_DISABLED
-			if err := agent.disablePorts(ctx); err != nil {
-				log.Warnw("disable-all-ports-failed", log.Fields{"deviceId": deviceID, "error": err})
+			if err := agent.updatePortsOperState(ctx, state); err != nil {
+				log.Warnw("updatePortsOperState-failed", log.Fields{"deviceId": deviceID, "error": err})
 				return err
 			}
 		default:
@@ -942,7 +939,7 @@
 			log.Warnw("non-existent-device", log.Fields{"deviceId": deviceID, "error": err})
 			return err
 		}
-		if err := dMgr.logicalDeviceMgr.updatePortsState(ctx, device, adminState); err != nil {
+		if err := dMgr.logicalDeviceMgr.updatePortsState(ctx, device, state); err != nil {
 			log.Warnw("failed-updating-ports-state", log.Fields{"deviceId": deviceID, "error": err})
 			return err
 		}
@@ -1486,3 +1483,29 @@
 	}
 	return status.Errorf(codes.NotFound, "%s", deviceID)
 }
+
+func (dMgr *DeviceManager) enablePort(ctx context.Context, port *voltha.Port, ch chan interface{}) {
+	log.Debugw("enablePort", log.Fields{"device-id": port.DeviceId, "port-no": port.PortNo})
+	var res interface{}
+	if agent := dMgr.getDeviceAgent(ctx, port.DeviceId); agent != nil {
+		res = agent.enablePort(ctx, port)
+		log.Debugw("enablePort-result", log.Fields{"result": res})
+	} else {
+		res = status.Errorf(codes.NotFound, "%s", port.DeviceId)
+	}
+
+	sendResponse(ctx, ch, res)
+}
+
+func (dMgr *DeviceManager) disablePort(ctx context.Context, port *voltha.Port, ch chan interface{}) {
+	log.Debugw("disablePort", log.Fields{"device-id": port.DeviceId, "port-no": port.PortNo})
+	var res interface{}
+	if agent := dMgr.getDeviceAgent(ctx, port.DeviceId); agent != nil {
+		res = agent.disablePort(ctx, port)
+		log.Debugw("disablePort-result", log.Fields{"result": res})
+	} else {
+		res = status.Errorf(codes.NotFound, "%s", port.DeviceId)
+	}
+
+	sendResponse(ctx, ch, res)
+}
diff --git a/rw_core/core/grpc_nbi_api_handler.go b/rw_core/core/grpc_nbi_api_handler.go
index fd54a50..c0678a3 100755
--- a/rw_core/core/grpc_nbi_api_handler.go
+++ b/rw_core/core/grpc_nbi_api_handler.go
@@ -1216,3 +1216,44 @@
 func (handler *APIHandler) UpdateMembership(context.Context, *voltha.Membership) (*empty.Empty, error) {
 	return &empty.Empty{}, errors.New("UnImplemented")
 }
+
+func (handler *APIHandler) EnablePort(ctx context.Context, port *voltha.Port) (*empty.Empty, error) {
+	log.Debugw("EnablePort-request", log.Fields{"device-id": port.DeviceId, "port-no": port.PortNo})
+	if isTestMode(ctx) {
+		return &empty.Empty{}, nil
+	}
+
+	if handler.competeForTransaction() {
+		txn, err := handler.takeRequestOwnership(ctx, &utils.DeviceID{ID: port.DeviceId})
+		if err != nil {
+			return nil, err
+		}
+		defer txn.Close(ctx)
+	}
+
+	ch := make(chan interface{})
+	defer close(ch)
+	go handler.deviceMgr.enablePort(ctx, port, ch)
+	return waitForNilResponseOnSuccess(ctx, ch)
+}
+
+func (handler *APIHandler) DisablePort(ctx context.Context, port *voltha.Port) (*empty.Empty, error) {
+
+	log.Debugw("DisablePort-request", log.Fields{"device-id": port.DeviceId, "port-no": port.PortNo})
+	if isTestMode(ctx) {
+		return &empty.Empty{}, nil
+	}
+
+	if handler.competeForTransaction() {
+		txn, err := handler.takeRequestOwnership(ctx, &utils.DeviceID{ID: port.DeviceId})
+		if err != nil {
+			return nil, err
+		}
+		defer txn.Close(ctx)
+	}
+
+	ch := make(chan interface{})
+	defer close(ch)
+	go handler.deviceMgr.disablePort(ctx, port, ch)
+	return waitForNilResponseOnSuccess(ctx, ch)
+}
diff --git a/rw_core/core/grpc_nbi_api_handler_test.go b/rw_core/core/grpc_nbi_api_handler_test.go
index b0404c4..c143f42 100755
--- a/rw_core/core/grpc_nbi_api_handler_test.go
+++ b/rw_core/core/grpc_nbi_api_handler_test.go
@@ -517,6 +517,92 @@
 	err = waitUntilConditionForLogicalDevices(nb.maxTimeout, nbi, vlFunction)
 	assert.Nil(t, err)
 }
+func (nb *NBTest) testDisableAndEnablePort(t *testing.T, nbi *APIHandler) {
+	//Get an OLT device
+	var cp *voltha.Port
+	oltDevice, err := nb.getADevice(true, nbi)
+	assert.Nil(t, err)
+	assert.NotNil(t, oltDevice)
+
+	for _, cp = range oltDevice.Ports {
+		if cp.Type == voltha.Port_PON_OLT {
+			break
+		}
+
+	}
+	assert.NotNil(t, cp)
+	cp.DeviceId = oltDevice.Id
+
+	// Disable the NW Port of oltDevice
+	_, err = nbi.DisablePort(getContext(), cp)
+	assert.Nil(t, err)
+	// Wait for the olt device Port  to be disabled
+	var vdFunction isDeviceConditionSatisfied = func(device *voltha.Device) bool {
+		for _, port := range device.Ports {
+			if port.PortNo == cp.PortNo {
+				return port.AdminState == voltha.AdminState_DISABLED
+			}
+		}
+		return false
+	}
+	err = waitUntilDeviceReadiness(oltDevice.Id, nb.maxTimeout, vdFunction, nbi)
+	assert.Nil(t, err)
+	// Wait for the logical device to satisfy the expected condition
+	var vlFunction = func(ld *voltha.LogicalDevice) bool {
+		for _, lp := range ld.Ports {
+			if (lp.OfpPort.Config&^uint32(ofp.OfpPortConfig_OFPPC_PORT_DOWN) != lp.OfpPort.Config) ||
+				lp.OfpPort.State != uint32(ofp.OfpPortState_OFPPS_LIVE) {
+				return false
+			}
+		}
+		return true
+	}
+	err = waitUntilLogicalDeviceReadiness(oltDevice.Id, nb.maxTimeout, nbi, vlFunction)
+	assert.Nil(t, err)
+
+	// Enable the NW Port of oltDevice
+	_, err = nbi.EnablePort(getContext(), cp)
+	assert.Nil(t, err)
+
+	// Wait for the olt device Port to be enabled
+	vdFunction = func(device *voltha.Device) bool {
+		for _, port := range device.Ports {
+			if port.PortNo == cp.PortNo {
+				return port.AdminState == voltha.AdminState_ENABLED
+			}
+		}
+		return false
+	}
+	err = waitUntilDeviceReadiness(oltDevice.Id, nb.maxTimeout, vdFunction, nbi)
+	assert.Nil(t, err)
+	// Wait for the logical device to satisfy the expected condition
+	vlFunction = func(ld *voltha.LogicalDevice) bool {
+		for _, lp := range ld.Ports {
+			if (lp.OfpPort.Config&^uint32(ofp.OfpPortConfig_OFPPC_PORT_DOWN) != lp.OfpPort.Config) ||
+				lp.OfpPort.State != uint32(ofp.OfpPortState_OFPPS_LIVE) {
+				return false
+			}
+		}
+		return true
+	}
+	err = waitUntilLogicalDeviceReadiness(oltDevice.Id, nb.maxTimeout, nbi, vlFunction)
+	assert.Nil(t, err)
+
+	// Disable a non-PON port
+	for _, cp = range oltDevice.Ports {
+		if cp.Type != voltha.Port_PON_OLT {
+			break
+		}
+
+	}
+	assert.NotNil(t, cp)
+	cp.DeviceId = oltDevice.Id
+
+	// Disable the NW Port of oltDevice
+	_, err = nbi.DisablePort(getContext(), cp)
+	assert.NotNil(t, err)
+
+}
 
 func TestSuite1(t *testing.T) {
 	nb := newNBTest()
@@ -549,6 +635,8 @@
 
 		// 5. Test disable and ReEnable a root device
 		nb.testDisableAndReEnableRootDevice(t, nbi)
+		// 6. Test disable and Enable pon port of OLT device
+		nb.testDisableAndEnablePort(t, nbi)
 
 		// 6. Test disable and delete all devices
 		nb.testDisableAndDeleteAllDevice(t, nbi)
diff --git a/rw_core/core/logical_device_agent.go b/rw_core/core/logical_device_agent.go
index 80dcfd7..7274e9f 100644
--- a/rw_core/core/logical_device_agent.go
+++ b/rw_core/core/logical_device_agent.go
@@ -441,7 +441,7 @@
 }
 
 // updatePortsState updates the ports state related to the device
-func (agent *LogicalDeviceAgent) updatePortsState(ctx context.Context, device *voltha.Device, state voltha.AdminState_Types) error {
+func (agent *LogicalDeviceAgent) updatePortsState(ctx context.Context, device *voltha.Device, state voltha.OperStatus_Types) error {
 	log.Infow("updatePortsState-start", log.Fields{"logicalDeviceId": agent.logicalDeviceID})
 	agent.lockLogicalDevice.Lock()
 	defer agent.lockLogicalDevice.Unlock()
@@ -449,16 +449,14 @@
 	cloned := agent.getLogicalDeviceWithoutLock()
 	for _, lport := range cloned.Ports {
 		if lport.DeviceId == device.Id {
-			switch state {
-			case voltha.AdminState_ENABLED:
+			if state == voltha.OperStatus_ACTIVE {
 				lport.OfpPort.Config = lport.OfpPort.Config & ^uint32(ofp.OfpPortConfig_OFPPC_PORT_DOWN)
 				lport.OfpPort.State = uint32(ofp.OfpPortState_OFPPS_LIVE)
-			case voltha.AdminState_DISABLED:
+			} else {
 				lport.OfpPort.Config = lport.OfpPort.Config | uint32(ofp.OfpPortConfig_OFPPC_PORT_DOWN)
 				lport.OfpPort.State = uint32(ofp.OfpPortState_OFPPS_LINK_DOWN)
-			default:
-				log.Warnw("unsupported-state-change", log.Fields{"deviceId": device.Id, "state": state})
 			}
+
 		}
 	}
 	// Updating the logical device will trigger the poprt change events to be populated to the controller
diff --git a/rw_core/core/logical_device_manager.go b/rw_core/core/logical_device_manager.go
index 4026ba1..853404e 100644
--- a/rw_core/core/logical_device_manager.go
+++ b/rw_core/core/logical_device_manager.go
@@ -521,7 +521,7 @@
 	return nil
 }
 
-func (ldMgr *LogicalDeviceManager) updatePortsState(ctx context.Context, device *voltha.Device, state voltha.AdminState_Types) error {
+func (ldMgr *LogicalDeviceManager) updatePortsState(ctx context.Context, device *voltha.Device, state voltha.OperStatus_Types) error {
 	log.Debugw("updatePortsState", log.Fields{"deviceId": device.Id, "state": state, "current-data": device})
 
 	var ldID *string
diff --git a/rw_core/mocks/adapter.go b/rw_core/mocks/adapter.go
index 876ebea..28d06da 100644
--- a/rw_core/mocks/adapter.go
+++ b/rw_core/mocks/adapter.go
@@ -239,3 +239,13 @@
 func (ta *Adapter) Revert_image_update(device *voltha.Device, request *voltha.ImageDownload) (*voltha.ImageDownload, error) { // nolint
 	return nil, nil
 }
+
+// Enable_port -
+func (ta *Adapter) Enable_port(deviceId string, port *voltha.Port) error { //nolint
+	return nil
+}
+
+// Disable_port -
+func (ta *Adapter) Disable_port(deviceId string, port *voltha.Port) error { //nolint
+	return nil
+}
diff --git a/rw_core/mocks/adapter_olt.go b/rw_core/mocks/adapter_olt.go
index e7fed22..b9cef0c 100644
--- a/rw_core/mocks/adapter_olt.go
+++ b/rw_core/mocks/adapter_olt.go
@@ -229,3 +229,30 @@
 	}()
 	return nil
 }
+
+// Enable_port -
+func (oltA *OLTAdapter) Enable_port(deviceId string, Port *voltha.Port) error { //nolint
+	go func() {
+
+		if Port.Type == voltha.Port_PON_OLT {
+			if err := oltA.coreProxy.PortStateUpdate(context.TODO(), deviceId, voltha.Port_PON_OLT, Port.PortNo, voltha.OperStatus_ACTIVE); err != nil {
+				log.Fatalf("updating-ports-failed", log.Fields{"device-id": deviceId, "error": err})
+			}
+		}
+
+	}()
+	return nil
+}
+
+// Disable_port -
+func (oltA *OLTAdapter) Disable_port(deviceId string, Port *voltha.Port) error { //nolint
+	go func() {
+
+		if Port.Type == voltha.Port_PON_OLT {
+			if err := oltA.coreProxy.PortStateUpdate(context.TODO(), deviceId, voltha.Port_PON_OLT, Port.PortNo, voltha.OperStatus_DISCOVERED); err != nil {
+				log.Fatalf("updating-ports-failed", log.Fields{"device-id": deviceId, "error": err})
+			}
+		}
+	}()
+	return nil
+}
diff --git a/vendor/github.com/opencord/voltha-lib-go/v3/pkg/adapters/common/request_handler.go b/vendor/github.com/opencord/voltha-lib-go/v3/pkg/adapters/common/request_handler.go
index 414116b..78b8eb5 100644
--- a/vendor/github.com/opencord/voltha-lib-go/v3/pkg/adapters/common/request_handler.go
+++ b/vendor/github.com/opencord/voltha-lib-go/v3/pkg/adapters/common/request_handler.go
@@ -613,3 +613,48 @@
 func (rhp *RequestHandlerProxy) Revert_image_update(args []*ic.Argument) (*voltha.ImageDownload, error) {
 	return &voltha.ImageDownload{}, nil
 }
+
+func (rhp *RequestHandlerProxy) Enable_port(args []*ic.Argument) error {
+	logger.Debugw("enable_port", log.Fields{"args": args})
+	deviceId, port, err := rhp.getEnableDisableParams(args)
+	if err != nil {
+		logger.Warnw("enable_port", log.Fields{"args": args, "deviceId": deviceId, "port": port})
+		return err
+	}
+	return rhp.adapter.Enable_port(deviceId, port)
+}
+
+func (rhp *RequestHandlerProxy) Disable_port(args []*ic.Argument) error {
+	logger.Debugw("disable_port", log.Fields{"args": args})
+	deviceId, port, err := rhp.getEnableDisableParams(args)
+	if err != nil {
+		logger.Warnw("disable_port", log.Fields{"args": args, "deviceId": deviceId, "port": port})
+		return err
+	}
+	return rhp.adapter.Disable_port(deviceId, port)
+}
+
+func (rhp *RequestHandlerProxy) getEnableDisableParams(args []*ic.Argument) (string, *voltha.Port, error) {
+	logger.Debugw("getEnableDisableParams", log.Fields{"args": args})
+	if len(args) < 3 {
+		logger.Warn("invalid-number-of-args", log.Fields{"args": args})
+		return "", nil, errors.New("invalid-number-of-args")
+	}
+	deviceId := &ic.StrType{}
+	port := &voltha.Port{}
+	for _, arg := range args {
+		switch arg.Key {
+		case "deviceId":
+			if err := ptypes.UnmarshalAny(arg.Value, deviceId); err != nil {
+				logger.Warnw("cannot-unmarshal-device", log.Fields{"error": err})
+				return "", nil, err
+			}
+		case "port":
+			if err := ptypes.UnmarshalAny(arg.Value, port); err != nil {
+				logger.Warnw("cannot-unmarshal-port", log.Fields{"error": err})
+				return "", nil, err
+			}
+		}
+	}
+	return deviceId.Val, port, nil
+}
diff --git a/vendor/github.com/opencord/voltha-lib-go/v3/pkg/adapters/iAdapter.go b/vendor/github.com/opencord/voltha-lib-go/v3/pkg/adapters/iAdapter.go
index 3b86ac5..c0e44be 100644
--- a/vendor/github.com/opencord/voltha-lib-go/v3/pkg/adapters/iAdapter.go
+++ b/vendor/github.com/opencord/voltha-lib-go/v3/pkg/adapters/iAdapter.go
@@ -49,4 +49,6 @@
 	Cancel_image_download(device *voltha.Device, request *voltha.ImageDownload) (*voltha.ImageDownload, error)
 	Activate_image_update(device *voltha.Device, request *voltha.ImageDownload) (*voltha.ImageDownload, error)
 	Revert_image_update(device *voltha.Device, request *voltha.ImageDownload) (*voltha.ImageDownload, error)
+	Enable_port(deviceId string, port *voltha.Port) error
+	Disable_port(deviceId string, port *voltha.Port) error
 }
diff --git a/vendor/github.com/opencord/voltha-protos/v3/go/voltha/voltha.pb.go b/vendor/github.com/opencord/voltha-protos/v3/go/voltha/voltha.pb.go
index c2edc2d..f6512d6 100644
--- a/vendor/github.com/opencord/voltha-protos/v3/go/voltha/voltha.pb.go
+++ b/vendor/github.com/opencord/voltha-protos/v3/go/voltha/voltha.pb.go
@@ -2015,159 +2015,162 @@
 func init() { proto.RegisterFile("voltha_protos/voltha.proto", fileDescriptor_e084f1a60ce7016c) }
 
 var fileDescriptor_e084f1a60ce7016c = []byte{
-	// 2423 bytes of a gzipped FileDescriptorProto
-	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xc4, 0x99, 0xcb, 0x73, 0xdb, 0xc6,
-	0x19, 0xc0, 0x05, 0xea, 0xfd, 0x89, 0x94, 0xc8, 0xa5, 0x1e, 0x34, 0x25, 0xc5, 0xf6, 0xe6, 0x61,
-	0x55, 0x89, 0x48, 0xc7, 0x72, 0x3c, 0x6d, 0xdc, 0x4c, 0x23, 0x51, 0xb2, 0xca, 0x5a, 0x36, 0x59,
-	0xd0, 0xb2, 0xfb, 0x88, 0x87, 0x03, 0x12, 0x4b, 0x0a, 0x63, 0x10, 0x60, 0xb1, 0x4b, 0x39, 0x1a,
-	0x4f, 0x2e, 0xe9, 0x23, 0xbd, 0xe7, 0xde, 0x53, 0x3b, 0x9d, 0xe9, 0xff, 0x92, 0x53, 0x4f, 0xb9,
-	0x76, 0x7a, 0xe8, 0x5f, 0x90, 0x73, 0x67, 0x1f, 0x20, 0x01, 0x02, 0xd0, 0x23, 0xcd, 0x4c, 0x4f,
-	0x12, 0xf6, 0xfb, 0xf0, 0xfb, 0x1e, 0xbb, 0xfb, 0xed, 0x87, 0x25, 0x14, 0xcf, 0x5c, 0x9b, 0x9d,
-	0x1a, 0xcd, 0xbe, 0xe7, 0x32, 0x97, 0x96, 0xe5, 0x53, 0x49, 0x3c, 0xa1, 0x19, 0xf9, 0x54, 0xdc,
-	0xe8, 0xba, 0x6e, 0xd7, 0x26, 0x65, 0xa3, 0x6f, 0x95, 0x0d, 0xc7, 0x71, 0x99, 0xc1, 0x2c, 0xd7,
-	0xa1, 0x52, 0xab, 0xb8, 0xae, 0xa4, 0xe2, 0xa9, 0x35, 0xe8, 0x94, 0x49, 0xaf, 0xcf, 0xce, 0x95,
-	0xb0, 0x10, 0xc6, 0xf7, 0x08, 0x53, 0xf0, 0xe2, 0x98, 0xe1, 0xb6, 0xdb, 0xeb, 0xb9, 0x4e, 0xbc,
-	0xec, 0x94, 0x18, 0x36, 0x3b, 0x55, 0x32, 0x1c, 0x96, 0xd9, 0x6e, 0xd7, 0x6a, 0x1b, 0x76, 0xd3,
-	0x24, 0x67, 0x56, 0x9b, 0xc4, 0xbf, 0x1f, 0x92, 0xad, 0x87, 0x65, 0x86, 0x69, 0xf4, 0x19, 0xf1,
-	0x94, 0xf0, 0x66, 0x58, 0xe8, 0xf6, 0x89, 0xd3, 0xb1, 0xdd, 0xd7, 0xcd, 0x0f, 0x77, 0x13, 0x14,
-	0x7a, 0x6d, 0xab, 0xd9, 0xb3, 0x5a, 0x4d, 0xb3, 0xa5, 0x14, 0x6e, 0xc7, 0x28, 0x18, 0xb6, 0xe1,
-	0xf5, 0x86, 0x2a, 0xf8, 0xaf, 0x1a, 0x2c, 0x1c, 0x08, 0x97, 0x8e, 0x3c, 0x77, 0xd0, 0x47, 0x2b,
-	0x90, 0xb2, 0xcc, 0x82, 0x76, 0x4b, 0xdb, 0x9a, 0xdf, 0x9f, 0xfe, 0xcf, 0x77, 0xdf, 0x6c, 0x6a,
-	0x7a, 0xca, 0x32, 0x51, 0x15, 0x96, 0xc2, 0xc1, 0xd1, 0x42, 0xea, 0xd6, 0xe4, 0xd6, 0xc2, 0xbd,
-	0x95, 0x92, 0x9a, 0xa5, 0x63, 0x29, 0x96, 0xac, 0xfd, 0xf9, 0x7f, 0x7d, 0xf7, 0xcd, 0xe6, 0x14,
-	0x67, 0xe9, 0x8b, 0x76, 0x50, 0x42, 0xd1, 0x2e, 0xcc, 0xfa, 0x88, 0x49, 0x81, 0x58, 0xf4, 0x11,
-	0xd1, 0x77, 0x7d, 0x4d, 0xfc, 0x13, 0x48, 0x07, 0xbc, 0xa4, 0xe8, 0x47, 0x30, 0x6d, 0x31, 0xd2,
-	0xa3, 0x05, 0x4d, 0x20, 0xf2, 0x61, 0x84, 0x50, 0xd2, 0xa5, 0x06, 0xfe, 0x8b, 0x06, 0xe8, 0xf0,
-	0x8c, 0x38, 0xec, 0x91, 0x65, 0x33, 0xe2, 0xe9, 0x03, 0x9b, 0x3c, 0x26, 0xe7, 0xf8, 0x2b, 0x0d,
-	0xf2, 0x63, 0xc3, 0xcf, 0xce, 0xfb, 0x04, 0x2d, 0x02, 0x74, 0xc4, 0x48, 0xd3, 0xb0, 0xed, 0xec,
-	0x04, 0x4a, 0xc3, 0x5c, 0xdb, 0x60, 0xa4, 0xeb, 0x7a, 0xe7, 0x59, 0x0d, 0x65, 0x21, 0x4d, 0x07,
-	0xad, 0xe6, 0x70, 0x24, 0x85, 0x10, 0x2c, 0xbe, 0xea, 0x5b, 0x4d, 0xc2, 0x51, 0x4d, 0x76, 0xde,
-	0x27, 0xd9, 0x49, 0xb4, 0x02, 0xb9, 0xb6, 0xeb, 0x74, 0xac, 0x6e, 0x70, 0x78, 0x8a, 0x0f, 0xcb,
-	0x78, 0x82, 0xc3, 0xd3, 0xd8, 0x82, 0xa5, 0x31, 0x47, 0xd0, 0xa7, 0x30, 0xf9, 0x8a, 0x9c, 0x8b,
-	0x69, 0x58, 0xbc, 0x57, 0xf2, 0x83, 0x8b, 0x46, 0x51, 0x8a, 0x89, 0x40, 0xe7, 0xaf, 0xa2, 0x65,
-	0x98, 0x3e, 0x33, 0xec, 0x01, 0x29, 0xa4, 0xf8, 0x54, 0xea, 0xf2, 0x01, 0xff, 0x5d, 0x83, 0x85,
-	0xc0, 0x2b, 0x49, 0xb3, 0xbd, 0x0a, 0x33, 0xc4, 0x31, 0x5a, 0xb6, 0x7c, 0x7b, 0x4e, 0x57, 0x4f,
-	0x68, 0x1d, 0xe6, 0x55, 0x00, 0x96, 0x59, 0x98, 0x14, 0xe0, 0x39, 0x39, 0x50, 0x35, 0xd1, 0x26,
-	0xc0, 0x28, 0xac, 0xc2, 0x94, 0x90, 0xce, 0x8b, 0x11, 0x91, 0xd7, 0x1d, 0x98, 0xf6, 0x06, 0x36,
-	0xa1, 0x85, 0x69, 0x31, 0x63, 0x6b, 0x09, 0x41, 0xe9, 0x52, 0x0b, 0x7f, 0x02, 0xe9, 0x80, 0x84,
-	0xa2, 0x1d, 0x98, 0x95, 0xd3, 0x12, 0x99, 0xf2, 0x20, 0xc0, 0xd7, 0xc1, 0xaf, 0x20, 0x5d, 0x71,
-	0x3d, 0x52, 0x75, 0x28, 0x33, 0x9c, 0x36, 0x41, 0xef, 0xc1, 0x82, 0xa5, 0xfe, 0x6f, 0x8e, 0x47,
-	0x0c, 0xbe, 0xa4, 0x6a, 0xa2, 0x5d, 0x98, 0x91, 0x1b, 0x5c, 0x44, 0xbe, 0x70, 0x6f, 0xd9, 0xb7,
-	0xf2, 0x73, 0x31, 0xda, 0x60, 0x06, 0x1b, 0xd0, 0xfd, 0x69, 0xbe, 0x42, 0x27, 0x74, 0xa5, 0x8a,
-	0x1f, 0x42, 0x26, 0x68, 0x8c, 0xa2, 0xed, 0xf0, 0xea, 0x1c, 0x42, 0x82, 0x5a, 0xfe, 0xf2, 0xfc,
-	0x76, 0x0a, 0x66, 0x9e, 0x0b, 0x31, 0xba, 0x09, 0xb3, 0x67, 0xc4, 0xa3, 0x96, 0xeb, 0x84, 0x1d,
-	0xf4, 0x47, 0xd1, 0x03, 0x98, 0x53, 0x25, 0xc2, 0xdf, 0x7e, 0x4b, 0x3e, 0x7a, 0x4f, 0x8e, 0x07,
-	0x37, 0xcf, 0x50, 0x37, 0x6e, 0xf7, 0x4e, 0xfe, 0xef, 0xbb, 0x77, 0xea, 0xaa, 0xbb, 0x17, 0x7d,
-	0x0a, 0x69, 0xb5, 0x6e, 0xf8, 0xda, 0xf0, 0x97, 0x00, 0x0a, 0xbf, 0xc9, 0x57, 0x49, 0xf0, 0xed,
-	0x05, 0x73, 0x38, 0x4c, 0x51, 0x05, 0x32, 0x8a, 0xd0, 0x15, 0x05, 0xa0, 0x30, 0x93, 0xb8, 0xef,
-	0x83, 0x0c, 0x65, 0x56, 0x15, 0x8d, 0x0a, 0x64, 0xe4, 0x0a, 0xf5, 0x57, 0xd2, 0x6c, 0xe2, 0x4a,
-	0x0a, 0x41, 0x48, 0x70, 0x21, 0xfe, 0x12, 0x72, 0xa3, 0x42, 0x6b, 0x30, 0xa3, 0x65, 0x50, 0x52,
-	0xd8, 0x50, 0x20, 0x2e, 0x29, 0x3d, 0xb1, 0x5a, 0xd2, 0x9d, 0x03, 0x83, 0x19, 0xfb, 0x59, 0x0e,
-	0x5a, 0x08, 0x6c, 0x1c, 0x7d, 0x89, 0x6b, 0x71, 0x25, 0xf5, 0x36, 0x7a, 0x01, 0xf9, 0x60, 0x69,
-	0xf6, 0xa1, 0x9b, 0x6a, 0x8a, 0x04, 0x74, 0x8f, 0xcb, 0x2e, 0xc4, 0x0a, 0xb7, 0xa4, 0x9a, 0x22,
-	0xe0, 0xbf, 0x69, 0x90, 0x6d, 0x10, 0xbb, 0xf3, 0x8c, 0x50, 0xa6, 0x13, 0xda, 0x77, 0x1d, 0x4a,
-	0xd0, 0xcf, 0x60, 0xc6, 0x23, 0x74, 0x60, 0x33, 0x55, 0x5e, 0xee, 0xf8, 0xe1, 0x8f, 0x6b, 0x06,
-	0x07, 0x06, 0x36, 0xd3, 0xd5, 0x6b, 0xb8, 0x0e, 0x8b, 0x61, 0x09, 0x5a, 0x80, 0xd9, 0xc6, 0x49,
-	0xa5, 0x72, 0xd8, 0x68, 0x64, 0x27, 0xf8, 0xc3, 0xa3, 0xbd, 0xea, 0xf1, 0x89, 0x7e, 0x98, 0xd5,
-	0x50, 0x0e, 0x32, 0x4f, 0x6b, 0xcf, 0x9a, 0x8d, 0x93, 0x7a, 0xbd, 0xa6, 0x3f, 0x3b, 0x3c, 0xc8,
-	0xa6, 0xf8, 0xd0, 0xc9, 0xd3, 0xc7, 0x4f, 0x6b, 0x2f, 0x9e, 0x36, 0x0f, 0x75, 0xbd, 0xa6, 0x67,
-	0x27, 0x71, 0x0d, 0x72, 0xb5, 0xce, 0x5e, 0x97, 0x38, 0xac, 0x31, 0x68, 0xd1, 0xb6, 0x67, 0xb5,
-	0x88, 0xc7, 0xeb, 0x89, 0xdb, 0x31, 0xf8, 0xe0, 0x70, 0xc7, 0xea, 0xf3, 0x6a, 0xa4, 0x6a, 0xf2,
-	0x5a, 0xa4, 0x4e, 0x37, 0xcb, 0x54, 0x45, 0x6e, 0x4e, 0x0e, 0x54, 0x4d, 0xfc, 0x10, 0xe0, 0x09,
-	0xe9, 0xb5, 0x88, 0x47, 0x4f, 0xad, 0x3e, 0x27, 0x89, 0x55, 0xd3, 0x74, 0x8c, 0x1e, 0xf1, 0x49,
-	0x62, 0xe4, 0xa9, 0xd1, 0xe3, 0x15, 0x3f, 0x35, 0x44, 0xa4, 0x2c, 0x13, 0x1f, 0x42, 0xfa, 0x91,
-	0xed, 0xbe, 0x7e, 0x42, 0x98, 0xc1, 0xe7, 0x02, 0x7d, 0x04, 0x33, 0x3d, 0x12, 0xa8, 0x3c, 0x9b,
-	0xa5, 0xe0, 0x51, 0xec, 0x76, 0xfa, 0x4d, 0x21, 0x6e, 0xca, 0x92, 0xaf, 0x2b, 0xe5, 0x7b, 0xdf,
-	0xee, 0x40, 0x46, 0x6e, 0xec, 0x06, 0xf1, 0xf8, 0x24, 0x21, 0x1d, 0x16, 0x4f, 0xfa, 0xa6, 0xc1,
-	0xc8, 0xb1, 0xdb, 0x3d, 0x26, 0x67, 0xc4, 0x46, 0x4b, 0x25, 0xd5, 0x6a, 0x1c, 0xbb, 0xdd, 0xae,
-	0xe5, 0x74, 0x8b, 0xab, 0x25, 0xd9, 0xc0, 0x94, 0xfc, 0x06, 0xa6, 0x74, 0xc8, 0x1b, 0x18, 0xbc,
-	0xf6, 0xe5, 0x3f, 0xff, 0xfd, 0x75, 0x2a, 0x87, 0xd3, 0xa2, 0xef, 0x39, 0xfb, 0x90, 0xb7, 0x1a,
-	0xf4, 0x63, 0x6d, 0x1b, 0xd5, 0x21, 0x7d, 0x44, 0x98, 0x0f, 0xa4, 0xa8, 0x30, 0x46, 0xac, 0xb8,
-	0xbd, 0xbe, 0xeb, 0x10, 0x87, 0x15, 0xb3, 0x63, 0x12, 0x8a, 0x97, 0x05, 0x74, 0x11, 0x85, 0xa0,
-	0xe8, 0x05, 0x64, 0x8e, 0x08, 0x0b, 0xa4, 0x2f, 0xc1, 0xa7, 0xe2, 0x70, 0xff, 0x8e, 0x74, 0x71,
-	0x51, 0x20, 0x97, 0x11, 0xf2, 0x91, 0xbd, 0x11, 0xe7, 0x25, 0x64, 0x65, 0xf8, 0x01, 0x76, 0x0c,
-	0x23, 0x31, 0x07, 0x9b, 0x82, 0xbd, 0x86, 0x63, 0xd8, 0x3c, 0x13, 0x07, 0x30, 0x7f, 0x44, 0x98,
-	0x2a, 0xa5, 0x49, 0x3e, 0x0f, 0xab, 0x95, 0xd4, 0xc3, 0x4b, 0x82, 0x39, 0x8f, 0x66, 0x15, 0x13,
-	0xbd, 0x84, 0xdc, 0xb1, 0x45, 0x59, 0xb8, 0x9e, 0x27, 0xd1, 0x56, 0xe2, 0x0a, 0x3b, 0xc5, 0x37,
-	0x04, 0x34, 0x8f, 0x72, 0xbe, 0xa3, 0xd6, 0x90, 0xd4, 0x80, 0xa5, 0x23, 0x12, 0xa2, 0x23, 0xf0,
-	0xe7, 0xa5, 0x7a, 0x50, 0x8c, 0x3d, 0x29, 0xf0, 0x5b, 0x82, 0x57, 0x40, 0xab, 0x11, 0x5e, 0xf9,
-	0x8d, 0x65, 0x7e, 0x81, 0x74, 0x48, 0x73, 0x9f, 0xf7, 0xfc, 0x72, 0x9f, 0xe4, 0x6e, 0x76, 0xec,
-	0xb0, 0xa0, 0xb8, 0x20, 0xc8, 0x08, 0x65, 0x7d, 0xf2, 0xf0, 0xc8, 0x20, 0x80, 0x38, 0xf3, 0x38,
-	0x5c, 0xfd, 0x93, 0xc8, 0xab, 0xb1, 0xe7, 0x08, 0xc5, 0x37, 0x05, 0xff, 0x06, 0x5a, 0x0b, 0xac,
-	0xb0, 0xe0, 0x31, 0x84, 0x7e, 0x0b, 0x59, 0xb9, 0x7c, 0x47, 0x6f, 0x85, 0x12, 0x12, 0x7f, 0x40,
-	0xe1, 0x77, 0x04, 0xf7, 0x2d, 0xb4, 0x91, 0xc0, 0x95, 0x79, 0xe9, 0xc0, 0x6a, 0x24, 0x86, 0xba,
-	0xeb, 0x31, 0x1a, 0x9f, 0x73, 0xa5, 0x27, 0x34, 0xf0, 0xb6, 0xb0, 0xf0, 0x0e, 0xc2, 0x17, 0x59,
-	0x28, 0xf7, 0x05, 0xed, 0x73, 0x58, 0x1e, 0x0f, 0x82, 0x43, 0xd0, 0x4a, 0x0c, 0xb9, 0x6a, 0x16,
-	0xf3, 0x31, 0xc3, 0xf8, 0xbe, 0xb0, 0x57, 0x42, 0x1f, 0x5c, 0x6e, 0xaf, 0xfc, 0x86, 0xff, 0x69,
-	0xf2, 0x08, 0xff, 0xa8, 0xc1, 0xda, 0xa1, 0xe8, 0xcd, 0xae, 0x6c, 0x3d, 0x69, 0x77, 0x3d, 0x14,
-	0x0e, 0x7c, 0x84, 0x77, 0xaf, 0xe3, 0x40, 0x59, 0x35, 0x86, 0x5f, 0x69, 0x50, 0x38, 0xb0, 0xe8,
-	0x0f, 0xe2, 0xc8, 0x4f, 0x85, 0x23, 0x0f, 0xf0, 0xfd, 0x6b, 0x39, 0x62, 0x4a, 0xeb, 0xc8, 0x8c,
-	0x99, 0x73, 0x5e, 0xcd, 0xc3, 0x73, 0x8e, 0x42, 0x25, 0x5c, 0xc8, 0xaf, 0x38, 0xe3, 0x1d, 0xc1,
-	0xfa, 0xbd, 0x06, 0x1b, 0xc3, 0x52, 0x1e, 0x36, 0xf4, 0x4c, 0xb8, 0xb1, 0x11, 0x31, 0x20, 0xc6,
-	0xe5, 0x3b, 0x89, 0xa1, 0xef, 0x08, 0x17, 0xee, 0xe0, 0x2b, 0xb8, 0xc0, 0x2b, 0xde, 0x1f, 0x34,
-	0xd8, 0x8c, 0xf1, 0xe2, 0x09, 0x3f, 0x7f, 0xa4, 0x1b, 0xeb, 0x21, 0x37, 0x84, 0xe0, 0x89, 0x6b,
-	0x5e, 0xe2, 0x45, 0x49, 0x78, 0xb1, 0x85, 0xdf, 0xbe, 0xd0, 0x0b, 0x79, 0xca, 0x71, 0x37, 0xba,
-	0xb0, 0x16, 0x49, 0xb9, 0x30, 0x15, 0xce, 0x79, 0x3e, 0xea, 0x0b, 0xc5, 0xef, 0x0b, 0x5b, 0xef,
-	0xa2, 0xab, 0xd8, 0x42, 0x0c, 0xd6, 0x63, 0xe7, 0x56, 0xb5, 0x77, 0x41, 0x63, 0x6b, 0x91, 0xfc,
-	0x4b, 0x25, 0x7c, 0x57, 0x18, 0xdc, 0x46, 0x5b, 0x97, 0xa6, 0x58, 0x75, 0x9a, 0xe8, 0x6b, 0x0d,
-	0x6e, 0x27, 0xcc, 0xb5, 0x60, 0xca, 0x4c, 0xdf, 0x8e, 0x37, 0x78, 0x95, 0x59, 0xdf, 0x15, 0x2e,
-	0xed, 0xe0, 0x2b, 0xbb, 0xc4, 0x93, 0x5e, 0x83, 0x05, 0x9e, 0x8b, 0xcb, 0x0a, 0xf3, 0x52, 0xb8,
-	0x41, 0xa6, 0x7e, 0x23, 0x81, 0x96, 0x7c, 0x63, 0x7e, 0x25, 0xae, 0x41, 0x66, 0x04, 0xac, 0x9a,
-	0xc9, 0xc8, 0x85, 0x51, 0x9a, 0x63, 0x8e, 0x3a, 0x89, 0xb3, 0x4c, 0x8a, 0x4e, 0x20, 0xab, 0x93,
-	0xb6, 0xeb, 0xb4, 0x2d, 0x9b, 0xf8, 0x6e, 0x06, 0xdf, 0x4d, 0xcc, 0xc7, 0x86, 0x60, 0xae, 0xe2,
-	0x28, 0x93, 0x07, 0x7e, 0x28, 0x8e, 0xf9, 0x98, 0xa3, 0x62, 0xec, 0x43, 0xc4, 0xc7, 0xa0, 0xe5,
-	0xb1, 0x48, 0xe5, 0xd9, 0xf0, 0x0b, 0x48, 0x57, 0x3c, 0x62, 0x30, 0xe5, 0x1a, 0x1a, 0x7b, 0x3b,
-	0x42, 0x53, 0x8d, 0x0d, 0x1e, 0xcf, 0x1b, 0x77, 0xe9, 0x05, 0xa4, 0x65, 0x11, 0x8e, 0xf1, 0x2a,
-	0x29, 0xc8, 0xb7, 0x05, 0x6f, 0x13, 0xaf, 0xc7, 0x79, 0xe7, 0x97, 0xd5, 0x5f, 0x43, 0x46, 0x55,
-	0xd5, 0x6b, 0x90, 0xd5, 0xd9, 0x88, 0x37, 0x62, 0xc9, 0x7e, 0x9d, 0x7c, 0x01, 0x69, 0x9d, 0xb4,
-	0x5c, 0x97, 0xfd, 0x60, 0x3e, 0x7b, 0x02, 0xc7, 0xc1, 0x07, 0xc4, 0x26, 0xec, 0x7b, 0x24, 0x63,
-	0x3b, 0x1e, 0x6c, 0x0a, 0x1c, 0x1a, 0x40, 0xe6, 0xc0, 0x7d, 0xed, 0xd8, 0xae, 0x61, 0x56, 0x7b,
-	0x46, 0x97, 0x8c, 0xce, 0x15, 0xf1, 0xe8, 0xcb, 0x8a, 0x2b, 0xbe, 0xc1, 0x5a, 0x9f, 0x78, 0xe2,
-	0x72, 0x90, 0x7f, 0xd0, 0xe0, 0x07, 0xc2, 0xc6, 0x5d, 0xfc, 0x7e, 0xac, 0x0d, 0x8b, 0x23, 0x9a,
-	0xa6, 0x62, 0xd0, 0xf2, 0x1b, 0xfe, 0xa9, 0xf0, 0x05, 0x9f, 0xdc, 0x2f, 0x35, 0x58, 0x3d, 0x22,
-	0x2c, 0x64, 0x43, 0x5e, 0x03, 0x24, 0x3b, 0x10, 0x37, 0x8c, 0x3f, 0x16, 0x0e, 0xdc, 0x47, 0xf7,
-	0xae, 0xe1, 0x40, 0x99, 0x4a, 0x4b, 0x03, 0xd1, 0x26, 0x85, 0x78, 0xd7, 0xb4, 0xae, 0x8a, 0x0c,
-	0xba, 0x4e, 0xf8, 0xa8, 0x23, 0x9b, 0xc0, 0x10, 0x89, 0x8e, 0xcd, 0x68, 0x9c, 0x35, 0x8a, 0x3f,
-	0x10, 0xe6, 0xde, 0x43, 0xef, 0x5c, 0xc5, 0x1c, 0xfa, 0x1c, 0xf2, 0x15, 0xde, 0xcf, 0xda, 0x57,
-	0x8c, 0x30, 0x76, 0x82, 0x55, 0x84, 0xdb, 0xd7, 0x8a, 0xf0, 0xcf, 0x1a, 0xe4, 0xf7, 0xda, 0xcc,
-	0x3a, 0x33, 0x18, 0x11, 0x56, 0x64, 0xad, 0xbe, 0xa6, 0xe9, 0x8a, 0x30, 0xfd, 0x09, 0xfe, 0xf1,
-	0x75, 0xa6, 0x56, 0x0e, 0x0f, 0x84, 0x3d, 0xbe, 0xd0, 0xfe, 0xa4, 0x41, 0x4e, 0x27, 0x67, 0xc4,
-	0x63, 0xff, 0x17, 0x47, 0x3c, 0x61, 0x5a, 0x7e, 0x52, 0x2e, 0x8d, 0x4e, 0x82, 0x68, 0xbf, 0x9c,
-	0xf1, 0x3d, 0x92, 0x8d, 0x32, 0x16, 0x26, 0x37, 0x50, 0x31, 0xd6, 0xa4, 0x6c, 0x90, 0x5f, 0x42,
-	0x3e, 0x40, 0xec, 0x55, 0xc4, 0x87, 0x72, 0x98, 0x9a, 0x1b, 0x52, 0x7d, 0x31, 0xbe, 0x23, 0xc8,
-	0xb7, 0xd1, 0xcd, 0x78, 0x72, 0x4f, 0x7d, 0x70, 0x53, 0xe4, 0xc0, 0x8a, 0xcc, 0xd6, 0xb8, 0x81,
-	0x28, 0x34, 0xb1, 0x04, 0xa9, 0xee, 0x0f, 0x5f, 0x66, 0x8c, 0x27, 0xe8, 0x24, 0x98, 0xa0, 0xab,
-	0x35, 0x97, 0x17, 0x67, 0x49, 0x36, 0x95, 0x04, 0x96, 0xc3, 0xd8, 0xeb, 0xf4, 0x35, 0x5b, 0xc2,
-	0x00, 0x46, 0xb7, 0x12, 0x0d, 0xf8, 0xfd, 0xcc, 0x67, 0x41, 0xef, 0xe5, 0xed, 0x5a, 0xd2, 0x51,
-	0x9f, 0x8f, 0xde, 0xd0, 0xd1, 0xa4, 0x73, 0x55, 0x5e, 0xed, 0x21, 0x5d, 0xdc, 0x1e, 0x8c, 0xf4,
-	0xc7, 0x32, 0x13, 0xe1, 0xe1, 0xdb, 0x02, 0xb7, 0x8e, 0x6e, 0xc4, 0xe1, 0xe4, 0x59, 0xdd, 0x84,
-	0xec, 0xc8, 0x63, 0x95, 0x94, 0x24, 0x97, 0x97, 0x63, 0x6e, 0x04, 0xa9, 0x7f, 0x75, 0x80, 0x56,
-	0xc6, 0x8c, 0xa8, 0x94, 0x3c, 0x82, 0x6c, 0x83, 0x79, 0xc4, 0xe8, 0xd5, 0x8d, 0xf6, 0x2b, 0xc2,
-	0x68, 0x6d, 0xc0, 0xd0, 0x6a, 0x28, 0xd3, 0x52, 0x50, 0x1b, 0xb0, 0xc4, 0x05, 0x34, 0xb1, 0xa5,
-	0xa1, 0x43, 0xd1, 0xf2, 0x10, 0xeb, 0x8c, 0x28, 0x50, 0xd5, 0xb9, 0xe0, 0xee, 0x20, 0xca, 0xaf,
-	0x3a, 0x78, 0xe2, 0xae, 0x86, 0x1e, 0x43, 0x5e, 0x61, 0x2a, 0xa7, 0x86, 0xd3, 0x25, 0xe2, 0x5e,
-	0x32, 0x39, 0xe4, 0x42, 0x88, 0x14, 0x78, 0x45, 0xc0, 0x4e, 0x60, 0x71, 0x38, 0x21, 0xf2, 0x27,
-	0x9e, 0x70, 0x53, 0x1e, 0x4d, 0x57, 0xd2, 0x62, 0x55, 0xd9, 0xf2, 0xe7, 0x24, 0x27, 0xfb, 0xa7,
-	0xe0, 0xcf, 0x09, 0x71, 0x37, 0xa9, 0xc5, 0xb8, 0x41, 0x7c, 0x4b, 0x98, 0x28, 0xe2, 0xe1, 0x84,
-	0x84, 0x2e, 0x66, 0xf9, 0x26, 0x7b, 0x2e, 0xfc, 0x0e, 0xd2, 0x63, 0x3f, 0xda, 0x83, 0x3f, 0x12,
-	0x44, 0x1d, 0x0f, 0x51, 0xa5, 0xe3, 0x26, 0xe4, 0x64, 0xb1, 0xf8, 0x7e, 0x8e, 0xbf, 0x2b, 0x4c,
-	0xdc, 0x2c, 0x5e, 0x60, 0x82, 0x7b, 0x6f, 0x42, 0x4e, 0x76, 0x41, 0x97, 0x5a, 0x49, 0x5a, 0x4f,
-	0x2a, 0x96, 0xed, 0x8b, 0x62, 0x51, 0x1b, 0x23, 0xf4, 0x43, 0xc9, 0xa5, 0x1b, 0x23, 0x94, 0xb1,
-	0xc8, 0xc6, 0x08, 0x59, 0x41, 0xc7, 0xa2, 0xd9, 0x16, 0x47, 0x0f, 0x8d, 0x6f, 0xb6, 0xa5, 0xcc,
-	0xef, 0xe0, 0xd0, 0x7a, 0xf2, 0xc1, 0x43, 0xd1, 0xaf, 0x60, 0xce, 0xbf, 0x38, 0x0e, 0xc1, 0x0a,
-	0x49, 0x37, 0xd0, 0xf8, 0x3d, 0x81, 0xbd, 0x85, 0xdf, 0x8a, 0xc5, 0x52, 0x62, 0x77, 0x9a, 0x8c,
-	0xd3, 0x9e, 0x8b, 0xfe, 0x28, 0x74, 0xf1, 0x3e, 0xfe, 0xed, 0x19, 0xb9, 0x99, 0x8f, 0x56, 0x1e,
-	0xbe, 0x8d, 0xb8, 0x9e, 0xfa, 0xe8, 0xb4, 0x5a, 0xe8, 0x33, 0x40, 0x47, 0x84, 0x8d, 0xdd, 0xbd,
-	0x8f, 0x5d, 0x50, 0xc5, 0x5d, 0xcf, 0x47, 0xf3, 0x11, 0x66, 0x8b, 0x9b, 0x7e, 0x44, 0x21, 0xd3,
-	0xb0, 0x7a, 0x03, 0xdb, 0x60, 0x44, 0xbc, 0x8f, 0x36, 0x86, 0x89, 0x08, 0x0e, 0xeb, 0xe4, 0x77,
-	0x03, 0x42, 0x59, 0xd2, 0x99, 0x1f, 0xb9, 0x34, 0x08, 0xe7, 0x48, 0x91, 0x9a, 0x9c, 0xc4, 0x57,
-	0x66, 0x05, 0xe6, 0x87, 0x97, 0xec, 0xe8, 0x86, 0x6f, 0x30, 0x72, 0xfd, 0x5e, 0x4c, 0x16, 0xe1,
-	0x89, 0x7d, 0x1b, 0xf2, 0xae, 0xd7, 0x15, 0x75, 0xa7, 0xed, 0x7a, 0xa6, 0x52, 0xdd, 0x4f, 0xcb,
-	0x5b, 0xd5, 0xba, 0xf8, 0xb9, 0xf9, 0x37, 0xa5, 0xae, 0xc5, 0x4e, 0x07, 0x2d, 0xee, 0x75, 0xd9,
-	0xd7, 0x54, 0xbf, 0xe9, 0xef, 0xf8, 0xbf, 0xf0, 0xef, 0x96, 0xbb, 0xae, 0x1a, 0xfb, 0x47, 0x6a,
-	0xb5, 0xe6, 0xf3, 0x9e, 0x07, 0x2f, 0x69, 0xeb, 0xa9, 0xfa, 0x64, 0x7d, 0xaa, 0x3e, 0x5d, 0x9f,
-	0xa9, 0xcf, 0xd6, 0xe7, 0x5a, 0x33, 0xe2, 0xdd, 0xdd, 0xff, 0x06, 0x00, 0x00, 0xff, 0xff, 0x47,
-	0x9e, 0x76, 0x38, 0x2d, 0x20, 0x00, 0x00,
+	// 2467 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xc4, 0x9a, 0xcd, 0x73, 0xdb, 0xc6,
+	0x15, 0xc0, 0x05, 0x7d, 0xeb, 0x89, 0x92, 0xc8, 0xa5, 0x3e, 0x68, 0x4a, 0x8a, 0xed, 0x8d, 0x63,
+	0xab, 0x4a, 0x4c, 0xda, 0x96, 0xe3, 0x69, 0xed, 0x66, 0x1a, 0x89, 0x92, 0x55, 0xd6, 0x92, 0xc9,
+	0x42, 0x96, 0xdd, 0x8f, 0x78, 0x38, 0x20, 0xb1, 0xa4, 0x30, 0x06, 0x01, 0x16, 0xbb, 0xa4, 0xa3,
+	0xf1, 0xe4, 0x92, 0x7e, 0xa4, 0xf7, 0xdc, 0x7b, 0x6a, 0xa7, 0x33, 0xfd, 0x5f, 0x72, 0xea, 0xa9,
+	0xd7, 0x4e, 0x0f, 0xfd, 0x0b, 0x32, 0xd3, 0x5b, 0x67, 0x3f, 0x40, 0x02, 0x04, 0x20, 0x89, 0x69,
+	0x66, 0x7a, 0xb2, 0xb1, 0x6f, 0xf7, 0xf7, 0xde, 0xbe, 0xdd, 0x7d, 0xfb, 0xf6, 0x51, 0x90, 0xef,
+	0xb9, 0x36, 0x3b, 0x33, 0x6a, 0x1d, 0xcf, 0x65, 0x2e, 0x2d, 0xca, 0xaf, 0x82, 0xf8, 0x42, 0xd3,
+	0xf2, 0x2b, 0xbf, 0xd1, 0x72, 0xdd, 0x96, 0x4d, 0x8a, 0x46, 0xc7, 0x2a, 0x1a, 0x8e, 0xe3, 0x32,
+	0x83, 0x59, 0xae, 0x43, 0x65, 0xaf, 0xfc, 0xba, 0x92, 0x8a, 0xaf, 0x7a, 0xb7, 0x59, 0x24, 0xed,
+	0x0e, 0x3b, 0x57, 0xc2, 0x5c, 0x18, 0xdf, 0x26, 0x4c, 0xc1, 0xf3, 0x43, 0x8a, 0x1b, 0x6e, 0xbb,
+	0xed, 0x3a, 0xf1, 0xb2, 0x33, 0x62, 0xd8, 0xec, 0x4c, 0xc9, 0x70, 0x58, 0x66, 0xbb, 0x2d, 0xab,
+	0x61, 0xd8, 0x35, 0x93, 0xf4, 0xac, 0x06, 0x89, 0x1f, 0x1f, 0x92, 0xad, 0x87, 0x65, 0x86, 0x69,
+	0x74, 0x18, 0xf1, 0x94, 0xf0, 0x7a, 0x58, 0xe8, 0x76, 0x88, 0xd3, 0xb4, 0xdd, 0xb7, 0xb5, 0xfb,
+	0x3b, 0x09, 0x1d, 0xda, 0x0d, 0xab, 0xd6, 0xb6, 0xea, 0x35, 0xb3, 0xae, 0x3a, 0xdc, 0x8c, 0xe9,
+	0x60, 0xd8, 0x86, 0xd7, 0xee, 0x77, 0xc1, 0x7f, 0xd6, 0x60, 0x7e, 0x5f, 0x98, 0x74, 0xe8, 0xb9,
+	0xdd, 0x0e, 0x5a, 0x81, 0x71, 0xcb, 0xcc, 0x69, 0x37, 0xb4, 0xad, 0xb9, 0xbd, 0xa9, 0x7f, 0x7f,
+	0xfb, 0xcd, 0xa6, 0xa6, 0x8f, 0x5b, 0x26, 0x2a, 0xc3, 0x52, 0x78, 0x72, 0x34, 0x37, 0x7e, 0x63,
+	0x62, 0x6b, 0xfe, 0xc1, 0x4a, 0x41, 0xad, 0xd2, 0x91, 0x14, 0x4b, 0xd6, 0xde, 0xdc, 0x3f, 0xbf,
+	0xfd, 0x66, 0x73, 0x92, 0xb3, 0xf4, 0x45, 0x3b, 0x28, 0xa1, 0x68, 0x07, 0x66, 0x7c, 0xc4, 0x84,
+	0x40, 0x2c, 0xfa, 0x88, 0xe8, 0x58, 0xbf, 0x27, 0xfe, 0x11, 0xa4, 0x02, 0x56, 0x52, 0xf4, 0x03,
+	0x98, 0xb2, 0x18, 0x69, 0xd3, 0x9c, 0x26, 0x10, 0xd9, 0x30, 0x42, 0x74, 0xd2, 0x65, 0x0f, 0xfc,
+	0x27, 0x0d, 0xd0, 0x41, 0x8f, 0x38, 0xec, 0xa9, 0x65, 0x33, 0xe2, 0xe9, 0x5d, 0x9b, 0x3c, 0x23,
+	0xe7, 0xf8, 0x2b, 0x0d, 0xb2, 0x43, 0xcd, 0x2f, 0xce, 0x3b, 0x04, 0x2d, 0x02, 0x34, 0x45, 0x4b,
+	0xcd, 0xb0, 0xed, 0xf4, 0x18, 0x4a, 0xc1, 0x6c, 0xc3, 0x60, 0xa4, 0xe5, 0x7a, 0xe7, 0x69, 0x0d,
+	0xa5, 0x21, 0x45, 0xbb, 0xf5, 0x5a, 0xbf, 0x65, 0x1c, 0x21, 0x58, 0x7c, 0xd3, 0xb1, 0x6a, 0x84,
+	0xa3, 0x6a, 0xec, 0xbc, 0x43, 0xd2, 0x13, 0x68, 0x05, 0x32, 0x0d, 0xd7, 0x69, 0x5a, 0xad, 0x60,
+	0xf3, 0x24, 0x6f, 0x96, 0xf3, 0x09, 0x36, 0x4f, 0x61, 0x0b, 0x96, 0x86, 0x0c, 0x41, 0x9f, 0xc2,
+	0xc4, 0x1b, 0x72, 0x2e, 0x96, 0x61, 0xf1, 0x41, 0xc1, 0x9f, 0x5c, 0x74, 0x16, 0x85, 0x98, 0x19,
+	0xe8, 0x7c, 0x28, 0x5a, 0x86, 0xa9, 0x9e, 0x61, 0x77, 0x49, 0x6e, 0x9c, 0x2f, 0xa5, 0x2e, 0x3f,
+	0xf0, 0x5f, 0x35, 0x98, 0x0f, 0x0c, 0x49, 0x5a, 0xed, 0x55, 0x98, 0x26, 0x8e, 0x51, 0xb7, 0xe5,
+	0xe8, 0x59, 0x5d, 0x7d, 0xa1, 0x75, 0x98, 0x53, 0x13, 0xb0, 0xcc, 0xdc, 0x84, 0x00, 0xcf, 0xca,
+	0x86, 0xb2, 0x89, 0x36, 0x01, 0x06, 0xd3, 0xca, 0x4d, 0x0a, 0xe9, 0x9c, 0x68, 0x11, 0x7e, 0xbd,
+	0x0b, 0x53, 0x5e, 0xd7, 0x26, 0x34, 0x37, 0x25, 0x56, 0x6c, 0x2d, 0x61, 0x52, 0xba, 0xec, 0x85,
+	0x3f, 0x81, 0x54, 0x40, 0x42, 0xd1, 0x5d, 0x98, 0x91, 0xcb, 0x12, 0x59, 0xf2, 0x20, 0xc0, 0xef,
+	0x83, 0xdf, 0x40, 0xaa, 0xe4, 0x7a, 0xa4, 0xec, 0x50, 0x66, 0x38, 0x0d, 0x82, 0x6e, 0xc3, 0xbc,
+	0xa5, 0xfe, 0x5f, 0x1b, 0x9e, 0x31, 0xf8, 0x92, 0xb2, 0x89, 0x76, 0x60, 0x5a, 0x1e, 0x70, 0x31,
+	0xf3, 0xf9, 0x07, 0xcb, 0xbe, 0x96, 0x9f, 0x8a, 0xd6, 0x13, 0x66, 0xb0, 0x2e, 0xdd, 0x9b, 0xe2,
+	0x3b, 0x74, 0x4c, 0x57, 0x5d, 0xf1, 0x13, 0x58, 0x08, 0x2a, 0xa3, 0x68, 0x3b, 0xbc, 0x3b, 0xfb,
+	0x90, 0x60, 0x2f, 0x7f, 0x7b, 0xfe, 0x63, 0x12, 0xa6, 0x5f, 0x0a, 0x31, 0xba, 0x0e, 0x33, 0x3d,
+	0xe2, 0x51, 0xcb, 0x75, 0xc2, 0x06, 0xfa, 0xad, 0xe8, 0x11, 0xcc, 0xaa, 0x10, 0xe1, 0x1f, 0xbf,
+	0x25, 0x1f, 0xbd, 0x2b, 0xdb, 0x83, 0x87, 0xa7, 0xdf, 0x37, 0xee, 0xf4, 0x4e, 0xfc, 0xef, 0xa7,
+	0x77, 0xf2, 0xaa, 0xa7, 0x17, 0x7d, 0x0a, 0x29, 0xb5, 0x6f, 0xf8, 0xde, 0xf0, 0xb7, 0x00, 0x0a,
+	0x8f, 0xe4, 0xbb, 0x24, 0x38, 0x7a, 0xde, 0xec, 0x37, 0x53, 0x54, 0x82, 0x05, 0x45, 0x68, 0x89,
+	0x00, 0x90, 0x9b, 0x4e, 0x3c, 0xf7, 0x41, 0x86, 0x52, 0xab, 0x82, 0x46, 0x09, 0x16, 0xe4, 0x0e,
+	0xf5, 0x77, 0xd2, 0x4c, 0xe2, 0x4e, 0x0a, 0x41, 0x48, 0x70, 0x23, 0xfe, 0x1c, 0x32, 0x83, 0x40,
+	0x6b, 0x30, 0xa3, 0x6e, 0x50, 0x92, 0xdb, 0x50, 0x20, 0x2e, 0x29, 0x1c, 0x5b, 0x75, 0x69, 0xce,
+	0xbe, 0xc1, 0x8c, 0xbd, 0x34, 0x07, 0xcd, 0x07, 0x0e, 0x8e, 0xbe, 0xc4, 0x7b, 0xf1, 0x4e, 0x6a,
+	0x34, 0x7a, 0x05, 0xd9, 0x60, 0x68, 0xf6, 0xa1, 0x9b, 0x6a, 0x89, 0x04, 0x74, 0x97, 0xcb, 0x2e,
+	0xc4, 0x0a, 0xb3, 0x64, 0x37, 0x45, 0xc0, 0x7f, 0xd1, 0x20, 0x7d, 0x42, 0xec, 0xe6, 0x0b, 0x42,
+	0x99, 0x4e, 0x68, 0xc7, 0x75, 0x28, 0x41, 0x3f, 0x81, 0x69, 0x8f, 0xd0, 0xae, 0xcd, 0x54, 0x78,
+	0xb9, 0xe3, 0x4f, 0x7f, 0xb8, 0x67, 0xb0, 0xa1, 0x6b, 0x33, 0x5d, 0x0d, 0xc3, 0x55, 0x58, 0x0c,
+	0x4b, 0xd0, 0x3c, 0xcc, 0x9c, 0x9c, 0x96, 0x4a, 0x07, 0x27, 0x27, 0xe9, 0x31, 0xfe, 0xf1, 0x74,
+	0xb7, 0x7c, 0x74, 0xaa, 0x1f, 0xa4, 0x35, 0x94, 0x81, 0x85, 0xe7, 0x95, 0x17, 0xb5, 0x93, 0xd3,
+	0x6a, 0xb5, 0xa2, 0xbf, 0x38, 0xd8, 0x4f, 0x8f, 0xf3, 0xa6, 0xd3, 0xe7, 0xcf, 0x9e, 0x57, 0x5e,
+	0x3d, 0xaf, 0x1d, 0xe8, 0x7a, 0x45, 0x4f, 0x4f, 0xe0, 0x0a, 0x64, 0x2a, 0xcd, 0xdd, 0x16, 0x71,
+	0xd8, 0x49, 0xb7, 0x4e, 0x1b, 0x9e, 0x55, 0x27, 0x1e, 0x8f, 0x27, 0x6e, 0xd3, 0xe0, 0x8d, 0xfd,
+	0x13, 0xab, 0xcf, 0xa9, 0x96, 0xb2, 0xc9, 0x63, 0x91, 0xba, 0xdd, 0x2c, 0x53, 0x05, 0xb9, 0x59,
+	0xd9, 0x50, 0x36, 0xf1, 0x13, 0x80, 0x63, 0xd2, 0xae, 0x13, 0x8f, 0x9e, 0x59, 0x1d, 0x4e, 0x12,
+	0xbb, 0xa6, 0xe6, 0x18, 0x6d, 0xe2, 0x93, 0x44, 0xcb, 0x73, 0xa3, 0xcd, 0x23, 0xfe, 0x78, 0x1f,
+	0x31, 0x6e, 0x99, 0xf8, 0x00, 0x52, 0x4f, 0x6d, 0xf7, 0xed, 0x31, 0x61, 0x06, 0x5f, 0x0b, 0xf4,
+	0x31, 0x4c, 0xb7, 0x49, 0x20, 0xf2, 0x6c, 0x16, 0x82, 0x57, 0xb1, 0xdb, 0xec, 0xd4, 0x84, 0xb8,
+	0x26, 0x43, 0xbe, 0xae, 0x3a, 0x3f, 0xf8, 0x4f, 0x01, 0x16, 0xe4, 0xc1, 0x3e, 0x21, 0x1e, 0x5f,
+	0x24, 0xa4, 0xc3, 0xe2, 0x69, 0xc7, 0x34, 0x18, 0x39, 0x72, 0x5b, 0x47, 0xa4, 0x47, 0x6c, 0xb4,
+	0x54, 0x50, 0xa9, 0xc6, 0x91, 0xdb, 0x6a, 0x59, 0x4e, 0x2b, 0xbf, 0x5a, 0x90, 0x09, 0x4c, 0xc1,
+	0x4f, 0x60, 0x0a, 0x07, 0x3c, 0x81, 0xc1, 0x6b, 0x5f, 0xfe, 0xfd, 0x5f, 0x5f, 0x8f, 0x67, 0x70,
+	0x4a, 0xe4, 0x3d, 0xbd, 0xfb, 0x3c, 0xd5, 0xa0, 0x8f, 0xb5, 0x6d, 0x54, 0x85, 0xd4, 0x21, 0x61,
+	0x3e, 0x90, 0xa2, 0xdc, 0x10, 0xb1, 0xe4, 0xb6, 0x3b, 0xae, 0x43, 0x1c, 0x96, 0x4f, 0x0f, 0x49,
+	0x28, 0x5e, 0x16, 0xd0, 0x45, 0x14, 0x82, 0xa2, 0x57, 0xb0, 0x70, 0x48, 0x58, 0xc0, 0x7d, 0x09,
+	0x36, 0xe5, 0xfb, 0xe7, 0x77, 0xd0, 0x17, 0xe7, 0x05, 0x72, 0x19, 0x21, 0x1f, 0xd9, 0x1e, 0x70,
+	0x5e, 0x43, 0x5a, 0x4e, 0x3f, 0xc0, 0x8e, 0x61, 0x24, 0xfa, 0x60, 0x53, 0xb0, 0xd7, 0x70, 0x0c,
+	0x9b, 0x7b, 0x62, 0x1f, 0xe6, 0x0e, 0x09, 0x53, 0xa1, 0x34, 0xc9, 0xe6, 0x7e, 0xb4, 0x92, 0xfd,
+	0xf0, 0x92, 0x60, 0xce, 0xa1, 0x19, 0xc5, 0x44, 0xaf, 0x21, 0x73, 0x64, 0x51, 0x16, 0x8e, 0xe7,
+	0x49, 0xb4, 0x95, 0xb8, 0xc0, 0x4e, 0xf1, 0x35, 0x01, 0xcd, 0xa2, 0x8c, 0x6f, 0xa8, 0xd5, 0x27,
+	0x9d, 0xc0, 0xd2, 0x21, 0x09, 0xd1, 0x11, 0xf8, 0xeb, 0x52, 0xde, 0xcf, 0xc7, 0xde, 0x14, 0xf8,
+	0x3d, 0xc1, 0xcb, 0xa1, 0xd5, 0x08, 0xaf, 0xf8, 0xce, 0x32, 0xbf, 0x40, 0x3a, 0xa4, 0xb8, 0xcd,
+	0xbb, 0x7e, 0xb8, 0x4f, 0x32, 0x37, 0x3d, 0x74, 0x59, 0x50, 0x9c, 0x13, 0x64, 0x84, 0xd2, 0x3e,
+	0xb9, 0x7f, 0x65, 0x10, 0x40, 0x9c, 0x79, 0x14, 0x8e, 0xfe, 0x49, 0xe4, 0xd5, 0xd8, 0x7b, 0x84,
+	0xe2, 0xeb, 0x82, 0x7f, 0x0d, 0xad, 0x05, 0x76, 0x58, 0xf0, 0x1a, 0x42, 0xbf, 0x86, 0xb4, 0xdc,
+	0xbe, 0x83, 0x51, 0x21, 0x87, 0xc4, 0x5f, 0x50, 0xf8, 0x96, 0xe0, 0xbe, 0x87, 0x36, 0x12, 0xb8,
+	0xd2, 0x2f, 0x4d, 0x58, 0x8d, 0xcc, 0xa1, 0xea, 0x7a, 0x8c, 0xc6, 0xfb, 0x5c, 0xf5, 0x13, 0x3d,
+	0xf0, 0xb6, 0xd0, 0x70, 0x0b, 0xe1, 0x8b, 0x34, 0x14, 0x3b, 0x82, 0xf6, 0x39, 0x2c, 0x0f, 0x4f,
+	0x82, 0x43, 0xd0, 0x4a, 0x0c, 0xb9, 0x6c, 0xe6, 0xb3, 0x31, 0xcd, 0xf8, 0xa1, 0xd0, 0x57, 0x40,
+	0x1f, 0x5d, 0xae, 0xaf, 0xf8, 0x8e, 0xff, 0x53, 0xe3, 0x33, 0xfc, 0xbd, 0x06, 0x6b, 0x07, 0x22,
+	0x37, 0xbb, 0xb2, 0xf6, 0xa4, 0xd3, 0xf5, 0x44, 0x18, 0xf0, 0x31, 0xde, 0x19, 0xc5, 0x80, 0xa2,
+	0x4a, 0x0c, 0xbf, 0xd2, 0x20, 0xb7, 0x6f, 0xd1, 0xef, 0xc5, 0x90, 0x1f, 0x0b, 0x43, 0x1e, 0xe1,
+	0x87, 0x23, 0x19, 0x62, 0x4a, 0xed, 0xc8, 0x8c, 0x59, 0x73, 0x1e, 0xcd, 0xc3, 0x6b, 0x8e, 0x42,
+	0x21, 0x5c, 0xc8, 0xaf, 0xb8, 0xe2, 0x4d, 0xc1, 0xfa, 0xad, 0x06, 0x1b, 0xfd, 0x50, 0x1e, 0x56,
+	0xf4, 0x42, 0x98, 0xb1, 0x11, 0x51, 0x20, 0xda, 0xe5, 0x98, 0xc4, 0xa9, 0xdf, 0x15, 0x26, 0xdc,
+	0xc1, 0x57, 0x30, 0x81, 0x47, 0xbc, 0xdf, 0x69, 0xb0, 0x19, 0x63, 0xc5, 0x31, 0xbf, 0x7f, 0xa4,
+	0x19, 0xeb, 0x21, 0x33, 0x84, 0xe0, 0xd8, 0x35, 0x2f, 0xb1, 0xa2, 0x20, 0xac, 0xd8, 0xc2, 0xef,
+	0x5f, 0x68, 0x85, 0xbc, 0xe5, 0xb8, 0x19, 0x2d, 0x58, 0x8b, 0xb8, 0x5c, 0xa8, 0x0a, 0xfb, 0x3c,
+	0x1b, 0xb5, 0x85, 0xe2, 0x0f, 0x85, 0xae, 0x0f, 0xd0, 0x55, 0x74, 0x21, 0x06, 0xeb, 0xb1, 0x6b,
+	0xab, 0xd2, 0xbb, 0xa0, 0xb2, 0xb5, 0x88, 0xff, 0x65, 0x27, 0x7c, 0x4f, 0x28, 0xdc, 0x46, 0x5b,
+	0x97, 0xba, 0x58, 0x65, 0x9a, 0xe8, 0x6b, 0x0d, 0x6e, 0x26, 0xac, 0xb5, 0x60, 0x4a, 0x4f, 0xdf,
+	0x8c, 0x57, 0x78, 0x95, 0x55, 0xdf, 0x11, 0x26, 0xdd, 0xc5, 0x57, 0x36, 0x89, 0x3b, 0xbd, 0x02,
+	0xf3, 0xdc, 0x17, 0x97, 0x05, 0xe6, 0xa5, 0x70, 0x82, 0x4c, 0xfd, 0x44, 0x02, 0x2d, 0xf9, 0xca,
+	0xfc, 0x48, 0x5c, 0x81, 0x85, 0x01, 0xb0, 0x6c, 0x26, 0x23, 0xe7, 0x07, 0x6e, 0x8e, 0xb9, 0xea,
+	0x24, 0xce, 0x32, 0x29, 0x3a, 0x85, 0xb4, 0x4e, 0x1a, 0xae, 0xd3, 0xb0, 0x6c, 0xe2, 0x9b, 0x19,
+	0x1c, 0x9b, 0xe8, 0x8f, 0x0d, 0xc1, 0x5c, 0xc5, 0x51, 0x26, 0x9f, 0xf8, 0x81, 0xb8, 0xe6, 0x63,
+	0xae, 0x8a, 0xa1, 0x87, 0x88, 0x8f, 0x41, 0xcb, 0x43, 0x33, 0x95, 0x77, 0xc3, 0xcf, 0x20, 0x55,
+	0xf2, 0x88, 0xc1, 0x94, 0x69, 0x68, 0x68, 0x74, 0x84, 0xa6, 0x12, 0x1b, 0x3c, 0xec, 0x37, 0x6e,
+	0xd2, 0x2b, 0x48, 0xc9, 0x20, 0x1c, 0x63, 0x55, 0xd2, 0x24, 0xdf, 0x17, 0xbc, 0x4d, 0xbc, 0x1e,
+	0x67, 0x9d, 0x1f, 0x56, 0x7f, 0x09, 0x0b, 0x2a, 0xaa, 0x8e, 0x40, 0x56, 0x77, 0x23, 0xde, 0x88,
+	0x25, 0xfb, 0x71, 0xf2, 0x15, 0xa4, 0x74, 0x52, 0x77, 0x5d, 0xf6, 0xbd, 0xd9, 0xec, 0x09, 0x1c,
+	0x07, 0xef, 0x13, 0x9b, 0xb0, 0xef, 0xe0, 0x8c, 0xed, 0x78, 0xb0, 0x29, 0x70, 0xa8, 0x0b, 0x0b,
+	0xfb, 0xee, 0x5b, 0xc7, 0x76, 0x0d, 0xb3, 0xdc, 0x36, 0x5a, 0x64, 0x70, 0xaf, 0x88, 0x4f, 0x5f,
+	0x96, 0x5f, 0xf1, 0x15, 0x56, 0x3a, 0xc4, 0x13, 0xc5, 0x41, 0xfe, 0xa0, 0xc1, 0x8f, 0x84, 0x8e,
+	0x7b, 0xf8, 0xc3, 0x58, 0x1d, 0x16, 0x47, 0xd4, 0x4c, 0xc5, 0xa0, 0xc5, 0x77, 0xfc, 0xa9, 0xf0,
+	0x05, 0x5f, 0xdc, 0x2f, 0x35, 0x58, 0x3d, 0x24, 0x2c, 0xa4, 0x43, 0x96, 0x01, 0x92, 0x0d, 0x88,
+	0x6b, 0xc6, 0x8f, 0x85, 0x01, 0x0f, 0xd1, 0x83, 0x11, 0x0c, 0x28, 0x52, 0xa9, 0xa9, 0x2b, 0xd2,
+	0xa4, 0x10, 0x6f, 0x44, 0xed, 0x2a, 0xc8, 0xa0, 0x51, 0xa6, 0x8f, 0x9a, 0x32, 0x09, 0x0c, 0x91,
+	0xe8, 0xd0, 0x8a, 0xc6, 0x69, 0xa3, 0xf8, 0x23, 0xa1, 0xee, 0x36, 0xba, 0x75, 0x15, 0x75, 0xe8,
+	0x73, 0xc8, 0x96, 0x78, 0x3e, 0x6b, 0x5f, 0x71, 0x86, 0xb1, 0x0b, 0xac, 0x66, 0xb8, 0x3d, 0xd2,
+	0x0c, 0xff, 0xa8, 0x41, 0x76, 0xb7, 0xc1, 0xac, 0x9e, 0xc1, 0x88, 0xd0, 0x22, 0x63, 0xf5, 0x88,
+	0xaa, 0x4b, 0x42, 0xf5, 0x27, 0xf8, 0x87, 0xa3, 0x2c, 0xad, 0x6c, 0xee, 0x0a, 0x7d, 0x7c, 0xa3,
+	0xfd, 0x41, 0x83, 0x8c, 0x4e, 0x7a, 0xc4, 0x63, 0xff, 0x17, 0x43, 0x3c, 0xa1, 0x5a, 0x3e, 0x29,
+	0x97, 0x06, 0x37, 0x41, 0x34, 0x5f, 0x5e, 0xf0, 0x2d, 0x92, 0x89, 0x32, 0x16, 0x2a, 0x37, 0x50,
+	0x3e, 0x56, 0xa5, 0x4c, 0x90, 0x5f, 0x43, 0x36, 0x40, 0x6c, 0x97, 0xc4, 0x43, 0x39, 0x4c, 0xcd,
+	0xf4, 0xa9, 0xbe, 0x18, 0xdf, 0x11, 0xe4, 0x9b, 0xe8, 0x7a, 0x3c, 0xb9, 0xad, 0x1e, 0xdc, 0x14,
+	0x39, 0xb0, 0x22, 0xbd, 0x35, 0xac, 0x20, 0x0a, 0x4d, 0x0c, 0x41, 0x2a, 0xfb, 0xc3, 0x97, 0x29,
+	0xe3, 0x0e, 0x3a, 0x0d, 0x3a, 0xe8, 0x6a, 0xc9, 0xe5, 0xc5, 0x5e, 0x92, 0x49, 0x25, 0x81, 0xe5,
+	0x30, 0x76, 0x94, 0xbc, 0x66, 0x4b, 0x28, 0xc0, 0xe8, 0x46, 0xa2, 0x02, 0x3f, 0x9f, 0xf9, 0x2c,
+	0x68, 0xbd, 0xac, 0xae, 0x25, 0x5d, 0xf5, 0xd9, 0x68, 0x85, 0x8e, 0x26, 0xdd, 0xab, 0xb2, 0xb4,
+	0x87, 0x74, 0x51, 0x3d, 0x18, 0xf4, 0x1f, 0xf2, 0x4c, 0x84, 0x87, 0x6f, 0x0a, 0xdc, 0x3a, 0xba,
+	0x16, 0x87, 0x93, 0x77, 0x75, 0x0d, 0xd2, 0x03, 0x8b, 0x95, 0x53, 0x92, 0x4c, 0x5e, 0x8e, 0xa9,
+	0x08, 0x52, 0xbf, 0x74, 0x80, 0x56, 0x86, 0x94, 0x28, 0x97, 0x3c, 0x85, 0xf4, 0x09, 0xf3, 0x88,
+	0xd1, 0xae, 0x1a, 0x8d, 0x37, 0x84, 0xd1, 0x4a, 0x97, 0xa1, 0xd5, 0x90, 0xa7, 0xa5, 0xa0, 0xd2,
+	0x65, 0x89, 0x1b, 0x68, 0x6c, 0x4b, 0x43, 0x07, 0x22, 0xe5, 0x21, 0x56, 0x8f, 0x28, 0x50, 0xd9,
+	0xb9, 0xa0, 0x76, 0x10, 0xe5, 0x97, 0x1d, 0x3c, 0x76, 0x4f, 0x43, 0xcf, 0x20, 0xab, 0x30, 0xa5,
+	0x33, 0xc3, 0x69, 0x11, 0x51, 0x97, 0x4c, 0x9e, 0x72, 0x2e, 0x44, 0x0a, 0x0c, 0x11, 0xb0, 0x53,
+	0x58, 0xec, 0x2f, 0x88, 0xfc, 0x89, 0x27, 0x9c, 0x94, 0x47, 0xdd, 0x95, 0xb4, 0x59, 0x95, 0xb7,
+	0xfc, 0x35, 0xc9, 0xc8, 0xfc, 0x29, 0xf8, 0x73, 0x42, 0x5c, 0x25, 0x35, 0x1f, 0xd7, 0x88, 0x6f,
+	0x08, 0x15, 0x79, 0xdc, 0x5f, 0x90, 0x50, 0x61, 0x96, 0x1f, 0xb2, 0x97, 0xc2, 0xee, 0x20, 0x3d,
+	0xf6, 0xd1, 0x1e, 0xfc, 0x91, 0x20, 0x6a, 0x78, 0x88, 0x2a, 0x0d, 0x37, 0x21, 0x23, 0x83, 0xc5,
+	0x77, 0x33, 0xfc, 0x03, 0xa1, 0xe2, 0x7a, 0xfe, 0x02, 0x15, 0xdc, 0x7a, 0x13, 0x32, 0x32, 0x0b,
+	0xba, 0x54, 0x4b, 0xd2, 0x7e, 0x52, 0x73, 0xd9, 0xbe, 0x68, 0x2e, 0xea, 0x60, 0x84, 0x7e, 0x28,
+	0xb9, 0xf4, 0x60, 0x84, 0x3c, 0x16, 0x39, 0x18, 0x21, 0x2d, 0xe8, 0x48, 0x24, 0xdb, 0xe2, 0xea,
+	0xa1, 0xf1, 0xc9, 0xb6, 0x94, 0xf9, 0x19, 0x1c, 0x5a, 0x4f, 0xbe, 0x78, 0x28, 0xfa, 0x05, 0xcc,
+	0xfa, 0x85, 0xe3, 0x10, 0x2c, 0x97, 0x54, 0x81, 0xc6, 0xb7, 0x05, 0xf6, 0x06, 0x7e, 0x2f, 0x16,
+	0x4b, 0x89, 0xdd, 0xac, 0x31, 0x4e, 0x7b, 0x29, 0xf2, 0xa3, 0x50, 0xe1, 0x7d, 0xf8, 0xed, 0x19,
+	0xa9, 0xcc, 0x47, 0x23, 0x0f, 0x3f, 0x46, 0xbc, 0x9f, 0x7a, 0x74, 0x5a, 0x75, 0xf4, 0x19, 0xa0,
+	0x43, 0xc2, 0x86, 0x6a, 0xef, 0x43, 0x05, 0xaa, 0xb8, 0xf2, 0x7c, 0xd4, 0x1f, 0x61, 0xb6, 0xa8,
+	0xf4, 0x23, 0x0a, 0x0b, 0x27, 0x56, 0xbb, 0x6b, 0x1b, 0x8c, 0x88, 0xf1, 0x68, 0xa3, 0xef, 0x88,
+	0x60, 0xb3, 0x4e, 0x7e, 0xd3, 0x25, 0x94, 0x25, 0xdd, 0xf9, 0x91, 0xa2, 0x41, 0xd8, 0x47, 0x8a,
+	0x54, 0xe3, 0x24, 0xbe, 0x33, 0x4b, 0x30, 0xd7, 0x2f, 0xb2, 0xa3, 0x6b, 0xbe, 0xc2, 0x48, 0xf9,
+	0x3d, 0x9f, 0x2c, 0xc2, 0x63, 0xe8, 0x18, 0x40, 0xbe, 0x78, 0x44, 0x81, 0x27, 0x15, 0xcc, 0x08,
+	0x12, 0x37, 0xb4, 0x7a, 0x2a, 0xe2, 0x45, 0x6e, 0xe3, 0x60, 0xb4, 0x7a, 0xcc, 0xaa, 0x77, 0xce,
+	0x08, 0xbc, 0xc1, 0x8b, 0xac, 0x77, 0xbf, 0x18, 0x18, 0xfe, 0x58, 0xdb, 0xde, 0xb3, 0x21, 0xeb,
+	0x7a, 0x2d, 0x11, 0x17, 0x1b, 0xae, 0x67, 0x2a, 0xde, 0x5e, 0x4a, 0x56, 0x7d, 0xab, 0xe2, 0xe7,
+	0xf0, 0x5f, 0x15, 0x5a, 0x16, 0x3b, 0xeb, 0xd6, 0xb9, 0x57, 0x8b, 0x7e, 0x4f, 0xf5, 0x37, 0x07,
+	0x77, 0xfd, 0xbf, 0x40, 0xd8, 0x29, 0xb6, 0x5c, 0xd5, 0xf6, 0xb7, 0xf1, 0xd5, 0x8a, 0xcf, 0x7b,
+	0x19, 0x2c, 0x22, 0x57, 0xc7, 0xab, 0x13, 0xd5, 0xc9, 0xea, 0x54, 0x75, 0xba, 0x3a, 0x53, 0x9d,
+	0xad, 0x4f, 0x8b, 0xb1, 0x3b, 0xff, 0x0d, 0x00, 0x00, 0xff, 0xff, 0x70, 0x28, 0xbe, 0x4c, 0xcd,
+	0x20, 0x00, 0x00,
 }
 
 // Reference imports to suppress errors if they are not otherwise used.
@@ -2309,6 +2312,8 @@
 	// Simulate an Alarm
 	SimulateAlarm(ctx context.Context, in *SimulateAlarmRequest, opts ...grpc.CallOption) (*common.OperationResp, error)
 	Subscribe(ctx context.Context, in *OfAgentSubscriber, opts ...grpc.CallOption) (*OfAgentSubscriber, error)
+	EnablePort(ctx context.Context, in *Port, opts ...grpc.CallOption) (*empty.Empty, error)
+	DisablePort(ctx context.Context, in *Port, opts ...grpc.CallOption) (*empty.Empty, error)
 }
 
 type volthaServiceClient struct {
@@ -2921,6 +2926,24 @@
 	return out, nil
 }
 
+func (c *volthaServiceClient) EnablePort(ctx context.Context, in *Port, opts ...grpc.CallOption) (*empty.Empty, error) {
+	out := new(empty.Empty)
+	err := c.cc.Invoke(ctx, "/voltha.VolthaService/EnablePort", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *volthaServiceClient) DisablePort(ctx context.Context, in *Port, opts ...grpc.CallOption) (*empty.Empty, error) {
+	out := new(empty.Empty)
+	err := c.cc.Invoke(ctx, "/voltha.VolthaService/DisablePort", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
 // VolthaServiceServer is the server API for VolthaService service.
 type VolthaServiceServer interface {
 	// Get more information on a given physical device
@@ -3050,6 +3073,8 @@
 	// Simulate an Alarm
 	SimulateAlarm(context.Context, *SimulateAlarmRequest) (*common.OperationResp, error)
 	Subscribe(context.Context, *OfAgentSubscriber) (*OfAgentSubscriber, error)
+	EnablePort(context.Context, *Port) (*empty.Empty, error)
+	DisablePort(context.Context, *Port) (*empty.Empty, error)
 }
 
 func RegisterVolthaServiceServer(s *grpc.Server, srv VolthaServiceServer) {
@@ -4132,6 +4157,42 @@
 	return interceptor(ctx, in, info, handler)
 }
 
+func _VolthaService_EnablePort_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(Port)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(VolthaServiceServer).EnablePort(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/voltha.VolthaService/EnablePort",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(VolthaServiceServer).EnablePort(ctx, req.(*Port))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _VolthaService_DisablePort_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(Port)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(VolthaServiceServer).DisablePort(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/voltha.VolthaService/DisablePort",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(VolthaServiceServer).DisablePort(ctx, req.(*Port))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
 var _VolthaService_serviceDesc = grpc.ServiceDesc{
 	ServiceName: "voltha.VolthaService",
 	HandlerType: (*VolthaServiceServer)(nil),
@@ -4360,6 +4421,14 @@
 			MethodName: "Subscribe",
 			Handler:    _VolthaService_Subscribe_Handler,
 		},
+		{
+			MethodName: "EnablePort",
+			Handler:    _VolthaService_EnablePort_Handler,
+		},
+		{
+			MethodName: "DisablePort",
+			Handler:    _VolthaService_DisablePort_Handler,
+		},
 	},
 	Streams: []grpc.StreamDesc{
 		{
diff --git a/vendor/modules.txt b/vendor/modules.txt
index 12b37c1..9beacac 100644
--- a/vendor/modules.txt
+++ b/vendor/modules.txt
@@ -98,7 +98,7 @@
 github.com/modern-go/concurrent
 # github.com/modern-go/reflect2 v1.0.1
 github.com/modern-go/reflect2
-# github.com/opencord/voltha-lib-go/v3 v3.0.5
+# github.com/opencord/voltha-lib-go/v3 v3.0.6
 github.com/opencord/voltha-lib-go/v3/pkg/log
 github.com/opencord/voltha-lib-go/v3/pkg/db
 github.com/opencord/voltha-lib-go/v3/pkg/db/kvstore
@@ -111,7 +111,7 @@
 github.com/opencord/voltha-lib-go/v3/pkg/adapters/common
 github.com/opencord/voltha-lib-go/v3/pkg/adapters
 github.com/opencord/voltha-lib-go/v3/pkg/mocks
-# github.com/opencord/voltha-protos/v3 v3.2.1
+# github.com/opencord/voltha-protos/v3 v3.2.2
 github.com/opencord/voltha-protos/v3/go/common
 github.com/opencord/voltha-protos/v3/go/openflow_13
 github.com/opencord/voltha-protos/v3/go/voltha