// Code generated by protoc-gen-go. DO NOT EDIT.
// source: project_mgmt/config.proto

package project_mgmt

import (
	fmt "fmt"
	proto "github.com/golang/protobuf/proto"
	math "math"
)

// Reference imports to suppress errors if they are not otherwise used.
var _ = proto.Marshal
var _ = fmt.Errorf
var _ = math.Inf

// This is a compile-time assertion to ensure that this generated file
// is compatible with the proto package it is being compiled against.
// A compilation error at this line likely means your copy of the
// proto package needs to be updated.
const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package

type Config struct {
	Programs             *ProgramList `protobuf:"bytes,1,opt,name=programs,proto3" json:"programs,omitempty"`
	XXX_NoUnkeyedLiteral struct{}     `json:"-"`
	XXX_unrecognized     []byte       `json:"-"`
	XXX_sizecache        int32        `json:"-"`
}

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

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

var xxx_messageInfo_Config proto.InternalMessageInfo

func (m *Config) GetPrograms() *ProgramList {
	if m != nil {
		return m.Programs
	}
	return nil
}

func init() {
	proto.RegisterType((*Config)(nil), "project_mgmt.Config")
}

func init() { proto.RegisterFile("project_mgmt/config.proto", fileDescriptor_ebe9f2b2b1776b25) }

var fileDescriptor_ebe9f2b2b1776b25 = []byte{
	// 148 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x92, 0x2c, 0x28, 0xca, 0xcf,
	0x4a, 0x4d, 0x2e, 0x89, 0xcf, 0x4d, 0xcf, 0x2d, 0xd1, 0x4f, 0xce, 0xcf, 0x4b, 0xcb, 0x4c, 0xd7,
	0x2b, 0x28, 0xca, 0x2f, 0xc9, 0x17, 0xe2, 0x41, 0x96, 0x92, 0x92, 0x42, 0x51, 0x58, 0x50, 0x94,
	0x9f, 0x5e, 0x94, 0x98, 0x0b, 0x51, 0xa9, 0x64, 0xcf, 0xc5, 0xe6, 0x0c, 0xd6, 0x29, 0x64, 0xca,
	0xc5, 0x01, 0x95, 0x2a, 0x96, 0x60, 0x54, 0x60, 0xd4, 0xe0, 0x36, 0x92, 0xd4, 0x43, 0xd6, 0xa8,
	0x17, 0x00, 0x91, 0xf5, 0xc9, 0x2c, 0x2e, 0x09, 0x82, 0x2b, 0x75, 0xb2, 0x88, 0x32, 0x4b, 0xcf,
	0xd7, 0x4b, 0xce, 0x28, 0xca, 0xcf, 0xcd, 0x2c, 0xcd, 0xd5, 0xcb, 0x2f, 0x4a, 0xd7, 0x87, 0x71,
	0xf2, 0x8b, 0xf5, 0x33, 0xf3, 0xd2, 0x8a, 0x12, 0xf5, 0xc1, 0x56, 0xe9, 0xa7, 0xe7, 0xeb, 0x23,
	0x9b, 0x97, 0xc4, 0x06, 0x16, 0x36, 0x06, 0x04, 0x00, 0x00, 0xff, 0xff, 0x08, 0xa0, 0x94, 0x22,
	0xc8, 0x00, 0x00, 0x00,
}
