VOL-1623-meter support and handling techprofile and fix for flow delete , now migrated to onosproject/onos:1.13.9-rc4
Change in flowupdate API towards adapters
Remove meter_get API from adapter to core
Added dependent vendor library files downloaded by "dep-ensure -update"
Added techprofile changes in the single commit
Review comments are addressed
submiting patch for integration tests for meter changes and modifications in unit test for updated flow decomposer logic
- submitting on behalf of "Salman.Siddiqui@radisys.com"
Load test for meter updated and other flow management test cases with meter
- Performed load test for 1K meters serially and parallely and added more TC in flow management
Rebased
Load test for meter updated and other flow management test cases with meter
- Performed load test for 1K meters serially and parallely and added more TC in flow management
- submitting on behalf of "Salman.Siddiqui@radisys.com"
pulled latest protos
verified EAPOL/DHCP/HSIA data with Edgecore OLT & TW ONT kit for one subcriber
verified delete/re-add is working end to end for the same subscriber
Change-Id: Idb232b7a0f05dc0c7e68266ac885740a3adff317
diff --git a/Gopkg.lock b/Gopkg.lock
index f5825ef..ab75a27 100644
--- a/Gopkg.lock
+++ b/Gopkg.lock
@@ -300,8 +300,7 @@
version = "1.0.1"
[[projects]]
- branch = "master"
- digest = "1:d586f927d55891fbfee6e6ef98ed498fed401afe2222f81ba7a472d628f4de7a"
+ digest = "1:5ede0ad5117fba74316edc0e824a820b8e3f7fa7e7a9bbbe6807a074dab26360"
name = "github.com/opencord/voltha-protos"
packages = [
"go/afrouter",
@@ -309,11 +308,12 @@
"go/inter_container",
"go/omci",
"go/openflow_13",
- "go/openolt",
+ "go/tech_profile",
"go/voltha",
]
pruneopts = "T"
- revision = "f98ca1386c16a1c767dc8642cae9d1bdae8ec43a"
+ revision = "792553b747df7f751d864f7c638aa5b667c0993e"
+ version = "1.0.0"
[[projects]]
branch = "master"
@@ -787,7 +787,7 @@
"github.com/opencord/voltha-protos/go/inter_container",
"github.com/opencord/voltha-protos/go/omci",
"github.com/opencord/voltha-protos/go/openflow_13",
- "github.com/opencord/voltha-protos/go/openolt",
+ "github.com/opencord/voltha-protos/go/tech_profile",
"github.com/opencord/voltha-protos/go/voltha",
"github.com/stretchr/testify/assert",
"go.etcd.io/etcd/clientv3",
diff --git a/Gopkg.toml b/Gopkg.toml
index b9190ae..024ee67 100644
--- a/Gopkg.toml
+++ b/Gopkg.toml
@@ -77,7 +77,7 @@
[[constraint]]
name = "github.com/opencord/voltha-protos"
- branch = "master"
+ version = "1.0.0"
[[override]]
name = "go.etcd.io/etcd"
diff --git a/adapters/common/request_handler.go b/adapters/common/request_handler.go
index 7504d37..b18f1d1 100644
--- a/adapters/common/request_handler.go
+++ b/adapters/common/request_handler.go
@@ -304,7 +304,7 @@
func (rhp *RequestHandlerProxy) Update_flows_bulk(args []*ic.Argument) (*empty.Empty, error) {
log.Debug("Update_flows_bulk")
- if len(args) < 4 {
+ if len(args) < 5 {
log.Warn("Update_flows_bulk-invalid-number-of-args", log.Fields{"args": args})
err := errors.New("invalid-number-of-args")
return nil, err
@@ -312,6 +312,7 @@
device := &voltha.Device{}
transactionID := &ic.StrType{}
flows := &voltha.Flows{}
+ flowMetadata := &voltha.FlowMetadata{}
groups := &voltha.FlowGroups{}
for _, arg := range args {
switch arg.Key {
@@ -330,6 +331,11 @@
log.Warnw("cannot-unmarshal-groups", log.Fields{"error": err})
return nil, err
}
+ case "flow_metadata":
+ if err := ptypes.UnmarshalAny(arg.Value, flowMetadata); err != nil {
+ log.Warnw("cannot-unmarshal-metadata", log.Fields{"error": err})
+ return nil, err
+ }
case kafka.TransactionKey:
if err := ptypes.UnmarshalAny(arg.Value, transactionID); err != nil {
log.Warnw("cannot-unmarshal-transaction-ID", log.Fields{"error": err})
@@ -339,7 +345,7 @@
}
log.Debugw("Update_flows_bulk", log.Fields{"flows": flows, "groups": groups})
//Invoke the bulk flow update API of the adapter
- if err := rhp.adapter.Update_flows_bulk(device, flows, groups); err != nil {
+ if err := rhp.adapter.Update_flows_bulk(device, flows, groups, flowMetadata); err != nil {
return nil, status.Errorf(codes.NotFound, "%s", err.Error())
}
return new(empty.Empty), nil
@@ -347,7 +353,7 @@
func (rhp *RequestHandlerProxy) Update_flows_incrementally(args []*ic.Argument) (*empty.Empty, error) {
log.Debug("Update_flows_incrementally")
- if len(args) < 3 {
+ if len(args) < 5 {
log.Warn("Update_flows_incrementally-invalid-number-of-args", log.Fields{"args": args})
err := errors.New("invalid-number-of-args")
return nil, err
@@ -355,6 +361,7 @@
device := &voltha.Device{}
transactionID := &ic.StrType{}
flows := &openflow_13.FlowChanges{}
+ flowMetadata := &voltha.FlowMetadata{}
groups := &openflow_13.FlowGroupChanges{}
for _, arg := range args {
switch arg.Key {
@@ -373,6 +380,11 @@
log.Warnw("cannot-unmarshal-groups", log.Fields{"error": err})
return nil, err
}
+ case "flow_metadata":
+ if err := ptypes.UnmarshalAny(arg.Value, flowMetadata); err != nil {
+ log.Warnw("cannot-unmarshal-metadata", log.Fields{"error": err})
+ return nil, err
+ }
case kafka.TransactionKey:
if err := ptypes.UnmarshalAny(arg.Value, transactionID); err != nil {
log.Warnw("cannot-unmarshal-transaction-ID", log.Fields{"error": err})
@@ -382,7 +394,7 @@
}
log.Debugw("Update_flows_incrementally", log.Fields{"flows": flows, "groups": groups})
//Invoke the incremental flow update API of the adapter
- if err := rhp.adapter.Update_flows_incrementally(device, flows, groups); err != nil {
+ if err := rhp.adapter.Update_flows_incrementally(device, flows, groups, flowMetadata); err != nil {
return nil, status.Errorf(codes.NotFound, "%s", err.Error())
}
return new(empty.Empty), nil
diff --git a/adapters/iAdapter.go b/adapters/iAdapter.go
index 05df234..82fa644 100644
--- a/adapters/iAdapter.go
+++ b/adapters/iAdapter.go
@@ -35,8 +35,8 @@
Self_test_device(device *voltha.Device) error
Delete_device(device *voltha.Device) error
Get_device_details(device *voltha.Device) error
- Update_flows_bulk(device *voltha.Device, flows *voltha.Flows, groups *voltha.FlowGroups) error
- Update_flows_incrementally(device *voltha.Device, flows *openflow_13.FlowChanges, groups *openflow_13.FlowGroupChanges) error
+ Update_flows_bulk(device *voltha.Device, flows *voltha.Flows, groups *voltha.FlowGroups, flowMetadata *voltha.FlowMetadata) error
+ Update_flows_incrementally(device *voltha.Device, flows *openflow_13.FlowChanges, groups *openflow_13.FlowGroupChanges, flowMetadata *voltha.FlowMetadata) error
Update_pm_config(device *voltha.Device, pm_configs *voltha.PmConfigs) error
Receive_packet_out(deviceId string, egress_port_no int, msg *openflow_13.OfpPacketOut) error
Suppress_alarm(filter *voltha.AlarmFilter) error
diff --git a/adapters/simulated_olt/adaptercore/device_handler.go b/adapters/simulated_olt/adaptercore/device_handler.go
index c61ca14..628e2e5 100644
--- a/adapters/simulated_olt/adaptercore/device_handler.go
+++ b/adapters/simulated_olt/adaptercore/device_handler.go
@@ -299,13 +299,13 @@
log.Debugw("DeleteDevice-end", log.Fields{"deviceId": device.Id})
}
-func (dh *DeviceHandler) UpdateFlowsBulk(device *voltha.Device, flows *voltha.Flows, groups *voltha.FlowGroups) {
+func (dh *DeviceHandler) UpdateFlowsBulk(device *voltha.Device, flows *voltha.Flows, groups *voltha.FlowGroups, metadata *voltha.FlowMetadata) {
log.Debugw("UpdateFlowsBulk", log.Fields{"deviceId": device.Id, "flows": flows, "groups": groups})
// For now we do nothing with it
return
}
-func (dh *DeviceHandler) UpdateFlowsIncremental(device *voltha.Device, flowChanges *of.FlowChanges, groupChanges *of.FlowGroupChanges) {
+func (dh *DeviceHandler) UpdateFlowsIncremental(device *voltha.Device, flowChanges *of.FlowChanges, groupChanges *of.FlowGroupChanges, metadata *voltha.FlowMetadata) {
log.Debugw("UpdateFlowsIncremental", log.Fields{"deviceId": device.Id, "flowChanges": flowChanges, "groupChanges": groupChanges})
// For now we do nothing with it
return
diff --git a/adapters/simulated_olt/adaptercore/simulated_olt.go b/adapters/simulated_olt/adaptercore/simulated_olt.go
index 2204a6e..29785c4 100644
--- a/adapters/simulated_olt/adaptercore/simulated_olt.go
+++ b/adapters/simulated_olt/adaptercore/simulated_olt.go
@@ -228,7 +228,7 @@
return errors.New("UnImplemented")
}
-func (so *SimulatedOLT) Update_flows_bulk(device *voltha.Device, flows *voltha.Flows, groups *voltha.FlowGroups) error {
+func (so *SimulatedOLT) Update_flows_bulk(device *voltha.Device, flows *voltha.Flows, groups *voltha.FlowGroups, metadata *voltha.FlowMetadata) error {
if device == nil {
log.Warn("device-is-nil")
return errors.New("nil-device")
@@ -236,12 +236,12 @@
log.Debugw("bulk-flow-updates", log.Fields{"deviceId": device.Id, "flows": flows, "groups": groups})
var handler *DeviceHandler
if handler = so.getDeviceHandler(device.Id); handler != nil {
- go handler.UpdateFlowsBulk(device, flows, groups)
+ go handler.UpdateFlowsBulk(device, flows, groups, metadata)
}
return nil
}
-func (so *SimulatedOLT) Update_flows_incrementally(device *voltha.Device, flowChanges *openflow_13.FlowChanges, groupChanges *openflow_13.FlowGroupChanges) error {
+func (so *SimulatedOLT) Update_flows_incrementally(device *voltha.Device, flowChanges *openflow_13.FlowChanges, groupChanges *openflow_13.FlowGroupChanges, metadata *voltha.FlowMetadata) error {
if device == nil {
log.Warn("device-is-nil")
return errors.New("nil-device")
@@ -249,7 +249,7 @@
log.Debugw("incremental-flow-update", log.Fields{"deviceId": device.Id, "flowChanges": flowChanges, "groupChanges": groupChanges})
var handler *DeviceHandler
if handler = so.getDeviceHandler(device.Id); handler != nil {
- go handler.UpdateFlowsIncremental(device, flowChanges, groupChanges)
+ go handler.UpdateFlowsIncremental(device, flowChanges, groupChanges, metadata)
}
return nil
}
diff --git a/adapters/simulated_onu/adaptercore/device_handler.go b/adapters/simulated_onu/adaptercore/device_handler.go
index f0ed677..fa41136 100644
--- a/adapters/simulated_onu/adaptercore/device_handler.go
+++ b/adapters/simulated_onu/adaptercore/device_handler.go
@@ -285,13 +285,13 @@
log.Debugw("DeleteDevice-end", log.Fields{"deviceId": device.Id})
}
-func (dh *DeviceHandler) UpdateFlowsBulk(device *voltha.Device, flows *voltha.Flows, groups *voltha.FlowGroups) {
+func (dh *DeviceHandler) UpdateFlowsBulk(device *voltha.Device, flows *voltha.Flows, groups *voltha.FlowGroups, metadata *voltha.FlowMetadata) {
log.Debugw("UpdateFlowsBulk", log.Fields{"deviceId": device.Id, "flows": flows, "groups": groups})
// For now we do nothing with it
return
}
-func (dh *DeviceHandler) UpdateFlowsIncremental(device *voltha.Device, flowChanges *of.FlowChanges, groupChanges *of.FlowGroupChanges) {
+func (dh *DeviceHandler) UpdateFlowsIncremental(device *voltha.Device, flowChanges *of.FlowChanges, groupChanges *of.FlowGroupChanges, metadata *voltha.FlowMetadata) {
log.Debugw("UpdateFlowsIncremental", log.Fields{"deviceId": device.Id, "flowChanges": flowChanges, "groupChanges": groupChanges})
// For now we do nothing with it
return
diff --git a/adapters/simulated_onu/adaptercore/simulated_onu.go b/adapters/simulated_onu/adaptercore/simulated_onu.go
index 142c9c9..bb23acf 100644
--- a/adapters/simulated_onu/adaptercore/simulated_onu.go
+++ b/adapters/simulated_onu/adaptercore/simulated_onu.go
@@ -221,7 +221,7 @@
return errors.New("UnImplemented")
}
-func (so *SimulatedONU) Update_flows_bulk(device *voltha.Device, flows *voltha.Flows, groups *voltha.FlowGroups) error {
+func (so *SimulatedONU) Update_flows_bulk(device *voltha.Device, flows *voltha.Flows, groups *voltha.FlowGroups, metadata *voltha.FlowMetadata) error {
if device == nil {
log.Warn("device-is-nil")
return errors.New("nil-device")
@@ -229,12 +229,12 @@
log.Debugw("bulk-flow-updates", log.Fields{"deviceId": device.Id, "flows": flows, "groups": groups})
var handler *DeviceHandler
if handler = so.getDeviceHandler(device.Id); handler != nil {
- go handler.UpdateFlowsBulk(device, flows, groups)
+ go handler.UpdateFlowsBulk(device, flows, groups, metadata)
}
return nil
}
-func (so *SimulatedONU) Update_flows_incrementally(device *voltha.Device, flowChanges *openflow_13.FlowChanges, groupChanges *openflow_13.FlowGroupChanges) error {
+func (so *SimulatedONU) Update_flows_incrementally(device *voltha.Device, flowChanges *openflow_13.FlowChanges, groupChanges *openflow_13.FlowGroupChanges, metadata *voltha.FlowMetadata) error {
if device == nil {
log.Warn("device-is-nil")
return errors.New("nil-device")
@@ -242,7 +242,7 @@
log.Debugw("incremental-flow-update", log.Fields{"deviceId": device.Id, "flowChanges": flowChanges, "groupChanges": groupChanges})
var handler *DeviceHandler
if handler = so.getDeviceHandler(device.Id); handler != nil {
- go handler.UpdateFlowsIncremental(device, flowChanges, groupChanges)
+ go handler.UpdateFlowsIncremental(device, flowChanges, groupChanges, metadata)
}
return nil
}
diff --git a/common/core/northbound/grpc/default_api_handler.go b/common/core/northbound/grpc/default_api_handler.go
index 5f8148d..6ac7599 100644
--- a/common/core/northbound/grpc/default_api_handler.go
+++ b/common/core/northbound/grpc/default_api_handler.go
@@ -313,3 +313,13 @@
log.Debugw("Subscribe-request", log.Fields{"ofAgent": ofAgent})
return nil, errors.New("UnImplemented")
}
+
+func (handler *DefaultAPIHandler) UpdateLogicalDeviceMeterTable(ctx context.Context, mod *openflow_13.MeterModUpdate) (*empty.Empty, error) {
+ log.Debugw("UpdateLogicalDeviceMeterTable-request", log.Fields{"meter": mod})
+ return nil, errors.New("UnImplemented")
+}
+
+func (handler *DefaultAPIHandler) ListLogicalDeviceMeters(ctx context.Context, id *voltha.ID) (*openflow_13.Meters, error) {
+ log.Debugw("ListLogicalDeviceMeters-unimplemented", log.Fields{"id": id})
+ return nil, nil
+}
diff --git a/common/techprofile/tech_profile.go b/common/techprofile/tech_profile.go
index e41e064..2799802 100644
--- a/common/techprofile/tech_profile.go
+++ b/common/techprofile/tech_profile.go
@@ -25,7 +25,7 @@
"github.com/opencord/voltha-go/common/log"
"github.com/opencord/voltha-go/db/kvstore"
"github.com/opencord/voltha-go/db/model"
- openolt_pb "github.com/opencord/voltha-protos/go/openolt"
+ tp_pb "github.com/opencord/voltha-protos/go/tech_profile"
)
// Interface to pon resource manager APIs
@@ -171,8 +171,8 @@
PbitMap string `json:"pbit_map"`
AesEncryption string `json:"aes_encryption"`
SchedulingPolicy string `json:"scheduling_policy"`
- PriorityQueue int `json:"priority_q"`
- Weight int `json:"weight"`
+ PriorityQueue uint32 `json:"priority_q"`
+ Weight uint32 `json:"weight"`
DiscardPolicy string `json:"discard_policy"`
DiscardConfig DiscardConfig `json:"discard_config"`
}
@@ -191,8 +191,8 @@
PbitMap string `json:"pbit_map"`
AesEncryption string `json:"aes_encryption"`
SchedulingPolicy string `json:"scheduling_policy"`
- PriorityQueue int `json:"priority_q"`
- Weight int `json:"weight"`
+ PriorityQueue uint32 `json:"priority_q"`
+ Weight uint32 `json:"weight"`
DiscardPolicy string `json:"discard_policy"`
DiscardConfig DiscardConfig `json:"discard_config"`
}
@@ -442,6 +442,7 @@
var dsGemPortAttributeList []GemPortAttribute
for _, pbit := range t.config.DefaultPbits {
+ log.Debugw("Creating GEM port", log.Fields{"pbit": pbit})
usGemPortAttributeList = append(usGemPortAttributeList,
GemPortAttribute{
MaxQueueSize: defaultMaxQueueSize,
@@ -498,26 +499,26 @@
var result int32 = -1
if paramType == "direction" {
- for key, val := range openolt_pb.Direction_value {
+ for key, val := range tp_pb.Direction_value {
if key == paramKey {
result = val
}
}
} else if paramType == "discard_policy" {
- for key, val := range openolt_pb.DiscardPolicy_value {
+ for key, val := range tp_pb.DiscardPolicy_value {
if key == paramKey {
result = val
}
}
} else if paramType == "sched_policy" {
- for key, val := range openolt_pb.SchedulingPolicy_value {
+ for key, val := range tp_pb.SchedulingPolicy_value {
if key == paramKey {
log.Debugw("Got value in proto", log.Fields{"key": key, "value": val})
result = val
}
}
} else if paramType == "additional_bw" {
- for key, val := range openolt_pb.AdditionalBW_value {
+ for key, val := range tp_pb.AdditionalBW_value {
if key == paramKey {
result = val
}
@@ -530,23 +531,23 @@
return result
}
-func (t *TechProfileMgr) GetUsScheduler(tpInstance *TechProfile) *openolt_pb.Scheduler {
- dir := openolt_pb.Direction(t.GetprotoBufParamValue("direction", tpInstance.UsScheduler.Direction))
+func (t *TechProfileMgr) GetUsScheduler(tpInstance *TechProfile) *tp_pb.SchedulerConfig {
+ dir := tp_pb.Direction(t.GetprotoBufParamValue("direction", tpInstance.UsScheduler.Direction))
if dir == -1 {
log.Fatal("Error in getting Proto for direction for upstream scheduler")
return nil
}
- bw := openolt_pb.AdditionalBW(t.GetprotoBufParamValue("additional_bw", tpInstance.UsScheduler.AdditionalBw))
+ bw := tp_pb.AdditionalBW(t.GetprotoBufParamValue("additional_bw", tpInstance.UsScheduler.AdditionalBw))
if bw == -1 {
log.Fatal("Error in getting Proto for bandwidth for upstream scheduler")
return nil
}
- policy := openolt_pb.SchedulingPolicy(t.GetprotoBufParamValue("sched_policy", tpInstance.UsScheduler.QSchedPolicy))
+ policy := tp_pb.SchedulingPolicy(t.GetprotoBufParamValue("sched_policy", tpInstance.UsScheduler.QSchedPolicy))
if policy == -1 {
log.Fatal("Error in getting Proto for scheduling policy for upstream scheduler")
return nil
}
- return &openolt_pb.Scheduler{
+ return &tp_pb.SchedulerConfig{
Direction: dir,
AdditionalBw: bw,
Priority: tpInstance.UsScheduler.Priority,
@@ -554,25 +555,25 @@
SchedPolicy: policy}
}
-func (t *TechProfileMgr) GetDsScheduler(tpInstance *TechProfile) *openolt_pb.Scheduler {
+func (t *TechProfileMgr) GetDsScheduler(tpInstance *TechProfile) *tp_pb.SchedulerConfig {
- dir := openolt_pb.Direction(t.GetprotoBufParamValue("direction", tpInstance.DsScheduler.Direction))
+ dir := tp_pb.Direction(t.GetprotoBufParamValue("direction", tpInstance.DsScheduler.Direction))
if dir == -1 {
log.Fatal("Error in getting Proto for direction for downstream scheduler")
return nil
}
- bw := openolt_pb.AdditionalBW(t.GetprotoBufParamValue("additional_bw", tpInstance.DsScheduler.AdditionalBw))
+ bw := tp_pb.AdditionalBW(t.GetprotoBufParamValue("additional_bw", tpInstance.DsScheduler.AdditionalBw))
if bw == -1 {
log.Fatal("Error in getting Proto for bandwidth for downstream scheduler")
return nil
}
- policy := openolt_pb.SchedulingPolicy(t.GetprotoBufParamValue("sched_policy", tpInstance.DsScheduler.QSchedPolicy))
+ policy := tp_pb.SchedulingPolicy(t.GetprotoBufParamValue("sched_policy", tpInstance.DsScheduler.QSchedPolicy))
if policy == -1 {
log.Fatal("Error in getting Proto for scheduling policy for downstream scheduler")
return nil
}
- return &openolt_pb.Scheduler{
+ return &tp_pb.SchedulerConfig{
Direction: dir,
AdditionalBw: bw,
Priority: tpInstance.DsScheduler.Priority,
@@ -580,33 +581,112 @@
SchedPolicy: policy}
}
-func (t *TechProfileMgr) GetTconts(tpInstance *TechProfile, usSched *openolt_pb.Scheduler, dsSched *openolt_pb.Scheduler) []*openolt_pb.Tcont {
- if usSched == nil {
- if usSched = t.GetUsScheduler(tpInstance); usSched == nil {
- log.Fatal("Error in getting upstream scheduler from techprofile")
- return nil
+func (t *TechProfileMgr) GetTrafficScheduler(tpInstance *TechProfile, SchedCfg *tp_pb.SchedulerConfig,
+ ShapingCfg *tp_pb.TrafficShapingInfo) *tp_pb.TrafficScheduler {
+
+ tSched := &tp_pb.TrafficScheduler{
+ Direction: SchedCfg.Direction,
+ AllocId: tpInstance.UsScheduler.AllocID,
+ TrafficShapingInfo: ShapingCfg,
+ Scheduler: SchedCfg}
+
+ return tSched
+}
+
+func (tpm *TechProfileMgr) GetTrafficQueues(tp *TechProfile, Dir tp_pb.Direction) []*tp_pb.TrafficQueue {
+
+ var encryp bool
+ if Dir == tp_pb.Direction_UPSTREAM {
+ // upstream GEM ports
+ NumGemPorts := len(tp.UpstreamGemPortAttributeList)
+ GemPorts := make([]*tp_pb.TrafficQueue, 0)
+ for Count := 0; Count < NumGemPorts; Count++ {
+ if tp.UpstreamGemPortAttributeList[Count].AesEncryption == "True" {
+ encryp = true
+ } else {
+ encryp = false
+ }
+ GemPorts = append(GemPorts, &tp_pb.TrafficQueue{
+ Direction: tp_pb.Direction(tpm.GetprotoBufParamValue("direction", tp.UsScheduler.Direction)),
+ GemportId: tp.UpstreamGemPortAttributeList[Count].GemportID,
+ PbitMap: tp.UpstreamGemPortAttributeList[Count].PbitMap,
+ AesEncryption: encryp,
+ SchedPolicy: tp_pb.SchedulingPolicy(tpm.GetprotoBufParamValue("sched_policy", tp.UpstreamGemPortAttributeList[Count].SchedulingPolicy)),
+ Priority: tp.UpstreamGemPortAttributeList[Count].PriorityQueue,
+ Weight: tp.UpstreamGemPortAttributeList[Count].Weight,
+ DiscardPolicy: tp_pb.DiscardPolicy(tpm.GetprotoBufParamValue("discard_policy", tp.UpstreamGemPortAttributeList[Count].DiscardPolicy)),
+ })
+ }
+ log.Debugw("Upstream Traffic queue list ", log.Fields{"queuelist": GemPorts})
+ return GemPorts
+ } else if Dir == tp_pb.Direction_DOWNSTREAM {
+ //downstream GEM ports
+ NumGemPorts := len(tp.DownstreamGemPortAttributeList)
+ GemPorts := make([]*tp_pb.TrafficQueue, 0)
+ for Count := 0; Count < NumGemPorts; Count++ {
+ if tp.DownstreamGemPortAttributeList[Count].AesEncryption == "True" {
+ encryp = true
+ } else {
+ encryp = false
+ }
+ GemPorts = append(GemPorts, &tp_pb.TrafficQueue{
+ Direction: tp_pb.Direction(tpm.GetprotoBufParamValue("direction", tp.DsScheduler.Direction)),
+ GemportId: tp.DownstreamGemPortAttributeList[Count].GemportID,
+ PbitMap: tp.DownstreamGemPortAttributeList[Count].PbitMap,
+ AesEncryption: encryp,
+ SchedPolicy: tp_pb.SchedulingPolicy(tpm.GetprotoBufParamValue("sched_policy", tp.DownstreamGemPortAttributeList[Count].SchedulingPolicy)),
+ Priority: tp.DownstreamGemPortAttributeList[Count].PriorityQueue,
+ Weight: tp.DownstreamGemPortAttributeList[Count].Weight,
+ DiscardPolicy: tp_pb.DiscardPolicy(tpm.GetprotoBufParamValue("discard_policy", tp.DownstreamGemPortAttributeList[Count].DiscardPolicy)),
+ })
+ }
+ log.Debugw("Downstream Traffic queue list ", log.Fields{"queuelist": GemPorts})
+ return GemPorts
+ }
+ return nil
+}
+
+func (tpm *TechProfileMgr) GetUsTrafficScheduler(tp *TechProfile) *tp_pb.TrafficScheduler {
+ UsScheduler := tpm.GetUsScheduler(tp)
+
+ return &tp_pb.TrafficScheduler{Direction: UsScheduler.Direction,
+ AllocId: tp.UsScheduler.AllocID,
+ Scheduler: UsScheduler}
+}
+
+func (t *TechProfileMgr) GetGemportIDForPbit(tp *TechProfile, Dir tp_pb.Direction, pbit uint32) uint32 {
+ /*
+ Function to get the Gemport ID mapped to a pbit.
+ */
+ if Dir == tp_pb.Direction_UPSTREAM {
+ // upstream GEM ports
+ NumGemPorts := len(tp.UpstreamGemPortAttributeList)
+ for Count := 0; Count < NumGemPorts; Count++ {
+ NumPbitMaps := len(tp.UpstreamGemPortAttributeList[Count].PbitMap)
+ for ICount := 2; ICount < NumPbitMaps; ICount++ {
+ if p, err := strconv.Atoi(string(tp.UpstreamGemPortAttributeList[Count].PbitMap[ICount])); err == nil {
+ if uint32(ICount-2) == pbit && p == 1 { // Check this p-bit is set
+ log.Debugw("Found-US-GEMport-for-Pcp", log.Fields{"pbit": pbit, "GEMport": tp.UpstreamGemPortAttributeList[Count].GemportID})
+ return tp.UpstreamGemPortAttributeList[Count].GemportID
+ }
+ }
+ }
+ }
+ } else if Dir == tp_pb.Direction_DOWNSTREAM {
+ //downstream GEM ports
+ NumGemPorts := len(tp.DownstreamGemPortAttributeList)
+ for Count := 0; Count < NumGemPorts; Count++ {
+ NumPbitMaps := len(tp.DownstreamGemPortAttributeList[Count].PbitMap)
+ for ICount := 2; ICount < NumPbitMaps; ICount++ {
+ if p, err := strconv.Atoi(string(tp.DownstreamGemPortAttributeList[Count].PbitMap[ICount])); err == nil {
+ if uint32(ICount-2) == pbit && p == 1 { // Check this p-bit is set
+ log.Debugw("Found-DS-GEMport-for-Pcp", log.Fields{"pbit": pbit, "GEMport": tp.DownstreamGemPortAttributeList[Count].GemportID})
+ return tp.DownstreamGemPortAttributeList[Count].GemportID
+ }
+ }
+ }
}
}
- if dsSched == nil {
- if dsSched = t.GetDsScheduler(tpInstance); dsSched == nil {
- log.Fatal("Error in getting downstream scheduler from techprofile")
- return nil
- }
- }
- tconts := []*openolt_pb.Tcont{}
- // upstream scheduler
- tcont_us := &openolt_pb.Tcont{
- Direction: usSched.Direction,
- AllocId: tpInstance.UsScheduler.AllocID,
- Scheduler: usSched} /*TrafficShapingInfo: ? */
- tconts = append(tconts, tcont_us)
-
- // downstream scheduler
- tcont_ds := &openolt_pb.Tcont{
- Direction: dsSched.Direction,
- AllocId: tpInstance.DsScheduler.AllocID,
- Scheduler: dsSched}
-
- tconts = append(tconts, tcont_ds)
- return tconts
+ log.Errorw("No-GemportId-Found-For-Pcp", log.Fields{"pcpVlan": pbit})
+ return 0
}
diff --git a/python/cli/logical_device.py b/python/cli/logical_device.py
index 187dd88..a49f6f8 100644
--- a/python/cli/logical_device.py
+++ b/python/cli/logical_device.py
@@ -96,6 +96,16 @@
groups=logical_device['flow_groups']['items']
)
+ def do_meters(self, _):
+ """Show flow meter table for logical device"""
+ logical_device = pb2dict(self.get_logical_device(-1))
+ print_meters(
+ 'Logical Device',
+ self.logical_device_id,
+ type='n/a',
+ meters=logical_device['meters']['items']
+ )
+
def do_devices(self, line):
"""List devices that belong to this logical device"""
logical_device = self.get_logical_device()
diff --git a/python/cli/utils.py b/python/cli/utils.py
index 1f72be3..7668b7c 100644
--- a/python/cli/utils.py
+++ b/python/cli/utils.py
@@ -140,15 +140,21 @@
for instruction in flow['instructions']:
itype = instruction['type']
- if itype == 4:
+ if itype == 4 or itype == 3:
for action in instruction['actions']['actions']:
atype = action['type'][len('OFPAT_'):]
table.add_cell(i, *action_printers[atype](action))
elif itype == 1:
table.add_cell(i, 10000, 'goto-table',
instruction['goto_table']['table_id'])
+ elif itype == 2:
+ table.add_cell(i, 10001, 'write-metadata',
+ instruction['write_metadata']['metadata'])
elif itype == 5:
- table.add_cell(i, 10000, 'clear-actions', [])
+ table.add_cell(i, 10002, 'clear-actions', [])
+ elif itype == 6:
+ table.add_cell(i, 10003, 'meter',
+ instruction['meter']['meter_id'])
else:
raise NotImplementedError(
'not handling instruction type {}'.format(itype))
@@ -177,6 +183,26 @@
table.print_table(header, printfn)
+def print_meters(what, id, type, meters, printfn=_printfn):
+ header = ''.join([
+ '{} '.format(what),
+ colored(id, color='green', attrs=['bold']),
+ ' (type: ',
+ colored(type, color='blue'),
+ ')'
+ ]) + '\nMeters ({}):'.format(len(meters))
+
+ table = TablePrinter()
+ for i, meter in enumerate(meters):
+ bands = []
+ for meter_band in meter['config']['bands']:
+ bands.append(meter_band)
+ table.add_cell(i, 0, 'meter_id', value=str(meter['config']['meter_id']))
+ table.add_cell(i, 1, 'meter_bands', value=str(dict(bands=bands)))
+
+ table.print_table(header, printfn)
+
+
def dict2line(d):
assert isinstance(d, dict)
return ', '.join('{}: {}'.format(k, v) for k, v in sorted(d.items()))
diff --git a/python/ofagent/converter.py b/python/ofagent/converter.py
index 185fb59..6280331 100755
--- a/python/ofagent/converter.py
+++ b/python/ofagent/converter.py
@@ -65,6 +65,24 @@
kw = pb2dict(pb)
return of13.port_stats_entry(**kw)
+
+def ofp_meter_stats_to_loxi_meter_stats(pb):
+ return of13.meter_stats(
+ meter_id=pb.meter_id,
+ flow_count=pb.flow_count,
+ packet_in_count=pb.packet_in_count,
+ byte_in_count=pb.byte_in_count,
+ duration_sec=pb.duration_sec,
+ duration_nsec=pb.duration_nsec,
+ band_stats=[to_loxi(band_stat) for band_stat in pb.band_stats])
+
+
+def ofp_meter_band_stats_to_loxi_meter_stats(pb):
+ return of13.meter_band_stats(
+ packet_band_count=pb.packet_band_count,
+ byte_band_count=pb.byte_band_count
+ )
+
def make_loxi_field(oxm_field):
assert oxm_field['oxm_class'] == pb2.OFPXMC_OPENFLOW_BASIC
ofb_field = oxm_field['ofb_field']
@@ -179,6 +197,7 @@
elif type == pb2.OFPIT_METER:
return of13.instruction.meter(
meter_id=inst['meter']['meter_id'])
+
else:
raise NotImplementedError('Instruction type %d' % type)
@@ -244,7 +263,9 @@
'ofp_bucket_counter': ofp_bucket_counter_to_loxy_bucket_counter,
'ofp_bucket': ofp_bucket_to_loxi_bucket,
'ofp_action': make_loxi_action,
- 'ofp_port_stats': ofp_port_stats_to_loxi_port_stats
+ 'ofp_port_stats': ofp_port_stats_to_loxi_port_stats,
+ 'ofp_meter_stats': ofp_meter_stats_to_loxi_meter_stats,
+ 'ofp_meter_band_stats': ofp_meter_band_stats_to_loxi_meter_stats
}
@@ -264,6 +285,97 @@
match=to_grpc(lo.match),
instructions=[to_grpc(i) for i in lo.instructions])
+def loxi_meter_mod_to_ofp_meter_mod(lo):
+ return pb2.ofp_meter_mod(
+ command=lo.command,
+ flags=lo.flags,
+ meter_id=lo.meter_id,
+ bands=[to_grpc(i) for i in lo.meters])
+
+
+def loxi_meter_band_drop_to_ofp_meter_band_drop(lo):
+ return pb2.ofp_meter_band_header(
+ type=lo.type,
+ rate=lo.rate,
+ burst_size=lo.burst_size)
+
+
+def loxi_meter_band_dscp_remark_to_ofp_meter_band_dscp_remark(lo):
+ return pb2.ofp_meter_band_header(
+ type=lo.type,
+ rate=lo.rate,
+ burst_size=lo.burst_size,
+ dscp_remark=pb2.ofp_meter_band_dscp_remark(prec_level=lo.prec_level))
+
+
+def loxi_meter_band_experimenter_to_ofp_meter_band_experimenter(lo):
+ return pb2.ofp_meter_band_header(
+ type=lo.type,
+ rate=lo.rate,
+ burst_size=lo.burst_size,
+ experimenter=pb2.ofp_meter_band_experimenter(experimenter=lo.experimenter))
+
+
+def loxi_meter_multipart_request_to_ofp_meter_multipart_request(lo):
+ return pb2.ofp_meter_multipart_request(
+ meter_id=lo.meter_id)
+
+
+def loxi_meter_stats_to_ofp_meter_stats(lo):
+ return pb2.ofp_meter_stats(
+ meter_id=lo.meter_id,
+ flow_count=lo.flow_count,
+ packet_in_count =lo.packet_in_count,
+ byte_in_count=lo.byte_in_count,
+ duration_sec=lo.duration_sec,
+ duration_nsec=lo.duration_nsec,
+ band_stats=lo.band_stats)
+
+
+def loxi_meter_mod_to_ofp_meter_mod(lo):
+ return pb2.ofp_meter_mod(
+ command=lo.command,
+ flags=lo.flags,
+ meter_id=lo.meter_id,
+ bands=[to_grpc(i) for i in lo.meters])
+
+
+def loxi_meter_band_drop_to_ofp_meter_band_drop(lo):
+ return pb2.ofp_meter_band_header(
+ type=lo.type,
+ rate=lo.rate,
+ burst_size=lo.burst_size)
+
+
+def loxi_meter_band_dscp_remark_to_ofp_meter_band_dscp_remark(lo):
+ return pb2.ofp_meter_band_header(
+ type=lo.type,
+ rate=lo.rate,
+ burst_size=lo.burst_size,
+ dscp_remark=pb2.ofp_meter_band_dscp_remark(prec_level=lo.prec_level))
+
+
+def loxi_meter_band_experimenter_to_ofp_meter_band_experimenter(lo):
+ return pb2.ofp_meter_band_header(
+ type=lo.type,
+ rate=lo.rate,
+ burst_size=lo.burst_size,
+ experimenter=pb2.ofp_meter_band_experimenter(experimenter=lo.experimenter))
+
+
+def loxi_meter_multipart_request_to_ofp_meter_multipart_request(lo):
+ return pb2.ofp_meter_multipart_request(
+ meter_id=lo.meter_id)
+
+def loxi_meter_stats_to_ofp_meter_stats(lo):
+ return pb2.ofp_meter_stats(
+ meter_id=lo.meter_id,
+ flow_count=lo.flow_count,
+ packet_in_count =lo.packet_in_count,
+ byte_in_count=lo.byte_in_count,
+ duration_sec=lo.duration_sec,
+ duration_nsec=lo.duration_nsec,
+ band_stats=lo.band_stats)
def loxi_group_mod_to_ofp_group_mod(lo):
return pb2.ofp_group_mod(
@@ -384,12 +496,39 @@
goto_table=pb2.ofp_instruction_goto_table(table_id=lo.table_id))
+def loxi_write_metadata_to_ofp_instruction(lo):
+ return pb2.ofp_instruction(
+ type=pb2.OFPIT_WRITE_METADATA,
+ write_metadata=pb2.ofp_instruction_write_metadata(
+ metadata=lo.metadata,
+ metadata_mask=lo.metadata_mask))
+
+
+def loxi_meter_to_ofp_instruction(lo):
+ return pb2.ofp_instruction(
+ type=pb2.OFPIT_METER,
+ meter=pb2.ofp_instruction_meter(meter_id=lo.meter_id))
+
+
def loxi_output_action_to_ofp_action(lo):
return pb2.ofp_action(
type=pb2.OFPAT_OUTPUT,
output=pb2.ofp_action_output(port=lo.port, max_len=lo.max_len))
+def loxi_write_actions_to_ofp_instruction(lo):
+ return pb2.ofp_instruction(
+ type=pb2.OFPIT_WRITE_ACTIONS,
+ actions=pb2.ofp_instruction_actions(
+ actions=[to_grpc(a) for a in lo.actions]))
+
+
+def loxi_meter_to_ofp_instruction(lo):
+ return pb2.ofp_instruction(
+ type=pb2.OFPIT_METER,
+ meter=pb2.ofp_instruction_meter(meter_id=lo.meter_id))
+
+
def loxi_group_action_to_ofp_action(lo):
return pb2.ofp_action(
type=pb2.OFPAT_GROUP,
@@ -419,12 +558,18 @@
of13.message.flow_delete_strict: loxi_flow_mod_to_ofp_flow_mod,
of13.message.flow_modify: loxi_flow_mod_to_ofp_flow_mod,
of13.message.flow_modify_strict: loxi_flow_mod_to_ofp_flow_mod,
+ of13.message.meter_mod: loxi_meter_mod_to_ofp_meter_mod,
+ of13.message.meter_stats_request: loxi_meter_stats_to_ofp_meter_stats,
of13.message.group_add: loxi_group_mod_to_ofp_group_mod,
of13.message.group_delete: loxi_group_mod_to_ofp_group_mod,
of13.message.group_modify: loxi_group_mod_to_ofp_group_mod,
of13.message.packet_out: loxi_packet_out_to_ofp_packet_out,
+ of13.meter_band.drop: loxi_meter_band_drop_to_ofp_meter_band_drop,
+ of13.meter_band.dscp_remark: loxi_meter_band_dscp_remark_to_ofp_meter_band_dscp_remark,
+ of13.meter_band.experimenter: loxi_meter_band_experimenter_to_ofp_meter_band_experimenter,
+
of13.common.match_v3: loxi_match_v3_to_ofp_match,
of13.common.bucket: loxi_bucket_to_ofp_bucket,
@@ -440,7 +585,10 @@
of13.instruction.apply_actions: loxi_apply_actions_to_ofp_instruction,
of13.instruction.clear_actions: loxi_clear_actions_to_ofp_instruction,
+ of13.instruction.write_actions: loxi_write_actions_to_ofp_instruction,
of13.instruction.goto_table: loxi_goto_table_to_ofp_instruction,
+ of13.instruction.write_metadata: loxi_write_metadata_to_ofp_instruction,
+ of13.instruction.meter: loxi_meter_to_ofp_instruction,
of13.action.output: loxi_output_action_to_ofp_action,
of13.action.group: loxi_group_action_to_ofp_action,
diff --git a/python/ofagent/grpc_client.py b/python/ofagent/grpc_client.py
index 42e8510..e4b260e 100755
--- a/python/ofagent/grpc_client.py
+++ b/python/ofagent/grpc_client.py
@@ -29,7 +29,7 @@
from twisted.internet.defer import inlineCallbacks, returnValue, DeferredQueue
from voltha_protos.voltha_pb2_grpc import VolthaServiceStub
-from voltha_protos.voltha_pb2 import ID, FlowTableUpdate, \
+from voltha_protos.voltha_pb2 import ID, FlowTableUpdate, MeterModUpdate, \
FlowGroupTableUpdate, PacketOut
from voltha_protos.logical_device_pb2 import LogicalPortId
from google.protobuf import empty_pb2
@@ -246,6 +246,20 @@
returnValue(res)
@inlineCallbacks
+ def update_meter_mod_table(self, device_id, meter_mod):
+ log.debug('In update_meter_mod_table grpc')
+ req = MeterModUpdate(
+ id=device_id,
+ meter_mod=meter_mod
+ )
+ res = yield threads.deferToThread(
+ self.grpc_stub.UpdateLogicalDeviceMeterTable, req, timeout=self.grpc_timeout,
+ metadata=((self.core_group_id_key, self.core_group_id),
+ self.get_core_transaction_metadata(),))
+ log.debug('update_meter_mod_table grpc done')
+ returnValue(res)
+
+ @inlineCallbacks
def update_group_table(self, device_id, group_mod):
req = FlowGroupTableUpdate(
id=device_id,
@@ -310,3 +324,14 @@
self.core_group_id = pair[1]
log.debug('core-binding', core_group=self.core_group_id)
returnValue(res)
+
+ @inlineCallbacks
+ def list_meters(self, device_id):
+ log.debug('list_meters')
+ req = ID(id=device_id)
+ res = yield threads.deferToThread(
+ self.grpc_stub.ListLogicalDeviceMeters, req, timeout=self.grpc_timeout,
+ metadata=((self.core_group_id_key, self.core_group_id),
+ self.get_core_transaction_metadata(),))
+ log.debug('done stat query', resp=res)
+ returnValue(res.items)
diff --git a/python/ofagent/of_protocol_handler.py b/python/ofagent/of_protocol_handler.py
index 604ce3c..e90ca5b 100755
--- a/python/ofagent/of_protocol_handler.py
+++ b/python/ofagent/of_protocol_handler.py
@@ -29,6 +29,10 @@
ofp_version = [4] # OFAgent supported versions
+ MAX_METER_IDS = 4294967295
+ MAX_METER_BANDS = 255
+ MAX_METER_COLORS = 255
+
def __init__(self, datapath_id, device_id, agent, cxn, rpc):
"""
The upper half of the OpenFlow protocol, focusing on message
@@ -128,6 +132,30 @@
elif self.role == ofp.OFPCR_ROLE_SLAVE:
self.cxn.send(ofp.message.bad_request_error_msg(code=ofp.OFPBRC_IS_SLAVE))
+
+ def handle_meter_mod_request(self, req):
+ log.info('Received handle_meter_mod_request', request=req)
+ if self.role == ofp.OFPCR_ROLE_MASTER or self.role == ofp.OFPCR_ROLE_EQUAL:
+ try:
+ grpc_req = to_grpc(req)
+ except Exception, e:
+ log.exception('failed-to-convert-meter-mod-request', e=e)
+ else:
+ return self.rpc.update_meter_mod_table(self.device_id, grpc_req)
+
+ elif self.role == ofp.OFPCR_ROLE_SLAVE:
+ self.cxn.send(ofp.message.bad_request_error_msg(code=ofp.OFPBRC_IS_SLAVE))
+
+ @inlineCallbacks
+ def handle_meter_stats_request(self, req):
+ log.info('Received handle_meter_stats_request', request=req)
+ try:
+ meters = yield self.rpc.list_meters(self.device_id)
+ self.cxn.send(ofp.message.meter_stats_reply(
+ xid=req.xid, entries=[to_loxi(m.stats) for m in meters]))
+ except Exception, e:
+ log.exception("failed-meter-stats-request", req=req, e=e)
+
def handle_get_async_request(self, req):
raise NotImplementedError()
@@ -144,10 +172,6 @@
elif self.role == ofp.OFPCR_ROLE_SLAVE:
self.cxn.send(ofp.message.bad_request_error_msg(code=ofp.OFPBRC_IS_SLAVE))
-
- def handle_meter_mod_request(self, req):
- raise NotImplementedError()
-
def handle_role_request(self, req):
if req.role == ofp.OFPCR_ROLE_MASTER or req.role == ofp.OFPCR_ROLE_SLAVE:
if self.agent.generation_is_defined and (
@@ -238,16 +262,17 @@
def handle_group_features_request(self, req):
raise NotImplementedError()
- def handle_meter_stats_request(self, req):
- meter_stats = [] # see https://jira.opencord.org/browse/CORD-825
- self.cxn.send(ofp.message.meter_stats_reply(
- xid=req.xid, entries=meter_stats))
-
def handle_meter_config_request(self, req):
raise NotImplementedError()
def handle_meter_features_request(self, req):
- self.cxn.send(ofp.message.bad_request_error_msg())
+ feature = ofp.meter_features(max_meter=OpenFlowProtocolHandler.MAX_METER_IDS,
+ band_types=ofp.OFPMBT_DROP,
+ capabilities=ofp.OFPMF_KBPS,
+ max_bands=OpenFlowProtocolHandler.MAX_METER_BANDS,
+ max_color=OpenFlowProtocolHandler.MAX_METER_COLORS)
+ self.cxn.send(ofp.message.meter_features_stats_reply(xid=req.xid, flags=None,
+ features=feature))
@inlineCallbacks
def handle_port_stats_request(self, req):
diff --git a/python/requirements.txt b/python/requirements.txt
index 556e5e3..b82f310 100644
--- a/python/requirements.txt
+++ b/python/requirements.txt
@@ -59,5 +59,5 @@
pexpect==4.6.0
python-consul==0.6.2
afkak==3.0.0.dev20181106
-voltha-protos>=0.1.4
+voltha-protos==1.0.0
pyvoltha==0.2.2
diff --git a/ro_core/core/grpc_nbi_api_handler.go b/ro_core/core/grpc_nbi_api_handler.go
index 6d50e9e..e2c6843 100644
--- a/ro_core/core/grpc_nbi_api_handler.go
+++ b/ro_core/core/grpc_nbi_api_handler.go
@@ -290,12 +290,3 @@
log.Debug("SimulateAlarm-stub")
return nil, nil
}
-
-//@TODO useless stub, what should this actually do?
-func (handler *APIHandler) UpdateLogicalDeviceMeterTable(
- ctx context.Context,
- in *openflow_13.MeterModUpdate,
-) (*empty.Empty, error) {
- log.Debug("UpdateLogicalDeviceMeterTable-stub")
- return nil, nil
-}
diff --git a/rw_core/core/adapter_proxy.go b/rw_core/core/adapter_proxy.go
index 41f71a6..9511b9d 100755
--- a/rw_core/core/adapter_proxy.go
+++ b/rw_core/core/adapter_proxy.go
@@ -418,11 +418,11 @@
return unPackResponse(rpc, deviceId, success, result)
}
-func (ap *AdapterProxy) UpdateFlowsBulk(device *voltha.Device, flows *voltha.Flows, groups *voltha.FlowGroups) error {
+func (ap *AdapterProxy) UpdateFlowsBulk(device *voltha.Device, flows *voltha.Flows, groups *voltha.FlowGroups, flowMetadata *voltha.FlowMetadata) error {
log.Debugw("UpdateFlowsBulk", log.Fields{"deviceId": device.Id, "flowsInUpdate": len(flows.Items), "groupsToUpdate": len(groups.Items)})
toTopic := ap.getAdapterTopic(device.Adapter)
rpc := "update_flows_bulk"
- args := make([]*kafka.KVArg, 3)
+ args := make([]*kafka.KVArg, 4)
args[0] = &kafka.KVArg{
Key: "device",
Value: device,
@@ -435,6 +435,10 @@
Key: "groups",
Value: groups,
}
+ args[3] = &kafka.KVArg{
+ Key: "flow_metadata",
+ Value: flowMetadata,
+ }
// Use a device specific topic as we are the only core handling requests for this device
replyToTopic := ap.getCoreTopic()
@@ -443,7 +447,7 @@
return unPackResponse(rpc, device.Id, success, result)
}
-func (ap *AdapterProxy) UpdateFlowsIncremental(device *voltha.Device, flowChanges *openflow_13.FlowChanges, groupChanges *openflow_13.FlowGroupChanges) error {
+func (ap *AdapterProxy) UpdateFlowsIncremental(device *voltha.Device, flowChanges *openflow_13.FlowChanges, groupChanges *openflow_13.FlowGroupChanges, flowMetadata *voltha.FlowMetadata) error {
log.Debugw("UpdateFlowsIncremental",
log.Fields{
"deviceId": device.Id,
@@ -455,7 +459,7 @@
})
toTopic := ap.getAdapterTopic(device.Adapter)
rpc := "update_flows_incrementally"
- args := make([]*kafka.KVArg, 3)
+ args := make([]*kafka.KVArg, 4)
args[0] = &kafka.KVArg{
Key: "device",
Value: device,
@@ -469,6 +473,10 @@
Value: groupChanges,
}
+ args[3] = &kafka.KVArg{
+ Key: "flow_metadata",
+ Value: flowMetadata,
+ }
// Use a device specific topic as we are the only core handling requests for this device
replyToTopic := ap.getCoreTopic()
success, result := ap.kafkaICProxy.InvokeRPC(nil, rpc, &toTopic, &replyToTopic, true, device.Id, args...)
diff --git a/rw_core/core/device_agent.go b/rw_core/core/device_agent.go
index 7b9e00b..a61ca25 100755
--- a/rw_core/core/device_agent.go
+++ b/rw_core/core/device_agent.go
@@ -215,16 +215,16 @@
ch <- nil
}
-func (agent *DeviceAgent) sendBulkFlowsToAdapters(device *voltha.Device, flows *voltha.Flows, groups *voltha.FlowGroups, ch chan interface{}) {
- if err := agent.adapterProxy.UpdateFlowsBulk(device, flows, groups); err != nil {
+func (agent *DeviceAgent) sendBulkFlowsToAdapters(device *voltha.Device, flows *voltha.Flows, groups *voltha.FlowGroups, flowMetadata *voltha.FlowMetadata, ch chan interface{}) {
+ if err := agent.adapterProxy.UpdateFlowsBulk(device, flows, groups, flowMetadata); err != nil {
log.Debugw("update-flow-bulk-error", log.Fields{"id": agent.lastData.Id, "error": err})
ch <- err
}
ch <- nil
}
-func (agent *DeviceAgent) sendIncrementalFlowsToAdapters(device *voltha.Device, flows *ofp.FlowChanges, groups *ofp.FlowGroupChanges, ch chan interface{}) {
- if err := agent.adapterProxy.UpdateFlowsIncremental(device, flows, groups); err != nil {
+func (agent *DeviceAgent) sendIncrementalFlowsToAdapters(device *voltha.Device, flows *ofp.FlowChanges, groups *ofp.FlowGroupChanges, flowMetadata *voltha.FlowMetadata, ch chan interface{}) {
+ if err := agent.adapterProxy.UpdateFlowsIncremental(device, flows, groups, flowMetadata); err != nil {
log.Debugw("update-flow-incremental-error", log.Fields{"id": agent.lastData.Id, "error": err})
ch <- err
}
@@ -233,8 +233,8 @@
//addFlowsAndGroups adds the "newFlows" and "newGroups" from the existing flows/groups and sends the update to the
//adapters
-func (agent *DeviceAgent) addFlowsAndGroups(newFlows []*ofp.OfpFlowStats, newGroups []*ofp.OfpGroupEntry) error {
- log.Debugw("addFlowsAndGroups", log.Fields{"deviceId": agent.deviceId, "flows": newFlows, "groups": newGroups})
+func (agent *DeviceAgent) addFlowsAndGroups(newFlows []*ofp.OfpFlowStats, newGroups []*ofp.OfpGroupEntry, flowMetadata *voltha.FlowMetadata) error {
+ log.Debugw("addFlowsAndGroups", log.Fields{"deviceId": agent.deviceId, "flows": newFlows, "groups": newGroups, "flowMetadata": flowMetadata})
if (len(newFlows) | len(newGroups)) == 0 {
log.Debugw("nothing-to-update", log.Fields{"deviceId": agent.deviceId, "flows": newFlows, "groups": newGroups})
@@ -302,7 +302,7 @@
log.Debugw("nothing-to-update", log.Fields{"deviceId": agent.deviceId, "flows": newFlows, "groups": newGroups})
return nil
}
- go agent.sendBulkFlowsToAdapters(device, &voltha.Flows{Items: updatedFlows}, &voltha.FlowGroups{Items: updatedGroups}, chAdapters)
+ go agent.sendBulkFlowsToAdapters(device, &voltha.Flows{Items: updatedFlows}, &voltha.FlowGroups{Items: updatedGroups}, flowMetadata, chAdapters)
} else {
flowChanges := &ofp.FlowChanges{
@@ -314,7 +314,7 @@
ToRemove: &voltha.FlowGroups{Items: groupsToDelete},
ToUpdate: &voltha.FlowGroups{Items: []*ofp.OfpGroupEntry{}},
}
- go agent.sendIncrementalFlowsToAdapters(device, flowChanges, groupChanges, chAdapters)
+ go agent.sendIncrementalFlowsToAdapters(device, flowChanges, groupChanges, flowMetadata, chAdapters)
}
// store the changed data
@@ -323,6 +323,7 @@
go agent.updateDeviceWithoutLockAsync(device, chdB)
if res := fu.WaitForNilOrErrorResponses(agent.defaultTimeout, chAdapters, chdB); res != nil {
+ log.Debugw("Failed to get response from adapter[or] DB", log.Fields{"result": res})
return status.Errorf(codes.Aborted, "errors-%s", res)
}
@@ -331,7 +332,7 @@
//deleteFlowsAndGroups removes the "flowsToDel" and "groupsToDel" from the existing flows/groups and sends the update to the
//adapters
-func (agent *DeviceAgent) deleteFlowsAndGroups(flowsToDel []*ofp.OfpFlowStats, groupsToDel []*ofp.OfpGroupEntry) error {
+func (agent *DeviceAgent) deleteFlowsAndGroups(flowsToDel []*ofp.OfpFlowStats, groupsToDel []*ofp.OfpGroupEntry, flowMetadata *voltha.FlowMetadata) error {
log.Debugw("deleteFlowsAndGroups", log.Fields{"deviceId": agent.deviceId, "flows": flowsToDel, "groups": groupsToDel})
if (len(flowsToDel) | len(groupsToDel)) == 0 {
@@ -393,7 +394,7 @@
log.Debugw("nothing-to-update", log.Fields{"deviceId": agent.deviceId, "flowsToDel": flowsToDel, "groupsToDel": groupsToDel})
return nil
}
- go agent.sendBulkFlowsToAdapters(device, &voltha.Flows{Items: flowsToKeep}, &voltha.FlowGroups{Items: groupsToKeep}, chAdapters)
+ go agent.sendBulkFlowsToAdapters(device, &voltha.Flows{Items: flowsToKeep}, &voltha.FlowGroups{Items: groupsToKeep}, flowMetadata, chAdapters)
} else {
flowChanges := &ofp.FlowChanges{
ToAdd: &voltha.Flows{Items: []*ofp.OfpFlowStats{}},
@@ -404,7 +405,7 @@
ToRemove: &voltha.FlowGroups{Items: groupsToDel},
ToUpdate: &voltha.FlowGroups{Items: []*ofp.OfpGroupEntry{}},
}
- go agent.sendIncrementalFlowsToAdapters(device, flowChanges, groupChanges, chAdapters)
+ go agent.sendIncrementalFlowsToAdapters(device, flowChanges, groupChanges, flowMetadata, chAdapters)
}
// store the changed data
@@ -421,7 +422,7 @@
//updateFlowsAndGroups replaces the existing flows and groups with "updatedFlows" and "updatedGroups" respectively. It
//also sends the updates to the adapters
-func (agent *DeviceAgent) updateFlowsAndGroups(updatedFlows []*ofp.OfpFlowStats, updatedGroups []*ofp.OfpGroupEntry) error {
+func (agent *DeviceAgent) updateFlowsAndGroups(updatedFlows []*ofp.OfpFlowStats, updatedGroups []*ofp.OfpGroupEntry, flowMetadata *voltha.FlowMetadata) error {
log.Debugw("updateFlowsAndGroups", log.Fields{"deviceId": agent.deviceId, "flows": updatedFlows, "groups": updatedGroups})
if (len(updatedFlows) | len(updatedGroups)) == 0 {
@@ -457,7 +458,7 @@
// Process bulk flow update differently than incremental update
if !dType.AcceptsAddRemoveFlowUpdates {
- go agent.sendBulkFlowsToAdapters(device, &voltha.Flows{Items: updatedFlows}, &voltha.FlowGroups{Items: updatedGroups}, chAdapters)
+ go agent.sendBulkFlowsToAdapters(device, &voltha.Flows{Items: updatedFlows}, &voltha.FlowGroups{Items: updatedGroups}, nil, chAdapters)
} else {
var flowsToAdd []*ofp.OfpFlowStats
var flowsToDelete []*ofp.OfpFlowStats
@@ -512,7 +513,7 @@
ToRemove: &voltha.FlowGroups{Items: groupsToDelete},
ToUpdate: &voltha.FlowGroups{Items: updatedGroups},
}
- go agent.sendIncrementalFlowsToAdapters(device, flowChanges, groupChanges, chAdapters)
+ go agent.sendIncrementalFlowsToAdapters(device, flowChanges, groupChanges, flowMetadata, chAdapters)
}
// store the updated data
diff --git a/rw_core/core/device_manager.go b/rw_core/core/device_manager.go
index 606e36f..f417b05 100755
--- a/rw_core/core/device_manager.go
+++ b/rw_core/core/device_manager.go
@@ -671,26 +671,26 @@
return status.Errorf(codes.NotFound, "%s", deviceId)
}
-func (dMgr *DeviceManager) addFlowsAndGroups(deviceId string, flows []*ofp.OfpFlowStats, groups []*ofp.OfpGroupEntry) error {
- log.Debugw("addFlowsAndGroups", log.Fields{"deviceid": deviceId})
+func (dMgr *DeviceManager) addFlowsAndGroups(deviceId string, flows []*ofp.OfpFlowStats, groups []*ofp.OfpGroupEntry, flowMetadata *voltha.FlowMetadata) error {
+ log.Debugw("addFlowsAndGroups", log.Fields{"deviceid": deviceId, "flowMetadata": flowMetadata})
if agent := dMgr.getDeviceAgent(deviceId); agent != nil {
- return agent.addFlowsAndGroups(flows, groups)
+ return agent.addFlowsAndGroups(flows, groups, flowMetadata)
}
return status.Errorf(codes.NotFound, "%s", deviceId)
}
-func (dMgr *DeviceManager) deleteFlowsAndGroups(deviceId string, flows []*ofp.OfpFlowStats, groups []*ofp.OfpGroupEntry) error {
+func (dMgr *DeviceManager) deleteFlowsAndGroups(deviceId string, flows []*ofp.OfpFlowStats, groups []*ofp.OfpGroupEntry, flowMetadata *voltha.FlowMetadata) error {
log.Debugw("deleteFlowsAndGroups", log.Fields{"deviceid": deviceId})
if agent := dMgr.getDeviceAgent(deviceId); agent != nil {
- return agent.deleteFlowsAndGroups(flows, groups)
+ return agent.deleteFlowsAndGroups(flows, groups, flowMetadata)
}
return status.Errorf(codes.NotFound, "%s", deviceId)
}
-func (dMgr *DeviceManager) updateFlowsAndGroups(deviceId string, flows []*ofp.OfpFlowStats, groups []*ofp.OfpGroupEntry) error {
+func (dMgr *DeviceManager) updateFlowsAndGroups(deviceId string, flows []*ofp.OfpFlowStats, groups []*ofp.OfpGroupEntry, flowMetadata *voltha.FlowMetadata) error {
log.Debugw("updateFlowsAndGroups", log.Fields{"deviceid": deviceId})
if agent := dMgr.getDeviceAgent(deviceId); agent != nil {
- return agent.updateFlowsAndGroups(flows, groups)
+ return agent.updateFlowsAndGroups(flows, groups, flowMetadata)
}
return status.Errorf(codes.NotFound, "%s", deviceId)
}
diff --git a/rw_core/core/grpc_nbi_api_handler.go b/rw_core/core/grpc_nbi_api_handler.go
index f2c16e7..bdb3e39 100755
--- a/rw_core/core/grpc_nbi_api_handler.go
+++ b/rw_core/core/grpc_nbi_api_handler.go
@@ -943,13 +943,17 @@
return nil, nil
}
-//@TODO useless stub, what should this actually do?
-func (handler *APIHandler) GetMeterStatsOfLogicalDevice(
- ctx context.Context,
- in *common.ID,
-) (*openflow_13.MeterStatsReply, error) {
- log.Debug("GetMeterStatsOfLogicalDevice-stub")
- return nil, nil
+func (handler *APIHandler) ListLogicalDeviceMeters(ctx context.Context, id *voltha.ID) (*openflow_13.Meters, error) {
+
+ log.Debugw("ListLogicalDeviceMeters", log.Fields{"id": *id})
+ if handler.competeForTransaction() {
+ if txn, err := handler.takeRequestOwnership(ctx, &utils.LogicalDeviceID{Id: id.Id}); err != nil {
+ return nil, err // TODO: Return empty meter entry
+ } else {
+ defer txn.Close()
+ }
+ }
+ return handler.logicalDeviceMgr.ListLogicalDeviceMeters(ctx, id.Id)
}
//@TODO useless stub, what should this actually do?
@@ -986,11 +990,25 @@
return successResp, nil
}
-//@TODO useless stub, what should this actually do?
-func (handler *APIHandler) UpdateLogicalDeviceMeterTable(
- ctx context.Context,
- in *openflow_13.MeterModUpdate,
-) (*empty.Empty, error) {
- log.Debug("UpdateLogicalDeviceMeterTable-stub")
- return nil, nil
+// This function sends meter mod request to logical device manager and waits for response
+func (handler *APIHandler) UpdateLogicalDeviceMeterTable(ctx context.Context, meter *openflow_13.MeterModUpdate) (*empty.Empty, error) {
+ log.Debugw("UpdateLogicalDeviceMeterTable-request",
+ log.Fields{"meter": meter, "test": common.TestModeKeys_api_test.String()})
+ if isTestMode(ctx) {
+ out := new(empty.Empty)
+ return out, nil
+ }
+
+ if handler.competeForTransaction() {
+ if txn, err := handler.takeRequestOwnership(ctx, &utils.LogicalDeviceID{Id: meter.Id}); err != nil {
+ return new(empty.Empty), err
+ } else {
+ defer txn.Close()
+ }
+ }
+
+ ch := make(chan interface{})
+ defer close(ch)
+ go handler.logicalDeviceMgr.updateMeterTable(ctx, meter.Id, meter.MeterMod, ch)
+ return waitForNilResponseOnSuccess(ctx, ch)
}
diff --git a/rw_core/core/logical_device_agent.go b/rw_core/core/logical_device_agent.go
index 70349d8..49e1463 100644
--- a/rw_core/core/logical_device_agent.go
+++ b/rw_core/core/logical_device_agent.go
@@ -45,6 +45,7 @@
deviceGraph *graph.DeviceGraph
flowProxy *model.Proxy
groupProxy *model.Proxy
+ meterProxy *model.Proxy
ldProxy *model.Proxy
portProxies map[string]*model.Proxy
portProxiesLock sync.RWMutex
@@ -139,6 +140,10 @@
ctx,
fmt.Sprintf("/logical_devices/%s/flows", agent.logicalDeviceId),
false)
+ agent.meterProxy = agent.clusterDataProxy.CreateProxy(
+ ctx,
+ fmt.Sprintf("/logical_devices/%s/meters", agent.logicalDeviceId),
+ false)
agent.groupProxy = agent.clusterDataProxy.CreateProxy(
ctx,
fmt.Sprintf("/logical_devices/%s/flow_groups", agent.logicalDeviceId),
@@ -199,6 +204,18 @@
return nil, status.Errorf(codes.NotFound, "logical_device-%s", agent.logicalDeviceId)
}
+func (agent *LogicalDeviceAgent) ListLogicalDeviceMeters() (*ofp.Meters, error) {
+ log.Debug("ListLogicalDeviceMeters")
+ agent.lockLogicalDevice.RLock()
+ defer agent.lockLogicalDevice.RUnlock()
+ logicalDevice := agent.clusterDataProxy.Get(context.Background(), "/logical_devices/"+agent.logicalDeviceId, 0, false, "")
+ if lDevice, ok := logicalDevice.(*voltha.LogicalDevice); ok {
+ cMeters := (proto.Clone(lDevice.Meters)).(*ofp.Meters)
+ return cMeters, nil
+ }
+ return nil, status.Errorf(codes.NotFound, "logical_device-%s", agent.logicalDeviceId)
+}
+
func (agent *LogicalDeviceAgent) ListLogicalDeviceFlowGroups() (*ofp.FlowGroups, error) {
log.Debug("ListLogicalDeviceFlowGroups")
agent.lockLogicalDevice.RLock()
@@ -261,6 +278,16 @@
}
//updateLogicalDeviceWithoutLock updates the model with the logical device. It clones the logicaldevice before saving it
+func (agent *LogicalDeviceAgent) updateLogicalDeviceMetersWithoutLock(meters *ofp.Meters) error {
+ updateCtx := context.WithValue(context.Background(), model.RequestTimestamp, time.Now().UnixNano())
+ afterUpdate := agent.meterProxy.Update(updateCtx, "/", meters, false, "")
+ if afterUpdate == nil {
+ return status.Errorf(codes.Internal, "failed-updating-logical-device-meters:%s", agent.logicalDeviceId)
+ }
+ return nil
+}
+
+//updateLogicalDeviceWithoutLock updates the model with the logical device. It clones the logicaldevice before saving it
func (agent *LogicalDeviceAgent) updateLogicalDeviceFlowGroupsWithoutLock(flowGroups *ofp.FlowGroups) error {
updateCtx := context.WithValue(context.Background(), model.RequestTimestamp, time.Now().UnixNano())
afterUpdate := agent.groupProxy.Update(updateCtx, "/", flowGroups, false, "")
@@ -520,6 +547,222 @@
"unhandled-command: lDeviceId:%s, command:%s", agent.logicalDeviceId, groupMod.GetCommand())
}
+// updateMeterTable updates the meter table of that logical device
+func (agent *LogicalDeviceAgent) updateMeterTable(ctx context.Context, meterMod *ofp.OfpMeterMod) error {
+ log.Debug("updateMeterTable")
+ if meterMod == nil {
+ return nil
+ }
+ switch meterMod.GetCommand() {
+ case ofp.OfpMeterModCommand_OFPMC_ADD:
+ return agent.meterAdd(meterMod)
+ case ofp.OfpMeterModCommand_OFPMC_DELETE:
+ return agent.meterDelete(meterMod)
+ case ofp.OfpMeterModCommand_OFPMC_MODIFY:
+ return agent.meterModify(meterMod)
+ }
+ return status.Errorf(codes.Internal,
+ "unhandled-command: lDeviceId:%s, command:%s", agent.logicalDeviceId, meterMod.GetCommand())
+
+}
+
+func (agent *LogicalDeviceAgent) meterAdd(meterMod *ofp.OfpMeterMod) error {
+ log.Debugw("meterAdd", log.Fields{"metermod": *meterMod})
+ if meterMod == nil {
+ return nil
+ }
+ log.Debug("Waiting for logical device lock!!")
+ agent.lockLogicalDevice.Lock()
+ defer agent.lockLogicalDevice.Unlock()
+ log.Debug("Acquired logical device lock")
+ var lDevice *voltha.LogicalDevice
+ var err error
+ if lDevice, err = agent.getLogicalDeviceWithoutLock(); err != nil {
+ log.Errorw("no-logical-device-present", log.Fields{"logicalDeviceId": agent.logicalDeviceId})
+ return errors.New(fmt.Sprintf("no-logical-device-present:%s", agent.logicalDeviceId))
+ }
+
+ var meters []*ofp.OfpMeterEntry
+ if lDevice.Meters != nil && lDevice.Meters.Items != nil {
+ meters = lDevice.Meters.Items
+ }
+ log.Debugw("Available meters", log.Fields{"meters": meters})
+
+ for _, meter := range meters {
+ if meterMod.MeterId == meter.Config.MeterId {
+ log.Infow("Meter-already-exists", log.Fields{"meter": *meterMod})
+ return nil
+ }
+ }
+
+ meterEntry := fu.MeterEntryFromMeterMod(meterMod)
+ meters = append(meters, meterEntry)
+ //Update model
+ if err := agent.updateLogicalDeviceMetersWithoutLock(&ofp.Meters{Items: meters}); err != nil {
+ log.Errorw("db-meter-update-failed", log.Fields{"logicalDeviceId": agent.logicalDeviceId})
+ return err
+ }
+ log.Debugw("Meter-added-successfully", log.Fields{"Added-meter": meterEntry, "updated-meters": lDevice.Meters})
+ return nil
+}
+
+func (agent *LogicalDeviceAgent) meterDelete(meterMod *ofp.OfpMeterMod) error {
+ log.Debug("meterDelete", log.Fields{"meterMod": *meterMod})
+ if meterMod == nil {
+ return nil
+ }
+ agent.lockLogicalDevice.Lock()
+ defer agent.lockLogicalDevice.Unlock()
+
+ var lDevice *voltha.LogicalDevice
+ var err error
+ if lDevice, err = agent.getLogicalDeviceWithoutLock(); err != nil {
+ log.Errorw("no-logical-device-present", log.Fields{"logicalDeviceId": agent.logicalDeviceId})
+ return errors.New(fmt.Sprintf("no-logical-device-present:%s", agent.logicalDeviceId))
+ }
+
+ var meters []*ofp.OfpMeterEntry
+ var flows []*ofp.OfpFlowStats
+ updatedFlows := make([]*ofp.OfpFlowStats, 0)
+ if lDevice.Meters != nil && lDevice.Meters.Items != nil {
+ meters = lDevice.Meters.Items
+ }
+ if lDevice.Flows != nil && lDevice.Flows.Items != nil {
+ flows = lDevice.Flows.Items
+ }
+
+ changedMeter := false
+ changedFow := false
+ log.Debugw("Available meters", log.Fields{"meters": meters})
+ for index, meter := range meters {
+ if meterMod.MeterId == meter.Config.MeterId {
+ flows = lDevice.Flows.Items
+ changedFow, updatedFlows = agent.getUpdatedFlowsAfterDeletebyMeterId(flows, meterMod.MeterId)
+ meters = append(meters[:index], meters[index+1:]...)
+ log.Debugw("Meter has been deleted", log.Fields{"meter": meter, "index": index})
+ changedMeter = true
+ break
+ }
+ }
+ if changedMeter {
+ //Update model
+ metersToUpdate := &ofp.Meters{}
+ if lDevice.Meters != nil {
+ metersToUpdate = &ofp.Meters{Items: meters}
+ }
+ if err := agent.updateLogicalDeviceMetersWithoutLock(metersToUpdate); err != nil {
+ log.Errorw("db-meter-update-failed", log.Fields{"logicalDeviceId": agent.logicalDeviceId})
+ return err
+ }
+ log.Debug("Meter-deleted-from-DB-successfully", log.Fields{"updatedMeters": metersToUpdate, "no-of-meter": len(metersToUpdate.Items)})
+
+ }
+ if changedFow {
+ //Update model
+ if err := agent.updateLogicalDeviceFlowsWithoutLock(&ofp.Flows{Items: updatedFlows}); err != nil {
+ log.Errorw("db-flow-update-failed", log.Fields{"logicalDeviceId": agent.logicalDeviceId})
+ return err
+ }
+ log.Debug("Flows-associated-with-meter-deleted-from-DB-successfully",
+ log.Fields{"updated-no-of-flows": len(updatedFlows), "meter": meterMod.MeterId})
+ }
+ log.Debugw("meterDelete success", log.Fields{"meterID": meterMod.MeterId})
+ return nil
+}
+
+func (agent *LogicalDeviceAgent) meterModify(meterMod *ofp.OfpMeterMod) error {
+ log.Debug("meterModify")
+ if meterMod == nil {
+ return nil
+ }
+ agent.lockLogicalDevice.Lock()
+ defer agent.lockLogicalDevice.Unlock()
+
+ var lDevice *voltha.LogicalDevice
+ var err error
+ if lDevice, err = agent.getLogicalDeviceWithoutLock(); err != nil {
+ log.Errorw("no-logical-device-present", log.Fields{"logicalDeviceId": agent.logicalDeviceId})
+ return errors.New(fmt.Sprintf("no-logical-device-present:%s", agent.logicalDeviceId))
+ }
+
+ var meters []*ofp.OfpMeterEntry
+ if lDevice.Meters != nil && lDevice.Meters.Items != nil {
+ meters = lDevice.Meters.Items
+ }
+ changedMeter := false
+ for index, meter := range meters {
+ if meterMod.MeterId == meter.Config.MeterId {
+ newmeterEntry := fu.MeterEntryFromMeterMod(meterMod)
+ newmeterEntry.Stats.FlowCount = meter.Stats.FlowCount
+ meters[index] = newmeterEntry
+ changedMeter = true
+ log.Debugw("Found meter, replaced with new meter", log.Fields{"old meter": meter, "new meter": newmeterEntry})
+ break
+ }
+ }
+ if changedMeter {
+ //Update model
+ metersToUpdate := &ofp.Meters{}
+ if lDevice.Meters != nil {
+ metersToUpdate = &ofp.Meters{Items: meters}
+ }
+ if err := agent.updateLogicalDeviceMetersWithoutLock(metersToUpdate); err != nil {
+ log.Errorw("db-meter-update-failed", log.Fields{"logicalDeviceId": agent.logicalDeviceId})
+ return err
+ }
+ log.Debugw("meter-updated-in-DB-successfully", log.Fields{"updated_meters": meters})
+ return nil
+ }
+
+ log.Errorw("Meter not found ", log.Fields{"meter": meterMod})
+ return errors.New(fmt.Sprintf("no-logical-device-present:%d", meterMod.MeterId))
+
+}
+
+func (agent *LogicalDeviceAgent) getUpdatedFlowsAfterDeletebyMeterId(flows []*ofp.OfpFlowStats, meterId uint32) (bool, []*ofp.OfpFlowStats) {
+ log.Infow("Delete flows matching meter", log.Fields{"meter": meterId})
+ changed := false
+ //updatedFlows := make([]*ofp.OfpFlowStats, 0)
+ for index := len(flows) - 1; index >= 0; index-- {
+ if mId := fu.GetMeterIdFromFlow(flows[index]); mId != 0 && mId == meterId {
+ log.Debugw("Flow to be deleted", log.Fields{"flow": flows[index], "index": index})
+ flows = append(flows[:index], flows[index+1:]...)
+ changed = true
+ }
+ }
+ return changed, flows
+}
+
+func (agent *LogicalDeviceAgent) updateFlowCountOfMeterStats(modCommand *ofp.OfpFlowMod, meters []*ofp.OfpMeterEntry, flow *ofp.OfpFlowStats) bool {
+
+ flowCommand := modCommand.GetCommand()
+ meterId := fu.GetMeterIdFromFlow(flow)
+ log.Debugw("Meter-id-in-flow-mod", log.Fields{"meterId": meterId})
+ if meterId == 0 {
+ log.Debugw("No meter present in the flow", log.Fields{"flow": *flow})
+ return false
+ }
+ if meters == nil {
+ log.Debug("No meters present in logical device")
+ return false
+ }
+ changedMeter := false
+ for _, meter := range meters {
+ if meterId == meter.Config.MeterId { // Found meter in Logicaldevice
+ if flowCommand == ofp.OfpFlowModCommand_OFPFC_ADD {
+ meter.Stats.FlowCount += 1
+ changedMeter = true
+ } else if flowCommand == ofp.OfpFlowModCommand_OFPFC_DELETE_STRICT {
+ meter.Stats.FlowCount -= 1
+ changedMeter = true
+ }
+ log.Debugw("Found meter, updated meter flow stats", log.Fields{" meterId": meterId})
+ break
+ }
+ }
+ return changedMeter
+}
+
//flowAdd adds a flow to the flow table of that logical device
func (agent *LogicalDeviceAgent) flowAdd(mod *ofp.OfpFlowMod) error {
log.Debug("flowAdd")
@@ -537,12 +780,19 @@
}
var flows []*ofp.OfpFlowStats
+ var meters []*ofp.OfpMeterEntry
+ var flow *ofp.OfpFlowStats
+
if lDevice.Flows != nil && lDevice.Flows.Items != nil {
flows = lDevice.Flows.Items
}
+ if lDevice.Meters != nil && lDevice.Meters.Items != nil {
+ meters = lDevice.Meters.Items
+ }
updatedFlows := make([]*ofp.OfpFlowStats, 0)
changed := false
+ updated := false
checkOverlap := (mod.Flags & uint32(ofp.OfpFlowModFlags_OFPFF_CHECK_OVERLAP)) != 0
if checkOverlap {
if overlapped := fu.FindOverlappingFlows(flows, mod); len(overlapped) != 0 {
@@ -550,13 +800,13 @@
log.Warnw("overlapped-flows", log.Fields{"logicaldeviceId": agent.logicalDeviceId})
} else {
// Add flow
- flow := fu.FlowStatsEntryFromFlowModMessage(mod)
+ flow = fu.FlowStatsEntryFromFlowModMessage(mod)
flows = append(flows, flow)
updatedFlows = append(updatedFlows, flow)
changed = true
}
} else {
- flow := fu.FlowStatsEntryFromFlowModMessage(mod)
+ flow = fu.FlowStatsEntryFromFlowModMessage(mod)
idx := fu.FindFlows(flows, flow)
if idx >= 0 {
oldFlow := flows[idx]
@@ -568,6 +818,7 @@
flows[idx] = flow
updatedFlows = append(updatedFlows, flow)
changed = true
+ updated = true
}
} else {
flows = append(flows, flow)
@@ -576,10 +827,15 @@
}
}
if changed {
+ var flowMetadata voltha.FlowMetadata
+ if err := agent.GetMeterConfig(updatedFlows, meters, &flowMetadata); err != nil { // This should never happen,meters should be installed before flow arrives
+ log.Error("Meter-referred-in-flows-not-present")
+ return err
+ }
deviceRules := agent.flowDecomposer.DecomposeRules(agent, ofp.Flows{Items: updatedFlows}, *lDevice.FlowGroups)
log.Debugw("rules", log.Fields{"rules": deviceRules.String()})
- if err := agent.addDeviceFlowsAndGroups(deviceRules); err != nil {
+ if err := agent.addDeviceFlowsAndGroups(deviceRules, &flowMetadata); err != nil {
log.Errorw("failure-updating-device-flows", log.Fields{"logicalDeviceId": agent.logicalDeviceId, "error": err})
return err
}
@@ -589,10 +845,55 @@
log.Errorw("db-flow-update-failed", log.Fields{"logicalDeviceId": agent.logicalDeviceId})
return err
}
+ if !updated {
+ changedMeterStats := agent.updateFlowCountOfMeterStats(mod, meters, flow)
+ metersToUpdate := &ofp.Meters{}
+ if lDevice.Meters != nil {
+ metersToUpdate = &ofp.Meters{Items: meters}
+ }
+ if changedMeterStats {
+ //Update model
+ if err := agent.updateLogicalDeviceMetersWithoutLock(metersToUpdate); err != nil {
+ log.Errorw("db-meter-update-failed", log.Fields{"logicalDeviceId": agent.logicalDeviceId})
+ return err
+ }
+ log.Debugw("meter-stats-updated-in-DB-successfully", log.Fields{"updated_meters": meters})
+
+ }
+ }
+
}
return nil
}
+func (agent *LogicalDeviceAgent) GetMeterConfig(flows []*ofp.OfpFlowStats, meters []*ofp.OfpMeterEntry, metadata *voltha.FlowMetadata) error {
+ m := make(map[uint32]bool)
+ for _, flow := range flows {
+ if flowMeterID := fu.GetMeterIdFromFlow(flow); flowMeterID != 0 && m[flowMeterID] == false {
+ foundMeter := false
+ // Meter is present in the flow , Get from logical device
+ for _, meter := range meters {
+ if flowMeterID == meter.Config.MeterId {
+ metadata.Meters = append(metadata.Meters, meter.Config)
+ log.Debugw("Found meter in logical device",
+ log.Fields{"meterID": flowMeterID, "meter-band": meter.Config})
+ m[flowMeterID] = true
+ foundMeter = true
+ break
+ }
+ }
+ if !foundMeter {
+ log.Errorw("Meter-referred-by-flow-is-not-found-in-logicaldevice",
+ log.Fields{"meterID": flowMeterID, "Avaliable-meters": meters, "flow": *flow})
+ return errors.New("Meter-referred-by-flow-is-not-found-in-logicaldevice")
+ }
+ }
+ }
+ log.Debugw("meter-bands-for-flows", log.Fields{"flows": len(flows), "metadata": metadata})
+ return nil
+
+}
+
//flowDelete deletes a flow from the flow table of that logical device
func (agent *LogicalDeviceAgent) flowDelete(mod *ofp.OfpFlowMod) error {
log.Debug("flowDelete")
@@ -608,8 +909,17 @@
log.Errorw("no-logical-device-present", log.Fields{"logicalDeviceId": agent.logicalDeviceId})
return errors.New(fmt.Sprintf("no-logical-device-present:%s", agent.logicalDeviceId))
}
- flows := lDevice.Flows.Items
+ var meters []*ofp.OfpMeterEntry
+ var flows []*ofp.OfpFlowStats
+
+ if lDevice.Flows != nil && lDevice.Flows.Items != nil {
+ flows = lDevice.Flows.Items
+ }
+
+ if lDevice.Meters != nil && lDevice.Meters.Items != nil {
+ meters = lDevice.Meters.Items
+ }
//build a list of what to keep vs what to delete
toKeep := make([]*ofp.OfpFlowStats, 0)
toDelete := make([]*ofp.OfpFlowStats, 0)
@@ -631,10 +941,15 @@
//Update flows
if len(toDelete) > 0 {
+ var flowMetadata voltha.FlowMetadata
+ if err := agent.GetMeterConfig(toDelete, meters, &flowMetadata); err != nil { // This should never happen
+ log.Error("Meter-referred-in-flows-not-present")
+ return errors.New("Meter-referred-in-flows-not-present")
+ }
deviceRules := agent.flowDecomposer.DecomposeRules(agent, ofp.Flows{Items: toDelete}, ofp.FlowGroups{})
log.Debugw("rules", log.Fields{"rules": deviceRules.String()})
- if err := agent.deleteDeviceFlowsAndGroups(deviceRules); err != nil {
+ if err := agent.deleteDeviceFlowsAndGroups(deviceRules, &flowMetadata); err != nil {
log.Errorw("failure-updating-device-flows", log.Fields{"logicalDeviceId": agent.logicalDeviceId, "error": err})
return err
}
@@ -649,15 +964,15 @@
return nil
}
-func (agent *LogicalDeviceAgent) addDeviceFlowsAndGroups(deviceRules *fu.DeviceRules) error {
- log.Debugw("addDeviceFlowsAndGroups", log.Fields{"logicalDeviceID": agent.logicalDeviceId})
+func (agent *LogicalDeviceAgent) addDeviceFlowsAndGroups(deviceRules *fu.DeviceRules, flowMetadata *voltha.FlowMetadata) error {
+ log.Debugw("addDeviceFlowsAndGroups", log.Fields{"logicalDeviceID": agent.logicalDeviceId, "deviceRules": deviceRules, "flowMetadata": flowMetadata})
chnlsList := make([]chan interface{}, 0)
for deviceId, value := range deviceRules.GetRules() {
ch := make(chan interface{})
chnlsList = append(chnlsList, ch)
go func(deviceId string, flows []*ofp.OfpFlowStats, groups []*ofp.OfpGroupEntry) {
- if err := agent.deviceMgr.addFlowsAndGroups(deviceId, flows, groups); err != nil {
+ if err := agent.deviceMgr.addFlowsAndGroups(deviceId, flows, groups, flowMetadata); err != nil {
log.Errorw("flow-add-failed", log.Fields{"deviceID": deviceId, "error": err})
ch <- status.Errorf(codes.Internal, "flow-add-failed: %s", deviceId)
}
@@ -671,7 +986,7 @@
return nil
}
-func (agent *LogicalDeviceAgent) deleteDeviceFlowsAndGroups(deviceRules *fu.DeviceRules) error {
+func (agent *LogicalDeviceAgent) deleteDeviceFlowsAndGroups(deviceRules *fu.DeviceRules, flowMetadata *voltha.FlowMetadata) error {
log.Debugw("deleteDeviceFlowsAndGroups", log.Fields{"logicalDeviceID": agent.logicalDeviceId})
chnlsList := make([]chan interface{}, 0)
@@ -679,7 +994,7 @@
ch := make(chan interface{})
chnlsList = append(chnlsList, ch)
go func(deviceId string, flows []*ofp.OfpFlowStats, groups []*ofp.OfpGroupEntry) {
- if err := agent.deviceMgr.deleteFlowsAndGroups(deviceId, flows, groups); err != nil {
+ if err := agent.deviceMgr.deleteFlowsAndGroups(deviceId, flows, groups, flowMetadata); err != nil {
log.Error("flow-delete-failed", log.Fields{"deviceID": deviceId, "error": err})
ch <- status.Errorf(codes.Internal, "flow-delete-failed: %s", deviceId)
}
@@ -693,7 +1008,7 @@
return nil
}
-func (agent *LogicalDeviceAgent) updateDeviceFlowsAndGroups(deviceRules *fu.DeviceRules) error {
+func (agent *LogicalDeviceAgent) updateDeviceFlowsAndGroups(deviceRules *fu.DeviceRules, flowMetadata *voltha.FlowMetadata) error {
log.Debugw("updateDeviceFlowsAndGroups", log.Fields{"logicalDeviceID": agent.logicalDeviceId})
chnlsList := make([]chan interface{}, 0)
@@ -701,7 +1016,7 @@
ch := make(chan interface{})
chnlsList = append(chnlsList, ch)
go func(deviceId string, flows []*ofp.OfpFlowStats, groups []*ofp.OfpGroupEntry) {
- if err := agent.deviceMgr.updateFlowsAndGroups(deviceId, flows, groups); err != nil {
+ if err := agent.deviceMgr.updateFlowsAndGroups(deviceId, flows, groups, flowMetadata); err != nil {
log.Error("flow-update-failed", log.Fields{"deviceID": deviceId, "error": err})
ch <- status.Errorf(codes.Internal, "flow-update-failed: %s", deviceId)
}
@@ -730,22 +1045,50 @@
log.Errorw("no-logical-device-present", log.Fields{"logicalDeviceId": agent.logicalDeviceId})
return errors.New(fmt.Sprintf("no-logical-device-present:%s", agent.logicalDeviceId))
}
- flows := lDevice.Flows.Items
- changed := false
+ var meters []*ofp.OfpMeterEntry
+ var flows []*ofp.OfpFlowStats
+ if lDevice.Meters != nil && lDevice.Meters.Items != nil {
+ meters = lDevice.Meters.Items
+ }
+ if lDevice.Flows != nil && lDevice.Flows.Items != nil {
+ flows = lDevice.Flows.Items
+ }
+
+ changedFlow := false
+ changedMeter := false
flow := fu.FlowStatsEntryFromFlowModMessage(mod)
+ flowsToDelete := make([]*ofp.OfpFlowStats, 0)
idx := fu.FindFlows(flows, flow)
if idx >= 0 {
+ changedMeter = agent.updateFlowCountOfMeterStats(mod, meters, flow)
+ flowsToDelete = append(flowsToDelete, flows[idx])
flows = append(flows[:idx], flows[idx+1:]...)
- changed = true
+ changedFlow = true
} else {
return errors.New(fmt.Sprintf("Cannot delete flow - %s", flow))
}
+ if changedMeter {
+ //Update model
+ metersToUpdate := &ofp.Meters{}
+ if lDevice.Meters != nil {
+ metersToUpdate = &ofp.Meters{Items: meters}
+ }
+ if err := agent.updateLogicalDeviceMetersWithoutLock(metersToUpdate); err != nil {
+ log.Errorw("db-meter-update-failed", log.Fields{"logicalDeviceId": agent.logicalDeviceId})
+ return err
+ }
- if changed {
- deviceRules := agent.flowDecomposer.DecomposeRules(agent, ofp.Flows{Items: []*ofp.OfpFlowStats{flow}}, ofp.FlowGroups{})
+ }
+ if changedFlow {
+ var flowMetadata voltha.FlowMetadata
+ if err := agent.GetMeterConfig(flowsToDelete, meters, &flowMetadata); err != nil {
+ log.Error("Meter-referred-in-flows-not-present")
+ return err
+ }
+ deviceRules := agent.flowDecomposer.DecomposeRules(agent, ofp.Flows{Items: flowsToDelete}, ofp.FlowGroups{})
log.Debugw("rules", log.Fields{"rules": deviceRules.String()})
- if err := agent.deleteDeviceFlowsAndGroups(deviceRules); err != nil {
+ if err := agent.deleteDeviceFlowsAndGroups(deviceRules, &flowMetadata); err != nil {
log.Errorw("failure-deleting-device-flows", log.Fields{"logicalDeviceId": agent.logicalDeviceId, "error": err})
return err
}
@@ -788,8 +1131,7 @@
deviceRules := agent.flowDecomposer.DecomposeRules(agent, *lDevice.Flows, ofp.FlowGroups{Items: groups})
log.Debugw("rules", log.Fields{"rules": deviceRules.String()})
-
- if err := agent.addDeviceFlowsAndGroups(deviceRules); err != nil {
+ if err := agent.addDeviceFlowsAndGroups(deviceRules, nil); err != nil {
log.Errorw("failure-updating-device-flows", log.Fields{"logicalDeviceId": agent.logicalDeviceId, "error": err})
return err
}
@@ -841,7 +1183,7 @@
deviceRules := agent.flowDecomposer.DecomposeRules(agent, ofp.Flows{Items: flows}, ofp.FlowGroups{Items: groups})
log.Debugw("rules", log.Fields{"rules": deviceRules.String()})
- if err := agent.updateDeviceFlowsAndGroups(deviceRules); err != nil {
+ if err := agent.updateDeviceFlowsAndGroups(deviceRules, nil); err != nil {
log.Errorw("failure-updating-device-flows-groups", log.Fields{"logicalDeviceId": agent.logicalDeviceId, "error": err})
return err
}
@@ -891,7 +1233,7 @@
deviceRules := agent.flowDecomposer.DecomposeRules(agent, ofp.Flows{Items: lDevice.Flows.Items}, ofp.FlowGroups{Items: groups})
log.Debugw("rules", log.Fields{"rules": deviceRules.String()})
- if err := agent.updateDeviceFlowsAndGroups(deviceRules); err != nil {
+ if err := agent.updateDeviceFlowsAndGroups(deviceRules, nil); err != nil {
log.Errorw("failure-updating-device-flows-groups", log.Fields{"logicalDeviceId": agent.logicalDeviceId, "error": err})
return err
}
diff --git a/rw_core/core/logical_device_manager.go b/rw_core/core/logical_device_manager.go
index a097736..71843ff 100644
--- a/rw_core/core/logical_device_manager.go
+++ b/rw_core/core/logical_device_manager.go
@@ -476,6 +476,25 @@
sendAPIResponse(ctx, ch, res)
}
+func (ldMgr *LogicalDeviceManager) updateMeterTable(ctx context.Context, id string, meter *openflow_13.OfpMeterMod, ch chan interface{}) {
+ log.Debugw("updateMeterTable", log.Fields{"logicalDeviceId": id})
+ var res interface{}
+ if agent := ldMgr.getLogicalDeviceAgent(id); agent != nil {
+ res = agent.updateMeterTable(ctx, meter)
+ log.Debugw("updateMeterTable-result", log.Fields{"result": res})
+ } else {
+ res = status.Errorf(codes.NotFound, "%s", id)
+ }
+ sendAPIResponse(ctx, ch, res)
+}
+
+func (ldMgr *LogicalDeviceManager) ListLogicalDeviceMeters(ctx context.Context, id string) (*openflow_13.Meters, error) {
+ log.Debugw("ListLogicalDeviceMeters", log.Fields{"logicalDeviceId": id})
+ if agent := ldMgr.getLogicalDeviceAgent(id); agent != nil {
+ return agent.ListLogicalDeviceMeters()
+ }
+ return nil, status.Errorf(codes.NotFound, "%s", id)
+}
func (ldMgr *LogicalDeviceManager) updateGroupTable(ctx context.Context, id string, groupMod *openflow_13.OfpGroupMod, ch chan interface{}) {
log.Debugw("updateGroupTable", log.Fields{"logicalDeviceId": id})
var res interface{}
diff --git a/rw_core/flow_decomposition/flow_decomposer.go b/rw_core/flow_decomposition/flow_decomposer.go
index 98d5092..09b29e8 100644
--- a/rw_core/flow_decomposition/flow_decomposer.go
+++ b/rw_core/flow_decomposition/flow_decomposer.go
@@ -105,6 +105,8 @@
log.Debugw("trap-flow", log.Fields{"inPortNo": inPortNo, "outPortNo": outPortNo, "flow": flow})
deviceRules := fu.NewDeviceRules()
+ meterId := fu.GetMeterIdFromFlow(flow)
+ metadataFromwriteMetadata := fu.GetMetadataFromWriteMetadataAction(flow)
egressHop := route[1]
@@ -128,10 +130,9 @@
var fa *fu.FlowArgs
// Upstream flow
fa = &fu.FlowArgs{
- KV: fu.OfpFlowModArgs{"priority": uint64(flow.Priority), "cookie": flow.Cookie},
+ KV: fu.OfpFlowModArgs{"priority": uint64(flow.Priority), "cookie": flow.Cookie, "meter_id": uint64(meterId), "write_metadata": metadataFromwriteMetadata},
MatchFields: []*ofp.OfpOxmOfbField{
fu.InPort(egressHop.Ingress),
- fu.VlanVid(uint32(ofp.OfpVlanId_OFPVID_PRESENT) | inputPort),
fu.TunnelId(uint64(inputPort)),
},
Actions: []*ofp.OfpAction{
@@ -141,24 +142,7 @@
},
}
// Augment the matchfields with the ofpfields from the flow
- fa.MatchFields = append(fa.MatchFields, fu.GetOfbFields(flow, fu.IN_PORT, fu.VLAN_VID)...)
- fg.AddFlow(fu.MkFlowStat(fa))
-
- // Downstream flow
- fa = &fu.FlowArgs{
- KV: fu.OfpFlowModArgs{"priority": uint64(flow.Priority)},
- MatchFields: []*ofp.OfpOxmOfbField{
- fu.InPort(egressHop.Egress),
- fu.VlanVid(uint32(ofp.OfpVlanId_OFPVID_PRESENT) | 4000),
- fu.VlanPcp(0),
- fu.Metadata_ofp(uint64(inputPort)),
- fu.TunnelId(uint64(inputPort)),
- },
- Actions: []*ofp.OfpAction{
- fu.PopVlan(),
- fu.Output(egressHop.Ingress),
- },
- }
+ fa.MatchFields = append(fa.MatchFields, fu.GetOfbFields(flow, fu.IN_PORT)...)
fg.AddFlow(fu.MkFlowStat(fa))
}
}
@@ -177,17 +161,21 @@
log.Debugw("upstream-non-controller-bound-flow", log.Fields{"inPortNo": inPortNo, "outPortNo": outPortNo})
deviceRules := fu.NewDeviceRules()
+ meterId := fu.GetMeterIdFromFlow(flow)
+ metadataFromwriteMetadata := fu.GetMetadataFromWriteMetadataAction(flow)
+
ingressHop := route[0]
egressHop := route[1]
- if fu.HasNextTable(flow) {
- log.Debugw("has-next-table", log.Fields{"table_id": flow.TableId})
+ if flow.TableId == 0 && fu.HasNextTable(flow) {
+ log.Debugw("decomposing-onu-flow-in-upstream-has-next-table", log.Fields{"table_id": flow.TableId})
if outPortNo != 0 {
log.Warnw("outPort-should-not-be-specified", log.Fields{"outPortNo": outPortNo})
+ return deviceRules
}
var fa *fu.FlowArgs
fa = &fu.FlowArgs{
- KV: fu.OfpFlowModArgs{"priority": uint64(flow.Priority), "cookie": flow.Cookie},
+ KV: fu.OfpFlowModArgs{"priority": uint64(flow.Priority), "cookie": flow.Cookie, "meter_id": uint64(meterId), "write_metadata": metadataFromwriteMetadata},
MatchFields: []*ofp.OfpOxmOfbField{
fu.InPort(ingressHop.Ingress),
fu.TunnelId(uint64(inPortNo)),
@@ -203,73 +191,27 @@
fg := fu.NewFlowsAndGroups()
fg.AddFlow(fu.MkFlowStat(fa))
deviceRules.AddFlowsAndGroup(ingressHop.DeviceID, fg)
- } else {
- var actions []ofp.OfpActionType
- var isOutputTypeInActions bool
- for _, action := range fu.GetActions(flow) {
- actions = append(actions, action.Type)
- if !isOutputTypeInActions && action.Type == fu.OUTPUT {
- isOutputTypeInActions = true
- }
+ } else if flow.TableId == 1 && outPortNo != 0 {
+ log.Debugw("decomposing-olt-flow-in-upstream-has-next-table", log.Fields{"table_id": flow.TableId})
+ var fa *fu.FlowArgs
+ fa = &fu.FlowArgs{
+ KV: fu.OfpFlowModArgs{"priority": uint64(flow.Priority), "cookie": flow.Cookie, "meter_id": uint64(meterId), "write_metadata": metadataFromwriteMetadata},
+ MatchFields: []*ofp.OfpOxmOfbField{
+ fu.InPort(egressHop.Ingress),
+ fu.TunnelId(uint64(inPortNo)),
+ },
}
- if len(actions) == 1 && isOutputTypeInActions {
- var fa *fu.FlowArgs
- // child device flow
- fa = &fu.FlowArgs{
- KV: fu.OfpFlowModArgs{"priority": uint64(flow.Priority), "cookie": flow.Cookie},
- MatchFields: []*ofp.OfpOxmOfbField{
- fu.InPort(ingressHop.Ingress),
- },
- Actions: []*ofp.OfpAction{
- fu.Output(ingressHop.Egress),
- },
- }
- // Augment the matchfields with the ofpfields from the flow
- fa.MatchFields = append(fa.MatchFields, fu.GetOfbFields(flow, fu.IN_PORT)...)
- fg := fu.NewFlowsAndGroups()
- fg.AddFlow(fu.MkFlowStat(fa))
- deviceRules.AddFlowsAndGroup(ingressHop.DeviceID, fg)
+ // Augment the matchfields with the ofpfields from the flow
+ fa.MatchFields = append(fa.MatchFields, fu.GetOfbFields(flow, fu.IN_PORT)...)
- // parent device flow
- fa = &fu.FlowArgs{
- KV: fu.OfpFlowModArgs{"priority": uint64(flow.Priority), "cookie": flow.Cookie},
- MatchFields: []*ofp.OfpOxmOfbField{
- fu.InPort(egressHop.Ingress), //egress_hop.ingress_port.port_no
- fu.TunnelId(uint64(inPortNo)),
- },
- Actions: []*ofp.OfpAction{
- fu.Output(egressHop.Egress),
- },
- }
- // Augment the matchfields with the ofpfields from the flow
- fa.MatchFields = append(fa.MatchFields, fu.GetOfbFields(flow, fu.IN_PORT)...)
- fg = fu.NewFlowsAndGroups()
- fg.AddFlow(fu.MkFlowStat(fa))
- deviceRules.AddFlowsAndGroup(egressHop.DeviceID, fg)
- } else {
- if outPortNo == 0 {
- log.Warnw("outPort-should-be-specified", log.Fields{"outPortNo": outPortNo})
- }
- var fa *fu.FlowArgs
- fa = &fu.FlowArgs{
- KV: fu.OfpFlowModArgs{"priority": uint64(flow.Priority), "cookie": flow.Cookie},
- MatchFields: []*ofp.OfpOxmOfbField{
- fu.InPort(egressHop.Ingress),
- fu.TunnelId(uint64(inPortNo)),
- },
- }
- // Augment the matchfields with the ofpfields from the flow
- fa.MatchFields = append(fa.MatchFields, fu.GetOfbFields(flow, fu.IN_PORT)...)
+ //Augment the actions
+ filteredAction := fu.GetActions(flow, fu.OUTPUT)
+ filteredAction = append(filteredAction, fu.Output(egressHop.Egress))
+ fa.Actions = filteredAction
- //Augment the actions
- filteredAction := fu.GetActions(flow, fu.OUTPUT)
- filteredAction = append(filteredAction, fu.Output(egressHop.Egress))
- fa.Actions = filteredAction
-
- fg := fu.NewFlowsAndGroups()
- fg.AddFlow(fu.MkFlowStat(fa))
- deviceRules.AddFlowsAndGroup(egressHop.DeviceID, fg)
- }
+ fg := fu.NewFlowsAndGroups()
+ fg.AddFlow(fu.MkFlowStat(fa))
+ deviceRules.AddFlowsAndGroup(egressHop.DeviceID, fg)
}
return deviceRules
}
@@ -277,25 +219,32 @@
// processDownstreamFlowWithNextTable decomposes downstream flows containing next table ID instructions
func (fd *FlowDecomposer) processDownstreamFlowWithNextTable(agent coreIf.LogicalDeviceAgent, route []graph.RouteHop,
inPortNo uint32, outPortNo uint32, flow *ofp.OfpFlowStats) *fu.DeviceRules {
-
- log.Debugw("downstream-flow-with-next-table", log.Fields{"inPortNo": inPortNo, "outPortNo": outPortNo})
+ log.Debugw("decomposing-olt-flow-in-downstream-flow-with-next-table", log.Fields{"inPortNo": inPortNo, "outPortNo": outPortNo})
deviceRules := fu.NewDeviceRules()
+ meterId := fu.GetMeterIdFromFlow(flow)
+ metadataFromwriteMetadata := fu.GetMetadataFromWriteMetadataAction(flow)
if outPortNo != 0 {
log.Warnw("outPort-should-not-be-specified", log.Fields{"outPortNo": outPortNo})
+ return deviceRules
}
+
+ if flow.TableId != 0 {
+ log.Warnw("This is not olt pipeline table, so skipping", log.Fields{"tableId": flow.TableId})
+ return deviceRules
+ }
+
ingressHop := route[0]
egressHop := route[1]
-
- if fu.GetMetaData(flow) != 0 {
+ if metadataFromwriteMetadata != 0 {
log.Debugw("creating-metadata-flow", log.Fields{"flow": flow})
- portNumber := uint32(fu.GetPortNumberFromMetadata(flow))
+ portNumber := fu.GetEgressPortNumberFromWriteMetadata(flow)
if portNumber != 0 {
recalculatedRoute := agent.GetRoute(inPortNo, portNumber)
switch len(recalculatedRoute) {
case 0:
- log.Errorw("no-route-double-tag", log.Fields{"inPortNo": inPortNo, "outPortNo": portNumber, "comment": "deleting-flow", "metadata": fu.GetMetaData64Bit(flow)})
- // TODO: Delete flow
+ log.Errorw("no-route-double-tag", log.Fields{"inPortNo": inPortNo, "outPortNo": portNumber, "comment": "deleting-flow", "metadata": metadataFromwriteMetadata})
+ //TODO: Delete flow
return deviceRules
case 2:
log.Debugw("route-found", log.Fields{"ingressHop": ingressHop, "egressHop": egressHop})
@@ -308,16 +257,16 @@
}
innerTag := fu.GetInnerTagFromMetaData(flow)
if innerTag == 0 {
- log.Errorw("no-inner-route-double-tag", log.Fields{"inPortNo": inPortNo, "outPortNo": portNumber, "comment": "deleting-flow", "metadata": fu.GetMetaData64Bit(flow)})
- // TODO: Delete flow
+ log.Errorw("no-inner-route-double-tag", log.Fields{"inPortNo": inPortNo, "outPortNo": portNumber, "comment": "deleting-flow", "metadata": metadataFromwriteMetadata})
+ //TODO: Delete flow
return deviceRules
}
var fa *fu.FlowArgs
fa = &fu.FlowArgs{
- KV: fu.OfpFlowModArgs{"priority": uint64(flow.Priority), "cookie": flow.Cookie},
+ KV: fu.OfpFlowModArgs{"priority": uint64(flow.Priority), "cookie": flow.Cookie, "meter_id": uint64(meterId), "write_metadata": metadataFromwriteMetadata},
MatchFields: []*ofp.OfpOxmOfbField{
fu.InPort(ingressHop.Ingress),
- fu.Metadata_ofp(innerTag),
+ fu.Metadata_ofp(uint64(innerTag)),
fu.TunnelId(uint64(portNumber)),
},
Actions: fu.GetActions(flow),
@@ -335,7 +284,7 @@
log.Debugw("creating-standard-flow", log.Fields{"flow": flow})
var fa *fu.FlowArgs
fa = &fu.FlowArgs{
- KV: fu.OfpFlowModArgs{"priority": uint64(flow.Priority), "cookie": flow.Cookie},
+ KV: fu.OfpFlowModArgs{"priority": uint64(flow.Priority), "cookie": flow.Cookie, "meter_id": uint64(meterId), "write_metadata": metadataFromwriteMetadata},
MatchFields: []*ofp.OfpOxmOfbField{
fu.InPort(ingressHop.Ingress),
fu.TunnelId(uint64(inPortNo)),
@@ -360,76 +309,31 @@
func (fd *FlowDecomposer) processUnicastFlow(agent coreIf.LogicalDeviceAgent, route []graph.RouteHop,
inPortNo uint32, outPortNo uint32, flow *ofp.OfpFlowStats) *fu.DeviceRules {
- log.Debugw("unicast-flow", log.Fields{"inPortNo": inPortNo, "outPortNo": outPortNo})
+ log.Debugw("decomposing-onu-flow-in-downstream-unicast-flow", log.Fields{"inPortNo": inPortNo, "outPortNo": outPortNo})
deviceRules := fu.NewDeviceRules()
- ingressHop := route[0]
egressHop := route[1]
- var actions []ofp.OfpActionType
- var isOutputTypeInActions bool
- for _, action := range fu.GetActions(flow) {
- actions = append(actions, action.Type)
- if !isOutputTypeInActions && action.Type == fu.OUTPUT {
- isOutputTypeInActions = true
- }
+ meterId := fu.GetMeterIdFromFlow(flow)
+ metadataFromwriteMetadata := fu.GetMetadataFromWriteMetadataAction(flow)
+ var fa *fu.FlowArgs
+ fa = &fu.FlowArgs{
+ KV: fu.OfpFlowModArgs{"priority": uint64(flow.Priority), "cookie": flow.Cookie, "meter_id": uint64(meterId), "write_metadata": metadataFromwriteMetadata},
+ MatchFields: []*ofp.OfpOxmOfbField{
+ fu.InPort(egressHop.Ingress),
+ },
}
- if len(actions) == 1 && isOutputTypeInActions {
- var fa *fu.FlowArgs
- // Parent device flow
- fa = &fu.FlowArgs{
- KV: fu.OfpFlowModArgs{"priority": uint64(flow.Priority), "cookie": flow.Cookie},
- MatchFields: []*ofp.OfpOxmOfbField{
- fu.InPort(ingressHop.Ingress),
- fu.TunnelId(uint64(inPortNo)),
- },
- Actions: []*ofp.OfpAction{
- fu.Output(ingressHop.Egress),
- },
- }
- // Augment the matchfields with the ofpfields from the flow
- fa.MatchFields = append(fa.MatchFields, fu.GetOfbFields(flow, fu.IN_PORT)...)
+ // Augment the matchfields with the ofpfields from the flow
+ fa.MatchFields = append(fa.MatchFields, fu.GetOfbFields(flow, fu.IN_PORT)...)
- fg := fu.NewFlowsAndGroups()
- fg.AddFlow(fu.MkFlowStat(fa))
- deviceRules.AddFlowsAndGroup(ingressHop.DeviceID, fg)
+ // Augment the Actions
+ filteredAction := fu.GetActions(flow, fu.OUTPUT)
+ filteredAction = append(filteredAction, fu.Output(egressHop.Egress))
+ fa.Actions = filteredAction
- // Child device flow
- fa = &fu.FlowArgs{
- KV: fu.OfpFlowModArgs{"priority": uint64(flow.Priority), "cookie": flow.Cookie},
- MatchFields: []*ofp.OfpOxmOfbField{
- fu.InPort(egressHop.Ingress),
- },
- Actions: []*ofp.OfpAction{
- fu.Output(egressHop.Egress),
- },
- }
- // Augment the matchfields with the ofpfields from the flow
- fa.MatchFields = append(fa.MatchFields, fu.GetOfbFields(flow, fu.IN_PORT)...)
-
- fg = fu.NewFlowsAndGroups()
- fg.AddFlow(fu.MkFlowStat(fa))
- deviceRules.AddFlowsAndGroup(egressHop.DeviceID, fg)
- } else {
- var fa *fu.FlowArgs
- fa = &fu.FlowArgs{
- KV: fu.OfpFlowModArgs{"priority": uint64(flow.Priority), "cookie": flow.Cookie},
- MatchFields: []*ofp.OfpOxmOfbField{
- fu.InPort(egressHop.Ingress),
- },
- }
- // Augment the matchfields with the ofpfields from the flow
- fa.MatchFields = append(fa.MatchFields, fu.GetOfbFields(flow, fu.IN_PORT)...)
-
- // Augment the Actions
- filteredAction := fu.GetActions(flow, fu.OUTPUT)
- filteredAction = append(filteredAction, fu.Output(egressHop.Egress))
- fa.Actions = filteredAction
-
- fg := fu.NewFlowsAndGroups()
- fg.AddFlow(fu.MkFlowStat(fa))
- deviceRules.AddFlowsAndGroup(egressHop.DeviceID, fg)
- }
+ fg := fu.NewFlowsAndGroups()
+ fg.AddFlow(fu.MkFlowStat(fa))
+ deviceRules.AddFlowsAndGroup(egressHop.DeviceID, fg)
return deviceRules
}
@@ -559,14 +463,20 @@
return deviceRules
}
isUpstream := !ingressDevice.Root
- if isUpstream {
+ if isUpstream { // Unicast OLT and ONU UL
+ log.Info("processOltAndOnuUpstreamNonControllerBoundUnicastFlows", log.Fields{"flows": flow})
deviceRules = fd.processUpstreamNonControllerBoundFlow(agent, route, inPortNo, outPortNo, flow)
- } else if fu.HasNextTable(flow) {
+ } else if fu.HasNextTable(flow) && flow.TableId == 0 { // Unicast OLT flow DL
+ log.Debugw("processOltDownstreamNonControllerBoundFlowWithNextTable", log.Fields{"flows": flow})
deviceRules = fd.processDownstreamFlowWithNextTable(agent, route, inPortNo, outPortNo, flow)
- } else if outPortNo != 0 { // Unicast
+ } else if flow.TableId == 1 && outPortNo != 0 { // Unicast ONU flow DL
+ log.Debugw("processOnuDownstreamUnicastFlow", log.Fields{"flows": flow})
deviceRules = fd.processUnicastFlow(agent, route, inPortNo, outPortNo, flow)
- } else if grpId := fu.GetGroup(flow); grpId != 0 { //Multicast
+ } else if grpId := fu.GetGroup(flow); grpId != 0 && flow.TableId == 0 { //Multicast
+ log.Debugw("processMulticastFlow", log.Fields{"flows": flow})
deviceRules = fd.processMulticastFlow(agent, route, inPortNo, outPortNo, flow, grpId, groupMap)
+ } else {
+ log.Errorw("unknown-downstream-flow", log.Fields{"flow": *flow})
}
}
deviceRules = fd.updateOutputPortForControllerBoundFlowForParentDevide(flow, deviceRules)
diff --git a/rw_core/flow_decomposition/flow_decomposer_test.go b/rw_core/flow_decomposition/flow_decomposer_test.go
index 41a93e4..f4632cd 100644
--- a/rw_core/flow_decomposition/flow_decomposer_test.go
+++ b/rw_core/flow_decomposition/flow_decomposer_test.go
@@ -28,9 +28,18 @@
)
func init() {
- log.AddPackage(log.JSON, log.WarnLevel, nil)
- log.UpdateAllLoggers(log.Fields{"instanceId": "flow-decomposition"})
- log.SetAllLogLevel(log.WarnLevel)
+ // Setup default logger - applies for packages that do not have specific logger set
+ if _, err := log.SetDefaultLogger(log.JSON, 0, log.Fields{"instanceId": 1}); err != nil {
+ log.With(log.Fields{"error": err}).Fatal("Cannot setup logging")
+ }
+
+ // Update all loggers (provisioned via init) with a common field
+ if err := log.UpdateAllLoggers(log.Fields{"instanceId": 1}); err != nil {
+ log.With(log.Fields{"error": err}).Fatal("Cannot setup logging")
+ }
+
+ // Update all loggers to log level specified as input parameter
+ log.SetAllLogLevel(0)
}
type testDeviceManager struct {
@@ -473,7 +482,6 @@
KV: fu.OfpFlowModArgs{"priority": 1000},
MatchFields: []*ofp.OfpOxmOfbField{
fu.InPort(1),
- fu.VlanVid(uint32(ofp.OfpVlanId_OFPVID_PRESENT) | 0),
fu.EthType(0x888e),
},
Actions: []*ofp.OfpAction{
@@ -490,14 +498,13 @@
onu1FlowAndGroup := deviceRules.Rules["onu1"]
oltFlowAndGroup := deviceRules.Rules["olt"]
assert.Nil(t, onu1FlowAndGroup)
- assert.Equal(t, 2, oltFlowAndGroup.Flows.Len())
+ assert.Equal(t, 1, oltFlowAndGroup.Flows.Len())
assert.Equal(t, 0, oltFlowAndGroup.Groups.Len())
fa = &fu.FlowArgs{
KV: fu.OfpFlowModArgs{"priority": 1000},
MatchFields: []*ofp.OfpOxmOfbField{
fu.InPort(1),
- fu.VlanVid(uint32(ofp.OfpVlanId_OFPVID_PRESENT) | 1),
fu.TunnelId(uint64(1)),
fu.EthType(0x888e),
},
@@ -510,24 +517,6 @@
expectedOltFlow := fu.MkFlowStat(fa)
derivedFlow := oltFlowAndGroup.GetFlow(0)
assert.Equal(t, expectedOltFlow.String(), derivedFlow.String())
-
- fa = &fu.FlowArgs{
- KV: fu.OfpFlowModArgs{"priority": 1000},
- MatchFields: []*ofp.OfpOxmOfbField{
- fu.InPort(2),
- fu.VlanVid(uint32(ofp.OfpVlanId_OFPVID_PRESENT) | 4000),
- fu.VlanPcp(0),
- fu.Metadata_ofp(1),
- fu.TunnelId(uint64(1)),
- },
- Actions: []*ofp.OfpAction{
- fu.PopVlan(),
- fu.Output(1),
- },
- }
- expectedOltFlow = fu.MkFlowStat(fa)
- derivedFlow = oltFlowAndGroup.GetFlow(1)
- assert.Equal(t, expectedOltFlow.String(), derivedFlow.String())
}
func TestDhcpReRouteRuleDecomposition(t *testing.T) {
@@ -537,7 +526,6 @@
KV: fu.OfpFlowModArgs{"priority": 1000},
MatchFields: []*ofp.OfpOxmOfbField{
fu.InPort(1),
- fu.VlanVid(uint32(ofp.OfpVlanId_OFPVID_PRESENT) | 0),
fu.EthType(0x0800),
fu.Ipv4Dst(0xffffffff),
fu.IpProto(17),
@@ -557,14 +545,13 @@
onu1FlowAndGroup := deviceRules.Rules["onu1"]
oltFlowAndGroup := deviceRules.Rules["olt"]
assert.Nil(t, onu1FlowAndGroup)
- assert.Equal(t, 2, oltFlowAndGroup.Flows.Len())
+ assert.Equal(t, 1, oltFlowAndGroup.Flows.Len())
assert.Equal(t, 0, oltFlowAndGroup.Groups.Len())
fa = &fu.FlowArgs{
KV: fu.OfpFlowModArgs{"priority": 1000},
MatchFields: []*ofp.OfpOxmOfbField{
fu.InPort(1),
- fu.VlanVid(uint32(ofp.OfpVlanId_OFPVID_PRESENT) | 1),
fu.TunnelId(uint64(1)),
fu.EthType(0x0800),
fu.Ipv4Dst(0xffffffff),
@@ -581,31 +568,12 @@
expectedOltFlow := fu.MkFlowStat(fa)
derivedFlow := oltFlowAndGroup.GetFlow(0)
assert.Equal(t, expectedOltFlow.String(), derivedFlow.String())
-
- fa = &fu.FlowArgs{
- KV: fu.OfpFlowModArgs{"priority": 1000},
- MatchFields: []*ofp.OfpOxmOfbField{
- fu.InPort(2),
- fu.VlanVid(uint32(ofp.OfpVlanId_OFPVID_PRESENT) | 4000),
- fu.VlanPcp(0),
- fu.Metadata_ofp(1),
- fu.TunnelId(uint64(1)),
- },
- Actions: []*ofp.OfpAction{
- fu.PopVlan(),
- fu.Output(1),
- },
- }
- expectedOltFlow = fu.MkFlowStat(fa)
- derivedFlow = oltFlowAndGroup.GetFlow(1)
- assert.Equal(t, expectedOltFlow.String(), derivedFlow.String())
}
func TestUnicastUpstreamRuleDecomposition(t *testing.T) {
-
var fa *fu.FlowArgs
fa = &fu.FlowArgs{
- KV: fu.OfpFlowModArgs{"priority": 500, "table_id": 1},
+ KV: fu.OfpFlowModArgs{"priority": 5000, "table_id": 0},
MatchFields: []*ofp.OfpOxmOfbField{
fu.InPort(1),
fu.VlanVid(uint32(ofp.OfpVlanId_OFPVID_PRESENT) | 0),
@@ -618,7 +586,7 @@
var fa2 *fu.FlowArgs
fa2 = &fu.FlowArgs{
- KV: fu.OfpFlowModArgs{"priority": 500},
+ KV: fu.OfpFlowModArgs{"priority": 500, "table_id": 1},
MatchFields: []*ofp.OfpOxmOfbField{
fu.InPort(1),
fu.VlanVid(uint32(ofp.OfpVlanId_OFPVID_PRESENT) | 101),
@@ -633,19 +601,29 @@
}
flows := ofp.Flows{Items: []*ofp.OfpFlowStats{fu.MkFlowStat(fa), fu.MkFlowStat(fa2)}}
+ flows.Items[0].Instructions = []*ofp.OfpInstruction{{
+ Type: uint32(ofp.OfpInstructionType_OFPIT_GOTO_TABLE),
+ Data: &ofp.OfpInstruction_GotoTable{
+ GotoTable: &ofp.OfpInstructionGotoTable{
+ TableId: 1,
+ },
+ }}}
+
groups := ofp.FlowGroups{}
tfd := newTestFlowDecomposer(newTestDeviceManager())
deviceRules := tfd.fd.DecomposeRules(tfd, flows, groups)
onu1FlowAndGroup := deviceRules.Rules["onu1"]
oltFlowAndGroup := deviceRules.Rules["olt"]
+ assert.NotNil(t, onu1FlowAndGroup)
+ assert.NotNil(t, onu1FlowAndGroup.Flows)
assert.Equal(t, 1, onu1FlowAndGroup.Flows.Len())
assert.Equal(t, 0, onu1FlowAndGroup.Groups.Len())
assert.Equal(t, 1, oltFlowAndGroup.Flows.Len())
assert.Equal(t, 0, oltFlowAndGroup.Groups.Len())
fa = &fu.FlowArgs{
- KV: fu.OfpFlowModArgs{"priority": 500},
+ KV: fu.OfpFlowModArgs{"priority": 5000},
MatchFields: []*ofp.OfpOxmOfbField{
fu.InPort(2),
fu.TunnelId(uint64(1)),
@@ -657,8 +635,24 @@
fu.Output(1),
},
}
- expectedOnu1Flow := fu.MkFlowStat(fa)
+
derivedFlow := onu1FlowAndGroup.GetFlow(0)
+ // Form the expected flow
+ expectedOnu1Flow := fu.MkFlowStat(fa)
+ expectedOnu1Flow.Instructions = []*ofp.OfpInstruction{{
+ Type: uint32(ofp.OfpInstructionType_OFPIT_APPLY_ACTIONS),
+ Data: &ofp.OfpInstruction_Actions{
+ Actions: &ofp.OfpInstructionActions{
+ Actions: []*ofp.OfpAction{{
+ Type: 0,
+ Action: &ofp.OfpAction_Output{
+ Output: &ofp.OfpActionOutput{
+ Port: 1,
+ MaxLen: 65509,
+ },
+ }}}}}}}
+
+ expectedOnu1Flow.Id = derivedFlow.Id // Assign same flow ID as derived flowID to match completely
assert.Equal(t, expectedOnu1Flow.String(), derivedFlow.String())
fa = &fu.FlowArgs{
@@ -682,9 +676,10 @@
}
func TestUnicastDownstreamRuleDecomposition(t *testing.T) {
+ log.Debugf("Starting Test Unicast Downstream")
var fa1 *fu.FlowArgs
fa1 = &fu.FlowArgs{
- KV: fu.OfpFlowModArgs{"priority": 500, "table_id": 1},
+ KV: fu.OfpFlowModArgs{"priority": 500, "table_id": 0},
MatchFields: []*ofp.OfpOxmOfbField{
fu.InPort(10),
fu.Metadata_ofp((1000 << 32) | 1),
@@ -697,7 +692,7 @@
var fa2 *fu.FlowArgs
fa2 = &fu.FlowArgs{
- KV: fu.OfpFlowModArgs{"priority": 500},
+ KV: fu.OfpFlowModArgs{"priority": 500, "table_id": 1},
MatchFields: []*ofp.OfpOxmOfbField{
fu.InPort(10),
fu.VlanVid(uint32(ofp.OfpVlanId_OFPVID_PRESENT) | 101),
@@ -710,10 +705,19 @@
}
flows := ofp.Flows{Items: []*ofp.OfpFlowStats{fu.MkFlowStat(fa1), fu.MkFlowStat(fa2)}}
+ flows.Items[0].Instructions = []*ofp.OfpInstruction{{
+ Type: uint32(ofp.OfpInstructionType_OFPIT_GOTO_TABLE),
+ Data: &ofp.OfpInstruction_GotoTable{
+ GotoTable: &ofp.OfpInstructionGotoTable{
+ TableId: 1,
+ },
+ }}}
+
groups := ofp.FlowGroups{}
tfd := newTestFlowDecomposer(newTestDeviceManager())
deviceRules := tfd.fd.DecomposeRules(tfd, flows, groups)
+
onu1FlowAndGroup := deviceRules.Rules["onu1"]
oltFlowAndGroup := deviceRules.Rules["olt"]
assert.Equal(t, 1, onu1FlowAndGroup.Flows.Len())
@@ -725,8 +729,8 @@
KV: fu.OfpFlowModArgs{"priority": 500},
MatchFields: []*ofp.OfpOxmOfbField{
fu.InPort(2),
- fu.Metadata_ofp(1000),
- fu.TunnelId(uint64(1)),
+ fu.TunnelId(uint64(10)),
+ fu.Metadata_ofp(4294967296001),
fu.VlanPcp(0),
},
Actions: []*ofp.OfpAction{
@@ -734,8 +738,22 @@
fu.Output(1),
},
}
- expectedOltFlow := fu.MkFlowStat(fa1)
+
derivedFlow := oltFlowAndGroup.GetFlow(0)
+ expectedOltFlow := fu.MkFlowStat(fa1)
+ expectedOltFlow.Instructions = []*ofp.OfpInstruction{{
+ Type: uint32(ofp.OfpInstructionType_OFPIT_APPLY_ACTIONS),
+ Data: &ofp.OfpInstruction_Actions{
+ Actions: &ofp.OfpInstructionActions{
+ Actions: []*ofp.OfpAction{{
+ Type: 0,
+ Action: &ofp.OfpAction_Output{
+ Output: &ofp.OfpActionOutput{
+ Port: 1,
+ MaxLen: 65509,
+ },
+ }}}}}}}
+ expectedOltFlow.Id = derivedFlow.Id
assert.Equal(t, expectedOltFlow.String(), derivedFlow.String())
fa1 = &fu.FlowArgs{
diff --git a/rw_core/utils/flow_utils.go b/rw_core/utils/flow_utils.go
index 3828b39..4293126 100644
--- a/rw_core/utils/flow_utils.go
+++ b/rw_core/utils/flow_utils.go
@@ -29,7 +29,9 @@
var (
// Instructions shortcut
- APPLY_ACTIONS = ofp.OfpInstructionType_OFPIT_APPLY_ACTIONS
+ APPLY_ACTIONS = ofp.OfpInstructionType_OFPIT_APPLY_ACTIONS
+ WRITE_METADATA = ofp.OfpInstructionType_OFPIT_WRITE_METADATA
+ METER_ACTION = ofp.OfpInstructionType_OFPIT_METER
//OFPAT_* shortcuts
OUTPUT = ofp.OfpActionType_OFPAT_OUTPUT
@@ -456,6 +458,22 @@
return 0
}
+func GetMeterId(flow *ofp.OfpFlowStats) uint32 {
+ if flow == nil {
+ return 0
+ }
+ for _, instruction := range flow.Instructions {
+ if instruction.Type == uint32(ofp.OfpInstructionType_OFPIT_METER) {
+ MeterInstruction := instruction.GetMeter()
+ if MeterInstruction == nil {
+ return 0
+ }
+ return MeterInstruction.GetMeterId()
+ }
+ }
+ return 0
+}
+
func GetTunnelId(flow *ofp.OfpFlowStats) uint64 {
if flow == nil {
return 0
@@ -475,9 +493,10 @@
}
for _, field := range GetOfbFields(flow) {
if field.Type == METADATA {
- return uint32(field.GetTableMetadata() & 0xffffffff)
+ return uint32(field.GetTableMetadata() & 0xFFFFFFFF)
}
}
+ log.Debug("No-metadata-present")
return 0
}
@@ -490,28 +509,83 @@
return field.GetTableMetadata()
}
}
+ log.Debug("No-metadata-present")
return 0
}
-// GetPortNumberFromMetadata retrieves the port number from the Metadata_ofp. The port number (UNI on ONU) is in the
-// lower 32-bits of Metadata_ofp and the inner_tag is in the upper 32-bits. This is set in the ONOS OltPipeline as
-// a Metadata_ofp field
-func GetPortNumberFromMetadata(flow *ofp.OfpFlowStats) uint64 {
- md := GetMetaData64Bit(flow)
- if md == 0 {
- return 0
+// function returns write metadata value from write_metadata action field
+func GetMetadataFromWriteMetadataAction(flow *ofp.OfpFlowStats) uint64 {
+ if flow != nil {
+ for _, instruction := range flow.Instructions {
+ if instruction.Type == uint32(WRITE_METADATA) {
+ if writeMetadata := instruction.GetWriteMetadata(); writeMetadata != nil {
+ return writeMetadata.GetMetadata()
+ }
+ }
+ }
}
- if md <= 0xffffffff {
- log.Debugw("onos-upgrade-suggested", log.Fields{"Metadata_ofp": md, "message": "Legacy MetaData detected form OltPipeline"})
- return md
+ log.Debugw("No-write-metadata-present", log.Fields{"flow": flow})
+ return 0
+}
+
+func GetTechProfileIDFromWriteMetaData(metadata uint64) uint16 {
+ /*
+ Write metadata instruction value (metadata) is 8 bytes:
+ MS 2 bytes: C Tag
+ Next 2 bytes: Technology Profile Id
+ Next 4 bytes: Port number (uni or nni)
+
+ This is set in the ONOS OltPipeline as a write metadata instruction
+ */
+ var tpId uint16 = 0
+ log.Debugw("Write metadata value for Techprofile ID", log.Fields{"metadata": metadata})
+ if metadata != 0 {
+ tpId = uint16((metadata >> 32) & 0xFFFF)
+ log.Debugw("Found techprofile ID from write metadata action", log.Fields{"tpid": tpId})
}
- return md & 0xffffffff
+ return tpId
+}
+
+func GetEgressPortNumberFromWriteMetadata(flow *ofp.OfpFlowStats) uint32 {
+ /*
+ Write metadata instruction value (metadata) is 8 bytes:
+ MS 2 bytes: C Tag
+ Next 2 bytes: Technology Profile Id
+ Next 4 bytes: Port number (uni or nni)
+ This is set in the ONOS OltPipeline as a write metadata instruction
+ */
+ var uniPort uint32 = 0
+ md := GetMetadataFromWriteMetadataAction(flow)
+ log.Debugw("Metadata found for egress/uni port ", log.Fields{"metadata": md})
+ if md != 0 {
+ uniPort = uint32(md & 0xFFFFFFFF)
+ log.Debugw("Found EgressPort from write metadata action", log.Fields{"egress_port": uniPort})
+ }
+ return uniPort
+
+}
+
+func GetInnerTagFromMetaData(flow *ofp.OfpFlowStats) uint16 {
+ /*
+ Write metadata instruction value (metadata) is 8 bytes:
+ MS 2 bytes: C Tag
+ Next 2 bytes: Technology Profile Id
+ Next 4 bytes: Port number (uni or nni)
+ This is set in the ONOS OltPipeline as a write metadata instruction
+ */
+ var innerTag uint16 = 0
+ md := GetMetadataFromWriteMetadataAction(flow)
+ if md != 0 {
+ innerTag = uint16((md >> 48) & 0xFFFF)
+ log.Debugw("Found CVLAN from write metadate action", log.Fields{"c_vlan": innerTag})
+ }
+ return innerTag
}
//GetInnerTagFromMetaData retrieves the inner tag from the Metadata_ofp. The port number (UNI on ONU) is in the
// lower 32-bits of Metadata_ofp and the inner_tag is in the upper 32-bits. This is set in the ONOS OltPipeline as
//// a Metadata_ofp field
-func GetInnerTagFromMetaData(flow *ofp.OfpFlowStats) uint64 {
+/*func GetInnerTagFromMetaData(flow *ofp.OfpFlowStats) uint64 {
md := GetMetaData64Bit(flow)
if md == 0 {
return 0
@@ -521,7 +595,7 @@
return md
}
return (md >> 32) & 0xffffffff
-}
+}*/
// Extract the child device port from a flow that contains the parent device peer port. Typically the UNI port of an
// ONU child device. Per TST agreement this will be the lower 32 bits of tunnel id reserving upper 32 bits for later
@@ -571,6 +645,23 @@
return nil
}
+// GetMeterIdFlowModArgs returns the meterId if the "meter_id" is present in the map, otherwise return 0
+func GetMeterIdFlowModArgs(kw OfpFlowModArgs) uint32 {
+ if val, exist := kw["meter_id"]; exist {
+ return uint32(val)
+ }
+ return 0
+}
+
+// Function returns the metadata if the "write_metadata" is present in the map, otherwise return nil
+func GetMetadataFlowModArgs(kw OfpFlowModArgs) uint64 {
+ if val, exist := kw["write_metadata"]; exist {
+ ret := uint64(val)
+ return ret
+ }
+ return 0
+}
+
// Return unique 64-bit integer hash for flow covering the following attributes:
// 'table_id', 'priority', 'flags', 'cookie', 'match', '_instruction_string'
func HashFlowStats(flow *ofp.OfpFlowStats) uint64 {
@@ -619,6 +710,53 @@
return group
}
+// flowStatsEntryFromFlowModMessage maps an ofp_flow_mod message to an ofp_flow_stats message
+func MeterEntryFromMeterMod(meterMod *ofp.OfpMeterMod) *ofp.OfpMeterEntry {
+ bandStats := make([]*ofp.OfpMeterBandStats, 0)
+ meter := &ofp.OfpMeterEntry{Config: &ofp.OfpMeterConfig{},
+ Stats: &ofp.OfpMeterStats{BandStats: bandStats}}
+ if meterMod == nil {
+ log.Error("Invalid meter mod command")
+ return meter
+ }
+ // config init
+ meter.Config.MeterId = meterMod.MeterId
+ meter.Config.Flags = meterMod.Flags
+ meter.Config.Bands = meterMod.Bands
+ // meter stats init
+ meter.Stats.MeterId = meterMod.MeterId
+ meter.Stats.FlowCount = 0
+ meter.Stats.PacketInCount = 0
+ meter.Stats.ByteInCount = 0
+ meter.Stats.DurationSec = 0
+ meter.Stats.DurationNsec = 0
+ // band stats init
+ for _, _ = range meterMod.Bands {
+ band := &ofp.OfpMeterBandStats{}
+ band.PacketBandCount = 0
+ band.ByteBandCount = 0
+ bandStats = append(bandStats, band)
+ }
+ meter.Stats.BandStats = bandStats
+ log.Debugw("Allocated meter entry", log.Fields{"meter": *meter})
+ return meter
+
+}
+
+func GetMeterIdFromFlow(flow *ofp.OfpFlowStats) uint32 {
+ if flow != nil {
+ for _, instruction := range flow.Instructions {
+ if instruction.Type == uint32(METER_ACTION) {
+ if meterInst := instruction.GetMeter(); meterInst != nil {
+ return meterInst.GetMeterId()
+ }
+ }
+ }
+ }
+
+ return uint32(0)
+}
+
func MkOxmFields(matchFields []ofp.OfpOxmField) []*ofp.OfpOxmField {
oxmFields := make([]*ofp.OfpOxmField, 0)
for _, matchField := range matchFields {
@@ -653,6 +791,20 @@
inst := ofp.OfpInstruction{Type: uint32(ofp.OfpInstructionType_OFPIT_GOTO_TABLE), Data: &instGotoTable}
instructions = append(instructions, &inst)
}
+ // Process meter action
+ if meterId := GetMeterIdFlowModArgs(kw); meterId != 0 {
+ var instMeter ofp.OfpInstruction_Meter
+ instMeter.Meter = &ofp.OfpInstructionMeter{MeterId: meterId}
+ inst := ofp.OfpInstruction{Type: uint32(METER_ACTION), Data: &instMeter}
+ instructions = append(instructions, &inst)
+ }
+ //process write_metadata action
+ if metadata := GetMetadataFlowModArgs(kw); metadata != 0 {
+ var instWriteMetadata ofp.OfpInstruction_WriteMetadata
+ instWriteMetadata.WriteMetadata = &ofp.OfpInstructionWriteMetadata{Metadata: metadata}
+ inst := ofp.OfpInstruction{Type: uint32(WRITE_METADATA), Data: &instWriteMetadata}
+ instructions = append(instructions, &inst)
+ }
// Process match fields
oxmFields := make([]*ofp.OfpOxmField, 0)
@@ -745,7 +897,7 @@
// MkFlowStat is a helper method to build flows
func MkFlowStat(fa *FlowArgs) *ofp.OfpFlowStats {
- //Build the matchfields
+ //Build the match-fields
matchFields := make([]*ofp.OfpOxmField, 0)
for _, val := range fa.MatchFields {
matchFields = append(matchFields, &ofp.OfpOxmField{Field: &ofp.OfpOxmField_OfbField{OfbField: val}})
diff --git a/tests/core/flow_management_test.go b/tests/core/flow_management_test.go
index ebda7de..3a44c19 100644
--- a/tests/core/flow_management_test.go
+++ b/tests/core/flow_management_test.go
@@ -31,12 +31,15 @@
"google.golang.org/grpc/metadata"
"math"
"os"
+ "reflect"
+ "sync"
"testing"
"time"
)
var stub voltha.VolthaServiceClient
var volthaSerialNumberKey string
+var mutex sync.Mutex
/*
This local "integration" test uses one RW-Core, one simulated_olt and one simulated_onu adapter to test flows
@@ -60,9 +63,11 @@
var composePath string
const (
- GRPC_PORT = 50057
- NUM_OLTS = 1
- NUM_ONUS_PER_OLT = 4 // This should coincide with the number of onus per olt in adapters-simulated.yml file
+ GrpcPort = 50057
+ NumOfOLTs = 1
+ NumOfONUsPerOLT = 4 // This should coincide with the number of onus per olt in adapters-simulated.yml file
+ MeterIDStart = 1
+ MeterIDStop = 1000
)
func setup() {
@@ -94,7 +99,7 @@
os.Exit(10)
}
- stub, err = tu.SetupGrpcConnectionToCore(grpcHostIP, GRPC_PORT)
+ stub, err = tu.SetupGrpcConnectionToCore(grpcHostIP, GrpcPort)
if err != nil {
fmt.Println("Failure connecting to Voltha Core:", err)
os.Exit(11)
@@ -120,10 +125,10 @@
if err != nil {
return err
}
+ mutex.Lock()
for _, d := range retrievedDevices.Items {
allDevices[d.Id] = d
}
-
retrievedLogicalDevices, err := tu.ListLogicalDevices(stub)
if err != nil {
return err
@@ -132,6 +137,7 @@
for _, ld := range retrievedLogicalDevices.Items {
allLogicalDevices[ld.Id] = ld
}
+ mutex.Unlock()
return nil
}
@@ -143,10 +149,11 @@
return fu.MkSimpleFlowMod(matchFields, fa.Actions, fa.Command, fa.KV)
}
-func addEAPOLFlow(stub voltha.VolthaServiceClient, ld *voltha.LogicalDevice, port *voltha.LogicalPort, ch chan interface{}) {
+func addEAPOLFlow(stub voltha.VolthaServiceClient, ld *voltha.LogicalDevice, port *voltha.LogicalPort, meterID uint64,
+ ch chan interface{}) {
var fa *fu.FlowArgs
fa = &fu.FlowArgs{
- KV: fu.OfpFlowModArgs{"priority": 2000},
+ KV: fu.OfpFlowModArgs{"priority": 2000, "meter_id": meterID},
MatchFields: []*ofp.OfpOxmOfbField{
fu.InPort(port.OfpPort.PortNo),
fu.EthType(0x888e),
@@ -155,6 +162,11 @@
fu.Output(uint32(ofp.OfpPortNo_OFPP_CONTROLLER)),
},
}
+ // Don't add meterID 0
+ if meterID == 0 {
+ delete(fa.KV, "meter_id")
+ }
+
matchFields := make([]*ofp.OfpOxmField, 0)
for _, val := range fa.MatchFields {
matchFields = append(matchFields, &ofp.OfpOxmField{Field: &ofp.OfpOxmField_OfbField{OfbField: val}})
@@ -202,8 +214,9 @@
return true
}
-func verifyEAPOLFlows(t *testing.T, ld *voltha.LogicalDevice, lPortNos ...uint32) {
+func verifyEAPOLFlows(t *testing.T, ld *voltha.LogicalDevice, meterID uint64, lPortNos ...uint32) {
// First get the flows from the logical device
+ fmt.Println("Info: verifying EAPOL flows")
lFlows := ld.Flows
assert.Equal(t, getNumUniPort(ld, lPortNos...), len(lFlows.Items))
@@ -220,7 +233,7 @@
onuDeviceId = lPort.DeviceId
var fa *fu.FlowArgs
fa = &fu.FlowArgs{
- KV: fu.OfpFlowModArgs{"priority": 2000},
+ KV: fu.OfpFlowModArgs{"priority": 2000, "meter_id": meterID},
MatchFields: []*ofp.OfpOxmOfbField{
fu.InPort(lPort.OfpPort.PortNo),
fu.EthType(0x888e),
@@ -229,13 +242,16 @@
fu.Output(uint32(ofp.OfpPortNo_OFPP_CONTROLLER)),
},
}
+ if meterID == 0 {
+ delete(fa.KV, "meter_id")
+ }
expectedLdFlow := fu.MkFlowStat(fa)
assert.Equal(t, true, tu.IsFlowPresent(expectedLdFlow, lFlows.Items))
}
// Verify the OLT flows
retrievedOltFlows := allDevices[ld.RootDeviceId].Flows.Items
- assert.Equal(t, NUM_OLTS*getNumUniPort(ld, lPortNos...)*2, len(retrievedOltFlows))
+ assert.Equal(t, NumOfOLTs*getNumUniPort(ld, lPortNos...)*1, len(retrievedOltFlows))
for _, lPort := range ld.Ports {
if lPort.RootPort {
continue
@@ -245,10 +261,9 @@
}
fa := &fu.FlowArgs{
- KV: fu.OfpFlowModArgs{"priority": 2000},
+ KV: fu.OfpFlowModArgs{"priority": 2000, "meter_id": meterID},
MatchFields: []*ofp.OfpOxmOfbField{
fu.InPort(1),
- fu.VlanVid(uint32(ofp.OfpVlanId_OFPVID_PRESENT) | lPort.OfpPort.PortNo),
fu.TunnelId(uint64(lPort.OfpPort.PortNo)),
fu.EthType(0x888e),
},
@@ -260,23 +275,6 @@
}
expectedOltFlow := fu.MkFlowStat(fa)
assert.Equal(t, true, tu.IsFlowPresent(expectedOltFlow, retrievedOltFlows))
-
- fa = &fu.FlowArgs{
- KV: fu.OfpFlowModArgs{"priority": 2000},
- MatchFields: []*ofp.OfpOxmOfbField{
- fu.InPort(2),
- fu.VlanVid(uint32(ofp.OfpVlanId_OFPVID_PRESENT) | 4000),
- fu.VlanPcp(0),
- fu.Metadata_ofp(uint64(lPort.OfpPort.PortNo)),
- fu.TunnelId(uint64(lPort.OfpPort.PortNo)),
- },
- Actions: []*ofp.OfpAction{
- fu.PopVlan(),
- fu.Output(1),
- },
- }
- expectedOltFlow = fu.MkFlowStat(fa)
- assert.Equal(t, true, tu.IsFlowPresent(expectedOltFlow, retrievedOltFlows))
}
// Verify the ONU flows
retrievedOnuFlows := allDevices[onuDeviceId].Flows.Items
@@ -311,7 +309,7 @@
}
-func installEapolFlows(stub voltha.VolthaServiceClient, lDevice *voltha.LogicalDevice, lPortNos ...uint32) error {
+func installEapolFlows(stub voltha.VolthaServiceClient, lDevice *voltha.LogicalDevice, meterID uint64, lPortNos ...uint32) error {
requestNum := 0
combineCh := make(chan interface{})
if len(lPortNos) > 0 {
@@ -319,20 +317,19 @@
for _, p := range lPortNos {
for _, lport := range lDevice.Ports {
if !lport.RootPort && lport.OfpPort.PortNo == p {
- go addEAPOLFlow(stub, lDevice, lport, combineCh)
+ go addEAPOLFlow(stub, lDevice, lport, meterID, combineCh)
requestNum += 1
}
}
}
} else {
- fmt.Println("Installing EAPOL flows on logical device ", lDevice.Id)
+ fmt.Println("Installing EAPOL flows on logical device", lDevice.Id)
for _, lport := range lDevice.Ports {
if !lport.RootPort {
- go addEAPOLFlow(stub, lDevice, lport, combineCh)
+ go addEAPOLFlow(stub, lDevice, lport, meterID, combineCh)
requestNum += 1
}
}
-
}
receivedResponse := 0
var err error
@@ -373,13 +370,13 @@
return err
}
-func deleteEapolFlow(stub voltha.VolthaServiceClient, lDevice *voltha.LogicalDevice, lPortNo uint32) error {
+func deleteEapolFlow(stub voltha.VolthaServiceClient, lDevice *voltha.LogicalDevice, meterID uint64, lPortNo uint32) error {
fmt.Println("Deleting flows from port ", lPortNo, " of logical device ", lDevice.Id)
ui := uuid.New()
var fa *fu.FlowArgs
ctx := metadata.NewOutgoingContext(context.Background(), metadata.Pairs(volthaSerialNumberKey, ui.String()))
fa = &fu.FlowArgs{
- KV: fu.OfpFlowModArgs{"priority": 2000},
+ KV: fu.OfpFlowModArgs{"priority": 2000, "meter_id": meterID},
MatchFields: []*ofp.OfpOxmOfbField{
fu.InPort(lPortNo),
fu.EthType(0x888e),
@@ -399,20 +396,19 @@
return err
}
-func runInstallEapolFlows(t *testing.T, stub voltha.VolthaServiceClient, lPortNos ...uint32) {
+func runInstallEapolFlows(t *testing.T, stub voltha.VolthaServiceClient, meterID uint64, lPortNos ...uint32) {
err := refreshLocalDeviceCache(stub)
assert.Nil(t, err)
for _, ld := range allLogicalDevices {
- err = installEapolFlows(stub, ld, lPortNos...)
+ err = installEapolFlows(stub, ld, meterID, lPortNos...)
assert.Nil(t, err)
}
err = refreshLocalDeviceCache(stub)
assert.Nil(t, err)
-
for _, ld := range allLogicalDevices {
- verifyEAPOLFlows(t, ld, lPortNos...)
+ verifyEAPOLFlows(t, ld, meterID, lPortNos...)
}
}
@@ -434,7 +430,7 @@
}
}
-func runDeleteEapolFlows(t *testing.T, stub voltha.VolthaServiceClient, ld *voltha.LogicalDevice, lPortNos ...uint32) {
+func runDeleteEapolFlows(t *testing.T, stub voltha.VolthaServiceClient, ld *voltha.LogicalDevice, meterID uint64, lPortNos ...uint32) {
err := refreshLocalDeviceCache(stub)
assert.Nil(t, err)
@@ -443,7 +439,7 @@
assert.Nil(t, err)
} else {
for _, lPortNo := range lPortNos {
- err = deleteEapolFlow(stub, ld, lPortNo)
+ err = deleteEapolFlow(stub, ld, meterID, lPortNo)
assert.Nil(t, err)
}
}
@@ -459,6 +455,173 @@
}
}
+func formulateMeterModUpdateRequest(command ofp.OfpMeterModCommand, meterType ofp.OfpMeterBandType, ldID string, rate,
+ burstSize uint32, meterID uint32) *ofp.MeterModUpdate {
+ meterModUpdateRequest := &ofp.MeterModUpdate{
+ Id: ldID,
+ MeterMod: &ofp.OfpMeterMod{
+ Command: command,
+ Flags: 0,
+ MeterId: meterID,
+ Bands: []*ofp.OfpMeterBandHeader{{
+ Type: meterType,
+ Rate: rate,
+ BurstSize: burstSize,
+ Data: nil,
+ }},
+ },
+ }
+ return meterModUpdateRequest
+}
+
+func formulateMeters(rate, burstsize, meterID uint32, flowCount uint32) *ofp.Meters {
+ // Formulate and return the applied meter band
+ ofpMeterBandHeaderSlice := []*ofp.OfpMeterBandHeader{{
+ Type: ofp.OfpMeterBandType_OFPMBT_EXPERIMENTER,
+ Rate: rate,
+ BurstSize: burstsize,
+ }}
+ BandStats := []*ofp.OfpMeterBandStats{{}}
+ appliedMeters_Meters := []*ofp.OfpMeterEntry{{
+ Config: &ofp.OfpMeterConfig{
+ Flags: 0,
+ MeterId: meterID,
+ Bands: ofpMeterBandHeaderSlice,
+ },
+ Stats: &ofp.OfpMeterStats{
+ MeterId: meterID,
+ BandStats: BandStats,
+ FlowCount: flowCount,
+ },
+ }}
+ appliedMeters := &ofp.Meters{
+ Items: appliedMeters_Meters,
+ }
+ return appliedMeters
+}
+
+func meterAdd(t *testing.T, meterID, rate, burstSize uint32) {
+ var err error
+ for _, logicalDevice := range allLogicalDevices {
+ meterModupdateRequest := formulateMeterModUpdateRequest(ofp.OfpMeterModCommand_OFPMC_ADD,
+ ofp.OfpMeterBandType_OFPMBT_EXPERIMENTER, logicalDevice.Id, rate, burstSize, meterID)
+ _, err = stub.UpdateLogicalDeviceMeterTable(context.Background(), meterModupdateRequest)
+ assert.Nil(t, err)
+ }
+}
+
+func meterMod(t *testing.T, meterID, rate, burstSize uint32) {
+ for _, logicalDevice := range allLogicalDevices {
+ meterModUpdateRequest := formulateMeterModUpdateRequest(ofp.OfpMeterModCommand_OFPMC_MODIFY,
+ ofp.OfpMeterBandType_OFPMBT_EXPERIMENTER, logicalDevice.Id, rate, burstSize, meterID)
+ _, err := stub.UpdateLogicalDeviceMeterTable(context.Background(), meterModUpdateRequest)
+ assert.Nil(t, err)
+ }
+}
+
+//MeterDel deletes a meter with given meter-ID
+func meterDel(t *testing.T, meterID uint32) {
+ for _, logicalDevice := range allLogicalDevices {
+ meterModUpdateRequest := formulateMeterModUpdateRequest(ofp.OfpMeterModCommand_OFPMC_DELETE,
+ ofp.OfpMeterBandType_OFPMBT_EXPERIMENTER, logicalDevice.Id, uint32(1600), uint32(1600), meterID)
+ _, err := stub.UpdateLogicalDeviceMeterTable(context.Background(), meterModUpdateRequest)
+ assert.Nil(t, err)
+ }
+}
+
+// WaitGroup passed to this function must not be nil
+func addMultipleMeterSequentially(t *testing.T, startMeterId, endMeterId, rate, burstSize uint32, wg *sync.WaitGroup) {
+ defer wg.Done()
+ for meterID := startMeterId; meterID <= endMeterId; meterID++ {
+ meterAdd(t, meterID, rate, burstSize)
+ }
+}
+
+func modMultipleMeterSequentially(t *testing.T, startMeterId, endMeterId, rate, burstSize uint32, wg *sync.WaitGroup) {
+ defer wg.Done()
+ for meterID := startMeterId; meterID <= endMeterId; meterID++ {
+ meterMod(t, meterID, rate, burstSize)
+ }
+}
+
+func delMultipleMeterSequential(t *testing.T, startMeterId, endMeterId uint32, wg *sync.WaitGroup) {
+ defer wg.Done()
+ for meterID := startMeterId; meterID <= endMeterId; meterID++ {
+ meterDel(t, meterID)
+ }
+}
+
+func verifyMeter(t *testing.T, meterID, rate, burstSize, flowCount uint32) {
+ expectedMeter := formulateOfpMeterEntry(meterID, flowCount, rate, burstSize)
+ isMeterPresent := false
+ for _, lD := range allLogicalDevices {
+ for _, meter := range lD.Meters.Items {
+ isMeterPresent = reflect.DeepEqual(meter, expectedMeter)
+ if isMeterPresent == true {
+ break
+ }
+ }
+ if isMeterPresent {
+ break
+ }
+ }
+ if !isMeterPresent {
+ fmt.Printf("Error : Expected %+v\n", expectedMeter)
+ }
+ assert.Equal(t, true, isMeterPresent)
+}
+
+func verifyNoMeters(t *testing.T) {
+ err := refreshLocalDeviceCache(stub)
+ assert.Nil(t, err)
+ expectedMeters := &ofp.Meters{}
+ for _, logicalDevice := range allLogicalDevices {
+ result := reflect.DeepEqual(logicalDevice.Meters, expectedMeters)
+ fmt.Println("Meter Present After Delete :--- ", logicalDevice.Meters)
+ assert.Equal(t, true, result)
+ }
+}
+
+func formulateOfpMeterEntry(meterID, flowCount, rate, burstSize uint32) *ofp.OfpMeterEntry {
+ value := &ofp.OfpMeterEntry{
+ Config: &ofp.OfpMeterConfig{
+ MeterId: meterID,
+ Bands: []*ofp.OfpMeterBandHeader{{
+ Type: ofp.OfpMeterBandType_OFPMBT_EXPERIMENTER,
+ Rate: rate,
+ BurstSize: burstSize,
+ }},
+ },
+ Stats: &ofp.OfpMeterStats{
+ MeterId: meterID,
+ FlowCount: flowCount,
+ BandStats: []*ofp.OfpMeterBandStats{{}},
+ },
+ }
+
+ return value
+}
+
+func deleteAllMeters(t *testing.T) {
+ err := refreshLocalDeviceCache(stub)
+ assert.Nil(t, err)
+ for _, lD := range allLogicalDevices {
+ for _, meter := range lD.Meters.Items {
+ meterDel(t, meter.Config.MeterId)
+ }
+ }
+}
+
+func installMultipleFlowsWithMeter(t *testing.T, startMeterId, stopMeterId uint64, wg *sync.WaitGroup) {
+ defer wg.Done()
+ err := refreshLocalDeviceCache(stub)
+ assert.Nil(t, err)
+
+ for meterID := startMeterId; meterID <= stopMeterId; meterID++ {
+ runInstallEapolFlows(t, stub, uint64(meterID), 100, 101)
+ }
+}
+
func createAndEnableDevices(t *testing.T) {
err := tu.SetAllLogLevel(stub, voltha.Logging{Level: common.LogLevel_WARNING})
assert.Nil(t, err)
@@ -472,45 +635,270 @@
oltDevice, err := tu.PreProvisionDevice(stub)
assert.Nil(t, err)
- fmt.Println("Creation of ", NUM_OLTS, " OLT devices took:", time.Since(startTime))
+ fmt.Println("Creation of ", NumOfOLTs, " OLT devices took:", time.Since(startTime))
startTime = time.Now()
//Enable all parent device - this will enable the child devices as well as validate the child devices
- err = tu.EnableDevice(stub, oltDevice, NUM_ONUS_PER_OLT)
+ err = tu.EnableDevice(stub, oltDevice, NumOfONUsPerOLT)
assert.Nil(t, err)
fmt.Println("Enabling of OLT device took:", time.Since(startTime))
// Wait until the core and adapters sync up after an enabled
- time.Sleep(time.Duration(math.Max(10, float64(NUM_OLTS*NUM_ONUS_PER_OLT)/2)) * time.Second)
+ time.Sleep(time.Duration(math.Max(10, float64(NumOfOLTs*NumOfONUsPerOLT)/2)) * time.Second)
- err = tu.VerifyDevices(stub, NUM_ONUS_PER_OLT)
+ err = tu.VerifyDevices(stub, NumOfONUsPerOLT)
assert.Nil(t, err)
- lds, err := tu.VerifyLogicalDevices(stub, oltDevice, NUM_ONUS_PER_OLT)
+ lds, err := tu.VerifyLogicalDevices(stub, oltDevice, NumOfONUsPerOLT)
assert.Nil(t, err)
assert.Equal(t, 1, len(lds.Items))
}
func TestFlowManagement(t *testing.T) {
- //1. Test creation and activation of the devices. This will validate the devices as well as the logical device created/
+ //1. Test creation and activation of the devices. This will validate the devices as well as the logical device created
createAndEnableDevices(t)
//2. Test installation of EAPOL flows
- runInstallEapolFlows(t, stub)
+ runInstallEapolFlows(t, stub, 0)
//3. Test deletion of all EAPOL flows
runDeleteAllFlows(t, stub)
//4. Test installation of EAPOL flows on specific ports
- runInstallEapolFlows(t, stub, 101, 102)
+ runInstallEapolFlows(t, stub, 0, 101, 102)
lds, err := tu.ListLogicalDevices(stub)
assert.Nil(t, err)
//5. Test deletion of EAPOL on a specific port for a given logical device
- runDeleteEapolFlows(t, stub, lds.Items[0], 101)
+ runDeleteEapolFlows(t, stub, lds.Items[0], 0, 101)
+}
+
+// Meter Add Test
+func TestMeters(t *testing.T) {
+ //1. Start test for meter add
+ meterAdd(t, 1, 1600, 1600)
+ err := refreshLocalDeviceCache(stub)
+ assert.Nil(t, err)
+ verifyMeter(t, 1, 1600, 1600, 0)
+
+ //2. Start test for meter mod
+ meterMod(t, 1, 6400, 6400)
+ err = refreshLocalDeviceCache(stub)
+ assert.Nil(t, err)
+ verifyMeter(t, 1, 6400, 6400, 0)
+
+ //3. Start test for meter del
+ meterDel(t, 1)
+ err = refreshLocalDeviceCache(stub)
+ assert.Nil(t, err)
+ verifyNoMeters(t)
+}
+
+func TestFlowManagementWithMeters(t *testing.T) {
+ //1. Delete existing flows
+ for _, logicaldevice := range allLogicalDevices {
+ err := deleteAllFlows(stub, logicaldevice)
+ assert.Nil(t, err)
+ }
+ deleteAllMeters(t)
+ //2. Refresh the local cache so that the changes are reflected here
+ err := refreshLocalDeviceCache(stub)
+ assert.Nil(t, err)
+
+ //3. Add meter with ID
+ meterAdd(t, 1, 1600, 1600)
+
+ err = refreshLocalDeviceCache(stub)
+ assert.Nil(t, err)
+
+ //4. Verify that the meter is installed
+ verifyMeter(t, 1, 1600, 1600, 0)
+
+ //3. Test installation of EAPOL flows with meter (Add and verify the flow)
+ runInstallEapolFlows(t, stub, MeterIDStart)
+
+ //4. Test deletion of all EAPOL flows
+ runDeleteAllFlows(t, stub)
+
+ //5. Test installation of EAPOL flows on specific ports with meter (Add and verify the flows)
+ runInstallEapolFlows(t, stub, MeterIDStart, 101, 102)
+
+ lds, err := tu.ListLogicalDevices(stub)
+ assert.Nil(t, err)
+
+ //6. Test deletion of EAPOL on a specific port for a given logical device
+ runDeleteEapolFlows(t, stub, lds.Items[0], MeterIDStart, 101)
+}
+
+func TestMultipleMeterAddSequential(t *testing.T) {
+ //1. Delete existing flows
+ for _, logicaldevice := range allLogicalDevices {
+ err := deleteAllFlows(stub, logicaldevice)
+ assert.Nil(t, err)
+ }
+
+ // Delete All The Previously Installed Meters
+ deleteAllMeters(t)
+ // Verify that no meters are present
+ err := refreshLocalDeviceCache(stub)
+ assert.Nil(t, err)
+ verifyNoMeters(t)
+ //2. Add Meter Sequentially
+ // Here wait-group is not required, creating and passing wait-group only because the function addMultipleMeterSequentially
+ // expects wait group.
+ var wg sync.WaitGroup
+ wg.Add(1)
+ addMultipleMeterSequentially(t, MeterIDStart, MeterIDStop, 1600, 1600, &wg)
+
+ err = refreshLocalDeviceCache(stub)
+ assert.Nil(t, err)
+
+ //3. Verify that the meters are installed
+ for meterID := MeterIDStart; meterID <= MeterIDStop; meterID++ {
+ verifyMeter(t, uint32(meterID), 1600, 1600, 0)
+ }
+}
+
+func TestMeterDeleteParallel(t *testing.T) {
+ var wg sync.WaitGroup
+ wg.Add(4)
+ go delMultipleMeterSequential(t, MeterIDStart, MeterIDStop/4, &wg)
+ go delMultipleMeterSequential(t, MeterIDStop/4+1, (MeterIDStop / 2), &wg)
+ go delMultipleMeterSequential(t, (MeterIDStop/2)+1, MeterIDStop/4*3, &wg)
+ go delMultipleMeterSequential(t, (MeterIDStop/4*3)+1, MeterIDStop, &wg)
+ wg.Wait()
+
+ verifyNoMeters(t)
+}
+
+func TestMultipleMeterAddParallel(t *testing.T) {
+ err := refreshLocalDeviceCache(stub)
+ assert.Nil(t, err)
+
+ for _, logicaldevice := range allLogicalDevices {
+ err := deleteAllFlows(stub, logicaldevice)
+ assert.Nil(t, err)
+ }
+
+ var wg sync.WaitGroup
+ wg.Add(4)
+ go addMultipleMeterSequentially(t, MeterIDStart, (MeterIDStop / 4), 3200, 3200, &wg)
+ go addMultipleMeterSequentially(t, (MeterIDStop/4 + 1), MeterIDStop/2, 3200, 3200, &wg)
+ go addMultipleMeterSequentially(t, MeterIDStop/2+1, (MeterIDStop / 4 * 3), 3200, 3200, &wg)
+ go addMultipleMeterSequentially(t, (MeterIDStop/4*3)+1, MeterIDStop, 3200, 3200, &wg)
+
+ wg.Wait()
+
+ // Verify the devices
+ err = tu.VerifyDevices(stub, NumOfONUsPerOLT)
+ assert.Nil(t, err)
+
+ err = refreshLocalDeviceCache(stub)
+ assert.Nil(t, err)
+ for meterID := MeterIDStart; meterID <= MeterIDStop; meterID++ {
+ fmt.Println("Verifying meter ID :", meterID)
+ verifyMeter(t, uint32(meterID), 3200, 3200, 0)
+ }
+}
+
+func TestMultipleMeterModSequential(t *testing.T) {
+ var wg sync.WaitGroup
+ wg.Add(1)
+ //1. Modify all the existing meters
+ modMultipleMeterSequentially(t, MeterIDStart, MeterIDStop, 6400, 6400, &wg)
+ //2. Verify that the device state is proper after updating so many meters
+ err := tu.VerifyDevices(stub, NumOfONUsPerOLT)
+ assert.Nil(t, err)
+
+ //3. Refresh logical device cache
+ err = refreshLocalDeviceCache(stub)
+ assert.Nil(t, err)
+
+ //4. Verify that all the meters got modified
+ for meterID := MeterIDStart; meterID <= MeterIDStop; meterID++ {
+ fmt.Println("Verifying meter ID :", meterID)
+ verifyMeter(t, uint32(meterID), 6400, 6400, 0)
+ }
+}
+
+func TestMultipleMeterModParallel(t *testing.T) {
+ var wg sync.WaitGroup
+ wg.Add(4)
+ //1. Modify all the existing meters
+ go modMultipleMeterSequentially(t, MeterIDStart, MeterIDStop/4, 1600, 1600, &wg)
+ go modMultipleMeterSequentially(t, (MeterIDStop/4 + 1), MeterIDStop/2, 1600, 1600, &wg)
+ go modMultipleMeterSequentially(t, (MeterIDStop/2 + 1), (MeterIDStop / 4 * 3), 1600, 1600, &wg)
+ go modMultipleMeterSequentially(t, (MeterIDStop/4*3)+1, MeterIDStop, 1600, 1600, &wg)
+ //2. Verify that the device state is proper after updating so many meters
+ err := tu.VerifyDevices(stub, NumOfONUsPerOLT)
+ assert.Nil(t, err)
+ wg.Wait()
+
+ //3. Refresh logical device cache
+ err = refreshLocalDeviceCache(stub)
+ assert.Nil(t, err)
+
+ //4. Verify that all the meters got modified
+ for meterID := MeterIDStart; meterID <= MeterIDStop; meterID++ {
+ fmt.Println("Verifying meter ID :", meterID)
+ verifyMeter(t, uint32(meterID), 1600, 1600, 0)
+ }
+}
+
+func TestMultipleMeterDelSequential(t *testing.T) {
+ var wg sync.WaitGroup
+ wg.Add(1)
+ //1. Delete all the given meters sequentially
+ delMultipleMeterSequential(t, MeterIDStart, MeterIDStop, &wg)
+ //2. Verify that all the given meters are deleted
+ verifyNoMeters(t)
+}
+
+func TestMultipleFlowsWithMeters(t *testing.T) {
+ err := refreshLocalDeviceCache(stub)
+ assert.Nil(t, err)
+
+ //1. Delete all the previous flows
+ for _, lD := range allLogicalDevices {
+ deleteAllFlows(stub, lD)
+ }
+
+ //2. Add multiple meters for the flows to refer to
+ var wg sync.WaitGroup
+ wg.Add(2)
+ addMultipleMeterSequentially(t, MeterIDStart, 10, 1600, 1600, &wg)
+ // Adding meter verification here again will increase the time taken by the test. So leaving meter verification
+ installMultipleFlowsWithMeter(t, 1, 10, &wg)
+}
+
+func TestFlowDeletionWithMeterDelete(t *testing.T) {
+ err := refreshLocalDeviceCache(stub)
+ assert.Nil(t, err)
+
+ //1. Delete all meters
+ deleteAllMeters(t)
+ //2. Verify that all the meters are deleted
+ verifyNoMeters(t)
+ //3. As no meters are present, so all flows referring to these meters should also be deleted
+ // Flow referring to meterID 1 - 10 were installed in the above test "TestMultipleFlowsWithMeters"
+ err = refreshLocalDeviceCache(stub)
+ assert.Nil(t, err)
+ for _, lD := range allLogicalDevices {
+ verifyNOFlows(t, lD, 100, 101)
+ }
+}
+
+func TestAddFlowWithInvalidMeter(t *testing.T) {
+ var err error
+ for _, ld := range allLogicalDevices {
+ // Adding flows with meter-ID which is not present should throw error stating -
+ // "Meter-referred-by-flow-is-not-found-in-logicaldevice"
+ err = installEapolFlows(stub, ld, 1, 100, 101)
+ assert.NotNil(t, err)
+ }
}
func TestMain(m *testing.M) {
diff --git a/vendor/github.com/opencord/voltha-protos/VERSION b/vendor/github.com/opencord/voltha-protos/VERSION
index 70426f8..3eefcb9 100644
--- a/vendor/github.com/opencord/voltha-protos/VERSION
+++ b/vendor/github.com/opencord/voltha-protos/VERSION
@@ -1 +1 @@
-0.2.0-dev
+1.0.0
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 29859af..15ef51b 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
@@ -151,6 +151,9 @@
// Membership from public import voltha_protos/voltha.proto
type Membership = voltha.Membership
+// FlowMetadata from public import voltha_protos/voltha.proto
+type FlowMetadata = voltha.FlowMetadata
+
// AlarmFilterRuleKey_AlarmFilterRuleKey from public import voltha_protos/voltha.proto
type AlarmFilterRuleKey_AlarmFilterRuleKey = voltha.AlarmFilterRuleKey_AlarmFilterRuleKey
diff --git a/vendor/github.com/opencord/voltha-protos/go/openflow_13/openflow_13.pb.go b/vendor/github.com/opencord/voltha-protos/go/openflow_13/openflow_13.pb.go
index 4a6bef2..f56baef 100644
--- a/vendor/github.com/opencord/voltha-protos/go/openflow_13/openflow_13.pb.go
+++ b/vendor/github.com/opencord/voltha-protos/go/openflow_13/openflow_13.pb.go
@@ -7792,6 +7792,53 @@
return 0
}
+type OfpMeterEntry struct {
+ Config *OfpMeterConfig `protobuf:"bytes,1,opt,name=config,proto3" json:"config,omitempty"`
+ Stats *OfpMeterStats `protobuf:"bytes,2,opt,name=stats,proto3" json:"stats,omitempty"`
+ XXX_NoUnkeyedLiteral struct{} `json:"-"`
+ XXX_unrecognized []byte `json:"-"`
+ XXX_sizecache int32 `json:"-"`
+}
+
+func (m *OfpMeterEntry) Reset() { *m = OfpMeterEntry{} }
+func (m *OfpMeterEntry) String() string { return proto.CompactTextString(m) }
+func (*OfpMeterEntry) ProtoMessage() {}
+func (*OfpMeterEntry) Descriptor() ([]byte, []int) {
+ return fileDescriptor_08e3a4e375aeddc7, []int{70}
+}
+
+func (m *OfpMeterEntry) XXX_Unmarshal(b []byte) error {
+ return xxx_messageInfo_OfpMeterEntry.Unmarshal(m, b)
+}
+func (m *OfpMeterEntry) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+ return xxx_messageInfo_OfpMeterEntry.Marshal(b, m, deterministic)
+}
+func (m *OfpMeterEntry) XXX_Merge(src proto.Message) {
+ xxx_messageInfo_OfpMeterEntry.Merge(m, src)
+}
+func (m *OfpMeterEntry) XXX_Size() int {
+ return xxx_messageInfo_OfpMeterEntry.Size(m)
+}
+func (m *OfpMeterEntry) XXX_DiscardUnknown() {
+ xxx_messageInfo_OfpMeterEntry.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_OfpMeterEntry proto.InternalMessageInfo
+
+func (m *OfpMeterEntry) GetConfig() *OfpMeterConfig {
+ if m != nil {
+ return m.Config
+ }
+ return nil
+}
+
+func (m *OfpMeterEntry) GetStats() *OfpMeterStats {
+ if m != nil {
+ return m.Stats
+ }
+ return nil
+}
+
// Body for ofp_multipart_request/reply of type OFPMP_EXPERIMENTER.
type OfpExperimenterMultipartHeader struct {
Experimenter uint32 `protobuf:"varint,1,opt,name=experimenter,proto3" json:"experimenter,omitempty"`
@@ -7806,7 +7853,7 @@
func (m *OfpExperimenterMultipartHeader) String() string { return proto.CompactTextString(m) }
func (*OfpExperimenterMultipartHeader) ProtoMessage() {}
func (*OfpExperimenterMultipartHeader) Descriptor() ([]byte, []int) {
- return fileDescriptor_08e3a4e375aeddc7, []int{70}
+ return fileDescriptor_08e3a4e375aeddc7, []int{71}
}
func (m *OfpExperimenterMultipartHeader) XXX_Unmarshal(b []byte) error {
@@ -7863,7 +7910,7 @@
func (m *OfpExperimenterHeader) String() string { return proto.CompactTextString(m) }
func (*OfpExperimenterHeader) ProtoMessage() {}
func (*OfpExperimenterHeader) Descriptor() ([]byte, []int) {
- return fileDescriptor_08e3a4e375aeddc7, []int{71}
+ return fileDescriptor_08e3a4e375aeddc7, []int{72}
}
func (m *OfpExperimenterHeader) XXX_Unmarshal(b []byte) error {
@@ -7918,7 +7965,7 @@
func (m *OfpQueuePropHeader) String() string { return proto.CompactTextString(m) }
func (*OfpQueuePropHeader) ProtoMessage() {}
func (*OfpQueuePropHeader) Descriptor() ([]byte, []int) {
- return fileDescriptor_08e3a4e375aeddc7, []int{72}
+ return fileDescriptor_08e3a4e375aeddc7, []int{73}
}
func (m *OfpQueuePropHeader) XXX_Unmarshal(b []byte) error {
@@ -7966,7 +8013,7 @@
func (m *OfpQueuePropMinRate) String() string { return proto.CompactTextString(m) }
func (*OfpQueuePropMinRate) ProtoMessage() {}
func (*OfpQueuePropMinRate) Descriptor() ([]byte, []int) {
- return fileDescriptor_08e3a4e375aeddc7, []int{73}
+ return fileDescriptor_08e3a4e375aeddc7, []int{74}
}
func (m *OfpQueuePropMinRate) XXX_Unmarshal(b []byte) error {
@@ -8014,7 +8061,7 @@
func (m *OfpQueuePropMaxRate) String() string { return proto.CompactTextString(m) }
func (*OfpQueuePropMaxRate) ProtoMessage() {}
func (*OfpQueuePropMaxRate) Descriptor() ([]byte, []int) {
- return fileDescriptor_08e3a4e375aeddc7, []int{74}
+ return fileDescriptor_08e3a4e375aeddc7, []int{75}
}
func (m *OfpQueuePropMaxRate) XXX_Unmarshal(b []byte) error {
@@ -8063,7 +8110,7 @@
func (m *OfpQueuePropExperimenter) String() string { return proto.CompactTextString(m) }
func (*OfpQueuePropExperimenter) ProtoMessage() {}
func (*OfpQueuePropExperimenter) Descriptor() ([]byte, []int) {
- return fileDescriptor_08e3a4e375aeddc7, []int{75}
+ return fileDescriptor_08e3a4e375aeddc7, []int{76}
}
func (m *OfpQueuePropExperimenter) XXX_Unmarshal(b []byte) error {
@@ -8119,7 +8166,7 @@
func (m *OfpPacketQueue) String() string { return proto.CompactTextString(m) }
func (*OfpPacketQueue) ProtoMessage() {}
func (*OfpPacketQueue) Descriptor() ([]byte, []int) {
- return fileDescriptor_08e3a4e375aeddc7, []int{76}
+ return fileDescriptor_08e3a4e375aeddc7, []int{77}
}
func (m *OfpPacketQueue) XXX_Unmarshal(b []byte) error {
@@ -8174,7 +8221,7 @@
func (m *OfpQueueGetConfigRequest) String() string { return proto.CompactTextString(m) }
func (*OfpQueueGetConfigRequest) ProtoMessage() {}
func (*OfpQueueGetConfigRequest) Descriptor() ([]byte, []int) {
- return fileDescriptor_08e3a4e375aeddc7, []int{77}
+ return fileDescriptor_08e3a4e375aeddc7, []int{78}
}
func (m *OfpQueueGetConfigRequest) XXX_Unmarshal(b []byte) error {
@@ -8216,7 +8263,7 @@
func (m *OfpQueueGetConfigReply) String() string { return proto.CompactTextString(m) }
func (*OfpQueueGetConfigReply) ProtoMessage() {}
func (*OfpQueueGetConfigReply) Descriptor() ([]byte, []int) {
- return fileDescriptor_08e3a4e375aeddc7, []int{78}
+ return fileDescriptor_08e3a4e375aeddc7, []int{79}
}
func (m *OfpQueueGetConfigReply) XXX_Unmarshal(b []byte) error {
@@ -8264,7 +8311,7 @@
func (m *OfpActionSetQueue) String() string { return proto.CompactTextString(m) }
func (*OfpActionSetQueue) ProtoMessage() {}
func (*OfpActionSetQueue) Descriptor() ([]byte, []int) {
- return fileDescriptor_08e3a4e375aeddc7, []int{79}
+ return fileDescriptor_08e3a4e375aeddc7, []int{80}
}
func (m *OfpActionSetQueue) XXX_Unmarshal(b []byte) error {
@@ -8311,7 +8358,7 @@
func (m *OfpQueueStatsRequest) String() string { return proto.CompactTextString(m) }
func (*OfpQueueStatsRequest) ProtoMessage() {}
func (*OfpQueueStatsRequest) Descriptor() ([]byte, []int) {
- return fileDescriptor_08e3a4e375aeddc7, []int{80}
+ return fileDescriptor_08e3a4e375aeddc7, []int{81}
}
func (m *OfpQueueStatsRequest) XXX_Unmarshal(b []byte) error {
@@ -8363,7 +8410,7 @@
func (m *OfpQueueStats) String() string { return proto.CompactTextString(m) }
func (*OfpQueueStats) ProtoMessage() {}
func (*OfpQueueStats) Descriptor() ([]byte, []int) {
- return fileDescriptor_08e3a4e375aeddc7, []int{81}
+ return fileDescriptor_08e3a4e375aeddc7, []int{82}
}
func (m *OfpQueueStats) XXX_Unmarshal(b []byte) error {
@@ -8447,7 +8494,7 @@
func (m *OfpRoleRequest) String() string { return proto.CompactTextString(m) }
func (*OfpRoleRequest) ProtoMessage() {}
func (*OfpRoleRequest) Descriptor() ([]byte, []int) {
- return fileDescriptor_08e3a4e375aeddc7, []int{82}
+ return fileDescriptor_08e3a4e375aeddc7, []int{83}
}
func (m *OfpRoleRequest) XXX_Unmarshal(b []byte) error {
@@ -8497,7 +8544,7 @@
func (m *OfpAsyncConfig) String() string { return proto.CompactTextString(m) }
func (*OfpAsyncConfig) ProtoMessage() {}
func (*OfpAsyncConfig) Descriptor() ([]byte, []int) {
- return fileDescriptor_08e3a4e375aeddc7, []int{83}
+ return fileDescriptor_08e3a4e375aeddc7, []int{84}
}
func (m *OfpAsyncConfig) XXX_Unmarshal(b []byte) error {
@@ -8551,7 +8598,7 @@
func (m *MeterModUpdate) String() string { return proto.CompactTextString(m) }
func (*MeterModUpdate) ProtoMessage() {}
func (*MeterModUpdate) Descriptor() ([]byte, []int) {
- return fileDescriptor_08e3a4e375aeddc7, []int{84}
+ return fileDescriptor_08e3a4e375aeddc7, []int{85}
}
func (m *MeterModUpdate) XXX_Unmarshal(b []byte) error {
@@ -8597,7 +8644,7 @@
func (m *MeterStatsReply) String() string { return proto.CompactTextString(m) }
func (*MeterStatsReply) ProtoMessage() {}
func (*MeterStatsReply) Descriptor() ([]byte, []int) {
- return fileDescriptor_08e3a4e375aeddc7, []int{85}
+ return fileDescriptor_08e3a4e375aeddc7, []int{86}
}
func (m *MeterStatsReply) XXX_Unmarshal(b []byte) error {
@@ -8637,7 +8684,7 @@
func (m *FlowTableUpdate) String() string { return proto.CompactTextString(m) }
func (*FlowTableUpdate) ProtoMessage() {}
func (*FlowTableUpdate) Descriptor() ([]byte, []int) {
- return fileDescriptor_08e3a4e375aeddc7, []int{86}
+ return fileDescriptor_08e3a4e375aeddc7, []int{87}
}
func (m *FlowTableUpdate) XXX_Unmarshal(b []byte) error {
@@ -8684,7 +8731,7 @@
func (m *FlowGroupTableUpdate) String() string { return proto.CompactTextString(m) }
func (*FlowGroupTableUpdate) ProtoMessage() {}
func (*FlowGroupTableUpdate) Descriptor() ([]byte, []int) {
- return fileDescriptor_08e3a4e375aeddc7, []int{87}
+ return fileDescriptor_08e3a4e375aeddc7, []int{88}
}
func (m *FlowGroupTableUpdate) XXX_Unmarshal(b []byte) error {
@@ -8730,7 +8777,7 @@
func (m *Flows) String() string { return proto.CompactTextString(m) }
func (*Flows) ProtoMessage() {}
func (*Flows) Descriptor() ([]byte, []int) {
- return fileDescriptor_08e3a4e375aeddc7, []int{88}
+ return fileDescriptor_08e3a4e375aeddc7, []int{89}
}
func (m *Flows) XXX_Unmarshal(b []byte) error {
@@ -8759,17 +8806,17 @@
}
type Meters struct {
- Items []*OfpMeterConfig `protobuf:"bytes,1,rep,name=items,proto3" json:"items,omitempty"`
- XXX_NoUnkeyedLiteral struct{} `json:"-"`
- XXX_unrecognized []byte `json:"-"`
- XXX_sizecache int32 `json:"-"`
+ Items []*OfpMeterEntry `protobuf:"bytes,1,rep,name=items,proto3" json:"items,omitempty"`
+ XXX_NoUnkeyedLiteral struct{} `json:"-"`
+ XXX_unrecognized []byte `json:"-"`
+ XXX_sizecache int32 `json:"-"`
}
func (m *Meters) Reset() { *m = Meters{} }
func (m *Meters) String() string { return proto.CompactTextString(m) }
func (*Meters) ProtoMessage() {}
func (*Meters) Descriptor() ([]byte, []int) {
- return fileDescriptor_08e3a4e375aeddc7, []int{89}
+ return fileDescriptor_08e3a4e375aeddc7, []int{90}
}
func (m *Meters) XXX_Unmarshal(b []byte) error {
@@ -8790,7 +8837,7 @@
var xxx_messageInfo_Meters proto.InternalMessageInfo
-func (m *Meters) GetItems() []*OfpMeterConfig {
+func (m *Meters) GetItems() []*OfpMeterEntry {
if m != nil {
return m.Items
}
@@ -8808,7 +8855,7 @@
func (m *FlowGroups) String() string { return proto.CompactTextString(m) }
func (*FlowGroups) ProtoMessage() {}
func (*FlowGroups) Descriptor() ([]byte, []int) {
- return fileDescriptor_08e3a4e375aeddc7, []int{90}
+ return fileDescriptor_08e3a4e375aeddc7, []int{91}
}
func (m *FlowGroups) XXX_Unmarshal(b []byte) error {
@@ -8848,7 +8895,7 @@
func (m *FlowChanges) String() string { return proto.CompactTextString(m) }
func (*FlowChanges) ProtoMessage() {}
func (*FlowChanges) Descriptor() ([]byte, []int) {
- return fileDescriptor_08e3a4e375aeddc7, []int{91}
+ return fileDescriptor_08e3a4e375aeddc7, []int{92}
}
func (m *FlowChanges) XXX_Unmarshal(b []byte) error {
@@ -8896,7 +8943,7 @@
func (m *FlowGroupChanges) String() string { return proto.CompactTextString(m) }
func (*FlowGroupChanges) ProtoMessage() {}
func (*FlowGroupChanges) Descriptor() ([]byte, []int) {
- return fileDescriptor_08e3a4e375aeddc7, []int{92}
+ return fileDescriptor_08e3a4e375aeddc7, []int{93}
}
func (m *FlowGroupChanges) XXX_Unmarshal(b []byte) error {
@@ -8950,7 +8997,7 @@
func (m *PacketIn) String() string { return proto.CompactTextString(m) }
func (*PacketIn) ProtoMessage() {}
func (*PacketIn) Descriptor() ([]byte, []int) {
- return fileDescriptor_08e3a4e375aeddc7, []int{93}
+ return fileDescriptor_08e3a4e375aeddc7, []int{94}
}
func (m *PacketIn) XXX_Unmarshal(b []byte) error {
@@ -8997,7 +9044,7 @@
func (m *PacketOut) String() string { return proto.CompactTextString(m) }
func (*PacketOut) ProtoMessage() {}
func (*PacketOut) Descriptor() ([]byte, []int) {
- return fileDescriptor_08e3a4e375aeddc7, []int{94}
+ return fileDescriptor_08e3a4e375aeddc7, []int{95}
}
func (m *PacketOut) XXX_Unmarshal(b []byte) error {
@@ -9046,7 +9093,7 @@
func (m *ChangeEvent) String() string { return proto.CompactTextString(m) }
func (*ChangeEvent) ProtoMessage() {}
func (*ChangeEvent) Descriptor() ([]byte, []int) {
- return fileDescriptor_08e3a4e375aeddc7, []int{95}
+ return fileDescriptor_08e3a4e375aeddc7, []int{96}
}
func (m *ChangeEvent) XXX_Unmarshal(b []byte) error {
@@ -9228,6 +9275,7 @@
proto.RegisterType((*OfpMeterStats)(nil), "openflow_13.ofp_meter_stats")
proto.RegisterType((*OfpMeterConfig)(nil), "openflow_13.ofp_meter_config")
proto.RegisterType((*OfpMeterFeatures)(nil), "openflow_13.ofp_meter_features")
+ proto.RegisterType((*OfpMeterEntry)(nil), "openflow_13.ofp_meter_entry")
proto.RegisterType((*OfpExperimenterMultipartHeader)(nil), "openflow_13.ofp_experimenter_multipart_header")
proto.RegisterType((*OfpExperimenterHeader)(nil), "openflow_13.ofp_experimenter_header")
proto.RegisterType((*OfpQueuePropHeader)(nil), "openflow_13.ofp_queue_prop_header")
@@ -9259,532 +9307,534 @@
func init() { proto.RegisterFile("voltha_protos/openflow_13.proto", fileDescriptor_08e3a4e375aeddc7) }
var fileDescriptor_08e3a4e375aeddc7 = []byte{
- // 8420 bytes of a gzipped FileDescriptorProto
- 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xdc, 0x7d, 0x5b, 0x8c, 0x1b, 0x59,
- 0x76, 0x98, 0xf8, 0xe8, 0x6e, 0xf2, 0xb2, 0xbb, 0x55, 0x2a, 0xbd, 0x28, 0xb5, 0x34, 0x92, 0xb8,
- 0x33, 0xbb, 0xb3, 0x5c, 0x7b, 0x67, 0x46, 0xa3, 0xd5, 0xae, 0x77, 0xbd, 0x8e, 0x8a, 0x64, 0xb1,
- 0x9b, 0x23, 0x3e, 0x4a, 0x55, 0xd5, 0x2d, 0x69, 0x03, 0xa7, 0xc0, 0x26, 0x4b, 0xdd, 0xf4, 0x90,
- 0x2c, 0x6e, 0x55, 0x75, 0xab, 0xe5, 0xc4, 0x81, 0x62, 0x23, 0x08, 0x90, 0xc4, 0x76, 0x02, 0x7f,
- 0x2c, 0x10, 0x38, 0x40, 0x8c, 0x38, 0x1f, 0x41, 0x80, 0x7c, 0x04, 0x08, 0x10, 0x20, 0xbf, 0x09,
- 0x90, 0x00, 0x79, 0x00, 0x06, 0x02, 0xff, 0xd8, 0x7f, 0xce, 0x4f, 0x00, 0x7f, 0x27, 0x71, 0x36,
- 0xab, 0xe0, 0xdc, 0x73, 0xee, 0xad, 0x5b, 0x7c, 0xf4, 0xf4, 0x6e, 0x66, 0xf3, 0x91, 0x2f, 0xb1,
- 0xce, 0xeb, 0x9e, 0x7b, 0xee, 0x39, 0xe7, 0x9e, 0x7b, 0xea, 0x56, 0x8b, 0xdd, 0x3b, 0x0d, 0xc6,
- 0xf1, 0x71, 0xdf, 0x9b, 0x85, 0x41, 0x1c, 0x44, 0x1f, 0x05, 0x33, 0x7f, 0xfa, 0x6a, 0x1c, 0xbc,
- 0xf6, 0x3e, 0xf9, 0xf4, 0x9b, 0x1c, 0xa4, 0x97, 0x14, 0xd0, 0xed, 0x3b, 0x47, 0x41, 0x70, 0x34,
- 0xf6, 0x3f, 0xea, 0xcf, 0x46, 0x1f, 0xf5, 0xa7, 0xd3, 0x20, 0xee, 0xc7, 0xa3, 0x60, 0x1a, 0x21,
- 0xe9, 0xed, 0xfb, 0x69, 0x59, 0x6f, 0xfa, 0xd3, 0x23, 0x2f, 0x98, 0x29, 0x14, 0x95, 0x01, 0x63,
- 0xc1, 0xab, 0x99, 0x77, 0xec, 0xf7, 0x87, 0x7e, 0xa8, 0x97, 0xd9, 0xc6, 0xa9, 0x1f, 0x46, 0xa3,
- 0x60, 0x5a, 0xce, 0xdc, 0xcf, 0x7c, 0xb8, 0x65, 0x8b, 0x47, 0xfd, 0xeb, 0x2c, 0x1f, 0xbf, 0x99,
- 0xf9, 0xe5, 0xec, 0xfd, 0xcc, 0x87, 0xdb, 0x0f, 0xaf, 0x7f, 0x53, 0x55, 0x0b, 0x04, 0x00, 0xd2,
- 0xe6, 0x24, 0xba, 0xc6, 0x72, 0x67, 0xa3, 0x61, 0x39, 0xc7, 0x05, 0xc0, 0xcf, 0xca, 0x3f, 0xcb,
- 0xb0, 0xeb, 0x38, 0xca, 0x78, 0x1c, 0x78, 0xfe, 0xd8, 0x9f, 0x88, 0x01, 0x1f, 0x91, 0xd8, 0x0c,
- 0x17, 0x7b, 0x7f, 0x41, 0xac, 0xc2, 0xa1, 0x8c, 0xf0, 0x8c, 0x6d, 0x91, 0x5e, 0x87, 0xa3, 0x78,
- 0xd2, 0x9f, 0x71, 0xad, 0x4a, 0x0f, 0xbf, 0x7e, 0x1e, 0x7b, 0x8a, 0x61, 0xef, 0x92, 0x9d, 0x96,
- 0x50, 0x2b, 0xb2, 0x0d, 0x20, 0xf3, 0xa7, 0x71, 0xe5, 0x3b, 0xec, 0xce, 0x79, 0xbc, 0x60, 0x24,
- 0xfc, 0x15, 0x95, 0xb3, 0xf7, 0x73, 0x60, 0x24, 0x7a, 0xac, 0x3c, 0x65, 0x45, 0xc9, 0xa9, 0xff,
- 0x0a, 0x2b, 0x90, 0xc4, 0xa8, 0x9c, 0xb9, 0x9f, 0xfb, 0xb0, 0xf4, 0xb0, 0x72, 0x9e, 0x7e, 0x68,
- 0x10, 0x5b, 0xf2, 0x54, 0x3a, 0xec, 0x0a, 0x90, 0x44, 0xaf, 0x47, 0xf1, 0xe0, 0xd8, 0x1b, 0x04,
- 0xd3, 0x57, 0xa3, 0x23, 0xfd, 0x1a, 0x5b, 0x7b, 0x35, 0xee, 0x1f, 0x45, 0xb4, 0x3c, 0xf8, 0xa0,
- 0x57, 0xd8, 0xd6, 0x64, 0x14, 0x45, 0x5e, 0xe4, 0x4f, 0x87, 0xde, 0xd8, 0x9f, 0x72, 0x7b, 0x6c,
- 0xd9, 0x25, 0x00, 0x3a, 0xfe, 0x74, 0xd8, 0xf6, 0xa7, 0x95, 0x1a, 0xdb, 0xe2, 0xeb, 0xd4, 0x3f,
- 0x1c, 0xfb, 0xde, 0x24, 0x18, 0xea, 0xb7, 0x58, 0x01, 0x1f, 0x46, 0x43, 0xb1, 0xd8, 0xfc, 0xb9,
- 0x35, 0xd4, 0x6f, 0xb0, 0x75, 0x1c, 0x8f, 0x04, 0xd1, 0x53, 0xe5, 0x1f, 0x65, 0x59, 0x01, 0x84,
- 0xcc, 0x82, 0x30, 0xd6, 0x6f, 0xb2, 0x0d, 0xf8, 0xd7, 0x9b, 0x06, 0xc4, 0xbe, 0x0e, 0x8f, 0xdd,
- 0x00, 0x10, 0xc7, 0xaf, 0xbd, 0xfe, 0x70, 0x18, 0x92, 0x7d, 0xd6, 0x8f, 0x5f, 0x1b, 0xc3, 0x61,
- 0xa8, 0xeb, 0x2c, 0x3f, 0xed, 0x4f, 0x7c, 0xee, 0x19, 0x45, 0x9b, 0xff, 0x56, 0x86, 0xca, 0xab,
- 0x43, 0xc1, 0x44, 0xa3, 0xb8, 0x1f, 0xfb, 0xe5, 0x35, 0x9c, 0x28, 0x7f, 0x00, 0x09, 0x83, 0x93,
- 0x30, 0x2c, 0xaf, 0x73, 0x20, 0xff, 0xad, 0xbf, 0xc7, 0x58, 0x7f, 0x78, 0xea, 0x87, 0xf1, 0x28,
- 0xf2, 0x87, 0xe5, 0x0d, 0x8e, 0x51, 0x20, 0xfa, 0x1d, 0x56, 0x8c, 0x4e, 0x66, 0xa0, 0x9b, 0x3f,
- 0x2c, 0x17, 0x38, 0x3a, 0x01, 0x80, 0xc4, 0x99, 0xef, 0x87, 0xe5, 0x22, 0x4a, 0x84, 0xdf, 0xfa,
- 0x5d, 0xc6, 0x40, 0xb2, 0x17, 0xcd, 0x7c, 0x7f, 0x58, 0x66, 0xc8, 0x02, 0x10, 0x07, 0x00, 0xfa,
- 0x0e, 0x2b, 0x4e, 0xfa, 0x67, 0x84, 0x2d, 0x71, 0x6c, 0x61, 0xd2, 0x3f, 0xe3, 0xc8, 0xca, 0xbf,
- 0xcc, 0xb0, 0xab, 0xca, 0xb2, 0xbd, 0xf2, 0xfb, 0xf1, 0x49, 0xe8, 0x47, 0xfa, 0x3d, 0x56, 0x1a,
- 0xf6, 0xe3, 0xfe, 0xac, 0x1f, 0x1f, 0x0b, 0x83, 0xe7, 0x6d, 0x26, 0x40, 0x2d, 0x2e, 0x75, 0xea,
- 0x1d, 0x9e, 0xbc, 0x7a, 0xe5, 0x87, 0x11, 0x99, 0xbd, 0x30, 0xad, 0xe1, 0x33, 0xac, 0xd5, 0x14,
- 0x97, 0x2e, 0xa2, 0xb8, 0xda, 0x98, 0xba, 0xfc, 0x51, 0x7f, 0xc0, 0x36, 0xfb, 0x27, 0x67, 0xa3,
- 0xf1, 0xa8, 0x1f, 0xbe, 0x01, 0xc9, 0x68, 0xc6, 0x92, 0x84, 0xb5, 0x86, 0x7a, 0x85, 0x6d, 0x0e,
- 0xfa, 0xb3, 0xfe, 0xe1, 0x68, 0x3c, 0x8a, 0x47, 0x7e, 0x44, 0x26, 0x4d, 0xc1, 0x2a, 0x21, 0xbb,
- 0x2c, 0x56, 0xd6, 0x03, 0x5b, 0x9f, 0x44, 0xfa, 0x23, 0xb6, 0x1e, 0xfa, 0xfd, 0x88, 0x72, 0xc1,
- 0xf6, 0xc3, 0x3b, 0x0b, 0xee, 0xcb, 0xa9, 0x91, 0xc6, 0x26, 0x5a, 0x48, 0x14, 0x43, 0x3f, 0x1a,
- 0x50, 0x48, 0x5e, 0x5f, 0xca, 0x63, 0x73, 0x92, 0xca, 0xdf, 0xce, 0xb0, 0x4d, 0x29, 0x06, 0x5c,
- 0xf2, 0xa7, 0x77, 0xa9, 0xc4, 0x7d, 0x72, 0x29, 0xf7, 0xd1, 0x59, 0x7e, 0xd2, 0x8f, 0x3e, 0x27,
- 0x6b, 0xf0, 0xdf, 0xe0, 0x08, 0xd2, 0x2d, 0xc8, 0x06, 0x09, 0xa0, 0xf2, 0x1a, 0x63, 0x77, 0xd2,
- 0x8f, 0x07, 0xc7, 0xfa, 0x47, 0xa9, 0xb4, 0xb4, 0xb3, 0x30, 0x09, 0x4e, 0xa5, 0x66, 0xa4, 0x5f,
- 0x62, 0x2c, 0x38, 0x9b, 0x78, 0xaf, 0x46, 0xfe, 0x78, 0x88, 0x69, 0xa1, 0xf4, 0xf0, 0xf6, 0x02,
- 0x9b, 0x24, 0xb1, 0x8b, 0xc1, 0xd9, 0xa4, 0xc9, 0x89, 0x2b, 0xff, 0x2d, 0x83, 0x91, 0x29, 0x91,
- 0xfa, 0xb7, 0x19, 0xa0, 0xbd, 0xc1, 0xb8, 0x1f, 0x45, 0xa4, 0xc2, 0x72, 0x59, 0x9c, 0xc2, 0x2e,
- 0x04, 0x67, 0x93, 0x3a, 0xfc, 0xd2, 0xbf, 0x0f, 0x73, 0x38, 0x44, 0x29, 0x7c, 0xea, 0xa5, 0x87,
- 0xef, 0x2d, 0x65, 0x94, 0x54, 0x7b, 0x97, 0xec, 0x42, 0xf0, 0xea, 0x90, 0xab, 0xa2, 0xbf, 0x60,
- 0xba, 0x7f, 0x36, 0xf3, 0xc3, 0x11, 0x24, 0x20, 0x3f, 0x24, 0x39, 0x6b, 0x5c, 0xce, 0xd7, 0x96,
- 0xca, 0x59, 0x24, 0xdf, 0xbb, 0x64, 0x5f, 0x51, 0xa1, 0x5c, 0x72, 0x6d, 0x83, 0xad, 0x71, 0x6c,
- 0xe5, 0x8f, 0xb7, 0x31, 0xab, 0xa5, 0x94, 0x38, 0x7f, 0x17, 0x50, 0x29, 0xb9, 0xc9, 0x23, 0xb2,
- 0xf9, 0x2d, 0x56, 0x38, 0xee, 0x47, 0x1e, 0x5f, 0x67, 0xf0, 0xb6, 0x82, 0xbd, 0x71, 0xdc, 0x8f,
- 0x3a, 0xb0, 0xd4, 0xd7, 0x58, 0x1e, 0x3c, 0x07, 0x9d, 0x62, 0xef, 0x92, 0xcd, 0x9f, 0xf4, 0x0f,
- 0xd8, 0xd6, 0xec, 0xf8, 0x4d, 0x34, 0x1a, 0xf4, 0xc7, 0xdc, 0xe7, 0xd0, 0x3b, 0xf6, 0x2e, 0xd9,
- 0x9b, 0x02, 0x6c, 0x01, 0xd9, 0xd7, 0xd8, 0x36, 0x65, 0x49, 0x3f, 0xee, 0x43, 0x84, 0x72, 0x13,
- 0xe4, 0x61, 0xcf, 0xe0, 0xf0, 0x0e, 0x81, 0xf5, 0x5b, 0x6c, 0xc3, 0x8f, 0x8f, 0xbd, 0x61, 0x14,
- 0xf3, 0x84, 0xb4, 0xb9, 0x77, 0xc9, 0x5e, 0xf7, 0xe3, 0xe3, 0x46, 0x14, 0x0b, 0x54, 0x14, 0x0e,
- 0x78, 0x46, 0x12, 0x28, 0x27, 0x1c, 0xe8, 0x3b, 0xac, 0x00, 0x28, 0x3e, 0xe1, 0x02, 0x29, 0x00,
- 0xc4, 0x2e, 0xcc, 0x69, 0x87, 0x15, 0x4e, 0xc7, 0xfd, 0xa9, 0x77, 0x3a, 0x1a, 0x62, 0x4a, 0x02,
- 0x24, 0x40, 0x0e, 0x46, 0x43, 0x89, 0x9c, 0x0d, 0x66, 0x98, 0x95, 0x04, 0xd2, 0x1a, 0xcc, 0x60,
- 0xc4, 0xd1, 0xcc, 0x1b, 0x46, 0x83, 0x19, 0xe6, 0x24, 0x18, 0x71, 0x34, 0x6b, 0x44, 0x83, 0x99,
- 0x7e, 0x93, 0xad, 0x8f, 0x66, 0x9e, 0x3f, 0x98, 0x96, 0x37, 0x09, 0xb3, 0x36, 0x9a, 0x99, 0x83,
- 0x29, 0x08, 0x1c, 0xcd, 0xb0, 0x38, 0x28, 0x6f, 0x09, 0x81, 0xa3, 0x99, 0xc5, 0xcb, 0x0c, 0x8e,
- 0x3c, 0x7d, 0xc4, 0xe7, 0xb0, 0x9d, 0x20, 0x4f, 0x1f, 0xd1, 0x24, 0x38, 0x12, 0xe6, 0x7e, 0x59,
- 0x45, 0xd2, 0xe4, 0xe3, 0xc1, 0x8c, 0x33, 0x6a, 0x42, 0x95, 0x78, 0x30, 0x03, 0x3e, 0x42, 0x01,
- 0xdb, 0x15, 0x05, 0x45, 0x5c, 0x27, 0x43, 0xe4, 0xd2, 0x05, 0xea, 0x64, 0x28, 0xb8, 0x00, 0x05,
- 0x5c, 0x57, 0x15, 0x14, 0x70, 0xed, 0xb0, 0x42, 0x34, 0x88, 0x91, 0xed, 0x9a, 0x50, 0x04, 0x20,
- 0xa4, 0x25, 0x47, 0x02, 0xe3, 0x75, 0x15, 0x09, 0x9c, 0x0f, 0x58, 0x69, 0x34, 0x98, 0xc0, 0x24,
- 0xf8, 0x52, 0xdc, 0x20, 0x3c, 0x43, 0x20, 0x5f, 0x8d, 0x84, 0x64, 0x10, 0x0c, 0xfd, 0xf2, 0xcd,
- 0x34, 0x49, 0x3d, 0x18, 0xfa, 0x60, 0xdb, 0x7e, 0x38, 0xf3, 0x82, 0x59, 0xb9, 0x2c, 0x6c, 0xdb,
- 0x0f, 0x67, 0x3d, 0xbe, 0x1e, 0x80, 0x88, 0x66, 0xfd, 0xf2, 0x2d, 0xa1, 0x73, 0x3f, 0x9c, 0x39,
- 0xb3, 0xbe, 0x40, 0xc5, 0xb3, 0x7e, 0xf9, 0xb6, 0x82, 0x72, 0x13, 0x54, 0x74, 0xdc, 0x2f, 0xef,
- 0x08, 0xbf, 0x01, 0xae, 0xe3, 0x84, 0xeb, 0xb8, 0x5f, 0xbe, 0xa3, 0xa0, 0xdc, 0xe3, 0x3e, 0xad,
- 0xc6, 0x63, 0x6e, 0x84, 0xbb, 0x84, 0x83, 0xd5, 0x78, 0x9c, 0x2c, 0xd5, 0x63, 0x6e, 0x84, 0xf7,
- 0x54, 0xa4, 0x30, 0x02, 0x20, 0x5f, 0x8d, 0xfb, 0x87, 0xfe, 0xb8, 0x7c, 0x4f, 0xce, 0x70, 0x76,
- 0xfa, 0xb8, 0xc9, 0x61, 0xd2, 0x08, 0x8f, 0xd1, 0x4e, 0xf7, 0x53, 0x46, 0x78, 0x9c, 0xb2, 0xd3,
- 0x63, 0xb4, 0xd3, 0x83, 0x34, 0x09, 0xb7, 0xd3, 0x57, 0xd9, 0x36, 0x1f, 0x68, 0x3a, 0xf4, 0xe2,
- 0x7e, 0x78, 0xe4, 0xc7, 0xe5, 0x0a, 0xe9, 0xb2, 0x09, 0xf0, 0xee, 0xd0, 0xe5, 0x50, 0xfd, 0x3e,
- 0x29, 0x34, 0x1d, 0x7a, 0x51, 0x34, 0x2e, 0x7f, 0x85, 0x88, 0x8a, 0x48, 0xe4, 0x44, 0x63, 0x95,
- 0x22, 0x1e, 0x8f, 0xcb, 0xef, 0xa7, 0x29, 0xdc, 0xf1, 0x58, 0xbf, 0xc7, 0xd8, 0x64, 0x36, 0x8e,
- 0x3c, 0x9c, 0xd3, 0x07, 0xa4, 0x4d, 0x11, 0x60, 0x6d, 0x3e, 0xa5, 0x5b, 0x6c, 0x83, 0x13, 0xc4,
- 0x83, 0xf2, 0x57, 0xc5, 0x02, 0x00, 0xc0, 0xe5, 0xd6, 0xe2, 0xa8, 0xc3, 0x20, 0x2a, 0x7f, 0x4d,
- 0xb8, 0x0c, 0x40, 0x6a, 0x41, 0x04, 0xc8, 0xd9, 0xe1, 0xa1, 0x37, 0x8a, 0x46, 0xc3, 0xf2, 0x87,
- 0x02, 0x39, 0x3b, 0x3c, 0x6c, 0x45, 0xa3, 0xa1, 0x7e, 0x97, 0x15, 0xe3, 0x93, 0xe9, 0xd4, 0x1f,
- 0xc3, 0x2e, 0xfc, 0x75, 0xca, 0x18, 0x05, 0x04, 0xb5, 0x86, 0xd2, 0xd2, 0xfe, 0x59, 0x7c, 0x3c,
- 0x0c, 0xcb, 0x55, 0xd5, 0xd2, 0x26, 0x87, 0xe9, 0x1f, 0xb3, 0xab, 0xe9, 0xc4, 0x83, 0xb9, 0x6d,
- 0xc4, 0x65, 0x65, 0xec, 0x2b, 0xa9, 0xec, 0xc3, 0xf3, 0x5c, 0x85, 0x6d, 0x52, 0x06, 0x42, 0xd2,
- 0x5f, 0xe3, 0xc6, 0xc8, 0xd8, 0x0c, 0xd3, 0x90, 0x4a, 0x13, 0x85, 0x03, 0xa4, 0xf9, 0x5c, 0xa1,
- 0x71, 0xc2, 0x01, 0xa7, 0x79, 0x9f, 0x6d, 0x89, 0xb4, 0x83, 0x44, 0x13, 0xae, 0x5e, 0xc6, 0x2e,
- 0x51, 0xee, 0x11, 0x54, 0x22, 0x23, 0x20, 0x55, 0x28, 0xa8, 0x28, 0x2d, 0xa4, 0xa8, 0xa4, 0x52,
- 0x91, 0x4a, 0xa5, 0x68, 0x45, 0xe1, 0x81, 0x44, 0xbf, 0x41, 0x44, 0x0c, 0x63, 0x44, 0xa5, 0x89,
- 0x05, 0xcd, 0x5f, 0x57, 0x68, 0x5c, 0xa2, 0xf9, 0x80, 0x8f, 0xf6, 0x38, 0xd1, 0xe9, 0x6f, 0x64,
- 0x68, 0x7e, 0x25, 0x0a, 0x80, 0x14, 0x99, 0x54, 0xea, 0x37, 0x53, 0x64, 0x42, 0xab, 0x6f, 0x30,
- 0x4d, 0x09, 0x07, 0xa4, 0xfc, 0xad, 0x0c, 0x0d, 0xbb, 0x9d, 0x04, 0x85, 0x90, 0x29, 0xbc, 0x01,
- 0x29, 0xff, 0xae, 0xa0, 0x2c, 0x91, 0x4f, 0x70, 0x32, 0xd8, 0x4e, 0x84, 0x5f, 0x20, 0xdd, 0x6f,
- 0x67, 0x68, 0x45, 0x37, 0x85, 0x77, 0xa4, 0x06, 0x47, 0x0f, 0x41, 0xd2, 0xdf, 0x49, 0x0d, 0x8e,
- 0x7e, 0x02, 0xc4, 0xb0, 0xa3, 0x9e, 0xf6, 0xc7, 0x27, 0x7e, 0x6d, 0x1d, 0x2b, 0x9d, 0x8a, 0xc7,
- 0x6e, 0xaf, 0xde, 0x95, 0xa1, 0xa4, 0x05, 0x0c, 0x1e, 0x32, 0xa8, 0xb8, 0x82, 0x22, 0x63, 0x0f,
- 0x8f, 0x61, 0xe0, 0x23, 0x0a, 0x13, 0xd5, 0x9f, 0x29, 0x58, 0xe5, 0x5f, 0xe4, 0xf1, 0xa8, 0xd8,
- 0x1f, 0xc0, 0xf9, 0x51, 0xff, 0x38, 0xb5, 0x67, 0x2f, 0xd6, 0x86, 0x48, 0xa6, 0xd6, 0x48, 0xdf,
- 0x61, 0xeb, 0xc1, 0x49, 0x3c, 0x3b, 0x89, 0xa9, 0x36, 0x7c, 0x6f, 0x15, 0x0f, 0x52, 0x41, 0x50,
- 0xe2, 0x2f, 0xfd, 0xfb, 0x14, 0x94, 0x71, 0x3c, 0xe6, 0x5b, 0x7a, 0x69, 0xc9, 0x49, 0x91, 0x78,
- 0x05, 0x9d, 0x08, 0x5b, 0x37, 0x1e, 0xeb, 0x0f, 0x59, 0x7e, 0x76, 0x12, 0x1d, 0x53, 0x45, 0xb4,
- 0x52, 0x55, 0xa0, 0xe1, 0xb5, 0xc2, 0x49, 0x74, 0x0c, 0x43, 0xce, 0x82, 0x19, 0x17, 0x47, 0x15,
- 0xd0, 0xca, 0x21, 0x05, 0x1d, 0x4f, 0x06, 0xc1, 0xac, 0x33, 0x1b, 0x47, 0xfa, 0xb7, 0xd8, 0xda,
- 0x51, 0x18, 0x9c, 0xcc, 0x78, 0x61, 0x50, 0x7a, 0x78, 0x77, 0x15, 0x2f, 0x27, 0x82, 0x4d, 0x83,
- 0xff, 0xd0, 0xbf, 0xcd, 0xd6, 0xa7, 0xaf, 0xf9, 0x34, 0x37, 0xce, 0x37, 0x11, 0x52, 0x01, 0xe3,
- 0xf4, 0x35, 0x4c, 0xf1, 0x09, 0x2b, 0x46, 0x7e, 0x4c, 0x15, 0x5b, 0x81, 0xf3, 0x3e, 0x58, 0xc5,
- 0x2b, 0x09, 0x21, 0x3f, 0x45, 0x7e, 0x8c, 0xc5, 0xdf, 0x67, 0x73, 0x2e, 0x50, 0xe4, 0x42, 0xde,
- 0x5f, 0x25, 0x44, 0xa5, 0x85, 0x24, 0xae, 0x3e, 0xd7, 0x0a, 0x6c, 0x1d, 0xc9, 0x2a, 0x4f, 0xb0,
- 0xdc, 0x4b, 0x2d, 0x2c, 0x3f, 0x73, 0x41, 0xf9, 0x95, 0xa1, 0x33, 0x17, 0x9d, 0x26, 0xe1, 0x50,
- 0x95, 0x1c, 0x5e, 0xd7, 0x27, 0xfd, 0x33, 0x38, 0xb7, 0x7e, 0x8c, 0xe7, 0xa9, 0xb9, 0xe5, 0x85,
- 0xe2, 0x4f, 0xba, 0x04, 0x9d, 0x5e, 0x69, 0xb9, 0x2b, 0x1f, 0xe1, 0x51, 0x46, 0x59, 0x55, 0x28,
- 0xfd, 0xfd, 0xf8, 0xd8, 0x0f, 0xa5, 0xc7, 0x6e, 0xd9, 0x09, 0xa0, 0xf2, 0x69, 0x6a, 0x08, 0xb1,
- 0x9c, 0x5f, 0xc0, 0xf4, 0x8b, 0x4c, 0x9b, 0x5f, 0x47, 0x50, 0x8a, 0xff, 0x50, 0x8e, 0xd4, 0xfc,
- 0xb9, 0x35, 0xac, 0x54, 0x53, 0x86, 0xc0, 0xe5, 0xd3, 0xaf, 0xcb, 0xe5, 0xa6, 0xe3, 0x3c, 0x5f,
- 0xcc, 0xca, 0x1e, 0xbb, 0xb6, 0x6c, 0xb9, 0xf4, 0x8f, 0xa9, 0x8a, 0xe6, 0xd4, 0xe7, 0x9f, 0x2f,
- 0xa8, 0xdc, 0x7e, 0xc6, 0x6e, 0xae, 0x58, 0xb3, 0x85, 0x90, 0xcf, 0x2c, 0x86, 0x3c, 0x2c, 0x14,
- 0xaf, 0x7f, 0x61, 0x45, 0x36, 0x6d, 0xfe, 0xbb, 0xf2, 0xfb, 0x39, 0x34, 0xef, 0x68, 0x1a, 0xc5,
- 0xe1, 0x09, 0xe6, 0x02, 0x5d, 0xc9, 0x05, 0x5b, 0x14, 0xed, 0x7b, 0x8c, 0x1d, 0x05, 0x71, 0x80,
- 0xa7, 0x56, 0x8a, 0xf8, 0xc5, 0x43, 0x84, 0x22, 0xc5, 0x4b, 0xc8, 0x61, 0xb7, 0x86, 0x27, 0x7e,
- 0xc4, 0xd5, 0x5d, 0xb6, 0xfd, 0x3a, 0x1c, 0xc5, 0x4a, 0x3d, 0x8e, 0x39, 0xe0, 0x1b, 0xe7, 0x4a,
- 0x4b, 0xb3, 0x40, 0xf1, 0xce, 0x21, 0xb2, 0x78, 0x7f, 0xc2, 0x36, 0xd0, 0x2c, 0x11, 0xe5, 0x85,
- 0xf7, 0xcf, 0x15, 0x47, 0xb4, 0x10, 0xe3, 0xf4, 0x53, 0xff, 0x2e, 0x5b, 0x9b, 0xf8, 0x60, 0x3a,
- 0xcc, 0x0f, 0x95, 0x73, 0xf9, 0x39, 0x25, 0xc4, 0x2b, 0xff, 0xa1, 0xf7, 0xe6, 0xac, 0xbf, 0xbe,
- 0xa2, 0x81, 0xa5, 0x8a, 0x38, 0x37, 0xe4, 0xd6, 0x71, 0xa9, 0x2a, 0xdf, 0xc6, 0x6d, 0x60, 0xb9,
- 0x5d, 0xcf, 0xe9, 0xf9, 0x54, 0xfa, 0xec, 0xbd, 0xf3, 0x4d, 0xa8, 0xdf, 0x66, 0x05, 0xb9, 0x02,
- 0xd8, 0xbf, 0x90, 0xcf, 0xfa, 0x57, 0xd8, 0x56, 0xba, 0x68, 0xc9, 0x72, 0x82, 0xcd, 0x89, 0x52,
- 0xad, 0x54, 0xda, 0xe8, 0x8d, 0x4b, 0xcc, 0xaa, 0x7f, 0x92, 0xac, 0x06, 0xf6, 0xca, 0x6e, 0xae,
- 0x48, 0x3c, 0xd2, 0xfc, 0x95, 0x87, 0xd8, 0x53, 0x5c, 0x30, 0x32, 0x4f, 0x0d, 0xf0, 0x43, 0x99,
- 0x24, 0x7f, 0x6e, 0x0d, 0x2b, 0x07, 0xd8, 0xda, 0x5b, 0x65, 0xd5, 0x9f, 0x39, 0x28, 0xfe, 0x24,
- 0x87, 0x9d, 0x0c, 0xae, 0xef, 0x24, 0xa0, 0x0e, 0x5a, 0xf0, 0xf9, 0xc8, 0x27, 0x4b, 0xd1, 0x93,
- 0x7e, 0x8f, 0x95, 0xf0, 0x97, 0x6a, 0x25, 0x86, 0x20, 0x5e, 0x04, 0xa8, 0x2b, 0x94, 0x4b, 0x77,
- 0xe5, 0xbe, 0xc7, 0x36, 0x06, 0xc1, 0x64, 0xd2, 0x9f, 0xe2, 0xd9, 0x7e, 0x7b, 0x49, 0x86, 0x17,
- 0xe3, 0x7b, 0x44, 0x68, 0x0b, 0x0e, 0xfd, 0x01, 0xdb, 0x1c, 0x0d, 0xc7, 0xbe, 0x17, 0x8f, 0x26,
- 0x7e, 0x70, 0x12, 0x53, 0xff, 0xa3, 0x04, 0x30, 0x17, 0x41, 0x40, 0x72, 0xdc, 0x0f, 0x87, 0x92,
- 0x04, 0x9b, 0x6c, 0x25, 0x80, 0x09, 0x92, 0xdb, 0xac, 0x30, 0x0b, 0x47, 0x41, 0x38, 0x8a, 0xdf,
- 0x50, 0xa7, 0x4d, 0x3e, 0xeb, 0x3b, 0xac, 0x88, 0xed, 0x2b, 0x50, 0x1d, 0xfb, 0x6c, 0x05, 0x04,
- 0xb4, 0x78, 0xb3, 0x31, 0x38, 0x89, 0xf1, 0xd4, 0x8d, 0xad, 0xb6, 0x8d, 0xe0, 0x24, 0xe6, 0xc7,
- 0xed, 0x1d, 0x56, 0x04, 0x14, 0x6e, 0x97, 0xd8, 0x6c, 0x03, 0xda, 0x5d, 0x9e, 0x51, 0x65, 0xbf,
- 0xb3, 0xa4, 0xf6, 0x3b, 0x7f, 0x81, 0xad, 0xf1, 0x0e, 0x0c, 0x3f, 0xcf, 0x96, 0x1e, 0xde, 0x58,
- 0xde, 0x9f, 0xb1, 0x91, 0x48, 0x7f, 0xc2, 0x36, 0x95, 0x05, 0x8f, 0xca, 0x5b, 0xdc, 0xc1, 0xee,
- 0x9c, 0x17, 0x6b, 0x76, 0x8a, 0xa3, 0xf2, 0xa3, 0x0c, 0x96, 0x3e, 0x87, 0x27, 0x83, 0xcf, 0xfd,
- 0x18, 0x16, 0xf7, 0xb5, 0x3f, 0x3a, 0x3a, 0x16, 0x3b, 0x18, 0x3d, 0x41, 0x91, 0xf5, 0x9a, 0x37,
- 0x86, 0xf8, 0x34, 0x71, 0x1b, 0x2b, 0x72, 0x08, 0x9f, 0xe8, 0x3d, 0x56, 0x42, 0x34, 0x4e, 0x15,
- 0x57, 0x17, 0x39, 0x70, 0xb2, 0x9f, 0xa8, 0x29, 0xe9, 0x62, 0x41, 0xf0, 0x1f, 0xa8, 0x79, 0x84,
- 0xdb, 0x0e, 0x78, 0xde, 0x2f, 0x27, 0x5e, 0x82, 0xa5, 0xd9, 0x62, 0x5e, 0x92, 0xc4, 0x8b, 0x6e,
- 0xf2, 0x51, 0xaa, 0xcd, 0xbf, 0xb3, 0x82, 0x55, 0x29, 0xea, 0xd4, 0x2d, 0x2f, 0x97, 0xda, 0xf2,
- 0x60, 0x3a, 0x68, 0xb0, 0xd5, 0xd3, 0x41, 0xbc, 0x2d, 0xe8, 0x2a, 0xbf, 0x9d, 0x61, 0xdb, 0xbc,
- 0x23, 0xd8, 0x87, 0x67, 0xa8, 0x17, 0xd2, 0x6e, 0x95, 0x99, 0x73, 0xab, 0x9b, 0x6c, 0x63, 0x34,
- 0x55, 0xcd, 0xbd, 0x3e, 0x9a, 0x72, 0x5b, 0x2b, 0xa6, 0xcc, 0x5d, 0xcc, 0x94, 0x32, 0xae, 0xf3,
- 0x6a, 0x5c, 0x93, 0x79, 0x49, 0x9f, 0xd1, 0xf4, 0x7c, 0x75, 0x7e, 0x49, 0x76, 0x4c, 0xb3, 0x2b,
- 0x02, 0x54, 0x0a, 0x9a, 0x6f, 0x9b, 0x9e, 0x13, 0xf7, 0x49, 0x2e, 0xc9, 0xa7, 0x72, 0x89, 0x8c,
- 0x82, 0xb5, 0x8b, 0x44, 0x81, 0x98, 0xde, 0xba, 0x32, 0xbd, 0x7f, 0x98, 0xc3, 0x22, 0x86, 0x33,
- 0x85, 0xfe, 0x24, 0x38, 0xf5, 0x57, 0xa7, 0x2e, 0x35, 0xf6, 0xb3, 0x73, 0xb1, 0xff, 0xcb, 0x72,
- 0xe2, 0x39, 0x3e, 0xf1, 0xf7, 0x97, 0x67, 0x26, 0x1a, 0xe2, 0xbc, 0xb9, 0xe7, 0xd3, 0x73, 0x7f,
- 0xc0, 0x36, 0x87, 0x27, 0x61, 0x9f, 0x0a, 0xa1, 0x81, 0x48, 0x5b, 0x02, 0xe6, 0xf8, 0x03, 0xd8,
- 0x7a, 0x24, 0xc9, 0x14, 0x68, 0x30, 0x6f, 0x49, 0xbe, 0x6e, 0xe4, 0x0f, 0x16, 0xd2, 0xdf, 0xc6,
- 0x17, 0xa7, 0xbf, 0xc2, 0x62, 0xfa, 0x7b, 0xc0, 0x36, 0x69, 0x01, 0x07, 0xc1, 0xc9, 0x14, 0x33,
- 0x59, 0xde, 0x2e, 0x21, 0xac, 0x0e, 0x20, 0xc8, 0x01, 0x87, 0x6f, 0x62, 0x9f, 0x08, 0x18, 0x27,
- 0x28, 0x02, 0x04, 0xd1, 0x72, 0xcd, 0xde, 0x5c, 0x60, 0xcd, 0x2a, 0x7f, 0x92, 0xc5, 0x3d, 0x0e,
- 0xb7, 0xb3, 0xc3, 0xfe, 0x74, 0x78, 0xd1, 0xf7, 0x66, 0x0a, 0x87, 0x12, 0xac, 0x3a, 0xcb, 0x87,
- 0xfd, 0xd8, 0xa7, 0xe5, 0xe3, 0xbf, 0xb9, 0xc2, 0x27, 0x61, 0x14, 0x7b, 0xd1, 0xe8, 0xd7, 0x7d,
- 0x72, 0xbd, 0x22, 0x87, 0x38, 0xa3, 0x5f, 0xf7, 0xf5, 0xc7, 0x2c, 0x3f, 0x0c, 0x83, 0x19, 0xd5,
- 0x48, 0xe7, 0x0e, 0x04, 0x74, 0x70, 0x7e, 0x82, 0x7f, 0xf5, 0xcf, 0x58, 0x69, 0x18, 0x0d, 0x66,
- 0xb0, 0xe4, 0xfd, 0xf0, 0xf3, 0x95, 0x4d, 0x64, 0x95, 0x3d, 0x21, 0xdf, 0xbb, 0x64, 0x33, 0x78,
- 0xb4, 0xf9, 0x93, 0xde, 0x5d, 0x5a, 0x2c, 0x7d, 0x78, 0x9e, 0xb0, 0x0b, 0xd5, 0x4a, 0xd7, 0xb1,
- 0xee, 0x9f, 0x9b, 0x42, 0xe5, 0x7b, 0x58, 0x42, 0x2d, 0x57, 0x0d, 0xec, 0x35, 0x0b, 0xfd, 0x81,
- 0x37, 0xf6, 0x4f, 0x7d, 0x51, 0xb7, 0x17, 0x01, 0xd2, 0x06, 0x40, 0xc5, 0x60, 0x3b, 0xe7, 0xa8,
- 0x72, 0x91, 0x02, 0xa3, 0xf2, 0xaf, 0x28, 0xe9, 0xa0, 0x8c, 0x0b, 0xe6, 0x74, 0x49, 0xbc, 0x98,
- 0xd3, 0xe5, 0x1e, 0x9a, 0x55, 0xf7, 0x50, 0xb5, 0x4a, 0xca, 0xa5, 0xaa, 0x24, 0xfd, 0x3b, 0x6c,
- 0x0d, 0x34, 0x17, 0x69, 0xbb, 0x72, 0x9e, 0xa1, 0xe9, 0xb5, 0x25, 0x32, 0x54, 0x9e, 0xa2, 0xe6,
- 0x7e, 0x18, 0x06, 0xa1, 0x37, 0x89, 0x8e, 0x96, 0x9e, 0x0c, 0x74, 0x96, 0xe7, 0x6d, 0x42, 0xf2,
- 0x42, 0xf8, 0x2d, 0xb3, 0x53, 0x4e, 0xc9, 0x4e, 0xbf, 0x95, 0xc1, 0x85, 0x40, 0x69, 0xa9, 0xa6,
- 0xc6, 0x2a, 0xd1, 0xb7, 0x58, 0xc1, 0x3f, 0xc3, 0xfd, 0x89, 0xc4, 0x6f, 0xf8, 0x67, 0x33, 0xde,
- 0xa3, 0x9c, 0xb7, 0x7c, 0xee, 0x9c, 0xd2, 0x4e, 0xdd, 0x02, 0x4e, 0x29, 0x04, 0x4f, 0xc6, 0xf1,
- 0x68, 0xd6, 0xe7, 0xef, 0xbb, 0x7e, 0x78, 0xe2, 0x47, 0xb1, 0xfe, 0x69, 0x2a, 0x04, 0xef, 0x2d,
- 0x1a, 0x49, 0x72, 0x28, 0x11, 0xb8, 0x7c, 0x2d, 0x74, 0x96, 0x3f, 0x0c, 0x86, 0x6f, 0xc4, 0xec,
- 0xe1, 0x77, 0x25, 0x26, 0xe7, 0x54, 0xc6, 0x9d, 0x8d, 0xdf, 0xfc, 0xbc, 0x47, 0xfd, 0xdd, 0x0c,
- 0xbe, 0xe1, 0x1d, 0xfa, 0xd1, 0x80, 0xbb, 0xc8, 0xab, 0x90, 0xff, 0xe6, 0xe3, 0x15, 0xed, 0x8d,
- 0xc9, 0xab, 0xb0, 0x01, 0x28, 0x7c, 0x21, 0x27, 0x5f, 0xf4, 0x15, 0xed, 0xf5, 0xe3, 0xd7, 0x02,
- 0x11, 0x11, 0x02, 0x5f, 0xf3, 0xae, 0x47, 0x88, 0xb8, 0xcb, 0x58, 0xe4, 0x87, 0xa3, 0xfe, 0xd8,
- 0x9b, 0x9e, 0x4c, 0xb8, 0x85, 0x8b, 0x76, 0x11, 0x21, 0xdd, 0x93, 0x09, 0xf0, 0x0d, 0x71, 0x58,
- 0x9e, 0x2b, 0x8a, 0xf6, 0xfa, 0x70, 0x06, 0x7c, 0x95, 0x3f, 0xca, 0xb0, 0x1b, 0x72, 0x03, 0x89,
- 0xe2, 0x7e, 0x1c, 0xc9, 0x15, 0x38, 0xe7, 0x0d, 0xb6, 0x5a, 0x6f, 0x66, 0xcf, 0xa9, 0x37, 0x73,
- 0x73, 0xf5, 0xe6, 0xaa, 0xbd, 0x76, 0xae, 0x6e, 0x5f, 0x5b, 0xa8, 0xdb, 0x65, 0x62, 0x5f, 0xbf,
- 0x48, 0x62, 0xff, 0xb7, 0x39, 0xac, 0x73, 0x92, 0x49, 0xe9, 0xdb, 0x2c, 0x3b, 0x1a, 0xf2, 0x17,
- 0x2d, 0x79, 0x3b, 0x3b, 0x3a, 0xf7, 0xf5, 0xfc, 0xfc, 0xa6, 0x98, 0xbd, 0xc0, 0xa6, 0x98, 0x5b,
- 0xb2, 0x29, 0xaa, 0x3b, 0x7a, 0x7e, 0x6e, 0x47, 0xff, 0x72, 0xce, 0x0b, 0xd2, 0xf1, 0x36, 0x54,
- 0xc7, 0x4b, 0x8c, 0x5c, 0x48, 0x19, 0xf9, 0x4b, 0xdc, 0x5e, 0xff, 0x1f, 0x1d, 0x0c, 0xfe, 0x38,
- 0x83, 0xe9, 0xbe, 0x7f, 0x74, 0x14, 0xfa, 0x47, 0xfd, 0xd8, 0xff, 0xff, 0xc6, 0x43, 0xff, 0x1a,
- 0xbb, 0xb5, 0x7c, 0x62, 0x90, 0x84, 0xe6, 0x17, 0x2a, 0xf3, 0x45, 0x0b, 0x95, 0x9d, 0x5f, 0xa8,
- 0xbb, 0x8c, 0xf1, 0xa1, 0x11, 0x4d, 0x55, 0x07, 0x40, 0x38, 0xba, 0xf2, 0xe7, 0x39, 0x4c, 0xfd,
- 0x68, 0x3c, 0xba, 0x44, 0xe1, 0xcd, 0xc2, 0x60, 0xe6, 0x87, 0xbc, 0xdc, 0x54, 0x93, 0xe0, 0x62,
- 0x21, 0xb0, 0xc8, 0xa6, 0x66, 0xc3, 0x83, 0xb9, 0x65, 0xc7, 0xde, 0xd4, 0xc7, 0x17, 0x91, 0xa2,
- 0xf2, 0xf1, 0x57, 0x57, 0xca, 0xb3, 0x6e, 0xb3, 0xd2, 0xd4, 0x3f, 0x8b, 0xd5, 0x7b, 0x1a, 0xa5,
- 0x87, 0x1f, 0x5d, 0x44, 0xac, 0xc2, 0x06, 0xa5, 0x0f, 0x3c, 0xd2, 0xed, 0x8e, 0xdd, 0xf9, 0x2e,
- 0xd5, 0x37, 0x2e, 0x22, 0x6f, 0x49, 0xb3, 0xea, 0x7b, 0x2c, 0x17, 0x9c, 0x4d, 0x56, 0xd6, 0x61,
- 0x4b, 0x84, 0x04, 0x67, 0x93, 0xbd, 0x4b, 0x36, 0x70, 0x81, 0xc5, 0x96, 0x14, 0x60, 0x17, 0xb2,
- 0xd8, 0xb9, 0x85, 0x98, 0x78, 0x89, 0x51, 0x39, 0x62, 0x5f, 0xb9, 0x80, 0xc5, 0x17, 0x02, 0x36,
- 0xf3, 0x53, 0x07, 0xec, 0x67, 0xac, 0xf2, 0xc5, 0x6b, 0xa0, 0xbf, 0xcf, 0xb6, 0x93, 0x47, 0x6f,
- 0x34, 0xc4, 0x91, 0xb6, 0xec, 0x4d, 0xb9, 0x32, 0xad, 0x61, 0x54, 0x71, 0xb0, 0x63, 0xb6, 0xda,
- 0xfe, 0x3f, 0x4b, 0x57, 0xeb, 0x5b, 0xab, 0x1c, 0x1f, 0xd6, 0x03, 0x76, 0xc9, 0xe0, 0x6c, 0xc2,
- 0x35, 0xca, 0xe1, 0x3d, 0x98, 0xe0, 0x6c, 0x02, 0xba, 0xfc, 0xfd, 0xcc, 0x4a, 0x0b, 0x9e, 0x5b,
- 0x7f, 0x2e, 0x79, 0xd1, 0x93, 0x2a, 0xa2, 0x72, 0xe9, 0x22, 0xea, 0x1b, 0x2c, 0x75, 0xb9, 0xc3,
- 0xa3, 0x6a, 0x09, 0x34, 0xd1, 0x54, 0x44, 0x03, 0x2a, 0xa7, 0xdf, 0xcb, 0x32, 0x7d, 0x41, 0xa7,
- 0xe8, 0xbc, 0x9c, 0x28, 0x2e, 0x88, 0x65, 0x95, 0x0b, 0x62, 0x1f, 0xb0, 0x6d, 0xa5, 0xb3, 0x08,
- 0xf9, 0x2b, 0xc7, 0x93, 0xc9, 0x56, 0xd2, 0x5a, 0x84, 0x5c, 0xae, 0x92, 0xf1, 0xbe, 0x25, 0xa5,
- 0x47, 0x49, 0xf6, 0x1c, 0x80, 0xca, 0x7d, 0xa1, 0xb5, 0xd4, 0x7d, 0xa1, 0x7b, 0xac, 0x34, 0xe9,
- 0x9f, 0x79, 0xfe, 0x34, 0x0e, 0x47, 0x7e, 0x44, 0x5b, 0x19, 0x9b, 0xf4, 0xcf, 0x4c, 0x84, 0xe8,
- 0xbb, 0x50, 0xf6, 0xf3, 0xf4, 0x03, 0xf8, 0x0d, 0xbe, 0x9a, 0x17, 0x09, 0x23, 0xc8, 0x57, 0xb6,
- 0xc2, 0x5a, 0xf9, 0x51, 0x06, 0xfb, 0xe7, 0x48, 0x8a, 0x7b, 0xff, 0xf9, 0x7b, 0x3d, 0xb8, 0xc6,
- 0xa9, 0x9a, 0x49, 0xb7, 0xec, 0x12, 0xc2, 0x30, 0x97, 0x3e, 0x60, 0x9b, 0xe3, 0x20, 0xf8, 0xfc,
- 0x64, 0xa6, 0x64, 0xd3, 0xbc, 0x5d, 0x42, 0x18, 0x92, 0x7c, 0x85, 0x6d, 0x71, 0xdb, 0xf9, 0x43,
- 0xa2, 0xc9, 0x53, 0x7b, 0x16, 0x81, 0x98, 0x74, 0x3f, 0xc1, 0x42, 0x4b, 0x5e, 0x01, 0x4b, 0xb6,
- 0xb1, 0x55, 0xf7, 0xb2, 0x2a, 0x7f, 0x4a, 0x75, 0x4c, 0xc2, 0xb3, 0xfa, 0x0e, 0xd7, 0x5d, 0xc6,
- 0xc2, 0x33, 0x6a, 0x80, 0x44, 0x62, 0x47, 0x08, 0xcf, 0x2c, 0x04, 0x00, 0x3a, 0x4e, 0xd0, 0x38,
- 0x87, 0x62, 0x2c, 0xd1, 0xb7, 0x58, 0x21, 0x3c, 0xf3, 0x60, 0x03, 0x89, 0x48, 0xf9, 0x8d, 0xf0,
- 0xac, 0x06, 0x8f, 0xdc, 0x7a, 0x02, 0x85, 0xdb, 0xde, 0x46, 0x4c, 0x28, 0x1c, 0x13, 0x4e, 0x75,
- 0x33, 0x7f, 0xc8, 0x57, 0x95, 0x8f, 0xd9, 0x40, 0x00, 0x8d, 0x29, 0xd0, 0x1b, 0x62, 0x4c, 0x81,
- 0xde, 0x61, 0xc5, 0xf0, 0x0c, 0x8f, 0x1f, 0x11, 0x95, 0x2a, 0x85, 0xf0, 0xcc, 0xe4, 0xcf, 0x80,
- 0x8c, 0x25, 0x12, 0x2b, 0x95, 0x42, 0x2c, 0x90, 0xf7, 0xd9, 0x66, 0x78, 0xe6, 0xbd, 0x0a, 0xfb,
- 0x13, 0x1f, 0x48, 0xa8, 0x50, 0x61, 0xe1, 0x59, 0x13, 0x40, 0x26, 0xbf, 0xb5, 0x58, 0x0a, 0xcf,
- 0xbc, 0xe0, 0xd4, 0x0f, 0x39, 0x41, 0x49, 0xa8, 0xd6, 0x3b, 0xf5, 0x43, 0xc0, 0xdf, 0xe1, 0x9a,
- 0x0f, 0xc2, 0x01, 0x47, 0x6f, 0x8a, 0xc1, 0xeb, 0xe1, 0x00, 0xb9, 0xd9, 0x20, 0x18, 0x8f, 0x47,
- 0x11, 0xd5, 0x2d, 0xb4, 0xd7, 0x0b, 0xc8, 0x42, 0x85, 0xb8, 0x7d, 0x81, 0x0a, 0xf1, 0xf2, 0x62,
- 0x85, 0x58, 0x79, 0x84, 0x1d, 0x7b, 0xec, 0xf0, 0x2d, 0x94, 0x36, 0xab, 0xde, 0x75, 0x1d, 0x60,
- 0xdc, 0x63, 0x53, 0x0f, 0x1d, 0xce, 0x0f, 0xff, 0xef, 0x8b, 0x86, 0xca, 0x8f, 0xb2, 0x18, 0x3a,
- 0x8a, 0x3a, 0xe7, 0xa8, 0xc1, 0x97, 0xcf, 0x7f, 0x95, 0x8a, 0x9b, 0x42, 0xe8, 0xbf, 0x92, 0x41,
- 0x93, 0xd2, 0x26, 0xf7, 0x45, 0xda, 0xe4, 0xe7, 0x4b, 0x98, 0x2f, 0xab, 0x35, 0x55, 0x63, 0x9b,
- 0x64, 0x29, 0x3e, 0x23, 0xca, 0x2d, 0xf7, 0x56, 0xf4, 0x4a, 0x85, 0x39, 0xed, 0x12, 0x3e, 0x3b,
- 0xc0, 0x03, 0xc7, 0xb6, 0xed, 0xc4, 0x32, 0xfc, 0xf0, 0xf6, 0x45, 0x57, 0x18, 0xcf, 0xed, 0xe4,
- 0x66, 0x57, 0x76, 0x72, 0x73, 0x17, 0xec, 0xe4, 0xfe, 0x61, 0x46, 0x5d, 0x2b, 0xc8, 0xab, 0x6f,
- 0xf4, 0x5f, 0xa5, 0xab, 0xa1, 0xf8, 0xfa, 0x72, 0x95, 0x4a, 0x40, 0x52, 0xfb, 0x85, 0xdf, 0xfc,
- 0xef, 0xff, 0xf1, 0xee, 0x3a, 0xd2, 0xc3, 0xcf, 0x3b, 0xfa, 0x6d, 0x85, 0xfa, 0x17, 0xd3, 0xd4,
- 0x78, 0x9d, 0x54, 0x7f, 0x88, 0x57, 0x86, 0x45, 0x41, 0x77, 0x67, 0x85, 0x7c, 0x4e, 0x83, 0x17,
- 0x8a, 0xa3, 0xca, 0xdf, 0xca, 0xa0, 0xaf, 0x22, 0x4a, 0xee, 0x51, 0xd7, 0xd8, 0x1a, 0xbf, 0x69,
- 0x28, 0xde, 0xcb, 0xf2, 0x87, 0x85, 0x7b, 0xb4, 0xd9, 0xc5, 0x7b, 0xb4, 0xe0, 0x34, 0xb0, 0x91,
- 0x70, 0x79, 0x62, 0x93, 0x2e, 0x4e, 0xfa, 0x67, 0xbc, 0x78, 0x8f, 0xf4, 0x72, 0xba, 0xc5, 0xbf,
- 0x95, 0x6c, 0xfc, 0xdf, 0x51, 0x1b, 0x47, 0x8b, 0xdd, 0x86, 0x73, 0x5e, 0x6a, 0xfd, 0x1a, 0xbe,
- 0x2e, 0x56, 0x9a, 0x32, 0x18, 0x1a, 0x55, 0x76, 0x85, 0x5c, 0x9c, 0x03, 0xd5, 0xa8, 0xbb, 0x8c,
- 0x88, 0x5a, 0x7f, 0x8a, 0xb9, 0x5f, 0xff, 0x2a, 0xbb, 0xcc, 0x7d, 0x5d, 0xa1, 0xc4, 0xf0, 0xdb,
- 0x02, 0xb0, 0xa4, 0xab, 0xfc, 0x01, 0x85, 0x20, 0x0e, 0x26, 0x43, 0x70, 0x85, 0x6a, 0x73, 0x65,
- 0x7e, 0x76, 0xae, 0xcc, 0x87, 0x51, 0x93, 0x86, 0xb8, 0x1a, 0x87, 0x5b, 0x08, 0x6e, 0x4d, 0x91,
- 0xae, 0xc2, 0xb8, 0x1a, 0x09, 0x15, 0x06, 0x63, 0x09, 0x80, 0x82, 0xe6, 0xcb, 0x0a, 0xc7, 0x27,
- 0x8c, 0x25, 0x36, 0xa4, 0x60, 0x7c, 0x70, 0x5e, 0x07, 0x0c, 0xfd, 0xa9, 0x08, 0xbf, 0x31, 0x18,
- 0x7f, 0x03, 0x9b, 0xea, 0x48, 0x72, 0xee, 0xbd, 0x7d, 0xd5, 0x72, 0xd9, 0x15, 0x3d, 0xb8, 0xdc,
- 0x4f, 0xdb, 0x83, 0xfb, 0xe7, 0xe4, 0xd2, 0x48, 0x20, 0x5d, 0x9a, 0x6e, 0xad, 0xe3, 0x1b, 0xeb,
- 0x8c, 0xbc, 0xb5, 0xde, 0xe1, 0xaf, 0x4c, 0xef, 0xd2, 0xa4, 0xd1, 0xe9, 0x69, 0x9d, 0x00, 0xe2,
- 0x2e, 0x75, 0xfc, 0xdc, 0x12, 0xc7, 0x27, 0xf9, 0xa2, 0x71, 0x28, 0xe4, 0x83, 0xeb, 0x48, 0xe4,
- 0x20, 0x18, 0x07, 0x21, 0xad, 0x0c, 0x20, 0xeb, 0xf0, 0x5c, 0x39, 0x65, 0x0f, 0x78, 0x9b, 0x2f,
- 0xd5, 0xe0, 0x93, 0x01, 0x70, 0xbc, 0xfc, 0x86, 0x52, 0xe6, 0x0b, 0x0a, 0xd7, 0xb9, 0xee, 0xdf,
- 0xb2, 0xfe, 0xe2, 0x18, 0x37, 0xb7, 0xd4, 0xb8, 0x3f, 0xbf, 0xd1, 0x4c, 0xec, 0x23, 0xfe, 0xf0,
- 0xc4, 0x3f, 0xa1, 0xc2, 0x9c, 0xc6, 0xe2, 0x5d, 0x18, 0x2c, 0x14, 0xc5, 0xba, 0xc8, 0x83, 0xae,
- 0xc6, 0x72, 0xc9, 0x8d, 0x18, 0xf8, 0x59, 0x09, 0x51, 0x69, 0x45, 0xcc, 0x64, 0x34, 0xf5, 0x78,
- 0x27, 0xbf, 0xce, 0x4a, 0x8a, 0x5c, 0xca, 0xb2, 0x8b, 0x8e, 0xb3, 0xa0, 0x01, 0x96, 0xa7, 0x74,
- 0x13, 0x6c, 0xc9, 0x2b, 0x82, 0x65, 0x63, 0xf6, 0xcf, 0x7e, 0xce, 0x63, 0xfe, 0x03, 0xea, 0xac,
- 0x28, 0x9c, 0x29, 0xeb, 0x7f, 0x29, 0x03, 0x5f, 0xe4, 0x34, 0xb4, 0x6c, 0x2d, 0xff, 0x66, 0x06,
- 0x43, 0x9c, 0x92, 0x17, 0x1f, 0x04, 0xfc, 0x01, 0x47, 0x4b, 0xd2, 0x20, 0x7f, 0xc6, 0x73, 0x8d,
- 0xd2, 0xe7, 0xc1, 0x0b, 0x4f, 0xb5, 0xd4, 0x81, 0x62, 0x55, 0xa7, 0x7d, 0x85, 0xfe, 0x74, 0x96,
- 0x78, 0x88, 0xd7, 0x19, 0x90, 0xe8, 0x88, 0x17, 0x07, 0x90, 0x6d, 0xe4, 0xa6, 0xb1, 0xe4, 0xa2,
- 0x55, 0xe5, 0x08, 0x0f, 0x98, 0x4b, 0x78, 0x66, 0xe3, 0x37, 0x4b, 0xaf, 0x66, 0x7d, 0x8b, 0xad,
- 0x73, 0x6a, 0xf1, 0x5d, 0xc3, 0xdd, 0x55, 0x6f, 0x35, 0x39, 0x95, 0x4d, 0xc4, 0x15, 0x73, 0xe1,
- 0x16, 0x13, 0xda, 0x69, 0x45, 0xdf, 0x5e, 0xda, 0x2e, 0x97, 0xb2, 0x5d, 0xa5, 0xa3, 0x3a, 0xdf,
- 0xc5, 0x8e, 0x25, 0x29, 0x71, 0xd9, 0xb4, 0xb8, 0x3f, 0xa3, 0xba, 0x44, 0x91, 0xf7, 0xb3, 0xc8,
- 0x49, 0x1d, 0x3a, 0x72, 0x0b, 0x87, 0x0e, 0xe5, 0x24, 0x93, 0x9f, 0x3f, 0xc9, 0xa4, 0x0e, 0x0e,
- 0x6b, 0x73, 0x07, 0x87, 0xf9, 0x5d, 0x6c, 0xfd, 0x02, 0xbb, 0xd8, 0xc6, 0x92, 0xc2, 0x7d, 0x82,
- 0x0e, 0x1a, 0x06, 0x63, 0x5f, 0x9a, 0xeb, 0x11, 0xcb, 0xc3, 0xf3, 0xca, 0x77, 0x86, 0x83, 0x60,
- 0x1a, 0x87, 0xc1, 0x78, 0xec, 0x87, 0x9c, 0xcf, 0xe6, 0xd4, 0x30, 0xdc, 0x91, 0x3f, 0xf5, 0x69,
- 0x40, 0x32, 0x44, 0xde, 0xde, 0x4c, 0x80, 0xad, 0x61, 0xe5, 0x77, 0x28, 0x20, 0xfa, 0xd1, 0x9b,
- 0xe9, 0x40, 0xec, 0x79, 0xef, 0xb3, 0xed, 0x64, 0x77, 0xe7, 0x4d, 0x49, 0xea, 0xa2, 0x88, 0xcd,
- 0x9d, 0xb7, 0x25, 0x3f, 0x64, 0x9a, 0xf2, 0xd1, 0x91, 0xb8, 0x16, 0x03, 0x74, 0xdb, 0x00, 0x77,
- 0x38, 0x98, 0x53, 0x56, 0xd9, 0x95, 0xd4, 0x5b, 0x64, 0x4e, 0x8a, 0x15, 0xd6, 0x65, 0x40, 0xd8,
- 0x08, 0xe7, 0x57, 0x8d, 0x5e, 0xb2, 0x6d, 0xbe, 0xb3, 0x75, 0x82, 0xe1, 0xfe, 0x6c, 0x08, 0x99,
- 0x0a, 0xfb, 0xeb, 0xf8, 0x1a, 0x23, 0x3b, 0xe2, 0x1f, 0xd9, 0xc8, 0x77, 0x66, 0x54, 0x31, 0xde,
- 0x5e, 0xfd, 0x56, 0xcd, 0xc6, 0x8d, 0xba, 0x13, 0x0c, 0x2b, 0x16, 0xbb, 0xcc, 0x45, 0xf3, 0xcd,
- 0xde, 0xe6, 0x51, 0xf3, 0x7d, 0x56, 0x52, 0x0a, 0xa2, 0x95, 0x6d, 0x29, 0x85, 0xc6, 0x66, 0x13,
- 0x29, 0xa3, 0xf2, 0x9c, 0x5d, 0x6e, 0x8e, 0x83, 0xd7, 0xbc, 0xb1, 0xb4, 0x42, 0xdb, 0x47, 0xac,
- 0x20, 0xee, 0xf6, 0x90, 0xb2, 0xb7, 0x56, 0x5e, 0xfe, 0xb1, 0x37, 0xe0, 0x17, 0xa8, 0xea, 0xb1,
- 0x6b, 0x20, 0x98, 0xd7, 0x9e, 0xe7, 0x49, 0xff, 0x36, 0x2b, 0xca, 0x3b, 0x21, 0x2b, 0x6d, 0x21,
- 0x29, 0x6c, 0x3c, 0x27, 0xc0, 0x00, 0xdf, 0x65, 0x6b, 0x30, 0x40, 0xa4, 0x7f, 0xc2, 0xd6, 0x46,
- 0xb1, 0x3f, 0x11, 0x73, 0xdf, 0x59, 0xae, 0x1c, 0x95, 0xde, 0x9c, 0xb2, 0xf2, 0x7d, 0xb6, 0xce,
- 0xed, 0x18, 0xe9, 0x9f, 0xa6, 0x99, 0xef, 0xae, 0x30, 0x1c, 0xba, 0x95, 0x60, 0x7f, 0xc2, 0x98,
- 0x9c, 0x5b, 0x04, 0xb5, 0xbf, 0x2a, 0x62, 0x55, 0xed, 0xcf, 0xcf, 0x21, 0x42, 0xc2, 0x88, 0x95,
- 0x40, 0x42, 0xfd, 0xb8, 0x3f, 0x3d, 0xf2, 0x23, 0xfd, 0xeb, 0x6c, 0x3d, 0x0e, 0xbc, 0xfe, 0x50,
- 0x5c, 0xaf, 0xd4, 0x53, 0x32, 0xf8, 0x34, 0xed, 0xb5, 0x38, 0x30, 0x86, 0x43, 0xfd, 0x23, 0x56,
- 0x8c, 0x03, 0xf2, 0x43, 0xb2, 0xd7, 0x32, 0xea, 0x42, 0x1c, 0xa0, 0x4f, 0x42, 0x4d, 0xa6, 0x49,
- 0x6d, 0xc5, 0x80, 0xdf, 0x9c, 0x1b, 0xf0, 0xe6, 0x82, 0x08, 0x9c, 0x9c, 0x18, 0xf5, 0xd1, 0xe2,
- 0xa8, 0x2b, 0x59, 0xe4, 0xd0, 0xc4, 0x75, 0xc2, 0x17, 0x9e, 0x7a, 0xd2, 0xe7, 0x71, 0xa1, 0x87,
- 0x54, 0x1c, 0x56, 0xb0, 0x28, 0x4a, 0x97, 0x79, 0x8b, 0x8c, 0xeb, 0x95, 0xde, 0x22, 0x29, 0xec,
- 0x82, 0x08, 0xf7, 0xca, 0x73, 0x56, 0x44, 0xa1, 0xbd, 0x93, 0x78, 0x41, 0xea, 0x77, 0x19, 0x4b,
- 0x6e, 0xfd, 0x90, 0xd8, 0x9d, 0x55, 0x62, 0x83, 0x93, 0xd8, 0x26, 0x25, 0x7a, 0x27, 0xb0, 0xa7,
- 0x95, 0xd0, 0xa8, 0xe6, 0xa9, 0x3f, 0x5d, 0x14, 0xfd, 0x97, 0x58, 0x49, 0x49, 0x31, 0x2b, 0x8f,
- 0x87, 0x0a, 0xcd, 0xde, 0x25, 0x9b, 0x25, 0xd9, 0xa7, 0xb6, 0xc1, 0xd6, 0x7c, 0x90, 0x5c, 0xfd,
- 0x2f, 0x19, 0x56, 0x92, 0xa4, 0xd3, 0x40, 0xd7, 0xd8, 0x66, 0xaf, 0x69, 0x59, 0x5e, 0xab, 0x7b,
- 0x60, 0xb4, 0x5b, 0x0d, 0xed, 0x92, 0xae, 0xb1, 0x02, 0x87, 0x74, 0x8c, 0x17, 0xda, 0xdb, 0x9f,
- 0xbc, 0x7b, 0xb7, 0xa1, 0x5f, 0x93, 0x34, 0x9e, 0xd5, 0xb3, 0x5d, 0xed, 0x7f, 0xbc, 0x03, 0xa8,
- 0xce, 0x18, 0x87, 0xba, 0x46, 0xad, 0x6d, 0x6a, 0xff, 0x93, 0xc3, 0xae, 0xb2, 0x12, 0x87, 0x75,
- 0x7b, 0x76, 0xc7, 0x68, 0x6b, 0x7f, 0x91, 0x22, 0x6c, 0xb6, 0x7b, 0xbd, 0x86, 0xf6, 0xbf, 0x38,
- 0x4c, 0x0c, 0x62, 0xb4, 0xdb, 0xda, 0x8f, 0x39, 0xe4, 0x26, 0xbb, 0xcc, 0x21, 0xf5, 0x5e, 0xd7,
- 0xb5, 0x7b, 0xed, 0xb6, 0x69, 0x6b, 0xff, 0x3b, 0xc5, 0xde, 0xee, 0xd5, 0x8d, 0xb6, 0xf6, 0x93,
- 0x34, 0x7b, 0xf7, 0xa5, 0xf6, 0x0e, 0x20, 0xd5, 0x7f, 0xb7, 0x86, 0xaf, 0x7d, 0xf9, 0x66, 0xbc,
- 0xcd, 0x59, 0x5c, 0x6f, 0xcf, 0x6c, 0xb7, 0x7b, 0xda, 0x25, 0xf9, 0x6c, 0xda, 0x76, 0xcf, 0xd6,
- 0x32, 0xfa, 0x75, 0x76, 0x05, 0x9f, 0xeb, 0x7b, 0x3d, 0xcf, 0x36, 0x9f, 0xed, 0x9b, 0x8e, 0xab,
- 0x65, 0xf5, 0xab, 0x5c, 0x05, 0x09, 0xb6, 0xda, 0x2f, 0xb5, 0x5c, 0x42, 0xfb, 0xc2, 0x32, 0xed,
- 0x56, 0xc7, 0xec, 0xba, 0xa6, 0xad, 0xe5, 0xf5, 0x5b, 0xec, 0x3a, 0x07, 0x37, 0x4d, 0xc3, 0xdd,
- 0xb7, 0x4d, 0x47, 0x8a, 0x59, 0xd3, 0x6f, 0xb2, 0xab, 0xf3, 0x28, 0x10, 0xb5, 0xae, 0xef, 0xb0,
- 0x9b, 0x1c, 0xb1, 0x6b, 0xba, 0x30, 0xcd, 0x66, 0x6b, 0x57, 0x72, 0x6d, 0x48, 0x81, 0x29, 0x24,
- 0xf0, 0x15, 0xa4, 0x5e, 0x8e, 0x44, 0x69, 0x45, 0x5d, 0x67, 0xdb, 0x1c, 0x68, 0x19, 0xf5, 0xa7,
- 0xa6, 0xeb, 0xb5, 0xba, 0x1a, 0x93, 0xba, 0x36, 0xdb, 0xbd, 0xe7, 0x9e, 0x6d, 0x76, 0x7a, 0x07,
- 0x66, 0x43, 0x2b, 0xe9, 0xd7, 0x98, 0x86, 0xa4, 0x3d, 0xdb, 0xf5, 0x1c, 0xd7, 0x70, 0xf7, 0x1d,
- 0x6d, 0x53, 0x4a, 0x25, 0x01, 0xbd, 0x7d, 0x57, 0xdb, 0xd2, 0xaf, 0xb0, 0xad, 0x44, 0x42, 0xa7,
- 0xd7, 0xd0, 0xb6, 0xe5, 0x40, 0xbb, 0x76, 0x6f, 0xdf, 0xe2, 0xb0, 0xcb, 0x92, 0x8c, 0x4b, 0x04,
- 0x90, 0x26, 0xc9, 0xb8, 0x3b, 0x70, 0xd8, 0x15, 0xfd, 0x36, 0xbb, 0xc1, 0x61, 0x9d, 0xfd, 0xb6,
- 0xdb, 0xb2, 0x0c, 0xdb, 0x95, 0xf3, 0xd5, 0xf5, 0x32, 0xbb, 0xb6, 0x80, 0x83, 0xe9, 0x5e, 0x95,
- 0x98, 0x9a, 0x61, 0xdb, 0x2d, 0xd3, 0x96, 0x3c, 0xd7, 0xf4, 0x1b, 0x4c, 0x9f, 0xc3, 0x00, 0xc7,
- 0x75, 0xfd, 0x01, 0xbb, 0xcb, 0xe1, 0xcf, 0xf6, 0xcd, 0x7d, 0x73, 0x99, 0x79, 0x6f, 0xe8, 0xf7,
- 0xd8, 0xce, 0x2a, 0x12, 0x90, 0x71, 0x53, 0xda, 0xce, 0xee, 0xb5, 0x4d, 0xc9, 0x57, 0x96, 0x56,
- 0x22, 0x30, 0xd0, 0xde, 0x92, 0xf3, 0x02, 0x31, 0x86, 0xf3, 0xb2, 0x5b, 0x97, 0x0c, 0xb7, 0xa5,
- 0xf6, 0x2a, 0x0e, 0xb8, 0x76, 0xa4, 0x85, 0x1c, 0x81, 0xd1, 0xee, 0x48, 0x58, 0xc7, 0x74, 0x4d,
- 0x9b, 0x5b, 0xed, 0x6e, 0xb5, 0x8e, 0xf7, 0x26, 0xe6, 0xfe, 0x70, 0x00, 0x91, 0xee, 0xf1, 0xb5,
- 0x16, 0xb1, 0x8a, 0x83, 0x01, 0xec, 0xc0, 0xb4, 0x9d, 0x56, 0xaf, 0x5b, 0x6b, 0xb9, 0x1d, 0xc3,
- 0xd2, 0x32, 0x55, 0x1f, 0xcb, 0x19, 0x2a, 0x8d, 0xf1, 0xb0, 0x8e, 0x7e, 0x50, 0xf7, 0x9a, 0xb6,
- 0xb1, 0x2b, 0x42, 0xf4, 0x12, 0xc9, 0x25, 0x68, 0xc3, 0xee, 0x59, 0x5a, 0x86, 0x66, 0x4d, 0x30,
- 0xdb, 0x34, 0x9c, 0x8e, 0x96, 0x4d, 0x13, 0x76, 0x0c, 0xe7, 0xa9, 0x96, 0xab, 0x3e, 0xc1, 0x61,
- 0xb0, 0xf7, 0x4f, 0x55, 0x13, 0x39, 0x47, 0x5d, 0xd1, 0x93, 0x9c, 0xbb, 0xee, 0x35, 0x4c, 0xcb,
- 0x36, 0xeb, 0x86, 0x6b, 0x36, 0x84, 0x84, 0x5f, 0xc1, 0xaf, 0x96, 0xf1, 0x76, 0x37, 0xb1, 0xaa,
- 0x53, 0xdc, 0x66, 0x45, 0x04, 0x41, 0x3e, 0xfa, 0x49, 0x26, 0x79, 0x86, 0xd4, 0xf1, 0x2e, 0x53,
- 0xfd, 0xd7, 0x54, 0xb8, 0xa5, 0x8e, 0xf2, 0x98, 0xd5, 0x54, 0x0d, 0xe4, 0x8c, 0xc0, 0xb1, 0x21,
- 0x06, 0x1c, 0x2d, 0x23, 0x0d, 0x82, 0x3e, 0x8b, 0xd0, 0xac, 0x24, 0x95, 0xe1, 0xe2, 0x68, 0x79,
- 0x49, 0x8a, 0x51, 0x80, 0xd0, 0x02, 0xe9, 0x5b, 0xf7, 0x5a, 0x16, 0x59, 0xe9, 0xbe, 0x24, 0x44,
- 0x47, 0x43, 0xc2, 0x27, 0xfa, 0x0d, 0xee, 0x5d, 0x24, 0xb3, 0xd6, 0xee, 0xd5, 0x9f, 0x9a, 0x0d,
- 0xed, 0x6d, 0xb6, 0x7a, 0xaa, 0x7c, 0xb4, 0x9e, 0x32, 0xdf, 0x12, 0xe5, 0x05, 0x7b, 0xa3, 0xf7,
- 0xbc, 0xab, 0x65, 0x12, 0xba, 0x2e, 0x24, 0xab, 0xfa, 0x81, 0x96, 0x17, 0xc9, 0x9c, 0x83, 0x9a,
- 0xcf, 0x1b, 0xda, 0x7d, 0x8a, 0x18, 0x84, 0x24, 0x99, 0xe2, 0x49, 0xf5, 0x2f, 0xcf, 0xbd, 0xf5,
- 0x10, 0xa6, 0xb7, 0x9c, 0xc5, 0x61, 0x1d, 0xaf, 0xdd, 0xea, 0x3e, 0x9d, 0x1b, 0xd6, 0x91, 0xb3,
- 0xc8, 0x52, 0x7a, 0xe5, 0x74, 0x07, 0xa6, 0x96, 0xaf, 0xfe, 0x69, 0x16, 0x3f, 0x15, 0xe1, 0xd2,
- 0x65, 0xfb, 0x86, 0x18, 0x9b, 0xca, 0x00, 0x12, 0xf4, 0xc9, 0xc7, 0x9d, 0x9a, 0xb7, 0xd7, 0x48,
- 0xc4, 0x13, 0xa8, 0xd9, 0x90, 0x7e, 0xc7, 0x41, 0x44, 0x96, 0x9f, 0x87, 0x35, 0x1b, 0x5a, 0x41,
- 0xcc, 0xbe, 0xe9, 0x7d, 0xb2, 0xcb, 0xa9, 0xb4, 0x34, 0xa4, 0x09, 0xf6, 0x50, 0xc4, 0x23, 0xe8,
- 0x89, 0xae, 0x0b, 0xd0, 0x23, 0x02, 0xbd, 0x05, 0xff, 0x4f, 0xc4, 0x13, 0x30, 0xab, 0x5f, 0x91,
- 0xd2, 0x5c, 0x04, 0x81, 0xc1, 0x4b, 0x08, 0xea, 0xb9, 0x7b, 0xa6, 0xad, 0xbd, 0x2d, 0x24, 0x44,
- 0xf5, 0x9e, 0x65, 0x01, 0x48, 0x4b, 0x88, 0x9a, 0xad, 0x1a, 0x40, 0xee, 0x27, 0x43, 0x1a, 0xfb,
- 0x6e, 0xaf, 0x6b, 0xee, 0x6a, 0x6f, 0x9f, 0xe8, 0x57, 0x04, 0x95, 0x65, 0xec, 0x3b, 0xa6, 0xf6,
- 0xf6, 0x6d, 0x46, 0xbf, 0xc1, 0x5d, 0x49, 0x80, 0x20, 0x67, 0x74, 0xb4, 0xb7, 0x6f, 0xb3, 0xd5,
- 0x86, 0xe2, 0x34, 0x74, 0x01, 0x75, 0x8b, 0x47, 0x85, 0x65, 0x7b, 0x46, 0x03, 0xf7, 0xf0, 0x4d,
- 0x7c, 0x6c, 0x98, 0x6d, 0xd3, 0x35, 0xb5, 0x4c, 0x02, 0xe9, 0xf4, 0x1a, 0xad, 0xe6, 0x4b, 0x2d,
- 0x5b, 0xfd, 0x14, 0x5d, 0x20, 0xf9, 0x43, 0x00, 0x64, 0xd4, 0x0e, 0x77, 0xfa, 0x6e, 0xc3, 0xb0,
- 0x41, 0x12, 0x0a, 0xee, 0xb8, 0x5e, 0xef, 0x45, 0x47, 0xcb, 0x54, 0x3f, 0x4f, 0xbe, 0xf4, 0xe7,
- 0x9f, 0xee, 0x93, 0xdc, 0x17, 0x9d, 0xba, 0xd7, 0x7d, 0xd1, 0xf1, 0x3e, 0x96, 0x63, 0x0b, 0xc8,
- 0x27, 0x5a, 0x46, 0xdf, 0xe1, 0xd1, 0x0f, 0x90, 0x9e, 0x65, 0x76, 0x79, 0x04, 0xd6, 0x0c, 0xa7,
- 0x55, 0x87, 0xc9, 0xe8, 0xb7, 0xf8, 0x6e, 0x09, 0xc8, 0xd4, 0x0e, 0xfb, 0xee, 0x5d, 0xae, 0xfa,
- 0xf7, 0x0a, 0xec, 0xea, 0x92, 0x8f, 0xe7, 0xc9, 0xa9, 0x5f, 0x80, 0x52, 0xcd, 0x9a, 0xac, 0x4a,
- 0x2e, 0x51, 0x5a, 0x56, 0xe1, 0x7b, 0x2f, 0x11, 0x97, 0xa1, 0x4d, 0x59, 0xe0, 0x3a, 0xa6, 0x6b,
- 0x34, 0x0c, 0xd7, 0xd0, 0xb2, 0x73, 0xc2, 0x4c, 0x77, 0xcf, 0x6b, 0x38, 0xae, 0x96, 0x5b, 0x02,
- 0x77, 0xec, 0xba, 0x96, 0x9f, 0x13, 0x04, 0x70, 0xf7, 0xa5, 0x65, 0xca, 0x6d, 0x5f, 0x20, 0x0e,
- 0xda, 0x46, 0xd7, 0x3b, 0x68, 0x35, 0xb4, 0xf5, 0x65, 0x08, 0xab, 0x6e, 0x69, 0x1b, 0xf3, 0xf3,
- 0xb0, 0xbc, 0x86, 0x53, 0xb7, 0xb4, 0x02, 0x6d, 0x45, 0x0a, 0xdc, 0xac, 0x77, 0xb5, 0xe2, 0x9c,
- 0x9c, 0x96, 0xe5, 0x59, 0x76, 0xcf, 0xed, 0x69, 0x6c, 0x01, 0x71, 0xf0, 0x88, 0xeb, 0x5a, 0x5a,
- 0x86, 0x80, 0xc9, 0x6d, 0xce, 0x8d, 0xec, 0xd6, 0x2d, 0xce, 0xb0, 0xb5, 0x04, 0x0e, 0xf4, 0xdb,
- 0x73, 0xf0, 0xfd, 0x06, 0xd2, 0x5f, 0x5e, 0x02, 0x07, 0x7a, 0x6d, 0x6e, 0x60, 0xa7, 0xee, 0x22,
- 0xc3, 0x95, 0x65, 0x88, 0x06, 0x2f, 0x07, 0xe6, 0xd6, 0xae, 0xde, 0x01, 0x65, 0xb9, 0x65, 0xaf,
- 0x2e, 0xc7, 0xd5, 0x7b, 0x0d, 0x53, 0xbb, 0x36, 0x67, 0x2b, 0xc3, 0xb6, 0xbc, 0x9e, 0xa5, 0x5d,
- 0x9f, 0x53, 0x0c, 0xc0, 0x8e, 0x65, 0x68, 0x37, 0x96, 0xc0, 0x5d, 0xcb, 0xd0, 0x6e, 0x2e, 0xa3,
- 0xdf, 0x33, 0xb4, 0xf2, 0x32, 0xfa, 0x3d, 0x43, 0xbb, 0xb5, 0x68, 0xd9, 0xc7, 0x7c, 0x82, 0xb7,
- 0x97, 0x21, 0x60, 0x82, 0x3b, 0xf3, 0x93, 0x00, 0x44, 0xb3, 0x6d, 0xd4, 0xcc, 0xb6, 0x76, 0x67,
- 0xd9, 0x04, 0x1f, 0xe3, 0xe4, 0xef, 0x2e, 0xc7, 0xf1, 0xc9, 0xbf, 0xa7, 0xdf, 0x65, 0xb7, 0xe6,
- 0x65, 0x76, 0x1b, 0x9e, 0x6b, 0xd8, 0xbb, 0xa6, 0xab, 0xdd, 0x5b, 0x36, 0x64, 0xb7, 0xe1, 0x39,
- 0xed, 0xb6, 0x76, 0x7f, 0x05, 0xce, 0x6d, 0xb7, 0xb5, 0x07, 0xb4, 0x5b, 0xcb, 0x58, 0xb1, 0xda,
- 0x8e, 0x87, 0x9a, 0x56, 0xe6, 0xec, 0xc1, 0x51, 0x6e, 0x5d, 0xfb, 0xca, 0x7c, 0x78, 0x01, 0xbc,
- 0xd6, 0x73, 0xb4, 0xf7, 0xe7, 0x10, 0x56, 0xad, 0xe6, 0xb5, 0x9c, 0x56, 0x43, 0xfb, 0x80, 0x4a,
- 0x17, 0xe9, 0x6a, 0xfb, 0xdd, 0xae, 0xd9, 0xf6, 0x5a, 0x0d, 0xed, 0xab, 0xcb, 0x54, 0x33, 0x5f,
- 0xb8, 0x7b, 0x0d, 0x5b, 0xfb, 0x5a, 0xf5, 0x53, 0x3c, 0xbd, 0xf0, 0x4f, 0xbd, 0x47, 0x43, 0xfd,
- 0x32, 0x4f, 0x9a, 0x07, 0xad, 0x86, 0xd7, 0xed, 0x75, 0x4d, 0xbe, 0x65, 0x6d, 0x13, 0xc0, 0xb2,
- 0x4d, 0xc7, 0xec, 0xba, 0xda, 0xdb, 0xfb, 0xd5, 0x7f, 0x9f, 0xc1, 0x46, 0xde, 0x68, 0x76, 0xfa,
- 0x98, 0x3e, 0x4d, 0x16, 0xf7, 0x47, 0x81, 0xba, 0x65, 0xee, 0x2d, 0xec, 0x49, 0x00, 0x03, 0x91,
- 0x2f, 0x20, 0x77, 0xe0, 0xfe, 0x06, 0x20, 0xd3, 0xb1, 0xb4, 0x2c, 0x8d, 0x0a, 0xcf, 0xc6, 0xbe,
- 0xbb, 0xa7, 0xe5, 0x15, 0x40, 0x03, 0x8a, 0xc0, 0x82, 0x02, 0x80, 0x62, 0x49, 0xd3, 0x14, 0xa9,
- 0x76, 0x6f, 0x1f, 0xf2, 0xdb, 0x7d, 0x45, 0xea, 0x5e, 0xcf, 0xd2, 0x9e, 0xd0, 0xce, 0x01, 0xcf,
- 0xfb, 0x5d, 0xdb, 0xb4, 0x60, 0x1b, 0x52, 0x41, 0x8e, 0xf9, 0x0c, 0x0a, 0x86, 0x1f, 0x67, 0x53,
- 0xdf, 0x86, 0xd2, 0x9f, 0xab, 0x02, 0x32, 0x83, 0xd7, 0xf0, 0xd6, 0x3e, 0x64, 0x42, 0x5c, 0x26,
- 0x03, 0x8a, 0x5c, 0xeb, 0xa5, 0xe7, 0xba, 0x6d, 0x5e, 0xde, 0x97, 0x28, 0x5a, 0x54, 0x78, 0xab,
- 0x2b, 0xd3, 0x81, 0x81, 0xa5, 0x29, 0x2e, 0xaa, 0xdb, 0x96, 0xe1, 0x6d, 0xb8, 0x5e, 0xc3, 0xac,
- 0x27, 0x70, 0x8d, 0x0a, 0x03, 0xc3, 0xf5, 0xac, 0x7d, 0x67, 0x8f, 0x67, 0x34, 0xed, 0x0a, 0x19,
- 0x13, 0x80, 0x3d, 0x0b, 0x61, 0xfa, 0x1c, 0x21, 0x48, 0xd0, 0xae, 0xa6, 0x09, 0x39, 0xec, 0x5a,
- 0x42, 0x08, 0x1a, 0xf0, 0xd2, 0x49, 0xbb, 0x4e, 0x56, 0x34, 0xe8, 0xe8, 0xa1, 0xdd, 0xa0, 0xda,
- 0x8a, 0xa8, 0xba, 0xcf, 0xb9, 0x36, 0x37, 0x13, 0x28, 0x68, 0x49, 0xd0, 0x72, 0x5a, 0x62, 0xb3,
- 0x65, 0xb6, 0x1b, 0xda, 0x2d, 0x65, 0x68, 0xd0, 0xc7, 0xaa, 0xd5, 0xb4, 0xdb, 0xb4, 0x34, 0xa4,
- 0x0e, 0x80, 0x76, 0xf4, 0xb2, 0x98, 0xf7, 0xc2, 0x96, 0x74, 0x80, 0x37, 0x4c, 0x94, 0x46, 0x23,
- 0x7d, 0xf3, 0x2b, 0xaa, 0xe3, 0x4e, 0x3b, 0x75, 0x94, 0x66, 0x04, 0x83, 0xe2, 0xf5, 0xbf, 0xbe,
- 0xcb, 0xd1, 0x96, 0x0e, 0x90, 0x6e, 0xcf, 0xab, 0xed, 0x37, 0x9b, 0x24, 0xf7, 0x3f, 0x0b, 0x17,
- 0x55, 0xbe, 0xeb, 0xe3, 0x6b, 0x4b, 0x8e, 0xa3, 0x56, 0xc4, 0x38, 0xdf, 0x96, 0xeb, 0xed, 0xf6,
- 0xdc, 0x1e, 0x1d, 0xbf, 0x33, 0x14, 0x4f, 0x2d, 0xd7, 0x7b, 0x6e, 0xb7, 0x5c, 0x53, 0xdd, 0xe1,
- 0x30, 0x04, 0x25, 0xc6, 0xa8, 0xbb, 0xad, 0x5e, 0xd7, 0xd1, 0x72, 0x09, 0xc2, 0xb0, 0xac, 0xf6,
- 0x4b, 0x89, 0xc8, 0x27, 0x88, 0x7a, 0xdb, 0x34, 0x6c, 0x89, 0x58, 0x13, 0x7e, 0x4d, 0xe7, 0x15,
- 0x6d, 0x9d, 0x2c, 0xd5, 0x5a, 0x62, 0xa9, 0xbf, 0x8a, 0x13, 0x9a, 0xff, 0x9e, 0x8f, 0x0a, 0x8a,
- 0x66, 0x3d, 0x55, 0xa9, 0x34, 0xeb, 0xa2, 0x2e, 0x11, 0x3b, 0xb5, 0x84, 0x78, 0x8e, 0x6b, 0xb7,
- 0xea, 0x70, 0x3c, 0x97, 0xa4, 0x54, 0xd4, 0xe4, 0x12, 0x52, 0x84, 0x08, 0xd2, 0x7c, 0xf5, 0x1f,
- 0xd3, 0x1b, 0x44, 0x39, 0x3a, 0xc6, 0x3b, 0x1a, 0xb3, 0xa9, 0x96, 0xa0, 0x24, 0xa2, 0xe9, 0x39,
- 0x66, 0xb7, 0x21, 0x0f, 0xce, 0x89, 0x1a, 0x4d, 0xaf, 0xbe, 0x67, 0xd6, 0x9f, 0x7a, 0xbd, 0x03,
- 0xd3, 0x6e, 0x1b, 0x96, 0x2c, 0x18, 0x9a, 0x4d, 0x0f, 0x12, 0x0c, 0x44, 0xd2, 0x7e, 0xd7, 0x4d,
- 0x8c, 0xd6, 0x6c, 0xf2, 0x52, 0xfb, 0xa9, 0x44, 0x14, 0x52, 0x88, 0xda, 0x4b, 0x89, 0xd0, 0xaa,
- 0x0e, 0x1e, 0x7d, 0xf0, 0xcb, 0x6b, 0x9c, 0xdd, 0xee, 0x42, 0x23, 0x66, 0x57, 0x69, 0xc4, 0x08,
- 0x48, 0xd2, 0x35, 0x91, 0x10, 0xd9, 0x08, 0xf9, 0x0c, 0xdf, 0xd2, 0x2d, 0x7c, 0x21, 0x47, 0x86,
- 0xdf, 0x4d, 0x1b, 0x7e, 0x57, 0x31, 0xbc, 0x84, 0x90, 0x7d, 0xb3, 0x55, 0x47, 0xbd, 0x93, 0xc1,
- 0xdd, 0x91, 0x84, 0xe0, 0xe9, 0x4b, 0x0a, 0x81, 0x20, 0x6b, 0x9b, 0x75, 0xc8, 0x95, 0x18, 0x06,
- 0xbb, 0xe0, 0xaf, 0x8d, 0x96, 0x6d, 0xf2, 0x85, 0xdb, 0x44, 0x25, 0x5d, 0xaf, 0xd9, 0xd4, 0x72,
- 0x55, 0x0b, 0x1d, 0x63, 0xfe, 0x3b, 0x32, 0x5a, 0x1c, 0x1b, 0xac, 0xd4, 0x31, 0xdc, 0xfa, 0x9e,
- 0x76, 0x89, 0xdc, 0x4d, 0x38, 0xa0, 0x3c, 0xb0, 0xd9, 0xc2, 0x48, 0x3c, 0xd4, 0xb3, 0xd5, 0xbf,
- 0x93, 0xc1, 0x37, 0x2c, 0x4b, 0xbe, 0xd0, 0xa2, 0xd5, 0xb2, 0x6d, 0xaf, 0xd5, 0x68, 0x9b, 0x9e,
- 0xdb, 0xea, 0x98, 0x3d, 0x25, 0x43, 0xda, 0xb6, 0xb7, 0x67, 0xd8, 0x0d, 0x09, 0x17, 0x46, 0xb0,
- 0x65, 0xe5, 0x9c, 0x4d, 0x28, 0xf1, 0xe8, 0x27, 0x9d, 0x4f, 0xc2, 0xf1, 0xec, 0x4e, 0xf0, 0x7c,
- 0x75, 0x4a, 0x7f, 0x86, 0x8b, 0xbf, 0x96, 0xa6, 0xf2, 0xd9, 0xfb, 0x81, 0x69, 0xf7, 0xe4, 0x92,
- 0x76, 0x70, 0x49, 0xdf, 0xfe, 0xf8, 0xdd, 0x86, 0x7e, 0x9d, 0xcf, 0xba, 0xe3, 0x39, 0xed, 0xde,
- 0x73, 0xcb, 0x70, 0xf7, 0xa8, 0xe9, 0x85, 0xdd, 0xb0, 0x8e, 0xda, 0x0d, 0x53, 0x3b, 0x5f, 0x1d,
- 0x3c, 0xfd, 0xf2, 0x05, 0x9f, 0x2c, 0x7c, 0x03, 0xa4, 0x16, 0xf3, 0x35, 0x35, 0x73, 0xa0, 0x3d,
- 0x01, 0x46, 0xe7, 0x7c, 0x9c, 0x03, 0x07, 0x38, 0x75, 0x38, 0xc3, 0x76, 0x0c, 0xfb, 0xa9, 0x26,
- 0x8a, 0x72, 0x80, 0x2f, 0xc4, 0xf5, 0x67, 0xea, 0x07, 0x5d, 0x8b, 0xfe, 0xd5, 0x49, 0xfb, 0x57,
- 0x67, 0xc1, 0xbf, 0x3a, 0x8a, 0x7f, 0x1d, 0xa9, 0x57, 0x31, 0xd4, 0x10, 0xed, 0x34, 0x53, 0x1d,
- 0x00, 0x86, 0xa0, 0xa7, 0x35, 0x0b, 0x4e, 0xed, 0x34, 0x8b, 0x26, 0x44, 0x99, 0xe5, 0xc8, 0xfd,
- 0xb8, 0xd3, 0xf4, 0x6a, 0xfb, 0xb6, 0xe3, 0xca, 0xfd, 0xb8, 0xd3, 0x14, 0xe7, 0xf4, 0xea, 0x1f,
- 0xd2, 0x2d, 0x3f, 0xfc, 0x10, 0x87, 0xdb, 0x07, 0xa7, 0x6e, 0x52, 0x93, 0xd0, 0x6b, 0x1a, 0xad,
- 0xb6, 0x09, 0xa3, 0xe1, 0x16, 0x69, 0xba, 0x5e, 0xcd, 0x68, 0xc8, 0xb6, 0x8e, 0xf0, 0x3c, 0x02,
- 0x93, 0x3f, 0x66, 0xa9, 0x52, 0x22, 0x68, 0xab, 0xeb, 0xb8, 0xf6, 0x3e, 0xa2, 0x72, 0xb4, 0xff,
- 0x10, 0x0a, 0x1d, 0x3a, 0x9f, 0xd0, 0x8b, 0xfe, 0x9a, 0x18, 0x77, 0x8d, 0xaa, 0x1e, 0x53, 0xe9,
- 0xb3, 0x09, 0xdc, 0x7a, 0xc2, 0x26, 0xfa, 0x6d, 0x02, 0xb5, 0x91, 0xb0, 0xc9, 0xbe, 0x9b, 0xc0,
- 0x15, 0x12, 0x36, 0xec, 0x45, 0xf4, 0x2c, 0x81, 0x2a, 0xea, 0xef, 0xb1, 0xdb, 0x88, 0x72, 0x9e,
- 0xb7, 0xdc, 0xfa, 0x9e, 0x68, 0x86, 0x11, 0x9e, 0x51, 0x65, 0x69, 0xa6, 0xdb, 0x61, 0x02, 0x5d,
- 0x4a, 0x46, 0x95, 0x7d, 0x2b, 0x81, 0xdb, 0xa4, 0x4e, 0x9b, 0xd4, 0x48, 0x76, 0x41, 0x89, 0x60,
- 0x8b, 0xf6, 0x0c, 0x73, 0x89, 0x6f, 0xd5, 0xd4, 0x3f, 0xb2, 0xf9, 0xaa, 0x3f, 0x1a, 0xf3, 0xdb,
- 0x9e, 0xfc, 0x6f, 0x54, 0x81, 0x3f, 0xee, 0x35, 0xeb, 0x5e, 0xab, 0x5b, 0xef, 0x75, 0x2c, 0xc3,
- 0x6d, 0xc1, 0xae, 0x27, 0xbc, 0x0c, 0x10, 0xa6, 0x65, 0xda, 0x70, 0x42, 0xfd, 0xf3, 0x2c, 0xe6,
- 0x97, 0xc3, 0xfe, 0x50, 0xbc, 0x37, 0x44, 0x19, 0xb8, 0xe0, 0x35, 0xbb, 0xce, 0x57, 0x84, 0xfa,
- 0x65, 0xb2, 0xcb, 0x21, 0xe0, 0xbc, 0xea, 0x16, 0xbb, 0xa9, 0x00, 0xca, 0x1e, 0xa5, 0x96, 0xa5,
- 0x26, 0xae, 0xc0, 0xa4, 0xa6, 0x20, 0x36, 0x24, 0x05, 0x89, 0xf2, 0x44, 0x67, 0x06, 0x10, 0xa8,
- 0xe7, 0x1a, 0xc5, 0xa7, 0x20, 0x6d, 0x9b, 0x5d, 0x79, 0x52, 0xe4, 0x30, 0x5e, 0x1a, 0x78, 0x66,
- 0xc7, 0x72, 0x5f, 0xca, 0xe6, 0xb0, 0x82, 0xd8, 0xef, 0x3e, 0xed, 0xf6, 0x9e, 0x77, 0xe5, 0xee,
- 0x22, 0xd5, 0xe7, 0x36, 0x6f, 0xc1, 0x12, 0x27, 0xf3, 0x6a, 0x39, 0x9e, 0xd3, 0x36, 0x0e, 0x4c,
- 0x8d, 0xcd, 0x4d, 0x96, 0x9f, 0x8d, 0x45, 0x55, 0x28, 0x81, 0xbc, 0x4d, 0xa4, 0x6d, 0xea, 0xef,
- 0xb3, 0xfb, 0x04, 0x4e, 0x7a, 0xb4, 0x34, 0x3c, 0xec, 0x86, 0xe0, 0xc2, 0xda, 0x56, 0xf5, 0xf7,
- 0x73, 0x98, 0x7f, 0xc0, 0xde, 0x54, 0x94, 0x72, 0x73, 0xd3, 0x48, 0x86, 0x62, 0x56, 0xd1, 0x6b,
- 0x14, 0x40, 0x98, 0x74, 0x46, 0x18, 0xd4, 0x58, 0x62, 0x50, 0x51, 0xbb, 0x28, 0x48, 0x94, 0x94,
- 0x9b, 0x43, 0xf4, 0xf6, 0x31, 0x36, 0xe4, 0x36, 0x2c, 0x10, 0x86, 0xbd, 0xbb, 0x0f, 0xc2, 0xb4,
- 0x35, 0xb1, 0x04, 0x86, 0x58, 0x82, 0x75, 0x45, 0x45, 0xb7, 0x07, 0x9b, 0x4e, 0x17, 0x4c, 0x8d,
- 0x81, 0x2e, 0xf8, 0xb1, 0x14, 0x2d, 0x08, 0x7f, 0x50, 0x86, 0xc3, 0x9a, 0xb4, 0x48, 0x91, 0x02,
- 0x18, 0x1e, 0xe4, 0xdc, 0x41, 0xbb, 0x4e, 0xcb, 0x71, 0x61, 0x54, 0xa6, 0xdf, 0x61, 0x65, 0x42,
- 0xef, 0x77, 0x9d, 0x7d, 0x0b, 0x94, 0x34, 0x1b, 0x5e, 0xcf, 0x6e, 0x98, 0xb6, 0x56, 0x9a, 0xb3,
- 0x87, 0x6b, 0xec, 0x6a, 0x9b, 0x73, 0x13, 0x80, 0x12, 0x83, 0x4f, 0x59, 0x1c, 0xce, 0x55, 0x04,
- 0x18, 0x70, 0x7b, 0xce, 0x80, 0xbc, 0xbb, 0x2c, 0x66, 0x7d, 0xb9, 0xfa, 0x17, 0x19, 0x56, 0x16,
- 0xcb, 0xa3, 0x16, 0x97, 0x4a, 0x58, 0xd5, 0x5a, 0x75, 0xe1, 0x4f, 0x3c, 0x87, 0xc9, 0x24, 0x88,
- 0x08, 0x67, 0xdf, 0x42, 0x70, 0x46, 0xa1, 0x4f, 0xf9, 0x9a, 0xc8, 0x83, 0x09, 0xbd, 0xac, 0x3e,
- 0x73, 0x94, 0x69, 0x16, 0x51, 0xd8, 0xff, 0xcd, 0x0b, 0xed, 0x5b, 0x4b, 0x96, 0x7f, 0x6d, 0x6e,
- 0x40, 0xb9, 0xfc, 0xeb, 0xc2, 0x70, 0xad, 0xc4, 0x91, 0x36, 0xc4, 0x02, 0xb7, 0xc4, 0x02, 0x17,
- 0xaa, 0xff, 0x84, 0xee, 0xef, 0xc3, 0xe4, 0xb1, 0xcf, 0xa5, 0xba, 0x66, 0x67, 0x99, 0x6b, 0x76,
- 0x54, 0xd7, 0x4c, 0xc3, 0x60, 0x79, 0x64, 0xfc, 0x13, 0xac, 0xd1, 0x86, 0xed, 0xce, 0xa6, 0x66,
- 0xf6, 0x1c, 0xb2, 0xfb, 0x5c, 0x41, 0xe6, 0x85, 0x0f, 0x11, 0xf2, 0x79, 0xab, 0xdd, 0xa8, 0x1b,
- 0x76, 0x03, 0xca, 0x6a, 0xf2, 0x39, 0xc2, 0xe0, 0x61, 0x65, 0x7d, 0x0e, 0x7a, 0x60, 0xb4, 0xf7,
- 0x4d, 0x6d, 0x63, 0x4e, 0x79, 0x2e, 0x5a, 0x74, 0x8c, 0x04, 0xd0, 0xb2, 0x4d, 0xdb, 0x7c, 0xa6,
- 0x15, 0x15, 0x09, 0x8d, 0x7d, 0x8b, 0xe4, 0x32, 0x61, 0xa7, 0x8e, 0xb0, 0x53, 0xa9, 0xfa, 0x47,
- 0xe4, 0x24, 0x49, 0xb9, 0xac, 0xe4, 0x5e, 0x1c, 0xb0, 0xd9, 0x69, 0x4a, 0x2f, 0x91, 0xe5, 0x13,
- 0x07, 0x52, 0x9a, 0xdf, 0x6f, 0xb7, 0x65, 0xde, 0xe4, 0xf0, 0x39, 0x17, 0x51, 0xc4, 0x88, 0x5a,
- 0x3a, 0x27, 0x0a, 0xf2, 0x8e, 0xcc, 0xdf, 0xb2, 0x8c, 0x96, 0x12, 0xa8, 0x32, 0x5b, 0x9b, 0x47,
- 0xd4, 0x7b, 0x9d, 0x8e, 0xd1, 0x05, 0x3b, 0xe1, 0xe4, 0x25, 0xa2, 0xd9, 0x36, 0x76, 0x1d, 0x6d,
- 0xa3, 0xfa, 0x07, 0x39, 0xfc, 0x00, 0x2c, 0xa9, 0x84, 0xd5, 0x59, 0xa1, 0xa2, 0xbb, 0xc0, 0x84,
- 0x1b, 0xae, 0xf9, 0xa2, 0xe5, 0xb8, 0x8e, 0x7c, 0x57, 0xc1, 0x31, 0xa2, 0xcc, 0xc4, 0x58, 0xcf,
- 0x90, 0x2f, 0x73, 0xd4, 0x73, 0xb3, 0xb5, 0xbb, 0xe7, 0xaa, 0x41, 0x2d, 0xc3, 0x80, 0xe3, 0x21,
- 0x45, 0xf4, 0x9a, 0xc8, 0x09, 0x67, 0x2d, 0xdc, 0x31, 0x55, 0x54, 0x6d, 0x1f, 0xf2, 0x2c, 0x9c,
- 0x1c, 0xee, 0xb3, 0x3b, 0x02, 0x57, 0xdf, 0x33, 0x5a, 0xdd, 0x56, 0x77, 0x37, 0x25, 0x78, 0x8d,
- 0x92, 0x0c, 0x0e, 0xcc, 0xb3, 0x8c, 0x8a, 0x5e, 0x17, 0x65, 0x38, 0xa0, 0xdb, 0xbd, 0x9e, 0x25,
- 0x37, 0x8c, 0x5d, 0x65, 0xd1, 0x68, 0x12, 0x05, 0x15, 0xc5, 0x47, 0x33, 0x1b, 0x32, 0x97, 0xa1,
- 0xbf, 0xec, 0x4a, 0xdb, 0x43, 0x64, 0x88, 0xf6, 0xe2, 0xee, 0xbc, 0xe1, 0x4b, 0xe4, 0x04, 0x12,
- 0x81, 0x13, 0xd2, 0x36, 0x69, 0x41, 0x24, 0x9c, 0x6b, 0x2c, 0xdf, 0x2d, 0xee, 0x26, 0x8b, 0xbd,
- 0x5d, 0xfd, 0x5d, 0x72, 0x3c, 0xf1, 0xf7, 0x73, 0x53, 0x4b, 0x84, 0xda, 0x58, 0x42, 0x0c, 0x35,
- 0x79, 0x51, 0x1b, 0x09, 0xdd, 0xc3, 0x18, 0x93, 0xb5, 0xac, 0x95, 0xa8, 0xc9, 0x5f, 0x94, 0x8a,
- 0x45, 0x91, 0x70, 0xa3, 0x71, 0x60, 0xda, 0x6e, 0xcb, 0x31, 0xa5, 0xfb, 0x59, 0x8a, 0xfb, 0x55,
- 0x7f, 0x15, 0x9d, 0x46, 0xfe, 0x91, 0xe9, 0x94, 0x46, 0xf4, 0x8e, 0x30, 0xe5, 0xdd, 0x32, 0x18,
- 0xdc, 0xb9, 0x91, 0xc5, 0xbb, 0x0c, 0x37, 0x11, 0x9f, 0xad, 0xfe, 0x00, 0xe7, 0x8b, 0x77, 0xb2,
- 0x82, 0xd9, 0x92, 0xf9, 0x3e, 0xeb, 0xa5, 0xe7, 0x8b, 0x63, 0x4a, 0x28, 0x6e, 0x48, 0x42, 0x36,
- 0x07, 0x0b, 0xd9, 0x7f, 0x85, 0xdd, 0x5d, 0xf8, 0x73, 0xdb, 0x4b, 0xd4, 0x77, 0xea, 0xa9, 0x40,
- 0x11, 0x05, 0x90, 0x04, 0x63, 0xea, 0x43, 0xf9, 0x1c, 0x98, 0xe8, 0x7e, 0x67, 0xfe, 0x46, 0x56,
- 0x4a, 0x3c, 0x1d, 0xe0, 0xec, 0x66, 0x1d, 0xea, 0x6e, 0x6e, 0x19, 0x05, 0xc4, 0x3d, 0x36, 0x39,
- 0xc2, 0xd9, 0x34, 0x1a, 0xd4, 0x97, 0x5a, 0xb6, 0xfa, 0x6f, 0xb2, 0x68, 0xf7, 0xe4, 0x58, 0xb1,
- 0x98, 0x82, 0x3a, 0xe9, 0x14, 0x84, 0x11, 0xcc, 0x81, 0x58, 0x85, 0x52, 0x04, 0x67, 0x68, 0xc5,
- 0x3b, 0x6a, 0x04, 0x63, 0xbf, 0x22, 0xab, 0xa2, 0x44, 0x5c, 0x20, 0x4a, 0x54, 0x14, 0x9d, 0x79,
- 0x37, 0xcf, 0x93, 0xd9, 0x3a, 0xe9, 0xfc, 0x22, 0x92, 0xb6, 0x04, 0xdb, 0x86, 0x6b, 0xca, 0x64,
- 0xd4, 0x49, 0x62, 0xc2, 0xe6, 0x6f, 0xf7, 0xe7, 0x88, 0x6b, 0x20, 0xb9, 0x40, 0x49, 0x21, 0x05,
- 0xa5, 0x3c, 0x5f, 0x54, 0x35, 0xa5, 0x84, 0xc1, 0x15, 0x75, 0x34, 0xa6, 0xce, 0x5c, 0xe4, 0x12,
- 0xa3, 0xdb, 0x70, 0xb4, 0x52, 0xf5, 0x9f, 0x66, 0x96, 0x7c, 0xd1, 0x17, 0x2d, 0xf3, 0xe1, 0xe6,
- 0x9c, 0x0f, 0xd3, 0x6b, 0x6b, 0x01, 0x96, 0x1b, 0xb8, 0x58, 0xb0, 0x84, 0x01, 0x92, 0x82, 0xbc,
- 0x2b, 0xd1, 0x54, 0x9c, 0x26, 0x37, 0x2f, 0x44, 0x96, 0x21, 0x79, 0x11, 0x0a, 0x4d, 0xe9, 0x4e,
- 0x6b, 0xd5, 0xff, 0x44, 0x9b, 0x73, 0xfa, 0x7b, 0x7f, 0x71, 0xda, 0x83, 0x83, 0xb6, 0x53, 0x4f,
- 0x4e, 0x7f, 0xfc, 0xfa, 0xc8, 0x73, 0xf9, 0x6a, 0xba, 0x63, 0x79, 0xc6, 0xee, 0xae, 0x6d, 0xee,
- 0x1a, 0xfc, 0x8c, 0x4e, 0x07, 0x3e, 0x71, 0x19, 0x25, 0x27, 0xec, 0x6d, 0xa5, 0x5f, 0xe2, 0x4a,
- 0x32, 0x8c, 0xa2, 0xb5, 0x04, 0x80, 0x19, 0x70, 0x3d, 0xe1, 0x13, 0x87, 0x7d, 0xa7, 0xae, 0x6d,
- 0x08, 0x83, 0x0b, 0xa8, 0x38, 0xd2, 0xc8, 0x46, 0x6f, 0xc7, 0x22, 0x2f, 0x2a, 0x8a, 0x13, 0x35,
- 0x01, 0x44, 0x2e, 0x60, 0x89, 0x08, 0x84, 0x4b, 0x11, 0xa5, 0x04, 0x93, 0x3e, 0x2f, 0xc9, 0x1b,
- 0x1a, 0x62, 0x12, 0x5c, 0x17, 0x71, 0x7a, 0xea, 0x58, 0xcb, 0x4e, 0xe6, 0x3b, 0x4b, 0xff, 0xce,
- 0x83, 0x27, 0xbe, 0x59, 0x47, 0xc6, 0x26, 0x1c, 0xe7, 0x16, 0xde, 0xf2, 0x0a, 0x78, 0xa7, 0x67,
- 0x9b, 0x5a, 0xa6, 0xda, 0xa6, 0x70, 0x4c, 0xff, 0xed, 0x06, 0x92, 0x24, 0x34, 0x6e, 0xe2, 0xd5,
- 0x06, 0x45, 0x16, 0x79, 0xbf, 0xc4, 0x90, 0xb4, 0x3f, 0xcb, 0xa1, 0x6a, 0x2b, 0xbe, 0x6a, 0x96,
- 0x7e, 0x63, 0xb9, 0xea, 0x21, 0x1a, 0x72, 0x13, 0x6e, 0x7c, 0x0b, 0x18, 0xaf, 0xd3, 0x72, 0x1c,
- 0x59, 0x90, 0x72, 0x74, 0xd7, 0x7c, 0x41, 0x47, 0x4e, 0x47, 0xcb, 0x52, 0xd9, 0x3d, 0x8f, 0x40,
- 0xb6, 0x9c, 0xb8, 0x8e, 0x00, 0xd8, 0x74, 0x4f, 0x34, 0x4f, 0x5b, 0xfc, 0x22, 0x0a, 0x59, 0xd7,
- 0x54, 0xd6, 0x74, 0xd7, 0x74, 0x5d, 0x65, 0x4d, 0xa1, 0x90, 0x75, 0x43, 0xc6, 0x80, 0xe5, 0x52,
- 0x3f, 0xa0, 0x20, 0x83, 0x11, 0x46, 0x93, 0xf5, 0x20, 0x13, 0xf7, 0x4b, 0x12, 0x25, 0x1c, 0xd3,
- 0xc5, 0xea, 0x4d, 0x1c, 0xaf, 0x97, 0xe0, 0x70, 0x98, 0x2d, 0x95, 0x19, 0xd5, 0x90, 0xcc, 0xdb,
- 0x2a, 0x73, 0x1a, 0x87, 0xcc, 0x97, 0xf5, 0xdb, 0xc9, 0x4a, 0xa4, 0xfc, 0xeb, 0x27, 0xef, 0x72,
- 0xfa, 0xbd, 0x64, 0x2d, 0x54, 0x1c, 0xb2, 0x82, 0x03, 0xfe, 0x1e, 0xfd, 0xa1, 0x0b, 0xac, 0xb8,
- 0x52, 0x17, 0x32, 0xa8, 0x2d, 0xd8, 0xac, 0x2f, 0x5c, 0x5e, 0x01, 0x18, 0x76, 0x0f, 0xa9, 0xa6,
- 0xd2, 0x32, 0xa2, 0x58, 0x4a, 0x30, 0xed, 0xd6, 0x81, 0xd9, 0x35, 0x9d, 0xe4, 0x76, 0xc6, 0xae,
- 0x52, 0x2b, 0x69, 0x79, 0x85, 0x41, 0x16, 0x50, 0xbc, 0x6d, 0xeb, 0x68, 0x85, 0xea, 0xe7, 0xd8,
- 0x0f, 0x48, 0xee, 0xa1, 0xe3, 0xd5, 0x73, 0xb1, 0x83, 0xaa, 0xfd, 0x31, 0xd4, 0xf2, 0x99, 0xeb,
- 0x75, 0x5a, 0x5d, 0x4c, 0xe8, 0x19, 0x05, 0x66, 0xbc, 0x40, 0x58, 0x96, 0x62, 0xf0, 0xd9, 0x92,
- 0x0e, 0xc6, 0x0f, 0xf1, 0x30, 0x3c, 0x77, 0x11, 0x99, 0xfc, 0xb4, 0x6e, 0x63, 0x3b, 0xa5, 0xdb,
- 0xab, 0xef, 0x19, 0xdd, 0x5d, 0x53, 0xf6, 0xf2, 0x05, 0xc2, 0x7c, 0xb6, 0x6f, 0xb4, 0xe5, 0xfd,
- 0x34, 0x01, 0xed, 0x18, 0x0e, 0x6e, 0x5e, 0x69, 0x62, 0x3c, 0xd2, 0xe7, 0x6a, 0x0f, 0x7f, 0xf0,
- 0xf1, 0xd1, 0x28, 0x3e, 0x3e, 0x39, 0xfc, 0xe6, 0x20, 0x98, 0xf0, 0xff, 0x6c, 0x65, 0x10, 0x84,
- 0xc3, 0x8f, 0xf0, 0xff, 0x4d, 0xf9, 0x45, 0xfa, 0x7f, 0x53, 0x8e, 0x02, 0xf5, 0xbf, 0x61, 0xb1,
- 0x32, 0x87, 0xeb, 0x1c, 0xf1, 0xe9, 0xff, 0x09, 0x00, 0x00, 0xff, 0xff, 0x85, 0xd1, 0xb4, 0x8d,
- 0xac, 0x65, 0x00, 0x00,
+ // 8456 bytes of a gzipped FileDescriptorProto
+ 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xdc, 0x7d, 0x5b, 0x8c, 0x1b, 0x4b,
+ 0x76, 0x98, 0xf8, 0x98, 0x19, 0xb2, 0x38, 0x33, 0x6a, 0xb5, 0x5e, 0x94, 0x46, 0xba, 0x92, 0x78,
+ 0x75, 0x77, 0xef, 0x72, 0xbd, 0x2b, 0x5d, 0x5d, 0xad, 0x76, 0xbd, 0x0f, 0x47, 0x4d, 0xb2, 0x39,
+ 0xe4, 0x15, 0x1f, 0xad, 0xee, 0x9e, 0x91, 0xb4, 0x81, 0xd3, 0xe0, 0x90, 0xad, 0x19, 0xfa, 0xf2,
+ 0xb5, 0xdd, 0x3d, 0xa3, 0x91, 0x13, 0x07, 0x8a, 0x8d, 0x20, 0x40, 0x12, 0xdb, 0x09, 0xfc, 0xb1,
+ 0x40, 0xe0, 0x00, 0x31, 0xe2, 0x7c, 0x04, 0x01, 0xf2, 0x11, 0x20, 0x40, 0x80, 0xfc, 0x26, 0x40,
+ 0x02, 0xe4, 0x01, 0x18, 0x08, 0xfc, 0x63, 0xff, 0x39, 0x3f, 0x01, 0xfc, 0x9d, 0xc4, 0xd9, 0xac,
+ 0x82, 0x53, 0xe7, 0x54, 0x75, 0x35, 0x1f, 0x73, 0x67, 0x37, 0x77, 0xf3, 0x91, 0x2f, 0xb1, 0xcf,
+ 0xab, 0x4e, 0x9d, 0x3a, 0xe7, 0xd4, 0xa9, 0xd3, 0xd5, 0x23, 0x76, 0xe7, 0x64, 0x3a, 0x8a, 0x8e,
+ 0x7a, 0xde, 0x2c, 0x98, 0x46, 0xd3, 0xf0, 0xc1, 0x74, 0xe6, 0x4f, 0x5e, 0x8f, 0xa6, 0x6f, 0xbc,
+ 0x4f, 0x3e, 0xfd, 0x26, 0x07, 0xe9, 0x05, 0x05, 0x74, 0xf3, 0xd6, 0xe1, 0x74, 0x7a, 0x38, 0xf2,
+ 0x1f, 0xf4, 0x66, 0xc3, 0x07, 0xbd, 0xc9, 0x64, 0x1a, 0xf5, 0xa2, 0xe1, 0x74, 0x12, 0x22, 0xe9,
+ 0xcd, 0xbb, 0x49, 0x59, 0x6f, 0x7b, 0x93, 0x43, 0x6f, 0x3a, 0x53, 0x28, 0x4a, 0x7d, 0xc6, 0xa6,
+ 0xaf, 0x67, 0xde, 0x91, 0xdf, 0x1b, 0xf8, 0x81, 0x5e, 0x64, 0x1b, 0x27, 0x7e, 0x10, 0x0e, 0xa7,
+ 0x93, 0x62, 0xea, 0x6e, 0xea, 0xe3, 0x2d, 0x5b, 0x3c, 0xea, 0x5f, 0x63, 0xd9, 0xe8, 0xed, 0xcc,
+ 0x2f, 0xa6, 0xef, 0xa6, 0x3e, 0xde, 0x7e, 0x74, 0xf5, 0x9b, 0xaa, 0x5a, 0x20, 0x00, 0x90, 0x36,
+ 0x27, 0xd1, 0x35, 0x96, 0x39, 0x1d, 0x0e, 0x8a, 0x19, 0x2e, 0x00, 0x7e, 0x96, 0xfe, 0x59, 0x8a,
+ 0x5d, 0xc5, 0x51, 0x46, 0xa3, 0xa9, 0xe7, 0x8f, 0xfc, 0xb1, 0x18, 0xf0, 0x31, 0x89, 0x4d, 0x71,
+ 0xb1, 0x77, 0x17, 0xc4, 0x2a, 0x1c, 0xca, 0x08, 0xcf, 0xd9, 0x16, 0xe9, 0x75, 0x30, 0x8c, 0xc6,
+ 0xbd, 0x19, 0xd7, 0xaa, 0xf0, 0xe8, 0x6b, 0x67, 0xb1, 0x27, 0x18, 0x1a, 0x17, 0xec, 0xa4, 0x84,
+ 0x4a, 0x9e, 0x6d, 0x00, 0x99, 0x3f, 0x89, 0x4a, 0xdf, 0x61, 0xb7, 0xce, 0xe2, 0x05, 0x23, 0xe1,
+ 0xaf, 0xb0, 0x98, 0xbe, 0x9b, 0x01, 0x23, 0xd1, 0x63, 0xe9, 0x19, 0xcb, 0x4b, 0x4e, 0xfd, 0x57,
+ 0x58, 0x8e, 0x24, 0x86, 0xc5, 0xd4, 0xdd, 0xcc, 0xc7, 0x85, 0x47, 0xa5, 0xb3, 0xf4, 0x43, 0x83,
+ 0xd8, 0x92, 0xa7, 0xd4, 0x66, 0x97, 0x80, 0x24, 0x7c, 0x33, 0x8c, 0xfa, 0x47, 0x5e, 0x7f, 0x3a,
+ 0x79, 0x3d, 0x3c, 0xd4, 0xaf, 0xb0, 0xb5, 0xd7, 0xa3, 0xde, 0x61, 0x48, 0xcb, 0x83, 0x0f, 0x7a,
+ 0x89, 0x6d, 0x8d, 0x87, 0x61, 0xe8, 0x85, 0xfe, 0x64, 0xe0, 0x8d, 0xfc, 0x09, 0xb7, 0xc7, 0x96,
+ 0x5d, 0x00, 0xa0, 0xe3, 0x4f, 0x06, 0x2d, 0x7f, 0x52, 0xaa, 0xb0, 0x2d, 0xbe, 0x4e, 0xbd, 0x83,
+ 0x91, 0xef, 0x8d, 0xa7, 0x03, 0xfd, 0x06, 0xcb, 0xe1, 0xc3, 0x70, 0x20, 0x16, 0x9b, 0x3f, 0x37,
+ 0x07, 0xfa, 0x35, 0xb6, 0x8e, 0xe3, 0x91, 0x20, 0x7a, 0x2a, 0xfd, 0xa3, 0x34, 0xcb, 0x81, 0x90,
+ 0xd9, 0x34, 0x88, 0xf4, 0xeb, 0x6c, 0x03, 0xfe, 0xf5, 0x26, 0x53, 0x62, 0x5f, 0x87, 0xc7, 0xce,
+ 0x14, 0x10, 0x47, 0x6f, 0xbc, 0xde, 0x60, 0x10, 0x90, 0x7d, 0xd6, 0x8f, 0xde, 0x18, 0x83, 0x41,
+ 0xa0, 0xeb, 0x2c, 0x3b, 0xe9, 0x8d, 0x7d, 0xee, 0x19, 0x79, 0x9b, 0xff, 0x56, 0x86, 0xca, 0xaa,
+ 0x43, 0xc1, 0x44, 0xc3, 0xa8, 0x17, 0xf9, 0xc5, 0x35, 0x9c, 0x28, 0x7f, 0x00, 0x09, 0xfd, 0xe3,
+ 0x20, 0x28, 0xae, 0x73, 0x20, 0xff, 0xad, 0x7f, 0xc0, 0x58, 0x6f, 0x70, 0xe2, 0x07, 0xd1, 0x30,
+ 0xf4, 0x07, 0xc5, 0x0d, 0x8e, 0x51, 0x20, 0xfa, 0x2d, 0x96, 0x0f, 0x8f, 0x67, 0xa0, 0x9b, 0x3f,
+ 0x28, 0xe6, 0x38, 0x3a, 0x06, 0x80, 0xc4, 0x99, 0xef, 0x07, 0xc5, 0x3c, 0x4a, 0x84, 0xdf, 0xfa,
+ 0x6d, 0xc6, 0x40, 0xb2, 0x17, 0xce, 0x7c, 0x7f, 0x50, 0x64, 0xc8, 0x02, 0x10, 0x07, 0x00, 0xfa,
+ 0x0e, 0xcb, 0x8f, 0x7b, 0xa7, 0x84, 0x2d, 0x70, 0x6c, 0x6e, 0xdc, 0x3b, 0xe5, 0xc8, 0xd2, 0xbf,
+ 0x4c, 0xb1, 0xcb, 0xca, 0xb2, 0xbd, 0xf6, 0x7b, 0xd1, 0x71, 0xe0, 0x87, 0xfa, 0x1d, 0x56, 0x18,
+ 0xf4, 0xa2, 0xde, 0xac, 0x17, 0x1d, 0x09, 0x83, 0x67, 0x6d, 0x26, 0x40, 0x4d, 0x2e, 0x75, 0xe2,
+ 0x1d, 0x1c, 0xbf, 0x7e, 0xed, 0x07, 0x21, 0x99, 0x3d, 0x37, 0xa9, 0xe0, 0x33, 0xac, 0xd5, 0x04,
+ 0x97, 0x2e, 0xa4, 0xb8, 0xda, 0x98, 0xb8, 0xfc, 0x51, 0xbf, 0xc7, 0x36, 0x7b, 0xc7, 0xa7, 0xc3,
+ 0xd1, 0xb0, 0x17, 0xbc, 0x05, 0xc9, 0x68, 0xc6, 0x82, 0x84, 0x35, 0x07, 0x7a, 0x89, 0x6d, 0xf6,
+ 0x7b, 0xb3, 0xde, 0xc1, 0x70, 0x34, 0x8c, 0x86, 0x7e, 0x48, 0x26, 0x4d, 0xc0, 0x4a, 0x01, 0xbb,
+ 0x28, 0x56, 0xd6, 0x03, 0x5b, 0x1f, 0x87, 0xfa, 0x63, 0xb6, 0x1e, 0xf8, 0xbd, 0x90, 0x72, 0xc1,
+ 0xf6, 0xa3, 0x5b, 0x0b, 0xee, 0xcb, 0xa9, 0x91, 0xc6, 0x26, 0x5a, 0x48, 0x14, 0x03, 0x3f, 0xec,
+ 0x53, 0x48, 0x5e, 0x5d, 0xca, 0x63, 0x73, 0x92, 0xd2, 0xdf, 0x4e, 0xb1, 0x4d, 0x29, 0x06, 0x5c,
+ 0xf2, 0x67, 0x77, 0xa9, 0xd8, 0x7d, 0x32, 0x09, 0xf7, 0xd1, 0x59, 0x76, 0xdc, 0x0b, 0x3f, 0x27,
+ 0x6b, 0xf0, 0xdf, 0xe0, 0x08, 0xd2, 0x2d, 0xc8, 0x06, 0x31, 0xa0, 0xf4, 0x06, 0x63, 0x77, 0xdc,
+ 0x8b, 0xfa, 0x47, 0xfa, 0x83, 0x44, 0x5a, 0xda, 0x59, 0x98, 0x04, 0xa7, 0x52, 0x33, 0xd2, 0x2f,
+ 0x33, 0x36, 0x3d, 0x1d, 0x7b, 0xaf, 0x87, 0xfe, 0x68, 0x80, 0x69, 0xa1, 0xf0, 0xe8, 0xe6, 0x02,
+ 0x9b, 0x24, 0xb1, 0xf3, 0xd3, 0xd3, 0x71, 0x9d, 0x13, 0x97, 0xfe, 0x5b, 0x0a, 0x23, 0x53, 0x22,
+ 0xf5, 0x6f, 0x33, 0x40, 0x7b, 0xfd, 0x51, 0x2f, 0x0c, 0x49, 0x85, 0xe5, 0xb2, 0x38, 0x85, 0x9d,
+ 0x9b, 0x9e, 0x8e, 0xab, 0xf0, 0x4b, 0xff, 0x01, 0xcc, 0xe1, 0x00, 0xa5, 0xf0, 0xa9, 0x17, 0x1e,
+ 0x7d, 0xb0, 0x94, 0x51, 0x52, 0x35, 0x2e, 0xd8, 0xb9, 0xe9, 0xeb, 0x03, 0xae, 0x8a, 0xfe, 0x92,
+ 0xe9, 0xfe, 0xe9, 0xcc, 0x0f, 0x86, 0x90, 0x80, 0xfc, 0x80, 0xe4, 0xac, 0x71, 0x39, 0x5f, 0x5d,
+ 0x2a, 0x67, 0x91, 0xbc, 0x71, 0xc1, 0xbe, 0xa4, 0x42, 0xb9, 0xe4, 0xca, 0x06, 0x5b, 0xe3, 0xd8,
+ 0xd2, 0x1f, 0x6f, 0x63, 0x56, 0x4b, 0x28, 0x71, 0xf6, 0x2e, 0xa0, 0x52, 0x72, 0x93, 0x87, 0x64,
+ 0xf3, 0x1b, 0x2c, 0x77, 0xd4, 0x0b, 0x3d, 0xbe, 0xce, 0xe0, 0x6d, 0x39, 0x7b, 0xe3, 0xa8, 0x17,
+ 0xb6, 0x61, 0xa9, 0xaf, 0xb0, 0x2c, 0x78, 0x0e, 0x3a, 0x45, 0xe3, 0x82, 0xcd, 0x9f, 0xf4, 0x8f,
+ 0xd8, 0xd6, 0xec, 0xe8, 0x6d, 0x38, 0xec, 0xf7, 0x46, 0xdc, 0xe7, 0xd0, 0x3b, 0x1a, 0x17, 0xec,
+ 0x4d, 0x01, 0xb6, 0x80, 0xec, 0xab, 0x6c, 0x9b, 0xb2, 0xa4, 0x1f, 0xf5, 0x20, 0x42, 0xb9, 0x09,
+ 0xb2, 0xb0, 0x67, 0x70, 0x78, 0x9b, 0xc0, 0xfa, 0x0d, 0xb6, 0xe1, 0x47, 0x47, 0xde, 0x20, 0x8c,
+ 0x78, 0x42, 0xda, 0x6c, 0x5c, 0xb0, 0xd7, 0xfd, 0xe8, 0xa8, 0x16, 0x46, 0x02, 0x15, 0x06, 0x7d,
+ 0x9e, 0x91, 0x04, 0xca, 0x09, 0xfa, 0xfa, 0x0e, 0xcb, 0x01, 0x8a, 0x4f, 0x38, 0x47, 0x0a, 0x00,
+ 0xb1, 0x0b, 0x73, 0xda, 0x61, 0xb9, 0x93, 0x51, 0x6f, 0xe2, 0x9d, 0x0c, 0x07, 0x98, 0x92, 0x00,
+ 0x09, 0x90, 0xfd, 0xe1, 0x40, 0x22, 0x67, 0xfd, 0x19, 0x66, 0x25, 0x81, 0xb4, 0xfa, 0x33, 0x18,
+ 0x71, 0x38, 0xf3, 0x06, 0x61, 0x7f, 0x86, 0x39, 0x09, 0x46, 0x1c, 0xce, 0x6a, 0x61, 0x7f, 0xa6,
+ 0x5f, 0x67, 0xeb, 0xc3, 0x99, 0xe7, 0xf7, 0x27, 0xc5, 0x4d, 0xc2, 0xac, 0x0d, 0x67, 0x66, 0x7f,
+ 0x02, 0x02, 0x87, 0x33, 0x2c, 0x0e, 0x8a, 0x5b, 0x42, 0xe0, 0x70, 0x66, 0xf1, 0x32, 0x83, 0x23,
+ 0x4f, 0x1e, 0xf3, 0x39, 0x6c, 0xc7, 0xc8, 0x93, 0xc7, 0x34, 0x09, 0x8e, 0x84, 0xb9, 0x5f, 0x54,
+ 0x91, 0x34, 0xf9, 0xa8, 0x3f, 0xe3, 0x8c, 0x9a, 0x50, 0x25, 0xea, 0xcf, 0x80, 0x8f, 0x50, 0xc0,
+ 0x76, 0x49, 0x41, 0x11, 0xd7, 0xf1, 0x00, 0xb9, 0x74, 0x81, 0x3a, 0x1e, 0x08, 0x2e, 0x40, 0x01,
+ 0xd7, 0x65, 0x05, 0x05, 0x5c, 0x3b, 0x2c, 0x17, 0xf6, 0x23, 0x64, 0xbb, 0x22, 0x14, 0x01, 0x08,
+ 0x69, 0xc9, 0x91, 0xc0, 0x78, 0x55, 0x45, 0x02, 0xe7, 0x3d, 0x56, 0x18, 0xf6, 0xc7, 0x30, 0x09,
+ 0xbe, 0x14, 0xd7, 0x08, 0xcf, 0x10, 0xc8, 0x57, 0x23, 0x26, 0xe9, 0x4f, 0x07, 0x7e, 0xf1, 0x7a,
+ 0x92, 0xa4, 0x3a, 0x1d, 0xf8, 0x60, 0xdb, 0x5e, 0x30, 0xf3, 0xa6, 0xb3, 0x62, 0x51, 0xd8, 0xb6,
+ 0x17, 0xcc, 0xba, 0x7c, 0x3d, 0x00, 0x11, 0xce, 0x7a, 0xc5, 0x1b, 0x42, 0xe7, 0x5e, 0x30, 0x73,
+ 0x66, 0x3d, 0x81, 0x8a, 0x66, 0xbd, 0xe2, 0x4d, 0x05, 0xe5, 0xc6, 0xa8, 0xf0, 0xa8, 0x57, 0xdc,
+ 0x11, 0x7e, 0x03, 0x5c, 0x47, 0x31, 0xd7, 0x51, 0xaf, 0x78, 0x4b, 0x41, 0xb9, 0x47, 0x3d, 0x5a,
+ 0x8d, 0x27, 0xdc, 0x08, 0xb7, 0x09, 0x07, 0xab, 0xf1, 0x24, 0x5e, 0xaa, 0x27, 0xdc, 0x08, 0x1f,
+ 0xa8, 0x48, 0x61, 0x04, 0x40, 0xbe, 0x1e, 0xf5, 0x0e, 0xfc, 0x51, 0xf1, 0x8e, 0x9c, 0xe1, 0xec,
+ 0xe4, 0x49, 0x9d, 0xc3, 0xa4, 0x11, 0x9e, 0xa0, 0x9d, 0xee, 0x26, 0x8c, 0xf0, 0x24, 0x61, 0xa7,
+ 0x27, 0x68, 0xa7, 0x7b, 0x49, 0x12, 0x6e, 0xa7, 0xaf, 0xb0, 0x6d, 0x3e, 0xd0, 0x64, 0xe0, 0x45,
+ 0xbd, 0xe0, 0xd0, 0x8f, 0x8a, 0x25, 0xd2, 0x65, 0x13, 0xe0, 0x9d, 0x81, 0xcb, 0xa1, 0xfa, 0x5d,
+ 0x52, 0x68, 0x32, 0xf0, 0xc2, 0x70, 0x54, 0xfc, 0x90, 0x88, 0xf2, 0x48, 0xe4, 0x84, 0x23, 0x95,
+ 0x22, 0x1a, 0x8d, 0x8a, 0xf7, 0x93, 0x14, 0xee, 0x68, 0xa4, 0xdf, 0x61, 0x6c, 0x3c, 0x1b, 0x85,
+ 0x1e, 0xce, 0xe9, 0x23, 0xd2, 0x26, 0x0f, 0xb0, 0x16, 0x9f, 0xd2, 0x0d, 0xb6, 0xc1, 0x09, 0xa2,
+ 0x7e, 0xf1, 0x2b, 0x62, 0x01, 0x00, 0xe0, 0x72, 0x6b, 0x71, 0xd4, 0xc1, 0x34, 0x2c, 0x7e, 0x55,
+ 0xb8, 0x0c, 0x40, 0x2a, 0xd3, 0x10, 0x90, 0xb3, 0x83, 0x03, 0x6f, 0x18, 0x0e, 0x07, 0xc5, 0x8f,
+ 0x05, 0x72, 0x76, 0x70, 0xd0, 0x0c, 0x87, 0x03, 0xfd, 0x36, 0xcb, 0x47, 0xc7, 0x93, 0x89, 0x3f,
+ 0x82, 0x5d, 0xf8, 0x6b, 0x94, 0x31, 0x72, 0x08, 0x6a, 0x0e, 0xa4, 0xa5, 0xfd, 0xd3, 0xe8, 0x68,
+ 0x10, 0x14, 0xcb, 0xaa, 0xa5, 0x4d, 0x0e, 0xd3, 0x1f, 0xb2, 0xcb, 0xc9, 0xc4, 0x83, 0xb9, 0x6d,
+ 0xc8, 0x65, 0xa5, 0xec, 0x4b, 0x89, 0xec, 0xc3, 0xf3, 0x5c, 0x89, 0x6d, 0x52, 0x06, 0x42, 0xd2,
+ 0x5f, 0xe3, 0xc6, 0x48, 0xd9, 0x0c, 0xd3, 0x90, 0x4a, 0x13, 0x06, 0x7d, 0xa4, 0xf9, 0x5c, 0xa1,
+ 0x71, 0x82, 0x3e, 0xa7, 0xb9, 0xcf, 0xb6, 0x44, 0xda, 0x41, 0xa2, 0x31, 0x57, 0x2f, 0x65, 0x17,
+ 0x28, 0xf7, 0x08, 0x2a, 0x91, 0x11, 0x90, 0x2a, 0x10, 0x54, 0x94, 0x16, 0x12, 0x54, 0x52, 0xa9,
+ 0x50, 0xa5, 0x52, 0xb4, 0xa2, 0xf0, 0x40, 0xa2, 0xdf, 0x20, 0x22, 0x86, 0x31, 0xa2, 0xd2, 0x44,
+ 0x82, 0xe6, 0xaf, 0x2b, 0x34, 0x2e, 0xd1, 0x7c, 0xc4, 0x47, 0x7b, 0x12, 0xeb, 0xf4, 0x37, 0x52,
+ 0x34, 0xbf, 0x02, 0x05, 0x40, 0x82, 0x4c, 0x2a, 0xf5, 0x9b, 0x09, 0x32, 0xa1, 0xd5, 0xd7, 0x99,
+ 0xa6, 0x84, 0x03, 0x52, 0xfe, 0x56, 0x8a, 0x86, 0xdd, 0x8e, 0x83, 0x42, 0xc8, 0x14, 0xde, 0x80,
+ 0x94, 0x7f, 0x57, 0x50, 0x16, 0xc8, 0x27, 0x38, 0x19, 0x6c, 0x27, 0xc2, 0x2f, 0x90, 0xee, 0xb7,
+ 0x53, 0xb4, 0xa2, 0x9b, 0xc2, 0x3b, 0x12, 0x83, 0xa3, 0x87, 0x20, 0xe9, 0xef, 0x24, 0x06, 0x47,
+ 0x3f, 0x01, 0x62, 0xd8, 0x51, 0x4f, 0x7a, 0xa3, 0x63, 0xbf, 0xb2, 0x8e, 0x95, 0x4e, 0xc9, 0x63,
+ 0x37, 0x57, 0xef, 0xca, 0x50, 0xd2, 0x02, 0x06, 0x0f, 0x19, 0x54, 0x5c, 0x41, 0x91, 0xd1, 0xc0,
+ 0x63, 0x18, 0xf8, 0x88, 0xc2, 0x44, 0xf5, 0x67, 0x02, 0x56, 0xfa, 0x17, 0x59, 0x3c, 0x2a, 0xf6,
+ 0xfa, 0x70, 0x7e, 0xd4, 0x1f, 0x26, 0xf6, 0xec, 0xc5, 0xda, 0x10, 0xc9, 0xd4, 0x1a, 0xe9, 0x3b,
+ 0x6c, 0x7d, 0x7a, 0x1c, 0xcd, 0x8e, 0x23, 0xaa, 0x0d, 0x3f, 0x58, 0xc5, 0x83, 0x54, 0x10, 0x94,
+ 0xf8, 0x4b, 0xff, 0x01, 0x05, 0x65, 0x14, 0x8d, 0xf8, 0x96, 0x5e, 0x58, 0x72, 0x52, 0x24, 0x5e,
+ 0x41, 0x27, 0xc2, 0xd6, 0x8d, 0x46, 0xfa, 0x23, 0x96, 0x9d, 0x1d, 0x87, 0x47, 0x54, 0x11, 0xad,
+ 0x54, 0x15, 0x68, 0x78, 0xad, 0x70, 0x1c, 0x1e, 0xc1, 0x90, 0xb3, 0xe9, 0x8c, 0x8b, 0xa3, 0x0a,
+ 0x68, 0xe5, 0x90, 0x82, 0x8e, 0x27, 0x83, 0xe9, 0xac, 0x3d, 0x1b, 0x85, 0xfa, 0xb7, 0xd8, 0xda,
+ 0x61, 0x30, 0x3d, 0x9e, 0xf1, 0xc2, 0xa0, 0xf0, 0xe8, 0xf6, 0x2a, 0x5e, 0x4e, 0x04, 0x9b, 0x06,
+ 0xff, 0xa1, 0x7f, 0x9b, 0xad, 0x4f, 0xde, 0xf0, 0x69, 0x6e, 0x9c, 0x6d, 0x22, 0xa4, 0x02, 0xc6,
+ 0xc9, 0x1b, 0x98, 0xe2, 0x53, 0x96, 0x0f, 0xfd, 0x88, 0x2a, 0xb6, 0x1c, 0xe7, 0xbd, 0xb7, 0x8a,
+ 0x57, 0x12, 0x42, 0x7e, 0x0a, 0xfd, 0x08, 0x8b, 0xbf, 0xcf, 0xe6, 0x5c, 0x20, 0xcf, 0x85, 0xdc,
+ 0x5f, 0x25, 0x44, 0xa5, 0x85, 0x24, 0xae, 0x3e, 0x57, 0x72, 0x6c, 0x1d, 0xc9, 0x4a, 0x4f, 0xb1,
+ 0xdc, 0x4b, 0x2c, 0x2c, 0x3f, 0x73, 0x41, 0xf9, 0x95, 0xa2, 0x33, 0x17, 0x9d, 0x26, 0xe1, 0x50,
+ 0x15, 0x1f, 0x5e, 0xd7, 0xc7, 0xbd, 0x53, 0x38, 0xb7, 0x3e, 0xc4, 0xf3, 0xd4, 0xdc, 0xf2, 0x42,
+ 0xf1, 0x27, 0x5d, 0x82, 0x4e, 0xaf, 0xb4, 0xdc, 0xa5, 0x07, 0x78, 0x94, 0x51, 0x56, 0x15, 0x4a,
+ 0x7f, 0x3f, 0x3a, 0xf2, 0x03, 0xe9, 0xb1, 0x5b, 0x76, 0x0c, 0x28, 0x7d, 0x9a, 0x18, 0x42, 0x2c,
+ 0xe7, 0x17, 0x30, 0x7d, 0x83, 0x69, 0xf3, 0xeb, 0x08, 0x4a, 0xf1, 0x1f, 0xca, 0x91, 0x9a, 0x3f,
+ 0x37, 0x07, 0xa5, 0x72, 0xc2, 0x10, 0xb8, 0x7c, 0xfa, 0x55, 0xb9, 0xdc, 0x74, 0x9c, 0xe7, 0x8b,
+ 0x59, 0x6a, 0xb0, 0x2b, 0xcb, 0x96, 0x4b, 0x7f, 0x48, 0x55, 0x34, 0xa7, 0x3e, 0xfb, 0x7c, 0x41,
+ 0xe5, 0xf6, 0x73, 0x76, 0x7d, 0xc5, 0x9a, 0x2d, 0x84, 0x7c, 0x6a, 0x31, 0xe4, 0x61, 0xa1, 0x78,
+ 0xfd, 0x0b, 0x2b, 0xb2, 0x69, 0xf3, 0xdf, 0xa5, 0xdf, 0xcf, 0xa0, 0x79, 0x87, 0x93, 0x30, 0x0a,
+ 0x8e, 0x31, 0x17, 0xe8, 0x4a, 0x2e, 0xd8, 0xa2, 0x68, 0x6f, 0x30, 0x76, 0x38, 0x8d, 0xa6, 0x78,
+ 0x6a, 0xa5, 0x88, 0x5f, 0x3c, 0x44, 0x28, 0x52, 0xbc, 0x98, 0x1c, 0x76, 0x6b, 0x78, 0xe2, 0x47,
+ 0x5c, 0xdd, 0x65, 0xdb, 0x6f, 0x82, 0x61, 0xa4, 0xd4, 0xe3, 0x98, 0x03, 0xbe, 0x7e, 0xa6, 0xb4,
+ 0x24, 0x0b, 0x14, 0xef, 0x1c, 0x22, 0x8b, 0xf7, 0xa7, 0x6c, 0x03, 0xcd, 0x12, 0x52, 0x5e, 0xb8,
+ 0x7f, 0xa6, 0x38, 0xa2, 0x85, 0x18, 0xa7, 0x9f, 0xfa, 0x77, 0xd9, 0xda, 0xd8, 0x07, 0xd3, 0x61,
+ 0x7e, 0x28, 0x9d, 0xc9, 0xcf, 0x29, 0x21, 0x5e, 0xf9, 0x0f, 0xbd, 0x3b, 0x67, 0xfd, 0xf5, 0x15,
+ 0x0d, 0x2c, 0x55, 0xc4, 0x99, 0x21, 0xb7, 0x8e, 0x4b, 0x55, 0xfa, 0x36, 0x6e, 0x03, 0xcb, 0xed,
+ 0x7a, 0x46, 0xcf, 0xa7, 0xd4, 0x63, 0x1f, 0x9c, 0x6d, 0x42, 0xfd, 0x26, 0xcb, 0xc9, 0x15, 0xc0,
+ 0xfe, 0x85, 0x7c, 0xd6, 0x3f, 0x64, 0x5b, 0xc9, 0xa2, 0x25, 0xcd, 0x09, 0x36, 0xc7, 0x4a, 0xb5,
+ 0x52, 0x6a, 0xa1, 0x37, 0x2e, 0x31, 0xab, 0xfe, 0x49, 0xbc, 0x1a, 0xd8, 0x2b, 0xbb, 0xbe, 0x22,
+ 0xf1, 0x48, 0xf3, 0x97, 0x1e, 0x61, 0x4f, 0x71, 0xc1, 0xc8, 0x3c, 0x35, 0xc0, 0x0f, 0x65, 0x92,
+ 0xfc, 0xb9, 0x39, 0x28, 0xed, 0x63, 0x6b, 0x6f, 0x95, 0x55, 0x7f, 0xee, 0xa0, 0xf8, 0x93, 0x0c,
+ 0x76, 0x32, 0xb8, 0xbe, 0xe3, 0x29, 0x75, 0xd0, 0xa6, 0x9f, 0x0f, 0x7d, 0xb2, 0x14, 0x3d, 0xe9,
+ 0x77, 0x58, 0x01, 0x7f, 0xa9, 0x56, 0x62, 0x08, 0xe2, 0x45, 0x80, 0xba, 0x42, 0x99, 0x64, 0x57,
+ 0xee, 0x7b, 0x6c, 0xa3, 0x3f, 0x1d, 0x8f, 0x7b, 0x13, 0x3c, 0xdb, 0x6f, 0x2f, 0xc9, 0xf0, 0x62,
+ 0x7c, 0x8f, 0x08, 0x6d, 0xc1, 0xa1, 0xdf, 0x63, 0x9b, 0xc3, 0xc1, 0xc8, 0xf7, 0xa2, 0xe1, 0xd8,
+ 0x9f, 0x1e, 0x47, 0xd4, 0xff, 0x28, 0x00, 0xcc, 0x45, 0x10, 0x90, 0x1c, 0xf5, 0x82, 0x81, 0x24,
+ 0xc1, 0x26, 0x5b, 0x01, 0x60, 0x82, 0xe4, 0x26, 0xcb, 0xcd, 0x82, 0xe1, 0x34, 0x18, 0x46, 0x6f,
+ 0xa9, 0xd3, 0x26, 0x9f, 0xf5, 0x1d, 0x96, 0xc7, 0xf6, 0x15, 0xa8, 0x8e, 0x7d, 0xb6, 0x1c, 0x02,
+ 0x9a, 0xbc, 0xd9, 0x38, 0x3d, 0x8e, 0xf0, 0xd4, 0x8d, 0xad, 0xb6, 0x8d, 0xe9, 0x71, 0xc4, 0x8f,
+ 0xdb, 0x3b, 0x2c, 0x0f, 0x28, 0xdc, 0x2e, 0xb1, 0xd9, 0x06, 0xb4, 0xbb, 0x3c, 0xa3, 0xca, 0x7e,
+ 0x67, 0x41, 0xed, 0x77, 0xfe, 0x12, 0x5b, 0xe3, 0x1d, 0x18, 0x7e, 0x9e, 0x2d, 0x3c, 0xba, 0xb6,
+ 0xbc, 0x3f, 0x63, 0x23, 0x91, 0xfe, 0x94, 0x6d, 0x2a, 0x0b, 0x1e, 0x16, 0xb7, 0xb8, 0x83, 0xdd,
+ 0x3a, 0x2b, 0xd6, 0xec, 0x04, 0x47, 0xe9, 0xc7, 0x29, 0x2c, 0x7d, 0x0e, 0x8e, 0xfb, 0x9f, 0xfb,
+ 0x11, 0x2c, 0xee, 0x1b, 0x7f, 0x78, 0x78, 0x24, 0x76, 0x30, 0x7a, 0x82, 0x22, 0xeb, 0x0d, 0x6f,
+ 0x0c, 0xf1, 0x69, 0xe2, 0x36, 0x96, 0xe7, 0x10, 0x3e, 0xd1, 0x3b, 0xac, 0x80, 0x68, 0x9c, 0x2a,
+ 0xae, 0x2e, 0x72, 0xe0, 0x64, 0x3f, 0x51, 0x53, 0xd2, 0xf9, 0x82, 0xe0, 0x3f, 0x50, 0xf3, 0x08,
+ 0xb7, 0x1d, 0xf0, 0xbc, 0xef, 0xc7, 0x5e, 0x82, 0xa5, 0xd9, 0x62, 0x5e, 0x92, 0xc4, 0x8b, 0x6e,
+ 0xf2, 0x20, 0xd1, 0xe6, 0xdf, 0x59, 0xc1, 0xaa, 0x14, 0x75, 0xea, 0x96, 0x97, 0x49, 0x6c, 0x79,
+ 0x30, 0x1d, 0x34, 0xd8, 0xea, 0xe9, 0x20, 0xde, 0x16, 0x74, 0xa5, 0xdf, 0x4e, 0xb1, 0x6d, 0xde,
+ 0x11, 0xec, 0xc1, 0x33, 0xd4, 0x0b, 0x49, 0xb7, 0x4a, 0xcd, 0xb9, 0xd5, 0x75, 0xb6, 0x31, 0x9c,
+ 0xa8, 0xe6, 0x5e, 0x1f, 0x4e, 0xb8, 0xad, 0x15, 0x53, 0x66, 0xce, 0x67, 0x4a, 0x19, 0xd7, 0x59,
+ 0x35, 0xae, 0xc9, 0xbc, 0xa4, 0xcf, 0x70, 0x72, 0xb6, 0x3a, 0xbf, 0x2c, 0x3b, 0xa6, 0xe9, 0x15,
+ 0x01, 0x2a, 0x05, 0xcd, 0xb7, 0x4d, 0xcf, 0x88, 0xfb, 0x38, 0x97, 0x64, 0x13, 0xb9, 0x44, 0x46,
+ 0xc1, 0xda, 0x79, 0xa2, 0x40, 0x4c, 0x6f, 0x5d, 0x99, 0xde, 0x3f, 0xcc, 0x60, 0x11, 0xc3, 0x99,
+ 0x02, 0x7f, 0x3c, 0x3d, 0xf1, 0x57, 0xa7, 0x2e, 0x35, 0xf6, 0xd3, 0x73, 0xb1, 0xff, 0x7d, 0x39,
+ 0xf1, 0x0c, 0x9f, 0xf8, 0xfd, 0xe5, 0x99, 0x89, 0x86, 0x38, 0x6b, 0xee, 0xd9, 0xe4, 0xdc, 0xef,
+ 0xb1, 0xcd, 0xc1, 0x71, 0xd0, 0xa3, 0x42, 0xa8, 0x2f, 0xd2, 0x96, 0x80, 0x39, 0x7e, 0x1f, 0xb6,
+ 0x1e, 0x49, 0x32, 0x01, 0x1a, 0xcc, 0x5b, 0x92, 0xaf, 0x13, 0xfa, 0xfd, 0x85, 0xf4, 0xb7, 0xf1,
+ 0xc5, 0xe9, 0x2f, 0xb7, 0x98, 0xfe, 0xee, 0xb1, 0x4d, 0x5a, 0xc0, 0xfe, 0xf4, 0x78, 0x82, 0x99,
+ 0x2c, 0x6b, 0x17, 0x10, 0x56, 0x05, 0x10, 0xe4, 0x80, 0x83, 0xb7, 0x91, 0x4f, 0x04, 0x8c, 0x13,
+ 0xe4, 0x01, 0x82, 0x68, 0xb9, 0x66, 0x6f, 0xcf, 0xb1, 0x66, 0xa5, 0x3f, 0x49, 0xe3, 0x1e, 0x87,
+ 0xdb, 0xd9, 0x41, 0x6f, 0x32, 0x38, 0xef, 0x7b, 0x33, 0x85, 0x43, 0x09, 0x56, 0x9d, 0x65, 0x83,
+ 0x5e, 0xe4, 0xd3, 0xf2, 0xf1, 0xdf, 0x5c, 0xe1, 0xe3, 0x20, 0x8c, 0xbc, 0x70, 0xf8, 0xeb, 0x3e,
+ 0xb9, 0x5e, 0x9e, 0x43, 0x9c, 0xe1, 0xaf, 0xfb, 0xfa, 0x13, 0x96, 0x1d, 0x04, 0xd3, 0x19, 0xd5,
+ 0x48, 0x67, 0x0e, 0x04, 0x74, 0x70, 0x7e, 0x82, 0x7f, 0xf5, 0xcf, 0x58, 0x61, 0x10, 0xf6, 0x67,
+ 0xb0, 0xe4, 0xbd, 0xe0, 0xf3, 0x95, 0x4d, 0x64, 0x95, 0x3d, 0x26, 0x6f, 0x5c, 0xb0, 0x19, 0x3c,
+ 0xda, 0xfc, 0x49, 0xef, 0x2c, 0x2d, 0x96, 0x3e, 0x3e, 0x4b, 0xd8, 0xb9, 0x6a, 0xa5, 0xab, 0x58,
+ 0xf7, 0xcf, 0x4d, 0xa1, 0xf4, 0x3d, 0x2c, 0xa1, 0x96, 0xab, 0x06, 0xf6, 0x9a, 0x05, 0x7e, 0xdf,
+ 0x1b, 0xf9, 0x27, 0xbe, 0xa8, 0xdb, 0xf3, 0x00, 0x69, 0x01, 0xa0, 0x64, 0xb0, 0x9d, 0x33, 0x54,
+ 0x39, 0x4f, 0x81, 0x51, 0xfa, 0x57, 0x94, 0x74, 0x50, 0xc6, 0x39, 0x73, 0xba, 0x24, 0x5e, 0xcc,
+ 0xe9, 0x72, 0x0f, 0x4d, 0xab, 0x7b, 0xa8, 0x5a, 0x25, 0x65, 0x12, 0x55, 0x92, 0xfe, 0x1d, 0xb6,
+ 0x06, 0x9a, 0x8b, 0xb4, 0x5d, 0x3a, 0xcb, 0xd0, 0xf4, 0xda, 0x12, 0x19, 0x4a, 0xcf, 0x50, 0x73,
+ 0x3f, 0x08, 0xa6, 0x81, 0x37, 0x0e, 0x0f, 0x97, 0x9e, 0x0c, 0x74, 0x96, 0xe5, 0x6d, 0x42, 0xf2,
+ 0x42, 0xf8, 0x2d, 0xb3, 0x53, 0x46, 0xc9, 0x4e, 0xbf, 0x95, 0xc2, 0x85, 0x40, 0x69, 0x89, 0xa6,
+ 0xc6, 0x2a, 0xd1, 0x37, 0x58, 0xce, 0x3f, 0xc5, 0xfd, 0x89, 0xc4, 0x6f, 0xf8, 0xa7, 0x33, 0xde,
+ 0xa3, 0x9c, 0xb7, 0x7c, 0xe6, 0x8c, 0xd2, 0x4e, 0xdd, 0x02, 0x4e, 0x28, 0x04, 0x8f, 0x47, 0xd1,
+ 0x70, 0xd6, 0xe3, 0xef, 0xbb, 0x7e, 0x74, 0xec, 0x87, 0x91, 0xfe, 0x69, 0x22, 0x04, 0xef, 0x2c,
+ 0x1a, 0x49, 0x72, 0x28, 0x11, 0xb8, 0x7c, 0x2d, 0x74, 0x96, 0x3d, 0x98, 0x0e, 0xde, 0x8a, 0xd9,
+ 0xc3, 0xef, 0x52, 0x44, 0xce, 0xa9, 0x8c, 0x3b, 0x1b, 0xbd, 0xfd, 0x45, 0x8f, 0xfa, 0xbb, 0x29,
+ 0x7c, 0xc3, 0x3b, 0xf0, 0xc3, 0x3e, 0x77, 0x91, 0xd7, 0x01, 0xff, 0xcd, 0xc7, 0xcb, 0xdb, 0x1b,
+ 0xe3, 0xd7, 0x41, 0x0d, 0x50, 0xf8, 0x42, 0x4e, 0xbe, 0xe8, 0xcb, 0xdb, 0xeb, 0x47, 0x6f, 0x04,
+ 0x22, 0x24, 0x04, 0xbe, 0xe6, 0x5d, 0x0f, 0x11, 0x71, 0x9b, 0xb1, 0xd0, 0x0f, 0x86, 0xbd, 0x91,
+ 0x37, 0x39, 0x1e, 0x73, 0x0b, 0xe7, 0xed, 0x3c, 0x42, 0x3a, 0xc7, 0x63, 0xe0, 0x1b, 0xe0, 0xb0,
+ 0x3c, 0x57, 0xe4, 0xed, 0xf5, 0xc1, 0x0c, 0xf8, 0x4a, 0x7f, 0x94, 0x62, 0xd7, 0xe4, 0x06, 0x12,
+ 0x46, 0xbd, 0x28, 0x94, 0x2b, 0x70, 0xc6, 0x1b, 0x6c, 0xb5, 0xde, 0x4c, 0x9f, 0x51, 0x6f, 0x66,
+ 0xe6, 0xea, 0xcd, 0x55, 0x7b, 0xed, 0x5c, 0xdd, 0xbe, 0xb6, 0x50, 0xb7, 0xcb, 0xc4, 0xbe, 0x7e,
+ 0x9e, 0xc4, 0xfe, 0x6f, 0x33, 0x58, 0xe7, 0xc4, 0x93, 0xd2, 0xb7, 0x59, 0x7a, 0x38, 0xe0, 0x2f,
+ 0x5a, 0xb2, 0x76, 0x7a, 0x78, 0xe6, 0xeb, 0xf9, 0xf9, 0x4d, 0x31, 0x7d, 0x8e, 0x4d, 0x31, 0xb3,
+ 0x64, 0x53, 0x54, 0x77, 0xf4, 0xec, 0xdc, 0x8e, 0xfe, 0xe5, 0x9c, 0x17, 0xa4, 0xe3, 0x6d, 0xa8,
+ 0x8e, 0x17, 0x1b, 0x39, 0x97, 0x30, 0xf2, 0x97, 0xb8, 0xbd, 0xfe, 0x3f, 0x3a, 0x18, 0xfc, 0x71,
+ 0x0a, 0xd3, 0x7d, 0xef, 0xf0, 0x30, 0xf0, 0x0f, 0x7b, 0x91, 0xff, 0xff, 0x8d, 0x87, 0xfe, 0x35,
+ 0x76, 0x63, 0xf9, 0xc4, 0x20, 0x09, 0xcd, 0x2f, 0x54, 0xea, 0x8b, 0x16, 0x2a, 0x3d, 0xbf, 0x50,
+ 0xb7, 0x19, 0xe3, 0x43, 0x23, 0x9a, 0xaa, 0x0e, 0x80, 0x70, 0x74, 0xe9, 0xcf, 0x33, 0x98, 0xfa,
+ 0xd1, 0x78, 0x74, 0x89, 0xc2, 0x9b, 0x05, 0xd3, 0x99, 0x1f, 0xf0, 0x72, 0x53, 0x4d, 0x82, 0x8b,
+ 0x85, 0xc0, 0x22, 0x9b, 0x9a, 0x0d, 0xf7, 0xe7, 0x96, 0x1d, 0x7b, 0x53, 0x0f, 0xcf, 0x23, 0x45,
+ 0xe5, 0xe3, 0xaf, 0xae, 0x94, 0x67, 0xdd, 0x66, 0x85, 0x89, 0x7f, 0x1a, 0xa9, 0xf7, 0x34, 0x0a,
+ 0x8f, 0x1e, 0x9c, 0x47, 0xac, 0xc2, 0x06, 0xa5, 0x0f, 0x3c, 0xd2, 0xed, 0x8e, 0xdd, 0xf9, 0x2e,
+ 0xd5, 0xd7, 0xcf, 0x23, 0x6f, 0x49, 0xb3, 0xea, 0x7b, 0x2c, 0x33, 0x3d, 0x1d, 0xaf, 0xac, 0xc3,
+ 0x96, 0x08, 0x99, 0x9e, 0x8e, 0x1b, 0x17, 0x6c, 0xe0, 0x02, 0x8b, 0x2d, 0x29, 0xc0, 0xce, 0x65,
+ 0xb1, 0x33, 0x0b, 0x31, 0xf1, 0x12, 0xa3, 0x74, 0xc8, 0x3e, 0x3c, 0x87, 0xc5, 0x17, 0x02, 0x36,
+ 0xf5, 0x33, 0x07, 0xec, 0x67, 0xac, 0xf4, 0xc5, 0x6b, 0xa0, 0xdf, 0x67, 0xdb, 0xf1, 0xa3, 0x37,
+ 0x1c, 0xe0, 0x48, 0x5b, 0xf6, 0xa6, 0x5c, 0x99, 0xe6, 0x20, 0x2c, 0x39, 0xd8, 0x31, 0x5b, 0x6d,
+ 0xff, 0x9f, 0xa7, 0xab, 0xf5, 0xad, 0x55, 0x8e, 0x0f, 0xeb, 0x01, 0xbb, 0xe4, 0xf4, 0x74, 0xcc,
+ 0x35, 0xca, 0xe0, 0x3d, 0x98, 0xe9, 0xe9, 0x18, 0x74, 0xf9, 0xfb, 0xa9, 0x95, 0x16, 0x3c, 0xb3,
+ 0xfe, 0x5c, 0xf2, 0xa2, 0x27, 0x51, 0x44, 0x65, 0x92, 0x45, 0xd4, 0xd7, 0x59, 0xe2, 0x72, 0x87,
+ 0x47, 0xd5, 0x12, 0x68, 0xa2, 0xa9, 0x88, 0x1a, 0x54, 0x4e, 0xbf, 0x97, 0x66, 0xfa, 0x82, 0x4e,
+ 0xe1, 0x59, 0x39, 0x51, 0x5c, 0x10, 0x4b, 0x2b, 0x17, 0xc4, 0x3e, 0x62, 0xdb, 0x4a, 0x67, 0x11,
+ 0xf2, 0x57, 0x86, 0x27, 0x93, 0xad, 0xb8, 0xb5, 0x08, 0xb9, 0x5c, 0x25, 0xe3, 0x7d, 0x4b, 0x4a,
+ 0x8f, 0x92, 0xec, 0x05, 0x00, 0x95, 0xfb, 0x42, 0x6b, 0x89, 0xfb, 0x42, 0x77, 0x58, 0x61, 0xdc,
+ 0x3b, 0xf5, 0xfc, 0x49, 0x14, 0x0c, 0xfd, 0x90, 0xb6, 0x32, 0x36, 0xee, 0x9d, 0x9a, 0x08, 0xd1,
+ 0x77, 0xa1, 0xec, 0xe7, 0xe9, 0x07, 0xf0, 0x1b, 0x7c, 0x35, 0xcf, 0x13, 0x46, 0x90, 0xaf, 0x6c,
+ 0x85, 0xb5, 0xf4, 0xe3, 0x14, 0xf6, 0xcf, 0x91, 0x14, 0xf7, 0xfe, 0xb3, 0xf7, 0x7a, 0x70, 0x8d,
+ 0x13, 0x35, 0x93, 0x6e, 0xd9, 0x05, 0x84, 0x61, 0x2e, 0xbd, 0xc7, 0x36, 0x47, 0xd3, 0xe9, 0xe7,
+ 0xc7, 0x33, 0x25, 0x9b, 0x66, 0xed, 0x02, 0xc2, 0x90, 0xe4, 0x43, 0xb6, 0xc5, 0x6d, 0xe7, 0x0f,
+ 0x88, 0x26, 0x4b, 0xed, 0x59, 0x04, 0x62, 0xd2, 0xfd, 0x04, 0x0b, 0x2d, 0x79, 0x05, 0x2c, 0xde,
+ 0xc6, 0x56, 0xdd, 0xcb, 0x2a, 0xfd, 0x29, 0xd5, 0x31, 0x31, 0xcf, 0xea, 0x3b, 0x5c, 0xb7, 0x19,
+ 0x0b, 0x4e, 0xa9, 0x01, 0x12, 0x8a, 0x1d, 0x21, 0x38, 0xb5, 0x10, 0x00, 0xe8, 0x28, 0x46, 0xe3,
+ 0x1c, 0xf2, 0x91, 0x44, 0xdf, 0x60, 0xb9, 0xe0, 0xd4, 0x83, 0x0d, 0x24, 0x24, 0xe5, 0x37, 0x82,
+ 0xd3, 0x0a, 0x3c, 0x72, 0xeb, 0x09, 0x14, 0x6e, 0x7b, 0x1b, 0x11, 0xa1, 0x70, 0x4c, 0x38, 0xd5,
+ 0xcd, 0xfc, 0x01, 0x5f, 0x55, 0x3e, 0x66, 0x0d, 0x01, 0x34, 0xa6, 0x40, 0x6f, 0x88, 0x31, 0x05,
+ 0x7a, 0x87, 0xe5, 0x83, 0x53, 0x3c, 0x7e, 0x84, 0x54, 0xaa, 0xe4, 0x82, 0x53, 0x93, 0x3f, 0x03,
+ 0x32, 0x92, 0x48, 0xac, 0x54, 0x72, 0x91, 0x40, 0xde, 0x65, 0x9b, 0xc1, 0xa9, 0xf7, 0x3a, 0xe8,
+ 0x8d, 0x7d, 0x20, 0xa1, 0x42, 0x85, 0x05, 0xa7, 0x75, 0x00, 0x99, 0xfc, 0xd6, 0x62, 0x21, 0x38,
+ 0xf5, 0xa6, 0x27, 0x7e, 0xc0, 0x09, 0x0a, 0x42, 0xb5, 0xee, 0x89, 0x1f, 0x00, 0xfe, 0x16, 0xd7,
+ 0xbc, 0x1f, 0xf4, 0x39, 0x7a, 0x53, 0x0c, 0x5e, 0x0d, 0xfa, 0xc8, 0xcd, 0xfa, 0xd3, 0xd1, 0x68,
+ 0x18, 0x52, 0xdd, 0x42, 0x7b, 0xbd, 0x80, 0x2c, 0x54, 0x88, 0xdb, 0xe7, 0xa8, 0x10, 0x2f, 0x2e,
+ 0x56, 0x88, 0xa5, 0xc7, 0xd8, 0xb1, 0xc7, 0x0e, 0xdf, 0x42, 0x69, 0xb3, 0xea, 0x5d, 0xd7, 0x3e,
+ 0xc6, 0x3d, 0x36, 0xf5, 0xd0, 0xe1, 0xfc, 0xe0, 0xff, 0xbe, 0x68, 0x28, 0xfd, 0x38, 0x8d, 0xa1,
+ 0xa3, 0xa8, 0x73, 0x86, 0x1a, 0x7c, 0xf9, 0xfc, 0xd7, 0x89, 0xb8, 0xc9, 0x05, 0xfe, 0x6b, 0x19,
+ 0x34, 0x09, 0x6d, 0x32, 0x5f, 0xa4, 0x4d, 0x76, 0xbe, 0x84, 0xf9, 0xb2, 0x5a, 0x53, 0x15, 0xb6,
+ 0x49, 0x96, 0xe2, 0x33, 0xa2, 0xdc, 0x72, 0x67, 0x45, 0xaf, 0x54, 0x98, 0xd3, 0x2e, 0xe0, 0xb3,
+ 0x03, 0x3c, 0x70, 0x6c, 0xdb, 0x8e, 0x2d, 0xc3, 0x0f, 0x6f, 0x5f, 0x74, 0x85, 0xf1, 0xcc, 0x4e,
+ 0x6e, 0x7a, 0x65, 0x27, 0x37, 0x73, 0xce, 0x4e, 0xee, 0x1f, 0xa6, 0xd4, 0xb5, 0x82, 0xbc, 0xfa,
+ 0x56, 0xff, 0x55, 0xba, 0x1a, 0x8a, 0xaf, 0x2f, 0x57, 0xa9, 0x04, 0x24, 0x95, 0x5f, 0xfa, 0xcd,
+ 0xff, 0xfe, 0x1f, 0x6f, 0xaf, 0x23, 0x3d, 0xfc, 0xbc, 0xa5, 0xdf, 0x54, 0xa8, 0xbf, 0x91, 0xa4,
+ 0xc6, 0xeb, 0xa4, 0xfa, 0x23, 0xbc, 0x32, 0x2c, 0x0a, 0xba, 0x5b, 0x2b, 0xe4, 0x73, 0x1a, 0xbc,
+ 0x50, 0x1c, 0x96, 0xfe, 0x56, 0x0a, 0x7d, 0x15, 0x51, 0x72, 0x8f, 0xba, 0xc2, 0xd6, 0xf8, 0x4d,
+ 0x43, 0xf1, 0x5e, 0x96, 0x3f, 0x2c, 0xdc, 0xa3, 0x4d, 0x2f, 0xde, 0xa3, 0x05, 0xa7, 0x81, 0x8d,
+ 0x84, 0xcb, 0x13, 0x9b, 0x74, 0x7e, 0xdc, 0x3b, 0xe5, 0xc5, 0x7b, 0xa8, 0x17, 0x93, 0x2d, 0xfe,
+ 0xad, 0x78, 0xe3, 0xff, 0x8e, 0xda, 0x38, 0x5a, 0xec, 0x36, 0x9c, 0xf1, 0x52, 0xeb, 0xd7, 0xf0,
+ 0x75, 0xb1, 0xd2, 0x94, 0xc1, 0xd0, 0x28, 0xb3, 0x4b, 0xe4, 0xe2, 0x1c, 0xa8, 0x46, 0xdd, 0x45,
+ 0x44, 0x54, 0x7a, 0x13, 0xcc, 0xfd, 0xfa, 0x57, 0xd8, 0x45, 0xee, 0xeb, 0x0a, 0x25, 0x86, 0xdf,
+ 0x16, 0x80, 0x25, 0x5d, 0xe9, 0x0f, 0x28, 0x04, 0x71, 0x30, 0x19, 0x82, 0x2b, 0x54, 0x9b, 0x2b,
+ 0xf3, 0xd3, 0x73, 0x65, 0x3e, 0x8c, 0x1a, 0x37, 0xc4, 0xd5, 0x38, 0xdc, 0x42, 0x70, 0x73, 0x82,
+ 0x74, 0x25, 0xc6, 0xd5, 0x88, 0xa9, 0x30, 0x18, 0x0b, 0x00, 0x14, 0x34, 0x5f, 0x56, 0x38, 0x3e,
+ 0x65, 0x2c, 0xb6, 0x21, 0x05, 0xe3, 0xbd, 0xb3, 0x3a, 0x60, 0xe8, 0x4f, 0x79, 0xf8, 0x8d, 0xc1,
+ 0xf8, 0x1b, 0xd8, 0x54, 0x47, 0x92, 0x33, 0xef, 0xed, 0xab, 0x96, 0x4b, 0xaf, 0xe8, 0xc1, 0x65,
+ 0x7e, 0xd6, 0x1e, 0xdc, 0x3f, 0x27, 0x97, 0x46, 0x02, 0xe9, 0xd2, 0x74, 0x6b, 0x1d, 0xdf, 0x58,
+ 0xa7, 0xe4, 0xad, 0xf5, 0x36, 0x7f, 0x65, 0x7a, 0x9b, 0x26, 0x8d, 0x4e, 0x4f, 0xeb, 0x04, 0x10,
+ 0x77, 0xa9, 0xe3, 0x67, 0x96, 0x38, 0x3e, 0xc9, 0x17, 0x8d, 0x43, 0x21, 0x1f, 0x5c, 0x47, 0x22,
+ 0xfb, 0xd3, 0xd1, 0x34, 0xa0, 0x95, 0x01, 0x64, 0x15, 0x9e, 0x41, 0x61, 0xc5, 0xa7, 0x30, 0x55,
+ 0x1c, 0xca, 0x3a, 0x2d, 0xb5, 0xe2, 0x02, 0x8d, 0x6a, 0xde, 0xca, 0x43, 0xc8, 0x11, 0x39, 0xc1,
+ 0x03, 0x0f, 0x1f, 0xe8, 0xb7, 0xe6, 0x13, 0x86, 0xca, 0x21, 0x0b, 0xbf, 0x2f, 0x4c, 0x1a, 0x8a,
+ 0xa7, 0x8b, 0xa4, 0x71, 0xc2, 0xee, 0xf1, 0xbe, 0x64, 0xa2, 0x23, 0x29, 0x23, 0xf6, 0x68, 0xf9,
+ 0x95, 0xaa, 0xd4, 0x17, 0x54, 0xda, 0x73, 0xed, 0xca, 0x65, 0x0d, 0xd1, 0x11, 0xee, 0xc6, 0x89,
+ 0x71, 0x7f, 0x71, 0xa3, 0x99, 0xd8, 0xf8, 0xfc, 0xd1, 0xb1, 0x7f, 0x4c, 0x27, 0x09, 0x1a, 0x8b,
+ 0xb7, 0x8d, 0xb0, 0xb2, 0x15, 0x8e, 0x24, 0x4f, 0xe6, 0x1a, 0xcb, 0xc4, 0x57, 0x78, 0xe0, 0x67,
+ 0x29, 0x40, 0xa5, 0x15, 0x31, 0xe3, 0xe1, 0xc4, 0xe3, 0xaf, 0x1e, 0xaa, 0xac, 0xa0, 0xc8, 0xa5,
+ 0x95, 0x5e, 0xf4, 0xf4, 0x05, 0x0d, 0xb0, 0x9e, 0xa6, 0xab, 0x6b, 0x4b, 0xde, 0x69, 0x2c, 0x1b,
+ 0xb3, 0x77, 0xfa, 0x0b, 0x1e, 0xf3, 0x1f, 0x50, 0x2b, 0x48, 0xe1, 0x4c, 0x58, 0xff, 0x4b, 0x19,
+ 0xf8, 0x3c, 0xc7, 0xb7, 0x65, 0x6b, 0xf9, 0x37, 0x53, 0x98, 0x93, 0x28, 0xdb, 0xf2, 0x41, 0xc0,
+ 0x1f, 0x70, 0xb4, 0x38, 0x6f, 0xf3, 0x67, 0x3c, 0x88, 0x29, 0x8d, 0x29, 0xbc, 0xa1, 0x55, 0x49,
+ 0x9c, 0x80, 0x56, 0xbd, 0x1a, 0x58, 0xa1, 0x3f, 0x1d, 0x7e, 0x1e, 0xe1, 0xfd, 0x0b, 0x24, 0x3a,
+ 0xe4, 0xd5, 0x0c, 0x44, 0xa1, 0xdc, 0xe5, 0x96, 0xdc, 0x0c, 0x2b, 0x1d, 0xe2, 0x89, 0x78, 0x09,
+ 0xcf, 0x6c, 0xf4, 0x76, 0xe9, 0x5d, 0xb2, 0x6f, 0xb1, 0x75, 0x4e, 0x2d, 0x3e, 0xc4, 0xb8, 0xbd,
+ 0xea, 0x35, 0x2c, 0xa7, 0xb2, 0x89, 0xb8, 0x64, 0x2e, 0x5c, 0xbb, 0x42, 0x3b, 0xad, 0x78, 0xd1,
+ 0x20, 0x6d, 0x97, 0x49, 0xd8, 0xae, 0xd4, 0x56, 0x9d, 0xef, 0x7c, 0xe7, 0xa8, 0x84, 0xb8, 0x74,
+ 0x52, 0xdc, 0x9f, 0x51, 0x76, 0x54, 0xe4, 0xfd, 0x3c, 0x72, 0x12, 0xa7, 0xa4, 0xcc, 0xc2, 0x29,
+ 0x49, 0x39, 0x7a, 0x65, 0xe7, 0x8f, 0x5e, 0x89, 0x93, 0xce, 0xda, 0xdc, 0x49, 0x67, 0x7e, 0xdb,
+ 0x5d, 0x3f, 0xc7, 0xb6, 0xbb, 0xb1, 0xe4, 0xa4, 0x31, 0x46, 0x07, 0x0d, 0xa6, 0x23, 0x5f, 0x9a,
+ 0xeb, 0x31, 0xcb, 0xc2, 0xf3, 0xca, 0x97, 0x9c, 0xfd, 0xe9, 0x24, 0x0a, 0xa6, 0xa3, 0x91, 0x1f,
+ 0x70, 0x3e, 0x9b, 0x53, 0xc3, 0x70, 0x87, 0xfe, 0xc4, 0xa7, 0x01, 0xc9, 0x10, 0x59, 0x7b, 0x33,
+ 0x06, 0x36, 0x07, 0xa5, 0xdf, 0xa1, 0x80, 0xe8, 0x85, 0x6f, 0x27, 0x7d, 0xb1, 0x49, 0xdf, 0x67,
+ 0xdb, 0x71, 0x39, 0xc2, 0xbb, 0xa8, 0xd4, 0xf6, 0x11, 0xd5, 0x08, 0xef, 0xa3, 0x7e, 0xcc, 0x34,
+ 0xe5, 0x2b, 0x29, 0x71, 0x8f, 0x07, 0xe8, 0xb6, 0x01, 0xee, 0x70, 0x30, 0xa7, 0x2c, 0xb3, 0x4b,
+ 0x89, 0xd7, 0xde, 0x9c, 0x14, 0x4b, 0xc2, 0x8b, 0x80, 0xb0, 0x11, 0xce, 0xef, 0x46, 0xbd, 0x62,
+ 0xdb, 0x7c, 0x2b, 0x6e, 0x4f, 0x07, 0x7b, 0xb3, 0x01, 0x64, 0x2a, 0x7c, 0x21, 0x80, 0xef, 0x5d,
+ 0xd2, 0x43, 0xfe, 0x55, 0x90, 0x7c, 0xc9, 0x47, 0xbb, 0xd5, 0xcd, 0xd5, 0xaf, 0x01, 0x6d, 0xac,
+ 0x2c, 0xda, 0xd3, 0x41, 0xc9, 0x62, 0x17, 0xb9, 0x68, 0x5e, 0x9d, 0xd8, 0x3c, 0x6a, 0x7e, 0xc0,
+ 0x0a, 0xca, 0xbe, 0xb6, 0xb2, 0x8f, 0xa6, 0xee, 0x7d, 0x6c, 0x2c, 0x65, 0x94, 0x5e, 0xb0, 0x8b,
+ 0xf5, 0xd1, 0xf4, 0x0d, 0xef, 0x84, 0xad, 0xd0, 0xf6, 0x31, 0xcb, 0x89, 0xcb, 0x48, 0xa4, 0xec,
+ 0x8d, 0x95, 0xb7, 0x95, 0xec, 0x0d, 0xf8, 0x05, 0xaa, 0x7a, 0xec, 0x0a, 0x08, 0xe6, 0xc5, 0xf2,
+ 0x59, 0xd2, 0xbf, 0xcd, 0xf2, 0xf2, 0x12, 0xcb, 0x4a, 0x5b, 0x48, 0x0a, 0x1b, 0x0f, 0x36, 0x30,
+ 0xc0, 0x77, 0xd9, 0x1a, 0x0c, 0x10, 0xea, 0x9f, 0xb0, 0xb5, 0x61, 0xe4, 0x8f, 0xc5, 0xdc, 0x77,
+ 0x96, 0x2b, 0x47, 0xdb, 0x3e, 0xa7, 0x2c, 0x7d, 0x9f, 0xad, 0x73, 0x3b, 0x86, 0x50, 0x34, 0xa8,
+ 0xcc, 0xab, 0x0c, 0xc7, 0x4b, 0x19, 0xc1, 0xfd, 0x94, 0x31, 0x39, 0xb5, 0x73, 0x48, 0x50, 0xce,
+ 0x4d, 0x42, 0xc2, 0x90, 0x15, 0x40, 0x42, 0xf5, 0xa8, 0x37, 0x39, 0xf4, 0x43, 0xfd, 0x6b, 0x6c,
+ 0x3d, 0x9a, 0x7a, 0xbd, 0x81, 0xb8, 0x0e, 0xaa, 0x27, 0x64, 0xf0, 0x59, 0xda, 0x6b, 0xd1, 0xd4,
+ 0x18, 0x0c, 0xf4, 0x07, 0x2c, 0x1f, 0x4d, 0xc9, 0x0d, 0xc9, 0x5c, 0xcb, 0xa8, 0x73, 0xd1, 0x14,
+ 0x5d, 0x12, 0x4a, 0x32, 0x4d, 0x6a, 0x2b, 0x06, 0xfc, 0xe6, 0xdc, 0x80, 0xd7, 0x17, 0x44, 0xe0,
+ 0xe4, 0xc4, 0xa8, 0x8f, 0x17, 0x47, 0x5d, 0xc9, 0x22, 0x87, 0x26, 0xae, 0x63, 0xbe, 0xee, 0xd4,
+ 0x43, 0x3f, 0x8b, 0x0b, 0x1d, 0xa4, 0xe4, 0xb0, 0x9c, 0x45, 0x41, 0xba, 0xcc, 0x59, 0x64, 0x58,
+ 0xaf, 0x74, 0x16, 0x49, 0x61, 0xe7, 0x44, 0xb4, 0x97, 0x5e, 0xb0, 0x3c, 0x0a, 0xed, 0x1e, 0x47,
+ 0x0b, 0x52, 0xbf, 0xcb, 0x58, 0x7c, 0x4b, 0x89, 0xc4, 0xee, 0xac, 0x12, 0x3b, 0x3d, 0x8e, 0x6c,
+ 0x52, 0xa2, 0x7b, 0x0c, 0x5b, 0x5a, 0x01, 0x8d, 0x6a, 0x9e, 0xf8, 0x93, 0x45, 0xd1, 0x7f, 0x89,
+ 0x15, 0x94, 0x0c, 0xb3, 0xb2, 0x32, 0x55, 0x68, 0x1a, 0x17, 0x6c, 0x16, 0x27, 0x9f, 0xca, 0x06,
+ 0x5b, 0xf3, 0x41, 0x72, 0xf9, 0xbf, 0xa4, 0x58, 0x41, 0x92, 0x4e, 0xa6, 0xba, 0xc6, 0x36, 0xbb,
+ 0x75, 0xcb, 0xf2, 0x9a, 0x9d, 0x7d, 0xa3, 0xd5, 0xac, 0x69, 0x17, 0x74, 0x8d, 0xe5, 0x38, 0xa4,
+ 0x6d, 0xbc, 0xd4, 0xde, 0xfd, 0xf4, 0xfd, 0xfb, 0x0d, 0xfd, 0x8a, 0xa4, 0xf1, 0xac, 0xae, 0xed,
+ 0x6a, 0xff, 0xe3, 0x3d, 0x40, 0x75, 0xc6, 0x38, 0xd4, 0x35, 0x2a, 0x2d, 0x53, 0xfb, 0x9f, 0x1c,
+ 0x76, 0x99, 0x15, 0x38, 0xac, 0xd3, 0xb5, 0xdb, 0x46, 0x4b, 0xfb, 0x8b, 0x04, 0x61, 0xbd, 0xd5,
+ 0xed, 0xd6, 0xb4, 0xff, 0xc5, 0x61, 0x62, 0x10, 0xa3, 0xd5, 0xd2, 0x7e, 0xc2, 0x21, 0xd7, 0xd9,
+ 0x45, 0x0e, 0xa9, 0x76, 0x3b, 0xae, 0xdd, 0x6d, 0xb5, 0x4c, 0x5b, 0xfb, 0xdf, 0x09, 0xf6, 0x56,
+ 0xb7, 0x6a, 0xb4, 0xb4, 0x9f, 0x26, 0xd9, 0x3b, 0xaf, 0xb4, 0xf7, 0x00, 0x29, 0xff, 0xbb, 0x35,
+ 0x7c, 0x4d, 0xcd, 0xf7, 0xe2, 0x6d, 0xce, 0xe2, 0x7a, 0x0d, 0xb3, 0xd5, 0xea, 0x6a, 0x17, 0xe4,
+ 0xb3, 0x69, 0xdb, 0x5d, 0x5b, 0x4b, 0xe9, 0x57, 0xd9, 0x25, 0x7c, 0xae, 0x36, 0xba, 0x9e, 0x6d,
+ 0x3e, 0xdf, 0x33, 0x1d, 0x57, 0x4b, 0xeb, 0x97, 0xb9, 0x0a, 0x12, 0x6c, 0xb5, 0x5e, 0x69, 0x99,
+ 0x98, 0xf6, 0xa5, 0x65, 0xda, 0xcd, 0xb6, 0xd9, 0x71, 0x4d, 0x5b, 0xcb, 0xea, 0x37, 0xd8, 0x55,
+ 0x0e, 0xae, 0x9b, 0x86, 0xbb, 0x67, 0x9b, 0x8e, 0x14, 0xb3, 0xa6, 0x5f, 0x67, 0x97, 0xe7, 0x51,
+ 0x20, 0x6a, 0x5d, 0xdf, 0x61, 0xd7, 0x39, 0x62, 0xd7, 0x74, 0x61, 0x9a, 0xf5, 0xe6, 0xae, 0xe4,
+ 0xda, 0x90, 0x02, 0x13, 0x48, 0xe0, 0xcb, 0x49, 0xbd, 0x1c, 0x89, 0xd2, 0xf2, 0xba, 0xce, 0xb6,
+ 0x39, 0xd0, 0x32, 0xaa, 0xcf, 0x4c, 0xd7, 0x6b, 0x76, 0x34, 0x26, 0x75, 0xad, 0xb7, 0xba, 0x2f,
+ 0x3c, 0xdb, 0x6c, 0x77, 0xf7, 0xcd, 0x9a, 0x56, 0xd0, 0xaf, 0x30, 0x0d, 0x49, 0xbb, 0xb6, 0xeb,
+ 0x39, 0xae, 0xe1, 0xee, 0x39, 0xda, 0xa6, 0x94, 0x4a, 0x02, 0xba, 0x7b, 0xae, 0xb6, 0xa5, 0x5f,
+ 0x62, 0x5b, 0xb1, 0x84, 0x76, 0xb7, 0xa6, 0x6d, 0xcb, 0x81, 0x76, 0xed, 0xee, 0x9e, 0xc5, 0x61,
+ 0x17, 0x25, 0x19, 0x97, 0x08, 0x20, 0x4d, 0x92, 0x71, 0x77, 0xe0, 0xb0, 0x4b, 0xfa, 0x4d, 0x76,
+ 0x8d, 0xc3, 0xda, 0x7b, 0x2d, 0xb7, 0x69, 0x19, 0xb6, 0x2b, 0xe7, 0xab, 0xeb, 0x45, 0x76, 0x65,
+ 0x01, 0x07, 0xd3, 0xbd, 0x2c, 0x31, 0x15, 0xc3, 0xb6, 0x9b, 0xa6, 0x2d, 0x79, 0xae, 0xe8, 0xd7,
+ 0x98, 0x3e, 0x87, 0x01, 0x8e, 0xab, 0xfa, 0x3d, 0x76, 0x9b, 0xc3, 0x9f, 0xef, 0x99, 0x7b, 0xe6,
+ 0x32, 0xf3, 0x5e, 0xd3, 0xef, 0xb0, 0x9d, 0x55, 0x24, 0x20, 0xe3, 0xba, 0xb4, 0x9d, 0xdd, 0x6d,
+ 0x99, 0x92, 0xaf, 0x28, 0xad, 0x44, 0x60, 0xa0, 0xbd, 0x21, 0xe7, 0x05, 0x62, 0x0c, 0xe7, 0x55,
+ 0xa7, 0x2a, 0x19, 0x6e, 0x4a, 0xed, 0x55, 0x1c, 0x70, 0xed, 0x48, 0x0b, 0x39, 0x02, 0xa3, 0xdd,
+ 0x92, 0xb0, 0xb6, 0xe9, 0x9a, 0x36, 0xb7, 0xda, 0xed, 0x72, 0x15, 0xef, 0x79, 0xcc, 0xfd, 0xa1,
+ 0x03, 0x22, 0x6d, 0xf0, 0xb5, 0x16, 0xb1, 0x8a, 0x83, 0x01, 0x6c, 0xdf, 0xb4, 0x9d, 0x66, 0xb7,
+ 0x53, 0x69, 0xba, 0x6d, 0xc3, 0xd2, 0x52, 0x65, 0x1f, 0xab, 0x19, 0xaa, 0x8c, 0xb1, 0xb9, 0x80,
+ 0x7e, 0x50, 0xf5, 0xea, 0xb6, 0xb1, 0x2b, 0x42, 0xf4, 0x02, 0xc9, 0x25, 0x68, 0xcd, 0xee, 0x5a,
+ 0x5a, 0x8a, 0x66, 0x4d, 0x30, 0xdb, 0x34, 0x9c, 0xb6, 0x96, 0x4e, 0x12, 0xb6, 0x0d, 0xe7, 0x99,
+ 0x96, 0x29, 0x3f, 0xc5, 0x61, 0xf0, 0x5d, 0x05, 0x15, 0x4d, 0xe4, 0x1c, 0x55, 0x45, 0x4f, 0x72,
+ 0xee, 0xaa, 0x57, 0x33, 0x2d, 0xdb, 0xac, 0x1a, 0xae, 0x59, 0x13, 0x12, 0x7e, 0x05, 0xbf, 0xb2,
+ 0xc6, 0xdb, 0xe8, 0xc4, 0xaa, 0x4e, 0x71, 0x9b, 0xe5, 0x11, 0x04, 0xf9, 0xe8, 0xa7, 0xa9, 0xf8,
+ 0x19, 0x52, 0xc7, 0xfb, 0x54, 0xf9, 0x5f, 0x53, 0xdd, 0x96, 0x68, 0x3d, 0x60, 0x56, 0x53, 0x35,
+ 0x90, 0x33, 0x02, 0xc7, 0x86, 0x18, 0x70, 0xb4, 0x94, 0x34, 0x08, 0xfa, 0x2c, 0x42, 0xd3, 0x92,
+ 0x54, 0x86, 0x8b, 0xa3, 0x65, 0x25, 0x29, 0x46, 0x01, 0x42, 0x73, 0xa4, 0x6f, 0xd5, 0x6b, 0x5a,
+ 0x64, 0xa5, 0xbb, 0x92, 0x10, 0x1d, 0x0d, 0x09, 0x9f, 0xea, 0xd7, 0xb8, 0x77, 0x91, 0xcc, 0x4a,
+ 0xab, 0x5b, 0x7d, 0x66, 0xd6, 0xb4, 0x77, 0xe9, 0xf2, 0x89, 0xf2, 0x91, 0x7d, 0xc2, 0x7c, 0x4b,
+ 0x94, 0x17, 0xec, 0xb5, 0xee, 0x8b, 0x8e, 0x96, 0x8a, 0xe9, 0x3a, 0x90, 0xac, 0xaa, 0xfb, 0x5a,
+ 0x56, 0x24, 0x73, 0x0e, 0xaa, 0xbf, 0xa8, 0x69, 0x77, 0x29, 0x62, 0x10, 0x12, 0x67, 0x8a, 0xa7,
+ 0xe5, 0xbf, 0x3c, 0xf7, 0x96, 0x46, 0x98, 0xde, 0x72, 0x16, 0x87, 0x75, 0xbc, 0x56, 0xb3, 0xf3,
+ 0x6c, 0x6e, 0x58, 0x47, 0xce, 0x22, 0x4d, 0xe9, 0x95, 0xd3, 0xed, 0x9b, 0x5a, 0xb6, 0xfc, 0xa7,
+ 0x69, 0xfc, 0xb4, 0x85, 0x4b, 0x97, 0xed, 0x26, 0x62, 0xac, 0x2b, 0x03, 0x48, 0xd0, 0x27, 0x0f,
+ 0xdb, 0x15, 0xaf, 0x51, 0x8b, 0xc5, 0x13, 0xa8, 0x5e, 0x93, 0x7e, 0xc7, 0x41, 0x44, 0x96, 0x9d,
+ 0x87, 0xd5, 0x6b, 0x5a, 0x4e, 0xcc, 0xbe, 0xee, 0x7d, 0xb2, 0xcb, 0xa9, 0xb4, 0x24, 0xa4, 0x0e,
+ 0xf6, 0x50, 0xc4, 0x23, 0xe8, 0xa9, 0xae, 0x0b, 0xd0, 0x63, 0x02, 0xbd, 0x03, 0xff, 0x8f, 0xc5,
+ 0x13, 0x30, 0xad, 0x5f, 0x92, 0xd2, 0x5c, 0x04, 0x81, 0xc1, 0x0b, 0x08, 0xea, 0xba, 0x0d, 0xd3,
+ 0xd6, 0xde, 0xe5, 0x62, 0xa2, 0x6a, 0xd7, 0xb2, 0x00, 0xa4, 0xc5, 0x44, 0xf5, 0x66, 0x05, 0x20,
+ 0x77, 0xe3, 0x21, 0x8d, 0x3d, 0xb7, 0xdb, 0x31, 0x77, 0xb5, 0x77, 0x4f, 0xf5, 0x4b, 0x82, 0xca,
+ 0x32, 0xf6, 0x1c, 0x53, 0x7b, 0xf7, 0x2e, 0xa5, 0x5f, 0xe3, 0xae, 0x24, 0x40, 0x90, 0x33, 0xda,
+ 0xda, 0xbb, 0x77, 0xe9, 0x72, 0x4d, 0x71, 0x1a, 0xba, 0x30, 0xbb, 0xc5, 0xa3, 0xc2, 0xb2, 0x3d,
+ 0xa3, 0x86, 0x7b, 0xf8, 0x26, 0x3e, 0xd6, 0xcc, 0x96, 0xe9, 0x9a, 0x5a, 0x2a, 0x86, 0xb4, 0xbb,
+ 0xb5, 0x66, 0xfd, 0x95, 0x96, 0x2e, 0x7f, 0x8a, 0x2e, 0x10, 0xff, 0xe1, 0x02, 0x32, 0x6a, 0x9b,
+ 0x3b, 0x7d, 0xa7, 0x66, 0xd8, 0x20, 0x09, 0x05, 0xb7, 0x5d, 0xaf, 0xfb, 0xb2, 0xad, 0xa5, 0xca,
+ 0x9f, 0xc7, 0x7f, 0x99, 0x80, 0xff, 0xa9, 0x01, 0x92, 0xfb, 0xb2, 0x5d, 0xf5, 0x3a, 0x2f, 0xdb,
+ 0xde, 0x43, 0x39, 0xb6, 0x80, 0x7c, 0xa2, 0xa5, 0xf4, 0x1d, 0x1e, 0xfd, 0x00, 0xe9, 0x5a, 0x66,
+ 0x87, 0x47, 0x60, 0xc5, 0x70, 0x9a, 0x55, 0x98, 0x8c, 0x7e, 0x83, 0xef, 0x96, 0x80, 0x4c, 0xec,
+ 0xb0, 0xef, 0xdf, 0x67, 0xca, 0x7f, 0x2f, 0xc7, 0x2e, 0x2f, 0xf9, 0xd8, 0x9f, 0x9c, 0xfa, 0x25,
+ 0x28, 0x55, 0xaf, 0xc8, 0xaa, 0xe4, 0x02, 0xa5, 0x65, 0x15, 0xde, 0x78, 0x85, 0xb8, 0x14, 0x6d,
+ 0xca, 0x02, 0xd7, 0x36, 0x5d, 0xa3, 0x66, 0xb8, 0x86, 0x96, 0x9e, 0x13, 0x66, 0xba, 0x0d, 0xaf,
+ 0xe6, 0xb8, 0x5a, 0x66, 0x09, 0xdc, 0xb1, 0xab, 0x5a, 0x76, 0x4e, 0x10, 0xc0, 0xdd, 0x57, 0x96,
+ 0x29, 0xb7, 0x7d, 0x81, 0xd8, 0x6f, 0x19, 0x1d, 0x6f, 0xbf, 0x59, 0xd3, 0xd6, 0x97, 0x21, 0xac,
+ 0xaa, 0xa5, 0x6d, 0xcc, 0xcf, 0xc3, 0xf2, 0x6a, 0x4e, 0xd5, 0xd2, 0x72, 0xb4, 0x15, 0x29, 0x70,
+ 0xb3, 0xda, 0xd1, 0xf2, 0x73, 0x72, 0x9a, 0x96, 0x67, 0xd9, 0x5d, 0xb7, 0xab, 0xb1, 0x05, 0xc4,
+ 0xfe, 0x63, 0xae, 0x6b, 0x61, 0x19, 0x02, 0x26, 0xb7, 0x39, 0x37, 0xb2, 0x5b, 0xb5, 0x38, 0xc3,
+ 0xd6, 0x12, 0x38, 0xd0, 0x6f, 0xcf, 0xc1, 0xf7, 0x6a, 0x48, 0x7f, 0x71, 0x09, 0x1c, 0xe8, 0xb5,
+ 0xb9, 0x81, 0x9d, 0xaa, 0x8b, 0x0c, 0x97, 0x96, 0x21, 0x6a, 0xbc, 0x1c, 0x98, 0x5b, 0xbb, 0x6a,
+ 0x1b, 0x94, 0xe5, 0x96, 0xbd, 0xbc, 0x1c, 0x57, 0xed, 0xd6, 0x4c, 0xed, 0xca, 0x9c, 0xad, 0x0c,
+ 0xdb, 0xf2, 0xba, 0x96, 0x76, 0x75, 0x4e, 0x31, 0x00, 0x3b, 0x96, 0xa1, 0x5d, 0x5b, 0x02, 0x77,
+ 0x2d, 0x43, 0xbb, 0xbe, 0x8c, 0xbe, 0x61, 0x68, 0xc5, 0x65, 0xf4, 0x0d, 0x43, 0xbb, 0xb1, 0x68,
+ 0xd9, 0x27, 0x7c, 0x82, 0x37, 0x97, 0x21, 0x60, 0x82, 0x3b, 0xf3, 0x93, 0x00, 0x44, 0xbd, 0x65,
+ 0x54, 0xcc, 0x96, 0x76, 0x6b, 0xd9, 0x04, 0x9f, 0xe0, 0xe4, 0x6f, 0x2f, 0xc7, 0xf1, 0xc9, 0x7f,
+ 0xa0, 0xdf, 0x66, 0x37, 0xe6, 0x65, 0x76, 0x6a, 0x9e, 0x6b, 0xd8, 0xbb, 0xa6, 0xab, 0xdd, 0x59,
+ 0x36, 0x64, 0xa7, 0xe6, 0x39, 0xad, 0x96, 0x76, 0x77, 0x05, 0xce, 0x6d, 0xb5, 0xb4, 0x7b, 0xb4,
+ 0x5b, 0xcb, 0x58, 0xb1, 0x5a, 0x8e, 0x87, 0x9a, 0x96, 0xe6, 0xec, 0xc1, 0x51, 0x6e, 0x55, 0xfb,
+ 0x70, 0x3e, 0xbc, 0x00, 0x5e, 0xe9, 0x3a, 0xda, 0xfd, 0x39, 0x84, 0x55, 0xa9, 0x78, 0x4d, 0xa7,
+ 0x59, 0xd3, 0x3e, 0xa2, 0xd2, 0x45, 0xba, 0xda, 0x5e, 0xa7, 0x63, 0xb6, 0xbc, 0x66, 0x4d, 0xfb,
+ 0xca, 0x32, 0xd5, 0xcc, 0x97, 0x6e, 0xa3, 0x66, 0x6b, 0x5f, 0x2d, 0x7f, 0x8a, 0xa7, 0x17, 0xfe,
+ 0x69, 0xfa, 0x70, 0xa0, 0x5f, 0xe4, 0x49, 0x73, 0xbf, 0x59, 0xf3, 0x3a, 0xdd, 0x8e, 0xc9, 0xb7,
+ 0xac, 0x6d, 0x02, 0x58, 0xb6, 0xe9, 0x98, 0x1d, 0x57, 0x7b, 0x77, 0xb7, 0xfc, 0xef, 0x53, 0xd8,
+ 0xc7, 0x1b, 0xce, 0x4e, 0x9e, 0xd0, 0xa7, 0xd4, 0xe2, 0xbe, 0x2b, 0x50, 0x37, 0xcd, 0xc6, 0xc2,
+ 0x9e, 0x04, 0x30, 0x10, 0xf9, 0x12, 0x72, 0x07, 0xee, 0x6f, 0x00, 0x32, 0x1d, 0x4b, 0x4b, 0xd3,
+ 0xa8, 0xf0, 0x6c, 0xec, 0xb9, 0x0d, 0x2d, 0xab, 0x00, 0x6a, 0x50, 0x04, 0xe6, 0x14, 0x00, 0x14,
+ 0x4b, 0x9a, 0xa6, 0x48, 0xb5, 0xbb, 0x7b, 0x90, 0xdf, 0xee, 0x2a, 0x52, 0x1b, 0x5d, 0x4b, 0x7b,
+ 0x4a, 0x3b, 0x07, 0x3c, 0xef, 0x75, 0x6c, 0xd3, 0x82, 0x6d, 0x48, 0x05, 0x39, 0xe6, 0x73, 0x28,
+ 0x18, 0x7e, 0x92, 0x4e, 0x7c, 0xcb, 0x4a, 0x7f, 0x5e, 0x0b, 0xc8, 0x0c, 0x5e, 0xc3, 0x5b, 0x7b,
+ 0x90, 0x09, 0x71, 0x99, 0x0c, 0x28, 0x72, 0xad, 0x57, 0x9e, 0xeb, 0xb6, 0x78, 0x79, 0x5f, 0xa0,
+ 0x68, 0x51, 0xe1, 0xcd, 0x8e, 0x4c, 0x07, 0x06, 0x96, 0xa6, 0xb8, 0xa8, 0x6e, 0x4b, 0x86, 0xb7,
+ 0xe1, 0x7a, 0x35, 0xb3, 0x1a, 0xc3, 0x35, 0x2a, 0x0c, 0x0c, 0xd7, 0xb3, 0xf6, 0x9c, 0x06, 0xcf,
+ 0x68, 0xda, 0x25, 0x32, 0x26, 0x00, 0xbb, 0x16, 0xc2, 0xf4, 0x39, 0x42, 0x90, 0xa0, 0x5d, 0x4e,
+ 0x12, 0x72, 0xd8, 0x95, 0x98, 0x10, 0x34, 0xe0, 0xa5, 0x93, 0x76, 0x95, 0xac, 0x68, 0xd0, 0xd1,
+ 0x43, 0xbb, 0x46, 0xb5, 0x15, 0x51, 0x75, 0x5e, 0x70, 0x6d, 0xae, 0xc7, 0x50, 0xd0, 0x92, 0xa0,
+ 0xc5, 0xa4, 0xc4, 0x7a, 0xd3, 0x6c, 0xd5, 0xb4, 0x1b, 0xca, 0xd0, 0xa0, 0x8f, 0x55, 0xa9, 0x68,
+ 0x37, 0x69, 0x69, 0x48, 0x1d, 0x00, 0xed, 0xe8, 0x45, 0x31, 0xef, 0x85, 0x2d, 0x69, 0x1f, 0x6f,
+ 0xc4, 0x28, 0x7d, 0x46, 0xfa, 0x46, 0x59, 0x54, 0xc7, 0xed, 0x56, 0xe2, 0x28, 0xcd, 0x08, 0x06,
+ 0xc5, 0xeb, 0x7f, 0x7d, 0x9f, 0xa1, 0x2d, 0x1d, 0x20, 0x9d, 0xae, 0x57, 0xd9, 0xab, 0xd7, 0x49,
+ 0xee, 0x7f, 0x16, 0x2e, 0xaa, 0x7c, 0x87, 0xc8, 0xd7, 0x96, 0x1c, 0x47, 0xad, 0x88, 0x71, 0xbe,
+ 0x4d, 0xd7, 0xdb, 0xed, 0xba, 0x5d, 0x3a, 0x7e, 0xa7, 0x28, 0x9e, 0x9a, 0xae, 0xf7, 0xc2, 0x6e,
+ 0xba, 0xa6, 0xba, 0xc3, 0x61, 0x08, 0x4a, 0x8c, 0x51, 0x75, 0x9b, 0xdd, 0x8e, 0xa3, 0x65, 0x62,
+ 0x84, 0x61, 0x59, 0xad, 0x57, 0x12, 0x91, 0x8d, 0x11, 0xd5, 0x96, 0x69, 0xd8, 0x12, 0xb1, 0x26,
+ 0xfc, 0x9a, 0xce, 0x2b, 0xda, 0x3a, 0x59, 0xaa, 0xb9, 0xc4, 0x52, 0x7f, 0x15, 0x27, 0x34, 0xff,
+ 0xfd, 0x21, 0x15, 0x14, 0xf5, 0x6a, 0xa2, 0x52, 0xa9, 0x57, 0x45, 0x5d, 0x22, 0x76, 0x6a, 0x09,
+ 0xf1, 0x1c, 0xd7, 0x6e, 0x56, 0xe1, 0x78, 0x2e, 0x49, 0xa9, 0xa8, 0xc9, 0xc4, 0xa4, 0x08, 0x11,
+ 0xa4, 0xd9, 0xf2, 0x3f, 0xa6, 0x37, 0x9e, 0x72, 0x74, 0x8c, 0x77, 0x34, 0x66, 0x5d, 0x2d, 0x41,
+ 0x49, 0x44, 0xdd, 0x73, 0xcc, 0x4e, 0x4d, 0x1e, 0x9c, 0x63, 0x35, 0xea, 0x5e, 0xb5, 0x61, 0x56,
+ 0x9f, 0x79, 0xdd, 0x7d, 0xd3, 0x6e, 0x19, 0x96, 0x2c, 0x18, 0xea, 0x75, 0x0f, 0x12, 0x0c, 0x44,
+ 0xd2, 0x5e, 0xc7, 0x8d, 0x8d, 0x56, 0xaf, 0xf3, 0x52, 0xfb, 0x99, 0x44, 0xe4, 0x12, 0x88, 0xca,
+ 0x2b, 0x89, 0xd0, 0xca, 0x0e, 0x1e, 0x7d, 0xf0, 0x4b, 0x71, 0x9c, 0xdd, 0xee, 0x42, 0x23, 0x66,
+ 0x57, 0x69, 0xc4, 0x08, 0x48, 0xdc, 0x35, 0x91, 0x10, 0xd9, 0x08, 0xf9, 0x0c, 0x5f, 0xd2, 0x2d,
+ 0x7c, 0xd1, 0x47, 0x86, 0xdf, 0x4d, 0x1a, 0x7e, 0x57, 0x31, 0xbc, 0x84, 0x90, 0x7d, 0xd3, 0x65,
+ 0x47, 0xbd, 0x43, 0xc2, 0xdd, 0x91, 0x84, 0xe0, 0xe9, 0x4b, 0x0a, 0x81, 0x20, 0x6b, 0x99, 0x55,
+ 0xc8, 0x95, 0x18, 0x06, 0xbb, 0xe0, 0xaf, 0xb5, 0xa6, 0x6d, 0xf2, 0x85, 0xdb, 0x44, 0x25, 0x5d,
+ 0xaf, 0x5e, 0xd7, 0x32, 0x65, 0x0b, 0x1d, 0x63, 0xfe, 0xbb, 0x37, 0x5a, 0x1c, 0x1b, 0xac, 0xd4,
+ 0x36, 0xdc, 0x6a, 0x43, 0xbb, 0x40, 0xee, 0x26, 0x1c, 0x50, 0x1e, 0xd8, 0x6c, 0x61, 0x24, 0x1e,
+ 0xea, 0xe9, 0xf2, 0xdf, 0x49, 0xe1, 0x0b, 0x96, 0x25, 0x5f, 0x94, 0xd1, 0x6a, 0xd9, 0xb6, 0xd7,
+ 0xac, 0xb5, 0x4c, 0xcf, 0x6d, 0xb6, 0xcd, 0xae, 0x92, 0x21, 0x6d, 0xdb, 0x6b, 0x18, 0x76, 0x4d,
+ 0xc2, 0x85, 0x11, 0x6c, 0x59, 0x39, 0xa7, 0x63, 0x4a, 0x3c, 0xfa, 0x49, 0xe7, 0x93, 0x70, 0x3c,
+ 0xbb, 0x13, 0x3c, 0x5b, 0x9e, 0xd0, 0x9f, 0x0d, 0xe3, 0xaf, 0xd1, 0xa9, 0x7c, 0xf6, 0x7e, 0x68,
+ 0xda, 0x5d, 0xb9, 0xa4, 0x6d, 0x5c, 0xd2, 0x77, 0x3f, 0x79, 0xbf, 0xa1, 0x5f, 0xe5, 0xb3, 0x6e,
+ 0x7b, 0x4e, 0xab, 0xfb, 0xc2, 0x32, 0xdc, 0x06, 0x35, 0xbd, 0xb0, 0x1b, 0xd6, 0x56, 0xbb, 0x61,
+ 0x6a, 0xe7, 0xab, 0x8d, 0xa7, 0x5f, 0xbe, 0xe0, 0xe3, 0x85, 0x6f, 0x96, 0xd4, 0x62, 0xbe, 0xa2,
+ 0x66, 0x0e, 0xb4, 0x27, 0xc0, 0xe8, 0x9c, 0x8f, 0x73, 0xe0, 0x00, 0xa7, 0x0a, 0x67, 0xd8, 0xb6,
+ 0x61, 0x3f, 0xd3, 0x44, 0x51, 0x0e, 0xf0, 0x85, 0xb8, 0xfe, 0x4c, 0xfd, 0x00, 0x6d, 0xd1, 0xbf,
+ 0xda, 0x49, 0xff, 0x6a, 0x2f, 0xf8, 0x57, 0x5b, 0xf1, 0xaf, 0x43, 0xf5, 0x35, 0xbf, 0x1a, 0xa2,
+ 0xed, 0x7a, 0xa2, 0x03, 0xc0, 0x10, 0xf4, 0xac, 0x62, 0xc1, 0xa9, 0x9d, 0x66, 0x51, 0x87, 0x28,
+ 0xb3, 0x1c, 0xb9, 0x1f, 0xb7, 0xeb, 0x5e, 0x65, 0xcf, 0x76, 0x5c, 0xb9, 0x1f, 0xb7, 0xeb, 0xe2,
+ 0x9c, 0x5e, 0xfe, 0x43, 0xba, 0x95, 0x88, 0x1f, 0x0e, 0x71, 0xfb, 0xe0, 0xd4, 0x4d, 0x6a, 0x12,
+ 0x7a, 0x75, 0xa3, 0xd9, 0x32, 0x61, 0x34, 0xdc, 0x22, 0x4d, 0xd7, 0xab, 0x18, 0x35, 0xd9, 0xd6,
+ 0x11, 0x9e, 0x47, 0x60, 0xf2, 0xc7, 0x34, 0x55, 0x4a, 0x04, 0x6d, 0x76, 0x1c, 0xd7, 0xde, 0x43,
+ 0x54, 0x86, 0xf6, 0x1f, 0x42, 0xa1, 0x43, 0x67, 0x63, 0x7a, 0xd1, 0x5f, 0x13, 0xe3, 0xae, 0x51,
+ 0xd5, 0x63, 0x2a, 0x7d, 0x36, 0x81, 0x5b, 0x8f, 0xd9, 0x44, 0xbf, 0x4d, 0xa0, 0x36, 0x62, 0x36,
+ 0xd9, 0x77, 0x13, 0xb8, 0x5c, 0xcc, 0x86, 0xbd, 0x88, 0xae, 0x25, 0x50, 0x79, 0xfd, 0x03, 0x76,
+ 0x13, 0x51, 0xce, 0x8b, 0xa6, 0x5b, 0x6d, 0x88, 0x66, 0x18, 0xe1, 0x19, 0x55, 0x96, 0x66, 0xb2,
+ 0x1d, 0x26, 0xd0, 0x85, 0x78, 0x54, 0xd9, 0xb7, 0x12, 0xb8, 0x4d, 0xea, 0xb4, 0x49, 0x8d, 0x64,
+ 0x17, 0x94, 0x08, 0xb6, 0x68, 0xcf, 0x30, 0x97, 0xf8, 0x56, 0x45, 0xfd, 0xa3, 0xa0, 0xaf, 0x7b,
+ 0xc3, 0x11, 0xbf, 0x9d, 0xca, 0xff, 0xa6, 0x16, 0xf8, 0x63, 0xa3, 0x5e, 0xf5, 0x9a, 0x9d, 0x6a,
+ 0xb7, 0x6d, 0x19, 0x6e, 0x13, 0x76, 0x3d, 0xe1, 0x65, 0x80, 0x30, 0x2d, 0xd3, 0x86, 0x13, 0xea,
+ 0x9f, 0xa7, 0x31, 0xbf, 0x1c, 0xf4, 0x06, 0xe2, 0xb5, 0x21, 0xca, 0xc0, 0x05, 0xaf, 0xd8, 0x55,
+ 0xbe, 0x22, 0xd4, 0x2f, 0x93, 0x5d, 0x0e, 0x01, 0xe7, 0x55, 0xb7, 0xd8, 0x4d, 0x05, 0x50, 0xf6,
+ 0x28, 0xb5, 0x34, 0x35, 0x71, 0x05, 0x26, 0x31, 0x05, 0xb1, 0x21, 0x29, 0x48, 0x94, 0x27, 0x3a,
+ 0x33, 0x80, 0x40, 0x3d, 0xd7, 0x28, 0x3e, 0x05, 0x69, 0xcb, 0xec, 0xc8, 0x93, 0x22, 0x87, 0xf1,
+ 0xd2, 0xc0, 0x33, 0xdb, 0x96, 0xfb, 0x4a, 0x36, 0x87, 0x15, 0xc4, 0x5e, 0xe7, 0x59, 0xa7, 0xfb,
+ 0xa2, 0x23, 0x77, 0x17, 0xa9, 0x3e, 0xb7, 0x79, 0x13, 0x96, 0x38, 0x9e, 0x57, 0xd3, 0xf1, 0x9c,
+ 0x96, 0xb1, 0x6f, 0x6a, 0x6c, 0x6e, 0xb2, 0xfc, 0x6c, 0x2c, 0xaa, 0x42, 0x09, 0xe4, 0x6d, 0x22,
+ 0x6d, 0x53, 0xbf, 0xcf, 0xee, 0x12, 0x38, 0xee, 0xd1, 0xd2, 0xf0, 0xb0, 0x1b, 0x82, 0x0b, 0x6b,
+ 0x5b, 0xe5, 0xdf, 0xcf, 0x60, 0xfe, 0x01, 0x7b, 0x53, 0x51, 0xca, 0xcd, 0x4d, 0x23, 0x19, 0x8a,
+ 0x59, 0x45, 0xaf, 0x51, 0x00, 0x61, 0xd2, 0x29, 0x61, 0x50, 0x63, 0x89, 0x41, 0x45, 0xed, 0xa2,
+ 0x20, 0x51, 0x52, 0x66, 0x0e, 0xd1, 0xdd, 0xc3, 0xd8, 0x90, 0xdb, 0xb0, 0x40, 0x18, 0xf6, 0xee,
+ 0x1e, 0x08, 0xd3, 0xd6, 0xc4, 0x12, 0x18, 0x62, 0x09, 0xd6, 0x15, 0x15, 0xdd, 0x2e, 0x6c, 0x3a,
+ 0x1d, 0x30, 0x35, 0x06, 0xba, 0xe0, 0xc7, 0x52, 0x34, 0x27, 0xfc, 0x41, 0x19, 0x0e, 0x6b, 0xd2,
+ 0x3c, 0x45, 0x0a, 0x60, 0x78, 0x90, 0x73, 0x07, 0xed, 0x38, 0x4d, 0xc7, 0x85, 0x51, 0x99, 0x7e,
+ 0x8b, 0x15, 0x09, 0xbd, 0xd7, 0x71, 0xf6, 0x2c, 0x50, 0xd2, 0xac, 0x79, 0x5d, 0xbb, 0x66, 0xda,
+ 0x5a, 0x61, 0xce, 0x1e, 0xae, 0xb1, 0xab, 0x6d, 0xce, 0x4d, 0x00, 0x4a, 0x0c, 0x3e, 0x65, 0x71,
+ 0x38, 0x57, 0x11, 0x60, 0xc0, 0xed, 0x39, 0x03, 0xf2, 0xee, 0xb2, 0x98, 0xf5, 0xc5, 0xf2, 0x5f,
+ 0xa4, 0x58, 0x51, 0x2c, 0x8f, 0x5a, 0x5c, 0x2a, 0x61, 0x55, 0x69, 0x56, 0x85, 0x3f, 0xf1, 0x1c,
+ 0x26, 0x93, 0x20, 0x22, 0x9c, 0x3d, 0x0b, 0xc1, 0x29, 0x85, 0x3e, 0xe1, 0x6b, 0x22, 0x0f, 0xc6,
+ 0xf4, 0xb2, 0xfa, 0xcc, 0x50, 0xa6, 0x59, 0x44, 0x61, 0xff, 0x37, 0x2b, 0xb4, 0x6f, 0x2e, 0x59,
+ 0xfe, 0xb5, 0xb9, 0x01, 0xe5, 0xf2, 0xaf, 0x0b, 0xc3, 0x35, 0x63, 0x47, 0xda, 0x10, 0x0b, 0xdc,
+ 0x14, 0x0b, 0x9c, 0x2b, 0xff, 0x13, 0xfa, 0xde, 0x00, 0x26, 0x8f, 0x7d, 0x2e, 0xd5, 0x35, 0xdb,
+ 0xcb, 0x5c, 0xb3, 0xad, 0xba, 0x66, 0x12, 0x06, 0xcb, 0x23, 0xe3, 0x9f, 0x60, 0xb5, 0x16, 0x6c,
+ 0x77, 0x36, 0x35, 0xb3, 0xe7, 0x90, 0x9d, 0x17, 0x0a, 0x32, 0x2b, 0x7c, 0x88, 0x90, 0x2f, 0x9a,
+ 0xad, 0x5a, 0xd5, 0xb0, 0x6b, 0x50, 0x56, 0x93, 0xcf, 0x11, 0x06, 0x0f, 0x2b, 0xeb, 0x73, 0xd0,
+ 0x7d, 0xa3, 0xb5, 0x67, 0x6a, 0x1b, 0x73, 0xca, 0x73, 0xd1, 0xa2, 0x63, 0x24, 0x80, 0x96, 0x6d,
+ 0xda, 0xe6, 0x73, 0x2d, 0xaf, 0x48, 0xa8, 0xed, 0x59, 0x24, 0x97, 0x09, 0x3b, 0xb5, 0x85, 0x9d,
+ 0x0a, 0xe5, 0x3f, 0x22, 0x27, 0x89, 0xcb, 0x65, 0x25, 0xf7, 0xe2, 0x80, 0xf5, 0x76, 0x5d, 0x7a,
+ 0x89, 0x2c, 0x9f, 0x38, 0x90, 0xd2, 0xfc, 0x5e, 0xab, 0x25, 0xf3, 0x26, 0x87, 0xcf, 0xb9, 0x88,
+ 0x22, 0x46, 0xd4, 0xd2, 0x19, 0x51, 0x90, 0xb7, 0x65, 0xfe, 0x96, 0x65, 0xb4, 0x94, 0x40, 0x95,
+ 0xd9, 0xda, 0x3c, 0xa2, 0xda, 0x6d, 0xb7, 0x8d, 0x0e, 0xd8, 0x09, 0x27, 0x2f, 0x11, 0xf5, 0x96,
+ 0xb1, 0xeb, 0x68, 0x1b, 0xe5, 0x3f, 0xc8, 0xe0, 0x07, 0x6b, 0x71, 0x25, 0xac, 0xce, 0x0a, 0x15,
+ 0xdd, 0x05, 0x26, 0xdc, 0x70, 0xcd, 0x97, 0x4d, 0xc7, 0x75, 0xe4, 0xbb, 0x0a, 0x8e, 0x11, 0x65,
+ 0x26, 0xc6, 0x7a, 0x8a, 0x7c, 0x99, 0xa3, 0x5e, 0x98, 0xcd, 0xdd, 0x86, 0xab, 0x06, 0xb5, 0x0c,
+ 0x03, 0x8e, 0x87, 0x14, 0xd1, 0xad, 0x23, 0x27, 0x9c, 0xb5, 0x70, 0xc7, 0x54, 0x51, 0x95, 0x3d,
+ 0xc8, 0xb3, 0x70, 0x72, 0xb8, 0xcb, 0x6e, 0x09, 0x5c, 0xb5, 0x61, 0x34, 0x3b, 0xcd, 0xce, 0x6e,
+ 0x42, 0xf0, 0x1a, 0x25, 0x19, 0x1c, 0x98, 0x67, 0x19, 0x15, 0xbd, 0x2e, 0xca, 0x70, 0x40, 0xb7,
+ 0xba, 0x5d, 0x4b, 0x6e, 0x18, 0xbb, 0xca, 0xa2, 0xd1, 0x24, 0x72, 0x2a, 0x8a, 0x8f, 0x66, 0xd6,
+ 0x64, 0x2e, 0x43, 0x7f, 0xd9, 0x95, 0xb6, 0x87, 0xc8, 0x10, 0xed, 0xc5, 0xdd, 0x79, 0xc3, 0x17,
+ 0xc8, 0x09, 0x24, 0x02, 0x27, 0xa4, 0x6d, 0xd2, 0x82, 0x48, 0x38, 0xd7, 0x58, 0xbe, 0x5b, 0xdc,
+ 0x8d, 0x17, 0x7b, 0xbb, 0xfc, 0xbb, 0xe4, 0x78, 0xe2, 0xef, 0xfd, 0x26, 0x96, 0x08, 0xb5, 0xb1,
+ 0x84, 0x18, 0x6a, 0xf2, 0xa2, 0x36, 0x12, 0xda, 0xc0, 0x18, 0x93, 0xb5, 0xac, 0x15, 0xab, 0xc9,
+ 0x5f, 0x94, 0x8a, 0x45, 0x91, 0x70, 0xa3, 0xb6, 0x6f, 0xda, 0x6e, 0xd3, 0x31, 0xa5, 0xfb, 0x59,
+ 0x8a, 0xfb, 0x95, 0x7f, 0x15, 0x9d, 0x46, 0xfe, 0x51, 0xec, 0x84, 0x46, 0xf4, 0x8e, 0x30, 0xe1,
+ 0xdd, 0x32, 0x18, 0xdc, 0xb9, 0x91, 0xc5, 0xbb, 0x0c, 0x37, 0x16, 0x9f, 0x2e, 0xff, 0x10, 0xe7,
+ 0x8b, 0x57, 0xb2, 0xa6, 0xb3, 0x25, 0xf3, 0x7d, 0xde, 0x4d, 0xce, 0x17, 0xc7, 0x94, 0x50, 0xdc,
+ 0x90, 0x84, 0x6c, 0x0e, 0x16, 0xb2, 0xff, 0x0a, 0xbb, 0xbd, 0xf0, 0xe7, 0xc1, 0x97, 0xa8, 0xef,
+ 0x54, 0x13, 0x81, 0x22, 0x0a, 0x20, 0x09, 0xc6, 0xd4, 0x87, 0xf2, 0x39, 0x30, 0xd6, 0xfd, 0xd6,
+ 0xfc, 0x85, 0xac, 0x84, 0x78, 0x3a, 0xc0, 0xd9, 0xf5, 0x2a, 0xd4, 0xdd, 0xdc, 0x32, 0x0a, 0x88,
+ 0x7b, 0x6c, 0x7c, 0x84, 0xb3, 0x69, 0x34, 0xa8, 0x2f, 0xb5, 0x74, 0xf9, 0xdf, 0xa4, 0xd1, 0xee,
+ 0xf1, 0xb1, 0x62, 0x31, 0x05, 0xb5, 0x93, 0x29, 0x08, 0x23, 0x98, 0x03, 0xb1, 0x0a, 0xa5, 0x08,
+ 0x4e, 0xd1, 0x8a, 0xb7, 0xd5, 0x08, 0xc6, 0x7e, 0x45, 0x5a, 0x45, 0x89, 0xb8, 0x40, 0x94, 0xa8,
+ 0x28, 0xda, 0xf3, 0x6e, 0x9e, 0x25, 0xb3, 0xb5, 0x93, 0xf9, 0x45, 0x24, 0x6d, 0x09, 0xb6, 0x0d,
+ 0xd7, 0x94, 0xc9, 0xa8, 0x1d, 0xc7, 0x84, 0xcd, 0xdf, 0xee, 0xcf, 0x11, 0x57, 0x40, 0x72, 0x8e,
+ 0x92, 0x42, 0x02, 0x4a, 0x79, 0x3e, 0xaf, 0x6a, 0x4a, 0x09, 0x83, 0x2b, 0xea, 0x68, 0x4c, 0x9d,
+ 0xb9, 0xc8, 0x25, 0x46, 0xa7, 0xe6, 0x68, 0x85, 0xf2, 0x3f, 0x4d, 0x2d, 0xf9, 0x02, 0x31, 0x5c,
+ 0xe6, 0xc3, 0xf5, 0x39, 0x1f, 0xa6, 0xd7, 0xd6, 0x02, 0x2c, 0x37, 0x70, 0xb1, 0x60, 0x31, 0x03,
+ 0x24, 0x05, 0x79, 0x57, 0xa2, 0xae, 0x38, 0x4d, 0x66, 0x5e, 0x88, 0x2c, 0x43, 0xb2, 0x22, 0x14,
+ 0xea, 0xd2, 0x9d, 0xd6, 0xca, 0xff, 0x89, 0x36, 0xe7, 0xe4, 0xdf, 0x27, 0x10, 0xa7, 0x3d, 0x38,
+ 0x68, 0x3b, 0xd5, 0xf8, 0xf4, 0xc7, 0xaf, 0x8f, 0xbc, 0x90, 0xaf, 0xa6, 0xdb, 0x96, 0x67, 0xec,
+ 0xee, 0xda, 0xe6, 0xae, 0xc1, 0xcf, 0xe8, 0x74, 0xe0, 0x13, 0x97, 0x51, 0x32, 0xc2, 0xde, 0x56,
+ 0xf2, 0x25, 0xae, 0x24, 0xc3, 0x28, 0x5a, 0x8b, 0x01, 0x98, 0x01, 0xd7, 0x63, 0x3e, 0x71, 0xd8,
+ 0x77, 0xaa, 0xda, 0x86, 0x30, 0xb8, 0x80, 0x8a, 0x23, 0x8d, 0x6c, 0xf4, 0xb6, 0x2d, 0xf2, 0xa2,
+ 0xbc, 0x38, 0x51, 0x13, 0x40, 0xe4, 0x02, 0x16, 0x8b, 0x40, 0xb8, 0x14, 0x51, 0x88, 0x31, 0xc9,
+ 0xf3, 0x92, 0xbc, 0xa1, 0x21, 0x26, 0xc1, 0x75, 0x11, 0xa7, 0xa7, 0xb6, 0xb5, 0xec, 0x64, 0xbe,
+ 0xb3, 0xf4, 0xef, 0x52, 0x78, 0xe2, 0x1b, 0x7b, 0x64, 0xac, 0xc3, 0x71, 0x6e, 0xe1, 0x2d, 0xaf,
+ 0x80, 0xb7, 0xbb, 0xb6, 0xa9, 0xa5, 0xca, 0x2d, 0x0a, 0xc7, 0xe4, 0xdf, 0x9a, 0x20, 0x49, 0x42,
+ 0xe3, 0x3a, 0x5e, 0x6d, 0x50, 0x64, 0x91, 0xf7, 0x4b, 0x0c, 0x49, 0xfb, 0xb3, 0x0c, 0xaa, 0xb6,
+ 0xe2, 0x2b, 0x6c, 0xe9, 0x37, 0x96, 0xab, 0x1e, 0xa2, 0x21, 0x37, 0xe1, 0xc6, 0xb7, 0x80, 0xf1,
+ 0xda, 0x4d, 0xc7, 0x91, 0x05, 0x29, 0x47, 0x77, 0xcc, 0x97, 0x74, 0xe4, 0x74, 0xb4, 0x34, 0x95,
+ 0xdd, 0xf3, 0x08, 0x64, 0xcb, 0x88, 0xeb, 0x08, 0x80, 0x4d, 0xf6, 0x44, 0xb3, 0xb4, 0xc5, 0x2f,
+ 0xa2, 0x90, 0x75, 0x4d, 0x65, 0x4d, 0x76, 0x4d, 0xd7, 0x55, 0xd6, 0x04, 0x0a, 0x59, 0x37, 0x64,
+ 0x0c, 0x58, 0x2e, 0xf5, 0x03, 0x72, 0x32, 0x18, 0x61, 0x34, 0x59, 0x0f, 0x32, 0x71, 0xbf, 0x24,
+ 0x56, 0xc2, 0x31, 0x5d, 0xac, 0xde, 0xc4, 0xf1, 0x7a, 0x09, 0x0e, 0x87, 0xd9, 0x52, 0x99, 0x51,
+ 0x0d, 0xc9, 0xbc, 0xad, 0x32, 0x27, 0x71, 0xc8, 0x7c, 0x51, 0xbf, 0x19, 0xaf, 0x44, 0xc2, 0xbf,
+ 0x7e, 0xfa, 0x3e, 0xa3, 0xdf, 0x89, 0xd7, 0x42, 0xc5, 0x21, 0x2b, 0x38, 0xe0, 0xef, 0xd1, 0x1f,
+ 0xe6, 0xc0, 0x8a, 0x2b, 0x71, 0x21, 0x83, 0xda, 0x82, 0xf5, 0xea, 0xc2, 0xe5, 0x15, 0x80, 0x61,
+ 0xf7, 0x90, 0x6a, 0x2a, 0x2d, 0x25, 0x8a, 0xa5, 0x18, 0xd3, 0x6a, 0xee, 0x9b, 0x1d, 0xd3, 0x89,
+ 0x6f, 0x67, 0xec, 0x2a, 0xb5, 0x92, 0x96, 0x55, 0x18, 0x64, 0x01, 0xc5, 0xdb, 0xb6, 0x8e, 0x96,
+ 0x2b, 0x7f, 0x8e, 0xfd, 0x80, 0xf8, 0x1a, 0x3a, 0xde, 0x3c, 0x17, 0x3b, 0xa8, 0xda, 0x1f, 0x43,
+ 0x2d, 0x9f, 0xbb, 0x5e, 0xbb, 0xd9, 0xc1, 0x84, 0x9e, 0x52, 0x60, 0xc6, 0x4b, 0x84, 0xa5, 0x29,
+ 0x06, 0x9f, 0x2f, 0xe9, 0x60, 0xfc, 0x08, 0x0f, 0xc3, 0x73, 0xf7, 0x90, 0xc9, 0x4f, 0xab, 0x36,
+ 0xb6, 0x53, 0x3a, 0xdd, 0x6a, 0xc3, 0xe8, 0xec, 0x9a, 0xb2, 0x97, 0x2f, 0x10, 0xe6, 0xf3, 0x3d,
+ 0xa3, 0x25, 0xef, 0xa7, 0x09, 0x68, 0xdb, 0x70, 0x70, 0xf3, 0x4a, 0x12, 0xe3, 0x91, 0x3e, 0x53,
+ 0x79, 0xf4, 0xc3, 0x87, 0x87, 0xc3, 0xe8, 0xe8, 0xf8, 0xe0, 0x9b, 0xfd, 0xe9, 0x98, 0xff, 0xe7,
+ 0x30, 0xfd, 0x69, 0x30, 0x78, 0x80, 0xff, 0xcf, 0xcb, 0x37, 0xe8, 0xff, 0x79, 0x39, 0x9c, 0xaa,
+ 0xff, 0x6d, 0x8c, 0x95, 0x3a, 0x58, 0xe7, 0x88, 0x4f, 0xff, 0x4f, 0x00, 0x00, 0x00, 0xff, 0xff,
+ 0x90, 0x3e, 0x10, 0x56, 0x5c, 0x66, 0x00, 0x00,
}
diff --git a/vendor/github.com/opencord/voltha-protos/go/openolt/openolt.pb.go b/vendor/github.com/opencord/voltha-protos/go/openolt/openolt.pb.go
index 727b8c7..929032c 100644
--- a/vendor/github.com/opencord/voltha-protos/go/openolt/openolt.pb.go
+++ b/vendor/github.com/opencord/voltha-protos/go/openolt/openolt.pb.go
@@ -7,6 +7,7 @@
context "context"
fmt "fmt"
proto "github.com/golang/protobuf/proto"
+ tech_profile "github.com/opencord/voltha-protos/go/tech_profile"
_ "google.golang.org/genproto/googleapis/api/annotations"
grpc "google.golang.org/grpc"
math "math"
@@ -23,151 +24,90 @@
// proto package needs to be updated.
const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
-type Direction int32
+// SchedulerConfig from public import voltha_protos/tech_profile.proto
+type SchedulerConfig = tech_profile.SchedulerConfig
-const (
- Direction_UPSTREAM Direction = 0
- Direction_DOWNSTREAM Direction = 1
- Direction_BIDIRECTIONAL Direction = 2
-)
+// TrafficShapingInfo from public import voltha_protos/tech_profile.proto
+type TrafficShapingInfo = tech_profile.TrafficShapingInfo
-var Direction_name = map[int32]string{
- 0: "UPSTREAM",
- 1: "DOWNSTREAM",
- 2: "BIDIRECTIONAL",
-}
+// TrafficScheduler from public import voltha_protos/tech_profile.proto
+type TrafficScheduler = tech_profile.TrafficScheduler
-var Direction_value = map[string]int32{
- "UPSTREAM": 0,
- "DOWNSTREAM": 1,
- "BIDIRECTIONAL": 2,
-}
+// TrafficSchedulers from public import voltha_protos/tech_profile.proto
+type TrafficSchedulers = tech_profile.TrafficSchedulers
-func (x Direction) String() string {
- return proto.EnumName(Direction_name, int32(x))
-}
+// TailDropDiscardConfig from public import voltha_protos/tech_profile.proto
+type TailDropDiscardConfig = tech_profile.TailDropDiscardConfig
-func (Direction) EnumDescriptor() ([]byte, []int) {
- return fileDescriptor_c072e7aa0dfd74d5, []int{0}
-}
+// RedDiscardConfig from public import voltha_protos/tech_profile.proto
+type RedDiscardConfig = tech_profile.RedDiscardConfig
-type SchedulingPolicy int32
+// WRedDiscardConfig from public import voltha_protos/tech_profile.proto
+type WRedDiscardConfig = tech_profile.WRedDiscardConfig
-const (
- SchedulingPolicy_WRR SchedulingPolicy = 0
- SchedulingPolicy_StrictPriority SchedulingPolicy = 1
- SchedulingPolicy_Hybrid SchedulingPolicy = 2
-)
+// DiscardConfig from public import voltha_protos/tech_profile.proto
+type DiscardConfig = tech_profile.DiscardConfig
+type DiscardConfig_TailDropDiscardConfig = tech_profile.DiscardConfig_TailDropDiscardConfig
+type DiscardConfig_RedDiscardConfig = tech_profile.DiscardConfig_RedDiscardConfig
+type DiscardConfig_WredDiscardConfig = tech_profile.DiscardConfig_WredDiscardConfig
-var SchedulingPolicy_name = map[int32]string{
- 0: "WRR",
- 1: "StrictPriority",
- 2: "Hybrid",
-}
+// TrafficQueue from public import voltha_protos/tech_profile.proto
+type TrafficQueue = tech_profile.TrafficQueue
-var SchedulingPolicy_value = map[string]int32{
- "WRR": 0,
- "StrictPriority": 1,
- "Hybrid": 2,
-}
+// TrafficQueues from public import voltha_protos/tech_profile.proto
+type TrafficQueues = tech_profile.TrafficQueues
-func (x SchedulingPolicy) String() string {
- return proto.EnumName(SchedulingPolicy_name, int32(x))
-}
+// Direction from public import voltha_protos/tech_profile.proto
+type Direction = tech_profile.Direction
-func (SchedulingPolicy) EnumDescriptor() ([]byte, []int) {
- return fileDescriptor_c072e7aa0dfd74d5, []int{1}
-}
+var Direction_name = tech_profile.Direction_name
+var Direction_value = tech_profile.Direction_value
-type AdditionalBW int32
+const Direction_UPSTREAM = Direction(tech_profile.Direction_UPSTREAM)
+const Direction_DOWNSTREAM = Direction(tech_profile.Direction_DOWNSTREAM)
+const Direction_BIDIRECTIONAL = Direction(tech_profile.Direction_BIDIRECTIONAL)
-const (
- AdditionalBW_AdditionalBW_None AdditionalBW = 0
- AdditionalBW_AdditionalBW_NA AdditionalBW = 1
- AdditionalBW_AdditionalBW_BestEffort AdditionalBW = 2
- AdditionalBW_AdditionalBW_Auto AdditionalBW = 3
-)
+// SchedulingPolicy from public import voltha_protos/tech_profile.proto
+type SchedulingPolicy = tech_profile.SchedulingPolicy
-var AdditionalBW_name = map[int32]string{
- 0: "AdditionalBW_None",
- 1: "AdditionalBW_NA",
- 2: "AdditionalBW_BestEffort",
- 3: "AdditionalBW_Auto",
-}
+var SchedulingPolicy_name = tech_profile.SchedulingPolicy_name
+var SchedulingPolicy_value = tech_profile.SchedulingPolicy_value
-var AdditionalBW_value = map[string]int32{
- "AdditionalBW_None": 0,
- "AdditionalBW_NA": 1,
- "AdditionalBW_BestEffort": 2,
- "AdditionalBW_Auto": 3,
-}
+const SchedulingPolicy_WRR = SchedulingPolicy(tech_profile.SchedulingPolicy_WRR)
+const SchedulingPolicy_StrictPriority = SchedulingPolicy(tech_profile.SchedulingPolicy_StrictPriority)
+const SchedulingPolicy_Hybrid = SchedulingPolicy(tech_profile.SchedulingPolicy_Hybrid)
-func (x AdditionalBW) String() string {
- return proto.EnumName(AdditionalBW_name, int32(x))
-}
+// AdditionalBW from public import voltha_protos/tech_profile.proto
+type AdditionalBW = tech_profile.AdditionalBW
-func (AdditionalBW) EnumDescriptor() ([]byte, []int) {
- return fileDescriptor_c072e7aa0dfd74d5, []int{2}
-}
+var AdditionalBW_name = tech_profile.AdditionalBW_name
+var AdditionalBW_value = tech_profile.AdditionalBW_value
-type DiscardPolicy int32
+const AdditionalBW_AdditionalBW_None = AdditionalBW(tech_profile.AdditionalBW_AdditionalBW_None)
+const AdditionalBW_AdditionalBW_NA = AdditionalBW(tech_profile.AdditionalBW_AdditionalBW_NA)
+const AdditionalBW_AdditionalBW_BestEffort = AdditionalBW(tech_profile.AdditionalBW_AdditionalBW_BestEffort)
+const AdditionalBW_AdditionalBW_Auto = AdditionalBW(tech_profile.AdditionalBW_AdditionalBW_Auto)
-const (
- DiscardPolicy_TailDrop DiscardPolicy = 0
- DiscardPolicy_WTailDrop DiscardPolicy = 1
- DiscardPolicy_Red DiscardPolicy = 2
- DiscardPolicy_WRed DiscardPolicy = 3
-)
+// DiscardPolicy from public import voltha_protos/tech_profile.proto
+type DiscardPolicy = tech_profile.DiscardPolicy
-var DiscardPolicy_name = map[int32]string{
- 0: "TailDrop",
- 1: "WTailDrop",
- 2: "Red",
- 3: "WRed",
-}
+var DiscardPolicy_name = tech_profile.DiscardPolicy_name
+var DiscardPolicy_value = tech_profile.DiscardPolicy_value
-var DiscardPolicy_value = map[string]int32{
- "TailDrop": 0,
- "WTailDrop": 1,
- "Red": 2,
- "WRed": 3,
-}
+const DiscardPolicy_TailDrop = DiscardPolicy(tech_profile.DiscardPolicy_TailDrop)
+const DiscardPolicy_WTailDrop = DiscardPolicy(tech_profile.DiscardPolicy_WTailDrop)
+const DiscardPolicy_Red = DiscardPolicy(tech_profile.DiscardPolicy_Red)
+const DiscardPolicy_WRed = DiscardPolicy(tech_profile.DiscardPolicy_WRed)
-func (x DiscardPolicy) String() string {
- return proto.EnumName(DiscardPolicy_name, int32(x))
-}
+// InferredAdditionBWIndication from public import voltha_protos/tech_profile.proto
+type InferredAdditionBWIndication = tech_profile.InferredAdditionBWIndication
-func (DiscardPolicy) EnumDescriptor() ([]byte, []int) {
- return fileDescriptor_c072e7aa0dfd74d5, []int{3}
-}
+var InferredAdditionBWIndication_name = tech_profile.InferredAdditionBWIndication_name
+var InferredAdditionBWIndication_value = tech_profile.InferredAdditionBWIndication_value
-type InferredAdditionBWIndication int32
-
-const (
- InferredAdditionBWIndication_InferredAdditionBWIndication_None InferredAdditionBWIndication = 0
- InferredAdditionBWIndication_InferredAdditionBWIndication_Assured InferredAdditionBWIndication = 1
- InferredAdditionBWIndication_InferredAdditionBWIndication_BestEffort InferredAdditionBWIndication = 2
-)
-
-var InferredAdditionBWIndication_name = map[int32]string{
- 0: "InferredAdditionBWIndication_None",
- 1: "InferredAdditionBWIndication_Assured",
- 2: "InferredAdditionBWIndication_BestEffort",
-}
-
-var InferredAdditionBWIndication_value = map[string]int32{
- "InferredAdditionBWIndication_None": 0,
- "InferredAdditionBWIndication_Assured": 1,
- "InferredAdditionBWIndication_BestEffort": 2,
-}
-
-func (x InferredAdditionBWIndication) String() string {
- return proto.EnumName(InferredAdditionBWIndication_name, int32(x))
-}
-
-func (InferredAdditionBWIndication) EnumDescriptor() ([]byte, []int) {
- return fileDescriptor_c072e7aa0dfd74d5, []int{4}
-}
+const InferredAdditionBWIndication_InferredAdditionBWIndication_None = InferredAdditionBWIndication(tech_profile.InferredAdditionBWIndication_InferredAdditionBWIndication_None)
+const InferredAdditionBWIndication_InferredAdditionBWIndication_Assured = InferredAdditionBWIndication(tech_profile.InferredAdditionBWIndication_InferredAdditionBWIndication_Assured)
+const InferredAdditionBWIndication_InferredAdditionBWIndication_BestEffort = InferredAdditionBWIndication(tech_profile.InferredAdditionBWIndication_InferredAdditionBWIndication_BestEffort)
type DeviceInfo_DeviceResourceRanges_Pool_PoolType int32
@@ -1244,6 +1184,7 @@
IntfId uint32 `protobuf:"fixed32,1,opt,name=intf_id,json=intfId,proto3" json:"intf_id,omitempty"`
OnuId uint32 `protobuf:"fixed32,2,opt,name=onu_id,json=onuId,proto3" json:"onu_id,omitempty"`
PortNo uint32 `protobuf:"fixed32,4,opt,name=port_no,json=portNo,proto3" json:"port_no,omitempty"`
+ GemportId uint32 `protobuf:"fixed32,5,opt,name=gemport_id,json=gemportId,proto3" json:"gemport_id,omitempty"`
Pkt []byte `protobuf:"bytes,3,opt,name=pkt,proto3" json:"pkt,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
@@ -1296,6 +1237,13 @@
return 0
}
+func (m *OnuPacket) GetGemportId() uint32 {
+ if m != nil {
+ return m.GemportId
+ }
+ return 0
+}
+
func (m *OnuPacket) GetPkt() []byte {
if m != nil {
return m.Pkt
@@ -2998,542 +2946,6 @@
return 0
}
-type Scheduler struct {
- Direction Direction `protobuf:"varint,1,opt,name=direction,proto3,enum=openolt.Direction" json:"direction,omitempty"`
- AdditionalBw AdditionalBW `protobuf:"varint,2,opt,name=additional_bw,json=additionalBw,proto3,enum=openolt.AdditionalBW" json:"additional_bw,omitempty"`
- Priority uint32 `protobuf:"fixed32,3,opt,name=priority,proto3" json:"priority,omitempty"`
- Weight uint32 `protobuf:"fixed32,4,opt,name=weight,proto3" json:"weight,omitempty"`
- SchedPolicy SchedulingPolicy `protobuf:"varint,5,opt,name=sched_policy,json=schedPolicy,proto3,enum=openolt.SchedulingPolicy" json:"sched_policy,omitempty"`
- XXX_NoUnkeyedLiteral struct{} `json:"-"`
- XXX_unrecognized []byte `json:"-"`
- XXX_sizecache int32 `json:"-"`
-}
-
-func (m *Scheduler) Reset() { *m = Scheduler{} }
-func (m *Scheduler) String() string { return proto.CompactTextString(m) }
-func (*Scheduler) ProtoMessage() {}
-func (*Scheduler) Descriptor() ([]byte, []int) {
- return fileDescriptor_c072e7aa0dfd74d5, []int{34}
-}
-
-func (m *Scheduler) XXX_Unmarshal(b []byte) error {
- return xxx_messageInfo_Scheduler.Unmarshal(m, b)
-}
-func (m *Scheduler) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
- return xxx_messageInfo_Scheduler.Marshal(b, m, deterministic)
-}
-func (m *Scheduler) XXX_Merge(src proto.Message) {
- xxx_messageInfo_Scheduler.Merge(m, src)
-}
-func (m *Scheduler) XXX_Size() int {
- return xxx_messageInfo_Scheduler.Size(m)
-}
-func (m *Scheduler) XXX_DiscardUnknown() {
- xxx_messageInfo_Scheduler.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_Scheduler proto.InternalMessageInfo
-
-func (m *Scheduler) GetDirection() Direction {
- if m != nil {
- return m.Direction
- }
- return Direction_UPSTREAM
-}
-
-func (m *Scheduler) GetAdditionalBw() AdditionalBW {
- if m != nil {
- return m.AdditionalBw
- }
- return AdditionalBW_AdditionalBW_None
-}
-
-func (m *Scheduler) GetPriority() uint32 {
- if m != nil {
- return m.Priority
- }
- return 0
-}
-
-func (m *Scheduler) GetWeight() uint32 {
- if m != nil {
- return m.Weight
- }
- return 0
-}
-
-func (m *Scheduler) GetSchedPolicy() SchedulingPolicy {
- if m != nil {
- return m.SchedPolicy
- }
- return SchedulingPolicy_WRR
-}
-
-type TrafficShapingInfo struct {
- Cir uint32 `protobuf:"fixed32,1,opt,name=cir,proto3" json:"cir,omitempty"`
- Cbs uint32 `protobuf:"fixed32,2,opt,name=cbs,proto3" json:"cbs,omitempty"`
- Pir uint32 `protobuf:"fixed32,3,opt,name=pir,proto3" json:"pir,omitempty"`
- Pbs uint32 `protobuf:"fixed32,4,opt,name=pbs,proto3" json:"pbs,omitempty"`
- Gir uint32 `protobuf:"fixed32,5,opt,name=gir,proto3" json:"gir,omitempty"`
- AddBwInd InferredAdditionBWIndication `protobuf:"varint,6,opt,name=add_bw_ind,json=addBwInd,proto3,enum=openolt.InferredAdditionBWIndication" json:"add_bw_ind,omitempty"`
- XXX_NoUnkeyedLiteral struct{} `json:"-"`
- XXX_unrecognized []byte `json:"-"`
- XXX_sizecache int32 `json:"-"`
-}
-
-func (m *TrafficShapingInfo) Reset() { *m = TrafficShapingInfo{} }
-func (m *TrafficShapingInfo) String() string { return proto.CompactTextString(m) }
-func (*TrafficShapingInfo) ProtoMessage() {}
-func (*TrafficShapingInfo) Descriptor() ([]byte, []int) {
- return fileDescriptor_c072e7aa0dfd74d5, []int{35}
-}
-
-func (m *TrafficShapingInfo) XXX_Unmarshal(b []byte) error {
- return xxx_messageInfo_TrafficShapingInfo.Unmarshal(m, b)
-}
-func (m *TrafficShapingInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
- return xxx_messageInfo_TrafficShapingInfo.Marshal(b, m, deterministic)
-}
-func (m *TrafficShapingInfo) XXX_Merge(src proto.Message) {
- xxx_messageInfo_TrafficShapingInfo.Merge(m, src)
-}
-func (m *TrafficShapingInfo) XXX_Size() int {
- return xxx_messageInfo_TrafficShapingInfo.Size(m)
-}
-func (m *TrafficShapingInfo) XXX_DiscardUnknown() {
- xxx_messageInfo_TrafficShapingInfo.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_TrafficShapingInfo proto.InternalMessageInfo
-
-func (m *TrafficShapingInfo) GetCir() uint32 {
- if m != nil {
- return m.Cir
- }
- return 0
-}
-
-func (m *TrafficShapingInfo) GetCbs() uint32 {
- if m != nil {
- return m.Cbs
- }
- return 0
-}
-
-func (m *TrafficShapingInfo) GetPir() uint32 {
- if m != nil {
- return m.Pir
- }
- return 0
-}
-
-func (m *TrafficShapingInfo) GetPbs() uint32 {
- if m != nil {
- return m.Pbs
- }
- return 0
-}
-
-func (m *TrafficShapingInfo) GetGir() uint32 {
- if m != nil {
- return m.Gir
- }
- return 0
-}
-
-func (m *TrafficShapingInfo) GetAddBwInd() InferredAdditionBWIndication {
- if m != nil {
- return m.AddBwInd
- }
- return InferredAdditionBWIndication_InferredAdditionBWIndication_None
-}
-
-type Tcont struct {
- Direction Direction `protobuf:"varint,1,opt,name=direction,proto3,enum=openolt.Direction" json:"direction,omitempty"`
- AllocId uint32 `protobuf:"fixed32,2,opt,name=alloc_id,json=allocId,proto3" json:"alloc_id,omitempty"`
- Scheduler *Scheduler `protobuf:"bytes,3,opt,name=scheduler,proto3" json:"scheduler,omitempty"`
- TrafficShapingInfo *TrafficShapingInfo `protobuf:"bytes,4,opt,name=traffic_shaping_info,json=trafficShapingInfo,proto3" json:"traffic_shaping_info,omitempty"`
- XXX_NoUnkeyedLiteral struct{} `json:"-"`
- XXX_unrecognized []byte `json:"-"`
- XXX_sizecache int32 `json:"-"`
-}
-
-func (m *Tcont) Reset() { *m = Tcont{} }
-func (m *Tcont) String() string { return proto.CompactTextString(m) }
-func (*Tcont) ProtoMessage() {}
-func (*Tcont) Descriptor() ([]byte, []int) {
- return fileDescriptor_c072e7aa0dfd74d5, []int{36}
-}
-
-func (m *Tcont) XXX_Unmarshal(b []byte) error {
- return xxx_messageInfo_Tcont.Unmarshal(m, b)
-}
-func (m *Tcont) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
- return xxx_messageInfo_Tcont.Marshal(b, m, deterministic)
-}
-func (m *Tcont) XXX_Merge(src proto.Message) {
- xxx_messageInfo_Tcont.Merge(m, src)
-}
-func (m *Tcont) XXX_Size() int {
- return xxx_messageInfo_Tcont.Size(m)
-}
-func (m *Tcont) XXX_DiscardUnknown() {
- xxx_messageInfo_Tcont.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_Tcont proto.InternalMessageInfo
-
-func (m *Tcont) GetDirection() Direction {
- if m != nil {
- return m.Direction
- }
- return Direction_UPSTREAM
-}
-
-func (m *Tcont) GetAllocId() uint32 {
- if m != nil {
- return m.AllocId
- }
- return 0
-}
-
-func (m *Tcont) GetScheduler() *Scheduler {
- if m != nil {
- return m.Scheduler
- }
- return nil
-}
-
-func (m *Tcont) GetTrafficShapingInfo() *TrafficShapingInfo {
- if m != nil {
- return m.TrafficShapingInfo
- }
- return nil
-}
-
-type Tconts struct {
- IntfId uint32 `protobuf:"fixed32,1,opt,name=intf_id,json=intfId,proto3" json:"intf_id,omitempty"`
- OnuId uint32 `protobuf:"fixed32,2,opt,name=onu_id,json=onuId,proto3" json:"onu_id,omitempty"`
- UniId uint32 `protobuf:"fixed32,4,opt,name=uni_id,json=uniId,proto3" json:"uni_id,omitempty"`
- PortNo uint32 `protobuf:"fixed32,5,opt,name=port_no,json=portNo,proto3" json:"port_no,omitempty"`
- Tconts []*Tcont `protobuf:"bytes,3,rep,name=tconts,proto3" json:"tconts,omitempty"`
- XXX_NoUnkeyedLiteral struct{} `json:"-"`
- XXX_unrecognized []byte `json:"-"`
- XXX_sizecache int32 `json:"-"`
-}
-
-func (m *Tconts) Reset() { *m = Tconts{} }
-func (m *Tconts) String() string { return proto.CompactTextString(m) }
-func (*Tconts) ProtoMessage() {}
-func (*Tconts) Descriptor() ([]byte, []int) {
- return fileDescriptor_c072e7aa0dfd74d5, []int{37}
-}
-
-func (m *Tconts) XXX_Unmarshal(b []byte) error {
- return xxx_messageInfo_Tconts.Unmarshal(m, b)
-}
-func (m *Tconts) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
- return xxx_messageInfo_Tconts.Marshal(b, m, deterministic)
-}
-func (m *Tconts) XXX_Merge(src proto.Message) {
- xxx_messageInfo_Tconts.Merge(m, src)
-}
-func (m *Tconts) XXX_Size() int {
- return xxx_messageInfo_Tconts.Size(m)
-}
-func (m *Tconts) XXX_DiscardUnknown() {
- xxx_messageInfo_Tconts.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_Tconts proto.InternalMessageInfo
-
-func (m *Tconts) GetIntfId() uint32 {
- if m != nil {
- return m.IntfId
- }
- return 0
-}
-
-func (m *Tconts) GetOnuId() uint32 {
- if m != nil {
- return m.OnuId
- }
- return 0
-}
-
-func (m *Tconts) GetUniId() uint32 {
- if m != nil {
- return m.UniId
- }
- return 0
-}
-
-func (m *Tconts) GetPortNo() uint32 {
- if m != nil {
- return m.PortNo
- }
- return 0
-}
-
-func (m *Tconts) GetTconts() []*Tcont {
- if m != nil {
- return m.Tconts
- }
- return nil
-}
-
-type TailDropDiscardConfig struct {
- QueueSize uint32 `protobuf:"fixed32,1,opt,name=queue_size,json=queueSize,proto3" json:"queue_size,omitempty"`
- XXX_NoUnkeyedLiteral struct{} `json:"-"`
- XXX_unrecognized []byte `json:"-"`
- XXX_sizecache int32 `json:"-"`
-}
-
-func (m *TailDropDiscardConfig) Reset() { *m = TailDropDiscardConfig{} }
-func (m *TailDropDiscardConfig) String() string { return proto.CompactTextString(m) }
-func (*TailDropDiscardConfig) ProtoMessage() {}
-func (*TailDropDiscardConfig) Descriptor() ([]byte, []int) {
- return fileDescriptor_c072e7aa0dfd74d5, []int{38}
-}
-
-func (m *TailDropDiscardConfig) XXX_Unmarshal(b []byte) error {
- return xxx_messageInfo_TailDropDiscardConfig.Unmarshal(m, b)
-}
-func (m *TailDropDiscardConfig) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
- return xxx_messageInfo_TailDropDiscardConfig.Marshal(b, m, deterministic)
-}
-func (m *TailDropDiscardConfig) XXX_Merge(src proto.Message) {
- xxx_messageInfo_TailDropDiscardConfig.Merge(m, src)
-}
-func (m *TailDropDiscardConfig) XXX_Size() int {
- return xxx_messageInfo_TailDropDiscardConfig.Size(m)
-}
-func (m *TailDropDiscardConfig) XXX_DiscardUnknown() {
- xxx_messageInfo_TailDropDiscardConfig.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_TailDropDiscardConfig proto.InternalMessageInfo
-
-func (m *TailDropDiscardConfig) GetQueueSize() uint32 {
- if m != nil {
- return m.QueueSize
- }
- return 0
-}
-
-type RedDiscardConfig struct {
- MinThreshold uint32 `protobuf:"fixed32,1,opt,name=min_threshold,json=minThreshold,proto3" json:"min_threshold,omitempty"`
- MaxThreshold uint32 `protobuf:"fixed32,2,opt,name=max_threshold,json=maxThreshold,proto3" json:"max_threshold,omitempty"`
- MaxProbability uint32 `protobuf:"fixed32,3,opt,name=max_probability,json=maxProbability,proto3" json:"max_probability,omitempty"`
- XXX_NoUnkeyedLiteral struct{} `json:"-"`
- XXX_unrecognized []byte `json:"-"`
- XXX_sizecache int32 `json:"-"`
-}
-
-func (m *RedDiscardConfig) Reset() { *m = RedDiscardConfig{} }
-func (m *RedDiscardConfig) String() string { return proto.CompactTextString(m) }
-func (*RedDiscardConfig) ProtoMessage() {}
-func (*RedDiscardConfig) Descriptor() ([]byte, []int) {
- return fileDescriptor_c072e7aa0dfd74d5, []int{39}
-}
-
-func (m *RedDiscardConfig) XXX_Unmarshal(b []byte) error {
- return xxx_messageInfo_RedDiscardConfig.Unmarshal(m, b)
-}
-func (m *RedDiscardConfig) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
- return xxx_messageInfo_RedDiscardConfig.Marshal(b, m, deterministic)
-}
-func (m *RedDiscardConfig) XXX_Merge(src proto.Message) {
- xxx_messageInfo_RedDiscardConfig.Merge(m, src)
-}
-func (m *RedDiscardConfig) XXX_Size() int {
- return xxx_messageInfo_RedDiscardConfig.Size(m)
-}
-func (m *RedDiscardConfig) XXX_DiscardUnknown() {
- xxx_messageInfo_RedDiscardConfig.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_RedDiscardConfig proto.InternalMessageInfo
-
-func (m *RedDiscardConfig) GetMinThreshold() uint32 {
- if m != nil {
- return m.MinThreshold
- }
- return 0
-}
-
-func (m *RedDiscardConfig) GetMaxThreshold() uint32 {
- if m != nil {
- return m.MaxThreshold
- }
- return 0
-}
-
-func (m *RedDiscardConfig) GetMaxProbability() uint32 {
- if m != nil {
- return m.MaxProbability
- }
- return 0
-}
-
-type WRedDiscardConfig struct {
- Green *RedDiscardConfig `protobuf:"bytes,1,opt,name=green,proto3" json:"green,omitempty"`
- Yellow *RedDiscardConfig `protobuf:"bytes,2,opt,name=yellow,proto3" json:"yellow,omitempty"`
- Red *RedDiscardConfig `protobuf:"bytes,3,opt,name=red,proto3" json:"red,omitempty"`
- XXX_NoUnkeyedLiteral struct{} `json:"-"`
- XXX_unrecognized []byte `json:"-"`
- XXX_sizecache int32 `json:"-"`
-}
-
-func (m *WRedDiscardConfig) Reset() { *m = WRedDiscardConfig{} }
-func (m *WRedDiscardConfig) String() string { return proto.CompactTextString(m) }
-func (*WRedDiscardConfig) ProtoMessage() {}
-func (*WRedDiscardConfig) Descriptor() ([]byte, []int) {
- return fileDescriptor_c072e7aa0dfd74d5, []int{40}
-}
-
-func (m *WRedDiscardConfig) XXX_Unmarshal(b []byte) error {
- return xxx_messageInfo_WRedDiscardConfig.Unmarshal(m, b)
-}
-func (m *WRedDiscardConfig) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
- return xxx_messageInfo_WRedDiscardConfig.Marshal(b, m, deterministic)
-}
-func (m *WRedDiscardConfig) XXX_Merge(src proto.Message) {
- xxx_messageInfo_WRedDiscardConfig.Merge(m, src)
-}
-func (m *WRedDiscardConfig) XXX_Size() int {
- return xxx_messageInfo_WRedDiscardConfig.Size(m)
-}
-func (m *WRedDiscardConfig) XXX_DiscardUnknown() {
- xxx_messageInfo_WRedDiscardConfig.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_WRedDiscardConfig proto.InternalMessageInfo
-
-func (m *WRedDiscardConfig) GetGreen() *RedDiscardConfig {
- if m != nil {
- return m.Green
- }
- return nil
-}
-
-func (m *WRedDiscardConfig) GetYellow() *RedDiscardConfig {
- if m != nil {
- return m.Yellow
- }
- return nil
-}
-
-func (m *WRedDiscardConfig) GetRed() *RedDiscardConfig {
- if m != nil {
- return m.Red
- }
- return nil
-}
-
-type DiscardConfig struct {
- DiscardPolicy DiscardPolicy `protobuf:"varint,1,opt,name=discard_policy,json=discardPolicy,proto3,enum=openolt.DiscardPolicy" json:"discard_policy,omitempty"`
- // Types that are valid to be assigned to DiscardConfig:
- // *DiscardConfig_TailDropDiscardConfig
- // *DiscardConfig_RedDiscardConfig
- // *DiscardConfig_WredDiscardConfig
- DiscardConfig isDiscardConfig_DiscardConfig `protobuf_oneof:"discard_config"`
- XXX_NoUnkeyedLiteral struct{} `json:"-"`
- XXX_unrecognized []byte `json:"-"`
- XXX_sizecache int32 `json:"-"`
-}
-
-func (m *DiscardConfig) Reset() { *m = DiscardConfig{} }
-func (m *DiscardConfig) String() string { return proto.CompactTextString(m) }
-func (*DiscardConfig) ProtoMessage() {}
-func (*DiscardConfig) Descriptor() ([]byte, []int) {
- return fileDescriptor_c072e7aa0dfd74d5, []int{41}
-}
-
-func (m *DiscardConfig) XXX_Unmarshal(b []byte) error {
- return xxx_messageInfo_DiscardConfig.Unmarshal(m, b)
-}
-func (m *DiscardConfig) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
- return xxx_messageInfo_DiscardConfig.Marshal(b, m, deterministic)
-}
-func (m *DiscardConfig) XXX_Merge(src proto.Message) {
- xxx_messageInfo_DiscardConfig.Merge(m, src)
-}
-func (m *DiscardConfig) XXX_Size() int {
- return xxx_messageInfo_DiscardConfig.Size(m)
-}
-func (m *DiscardConfig) XXX_DiscardUnknown() {
- xxx_messageInfo_DiscardConfig.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_DiscardConfig proto.InternalMessageInfo
-
-func (m *DiscardConfig) GetDiscardPolicy() DiscardPolicy {
- if m != nil {
- return m.DiscardPolicy
- }
- return DiscardPolicy_TailDrop
-}
-
-type isDiscardConfig_DiscardConfig interface {
- isDiscardConfig_DiscardConfig()
-}
-
-type DiscardConfig_TailDropDiscardConfig struct {
- TailDropDiscardConfig *TailDropDiscardConfig `protobuf:"bytes,2,opt,name=tail_drop_discard_config,json=tailDropDiscardConfig,proto3,oneof"`
-}
-
-type DiscardConfig_RedDiscardConfig struct {
- RedDiscardConfig *RedDiscardConfig `protobuf:"bytes,3,opt,name=red_discard_config,json=redDiscardConfig,proto3,oneof"`
-}
-
-type DiscardConfig_WredDiscardConfig struct {
- WredDiscardConfig *WRedDiscardConfig `protobuf:"bytes,4,opt,name=wred_discard_config,json=wredDiscardConfig,proto3,oneof"`
-}
-
-func (*DiscardConfig_TailDropDiscardConfig) isDiscardConfig_DiscardConfig() {}
-
-func (*DiscardConfig_RedDiscardConfig) isDiscardConfig_DiscardConfig() {}
-
-func (*DiscardConfig_WredDiscardConfig) isDiscardConfig_DiscardConfig() {}
-
-func (m *DiscardConfig) GetDiscardConfig() isDiscardConfig_DiscardConfig {
- if m != nil {
- return m.DiscardConfig
- }
- return nil
-}
-
-func (m *DiscardConfig) GetTailDropDiscardConfig() *TailDropDiscardConfig {
- if x, ok := m.GetDiscardConfig().(*DiscardConfig_TailDropDiscardConfig); ok {
- return x.TailDropDiscardConfig
- }
- return nil
-}
-
-func (m *DiscardConfig) GetRedDiscardConfig() *RedDiscardConfig {
- if x, ok := m.GetDiscardConfig().(*DiscardConfig_RedDiscardConfig); ok {
- return x.RedDiscardConfig
- }
- return nil
-}
-
-func (m *DiscardConfig) GetWredDiscardConfig() *WRedDiscardConfig {
- if x, ok := m.GetDiscardConfig().(*DiscardConfig_WredDiscardConfig); ok {
- return x.WredDiscardConfig
- }
- return nil
-}
-
-// XXX_OneofWrappers is for the internal use of the proto package.
-func (*DiscardConfig) XXX_OneofWrappers() []interface{} {
- return []interface{}{
- (*DiscardConfig_TailDropDiscardConfig)(nil),
- (*DiscardConfig_RedDiscardConfig)(nil),
- (*DiscardConfig_WredDiscardConfig)(nil),
- }
-}
-
type Empty struct {
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
@@ -3544,7 +2956,7 @@
func (m *Empty) String() string { return proto.CompactTextString(m) }
func (*Empty) ProtoMessage() {}
func (*Empty) Descriptor() ([]byte, []int) {
- return fileDescriptor_c072e7aa0dfd74d5, []int{42}
+ return fileDescriptor_c072e7aa0dfd74d5, []int{34}
}
func (m *Empty) XXX_Unmarshal(b []byte) error {
@@ -3566,11 +2978,6 @@
var xxx_messageInfo_Empty proto.InternalMessageInfo
func init() {
- proto.RegisterEnum("openolt.Direction", Direction_name, Direction_value)
- proto.RegisterEnum("openolt.SchedulingPolicy", SchedulingPolicy_name, SchedulingPolicy_value)
- proto.RegisterEnum("openolt.AdditionalBW", AdditionalBW_name, AdditionalBW_value)
- proto.RegisterEnum("openolt.DiscardPolicy", DiscardPolicy_name, DiscardPolicy_value)
- proto.RegisterEnum("openolt.InferredAdditionBWIndication", InferredAdditionBWIndication_name, InferredAdditionBWIndication_value)
proto.RegisterEnum("openolt.DeviceInfo_DeviceResourceRanges_Pool_PoolType", DeviceInfo_DeviceResourceRanges_Pool_PoolType_name, DeviceInfo_DeviceResourceRanges_Pool_PoolType_value)
proto.RegisterEnum("openolt.DeviceInfo_DeviceResourceRanges_Pool_SharingType", DeviceInfo_DeviceResourceRanges_Pool_SharingType_name, DeviceInfo_DeviceResourceRanges_Pool_SharingType_value)
proto.RegisterType((*Indication)(nil), "openolt.Indication")
@@ -3609,248 +3016,200 @@
proto.RegisterType((*OnuTransmissionInterferenceWarning)(nil), "openolt.OnuTransmissionInterferenceWarning")
proto.RegisterType((*OnuActivationFailureIndication)(nil), "openolt.OnuActivationFailureIndication")
proto.RegisterType((*OnuProcessingErrorIndication)(nil), "openolt.OnuProcessingErrorIndication")
- proto.RegisterType((*Scheduler)(nil), "openolt.Scheduler")
- proto.RegisterType((*TrafficShapingInfo)(nil), "openolt.TrafficShapingInfo")
- proto.RegisterType((*Tcont)(nil), "openolt.Tcont")
- proto.RegisterType((*Tconts)(nil), "openolt.Tconts")
- proto.RegisterType((*TailDropDiscardConfig)(nil), "openolt.TailDropDiscardConfig")
- proto.RegisterType((*RedDiscardConfig)(nil), "openolt.RedDiscardConfig")
- proto.RegisterType((*WRedDiscardConfig)(nil), "openolt.WRedDiscardConfig")
- proto.RegisterType((*DiscardConfig)(nil), "openolt.DiscardConfig")
proto.RegisterType((*Empty)(nil), "openolt.Empty")
}
func init() { proto.RegisterFile("voltha_protos/openolt.proto", fileDescriptor_c072e7aa0dfd74d5) }
var fileDescriptor_c072e7aa0dfd74d5 = []byte{
- // 3628 bytes of a gzipped FileDescriptorProto
- 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xc4, 0x5a, 0xcd, 0x73, 0x1c, 0x49,
- 0x56, 0x57, 0xab, 0x5b, 0xfd, 0xf1, 0xfa, 0x53, 0x29, 0xcb, 0x96, 0x25, 0xaf, 0x57, 0xd4, 0x7a,
- 0xd7, 0xc6, 0xcb, 0xda, 0x33, 0x9e, 0x8d, 0x85, 0x9d, 0x1d, 0xd8, 0x91, 0xd4, 0xf2, 0xa8, 0x41,
- 0x72, 0x2b, 0x4a, 0xed, 0x15, 0xbb, 0x04, 0x51, 0x5b, 0x5d, 0x95, 0xdd, 0x9d, 0xa1, 0xea, 0xca,
- 0x9a, 0xcc, 0x6c, 0xb7, 0xbc, 0xdc, 0x16, 0xb8, 0x13, 0x6c, 0x70, 0x80, 0x80, 0x1b, 0x11, 0x1c,
- 0x38, 0x72, 0x21, 0x82, 0x23, 0x57, 0x82, 0x0b, 0x70, 0xe6, 0xc2, 0x8d, 0x7f, 0x81, 0x03, 0x91,
- 0x1f, 0xf5, 0xd5, 0x2d, 0xc9, 0x96, 0xc3, 0x04, 0x17, 0x45, 0xe7, 0x7b, 0xbf, 0xf7, 0xab, 0x7c,
- 0xf9, 0x3e, 0x32, 0x2b, 0x4b, 0xb0, 0xf3, 0x86, 0x06, 0x62, 0xe2, 0x3a, 0x11, 0xa3, 0x82, 0xf2,
- 0xe7, 0x34, 0xc2, 0x21, 0x0d, 0xc4, 0x33, 0x35, 0x44, 0x15, 0x33, 0xdc, 0x7e, 0x30, 0xa6, 0x74,
- 0x1c, 0xe0, 0xe7, 0x6e, 0x44, 0x9e, 0xbb, 0x61, 0x48, 0x85, 0x2b, 0x08, 0x0d, 0xb9, 0x86, 0x59,
- 0xff, 0x52, 0x02, 0xe8, 0x85, 0x3e, 0xf1, 0x94, 0x14, 0x7d, 0x0a, 0x15, 0x1a, 0x08, 0x87, 0x84,
- 0xfe, 0x56, 0x61, 0xb7, 0xf0, 0xa4, 0xfe, 0xe2, 0xee, 0xb3, 0x98, 0xb6, 0x1f, 0x88, 0x14, 0x78,
- 0xb4, 0x62, 0x97, 0xa9, 0x12, 0xa0, 0xef, 0x43, 0x95, 0x84, 0x62, 0xa4, 0x6c, 0x56, 0x95, 0xcd,
- 0xbd, 0xc4, 0xa6, 0x17, 0x8a, 0x51, 0xce, 0xa8, 0x42, 0xb4, 0x04, 0xed, 0x41, 0x53, 0x59, 0xd1,
- 0x08, 0x33, 0x65, 0x5a, 0x54, 0xa6, 0x3b, 0x39, 0xd3, 0x7e, 0x84, 0x59, 0xce, 0xbc, 0x4e, 0x52,
- 0x29, 0xfa, 0x1d, 0x68, 0xd0, 0x70, 0xe6, 0xf8, 0x84, 0x7b, 0x8a, 0xa1, 0xa4, 0x18, 0xb6, 0xd3,
- 0x09, 0x87, 0xb3, 0x2e, 0xe1, 0x5e, 0x8e, 0x00, 0x68, 0x22, 0x54, 0xbe, 0x86, 0x33, 0x65, 0xba,
- 0xb6, 0xe8, 0x6b, 0x38, 0x5b, 0xf0, 0x55, 0x09, 0xa4, 0xaf, 0x74, 0xea, 0x11, 0x65, 0x53, 0x5e,
- 0xf0, 0xb5, 0x3f, 0xf5, 0x48, 0xde, 0x57, 0xaa, 0x25, 0xe8, 0xfb, 0x50, 0x89, 0x2e, 0xf4, 0xa2,
- 0x56, 0x94, 0xd1, 0xfd, 0xc4, 0xe8, 0xd4, 0xf5, 0x2e, 0xf0, 0xc2, 0xba, 0x46, 0x17, 0x6a, 0x5d,
- 0x7f, 0x0b, 0x20, 0xa2, 0x4c, 0x38, 0x5c, 0xb8, 0x82, 0x6f, 0x55, 0x17, 0x9e, 0x76, 0x4a, 0x99,
- 0x38, 0x93, 0xa1, 0xe4, 0x82, 0x78, 0xfc, 0x68, 0xc5, 0xae, 0x45, 0x46, 0xc2, 0xa5, 0xe5, 0x28,
- 0xa0, 0x73, 0x63, 0x59, 0x5b, 0xb0, 0x7c, 0x19, 0xd0, 0x79, 0xde, 0x72, 0x64, 0x24, 0x1c, 0xfd,
- 0x26, 0xd4, 0xdc, 0xc0, 0x65, 0x53, 0x35, 0x57, 0x50, 0x86, 0x5b, 0x89, 0xe1, 0x9e, 0xd4, 0xe4,
- 0xa6, 0x5a, 0x75, 0x8d, 0x68, 0xbf, 0x0c, 0x25, 0xdf, 0x15, 0xae, 0xf5, 0xf7, 0x15, 0x68, 0x2f,
- 0xe0, 0xe4, 0x3a, 0x07, 0x94, 0x5f, 0x99, 0x53, 0xc7, 0x94, 0xe7, 0x7d, 0x0f, 0x94, 0x00, 0x75,
- 0xa1, 0xe5, 0xbf, 0x25, 0xe1, 0xd8, 0x19, 0xbb, 0x3c, 0xca, 0x64, 0xd6, 0x83, 0xc4, 0xb2, 0x2b,
- 0xd5, 0x5f, 0xb9, 0x3c, 0xca, 0xd9, 0x37, 0xfc, 0x8c, 0x58, 0xe6, 0x98, 0x0c, 0x70, 0xea, 0xd1,
- 0x62, 0x8e, 0xf5, 0xc3, 0xd9, 0xb2, 0x53, 0x75, 0x9a, 0x4a, 0xd1, 0x39, 0xdc, 0x91, 0x14, 0x5c,
- 0xb8, 0x4c, 0xcc, 0x22, 0x67, 0xe4, 0x92, 0x20, 0x93, 0x6b, 0x8f, 0xb2, 0x4c, 0x67, 0x1a, 0xf3,
- 0xd2, 0x25, 0xc1, 0x8c, 0xe1, 0x1c, 0xe5, 0x3a, 0xcd, 0xa9, 0x25, 0xf1, 0xcf, 0xe0, 0xae, 0x22,
- 0x26, 0xe3, 0xd0, 0x0d, 0x1c, 0x1f, 0x8f, 0x99, 0xeb, 0xe3, 0x4c, 0x2e, 0x7e, 0x2b, 0x47, 0xad,
- 0x50, 0x5d, 0x0d, 0xca, 0x31, 0x6f, 0xd0, 0x65, 0x2d, 0xfa, 0x03, 0xb8, 0xa7, 0x0a, 0x83, 0x91,
- 0x91, 0x70, 0xe8, 0xc8, 0x99, 0x93, 0xd0, 0xa7, 0xf3, 0x4c, 0xd2, 0xe6, 0xc8, 0xbb, 0x12, 0xd6,
- 0x1f, 0x9d, 0x2b, 0xd0, 0x12, 0xf9, 0xa2, 0x16, 0x0d, 0x40, 0x7a, 0xe3, 0x04, 0x94, 0x73, 0x27,
- 0xa9, 0x05, 0x9d, 0xd6, 0x8f, 0xb3, 0xb4, 0xc7, 0x94, 0xf3, 0xfe, 0x48, 0x16, 0xc5, 0xc1, 0xc4,
- 0x0d, 0x43, 0x1c, 0xe4, 0xa8, 0x5b, 0xd4, 0x20, 0x4c, 0x89, 0xc4, 0xeb, 0xac, 0x5c, 0xe1, 0xe9,
- 0x3a, 0x57, 0xaf, 0x58, 0x67, 0x8d, 0xb9, 0x76, 0x9d, 0x53, 0xb5, 0x24, 0xee, 0xeb, 0x26, 0x21,
- 0xc8, 0x5c, 0xcf, 0x54, 0x57, 0xc3, 0x77, 0xb3, 0x84, 0x03, 0xe6, 0x86, 0x7c, 0x4a, 0x38, 0x27,
- 0x34, 0xec, 0x85, 0x02, 0xb3, 0x11, 0x66, 0x38, 0xf4, 0xf0, 0xb9, 0xcb, 0x42, 0x12, 0x8e, 0x4d,
- 0xd7, 0x18, 0x90, 0xb9, 0x9a, 0xe9, 0xcf, 0xf5, 0xe2, 0xba, 0x9e, 0x20, 0x6f, 0xd4, 0x73, 0xd3,
- 0xc9, 0xc2, 0xf2, 0x2a, 0xec, 0x25, 0xb0, 0xab, 0xe6, 0x2b, 0x7d, 0xce, 0x23, 0xf4, 0x13, 0xb6,
- 0xe4, 0x13, 0x22, 0x46, 0x3d, 0xcc, 0xb9, 0xac, 0x02, 0xcc, 0x18, 0xd5, 0x5d, 0xb2, 0xae, 0x1e,
- 0xf1, 0xed, 0xec, 0x23, 0x4e, 0x13, 0xdc, 0xa1, 0x84, 0xe5, 0x1e, 0xb0, 0x49, 0xaf, 0xd2, 0x27,
- 0xd5, 0xfa, 0x0c, 0x9a, 0xb9, 0xae, 0x8e, 0xbe, 0x01, 0xa0, 0x1a, 0xb2, 0xec, 0x1c, 0x58, 0x55,
- 0x6b, 0xcd, 0xae, 0x49, 0x89, 0x6c, 0x0f, 0xd8, 0x3a, 0x82, 0x56, 0xbe, 0xa3, 0xa3, 0x7b, 0x50,
- 0xd1, 0xcd, 0x5f, 0xd7, 0x76, 0xc5, 0x2e, 0xab, 0x06, 0xef, 0x2f, 0x30, 0xad, 0x2e, 0x32, 0x4d,
- 0x60, 0x7d, 0xa9, 0x3d, 0x5f, 0x4f, 0xf6, 0x39, 0x34, 0x39, 0x66, 0xc4, 0x0d, 0x9c, 0x70, 0x36,
- 0x1d, 0x62, 0x66, 0xba, 0xc1, 0x66, 0xb2, 0x0c, 0x67, 0x4a, 0xfb, 0x4a, 0x29, 0xed, 0x06, 0xcf,
- 0x8c, 0xac, 0x7f, 0x2a, 0x40, 0x33, 0xd7, 0xce, 0xaf, 0x7f, 0xcc, 0x26, 0x94, 0xd5, 0x86, 0xa0,
- 0xbb, 0x4d, 0xc5, 0x5e, 0x93, 0x5d, 0x7f, 0xd1, 0x95, 0xe2, 0x82, 0x2b, 0xe8, 0x9b, 0x50, 0x77,
- 0xfd, 0x29, 0x09, 0x8d, 0x7e, 0x4d, 0xe9, 0x41, 0x89, 0x34, 0x60, 0x69, 0xf6, 0xa5, 0xf7, 0x9f,
- 0xfd, 0xcf, 0x01, 0x2d, 0x6f, 0x84, 0x08, 0x41, 0x49, 0xbc, 0x8d, 0xe2, 0x00, 0xa9, 0xdf, 0x59,
- 0xaf, 0x56, 0x6f, 0x88, 0xc4, 0xe2, 0xf4, 0x2d, 0x1b, 0x5a, 0xf9, 0x9d, 0xeb, 0xd6, 0xeb, 0xd3,
- 0x81, 0x62, 0x74, 0x21, 0x14, 0x73, 0xc3, 0x96, 0x3f, 0xad, 0x7f, 0x2e, 0x40, 0x67, 0x71, 0x67,
- 0x43, 0x3b, 0x50, 0x53, 0xb4, 0x6a, 0xe6, 0x7a, 0x95, 0xd4, 0xc1, 0x61, 0xb0, 0x30, 0xfb, 0xa5,
- 0x3c, 0x1a, 0xe3, 0xa9, 0xda, 0x08, 0x93, 0xe7, 0xd6, 0x8c, 0xa4, 0xe7, 0x4b, 0x3b, 0xb5, 0xd5,
- 0x11, 0xdd, 0xdc, 0x2b, 0x76, 0x59, 0x0e, 0xb5, 0x42, 0x19, 0x85, 0x54, 0xf5, 0xbc, 0x8a, 0x5d,
- 0x96, 0xc3, 0x57, 0x14, 0xdd, 0x85, 0xb2, 0x47, 0xe9, 0x05, 0xc1, 0xaa, 0x69, 0x95, 0x6d, 0x33,
- 0x8a, 0xbd, 0x28, 0xa5, 0x5e, 0x3c, 0x82, 0x9a, 0x6e, 0x07, 0xae, 0x77, 0xfd, 0x04, 0xad, 0x2f,
- 0xa0, 0x76, 0x84, 0x5d, 0x26, 0x86, 0xd8, 0x15, 0xe8, 0x39, 0x6c, 0x4c, 0xe2, 0x81, 0x6e, 0x66,
- 0x62, 0xc6, 0xb0, 0xb1, 0x40, 0x89, 0xea, 0x2c, 0xd6, 0x58, 0x7f, 0x5c, 0x80, 0x62, 0x3f, 0x9c,
- 0xdd, 0x7a, 0xcd, 0x97, 0x72, 0xaa, 0xf8, 0xde, 0x39, 0xa5, 0x3c, 0x25, 0x3a, 0x0b, 0x2b, 0xb6,
- 0xfc, 0x69, 0xfd, 0x1e, 0x54, 0x64, 0x0e, 0x9c, 0xf0, 0xf1, 0x47, 0x08, 0xfe, 0x08, 0x6a, 0xb2,
- 0x2b, 0xa9, 0xf0, 0xdf, 0x9a, 0x2e, 0x13, 0xb6, 0x52, 0x2e, 0x6c, 0xcb, 0xcf, 0xf9, 0x21, 0x34,
- 0x5e, 0x47, 0x01, 0x09, 0x2f, 0xde, 0xf5, 0x28, 0x63, 0xba, 0x9a, 0x9a, 0xfe, 0x79, 0x0d, 0xa0,
- 0x8b, 0xdf, 0x10, 0x0f, 0xf7, 0xc2, 0x91, 0x4a, 0x89, 0x37, 0x38, 0xf4, 0x29, 0x33, 0x05, 0x65,
- 0x46, 0xe8, 0x0e, 0xac, 0x4d, 0xa9, 0x8f, 0x03, 0xd3, 0xbe, 0xf4, 0x00, 0xfd, 0x3a, 0x74, 0x26,
- 0x2e, 0xf3, 0xe7, 0x2e, 0xc3, 0xce, 0x1b, 0xcc, 0xe4, 0xae, 0x61, 0xaa, 0xaa, 0x1d, 0xcb, 0x7f,
- 0xa2, 0xc5, 0x12, 0x3a, 0x22, 0x6c, 0x9a, 0x83, 0x96, 0x34, 0x34, 0x96, 0xc7, 0xd0, 0x1d, 0xa8,
- 0xf9, 0x6a, 0x46, 0x72, 0xfe, 0x1d, 0x5d, 0x1d, 0x5a, 0xd0, 0xf3, 0xd1, 0x27, 0x70, 0xc7, 0x28,
- 0xf3, 0x41, 0x5f, 0x57, 0x38, 0xa4, 0x75, 0xd9, 0x88, 0x4b, 0xba, 0x88, 0x86, 0x8e, 0x5c, 0x3c,
- 0xbe, 0xd5, 0x50, 0xcb, 0x51, 0x8d, 0x68, 0x28, 0x4f, 0x8d, 0x1c, 0x3d, 0x04, 0x10, 0xd8, 0x9b,
- 0x84, 0x34, 0xa0, 0xe3, 0xb7, 0x71, 0xc3, 0x4a, 0x25, 0x68, 0x57, 0xef, 0x99, 0xc4, 0xd7, 0xe7,
- 0x1e, 0x53, 0x40, 0xa0, 0x22, 0xa4, 0x8e, 0x31, 0xe8, 0x01, 0x80, 0x41, 0x60, 0xb3, 0xfb, 0x57,
- 0xec, 0xaa, 0xd2, 0x1f, 0x86, 0x3e, 0x7a, 0x04, 0x2d, 0x37, 0x08, 0xa8, 0x97, 0x32, 0x54, 0x15,
- 0xa2, 0xa1, 0xa4, 0x31, 0xc7, 0x2e, 0x34, 0x12, 0x14, 0x36, 0x3b, 0x73, 0xc5, 0x06, 0x83, 0x91,
- 0x3c, 0x4f, 0xa0, 0x93, 0xd6, 0xbe, 0x61, 0x02, 0x85, 0x6a, 0x25, 0x1d, 0x40, 0x73, 0x3d, 0x82,
- 0x56, 0x06, 0x89, 0xcd, 0x46, 0x59, 0xb1, 0x1b, 0x09, 0x4e, 0xf2, 0x59, 0xd0, 0x34, 0xcd, 0xc2,
- 0x90, 0x35, 0x15, 0xa8, 0xae, 0x5b, 0x86, 0x66, 0x7a, 0x08, 0xf5, 0x18, 0x23, 0x69, 0x5a, 0xba,
- 0xe1, 0x68, 0x84, 0xe4, 0xf8, 0x12, 0xca, 0xcc, 0x0d, 0xc7, 0x98, 0x6f, 0xb5, 0x77, 0x8b, 0x4f,
- 0xea, 0x2f, 0x9e, 0xa4, 0x27, 0xd2, 0x24, 0xa1, 0xcc, 0x4f, 0x1b, 0x73, 0x3a, 0x63, 0x1e, 0xb6,
- 0x15, 0xde, 0x36, 0x76, 0xdb, 0x7f, 0x51, 0x82, 0x3b, 0x57, 0x01, 0xd0, 0xfd, 0xf8, 0x45, 0xca,
- 0xe7, 0x5b, 0x85, 0xdd, 0xe2, 0x93, 0x8a, 0x79, 0x5b, 0xf2, 0x17, 0x23, 0xb6, 0xba, 0x14, 0xb1,
- 0x03, 0x58, 0x8b, 0x28, 0x0d, 0xf8, 0x56, 0x51, 0x4d, 0xea, 0x7b, 0xef, 0x3b, 0xa9, 0x67, 0xa7,
- 0x94, 0x06, 0xb6, 0xb6, 0xdd, 0xfe, 0x9f, 0x55, 0x28, 0xc9, 0x31, 0xfa, 0xdd, 0xcc, 0xf6, 0xd2,
- 0x7a, 0xf1, 0x83, 0x5b, 0x91, 0xa9, 0x3f, 0xb2, 0xa5, 0x9b, 0x6d, 0xe9, 0x0c, 0x2a, 0x7c, 0xe2,
- 0x32, 0x12, 0x8e, 0xd5, 0xb4, 0x5b, 0x2f, 0x7e, 0x78, 0x3b, 0xba, 0x33, 0x6d, 0xac, 0x18, 0x63,
- 0x26, 0x59, 0x98, 0x3a, 0x80, 0xba, 0xe7, 0xeb, 0x81, 0xac, 0x73, 0x6c, 0x8e, 0xe6, 0x15, 0x5b,
- 0xfe, 0xb4, 0xf6, 0xa0, 0x1a, 0x4f, 0x07, 0x01, 0x94, 0xfb, 0xaf, 0x5e, 0x3b, 0xbd, 0x6e, 0x67,
- 0x05, 0x35, 0xa0, 0xba, 0x77, 0x7c, 0xdc, 0x3f, 0x90, 0xa3, 0x02, 0x6a, 0x01, 0x7c, 0x75, 0x78,
- 0x72, 0xda, 0xb7, 0x07, 0x72, 0xbc, 0x8a, 0xea, 0x50, 0x79, 0x79, 0xdc, 0x3f, 0x97, 0x83, 0xa2,
- 0x35, 0x81, 0x7a, 0x66, 0x0a, 0xe8, 0x2e, 0xa0, 0xee, 0x61, 0xb7, 0x77, 0xb0, 0x37, 0x38, 0xec,
- 0x3a, 0xa7, 0x87, 0xb6, 0xd3, 0x7b, 0x35, 0x78, 0xd9, 0x59, 0x41, 0xdf, 0x84, 0x9d, 0xb3, 0xa3,
- 0x3d, 0xfb, 0xb0, 0xeb, 0xec, 0xff, 0xd4, 0xd9, 0x3b, 0x3e, 0x56, 0x72, 0xf5, 0x63, 0x70, 0x78,
- 0x70, 0xd4, 0x29, 0xa0, 0x5d, 0x78, 0x70, 0x05, 0xe0, 0x6c, 0xef, 0xe4, 0x50, 0x23, 0x56, 0xad,
- 0x3f, 0x29, 0x02, 0x1c, 0x04, 0x2e, 0xe7, 0x64, 0x44, 0x30, 0x53, 0x0d, 0xd2, 0x11, 0x51, 0xd2,
- 0xcd, 0xd6, 0xe8, 0x20, 0x22, 0x3e, 0xda, 0x80, 0x35, 0xea, 0xbc, 0x49, 0xda, 0x66, 0x89, 0xfe,
- 0x84, 0xa8, 0x66, 0x4a, 0x34, 0xd6, 0x2c, 0x08, 0x89, 0xb1, 0x44, 0x61, 0xf5, 0x92, 0x94, 0x88,
- 0xc4, 0xde, 0x83, 0x0a, 0x75, 0xa2, 0x21, 0x11, 0x5c, 0x55, 0x7e, 0xc5, 0x2e, 0xd3, 0x53, 0x39,
- 0x52, 0xfd, 0xd3, 0x28, 0xcc, 0x8e, 0x49, 0xb4, 0xe2, 0x3e, 0x54, 0xb1, 0x98, 0xe8, 0x7d, 0x5b,
- 0x97, 0x7a, 0x05, 0x8b, 0x49, 0xbc, 0x6d, 0xfb, 0x5c, 0x38, 0x53, 0xd7, 0x53, 0x25, 0xde, 0xb0,
- 0xcb, 0x3e, 0x17, 0x27, 0xae, 0x27, 0x15, 0x9c, 0x79, 0x4a, 0x51, 0xd3, 0x0a, 0xce, 0x3c, 0xa9,
- 0x90, 0x49, 0x1e, 0xe9, 0x1b, 0x0b, 0x53, 0xcb, 0x15, 0x12, 0x9d, 0xaa, 0x1b, 0x8b, 0x4d, 0x90,
- 0xd6, 0x0e, 0x89, 0x4c, 0xf1, 0xae, 0xf9, 0x5c, 0xf4, 0x22, 0x29, 0x96, 0x54, 0x24, 0x32, 0x7d,
- 0x6c, 0x8d, 0x33, 0xaf, 0x17, 0x49, 0x22, 0x29, 0x96, 0xd5, 0x6d, 0xea, 0x58, 0x3e, 0x51, 0x36,
- 0x38, 0xa9, 0x92, 0x44, 0x4a, 0xa5, 0x0b, 0x58, 0xce, 0x52, 0xa9, 0x76, 0xa1, 0x21, 0x5f, 0xc5,
- 0x85, 0x3b, 0xd6, 0xfe, 0xb4, 0x75, 0x29, 0x45, 0x17, 0x62, 0xe0, 0xaa, 0x08, 0x5b, 0x7f, 0x04,
- 0x35, 0x79, 0x24, 0xa7, 0xe1, 0xc1, 0x54, 0x75, 0x0c, 0xd7, 0xf7, 0x1d, 0x3a, 0x13, 0x98, 0x49,
- 0x23, 0x15, 0x8b, 0xaa, 0x5d, 0x77, 0x7d, 0xbf, 0x2f, 0x65, 0x03, 0x77, 0x2c, 0xbb, 0x14, 0xc3,
- 0x53, 0xfa, 0x06, 0x67, 0x60, 0xab, 0x0a, 0xd6, 0xd2, 0xf2, 0x04, 0xb9, 0x0b, 0x0d, 0xc1, 0xdc,
- 0xc8, 0x11, 0xd4, 0x99, 0x50, 0xae, 0xb3, 0xb7, 0x6a, 0x83, 0x94, 0x0d, 0xe8, 0x11, 0xe5, 0xc2,
- 0xfa, 0xc7, 0x02, 0x94, 0xf5, 0xd3, 0xd1, 0x23, 0x28, 0x7a, 0xd3, 0xf8, 0x8d, 0x19, 0xa5, 0x2f,
- 0xe1, 0xf1, 0xdc, 0x6c, 0xa9, 0xbe, 0x3a, 0x1d, 0x32, 0x21, 0x2e, 0xe6, 0x42, 0x9c, 0xe6, 0x54,
- 0x69, 0x21, 0xa7, 0x74, 0x9e, 0xac, 0xe5, 0xf3, 0xe4, 0xea, 0x74, 0x48, 0x93, 0xad, 0x92, 0x49,
- 0x36, 0xeb, 0x6f, 0x8a, 0x50, 0x7a, 0x19, 0xd0, 0xb9, 0xea, 0xfe, 0x9e, 0x7c, 0xe3, 0x70, 0xb2,
- 0xdb, 0x71, 0xdb, 0x6e, 0x68, 0x69, 0xef, 0xaa, 0xfd, 0xbf, 0x1d, 0xef, 0xff, 0x9b, 0x50, 0x9e,
- 0x85, 0x44, 0x8a, 0xeb, 0x5a, 0x3c, 0x0b, 0xc9, 0x4d, 0xc7, 0xbc, 0x1d, 0x50, 0xbd, 0x59, 0x07,
- 0x53, 0x6f, 0xad, 0x55, 0x29, 0x50, 0xd9, 0x79, 0x1f, 0xaa, 0xf1, 0x0e, 0xa3, 0x72, 0xad, 0x6d,
- 0x57, 0xcc, 0xee, 0x82, 0xbe, 0x03, 0xed, 0x10, 0x8b, 0x39, 0x65, 0x17, 0xc9, 0x2c, 0xd7, 0x14,
- 0xa2, 0x69, 0xc4, 0xbd, 0xab, 0x8e, 0x9f, 0x65, 0x05, 0xc9, 0x1c, 0x3f, 0x3f, 0x03, 0xf0, 0x92,
- 0x92, 0x35, 0x6f, 0xc1, 0x1b, 0x49, 0xac, 0xd2, 0x6a, 0xb6, 0x33, 0x30, 0xf4, 0x18, 0xca, 0xae,
- 0x8a, 0xa2, 0x79, 0xbb, 0x6d, 0x2f, 0x04, 0xd7, 0x36, 0x6a, 0xb4, 0x0d, 0xd5, 0x88, 0x11, 0xca,
- 0x88, 0x78, 0xab, 0xaa, 0xa8, 0x6d, 0x27, 0xe3, 0xcc, 0x31, 0xb6, 0x91, 0x3b, 0xc6, 0x66, 0x0e,
- 0x50, 0xcd, 0xec, 0x01, 0xca, 0x1a, 0x40, 0x63, 0xf1, 0x84, 0xa0, 0x8f, 0x39, 0x71, 0x84, 0x1a,
- 0x76, 0x55, 0x0b, 0x7a, 0x3e, 0x7a, 0x0c, 0x6d, 0xa3, 0xe4, 0x11, 0xf6, 0xc8, 0x88, 0x78, 0xe6,
- 0xf8, 0xd4, 0xd2, 0xe2, 0x33, 0x23, 0xb5, 0xfe, 0xb5, 0x04, 0xad, 0xfc, 0x55, 0xd4, 0xf5, 0xe7,
- 0xb0, 0xfb, 0x50, 0x65, 0x97, 0xce, 0xf0, 0xad, 0xc0, 0x5c, 0xb1, 0x95, 0xed, 0x0a, 0xbb, 0xdc,
- 0x97, 0x43, 0xb9, 0xcc, 0xec, 0xd2, 0x89, 0xd4, 0x41, 0x4e, 0x27, 0x6d, 0xd9, 0xae, 0xb1, 0x4b,
- 0x7d, 0xb2, 0xe3, 0xaa, 0xc4, 0x2e, 0x9d, 0x99, 0xe7, 0xca, 0xaa, 0x36, 0xa0, 0x92, 0x02, 0xb5,
- 0xd8, 0xe5, 0x6b, 0x29, 0xce, 0x23, 0xa7, 0x39, 0xe4, 0x5a, 0x8c, 0x3c, 0x59, 0x46, 0x0e, 0x73,
- 0xc8, 0x72, 0x8c, 0xdc, 0x5f, 0x46, 0xea, 0x77, 0xf0, 0x18, 0x59, 0x89, 0x91, 0xea, 0x9d, 0x3a,
- 0x46, 0xde, 0x87, 0xaa, 0x88, 0x3d, 0xac, 0x6a, 0x0f, 0x45, 0xea, 0xa1, 0x48, 0x3d, 0xac, 0x69,
- 0x0f, 0x45, 0xd6, 0x43, 0xb1, 0xe8, 0x21, 0xe8, 0x67, 0x88, 0x25, 0x0f, 0xc5, 0xa2, 0x87, 0xf5,
- 0x18, 0x79, 0xb2, 0x8c, 0xcc, 0x7b, 0xd8, 0x88, 0x91, 0xfb, 0xcb, 0xc8, 0xbc, 0x87, 0xcd, 0x18,
- 0x99, 0xf3, 0xd0, 0x82, 0x26, 0xbb, 0x74, 0x3c, 0xe6, 0x69, 0x34, 0x57, 0xfd, 0xb5, 0x6c, 0xd7,
- 0xd9, 0xe5, 0x01, 0xf3, 0x14, 0x52, 0xb9, 0x3a, 0x24, 0x51, 0x0c, 0x68, 0x6b, 0x57, 0x87, 0x24,
- 0x32, 0xea, 0x07, 0x50, 0x13, 0x64, 0x8a, 0xb9, 0x70, 0xa7, 0x91, 0x3a, 0xe9, 0x56, 0xec, 0x54,
- 0x20, 0x5f, 0xd7, 0x5b, 0xf9, 0x1b, 0xca, 0x6c, 0xf1, 0x17, 0x72, 0xc5, 0xff, 0xe1, 0x09, 0xf5,
- 0xe1, 0x81, 0xba, 0x79, 0xf6, 0x5f, 0x42, 0x33, 0x77, 0xa5, 0x79, 0x7d, 0x31, 0xdc, 0x85, 0xb2,
- 0x7c, 0x21, 0x9f, 0x71, 0x73, 0x9a, 0x33, 0x23, 0xeb, 0x0f, 0x61, 0xe3, 0x8a, 0xab, 0xcd, 0x5b,
- 0xbf, 0x47, 0xa5, 0xf4, 0xc5, 0x1c, 0xfd, 0x7f, 0x16, 0x00, 0x2d, 0xdf, 0x7a, 0x7e, 0xc8, 0x95,
- 0x48, 0x40, 0xb9, 0x93, 0x7b, 0x44, 0x2d, 0xa0, 0xfc, 0x4c, 0x09, 0xb4, 0x7a, 0x18, 0xab, 0x4b,
- 0xb1, 0x7a, 0x68, 0xd4, 0x4f, 0xa0, 0x13, 0xd0, 0xc8, 0x73, 0xa6, 0x84, 0x27, 0x1c, 0xfa, 0x2d,
- 0xa4, 0x25, 0xe5, 0x27, 0x84, 0xc7, 0x44, 0x9f, 0xc2, 0xa6, 0x41, 0x9a, 0x84, 0x8b, 0xe1, 0x65,
- 0xfd, 0xe6, 0xa3, 0xe1, 0x3a, 0xf1, 0xb4, 0x89, 0x85, 0x61, 0xe7, 0x86, 0xcb, 0xd8, 0x8f, 0xb6,
- 0x90, 0x7f, 0x59, 0x80, 0xed, 0xeb, 0x6f, 0x66, 0x3f, 0xd6, 0x63, 0xd0, 0x67, 0x70, 0x97, 0x84,
- 0xf2, 0xd5, 0x11, 0x3b, 0x43, 0x22, 0xcc, 0x1a, 0x30, 0x57, 0x60, 0xb3, 0x83, 0x6f, 0x18, 0xed,
- 0x3e, 0x11, 0x6a, 0x11, 0x6c, 0x57, 0x60, 0xeb, 0x57, 0x7a, 0x6e, 0xd7, 0x5c, 0xec, 0x7e, 0xb4,
- 0xb9, 0xdd, 0x81, 0x35, 0x75, 0xc5, 0x1c, 0x1f, 0x26, 0xd4, 0x40, 0xb2, 0x87, 0x78, 0xee, 0xe0,
- 0xaf, 0xe3, 0xe3, 0x44, 0x39, 0xc4, 0xf3, 0xc3, 0xaf, 0x7d, 0x6b, 0x02, 0x0f, 0x6f, 0xbe, 0x16,
- 0xfe, 0x68, 0xb1, 0xf9, 0xab, 0x82, 0xce, 0x81, 0x6b, 0x2e, 0x8a, 0xff, 0x7f, 0x83, 0xf3, 0xcb,
- 0x02, 0x58, 0xef, 0xbe, 0x74, 0xfe, 0xbf, 0x0d, 0x92, 0x75, 0xaa, 0x62, 0x71, 0xc3, 0xe5, 0xf4,
- 0x6d, 0x9f, 0x6f, 0xbd, 0x82, 0x07, 0x37, 0xdd, 0x45, 0xdf, 0x9a, 0xef, 0xbf, 0x0b, 0x50, 0x3b,
- 0xf3, 0x26, 0xd8, 0x9f, 0x05, 0x98, 0xa1, 0x4f, 0xa0, 0xe6, 0x13, 0x86, 0xf5, 0xa9, 0x49, 0xbf,
- 0x96, 0xa6, 0x47, 0xe2, 0x6e, 0xac, 0xb1, 0x53, 0x10, 0xfa, 0x5c, 0x9d, 0xdc, 0x89, 0xfc, 0xed,
- 0x06, 0xce, 0x70, 0x6e, 0xde, 0x3e, 0xd3, 0x0b, 0xb2, 0xbd, 0x44, 0xbb, 0x7f, 0x6e, 0x37, 0x52,
- 0xec, 0xfe, 0x3c, 0x77, 0xee, 0x2a, 0x9a, 0xbb, 0x93, 0xcc, 0xb9, 0x6b, 0x8e, 0xc9, 0x78, 0x12,
- 0x2f, 0xa8, 0x19, 0xa1, 0x2f, 0xa0, 0xc1, 0xe5, 0x74, 0x9d, 0x88, 0x06, 0xc4, 0xd3, 0xb7, 0x2a,
- 0xad, 0xcc, 0x87, 0x3e, 0xe3, 0x0b, 0x09, 0xc7, 0xa7, 0x0a, 0x60, 0xd7, 0x15, 0x5c, 0x0f, 0xac,
- 0x7f, 0x28, 0x00, 0x1a, 0x30, 0x77, 0x34, 0x22, 0xde, 0xd9, 0xc4, 0x8d, 0x48, 0x38, 0x56, 0x17,
- 0x53, 0x1d, 0x28, 0x7a, 0x84, 0x99, 0x05, 0x93, 0x3f, 0x95, 0x64, 0xc8, 0xcd, 0x52, 0xc9, 0x9f,
- 0xf1, 0x6d, 0x5e, 0x31, 0xb9, 0xcd, 0x53, 0x92, 0x21, 0x4f, 0xee, 0xf7, 0x34, 0x66, 0x4c, 0x98,
- 0xa9, 0x47, 0xf9, 0x13, 0x1d, 0x00, 0xc8, 0x17, 0x9b, 0x61, 0xfa, 0x55, 0xa8, 0x95, 0xf9, 0xaa,
- 0xd0, 0x0b, 0x47, 0x98, 0x31, 0xec, 0xc7, 0x6b, 0xb4, 0x7f, 0x9e, 0x46, 0xd2, 0xae, 0xba, 0xbe,
- 0xbf, 0x2f, 0xfb, 0x89, 0xf5, 0x1f, 0x05, 0x58, 0x1b, 0x78, 0x34, 0x14, 0x1f, 0x10, 0x9f, 0xec,
- 0xd9, 0x5c, 0x7b, 0x93, 0x9c, 0xcd, 0x3f, 0x81, 0x1a, 0x8f, 0x23, 0x6f, 0xee, 0x35, 0xd1, 0xe2,
- 0x3a, 0x62, 0x66, 0xa7, 0x20, 0x74, 0x02, 0x77, 0x84, 0x5e, 0x3d, 0x87, 0xeb, 0xe5, 0x73, 0x48,
- 0x38, 0xa2, 0xe6, 0xa2, 0x3d, 0xfd, 0xde, 0xb7, 0xbc, 0xc4, 0x36, 0x12, 0x4b, 0x32, 0xeb, 0xcf,
- 0x0a, 0x50, 0x56, 0x7e, 0xf1, 0x5b, 0x97, 0x61, 0xfa, 0xfe, 0x62, 0xea, 0x2d, 0x79, 0x7f, 0x89,
- 0x4f, 0xe5, 0x6b, 0xb9, 0x6b, 0xcd, 0xef, 0x40, 0x59, 0xa8, 0x27, 0x99, 0x9b, 0x9b, 0x56, 0x3a,
- 0x57, 0x29, 0xb6, 0x8d, 0xd6, 0xfa, 0x01, 0x6c, 0x0e, 0x5c, 0x12, 0x74, 0x19, 0x8d, 0xba, 0x84,
- 0x7b, 0x2e, 0xf3, 0x0f, 0x68, 0x38, 0x22, 0x63, 0xb9, 0xd5, 0x7e, 0x3d, 0xc3, 0x33, 0xec, 0x70,
- 0xf2, 0x8b, 0xf8, 0xa2, 0xb9, 0xa6, 0x24, 0x67, 0xe4, 0x17, 0xd8, 0xfa, 0xd3, 0x02, 0x74, 0x6c,
- 0xec, 0xe7, 0x6d, 0xbe, 0x05, 0xcd, 0x29, 0x09, 0x1d, 0x31, 0x61, 0x98, 0x4f, 0x68, 0x10, 0xbb,
- 0xd6, 0x98, 0x92, 0x70, 0x10, 0xcb, 0x14, 0xc8, 0xbd, 0xcc, 0x80, 0x56, 0x0d, 0xc8, 0xbd, 0x4c,
- 0x41, 0x8f, 0xa1, 0x2d, 0x41, 0x11, 0xa3, 0x43, 0x77, 0x48, 0x82, 0xb4, 0x60, 0x5a, 0x53, 0xf7,
- 0xf2, 0x34, 0x95, 0x5a, 0x7f, 0x5b, 0x80, 0xf5, 0xf3, 0xa5, 0x89, 0x3c, 0x87, 0xb5, 0x31, 0xc3,
- 0x38, 0x34, 0x6f, 0xb9, 0x69, 0xb5, 0x2c, 0x22, 0x6d, 0x8d, 0x43, 0x9f, 0x42, 0xf9, 0x2d, 0x0e,
- 0x02, 0x3a, 0x37, 0x5f, 0x80, 0x6e, 0xb0, 0x30, 0x40, 0xf4, 0x5d, 0x28, 0x32, 0x1c, 0x7f, 0xfa,
- 0xbd, 0x01, 0x2f, 0x51, 0xd6, 0xbf, 0xaf, 0x42, 0x33, 0x3f, 0xc5, 0xdf, 0x86, 0x96, 0xaf, 0x05,
- 0x71, 0x65, 0xeb, 0xf4, 0xbe, 0x9b, 0x49, 0x6f, 0xa5, 0x36, 0x65, 0xdd, 0xf4, 0xb3, 0x43, 0xf4,
- 0x53, 0xd8, 0x12, 0x2e, 0x09, 0x1c, 0x9f, 0xd1, 0xc8, 0x89, 0x89, 0x3c, 0x45, 0x6d, 0x5c, 0x78,
- 0x98, 0x46, 0xfc, 0xaa, 0x00, 0x1f, 0xad, 0xd8, 0x9b, 0xe2, 0xca, 0xc8, 0xf7, 0x00, 0x31, 0xec,
- 0x2f, 0x92, 0xbe, 0xcb, 0xcf, 0xa3, 0x15, 0xbb, 0xc3, 0x16, 0xe3, 0x70, 0x0c, 0x1b, 0xf3, 0x2b,
- 0xb8, 0x16, 0xff, 0xa1, 0xe2, 0xfc, 0x0a, 0xb2, 0xf5, 0xf9, 0x22, 0xdb, 0x7e, 0x27, 0x5d, 0x32,
- 0x4d, 0x64, 0x55, 0x60, 0xed, 0x70, 0x1a, 0x89, 0xb7, 0x4f, 0xbf, 0x80, 0x5a, 0xd2, 0x0d, 0x50,
- 0x03, 0xaa, 0xaf, 0x4f, 0xcf, 0x06, 0xf6, 0xe1, 0xde, 0x49, 0x67, 0x05, 0xb5, 0x00, 0xba, 0xfd,
- 0xf3, 0x57, 0x66, 0x5c, 0x40, 0xeb, 0xd0, 0xdc, 0xef, 0x75, 0x7b, 0xf6, 0xe1, 0xc1, 0xa0, 0xd7,
- 0x7f, 0xb5, 0x77, 0xdc, 0x59, 0x7d, 0xfa, 0x23, 0xe8, 0x2c, 0xb6, 0x51, 0x54, 0x81, 0xe2, 0xb9,
- 0x6d, 0x77, 0x56, 0x10, 0x82, 0xd6, 0x99, 0x60, 0xc4, 0x13, 0xa7, 0xa6, 0x55, 0x77, 0x0a, 0x08,
- 0xa0, 0x7c, 0xf4, 0x76, 0xc8, 0x88, 0xdf, 0x59, 0x7d, 0x1a, 0x42, 0x23, 0xdb, 0xf2, 0xd1, 0x26,
- 0xac, 0x67, 0xc7, 0xce, 0x2b, 0x1a, 0xe2, 0xce, 0x0a, 0xda, 0x80, 0x76, 0x5e, 0xbc, 0xd7, 0x29,
- 0xa0, 0x1d, 0xb8, 0x97, 0x13, 0xee, 0x63, 0x2e, 0x0e, 0x47, 0x23, 0xca, 0x44, 0x67, 0x75, 0x89,
- 0x68, 0x6f, 0x26, 0x68, 0xa7, 0xf8, 0xf4, 0xc7, 0x49, 0x26, 0x99, 0x99, 0x36, 0xa0, 0x1a, 0x47,
- 0xb8, 0xb3, 0x82, 0x9a, 0x50, 0x3b, 0x4f, 0x86, 0x05, 0xe9, 0x86, 0x8d, 0xfd, 0xce, 0x2a, 0xaa,
- 0x42, 0x49, 0x2e, 0x73, 0xa7, 0xf8, 0xf4, 0xaf, 0x0b, 0xf0, 0xe0, 0xa6, 0x46, 0x8c, 0xbe, 0x0d,
- 0xbf, 0x76, 0x93, 0x3e, 0xf6, 0xe8, 0x09, 0x3c, 0xba, 0x11, 0xb6, 0xc7, 0xf9, 0x8c, 0x61, 0xbf,
- 0x53, 0x40, 0xdf, 0x85, 0xc7, 0x37, 0x22, 0xb3, 0x6e, 0xbf, 0xf8, 0xbb, 0x3a, 0x54, 0xfa, 0x3a,
- 0x31, 0x50, 0x17, 0xa0, 0x4b, 0xb8, 0x3b, 0x0c, 0x70, 0x3f, 0x10, 0x28, 0xed, 0x61, 0x2a, 0xe8,
- 0xdb, 0x0b, 0x63, 0xeb, 0xee, 0x2f, 0xff, 0xed, 0xbf, 0x7e, 0xb5, 0xda, 0xb1, 0xea, 0xcf, 0xdf,
- 0x7c, 0xfa, 0xdc, 0xd8, 0x7d, 0x5e, 0x78, 0x8a, 0x5e, 0x42, 0xdd, 0xc6, 0x38, 0x7c, 0x5f, 0x9a,
- 0x7b, 0x8a, 0x66, 0xdd, 0x6a, 0x48, 0x9a, 0xd8, 0x50, 0xf2, 0x1c, 0x42, 0xdd, 0x9c, 0x6c, 0x70,
- 0x3f, 0x9c, 0xa1, 0x46, 0xf6, 0x63, 0xf9, 0x12, 0xcb, 0x96, 0x62, 0x41, 0x56, 0x53, 0xb2, 0x1c,
- 0xea, 0x87, 0x87, 0x33, 0x49, 0x73, 0x04, 0xcd, 0x2e, 0x76, 0xdf, 0x9b, 0xe8, 0xbe, 0x22, 0xda,
- 0xb0, 0x5a, 0x19, 0xaf, 0x0c, 0xd3, 0x01, 0xd4, 0xba, 0x38, 0xc0, 0xb7, 0x9e, 0x4e, 0x62, 0x24,
- 0x49, 0x7a, 0x00, 0xe6, 0x1b, 0x5d, 0x7f, 0x26, 0x50, 0x27, 0xf7, 0x6f, 0x47, 0x27, 0x7c, 0x7c,
- 0xf3, 0x7c, 0x52, 0x4b, 0x49, 0xd5, 0x87, 0x46, 0xf2, 0x85, 0x4e, 0x92, 0xa1, 0xdc, 0xbf, 0x13,
- 0x28, 0xf1, 0x12, 0xdd, 0x8e, 0xa2, 0xdb, 0xb4, 0x3a, 0x8a, 0x2e, 0x63, 0x2d, 0x09, 0x7f, 0x1f,
- 0xda, 0xd9, 0x4f, 0x71, 0x92, 0x33, 0x3d, 0x68, 0x65, 0x35, 0x4b, 0xb4, 0x0f, 0x15, 0xed, 0x96,
- 0xb5, 0x21, 0x69, 0x17, 0x38, 0x24, 0xf3, 0x97, 0x50, 0x79, 0x19, 0xd0, 0xf9, 0x9e, 0xef, 0xa3,
- 0x66, 0xee, 0x3f, 0x98, 0x6e, 0xce, 0x2a, 0x63, 0xa3, 0xb3, 0x0a, 0xe4, 0xc8, 0x56, 0x57, 0xb1,
- 0xef, 0x22, 0xc9, 0x2d, 0x5a, 0x6a, 0x26, 0x79, 0xce, 0xa0, 0x95, 0x7c, 0xe7, 0x3d, 0x98, 0x60,
- 0xef, 0x62, 0x29, 0x41, 0xd3, 0x65, 0x4c, 0x80, 0xd6, 0x37, 0x14, 0xe1, 0x3d, 0x0b, 0x49, 0xc2,
- 0xbc, 0xbd, 0x24, 0x3d, 0x81, 0xba, 0xce, 0xb9, 0x53, 0x1a, 0xf6, 0x46, 0x99, 0x40, 0x24, 0x1f,
- 0x9e, 0x97, 0xa6, 0xb8, 0xad, 0x18, 0xef, 0x58, 0xed, 0x34, 0x61, 0x95, 0xb1, 0x09, 0xac, 0xc9,
- 0xbc, 0xf7, 0xe7, 0xcb, 0x05, 0x36, 0x6b, 0x2d, 0x09, 0x6d, 0x68, 0x7e, 0x85, 0x45, 0xe6, 0x53,
- 0xe9, 0xa2, 0xcf, 0x1b, 0x57, 0x7c, 0xcd, 0xb1, 0x1e, 0x28, 0xca, 0xbb, 0xd6, 0xba, 0xa4, 0xcc,
- 0xd9, 0x4b, 0xce, 0x1f, 0x43, 0xd9, 0xc6, 0x43, 0x4a, 0xdf, 0x5d, 0xe1, 0x9b, 0x8a, 0xa7, 0x6d,
- 0x81, 0xae, 0x70, 0x69, 0x23, 0x09, 0x5e, 0xc3, 0xfa, 0x01, 0x0d, 0x02, 0xec, 0x65, 0x6f, 0x1d,
- 0xdf, 0xc5, 0xb5, 0xab, 0xb8, 0xb6, 0xad, 0x4d, 0xc9, 0xb5, 0x64, 0x2e, 0x69, 0x8f, 0xa1, 0x71,
- 0xc0, 0xb0, 0x2b, 0xb0, 0x39, 0xfa, 0xb5, 0xf3, 0x47, 0x31, 0x7e, 0xf3, 0xca, 0x65, 0x4d, 0x0d,
- 0x9b, 0xce, 0x9d, 0x0f, 0x62, 0xcb, 0x9a, 0x4a, 0xb6, 0x1f, 0x41, 0x47, 0x87, 0x3a, 0xd3, 0xfe,
- 0xaf, 0x0f, 0x45, 0x0a, 0xb2, 0x56, 0x3e, 0x29, 0xec, 0x3f, 0xfb, 0xd9, 0x6f, 0x8c, 0x89, 0x98,
- 0xcc, 0x86, 0xcf, 0x3c, 0x3a, 0x55, 0xff, 0x25, 0xea, 0x51, 0xe6, 0x3f, 0xd7, 0xff, 0x3c, 0xfa,
- 0x3d, 0xf3, 0xcf, 0xa3, 0x63, 0x1a, 0xff, 0xff, 0xe8, 0xb0, 0xac, 0x44, 0x9f, 0xfd, 0x6f, 0x00,
- 0x00, 0x00, 0xff, 0xff, 0x0c, 0xec, 0x7d, 0xd0, 0x5f, 0x2a, 0x00, 0x00,
+ // 2989 bytes of a gzipped FileDescriptorProto
+ 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xc4, 0x5a, 0xdd, 0x72, 0x1b, 0xc7,
+ 0xb1, 0x16, 0x48, 0x10, 0x0b, 0x34, 0x7e, 0x48, 0x0d, 0xc5, 0x1f, 0x91, 0xb4, 0xcc, 0xda, 0xa3,
+ 0x63, 0xeb, 0xfc, 0x58, 0xb2, 0x65, 0xd7, 0x39, 0xb1, 0x93, 0x4a, 0x4c, 0x11, 0x94, 0x89, 0x44,
+ 0x14, 0x98, 0x25, 0x65, 0x25, 0x4e, 0xa5, 0xd6, 0xcb, 0xdd, 0x01, 0x30, 0xc5, 0xc5, 0xce, 0x7a,
+ 0x67, 0x40, 0x52, 0x95, 0x3b, 0x27, 0x79, 0x81, 0xb8, 0x72, 0x91, 0x54, 0xe5, 0x09, 0xf2, 0x02,
+ 0xa9, 0xca, 0xa5, 0x6f, 0x53, 0xb9, 0xc9, 0x03, 0xe4, 0x26, 0x8f, 0x91, 0x8b, 0xd4, 0xf4, 0xcc,
+ 0x2e, 0x76, 0x01, 0x90, 0x12, 0x1d, 0xa5, 0x72, 0xc3, 0xda, 0xe9, 0xfe, 0xfa, 0x9b, 0xe9, 0x99,
+ 0xee, 0x9e, 0x1f, 0x02, 0x36, 0xcf, 0x78, 0x28, 0x07, 0x9e, 0x1b, 0x27, 0x5c, 0x72, 0xf1, 0x80,
+ 0xc7, 0x34, 0xe2, 0xa1, 0xbc, 0x8f, 0x4d, 0x62, 0x99, 0xe6, 0xc6, 0x56, 0x9f, 0xf3, 0x7e, 0x48,
+ 0x1f, 0x78, 0x31, 0x7b, 0xe0, 0x45, 0x11, 0x97, 0x9e, 0x64, 0x3c, 0x12, 0x1a, 0xb6, 0xb1, 0x5d,
+ 0xe4, 0x90, 0xd4, 0x1f, 0xa8, 0xef, 0x1e, 0x0b, 0xa9, 0x46, 0xd8, 0x7f, 0x2a, 0x03, 0x74, 0xa2,
+ 0x80, 0xf9, 0x68, 0x47, 0xde, 0x03, 0x8b, 0x87, 0xd2, 0x65, 0x51, 0xb0, 0x5e, 0xda, 0x2e, 0xdd,
+ 0xab, 0x3f, 0x5c, 0xbd, 0x9f, 0x76, 0xdc, 0x0d, 0xe5, 0x18, 0xb8, 0x7f, 0xc3, 0xa9, 0x70, 0x14,
+ 0x90, 0x0f, 0xa0, 0xca, 0x22, 0xd9, 0x43, 0x9b, 0x39, 0xb4, 0x59, 0xcb, 0x6c, 0x3a, 0x91, 0xec,
+ 0x15, 0x8c, 0x2c, 0xa6, 0x25, 0x64, 0x07, 0x9a, 0x68, 0xc5, 0x63, 0x9a, 0xa0, 0xe9, 0x3c, 0x9a,
+ 0x6e, 0x16, 0x4c, 0xbb, 0x31, 0x4d, 0x0a, 0xe6, 0x75, 0x36, 0x96, 0x92, 0xef, 0x42, 0x83, 0x47,
+ 0x23, 0x37, 0x60, 0xc2, 0x47, 0x86, 0x32, 0x32, 0x6c, 0x8c, 0x07, 0x1c, 0x8d, 0xda, 0x4c, 0xf8,
+ 0x05, 0x02, 0xe0, 0x99, 0x10, 0x7d, 0x8d, 0x46, 0x68, 0xba, 0x30, 0xe9, 0x6b, 0x34, 0x9a, 0xf0,
+ 0x15, 0x05, 0xca, 0x57, 0x3e, 0xf4, 0x19, 0xda, 0x54, 0x26, 0x7c, 0xed, 0x0e, 0x7d, 0x56, 0xf4,
+ 0x95, 0x6b, 0x09, 0xf9, 0x00, 0xac, 0xf8, 0x54, 0x4f, 0xaa, 0x85, 0x46, 0xb7, 0x33, 0xa3, 0x43,
+ 0xcf, 0x3f, 0xa5, 0x13, 0xf3, 0x1a, 0x9f, 0xe2, 0xbc, 0x7e, 0x0b, 0x20, 0xe6, 0x89, 0x74, 0x85,
+ 0xf4, 0xa4, 0x58, 0xaf, 0x4e, 0xf4, 0x76, 0xc8, 0x13, 0x79, 0xa4, 0x16, 0x5b, 0x48, 0xe6, 0x8b,
+ 0xfd, 0x1b, 0x4e, 0x2d, 0x36, 0x12, 0xa1, 0x2c, 0x7b, 0x21, 0x3f, 0x37, 0x96, 0xb5, 0x09, 0xcb,
+ 0xc7, 0x21, 0x3f, 0x2f, 0x5a, 0xf6, 0x8c, 0x44, 0x90, 0xff, 0x87, 0x9a, 0x17, 0x7a, 0xc9, 0x10,
+ 0xc7, 0x0a, 0x68, 0xb8, 0x9e, 0x19, 0xee, 0x28, 0x4d, 0x61, 0xa8, 0x55, 0xcf, 0x88, 0x1e, 0x55,
+ 0xa0, 0x1c, 0x78, 0xd2, 0xb3, 0x7f, 0x6f, 0xc1, 0xe2, 0x04, 0x4e, 0xcd, 0x73, 0xc8, 0xc5, 0xcc,
+ 0x98, 0x7a, 0xc2, 0x45, 0xd1, 0xf7, 0x10, 0x05, 0xa4, 0x0d, 0xad, 0xe0, 0x05, 0x8b, 0xfa, 0x6e,
+ 0xdf, 0x13, 0x71, 0x2e, 0xb2, 0xb6, 0x32, 0xcb, 0xb6, 0x52, 0x7f, 0xe2, 0x89, 0xb8, 0x60, 0xdf,
+ 0x08, 0x72, 0x62, 0x15, 0x63, 0x6a, 0x81, 0xc7, 0x1e, 0x4d, 0xc6, 0x58, 0x37, 0x1a, 0x4d, 0x3b,
+ 0x55, 0xe7, 0x63, 0x29, 0x79, 0x0e, 0xb7, 0x14, 0x85, 0x90, 0x5e, 0x22, 0x47, 0xb1, 0xdb, 0xf3,
+ 0x58, 0x98, 0x8b, 0xb5, 0xbb, 0x79, 0xa6, 0x23, 0x8d, 0x79, 0xec, 0xb1, 0x70, 0x94, 0xd0, 0x02,
+ 0xe5, 0x4d, 0x5e, 0x50, 0x2b, 0xe2, 0xcf, 0x60, 0x15, 0x89, 0x59, 0x3f, 0xf2, 0x42, 0x37, 0xa0,
+ 0xfd, 0xc4, 0x0b, 0x68, 0x2e, 0x16, 0xff, 0xa3, 0x40, 0x8d, 0xa8, 0xb6, 0x06, 0x15, 0x98, 0x97,
+ 0xf9, 0xb4, 0x96, 0xfc, 0x04, 0xd6, 0x30, 0x31, 0x12, 0xd6, 0x93, 0x2e, 0xef, 0xb9, 0xe7, 0x2c,
+ 0x0a, 0xf8, 0x79, 0x2e, 0x68, 0x0b, 0xe4, 0x6d, 0x05, 0xeb, 0xf6, 0x9e, 0x23, 0x68, 0x8a, 0x7c,
+ 0x52, 0x4b, 0x8e, 0x41, 0x79, 0xe3, 0x86, 0x5c, 0x08, 0x37, 0xcb, 0x05, 0x1d, 0xd6, 0x6f, 0xe7,
+ 0x69, 0x9f, 0x70, 0x21, 0xba, 0x3d, 0x95, 0x14, 0xbb, 0x03, 0x2f, 0x8a, 0x68, 0x58, 0xa0, 0x6e,
+ 0x71, 0x83, 0x30, 0x29, 0x92, 0xce, 0x33, 0xba, 0x22, 0xc6, 0xf3, 0x5c, 0x9d, 0x31, 0xcf, 0x1a,
+ 0x73, 0xe9, 0x3c, 0x8f, 0xd5, 0x8a, 0xb8, 0xab, 0x8b, 0x84, 0x64, 0xe7, 0x7a, 0xa4, 0x3a, 0x1b,
+ 0xfe, 0x27, 0x4f, 0x78, 0x9c, 0x78, 0x91, 0x18, 0x32, 0x21, 0x18, 0x8f, 0x3a, 0x91, 0xa4, 0x49,
+ 0x8f, 0x26, 0x34, 0xf2, 0xe9, 0x73, 0x2f, 0x89, 0x58, 0xd4, 0x37, 0x55, 0xe3, 0x98, 0x9d, 0xe3,
+ 0x48, 0x3f, 0xd7, 0x93, 0xeb, 0xf9, 0x92, 0x9d, 0x61, 0xbf, 0xe3, 0xc1, 0xc2, 0xf4, 0x2c, 0xec,
+ 0x64, 0xb0, 0x59, 0xe3, 0x55, 0x3e, 0x17, 0x11, 0xba, 0x87, 0x75, 0xd5, 0x43, 0x9c, 0x70, 0x9f,
+ 0x0a, 0xa1, 0xb2, 0x80, 0x26, 0x09, 0xd7, 0x55, 0xb2, 0x8e, 0x5d, 0xfc, 0x67, 0xbe, 0x8b, 0xc3,
+ 0x0c, 0xb7, 0xa7, 0x60, 0x85, 0x0e, 0x56, 0xf8, 0x2c, 0x7d, 0x96, 0xad, 0xf7, 0xa1, 0x59, 0xa8,
+ 0xea, 0xe4, 0x0d, 0x00, 0x2c, 0xc8, 0xaa, 0x72, 0x50, 0xcc, 0xd6, 0x9a, 0x53, 0x53, 0x12, 0x55,
+ 0x1e, 0xa8, 0xbd, 0x0f, 0xad, 0x62, 0x45, 0x27, 0x6b, 0x60, 0xe9, 0xe2, 0xaf, 0x73, 0xdb, 0x72,
+ 0x2a, 0x58, 0xe0, 0x83, 0x09, 0xa6, 0xb9, 0x49, 0xa6, 0x01, 0xdc, 0x9c, 0x2a, 0xcf, 0x97, 0x93,
+ 0x7d, 0x04, 0x4d, 0x41, 0x13, 0xe6, 0x85, 0x6e, 0x34, 0x1a, 0x9e, 0xd0, 0xc4, 0x54, 0x83, 0x95,
+ 0x6c, 0x1a, 0x8e, 0x50, 0xfb, 0x14, 0x95, 0x4e, 0x43, 0xe4, 0x5a, 0xf6, 0x1f, 0x4b, 0xd0, 0x2c,
+ 0x94, 0xf3, 0xcb, 0xbb, 0x59, 0x81, 0x0a, 0x6e, 0x08, 0xba, 0xda, 0x58, 0xce, 0x82, 0xaa, 0xfa,
+ 0x93, 0xae, 0xcc, 0x4f, 0xb8, 0x42, 0xde, 0x84, 0xba, 0x17, 0x0c, 0x59, 0x64, 0xf4, 0x0b, 0xa8,
+ 0x07, 0x14, 0x69, 0xc0, 0xd4, 0xe8, 0xcb, 0xaf, 0x3e, 0xfa, 0xcf, 0x81, 0x4c, 0x6f, 0x84, 0x84,
+ 0x40, 0x59, 0xbe, 0x88, 0xd3, 0x05, 0xc2, 0xef, 0xbc, 0x57, 0x73, 0x57, 0xac, 0xc4, 0xe4, 0xf0,
+ 0x6d, 0x07, 0x5a, 0xc5, 0x9d, 0xeb, 0xda, 0xf3, 0xb3, 0x04, 0xf3, 0xf1, 0xa9, 0x44, 0xe6, 0x86,
+ 0xa3, 0x3e, 0xed, 0xaf, 0x4b, 0xb0, 0x34, 0xb9, 0xb3, 0x91, 0x4d, 0xa8, 0x21, 0x2d, 0x8e, 0x5c,
+ 0xcf, 0x12, 0x1e, 0x1c, 0x8e, 0x27, 0x46, 0x3f, 0x15, 0x47, 0x7d, 0x3a, 0xc4, 0x8d, 0x30, 0xeb,
+ 0xb7, 0x66, 0x24, 0x9d, 0x40, 0xd9, 0xe1, 0x56, 0xc7, 0x74, 0x71, 0xb7, 0x9c, 0x8a, 0x6a, 0x6a,
+ 0x05, 0x1a, 0x45, 0x1c, 0x6b, 0x9e, 0xe5, 0x54, 0x54, 0xf3, 0x29, 0x27, 0xab, 0x50, 0xf1, 0x39,
+ 0x3f, 0x65, 0x14, 0x8b, 0x56, 0xc5, 0x31, 0xad, 0xd4, 0x8b, 0xf2, 0xd8, 0x8b, 0xbb, 0x50, 0xd3,
+ 0xe5, 0xc0, 0xf3, 0x2f, 0x1f, 0xa0, 0xfd, 0x1d, 0xa8, 0xed, 0x53, 0x2f, 0x91, 0x27, 0xd4, 0x93,
+ 0xe4, 0x01, 0x2c, 0x0f, 0xd2, 0x86, 0x2e, 0x66, 0x72, 0x94, 0x50, 0x63, 0x41, 0x32, 0xd5, 0x51,
+ 0xaa, 0xb1, 0x7f, 0x5e, 0x82, 0xf9, 0x6e, 0x34, 0xba, 0xf6, 0x9c, 0x4f, 0xc5, 0xd4, 0xfc, 0x2b,
+ 0xc7, 0x14, 0x7a, 0xca, 0x74, 0x14, 0x5a, 0x8e, 0xfa, 0xb4, 0x7f, 0x00, 0x96, 0x8a, 0x81, 0x03,
+ 0xd1, 0x7f, 0x0d, 0x8b, 0xff, 0xcb, 0x12, 0xd4, 0x54, 0x59, 0xc2, 0xf5, 0xbf, 0x36, 0x5f, 0x6e,
+ 0xdd, 0xca, 0x85, 0x75, 0x2b, 0x06, 0xc2, 0xc2, 0x64, 0x20, 0x4c, 0x8f, 0xe3, 0x43, 0x68, 0x3c,
+ 0x8b, 0x43, 0x16, 0x9d, 0xbe, 0x6c, 0x24, 0xc6, 0x74, 0x6e, 0x6c, 0xfa, 0xab, 0x1a, 0x40, 0x9b,
+ 0x9e, 0x31, 0x9f, 0x76, 0xa2, 0x1e, 0x86, 0xcc, 0x19, 0x8d, 0x02, 0x9e, 0x98, 0x84, 0x33, 0x2d,
+ 0x72, 0x0b, 0x16, 0x86, 0x3c, 0xa0, 0xa1, 0x29, 0x6f, 0xba, 0x41, 0xfe, 0x0b, 0x96, 0x06, 0x5e,
+ 0x12, 0x9c, 0x7b, 0x09, 0x75, 0xcf, 0x68, 0xa2, 0x76, 0x15, 0x93, 0x75, 0x8b, 0xa9, 0xfc, 0x53,
+ 0x2d, 0x56, 0xd0, 0x1e, 0x4b, 0x86, 0x05, 0x68, 0x59, 0x43, 0x53, 0x79, 0x0a, 0xdd, 0x84, 0x5a,
+ 0x80, 0x23, 0x52, 0xe3, 0x5f, 0xd2, 0xd9, 0xa3, 0x05, 0x9d, 0x80, 0xbc, 0x0b, 0xb7, 0x8c, 0xb2,
+ 0x18, 0x14, 0x37, 0x11, 0x47, 0xb4, 0x2e, 0x1f, 0x11, 0x8a, 0x2e, 0xe6, 0x91, 0xab, 0x26, 0x4f,
+ 0xac, 0x37, 0x70, 0x3a, 0xaa, 0x31, 0x8f, 0xd4, 0xa9, 0x52, 0x90, 0x3b, 0x00, 0xea, 0xa6, 0x10,
+ 0xf1, 0x90, 0xf7, 0x5f, 0xa4, 0x05, 0x6d, 0x2c, 0x21, 0xdb, 0x7a, 0x4f, 0x65, 0x81, 0x3e, 0x17,
+ 0x99, 0x04, 0x03, 0x5c, 0x40, 0x3c, 0xe6, 0x90, 0x2d, 0x00, 0x83, 0xa0, 0xe6, 0x74, 0x60, 0x39,
+ 0x55, 0xd4, 0xef, 0x45, 0x01, 0xb9, 0x0b, 0x2d, 0x2f, 0x0c, 0xb9, 0x3f, 0x66, 0xa8, 0x22, 0xa2,
+ 0x81, 0xd2, 0x94, 0x63, 0x1b, 0x1a, 0x19, 0x8a, 0x9a, 0x9d, 0xdb, 0x72, 0xc0, 0x60, 0x14, 0xcf,
+ 0x3d, 0x58, 0x1a, 0x87, 0x84, 0x61, 0x02, 0x44, 0xb5, 0xb2, 0xc0, 0xd0, 0x5c, 0x77, 0xa1, 0x95,
+ 0x43, 0x52, 0xb3, 0x91, 0x5a, 0x4e, 0x23, 0xc3, 0x29, 0x3e, 0x1b, 0x9a, 0xa6, 0x98, 0x18, 0xb2,
+ 0x26, 0x82, 0xea, 0xba, 0xa4, 0x68, 0xa6, 0x3b, 0x50, 0x4f, 0x31, 0x8a, 0xa6, 0xa5, 0xe3, 0x50,
+ 0x23, 0x14, 0xc7, 0xc7, 0x50, 0x49, 0xbc, 0xa8, 0x4f, 0xc5, 0xfa, 0xe2, 0xf6, 0xfc, 0xbd, 0xfa,
+ 0xc3, 0x7b, 0xe3, 0x13, 0x6b, 0x16, 0x50, 0xe6, 0xd3, 0xa1, 0x82, 0x8f, 0x12, 0x9f, 0x3a, 0x88,
+ 0x77, 0x8c, 0xdd, 0xc6, 0xaf, 0xcb, 0x70, 0x6b, 0x16, 0x80, 0xdc, 0x4e, 0x2f, 0x5a, 0x81, 0x58,
+ 0x2f, 0x6d, 0xcf, 0xdf, 0xb3, 0xcc, 0x6d, 0x2a, 0x98, 0x5c, 0xb1, 0xb9, 0xa9, 0x15, 0xdb, 0x85,
+ 0x85, 0x98, 0xf3, 0x50, 0xac, 0xcf, 0xe3, 0xa0, 0xde, 0x79, 0xd5, 0x41, 0xdd, 0x3f, 0xe4, 0x3c,
+ 0x74, 0xb4, 0xed, 0xc6, 0xdf, 0xe7, 0xa0, 0xac, 0xda, 0xe4, 0xfb, 0xb9, 0xed, 0xa7, 0xf5, 0xf0,
+ 0xff, 0xae, 0x45, 0x86, 0x7f, 0x54, 0xc9, 0x37, 0xdb, 0xd6, 0x11, 0x58, 0x62, 0xe0, 0x25, 0x2c,
+ 0xea, 0xe3, 0xb0, 0x5b, 0x0f, 0x3f, 0xbc, 0x1e, 0xdd, 0x91, 0x36, 0x46, 0xc6, 0x94, 0x49, 0x25,
+ 0xa6, 0x5e, 0x40, 0xbd, 0x27, 0xe8, 0x86, 0xca, 0x73, 0x6a, 0x8e, 0xee, 0x96, 0xa3, 0x3e, 0xed,
+ 0x1d, 0xa8, 0xa6, 0xc3, 0x21, 0x00, 0x95, 0xee, 0xd3, 0x67, 0x6e, 0xa7, 0xbd, 0x74, 0x83, 0x34,
+ 0xa0, 0xba, 0xf3, 0xe4, 0x49, 0x77, 0x57, 0xb5, 0x4a, 0xa4, 0x05, 0xf0, 0xc9, 0xde, 0xc1, 0x61,
+ 0xd7, 0x39, 0x56, 0xed, 0x39, 0x52, 0x07, 0xeb, 0xf1, 0x93, 0xee, 0x73, 0xd5, 0x98, 0xb7, 0x07,
+ 0x50, 0xcf, 0x0d, 0x81, 0xac, 0x02, 0x69, 0xef, 0xb5, 0x3b, 0xbb, 0x3b, 0xc7, 0x7b, 0x6d, 0xf7,
+ 0x70, 0xcf, 0x71, 0x3b, 0x4f, 0x8f, 0x1f, 0x2f, 0xdd, 0x20, 0x6f, 0xc2, 0xe6, 0xd1, 0xfe, 0x8e,
+ 0xb3, 0xd7, 0x76, 0x1f, 0xfd, 0xd8, 0xdd, 0x79, 0xf2, 0x04, 0xe5, 0xf8, 0x71, 0xbc, 0xb7, 0xbb,
+ 0xbf, 0x54, 0x22, 0xdb, 0xb0, 0x35, 0x03, 0x70, 0xb4, 0x73, 0xb0, 0xa7, 0x11, 0x73, 0xf6, 0x2f,
+ 0xe6, 0x01, 0x76, 0x43, 0x4f, 0x08, 0xd6, 0x63, 0x34, 0xc1, 0xfa, 0xe9, 0xca, 0x38, 0xab, 0x66,
+ 0x0b, 0xfc, 0x38, 0x66, 0x01, 0x59, 0x86, 0x05, 0xee, 0x9e, 0x65, 0x55, 0xb5, 0xcc, 0x3f, 0x65,
+ 0x58, 0x6b, 0x99, 0xc6, 0x9a, 0x09, 0x61, 0x29, 0x96, 0x21, 0x56, 0x4f, 0x49, 0x99, 0x29, 0xec,
+ 0x1a, 0x58, 0xdc, 0x8d, 0x4f, 0x98, 0x14, 0xa6, 0xc8, 0x56, 0xf8, 0xa1, 0x6a, 0x61, 0xfd, 0x34,
+ 0x0a, 0xb3, 0xa3, 0x32, 0xad, 0xb8, 0x0d, 0x55, 0x2a, 0x07, 0x7a, 0x5f, 0xd7, 0xa9, 0x6e, 0x51,
+ 0x39, 0x48, 0xb7, 0xf5, 0x40, 0x48, 0x77, 0xe8, 0xf9, 0x98, 0xe2, 0x0d, 0xa7, 0x12, 0x08, 0x79,
+ 0xe0, 0xf9, 0x4a, 0x21, 0x12, 0x1f, 0x15, 0x35, 0xad, 0x10, 0x89, 0xaf, 0x14, 0x2a, 0xc8, 0x63,
+ 0xfd, 0x5e, 0x61, 0x72, 0xd9, 0x62, 0xf1, 0x21, 0xbe, 0x79, 0xac, 0x80, 0xb2, 0x76, 0x59, 0x6c,
+ 0x92, 0x77, 0x21, 0x10, 0xb2, 0x13, 0x2b, 0xb1, 0xa2, 0x62, 0xb1, 0xa9, 0x63, 0x0b, 0x22, 0xf1,
+ 0x3b, 0xb1, 0x22, 0x52, 0x62, 0x95, 0xdd, 0x26, 0x8f, 0x55, 0x8f, 0xaa, 0xc0, 0x29, 0x95, 0x22,
+ 0x42, 0x95, 0x4e, 0x60, 0x35, 0x4a, 0x54, 0x6d, 0x43, 0x43, 0x5d, 0xd5, 0xa5, 0xd7, 0xd7, 0xfe,
+ 0x2c, 0xea, 0x54, 0x8a, 0x4f, 0xe5, 0xb1, 0x87, 0x2b, 0x6c, 0xff, 0x0c, 0x6a, 0xea, 0xc8, 0xce,
+ 0xa3, 0xdd, 0x21, 0x56, 0x0c, 0x2f, 0x08, 0x5c, 0x3e, 0x92, 0x34, 0x51, 0x46, 0xb8, 0x16, 0x55,
+ 0xa7, 0xee, 0x05, 0x41, 0x57, 0xc9, 0x8e, 0xbd, 0xbe, 0xaa, 0x52, 0x09, 0x1d, 0xf2, 0x33, 0x9a,
+ 0x83, 0xcd, 0x21, 0xac, 0xa5, 0xe5, 0x19, 0x72, 0x1b, 0x1a, 0x32, 0xf1, 0x62, 0x57, 0x72, 0x77,
+ 0xc0, 0x85, 0x8e, 0xde, 0xaa, 0x03, 0x4a, 0x76, 0xcc, 0xf7, 0xb9, 0x90, 0xf6, 0x1f, 0x4a, 0x50,
+ 0xd1, 0xbd, 0x93, 0xbb, 0x30, 0xef, 0x0f, 0xd3, 0x1b, 0x35, 0x19, 0x5f, 0xd2, 0xd3, 0xb1, 0x39,
+ 0x4a, 0x3d, 0x3b, 0x1c, 0x72, 0x4b, 0x3c, 0x5f, 0x58, 0xe2, 0x71, 0x4c, 0x95, 0x27, 0x62, 0x4a,
+ 0xc7, 0xc9, 0x42, 0x31, 0x4e, 0x66, 0x87, 0xc3, 0x38, 0xd8, 0xac, 0x5c, 0xb0, 0xd9, 0xbf, 0x9b,
+ 0x87, 0xf2, 0xe3, 0x90, 0x9f, 0x63, 0xf5, 0xf7, 0xd5, 0x8d, 0xc4, 0xcd, 0x6f, 0xc7, 0x8b, 0x4e,
+ 0x43, 0x4b, 0x3b, 0xb3, 0x8e, 0x07, 0x8b, 0xe9, 0xf1, 0x60, 0x05, 0x2a, 0xa3, 0x88, 0x29, 0x71,
+ 0x5d, 0x8b, 0x47, 0x11, 0xbb, 0xea, 0x18, 0xb8, 0x09, 0x58, 0x9b, 0xf5, 0x62, 0xea, 0xad, 0xb5,
+ 0xaa, 0x04, 0x18, 0x9d, 0xb7, 0xa1, 0x9a, 0xee, 0x30, 0x18, 0x6b, 0x8b, 0x8e, 0x65, 0x76, 0x17,
+ 0xf2, 0x16, 0x2c, 0x46, 0x54, 0x9e, 0xf3, 0xe4, 0x34, 0x1b, 0xe5, 0x02, 0x22, 0x9a, 0x46, 0xdc,
+ 0x99, 0x75, 0x3c, 0xad, 0x20, 0x24, 0x77, 0x2a, 0x79, 0x1f, 0xc0, 0xcf, 0x52, 0xd6, 0xdc, 0x92,
+ 0x97, 0xb3, 0xb5, 0x1a, 0x67, 0xb3, 0x93, 0x83, 0x91, 0xb7, 0xa1, 0xe2, 0xe1, 0x2a, 0x9a, 0xdb,
+ 0xef, 0xe2, 0xc4, 0xe2, 0x3a, 0x46, 0x4d, 0x36, 0xa0, 0x1a, 0x27, 0x8c, 0x27, 0x4c, 0xbe, 0xc0,
+ 0x2c, 0x5a, 0x74, 0xb2, 0x76, 0xee, 0x98, 0xdb, 0x28, 0x1c, 0x73, 0x73, 0xe7, 0xab, 0x66, 0xfe,
+ 0x7c, 0x65, 0x1f, 0x43, 0x63, 0xf2, 0x84, 0xa0, 0x8f, 0x39, 0xe9, 0x0a, 0x35, 0x9c, 0xaa, 0x16,
+ 0x74, 0x02, 0xf2, 0x36, 0x2c, 0x1a, 0xa5, 0x88, 0xa9, 0xcf, 0x7a, 0xcc, 0x37, 0xc7, 0xa7, 0x96,
+ 0x16, 0x1f, 0x19, 0xa9, 0xfd, 0xe7, 0x32, 0xb4, 0x8a, 0x4f, 0x55, 0x97, 0x9f, 0xc3, 0x6e, 0x43,
+ 0x35, 0xb9, 0x70, 0x4f, 0x5e, 0x48, 0x2a, 0x90, 0xad, 0xe2, 0x58, 0xc9, 0xc5, 0x23, 0xd5, 0x54,
+ 0xd3, 0x9c, 0x5c, 0xb8, 0x31, 0x1e, 0xe4, 0x74, 0xd0, 0x56, 0x9c, 0x5a, 0x72, 0xa1, 0x4f, 0x76,
+ 0x02, 0x53, 0xec, 0xc2, 0x1d, 0xf9, 0x9e, 0xca, 0x6a, 0x03, 0x2a, 0x23, 0xa8, 0x95, 0x5c, 0x3c,
+ 0x53, 0xe2, 0x22, 0x72, 0x58, 0x40, 0x2e, 0xa4, 0xc8, 0x83, 0x69, 0xe4, 0x49, 0x01, 0x59, 0x49,
+ 0x91, 0x8f, 0xa6, 0x91, 0xfa, 0x8e, 0x9e, 0x22, 0xad, 0x14, 0x89, 0x77, 0xee, 0x14, 0x79, 0x1b,
+ 0xaa, 0x32, 0xf5, 0xb0, 0xaa, 0x3d, 0x94, 0x63, 0x0f, 0xe5, 0xd8, 0xc3, 0x9a, 0xf6, 0x50, 0xe6,
+ 0x3d, 0x94, 0x93, 0x1e, 0x82, 0xee, 0x43, 0x4e, 0x79, 0x28, 0x27, 0x3d, 0xac, 0xa7, 0xc8, 0x83,
+ 0x69, 0x64, 0xd1, 0xc3, 0x46, 0x8a, 0x7c, 0x34, 0x8d, 0x2c, 0x7a, 0xd8, 0x4c, 0x91, 0x05, 0x0f,
+ 0x6d, 0x68, 0x26, 0x17, 0xae, 0x9f, 0xf8, 0x1a, 0x2d, 0xb0, 0xbe, 0x56, 0x9c, 0x7a, 0x72, 0xb1,
+ 0x9b, 0xf8, 0x88, 0x44, 0x57, 0x4f, 0x58, 0x9c, 0x02, 0x16, 0xb5, 0xab, 0x27, 0x2c, 0x36, 0xea,
+ 0x2d, 0xa8, 0x49, 0x36, 0xa4, 0x42, 0x7a, 0xc3, 0x18, 0x4f, 0xba, 0x96, 0x33, 0x16, 0xa8, 0xeb,
+ 0x7c, 0xab, 0xf8, 0x82, 0x99, 0x4f, 0xfe, 0x52, 0x21, 0xf9, 0xbf, 0x79, 0x40, 0x7d, 0xf3, 0x85,
+ 0xba, 0x7a, 0xf4, 0x1f, 0x43, 0xb3, 0xf0, 0xe4, 0x79, 0x79, 0x32, 0xac, 0x42, 0x45, 0x5d, 0xd8,
+ 0x47, 0xc2, 0x9c, 0xe6, 0x4c, 0xcb, 0xfe, 0x29, 0x2c, 0xcf, 0x78, 0xfa, 0xbc, 0xf6, 0x35, 0x6b,
+ 0x4c, 0x3f, 0x5f, 0xa0, 0xff, 0x6b, 0x09, 0xc8, 0xf4, 0xab, 0xe8, 0x37, 0x79, 0x32, 0x09, 0xb9,
+ 0x70, 0x0b, 0x5d, 0xd4, 0x42, 0x2e, 0x8e, 0x50, 0xa0, 0xd5, 0x27, 0xa9, 0xba, 0x9c, 0xaa, 0x4f,
+ 0x8c, 0xfa, 0x1e, 0x2c, 0x85, 0x3c, 0xf6, 0xdd, 0x21, 0x13, 0x19, 0x87, 0xbe, 0x85, 0xb4, 0x94,
+ 0xfc, 0x80, 0x89, 0x94, 0xe8, 0x3d, 0x58, 0x31, 0x48, 0x13, 0x70, 0x29, 0xbc, 0xa2, 0x6f, 0x3e,
+ 0x1a, 0xae, 0x03, 0x4f, 0x9b, 0xd8, 0x14, 0x36, 0xaf, 0x78, 0xac, 0x7d, 0x6d, 0x13, 0xf9, 0x9b,
+ 0x12, 0x6c, 0x5c, 0xfe, 0x72, 0xfb, 0xba, 0xba, 0x21, 0xef, 0xc3, 0x2a, 0x8b, 0xd4, 0xd5, 0x91,
+ 0xba, 0x27, 0x4c, 0x9a, 0x39, 0x48, 0x3c, 0x49, 0xcd, 0x0e, 0xbe, 0x6c, 0xb4, 0x8f, 0x98, 0xc4,
+ 0x49, 0x70, 0x3c, 0x49, 0xed, 0xaf, 0xf4, 0xd8, 0x2e, 0x79, 0xf8, 0x7d, 0x6d, 0x63, 0xbb, 0x05,
+ 0x0b, 0xf8, 0x04, 0x9d, 0x1e, 0x26, 0xb0, 0xa1, 0xd8, 0x23, 0x7a, 0xee, 0xd2, 0x2f, 0xd2, 0xe3,
+ 0x44, 0x25, 0xa2, 0xe7, 0x7b, 0x5f, 0x04, 0xf6, 0x00, 0xee, 0x5c, 0xfd, 0x6c, 0xfc, 0xda, 0xd6,
+ 0xe6, 0xb7, 0x25, 0x1d, 0x03, 0x97, 0x3c, 0x24, 0xff, 0x7b, 0x17, 0xe7, 0xcb, 0x12, 0xd8, 0x2f,
+ 0x7f, 0x94, 0xfe, 0xd7, 0x2e, 0x92, 0x7d, 0x88, 0x6b, 0x71, 0xc5, 0xe3, 0xf5, 0x75, 0xfb, 0xb7,
+ 0x9f, 0xc2, 0xd6, 0x55, 0x6f, 0xd5, 0xd7, 0xe6, 0xb3, 0x60, 0x61, 0x6f, 0x18, 0xcb, 0x17, 0x0f,
+ 0xbf, 0x6e, 0x82, 0xd5, 0xd5, 0xe7, 0x23, 0xd2, 0x06, 0x68, 0x33, 0xe1, 0x9d, 0x84, 0xb4, 0x1b,
+ 0x4a, 0xd2, 0xca, 0xce, 0x4d, 0x88, 0xdc, 0x98, 0x68, 0xdb, 0xab, 0x5f, 0xfe, 0xe5, 0x6f, 0x5f,
+ 0xcd, 0x2d, 0xd9, 0xf5, 0x07, 0x67, 0xef, 0x3d, 0x30, 0x76, 0x1f, 0x95, 0xfe, 0x9b, 0x3c, 0x86,
+ 0xba, 0x43, 0x69, 0xf4, 0xaa, 0x34, 0x6b, 0x48, 0x73, 0xd3, 0x6e, 0x28, 0x9a, 0xd4, 0x50, 0xf1,
+ 0xec, 0x41, 0xdd, 0xcc, 0x20, 0xed, 0x46, 0x23, 0xd2, 0xc8, 0x3f, 0xda, 0x4f, 0xb1, 0xac, 0x23,
+ 0x0b, 0xb1, 0x9b, 0x8a, 0x65, 0x4f, 0x77, 0x1e, 0x8d, 0x14, 0xcd, 0x3e, 0x34, 0xdb, 0xd4, 0x7b,
+ 0x65, 0xa2, 0xdb, 0x48, 0xb4, 0x6c, 0xb7, 0x72, 0x5e, 0x19, 0xa6, 0x5d, 0xa8, 0xb5, 0x69, 0x48,
+ 0xaf, 0x3d, 0x9c, 0xcc, 0x48, 0x91, 0x74, 0x00, 0xcc, 0x5b, 0x61, 0x77, 0x24, 0xc9, 0x52, 0xe1,
+ 0xdf, 0x9f, 0x07, 0xa2, 0x7f, 0xf5, 0x78, 0xc6, 0x96, 0x8a, 0xaa, 0x0b, 0x8d, 0xec, 0xa1, 0x50,
+ 0x91, 0x91, 0xc2, 0xbf, 0x35, 0x50, 0x3c, 0x45, 0xb7, 0x89, 0x74, 0x2b, 0xf6, 0x12, 0xd2, 0xe5,
+ 0xac, 0x15, 0xe1, 0x8f, 0x60, 0x31, 0xff, 0xe4, 0xa7, 0x38, 0xc7, 0x2f, 0xa2, 0x79, 0xcd, 0x14,
+ 0xed, 0x1d, 0xa4, 0x5d, 0xb7, 0x97, 0x15, 0xed, 0x04, 0x87, 0x62, 0xfe, 0x18, 0x2c, 0x75, 0xea,
+ 0xd8, 0x09, 0x02, 0xd2, 0x2c, 0xfc, 0x27, 0xf5, 0xea, 0xa8, 0x32, 0x36, 0x3a, 0xaa, 0x40, 0xb5,
+ 0x1c, 0xbc, 0xf2, 0xbd, 0x8c, 0xa4, 0x30, 0x69, 0x63, 0x33, 0xc5, 0x73, 0x04, 0xad, 0xec, 0xbd,
+ 0x79, 0x77, 0x40, 0xfd, 0xd3, 0xa9, 0x00, 0x1d, 0x4f, 0x63, 0x06, 0xb4, 0xdf, 0x40, 0xc2, 0x35,
+ 0x9b, 0x28, 0xc2, 0xa2, 0xbd, 0x22, 0x3d, 0x80, 0xba, 0x8e, 0xb9, 0x43, 0x1e, 0x75, 0x7a, 0xb9,
+ 0x85, 0xc8, 0x1e, 0xc0, 0xa7, 0x86, 0xb8, 0x81, 0x8c, 0xb7, 0xec, 0xc5, 0x71, 0xc0, 0xa2, 0xb1,
+ 0x59, 0x58, 0x13, 0x79, 0xaf, 0xce, 0x57, 0x58, 0xd8, 0xbc, 0xb5, 0x22, 0x74, 0xa0, 0xf9, 0x09,
+ 0x95, 0xb9, 0x27, 0xd9, 0x49, 0x9f, 0x97, 0x67, 0xbc, 0x1a, 0xd9, 0x5b, 0x48, 0xb9, 0x6a, 0xdf,
+ 0x54, 0x94, 0x05, 0x7b, 0xc5, 0xf9, 0x3d, 0xa8, 0x38, 0xf4, 0x84, 0xf3, 0x97, 0x67, 0xf8, 0x0a,
+ 0xf2, 0x2c, 0xda, 0xa0, 0x33, 0x5c, 0xd9, 0x28, 0x82, 0x67, 0x70, 0x73, 0x97, 0x87, 0x21, 0xf5,
+ 0xf3, 0xb7, 0x9b, 0x97, 0x71, 0x6d, 0x23, 0xd7, 0x86, 0xbd, 0xa2, 0xb8, 0xa6, 0xcc, 0x15, 0x6d,
+ 0x02, 0x6b, 0xbb, 0x09, 0xf5, 0x24, 0x3d, 0x4e, 0xbc, 0x5e, 0x8f, 0xf9, 0x47, 0xfe, 0x80, 0x06,
+ 0xa3, 0x90, 0x26, 0x82, 0xbc, 0x79, 0xbf, 0xf0, 0x0b, 0x8e, 0x29, 0xc0, 0x54, 0x6f, 0x6f, 0x61,
+ 0x6f, 0xdb, 0xf6, 0x26, 0xf6, 0x36, 0x9b, 0xd5, 0xf4, 0xa9, 0x23, 0xec, 0x75, 0xf7, 0x79, 0x09,
+ 0xab, 0xea, 0xb3, 0x07, 0xcb, 0x85, 0x11, 0xfd, 0x70, 0x44, 0x47, 0x54, 0x90, 0xcd, 0x99, 0xfd,
+ 0x69, 0xe5, 0x54, 0x5f, 0x36, 0xf6, 0xb5, 0x65, 0xaf, 0x4d, 0xf9, 0xa7, 0x0d, 0x4c, 0x3f, 0x85,
+ 0x51, 0xfc, 0xd3, 0xfd, 0xcc, 0x60, 0x53, 0xfd, 0x7c, 0x1b, 0x96, 0x74, 0x1a, 0xe4, 0x76, 0xb5,
+ 0xcb, 0xc3, 0x74, 0x0c, 0xb2, 0x6f, 0xbc, 0x5b, 0x7a, 0x74, 0xff, 0xb3, 0xff, 0xed, 0x33, 0x39,
+ 0x18, 0x9d, 0xdc, 0xf7, 0xf9, 0x10, 0x7f, 0xeb, 0xe3, 0xf3, 0x24, 0x78, 0xa0, 0x7f, 0xbe, 0xf3,
+ 0x8e, 0xf9, 0xf9, 0x4e, 0x9f, 0xa7, 0xbf, 0x02, 0x3a, 0x2c, 0x9d, 0x54, 0x50, 0xf8, 0xfe, 0x3f,
+ 0x02, 0x00, 0x00, 0xff, 0xff, 0xa1, 0xbc, 0x2c, 0xb8, 0x27, 0x24, 0x00, 0x00,
}
// Reference imports to suppress errors if they are not otherwise used.
@@ -3881,8 +3240,10 @@
GetDeviceInfo(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*DeviceInfo, error)
Reboot(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*Empty, error)
CollectStatistics(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*Empty, error)
- CreateTconts(ctx context.Context, in *Tconts, opts ...grpc.CallOption) (*Empty, error)
- RemoveTconts(ctx context.Context, in *Tconts, opts ...grpc.CallOption) (*Empty, error)
+ CreateTrafficSchedulers(ctx context.Context, in *tech_profile.TrafficSchedulers, opts ...grpc.CallOption) (*Empty, error)
+ RemoveTrafficSchedulers(ctx context.Context, in *tech_profile.TrafficSchedulers, opts ...grpc.CallOption) (*Empty, error)
+ CreateTrafficQueues(ctx context.Context, in *tech_profile.TrafficQueues, opts ...grpc.CallOption) (*Empty, error)
+ RemoveTrafficQueues(ctx context.Context, in *tech_profile.TrafficQueues, opts ...grpc.CallOption) (*Empty, error)
EnableIndication(ctx context.Context, in *Empty, opts ...grpc.CallOption) (Openolt_EnableIndicationClient, error)
}
@@ -4038,18 +3399,36 @@
return out, nil
}
-func (c *openoltClient) CreateTconts(ctx context.Context, in *Tconts, opts ...grpc.CallOption) (*Empty, error) {
+func (c *openoltClient) CreateTrafficSchedulers(ctx context.Context, in *tech_profile.TrafficSchedulers, opts ...grpc.CallOption) (*Empty, error) {
out := new(Empty)
- err := c.cc.Invoke(ctx, "/openolt.Openolt/CreateTconts", in, out, opts...)
+ err := c.cc.Invoke(ctx, "/openolt.Openolt/CreateTrafficSchedulers", in, out, opts...)
if err != nil {
return nil, err
}
return out, nil
}
-func (c *openoltClient) RemoveTconts(ctx context.Context, in *Tconts, opts ...grpc.CallOption) (*Empty, error) {
+func (c *openoltClient) RemoveTrafficSchedulers(ctx context.Context, in *tech_profile.TrafficSchedulers, opts ...grpc.CallOption) (*Empty, error) {
out := new(Empty)
- err := c.cc.Invoke(ctx, "/openolt.Openolt/RemoveTconts", in, out, opts...)
+ err := c.cc.Invoke(ctx, "/openolt.Openolt/RemoveTrafficSchedulers", in, out, opts...)
+ if err != nil {
+ return nil, err
+ }
+ return out, nil
+}
+
+func (c *openoltClient) CreateTrafficQueues(ctx context.Context, in *tech_profile.TrafficQueues, opts ...grpc.CallOption) (*Empty, error) {
+ out := new(Empty)
+ err := c.cc.Invoke(ctx, "/openolt.Openolt/CreateTrafficQueues", in, out, opts...)
+ if err != nil {
+ return nil, err
+ }
+ return out, nil
+}
+
+func (c *openoltClient) RemoveTrafficQueues(ctx context.Context, in *tech_profile.TrafficQueues, opts ...grpc.CallOption) (*Empty, error) {
+ out := new(Empty)
+ err := c.cc.Invoke(ctx, "/openolt.Openolt/RemoveTrafficQueues", in, out, opts...)
if err != nil {
return nil, err
}
@@ -4106,8 +3485,10 @@
GetDeviceInfo(context.Context, *Empty) (*DeviceInfo, error)
Reboot(context.Context, *Empty) (*Empty, error)
CollectStatistics(context.Context, *Empty) (*Empty, error)
- CreateTconts(context.Context, *Tconts) (*Empty, error)
- RemoveTconts(context.Context, *Tconts) (*Empty, error)
+ CreateTrafficSchedulers(context.Context, *tech_profile.TrafficSchedulers) (*Empty, error)
+ RemoveTrafficSchedulers(context.Context, *tech_profile.TrafficSchedulers) (*Empty, error)
+ CreateTrafficQueues(context.Context, *tech_profile.TrafficQueues) (*Empty, error)
+ RemoveTrafficQueues(context.Context, *tech_profile.TrafficQueues) (*Empty, error)
EnableIndication(*Empty, Openolt_EnableIndicationServer) error
}
@@ -4403,38 +3784,74 @@
return interceptor(ctx, in, info, handler)
}
-func _Openolt_CreateTconts_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
- in := new(Tconts)
+func _Openolt_CreateTrafficSchedulers_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+ in := new(tech_profile.TrafficSchedulers)
if err := dec(in); err != nil {
return nil, err
}
if interceptor == nil {
- return srv.(OpenoltServer).CreateTconts(ctx, in)
+ return srv.(OpenoltServer).CreateTrafficSchedulers(ctx, in)
}
info := &grpc.UnaryServerInfo{
Server: srv,
- FullMethod: "/openolt.Openolt/CreateTconts",
+ FullMethod: "/openolt.Openolt/CreateTrafficSchedulers",
}
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
- return srv.(OpenoltServer).CreateTconts(ctx, req.(*Tconts))
+ return srv.(OpenoltServer).CreateTrafficSchedulers(ctx, req.(*tech_profile.TrafficSchedulers))
}
return interceptor(ctx, in, info, handler)
}
-func _Openolt_RemoveTconts_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
- in := new(Tconts)
+func _Openolt_RemoveTrafficSchedulers_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+ in := new(tech_profile.TrafficSchedulers)
if err := dec(in); err != nil {
return nil, err
}
if interceptor == nil {
- return srv.(OpenoltServer).RemoveTconts(ctx, in)
+ return srv.(OpenoltServer).RemoveTrafficSchedulers(ctx, in)
}
info := &grpc.UnaryServerInfo{
Server: srv,
- FullMethod: "/openolt.Openolt/RemoveTconts",
+ FullMethod: "/openolt.Openolt/RemoveTrafficSchedulers",
}
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
- return srv.(OpenoltServer).RemoveTconts(ctx, req.(*Tconts))
+ return srv.(OpenoltServer).RemoveTrafficSchedulers(ctx, req.(*tech_profile.TrafficSchedulers))
+ }
+ return interceptor(ctx, in, info, handler)
+}
+
+func _Openolt_CreateTrafficQueues_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+ in := new(tech_profile.TrafficQueues)
+ if err := dec(in); err != nil {
+ return nil, err
+ }
+ if interceptor == nil {
+ return srv.(OpenoltServer).CreateTrafficQueues(ctx, in)
+ }
+ info := &grpc.UnaryServerInfo{
+ Server: srv,
+ FullMethod: "/openolt.Openolt/CreateTrafficQueues",
+ }
+ handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+ return srv.(OpenoltServer).CreateTrafficQueues(ctx, req.(*tech_profile.TrafficQueues))
+ }
+ return interceptor(ctx, in, info, handler)
+}
+
+func _Openolt_RemoveTrafficQueues_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+ in := new(tech_profile.TrafficQueues)
+ if err := dec(in); err != nil {
+ return nil, err
+ }
+ if interceptor == nil {
+ return srv.(OpenoltServer).RemoveTrafficQueues(ctx, in)
+ }
+ info := &grpc.UnaryServerInfo{
+ Server: srv,
+ FullMethod: "/openolt.Openolt/RemoveTrafficQueues",
+ }
+ handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+ return srv.(OpenoltServer).RemoveTrafficQueues(ctx, req.(*tech_profile.TrafficQueues))
}
return interceptor(ctx, in, info, handler)
}
@@ -4529,12 +3946,20 @@
Handler: _Openolt_CollectStatistics_Handler,
},
{
- MethodName: "CreateTconts",
- Handler: _Openolt_CreateTconts_Handler,
+ MethodName: "CreateTrafficSchedulers",
+ Handler: _Openolt_CreateTrafficSchedulers_Handler,
},
{
- MethodName: "RemoveTconts",
- Handler: _Openolt_RemoveTconts_Handler,
+ MethodName: "RemoveTrafficSchedulers",
+ Handler: _Openolt_RemoveTrafficSchedulers_Handler,
+ },
+ {
+ MethodName: "CreateTrafficQueues",
+ Handler: _Openolt_CreateTrafficQueues_Handler,
+ },
+ {
+ MethodName: "RemoveTrafficQueues",
+ Handler: _Openolt_RemoveTrafficQueues_Handler,
},
},
Streams: []grpc.StreamDesc{
diff --git a/vendor/github.com/opencord/voltha-protos/go/tech_profile/tech_profile.pb.go b/vendor/github.com/opencord/voltha-protos/go/tech_profile/tech_profile.pb.go
new file mode 100644
index 0000000..4c6d4b3
--- /dev/null
+++ b/vendor/github.com/opencord/voltha-protos/go/tech_profile/tech_profile.pb.go
@@ -0,0 +1,971 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: voltha_protos/tech_profile.proto
+
+package tech_profile
+
+import (
+ fmt "fmt"
+ proto "github.com/golang/protobuf/proto"
+ _ "google.golang.org/genproto/googleapis/api/annotations"
+ math "math"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+type Direction int32
+
+const (
+ Direction_UPSTREAM Direction = 0
+ Direction_DOWNSTREAM Direction = 1
+ Direction_BIDIRECTIONAL Direction = 2
+)
+
+var Direction_name = map[int32]string{
+ 0: "UPSTREAM",
+ 1: "DOWNSTREAM",
+ 2: "BIDIRECTIONAL",
+}
+
+var Direction_value = map[string]int32{
+ "UPSTREAM": 0,
+ "DOWNSTREAM": 1,
+ "BIDIRECTIONAL": 2,
+}
+
+func (x Direction) String() string {
+ return proto.EnumName(Direction_name, int32(x))
+}
+
+func (Direction) EnumDescriptor() ([]byte, []int) {
+ return fileDescriptor_d019a68bffe14cae, []int{0}
+}
+
+type SchedulingPolicy int32
+
+const (
+ SchedulingPolicy_WRR SchedulingPolicy = 0
+ SchedulingPolicy_StrictPriority SchedulingPolicy = 1
+ SchedulingPolicy_Hybrid SchedulingPolicy = 2
+)
+
+var SchedulingPolicy_name = map[int32]string{
+ 0: "WRR",
+ 1: "StrictPriority",
+ 2: "Hybrid",
+}
+
+var SchedulingPolicy_value = map[string]int32{
+ "WRR": 0,
+ "StrictPriority": 1,
+ "Hybrid": 2,
+}
+
+func (x SchedulingPolicy) String() string {
+ return proto.EnumName(SchedulingPolicy_name, int32(x))
+}
+
+func (SchedulingPolicy) EnumDescriptor() ([]byte, []int) {
+ return fileDescriptor_d019a68bffe14cae, []int{1}
+}
+
+type AdditionalBW int32
+
+const (
+ AdditionalBW_AdditionalBW_None AdditionalBW = 0
+ AdditionalBW_AdditionalBW_NA AdditionalBW = 1
+ AdditionalBW_AdditionalBW_BestEffort AdditionalBW = 2
+ AdditionalBW_AdditionalBW_Auto AdditionalBW = 3
+)
+
+var AdditionalBW_name = map[int32]string{
+ 0: "AdditionalBW_None",
+ 1: "AdditionalBW_NA",
+ 2: "AdditionalBW_BestEffort",
+ 3: "AdditionalBW_Auto",
+}
+
+var AdditionalBW_value = map[string]int32{
+ "AdditionalBW_None": 0,
+ "AdditionalBW_NA": 1,
+ "AdditionalBW_BestEffort": 2,
+ "AdditionalBW_Auto": 3,
+}
+
+func (x AdditionalBW) String() string {
+ return proto.EnumName(AdditionalBW_name, int32(x))
+}
+
+func (AdditionalBW) EnumDescriptor() ([]byte, []int) {
+ return fileDescriptor_d019a68bffe14cae, []int{2}
+}
+
+type DiscardPolicy int32
+
+const (
+ DiscardPolicy_TailDrop DiscardPolicy = 0
+ DiscardPolicy_WTailDrop DiscardPolicy = 1
+ DiscardPolicy_Red DiscardPolicy = 2
+ DiscardPolicy_WRed DiscardPolicy = 3
+)
+
+var DiscardPolicy_name = map[int32]string{
+ 0: "TailDrop",
+ 1: "WTailDrop",
+ 2: "Red",
+ 3: "WRed",
+}
+
+var DiscardPolicy_value = map[string]int32{
+ "TailDrop": 0,
+ "WTailDrop": 1,
+ "Red": 2,
+ "WRed": 3,
+}
+
+func (x DiscardPolicy) String() string {
+ return proto.EnumName(DiscardPolicy_name, int32(x))
+}
+
+func (DiscardPolicy) EnumDescriptor() ([]byte, []int) {
+ return fileDescriptor_d019a68bffe14cae, []int{3}
+}
+
+type InferredAdditionBWIndication int32
+
+const (
+ InferredAdditionBWIndication_InferredAdditionBWIndication_None InferredAdditionBWIndication = 0
+ InferredAdditionBWIndication_InferredAdditionBWIndication_Assured InferredAdditionBWIndication = 1
+ InferredAdditionBWIndication_InferredAdditionBWIndication_BestEffort InferredAdditionBWIndication = 2
+)
+
+var InferredAdditionBWIndication_name = map[int32]string{
+ 0: "InferredAdditionBWIndication_None",
+ 1: "InferredAdditionBWIndication_Assured",
+ 2: "InferredAdditionBWIndication_BestEffort",
+}
+
+var InferredAdditionBWIndication_value = map[string]int32{
+ "InferredAdditionBWIndication_None": 0,
+ "InferredAdditionBWIndication_Assured": 1,
+ "InferredAdditionBWIndication_BestEffort": 2,
+}
+
+func (x InferredAdditionBWIndication) String() string {
+ return proto.EnumName(InferredAdditionBWIndication_name, int32(x))
+}
+
+func (InferredAdditionBWIndication) EnumDescriptor() ([]byte, []int) {
+ return fileDescriptor_d019a68bffe14cae, []int{4}
+}
+
+type SchedulerConfig struct {
+ Direction Direction `protobuf:"varint,1,opt,name=direction,proto3,enum=tech_profile.Direction" json:"direction,omitempty"`
+ AdditionalBw AdditionalBW `protobuf:"varint,2,opt,name=additional_bw,json=additionalBw,proto3,enum=tech_profile.AdditionalBW" json:"additional_bw,omitempty"`
+ Priority uint32 `protobuf:"fixed32,3,opt,name=priority,proto3" json:"priority,omitempty"`
+ Weight uint32 `protobuf:"fixed32,4,opt,name=weight,proto3" json:"weight,omitempty"`
+ SchedPolicy SchedulingPolicy `protobuf:"varint,5,opt,name=sched_policy,json=schedPolicy,proto3,enum=tech_profile.SchedulingPolicy" json:"sched_policy,omitempty"`
+ XXX_NoUnkeyedLiteral struct{} `json:"-"`
+ XXX_unrecognized []byte `json:"-"`
+ XXX_sizecache int32 `json:"-"`
+}
+
+func (m *SchedulerConfig) Reset() { *m = SchedulerConfig{} }
+func (m *SchedulerConfig) String() string { return proto.CompactTextString(m) }
+func (*SchedulerConfig) ProtoMessage() {}
+func (*SchedulerConfig) Descriptor() ([]byte, []int) {
+ return fileDescriptor_d019a68bffe14cae, []int{0}
+}
+
+func (m *SchedulerConfig) XXX_Unmarshal(b []byte) error {
+ return xxx_messageInfo_SchedulerConfig.Unmarshal(m, b)
+}
+func (m *SchedulerConfig) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+ return xxx_messageInfo_SchedulerConfig.Marshal(b, m, deterministic)
+}
+func (m *SchedulerConfig) XXX_Merge(src proto.Message) {
+ xxx_messageInfo_SchedulerConfig.Merge(m, src)
+}
+func (m *SchedulerConfig) XXX_Size() int {
+ return xxx_messageInfo_SchedulerConfig.Size(m)
+}
+func (m *SchedulerConfig) XXX_DiscardUnknown() {
+ xxx_messageInfo_SchedulerConfig.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_SchedulerConfig proto.InternalMessageInfo
+
+func (m *SchedulerConfig) GetDirection() Direction {
+ if m != nil {
+ return m.Direction
+ }
+ return Direction_UPSTREAM
+}
+
+func (m *SchedulerConfig) GetAdditionalBw() AdditionalBW {
+ if m != nil {
+ return m.AdditionalBw
+ }
+ return AdditionalBW_AdditionalBW_None
+}
+
+func (m *SchedulerConfig) GetPriority() uint32 {
+ if m != nil {
+ return m.Priority
+ }
+ return 0
+}
+
+func (m *SchedulerConfig) GetWeight() uint32 {
+ if m != nil {
+ return m.Weight
+ }
+ return 0
+}
+
+func (m *SchedulerConfig) GetSchedPolicy() SchedulingPolicy {
+ if m != nil {
+ return m.SchedPolicy
+ }
+ return SchedulingPolicy_WRR
+}
+
+type TrafficShapingInfo struct {
+ Cir uint32 `protobuf:"fixed32,1,opt,name=cir,proto3" json:"cir,omitempty"`
+ Cbs uint32 `protobuf:"fixed32,2,opt,name=cbs,proto3" json:"cbs,omitempty"`
+ Pir uint32 `protobuf:"fixed32,3,opt,name=pir,proto3" json:"pir,omitempty"`
+ Pbs uint32 `protobuf:"fixed32,4,opt,name=pbs,proto3" json:"pbs,omitempty"`
+ Gir uint32 `protobuf:"fixed32,5,opt,name=gir,proto3" json:"gir,omitempty"`
+ AddBwInd InferredAdditionBWIndication `protobuf:"varint,6,opt,name=add_bw_ind,json=addBwInd,proto3,enum=tech_profile.InferredAdditionBWIndication" json:"add_bw_ind,omitempty"`
+ XXX_NoUnkeyedLiteral struct{} `json:"-"`
+ XXX_unrecognized []byte `json:"-"`
+ XXX_sizecache int32 `json:"-"`
+}
+
+func (m *TrafficShapingInfo) Reset() { *m = TrafficShapingInfo{} }
+func (m *TrafficShapingInfo) String() string { return proto.CompactTextString(m) }
+func (*TrafficShapingInfo) ProtoMessage() {}
+func (*TrafficShapingInfo) Descriptor() ([]byte, []int) {
+ return fileDescriptor_d019a68bffe14cae, []int{1}
+}
+
+func (m *TrafficShapingInfo) XXX_Unmarshal(b []byte) error {
+ return xxx_messageInfo_TrafficShapingInfo.Unmarshal(m, b)
+}
+func (m *TrafficShapingInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+ return xxx_messageInfo_TrafficShapingInfo.Marshal(b, m, deterministic)
+}
+func (m *TrafficShapingInfo) XXX_Merge(src proto.Message) {
+ xxx_messageInfo_TrafficShapingInfo.Merge(m, src)
+}
+func (m *TrafficShapingInfo) XXX_Size() int {
+ return xxx_messageInfo_TrafficShapingInfo.Size(m)
+}
+func (m *TrafficShapingInfo) XXX_DiscardUnknown() {
+ xxx_messageInfo_TrafficShapingInfo.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_TrafficShapingInfo proto.InternalMessageInfo
+
+func (m *TrafficShapingInfo) GetCir() uint32 {
+ if m != nil {
+ return m.Cir
+ }
+ return 0
+}
+
+func (m *TrafficShapingInfo) GetCbs() uint32 {
+ if m != nil {
+ return m.Cbs
+ }
+ return 0
+}
+
+func (m *TrafficShapingInfo) GetPir() uint32 {
+ if m != nil {
+ return m.Pir
+ }
+ return 0
+}
+
+func (m *TrafficShapingInfo) GetPbs() uint32 {
+ if m != nil {
+ return m.Pbs
+ }
+ return 0
+}
+
+func (m *TrafficShapingInfo) GetGir() uint32 {
+ if m != nil {
+ return m.Gir
+ }
+ return 0
+}
+
+func (m *TrafficShapingInfo) GetAddBwInd() InferredAdditionBWIndication {
+ if m != nil {
+ return m.AddBwInd
+ }
+ return InferredAdditionBWIndication_InferredAdditionBWIndication_None
+}
+
+type TrafficScheduler struct {
+ Direction Direction `protobuf:"varint,1,opt,name=direction,proto3,enum=tech_profile.Direction" json:"direction,omitempty"`
+ AllocId uint32 `protobuf:"fixed32,2,opt,name=alloc_id,json=allocId,proto3" json:"alloc_id,omitempty"`
+ Scheduler *SchedulerConfig `protobuf:"bytes,3,opt,name=scheduler,proto3" json:"scheduler,omitempty"`
+ TrafficShapingInfo *TrafficShapingInfo `protobuf:"bytes,4,opt,name=traffic_shaping_info,json=trafficShapingInfo,proto3" json:"traffic_shaping_info,omitempty"`
+ XXX_NoUnkeyedLiteral struct{} `json:"-"`
+ XXX_unrecognized []byte `json:"-"`
+ XXX_sizecache int32 `json:"-"`
+}
+
+func (m *TrafficScheduler) Reset() { *m = TrafficScheduler{} }
+func (m *TrafficScheduler) String() string { return proto.CompactTextString(m) }
+func (*TrafficScheduler) ProtoMessage() {}
+func (*TrafficScheduler) Descriptor() ([]byte, []int) {
+ return fileDescriptor_d019a68bffe14cae, []int{2}
+}
+
+func (m *TrafficScheduler) XXX_Unmarshal(b []byte) error {
+ return xxx_messageInfo_TrafficScheduler.Unmarshal(m, b)
+}
+func (m *TrafficScheduler) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+ return xxx_messageInfo_TrafficScheduler.Marshal(b, m, deterministic)
+}
+func (m *TrafficScheduler) XXX_Merge(src proto.Message) {
+ xxx_messageInfo_TrafficScheduler.Merge(m, src)
+}
+func (m *TrafficScheduler) XXX_Size() int {
+ return xxx_messageInfo_TrafficScheduler.Size(m)
+}
+func (m *TrafficScheduler) XXX_DiscardUnknown() {
+ xxx_messageInfo_TrafficScheduler.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_TrafficScheduler proto.InternalMessageInfo
+
+func (m *TrafficScheduler) GetDirection() Direction {
+ if m != nil {
+ return m.Direction
+ }
+ return Direction_UPSTREAM
+}
+
+func (m *TrafficScheduler) GetAllocId() uint32 {
+ if m != nil {
+ return m.AllocId
+ }
+ return 0
+}
+
+func (m *TrafficScheduler) GetScheduler() *SchedulerConfig {
+ if m != nil {
+ return m.Scheduler
+ }
+ return nil
+}
+
+func (m *TrafficScheduler) GetTrafficShapingInfo() *TrafficShapingInfo {
+ if m != nil {
+ return m.TrafficShapingInfo
+ }
+ return nil
+}
+
+type TrafficSchedulers struct {
+ IntfId uint32 `protobuf:"fixed32,1,opt,name=intf_id,json=intfId,proto3" json:"intf_id,omitempty"`
+ OnuId uint32 `protobuf:"fixed32,2,opt,name=onu_id,json=onuId,proto3" json:"onu_id,omitempty"`
+ UniId uint32 `protobuf:"fixed32,4,opt,name=uni_id,json=uniId,proto3" json:"uni_id,omitempty"`
+ PortNo uint32 `protobuf:"fixed32,5,opt,name=port_no,json=portNo,proto3" json:"port_no,omitempty"`
+ TrafficScheds []*TrafficScheduler `protobuf:"bytes,3,rep,name=traffic_scheds,json=trafficScheds,proto3" json:"traffic_scheds,omitempty"`
+ XXX_NoUnkeyedLiteral struct{} `json:"-"`
+ XXX_unrecognized []byte `json:"-"`
+ XXX_sizecache int32 `json:"-"`
+}
+
+func (m *TrafficSchedulers) Reset() { *m = TrafficSchedulers{} }
+func (m *TrafficSchedulers) String() string { return proto.CompactTextString(m) }
+func (*TrafficSchedulers) ProtoMessage() {}
+func (*TrafficSchedulers) Descriptor() ([]byte, []int) {
+ return fileDescriptor_d019a68bffe14cae, []int{3}
+}
+
+func (m *TrafficSchedulers) XXX_Unmarshal(b []byte) error {
+ return xxx_messageInfo_TrafficSchedulers.Unmarshal(m, b)
+}
+func (m *TrafficSchedulers) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+ return xxx_messageInfo_TrafficSchedulers.Marshal(b, m, deterministic)
+}
+func (m *TrafficSchedulers) XXX_Merge(src proto.Message) {
+ xxx_messageInfo_TrafficSchedulers.Merge(m, src)
+}
+func (m *TrafficSchedulers) XXX_Size() int {
+ return xxx_messageInfo_TrafficSchedulers.Size(m)
+}
+func (m *TrafficSchedulers) XXX_DiscardUnknown() {
+ xxx_messageInfo_TrafficSchedulers.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_TrafficSchedulers proto.InternalMessageInfo
+
+func (m *TrafficSchedulers) GetIntfId() uint32 {
+ if m != nil {
+ return m.IntfId
+ }
+ return 0
+}
+
+func (m *TrafficSchedulers) GetOnuId() uint32 {
+ if m != nil {
+ return m.OnuId
+ }
+ return 0
+}
+
+func (m *TrafficSchedulers) GetUniId() uint32 {
+ if m != nil {
+ return m.UniId
+ }
+ return 0
+}
+
+func (m *TrafficSchedulers) GetPortNo() uint32 {
+ if m != nil {
+ return m.PortNo
+ }
+ return 0
+}
+
+func (m *TrafficSchedulers) GetTrafficScheds() []*TrafficScheduler {
+ if m != nil {
+ return m.TrafficScheds
+ }
+ return nil
+}
+
+type TailDropDiscardConfig struct {
+ QueueSize uint32 `protobuf:"fixed32,1,opt,name=queue_size,json=queueSize,proto3" json:"queue_size,omitempty"`
+ XXX_NoUnkeyedLiteral struct{} `json:"-"`
+ XXX_unrecognized []byte `json:"-"`
+ XXX_sizecache int32 `json:"-"`
+}
+
+func (m *TailDropDiscardConfig) Reset() { *m = TailDropDiscardConfig{} }
+func (m *TailDropDiscardConfig) String() string { return proto.CompactTextString(m) }
+func (*TailDropDiscardConfig) ProtoMessage() {}
+func (*TailDropDiscardConfig) Descriptor() ([]byte, []int) {
+ return fileDescriptor_d019a68bffe14cae, []int{4}
+}
+
+func (m *TailDropDiscardConfig) XXX_Unmarshal(b []byte) error {
+ return xxx_messageInfo_TailDropDiscardConfig.Unmarshal(m, b)
+}
+func (m *TailDropDiscardConfig) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+ return xxx_messageInfo_TailDropDiscardConfig.Marshal(b, m, deterministic)
+}
+func (m *TailDropDiscardConfig) XXX_Merge(src proto.Message) {
+ xxx_messageInfo_TailDropDiscardConfig.Merge(m, src)
+}
+func (m *TailDropDiscardConfig) XXX_Size() int {
+ return xxx_messageInfo_TailDropDiscardConfig.Size(m)
+}
+func (m *TailDropDiscardConfig) XXX_DiscardUnknown() {
+ xxx_messageInfo_TailDropDiscardConfig.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_TailDropDiscardConfig proto.InternalMessageInfo
+
+func (m *TailDropDiscardConfig) GetQueueSize() uint32 {
+ if m != nil {
+ return m.QueueSize
+ }
+ return 0
+}
+
+type RedDiscardConfig struct {
+ MinThreshold uint32 `protobuf:"fixed32,1,opt,name=min_threshold,json=minThreshold,proto3" json:"min_threshold,omitempty"`
+ MaxThreshold uint32 `protobuf:"fixed32,2,opt,name=max_threshold,json=maxThreshold,proto3" json:"max_threshold,omitempty"`
+ MaxProbability uint32 `protobuf:"fixed32,3,opt,name=max_probability,json=maxProbability,proto3" json:"max_probability,omitempty"`
+ XXX_NoUnkeyedLiteral struct{} `json:"-"`
+ XXX_unrecognized []byte `json:"-"`
+ XXX_sizecache int32 `json:"-"`
+}
+
+func (m *RedDiscardConfig) Reset() { *m = RedDiscardConfig{} }
+func (m *RedDiscardConfig) String() string { return proto.CompactTextString(m) }
+func (*RedDiscardConfig) ProtoMessage() {}
+func (*RedDiscardConfig) Descriptor() ([]byte, []int) {
+ return fileDescriptor_d019a68bffe14cae, []int{5}
+}
+
+func (m *RedDiscardConfig) XXX_Unmarshal(b []byte) error {
+ return xxx_messageInfo_RedDiscardConfig.Unmarshal(m, b)
+}
+func (m *RedDiscardConfig) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+ return xxx_messageInfo_RedDiscardConfig.Marshal(b, m, deterministic)
+}
+func (m *RedDiscardConfig) XXX_Merge(src proto.Message) {
+ xxx_messageInfo_RedDiscardConfig.Merge(m, src)
+}
+func (m *RedDiscardConfig) XXX_Size() int {
+ return xxx_messageInfo_RedDiscardConfig.Size(m)
+}
+func (m *RedDiscardConfig) XXX_DiscardUnknown() {
+ xxx_messageInfo_RedDiscardConfig.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_RedDiscardConfig proto.InternalMessageInfo
+
+func (m *RedDiscardConfig) GetMinThreshold() uint32 {
+ if m != nil {
+ return m.MinThreshold
+ }
+ return 0
+}
+
+func (m *RedDiscardConfig) GetMaxThreshold() uint32 {
+ if m != nil {
+ return m.MaxThreshold
+ }
+ return 0
+}
+
+func (m *RedDiscardConfig) GetMaxProbability() uint32 {
+ if m != nil {
+ return m.MaxProbability
+ }
+ return 0
+}
+
+type WRedDiscardConfig struct {
+ Green *RedDiscardConfig `protobuf:"bytes,1,opt,name=green,proto3" json:"green,omitempty"`
+ Yellow *RedDiscardConfig `protobuf:"bytes,2,opt,name=yellow,proto3" json:"yellow,omitempty"`
+ Red *RedDiscardConfig `protobuf:"bytes,3,opt,name=red,proto3" json:"red,omitempty"`
+ XXX_NoUnkeyedLiteral struct{} `json:"-"`
+ XXX_unrecognized []byte `json:"-"`
+ XXX_sizecache int32 `json:"-"`
+}
+
+func (m *WRedDiscardConfig) Reset() { *m = WRedDiscardConfig{} }
+func (m *WRedDiscardConfig) String() string { return proto.CompactTextString(m) }
+func (*WRedDiscardConfig) ProtoMessage() {}
+func (*WRedDiscardConfig) Descriptor() ([]byte, []int) {
+ return fileDescriptor_d019a68bffe14cae, []int{6}
+}
+
+func (m *WRedDiscardConfig) XXX_Unmarshal(b []byte) error {
+ return xxx_messageInfo_WRedDiscardConfig.Unmarshal(m, b)
+}
+func (m *WRedDiscardConfig) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+ return xxx_messageInfo_WRedDiscardConfig.Marshal(b, m, deterministic)
+}
+func (m *WRedDiscardConfig) XXX_Merge(src proto.Message) {
+ xxx_messageInfo_WRedDiscardConfig.Merge(m, src)
+}
+func (m *WRedDiscardConfig) XXX_Size() int {
+ return xxx_messageInfo_WRedDiscardConfig.Size(m)
+}
+func (m *WRedDiscardConfig) XXX_DiscardUnknown() {
+ xxx_messageInfo_WRedDiscardConfig.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_WRedDiscardConfig proto.InternalMessageInfo
+
+func (m *WRedDiscardConfig) GetGreen() *RedDiscardConfig {
+ if m != nil {
+ return m.Green
+ }
+ return nil
+}
+
+func (m *WRedDiscardConfig) GetYellow() *RedDiscardConfig {
+ if m != nil {
+ return m.Yellow
+ }
+ return nil
+}
+
+func (m *WRedDiscardConfig) GetRed() *RedDiscardConfig {
+ if m != nil {
+ return m.Red
+ }
+ return nil
+}
+
+type DiscardConfig struct {
+ DiscardPolicy DiscardPolicy `protobuf:"varint,1,opt,name=discard_policy,json=discardPolicy,proto3,enum=tech_profile.DiscardPolicy" json:"discard_policy,omitempty"`
+ // Types that are valid to be assigned to DiscardConfig:
+ // *DiscardConfig_TailDropDiscardConfig
+ // *DiscardConfig_RedDiscardConfig
+ // *DiscardConfig_WredDiscardConfig
+ DiscardConfig isDiscardConfig_DiscardConfig `protobuf_oneof:"discard_config"`
+ XXX_NoUnkeyedLiteral struct{} `json:"-"`
+ XXX_unrecognized []byte `json:"-"`
+ XXX_sizecache int32 `json:"-"`
+}
+
+func (m *DiscardConfig) Reset() { *m = DiscardConfig{} }
+func (m *DiscardConfig) String() string { return proto.CompactTextString(m) }
+func (*DiscardConfig) ProtoMessage() {}
+func (*DiscardConfig) Descriptor() ([]byte, []int) {
+ return fileDescriptor_d019a68bffe14cae, []int{7}
+}
+
+func (m *DiscardConfig) XXX_Unmarshal(b []byte) error {
+ return xxx_messageInfo_DiscardConfig.Unmarshal(m, b)
+}
+func (m *DiscardConfig) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+ return xxx_messageInfo_DiscardConfig.Marshal(b, m, deterministic)
+}
+func (m *DiscardConfig) XXX_Merge(src proto.Message) {
+ xxx_messageInfo_DiscardConfig.Merge(m, src)
+}
+func (m *DiscardConfig) XXX_Size() int {
+ return xxx_messageInfo_DiscardConfig.Size(m)
+}
+func (m *DiscardConfig) XXX_DiscardUnknown() {
+ xxx_messageInfo_DiscardConfig.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_DiscardConfig proto.InternalMessageInfo
+
+func (m *DiscardConfig) GetDiscardPolicy() DiscardPolicy {
+ if m != nil {
+ return m.DiscardPolicy
+ }
+ return DiscardPolicy_TailDrop
+}
+
+type isDiscardConfig_DiscardConfig interface {
+ isDiscardConfig_DiscardConfig()
+}
+
+type DiscardConfig_TailDropDiscardConfig struct {
+ TailDropDiscardConfig *TailDropDiscardConfig `protobuf:"bytes,2,opt,name=tail_drop_discard_config,json=tailDropDiscardConfig,proto3,oneof"`
+}
+
+type DiscardConfig_RedDiscardConfig struct {
+ RedDiscardConfig *RedDiscardConfig `protobuf:"bytes,3,opt,name=red_discard_config,json=redDiscardConfig,proto3,oneof"`
+}
+
+type DiscardConfig_WredDiscardConfig struct {
+ WredDiscardConfig *WRedDiscardConfig `protobuf:"bytes,4,opt,name=wred_discard_config,json=wredDiscardConfig,proto3,oneof"`
+}
+
+func (*DiscardConfig_TailDropDiscardConfig) isDiscardConfig_DiscardConfig() {}
+
+func (*DiscardConfig_RedDiscardConfig) isDiscardConfig_DiscardConfig() {}
+
+func (*DiscardConfig_WredDiscardConfig) isDiscardConfig_DiscardConfig() {}
+
+func (m *DiscardConfig) GetDiscardConfig() isDiscardConfig_DiscardConfig {
+ if m != nil {
+ return m.DiscardConfig
+ }
+ return nil
+}
+
+func (m *DiscardConfig) GetTailDropDiscardConfig() *TailDropDiscardConfig {
+ if x, ok := m.GetDiscardConfig().(*DiscardConfig_TailDropDiscardConfig); ok {
+ return x.TailDropDiscardConfig
+ }
+ return nil
+}
+
+func (m *DiscardConfig) GetRedDiscardConfig() *RedDiscardConfig {
+ if x, ok := m.GetDiscardConfig().(*DiscardConfig_RedDiscardConfig); ok {
+ return x.RedDiscardConfig
+ }
+ return nil
+}
+
+func (m *DiscardConfig) GetWredDiscardConfig() *WRedDiscardConfig {
+ if x, ok := m.GetDiscardConfig().(*DiscardConfig_WredDiscardConfig); ok {
+ return x.WredDiscardConfig
+ }
+ return nil
+}
+
+// XXX_OneofWrappers is for the internal use of the proto package.
+func (*DiscardConfig) XXX_OneofWrappers() []interface{} {
+ return []interface{}{
+ (*DiscardConfig_TailDropDiscardConfig)(nil),
+ (*DiscardConfig_RedDiscardConfig)(nil),
+ (*DiscardConfig_WredDiscardConfig)(nil),
+ }
+}
+
+type TrafficQueue struct {
+ Direction Direction `protobuf:"varint,1,opt,name=direction,proto3,enum=tech_profile.Direction" json:"direction,omitempty"`
+ GemportId uint32 `protobuf:"fixed32,2,opt,name=gemport_id,json=gemportId,proto3" json:"gemport_id,omitempty"`
+ PbitMap string `protobuf:"bytes,3,opt,name=pbit_map,json=pbitMap,proto3" json:"pbit_map,omitempty"`
+ AesEncryption bool `protobuf:"varint,4,opt,name=aes_encryption,json=aesEncryption,proto3" json:"aes_encryption,omitempty"`
+ SchedPolicy SchedulingPolicy `protobuf:"varint,5,opt,name=sched_policy,json=schedPolicy,proto3,enum=tech_profile.SchedulingPolicy" json:"sched_policy,omitempty"`
+ Priority uint32 `protobuf:"fixed32,6,opt,name=priority,proto3" json:"priority,omitempty"`
+ Weight uint32 `protobuf:"fixed32,7,opt,name=weight,proto3" json:"weight,omitempty"`
+ DiscardPolicy DiscardPolicy `protobuf:"varint,8,opt,name=discard_policy,json=discardPolicy,proto3,enum=tech_profile.DiscardPolicy" json:"discard_policy,omitempty"`
+ DiscardConfig *DiscardConfig `protobuf:"bytes,9,opt,name=discard_config,json=discardConfig,proto3" json:"discard_config,omitempty"`
+ XXX_NoUnkeyedLiteral struct{} `json:"-"`
+ XXX_unrecognized []byte `json:"-"`
+ XXX_sizecache int32 `json:"-"`
+}
+
+func (m *TrafficQueue) Reset() { *m = TrafficQueue{} }
+func (m *TrafficQueue) String() string { return proto.CompactTextString(m) }
+func (*TrafficQueue) ProtoMessage() {}
+func (*TrafficQueue) Descriptor() ([]byte, []int) {
+ return fileDescriptor_d019a68bffe14cae, []int{8}
+}
+
+func (m *TrafficQueue) XXX_Unmarshal(b []byte) error {
+ return xxx_messageInfo_TrafficQueue.Unmarshal(m, b)
+}
+func (m *TrafficQueue) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+ return xxx_messageInfo_TrafficQueue.Marshal(b, m, deterministic)
+}
+func (m *TrafficQueue) XXX_Merge(src proto.Message) {
+ xxx_messageInfo_TrafficQueue.Merge(m, src)
+}
+func (m *TrafficQueue) XXX_Size() int {
+ return xxx_messageInfo_TrafficQueue.Size(m)
+}
+func (m *TrafficQueue) XXX_DiscardUnknown() {
+ xxx_messageInfo_TrafficQueue.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_TrafficQueue proto.InternalMessageInfo
+
+func (m *TrafficQueue) GetDirection() Direction {
+ if m != nil {
+ return m.Direction
+ }
+ return Direction_UPSTREAM
+}
+
+func (m *TrafficQueue) GetGemportId() uint32 {
+ if m != nil {
+ return m.GemportId
+ }
+ return 0
+}
+
+func (m *TrafficQueue) GetPbitMap() string {
+ if m != nil {
+ return m.PbitMap
+ }
+ return ""
+}
+
+func (m *TrafficQueue) GetAesEncryption() bool {
+ if m != nil {
+ return m.AesEncryption
+ }
+ return false
+}
+
+func (m *TrafficQueue) GetSchedPolicy() SchedulingPolicy {
+ if m != nil {
+ return m.SchedPolicy
+ }
+ return SchedulingPolicy_WRR
+}
+
+func (m *TrafficQueue) GetPriority() uint32 {
+ if m != nil {
+ return m.Priority
+ }
+ return 0
+}
+
+func (m *TrafficQueue) GetWeight() uint32 {
+ if m != nil {
+ return m.Weight
+ }
+ return 0
+}
+
+func (m *TrafficQueue) GetDiscardPolicy() DiscardPolicy {
+ if m != nil {
+ return m.DiscardPolicy
+ }
+ return DiscardPolicy_TailDrop
+}
+
+func (m *TrafficQueue) GetDiscardConfig() *DiscardConfig {
+ if m != nil {
+ return m.DiscardConfig
+ }
+ return nil
+}
+
+type TrafficQueues struct {
+ IntfId uint32 `protobuf:"fixed32,1,opt,name=intf_id,json=intfId,proto3" json:"intf_id,omitempty"`
+ OnuId uint32 `protobuf:"fixed32,2,opt,name=onu_id,json=onuId,proto3" json:"onu_id,omitempty"`
+ UniId uint32 `protobuf:"fixed32,4,opt,name=uni_id,json=uniId,proto3" json:"uni_id,omitempty"`
+ PortNo uint32 `protobuf:"fixed32,5,opt,name=port_no,json=portNo,proto3" json:"port_no,omitempty"`
+ TrafficQueues []*TrafficQueue `protobuf:"bytes,6,rep,name=traffic_queues,json=trafficQueues,proto3" json:"traffic_queues,omitempty"`
+ XXX_NoUnkeyedLiteral struct{} `json:"-"`
+ XXX_unrecognized []byte `json:"-"`
+ XXX_sizecache int32 `json:"-"`
+}
+
+func (m *TrafficQueues) Reset() { *m = TrafficQueues{} }
+func (m *TrafficQueues) String() string { return proto.CompactTextString(m) }
+func (*TrafficQueues) ProtoMessage() {}
+func (*TrafficQueues) Descriptor() ([]byte, []int) {
+ return fileDescriptor_d019a68bffe14cae, []int{9}
+}
+
+func (m *TrafficQueues) XXX_Unmarshal(b []byte) error {
+ return xxx_messageInfo_TrafficQueues.Unmarshal(m, b)
+}
+func (m *TrafficQueues) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+ return xxx_messageInfo_TrafficQueues.Marshal(b, m, deterministic)
+}
+func (m *TrafficQueues) XXX_Merge(src proto.Message) {
+ xxx_messageInfo_TrafficQueues.Merge(m, src)
+}
+func (m *TrafficQueues) XXX_Size() int {
+ return xxx_messageInfo_TrafficQueues.Size(m)
+}
+func (m *TrafficQueues) XXX_DiscardUnknown() {
+ xxx_messageInfo_TrafficQueues.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_TrafficQueues proto.InternalMessageInfo
+
+func (m *TrafficQueues) GetIntfId() uint32 {
+ if m != nil {
+ return m.IntfId
+ }
+ return 0
+}
+
+func (m *TrafficQueues) GetOnuId() uint32 {
+ if m != nil {
+ return m.OnuId
+ }
+ return 0
+}
+
+func (m *TrafficQueues) GetUniId() uint32 {
+ if m != nil {
+ return m.UniId
+ }
+ return 0
+}
+
+func (m *TrafficQueues) GetPortNo() uint32 {
+ if m != nil {
+ return m.PortNo
+ }
+ return 0
+}
+
+func (m *TrafficQueues) GetTrafficQueues() []*TrafficQueue {
+ if m != nil {
+ return m.TrafficQueues
+ }
+ return nil
+}
+
+func init() {
+ proto.RegisterEnum("tech_profile.Direction", Direction_name, Direction_value)
+ proto.RegisterEnum("tech_profile.SchedulingPolicy", SchedulingPolicy_name, SchedulingPolicy_value)
+ proto.RegisterEnum("tech_profile.AdditionalBW", AdditionalBW_name, AdditionalBW_value)
+ proto.RegisterEnum("tech_profile.DiscardPolicy", DiscardPolicy_name, DiscardPolicy_value)
+ proto.RegisterEnum("tech_profile.InferredAdditionBWIndication", InferredAdditionBWIndication_name, InferredAdditionBWIndication_value)
+ proto.RegisterType((*SchedulerConfig)(nil), "tech_profile.SchedulerConfig")
+ proto.RegisterType((*TrafficShapingInfo)(nil), "tech_profile.TrafficShapingInfo")
+ proto.RegisterType((*TrafficScheduler)(nil), "tech_profile.TrafficScheduler")
+ proto.RegisterType((*TrafficSchedulers)(nil), "tech_profile.TrafficSchedulers")
+ proto.RegisterType((*TailDropDiscardConfig)(nil), "tech_profile.TailDropDiscardConfig")
+ proto.RegisterType((*RedDiscardConfig)(nil), "tech_profile.RedDiscardConfig")
+ proto.RegisterType((*WRedDiscardConfig)(nil), "tech_profile.WRedDiscardConfig")
+ proto.RegisterType((*DiscardConfig)(nil), "tech_profile.DiscardConfig")
+ proto.RegisterType((*TrafficQueue)(nil), "tech_profile.TrafficQueue")
+ proto.RegisterType((*TrafficQueues)(nil), "tech_profile.TrafficQueues")
+}
+
+func init() { proto.RegisterFile("voltha_protos/tech_profile.proto", fileDescriptor_d019a68bffe14cae) }
+
+var fileDescriptor_d019a68bffe14cae = []byte{
+ // 1103 bytes of a gzipped FileDescriptorProto
+ 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xb4, 0x56, 0xdd, 0x6e, 0x1b, 0x45,
+ 0x14, 0xf6, 0xda, 0x8d, 0x7f, 0x4e, 0x6c, 0x77, 0x33, 0x25, 0xd4, 0xa4, 0x0d, 0x04, 0x97, 0xaa,
+ 0x91, 0x11, 0x09, 0xa4, 0xd0, 0x9b, 0x22, 0x55, 0x76, 0x13, 0x29, 0x96, 0x68, 0x9a, 0x4e, 0x82,
+ 0x2c, 0x71, 0xc1, 0x6a, 0xbc, 0x33, 0xb6, 0x47, 0x5a, 0xcf, 0x2c, 0xb3, 0x63, 0x9c, 0xf4, 0x8a,
+ 0x1b, 0xde, 0x82, 0x5b, 0x5e, 0x00, 0x6e, 0x10, 0x4f, 0xc4, 0x0b, 0x70, 0x8f, 0x66, 0x76, 0xd7,
+ 0xf6, 0xda, 0x26, 0x85, 0x0a, 0xee, 0xe6, 0x7c, 0xfb, 0xcd, 0x99, 0xf3, 0xcd, 0xf9, 0xd9, 0x81,
+ 0xbd, 0xef, 0x65, 0xa0, 0x47, 0xc4, 0x0b, 0x95, 0xd4, 0x32, 0x3a, 0xd4, 0xcc, 0x1f, 0x99, 0xf5,
+ 0x80, 0x07, 0xec, 0xc0, 0x62, 0xa8, 0xba, 0x88, 0xed, 0xdc, 0x1f, 0x4a, 0x39, 0x0c, 0xd8, 0x21,
+ 0x09, 0xf9, 0x21, 0x11, 0x42, 0x6a, 0xa2, 0xb9, 0x14, 0x51, 0xcc, 0x6d, 0xfe, 0x90, 0x87, 0xdb,
+ 0x17, 0xfe, 0x88, 0xd1, 0x49, 0xc0, 0xd4, 0x73, 0x29, 0x06, 0x7c, 0x88, 0xbe, 0x80, 0x0a, 0xe5,
+ 0x8a, 0xf9, 0x86, 0xd7, 0x70, 0xf6, 0x9c, 0xfd, 0xfa, 0xd1, 0xdd, 0x83, 0xcc, 0x39, 0xc7, 0xe9,
+ 0x67, 0x3c, 0x67, 0xa2, 0x67, 0x50, 0x23, 0x94, 0x72, 0xb3, 0x26, 0x81, 0xd7, 0x9f, 0x36, 0xf2,
+ 0x76, 0xeb, 0x4e, 0x76, 0x6b, 0x7b, 0x46, 0xe9, 0xf4, 0x70, 0x75, 0xbe, 0xa1, 0x33, 0x45, 0x3b,
+ 0x50, 0x0e, 0x15, 0x97, 0x8a, 0xeb, 0xeb, 0x46, 0x61, 0xcf, 0xd9, 0x2f, 0xe1, 0x99, 0x8d, 0xde,
+ 0x85, 0xe2, 0x94, 0xf1, 0xe1, 0x48, 0x37, 0x6e, 0xd9, 0x2f, 0x89, 0x85, 0xda, 0x50, 0x8d, 0x4c,
+ 0xf8, 0x5e, 0x28, 0x03, 0xee, 0x5f, 0x37, 0x36, 0xec, 0x99, 0xef, 0x67, 0xcf, 0x4c, 0x04, 0x72,
+ 0x31, 0x3c, 0xb7, 0x2c, 0xbc, 0x69, 0xf7, 0xc4, 0x46, 0xf3, 0x37, 0x07, 0xd0, 0xa5, 0x22, 0x83,
+ 0x01, 0xf7, 0x2f, 0x46, 0x24, 0xe4, 0x62, 0xd8, 0x15, 0x03, 0x89, 0x5c, 0x28, 0xf8, 0x5c, 0x59,
+ 0xfd, 0x25, 0x6c, 0x96, 0x16, 0xe9, 0x47, 0x56, 0x96, 0x41, 0xfa, 0x91, 0x41, 0x42, 0xae, 0x92,
+ 0x60, 0xcd, 0xd2, 0x22, 0xfd, 0x28, 0x09, 0xd2, 0x2c, 0x0d, 0x32, 0xe4, 0xca, 0x06, 0x56, 0xc2,
+ 0x66, 0x89, 0x4e, 0x01, 0x08, 0xa5, 0x5e, 0x7f, 0xea, 0x71, 0x41, 0x1b, 0x45, 0x1b, 0x71, 0x2b,
+ 0x1b, 0x71, 0x57, 0x0c, 0x98, 0x52, 0x8c, 0xa6, 0xb7, 0xd5, 0xe9, 0x75, 0x05, 0xe5, 0xbe, 0x4d,
+ 0x1d, 0x2e, 0x13, 0x4a, 0x3b, 0xd3, 0xae, 0xa0, 0xcd, 0x3f, 0x1d, 0x70, 0xd3, 0xd0, 0xd3, 0x24,
+ 0xbe, 0x6d, 0xfa, 0xde, 0x83, 0x32, 0x09, 0x02, 0xe9, 0x7b, 0x9c, 0x26, 0x12, 0x4b, 0xd6, 0xee,
+ 0x52, 0xf4, 0x14, 0x2a, 0x51, 0xea, 0xde, 0x8a, 0xdd, 0x3c, 0xda, 0x5d, 0x7b, 0xc3, 0x69, 0x09,
+ 0xe1, 0x39, 0x1f, 0x61, 0x78, 0x47, 0xc7, 0x21, 0x7a, 0x51, 0x7c, 0xbd, 0x1e, 0x17, 0x03, 0x69,
+ 0xaf, 0x68, 0xf3, 0x68, 0x2f, 0xeb, 0x67, 0x35, 0x0f, 0x18, 0xe9, 0x15, 0xac, 0xf9, 0xbb, 0x03,
+ 0x5b, 0xcb, 0xba, 0x23, 0x74, 0x17, 0x4a, 0x5c, 0xe8, 0x81, 0x11, 0x10, 0x67, 0xad, 0x68, 0xcc,
+ 0x2e, 0x45, 0xdb, 0x50, 0x94, 0x62, 0x32, 0x17, 0xb6, 0x21, 0xc5, 0x24, 0x86, 0x27, 0x82, 0x1b,
+ 0x38, 0x4e, 0xd7, 0xc6, 0x44, 0xf0, 0x2e, 0x35, 0x6e, 0x42, 0xa9, 0xb4, 0x27, 0x64, 0x92, 0xb4,
+ 0xa2, 0x31, 0xcf, 0x24, 0x3a, 0x81, 0xfa, 0x4c, 0x89, 0x39, 0x35, 0x6a, 0x14, 0xf6, 0x0a, 0xfb,
+ 0x9b, 0xcb, 0xd5, 0xb6, 0x1c, 0x18, 0xae, 0xe9, 0x05, 0x24, 0x6a, 0x3e, 0x81, 0xed, 0x4b, 0xc2,
+ 0x83, 0x63, 0x25, 0xc3, 0x63, 0x1e, 0xf9, 0x44, 0xd1, 0xa4, 0xef, 0x76, 0x01, 0xbe, 0x9b, 0xb0,
+ 0x09, 0xf3, 0x22, 0xfe, 0x9a, 0x25, 0x12, 0x2a, 0x16, 0xb9, 0xe0, 0xaf, 0x59, 0xf3, 0x47, 0x07,
+ 0x5c, 0xcc, 0x68, 0x76, 0xcf, 0x03, 0xa8, 0x8d, 0xb9, 0xf0, 0xf4, 0x48, 0xb1, 0x68, 0x24, 0x83,
+ 0x54, 0x79, 0x75, 0xcc, 0xc5, 0x65, 0x8a, 0x59, 0x12, 0xb9, 0x5a, 0x20, 0xe5, 0x13, 0x12, 0xb9,
+ 0x9a, 0x93, 0x1e, 0xc1, 0x6d, 0x43, 0x0a, 0x95, 0xec, 0x93, 0x3e, 0x0f, 0xe6, 0x4d, 0x58, 0x1f,
+ 0x93, 0xab, 0xf3, 0x39, 0xda, 0xfc, 0xd5, 0x81, 0xad, 0xde, 0x4a, 0x20, 0x9f, 0xc3, 0xc6, 0x50,
+ 0x31, 0x16, 0x57, 0xdc, 0xca, 0x9d, 0x2c, 0xd3, 0x71, 0x4c, 0x46, 0x4f, 0xa0, 0x78, 0xcd, 0x82,
+ 0x40, 0xc6, 0xc3, 0xe2, 0xcd, 0xdb, 0x12, 0x36, 0xfa, 0x14, 0x0a, 0x8a, 0xd1, 0xa4, 0x16, 0xdf,
+ 0xb4, 0xc9, 0x50, 0x9b, 0x7f, 0xe4, 0xa1, 0x96, 0x8d, 0xb8, 0x03, 0x75, 0x1a, 0x03, 0xe9, 0xf0,
+ 0x88, 0x9b, 0xe5, 0xde, 0x72, 0xb3, 0x58, 0x4e, 0x32, 0x39, 0x6a, 0x74, 0xd1, 0x44, 0xdf, 0x42,
+ 0x43, 0x13, 0x1e, 0x78, 0x54, 0xc9, 0xd0, 0x4b, 0xbd, 0xf9, 0xd6, 0x7f, 0xa2, 0xe8, 0xc1, 0x52,
+ 0x71, 0xac, 0xcb, 0xfc, 0x69, 0x0e, 0x6f, 0xeb, 0xb5, 0x25, 0x71, 0x06, 0x48, 0x31, 0xba, 0xec,
+ 0xf9, 0x1f, 0xc9, 0x3e, 0xcd, 0x61, 0x57, 0x2d, 0x67, 0xe9, 0x15, 0xdc, 0x99, 0xae, 0x71, 0x18,
+ 0xf7, 0xe2, 0x07, 0x59, 0x87, 0xbd, 0x35, 0x1e, 0xb7, 0xa6, 0xcb, 0x2e, 0x3b, 0xee, 0xfc, 0x1a,
+ 0x63, 0x6f, 0xcd, 0x9f, 0x0b, 0x50, 0x4d, 0x9a, 0xe0, 0x95, 0xa9, 0xde, 0xb7, 0x9d, 0x48, 0xbb,
+ 0x00, 0x43, 0x36, 0xb6, 0xbd, 0x38, 0x6b, 0xdd, 0x4a, 0x82, 0x74, 0xa9, 0x19, 0x58, 0x61, 0x9f,
+ 0x6b, 0x6f, 0x4c, 0x42, 0x7b, 0x23, 0x15, 0x5c, 0x32, 0xf6, 0x0b, 0x12, 0xa2, 0x87, 0x50, 0x27,
+ 0x2c, 0xf2, 0x98, 0xf0, 0xd5, 0x75, 0x68, 0x4f, 0x35, 0x0a, 0xcb, 0xb8, 0x46, 0x58, 0x74, 0x32,
+ 0x03, 0xff, 0x83, 0x9f, 0x47, 0xe6, 0x9f, 0x55, 0xfc, 0xdb, 0x7f, 0x56, 0x29, 0xf3, 0xcf, 0x5a,
+ 0x2d, 0xbc, 0xf2, 0xbf, 0x2e, 0xbc, 0xce, 0xf2, 0xad, 0x37, 0x2a, 0x36, 0x87, 0xeb, 0x7d, 0x24,
+ 0x8d, 0x90, 0xfa, 0x88, 0xcd, 0xe6, 0x2f, 0x0e, 0xd4, 0x16, 0xf3, 0xf4, 0xff, 0x4f, 0xd0, 0xf6,
+ 0x7c, 0x82, 0xda, 0xb9, 0x16, 0x35, 0x8a, 0x76, 0x82, 0xee, 0xac, 0x9d, 0xa0, 0x36, 0xa8, 0xd9,
+ 0xf4, 0x8c, 0x43, 0x6c, 0x7d, 0x09, 0x95, 0x59, 0xb1, 0xa0, 0x2a, 0x94, 0xbf, 0x3e, 0xbf, 0xb8,
+ 0xc4, 0x27, 0xed, 0x17, 0x6e, 0x0e, 0xd5, 0x01, 0x8e, 0x5f, 0xf6, 0xce, 0x12, 0xdb, 0x41, 0x5b,
+ 0x50, 0xeb, 0x74, 0x8f, 0xbb, 0xf8, 0xe4, 0xf9, 0x65, 0xf7, 0xe5, 0x59, 0xfb, 0x2b, 0x37, 0xdf,
+ 0x7a, 0x0a, 0xee, 0x72, 0x3e, 0x51, 0x09, 0x0a, 0x3d, 0x8c, 0xdd, 0x1c, 0x42, 0x50, 0xbf, 0xd0,
+ 0x8a, 0xfb, 0xfa, 0x3c, 0xc9, 0xa0, 0xeb, 0x20, 0x80, 0xe2, 0xe9, 0x75, 0x5f, 0x71, 0xea, 0xe6,
+ 0x5b, 0x02, 0xaa, 0x8b, 0xaf, 0x17, 0xb4, 0x0d, 0x5b, 0x8b, 0xb6, 0x77, 0x26, 0x05, 0x73, 0x73,
+ 0xe8, 0x0e, 0xdc, 0xce, 0xc2, 0x6d, 0xd7, 0x41, 0xf7, 0xe0, 0x6e, 0x06, 0xec, 0xb0, 0x48, 0x9f,
+ 0x0c, 0x06, 0x52, 0x69, 0x37, 0xbf, 0xe2, 0xa8, 0x3d, 0xd1, 0xd2, 0x2d, 0xb4, 0x9e, 0xcd, 0x26,
+ 0x56, 0x12, 0x69, 0x15, 0xca, 0xe9, 0xfc, 0x70, 0x73, 0xa8, 0x06, 0x95, 0xde, 0xcc, 0x74, 0x8c,
+ 0x0c, 0xcc, 0xa8, 0x9b, 0x47, 0x65, 0xb8, 0x65, 0x5a, 0xd7, 0x2d, 0xb4, 0x7e, 0x72, 0xe0, 0xfe,
+ 0x4d, 0x2f, 0x09, 0xf4, 0x10, 0x3e, 0xbc, 0xe9, 0x7b, 0xaa, 0x68, 0x1f, 0x3e, 0xba, 0x91, 0xd6,
+ 0x8e, 0xa2, 0x89, 0x62, 0xd4, 0x75, 0xd0, 0xc7, 0xf0, 0xe8, 0x46, 0xe6, 0xa2, 0xec, 0xce, 0xe3,
+ 0x6f, 0x3e, 0x1b, 0x72, 0x3d, 0x9a, 0xf4, 0x0f, 0x7c, 0x39, 0x3e, 0x94, 0x21, 0x13, 0xbe, 0x54,
+ 0xf4, 0x30, 0x7e, 0xdf, 0x7e, 0x92, 0xbc, 0x6f, 0x87, 0x32, 0xf3, 0xc4, 0xed, 0x17, 0x2d, 0xfe,
+ 0xf8, 0xaf, 0x00, 0x00, 0x00, 0xff, 0xff, 0x5f, 0x7b, 0x91, 0x72, 0x07, 0x0b, 0x00, 0x00,
+}
diff --git a/vendor/github.com/opencord/voltha-protos/go/voltha.pb b/vendor/github.com/opencord/voltha-protos/go/voltha.pb
index 3aaf45e..9089554 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/logical_device.pb.go b/vendor/github.com/opencord/voltha-protos/go/voltha/logical_device.pb.go
index bd435c5..ea87a4c 100644
--- a/vendor/github.com/opencord/voltha-protos/go/voltha/logical_device.pb.go
+++ b/vendor/github.com/opencord/voltha-protos/go/voltha/logical_device.pb.go
@@ -206,10 +206,12 @@
// flows configured on the logical device
Flows *openflow_13.Flows `protobuf:"bytes,129,opt,name=flows,proto3" json:"flows,omitempty"`
// flow groups configured on the logical device
- FlowGroups *openflow_13.FlowGroups `protobuf:"bytes,130,opt,name=flow_groups,json=flowGroups,proto3" json:"flow_groups,omitempty"`
- XXX_NoUnkeyedLiteral struct{} `json:"-"`
- XXX_unrecognized []byte `json:"-"`
- XXX_sizecache int32 `json:"-"`
+ FlowGroups *openflow_13.FlowGroups `protobuf:"bytes,130,opt,name=flow_groups,json=flowGroups,proto3" json:"flow_groups,omitempty"`
+ // meters configured on the logical device
+ Meters *openflow_13.Meters `protobuf:"bytes,131,opt,name=meters,proto3" json:"meters,omitempty"`
+ XXX_NoUnkeyedLiteral struct{} `json:"-"`
+ XXX_unrecognized []byte `json:"-"`
+ XXX_sizecache int32 `json:"-"`
}
func (m *LogicalDevice) Reset() { *m = LogicalDevice{} }
@@ -293,6 +295,13 @@
return nil
}
+func (m *LogicalDevice) GetMeters() *openflow_13.Meters {
+ if m != nil {
+ return m.Meters
+ }
+ return nil
+}
+
type LogicalDevices struct {
Items []*LogicalDevice `protobuf:"bytes,1,rep,name=items,proto3" json:"items,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
@@ -343,37 +352,39 @@
func init() { proto.RegisterFile("voltha_protos/logical_device.proto", fileDescriptor_caf139ab3abc8240) }
var fileDescriptor_caf139ab3abc8240 = []byte{
- // 512 bytes of a gzipped FileDescriptorProto
- 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x74, 0x53, 0x4f, 0x6b, 0x13, 0x41,
- 0x14, 0x77, 0x9b, 0x6c, 0x9a, 0xbc, 0x4d, 0x23, 0x8c, 0x94, 0x2e, 0xad, 0xd2, 0xb0, 0x78, 0x48,
- 0x29, 0x4d, 0x6a, 0x8a, 0xa0, 0x07, 0x41, 0x43, 0xa9, 0x04, 0x44, 0x64, 0xbc, 0x79, 0x59, 0xa6,
- 0x3b, 0x9b, 0xcd, 0x40, 0x92, 0xb7, 0xec, 0x4c, 0xda, 0xab, 0x7a, 0xf1, 0xd3, 0xf9, 0x25, 0xfc,
- 0x08, 0x1e, 0x3c, 0xcb, 0xbc, 0xd9, 0xad, 0xd9, 0xa6, 0x1e, 0xf7, 0xf7, 0xe7, 0xbd, 0xdf, 0xfc,
- 0x1e, 0x0b, 0xd1, 0x0d, 0x2e, 0xcc, 0x5c, 0xc4, 0x79, 0x81, 0x06, 0xf5, 0x68, 0x81, 0x99, 0x4a,
- 0xc4, 0x22, 0x96, 0xe9, 0x8d, 0x4a, 0xd2, 0x21, 0xa1, 0xac, 0xe5, 0x34, 0x87, 0x4f, 0x33, 0xc4,
- 0x6c, 0x91, 0x8e, 0x44, 0xae, 0x46, 0x62, 0xb5, 0x42, 0x23, 0x8c, 0xc2, 0x95, 0x76, 0xaa, 0xc3,
- 0xb0, 0x3e, 0x69, 0x99, 0x1a, 0x51, 0x32, 0xc7, 0x75, 0x06, 0xf3, 0x74, 0x35, 0x5b, 0xe0, 0x6d,
- 0xfc, 0xe2, 0xc2, 0x09, 0xa2, 0x57, 0xb0, 0xf7, 0xc1, 0x2d, 0xfe, 0x84, 0x85, 0x99, 0x4a, 0xd6,
- 0x83, 0x1d, 0x25, 0x43, 0xaf, 0xef, 0x0d, 0x3a, 0x7c, 0x47, 0x49, 0x76, 0x00, 0xbb, 0x39, 0x16,
- 0x26, 0x56, 0x32, 0xdc, 0x21, 0xb0, 0x95, 0x93, 0x30, 0xfa, 0xed, 0x41, 0xb0, 0x61, 0xdd, 0x32,
- 0x9e, 0x43, 0x1b, 0x67, 0x79, 0x6c, 0xd5, 0xe4, 0x0c, 0xc6, 0xfb, 0xc3, 0xcd, 0xfd, 0x15, 0xc9,
- 0x77, 0x71, 0x96, 0xd3, 0x84, 0x23, 0xe8, 0xb8, 0xc7, 0xdb, 0x65, 0x0d, 0x1a, 0xd4, 0x76, 0xc0,
- 0x54, 0xb2, 0xe7, 0xd0, 0x2b, 0x49, 0x8a, 0xb3, 0xc2, 0xb0, 0xd9, 0xf7, 0x06, 0x7b, 0xbc, 0xeb,
- 0x50, 0x3b, 0xe0, 0x23, 0xda, 0x11, 0x05, 0xa2, 0x71, 0x5b, 0xfd, 0xbe, 0x37, 0x68, 0xf3, 0xb6,
- 0x05, 0x68, 0xfe, 0x3b, 0xe8, 0x55, 0x4b, 0x63, 0x6d, 0x84, 0xd1, 0x61, 0x8b, 0x72, 0x1d, 0x3d,
- 0x98, 0xcb, 0x49, 0x78, 0xb7, 0x4c, 0xf7, 0xd9, 0x7e, 0x45, 0xaf, 0xa1, 0xbb, 0xf1, 0x66, 0xcd,
- 0x4e, 0xc0, 0x57, 0x26, 0x5d, 0xea, 0xd0, 0xeb, 0x37, 0x06, 0xc1, 0xf8, 0xc9, 0xd0, 0xf5, 0x3d,
- 0xdc, 0x10, 0x71, 0xa7, 0x88, 0x7e, 0x34, 0xee, 0xaa, 0xbe, 0xa4, 0xc8, 0x5b, 0x8d, 0x1d, 0x43,
- 0x20, 0x85, 0x11, 0xb9, 0x30, 0xf3, 0xaa, 0xee, 0x26, 0x87, 0x0a, 0x9a, 0x4a, 0x76, 0x02, 0x4d,
- 0x99, 0xea, 0x84, 0xba, 0x79, 0xa8, 0x4e, 0x4b, 0x72, 0x92, 0xb0, 0x29, 0x3c, 0xd6, 0xb7, 0xca,
- 0x24, 0xf3, 0x78, 0x96, 0x0a, 0xb3, 0x2e, 0x52, 0x4d, 0x7d, 0x05, 0xe3, 0xfe, 0x96, 0xeb, 0x9e,
- 0x8e, 0xf7, 0x1c, 0x70, 0x55, 0x7e, 0xdb, 0xe6, 0xa9, 0xd3, 0x7f, 0xb7, 0xf1, 0x29, 0x72, 0xd7,
- 0xa2, 0x97, 0xd5, 0x7d, 0x5e, 0x82, 0x6f, 0x5b, 0xd3, 0xe1, 0xd7, 0xff, 0x57, 0x31, 0xe9, 0xfc,
- 0xfa, 0xf3, 0xf3, 0x59, 0xd3, 0x3e, 0x9b, 0x3b, 0x35, 0x3b, 0x07, 0xdf, 0x66, 0xd1, 0xe1, 0x37,
- 0x8f, 0xe2, 0xb1, 0x5a, 0xbc, 0x2b, 0x4b, 0x4d, 0x7c, 0xeb, 0x7a, 0xc4, 0x9d, 0x90, 0xbd, 0x85,
- 0x80, 0xe8, 0xac, 0xc0, 0x75, 0xae, 0xc3, 0xef, 0xce, 0x77, 0xb0, 0xe5, 0x7b, 0x4f, 0x7c, 0x65,
- 0x86, 0xd9, 0x1d, 0x14, 0xbd, 0x81, 0x5e, 0xed, 0x10, 0x9a, 0x9d, 0xd6, 0xcf, 0xb8, 0x7f, 0x2f,
- 0xbb, 0x93, 0x95, 0x87, 0x9c, 0x9c, 0x7d, 0x39, 0xcd, 0x94, 0x99, 0xaf, 0xaf, 0x87, 0x09, 0x2e,
- 0xe9, 0x97, 0x4a, 0xb0, 0x90, 0x23, 0x67, 0x39, 0x2b, 0xff, 0xb4, 0x0c, 0x4b, 0xe0, 0xba, 0x45,
- 0xc8, 0xc5, 0xdf, 0x00, 0x00, 0x00, 0xff, 0xff, 0x23, 0x92, 0xcd, 0x9e, 0xef, 0x03, 0x00, 0x00,
+ // 532 bytes of a gzipped FileDescriptorProto
+ 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x74, 0x53, 0xcd, 0x6a, 0xdb, 0x40,
+ 0x10, 0xae, 0x6c, 0xcb, 0xb1, 0x47, 0x8e, 0x0b, 0x1b, 0x42, 0x44, 0xd2, 0x12, 0x23, 0x7a, 0x70,
+ 0x08, 0xb1, 0x53, 0x9b, 0x42, 0x7b, 0x28, 0xb4, 0x26, 0xa4, 0x18, 0xda, 0x52, 0xb6, 0xb7, 0x5e,
+ 0xc4, 0x46, 0x5a, 0xcb, 0x02, 0xdb, 0x23, 0xb4, 0xeb, 0xe4, 0xda, 0x9f, 0xd7, 0xea, 0x2b, 0xf4,
+ 0x25, 0xfa, 0x08, 0x3d, 0xf4, 0x5c, 0x76, 0x56, 0x4a, 0xad, 0x38, 0x39, 0xea, 0xfb, 0x99, 0xf9,
+ 0xf6, 0x1b, 0x04, 0xc1, 0x35, 0x2e, 0xf4, 0x5c, 0x84, 0x59, 0x8e, 0x1a, 0xd5, 0x70, 0x81, 0x49,
+ 0x1a, 0x89, 0x45, 0x18, 0xcb, 0xeb, 0x34, 0x92, 0x03, 0x42, 0x59, 0xd3, 0x6a, 0x0e, 0x9f, 0x24,
+ 0x88, 0xc9, 0x42, 0x0e, 0x45, 0x96, 0x0e, 0xc5, 0x6a, 0x85, 0x5a, 0xe8, 0x14, 0x57, 0xca, 0xaa,
+ 0x0e, 0xfd, 0xea, 0xa4, 0xa5, 0xd4, 0xa2, 0x60, 0x8e, 0xab, 0x0c, 0x66, 0x72, 0x35, 0x5b, 0xe0,
+ 0x4d, 0xf8, 0x7c, 0x6c, 0x05, 0xc1, 0x4b, 0xd8, 0x7d, 0x6f, 0x17, 0x7f, 0xc2, 0x5c, 0x4f, 0x63,
+ 0xd6, 0x85, 0x5a, 0x1a, 0xfb, 0x4e, 0xcf, 0xe9, 0xb7, 0x79, 0x2d, 0x8d, 0xd9, 0x01, 0xec, 0x64,
+ 0x98, 0xeb, 0x30, 0x8d, 0xfd, 0x1a, 0x81, 0xcd, 0x8c, 0x84, 0xc1, 0x1f, 0x07, 0xbc, 0x0d, 0xeb,
+ 0x96, 0xf1, 0x1c, 0x5a, 0x38, 0xcb, 0x42, 0xa3, 0x26, 0xa7, 0x37, 0xda, 0x1f, 0x6c, 0xee, 0x2f,
+ 0x49, 0xbe, 0x83, 0xb3, 0x8c, 0x26, 0x1c, 0x41, 0xdb, 0x3e, 0xde, 0x2c, 0xab, 0xd3, 0xa0, 0x96,
+ 0x05, 0xa6, 0x31, 0x7b, 0x06, 0xdd, 0x82, 0xa4, 0x38, 0x2b, 0xf4, 0x1b, 0x3d, 0xa7, 0xbf, 0xcb,
+ 0x3b, 0x16, 0x35, 0x03, 0x3e, 0xa2, 0x19, 0x91, 0x23, 0x6a, 0xbb, 0xd5, 0xed, 0x39, 0xfd, 0x16,
+ 0x6f, 0x19, 0x80, 0xe6, 0xbf, 0x85, 0x6e, 0xb9, 0x34, 0x54, 0x5a, 0x68, 0xe5, 0x37, 0x29, 0xd7,
+ 0xd1, 0xbd, 0xb9, 0xac, 0x84, 0x77, 0x8a, 0x74, 0x9f, 0xcd, 0x57, 0xf0, 0x0a, 0x3a, 0x1b, 0x6f,
+ 0x56, 0xec, 0x04, 0xdc, 0x54, 0xcb, 0xa5, 0xf2, 0x9d, 0x5e, 0xbd, 0xef, 0x8d, 0xf6, 0x06, 0xb6,
+ 0xef, 0xc1, 0x86, 0x88, 0x5b, 0x45, 0xf0, 0xb3, 0x7e, 0x5b, 0xf5, 0x05, 0x45, 0xde, 0x6a, 0xec,
+ 0x18, 0xbc, 0x58, 0x68, 0x91, 0x09, 0x3d, 0x2f, 0xeb, 0x6e, 0x70, 0x28, 0xa1, 0x69, 0xcc, 0x4e,
+ 0xa0, 0x11, 0x4b, 0x15, 0x51, 0x37, 0xf7, 0xd5, 0x69, 0x48, 0x4e, 0x12, 0x36, 0x85, 0xc7, 0xea,
+ 0x26, 0xd5, 0xd1, 0x3c, 0x9c, 0x49, 0xa1, 0xd7, 0xb9, 0x54, 0xd4, 0x97, 0x37, 0xea, 0x6d, 0xb9,
+ 0xee, 0xe8, 0x78, 0xd7, 0x02, 0x97, 0xc5, 0xb7, 0x69, 0x9e, 0x3a, 0xfd, 0x7f, 0x1b, 0x97, 0x22,
+ 0x77, 0x0c, 0x7a, 0x51, 0xde, 0xe7, 0x05, 0xb8, 0xa6, 0x35, 0xe5, 0x7f, 0x7d, 0xb8, 0x8a, 0x49,
+ 0xfb, 0xf7, 0xdf, 0x5f, 0x4f, 0x1b, 0xe6, 0xd9, 0xdc, 0xaa, 0xd9, 0x39, 0xb8, 0x26, 0x8b, 0xf2,
+ 0xbf, 0x39, 0x14, 0x8f, 0x55, 0xe2, 0x5d, 0x1a, 0x6a, 0xe2, 0x1a, 0xd7, 0x23, 0x6e, 0x85, 0xec,
+ 0x0d, 0x78, 0x44, 0x27, 0x39, 0xae, 0x33, 0xe5, 0x7f, 0xb7, 0xbe, 0x83, 0x2d, 0xdf, 0x3b, 0xe2,
+ 0x4b, 0x33, 0xcc, 0x6e, 0x21, 0x36, 0x86, 0xe6, 0x52, 0x6a, 0x99, 0x2b, 0xff, 0x87, 0x35, 0xef,
+ 0x55, 0xcc, 0x1f, 0x88, 0x2b, 0x8d, 0x85, 0x34, 0x78, 0x0d, 0xdd, 0xca, 0xf5, 0x14, 0x3b, 0xad,
+ 0xde, 0x7e, 0xff, 0xce, 0x83, 0xad, 0xac, 0xb8, 0xfe, 0xe4, 0xec, 0xcb, 0x69, 0x92, 0xea, 0xf9,
+ 0xfa, 0x6a, 0x10, 0xe1, 0x92, 0xfe, 0xc3, 0x08, 0xf3, 0x78, 0x68, 0x2d, 0x67, 0xc5, 0xef, 0x99,
+ 0x60, 0x01, 0x5c, 0x35, 0x09, 0x19, 0xff, 0x0b, 0x00, 0x00, 0xff, 0xff, 0x36, 0x50, 0xf6, 0xd2,
+ 0x24, 0x04, 0x00, 0x00,
}
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 cfd5833..9d1498c 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
@@ -420,6 +420,9 @@
// OfpMeterFeatures from public import voltha_protos/openflow_13.proto
type OfpMeterFeatures = openflow_13.OfpMeterFeatures
+// OfpMeterEntry from public import voltha_protos/openflow_13.proto
+type OfpMeterEntry = openflow_13.OfpMeterEntry
+
// OfpExperimenterMultipartHeader from public import voltha_protos/openflow_13.proto
type OfpExperimenterMultipartHeader = openflow_13.OfpExperimenterMultipartHeader
@@ -1964,6 +1967,47 @@
return ""
}
+// Additional information required to process flow at device adapters
+type FlowMetadata struct {
+ // Meters associated with flow-update to adapter
+ Meters []*openflow_13.OfpMeterConfig `protobuf:"bytes,1,rep,name=meters,proto3" json:"meters,omitempty"`
+ XXX_NoUnkeyedLiteral struct{} `json:"-"`
+ XXX_unrecognized []byte `json:"-"`
+ XXX_sizecache int32 `json:"-"`
+}
+
+func (m *FlowMetadata) Reset() { *m = FlowMetadata{} }
+func (m *FlowMetadata) String() string { return proto.CompactTextString(m) }
+func (*FlowMetadata) ProtoMessage() {}
+func (*FlowMetadata) Descriptor() ([]byte, []int) {
+ return fileDescriptor_e084f1a60ce7016c, []int{13}
+}
+
+func (m *FlowMetadata) XXX_Unmarshal(b []byte) error {
+ return xxx_messageInfo_FlowMetadata.Unmarshal(m, b)
+}
+func (m *FlowMetadata) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+ return xxx_messageInfo_FlowMetadata.Marshal(b, m, deterministic)
+}
+func (m *FlowMetadata) XXX_Merge(src proto.Message) {
+ xxx_messageInfo_FlowMetadata.Merge(m, src)
+}
+func (m *FlowMetadata) XXX_Size() int {
+ return xxx_messageInfo_FlowMetadata.Size(m)
+}
+func (m *FlowMetadata) XXX_DiscardUnknown() {
+ xxx_messageInfo_FlowMetadata.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_FlowMetadata proto.InternalMessageInfo
+
+func (m *FlowMetadata) GetMeters() []*openflow_13.OfpMeterConfig {
+ if m != nil {
+ return m.Meters
+ }
+ return nil
+}
+
func init() {
proto.RegisterEnum("voltha.AlarmFilterRuleKey_AlarmFilterRuleKey", AlarmFilterRuleKey_AlarmFilterRuleKey_name, AlarmFilterRuleKey_AlarmFilterRuleKey_value)
proto.RegisterEnum("voltha.SelfTestResponse_SelfTestResult", SelfTestResponse_SelfTestResult_name, SelfTestResponse_SelfTestResult_value)
@@ -1980,167 +2024,170 @@
proto.RegisterType((*SelfTestResponse)(nil), "voltha.SelfTestResponse")
proto.RegisterType((*OfAgentSubscriber)(nil), "voltha.OfAgentSubscriber")
proto.RegisterType((*Membership)(nil), "voltha.Membership")
+ proto.RegisterType((*FlowMetadata)(nil), "voltha.FlowMetadata")
}
func init() { proto.RegisterFile("voltha_protos/voltha.proto", fileDescriptor_e084f1a60ce7016c) }
var fileDescriptor_e084f1a60ce7016c = []byte{
- // 2478 bytes of a gzipped FileDescriptorProto
- 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xc4, 0x5a, 0x5b, 0x6f, 0x1b, 0xc7,
- 0x15, 0x16, 0x75, 0xd7, 0x21, 0x29, 0x92, 0x47, 0x17, 0xd3, 0x94, 0x64, 0x4b, 0x13, 0xc7, 0x76,
- 0xe4, 0x88, 0x8c, 0xad, 0xc4, 0x68, 0x9d, 0x06, 0xa9, 0x75, 0xb1, 0xca, 0x5a, 0x16, 0xd9, 0xa5,
- 0x65, 0xb7, 0x4d, 0x0c, 0x62, 0xc9, 0x1d, 0x51, 0x0b, 0x2f, 0xb9, 0xec, 0xce, 0x52, 0xae, 0xe0,
- 0x06, 0x05, 0xd2, 0x2b, 0xfa, 0xd8, 0xfc, 0x85, 0x02, 0x05, 0x8a, 0xfe, 0x15, 0x3f, 0xf5, 0x0f,
- 0x14, 0x45, 0x1f, 0xfa, 0xd8, 0x27, 0xb7, 0x8f, 0xc5, 0x5c, 0x96, 0xdc, 0xe5, 0xee, 0xea, 0x92,
- 0x06, 0xc8, 0x93, 0xb5, 0x73, 0xce, 0x7c, 0xdf, 0x37, 0x67, 0xce, 0x9c, 0x3d, 0x9c, 0x35, 0x14,
- 0x4e, 0x6c, 0xcb, 0x3d, 0xd6, 0xeb, 0x5d, 0xc7, 0x76, 0x6d, 0x56, 0x92, 0x4f, 0x45, 0xf1, 0x84,
- 0x93, 0xf2, 0xa9, 0xb0, 0xdc, 0xb2, 0xed, 0x96, 0x45, 0x4b, 0x7a, 0xd7, 0x2c, 0xe9, 0x9d, 0x8e,
- 0xed, 0xea, 0xae, 0x69, 0x77, 0x98, 0xf4, 0x2a, 0x2c, 0x29, 0xab, 0x78, 0x6a, 0xf4, 0x8e, 0x4a,
- 0xb4, 0xdd, 0x75, 0x4f, 0x95, 0x31, 0x1f, 0x84, 0x6f, 0x53, 0x57, 0x81, 0x17, 0x86, 0x88, 0x9b,
- 0x76, 0xbb, 0x6d, 0x77, 0xa2, 0x6d, 0xc7, 0x54, 0xb7, 0xdc, 0x63, 0x65, 0x23, 0x41, 0x9b, 0x65,
- 0xb7, 0xcc, 0xa6, 0x6e, 0xd5, 0x0d, 0x7a, 0x62, 0x36, 0x69, 0xf4, 0xfc, 0x80, 0x6d, 0x29, 0x68,
- 0xd3, 0x0d, 0xbd, 0xeb, 0x52, 0x47, 0x19, 0xaf, 0x07, 0x8d, 0x76, 0x97, 0x76, 0x8e, 0x2c, 0xfb,
- 0x55, 0xfd, 0xee, 0x66, 0x8c, 0x43, 0xbb, 0x69, 0xd6, 0xdb, 0x66, 0xa3, 0x6e, 0x34, 0x94, 0xc3,
- 0x5a, 0x84, 0x83, 0x6e, 0xe9, 0x4e, 0x7b, 0xe0, 0xb2, 0x1a, 0x74, 0x39, 0xd5, 0x3b, 0xad, 0xba,
- 0xdd, 0xf5, 0x85, 0x94, 0xfc, 0x29, 0x01, 0xc9, 0x1d, 0x21, 0x7a, 0xcf, 0xb1, 0x7b, 0x5d, 0x5c,
- 0x80, 0x51, 0xd3, 0xc8, 0x27, 0x56, 0x13, 0xb7, 0x67, 0xb6, 0x26, 0xfe, 0xf5, 0xf6, 0xcd, 0x4a,
- 0x42, 0x1b, 0x35, 0x0d, 0x2c, 0x43, 0x26, 0xb8, 0x7c, 0x96, 0x1f, 0x5d, 0x1d, 0xbb, 0x9d, 0xbc,
- 0xb7, 0x50, 0x54, 0xfb, 0xb8, 0x2f, 0xcd, 0x12, 0x6b, 0x6b, 0xe6, 0x1f, 0x6f, 0xdf, 0xac, 0x8c,
- 0x73, 0x2c, 0x6d, 0xd6, 0xf2, 0x5b, 0x18, 0x6e, 0xc2, 0x94, 0x07, 0x31, 0x26, 0x20, 0x66, 0x3d,
- 0x88, 0xf0, 0x5c, 0xcf, 0x93, 0x7c, 0x17, 0x52, 0x3e, 0x95, 0x0c, 0xdf, 0x83, 0x09, 0xd3, 0xa5,
- 0x6d, 0x96, 0x4f, 0x08, 0x88, 0xb9, 0x20, 0x84, 0x70, 0xd2, 0xa4, 0x07, 0xf9, 0x25, 0xe0, 0x43,
- 0x1e, 0x95, 0x47, 0xa6, 0xe5, 0x52, 0x47, 0xeb, 0x59, 0xf4, 0x31, 0x3d, 0x25, 0x8d, 0xa8, 0x51,
- 0x9c, 0xe4, 0xac, 0xd9, 0x11, 0x9c, 0x86, 0x71, 0xf7, 0xb4, 0x4b, 0xb3, 0x09, 0x4c, 0xc1, 0x34,
- 0xa3, 0x27, 0xd4, 0x31, 0xdd, 0xd3, 0xec, 0x28, 0x66, 0x20, 0xe9, 0x50, 0x66, 0xf7, 0x9c, 0x26,
- 0xad, 0x9b, 0x46, 0x76, 0x8c, 0x9b, 0x9b, 0xba, 0x4b, 0x5b, 0xb6, 0x73, 0x9a, 0x1d, 0xc7, 0x34,
- 0xcc, 0x48, 0xc1, 0xdc, 0x38, 0xf1, 0x60, 0xe2, 0xdf, 0x6f, 0xdf, 0xac, 0x8c, 0x90, 0x63, 0xc8,
- 0x0c, 0x51, 0xe1, 0xa7, 0x30, 0xf6, 0x92, 0x9e, 0x8a, 0x30, 0xcf, 0xde, 0xdb, 0xf0, 0xc4, 0x87,
- 0x05, 0x45, 0x0c, 0x69, 0x7c, 0x26, 0xce, 0xc3, 0xc4, 0x89, 0x6e, 0xf5, 0x68, 0x7e, 0x94, 0xef,
- 0x94, 0x26, 0x1f, 0x48, 0x0d, 0x92, 0xbe, 0x09, 0x71, 0x7b, 0xb9, 0x01, 0x13, 0x4e, 0xcf, 0xea,
- 0xef, 0xe0, 0x95, 0x18, 0x7a, 0x4d, 0x7a, 0x91, 0x4f, 0x20, 0xe5, 0xb3, 0x30, 0xdc, 0x80, 0xa9,
- 0x23, 0xf9, 0xe7, 0x70, 0xf0, 0xfd, 0x00, 0x9e, 0x0f, 0x79, 0x01, 0x53, 0xfb, 0x76, 0xab, 0x65,
- 0x76, 0x5a, 0x58, 0x82, 0x09, 0x8b, 0x9e, 0x50, 0x4b, 0xad, 0xfb, 0x6a, 0x51, 0x9d, 0xc4, 0x7d,
- 0xbb, 0xb5, 0xcf, 0xc7, 0xfb, 0x7f, 0x68, 0xd2, 0x0f, 0xd7, 0x20, 0xd5, 0xd5, 0x9b, 0x2f, 0xf5,
- 0x16, 0xad, 0x77, 0xf4, 0xb6, 0xb7, 0xd8, 0xa4, 0x1a, 0x3b, 0xd0, 0xdb, 0x94, 0x38, 0x90, 0xda,
- 0xb6, 0x1d, 0x5a, 0xee, 0x30, 0x57, 0xef, 0x34, 0x29, 0xde, 0x84, 0xa4, 0xa9, 0xfe, 0xae, 0x0f,
- 0x2f, 0x1e, 0x3c, 0x4b, 0xd9, 0xc0, 0x4d, 0x98, 0x94, 0x67, 0x5d, 0x80, 0x26, 0xef, 0xcd, 0x7b,
- 0x8b, 0xf8, 0x81, 0x18, 0xad, 0xb9, 0xba, 0xdb, 0x63, 0x5b, 0x13, 0x3c, 0x15, 0x47, 0x34, 0xe5,
- 0xfa, 0x60, 0xe2, 0xbf, 0x1c, 0x87, 0x6c, 0x41, 0xda, 0xcf, 0xc9, 0x70, 0x3d, 0x98, 0x8d, 0x7d,
- 0x2c, 0xbf, 0x97, 0x4a, 0x47, 0x0f, 0xe3, 0xef, 0xe3, 0x30, 0xf9, 0x4c, 0x78, 0xe1, 0x75, 0x98,
- 0x3a, 0xa1, 0x0e, 0x33, 0xed, 0x4e, 0x50, 0xae, 0x37, 0x8a, 0xf7, 0x61, 0x5a, 0xd5, 0x0e, 0x6f,
- 0xcf, 0x32, 0xfd, 0x90, 0xcb, 0x71, 0xff, 0x99, 0xe9, 0xfb, 0x46, 0x1d, 0xda, 0xb1, 0xff, 0xff,
- 0xd0, 0x8e, 0x5f, 0xf4, 0xd0, 0xe2, 0xf7, 0x21, 0xa5, 0x8e, 0x03, 0x3f, 0x4c, 0x2c, 0x3f, 0x21,
- 0x66, 0x62, 0x70, 0xe6, 0xd3, 0xd3, 0x6e, 0x60, 0x76, 0xd2, 0xe8, 0x0f, 0x33, 0xdc, 0x86, 0xb4,
- 0x42, 0x68, 0x89, 0x73, 0x9f, 0x9f, 0x8c, 0x3d, 0xee, 0x7e, 0x0c, 0x45, 0xab, 0x6a, 0xc5, 0x36,
- 0xa4, 0x65, 0x59, 0xf4, 0xd2, 0x76, 0x2a, 0x36, 0x6d, 0x03, 0x20, 0xba, 0x3f, 0xeb, 0x7f, 0x04,
- 0xb9, 0x41, 0x05, 0xd6, 0x5d, 0xbd, 0xa1, 0x33, 0x9a, 0x5f, 0x56, 0x40, 0xdc, 0x52, 0x7c, 0x62,
- 0x36, 0xa4, 0x9c, 0x1d, 0xdd, 0xd5, 0xb7, 0xb2, 0x1c, 0x28, 0xe9, 0xab, 0x07, 0x5a, 0x86, 0x7b,
- 0x71, 0x27, 0x35, 0x1b, 0x9f, 0xc3, 0x9c, 0xbf, 0x66, 0x7b, 0xa0, 0x2b, 0x6a, 0x8b, 0x04, 0xa8,
- 0xd0, 0x76, 0x26, 0xac, 0x90, 0x25, 0xdd, 0x14, 0x82, 0x97, 0x62, 0x7f, 0x4d, 0x40, 0xb6, 0x46,
- 0xad, 0xa3, 0xa7, 0x94, 0xb9, 0x1a, 0x65, 0x5d, 0xbb, 0xc3, 0x78, 0xe5, 0x99, 0x74, 0x28, 0xeb,
- 0x59, 0xae, 0x3a, 0x84, 0xb7, 0xbc, 0x28, 0x0c, 0x7b, 0xfa, 0x07, 0x7a, 0x96, 0xab, 0xa9, 0x69,
- 0xa4, 0x0a, 0xb3, 0x41, 0x0b, 0x26, 0x61, 0xaa, 0x76, 0xb8, 0xbd, 0xbd, 0x5b, 0xab, 0x65, 0x47,
- 0xf8, 0xc3, 0xa3, 0x87, 0xe5, 0xfd, 0x43, 0x6d, 0x37, 0x9b, 0xc0, 0x1c, 0xa4, 0x0f, 0x2a, 0x4f,
- 0xeb, 0xb5, 0xc3, 0x6a, 0xb5, 0xa2, 0x3d, 0xdd, 0xdd, 0xc9, 0x8e, 0xf2, 0xa1, 0xc3, 0x83, 0xc7,
- 0x07, 0x95, 0xe7, 0x07, 0xf5, 0x5d, 0x4d, 0xab, 0x68, 0xd9, 0x31, 0xaf, 0x4c, 0x56, 0x20, 0x57,
- 0x39, 0x7a, 0xd8, 0xa2, 0x1d, 0xb7, 0xd6, 0x6b, 0xb0, 0xa6, 0x63, 0x36, 0xa8, 0x83, 0x2b, 0x00,
- 0xf6, 0x91, 0xce, 0x07, 0xfb, 0xa7, 0x59, 0x9b, 0x51, 0x23, 0x65, 0x03, 0x97, 0x60, 0x46, 0xbd,
- 0xe1, 0x4c, 0x43, 0x55, 0x87, 0x69, 0x39, 0x50, 0x36, 0xc8, 0xc7, 0x00, 0x4f, 0x68, 0xbb, 0x41,
- 0x1d, 0x76, 0x6c, 0x76, 0x39, 0x92, 0xc8, 0x21, 0x59, 0x49, 0x14, 0x92, 0x18, 0xe1, 0x75, 0x04,
- 0x67, 0x45, 0xad, 0x94, 0x10, 0xa3, 0xa6, 0x71, 0xef, 0xcf, 0x25, 0x48, 0xcb, 0xf3, 0x59, 0xa3,
- 0x0e, 0x8f, 0x35, 0x56, 0x60, 0xf6, 0xb0, 0x6b, 0xe8, 0x2e, 0xf5, 0xaa, 0x14, 0x66, 0x7c, 0xc7,
- 0x88, 0x17, 0xb8, 0xc2, 0x62, 0x51, 0x36, 0x28, 0x45, 0xaf, 0x41, 0x29, 0xee, 0xf2, 0x06, 0x85,
- 0xcc, 0x7f, 0xf9, 0xb7, 0x7f, 0x7e, 0x35, 0x3a, 0x8b, 0x29, 0xd1, 0xd7, 0x9c, 0xdc, 0xe5, 0xad,
- 0x04, 0xc3, 0xe7, 0x90, 0xde, 0xa3, 0xae, 0x4f, 0x62, 0xcc, 0xf4, 0x42, 0xff, 0xc4, 0x0c, 0x7c,
- 0x49, 0x41, 0x40, 0xce, 0x23, 0x7a, 0x90, 0xed, 0x01, 0xce, 0x0b, 0xc8, 0x4a, 0xa5, 0x3e, 0xec,
- 0x08, 0x8c, 0x58, 0xb9, 0x2b, 0x02, 0xfb, 0x0a, 0x89, 0xc0, 0x7e, 0x90, 0x58, 0xc7, 0x1d, 0x98,
- 0xd9, 0xa3, 0xae, 0x2a, 0x5e, 0x71, 0x9a, 0xfb, 0xf5, 0x41, 0xfa, 0x91, 0x8c, 0xc0, 0x9c, 0xc1,
- 0x29, 0x85, 0x89, 0x3d, 0xc8, 0xed, 0x9b, 0xcc, 0x0d, 0x16, 0xd2, 0x38, 0xb4, 0x85, 0xa8, 0x8a,
- 0xca, 0xc8, 0xdd, 0x3f, 0xfc, 0xe7, 0xcd, 0xca, 0x94, 0x2a, 0xbe, 0xe2, 0x6f, 0x94, 0x7f, 0x0b,
- 0xb2, 0x39, 0xcc, 0x79, 0x0b, 0x30, 0xfb, 0x0c, 0x35, 0xc8, 0xec, 0xd1, 0x00, 0x2b, 0x82, 0xf7,
- 0x1e, 0x2a, 0xef, 0x14, 0x22, 0x4b, 0x37, 0xb9, 0x26, 0xf0, 0xf2, 0xb8, 0x18, 0xc2, 0x2b, 0xbd,
- 0x36, 0x8d, 0x2f, 0x50, 0x87, 0x14, 0x5f, 0xcb, 0x43, 0xaf, 0xf0, 0xc6, 0x2d, 0x23, 0x3b, 0x54,
- 0xb6, 0x19, 0xb9, 0xc5, 0x55, 0xc3, 0xa0, 0xbe, 0x0b, 0x22, 0xc4, 0xac, 0x47, 0xd4, 0xaf, 0xe5,
- 0xaf, 0x01, 0x39, 0xc5, 0x7e, 0xb0, 0x2c, 0xc7, 0x11, 0x2d, 0x46, 0x16, 0x78, 0x46, 0x3e, 0xe2,
- 0x74, 0xb9, 0xd0, 0x6b, 0x41, 0xb0, 0x5e, 0xc5, 0x2b, 0xbe, 0xf4, 0xf4, 0x9b, 0xf1, 0x33, 0xc8,
- 0xee, 0xd1, 0x20, 0x77, 0x20, 0x6a, 0xd1, 0xef, 0x13, 0x72, 0x43, 0xe0, 0x5e, 0xc3, 0xe5, 0x18,
- 0x5c, 0x19, 0x3c, 0x07, 0x16, 0x43, 0x2b, 0xab, 0xda, 0x8e, 0xcb, 0xa2, 0x37, 0x46, 0xf9, 0x09,
- 0x0f, 0x72, 0x5f, 0x25, 0x40, 0x97, 0x3f, 0x09, 0xb6, 0x1b, 0x48, 0xce, 0x62, 0x2b, 0x09, 0x4f,
- 0xfc, 0x55, 0x02, 0xe6, 0x87, 0x57, 0xc4, 0x11, 0x71, 0x21, 0x82, 0xa6, 0x6c, 0x14, 0xe6, 0x22,
- 0x86, 0xc9, 0xa7, 0x9c, 0x7c, 0x12, 0xc6, 0x39, 0xa4, 0xe0, 0x2e, 0xe2, 0xfb, 0xe7, 0x73, 0x97,
- 0x5e, 0xf3, 0x7f, 0xea, 0x7c, 0xe5, 0xbf, 0x49, 0xc0, 0x95, 0xdd, 0x8e, 0xde, 0xb0, 0xe8, 0x85,
- 0x85, 0xc4, 0x1d, 0xd9, 0x8f, 0x85, 0x80, 0x8f, 0xc8, 0xe6, 0x65, 0x04, 0x94, 0xa8, 0x20, 0xc7,
- 0xdf, 0x25, 0x20, 0xbf, 0x63, 0xb2, 0x6f, 0x44, 0xc8, 0xf7, 0x84, 0x90, 0xfb, 0xe4, 0xc3, 0x4b,
- 0x09, 0x31, 0x24, 0x3b, 0xfe, 0x22, 0x22, 0x17, 0x1e, 0x59, 0xf6, 0xab, 0x60, 0x2e, 0x60, 0xd1,
- 0xff, 0x6b, 0x49, 0xd8, 0xc9, 0x96, 0xca, 0x04, 0x3e, 0x1a, 0x2e, 0x05, 0xe7, 0x65, 0x85, 0x98,
- 0xc5, 0xb3, 0x62, 0xb9, 0x5f, 0xe2, 0x83, 0x02, 0x9e, 0x0a, 0x79, 0xcb, 0x21, 0x62, 0x31, 0x2e,
- 0xe7, 0xc4, 0x86, 0x64, 0x43, 0x48, 0xb8, 0x45, 0x2e, 0x20, 0x81, 0x97, 0xd7, 0x5f, 0x27, 0x60,
- 0x25, 0x42, 0xc5, 0x13, 0xea, 0x52, 0x47, 0xca, 0x58, 0x0a, 0xc8, 0x10, 0x86, 0x27, 0xb6, 0x71,
- 0x8e, 0x8a, 0xa2, 0x50, 0x71, 0x9b, 0xbc, 0x73, 0xa6, 0x8a, 0x36, 0x07, 0x13, 0x32, 0x5e, 0xc3,
- 0xb2, 0x78, 0x3b, 0xb9, 0xd4, 0xe1, 0xcd, 0x30, 0xab, 0x1c, 0xc5, 0x9f, 0xff, 0xe5, 0xb0, 0x20,
- 0x31, 0x47, 0xa3, 0x5d, 0xeb, 0x94, 0xdc, 0x15, 0xcc, 0x77, 0xf0, 0xbd, 0x0b, 0x30, 0xd7, 0x19,
- 0x9f, 0x87, 0x7f, 0x4c, 0xc0, 0x52, 0x64, 0x22, 0xa8, 0x96, 0xce, 0x4f, 0x7e, 0x25, 0xb4, 0x29,
- 0xd2, 0x89, 0x1c, 0xf0, 0x34, 0x48, 0x43, 0x52, 0x98, 0x64, 0xff, 0x18, 0x4a, 0x8c, 0x75, 0xbc,
- 0x7d, 0xee, 0xae, 0xa8, 0xb9, 0xf8, 0x55, 0x02, 0xd6, 0x62, 0xd2, 0x43, 0x30, 0xca, 0xcd, 0x59,
- 0x8b, 0x96, 0x73, 0x91, 0x44, 0xd9, 0x14, 0x92, 0x36, 0xc8, 0x85, 0x25, 0xf1, 0x7d, 0x7a, 0x01,
- 0x49, 0x1e, 0xa9, 0xf3, 0xde, 0x08, 0x99, 0x60, 0xcb, 0xcc, 0xc8, 0xbb, 0x3c, 0x16, 0x33, 0xfd,
- 0xb6, 0x5e, 0x50, 0xe7, 0x30, 0xe3, 0x51, 0x7b, 0xa5, 0xdf, 0x80, 0xf4, 0x00, 0xbe, 0x6c, 0xc4,
- 0x13, 0x24, 0x07, 0x5b, 0xc2, 0x48, 0x91, 0x83, 0x8b, 0x36, 0xfa, 0xac, 0xb7, 0xb2, 0xe4, 0x30,
- 0x0d, 0x86, 0x87, 0x90, 0xd5, 0x68, 0xd3, 0xee, 0x34, 0x4d, 0x8b, 0x7a, 0x2b, 0xf1, 0x03, 0xc6,
- 0x86, 0x6c, 0x59, 0x60, 0x2e, 0x92, 0x30, 0x26, 0x8f, 0xcd, 0xae, 0xe8, 0x54, 0x22, 0x12, 0x76,
- 0xe8, 0xd7, 0x8b, 0x07, 0x83, 0xf3, 0x43, 0xcb, 0x97, 0x6f, 0xa8, 0x1f, 0x42, 0x6a, 0xdb, 0xa1,
- 0xba, 0xab, 0xa4, 0xe1, 0xd0, 0xec, 0x10, 0x9a, 0xea, 0xcd, 0xc8, 0x70, 0x30, 0xb9, 0xa4, 0xe7,
- 0x90, 0x92, 0x25, 0x3f, 0x42, 0x55, 0xdc, 0x22, 0xdf, 0x11, 0x78, 0x2b, 0x64, 0x29, 0x4a, 0x9d,
- 0x57, 0xc4, 0x7f, 0x02, 0x69, 0x55, 0xc3, 0x2f, 0x81, 0xac, 0xde, 0xd0, 0x64, 0x39, 0x12, 0xd9,
- 0xab, 0xca, 0xcf, 0x21, 0xa5, 0xd1, 0x86, 0x6d, 0xbb, 0xdf, 0x98, 0x66, 0x47, 0xc0, 0x71, 0xe0,
- 0x1d, 0x6a, 0x51, 0xf7, 0x6b, 0x04, 0x63, 0x3d, 0x1a, 0xd8, 0x10, 0x70, 0xd8, 0x83, 0xf4, 0x8e,
- 0xfd, 0xaa, 0x63, 0xd9, 0xba, 0x51, 0x6e, 0xeb, 0x2d, 0x3a, 0x78, 0x8b, 0x89, 0x47, 0xcf, 0x56,
- 0x58, 0xf0, 0x08, 0x2b, 0x5d, 0xea, 0x88, 0xab, 0x46, 0xfe, 0xf3, 0x87, 0xdc, 0x17, 0x1c, 0x1f,
- 0x90, 0x3b, 0x91, 0x1c, 0x26, 0x87, 0xa8, 0x1b, 0x0a, 0x83, 0x95, 0x5e, 0xf3, 0x5f, 0x14, 0x5f,
- 0xf0, 0xcd, 0xfd, 0x32, 0x01, 0x8b, 0x7b, 0xd4, 0x0d, 0x70, 0xc8, 0x9b, 0x84, 0x78, 0x01, 0x51,
- 0xc3, 0xe4, 0x81, 0x10, 0xf0, 0x21, 0xde, 0xbb, 0x84, 0x80, 0x12, 0x93, 0x4c, 0x3d, 0xd1, 0xac,
- 0x05, 0xf0, 0x2e, 0xc9, 0xae, 0xea, 0x10, 0x5e, 0x66, 0xf9, 0x78, 0x24, 0x1b, 0xd4, 0x00, 0x12,
- 0x1b, 0xda, 0xd1, 0x28, 0x36, 0x46, 0xde, 0x17, 0x74, 0x37, 0xf1, 0xc6, 0x45, 0xe8, 0xf0, 0xe7,
- 0x30, 0xb7, 0xcd, 0x5b, 0x6f, 0xeb, 0x82, 0x2b, 0x8c, 0xdc, 0x60, 0xb5, 0xc2, 0xf5, 0x4b, 0xad,
- 0xf0, 0xf7, 0x09, 0x98, 0x7b, 0xd8, 0x74, 0xcd, 0x13, 0xdd, 0xa5, 0x82, 0x45, 0x96, 0xf3, 0x4b,
- 0x52, 0x6f, 0x0b, 0xea, 0x4f, 0xc8, 0x77, 0x2e, 0xb3, 0xb5, 0x72, 0xb8, 0x27, 0xf8, 0x78, 0xa2,
- 0xfd, 0x36, 0x01, 0x39, 0x8d, 0x9e, 0x50, 0xc7, 0xfd, 0x56, 0x84, 0x38, 0x82, 0x9a, 0x0b, 0xf9,
- 0x1c, 0x32, 0x83, 0xd7, 0x43, 0xb8, 0x6b, 0x4f, 0x7b, 0x8a, 0x64, 0xbb, 0x5e, 0x0c, 0xb5, 0xeb,
- 0xcb, 0x58, 0x88, 0xa4, 0x97, 0x6d, 0xfa, 0x0b, 0x98, 0xf3, 0xa1, 0xb7, 0xb7, 0xed, 0xce, 0x91,
- 0xd9, 0x0a, 0x32, 0xe4, 0xfa, 0x0c, 0x9e, 0x99, 0xdc, 0x12, 0xc8, 0x6b, 0x78, 0x3d, 0x1a, 0xb9,
- 0x5d, 0x6f, 0x2a, 0x9c, 0x0e, 0x2c, 0xc8, 0xc8, 0x0d, 0x13, 0x84, 0x41, 0x63, 0xcb, 0xd1, 0xba,
- 0xec, 0x2f, 0xc9, 0x79, 0x64, 0x3c, 0x58, 0x6d, 0x7f, 0xb0, 0x2e, 0xd6, 0xd6, 0x3e, 0x38, 0xb3,
- 0xad, 0x8d, 0x8b, 0x5e, 0xbf, 0x9d, 0x9d, 0x0f, 0xf2, 0x5d, 0xa6, 0x7b, 0x7a, 0x74, 0x81, 0xee,
- 0x89, 0xe0, 0x6a, 0x2c, 0xbf, 0xd7, 0x35, 0xd9, 0xfe, 0x45, 0xcb, 0x5b, 0xbd, 0xb8, 0x16, 0x62,
- 0x2e, 0x7c, 0x33, 0xc8, 0x48, 0x89, 0xb3, 0xce, 0x06, 0x6f, 0x12, 0xa3, 0xdf, 0xd6, 0xd2, 0x86,
- 0x9a, 0xb8, 0x56, 0x19, 0x40, 0x0c, 0xc5, 0x38, 0x44, 0x41, 0xd6, 0x04, 0xdc, 0x12, 0x5e, 0x8d,
- 0x82, 0x93, 0x1d, 0x00, 0x83, 0xec, 0x60, 0x11, 0x2a, 0x8a, 0x71, 0xab, 0x98, 0x8f, 0xb8, 0x9c,
- 0x54, 0x57, 0x15, 0x99, 0xa1, 0xeb, 0x4c, 0x79, 0xcf, 0x82, 0x0b, 0x43, 0xc4, 0x2a, 0x72, 0x8f,
- 0x20, 0x5b, 0x73, 0x1d, 0xaa, 0xb7, 0xab, 0x7a, 0xf3, 0x25, 0x75, 0x59, 0xa5, 0xe7, 0xe2, 0x62,
- 0x60, 0xbb, 0xa4, 0xa1, 0xd2, 0x73, 0x63, 0xd3, 0x73, 0xe4, 0x76, 0x02, 0x77, 0x45, 0x73, 0x45,
- 0xcd, 0x13, 0xaa, 0x80, 0xca, 0x9d, 0x33, 0x2e, 0x5a, 0xc2, 0xf8, 0xe5, 0x0e, 0x19, 0xf9, 0x20,
- 0x81, 0x8f, 0x61, 0x4e, 0xc1, 0x6c, 0x1f, 0xeb, 0x9d, 0x16, 0xdd, 0x3d, 0xa1, 0x1d, 0x37, 0x3e,
- 0x0c, 0xf9, 0x00, 0x92, 0x6f, 0x8a, 0x00, 0x3b, 0x84, 0xd9, 0xfe, 0x26, 0xc9, 0x0f, 0x4f, 0xfe,
- 0x5d, 0x8a, 0xba, 0xdf, 0x25, 0x24, 0x3a, 0xe5, 0x55, 0xb4, 0xe4, 0x3e, 0xd5, 0x21, 0x27, 0x3b,
- 0x35, 0xff, 0x67, 0x90, 0xa8, 0x8b, 0xde, 0x42, 0xd4, 0x20, 0x59, 0x15, 0x14, 0x05, 0xd2, 0xdf,
- 0x90, 0xc0, 0xbd, 0x31, 0x3f, 0xc2, 0x52, 0xb7, 0x1f, 0x3d, 0x52, 0xb7, 0x1f, 0x34, 0xa4, 0x3b,
- 0x00, 0x2a, 0x75, 0x1b, 0x90, 0x93, 0x95, 0xe8, 0xeb, 0xe9, 0x7e, 0x57, 0x50, 0x5c, 0x2f, 0x9c,
- 0x41, 0xc1, 0xc5, 0x7f, 0x06, 0x39, 0xd9, 0x6e, 0xc5, 0xe9, 0x8f, 0xcb, 0x22, 0xb5, 0x84, 0xf5,
- 0xb3, 0x96, 0x50, 0x97, 0x47, 0x24, 0xf0, 0xa9, 0xe8, 0xdc, 0x23, 0xe2, 0xf7, 0xf6, 0xae, 0x1d,
- 0x31, 0x3a, 0xfa, 0xb8, 0x2f, 0x9a, 0x79, 0xf1, 0x6a, 0x63, 0xd1, 0xcd, 0xbc, 0xb4, 0x79, 0x1d,
- 0x22, 0x2e, 0xc5, 0xbf, 0xd8, 0x18, 0xfe, 0x18, 0xa6, 0xbd, 0x6b, 0xec, 0x00, 0x58, 0x3e, 0xee,
- 0x3e, 0x9c, 0xdc, 0x14, 0xb0, 0xab, 0xe4, 0x5a, 0x24, 0x2c, 0xa3, 0xd6, 0x51, 0xdd, 0xe5, 0x68,
- 0xcf, 0x44, 0xff, 0x15, 0xf8, 0x1a, 0x30, 0x94, 0x24, 0xe1, 0xcf, 0x05, 0xe1, 0x1a, 0xc4, 0x0f,
- 0x0f, 0xf7, 0x53, 0x3f, 0x8e, 0xcd, 0x06, 0x7e, 0x0e, 0xe8, 0xa5, 0x5e, 0x0c, 0x72, 0xf4, 0x37,
- 0x83, 0x70, 0x3c, 0x82, 0xd8, 0x22, 0xca, 0xc8, 0x20, 0x5d, 0x33, 0xdb, 0x3d, 0xcb, 0xcb, 0x41,
- 0x5c, 0xee, 0x07, 0xc2, 0x3f, 0xac, 0xd1, 0x9f, 0xf5, 0x28, 0x73, 0xe3, 0x7a, 0x8a, 0xd0, 0x55,
- 0x47, 0x30, 0x46, 0x0a, 0xa9, 0xce, 0x91, 0x78, 0x42, 0x6e, 0xc3, 0x4c, 0xff, 0xae, 0x1f, 0xaf,
- 0x7a, 0x84, 0xa1, 0xaf, 0x00, 0x85, 0x78, 0x13, 0x19, 0xd9, 0x32, 0x61, 0xce, 0x76, 0x5a, 0xa2,
- 0xda, 0x34, 0x6d, 0xc7, 0x50, 0xae, 0x5b, 0x29, 0x79, 0xf1, 0x5c, 0x15, 0x5f, 0xbe, 0x7f, 0x7a,
- 0xa7, 0x65, 0xba, 0xc7, 0xbd, 0x06, 0x57, 0x5d, 0xf2, 0x3c, 0xd5, 0xff, 0x40, 0xd8, 0x50, 0x1f,
- 0xc7, 0x5b, 0xb6, 0x1a, 0xf8, 0xcb, 0xe8, 0x62, 0xc5, 0x03, 0x7b, 0xe6, 0xbf, 0xc4, 0xae, 0x8e,
- 0x56, 0xc7, 0xaa, 0xe3, 0xd5, 0x89, 0xea, 0x64, 0x75, 0xaa, 0x3a, 0xdd, 0x98, 0x14, 0x13, 0x37,
- 0xff, 0x17, 0x00, 0x00, 0xff, 0xff, 0xaa, 0x83, 0xb9, 0x38, 0xd8, 0x20, 0x00, 0x00,
+ // 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,
}
// Reference imports to suppress errors if they are not otherwise used.
@@ -2187,8 +2234,8 @@
UpdateLogicalDeviceFlowTable(ctx context.Context, in *openflow_13.FlowTableUpdate, opts ...grpc.CallOption) (*empty.Empty, error)
// Update meter table for logical device
UpdateLogicalDeviceMeterTable(ctx context.Context, in *openflow_13.MeterModUpdate, opts ...grpc.CallOption) (*empty.Empty, error)
- // Get all meter stats for logical device
- GetMeterStatsOfLogicalDevice(ctx context.Context, in *common.ID, opts ...grpc.CallOption) (*openflow_13.MeterStatsReply, error)
+ // List all meters of a logical device
+ ListLogicalDeviceMeters(ctx context.Context, in *common.ID, opts ...grpc.CallOption) (*openflow_13.Meters, error)
// List all flow groups of a logical device
ListLogicalDeviceFlowGroups(ctx context.Context, in *common.ID, opts ...grpc.CallOption) (*openflow_13.FlowGroups, error)
// Update group table for device
@@ -2433,9 +2480,9 @@
return out, nil
}
-func (c *volthaServiceClient) GetMeterStatsOfLogicalDevice(ctx context.Context, in *common.ID, opts ...grpc.CallOption) (*openflow_13.MeterStatsReply, error) {
- out := new(openflow_13.MeterStatsReply)
- err := c.cc.Invoke(ctx, "/voltha.VolthaService/GetMeterStatsOfLogicalDevice", in, out, opts...)
+func (c *volthaServiceClient) ListLogicalDeviceMeters(ctx context.Context, in *common.ID, opts ...grpc.CallOption) (*openflow_13.Meters, error) {
+ out := new(openflow_13.Meters)
+ err := c.cc.Invoke(ctx, "/voltha.VolthaService/ListLogicalDeviceMeters", in, out, opts...)
if err != nil {
return nil, err
}
@@ -2916,8 +2963,8 @@
UpdateLogicalDeviceFlowTable(context.Context, *openflow_13.FlowTableUpdate) (*empty.Empty, error)
// Update meter table for logical device
UpdateLogicalDeviceMeterTable(context.Context, *openflow_13.MeterModUpdate) (*empty.Empty, error)
- // Get all meter stats for logical device
- GetMeterStatsOfLogicalDevice(context.Context, *common.ID) (*openflow_13.MeterStatsReply, error)
+ // List all meters of a logical device
+ ListLogicalDeviceMeters(context.Context, *common.ID) (*openflow_13.Meters, error)
// List all flow groups of a logical device
ListLogicalDeviceFlowGroups(context.Context, *common.ID) (*openflow_13.FlowGroups, error)
// Update group table for device
@@ -3302,20 +3349,20 @@
return interceptor(ctx, in, info, handler)
}
-func _VolthaService_GetMeterStatsOfLogicalDevice_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+func _VolthaService_ListLogicalDeviceMeters_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
in := new(common.ID)
if err := dec(in); err != nil {
return nil, err
}
if interceptor == nil {
- return srv.(VolthaServiceServer).GetMeterStatsOfLogicalDevice(ctx, in)
+ return srv.(VolthaServiceServer).ListLogicalDeviceMeters(ctx, in)
}
info := &grpc.UnaryServerInfo{
Server: srv,
- FullMethod: "/voltha.VolthaService/GetMeterStatsOfLogicalDevice",
+ FullMethod: "/voltha.VolthaService/ListLogicalDeviceMeters",
}
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
- return srv.(VolthaServiceServer).GetMeterStatsOfLogicalDevice(ctx, req.(*common.ID))
+ return srv.(VolthaServiceServer).ListLogicalDeviceMeters(ctx, req.(*common.ID))
}
return interceptor(ctx, in, info, handler)
}
@@ -4141,8 +4188,8 @@
Handler: _VolthaService_UpdateLogicalDeviceMeterTable_Handler,
},
{
- MethodName: "GetMeterStatsOfLogicalDevice",
- Handler: _VolthaService_GetMeterStatsOfLogicalDevice_Handler,
+ MethodName: "ListLogicalDeviceMeters",
+ Handler: _VolthaService_ListLogicalDeviceMeters_Handler,
},
{
MethodName: "ListLogicalDeviceFlowGroups",
diff --git a/vendor/github.com/opencord/voltha-protos/protos/voltha_protos/logical_device.proto b/vendor/github.com/opencord/voltha-protos/protos/voltha_protos/logical_device.proto
index f5e2fd8..84e7ec5 100644
--- a/vendor/github.com/opencord/voltha-protos/protos/voltha_protos/logical_device.proto
+++ b/vendor/github.com/opencord/voltha-protos/protos/voltha_protos/logical_device.proto
@@ -55,6 +55,10 @@
// flow groups configured on the logical device
openflow_13.FlowGroups flow_groups = 130 [(child_node) = {}];
+ // meters configured on the logical device
+ openflow_13.Meters meters = 131 [(child_node) = {}];
+
+
}
message LogicalDevices {
diff --git a/vendor/github.com/opencord/voltha-protos/protos/voltha_protos/openflow_13.proto b/vendor/github.com/opencord/voltha-protos/protos/voltha_protos/openflow_13.proto
index 6b3ba8a..2a0eec2 100644
--- a/vendor/github.com/opencord/voltha-protos/protos/voltha_protos/openflow_13.proto
+++ b/vendor/github.com/opencord/voltha-protos/protos/voltha_protos/openflow_13.proto
@@ -2092,6 +2092,12 @@
uint32 max_color = 5; /* Maximum color value */
};
+message ofp_meter_entry {
+ ofp_meter_config config=1 [(common.yang_inline_node).id = 'config',
+ (common.yang_inline_node).type = 'openflow_13-ofp_meter_config'];
+ ofp_meter_stats stats=2;
+}
+
/* Body for ofp_multipart_request/reply of type OFPMP_EXPERIMENTER. */
message ofp_experimenter_multipart_header {
uint32 experimenter = 1; /* Experimenter ID which takes the same form
@@ -2268,7 +2274,7 @@
}
message Meters {
- repeated ofp_meter_config items = 1;
+ repeated ofp_meter_entry items = 1;
}
message FlowGroups {
diff --git a/vendor/github.com/opencord/voltha-protos/protos/voltha_protos/openolt.proto b/vendor/github.com/opencord/voltha-protos/protos/voltha_protos/openolt.proto
index 57ea9c2..8fd5789 100644
--- a/vendor/github.com/opencord/voltha-protos/protos/voltha_protos/openolt.proto
+++ b/vendor/github.com/opencord/voltha-protos/protos/voltha_protos/openolt.proto
@@ -18,6 +18,7 @@
package openolt;
import "google/api/annotations.proto";
+import public "voltha_protos/tech_profile.proto";
service Openolt {
@@ -133,16 +134,30 @@
};
}
- rpc CreateTconts(Tconts) returns (Empty) {
+ rpc CreateTrafficSchedulers(tech_profile.TrafficSchedulers) returns (Empty) {
option (google.api.http) = {
- post: "/v1/CreateTconts"
+ post: "/v1/CreateTrafficSchedulers"
body: "*"
};
}
- rpc RemoveTconts(Tconts) returns (Empty) {
+ rpc RemoveTrafficSchedulers(tech_profile.TrafficSchedulers) returns (Empty) {
option (google.api.http) = {
- post: "/v1/RemoveTconts"
+ post: "/v1/RemoveTrafficSchedulers"
+ body: "*"
+ };
+ }
+
+ rpc CreateTrafficQueues(tech_profile.TrafficQueues) returns (Empty) {
+ option (google.api.http) = {
+ post: "/v1/CreateTrafficQueues"
+ body: "*"
+ };
+ }
+
+ rpc RemoveTrafficQueues(tech_profile.TrafficQueues) returns (Empty) {
+ option (google.api.http) = {
+ post: "/v1/RemoveTrafficQueues"
body: "*"
};
}
@@ -250,6 +265,7 @@
fixed32 intf_id = 1;
fixed32 onu_id = 2;
fixed32 port_no = 4;
+ fixed32 gemport_id = 5;
bytes pkt = 3;
}
@@ -467,93 +483,4 @@
fixed32 onu_id = 2;
}
-enum Direction {
- UPSTREAM = 0;
- DOWNSTREAM = 1;
- BIDIRECTIONAL = 2;
-}
-
-enum SchedulingPolicy {
- WRR = 0;
- StrictPriority = 1;
- Hybrid = 2;
-}
-
-enum AdditionalBW {
- AdditionalBW_None = 0;
- AdditionalBW_NA = 1;
- AdditionalBW_BestEffort = 2;
- AdditionalBW_Auto = 3;
-}
-
-enum DiscardPolicy {
- TailDrop = 0;
- WTailDrop = 1;
- Red = 2;
- WRed = 3;
-}
-
-enum InferredAdditionBWIndication {
- InferredAdditionBWIndication_None = 0;
- InferredAdditionBWIndication_Assured = 1;
- InferredAdditionBWIndication_BestEffort = 2;
-}
-
-message Scheduler {
- Direction direction = 1;
- AdditionalBW additional_bw = 2; // Valid on for “direction == Upstream”.
- fixed32 priority = 3;
- fixed32 weight = 4;
- SchedulingPolicy sched_policy = 5;
-}
-
-message TrafficShapingInfo {
- fixed32 cir = 1;
- fixed32 cbs = 2;
- fixed32 pir = 3;
- fixed32 pbs = 4;
- fixed32 gir = 5; // only if “direction == Upstream ”
- InferredAdditionBWIndication add_bw_ind = 6; // only if “direction == Upstream”
-}
-
-message Tcont {
- Direction direction = 1;
- fixed32 alloc_id = 2; // valid only if “direction == Upstream ”
- Scheduler scheduler = 3;
- TrafficShapingInfo traffic_shaping_info = 4;
-}
-
-message Tconts {
- fixed32 intf_id = 1;
- fixed32 onu_id = 2;
- fixed32 uni_id = 4;
- fixed32 port_no = 5;
- repeated Tcont tconts = 3;
-}
-
-message TailDropDiscardConfig {
- fixed32 queue_size = 1;
-}
-
-message RedDiscardConfig {
- fixed32 min_threshold = 1;
- fixed32 max_threshold = 2;
- fixed32 max_probability = 3;
-}
-
-message WRedDiscardConfig {
- RedDiscardConfig green = 1;
- RedDiscardConfig yellow = 2;
- RedDiscardConfig red = 3;
-}
-
-message DiscardConfig {
- DiscardPolicy discard_policy = 1;
- oneof discard_config {
- TailDropDiscardConfig tail_drop_discard_config = 2;
- RedDiscardConfig red_discard_config = 3;
- WRedDiscardConfig wred_discard_config = 4;
- }
-}
-
message Empty {}
diff --git a/vendor/github.com/opencord/voltha-protos/protos/voltha_protos/tech_profile.proto b/vendor/github.com/opencord/voltha-protos/protos/voltha_protos/tech_profile.proto
new file mode 100644
index 0000000..b91aeef
--- /dev/null
+++ b/vendor/github.com/opencord/voltha-protos/protos/voltha_protos/tech_profile.proto
@@ -0,0 +1,129 @@
+// Copyright (c) 2018 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.
+
+syntax = "proto3";
+
+option go_package = "github.com/opencord/voltha-protos/go/tech_profile";
+
+package tech_profile;
+import "google/api/annotations.proto";
+
+enum Direction {
+ UPSTREAM = 0;
+ DOWNSTREAM = 1;
+ BIDIRECTIONAL = 2;
+}
+
+enum SchedulingPolicy {
+ WRR = 0;
+ StrictPriority = 1;
+ Hybrid = 2;
+}
+
+enum AdditionalBW {
+ AdditionalBW_None = 0;
+ AdditionalBW_NA = 1;
+ AdditionalBW_BestEffort = 2;
+ AdditionalBW_Auto = 3;
+}
+
+enum DiscardPolicy {
+ TailDrop = 0;
+ WTailDrop = 1;
+ Red = 2;
+ WRed = 3;
+}
+
+enum InferredAdditionBWIndication {
+ InferredAdditionBWIndication_None = 0;
+ InferredAdditionBWIndication_Assured = 1;
+ InferredAdditionBWIndication_BestEffort = 2;
+}
+
+message SchedulerConfig {
+ Direction direction = 1;
+ AdditionalBW additional_bw = 2; // Valid on for “direction == Upstream”.
+ fixed32 priority = 3;
+ fixed32 weight = 4;
+ SchedulingPolicy sched_policy = 5;
+}
+
+message TrafficShapingInfo {
+ fixed32 cir = 1;
+ fixed32 cbs = 2;
+ fixed32 pir = 3;
+ fixed32 pbs = 4;
+ fixed32 gir = 5; // only if “direction == Upstream ”
+ InferredAdditionBWIndication add_bw_ind = 6; // only if “direction == Upstream”
+}
+
+message TrafficScheduler {
+ Direction direction = 1;
+ fixed32 alloc_id = 2; // valid only if “direction == Upstream ”
+ SchedulerConfig scheduler = 3;
+ TrafficShapingInfo traffic_shaping_info = 4;
+}
+
+message TrafficSchedulers {
+ fixed32 intf_id = 1;
+ fixed32 onu_id = 2;
+ fixed32 uni_id = 4;
+ fixed32 port_no = 5;
+ repeated TrafficScheduler traffic_scheds = 3;
+}
+
+message TailDropDiscardConfig {
+ fixed32 queue_size = 1;
+}
+
+message RedDiscardConfig {
+ fixed32 min_threshold = 1;
+ fixed32 max_threshold = 2;
+ fixed32 max_probability = 3;
+}
+
+message WRedDiscardConfig {
+ RedDiscardConfig green = 1;
+ RedDiscardConfig yellow = 2;
+ RedDiscardConfig red = 3;
+}
+
+message DiscardConfig {
+ DiscardPolicy discard_policy = 1;
+ oneof discard_config {
+ TailDropDiscardConfig tail_drop_discard_config = 2;
+ RedDiscardConfig red_discard_config = 3;
+ WRedDiscardConfig wred_discard_config = 4;
+ }
+}
+
+message TrafficQueue {
+ Direction direction = 1;
+ fixed32 gemport_id = 2;
+ string pbit_map = 3;
+ bool aes_encryption = 4;
+ SchedulingPolicy sched_policy = 5; // This can be SP or WRR
+ fixed32 priority = 6;
+ fixed32 weight = 7;
+ DiscardPolicy discard_policy = 8;
+ DiscardConfig discard_config = 9;
+}
+
+message TrafficQueues {
+ fixed32 intf_id = 1;
+ fixed32 onu_id = 2;
+ fixed32 uni_id = 4;
+ fixed32 port_no = 5;
+ repeated TrafficQueue traffic_queues = 6;
+}
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 673fddd..75199aa 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
@@ -150,6 +150,12 @@
string id = 2;
}
+// Additional information required to process flow at device adapters
+message FlowMetadata {
+ // Meters associated with flow-update to adapter
+ repeated openflow_13.ofp_meter_config meters = 1;
+}
+
/*
* Voltha APIs
*
@@ -282,12 +288,13 @@
};
}
- // Get all meter stats for logical device
- rpc GetMeterStatsOfLogicalDevice(common.ID)
- returns(openflow_13.MeterStatsReply) {
+ // List all meters of a logical device
+ rpc ListLogicalDeviceMeters(common.ID) returns (openflow_13.Meters) {
option (google.api.http) = {
- get: "/api/v1/logical_devices/{id}/meters_stats"
+ get: "/api/v1/logical_devices/{id}/meters"
};
+ option (common.yang_xml_tag).xml_tag = 'meters';
+ option (common.yang_xml_tag).list_items_name = 'items';
}
// List all flow groups of a logical device
@@ -600,5 +607,6 @@
}
rpc Subscribe (OfAgentSubscriber) returns (OfAgentSubscriber) {
}
+
}