Browse code

Merge pull request #34331 from twistlock/plugable_secrets_backend

[WIP] update swarmkit dependecies to support plugable secrets

Brian Goff authored on 2017/08/28 23:31:27
Showing 58 changed files
... ...
@@ -108,7 +108,7 @@ github.com/stevvooe/continuity cd7a8e21e2b6f84799f5dd4b65faf49c8d3ee02d
108 108
 github.com/tonistiigi/fsutil 0ac4c11b053b9c5c7c47558f81f96c7100ce50fb
109 109
 
110 110
 # cluster
111
-github.com/docker/swarmkit 8bdecc57887ffc598b63d6433f58e0d2852112c3 https://github.com/dmcgowan/swarmkit.git
111
+github.com/docker/swarmkit ddb4539f883b18ea40af44ee6de63ac2adc8dc1e
112 112
 github.com/gogo/protobuf v0.4
113 113
 github.com/cloudflare/cfssl 7fb22c8cba7ecaf98e4082d22d65800cf45e042a
114 114
 github.com/google/certificate-transparency d90e65c3a07988180c5b1ece71791c0b6506826e
... ...
@@ -6,3 +6,19 @@ $ make generate
6 6
 ```
7 7
 
8 8
 Click [here](https://github.com/google/protobuf) for more information about protobuf.
9
+
10
+The `api.pb.txt` file contains merged descriptors of all defined services and messages.
11
+Definitions present here are considered frozen after the release.
12
+
13
+At release time, the current `api.pb.txt` file will be moved into place to
14
+freeze the API changes for the minor version. For example, when 1.0.0 is
15
+released, `api.pb.txt` should be moved to `1.0.txt`. Notice that we leave off
16
+the patch number, since the API will be completely locked down for a given
17
+patch series.
18
+
19
+We may find that by default, protobuf descriptors are too noisy to lock down
20
+API changes. In that case, we may filter out certain fields in the descriptors,
21
+possibly regenerating for old versions.
22
+
23
+This process is similar to the [process used to ensure backwards compatibility
24
+in Go](https://github.com/golang/go/tree/master/api).
... ...
@@ -1,7 +1,223 @@
1 1
 // Code generated by protoc-gen-gogo.
2
-// source: ca.proto
2
+// source: github.com/docker/swarmkit/api/ca.proto
3 3
 // DO NOT EDIT!
4 4
 
5
+/*
6
+	Package api is a generated protocol buffer package.
7
+
8
+	It is generated from these files:
9
+		github.com/docker/swarmkit/api/ca.proto
10
+		github.com/docker/swarmkit/api/control.proto
11
+		github.com/docker/swarmkit/api/dispatcher.proto
12
+		github.com/docker/swarmkit/api/health.proto
13
+		github.com/docker/swarmkit/api/logbroker.proto
14
+		github.com/docker/swarmkit/api/objects.proto
15
+		github.com/docker/swarmkit/api/raft.proto
16
+		github.com/docker/swarmkit/api/resource.proto
17
+		github.com/docker/swarmkit/api/snapshot.proto
18
+		github.com/docker/swarmkit/api/specs.proto
19
+		github.com/docker/swarmkit/api/types.proto
20
+		github.com/docker/swarmkit/api/watch.proto
21
+
22
+	It has these top-level messages:
23
+		NodeCertificateStatusRequest
24
+		NodeCertificateStatusResponse
25
+		IssueNodeCertificateRequest
26
+		IssueNodeCertificateResponse
27
+		GetRootCACertificateRequest
28
+		GetRootCACertificateResponse
29
+		GetUnlockKeyRequest
30
+		GetUnlockKeyResponse
31
+		GetNodeRequest
32
+		GetNodeResponse
33
+		ListNodesRequest
34
+		ListNodesResponse
35
+		UpdateNodeRequest
36
+		UpdateNodeResponse
37
+		RemoveNodeRequest
38
+		RemoveNodeResponse
39
+		GetTaskRequest
40
+		GetTaskResponse
41
+		RemoveTaskRequest
42
+		RemoveTaskResponse
43
+		ListTasksRequest
44
+		ListTasksResponse
45
+		CreateServiceRequest
46
+		CreateServiceResponse
47
+		GetServiceRequest
48
+		GetServiceResponse
49
+		UpdateServiceRequest
50
+		UpdateServiceResponse
51
+		RemoveServiceRequest
52
+		RemoveServiceResponse
53
+		ListServicesRequest
54
+		ListServicesResponse
55
+		CreateNetworkRequest
56
+		CreateNetworkResponse
57
+		GetNetworkRequest
58
+		GetNetworkResponse
59
+		RemoveNetworkRequest
60
+		RemoveNetworkResponse
61
+		ListNetworksRequest
62
+		ListNetworksResponse
63
+		GetClusterRequest
64
+		GetClusterResponse
65
+		ListClustersRequest
66
+		ListClustersResponse
67
+		KeyRotation
68
+		UpdateClusterRequest
69
+		UpdateClusterResponse
70
+		GetSecretRequest
71
+		GetSecretResponse
72
+		UpdateSecretRequest
73
+		UpdateSecretResponse
74
+		ListSecretsRequest
75
+		ListSecretsResponse
76
+		CreateSecretRequest
77
+		CreateSecretResponse
78
+		RemoveSecretRequest
79
+		RemoveSecretResponse
80
+		GetConfigRequest
81
+		GetConfigResponse
82
+		UpdateConfigRequest
83
+		UpdateConfigResponse
84
+		ListConfigsRequest
85
+		ListConfigsResponse
86
+		CreateConfigRequest
87
+		CreateConfigResponse
88
+		RemoveConfigRequest
89
+		RemoveConfigResponse
90
+		SessionRequest
91
+		SessionMessage
92
+		HeartbeatRequest
93
+		HeartbeatResponse
94
+		UpdateTaskStatusRequest
95
+		UpdateTaskStatusResponse
96
+		TasksRequest
97
+		TasksMessage
98
+		AssignmentsRequest
99
+		Assignment
100
+		AssignmentChange
101
+		AssignmentsMessage
102
+		HealthCheckRequest
103
+		HealthCheckResponse
104
+		LogSubscriptionOptions
105
+		LogSelector
106
+		LogContext
107
+		LogAttr
108
+		LogMessage
109
+		SubscribeLogsRequest
110
+		SubscribeLogsMessage
111
+		ListenSubscriptionsRequest
112
+		SubscriptionMessage
113
+		PublishLogsMessage
114
+		PublishLogsResponse
115
+		Meta
116
+		Node
117
+		Service
118
+		Endpoint
119
+		Task
120
+		NetworkAttachment
121
+		Network
122
+		Cluster
123
+		Secret
124
+		Config
125
+		Resource
126
+		Extension
127
+		RaftMember
128
+		JoinRequest
129
+		JoinResponse
130
+		LeaveRequest
131
+		LeaveResponse
132
+		ProcessRaftMessageRequest
133
+		ProcessRaftMessageResponse
134
+		ResolveAddressRequest
135
+		ResolveAddressResponse
136
+		InternalRaftRequest
137
+		StoreAction
138
+		AttachNetworkRequest
139
+		AttachNetworkResponse
140
+		DetachNetworkRequest
141
+		DetachNetworkResponse
142
+		StoreSnapshot
143
+		ClusterSnapshot
144
+		Snapshot
145
+		NodeSpec
146
+		ServiceSpec
147
+		ReplicatedService
148
+		GlobalService
149
+		TaskSpec
150
+		ResourceReference
151
+		GenericRuntimeSpec
152
+		NetworkAttachmentSpec
153
+		ContainerSpec
154
+		EndpointSpec
155
+		NetworkSpec
156
+		ClusterSpec
157
+		SecretSpec
158
+		ConfigSpec
159
+		Version
160
+		IndexEntry
161
+		Annotations
162
+		NamedGenericResource
163
+		DiscreteGenericResource
164
+		GenericResource
165
+		Resources
166
+		ResourceRequirements
167
+		Platform
168
+		PluginDescription
169
+		EngineDescription
170
+		NodeDescription
171
+		NodeTLSInfo
172
+		RaftMemberStatus
173
+		NodeStatus
174
+		Image
175
+		Mount
176
+		RestartPolicy
177
+		UpdateConfig
178
+		UpdateStatus
179
+		ContainerStatus
180
+		PortStatus
181
+		TaskStatus
182
+		NetworkAttachmentConfig
183
+		IPAMConfig
184
+		PortConfig
185
+		Driver
186
+		IPAMOptions
187
+		Peer
188
+		WeightedPeer
189
+		IssuanceStatus
190
+		AcceptancePolicy
191
+		ExternalCA
192
+		CAConfig
193
+		OrchestrationConfig
194
+		TaskDefaults
195
+		DispatcherConfig
196
+		RaftConfig
197
+		EncryptionConfig
198
+		SpreadOver
199
+		PlacementPreference
200
+		Placement
201
+		JoinTokens
202
+		RootCA
203
+		Certificate
204
+		EncryptionKey
205
+		ManagerStatus
206
+		FileTarget
207
+		SecretReference
208
+		ConfigReference
209
+		BlacklistedCertificate
210
+		HealthConfig
211
+		MaybeEncryptedRecord
212
+		RootRotation
213
+		Privileges
214
+		Object
215
+		SelectBySlot
216
+		SelectByCustom
217
+		SelectBy
218
+		WatchRequest
219
+		WatchMessage
220
+*/
5 221
 package api
6 222
 
7 223
 import proto "github.com/gogo/protobuf/proto"
... ...
@@ -33,6 +249,12 @@ var _ = proto.Marshal
33 33
 var _ = fmt.Errorf
34 34
 var _ = math.Inf
35 35
 
36
+// This is a compile-time assertion to ensure that this generated file
37
+// is compatible with the proto package it is being compiled against.
38
+// A compilation error at this line likely means your copy of the
39
+// proto package needs to be updated.
40
+const _ = proto.GoGoProtoPackageIsVersion2 // please upgrade the proto package
41
+
36 42
 type NodeCertificateStatusRequest struct {
37 43
 	NodeID string `protobuf:"bytes,1,opt,name=node_id,json=nodeId,proto3" json:"node_id,omitempty"`
38 44
 }
... ...
@@ -401,7 +623,7 @@ var _CA_serviceDesc = grpc.ServiceDesc{
401 401
 		},
402 402
 	},
403 403
 	Streams:  []grpc.StreamDesc{},
404
-	Metadata: "ca.proto",
404
+	Metadata: "github.com/docker/swarmkit/api/ca.proto",
405 405
 }
406 406
 
407 407
 // Client API for NodeCA service
... ...
@@ -498,7 +720,7 @@ var _NodeCA_serviceDesc = grpc.ServiceDesc{
498 498
 		},
499 499
 	},
500 500
 	Streams:  []grpc.StreamDesc{},
501
-	Metadata: "ca.proto",
501
+	Metadata: "github.com/docker/swarmkit/api/ca.proto",
502 502
 }
503 503
 
504 504
 func (m *NodeCertificateStatusRequest) Marshal() (dAtA []byte, err error) {
... ...
@@ -2070,47 +2292,48 @@ var (
2070 2070
 	ErrIntOverflowCa   = fmt.Errorf("proto: integer overflow")
2071 2071
 )
2072 2072
 
2073
-func init() { proto.RegisterFile("ca.proto", fileDescriptorCa) }
2073
+func init() { proto.RegisterFile("github.com/docker/swarmkit/api/ca.proto", fileDescriptorCa) }
2074 2074
 
2075 2075
 var fileDescriptorCa = []byte{
2076
-	// 610 bytes of a gzipped FileDescriptorProto
2077
-	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x94, 0x54, 0xcd, 0x6e, 0xd3, 0x40,
2078
-	0x10, 0xee, 0xba, 0x25, 0x6d, 0x27, 0xa1, 0x45, 0xdb, 0x56, 0x32, 0x69, 0xea, 0x54, 0xe6, 0xd0,
2079
-	0x72, 0xc0, 0x6d, 0x03, 0x27, 0xb8, 0x90, 0x04, 0xa9, 0x8a, 0x50, 0x11, 0xda, 0x08, 0xae, 0x95,
2080
-	0xe3, 0x2c, 0xc1, 0x8a, 0xe3, 0x35, 0xde, 0x75, 0x20, 0x37, 0x24, 0x10, 0x6f, 0x80, 0xe0, 0xc4,
2081
-	0x23, 0xf0, 0x1c, 0x11, 0x27, 0x24, 0x2e, 0x9c, 0x22, 0xea, 0x07, 0xe0, 0x19, 0x90, 0xd7, 0x36,
2082
-	0xcd, 0x8f, 0x13, 0xca, 0xc9, 0xbb, 0xb3, 0xdf, 0xf7, 0xcd, 0xcc, 0xb7, 0xe3, 0x85, 0x35, 0xcb,
2083
-	0x34, 0x3c, 0x9f, 0x09, 0x86, 0x71, 0x9b, 0x59, 0x5d, 0xea, 0x1b, 0xfc, 0xb5, 0xe9, 0xf7, 0xba,
2084
-	0xb6, 0x30, 0xfa, 0x27, 0xc5, 0xbc, 0x18, 0x78, 0x94, 0xc7, 0x80, 0x62, 0x9e, 0x7b, 0xd4, 0x4a,
2085
-	0x37, 0xdb, 0x1d, 0xd6, 0x61, 0x72, 0x79, 0x14, 0xad, 0x92, 0xe8, 0x96, 0xe7, 0x04, 0x1d, 0xdb,
2086
-	0x3d, 0x8a, 0x3f, 0x71, 0x50, 0xaf, 0x43, 0xe9, 0x09, 0x6b, 0xd3, 0x3a, 0xf5, 0x85, 0xfd, 0xc2,
2087
-	0xb6, 0x4c, 0x41, 0x9b, 0xc2, 0x14, 0x01, 0x27, 0xf4, 0x55, 0x40, 0xb9, 0xc0, 0xb7, 0x60, 0xd5,
2088
-	0x65, 0x6d, 0x7a, 0x6e, 0xb7, 0x55, 0xb4, 0x8f, 0x0e, 0xd7, 0x6b, 0x10, 0x8e, 0xca, 0xb9, 0x88,
2089
-	0xd2, 0x78, 0x44, 0x72, 0xd1, 0x51, 0xa3, 0xad, 0x7f, 0x41, 0xb0, 0x37, 0x47, 0x85, 0x7b, 0xcc,
2090
-	0xe5, 0x14, 0xdf, 0x87, 0x1c, 0x97, 0x11, 0xa9, 0x92, 0xaf, 0xe8, 0xc6, 0x6c, 0x43, 0x46, 0x83,
2091
-	0xf3, 0xc0, 0x74, 0xad, 0x94, 0x9b, 0x30, 0x70, 0x15, 0xf2, 0xd6, 0xa5, 0xb0, 0xaa, 0x48, 0x81,
2092
-	0x72, 0x96, 0xc0, 0x58, 0x7e, 0x32, 0xce, 0xd1, 0x7f, 0x20, 0xd8, 0x8d, 0xd4, 0xe9, 0x54, 0x95,
2093
-	0x69, 0x97, 0xf7, 0x60, 0xc5, 0x67, 0x0e, 0x95, 0xc5, 0x6d, 0x54, 0x4a, 0x59, 0xda, 0x11, 0x93,
2094
-	0x30, 0x87, 0xd6, 0x14, 0x15, 0x11, 0x89, 0xc6, 0x37, 0x61, 0xd9, 0xe2, 0xbe, 0x2c, 0xa8, 0x50,
2095
-	0x5b, 0x0d, 0x47, 0xe5, 0xe5, 0x7a, 0x93, 0x90, 0x28, 0x86, 0xb7, 0xe1, 0x9a, 0x60, 0x5d, 0xea,
2096
-	0xaa, 0xcb, 0x91, 0x69, 0x24, 0xde, 0xe0, 0x33, 0x28, 0x98, 0x7d, 0xd3, 0x76, 0xcc, 0x96, 0xed,
2097
-	0xd8, 0x62, 0xa0, 0xae, 0xc8, 0x74, 0xb7, 0xe7, 0xa5, 0x6b, 0x7a, 0xd4, 0x32, 0xaa, 0x63, 0x04,
2098
-	0x32, 0x41, 0xd7, 0x3f, 0x22, 0x28, 0x65, 0x77, 0x95, 0xb8, 0x7e, 0x95, 0xcb, 0xc3, 0x4f, 0x61,
2099
-	0x53, 0x82, 0x7a, 0xb4, 0xd7, 0xa2, 0x3e, 0x7f, 0x69, 0x7b, 0xb2, 0xa3, 0x8d, 0xca, 0xc1, 0xc2,
2100
-	0xba, 0xce, 0xfe, 0xc2, 0xc9, 0x46, 0xc4, 0xbf, 0xdc, 0xeb, 0x7b, 0xb0, 0x7b, 0x4a, 0x05, 0x61,
2101
-	0x4c, 0xd4, 0xab, 0xb3, 0x66, 0xeb, 0x0f, 0xa1, 0x94, 0x7d, 0x9c, 0x54, 0xbd, 0x3f, 0x79, 0xdf,
2102
-	0x51, 0xe5, 0x85, 0xc9, 0xeb, 0xdc, 0x81, 0xad, 0x53, 0x2a, 0x9e, 0xb9, 0x0e, 0xb3, 0xba, 0x8f,
2103
-	0xe9, 0x20, 0x15, 0xf6, 0x61, 0x7b, 0x32, 0x9c, 0x08, 0xee, 0x01, 0x04, 0x32, 0x78, 0xde, 0xa5,
2104
-	0x83, 0x44, 0x6f, 0x3d, 0x48, 0x61, 0xf8, 0x01, 0xac, 0xf6, 0xa9, 0xcf, 0x6d, 0xe6, 0x26, 0xb3,
2105
-	0xb5, 0x9b, 0xd5, 0xf8, 0xf3, 0x18, 0x52, 0x5b, 0x19, 0x8e, 0xca, 0x4b, 0x24, 0x65, 0x54, 0xde,
2106
-	0x2b, 0xa0, 0xd4, 0xab, 0xf8, 0x1d, 0x92, 0xb9, 0x67, 0x9a, 0xc2, 0x47, 0x59, 0x5a, 0x0b, 0xdc,
2107
-	0x29, 0x1e, 0x5f, 0x9d, 0x10, 0xb7, 0xa7, 0xaf, 0x7d, 0xfb, 0xfa, 0xfb, 0xb3, 0xa2, 0xdc, 0x40,
2108
-	0xf8, 0x0d, 0x14, 0xc6, 0x0d, 0xc0, 0x07, 0x73, 0xb4, 0xa6, 0x9d, 0x2b, 0x1e, 0xfe, 0x1b, 0x98,
2109
-	0x24, 0xdb, 0x91, 0xc9, 0x36, 0xe1, 0xba, 0x44, 0xde, 0xe9, 0x99, 0xae, 0xd9, 0xa1, 0x7e, 0xe5,
2110
-	0x93, 0x02, 0x72, 0xae, 0x12, 0x2b, 0xb2, 0xa6, 0x32, 0xdb, 0x8a, 0x05, 0x7f, 0x65, 0xb6, 0x15,
2111
-	0x8b, 0x06, 0x7e, 0xcc, 0x8a, 0x0f, 0x08, 0x76, 0x32, 0x9f, 0x24, 0x7c, 0x3c, 0x6f, 0xac, 0xe7,
2112
-	0xbd, 0x81, 0xc5, 0x93, 0xff, 0x60, 0x4c, 0x17, 0x52, 0x53, 0x87, 0x17, 0xda, 0xd2, 0xcf, 0x0b,
2113
-	0x6d, 0xe9, 0x6d, 0xa8, 0xa1, 0x61, 0xa8, 0xa1, 0xef, 0xa1, 0x86, 0x7e, 0x85, 0x1a, 0x6a, 0xe5,
2114
-	0xe4, 0x0b, 0x7c, 0xf7, 0x4f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x69, 0xad, 0xed, 0x8f, 0xe6, 0x05,
2115
-	0x00, 0x00,
2076
+	// 638 bytes of a gzipped FileDescriptorProto
2077
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x94, 0x54, 0xc1, 0x6e, 0xd3, 0x4c,
2078
+	0x10, 0xee, 0xba, 0xfd, 0xd3, 0xbf, 0xd3, 0xd0, 0xa2, 0xa5, 0x95, 0x4c, 0x9a, 0x3a, 0x95, 0x39,
2079
+	0xb4, 0x20, 0x61, 0xb7, 0x01, 0x09, 0x09, 0x2e, 0x24, 0x41, 0xaa, 0x2a, 0x54, 0x84, 0xb6, 0x82,
2080
+	0x6b, 0xe5, 0x38, 0xdb, 0x74, 0x15, 0xc7, 0x6b, 0xbc, 0xeb, 0x42, 0x6e, 0x48, 0x20, 0xde, 0x00,
2081
+	0xc1, 0x89, 0x47, 0xe0, 0x39, 0x2a, 0x4e, 0x48, 0x5c, 0x38, 0x55, 0xd4, 0x0f, 0xc0, 0x33, 0x20,
2082
+	0xaf, 0x6d, 0x9a, 0xb4, 0x4e, 0x5a, 0x4e, 0xf1, 0xce, 0x7c, 0xdf, 0x37, 0x33, 0xdf, 0x4e, 0x16,
2083
+	0xd6, 0xbb, 0x4c, 0x1e, 0x46, 0x6d, 0xcb, 0xe5, 0x7d, 0xbb, 0xc3, 0xdd, 0x1e, 0x0d, 0x6d, 0xf1,
2084
+	0xda, 0x09, 0xfb, 0x3d, 0x26, 0x6d, 0x27, 0x60, 0xb6, 0xeb, 0x58, 0x41, 0xc8, 0x25, 0xc7, 0x38,
2085
+	0xcd, 0x5a, 0x79, 0xd6, 0x3a, 0xda, 0xaa, 0xdc, 0xb9, 0x84, 0x2c, 0x07, 0x01, 0x15, 0x29, 0xff,
2086
+	0x52, 0xac, 0x08, 0xa8, 0x9b, 0x63, 0x97, 0xba, 0xbc, 0xcb, 0xd5, 0xa7, 0x9d, 0x7c, 0x65, 0xd1,
2087
+	0x07, 0x13, 0x14, 0x14, 0xa2, 0x1d, 0x1d, 0xd8, 0x81, 0x17, 0x75, 0x99, 0x9f, 0xfd, 0xa4, 0x44,
2088
+	0xb3, 0x05, 0xd5, 0x67, 0xbc, 0x43, 0x5b, 0x34, 0x94, 0xec, 0x80, 0xb9, 0x8e, 0xa4, 0x7b, 0xd2,
2089
+	0x91, 0x91, 0x20, 0xf4, 0x55, 0x44, 0x85, 0xc4, 0xb7, 0x60, 0xd6, 0xe7, 0x1d, 0xba, 0xcf, 0x3a,
2090
+	0x3a, 0x5a, 0x43, 0x1b, 0x73, 0x4d, 0x88, 0x4f, 0x6a, 0xa5, 0x84, 0xb2, 0xf3, 0x84, 0x94, 0x92,
2091
+	0xd4, 0x4e, 0xc7, 0xfc, 0x82, 0x60, 0x75, 0x8c, 0x8a, 0x08, 0xb8, 0x2f, 0x28, 0x7e, 0x08, 0x25,
2092
+	0xa1, 0x22, 0x4a, 0x65, 0xbe, 0x6e, 0x5a, 0x17, 0x2d, 0xb3, 0x76, 0x84, 0x88, 0x1c, 0xdf, 0xcd,
2093
+	0xb9, 0x19, 0x03, 0x37, 0x60, 0xde, 0x3d, 0x13, 0xd6, 0x35, 0x25, 0x50, 0x2b, 0x12, 0x18, 0xaa,
2094
+	0x4f, 0x86, 0x39, 0xe6, 0x0f, 0x04, 0x2b, 0x89, 0x3a, 0x3d, 0xd7, 0x65, 0x3e, 0xe5, 0x7d, 0x98,
2095
+	0x09, 0xb9, 0x47, 0x55, 0x73, 0x0b, 0xf5, 0x6a, 0x91, 0x76, 0xc2, 0x24, 0xdc, 0xa3, 0x4d, 0x4d,
2096
+	0x47, 0x44, 0xa1, 0xf1, 0x4d, 0x98, 0x76, 0x45, 0xa8, 0x1a, 0x2a, 0x37, 0x67, 0xe3, 0x93, 0xda,
2097
+	0x74, 0x6b, 0x8f, 0x90, 0x24, 0x86, 0x97, 0xe0, 0x3f, 0xc9, 0x7b, 0xd4, 0xd7, 0xa7, 0x13, 0xd3,
2098
+	0x48, 0x7a, 0xc0, 0xbb, 0x50, 0x76, 0x8e, 0x1c, 0xe6, 0x39, 0x6d, 0xe6, 0x31, 0x39, 0xd0, 0x67,
2099
+	0x54, 0xb9, 0xdb, 0xe3, 0xca, 0xed, 0x05, 0xd4, 0xb5, 0x1a, 0x43, 0x04, 0x32, 0x42, 0x37, 0x3f,
2100
+	0x22, 0xa8, 0x16, 0x4f, 0x95, 0xb9, 0x7e, 0x95, 0xcb, 0xc3, 0xcf, 0x61, 0x51, 0x81, 0xfa, 0xb4,
2101
+	0xdf, 0xa6, 0xa1, 0x38, 0x64, 0x81, 0x9a, 0x68, 0xa1, 0xbe, 0x3e, 0xb1, 0xaf, 0xdd, 0xbf, 0x70,
2102
+	0xb2, 0x90, 0xf0, 0xcf, 0xce, 0xe6, 0x2a, 0xac, 0x6c, 0x53, 0x49, 0x38, 0x97, 0xad, 0xc6, 0x45,
2103
+	0xb3, 0xcd, 0xc7, 0x50, 0x2d, 0x4e, 0x67, 0x5d, 0xaf, 0x8d, 0xde, 0x77, 0xd2, 0x79, 0x79, 0xf4,
2104
+	0x3a, 0x97, 0xe1, 0xc6, 0x36, 0x95, 0x2f, 0x7c, 0x8f, 0xbb, 0xbd, 0xa7, 0x74, 0x90, 0x0b, 0x87,
2105
+	0xb0, 0x34, 0x1a, 0xce, 0x04, 0x57, 0x01, 0x22, 0x15, 0xdc, 0xef, 0xd1, 0x41, 0xa6, 0x37, 0x17,
2106
+	0xe5, 0x30, 0xfc, 0x08, 0x66, 0x8f, 0x68, 0x28, 0x18, 0xf7, 0xb3, 0xdd, 0x5a, 0x29, 0x1a, 0xfc,
2107
+	0x65, 0x0a, 0x69, 0xce, 0x1c, 0x9f, 0xd4, 0xa6, 0x48, 0xce, 0xa8, 0xbf, 0xd7, 0x40, 0x6b, 0x35,
2108
+	0xf0, 0x3b, 0xa4, 0x6a, 0x5f, 0x18, 0x0a, 0xdb, 0x45, 0x5a, 0x13, 0xdc, 0xa9, 0x6c, 0x5e, 0x9d,
2109
+	0x90, 0x8e, 0x67, 0xfe, 0xff, 0xed, 0xeb, 0xef, 0xcf, 0x9a, 0x76, 0x1d, 0xe1, 0x37, 0x50, 0x1e,
2110
+	0x36, 0x00, 0xaf, 0x8f, 0xd1, 0x3a, 0xef, 0x5c, 0x65, 0xe3, 0x72, 0x60, 0x56, 0x6c, 0x59, 0x15,
2111
+	0x5b, 0x84, 0x6b, 0x0a, 0x79, 0xb7, 0xef, 0xf8, 0x4e, 0x97, 0x86, 0xf5, 0x4f, 0x1a, 0xa8, 0xbd,
2112
+	0xca, 0xac, 0x28, 0xda, 0xca, 0x62, 0x2b, 0x26, 0xfc, 0x2b, 0x8b, 0xad, 0x98, 0xb4, 0xf0, 0x43,
2113
+	0x56, 0x7c, 0x40, 0xb0, 0x5c, 0xf8, 0x24, 0xe1, 0xcd, 0x71, 0x6b, 0x3d, 0xee, 0x0d, 0xac, 0x6c,
2114
+	0xfd, 0x03, 0xe3, 0x7c, 0x23, 0x4d, 0xfd, 0xf8, 0xd4, 0x98, 0xfa, 0x79, 0x6a, 0x4c, 0xbd, 0x8d,
2115
+	0x0d, 0x74, 0x1c, 0x1b, 0xe8, 0x7b, 0x6c, 0xa0, 0x5f, 0xb1, 0x81, 0xda, 0x25, 0xf5, 0x02, 0xdf,
2116
+	0xfb, 0x13, 0x00, 0x00, 0xff, 0xff, 0xe1, 0xda, 0xca, 0xba, 0x67, 0x06, 0x00, 0x00,
2116 2117
 }
... ...
@@ -2,10 +2,10 @@ syntax = "proto3";
2 2
 
3 3
 package docker.swarmkit.v1;
4 4
 
5
-import "types.proto";
6
-import "specs.proto";
5
+import "github.com/docker/swarmkit/api/types.proto";
6
+import "github.com/docker/swarmkit/api/specs.proto";
7 7
 import "gogoproto/gogo.proto";
8
-import "plugin/plugin.proto";
8
+import "github.com/docker/swarmkit/protobuf/plugin/plugin.proto";
9 9
 
10 10
 // CA defines the RPC methods for requesting certificates from a CA.
11 11
 
... ...
@@ -1,5 +1,5 @@
1 1
 // Code generated by protoc-gen-gogo.
2
-// source: control.proto
2
+// source: github.com/docker/swarmkit/api/control.proto
3 3
 // DO NOT EDIT!
4 4
 
5 5
 package api
... ...
@@ -3468,7 +3468,7 @@ var _Control_serviceDesc = grpc.ServiceDesc{
3468 3468
 		},
3469 3469
 	},
3470 3470
 	Streams:  []grpc.StreamDesc{},
3471
-	Metadata: "control.proto",
3471
+	Metadata: "github.com/docker/swarmkit/api/control.proto",
3472 3472
 }
3473 3473
 
3474 3474
 func (m *GetNodeRequest) Marshal() (dAtA []byte, err error) {
... ...
@@ -15953,140 +15953,142 @@ var (
15953 15953
 	ErrIntOverflowControl   = fmt.Errorf("proto: integer overflow")
15954 15954
 )
15955 15955
 
15956
-func init() { proto.RegisterFile("control.proto", fileDescriptorControl) }
15956
+func init() { proto.RegisterFile("github.com/docker/swarmkit/api/control.proto", fileDescriptorControl) }
15957 15957
 
15958 15958
 var fileDescriptorControl = []byte{
15959
-	// 2106 bytes of a gzipped FileDescriptorProto
15960
-	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xcc, 0x5a, 0xcd, 0x73, 0x1b, 0x49,
15961
-	0x15, 0xb7, 0x3e, 0x6c, 0xc9, 0x4f, 0xb6, 0x6c, 0xb7, 0x1d, 0x50, 0x29, 0xc1, 0x4e, 0x4d, 0x48,
15962
-	0xa2, 0x50, 0x41, 0x66, 0x15, 0x16, 0xc2, 0x52, 0x7c, 0xac, 0xed, 0x6c, 0x56, 0xeb, 0x8d, 0x93,
15963
-	0x1a, 0xc7, 0x5b, 0xdc, 0x54, 0xb2, 0xd4, 0x36, 0x13, 0xc9, 0x1a, 0x31, 0x33, 0xf2, 0xae, 0x8b,
15964
-	0x0b, 0x50, 0xcb, 0x81, 0x3f, 0x80, 0x2a, 0xae, 0x5c, 0x39, 0x70, 0xe0, 0xc4, 0x81, 0x3f, 0x20,
15965
-	0xc5, 0x89, 0x23, 0x27, 0xc3, 0xaa, 0x0a, 0x8a, 0x13, 0x7f, 0xc3, 0x56, 0x77, 0xbf, 0x9e, 0x2f,
15966
-	0xf5, 0xcc, 0xe8, 0xab, 0xca, 0x7b, 0xb2, 0xa6, 0xe7, 0xf7, 0xfa, 0xbd, 0xee, 0xf7, 0xeb, 0xdf,
15967
-	0x74, 0xbf, 0x36, 0xac, 0xb6, 0xcc, 0x9e, 0x63, 0x99, 0xdd, 0x6a, 0xdf, 0x32, 0x1d, 0x93, 0x90,
15968
-	0xb6, 0xd9, 0xea, 0x50, 0xab, 0x6a, 0x7f, 0xda, 0xb4, 0x2e, 0x3a, 0x86, 0x53, 0xbd, 0x7c, 0xa7,
15969
-	0x5c, 0xb0, 0xfb, 0xb4, 0x65, 0x0b, 0x40, 0x79, 0xd5, 0x3c, 0x7d, 0x43, 0x5b, 0x8e, 0x7c, 0x2c,
15970
-	0x38, 0x57, 0x7d, 0x2a, 0x1f, 0xb6, 0xce, 0xcd, 0x73, 0x93, 0xff, 0xdc, 0x65, 0xbf, 0xb0, 0x75,
15971
-	0xb3, 0xdf, 0x1d, 0x9c, 0x1b, 0xbd, 0x5d, 0xf1, 0x47, 0x34, 0x6a, 0xef, 0x42, 0xf1, 0x39, 0x75,
15972
-	0x8e, 0xcc, 0x36, 0xd5, 0xe9, 0x2f, 0x06, 0xd4, 0x76, 0xc8, 0x3d, 0xc8, 0xf5, 0xcc, 0x36, 0x6d,
15973
-	0x18, 0xed, 0x52, 0xea, 0x6e, 0xaa, 0xb2, 0xbc, 0x07, 0xc3, 0xeb, 0x9d, 0x25, 0x86, 0xa8, 0x1f,
15974
-	0xe8, 0x4b, 0xec, 0x55, 0xbd, 0xad, 0xfd, 0x04, 0xd6, 0x5c, 0x33, 0xbb, 0x6f, 0xf6, 0x6c, 0x4a,
15975
-	0x1e, 0x43, 0x96, 0xbd, 0xe4, 0x46, 0x85, 0x5a, 0xa9, 0x3a, 0x3a, 0x80, 0x2a, 0xc7, 0x73, 0x94,
15976
-	0xf6, 0xdf, 0x0c, 0xac, 0x7f, 0x6c, 0xd8, 0xbc, 0x0b, 0x5b, 0xba, 0xfe, 0x00, 0x72, 0x67, 0x46,
15977
-	0xd7, 0xa1, 0x96, 0x8d, 0xbd, 0x3c, 0x56, 0xf5, 0x12, 0x36, 0xab, 0x7e, 0x20, 0x6c, 0x74, 0x69,
15978
-	0x5c, 0xfe, 0x5d, 0x06, 0x72, 0xd8, 0x48, 0xb6, 0x60, 0xb1, 0xd7, 0xbc, 0xa0, 0xac, 0xc7, 0x4c,
15979
-	0x65, 0x59, 0x17, 0x0f, 0x64, 0x17, 0x0a, 0x46, 0xbb, 0xd1, 0xb7, 0xe8, 0x99, 0xf1, 0x19, 0xb5,
15980
-	0x4b, 0x69, 0xf6, 0x6e, 0xaf, 0x38, 0xbc, 0xde, 0x81, 0xfa, 0xc1, 0x2b, 0x6c, 0xd5, 0xc1, 0x68,
15981
-	0xcb, 0xdf, 0xe4, 0x15, 0x2c, 0x75, 0x9b, 0xa7, 0xb4, 0x6b, 0x97, 0x32, 0x77, 0x33, 0x95, 0x42,
15982
-	0xed, 0xe9, 0x24, 0x91, 0x55, 0x3f, 0xe6, 0xa6, 0xcf, 0x7a, 0x8e, 0x75, 0xa5, 0x63, 0x3f, 0xe4,
15983
-	0x05, 0x14, 0x2e, 0xe8, 0xc5, 0x29, 0xb5, 0xec, 0x9f, 0x1b, 0x7d, 0xbb, 0x94, 0xbd, 0x9b, 0xa9,
15984
-	0x14, 0x6b, 0x0f, 0xa3, 0xa6, 0xed, 0xb8, 0x4f, 0x5b, 0xd5, 0x17, 0x2e, 0x7e, 0x2f, 0xbd, 0xbe,
15985
-	0xa0, 0xfb, 0xed, 0xc9, 0xf7, 0x60, 0xd1, 0x32, 0xbb, 0xd4, 0x2e, 0x2d, 0xf2, 0x8e, 0xee, 0x44,
15986
-	0xce, 0xbf, 0xd9, 0xa5, 0xdc, 0x5a, 0xc0, 0xc9, 0x3d, 0x58, 0x65, 0x53, 0xe2, 0xcd, 0xc5, 0x12,
15987
-	0x9f, 0xa7, 0x15, 0xd6, 0x28, 0x47, 0x5f, 0xfe, 0x01, 0x14, 0x7c, 0x43, 0x20, 0xeb, 0x90, 0xe9,
15988
-	0xd0, 0x2b, 0x41, 0x0f, 0x9d, 0xfd, 0x64, 0xb3, 0x7c, 0xd9, 0xec, 0x0e, 0x68, 0x29, 0xcd, 0xdb,
15989
-	0xc4, 0xc3, 0x7b, 0xe9, 0xa7, 0x29, 0x6d, 0x1f, 0x36, 0x7c, 0xd3, 0x82, 0x5c, 0xa9, 0xc2, 0x22,
15990
-	0x63, 0x81, 0x48, 0x4a, 0x1c, 0x59, 0x04, 0x4c, 0xfb, 0x53, 0x0a, 0x36, 0x4e, 0xfa, 0xed, 0xa6,
15991
-	0x43, 0x27, 0x65, 0x2a, 0xf9, 0x31, 0xac, 0x70, 0xd0, 0x25, 0xb5, 0x6c, 0xc3, 0xec, 0xf1, 0x00,
15992
-	0x0b, 0xb5, 0xdb, 0x2a, 0x8f, 0x9f, 0x08, 0x88, 0x5e, 0x60, 0x06, 0xf8, 0x40, 0xbe, 0x03, 0x59,
15993
-	0xb6, 0xec, 0x4a, 0x19, 0x6e, 0x77, 0x27, 0x2e, 0x3f, 0x3a, 0x47, 0x6a, 0x7b, 0x40, 0xfc, 0xb1,
15994
-	0x4e, 0xb5, 0x3c, 0x8e, 0x60, 0x43, 0xa7, 0x17, 0xe6, 0xe5, 0xe4, 0xe3, 0xdd, 0x82, 0xc5, 0x33,
15995
-	0xd3, 0x6a, 0x89, 0x4c, 0xe4, 0x75, 0xf1, 0xa0, 0x6d, 0x01, 0xf1, 0xf7, 0x27, 0x62, 0xc2, 0xc5,
15996
-	0xff, 0xba, 0x69, 0x77, 0x7c, 0x2e, 0x9c, 0xa6, 0xdd, 0x09, 0xb9, 0x60, 0x08, 0xe6, 0x82, 0xbd,
15997
-	0x72, 0x17, 0xbf, 0x30, 0xf3, 0x46, 0xc7, 0x5e, 0xc6, 0x8d, 0x8e, 0xe3, 0x39, 0x4a, 0x7b, 0x2a,
15998
-	0x47, 0x37, 0xb1, 0x6b, 0x77, 0x1c, 0x7e, 0xef, 0xda, 0xdf, 0xb2, 0x42, 0x4c, 0x58, 0xe3, 0x14,
15999
-	0x62, 0xe2, 0x37, 0x1b, 0x15, 0x93, 0x7f, 0xdd, 0xa0, 0x98, 0xa8, 0x22, 0x53, 0x8a, 0xc9, 0x2e,
16000
-	0x14, 0x6c, 0x6a, 0x5d, 0x1a, 0x2d, 0xc6, 0x0e, 0x21, 0x26, 0x18, 0xc2, 0xb1, 0x68, 0xae, 0x1f,
16001
-	0xd8, 0x3a, 0x20, 0xa4, 0xde, 0xb6, 0xc9, 0x03, 0xc8, 0x23, 0x97, 0x84, 0x62, 0x2c, 0xef, 0x15,
16002
-	0x86, 0xd7, 0x3b, 0x39, 0x41, 0x26, 0x5b, 0xcf, 0x09, 0x36, 0xd9, 0xe4, 0x43, 0x28, 0xb6, 0xa9,
16003
-	0x6d, 0x58, 0xb4, 0xdd, 0xb0, 0x9d, 0xa6, 0x83, 0xfa, 0x50, 0xac, 0x7d, 0x23, 0x2a, 0xc5, 0xc7,
16004
-	0x0c, 0xc5, 0x05, 0x66, 0x15, 0x0d, 0x79, 0x8b, 0x42, 0x68, 0x72, 0xa3, 0x42, 0x43, 0xee, 0x00,
16005
-	0x0c, 0xfa, 0x0d, 0xc7, 0x6c, 0xb0, 0xf5, 0x53, 0xca, 0x73, 0x0a, 0xe7, 0x07, 0xfd, 0xd7, 0xe6,
16006
-	0x41, 0xd3, 0xa1, 0xa4, 0x0c, 0x79, 0x6b, 0xd0, 0x73, 0x0c, 0x96, 0x81, 0x65, 0x6e, 0xed, 0x3e,
16007
-	0xcf, 0x41, 0xa2, 0x70, 0xb2, 0x3d, 0x89, 0x62, 0x9c, 0x8b, 0x95, 0x28, 0x4e, 0x42, 0x01, 0xd3,
16008
-	0x0e, 0x61, 0x6b, 0xdf, 0xa2, 0x4d, 0x87, 0xe2, 0x84, 0x4b, 0x1a, 0x3e, 0x41, 0xfd, 0x10, 0x1c,
16009
-	0xdc, 0x51, 0x75, 0x83, 0x16, 0x3e, 0x09, 0x39, 0x82, 0x5b, 0xa1, 0xce, 0x30, 0xaa, 0x77, 0x21,
16010
-	0x87, 0x49, 0xc4, 0x0e, 0x6f, 0xc7, 0x74, 0xa8, 0x4b, 0xac, 0xf6, 0x06, 0x36, 0x9e, 0x53, 0x27,
16011
-	0x14, 0xd9, 0x63, 0x00, 0x8f, 0x33, 0xb8, 0xe6, 0x56, 0x87, 0xd7, 0x3b, 0xcb, 0x2e, 0x65, 0xf4,
16012
-	0x65, 0x97, 0x31, 0xe4, 0x21, 0xac, 0x19, 0x3d, 0x9b, 0x5a, 0x4e, 0xa3, 0x4d, 0xcf, 0x9a, 0x83,
16013
-	0xae, 0x63, 0xa3, 0xc2, 0x14, 0x45, 0xf3, 0x01, 0xb6, 0x6a, 0x87, 0x40, 0xfc, 0xbe, 0x66, 0x0b,
16014
-	0xfc, 0x2f, 0x69, 0xd8, 0x12, 0x62, 0x3a, 0x53, 0xf0, 0x07, 0xb0, 0x26, 0xd1, 0x13, 0x7c, 0x07,
16015
-	0x8a, 0x68, 0x23, 0x3f, 0x05, 0x4f, 0x02, 0x9f, 0x82, 0xf1, 0x52, 0x49, 0x5e, 0x40, 0xde, 0x32,
16016
-	0xbb, 0xdd, 0xd3, 0x66, 0xab, 0x53, 0xca, 0xde, 0x4d, 0x55, 0x8a, 0xb5, 0x77, 0x54, 0x86, 0xaa,
16017
-	0x41, 0x56, 0x75, 0x34, 0xd4, 0xdd, 0x2e, 0x34, 0x0d, 0xf2, 0xb2, 0x95, 0xe4, 0x21, 0x7b, 0xf4,
16018
-	0xf2, 0xe8, 0xd9, 0xfa, 0x02, 0x59, 0x81, 0xfc, 0x2b, 0xfd, 0xd9, 0x27, 0xf5, 0x97, 0x27, 0xc7,
16019
-	0xeb, 0x29, 0xc6, 0x9e, 0x50, 0x77, 0xb3, 0x25, 0xe1, 0x00, 0xb6, 0x84, 0xe8, 0xce, 0x92, 0x03,
16020
-	0xed, 0xeb, 0x70, 0x2b, 0xd4, 0x0b, 0xaa, 0xf7, 0xe7, 0x19, 0xd8, 0x64, 0xeb, 0x0f, 0xdb, 0x5d,
16021
-	0x01, 0xaf, 0x87, 0x05, 0x7c, 0x37, 0x4a, 0x26, 0x43, 0x96, 0xa3, 0x1a, 0xfe, 0xc7, 0xf4, 0xdc,
16022
-	0x35, 0xfc, 0x38, 0xa4, 0xe1, 0x3f, 0x9c, 0x30, 0x38, 0xa5, 0x8c, 0x8f, 0x68, 0x64, 0x56, 0xa1,
16023
-	0x91, 0x7e, 0x15, 0x5c, 0x9c, 0x9f, 0x0a, 0xbe, 0x84, 0xad, 0x60, 0xb8, 0x48, 0x9a, 0xef, 0x43,
16024
-	0x1e, 0x93, 0x28, 0xb5, 0x30, 0x96, 0x35, 0x2e, 0xd8, 0x53, 0xc4, 0x23, 0xea, 0x7c, 0x6a, 0x5a,
16025
-	0x9d, 0x09, 0x14, 0x11, 0x2d, 0x54, 0x8a, 0xe8, 0x76, 0xe6, 0x71, 0xba, 0x27, 0x9a, 0xe2, 0x38,
16026
-	0x2d, 0xad, 0x24, 0x56, 0x3b, 0xe1, 0x8a, 0x18, 0x8a, 0x8c, 0x40, 0x96, 0xcd, 0x34, 0xce, 0x17,
16027
-	0xff, 0xcd, 0x48, 0x8e, 0x36, 0x8c, 0xe4, 0x69, 0x8f, 0xe4, 0x68, 0xcb, 0x48, 0x8e, 0x80, 0x7a,
16028
-	0x1b, 0xc5, 0x6f, 0x4e, 0x31, 0xfe, 0x4c, 0xae, 0xbb, 0xb9, 0x87, 0xe9, 0xae, 0xc5, 0x50, 0xa4,
16029
-	0xda, 0xff, 0xd2, 0x62, 0x2d, 0x62, 0xfb, 0x14, 0x6b, 0x31, 0x64, 0x39, 0xba, 0x16, 0x7f, 0x7b,
16030
-	0x83, 0x6b, 0x31, 0x22, 0xb8, 0xa9, 0xd7, 0xe2, 0x1c, 0xd6, 0x9b, 0x17, 0x92, 0xb7, 0xde, 0x30,
16031
-	0x51, 0xb1, 0xeb, 0x4d, 0x66, 0xce, 0x05, 0x6b, 0xef, 0x73, 0x4a, 0xef, 0x77, 0x07, 0xb6, 0x43,
16032
-	0x2d, 0x9f, 0x46, 0xb7, 0x44, 0x4b, 0x48, 0xa3, 0x11, 0xc7, 0x78, 0x81, 0x00, 0x97, 0xbe, 0x6e,
16033
-	0x17, 0x1e, 0x7d, 0x11, 0x12, 0x47, 0x5f, 0x69, 0x25, 0xb1, 0x2e, 0x97, 0xf0, 0xc5, 0x14, 0x5c,
16034
-	0x0a, 0x59, 0x7e, 0xb5, 0xb8, 0x14, 0x11, 0xdc, 0x4d, 0x72, 0xc9, 0x0b, 0xc9, 0xe3, 0x12, 0x66,
16035
-	0x23, 0x96, 0x4b, 0x32, 0x75, 0x2e, 0x58, 0xfb, 0x7d, 0x0a, 0x0a, 0x87, 0xf4, 0x4a, 0x37, 0x9d,
16036
-	0xa6, 0xc3, 0xb6, 0x3e, 0xdf, 0x82, 0x0d, 0x46, 0x32, 0x6a, 0x35, 0xde, 0x98, 0x46, 0xaf, 0xe1,
16037
-	0x98, 0x1d, 0xda, 0xe3, 0xa1, 0xe5, 0xf5, 0x35, 0xf1, 0xe2, 0x23, 0xd3, 0xe8, 0xbd, 0x66, 0xcd,
16038
-	0xe4, 0x31, 0x90, 0x8b, 0x66, 0xaf, 0x79, 0x1e, 0x04, 0x8b, 0xcd, 0xe2, 0x3a, 0xbe, 0x51, 0xa2,
16039
-	0x07, 0xbd, 0xae, 0xd9, 0xea, 0x34, 0xd8, 0xa8, 0x33, 0x01, 0xf4, 0x09, 0x7f, 0x71, 0x48, 0xaf,
16040
-	0xb4, 0xdf, 0xb8, 0xfb, 0xc1, 0x59, 0x78, 0xce, 0xf6, 0x83, 0x12, 0x3d, 0xc9, 0x7e, 0x10, 0x6d,
16041
-	0x26, 0xd8, 0x0f, 0xa2, 0x77, 0xdf, 0x7e, 0xf0, 0x7d, 0xb6, 0x1f, 0x14, 0xb3, 0xca, 0xf7, 0x83,
16042
-	0x11, 0x86, 0xbe, 0xc9, 0xdf, 0xcb, 0xbe, 0xbd, 0xde, 0x59, 0xd0, 0x5d, 0x33, 0x6f, 0x7f, 0x37,
16043
-	0xa7, 0x85, 0xfa, 0x23, 0x58, 0xe7, 0x3b, 0xf6, 0x96, 0x45, 0x1d, 0x39, 0x9f, 0x8f, 0x60, 0xd9,
16044
-	0xe6, 0x0d, 0xde, 0x74, 0xae, 0x0c, 0xaf, 0x77, 0xf2, 0x02, 0x55, 0x3f, 0x60, 0xdf, 0x79, 0xfe,
16045
-	0xab, 0xad, 0x3d, 0xc7, 0xc3, 0x85, 0x30, 0xc7, 0x50, 0x6a, 0xb0, 0x24, 0x00, 0x18, 0x49, 0x59,
16046
-	0xbd, 0x67, 0xe0, 0x36, 0x88, 0xd4, 0xfe, 0x9a, 0x82, 0x4d, 0xb9, 0x71, 0x9d, 0x2e, 0x16, 0xb2,
16047
-	0x07, 0x45, 0x84, 0x4e, 0x90, 0xd7, 0x55, 0x61, 0x22, 0xd3, 0x5a, 0x0b, 0xa4, 0x75, 0x3b, 0x3a,
16048
-	0x70, 0xdf, 0xf6, 0xe4, 0x23, 0xef, 0x98, 0x32, 0xf3, 0x34, 0xfc, 0x27, 0x0d, 0x44, 0xec, 0xc4,
16049
-	0xd8, 0xa3, 0x2b, 0x9b, 0x1f, 0x86, 0x65, 0xb3, 0x1a, 0xbd, 0xe3, 0xf4, 0x1b, 0x8e, 0xaa, 0xe6,
16050
-	0xe7, 0xf3, 0x57, 0x4d, 0x3d, 0xa4, 0x9a, 0xef, 0x4d, 0x16, 0xdb, 0x8d, 0x88, 0xe6, 0xa1, 0x3c,
16051
-	0x76, 0x60, 0x44, 0x98, 0xb2, 0xef, 0xb2, 0x43, 0x12, 0x6f, 0x42, 0xc9, 0x8c, 0xcb, 0x99, 0x84,
16052
-	0x6a, 0x75, 0xd8, 0x94, 0x27, 0x76, 0x3f, 0x75, 0x6b, 0x81, 0xbd, 0xee, 0xd8, 0x5c, 0x0a, 0x76,
16053
-	0x35, 0x03, 0x97, 0x7e, 0x0a, 0x9b, 0xf2, 0xd0, 0x35, 0xe5, 0xea, 0xfe, 0x9a, 0x77, 0xf8, 0xf3,
16054
-	0x47, 0x83, 0xa2, 0xb1, 0x6f, 0xf6, 0xce, 0x8c, 0x73, 0x5f, 0xb7, 0x2d, 0xde, 0x10, 0xea, 0x56,
16055
-	0xa0, 0x58, 0xb7, 0xe2, 0xb5, 0x2b, 0x1a, 0xd2, 0xdc, 0x1b, 0xa1, 0x00, 0xc4, 0x8d, 0x10, 0x6d,
16056
-	0x10, 0xe9, 0x13, 0x8d, 0x69, 0x63, 0x61, 0xa2, 0x81, 0xd0, 0x49, 0x44, 0x43, 0x98, 0x4c, 0x20,
16057
-	0x1a, 0xc2, 0xb3, 0x4a, 0x34, 0xe6, 0x30, 0x0d, 0x52, 0x34, 0x44, 0xf3, 0x14, 0xa2, 0x11, 0x34,
16058
-	0xfc, 0x6a, 0x89, 0x86, 0x3a, 0xb6, 0x9b, 0x14, 0x0d, 0x37, 0x22, 0x4f, 0x34, 0x44, 0x22, 0x62,
16059
-	0x45, 0x03, 0x73, 0x26, 0xa1, 0x9e, 0x68, 0x04, 0xa9, 0x3b, 0x86, 0x68, 0xa8, 0xb8, 0x14, 0xec,
16060
-	0x6a, 0x06, 0x2e, 0xb9, 0xa2, 0x31, 0xf5, 0xea, 0x76, 0x45, 0x23, 0x18, 0x4d, 0xed, 0xd7, 0xb7,
16061
-	0x21, 0xb7, 0x2f, 0xee, 0x39, 0x89, 0x01, 0x39, 0xbc, 0x42, 0x24, 0x9a, 0x2a, 0xa8, 0xe0, 0xb5,
16062
-	0x64, 0xf9, 0x5e, 0x2c, 0x06, 0x45, 0xe9, 0xd6, 0xdf, 0xff, 0xfc, 0xff, 0x3f, 0xa4, 0xd7, 0x60,
16063
-	0x95, 0x83, 0xbe, 0x8d, 0xdb, 0x47, 0x62, 0xc2, 0xb2, 0x7b, 0x07, 0x45, 0xbe, 0x39, 0xce, 0xcd,
16064
-	0x5d, 0xf9, 0x7e, 0x02, 0x2a, 0xde, 0xa1, 0x05, 0xe0, 0x5d, 0x01, 0x91, 0xfb, 0xd1, 0x05, 0x3f,
16065
-	0xff, 0x08, 0x1f, 0x24, 0xc1, 0x12, 0x7d, 0x7a, 0x57, 0x3c, 0x6a, 0x9f, 0x23, 0x57, 0x4a, 0x6a,
16066
-	0x9f, 0x8a, 0x9b, 0xa2, 0x08, 0x9f, 0x22, 0x87, 0xaf, 0x9b, 0x76, 0x27, 0x32, 0x87, 0xbe, 0x2b,
16067
-	0x9e, 0xc8, 0x1c, 0x06, 0x2e, 0x73, 0xe2, 0x73, 0xc8, 0x8b, 0xf4, 0xd1, 0x39, 0xf4, 0x5f, 0x98,
16068
-	0x44, 0xe7, 0x30, 0x50, 0xe9, 0x4f, 0x9c, 0x4f, 0x3e, 0xbc, 0x98, 0xf9, 0xf4, 0x8f, 0xf0, 0x41,
16069
-	0x12, 0x2c, 0xd1, 0xa7, 0x57, 0x3b, 0x57, 0xfb, 0x1c, 0xa9, 0xe3, 0xab, 0x7d, 0x8e, 0x96, 0xe0,
16070
-	0xa3, 0x7c, 0x7e, 0x06, 0x2b, 0xfe, 0xba, 0x1f, 0x79, 0x38, 0x66, 0x21, 0xb3, 0x5c, 0x49, 0x06,
16071
-	0xc6, 0x7b, 0xfe, 0x25, 0xac, 0x06, 0x6e, 0x39, 0x88, 0xb2, 0x47, 0xd5, 0xad, 0x4a, 0xf9, 0xd1,
16072
-	0x18, 0xc8, 0x44, 0xe7, 0x81, 0x22, 0xb9, 0xda, 0xb9, 0xaa, 0x2c, 0xaf, 0x76, 0xae, 0xac, 0xb8,
16073
-	0xc7, 0x38, 0x0f, 0xd4, 0xc2, 0xd5, 0xce, 0x55, 0x45, 0x77, 0xb5, 0x73, 0x75, 0x61, 0x3d, 0x96,
16074
-	0x64, 0x58, 0x3f, 0x8a, 0x24, 0x59, 0xb0, 0xe6, 0x18, 0x49, 0xb2, 0x70, 0x01, 0x31, 0x9e, 0x64,
16075
-	0xb2, 0xd8, 0x15, 0x4d, 0xb2, 0x50, 0x85, 0x2e, 0x9a, 0x64, 0xe1, 0xba, 0x59, 0x22, 0xc9, 0xe4,
16076
-	0x80, 0x63, 0x48, 0x16, 0x1a, 0xf3, 0xa3, 0x31, 0x90, 0x63, 0xe6, 0x39, 0xd6, 0xb9, 0xaa, 0xc8,
16077
-	0x1b, 0x97, 0xe7, 0x31, 0x9d, 0x8b, 0x3c, 0xe3, 0x69, 0x3f, 0x32, 0xcf, 0xc1, 0x3a, 0x4a, 0x64,
16078
-	0x9e, 0x43, 0xa5, 0x86, 0x84, 0x3c, 0xcb, 0x42, 0x54, 0x74, 0x9e, 0x43, 0xd5, 0xb3, 0xe8, 0x3c,
16079
-	0x87, 0x6b, 0x5a, 0x89, 0xeb, 0x59, 0x0e, 0x38, 0x66, 0x3d, 0x87, 0xc6, 0xfc, 0x68, 0x0c, 0x64,
16080
-	0xe2, 0xc7, 0xc9, 0x2d, 0x81, 0xa8, 0x3f, 0x4e, 0xe1, 0x02, 0x4b, 0xf9, 0x7e, 0x02, 0x2a, 0x71,
16081
-	0x9e, 0xfd, 0xf5, 0x06, 0xf5, 0x3c, 0x2b, 0x6a, 0x29, 0xe5, 0x4a, 0x32, 0x30, 0xde, 0xf3, 0x00,
16082
-	0x0a, 0xbe, 0x53, 0x33, 0x79, 0x30, 0xde, 0x41, 0xbf, 0xfc, 0x30, 0x11, 0x97, 0x38, 0x60, 0xff,
16083
-	0xa1, 0x58, 0x3d, 0x60, 0xc5, 0x09, 0xbc, 0x5c, 0x49, 0x06, 0x26, 0x7a, 0xf6, 0x1f, 0x80, 0xd5,
16084
-	0x9e, 0x15, 0x87, 0xec, 0x72, 0x25, 0x19, 0x38, 0x0e, 0xab, 0xc4, 0x16, 0x3a, 0x92, 0x55, 0x81,
16085
-	0x3d, 0x7a, 0x24, 0xab, 0x82, 0xfb, 0xf0, 0x44, 0x56, 0xa1, 0xcf, 0x18, 0x56, 0x05, 0xdd, 0x56,
16086
-	0x92, 0x81, 0x63, 0xb1, 0x0a, 0x8f, 0x55, 0xd1, 0xac, 0x0a, 0x9e, 0x04, 0xa3, 0x59, 0x15, 0x3a,
16087
-	0x9f, 0x25, 0xb2, 0x2a, 0x6e, 0xc0, 0x8a, 0x23, 0x5a, 0x1c, 0xab, 0xc6, 0x9e, 0x6a, 0xff, 0x09,
16088
-	0x29, 0x8e, 0x55, 0x63, 0x78, 0x56, 0x1d, 0xb6, 0x22, 0x3c, 0xef, 0x95, 0xde, 0x7e, 0xb1, 0xbd,
16089
-	0xf0, 0xcf, 0x2f, 0xb6, 0x17, 0x7e, 0x35, 0xdc, 0x4e, 0xbd, 0x1d, 0x6e, 0xa7, 0xfe, 0x31, 0xdc,
16090
-	0x4e, 0xfd, 0x7b, 0xb8, 0x9d, 0x3a, 0x5d, 0xe2, 0xff, 0x12, 0xfa, 0xe4, 0xcb, 0x00, 0x00, 0x00,
16091
-	0xff, 0xff, 0x69, 0xfa, 0x48, 0xde, 0x8b, 0x2a, 0x00, 0x00,
15959
+	// 2137 bytes of a gzipped FileDescriptorProto
15960
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xcc, 0x5a, 0x4f, 0x73, 0x1b, 0x49,
15961
+	0x15, 0xb7, 0xfe, 0xd8, 0x92, 0x9f, 0x6c, 0xd9, 0xee, 0x38, 0xa0, 0x52, 0x82, 0x9d, 0x9a, 0x90,
15962
+	0x44, 0xd9, 0x32, 0x12, 0xab, 0xb0, 0x6c, 0x58, 0x8a, 0x3f, 0x6b, 0x3b, 0x9b, 0xd5, 0x7a, 0xe3,
15963
+	0xa4, 0xc6, 0xc9, 0x16, 0x37, 0x95, 0x2c, 0xb5, 0xbd, 0x13, 0xc9, 0x1a, 0x31, 0x33, 0xf2, 0xae,
15964
+	0x8b, 0x0b, 0x50, 0xcb, 0x81, 0x0f, 0x40, 0x15, 0x57, 0xae, 0x1c, 0x38, 0x70, 0xe2, 0xc0, 0x07,
15965
+	0x48, 0x71, 0xe2, 0xc8, 0xc9, 0xb0, 0xaa, 0x82, 0xe2, 0xc4, 0x67, 0xa0, 0xba, 0xfb, 0xf5, 0xfc,
15966
+	0x53, 0xcf, 0x8c, 0x24, 0xab, 0xca, 0x39, 0x59, 0xd3, 0xf3, 0x7b, 0xfd, 0x5e, 0xf7, 0xfb, 0xf5,
15967
+	0x6f, 0xba, 0x5f, 0x1b, 0x76, 0x4e, 0x0d, 0xe7, 0xf3, 0xe1, 0x71, 0xb5, 0x6d, 0x9e, 0xd5, 0x3a,
15968
+	0x66, 0xbb, 0x4b, 0xad, 0x9a, 0xfd, 0x45, 0xcb, 0x3a, 0xeb, 0x1a, 0x4e, 0xad, 0x35, 0x30, 0x6a,
15969
+	0x6d, 0xb3, 0xef, 0x58, 0x66, 0xaf, 0x3a, 0xb0, 0x4c, 0xc7, 0x24, 0x44, 0x40, 0xaa, 0x12, 0x52,
15970
+	0x3d, 0x7f, 0xb7, 0xfc, 0x4e, 0x42, 0x0f, 0xf6, 0x80, 0xb6, 0x6d, 0x61, 0x5f, 0x4e, 0xf2, 0x66,
15971
+	0x1e, 0xbf, 0xa6, 0x6d, 0x47, 0xa2, 0x93, 0x7a, 0x76, 0x2e, 0x06, 0x54, 0x62, 0x37, 0x4f, 0xcd,
15972
+	0x53, 0x93, 0xff, 0xac, 0xb1, 0x5f, 0xd8, 0xfa, 0x7e, 0x4c, 0x0f, 0x1c, 0x71, 0x3c, 0x3c, 0xa9,
15973
+	0x0d, 0x7a, 0xc3, 0x53, 0xa3, 0x8f, 0x7f, 0x84, 0xa1, 0xf6, 0x1e, 0x14, 0x9f, 0x52, 0xe7, 0xd0,
15974
+	0xec, 0x50, 0x9d, 0xfe, 0x7c, 0x48, 0x6d, 0x87, 0xdc, 0x85, 0x5c, 0xdf, 0xec, 0xd0, 0xa6, 0xd1,
15975
+	0x29, 0xa5, 0xee, 0xa4, 0x2a, 0xcb, 0xbb, 0x30, 0xba, 0xdc, 0x5e, 0x62, 0x88, 0xc6, 0xbe, 0xbe,
15976
+	0xc4, 0x5e, 0x35, 0x3a, 0xda, 0x4f, 0x60, 0xcd, 0x35, 0xb3, 0x07, 0x66, 0xdf, 0xa6, 0x64, 0x07,
15977
+	0xb2, 0xec, 0x25, 0x37, 0x2a, 0xd4, 0x4b, 0xd5, 0xf1, 0x19, 0xac, 0x72, 0x3c, 0x47, 0x69, 0xff,
15978
+	0xc9, 0xc0, 0xfa, 0xa7, 0x86, 0xcd, 0xbb, 0xb0, 0xa5, 0xeb, 0x8f, 0x20, 0x77, 0x62, 0xf4, 0x1c,
15979
+	0x6a, 0xd9, 0xd8, 0xcb, 0x8e, 0xaa, 0x97, 0xb0, 0x59, 0xf5, 0x23, 0x61, 0xa3, 0x4b, 0xe3, 0xf2,
15980
+	0x6f, 0x33, 0x90, 0xc3, 0x46, 0xb2, 0x09, 0x8b, 0xfd, 0xd6, 0x19, 0x65, 0x3d, 0x66, 0x2a, 0xcb,
15981
+	0xba, 0x78, 0x20, 0x35, 0x28, 0x18, 0x9d, 0xe6, 0xc0, 0xa2, 0x27, 0xc6, 0x97, 0xd4, 0x2e, 0xa5,
15982
+	0xd9, 0xbb, 0xdd, 0xe2, 0xe8, 0x72, 0x1b, 0x1a, 0xfb, 0x2f, 0xb0, 0x55, 0x07, 0xa3, 0x23, 0x7f,
15983
+	0x93, 0x17, 0xb0, 0xd4, 0x6b, 0x1d, 0xd3, 0x9e, 0x5d, 0xca, 0xdc, 0xc9, 0x54, 0x0a, 0xf5, 0xc7,
15984
+	0xd3, 0x44, 0x56, 0xfd, 0x94, 0x9b, 0x3e, 0xe9, 0x3b, 0xd6, 0x85, 0x8e, 0xfd, 0x90, 0x67, 0x50,
15985
+	0x38, 0xa3, 0x67, 0xc7, 0xd4, 0xb2, 0x3f, 0x37, 0x06, 0x76, 0x29, 0x7b, 0x27, 0x53, 0x29, 0xd6,
15986
+	0x1f, 0x44, 0x4d, 0xdb, 0xd1, 0x80, 0xb6, 0xab, 0xcf, 0x5c, 0xfc, 0x6e, 0x7a, 0x7d, 0x41, 0xf7,
15987
+	0xdb, 0x93, 0xef, 0xc3, 0xa2, 0x65, 0xf6, 0xa8, 0x5d, 0x5a, 0xe4, 0x1d, 0xdd, 0x8e, 0x9c, 0x7f,
15988
+	0xb3, 0x47, 0xb9, 0xb5, 0x80, 0x93, 0xbb, 0xb0, 0xca, 0xa6, 0xc4, 0x9b, 0x8b, 0x25, 0x3e, 0x4f,
15989
+	0x2b, 0xac, 0x51, 0x8e, 0xbe, 0xfc, 0x03, 0x28, 0xf8, 0x86, 0x40, 0xd6, 0x21, 0xd3, 0xa5, 0x17,
15990
+	0x82, 0x1e, 0x3a, 0xfb, 0xc9, 0x66, 0xf9, 0xbc, 0xd5, 0x1b, 0xd2, 0x52, 0x9a, 0xb7, 0x89, 0x87,
15991
+	0x0f, 0xd2, 0x8f, 0x53, 0xda, 0x1e, 0x6c, 0xf8, 0xa6, 0x05, 0xb9, 0x52, 0x85, 0x45, 0xc6, 0x02,
15992
+	0x91, 0x94, 0x38, 0xb2, 0x08, 0x98, 0xf6, 0xc7, 0x14, 0x6c, 0xbc, 0x1a, 0x74, 0x5a, 0x0e, 0x9d,
15993
+	0x96, 0xa9, 0xe4, 0xc7, 0xb0, 0xc2, 0x41, 0xe7, 0xd4, 0xb2, 0x0d, 0xb3, 0xcf, 0x03, 0x2c, 0xd4,
15994
+	0x6f, 0xa9, 0x3c, 0x7e, 0x26, 0x20, 0x7a, 0x81, 0x19, 0xe0, 0x03, 0xf9, 0x2e, 0x64, 0xd9, 0xc2,
15995
+	0x2e, 0x65, 0xb8, 0xdd, 0xed, 0xb8, 0xfc, 0xe8, 0x1c, 0xa9, 0xed, 0x02, 0xf1, 0xc7, 0x3a, 0xd3,
15996
+	0xf2, 0x38, 0x84, 0x0d, 0x9d, 0x9e, 0x99, 0xe7, 0xd3, 0x8f, 0x77, 0x13, 0x16, 0x4f, 0x4c, 0xab,
15997
+	0x2d, 0x32, 0x91, 0xd7, 0xc5, 0x83, 0xb6, 0x09, 0xc4, 0xdf, 0x9f, 0x88, 0x09, 0x17, 0xff, 0xcb,
15998
+	0x96, 0xdd, 0xf5, 0xb9, 0x70, 0x5a, 0x76, 0x37, 0xe4, 0x82, 0x21, 0x98, 0x0b, 0xf6, 0xca, 0x5d,
15999
+	0xfc, 0xc2, 0xcc, 0x1b, 0x1d, 0x7b, 0x19, 0x37, 0x3a, 0x8e, 0xe7, 0x28, 0xed, 0xb1, 0x1c, 0xdd,
16000
+	0xd4, 0xae, 0xdd, 0x71, 0xf8, 0xbd, 0x6b, 0x7f, 0xcd, 0x0a, 0x31, 0x61, 0x8d, 0x33, 0x88, 0x89,
16001
+	0xdf, 0x6c, 0x5c, 0x4c, 0xfe, 0x79, 0x8d, 0x62, 0xa2, 0x8a, 0x4c, 0x29, 0x26, 0x35, 0x28, 0xd8,
16002
+	0xd4, 0x3a, 0x37, 0xda, 0x8c, 0x1d, 0x42, 0x4c, 0x30, 0x84, 0x23, 0xd1, 0xdc, 0xd8, 0xb7, 0x75,
16003
+	0x40, 0x48, 0xa3, 0x63, 0x93, 0xfb, 0x90, 0x47, 0x2e, 0x09, 0xc5, 0x58, 0xde, 0x2d, 0x8c, 0x2e,
16004
+	0xb7, 0x73, 0x82, 0x4c, 0xb6, 0x9e, 0x13, 0x6c, 0xb2, 0xc9, 0xc7, 0x50, 0xec, 0x50, 0xdb, 0xb0,
16005
+	0x68, 0xa7, 0x69, 0x3b, 0x2d, 0x07, 0xf5, 0xa1, 0x58, 0xff, 0x56, 0x54, 0x8a, 0x8f, 0x18, 0x8a,
16006
+	0x0b, 0xcc, 0x2a, 0x1a, 0xf2, 0x16, 0x85, 0xd0, 0xe4, 0xc6, 0x85, 0x86, 0xdc, 0x06, 0x18, 0x0e,
16007
+	0x9a, 0x8e, 0xd9, 0x64, 0xeb, 0xa7, 0x94, 0xe7, 0x14, 0xce, 0x0f, 0x07, 0x2f, 0xcd, 0xfd, 0x96,
16008
+	0x43, 0x49, 0x19, 0xf2, 0xd6, 0xb0, 0xef, 0x18, 0x2c, 0x03, 0xcb, 0xdc, 0xda, 0x7d, 0x9e, 0x83,
16009
+	0x44, 0xe1, 0x64, 0x7b, 0x12, 0xc5, 0x38, 0x17, 0x2b, 0x51, 0x9c, 0x84, 0x02, 0xa6, 0x1d, 0xc0,
16010
+	0xe6, 0x9e, 0x45, 0x5b, 0x0e, 0xc5, 0x09, 0x97, 0x34, 0x7c, 0x84, 0xfa, 0x21, 0x38, 0xb8, 0xad,
16011
+	0xea, 0x06, 0x2d, 0x7c, 0x12, 0x72, 0x08, 0x37, 0x43, 0x9d, 0x61, 0x54, 0xef, 0x41, 0x0e, 0x93,
16012
+	0x88, 0x1d, 0xde, 0x8a, 0xe9, 0x50, 0x97, 0x58, 0xed, 0x35, 0x6c, 0x3c, 0xa5, 0x4e, 0x28, 0xb2,
16013
+	0x1d, 0x00, 0x8f, 0x33, 0xb8, 0xe6, 0x56, 0x47, 0x97, 0xdb, 0xcb, 0x2e, 0x65, 0xf4, 0x65, 0x97,
16014
+	0x31, 0xe4, 0x01, 0xac, 0x19, 0x7d, 0x9b, 0x5a, 0x4e, 0xb3, 0x43, 0x4f, 0x5a, 0xc3, 0x9e, 0x63,
16015
+	0xa3, 0xc2, 0x14, 0x45, 0xf3, 0x3e, 0xb6, 0x6a, 0x07, 0x40, 0xfc, 0xbe, 0xae, 0x16, 0xf8, 0x9f,
16016
+	0xd3, 0xb0, 0x29, 0xc4, 0xf4, 0x4a, 0xc1, 0xef, 0xc3, 0x9a, 0x44, 0x4f, 0xf1, 0x1d, 0x28, 0xa2,
16017
+	0x8d, 0xfc, 0x14, 0x3c, 0x0a, 0x7c, 0x0a, 0x26, 0x4b, 0x25, 0x79, 0x06, 0x79, 0xcb, 0xec, 0xf5,
16018
+	0x8e, 0x5b, 0xed, 0x6e, 0x29, 0x7b, 0x27, 0x55, 0x29, 0xd6, 0xdf, 0x55, 0x19, 0xaa, 0x06, 0x59,
16019
+	0xd5, 0xd1, 0x50, 0x77, 0xbb, 0xd0, 0x34, 0xc8, 0xcb, 0x56, 0x92, 0x87, 0xec, 0xe1, 0xf3, 0xc3,
16020
+	0x27, 0xeb, 0x0b, 0x64, 0x05, 0xf2, 0x2f, 0xf4, 0x27, 0x9f, 0x35, 0x9e, 0xbf, 0x3a, 0x5a, 0x4f,
16021
+	0x31, 0xf6, 0x84, 0xba, 0xbb, 0x5a, 0x12, 0xf6, 0x61, 0x53, 0x88, 0xee, 0x55, 0x72, 0xa0, 0x7d,
16022
+	0x13, 0x6e, 0x86, 0x7a, 0x41, 0xf5, 0xfe, 0x2a, 0x03, 0x37, 0xd8, 0xfa, 0xc3, 0x76, 0x57, 0xc0,
16023
+	0x1b, 0x61, 0x01, 0xaf, 0x45, 0xc9, 0x64, 0xc8, 0x72, 0x5c, 0xc3, 0xff, 0x90, 0x9e, 0xbb, 0x86,
16024
+	0x1f, 0x85, 0x34, 0xfc, 0x87, 0x53, 0x06, 0xa7, 0x94, 0xf1, 0x31, 0x8d, 0xcc, 0x2a, 0x34, 0xd2,
16025
+	0xaf, 0x82, 0x8b, 0xf3, 0x53, 0xc1, 0xe7, 0xb0, 0x19, 0x0c, 0x17, 0x49, 0xf3, 0x3e, 0xe4, 0x31,
16026
+	0x89, 0x52, 0x0b, 0x63, 0x59, 0xe3, 0x82, 0x3d, 0x45, 0x3c, 0xa4, 0xce, 0x17, 0xa6, 0xd5, 0x9d,
16027
+	0x42, 0x11, 0xd1, 0x42, 0xa5, 0x88, 0x6e, 0x67, 0x1e, 0xa7, 0xfb, 0xa2, 0x29, 0x8e, 0xd3, 0xd2,
16028
+	0x4a, 0x62, 0xb5, 0x57, 0x5c, 0x11, 0x43, 0x91, 0x11, 0xc8, 0xb2, 0x99, 0xc6, 0xf9, 0xe2, 0xbf,
16029
+	0x19, 0xc9, 0xd1, 0x86, 0x91, 0x3c, 0xed, 0x91, 0x1c, 0x6d, 0x19, 0xc9, 0x11, 0xd0, 0xe8, 0xa0,
16030
+	0xf8, 0xcd, 0x29, 0xc6, 0x9f, 0xc9, 0x75, 0x37, 0xf7, 0x30, 0xdd, 0xb5, 0x18, 0x8a, 0x54, 0xfb,
16031
+	0x6f, 0x5a, 0xac, 0x45, 0x6c, 0x9f, 0x61, 0x2d, 0x86, 0x2c, 0xc7, 0xd7, 0xe2, 0x6f, 0xae, 0x71,
16032
+	0x2d, 0x46, 0x04, 0x37, 0xf3, 0x5a, 0x9c, 0xc3, 0x7a, 0xf3, 0x42, 0xf2, 0xd6, 0x1b, 0x26, 0x2a,
16033
+	0x76, 0xbd, 0xc9, 0xcc, 0xb9, 0x60, 0xed, 0x43, 0x4e, 0xe9, 0xbd, 0xde, 0xd0, 0x76, 0xa8, 0xe5,
16034
+	0xd3, 0xe8, 0xb6, 0x68, 0x09, 0x69, 0x34, 0xe2, 0x18, 0x2f, 0x10, 0xe0, 0xd2, 0xd7, 0xed, 0xc2,
16035
+	0xa3, 0x2f, 0x42, 0xe2, 0xe8, 0x2b, 0xad, 0x24, 0xd6, 0xe5, 0x12, 0xbe, 0x98, 0x81, 0x4b, 0x21,
16036
+	0xcb, 0xb7, 0x8b, 0x4b, 0x11, 0xc1, 0x5d, 0x27, 0x97, 0xbc, 0x90, 0x3c, 0x2e, 0x61, 0x36, 0x62,
16037
+	0xb9, 0x24, 0x53, 0xe7, 0x82, 0xb5, 0xdf, 0xa5, 0xa0, 0x70, 0x40, 0x2f, 0x74, 0xd3, 0x69, 0x39,
16038
+	0x6c, 0xeb, 0xf3, 0x0e, 0x6c, 0x30, 0x92, 0x51, 0xab, 0xf9, 0xda, 0x34, 0xfa, 0x4d, 0xc7, 0xec,
16039
+	0xd2, 0x3e, 0x0f, 0x2d, 0xaf, 0xaf, 0x89, 0x17, 0x9f, 0x98, 0x46, 0xff, 0x25, 0x6b, 0x26, 0x3b,
16040
+	0x40, 0xce, 0x5a, 0xfd, 0xd6, 0x69, 0x10, 0x2c, 0x36, 0x8b, 0xeb, 0xf8, 0x46, 0x89, 0x1e, 0xf6,
16041
+	0x7b, 0x66, 0xbb, 0xdb, 0x64, 0xa3, 0xce, 0x04, 0xd0, 0xaf, 0xf8, 0x8b, 0x03, 0x7a, 0xa1, 0xfd,
16042
+	0xda, 0xdd, 0x0f, 0x5e, 0x85, 0xe7, 0x6c, 0x3f, 0x28, 0xd1, 0xd3, 0xec, 0x07, 0xd1, 0x66, 0x8a,
16043
+	0xfd, 0x20, 0x7a, 0xf7, 0xed, 0x07, 0x3f, 0x64, 0xfb, 0x41, 0x31, 0xab, 0x7c, 0x3f, 0x18, 0x61,
16044
+	0xe8, 0x9b, 0xfc, 0xdd, 0xec, 0x9b, 0xcb, 0xed, 0x05, 0xdd, 0x35, 0xf3, 0xf6, 0x77, 0x73, 0x5a,
16045
+	0xa8, 0x3f, 0x82, 0x75, 0xbe, 0x63, 0x6f, 0x5b, 0xd4, 0x91, 0xf3, 0xf9, 0x10, 0x96, 0x6d, 0xde,
16046
+	0xe0, 0x4d, 0xe7, 0xca, 0xe8, 0x72, 0x3b, 0x2f, 0x50, 0x8d, 0x7d, 0xf6, 0x9d, 0xe7, 0xbf, 0x3a,
16047
+	0xda, 0x53, 0x3c, 0x5c, 0x08, 0x73, 0x0c, 0xa5, 0x0e, 0x4b, 0x02, 0x80, 0x91, 0x94, 0xd5, 0x7b,
16048
+	0x06, 0x6e, 0x83, 0x48, 0xed, 0x2f, 0x29, 0xb8, 0x21, 0x37, 0xae, 0xb3, 0xc5, 0x42, 0x76, 0xa1,
16049
+	0x88, 0xd0, 0x29, 0xf2, 0xba, 0x2a, 0x4c, 0x64, 0x5a, 0xeb, 0x81, 0xb4, 0x6e, 0x45, 0x07, 0xee,
16050
+	0xdb, 0x9e, 0x7c, 0xe2, 0x1d, 0x53, 0xae, 0x3c, 0x0d, 0xff, 0x4e, 0x03, 0x11, 0x3b, 0x31, 0xf6,
16051
+	0xe8, 0xca, 0xe6, 0xc7, 0x61, 0xd9, 0xac, 0x46, 0xef, 0x38, 0xfd, 0x86, 0xe3, 0xaa, 0xf9, 0xd5,
16052
+	0xfc, 0x55, 0x53, 0x0f, 0xa9, 0xe6, 0x07, 0xd3, 0xc5, 0x76, 0x2d, 0xa2, 0x79, 0x20, 0x8f, 0x1d,
16053
+	0x18, 0x11, 0xa6, 0xec, 0x7b, 0xec, 0x90, 0xc4, 0x9b, 0x50, 0x32, 0xe3, 0x72, 0x26, 0xa1, 0x5a,
16054
+	0x03, 0x6e, 0xc8, 0x13, 0xbb, 0x9f, 0xba, 0xf5, 0xc0, 0x5e, 0x77, 0x62, 0x2e, 0x05, 0xbb, 0xba,
16055
+	0x02, 0x97, 0x7e, 0x0a, 0x37, 0xe4, 0xa1, 0x6b, 0xc6, 0xd5, 0xfd, 0x0d, 0xef, 0xf0, 0xe7, 0x8f,
16056
+	0x06, 0x45, 0x63, 0xcf, 0xec, 0x9f, 0x18, 0xa7, 0xbe, 0x6e, 0xdb, 0xbc, 0x21, 0xd4, 0xad, 0x40,
16057
+	0xb1, 0x6e, 0xc5, 0x6b, 0x57, 0x34, 0xa4, 0xb9, 0x37, 0x42, 0x01, 0x88, 0x1b, 0x21, 0xda, 0x20,
16058
+	0xd2, 0x27, 0x1a, 0xb3, 0xc6, 0xc2, 0x44, 0x03, 0xa1, 0xd3, 0x88, 0x86, 0x30, 0x99, 0x42, 0x34,
16059
+	0x84, 0x67, 0x95, 0x68, 0xcc, 0x61, 0x1a, 0xa4, 0x68, 0x88, 0xe6, 0x19, 0x44, 0x23, 0x68, 0xf8,
16060
+	0x76, 0x89, 0x86, 0x3a, 0xb6, 0xeb, 0x14, 0x0d, 0x37, 0x22, 0x4f, 0x34, 0x44, 0x22, 0x62, 0x45,
16061
+	0x03, 0x73, 0x26, 0xa1, 0x9e, 0x68, 0x04, 0xa9, 0x3b, 0x81, 0x68, 0xa8, 0xb8, 0x14, 0xec, 0xea,
16062
+	0x0a, 0x5c, 0x72, 0x45, 0x63, 0xe6, 0xd5, 0xed, 0x8a, 0x46, 0x30, 0x9a, 0xfa, 0xaf, 0x6e, 0x41,
16063
+	0x6e, 0x4f, 0x5c, 0xb4, 0x12, 0x03, 0x72, 0x78, 0x85, 0x48, 0x34, 0x55, 0x50, 0xc1, 0x6b, 0xc9,
16064
+	0xf2, 0xdd, 0x58, 0x0c, 0x8a, 0xd2, 0xcd, 0xbf, 0xfd, 0xe9, 0x7f, 0xbf, 0x4f, 0xaf, 0xc1, 0x2a,
16065
+	0x07, 0x7d, 0x07, 0xb7, 0x8f, 0xc4, 0x84, 0x65, 0xf7, 0x0e, 0x8a, 0x7c, 0x7b, 0x92, 0x9b, 0xbb,
16066
+	0xf2, 0xbd, 0x04, 0x54, 0xbc, 0x43, 0x0b, 0xc0, 0xbb, 0x02, 0x22, 0xf7, 0xa2, 0x0b, 0x7e, 0xfe,
16067
+	0x11, 0xde, 0x4f, 0x82, 0x25, 0xfa, 0xf4, 0xae, 0x78, 0xd4, 0x3e, 0xc7, 0xae, 0x94, 0xd4, 0x3e,
16068
+	0x15, 0x37, 0x45, 0x11, 0x3e, 0x45, 0x0e, 0x5f, 0xb6, 0xec, 0x6e, 0x64, 0x0e, 0x7d, 0x57, 0x3c,
16069
+	0x91, 0x39, 0x0c, 0x5c, 0xe6, 0xc4, 0xe7, 0x90, 0x17, 0xe9, 0xa3, 0x73, 0xe8, 0xbf, 0x30, 0x89,
16070
+	0xce, 0x61, 0xa0, 0xd2, 0x9f, 0x38, 0x9f, 0x7c, 0x78, 0x31, 0xf3, 0xe9, 0x1f, 0xe1, 0xfd, 0x24,
16071
+	0x58, 0xa2, 0x4f, 0xaf, 0x76, 0xae, 0xf6, 0x39, 0x56, 0xc7, 0x57, 0xfb, 0x1c, 0x2f, 0xc1, 0x47,
16072
+	0xf9, 0xfc, 0x12, 0x56, 0xfc, 0x75, 0x3f, 0xf2, 0x60, 0xc2, 0x42, 0x66, 0xb9, 0x92, 0x0c, 0x8c,
16073
+	0xf7, 0xfc, 0x0b, 0x58, 0x0d, 0xdc, 0x72, 0x10, 0x65, 0x8f, 0xaa, 0x5b, 0x95, 0xf2, 0xc3, 0x09,
16074
+	0x90, 0x89, 0xce, 0x03, 0x45, 0x72, 0xb5, 0x73, 0x55, 0x59, 0x5e, 0xed, 0x5c, 0x59, 0x71, 0x8f,
16075
+	0x71, 0x1e, 0xa8, 0x85, 0xab, 0x9d, 0xab, 0x8a, 0xee, 0x6a, 0xe7, 0xea, 0xc2, 0x7a, 0x2c, 0xc9,
16076
+	0xb0, 0x7e, 0x14, 0x49, 0xb2, 0x60, 0xcd, 0x31, 0x92, 0x64, 0xe1, 0x02, 0x62, 0x3c, 0xc9, 0x64,
16077
+	0xb1, 0x2b, 0x9a, 0x64, 0xa1, 0x0a, 0x5d, 0x34, 0xc9, 0xc2, 0x75, 0xb3, 0x44, 0x92, 0xc9, 0x01,
16078
+	0xc7, 0x90, 0x2c, 0x34, 0xe6, 0x87, 0x13, 0x20, 0x27, 0xcc, 0x73, 0xac, 0x73, 0x55, 0x91, 0x37,
16079
+	0x2e, 0xcf, 0x13, 0x3a, 0x17, 0x79, 0xc6, 0xd3, 0x7e, 0x64, 0x9e, 0x83, 0x75, 0x94, 0xc8, 0x3c,
16080
+	0x87, 0x4a, 0x0d, 0x09, 0x79, 0x96, 0x85, 0xa8, 0xe8, 0x3c, 0x87, 0xaa, 0x67, 0xd1, 0x79, 0x0e,
16081
+	0xd7, 0xb4, 0x12, 0xd7, 0xb3, 0x1c, 0x70, 0xcc, 0x7a, 0x0e, 0x8d, 0xf9, 0xe1, 0x04, 0xc8, 0xc4,
16082
+	0x8f, 0x93, 0x5b, 0x02, 0x51, 0x7f, 0x9c, 0xc2, 0x05, 0x96, 0xf2, 0xbd, 0x04, 0x54, 0xe2, 0x3c,
16083
+	0xfb, 0xeb, 0x0d, 0xea, 0x79, 0x56, 0xd4, 0x52, 0xca, 0x95, 0x64, 0x60, 0xbc, 0xe7, 0x21, 0x14,
16084
+	0x7c, 0xa7, 0x66, 0x72, 0x7f, 0xb2, 0x83, 0x7e, 0xf9, 0x41, 0x22, 0x2e, 0x71, 0xc0, 0xfe, 0x43,
16085
+	0xb1, 0x7a, 0xc0, 0x8a, 0x13, 0x78, 0xb9, 0x92, 0x0c, 0x4c, 0xf4, 0xec, 0x3f, 0x00, 0xab, 0x3d,
16086
+	0x2b, 0x0e, 0xd9, 0xe5, 0x4a, 0x32, 0x70, 0x12, 0x56, 0x89, 0x2d, 0x74, 0x24, 0xab, 0x02, 0x7b,
16087
+	0xf4, 0x48, 0x56, 0x05, 0xf7, 0xe1, 0x89, 0xac, 0x42, 0x9f, 0x31, 0xac, 0x0a, 0xba, 0xad, 0x24,
16088
+	0x03, 0x27, 0x62, 0x15, 0x1e, 0xab, 0xa2, 0x59, 0x15, 0x3c, 0x09, 0x46, 0xb3, 0x2a, 0x74, 0x3e,
16089
+	0x4b, 0x64, 0x55, 0xdc, 0x80, 0x15, 0x47, 0xb4, 0x38, 0x56, 0x4d, 0x3c, 0xd5, 0xfe, 0x13, 0x52,
16090
+	0x1c, 0xab, 0x26, 0xf0, 0xac, 0x3a, 0x6c, 0x45, 0x78, 0xde, 0x2d, 0xbd, 0xf9, 0x7a, 0x6b, 0xe1,
16091
+	0x1f, 0x5f, 0x6f, 0x2d, 0xfc, 0x72, 0xb4, 0x95, 0x7a, 0x33, 0xda, 0x4a, 0xfd, 0x7d, 0xb4, 0x95,
16092
+	0xfa, 0xd7, 0x68, 0x2b, 0x75, 0xbc, 0xc4, 0xff, 0x25, 0xf4, 0xd1, 0xff, 0x03, 0x00, 0x00, 0xff,
16093
+	0xff, 0x47, 0x18, 0x50, 0x6c, 0x2b, 0x2b, 0x00, 0x00,
16092 16094
 }
... ...
@@ -2,11 +2,11 @@ syntax = "proto3";
2 2
 
3 3
 package docker.swarmkit.v1;
4 4
 
5
-import "specs.proto";
6
-import "objects.proto";
7
-import "types.proto";
5
+import "github.com/docker/swarmkit/api/specs.proto";
6
+import "github.com/docker/swarmkit/api/objects.proto";
7
+import "github.com/docker/swarmkit/api/types.proto";
8 8
 import "gogoproto/gogo.proto";
9
-import "plugin/plugin.proto";
9
+import "github.com/docker/swarmkit/protobuf/plugin/plugin.proto";
10 10
 
11 11
 // Control defines the RPC methods for controlling a cluster.
12 12
 service Control {
... ...
@@ -1,5 +1,5 @@
1 1
 // Code generated by protoc-gen-gogo.
2
-// source: dispatcher.proto
2
+// source: github.com/docker/swarmkit/api/dispatcher.proto
3 3
 // DO NOT EDIT!
4 4
 
5 5
 package api
... ...
@@ -1100,7 +1100,7 @@ var _Dispatcher_serviceDesc = grpc.ServiceDesc{
1100 1100
 			ServerStreams: true,
1101 1101
 		},
1102 1102
 	},
1103
-	Metadata: "dispatcher.proto",
1103
+	Metadata: "github.com/docker/swarmkit/api/dispatcher.proto",
1104 1104
 }
1105 1105
 
1106 1106
 func (m *SessionRequest) Marshal() (dAtA []byte, err error) {
... ...
@@ -3778,70 +3778,73 @@ var (
3778 3778
 	ErrIntOverflowDispatcher   = fmt.Errorf("proto: integer overflow")
3779 3779
 )
3780 3780
 
3781
-func init() { proto.RegisterFile("dispatcher.proto", fileDescriptorDispatcher) }
3781
+func init() {
3782
+	proto.RegisterFile("github.com/docker/swarmkit/api/dispatcher.proto", fileDescriptorDispatcher)
3783
+}
3782 3784
 
3783 3785
 var fileDescriptorDispatcher = []byte{
3784
-	// 983 bytes of a gzipped FileDescriptorProto
3785
-	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x55, 0x4f, 0x6f, 0x1b, 0x45,
3786
-	0x14, 0xf7, 0x38, 0xce, 0x26, 0x7e, 0x4e, 0x82, 0x19, 0xaa, 0xb0, 0xac, 0x54, 0xc7, 0x6c, 0x68,
3787
-	0x14, 0xa9, 0x61, 0x53, 0xcc, 0x9f, 0x0b, 0x51, 0x20, 0x8e, 0x2d, 0xc5, 0x6a, 0x93, 0x46, 0x13,
3788
-	0xb7, 0x3d, 0x5a, 0x6b, 0xef, 0x74, 0xb3, 0x38, 0xde, 0x59, 0x76, 0xc6, 0x2d, 0x3e, 0x20, 0x71,
3789
-	0xa0, 0x12, 0xe2, 0x84, 0x38, 0x45, 0x42, 0x7c, 0x05, 0xc4, 0xc7, 0x88, 0x38, 0x71, 0xe4, 0x14,
3790
-	0xa8, 0x3f, 0x00, 0x1f, 0x80, 0x13, 0xda, 0xd9, 0x59, 0xdb, 0x75, 0xed, 0xd4, 0xc9, 0xc9, 0x9e,
3791
-	0x37, 0xbf, 0xdf, 0x9b, 0xdf, 0xbc, 0xf7, 0xdb, 0x37, 0x90, 0x77, 0x3c, 0x1e, 0xd8, 0xa2, 0x75,
3792
-	0x4a, 0x43, 0x2b, 0x08, 0x99, 0x60, 0x18, 0x3b, 0xac, 0xd5, 0xa6, 0xa1, 0xc5, 0x9f, 0xdb, 0x61,
3793
-	0xa7, 0xed, 0x09, 0xeb, 0xd9, 0x47, 0x46, 0x4e, 0xf4, 0x02, 0xca, 0x63, 0x80, 0xb1, 0xcc, 0x9a,
3794
-	0x5f, 0xd1, 0x96, 0x48, 0x96, 0xb7, 0x5c, 0xe6, 0x32, 0xf9, 0x77, 0x3b, 0xfa, 0xa7, 0xa2, 0xef,
3795
-	0x04, 0x67, 0x5d, 0xd7, 0xf3, 0xb7, 0xe3, 0x1f, 0x15, 0x2c, 0xb8, 0x8c, 0xb9, 0x67, 0x74, 0x5b,
3796
-	0xae, 0x9a, 0xdd, 0xa7, 0xdb, 0x4e, 0x37, 0xb4, 0x85, 0xc7, 0xd4, 0xbe, 0xf9, 0x02, 0xc1, 0xca,
3797
-	0x09, 0xe5, 0xdc, 0x63, 0x3e, 0xa1, 0x5f, 0x77, 0x29, 0x17, 0xb8, 0x0a, 0x39, 0x87, 0xf2, 0x56,
3798
-	0xe8, 0x05, 0x11, 0x4e, 0x47, 0x45, 0xb4, 0x99, 0x2b, 0xad, 0x5b, 0xaf, 0x6b, 0xb4, 0x8e, 0x98,
3799
-	0x43, 0x2b, 0x43, 0x28, 0x19, 0xe5, 0xe1, 0x2d, 0x00, 0x1e, 0x27, 0x6e, 0x78, 0x8e, 0x9e, 0x2e,
3800
-	0xa2, 0xcd, 0x6c, 0x79, 0xb9, 0x7f, 0xb9, 0x96, 0x55, 0xc7, 0xd5, 0x2a, 0x24, 0xab, 0x00, 0x35,
3801
-	0xc7, 0xfc, 0x25, 0x3d, 0xd0, 0x71, 0x48, 0x39, 0xb7, 0x5d, 0x3a, 0x96, 0x00, 0x5d, 0x9d, 0x00,
3802
-	0x6f, 0x41, 0xc6, 0x67, 0x0e, 0x95, 0x07, 0xe5, 0x4a, 0xfa, 0x34, 0xb9, 0x44, 0xa2, 0xf0, 0x0e,
3803
-	0x2c, 0x76, 0x6c, 0xdf, 0x76, 0x69, 0xc8, 0xf5, 0xb9, 0xe2, 0xdc, 0x66, 0xae, 0x54, 0x9c, 0xc4,
3804
-	0x78, 0x42, 0x3d, 0xf7, 0x54, 0x50, 0xe7, 0x98, 0xd2, 0x90, 0x0c, 0x18, 0xf8, 0x09, 0xac, 0xfa,
3805
-	0x54, 0x3c, 0x67, 0x61, 0xbb, 0xd1, 0x64, 0x4c, 0x70, 0x11, 0xda, 0x41, 0xa3, 0x4d, 0x7b, 0x5c,
3806
-	0xcf, 0xc8, 0x5c, 0xef, 0x4f, 0xca, 0x55, 0xf5, 0x5b, 0x61, 0x4f, 0x96, 0xe6, 0x3e, 0xed, 0x91,
3807
-	0x5b, 0x2a, 0x41, 0x39, 0xe1, 0xdf, 0xa7, 0x3d, 0x8e, 0x57, 0x41, 0x23, 0x8c, 0x89, 0xfd, 0x3d,
3808
-	0x7d, 0xbe, 0x88, 0x36, 0x97, 0x88, 0x5a, 0x99, 0x5f, 0x42, 0xfe, 0x80, 0xda, 0xa1, 0x68, 0x52,
3809
-	0x5b, 0x24, 0x6d, 0xba, 0x56, 0x79, 0xcc, 0x63, 0x78, 0x7b, 0x24, 0x03, 0x0f, 0x98, 0xcf, 0x29,
3810
-	0xfe, 0x1c, 0xb4, 0x80, 0x86, 0x1e, 0x73, 0x54, 0x93, 0xdf, 0xb3, 0x62, 0xb7, 0x58, 0x89, 0x5b,
3811
-	0xac, 0x8a, 0x72, 0x4b, 0x79, 0xf1, 0xe2, 0x72, 0x2d, 0x75, 0xfe, 0xf7, 0x1a, 0x22, 0x8a, 0x62,
3812
-	0xfe, 0x94, 0x86, 0x77, 0x1f, 0x05, 0x8e, 0x2d, 0x68, 0xdd, 0xe6, 0xed, 0x13, 0x61, 0x8b, 0x2e,
3813
-	0xbf, 0x91, 0x36, 0xfc, 0x18, 0x16, 0xba, 0x32, 0x51, 0xd2, 0x8b, 0x9d, 0x49, 0xf5, 0x9b, 0x72,
3814
-	0x96, 0x35, 0x8c, 0xc4, 0x08, 0x92, 0x24, 0x33, 0x18, 0xe4, 0xc7, 0x37, 0xf1, 0x3a, 0x2c, 0x08,
3815
-	0x9b, 0xb7, 0x87, 0xb2, 0xa0, 0x7f, 0xb9, 0xa6, 0x45, 0xb0, 0x5a, 0x85, 0x68, 0xd1, 0x56, 0xcd,
3816
-	0xc1, 0x9f, 0x81, 0xc6, 0x25, 0x49, 0xb9, 0xa9, 0x30, 0x49, 0xcf, 0x88, 0x12, 0x85, 0x36, 0x0d,
3817
-	0xd0, 0x5f, 0x57, 0x19, 0xd7, 0xda, 0xdc, 0x81, 0xa5, 0x28, 0x7a, 0xb3, 0x12, 0x99, 0xbb, 0x8a,
3818
-	0x9d, 0x7c, 0x1b, 0x16, 0xcc, 0x47, 0x5a, 0xb9, 0x8e, 0x64, 0xc1, 0xf4, 0x69, 0x02, 0x49, 0x0c,
3819
-	0x33, 0xcb, 0x80, 0xf7, 0x38, 0xf7, 0x5c, 0xbf, 0x43, 0x7d, 0x71, 0x43, 0x0d, 0xbf, 0x23, 0x80,
3820
-	0x61, 0x12, 0x6c, 0x41, 0x26, 0xca, 0xad, 0xac, 0x33, 0x55, 0xc1, 0x41, 0x8a, 0x48, 0x1c, 0xfe,
3821
-	0x04, 0x34, 0x4e, 0x5b, 0x21, 0x15, 0xaa, 0xa8, 0xc6, 0x24, 0xc6, 0x89, 0x44, 0x1c, 0xa4, 0x88,
3822
-	0xc2, 0x46, 0xac, 0x16, 0xf3, 0x9f, 0x7a, 0xae, 0x3e, 0x37, 0x9d, 0xb5, 0x2f, 0x11, 0x11, 0x2b,
3823
-	0xc6, 0x96, 0x35, 0xc8, 0x78, 0x82, 0x76, 0xcc, 0x17, 0x69, 0xc8, 0x0f, 0x25, 0xef, 0x9f, 0xda,
3824
-	0xbe, 0x4b, 0xf1, 0x2e, 0x80, 0x3d, 0x88, 0x29, 0xf9, 0x13, 0x3b, 0x3c, 0x64, 0x92, 0x11, 0x06,
3825
-	0x3e, 0x04, 0xcd, 0x6e, 0xc9, 0xd1, 0x18, 0x5d, 0x64, 0xa5, 0xf4, 0xe9, 0xd5, 0xdc, 0xf8, 0xd4,
3826
-	0x91, 0xc0, 0x9e, 0x24, 0x13, 0x95, 0xc4, 0x6c, 0x8e, 0x4a, 0x8c, 0xf7, 0xf0, 0x06, 0x68, 0x8f,
3827
-	0x8e, 0x2b, 0x7b, 0xf5, 0x6a, 0x3e, 0x65, 0x18, 0x3f, 0xfe, 0x5a, 0x5c, 0x1d, 0x47, 0x28, 0x37,
3828
-	0x6f, 0x80, 0x46, 0xaa, 0x87, 0x0f, 0x1f, 0x57, 0xf3, 0x68, 0x32, 0x8e, 0xd0, 0x0e, 0x7b, 0x46,
3829
-	0xcd, 0xff, 0xd0, 0x2b, 0xfd, 0x4f, 0x5c, 0xf4, 0x05, 0x64, 0xa2, 0x57, 0x46, 0xd6, 0x60, 0xa5,
3830
-	0x74, 0xf7, 0xea, 0x7b, 0x24, 0x2c, 0xab, 0xde, 0x0b, 0x28, 0x91, 0x44, 0x7c, 0x1b, 0xc0, 0x0e,
3831
-	0x82, 0x33, 0x8f, 0xf2, 0x86, 0x60, 0xf1, 0x8c, 0x27, 0x59, 0x15, 0xa9, 0xb3, 0x68, 0x3b, 0xa4,
3832
-	0xbc, 0x7b, 0x26, 0x78, 0xc3, 0xf3, 0x65, 0x03, 0xb3, 0x24, 0xab, 0x22, 0x35, 0x1f, 0xef, 0xc2,
3833
-	0x42, 0x4b, 0x16, 0x27, 0x99, 0x9b, 0x1f, 0xcc, 0x52, 0x49, 0x92, 0x90, 0xcc, 0x3b, 0x90, 0x89,
3834
-	0xb4, 0xe0, 0x25, 0x58, 0xdc, 0x7f, 0x78, 0x78, 0xfc, 0xa0, 0x1a, 0xd5, 0x0b, 0xbf, 0x05, 0xb9,
3835
-	0xda, 0xd1, 0x3e, 0xa9, 0x1e, 0x56, 0x8f, 0xea, 0x7b, 0x0f, 0xf2, 0xa8, 0x74, 0x3e, 0x0f, 0x50,
3836
-	0x19, 0x3c, 0xb9, 0xf8, 0x1b, 0x58, 0x50, 0xf6, 0xc6, 0xe6, 0x64, 0x0b, 0x8e, 0xbe, 0x86, 0xc6,
3837
-	0x55, 0x18, 0x55, 0x11, 0x73, 0xfd, 0x8f, 0xdf, 0xfe, 0x3d, 0x4f, 0xdf, 0x86, 0x25, 0x89, 0xf9,
3838
-	0x30, 0x9a, 0xeb, 0x34, 0x84, 0xe5, 0x78, 0xa5, 0x5e, 0x8d, 0x7b, 0x08, 0x7f, 0x0b, 0xd9, 0xc1,
3839
-	0x0c, 0xc6, 0x13, 0xef, 0x3a, 0x3e, 0xe4, 0x8d, 0x3b, 0x6f, 0x40, 0xa9, 0xe1, 0x32, 0x8b, 0x00,
3840
-	0xfc, 0x33, 0x82, 0xfc, 0xf8, 0x78, 0xc2, 0x77, 0xaf, 0x31, 0x6a, 0x8d, 0xad, 0xd9, 0xc0, 0xd7,
3841
-	0x11, 0xd5, 0x85, 0x79, 0x39, 0xd8, 0x70, 0x71, 0xda, 0x00, 0x19, 0x9c, 0x3e, 0x1d, 0x91, 0xf4,
3842
-	0x61, 0x63, 0x86, 0x13, 0x7f, 0x48, 0xa3, 0x7b, 0x08, 0x7f, 0x8f, 0x20, 0x37, 0x62, 0x6d, 0xbc,
3843
-	0xf1, 0x06, 0xef, 0x27, 0x1a, 0x36, 0x66, 0xfb, 0x46, 0x66, 0x74, 0x44, 0x59, 0xbf, 0x78, 0x59,
3844
-	0x48, 0xfd, 0xf5, 0xb2, 0x90, 0xfa, 0xae, 0x5f, 0x40, 0x17, 0xfd, 0x02, 0xfa, 0xb3, 0x5f, 0x40,
3845
-	0xff, 0xf4, 0x0b, 0xa8, 0xa9, 0xc9, 0x27, 0xf8, 0xe3, 0xff, 0x03, 0x00, 0x00, 0xff, 0xff, 0x6c,
3846
-	0xba, 0x38, 0xbd, 0x2d, 0x0a, 0x00, 0x00,
3786
+	// 1007 bytes of a gzipped FileDescriptorProto
3787
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x55, 0x4f, 0x6f, 0xe3, 0x44,
3788
+	0x1c, 0xcd, 0xa4, 0xa9, 0xdb, 0xfc, 0xd2, 0x2d, 0x61, 0xb4, 0x2a, 0xc6, 0xd2, 0xa6, 0xc1, 0x65,
3789
+	0xab, 0x8a, 0x2d, 0xce, 0x12, 0xfe, 0x1d, 0xa8, 0x0a, 0x4d, 0x13, 0xa9, 0xd1, 0x6e, 0xbb, 0xd5,
3790
+	0xb4, 0xbb, 0x7b, 0xac, 0x1c, 0x7b, 0xd6, 0x35, 0x69, 0x3c, 0xc6, 0x33, 0xd9, 0x25, 0x07, 0x24,
3791
+	0x0e, 0xac, 0x84, 0x38, 0x21, 0x4e, 0x95, 0x10, 0x5f, 0x01, 0xf1, 0x31, 0x2a, 0x4e, 0x1c, 0x39,
3792
+	0x15, 0x36, 0x1f, 0x80, 0x0f, 0xc0, 0x09, 0x79, 0x3c, 0x4e, 0x42, 0x37, 0x69, 0xd3, 0x9e, 0x12,
3793
+	0xcf, 0xbc, 0xf7, 0xe6, 0xf9, 0xfd, 0x7e, 0xfe, 0x0d, 0x54, 0x3c, 0x5f, 0x1c, 0x77, 0x5b, 0x96,
3794
+	0xc3, 0x3a, 0x15, 0x97, 0x39, 0x6d, 0x1a, 0x55, 0xf8, 0x0b, 0x3b, 0xea, 0xb4, 0x7d, 0x51, 0xb1,
3795
+	0x43, 0xbf, 0xe2, 0xfa, 0x3c, 0xb4, 0x85, 0x73, 0x4c, 0x23, 0x2b, 0x8c, 0x98, 0x60, 0x18, 0x27,
3796
+	0x28, 0x2b, 0x45, 0x59, 0xcf, 0x3f, 0x30, 0xde, 0xbb, 0x42, 0x44, 0xf4, 0x42, 0xca, 0x13, 0xbe,
3797
+	0xb1, 0x7e, 0x05, 0x96, 0xb5, 0xbe, 0xa4, 0x8e, 0x48, 0xd1, 0xb7, 0x3d, 0xe6, 0x31, 0xf9, 0xb7,
3798
+	0x12, 0xff, 0x53, 0xab, 0x9f, 0x5e, 0xa2, 0x21, 0x11, 0xad, 0xee, 0xb3, 0x4a, 0x78, 0xd2, 0xf5,
3799
+	0xfc, 0x40, 0xfd, 0x28, 0x62, 0xc9, 0x63, 0xcc, 0x3b, 0xa1, 0x43, 0x90, 0xdb, 0x8d, 0x6c, 0xe1,
3800
+	0x33, 0xb5, 0x6f, 0xbe, 0x44, 0xb0, 0x78, 0x40, 0x39, 0xf7, 0x59, 0x40, 0xe8, 0x57, 0x5d, 0xca,
3801
+	0x05, 0x6e, 0x40, 0xc1, 0xa5, 0xdc, 0x89, 0xfc, 0x30, 0xc6, 0xe9, 0xa8, 0x8c, 0xd6, 0x0a, 0xd5,
3802
+	0x15, 0xeb, 0xf5, 0x14, 0xac, 0x3d, 0xe6, 0xd2, 0xfa, 0x10, 0x4a, 0x46, 0x79, 0x78, 0x1d, 0x80,
3803
+	0x27, 0xc2, 0x47, 0xbe, 0xab, 0x67, 0xcb, 0x68, 0x2d, 0x5f, 0xbb, 0xd5, 0x3f, 0x5f, 0xce, 0xab,
3804
+	0xe3, 0x9a, 0x75, 0x92, 0x57, 0x80, 0xa6, 0x6b, 0xfe, 0x9c, 0x1d, 0xf8, 0xd8, 0xa5, 0x9c, 0xdb,
3805
+	0x1e, 0xbd, 0x20, 0x80, 0x2e, 0x17, 0xc0, 0xeb, 0x90, 0x0b, 0x98, 0x4b, 0xe5, 0x41, 0x85, 0xaa,
3806
+	0x3e, 0xc9, 0x2e, 0x91, 0x28, 0xbc, 0x01, 0xf3, 0x1d, 0x3b, 0xb0, 0x3d, 0x1a, 0x71, 0x7d, 0xa6,
3807
+	0x3c, 0xb3, 0x56, 0xa8, 0x96, 0xc7, 0x31, 0x9e, 0x52, 0xdf, 0x3b, 0x16, 0xd4, 0xdd, 0xa7, 0x34,
3808
+	0x22, 0x03, 0x06, 0x7e, 0x0a, 0x4b, 0x01, 0x15, 0x2f, 0x58, 0xd4, 0x3e, 0x6a, 0x31, 0x26, 0xb8,
3809
+	0x88, 0xec, 0xf0, 0xa8, 0x4d, 0x7b, 0x5c, 0xcf, 0x49, 0xad, 0x77, 0xc6, 0x69, 0x35, 0x02, 0x27,
3810
+	0xea, 0xc9, 0x68, 0x1e, 0xd0, 0x1e, 0xb9, 0xad, 0x04, 0x6a, 0x29, 0xff, 0x01, 0xed, 0x71, 0xbc,
3811
+	0x04, 0x1a, 0x61, 0x4c, 0x6c, 0x6f, 0xe9, 0xb3, 0x65, 0xb4, 0xb6, 0x40, 0xd4, 0x93, 0xf9, 0x05,
3812
+	0x14, 0x77, 0xa8, 0x1d, 0x89, 0x16, 0xb5, 0x45, 0x5a, 0xa6, 0x6b, 0xc5, 0x63, 0xee, 0xc3, 0x9b,
3813
+	0x23, 0x0a, 0x3c, 0x64, 0x01, 0xa7, 0xf8, 0x33, 0xd0, 0x42, 0x1a, 0xf9, 0xcc, 0x55, 0x45, 0x7e,
3814
+	0xdb, 0x4a, 0xba, 0xc5, 0x4a, 0xbb, 0xc5, 0xaa, 0xab, 0x6e, 0xa9, 0xcd, 0x9f, 0x9d, 0x2f, 0x67,
3815
+	0x4e, 0xff, 0x5a, 0x46, 0x44, 0x51, 0xcc, 0x1f, 0xb3, 0xf0, 0xd6, 0xe3, 0xd0, 0xb5, 0x05, 0x3d,
3816
+	0xb4, 0x79, 0xfb, 0x40, 0xd8, 0xa2, 0xcb, 0x6f, 0xe4, 0x0d, 0x3f, 0x81, 0xb9, 0xae, 0x14, 0x4a,
3817
+	0x6b, 0xb1, 0x31, 0x2e, 0xbf, 0x09, 0x67, 0x59, 0xc3, 0x95, 0x04, 0x41, 0x52, 0x31, 0x83, 0x41,
3818
+	0xf1, 0xe2, 0x26, 0x5e, 0x81, 0x39, 0x61, 0xf3, 0xf6, 0xd0, 0x16, 0xf4, 0xcf, 0x97, 0xb5, 0x18,
3819
+	0xd6, 0xac, 0x13, 0x2d, 0xde, 0x6a, 0xba, 0xf8, 0x13, 0xd0, 0xb8, 0x24, 0xa9, 0x6e, 0x2a, 0x8d,
3820
+	0xf3, 0x33, 0xe2, 0x44, 0xa1, 0x4d, 0x03, 0xf4, 0xd7, 0x5d, 0x26, 0x59, 0x9b, 0x1b, 0xb0, 0x10,
3821
+	0xaf, 0xde, 0x2c, 0x22, 0x73, 0x53, 0xb1, 0xd3, 0x6f, 0xc3, 0x82, 0xd9, 0xd8, 0x2b, 0xd7, 0x91,
3822
+	0x0c, 0x4c, 0x9f, 0x64, 0x90, 0x24, 0x30, 0xb3, 0x06, 0x78, 0x8b, 0x73, 0xdf, 0x0b, 0x3a, 0x34,
3823
+	0x10, 0x37, 0xf4, 0xf0, 0x1b, 0x02, 0x18, 0x8a, 0x60, 0x0b, 0x72, 0xb1, 0xb6, 0x6a, 0x9d, 0x89,
3824
+	0x0e, 0x76, 0x32, 0x44, 0xe2, 0xf0, 0x47, 0xa0, 0x71, 0xea, 0x44, 0x54, 0xa8, 0x50, 0x8d, 0x71,
3825
+	0x8c, 0x03, 0x89, 0xd8, 0xc9, 0x10, 0x85, 0x8d, 0x59, 0x0e, 0x0b, 0x9e, 0xf9, 0x9e, 0x3e, 0x33,
3826
+	0x99, 0xb5, 0x2d, 0x11, 0x31, 0x2b, 0xc1, 0xd6, 0x34, 0xc8, 0xf9, 0x82, 0x76, 0xcc, 0x97, 0x59,
3827
+	0x28, 0x0e, 0x2d, 0x6f, 0x1f, 0xdb, 0x81, 0x47, 0xf1, 0x26, 0x80, 0x3d, 0x58, 0x53, 0xf6, 0xc7,
3828
+	0x56, 0x78, 0xc8, 0x24, 0x23, 0x0c, 0xbc, 0x0b, 0x9a, 0xed, 0xc8, 0xd1, 0x18, 0xbf, 0xc8, 0x62,
3829
+	0xf5, 0xe3, 0xcb, 0xb9, 0xc9, 0xa9, 0x23, 0x0b, 0x5b, 0x92, 0x4c, 0x94, 0x88, 0xd9, 0x1a, 0xb5,
3830
+	0x98, 0xec, 0xe1, 0x55, 0xd0, 0x1e, 0xef, 0xd7, 0xb7, 0x0e, 0x1b, 0xc5, 0x8c, 0x61, 0xfc, 0xf0,
3831
+	0x4b, 0x79, 0xe9, 0x22, 0x42, 0x75, 0xf3, 0x2a, 0x68, 0xa4, 0xb1, 0xfb, 0xe8, 0x49, 0xa3, 0x88,
3832
+	0xc6, 0xe3, 0x08, 0xed, 0xb0, 0xe7, 0xd4, 0xfc, 0x17, 0xfd, 0xaf, 0xfe, 0x69, 0x17, 0x7d, 0x0e,
3833
+	0xb9, 0xf8, 0xa2, 0x92, 0x19, 0x2c, 0x56, 0xef, 0x5d, 0xfe, 0x1e, 0x29, 0xcb, 0x3a, 0xec, 0x85,
3834
+	0x94, 0x48, 0x22, 0xbe, 0x03, 0x60, 0x87, 0xe1, 0x89, 0x4f, 0xf9, 0x91, 0x60, 0xc9, 0x8c, 0x27,
3835
+	0x79, 0xb5, 0x72, 0xc8, 0xe2, 0xed, 0x88, 0xf2, 0xee, 0x89, 0xe0, 0x47, 0x7e, 0x20, 0x0b, 0x98,
3836
+	0x27, 0x79, 0xb5, 0xd2, 0x0c, 0xf0, 0x26, 0xcc, 0x39, 0x32, 0x9c, 0x74, 0x6e, 0xbe, 0x3b, 0x4d,
3837
+	0x92, 0x24, 0x25, 0x99, 0x77, 0x21, 0x17, 0x7b, 0xc1, 0x0b, 0x30, 0xbf, 0xfd, 0x68, 0x77, 0xff,
3838
+	0x61, 0x23, 0xce, 0x0b, 0xbf, 0x01, 0x85, 0xe6, 0xde, 0x36, 0x69, 0xec, 0x36, 0xf6, 0x0e, 0xb7,
3839
+	0x1e, 0x16, 0x51, 0xf5, 0x74, 0x16, 0xa0, 0x3e, 0xb8, 0xd4, 0xf1, 0xd7, 0x30, 0xa7, 0xda, 0x1b,
3840
+	0x9b, 0xe3, 0x5b, 0x70, 0xf4, 0x36, 0x34, 0x2e, 0xc3, 0xa8, 0x44, 0xcc, 0x95, 0xdf, 0x7f, 0xfd,
3841
+	0xe7, 0x34, 0x7b, 0x07, 0x16, 0x24, 0xe6, 0xfd, 0x78, 0xae, 0xd3, 0x08, 0x6e, 0x25, 0x4f, 0xea,
3842
+	0xd6, 0xb8, 0x8f, 0xf0, 0x37, 0x90, 0x1f, 0xcc, 0x60, 0x3c, 0xf6, 0x5d, 0x2f, 0x0e, 0x79, 0xe3,
3843
+	0xee, 0x15, 0x28, 0x35, 0x5c, 0xa6, 0x31, 0x80, 0x7f, 0x42, 0x50, 0xbc, 0x38, 0x9e, 0xf0, 0xbd,
3844
+	0x6b, 0x8c, 0x5a, 0x63, 0x7d, 0x3a, 0xf0, 0x75, 0x4c, 0x75, 0x61, 0x56, 0x0e, 0x36, 0x5c, 0x9e,
3845
+	0x34, 0x40, 0x06, 0xa7, 0x4f, 0x46, 0xa4, 0x75, 0x58, 0x9d, 0xe2, 0xc4, 0xef, 0xb3, 0xe8, 0x3e,
3846
+	0xc2, 0xdf, 0x21, 0x28, 0x8c, 0xb4, 0x36, 0x5e, 0xbd, 0xa2, 0xf7, 0x53, 0x0f, 0xab, 0xd3, 0x7d,
3847
+	0x23, 0x53, 0x76, 0x44, 0x4d, 0x3f, 0x7b, 0x55, 0xca, 0xfc, 0xf9, 0xaa, 0x94, 0xf9, 0xb6, 0x5f,
3848
+	0x42, 0x67, 0xfd, 0x12, 0xfa, 0xa3, 0x5f, 0x42, 0x7f, 0xf7, 0x4b, 0xa8, 0xa5, 0xc9, 0x2b, 0xf8,
3849
+	0xc3, 0xff, 0x02, 0x00, 0x00, 0xff, 0xff, 0xe0, 0xf0, 0x6a, 0xcb, 0xae, 0x0a, 0x00, 0x00,
3847 3850
 }
... ...
@@ -2,10 +2,10 @@ syntax = "proto3";
2 2
 
3 3
 package docker.swarmkit.v1;
4 4
 
5
-import "types.proto";
6
-import "objects.proto";
5
+import "github.com/docker/swarmkit/api/types.proto";
6
+import "github.com/docker/swarmkit/api/objects.proto";
7 7
 import "gogoproto/gogo.proto";
8
-import "plugin/plugin.proto";
8
+import "github.com/docker/swarmkit/protobuf/plugin/plugin.proto";
9 9
 import "google/protobuf/duration.proto";
10 10
 
11 11
 // Dispatcher is the API provided by a manager group for agents to connect to. Agents
12 12
deleted file mode 100644
... ...
@@ -1,3 +0,0 @@
1
-package api
2
-
3
-//go:generate protoc -I.:../protobuf:../vendor:../vendor/github.com/gogo/protobuf --gogoswarm_out=plugins=grpc+deepcopy+storeobject+raftproxy+authenticatedwrapper,import_path=github.com/docker/swarmkit/api,Mgogoproto/gogo.proto=github.com/gogo/protobuf/gogoproto,Mgoogle/protobuf/descriptor.proto=github.com/gogo/protobuf/protoc-gen-gogo/descriptor,Mplugin/plugin.proto=github.com/docker/swarmkit/protobuf/plugin,Mgoogle/protobuf/duration.proto=github.com/gogo/protobuf/types,Mgoogle/protobuf/timestamp.proto=github.com/gogo/protobuf/types,Mgoogle/protobuf/any.proto=github.com/gogo/protobuf/types:. types.proto specs.proto objects.proto control.proto dispatcher.proto ca.proto snapshot.proto raft.proto health.proto resource.proto logbroker.proto watch.proto
... ...
@@ -1,5 +1,5 @@
1 1
 // Code generated by protoc-gen-gogo.
2
-// source: health.proto
2
+// source: github.com/docker/swarmkit/api/health.proto
3 3
 // DO NOT EDIT!
4 4
 
5 5
 package api
... ...
@@ -198,7 +198,7 @@ var _Health_serviceDesc = grpc.ServiceDesc{
198 198
 		},
199 199
 	},
200 200
 	Streams:  []grpc.StreamDesc{},
201
-	Metadata: "health.proto",
201
+	Metadata: "github.com/docker/swarmkit/api/health.proto",
202 202
 }
203 203
 
204 204
 func (m *HealthCheckRequest) Marshal() (dAtA []byte, err error) {
... ...
@@ -696,26 +696,28 @@ var (
696 696
 	ErrIntOverflowHealth   = fmt.Errorf("proto: integer overflow")
697 697
 )
698 698
 
699
-func init() { proto.RegisterFile("health.proto", fileDescriptorHealth) }
699
+func init() { proto.RegisterFile("github.com/docker/swarmkit/api/health.proto", fileDescriptorHealth) }
700 700
 
701 701
 var fileDescriptorHealth = []byte{
702
-	// 287 bytes of a gzipped FileDescriptorProto
703
-	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0xe2, 0xc9, 0x48, 0x4d, 0xcc,
704
-	0x29, 0xc9, 0xd0, 0x2b, 0x28, 0xca, 0x2f, 0xc9, 0x17, 0x12, 0x4a, 0xc9, 0x4f, 0xce, 0x4e, 0x2d,
705
-	0xd2, 0x2b, 0x2e, 0x4f, 0x2c, 0xca, 0xcd, 0xce, 0x2c, 0xd1, 0x2b, 0x33, 0x94, 0x12, 0x49, 0xcf,
706
-	0x4f, 0xcf, 0x07, 0x4b, 0xeb, 0x83, 0x58, 0x10, 0x95, 0x52, 0xc2, 0x05, 0x39, 0xa5, 0xe9, 0x99,
707
-	0x79, 0xfa, 0x10, 0x0a, 0x22, 0xa8, 0xa4, 0xc7, 0x25, 0xe4, 0x01, 0x36, 0xce, 0x39, 0x23, 0x35,
708
-	0x39, 0x3b, 0x28, 0xb5, 0xb0, 0x34, 0xb5, 0xb8, 0x44, 0x48, 0x82, 0x8b, 0xbd, 0x38, 0xb5, 0xa8,
709
-	0x2c, 0x33, 0x39, 0x55, 0x82, 0x51, 0x81, 0x51, 0x83, 0x33, 0x08, 0xc6, 0x55, 0x5a, 0xc0, 0xc8,
710
-	0x25, 0x8c, 0xa2, 0xa1, 0xb8, 0x20, 0x3f, 0xaf, 0x38, 0x55, 0xc8, 0x97, 0x8b, 0xad, 0xb8, 0x24,
711
-	0xb1, 0xa4, 0xb4, 0x18, 0xac, 0x81, 0xcf, 0xc8, 0x54, 0x0f, 0xd3, 0x5d, 0x7a, 0x58, 0x34, 0xea,
712
-	0x05, 0x83, 0x0c, 0xce, 0x4b, 0x0f, 0x06, 0x6b, 0x0e, 0x82, 0x1a, 0xa2, 0x64, 0xc5, 0xc5, 0x8b,
713
-	0x22, 0x21, 0xc4, 0xcd, 0xc5, 0x1e, 0xea, 0xe7, 0xed, 0xe7, 0x1f, 0xee, 0x27, 0xc0, 0x00, 0xe2,
714
-	0x04, 0xbb, 0x06, 0x85, 0x79, 0xfa, 0xb9, 0x0b, 0x30, 0x0a, 0xf1, 0x73, 0x71, 0xfb, 0xf9, 0x87,
715
-	0xc4, 0xc3, 0x04, 0x98, 0x8c, 0x2a, 0xb9, 0xd8, 0x20, 0x16, 0x09, 0xe5, 0x73, 0xb1, 0x82, 0x2d,
716
-	0x13, 0x52, 0x23, 0xe8, 0x1a, 0xb0, 0xbf, 0xa5, 0xd4, 0x89, 0x74, 0xb5, 0x92, 0xe8, 0xa9, 0x75,
717
-	0xef, 0x66, 0x30, 0xf1, 0x73, 0xf1, 0x82, 0x15, 0xea, 0xe6, 0x26, 0xe6, 0x25, 0xa6, 0xa7, 0x16,
718
-	0x39, 0x49, 0x9c, 0x78, 0x28, 0xc7, 0x70, 0xe3, 0xa1, 0x1c, 0x43, 0xc3, 0x23, 0x39, 0xc6, 0x13,
719
-	0x8f, 0xe4, 0x18, 0x2f, 0x3c, 0x92, 0x63, 0x7c, 0xf0, 0x48, 0x8e, 0x31, 0x89, 0x0d, 0x1c, 0xdc,
720
-	0xc6, 0x80, 0x00, 0x00, 0x00, 0xff, 0xff, 0x59, 0xcd, 0x52, 0xee, 0xbd, 0x01, 0x00, 0x00,
702
+	// 315 bytes of a gzipped FileDescriptorProto
703
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0xd2, 0x4e, 0xcf, 0x2c, 0xc9,
704
+	0x28, 0x4d, 0xd2, 0x4b, 0xce, 0xcf, 0xd5, 0x4f, 0xc9, 0x4f, 0xce, 0x4e, 0x2d, 0xd2, 0x2f, 0x2e,
705
+	0x4f, 0x2c, 0xca, 0xcd, 0xce, 0x2c, 0xd1, 0x4f, 0x2c, 0xc8, 0xd4, 0xcf, 0x48, 0x4d, 0xcc, 0x29,
706
+	0xc9, 0xd0, 0x2b, 0x28, 0xca, 0x2f, 0xc9, 0x17, 0x12, 0x82, 0xa8, 0xd0, 0x83, 0xa9, 0xd0, 0x2b,
707
+	0x33, 0x94, 0x12, 0x49, 0xcf, 0x4f, 0xcf, 0x07, 0x4b, 0xeb, 0x83, 0x58, 0x10, 0x95, 0x52, 0xe6,
708
+	0x78, 0x8c, 0x05, 0xab, 0x48, 0x2a, 0x4d, 0xd3, 0x2f, 0xc8, 0x29, 0x4d, 0xcf, 0xcc, 0x83, 0x52,
709
+	0x10, 0x8d, 0x4a, 0x7a, 0x5c, 0x42, 0x1e, 0x60, 0x2b, 0x9d, 0x33, 0x52, 0x93, 0xb3, 0x83, 0x52,
710
+	0x0b, 0x4b, 0x53, 0x8b, 0x4b, 0x84, 0x24, 0xb8, 0xd8, 0x8b, 0x53, 0x8b, 0xca, 0x32, 0x93, 0x53,
711
+	0x25, 0x18, 0x15, 0x18, 0x35, 0x38, 0x83, 0x60, 0x5c, 0xa5, 0x05, 0x8c, 0x5c, 0xc2, 0x28, 0x1a,
712
+	0x8a, 0x0b, 0xf2, 0xf3, 0x8a, 0x53, 0x85, 0x7c, 0xb9, 0xd8, 0x8a, 0x4b, 0x12, 0x4b, 0x4a, 0x8b,
713
+	0xc1, 0x1a, 0xf8, 0x8c, 0x4c, 0xf5, 0x30, 0xdd, 0xae, 0x87, 0x45, 0xa3, 0x5e, 0x30, 0xc8, 0xe0,
714
+	0xbc, 0xf4, 0x60, 0xb0, 0xe6, 0x20, 0xa8, 0x21, 0x4a, 0x56, 0x5c, 0xbc, 0x28, 0x12, 0x42, 0xdc,
715
+	0x5c, 0xec, 0xa1, 0x7e, 0xde, 0x7e, 0xfe, 0xe1, 0x7e, 0x02, 0x0c, 0x20, 0x4e, 0xb0, 0x6b, 0x50,
716
+	0x98, 0xa7, 0x9f, 0xbb, 0x00, 0xa3, 0x10, 0x3f, 0x17, 0xb7, 0x9f, 0x7f, 0x48, 0x3c, 0x4c, 0x80,
717
+	0xc9, 0xa8, 0x92, 0x8b, 0x0d, 0x62, 0x91, 0x50, 0x3e, 0x17, 0x2b, 0xd8, 0x32, 0x21, 0x35, 0x82,
718
+	0xae, 0x01, 0xfb, 0x5b, 0x4a, 0x9d, 0x48, 0x57, 0x2b, 0x89, 0x9e, 0x5a, 0xf7, 0x6e, 0x06, 0x13,
719
+	0x3f, 0x17, 0x2f, 0x58, 0xa1, 0x6e, 0x6e, 0x62, 0x5e, 0x62, 0x7a, 0x6a, 0x91, 0x93, 0xc4, 0x89,
720
+	0x87, 0x72, 0x0c, 0x37, 0x1e, 0xca, 0x31, 0x34, 0x3c, 0x92, 0x63, 0x3c, 0xf1, 0x48, 0x8e, 0xf1,
721
+	0xc2, 0x23, 0x39, 0xc6, 0x07, 0x8f, 0xe4, 0x18, 0x93, 0xd8, 0xc0, 0xc1, 0x6d, 0x0c, 0x08, 0x00,
722
+	0x00, 0xff, 0xff, 0x7b, 0xf2, 0xdd, 0x23, 0x00, 0x02, 0x00, 0x00,
721 723
 }
... ...
@@ -12,7 +12,7 @@ syntax = "proto3";
12 12
 package docker.swarmkit.v1;
13 13
 
14 14
 import "gogoproto/gogo.proto";
15
-import "plugin/plugin.proto";
15
+import "github.com/docker/swarmkit/protobuf/plugin/plugin.proto";
16 16
 
17 17
 service Health {
18 18
 	rpc Check(HealthCheckRequest) returns (HealthCheckResponse) {
... ...
@@ -1,5 +1,5 @@
1 1
 // Code generated by protoc-gen-gogo.
2
-// source: logbroker.proto
2
+// source: github.com/docker/swarmkit/api/logbroker.proto
3 3
 // DO NOT EDIT!
4 4
 
5 5
 package api
... ...
@@ -618,7 +618,7 @@ var _Logs_serviceDesc = grpc.ServiceDesc{
618 618
 			ServerStreams: true,
619 619
 		},
620 620
 	},
621
-	Metadata: "logbroker.proto",
621
+	Metadata: "github.com/docker/swarmkit/api/logbroker.proto",
622 622
 }
623 623
 
624 624
 // Client API for LogBroker service
... ...
@@ -790,7 +790,7 @@ var _LogBroker_serviceDesc = grpc.ServiceDesc{
790 790
 			ClientStreams: true,
791 791
 		},
792 792
 	},
793
-	Metadata: "logbroker.proto",
793
+	Metadata: "github.com/docker/swarmkit/api/logbroker.proto",
794 794
 }
795 795
 
796 796
 func (m *LogSubscriptionOptions) Marshal() (dAtA []byte, err error) {
... ...
@@ -3350,67 +3350,71 @@ var (
3350 3350
 	ErrIntOverflowLogbroker   = fmt.Errorf("proto: integer overflow")
3351 3351
 )
3352 3352
 
3353
-func init() { proto.RegisterFile("logbroker.proto", fileDescriptorLogbroker) }
3353
+func init() {
3354
+	proto.RegisterFile("github.com/docker/swarmkit/api/logbroker.proto", fileDescriptorLogbroker)
3355
+}
3354 3356
 
3355 3357
 var fileDescriptorLogbroker = []byte{
3356
-	// 944 bytes of a gzipped FileDescriptorProto
3358
+	// 966 bytes of a gzipped FileDescriptorProto
3357 3359
 	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xa4, 0x95, 0x41, 0x6f, 0x1b, 0x45,
3358
-	0x14, 0xc7, 0x3d, 0xeb, 0xc4, 0x8e, 0x9f, 0x9b, 0xc4, 0x1d, 0xa7, 0x91, 0x65, 0xa8, 0x6d, 0x6d,
3359
-	0xa5, 0x62, 0x45, 0xc5, 0x6e, 0x8d, 0x10, 0x48, 0x91, 0x10, 0x35, 0xae, 0x90, 0x85, 0x9b, 0xa0,
3360
-	0xb1, 0x23, 0xb8, 0x45, 0x6b, 0xef, 0x74, 0x59, 0x79, 0xbd, 0x63, 0x76, 0xc6, 0x09, 0x48, 0x1c,
3361
-	0x38, 0x14, 0x09, 0xe5, 0xc0, 0x0d, 0x09, 0x0e, 0x3d, 0xd1, 0x0b, 0x42, 0xe2, 0xc2, 0x8d, 0x0f,
3362
-	0x80, 0x22, 0x4e, 0x1c, 0x39, 0x59, 0x74, 0x3f, 0x00, 0x9f, 0x01, 0xed, 0xcc, 0xd8, 0xde, 0x60,
3363
-	0xbb, 0x45, 0xe5, 0x92, 0xcc, 0xec, 0xfc, 0xdf, 0xbe, 0xdf, 0xfb, 0xcf, 0x7b, 0x6b, 0xd8, 0xf5,
3364
-	0x98, 0xd3, 0x0f, 0xd8, 0x90, 0x06, 0xb5, 0x71, 0xc0, 0x04, 0xc3, 0xd8, 0x66, 0x83, 0x68, 0xc7,
3365
-	0xcf, 0xad, 0x60, 0x34, 0x74, 0x45, 0xed, 0xec, 0x5e, 0x71, 0xcf, 0x61, 0x0e, 0x93, 0xc7, 0xf5,
3366
-	0x68, 0xa5, 0x94, 0xc5, 0xb2, 0xc3, 0x98, 0xe3, 0xd1, 0xba, 0xdc, 0xf5, 0x27, 0x8f, 0xea, 0xc2,
3367
-	0x1d, 0x51, 0x2e, 0xac, 0xd1, 0x58, 0x0b, 0xf2, 0x63, 0x6f, 0xe2, 0xb8, 0x7e, 0x5d, 0xfd, 0x53,
3368
-	0x0f, 0xcd, 0x5f, 0x10, 0xec, 0x77, 0x98, 0xd3, 0x9d, 0xf4, 0xf9, 0x20, 0x70, 0xc7, 0xc2, 0x65,
3369
-	0xfe, 0xb1, 0xfc, 0xcb, 0xf1, 0x21, 0xa4, 0xb9, 0x08, 0xa8, 0x35, 0xe2, 0x05, 0x54, 0x49, 0x56,
3370
-	0x77, 0x1a, 0x37, 0x6b, 0xcb, 0x30, 0xb5, 0x28, 0x58, 0xaa, 0x9a, 0x46, 0x2e, 0x41, 0x66, 0x11,
3371
-	0x78, 0x1f, 0x52, 0x8f, 0x98, 0xe7, 0xb1, 0xf3, 0x82, 0x51, 0x41, 0xd5, 0x2d, 0xa2, 0x77, 0x18,
3372
-	0xc3, 0x86, 0xb0, 0x5c, 0xaf, 0x90, 0xac, 0xa0, 0x6a, 0x92, 0xc8, 0x35, 0xbe, 0x0b, 0x9b, 0xdc,
3373
-	0xf5, 0x07, 0xb4, 0xb0, 0x51, 0x41, 0xd5, 0x6c, 0xa3, 0x58, 0x53, 0x95, 0xd4, 0x66, 0x95, 0xd4,
3374
-	0x7a, 0xb3, 0x4a, 0x88, 0x12, 0x9a, 0xdf, 0x20, 0xc8, 0x46, 0x89, 0xa9, 0x47, 0x07, 0x82, 0x05,
3375
-	0xb8, 0x0e, 0x59, 0x4e, 0x83, 0x33, 0x77, 0x40, 0x4f, 0x5d, 0x5b, 0xe1, 0x66, 0x9a, 0x3b, 0xe1,
3376
-	0xb4, 0x0c, 0x5d, 0xf5, 0xb8, 0xdd, 0xe2, 0x04, 0xb4, 0xa4, 0x6d, 0x73, 0x7c, 0x1b, 0xb6, 0x7c,
3377
-	0x66, 0x2b, 0xb5, 0x21, 0xd5, 0xd9, 0x70, 0x5a, 0x4e, 0x1f, 0x31, 0x5b, 0x4a, 0xd3, 0xd1, 0xa1,
3378
-	0xd6, 0x09, 0x8b, 0x0f, 0xa5, 0x2e, 0xb9, 0xd0, 0xf5, 0x2c, 0x3e, 0x94, 0xba, 0xe8, 0xb0, 0x6d,
3379
-	0x73, 0xf3, 0x31, 0x02, 0xe8, 0x30, 0xe7, 0x3d, 0xe6, 0x0b, 0xfa, 0x99, 0xc0, 0x77, 0x00, 0x16,
3380
-	0x3c, 0x05, 0x54, 0x41, 0xd5, 0x4c, 0x73, 0x3b, 0x9c, 0x96, 0x33, 0x73, 0x1c, 0x92, 0x99, 0xd3,
3381
-	0xe0, 0x5b, 0x90, 0xd6, 0x30, 0xd2, 0xac, 0x4c, 0x13, 0xc2, 0x69, 0x39, 0xa5, 0x58, 0x48, 0x4a,
3382
-	0xa1, 0x44, 0x22, 0x4d, 0x22, 0xbd, 0xd3, 0x22, 0x05, 0x42, 0x52, 0x8a, 0xc3, 0xbc, 0x07, 0xe9,
3383
-	0x0e, 0x73, 0xee, 0x0b, 0x11, 0xe0, 0x1c, 0x24, 0x87, 0xf4, 0x73, 0x95, 0x9b, 0x44, 0x4b, 0xbc,
3384
-	0x07, 0x9b, 0x67, 0x96, 0x37, 0xa1, 0x2a, 0x09, 0x51, 0x1b, 0xf3, 0xc2, 0x90, 0xe4, 0x0f, 0x29,
3385
-	0xe7, 0x96, 0x43, 0xf1, 0x3b, 0x90, 0x1e, 0xa8, 0x22, 0x64, 0x68, 0xb6, 0x51, 0x5a, 0x73, 0xe9,
3386
-	0xba, 0xd4, 0xe6, 0xc6, 0xe5, 0xb4, 0x9c, 0x20, 0xb3, 0x20, 0xfc, 0x36, 0x64, 0xe6, 0x7d, 0x27,
3387
-	0x13, 0x3d, 0xff, 0x3e, 0x17, 0x62, 0xfc, 0x26, 0xa4, 0x54, 0xf3, 0xc8, 0xfa, 0x5e, 0xd4, 0x6d,
3388
-	0x44, 0x8b, 0xa3, 0x86, 0xb2, 0x2d, 0x61, 0xc9, 0xde, 0xb9, 0x46, 0xe4, 0x1a, 0xbf, 0x05, 0x9b,
3389
-	0x96, 0x10, 0x01, 0x2f, 0x6c, 0x56, 0x92, 0xd5, 0x6c, 0xe3, 0x95, 0x35, 0x6f, 0x8a, 0x7c, 0xd2,
3390
-	0xfc, 0x4a, 0x6f, 0x7e, 0x8f, 0x60, 0x4f, 0x8f, 0x42, 0x9f, 0x76, 0x98, 0xc3, 0x09, 0xfd, 0x74,
3391
-	0x42, 0xb9, 0xc0, 0x87, 0xb0, 0xc5, 0x75, 0xb3, 0x69, 0x5f, 0xca, 0xeb, 0xf0, 0xb4, 0x8c, 0xcc,
3392
-	0x03, 0x70, 0x0b, 0xd2, 0x4c, 0xcd, 0x94, 0x76, 0xe4, 0x60, 0x5d, 0xec, 0xf2, 0x14, 0x92, 0x59,
3393
-	0xa8, 0xf9, 0xf1, 0xbf, 0xd0, 0x66, 0x37, 0xf6, 0x2e, 0x6c, 0x8d, 0xd4, 0x52, 0x35, 0xfe, 0xfa,
3394
-	0x2b, 0xd3, 0x11, 0xba, 0xe4, 0x79, 0x94, 0xf9, 0x2a, 0x14, 0x3b, 0x2e, 0x17, 0xd4, 0x8f, 0xe7,
3395
-	0x9f, 0x95, 0x6e, 0xfe, 0x86, 0x20, 0x1f, 0x3f, 0x98, 0xe5, 0xdd, 0x07, 0x63, 0xde, 0xdb, 0xa9,
3396
-	0x70, 0x5a, 0x36, 0xda, 0x2d, 0x62, 0xb8, 0xf6, 0x15, 0xab, 0x8c, 0xff, 0x61, 0x55, 0xf2, 0xa5,
3397
-	0xad, 0x8a, 0x3a, 0x7d, 0xe0, 0x31, 0xae, 0x3e, 0x28, 0x5b, 0x44, 0x6d, 0xcc, 0x1f, 0x11, 0xe0,
3398
-	0x0f, 0x27, 0x7d, 0xcf, 0xe5, 0x9f, 0xc4, 0xfd, 0x3b, 0x84, 0x5d, 0x1e, 0x7b, 0xd9, 0x62, 0x60,
3399
-	0x71, 0x38, 0x2d, 0xef, 0xc4, 0xf3, 0xb4, 0x5b, 0x64, 0x27, 0x2e, 0x6d, 0xdb, 0x57, 0xcc, 0x37,
3400
-	0x5e, 0xc6, 0xfc, 0x05, 0x6b, 0x32, 0xce, 0x7a, 0x03, 0xf2, 0x31, 0x54, 0x42, 0xf9, 0x98, 0xf9,
3401
-	0x9c, 0x1e, 0x3c, 0x45, 0x90, 0x99, 0x8f, 0x00, 0xbe, 0x03, 0xb8, 0x73, 0xfc, 0xfe, 0x69, 0xb7,
3402
-	0x47, 0x1e, 0xdc, 0x7f, 0x78, 0x7a, 0x72, 0xf4, 0xc1, 0xd1, 0xf1, 0x47, 0x47, 0xb9, 0x44, 0x71,
3403
-	0xef, 0xe2, 0x49, 0x25, 0x37, 0x97, 0x9d, 0xf8, 0x43, 0x9f, 0x9d, 0xfb, 0xf8, 0x00, 0xae, 0xc7,
3404
-	0xd4, 0xdd, 0x5e, 0xeb, 0xf8, 0xa4, 0x97, 0x43, 0xc5, 0xfc, 0xc5, 0x93, 0xca, 0xee, 0x5c, 0xdc,
3405
-	0x15, 0x36, 0x9b, 0x88, 0x65, 0xed, 0x03, 0x42, 0x72, 0xc6, 0xb2, 0x96, 0x06, 0x41, 0xf1, 0xfa,
3406
-	0xd7, 0x3f, 0x94, 0x12, 0xbf, 0x3e, 0x2d, 0x2d, 0xc0, 0x1a, 0x8f, 0x11, 0x6c, 0x44, 0xdc, 0xf8,
3407
-	0x0b, 0xd8, 0xbe, 0xd2, 0xb3, 0xb8, 0xba, 0xca, 0x9d, 0x55, 0x13, 0x57, 0x7c, 0xb1, 0x52, 0x3b,
3408
-	0x6a, 0xde, 0xf8, 0xfd, 0xe7, 0xbf, 0xbf, 0x33, 0x76, 0x61, 0x5b, 0x2a, 0x5f, 0x1f, 0x59, 0xbe,
3409
-	0xe5, 0xd0, 0xe0, 0x2e, 0x6a, 0xfc, 0x64, 0x48, 0xb7, 0x9a, 0xf2, 0xf7, 0x14, 0x7f, 0x8b, 0x20,
3410
-	0xbf, 0xa2, 0xcd, 0x71, 0x6d, 0xe5, 0x85, 0xad, 0x9d, 0x87, 0xe2, 0x6b, 0xcf, 0x01, 0x8b, 0x0f,
3411
-	0x88, 0x79, 0x4b, 0x72, 0xdd, 0x84, 0x6b, 0x8a, 0xeb, 0x9c, 0x05, 0x43, 0x1a, 0x2c, 0x51, 0xe2,
3412
-	0xaf, 0x10, 0x64, 0x63, 0x77, 0x8d, 0x6f, 0xaf, 0x7a, 0xff, 0x72, 0xdf, 0xae, 0xe6, 0x58, 0xd1,
3413
-	0x34, 0xff, 0x89, 0xa3, 0x8a, 0x9a, 0x85, 0xcb, 0x67, 0xa5, 0xc4, 0x9f, 0xcf, 0x4a, 0x89, 0x2f,
3414
-	0xc3, 0x12, 0xba, 0x0c, 0x4b, 0xe8, 0x8f, 0xb0, 0x84, 0xfe, 0x0a, 0x4b, 0xa8, 0x9f, 0x92, 0x1f,
3415
-	0xee, 0x37, 0xfe, 0x09, 0x00, 0x00, 0xff, 0xff, 0x08, 0xa1, 0xea, 0xc7, 0x9d, 0x08, 0x00, 0x00,
3360
+	0x14, 0xc7, 0x3d, 0xeb, 0xc4, 0x8e, 0x9f, 0x9b, 0xc4, 0x9d, 0xa4, 0x91, 0x65, 0xa8, 0x6d, 0x6d,
3361
+	0xa5, 0x62, 0x45, 0x65, 0xdd, 0x1a, 0xa1, 0x22, 0x45, 0x42, 0xd4, 0xb8, 0x42, 0x16, 0x6e, 0x82,
3362
+	0xc6, 0x8e, 0xe0, 0x16, 0xad, 0xbd, 0xd3, 0xed, 0xca, 0xeb, 0x1d, 0xb3, 0x33, 0x4e, 0x40, 0xe2,
3363
+	0xc0, 0xa1, 0x48, 0x28, 0x07, 0x6e, 0x48, 0x70, 0xe8, 0x89, 0x5e, 0x10, 0x12, 0x17, 0x6e, 0x7c,
3364
+	0x00, 0x14, 0x71, 0xe2, 0xc8, 0xc9, 0xa2, 0xfb, 0x01, 0xf8, 0x0c, 0x68, 0x67, 0xd6, 0xeb, 0x0d,
3365
+	0xb6, 0x53, 0x54, 0x2e, 0xf6, 0x8c, 0xe7, 0xf7, 0xf6, 0xfd, 0xdf, 0x7f, 0xde, 0x5b, 0x83, 0x61,
3366
+	0x3b, 0xe2, 0xc9, 0xa4, 0x6f, 0x0c, 0xd8, 0xa8, 0x6e, 0xb1, 0xc1, 0x90, 0xfa, 0x75, 0x7e, 0x66,
3367
+	0xfa, 0xa3, 0xa1, 0x23, 0xea, 0xe6, 0xd8, 0xa9, 0xbb, 0xcc, 0xee, 0xfb, 0x6c, 0x48, 0x7d, 0x63,
3368
+	0xec, 0x33, 0xc1, 0x30, 0x56, 0x90, 0x31, 0x83, 0x8c, 0xd3, 0x7b, 0xa5, 0x5d, 0x9b, 0xd9, 0x4c,
3369
+	0x1e, 0xd7, 0xc3, 0x95, 0x22, 0x4b, 0x15, 0x9b, 0x31, 0xdb, 0xa5, 0x75, 0xb9, 0xeb, 0x4f, 0x1e,
3370
+	0xd7, 0x85, 0x33, 0xa2, 0x5c, 0x98, 0xa3, 0x71, 0x04, 0xdc, 0xbf, 0x22, 0x75, 0x1c, 0x34, 0x76,
3371
+	0x27, 0xb6, 0xe3, 0x45, 0x5f, 0x2a, 0x50, 0xff, 0x05, 0xc1, 0x5e, 0x87, 0xd9, 0xdd, 0x49, 0x9f,
3372
+	0x0f, 0x7c, 0x67, 0x2c, 0x1c, 0xe6, 0x1d, 0xc9, 0x4f, 0x8e, 0x0f, 0x20, 0xcb, 0x85, 0x4f, 0xcd,
3373
+	0x11, 0x2f, 0xa2, 0x6a, 0xba, 0xb6, 0xd5, 0xb8, 0x69, 0x2c, 0x0a, 0x36, 0xc2, 0x60, 0x49, 0x35,
3374
+	0xb5, 0x42, 0x8a, 0xcc, 0x22, 0xf0, 0x1e, 0x64, 0x1e, 0x33, 0xd7, 0x65, 0x67, 0x45, 0xad, 0x8a,
3375
+	0x6a, 0x1b, 0x24, 0xda, 0x61, 0x0c, 0x6b, 0xc2, 0x74, 0xdc, 0x62, 0xba, 0x8a, 0x6a, 0x69, 0x22,
3376
+	0xd7, 0xf8, 0x2e, 0xac, 0x73, 0xc7, 0x1b, 0xd0, 0xe2, 0x5a, 0x15, 0xd5, 0xf2, 0x8d, 0x92, 0xa1,
3377
+	0xaa, 0x35, 0x66, 0xc2, 0x8d, 0xde, 0xac, 0x5a, 0xa2, 0x40, 0xfd, 0x1b, 0x04, 0xf9, 0x30, 0x31,
3378
+	0x75, 0xe9, 0x40, 0x30, 0x1f, 0xd7, 0x21, 0xcf, 0xa9, 0x7f, 0xea, 0x0c, 0xe8, 0x89, 0x63, 0x29,
3379
+	0xb9, 0xb9, 0xe6, 0x56, 0x30, 0xad, 0x40, 0x57, 0xfd, 0xdc, 0x6e, 0x71, 0x02, 0x11, 0xd2, 0xb6,
3380
+	0x38, 0xbe, 0x0d, 0x1b, 0x1e, 0xb3, 0x14, 0xad, 0x49, 0x3a, 0x1f, 0x4c, 0x2b, 0xd9, 0x43, 0x66,
3381
+	0x49, 0x34, 0x1b, 0x1e, 0x46, 0x9c, 0x30, 0xf9, 0x50, 0x72, 0xe9, 0x39, 0xd7, 0x33, 0xf9, 0x50,
3382
+	0x72, 0xe1, 0x61, 0xdb, 0xe2, 0xfa, 0x53, 0x04, 0xd0, 0x61, 0xf6, 0xfb, 0xcc, 0x13, 0xf4, 0x33,
3383
+	0x81, 0xef, 0x00, 0xcc, 0xf5, 0x14, 0x51, 0x15, 0xd5, 0x72, 0xcd, 0xcd, 0x60, 0x5a, 0xc9, 0xc5,
3384
+	0x72, 0x48, 0x2e, 0x56, 0x83, 0x6f, 0x41, 0x36, 0x12, 0x23, 0xcd, 0xca, 0x35, 0x21, 0x98, 0x56,
3385
+	0x32, 0x4a, 0x0b, 0xc9, 0x28, 0x29, 0x21, 0x14, 0x29, 0x91, 0xde, 0x45, 0x90, 0x12, 0x42, 0x32,
3386
+	0x4a, 0x87, 0x7e, 0x0f, 0xb2, 0x1d, 0x66, 0x3f, 0x10, 0xc2, 0xc7, 0x05, 0x48, 0x0f, 0xe9, 0xe7,
3387
+	0x2a, 0x37, 0x09, 0x97, 0x78, 0x17, 0xd6, 0x4f, 0x4d, 0x77, 0x42, 0x55, 0x12, 0xa2, 0x36, 0xfa,
3388
+	0xb9, 0x26, 0x95, 0x3f, 0xa2, 0x9c, 0x9b, 0x36, 0xc5, 0xef, 0x42, 0x76, 0xa0, 0x8a, 0x90, 0xa1,
3389
+	0xf9, 0x46, 0x79, 0xc5, 0xa5, 0x47, 0xa5, 0x36, 0xd7, 0x2e, 0xa6, 0x95, 0x14, 0x99, 0x05, 0xe1,
3390
+	0x77, 0x20, 0x17, 0xf7, 0xa6, 0x4c, 0x74, 0xf5, 0x7d, 0xce, 0x61, 0xfc, 0x36, 0x64, 0x54, 0xf3,
3391
+	0xc8, 0xfa, 0x5e, 0xd6, 0x6d, 0x24, 0x82, 0xc3, 0x86, 0xb2, 0x4c, 0x61, 0xca, 0xde, 0xb9, 0x46,
3392
+	0xe4, 0x1a, 0xdf, 0x87, 0x75, 0x53, 0x08, 0x9f, 0x17, 0xd7, 0xab, 0xe9, 0x5a, 0xbe, 0xf1, 0xda,
3393
+	0x8a, 0x27, 0x85, 0x3e, 0x45, 0xfa, 0x15, 0xaf, 0x7f, 0x8f, 0x60, 0x37, 0x1a, 0x85, 0x3e, 0xed,
3394
+	0x30, 0x9b, 0x13, 0xfa, 0xe9, 0x84, 0x72, 0x81, 0x0f, 0x60, 0x83, 0x47, 0xcd, 0x16, 0xf9, 0x52,
3395
+	0x59, 0x25, 0x2f, 0xc2, 0x48, 0x1c, 0x80, 0x5b, 0x90, 0x65, 0x6a, 0xa6, 0x22, 0x47, 0xf6, 0x57,
3396
+	0xc5, 0x2e, 0x4e, 0x21, 0x99, 0x85, 0xea, 0x9f, 0xfc, 0x4b, 0xda, 0xec, 0xc6, 0xde, 0x83, 0x8d,
3397
+	0x91, 0x5a, 0xaa, 0xc6, 0x5f, 0x7d, 0x65, 0x51, 0x44, 0x54, 0x72, 0x1c, 0xa5, 0xbf, 0x0e, 0xa5,
3398
+	0x8e, 0xc3, 0x05, 0xf5, 0x92, 0xf9, 0x67, 0xa5, 0xeb, 0xbf, 0x21, 0xd8, 0x49, 0x1e, 0xcc, 0xf2,
3399
+	0xee, 0x81, 0x16, 0xf7, 0x76, 0x26, 0x98, 0x56, 0xb4, 0x76, 0x8b, 0x68, 0x8e, 0x75, 0xc9, 0x2a,
3400
+	0xed, 0x7f, 0x58, 0x95, 0x7e, 0x65, 0xab, 0xc2, 0x4e, 0x1f, 0xb8, 0x8c, 0xab, 0x17, 0xca, 0x06,
3401
+	0x51, 0x1b, 0xfd, 0x47, 0x04, 0xf8, 0xa3, 0x49, 0xdf, 0x75, 0xf8, 0x93, 0xa4, 0x7f, 0x07, 0xb0,
3402
+	0xcd, 0x13, 0x0f, 0x9b, 0x0f, 0x2c, 0x0e, 0xa6, 0x95, 0xad, 0x64, 0x9e, 0x76, 0x8b, 0x6c, 0x25,
3403
+	0xd1, 0xb6, 0x75, 0xc9, 0x7c, 0xed, 0x55, 0xcc, 0x9f, 0x6b, 0x4d, 0x27, 0xb5, 0xde, 0x80, 0x9d,
3404
+	0x84, 0x54, 0x42, 0xf9, 0x98, 0x79, 0x9c, 0xee, 0x3f, 0x47, 0x90, 0x8b, 0x47, 0x00, 0xdf, 0x01,
3405
+	0xdc, 0x39, 0xfa, 0xe0, 0xa4, 0xdb, 0x23, 0x0f, 0x1f, 0x3c, 0x3a, 0x39, 0x3e, 0xfc, 0xf0, 0xf0,
3406
+	0xe8, 0xe3, 0xc3, 0x42, 0xaa, 0xb4, 0x7b, 0xfe, 0xac, 0x5a, 0x88, 0xb1, 0x63, 0x6f, 0xe8, 0xb1,
3407
+	0x33, 0x0f, 0xef, 0xc3, 0xf5, 0x04, 0xdd, 0xed, 0xb5, 0x8e, 0x8e, 0x7b, 0x05, 0x54, 0xda, 0x39,
3408
+	0x7f, 0x56, 0xdd, 0x8e, 0xe1, 0xae, 0xb0, 0xd8, 0x44, 0x2c, 0xb2, 0x0f, 0x09, 0x29, 0x68, 0x8b,
3409
+	0x2c, 0xf5, 0xfd, 0xd2, 0xf5, 0xaf, 0x7f, 0x28, 0xa7, 0x7e, 0x7d, 0x5e, 0x9e, 0x0b, 0x6b, 0x3c,
3410
+	0x45, 0xb0, 0x16, 0xea, 0xc6, 0x5f, 0xc0, 0xe6, 0xa5, 0x9e, 0xc5, 0xb5, 0x65, 0xee, 0x2c, 0x9b,
3411
+	0xb8, 0xd2, 0xcb, 0xc9, 0xc8, 0x51, 0xfd, 0xc6, 0xef, 0x3f, 0xff, 0xfd, 0x9d, 0xb6, 0x0d, 0x9b,
3412
+	0x92, 0x7c, 0x73, 0x64, 0x7a, 0xa6, 0x4d, 0xfd, 0xbb, 0xa8, 0xf1, 0x93, 0x26, 0xdd, 0x6a, 0xca,
3413
+	0xff, 0x5c, 0xfc, 0x2d, 0x82, 0x9d, 0x25, 0x6d, 0x8e, 0x8d, 0xa5, 0x17, 0xb6, 0x72, 0x1e, 0x4a,
3414
+	0x6f, 0x5c, 0x21, 0x2c, 0x39, 0x20, 0xfa, 0x2d, 0xa9, 0xeb, 0x26, 0x5c, 0x53, 0xba, 0xce, 0x98,
3415
+	0x3f, 0xa4, 0xfe, 0x82, 0x4a, 0xfc, 0x15, 0x82, 0x7c, 0xe2, 0xae, 0xf1, 0xed, 0x65, 0xcf, 0x5f,
3416
+	0xec, 0xdb, 0xe5, 0x3a, 0x96, 0x34, 0xcd, 0x7f, 0xd2, 0x51, 0x43, 0xcd, 0xe2, 0xc5, 0x8b, 0x72,
3417
+	0xea, 0xcf, 0x17, 0xe5, 0xd4, 0x97, 0x41, 0x19, 0x5d, 0x04, 0x65, 0xf4, 0x47, 0x50, 0x46, 0x7f,
3418
+	0x05, 0x65, 0xd4, 0xcf, 0xc8, 0x17, 0xf7, 0x5b, 0xff, 0x04, 0x00, 0x00, 0xff, 0xff, 0x95, 0x7b,
3419
+	0x3c, 0x04, 0xe0, 0x08, 0x00, 0x00,
3416 3420
 }
... ...
@@ -4,7 +4,7 @@ package docker.swarmkit.v1;
4 4
 
5 5
 import "gogoproto/gogo.proto";
6 6
 import "google/protobuf/timestamp.proto";
7
-import "plugin/plugin.proto";
7
+import "github.com/docker/swarmkit/protobuf/plugin/plugin.proto";
8 8
 
9 9
 // LogStream defines the stream from which the log message came.
10 10
 enum LogStream {
... ...
@@ -1,5 +1,5 @@
1 1
 // Code generated by protoc-gen-gogo.
2
-// source: objects.proto
2
+// source: github.com/docker/swarmkit/api/objects.proto
3 3
 // DO NOT EDIT!
4 4
 
5 5
 package api
... ...
@@ -7686,102 +7686,103 @@ var (
7686 7686
 	ErrIntOverflowObjects   = fmt.Errorf("proto: integer overflow")
7687 7687
 )
7688 7688
 
7689
-func init() { proto.RegisterFile("objects.proto", fileDescriptorObjects) }
7689
+func init() { proto.RegisterFile("github.com/docker/swarmkit/api/objects.proto", fileDescriptorObjects) }
7690 7690
 
7691 7691
 var fileDescriptorObjects = []byte{
7692
-	// 1491 bytes of a gzipped FileDescriptorProto
7693
-	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xcc, 0x58, 0xcf, 0x6f, 0x1b, 0x4f,
7694
-	0x15, 0xef, 0xda, 0x1b, 0xff, 0x78, 0x4e, 0x4c, 0x98, 0x86, 0xb0, 0x35, 0xc1, 0x0e, 0xae, 0x40,
7695
-	0x15, 0xaa, 0x9c, 0x12, 0x0a, 0x4a, 0x03, 0xa5, 0xb5, 0x93, 0xa8, 0xb5, 0x4a, 0x69, 0x34, 0x2d,
7696
-	0x2d, 0xb7, 0x65, 0xb2, 0x3b, 0x75, 0x17, 0xaf, 0x77, 0x56, 0x3b, 0x63, 0x17, 0xdf, 0x38, 0x87,
7697
-	0x3f, 0x20, 0x37, 0x0e, 0xfd, 0x17, 0xe0, 0xc2, 0x85, 0x03, 0xa7, 0x1e, 0x39, 0x21, 0x4e, 0x11,
7698
-	0xf5, 0x7f, 0x81, 0xc4, 0xe1, 0xab, 0x99, 0x9d, 0xb5, 0x37, 0xf1, 0x3a, 0x49, 0xbf, 0xaa, 0xa2,
7699
-	0xef, 0x29, 0x33, 0x3b, 0x9f, 0xcf, 0x9b, 0xf7, 0xde, 0xbc, 0x5f, 0x31, 0xac, 0xb0, 0xa3, 0x3f,
7700
-	0x50, 0x47, 0xf0, 0x56, 0x18, 0x31, 0xc1, 0x10, 0x72, 0x99, 0xd3, 0xa7, 0x51, 0x8b, 0xbf, 0x27,
7701
-	0xd1, 0xa0, 0xef, 0x89, 0xd6, 0xe8, 0x27, 0xb5, 0x8a, 0x18, 0x87, 0x54, 0x03, 0x6a, 0x15, 0x1e,
7702
-	0x52, 0x27, 0xd9, 0x34, 0x7a, 0x8c, 0xf5, 0x7c, 0xba, 0xa5, 0x76, 0x47, 0xc3, 0xb7, 0x5b, 0xc2,
7703
-	0x1b, 0x50, 0x2e, 0xc8, 0x20, 0xd4, 0x80, 0xb5, 0x1e, 0xeb, 0x31, 0xb5, 0xdc, 0x92, 0x2b, 0xfd,
7704
-	0xf5, 0xd6, 0x79, 0x1a, 0x09, 0xc6, 0xfa, 0xe8, 0x66, 0xe8, 0x0f, 0x7b, 0x5e, 0xb0, 0x15, 0xff,
7705
-	0x89, 0x3f, 0x36, 0xff, 0x6e, 0x80, 0xf9, 0x9c, 0x0a, 0x82, 0x7e, 0x01, 0xc5, 0x11, 0x8d, 0xb8,
7706
-	0xc7, 0x02, 0xcb, 0xd8, 0x34, 0xee, 0x54, 0xb6, 0xbf, 0xd7, 0x9a, 0xd7, 0xb7, 0xf5, 0x3a, 0x86,
7707
-	0x74, 0xcc, 0x8f, 0xa7, 0x8d, 0x1b, 0x38, 0x61, 0xa0, 0x07, 0x00, 0x4e, 0x44, 0x89, 0xa0, 0xae,
7708
-	0x4d, 0x84, 0x95, 0x53, 0xfc, 0x5a, 0x2b, 0x56, 0xa5, 0x95, 0xa8, 0xd2, 0x7a, 0x95, 0x58, 0x80,
7709
-	0xcb, 0x1a, 0xdd, 0x16, 0x92, 0x3a, 0x0c, 0xdd, 0x84, 0x9a, 0xbf, 0x9c, 0xaa, 0xd1, 0x6d, 0xd1,
7710
-	0xfc, 0xab, 0x09, 0xe6, 0x6f, 0x98, 0x4b, 0xd1, 0x3a, 0xe4, 0x3c, 0x57, 0xa9, 0x5d, 0xee, 0x14,
7711
-	0x26, 0xa7, 0x8d, 0x5c, 0x77, 0x1f, 0xe7, 0x3c, 0x17, 0x6d, 0x83, 0x39, 0xa0, 0x82, 0x68, 0x85,
7712
-	0xac, 0x2c, 0x83, 0xa4, 0xed, 0xda, 0x1a, 0x85, 0x45, 0x3f, 0x07, 0x53, 0x3e, 0x83, 0xd6, 0x64,
7713
-	0x23, 0x8b, 0x23, 0xef, 0x7c, 0x19, 0x52, 0x27, 0xe1, 0x49, 0x3c, 0x3a, 0x80, 0x8a, 0x4b, 0xb9,
7714
-	0x13, 0x79, 0xa1, 0x90, 0x3e, 0x34, 0x15, 0xfd, 0xf6, 0x22, 0xfa, 0xfe, 0x0c, 0x8a, 0xd3, 0x3c,
7715
-	0xf4, 0x4b, 0x28, 0x70, 0x41, 0xc4, 0x90, 0x5b, 0x4b, 0x4a, 0x42, 0x7d, 0xa1, 0x02, 0x0a, 0xa5,
7716
-	0x55, 0xd0, 0x1c, 0xf4, 0x14, 0xaa, 0x03, 0x12, 0x90, 0x1e, 0x8d, 0x6c, 0x2d, 0xa5, 0xa0, 0xa4,
7717
-	0xfc, 0x20, 0xd3, 0xf4, 0x18, 0x19, 0x0b, 0xc2, 0x2b, 0x83, 0xf4, 0x16, 0x1d, 0x00, 0x10, 0x21,
7718
-	0x88, 0xf3, 0x6e, 0x40, 0x03, 0x61, 0x15, 0x95, 0x94, 0x1f, 0x66, 0xea, 0x42, 0xc5, 0x7b, 0x16,
7719
-	0xf5, 0xdb, 0x53, 0x30, 0x4e, 0x11, 0xd1, 0x13, 0xa8, 0x38, 0x34, 0x12, 0xde, 0x5b, 0xcf, 0x21,
7720
-	0x82, 0x5a, 0x25, 0x25, 0xa7, 0x91, 0x25, 0x67, 0x6f, 0x06, 0xd3, 0x46, 0xa5, 0x99, 0xe8, 0x1e,
7721
-	0x98, 0x11, 0xf3, 0xa9, 0x55, 0xde, 0x34, 0xee, 0x54, 0x17, 0x3f, 0x0b, 0x66, 0x3e, 0xc5, 0x0a,
7722
-	0xb9, 0xbb, 0x7e, 0x7c, 0xd2, 0x44, 0xb0, 0x5a, 0x32, 0x56, 0x0d, 0x15, 0x1a, 0xc6, 0x3d, 0xe3,
7723
-	0x77, 0xc6, 0xef, 0x8d, 0xe6, 0xff, 0xf3, 0x50, 0x7c, 0x49, 0xa3, 0x91, 0xe7, 0x7c, 0xd9, 0xc0,
7724
-	0x79, 0x70, 0x26, 0x70, 0x32, 0x6d, 0xd4, 0xd7, 0xce, 0xc5, 0xce, 0x0e, 0x94, 0x68, 0xe0, 0x86,
7725
-	0xcc, 0x0b, 0x84, 0x0e, 0x9c, 0x4c, 0x03, 0x0f, 0x34, 0x06, 0x4f, 0xd1, 0xe8, 0x00, 0x56, 0xe2,
7726
-	0x7c, 0xb0, 0xcf, 0x44, 0xcd, 0x66, 0x16, 0xfd, 0xb7, 0x0a, 0xa8, 0x9f, 0x7b, 0x79, 0x98, 0xda,
7727
-	0xa1, 0x7d, 0x58, 0x09, 0x23, 0x3a, 0xf2, 0xd8, 0x90, 0xdb, 0xca, 0x88, 0xc2, 0x95, 0x8c, 0xc0,
7728
-	0xcb, 0x09, 0x4b, 0xee, 0xd0, 0xaf, 0x60, 0x59, 0x92, 0xed, 0xa4, 0x8e, 0xc0, 0xa5, 0x75, 0x04,
7729
-	0xab, 0x92, 0xa7, 0x37, 0xe8, 0x05, 0x7c, 0xe7, 0x8c, 0x16, 0x53, 0x41, 0x95, 0xcb, 0x05, 0xdd,
7730
-	0x4c, 0x6b, 0xa2, 0x3f, 0xee, 0xa2, 0xe3, 0x93, 0x66, 0x15, 0x96, 0xd3, 0x21, 0xd0, 0xfc, 0x4b,
7731
-	0x0e, 0x4a, 0x89, 0x23, 0xd1, 0x7d, 0xfd, 0x66, 0xc6, 0x62, 0xaf, 0x25, 0x58, 0x65, 0x6f, 0xfc,
7732
-	0x5c, 0xf7, 0x61, 0x29, 0x64, 0x91, 0xe0, 0x56, 0x6e, 0x33, 0xbf, 0x28, 0x45, 0x0f, 0x59, 0x24,
7733
-	0xf6, 0x58, 0xf0, 0xd6, 0xeb, 0xe1, 0x18, 0x8c, 0xde, 0x40, 0x65, 0xe4, 0x45, 0x62, 0x48, 0x7c,
7734
-	0xdb, 0x0b, 0xb9, 0x95, 0x57, 0xdc, 0x1f, 0x5d, 0x74, 0x65, 0xeb, 0x75, 0x8c, 0xef, 0x1e, 0x76,
7735
-	0xaa, 0x93, 0xd3, 0x06, 0x4c, 0xb7, 0x1c, 0x83, 0x16, 0xd5, 0x0d, 0x79, 0xed, 0x39, 0x94, 0xa7,
7736
-	0x27, 0xe8, 0x2e, 0x40, 0x10, 0x67, 0xa4, 0x3d, 0x8d, 0xec, 0x95, 0xc9, 0x69, 0xa3, 0xac, 0xf3,
7737
-	0xb4, 0xbb, 0x8f, 0xcb, 0x1a, 0xd0, 0x75, 0x11, 0x02, 0x93, 0xb8, 0x6e, 0xa4, 0xe2, 0xbc, 0x8c,
7738
-	0xd5, 0xba, 0xf9, 0xe7, 0x22, 0x98, 0xaf, 0x08, 0xef, 0x5f, 0x77, 0x55, 0x95, 0x77, 0xce, 0x65,
7739
-	0xc6, 0x5d, 0x00, 0x1e, 0xc7, 0x9b, 0x34, 0xc7, 0x9c, 0x99, 0xa3, 0xa3, 0x50, 0x9a, 0xa3, 0x01,
7740
-	0xb1, 0x39, 0xdc, 0x67, 0x42, 0x25, 0x81, 0x89, 0xd5, 0x1a, 0xdd, 0x86, 0x62, 0xc0, 0x5c, 0x45,
7741
-	0x2f, 0x28, 0x3a, 0x4c, 0x4e, 0x1b, 0x05, 0x59, 0x2b, 0xba, 0xfb, 0xb8, 0x20, 0x8f, 0xba, 0xae,
7742
-	0x2c, 0x53, 0x24, 0x08, 0x98, 0x20, 0xb2, 0x06, 0x73, 0x5d, 0xee, 0x32, 0xa3, 0xbf, 0x3d, 0x83,
7743
-	0x25, 0x65, 0x2a, 0xc5, 0x44, 0xaf, 0xe1, 0x66, 0xa2, 0x6f, 0x5a, 0x60, 0xe9, 0x73, 0x04, 0x22,
7744
-	0x2d, 0x21, 0x75, 0x92, 0x6a, 0x0b, 0xe5, 0xc5, 0x6d, 0x41, 0x79, 0x30, 0xab, 0x2d, 0x74, 0x60,
7745
-	0xc5, 0xa5, 0xdc, 0x8b, 0xa8, 0xab, 0xca, 0x04, 0x55, 0x99, 0x59, 0xdd, 0xfe, 0xfe, 0x45, 0x42,
7746
-	0x28, 0x5e, 0xd6, 0x1c, 0xb5, 0x43, 0x6d, 0x28, 0xe9, 0xb8, 0xe1, 0x56, 0x45, 0xc5, 0xee, 0x15,
7747
-	0xdb, 0xc1, 0x94, 0x76, 0xa6, 0xcc, 0x2d, 0x7f, 0x56, 0x99, 0x7b, 0x00, 0xe0, 0xb3, 0x9e, 0xed,
7748
-	0x46, 0xde, 0x88, 0x46, 0xd6, 0x8a, 0x1e, 0x12, 0x32, 0xb8, 0xfb, 0x0a, 0x81, 0xcb, 0x3e, 0xeb,
7749
-	0xc5, 0xcb, 0xb9, 0xa2, 0x54, 0xfd, 0xcc, 0xa2, 0x44, 0xa0, 0x46, 0x38, 0xf7, 0x7a, 0x01, 0x75,
7750
-	0xed, 0x1e, 0x0d, 0x68, 0xe4, 0x39, 0x76, 0x44, 0x39, 0x1b, 0x46, 0x0e, 0xe5, 0xd6, 0xb7, 0x94,
7751
-	0x27, 0x32, 0xdb, 0xfc, 0x93, 0x18, 0x8c, 0x35, 0x16, 0x5b, 0x89, 0x98, 0x73, 0x07, 0x7c, 0xb7,
7752
-	0x76, 0x7c, 0xd2, 0x5c, 0x87, 0xb5, 0x74, 0x99, 0xda, 0x31, 0x1e, 0x1b, 0x4f, 0x8d, 0x43, 0xa3,
7753
-	0xf9, 0xcf, 0x1c, 0x7c, 0x7b, 0xce, 0xa7, 0xe8, 0x67, 0x50, 0xd4, 0x5e, 0xbd, 0x68, 0x58, 0xd3,
7754
-	0x3c, 0x9c, 0x60, 0xd1, 0x06, 0x94, 0x65, 0x8a, 0x53, 0xce, 0x69, 0x5c, 0xbc, 0xca, 0x78, 0xf6,
7755
-	0x01, 0x59, 0x50, 0x24, 0xbe, 0x47, 0xe4, 0x59, 0x5e, 0x9d, 0x25, 0x5b, 0x34, 0x84, 0xf5, 0xd8,
7756
-	0xf5, 0xf6, 0xac, 0xb5, 0xdb, 0x2c, 0x14, 0xdc, 0x32, 0x95, 0xfd, 0x8f, 0xae, 0x14, 0x09, 0xfa,
7757
-	0x71, 0x66, 0x1f, 0x5e, 0x84, 0x82, 0x1f, 0x04, 0x22, 0x1a, 0xe3, 0x35, 0x37, 0xe3, 0xa8, 0xf6,
7758
-	0x04, 0x6e, 0x2d, 0xa4, 0xa0, 0x55, 0xc8, 0xf7, 0xe9, 0x38, 0x2e, 0x4f, 0x58, 0x2e, 0xd1, 0x1a,
7759
-	0x2c, 0x8d, 0x88, 0x3f, 0xa4, 0xba, 0x9a, 0xc5, 0x9b, 0xdd, 0xdc, 0x8e, 0xd1, 0xfc, 0x90, 0x83,
7760
-	0xa2, 0x56, 0xe7, 0xba, 0x5b, 0xbe, 0xbe, 0x76, 0xae, 0xb0, 0x3d, 0x84, 0x65, 0xed, 0xd2, 0x38,
7761
-	0x23, 0xcd, 0x4b, 0x63, 0xba, 0x12, 0xe3, 0xe3, 0x6c, 0x7c, 0x08, 0xa6, 0x17, 0x92, 0x81, 0x6e,
7762
-	0xf7, 0x99, 0x37, 0x77, 0x0f, 0xdb, 0xcf, 0x5f, 0x84, 0x71, 0x61, 0x29, 0x4d, 0x4e, 0x1b, 0xa6,
7763
-	0xfc, 0x80, 0x15, 0x2d, 0xb3, 0x31, 0xfe, 0x6d, 0x09, 0x8a, 0x7b, 0xfe, 0x90, 0x0b, 0x1a, 0x5d,
7764
-	0xb7, 0x93, 0xf4, 0xb5, 0x73, 0x4e, 0xda, 0x83, 0x62, 0xc4, 0x98, 0xb0, 0x1d, 0x72, 0x91, 0x7f,
7765
-	0x30, 0x63, 0x62, 0xaf, 0xdd, 0xa9, 0x4a, 0xa2, 0xac, 0xed, 0xf1, 0x1e, 0x17, 0x24, 0x75, 0x8f,
7766
-	0xa0, 0x37, 0xb0, 0x9e, 0x74, 0xc4, 0x23, 0xc6, 0x04, 0x17, 0x11, 0x09, 0xed, 0x3e, 0x1d, 0xcb,
7767
-	0x59, 0x29, 0xbf, 0x68, 0x36, 0x3e, 0x08, 0x9c, 0x68, 0xac, 0x9c, 0xf7, 0x8c, 0x8e, 0xf1, 0x9a,
7768
-	0x16, 0xd0, 0x49, 0xf8, 0xcf, 0xe8, 0x98, 0xa3, 0x47, 0xb0, 0x41, 0xa7, 0x30, 0x29, 0xd1, 0xf6,
7769
-	0xc9, 0x40, 0xf6, 0x7a, 0xdb, 0xf1, 0x99, 0xd3, 0x57, 0xed, 0xc6, 0xc4, 0xb7, 0x68, 0x5a, 0xd4,
7770
-	0xaf, 0x63, 0xc4, 0x9e, 0x04, 0x20, 0x0e, 0xd6, 0x91, 0x4f, 0x9c, 0xbe, 0xef, 0x71, 0xf9, 0xef,
7771
-	0x4f, 0x6a, 0xdc, 0x95, 0x1d, 0x43, 0xea, 0xb6, 0x73, 0x81, 0xb7, 0x5a, 0x9d, 0x19, 0x37, 0x35,
7772
-	0x3c, 0xeb, 0x8c, 0xfa, 0xee, 0x51, 0xf6, 0x29, 0xea, 0x40, 0x65, 0x18, 0xc8, 0xeb, 0x63, 0x1f,
7773
-	0x94, 0xaf, 0xea, 0x03, 0x88, 0x59, 0xd2, 0xf2, 0xda, 0x08, 0x36, 0x2e, 0xba, 0x3c, 0x23, 0x37,
7774
-	0x1f, 0xa7, 0x73, 0xb3, 0xb2, 0xfd, 0xe3, 0xac, 0xfb, 0xb2, 0x45, 0xa6, 0xf2, 0x38, 0x33, 0x6c,
7775
-	0xff, 0x61, 0x40, 0xe1, 0x25, 0x75, 0x22, 0x2a, 0xbe, 0x68, 0xd4, 0xee, 0x9c, 0x89, 0xda, 0x7a,
7776
-	0xf6, 0x20, 0x2c, 0x6f, 0x9d, 0x0b, 0xda, 0x1a, 0x94, 0xbc, 0x40, 0xd0, 0x28, 0x20, 0xbe, 0x8a,
7777
-	0xda, 0x12, 0x9e, 0xee, 0x33, 0x0d, 0xf8, 0x60, 0x40, 0x21, 0x9e, 0x14, 0xaf, 0xdb, 0x80, 0xf8,
7778
-	0xd6, 0xf3, 0x06, 0x64, 0x2a, 0xf9, 0x3f, 0x03, 0x4a, 0x49, 0xc3, 0xfa, 0xa2, 0x6a, 0x9e, 0x9b,
7779
-	0xbc, 0xf2, 0x5f, 0x7b, 0xf2, 0x42, 0x60, 0xf6, 0xbd, 0x40, 0xcf, 0x88, 0x58, 0xad, 0x51, 0x0b,
7780
-	0x8a, 0x21, 0x19, 0xfb, 0x8c, 0xb8, 0xba, 0x50, 0xae, 0xcd, 0xfd, 0xb0, 0xd0, 0x0e, 0xc6, 0x38,
7781
-	0x01, 0xed, 0xae, 0x1d, 0x9f, 0x34, 0x57, 0xa1, 0x9a, 0xb6, 0xfc, 0x9d, 0xd1, 0xfc, 0xb7, 0x01,
7782
-	0xe5, 0x83, 0x3f, 0x0a, 0x1a, 0xa8, 0x79, 0xe0, 0x1b, 0x69, 0xfc, 0xe6, 0xfc, 0x8f, 0x0f, 0xe5,
7783
-	0x33, 0xbf, 0x2b, 0x64, 0x3d, 0x6a, 0xc7, 0xfa, 0xf8, 0xa9, 0x7e, 0xe3, 0x3f, 0x9f, 0xea, 0x37,
7784
-	0xfe, 0x34, 0xa9, 0x1b, 0x1f, 0x27, 0x75, 0xe3, 0x5f, 0x93, 0xba, 0xf1, 0xdf, 0x49, 0xdd, 0x38,
7785
-	0x2a, 0x28, 0xff, 0xfc, 0xf4, 0xab, 0x00, 0x00, 0x00, 0xff, 0xff, 0xe4, 0x48, 0xcb, 0x39, 0xc2,
7786
-	0x12, 0x00, 0x00,
7692
+	// 1513 bytes of a gzipped FileDescriptorProto
7693
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xcc, 0x58, 0x4d, 0x6f, 0x1b, 0x4f,
7694
+	0x19, 0xef, 0xda, 0x1b, 0xbf, 0x3c, 0x4e, 0x4c, 0x98, 0x7f, 0x08, 0x5b, 0x13, 0xec, 0xe0, 0x0a,
7695
+	0x54, 0x55, 0x95, 0x53, 0x42, 0x81, 0x34, 0x50, 0x5a, 0x3b, 0x89, 0x5a, 0xab, 0x94, 0x46, 0xd3,
7696
+	0xd2, 0x72, 0x5b, 0x26, 0xbb, 0x53, 0x77, 0xf1, 0x7a, 0x67, 0xb5, 0x33, 0x76, 0xf1, 0x8d, 0x73,
7697
+	0xf8, 0x00, 0xb9, 0x71, 0xe8, 0x57, 0x80, 0x0b, 0x17, 0x0e, 0x9c, 0x7a, 0xe4, 0x84, 0x38, 0x45,
7698
+	0xd4, 0xdf, 0x02, 0x89, 0x03, 0x9a, 0xd9, 0x59, 0x7b, 0x13, 0xaf, 0x93, 0x14, 0x55, 0xd1, 0xff,
7699
+	0x94, 0x99, 0x9d, 0xdf, 0xef, 0x79, 0x9b, 0xe7, 0x65, 0x62, 0xb8, 0xdb, 0xf3, 0xc4, 0xbb, 0xe1,
7700
+	0x51, 0xcb, 0x61, 0x83, 0x2d, 0x97, 0x39, 0x7d, 0x1a, 0x6d, 0xf1, 0xf7, 0x24, 0x1a, 0xf4, 0x3d,
7701
+	0xb1, 0x45, 0x42, 0x6f, 0x8b, 0x1d, 0xfd, 0x8e, 0x3a, 0x82, 0xb7, 0xc2, 0x88, 0x09, 0x86, 0x50,
7702
+	0x0c, 0x69, 0x25, 0x90, 0xd6, 0xe8, 0x87, 0xb5, 0x3b, 0x97, 0x48, 0x10, 0xe3, 0x90, 0x6a, 0xfe,
7703
+	0xa5, 0x58, 0x1e, 0x52, 0x27, 0xc1, 0x36, 0x7a, 0x8c, 0xf5, 0x7c, 0xba, 0xa5, 0x76, 0x47, 0xc3,
7704
+	0xb7, 0x5b, 0xc2, 0x1b, 0x50, 0x2e, 0xc8, 0x20, 0xd4, 0x80, 0xb5, 0x1e, 0xeb, 0x31, 0xb5, 0xdc,
7705
+	0x92, 0x2b, 0xfd, 0xf5, 0xe6, 0x79, 0x1a, 0x09, 0xc6, 0xfa, 0xe8, 0xa7, 0x17, 0x68, 0x9f, 0xc2,
7706
+	0x43, 0x7f, 0xd8, 0xf3, 0x02, 0xfd, 0x27, 0x26, 0x36, 0xff, 0x6a, 0x80, 0xf9, 0x9c, 0x0a, 0x82,
7707
+	0x7e, 0x06, 0xc5, 0x11, 0x8d, 0xb8, 0xc7, 0x02, 0xcb, 0xd8, 0x34, 0x6e, 0x57, 0xb6, 0xbf, 0xd3,
7708
+	0x9a, 0x8f, 0x48, 0xeb, 0x75, 0x0c, 0xe9, 0x98, 0x1f, 0x4f, 0x1b, 0x37, 0x70, 0xc2, 0x40, 0x0f,
7709
+	0x00, 0x9c, 0x88, 0x12, 0x41, 0x5d, 0x9b, 0x08, 0x2b, 0xa7, 0xf8, 0xb5, 0x56, 0x6c, 0x6e, 0x2b,
7710
+	0xd1, 0xdf, 0x7a, 0x95, 0x78, 0x89, 0xcb, 0x1a, 0xdd, 0x16, 0x92, 0x3a, 0x0c, 0xdd, 0x84, 0x9a,
7711
+	0xbf, 0x9c, 0xaa, 0xd1, 0x6d, 0xd1, 0xfc, 0xb3, 0x09, 0xe6, 0xaf, 0x98, 0x4b, 0xd1, 0x3a, 0xe4,
7712
+	0x3c, 0x57, 0x99, 0x5d, 0xee, 0x14, 0x26, 0xa7, 0x8d, 0x5c, 0x77, 0x1f, 0xe7, 0x3c, 0x17, 0x6d,
7713
+	0x83, 0x39, 0xa0, 0x82, 0x68, 0x83, 0xac, 0x2c, 0x87, 0xa4, 0xef, 0xda, 0x1b, 0x85, 0x45, 0x3f,
7714
+	0x01, 0x53, 0x5e, 0x95, 0xb6, 0x64, 0x23, 0x8b, 0x23, 0x75, 0xbe, 0x0c, 0xa9, 0x93, 0xf0, 0x24,
7715
+	0x1e, 0x1d, 0x40, 0xc5, 0xa5, 0xdc, 0x89, 0xbc, 0x50, 0xc8, 0x18, 0x9a, 0x8a, 0x7e, 0x6b, 0x11,
7716
+	0x7d, 0x7f, 0x06, 0xc5, 0x69, 0x1e, 0xfa, 0x39, 0x14, 0xb8, 0x20, 0x62, 0xc8, 0xad, 0x25, 0x25,
7717
+	0xa1, 0xbe, 0xd0, 0x00, 0x85, 0xd2, 0x26, 0x68, 0x0e, 0x7a, 0x0a, 0xd5, 0x01, 0x09, 0x48, 0x8f,
7718
+	0x46, 0xb6, 0x96, 0x52, 0x50, 0x52, 0xbe, 0x97, 0xe9, 0x7a, 0x8c, 0x8c, 0x05, 0xe1, 0x95, 0x41,
7719
+	0x7a, 0x8b, 0x0e, 0x00, 0x88, 0x10, 0xc4, 0x79, 0x37, 0xa0, 0x81, 0xb0, 0x8a, 0x4a, 0xca, 0xf7,
7720
+	0x33, 0x6d, 0xa1, 0xe2, 0x3d, 0x8b, 0xfa, 0xed, 0x29, 0x18, 0xa7, 0x88, 0xe8, 0x09, 0x54, 0x1c,
7721
+	0x1a, 0x09, 0xef, 0xad, 0xe7, 0x10, 0x41, 0xad, 0x92, 0x92, 0xd3, 0xc8, 0x92, 0xb3, 0x37, 0x83,
7722
+	0x69, 0xa7, 0xd2, 0x4c, 0x74, 0x0f, 0xcc, 0x88, 0xf9, 0xd4, 0x2a, 0x6f, 0x1a, 0xb7, 0xab, 0x8b,
7723
+	0xaf, 0x05, 0x33, 0x9f, 0x62, 0x85, 0xdc, 0x5d, 0x3f, 0x3e, 0x69, 0x22, 0x58, 0x2d, 0x19, 0xab,
7724
+	0x86, 0x4a, 0x0d, 0xe3, 0x9e, 0xf1, 0x1b, 0xe3, 0xb7, 0x46, 0xf3, 0xbf, 0x79, 0x28, 0xbe, 0xa4,
7725
+	0xd1, 0xc8, 0x73, 0xbe, 0x6c, 0xe2, 0x3c, 0x38, 0x93, 0x38, 0x99, 0x3e, 0x6a, 0xb5, 0x73, 0xb9,
7726
+	0xb3, 0x03, 0x25, 0x1a, 0xb8, 0x21, 0xf3, 0x02, 0xa1, 0x13, 0x27, 0xd3, 0xc1, 0x03, 0x8d, 0xc1,
7727
+	0x53, 0x34, 0x3a, 0x80, 0x95, 0xb8, 0x1e, 0xec, 0x33, 0x59, 0xb3, 0x99, 0x45, 0xff, 0xb5, 0x02,
7728
+	0xea, 0xeb, 0x5e, 0x1e, 0xa6, 0x76, 0x68, 0x1f, 0x56, 0xc2, 0x88, 0x8e, 0x3c, 0x36, 0xe4, 0xb6,
7729
+	0x72, 0xa2, 0x70, 0x25, 0x27, 0xf0, 0x72, 0xc2, 0x92, 0x3b, 0xf4, 0x0b, 0x58, 0x96, 0x64, 0x3b,
7730
+	0xe9, 0x23, 0x70, 0x69, 0x1f, 0xc1, 0x15, 0x49, 0xd0, 0x1b, 0xf4, 0x02, 0xbe, 0x75, 0xc6, 0x8a,
7731
+	0xa9, 0xa0, 0xca, 0xe5, 0x82, 0xbe, 0x4a, 0x5b, 0xa2, 0x3f, 0xee, 0xa2, 0xe3, 0x93, 0x66, 0x15,
7732
+	0x96, 0xd3, 0x29, 0xd0, 0xfc, 0x53, 0x0e, 0x4a, 0x49, 0x20, 0xd1, 0x7d, 0x7d, 0x67, 0xc6, 0xe2,
7733
+	0xa8, 0x25, 0x58, 0xe5, 0x6f, 0x7c, 0x5d, 0xf7, 0x61, 0x29, 0x64, 0x91, 0xe0, 0x56, 0x6e, 0x33,
7734
+	0xbf, 0xa8, 0x44, 0x0f, 0x59, 0x24, 0xf6, 0x58, 0xf0, 0xd6, 0xeb, 0xe1, 0x18, 0x8c, 0xde, 0x40,
7735
+	0x65, 0xe4, 0x45, 0x62, 0x48, 0x7c, 0xdb, 0x0b, 0xb9, 0x95, 0x57, 0xdc, 0x1f, 0x5c, 0xa4, 0xb2,
7736
+	0xf5, 0x3a, 0xc6, 0x77, 0x0f, 0x3b, 0xd5, 0xc9, 0x69, 0x03, 0xa6, 0x5b, 0x8e, 0x41, 0x8b, 0xea,
7737
+	0x86, 0xbc, 0xf6, 0x1c, 0xca, 0xd3, 0x13, 0x74, 0x17, 0x20, 0x88, 0x2b, 0xd2, 0x9e, 0x66, 0xf6,
7738
+	0xca, 0xe4, 0xb4, 0x51, 0xd6, 0x75, 0xda, 0xdd, 0xc7, 0x65, 0x0d, 0xe8, 0xba, 0x08, 0x81, 0x49,
7739
+	0x5c, 0x37, 0x52, 0x79, 0x5e, 0xc6, 0x6a, 0xdd, 0xfc, 0x63, 0x11, 0xcc, 0x57, 0x84, 0xf7, 0xaf,
7740
+	0xbb, 0xab, 0x4a, 0x9d, 0x73, 0x95, 0x71, 0x17, 0x80, 0xc7, 0xf9, 0x26, 0xdd, 0x31, 0x67, 0xee,
7741
+	0xe8, 0x2c, 0x94, 0xee, 0x68, 0x40, 0xec, 0x0e, 0xf7, 0x99, 0x50, 0x45, 0x60, 0x62, 0xb5, 0x46,
7742
+	0xb7, 0xa0, 0x18, 0x30, 0x57, 0xd1, 0x0b, 0x8a, 0x0e, 0x93, 0xd3, 0x46, 0x41, 0xf6, 0x8a, 0xee,
7743
+	0x3e, 0x2e, 0xc8, 0xa3, 0xae, 0x2b, 0xdb, 0x14, 0x09, 0x02, 0x26, 0x88, 0xec, 0xc1, 0x5c, 0xb7,
7744
+	0xbb, 0xcc, 0xec, 0x6f, 0xcf, 0x60, 0x49, 0x9b, 0x4a, 0x31, 0xd1, 0x6b, 0xf8, 0x2a, 0xb1, 0x37,
7745
+	0x2d, 0xb0, 0xf4, 0x39, 0x02, 0x91, 0x96, 0x90, 0x3a, 0x49, 0x8d, 0x85, 0xf2, 0xe2, 0xb1, 0xa0,
7746
+	0x22, 0x98, 0x35, 0x16, 0x3a, 0xb0, 0xe2, 0x52, 0xee, 0x45, 0xd4, 0x55, 0x6d, 0x82, 0xaa, 0xca,
7747
+	0xac, 0x6e, 0x7f, 0xf7, 0x22, 0x21, 0x14, 0x2f, 0x6b, 0x8e, 0xda, 0xa1, 0x36, 0x94, 0x74, 0xde,
7748
+	0x70, 0xab, 0xa2, 0x72, 0xf7, 0x8a, 0xe3, 0x60, 0x4a, 0x3b, 0xd3, 0xe6, 0x96, 0x3f, 0xab, 0xcd,
7749
+	0x3d, 0x00, 0xf0, 0x59, 0xcf, 0x76, 0x23, 0x6f, 0x44, 0x23, 0x6b, 0x45, 0x3f, 0x12, 0x32, 0xb8,
7750
+	0xfb, 0x0a, 0x81, 0xcb, 0x3e, 0xeb, 0xc5, 0xcb, 0xb9, 0xa6, 0x54, 0xfd, 0xcc, 0xa6, 0x44, 0xa0,
7751
+	0x46, 0x38, 0xf7, 0x7a, 0x01, 0x75, 0xed, 0x1e, 0x0d, 0x68, 0xe4, 0x39, 0x76, 0x44, 0x39, 0x1b,
7752
+	0x46, 0x0e, 0xe5, 0xd6, 0x37, 0x54, 0x24, 0x32, 0xc7, 0xfc, 0x93, 0x18, 0x8c, 0x35, 0x16, 0x5b,
7753
+	0x89, 0x98, 0x73, 0x07, 0x7c, 0xb7, 0x76, 0x7c, 0xd2, 0x5c, 0x87, 0xb5, 0x74, 0x9b, 0xda, 0x31,
7754
+	0x1e, 0x1b, 0x4f, 0x8d, 0x43, 0xa3, 0xf9, 0xf7, 0x1c, 0x7c, 0x73, 0x2e, 0xa6, 0xe8, 0xc7, 0x50,
7755
+	0xd4, 0x51, 0xbd, 0xe8, 0xb1, 0xa6, 0x79, 0x38, 0xc1, 0xa2, 0x0d, 0x28, 0xcb, 0x12, 0xa7, 0x9c,
7756
+	0xd3, 0xb8, 0x79, 0x95, 0xf1, 0xec, 0x03, 0xb2, 0xa0, 0x48, 0x7c, 0x8f, 0xc8, 0xb3, 0xbc, 0x3a,
7757
+	0x4b, 0xb6, 0x68, 0x08, 0xeb, 0x71, 0xe8, 0xed, 0xd9, 0x68, 0xb7, 0x59, 0x28, 0xb8, 0x65, 0x2a,
7758
+	0xff, 0x1f, 0x5d, 0x29, 0x13, 0xf4, 0xe5, 0xcc, 0x3e, 0xbc, 0x08, 0x05, 0x3f, 0x08, 0x44, 0x34,
7759
+	0xc6, 0x6b, 0x6e, 0xc6, 0x51, 0xed, 0x09, 0xdc, 0x5c, 0x48, 0x41, 0xab, 0x90, 0xef, 0xd3, 0x71,
7760
+	0xdc, 0x9e, 0xb0, 0x5c, 0xa2, 0x35, 0x58, 0x1a, 0x11, 0x7f, 0x48, 0x75, 0x37, 0x8b, 0x37, 0xbb,
7761
+	0xb9, 0x1d, 0xa3, 0xf9, 0x21, 0x07, 0x45, 0x6d, 0xce, 0x75, 0x8f, 0x7c, 0xad, 0x76, 0xae, 0xb1,
7762
+	0x3d, 0x84, 0x65, 0x1d, 0xd2, 0xb8, 0x22, 0xcd, 0x4b, 0x73, 0xba, 0x12, 0xe3, 0xe3, 0x6a, 0x7c,
7763
+	0x08, 0xa6, 0x17, 0x92, 0x81, 0x1e, 0xf7, 0x99, 0x9a, 0xbb, 0x87, 0xed, 0xe7, 0x2f, 0xc2, 0xb8,
7764
+	0xb1, 0x94, 0x26, 0xa7, 0x0d, 0x53, 0x7e, 0xc0, 0x8a, 0x96, 0x39, 0x18, 0xff, 0xb2, 0x04, 0xc5,
7765
+	0x3d, 0x7f, 0xc8, 0x05, 0x8d, 0xae, 0x3b, 0x48, 0x5a, 0xed, 0x5c, 0x90, 0xf6, 0xa0, 0x18, 0x31,
7766
+	0x26, 0x6c, 0x87, 0x5c, 0x14, 0x1f, 0xcc, 0x98, 0xd8, 0x6b, 0x77, 0xaa, 0x92, 0x28, 0x7b, 0x7b,
7767
+	0xbc, 0xc7, 0x05, 0x49, 0xdd, 0x23, 0xe8, 0x0d, 0xac, 0x27, 0x13, 0xf1, 0x88, 0x31, 0xc1, 0x45,
7768
+	0x44, 0x42, 0xbb, 0x4f, 0xc7, 0xf2, 0xad, 0x94, 0x5f, 0xf4, 0x36, 0x3e, 0x08, 0x9c, 0x68, 0xac,
7769
+	0x82, 0xf7, 0x8c, 0x8e, 0xf1, 0x9a, 0x16, 0xd0, 0x49, 0xf8, 0xcf, 0xe8, 0x98, 0xa3, 0x47, 0xb0,
7770
+	0x41, 0xa7, 0x30, 0x29, 0xd1, 0xf6, 0xc9, 0x40, 0xce, 0x7a, 0xdb, 0xf1, 0x99, 0xd3, 0x57, 0xe3,
7771
+	0xc6, 0xc4, 0x37, 0x69, 0x5a, 0xd4, 0x2f, 0x63, 0xc4, 0x9e, 0x04, 0x20, 0x0e, 0xd6, 0x91, 0x4f,
7772
+	0x9c, 0xbe, 0xef, 0x71, 0xf9, 0xef, 0x4f, 0xea, 0xb9, 0x2b, 0x27, 0x86, 0xb4, 0x6d, 0xe7, 0x82,
7773
+	0x68, 0xb5, 0x3a, 0x33, 0x6e, 0xea, 0xf1, 0xac, 0x2b, 0xea, 0xdb, 0x47, 0xd9, 0xa7, 0xa8, 0x03,
7774
+	0x95, 0x61, 0x20, 0xd5, 0xc7, 0x31, 0x28, 0x5f, 0x35, 0x06, 0x10, 0xb3, 0xa4, 0xe7, 0xb5, 0x11,
7775
+	0x6c, 0x5c, 0xa4, 0x3c, 0xa3, 0x36, 0x1f, 0xa7, 0x6b, 0xb3, 0xb2, 0x7d, 0x27, 0x4b, 0x5f, 0xb6,
7776
+	0xc8, 0x54, 0x1d, 0x67, 0xa6, 0xed, 0xdf, 0x0c, 0x28, 0xbc, 0xa4, 0x4e, 0x44, 0xc5, 0x17, 0xcd,
7777
+	0xda, 0x9d, 0x33, 0x59, 0x5b, 0xcf, 0x7e, 0x08, 0x4b, 0xad, 0x73, 0x49, 0x5b, 0x83, 0x92, 0x17,
7778
+	0x08, 0x1a, 0x05, 0xc4, 0x57, 0x59, 0x5b, 0xc2, 0xd3, 0x7d, 0xa6, 0x03, 0x1f, 0x0c, 0x28, 0xc4,
7779
+	0x2f, 0xc5, 0xeb, 0x76, 0x20, 0xd6, 0x7a, 0xde, 0x81, 0x4c, 0x23, 0xff, 0x63, 0x40, 0x29, 0x19,
7780
+	0x58, 0x5f, 0xd4, 0xcc, 0x73, 0x2f, 0xaf, 0xfc, 0xff, 0xfd, 0xf2, 0x42, 0x60, 0xf6, 0xbd, 0x40,
7781
+	0xbf, 0x11, 0xb1, 0x5a, 0xa3, 0x16, 0x14, 0x43, 0x32, 0xf6, 0x19, 0x71, 0x75, 0xa3, 0x5c, 0x9b,
7782
+	0xfb, 0x61, 0xa1, 0x1d, 0x8c, 0x71, 0x02, 0xda, 0x5d, 0x3b, 0x3e, 0x69, 0xae, 0x42, 0x35, 0xed,
7783
+	0xf9, 0x3b, 0xa3, 0xf9, 0x4f, 0x03, 0xca, 0x07, 0xbf, 0x17, 0x34, 0x50, 0xef, 0x81, 0xaf, 0xa5,
7784
+	0xf3, 0x9b, 0xf3, 0x3f, 0x3e, 0x94, 0xcf, 0xfc, 0xae, 0x90, 0x75, 0xa9, 0x1d, 0xeb, 0xe3, 0xa7,
7785
+	0xfa, 0x8d, 0x7f, 0x7d, 0xaa, 0xdf, 0xf8, 0xc3, 0xa4, 0x6e, 0x7c, 0x9c, 0xd4, 0x8d, 0x7f, 0x4c,
7786
+	0xea, 0xc6, 0xbf, 0x27, 0x75, 0xe3, 0xa8, 0xa0, 0xe2, 0xf3, 0xa3, 0xff, 0x05, 0x00, 0x00, 0xff,
7787
+	0xff, 0x34, 0x0b, 0x7d, 0x79, 0x43, 0x13, 0x00, 0x00,
7787 7788
 }
... ...
@@ -2,12 +2,12 @@ syntax = "proto3";
2 2
 
3 3
 package docker.swarmkit.v1;
4 4
 
5
-import "types.proto";
6
-import "specs.proto";
5
+import "github.com/docker/swarmkit/api/types.proto";
6
+import "github.com/docker/swarmkit/api/specs.proto";
7 7
 import "google/protobuf/timestamp.proto";
8 8
 import "gogoproto/gogo.proto";
9 9
 import "google/protobuf/any.proto";
10
-import "plugin/plugin.proto";
10
+import "github.com/docker/swarmkit/protobuf/plugin/plugin.proto";
11 11
 
12 12
 // This file contains definitions for all first-class objects in the cluster
13 13
 // API. Such types typically have a corresponding specification, with the
... ...
@@ -1,5 +1,5 @@
1 1
 // Code generated by protoc-gen-gogo.
2
-// source: raft.proto
2
+// source: github.com/docker/swarmkit/api/raft.proto
3 3
 // DO NOT EDIT!
4 4
 
5 5
 package api
... ...
@@ -907,7 +907,7 @@ var _Raft_serviceDesc = grpc.ServiceDesc{
907 907
 		},
908 908
 	},
909 909
 	Streams:  []grpc.StreamDesc{},
910
-	Metadata: "raft.proto",
910
+	Metadata: "github.com/docker/swarmkit/api/raft.proto",
911 911
 }
912 912
 
913 913
 // Client API for RaftMembership service
... ...
@@ -1008,7 +1008,7 @@ var _RaftMembership_serviceDesc = grpc.ServiceDesc{
1008 1008
 		},
1009 1009
 	},
1010 1010
 	Streams:  []grpc.StreamDesc{},
1011
-	Metadata: "raft.proto",
1011
+	Metadata: "github.com/docker/swarmkit/api/raft.proto",
1012 1012
 }
1013 1013
 
1014 1014
 func (m *RaftMember) Marshal() (dAtA []byte, err error) {
... ...
@@ -3571,68 +3571,69 @@ var (
3571 3571
 	ErrIntOverflowRaft   = fmt.Errorf("proto: integer overflow")
3572 3572
 )
3573 3573
 
3574
-func init() { proto.RegisterFile("raft.proto", fileDescriptorRaft) }
3574
+func init() { proto.RegisterFile("github.com/docker/swarmkit/api/raft.proto", fileDescriptorRaft) }
3575 3575
 
3576 3576
 var fileDescriptorRaft = []byte{
3577
-	// 953 bytes of a gzipped FileDescriptorProto
3578
-	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x96, 0x4d, 0x6f, 0x1b, 0x45,
3579
-	0x18, 0xc7, 0x77, 0xd7, 0x5b, 0x27, 0x79, 0xdc, 0xbc, 0x68, 0x42, 0xc2, 0x76, 0x29, 0x8e, 0xbb,
3580
-	0x45, 0xc2, 0x2d, 0x64, 0x2d, 0x0c, 0x12, 0xa8, 0xd0, 0x43, 0xec, 0x58, 0xb2, 0x69, 0xeb, 0x54,
3581
-	0x9b, 0x04, 0x7a, 0x0b, 0xeb, 0xdd, 0x89, 0xbb, 0xd8, 0xde, 0x31, 0x33, 0x63, 0x07, 0x2e, 0xa8,
3582
-	0x47, 0x94, 0x2b, 0x07, 0x10, 0x52, 0x4f, 0x70, 0xee, 0x07, 0xe0, 0x03, 0xa0, 0x88, 0x13, 0x37,
3583
-	0x38, 0x45, 0xd4, 0x1f, 0x00, 0xbe, 0x02, 0x9a, 0xd9, 0x5d, 0x3b, 0x38, 0x6b, 0x37, 0x17, 0x7b,
3584
-	0x3c, 0xf3, 0xfb, 0x3f, 0xff, 0x79, 0xe6, 0xe5, 0x19, 0x03, 0x50, 0xf7, 0x98, 0xdb, 0x7d, 0x4a,
3585
-	0x38, 0x41, 0xc8, 0x27, 0x5e, 0x07, 0x53, 0x9b, 0x9d, 0xb8, 0xb4, 0xd7, 0x09, 0xb8, 0x3d, 0x7c,
3586
-	0xcf, 0x5c, 0x26, 0xad, 0x2f, 0xb1, 0xc7, 0x59, 0x84, 0x98, 0x39, 0xfe, 0x4d, 0x1f, 0x27, 0x3f,
3587
-	0xb6, 0xdb, 0x01, 0x7f, 0x3a, 0x68, 0xd9, 0x1e, 0xe9, 0x95, 0x3c, 0x42, 0x31, 0x61, 0x25, 0xcc,
3588
-	0x3d, 0xbf, 0x24, 0x42, 0xca, 0x8f, 0x7e, 0xab, 0x34, 0x09, 0x6f, 0xbe, 0xd6, 0x26, 0x6d, 0x22,
3589
-	0x9b, 0x25, 0xd1, 0x8a, 0x7b, 0xd7, 0xfb, 0xdd, 0x41, 0x3b, 0x08, 0x4b, 0xd1, 0x57, 0xd4, 0x69,
3590
-	0xbd, 0x50, 0x01, 0x1c, 0xf7, 0x98, 0x3f, 0xc2, 0xbd, 0x16, 0xa6, 0xe8, 0x36, 0x2c, 0x88, 0x38,
3591
-	0x47, 0x81, 0x6f, 0xa8, 0x05, 0xb5, 0xa8, 0x57, 0x60, 0x74, 0xbe, 0x95, 0x15, 0x40, 0x63, 0xd7,
3592
-	0xc9, 0x8a, 0xa1, 0x86, 0x2f, 0xa0, 0x90, 0xf8, 0x58, 0x40, 0x5a, 0x41, 0x2d, 0x2e, 0x45, 0x50,
3593
-	0x93, 0xf8, 0x58, 0x40, 0x62, 0xa8, 0xe1, 0x23, 0x04, 0xba, 0xeb, 0xfb, 0xd4, 0xc8, 0x08, 0xc2,
3594
-	0x91, 0x6d, 0x54, 0x81, 0x2c, 0xe3, 0x2e, 0x1f, 0x30, 0x43, 0x2f, 0xa8, 0xc5, 0x5c, 0xf9, 0x2d,
3595
-	0xfb, 0xf2, 0x3a, 0xd8, 0x93, 0xd9, 0xec, 0x4b, 0xb6, 0xa2, 0x9f, 0x9d, 0x6f, 0x29, 0x4e, 0xac,
3596
-	0xb4, 0x6e, 0x41, 0xee, 0x53, 0x12, 0x84, 0x0e, 0xfe, 0x6a, 0x80, 0x19, 0x1f, 0xdb, 0xa8, 0x13,
3597
-	0x1b, 0xeb, 0x27, 0x15, 0xae, 0x47, 0x0c, 0xeb, 0x93, 0x90, 0xe1, 0xab, 0x65, 0xf5, 0x11, 0x2c,
3598
-	0xf4, 0xa4, 0x2d, 0x33, 0xb4, 0x42, 0xa6, 0x98, 0x2b, 0xe7, 0xe7, 0xcf, 0xce, 0x49, 0x70, 0xf4,
3599
-	0x0e, 0xac, 0x52, 0xdc, 0x23, 0x43, 0xec, 0x1f, 0x25, 0x11, 0x32, 0x85, 0x4c, 0x51, 0xaf, 0x68,
3600
-	0x6b, 0x8a, 0xb3, 0x12, 0x0f, 0x45, 0x22, 0x66, 0x55, 0xe0, 0xfa, 0x43, 0xec, 0x0e, 0x71, 0x92,
3601
-	0x40, 0x19, 0x74, 0xb1, 0x62, 0x72, 0x62, 0xaf, 0xf6, 0x94, 0xac, 0xb5, 0x0a, 0xcb, 0x71, 0x8c,
3602
-	0x28, 0x41, 0xeb, 0x21, 0xdc, 0x78, 0x4c, 0x89, 0x87, 0x19, 0x8b, 0x58, 0xc6, 0xdc, 0xf6, 0xd8,
3603
-	0xe1, 0x8e, 0x48, 0x4c, 0xf6, 0xc4, 0x26, 0xab, 0x76, 0x74, 0x64, 0xec, 0x04, 0x4c, 0xc6, 0xef,
3604
-	0xe9, 0xcf, 0x7e, 0xb0, 0x14, 0xeb, 0x26, 0x98, 0x69, 0xd1, 0x62, 0xaf, 0x4f, 0x60, 0xc3, 0xc1,
3605
-	0x8c, 0x74, 0x87, 0x78, 0xc7, 0xf7, 0xa9, 0x80, 0x62, 0x9f, 0xab, 0xac, 0xb2, 0xf5, 0x2e, 0x6c,
3606
-	0x4e, 0xab, 0xe3, 0x4d, 0x4a, 0xdb, 0xc9, 0x2e, 0xac, 0x37, 0x42, 0x8e, 0x69, 0xe8, 0x76, 0x45,
3607
-	0x9c, 0xc4, 0x69, 0x13, 0xb4, 0xb1, 0x49, 0x76, 0x74, 0xbe, 0xa5, 0x35, 0x76, 0x1d, 0x2d, 0xf0,
3608
-	0xd1, 0x7d, 0xc8, 0xba, 0x1e, 0x0f, 0x48, 0x18, 0xef, 0xe0, 0x56, 0xda, 0x6a, 0xee, 0x73, 0x42,
3609
-	0xf1, 0x8e, 0xc4, 0x92, 0xa3, 0x15, 0x89, 0xac, 0xdf, 0x74, 0xc8, 0x5d, 0x18, 0x45, 0x1f, 0x8f,
3610
-	0xc3, 0x09, 0xab, 0x95, 0xf2, 0xed, 0x57, 0x84, 0x7b, 0x10, 0x84, 0x7e, 0x12, 0x0c, 0xd9, 0xf1,
3611
-	0xbe, 0x6a, 0x72, 0xc9, 0x8d, 0x34, 0xa9, 0xb8, 0x31, 0x75, 0x25, 0xda, 0x53, 0xf4, 0x21, 0x2c,
3612
-	0x30, 0x4c, 0x87, 0x81, 0x87, 0xe5, 0x95, 0xc9, 0x95, 0xdf, 0x48, 0x75, 0x8b, 0x90, 0xba, 0xe2,
3613
-	0x24, 0xb4, 0x30, 0xe2, 0x2e, 0xeb, 0xc4, 0x57, 0x2a, 0xd5, 0xe8, 0xc0, 0x65, 0x1d, 0x61, 0x24,
3614
-	0x38, 0x61, 0x14, 0x62, 0x7e, 0x42, 0x68, 0xc7, 0xb8, 0x36, 0xdb, 0xa8, 0x19, 0x21, 0xc2, 0x28,
3615
-	0xa6, 0x85, 0xd0, 0xeb, 0x0e, 0x18, 0xc7, 0xd4, 0xc8, 0xce, 0x16, 0x56, 0x23, 0x44, 0x08, 0x63,
3616
-	0x1a, 0x7d, 0x00, 0x59, 0x86, 0x3d, 0x8a, 0xb9, 0xb1, 0x20, 0x75, 0x66, 0x7a, 0x66, 0x82, 0xa8,
3617
-	0x8b, 0x8b, 0x2e, 0x5b, 0xe8, 0x1e, 0x2c, 0x52, 0xcc, 0xc8, 0x80, 0x7a, 0xd8, 0x58, 0x94, 0xba,
3618
-	0x9b, 0xa9, 0x97, 0x23, 0x66, 0xea, 0x8a, 0x33, 0xe6, 0xd1, 0x7d, 0x58, 0xc2, 0x5f, 0x73, 0x1c,
3619
-	0x32, 0xb1, 0x79, 0x4b, 0x52, 0xfc, 0x66, 0x9a, 0xb8, 0x96, 0x40, 0x75, 0xc5, 0x99, 0x28, 0xc4,
3620
-	0x84, 0x3d, 0x12, 0x1e, 0x07, 0x6d, 0x03, 0x66, 0x4f, 0xb8, 0x2a, 0x09, 0x31, 0xe1, 0x88, 0xad,
3621
-	0x2c, 0x42, 0x96, 0xbb, 0xb4, 0x8d, 0xf9, 0xdd, 0x7f, 0x55, 0x58, 0x9d, 0x3a, 0x17, 0xe8, 0x6d,
3622
-	0x58, 0x38, 0x6c, 0x3e, 0x68, 0xee, 0x7d, 0xde, 0x5c, 0x53, 0x4c, 0xf3, 0xf4, 0x79, 0x61, 0x73,
3623
-	0x8a, 0x38, 0x0c, 0x3b, 0x21, 0x39, 0x09, 0x51, 0x19, 0xd6, 0xf7, 0x0f, 0xf6, 0x9c, 0xda, 0xd1,
3624
-	0x4e, 0xf5, 0xa0, 0xb1, 0xd7, 0x3c, 0xaa, 0x3a, 0xb5, 0x9d, 0x83, 0xda, 0x9a, 0x6a, 0xde, 0x38,
3625
-	0x7d, 0x5e, 0xd8, 0x98, 0x12, 0x55, 0x29, 0x76, 0x39, 0xbe, 0xa4, 0x39, 0x7c, 0xbc, 0x2b, 0x34,
3626
-	0x5a, 0xaa, 0xe6, 0xb0, 0xef, 0xa7, 0x69, 0x9c, 0xda, 0xa3, 0xbd, 0xcf, 0x6a, 0x6b, 0x99, 0x54,
3627
-	0x8d, 0x23, 0x8b, 0x98, 0xf9, 0xfa, 0x77, 0x3f, 0xe7, 0x95, 0x5f, 0x7f, 0xc9, 0x4f, 0x67, 0x57,
3628
-	0xfe, 0x5e, 0x03, 0x5d, 0xdc, 0x50, 0x74, 0xaa, 0x02, 0xba, 0x5c, 0x3c, 0xd0, 0x76, 0xda, 0x0a,
3629
-	0xce, 0x2c, 0x59, 0xa6, 0x7d, 0x55, 0x3c, 0xae, 0x49, 0x1b, 0xbf, 0xbf, 0xf8, 0xe7, 0x47, 0x6d,
3630
-	0x15, 0x96, 0x25, 0xbf, 0xdd, 0x73, 0x43, 0xb7, 0x8d, 0x29, 0xfa, 0x16, 0x56, 0xfe, 0x5f, 0x6c,
3631
-	0xd0, 0x9d, 0x59, 0x47, 0xe8, 0x52, 0x39, 0x33, 0xef, 0x5e, 0x05, 0x9d, 0xeb, 0x5f, 0xfe, 0x53,
3632
-	0x85, 0x95, 0x49, 0xf1, 0x66, 0x4f, 0x83, 0x3e, 0xfa, 0x02, 0x74, 0xf1, 0x34, 0xa1, 0xd4, 0xd2,
3633
-	0x74, 0xe1, 0x61, 0x33, 0x0b, 0xb3, 0x81, 0xf9, 0x49, 0x7b, 0x70, 0x4d, 0x3e, 0x0e, 0x28, 0x35,
3634
-	0xc2, 0xc5, 0xb7, 0xc7, 0xbc, 0x35, 0x87, 0x98, 0x6b, 0x52, 0x31, 0xce, 0x5e, 0xe6, 0x95, 0xbf,
3635
-	0x5e, 0xe6, 0x95, 0x67, 0xa3, 0xbc, 0x7a, 0x36, 0xca, 0xab, 0x7f, 0x8c, 0xf2, 0xea, 0xdf, 0xa3,
3636
-	0xbc, 0xfa, 0x24, 0xf3, 0x44, 0x6f, 0x65, 0xe5, 0x7f, 0x8b, 0xf7, 0xff, 0x0b, 0x00, 0x00, 0xff,
3637
-	0xff, 0x9a, 0xef, 0x6e, 0xdb, 0xf3, 0x08, 0x00, 0x00,
3577
+	// 974 bytes of a gzipped FileDescriptorProto
3578
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x96, 0x4f, 0x6f, 0x1b, 0x45,
3579
+	0x18, 0xc6, 0x77, 0xd7, 0x5b, 0x27, 0x79, 0xd3, 0x26, 0xd1, 0x94, 0x84, 0xed, 0x52, 0x1c, 0x77,
3580
+	0x8b, 0x84, 0x13, 0x9a, 0xb5, 0x30, 0x48, 0x45, 0x85, 0x1e, 0x62, 0xc7, 0x92, 0x4d, 0x5b, 0xa7,
3581
+	0xda, 0x24, 0xd0, 0x5b, 0x58, 0xef, 0x4e, 0xdc, 0xc5, 0xf6, 0x8e, 0x99, 0x19, 0x3b, 0x70, 0x41,
3582
+	0x3d, 0xa2, 0x5c, 0x39, 0x80, 0x90, 0x7a, 0x82, 0x73, 0x3f, 0x00, 0x1f, 0x00, 0x45, 0x9c, 0xb8,
3583
+	0xc1, 0x29, 0xa2, 0xfe, 0x00, 0xf0, 0x15, 0xd0, 0xcc, 0xee, 0x3a, 0xc6, 0x59, 0x3b, 0xb9, 0x24,
3584
+	0xa3, 0x9d, 0xdf, 0xf3, 0x3e, 0xef, 0x3b, 0x7f, 0xde, 0x31, 0x6c, 0xb4, 0x02, 0xfe, 0xbc, 0xdf,
3585
+	0xb4, 0x3d, 0xd2, 0x2d, 0xfa, 0xc4, 0x6b, 0x63, 0x5a, 0x64, 0xc7, 0x2e, 0xed, 0xb6, 0x03, 0x5e,
3586
+	0x74, 0x7b, 0x41, 0x91, 0xba, 0x47, 0xdc, 0xee, 0x51, 0xc2, 0x09, 0x42, 0xd1, 0xbc, 0x9d, 0xcc,
3587
+	0xdb, 0x83, 0xf7, 0xcd, 0x7b, 0x97, 0xc8, 0x49, 0xf3, 0x4b, 0xec, 0x71, 0x16, 0x45, 0x30, 0x37,
3588
+	0x2f, 0xa1, 0xf9, 0x37, 0x3d, 0x9c, 0xb0, 0x5b, 0x63, 0xac, 0x47, 0x28, 0x26, 0xac, 0x88, 0xb9,
3589
+	0xe7, 0xcb, 0x84, 0xe4, 0x9f, 0x5e, 0x73, 0x2c, 0x39, 0xf3, 0x8d, 0x16, 0x69, 0x11, 0x39, 0x2c,
3590
+	0x8a, 0x51, 0xfc, 0xf5, 0xfe, 0x0c, 0x43, 0x49, 0x34, 0xfb, 0x47, 0xc5, 0x5e, 0xa7, 0xdf, 0x0a,
3591
+	0xc2, 0xf8, 0x5f, 0x24, 0xb4, 0x5e, 0xa9, 0x00, 0x8e, 0x7b, 0xc4, 0x9f, 0xe0, 0x6e, 0x13, 0x53,
3592
+	0x74, 0x17, 0xe6, 0x84, 0xd7, 0x61, 0xe0, 0x1b, 0x6a, 0x5e, 0x2d, 0xe8, 0x65, 0x18, 0x9e, 0xad,
3593
+	0x67, 0x05, 0x50, 0xdf, 0x71, 0xb2, 0x62, 0xaa, 0xee, 0x0b, 0x28, 0x24, 0x3e, 0x16, 0x90, 0x96,
3594
+	0x57, 0x0b, 0x0b, 0x11, 0xd4, 0x20, 0x3e, 0x16, 0x90, 0x98, 0xaa, 0xfb, 0x08, 0x81, 0xee, 0xfa,
3595
+	0x3e, 0x35, 0x32, 0x82, 0x70, 0xe4, 0x18, 0x95, 0x21, 0xcb, 0xb8, 0xcb, 0xfb, 0xcc, 0xd0, 0xf3,
3596
+	0x6a, 0x61, 0xb1, 0xf4, 0x8e, 0x7d, 0x71, 0xa5, 0xed, 0xf3, 0x6c, 0xf6, 0x24, 0x5b, 0xd6, 0x4f,
3597
+	0xcf, 0xd6, 0x15, 0x27, 0x56, 0x5a, 0x77, 0x60, 0xf1, 0x53, 0x12, 0x84, 0x0e, 0xfe, 0xaa, 0x8f,
3598
+	0x19, 0x1f, 0xd9, 0xa8, 0xe7, 0x36, 0xd6, 0x4f, 0x2a, 0x5c, 0x8f, 0x18, 0xd6, 0x23, 0x21, 0xc3,
3599
+	0x57, 0xab, 0xea, 0x23, 0x98, 0xeb, 0x4a, 0x5b, 0x66, 0x68, 0xf9, 0x4c, 0x61, 0xb1, 0x94, 0x9b,
3600
+	0x9d, 0x9d, 0x93, 0xe0, 0xe8, 0x3d, 0x58, 0xa6, 0xb8, 0x4b, 0x06, 0xd8, 0x3f, 0x4c, 0x22, 0x64,
3601
+	0xf2, 0x99, 0x82, 0x5e, 0xd6, 0x56, 0x14, 0x67, 0x29, 0x9e, 0x8a, 0x44, 0xcc, 0x2a, 0xc3, 0xf5,
3602
+	0xc7, 0xd8, 0x1d, 0xe0, 0xa4, 0x80, 0x12, 0xe8, 0x62, 0xc5, 0x64, 0x62, 0x97, 0x7b, 0x4a, 0xd6,
3603
+	0x5a, 0x86, 0x1b, 0x71, 0x8c, 0xa8, 0x40, 0xeb, 0x31, 0xdc, 0x7a, 0x4a, 0x89, 0x87, 0x19, 0x8b,
3604
+	0x58, 0xc6, 0xdc, 0xd6, 0xc8, 0x61, 0x43, 0x14, 0x26, 0xbf, 0xc4, 0x26, 0xcb, 0x76, 0x74, 0xac,
3605
+	0xec, 0x04, 0x4c, 0xe6, 0x1f, 0xe8, 0x2f, 0x7e, 0xb0, 0x14, 0xeb, 0x36, 0x98, 0x69, 0xd1, 0x62,
3606
+	0xaf, 0x4f, 0x60, 0xd5, 0xc1, 0x8c, 0x74, 0x06, 0x78, 0xdb, 0xf7, 0xa9, 0x80, 0x62, 0x9f, 0xab,
3607
+	0xac, 0xb2, 0x75, 0x0f, 0xd6, 0x26, 0xd5, 0xf1, 0x26, 0xa5, 0xed, 0x64, 0x07, 0x6e, 0xd6, 0x43,
3608
+	0x8e, 0x69, 0xe8, 0x76, 0x44, 0x9c, 0xc4, 0x69, 0x0d, 0xb4, 0x91, 0x49, 0x76, 0x78, 0xb6, 0xae,
3609
+	0xd5, 0x77, 0x1c, 0x2d, 0xf0, 0xd1, 0x43, 0xc8, 0xba, 0x1e, 0x0f, 0x48, 0x18, 0xef, 0xe0, 0x7a,
3610
+	0xda, 0x6a, 0xee, 0x71, 0x42, 0xf1, 0xb6, 0xc4, 0x92, 0xa3, 0x15, 0x89, 0xac, 0xdf, 0x74, 0x58,
3611
+	0x1c, 0x9b, 0x45, 0x1f, 0x8f, 0xc2, 0x09, 0xab, 0xa5, 0xd2, 0xdd, 0x4b, 0xc2, 0x3d, 0x0a, 0x42,
3612
+	0x3f, 0x09, 0x86, 0xec, 0x78, 0x5f, 0x35, 0xb9, 0xe4, 0x46, 0x9a, 0x54, 0xdc, 0x98, 0x9a, 0x12,
3613
+	0xed, 0x29, 0xba, 0x0f, 0x73, 0x0c, 0xd3, 0x41, 0xe0, 0x61, 0x79, 0x65, 0x16, 0x4b, 0x6f, 0xa5,
3614
+	0xba, 0x45, 0x48, 0x4d, 0x71, 0x12, 0x5a, 0x18, 0x71, 0x97, 0xb5, 0xe3, 0x2b, 0x95, 0x6a, 0xb4,
3615
+	0xef, 0xb2, 0xb6, 0x30, 0x12, 0x9c, 0x30, 0x0a, 0x31, 0x3f, 0x26, 0xb4, 0x6d, 0x5c, 0x9b, 0x6e,
3616
+	0xd4, 0x88, 0x10, 0x61, 0x14, 0xd3, 0x42, 0xe8, 0x75, 0xfa, 0x8c, 0x63, 0x6a, 0x64, 0xa7, 0x0b,
3617
+	0x2b, 0x11, 0x22, 0x84, 0x31, 0x8d, 0x3e, 0x84, 0x2c, 0xc3, 0x1e, 0xc5, 0xdc, 0x98, 0x93, 0x3a,
3618
+	0x33, 0xbd, 0x32, 0x41, 0xd4, 0xc4, 0x45, 0x97, 0x23, 0xf4, 0x00, 0xe6, 0x29, 0x66, 0xa4, 0x4f,
3619
+	0x3d, 0x6c, 0xcc, 0x4b, 0xdd, 0xed, 0xd4, 0xcb, 0x11, 0x33, 0x35, 0xc5, 0x19, 0xf1, 0xe8, 0x21,
3620
+	0x2c, 0xe0, 0xaf, 0x39, 0x0e, 0x99, 0xd8, 0xbc, 0x05, 0x29, 0x7e, 0x3b, 0x4d, 0x5c, 0x4d, 0xa0,
3621
+	0x9a, 0xe2, 0x9c, 0x2b, 0x44, 0xc2, 0x1e, 0x09, 0x8f, 0x82, 0x96, 0x01, 0xd3, 0x13, 0xae, 0x48,
3622
+	0x42, 0x24, 0x1c, 0xb1, 0xe5, 0x79, 0xc8, 0x72, 0x97, 0xb6, 0x30, 0xdf, 0xfc, 0x57, 0x85, 0xe5,
3623
+	0x89, 0x73, 0x81, 0xde, 0x85, 0xb9, 0x83, 0xc6, 0xa3, 0xc6, 0xee, 0xe7, 0x8d, 0x15, 0xc5, 0x34,
3624
+	0x4f, 0x5e, 0xe6, 0xd7, 0x26, 0x88, 0x83, 0xb0, 0x1d, 0x92, 0xe3, 0x10, 0x95, 0xe0, 0xe6, 0xde,
3625
+	0xfe, 0xae, 0x53, 0x3d, 0xdc, 0xae, 0xec, 0xd7, 0x77, 0x1b, 0x87, 0x15, 0xa7, 0xba, 0xbd, 0x5f,
3626
+	0x5d, 0x51, 0xcd, 0x5b, 0x27, 0x2f, 0xf3, 0xab, 0x13, 0xa2, 0x0a, 0xc5, 0x2e, 0xc7, 0x17, 0x34,
3627
+	0x07, 0x4f, 0x77, 0x84, 0x46, 0x4b, 0xd5, 0x1c, 0xf4, 0xfc, 0x34, 0x8d, 0x53, 0x7d, 0xb2, 0xfb,
3628
+	0x59, 0x75, 0x25, 0x93, 0xaa, 0x71, 0x64, 0x13, 0x33, 0xdf, 0xfc, 0xee, 0xe7, 0x9c, 0xf2, 0xeb,
3629
+	0x2f, 0xb9, 0xc9, 0xea, 0x4a, 0xdf, 0x6b, 0xa0, 0x8b, 0x1b, 0x8a, 0x4e, 0x54, 0x40, 0x17, 0x9b,
3630
+	0x07, 0xda, 0x4a, 0x5b, 0xc1, 0xa9, 0x2d, 0xcb, 0xb4, 0xaf, 0x8a, 0xc7, 0x3d, 0x69, 0xf5, 0xf7,
3631
+	0x57, 0xff, 0xfc, 0xa8, 0x2d, 0xc3, 0x0d, 0xc9, 0x6f, 0x75, 0xdd, 0xd0, 0x6d, 0x61, 0x8a, 0xbe,
3632
+	0x85, 0xa5, 0xff, 0x37, 0x1b, 0xb4, 0x31, 0xed, 0x08, 0x5d, 0x68, 0x67, 0xe6, 0xe6, 0x55, 0xd0,
3633
+	0x99, 0xfe, 0xa5, 0x3f, 0x55, 0x58, 0x3a, 0x6f, 0xde, 0xec, 0x79, 0xd0, 0x43, 0x5f, 0x80, 0x2e,
3634
+	0x9e, 0x26, 0x94, 0xda, 0x9a, 0xc6, 0x1e, 0x36, 0x33, 0x3f, 0x1d, 0x98, 0x5d, 0xb4, 0x07, 0xd7,
3635
+	0xe4, 0xe3, 0x80, 0x52, 0x23, 0x8c, 0xbf, 0x3d, 0xe6, 0x9d, 0x19, 0xc4, 0x4c, 0x93, 0xb2, 0x71,
3636
+	0xfa, 0x3a, 0xa7, 0xfc, 0xf5, 0x3a, 0xa7, 0xbc, 0x18, 0xe6, 0xd4, 0xd3, 0x61, 0x4e, 0xfd, 0x63,
3637
+	0x98, 0x53, 0xff, 0x1e, 0xe6, 0xd4, 0x67, 0x99, 0x67, 0x7a, 0x33, 0x2b, 0x7f, 0x5b, 0x7c, 0xf0,
3638
+	0x5f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x64, 0x01, 0xa3, 0x4f, 0x74, 0x09, 0x00, 0x00,
3638 3639
 }
... ...
@@ -2,11 +2,11 @@ syntax = "proto3";
2 2
 
3 3
 package docker.swarmkit.v1;
4 4
 
5
-import "objects.proto";
6
-import "types.proto";
5
+import "github.com/docker/swarmkit/api/objects.proto";
6
+import "github.com/docker/swarmkit/api/types.proto";
7 7
 import "github.com/coreos/etcd/raft/raftpb/raft.proto";
8 8
 import weak "gogoproto/gogo.proto";
9
-import weak "plugin/plugin.proto";
9
+import weak "github.com/docker/swarmkit/protobuf/plugin/plugin.proto";
10 10
 
11 11
 // Raft defines the RPC communication between raft nodes.
12 12
 service Raft {
... ...
@@ -1,5 +1,5 @@
1 1
 // Code generated by protoc-gen-gogo.
2
-// source: resource.proto
2
+// source: github.com/docker/swarmkit/api/resource.proto
3 3
 // DO NOT EDIT!
4 4
 
5 5
 package api
... ...
@@ -262,7 +262,7 @@ var _ResourceAllocator_serviceDesc = grpc.ServiceDesc{
262 262
 		},
263 263
 	},
264 264
 	Streams:  []grpc.StreamDesc{},
265
-	Metadata: "resource.proto",
265
+	Metadata: "github.com/docker/swarmkit/api/resource.proto",
266 266
 }
267 267
 
268 268
 func (m *AttachNetworkRequest) Marshal() (dAtA []byte, err error) {
... ...
@@ -1061,31 +1061,35 @@ var (
1061 1061
 	ErrIntOverflowResource   = fmt.Errorf("proto: integer overflow")
1062 1062
 )
1063 1063
 
1064
-func init() { proto.RegisterFile("resource.proto", fileDescriptorResource) }
1064
+func init() {
1065
+	proto.RegisterFile("github.com/docker/swarmkit/api/resource.proto", fileDescriptorResource)
1066
+}
1065 1067
 
1066 1068
 var fileDescriptorResource = []byte{
1067
-	// 368 bytes of a gzipped FileDescriptorProto
1068
-	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0xe2, 0x2b, 0x4a, 0x2d, 0xce,
1069
-	0x2f, 0x2d, 0x4a, 0x4e, 0xd5, 0x2b, 0x28, 0xca, 0x2f, 0xc9, 0x17, 0x12, 0x4a, 0xc9, 0x4f, 0xce,
1070
-	0x4e, 0x2d, 0xd2, 0x2b, 0x2e, 0x4f, 0x2c, 0xca, 0xcd, 0xce, 0x2c, 0xd1, 0x2b, 0x33, 0x94, 0xe2,
1071
-	0x2e, 0xa9, 0x2c, 0x48, 0x2d, 0x86, 0x28, 0x90, 0x12, 0x49, 0xcf, 0x4f, 0xcf, 0x07, 0x33, 0xf5,
1072
-	0x41, 0x2c, 0xa8, 0xa8, 0x70, 0x41, 0x4e, 0x69, 0x7a, 0x66, 0x9e, 0x3e, 0x84, 0x82, 0x08, 0x2a,
1073
-	0xf5, 0x33, 0x72, 0x89, 0x38, 0x96, 0x94, 0x24, 0x26, 0x67, 0xf8, 0xa5, 0x96, 0x94, 0xe7, 0x17,
1074
-	0x65, 0x07, 0xa5, 0x16, 0x96, 0xa6, 0x16, 0x97, 0x08, 0x39, 0x73, 0xb1, 0x25, 0xe7, 0xe7, 0xa5,
1075
-	0x65, 0xa6, 0x4b, 0x30, 0x2a, 0x30, 0x6a, 0x70, 0x1b, 0x69, 0xeb, 0x61, 0xda, 0xaa, 0x07, 0xd5,
1076
-	0x03, 0x31, 0x20, 0x37, 0x35, 0xaf, 0xc4, 0x19, 0xac, 0x25, 0x08, 0xaa, 0x55, 0xc8, 0x88, 0x8b,
1077
-	0x27, 0x39, 0x3f, 0xaf, 0x24, 0x31, 0x33, 0x2f, 0xb5, 0x28, 0x3e, 0x33, 0x45, 0x82, 0x49, 0x81,
1078
-	0x51, 0x83, 0xd3, 0x89, 0xff, 0xd1, 0x3d, 0x79, 0x6e, 0x67, 0x98, 0xb8, 0xa7, 0x4b, 0x10, 0x37,
1079
-	0x5c, 0x91, 0x67, 0x8a, 0x92, 0x1f, 0x97, 0x28, 0x9a, 0x83, 0x8a, 0x0b, 0xf2, 0xf3, 0x8a, 0x53,
1080
-	0x85, 0x4c, 0xb9, 0x78, 0x13, 0xe1, 0x16, 0x81, 0x4c, 0x63, 0x04, 0x9b, 0x26, 0xf0, 0xe8, 0x9e,
1081
-	0x3c, 0x0f, 0xc2, 0x05, 0x9e, 0x2e, 0x41, 0x3c, 0x08, 0x65, 0x9e, 0x29, 0x4a, 0xbe, 0x5c, 0x22,
1082
-	0x2e, 0xa9, 0x58, 0x3c, 0x48, 0xa6, 0x71, 0xe2, 0x5c, 0xa2, 0x68, 0xc6, 0x41, 0x9c, 0x67, 0xb4,
1083
-	0x9a, 0x89, 0x4b, 0x30, 0x08, 0x1a, 0x51, 0x8e, 0x39, 0x39, 0xf9, 0xc9, 0x89, 0x25, 0xf9, 0x45,
1084
-	0x42, 0x9d, 0x8c, 0x5c, 0xbc, 0x28, 0xde, 0x11, 0xd2, 0xc0, 0x16, 0x90, 0xd8, 0xa2, 0x40, 0x4a,
1085
-	0x93, 0x08, 0x95, 0x10, 0xcb, 0x95, 0x94, 0x4f, 0xad, 0x7b, 0x37, 0x83, 0x49, 0x96, 0x8b, 0x07,
1086
-	0xac, 0x54, 0x17, 0x24, 0x97, 0x5a, 0xc4, 0xc5, 0x0b, 0xe1, 0xe5, 0x26, 0xe6, 0x25, 0xa6, 0xa7,
1087
-	0x42, 0xdc, 0x82, 0xe2, 0x76, 0xec, 0x6e, 0xc1, 0x16, 0x5a, 0xd8, 0xdd, 0x82, 0x35, 0x20, 0x88,
1088
-	0x72, 0x8b, 0x93, 0xc4, 0x89, 0x87, 0x72, 0x0c, 0x37, 0x1e, 0xca, 0x31, 0x34, 0x3c, 0x92, 0x63,
1089
-	0x3c, 0xf1, 0x48, 0x8e, 0xf1, 0xc2, 0x23, 0x39, 0xc6, 0x07, 0x8f, 0xe4, 0x18, 0x93, 0xd8, 0xc0,
1090
-	0x09, 0xd3, 0x18, 0x10, 0x00, 0x00, 0xff, 0xff, 0x1c, 0x48, 0x12, 0x41, 0xf6, 0x02, 0x00, 0x00,
1069
+	// 397 bytes of a gzipped FileDescriptorProto
1070
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x92, 0xcf, 0x4e, 0xf2, 0x40,
1071
+	0x14, 0xc5, 0x19, 0x16, 0x24, 0xdf, 0x50, 0xf2, 0x69, 0x03, 0x91, 0x90, 0x58, 0x48, 0xdd, 0xa0,
1072
+	0x86, 0x36, 0x62, 0x8c, 0x6b, 0xfe, 0x6c, 0xba, 0x90, 0x45, 0x5f, 0xc0, 0x0c, 0xed, 0x50, 0x1a,
1073
+	0x68, 0xa7, 0x4e, 0xa7, 0x12, 0x77, 0x6e, 0x5d, 0xb9, 0xf5, 0x1d, 0x4c, 0x7c, 0x0e, 0xe2, 0xca,
1074
+	0xa5, 0x2b, 0x22, 0x7d, 0x00, 0x9f, 0xc1, 0xd0, 0x29, 0x10, 0x70, 0xa2, 0xc4, 0x55, 0xa7, 0xd3,
1075
+	0x73, 0xce, 0xfd, 0xdd, 0x7b, 0x0b, 0x1b, 0x8e, 0xcb, 0x86, 0x51, 0x5f, 0xb3, 0x88, 0xa7, 0xdb,
1076
+	0xc4, 0x1a, 0x61, 0xaa, 0x87, 0x13, 0x44, 0xbd, 0x91, 0xcb, 0x74, 0x14, 0xb8, 0x3a, 0xc5, 0x21,
1077
+	0x89, 0xa8, 0x85, 0xb5, 0x80, 0x12, 0x46, 0x64, 0x99, 0x6b, 0xb4, 0xa5, 0x46, 0xbb, 0x3d, 0xab,
1078
+	0x9c, 0xfc, 0x12, 0xc1, 0xee, 0x02, 0x1c, 0x72, 0x7f, 0xa5, 0xe8, 0x10, 0x87, 0x24, 0x47, 0x7d,
1079
+	0x71, 0x4a, 0x6f, 0x2f, 0x7f, 0x48, 0x48, 0x14, 0xfd, 0x68, 0xa0, 0x07, 0xe3, 0xc8, 0x71, 0xfd,
1080
+	0xf4, 0xc1, 0x8d, 0xea, 0x23, 0x80, 0xc5, 0x16, 0x63, 0xc8, 0x1a, 0xf6, 0x30, 0x9b, 0x10, 0x3a,
1081
+	0x32, 0xf1, 0x4d, 0x84, 0x43, 0x26, 0x77, 0x60, 0xce, 0x22, 0xfe, 0xc0, 0x75, 0xca, 0xa0, 0x06,
1082
+	0xea, 0xf9, 0xe6, 0xa9, 0xf6, 0x1d, 0x5c, 0x4b, 0x3d, 0x3c, 0xc0, 0xc3, 0x3e, 0xeb, 0x24, 0x16,
1083
+	0x33, 0xb5, 0xca, 0x4d, 0x28, 0x59, 0xc4, 0x67, 0xc8, 0xf5, 0x31, 0xbd, 0x76, 0xed, 0x72, 0xb6,
1084
+	0x06, 0xea, 0xff, 0xda, 0xff, 0xe3, 0x59, 0x35, 0xdf, 0x59, 0xde, 0x1b, 0x5d, 0x33, 0xbf, 0x12,
1085
+	0x19, 0xb6, 0xda, 0x83, 0xa5, 0x2d, 0xa0, 0x30, 0x20, 0x7e, 0x88, 0xe5, 0x0b, 0x58, 0x40, 0xab,
1086
+	0x42, 0x8b, 0x34, 0x90, 0xa4, 0xed, 0xc5, 0xb3, 0xaa, 0xb4, 0x26, 0x30, 0xba, 0xa6, 0xb4, 0x96,
1087
+	0x19, 0xb6, 0x7a, 0x05, 0x8b, 0x5d, 0x2c, 0x68, 0xf0, 0x8f, 0x71, 0x07, 0xb0, 0xb4, 0x15, 0xc7,
1088
+	0xf1, 0x9a, 0xcf, 0x59, 0xb8, 0x6f, 0xa6, 0xbb, 0x6e, 0x8d, 0xc7, 0xc4, 0x42, 0x8c, 0x50, 0xf9,
1089
+	0x01, 0xc0, 0xc2, 0x46, 0x3b, 0x72, 0x5d, 0x34, 0x48, 0xd1, 0x0a, 0x2a, 0xc7, 0x3b, 0x28, 0x79,
1090
+	0x71, 0xf5, 0xe8, 0xf5, 0xe5, 0xf3, 0x29, 0x7b, 0x08, 0xa5, 0x44, 0xda, 0x58, 0x7c, 0xc3, 0x14,
1091
+	0x16, 0xf8, 0x9b, 0x87, 0x7c, 0xe4, 0x60, 0xce, 0xb2, 0xc1, 0x2e, 0x66, 0x11, 0x4d, 0x4b, 0xcc,
1092
+	0x22, 0x1c, 0xc4, 0x4e, 0x2c, 0xed, 0xf2, 0x74, 0xae, 0x64, 0xde, 0xe7, 0x4a, 0xe6, 0x3e, 0x56,
1093
+	0xc0, 0x34, 0x56, 0xc0, 0x5b, 0xac, 0x80, 0x8f, 0x58, 0x01, 0xfd, 0x5c, 0xf2, 0x63, 0x9e, 0x7f,
1094
+	0x05, 0x00, 0x00, 0xff, 0xff, 0xc1, 0x7a, 0x29, 0xfc, 0x58, 0x03, 0x00, 0x00,
1091 1095
 }
... ...
@@ -2,9 +2,9 @@ syntax = "proto3";
2 2
 
3 3
 package docker.swarmkit.v1;
4 4
 
5
-import "types.proto";
5
+import "github.com/docker/swarmkit/api/types.proto";
6 6
 import "gogoproto/gogo.proto";
7
-import "plugin/plugin.proto";
7
+import "github.com/docker/swarmkit/protobuf/plugin/plugin.proto";
8 8
 
9 9
 // Allocator is the API provided by a manager group for agents to control the allocation of certain entities.
10 10
 //
... ...
@@ -1,5 +1,5 @@
1 1
 // Code generated by protoc-gen-gogo.
2
-// source: snapshot.proto
2
+// source: github.com/docker/swarmkit/api/snapshot.proto
3 3
 // DO NOT EDIT!
4 4
 
5 5
 package api
... ...
@@ -1305,38 +1305,41 @@ var (
1305 1305
 	ErrIntOverflowSnapshot   = fmt.Errorf("proto: integer overflow")
1306 1306
 )
1307 1307
 
1308
-func init() { proto.RegisterFile("snapshot.proto", fileDescriptorSnapshot) }
1308
+func init() {
1309
+	proto.RegisterFile("github.com/docker/swarmkit/api/snapshot.proto", fileDescriptorSnapshot)
1310
+}
1309 1311
 
1310 1312
 var fileDescriptorSnapshot = []byte{
1311
-	// 469 bytes of a gzipped FileDescriptorProto
1312
-	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x93, 0xbf, 0x6f, 0xd3, 0x40,
1313
-	0x14, 0xc7, 0x7d, 0xce, 0x0f, 0xa7, 0xaf, 0x6a, 0x29, 0x27, 0x86, 0x53, 0x28, 0x26, 0x04, 0x86,
1314
-	0x4c, 0x06, 0x02, 0x12, 0x08, 0xa9, 0x0c, 0xa9, 0x18, 0x18, 0xe8, 0x70, 0x41, 0x15, 0xab, 0xe3,
1315
-	0x5c, 0x52, 0x63, 0xe2, 0x8b, 0xee, 0x5d, 0x53, 0x46, 0xf8, 0xef, 0x32, 0x32, 0x32, 0x21, 0x92,
1316
-	0x85, 0x7f, 0x03, 0xdd, 0x9d, 0x6d, 0x22, 0xe1, 0x74, 0xb3, 0x4e, 0x9f, 0xcf, 0x7b, 0xdf, 0x3b,
1317
-	0xbf, 0x07, 0xc7, 0x98, 0xc7, 0x4b, 0xbc, 0x92, 0x3a, 0x5a, 0x2a, 0xa9, 0x25, 0xa5, 0x53, 0x99,
1318
-	0x64, 0x42, 0x45, 0x78, 0x13, 0xab, 0x45, 0x96, 0xea, 0x68, 0xf5, 0xbc, 0x7b, 0x24, 0x27, 0x9f,
1319
-	0x45, 0xa2, 0xd1, 0x21, 0x5d, 0x50, 0xf1, 0xac, 0xc0, 0xbb, 0xf7, 0xe6, 0x72, 0x2e, 0xed, 0xe7,
1320
-	0x53, 0xf3, 0xe5, 0x4e, 0xfb, 0xdf, 0x9b, 0x70, 0x34, 0xd6, 0x52, 0x89, 0x71, 0x51, 0x9c, 0x46,
1321
-	0xd0, 0xca, 0xe5, 0x54, 0x20, 0x23, 0xbd, 0xc6, 0xe0, 0x70, 0xc8, 0xa2, 0xff, 0xdb, 0x44, 0x17,
1322
-	0x72, 0x2a, 0xb8, 0xc3, 0xe8, 0x2b, 0xe8, 0xa0, 0x50, 0xab, 0x34, 0x11, 0xc8, 0x7c, 0xab, 0xdc,
1323
-	0xaf, 0x53, 0xc6, 0x8e, 0xe1, 0x15, 0x6c, 0xc4, 0x5c, 0xe8, 0x1b, 0xa9, 0x32, 0x64, 0x8d, 0xfd,
1324
-	0xe2, 0x85, 0x63, 0x78, 0x05, 0x9b, 0x84, 0x3a, 0xc6, 0x0c, 0x59, 0x73, 0x7f, 0xc2, 0x8f, 0x31,
1325
-	0x66, 0xdc, 0x61, 0xa6, 0x51, 0xf2, 0xe5, 0x1a, 0xb5, 0x50, 0xc8, 0x5a, 0xfb, 0x1b, 0x9d, 0x3b,
1326
-	0x86, 0x57, 0x30, 0x7d, 0x09, 0x01, 0x8a, 0x44, 0x09, 0x8d, 0xac, 0x6d, 0xbd, 0x6e, 0xfd, 0xcd,
1327
-	0x0c, 0xc2, 0x4b, 0x94, 0xbe, 0x81, 0x03, 0x25, 0x50, 0x5e, 0x2b, 0xf3, 0x22, 0x81, 0xf5, 0x4e,
1328
-	0xeb, 0x3c, 0x5e, 0x40, 0xfc, 0x1f, 0x4e, 0xcf, 0x00, 0xc4, 0x57, 0x2d, 0x72, 0x4c, 0x65, 0x8e,
1329
-	0xac, 0x63, 0xe5, 0x07, 0x75, 0xf2, 0xbb, 0x92, 0xe2, 0x3b, 0x82, 0x09, 0x9c, 0xc8, 0x7c, 0x96,
1330
-	0xce, 0x91, 0x1d, 0xec, 0x0f, 0x7c, 0x6e, 0x11, 0x5e, 0xa2, 0xfd, 0x14, 0xee, 0x14, 0x77, 0xaf,
1331
-	0x86, 0xe0, 0x35, 0x04, 0x0b, 0xb1, 0x98, 0x98, 0x17, 0x73, 0x63, 0x10, 0xd6, 0xde, 0x20, 0x9e,
1332
-	0xe9, 0x0f, 0x16, 0xe3, 0x25, 0x4e, 0x4f, 0x21, 0x50, 0x62, 0x21, 0x57, 0x62, 0x6a, 0xa7, 0xa1,
1333
-	0x39, 0xf2, 0x4f, 0x3c, 0x5e, 0x1e, 0xf5, 0xff, 0x10, 0xe8, 0x54, 0x4d, 0xde, 0x42, 0xb0, 0x12,
1334
-	0xca, 0x24, 0x67, 0xa4, 0x47, 0x06, 0xc7, 0xc3, 0x27, 0xb5, 0xcf, 0x5b, 0x4e, 0xfd, 0xa5, 0x63,
1335
-	0x79, 0x29, 0xd1, 0xf7, 0x00, 0x45, 0xd7, 0xab, 0x74, 0xc9, 0xfc, 0x1e, 0x19, 0x1c, 0x0e, 0x1f,
1336
-	0xdf, 0xf2, 0x67, 0xcb, 0x4a, 0xa3, 0xe6, 0xfa, 0xd7, 0x43, 0x8f, 0xef, 0xc8, 0xf4, 0x0c, 0x5a,
1337
-	0x68, 0xb6, 0x80, 0x35, 0x6c, 0x95, 0x47, 0xb5, 0x41, 0x76, 0xd7, 0xa4, 0xa8, 0xe1, 0xac, 0xfe,
1338
-	0x5d, 0x08, 0x8a, 0x74, 0xb4, 0x0d, 0xfe, 0xe5, 0xb3, 0x13, 0x6f, 0xc4, 0xd6, 0x9b, 0xd0, 0xfb,
1339
-	0xb9, 0x09, 0xbd, 0x6f, 0xdb, 0x90, 0xac, 0xb7, 0x21, 0xf9, 0xb1, 0x0d, 0xc9, 0xef, 0x6d, 0x48,
1340
-	0x3e, 0xf9, 0x93, 0xb6, 0xdd, 0xbd, 0x17, 0x7f, 0x03, 0x00, 0x00, 0xff, 0xff, 0x8d, 0x0f, 0xc4,
1341
-	0x6e, 0xd2, 0x03, 0x00, 0x00,
1313
+	// 493 bytes of a gzipped FileDescriptorProto
1314
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x84, 0x93, 0xbf, 0x8f, 0xd3, 0x30,
1315
+	0x14, 0xc7, 0x93, 0xf4, 0x47, 0x7a, 0x3e, 0x01, 0x87, 0xc5, 0x60, 0x95, 0x23, 0x94, 0xc2, 0x50,
1316
+	0x24, 0x48, 0xa0, 0x20, 0x81, 0x90, 0x8e, 0xa1, 0x27, 0x06, 0x06, 0x6e, 0x70, 0xd1, 0x89, 0x35,
1317
+	0x4d, 0xdd, 0x36, 0x84, 0xc4, 0x95, 0x9f, 0xdb, 0x63, 0x84, 0xff, 0xae, 0x23, 0x23, 0x13, 0xe2,
1318
+	0xba, 0xf0, 0x6f, 0x20, 0xdb, 0x71, 0xa8, 0x44, 0x7a, 0xb7, 0x45, 0xd6, 0xe7, 0xf3, 0xde, 0xd7,
1319
+	0xce, 0x7b, 0xe8, 0xe9, 0x3c, 0x95, 0x8b, 0xd5, 0x24, 0x4c, 0x78, 0x1e, 0x4d, 0x79, 0x92, 0x31,
1320
+	0x11, 0xc1, 0x45, 0x2c, 0xf2, 0x2c, 0x95, 0x51, 0xbc, 0x4c, 0x23, 0x28, 0xe2, 0x25, 0x2c, 0xb8,
1321
+	0x0c, 0x97, 0x82, 0x4b, 0x8e, 0xb1, 0x61, 0x42, 0xcb, 0x84, 0xeb, 0xe7, 0xdd, 0x27, 0xd7, 0x94,
1322
+	0xe0, 0x93, 0xcf, 0x2c, 0x91, 0x60, 0x2a, 0x74, 0x1f, 0x5f, 0x43, 0x8b, 0x78, 0x56, 0x36, 0xeb,
1323
+	0xde, 0x99, 0xf3, 0x39, 0xd7, 0x9f, 0x91, 0xfa, 0x32, 0xa7, 0xfd, 0xef, 0x4d, 0x74, 0x63, 0x2c,
1324
+	0xb9, 0x60, 0xe3, 0x32, 0x1a, 0x0e, 0x51, 0xab, 0xe0, 0x53, 0x06, 0xc4, 0xed, 0x35, 0x06, 0x87,
1325
+	0x43, 0x12, 0xfe, 0x1f, 0x32, 0x3c, 0xe3, 0x53, 0x46, 0x0d, 0x86, 0x5f, 0xa1, 0x0e, 0x30, 0xb1,
1326
+	0x4e, 0x13, 0x06, 0xc4, 0xd3, 0xca, 0xdd, 0x3a, 0x65, 0x6c, 0x18, 0x5a, 0xc1, 0x4a, 0x2c, 0x98,
1327
+	0xbc, 0xe0, 0x22, 0x03, 0xd2, 0xd8, 0x2f, 0x9e, 0x19, 0x86, 0x56, 0xb0, 0x4a, 0x28, 0x63, 0xc8,
1328
+	0x80, 0x34, 0xf7, 0x27, 0xfc, 0x18, 0x43, 0x46, 0x0d, 0xa6, 0x1a, 0x25, 0x5f, 0x56, 0x20, 0x99,
1329
+	0x00, 0xd2, 0xda, 0xdf, 0xe8, 0xd4, 0x30, 0xb4, 0x82, 0xf1, 0x4b, 0xe4, 0x03, 0x4b, 0x04, 0x93,
1330
+	0x40, 0xda, 0xda, 0xeb, 0xd6, 0xdf, 0x4c, 0x21, 0xd4, 0xa2, 0xf8, 0x0d, 0x3a, 0x10, 0x0c, 0xf8,
1331
+	0x4a, 0xa8, 0x17, 0xf1, 0xb5, 0x77, 0x5c, 0xe7, 0xd1, 0x12, 0xa2, 0xff, 0x70, 0x7c, 0x82, 0x10,
1332
+	0xfb, 0x2a, 0x59, 0x01, 0x29, 0x2f, 0x80, 0x74, 0xb4, 0x7c, 0xaf, 0x4e, 0x7e, 0x67, 0x29, 0xba,
1333
+	0x23, 0xa8, 0xc0, 0x09, 0x2f, 0x66, 0xe9, 0x1c, 0xc8, 0xc1, 0xfe, 0xc0, 0xa7, 0x1a, 0xa1, 0x16,
1334
+	0xed, 0xa7, 0xe8, 0x56, 0x79, 0xf7, 0x6a, 0x08, 0x5e, 0x23, 0x3f, 0x67, 0xf9, 0x44, 0xbd, 0x98,
1335
+	0x19, 0x83, 0xa0, 0xf6, 0x06, 0xf1, 0x4c, 0x7e, 0xd0, 0x18, 0xb5, 0x38, 0x3e, 0x46, 0xbe, 0x60,
1336
+	0x39, 0x5f, 0xb3, 0xa9, 0x9e, 0x86, 0xe6, 0xc8, 0x3b, 0x72, 0xa8, 0x3d, 0xea, 0xff, 0x71, 0x51,
1337
+	0xa7, 0x6a, 0xf2, 0x16, 0xf9, 0x6b, 0x26, 0x54, 0x72, 0xe2, 0xf6, 0xdc, 0xc1, 0xcd, 0xe1, 0xa3,
1338
+	0xda, 0xe7, 0xb5, 0x3b, 0x73, 0x6e, 0x58, 0x6a, 0x25, 0xfc, 0x1e, 0xa1, 0xb2, 0xeb, 0x22, 0x5d,
1339
+	0x12, 0xaf, 0xe7, 0x0e, 0x0e, 0x87, 0x0f, 0xaf, 0xf8, 0xb3, 0xb6, 0xd2, 0xa8, 0xb9, 0xf9, 0x75,
1340
+	0xdf, 0xa1, 0x3b, 0x32, 0x3e, 0x41, 0x2d, 0x50, 0x5b, 0x40, 0x1a, 0xba, 0xca, 0x83, 0xda, 0x20,
1341
+	0xbb, 0x6b, 0x52, 0xd6, 0x30, 0x56, 0xff, 0x36, 0xf2, 0xcb, 0x74, 0xb8, 0x8d, 0xbc, 0xf3, 0x67,
1342
+	0x47, 0xce, 0x88, 0x6c, 0x2e, 0x03, 0xe7, 0xe7, 0x65, 0xe0, 0x7c, 0xdb, 0x06, 0xee, 0x66, 0x1b,
1343
+	0xb8, 0x3f, 0xb6, 0x81, 0xfb, 0x7b, 0x1b, 0xb8, 0x9f, 0xbc, 0x49, 0x5b, 0xef, 0xde, 0x8b, 0xbf,
1344
+	0x01, 0x00, 0x00, 0xff, 0xff, 0xfd, 0xbe, 0x47, 0xec, 0x2f, 0x04, 0x00, 0x00,
1342 1345
 }
... ...
@@ -2,8 +2,8 @@ syntax = "proto3";
2 2
 
3 3
 package docker.swarmkit.v1;
4 4
 
5
-import "objects.proto";
6
-import "raft.proto";
5
+import "github.com/docker/swarmkit/api/objects.proto";
6
+import "github.com/docker/swarmkit/api/raft.proto";
7 7
 import weak "gogoproto/gogo.proto";
8 8
 
9 9
 // StoreSnapshot is used to store snapshots of the store.
... ...
@@ -1,5 +1,5 @@
1 1
 // Code generated by protoc-gen-gogo.
2
-// source: specs.proto
2
+// source: github.com/docker/swarmkit/api/specs.proto
3 3
 // DO NOT EDIT!
4 4
 
5 5
 package api
... ...
@@ -107,7 +107,7 @@ func (x EndpointSpec_ResolutionMode) String() string {
107 107
 	return proto.EnumName(EndpointSpec_ResolutionMode_name, int32(x))
108 108
 }
109 109
 func (EndpointSpec_ResolutionMode) EnumDescriptor() ([]byte, []int) {
110
-	return fileDescriptorSpecs, []int{8, 0}
110
+	return fileDescriptorSpecs, []int{9, 0}
111 111
 }
112 112
 
113 113
 type NodeSpec struct {
... ...
@@ -310,6 +310,15 @@ type TaskSpec struct {
310 310
 	// using the same reconciliation-based mechanism that performs rolling
311 311
 	// updates.
312 312
 	ForceUpdate uint64 `protobuf:"varint,9,opt,name=force_update,json=forceUpdate,proto3" json:"force_update,omitempty"`
313
+	// ResourceReferences provides a generic way to specify resources that
314
+	// are used by this task, and should be sent down to agents along with
315
+	// the task. Inside the runtime field there may be more specific
316
+	// information about how to use the resource, but ResourceReferences
317
+	// establishes the relationship at the store level, and instructs the
318
+	// dispatcher to send the related objects.
319
+	//
320
+	// ResourceReferences is a list of ResourceReferences used by the task.
321
+	ResourceReferences []ResourceReference `protobuf:"bytes,11,rep,name=resource_references,json=resourceReferences" json:"resource_references"`
313 322
 }
314 323
 
315 324
 func (m *TaskSpec) Reset()                    { *m = TaskSpec{} }
... ...
@@ -457,6 +466,15 @@ func _TaskSpec_OneofSizer(msg proto.Message) (n int) {
457 457
 	return n
458 458
 }
459 459
 
460
+type ResourceReference struct {
461
+	ResourceID   string       `protobuf:"bytes,1,opt,name=resource_id,json=resourceId,proto3" json:"resource_id,omitempty"`
462
+	ResourceType ResourceType `protobuf:"varint,2,opt,name=resource_type,json=resourceType,proto3,enum=docker.swarmkit.v1.ResourceType" json:"resource_type,omitempty"`
463
+}
464
+
465
+func (m *ResourceReference) Reset()                    { *m = ResourceReference{} }
466
+func (*ResourceReference) ProtoMessage()               {}
467
+func (*ResourceReference) Descriptor() ([]byte, []int) { return fileDescriptorSpecs, []int{5} }
468
+
460 469
 type GenericRuntimeSpec struct {
461 470
 	Kind    string                `protobuf:"bytes,1,opt,name=kind,proto3" json:"kind,omitempty"`
462 471
 	Payload *google_protobuf3.Any `protobuf:"bytes,2,opt,name=payload" json:"payload,omitempty"`
... ...
@@ -464,7 +482,7 @@ type GenericRuntimeSpec struct {
464 464
 
465 465
 func (m *GenericRuntimeSpec) Reset()                    { *m = GenericRuntimeSpec{} }
466 466
 func (*GenericRuntimeSpec) ProtoMessage()               {}
467
-func (*GenericRuntimeSpec) Descriptor() ([]byte, []int) { return fileDescriptorSpecs, []int{5} }
467
+func (*GenericRuntimeSpec) Descriptor() ([]byte, []int) { return fileDescriptorSpecs, []int{6} }
468 468
 
469 469
 // NetworkAttachmentSpec specifies runtime parameters required to attach
470 470
 // a container to a network.
... ...
@@ -476,7 +494,7 @@ type NetworkAttachmentSpec struct {
476 476
 
477 477
 func (m *NetworkAttachmentSpec) Reset()                    { *m = NetworkAttachmentSpec{} }
478 478
 func (*NetworkAttachmentSpec) ProtoMessage()               {}
479
-func (*NetworkAttachmentSpec) Descriptor() ([]byte, []int) { return fileDescriptorSpecs, []int{6} }
479
+func (*NetworkAttachmentSpec) Descriptor() ([]byte, []int) { return fileDescriptorSpecs, []int{7} }
480 480
 
481 481
 // Container specifies runtime parameters for a container.
482 482
 type ContainerSpec struct {
... ...
@@ -567,11 +585,96 @@ type ContainerSpec struct {
567 567
 	// task will exit and a new task will be rescheduled elsewhere. A container
568 568
 	// is considered unhealthy after `Retries` number of consecutive failures.
569 569
 	Healthcheck *HealthConfig `protobuf:"bytes,16,opt,name=healthcheck" json:"healthcheck,omitempty"`
570
+	// Run a custom init inside the container, if null, use the daemon's configured settings
571
+	//
572
+	// Types that are valid to be assigned to Init:
573
+	//	*ContainerSpec_InitValue
574
+	Init isContainerSpec_Init `protobuf_oneof:"init"`
570 575
 }
571 576
 
572 577
 func (m *ContainerSpec) Reset()                    { *m = ContainerSpec{} }
573 578
 func (*ContainerSpec) ProtoMessage()               {}
574
-func (*ContainerSpec) Descriptor() ([]byte, []int) { return fileDescriptorSpecs, []int{7} }
579
+func (*ContainerSpec) Descriptor() ([]byte, []int) { return fileDescriptorSpecs, []int{8} }
580
+
581
+type isContainerSpec_Init interface {
582
+	isContainerSpec_Init()
583
+	MarshalTo([]byte) (int, error)
584
+	Size() int
585
+}
586
+
587
+type ContainerSpec_InitValue struct {
588
+	InitValue bool `protobuf:"varint,23,opt,name=init_value,json=initValue,proto3,oneof"`
589
+}
590
+
591
+func (*ContainerSpec_InitValue) isContainerSpec_Init() {}
592
+
593
+func (m *ContainerSpec) GetInit() isContainerSpec_Init {
594
+	if m != nil {
595
+		return m.Init
596
+	}
597
+	return nil
598
+}
599
+
600
+func (m *ContainerSpec) GetInitValue() bool {
601
+	if x, ok := m.GetInit().(*ContainerSpec_InitValue); ok {
602
+		return x.InitValue
603
+	}
604
+	return false
605
+}
606
+
607
+// XXX_OneofFuncs is for the internal use of the proto package.
608
+func (*ContainerSpec) XXX_OneofFuncs() (func(msg proto.Message, b *proto.Buffer) error, func(msg proto.Message, tag, wire int, b *proto.Buffer) (bool, error), func(msg proto.Message) (n int), []interface{}) {
609
+	return _ContainerSpec_OneofMarshaler, _ContainerSpec_OneofUnmarshaler, _ContainerSpec_OneofSizer, []interface{}{
610
+		(*ContainerSpec_InitValue)(nil),
611
+	}
612
+}
613
+
614
+func _ContainerSpec_OneofMarshaler(msg proto.Message, b *proto.Buffer) error {
615
+	m := msg.(*ContainerSpec)
616
+	// init
617
+	switch x := m.Init.(type) {
618
+	case *ContainerSpec_InitValue:
619
+		t := uint64(0)
620
+		if x.InitValue {
621
+			t = 1
622
+		}
623
+		_ = b.EncodeVarint(23<<3 | proto.WireVarint)
624
+		_ = b.EncodeVarint(t)
625
+	case nil:
626
+	default:
627
+		return fmt.Errorf("ContainerSpec.Init has unexpected type %T", x)
628
+	}
629
+	return nil
630
+}
631
+
632
+func _ContainerSpec_OneofUnmarshaler(msg proto.Message, tag, wire int, b *proto.Buffer) (bool, error) {
633
+	m := msg.(*ContainerSpec)
634
+	switch tag {
635
+	case 23: // init.init_value
636
+		if wire != proto.WireVarint {
637
+			return true, proto.ErrInternalBadWireType
638
+		}
639
+		x, err := b.DecodeVarint()
640
+		m.Init = &ContainerSpec_InitValue{x != 0}
641
+		return true, err
642
+	default:
643
+		return false, nil
644
+	}
645
+}
646
+
647
+func _ContainerSpec_OneofSizer(msg proto.Message) (n int) {
648
+	m := msg.(*ContainerSpec)
649
+	// init
650
+	switch x := m.Init.(type) {
651
+	case *ContainerSpec_InitValue:
652
+		n += proto.SizeVarint(23<<3 | proto.WireVarint)
653
+		n += 1
654
+	case nil:
655
+	default:
656
+		panic(fmt.Sprintf("proto: unexpected type %T in oneof", x))
657
+	}
658
+	return n
659
+}
575 660
 
576 661
 // PullOptions allows one to parameterize an image pull.
577 662
 type ContainerSpec_PullOptions struct {
... ...
@@ -585,7 +688,7 @@ type ContainerSpec_PullOptions struct {
585 585
 func (m *ContainerSpec_PullOptions) Reset()      { *m = ContainerSpec_PullOptions{} }
586 586
 func (*ContainerSpec_PullOptions) ProtoMessage() {}
587 587
 func (*ContainerSpec_PullOptions) Descriptor() ([]byte, []int) {
588
-	return fileDescriptorSpecs, []int{7, 1}
588
+	return fileDescriptorSpecs, []int{8, 1}
589 589
 }
590 590
 
591 591
 // DNSConfig specifies DNS related configurations in resolver configuration file (resolv.conf)
... ...
@@ -603,7 +706,7 @@ type ContainerSpec_DNSConfig struct {
603 603
 
604 604
 func (m *ContainerSpec_DNSConfig) Reset()                    { *m = ContainerSpec_DNSConfig{} }
605 605
 func (*ContainerSpec_DNSConfig) ProtoMessage()               {}
606
-func (*ContainerSpec_DNSConfig) Descriptor() ([]byte, []int) { return fileDescriptorSpecs, []int{7, 2} }
606
+func (*ContainerSpec_DNSConfig) Descriptor() ([]byte, []int) { return fileDescriptorSpecs, []int{8, 2} }
607 607
 
608 608
 // EndpointSpec defines the properties that can be configured to
609 609
 // access and loadbalance the service.
... ...
@@ -616,7 +719,7 @@ type EndpointSpec struct {
616 616
 
617 617
 func (m *EndpointSpec) Reset()                    { *m = EndpointSpec{} }
618 618
 func (*EndpointSpec) ProtoMessage()               {}
619
-func (*EndpointSpec) Descriptor() ([]byte, []int) { return fileDescriptorSpecs, []int{8} }
619
+func (*EndpointSpec) Descriptor() ([]byte, []int) { return fileDescriptorSpecs, []int{9} }
620 620
 
621 621
 // NetworkSpec specifies user defined network parameters.
622 622
 type NetworkSpec struct {
... ...
@@ -651,7 +754,7 @@ type NetworkSpec struct {
651 651
 
652 652
 func (m *NetworkSpec) Reset()                    { *m = NetworkSpec{} }
653 653
 func (*NetworkSpec) ProtoMessage()               {}
654
-func (*NetworkSpec) Descriptor() ([]byte, []int) { return fileDescriptorSpecs, []int{9} }
654
+func (*NetworkSpec) Descriptor() ([]byte, []int) { return fileDescriptorSpecs, []int{10} }
655 655
 
656 656
 type isNetworkSpec_ConfigFrom interface {
657 657
 	isNetworkSpec_ConfigFrom()
... ...
@@ -753,7 +856,7 @@ type ClusterSpec struct {
753 753
 
754 754
 func (m *ClusterSpec) Reset()                    { *m = ClusterSpec{} }
755 755
 func (*ClusterSpec) ProtoMessage()               {}
756
-func (*ClusterSpec) Descriptor() ([]byte, []int) { return fileDescriptorSpecs, []int{10} }
756
+func (*ClusterSpec) Descriptor() ([]byte, []int) { return fileDescriptorSpecs, []int{11} }
757 757
 
758 758
 // SecretSpec specifies a user-provided secret.
759 759
 type SecretSpec struct {
... ...
@@ -772,7 +875,7 @@ type SecretSpec struct {
772 772
 
773 773
 func (m *SecretSpec) Reset()                    { *m = SecretSpec{} }
774 774
 func (*SecretSpec) ProtoMessage()               {}
775
-func (*SecretSpec) Descriptor() ([]byte, []int) { return fileDescriptorSpecs, []int{11} }
775
+func (*SecretSpec) Descriptor() ([]byte, []int) { return fileDescriptorSpecs, []int{12} }
776 776
 
777 777
 // ConfigSpec specifies user-provided configuration files.
778 778
 type ConfigSpec struct {
... ...
@@ -791,7 +894,7 @@ type ConfigSpec struct {
791 791
 
792 792
 func (m *ConfigSpec) Reset()                    { *m = ConfigSpec{} }
793 793
 func (*ConfigSpec) ProtoMessage()               {}
794
-func (*ConfigSpec) Descriptor() ([]byte, []int) { return fileDescriptorSpecs, []int{12} }
794
+func (*ConfigSpec) Descriptor() ([]byte, []int) { return fileDescriptorSpecs, []int{13} }
795 795
 
796 796
 func init() {
797 797
 	proto.RegisterType((*NodeSpec)(nil), "docker.swarmkit.v1.NodeSpec")
... ...
@@ -799,6 +902,7 @@ func init() {
799 799
 	proto.RegisterType((*ReplicatedService)(nil), "docker.swarmkit.v1.ReplicatedService")
800 800
 	proto.RegisterType((*GlobalService)(nil), "docker.swarmkit.v1.GlobalService")
801 801
 	proto.RegisterType((*TaskSpec)(nil), "docker.swarmkit.v1.TaskSpec")
802
+	proto.RegisterType((*ResourceReference)(nil), "docker.swarmkit.v1.ResourceReference")
802 803
 	proto.RegisterType((*GenericRuntimeSpec)(nil), "docker.swarmkit.v1.GenericRuntimeSpec")
803 804
 	proto.RegisterType((*NetworkAttachmentSpec)(nil), "docker.swarmkit.v1.NetworkAttachmentSpec")
804 805
 	proto.RegisterType((*ContainerSpec)(nil), "docker.swarmkit.v1.ContainerSpec")
... ...
@@ -946,6 +1050,13 @@ func (m *TaskSpec) CopyFrom(src interface{}) {
946 946
 		}
947 947
 	}
948 948
 
949
+	if o.ResourceReferences != nil {
950
+		m.ResourceReferences = make([]ResourceReference, len(o.ResourceReferences))
951
+		for i := range m.ResourceReferences {
952
+			github_com_docker_swarmkit_api_deepcopy.Copy(&m.ResourceReferences[i], &o.ResourceReferences[i])
953
+		}
954
+	}
955
+
949 956
 	if o.Runtime != nil {
950 957
 		switch o.Runtime.(type) {
951 958
 		case *TaskSpec_Attachment:
... ...
@@ -971,6 +1082,21 @@ func (m *TaskSpec) CopyFrom(src interface{}) {
971 971
 
972 972
 }
973 973
 
974
+func (m *ResourceReference) Copy() *ResourceReference {
975
+	if m == nil {
976
+		return nil
977
+	}
978
+	o := &ResourceReference{}
979
+	o.CopyFrom(m)
980
+	return o
981
+}
982
+
983
+func (m *ResourceReference) CopyFrom(src interface{}) {
984
+
985
+	o := src.(*ResourceReference)
986
+	*m = *o
987
+}
988
+
974 989
 func (m *GenericRuntimeSpec) Copy() *GenericRuntimeSpec {
975 990
 	if m == nil {
976 991
 		return nil
... ...
@@ -1093,6 +1219,16 @@ func (m *ContainerSpec) CopyFrom(src interface{}) {
1093 1093
 		m.Healthcheck = &HealthConfig{}
1094 1094
 		github_com_docker_swarmkit_api_deepcopy.Copy(m.Healthcheck, o.Healthcheck)
1095 1095
 	}
1096
+	if o.Init != nil {
1097
+		switch o.Init.(type) {
1098
+		case *ContainerSpec_InitValue:
1099
+			v := ContainerSpec_InitValue{
1100
+				InitValue: o.GetInitValue(),
1101
+			}
1102
+			m.Init = &v
1103
+		}
1104
+	}
1105
+
1096 1106
 }
1097 1107
 
1098 1108
 func (m *ContainerSpec_PullOptions) Copy() *ContainerSpec_PullOptions {
... ...
@@ -1544,6 +1680,18 @@ func (m *TaskSpec) MarshalTo(dAtA []byte) (int, error) {
1544 1544
 		i++
1545 1545
 		i = encodeVarintSpecs(dAtA, i, uint64(m.ForceUpdate))
1546 1546
 	}
1547
+	if len(m.ResourceReferences) > 0 {
1548
+		for _, msg := range m.ResourceReferences {
1549
+			dAtA[i] = 0x5a
1550
+			i++
1551
+			i = encodeVarintSpecs(dAtA, i, uint64(msg.Size()))
1552
+			n, err := msg.MarshalTo(dAtA[i:])
1553
+			if err != nil {
1554
+				return 0, err
1555
+			}
1556
+			i += n
1557
+		}
1558
+	}
1547 1559
 	return i, nil
1548 1560
 }
1549 1561
 
... ...
@@ -1589,6 +1737,35 @@ func (m *TaskSpec_Generic) MarshalTo(dAtA []byte) (int, error) {
1589 1589
 	}
1590 1590
 	return i, nil
1591 1591
 }
1592
+func (m *ResourceReference) Marshal() (dAtA []byte, err error) {
1593
+	size := m.Size()
1594
+	dAtA = make([]byte, size)
1595
+	n, err := m.MarshalTo(dAtA)
1596
+	if err != nil {
1597
+		return nil, err
1598
+	}
1599
+	return dAtA[:n], nil
1600
+}
1601
+
1602
+func (m *ResourceReference) MarshalTo(dAtA []byte) (int, error) {
1603
+	var i int
1604
+	_ = i
1605
+	var l int
1606
+	_ = l
1607
+	if len(m.ResourceID) > 0 {
1608
+		dAtA[i] = 0xa
1609
+		i++
1610
+		i = encodeVarintSpecs(dAtA, i, uint64(len(m.ResourceID)))
1611
+		i += copy(dAtA[i:], m.ResourceID)
1612
+	}
1613
+	if m.ResourceType != 0 {
1614
+		dAtA[i] = 0x10
1615
+		i++
1616
+		i = encodeVarintSpecs(dAtA, i, uint64(m.ResourceType))
1617
+	}
1618
+	return i, nil
1619
+}
1620
+
1592 1621
 func (m *GenericRuntimeSpec) Marshal() (dAtA []byte, err error) {
1593 1622
 	size := m.Size()
1594 1623
 	dAtA = make([]byte, size)
... ...
@@ -1914,9 +2091,30 @@ func (m *ContainerSpec) MarshalTo(dAtA []byte) (int, error) {
1914 1914
 		}
1915 1915
 		i += n23
1916 1916
 	}
1917
+	if m.Init != nil {
1918
+		nn24, err := m.Init.MarshalTo(dAtA[i:])
1919
+		if err != nil {
1920
+			return 0, err
1921
+		}
1922
+		i += nn24
1923
+	}
1917 1924
 	return i, nil
1918 1925
 }
1919 1926
 
1927
+func (m *ContainerSpec_InitValue) MarshalTo(dAtA []byte) (int, error) {
1928
+	i := 0
1929
+	dAtA[i] = 0xb8
1930
+	i++
1931
+	dAtA[i] = 0x1
1932
+	i++
1933
+	if m.InitValue {
1934
+		dAtA[i] = 1
1935
+	} else {
1936
+		dAtA[i] = 0
1937
+	}
1938
+	i++
1939
+	return i, nil
1940
+}
1920 1941
 func (m *ContainerSpec_PullOptions) Marshal() (dAtA []byte, err error) {
1921 1942
 	size := m.Size()
1922 1943
 	dAtA = make([]byte, size)
... ...
@@ -2059,20 +2257,20 @@ func (m *NetworkSpec) MarshalTo(dAtA []byte) (int, error) {
2059 2059
 	dAtA[i] = 0xa
2060 2060
 	i++
2061 2061
 	i = encodeVarintSpecs(dAtA, i, uint64(m.Annotations.Size()))
2062
-	n24, err := m.Annotations.MarshalTo(dAtA[i:])
2062
+	n25, err := m.Annotations.MarshalTo(dAtA[i:])
2063 2063
 	if err != nil {
2064 2064
 		return 0, err
2065 2065
 	}
2066
-	i += n24
2066
+	i += n25
2067 2067
 	if m.DriverConfig != nil {
2068 2068
 		dAtA[i] = 0x12
2069 2069
 		i++
2070 2070
 		i = encodeVarintSpecs(dAtA, i, uint64(m.DriverConfig.Size()))
2071
-		n25, err := m.DriverConfig.MarshalTo(dAtA[i:])
2071
+		n26, err := m.DriverConfig.MarshalTo(dAtA[i:])
2072 2072
 		if err != nil {
2073 2073
 			return 0, err
2074 2074
 		}
2075
-		i += n25
2075
+		i += n26
2076 2076
 	}
2077 2077
 	if m.Ipv6Enabled {
2078 2078
 		dAtA[i] = 0x18
... ...
@@ -2098,11 +2296,11 @@ func (m *NetworkSpec) MarshalTo(dAtA []byte) (int, error) {
2098 2098
 		dAtA[i] = 0x2a
2099 2099
 		i++
2100 2100
 		i = encodeVarintSpecs(dAtA, i, uint64(m.IPAM.Size()))
2101
-		n26, err := m.IPAM.MarshalTo(dAtA[i:])
2101
+		n27, err := m.IPAM.MarshalTo(dAtA[i:])
2102 2102
 		if err != nil {
2103 2103
 			return 0, err
2104 2104
 		}
2105
-		i += n26
2105
+		i += n27
2106 2106
 	}
2107 2107
 	if m.Attachable {
2108 2108
 		dAtA[i] = 0x30
... ...
@@ -2125,11 +2323,11 @@ func (m *NetworkSpec) MarshalTo(dAtA []byte) (int, error) {
2125 2125
 		i++
2126 2126
 	}
2127 2127
 	if m.ConfigFrom != nil {
2128
-		nn27, err := m.ConfigFrom.MarshalTo(dAtA[i:])
2128
+		nn28, err := m.ConfigFrom.MarshalTo(dAtA[i:])
2129 2129
 		if err != nil {
2130 2130
 			return 0, err
2131 2131
 		}
2132
-		i += nn27
2132
+		i += nn28
2133 2133
 	}
2134 2134
 	return i, nil
2135 2135
 }
... ...
@@ -2160,67 +2358,67 @@ func (m *ClusterSpec) MarshalTo(dAtA []byte) (int, error) {
2160 2160
 	dAtA[i] = 0xa
2161 2161
 	i++
2162 2162
 	i = encodeVarintSpecs(dAtA, i, uint64(m.Annotations.Size()))
2163
-	n28, err := m.Annotations.MarshalTo(dAtA[i:])
2163
+	n29, err := m.Annotations.MarshalTo(dAtA[i:])
2164 2164
 	if err != nil {
2165 2165
 		return 0, err
2166 2166
 	}
2167
-	i += n28
2167
+	i += n29
2168 2168
 	dAtA[i] = 0x12
2169 2169
 	i++
2170 2170
 	i = encodeVarintSpecs(dAtA, i, uint64(m.AcceptancePolicy.Size()))
2171
-	n29, err := m.AcceptancePolicy.MarshalTo(dAtA[i:])
2171
+	n30, err := m.AcceptancePolicy.MarshalTo(dAtA[i:])
2172 2172
 	if err != nil {
2173 2173
 		return 0, err
2174 2174
 	}
2175
-	i += n29
2175
+	i += n30
2176 2176
 	dAtA[i] = 0x1a
2177 2177
 	i++
2178 2178
 	i = encodeVarintSpecs(dAtA, i, uint64(m.Orchestration.Size()))
2179
-	n30, err := m.Orchestration.MarshalTo(dAtA[i:])
2179
+	n31, err := m.Orchestration.MarshalTo(dAtA[i:])
2180 2180
 	if err != nil {
2181 2181
 		return 0, err
2182 2182
 	}
2183
-	i += n30
2183
+	i += n31
2184 2184
 	dAtA[i] = 0x22
2185 2185
 	i++
2186 2186
 	i = encodeVarintSpecs(dAtA, i, uint64(m.Raft.Size()))
2187
-	n31, err := m.Raft.MarshalTo(dAtA[i:])
2187
+	n32, err := m.Raft.MarshalTo(dAtA[i:])
2188 2188
 	if err != nil {
2189 2189
 		return 0, err
2190 2190
 	}
2191
-	i += n31
2191
+	i += n32
2192 2192
 	dAtA[i] = 0x2a
2193 2193
 	i++
2194 2194
 	i = encodeVarintSpecs(dAtA, i, uint64(m.Dispatcher.Size()))
2195
-	n32, err := m.Dispatcher.MarshalTo(dAtA[i:])
2195
+	n33, err := m.Dispatcher.MarshalTo(dAtA[i:])
2196 2196
 	if err != nil {
2197 2197
 		return 0, err
2198 2198
 	}
2199
-	i += n32
2199
+	i += n33
2200 2200
 	dAtA[i] = 0x32
2201 2201
 	i++
2202 2202
 	i = encodeVarintSpecs(dAtA, i, uint64(m.CAConfig.Size()))
2203
-	n33, err := m.CAConfig.MarshalTo(dAtA[i:])
2203
+	n34, err := m.CAConfig.MarshalTo(dAtA[i:])
2204 2204
 	if err != nil {
2205 2205
 		return 0, err
2206 2206
 	}
2207
-	i += n33
2207
+	i += n34
2208 2208
 	dAtA[i] = 0x3a
2209 2209
 	i++
2210 2210
 	i = encodeVarintSpecs(dAtA, i, uint64(m.TaskDefaults.Size()))
2211
-	n34, err := m.TaskDefaults.MarshalTo(dAtA[i:])
2211
+	n35, err := m.TaskDefaults.MarshalTo(dAtA[i:])
2212 2212
 	if err != nil {
2213 2213
 		return 0, err
2214 2214
 	}
2215
-	i += n34
2215
+	i += n35
2216 2216
 	dAtA[i] = 0x42
2217 2217
 	i++
2218 2218
 	i = encodeVarintSpecs(dAtA, i, uint64(m.EncryptionConfig.Size()))
2219
-	n35, err := m.EncryptionConfig.MarshalTo(dAtA[i:])
2219
+	n36, err := m.EncryptionConfig.MarshalTo(dAtA[i:])
2220 2220
 	if err != nil {
2221 2221
 		return 0, err
2222 2222
 	}
2223
-	i += n35
2223
+	i += n36
2224 2224
 	return i, nil
2225 2225
 }
2226 2226
 
... ...
@@ -2242,11 +2440,11 @@ func (m *SecretSpec) MarshalTo(dAtA []byte) (int, error) {
2242 2242
 	dAtA[i] = 0xa
2243 2243
 	i++
2244 2244
 	i = encodeVarintSpecs(dAtA, i, uint64(m.Annotations.Size()))
2245
-	n36, err := m.Annotations.MarshalTo(dAtA[i:])
2245
+	n37, err := m.Annotations.MarshalTo(dAtA[i:])
2246 2246
 	if err != nil {
2247 2247
 		return 0, err
2248 2248
 	}
2249
-	i += n36
2249
+	i += n37
2250 2250
 	if len(m.Data) > 0 {
2251 2251
 		dAtA[i] = 0x12
2252 2252
 		i++
... ...
@@ -2257,21 +2455,21 @@ func (m *SecretSpec) MarshalTo(dAtA []byte) (int, error) {
2257 2257
 		dAtA[i] = 0x1a
2258 2258
 		i++
2259 2259
 		i = encodeVarintSpecs(dAtA, i, uint64(m.Templating.Size()))
2260
-		n37, err := m.Templating.MarshalTo(dAtA[i:])
2260
+		n38, err := m.Templating.MarshalTo(dAtA[i:])
2261 2261
 		if err != nil {
2262 2262
 			return 0, err
2263 2263
 		}
2264
-		i += n37
2264
+		i += n38
2265 2265
 	}
2266 2266
 	if m.Driver != nil {
2267 2267
 		dAtA[i] = 0x22
2268 2268
 		i++
2269 2269
 		i = encodeVarintSpecs(dAtA, i, uint64(m.Driver.Size()))
2270
-		n38, err := m.Driver.MarshalTo(dAtA[i:])
2270
+		n39, err := m.Driver.MarshalTo(dAtA[i:])
2271 2271
 		if err != nil {
2272 2272
 			return 0, err
2273 2273
 		}
2274
-		i += n38
2274
+		i += n39
2275 2275
 	}
2276 2276
 	return i, nil
2277 2277
 }
... ...
@@ -2294,11 +2492,11 @@ func (m *ConfigSpec) MarshalTo(dAtA []byte) (int, error) {
2294 2294
 	dAtA[i] = 0xa
2295 2295
 	i++
2296 2296
 	i = encodeVarintSpecs(dAtA, i, uint64(m.Annotations.Size()))
2297
-	n39, err := m.Annotations.MarshalTo(dAtA[i:])
2297
+	n40, err := m.Annotations.MarshalTo(dAtA[i:])
2298 2298
 	if err != nil {
2299 2299
 		return 0, err
2300 2300
 	}
2301
-	i += n39
2301
+	i += n40
2302 2302
 	if len(m.Data) > 0 {
2303 2303
 		dAtA[i] = 0x12
2304 2304
 		i++
... ...
@@ -2309,11 +2507,11 @@ func (m *ConfigSpec) MarshalTo(dAtA []byte) (int, error) {
2309 2309
 		dAtA[i] = 0x1a
2310 2310
 		i++
2311 2311
 		i = encodeVarintSpecs(dAtA, i, uint64(m.Templating.Size()))
2312
-		n40, err := m.Templating.MarshalTo(dAtA[i:])
2312
+		n41, err := m.Templating.MarshalTo(dAtA[i:])
2313 2313
 		if err != nil {
2314 2314
 			return 0, err
2315 2315
 		}
2316
-		i += n40
2316
+		i += n41
2317 2317
 	}
2318 2318
 	return i, nil
2319 2319
 }
... ...
@@ -2458,6 +2656,12 @@ func (m *TaskSpec) Size() (n int) {
2458 2458
 	if m.ForceUpdate != 0 {
2459 2459
 		n += 1 + sovSpecs(uint64(m.ForceUpdate))
2460 2460
 	}
2461
+	if len(m.ResourceReferences) > 0 {
2462
+		for _, e := range m.ResourceReferences {
2463
+			l = e.Size()
2464
+			n += 1 + l + sovSpecs(uint64(l))
2465
+		}
2466
+	}
2461 2467
 	return n
2462 2468
 }
2463 2469
 
... ...
@@ -2488,6 +2692,19 @@ func (m *TaskSpec_Generic) Size() (n int) {
2488 2488
 	}
2489 2489
 	return n
2490 2490
 }
2491
+func (m *ResourceReference) Size() (n int) {
2492
+	var l int
2493
+	_ = l
2494
+	l = len(m.ResourceID)
2495
+	if l > 0 {
2496
+		n += 1 + l + sovSpecs(uint64(l))
2497
+	}
2498
+	if m.ResourceType != 0 {
2499
+		n += 1 + sovSpecs(uint64(m.ResourceType))
2500
+	}
2501
+	return n
2502
+}
2503
+
2491 2504
 func (m *GenericRuntimeSpec) Size() (n int) {
2492 2505
 	var l int
2493 2506
 	_ = l
... ...
@@ -2620,9 +2837,18 @@ func (m *ContainerSpec) Size() (n int) {
2620 2620
 		l = m.Privileges.Size()
2621 2621
 		n += 2 + l + sovSpecs(uint64(l))
2622 2622
 	}
2623
+	if m.Init != nil {
2624
+		n += m.Init.Size()
2625
+	}
2623 2626
 	return n
2624 2627
 }
2625 2628
 
2629
+func (m *ContainerSpec_InitValue) Size() (n int) {
2630
+	var l int
2631
+	_ = l
2632
+	n += 3
2633
+	return n
2634
+}
2626 2635
 func (m *ContainerSpec_PullOptions) Size() (n int) {
2627 2636
 	var l int
2628 2637
 	_ = l
... ...
@@ -2861,6 +3087,7 @@ func (this *TaskSpec) String() string {
2861 2861
 		`LogDriver:` + strings.Replace(fmt.Sprintf("%v", this.LogDriver), "Driver", "Driver", 1) + `,`,
2862 2862
 		`Networks:` + strings.Replace(fmt.Sprintf("%v", this.Networks), "NetworkAttachmentConfig", "NetworkAttachmentConfig", 1) + `,`,
2863 2863
 		`ForceUpdate:` + fmt.Sprintf("%v", this.ForceUpdate) + `,`,
2864
+		`ResourceReferences:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.ResourceReferences), "ResourceReference", "ResourceReference", 1), `&`, ``, 1) + `,`,
2864 2865
 		`}`,
2865 2866
 	}, "")
2866 2867
 	return s
... ...
@@ -2895,6 +3122,17 @@ func (this *TaskSpec_Generic) String() string {
2895 2895
 	}, "")
2896 2896
 	return s
2897 2897
 }
2898
+func (this *ResourceReference) String() string {
2899
+	if this == nil {
2900
+		return "nil"
2901
+	}
2902
+	s := strings.Join([]string{`&ResourceReference{`,
2903
+		`ResourceID:` + fmt.Sprintf("%v", this.ResourceID) + `,`,
2904
+		`ResourceType:` + fmt.Sprintf("%v", this.ResourceType) + `,`,
2905
+		`}`,
2906
+	}, "")
2907
+	return s
2908
+}
2898 2909
 func (this *GenericRuntimeSpec) String() string {
2899 2910
 	if this == nil {
2900 2911
 		return "nil"
... ...
@@ -2953,6 +3191,17 @@ func (this *ContainerSpec) String() string {
2953 2953
 		`StopSignal:` + fmt.Sprintf("%v", this.StopSignal) + `,`,
2954 2954
 		`Configs:` + strings.Replace(fmt.Sprintf("%v", this.Configs), "ConfigReference", "ConfigReference", 1) + `,`,
2955 2955
 		`Privileges:` + strings.Replace(fmt.Sprintf("%v", this.Privileges), "Privileges", "Privileges", 1) + `,`,
2956
+		`Init:` + fmt.Sprintf("%v", this.Init) + `,`,
2957
+		`}`,
2958
+	}, "")
2959
+	return s
2960
+}
2961
+func (this *ContainerSpec_InitValue) String() string {
2962
+	if this == nil {
2963
+		return "nil"
2964
+	}
2965
+	s := strings.Join([]string{`&ContainerSpec_InitValue{`,
2966
+		`InitValue:` + fmt.Sprintf("%v", this.InitValue) + `,`,
2956 2967
 		`}`,
2957 2968
 	}, "")
2958 2969
 	return s
... ...
@@ -3934,6 +4183,135 @@ func (m *TaskSpec) Unmarshal(dAtA []byte) error {
3934 3934
 			}
3935 3935
 			m.Runtime = &TaskSpec_Generic{v}
3936 3936
 			iNdEx = postIndex
3937
+		case 11:
3938
+			if wireType != 2 {
3939
+				return fmt.Errorf("proto: wrong wireType = %d for field ResourceReferences", wireType)
3940
+			}
3941
+			var msglen int
3942
+			for shift := uint(0); ; shift += 7 {
3943
+				if shift >= 64 {
3944
+					return ErrIntOverflowSpecs
3945
+				}
3946
+				if iNdEx >= l {
3947
+					return io.ErrUnexpectedEOF
3948
+				}
3949
+				b := dAtA[iNdEx]
3950
+				iNdEx++
3951
+				msglen |= (int(b) & 0x7F) << shift
3952
+				if b < 0x80 {
3953
+					break
3954
+				}
3955
+			}
3956
+			if msglen < 0 {
3957
+				return ErrInvalidLengthSpecs
3958
+			}
3959
+			postIndex := iNdEx + msglen
3960
+			if postIndex > l {
3961
+				return io.ErrUnexpectedEOF
3962
+			}
3963
+			m.ResourceReferences = append(m.ResourceReferences, ResourceReference{})
3964
+			if err := m.ResourceReferences[len(m.ResourceReferences)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil {
3965
+				return err
3966
+			}
3967
+			iNdEx = postIndex
3968
+		default:
3969
+			iNdEx = preIndex
3970
+			skippy, err := skipSpecs(dAtA[iNdEx:])
3971
+			if err != nil {
3972
+				return err
3973
+			}
3974
+			if skippy < 0 {
3975
+				return ErrInvalidLengthSpecs
3976
+			}
3977
+			if (iNdEx + skippy) > l {
3978
+				return io.ErrUnexpectedEOF
3979
+			}
3980
+			iNdEx += skippy
3981
+		}
3982
+	}
3983
+
3984
+	if iNdEx > l {
3985
+		return io.ErrUnexpectedEOF
3986
+	}
3987
+	return nil
3988
+}
3989
+func (m *ResourceReference) Unmarshal(dAtA []byte) error {
3990
+	l := len(dAtA)
3991
+	iNdEx := 0
3992
+	for iNdEx < l {
3993
+		preIndex := iNdEx
3994
+		var wire uint64
3995
+		for shift := uint(0); ; shift += 7 {
3996
+			if shift >= 64 {
3997
+				return ErrIntOverflowSpecs
3998
+			}
3999
+			if iNdEx >= l {
4000
+				return io.ErrUnexpectedEOF
4001
+			}
4002
+			b := dAtA[iNdEx]
4003
+			iNdEx++
4004
+			wire |= (uint64(b) & 0x7F) << shift
4005
+			if b < 0x80 {
4006
+				break
4007
+			}
4008
+		}
4009
+		fieldNum := int32(wire >> 3)
4010
+		wireType := int(wire & 0x7)
4011
+		if wireType == 4 {
4012
+			return fmt.Errorf("proto: ResourceReference: wiretype end group for non-group")
4013
+		}
4014
+		if fieldNum <= 0 {
4015
+			return fmt.Errorf("proto: ResourceReference: illegal tag %d (wire type %d)", fieldNum, wire)
4016
+		}
4017
+		switch fieldNum {
4018
+		case 1:
4019
+			if wireType != 2 {
4020
+				return fmt.Errorf("proto: wrong wireType = %d for field ResourceID", wireType)
4021
+			}
4022
+			var stringLen uint64
4023
+			for shift := uint(0); ; shift += 7 {
4024
+				if shift >= 64 {
4025
+					return ErrIntOverflowSpecs
4026
+				}
4027
+				if iNdEx >= l {
4028
+					return io.ErrUnexpectedEOF
4029
+				}
4030
+				b := dAtA[iNdEx]
4031
+				iNdEx++
4032
+				stringLen |= (uint64(b) & 0x7F) << shift
4033
+				if b < 0x80 {
4034
+					break
4035
+				}
4036
+			}
4037
+			intStringLen := int(stringLen)
4038
+			if intStringLen < 0 {
4039
+				return ErrInvalidLengthSpecs
4040
+			}
4041
+			postIndex := iNdEx + intStringLen
4042
+			if postIndex > l {
4043
+				return io.ErrUnexpectedEOF
4044
+			}
4045
+			m.ResourceID = string(dAtA[iNdEx:postIndex])
4046
+			iNdEx = postIndex
4047
+		case 2:
4048
+			if wireType != 0 {
4049
+				return fmt.Errorf("proto: wrong wireType = %d for field ResourceType", wireType)
4050
+			}
4051
+			m.ResourceType = 0
4052
+			for shift := uint(0); ; shift += 7 {
4053
+				if shift >= 64 {
4054
+					return ErrIntOverflowSpecs
4055
+				}
4056
+				if iNdEx >= l {
4057
+					return io.ErrUnexpectedEOF
4058
+				}
4059
+				b := dAtA[iNdEx]
4060
+				iNdEx++
4061
+				m.ResourceType |= (ResourceType(b) & 0x7F) << shift
4062
+				if b < 0x80 {
4063
+					break
4064
+				}
4065
+			}
3937 4066
 		default:
3938 4067
 			iNdEx = preIndex
3939 4068
 			skippy, err := skipSpecs(dAtA[iNdEx:])
... ...
@@ -4899,6 +5277,27 @@ func (m *ContainerSpec) Unmarshal(dAtA []byte) error {
4899 4899
 				return err
4900 4900
 			}
4901 4901
 			iNdEx = postIndex
4902
+		case 23:
4903
+			if wireType != 0 {
4904
+				return fmt.Errorf("proto: wrong wireType = %d for field InitValue", wireType)
4905
+			}
4906
+			var v int
4907
+			for shift := uint(0); ; shift += 7 {
4908
+				if shift >= 64 {
4909
+					return ErrIntOverflowSpecs
4910
+				}
4911
+				if iNdEx >= l {
4912
+					return io.ErrUnexpectedEOF
4913
+				}
4914
+				b := dAtA[iNdEx]
4915
+				iNdEx++
4916
+				v |= (int(b) & 0x7F) << shift
4917
+				if b < 0x80 {
4918
+					break
4919
+				}
4920
+			}
4921
+			b := bool(v != 0)
4922
+			m.Init = &ContainerSpec_InitValue{b}
4902 4923
 		default:
4903 4924
 			iNdEx = preIndex
4904 4925
 			skippy, err := skipSpecs(dAtA[iNdEx:])
... ...
@@ -6207,126 +6606,133 @@ var (
6207 6207
 	ErrIntOverflowSpecs   = fmt.Errorf("proto: integer overflow")
6208 6208
 )
6209 6209
 
6210
-func init() { proto.RegisterFile("specs.proto", fileDescriptorSpecs) }
6210
+func init() { proto.RegisterFile("github.com/docker/swarmkit/api/specs.proto", fileDescriptorSpecs) }
6211 6211
 
6212 6212
 var fileDescriptorSpecs = []byte{
6213
-	// 1880 bytes of a gzipped FileDescriptorProto
6214
-	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xcc, 0x57, 0xcf, 0x73, 0x1b, 0x49,
6215
-	0x15, 0xb6, 0x6c, 0x59, 0x3f, 0xde, 0xc8, 0x89, 0xdc, 0x24, 0x61, 0xac, 0xb0, 0xb2, 0xa2, 0x0d,
6216
-	0xc1, 0xcb, 0x16, 0x72, 0x61, 0xa8, 0x25, 0xbb, 0x61, 0x01, 0xc9, 0x12, 0x8e, 0x31, 0x76, 0x54,
6217
-	0x6d, 0x6f, 0x20, 0x27, 0x55, 0x7b, 0xa6, 0x2d, 0x4d, 0x79, 0xd4, 0x3d, 0xf4, 0xf4, 0x68, 0x4b,
6218
-	0x37, 0x8e, 0x5b, 0xb9, 0x72, 0x76, 0x71, 0xa0, 0xf8, 0x5f, 0x72, 0xa4, 0x38, 0xc1, 0xc5, 0x45,
6219
-	0xfc, 0x2f, 0x70, 0xe3, 0x02, 0xd5, 0x3d, 0x3d, 0xd2, 0x28, 0x19, 0xc7, 0xa9, 0x22, 0x87, 0xbd,
6220
-	0x75, 0xbf, 0xfe, 0xbe, 0xd7, 0xdd, 0xaf, 0xbf, 0xee, 0xf7, 0x1a, 0xac, 0x30, 0xa0, 0x4e, 0xd8,
6221
-	0x0a, 0x04, 0x97, 0x1c, 0x21, 0x97, 0x3b, 0xe7, 0x54, 0xb4, 0xc2, 0xaf, 0x89, 0x18, 0x9f, 0x7b,
6222
-	0xb2, 0x35, 0xf9, 0x71, 0xcd, 0x92, 0xd3, 0x80, 0x1a, 0x40, 0xed, 0xce, 0x90, 0x0f, 0xb9, 0x6e,
6223
-	0x6e, 0xab, 0x96, 0xb1, 0xd6, 0x87, 0x9c, 0x0f, 0x7d, 0xba, 0xad, 0x7b, 0xa7, 0xd1, 0xd9, 0xb6,
6224
-	0x1b, 0x09, 0x22, 0x3d, 0xce, 0xcc, 0xf8, 0xc6, 0x9b, 0xe3, 0x84, 0x4d, 0xe3, 0xa1, 0xe6, 0x45,
6225
-	0x1e, 0x4a, 0x47, 0xdc, 0xa5, 0xc7, 0x01, 0x75, 0xd0, 0x1e, 0x58, 0x84, 0x31, 0x2e, 0x35, 0x37,
6226
-	0xb4, 0x73, 0x8d, 0xdc, 0x96, 0xb5, 0xb3, 0xd9, 0x7a, 0x7b, 0x51, 0xad, 0xf6, 0x1c, 0xd6, 0xc9,
6227
-	0xbf, 0xba, 0xdc, 0x5c, 0xc2, 0x69, 0x26, 0xfa, 0x25, 0x54, 0x5c, 0x1a, 0x7a, 0x82, 0xba, 0x03,
6228
-	0xc1, 0x7d, 0x6a, 0x2f, 0x37, 0x72, 0x5b, 0xb7, 0x76, 0xbe, 0x97, 0xe5, 0x49, 0x4d, 0x8e, 0xb9,
6229
-	0x4f, 0xb1, 0x65, 0x18, 0xaa, 0x83, 0xf6, 0x00, 0xc6, 0x74, 0x7c, 0x4a, 0x45, 0x38, 0xf2, 0x02,
6230
-	0x7b, 0x45, 0xd3, 0x7f, 0x70, 0x1d, 0x5d, 0xad, 0xbd, 0x75, 0x38, 0x83, 0xe3, 0x14, 0x15, 0x1d,
6231
-	0x42, 0x85, 0x4c, 0x88, 0xe7, 0x93, 0x53, 0xcf, 0xf7, 0xe4, 0xd4, 0xce, 0x6b, 0x57, 0x9f, 0xbc,
6232
-	0xd3, 0x55, 0x3b, 0x45, 0xc0, 0x0b, 0xf4, 0xa6, 0x0b, 0x30, 0x9f, 0x08, 0x3d, 0x82, 0x62, 0xbf,
6233
-	0x77, 0xd4, 0xdd, 0x3f, 0xda, 0xab, 0x2e, 0xd5, 0x36, 0x5e, 0x5e, 0x34, 0xee, 0x2a, 0x1f, 0x73,
6234
-	0x40, 0x9f, 0x32, 0xd7, 0x63, 0x43, 0xb4, 0x05, 0xa5, 0xf6, 0xee, 0x6e, 0xaf, 0x7f, 0xd2, 0xeb,
6235
-	0x56, 0x73, 0xb5, 0xda, 0xcb, 0x8b, 0xc6, 0xbd, 0x45, 0x60, 0xdb, 0x71, 0x68, 0x20, 0xa9, 0x5b,
6236
-	0xcb, 0x7f, 0xf3, 0x97, 0xfa, 0x52, 0xf3, 0x9b, 0x1c, 0x54, 0xd2, 0x8b, 0x40, 0x8f, 0xa0, 0xd0,
6237
-	0xde, 0x3d, 0xd9, 0x7f, 0xde, 0xab, 0x2e, 0xcd, 0xe9, 0x69, 0x44, 0xdb, 0x91, 0xde, 0x84, 0xa2,
6238
-	0x87, 0xb0, 0xda, 0x6f, 0x7f, 0x75, 0xdc, 0xab, 0xe6, 0xe6, 0xcb, 0x49, 0xc3, 0xfa, 0x24, 0x0a,
6239
-	0x35, 0xaa, 0x8b, 0xdb, 0xfb, 0x47, 0xd5, 0xe5, 0x6c, 0x54, 0x57, 0x10, 0x8f, 0x99, 0xa5, 0xfc,
6240
-	0x39, 0x0f, 0xd6, 0x31, 0x15, 0x13, 0xcf, 0xf9, 0xc0, 0x12, 0xf9, 0x0c, 0xf2, 0x92, 0x84, 0xe7,
6241
-	0x5a, 0x1a, 0x56, 0xb6, 0x34, 0x4e, 0x48, 0x78, 0xae, 0x26, 0x35, 0x74, 0x8d, 0x57, 0xca, 0x10,
6242
-	0x34, 0xf0, 0x3d, 0x87, 0x48, 0xea, 0x6a, 0x65, 0x58, 0x3b, 0xdf, 0xcf, 0x62, 0xe3, 0x19, 0xca,
6243
-	0xac, 0xff, 0xe9, 0x12, 0x4e, 0x51, 0xd1, 0x13, 0x28, 0x0c, 0x7d, 0x7e, 0x4a, 0x7c, 0xad, 0x09,
6244
-	0x6b, 0xe7, 0x41, 0x96, 0x93, 0x3d, 0x8d, 0x98, 0x3b, 0x30, 0x14, 0xf4, 0x18, 0x0a, 0x51, 0xe0,
6245
-	0x12, 0x49, 0xed, 0x82, 0x26, 0x37, 0xb2, 0xc8, 0x5f, 0x69, 0xc4, 0x2e, 0x67, 0x67, 0xde, 0x10,
6246
-	0x1b, 0x3c, 0x3a, 0x80, 0x12, 0xa3, 0xf2, 0x6b, 0x2e, 0xce, 0x43, 0xbb, 0xd8, 0x58, 0xd9, 0xb2,
6247
-	0x76, 0x3e, 0xcd, 0x14, 0x63, 0x8c, 0x69, 0x4b, 0x49, 0x9c, 0xd1, 0x98, 0x32, 0x19, 0xbb, 0xe9,
6248
-	0x2c, 0xdb, 0x39, 0x3c, 0x73, 0x80, 0x7e, 0x0e, 0x25, 0xca, 0xdc, 0x80, 0x7b, 0x4c, 0xda, 0xa5,
6249
-	0xeb, 0x17, 0xd2, 0x33, 0x18, 0x15, 0x4c, 0x3c, 0x63, 0x28, 0xb6, 0xe0, 0xbe, 0x7f, 0x4a, 0x9c,
6250
-	0x73, 0xbb, 0xfc, 0x9e, 0xdb, 0x98, 0x31, 0x3a, 0x05, 0xc8, 0x8f, 0xb9, 0x4b, 0x9b, 0xdb, 0xb0,
6251
-	0xfe, 0x56, 0xa8, 0x51, 0x0d, 0x4a, 0x26, 0xd4, 0xb1, 0x46, 0xf2, 0x78, 0xd6, 0x6f, 0xde, 0x86,
6252
-	0xb5, 0x85, 0xb0, 0x36, 0xff, 0x9e, 0x87, 0x52, 0x72, 0xd6, 0xa8, 0x0d, 0x65, 0x87, 0x33, 0x49,
6253
-	0x3c, 0x46, 0x85, 0x91, 0x57, 0xe6, 0xc9, 0xec, 0x26, 0x20, 0xc5, 0x7a, 0xba, 0x84, 0xe7, 0x2c,
6254
-	0xf4, 0x6b, 0x28, 0x0b, 0x1a, 0xf2, 0x48, 0x38, 0x34, 0x34, 0xfa, 0xda, 0xca, 0x56, 0x48, 0x0c,
6255
-	0xc2, 0xf4, 0x0f, 0x91, 0x27, 0xa8, 0x8a, 0x72, 0x88, 0xe7, 0x54, 0xf4, 0x04, 0x8a, 0x82, 0x86,
6256
-	0x92, 0x08, 0xf9, 0x2e, 0x89, 0xe0, 0x18, 0xd2, 0xe7, 0xbe, 0xe7, 0x4c, 0x71, 0xc2, 0x40, 0x4f,
6257
-	0xa0, 0x1c, 0xf8, 0xc4, 0xd1, 0x5e, 0xed, 0x55, 0x4d, 0xff, 0x28, 0x8b, 0xde, 0x4f, 0x40, 0x78,
6258
-	0x8e, 0x47, 0x9f, 0x03, 0xf8, 0x7c, 0x38, 0x70, 0x85, 0x37, 0xa1, 0xc2, 0x48, 0xac, 0x96, 0xc5,
6259
-	0xee, 0x6a, 0x04, 0x2e, 0xfb, 0x7c, 0x18, 0x37, 0xd1, 0xde, 0xff, 0xa5, 0xaf, 0x94, 0xb6, 0x0e,
6260
-	0x00, 0xc8, 0x6c, 0xd4, 0xa8, 0xeb, 0x93, 0xf7, 0x72, 0x65, 0x4e, 0x24, 0x45, 0x47, 0x0f, 0xa0,
6261
-	0x72, 0xc6, 0x85, 0x43, 0x07, 0xe6, 0xd6, 0x94, 0xb5, 0x26, 0x2c, 0x6d, 0x8b, 0xf5, 0x85, 0x3a,
6262
-	0x50, 0x1c, 0x52, 0x46, 0x85, 0xe7, 0xd8, 0xa0, 0x27, 0x7b, 0x94, 0x79, 0x21, 0x63, 0x08, 0x8e,
6263
-	0x98, 0xf4, 0xc6, 0xd4, 0xcc, 0x94, 0x10, 0x3b, 0x65, 0x28, 0x8a, 0x78, 0xa4, 0xf9, 0x7b, 0x40,
6264
-	0x6f, 0x63, 0x11, 0x82, 0xfc, 0xb9, 0xc7, 0x5c, 0x2d, 0xac, 0x32, 0xd6, 0x6d, 0xd4, 0x82, 0x62,
6265
-	0x40, 0xa6, 0x3e, 0x27, 0xae, 0x11, 0xcb, 0x9d, 0x56, 0x9c, 0x2f, 0x5b, 0x49, 0xbe, 0x6c, 0xb5,
6266
-	0xd9, 0x14, 0x27, 0xa0, 0xe6, 0x01, 0xdc, 0xcd, 0xdc, 0x32, 0xda, 0x81, 0xca, 0x4c, 0x84, 0x03,
6267
-	0xcf, 0x4c, 0xd2, 0xb9, 0x7d, 0x75, 0xb9, 0x69, 0xcd, 0xd4, 0xba, 0xdf, 0xc5, 0xd6, 0x0c, 0xb4,
6268
-	0xef, 0x36, 0xff, 0x54, 0x86, 0xb5, 0x05, 0x29, 0xa3, 0x3b, 0xb0, 0xea, 0x8d, 0xc9, 0x90, 0x9a,
6269
-	0x35, 0xc6, 0x1d, 0xd4, 0x83, 0x82, 0x4f, 0x4e, 0xa9, 0xaf, 0x04, 0xad, 0x0e, 0xf5, 0x47, 0x37,
6270
-	0xde, 0x89, 0xd6, 0x6f, 0x35, 0xbe, 0xc7, 0xa4, 0x98, 0x62, 0x43, 0x46, 0x36, 0x14, 0x1d, 0x3e,
6271
-	0x1e, 0x13, 0xa6, 0x9e, 0xce, 0x95, 0xad, 0x32, 0x4e, 0xba, 0x2a, 0x32, 0x44, 0x0c, 0x43, 0x3b,
6272
-	0xaf, 0xcd, 0xba, 0x8d, 0xaa, 0xb0, 0x42, 0xd9, 0xc4, 0x5e, 0xd5, 0x26, 0xd5, 0x54, 0x16, 0xd7,
6273
-	0x8b, 0x15, 0x59, 0xc6, 0xaa, 0xa9, 0x78, 0x51, 0x48, 0x85, 0x5d, 0x8c, 0x23, 0xaa, 0xda, 0xe8,
6274
-	0x67, 0x50, 0x18, 0xf3, 0x88, 0xc9, 0xd0, 0x2e, 0xe9, 0xc5, 0x6e, 0x64, 0x2d, 0xf6, 0x50, 0x21,
6275
-	0xcc, 0xd3, 0x6e, 0xe0, 0xa8, 0x07, 0xeb, 0xa1, 0xe4, 0xc1, 0x60, 0x28, 0x88, 0x43, 0x07, 0x01,
6276
-	0x15, 0x1e, 0x77, 0xcd, 0xd3, 0xb4, 0xf1, 0xd6, 0xa1, 0x74, 0x4d, 0x91, 0x83, 0x6f, 0x2b, 0xce,
6277
-	0x9e, 0xa2, 0xf4, 0x35, 0x03, 0xf5, 0xa1, 0x12, 0x44, 0xbe, 0x3f, 0xe0, 0x41, 0x9c, 0xa5, 0x62,
6278
-	0x3d, 0xbd, 0x47, 0xc8, 0xfa, 0x91, 0xef, 0x3f, 0x8b, 0x49, 0xd8, 0x0a, 0xe6, 0x1d, 0x74, 0x0f,
6279
-	0x0a, 0x43, 0xc1, 0xa3, 0x20, 0xb4, 0x2d, 0x1d, 0x0c, 0xd3, 0x43, 0x5f, 0x42, 0x31, 0xa4, 0x8e,
6280
-	0xa0, 0x32, 0xb4, 0x2b, 0x7a, 0xab, 0x1f, 0x67, 0x4d, 0x72, 0xac, 0x21, 0x98, 0x9e, 0x51, 0x41,
6281
-	0x99, 0x43, 0x71, 0xc2, 0x41, 0x1b, 0xb0, 0x22, 0xe5, 0xd4, 0x5e, 0x6b, 0xe4, 0xb6, 0x4a, 0x9d,
6282
-	0xe2, 0xd5, 0xe5, 0xe6, 0xca, 0xc9, 0xc9, 0x0b, 0xac, 0x6c, 0xea, 0x05, 0x1d, 0xf1, 0x50, 0x32,
6283
-	0x32, 0xa6, 0xf6, 0x2d, 0x1d, 0xdb, 0x59, 0x1f, 0xbd, 0x00, 0x70, 0x59, 0x38, 0x70, 0xf4, 0x95,
6284
-	0xb5, 0x6f, 0xeb, 0xdd, 0x7d, 0x7a, 0xf3, 0xee, 0xba, 0x47, 0xc7, 0x26, 0x8b, 0xac, 0x5d, 0x5d,
6285
-	0x6e, 0x96, 0x67, 0x5d, 0x5c, 0x76, 0x59, 0x18, 0x37, 0x51, 0x07, 0xac, 0x11, 0x25, 0xbe, 0x1c,
6286
-	0x39, 0x23, 0xea, 0x9c, 0xdb, 0xd5, 0xeb, 0xd3, 0xc2, 0x53, 0x0d, 0x33, 0x1e, 0xd2, 0x24, 0xa5,
6287
-	0x60, 0xb5, 0xd4, 0xd0, 0x5e, 0xd7, 0xb1, 0x8a, 0x3b, 0xe8, 0x23, 0x00, 0x1e, 0x50, 0x36, 0x08,
6288
-	0xa5, 0xeb, 0x31, 0x1b, 0xa9, 0x2d, 0xe3, 0xb2, 0xb2, 0x1c, 0x2b, 0x03, 0xba, 0xaf, 0x1e, 0x6d,
6289
-	0xe2, 0x0e, 0x38, 0xf3, 0xa7, 0xf6, 0x77, 0xf4, 0x68, 0x49, 0x19, 0x9e, 0x31, 0x7f, 0x8a, 0x36,
6290
-	0xc1, 0xd2, 0xba, 0x08, 0xbd, 0x21, 0x23, 0xbe, 0x7d, 0x47, 0xc7, 0x03, 0x94, 0xe9, 0x58, 0x5b,
6291
-	0xd4, 0x39, 0xc4, 0xd1, 0x08, 0xed, 0xbb, 0xd7, 0x9f, 0x83, 0x59, 0xec, 0xfc, 0x1c, 0x0c, 0x07,
6292
-	0xfd, 0x02, 0x20, 0x10, 0xde, 0xc4, 0xf3, 0xe9, 0x90, 0x86, 0xf6, 0x3d, 0xbd, 0xe9, 0x7a, 0xe6,
6293
-	0x6b, 0x3d, 0x43, 0xe1, 0x14, 0xa3, 0xf6, 0x39, 0x58, 0xa9, 0xdb, 0xa6, 0x6e, 0xc9, 0x39, 0x9d,
6294
-	0x9a, 0x0b, 0xac, 0x9a, 0x2a, 0x24, 0x13, 0xe2, 0x47, 0x71, 0x25, 0x5c, 0xc6, 0x71, 0xe7, 0x8b,
6295
-	0xe5, 0xc7, 0xb9, 0xda, 0x0e, 0x58, 0x29, 0xd5, 0xa1, 0x8f, 0x61, 0x4d, 0xd0, 0xa1, 0x17, 0x4a,
6296
-	0x31, 0x1d, 0x90, 0x48, 0x8e, 0xec, 0x5f, 0x69, 0x42, 0x25, 0x31, 0xb6, 0x23, 0x39, 0xaa, 0x0d,
6297
-	0x60, 0x7e, 0x78, 0xa8, 0x01, 0x96, 0x12, 0x45, 0x48, 0xc5, 0x84, 0x0a, 0x95, 0x6d, 0x55, 0xcc,
6298
-	0xd3, 0x26, 0x25, 0xde, 0x90, 0x12, 0xe1, 0x8c, 0xf4, 0xdb, 0x51, 0xc6, 0xa6, 0xa7, 0x1e, 0x83,
6299
-	0xe4, 0x86, 0x98, 0xc7, 0xc0, 0x74, 0x9b, 0xff, 0xce, 0x41, 0x25, 0x5d, 0x34, 0xa0, 0xdd, 0x38,
6300
-	0xd9, 0xeb, 0x2d, 0xdd, 0xda, 0xd9, 0xbe, 0xa9, 0xc8, 0xd0, 0xa9, 0xd5, 0x8f, 0x94, 0xb3, 0x43,
6301
-	0x55, 0xdf, 0x6b, 0x32, 0xfa, 0x29, 0xac, 0x06, 0x5c, 0xc8, 0xe4, 0x09, 0xcb, 0x0e, 0x30, 0x17,
6302
-	0x49, 0x2a, 0x8a, 0xc1, 0xcd, 0x11, 0xdc, 0x5a, 0xf4, 0x86, 0x1e, 0xc2, 0xca, 0xf3, 0xfd, 0x7e,
6303
-	0x75, 0xa9, 0x76, 0xff, 0xe5, 0x45, 0xe3, 0xbb, 0x8b, 0x83, 0xcf, 0x3d, 0x21, 0x23, 0xe2, 0xef,
6304
-	0xf7, 0xd1, 0x0f, 0x61, 0xb5, 0x7b, 0x74, 0x8c, 0x71, 0x35, 0x57, 0xdb, 0x7c, 0x79, 0xd1, 0xb8,
6305
-	0xbf, 0x88, 0x53, 0x43, 0x3c, 0x62, 0x2e, 0xe6, 0xa7, 0xb3, 0x5a, 0xf7, 0x3f, 0xcb, 0x60, 0x99,
6306
-	0x97, 0xfd, 0x43, 0x7f, 0x87, 0xd6, 0xe2, 0x54, 0x9e, 0x5c, 0xd9, 0xe5, 0x1b, 0x33, 0x7a, 0x25,
6307
-	0x26, 0x98, 0x33, 0x7e, 0x00, 0x15, 0x2f, 0x98, 0x7c, 0x36, 0xa0, 0x8c, 0x9c, 0xfa, 0xa6, 0xec,
6308
-	0x2d, 0x61, 0x4b, 0xd9, 0x7a, 0xb1, 0x49, 0xbd, 0x17, 0x1e, 0x93, 0x54, 0x30, 0x53, 0xd0, 0x96,
6309
-	0xf0, 0xac, 0x8f, 0xbe, 0x84, 0xbc, 0x17, 0x90, 0xb1, 0x29, 0x43, 0x32, 0x77, 0xb0, 0xdf, 0x6f,
6310
-	0x1f, 0x1a, 0x0d, 0x76, 0x4a, 0x57, 0x97, 0x9b, 0x79, 0x65, 0xc0, 0x9a, 0x86, 0xea, 0x49, 0x25,
6311
-	0xa0, 0x66, 0xd2, 0x6f, 0x7f, 0x09, 0xa7, 0x2c, 0x4a, 0x47, 0x1e, 0x1b, 0x0a, 0x1a, 0x86, 0x3a,
6312
-	0x0b, 0x94, 0x70, 0xd2, 0x45, 0x35, 0x28, 0x9a, 0x7a, 0x42, 0x17, 0x10, 0x65, 0x95, 0xab, 0x8d,
6313
-	0xa1, 0xb3, 0x06, 0x56, 0x1c, 0x8d, 0xc1, 0x99, 0xe0, 0xe3, 0xe6, 0x7f, 0xf3, 0x60, 0xed, 0xfa,
6314
-	0x51, 0x28, 0x4d, 0x1a, 0xfc, 0x60, 0xc1, 0x7f, 0x01, 0xeb, 0x44, 0x7f, 0xaf, 0x08, 0x53, 0x39,
6315
-	0x45, 0x97, 0x69, 0xe6, 0x00, 0x1e, 0x66, 0xba, 0x9b, 0x81, 0xe3, 0x92, 0xae, 0x53, 0x50, 0x3e,
6316
-	0xed, 0x1c, 0xae, 0x92, 0x37, 0x46, 0xd0, 0x31, 0xac, 0x71, 0xe1, 0x8c, 0x68, 0x28, 0xe3, 0x4c,
6317
-	0x64, 0xbe, 0x23, 0x99, 0x1f, 0xd5, 0x67, 0x69, 0xa0, 0x79, 0x86, 0xe3, 0xd5, 0x2e, 0xfa, 0x40,
6318
-	0x8f, 0x21, 0x2f, 0xc8, 0x59, 0x52, 0x72, 0x66, 0x5e, 0x12, 0x4c, 0xce, 0xe4, 0x82, 0x0b, 0xcd,
6319
-	0x40, 0xbf, 0x01, 0x70, 0xbd, 0x30, 0x20, 0xd2, 0x19, 0x51, 0x61, 0x0e, 0x3b, 0x73, 0x8b, 0xdd,
6320
-	0x19, 0x6a, 0xc1, 0x4b, 0x8a, 0x8d, 0x0e, 0xa0, 0xec, 0x90, 0x44, 0xae, 0x85, 0xeb, 0xff, 0x68,
6321
-	0xbb, 0x6d, 0xe3, 0xa2, 0xaa, 0x5c, 0x5c, 0x5d, 0x6e, 0x96, 0x12, 0x0b, 0x2e, 0x39, 0xc4, 0xc8,
6322
-	0xf7, 0x00, 0xd6, 0xd4, 0xdf, 0x6d, 0xe0, 0xd2, 0x33, 0x12, 0xf9, 0x32, 0x96, 0xc9, 0x35, 0x69,
6323
-	0x45, 0x7d, 0x04, 0xba, 0x06, 0x67, 0xd6, 0x55, 0x91, 0x29, 0x1b, 0xfa, 0x1d, 0xac, 0x53, 0xe6,
6324
-	0x88, 0xa9, 0x16, 0x6b, 0xb2, 0xc2, 0xd2, 0xf5, 0x9b, 0xed, 0xcd, 0xc0, 0x0b, 0x9b, 0xad, 0xd2,
6325
-	0x37, 0xec, 0xcd, 0x7f, 0xe6, 0x00, 0xe2, 0x4c, 0xfd, 0x61, 0x05, 0x88, 0x20, 0xef, 0x12, 0x49,
6326
-	0xb4, 0xe6, 0x2a, 0x58, 0xb7, 0xd1, 0x17, 0x00, 0x92, 0x8e, 0x03, 0x9f, 0x48, 0x8f, 0x0d, 0x8d,
6327
-	0x6c, 0xde, 0xf5, 0x1c, 0xa4, 0xd0, 0x68, 0x07, 0x0a, 0xe6, 0x63, 0x90, 0xbf, 0x91, 0x67, 0x90,
6328
-	0xcd, 0xbf, 0xe6, 0x00, 0xe2, 0x6d, 0x7e, 0xab, 0xf7, 0xd6, 0xb1, 0x5f, 0xbd, 0xae, 0x2f, 0xfd,
6329
-	0xe3, 0x75, 0x7d, 0xe9, 0x8f, 0x57, 0xf5, 0xdc, 0xab, 0xab, 0x7a, 0xee, 0x6f, 0x57, 0xf5, 0xdc,
6330
-	0xbf, 0xae, 0xea, 0xb9, 0xd3, 0x82, 0xae, 0xfb, 0x7e, 0xf2, 0xbf, 0x00, 0x00, 0x00, 0xff, 0xff,
6331
-	0xc1, 0xd8, 0x19, 0x9e, 0x30, 0x13, 0x00, 0x00,
6213
+	// 2000 bytes of a gzipped FileDescriptorProto
6214
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xcc, 0x57, 0x4f, 0x6f, 0x1b, 0xb9,
6215
+	0x15, 0xb7, 0x6c, 0x59, 0x7f, 0xde, 0xc8, 0x89, 0xc2, 0x4d, 0xb2, 0x13, 0xa5, 0x6b, 0x29, 0xda,
6216
+	0x6c, 0xea, 0xdd, 0x45, 0x65, 0xd4, 0x2d, 0xb6, 0xd9, 0x4d, 0xb7, 0xad, 0x64, 0xa9, 0x8e, 0x9b,
6217
+	0xc6, 0x11, 0x68, 0x6f, 0xda, 0x00, 0x05, 0x04, 0x7a, 0x86, 0x96, 0x08, 0x8f, 0x86, 0x53, 0x0e,
6218
+	0xc7, 0x0b, 0xdd, 0x7a, 0x5c, 0xa4, 0x9f, 0x21, 0xe8, 0xa1, 0xe8, 0xbd, 0x1f, 0xa0, 0x1f, 0x20,
6219
+	0xc7, 0x1e, 0xdb, 0x8b, 0xd1, 0xd5, 0x57, 0xe8, 0xad, 0x97, 0x16, 0xe4, 0x70, 0x46, 0xa3, 0x64,
6220
+	0x1c, 0x07, 0x68, 0x0e, 0x7b, 0x23, 0xdf, 0xfc, 0x7e, 0x6f, 0x1e, 0xc9, 0xdf, 0xe3, 0x7b, 0x84,
6221
+	0x4f, 0xc6, 0x4c, 0x4e, 0xa2, 0xe3, 0x8e, 0xc3, 0xa7, 0xdb, 0x2e, 0x77, 0x4e, 0xa9, 0xd8, 0x0e,
6222
+	0xbf, 0x26, 0x62, 0x7a, 0xca, 0xe4, 0x36, 0x09, 0xd8, 0x76, 0x18, 0x50, 0x27, 0xec, 0x04, 0x82,
6223
+	0x4b, 0x8e, 0x50, 0x0c, 0xe8, 0x24, 0x80, 0xce, 0xd9, 0x0f, 0x1b, 0x97, 0xf1, 0xe5, 0x2c, 0xa0,
6224
+	0x86, 0xdf, 0xb8, 0x3e, 0xe6, 0x63, 0xae, 0x87, 0xdb, 0x6a, 0x64, 0xac, 0x9b, 0x63, 0xce, 0xc7,
6225
+	0x1e, 0xdd, 0xd6, 0xb3, 0xe3, 0xe8, 0x64, 0xdb, 0x8d, 0x04, 0x91, 0x8c, 0xfb, 0xe6, 0xfb, 0xad,
6226
+	0x57, 0xbf, 0x13, 0x7f, 0x16, 0x7f, 0x6a, 0xbf, 0x28, 0x42, 0xe5, 0x80, 0xbb, 0xf4, 0x30, 0xa0,
6227
+	0x0e, 0xda, 0x03, 0x8b, 0xf8, 0x3e, 0x97, 0x9a, 0x1b, 0xda, 0x85, 0x56, 0x61, 0xcb, 0xda, 0x69,
6228
+	0x76, 0x5e, 0x8f, 0xb9, 0xd3, 0x5d, 0xc0, 0x7a, 0xc5, 0x97, 0xe7, 0xcd, 0x15, 0x9c, 0x65, 0xa2,
6229
+	0x9f, 0x43, 0xcd, 0xa5, 0x21, 0x13, 0xd4, 0x1d, 0x09, 0xee, 0x51, 0x7b, 0xb5, 0x55, 0xd8, 0xba,
6230
+	0xb2, 0xf3, 0xbd, 0x3c, 0x4f, 0xea, 0xe7, 0x98, 0x7b, 0x14, 0x5b, 0x86, 0xa1, 0x26, 0x68, 0x0f,
6231
+	0x60, 0x4a, 0xa7, 0xc7, 0x54, 0x84, 0x13, 0x16, 0xd8, 0x6b, 0x9a, 0xfe, 0xfd, 0x8b, 0xe8, 0x2a,
6232
+	0xf6, 0xce, 0xe3, 0x14, 0x8e, 0x33, 0x54, 0xf4, 0x18, 0x6a, 0xe4, 0x8c, 0x30, 0x8f, 0x1c, 0x33,
6233
+	0x8f, 0xc9, 0x99, 0x5d, 0xd4, 0xae, 0x3e, 0x7e, 0xa3, 0xab, 0x6e, 0x86, 0x80, 0x97, 0xe8, 0x6d,
6234
+	0x17, 0x60, 0xf1, 0x23, 0x74, 0x0f, 0xca, 0xc3, 0xc1, 0x41, 0x7f, 0xff, 0x60, 0xaf, 0xbe, 0xd2,
6235
+	0xb8, 0xf5, 0xfc, 0x45, 0xeb, 0x86, 0xf2, 0xb1, 0x00, 0x0c, 0xa9, 0xef, 0x32, 0x7f, 0x8c, 0xb6,
6236
+	0xa0, 0xd2, 0xdd, 0xdd, 0x1d, 0x0c, 0x8f, 0x06, 0xfd, 0x7a, 0xa1, 0xd1, 0x78, 0xfe, 0xa2, 0x75,
6237
+	0x73, 0x19, 0xd8, 0x75, 0x1c, 0x1a, 0x48, 0xea, 0x36, 0x8a, 0xdf, 0xfc, 0x79, 0x73, 0xa5, 0xfd,
6238
+	0x4d, 0x01, 0x6a, 0xd9, 0x20, 0xd0, 0x3d, 0x28, 0x75, 0x77, 0x8f, 0xf6, 0x9f, 0x0e, 0xea, 0x2b,
6239
+	0x0b, 0x7a, 0x16, 0xd1, 0x75, 0x24, 0x3b, 0xa3, 0xe8, 0x2e, 0xac, 0x0f, 0xbb, 0x5f, 0x1d, 0x0e,
6240
+	0xea, 0x85, 0x45, 0x38, 0x59, 0xd8, 0x90, 0x44, 0xa1, 0x46, 0xf5, 0x71, 0x77, 0xff, 0xa0, 0xbe,
6241
+	0x9a, 0x8f, 0xea, 0x0b, 0xc2, 0x7c, 0x13, 0xca, 0x9f, 0x8a, 0x60, 0x1d, 0x52, 0x71, 0xc6, 0x9c,
6242
+	0x77, 0x2c, 0x91, 0xcf, 0xa0, 0x28, 0x49, 0x78, 0xaa, 0xa5, 0x61, 0xe5, 0x4b, 0xe3, 0x88, 0x84,
6243
+	0xa7, 0xea, 0xa7, 0x86, 0xae, 0xf1, 0x4a, 0x19, 0x82, 0x06, 0x1e, 0x73, 0x88, 0xa4, 0xae, 0x56,
6244
+	0x86, 0xb5, 0xf3, 0x51, 0x1e, 0x1b, 0xa7, 0x28, 0x13, 0xff, 0xc3, 0x15, 0x9c, 0xa1, 0xa2, 0x07,
6245
+	0x50, 0x1a, 0x7b, 0xfc, 0x98, 0x78, 0x5a, 0x13, 0xd6, 0xce, 0x9d, 0x3c, 0x27, 0x7b, 0x1a, 0xb1,
6246
+	0x70, 0x60, 0x28, 0xe8, 0x3e, 0x94, 0xa2, 0xc0, 0x25, 0x92, 0xda, 0x25, 0x4d, 0x6e, 0xe5, 0x91,
6247
+	0xbf, 0xd2, 0x88, 0x5d, 0xee, 0x9f, 0xb0, 0x31, 0x36, 0x78, 0xf4, 0x08, 0x2a, 0x3e, 0x95, 0x5f,
6248
+	0x73, 0x71, 0x1a, 0xda, 0xe5, 0xd6, 0xda, 0x96, 0xb5, 0xf3, 0x69, 0xae, 0x18, 0x63, 0x4c, 0x57,
6249
+	0x4a, 0xe2, 0x4c, 0xa6, 0xd4, 0x97, 0xb1, 0x9b, 0xde, 0xaa, 0x5d, 0xc0, 0xa9, 0x03, 0xf4, 0x53,
6250
+	0xa8, 0x50, 0xdf, 0x0d, 0x38, 0xf3, 0xa5, 0x5d, 0xb9, 0x38, 0x90, 0x81, 0xc1, 0xa8, 0xcd, 0xc4,
6251
+	0x29, 0x43, 0xb1, 0x05, 0xf7, 0xbc, 0x63, 0xe2, 0x9c, 0xda, 0xd5, 0xb7, 0x5c, 0x46, 0xca, 0xe8,
6252
+	0x95, 0xa0, 0x38, 0xe5, 0x2e, 0x6d, 0x6f, 0xc3, 0xb5, 0xd7, 0xb6, 0x1a, 0x35, 0xa0, 0x62, 0xb6,
6253
+	0x3a, 0xd6, 0x48, 0x11, 0xa7, 0xf3, 0xf6, 0x55, 0xd8, 0x58, 0xda, 0xd6, 0xf6, 0x5f, 0xd7, 0xa1,
6254
+	0x92, 0x9c, 0x35, 0xea, 0x42, 0xd5, 0xe1, 0xbe, 0x24, 0xcc, 0xa7, 0xc2, 0xc8, 0x2b, 0xf7, 0x64,
6255
+	0x76, 0x13, 0x90, 0x62, 0x3d, 0x5c, 0xc1, 0x0b, 0x16, 0xfa, 0x25, 0x54, 0x05, 0x0d, 0x79, 0x24,
6256
+	0x1c, 0x1a, 0x1a, 0x7d, 0x6d, 0xe5, 0x2b, 0x24, 0x06, 0x61, 0xfa, 0xfb, 0x88, 0x09, 0xaa, 0x76,
6257
+	0x39, 0xc4, 0x0b, 0x2a, 0x7a, 0x00, 0x65, 0x41, 0x43, 0x49, 0x84, 0x7c, 0x93, 0x44, 0x70, 0x0c,
6258
+	0x19, 0x72, 0x8f, 0x39, 0x33, 0x9c, 0x30, 0xd0, 0x03, 0xa8, 0x06, 0x1e, 0x71, 0xb4, 0x57, 0x7b,
6259
+	0x5d, 0xd3, 0x3f, 0xc8, 0xa3, 0x0f, 0x13, 0x10, 0x5e, 0xe0, 0xd1, 0xe7, 0x00, 0x1e, 0x1f, 0x8f,
6260
+	0x5c, 0xc1, 0xce, 0xa8, 0x30, 0x12, 0x6b, 0xe4, 0xb1, 0xfb, 0x1a, 0x81, 0xab, 0x1e, 0x1f, 0xc7,
6261
+	0x43, 0xb4, 0xf7, 0x7f, 0xe9, 0x2b, 0xa3, 0xad, 0x47, 0x00, 0x24, 0xfd, 0x6a, 0xd4, 0xf5, 0xf1,
6262
+	0x5b, 0xb9, 0x32, 0x27, 0x92, 0xa1, 0xa3, 0x3b, 0x50, 0x3b, 0xe1, 0xc2, 0xa1, 0x23, 0x93, 0x35,
6263
+	0x55, 0xad, 0x09, 0x4b, 0xdb, 0x62, 0x7d, 0xa1, 0x1e, 0x94, 0xc7, 0xd4, 0xa7, 0x82, 0x39, 0x36,
6264
+	0xe8, 0x9f, 0xdd, 0xcb, 0x4d, 0xc8, 0x18, 0x82, 0x23, 0x5f, 0xb2, 0x29, 0x35, 0x7f, 0x4a, 0x88,
6265
+	0xe8, 0x77, 0xf0, 0x5e, 0x72, 0x7c, 0x23, 0x41, 0x4f, 0xa8, 0xa0, 0xbe, 0xd2, 0x80, 0xa5, 0xf7,
6266
+	0xe1, 0xa3, 0x37, 0x6b, 0xc0, 0xa0, 0xcd, 0x65, 0x83, 0xc4, 0xab, 0x1f, 0xc2, 0x5e, 0x15, 0xca,
6267
+	0x22, 0xfe, 0x6f, 0xfb, 0x8f, 0x05, 0xa5, 0xfa, 0x57, 0x10, 0x68, 0x1b, 0xac, 0xf4, 0xf7, 0xcc,
6268
+	0xd5, 0xea, 0xad, 0xf6, 0xae, 0xcc, 0xcf, 0x9b, 0x90, 0x60, 0xf7, 0xfb, 0xea, 0x0e, 0x32, 0x63,
6269
+	0x17, 0x0d, 0x60, 0x23, 0x25, 0xa8, 0x32, 0x6f, 0x0a, 0x65, 0xeb, 0x4d, 0x91, 0x1e, 0xcd, 0x02,
6270
+	0x8a, 0x6b, 0x22, 0x33, 0x6b, 0xff, 0x16, 0xd0, 0xeb, 0xfb, 0x82, 0x10, 0x14, 0x4f, 0x99, 0x6f,
6271
+	0xc2, 0xc0, 0x7a, 0x8c, 0x3a, 0x50, 0x0e, 0xc8, 0xcc, 0xe3, 0xc4, 0x35, 0x89, 0x71, 0xbd, 0x13,
6272
+	0xf7, 0x06, 0x9d, 0xa4, 0x37, 0xe8, 0x74, 0xfd, 0x19, 0x4e, 0x40, 0xed, 0x47, 0x70, 0x23, 0xf7,
6273
+	0x78, 0xd1, 0x0e, 0xd4, 0xd2, 0x84, 0x5b, 0xac, 0xf5, 0xea, 0xfc, 0xbc, 0x69, 0xa5, 0x99, 0xb9,
6274
+	0xdf, 0xc7, 0x56, 0x0a, 0xda, 0x77, 0xdb, 0x7f, 0xab, 0xc2, 0xc6, 0x52, 0xda, 0xa2, 0xeb, 0xb0,
6275
+	0xce, 0xa6, 0x64, 0x4c, 0x4d, 0x8c, 0xf1, 0x04, 0x0d, 0xa0, 0xe4, 0x91, 0x63, 0xea, 0xa9, 0xe4,
6276
+	0x55, 0x07, 0xf7, 0x83, 0x4b, 0xf3, 0xbf, 0xf3, 0x6b, 0x8d, 0x1f, 0xf8, 0x52, 0xcc, 0xb0, 0x21,
6277
+	0x23, 0x1b, 0xca, 0x0e, 0x9f, 0x4e, 0x89, 0xaf, 0xca, 0xc4, 0xda, 0x56, 0x15, 0x27, 0x53, 0xb5,
6278
+	0x33, 0x44, 0x8c, 0x43, 0xbb, 0xa8, 0xcd, 0x7a, 0x8c, 0xea, 0xb0, 0x46, 0xfd, 0x33, 0x7b, 0x5d,
6279
+	0x9b, 0xd4, 0x50, 0x59, 0x5c, 0x16, 0x67, 0x5f, 0x15, 0xab, 0xa1, 0xe2, 0x45, 0x21, 0x15, 0x76,
6280
+	0x39, 0xde, 0x51, 0x35, 0x46, 0x3f, 0x81, 0xd2, 0x94, 0x47, 0xbe, 0x0c, 0xed, 0x8a, 0x0e, 0xf6,
6281
+	0x56, 0x5e, 0xb0, 0x8f, 0x15, 0xc2, 0x28, 0xcb, 0xc0, 0xd1, 0x00, 0xae, 0x85, 0x92, 0x07, 0xa3,
6282
+	0xb1, 0x20, 0x0e, 0x1d, 0x05, 0x54, 0x30, 0xee, 0x9a, 0x6b, 0xf8, 0xd6, 0x6b, 0x87, 0xd2, 0x37,
6283
+	0x0d, 0x1d, 0xbe, 0xaa, 0x38, 0x7b, 0x8a, 0x32, 0xd4, 0x0c, 0x34, 0x84, 0x5a, 0x10, 0x79, 0xde,
6284
+	0x88, 0x07, 0x71, 0x45, 0x8e, 0x73, 0xe7, 0x2d, 0xb6, 0x6c, 0x18, 0x79, 0xde, 0x93, 0x98, 0x84,
6285
+	0xad, 0x60, 0x31, 0x41, 0x37, 0xa1, 0x34, 0x16, 0x3c, 0x0a, 0xe2, 0xbc, 0xa9, 0x62, 0x33, 0x43,
6286
+	0x5f, 0x42, 0x39, 0xa4, 0x8e, 0xa0, 0x32, 0xb4, 0x6b, 0x7a, 0xa9, 0x1f, 0xe6, 0xfd, 0xe4, 0x50,
6287
+	0x43, 0xd2, 0x9c, 0xc0, 0x09, 0x07, 0xdd, 0x82, 0x35, 0x29, 0x67, 0xf6, 0x46, 0xab, 0xb0, 0x55,
6288
+	0xe9, 0x95, 0xe7, 0xe7, 0xcd, 0xb5, 0xa3, 0xa3, 0x67, 0x58, 0xd9, 0x54, 0xb5, 0x98, 0xf0, 0x50,
6289
+	0xfa, 0x64, 0x4a, 0xed, 0x2b, 0x7a, 0x6f, 0xd3, 0x39, 0x7a, 0x06, 0xe0, 0xfa, 0xe1, 0xc8, 0xd1,
6290
+	0xd7, 0x93, 0x7d, 0x55, 0xaf, 0xee, 0xd3, 0xcb, 0x57, 0xd7, 0x3f, 0x38, 0x34, 0x15, 0x73, 0x63,
6291
+	0x7e, 0xde, 0xac, 0xa6, 0x53, 0x5c, 0x75, 0xfd, 0x30, 0x1e, 0xa2, 0x1e, 0x58, 0x13, 0x4a, 0x3c,
6292
+	0x39, 0x71, 0x26, 0xd4, 0x39, 0xb5, 0xeb, 0x17, 0x97, 0xc0, 0x87, 0x1a, 0x66, 0x3c, 0x64, 0x49,
6293
+	0x4a, 0xc1, 0x2a, 0xd4, 0xd0, 0xbe, 0xa6, 0xf7, 0x2a, 0x9e, 0xa0, 0x0f, 0x00, 0x78, 0x40, 0xfd,
6294
+	0x51, 0x28, 0x5d, 0xe6, 0xdb, 0x48, 0x2d, 0x19, 0x57, 0x95, 0xe5, 0x50, 0x19, 0xd0, 0x6d, 0x55,
6295
+	0xa0, 0x88, 0x3b, 0xe2, 0xbe, 0x37, 0xb3, 0xdf, 0xd3, 0x5f, 0x2b, 0xca, 0xf0, 0xc4, 0xf7, 0x66,
6296
+	0xa8, 0x09, 0x96, 0xd6, 0x45, 0xc8, 0xc6, 0x3e, 0xf1, 0xec, 0xeb, 0x7a, 0x3f, 0x40, 0x99, 0x0e,
6297
+	0xb5, 0x45, 0x9d, 0x43, 0xbc, 0x1b, 0xa1, 0x7d, 0xe3, 0xe2, 0x73, 0x30, 0xc1, 0x2e, 0xce, 0xc1,
6298
+	0x70, 0xd0, 0xcf, 0x00, 0x02, 0xc1, 0xce, 0x98, 0x47, 0xc7, 0x34, 0xb4, 0x6f, 0xea, 0x45, 0x6f,
6299
+	0xe6, 0x56, 0xa6, 0x14, 0x85, 0x33, 0x0c, 0xd4, 0x04, 0x60, 0x3e, 0x93, 0xa3, 0x33, 0xe2, 0x45,
6300
+	0xd4, 0x7e, 0x5f, 0x45, 0xaf, 0xca, 0xaf, 0xb2, 0x3d, 0x55, 0xa6, 0xc6, 0xe7, 0x60, 0x65, 0xd2,
6301
+	0x51, 0xa5, 0xd1, 0x29, 0x9d, 0x99, 0x0c, 0x57, 0x43, 0xb5, 0x67, 0x31, 0x79, 0x35, 0xce, 0x7a,
6302
+	0x3d, 0xf9, 0x62, 0xf5, 0x7e, 0xa1, 0xb1, 0x03, 0x56, 0x46, 0x96, 0xe8, 0x43, 0x75, 0x3d, 0x8e,
6303
+	0x59, 0x28, 0xc5, 0x6c, 0x44, 0x22, 0x39, 0xb1, 0x7f, 0xa1, 0x09, 0xb5, 0xc4, 0xd8, 0x8d, 0xe4,
6304
+	0xa4, 0x31, 0x82, 0xc5, 0xe9, 0xa2, 0x16, 0x58, 0x4a, 0x35, 0x21, 0x15, 0x67, 0x54, 0xa8, 0xd6,
6305
+	0x43, 0x1d, 0x4a, 0xd6, 0xa4, 0xd4, 0x1d, 0x52, 0x22, 0x9c, 0x89, 0xbe, 0x5c, 0xaa, 0xd8, 0xcc,
6306
+	0xd4, 0x6d, 0x91, 0xa4, 0x90, 0xb9, 0x2d, 0xcc, 0x54, 0x35, 0x3a, 0x6a, 0x71, 0xed, 0x7f, 0x17,
6307
+	0xa0, 0x96, 0xed, 0xa4, 0xd0, 0x6e, 0xdc, 0x01, 0xe9, 0xa5, 0x5d, 0xd9, 0xd9, 0xbe, 0xac, 0xf3,
6308
+	0xd2, 0x37, 0xb8, 0x17, 0x29, 0xa7, 0x8f, 0xd5, 0xa3, 0x47, 0x93, 0xd1, 0x8f, 0x61, 0x3d, 0xe0,
6309
+	0x42, 0x26, 0x77, 0x5d, 0xfe, 0x49, 0x70, 0x91, 0xd4, 0xe7, 0x18, 0xdc, 0x9e, 0xc0, 0x95, 0x65,
6310
+	0x6f, 0xe8, 0x2e, 0xac, 0x3d, 0xdd, 0x1f, 0xd6, 0x57, 0x1a, 0xb7, 0x9f, 0xbf, 0x68, 0xbd, 0xbf,
6311
+	0xfc, 0xf1, 0x29, 0x13, 0x32, 0x22, 0xde, 0xfe, 0x10, 0x7d, 0x02, 0xeb, 0xfd, 0x83, 0x43, 0x8c,
6312
+	0xeb, 0x85, 0x46, 0xf3, 0xf9, 0x8b, 0xd6, 0xed, 0x65, 0x9c, 0xfa, 0xc4, 0x23, 0xdf, 0xc5, 0xfc,
6313
+	0x38, 0x7d, 0x00, 0xfc, 0x67, 0x15, 0x2c, 0x53, 0x02, 0xde, 0xf5, 0x1b, 0x71, 0x23, 0xee, 0x6f,
6314
+	0x92, 0xdc, 0x5e, 0xbd, 0xb4, 0xcd, 0xa9, 0xc5, 0x04, 0x73, 0xd6, 0x77, 0xa0, 0xc6, 0x82, 0xb3,
6315
+	0xcf, 0x46, 0xd4, 0x27, 0xc7, 0x9e, 0x79, 0x0b, 0x54, 0xb0, 0xa5, 0x6c, 0x83, 0xd8, 0xa4, 0x2e,
6316
+	0x16, 0xe6, 0x4b, 0x2a, 0x7c, 0xd3, 0xe5, 0x57, 0x70, 0x3a, 0x47, 0x5f, 0x42, 0x91, 0x05, 0x64,
6317
+	0x6a, 0x7a, 0xb3, 0xdc, 0x15, 0xec, 0x0f, 0xbb, 0x8f, 0x8d, 0x16, 0x7b, 0x95, 0xf9, 0x79, 0xb3,
6318
+	0xa8, 0x0c, 0x58, 0xd3, 0xd0, 0x66, 0xd2, 0x1e, 0xa9, 0x3f, 0xe9, 0x22, 0x51, 0xc1, 0x19, 0x8b,
6319
+	0xd2, 0x13, 0xf3, 0xc7, 0x82, 0x86, 0xa1, 0x2e, 0x17, 0x15, 0x9c, 0x4c, 0x51, 0x03, 0xca, 0xa6,
6320
+	0xc9, 0xd2, 0x5d, 0x55, 0x55, 0x35, 0x30, 0xc6, 0xd0, 0xdb, 0x00, 0x2b, 0xde, 0x8d, 0xd1, 0x89,
6321
+	0xe0, 0xd3, 0xf6, 0x7f, 0x8b, 0x60, 0xed, 0x7a, 0x51, 0x28, 0x4d, 0xbd, 0x7c, 0x67, 0x9b, 0xff,
6322
+	0x0c, 0xae, 0x11, 0xfd, 0xe6, 0x24, 0xbe, 0x2a, 0x3e, 0xba, 0x77, 0x35, 0x07, 0x70, 0x37, 0xd7,
6323
+	0x5d, 0x0a, 0x8e, 0xfb, 0xdc, 0x5e, 0x49, 0xf9, 0xb4, 0x0b, 0xb8, 0x4e, 0x5e, 0xf9, 0x82, 0x0e,
6324
+	0x61, 0x83, 0x0b, 0x67, 0x42, 0x43, 0x19, 0x97, 0x2c, 0xf3, 0x46, 0xcb, 0x7d, 0xbd, 0x3f, 0xc9,
6325
+	0x02, 0xcd, 0x7d, 0x1d, 0x47, 0xbb, 0xec, 0x03, 0xdd, 0x87, 0xa2, 0x20, 0x27, 0x49, 0x1f, 0x9e,
6326
+	0x9b, 0x24, 0x98, 0x9c, 0xc8, 0x25, 0x17, 0x9a, 0x81, 0x7e, 0x05, 0xe0, 0xb2, 0x30, 0x20, 0xd2,
6327
+	0x99, 0x50, 0x61, 0x0e, 0x3b, 0x77, 0x89, 0xfd, 0x14, 0xb5, 0xe4, 0x25, 0xc3, 0x46, 0x8f, 0xa0,
6328
+	0xea, 0x90, 0x44, 0xae, 0xa5, 0x8b, 0x1f, 0xae, 0xbb, 0x5d, 0xe3, 0xa2, 0xae, 0x5c, 0xcc, 0xcf,
6329
+	0x9b, 0x95, 0xc4, 0x82, 0x2b, 0x0e, 0x31, 0xf2, 0x7d, 0x04, 0x1b, 0xea, 0x41, 0x3b, 0x72, 0xe9,
6330
+	0x09, 0x89, 0x3c, 0x19, 0xcb, 0xe4, 0x82, 0xfa, 0xa3, 0x5e, 0x47, 0x7d, 0x83, 0x33, 0x71, 0xd5,
6331
+	0x64, 0xc6, 0x86, 0x7e, 0x03, 0xd7, 0xa8, 0xef, 0x88, 0x99, 0x16, 0x6b, 0x12, 0x61, 0xe5, 0xe2,
6332
+	0xc5, 0x0e, 0x52, 0xf0, 0xd2, 0x62, 0xeb, 0xf4, 0x15, 0x7b, 0xfb, 0x9f, 0x05, 0x80, 0xb8, 0xa4,
6333
+	0xbf, 0x5b, 0x01, 0x22, 0x28, 0xba, 0x44, 0x12, 0xad, 0xb9, 0x1a, 0xd6, 0x63, 0xf4, 0x05, 0x80,
6334
+	0xa4, 0xd3, 0xc0, 0x23, 0x92, 0xf9, 0x63, 0x23, 0x9b, 0x37, 0x5d, 0x07, 0x19, 0x34, 0xda, 0x81,
6335
+	0x92, 0x79, 0x2d, 0x15, 0x2f, 0xe5, 0x19, 0x64, 0xfb, 0x2f, 0x05, 0x80, 0x78, 0x99, 0xdf, 0xe9,
6336
+	0xb5, 0xf5, 0xec, 0x97, 0xdf, 0x6e, 0xae, 0xfc, 0xe3, 0xdb, 0xcd, 0x95, 0x3f, 0xcc, 0x37, 0x0b,
6337
+	0x2f, 0xe7, 0x9b, 0x85, 0xbf, 0xcf, 0x37, 0x0b, 0xff, 0x9a, 0x6f, 0x16, 0x8e, 0x4b, 0xba, 0x41,
6338
+	0xfc, 0xd1, 0xff, 0x02, 0x00, 0x00, 0xff, 0xff, 0x4f, 0xdf, 0x5d, 0x60, 0x83, 0x14, 0x00, 0x00,
6332 6339
 }
... ...
@@ -2,7 +2,7 @@ syntax = "proto3";
2 2
 
3 3
 package docker.swarmkit.v1;
4 4
 
5
-import "types.proto";
5
+import "github.com/docker/swarmkit/api/types.proto";
6 6
 import "gogoproto/gogo.proto";
7 7
 import "google/protobuf/duration.proto";
8 8
 import "google/protobuf/any.proto";
... ...
@@ -128,6 +128,21 @@ message TaskSpec {
128 128
 	// using the same reconciliation-based mechanism that performs rolling
129 129
 	// updates.
130 130
 	uint64 force_update = 9;
131
+
132
+	// ResourceReferences provides a generic way to specify resources that
133
+	// are used by this task, and should be sent down to agents along with
134
+	// the task. Inside the runtime field there may be more specific
135
+	// information about how to use the resource, but ResourceReferences
136
+	// establishes the relationship at the store level, and instructs the
137
+	// dispatcher to send the related objects.
138
+	//
139
+	// ResourceReferences is a list of ResourceReferences used by the task.
140
+	repeated ResourceReference resource_references = 11 [(gogoproto.nullable) = false];
141
+}
142
+
143
+message ResourceReference {
144
+	string resource_id = 1;
145
+	ResourceType resource_type = 2;
131 146
 }
132 147
 
133 148
 message GenericRuntimeSpec {
... ...
@@ -278,6 +293,11 @@ message ContainerSpec {
278 278
 	// task will exit and a new task will be rescheduled elsewhere. A container
279 279
 	// is considered unhealthy after `Retries` number of consecutive failures.
280 280
 	HealthConfig healthcheck = 16;
281
+	
282
+	// Run a custom init inside the container, if null, use the daemon's configured settings
283
+	oneof init {
284
+		bool init_value = 23;
285
+	}
281 286
 }
282 287
 
283 288
 // EndpointSpec defines the properties that can be configured to
... ...
@@ -1,222 +1,7 @@
1 1
 // Code generated by protoc-gen-gogo.
2
-// source: types.proto
2
+// source: github.com/docker/swarmkit/api/types.proto
3 3
 // DO NOT EDIT!
4 4
 
5
-/*
6
-	Package api is a generated protocol buffer package.
7
-
8
-	It is generated from these files:
9
-		types.proto
10
-		specs.proto
11
-		objects.proto
12
-		control.proto
13
-		dispatcher.proto
14
-		ca.proto
15
-		snapshot.proto
16
-		raft.proto
17
-		health.proto
18
-		resource.proto
19
-		logbroker.proto
20
-		watch.proto
21
-
22
-	It has these top-level messages:
23
-		Version
24
-		IndexEntry
25
-		Annotations
26
-		NamedGenericResource
27
-		DiscreteGenericResource
28
-		GenericResource
29
-		Resources
30
-		ResourceRequirements
31
-		Platform
32
-		PluginDescription
33
-		EngineDescription
34
-		NodeDescription
35
-		NodeTLSInfo
36
-		RaftMemberStatus
37
-		NodeStatus
38
-		Image
39
-		Mount
40
-		RestartPolicy
41
-		UpdateConfig
42
-		UpdateStatus
43
-		ContainerStatus
44
-		PortStatus
45
-		TaskStatus
46
-		NetworkAttachmentConfig
47
-		IPAMConfig
48
-		PortConfig
49
-		Driver
50
-		IPAMOptions
51
-		Peer
52
-		WeightedPeer
53
-		IssuanceStatus
54
-		AcceptancePolicy
55
-		ExternalCA
56
-		CAConfig
57
-		OrchestrationConfig
58
-		TaskDefaults
59
-		DispatcherConfig
60
-		RaftConfig
61
-		EncryptionConfig
62
-		SpreadOver
63
-		PlacementPreference
64
-		Placement
65
-		JoinTokens
66
-		RootCA
67
-		Certificate
68
-		EncryptionKey
69
-		ManagerStatus
70
-		FileTarget
71
-		SecretReference
72
-		ConfigReference
73
-		BlacklistedCertificate
74
-		HealthConfig
75
-		MaybeEncryptedRecord
76
-		RootRotation
77
-		Privileges
78
-		NodeSpec
79
-		ServiceSpec
80
-		ReplicatedService
81
-		GlobalService
82
-		TaskSpec
83
-		GenericRuntimeSpec
84
-		NetworkAttachmentSpec
85
-		ContainerSpec
86
-		EndpointSpec
87
-		NetworkSpec
88
-		ClusterSpec
89
-		SecretSpec
90
-		ConfigSpec
91
-		Meta
92
-		Node
93
-		Service
94
-		Endpoint
95
-		Task
96
-		NetworkAttachment
97
-		Network
98
-		Cluster
99
-		Secret
100
-		Config
101
-		Resource
102
-		Extension
103
-		GetNodeRequest
104
-		GetNodeResponse
105
-		ListNodesRequest
106
-		ListNodesResponse
107
-		UpdateNodeRequest
108
-		UpdateNodeResponse
109
-		RemoveNodeRequest
110
-		RemoveNodeResponse
111
-		GetTaskRequest
112
-		GetTaskResponse
113
-		RemoveTaskRequest
114
-		RemoveTaskResponse
115
-		ListTasksRequest
116
-		ListTasksResponse
117
-		CreateServiceRequest
118
-		CreateServiceResponse
119
-		GetServiceRequest
120
-		GetServiceResponse
121
-		UpdateServiceRequest
122
-		UpdateServiceResponse
123
-		RemoveServiceRequest
124
-		RemoveServiceResponse
125
-		ListServicesRequest
126
-		ListServicesResponse
127
-		CreateNetworkRequest
128
-		CreateNetworkResponse
129
-		GetNetworkRequest
130
-		GetNetworkResponse
131
-		RemoveNetworkRequest
132
-		RemoveNetworkResponse
133
-		ListNetworksRequest
134
-		ListNetworksResponse
135
-		GetClusterRequest
136
-		GetClusterResponse
137
-		ListClustersRequest
138
-		ListClustersResponse
139
-		KeyRotation
140
-		UpdateClusterRequest
141
-		UpdateClusterResponse
142
-		GetSecretRequest
143
-		GetSecretResponse
144
-		UpdateSecretRequest
145
-		UpdateSecretResponse
146
-		ListSecretsRequest
147
-		ListSecretsResponse
148
-		CreateSecretRequest
149
-		CreateSecretResponse
150
-		RemoveSecretRequest
151
-		RemoveSecretResponse
152
-		GetConfigRequest
153
-		GetConfigResponse
154
-		UpdateConfigRequest
155
-		UpdateConfigResponse
156
-		ListConfigsRequest
157
-		ListConfigsResponse
158
-		CreateConfigRequest
159
-		CreateConfigResponse
160
-		RemoveConfigRequest
161
-		RemoveConfigResponse
162
-		SessionRequest
163
-		SessionMessage
164
-		HeartbeatRequest
165
-		HeartbeatResponse
166
-		UpdateTaskStatusRequest
167
-		UpdateTaskStatusResponse
168
-		TasksRequest
169
-		TasksMessage
170
-		AssignmentsRequest
171
-		Assignment
172
-		AssignmentChange
173
-		AssignmentsMessage
174
-		NodeCertificateStatusRequest
175
-		NodeCertificateStatusResponse
176
-		IssueNodeCertificateRequest
177
-		IssueNodeCertificateResponse
178
-		GetRootCACertificateRequest
179
-		GetRootCACertificateResponse
180
-		GetUnlockKeyRequest
181
-		GetUnlockKeyResponse
182
-		StoreSnapshot
183
-		ClusterSnapshot
184
-		Snapshot
185
-		RaftMember
186
-		JoinRequest
187
-		JoinResponse
188
-		LeaveRequest
189
-		LeaveResponse
190
-		ProcessRaftMessageRequest
191
-		ProcessRaftMessageResponse
192
-		ResolveAddressRequest
193
-		ResolveAddressResponse
194
-		InternalRaftRequest
195
-		StoreAction
196
-		HealthCheckRequest
197
-		HealthCheckResponse
198
-		AttachNetworkRequest
199
-		AttachNetworkResponse
200
-		DetachNetworkRequest
201
-		DetachNetworkResponse
202
-		LogSubscriptionOptions
203
-		LogSelector
204
-		LogContext
205
-		LogAttr
206
-		LogMessage
207
-		SubscribeLogsRequest
208
-		SubscribeLogsMessage
209
-		ListenSubscriptionsRequest
210
-		SubscriptionMessage
211
-		PublishLogsMessage
212
-		PublishLogsResponse
213
-		Object
214
-		SelectBySlot
215
-		SelectByCustom
216
-		SelectBy
217
-		WatchRequest
218
-		WatchMessage
219
-*/
220 5
 package api
221 6
 
222 7
 import proto "github.com/gogo/protobuf/proto"
... ...
@@ -245,11 +30,29 @@ var _ = fmt.Errorf
245 245
 var _ = math.Inf
246 246
 var _ = time.Kitchen
247 247
 
248
-// This is a compile-time assertion to ensure that this generated file
249
-// is compatible with the proto package it is being compiled against.
250
-// A compilation error at this line likely means your copy of the
251
-// proto package needs to be updated.
252
-const _ = proto.GoGoProtoPackageIsVersion2 // please upgrade the proto package
248
+type ResourceType int32
249
+
250
+const (
251
+	ResourceType_TASK   ResourceType = 0
252
+	ResourceType_SECRET ResourceType = 1
253
+	ResourceType_CONFIG ResourceType = 2
254
+)
255
+
256
+var ResourceType_name = map[int32]string{
257
+	0: "TASK",
258
+	1: "SECRET",
259
+	2: "CONFIG",
260
+}
261
+var ResourceType_value = map[string]int32{
262
+	"TASK":   0,
263
+	"SECRET": 1,
264
+	"CONFIG": 2,
265
+}
266
+
267
+func (x ResourceType) String() string {
268
+	return proto.EnumName(ResourceType_name, int32(x))
269
+}
270
+func (ResourceType) EnumDescriptor() ([]byte, []int) { return fileDescriptorTypes, []int{0} }
253 271
 
254 272
 // TaskState enumerates the states that a task progresses through within an
255 273
 // agent. States are designed to be monotonically increasing, such that if two
... ...
@@ -306,7 +109,7 @@ var TaskState_value = map[string]int32{
306 306
 func (x TaskState) String() string {
307 307
 	return proto.EnumName(TaskState_name, int32(x))
308 308
 }
309
-func (TaskState) EnumDescriptor() ([]byte, []int) { return fileDescriptorTypes, []int{0} }
309
+func (TaskState) EnumDescriptor() ([]byte, []int) { return fileDescriptorTypes, []int{1} }
310 310
 
311 311
 type NodeRole int32
312 312
 
... ...
@@ -327,7 +130,7 @@ var NodeRole_value = map[string]int32{
327 327
 func (x NodeRole) String() string {
328 328
 	return proto.EnumName(NodeRole_name, int32(x))
329 329
 }
330
-func (NodeRole) EnumDescriptor() ([]byte, []int) { return fileDescriptorTypes, []int{1} }
330
+func (NodeRole) EnumDescriptor() ([]byte, []int) { return fileDescriptorTypes, []int{2} }
331 331
 
332 332
 type RaftMemberStatus_Reachability int32
333 333
 
... ...
@@ -1267,6 +1070,13 @@ type TaskStatus struct {
1267 1267
 	// HostPorts provides a list of ports allocated at the host
1268 1268
 	// level.
1269 1269
 	PortStatus *PortStatus `protobuf:"bytes,6,opt,name=port_status,json=portStatus" json:"port_status,omitempty"`
1270
+	// AppliedBy gives the node ID of the manager that applied this task
1271
+	// status update to the Task object.
1272
+	AppliedBy string `protobuf:"bytes,7,opt,name=applied_by,json=appliedBy,proto3" json:"applied_by,omitempty"`
1273
+	// AppliedAt gives a timestamp of when this status update was applied to
1274
+	// the Task object.
1275
+	// Note: can't use stdtime because this field is nullable.
1276
+	AppliedAt *google_protobuf.Timestamp `protobuf:"bytes,8,opt,name=applied_at,json=appliedAt" json:"applied_at,omitempty"`
1270 1277
 }
1271 1278
 
1272 1279
 func (m *TaskStatus) Reset()                    { *m = TaskStatus{} }
... ...
@@ -2311,6 +2121,7 @@ func init() {
2311 2311
 	proto.RegisterType((*Privileges)(nil), "docker.swarmkit.v1.Privileges")
2312 2312
 	proto.RegisterType((*Privileges_CredentialSpec)(nil), "docker.swarmkit.v1.Privileges.CredentialSpec")
2313 2313
 	proto.RegisterType((*Privileges_SELinuxContext)(nil), "docker.swarmkit.v1.Privileges.SELinuxContext")
2314
+	proto.RegisterEnum("docker.swarmkit.v1.ResourceType", ResourceType_name, ResourceType_value)
2314 2315
 	proto.RegisterEnum("docker.swarmkit.v1.TaskState", TaskState_name, TaskState_value)
2315 2316
 	proto.RegisterEnum("docker.swarmkit.v1.NodeRole", NodeRole_name, NodeRole_value)
2316 2317
 	proto.RegisterEnum("docker.swarmkit.v1.RaftMemberStatus_Reachability", RaftMemberStatus_Reachability_name, RaftMemberStatus_Reachability_value)
... ...
@@ -2867,6 +2678,10 @@ func (m *TaskStatus) CopyFrom(src interface{}) {
2867 2867
 		m.PortStatus = &PortStatus{}
2868 2868
 		github_com_docker_swarmkit_api_deepcopy.Copy(m.PortStatus, o.PortStatus)
2869 2869
 	}
2870
+	if o.AppliedAt != nil {
2871
+		m.AppliedAt = &google_protobuf.Timestamp{}
2872
+		github_com_docker_swarmkit_api_deepcopy.Copy(m.AppliedAt, o.AppliedAt)
2873
+	}
2870 2874
 	if o.RuntimeStatus != nil {
2871 2875
 		switch o.RuntimeStatus.(type) {
2872 2876
 		case *TaskStatus_Container:
... ...
@@ -4730,6 +4545,22 @@ func (m *TaskStatus) MarshalTo(dAtA []byte) (int, error) {
4730 4730
 		}
4731 4731
 		i += n22
4732 4732
 	}
4733
+	if len(m.AppliedBy) > 0 {
4734
+		dAtA[i] = 0x3a
4735
+		i++
4736
+		i = encodeVarintTypes(dAtA, i, uint64(len(m.AppliedBy)))
4737
+		i += copy(dAtA[i:], m.AppliedBy)
4738
+	}
4739
+	if m.AppliedAt != nil {
4740
+		dAtA[i] = 0x42
4741
+		i++
4742
+		i = encodeVarintTypes(dAtA, i, uint64(m.AppliedAt.Size()))
4743
+		n23, err := m.AppliedAt.MarshalTo(dAtA[i:])
4744
+		if err != nil {
4745
+			return 0, err
4746
+		}
4747
+		i += n23
4748
+	}
4733 4749
 	return i, nil
4734 4750
 }
4735 4751
 
... ...
@@ -4739,11 +4570,11 @@ func (m *TaskStatus_Container) MarshalTo(dAtA []byte) (int, error) {
4739 4739
 		dAtA[i] = 0x2a
4740 4740
 		i++
4741 4741
 		i = encodeVarintTypes(dAtA, i, uint64(m.Container.Size()))
4742
-		n23, err := m.Container.MarshalTo(dAtA[i:])
4742
+		n24, err := m.Container.MarshalTo(dAtA[i:])
4743 4743
 		if err != nil {
4744 4744
 			return 0, err
4745 4745
 		}
4746
-		i += n23
4746
+		i += n24
4747 4747
 	}
4748 4748
 	return i, nil
4749 4749
 }
... ...
@@ -4980,11 +4811,11 @@ func (m *IPAMOptions) MarshalTo(dAtA []byte) (int, error) {
4980 4980
 		dAtA[i] = 0xa
4981 4981
 		i++
4982 4982
 		i = encodeVarintTypes(dAtA, i, uint64(m.Driver.Size()))
4983
-		n24, err := m.Driver.MarshalTo(dAtA[i:])
4983
+		n25, err := m.Driver.MarshalTo(dAtA[i:])
4984 4984
 		if err != nil {
4985 4985
 			return 0, err
4986 4986
 		}
4987
-		i += n24
4987
+		i += n25
4988 4988
 	}
4989 4989
 	if len(m.Configs) > 0 {
4990 4990
 		for _, msg := range m.Configs {
... ...
@@ -5050,11 +4881,11 @@ func (m *WeightedPeer) MarshalTo(dAtA []byte) (int, error) {
5050 5050
 		dAtA[i] = 0xa
5051 5051
 		i++
5052 5052
 		i = encodeVarintTypes(dAtA, i, uint64(m.Peer.Size()))
5053
-		n25, err := m.Peer.MarshalTo(dAtA[i:])
5053
+		n26, err := m.Peer.MarshalTo(dAtA[i:])
5054 5054
 		if err != nil {
5055 5055
 			return 0, err
5056 5056
 		}
5057
-		i += n25
5057
+		i += n26
5058 5058
 	}
5059 5059
 	if m.Weight != 0 {
5060 5060
 		dAtA[i] = 0x10
... ...
@@ -5157,11 +4988,11 @@ func (m *AcceptancePolicy_RoleAdmissionPolicy) MarshalTo(dAtA []byte) (int, erro
5157 5157
 		dAtA[i] = 0x1a
5158 5158
 		i++
5159 5159
 		i = encodeVarintTypes(dAtA, i, uint64(m.Secret.Size()))
5160
-		n26, err := m.Secret.MarshalTo(dAtA[i:])
5160
+		n27, err := m.Secret.MarshalTo(dAtA[i:])
5161 5161
 		if err != nil {
5162 5162
 			return 0, err
5163 5163
 		}
5164
-		i += n26
5164
+		i += n27
5165 5165
 	}
5166 5166
 	return i, nil
5167 5167
 }
... ...
@@ -5267,11 +5098,11 @@ func (m *CAConfig) MarshalTo(dAtA []byte) (int, error) {
5267 5267
 		dAtA[i] = 0xa
5268 5268
 		i++
5269 5269
 		i = encodeVarintTypes(dAtA, i, uint64(m.NodeCertExpiry.Size()))
5270
-		n27, err := m.NodeCertExpiry.MarshalTo(dAtA[i:])
5270
+		n28, err := m.NodeCertExpiry.MarshalTo(dAtA[i:])
5271 5271
 		if err != nil {
5272 5272
 			return 0, err
5273 5273
 		}
5274
-		i += n27
5274
+		i += n28
5275 5275
 	}
5276 5276
 	if len(m.ExternalCAs) > 0 {
5277 5277
 		for _, msg := range m.ExternalCAs {
... ...
@@ -5347,11 +5178,11 @@ func (m *TaskDefaults) MarshalTo(dAtA []byte) (int, error) {
5347 5347
 		dAtA[i] = 0xa
5348 5348
 		i++
5349 5349
 		i = encodeVarintTypes(dAtA, i, uint64(m.LogDriver.Size()))
5350
-		n28, err := m.LogDriver.MarshalTo(dAtA[i:])
5350
+		n29, err := m.LogDriver.MarshalTo(dAtA[i:])
5351 5351
 		if err != nil {
5352 5352
 			return 0, err
5353 5353
 		}
5354
-		i += n28
5354
+		i += n29
5355 5355
 	}
5356 5356
 	return i, nil
5357 5357
 }
... ...
@@ -5375,11 +5206,11 @@ func (m *DispatcherConfig) MarshalTo(dAtA []byte) (int, error) {
5375 5375
 		dAtA[i] = 0xa
5376 5376
 		i++
5377 5377
 		i = encodeVarintTypes(dAtA, i, uint64(m.HeartbeatPeriod.Size()))
5378
-		n29, err := m.HeartbeatPeriod.MarshalTo(dAtA[i:])
5378
+		n30, err := m.HeartbeatPeriod.MarshalTo(dAtA[i:])
5379 5379
 		if err != nil {
5380 5380
 			return 0, err
5381 5381
 		}
5382
-		i += n29
5382
+		i += n30
5383 5383
 	}
5384 5384
 	return i, nil
5385 5385
 }
... ...
@@ -5495,11 +5326,11 @@ func (m *PlacementPreference) MarshalTo(dAtA []byte) (int, error) {
5495 5495
 	var l int
5496 5496
 	_ = l
5497 5497
 	if m.Preference != nil {
5498
-		nn30, err := m.Preference.MarshalTo(dAtA[i:])
5498
+		nn31, err := m.Preference.MarshalTo(dAtA[i:])
5499 5499
 		if err != nil {
5500 5500
 			return 0, err
5501 5501
 		}
5502
-		i += nn30
5502
+		i += nn31
5503 5503
 	}
5504 5504
 	return i, nil
5505 5505
 }
... ...
@@ -5510,11 +5341,11 @@ func (m *PlacementPreference_Spread) MarshalTo(dAtA []byte) (int, error) {
5510 5510
 		dAtA[i] = 0xa
5511 5511
 		i++
5512 5512
 		i = encodeVarintTypes(dAtA, i, uint64(m.Spread.Size()))
5513
-		n31, err := m.Spread.MarshalTo(dAtA[i:])
5513
+		n32, err := m.Spread.MarshalTo(dAtA[i:])
5514 5514
 		if err != nil {
5515 5515
 			return 0, err
5516 5516
 		}
5517
-		i += n31
5517
+		i += n32
5518 5518
 	}
5519 5519
 	return i, nil
5520 5520
 }
... ...
@@ -5641,20 +5472,20 @@ func (m *RootCA) MarshalTo(dAtA []byte) (int, error) {
5641 5641
 	dAtA[i] = 0x22
5642 5642
 	i++
5643 5643
 	i = encodeVarintTypes(dAtA, i, uint64(m.JoinTokens.Size()))
5644
-	n32, err := m.JoinTokens.MarshalTo(dAtA[i:])
5644
+	n33, err := m.JoinTokens.MarshalTo(dAtA[i:])
5645 5645
 	if err != nil {
5646 5646
 		return 0, err
5647 5647
 	}
5648
-	i += n32
5648
+	i += n33
5649 5649
 	if m.RootRotation != nil {
5650 5650
 		dAtA[i] = 0x2a
5651 5651
 		i++
5652 5652
 		i = encodeVarintTypes(dAtA, i, uint64(m.RootRotation.Size()))
5653
-		n33, err := m.RootRotation.MarshalTo(dAtA[i:])
5653
+		n34, err := m.RootRotation.MarshalTo(dAtA[i:])
5654 5654
 		if err != nil {
5655 5655
 			return 0, err
5656 5656
 		}
5657
-		i += n33
5657
+		i += n34
5658 5658
 	}
5659 5659
 	if m.LastForcedRotation != 0 {
5660 5660
 		dAtA[i] = 0x30
... ...
@@ -5693,11 +5524,11 @@ func (m *Certificate) MarshalTo(dAtA []byte) (int, error) {
5693 5693
 	dAtA[i] = 0x1a
5694 5694
 	i++
5695 5695
 	i = encodeVarintTypes(dAtA, i, uint64(m.Status.Size()))
5696
-	n34, err := m.Status.MarshalTo(dAtA[i:])
5696
+	n35, err := m.Status.MarshalTo(dAtA[i:])
5697 5697
 	if err != nil {
5698 5698
 		return 0, err
5699 5699
 	}
5700
-	i += n34
5700
+	i += n35
5701 5701
 	if len(m.Certificate) > 0 {
5702 5702
 		dAtA[i] = 0x22
5703 5703
 		i++
... ...
@@ -5866,11 +5697,11 @@ func (m *SecretReference) MarshalTo(dAtA []byte) (int, error) {
5866 5866
 		i += copy(dAtA[i:], m.SecretName)
5867 5867
 	}
5868 5868
 	if m.Target != nil {
5869
-		nn35, err := m.Target.MarshalTo(dAtA[i:])
5869
+		nn36, err := m.Target.MarshalTo(dAtA[i:])
5870 5870
 		if err != nil {
5871 5871
 			return 0, err
5872 5872
 		}
5873
-		i += nn35
5873
+		i += nn36
5874 5874
 	}
5875 5875
 	return i, nil
5876 5876
 }
... ...
@@ -5881,11 +5712,11 @@ func (m *SecretReference_File) MarshalTo(dAtA []byte) (int, error) {
5881 5881
 		dAtA[i] = 0x1a
5882 5882
 		i++
5883 5883
 		i = encodeVarintTypes(dAtA, i, uint64(m.File.Size()))
5884
-		n36, err := m.File.MarshalTo(dAtA[i:])
5884
+		n37, err := m.File.MarshalTo(dAtA[i:])
5885 5885
 		if err != nil {
5886 5886
 			return 0, err
5887 5887
 		}
5888
-		i += n36
5888
+		i += n37
5889 5889
 	}
5890 5890
 	return i, nil
5891 5891
 }
... ...
@@ -5917,11 +5748,11 @@ func (m *ConfigReference) MarshalTo(dAtA []byte) (int, error) {
5917 5917
 		i += copy(dAtA[i:], m.ConfigName)
5918 5918
 	}
5919 5919
 	if m.Target != nil {
5920
-		nn37, err := m.Target.MarshalTo(dAtA[i:])
5920
+		nn38, err := m.Target.MarshalTo(dAtA[i:])
5921 5921
 		if err != nil {
5922 5922
 			return 0, err
5923 5923
 		}
5924
-		i += nn37
5924
+		i += nn38
5925 5925
 	}
5926 5926
 	return i, nil
5927 5927
 }
... ...
@@ -5932,11 +5763,11 @@ func (m *ConfigReference_File) MarshalTo(dAtA []byte) (int, error) {
5932 5932
 		dAtA[i] = 0x1a
5933 5933
 		i++
5934 5934
 		i = encodeVarintTypes(dAtA, i, uint64(m.File.Size()))
5935
-		n38, err := m.File.MarshalTo(dAtA[i:])
5935
+		n39, err := m.File.MarshalTo(dAtA[i:])
5936 5936
 		if err != nil {
5937 5937
 			return 0, err
5938 5938
 		}
5939
-		i += n38
5939
+		i += n39
5940 5940
 	}
5941 5941
 	return i, nil
5942 5942
 }
... ...
@@ -5959,11 +5790,11 @@ func (m *BlacklistedCertificate) MarshalTo(dAtA []byte) (int, error) {
5959 5959
 		dAtA[i] = 0xa
5960 5960
 		i++
5961 5961
 		i = encodeVarintTypes(dAtA, i, uint64(m.Expiry.Size()))
5962
-		n39, err := m.Expiry.MarshalTo(dAtA[i:])
5962
+		n40, err := m.Expiry.MarshalTo(dAtA[i:])
5963 5963
 		if err != nil {
5964 5964
 			return 0, err
5965 5965
 		}
5966
-		i += n39
5966
+		i += n40
5967 5967
 	}
5968 5968
 	return i, nil
5969 5969
 }
... ...
@@ -6002,21 +5833,21 @@ func (m *HealthConfig) MarshalTo(dAtA []byte) (int, error) {
6002 6002
 		dAtA[i] = 0x12
6003 6003
 		i++
6004 6004
 		i = encodeVarintTypes(dAtA, i, uint64(m.Interval.Size()))
6005
-		n40, err := m.Interval.MarshalTo(dAtA[i:])
6005
+		n41, err := m.Interval.MarshalTo(dAtA[i:])
6006 6006
 		if err != nil {
6007 6007
 			return 0, err
6008 6008
 		}
6009
-		i += n40
6009
+		i += n41
6010 6010
 	}
6011 6011
 	if m.Timeout != nil {
6012 6012
 		dAtA[i] = 0x1a
6013 6013
 		i++
6014 6014
 		i = encodeVarintTypes(dAtA, i, uint64(m.Timeout.Size()))
6015
-		n41, err := m.Timeout.MarshalTo(dAtA[i:])
6015
+		n42, err := m.Timeout.MarshalTo(dAtA[i:])
6016 6016
 		if err != nil {
6017 6017
 			return 0, err
6018 6018
 		}
6019
-		i += n41
6019
+		i += n42
6020 6020
 	}
6021 6021
 	if m.Retries != 0 {
6022 6022
 		dAtA[i] = 0x20
... ...
@@ -6027,11 +5858,11 @@ func (m *HealthConfig) MarshalTo(dAtA []byte) (int, error) {
6027 6027
 		dAtA[i] = 0x2a
6028 6028
 		i++
6029 6029
 		i = encodeVarintTypes(dAtA, i, uint64(m.StartPeriod.Size()))
6030
-		n42, err := m.StartPeriod.MarshalTo(dAtA[i:])
6030
+		n43, err := m.StartPeriod.MarshalTo(dAtA[i:])
6031 6031
 		if err != nil {
6032 6032
 			return 0, err
6033 6033
 		}
6034
-		i += n42
6034
+		i += n43
6035 6035
 	}
6036 6036
 	return i, nil
6037 6037
 }
... ...
@@ -6126,21 +5957,21 @@ func (m *Privileges) MarshalTo(dAtA []byte) (int, error) {
6126 6126
 		dAtA[i] = 0xa
6127 6127
 		i++
6128 6128
 		i = encodeVarintTypes(dAtA, i, uint64(m.CredentialSpec.Size()))
6129
-		n43, err := m.CredentialSpec.MarshalTo(dAtA[i:])
6129
+		n44, err := m.CredentialSpec.MarshalTo(dAtA[i:])
6130 6130
 		if err != nil {
6131 6131
 			return 0, err
6132 6132
 		}
6133
-		i += n43
6133
+		i += n44
6134 6134
 	}
6135 6135
 	if m.SELinuxContext != nil {
6136 6136
 		dAtA[i] = 0x12
6137 6137
 		i++
6138 6138
 		i = encodeVarintTypes(dAtA, i, uint64(m.SELinuxContext.Size()))
6139
-		n44, err := m.SELinuxContext.MarshalTo(dAtA[i:])
6139
+		n45, err := m.SELinuxContext.MarshalTo(dAtA[i:])
6140 6140
 		if err != nil {
6141 6141
 			return 0, err
6142 6142
 		}
6143
-		i += n44
6143
+		i += n45
6144 6144
 	}
6145 6145
 	return i, nil
6146 6146
 }
... ...
@@ -6161,11 +5992,11 @@ func (m *Privileges_CredentialSpec) MarshalTo(dAtA []byte) (int, error) {
6161 6161
 	var l int
6162 6162
 	_ = l
6163 6163
 	if m.Source != nil {
6164
-		nn45, err := m.Source.MarshalTo(dAtA[i:])
6164
+		nn46, err := m.Source.MarshalTo(dAtA[i:])
6165 6165
 		if err != nil {
6166 6166
 			return 0, err
6167 6167
 		}
6168
-		i += nn45
6168
+		i += nn46
6169 6169
 	}
6170 6170
 	return i, nil
6171 6171
 }
... ...
@@ -6730,6 +6561,14 @@ func (m *TaskStatus) Size() (n int) {
6730 6730
 		l = m.PortStatus.Size()
6731 6731
 		n += 1 + l + sovTypes(uint64(l))
6732 6732
 	}
6733
+	l = len(m.AppliedBy)
6734
+	if l > 0 {
6735
+		n += 1 + l + sovTypes(uint64(l))
6736
+	}
6737
+	if m.AppliedAt != nil {
6738
+		l = m.AppliedAt.Size()
6739
+		n += 1 + l + sovTypes(uint64(l))
6740
+	}
6733 6741
 	return n
6734 6742
 }
6735 6743
 
... ...
@@ -7780,6 +7619,8 @@ func (this *TaskStatus) String() string {
7780 7780
 		`Err:` + fmt.Sprintf("%v", this.Err) + `,`,
7781 7781
 		`RuntimeStatus:` + fmt.Sprintf("%v", this.RuntimeStatus) + `,`,
7782 7782
 		`PortStatus:` + strings.Replace(fmt.Sprintf("%v", this.PortStatus), "PortStatus", "PortStatus", 1) + `,`,
7783
+		`AppliedBy:` + fmt.Sprintf("%v", this.AppliedBy) + `,`,
7784
+		`AppliedAt:` + strings.Replace(fmt.Sprintf("%v", this.AppliedAt), "Timestamp", "google_protobuf.Timestamp", 1) + `,`,
7783 7785
 		`}`,
7784 7786
 	}, "")
7785 7787
 	return s
... ...
@@ -11924,6 +11765,68 @@ func (m *TaskStatus) Unmarshal(dAtA []byte) error {
11924 11924
 				return err
11925 11925
 			}
11926 11926
 			iNdEx = postIndex
11927
+		case 7:
11928
+			if wireType != 2 {
11929
+				return fmt.Errorf("proto: wrong wireType = %d for field AppliedBy", wireType)
11930
+			}
11931
+			var stringLen uint64
11932
+			for shift := uint(0); ; shift += 7 {
11933
+				if shift >= 64 {
11934
+					return ErrIntOverflowTypes
11935
+				}
11936
+				if iNdEx >= l {
11937
+					return io.ErrUnexpectedEOF
11938
+				}
11939
+				b := dAtA[iNdEx]
11940
+				iNdEx++
11941
+				stringLen |= (uint64(b) & 0x7F) << shift
11942
+				if b < 0x80 {
11943
+					break
11944
+				}
11945
+			}
11946
+			intStringLen := int(stringLen)
11947
+			if intStringLen < 0 {
11948
+				return ErrInvalidLengthTypes
11949
+			}
11950
+			postIndex := iNdEx + intStringLen
11951
+			if postIndex > l {
11952
+				return io.ErrUnexpectedEOF
11953
+			}
11954
+			m.AppliedBy = string(dAtA[iNdEx:postIndex])
11955
+			iNdEx = postIndex
11956
+		case 8:
11957
+			if wireType != 2 {
11958
+				return fmt.Errorf("proto: wrong wireType = %d for field AppliedAt", wireType)
11959
+			}
11960
+			var msglen int
11961
+			for shift := uint(0); ; shift += 7 {
11962
+				if shift >= 64 {
11963
+					return ErrIntOverflowTypes
11964
+				}
11965
+				if iNdEx >= l {
11966
+					return io.ErrUnexpectedEOF
11967
+				}
11968
+				b := dAtA[iNdEx]
11969
+				iNdEx++
11970
+				msglen |= (int(b) & 0x7F) << shift
11971
+				if b < 0x80 {
11972
+					break
11973
+				}
11974
+			}
11975
+			if msglen < 0 {
11976
+				return ErrInvalidLengthTypes
11977
+			}
11978
+			postIndex := iNdEx + msglen
11979
+			if postIndex > l {
11980
+				return io.ErrUnexpectedEOF
11981
+			}
11982
+			if m.AppliedAt == nil {
11983
+				m.AppliedAt = &google_protobuf.Timestamp{}
11984
+			}
11985
+			if err := m.AppliedAt.Unmarshal(dAtA[iNdEx:postIndex]); err != nil {
11986
+				return err
11987
+			}
11988
+			iNdEx = postIndex
11927 11989
 		default:
11928 11990
 			iNdEx = preIndex
11929 11991
 			skippy, err := skipTypes(dAtA[iNdEx:])
... ...
@@ -17058,310 +16961,315 @@ var (
17058 17058
 	ErrIntOverflowTypes   = fmt.Errorf("proto: integer overflow")
17059 17059
 )
17060 17060
 
17061
-func init() { proto.RegisterFile("types.proto", fileDescriptorTypes) }
17061
+func init() { proto.RegisterFile("github.com/docker/swarmkit/api/types.proto", fileDescriptorTypes) }
17062 17062
 
17063 17063
 var fileDescriptorTypes = []byte{
17064
-	// 4822 bytes of a gzipped FileDescriptorProto
17064
+	// 4905 bytes of a gzipped FileDescriptorProto
17065 17065
 	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x7a, 0x4d, 0x6c, 0x24, 0x49,
17066
-	0x56, 0xbf, 0xeb, 0xd3, 0x55, 0xaf, 0xca, 0x76, 0x3a, 0xda, 0xdb, 0xe3, 0xae, 0xed, 0xb1, 0x6b,
17067
-	0x72, 0xa6, 0x77, 0x66, 0x67, 0xe7, 0x5f, 0xd3, 0x1f, 0xbb, 0xab, 0x9e, 0x99, 0xff, 0x7c, 0xd4,
17068
-	0x97, 0xdb, 0xb5, 0x6d, 0x57, 0x95, 0xa2, 0xca, 0xdd, 0x3b, 0x48, 0x90, 0x4a, 0x67, 0x86, 0xcb,
17069
-	0x39, 0xce, 0xca, 0x28, 0x32, 0xb3, 0xec, 0x2e, 0x16, 0x44, 0x8b, 0x03, 0x20, 0x9f, 0xe0, 0xb6,
17070
-	0x12, 0x32, 0x17, 0x38, 0x21, 0x24, 0x0e, 0x20, 0x21, 0xb8, 0x30, 0x48, 0x1c, 0xe6, 0xc6, 0x02,
17071
-	0x12, 0x5a, 0x81, 0x64, 0x18, 0x1f, 0xb8, 0x21, 0xb8, 0xac, 0xb8, 0x80, 0x84, 0xe2, 0x23, 0xb3,
17072
-	0xb2, 0xaa, 0xd3, 0x76, 0x0f, 0xb3, 0x17, 0x3b, 0xe3, 0xbd, 0xdf, 0x7b, 0xf1, 0xe2, 0x45, 0xc4,
17073
-	0x8b, 0xf7, 0x22, 0x0a, 0x0a, 0xfe, 0x64, 0x44, 0xbc, 0xca, 0xc8, 0xa5, 0x3e, 0x45, 0xc8, 0xa4,
17074
-	0xc6, 0x11, 0x71, 0x2b, 0xde, 0x89, 0xee, 0x0e, 0x8f, 0x2c, 0xbf, 0x72, 0x7c, 0xaf, 0xb4, 0x39,
17075
-	0xa0, 0x74, 0x60, 0x93, 0x77, 0x39, 0x62, 0x7f, 0x7c, 0xf0, 0xae, 0x6f, 0x0d, 0x89, 0xe7, 0xeb,
17076
-	0xc3, 0x91, 0x10, 0x2a, 0x6d, 0xcc, 0x03, 0xcc, 0xb1, 0xab, 0xfb, 0x16, 0x75, 0x24, 0x7f, 0x6d,
17077
-	0x40, 0x07, 0x94, 0x7f, 0xbe, 0xcb, 0xbe, 0x04, 0x55, 0xdd, 0x84, 0xc5, 0x27, 0xc4, 0xf5, 0x2c,
17078
-	0xea, 0xa0, 0x35, 0xc8, 0x58, 0x8e, 0x49, 0x9e, 0xad, 0x27, 0xca, 0x89, 0xb7, 0xd2, 0x58, 0x34,
17079
-	0xd4, 0xbb, 0x00, 0x2d, 0xf6, 0xd1, 0x74, 0x7c, 0x77, 0x82, 0x14, 0x48, 0x1d, 0x91, 0x09, 0x47,
17080
-	0xe4, 0x31, 0xfb, 0x64, 0x94, 0x63, 0xdd, 0x5e, 0x4f, 0x0a, 0xca, 0xb1, 0x6e, 0xab, 0x5f, 0x26,
17081
-	0xa0, 0x50, 0x75, 0x1c, 0xea, 0xf3, 0xde, 0x3d, 0x84, 0x20, 0xed, 0xe8, 0x43, 0x22, 0x85, 0xf8,
17082
-	0x37, 0xaa, 0x43, 0xd6, 0xd6, 0xf7, 0x89, 0xed, 0xad, 0x27, 0xcb, 0xa9, 0xb7, 0x0a, 0xf7, 0xbf,
17083
-	0x53, 0x79, 0x71, 0xc8, 0x95, 0x88, 0x92, 0xca, 0x0e, 0x47, 0x73, 0x23, 0xb0, 0x14, 0x45, 0x1f,
17084
-	0xc1, 0xa2, 0xe5, 0x98, 0x96, 0x41, 0xbc, 0xf5, 0x34, 0xd7, 0xb2, 0x11, 0xa7, 0x65, 0x6a, 0x7d,
17085
-	0x2d, 0xfd, 0xc5, 0xf9, 0xe6, 0x02, 0x0e, 0x84, 0x4a, 0xef, 0x41, 0x21, 0xa2, 0x36, 0x66, 0x6c,
17086
-	0x6b, 0x90, 0x39, 0xd6, 0xed, 0x31, 0x91, 0xa3, 0x13, 0x8d, 0xf7, 0x93, 0x0f, 0x13, 0xea, 0x27,
17087
-	0xb0, 0xd6, 0xd6, 0x87, 0xc4, 0x7c, 0x44, 0x1c, 0xe2, 0x5a, 0x06, 0x26, 0x1e, 0x1d, 0xbb, 0x06,
17088
-	0x61, 0x63, 0x3d, 0xb2, 0x1c, 0x33, 0x18, 0x2b, 0xfb, 0x8e, 0xd7, 0xa2, 0xd6, 0xe1, 0x95, 0x86,
17089
-	0xe5, 0x19, 0x2e, 0xf1, 0xc9, 0x57, 0x56, 0x92, 0x0a, 0x94, 0x9c, 0x27, 0x60, 0x65, 0x5e, 0xfa,
17090
-	0x17, 0xe0, 0x06, 0x73, 0xb1, 0xa9, 0xb9, 0x92, 0xa2, 0x79, 0x23, 0x62, 0x70, 0x65, 0x85, 0xfb,
17091
-	0x6f, 0xc5, 0x79, 0x28, 0x6e, 0x24, 0xdb, 0x0b, 0x78, 0x95, 0xab, 0x09, 0x08, 0xbd, 0x11, 0x31,
17092
-	0x90, 0x01, 0x37, 0x4d, 0x69, 0xf4, 0x9c, 0xfa, 0x24, 0x57, 0x1f, 0x3b, 0x8d, 0x97, 0x0c, 0x73,
17093
-	0x7b, 0x01, 0xaf, 0x05, 0xca, 0xa2, 0x9d, 0xd4, 0x00, 0x72, 0x81, 0x6e, 0xf5, 0xc7, 0x09, 0xc8,
17094
-	0x07, 0x4c, 0x0f, 0x7d, 0x1b, 0xf2, 0x8e, 0xee, 0x50, 0xcd, 0x18, 0x8d, 0x3d, 0x3e, 0xa0, 0x54,
17095
-	0xad, 0x78, 0x71, 0xbe, 0x99, 0x6b, 0xeb, 0x0e, 0xad, 0x77, 0xf7, 0x3c, 0x9c, 0x63, 0xec, 0xfa,
17096
-	0x68, 0xec, 0xa1, 0xd7, 0xa0, 0x38, 0x24, 0x43, 0xea, 0x4e, 0xb4, 0xfd, 0x89, 0x4f, 0x3c, 0xe9,
17097
-	0xb6, 0x82, 0xa0, 0xd5, 0x18, 0x09, 0x7d, 0x08, 0x8b, 0x03, 0x61, 0xd2, 0x7a, 0x8a, 0x2f, 0x9f,
17098
-	0xd7, 0xe3, 0xac, 0x9f, 0xb3, 0x1a, 0x07, 0x32, 0xea, 0xef, 0x24, 0x60, 0x2d, 0xa4, 0x92, 0x5f,
17099
-	0x1e, 0x5b, 0x2e, 0x19, 0x12, 0xc7, 0xf7, 0xd0, 0xf7, 0x20, 0x6b, 0x5b, 0x43, 0xcb, 0xf7, 0xa4,
17100
-	0xcf, 0x5f, 0x8d, 0x53, 0x1b, 0x0e, 0x0a, 0x4b, 0x30, 0xaa, 0x42, 0xd1, 0x25, 0x1e, 0x71, 0x8f,
17101
-	0xc5, 0x8a, 0x97, 0x1e, 0xbd, 0x46, 0x78, 0x46, 0x44, 0xdd, 0x82, 0x5c, 0xd7, 0xd6, 0xfd, 0x03,
17102
-	0xea, 0x0e, 0x91, 0x0a, 0x45, 0xdd, 0x35, 0x0e, 0x2d, 0x9f, 0x18, 0xfe, 0xd8, 0x0d, 0x76, 0xdf,
17103
-	0x0c, 0x0d, 0xdd, 0x84, 0x24, 0x15, 0x1d, 0xe5, 0x6b, 0xd9, 0x8b, 0xf3, 0xcd, 0x64, 0xa7, 0x87,
17104
-	0x93, 0xd4, 0x53, 0x3f, 0x80, 0xd5, 0xae, 0x3d, 0x1e, 0x58, 0x4e, 0x83, 0x78, 0x86, 0x6b, 0x8d,
17105
-	0x98, 0x76, 0xb6, 0x2a, 0x59, 0x8c, 0x0a, 0x56, 0x25, 0xfb, 0x0e, 0xb7, 0x76, 0x72, 0xba, 0xb5,
17106
-	0xd5, 0xdf, 0x4a, 0xc2, 0x6a, 0xd3, 0x19, 0x58, 0x0e, 0x89, 0x4a, 0xdf, 0x81, 0x65, 0xc2, 0x89,
17107
-	0xda, 0xb1, 0x08, 0x37, 0x52, 0xcf, 0x92, 0xa0, 0x06, 0x31, 0xa8, 0x35, 0x17, 0x17, 0xee, 0xc5,
17108
-	0x0d, 0xff, 0x05, 0xed, 0xb1, 0xd1, 0xa1, 0x09, 0x8b, 0x23, 0x3e, 0x08, 0x4f, 0x4e, 0xef, 0x9d,
17109
-	0x38, 0x5d, 0x2f, 0x8c, 0x33, 0x08, 0x12, 0x52, 0xf6, 0xeb, 0x04, 0x89, 0x3f, 0x4e, 0xc2, 0x4a,
17110
-	0x9b, 0x9a, 0x33, 0x7e, 0x28, 0x41, 0xee, 0x90, 0x7a, 0x7e, 0x24, 0x20, 0x86, 0x6d, 0xf4, 0x10,
17111
-	0x72, 0x23, 0x39, 0x7d, 0x72, 0xf6, 0x6f, 0xc7, 0x9b, 0x2c, 0x30, 0x38, 0x44, 0xa3, 0x0f, 0x20,
17112
-	0x1f, 0x6c, 0x19, 0x36, 0xda, 0x97, 0x58, 0x38, 0x53, 0x3c, 0xfa, 0x10, 0xb2, 0x62, 0x12, 0xd6,
17113
-	0xd3, 0x5c, 0xf2, 0xce, 0x4b, 0xf9, 0x1c, 0x4b, 0x21, 0xf4, 0x08, 0x72, 0xbe, 0xed, 0x69, 0x96,
17114
-	0x73, 0x40, 0xd7, 0x33, 0x5c, 0xc1, 0x66, 0x6c, 0x90, 0xa1, 0x26, 0xe9, 0xef, 0xf4, 0x5a, 0xce,
17115
-	0x01, 0xad, 0x15, 0x2e, 0xce, 0x37, 0x17, 0x65, 0x03, 0x2f, 0xfa, 0xb6, 0xc7, 0x3e, 0xd4, 0xdf,
17116
-	0x4d, 0x40, 0x21, 0x82, 0x42, 0xaf, 0x02, 0xf8, 0xee, 0xd8, 0xf3, 0x35, 0x97, 0x52, 0x9f, 0x3b,
17117
-	0xab, 0x88, 0xf3, 0x9c, 0x82, 0x29, 0xf5, 0x51, 0x05, 0x6e, 0x18, 0xc4, 0xf5, 0x35, 0xcb, 0xf3,
17118
-	0xc6, 0xc4, 0xd5, 0xbc, 0xf1, 0xfe, 0x67, 0xc4, 0xf0, 0xb9, 0xe3, 0x8a, 0x78, 0x95, 0xb1, 0x5a,
17119
-	0x9c, 0xd3, 0x13, 0x0c, 0xf4, 0x00, 0x6e, 0x46, 0xf1, 0xa3, 0xf1, 0xbe, 0x6d, 0x19, 0x1a, 0x9b,
17120
-	0xcc, 0x14, 0x17, 0xb9, 0x31, 0x15, 0xe9, 0x72, 0xde, 0x63, 0x32, 0x51, 0x7f, 0x9a, 0x00, 0x05,
17121
-	0xeb, 0x07, 0xfe, 0x2e, 0x19, 0xee, 0x13, 0xb7, 0xe7, 0xeb, 0xfe, 0xd8, 0x43, 0x37, 0x21, 0x6b,
17122
-	0x13, 0xdd, 0x24, 0x2e, 0x37, 0x2a, 0x87, 0x65, 0x0b, 0xed, 0xb1, 0x1d, 0xac, 0x1b, 0x87, 0xfa,
17123
-	0xbe, 0x65, 0x5b, 0xfe, 0x84, 0x9b, 0xb2, 0x1c, 0xbf, 0x84, 0xe7, 0x75, 0x56, 0x70, 0x44, 0x10,
17124
-	0xcf, 0xa8, 0x41, 0xeb, 0xb0, 0x38, 0x24, 0x9e, 0xa7, 0x0f, 0x08, 0xb7, 0x34, 0x8f, 0x83, 0xa6,
17125
-	0xfa, 0x01, 0x14, 0xa3, 0x72, 0xa8, 0x00, 0x8b, 0x7b, 0xed, 0xc7, 0xed, 0xce, 0xd3, 0xb6, 0xb2,
17126
-	0x80, 0x56, 0xa0, 0xb0, 0xd7, 0xc6, 0xcd, 0x6a, 0x7d, 0xbb, 0x5a, 0xdb, 0x69, 0x2a, 0x09, 0xb4,
17127
-	0x04, 0xf9, 0x69, 0x33, 0xa9, 0xfe, 0x69, 0x02, 0x80, 0xb9, 0x5b, 0x0e, 0xea, 0x7d, 0xc8, 0x78,
17128
-	0xbe, 0xee, 0x8b, 0x55, 0xb9, 0x7c, 0xff, 0x8d, 0xcb, 0xe6, 0x50, 0xda, 0xcb, 0xfe, 0x11, 0x2c,
17129
-	0x44, 0xa2, 0x16, 0x26, 0x67, 0x2c, 0x64, 0x01, 0x42, 0x37, 0x4d, 0x57, 0x1a, 0xce, 0xbf, 0xd5,
17130
-	0x0f, 0x20, 0xc3, 0xa5, 0x67, 0xcd, 0xcd, 0x41, 0xba, 0xc1, 0xbe, 0x12, 0x28, 0x0f, 0x19, 0xdc,
17131
-	0xac, 0x36, 0x3e, 0x55, 0x92, 0x48, 0x81, 0x62, 0xa3, 0xd5, 0xab, 0x77, 0xda, 0xed, 0x66, 0xbd,
17132
-	0xdf, 0x6c, 0x28, 0x29, 0xf5, 0x0e, 0x64, 0x5a, 0x43, 0xa6, 0xf9, 0x36, 0x5b, 0xf2, 0x07, 0xc4,
17133
-	0x25, 0x8e, 0x11, 0xec, 0xa4, 0x29, 0x41, 0xfd, 0x49, 0x1e, 0x32, 0xbb, 0x74, 0xec, 0xf8, 0xe8,
17134
-	0x7e, 0x24, 0x6c, 0x2d, 0xc7, 0x67, 0x08, 0x1c, 0x58, 0xe9, 0x4f, 0x46, 0x44, 0x86, 0xb5, 0x9b,
17135
-	0x90, 0x15, 0x9b, 0x43, 0x0e, 0x47, 0xb6, 0x18, 0xdd, 0xd7, 0xdd, 0x01, 0xf1, 0xe5, 0x78, 0x64,
17136
-	0x0b, 0xbd, 0xc5, 0x4e, 0x2c, 0xdd, 0xa4, 0x8e, 0x3d, 0xe1, 0x7b, 0x28, 0x27, 0x8e, 0x25, 0x4c,
17137
-	0x74, 0xb3, 0xe3, 0xd8, 0x13, 0x1c, 0x72, 0xd1, 0x36, 0x14, 0xf7, 0x2d, 0xc7, 0xd4, 0xe8, 0x48,
17138
-	0x04, 0xf9, 0xcc, 0xe5, 0x3b, 0x4e, 0x58, 0x55, 0xb3, 0x1c, 0xb3, 0x23, 0xc0, 0xb8, 0xb0, 0x3f,
17139
-	0x6d, 0xa0, 0x36, 0x2c, 0x1f, 0x53, 0x7b, 0x3c, 0x24, 0xa1, 0xae, 0x2c, 0xd7, 0xf5, 0xe6, 0xe5,
17140
-	0xba, 0x9e, 0x70, 0x7c, 0xa0, 0x6d, 0xe9, 0x38, 0xda, 0x44, 0x8f, 0x61, 0xc9, 0x1f, 0x8e, 0x0e,
17141
-	0xbc, 0x50, 0xdd, 0x22, 0x57, 0xf7, 0xad, 0x2b, 0x1c, 0xc6, 0xe0, 0x81, 0xb6, 0xa2, 0x1f, 0x69,
17142
-	0x95, 0x7e, 0x23, 0x05, 0x85, 0x88, 0xe5, 0xa8, 0x07, 0x85, 0x91, 0x4b, 0x47, 0xfa, 0x80, 0x1f,
17143
-	0x54, 0x72, 0x2e, 0xee, 0xbd, 0xd4, 0xa8, 0x2b, 0xdd, 0xa9, 0x20, 0x8e, 0x6a, 0x51, 0xcf, 0x92,
17144
-	0x50, 0x88, 0x30, 0xd1, 0xdb, 0x90, 0xc3, 0x5d, 0xdc, 0x7a, 0x52, 0xed, 0x37, 0x95, 0x85, 0xd2,
17145
-	0xed, 0xd3, 0xb3, 0xf2, 0x3a, 0xd7, 0x16, 0x55, 0xd0, 0x75, 0xad, 0x63, 0xb6, 0xf4, 0xde, 0x82,
17146
-	0xc5, 0x00, 0x9a, 0x28, 0x7d, 0xf3, 0xf4, 0xac, 0xfc, 0xca, 0x3c, 0x34, 0x82, 0xc4, 0xbd, 0xed,
17147
-	0x2a, 0x6e, 0x36, 0x94, 0x64, 0x3c, 0x12, 0xf7, 0x0e, 0x75, 0x97, 0x98, 0xe8, 0x5b, 0x90, 0x95,
17148
-	0xc0, 0x54, 0xa9, 0x74, 0x7a, 0x56, 0xbe, 0x39, 0x0f, 0x9c, 0xe2, 0x70, 0x6f, 0xa7, 0xfa, 0xa4,
17149
-	0xa9, 0xa4, 0xe3, 0x71, 0xb8, 0x67, 0xeb, 0xc7, 0x04, 0xbd, 0x01, 0x19, 0x01, 0xcb, 0x94, 0x6e,
17150
-	0x9d, 0x9e, 0x95, 0xbf, 0xf1, 0x82, 0x3a, 0x86, 0x2a, 0xad, 0xff, 0xf6, 0x1f, 0x6c, 0x2c, 0xfc,
17151
-	0xe5, 0x1f, 0x6e, 0x28, 0xf3, 0xec, 0xd2, 0x7f, 0x27, 0x60, 0x69, 0x66, 0xca, 0x91, 0x0a, 0x59,
17152
-	0x87, 0x1a, 0x74, 0x24, 0xce, 0xaf, 0x5c, 0x0d, 0x2e, 0xce, 0x37, 0xb3, 0x6d, 0x5a, 0xa7, 0xa3,
17153
-	0x09, 0x96, 0x1c, 0xf4, 0x78, 0xee, 0x04, 0x7e, 0xf0, 0x92, 0xeb, 0x29, 0xf6, 0x0c, 0xfe, 0x18,
17154
-	0x96, 0x4c, 0xd7, 0x3a, 0x26, 0xae, 0x66, 0x50, 0xe7, 0xc0, 0x1a, 0xc8, 0xb3, 0xa9, 0x14, 0x9b,
17155
-	0x26, 0x72, 0x20, 0x2e, 0x0a, 0x81, 0x3a, 0xc7, 0x7f, 0x8d, 0xd3, 0xb7, 0xf4, 0x04, 0x8a, 0xd1,
17156
-	0x15, 0xca, 0x8e, 0x13, 0xcf, 0xfa, 0x15, 0x22, 0xf3, 0x41, 0x9e, 0x3d, 0xe2, 0x3c, 0xa3, 0x88,
17157
-	0x6c, 0xf0, 0x4d, 0x48, 0x0f, 0xa9, 0x29, 0xf4, 0x2c, 0xd5, 0x6e, 0xb0, 0x24, 0xe0, 0x9f, 0xce,
17158
-	0x37, 0x0b, 0xd4, 0xab, 0x6c, 0x59, 0x36, 0xd9, 0xa5, 0x26, 0xc1, 0x1c, 0xa0, 0x1e, 0x43, 0x9a,
17159
-	0x85, 0x0a, 0xf4, 0x4d, 0x48, 0xd7, 0x5a, 0xed, 0x86, 0xb2, 0x50, 0x5a, 0x3d, 0x3d, 0x2b, 0x2f,
17160
-	0x71, 0x97, 0x30, 0x06, 0x5b, 0xbb, 0x68, 0x13, 0xb2, 0x4f, 0x3a, 0x3b, 0x7b, 0xbb, 0x6c, 0x79,
17161
-	0xdd, 0x38, 0x3d, 0x2b, 0xaf, 0x84, 0x6c, 0xe1, 0x34, 0xf4, 0x2a, 0x64, 0xfa, 0xbb, 0xdd, 0xad,
17162
-	0x9e, 0x92, 0x2c, 0xa1, 0xd3, 0xb3, 0xf2, 0x72, 0xc8, 0xe7, 0x36, 0x97, 0x56, 0xe5, 0xac, 0xe6,
17163
-	0x43, 0xba, 0xfa, 0xb3, 0x24, 0x2c, 0x61, 0x56, 0xf1, 0xb9, 0x7e, 0x97, 0xda, 0x96, 0x31, 0x41,
17164
-	0x5d, 0xc8, 0x1b, 0xd4, 0x31, 0xad, 0xc8, 0x9e, 0xba, 0x7f, 0xc9, 0xa9, 0x3f, 0x95, 0x0a, 0x5a,
17165
-	0xf5, 0x40, 0x12, 0x4f, 0x95, 0xa0, 0x77, 0x21, 0x63, 0x12, 0x5b, 0x9f, 0xc8, 0xf4, 0xe3, 0x56,
17166
-	0x45, 0xd4, 0x94, 0x95, 0xa0, 0xa6, 0xac, 0x34, 0x64, 0x4d, 0x89, 0x05, 0x8e, 0xa7, 0xd9, 0xfa,
17167
-	0x33, 0x4d, 0xf7, 0x7d, 0x32, 0x1c, 0xf9, 0x22, 0xf7, 0x48, 0xe3, 0xc2, 0x50, 0x7f, 0x56, 0x95,
17168
-	0x24, 0x74, 0x0f, 0xb2, 0x27, 0x96, 0x63, 0xd2, 0x13, 0x99, 0x5e, 0x5c, 0xa1, 0x54, 0x02, 0xd5,
17169
-	0x53, 0x76, 0xea, 0xce, 0x99, 0xc9, 0xfc, 0xdd, 0xee, 0xb4, 0x9b, 0x81, 0xbf, 0x25, 0xbf, 0xe3,
17170
-	0xb4, 0xa9, 0xc3, 0xf6, 0x0a, 0x74, 0xda, 0xda, 0x56, 0xb5, 0xb5, 0xb3, 0x87, 0x99, 0xcf, 0xd7,
17171
-	0x4e, 0xcf, 0xca, 0x4a, 0x08, 0xd9, 0xd2, 0x2d, 0x9b, 0xe5, 0xbb, 0xb7, 0x20, 0x55, 0x6d, 0x7f,
17172
-	0xaa, 0x24, 0x4b, 0xca, 0xe9, 0x59, 0xb9, 0x18, 0xb2, 0xab, 0xce, 0x64, 0xba, 0x8d, 0xe6, 0xfb,
17173
-	0x55, 0xff, 0x36, 0x05, 0xc5, 0xbd, 0x91, 0xa9, 0xfb, 0x44, 0xac, 0x49, 0x54, 0x86, 0xc2, 0x48,
17174
-	0x77, 0x75, 0xdb, 0x26, 0xb6, 0xe5, 0x0d, 0x65, 0xb5, 0x1c, 0x25, 0xa1, 0xf7, 0x5e, 0xd6, 0x8d,
17175
-	0xb5, 0x1c, 0x5b, 0x67, 0x3f, 0xfe, 0x97, 0xcd, 0x44, 0xe0, 0xd0, 0x3d, 0x58, 0x3e, 0x10, 0xd6,
17176
-	0x6a, 0xba, 0xc1, 0x27, 0x36, 0xc5, 0x27, 0xb6, 0x12, 0x37, 0xb1, 0x51, 0xb3, 0x2a, 0x72, 0x90,
17177
-	0x55, 0x2e, 0x85, 0x97, 0x0e, 0xa2, 0x4d, 0xf4, 0x00, 0x16, 0x87, 0xd4, 0xb1, 0x7c, 0xea, 0x5e,
17178
-	0x3f, 0x0b, 0x01, 0x12, 0xbd, 0x0d, 0xab, 0x6c, 0x72, 0x03, 0x7b, 0x38, 0x9b, 0x9f, 0x58, 0x49,
17179
-	0xbc, 0x32, 0xd4, 0x9f, 0xc9, 0x0e, 0x31, 0x23, 0xa3, 0x1a, 0x64, 0xa8, 0xcb, 0x52, 0xa2, 0x2c,
17180
-	0x37, 0xf7, 0x9d, 0x6b, 0xcd, 0x15, 0x8d, 0x0e, 0x93, 0xc1, 0x42, 0x54, 0xfd, 0x3e, 0x2c, 0xcd,
17181
-	0x0c, 0x82, 0x65, 0x02, 0xdd, 0xea, 0x5e, 0xaf, 0xa9, 0x2c, 0xa0, 0x22, 0xe4, 0xea, 0x9d, 0x76,
17182
-	0xbf, 0xd5, 0xde, 0x63, 0xa9, 0x4c, 0x11, 0x72, 0xb8, 0xb3, 0xb3, 0x53, 0xab, 0xd6, 0x1f, 0x2b,
17183
-	0x49, 0xb5, 0x02, 0x85, 0x88, 0x36, 0xb4, 0x0c, 0xd0, 0xeb, 0x77, 0xba, 0xda, 0x56, 0x0b, 0xf7,
17184
-	0xfa, 0x22, 0x11, 0xea, 0xf5, 0xab, 0xb8, 0x2f, 0x09, 0x09, 0xf5, 0x3f, 0x92, 0xc1, 0x8c, 0xca,
17185
-	0xdc, 0xa7, 0x36, 0x9b, 0xfb, 0x5c, 0x61, 0xbc, 0xcc, 0x7e, 0xa6, 0x8d, 0x30, 0x07, 0x7a, 0x0f,
17186
-	0x80, 0x2f, 0x1c, 0x62, 0x6a, 0xba, 0x2f, 0x27, 0xbe, 0xf4, 0x82, 0x93, 0xfb, 0xc1, 0xa5, 0x0d,
17187
-	0xce, 0x4b, 0x74, 0xd5, 0x47, 0x1f, 0x42, 0xd1, 0xa0, 0xc3, 0x91, 0x4d, 0xa4, 0x70, 0xea, 0x5a,
17188
-	0xe1, 0x42, 0x88, 0xaf, 0xfa, 0xd1, 0xec, 0x2b, 0x3d, 0x9b, 0x1f, 0xfe, 0x66, 0x22, 0xf0, 0x4c,
17189
-	0x4c, 0xc2, 0x55, 0x84, 0xdc, 0x5e, 0xb7, 0x51, 0xed, 0xb7, 0xda, 0x8f, 0x94, 0x04, 0x02, 0xc8,
17190
-	0x72, 0x57, 0x37, 0x94, 0x24, 0x4b, 0x14, 0xeb, 0x9d, 0xdd, 0xee, 0x4e, 0x93, 0xa7, 0x5c, 0x68,
17191
-	0x0d, 0x94, 0xc0, 0xd9, 0x1a, 0x77, 0x64, 0xb3, 0xa1, 0xa4, 0xd1, 0x0d, 0x58, 0x09, 0xa9, 0x52,
17192
-	0x32, 0x83, 0x6e, 0x02, 0x0a, 0x89, 0x53, 0x15, 0x59, 0xf5, 0xd7, 0x60, 0xa5, 0x4e, 0x1d, 0x5f,
17193
-	0xb7, 0x9c, 0x30, 0x89, 0xbe, 0xcf, 0x06, 0x2d, 0x49, 0x9a, 0x25, 0x2f, 0x3b, 0x6a, 0x2b, 0x17,
17194
-	0xe7, 0x9b, 0x85, 0x10, 0xda, 0x6a, 0xb0, 0x91, 0x06, 0x0d, 0x93, 0xed, 0xdf, 0x91, 0x65, 0x72,
17195
-	0xe7, 0x66, 0x6a, 0x8b, 0x17, 0xe7, 0x9b, 0xa9, 0x6e, 0xab, 0x81, 0x19, 0x0d, 0x7d, 0x13, 0xf2,
17196
-	0xe4, 0x99, 0xe5, 0x6b, 0x06, 0x8b, 0xe1, 0xcc, 0x81, 0x19, 0x9c, 0x63, 0x84, 0x3a, 0x0b, 0xd9,
17197
-	0x35, 0x80, 0x2e, 0x75, 0x7d, 0xd9, 0xf3, 0x77, 0x21, 0x33, 0xa2, 0x2e, 0x2f, 0xcf, 0x2f, 0xbd,
17198
-	0x34, 0x62, 0x70, 0xb1, 0x50, 0xb1, 0x00, 0xab, 0x7f, 0x95, 0x04, 0xe8, 0xeb, 0xde, 0x91, 0x54,
17199
-	0xf2, 0x10, 0xf2, 0xe1, 0x05, 0x9c, 0xac, 0xf3, 0xaf, 0x9c, 0xed, 0x10, 0x8c, 0x1e, 0x04, 0x8b,
17200
-	0x4d, 0x94, 0x07, 0xb1, 0x75, 0x5a, 0xd0, 0x51, 0x5c, 0x86, 0x3d, 0x5b, 0x03, 0xb0, 0x23, 0x91,
17201
-	0xb8, 0xae, 0x9c, 0x79, 0xf6, 0x89, 0xea, 0xfc, 0x58, 0x10, 0x4e, 0x93, 0x09, 0x66, 0xec, 0xcd,
17202
-	0xc6, 0xdc, 0x8c, 0x6c, 0x2f, 0xe0, 0xa9, 0x1c, 0xfa, 0x18, 0x0a, 0x6c, 0xdc, 0x9a, 0xc7, 0x79,
17203
-	0x32, 0xb7, 0xbc, 0xd4, 0x55, 0x42, 0x03, 0x86, 0x51, 0xf8, 0x5d, 0x53, 0x60, 0xd9, 0x1d, 0x3b,
17204
-	0x6c, 0xd8, 0x52, 0x87, 0xfa, 0x27, 0x49, 0x78, 0xa5, 0x4d, 0xfc, 0x13, 0xea, 0x1e, 0x55, 0x7d,
17205
-	0x5f, 0x37, 0x0e, 0x87, 0xc4, 0x91, 0x4e, 0x8e, 0x64, 0xd6, 0x89, 0x99, 0xcc, 0x7a, 0x1d, 0x16,
17206
-	0x75, 0xdb, 0xd2, 0x3d, 0x22, 0xd2, 0x91, 0x3c, 0x0e, 0x9a, 0x2c, 0xff, 0x67, 0xd5, 0x04, 0xf1,
17207
-	0x3c, 0x22, 0x0a, 0xfc, 0x3c, 0x9e, 0x12, 0xd0, 0x8f, 0xe0, 0xa6, 0x4c, 0x3c, 0xf4, 0xb0, 0x2b,
17208
-	0x96, 0xd9, 0x06, 0x37, 0x85, 0xcd, 0xd8, 0xf2, 0x26, 0xde, 0x38, 0x99, 0x99, 0x4c, 0xc9, 0x9d,
17209
-	0x91, 0x2f, 0xf3, 0x9c, 0x35, 0x33, 0x86, 0x55, 0x7a, 0x04, 0xb7, 0x2e, 0x15, 0xf9, 0x4a, 0x17,
17210
-	0x08, 0xff, 0x90, 0x04, 0x68, 0x75, 0xab, 0xbb, 0xd2, 0x49, 0x0d, 0xc8, 0x1e, 0xe8, 0x43, 0xcb,
17211
-	0x9e, 0x5c, 0x15, 0xa7, 0xa6, 0xf8, 0x4a, 0x55, 0xb8, 0x63, 0x8b, 0xcb, 0x60, 0x29, 0xcb, 0x8b,
17212
-	0x9b, 0xf1, 0xbe, 0x43, 0xfc, 0xb0, 0xb8, 0xe1, 0x2d, 0x66, 0x86, 0xab, 0x3b, 0xe1, 0x02, 0x13,
17213
-	0x0d, 0x36, 0x01, 0x03, 0xdd, 0x27, 0x27, 0xfa, 0x24, 0x08, 0x2e, 0xb2, 0x89, 0xb6, 0xf9, 0x35,
17214
-	0x1d, 0x71, 0x8f, 0x89, 0xb9, 0x9e, 0xe1, 0x4e, 0xbd, 0xce, 0x1e, 0x2c, 0xe1, 0xc2, 0x77, 0xa1,
17215
-	0x74, 0xe9, 0x03, 0x9e, 0xd8, 0x4c, 0x59, 0x5f, 0xc9, 0x47, 0x77, 0x61, 0x69, 0x66, 0x9c, 0x2f,
17216
-	0x54, 0x95, 0xad, 0xee, 0x93, 0xef, 0x2a, 0x69, 0xf9, 0xf5, 0x7d, 0x25, 0xab, 0xfe, 0x51, 0x4a,
17217
-	0x84, 0x03, 0xe9, 0xd5, 0xf8, 0xeb, 0xe9, 0x1c, 0xdf, 0xc4, 0x06, 0xb5, 0xe5, 0x36, 0x7d, 0xf3,
17218
-	0xea, 0x28, 0xc1, 0xaa, 0x14, 0x0e, 0xc7, 0xa1, 0x20, 0xda, 0x84, 0x82, 0x58, 0xc5, 0x1a, 0xdb,
17219
-	0x16, 0xdc, 0xad, 0x4b, 0x18, 0x04, 0x89, 0x49, 0xa2, 0x3b, 0xb0, 0xcc, 0x6f, 0x21, 0xbc, 0x43,
17220
-	0x62, 0x0a, 0x4c, 0x9a, 0x63, 0x96, 0x42, 0x2a, 0x87, 0xed, 0x42, 0x51, 0x12, 0x34, 0x9e, 0xa1,
17221
-	0x66, 0xb8, 0x41, 0x6f, 0x5f, 0x67, 0x90, 0x10, 0xe1, 0x89, 0x6b, 0x61, 0x34, 0x6d, 0xa8, 0x0d,
17222
-	0xc8, 0x05, 0xc6, 0xa2, 0x75, 0x48, 0xf5, 0xeb, 0x5d, 0x65, 0xa1, 0xb4, 0x72, 0x7a, 0x56, 0x2e,
17223
-	0x04, 0xe4, 0x7e, 0xbd, 0xcb, 0x38, 0x7b, 0x8d, 0xae, 0x92, 0x98, 0xe5, 0xec, 0x35, 0xba, 0xa5,
17224
-	0x34, 0xcb, 0x94, 0xd4, 0x03, 0x28, 0x44, 0x7a, 0x40, 0xaf, 0xc3, 0x62, 0xab, 0xfd, 0x08, 0x37,
17225
-	0x7b, 0x3d, 0x65, 0xa1, 0x74, 0xf3, 0xf4, 0xac, 0x8c, 0x22, 0xdc, 0x96, 0x33, 0x60, 0xf3, 0x83,
17226
-	0x5e, 0x85, 0xf4, 0x76, 0x87, 0x9d, 0xc0, 0x22, 0x25, 0x8e, 0x20, 0xb6, 0xa9, 0xe7, 0x97, 0x6e,
17227
-	0xc8, 0x14, 0x2c, 0xaa, 0x58, 0xfd, 0xbd, 0x04, 0x64, 0xc5, 0x66, 0x8a, 0x9d, 0xa8, 0x2a, 0x2c,
17228
-	0x06, 0xf5, 0xaa, 0x28, 0x57, 0xde, 0xbc, 0xbc, 0xb4, 0xa8, 0xc8, 0x4a, 0x40, 0x2c, 0xbf, 0x40,
17229
-	0xae, 0xf4, 0x3e, 0x14, 0xa3, 0x8c, 0xaf, 0xb4, 0xf8, 0x7e, 0x04, 0x05, 0xb6, 0xbe, 0x83, 0x12,
17230
-	0xe3, 0x3e, 0x64, 0x45, 0x40, 0x08, 0x4f, 0x84, 0xcb, 0xeb, 0x1c, 0x89, 0x44, 0x0f, 0x61, 0x51,
17231
-	0xd4, 0x46, 0xc1, 0x35, 0xe5, 0xc6, 0xd5, 0xbb, 0x08, 0x07, 0x70, 0xf5, 0x63, 0x48, 0x77, 0x09,
17232
-	0x71, 0x99, 0xef, 0x1d, 0x6a, 0x92, 0xe9, 0x21, 0x2a, 0xcb, 0x3a, 0x93, 0xb4, 0x1a, 0xac, 0xac,
17233
-	0x33, 0x49, 0xcb, 0x0c, 0x2f, 0x62, 0x92, 0x91, 0x8b, 0x98, 0x3e, 0x14, 0x9f, 0x12, 0x6b, 0x70,
17234
-	0xe8, 0x13, 0x93, 0x2b, 0x7a, 0x07, 0xd2, 0x23, 0x12, 0x1a, 0xbf, 0x1e, 0xbb, 0xc0, 0x08, 0x71,
17235
-	0x31, 0x47, 0xb1, 0x38, 0x72, 0xc2, 0xa5, 0xe5, 0xdd, 0xba, 0x6c, 0xa9, 0x7f, 0x9f, 0x84, 0xe5,
17236
-	0x96, 0xe7, 0x8d, 0x75, 0xc7, 0x08, 0xf2, 0xab, 0x8f, 0x66, 0xf3, 0xab, 0xd8, 0x47, 0x88, 0x59,
17237
-	0x91, 0xd9, 0xfb, 0x25, 0x79, 0xc6, 0x25, 0xc3, 0x33, 0x4e, 0xfd, 0xf7, 0x44, 0x70, 0x89, 0x74,
17238
-	0x27, 0xb2, 0xdd, 0x4b, 0xeb, 0xa7, 0x67, 0xe5, 0xb5, 0xa8, 0x26, 0xb2, 0xe7, 0x1c, 0x39, 0xf4,
17239
-	0xc4, 0x41, 0xaf, 0x41, 0x06, 0x37, 0xdb, 0xcd, 0xa7, 0x4a, 0x42, 0x2c, 0xcf, 0x19, 0x10, 0x26,
17240
-	0x0e, 0x39, 0x61, 0x9a, 0xba, 0xcd, 0x76, 0x83, 0xe5, 0x43, 0xc9, 0x18, 0x4d, 0x5d, 0xe2, 0x98,
17241
-	0x96, 0x33, 0x40, 0xaf, 0x43, 0xb6, 0xd5, 0xeb, 0xed, 0xf1, 0x32, 0xff, 0x95, 0xd3, 0xb3, 0xf2,
17242
-	0x8d, 0x19, 0x14, 0xbf, 0x40, 0x34, 0x19, 0x88, 0x15, 0x23, 0x2c, 0x53, 0x8a, 0x01, 0xb1, 0x2c,
17243
-	0x57, 0x80, 0x70, 0xa7, 0x5f, 0xed, 0xb3, 0x0a, 0xff, 0x45, 0x10, 0xa6, 0xec, 0xaf, 0xdc, 0x6e,
17244
-	0xff, 0x9c, 0x04, 0xa5, 0x6a, 0x18, 0x64, 0xe4, 0x33, 0xbe, 0xac, 0xff, 0xfa, 0x90, 0x1b, 0xb1,
17245
-	0x2f, 0x8b, 0x04, 0xb9, 0xcc, 0xc3, 0xd8, 0x67, 0xb4, 0x39, 0xb9, 0x0a, 0xa6, 0x36, 0xa9, 0x9a,
17246
-	0x43, 0xcb, 0xf3, 0x2c, 0xea, 0x08, 0x1a, 0x0e, 0x35, 0x95, 0xfe, 0x33, 0x01, 0x37, 0x62, 0x10,
17247
-	0xe8, 0x2e, 0xa4, 0x5d, 0x6a, 0x07, 0x73, 0x78, 0xfb, 0xb2, 0xfb, 0x41, 0x26, 0x8a, 0x39, 0x12,
17248
-	0x6d, 0x00, 0xe8, 0x63, 0x9f, 0xea, 0xbc, 0x7f, 0x3e, 0x7b, 0x39, 0x1c, 0xa1, 0xa0, 0xa7, 0x90,
17249
-	0xf5, 0x88, 0xe1, 0x92, 0x20, 0xe3, 0xfd, 0xf8, 0xff, 0x6a, 0x7d, 0xa5, 0xc7, 0xd5, 0x60, 0xa9,
17250
-	0xae, 0x54, 0x81, 0xac, 0xa0, 0xb0, 0x65, 0x6f, 0xea, 0xbe, 0x2e, 0x6f, 0x8f, 0xf9, 0x37, 0x5b,
17251
-	0x4d, 0xba, 0x3d, 0x08, 0x56, 0x93, 0x6e, 0x0f, 0xd4, 0xbf, 0x49, 0x02, 0x34, 0x9f, 0xf9, 0xc4,
17252
-	0x75, 0x74, 0xbb, 0x5e, 0x45, 0xcd, 0x48, 0xf4, 0x17, 0xa3, 0xfd, 0x76, 0xec, 0x95, 0x78, 0x28,
17253
-	0x51, 0xa9, 0x57, 0x63, 0xe2, 0xff, 0x2d, 0x48, 0x8d, 0x5d, 0xf9, 0x32, 0x2a, 0xb2, 0xd5, 0x3d,
17254
-	0xbc, 0x83, 0x19, 0x0d, 0x35, 0xa7, 0x61, 0x2b, 0x75, 0xf9, 0xfb, 0x67, 0xa4, 0x83, 0xd8, 0xd0,
17255
-	0xc5, 0x76, 0xbe, 0xa1, 0x6b, 0x06, 0x91, 0x27, 0x47, 0x51, 0xec, 0xfc, 0x7a, 0xb5, 0x4e, 0x5c,
17256
-	0x1f, 0x67, 0x0d, 0x9d, 0xfd, 0xff, 0x5a, 0xf1, 0xed, 0x1d, 0x80, 0xe9, 0xd0, 0xd0, 0x06, 0x64,
17257
-	0xea, 0x5b, 0xbd, 0xde, 0x8e, 0xb2, 0x20, 0x02, 0xf8, 0x94, 0xc5, 0xc9, 0xea, 0x5f, 0x24, 0x21,
17258
-	0x57, 0xaf, 0xca, 0x63, 0xb5, 0x0e, 0x0a, 0x8f, 0x4a, 0xfc, 0xce, 0x9d, 0x3c, 0x1b, 0x59, 0xee,
17259
-	0x44, 0x06, 0x96, 0x2b, 0x4a, 0xcf, 0x65, 0x26, 0xc2, 0xac, 0x6e, 0x72, 0x01, 0x84, 0xa1, 0x48,
17260
-	0xa4, 0x13, 0x34, 0x43, 0x0f, 0x62, 0xfc, 0xc6, 0xd5, 0xce, 0x12, 0x45, 0xc4, 0xb4, 0xed, 0xe1,
17261
-	0x42, 0xa0, 0xa4, 0xae, 0x7b, 0xe8, 0x3d, 0x58, 0xf1, 0xac, 0x81, 0x63, 0x39, 0x03, 0x2d, 0x70,
17262
-	0x1e, 0x7f, 0x00, 0xa8, 0xad, 0x5e, 0x9c, 0x6f, 0x2e, 0xf5, 0x04, 0x4b, 0xfa, 0x70, 0x49, 0x22,
17263
-	0xeb, 0xdc, 0x95, 0xe8, 0xfb, 0xb0, 0x1c, 0x11, 0x65, 0x5e, 0x14, 0x6e, 0x57, 0x2e, 0xce, 0x37,
17264
-	0x8b, 0xa1, 0xe4, 0x63, 0x32, 0xc1, 0xc5, 0x50, 0xf0, 0x31, 0xe1, 0xb7, 0x24, 0x07, 0xd4, 0x35,
17265
-	0x88, 0xe6, 0xf2, 0x3d, 0xcd, 0x4f, 0xf0, 0x34, 0x2e, 0x70, 0x9a, 0xd8, 0xe6, 0xea, 0x13, 0xb8,
17266
-	0xd1, 0x71, 0x8d, 0x43, 0xe2, 0xf9, 0xc2, 0x15, 0xd2, 0x8b, 0x1f, 0xc3, 0x6d, 0x5f, 0xf7, 0x8e,
17267
-	0xb4, 0x43, 0xcb, 0xf3, 0xa9, 0x3b, 0xd1, 0x5c, 0xe2, 0x13, 0x87, 0xf1, 0x35, 0xfe, 0x6a, 0x28,
17268
-	0xaf, 0xb1, 0x6e, 0x31, 0xcc, 0xb6, 0x80, 0xe0, 0x00, 0xb1, 0xc3, 0x00, 0x6a, 0x0b, 0x8a, 0xac,
17269
-	0x98, 0x68, 0x90, 0x03, 0x7d, 0x6c, 0xfb, 0x6c, 0xf4, 0x60, 0xd3, 0x81, 0xf6, 0xd2, 0xc7, 0x54,
17270
-	0xde, 0xa6, 0x03, 0xf1, 0xa9, 0xfe, 0x10, 0x94, 0x86, 0xe5, 0x8d, 0x74, 0xdf, 0x38, 0x0c, 0xee,
17271
-	0xe7, 0x50, 0x03, 0x94, 0x43, 0xa2, 0xbb, 0xfe, 0x3e, 0xd1, 0x7d, 0x6d, 0x44, 0x5c, 0x8b, 0x9a,
17272
-	0xd7, 0xcf, 0xf2, 0x4a, 0x28, 0xd2, 0xe5, 0x12, 0xea, 0x7f, 0x25, 0x00, 0xb0, 0x7e, 0x10, 0x64,
17273
-	0x64, 0xdf, 0x81, 0x55, 0xcf, 0xd1, 0x47, 0xde, 0x21, 0xf5, 0x35, 0xcb, 0xf1, 0x89, 0x7b, 0xac,
17274
-	0xdb, 0xf2, 0x9a, 0x45, 0x09, 0x18, 0x2d, 0x49, 0x47, 0xef, 0x00, 0x3a, 0x22, 0x64, 0xa4, 0x51,
17275
-	0xdb, 0xd4, 0x02, 0xa6, 0x78, 0xd3, 0x4c, 0x63, 0x85, 0x71, 0x3a, 0xb6, 0xd9, 0x0b, 0xe8, 0xa8,
17276
-	0x06, 0x1b, 0x6c, 0xf8, 0xc4, 0xf1, 0x5d, 0x8b, 0x78, 0xda, 0x01, 0x75, 0x35, 0xcf, 0xa6, 0x27,
17277
-	0xda, 0x01, 0xb5, 0x6d, 0x7a, 0x42, 0xdc, 0xe0, 0x06, 0xab, 0x64, 0xd3, 0x41, 0x53, 0x80, 0xb6,
17278
-	0xa8, 0xdb, 0xb3, 0xe9, 0xc9, 0x56, 0x80, 0x60, 0x69, 0xdb, 0x74, 0xcc, 0xbe, 0x65, 0x1c, 0x05,
17279
-	0x69, 0x5b, 0x48, 0xed, 0x5b, 0xc6, 0x11, 0x7a, 0x1d, 0x96, 0x88, 0x4d, 0xf8, 0x45, 0x86, 0x40,
17280
-	0x65, 0x38, 0xaa, 0x18, 0x10, 0x19, 0x48, 0xfd, 0x04, 0x94, 0xa6, 0x63, 0xb8, 0x93, 0x51, 0x64,
17281
-	0xce, 0xdf, 0x01, 0xc4, 0x82, 0xa4, 0x66, 0x53, 0xe3, 0x48, 0x1b, 0xea, 0x8e, 0x3e, 0x60, 0x76,
17282
-	0x89, 0xa7, 0x26, 0x85, 0x71, 0x76, 0xa8, 0x71, 0xb4, 0x2b, 0xe9, 0xea, 0x7b, 0x00, 0xbd, 0x91,
17283
-	0x4b, 0x74, 0xb3, 0xc3, 0xb2, 0x09, 0xe6, 0x3a, 0xde, 0xd2, 0x4c, 0xf9, 0x54, 0x47, 0x5d, 0xb9,
17284
-	0xd5, 0x15, 0xc1, 0x68, 0x84, 0x74, 0xf5, 0x17, 0xe1, 0x46, 0xd7, 0xd6, 0x0d, 0xfe, 0x6c, 0xdd,
17285
-	0x0d, 0xdf, 0x4e, 0xd0, 0x43, 0xc8, 0x0a, 0xa8, 0x9c, 0xc9, 0xd8, 0xed, 0x36, 0xed, 0x73, 0x7b,
17286
-	0x01, 0x4b, 0x7c, 0xad, 0x08, 0x30, 0xd5, 0xa3, 0xfe, 0x59, 0x02, 0xf2, 0xa1, 0x7e, 0x54, 0x06,
17287
-	0x56, 0xca, 0xb3, 0xe5, 0x6d, 0x39, 0xb2, 0xf6, 0xce, 0xe3, 0x28, 0x09, 0xb5, 0xa0, 0x30, 0x0a,
17288
-	0xa5, 0xaf, 0xcc, 0xe7, 0x62, 0xac, 0xc6, 0x51, 0x59, 0xf4, 0x3e, 0xe4, 0x83, 0xb7, 0xd1, 0x20,
17289
-	0xc2, 0x5e, 0xfd, 0x94, 0x3a, 0x85, 0xab, 0x1f, 0x01, 0xfc, 0x80, 0x5a, 0x4e, 0x9f, 0x1e, 0x11,
17290
-	0x87, 0xbf, 0xf5, 0xb1, 0x9a, 0x90, 0x04, 0x5e, 0x94, 0x2d, 0x5e, 0x90, 0x8b, 0x29, 0x08, 0x9f,
17291
-	0xbc, 0x44, 0x53, 0xfd, 0xeb, 0x24, 0x64, 0x31, 0xa5, 0x7e, 0xbd, 0x8a, 0xca, 0x90, 0x95, 0x71,
17292
-	0x82, 0x9f, 0x3f, 0xb5, 0xfc, 0xc5, 0xf9, 0x66, 0x46, 0x04, 0x88, 0x8c, 0xc1, 0x23, 0x43, 0x24,
17293
-	0x82, 0x27, 0x2f, 0x8b, 0xe0, 0xe8, 0x2e, 0x14, 0x25, 0x48, 0x3b, 0xd4, 0xbd, 0x43, 0x51, 0xa0,
17294
-	0xd5, 0x96, 0x2f, 0xce, 0x37, 0x41, 0x20, 0xb7, 0x75, 0xef, 0x10, 0x83, 0x40, 0xb3, 0x6f, 0xd4,
17295
-	0x84, 0xc2, 0x67, 0xd4, 0x72, 0x34, 0x9f, 0x0f, 0x42, 0x5e, 0xf9, 0xc5, 0xce, 0xe3, 0x74, 0xa8,
17296
-	0xf2, 0xe1, 0x1b, 0x3e, 0x9b, 0x0e, 0xbe, 0x09, 0x4b, 0x2e, 0xa5, 0xbe, 0x08, 0x5b, 0x16, 0x75,
17297
-	0xe4, 0x6d, 0x42, 0x39, 0xf6, 0x92, 0x99, 0x52, 0x1f, 0x4b, 0x1c, 0x2e, 0xba, 0x91, 0x16, 0xba,
17298
-	0x0b, 0x6b, 0xb6, 0xee, 0xf9, 0x1a, 0x8f, 0x77, 0xe6, 0x54, 0x5b, 0x96, 0x6f, 0x35, 0xc4, 0x78,
17299
-	0x5b, 0x9c, 0x15, 0x48, 0xa8, 0xff, 0x98, 0x80, 0x02, 0x1b, 0x8c, 0x75, 0x60, 0x19, 0x2c, 0xc9,
17300
-	0xfb, 0xea, 0xb9, 0xc7, 0x2d, 0x48, 0x19, 0x9e, 0x2b, 0x9d, 0xca, 0x0f, 0xdf, 0x7a, 0x0f, 0x63,
17301
-	0x46, 0x43, 0x9f, 0x40, 0x56, 0xde, 0x6a, 0x88, 0xb4, 0x43, 0xbd, 0x3e, 0x1d, 0x95, 0xbe, 0x91,
17302
-	0x72, 0x7c, 0x2d, 0x4f, 0xad, 0x13, 0x87, 0x00, 0x8e, 0x92, 0xd0, 0x4d, 0x48, 0x1a, 0xc2, 0x5d,
17303
-	0xf2, 0x97, 0x15, 0xf5, 0x36, 0x4e, 0x1a, 0x8e, 0xfa, 0x77, 0x09, 0x58, 0x9a, 0x6e, 0x78, 0xb6,
17304
-	0x02, 0x6e, 0x43, 0xde, 0x1b, 0xef, 0x7b, 0x13, 0xcf, 0x27, 0xc3, 0xe0, 0x1d, 0x33, 0x24, 0xa0,
17305
-	0x16, 0xe4, 0x75, 0x7b, 0x40, 0x5d, 0xcb, 0x3f, 0x1c, 0xca, 0x4a, 0x34, 0x3e, 0x55, 0x88, 0xea,
17306
-	0xac, 0x54, 0x03, 0x11, 0x3c, 0x95, 0x0e, 0xce, 0x7d, 0xf1, 0xd8, 0xcd, 0xcf, 0xfd, 0xd7, 0xa0,
17307
-	0x68, 0xeb, 0x43, 0x7e, 0xcd, 0xe3, 0x5b, 0x43, 0x31, 0x8e, 0x34, 0x2e, 0x48, 0x5a, 0xdf, 0x1a,
17308
-	0x12, 0x55, 0x85, 0x7c, 0xa8, 0x0c, 0xad, 0x40, 0xa1, 0xda, 0xec, 0x69, 0xf7, 0xee, 0x3f, 0xd4,
17309
-	0x1e, 0xd5, 0x77, 0x95, 0x05, 0x99, 0x9b, 0xfe, 0x79, 0x02, 0x96, 0x64, 0x38, 0x92, 0xf9, 0xfe,
17310
-	0xeb, 0xb0, 0xe8, 0xea, 0x07, 0x7e, 0x50, 0x91, 0xa4, 0xc5, 0xaa, 0x66, 0x11, 0x9e, 0x55, 0x24,
17311
-	0x8c, 0x15, 0x5f, 0x91, 0x44, 0x5e, 0xd6, 0x53, 0x57, 0xbe, 0xac, 0xa7, 0x7f, 0x2e, 0x2f, 0xeb,
17312
-	0xea, 0xaf, 0x03, 0x6c, 0x59, 0x36, 0xe9, 0x8b, 0xbb, 0xa6, 0xb8, 0xfa, 0x92, 0xe5, 0x70, 0xf2,
17313
-	0xc6, 0x31, 0xc8, 0xe1, 0x5a, 0x0d, 0xcc, 0x68, 0x8c, 0x35, 0xb0, 0x4c, 0xb9, 0x19, 0x39, 0xeb,
17314
-	0x11, 0x63, 0x0d, 0x2c, 0x33, 0x7c, 0x4b, 0x4a, 0x5f, 0xf7, 0x96, 0x74, 0x96, 0x80, 0x15, 0x99,
17315
-	0xbb, 0x86, 0xe1, 0xf7, 0xdb, 0x90, 0x17, 0x69, 0xec, 0xb4, 0xa0, 0xe3, 0xaf, 0xc9, 0x02, 0xd7,
17316
-	0x6a, 0xe0, 0x9c, 0x60, 0xb7, 0x4c, 0xb4, 0x09, 0x05, 0x09, 0x8d, 0xfc, 0x0a, 0x07, 0x04, 0xa9,
17317
-	0xcd, 0xcc, 0xff, 0x2e, 0xa4, 0x0f, 0x2c, 0x9b, 0xc8, 0x85, 0x1e, 0x1b, 0x00, 0xa6, 0x0e, 0xd8,
17318
-	0x5e, 0xc0, 0x1c, 0x5d, 0xcb, 0x05, 0x97, 0x71, 0xdc, 0x3e, 0x59, 0x76, 0x46, 0xed, 0x13, 0x15,
17319
-	0xe8, 0x9c, 0x7d, 0x02, 0xc7, 0xec, 0x13, 0x6c, 0x61, 0x9f, 0x84, 0x46, 0xed, 0x13, 0xa4, 0x9f,
17320
-	0x8b, 0x7d, 0x3b, 0x70, 0xb3, 0x66, 0xeb, 0xc6, 0x91, 0x6d, 0x79, 0x3e, 0x31, 0xa3, 0x11, 0xe3,
17321
-	0x3e, 0x64, 0x67, 0x92, 0xce, 0xab, 0x2e, 0x67, 0x25, 0x52, 0xfd, 0xb7, 0x04, 0x14, 0xb7, 0x89,
17322
-	0x6e, 0xfb, 0x87, 0xd3, 0xab, 0x21, 0x9f, 0x78, 0xbe, 0x3c, 0xac, 0xf8, 0x37, 0xfa, 0x1e, 0xe4,
17323
-	0xc2, 0x9c, 0xe4, 0xda, 0x57, 0xb2, 0x10, 0x8a, 0x1e, 0xc0, 0x22, 0xdb, 0x63, 0x74, 0x1c, 0x14,
17324
-	0x3b, 0x57, 0x3d, 0xc0, 0x48, 0x24, 0x3b, 0x64, 0x5c, 0xc2, 0x93, 0x10, 0xbe, 0x94, 0x32, 0x38,
17325
-	0x68, 0xa2, 0xff, 0x0f, 0x45, 0xfe, 0x7e, 0x10, 0xe4, 0x5c, 0x99, 0xeb, 0x74, 0x16, 0xc4, 0x13,
17326
-	0xa0, 0xc8, 0xb7, 0xfe, 0x27, 0x01, 0x6b, 0xbb, 0xfa, 0x64, 0x9f, 0xc8, 0xb0, 0x41, 0x4c, 0x4c,
17327
-	0x0c, 0xea, 0x9a, 0xa8, 0x1b, 0x0d, 0x37, 0x57, 0xbc, 0x28, 0xc6, 0x09, 0xc7, 0x47, 0x9d, 0xa0,
17328
-	0x00, 0x4b, 0x46, 0x0a, 0xb0, 0x35, 0xc8, 0x38, 0xd4, 0x31, 0x88, 0x8c, 0x45, 0xa2, 0xa1, 0x5a,
17329
-	0xd1, 0x50, 0x53, 0x0a, 0x1f, 0xfb, 0xf8, 0x53, 0x5d, 0x9b, 0xfa, 0x61, 0x6f, 0xe8, 0x13, 0x28,
17330
-	0xf5, 0x9a, 0x75, 0xdc, 0xec, 0xd7, 0x3a, 0x3f, 0xd4, 0x7a, 0xd5, 0x9d, 0x5e, 0xf5, 0xfe, 0x5d,
17331
-	0xad, 0xdb, 0xd9, 0xf9, 0xf4, 0xde, 0x83, 0xbb, 0xdf, 0x53, 0x12, 0xa5, 0xf2, 0xe9, 0x59, 0xf9,
17332
-	0x76, 0xbb, 0x5a, 0xdf, 0x11, 0x3b, 0x66, 0x9f, 0x3e, 0xeb, 0xe9, 0xb6, 0xa7, 0xdf, 0xbf, 0xdb,
17333
-	0xa5, 0xf6, 0x84, 0x61, 0xd8, 0xb2, 0x2e, 0x46, 0xcf, 0xab, 0xe8, 0x31, 0x9c, 0xb8, 0xf4, 0x18,
17334
-	0x9e, 0x9e, 0xe6, 0xc9, 0x4b, 0x4e, 0xf3, 0x2d, 0x58, 0x33, 0x5c, 0xea, 0x79, 0x1a, 0xcb, 0xfe,
17335
-	0x89, 0x39, 0x57, 0x5f, 0x7c, 0xe3, 0xe2, 0x7c, 0x73, 0xb5, 0xce, 0xf8, 0x3d, 0xce, 0x96, 0xea,
17336
-	0x57, 0x8d, 0x08, 0x89, 0xf7, 0xa4, 0xfe, 0x7e, 0x8a, 0x25, 0x52, 0xd6, 0xb1, 0x65, 0x93, 0x01,
17337
-	0xf1, 0xd0, 0x13, 0x58, 0x31, 0x5c, 0x62, 0xb2, 0xb4, 0x5e, 0xb7, 0xa3, 0xbf, 0xe6, 0xfc, 0x7f,
17338
-	0xb1, 0x39, 0x4d, 0x28, 0x58, 0xa9, 0x87, 0x52, 0xbd, 0x11, 0x31, 0xf0, 0xb2, 0x31, 0xd3, 0x46,
17339
-	0x9f, 0xc1, 0x8a, 0x47, 0x6c, 0xcb, 0x19, 0x3f, 0xd3, 0x0c, 0xea, 0xf8, 0xe4, 0x59, 0xf0, 0x6e,
17340
-	0x75, 0x9d, 0xde, 0x5e, 0x73, 0x87, 0x49, 0xd5, 0x85, 0x50, 0x0d, 0x5d, 0x9c, 0x6f, 0x2e, 0xcf,
17341
-	0xd2, 0xf0, 0xb2, 0xd4, 0x2c, 0xdb, 0xa5, 0x36, 0x2c, 0xcf, 0x5a, 0x83, 0xd6, 0xe4, 0xde, 0xe7,
17342
-	0x21, 0x24, 0xd8, 0xdb, 0xe8, 0x36, 0xe4, 0x5c, 0x32, 0xb0, 0x3c, 0xdf, 0x15, 0x6e, 0x66, 0x9c,
17343
-	0x90, 0xc2, 0x76, 0xbe, 0xf8, 0x29, 0x4e, 0xe9, 0x57, 0x61, 0xae, 0x47, 0xb6, 0x59, 0x4c, 0xcb,
17344
-	0xd3, 0xf7, 0xa5, 0xca, 0x1c, 0x0e, 0x9a, 0x6c, 0x0d, 0x8e, 0xbd, 0x30, 0x51, 0xe3, 0xdf, 0x8c,
17345
-	0xc6, 0x33, 0x0a, 0xf9, 0xc3, 0x24, 0x9e, 0x33, 0x04, 0xbf, 0x70, 0x4c, 0x47, 0x7e, 0xe1, 0xb8,
17346
-	0x06, 0x19, 0x9b, 0x1c, 0x13, 0x5b, 0x9c, 0xe5, 0x58, 0x34, 0xde, 0xfe, 0x59, 0x0a, 0xf2, 0xe1,
17347
-	0x1b, 0x0d, 0x3b, 0x09, 0xda, 0xcd, 0xa7, 0xc1, 0x5a, 0x0d, 0xe9, 0x6d, 0x72, 0x82, 0x5e, 0x9b,
17348
-	0xde, 0x29, 0x7d, 0x22, 0x1e, 0xa5, 0x43, 0x76, 0x70, 0x9f, 0xf4, 0x06, 0xe4, 0xaa, 0xbd, 0x5e,
17349
-	0xeb, 0x51, 0xbb, 0xd9, 0x50, 0x3e, 0x4f, 0x94, 0xbe, 0x71, 0x7a, 0x56, 0x5e, 0x0d, 0x41, 0x55,
17350
-	0x4f, 0x2c, 0x25, 0x8e, 0xaa, 0xd7, 0x9b, 0xdd, 0x7e, 0xb3, 0xa1, 0x3c, 0x4f, 0xce, 0xa3, 0xf8,
17351
-	0x1d, 0x09, 0xff, 0x69, 0x49, 0xbe, 0x8b, 0x9b, 0xdd, 0x2a, 0x66, 0x1d, 0x7e, 0x9e, 0x14, 0x57,
17352
-	0x5d, 0xd3, 0x1e, 0x5d, 0x32, 0xd2, 0x5d, 0xd6, 0xe7, 0x46, 0xf0, 0x13, 0xab, 0xe7, 0x29, 0xf1,
17353
-	0xf3, 0x83, 0xe9, 0x83, 0x13, 0xd1, 0xcd, 0x09, 0xeb, 0x8d, 0xbf, 0xf4, 0x71, 0x35, 0xa9, 0xb9,
17354
-	0xde, 0x7a, 0x2c, 0x92, 0x30, 0x2d, 0x2a, 0x2c, 0xe2, 0xbd, 0x76, 0x9b, 0x81, 0x9e, 0xa7, 0xe7,
17355
-	0x46, 0x87, 0xc7, 0x0e, 0xab, 0x7f, 0xd1, 0x1d, 0xc8, 0x05, 0x0f, 0x81, 0xca, 0xe7, 0xe9, 0x39,
17356
-	0x83, 0xea, 0xc1, 0x2b, 0x26, 0xef, 0x70, 0x7b, 0xaf, 0xcf, 0x7f, 0x01, 0xf6, 0x3c, 0x33, 0xdf,
17357
-	0xe1, 0xe1, 0xd8, 0x37, 0xe9, 0x89, 0xc3, 0x76, 0xa0, 0xbc, 0x55, 0xfb, 0x3c, 0x23, 0xae, 0x20,
17358
-	0x42, 0x8c, 0xbc, 0x52, 0x7b, 0x03, 0x72, 0xb8, 0xf9, 0x03, 0xf1, 0x63, 0xb1, 0xe7, 0xd9, 0x39,
17359
-	0x3d, 0x98, 0x7c, 0x46, 0x0c, 0xd9, 0x5b, 0x07, 0x77, 0xb7, 0xab, 0xdc, 0xe5, 0xf3, 0xa8, 0x8e,
17360
-	0x3b, 0x3a, 0xd4, 0x1d, 0x62, 0x4e, 0x7f, 0x83, 0x11, 0xb2, 0xde, 0xfe, 0x25, 0xc8, 0x05, 0x79,
17361
-	0x26, 0xda, 0x80, 0xec, 0xd3, 0x0e, 0x7e, 0xdc, 0xc4, 0xca, 0x82, 0xf0, 0x61, 0xc0, 0x79, 0x2a,
17362
-	0x2a, 0x84, 0x32, 0x2c, 0xee, 0x56, 0xdb, 0xd5, 0x47, 0x4d, 0x1c, 0x5c, 0x78, 0x07, 0x00, 0x99,
17363
-	0x2c, 0x95, 0x14, 0xd9, 0x41, 0xa8, 0xb3, 0xb6, 0xfe, 0xc5, 0x97, 0x1b, 0x0b, 0x3f, 0xfd, 0x72,
17364
-	0x63, 0xe1, 0xf9, 0xc5, 0x46, 0xe2, 0x8b, 0x8b, 0x8d, 0xc4, 0x4f, 0x2e, 0x36, 0x12, 0xff, 0x7a,
17365
-	0xb1, 0x91, 0xd8, 0xcf, 0xf2, 0x90, 0xfe, 0xe0, 0x7f, 0x03, 0x00, 0x00, 0xff, 0xff, 0x48, 0x1c,
17366
-	0x30, 0x25, 0x28, 0x30, 0x00, 0x00,
17066
+	0x56, 0xbf, 0xeb, 0xd3, 0x55, 0xaf, 0xca, 0x76, 0x3a, 0xda, 0xdb, 0xe3, 0xae, 0xed, 0xb1, 0x3d,
17067
+	0x39, 0xd3, 0x3b, 0x33, 0xbd, 0xf3, 0xaf, 0xfe, 0x9a, 0x19, 0xf5, 0xcc, 0xfc, 0xe7, 0xa3, 0xbe,
17068
+	0xdc, 0xae, 0x6d, 0xbb, 0xaa, 0x14, 0x55, 0xee, 0xde, 0x41, 0x82, 0x54, 0x3a, 0x33, 0x5c, 0xce,
17069
+	0x71, 0x56, 0x46, 0x91, 0x99, 0x65, 0x77, 0xb1, 0x20, 0x5a, 0x1c, 0x00, 0xf9, 0x04, 0xb7, 0x45,
17070
+	0xc8, 0x5c, 0xe0, 0x84, 0x90, 0x38, 0x80, 0x84, 0xe0, 0x34, 0x48, 0x1c, 0xe6, 0xc6, 0x02, 0x12,
17071
+	0x5a, 0x81, 0x64, 0x18, 0x1f, 0xb8, 0x21, 0xb8, 0xac, 0xb8, 0x80, 0x84, 0xe2, 0x23, 0xb3, 0xb2,
17072
+	0xaa, 0xd3, 0x76, 0x0f, 0xb3, 0x17, 0x3b, 0xe3, 0xbd, 0xdf, 0x7b, 0xf1, 0xe2, 0x45, 0xc4, 0x8b,
17073
+	0xf7, 0x22, 0x0a, 0x6e, 0xf7, 0x2d, 0xff, 0x60, 0xb4, 0x57, 0x36, 0xe8, 0xe0, 0x8e, 0x49, 0x8d,
17074
+	0x43, 0xe2, 0xde, 0xf1, 0x8e, 0x75, 0x77, 0x70, 0x68, 0xf9, 0x77, 0xf4, 0xa1, 0x75, 0xc7, 0x1f,
17075
+	0x0f, 0x89, 0x57, 0x1e, 0xba, 0xd4, 0xa7, 0x08, 0x09, 0x40, 0x39, 0x00, 0x94, 0x8f, 0xee, 0x95,
17076
+	0xd6, 0xfb, 0x94, 0xf6, 0x6d, 0x72, 0x87, 0x23, 0xf6, 0x46, 0xfb, 0x77, 0x7c, 0x6b, 0x40, 0x3c,
17077
+	0x5f, 0x1f, 0x0c, 0x85, 0x50, 0x69, 0x6d, 0x16, 0x60, 0x8e, 0x5c, 0xdd, 0xb7, 0xa8, 0x23, 0xf9,
17078
+	0x2b, 0x7d, 0xda, 0xa7, 0xfc, 0xf3, 0x0e, 0xfb, 0x12, 0x54, 0x75, 0x1d, 0xe6, 0x9f, 0x10, 0xd7,
17079
+	0xb3, 0xa8, 0x83, 0x56, 0x20, 0x63, 0x39, 0x26, 0x79, 0xb6, 0x9a, 0xd8, 0x48, 0xbc, 0x95, 0xc6,
17080
+	0xa2, 0xa1, 0xde, 0x05, 0x68, 0xb2, 0x8f, 0x86, 0xe3, 0xbb, 0x63, 0xa4, 0x40, 0xea, 0x90, 0x8c,
17081
+	0x39, 0x22, 0x8f, 0xd9, 0x27, 0xa3, 0x1c, 0xe9, 0xf6, 0x6a, 0x52, 0x50, 0x8e, 0x74, 0x5b, 0xfd,
17082
+	0x3a, 0x01, 0x85, 0x8a, 0xe3, 0x50, 0x9f, 0xf7, 0xee, 0x21, 0x04, 0x69, 0x47, 0x1f, 0x10, 0x29,
17083
+	0xc4, 0xbf, 0x51, 0x0d, 0xb2, 0xb6, 0xbe, 0x47, 0x6c, 0x6f, 0x35, 0xb9, 0x91, 0x7a, 0xab, 0x70,
17084
+	0xff, 0xfb, 0xe5, 0x17, 0x87, 0x5c, 0x8e, 0x28, 0x29, 0x6f, 0x73, 0x34, 0x37, 0x02, 0x4b, 0x51,
17085
+	0xf4, 0x09, 0xcc, 0x5b, 0x8e, 0x69, 0x19, 0xc4, 0x5b, 0x4d, 0x73, 0x2d, 0x6b, 0x71, 0x5a, 0x26,
17086
+	0xd6, 0x57, 0xd3, 0x5f, 0x9d, 0xad, 0xcf, 0xe1, 0x40, 0xa8, 0xf4, 0x01, 0x14, 0x22, 0x6a, 0x63,
17087
+	0xc6, 0xb6, 0x02, 0x99, 0x23, 0xdd, 0x1e, 0x11, 0x39, 0x3a, 0xd1, 0xf8, 0x30, 0xf9, 0x30, 0xa1,
17088
+	0x7e, 0x06, 0x2b, 0x2d, 0x7d, 0x40, 0xcc, 0x47, 0xc4, 0x21, 0xae, 0x65, 0x60, 0xe2, 0xd1, 0x91,
17089
+	0x6b, 0x10, 0x36, 0xd6, 0x43, 0xcb, 0x31, 0x83, 0xb1, 0xb2, 0xef, 0x78, 0x2d, 0x6a, 0x0d, 0x5e,
17090
+	0xa9, 0x5b, 0x9e, 0xe1, 0x12, 0x9f, 0x7c, 0x63, 0x25, 0xa9, 0x40, 0xc9, 0x59, 0x02, 0x96, 0x66,
17091
+	0xa5, 0x7f, 0x01, 0xae, 0x31, 0x17, 0x9b, 0x9a, 0x2b, 0x29, 0x9a, 0x37, 0x24, 0x06, 0x57, 0x56,
17092
+	0xb8, 0xff, 0x56, 0x9c, 0x87, 0xe2, 0x46, 0xb2, 0x35, 0x87, 0x97, 0xb9, 0x9a, 0x80, 0xd0, 0x1d,
17093
+	0x12, 0x03, 0x19, 0x70, 0xdd, 0x94, 0x46, 0xcf, 0xa8, 0x4f, 0x72, 0xf5, 0xb1, 0xd3, 0x78, 0xc1,
17094
+	0x30, 0xb7, 0xe6, 0xf0, 0x4a, 0xa0, 0x2c, 0xda, 0x49, 0x15, 0x20, 0x17, 0xe8, 0x56, 0x7f, 0x9c,
17095
+	0x80, 0x7c, 0xc0, 0xf4, 0xd0, 0xdb, 0x90, 0x77, 0x74, 0x87, 0x6a, 0xc6, 0x70, 0xe4, 0xf1, 0x01,
17096
+	0xa5, 0xaa, 0xc5, 0xf3, 0xb3, 0xf5, 0x5c, 0x4b, 0x77, 0x68, 0xad, 0xb3, 0xeb, 0xe1, 0x1c, 0x63,
17097
+	0xd7, 0x86, 0x23, 0x0f, 0xbd, 0x06, 0xc5, 0x01, 0x19, 0x50, 0x77, 0xac, 0xed, 0x8d, 0x7d, 0xe2,
17098
+	0x49, 0xb7, 0x15, 0x04, 0xad, 0xca, 0x48, 0xe8, 0x63, 0x98, 0xef, 0x0b, 0x93, 0x56, 0x53, 0x7c,
17099
+	0xf9, 0xbc, 0x1e, 0x67, 0xfd, 0x8c, 0xd5, 0x38, 0x90, 0x51, 0x7f, 0x27, 0x01, 0x2b, 0x21, 0x95,
17100
+	0xfc, 0xf2, 0xc8, 0x72, 0xc9, 0x80, 0x38, 0xbe, 0x87, 0xde, 0x83, 0xac, 0x6d, 0x0d, 0x2c, 0xdf,
17101
+	0x93, 0x3e, 0x7f, 0x35, 0x4e, 0x6d, 0x38, 0x28, 0x2c, 0xc1, 0xa8, 0x02, 0x45, 0x97, 0x78, 0xc4,
17102
+	0x3d, 0x12, 0x2b, 0x5e, 0x7a, 0xf4, 0x0a, 0xe1, 0x29, 0x11, 0x75, 0x13, 0x72, 0x1d, 0x5b, 0xf7,
17103
+	0xf7, 0xa9, 0x3b, 0x40, 0x2a, 0x14, 0x75, 0xd7, 0x38, 0xb0, 0x7c, 0x62, 0xf8, 0x23, 0x37, 0xd8,
17104
+	0x7d, 0x53, 0x34, 0x74, 0x1d, 0x92, 0x54, 0x74, 0x94, 0xaf, 0x66, 0xcf, 0xcf, 0xd6, 0x93, 0xed,
17105
+	0x2e, 0x4e, 0x52, 0x4f, 0xfd, 0x08, 0x96, 0x3b, 0xf6, 0xa8, 0x6f, 0x39, 0x75, 0xe2, 0x19, 0xae,
17106
+	0x35, 0x64, 0xda, 0xd9, 0xaa, 0x64, 0x31, 0x2a, 0x58, 0x95, 0xec, 0x3b, 0xdc, 0xda, 0xc9, 0xc9,
17107
+	0xd6, 0x56, 0x7f, 0x2b, 0x09, 0xcb, 0x0d, 0xa7, 0x6f, 0x39, 0x24, 0x2a, 0x7d, 0x0b, 0x16, 0x09,
17108
+	0x27, 0x6a, 0x47, 0x22, 0xdc, 0x48, 0x3d, 0x0b, 0x82, 0x1a, 0xc4, 0xa0, 0xe6, 0x4c, 0x5c, 0xb8,
17109
+	0x17, 0x37, 0xfc, 0x17, 0xb4, 0xc7, 0x46, 0x87, 0x06, 0xcc, 0x0f, 0xf9, 0x20, 0x3c, 0x39, 0xbd,
17110
+	0xb7, 0xe2, 0x74, 0xbd, 0x30, 0xce, 0x20, 0x48, 0x48, 0xd9, 0x6f, 0x13, 0x24, 0xfe, 0x24, 0x09,
17111
+	0x4b, 0x2d, 0x6a, 0x4e, 0xf9, 0xa1, 0x04, 0xb9, 0x03, 0xea, 0xf9, 0x91, 0x80, 0x18, 0xb6, 0xd1,
17112
+	0x43, 0xc8, 0x0d, 0xe5, 0xf4, 0xc9, 0xd9, 0xbf, 0x19, 0x6f, 0xb2, 0xc0, 0xe0, 0x10, 0x8d, 0x3e,
17113
+	0x82, 0x7c, 0xb0, 0x65, 0xd8, 0x68, 0x5f, 0x62, 0xe1, 0x4c, 0xf0, 0xe8, 0x63, 0xc8, 0x8a, 0x49,
17114
+	0x58, 0x4d, 0x73, 0xc9, 0x5b, 0x2f, 0xe5, 0x73, 0x2c, 0x85, 0xd0, 0x23, 0xc8, 0xf9, 0xb6, 0xa7,
17115
+	0x59, 0xce, 0x3e, 0x5d, 0xcd, 0x70, 0x05, 0xeb, 0xb1, 0x41, 0x86, 0x9a, 0xa4, 0xb7, 0xdd, 0x6d,
17116
+	0x3a, 0xfb, 0xb4, 0x5a, 0x38, 0x3f, 0x5b, 0x9f, 0x97, 0x0d, 0x3c, 0xef, 0xdb, 0x1e, 0xfb, 0x50,
17117
+	0x7f, 0x37, 0x01, 0x85, 0x08, 0x0a, 0xbd, 0x0a, 0xe0, 0xbb, 0x23, 0xcf, 0xd7, 0x5c, 0x4a, 0x7d,
17118
+	0xee, 0xac, 0x22, 0xce, 0x73, 0x0a, 0xa6, 0xd4, 0x47, 0x65, 0xb8, 0x66, 0x10, 0xd7, 0xd7, 0x2c,
17119
+	0xcf, 0x1b, 0x11, 0x57, 0xf3, 0x46, 0x7b, 0x5f, 0x10, 0xc3, 0xe7, 0x8e, 0x2b, 0xe2, 0x65, 0xc6,
17120
+	0x6a, 0x72, 0x4e, 0x57, 0x30, 0xd0, 0x03, 0xb8, 0x1e, 0xc5, 0x0f, 0x47, 0x7b, 0xb6, 0x65, 0x68,
17121
+	0x6c, 0x32, 0x53, 0x5c, 0xe4, 0xda, 0x44, 0xa4, 0xc3, 0x79, 0x8f, 0xc9, 0x58, 0xfd, 0x69, 0x02,
17122
+	0x14, 0xac, 0xef, 0xfb, 0x3b, 0x64, 0xb0, 0x47, 0xdc, 0xae, 0xaf, 0xfb, 0x23, 0x0f, 0x5d, 0x87,
17123
+	0xac, 0x4d, 0x74, 0x93, 0xb8, 0xdc, 0xa8, 0x1c, 0x96, 0x2d, 0xb4, 0xcb, 0x76, 0xb0, 0x6e, 0x1c,
17124
+	0xe8, 0x7b, 0x96, 0x6d, 0xf9, 0x63, 0x6e, 0xca, 0x62, 0xfc, 0x12, 0x9e, 0xd5, 0x59, 0xc6, 0x11,
17125
+	0x41, 0x3c, 0xa5, 0x06, 0xad, 0xc2, 0xfc, 0x80, 0x78, 0x9e, 0xde, 0x27, 0xdc, 0xd2, 0x3c, 0x0e,
17126
+	0x9a, 0xea, 0x47, 0x50, 0x8c, 0xca, 0xa1, 0x02, 0xcc, 0xef, 0xb6, 0x1e, 0xb7, 0xda, 0x4f, 0x5b,
17127
+	0xca, 0x1c, 0x5a, 0x82, 0xc2, 0x6e, 0x0b, 0x37, 0x2a, 0xb5, 0xad, 0x4a, 0x75, 0xbb, 0xa1, 0x24,
17128
+	0xd0, 0x02, 0xe4, 0x27, 0xcd, 0xa4, 0xfa, 0x67, 0x09, 0x00, 0xe6, 0x6e, 0x39, 0xa8, 0x0f, 0x21,
17129
+	0xe3, 0xf9, 0xba, 0x2f, 0x56, 0xe5, 0xe2, 0xfd, 0x37, 0x2e, 0x9a, 0x43, 0x69, 0x2f, 0xfb, 0x47,
17130
+	0xb0, 0x10, 0x89, 0x5a, 0x98, 0x9c, 0xb2, 0x90, 0x05, 0x08, 0xdd, 0x34, 0x5d, 0x69, 0x38, 0xff,
17131
+	0x56, 0x3f, 0x82, 0x0c, 0x97, 0x9e, 0x36, 0x37, 0x07, 0xe9, 0x3a, 0xfb, 0x4a, 0xa0, 0x3c, 0x64,
17132
+	0x70, 0xa3, 0x52, 0xff, 0x5c, 0x49, 0x22, 0x05, 0x8a, 0xf5, 0x66, 0xb7, 0xd6, 0x6e, 0xb5, 0x1a,
17133
+	0xb5, 0x5e, 0xa3, 0xae, 0xa4, 0xd4, 0x5b, 0x90, 0x69, 0x0e, 0x98, 0xe6, 0x9b, 0x6c, 0xc9, 0xef,
17134
+	0x13, 0x97, 0x38, 0x46, 0xb0, 0x93, 0x26, 0x04, 0xf5, 0x27, 0x79, 0xc8, 0xec, 0xd0, 0x91, 0xe3,
17135
+	0xa3, 0xfb, 0x91, 0xb0, 0xb5, 0x18, 0x9f, 0x21, 0x70, 0x60, 0xb9, 0x37, 0x1e, 0x12, 0x19, 0xd6,
17136
+	0xae, 0x43, 0x56, 0x6c, 0x0e, 0x39, 0x1c, 0xd9, 0x62, 0x74, 0x5f, 0x77, 0xfb, 0xc4, 0x97, 0xe3,
17137
+	0x91, 0x2d, 0xf4, 0x16, 0x3b, 0xb1, 0x74, 0x93, 0x3a, 0xf6, 0x98, 0xef, 0xa1, 0x9c, 0x38, 0x96,
17138
+	0x30, 0xd1, 0xcd, 0xb6, 0x63, 0x8f, 0x71, 0xc8, 0x45, 0x5b, 0x50, 0xdc, 0xb3, 0x1c, 0x53, 0xa3,
17139
+	0x43, 0x11, 0xe4, 0x33, 0x17, 0xef, 0x38, 0x61, 0x55, 0xd5, 0x72, 0xcc, 0xb6, 0x00, 0xe3, 0xc2,
17140
+	0xde, 0xa4, 0x81, 0x5a, 0xb0, 0x78, 0x44, 0xed, 0xd1, 0x80, 0x84, 0xba, 0xb2, 0x5c, 0xd7, 0x9b,
17141
+	0x17, 0xeb, 0x7a, 0xc2, 0xf1, 0x81, 0xb6, 0x85, 0xa3, 0x68, 0x13, 0x3d, 0x86, 0x05, 0x7f, 0x30,
17142
+	0xdc, 0xf7, 0x42, 0x75, 0xf3, 0x5c, 0xdd, 0xf7, 0x2e, 0x71, 0x18, 0x83, 0x07, 0xda, 0x8a, 0x7e,
17143
+	0xa4, 0x55, 0xfa, 0x8d, 0x14, 0x14, 0x22, 0x96, 0xa3, 0x2e, 0x14, 0x86, 0x2e, 0x1d, 0xea, 0x7d,
17144
+	0x7e, 0x50, 0xc9, 0xb9, 0xb8, 0xf7, 0x52, 0xa3, 0x2e, 0x77, 0x26, 0x82, 0x38, 0xaa, 0x45, 0x3d,
17145
+	0x4d, 0x42, 0x21, 0xc2, 0x44, 0xb7, 0x21, 0x87, 0x3b, 0xb8, 0xf9, 0xa4, 0xd2, 0x6b, 0x28, 0x73,
17146
+	0xa5, 0x9b, 0x27, 0xa7, 0x1b, 0xab, 0x5c, 0x5b, 0x54, 0x41, 0xc7, 0xb5, 0x8e, 0xd8, 0xd2, 0x7b,
17147
+	0x0b, 0xe6, 0x03, 0x68, 0xa2, 0xf4, 0xdd, 0x93, 0xd3, 0x8d, 0x57, 0x66, 0xa1, 0x11, 0x24, 0xee,
17148
+	0x6e, 0x55, 0x70, 0xa3, 0xae, 0x24, 0xe3, 0x91, 0xb8, 0x7b, 0xa0, 0xbb, 0xc4, 0x44, 0xdf, 0x83,
17149
+	0xac, 0x04, 0xa6, 0x4a, 0xa5, 0x93, 0xd3, 0x8d, 0xeb, 0xb3, 0xc0, 0x09, 0x0e, 0x77, 0xb7, 0x2b,
17150
+	0x4f, 0x1a, 0x4a, 0x3a, 0x1e, 0x87, 0xbb, 0xb6, 0x7e, 0x44, 0xd0, 0x1b, 0x90, 0x11, 0xb0, 0x4c,
17151
+	0xe9, 0xc6, 0xc9, 0xe9, 0xc6, 0x77, 0x5e, 0x50, 0xc7, 0x50, 0xa5, 0xd5, 0xdf, 0xfe, 0xc3, 0xb5,
17152
+	0xb9, 0xbf, 0xfa, 0xa3, 0x35, 0x65, 0x96, 0x5d, 0xfa, 0xef, 0x04, 0x2c, 0x4c, 0x4d, 0x39, 0x52,
17153
+	0x21, 0xeb, 0x50, 0x83, 0x0e, 0xc5, 0xf9, 0x95, 0xab, 0xc2, 0xf9, 0xd9, 0x7a, 0xb6, 0x45, 0x6b,
17154
+	0x74, 0x38, 0xc6, 0x92, 0x83, 0x1e, 0xcf, 0x9c, 0xc0, 0x0f, 0x5e, 0x72, 0x3d, 0xc5, 0x9e, 0xc1,
17155
+	0x9f, 0xc2, 0x82, 0xe9, 0x5a, 0x47, 0xc4, 0xd5, 0x0c, 0xea, 0xec, 0x5b, 0x7d, 0x79, 0x36, 0x95,
17156
+	0x62, 0xd3, 0x44, 0x0e, 0xc4, 0x45, 0x21, 0x50, 0xe3, 0xf8, 0x6f, 0x71, 0xfa, 0x96, 0x9e, 0x40,
17157
+	0x31, 0xba, 0x42, 0xd9, 0x71, 0xe2, 0x59, 0xbf, 0x42, 0x64, 0x3e, 0xc8, 0xb3, 0x47, 0x9c, 0x67,
17158
+	0x14, 0x91, 0x0d, 0xbe, 0x09, 0xe9, 0x01, 0x35, 0x85, 0x9e, 0x85, 0xea, 0x35, 0x96, 0x04, 0xfc,
17159
+	0xd3, 0xd9, 0x7a, 0x81, 0x7a, 0xe5, 0x4d, 0xcb, 0x26, 0x3b, 0xd4, 0x24, 0x98, 0x03, 0xd4, 0x23,
17160
+	0x48, 0xb3, 0x50, 0x81, 0xbe, 0x0b, 0xe9, 0x6a, 0xb3, 0x55, 0x57, 0xe6, 0x4a, 0xcb, 0x27, 0xa7,
17161
+	0x1b, 0x0b, 0xdc, 0x25, 0x8c, 0xc1, 0xd6, 0x2e, 0x5a, 0x87, 0xec, 0x93, 0xf6, 0xf6, 0xee, 0x0e,
17162
+	0x5b, 0x5e, 0xd7, 0x4e, 0x4e, 0x37, 0x96, 0x42, 0xb6, 0x70, 0x1a, 0x7a, 0x15, 0x32, 0xbd, 0x9d,
17163
+	0xce, 0x66, 0x57, 0x49, 0x96, 0xd0, 0xc9, 0xe9, 0xc6, 0x62, 0xc8, 0xe7, 0x36, 0x97, 0x96, 0xe5,
17164
+	0xac, 0xe6, 0x43, 0xba, 0xfa, 0xb3, 0x24, 0x2c, 0x60, 0x56, 0xf1, 0xb9, 0x7e, 0x87, 0xda, 0x96,
17165
+	0x31, 0x46, 0x1d, 0xc8, 0x1b, 0xd4, 0x31, 0xad, 0xc8, 0x9e, 0xba, 0x7f, 0xc1, 0xa9, 0x3f, 0x91,
17166
+	0x0a, 0x5a, 0xb5, 0x40, 0x12, 0x4f, 0x94, 0xa0, 0x3b, 0x90, 0x31, 0x89, 0xad, 0x8f, 0x65, 0xfa,
17167
+	0x71, 0xa3, 0x2c, 0x6a, 0xca, 0x72, 0x50, 0x53, 0x96, 0xeb, 0xb2, 0xa6, 0xc4, 0x02, 0xc7, 0xd3,
17168
+	0x6c, 0xfd, 0x99, 0xa6, 0xfb, 0x3e, 0x19, 0x0c, 0x7d, 0x91, 0x7b, 0xa4, 0x71, 0x61, 0xa0, 0x3f,
17169
+	0xab, 0x48, 0x12, 0xba, 0x07, 0xd9, 0x63, 0xcb, 0x31, 0xe9, 0xb1, 0x4c, 0x2f, 0x2e, 0x51, 0x2a,
17170
+	0x81, 0xea, 0x09, 0x3b, 0x75, 0x67, 0xcc, 0x64, 0xfe, 0x6e, 0xb5, 0x5b, 0x8d, 0xc0, 0xdf, 0x92,
17171
+	0xdf, 0x76, 0x5a, 0xd4, 0x61, 0x7b, 0x05, 0xda, 0x2d, 0x6d, 0xb3, 0xd2, 0xdc, 0xde, 0xc5, 0xcc,
17172
+	0xe7, 0x2b, 0x27, 0xa7, 0x1b, 0x4a, 0x08, 0xd9, 0xd4, 0x2d, 0x9b, 0xe5, 0xbb, 0x37, 0x20, 0x55,
17173
+	0x69, 0x7d, 0xae, 0x24, 0x4b, 0xca, 0xc9, 0xe9, 0x46, 0x31, 0x64, 0x57, 0x9c, 0xf1, 0x64, 0x1b,
17174
+	0xcd, 0xf6, 0xab, 0xfe, 0x6d, 0x0a, 0x8a, 0xbb, 0x43, 0x53, 0xf7, 0x89, 0x58, 0x93, 0x68, 0x03,
17175
+	0x0a, 0x43, 0xdd, 0xd5, 0x6d, 0x9b, 0xd8, 0x96, 0x37, 0x90, 0xd5, 0x72, 0x94, 0x84, 0x3e, 0x78,
17176
+	0x59, 0x37, 0x56, 0x73, 0x6c, 0x9d, 0xfd, 0xf8, 0x5f, 0xd6, 0x13, 0x81, 0x43, 0x77, 0x61, 0x71,
17177
+	0x5f, 0x58, 0xab, 0xe9, 0x06, 0x9f, 0xd8, 0x14, 0x9f, 0xd8, 0x72, 0xdc, 0xc4, 0x46, 0xcd, 0x2a,
17178
+	0xcb, 0x41, 0x56, 0xb8, 0x14, 0x5e, 0xd8, 0x8f, 0x36, 0xd1, 0x03, 0x98, 0x1f, 0x50, 0xc7, 0xf2,
17179
+	0xa9, 0x7b, 0xf5, 0x2c, 0x04, 0x48, 0x74, 0x1b, 0x96, 0xd9, 0xe4, 0x06, 0xf6, 0x70, 0x36, 0x3f,
17180
+	0xb1, 0x92, 0x78, 0x69, 0xa0, 0x3f, 0x93, 0x1d, 0x62, 0x46, 0x46, 0x55, 0xc8, 0x50, 0x97, 0xa5,
17181
+	0x44, 0x59, 0x6e, 0xee, 0x3b, 0x57, 0x9a, 0x2b, 0x1a, 0x6d, 0x26, 0x83, 0x85, 0xa8, 0xfa, 0x3e,
17182
+	0x2c, 0x4c, 0x0d, 0x82, 0x65, 0x02, 0x9d, 0xca, 0x6e, 0xb7, 0xa1, 0xcc, 0xa1, 0x22, 0xe4, 0x6a,
17183
+	0xed, 0x56, 0xaf, 0xd9, 0xda, 0x65, 0xa9, 0x4c, 0x11, 0x72, 0xb8, 0xbd, 0xbd, 0x5d, 0xad, 0xd4,
17184
+	0x1e, 0x2b, 0x49, 0xb5, 0x0c, 0x85, 0x88, 0x36, 0xb4, 0x08, 0xd0, 0xed, 0xb5, 0x3b, 0xda, 0x66,
17185
+	0x13, 0x77, 0x7b, 0x22, 0x11, 0xea, 0xf6, 0x2a, 0xb8, 0x27, 0x09, 0x09, 0xf5, 0x3f, 0x92, 0xc1,
17186
+	0x8c, 0xca, 0xdc, 0xa7, 0x3a, 0x9d, 0xfb, 0x5c, 0x62, 0xbc, 0xcc, 0x7e, 0x26, 0x8d, 0x30, 0x07,
17187
+	0xfa, 0x00, 0x80, 0x2f, 0x1c, 0x62, 0x6a, 0xba, 0x2f, 0x27, 0xbe, 0xf4, 0x82, 0x93, 0x7b, 0xc1,
17188
+	0xa5, 0x0d, 0xce, 0x4b, 0x74, 0xc5, 0x47, 0x1f, 0x43, 0xd1, 0xa0, 0x83, 0xa1, 0x4d, 0xa4, 0x70,
17189
+	0xea, 0x4a, 0xe1, 0x42, 0x88, 0xaf, 0xf8, 0xd1, 0xec, 0x2b, 0x3d, 0x9d, 0x1f, 0xfe, 0x66, 0x22,
17190
+	0xf0, 0x4c, 0x4c, 0xc2, 0x55, 0x84, 0xdc, 0x6e, 0xa7, 0x5e, 0xe9, 0x35, 0x5b, 0x8f, 0x94, 0x04,
17191
+	0x02, 0xc8, 0x72, 0x57, 0xd7, 0x95, 0x24, 0x4b, 0x14, 0x6b, 0xed, 0x9d, 0xce, 0x76, 0x83, 0xa7,
17192
+	0x5c, 0x68, 0x05, 0x94, 0xc0, 0xd9, 0x1a, 0x77, 0x64, 0xa3, 0xae, 0xa4, 0xd1, 0x35, 0x58, 0x0a,
17193
+	0xa9, 0x52, 0x32, 0x83, 0xae, 0x03, 0x0a, 0x89, 0x13, 0x15, 0x59, 0xf5, 0xd7, 0x60, 0xa9, 0x46,
17194
+	0x1d, 0x5f, 0xb7, 0x9c, 0x30, 0x89, 0xbe, 0xcf, 0x06, 0x2d, 0x49, 0x9a, 0x25, 0x2f, 0x3b, 0xaa,
17195
+	0x4b, 0xe7, 0x67, 0xeb, 0x85, 0x10, 0xda, 0xac, 0xb3, 0x91, 0x06, 0x0d, 0x93, 0xed, 0xdf, 0xa1,
17196
+	0x65, 0x72, 0xe7, 0x66, 0xaa, 0xf3, 0xe7, 0x67, 0xeb, 0xa9, 0x4e, 0xb3, 0x8e, 0x19, 0x0d, 0x7d,
17197
+	0x17, 0xf2, 0xe4, 0x99, 0xe5, 0x6b, 0x06, 0x8b, 0xe1, 0xcc, 0x81, 0x19, 0x9c, 0x63, 0x84, 0x1a,
17198
+	0x0b, 0xd9, 0x55, 0x80, 0x0e, 0x75, 0x7d, 0xd9, 0xf3, 0xbb, 0x90, 0x19, 0x52, 0x97, 0x97, 0xe7,
17199
+	0x17, 0x5e, 0x1a, 0x31, 0xb8, 0x58, 0xa8, 0x58, 0x80, 0xd5, 0xdf, 0x4b, 0x01, 0xf4, 0x74, 0xef,
17200
+	0x50, 0x2a, 0x79, 0x08, 0xf9, 0xf0, 0x02, 0x4e, 0xd6, 0xf9, 0x97, 0xce, 0x76, 0x08, 0x46, 0x0f,
17201
+	0x82, 0xc5, 0x26, 0xca, 0x83, 0xd8, 0x3a, 0x2d, 0xe8, 0x28, 0x2e, 0xc3, 0x9e, 0xae, 0x01, 0xd8,
17202
+	0x91, 0x48, 0x5c, 0x57, 0xce, 0x3c, 0xfb, 0x44, 0x35, 0x7e, 0x2c, 0x08, 0xa7, 0xc9, 0x04, 0x33,
17203
+	0xf6, 0x66, 0x63, 0x66, 0x46, 0xb6, 0xe6, 0xf0, 0x44, 0x0e, 0x7d, 0x0a, 0x05, 0x36, 0x6e, 0xcd,
17204
+	0xe3, 0x3c, 0x99, 0x5b, 0x5e, 0xe8, 0x2a, 0xa1, 0x01, 0xc3, 0x70, 0xe2, 0xe5, 0x57, 0x01, 0xf4,
17205
+	0xe1, 0xd0, 0xb6, 0x88, 0xa9, 0xed, 0x8d, 0x79, 0x32, 0x99, 0xc7, 0x79, 0x49, 0xa9, 0x8e, 0xd9,
17206
+	0x76, 0x09, 0xd8, 0xba, 0xbf, 0x9a, 0xbb, 0xda, 0x81, 0x12, 0x5d, 0xf1, 0xab, 0x0a, 0x2c, 0xba,
17207
+	0x23, 0x87, 0x39, 0x54, 0x5a, 0xa7, 0xfe, 0x69, 0x12, 0x5e, 0x69, 0x11, 0xff, 0x98, 0xba, 0x87,
17208
+	0x15, 0xdf, 0xd7, 0x8d, 0x83, 0x01, 0x71, 0xe4, 0xf4, 0x45, 0x72, 0xf6, 0xc4, 0x54, 0xce, 0xbe,
17209
+	0x0a, 0xf3, 0xba, 0x6d, 0xe9, 0x1e, 0x11, 0x89, 0x4e, 0x1e, 0x07, 0x4d, 0x56, 0x59, 0xb0, 0x3a,
17210
+	0x85, 0x78, 0x1e, 0x11, 0x57, 0x07, 0xcc, 0xf0, 0x80, 0x80, 0x7e, 0x04, 0xd7, 0x65, 0x4a, 0xa3,
17211
+	0x87, 0x5d, 0xb1, 0x9c, 0x39, 0xb8, 0x83, 0x6c, 0xc4, 0x16, 0x4e, 0xf1, 0xc6, 0xc9, 0x9c, 0x67,
17212
+	0x42, 0x6e, 0x0f, 0x7d, 0x99, 0x41, 0xad, 0x98, 0x31, 0xac, 0xd2, 0x23, 0xb8, 0x71, 0xa1, 0xc8,
17213
+	0x37, 0xba, 0x9a, 0xf8, 0x87, 0x24, 0x40, 0xb3, 0x53, 0xd9, 0x91, 0x4e, 0xaa, 0x43, 0x76, 0x5f,
17214
+	0x1f, 0x58, 0xf6, 0xf8, 0xb2, 0x08, 0x38, 0xc1, 0x97, 0x2b, 0xc2, 0x1d, 0x9b, 0x5c, 0x06, 0x4b,
17215
+	0x59, 0x5e, 0x36, 0x8d, 0xf6, 0x1c, 0xe2, 0x87, 0x65, 0x13, 0x6f, 0x31, 0x33, 0x5c, 0xdd, 0x09,
17216
+	0x97, 0xae, 0x68, 0xb0, 0x09, 0xe8, 0xeb, 0x3e, 0x39, 0xd6, 0xc7, 0x41, 0xd8, 0x92, 0x4d, 0xb4,
17217
+	0xc5, 0x2f, 0x00, 0x89, 0x7b, 0x44, 0xcc, 0xd5, 0x0c, 0x77, 0xea, 0x55, 0xf6, 0x60, 0x09, 0x17,
17218
+	0xbe, 0x0b, 0xa5, 0x4b, 0x1f, 0xf1, 0x94, 0x69, 0xc2, 0xfa, 0x46, 0x3e, 0xba, 0x0b, 0x0b, 0x53,
17219
+	0xe3, 0x7c, 0xa1, 0x5e, 0x6d, 0x76, 0x9e, 0xbc, 0xab, 0xa4, 0xe5, 0xd7, 0xfb, 0x4a, 0x56, 0xfd,
17220
+	0xe3, 0x94, 0x08, 0x34, 0xd2, 0xab, 0xf1, 0x17, 0xdf, 0x39, 0xbe, 0xba, 0x0d, 0x6a, 0xcb, 0x00,
17221
+	0xf0, 0xe6, 0xe5, 0xf1, 0x87, 0xd5, 0x3f, 0x1c, 0x8e, 0x43, 0x41, 0xb4, 0x0e, 0x05, 0xb1, 0x8a,
17222
+	0x35, 0xb6, 0xe1, 0xb8, 0x5b, 0x17, 0x30, 0x08, 0x12, 0x93, 0x44, 0xb7, 0x60, 0x91, 0xdf, 0x6f,
17223
+	0x78, 0x07, 0xc4, 0x14, 0x98, 0x34, 0xc7, 0x2c, 0x84, 0x54, 0x0e, 0xdb, 0x81, 0xa2, 0x24, 0x68,
17224
+	0x3c, 0xf7, 0xcd, 0x70, 0x83, 0x6e, 0x5f, 0x65, 0x90, 0x10, 0xe1, 0x29, 0x71, 0x61, 0x38, 0x69,
17225
+	0xa8, 0x75, 0xc8, 0x05, 0xc6, 0xa2, 0x55, 0x48, 0xf5, 0x6a, 0x1d, 0x65, 0xae, 0xb4, 0x74, 0x72,
17226
+	0xba, 0x51, 0x08, 0xc8, 0xbd, 0x5a, 0x87, 0x71, 0x76, 0xeb, 0x1d, 0x25, 0x31, 0xcd, 0xd9, 0xad,
17227
+	0x77, 0x4a, 0x69, 0x96, 0x83, 0xa9, 0xfb, 0x50, 0x88, 0xf4, 0x80, 0x5e, 0x87, 0xf9, 0x66, 0xeb,
17228
+	0x11, 0x6e, 0x74, 0xbb, 0xca, 0x5c, 0xe9, 0xfa, 0xc9, 0xe9, 0x06, 0x8a, 0x70, 0x9b, 0x4e, 0x9f,
17229
+	0xcd, 0x0f, 0x7a, 0x15, 0xd2, 0x5b, 0x6d, 0x76, 0xb6, 0x8b, 0x64, 0x3b, 0x82, 0xd8, 0xa2, 0x9e,
17230
+	0x5f, 0xba, 0x26, 0x93, 0xbb, 0xa8, 0x62, 0xf5, 0xf7, 0x13, 0x90, 0x15, 0x9b, 0x29, 0x76, 0xa2,
17231
+	0x2a, 0x30, 0x1f, 0x54, 0xc2, 0xa2, 0x10, 0x7a, 0xf3, 0xe2, 0xa2, 0xa5, 0x2c, 0x6b, 0x0c, 0xb1,
17232
+	0xfc, 0x02, 0xb9, 0xd2, 0x87, 0x50, 0x8c, 0x32, 0xbe, 0xd1, 0xe2, 0xfb, 0x11, 0x14, 0xd8, 0xfa,
17233
+	0x0e, 0x8a, 0x97, 0xfb, 0x90, 0x15, 0x01, 0x21, 0x3c, 0x6b, 0x2e, 0xae, 0xa0, 0x24, 0x12, 0x3d,
17234
+	0x84, 0x79, 0x51, 0x75, 0x05, 0x17, 0xa0, 0x6b, 0x97, 0xef, 0x22, 0x1c, 0xc0, 0xd5, 0x4f, 0x21,
17235
+	0xdd, 0x21, 0xc4, 0x65, 0xbe, 0x77, 0xa8, 0x49, 0x26, 0xc7, 0xb3, 0x2c, 0x18, 0x4d, 0xd2, 0xac,
17236
+	0xb3, 0x82, 0xd1, 0x24, 0x4d, 0x33, 0xbc, 0xe2, 0x49, 0x46, 0xae, 0x78, 0x7a, 0x50, 0x7c, 0x4a,
17237
+	0xac, 0xfe, 0x81, 0x4f, 0x4c, 0xae, 0xe8, 0x1d, 0x48, 0x0f, 0x49, 0x68, 0xfc, 0x6a, 0xec, 0x02,
17238
+	0x23, 0xc4, 0xc5, 0x1c, 0xc5, 0xe2, 0xc8, 0x31, 0x97, 0x96, 0xb7, 0xf6, 0xb2, 0xa5, 0xfe, 0x7d,
17239
+	0x12, 0x16, 0x9b, 0x9e, 0x37, 0xd2, 0x1d, 0x23, 0xc8, 0xdc, 0x3e, 0x99, 0xce, 0xdc, 0x62, 0x9f,
17240
+	0x37, 0xa6, 0x45, 0xa6, 0x6f, 0xae, 0xe4, 0xe9, 0x99, 0x0c, 0x4f, 0x4f, 0xf5, 0xdf, 0x13, 0xc1,
17241
+	0xf5, 0xd4, 0xad, 0xc8, 0x76, 0x2f, 0xad, 0x9e, 0x9c, 0x6e, 0xac, 0x44, 0x35, 0x91, 0x5d, 0xe7,
17242
+	0xd0, 0xa1, 0xc7, 0x0e, 0x7a, 0x0d, 0x32, 0xb8, 0xd1, 0x6a, 0x3c, 0x55, 0x12, 0x62, 0x79, 0x4e,
17243
+	0x81, 0x30, 0x71, 0xc8, 0x31, 0xd3, 0xd4, 0x69, 0xb4, 0xea, 0x2c, 0xd3, 0x4a, 0xc6, 0x68, 0xea,
17244
+	0x10, 0xc7, 0xb4, 0x9c, 0x3e, 0x7a, 0x1d, 0xb2, 0xcd, 0x6e, 0x77, 0x97, 0x5f, 0x20, 0xbc, 0x72,
17245
+	0x72, 0xba, 0x71, 0x6d, 0x0a, 0xc5, 0xaf, 0x26, 0x4d, 0x06, 0x62, 0x65, 0x0e, 0xcb, 0xc1, 0x62,
17246
+	0x40, 0x2c, 0x7f, 0x16, 0x20, 0xdc, 0xee, 0x55, 0x7a, 0x0d, 0x25, 0x13, 0x03, 0xc2, 0x94, 0xfd,
17247
+	0x95, 0xdb, 0xed, 0x9f, 0x93, 0xa0, 0x54, 0x0c, 0x83, 0x0c, 0x7d, 0xc6, 0x97, 0x95, 0x65, 0x0f,
17248
+	0x72, 0x43, 0xf6, 0x65, 0x91, 0x20, 0x4b, 0x7a, 0x18, 0xfb, 0x40, 0x37, 0x23, 0x57, 0xc6, 0xd4,
17249
+	0x26, 0x15, 0x73, 0x60, 0x79, 0x9e, 0x45, 0x1d, 0x41, 0xc3, 0xa1, 0xa6, 0xd2, 0x7f, 0x26, 0xe0,
17250
+	0x5a, 0x0c, 0x02, 0xdd, 0x85, 0xb4, 0x4b, 0xed, 0x60, 0x0e, 0x6f, 0x5e, 0x74, 0xf3, 0xc8, 0x44,
17251
+	0x31, 0x47, 0xa2, 0x35, 0x00, 0x7d, 0xe4, 0x53, 0x9d, 0xf7, 0xcf, 0x67, 0x2f, 0x87, 0x23, 0x14,
17252
+	0xf4, 0x14, 0xb2, 0x1e, 0x31, 0x5c, 0x12, 0xe4, 0xd2, 0x9f, 0xfe, 0x5f, 0xad, 0x2f, 0x77, 0xb9,
17253
+	0x1a, 0x2c, 0xd5, 0x95, 0xca, 0x90, 0x15, 0x14, 0xb6, 0xec, 0x4d, 0xdd, 0xd7, 0xe5, 0xbd, 0x34,
17254
+	0xff, 0x66, 0xab, 0x49, 0xb7, 0xfb, 0xc1, 0x6a, 0xd2, 0xed, 0xbe, 0xfa, 0x37, 0x49, 0x80, 0xc6,
17255
+	0x33, 0x9f, 0xb8, 0x8e, 0x6e, 0xd7, 0x2a, 0xa8, 0x11, 0x89, 0xfe, 0x62, 0xb4, 0x6f, 0xc7, 0x5e,
17256
+	0xb6, 0x87, 0x12, 0xe5, 0x5a, 0x25, 0x26, 0xfe, 0xdf, 0x80, 0xd4, 0xc8, 0x95, 0x6f, 0xae, 0x22,
17257
+	0x0f, 0xde, 0xc5, 0xdb, 0x98, 0xd1, 0x50, 0x63, 0x12, 0xb6, 0x52, 0x17, 0xbf, 0xac, 0x46, 0x3a,
17258
+	0x88, 0x0d, 0x5d, 0x6c, 0xe7, 0x1b, 0xba, 0x66, 0x10, 0x79, 0x72, 0x14, 0xc5, 0xce, 0xaf, 0x55,
17259
+	0x6a, 0xc4, 0xf5, 0x71, 0xd6, 0xd0, 0xd9, 0xff, 0x6f, 0x15, 0xdf, 0xde, 0x01, 0x98, 0x0c, 0x0d,
17260
+	0xad, 0x41, 0xa6, 0xb6, 0xd9, 0xed, 0x6e, 0x2b, 0x73, 0x22, 0x80, 0x4f, 0x58, 0x9c, 0xac, 0xfe,
17261
+	0x65, 0x12, 0x72, 0xb5, 0x8a, 0x3c, 0x56, 0x6b, 0xa0, 0xf0, 0xa8, 0xc4, 0x6f, 0xf3, 0xc9, 0xb3,
17262
+	0xa1, 0xe5, 0x8e, 0x65, 0x60, 0xb9, 0xa4, 0xa8, 0x5d, 0x64, 0x22, 0xcc, 0xea, 0x06, 0x17, 0x40,
17263
+	0x18, 0x8a, 0x44, 0x3a, 0x41, 0x33, 0xf4, 0x20, 0xc6, 0xaf, 0x5d, 0xee, 0x2c, 0x51, 0x9e, 0x4c,
17264
+	0xda, 0x1e, 0x2e, 0x04, 0x4a, 0x6a, 0xba, 0x87, 0x3e, 0x80, 0x25, 0xcf, 0xea, 0x3b, 0x96, 0xd3,
17265
+	0xd7, 0x02, 0xe7, 0xf1, 0xa7, 0x85, 0xea, 0xf2, 0xf9, 0xd9, 0xfa, 0x42, 0x57, 0xb0, 0xa4, 0x0f,
17266
+	0x17, 0x24, 0xb2, 0xc6, 0x5d, 0x89, 0xde, 0x87, 0xc5, 0x88, 0x28, 0xf3, 0xa2, 0x70, 0xbb, 0x72,
17267
+	0x7e, 0xb6, 0x5e, 0x0c, 0x25, 0x1f, 0x93, 0x31, 0x2e, 0x86, 0x82, 0x8f, 0x09, 0xbf, 0x7f, 0xd9,
17268
+	0xa7, 0xae, 0x41, 0x34, 0x97, 0xef, 0x69, 0x7e, 0x82, 0xa7, 0x71, 0x81, 0xd3, 0xc4, 0x36, 0x57,
17269
+	0x9f, 0xc0, 0xb5, 0xb6, 0x6b, 0x1c, 0x10, 0xcf, 0x17, 0xae, 0x90, 0x5e, 0xfc, 0x14, 0x6e, 0xfa,
17270
+	0xba, 0x77, 0xa8, 0x1d, 0x58, 0x9e, 0x4f, 0xdd, 0xb1, 0xe6, 0x12, 0x9f, 0x38, 0x8c, 0xaf, 0xf1,
17271
+	0xf7, 0x48, 0x79, 0x41, 0x76, 0x83, 0x61, 0xb6, 0x04, 0x04, 0x07, 0x88, 0x6d, 0x06, 0x50, 0x9b,
17272
+	0x50, 0x64, 0x65, 0x4a, 0x9d, 0xec, 0xeb, 0x23, 0xdb, 0x67, 0xa3, 0x07, 0x9b, 0xf6, 0xb5, 0x97,
17273
+	0x3e, 0xa6, 0xf2, 0x36, 0xed, 0x8b, 0x4f, 0xf5, 0x87, 0xa0, 0xd4, 0x2d, 0x6f, 0xa8, 0xfb, 0xc6,
17274
+	0x41, 0x70, 0xf3, 0x87, 0xea, 0xa0, 0x1c, 0x10, 0xdd, 0xf5, 0xf7, 0x88, 0xee, 0x6b, 0x43, 0xe2,
17275
+	0x5a, 0xd4, 0xbc, 0x7a, 0x96, 0x97, 0x42, 0x91, 0x0e, 0x97, 0x50, 0xff, 0x2b, 0x01, 0x80, 0xf5,
17276
+	0xfd, 0x20, 0x23, 0xfb, 0x3e, 0x2c, 0x7b, 0x8e, 0x3e, 0xf4, 0x0e, 0xa8, 0xaf, 0x59, 0x8e, 0x4f,
17277
+	0xdc, 0x23, 0xdd, 0x96, 0x17, 0x38, 0x4a, 0xc0, 0x68, 0x4a, 0x3a, 0x7a, 0x07, 0xd0, 0x21, 0x21,
17278
+	0x43, 0x8d, 0xda, 0xa6, 0x16, 0x30, 0xc5, 0x6b, 0x69, 0x1a, 0x2b, 0x8c, 0xd3, 0xb6, 0xcd, 0x6e,
17279
+	0x40, 0x47, 0x55, 0x58, 0x63, 0xc3, 0x27, 0x8e, 0xef, 0x5a, 0xc4, 0xd3, 0xf6, 0xa9, 0xab, 0x79,
17280
+	0x36, 0x3d, 0xd6, 0xf6, 0xa9, 0x6d, 0xd3, 0x63, 0xe2, 0x06, 0x77, 0x63, 0x25, 0x9b, 0xf6, 0x1b,
17281
+	0x02, 0xb4, 0x49, 0xdd, 0xae, 0x4d, 0x8f, 0x37, 0x03, 0x04, 0x4b, 0xdb, 0x26, 0x63, 0xf6, 0x2d,
17282
+	0xe3, 0x30, 0x48, 0xdb, 0x42, 0x6a, 0xcf, 0x32, 0x0e, 0xd1, 0xeb, 0xb0, 0x40, 0x6c, 0xc2, 0xaf,
17283
+	0x48, 0x04, 0x2a, 0xc3, 0x51, 0xc5, 0x80, 0xc8, 0x40, 0xea, 0x67, 0xa0, 0x34, 0x1c, 0xc3, 0x1d,
17284
+	0x0f, 0x23, 0x73, 0xfe, 0x0e, 0x20, 0x16, 0x24, 0x35, 0x9b, 0x1a, 0x87, 0xda, 0x40, 0x77, 0xf4,
17285
+	0x3e, 0xb3, 0x4b, 0x3c, 0x62, 0x29, 0x8c, 0xb3, 0x4d, 0x8d, 0xc3, 0x1d, 0x49, 0x57, 0x3f, 0x00,
17286
+	0xe8, 0x0e, 0x5d, 0xa2, 0x9b, 0x6d, 0x96, 0x4d, 0x30, 0xd7, 0xf1, 0x96, 0x66, 0xca, 0x47, 0x40,
17287
+	0xea, 0xca, 0xad, 0xae, 0x08, 0x46, 0x3d, 0xa4, 0xab, 0xbf, 0x08, 0xd7, 0x3a, 0xb6, 0x6e, 0xf0,
17288
+	0x07, 0xf1, 0x4e, 0xf8, 0x2a, 0x83, 0x1e, 0x42, 0x56, 0x40, 0xe5, 0x4c, 0xc6, 0x6e, 0xb7, 0x49,
17289
+	0x9f, 0x5b, 0x73, 0x58, 0xe2, 0xab, 0x45, 0x80, 0x89, 0x1e, 0xf5, 0xcf, 0x13, 0x90, 0x0f, 0xf5,
17290
+	0xa3, 0x0d, 0x28, 0x18, 0xd4, 0x61, 0xcb, 0xdb, 0x72, 0x64, 0x55, 0x9f, 0xc7, 0x51, 0x12, 0x6a,
17291
+	0x42, 0x61, 0x18, 0x4a, 0x5f, 0x9a, 0xcf, 0xc5, 0x58, 0x8d, 0xa3, 0xb2, 0xe8, 0x43, 0xc8, 0x07,
17292
+	0xaf, 0xae, 0x41, 0x84, 0xbd, 0xfc, 0x91, 0x76, 0x02, 0x57, 0x3f, 0x01, 0xf8, 0x01, 0xb5, 0x9c,
17293
+	0x1e, 0x3d, 0x24, 0x0e, 0x7f, 0x45, 0x64, 0x35, 0x21, 0x09, 0xbc, 0x28, 0x5b, 0xbc, 0xd4, 0x17,
17294
+	0x53, 0x10, 0x3e, 0xa6, 0x89, 0xa6, 0xfa, 0xd7, 0x49, 0xc8, 0x62, 0x4a, 0xfd, 0x5a, 0x05, 0x6d,
17295
+	0x40, 0x56, 0xc6, 0x09, 0x7e, 0xfe, 0x54, 0xf3, 0xe7, 0x67, 0xeb, 0x19, 0x11, 0x20, 0x32, 0x06,
17296
+	0x8f, 0x0c, 0x91, 0x08, 0x9e, 0xbc, 0x28, 0x82, 0xa3, 0xbb, 0x50, 0x94, 0x20, 0xed, 0x40, 0xf7,
17297
+	0x0e, 0x44, 0x81, 0x56, 0x5d, 0x3c, 0x3f, 0x5b, 0x07, 0x81, 0xdc, 0xd2, 0xbd, 0x03, 0x0c, 0x02,
17298
+	0xcd, 0xbe, 0x51, 0x03, 0x0a, 0x5f, 0x50, 0xcb, 0xd1, 0x7c, 0x3e, 0x08, 0x79, 0x99, 0x18, 0x3b,
17299
+	0x8f, 0x93, 0xa1, 0xca, 0x27, 0x75, 0xf8, 0x62, 0x32, 0xf8, 0x06, 0x2c, 0xb8, 0x94, 0xfa, 0x22,
17300
+	0x6c, 0x59, 0xd4, 0x91, 0xf7, 0x14, 0x1b, 0xb1, 0xd7, 0xd7, 0x94, 0xfa, 0x58, 0xe2, 0x70, 0xd1,
17301
+	0x8d, 0xb4, 0xd0, 0x5d, 0x58, 0xb1, 0x75, 0xcf, 0xd7, 0x78, 0xbc, 0x33, 0x27, 0xda, 0xb2, 0x7c,
17302
+	0xab, 0x21, 0xc6, 0xdb, 0xe4, 0xac, 0x40, 0x42, 0xfd, 0xc7, 0x04, 0x14, 0xd8, 0x60, 0xac, 0x7d,
17303
+	0xcb, 0x60, 0x49, 0xde, 0x37, 0xcf, 0x3d, 0x6e, 0x40, 0xca, 0xf0, 0x5c, 0xe9, 0x54, 0x7e, 0xf8,
17304
+	0xd6, 0xba, 0x18, 0x33, 0x1a, 0xfa, 0x0c, 0xb2, 0xf2, 0xbe, 0x44, 0xa4, 0x1d, 0xea, 0xd5, 0xe9,
17305
+	0xa8, 0xf4, 0x8d, 0x94, 0xe3, 0x6b, 0x79, 0x62, 0x9d, 0x38, 0x04, 0x70, 0x94, 0x84, 0xae, 0x43,
17306
+	0xd2, 0x10, 0xee, 0x92, 0xbf, 0xd9, 0xa8, 0xb5, 0x70, 0xd2, 0x70, 0xd4, 0xbf, 0x4b, 0xc0, 0xc2,
17307
+	0x64, 0xc3, 0xb3, 0x15, 0x70, 0x13, 0xf2, 0xde, 0x68, 0xcf, 0x1b, 0x7b, 0x3e, 0x19, 0x04, 0x2f,
17308
+	0xa4, 0x21, 0x01, 0x35, 0x21, 0xaf, 0xdb, 0x7d, 0xea, 0x5a, 0xfe, 0xc1, 0x40, 0x56, 0xa2, 0xf1,
17309
+	0xa9, 0x42, 0x54, 0x67, 0xb9, 0x12, 0x88, 0xe0, 0x89, 0x74, 0x70, 0xee, 0x8b, 0x67, 0x74, 0x7e,
17310
+	0xee, 0xbf, 0x06, 0x45, 0x5b, 0x1f, 0xf0, 0x0b, 0x24, 0xdf, 0x1a, 0x88, 0x71, 0xa4, 0x71, 0x41,
17311
+	0xd2, 0x7a, 0xd6, 0x80, 0xa8, 0x2a, 0xe4, 0x43, 0x65, 0x68, 0x09, 0x0a, 0x95, 0x46, 0x57, 0xbb,
17312
+	0x77, 0xff, 0xa1, 0xf6, 0xa8, 0xb6, 0xa3, 0xcc, 0xc9, 0xdc, 0xf4, 0x2f, 0x12, 0xb0, 0x20, 0xc3,
17313
+	0x91, 0xcc, 0xf7, 0x5f, 0x87, 0x79, 0x57, 0xdf, 0xf7, 0x83, 0x8a, 0x24, 0x2d, 0x56, 0x35, 0x8b,
17314
+	0xf0, 0xac, 0x22, 0x61, 0xac, 0xf8, 0x8a, 0x24, 0xf2, 0x66, 0x9f, 0xba, 0xf4, 0xcd, 0x3e, 0xfd,
17315
+	0x73, 0x79, 0xb3, 0x57, 0x7f, 0x1d, 0x60, 0xd3, 0xb2, 0x49, 0x4f, 0xdc, 0x35, 0xc5, 0xd5, 0x97,
17316
+	0x2c, 0x87, 0x93, 0x77, 0x99, 0x41, 0x0e, 0xd7, 0xac, 0x63, 0x46, 0x63, 0xac, 0xbe, 0x65, 0xca,
17317
+	0xcd, 0xc8, 0x59, 0x8f, 0x18, 0xab, 0x6f, 0x99, 0xe1, 0x2b, 0x55, 0xfa, 0xaa, 0x57, 0xaa, 0xd3,
17318
+	0x04, 0x2c, 0xc9, 0xdc, 0x35, 0x0c, 0xbf, 0x6f, 0x43, 0x5e, 0xa4, 0xb1, 0x93, 0x82, 0x8e, 0xbf,
17319
+	0x53, 0x0b, 0x5c, 0xb3, 0x8e, 0x73, 0x82, 0xdd, 0x34, 0xd1, 0x3a, 0x14, 0x24, 0x34, 0xf2, 0xfb,
17320
+	0x1e, 0x10, 0xa4, 0x16, 0x33, 0xff, 0x5d, 0x48, 0xef, 0x5b, 0x36, 0x91, 0x0b, 0x3d, 0x36, 0x00,
17321
+	0x4c, 0x1c, 0xb0, 0x35, 0x87, 0x39, 0xba, 0x9a, 0x0b, 0x2e, 0xe3, 0xb8, 0x7d, 0xb2, 0xec, 0x8c,
17322
+	0xda, 0x27, 0x2a, 0xd0, 0x19, 0xfb, 0x04, 0x8e, 0xd9, 0x27, 0xd8, 0xc2, 0x3e, 0x09, 0x8d, 0xda,
17323
+	0x27, 0x48, 0x3f, 0x17, 0xfb, 0xb6, 0xe1, 0x7a, 0xd5, 0xd6, 0x8d, 0x43, 0xdb, 0xf2, 0x7c, 0x62,
17324
+	0x46, 0x23, 0xc6, 0x7d, 0xc8, 0x4e, 0x25, 0x9d, 0x97, 0xdd, 0x5a, 0x4a, 0xa4, 0xfa, 0x6f, 0x09,
17325
+	0x28, 0x6e, 0x11, 0xdd, 0xf6, 0x0f, 0x26, 0x57, 0x43, 0x3e, 0xf1, 0x7c, 0x79, 0x58, 0xf1, 0x6f,
17326
+	0xf4, 0x1e, 0xe4, 0xc2, 0x9c, 0xe4, 0xca, 0xf7, 0xb7, 0x10, 0x8a, 0x1e, 0xc0, 0x3c, 0xdb, 0x63,
17327
+	0x74, 0x14, 0x14, 0x3b, 0x97, 0x3d, 0xed, 0x48, 0x24, 0x3b, 0x64, 0x5c, 0xc2, 0x93, 0x10, 0xbe,
17328
+	0x94, 0x32, 0x38, 0x68, 0xa2, 0xff, 0x0f, 0x45, 0xfe, 0x32, 0x11, 0xe4, 0x5c, 0x99, 0xab, 0x74,
17329
+	0x16, 0xc4, 0xe3, 0xa2, 0xc8, 0xb7, 0xfe, 0x27, 0x01, 0x2b, 0x3b, 0xfa, 0x78, 0x8f, 0xc8, 0xb0,
17330
+	0x41, 0x4c, 0x4c, 0x0c, 0xea, 0x9a, 0xa8, 0x13, 0x0d, 0x37, 0x97, 0xbc, 0x55, 0xc6, 0x09, 0xc7,
17331
+	0x47, 0x9d, 0xa0, 0x00, 0x4b, 0x46, 0x0a, 0xb0, 0x15, 0xc8, 0x38, 0xd4, 0x31, 0x88, 0x8c, 0x45,
17332
+	0xa2, 0xa1, 0x5a, 0xd1, 0x50, 0x53, 0x0a, 0x9f, 0x11, 0xf9, 0x23, 0x60, 0x8b, 0xfa, 0x61, 0x6f,
17333
+	0xe8, 0x33, 0x28, 0x75, 0x1b, 0x35, 0xdc, 0xe8, 0x55, 0xdb, 0x3f, 0xd4, 0xba, 0x95, 0xed, 0x6e,
17334
+	0xe5, 0xfe, 0x5d, 0xad, 0xd3, 0xde, 0xfe, 0xfc, 0xde, 0x83, 0xbb, 0xef, 0x29, 0x89, 0xd2, 0xc6,
17335
+	0xc9, 0xe9, 0xc6, 0xcd, 0x56, 0xa5, 0xb6, 0x2d, 0x76, 0xcc, 0x1e, 0x7d, 0xd6, 0xd5, 0x6d, 0x4f,
17336
+	0xbf, 0x7f, 0xb7, 0x43, 0xed, 0x31, 0xc3, 0xb0, 0x65, 0x5d, 0x8c, 0x9e, 0x57, 0xd1, 0x63, 0x38,
17337
+	0x71, 0xe1, 0x31, 0x3c, 0x39, 0xcd, 0x93, 0x17, 0x9c, 0xe6, 0x9b, 0xb0, 0x62, 0xb8, 0xd4, 0xf3,
17338
+	0x34, 0x96, 0xfd, 0x13, 0x73, 0xa6, 0xbe, 0xf8, 0xce, 0xf9, 0xd9, 0xfa, 0x72, 0x8d, 0xf1, 0xbb,
17339
+	0x9c, 0x2d, 0xd5, 0x2f, 0x1b, 0x11, 0x12, 0xef, 0x49, 0xfd, 0x83, 0x14, 0x4b, 0xa4, 0xac, 0x23,
17340
+	0xcb, 0x26, 0x7d, 0xe2, 0xa1, 0x27, 0xb0, 0x64, 0xb8, 0xc4, 0x64, 0x69, 0xbd, 0x6e, 0x47, 0x7f,
17341
+	0x27, 0xfa, 0xff, 0x62, 0x73, 0x9a, 0x50, 0xb0, 0x5c, 0x0b, 0xa5, 0xba, 0x43, 0x62, 0xe0, 0x45,
17342
+	0x63, 0xaa, 0x8d, 0xbe, 0x80, 0x25, 0x8f, 0xd8, 0x96, 0x33, 0x7a, 0xa6, 0x19, 0xd4, 0xf1, 0xc9,
17343
+	0xb3, 0xe0, 0x45, 0xec, 0x2a, 0xbd, 0xdd, 0xc6, 0x36, 0x93, 0xaa, 0x09, 0xa1, 0x2a, 0x3a, 0x3f,
17344
+	0x5b, 0x5f, 0x9c, 0xa6, 0xe1, 0x45, 0xa9, 0x59, 0xb6, 0x4b, 0x2d, 0x58, 0x9c, 0xb6, 0x06, 0xad,
17345
+	0xc8, 0xbd, 0xcf, 0x43, 0x48, 0xb0, 0xb7, 0xd1, 0x4d, 0xc8, 0xb9, 0xa4, 0x6f, 0x79, 0xbe, 0x2b,
17346
+	0xdc, 0xcc, 0x38, 0x21, 0x85, 0xed, 0x7c, 0xf1, 0x23, 0x9f, 0xd2, 0xaf, 0xc2, 0x4c, 0x8f, 0x6c,
17347
+	0xb3, 0x98, 0x96, 0xa7, 0xef, 0x49, 0x95, 0x39, 0x1c, 0x34, 0xd9, 0x1a, 0x1c, 0x79, 0x61, 0xa2,
17348
+	0xc6, 0xbf, 0x19, 0x8d, 0x67, 0x14, 0xf2, 0x27, 0x4f, 0x3c, 0x67, 0x08, 0x7e, 0x3b, 0x99, 0x8e,
17349
+	0xfc, 0x76, 0x72, 0x05, 0x32, 0x36, 0x39, 0x22, 0xb6, 0x38, 0xcb, 0xb1, 0x68, 0xdc, 0xbe, 0x0b,
17350
+	0xc5, 0xe0, 0x47, 0x7a, 0xfc, 0x57, 0x06, 0x39, 0x48, 0xf7, 0x2a, 0xdd, 0xc7, 0xca, 0x1c, 0x02,
17351
+	0xc8, 0x8a, 0xc5, 0x29, 0x5e, 0xeb, 0x6a, 0xed, 0xd6, 0x66, 0xf3, 0x91, 0x92, 0xbc, 0xfd, 0xb3,
17352
+	0x14, 0xe4, 0xc3, 0xf7, 0x22, 0x76, 0x76, 0xb4, 0x1a, 0x4f, 0x83, 0xd5, 0x1d, 0xd2, 0x5b, 0xe4,
17353
+	0x18, 0xbd, 0x36, 0xb9, 0x85, 0xfa, 0x4c, 0x3c, 0x90, 0x87, 0xec, 0xe0, 0x06, 0xea, 0x0d, 0xc8,
17354
+	0x55, 0xba, 0xdd, 0xe6, 0xa3, 0x56, 0xa3, 0xae, 0x7c, 0x99, 0x28, 0x7d, 0xe7, 0xe4, 0x74, 0x63,
17355
+	0x39, 0x04, 0x55, 0x3c, 0xb1, 0xf8, 0x38, 0xaa, 0x56, 0x6b, 0x74, 0x7a, 0x8d, 0xba, 0xf2, 0x3c,
17356
+	0x39, 0x8b, 0xe2, 0xb7, 0x2a, 0xfc, 0x67, 0x2e, 0xf9, 0x0e, 0x6e, 0x74, 0x2a, 0x98, 0x75, 0xf8,
17357
+	0x65, 0x52, 0x5c, 0x8e, 0x4d, 0x7a, 0x74, 0xc9, 0x50, 0x77, 0x59, 0x9f, 0x6b, 0xc1, 0xcf, 0xbd,
17358
+	0x9e, 0xa7, 0xc4, 0x4f, 0x21, 0x26, 0x8f, 0x5f, 0x44, 0x37, 0xc7, 0xac, 0x37, 0xfe, 0xea, 0xc8,
17359
+	0xd5, 0xa4, 0x66, 0x7a, 0xeb, 0xb2, 0xd8, 0xc3, 0xb4, 0xa8, 0x30, 0x8f, 0x77, 0x5b, 0x2d, 0x06,
17360
+	0x7a, 0x9e, 0x9e, 0x19, 0x1d, 0x1e, 0x39, 0xac, 0x62, 0x46, 0xb7, 0x20, 0x17, 0x3c, 0x4a, 0x2a,
17361
+	0x5f, 0xa6, 0x67, 0x0c, 0xaa, 0x05, 0x2f, 0xaa, 0xbc, 0xc3, 0xad, 0xdd, 0x1e, 0xff, 0x35, 0xda,
17362
+	0xf3, 0xcc, 0x6c, 0x87, 0x07, 0x23, 0xdf, 0xa4, 0xc7, 0x0e, 0xdb, 0xb3, 0xf2, 0x1e, 0xee, 0xcb,
17363
+	0x8c, 0xb8, 0xb4, 0x08, 0x31, 0xf2, 0x12, 0xee, 0x0d, 0xc8, 0xe1, 0xc6, 0x0f, 0xc4, 0x0f, 0xd7,
17364
+	0x9e, 0x67, 0x67, 0xf4, 0x60, 0xf2, 0x05, 0x31, 0x64, 0x6f, 0x6d, 0xdc, 0xd9, 0xaa, 0x70, 0x97,
17365
+	0xcf, 0xa2, 0xda, 0xee, 0xf0, 0x40, 0x77, 0x88, 0x39, 0xf9, 0x3d, 0x48, 0xc8, 0xba, 0xfd, 0x4b,
17366
+	0x90, 0x0b, 0x32, 0x53, 0xb4, 0x06, 0xd9, 0xa7, 0x6d, 0xfc, 0xb8, 0x81, 0x95, 0x39, 0xe1, 0xc3,
17367
+	0x80, 0xf3, 0x54, 0xd4, 0x14, 0x1b, 0x30, 0xbf, 0x53, 0x69, 0x55, 0x1e, 0x35, 0x70, 0x70, 0x45,
17368
+	0x1e, 0x00, 0x64, 0x7a, 0x55, 0x52, 0x64, 0x07, 0xa1, 0xce, 0xea, 0xea, 0x57, 0x5f, 0xaf, 0xcd,
17369
+	0xfd, 0xf4, 0xeb, 0xb5, 0xb9, 0xe7, 0xe7, 0x6b, 0x89, 0xaf, 0xce, 0xd7, 0x12, 0x3f, 0x39, 0x5f,
17370
+	0x4b, 0xfc, 0xeb, 0xf9, 0x5a, 0x62, 0x2f, 0xcb, 0x0f, 0x81, 0x07, 0xff, 0x1b, 0x00, 0x00, 0xff,
17371
+	0xff, 0x3b, 0x34, 0xbd, 0xc6, 0xd3, 0x30, 0x00, 0x00,
17367 17372
 }
... ...
@@ -57,6 +57,12 @@ message GenericResource {
57 57
 	}
58 58
 }
59 59
 
60
+enum ResourceType {
61
+	TASK = 0;
62
+	SECRET = 1;
63
+	CONFIG = 2;
64
+}
65
+
60 66
 message Resources {
61 67
 	// Amount of CPUs (e.g. 2000000000 = 2 CPU cores)
62 68
 	int64 nano_cpus = 1 [(gogoproto.customname) = "NanoCPUs"];
... ...
@@ -508,6 +514,15 @@ message TaskStatus {
508 508
 	// HostPorts provides a list of ports allocated at the host
509 509
 	// level.
510 510
 	PortStatus port_status = 6;
511
+
512
+	// AppliedBy gives the node ID of the manager that applied this task
513
+	// status update to the Task object.
514
+	string applied_by = 7;
515
+
516
+	// AppliedAt gives a timestamp of when this status update was applied to
517
+	// the Task object.
518
+	// Note: can't use stdtime because this field is nullable.
519
+	google.protobuf.Timestamp applied_at = 8;
511 520
 }
512 521
 
513 522
 // NetworkAttachmentConfig specifies how a service should be attached to a particular network.
... ...
@@ -1,5 +1,5 @@
1 1
 // Code generated by protoc-gen-gogo.
2
-// source: watch.proto
2
+// source: github.com/docker/swarmkit/api/watch.proto
3 3
 // DO NOT EDIT!
4 4
 
5 5
 package api
... ...
@@ -1442,7 +1442,7 @@ var _Watch_serviceDesc = grpc.ServiceDesc{
1442 1442
 			ServerStreams: true,
1443 1443
 		},
1444 1444
 	},
1445
-	Metadata: "watch.proto",
1445
+	Metadata: "github.com/docker/swarmkit/api/watch.proto",
1446 1446
 }
1447 1447
 
1448 1448
 func (m *Object) Marshal() (dAtA []byte, err error) {
... ...
@@ -4519,81 +4519,83 @@ var (
4519 4519
 	ErrIntOverflowWatch   = fmt.Errorf("proto: integer overflow")
4520 4520
 )
4521 4521
 
4522
-func init() { proto.RegisterFile("watch.proto", fileDescriptorWatch) }
4522
+func init() { proto.RegisterFile("github.com/docker/swarmkit/api/watch.proto", fileDescriptorWatch) }
4523 4523
 
4524 4524
 var fileDescriptorWatch = []byte{
4525
-	// 1155 bytes of a gzipped FileDescriptorProto
4526
-	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x94, 0x96, 0xbb, 0x73, 0x1b, 0xd5,
4527
-	0x17, 0xc7, 0xb5, 0x8a, 0xbc, 0x92, 0x8e, 0xac, 0xc4, 0x73, 0xed, 0x24, 0xfb, 0xd3, 0x2f, 0x48,
4528
-	0x42, 0x0c, 0xe0, 0x21, 0x41, 0x01, 0x13, 0xc2, 0x00, 0x81, 0x19, 0x4b, 0x16, 0x23, 0x91, 0xb1,
4529
-	0xec, 0xb9, 0xb6, 0xe3, 0x52, 0xb3, 0xde, 0x3d, 0x56, 0x16, 0xed, 0x43, 0xdc, 0x5d, 0xc9, 0x71,
4530
-	0x47, 0x41, 0xc1, 0xa4, 0x67, 0x86, 0x26, 0x15, 0xd4, 0x34, 0x74, 0xf0, 0x0f, 0x64, 0xa8, 0x28,
4531
-	0xa1, 0xd1, 0x10, 0x95, 0x14, 0xfc, 0x05, 0x14, 0xcc, 0x7d, 0xac, 0x1f, 0xca, 0xca, 0x21, 0x95,
4532
-	0xee, 0xbd, 0xfb, 0xf9, 0x9e, 0x7b, 0xf6, 0xbc, 0x56, 0x50, 0x38, 0x32, 0x23, 0xeb, 0x61, 0x7d,
4533
-	0xc8, 0x82, 0x28, 0x20, 0xc4, 0x0e, 0xac, 0x01, 0xb2, 0x7a, 0x78, 0x64, 0x32, 0x6f, 0xe0, 0x44,
4534
-	0xf5, 0xf1, 0xbb, 0xa5, 0x42, 0x38, 0x44, 0x2b, 0x94, 0x40, 0xa9, 0x18, 0x1c, 0x7c, 0x81, 0x56,
4535
-	0x14, 0x6f, 0x0b, 0xd1, 0xf1, 0x10, 0xe3, 0xcd, 0x4a, 0x3f, 0xe8, 0x07, 0x62, 0x79, 0x9b, 0xaf,
4536
-	0xd4, 0xe9, 0xf2, 0xd0, 0x1d, 0xf5, 0x1d, 0xff, 0xb6, 0xfc, 0x91, 0x87, 0xb5, 0xaf, 0x33, 0xa0,
4537
-	0x6f, 0x09, 0x4b, 0xa4, 0x0e, 0x19, 0x3f, 0xb0, 0xd1, 0xd0, 0xaa, 0xda, 0x6a, 0x61, 0xcd, 0xa8,
4538
-	0x3f, 0xef, 0x41, 0xbd, 0x1b, 0xd8, 0xd8, 0x4e, 0x51, 0xc1, 0x91, 0x0f, 0x20, 0x1b, 0x22, 0x1b,
4539
-	0x3b, 0x16, 0x1a, 0x69, 0x21, 0xf9, 0x7f, 0x92, 0x64, 0x47, 0x22, 0xed, 0x14, 0x8d, 0x69, 0x2e,
4540
-	0xf4, 0x31, 0x3a, 0x0a, 0xd8, 0xc0, 0xb8, 0x34, 0x5f, 0xd8, 0x95, 0x08, 0x17, 0x2a, 0x9a, 0x7b,
4541
-	0x18, 0x99, 0xe1, 0xc0, 0xc8, 0xcc, 0xf7, 0x70, 0xd7, 0x0c, 0xb9, 0x44, 0x70, 0xfc, 0x22, 0xcb,
4542
-	0x1d, 0x85, 0x11, 0x32, 0x63, 0x61, 0xfe, 0x45, 0x4d, 0x89, 0xf0, 0x8b, 0x14, 0x4d, 0xee, 0x80,
4543
-	0x1e, 0xa2, 0xc5, 0x30, 0x32, 0x74, 0xa1, 0x2b, 0x25, 0xbf, 0x19, 0x27, 0xda, 0x29, 0xaa, 0x58,
4544
-	0xf2, 0x11, 0xe4, 0x18, 0x86, 0xc1, 0x88, 0x59, 0x68, 0x64, 0x85, 0xee, 0x46, 0x92, 0x8e, 0x2a,
4545
-	0xa6, 0x9d, 0xa2, 0x27, 0x3c, 0xf9, 0x04, 0xf2, 0xf8, 0x28, 0x42, 0x3f, 0x74, 0x02, 0xdf, 0xc8,
4546
-	0x09, 0xf1, 0x2b, 0x49, 0xe2, 0x56, 0x0c, 0xb5, 0x53, 0xf4, 0x54, 0xc1, 0x1d, 0xb6, 0x02, 0xff,
4547
-	0xd0, 0xe9, 0x1b, 0xf9, 0xf9, 0x0e, 0x37, 0x05, 0xc1, 0x1d, 0x96, 0x6c, 0x23, 0x17, 0xe7, 0xbe,
4548
-	0xb6, 0x0d, 0x8b, 0x3b, 0xe8, 0xa2, 0x15, 0x35, 0x8e, 0x77, 0xdc, 0x20, 0x22, 0xb7, 0x00, 0x54,
4549
-	0xb6, 0x7a, 0x8e, 0x2d, 0x2a, 0x22, 0xdf, 0x28, 0x4e, 0x27, 0x95, 0xbc, 0x4a, 0x67, 0x67, 0x83,
4550
-	0xe6, 0x15, 0xd0, 0xb1, 0x09, 0x81, 0x4c, 0xe8, 0x06, 0x91, 0x28, 0x83, 0x0c, 0x15, 0xeb, 0xda,
4551
-	0x36, 0x5c, 0x8e, 0x2d, 0x36, 0x47, 0x61, 0x14, 0x78, 0x9c, 0x1a, 0x38, 0xbe, 0xb2, 0x46, 0xc5,
4552
-	0x9a, 0xac, 0xc0, 0x82, 0xe3, 0xdb, 0xf8, 0x48, 0x48, 0xf3, 0x54, 0x6e, 0xf8, 0xe9, 0xd8, 0x74,
4553
-	0x47, 0x28, 0xca, 0x23, 0x4f, 0xe5, 0xa6, 0xf6, 0x97, 0x0e, 0xb9, 0xd8, 0x24, 0x31, 0x20, 0x7d,
4554
-	0xe2, 0x98, 0x3e, 0x9d, 0x54, 0xd2, 0x9d, 0x8d, 0x76, 0x8a, 0xa6, 0x1d, 0x9b, 0xdc, 0x84, 0xbc,
4555
-	0x63, 0xf7, 0x86, 0x0c, 0x0f, 0x1d, 0x65, 0xb6, 0xb1, 0x38, 0x9d, 0x54, 0x72, 0x9d, 0x8d, 0x6d,
4556
-	0x71, 0xc6, 0xc3, 0xee, 0xd8, 0x72, 0x4d, 0x56, 0x20, 0xe3, 0x9b, 0x9e, 0xba, 0x48, 0x54, 0xb6,
4557
-	0xe9, 0x21, 0x79, 0x15, 0x0a, 0xfc, 0x37, 0x36, 0x92, 0x51, 0x0f, 0x81, 0x1f, 0x2a, 0xe1, 0x3d,
4558
-	0xd0, 0x2d, 0xf1, 0x5a, 0xaa, 0xb2, 0x6a, 0xc9, 0x15, 0x72, 0x36, 0x00, 0x22, 0xf0, 0x32, 0x14,
4559
-	0x1d, 0x28, 0xca, 0x55, 0x7c, 0x85, 0xfe, 0x12, 0x46, 0x16, 0xa5, 0x54, 0x39, 0x52, 0x3f, 0x97,
4560
-	0xa9, 0x6c, 0x42, 0xa6, 0x78, 0xa5, 0x9c, 0xe6, 0xea, 0x75, 0xc8, 0xf2, 0xee, 0xe5, 0x70, 0x4e,
4561
-	0xc0, 0x30, 0x9d, 0x54, 0x74, 0xde, 0xd8, 0x82, 0xd4, 0xf9, 0xc3, 0x8e, 0x4d, 0xee, 0xaa, 0x94,
4562
-	0xca, 0x72, 0xaa, 0x5e, 0xe4, 0x18, 0x2f, 0x18, 0x1e, 0x3a, 0xce, 0x93, 0x0d, 0x28, 0xda, 0x18,
4563
-	0x3a, 0x0c, 0xed, 0x5e, 0x18, 0x99, 0x11, 0x1a, 0x50, 0xd5, 0x56, 0x2f, 0x27, 0xd7, 0x32, 0xef,
4564
-	0xd5, 0x1d, 0x0e, 0xf1, 0x97, 0x52, 0x2a, 0xb1, 0x27, 0x6b, 0x90, 0x61, 0x81, 0x8b, 0x46, 0x41,
4565
-	0x88, 0x6f, 0xcc, 0x1b, 0x45, 0x34, 0x70, 0xc5, 0x38, 0xe2, 0x2c, 0xe9, 0x00, 0x78, 0xe8, 0x1d,
4566
-	0x20, 0x0b, 0x1f, 0x3a, 0x43, 0x63, 0x51, 0x28, 0xdf, 0x9c, 0xa7, 0xdc, 0x19, 0xa2, 0x55, 0xdf,
4567
-	0x3c, 0xc1, 0x79, 0x72, 0x4f, 0xc5, 0x64, 0x13, 0xae, 0x32, 0x3c, 0x44, 0x86, 0xbe, 0x85, 0x76,
4568
-	0x4f, 0x4d, 0x1f, 0x1e, 0xb1, 0xa2, 0x88, 0xd8, 0xf5, 0xe9, 0xa4, 0xb2, 0x4c, 0x4f, 0x00, 0x35,
4569
-	0xa8, 0x44, 0xf8, 0x96, 0xd9, 0x73, 0xc7, 0x36, 0xf9, 0x1c, 0x56, 0xce, 0x98, 0x93, 0xc3, 0x82,
4570
-	0x5b, 0xbb, 0x2c, 0xac, 0x5d, 0x9b, 0x4e, 0x2a, 0xe4, 0xd4, 0x9a, 0x9c, 0x2a, 0xc2, 0x18, 0x61,
4571
-	0xb3, 0xa7, 0xbc, 0x61, 0x64, 0x13, 0x5d, 0x89, 0x0b, 0x56, 0xb4, 0xd1, 0xf9, 0x1b, 0x64, 0x77,
4572
-	0xf3, 0x1b, 0x96, 0x92, 0x6e, 0x90, 0x63, 0x60, 0xf6, 0x06, 0x75, 0x6a, 0x37, 0x32, 0x90, 0x6e,
4573
-	0x1c, 0xd7, 0xfe, 0x48, 0xc3, 0xe2, 0x3e, 0xff, 0x1e, 0x51, 0xfc, 0x72, 0x84, 0x61, 0x44, 0x5a,
4574
-	0x90, 0x45, 0x3f, 0x62, 0x0e, 0x86, 0x86, 0x56, 0xbd, 0xb4, 0x5a, 0x58, 0xbb, 0x99, 0x14, 0xdb,
4575
-	0xb3, 0x12, 0xb9, 0x69, 0xf9, 0x11, 0x3b, 0xa6, 0xb1, 0x96, 0xdc, 0x83, 0x02, 0xc3, 0x70, 0xe4,
4576
-	0x61, 0xef, 0x90, 0x05, 0xde, 0x45, 0x1f, 0x8e, 0x07, 0xc8, 0xf8, 0x68, 0xa3, 0x20, 0xf9, 0xcf,
4577
-	0x58, 0xe0, 0x91, 0x5b, 0x40, 0x1c, 0xdf, 0x72, 0x47, 0x36, 0xf6, 0x02, 0xd7, 0xee, 0xc9, 0x4f,
4578
-	0xa0, 0x68, 0xde, 0x1c, 0x5d, 0x52, 0x4f, 0xb6, 0x5c, 0x5b, 0x0e, 0xb5, 0xd2, 0xb7, 0x1a, 0xc0,
4579
-	0xa9, 0x0f, 0x89, 0xf3, 0xe7, 0x63, 0xd0, 0x4d, 0x2b, 0xe2, 0x33, 0x37, 0x2d, 0x0a, 0xe6, 0xb5,
4580
-	0xb9, 0x2f, 0xb5, 0x2e, 0xb0, 0xfb, 0x8e, 0x6f, 0x53, 0x25, 0x21, 0x77, 0x21, 0x7b, 0xe8, 0xb8,
4581
-	0x11, 0xb2, 0xd0, 0xb8, 0x24, 0x42, 0x72, 0xe3, 0xa2, 0x36, 0xa1, 0x31, 0x5c, 0xfb, 0x25, 0x8e,
4582
-	0xed, 0x26, 0x86, 0xa1, 0xd9, 0x47, 0xf2, 0x29, 0xe8, 0x38, 0x46, 0x3f, 0x8a, 0x43, 0xfb, 0xc6,
4583
-	0x5c, 0x2f, 0x94, 0xa2, 0xde, 0xe2, 0x38, 0x55, 0x2a, 0xf2, 0x3e, 0x64, 0xc7, 0x32, 0x5a, 0xff,
4584
-	0x25, 0xa0, 0x31, 0x5b, 0xfa, 0x49, 0x83, 0x05, 0x61, 0xe8, 0x4c, 0x18, 0xb4, 0x97, 0x0f, 0xc3,
4585
-	0x1a, 0xe8, 0x2a, 0x11, 0xe9, 0xf9, 0xdf, 0x1e, 0x99, 0x12, 0xaa, 0x48, 0xf2, 0x21, 0xc0, 0x4c,
4586
-	0x02, 0x2f, 0xd6, 0xe5, 0x83, 0x38, 0xab, 0x6f, 0xfd, 0xa3, 0xc1, 0x95, 0x19, 0x57, 0xc8, 0x1d,
4587
-	0x58, 0xd9, 0x5f, 0xdf, 0x6d, 0xb6, 0x7b, 0xeb, 0xcd, 0xdd, 0xce, 0x56, 0xb7, 0xb7, 0xd7, 0xbd,
4588
-	0xdf, 0xdd, 0xda, 0xef, 0x2e, 0xa5, 0x4a, 0xa5, 0xc7, 0x4f, 0xaa, 0xd7, 0x66, 0xf0, 0x3d, 0x7f,
4589
-	0xe0, 0x07, 0x47, 0xdc, 0xf1, 0xe5, 0x73, 0xaa, 0x26, 0x6d, 0xad, 0xef, 0xb6, 0x96, 0xb4, 0xd2,
4590
-	0xff, 0x1e, 0x3f, 0xa9, 0x5e, 0x9d, 0x11, 0x35, 0x19, 0xca, 0xc9, 0x74, 0x5e, 0xb3, 0xb7, 0xbd,
4591
-	0xc1, 0x35, 0xe9, 0x44, 0xcd, 0xde, 0xd0, 0x4e, 0xd2, 0xd0, 0xd6, 0xe6, 0xd6, 0x83, 0xd6, 0x52,
4592
-	0x26, 0x51, 0x43, 0xd1, 0x0b, 0xc6, 0x58, 0xba, 0xfe, 0xcd, 0xf7, 0xe5, 0xd4, 0xcf, 0x3f, 0x94,
4593
-	0x67, 0x5f, 0x75, 0xcd, 0x83, 0x05, 0x71, 0x44, 0xec, 0x78, 0x51, 0x7d, 0x51, 0x23, 0x96, 0xaa,
4594
-	0x2f, 0xaa, 0xa7, 0xda, 0xd5, 0x5f, 0x7f, 0xfc, 0xfb, 0xbb, 0xf4, 0x15, 0x28, 0x0a, 0xe2, 0x6d,
4595
-	0xcf, 0xf4, 0xcd, 0x3e, 0xb2, 0x77, 0xb4, 0x86, 0xf1, 0xf4, 0x59, 0x39, 0xf5, 0xfb, 0xb3, 0x72,
4596
-	0xea, 0xab, 0x69, 0x59, 0x7b, 0x3a, 0x2d, 0x6b, 0xbf, 0x4d, 0xcb, 0xda, 0x9f, 0xd3, 0xb2, 0x76,
4597
-	0xa0, 0x8b, 0x3f, 0x90, 0xef, 0xfd, 0x1b, 0x00, 0x00, 0xff, 0xff, 0xf8, 0x53, 0xd9, 0x73, 0xb7,
4598
-	0x0a, 0x00, 0x00,
4525
+	// 1186 bytes of a gzipped FileDescriptorProto
4526
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x94, 0x96, 0xbd, 0x73, 0x1b, 0xc5,
4527
+	0x1b, 0xc7, 0x75, 0x8a, 0x7c, 0x92, 0x1e, 0xdb, 0x89, 0x67, 0xe3, 0x24, 0xf7, 0xd3, 0x2f, 0xc8,
4528
+	0x42, 0x0c, 0x90, 0x49, 0x82, 0x0c, 0x26, 0x24, 0x03, 0x04, 0x66, 0x2c, 0x59, 0x8c, 0x44, 0xc6,
4529
+	0x2f, 0xb3, 0xb6, 0x93, 0x52, 0x73, 0xbe, 0x7b, 0xac, 0x1c, 0xba, 0xbb, 0x15, 0x7b, 0x27, 0x39,
4530
+	0xee, 0x28, 0x28, 0x98, 0xf4, 0xcc, 0xd0, 0xa4, 0x82, 0x9a, 0x86, 0x0e, 0xfe, 0x81, 0x0c, 0x15,
4531
+	0x25, 0x34, 0x1a, 0xa2, 0x92, 0x82, 0xbf, 0x80, 0x82, 0xd9, 0x97, 0xf3, 0x8b, 0x72, 0xb2, 0x49,
4532
+	0xa5, 0xbd, 0xbd, 0xcf, 0xf7, 0xd9, 0x67, 0x9f, 0xb7, 0x13, 0xdc, 0xec, 0x7a, 0xf1, 0xe3, 0xc1,
4533
+	0x5e, 0xcd, 0x61, 0xc1, 0xb2, 0xcb, 0x9c, 0x1e, 0xf2, 0xe5, 0xe8, 0xc0, 0xe6, 0x41, 0xcf, 0x8b,
4534
+	0x97, 0xed, 0xbe, 0xb7, 0x7c, 0x60, 0xc7, 0xce, 0xe3, 0x5a, 0x9f, 0xb3, 0x98, 0x11, 0xa2, 0x80,
4535
+	0x5a, 0x02, 0xd4, 0x86, 0xef, 0x95, 0xce, 0xd3, 0x47, 0x7d, 0x74, 0x22, 0xa5, 0x2f, 0xdd, 0x3e,
4536
+	0x87, 0x65, 0x7b, 0x5f, 0xa0, 0x13, 0x27, 0xf4, 0x79, 0x96, 0xe3, 0xc3, 0x3e, 0x26, 0xec, 0x62,
4537
+	0x97, 0x75, 0x99, 0x5c, 0x2e, 0x8b, 0x95, 0xde, 0xbd, 0x77, 0x86, 0x05, 0x49, 0xec, 0x0d, 0xf6,
4538
+	0x97, 0xfb, 0xfe, 0xa0, 0xeb, 0x85, 0xfa, 0x47, 0x09, 0xab, 0x5f, 0xe7, 0xc0, 0xdc, 0x94, 0xce,
4539
+	0x90, 0x1a, 0xe4, 0x42, 0xe6, 0xa2, 0x65, 0x54, 0x8c, 0x1b, 0xb3, 0x2b, 0x56, 0xed, 0xe5, 0x10,
4540
+	0xd4, 0x36, 0x98, 0x8b, 0xad, 0x0c, 0x95, 0x1c, 0xb9, 0x07, 0xf9, 0x08, 0xf9, 0xd0, 0x73, 0xd0,
4541
+	0xca, 0x4a, 0xc9, 0xff, 0xd3, 0x24, 0xdb, 0x0a, 0x69, 0x65, 0x68, 0x42, 0x0b, 0x61, 0x88, 0xf1,
4542
+	0x01, 0xe3, 0x3d, 0xeb, 0xc2, 0x74, 0xe1, 0x86, 0x42, 0x84, 0x50, 0xd3, 0xc2, 0xc3, 0xd8, 0x8e,
4543
+	0x7a, 0x56, 0x6e, 0xba, 0x87, 0x3b, 0x76, 0x24, 0x24, 0x92, 0x13, 0x07, 0x39, 0xfe, 0x20, 0x8a,
4544
+	0x91, 0x5b, 0x33, 0xd3, 0x0f, 0x6a, 0x28, 0x44, 0x1c, 0xa4, 0x69, 0x72, 0x07, 0xcc, 0x08, 0x1d,
4545
+	0x8e, 0xb1, 0x65, 0x4a, 0x5d, 0x29, 0xfd, 0x66, 0x82, 0x68, 0x65, 0xa8, 0x66, 0xc9, 0x47, 0x50,
4546
+	0xe0, 0x18, 0xb1, 0x01, 0x77, 0xd0, 0xca, 0x4b, 0xdd, 0xf5, 0x34, 0x1d, 0xd5, 0x4c, 0x2b, 0x43,
4547
+	0x8f, 0x78, 0xf2, 0x09, 0x14, 0xf1, 0x49, 0x8c, 0x61, 0xe4, 0xb1, 0xd0, 0x2a, 0x48, 0xf1, 0x6b,
4548
+	0x69, 0xe2, 0x66, 0x02, 0xb5, 0x32, 0xf4, 0x58, 0x21, 0x1c, 0x76, 0x58, 0xb8, 0xef, 0x75, 0xad,
4549
+	0xe2, 0x74, 0x87, 0x1b, 0x92, 0x10, 0x0e, 0x2b, 0xb6, 0x5e, 0x48, 0x72, 0x5f, 0xdd, 0x82, 0xb9,
4550
+	0x6d, 0xf4, 0xd1, 0x89, 0xeb, 0x87, 0xdb, 0x3e, 0x8b, 0xc9, 0x6d, 0x00, 0x9d, 0xad, 0x8e, 0xe7,
4551
+	0xca, 0x8a, 0x28, 0xd6, 0xe7, 0xc7, 0xa3, 0xa5, 0xa2, 0x4e, 0x67, 0x7b, 0x8d, 0x16, 0x35, 0xd0,
4552
+	0x76, 0x09, 0x81, 0x5c, 0xe4, 0xb3, 0x58, 0x96, 0x41, 0x8e, 0xca, 0x75, 0x75, 0x0b, 0x2e, 0x26,
4553
+	0x16, 0x1b, 0x83, 0x28, 0x66, 0x81, 0xa0, 0x7a, 0x5e, 0xa8, 0xad, 0x51, 0xb9, 0x26, 0x8b, 0x30,
4554
+	0xe3, 0x85, 0x2e, 0x3e, 0x91, 0xd2, 0x22, 0x55, 0x0f, 0x62, 0x77, 0x68, 0xfb, 0x03, 0x94, 0xe5,
4555
+	0x51, 0xa4, 0xea, 0xa1, 0xfa, 0x97, 0x09, 0x85, 0xc4, 0x24, 0xb1, 0x20, 0x7b, 0xe4, 0x98, 0x39,
4556
+	0x1e, 0x2d, 0x65, 0xdb, 0x6b, 0xad, 0x0c, 0xcd, 0x7a, 0x2e, 0xb9, 0x05, 0x45, 0xcf, 0xed, 0xf4,
4557
+	0x39, 0xee, 0x7b, 0xda, 0x6c, 0x7d, 0x6e, 0x3c, 0x5a, 0x2a, 0xb4, 0xd7, 0xb6, 0xe4, 0x9e, 0x08,
4558
+	0xbb, 0xe7, 0xaa, 0x35, 0x59, 0x84, 0x5c, 0x68, 0x07, 0xfa, 0x20, 0x59, 0xd9, 0x76, 0x80, 0xe4,
4559
+	0x75, 0x98, 0x15, 0xbf, 0x89, 0x91, 0x9c, 0x7e, 0x09, 0x62, 0x53, 0x0b, 0xef, 0x83, 0xe9, 0xc8,
4560
+	0x6b, 0xe9, 0xca, 0xaa, 0xa6, 0x57, 0xc8, 0xc9, 0x00, 0xc8, 0xc0, 0xab, 0x50, 0xb4, 0x61, 0x5e,
4561
+	0xad, 0x92, 0x23, 0xcc, 0x57, 0x30, 0x32, 0xa7, 0xa4, 0xda, 0x91, 0xda, 0xa9, 0x4c, 0xe5, 0x53,
4562
+	0x32, 0x25, 0x2a, 0xe5, 0x38, 0x57, 0x6f, 0x42, 0x5e, 0x74, 0xaf, 0x80, 0x0b, 0x12, 0x86, 0xf1,
4563
+	0x68, 0xc9, 0x14, 0x8d, 0x2d, 0x49, 0x53, 0xbc, 0x6c, 0xbb, 0xe4, 0xae, 0x4e, 0xa9, 0x2a, 0xa7,
4564
+	0xca, 0x59, 0x8e, 0x89, 0x82, 0x11, 0xa1, 0x13, 0x3c, 0x59, 0x83, 0x79, 0x17, 0x23, 0x8f, 0xa3,
4565
+	0xdb, 0x89, 0x62, 0x3b, 0x46, 0x0b, 0x2a, 0xc6, 0x8d, 0x8b, 0xe9, 0xb5, 0x2c, 0x7a, 0x75, 0x5b,
4566
+	0x40, 0xe2, 0x52, 0x5a, 0x25, 0x9f, 0xc9, 0x0a, 0xe4, 0x38, 0xf3, 0xd1, 0x9a, 0x95, 0xe2, 0xeb,
4567
+	0xd3, 0x46, 0x11, 0x65, 0xbe, 0x1c, 0x47, 0x82, 0x25, 0x6d, 0x80, 0x00, 0x83, 0x3d, 0xe4, 0xd1,
4568
+	0x63, 0xaf, 0x6f, 0xcd, 0x49, 0xe5, 0xdb, 0xd3, 0x94, 0xdb, 0x7d, 0x74, 0x6a, 0xeb, 0x47, 0xb8,
4569
+	0x48, 0xee, 0xb1, 0x98, 0xac, 0xc3, 0x15, 0x8e, 0xfb, 0xc8, 0x31, 0x74, 0xd0, 0xed, 0xe8, 0xe9,
4570
+	0x23, 0x22, 0x36, 0x2f, 0x23, 0x76, 0x6d, 0x3c, 0x5a, 0xba, 0x4c, 0x8f, 0x00, 0x3d, 0xa8, 0x64,
4571
+	0xf8, 0x2e, 0xf3, 0x97, 0xb6, 0x5d, 0xf2, 0x39, 0x2c, 0x9e, 0x30, 0xa7, 0x86, 0x85, 0xb0, 0x76,
4572
+	0x51, 0x5a, 0xbb, 0x3a, 0x1e, 0x2d, 0x91, 0x63, 0x6b, 0x6a, 0xaa, 0x48, 0x63, 0x84, 0x4f, 0xee,
4573
+	0x8a, 0x86, 0x51, 0x4d, 0x74, 0x29, 0x29, 0x58, 0xd9, 0x46, 0xa7, 0x4f, 0x50, 0xdd, 0x2d, 0x4e,
4574
+	0x58, 0x48, 0x3b, 0x41, 0x8d, 0x81, 0xc9, 0x13, 0xf4, 0xae, 0x5b, 0xcf, 0x41, 0xb6, 0x7e, 0x58,
4575
+	0xfd, 0x23, 0x0b, 0x73, 0x8f, 0xc4, 0x07, 0x91, 0xe2, 0x97, 0x03, 0x8c, 0x62, 0xd2, 0x84, 0x3c,
4576
+	0x86, 0x31, 0xf7, 0x30, 0xb2, 0x8c, 0xca, 0x85, 0x1b, 0xb3, 0x2b, 0xb7, 0xd2, 0x62, 0x7b, 0x52,
4577
+	0xa2, 0x1e, 0x9a, 0x61, 0xcc, 0x0f, 0x69, 0xa2, 0x25, 0xf7, 0x61, 0x96, 0x63, 0x34, 0x08, 0xb0,
4578
+	0xb3, 0xcf, 0x59, 0x70, 0xd6, 0x87, 0xe3, 0x21, 0x72, 0x31, 0xda, 0x28, 0x28, 0xfe, 0x33, 0xce,
4579
+	0x02, 0x72, 0x1b, 0x88, 0x17, 0x3a, 0xfe, 0xc0, 0xc5, 0x0e, 0xf3, 0xdd, 0x8e, 0xfa, 0x8a, 0xca,
4580
+	0xe6, 0x2d, 0xd0, 0x05, 0xfd, 0x66, 0xd3, 0x77, 0xd5, 0x50, 0x2b, 0x7d, 0x6b, 0x00, 0x1c, 0xfb,
4581
+	0x90, 0x3a, 0x7f, 0x3e, 0x06, 0xd3, 0x76, 0x62, 0x31, 0x73, 0xb3, 0xb2, 0x60, 0xde, 0x98, 0x7a,
4582
+	0xa9, 0x55, 0x89, 0x3d, 0xf0, 0x42, 0x97, 0x6a, 0x09, 0xb9, 0x0b, 0xf9, 0x7d, 0xcf, 0x8f, 0x91,
4583
+	0x47, 0xd6, 0x05, 0x19, 0x92, 0xeb, 0x67, 0xb5, 0x09, 0x4d, 0xe0, 0xea, 0x2f, 0x49, 0x6c, 0xd7,
4584
+	0x31, 0x8a, 0xec, 0x2e, 0x92, 0x4f, 0xc1, 0xc4, 0x21, 0x86, 0x71, 0x12, 0xda, 0xb7, 0xa6, 0x7a,
4585
+	0xa1, 0x15, 0xb5, 0xa6, 0xc0, 0xa9, 0x56, 0x91, 0x0f, 0x20, 0x3f, 0x54, 0xd1, 0xfa, 0x2f, 0x01,
4586
+	0x4d, 0xd8, 0xd2, 0x4f, 0x06, 0xcc, 0x48, 0x43, 0x27, 0xc2, 0x60, 0xbc, 0x7a, 0x18, 0x56, 0xc0,
4587
+	0xd4, 0x89, 0xc8, 0x4e, 0xff, 0xf6, 0xa8, 0x94, 0x50, 0x4d, 0x92, 0x0f, 0x01, 0x26, 0x12, 0x78,
4588
+	0xb6, 0xae, 0xc8, 0x92, 0xac, 0xde, 0xfc, 0xc7, 0x80, 0x4b, 0x13, 0xae, 0x90, 0x3b, 0xb0, 0xf8,
4589
+	0x68, 0x75, 0xa7, 0xd1, 0xea, 0xac, 0x36, 0x76, 0xda, 0x9b, 0x1b, 0x9d, 0xdd, 0x8d, 0x07, 0x1b,
4590
+	0x9b, 0x8f, 0x36, 0x16, 0x32, 0xa5, 0xd2, 0xd3, 0x67, 0x95, 0xab, 0x13, 0xf8, 0x6e, 0xd8, 0x0b,
4591
+	0xd9, 0x81, 0x70, 0xfc, 0xf2, 0x29, 0x55, 0x83, 0x36, 0x57, 0x77, 0x9a, 0x0b, 0x46, 0xe9, 0x7f,
4592
+	0x4f, 0x9f, 0x55, 0xae, 0x4c, 0x88, 0x1a, 0x1c, 0xd5, 0x64, 0x3a, 0xad, 0xd9, 0xdd, 0x5a, 0x13,
4593
+	0x9a, 0x6c, 0xaa, 0x66, 0xb7, 0xef, 0xa6, 0x69, 0x68, 0x73, 0x7d, 0xf3, 0x61, 0x73, 0x21, 0x97,
4594
+	0xaa, 0xa1, 0x18, 0xb0, 0x21, 0x96, 0xae, 0x7d, 0xf3, 0x7d, 0x39, 0xf3, 0xf3, 0x0f, 0xe5, 0xc9,
4595
+	0xab, 0xae, 0x04, 0x30, 0x23, 0xb7, 0x88, 0x9b, 0x2c, 0x2a, 0xe7, 0x35, 0x62, 0xa9, 0x72, 0x5e,
4596
+	0x3d, 0x55, 0xaf, 0xfc, 0xfa, 0xe3, 0xdf, 0xdf, 0x65, 0x2f, 0xc1, 0xbc, 0x24, 0xde, 0x09, 0xec,
4597
+	0xd0, 0xee, 0x22, 0x7f, 0xd7, 0xa8, 0x5b, 0xcf, 0x5f, 0x94, 0x33, 0xbf, 0xbf, 0x28, 0x67, 0xbe,
4598
+	0x1a, 0x97, 0x8d, 0xe7, 0xe3, 0xb2, 0xf1, 0xdb, 0xb8, 0x6c, 0xfc, 0x39, 0x2e, 0x1b, 0x7b, 0xa6,
4599
+	0xfc, 0x03, 0xf9, 0xfe, 0xbf, 0x01, 0x00, 0x00, 0xff, 0xff, 0xe6, 0x76, 0x89, 0xef, 0x57, 0x0b,
4600
+	0x00, 0x00,
4599 4601
 }
... ...
@@ -2,11 +2,11 @@ syntax = "proto3";
2 2
 
3 3
 package docker.swarmkit.v1;
4 4
 
5
-import "specs.proto";
6
-import "objects.proto";
7
-import "types.proto";
5
+import "github.com/docker/swarmkit/api/specs.proto";
6
+import "github.com/docker/swarmkit/api/objects.proto";
7
+import "github.com/docker/swarmkit/api/types.proto";
8 8
 import "gogoproto/gogo.proto";
9
-import "plugin/plugin.proto";
9
+import "github.com/docker/swarmkit/protobuf/plugin/plugin.proto";
10 10
 
11 11
 message Object {
12 12
 	oneof Object {
... ...
@@ -68,14 +68,11 @@ type SecurityConfig struct {
68 68
 	renewalMu sync.Mutex
69 69
 
70 70
 	rootCA        *RootCA
71
-	externalCA    *ExternalCA
72 71
 	keyReadWriter *KeyReadWriter
73 72
 
74 73
 	certificate *tls.Certificate
75 74
 	issuerInfo  *IssuerInfo
76 75
 
77
-	externalCAClientRootPool *x509.CertPool
78
-
79 76
 	ServerTLSCreds *MutableTLSCreds
80 77
 	ClientTLSCreds *MutableTLSCreds
81 78
 
... ...
@@ -90,7 +87,7 @@ type CertificateUpdate struct {
90 90
 	Err  error
91 91
 }
92 92
 
93
-func validateRootCAAndTLSCert(rootCA *RootCA, externalCARootPool *x509.CertPool, tlsKeyPair *tls.Certificate) error {
93
+func validateRootCAAndTLSCert(rootCA *RootCA, tlsKeyPair *tls.Certificate) error {
94 94
 	var (
95 95
 		leafCert         *x509.Certificate
96 96
 		intermediatePool *x509.CertPool
... ...
@@ -116,10 +113,6 @@ func validateRootCAAndTLSCert(rootCA *RootCA, externalCARootPool *x509.CertPool,
116 116
 	if _, err := leafCert.Verify(opts); err != nil {
117 117
 		return errors.Wrap(err, "new root CA does not match existing TLS credentials")
118 118
 	}
119
-	opts.Roots = externalCARootPool
120
-	if _, err := leafCert.Verify(opts); err != nil {
121
-		return errors.Wrap(err, "new external root pool does not match existing TLS credentials")
122
-	}
123 119
 	return nil
124 120
 }
125 121
 
... ...
@@ -139,16 +132,7 @@ func NewSecurityConfig(rootCA *RootCA, krw *KeyReadWriter, tlsKeyPair *tls.Certi
139 139
 		return nil, nil, err
140 140
 	}
141 141
 
142
-	// Make a new TLS config for the external CA client without a
143
-	// ServerName value set.
144
-	externalCATLSConfig := &tls.Config{
145
-		Certificates: []tls.Certificate{*tlsKeyPair},
146
-		RootCAs:      rootCA.Pool,
147
-		MinVersion:   tls.VersionTLS12,
148
-	}
149
-
150 142
 	q := watch.NewQueue()
151
-
152 143
 	return &SecurityConfig{
153 144
 		rootCA:        rootCA,
154 145
 		keyReadWriter: krw,
... ...
@@ -157,10 +141,8 @@ func NewSecurityConfig(rootCA *RootCA, krw *KeyReadWriter, tlsKeyPair *tls.Certi
157 157
 		issuerInfo:  issuerInfo,
158 158
 		queue:       q,
159 159
 
160
-		externalCA:               NewExternalCA(rootCA, externalCATLSConfig),
161
-		ClientTLSCreds:           clientTLSCreds,
162
-		ServerTLSCreds:           serverTLSCreds,
163
-		externalCAClientRootPool: rootCA.Pool,
160
+		ClientTLSCreds: clientTLSCreds,
161
+		ServerTLSCreds: serverTLSCreds,
164 162
 	}, q.Close, nil
165 163
 }
166 164
 
... ...
@@ -172,11 +154,6 @@ func (s *SecurityConfig) RootCA() *RootCA {
172 172
 	return s.rootCA
173 173
 }
174 174
 
175
-// ExternalCA returns the external CA.
176
-func (s *SecurityConfig) ExternalCA() *ExternalCA {
177
-	return s.externalCA
178
-}
179
-
180 175
 // KeyWriter returns the object that can write keys to disk
181 176
 func (s *SecurityConfig) KeyWriter() KeyWriter {
182 177
 	return s.keyReadWriter
... ...
@@ -188,19 +165,16 @@ func (s *SecurityConfig) KeyReader() KeyReader {
188 188
 }
189 189
 
190 190
 // UpdateRootCA replaces the root CA with a new root CA
191
-func (s *SecurityConfig) UpdateRootCA(rootCA *RootCA, externalCARootPool *x509.CertPool) error {
191
+func (s *SecurityConfig) UpdateRootCA(rootCA *RootCA) error {
192 192
 	s.mu.Lock()
193 193
 	defer s.mu.Unlock()
194 194
 
195 195
 	// refuse to update the root CA if the current TLS credentials do not validate against it
196
-	if err := validateRootCAAndTLSCert(rootCA, externalCARootPool, s.certificate); err != nil {
196
+	if err := validateRootCAAndTLSCert(rootCA, s.certificate); err != nil {
197 197
 		return err
198 198
 	}
199 199
 
200 200
 	s.rootCA = rootCA
201
-	s.externalCAClientRootPool = externalCARootPool
202
-	s.externalCA.UpdateRootCA(rootCA)
203
-
204 201
 	return s.updateTLSCredentials(s.certificate, s.issuerInfo)
205 202
 }
206 203
 
... ...
@@ -233,14 +207,6 @@ func (s *SecurityConfig) updateTLSCredentials(certificate *tls.Certificate, issu
233 233
 		return errors.Wrap(err, "failed to update the client credentials")
234 234
 	}
235 235
 
236
-	// Update the external CA to use the new client TLS
237
-	// config using a copy without a serverName specified.
238
-	s.externalCA.UpdateTLSConfig(&tls.Config{
239
-		Certificates: certs,
240
-		RootCAs:      s.externalCAClientRootPool,
241
-		MinVersion:   tls.VersionTLS12,
242
-	})
243
-
244 236
 	if err := s.ServerTLSCreds.loadNewTLSConfig(serverConfig); err != nil {
245 237
 		return errors.Wrap(err, "failed to update the server TLS credentials")
246 238
 	}
... ...
@@ -507,7 +473,7 @@ func updateRootThenUpdateCert(ctx context.Context, s *SecurityConfig, connBroker
507 507
 		return nil, nil, err
508 508
 	}
509 509
 	// validate against the existing security config creds
510
-	if err := s.UpdateRootCA(&rootCA, rootCA.Pool); err != nil {
510
+	if err := s.UpdateRootCA(&rootCA); err != nil {
511 511
 		return nil, nil, err
512 512
 	}
513 513
 	if err := SaveRootCA(rootCA, rootPaths); err != nil {
... ...
@@ -47,18 +47,28 @@ var ErrNoExternalCAURLs = errors.New("no external CA URLs")
47 47
 type ExternalCA struct {
48 48
 	ExternalRequestTimeout time.Duration
49 49
 
50
-	mu     sync.Mutex
51
-	rootCA *RootCA
52
-	urls   []string
53
-	client *http.Client
50
+	mu            sync.Mutex
51
+	intermediates []byte
52
+	urls          []string
53
+	client        *http.Client
54
+}
55
+
56
+// NewExternalCATLSConfig takes a TLS certificate and root pool and returns a TLS config that can be updated
57
+// without killing existing connections
58
+func NewExternalCATLSConfig(certs []tls.Certificate, rootPool *x509.CertPool) *tls.Config {
59
+	return &tls.Config{
60
+		Certificates: certs,
61
+		RootCAs:      rootPool,
62
+		MinVersion:   tls.VersionTLS12,
63
+	}
54 64
 }
55 65
 
56 66
 // NewExternalCA creates a new ExternalCA which uses the given tlsConfig to
57 67
 // authenticate to any of the given URLS of CFSSL API endpoints.
58
-func NewExternalCA(rootCA *RootCA, tlsConfig *tls.Config, urls ...string) *ExternalCA {
68
+func NewExternalCA(intermediates []byte, tlsConfig *tls.Config, urls ...string) *ExternalCA {
59 69
 	return &ExternalCA{
60 70
 		ExternalRequestTimeout: 5 * time.Second,
61
-		rootCA:                 rootCA,
71
+		intermediates:          intermediates,
62 72
 		urls:                   urls,
63 73
 		client: &http.Client{
64 74
 			Transport: &http.Transport{
... ...
@@ -68,19 +78,6 @@ func NewExternalCA(rootCA *RootCA, tlsConfig *tls.Config, urls ...string) *Exter
68 68
 	}
69 69
 }
70 70
 
71
-// Copy returns a copy of the external CA that can be updated independently
72
-func (eca *ExternalCA) Copy() *ExternalCA {
73
-	eca.mu.Lock()
74
-	defer eca.mu.Unlock()
75
-
76
-	return &ExternalCA{
77
-		ExternalRequestTimeout: eca.ExternalRequestTimeout,
78
-		rootCA:                 eca.rootCA,
79
-		urls:                   eca.urls,
80
-		client:                 eca.client,
81
-	}
82
-}
83
-
84 71
 // UpdateTLSConfig updates the HTTP Client for this ExternalCA by creating
85 72
 // a new client which uses the given tlsConfig.
86 73
 func (eca *ExternalCA) UpdateTLSConfig(tlsConfig *tls.Config) {
... ...
@@ -102,13 +99,6 @@ func (eca *ExternalCA) UpdateURLs(urls ...string) {
102 102
 	eca.urls = urls
103 103
 }
104 104
 
105
-// UpdateRootCA changes the root CA used to append intermediates
106
-func (eca *ExternalCA) UpdateRootCA(rca *RootCA) {
107
-	eca.mu.Lock()
108
-	eca.rootCA = rca
109
-	eca.mu.Unlock()
110
-}
111
-
112 105
 // Sign signs a new certificate by proxying the given certificate signing
113 106
 // request to an external CFSSL API server.
114 107
 func (eca *ExternalCA) Sign(ctx context.Context, req signer.SignRequest) (cert []byte, err error) {
... ...
@@ -117,7 +107,7 @@ func (eca *ExternalCA) Sign(ctx context.Context, req signer.SignRequest) (cert [
117 117
 	eca.mu.Lock()
118 118
 	urls := eca.urls
119 119
 	client := eca.client
120
-	intermediates := eca.rootCA.Intermediates
120
+	intermediates := eca.intermediates
121 121
 	eca.mu.Unlock()
122 122
 
123 123
 	if len(urls) == 0 {
... ...
@@ -25,13 +25,6 @@ const (
25 25
 	defaultRootReconciliationInterval  = 3 * time.Second
26 26
 )
27 27
 
28
-// APISecurityConfigUpdater knows how to update a SecurityConfig from an api.Cluster object
29
-type APISecurityConfigUpdater interface {
30
-	UpdateRootCA(ctx context.Context, cluster *api.Cluster) error
31
-}
32
-
33
-var _ APISecurityConfigUpdater = &Server{}
34
-
35 28
 // Server is the CA and NodeCA API gRPC server.
36 29
 // TODO(aaronl): At some point we may want to have separate implementations of
37 30
 // CA, NodeCA, and other hypothetical future CA services. At the moment,
... ...
@@ -43,6 +36,10 @@ type Server struct {
43 43
 	cancel                      func()
44 44
 	store                       *store.MemoryStore
45 45
 	securityConfig              *SecurityConfig
46
+	clusterID                   string
47
+	localRootCA                 *RootCA
48
+	externalCA                  *ExternalCA
49
+	externalCAPool              *x509.CertPool
46 50
 	joinTokens                  *api.JoinTokens
47 51
 	reconciliationRetryInterval time.Duration
48 52
 
... ...
@@ -60,10 +57,12 @@ type Server struct {
60 60
 	// the security config as a result
61 61
 	lastSeenClusterRootCA *api.RootCA
62 62
 	lastSeenExternalCAs   []*api.ExternalCA
63
-	secConfigMu           sync.Mutex
64 63
 
65
-	// before we update the security config with the new root CA, we need to be able to save the root certs
66
-	rootPaths CertPaths
64
+	// This mutex protects the components of the CA server used to issue new certificates
65
+	// (and any attributes used to update those components): `lastSeenClusterRootCA` and
66
+	// `lastSeenExternalCA`, which are used to update `externalCA` and the `rootCA` object
67
+	// of the SecurityConfig
68
+	signingMu sync.Mutex
67 69
 
68 70
 	// lets us monitor and finish root rotations
69 71
 	rootReconciler                  *rootRotationReconciler
... ...
@@ -78,18 +77,36 @@ func DefaultCAConfig() api.CAConfig {
78 78
 }
79 79
 
80 80
 // NewServer creates a CA API server.
81
-func NewServer(store *store.MemoryStore, securityConfig *SecurityConfig, rootCAPaths CertPaths) *Server {
81
+func NewServer(store *store.MemoryStore, securityConfig *SecurityConfig) *Server {
82 82
 	return &Server{
83 83
 		store:                           store,
84 84
 		securityConfig:                  securityConfig,
85
+		localRootCA:                     securityConfig.RootCA(),
86
+		externalCA:                      NewExternalCA(nil, nil),
85 87
 		pending:                         make(map[string]*api.Node),
86 88
 		started:                         make(chan struct{}),
87 89
 		reconciliationRetryInterval:     defaultReconciliationRetryInterval,
88 90
 		rootReconciliationRetryInterval: defaultRootReconciliationInterval,
89
-		rootPaths:                       rootCAPaths,
91
+		clusterID:                       securityConfig.ClientTLSCreds.Organization(),
90 92
 	}
91 93
 }
92 94
 
95
+// ExternalCA returns the current external CA - this is exposed to support unit testing only, and the external CA
96
+// should really be a private field
97
+func (s *Server) ExternalCA() *ExternalCA {
98
+	s.signingMu.Lock()
99
+	defer s.signingMu.Unlock()
100
+	return s.externalCA
101
+}
102
+
103
+// RootCA returns the current local root CA - this is exposed to support unit testing only, and the root CA
104
+// should really be a private field
105
+func (s *Server) RootCA() *RootCA {
106
+	s.signingMu.Lock()
107
+	defer s.signingMu.Unlock()
108
+	return s.localRootCA
109
+}
110
+
93 111
 // SetReconciliationRetryInterval changes the time interval between
94 112
 // reconciliation attempts. This function must be called before Run.
95 113
 func (s *Server) SetReconciliationRetryInterval(reconciliationRetryInterval time.Duration) {
... ...
@@ -114,7 +131,7 @@ func (s *Server) GetUnlockKey(ctx context.Context, request *api.GetUnlockKeyRequ
114 114
 	// a cached value.
115 115
 	resp := api.GetUnlockKeyResponse{}
116 116
 	s.store.View(func(tx store.ReadTx) {
117
-		cluster := store.GetCluster(tx, s.securityConfig.ClientTLSCreds.Organization())
117
+		cluster := store.GetCluster(tx, s.clusterID)
118 118
 		resp.Version = cluster.Meta.Version
119 119
 		if cluster.Spec.EncryptionConfig.AutoLockManagers {
120 120
 			for _, encryptionKey := range cluster.UnlockKeys {
... ...
@@ -222,7 +239,7 @@ func (s *Server) IssueNodeCertificate(ctx context.Context, request *api.IssueNod
222 222
 		return nil, grpc.Errorf(codes.InvalidArgument, codes.InvalidArgument.String())
223 223
 	}
224 224
 
225
-	if _, err := s.isRunningLocked(); err != nil {
225
+	if err := s.isReadyLocked(); err != nil {
226 226
 		return nil, err
227 227
 	}
228 228
 
... ...
@@ -233,8 +250,7 @@ func (s *Server) IssueNodeCertificate(ctx context.Context, request *api.IssueNod
233 233
 	)
234 234
 
235 235
 	s.store.View(func(readTx store.ReadTx) {
236
-		clusters, err = store.FindClusters(readTx, store.ByName("default"))
237
-
236
+		clusters, err = store.FindClusters(readTx, store.ByName(store.DefaultClusterName))
238 237
 	})
239 238
 
240 239
 	// Not having a cluster object yet means we can't check
... ...
@@ -254,14 +270,14 @@ func (s *Server) IssueNodeCertificate(ctx context.Context, request *api.IssueNod
254 254
 
255 255
 	// If the remote node is a worker (either forwarded by a manager, or calling directly),
256 256
 	// issue a renew worker certificate entry with the correct ID
257
-	nodeID, err := AuthorizeForwardedRoleAndOrg(ctx, []string{WorkerRole}, []string{ManagerRole}, s.securityConfig.ClientTLSCreds.Organization(), blacklistedCerts)
257
+	nodeID, err := AuthorizeForwardedRoleAndOrg(ctx, []string{WorkerRole}, []string{ManagerRole}, s.clusterID, blacklistedCerts)
258 258
 	if err == nil {
259 259
 		return s.issueRenewCertificate(ctx, nodeID, request.CSR)
260 260
 	}
261 261
 
262 262
 	// If the remote node is a manager (either forwarded by another manager, or calling directly),
263 263
 	// issue a renew certificate entry with the correct ID
264
-	nodeID, err = AuthorizeForwardedRoleAndOrg(ctx, []string{ManagerRole}, []string{ManagerRole}, s.securityConfig.ClientTLSCreds.Organization(), blacklistedCerts)
264
+	nodeID, err = AuthorizeForwardedRoleAndOrg(ctx, []string{ManagerRole}, []string{ManagerRole}, s.clusterID, blacklistedCerts)
265 265
 	if err == nil {
266 266
 		return s.issueRenewCertificate(ctx, nodeID, request.CSR)
267 267
 	}
... ...
@@ -393,8 +409,11 @@ func (s *Server) GetRootCACertificate(ctx context.Context, request *api.GetRootC
393 393
 		"method": "GetRootCACertificate",
394 394
 	})
395 395
 
396
+	s.signingMu.Lock()
397
+	defer s.signingMu.Unlock()
398
+
396 399
 	return &api.GetRootCACertificateResponse{
397
-		Certificate: s.securityConfig.RootCA().Certs,
400
+		Certificate: s.localRootCA.Certs,
398 401
 	}, nil
399 402
 }
400 403
 
... ...
@@ -409,47 +428,51 @@ func (s *Server) Run(ctx context.Context) error {
409 409
 	s.wg.Add(1)
410 410
 	s.ctx, s.cancel = context.WithCancel(log.WithModule(ctx, "ca"))
411 411
 	ctx = s.ctx
412
-	// we need to set it on the server, because `Server.UpdateRootCA` can be called from outside the Run function
413
-	s.rootReconciler = &rootRotationReconciler{
414
-		ctx:                 log.WithField(ctx, "method", "(*Server).rootRotationReconciler"),
415
-		clusterID:           s.securityConfig.ClientTLSCreds.Organization(),
416
-		store:               s.store,
417
-		batchUpdateInterval: s.rootReconciliationRetryInterval,
418
-	}
419
-	rootReconciler := s.rootReconciler
420 412
 	s.mu.Unlock()
421 413
 	defer s.wg.Done()
422 414
 	defer func() {
423 415
 		s.mu.Lock()
424
-		s.rootReconciler = nil
425 416
 		s.mu.Unlock()
426 417
 	}()
427 418
 
428 419
 	// Retrieve the channels to keep track of changes in the cluster
429 420
 	// Retrieve all the currently registered nodes
430
-	var nodes []*api.Node
431
-
421
+	var (
422
+		nodes   []*api.Node
423
+		cluster *api.Cluster
424
+		err     error
425
+	)
432 426
 	updates, cancel, err := store.ViewAndWatch(
433 427
 		s.store,
434 428
 		func(readTx store.ReadTx) error {
435
-			clusters, err := store.FindClusters(readTx, store.ByName(store.DefaultClusterName))
436
-			if err != nil {
437
-				return err
438
-			}
439
-			if len(clusters) != 1 {
429
+			cluster = store.GetCluster(readTx, s.clusterID)
430
+			if cluster == nil {
440 431
 				return errors.New("could not find cluster object")
441 432
 			}
442
-			s.UpdateRootCA(ctx, clusters[0]) // call once to ensure that the join tokens are always set
443 433
 			nodes, err = store.FindNodes(readTx, store.All)
444 434
 			return err
445 435
 		},
446 436
 		api.EventCreateNode{},
447 437
 		api.EventUpdateNode{},
448 438
 		api.EventDeleteNode{},
439
+		api.EventUpdateCluster{
440
+			Cluster: &api.Cluster{ID: s.clusterID},
441
+			Checks:  []api.ClusterCheckFunc{api.ClusterCheckID},
442
+		},
449 443
 	)
450 444
 
451
-	// Do this after updateCluster has been called, so isRunning never
452
-	// returns true without joinTokens being set correctly.
445
+	// call once to ensure that the join tokens and local/external CA signer are always set
446
+	rootReconciler := &rootRotationReconciler{
447
+		ctx:                 log.WithField(ctx, "method", "(*Server).rootRotationReconciler"),
448
+		clusterID:           s.clusterID,
449
+		store:               s.store,
450
+		batchUpdateInterval: s.rootReconciliationRetryInterval,
451
+	}
452
+
453
+	s.UpdateRootCA(ctx, cluster, rootReconciler)
454
+
455
+	// Do this after updateCluster has been called, so Ready() and isRunning never returns true without
456
+	// the join tokens and external CA/security config's root CA being set correctly
453 457
 	s.mu.Lock()
454 458
 	close(s.started)
455 459
 	s.mu.Unlock()
... ...
@@ -475,6 +498,9 @@ func (s *Server) Run(ctx context.Context) error {
475 475
 	ticker := time.NewTicker(s.reconciliationRetryInterval)
476 476
 	defer ticker.Stop()
477 477
 
478
+	externalTLSCredsChange, externalTLSWatchCancel := s.securityConfig.Watch()
479
+	defer externalTLSWatchCancel()
480
+
478 481
 	// Watch for new nodes being created, new nodes being updated, and changes
479 482
 	// to the cluster
480 483
 	for {
... ...
@@ -499,8 +525,29 @@ func (s *Server) Run(ctx context.Context) error {
499 499
 				rootReconciler.UpdateNode(v.Node)
500 500
 			case api.EventDeleteNode:
501 501
 				rootReconciler.DeleteNode(v.Node)
502
+			case api.EventUpdateCluster:
503
+				if v.Cluster.ID == s.clusterID {
504
+					s.UpdateRootCA(ctx, v.Cluster, rootReconciler)
505
+				}
502 506
 			}
503
-
507
+		case <-externalTLSCredsChange:
508
+			// The TLS certificates can rotate independently of the root CA (and hence which roots the
509
+			// external CA trusts) and external CA URLs.  It's possible that the root CA update is received
510
+			// before the external TLS cred change notification.  During that period, it is possible that
511
+			// the TLS creds will expire or otherwise fail to authorize against external CAs.  However, in
512
+			// that case signing will just fail with a recoverable connectivity error - the state of the
513
+			// certificate issuance is left as pending, and on the next tick, the server will try to sign
514
+			// all nodes with pending certs again (by which time the TLS cred change will have been
515
+			// received).
516
+
517
+			// Note that if the external CA changes, the new external CA *MUST* trust the current server's
518
+			// certificate issuer, and this server's certificates should not be extremely close to expiry,
519
+			// otherwise this server would not be able to get new TLS certificates and will no longer be
520
+			// able to function.
521
+			s.signingMu.Lock()
522
+			s.externalCA.UpdateTLSConfig(NewExternalCATLSConfig(
523
+				s.securityConfig.ClientTLSCreds.Config().Certificates, s.externalCAPool))
524
+			s.signingMu.Unlock()
504 525
 		case <-ticker.C:
505 526
 			for _, node := range s.pending {
506 527
 				if err := s.evaluateAndSignNodeCert(ctx, node); err != nil {
... ...
@@ -527,6 +574,7 @@ func (s *Server) Stop() error {
527 527
 	}
528 528
 	s.cancel()
529 529
 	s.started = make(chan struct{})
530
+	s.joinTokens = nil
530 531
 	s.mu.Unlock()
531 532
 
532 533
 	// Wait for Run to complete
... ...
@@ -553,6 +601,18 @@ func (s *Server) isRunningLocked() (context.Context, error) {
553 553
 	return ctx, nil
554 554
 }
555 555
 
556
+func (s *Server) isReadyLocked() error {
557
+	s.mu.Lock()
558
+	defer s.mu.Unlock()
559
+	if !s.isRunning() {
560
+		return grpc.Errorf(codes.Aborted, "CA signer is stopped")
561
+	}
562
+	if s.joinTokens == nil {
563
+		return grpc.Errorf(codes.Aborted, "CA signer is still starting")
564
+	}
565
+	return nil
566
+}
567
+
556 568
 func (s *Server) isRunning() bool {
557 569
 	if s.ctx == nil {
558 570
 		return false
... ...
@@ -565,33 +625,59 @@ func (s *Server) isRunning() bool {
565 565
 	return true
566 566
 }
567 567
 
568
+// filterExternalCAURLS returns a list of external CA urls filtered by the desired cert.
569
+func filterExternalCAURLS(ctx context.Context, desiredCert, defaultCert []byte, apiExternalCAs []*api.ExternalCA) (urls []string) {
570
+	desiredCert = NormalizePEMs(desiredCert)
571
+
572
+	// TODO(aaronl): In the future, this will be abstracted with an ExternalCA interface that has different
573
+	// implementations for different CA types. At the moment, only CFSSL is supported.
574
+	for i, extCA := range apiExternalCAs {
575
+		// We want to support old external CA specifications which did not have a CA cert.  If there is no cert specified,
576
+		// we assume it's the old cert
577
+		certForExtCA := extCA.CACert
578
+		if len(certForExtCA) == 0 {
579
+			certForExtCA = defaultCert
580
+		}
581
+		certForExtCA = NormalizePEMs(certForExtCA)
582
+		if extCA.Protocol != api.ExternalCA_CAProtocolCFSSL {
583
+			log.G(ctx).Debugf("skipping external CA %d (url: %s) due to unknown protocol type", i, extCA.URL)
584
+			continue
585
+		}
586
+		if !bytes.Equal(certForExtCA, desiredCert) {
587
+			log.G(ctx).Debugf("skipping external CA %d (url: %s) because it has the wrong CA cert", i, extCA.URL)
588
+			continue
589
+		}
590
+		urls = append(urls, extCA.URL)
591
+	}
592
+	return
593
+}
594
+
568 595
 // UpdateRootCA is called when there are cluster changes, and it ensures that the local RootCA is
569 596
 // always aware of changes in clusterExpiry and the Root CA key material - this can be called by
570 597
 // anything to update the root CA material
571
-func (s *Server) UpdateRootCA(ctx context.Context, cluster *api.Cluster) error {
598
+func (s *Server) UpdateRootCA(ctx context.Context, cluster *api.Cluster, reconciler *rootRotationReconciler) error {
572 599
 	s.mu.Lock()
573 600
 	s.joinTokens = cluster.RootCA.JoinTokens.Copy()
574
-	reconciler := s.rootReconciler
575 601
 	s.mu.Unlock()
576 602
 	rCA := cluster.RootCA.Copy()
577 603
 	if reconciler != nil {
578 604
 		reconciler.UpdateRootCA(rCA)
579 605
 	}
580 606
 
581
-	s.secConfigMu.Lock()
582
-	defer s.secConfigMu.Unlock()
607
+	s.signingMu.Lock()
608
+	defer s.signingMu.Unlock()
583 609
 	firstSeenCluster := s.lastSeenClusterRootCA == nil && s.lastSeenExternalCAs == nil
584 610
 	rootCAChanged := len(rCA.CACert) != 0 && !equality.RootCAEqualStable(s.lastSeenClusterRootCA, rCA)
585 611
 	externalCAChanged := !equality.ExternalCAsEqualStable(s.lastSeenExternalCAs, cluster.Spec.CAConfig.ExternalCAs)
586
-	logger := log.G(ctx).WithFields(logrus.Fields{
612
+	ctx = log.WithLogger(ctx, log.G(ctx).WithFields(logrus.Fields{
587 613
 		"cluster.id": cluster.ID,
588 614
 		"method":     "(*Server).UpdateRootCA",
589
-	})
615
+	}))
590 616
 
591 617
 	if rootCAChanged {
592 618
 		setOrUpdate := "set"
593 619
 		if !firstSeenCluster {
594
-			logger.Debug("Updating security config due to change in cluster Root CA")
620
+			log.G(ctx).Debug("Updating signing root CA and external CA due to change in cluster Root CA")
595 621
 			setOrUpdate = "updated"
596 622
 		}
597 623
 		expiry := DefaultNodeCertExpiration
... ...
@@ -599,91 +685,55 @@ func (s *Server) UpdateRootCA(ctx context.Context, cluster *api.Cluster) error {
599 599
 			// NodeCertExpiry exists, let's try to parse the duration out of it
600 600
 			clusterExpiry, err := gogotypes.DurationFromProto(cluster.Spec.CAConfig.NodeCertExpiry)
601 601
 			if err != nil {
602
-				logger.WithError(err).Warn("failed to parse certificate expiration, using default")
602
+				log.G(ctx).WithError(err).Warn("failed to parse certificate expiration, using default")
603 603
 			} else {
604 604
 				// We were able to successfully parse the expiration out of the cluster.
605 605
 				expiry = clusterExpiry
606 606
 			}
607 607
 		} else {
608 608
 			// NodeCertExpiry seems to be nil
609
-			logger.Warn("no certificate expiration specified, using default")
609
+			log.G(ctx).Warn("no certificate expiration specified, using default")
610 610
 		}
611 611
 		// Attempt to update our local RootCA with the new parameters
612
-		var intermediates []byte
613
-		signingCert := rCA.CACert
614
-		signingKey := rCA.CAKey
615
-		if rCA.RootRotation != nil {
616
-			signingCert = rCA.RootRotation.CrossSignedCACert
617
-			signingKey = rCA.RootRotation.CAKey
618
-			intermediates = rCA.RootRotation.CrossSignedCACert
619
-		}
620
-		if signingKey == nil {
621
-			signingCert = nil
622
-		}
623
-		updatedRootCA, err := NewRootCA(rCA.CACert, signingCert, signingKey, expiry, intermediates)
612
+		updatedRootCA, err := RootCAFromAPI(ctx, rCA, expiry)
624 613
 		if err != nil {
625 614
 			return errors.Wrap(err, "invalid Root CA object in cluster")
626 615
 		}
627
-		externalCARootPool := updatedRootCA.Pool
616
+
617
+		s.localRootCA = &updatedRootCA
618
+		s.externalCAPool = updatedRootCA.Pool
619
+		externalCACert := rCA.CACert
628 620
 		if rCA.RootRotation != nil {
621
+			externalCACert = rCA.RootRotation.CACert
629 622
 			// the external CA has to trust the new CA cert
630
-			externalCARootPool = x509.NewCertPool()
631
-			externalCARootPool.AppendCertsFromPEM(rCA.CACert)
632
-			externalCARootPool.AppendCertsFromPEM(rCA.RootRotation.CACert)
623
+			s.externalCAPool = x509.NewCertPool()
624
+			s.externalCAPool.AppendCertsFromPEM(rCA.CACert)
625
+			s.externalCAPool.AppendCertsFromPEM(rCA.RootRotation.CACert)
633 626
 		}
627
+		s.lastSeenExternalCAs = cluster.Spec.CAConfig.Copy().ExternalCAs
628
+		urls := filterExternalCAURLS(ctx, externalCACert, rCA.CACert, s.lastSeenExternalCAs)
629
+		// Replace the external CA with the relevant intermediates, URLS, and TLS config
630
+		s.externalCA = NewExternalCA(updatedRootCA.Intermediates,
631
+			NewExternalCATLSConfig(s.securityConfig.ClientTLSCreds.Config().Certificates, s.externalCAPool), urls...)
634 632
 
635
-		// Attempt to update our local RootCA with the new parameters
636
-		if err := s.securityConfig.UpdateRootCA(&updatedRootCA, externalCARootPool); err != nil {
637
-			return errors.Wrap(err, "updating Root CA failed")
638
-		}
639
-		if err := SaveRootCA(updatedRootCA, s.rootPaths); err != nil {
640
-			return errors.Wrap(err, "unable to save new root CA certificates")
641
-		}
642 633
 		// only update the server cache if we've successfully updated the root CA
643
-		logger.Debugf("Root CA %s successfully", setOrUpdate)
634
+		log.G(ctx).Debugf("Root CA %s successfully", setOrUpdate)
644 635
 		s.lastSeenClusterRootCA = rCA
645
-	}
646
-
647
-	// we want to update if the external CA changed, or if the root CA changed because the root CA could affect what
648
-	// certificate for external CAs we want to filter by
649
-	if rootCAChanged || externalCAChanged {
636
+	} else if externalCAChanged {
637
+		// we want to update only if the external CA URLS have changed, since if the root CA has changed we already
638
+		// run similar logic
650 639
 		if !firstSeenCluster {
651
-			logger.Debug("Updating security config external CA URLs due to change in cluster Root CA or cluster spec")
640
+			log.G(ctx).Debug("Updating security config external CA URLs due to change in cluster spec's list of external CAs")
652 641
 		}
653 642
 		wantedExternalCACert := rCA.CACert // we want to only add external CA URLs that use this cert
654 643
 		if rCA.RootRotation != nil {
655 644
 			// we're rotating to a new root, so we only want external CAs with the new root cert
656 645
 			wantedExternalCACert = rCA.RootRotation.CACert
657 646
 		}
658
-		wantedExternalCACert = NormalizePEMs(wantedExternalCACert)
659
-		// Update our security config with the list of External CA URLs
660
-		// from the new cluster state.
661
-
662
-		// TODO(aaronl): In the future, this will be abstracted with an
663
-		// ExternalCA interface that has different implementations for
664
-		// different CA types. At the moment, only CFSSL is supported.
665
-		var cfsslURLs []string
666
-		for i, extCA := range cluster.Spec.CAConfig.ExternalCAs {
667
-			// We want to support old external CA specifications which did not have a CA cert.  If there is no cert specified,
668
-			// we assume it's the old cert
669
-			certForExtCA := extCA.CACert
670
-			if len(certForExtCA) == 0 {
671
-				certForExtCA = rCA.CACert
672
-			}
673
-			certForExtCA = NormalizePEMs(certForExtCA)
674
-			if extCA.Protocol != api.ExternalCA_CAProtocolCFSSL {
675
-				logger.Debugf("skipping external CA %d (url: %s) due to unknown protocol type", i, extCA.URL)
676
-				continue
677
-			}
678
-			if !bytes.Equal(certForExtCA, wantedExternalCACert) {
679
-				logger.Debugf("skipping external CA %d (url: %s) because it has the wrong CA cert", i, extCA.URL)
680
-				continue
681
-			}
682
-			cfsslURLs = append(cfsslURLs, extCA.URL)
683
-		}
684
-
685
-		s.securityConfig.externalCA.UpdateURLs(cfsslURLs...)
647
+		// Update our external CA with the list of External CA URLs from the new cluster state
686 648
 		s.lastSeenExternalCAs = cluster.Spec.CAConfig.Copy().ExternalCAs
649
+		urls := filterExternalCAURLS(ctx, wantedExternalCACert, rCA.CACert, s.lastSeenExternalCAs)
650
+		s.externalCA.UpdateURLs(urls...)
687 651
 	}
688 652
 	return nil
689 653
 }
... ...
@@ -714,8 +764,10 @@ func (s *Server) evaluateAndSignNodeCert(ctx context.Context, node *api.Node) er
714 714
 
715 715
 // signNodeCert does the bulk of the work for signing a certificate
716 716
 func (s *Server) signNodeCert(ctx context.Context, node *api.Node) error {
717
-	rootCA := s.securityConfig.RootCA()
718
-	externalCA := s.securityConfig.externalCA
717
+	s.signingMu.Lock()
718
+	rootCA := s.localRootCA
719
+	externalCA := s.externalCA
720
+	s.signingMu.Unlock()
719 721
 
720 722
 	node = node.Copy()
721 723
 	nodeID := node.ID
... ...
@@ -736,7 +788,7 @@ func (s *Server) signNodeCert(ctx context.Context, node *api.Node) error {
736 736
 		rawCSR = node.Certificate.CSR
737 737
 		cn     = node.Certificate.CN
738 738
 		ou     = role
739
-		org    = s.securityConfig.ClientTLSCreds.Organization()
739
+		org    = s.clusterID
740 740
 	)
741 741
 
742 742
 	// Try using the external CA first.
... ...
@@ -847,3 +899,19 @@ func isFinalState(status api.IssuanceStatus) bool {
847 847
 
848 848
 	return false
849 849
 }
850
+
851
+// RootCAFromAPI creates a RootCA object from an api.RootCA object
852
+func RootCAFromAPI(ctx context.Context, apiRootCA *api.RootCA, expiry time.Duration) (RootCA, error) {
853
+	var intermediates []byte
854
+	signingCert := apiRootCA.CACert
855
+	signingKey := apiRootCA.CAKey
856
+	if apiRootCA.RootRotation != nil {
857
+		signingCert = apiRootCA.RootRotation.CrossSignedCACert
858
+		signingKey = apiRootCA.RootRotation.CAKey
859
+		intermediates = apiRootCA.RootRotation.CrossSignedCACert
860
+	}
861
+	if signingKey == nil {
862
+		signingCert = nil
863
+	}
864
+	return NewRootCA(apiRootCA.CACert, signingCert, signingKey, expiry, intermediates)
865
+}
... ...
@@ -63,7 +63,6 @@ func newRootRotationObject(ctx context.Context, securityConfig *ca.SecurityConfi
63 63
 		return nil, grpc.Errorf(codes.InvalidArgument, "rotating from one external CA to a different external CA is not supported")
64 64
 	default:
65 65
 		// We need the same credentials but to connect to the original URLs (in case we are in the middle of a root rotation already)
66
-		externalCA := securityConfig.ExternalCA().Copy()
67 66
 		var urls []string
68 67
 		for _, c := range extCAs {
69 68
 			if c.Protocol == api.ExternalCA_CAProtocolCFSSL {
... ...
@@ -74,7 +73,11 @@ func newRootRotationObject(ctx context.Context, securityConfig *ca.SecurityConfi
74 74
 			return nil, grpc.Errorf(codes.InvalidArgument,
75 75
 				"must provide an external CA for the current external root CA to generate a cross-signed certificate")
76 76
 		}
77
-		externalCA.UpdateURLs(urls...)
77
+		rootPool := x509.NewCertPool()
78
+		rootPool.AppendCertsFromPEM(apiRootCA.CACert)
79
+
80
+		externalCAConfig := ca.NewExternalCATLSConfig(securityConfig.ClientTLSCreds.Config().Certificates, rootPool)
81
+		externalCA := ca.NewExternalCA(nil, externalCAConfig, urls...)
78 82
 		crossSignedCert, err = externalCA.CrossSignRootCA(ctx, newCARootCA)
79 83
 	}
80 84
 
... ...
@@ -104,17 +104,14 @@ func (s *Server) UpdateCluster(ctx context.Context, request *api.UpdateClusterRe
104 104
 		if cluster == nil {
105 105
 			return grpc.Errorf(codes.NotFound, "cluster %s not found", request.ClusterID)
106 106
 		}
107
-		// This ensures that we always have the latest security config, so our ca.SecurityConfig.RootCA and
108
-		// ca.SecurityConfig.externalCA objects are up-to-date with the current api.Cluster.RootCA and
109
-		// api.Cluster.Spec.ExternalCA objects, respectively.  Note that if, during this update, the cluster gets
110
-		// updated again with different CA info and the security config gets changed under us, that's still fine because
111
-		// this cluster update would fail anyway due to its version being too low on write.
112
-		if err := s.scu.UpdateRootCA(ctx, cluster); err != nil {
107
+		// This ensures that we have the current rootCA with which to generate tokens (expiration doesn't matter
108
+		// for generating the tokens)
109
+		rootCA, err := ca.RootCAFromAPI(ctx, &cluster.RootCA, ca.DefaultNodeCertExpiration)
110
+		if err != nil {
113 111
 			log.G(ctx).WithField(
114
-				"method", "(*controlapi.Server).UpdateCluster").WithError(err).Error("could not update security config")
115
-			return grpc.Errorf(codes.Internal, "could not update security config")
112
+				"method", "(*controlapi.Server).UpdateCluster").WithError(err).Error("invalid cluster root CA")
113
+			return grpc.Errorf(codes.Internal, "error loading cluster rootCA for update")
116 114
 		}
117
-		rootCA := s.securityConfig.RootCA()
118 115
 
119 116
 		cluster.Meta.Version = *request.ClusterVersion
120 117
 		cluster.Spec = *request.Spec.Copy()
... ...
@@ -122,10 +119,10 @@ func (s *Server) UpdateCluster(ctx context.Context, request *api.UpdateClusterRe
122 122
 		expireBlacklistedCerts(cluster)
123 123
 
124 124
 		if request.Rotation.WorkerJoinToken {
125
-			cluster.RootCA.JoinTokens.Worker = ca.GenerateJoinToken(rootCA)
125
+			cluster.RootCA.JoinTokens.Worker = ca.GenerateJoinToken(&rootCA)
126 126
 		}
127 127
 		if request.Rotation.ManagerJoinToken {
128
-			cluster.RootCA.JoinTokens.Manager = ca.GenerateJoinToken(rootCA)
128
+			cluster.RootCA.JoinTokens.Manager = ca.GenerateJoinToken(&rootCA)
129 129
 		}
130 130
 
131 131
 		updatedRootCA, err := validateCAConfig(ctx, s.securityConfig, cluster)
... ...
@@ -158,6 +158,12 @@ func (s *Server) CreateSecret(ctx context.Context, request *api.CreateSecretRequ
158 158
 		return nil, err
159 159
 	}
160 160
 
161
+	if request.Spec.Driver != nil { // Check that the requested driver is valid
162
+		if _, err := s.dr.NewSecretDriver(request.Spec.Driver); err != nil {
163
+			return nil, err
164
+		}
165
+	}
166
+
161 167
 	secret := secretFromSecretSpec(request.Spec) // the store will handle name conflicts
162 168
 	err := s.store.Update(func(tx store.Tx) error {
163 169
 		return store.CreateSecret(tx, secret)
... ...
@@ -5,6 +5,7 @@ import (
5 5
 
6 6
 	"github.com/docker/docker/pkg/plugingetter"
7 7
 	"github.com/docker/swarmkit/ca"
8
+	"github.com/docker/swarmkit/manager/drivers"
8 9
 	"github.com/docker/swarmkit/manager/state/raft"
9 10
 	"github.com/docker/swarmkit/manager/state/store"
10 11
 )
... ...
@@ -18,18 +19,17 @@ type Server struct {
18 18
 	store          *store.MemoryStore
19 19
 	raft           *raft.Node
20 20
 	securityConfig *ca.SecurityConfig
21
-	scu            ca.APISecurityConfigUpdater
22 21
 	pg             plugingetter.PluginGetter
22
+	dr             *drivers.DriverProvider
23 23
 }
24 24
 
25 25
 // NewServer creates a Cluster API server.
26
-func NewServer(store *store.MemoryStore, raft *raft.Node, securityConfig *ca.SecurityConfig,
27
-	scu ca.APISecurityConfigUpdater, pg plugingetter.PluginGetter) *Server {
26
+func NewServer(store *store.MemoryStore, raft *raft.Node, securityConfig *ca.SecurityConfig, pg plugingetter.PluginGetter, dr *drivers.DriverProvider) *Server {
28 27
 	return &Server{
29 28
 		store:          store,
29
+		dr:             dr,
30 30
 		raft:           raft,
31 31
 		securityConfig: securityConfig,
32
-		scu:            scu,
33 32
 		pg:             pg,
34 33
 	}
35 34
 }
... ...
@@ -11,20 +11,9 @@ import (
11 11
 	"github.com/sirupsen/logrus"
12 12
 )
13 13
 
14
-// Used as a key in tasksUsingDependency and changes. Only using the
15
-// ID could cause (rare) collisions between different types of
16
-// objects, so we also include the type of object in the key.
17
-type objectType int
18
-
19
-const (
20
-	typeTask objectType = iota
21
-	typeSecret
22
-	typeConfig
23
-)
24
-
25 14
 type typeAndID struct {
26 15
 	id      string
27
-	objType objectType
16
+	objType api.ResourceType
28 17
 }
29 18
 
30 19
 type assignmentSet struct {
... ...
@@ -45,39 +34,78 @@ func newAssignmentSet(log *logrus.Entry, dp *drivers.DriverProvider) *assignment
45 45
 	}
46 46
 }
47 47
 
48
+func assignSecret(a *assignmentSet, readTx store.ReadTx, mapKey typeAndID, t *api.Task) {
49
+	a.tasksUsingDependency[mapKey] = make(map[string]struct{})
50
+	secret, err := a.secret(readTx, t, mapKey.id)
51
+	if err != nil {
52
+		a.log.WithFields(logrus.Fields{
53
+			"resource.type": "secret",
54
+			"secret.id":     mapKey.id,
55
+			"error":         err,
56
+		}).Debug("failed to fetch secret")
57
+		return
58
+	}
59
+	a.changes[mapKey] = &api.AssignmentChange{
60
+		Assignment: &api.Assignment{
61
+			Item: &api.Assignment_Secret{
62
+				Secret: secret,
63
+			},
64
+		},
65
+		Action: api.AssignmentChange_AssignmentActionUpdate,
66
+	}
67
+}
68
+
69
+func assignConfig(a *assignmentSet, readTx store.ReadTx, mapKey typeAndID) {
70
+	a.tasksUsingDependency[mapKey] = make(map[string]struct{})
71
+	config := store.GetConfig(readTx, mapKey.id)
72
+	if config == nil {
73
+		a.log.WithFields(logrus.Fields{
74
+			"resource.type": "config",
75
+			"config.id":     mapKey.id,
76
+		}).Debug("config not found")
77
+		return
78
+	}
79
+	a.changes[mapKey] = &api.AssignmentChange{
80
+		Assignment: &api.Assignment{
81
+			Item: &api.Assignment_Config{
82
+				Config: config,
83
+			},
84
+		},
85
+		Action: api.AssignmentChange_AssignmentActionUpdate,
86
+	}
87
+}
88
+
48 89
 func (a *assignmentSet) addTaskDependencies(readTx store.ReadTx, t *api.Task) {
90
+	for _, resourceRef := range t.Spec.ResourceReferences {
91
+		mapKey := typeAndID{objType: resourceRef.ResourceType, id: resourceRef.ResourceID}
92
+		if len(a.tasksUsingDependency[mapKey]) == 0 {
93
+			switch resourceRef.ResourceType {
94
+			case api.ResourceType_SECRET:
95
+				assignSecret(a, readTx, mapKey, t)
96
+			case api.ResourceType_CONFIG:
97
+				assignConfig(a, readTx, mapKey)
98
+			default:
99
+				a.log.WithField(
100
+					"resource.type", resourceRef.ResourceType,
101
+				).Debug("invalid resource type for a task dependency, skipping")
102
+				continue
103
+			}
104
+		}
105
+		a.tasksUsingDependency[mapKey][t.ID] = struct{}{}
106
+	}
107
+
49 108
 	var secrets []*api.SecretReference
50 109
 	container := t.Spec.GetContainer()
51 110
 	if container != nil {
52 111
 		secrets = container.Secrets
53 112
 	}
113
+
54 114
 	for _, secretRef := range secrets {
55 115
 		secretID := secretRef.SecretID
56
-		mapKey := typeAndID{objType: typeSecret, id: secretID}
116
+		mapKey := typeAndID{objType: api.ResourceType_SECRET, id: secretID}
57 117
 
58 118
 		if len(a.tasksUsingDependency[mapKey]) == 0 {
59
-			a.tasksUsingDependency[mapKey] = make(map[string]struct{})
60
-
61
-			secret, err := a.secret(readTx, secretID)
62
-			if err != nil {
63
-				a.log.WithFields(logrus.Fields{
64
-					"secret.id":   secretID,
65
-					"secret.name": secretRef.SecretName,
66
-					"error":       err,
67
-				}).Error("failed to fetch secret")
68
-				continue
69
-			}
70
-
71
-			// If the secret was found, add this secret to
72
-			// our set that we send down.
73
-			a.changes[mapKey] = &api.AssignmentChange{
74
-				Assignment: &api.Assignment{
75
-					Item: &api.Assignment_Secret{
76
-						Secret: secret,
77
-					},
78
-				},
79
-				Action: api.AssignmentChange_AssignmentActionUpdate,
80
-			}
119
+			assignSecret(a, readTx, mapKey, t)
81 120
 		}
82 121
 		a.tasksUsingDependency[mapKey][t.ID] = struct{}{}
83 122
 	}
... ...
@@ -88,30 +116,10 @@ func (a *assignmentSet) addTaskDependencies(readTx store.ReadTx, t *api.Task) {
88 88
 	}
89 89
 	for _, configRef := range configs {
90 90
 		configID := configRef.ConfigID
91
-		mapKey := typeAndID{objType: typeConfig, id: configID}
91
+		mapKey := typeAndID{objType: api.ResourceType_CONFIG, id: configID}
92 92
 
93 93
 		if len(a.tasksUsingDependency[mapKey]) == 0 {
94
-			a.tasksUsingDependency[mapKey] = make(map[string]struct{})
95
-
96
-			config := store.GetConfig(readTx, configID)
97
-			if config == nil {
98
-				a.log.WithFields(logrus.Fields{
99
-					"config.id":   configID,
100
-					"config.name": configRef.ConfigName,
101
-				}).Debug("config not found")
102
-				continue
103
-			}
104
-
105
-			// If the config was found, add this config to
106
-			// our set that we send down.
107
-			a.changes[mapKey] = &api.AssignmentChange{
108
-				Assignment: &api.Assignment{
109
-					Item: &api.Assignment_Config{
110
-						Config: config,
111
-					},
112
-				},
113
-				Action: api.AssignmentChange_AssignmentActionUpdate,
114
-			}
94
+			assignConfig(a, readTx, mapKey)
115 95
 		}
116 96
 		a.tasksUsingDependency[mapKey][t.ID] = struct{}{}
117 97
 	}
... ...
@@ -133,6 +141,35 @@ func (a *assignmentSet) releaseDependency(mapKey typeAndID, assignment *api.Assi
133 133
 
134 134
 func (a *assignmentSet) releaseTaskDependencies(t *api.Task) bool {
135 135
 	var modified bool
136
+
137
+	for _, resourceRef := range t.Spec.ResourceReferences {
138
+		var assignment *api.Assignment
139
+		switch resourceRef.ResourceType {
140
+		case api.ResourceType_SECRET:
141
+			assignment = &api.Assignment{
142
+				Item: &api.Assignment_Secret{
143
+					Secret: &api.Secret{ID: resourceRef.ResourceID},
144
+				},
145
+			}
146
+		case api.ResourceType_CONFIG:
147
+			assignment = &api.Assignment{
148
+				Item: &api.Assignment_Config{
149
+					Config: &api.Config{ID: resourceRef.ResourceID},
150
+				},
151
+			}
152
+		default:
153
+			a.log.WithField(
154
+				"resource.type", resourceRef.ResourceType,
155
+			).Debug("invalid resource type for a task dependency, skipping")
156
+			continue
157
+		}
158
+
159
+		mapKey := typeAndID{objType: resourceRef.ResourceType, id: resourceRef.ResourceID}
160
+		if a.releaseDependency(mapKey, assignment, t.ID) {
161
+			modified = true
162
+		}
163
+	}
164
+
136 165
 	container := t.Spec.GetContainer()
137 166
 
138 167
 	var secrets []*api.SecretReference
... ...
@@ -142,7 +179,7 @@ func (a *assignmentSet) releaseTaskDependencies(t *api.Task) bool {
142 142
 
143 143
 	for _, secretRef := range secrets {
144 144
 		secretID := secretRef.SecretID
145
-		mapKey := typeAndID{objType: typeSecret, id: secretID}
145
+		mapKey := typeAndID{objType: api.ResourceType_SECRET, id: secretID}
146 146
 		assignment := &api.Assignment{
147 147
 			Item: &api.Assignment_Secret{
148 148
 				Secret: &api.Secret{ID: secretID},
... ...
@@ -160,7 +197,7 @@ func (a *assignmentSet) releaseTaskDependencies(t *api.Task) bool {
160 160
 
161 161
 	for _, configRef := range configs {
162 162
 		configID := configRef.ConfigID
163
-		mapKey := typeAndID{objType: typeConfig, id: configID}
163
+		mapKey := typeAndID{objType: api.ResourceType_CONFIG, id: configID}
164 164
 		assignment := &api.Assignment{
165 165
 			Item: &api.Assignment_Config{
166 166
 				Config: &api.Config{ID: configID},
... ...
@@ -205,7 +242,7 @@ func (a *assignmentSet) addOrUpdateTask(readTx store.ReadTx, t *api.Task) bool {
205 205
 		a.addTaskDependencies(readTx, t)
206 206
 	}
207 207
 	a.tasksMap[t.ID] = t
208
-	a.changes[typeAndID{objType: typeTask, id: t.ID}] = &api.AssignmentChange{
208
+	a.changes[typeAndID{objType: api.ResourceType_TASK, id: t.ID}] = &api.AssignmentChange{
209 209
 		Assignment: &api.Assignment{
210 210
 			Item: &api.Assignment_Task{
211 211
 				Task: t,
... ...
@@ -221,7 +258,7 @@ func (a *assignmentSet) removeTask(t *api.Task) bool {
221 221
 		return false
222 222
 	}
223 223
 
224
-	a.changes[typeAndID{objType: typeTask, id: t.ID}] = &api.AssignmentChange{
224
+	a.changes[typeAndID{objType: api.ResourceType_TASK, id: t.ID}] = &api.AssignmentChange{
225 225
 		Assignment: &api.Assignment{
226 226
 			Item: &api.Assignment_Task{
227 227
 				Task: &api.Task{ID: t.ID},
... ...
@@ -254,7 +291,7 @@ func (a *assignmentSet) message() api.AssignmentsMessage {
254 254
 
255 255
 // secret populates the secret value from raft store. For external secrets, the value is populated
256 256
 // from the secret driver.
257
-func (a *assignmentSet) secret(readTx store.ReadTx, secretID string) (*api.Secret, error) {
257
+func (a *assignmentSet) secret(readTx store.ReadTx, task *api.Task, secretID string) (*api.Secret, error) {
258 258
 	secret := store.GetSecret(readTx, secretID)
259 259
 	if secret == nil {
260 260
 		return nil, fmt.Errorf("secret not found")
... ...
@@ -266,7 +303,7 @@ func (a *assignmentSet) secret(readTx store.ReadTx, secretID string) (*api.Secre
266 266
 	if err != nil {
267 267
 		return nil, err
268 268
 	}
269
-	value, err := d.Get(&secret.Spec)
269
+	value, err := d.Get(&secret.Spec, task)
270 270
 	if err != nil {
271 271
 		return nil, err
272 272
 	}
... ...
@@ -18,6 +18,7 @@ import (
18 18
 	"github.com/docker/swarmkit/log"
19 19
 	"github.com/docker/swarmkit/manager/drivers"
20 20
 	"github.com/docker/swarmkit/manager/state/store"
21
+	"github.com/docker/swarmkit/protobuf/ptypes"
21 22
 	"github.com/docker/swarmkit/remotes"
22 23
 	"github.com/docker/swarmkit/watch"
23 24
 	gogotypes "github.com/gogo/protobuf/types"
... ...
@@ -127,6 +128,7 @@ type Dispatcher struct {
127 127
 	cancel               context.CancelFunc
128 128
 	clusterUpdateQueue   *watch.Queue
129 129
 	dp                   *drivers.DriverProvider
130
+	securityConfig       *ca.SecurityConfig
130 131
 
131 132
 	taskUpdates     map[string]*api.TaskStatus // indexed by task ID
132 133
 	taskUpdatesLock sync.Mutex
... ...
@@ -144,7 +146,7 @@ type Dispatcher struct {
144 144
 }
145 145
 
146 146
 // New returns Dispatcher with cluster interface(usually raft.Node).
147
-func New(cluster Cluster, c *Config, dp *drivers.DriverProvider) *Dispatcher {
147
+func New(cluster Cluster, c *Config, dp *drivers.DriverProvider, securityConfig *ca.SecurityConfig) *Dispatcher {
148 148
 	d := &Dispatcher{
149 149
 		dp:                    dp,
150 150
 		nodes:                 newNodeStore(c.HeartbeatPeriod, c.HeartbeatEpsilon, c.GracePeriodMultiplier, c.RateLimitPeriod),
... ...
@@ -153,6 +155,7 @@ func New(cluster Cluster, c *Config, dp *drivers.DriverProvider) *Dispatcher {
153 153
 		cluster:               cluster,
154 154
 		processUpdatesTrigger: make(chan struct{}, 1),
155 155
 		config:                c,
156
+		securityConfig:        securityConfig,
156 157
 	}
157 158
 
158 159
 	d.processUpdatesCond = sync.NewCond(&d.processUpdatesLock)
... ...
@@ -630,6 +633,8 @@ func (d *Dispatcher) processUpdates(ctx context.Context) {
630 630
 				}
631 631
 
632 632
 				task.Status = *status
633
+				task.Status.AppliedBy = d.securityConfig.ClientTLSCreds.NodeID()
634
+				task.Status.AppliedAt = ptypes.MustTimestampProto(time.Now())
633 635
 				if err := store.UpdateTask(tx, task); err != nil {
634 636
 					logger.WithError(err).Error("failed to update task status")
635 637
 					return nil
... ...
@@ -26,12 +26,45 @@ func NewSecretDriver(plugin plugingetter.CompatPlugin) *SecretDriver {
26 26
 }
27 27
 
28 28
 // Get gets a secret from the secret provider
29
-func (d *SecretDriver) Get(spec *api.SecretSpec) ([]byte, error) {
29
+func (d *SecretDriver) Get(spec *api.SecretSpec, task *api.Task) ([]byte, error) {
30 30
 	if spec == nil {
31
-		return nil, fmt.Errorf("spec is nil")
31
+		return nil, fmt.Errorf("secret spec is nil")
32 32
 	}
33
+	if task == nil {
34
+		return nil, fmt.Errorf("task is nil")
35
+	}
36
+
33 37
 	var secretResp SecretsProviderResponse
34
-	secretReq := &SecretsProviderRequest{Name: spec.Annotations.Name}
38
+	secretReq := &SecretsProviderRequest{
39
+		SecretName:    spec.Annotations.Name,
40
+		ServiceName:   task.ServiceAnnotations.Name,
41
+		ServiceLabels: task.ServiceAnnotations.Labels,
42
+	}
43
+	container := task.Spec.GetContainer()
44
+	if container != nil {
45
+		secretReq.ServiceHostname = container.Hostname
46
+	}
47
+
48
+	if task.Endpoint != nil && task.Endpoint.Spec != nil {
49
+		secretReq.ServiceEndpointSpec = &EndpointSpec{
50
+			Mode: int32(task.Endpoint.Spec.Mode),
51
+		}
52
+		for _, p := range task.Endpoint.Spec.Ports {
53
+			if p == nil {
54
+				continue
55
+			}
56
+			secretReq.ServiceEndpointSpec.Ports =
57
+				append(secretReq.ServiceEndpointSpec.Ports,
58
+					PortConfig{
59
+						Name:          p.Name,
60
+						Protocol:      int32(p.Protocol),
61
+						PublishedPort: p.PublishedPort,
62
+						TargetPort:    p.TargetPort,
63
+						PublishMode:   int32(p.PublishMode),
64
+					})
65
+		}
66
+	}
67
+
35 68
 	err := d.plugin.Client().Call(SecretsProviderAPI, secretReq, &secretResp)
36 69
 	if err != nil {
37 70
 		return nil, err
... ...
@@ -40,16 +73,38 @@ func (d *SecretDriver) Get(spec *api.SecretSpec) ([]byte, error) {
40 40
 		return nil, fmt.Errorf(secretResp.Err)
41 41
 	}
42 42
 	// Assign the secret value
43
-	return []byte(secretResp.Value), nil
43
+	return secretResp.Value, nil
44 44
 }
45 45
 
46 46
 // SecretsProviderRequest is the secrets provider request.
47 47
 type SecretsProviderRequest struct {
48
-	Name string `json:"name"` // Name is the name of the secret plugin
48
+	SecretName          string            `json:",omitempty"` // SecretName is the name of the secret to request from the plugin
49
+	ServiceHostname     string            `json:",omitempty"` // ServiceHostname is the hostname of the service, can be used for x509 certificate
50
+	ServiceName         string            `json:",omitempty"` // ServiceName is the name of the service that requested the secret
51
+	ServiceLabels       map[string]string `json:",omitempty"` // ServiceLabels capture environment names and other metadata
52
+	ServiceEndpointSpec *EndpointSpec     `json:",omitempty"` // ServiceEndpointSpec holds the specification for endpoints
49 53
 }
50 54
 
51 55
 // SecretsProviderResponse is the secrets provider response.
52 56
 type SecretsProviderResponse struct {
53
-	Value string `json:"value"` // Value is the value of the secret
54
-	Err   string `json:"err"`   // Err is the error response of the plugin
57
+	Value []byte `json:",omitempty"` // Value is the value of the secret
58
+	Err   string `json:",omitempty"` // Err is the error response of the plugin
59
+}
60
+
61
+// EndpointSpec represents the spec of an endpoint.
62
+type EndpointSpec struct {
63
+	Mode  int32        `json:",omitempty"`
64
+	Ports []PortConfig `json:",omitempty"`
65
+}
66
+
67
+// PortConfig represents the config of a port.
68
+type PortConfig struct {
69
+	Name     string `json:",omitempty"`
70
+	Protocol int32  `json:",omitempty"`
71
+	// TargetPort is the port inside the container
72
+	TargetPort uint32 `json:",omitempty"`
73
+	// PublishedPort is the port on the swarm hosts
74
+	PublishedPort uint32 `json:",omitempty"`
75
+	// PublishMode is the mode in which port is published
76
+	PublishMode int32 `json:",omitempty"`
55 77
 }
... ...
@@ -57,12 +57,12 @@ func New(store *store.MemoryStore) *LogBroker {
57 57
 	}
58 58
 }
59 59
 
60
-// Run the log broker
61
-func (lb *LogBroker) Run(ctx context.Context) error {
60
+// Start starts the log broker
61
+func (lb *LogBroker) Start(ctx context.Context) error {
62 62
 	lb.mu.Lock()
63
+	defer lb.mu.Unlock()
63 64
 
64 65
 	if lb.cancelAll != nil {
65
-		lb.mu.Unlock()
66 66
 		return errAlreadyRunning
67 67
 	}
68 68
 
... ...
@@ -71,12 +71,7 @@ func (lb *LogBroker) Run(ctx context.Context) error {
71 71
 	lb.subscriptionQueue = watch.NewQueue()
72 72
 	lb.registeredSubscriptions = make(map[string]*subscription)
73 73
 	lb.subscriptionsByNode = make(map[string]map[*subscription]struct{})
74
-	lb.mu.Unlock()
75
-
76
-	select {
77
-	case <-lb.pctx.Done():
78
-		return lb.pctx.Err()
79
-	}
74
+	return nil
80 75
 }
81 76
 
82 77
 // Stop stops the log broker
... ...
@@ -234,8 +229,15 @@ func (lb *LogBroker) SubscribeLogs(request *api.SubscribeLogsRequest, stream api
234 234
 		return err
235 235
 	}
236 236
 
237
+	lb.mu.Lock()
238
+	pctx := lb.pctx
239
+	lb.mu.Unlock()
240
+	if pctx == nil {
241
+		return errNotRunning
242
+	}
243
+
237 244
 	subscription := lb.newSubscription(request.Selector, request.Options)
238
-	subscription.Run(lb.pctx)
245
+	subscription.Run(pctx)
239 246
 	defer subscription.Stop()
240 247
 
241 248
 	log := log.G(ctx).WithFields(
... ...
@@ -257,8 +259,8 @@ func (lb *LogBroker) SubscribeLogs(request *api.SubscribeLogsRequest, stream api
257 257
 		select {
258 258
 		case <-ctx.Done():
259 259
 			return ctx.Err()
260
-		case <-lb.pctx.Done():
261
-			return lb.pctx.Err()
260
+		case <-pctx.Done():
261
+			return pctx.Err()
262 262
 		case event := <-publishCh:
263 263
 			publish := event.(*logMessage)
264 264
 			if publish.completed {
... ...
@@ -308,6 +310,13 @@ func (lb *LogBroker) ListenSubscriptions(request *api.ListenSubscriptionsRequest
308 308
 		return err
309 309
 	}
310 310
 
311
+	lb.mu.Lock()
312
+	pctx := lb.pctx
313
+	lb.mu.Unlock()
314
+	if pctx == nil {
315
+		return errNotRunning
316
+	}
317
+
311 318
 	lb.nodeConnected(remote.NodeID)
312 319
 	defer lb.nodeDisconnected(remote.NodeID)
313 320
 
... ...
@@ -329,7 +338,7 @@ func (lb *LogBroker) ListenSubscriptions(request *api.ListenSubscriptionsRequest
329 329
 		select {
330 330
 		case <-stream.Context().Done():
331 331
 			return stream.Context().Err()
332
-		case <-lb.pctx.Done():
332
+		case <-pctx.Done():
333 333
 			return nil
334 334
 		default:
335 335
 		}
... ...
@@ -362,7 +371,7 @@ func (lb *LogBroker) ListenSubscriptions(request *api.ListenSubscriptionsRequest
362 362
 			}
363 363
 		case <-stream.Context().Done():
364 364
 			return stream.Context().Err()
365
-		case <-lb.pctx.Done():
365
+		case <-pctx.Done():
366 366
 			return nil
367 367
 		}
368 368
 	}
... ...
@@ -16,6 +16,7 @@ import (
16 16
 	"github.com/cloudflare/cfssl/helpers"
17 17
 	"github.com/docker/docker/pkg/plugingetter"
18 18
 	"github.com/docker/go-events"
19
+	gmetrics "github.com/docker/go-metrics"
19 20
 	"github.com/docker/swarmkit/api"
20 21
 	"github.com/docker/swarmkit/ca"
21 22
 	"github.com/docker/swarmkit/connectionbroker"
... ...
@@ -87,7 +88,11 @@ type Config struct {
87 87
 	// cluster to join.
88 88
 	JoinRaft string
89 89
 
90
-	// Top-level state directory
90
+	// ForceJoin causes us to invoke raft's Join RPC even if already part
91
+	// of a cluster.
92
+	ForceJoin bool
93
+
94
+	// StateDir is the top-level state directory
91 95
 	StateDir string
92 96
 
93 97
 	// ForceNewCluster defines if we have to force a new cluster
... ...
@@ -130,6 +135,7 @@ type Manager struct {
130 130
 	caserver               *ca.Server
131 131
 	dispatcher             *dispatcher.Dispatcher
132 132
 	logbroker              *logbroker.LogBroker
133
+	watchServer            *watchapi.Server
133 134
 	replicatedOrchestrator *replicated.Orchestrator
134 135
 	globalOrchestrator     *global.Orchestrator
135 136
 	taskReaper             *taskreaper.TaskReaper
... ...
@@ -159,6 +165,16 @@ type Manager struct {
159 159
 	errServe        chan error
160 160
 }
161 161
 
162
+var (
163
+	leaderMetric gmetrics.Gauge
164
+)
165
+
166
+func init() {
167
+	ns := gmetrics.NewNamespace("swarm", "manager", nil)
168
+	leaderMetric = ns.NewGauge("leader", "Indicates if this manager node is a leader", "")
169
+	gmetrics.Register(ns)
170
+}
171
+
162 172
 type closeOnceListener struct {
163 173
 	once sync.Once
164 174
 	net.Listener
... ...
@@ -202,6 +218,7 @@ func New(config *Config) (*Manager, error) {
202 202
 	newNodeOpts := raft.NodeOptions{
203 203
 		ID:              config.SecurityConfig.ClientTLSCreds.NodeID(),
204 204
 		JoinAddr:        config.JoinRaft,
205
+		ForceJoin:       config.ForceJoin,
205 206
 		Config:          raftCfg,
206 207
 		StateDir:        raftStateDir,
207 208
 		ForceNewCluster: config.ForceNewCluster,
... ...
@@ -218,9 +235,10 @@ func New(config *Config) (*Manager, error) {
218 218
 
219 219
 	m := &Manager{
220 220
 		config:          *config,
221
-		caserver:        ca.NewServer(raftNode.MemoryStore(), config.SecurityConfig, config.RootCAPaths),
222
-		dispatcher:      dispatcher.New(raftNode, dispatcher.DefaultConfig(), drivers.New(config.PluginGetter)),
221
+		caserver:        ca.NewServer(raftNode.MemoryStore(), config.SecurityConfig),
222
+		dispatcher:      dispatcher.New(raftNode, dispatcher.DefaultConfig(), drivers.New(config.PluginGetter), config.SecurityConfig),
223 223
 		logbroker:       logbroker.New(raftNode.MemoryStore()),
224
+		watchServer:     watchapi.NewServer(raftNode.MemoryStore()),
224 225
 		server:          grpc.NewServer(opts...),
225 226
 		localserver:     grpc.NewServer(opts...),
226 227
 		raftNode:        raftNode,
... ...
@@ -397,14 +415,13 @@ func (m *Manager) Run(parent context.Context) error {
397 397
 		return err
398 398
 	}
399 399
 
400
-	baseControlAPI := controlapi.NewServer(m.raftNode.MemoryStore(), m.raftNode, m.config.SecurityConfig, m.caserver, m.config.PluginGetter)
401
-	baseWatchAPI := watchapi.NewServer(m.raftNode.MemoryStore())
400
+	baseControlAPI := controlapi.NewServer(m.raftNode.MemoryStore(), m.raftNode, m.config.SecurityConfig, m.config.PluginGetter, drivers.New(m.config.PluginGetter))
402 401
 	baseResourceAPI := resourceapi.New(m.raftNode.MemoryStore())
403 402
 	healthServer := health.NewHealthServer()
404 403
 	localHealthServer := health.NewHealthServer()
405 404
 
406 405
 	authenticatedControlAPI := api.NewAuthenticatedWrapperControlServer(baseControlAPI, authorize)
407
-	authenticatedWatchAPI := api.NewAuthenticatedWrapperWatchServer(baseWatchAPI, authorize)
406
+	authenticatedWatchAPI := api.NewAuthenticatedWrapperWatchServer(m.watchServer, authorize)
408 407
 	authenticatedResourceAPI := api.NewAuthenticatedWrapperResourceAllocatorServer(baseResourceAPI, authorize)
409 408
 	authenticatedLogsServerAPI := api.NewAuthenticatedWrapperLogsServer(m.logbroker, authorize)
410 409
 	authenticatedLogBrokerAPI := api.NewAuthenticatedWrapperLogBrokerServer(m.logbroker, authorize)
... ...
@@ -477,7 +494,7 @@ func (m *Manager) Run(parent context.Context) error {
477 477
 	grpc_prometheus.Register(m.server)
478 478
 
479 479
 	api.RegisterControlServer(m.localserver, localProxyControlAPI)
480
-	api.RegisterWatchServer(m.localserver, baseWatchAPI)
480
+	api.RegisterWatchServer(m.localserver, m.watchServer)
481 481
 	api.RegisterLogsServer(m.localserver, localProxyLogsAPI)
482 482
 	api.RegisterHealthServer(m.localserver, localHealthServer)
483 483
 	api.RegisterDispatcherServer(m.localserver, localProxyDispatcherAPI)
... ...
@@ -490,6 +507,10 @@ func (m *Manager) Run(parent context.Context) error {
490 490
 	healthServer.SetServingStatus("Raft", api.HealthCheckResponse_NOT_SERVING)
491 491
 	localHealthServer.SetServingStatus("ControlAPI", api.HealthCheckResponse_NOT_SERVING)
492 492
 
493
+	if err := m.watchServer.Start(ctx); err != nil {
494
+		log.G(ctx).WithError(err).Error("watch server failed to start")
495
+	}
496
+
493 497
 	go m.serveListener(ctx, m.remoteListener)
494 498
 	go m.serveListener(ctx, m.controlListener)
495 499
 
... ...
@@ -565,8 +586,8 @@ func (m *Manager) Run(parent context.Context) error {
565 565
 const stopTimeout = 8 * time.Second
566 566
 
567 567
 // Stop stops the manager. It immediately closes all open connections and
568
-// active RPCs as well as stopping the scheduler. If clearData is set, the
569
-// raft logs, snapshots, and keys will be erased.
568
+// active RPCs as well as stopping the manager's subsystems. If clearData is
569
+// set, the raft logs, snapshots, and keys will be erased.
570 570
 func (m *Manager) Stop(ctx context.Context, clearData bool) {
571 571
 	log.G(ctx).Info("Stopping manager")
572 572
 	// It's not safe to start shutting down while the manager is still
... ...
@@ -600,6 +621,7 @@ func (m *Manager) Stop(ctx context.Context, clearData bool) {
600 600
 
601 601
 	m.dispatcher.Stop()
602 602
 	m.logbroker.Stop()
603
+	m.watchServer.Stop()
603 604
 	m.caserver.Stop()
604 605
 
605 606
 	if m.allocator != nil {
... ...
@@ -709,16 +731,14 @@ func (m *Manager) updateKEK(ctx context.Context, cluster *api.Cluster) error {
709 709
 
710 710
 func (m *Manager) watchForClusterChanges(ctx context.Context) error {
711 711
 	clusterID := m.config.SecurityConfig.ClientTLSCreds.Organization()
712
+	var cluster *api.Cluster
712 713
 	clusterWatch, clusterWatchCancel, err := store.ViewAndWatch(m.raftNode.MemoryStore(),
713 714
 		func(tx store.ReadTx) error {
714
-			cluster := store.GetCluster(tx, clusterID)
715
+			cluster = store.GetCluster(tx, clusterID)
715 716
 			if cluster == nil {
716 717
 				return fmt.Errorf("unable to get current cluster")
717 718
 			}
718
-			if err := m.caserver.UpdateRootCA(ctx, cluster); err != nil {
719
-				log.G(ctx).WithError(err).Error("could not update security config")
720
-			}
721
-			return m.updateKEK(ctx, cluster)
719
+			return nil
722 720
 		},
723 721
 		api.EventUpdateCluster{
724 722
 			Cluster: &api.Cluster{ID: clusterID},
... ...
@@ -728,14 +748,15 @@ func (m *Manager) watchForClusterChanges(ctx context.Context) error {
728 728
 	if err != nil {
729 729
 		return err
730 730
 	}
731
+	if err := m.updateKEK(ctx, cluster); err != nil {
732
+		return err
733
+	}
734
+
731 735
 	go func() {
732 736
 		for {
733 737
 			select {
734 738
 			case event := <-clusterWatch:
735 739
 				clusterEvent := event.(api.EventUpdateCluster)
736
-				if err := m.caserver.UpdateRootCA(ctx, clusterEvent.Cluster); err != nil {
737
-					log.G(ctx).WithError(err).Error("could not update security config")
738
-				}
739 740
 				m.updateKEK(ctx, clusterEvent.Cluster)
740 741
 			case <-ctx.Done():
741 742
 				clusterWatchCancel()
... ...
@@ -863,8 +884,10 @@ func (m *Manager) handleLeadershipEvents(ctx context.Context, leadershipCh chan
863 863
 
864 864
 			if newState == raft.IsLeader {
865 865
 				m.becomeLeader(ctx)
866
+				leaderMetric.Set(1)
866 867
 			} else if newState == raft.IsFollower {
867 868
 				m.becomeFollower()
869
+				leaderMetric.Set(0)
868 870
 			}
869 871
 			m.mu.Unlock()
870 872
 		case <-ctx.Done():
... ...
@@ -1001,11 +1024,9 @@ func (m *Manager) becomeLeader(ctx context.Context) {
1001 1001
 		}
1002 1002
 	}(m.dispatcher)
1003 1003
 
1004
-	go func(lb *logbroker.LogBroker) {
1005
-		if err := lb.Run(ctx); err != nil {
1006
-			log.G(ctx).WithError(err).Error("LogBroker exited with an error")
1007
-		}
1008
-	}(m.logbroker)
1004
+	if err := m.logbroker.Start(ctx); err != nil {
1005
+		log.G(ctx).WithError(err).Error("LogBroker failed to start")
1006
+	}
1009 1007
 
1010 1008
 	go func(server *ca.Server) {
1011 1009
 		if err := server.Run(ctx); err != nil {
... ...
@@ -156,25 +156,12 @@ func (g *Orchestrator) Run(ctx context.Context) error {
156 156
 				g.reconcileOneNode(ctx, v.Node)
157 157
 			case api.EventUpdateNode:
158 158
 				g.updateNode(v.Node)
159
-				switch v.Node.Status.State {
160
-				// NodeStatus_DISCONNECTED is a transient state, no need to make any change
161
-				case api.NodeStatus_DOWN:
162
-					g.foreachTaskFromNode(ctx, v.Node, g.shutdownTask)
163
-				case api.NodeStatus_READY:
164
-					// node could come back to READY from DOWN or DISCONNECT
165
-					g.reconcileOneNode(ctx, v.Node)
166
-				}
159
+				g.reconcileOneNode(ctx, v.Node)
167 160
 			case api.EventDeleteNode:
168 161
 				g.foreachTaskFromNode(ctx, v.Node, g.deleteTask)
169 162
 				delete(g.nodes, v.Node.ID)
170 163
 			case api.EventUpdateTask:
171 164
 				g.handleTaskChange(ctx, v.Task)
172
-			case api.EventDeleteTask:
173
-				// CLI allows deleting task
174
-				if _, exists := g.globalServices[v.Task.ServiceID]; !exists {
175
-					continue
176
-				}
177
-				g.reconcileServicesOneNode(ctx, []string{v.Task.ServiceID}, v.Task.NodeID)
178 165
 			}
179 166
 		case <-g.stopChan:
180 167
 			return nil
... ...
@@ -216,7 +203,7 @@ func (g *Orchestrator) handleTaskChange(ctx context.Context, t *api.Task) {
216 216
 	if _, exists := g.globalServices[t.ServiceID]; !exists {
217 217
 		return
218 218
 	}
219
-	// if a task's DesiredState has past running, which
219
+	// if a task's DesiredState has passed running, it
220 220
 	// means the task has been processed
221 221
 	if t.DesiredState > api.TaskStateRunning {
222 222
 		return
... ...
@@ -264,33 +251,41 @@ func (g *Orchestrator) foreachTaskFromNode(ctx context.Context, node *api.Node,
264 264
 }
265 265
 
266 266
 func (g *Orchestrator) reconcileServices(ctx context.Context, serviceIDs []string) {
267
-	nodeCompleted := make(map[string]map[string]struct{})
268 267
 	nodeTasks := make(map[string]map[string][]*api.Task)
269 268
 
270 269
 	g.store.View(func(tx store.ReadTx) {
271 270
 		for _, serviceID := range serviceIDs {
271
+			service := g.globalServices[serviceID].Service
272
+			if service == nil {
273
+				continue
274
+			}
275
+
272 276
 			tasks, err := store.FindTasks(tx, store.ByServiceID(serviceID))
273 277
 			if err != nil {
274 278
 				log.G(ctx).WithError(err).Errorf("global orchestrator: reconcileServices failed finding tasks for service %s", serviceID)
275 279
 				continue
276 280
 			}
277 281
 
278
-			// a node may have completed this service
279
-			nodeCompleted[serviceID] = make(map[string]struct{})
280 282
 			// nodeID -> task list
281 283
 			nodeTasks[serviceID] = make(map[string][]*api.Task)
282 284
 
283 285
 			for _, t := range tasks {
284
-				if t.DesiredState <= api.TaskStateRunning {
285
-					// Collect all running instances of this service
286
-					nodeTasks[serviceID][t.NodeID] = append(nodeTasks[serviceID][t.NodeID], t)
286
+				nodeTasks[serviceID][t.NodeID] = append(nodeTasks[serviceID][t.NodeID], t)
287
+			}
288
+
289
+			// Keep all runnable instances of this service,
290
+			// and instances that were not be restarted due
291
+			// to restart policy but may be updated if the
292
+			// service spec changed.
293
+			for nodeID, slot := range nodeTasks[serviceID] {
294
+				updatable := g.restarts.UpdatableTasksInSlot(ctx, slot, g.globalServices[serviceID].Service)
295
+				if len(updatable) != 0 {
296
+					nodeTasks[serviceID][nodeID] = updatable
287 297
 				} else {
288
-					// for finished tasks, check restartPolicy
289
-					if isTaskCompleted(t, orchestrator.RestartCondition(t)) {
290
-						nodeCompleted[serviceID][t.NodeID] = struct{}{}
291
-					}
298
+					delete(nodeTasks[serviceID], nodeID)
292 299
 				}
293 300
 			}
301
+
294 302
 		}
295 303
 	})
296 304
 
... ...
@@ -311,9 +306,7 @@ func (g *Orchestrator) reconcileServices(ctx context.Context, serviceIDs []strin
311 311
 				ntasks := nodeTasks[serviceID][nodeID]
312 312
 				delete(nodeTasks[serviceID], nodeID)
313 313
 
314
-				// if restart policy considers this node has finished its task
315
-				// it should remove all running tasks
316
-				if _, exists := nodeCompleted[serviceID][nodeID]; exists || !meetsConstraints {
314
+				if !meetsConstraints {
317 315
 					g.shutdownTasks(ctx, batch, ntasks)
318 316
 					continue
319 317
 				}
... ...
@@ -357,7 +350,7 @@ func (g *Orchestrator) reconcileServices(ctx context.Context, serviceIDs []strin
357 357
 
358 358
 // updateNode updates g.nodes based on the current node value
359 359
 func (g *Orchestrator) updateNode(node *api.Node) {
360
-	if node.Spec.Availability == api.NodeAvailabilityDrain {
360
+	if node.Spec.Availability == api.NodeAvailabilityDrain || node.Status.State == api.NodeStatus_DOWN {
361 361
 		delete(g.nodes, node.ID)
362 362
 	} else {
363 363
 		g.nodes[node.ID] = node
... ...
@@ -381,27 +374,27 @@ func (g *Orchestrator) updateService(service *api.Service) {
381 381
 // reconcileOneNode checks all global services on one node
382 382
 func (g *Orchestrator) reconcileOneNode(ctx context.Context, node *api.Node) {
383 383
 	if node.Spec.Availability == api.NodeAvailabilityDrain {
384
-		log.G(ctx).Debugf("global orchestrator: node %s in drain state, removing tasks from it", node.ID)
384
+		log.G(ctx).Debugf("global orchestrator: node %s in drain state, shutting down its tasks", node.ID)
385 385
 		g.foreachTaskFromNode(ctx, node, g.shutdownTask)
386 386
 		return
387 387
 	}
388 388
 
389
-	var serviceIDs []string
390
-	for id := range g.globalServices {
391
-		serviceIDs = append(serviceIDs, id)
389
+	if node.Status.State == api.NodeStatus_DOWN {
390
+		log.G(ctx).Debugf("global orchestrator: node %s is down, shutting down its tasks", node.ID)
391
+		g.foreachTaskFromNode(ctx, node, g.shutdownTask)
392
+		return
392 393
 	}
393
-	g.reconcileServicesOneNode(ctx, serviceIDs, node.ID)
394
-}
395 394
 
396
-// reconcileServicesOneNode checks the specified services on one node
397
-func (g *Orchestrator) reconcileServicesOneNode(ctx context.Context, serviceIDs []string, nodeID string) {
398
-	node, exists := g.nodes[nodeID]
395
+	if node.Spec.Availability == api.NodeAvailabilityPause {
396
+		// the node is paused, so we won't add or update tasks
397
+		return
398
+	}
399
+
400
+	node, exists := g.nodes[node.ID]
399 401
 	if !exists {
400 402
 		return
401 403
 	}
402 404
 
403
-	// whether each service has completed on the node
404
-	completed := make(map[string]bool)
405 405
 	// tasks by service
406 406
 	tasks := make(map[string][]*api.Task)
407 407
 
... ...
@@ -411,53 +404,44 @@ func (g *Orchestrator) reconcileServicesOneNode(ctx context.Context, serviceIDs
411 411
 	)
412 412
 
413 413
 	g.store.View(func(tx store.ReadTx) {
414
-		tasksOnNode, err = store.FindTasks(tx, store.ByNodeID(nodeID))
414
+		tasksOnNode, err = store.FindTasks(tx, store.ByNodeID(node.ID))
415 415
 	})
416 416
 	if err != nil {
417
-		log.G(ctx).WithError(err).Errorf("global orchestrator: reconcile failed finding tasks on node %s", nodeID)
417
+		log.G(ctx).WithError(err).Errorf("global orchestrator: reconcile failed finding tasks on node %s", node.ID)
418 418
 		return
419 419
 	}
420 420
 
421
-	for _, serviceID := range serviceIDs {
421
+	for serviceID, service := range g.globalServices {
422 422
 		for _, t := range tasksOnNode {
423 423
 			if t.ServiceID != serviceID {
424 424
 				continue
425 425
 			}
426
-			if t.DesiredState <= api.TaskStateRunning {
427
-				tasks[serviceID] = append(tasks[serviceID], t)
426
+			tasks[serviceID] = append(tasks[serviceID], t)
427
+		}
428
+
429
+		// Keep all runnable instances of this service,
430
+		// and instances that were not be restarted due
431
+		// to restart policy but may be updated if the
432
+		// service spec changed.
433
+		for serviceID, slot := range tasks {
434
+			updatable := g.restarts.UpdatableTasksInSlot(ctx, slot, service.Service)
435
+
436
+			if len(updatable) != 0 {
437
+				tasks[serviceID] = updatable
428 438
 			} else {
429
-				if isTaskCompleted(t, orchestrator.RestartCondition(t)) {
430
-					completed[serviceID] = true
431
-				}
439
+				delete(tasks, serviceID)
432 440
 			}
433 441
 		}
434 442
 	}
435 443
 
436 444
 	err = g.store.Batch(func(batch *store.Batch) error {
437
-		for _, serviceID := range serviceIDs {
438
-			service, exists := g.globalServices[serviceID]
439
-			if !exists {
440
-				continue
441
-			}
442
-
445
+		for serviceID, service := range g.globalServices {
443 446
 			if !constraint.NodeMatches(service.constraints, node) {
444 447
 				continue
445 448
 			}
446 449
 
447
-			// if restart policy considers this node has finished its task
448
-			// it should remove all running tasks
449
-			if completed[serviceID] {
450
-				g.shutdownTasks(ctx, batch, tasks[serviceID])
451
-				continue
452
-			}
453
-
454
-			if node.Spec.Availability == api.NodeAvailabilityPause {
455
-				// the node is paused, so we won't add or update tasks
456
-				continue
457
-			}
458
-
459 450
 			if len(tasks) == 0 {
460
-				g.addTask(ctx, batch, service.Service, nodeID)
451
+				g.addTask(ctx, batch, service.Service, node.ID)
461 452
 			} else {
462 453
 				// If task is out of date, update it. This can happen
463 454
 				// on node reconciliation if, for example, we pause a
... ...
@@ -487,7 +471,7 @@ func (g *Orchestrator) reconcileServicesOneNode(ctx context.Context, serviceIDs
487 487
 				}
488 488
 
489 489
 				if len(cleanTasks) == 0 {
490
-					g.addTask(ctx, batch, service.Service, nodeID)
490
+					g.addTask(ctx, batch, service.Service, node.ID)
491 491
 				} else {
492 492
 					dirtyTasks = append(dirtyTasks, cleanTasks[1:]...)
493 493
 				}
... ...
@@ -523,7 +507,9 @@ func (g *Orchestrator) tickTasks(ctx context.Context) {
523 523
 				if !nodeExists || !serviceExists {
524 524
 					return nil
525 525
 				}
526
-				if !constraint.NodeMatches(serviceEntry.constraints, node) {
526
+
527
+				if node.Spec.Availability == api.NodeAvailabilityPause ||
528
+					!constraint.NodeMatches(serviceEntry.constraints, node) {
527 529
 					t.DesiredState = api.TaskStateShutdown
528 530
 					return store.UpdateTask(tx, t)
529 531
 				}
... ...
@@ -592,6 +578,14 @@ func (g *Orchestrator) IsRelatedService(service *api.Service) bool {
592 592
 	return orchestrator.IsGlobalService(service)
593 593
 }
594 594
 
595
+// SlotTuple returns a slot tuple for the global service task.
596
+func (g *Orchestrator) SlotTuple(t *api.Task) orchestrator.SlotTuple {
597
+	return orchestrator.SlotTuple{
598
+		ServiceID: t.ServiceID,
599
+		NodeID:    t.NodeID,
600
+	}
601
+}
602
+
595 603
 func isTaskCompleted(t *api.Task, restartPolicy api.RestartPolicy_RestartCondition) bool {
596 604
 	if t == nil || t.DesiredState <= api.TaskStateRunning {
597 605
 		return false
... ...
@@ -87,7 +87,7 @@ func (r *Orchestrator) resolveService(ctx context.Context, task *api.Task) *api.
87 87
 }
88 88
 
89 89
 func (r *Orchestrator) reconcile(ctx context.Context, service *api.Service) {
90
-	runningSlots, deadSlots, err := orchestrator.GetRunnableAndDeadSlots(r.store, service.ID)
90
+	runningSlots, deadSlots, err := r.updatableAndDeadSlots(ctx, service)
91 91
 	if err != nil {
92 92
 		log.G(ctx).WithError(err).Errorf("reconcile failed finding tasks")
93 93
 		return
... ...
@@ -3,6 +3,8 @@ package replicated
3 3
 import (
4 4
 	"github.com/docker/swarmkit/api"
5 5
 	"github.com/docker/swarmkit/manager/orchestrator"
6
+	"github.com/docker/swarmkit/manager/state/store"
7
+	"golang.org/x/net/context"
6 8
 )
7 9
 
8 10
 type slotsByRunningState []orchestrator.Slot
... ...
@@ -53,3 +55,46 @@ func (is slotsByIndex) Less(i, j int) bool {
53 53
 	}
54 54
 	return is[i].index < is[j].index
55 55
 }
56
+
57
+// updatableAndDeadSlots returns two maps of slots. The first contains slots
58
+// that have at least one task with a desired state above NEW and lesser or
59
+// equal to RUNNING, or a task that shouldn't be restarted. The second contains
60
+// all other slots with at least one task.
61
+func (r *Orchestrator) updatableAndDeadSlots(ctx context.Context, service *api.Service) (map[uint64]orchestrator.Slot, map[uint64]orchestrator.Slot, error) {
62
+	var (
63
+		tasks []*api.Task
64
+		err   error
65
+	)
66
+	r.store.View(func(tx store.ReadTx) {
67
+		tasks, err = store.FindTasks(tx, store.ByServiceID(service.ID))
68
+	})
69
+	if err != nil {
70
+		return nil, nil, err
71
+	}
72
+
73
+	updatableSlots := make(map[uint64]orchestrator.Slot)
74
+	for _, t := range tasks {
75
+		updatableSlots[t.Slot] = append(updatableSlots[t.Slot], t)
76
+	}
77
+
78
+	deadSlots := make(map[uint64]orchestrator.Slot)
79
+	for slotID, slot := range updatableSlots {
80
+		updatable := r.restarts.UpdatableTasksInSlot(ctx, slot, service)
81
+		if len(updatable) != 0 {
82
+			updatableSlots[slotID] = updatable
83
+		} else {
84
+			delete(updatableSlots, slotID)
85
+			deadSlots[slotID] = slot
86
+		}
87
+	}
88
+
89
+	return updatableSlots, deadSlots, nil
90
+}
91
+
92
+// SlotTuple returns a slot tuple for the replicated service task.
93
+func (r *Orchestrator) SlotTuple(t *api.Task) orchestrator.SlotTuple {
94
+	return orchestrator.SlotTuple{
95
+		ServiceID: t.ServiceID,
96
+		Slot:      t.Slot,
97
+	}
98
+}
... ...
@@ -30,6 +30,13 @@ type instanceRestartInfo struct {
30 30
 	// Restart.MaxAttempts and Restart.Window are both
31 31
 	// nonzero.
32 32
 	restartedInstances *list.List
33
+	// Why is specVersion in this structure and not in the map key? While
34
+	// putting it in the key would be a very simple solution, it wouldn't
35
+	// be easy to clean up map entries corresponding to old specVersions.
36
+	// Making the key version-agnostic and clearing the value whenever the
37
+	// version changes avoids the issue of stale map entries for old
38
+	// versions.
39
+	specVersion api.Version
33 40
 }
34 41
 
35 42
 type delayedStart struct {
... ...
@@ -42,20 +49,13 @@ type delayedStart struct {
42 42
 	waiter bool
43 43
 }
44 44
 
45
-type instanceTuple struct {
46
-	instance  uint64 // unset for global tasks
47
-	serviceID string
48
-	nodeID    string // unset for replicated tasks
49
-}
50
-
51 45
 // Supervisor initiates and manages restarts. It's responsible for
52 46
 // delaying restarts when applicable.
53 47
 type Supervisor struct {
54 48
 	mu               sync.Mutex
55 49
 	store            *store.MemoryStore
56 50
 	delays           map[string]*delayedStart
57
-	history          map[instanceTuple]*instanceRestartInfo
58
-	historyByService map[string]map[instanceTuple]struct{}
51
+	historyByService map[string]map[orchestrator.SlotTuple]*instanceRestartInfo
59 52
 	TaskTimeout      time.Duration
60 53
 }
61 54
 
... ...
@@ -64,8 +64,7 @@ func NewSupervisor(store *store.MemoryStore) *Supervisor {
64 64
 	return &Supervisor{
65 65
 		store:            store,
66 66
 		delays:           make(map[string]*delayedStart),
67
-		history:          make(map[instanceTuple]*instanceRestartInfo),
68
-		historyByService: make(map[string]map[instanceTuple]struct{}),
67
+		historyByService: make(map[string]map[orchestrator.SlotTuple]*instanceRestartInfo),
69 68
 		TaskTimeout:      defaultOldTaskTimeout,
70 69
 	}
71 70
 }
... ...
@@ -180,15 +179,21 @@ func (r *Supervisor) Restart(ctx context.Context, tx store.Tx, cluster *api.Clus
180 180
 		return err
181 181
 	}
182 182
 
183
-	r.recordRestartHistory(restartTask)
183
+	tuple := orchestrator.SlotTuple{
184
+		Slot:      restartTask.Slot,
185
+		ServiceID: restartTask.ServiceID,
186
+		NodeID:    restartTask.NodeID,
187
+	}
188
+	r.RecordRestartHistory(tuple, restartTask)
184 189
 
185 190
 	r.DelayStart(ctx, tx, &t, restartTask.ID, restartDelay, waitStop)
186 191
 	return nil
187 192
 }
188 193
 
194
+// shouldRestart returns true if a task should be restarted according to the
195
+// restart policy.
189 196
 func (r *Supervisor) shouldRestart(ctx context.Context, t *api.Task, service *api.Service) bool {
190 197
 	// TODO(aluzzardi): This function should not depend on `service`.
191
-
192 198
 	condition := orchestrator.RestartCondition(t)
193 199
 
194 200
 	if condition != api.RestartOnAny &&
... ...
@@ -200,22 +205,22 @@ func (r *Supervisor) shouldRestart(ctx context.Context, t *api.Task, service *ap
200 200
 		return true
201 201
 	}
202 202
 
203
-	instanceTuple := instanceTuple{
204
-		instance:  t.Slot,
205
-		serviceID: t.ServiceID,
203
+	instanceTuple := orchestrator.SlotTuple{
204
+		Slot:      t.Slot,
205
+		ServiceID: t.ServiceID,
206 206
 	}
207 207
 
208
-	// Instance is not meaningful for "global" tasks, so they need to be
208
+	// Slot is not meaningful for "global" tasks, so they need to be
209 209
 	// indexed by NodeID.
210 210
 	if orchestrator.IsGlobalService(service) {
211
-		instanceTuple.nodeID = t.NodeID
211
+		instanceTuple.NodeID = t.NodeID
212 212
 	}
213 213
 
214 214
 	r.mu.Lock()
215 215
 	defer r.mu.Unlock()
216 216
 
217
-	restartInfo := r.history[instanceTuple]
218
-	if restartInfo == nil {
217
+	restartInfo := r.historyByService[t.ServiceID][instanceTuple]
218
+	if restartInfo == nil || (t.SpecVersion != nil && *t.SpecVersion != restartInfo.specVersion) {
219 219
 		return true
220 220
 	}
221 221
 
... ...
@@ -232,8 +237,32 @@ func (r *Supervisor) shouldRestart(ctx context.Context, t *api.Task, service *ap
232 232
 		log.G(ctx).WithError(err).Error("invalid restart lookback window")
233 233
 		return restartInfo.totalRestarts < t.Spec.Restart.MaxAttempts
234 234
 	}
235
-	lookback := time.Now().Add(-window)
236 235
 
236
+	var timestamp time.Time
237
+	// Prefer the manager's timestamp over the agent's, since manager
238
+	// clocks are more trustworthy.
239
+	if t.Status.AppliedAt != nil {
240
+		timestamp, err = gogotypes.TimestampFromProto(t.Status.AppliedAt)
241
+		if err != nil {
242
+			log.G(ctx).WithError(err).Error("invalid task status AppliedAt timestamp")
243
+			return restartInfo.totalRestarts < t.Spec.Restart.MaxAttempts
244
+		}
245
+	} else {
246
+		// It's safe to call TimestampFromProto with a nil timestamp
247
+		timestamp, err = gogotypes.TimestampFromProto(t.Status.Timestamp)
248
+		if t.Status.Timestamp == nil || err != nil {
249
+			log.G(ctx).WithError(err).Error("invalid task completion timestamp")
250
+			return restartInfo.totalRestarts < t.Spec.Restart.MaxAttempts
251
+		}
252
+	}
253
+	lookback := timestamp.Add(-window)
254
+
255
+	numRestarts := uint64(restartInfo.restartedInstances.Len())
256
+
257
+	// Disregard any restarts that happened before the lookback window,
258
+	// and remove them from the linked list since they will no longer
259
+	// be relevant to figuring out if tasks should be restarted going
260
+	// forward.
237 261
 	var next *list.Element
238 262
 	for e := restartInfo.restartedInstances.Front(); e != nil; e = next {
239 263
 		next = e.Next()
... ...
@@ -242,51 +271,115 @@ func (r *Supervisor) shouldRestart(ctx context.Context, t *api.Task, service *ap
242 242
 			break
243 243
 		}
244 244
 		restartInfo.restartedInstances.Remove(e)
245
+		numRestarts--
245 246
 	}
246 247
 
247
-	numRestarts := uint64(restartInfo.restartedInstances.Len())
248
+	// Ignore restarts that didn't happen before the task we're looking at.
249
+	for e2 := restartInfo.restartedInstances.Back(); e2 != nil; e2 = e2.Prev() {
250
+		if e2.Value.(restartedInstance).timestamp.Before(timestamp) {
251
+			break
252
+		}
253
+		numRestarts--
254
+	}
248 255
 
249
-	if numRestarts == 0 {
256
+	if restartInfo.restartedInstances.Len() == 0 {
250 257
 		restartInfo.restartedInstances = nil
251 258
 	}
252 259
 
253 260
 	return numRestarts < t.Spec.Restart.MaxAttempts
254 261
 }
255 262
 
256
-func (r *Supervisor) recordRestartHistory(restartTask *api.Task) {
257
-	if restartTask.Spec.Restart == nil || restartTask.Spec.Restart.MaxAttempts == 0 {
263
+// UpdatableTasksInSlot returns the set of tasks that should be passed to the
264
+// updater from this slot, or an empty slice if none should be.  An updatable
265
+// slot has either at least one task that with desired state <= RUNNING, or its
266
+// most recent task has stopped running and should not be restarted. The latter
267
+// case is for making sure that tasks that shouldn't normally be restarted will
268
+// still be handled by rolling updates when they become outdated.  There is a
269
+// special case for rollbacks to make sure that a rollback always takes the
270
+// service to a converged state, instead of ignoring tasks with the original
271
+// spec that stopped running and shouldn't be restarted according to the
272
+// restart policy.
273
+func (r *Supervisor) UpdatableTasksInSlot(ctx context.Context, slot orchestrator.Slot, service *api.Service) orchestrator.Slot {
274
+	if len(slot) < 1 {
275
+		return nil
276
+	}
277
+
278
+	var updatable orchestrator.Slot
279
+	for _, t := range slot {
280
+		if t.DesiredState <= api.TaskStateRunning {
281
+			updatable = append(updatable, t)
282
+		}
283
+	}
284
+	if len(updatable) > 0 {
285
+		return updatable
286
+	}
287
+
288
+	if service.UpdateStatus != nil && service.UpdateStatus.State == api.UpdateStatus_ROLLBACK_STARTED {
289
+		return nil
290
+	}
291
+
292
+	// Find most recent task
293
+	byTimestamp := orchestrator.TasksByTimestamp(slot)
294
+	newestIndex := 0
295
+	for i := 1; i != len(slot); i++ {
296
+		if byTimestamp.Less(newestIndex, i) {
297
+			newestIndex = i
298
+		}
299
+	}
300
+
301
+	if !r.shouldRestart(ctx, slot[newestIndex], service) {
302
+		return orchestrator.Slot{slot[newestIndex]}
303
+	}
304
+	return nil
305
+}
306
+
307
+// RecordRestartHistory updates the historyByService map to reflect the restart
308
+// of restartedTask.
309
+func (r *Supervisor) RecordRestartHistory(tuple orchestrator.SlotTuple, replacementTask *api.Task) {
310
+	if replacementTask.Spec.Restart == nil || replacementTask.Spec.Restart.MaxAttempts == 0 {
258 311
 		// No limit on the number of restarts, so no need to record
259 312
 		// history.
260 313
 		return
261 314
 	}
262
-	tuple := instanceTuple{
263
-		instance:  restartTask.Slot,
264
-		serviceID: restartTask.ServiceID,
265
-		nodeID:    restartTask.NodeID,
266
-	}
267 315
 
268 316
 	r.mu.Lock()
269 317
 	defer r.mu.Unlock()
270 318
 
271
-	if r.history[tuple] == nil {
272
-		r.history[tuple] = &instanceRestartInfo{}
319
+	serviceID := replacementTask.ServiceID
320
+	if r.historyByService[serviceID] == nil {
321
+		r.historyByService[serviceID] = make(map[orchestrator.SlotTuple]*instanceRestartInfo)
322
+	}
323
+	if r.historyByService[serviceID][tuple] == nil {
324
+		r.historyByService[serviceID][tuple] = &instanceRestartInfo{}
273 325
 	}
274 326
 
275
-	restartInfo := r.history[tuple]
276
-	restartInfo.totalRestarts++
327
+	restartInfo := r.historyByService[serviceID][tuple]
277 328
 
278
-	if r.historyByService[restartTask.ServiceID] == nil {
279
-		r.historyByService[restartTask.ServiceID] = make(map[instanceTuple]struct{})
329
+	if replacementTask.SpecVersion != nil && *replacementTask.SpecVersion != restartInfo.specVersion {
330
+		// This task has a different SpecVersion from the one we're
331
+		// tracking. Most likely, the service was updated. Past failures
332
+		// shouldn't count against the new service definition, so clear
333
+		// the history for this instance.
334
+		*restartInfo = instanceRestartInfo{
335
+			specVersion: *replacementTask.SpecVersion,
336
+		}
280 337
 	}
281
-	r.historyByService[restartTask.ServiceID][tuple] = struct{}{}
282 338
 
283
-	if restartTask.Spec.Restart.Window != nil && (restartTask.Spec.Restart.Window.Seconds != 0 || restartTask.Spec.Restart.Window.Nanos != 0) {
339
+	restartInfo.totalRestarts++
340
+
341
+	if replacementTask.Spec.Restart.Window != nil && (replacementTask.Spec.Restart.Window.Seconds != 0 || replacementTask.Spec.Restart.Window.Nanos != 0) {
284 342
 		if restartInfo.restartedInstances == nil {
285 343
 			restartInfo.restartedInstances = list.New()
286 344
 		}
287 345
 
346
+		// it's okay to call TimestampFromProto with a nil argument
347
+		timestamp, err := gogotypes.TimestampFromProto(replacementTask.Meta.CreatedAt)
348
+		if replacementTask.Meta.CreatedAt == nil || err != nil {
349
+			timestamp = time.Now()
350
+		}
351
+
288 352
 		restartedInstance := restartedInstance{
289
-			timestamp: time.Now(),
353
+			timestamp: timestamp,
290 354
 		}
291 355
 
292 356
 		restartInfo.restartedInstances.PushBack(restartedInstance)
... ...
@@ -323,7 +416,9 @@ func (r *Supervisor) DelayStart(ctx context.Context, _ store.Tx, oldTask *api.Ta
323 323
 	var watch chan events.Event
324 324
 	cancelWatch := func() {}
325 325
 
326
-	if waitStop && oldTask != nil {
326
+	waitForTask := waitStop && oldTask != nil && oldTask.Status.State <= api.TaskStateRunning
327
+
328
+	if waitForTask {
327 329
 		// Wait for either the old task to complete, or the old task's
328 330
 		// node to become unavailable.
329 331
 		watch, cancelWatch = state.Watch(
... ...
@@ -364,7 +459,7 @@ func (r *Supervisor) DelayStart(ctx context.Context, _ store.Tx, oldTask *api.Ta
364 364
 			}
365 365
 		}
366 366
 
367
-		if waitStop && oldTask != nil {
367
+		if waitForTask {
368 368
 			select {
369 369
 			case <-watch:
370 370
 			case <-oldTaskTimer.C:
... ...
@@ -432,16 +527,6 @@ func (r *Supervisor) CancelAll() {
432 432
 // ClearServiceHistory forgets restart history related to a given service ID.
433 433
 func (r *Supervisor) ClearServiceHistory(serviceID string) {
434 434
 	r.mu.Lock()
435
-	defer r.mu.Unlock()
436
-
437
-	tuples := r.historyByService[serviceID]
438
-	if tuples == nil {
439
-		return
440
-	}
441
-
442 435
 	delete(r.historyByService, serviceID)
443
-
444
-	for t := range tuples {
445
-		delete(r.history, t)
446
-	}
436
+	r.mu.Unlock()
447 437
 }
... ...
@@ -2,7 +2,6 @@ package orchestrator
2 2
 
3 3
 import (
4 4
 	"github.com/docker/swarmkit/api"
5
-	"github.com/docker/swarmkit/manager/state/store"
6 5
 )
7 6
 
8 7
 // Slot is a list of the running tasks occupying a certain slot. Generally this
... ...
@@ -12,35 +11,11 @@ import (
12 12
 // is also considered a slot for global services.
13 13
 type Slot []*api.Task
14 14
 
15
-// GetRunnableAndDeadSlots returns two maps of slots. The first contains slots
16
-// that have at least one task with a desired state above NEW and lesser or
17
-// equal to RUNNING. The second is for slots that only contain tasks with a
18
-// desired state above RUNNING.
19
-func GetRunnableAndDeadSlots(s *store.MemoryStore, serviceID string) (map[uint64]Slot, map[uint64]Slot, error) {
20
-	var (
21
-		tasks []*api.Task
22
-		err   error
23
-	)
24
-	s.View(func(tx store.ReadTx) {
25
-		tasks, err = store.FindTasks(tx, store.ByServiceID(serviceID))
26
-	})
27
-	if err != nil {
28
-		return nil, nil, err
29
-	}
30
-
31
-	runningSlots := make(map[uint64]Slot)
32
-	for _, t := range tasks {
33
-		if t.DesiredState <= api.TaskStateRunning {
34
-			runningSlots[t.Slot] = append(runningSlots[t.Slot], t)
35
-		}
36
-	}
37
-
38
-	deadSlots := make(map[uint64]Slot)
39
-	for _, t := range tasks {
40
-		if _, exists := runningSlots[t.Slot]; !exists {
41
-			deadSlots[t.Slot] = append(deadSlots[t.Slot], t)
42
-		}
43
-	}
44
-
45
-	return runningSlots, deadSlots, nil
15
+// SlotTuple identifies a unique slot, in the broad sense described above. It's
16
+// a combination of either a service ID and a slot number (replicated services),
17
+// or a service ID and a node ID (global services).
18
+type SlotTuple struct {
19
+	Slot      uint64 // unset for global service tasks
20
+	ServiceID string
21
+	NodeID    string // unset for replicated service tasks
46 22
 }
... ...
@@ -67,7 +67,29 @@ func IsTaskDirty(s *api.Service, t *api.Task) bool {
67 67
 		return false
68 68
 	}
69 69
 
70
-	return !reflect.DeepEqual(s.Spec.Task, t.Spec) ||
70
+	// Make a deep copy of the service and task spec for the comparison.
71
+	serviceTaskSpec := *s.Spec.Task.Copy()
72
+
73
+	// For non-failed tasks with a container spec runtime that have already
74
+	// pulled the required image (i.e., current state is between READY and
75
+	// RUNNING inclusively), ignore the value of the `PullOptions` field by
76
+	// setting the copied service to have the same PullOptions value as the
77
+	// task. A difference in only the `PullOptions` field should not cause
78
+	// a running (or ready to run) task to be considered 'dirty' when we
79
+	// handle updates.
80
+	// See https://github.com/docker/swarmkit/issues/971
81
+	currentState := t.Status.State
82
+	// Ignore PullOpts if the task is desired to be in a "runnable" state
83
+	// and its last known current state is between READY and RUNNING in
84
+	// which case we know that the task either successfully pulled its
85
+	// container image or didn't need to.
86
+	ignorePullOpts := t.DesiredState <= api.TaskStateRunning && currentState >= api.TaskStateReady && currentState <= api.TaskStateRunning
87
+	if ignorePullOpts && serviceTaskSpec.GetContainer() != nil && t.Spec.GetContainer() != nil {
88
+		// Modify the service's container spec.
89
+		serviceTaskSpec.GetContainer().PullOptions = t.Spec.GetContainer().PullOptions
90
+	}
91
+
92
+	return !reflect.DeepEqual(serviceTaskSpec, t.Spec) ||
71 93
 		(t.Endpoint != nil && !reflect.DeepEqual(s.Spec.Endpoint, t.Endpoint.Spec))
72 94
 }
73 95
 
... ...
@@ -77,3 +99,44 @@ func InvalidNode(n *api.Node) bool {
77 77
 		n.Status.State == api.NodeStatus_DOWN ||
78 78
 		n.Spec.Availability == api.NodeAvailabilityDrain
79 79
 }
80
+
81
+// TasksByTimestamp sorts tasks by applied timestamp if available, otherwise
82
+// status timestamp.
83
+type TasksByTimestamp []*api.Task
84
+
85
+// Len implements the Len method for sorting.
86
+func (t TasksByTimestamp) Len() int {
87
+	return len(t)
88
+}
89
+
90
+// Swap implements the Swap method for sorting.
91
+func (t TasksByTimestamp) Swap(i, j int) {
92
+	t[i], t[j] = t[j], t[i]
93
+}
94
+
95
+// Less implements the Less method for sorting.
96
+func (t TasksByTimestamp) Less(i, j int) bool {
97
+	iTimestamp := t[i].Status.Timestamp
98
+	if t[i].Status.AppliedAt != nil {
99
+		iTimestamp = t[i].Status.AppliedAt
100
+	}
101
+
102
+	jTimestamp := t[j].Status.Timestamp
103
+	if t[j].Status.AppliedAt != nil {
104
+		iTimestamp = t[j].Status.AppliedAt
105
+	}
106
+
107
+	if iTimestamp == nil {
108
+		return true
109
+	}
110
+	if jTimestamp == nil {
111
+		return false
112
+	}
113
+	if iTimestamp.Seconds < jTimestamp.Seconds {
114
+		return true
115
+	}
116
+	if iTimestamp.Seconds > jTimestamp.Seconds {
117
+		return false
118
+	}
119
+	return iTimestamp.Nanos < jTimestamp.Nanos
120
+}
... ...
@@ -1,11 +1,13 @@
1 1
 package taskinit
2 2
 
3 3
 import (
4
+	"sort"
4 5
 	"time"
5 6
 
6 7
 	"github.com/docker/swarmkit/api"
7 8
 	"github.com/docker/swarmkit/api/defaults"
8 9
 	"github.com/docker/swarmkit/log"
10
+	"github.com/docker/swarmkit/manager/orchestrator"
9 11
 	"github.com/docker/swarmkit/manager/orchestrator/restart"
10 12
 	"github.com/docker/swarmkit/manager/state/store"
11 13
 	gogotypes "github.com/gogo/protobuf/types"
... ...
@@ -16,11 +18,13 @@ import (
16 16
 type InitHandler interface {
17 17
 	IsRelatedService(service *api.Service) bool
18 18
 	FixTask(ctx context.Context, batch *store.Batch, t *api.Task)
19
+	SlotTuple(t *api.Task) orchestrator.SlotTuple
19 20
 }
20 21
 
21 22
 // CheckTasks fixes tasks in the store before orchestrator runs. The previous leader might
22 23
 // not have finished processing their updates and left them in an inconsistent state.
23 24
 func CheckTasks(ctx context.Context, s *store.MemoryStore, readTx store.ReadTx, initHandler InitHandler, startSupervisor *restart.Supervisor) error {
25
+	instances := make(map[orchestrator.SlotTuple][]*api.Task)
24 26
 	err := s.Batch(func(batch *store.Batch) error {
25 27
 		tasks, err := store.FindTasks(readTx, store.All)
26 28
 		if err != nil {
... ...
@@ -47,6 +51,9 @@ func CheckTasks(ctx context.Context, s *store.MemoryStore, readTx store.ReadTx,
47 47
 				continue
48 48
 			}
49 49
 
50
+			tuple := initHandler.SlotTuple(t)
51
+			instances[tuple] = append(instances[tuple], t)
52
+
50 53
 			// handle task updates from agent which should have been triggered by task update events
51 54
 			initHandler.FixTask(ctx, batch, t)
52 55
 
... ...
@@ -65,7 +72,12 @@ func CheckTasks(ctx context.Context, s *store.MemoryStore, readTx store.ReadTx,
65 65
 				}
66 66
 			}
67 67
 			if restartDelay != 0 {
68
-				timestamp, err := gogotypes.TimestampFromProto(t.Status.Timestamp)
68
+				var timestamp time.Time
69
+				if t.Status.AppliedAt != nil {
70
+					timestamp, err = gogotypes.TimestampFromProto(t.Status.AppliedAt)
71
+				} else {
72
+					timestamp, err = gogotypes.TimestampFromProto(t.Status.Timestamp)
73
+				}
69 74
 				if err == nil {
70 75
 					restartTime := timestamp.Add(restartDelay)
71 76
 					calculatedRestartDelay := restartTime.Sub(time.Now())
... ...
@@ -99,5 +111,64 @@ func CheckTasks(ctx context.Context, s *store.MemoryStore, readTx store.ReadTx,
99 99
 		}
100 100
 		return nil
101 101
 	})
102
-	return err
102
+	if err != nil {
103
+		return err
104
+	}
105
+
106
+	for tuple, instance := range instances {
107
+		// Find the most current spec version. That's the only one
108
+		// we care about for the purpose of reconstructing restart
109
+		// history.
110
+		maxVersion := uint64(0)
111
+		for _, t := range instance {
112
+			if t.SpecVersion != nil && t.SpecVersion.Index > maxVersion {
113
+				maxVersion = t.SpecVersion.Index
114
+			}
115
+		}
116
+
117
+		// Create a new slice with just the current spec version tasks.
118
+		var upToDate []*api.Task
119
+		for _, t := range instance {
120
+			if t.SpecVersion != nil && t.SpecVersion.Index == maxVersion {
121
+				upToDate = append(upToDate, t)
122
+			}
123
+		}
124
+
125
+		// Sort by creation timestamp
126
+		sort.Sort(tasksByCreationTimestamp(upToDate))
127
+
128
+		// All up-to-date tasks in this instance except the first one
129
+		// should be considered restarted.
130
+		if len(upToDate) < 2 {
131
+			continue
132
+		}
133
+		for _, t := range upToDate[1:] {
134
+			startSupervisor.RecordRestartHistory(tuple, t)
135
+		}
136
+	}
137
+	return nil
138
+}
139
+
140
+type tasksByCreationTimestamp []*api.Task
141
+
142
+func (t tasksByCreationTimestamp) Len() int {
143
+	return len(t)
144
+}
145
+func (t tasksByCreationTimestamp) Swap(i, j int) {
146
+	t[i], t[j] = t[j], t[i]
147
+}
148
+func (t tasksByCreationTimestamp) Less(i, j int) bool {
149
+	if t[i].Meta.CreatedAt == nil {
150
+		return true
151
+	}
152
+	if t[j].Meta.CreatedAt == nil {
153
+		return false
154
+	}
155
+	if t[i].Meta.CreatedAt.Seconds < t[j].Meta.CreatedAt.Seconds {
156
+		return true
157
+	}
158
+	if t[i].Meta.CreatedAt.Seconds > t[j].Meta.CreatedAt.Seconds {
159
+		return false
160
+	}
161
+	return t[i].Meta.CreatedAt.Nanos < t[j].Meta.CreatedAt.Nanos
103 162
 }
... ...
@@ -6,6 +6,7 @@ import (
6 6
 
7 7
 	"github.com/docker/swarmkit/api"
8 8
 	"github.com/docker/swarmkit/log"
9
+	"github.com/docker/swarmkit/manager/orchestrator"
9 10
 	"github.com/docker/swarmkit/manager/state"
10 11
 	"github.com/docker/swarmkit/manager/state/store"
11 12
 	"golang.org/x/net/context"
... ...
@@ -18,19 +19,13 @@ const (
18 18
 	reaperBatchingInterval = 250 * time.Millisecond
19 19
 )
20 20
 
21
-type instanceTuple struct {
22
-	instance  uint64 // unset for global tasks
23
-	serviceID string
24
-	nodeID    string // unset for replicated tasks
25
-}
26
-
27 21
 // A TaskReaper deletes old tasks when more than TaskHistoryRetentionLimit tasks
28 22
 // exist for the same service/instance or service/nodeid combination.
29 23
 type TaskReaper struct {
30 24
 	store *store.MemoryStore
31 25
 	// taskHistory is the number of tasks to keep
32 26
 	taskHistory int64
33
-	dirty       map[instanceTuple]struct{}
27
+	dirty       map[orchestrator.SlotTuple]struct{}
34 28
 	orphaned    []string
35 29
 	stopChan    chan struct{}
36 30
 	doneChan    chan struct{}
... ...
@@ -40,7 +35,7 @@ type TaskReaper struct {
40 40
 func New(store *store.MemoryStore) *TaskReaper {
41 41
 	return &TaskReaper{
42 42
 		store:    store,
43
-		dirty:    make(map[instanceTuple]struct{}),
43
+		dirty:    make(map[orchestrator.SlotTuple]struct{}),
44 44
 		stopChan: make(chan struct{}),
45 45
 		doneChan: make(chan struct{}),
46 46
 	}
... ...
@@ -93,10 +88,10 @@ func (tr *TaskReaper) Run(ctx context.Context) {
93 93
 			switch v := event.(type) {
94 94
 			case api.EventCreateTask:
95 95
 				t := v.Task
96
-				tr.dirty[instanceTuple{
97
-					instance:  t.Slot,
98
-					serviceID: t.ServiceID,
99
-					nodeID:    t.NodeID,
96
+				tr.dirty[orchestrator.SlotTuple{
97
+					Slot:      t.Slot,
98
+					ServiceID: t.ServiceID,
99
+					NodeID:    t.NodeID,
100 100
 				}] = struct{}{}
101 101
 			case api.EventUpdateTask:
102 102
 				t := v.Task
... ...
@@ -138,13 +133,29 @@ func (tr *TaskReaper) tick() {
138 138
 	}
139 139
 	tr.store.View(func(tx store.ReadTx) {
140 140
 		for dirty := range tr.dirty {
141
-			service := store.GetService(tx, dirty.serviceID)
141
+			service := store.GetService(tx, dirty.ServiceID)
142 142
 			if service == nil {
143 143
 				continue
144 144
 			}
145 145
 
146 146
 			taskHistory := tr.taskHistory
147 147
 
148
+			// If MaxAttempts is set, keep at least one more than
149
+			// that number of tasks. This is necessary reconstruct
150
+			// restart history when the orchestrator starts up.
151
+			// TODO(aaronl): Consider hiding tasks beyond the normal
152
+			// retention limit in the UI.
153
+			// TODO(aaronl): There are some ways to cut down the
154
+			// number of retained tasks at the cost of more
155
+			// complexity:
156
+			//   - Don't force retention of tasks with an older spec
157
+			//     version.
158
+			//   - Don't force retention of tasks outside of the
159
+			//     time window configured for restart lookback.
160
+			if service.Spec.Task.Restart != nil && service.Spec.Task.Restart.MaxAttempts > 0 {
161
+				taskHistory = int64(service.Spec.Task.Restart.MaxAttempts) + 1
162
+			}
163
+
148 164
 			if taskHistory < 0 {
149 165
 				continue
150 166
 			}
... ...
@@ -154,19 +165,19 @@ func (tr *TaskReaper) tick() {
154 154
 			switch service.Spec.GetMode().(type) {
155 155
 			case *api.ServiceSpec_Replicated:
156 156
 				var err error
157
-				historicTasks, err = store.FindTasks(tx, store.BySlot(dirty.serviceID, dirty.instance))
157
+				historicTasks, err = store.FindTasks(tx, store.BySlot(dirty.ServiceID, dirty.Slot))
158 158
 				if err != nil {
159 159
 					continue
160 160
 				}
161 161
 
162 162
 			case *api.ServiceSpec_Global:
163
-				tasksByNode, err := store.FindTasks(tx, store.ByNodeID(dirty.nodeID))
163
+				tasksByNode, err := store.FindTasks(tx, store.ByNodeID(dirty.NodeID))
164 164
 				if err != nil {
165 165
 					continue
166 166
 				}
167 167
 
168 168
 				for _, t := range tasksByNode {
169
-					if t.ServiceID == dirty.serviceID {
169
+					if t.ServiceID == dirty.ServiceID {
170 170
 						historicTasks = append(historicTasks, t)
171 171
 					}
172 172
 				}
... ...
@@ -178,7 +189,9 @@ func (tr *TaskReaper) tick() {
178 178
 
179 179
 			// TODO(aaronl): This could filter for non-running tasks and use quickselect
180 180
 			// instead of sorting the whole slice.
181
-			sort.Sort(tasksByTimestamp(historicTasks))
181
+			// TODO(aaronl): This sort should really use lamport time instead of wall
182
+			// clock time. We should store a Version in the Status field.
183
+			sort.Sort(orchestrator.TasksByTimestamp(historicTasks))
182 184
 
183 185
 			runningTasks := 0
184 186
 			for _, t := range historicTasks {
... ...
@@ -219,27 +232,3 @@ func (tr *TaskReaper) Stop() {
219 219
 	close(tr.stopChan)
220 220
 	<-tr.doneChan
221 221
 }
222
-
223
-type tasksByTimestamp []*api.Task
224
-
225
-func (t tasksByTimestamp) Len() int {
226
-	return len(t)
227
-}
228
-func (t tasksByTimestamp) Swap(i, j int) {
229
-	t[i], t[j] = t[j], t[i]
230
-}
231
-func (t tasksByTimestamp) Less(i, j int) bool {
232
-	if t[i].Status.Timestamp == nil {
233
-		return true
234
-	}
235
-	if t[j].Status.Timestamp == nil {
236
-		return false
237
-	}
238
-	if t[i].Status.Timestamp.Seconds < t[j].Status.Timestamp.Seconds {
239
-		return true
240
-	}
241
-	if t[i].Status.Timestamp.Seconds > t[j].Status.Timestamp.Seconds {
242
-		return false
243
-	}
244
-	return t[i].Status.Timestamp.Nanos < t[j].Status.Timestamp.Nanos
245
-}
... ...
@@ -430,7 +430,7 @@ func (u *Updater) updateTask(ctx context.Context, slot orchestrator.Slot, update
430 430
 				u.updatedTasks[updated.ID] = time.Now()
431 431
 				u.updatedTasksMu.Unlock()
432 432
 
433
-				if startThenStop {
433
+				if startThenStop && updated.Status.State == api.TaskStateRunning {
434 434
 					err := u.store.Batch(func(batch *store.Batch) error {
435 435
 						_, err := u.removeOldTasks(ctx, batch, slot)
436 436
 						if err != nil {
... ...
@@ -496,6 +496,9 @@ func (u *Updater) removeOldTasks(ctx context.Context, batch *store.Batch, remove
496 496
 		removedTask *api.Task
497 497
 	)
498 498
 	for _, original := range removeTasks {
499
+		if original.DesiredState > api.TaskStateRunning {
500
+			continue
501
+		}
499 502
 		err := batch.Update(func(tx store.Tx) error {
500 503
 			t := store.GetTask(tx, original.ID)
501 504
 			if t == nil {
... ...
@@ -583,9 +586,8 @@ func (u *Updater) pauseUpdate(ctx context.Context, serviceID, message string) {
583 583
 func (u *Updater) rollbackUpdate(ctx context.Context, serviceID, message string) {
584 584
 	log.G(ctx).Debugf("starting rollback of service %s", serviceID)
585 585
 
586
-	var service *api.Service
587 586
 	err := u.store.Update(func(tx store.Tx) error {
588
-		service = store.GetService(tx, serviceID)
587
+		service := store.GetService(tx, serviceID)
589 588
 		if service == nil {
590 589
 			return nil
591 590
 		}
... ...
@@ -601,7 +603,9 @@ func (u *Updater) rollbackUpdate(ctx context.Context, serviceID, message string)
601 601
 			return errors.New("cannot roll back service because no previous spec is available")
602 602
 		}
603 603
 		service.Spec = *service.PreviousSpec
604
+		service.SpecVersion = service.PreviousSpecVersion.Copy()
604 605
 		service.PreviousSpec = nil
606
+		service.PreviousSpecVersion = nil
605 607
 
606 608
 		return store.UpdateService(tx, service)
607 609
 	})
... ...
@@ -166,6 +166,8 @@ type NodeOptions struct {
166 166
 	// JoinAddr is the cluster to join. May be an empty string to create
167 167
 	// a standalone cluster.
168 168
 	JoinAddr string
169
+	// ForceJoin tells us to join even if already part of a cluster.
170
+	ForceJoin bool
169 171
 	// Config is the raft config.
170 172
 	Config *raft.Config
171 173
 	// StateDir is the directory to store durable state.
... ...
@@ -393,8 +395,10 @@ func (n *Node) JoinAndStart(ctx context.Context) (err error) {
393 393
 
394 394
 	// restore from snapshot
395 395
 	if loadAndStartErr == nil {
396
-		if n.opts.JoinAddr != "" {
397
-			log.G(ctx).Warning("ignoring request to join cluster, because raft state already exists")
396
+		if n.opts.JoinAddr != "" && n.opts.ForceJoin {
397
+			if err := n.joinCluster(ctx); err != nil {
398
+				return errors.Wrap(err, "failed to rejoin cluster")
399
+			}
398 400
 		}
399 401
 		n.campaignWhenAble = true
400 402
 		n.initTransport()
... ...
@@ -402,7 +406,6 @@ func (n *Node) JoinAndStart(ctx context.Context) (err error) {
402 402
 		return nil
403 403
 	}
404 404
 
405
-	// first member of cluster
406 405
 	if n.opts.JoinAddr == "" {
407 406
 		// First member in the cluster, self-assign ID
408 407
 		n.Config.ID = uint64(rand.Int63()) + 1
... ...
@@ -417,6 +420,22 @@ func (n *Node) JoinAndStart(ctx context.Context) (err error) {
417 417
 	}
418 418
 
419 419
 	// join to existing cluster
420
+
421
+	if err := n.joinCluster(ctx); err != nil {
422
+		return err
423
+	}
424
+
425
+	if _, err := n.newRaftLogs(n.opts.ID); err != nil {
426
+		return err
427
+	}
428
+
429
+	n.initTransport()
430
+	n.raftNode = raft.StartNode(n.Config, nil)
431
+
432
+	return nil
433
+}
434
+
435
+func (n *Node) joinCluster(ctx context.Context) error {
420 436
 	if n.opts.Addr == "" {
421 437
 		return errors.New("attempted to join raft cluster without knowing own address")
422 438
 	}
... ...
@@ -438,15 +457,7 @@ func (n *Node) JoinAndStart(ctx context.Context) (err error) {
438 438
 	}
439 439
 
440 440
 	n.Config.ID = resp.RaftID
441
-
442
-	if _, err := n.newRaftLogs(n.opts.ID); err != nil {
443
-		return err
444
-	}
445 441
 	n.bootstrapMembers = resp.Members
446
-
447
-	n.initTransport()
448
-	n.raftNode = raft.StartNode(n.Config, nil)
449
-
450 442
 	return nil
451 443
 }
452 444
 
... ...
@@ -909,24 +920,6 @@ func (n *Node) Join(ctx context.Context, req *api.JoinRequest) (*api.JoinRespons
909 909
 		return nil, grpc.Errorf(codes.FailedPrecondition, "%s", ErrLostLeadership.Error())
910 910
 	}
911 911
 
912
-	// A single manager must not be able to join the raft cluster twice. If
913
-	// it did, that would cause the quorum to be computed incorrectly. This
914
-	// could happen if the WAL was deleted from an active manager.
915
-	for _, m := range n.cluster.Members() {
916
-		if m.NodeID == nodeInfo.NodeID {
917
-			return nil, grpc.Errorf(codes.AlreadyExists, "%s", "a raft member with this node ID already exists")
918
-		}
919
-	}
920
-
921
-	// Find a unique ID for the joining member.
922
-	var raftID uint64
923
-	for {
924
-		raftID = uint64(rand.Int63()) + 1
925
-		if n.cluster.GetMember(raftID) == nil && !n.cluster.IsIDRemoved(raftID) {
926
-			break
927
-		}
928
-	}
929
-
930 912
 	remoteAddr := req.Addr
931 913
 
932 914
 	// If the joining node sent an address like 0.0.0.0:4242, automatically
... ...
@@ -953,12 +946,54 @@ func (n *Node) Join(ctx context.Context, req *api.JoinRequest) (*api.JoinRespons
953 953
 		return nil, err
954 954
 	}
955 955
 
956
+	// If the peer is already a member of the cluster, we will only update
957
+	// its information, not add it as a new member. Adding it again would
958
+	// cause the quorum to be computed incorrectly.
959
+	for _, m := range n.cluster.Members() {
960
+		if m.NodeID == nodeInfo.NodeID {
961
+			if remoteAddr == m.Addr {
962
+				return n.joinResponse(m.RaftID), nil
963
+			}
964
+			updatedRaftMember := &api.RaftMember{
965
+				RaftID: m.RaftID,
966
+				NodeID: m.NodeID,
967
+				Addr:   remoteAddr,
968
+			}
969
+			if err := n.cluster.UpdateMember(m.RaftID, updatedRaftMember); err != nil {
970
+				return nil, err
971
+			}
972
+
973
+			if err := n.updateNodeBlocking(ctx, m.RaftID, remoteAddr); err != nil {
974
+				log.WithError(err).Error("failed to update node address")
975
+				return nil, err
976
+			}
977
+
978
+			log.Info("updated node address")
979
+			return n.joinResponse(m.RaftID), nil
980
+		}
981
+	}
982
+
983
+	// Find a unique ID for the joining member.
984
+	var raftID uint64
985
+	for {
986
+		raftID = uint64(rand.Int63()) + 1
987
+		if n.cluster.GetMember(raftID) == nil && !n.cluster.IsIDRemoved(raftID) {
988
+			break
989
+		}
990
+	}
991
+
956 992
 	err = n.addMember(ctx, remoteAddr, raftID, nodeInfo.NodeID)
957 993
 	if err != nil {
958 994
 		log.WithError(err).Errorf("failed to add member %x", raftID)
959 995
 		return nil, err
960 996
 	}
961 997
 
998
+	log.Debug("node joined")
999
+
1000
+	return n.joinResponse(raftID), nil
1001
+}
1002
+
1003
+func (n *Node) joinResponse(raftID uint64) *api.JoinResponse {
962 1004
 	var nodes []*api.RaftMember
963 1005
 	for _, node := range n.cluster.Members() {
964 1006
 		nodes = append(nodes, &api.RaftMember{
... ...
@@ -967,9 +1002,8 @@ func (n *Node) Join(ctx context.Context, req *api.JoinRequest) (*api.JoinRespons
967 967
 			Addr:   node.Addr,
968 968
 		})
969 969
 	}
970
-	log.Debugf("node joined")
971 970
 
972
-	return &api.JoinResponse{Members: nodes, RaftID: raftID}, nil
971
+	return &api.JoinResponse{Members: nodes, RaftID: raftID}
973 972
 }
974 973
 
975 974
 // checkHealth tries to contact an aspiring member through its advertised address
... ...
@@ -1,12 +1,24 @@
1 1
 package watchapi
2 2
 
3 3
 import (
4
+	"errors"
5
+	"sync"
6
+
4 7
 	"github.com/docker/swarmkit/manager/state/store"
8
+	"golang.org/x/net/context"
9
+)
10
+
11
+var (
12
+	errAlreadyRunning = errors.New("broker is already running")
13
+	errNotRunning     = errors.New("broker is not running")
5 14
 )
6 15
 
7 16
 // Server is the store API gRPC server.
8 17
 type Server struct {
9
-	store *store.MemoryStore
18
+	store     *store.MemoryStore
19
+	mu        sync.Mutex
20
+	pctx      context.Context
21
+	cancelAll func()
10 22
 }
11 23
 
12 24
 // NewServer creates a store API server.
... ...
@@ -15,3 +27,30 @@ func NewServer(store *store.MemoryStore) *Server {
15 15
 		store: store,
16 16
 	}
17 17
 }
18
+
19
+// Start starts the watch server.
20
+func (s *Server) Start(ctx context.Context) error {
21
+	s.mu.Lock()
22
+	defer s.mu.Unlock()
23
+
24
+	if s.cancelAll != nil {
25
+		return errAlreadyRunning
26
+	}
27
+
28
+	s.pctx, s.cancelAll = context.WithCancel(ctx)
29
+	return nil
30
+}
31
+
32
+// Stop stops the watch server.
33
+func (s *Server) Stop() error {
34
+	s.mu.Lock()
35
+	defer s.mu.Unlock()
36
+
37
+	if s.cancelAll == nil {
38
+		return errNotRunning
39
+	}
40
+	s.cancelAll()
41
+	s.cancelAll = nil
42
+
43
+	return nil
44
+}
... ...
@@ -17,6 +17,13 @@ import (
17 17
 func (s *Server) Watch(request *api.WatchRequest, stream api.Watch_WatchServer) error {
18 18
 	ctx := stream.Context()
19 19
 
20
+	s.mu.Lock()
21
+	pctx := s.pctx
22
+	s.mu.Unlock()
23
+	if pctx == nil {
24
+		return errNotRunning
25
+	}
26
+
20 27
 	watchArgs, err := api.ConvertWatchArgs(request.Entries)
21 28
 	if err != nil {
22 29
 		return grpc.Errorf(codes.InvalidArgument, "%s", err.Error())
... ...
@@ -39,6 +46,8 @@ func (s *Server) Watch(request *api.WatchRequest, stream api.Watch_WatchServer)
39 39
 		select {
40 40
 		case <-ctx.Done():
41 41
 			return ctx.Err()
42
+		case <-pctx.Done():
43
+			return pctx.Err()
42 44
 		case event := <-watch:
43 45
 			if commitEvent, ok := event.(state.EventCommit); ok && len(events) > 0 {
44 46
 				if err := stream.Send(&api.WatchMessage{Events: events, Version: commitEvent.Version}); err != nil {
... ...
@@ -308,8 +308,6 @@ func (n *Node) run(ctx context.Context) (err error) {
308 308
 			case <-agentDone:
309 309
 				return
310 310
 			case nodeChanges := <-n.notifyNodeChange:
311
-				currentRole := n.currentRole()
312
-
313 311
 				if nodeChanges.Node != nil {
314 312
 					// This is a bit complex to be backward compatible with older CAs that
315 313
 					// don't support the Node.Role field. They only use what's presently
... ...
@@ -335,10 +333,7 @@ func (n *Node) run(ctx context.Context) (err error) {
335 335
 				}
336 336
 
337 337
 				if nodeChanges.RootCert != nil {
338
-					// We only want to update the root CA if this is a worker node.  Manager nodes directly watch the raft
339
-					// store and update the root CA, with the necessary signer, from the raft store (since the managers
340
-					// need the CA key as well to potentially issue new TLS certificates).
341
-					if currentRole == api.NodeRoleManager || bytes.Equal(nodeChanges.RootCert, securityConfig.RootCA().Certs) {
338
+					if bytes.Equal(nodeChanges.RootCert, securityConfig.RootCA().Certs) {
342 339
 						continue
343 340
 					}
344 341
 					newRootCA, err := ca.NewRootCA(nodeChanges.RootCert, nil, nil, ca.DefaultNodeCertExpiration, nil)
... ...
@@ -346,7 +341,7 @@ func (n *Node) run(ctx context.Context) (err error) {
346 346
 						log.G(ctx).WithError(err).Error("invalid new root certificate from the dispatcher")
347 347
 						continue
348 348
 					}
349
-					if err := securityConfig.UpdateRootCA(&newRootCA, newRootCA.Pool); err != nil {
349
+					if err := securityConfig.UpdateRootCA(&newRootCA); err != nil {
350 350
 						log.G(ctx).WithError(err).Error("could not use new root CA from dispatcher")
351 351
 						continue
352 352
 					}
... ...
@@ -828,14 +823,22 @@ func (n *Node) runManager(ctx context.Context, securityConfig *ca.SecurityConfig
828 828
 		}
829 829
 	}
830 830
 
831
-	remoteAddr, _ := n.remotes.Select(n.NodeID())
831
+	joinAddr := n.config.JoinAddr
832
+	if joinAddr == "" {
833
+		remoteAddr, err := n.remotes.Select(n.NodeID())
834
+		if err == nil {
835
+			joinAddr = remoteAddr.Addr
836
+		}
837
+	}
838
+
832 839
 	m, err := manager.New(&manager.Config{
833 840
 		ForceNewCluster:  n.config.ForceNewCluster,
834 841
 		RemoteAPI:        remoteAPI,
835 842
 		ControlAPI:       n.config.ListenControlAPI,
836 843
 		SecurityConfig:   securityConfig,
837 844
 		ExternalCAs:      n.config.ExternalCAs,
838
-		JoinRaft:         remoteAddr.Addr,
845
+		JoinRaft:         joinAddr,
846
+		ForceJoin:        n.config.JoinAddr != "",
839 847
 		StateDir:         n.config.StateDir,
840 848
 		HeartbeatTick:    n.config.HeartbeatTick,
841 849
 		ElectionTick:     n.config.ElectionTick,
842 850
deleted file mode 100644
... ...
@@ -1,3 +0,0 @@
1
-package plugin
2
-
3
-//go:generate protoc -I.:/usr/local --gogoswarm_out=import_path=github.com/docker/swarmkit/protobuf/plugin,Mgoogle/protobuf/descriptor.proto=github.com/gogo/protobuf/protoc-gen-gogo/descriptor:. plugin.proto
... ...
@@ -1,12 +1,12 @@
1 1
 // Code generated by protoc-gen-gogo.
2
-// source: plugin.proto
2
+// source: github.com/docker/swarmkit/protobuf/plugin/plugin.proto
3 3
 // DO NOT EDIT!
4 4
 
5 5
 /*
6 6
 	Package plugin is a generated protocol buffer package.
7 7
 
8 8
 	It is generated from these files:
9
-		plugin.proto
9
+		github.com/docker/swarmkit/protobuf/plugin/plugin.proto
10 10
 
11 11
 	It has these top-level messages:
12 12
 		WatchSelectors
... ...
@@ -20,6 +20,8 @@ import fmt "fmt"
20 20
 import math "math"
21 21
 import google_protobuf "github.com/gogo/protobuf/protoc-gen-gogo/descriptor"
22 22
 
23
+import github_com_docker_swarmkit_api_deepcopy "github.com/docker/swarmkit/api/deepcopy"
24
+
23 25
 import github_com_gogo_protobuf_proto "github.com/gogo/protobuf/proto"
24 26
 
25 27
 import strings "strings"
... ...
@@ -92,7 +94,7 @@ var E_Deepcopy = &proto.ExtensionDesc{
92 92
 	Field:         70000,
93 93
 	Name:          "docker.protobuf.plugin.deepcopy",
94 94
 	Tag:           "varint,70000,opt,name=deepcopy,def=1",
95
-	Filename:      "plugin.proto",
95
+	Filename:      "github.com/docker/swarmkit/protobuf/plugin/plugin.proto",
96 96
 }
97 97
 
98 98
 var E_StoreObject = &proto.ExtensionDesc{
... ...
@@ -101,7 +103,7 @@ var E_StoreObject = &proto.ExtensionDesc{
101 101
 	Field:         70001,
102 102
 	Name:          "docker.protobuf.plugin.store_object",
103 103
 	Tag:           "bytes,70001,opt,name=store_object,json=storeObject",
104
-	Filename:      "plugin.proto",
104
+	Filename:      "github.com/docker/swarmkit/protobuf/plugin/plugin.proto",
105 105
 }
106 106
 
107 107
 var E_TlsAuthorization = &proto.ExtensionDesc{
... ...
@@ -110,7 +112,7 @@ var E_TlsAuthorization = &proto.ExtensionDesc{
110 110
 	Field:         73626345,
111 111
 	Name:          "docker.protobuf.plugin.tls_authorization",
112 112
 	Tag:           "bytes,73626345,opt,name=tls_authorization,json=tlsAuthorization",
113
-	Filename:      "plugin.proto",
113
+	Filename:      "github.com/docker/swarmkit/protobuf/plugin/plugin.proto",
114 114
 }
115 115
 
116 116
 func init() {
... ...
@@ -121,6 +123,61 @@ func init() {
121 121
 	proto.RegisterExtension(E_StoreObject)
122 122
 	proto.RegisterExtension(E_TlsAuthorization)
123 123
 }
124
+
125
+func (m *WatchSelectors) Copy() *WatchSelectors {
126
+	if m == nil {
127
+		return nil
128
+	}
129
+	o := &WatchSelectors{}
130
+	o.CopyFrom(m)
131
+	return o
132
+}
133
+
134
+func (m *WatchSelectors) CopyFrom(src interface{}) {
135
+
136
+	o := src.(*WatchSelectors)
137
+	*m = *o
138
+}
139
+
140
+func (m *StoreObject) Copy() *StoreObject {
141
+	if m == nil {
142
+		return nil
143
+	}
144
+	o := &StoreObject{}
145
+	o.CopyFrom(m)
146
+	return o
147
+}
148
+
149
+func (m *StoreObject) CopyFrom(src interface{}) {
150
+
151
+	o := src.(*StoreObject)
152
+	*m = *o
153
+	if o.WatchSelectors != nil {
154
+		m.WatchSelectors = &WatchSelectors{}
155
+		github_com_docker_swarmkit_api_deepcopy.Copy(m.WatchSelectors, o.WatchSelectors)
156
+	}
157
+}
158
+
159
+func (m *TLSAuthorization) Copy() *TLSAuthorization {
160
+	if m == nil {
161
+		return nil
162
+	}
163
+	o := &TLSAuthorization{}
164
+	o.CopyFrom(m)
165
+	return o
166
+}
167
+
168
+func (m *TLSAuthorization) CopyFrom(src interface{}) {
169
+
170
+	o := src.(*TLSAuthorization)
171
+	*m = *o
172
+	if o.Roles != nil {
173
+		m.Roles = make([]string, len(o.Roles))
174
+		copy(m.Roles, o.Roles)
175
+	}
176
+
177
+}
178
+
124 179
 func (m *WatchSelectors) Marshal() (dAtA []byte, err error) {
125 180
 	size := m.Size()
126 181
 	dAtA = make([]byte, size)
... ...
@@ -378,6 +435,7 @@ func encodeVarintPlugin(dAtA []byte, offset int, v uint64) int {
378 378
 	dAtA[offset] = uint8(v)
379 379
 	return offset + 1
380 380
 }
381
+
381 382
 func (m *WatchSelectors) Size() (n int) {
382 383
 	var l int
383 384
 	_ = l
... ...
@@ -1143,43 +1201,46 @@ var (
1143 1143
 	ErrIntOverflowPlugin   = fmt.Errorf("proto: integer overflow")
1144 1144
 )
1145 1145
 
1146
-func init() { proto.RegisterFile("plugin.proto", fileDescriptorPlugin) }
1146
+func init() {
1147
+	proto.RegisterFile("github.com/docker/swarmkit/protobuf/plugin/plugin.proto", fileDescriptorPlugin)
1148
+}
1147 1149
 
1148 1150
 var fileDescriptorPlugin = []byte{
1149
-	// 551 bytes of a gzipped FileDescriptorProto
1150
-	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x84, 0x52, 0xc1, 0x6e, 0xd3, 0x40,
1151
-	0x10, 0xad, 0xd3, 0x36, 0x4d, 0xc6, 0x69, 0x29, 0x2b, 0x54, 0xad, 0x7a, 0xb0, 0xab, 0x46, 0x42,
1152
-	0x41, 0x42, 0xa9, 0xd4, 0x63, 0x6e, 0x94, 0x5c, 0x22, 0x01, 0x45, 0x0e, 0x12, 0x37, 0x2c, 0xd7,
1153
-	0x3b, 0x4d, 0x96, 0x3a, 0x5e, 0x6b, 0x77, 0x4d, 0x0b, 0x27, 0x7e, 0x80, 0x0f, 0xe0, 0xca, 0xd7,
1154
-	0xf4, 0xc8, 0x91, 0x53, 0x44, 0x2d, 0x71, 0xe0, 0x06, 0x7f, 0x80, 0x76, 0xd7, 0x69, 0x09, 0x6a,
1155
-	0xc5, 0xc9, 0x33, 0x6f, 0xe6, 0xcd, 0xcc, 0xdb, 0x67, 0xe8, 0x14, 0x59, 0x39, 0xe1, 0x79, 0xbf,
1156
-	0x90, 0x42, 0x0b, 0xb2, 0xc3, 0x44, 0x7a, 0x86, 0xd2, 0x65, 0x27, 0xe5, 0x69, 0xdf, 0x55, 0x77,
1157
-	0xf7, 0x26, 0x42, 0x4c, 0x32, 0x3c, 0x58, 0xe0, 0x07, 0x0c, 0x55, 0x2a, 0x79, 0xa1, 0x45, 0xdd,
1158
-	0xbb, 0xff, 0x79, 0x15, 0xb6, 0x5e, 0x27, 0x3a, 0x9d, 0x8e, 0x31, 0xc3, 0x54, 0x0b, 0xa9, 0xc8,
1159
-	0x0e, 0x34, 0x38, 0xa3, 0xde, 0x9e, 0xd7, 0x6b, 0x1d, 0x35, 0xab, 0x79, 0xd8, 0x18, 0x0d, 0xa3,
1160
-	0x06, 0x67, 0xe4, 0x11, 0xb4, 0x39, 0x8b, 0x0b, 0x89, 0xa7, 0xfc, 0x82, 0x36, 0x6c, 0xb9, 0x53,
1161
-	0xcd, 0xc3, 0xd6, 0x68, 0xf8, 0xd2, 0x62, 0x51, 0x8b, 0x33, 0x17, 0x11, 0x02, 0x6b, 0x79, 0x32,
1162
-	0x43, 0xba, 0x6a, 0xba, 0x22, 0x1b, 0x93, 0x10, 0x7c, 0xf3, 0x5d, 0x0c, 0x58, 0xb3, 0x25, 0x30,
1163
-	0x50, 0x4d, 0xda, 0x81, 0x66, 0x5a, 0x2a, 0x2d, 0x66, 0x74, 0xdd, 0xd6, 0xea, 0x8c, 0x74, 0x61,
1164
-	0xd3, 0x45, 0x0b, 0x6a, 0xd3, 0x96, 0x3b, 0x0e, 0xac, 0xc9, 0x8f, 0x01, 0x14, 0xca, 0x77, 0x3c,
1165
-	0xc5, 0x98, 0x33, 0xba, 0x61, 0xaf, 0xdb, 0xac, 0xe6, 0x61, 0x7b, 0xec, 0xd0, 0xd1, 0x30, 0x6a,
1166
-	0xd7, 0x0d, 0x23, 0x46, 0xba, 0xb0, 0x91, 0x0b, 0x66, 0x5b, 0x5b, 0xb6, 0x15, 0xaa, 0x79, 0xd8,
1167
-	0x7c, 0x21, 0x98, 0xe9, 0x6b, 0x9a, 0xd2, 0x88, 0x19, 0x11, 0x2a, 0x13, 0x9a, 0xb6, 0x9d, 0x08,
1168
-	0x13, 0x9b, 0x5b, 0x18, 0x2a, 0x2e, 0x91, 0xc5, 0x4a, 0x27, 0x1a, 0x29, 0xb8, 0x5b, 0x6a, 0x70,
1169
-	0x6c, 0x30, 0x43, 0x94, 0x22, 0x43, 0xea, 0x3b, 0xa2, 0x89, 0x49, 0x00, 0x30, 0xc3, 0xd9, 0x09,
1170
-	0x4a, 0x35, 0xe5, 0x05, 0xed, 0x38, 0xf1, 0x37, 0x88, 0xe1, 0x9c, 0xf1, 0x9c, 0xd1, 0x4d, 0xc7,
1171
-	0x31, 0xf1, 0xfe, 0x1b, 0xf0, 0xc7, 0x5a, 0x48, 0x3c, 0x3e, 0x79, 0x8b, 0xa9, 0x26, 0xc7, 0x70,
1172
-	0xef, 0xdc, 0x38, 0x15, 0xab, 0x85, 0x55, 0xd4, 0xdb, 0x6b, 0xf4, 0xfc, 0xc3, 0x87, 0xfd, 0xdb,
1173
-	0xed, 0xef, 0x2f, 0x1b, 0x1b, 0x6d, 0x9d, 0x2f, 0xe5, 0xfb, 0x43, 0xd8, 0x7e, 0xf5, 0x6c, 0xfc,
1174
-	0xa4, 0xd4, 0x53, 0x21, 0xf9, 0x87, 0x44, 0x73, 0x91, 0x93, 0x07, 0xb0, 0x6e, 0xee, 0x35, 0xa3,
1175
-	0x57, 0x7b, 0xed, 0xc8, 0x25, 0x64, 0x17, 0x5a, 0x3c, 0x57, 0x98, 0x96, 0x12, 0x9d, 0xf3, 0xd1,
1176
-	0x75, 0x3e, 0x78, 0x0a, 0x2d, 0x86, 0x58, 0xa4, 0xa2, 0x78, 0x4f, 0xc2, 0xbe, 0xfb, 0xe1, 0x6e,
1177
-	0x2e, 0x79, 0x8e, 0x4a, 0x25, 0x13, 0x3c, 0x2e, 0xcc, 0x74, 0x45, 0x7f, 0x7d, 0xb1, 0xbe, 0x0f,
1178
-	0xd6, 0xb4, 0x2c, 0x31, 0xba, 0x26, 0x0e, 0x38, 0x74, 0x94, 0x91, 0x1a, 0x0b, 0xa7, 0xf5, 0xbf,
1179
-	0x83, 0x7e, 0xdb, 0x41, 0xfe, 0x61, 0xf7, 0x2e, 0xed, 0x7f, 0xbd, 0x5c, 0xe4, 0xab, 0x9b, 0x64,
1180
-	0x70, 0x01, 0xf7, 0x75, 0xa6, 0xe2, 0x64, 0x49, 0x76, 0x70, 0xcb, 0x3e, 0x3d, 0x15, 0x6c, 0xb1,
1181
-	0xee, 0xe7, 0x8f, 0x4f, 0x5d, 0xbb, 0xaf, 0x77, 0xd7, 0xbe, 0x7f, 0x5f, 0x32, 0xda, 0xd6, 0x99,
1182
-	0x5a, 0x42, 0x8e, 0xe8, 0xe5, 0x55, 0xb0, 0xf2, 0xed, 0x2a, 0x58, 0xf9, 0x58, 0x05, 0xde, 0x65,
1183
-	0x15, 0x78, 0x5f, 0xab, 0xc0, 0xfb, 0x5e, 0x05, 0xde, 0x9f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x94,
1184
-	0xd6, 0x21, 0x73, 0xce, 0x03, 0x00, 0x00,
1151
+	// 575 bytes of a gzipped FileDescriptorProto
1152
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x84, 0x52, 0xc1, 0x6e, 0xd3, 0x4c,
1153
+	0x10, 0xae, 0xd3, 0x36, 0x4d, 0x26, 0x69, 0xff, 0xfe, 0x2b, 0x54, 0xad, 0x7a, 0x70, 0xaa, 0x46,
1154
+	0x42, 0x41, 0x42, 0x8e, 0xd4, 0x0b, 0x52, 0x6e, 0x94, 0x5c, 0x22, 0x01, 0x45, 0x0e, 0x12, 0x37,
1155
+	0x22, 0xc7, 0x3b, 0x4d, 0x96, 0x3a, 0x5e, 0x6b, 0x77, 0x4d, 0x0a, 0x27, 0x5e, 0x80, 0x07, 0xe0,
1156
+	0xca, 0xd3, 0xf4, 0xc8, 0x91, 0x53, 0x44, 0x2d, 0x71, 0xe0, 0x06, 0x6f, 0x80, 0x76, 0xd7, 0x69,
1157
+	0x08, 0x6a, 0xc5, 0xc9, 0x33, 0xdf, 0x7c, 0xdf, 0xcc, 0x7c, 0x3b, 0x86, 0x47, 0x13, 0xae, 0xa7,
1158
+	0xf9, 0x38, 0x88, 0xc5, 0xac, 0xcb, 0x44, 0x7c, 0x81, 0xb2, 0xab, 0xe6, 0x91, 0x9c, 0x5d, 0x70,
1159
+	0xdd, 0xcd, 0xa4, 0xd0, 0x62, 0x9c, 0x9f, 0x77, 0xb3, 0x24, 0x9f, 0xf0, 0xb4, 0xfc, 0x04, 0x16,
1160
+	0x26, 0x07, 0x8e, 0x1d, 0x2c, 0x49, 0x81, 0xab, 0x1e, 0x1e, 0x4d, 0x84, 0x98, 0x24, 0xb8, 0x12,
1161
+	0x33, 0x54, 0xb1, 0xe4, 0x99, 0x16, 0x25, 0xf7, 0xf8, 0xd3, 0x26, 0xec, 0xbd, 0x8a, 0x74, 0x3c,
1162
+	0x1d, 0x62, 0x82, 0xb1, 0x16, 0x52, 0x91, 0x03, 0xa8, 0x70, 0x46, 0xbd, 0x23, 0xaf, 0x53, 0x3b,
1163
+	0xad, 0x16, 0x8b, 0x56, 0x65, 0xd0, 0x0f, 0x2b, 0x9c, 0x91, 0x07, 0x50, 0xe7, 0x6c, 0x94, 0x49,
1164
+	0x3c, 0xe7, 0x97, 0xb4, 0x62, 0xcb, 0xcd, 0x62, 0xd1, 0xaa, 0x0d, 0xfa, 0x2f, 0x2c, 0x16, 0xd6,
1165
+	0x38, 0x73, 0x11, 0x21, 0xb0, 0x95, 0x46, 0x33, 0xa4, 0x9b, 0x86, 0x15, 0xda, 0x98, 0xb4, 0xa0,
1166
+	0x61, 0xbe, 0xcb, 0x06, 0x5b, 0xb6, 0x04, 0x06, 0x2a, 0x45, 0x07, 0x50, 0x8d, 0x73, 0xa5, 0xc5,
1167
+	0x8c, 0x6e, 0xdb, 0x5a, 0x99, 0x91, 0x36, 0xec, 0xba, 0x68, 0x29, 0xad, 0xda, 0x72, 0xd3, 0x81,
1168
+	0xa5, 0xf8, 0x21, 0x80, 0x42, 0xf9, 0x96, 0xc7, 0x38, 0xe2, 0x8c, 0xee, 0xd8, 0xed, 0x76, 0x8b,
1169
+	0x45, 0xab, 0x3e, 0x74, 0xe8, 0xa0, 0x1f, 0xd6, 0x4b, 0xc2, 0x80, 0x91, 0x36, 0xec, 0xa4, 0x82,
1170
+	0x59, 0x6a, 0xcd, 0x52, 0xa1, 0x58, 0xb4, 0xaa, 0xcf, 0x05, 0x33, 0xbc, 0xaa, 0x29, 0x0d, 0x98,
1171
+	0x31, 0xa1, 0x12, 0xa1, 0x69, 0xdd, 0x99, 0x30, 0xb1, 0xd9, 0x85, 0xa1, 0xe2, 0x12, 0xd9, 0x48,
1172
+	0xe9, 0x48, 0x23, 0x05, 0xb7, 0x4b, 0x09, 0x0e, 0x0d, 0x66, 0x84, 0x52, 0x24, 0x48, 0x1b, 0x4e,
1173
+	0x68, 0x62, 0xe2, 0x03, 0xcc, 0x70, 0x36, 0x46, 0xa9, 0xa6, 0x3c, 0xa3, 0x4d, 0x67, 0x7e, 0x85,
1174
+	0x18, 0xcd, 0x05, 0x4f, 0x19, 0xdd, 0x75, 0x1a, 0x13, 0x1f, 0xbf, 0x86, 0xc6, 0x50, 0x0b, 0x89,
1175
+	0x67, 0xe3, 0x37, 0x18, 0x6b, 0x72, 0x06, 0xff, 0xcd, 0xcd, 0xa5, 0x46, 0x6a, 0x79, 0x2a, 0xea,
1176
+	0x1d, 0x55, 0x3a, 0x8d, 0x93, 0xfb, 0xc1, 0xed, 0xe7, 0x0f, 0xd6, 0x0f, 0x1b, 0xee, 0xcd, 0xd7,
1177
+	0xf2, 0xe3, 0x3e, 0xec, 0xbf, 0x7c, 0x3a, 0x7c, 0x9c, 0xeb, 0xa9, 0x90, 0xfc, 0x7d, 0xa4, 0xb9,
1178
+	0x48, 0xc9, 0x3d, 0xd8, 0x36, 0xfb, 0x9a, 0xd6, 0x9b, 0x9d, 0x7a, 0xe8, 0x12, 0x72, 0x08, 0x35,
1179
+	0x9e, 0x2a, 0x8c, 0x73, 0x89, 0xee, 0xf2, 0xe1, 0x4d, 0xde, 0x7b, 0x02, 0x35, 0x86, 0x98, 0xc5,
1180
+	0x22, 0x7b, 0x47, 0x5a, 0x81, 0xfb, 0xe1, 0x56, 0x9b, 0x3c, 0x43, 0xa5, 0xa2, 0x09, 0x9e, 0x65,
1181
+	0xa6, 0xbb, 0xa2, 0x3f, 0x3f, 0xdb, 0xbb, 0xf7, 0xb6, 0xb4, 0xcc, 0x31, 0xbc, 0x11, 0xf6, 0x38,
1182
+	0x34, 0x95, 0xb1, 0x3a, 0x12, 0xce, 0xeb, 0x3f, 0x1b, 0xfd, 0xb2, 0x8d, 0x1a, 0x27, 0xed, 0xbb,
1183
+	0xbc, 0xff, 0xf1, 0x72, 0x61, 0x43, 0xad, 0x92, 0xde, 0x25, 0xfc, 0xaf, 0x13, 0x35, 0x8a, 0xd6,
1184
+	0x6c, 0xfb, 0xb7, 0xcc, 0xd3, 0x53, 0xc1, 0x96, 0xe3, 0x7e, 0x7c, 0xff, 0xd8, 0xb6, 0xf3, 0x3a,
1185
+	0x77, 0xcd, 0xfb, 0xfb, 0x25, 0xc3, 0x7d, 0x9d, 0xa8, 0x35, 0xe4, 0x94, 0x5e, 0x5d, 0xfb, 0x1b,
1186
+	0x5f, 0xaf, 0xfd, 0x8d, 0x0f, 0x85, 0xef, 0x5d, 0x15, 0xbe, 0xf7, 0xa5, 0xf0, 0xbd, 0x6f, 0x85,
1187
+	0xef, 0xfd, 0x0e, 0x00, 0x00, 0xff, 0xff, 0xb3, 0x99, 0x7d, 0xfb, 0xf9, 0x03, 0x00, 0x00,
1185 1188
 }
... ...
@@ -107,9 +107,10 @@ type PayloadContext struct {
107 107
 	t                 *api.Task
108 108
 	restrictedSecrets exec.SecretGetter
109 109
 	restrictedConfigs exec.ConfigGetter
110
+	sensitive         bool
110 111
 }
111 112
 
112
-func (ctx PayloadContext) secretGetter(target string) (string, error) {
113
+func (ctx *PayloadContext) secretGetter(target string) (string, error) {
113 114
 	if ctx.restrictedSecrets == nil {
114 115
 		return "", errors.New("secrets unavailable")
115 116
 	}
... ...
@@ -126,6 +127,7 @@ func (ctx PayloadContext) secretGetter(target string) (string, error) {
126 126
 			if err != nil {
127 127
 				return "", err
128 128
 			}
129
+			ctx.sensitive = true
129 130
 			return string(secret.Spec.Data), nil
130 131
 		}
131 132
 	}
... ...
@@ -133,7 +135,7 @@ func (ctx PayloadContext) secretGetter(target string) (string, error) {
133 133
 	return "", errors.Errorf("secret target %s not found", target)
134 134
 }
135 135
 
136
-func (ctx PayloadContext) configGetter(target string) (string, error) {
136
+func (ctx *PayloadContext) configGetter(target string) (string, error) {
137 137
 	if ctx.restrictedConfigs == nil {
138 138
 		return "", errors.New("configs unavailable")
139 139
 	}
... ...
@@ -157,7 +159,7 @@ func (ctx PayloadContext) configGetter(target string) (string, error) {
157 157
 	return "", errors.Errorf("config target %s not found", target)
158 158
 }
159 159
 
160
-func (ctx PayloadContext) envGetter(variable string) (string, error) {
160
+func (ctx *PayloadContext) envGetter(variable string) (string, error) {
161 161
 	container := ctx.t.Spec.GetContainer()
162 162
 	if container == nil {
163 163
 		return "", errors.New("task is not a container")
... ...
@@ -119,7 +119,7 @@ func expandEnv(ctx Context, values []string) ([]string, error) {
119 119
 	return result, nil
120 120
 }
121 121
 
122
-func expandPayload(ctx PayloadContext, payload []byte) ([]byte, error) {
122
+func expandPayload(ctx *PayloadContext, payload []byte) ([]byte, error) {
123 123
 	result, err := ctx.Expand(string(payload))
124 124
 	if err != nil {
125 125
 		return payload, err
... ...
@@ -138,7 +138,7 @@ func ExpandSecretSpec(s *api.Secret, node *api.NodeDescription, t *api.Task, dep
138 138
 		secretSpec := s.Spec.Copy()
139 139
 
140 140
 		var err error
141
-		secretSpec.Data, err = expandPayload(ctx, secretSpec.Data)
141
+		secretSpec.Data, err = expandPayload(&ctx, secretSpec.Data)
142 142
 		return secretSpec, err
143 143
 	}
144 144
 	return &s.Spec, errors.New("unrecognized template type")
... ...
@@ -146,17 +146,17 @@ func ExpandSecretSpec(s *api.Secret, node *api.NodeDescription, t *api.Task, dep
146 146
 
147 147
 // ExpandConfigSpec expands the template inside the config payload, if any.
148 148
 // Templating is evaluated on the agent-side.
149
-func ExpandConfigSpec(c *api.Config, node *api.NodeDescription, t *api.Task, dependencies exec.DependencyGetter) (*api.ConfigSpec, error) {
149
+func ExpandConfigSpec(c *api.Config, node *api.NodeDescription, t *api.Task, dependencies exec.DependencyGetter) (*api.ConfigSpec, bool, error) {
150 150
 	if c.Spec.Templating == nil {
151
-		return &c.Spec, nil
151
+		return &c.Spec, false, nil
152 152
 	}
153 153
 	if c.Spec.Templating.Name == "golang" {
154 154
 		ctx := NewPayloadContextFromTask(node, t, dependencies)
155 155
 		configSpec := c.Spec.Copy()
156 156
 
157 157
 		var err error
158
-		configSpec.Data, err = expandPayload(ctx, configSpec.Data)
159
-		return configSpec, err
158
+		configSpec.Data, err = expandPayload(&ctx, configSpec.Data)
159
+		return configSpec, ctx.sensitive, err
160 160
 	}
161
-	return &c.Spec, errors.New("unrecognized template type")
161
+	return &c.Spec, false, errors.New("unrecognized template type")
162 162
 }
... ...
@@ -42,6 +42,18 @@ func (t templatedSecretGetter) Get(secretID string) (*api.Secret, error) {
42 42
 	return &secretCopy, nil
43 43
 }
44 44
 
45
+// TemplatedConfigGetter is a ConfigGetter with an additional method to expose
46
+// whether a config contains sensitive data.
47
+type TemplatedConfigGetter interface {
48
+	exec.ConfigGetter
49
+
50
+	// GetAndFlagSecretData returns the interpolated config, and also
51
+	// returns true if the config has been interpolated with data from a
52
+	// secret. In this case, the config should be handled specially and
53
+	// should not be written to disk.
54
+	GetAndFlagSecretData(configID string) (*api.Config, bool, error)
55
+}
56
+
45 57
 type templatedConfigGetter struct {
46 58
 	dependencies exec.DependencyGetter
47 59
 	t            *api.Task
... ...
@@ -49,38 +61,43 @@ type templatedConfigGetter struct {
49 49
 }
50 50
 
51 51
 // NewTemplatedConfigGetter returns a ConfigGetter that evaluates templates.
52
-func NewTemplatedConfigGetter(dependencies exec.DependencyGetter, t *api.Task, node *api.NodeDescription) exec.ConfigGetter {
52
+func NewTemplatedConfigGetter(dependencies exec.DependencyGetter, t *api.Task, node *api.NodeDescription) TemplatedConfigGetter {
53 53
 	return templatedConfigGetter{dependencies: dependencies, t: t, node: node}
54 54
 }
55 55
 
56 56
 func (t templatedConfigGetter) Get(configID string) (*api.Config, error) {
57
+	config, _, err := t.GetAndFlagSecretData(configID)
58
+	return config, err
59
+}
60
+
61
+func (t templatedConfigGetter) GetAndFlagSecretData(configID string) (*api.Config, bool, error) {
57 62
 	if t.dependencies == nil {
58
-		return nil, errors.New("no config provider available")
63
+		return nil, false, errors.New("no config provider available")
59 64
 	}
60 65
 
61 66
 	configs := t.dependencies.Configs()
62 67
 	if configs == nil {
63
-		return nil, errors.New("no config provider available")
68
+		return nil, false, errors.New("no config provider available")
64 69
 	}
65 70
 
66 71
 	config, err := configs.Get(configID)
67 72
 	if err != nil {
68
-		return config, err
73
+		return config, false, err
69 74
 	}
70 75
 
71
-	newSpec, err := ExpandConfigSpec(config, t.node, t.t, t.dependencies)
76
+	newSpec, sensitive, err := ExpandConfigSpec(config, t.node, t.t, t.dependencies)
72 77
 	if err != nil {
73
-		return config, errors.Wrapf(err, "failed to expand templated config %s", configID)
78
+		return config, false, errors.Wrapf(err, "failed to expand templated config %s", configID)
74 79
 	}
75 80
 
76 81
 	configCopy := *config
77 82
 	configCopy.Spec = *newSpec
78
-	return &configCopy, nil
83
+	return &configCopy, sensitive, nil
79 84
 }
80 85
 
81 86
 type templatedDependencyGetter struct {
82 87
 	secrets exec.SecretGetter
83
-	configs exec.ConfigGetter
88
+	configs TemplatedConfigGetter
84 89
 }
85 90
 
86 91
 // NewTemplatedDependencyGetter returns a DependencyGetter that evaluates templates.
... ...
@@ -19,26 +19,27 @@ github.com/prometheus/common ebdfc6da46522d58825777cf1f90490a5b1ef1d8
19 19
 github.com/prometheus/procfs abf152e5f3e97f2fafac028d2cc06c1feb87ffa5
20 20
 
21 21
 github.com/docker/distribution b38e5838b7b2f2ad48e06ec4b500011976080621
22
-github.com/docker/docker 77c9728847358a3ed3581d828fb0753017e1afd3
23
-github.com/docker/go-connections 34b5052da6b11e27f5f2e357b38b571ddddd3928
24
-github.com/docker/go-events 37d35add5005832485c0225ec870121b78fcff1c
22
+github.com/docker/docker 8af4db6f002ac907b6ef8610b237879dfcaa5b7a
23
+github.com/docker/go-connections 3ede32e2033de7505e6500d6c868c2b9ed9f169d
24
+github.com/docker/go-events 9461782956ad83b30282bf90e31fa6a70c255ba9
25 25
 github.com/docker/go-units 954fed01cc617c55d838fa2230073f2cb17386c8
26 26
 github.com/docker/libkv 9fd56606e928ff1f309808f5d5a0b7a2ef73f9a8
27
-github.com/docker/libnetwork 37e20af882e13dd01ade3658b7aabdae3412118b
27
+github.com/docker/libnetwork 19ac3ea7f52bb46e0eb10669756cdae0c441a5b1 
28 28
 github.com/docker/libtrust 9cbd2a1374f46905c68a4eb3694a130610adc62a
29
-github.com/opencontainers/runc b6b70e53451794e8333e9b602cc096b47a20bd0f
30
-github.com/opencontainers/go-digest a6d0ee40d4207ea02364bd3b9e8e77b9159ba1eb
31
-github.com/opencontainers/image-spec 372ad780f63454fbbbbcc7cf80e5b90245c13e13
29
+github.com/opencontainers/runc d40db12e72a40109dfcf28539f5ee0930d2f0277
30
+github.com/opencontainers/go-digest 21dfd564fd89c944783d00d069f33e3e7123c448 
31
+github.com/opencontainers/image-spec v1.0.0
32 32
 
33 33
 # containerd executor
34
-github.com/containerd/containerd 76697ac8cbf357a19beb58e4805a81fe48cf7974
34
+github.com/containerd/containerd 29a4dd7f46e0780d0bff2a237dc600a5b90a4dd5
35 35
 github.com/containerd/fifo 69b99525e472735860a5269b75af1970142b3062
36
-github.com/opencontainers/runtime-spec v1.0.0-rc5
36
+github.com/opencontainers/runtime-spec v1.0.0
37 37
 golang.org/x/sync 450f422ab23cf9881c94e2db30cac0eb1b7cf80c
38
+github.com/containerd/continuity cf279e6ac893682272b4479d4c67fd3abf878b4e
38 39
 
39 40
 github.com/davecgh/go-spew 5215b55f46b2b919f50a1df0eaa5886afe4e3b3d
40 41
 github.com/Microsoft/go-winio v0.4.2
41
-github.com/Sirupsen/logrus v0.11.0
42
+github.com/sirupsen/logrus v1.0.1
42 43
 github.com/beorn7/perks 4c0e84591b9aa9e6dcfdf3e020114cd81f89d5f9
43 44
 github.com/boltdb/bolt e72f08ddb5a52992c0a44c7dda9316c7333938b2
44 45
 github.com/cloudflare/cfssl 7fb22c8cba7ecaf98e4082d22d65800cf45e042a
... ...
@@ -58,6 +59,6 @@ github.com/spf13/pflag 7f60f83a2c81bc3c3c0d5297f61ddfa68da9d3b7
58 58
 github.com/stretchr/testify v1.1.4
59 59
 golang.org/x/crypto 3fbbcd23f1cb824e69491a5930cfeff09b12f4d2
60 60
 golang.org/x/net 7dcfb8076726a3fdd9353b6b8a1f1b6be6811bd6
61
-golang.org/x/sys 5eaf0df67e70d6997a9fe0ed24383fa1b01638d3
61
+golang.org/x/sys 739734461d1c916b6c72a63d7efda2b27edb369f
62 62
 golang.org/x/text f72d8390a633d5dfb0cc84043294db9f6c935756
63 63
 golang.org/x/time a4bde12657593d5e90d0533a3e4fd95e635124cb