// 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"
	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

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

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

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

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

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

// 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

// 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)

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

var LogLevel_Types_name = common.LogLevel_Types_name
var LogLevel_Types_value = common.LogLevel_Types_value

const LogLevel_DEBUG = LogLevel_Types(common.LogLevel_DEBUG)
const LogLevel_INFO = LogLevel_Types(common.LogLevel_INFO)
const LogLevel_WARNING = LogLevel_Types(common.LogLevel_WARNING)
const LogLevel_ERROR = LogLevel_Types(common.LogLevel_ERROR)
const LogLevel_CRITICAL = LogLevel_Types(common.LogLevel_CRITICAL)
const LogLevel_FATAL = LogLevel_Types(common.LogLevel_FATAL)

// 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)

// 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

// 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)

// 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{14, 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            int64       `protobuf:"varint,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() int64 {
	if m != nil {
		return m.Timestamp
	}
	return 0
}

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 PortCapability struct {
	Port                 *voltha.LogicalPort `protobuf:"bytes,1,opt,name=port,proto3" json:"port,omitempty"`
	XXX_NoUnkeyedLiteral struct{}            `json:"-"`
	XXX_unrecognized     []byte              `json:"-"`
	XXX_sizecache        int32               `json:"-"`
}

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

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

var xxx_messageInfo_PortCapability proto.InternalMessageInfo

func (m *PortCapability) GetPort() *voltha.LogicalPort {
	if m != nil {
		return m.Port
	}
	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{13}
}

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{14}
}

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            int64                         `protobuf:"varint,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{15}
}

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() int64 {
	if m != nil {
		return m.Timestamp
	}
	return 0
}

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{16}
}

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{17}
}

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{18}
}

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{19}
}

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{20}
}

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{21}
}

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