// Code generated by protoc-gen-go. DO NOT EDIT.
// source: voltha_protos/inter_container.proto

package inter_container

import (
	fmt "fmt"
	proto "github.com/golang/protobuf/proto"
	any "github.com/golang/protobuf/ptypes/any"
	timestamp "github.com/golang/protobuf/ptypes/timestamp"
	common "github.com/opencord/voltha-protos/v3/go/common"
	openflow_13 "github.com/opencord/voltha-protos/v3/go/openflow_13"
	voltha "github.com/opencord/voltha-protos/v3/go/voltha"
	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

// ID from public import voltha_protos/common.proto
type ID = common.ID

// IDs from public import voltha_protos/common.proto
type IDs = common.IDs

// AdminState from public import voltha_protos/common.proto
type AdminState = common.AdminState

// OperStatus from public import voltha_protos/common.proto
type OperStatus = common.OperStatus

// ConnectStatus from public import voltha_protos/common.proto
type ConnectStatus = common.ConnectStatus

// OperationResp from public import voltha_protos/common.proto
type OperationResp = common.OperationResp

// ValueType from public import voltha_protos/common.proto
type ValueType = common.ValueType

// ValueSpecifier from public import voltha_protos/common.proto
type ValueSpecifier = common.ValueSpecifier

// ReturnValues from public import voltha_protos/common.proto
type ReturnValues = common.ReturnValues

// TestModeKeys from public import voltha_protos/common.proto
type TestModeKeys = common.TestModeKeys

var TestModeKeys_name = common.TestModeKeys_name
var TestModeKeys_value = common.TestModeKeys_value

const TestModeKeys_api_test = TestModeKeys(common.TestModeKeys_api_test)

// AdminState_Types from public import voltha_protos/common.proto
type AdminState_Types = common.AdminState_Types

var AdminState_Types_name = common.AdminState_Types_name
var AdminState_Types_value = common.AdminState_Types_value

const AdminState_UNKNOWN = AdminState_Types(common.AdminState_UNKNOWN)
const AdminState_PREPROVISIONED = AdminState_Types(common.AdminState_PREPROVISIONED)
const AdminState_ENABLED = AdminState_Types(common.AdminState_ENABLED)
const AdminState_DISABLED = AdminState_Types(common.AdminState_DISABLED)
const AdminState_DOWNLOADING_IMAGE = AdminState_Types(common.AdminState_DOWNLOADING_IMAGE)
const AdminState_DELETED = AdminState_Types(common.AdminState_DELETED)

// OperStatus_Types from public import voltha_protos/common.proto
type OperStatus_Types = common.OperStatus_Types

var OperStatus_Types_name = common.OperStatus_Types_name
var OperStatus_Types_value = common.OperStatus_Types_value

const OperStatus_UNKNOWN = OperStatus_Types(common.OperStatus_UNKNOWN)
const OperStatus_DISCOVERED = OperStatus_Types(common.OperStatus_DISCOVERED)
const OperStatus_ACTIVATING = OperStatus_Types(common.OperStatus_ACTIVATING)
const OperStatus_TESTING = OperStatus_Types(common.OperStatus_TESTING)
const OperStatus_ACTIVE = OperStatus_Types(common.OperStatus_ACTIVE)
const OperStatus_FAILED = OperStatus_Types(common.OperStatus_FAILED)

// ConnectStatus_Types from public import voltha_protos/common.proto
type ConnectStatus_Types = common.ConnectStatus_Types

var ConnectStatus_Types_name = common.ConnectStatus_Types_name
var ConnectStatus_Types_value = common.ConnectStatus_Types_value

const ConnectStatus_UNKNOWN = ConnectStatus_Types(common.ConnectStatus_UNKNOWN)
const ConnectStatus_UNREACHABLE = ConnectStatus_Types(common.ConnectStatus_UNREACHABLE)
const ConnectStatus_REACHABLE = ConnectStatus_Types(common.ConnectStatus_REACHABLE)

// OperationResp_OperationReturnCode from public import voltha_protos/common.proto
type OperationResp_OperationReturnCode = common.OperationResp_OperationReturnCode

var OperationResp_OperationReturnCode_name = common.OperationResp_OperationReturnCode_name
var OperationResp_OperationReturnCode_value = common.OperationResp_OperationReturnCode_value

const OperationResp_OPERATION_SUCCESS = OperationResp_OperationReturnCode(common.OperationResp_OPERATION_SUCCESS)
const OperationResp_OPERATION_FAILURE = OperationResp_OperationReturnCode(common.OperationResp_OPERATION_FAILURE)
const OperationResp_OPERATION_UNSUPPORTED = OperationResp_OperationReturnCode(common.OperationResp_OPERATION_UNSUPPORTED)

// ValueType_Type from public import voltha_protos/common.proto
type ValueType_Type = common.ValueType_Type

var ValueType_Type_name = common.ValueType_Type_name
var ValueType_Type_value = common.ValueType_Type_value

const ValueType_EMPTY = ValueType_Type(common.ValueType_EMPTY)
const ValueType_DISTANCE = ValueType_Type(common.ValueType_DISTANCE)

// DeviceGroup from public import voltha_protos/voltha.proto
type DeviceGroup = voltha.DeviceGroup

// DeviceGroups from public import voltha_protos/voltha.proto
type DeviceGroups = voltha.DeviceGroups

// EventFilterRuleKey from public import voltha_protos/voltha.proto
type EventFilterRuleKey = voltha.EventFilterRuleKey

// EventFilterRule from public import voltha_protos/voltha.proto
type EventFilterRule = voltha.EventFilterRule

// EventFilter from public import voltha_protos/voltha.proto
type EventFilter = voltha.EventFilter

// EventFilters from public import voltha_protos/voltha.proto
type EventFilters = voltha.EventFilters

// CoreInstance from public import voltha_protos/voltha.proto
type CoreInstance = voltha.CoreInstance

// CoreInstances from public import voltha_protos/voltha.proto
type CoreInstances = voltha.CoreInstances

// OmciTestRequest from public import voltha_protos/voltha.proto
type OmciTestRequest = voltha.OmciTestRequest

// TestResponse from public import voltha_protos/voltha.proto
type TestResponse = voltha.TestResponse

// ValueSet from public import voltha_protos/voltha.proto
type ValueSet = voltha.ValueSet
type ValueSet_AlarmConfig = voltha.ValueSet_AlarmConfig

// Voltha from public import voltha_protos/voltha.proto
type Voltha = voltha.Voltha

// SelfTestResponse from public import voltha_protos/voltha.proto
type SelfTestResponse = voltha.SelfTestResponse

// OfAgentSubscriber from public import voltha_protos/voltha.proto
type OfAgentSubscriber = voltha.OfAgentSubscriber

// Membership from public import voltha_protos/voltha.proto
type Membership = voltha.Membership

// FlowMetadata from public import voltha_protos/voltha.proto
type FlowMetadata = voltha.FlowMetadata

// EventFilterRuleKey_EventFilterRuleType from public import voltha_protos/voltha.proto
type EventFilterRuleKey_EventFilterRuleType = voltha.EventFilterRuleKey_EventFilterRuleType

var EventFilterRuleKey_EventFilterRuleType_name = voltha.EventFilterRuleKey_EventFilterRuleType_name
var EventFilterRuleKey_EventFilterRuleType_value = voltha.EventFilterRuleKey_EventFilterRuleType_value

const EventFilterRuleKey_filter_all = EventFilterRuleKey_EventFilterRuleType(voltha.EventFilterRuleKey_filter_all)
const EventFilterRuleKey_category = EventFilterRuleKey_EventFilterRuleType(voltha.EventFilterRuleKey_category)
const EventFilterRuleKey_sub_category = EventFilterRuleKey_EventFilterRuleType(voltha.EventFilterRuleKey_sub_category)
const EventFilterRuleKey_kpi_event_type = EventFilterRuleKey_EventFilterRuleType(voltha.EventFilterRuleKey_kpi_event_type)
const EventFilterRuleKey_config_event_type = EventFilterRuleKey_EventFilterRuleType(voltha.EventFilterRuleKey_config_event_type)
const EventFilterRuleKey_device_event_type = EventFilterRuleKey_EventFilterRuleType(voltha.EventFilterRuleKey_device_event_type)

// TestResponse_TestResponseResult from public import voltha_protos/voltha.proto
type TestResponse_TestResponseResult = voltha.TestResponse_TestResponseResult

var TestResponse_TestResponseResult_name = voltha.TestResponse_TestResponseResult_name
var TestResponse_TestResponseResult_value = voltha.TestResponse_TestResponseResult_value

const TestResponse_SUCCESS = TestResponse_TestResponseResult(voltha.TestResponse_SUCCESS)
const TestResponse_FAILURE = TestResponse_TestResponseResult(voltha.TestResponse_FAILURE)

// SelfTestResponse_SelfTestResult from public import voltha_protos/voltha.proto
type SelfTestResponse_SelfTestResult = voltha.SelfTestResponse_SelfTestResult

var SelfTestResponse_SelfTestResult_name = voltha.SelfTestResponse_SelfTestResult_name
var SelfTestResponse_SelfTestResult_value = voltha.SelfTestResponse_SelfTestResult_value

const SelfTestResponse_SUCCESS = SelfTestResponse_SelfTestResult(voltha.SelfTestResponse_SUCCESS)
const SelfTestResponse_FAILURE = SelfTestResponse_SelfTestResult(voltha.SelfTestResponse_FAILURE)
const SelfTestResponse_NOT_SUPPORTED = SelfTestResponse_SelfTestResult(voltha.SelfTestResponse_NOT_SUPPORTED)
const SelfTestResponse_UNKNOWN_ERROR = SelfTestResponse_SelfTestResult(voltha.SelfTestResponse_UNKNOWN_ERROR)

// LogicalPortId from public import voltha_protos/logical_device.proto
type LogicalPortId = voltha.LogicalPortId

// LogicalPort from public import voltha_protos/logical_device.proto
type LogicalPort = voltha.LogicalPort

// LogicalPorts from public import voltha_protos/logical_device.proto
type LogicalPorts = voltha.LogicalPorts

// LogicalDevice from public import voltha_protos/logical_device.proto
type LogicalDevice = voltha.LogicalDevice

// LogicalDevices from public import voltha_protos/logical_device.proto
type LogicalDevices = voltha.LogicalDevices

type MessageType int32

const (
	MessageType_REQUEST           MessageType = 0
	MessageType_RESPONSE          MessageType = 1
	MessageType_DEVICE_DISCOVERED MessageType = 2
)

var MessageType_name = map[int32]string{
	0: "REQUEST",
	1: "RESPONSE",
	2: "DEVICE_DISCOVERED",
}

var MessageType_value = map[string]int32{
	"REQUEST":           0,
	"RESPONSE":          1,
	"DEVICE_DISCOVERED": 2,
}

func (x MessageType) String() string {
	return proto.EnumName(MessageType_name, int32(x))
}

func (MessageType) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_941f0031a549667f, []int{0}
}

type ErrorCodeCodes int32

const (
	ErrorCode_UNSUPPORTED_REQUEST ErrorCodeCodes = 0
	ErrorCode_INVALID_PARAMETERS  ErrorCodeCodes = 1
	ErrorCode_DEADLINE_EXCEEDED   ErrorCodeCodes = 2
)

var ErrorCodeCodes_name = map[int32]string{
	0: "UNSUPPORTED_REQUEST",
	1: "INVALID_PARAMETERS",
	2: "DEADLINE_EXCEEDED",
}

var ErrorCodeCodes_value = map[string]int32{
	"UNSUPPORTED_REQUEST": 0,
	"INVALID_PARAMETERS":  1,
	"DEADLINE_EXCEEDED":   2,
}

func (x ErrorCodeCodes) String() string {
	return proto.EnumName(ErrorCodeCodes_name, int32(x))
}

func (ErrorCodeCodes) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_941f0031a549667f, []int{4, 0}
}

type InterAdapterMessageType_Types int32

const (
	InterAdapterMessageType_FLOW_REQUEST                  InterAdapterMessageType_Types = 0
	InterAdapterMessageType_FLOW_RESPONSE                 InterAdapterMessageType_Types = 1
	InterAdapterMessageType_OMCI_REQUEST                  InterAdapterMessageType_Types = 2
	InterAdapterMessageType_OMCI_RESPONSE                 InterAdapterMessageType_Types = 3
	InterAdapterMessageType_METRICS_REQUEST               InterAdapterMessageType_Types = 4
	InterAdapterMessageType_METRICS_RESPONSE              InterAdapterMessageType_Types = 5
	InterAdapterMessageType_ONU_IND_REQUEST               InterAdapterMessageType_Types = 6
	InterAdapterMessageType_ONU_IND_RESPONSE              InterAdapterMessageType_Types = 7
	InterAdapterMessageType_TECH_PROFILE_DOWNLOAD_REQUEST InterAdapterMessageType_Types = 8
	InterAdapterMessageType_DELETE_GEM_PORT_REQUEST       InterAdapterMessageType_Types = 9
	InterAdapterMessageType_DELETE_TCONT_REQUEST          InterAdapterMessageType_Types = 10
)

var InterAdapterMessageType_Types_name = map[int32]string{
	0:  "FLOW_REQUEST",
	1:  "FLOW_RESPONSE",
	2:  "OMCI_REQUEST",
	3:  "OMCI_RESPONSE",
	4:  "METRICS_REQUEST",
	5:  "METRICS_RESPONSE",
	6:  "ONU_IND_REQUEST",
	7:  "ONU_IND_RESPONSE",
	8:  "TECH_PROFILE_DOWNLOAD_REQUEST",
	9:  "DELETE_GEM_PORT_REQUEST",
	10: "DELETE_TCONT_REQUEST",
}

var InterAdapterMessageType_Types_value = map[string]int32{
	"FLOW_REQUEST":                  0,
	"FLOW_RESPONSE":                 1,
	"OMCI_REQUEST":                  2,
	"OMCI_RESPONSE":                 3,
	"METRICS_REQUEST":               4,
	"METRICS_RESPONSE":              5,
	"ONU_IND_REQUEST":               6,
	"ONU_IND_RESPONSE":              7,
	"TECH_PROFILE_DOWNLOAD_REQUEST": 8,
	"DELETE_GEM_PORT_REQUEST":       9,
	"DELETE_TCONT_REQUEST":          10,
}

func (x InterAdapterMessageType_Types) String() string {
	return proto.EnumName(InterAdapterMessageType_Types_name, int32(x))
}

func (InterAdapterMessageType_Types) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_941f0031a549667f, []int{13, 0}
}

type StrType struct {
	Val                  string   `protobuf:"bytes,1,opt,name=val,proto3" json:"val,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *StrType) Reset()         { *m = StrType{} }
func (m *StrType) String() string { return proto.CompactTextString(m) }
func (*StrType) ProtoMessage()    {}
func (*StrType) Descriptor() ([]byte, []int) {
	return fileDescriptor_941f0031a549667f, []int{0}
}

func (m *StrType) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_StrType.Unmarshal(m, b)
}
func (m *StrType) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_StrType.Marshal(b, m, deterministic)
}
func (m *StrType) XXX_Merge(src proto.Message) {
	xxx_messageInfo_StrType.Merge(m, src)
}
func (m *StrType) XXX_Size() int {
	return xxx_messageInfo_StrType.Size(m)
}
func (m *StrType) XXX_DiscardUnknown() {
	xxx_messageInfo_StrType.DiscardUnknown(m)
}

var xxx_messageInfo_StrType proto.InternalMessageInfo

func (m *StrType) GetVal() string {
	if m != nil {
		return m.Val
	}
	return ""
}

type IntType struct {
	Val                  int64    `protobuf:"varint,1,opt,name=val,proto3" json:"val,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *IntType) Reset()         { *m = IntType{} }
func (m *IntType) String() string { return proto.CompactTextString(m) }
func (*IntType) ProtoMessage()    {}
func (*IntType) Descriptor() ([]byte, []int) {
	return fileDescriptor_941f0031a549667f, []int{1}
}

func (m *IntType) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_IntType.Unmarshal(m, b)
}
func (m *IntType) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_IntType.Marshal(b, m, deterministic)
}
func (m *IntType) XXX_Merge(src proto.Message) {
	xxx_messageInfo_IntType.Merge(m, src)
}
func (m *IntType) XXX_Size() int {
	return xxx_messageInfo_IntType.Size(m)
}
func (m *IntType) XXX_DiscardUnknown() {
	xxx_messageInfo_IntType.DiscardUnknown(m)
}

var xxx_messageInfo_IntType proto.InternalMessageInfo

func (m *IntType) GetVal() int64 {
	if m != nil {
		return m.Val
	}
	return 0
}

type BoolType struct {
	Val                  bool     `protobuf:"varint,1,opt,name=val,proto3" json:"val,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *BoolType) Reset()         { *m = BoolType{} }
func (m *BoolType) String() string { return proto.CompactTextString(m) }
func (*BoolType) ProtoMessage()    {}
func (*BoolType) Descriptor() ([]byte, []int) {
	return fileDescriptor_941f0031a549667f, []int{2}
}

func (m *BoolType) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_BoolType.Unmarshal(m, b)
}
func (m *BoolType) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_BoolType.Marshal(b, m, deterministic)
}
func (m *BoolType) XXX_Merge(src proto.Message) {
	xxx_messageInfo_BoolType.Merge(m, src)
}
func (m *BoolType) XXX_Size() int {
	return xxx_messageInfo_BoolType.Size(m)
}
func (m *BoolType) XXX_DiscardUnknown() {
	xxx_messageInfo_BoolType.DiscardUnknown(m)
}

var xxx_messageInfo_BoolType proto.InternalMessageInfo

func (m *BoolType) GetVal() bool {
	if m != nil {
		return m.Val
	}
	return false
}

type Packet struct {
	Payload              []byte   `protobuf:"bytes,1,opt,name=payload,proto3" json:"payload,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *Packet) Reset()         { *m = Packet{} }
func (m *Packet) String() string { return proto.CompactTextString(m) }
func (*Packet) ProtoMessage()    {}
func (*Packet) Descriptor() ([]byte, []int) {
	return fileDescriptor_941f0031a549667f, []int{3}
}

func (m *Packet) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_Packet.Unmarshal(m, b)
}
func (m *Packet) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_Packet.Marshal(b, m, deterministic)
}
func (m *Packet) XXX_Merge(src proto.Message) {
	xxx_messageInfo_Packet.Merge(m, src)
}
func (m *Packet) XXX_Size() int {
	return xxx_messageInfo_Packet.Size(m)
}
func (m *Packet) XXX_DiscardUnknown() {
	xxx_messageInfo_Packet.DiscardUnknown(m)
}

var xxx_messageInfo_Packet proto.InternalMessageInfo

func (m *Packet) GetPayload() []byte {
	if m != nil {
		return m.Payload
	}
	return nil
}

type ErrorCode struct {
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *ErrorCode) Reset()         { *m = ErrorCode{} }
func (m *ErrorCode) String() string { return proto.CompactTextString(m) }
func (*ErrorCode) ProtoMessage()    {}
func (*ErrorCode) Descriptor() ([]byte, []int) {
	return fileDescriptor_941f0031a549667f, []int{4}
}

func (m *ErrorCode) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_ErrorCode.Unmarshal(m, b)
}
func (m *ErrorCode) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_ErrorCode.Marshal(b, m, deterministic)
}
func (m *ErrorCode) XXX_Merge(src proto.Message) {
	xxx_messageInfo_ErrorCode.Merge(m, src)
}
func (m *ErrorCode) XXX_Size() int {
	return xxx_messageInfo_ErrorCode.Size(m)
}
func (m *ErrorCode) XXX_DiscardUnknown() {
	xxx_messageInfo_ErrorCode.DiscardUnknown(m)
}

var xxx_messageInfo_ErrorCode proto.InternalMessageInfo

type Error struct {
	Code                 ErrorCodeCodes `protobuf:"varint,1,opt,name=code,proto3,enum=voltha.ErrorCodeCodes" json:"code,omitempty"`
	Reason               string         `protobuf:"bytes,2,opt,name=reason,proto3" json:"reason,omitempty"`
	XXX_NoUnkeyedLiteral struct{}       `json:"-"`
	XXX_unrecognized     []byte         `json:"-"`
	XXX_sizecache        int32          `json:"-"`
}

func (m *Error) Reset()         { *m = Error{} }
func (m *Error) String() string { return proto.CompactTextString(m) }
func (*Error) ProtoMessage()    {}
func (*Error) Descriptor() ([]byte, []int) {
	return fileDescriptor_941f0031a549667f, []int{5}
}

func (m *Error) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_Error.Unmarshal(m, b)
}
func (m *Error) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_Error.Marshal(b, m, deterministic)
}
func (m *Error) XXX_Merge(src proto.Message) {
	xxx_messageInfo_Error.Merge(m, src)
}
func (m *Error) XXX_Size() int {
	return xxx_messageInfo_Error.Size(m)
}
func (m *Error) XXX_DiscardUnknown() {
	xxx_messageInfo_Error.DiscardUnknown(m)
}

var xxx_messageInfo_Error proto.InternalMessageInfo

func (m *Error) GetCode() ErrorCodeCodes {
	if m != nil {
		return m.Code
	}
	return ErrorCode_UNSUPPORTED_REQUEST
}

func (m *Error) GetReason() string {
	if m != nil {
		return m.Reason
	}
	return ""
}

type Header struct {
	Id                   string               `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"`
	Type                 MessageType          `protobuf:"varint,2,opt,name=type,proto3,enum=voltha.MessageType" json:"type,omitempty"`
	FromTopic            string               `protobuf:"bytes,3,opt,name=from_topic,json=fromTopic,proto3" json:"from_topic,omitempty"`
	ToTopic              string               `protobuf:"bytes,4,opt,name=to_topic,json=toTopic,proto3" json:"to_topic,omitempty"`
	KeyTopic             string               `protobuf:"bytes,5,opt,name=key_topic,json=keyTopic,proto3" json:"key_topic,omitempty"`
	Timestamp            *timestamp.Timestamp `protobuf:"bytes,6,opt,name=timestamp,proto3" json:"timestamp,omitempty"`
	XXX_NoUnkeyedLiteral struct{}             `json:"-"`
	XXX_unrecognized     []byte               `json:"-"`
	XXX_sizecache        int32                `json:"-"`
}

func (m *Header) Reset()         { *m = Header{} }
func (m *Header) String() string { return proto.CompactTextString(m) }
func (*Header) ProtoMessage()    {}
func (*Header) Descriptor() ([]byte, []int) {
	return fileDescriptor_941f0031a549667f, []int{6}
}

func (m *Header) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_Header.Unmarshal(m, b)
}
func (m *Header) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_Header.Marshal(b, m, deterministic)
}
func (m *Header) XXX_Merge(src proto.Message) {
	xxx_messageInfo_Header.Merge(m, src)
}
func (m *Header) XXX_Size() int {
	return xxx_messageInfo_Header.Size(m)
}
func (m *Header) XXX_DiscardUnknown() {
	xxx_messageInfo_Header.DiscardUnknown(m)
}

var xxx_messageInfo_Header proto.InternalMessageInfo

func (m *Header) GetId() string {
	if m != nil {
		return m.Id
	}
	return ""
}

func (m *Header) GetType() MessageType {
	if m != nil {
		return m.Type
	}
	return MessageType_REQUEST
}

func (m *Header) GetFromTopic() string {
	if m != nil {
		return m.FromTopic
	}
	return ""
}

func (m *Header) GetToTopic() string {
	if m != nil {
		return m.ToTopic
	}
	return ""
}

func (m *Header) GetKeyTopic() string {
	if m != nil {
		return m.KeyTopic
	}
	return ""
}

func (m *Header) GetTimestamp() *timestamp.Timestamp {
	if m != nil {
		return m.Timestamp
	}
	return nil
}

type Argument struct {
	Key                  string   `protobuf:"bytes,1,opt,name=key,proto3" json:"key,omitempty"`
	Value                *any.Any `protobuf:"bytes,2,opt,name=value,proto3" json:"value,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *Argument) Reset()         { *m = Argument{} }
func (m *Argument) String() string { return proto.CompactTextString(m) }
func (*Argument) ProtoMessage()    {}
func (*Argument) Descriptor() ([]byte, []int) {
	return fileDescriptor_941f0031a549667f, []int{7}
}

func (m *Argument) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_Argument.Unmarshal(m, b)
}
func (m *Argument) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_Argument.Marshal(b, m, deterministic)
}
func (m *Argument) XXX_Merge(src proto.Message) {
	xxx_messageInfo_Argument.Merge(m, src)
}
func (m *Argument) XXX_Size() int {
	return xxx_messageInfo_Argument.Size(m)
}
func (m *Argument) XXX_DiscardUnknown() {
	xxx_messageInfo_Argument.DiscardUnknown(m)
}

var xxx_messageInfo_Argument proto.InternalMessageInfo

func (m *Argument) GetKey() string {
	if m != nil {
		return m.Key
	}
	return ""
}

func (m *Argument) GetValue() *any.Any {
	if m != nil {
		return m.Value
	}
	return nil
}

type InterContainerMessage struct {
	Header               *Header  `protobuf:"bytes,1,opt,name=header,proto3" json:"header,omitempty"`
	Body                 *any.Any `protobuf:"bytes,2,opt,name=body,proto3" json:"body,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *InterContainerMessage) Reset()         { *m = InterContainerMessage{} }
func (m *InterContainerMessage) String() string { return proto.CompactTextString(m) }
func (*InterContainerMessage) ProtoMessage()    {}
func (*InterContainerMessage) Descriptor() ([]byte, []int) {
	return fileDescriptor_941f0031a549667f, []int{8}
}

func (m *InterContainerMessage) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_InterContainerMessage.Unmarshal(m, b)
}
func (m *InterContainerMessage) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_InterContainerMessage.Marshal(b, m, deterministic)
}
func (m *InterContainerMessage) XXX_Merge(src proto.Message) {
	xxx_messageInfo_InterContainerMessage.Merge(m, src)
}
func (m *InterContainerMessage) XXX_Size() int {
	return xxx_messageInfo_InterContainerMessage.Size(m)
}
func (m *InterContainerMessage) XXX_DiscardUnknown() {
	xxx_messageInfo_InterContainerMessage.DiscardUnknown(m)
}

var xxx_messageInfo_InterContainerMessage proto.InternalMessageInfo

func (m *InterContainerMessage) GetHeader() *Header {
	if m != nil {
		return m.Header
	}
	return nil
}

func (m *InterContainerMessage) GetBody() *any.Any {
	if m != nil {
		return m.Body
	}
	return nil
}

type InterContainerRequestBody struct {
	Rpc                  string      `protobuf:"bytes,2,opt,name=rpc,proto3" json:"rpc,omitempty"`
	Args                 []*Argument `protobuf:"bytes,3,rep,name=args,proto3" json:"args,omitempty"`
	ResponseRequired     bool        `protobuf:"varint,4,opt,name=response_required,json=responseRequired,proto3" json:"response_required,omitempty"`
	ReplyToTopic         string      `protobuf:"bytes,5,opt,name=reply_to_topic,json=replyToTopic,proto3" json:"reply_to_topic,omitempty"`
	XXX_NoUnkeyedLiteral struct{}    `json:"-"`
	XXX_unrecognized     []byte      `json:"-"`
	XXX_sizecache        int32       `json:"-"`
}

func (m *InterContainerRequestBody) Reset()         { *m = InterContainerRequestBody{} }
func (m *InterContainerRequestBody) String() string { return proto.CompactTextString(m) }
func (*InterContainerRequestBody) ProtoMessage()    {}
func (*InterContainerRequestBody) Descriptor() ([]byte, []int) {
	return fileDescriptor_941f0031a549667f, []int{9}
}

func (m *InterContainerRequestBody) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_InterContainerRequestBody.Unmarshal(m, b)
}
func (m *InterContainerRequestBody) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_InterContainerRequestBody.Marshal(b, m, deterministic)
}
func (m *InterContainerRequestBody) XXX_Merge(src proto.Message) {
	xxx_messageInfo_InterContainerRequestBody.Merge(m, src)
}
func (m *InterContainerRequestBody) XXX_Size() int {
	return xxx_messageInfo_InterContainerRequestBody.Size(m)
}
func (m *InterContainerRequestBody) XXX_DiscardUnknown() {
	xxx_messageInfo_InterContainerRequestBody.DiscardUnknown(m)
}

var xxx_messageInfo_InterContainerRequestBody proto.InternalMessageInfo

func (m *InterContainerRequestBody) GetRpc() string {
	if m != nil {
		return m.Rpc
	}
	return ""
}

func (m *InterContainerRequestBody) GetArgs() []*Argument {
	if m != nil {
		return m.Args
	}
	return nil
}

func (m *InterContainerRequestBody) GetResponseRequired() bool {
	if m != nil {
		return m.ResponseRequired
	}
	return false
}

func (m *InterContainerRequestBody) GetReplyToTopic() string {
	if m != nil {
		return m.ReplyToTopic
	}
	return ""
}

type InterContainerResponseBody struct {
	Success              bool     `protobuf:"varint,1,opt,name=success,proto3" json:"success,omitempty"`
	Result               *any.Any `protobuf:"bytes,3,opt,name=result,proto3" json:"result,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *InterContainerResponseBody) Reset()         { *m = InterContainerResponseBody{} }
func (m *InterContainerResponseBody) String() string { return proto.CompactTextString(m) }
func (*InterContainerResponseBody) ProtoMessage()    {}
func (*InterContainerResponseBody) Descriptor() ([]byte, []int) {
	return fileDescriptor_941f0031a549667f, []int{10}
}

func (m *InterContainerResponseBody) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_InterContainerResponseBody.Unmarshal(m, b)
}
func (m *InterContainerResponseBody) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_InterContainerResponseBody.Marshal(b, m, deterministic)
}
func (m *InterContainerResponseBody) XXX_Merge(src proto.Message) {
	xxx_messageInfo_InterContainerResponseBody.Merge(m, src)
}
func (m *InterContainerResponseBody) XXX_Size() int {
	return xxx_messageInfo_InterContainerResponseBody.Size(m)
}
func (m *InterContainerResponseBody) XXX_DiscardUnknown() {
	xxx_messageInfo_InterContainerResponseBody.DiscardUnknown(m)
}

var xxx_messageInfo_InterContainerResponseBody proto.InternalMessageInfo

func (m *InterContainerResponseBody) GetSuccess() bool {
	if m != nil {
		return m.Success
	}
	return false
}

func (m *InterContainerResponseBody) GetResult() *any.Any {
	if m != nil {
		return m.Result
	}
	return nil
}

type SwitchCapability struct {
	Desc                 *openflow_13.OfpDesc           `protobuf:"bytes,1,opt,name=desc,proto3" json:"desc,omitempty"`
	SwitchFeatures       *openflow_13.OfpSwitchFeatures `protobuf:"bytes,2,opt,name=switch_features,json=switchFeatures,proto3" json:"switch_features,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                       `json:"-"`
	XXX_unrecognized     []byte                         `json:"-"`
	XXX_sizecache        int32                          `json:"-"`
}

func (m *SwitchCapability) Reset()         { *m = SwitchCapability{} }
func (m *SwitchCapability) String() string { return proto.CompactTextString(m) }
func (*SwitchCapability) ProtoMessage()    {}
func (*SwitchCapability) Descriptor() ([]byte, []int) {
	return fileDescriptor_941f0031a549667f, []int{11}
}

func (m *SwitchCapability) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_SwitchCapability.Unmarshal(m, b)
}
func (m *SwitchCapability) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_SwitchCapability.Marshal(b, m, deterministic)
}
func (m *SwitchCapability) XXX_Merge(src proto.Message) {
	xxx_messageInfo_SwitchCapability.Merge(m, src)
}
func (m *SwitchCapability) XXX_Size() int {
	return xxx_messageInfo_SwitchCapability.Size(m)
}
func (m *SwitchCapability) XXX_DiscardUnknown() {
	xxx_messageInfo_SwitchCapability.DiscardUnknown(m)
}

var xxx_messageInfo_SwitchCapability proto.InternalMessageInfo

func (m *SwitchCapability) GetDesc() *openflow_13.OfpDesc {
	if m != nil {
		return m.Desc
	}
	return nil
}

func (m *SwitchCapability) GetSwitchFeatures() *openflow_13.OfpSwitchFeatures {
	if m != nil {
		return m.SwitchFeatures
	}
	return nil
}

type DeviceDiscovered struct {
	Id                   string   `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"`
	ParentId             string   `protobuf:"bytes,2,opt,name=parent_id,json=parentId,proto3" json:"parent_id,omitempty"`
	DeviceType           string   `protobuf:"bytes,3,opt,name=device_type,json=deviceType,proto3" json:"device_type,omitempty"`
	Publisher            string   `protobuf:"bytes,4,opt,name=publisher,proto3" json:"publisher,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *DeviceDiscovered) Reset()         { *m = DeviceDiscovered{} }
func (m *DeviceDiscovered) String() string { return proto.CompactTextString(m) }
func (*DeviceDiscovered) ProtoMessage()    {}
func (*DeviceDiscovered) Descriptor() ([]byte, []int) {
	return fileDescriptor_941f0031a549667f, []int{12}
}

func (m *DeviceDiscovered) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_DeviceDiscovered.Unmarshal(m, b)
}
func (m *DeviceDiscovered) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_DeviceDiscovered.Marshal(b, m, deterministic)
}
func (m *DeviceDiscovered) XXX_Merge(src proto.Message) {
	xxx_messageInfo_DeviceDiscovered.Merge(m, src)
}
func (m *DeviceDiscovered) XXX_Size() int {
	return xxx_messageInfo_DeviceDiscovered.Size(m)
}
func (m *DeviceDiscovered) XXX_DiscardUnknown() {
	xxx_messageInfo_DeviceDiscovered.DiscardUnknown(m)
}

var xxx_messageInfo_DeviceDiscovered proto.InternalMessageInfo

func (m *DeviceDiscovered) GetId() string {
	if m != nil {
		return m.Id
	}
	return ""
}

func (m *DeviceDiscovered) GetParentId() string {
	if m != nil {
		return m.ParentId
	}
	return ""
}

func (m *DeviceDiscovered) GetDeviceType() string {
	if m != nil {
		return m.DeviceType
	}
	return ""
}

func (m *DeviceDiscovered) GetPublisher() string {
	if m != nil {
		return m.Publisher
	}
	return ""
}

type InterAdapterMessageType struct {
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *InterAdapterMessageType) Reset()         { *m = InterAdapterMessageType{} }
func (m *InterAdapterMessageType) String() string { return proto.CompactTextString(m) }
func (*InterAdapterMessageType) ProtoMessage()    {}
func (*InterAdapterMessageType) Descriptor() ([]byte, []int) {
	return fileDescriptor_941f0031a549667f, []int{13}
}

func (m *InterAdapterMessageType) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_InterAdapterMessageType.Unmarshal(m, b)
}
func (m *InterAdapterMessageType) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_InterAdapterMessageType.Marshal(b, m, deterministic)
}
func (m *InterAdapterMessageType) XXX_Merge(src proto.Message) {
	xxx_messageInfo_InterAdapterMessageType.Merge(m, src)
}
func (m *InterAdapterMessageType) XXX_Size() int {
	return xxx_messageInfo_InterAdapterMessageType.Size(m)
}
func (m *InterAdapterMessageType) XXX_DiscardUnknown() {
	xxx_messageInfo_InterAdapterMessageType.DiscardUnknown(m)
}

var xxx_messageInfo_InterAdapterMessageType proto.InternalMessageInfo

type InterAdapterHeader struct {
	Id                   string                        `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"`
	Type                 InterAdapterMessageType_Types `protobuf:"varint,2,opt,name=type,proto3,enum=voltha.InterAdapterMessageType_Types" json:"type,omitempty"`
	FromTopic            string                        `protobuf:"bytes,3,opt,name=from_topic,json=fromTopic,proto3" json:"from_topic,omitempty"`
	ToTopic              string                        `protobuf:"bytes,4,opt,name=to_topic,json=toTopic,proto3" json:"to_topic,omitempty"`
	ToDeviceId           string                        `protobuf:"bytes,5,opt,name=to_device_id,json=toDeviceId,proto3" json:"to_device_id,omitempty"`
	ProxyDeviceId        string                        `protobuf:"bytes,6,opt,name=proxy_device_id,json=proxyDeviceId,proto3" json:"proxy_device_id,omitempty"`
	Timestamp            *timestamp.Timestamp          `protobuf:"bytes,7,opt,name=timestamp,proto3" json:"timestamp,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                      `json:"-"`
	XXX_unrecognized     []byte                        `json:"-"`
	XXX_sizecache        int32                         `json:"-"`
}

func (m *InterAdapterHeader) Reset()         { *m = InterAdapterHeader{} }
func (m *InterAdapterHeader) String() string { return proto.CompactTextString(m) }
func (*InterAdapterHeader) ProtoMessage()    {}
func (*InterAdapterHeader) Descriptor() ([]byte, []int) {
	return fileDescriptor_941f0031a549667f, []int{14}
}

func (m *InterAdapterHeader) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_InterAdapterHeader.Unmarshal(m, b)
}
func (m *InterAdapterHeader) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_InterAdapterHeader.Marshal(b, m, deterministic)
}
func (m *InterAdapterHeader) XXX_Merge(src proto.Message) {
	xxx_messageInfo_InterAdapterHeader.Merge(m, src)
}
func (m *InterAdapterHeader) XXX_Size() int {
	return xxx_messageInfo_InterAdapterHeader.Size(m)
}
func (m *InterAdapterHeader) XXX_DiscardUnknown() {
	xxx_messageInfo_InterAdapterHeader.DiscardUnknown(m)
}

var xxx_messageInfo_InterAdapterHeader proto.InternalMessageInfo

func (m *InterAdapterHeader) GetId() string {
	if m != nil {
		return m.Id
	}
	return ""
}

func (m *InterAdapterHeader) GetType() InterAdapterMessageType_Types {
	if m != nil {
		return m.Type
	}
	return InterAdapterMessageType_FLOW_REQUEST
}

func (m *InterAdapterHeader) GetFromTopic() string {
	if m != nil {
		return m.FromTopic
	}
	return ""
}

func (m *InterAdapterHeader) GetToTopic() string {
	if m != nil {
		return m.ToTopic
	}
	return ""
}

func (m *InterAdapterHeader) GetToDeviceId() string {
	if m != nil {
		return m.ToDeviceId
	}
	return ""
}

func (m *InterAdapterHeader) GetProxyDeviceId() string {
	if m != nil {
		return m.ProxyDeviceId
	}
	return ""
}

func (m *InterAdapterHeader) GetTimestamp() *timestamp.Timestamp {
	if m != nil {
		return m.Timestamp
	}
	return nil
}

type InterAdapterOmciMessage struct {
	Message              []byte                      `protobuf:"bytes,1,opt,name=message,proto3" json:"message,omitempty"`
	ConnectStatus        common.ConnectStatus_Types  `protobuf:"varint,2,opt,name=connect_status,json=connectStatus,proto3,enum=common.ConnectStatus_Types" json:"connect_status,omitempty"`
	ProxyAddress         *voltha.Device_ProxyAddress `protobuf:"bytes,3,opt,name=proxy_address,json=proxyAddress,proto3" json:"proxy_address,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                    `json:"-"`
	XXX_unrecognized     []byte                      `json:"-"`
	XXX_sizecache        int32                       `json:"-"`
}

func (m *InterAdapterOmciMessage) Reset()         { *m = InterAdapterOmciMessage{} }
func (m *InterAdapterOmciMessage) String() string { return proto.CompactTextString(m) }
func (*InterAdapterOmciMessage) ProtoMessage()    {}
func (*InterAdapterOmciMessage) Descriptor() ([]byte, []int) {
	return fileDescriptor_941f0031a549667f, []int{15}
}

func (m *InterAdapterOmciMessage) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_InterAdapterOmciMessage.Unmarshal(m, b)
}
func (m *InterAdapterOmciMessage) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_InterAdapterOmciMessage.Marshal(b, m, deterministic)
}
func (m *InterAdapterOmciMessage) XXX_Merge(src proto.Message) {
	xxx_messageInfo_InterAdapterOmciMessage.Merge(m, src)
}
func (m *InterAdapterOmciMessage) XXX_Size() int {
	return xxx_messageInfo_InterAdapterOmciMessage.Size(m)
}
func (m *InterAdapterOmciMessage) XXX_DiscardUnknown() {
	xxx_messageInfo_InterAdapterOmciMessage.DiscardUnknown(m)
}

var xxx_messageInfo_InterAdapterOmciMessage proto.InternalMessageInfo

func (m *InterAdapterOmciMessage) GetMessage() []byte {
	if m != nil {
		return m.Message
	}
	return nil
}

func (m *InterAdapterOmciMessage) GetConnectStatus() common.ConnectStatus_Types {
	if m != nil {
		return m.ConnectStatus
	}
	return common.ConnectStatus_UNKNOWN
}

func (m *InterAdapterOmciMessage) GetProxyAddress() *voltha.Device_ProxyAddress {
	if m != nil {
		return m.ProxyAddress
	}
	return nil
}

type InterAdapterTechProfileDownloadMessage struct {
	UniId                uint32   `protobuf:"varint,1,opt,name=uni_id,json=uniId,proto3" json:"uni_id,omitempty"`
	Path                 string   `protobuf:"bytes,2,opt,name=path,proto3" json:"path,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *InterAdapterTechProfileDownloadMessage) Reset() {
	*m = InterAdapterTechProfileDownloadMessage{}
}
func (m *InterAdapterTechProfileDownloadMessage) String() string { return proto.CompactTextString(m) }
func (*InterAdapterTechProfileDownloadMessage) ProtoMessage()    {}
func (*InterAdapterTechProfileDownloadMessage) Descriptor() ([]byte, []int) {
	return fileDescriptor_941f0031a549667f, []int{16}
}

func (m *InterAdapterTechProfileDownloadMessage) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_InterAdapterTechProfileDownloadMessage.Unmarshal(m, b)
}
func (m *InterAdapterTechProfileDownloadMessage) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_InterAdapterTechProfileDownloadMessage.Marshal(b, m, deterministic)
}
func (m *InterAdapterTechProfileDownloadMessage) XXX_Merge(src proto.Message) {
	xxx_messageInfo_InterAdapterTechProfileDownloadMessage.Merge(m, src)
}
func (m *InterAdapterTechProfileDownloadMessage) XXX_Size() int {
	return xxx_messageInfo_InterAdapterTechProfileDownloadMessage.Size(m)
}
func (m *InterAdapterTechProfileDownloadMessage) XXX_DiscardUnknown() {
	xxx_messageInfo_InterAdapterTechProfileDownloadMessage.DiscardUnknown(m)
}

var xxx_messageInfo_InterAdapterTechProfileDownloadMessage proto.InternalMessageInfo

func (m *InterAdapterTechProfileDownloadMessage) GetUniId() uint32 {
	if m != nil {
		return m.UniId
	}
	return 0
}

func (m *InterAdapterTechProfileDownloadMessage) GetPath() string {
	if m != nil {
		return m.Path
	}
	return ""
}

type InterAdapterDeleteGemPortMessage struct {
	UniId                uint32   `protobuf:"varint,1,opt,name=uni_id,json=uniId,proto3" json:"uni_id,omitempty"`
	TpPath               string   `protobuf:"bytes,2,opt,name=tp_path,json=tpPath,proto3" json:"tp_path,omitempty"`
	GemPortId            uint32   `protobuf:"varint,3,opt,name=gem_port_id,json=gemPortId,proto3" json:"gem_port_id,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *InterAdapterDeleteGemPortMessage) Reset()         { *m = InterAdapterDeleteGemPortMessage{} }
func (m *InterAdapterDeleteGemPortMessage) String() string { return proto.CompactTextString(m) }
func (*InterAdapterDeleteGemPortMessage) ProtoMessage()    {}
func (*InterAdapterDeleteGemPortMessage) Descriptor() ([]byte, []int) {
	return fileDescriptor_941f0031a549667f, []int{17}
}

func (m *InterAdapterDeleteGemPortMessage) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_InterAdapterDeleteGemPortMessage.Unmarshal(m, b)
}
func (m *InterAdapterDeleteGemPortMessage) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_InterAdapterDeleteGemPortMessage.Marshal(b, m, deterministic)
}
func (m *InterAdapterDeleteGemPortMessage) XXX_Merge(src proto.Message) {
	xxx_messageInfo_InterAdapterDeleteGemPortMessage.Merge(m, src)
}
func (m *InterAdapterDeleteGemPortMessage) XXX_Size() int {
	return xxx_messageInfo_InterAdapterDeleteGemPortMessage.Size(m)
}
func (m *InterAdapterDeleteGemPortMessage) XXX_DiscardUnknown() {
	xxx_messageInfo_InterAdapterDeleteGemPortMessage.DiscardUnknown(m)
}

var xxx_messageInfo_InterAdapterDeleteGemPortMessage proto.InternalMessageInfo

func (m *InterAdapterDeleteGemPortMessage) GetUniId() uint32 {
	if m != nil {
		return m.UniId
	}
	return 0
}

func (m *InterAdapterDeleteGemPortMessage) GetTpPath() string {
	if m != nil {
		return m.TpPath
	}
	return ""
}

func (m *InterAdapterDeleteGemPortMessage) GetGemPortId() uint32 {
	if m != nil {
		return m.GemPortId
	}
	return 0
}

type InterAdapterDeleteTcontMessage struct {
	UniId                uint32   `protobuf:"varint,1,opt,name=uni_id,json=uniId,proto3" json:"uni_id,omitempty"`
	TpPath               string   `protobuf:"bytes,2,opt,name=tp_path,json=tpPath,proto3" json:"tp_path,omitempty"`
	AllocId              uint32   `protobuf:"varint,3,opt,name=alloc_id,json=allocId,proto3" json:"alloc_id,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *InterAdapterDeleteTcontMessage) Reset()         { *m = InterAdapterDeleteTcontMessage{} }
func (m *InterAdapterDeleteTcontMessage) String() string { return proto.CompactTextString(m) }
func (*InterAdapterDeleteTcontMessage) ProtoMessage()    {}
func (*InterAdapterDeleteTcontMessage) Descriptor() ([]byte, []int) {
	return fileDescriptor_941f0031a549667f, []int{18}
}

func (m *InterAdapterDeleteTcontMessage) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_InterAdapterDeleteTcontMessage.Unmarshal(m, b)
}
func (m *InterAdapterDeleteTcontMessage) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_InterAdapterDeleteTcontMessage.Marshal(b, m, deterministic)
}
func (m *InterAdapterDeleteTcontMessage) XXX_Merge(src proto.Message) {
	xxx_messageInfo_InterAdapterDeleteTcontMessage.Merge(m, src)
}
func (m *InterAdapterDeleteTcontMessage) XXX_Size() int {
	return xxx_messageInfo_InterAdapterDeleteTcontMessage.Size(m)
}
func (m *InterAdapterDeleteTcontMessage) XXX_DiscardUnknown() {
	xxx_messageInfo_InterAdapterDeleteTcontMessage.DiscardUnknown(m)
}

var xxx_messageInfo_InterAdapterDeleteTcontMessage proto.InternalMessageInfo

func (m *InterAdapterDeleteTcontMessage) GetUniId() uint32 {
	if m != nil {
		return m.UniId
	}
	return 0
}

func (m *InterAdapterDeleteTcontMessage) GetTpPath() string {
	if m != nil {
		return m.TpPath
	}
	return ""
}

func (m *InterAdapterDeleteTcontMessage) GetAllocId() uint32 {
	if m != nil {
		return m.AllocId
	}
	return 0
}

type InterAdapterResponseBody struct {
	Status bool `protobuf:"varint,1,opt,name=status,proto3" json:"status,omitempty"`
	// Types that are valid to be assigned to Payload:
	//	*InterAdapterResponseBody_Body
	//	*InterAdapterResponseBody_Omci
	Payload              isInterAdapterResponseBody_Payload `protobuf_oneof:"payload"`
	XXX_NoUnkeyedLiteral struct{}                           `json:"-"`
	XXX_unrecognized     []byte                             `json:"-"`
	XXX_sizecache        int32                              `json:"-"`
}

func (m *InterAdapterResponseBody) Reset()         { *m = InterAdapterResponseBody{} }
func (m *InterAdapterResponseBody) String() string { return proto.CompactTextString(m) }
func (*InterAdapterResponseBody) ProtoMessage()    {}
func (*InterAdapterResponseBody) Descriptor() ([]byte, []int) {
	return fileDescriptor_941f0031a549667f, []int{19}
}

func (m *InterAdapterResponseBody) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_InterAdapterResponseBody.Unmarshal(m, b)
}
func (m *InterAdapterResponseBody) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_InterAdapterResponseBody.Marshal(b, m, deterministic)
}
func (m *InterAdapterResponseBody) XXX_Merge(src proto.Message) {
	xxx_messageInfo_InterAdapterResponseBody.Merge(m, src)
}
func (m *InterAdapterResponseBody) XXX_Size() int {
	return xxx_messageInfo_InterAdapterResponseBody.Size(m)
}
func (m *InterAdapterResponseBody) XXX_DiscardUnknown() {
	xxx_messageInfo_InterAdapterResponseBody.DiscardUnknown(m)
}

var xxx_messageInfo_InterAdapterResponseBody proto.InternalMessageInfo

func (m *InterAdapterResponseBody) GetStatus() bool {
	if m != nil {
		return m.Status
	}
	return false
}

type isInterAdapterResponseBody_Payload interface {
	isInterAdapterResponseBody_Payload()
}

type InterAdapterResponseBody_Body struct {
	Body *any.Any `protobuf:"bytes,2,opt,name=body,proto3,oneof"`
}

type InterAdapterResponseBody_Omci struct {
	Omci *InterAdapterOmciMessage `protobuf:"bytes,3,opt,name=omci,proto3,oneof"`
}

func (*InterAdapterResponseBody_Body) isInterAdapterResponseBody_Payload() {}

func (*InterAdapterResponseBody_Omci) isInterAdapterResponseBody_Payload() {}

func (m *InterAdapterResponseBody) GetPayload() isInterAdapterResponseBody_Payload {
	if m != nil {
		return m.Payload
	}
	return nil
}

func (m *InterAdapterResponseBody) GetBody() *any.Any {
	if x, ok := m.GetPayload().(*InterAdapterResponseBody_Body); ok {
		return x.Body
	}
	return nil
}

func (m *InterAdapterResponseBody) GetOmci() *InterAdapterOmciMessage {
	if x, ok := m.GetPayload().(*InterAdapterResponseBody_Omci); ok {
		return x.Omci
	}
	return nil
}

// XXX_OneofWrappers is for the internal use of the proto package.
func (*InterAdapterResponseBody) XXX_OneofWrappers() []interface{} {
	return []interface{}{
		(*InterAdapterResponseBody_Body)(nil),
		(*InterAdapterResponseBody_Omci)(nil),
	}
}

type InterAdapterMessage struct {
	Header               *InterAdapterHeader `protobuf:"bytes,1,opt,name=header,proto3" json:"header,omitempty"`
	Body                 *any.Any            `protobuf:"bytes,2,opt,name=body,proto3" json:"body,omitempty"`
	XXX_NoUnkeyedLiteral struct{}            `json:"-"`
	XXX_unrecognized     []byte              `json:"-"`
	XXX_sizecache        int32               `json:"-"`
}

func (m *InterAdapterMessage) Reset()         { *m = InterAdapterMessage{} }
func (m *InterAdapterMessage) String() string { return proto.CompactTextString(m) }
func (*InterAdapterMessage) ProtoMessage()    {}
func (*InterAdapterMessage) Descriptor() ([]byte, []int) {
	return fileDescriptor_941f0031a549667f, []int{20}
}

func (m *InterAdapterMessage) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_InterAdapterMessage.Unmarshal(m, b)
}
func (m *InterAdapterMessage) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_InterAdapterMessage.Marshal(b, m, deterministic)
}
func (m *InterAdapterMessage) XXX_Merge(src proto.Message) {
	xxx_messageInfo_InterAdapterMessage.Merge(m, src)
}
func (m *InterAdapterMessage) XXX_Size() int {
	return xxx_messageInfo_InterAdapterMessage.Size(m)
}
func (m *InterAdapterMessage) XXX_DiscardUnknown() {
	xxx_messageInfo_InterAdapterMessage.DiscardUnknown(m)
}

var xxx_messageInfo_InterAdapterMessage proto.InternalMessageInfo

func (m *InterAdapterMessage) GetHeader() *InterAdapterHeader {
	if m != nil {
		return m.Header
	}
	return nil
}

func (m *InterAdapterMessage) GetBody() *any.Any {
	if m != nil {
		return m.Body
	}
	return nil
}

func init() {
	proto.RegisterEnum("voltha.MessageType", MessageType_name, MessageType_value)
	proto.RegisterEnum("voltha.ErrorCodeCodes", ErrorCodeCodes_name, ErrorCodeCodes_value)
	proto.RegisterEnum("voltha.InterAdapterMessageType_Types", InterAdapterMessageType_Types_name, InterAdapterMessageType_Types_value)
	proto.RegisterType((*StrType)(nil), "voltha.StrType")
	proto.RegisterType((*IntType)(nil), "voltha.IntType")
	proto.RegisterType((*BoolType)(nil), "voltha.BoolType")
	proto.RegisterType((*Packet)(nil), "voltha.Packet")
	proto.RegisterType((*ErrorCode)(nil), "voltha.ErrorCode")
	proto.RegisterType((*Error)(nil), "voltha.Error")
	proto.RegisterType((*Header)(nil), "voltha.Header")
	proto.RegisterType((*Argument)(nil), "voltha.Argument")
	proto.RegisterType((*InterContainerMessage)(nil), "voltha.InterContainerMessage")
	proto.RegisterType((*InterContainerRequestBody)(nil), "voltha.InterContainerRequestBody")
	proto.RegisterType((*InterContainerResponseBody)(nil), "voltha.InterContainerResponseBody")
	proto.RegisterType((*SwitchCapability)(nil), "voltha.SwitchCapability")
	proto.RegisterType((*DeviceDiscovered)(nil), "voltha.DeviceDiscovered")
	proto.RegisterType((*InterAdapterMessageType)(nil), "voltha.InterAdapterMessageType")
	proto.RegisterType((*InterAdapterHeader)(nil), "voltha.InterAdapterHeader")
	proto.RegisterType((*InterAdapterOmciMessage)(nil), "voltha.InterAdapterOmciMessage")
	proto.RegisterType((*InterAdapterTechProfileDownloadMessage)(nil), "voltha.InterAdapterTechProfileDownloadMessage")
	proto.RegisterType((*InterAdapterDeleteGemPortMessage)(nil), "voltha.InterAdapterDeleteGemPortMessage")
	proto.RegisterType((*InterAdapterDeleteTcontMessage)(nil), "voltha.InterAdapterDeleteTcontMessage")
	proto.RegisterType((*InterAdapterResponseBody)(nil), "voltha.InterAdapterResponseBody")
	proto.RegisterType((*InterAdapterMessage)(nil), "voltha.InterAdapterMessage")
}

func init() {
	proto.RegisterFile("voltha_protos/inter_container.proto", fileDescriptor_941f0031a549667f)
}

var fileDescriptor_941f0031a549667f = []byte{
	// 1329 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xa4, 0x56, 0xdb, 0x6e, 0xdb, 0x46,
	0x13, 0x8e, 0xac, 0xf3, 0xc8, 0x56, 0x94, 0x75, 0x1c, 0xcb, 0x76, 0x0e, 0xfe, 0xf9, 0xa7, 0xa9,
	0x9b, 0xb4, 0x32, 0xaa, 0xa0, 0x68, 0x7b, 0xd5, 0xca, 0x12, 0x13, 0x13, 0x90, 0x25, 0x95, 0x92,
	0x93, 0xa2, 0x28, 0x40, 0xd0, 0xe4, 0x5a, 0x22, 0x4c, 0x71, 0x99, 0xe5, 0xd2, 0x29, 0x6f, 0x0a,
	0xf4, 0xae, 0x2f, 0x51, 0xa0, 0x57, 0x7d, 0x87, 0xbe, 0x46, 0x9f, 0xa8, 0xd8, 0x03, 0x25, 0x4a,
	0x49, 0x1a, 0x34, 0xbd, 0xe3, 0xcc, 0xf7, 0xed, 0x0c, 0x77, 0x66, 0xe7, 0xdb, 0x85, 0xff, 0x5f,
	0x13, 0x9f, 0xcd, 0x6c, 0x2b, 0xa4, 0x84, 0x91, 0xe8, 0xd8, 0x0b, 0x18, 0xa6, 0x96, 0x43, 0x02,
	0x66, 0x7b, 0x01, 0xa6, 0x2d, 0xe1, 0x46, 0x25, 0x49, 0xda, 0xdf, 0x5f, 0x25, 0x3b, 0x64, 0x3e,
	0x27, 0x81, 0xe4, 0xac, 0x63, 0xd2, 0x52, 0xd8, 0xde, 0x94, 0x90, 0xa9, 0x8f, 0x8f, 0x85, 0x75,
	0x11, 0x5f, 0x1e, 0xdb, 0x41, 0xa2, 0xa0, 0x07, 0xab, 0xcb, 0x48, 0x88, 0x83, 0x4b, 0x9f, 0xbc,
	0xb6, 0x3e, 0x7f, 0xaa, 0x08, 0xda, 0x2a, 0xc1, 0x27, 0x53, 0xcf, 0xb1, 0x7d, 0xcb, 0xc5, 0xd7,
	0x9e, 0x83, 0xd3, 0x20, 0xeb, 0xf1, 0x99, 0x37, 0xc7, 0x11, 0xb3, 0xe7, 0xa1, 0x24, 0x68, 0x07,
	0x50, 0x1e, 0x33, 0x3a, 0x49, 0x42, 0x8c, 0x1a, 0x90, 0xbf, 0xb6, 0xfd, 0x66, 0xee, 0x30, 0x77,
	0x54, 0x35, 0xf9, 0x27, 0x07, 0x8d, 0x80, 0xad, 0x83, 0x79, 0x09, 0xde, 0x85, 0xca, 0x09, 0x21,
	0xfe, 0x3a, 0x5a, 0x91, 0xa8, 0x06, 0xa5, 0x91, 0xed, 0x5c, 0x61, 0x86, 0x9a, 0x50, 0x0e, 0xed,
	0xc4, 0x27, 0xb6, 0x2b, 0xf0, 0x4d, 0x33, 0x35, 0xb5, 0x1f, 0xa1, 0xaa, 0x53, 0x4a, 0x68, 0x97,
	0xb8, 0x58, 0x1b, 0x42, 0xd1, 0x21, 0x2e, 0x8e, 0xd0, 0x2e, 0x6c, 0x9f, 0x0f, 0xc6, 0xe7, 0xa3,
	0xd1, 0xd0, 0x9c, 0xe8, 0x3d, 0xcb, 0xd4, 0xbf, 0x3b, 0xd7, 0xc7, 0x93, 0xc6, 0x0d, 0x74, 0x07,
	0x90, 0x31, 0x78, 0xd1, 0xe9, 0x1b, 0x3d, 0x6b, 0xd4, 0x31, 0x3b, 0x67, 0xfa, 0x44, 0x37, 0xc7,
	0x8d, 0x1c, 0xda, 0x81, 0x5b, 0x3d, 0xbd, 0xd3, 0xeb, 0x1b, 0x03, 0xdd, 0xd2, 0xbf, 0xef, 0xea,
	0x7a, 0x4f, 0xef, 0x35, 0x36, 0xb4, 0x3e, 0x14, 0x45, 0x74, 0xf4, 0x04, 0x0a, 0x3c, 0xb2, 0xc8,
	0x5e, 0x6f, 0xef, 0xb6, 0x54, 0x03, 0x16, 0xa9, 0x5b, 0x22, 0xaf, 0x29, 0x48, 0xe8, 0x0e, 0x94,
	0x28, 0xb6, 0x23, 0x12, 0x34, 0x37, 0x44, 0x1d, 0x94, 0xa5, 0xfd, 0x95, 0x83, 0xd2, 0x29, 0xb6,
	0x5d, 0x4c, 0x51, 0x1d, 0x36, 0x3c, 0x57, 0x95, 0x69, 0xc3, 0x73, 0xd1, 0xc7, 0x50, 0x60, 0x49,
	0x88, 0xc5, 0x82, 0x7a, 0x7b, 0x3b, 0x8d, 0x7f, 0x86, 0xa3, 0xc8, 0x9e, 0x62, 0x5e, 0x1f, 0x53,
	0x10, 0xd0, 0x3d, 0x80, 0x4b, 0x4a, 0xe6, 0x16, 0x23, 0xa1, 0xe7, 0x34, 0xf3, 0x22, 0x40, 0x95,
	0x7b, 0x26, 0xdc, 0x81, 0xf6, 0xa0, 0xc2, 0x88, 0x02, 0x0b, 0x02, 0x2c, 0x33, 0x22, 0xa1, 0x03,
	0xa8, 0x5e, 0xe1, 0x44, 0x61, 0x45, 0x81, 0x55, 0xae, 0x70, 0x22, 0xc1, 0xaf, 0xa0, 0xba, 0xe8,
	0x6a, 0xb3, 0x74, 0x98, 0x3b, 0xaa, 0xb5, 0xf7, 0x5b, 0xb2, 0xef, 0xad, 0xb4, 0xef, 0xad, 0x49,
	0xca, 0x30, 0x97, 0x64, 0xed, 0x14, 0x2a, 0x1d, 0x3a, 0x8d, 0xe7, 0x38, 0x60, 0xbc, 0x85, 0x57,
	0x38, 0x49, 0xbb, 0x7f, 0x85, 0x13, 0xf4, 0x18, 0x8a, 0xd7, 0xb6, 0x1f, 0xcb, 0x8d, 0xd5, 0xda,
	0xb7, 0xdf, 0x88, 0xd9, 0x09, 0x12, 0x53, 0x52, 0x34, 0x0f, 0x76, 0x0c, 0x3e, 0x20, 0xdd, 0x74,
	0x3e, 0xd4, 0xee, 0xd1, 0x23, 0x28, 0xcd, 0x44, 0xd9, 0x44, 0xe4, 0x5a, 0xbb, 0x9e, 0x96, 0x47,
	0x16, 0xd3, 0x54, 0x28, 0x3a, 0x82, 0xc2, 0x05, 0x71, 0x93, 0x7f, 0xcc, 0x25, 0x18, 0xda, 0x1f,
	0x39, 0xd8, 0x5b, 0xcd, 0x65, 0xe2, 0x57, 0x31, 0x8e, 0xd8, 0x09, 0x71, 0x13, 0xbe, 0x0d, 0x1a,
	0x3a, 0xaa, 0x79, 0xfc, 0x13, 0x3d, 0x84, 0x82, 0x4d, 0xa7, 0x51, 0x33, 0x7f, 0x98, 0x3f, 0xaa,
	0xb5, 0x1b, 0x69, 0xfe, 0x74, 0xe3, 0xa6, 0x40, 0xd1, 0x13, 0xb8, 0x45, 0x71, 0x14, 0x92, 0x20,
	0xc2, 0x16, 0xc5, 0xaf, 0x62, 0x8f, 0x62, 0x57, 0x74, 0xa1, 0x62, 0x36, 0x52, 0xc0, 0x54, 0x7e,
	0xf4, 0x10, 0xea, 0x14, 0x87, 0x3e, 0x6f, 0xc8, 0x4a, 0x4f, 0x36, 0x85, 0x77, 0x22, 0x9b, 0xa6,
	0xb9, 0xb0, 0xbf, 0xfe, 0x9f, 0x32, 0x8e, 0xf8, 0xd1, 0x26, 0x94, 0xa3, 0xd8, 0x71, 0x70, 0x14,
	0xa9, 0xb1, 0x49, 0x4d, 0xf4, 0x29, 0x3f, 0x82, 0x51, 0xec, 0x33, 0x71, 0x44, 0xde, 0x55, 0x0c,
	0xc5, 0xd1, 0x7e, 0xcd, 0x41, 0x63, 0xfc, 0xda, 0x63, 0xce, 0xac, 0x6b, 0x87, 0xf6, 0x85, 0xe7,
	0x7b, 0x2c, 0x41, 0x9f, 0x40, 0xc1, 0xc5, 0x91, 0xa3, 0x6a, 0xbe, 0xd3, 0xca, 0x8a, 0x07, 0xb9,
	0x0c, 0x2d, 0x0e, 0x9a, 0x82, 0x82, 0x0c, 0xb8, 0x19, 0x89, 0xe5, 0xd6, 0x25, 0xb6, 0x59, 0x4c,
	0x71, 0xa4, 0x7a, 0x70, 0xf8, 0xc6, 0xaa, 0x35, 0x9e, 0x59, 0x97, 0x8e, 0x67, 0xca, 0xd6, 0x7e,
	0x86, 0x46, 0x4f, 0x88, 0x4f, 0xcf, 0x8b, 0x1c, 0x72, 0x8d, 0x79, 0xa9, 0xd6, 0x87, 0xe5, 0x00,
	0xaa, 0xa1, 0x4d, 0x71, 0xc0, 0x2c, 0xcf, 0x55, 0x5d, 0xaa, 0x48, 0x87, 0xe1, 0xa2, 0x07, 0x50,
	0x93, 0xea, 0x65, 0x89, 0x81, 0x92, 0x13, 0x02, 0xd2, 0x25, 0x74, 0xe6, 0x2e, 0x54, 0xc3, 0xf8,
	0xc2, 0xf7, 0xa2, 0x19, 0xa6, 0x6a, 0x46, 0x96, 0x0e, 0xed, 0xb7, 0x0d, 0xd8, 0x15, 0x15, 0xef,
	0xb8, 0x76, 0xc8, 0x16, 0x67, 0x90, 0xaf, 0xd4, 0x7e, 0xd9, 0x80, 0x22, 0xff, 0x88, 0x50, 0x03,
	0x36, 0x9f, 0xf5, 0x87, 0x2f, 0x33, 0xc2, 0x72, 0x0b, 0xb6, 0x94, 0x67, 0x3c, 0x1a, 0x0e, 0xc6,
	0x7a, 0x23, 0xc7, 0x49, 0xc3, 0xb3, 0xae, 0xb1, 0x20, 0x6d, 0x70, 0x92, 0xf2, 0x28, 0x52, 0x1e,
	0x6d, 0xc3, 0xcd, 0x33, 0x7d, 0x62, 0x1a, 0xdd, 0xf1, 0x82, 0x57, 0x40, 0xb7, 0xa1, 0xb1, 0x74,
	0x2a, 0x6a, 0x91, 0x53, 0x87, 0x83, 0x73, 0xcb, 0x18, 0x2c, 0x05, 0xad, 0xc4, 0xa9, 0x4b, 0xa7,
	0xa2, 0x96, 0xd1, 0xff, 0xe0, 0xde, 0x44, 0xef, 0x9e, 0x5a, 0x23, 0x73, 0xf8, 0xcc, 0xe8, 0xeb,
	0x56, 0x6f, 0xf8, 0x72, 0xd0, 0x1f, 0x76, 0x96, 0x0b, 0x2b, 0xe8, 0x00, 0x76, 0x7b, 0x7a, 0x5f,
	0x9f, 0xe8, 0xd6, 0x73, 0xfd, 0xcc, 0xe2, 0x42, 0xb9, 0x00, 0xab, 0xa8, 0x09, 0xb7, 0x15, 0x38,
	0xe9, 0x0e, 0x07, 0x4b, 0x04, 0x78, 0x7d, 0x50, 0xb6, 0x3e, 0xef, 0xd0, 0xb3, 0xaf, 0x57, 0xf4,
	0xec, 0xa3, 0x74, 0x60, 0xde, 0x51, 0xd9, 0x96, 0xa8, 0xea, 0x7f, 0x56, 0xb8, 0x43, 0xd8, 0x64,
	0x44, 0xdd, 0x5d, 0xfc, 0x68, 0xc8, 0x81, 0x02, 0x46, 0xe4, 0x89, 0x32, 0x5c, 0xf4, 0x08, 0x6e,
	0x86, 0x94, 0xfc, 0x94, 0x64, 0x48, 0x25, 0x41, 0xda, 0x12, 0xee, 0x05, 0x6f, 0x45, 0x0e, 0xcb,
	0xff, 0x46, 0x0e, 0xff, 0xcc, 0xad, 0x9e, 0x9f, 0xe1, 0xdc, 0xf1, 0x52, 0x1d, 0x6b, 0x42, 0x79,
	0x2e, 0x3f, 0xd3, 0x5b, 0x4c, 0x99, 0xe8, 0x04, 0xea, 0x0e, 0x09, 0x02, 0xec, 0x30, 0x2b, 0x62,
	0x36, 0x8b, 0x23, 0x55, 0xb8, 0x83, 0x96, 0x7a, 0x05, 0x74, 0x25, 0x3a, 0x16, 0xa0, 0x2a, 0xd7,
	0x96, 0x93, 0x75, 0xa2, 0x6f, 0x41, 0x6e, 0xc2, 0xb2, 0x5d, 0x97, 0x72, 0x49, 0x90, 0x93, 0x7f,
	0x90, 0xd6, 0x5e, 0x6e, 0xae, 0x35, 0xe2, 0x9c, 0x8e, 0xa4, 0x98, 0x9b, 0x61, 0xc6, 0xd2, 0xc6,
	0xf0, 0x28, 0xfb, 0xeb, 0x13, 0xec, 0xcc, 0x46, 0x94, 0x5c, 0x7a, 0x3e, 0xee, 0x91, 0xd7, 0x01,
	0xbf, 0x6e, 0xd3, 0x9d, 0xec, 0x40, 0x29, 0x0e, 0x3c, 0x4b, 0xb5, 0x7c, 0xcb, 0x2c, 0xc6, 0x81,
	0x67, 0xb8, 0x08, 0x41, 0x21, 0xb4, 0xd9, 0x4c, 0xcd, 0xa4, 0xf8, 0xd6, 0x28, 0x1c, 0x66, 0x83,
	0xf6, 0xb0, 0x8f, 0x19, 0x7e, 0x8e, 0xe7, 0x23, 0x42, 0xd9, 0x7b, 0xc2, 0xed, 0x42, 0x99, 0x85,
	0x56, 0x26, 0x62, 0x89, 0x85, 0x23, 0x9b, 0xcd, 0xd0, 0x7d, 0xa8, 0x4d, 0xf1, 0xdc, 0x0a, 0x09,
	0x15, 0x12, 0x90, 0x17, 0x8b, 0xaa, 0x53, 0x19, 0xd4, 0x70, 0xb5, 0x2b, 0xb8, 0xff, 0x66, 0xce,
	0x09, 0x7f, 0x77, 0x7d, 0x68, 0xc6, 0x3d, 0xa8, 0xd8, 0xbe, 0x4f, 0x9c, 0x65, 0xba, 0xb2, 0xb0,
	0x0d, 0x57, 0xfb, 0x3d, 0x07, 0xcd, 0x6c, 0xb6, 0x15, 0x85, 0xbe, 0x03, 0x25, 0xd5, 0x50, 0x29,
	0xd0, 0xca, 0x42, 0x8f, 0xdf, 0x7f, 0x55, 0x9d, 0xde, 0x90, 0x97, 0x15, 0xfa, 0x02, 0x0a, 0x64,
	0xee, 0x78, 0xaa, 0x9f, 0x0f, 0xde, 0x36, 0x4b, 0x99, 0x53, 0xc6, 0x97, 0x71, 0xfa, 0x49, 0x75,
	0xf1, 0x66, 0xd2, 0x22, 0xd8, 0x7e, 0xcb, 0xe4, 0xa1, 0xf6, 0xda, 0xbd, 0xba, 0xff, 0xb6, 0xd0,
	0x1f, 0x7a, 0xc7, 0x3e, 0xfe, 0x06, 0x6a, 0x99, 0x11, 0x47, 0x35, 0x28, 0x2f, 0xd5, 0x72, 0x13,
	0x2a, 0x19, 0xa1, 0x14, 0x8f, 0xaf, 0x17, 0x46, 0x57, 0xb7, 0x7a, 0xc6, 0xb8, 0x3b, 0x7c, 0xa1,
	0x9b, 0xfc, 0xf1, 0x75, 0x32, 0x80, 0x6d, 0x42, 0xa7, 0xe2, 0x06, 0x71, 0x08, 0x75, 0xd5, 0xcf,
	0xfd, 0xf0, 0xe5, 0xd4, 0x63, 0xb3, 0xf8, 0x82, 0x4f, 0xc6, 0x71, 0x8a, 0xa9, 0x07, 0xf1, 0x67,
	0xe9, 0xf3, 0xf8, 0xe9, 0xf1, 0x94, 0xac, 0xbf, 0xb6, 0x47, 0x37, 0x46, 0xb9, 0x51, 0xe1, 0xa2,
	0x24, 0x38, 0x4f, 0xff, 0x0e, 0x00, 0x00, 0xff, 0xff, 0xe1, 0x0a, 0x7b, 0xf0, 0x9b, 0x0b, 0x00,
	0x00,
}
