Revert "Reland "Delete duplicate protobuf definitions""

This reverts commit c7dfa5cacd9307c76c7272e4b6e77c3d75666b34.

Reason for revert: Causes chromite-CQ failures, because lib/replication_lib_unittest fails (deleted proto).

Original change's description:
> Reland "Delete duplicate protobuf definitions"
> 
> This is a reland of f1cba419431ffc462990f35bc234c4e9d1e384a5
> 
> Original change's description:
> > Delete duplicate protobuf definitions
> > 
> > These definitions now live in the chromiumos/config repo
> > 
> > BUG=chromium:1054850
> > TEST=./generate.sh
> > 
> > Change-Id: If0db447160e2a2fcbee0824d5394b286d9dcf152
> > Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/infra/proto/+/2076686
> > Tested-by: Prathmesh Prabhu <pprabhu@chromium.org>
> > Auto-Submit: Prathmesh Prabhu <pprabhu@chromium.org>
> > Reviewed-by: David Burger <dburger@chromium.org>
> > Commit-Queue: David Burger <dburger@chromium.org>
> 
> Bug: chromium:1054850
> Change-Id: I1c4aeb2ab41a7cdf2b9a090858af68b0c06de691
> Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/infra/proto/+/2085952
> Reviewed-by: LaMont Jones <lamontjones@chromium.org>
> Commit-Queue: LaMont Jones <lamontjones@chromium.org>
> Tested-by: LaMont Jones <lamontjones@chromium.org>

Bug: chromium:1054850
Change-Id: I5569ba54ed93f525ea90e413a0814929757f578b
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/infra/proto/+/2101704
Reviewed-by: LaMont Jones <lamontjones@chromium.org>
Commit-Queue: LaMont Jones <lamontjones@chromium.org>
Tested-by: LaMont Jones <lamontjones@chromium.org>
diff --git a/go/config/api/component.pb.go b/go/config/api/component.pb.go
new file mode 100644
index 0000000..f979ff2
--- /dev/null
+++ b/go/config/api/component.pb.go
@@ -0,0 +1,746 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: config/api/component.proto
+
+package api
+
+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 Component_Soc_Architecture int32
+
+const (
+	Component_Soc_ARCHITECTURE_UNDEFINED Component_Soc_Architecture = 0
+	Component_Soc_X86                    Component_Soc_Architecture = 1
+	Component_Soc_X86_64                 Component_Soc_Architecture = 2
+	Component_Soc_ARM                    Component_Soc_Architecture = 3
+	Component_Soc_ARM64                  Component_Soc_Architecture = 4
+)
+
+var Component_Soc_Architecture_name = map[int32]string{
+	0: "ARCHITECTURE_UNDEFINED",
+	1: "X86",
+	2: "X86_64",
+	3: "ARM",
+	4: "ARM64",
+}
+
+var Component_Soc_Architecture_value = map[string]int32{
+	"ARCHITECTURE_UNDEFINED": 0,
+	"X86":                    1,
+	"X86_64":                 2,
+	"ARM":                    3,
+	"ARM64":                  4,
+}
+
+func (x Component_Soc_Architecture) String() string {
+	return proto.EnumName(Component_Soc_Architecture_name, int32(x))
+}
+
+func (Component_Soc_Architecture) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_a14fcfee222958ff, []int{0, 0, 0}
+}
+
+type Component_Memory_Type int32
+
+const (
+	Component_Memory_TYPE_UNDEFINED Component_Memory_Type = 0
+	Component_Memory_DDR            Component_Memory_Type = 1
+	Component_Memory_DDR2           Component_Memory_Type = 2
+	Component_Memory_DDR3           Component_Memory_Type = 3
+	Component_Memory_DDR4           Component_Memory_Type = 4
+	Component_Memory_LP_DDR3        Component_Memory_Type = 5
+	Component_Memory_LP_DDR4        Component_Memory_Type = 6
+)
+
+var Component_Memory_Type_name = map[int32]string{
+	0: "TYPE_UNDEFINED",
+	1: "DDR",
+	2: "DDR2",
+	3: "DDR3",
+	4: "DDR4",
+	5: "LP_DDR3",
+	6: "LP_DDR4",
+}
+
+var Component_Memory_Type_value = map[string]int32{
+	"TYPE_UNDEFINED": 0,
+	"DDR":            1,
+	"DDR2":           2,
+	"DDR3":           3,
+	"DDR4":           4,
+	"LP_DDR3":        5,
+	"LP_DDR4":        6,
+}
+
+func (x Component_Memory_Type) String() string {
+	return proto.EnumName(Component_Memory_Type_name, int32(x))
+}
+
+func (Component_Memory_Type) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_a14fcfee222958ff, []int{0, 1, 0}
+}
+
+type Component_Camera_Feature int32
+
+const (
+	Component_Camera_FEATURE_UNKNOWN Component_Camera_Feature = 0
+	Component_Camera_ACTIVITY_LED    Component_Camera_Feature = 1
+)
+
+var Component_Camera_Feature_name = map[int32]string{
+	0: "FEATURE_UNKNOWN",
+	1: "ACTIVITY_LED",
+}
+
+var Component_Camera_Feature_value = map[string]int32{
+	"FEATURE_UNKNOWN": 0,
+	"ACTIVITY_LED":    1,
+}
+
+func (x Component_Camera_Feature) String() string {
+	return proto.EnumName(Component_Camera_Feature_name, int32(x))
+}
+
+func (Component_Camera_Feature) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_a14fcfee222958ff, []int{0, 3, 0}
+}
+
+type Component_Camera_ClockType int32
+
+const (
+	Component_Camera_CLOCK_TYPE_UNDEFINED Component_Camera_ClockType = 0
+	Component_Camera_MONOTONIC            Component_Camera_ClockType = 1
+	Component_Camera_BOOTTIME             Component_Camera_ClockType = 2
+)
+
+var Component_Camera_ClockType_name = map[int32]string{
+	0: "CLOCK_TYPE_UNDEFINED",
+	1: "MONOTONIC",
+	2: "BOOTTIME",
+}
+
+var Component_Camera_ClockType_value = map[string]int32{
+	"CLOCK_TYPE_UNDEFINED": 0,
+	"MONOTONIC":            1,
+	"BOOTTIME":             2,
+}
+
+func (x Component_Camera_ClockType) String() string {
+	return proto.EnumName(Component_Camera_ClockType_name, int32(x))
+}
+
+func (Component_Camera_ClockType) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_a14fcfee222958ff, []int{0, 3, 1}
+}
+
+type Component struct {
+	// Globally unique component identifier.
+	Id *ComponentId `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"`
+	// Types that are valid to be assigned to Type:
+	//	*Component_Soc_
+	//	*Component_Memory_
+	//	*Component_Bluetooth_
+	//	*Component_Camera_
+	//	*Component_Touchscreen_
+	Type                 isComponent_Type `protobuf_oneof:"type"`
+	XXX_NoUnkeyedLiteral struct{}         `json:"-"`
+	XXX_unrecognized     []byte           `json:"-"`
+	XXX_sizecache        int32            `json:"-"`
+}
+
+func (m *Component) Reset()         { *m = Component{} }
+func (m *Component) String() string { return proto.CompactTextString(m) }
+func (*Component) ProtoMessage()    {}
+func (*Component) Descriptor() ([]byte, []int) {
+	return fileDescriptor_a14fcfee222958ff, []int{0}
+}
+
+func (m *Component) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_Component.Unmarshal(m, b)
+}
+func (m *Component) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_Component.Marshal(b, m, deterministic)
+}
+func (m *Component) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_Component.Merge(m, src)
+}
+func (m *Component) XXX_Size() int {
+	return xxx_messageInfo_Component.Size(m)
+}
+func (m *Component) XXX_DiscardUnknown() {
+	xxx_messageInfo_Component.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_Component proto.InternalMessageInfo
+
+func (m *Component) GetId() *ComponentId {
+	if m != nil {
+		return m.Id
+	}
+	return nil
+}
+
+type isComponent_Type interface {
+	isComponent_Type()
+}
+
+type Component_Soc_ struct {
+	Soc *Component_Soc `protobuf:"bytes,2,opt,name=soc,proto3,oneof"`
+}
+
+type Component_Memory_ struct {
+	Memory *Component_Memory `protobuf:"bytes,3,opt,name=memory,proto3,oneof"`
+}
+
+type Component_Bluetooth_ struct {
+	Bluetooth *Component_Bluetooth `protobuf:"bytes,4,opt,name=bluetooth,proto3,oneof"`
+}
+
+type Component_Camera_ struct {
+	Camera *Component_Camera `protobuf:"bytes,5,opt,name=camera,proto3,oneof"`
+}
+
+type Component_Touchscreen_ struct {
+	Touchscreen *Component_Touchscreen `protobuf:"bytes,6,opt,name=touchscreen,proto3,oneof"`
+}
+
+func (*Component_Soc_) isComponent_Type() {}
+
+func (*Component_Memory_) isComponent_Type() {}
+
+func (*Component_Bluetooth_) isComponent_Type() {}
+
+func (*Component_Camera_) isComponent_Type() {}
+
+func (*Component_Touchscreen_) isComponent_Type() {}
+
+func (m *Component) GetType() isComponent_Type {
+	if m != nil {
+		return m.Type
+	}
+	return nil
+}
+
+func (m *Component) GetSoc() *Component_Soc {
+	if x, ok := m.GetType().(*Component_Soc_); ok {
+		return x.Soc
+	}
+	return nil
+}
+
+func (m *Component) GetMemory() *Component_Memory {
+	if x, ok := m.GetType().(*Component_Memory_); ok {
+		return x.Memory
+	}
+	return nil
+}
+
+func (m *Component) GetBluetooth() *Component_Bluetooth {
+	if x, ok := m.GetType().(*Component_Bluetooth_); ok {
+		return x.Bluetooth
+	}
+	return nil
+}
+
+func (m *Component) GetCamera() *Component_Camera {
+	if x, ok := m.GetType().(*Component_Camera_); ok {
+		return x.Camera
+	}
+	return nil
+}
+
+func (m *Component) GetTouchscreen() *Component_Touchscreen {
+	if x, ok := m.GetType().(*Component_Touchscreen_); ok {
+		return x.Touchscreen
+	}
+	return nil
+}
+
+// XXX_OneofWrappers is for the internal use of the proto package.
+func (*Component) XXX_OneofWrappers() []interface{} {
+	return []interface{}{
+		(*Component_Soc_)(nil),
+		(*Component_Memory_)(nil),
+		(*Component_Bluetooth_)(nil),
+		(*Component_Camera_)(nil),
+		(*Component_Touchscreen_)(nil),
+	}
+}
+
+type Component_Soc struct {
+	Family *Component_Soc_Family `protobuf:"bytes,1,opt,name=family,proto3" json:"family,omitempty"`
+	// Unique model name returned from cpu_id instruction
+	Model string `protobuf:"bytes,2,opt,name=model,proto3" json:"model,omitempty"`
+	// Number of cores present on the SoC model
+	Cores                int32    `protobuf:"varint,3,opt,name=cores,proto3" json:"cores,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *Component_Soc) Reset()         { *m = Component_Soc{} }
+func (m *Component_Soc) String() string { return proto.CompactTextString(m) }
+func (*Component_Soc) ProtoMessage()    {}
+func (*Component_Soc) Descriptor() ([]byte, []int) {
+	return fileDescriptor_a14fcfee222958ff, []int{0, 0}
+}
+
+func (m *Component_Soc) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_Component_Soc.Unmarshal(m, b)
+}
+func (m *Component_Soc) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_Component_Soc.Marshal(b, m, deterministic)
+}
+func (m *Component_Soc) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_Component_Soc.Merge(m, src)
+}
+func (m *Component_Soc) XXX_Size() int {
+	return xxx_messageInfo_Component_Soc.Size(m)
+}
+func (m *Component_Soc) XXX_DiscardUnknown() {
+	xxx_messageInfo_Component_Soc.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_Component_Soc proto.InternalMessageInfo
+
+func (m *Component_Soc) GetFamily() *Component_Soc_Family {
+	if m != nil {
+		return m.Family
+	}
+	return nil
+}
+
+func (m *Component_Soc) GetModel() string {
+	if m != nil {
+		return m.Model
+	}
+	return ""
+}
+
+func (m *Component_Soc) GetCores() int32 {
+	if m != nil {
+		return m.Cores
+	}
+	return 0
+}
+
+type Component_Soc_Family struct {
+	Arch Component_Soc_Architecture `protobuf:"varint,1,opt,name=arch,proto3,enum=chromiumos.config.api.Component_Soc_Architecture" json:"arch,omitempty"`
+	// Common name (human friendly) for the family
+	Name                 string   `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *Component_Soc_Family) Reset()         { *m = Component_Soc_Family{} }
+func (m *Component_Soc_Family) String() string { return proto.CompactTextString(m) }
+func (*Component_Soc_Family) ProtoMessage()    {}
+func (*Component_Soc_Family) Descriptor() ([]byte, []int) {
+	return fileDescriptor_a14fcfee222958ff, []int{0, 0, 0}
+}
+
+func (m *Component_Soc_Family) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_Component_Soc_Family.Unmarshal(m, b)
+}
+func (m *Component_Soc_Family) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_Component_Soc_Family.Marshal(b, m, deterministic)
+}
+func (m *Component_Soc_Family) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_Component_Soc_Family.Merge(m, src)
+}
+func (m *Component_Soc_Family) XXX_Size() int {
+	return xxx_messageInfo_Component_Soc_Family.Size(m)
+}
+func (m *Component_Soc_Family) XXX_DiscardUnknown() {
+	xxx_messageInfo_Component_Soc_Family.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_Component_Soc_Family proto.InternalMessageInfo
+
+func (m *Component_Soc_Family) GetArch() Component_Soc_Architecture {
+	if m != nil {
+		return m.Arch
+	}
+	return Component_Soc_ARCHITECTURE_UNDEFINED
+}
+
+func (m *Component_Soc_Family) GetName() string {
+	if m != nil {
+		return m.Name
+	}
+	return ""
+}
+
+type Component_Memory struct {
+	Type                 Component_Memory_Type `protobuf:"varint,1,opt,name=type,proto3,enum=chromiumos.config.api.Component_Memory_Type" json:"type,omitempty"`
+	SpeedMhz             int32                 `protobuf:"varint,2,opt,name=speed_mhz,json=speedMhz,proto3" json:"speed_mhz,omitempty"`
+	SizeMb               int32                 `protobuf:"varint,3,opt,name=size_mb,json=sizeMb,proto3" json:"size_mb,omitempty"`
+	PartNumber           string                `protobuf:"bytes,4,opt,name=part_number,json=partNumber,proto3" json:"part_number,omitempty"`
+	ManufacturerId       *PartnerId            `protobuf:"bytes,5,opt,name=manufacturer_id,json=manufacturerId,proto3" json:"manufacturer_id,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}              `json:"-"`
+	XXX_unrecognized     []byte                `json:"-"`
+	XXX_sizecache        int32                 `json:"-"`
+}
+
+func (m *Component_Memory) Reset()         { *m = Component_Memory{} }
+func (m *Component_Memory) String() string { return proto.CompactTextString(m) }
+func (*Component_Memory) ProtoMessage()    {}
+func (*Component_Memory) Descriptor() ([]byte, []int) {
+	return fileDescriptor_a14fcfee222958ff, []int{0, 1}
+}
+
+func (m *Component_Memory) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_Component_Memory.Unmarshal(m, b)
+}
+func (m *Component_Memory) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_Component_Memory.Marshal(b, m, deterministic)
+}
+func (m *Component_Memory) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_Component_Memory.Merge(m, src)
+}
+func (m *Component_Memory) XXX_Size() int {
+	return xxx_messageInfo_Component_Memory.Size(m)
+}
+func (m *Component_Memory) XXX_DiscardUnknown() {
+	xxx_messageInfo_Component_Memory.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_Component_Memory proto.InternalMessageInfo
+
+func (m *Component_Memory) GetType() Component_Memory_Type {
+	if m != nil {
+		return m.Type
+	}
+	return Component_Memory_TYPE_UNDEFINED
+}
+
+func (m *Component_Memory) GetSpeedMhz() int32 {
+	if m != nil {
+		return m.SpeedMhz
+	}
+	return 0
+}
+
+func (m *Component_Memory) GetSizeMb() int32 {
+	if m != nil {
+		return m.SizeMb
+	}
+	return 0
+}
+
+func (m *Component_Memory) GetPartNumber() string {
+	if m != nil {
+		return m.PartNumber
+	}
+	return ""
+}
+
+func (m *Component_Memory) GetManufacturerId() *PartnerId {
+	if m != nil {
+		return m.ManufacturerId
+	}
+	return nil
+}
+
+type Component_Bluetooth struct {
+	// 4-digit hex
+	VendorId string `protobuf:"bytes,1,opt,name=vendor_id,json=vendorId,proto3" json:"vendor_id,omitempty"`
+	// 4-digit hex
+	ProductId string `protobuf:"bytes,2,opt,name=product_id,json=productId,proto3" json:"product_id,omitempty"`
+	// 4-digit hex
+	BcdDevice            string   `protobuf:"bytes,3,opt,name=bcd_device,json=bcdDevice,proto3" json:"bcd_device,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *Component_Bluetooth) Reset()         { *m = Component_Bluetooth{} }
+func (m *Component_Bluetooth) String() string { return proto.CompactTextString(m) }
+func (*Component_Bluetooth) ProtoMessage()    {}
+func (*Component_Bluetooth) Descriptor() ([]byte, []int) {
+	return fileDescriptor_a14fcfee222958ff, []int{0, 2}
+}
+
+func (m *Component_Bluetooth) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_Component_Bluetooth.Unmarshal(m, b)
+}
+func (m *Component_Bluetooth) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_Component_Bluetooth.Marshal(b, m, deterministic)
+}
+func (m *Component_Bluetooth) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_Component_Bluetooth.Merge(m, src)
+}
+func (m *Component_Bluetooth) XXX_Size() int {
+	return xxx_messageInfo_Component_Bluetooth.Size(m)
+}
+func (m *Component_Bluetooth) XXX_DiscardUnknown() {
+	xxx_messageInfo_Component_Bluetooth.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_Component_Bluetooth proto.InternalMessageInfo
+
+func (m *Component_Bluetooth) GetVendorId() string {
+	if m != nil {
+		return m.VendorId
+	}
+	return ""
+}
+
+func (m *Component_Bluetooth) GetProductId() string {
+	if m != nil {
+		return m.ProductId
+	}
+	return ""
+}
+
+func (m *Component_Bluetooth) GetBcdDevice() string {
+	if m != nil {
+		return m.BcdDevice
+	}
+	return ""
+}
+
+type Component_Camera struct {
+	Features             []Component_Camera_Feature `protobuf:"varint,1,rep,packed,name=features,proto3,enum=chromiumos.config.api.Component_Camera_Feature" json:"features,omitempty"`
+	ClockType            Component_Camera_ClockType `protobuf:"varint,2,opt,name=clock_type,json=clockType,proto3,enum=chromiumos.config.api.Component_Camera_ClockType" json:"clock_type,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}                   `json:"-"`
+	XXX_unrecognized     []byte                     `json:"-"`
+	XXX_sizecache        int32                      `json:"-"`
+}
+
+func (m *Component_Camera) Reset()         { *m = Component_Camera{} }
+func (m *Component_Camera) String() string { return proto.CompactTextString(m) }
+func (*Component_Camera) ProtoMessage()    {}
+func (*Component_Camera) Descriptor() ([]byte, []int) {
+	return fileDescriptor_a14fcfee222958ff, []int{0, 3}
+}
+
+func (m *Component_Camera) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_Component_Camera.Unmarshal(m, b)
+}
+func (m *Component_Camera) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_Component_Camera.Marshal(b, m, deterministic)
+}
+func (m *Component_Camera) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_Component_Camera.Merge(m, src)
+}
+func (m *Component_Camera) XXX_Size() int {
+	return xxx_messageInfo_Component_Camera.Size(m)
+}
+func (m *Component_Camera) XXX_DiscardUnknown() {
+	xxx_messageInfo_Component_Camera.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_Component_Camera proto.InternalMessageInfo
+
+func (m *Component_Camera) GetFeatures() []Component_Camera_Feature {
+	if m != nil {
+		return m.Features
+	}
+	return nil
+}
+
+func (m *Component_Camera) GetClockType() Component_Camera_ClockType {
+	if m != nil {
+		return m.ClockType
+	}
+	return Component_Camera_CLOCK_TYPE_UNDEFINED
+}
+
+type Component_Touchscreen struct {
+	// 4-digit hex
+	VendorId string `protobuf:"bytes,1,opt,name=vendor_id,json=vendorId,proto3" json:"vendor_id,omitempty"`
+	// 4-digit hex
+	ProductId string `protobuf:"bytes,2,opt,name=product_id,json=productId,proto3" json:"product_id,omitempty"`
+	// 4-digit hex
+	FwVersion string `protobuf:"bytes,3,opt,name=fw_version,json=fwVersion,proto3" json:"fw_version,omitempty"`
+	// Relative path to the touch firmware binary
+	// that will be installed when a given
+	// component vendor/product is detected.
+	FwPath               string   `protobuf:"bytes,4,opt,name=fw_path,json=fwPath,proto3" json:"fw_path,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *Component_Touchscreen) Reset()         { *m = Component_Touchscreen{} }
+func (m *Component_Touchscreen) String() string { return proto.CompactTextString(m) }
+func (*Component_Touchscreen) ProtoMessage()    {}
+func (*Component_Touchscreen) Descriptor() ([]byte, []int) {
+	return fileDescriptor_a14fcfee222958ff, []int{0, 4}
+}
+
+func (m *Component_Touchscreen) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_Component_Touchscreen.Unmarshal(m, b)
+}
+func (m *Component_Touchscreen) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_Component_Touchscreen.Marshal(b, m, deterministic)
+}
+func (m *Component_Touchscreen) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_Component_Touchscreen.Merge(m, src)
+}
+func (m *Component_Touchscreen) XXX_Size() int {
+	return xxx_messageInfo_Component_Touchscreen.Size(m)
+}
+func (m *Component_Touchscreen) XXX_DiscardUnknown() {
+	xxx_messageInfo_Component_Touchscreen.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_Component_Touchscreen proto.InternalMessageInfo
+
+func (m *Component_Touchscreen) GetVendorId() string {
+	if m != nil {
+		return m.VendorId
+	}
+	return ""
+}
+
+func (m *Component_Touchscreen) GetProductId() string {
+	if m != nil {
+		return m.ProductId
+	}
+	return ""
+}
+
+func (m *Component_Touchscreen) GetFwVersion() string {
+	if m != nil {
+		return m.FwVersion
+	}
+	return ""
+}
+
+func (m *Component_Touchscreen) GetFwPath() string {
+	if m != nil {
+		return m.FwPath
+	}
+	return ""
+}
+
+type ComponentList struct {
+	Value                []*Component `protobuf:"bytes,1,rep,name=value,proto3" json:"value,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}     `json:"-"`
+	XXX_unrecognized     []byte       `json:"-"`
+	XXX_sizecache        int32        `json:"-"`
+}
+
+func (m *ComponentList) Reset()         { *m = ComponentList{} }
+func (m *ComponentList) String() string { return proto.CompactTextString(m) }
+func (*ComponentList) ProtoMessage()    {}
+func (*ComponentList) Descriptor() ([]byte, []int) {
+	return fileDescriptor_a14fcfee222958ff, []int{1}
+}
+
+func (m *ComponentList) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_ComponentList.Unmarshal(m, b)
+}
+func (m *ComponentList) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_ComponentList.Marshal(b, m, deterministic)
+}
+func (m *ComponentList) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_ComponentList.Merge(m, src)
+}
+func (m *ComponentList) XXX_Size() int {
+	return xxx_messageInfo_ComponentList.Size(m)
+}
+func (m *ComponentList) XXX_DiscardUnknown() {
+	xxx_messageInfo_ComponentList.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_ComponentList proto.InternalMessageInfo
+
+func (m *ComponentList) GetValue() []*Component {
+	if m != nil {
+		return m.Value
+	}
+	return nil
+}
+
+func init() {
+	proto.RegisterEnum("chromiumos.config.api.Component_Soc_Architecture", Component_Soc_Architecture_name, Component_Soc_Architecture_value)
+	proto.RegisterEnum("chromiumos.config.api.Component_Memory_Type", Component_Memory_Type_name, Component_Memory_Type_value)
+	proto.RegisterEnum("chromiumos.config.api.Component_Camera_Feature", Component_Camera_Feature_name, Component_Camera_Feature_value)
+	proto.RegisterEnum("chromiumos.config.api.Component_Camera_ClockType", Component_Camera_ClockType_name, Component_Camera_ClockType_value)
+	proto.RegisterType((*Component)(nil), "chromiumos.config.api.Component")
+	proto.RegisterType((*Component_Soc)(nil), "chromiumos.config.api.Component.Soc")
+	proto.RegisterType((*Component_Soc_Family)(nil), "chromiumos.config.api.Component.Soc.Family")
+	proto.RegisterType((*Component_Memory)(nil), "chromiumos.config.api.Component.Memory")
+	proto.RegisterType((*Component_Bluetooth)(nil), "chromiumos.config.api.Component.Bluetooth")
+	proto.RegisterType((*Component_Camera)(nil), "chromiumos.config.api.Component.Camera")
+	proto.RegisterType((*Component_Touchscreen)(nil), "chromiumos.config.api.Component.Touchscreen")
+	proto.RegisterType((*ComponentList)(nil), "chromiumos.config.api.ComponentList")
+}
+
+func init() { proto.RegisterFile("config/api/component.proto", fileDescriptor_a14fcfee222958ff) }
+
+var fileDescriptor_a14fcfee222958ff = []byte{
+	// 849 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xa4, 0x95, 0xef, 0x6e, 0xdb, 0x36,
+	0x10, 0xc0, 0x2d, 0xd9, 0x56, 0xac, 0x73, 0x9a, 0x0a, 0xb7, 0x6e, 0x33, 0x54, 0x14, 0x0b, 0x8c,
+	0x01, 0x0b, 0xba, 0x42, 0xde, 0xdc, 0xc0, 0xc8, 0xc7, 0xd9, 0xb2, 0x33, 0x6b, 0x89, 0xff, 0x80,
+	0x51, 0xbb, 0x76, 0xfb, 0x20, 0xc8, 0x14, 0x15, 0x0b, 0xb3, 0x44, 0x41, 0x92, 0x13, 0x24, 0xdf,
+	0xf6, 0x20, 0x7b, 0x87, 0xbe, 0xc6, 0xde, 0x6a, 0x10, 0xa5, 0x38, 0x06, 0xda, 0xc0, 0x06, 0xf6,
+	0x8d, 0x3c, 0xde, 0xef, 0xee, 0x78, 0x7f, 0x48, 0xd0, 0x29, 0x8f, 0xfc, 0xe0, 0xba, 0xe3, 0xc6,
+	0x41, 0x87, 0xf2, 0x30, 0xe6, 0x11, 0x8b, 0x32, 0x23, 0x4e, 0x78, 0xc6, 0xf1, 0x6b, 0xba, 0x4c,
+	0x78, 0x18, 0xac, 0x43, 0x9e, 0x1a, 0x85, 0x9a, 0xe1, 0xc6, 0x81, 0xfe, 0xea, 0x4b, 0x88, 0x13,
+	0x78, 0x05, 0xa5, 0xbf, 0xdc, 0x3a, 0x8e, 0xdd, 0x24, 0x8b, 0x58, 0xb2, 0x39, 0x6c, 0x7f, 0x3a,
+	0x04, 0xd5, 0x7c, 0x60, 0xb0, 0x0b, 0x72, 0xe0, 0xb5, 0xa4, 0x63, 0xe9, 0xa4, 0xd9, 0x6d, 0x1b,
+	0x5f, 0xf4, 0x66, 0x6c, 0xb4, 0x2d, 0x8f, 0xc8, 0x81, 0x87, 0x67, 0x50, 0x4d, 0x39, 0x6d, 0xc9,
+	0x02, 0xfa, 0x7e, 0x17, 0x64, 0x5c, 0x71, 0x3a, 0xae, 0x90, 0x1c, 0xc1, 0x3e, 0x28, 0x21, 0x0b,
+	0x79, 0x72, 0xd7, 0xaa, 0x0a, 0xf8, 0x87, 0x9d, 0xf0, 0x44, 0xa8, 0x8f, 0x2b, 0xa4, 0x04, 0xf1,
+	0x37, 0x50, 0x17, 0xab, 0x35, 0xcb, 0x38, 0xcf, 0x96, 0xad, 0x9a, 0xb0, 0xf2, 0x7a, 0xa7, 0x95,
+	0xc1, 0x03, 0x31, 0xae, 0x90, 0x47, 0x3c, 0x0f, 0x87, 0xba, 0x21, 0x4b, 0xdc, 0x56, 0x7d, 0xcf,
+	0x70, 0x4c, 0xa1, 0x9e, 0x87, 0x53, 0x80, 0x38, 0x87, 0x66, 0xc6, 0xd7, 0x74, 0x99, 0xd2, 0x84,
+	0xb1, 0xa8, 0xa5, 0x08, 0x3b, 0x6f, 0x76, 0xda, 0xb1, 0x1f, 0x99, 0x71, 0x85, 0x6c, 0x9b, 0xd0,
+	0x3f, 0xc9, 0x50, 0xbd, 0xe2, 0x14, 0x4d, 0x50, 0x7c, 0x37, 0x0c, 0x56, 0x77, 0x65, 0x75, 0x7e,
+	0xdc, 0x27, 0xd1, 0xc6, 0xb9, 0x40, 0x48, 0x89, 0xe2, 0x0b, 0xa8, 0x87, 0xdc, 0x63, 0x2b, 0x51,
+	0x2c, 0x95, 0x14, 0x9b, 0x5c, 0x4a, 0x79, 0xc2, 0x52, 0x51, 0x85, 0x3a, 0x29, 0x36, 0x3a, 0x05,
+	0xa5, 0xa0, 0x71, 0x04, 0x35, 0x37, 0xa1, 0x4b, 0xe1, 0xf8, 0xa8, 0xfb, 0xf3, 0x5e, 0x8e, 0xfb,
+	0x09, 0x5d, 0x06, 0x19, 0xa3, 0xd9, 0x3a, 0x61, 0x44, 0xe0, 0x88, 0x50, 0x8b, 0xdc, 0x90, 0x95,
+	0xbe, 0xc5, 0xba, 0x7d, 0x05, 0x87, 0xdb, 0x9a, 0xa8, 0xc3, 0x37, 0x7d, 0x62, 0x8e, 0x2d, 0x7b,
+	0x64, 0xda, 0xef, 0xc8, 0xc8, 0x79, 0x37, 0x1d, 0x8e, 0xce, 0xad, 0xe9, 0x68, 0xa8, 0x55, 0xf0,
+	0x00, 0xaa, 0x1f, 0xce, 0x7a, 0x9a, 0x84, 0x00, 0xca, 0x87, 0xb3, 0x9e, 0xd3, 0x3b, 0xd5, 0xe4,
+	0x5c, 0xd8, 0x27, 0x13, 0xad, 0x8a, 0x2a, 0xd4, 0xfb, 0x64, 0xd2, 0x3b, 0xd5, 0x6a, 0xfa, 0xbf,
+	0x32, 0x28, 0x45, 0xa3, 0xe0, 0x2f, 0x50, 0xcb, 0xee, 0x62, 0x56, 0x86, 0xfe, 0x66, 0xcf, 0xfe,
+	0x32, 0xec, 0xbb, 0x98, 0x11, 0x41, 0xe2, 0x4b, 0x50, 0xd3, 0x98, 0x31, 0xcf, 0x09, 0x97, 0xf7,
+	0x22, 0xf4, 0x3a, 0x69, 0x08, 0xc1, 0x64, 0x79, 0x8f, 0xdf, 0xc2, 0x41, 0x1a, 0xdc, 0x33, 0x27,
+	0x5c, 0x94, 0xb9, 0x53, 0xf2, 0xed, 0x64, 0x81, 0xdf, 0x41, 0x33, 0x9f, 0x34, 0x27, 0x5a, 0x87,
+	0x0b, 0x96, 0x88, 0xc6, 0x54, 0x09, 0xe4, 0xa2, 0xa9, 0x90, 0xa0, 0x05, 0xcf, 0x43, 0x37, 0x5a,
+	0xfb, 0xae, 0xb8, 0x77, 0x3e, 0x8f, 0x65, 0xd3, 0x1d, 0x3f, 0x11, 0xe3, 0xbc, 0x18, 0x5c, 0xcb,
+	0x23, 0x47, 0xdb, 0xa0, 0xe5, 0xb5, 0xff, 0x84, 0x5a, 0x1e, 0x2f, 0x22, 0x1c, 0xd9, 0x1f, 0xe7,
+	0x9f, 0xe5, 0x6c, 0x38, 0x24, 0x9a, 0x84, 0x0d, 0xa8, 0x0d, 0x87, 0xa4, 0xab, 0xc9, 0xe5, 0xea,
+	0xad, 0x56, 0x2d, 0x57, 0xa7, 0x5a, 0x0d, 0x9b, 0x70, 0x70, 0x39, 0x77, 0x84, 0xb8, 0xfe, 0xb8,
+	0x39, 0xd5, 0x14, 0xdd, 0x07, 0x75, 0x33, 0x2d, 0x79, 0x2e, 0x6e, 0x58, 0xe4, 0x71, 0x11, 0xae,
+	0x24, 0xee, 0xd4, 0x28, 0x04, 0x96, 0x87, 0xaf, 0x00, 0xe2, 0x84, 0x7b, 0x6b, 0x9a, 0xbf, 0x3c,
+	0x65, 0x91, 0xd5, 0x52, 0x52, 0x1c, 0x2f, 0xa8, 0xe7, 0x78, 0xec, 0x26, 0xa0, 0x4c, 0x64, 0x4b,
+	0x25, 0xea, 0x82, 0x7a, 0x43, 0x21, 0xd0, 0xff, 0x91, 0x41, 0x29, 0xa6, 0x09, 0x2f, 0xa0, 0xe1,
+	0x33, 0x37, 0xbf, 0x5d, 0xda, 0x92, 0x8e, 0xab, 0x27, 0x47, 0xdd, 0xce, 0x9e, 0x83, 0x68, 0x9c,
+	0x17, 0x1c, 0xd9, 0x18, 0xc0, 0x39, 0x00, 0x5d, 0x71, 0xfa, 0x97, 0x23, 0xda, 0x40, 0xde, 0xb3,
+	0x83, 0x4b, 0x73, 0x66, 0x4e, 0x8a, 0x5e, 0x50, 0xe9, 0xc3, 0xb2, 0xfd, 0x13, 0x1c, 0x94, 0x6e,
+	0xf0, 0x2b, 0x78, 0x7e, 0x3e, 0xea, 0x97, 0x8d, 0x7a, 0x31, 0x9d, 0xfd, 0x3e, 0xd5, 0x2a, 0xa8,
+	0xc1, 0x61, 0xdf, 0xb4, 0xad, 0xf7, 0x96, 0xfd, 0xd1, 0xb9, 0x1c, 0x0d, 0x35, 0xa9, 0x3d, 0x00,
+	0x75, 0x63, 0x09, 0x5b, 0xf0, 0xc2, 0xbc, 0x9c, 0x99, 0x17, 0xce, 0x67, 0xb5, 0x7a, 0x06, 0xea,
+	0x64, 0x36, 0x9d, 0xd9, 0xb3, 0xa9, 0x65, 0x6a, 0x12, 0x1e, 0x42, 0x63, 0x30, 0x9b, 0xd9, 0xb6,
+	0x35, 0x19, 0x69, 0xb2, 0xfe, 0xb7, 0x04, 0xcd, 0xad, 0x57, 0xe2, 0xff, 0x96, 0xc2, 0xbf, 0x75,
+	0x6e, 0x58, 0x92, 0x06, 0x3c, 0x7a, 0x28, 0x85, 0x7f, 0xfb, 0xbe, 0x10, 0xe4, 0x4d, 0xed, 0xdf,
+	0x3a, 0xb1, 0x5b, 0x3e, 0xa8, 0x2a, 0x51, 0xfc, 0xdb, 0xb9, 0x9b, 0x2d, 0x07, 0x4a, 0x31, 0x4c,
+	0xed, 0x5f, 0xe1, 0xd9, 0x26, 0x55, 0x97, 0x41, 0x9a, 0x61, 0x0f, 0xea, 0x37, 0xee, 0x6a, 0xcd,
+	0x44, 0xb9, 0x9e, 0x6e, 0xe1, 0x0d, 0x44, 0x0a, 0xf5, 0xc1, 0xeb, 0x3f, 0x4e, 0xae, 0xf9, 0x46,
+	0xd9, 0xe0, 0xc9, 0x75, 0xe7, 0x91, 0xec, 0x94, 0xbf, 0xd6, 0x35, 0xcf, 0x3f, 0xae, 0x85, 0x22,
+	0xbe, 0xab, 0xb7, 0xff, 0x05, 0x00, 0x00, 0xff, 0xff, 0x1b, 0xf6, 0x89, 0x5f, 0x1f, 0x07, 0x00,
+	0x00,
+}
diff --git a/go/config/api/component_id.pb.go b/go/config/api/component_id.pb.go
new file mode 100644
index 0000000..dcfe5d1
--- /dev/null
+++ b/go/config/api/component_id.pb.go
@@ -0,0 +1,80 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: config/api/component_id.proto
+
+package api
+
+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
+
+// Uniquely identifies any component used in manufacturing a device.
+type ComponentId struct {
+	Value                string   `protobuf:"bytes,1,opt,name=value,proto3" json:"value,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *ComponentId) Reset()         { *m = ComponentId{} }
+func (m *ComponentId) String() string { return proto.CompactTextString(m) }
+func (*ComponentId) ProtoMessage()    {}
+func (*ComponentId) Descriptor() ([]byte, []int) {
+	return fileDescriptor_59b34151f3ee8a4b, []int{0}
+}
+
+func (m *ComponentId) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_ComponentId.Unmarshal(m, b)
+}
+func (m *ComponentId) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_ComponentId.Marshal(b, m, deterministic)
+}
+func (m *ComponentId) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_ComponentId.Merge(m, src)
+}
+func (m *ComponentId) XXX_Size() int {
+	return xxx_messageInfo_ComponentId.Size(m)
+}
+func (m *ComponentId) XXX_DiscardUnknown() {
+	xxx_messageInfo_ComponentId.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_ComponentId proto.InternalMessageInfo
+
+func (m *ComponentId) GetValue() string {
+	if m != nil {
+		return m.Value
+	}
+	return ""
+}
+
+func init() {
+	proto.RegisterType((*ComponentId)(nil), "chromiumos.config.api.ComponentId")
+}
+
+func init() { proto.RegisterFile("config/api/component_id.proto", fileDescriptor_59b34151f3ee8a4b) }
+
+var fileDescriptor_59b34151f3ee8a4b = []byte{
+	// 129 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x92, 0x4d, 0xce, 0xcf, 0x4b,
+	0xcb, 0x4c, 0xd7, 0x4f, 0x2c, 0xc8, 0xd4, 0x4f, 0xce, 0xcf, 0x2d, 0xc8, 0xcf, 0x4b, 0xcd, 0x2b,
+	0x89, 0xcf, 0x4c, 0xd1, 0x2b, 0x28, 0xca, 0x2f, 0xc9, 0x17, 0x12, 0x4d, 0xce, 0x28, 0xca, 0xcf,
+	0xcd, 0x2c, 0xcd, 0xcd, 0x2f, 0xd6, 0x83, 0xa8, 0xd4, 0x4b, 0x2c, 0xc8, 0x54, 0x52, 0xe6, 0xe2,
+	0x76, 0x86, 0x29, 0xf6, 0x4c, 0x11, 0x12, 0xe1, 0x62, 0x2d, 0x4b, 0xcc, 0x29, 0x4d, 0x95, 0x60,
+	0x54, 0x60, 0xd4, 0xe0, 0x0c, 0x82, 0x70, 0x9c, 0xb4, 0xa2, 0x34, 0xd2, 0xf3, 0xf5, 0x60, 0x06,
+	0xe8, 0xe5, 0x17, 0xa5, 0xeb, 0x23, 0x4c, 0xd3, 0x87, 0xda, 0x9b, 0x9e, 0x0f, 0xb2, 0x3a, 0x89,
+	0x0d, 0x6c, 0x9d, 0x31, 0x20, 0x00, 0x00, 0xff, 0xff, 0x5a, 0xea, 0xb1, 0xf3, 0x8f, 0x00, 0x00,
+	0x00,
+}
diff --git a/go/config/api/partner.pb.go b/go/config/api/partner.pb.go
new file mode 100644
index 0000000..1d13653
--- /dev/null
+++ b/go/config/api/partner.pb.go
@@ -0,0 +1,145 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: config/api/partner.proto
+
+package api
+
+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
+
+// Defines contributing partners participating in the design, execution,
+// and support of chromiumos projects.
+type Partner struct {
+	// Globally unique partner identifier.
+	Id *PartnerId `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"`
+	// Descriptive name (for humans) of the partner.
+	Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"`
+	// Email alias used for coordinating project execution.
+	EmailGroup           string   `protobuf:"bytes,3,opt,name=email_group,json=emailGroup,proto3" json:"email_group,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *Partner) Reset()         { *m = Partner{} }
+func (m *Partner) String() string { return proto.CompactTextString(m) }
+func (*Partner) ProtoMessage()    {}
+func (*Partner) Descriptor() ([]byte, []int) {
+	return fileDescriptor_19c13223a6343523, []int{0}
+}
+
+func (m *Partner) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_Partner.Unmarshal(m, b)
+}
+func (m *Partner) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_Partner.Marshal(b, m, deterministic)
+}
+func (m *Partner) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_Partner.Merge(m, src)
+}
+func (m *Partner) XXX_Size() int {
+	return xxx_messageInfo_Partner.Size(m)
+}
+func (m *Partner) XXX_DiscardUnknown() {
+	xxx_messageInfo_Partner.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_Partner proto.InternalMessageInfo
+
+func (m *Partner) GetId() *PartnerId {
+	if m != nil {
+		return m.Id
+	}
+	return nil
+}
+
+func (m *Partner) GetName() string {
+	if m != nil {
+		return m.Name
+	}
+	return ""
+}
+
+func (m *Partner) GetEmailGroup() string {
+	if m != nil {
+		return m.EmailGroup
+	}
+	return ""
+}
+
+type PartnerList struct {
+	Value                []*Partner `protobuf:"bytes,1,rep,name=value,proto3" json:"value,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}   `json:"-"`
+	XXX_unrecognized     []byte     `json:"-"`
+	XXX_sizecache        int32      `json:"-"`
+}
+
+func (m *PartnerList) Reset()         { *m = PartnerList{} }
+func (m *PartnerList) String() string { return proto.CompactTextString(m) }
+func (*PartnerList) ProtoMessage()    {}
+func (*PartnerList) Descriptor() ([]byte, []int) {
+	return fileDescriptor_19c13223a6343523, []int{1}
+}
+
+func (m *PartnerList) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_PartnerList.Unmarshal(m, b)
+}
+func (m *PartnerList) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_PartnerList.Marshal(b, m, deterministic)
+}
+func (m *PartnerList) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_PartnerList.Merge(m, src)
+}
+func (m *PartnerList) XXX_Size() int {
+	return xxx_messageInfo_PartnerList.Size(m)
+}
+func (m *PartnerList) XXX_DiscardUnknown() {
+	xxx_messageInfo_PartnerList.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_PartnerList proto.InternalMessageInfo
+
+func (m *PartnerList) GetValue() []*Partner {
+	if m != nil {
+		return m.Value
+	}
+	return nil
+}
+
+func init() {
+	proto.RegisterType((*Partner)(nil), "chromiumos.config.api.Partner")
+	proto.RegisterType((*PartnerList)(nil), "chromiumos.config.api.PartnerList")
+}
+
+func init() { proto.RegisterFile("config/api/partner.proto", fileDescriptor_19c13223a6343523) }
+
+var fileDescriptor_19c13223a6343523 = []byte{
+	// 213 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x92, 0x48, 0xce, 0xcf, 0x4b,
+	0xcb, 0x4c, 0xd7, 0x4f, 0x2c, 0xc8, 0xd4, 0x2f, 0x48, 0x2c, 0x2a, 0xc9, 0x4b, 0x2d, 0xd2, 0x2b,
+	0x28, 0xca, 0x2f, 0xc9, 0x17, 0x12, 0x4d, 0xce, 0x28, 0xca, 0xcf, 0xcd, 0x2c, 0xcd, 0xcd, 0x2f,
+	0xd6, 0x83, 0x28, 0xd2, 0x4b, 0x2c, 0xc8, 0x94, 0x92, 0xc6, 0xd4, 0x10, 0x9f, 0x99, 0x02, 0xd1,
+	0xa3, 0x54, 0xc0, 0xc5, 0x1e, 0x00, 0x11, 0x13, 0x32, 0xe0, 0x62, 0xca, 0x4c, 0x91, 0x60, 0x54,
+	0x60, 0xd4, 0xe0, 0x36, 0x52, 0xd0, 0xc3, 0x6a, 0x96, 0x1e, 0x54, 0xad, 0x67, 0x4a, 0x10, 0x53,
+	0x66, 0x8a, 0x90, 0x10, 0x17, 0x4b, 0x5e, 0x62, 0x6e, 0xaa, 0x04, 0x93, 0x02, 0xa3, 0x06, 0x67,
+	0x10, 0x98, 0x2d, 0x24, 0xcf, 0xc5, 0x9d, 0x9a, 0x9b, 0x98, 0x99, 0x13, 0x9f, 0x5e, 0x94, 0x5f,
+	0x5a, 0x20, 0xc1, 0x0c, 0x96, 0xe2, 0x02, 0x0b, 0xb9, 0x83, 0x44, 0x94, 0x9c, 0xb9, 0xb8, 0xa1,
+	0xa6, 0xf8, 0x64, 0x16, 0x97, 0x08, 0x99, 0x70, 0xb1, 0x96, 0x25, 0xe6, 0x94, 0xa6, 0x4a, 0x30,
+	0x2a, 0x30, 0x6b, 0x70, 0x1b, 0xc9, 0xe1, 0xb7, 0x38, 0x08, 0xa2, 0xd8, 0x49, 0x2b, 0x4a, 0x23,
+	0x3d, 0x1f, 0xae, 0x54, 0x2f, 0xbf, 0x28, 0x5d, 0x1f, 0xa1, 0x4f, 0x1f, 0xea, 0xe1, 0xf4, 0x7c,
+	0x90, 0x9f, 0x93, 0xd8, 0xc0, 0x3e, 0x35, 0x06, 0x04, 0x00, 0x00, 0xff, 0xff, 0xe1, 0xd6, 0x17,
+	0xde, 0x39, 0x01, 0x00, 0x00,
+}
diff --git a/go/config/api/partner_id.pb.go b/go/config/api/partner_id.pb.go
new file mode 100644
index 0000000..fb99b28
--- /dev/null
+++ b/go/config/api/partner_id.pb.go
@@ -0,0 +1,81 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: config/api/partner_id.proto
+
+package api
+
+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
+
+// Uniquely identifies any contributing partner to any of the chromiumos
+// projects.
+// E.g. ODMs, OEMs, SoC & Component Manufacturers, ...
+type PartnerId struct {
+	Value                string   `protobuf:"bytes,1,opt,name=value,proto3" json:"value,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *PartnerId) Reset()         { *m = PartnerId{} }
+func (m *PartnerId) String() string { return proto.CompactTextString(m) }
+func (*PartnerId) ProtoMessage()    {}
+func (*PartnerId) Descriptor() ([]byte, []int) {
+	return fileDescriptor_af3fa75030159ae9, []int{0}
+}
+
+func (m *PartnerId) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_PartnerId.Unmarshal(m, b)
+}
+func (m *PartnerId) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_PartnerId.Marshal(b, m, deterministic)
+}
+func (m *PartnerId) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_PartnerId.Merge(m, src)
+}
+func (m *PartnerId) XXX_Size() int {
+	return xxx_messageInfo_PartnerId.Size(m)
+}
+func (m *PartnerId) XXX_DiscardUnknown() {
+	xxx_messageInfo_PartnerId.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_PartnerId proto.InternalMessageInfo
+
+func (m *PartnerId) GetValue() string {
+	if m != nil {
+		return m.Value
+	}
+	return ""
+}
+
+func init() {
+	proto.RegisterType((*PartnerId)(nil), "chromiumos.config.api.PartnerId")
+}
+
+func init() { proto.RegisterFile("config/api/partner_id.proto", fileDescriptor_af3fa75030159ae9) }
+
+var fileDescriptor_af3fa75030159ae9 = []byte{
+	// 127 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x92, 0x4e, 0xce, 0xcf, 0x4b,
+	0xcb, 0x4c, 0xd7, 0x4f, 0x2c, 0xc8, 0xd4, 0x2f, 0x48, 0x2c, 0x2a, 0xc9, 0x4b, 0x2d, 0x8a, 0xcf,
+	0x4c, 0xd1, 0x2b, 0x28, 0xca, 0x2f, 0xc9, 0x17, 0x12, 0x4d, 0xce, 0x28, 0xca, 0xcf, 0xcd, 0x2c,
+	0xcd, 0xcd, 0x2f, 0xd6, 0x83, 0xa8, 0xd3, 0x4b, 0x2c, 0xc8, 0x54, 0x52, 0xe4, 0xe2, 0x0c, 0x80,
+	0x28, 0xf5, 0x4c, 0x11, 0x12, 0xe1, 0x62, 0x2d, 0x4b, 0xcc, 0x29, 0x4d, 0x95, 0x60, 0x54, 0x60,
+	0xd4, 0xe0, 0x0c, 0x82, 0x70, 0x9c, 0xb4, 0xa2, 0x34, 0xd2, 0xf3, 0xf5, 0x60, 0xda, 0xf5, 0xf2,
+	0x8b, 0xd2, 0xf5, 0x11, 0x66, 0xe9, 0x43, 0xed, 0x4c, 0xcf, 0x07, 0x59, 0x9b, 0xc4, 0x06, 0xb6,
+	0xcc, 0x18, 0x10, 0x00, 0x00, 0xff, 0xff, 0x93, 0x74, 0xb9, 0x6b, 0x8b, 0x00, 0x00, 0x00,
+}
diff --git a/go/config/replication_config.pb.go b/go/config/replication_config.pb.go
new file mode 100644
index 0000000..43839b0
--- /dev/null
+++ b/go/config/replication_config.pb.go
@@ -0,0 +1,329 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: config/replication_config.proto
+
+package config
+
+import (
+	fmt "fmt"
+	proto "github.com/golang/protobuf/proto"
+	field_mask "google.golang.org/genproto/protobuf/field_mask"
+	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
+
+// Describes different file types that can be replicated.
+type FileType int32
+
+const (
+	FileType_FILE_TYPE_UNSPECIFIED FileType = 0
+	// A JSON file. For protos encoded as JSON, FILE_TYPE_JSONPB should be used.
+	FileType_FILE_TYPE_JSON FileType = 1
+	// A proto encoded as a JSON file.
+	FileType_FILE_TYPE_JSONPB FileType = 2
+	// A file not described by the other types.
+	FileType_FILE_TYPE_OTHER FileType = 3
+)
+
+var FileType_name = map[int32]string{
+	0: "FILE_TYPE_UNSPECIFIED",
+	1: "FILE_TYPE_JSON",
+	2: "FILE_TYPE_JSONPB",
+	3: "FILE_TYPE_OTHER",
+}
+
+var FileType_value = map[string]int32{
+	"FILE_TYPE_UNSPECIFIED": 0,
+	"FILE_TYPE_JSON":        1,
+	"FILE_TYPE_JSONPB":      2,
+	"FILE_TYPE_OTHER":       3,
+}
+
+func (x FileType) String() string {
+	return proto.EnumName(FileType_name, int32(x))
+}
+
+func (FileType) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_f9326e1353140a5f, []int{0}
+}
+
+type ReplicationType int32
+
+const (
+	ReplicationType_REPLICATION_TYPE_UNSPECIFIED ReplicationType = 0
+	// Copy the entire file.
+	ReplicationType_REPLICATION_TYPE_COPY ReplicationType = 1
+	// Copy part of the file. When this type is used, a filtering mechanism must
+	// be specified, e.g. a FieldMask. Not valid for some FileTypes, e.g.
+	// FILE_TYPE_OTHER.
+	ReplicationType_REPLICATION_TYPE_FILTER ReplicationType = 2
+)
+
+var ReplicationType_name = map[int32]string{
+	0: "REPLICATION_TYPE_UNSPECIFIED",
+	1: "REPLICATION_TYPE_COPY",
+	2: "REPLICATION_TYPE_FILTER",
+}
+
+var ReplicationType_value = map[string]int32{
+	"REPLICATION_TYPE_UNSPECIFIED": 0,
+	"REPLICATION_TYPE_COPY":        1,
+	"REPLICATION_TYPE_FILTER":      2,
+}
+
+func (x ReplicationType) String() string {
+	return proto.EnumName(ReplicationType_name, int32(x))
+}
+
+func (ReplicationType) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_f9326e1353140a5f, []int{1}
+}
+
+// Describes how to replace a text with another text.
+type StringReplacementRule struct {
+	// The text before the transformation.
+	Before string `protobuf:"bytes,1,opt,name=before,proto3" json:"before,omitempty"`
+	// The text after the transformation.
+	After                string   `protobuf:"bytes,2,opt,name=after,proto3" json:"after,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *StringReplacementRule) Reset()         { *m = StringReplacementRule{} }
+func (m *StringReplacementRule) String() string { return proto.CompactTextString(m) }
+func (*StringReplacementRule) ProtoMessage()    {}
+func (*StringReplacementRule) Descriptor() ([]byte, []int) {
+	return fileDescriptor_f9326e1353140a5f, []int{0}
+}
+
+func (m *StringReplacementRule) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_StringReplacementRule.Unmarshal(m, b)
+}
+func (m *StringReplacementRule) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_StringReplacementRule.Marshal(b, m, deterministic)
+}
+func (m *StringReplacementRule) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_StringReplacementRule.Merge(m, src)
+}
+func (m *StringReplacementRule) XXX_Size() int {
+	return xxx_messageInfo_StringReplacementRule.Size(m)
+}
+func (m *StringReplacementRule) XXX_DiscardUnknown() {
+	xxx_messageInfo_StringReplacementRule.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_StringReplacementRule proto.InternalMessageInfo
+
+func (m *StringReplacementRule) GetBefore() string {
+	if m != nil {
+		return m.Before
+	}
+	return ""
+}
+
+func (m *StringReplacementRule) GetAfter() string {
+	if m != nil {
+		return m.After
+	}
+	return ""
+}
+
+// Describes how a single file should be replicated.
+type FileReplicationRule struct {
+	// Path to the original file. Should be relative to the source root,
+	// e.g. "src/private-overlays/overlay-coral-private/chromeos-base/chromeos-config-bsp-coral-private/files/build_config.json"
+	SourcePath string `protobuf:"bytes,1,opt,name=source_path,json=sourcePath,proto3" json:"source_path,omitempty"`
+	// Path to output the file. Should be relative to the source root,
+	// e.g. "src/overlays/overlay-coral/chromeos-base/chromeos-config-bsp-coral/files/build_config.json"
+	DestinationPath string `protobuf:"bytes,2,opt,name=destination_path,json=destinationPath,proto3" json:"destination_path,omitempty"`
+	// The type of file being replicated.
+	FileType FileType `protobuf:"varint,3,opt,name=file_type,json=fileType,proto3,enum=config.FileType" json:"file_type,omitempty"`
+	// The type of replication being done.
+	ReplicationType ReplicationType `protobuf:"varint,4,opt,name=replication_type,json=replicationType,proto3,enum=config.ReplicationType" json:"replication_type,omitempty"`
+	// Fields to replicate to destination config payloads. Only relevant for
+	// REPLICATION_TYPE_FILTER. If set on other replication types a
+	// reader of this rule may choose to ignore this field or throw an error.
+	//
+	// # Behavior Specific to ChromeOS Config Payloads
+	//
+	// The mask applies to each device config in the config payload, NOT to the
+	// top-level payload; i.e. to copy the "audio" field to the destination,
+	// the mask should be "audio", not "chromeos.configs.audio". This is
+	// analogous to standard FieldMask behavior on a REST list operation, where
+	// the mask applies to each individual message. Sub-fields are still
+	// fully-qualified, as per standard FieldMasks, e.g.
+	// "bluetooth.config.build-path"
+	DestinationFields *field_mask.FieldMask `protobuf:"bytes,5,opt,name=destination_fields,json=destinationFields,proto3" json:"destination_fields,omitempty"`
+	// String replacements to be done on the destination file. Replacements are
+	// done in the order they appear in this list.
+	//
+	// Note that replacements are done after filtering. For example, say a
+	// replacement rule changes the name of a field, "field1" -> "field2"; if
+	// destination_fields specifies "field2", the renamed fields will not be
+	// copied.
+	StringReplacementRules []*StringReplacementRule `protobuf:"bytes,6,rep,name=string_replacement_rules,json=stringReplacementRules,proto3" json:"string_replacement_rules,omitempty"`
+	XXX_NoUnkeyedLiteral   struct{}                 `json:"-"`
+	XXX_unrecognized       []byte                   `json:"-"`
+	XXX_sizecache          int32                    `json:"-"`
+}
+
+func (m *FileReplicationRule) Reset()         { *m = FileReplicationRule{} }
+func (m *FileReplicationRule) String() string { return proto.CompactTextString(m) }
+func (*FileReplicationRule) ProtoMessage()    {}
+func (*FileReplicationRule) Descriptor() ([]byte, []int) {
+	return fileDescriptor_f9326e1353140a5f, []int{1}
+}
+
+func (m *FileReplicationRule) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_FileReplicationRule.Unmarshal(m, b)
+}
+func (m *FileReplicationRule) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_FileReplicationRule.Marshal(b, m, deterministic)
+}
+func (m *FileReplicationRule) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_FileReplicationRule.Merge(m, src)
+}
+func (m *FileReplicationRule) XXX_Size() int {
+	return xxx_messageInfo_FileReplicationRule.Size(m)
+}
+func (m *FileReplicationRule) XXX_DiscardUnknown() {
+	xxx_messageInfo_FileReplicationRule.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_FileReplicationRule proto.InternalMessageInfo
+
+func (m *FileReplicationRule) GetSourcePath() string {
+	if m != nil {
+		return m.SourcePath
+	}
+	return ""
+}
+
+func (m *FileReplicationRule) GetDestinationPath() string {
+	if m != nil {
+		return m.DestinationPath
+	}
+	return ""
+}
+
+func (m *FileReplicationRule) GetFileType() FileType {
+	if m != nil {
+		return m.FileType
+	}
+	return FileType_FILE_TYPE_UNSPECIFIED
+}
+
+func (m *FileReplicationRule) GetReplicationType() ReplicationType {
+	if m != nil {
+		return m.ReplicationType
+	}
+	return ReplicationType_REPLICATION_TYPE_UNSPECIFIED
+}
+
+func (m *FileReplicationRule) GetDestinationFields() *field_mask.FieldMask {
+	if m != nil {
+		return m.DestinationFields
+	}
+	return nil
+}
+
+func (m *FileReplicationRule) GetStringReplacementRules() []*StringReplacementRule {
+	if m != nil {
+		return m.StringReplacementRules
+	}
+	return nil
+}
+
+// Describes how files should be replicated, e.g. from private to public.
+type ReplicationConfig struct {
+	// Files to be replicated.
+	FileReplicationRules []*FileReplicationRule `protobuf:"bytes,1,rep,name=file_replication_rules,json=fileReplicationRules,proto3" json:"file_replication_rules,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}               `json:"-"`
+	XXX_unrecognized     []byte                 `json:"-"`
+	XXX_sizecache        int32                  `json:"-"`
+}
+
+func (m *ReplicationConfig) Reset()         { *m = ReplicationConfig{} }
+func (m *ReplicationConfig) String() string { return proto.CompactTextString(m) }
+func (*ReplicationConfig) ProtoMessage()    {}
+func (*ReplicationConfig) Descriptor() ([]byte, []int) {
+	return fileDescriptor_f9326e1353140a5f, []int{2}
+}
+
+func (m *ReplicationConfig) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_ReplicationConfig.Unmarshal(m, b)
+}
+func (m *ReplicationConfig) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_ReplicationConfig.Marshal(b, m, deterministic)
+}
+func (m *ReplicationConfig) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_ReplicationConfig.Merge(m, src)
+}
+func (m *ReplicationConfig) XXX_Size() int {
+	return xxx_messageInfo_ReplicationConfig.Size(m)
+}
+func (m *ReplicationConfig) XXX_DiscardUnknown() {
+	xxx_messageInfo_ReplicationConfig.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_ReplicationConfig proto.InternalMessageInfo
+
+func (m *ReplicationConfig) GetFileReplicationRules() []*FileReplicationRule {
+	if m != nil {
+		return m.FileReplicationRules
+	}
+	return nil
+}
+
+func init() {
+	proto.RegisterEnum("config.FileType", FileType_name, FileType_value)
+	proto.RegisterEnum("config.ReplicationType", ReplicationType_name, ReplicationType_value)
+	proto.RegisterType((*StringReplacementRule)(nil), "config.StringReplacementRule")
+	proto.RegisterType((*FileReplicationRule)(nil), "config.FileReplicationRule")
+	proto.RegisterType((*ReplicationConfig)(nil), "config.ReplicationConfig")
+}
+
+func init() { proto.RegisterFile("config/replication_config.proto", fileDescriptor_f9326e1353140a5f) }
+
+var fileDescriptor_f9326e1353140a5f = []byte{
+	// 455 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x6c, 0x91, 0x5f, 0x6f, 0xda, 0x3c,
+	0x14, 0xc6, 0xdf, 0xc0, 0x5b, 0xd4, 0x1e, 0xa4, 0xe2, 0xba, 0x40, 0xd3, 0x76, 0x53, 0x23, 0xae,
+	0x58, 0xa5, 0x05, 0x89, 0x7d, 0x82, 0x95, 0x25, 0x5a, 0x26, 0x06, 0x99, 0xc9, 0x34, 0xf5, 0x2a,
+	0x0a, 0x70, 0x4c, 0x23, 0xd2, 0x24, 0xb2, 0xcd, 0x45, 0xbf, 0xf9, 0x2e, 0xa7, 0xda, 0x20, 0xd2,
+	0xc2, 0x9d, 0xfd, 0x3b, 0xe7, 0x39, 0x7f, 0x9e, 0x03, 0x77, 0x8b, 0x22, 0xe7, 0xe9, 0x6a, 0x20,
+	0xb0, 0xcc, 0xd2, 0x45, 0xa2, 0xd2, 0x22, 0x8f, 0x0d, 0x72, 0x4b, 0x51, 0xa8, 0x82, 0x36, 0xcc,
+	0xef, 0xc6, 0x59, 0x15, 0xc5, 0x2a, 0xc3, 0x81, 0xa6, 0xf3, 0x0d, 0x1f, 0xf0, 0x14, 0xb3, 0x65,
+	0xfc, 0x9c, 0xc8, 0xb5, 0xc9, 0xec, 0x79, 0xd0, 0x99, 0x29, 0x91, 0xe6, 0x2b, 0x86, 0x65, 0x96,
+	0x2c, 0xf0, 0x19, 0x73, 0xc5, 0x36, 0x19, 0xd2, 0x2e, 0x34, 0xe6, 0xc8, 0x0b, 0x81, 0xb6, 0xe5,
+	0x58, 0xfd, 0x33, 0xb6, 0xfd, 0xd1, 0x36, 0x9c, 0x24, 0x5c, 0xa1, 0xb0, 0x6b, 0x1a, 0x9b, 0x4f,
+	0xef, 0x6f, 0x0d, 0x2e, 0xfd, 0x34, 0x43, 0xb6, 0x9f, 0x48, 0x57, 0xb9, 0x83, 0xa6, 0x2c, 0x36,
+	0x62, 0x81, 0x71, 0x99, 0xa8, 0xa7, 0x6d, 0x29, 0x30, 0x28, 0x4c, 0xd4, 0x13, 0xfd, 0x04, 0x64,
+	0x89, 0x52, 0xa5, 0xb9, 0xd9, 0x42, 0x67, 0x99, 0xca, 0xad, 0x0a, 0xd7, 0xa9, 0x9f, 0xe1, 0x8c,
+	0xa7, 0x19, 0xc6, 0xea, 0xa5, 0x44, 0xbb, 0xee, 0x58, 0xfd, 0xf3, 0x21, 0x71, 0xb7, 0x6b, 0xbf,
+	0xf6, 0x8e, 0x5e, 0x4a, 0x64, 0xa7, 0x7c, 0xfb, 0xa2, 0x0f, 0x40, 0xaa, 0xfe, 0x68, 0xd5, 0xff,
+	0x5a, 0x75, 0xb5, 0x53, 0x55, 0xa6, 0xd5, 0xe2, 0x96, 0x78, 0x0b, 0x68, 0x00, 0xb4, 0x3a, 0x9d,
+	0x76, 0x4f, 0xda, 0x27, 0x8e, 0xd5, 0x6f, 0x0e, 0x6f, 0x5c, 0x63, 0xae, 0xbb, 0x33, 0xd7, 0xf5,
+	0x5f, 0xc3, 0x3f, 0x13, 0xb9, 0x66, 0x17, 0x15, 0x95, 0xa6, 0x92, 0xfe, 0x01, 0x5b, 0x6a, 0xa3,
+	0x63, 0xb1, 0x77, 0x3a, 0x16, 0x9b, 0x0c, 0xa5, 0xdd, 0x70, 0xea, 0xfd, 0xe6, 0xf0, 0xe3, 0x6e,
+	0xac, 0xa3, 0x07, 0x61, 0x5d, 0x79, 0x0c, 0xcb, 0x1e, 0x87, 0x8b, 0xca, 0x1e, 0x23, 0x5d, 0x82,
+	0xfe, 0x82, 0xae, 0xf6, 0xaa, 0xea, 0x80, 0xe9, 0x65, 0xe9, 0x5e, 0xb7, 0x55, 0xe3, 0xde, 0x1d,
+	0x8d, 0xb5, 0xf9, 0x21, 0x94, 0xf7, 0x4b, 0x38, 0xdd, 0xb9, 0x4c, 0xaf, 0xa1, 0xe3, 0x07, 0x63,
+	0x2f, 0x8e, 0x1e, 0x43, 0x2f, 0xfe, 0x3d, 0x99, 0x85, 0xde, 0x28, 0xf0, 0x03, 0xef, 0x1b, 0xf9,
+	0x8f, 0x52, 0x38, 0xdf, 0x87, 0x7e, 0xcc, 0xa6, 0x13, 0x62, 0xd1, 0x36, 0x90, 0xb7, 0x2c, 0x7c,
+	0x20, 0x35, 0x7a, 0x09, 0xad, 0x3d, 0x9d, 0x46, 0xdf, 0x3d, 0x46, 0xea, 0xf7, 0x6b, 0x68, 0xbd,
+	0xbb, 0x0a, 0x75, 0xe0, 0x03, 0xf3, 0xc2, 0x71, 0x30, 0xfa, 0x1a, 0x05, 0xd3, 0xc9, 0xb1, 0x9e,
+	0xd7, 0xd0, 0x39, 0xc8, 0x18, 0x4d, 0xc3, 0x47, 0x62, 0xd1, 0x5b, 0xb8, 0x3a, 0x08, 0xf9, 0xc1,
+	0x38, 0xf2, 0x18, 0xa9, 0xcd, 0x1b, 0xfa, 0x74, 0x5f, 0xfe, 0x05, 0x00, 0x00, 0xff, 0xff, 0x0e,
+	0xb7, 0xb1, 0x2d, 0x50, 0x03, 0x00, 0x00,
+}
diff --git a/src/config/api/component.proto b/src/config/api/component.proto
new file mode 100644
index 0000000..2d19ab7
--- /dev/null
+++ b/src/config/api/component.proto
@@ -0,0 +1,106 @@
+// Copyright 2020 The Chromium OS Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+syntax = "proto3";
+
+package chromiumos.config.api;
+
+import "config/api/component_id.proto";
+import "config/api/partner_id.proto";
+
+option go_package = "go.chromium.org/chromiumos/config/go/api";
+
+message Component {
+  // Globally unique component identifier.
+  ComponentId id = 1;
+
+  oneof type {
+    Soc soc = 2;
+    Memory memory = 3;
+    Bluetooth bluetooth = 4;
+    Camera camera = 5;
+    Touchscreen touchscreen = 6;
+  }
+
+  message Soc {
+    enum Architecture {
+      ARCHITECTURE_UNDEFINED = 0;
+      X86 = 1;
+      X86_64 = 2;
+      ARM = 3;
+      ARM64 = 4;
+    }
+
+    message Family {
+      Architecture arch = 1;
+      // Common name (human friendly) for the family
+      string name = 2;
+    }
+
+    Family family = 1;
+    // Unique model name returned from cpu_id instruction
+    string model = 2;
+    // Number of cores present on the SoC model
+    int32 cores = 3;
+  }
+
+  message Memory {
+    enum Type {
+      TYPE_UNDEFINED = 0;
+      DDR = 1;
+      DDR2 = 2;
+      DDR3 = 3;
+      DDR4 = 4;
+      LP_DDR3 = 5;
+      LP_DDR4 = 6;
+    }
+
+    Type type = 1;
+    int32 speed_mhz = 2;
+    int32 size_mb = 3;
+    string part_number = 4;
+    PartnerId manufacturer_id = 5;
+  }
+
+  message Bluetooth {
+    // 4-digit hex
+    string vendor_id = 1;
+    // 4-digit hex
+    string product_id = 2;
+    // 4-digit hex
+    string bcd_device = 3;
+  }
+
+  message Camera {
+    enum Feature {
+      FEATURE_UNKNOWN = 0;
+      ACTIVITY_LED = 1;
+    }
+    enum ClockType {
+      CLOCK_TYPE_UNDEFINED = 0;
+      MONOTONIC = 1;
+      BOOTTIME = 2;
+    }
+
+    repeated Feature features = 1;
+    ClockType clock_type = 2;
+  }
+
+  message Touchscreen {
+    // 4-digit hex
+    string vendor_id = 1;
+    // 4-digit hex
+    string product_id = 2;
+    // 4-digit hex
+    string fw_version = 3;
+    // Relative path to the touch firmware binary
+    // that will be installed when a given
+    // component vendor/product is detected.
+    string fw_path = 4;
+  }
+}
+
+message ComponentList {
+  repeated Component value = 1;
+}
diff --git a/src/config/api/component_id.proto b/src/config/api/component_id.proto
new file mode 100644
index 0000000..ee77bd9
--- /dev/null
+++ b/src/config/api/component_id.proto
@@ -0,0 +1,14 @@
+// Copyright 2020 The Chromium OS Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+syntax = "proto3";
+
+package chromiumos.config.api;
+
+option go_package = "go.chromium.org/chromiumos/config/go/api";
+
+// Uniquely identifies any component used in manufacturing a device.
+message ComponentId {
+  string value = 1;
+}
diff --git a/src/config/api/partner.proto b/src/config/api/partner.proto
new file mode 100644
index 0000000..4ea6912
--- /dev/null
+++ b/src/config/api/partner.proto
@@ -0,0 +1,26 @@
+// Copyright 2020 The Chromium OS Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+syntax = "proto3";
+
+package chromiumos.config.api;
+
+import "config/api/partner_id.proto";
+
+option go_package = "go.chromium.org/chromiumos/config/go/api";
+
+// Defines contributing partners participating in the design, execution,
+// and support of chromiumos projects.
+message Partner {
+  // Globally unique partner identifier.
+  PartnerId id = 1;
+  // Descriptive name (for humans) of the partner.
+  string name = 2;
+  // Email alias used for coordinating project execution.
+  string email_group = 3;
+}
+
+message PartnerList {
+  repeated Partner value = 1;
+}
diff --git a/src/config/api/partner_id.proto b/src/config/api/partner_id.proto
new file mode 100644
index 0000000..39d6fe1
--- /dev/null
+++ b/src/config/api/partner_id.proto
@@ -0,0 +1,16 @@
+// Copyright 2020 The Chromium OS Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+syntax = "proto3";
+
+package chromiumos.config.api;
+
+option go_package = "go.chromium.org/chromiumos/config/go/api";
+
+// Uniquely identifies any contributing partner to any of the chromiumos
+// projects.
+// E.g. ODMs, OEMs, SoC & Component Manufacturers, ...
+message PartnerId {
+  string value = 1;
+}
diff --git a/src/config/replication_config.proto b/src/config/replication_config.proto
new file mode 100644
index 0000000..12d34b5
--- /dev/null
+++ b/src/config/replication_config.proto
@@ -0,0 +1,91 @@
+// Copyright 2019 The Chromium OS Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+syntax = "proto3";
+
+package config;
+
+import "google/protobuf/field_mask.proto";
+
+// Describes different file types that can be replicated.
+enum FileType {
+    FILE_TYPE_UNSPECIFIED = 0;
+
+    // A JSON file. For protos encoded as JSON, FILE_TYPE_JSONPB should be used.
+    FILE_TYPE_JSON = 1;
+
+    // A proto encoded as a JSON file.
+    FILE_TYPE_JSONPB = 2;
+
+    // A file not described by the other types.
+    FILE_TYPE_OTHER = 3;
+}
+
+enum ReplicationType {
+    REPLICATION_TYPE_UNSPECIFIED = 0;
+
+    // Copy the entire file.
+    REPLICATION_TYPE_COPY = 1;
+
+    // Copy part of the file. When this type is used, a filtering mechanism must
+    // be specified, e.g. a FieldMask. Not valid for some FileTypes, e.g.
+    // FILE_TYPE_OTHER.
+    REPLICATION_TYPE_FILTER = 2;
+}
+
+// Describes how to replace a text with another text.
+message StringReplacementRule {
+    // The text before the transformation.
+    string before = 1;
+
+    // The text after the transformation.
+    string after = 2;
+}
+
+// Describes how a single file should be replicated.
+message FileReplicationRule {
+    // Path to the original file. Should be relative to the source root,
+    // e.g. "src/private-overlays/overlay-coral-private/chromeos-base/chromeos-config-bsp-coral-private/files/build_config.json"
+    string source_path = 1;
+
+    // Path to output the file. Should be relative to the source root,
+    // e.g. "src/overlays/overlay-coral/chromeos-base/chromeos-config-bsp-coral/files/build_config.json"
+    string destination_path = 2;
+
+    // The type of file being replicated.
+    FileType file_type = 3;
+
+    // The type of replication being done.
+    ReplicationType replication_type = 4;
+
+    // Fields to replicate to destination config payloads. Only relevant for
+    // REPLICATION_TYPE_FILTER. If set on other replication types a
+    // reader of this rule may choose to ignore this field or throw an error.
+    //
+    // # Behavior Specific to ChromeOS Config Payloads
+    //
+    // The mask applies to each device config in the config payload, NOT to the
+    // top-level payload; i.e. to copy the "audio" field to the destination,
+    // the mask should be "audio", not "chromeos.configs.audio". This is
+    // analogous to standard FieldMask behavior on a REST list operation, where
+    // the mask applies to each individual message. Sub-fields are still
+    // fully-qualified, as per standard FieldMasks, e.g.
+    // "bluetooth.config.build-path"
+    google.protobuf.FieldMask destination_fields = 5;
+
+    // String replacements to be done on the destination file. Replacements are
+    // done in the order they appear in this list.
+    //
+    // Note that replacements are done after filtering. For example, say a
+    // replacement rule changes the name of a field, "field1" -> "field2"; if
+    // destination_fields specifies "field2", the renamed fields will not be
+    // copied.
+    repeated StringReplacementRule string_replacement_rules = 6;
+}
+
+// Describes how files should be replicated, e.g. from private to public.
+message ReplicationConfig {
+    // Files to be replicated.
+    repeated FileReplicationRule file_replication_rules = 1;
+}