Browse code

Merge pull request #22511 from crosbymichael/update-runc-containerd

Update runc and containerd deps

Alexander Morozov authored on 2016/05/11 07:06:23
Showing 32 changed files
... ...
@@ -250,7 +250,7 @@ RUN set -x \
250 250
 	&& rm -rf "$GOPATH"
251 251
 
252 252
 # Install runc
253
-ENV RUNC_COMMIT baf6536d6259209c3edfa2b22237af82942d3dfa
253
+ENV RUNC_COMMIT d49ece5a83da3dcb820121d6850e2b61bd0a5fbe
254 254
 RUN set -x \
255 255
 	&& export GOPATH="$(mktemp -d)" \
256 256
 	&& git clone https://github.com/opencontainers/runc.git "$GOPATH/src/github.com/opencontainers/runc" \
... ...
@@ -261,7 +261,7 @@ RUN set -x \
261 261
 	&& rm -rf "$GOPATH"
262 262
 
263 263
 # Install containerd
264
-ENV CONTAINERD_COMMIT v0.2.1
264
+ENV CONTAINERD_COMMIT 57b7c3da915ebe943bd304c00890959b191e5264
265 265
 RUN set -x \
266 266
 	&& export GOPATH="$(mktemp -d)" \
267 267
 	&& git clone https://github.com/docker/containerd.git "$GOPATH/src/github.com/docker/containerd" \
... ...
@@ -181,7 +181,7 @@ RUN set -x \
181 181
 	&& rm -rf "$GOPATH"
182 182
 
183 183
 # Install runc
184
-ENV RUNC_COMMIT baf6536d6259209c3edfa2b22237af82942d3dfa
184
+ENV RUNC_COMMIT d49ece5a83da3dcb820121d6850e2b61bd0a5fbe
185 185
 RUN set -x \
186 186
 	&& export GOPATH="$(mktemp -d)" \
187 187
 	&& git clone https://github.com/opencontainers/runc.git "$GOPATH/src/github.com/opencontainers/runc" \
... ...
@@ -192,7 +192,7 @@ RUN set -x \
192 192
 	&& rm -rf "$GOPATH"
193 193
 
194 194
 # Install containerd
195
-ENV CONTAINERD_COMMIT v0.2.1
195
+ENV CONTAINERD_COMMIT 57b7c3da915ebe943bd304c00890959b191e5264
196 196
 RUN set -x \
197 197
 	&& export GOPATH="$(mktemp -d)" \
198 198
 	&& git clone https://github.com/docker/containerd.git "$GOPATH/src/github.com/docker/containerd" \
... ...
@@ -192,7 +192,7 @@ RUN set -x \
192 192
 	&& rm -rf "$GOPATH"
193 193
 
194 194
 # Install runc
195
-ENV RUNC_COMMIT baf6536d6259209c3edfa2b22237af82942d3dfa
195
+ENV RUNC_COMMIT d49ece5a83da3dcb820121d6850e2b61bd0a5fbe
196 196
 RUN set -x \
197 197
 	&& export GOPATH="$(mktemp -d)" \
198 198
 	&& git clone https://github.com/opencontainers/runc.git "$GOPATH/src/github.com/opencontainers/runc" \
... ...
@@ -203,7 +203,7 @@ RUN set -x \
203 203
 	&& rm -rf "$GOPATH"
204 204
 
205 205
 # Install containerd
206
-ENV CONTAINERD_COMMIT v0.2.1
206
+ENV CONTAINERD_COMMIT 57b7c3da915ebe943bd304c00890959b191e5264
207 207
 RUN set -x \
208 208
 	&& export GOPATH="$(mktemp -d)" \
209 209
 	&& git clone https://github.com/docker/containerd.git "$GOPATH/src/github.com/docker/containerd" \
... ...
@@ -74,7 +74,7 @@ WORKDIR /go/src/github.com/docker/docker
74 74
 ENV DOCKER_BUILDTAGS apparmor seccomp selinux
75 75
 
76 76
 # Install runc
77
-ENV RUNC_COMMIT baf6536d6259209c3edfa2b22237af82942d3dfa
77
+ENV RUNC_COMMIT d49ece5a83da3dcb820121d6850e2b61bd0a5fbe
78 78
 RUN set -x \
79 79
 	&& export GOPATH="$(mktemp -d)" \
80 80
 	&& git clone https://github.com/opencontainers/runc.git "$GOPATH/src/github.com/opencontainers/runc" \
... ...
@@ -85,7 +85,7 @@ RUN set -x \
85 85
 	&& rm -rf "$GOPATH"
86 86
 
87 87
 # Install containerd
88
-ENV CONTAINERD_COMMIT v0.2.1
88
+ENV CONTAINERD_COMMIT 57b7c3da915ebe943bd304c00890959b191e5264
89 89
 RUN set -x \
90 90
 	&& export GOPATH="$(mktemp -d)" \
91 91
 	&& git clone https://github.com/docker/containerd.git "$GOPATH/src/github.com/docker/containerd" \
... ...
@@ -204,7 +204,7 @@ RUN set -x \
204 204
 	&& rm -rf "$GOPATH"
205 205
 
206 206
 # Install runc
207
-ENV RUNC_COMMIT baf6536d6259209c3edfa2b22237af82942d3dfa
207
+ENV RUNC_COMMIT d49ece5a83da3dcb820121d6850e2b61bd0a5fbe
208 208
 RUN set -x \
209 209
 	&& export GOPATH="$(mktemp -d)" \
210 210
 	&& git clone https://github.com/opencontainers/runc.git "$GOPATH/src/github.com/opencontainers/runc" \
... ...
@@ -215,7 +215,7 @@ RUN set -x \
215 215
 	&& rm -rf "$GOPATH"
216 216
 
217 217
 # Install containerd
218
-ENV CONTAINERD_COMMIT v0.2.1
218
+ENV CONTAINERD_COMMIT 57b7c3da915ebe943bd304c00890959b191e5264
219 219
 RUN set -x \
220 220
 	&& export GOPATH="$(mktemp -d)" \
221 221
 	&& git clone https://github.com/docker/containerd.git "$GOPATH/src/github.com/docker/containerd" \
... ...
@@ -194,7 +194,7 @@ RUN set -x \
194 194
 	&& rm -rf "$GOPATH"
195 195
 
196 196
 # Install runc
197
-ENV RUNC_COMMIT baf6536d6259209c3edfa2b22237af82942d3dfa
197
+ENV RUNC_COMMIT d49ece5a83da3dcb820121d6850e2b61bd0a5fbe
198 198
 RUN set -x \
199 199
 	&& export GOPATH="$(mktemp -d)" \
200 200
 	&& git clone https://github.com/opencontainers/runc.git "$GOPATH/src/github.com/opencontainers/runc" \
... ...
@@ -205,7 +205,7 @@ RUN set -x \
205 205
 	&& rm -rf "$GOPATH"
206 206
 
207 207
 # Install containerd
208
-ENV CONTAINERD_COMMIT v0.2.1
208
+ENV CONTAINERD_COMMIT 57b7c3da915ebe943bd304c00890959b191e5264
209 209
 RUN set -x \
210 210
 	&& export GOPATH="$(mktemp -d)" \
211 211
 	&& git clone https://github.com/docker/containerd.git "$GOPATH/src/github.com/docker/containerd" \
... ...
@@ -57,7 +57,7 @@ ENV GOPATH /go:/go/src/github.com/docker/docker/vendor
57 57
 ENV CGO_LDFLAGS -L/lib
58 58
 
59 59
 # Install runc
60
-ENV RUNC_COMMIT baf6536d6259209c3edfa2b22237af82942d3dfa
60
+ENV RUNC_COMMIT d49ece5a83da3dcb820121d6850e2b61bd0a5fbe
61 61
 RUN set -x \
62 62
 	&& export GOPATH="$(mktemp -d)" \
63 63
 	&& git clone https://github.com/opencontainers/runc.git "$GOPATH/src/github.com/opencontainers/runc" \
... ...
@@ -68,7 +68,7 @@ RUN set -x \
68 68
 	&& rm -rf "$GOPATH"
69 69
 
70 70
 # Install containerd
71
-ENV CONTAINERD_COMMIT v0.2.1
71
+ENV CONTAINERD_COMMIT 57b7c3da915ebe943bd304c00890959b191e5264
72 72
 RUN set -x \
73 73
 	&& export GOPATH="$(mktemp -d)" \
74 74
 	&& git clone https://github.com/docker/containerd.git "$GOPATH/src/github.com/docker/containerd" \
... ...
@@ -60,14 +60,14 @@ clone git github.com/miekg/pkcs11 df8ae6ca730422dba20c768ff38ef7d79077a59f
60 60
 clone git github.com/docker/go v1.5.1-1-1-gbaf439e
61 61
 clone git github.com/agl/ed25519 d2b94fd789ea21d12fac1a4443dd3a3f79cda72c
62 62
 
63
-clone git github.com/opencontainers/runc 2441732d6fcc0fb0a542671a4372e0c7bc99c19e # libcontainer
63
+clone git github.com/opencontainers/runc d49ece5a83da3dcb820121d6850e2b61bd0a5fbe # libcontainer
64 64
 clone git github.com/opencontainers/specs f955d90e70a98ddfb886bd930ffd076da9b67998 # specs
65 65
 clone git github.com/seccomp/libseccomp-golang 1b506fc7c24eec5a3693cdcbed40d9c226cfc6a1
66 66
 # libcontainer deps (see src/github.com/opencontainers/runc/Godeps/Godeps.json)
67 67
 clone git github.com/coreos/go-systemd v4
68 68
 clone git github.com/godbus/dbus v4.0.0
69 69
 clone git github.com/syndtr/gocapability 2c00daeb6c3b45114c80ac44119e7b8801fdd852
70
-clone git github.com/golang/protobuf 68415e7123da32b07eab49c96d2c4d6158360e9b
70
+clone git github.com/golang/protobuf 8d92cf5fc15a4382f8964b08e1f42a75c0591aa3
71 71
 
72 72
 # gelf logging driver deps
73 73
 clone git github.com/Graylog2/go-gelf aab2f594e4585d43468ac57287b0dece9d806883
... ...
@@ -90,5 +90,5 @@ clone git google.golang.org/api dc6d2353af16e2a2b0ff6986af051d473a4ed468 https:/
90 90
 clone git google.golang.org/cloud dae7e3d993bc3812a2185af60552bb6b847e52a0 https://code.googlesource.com/gocloud
91 91
 
92 92
 # containerd
93
-clone git github.com/docker/containerd v0.2.1
93
+clone git github.com/docker/containerd 57b7c3da915ebe943bd304c00890959b191e5264
94 94
 clean
... ...
@@ -33,7 +33,7 @@ func (s *DockerDaemonSuite) TestDaemonRestartWithKilledRunningContainer(t *check
33 33
 	}
34 34
 
35 35
 	// kill the container
36
-	runCmd := exec.Command(ctrBinary, "--address", "/var/run/docker/libcontainerd/docker-containerd.sock", "containers", "kill", cid)
36
+	runCmd := exec.Command(ctrBinary, "--address", "unix:///var/run/docker/libcontainerd/docker-containerd.sock", "containers", "kill", cid)
37 37
 	if out, ec, err := runCommandWithOutput(runCmd); err != nil {
38 38
 		t.Fatalf("Failed to run ctr, ExitCode: %d, err: '%v' output: '%s' cid: '%s'\n", ec, err, out, cid)
39 39
 	}
... ...
@@ -120,7 +120,7 @@ func (s *DockerDaemonSuite) TestDaemonRestartWithPausedRunningContainer(t *check
120 120
 	}
121 121
 
122 122
 	// kill the container
123
-	runCmd := exec.Command(ctrBinary, "--address", "/var/run/docker/libcontainerd/docker-containerd.sock", "containers", "pause", cid)
123
+	runCmd := exec.Command(ctrBinary, "--address", "unix:///var/run/docker/libcontainerd/docker-containerd.sock", "containers", "pause", cid)
124 124
 	if out, ec, err := runCommandWithOutput(runCmd); err != nil {
125 125
 		t.Fatalf("Failed to run ctr, ExitCode: %d, err: '%v' output: '%s' cid: '%s'\n", ec, err, out, cid)
126 126
 	}
... ...
@@ -170,7 +170,7 @@ func (s *DockerDaemonSuite) TestDaemonRestartWithUnpausedRunningContainer(t *che
170 170
 	}
171 171
 
172 172
 	// resume the container
173
-	runCmd := exec.Command(ctrBinary, "--address", "/var/run/docker/libcontainerd/docker-containerd.sock", "containers", "resume", cid)
173
+	runCmd := exec.Command(ctrBinary, "--address", "unix:///var/run/docker/libcontainerd/docker-containerd.sock", "containers", "resume", cid)
174 174
 	if out, ec, err := runCommandWithOutput(runCmd); err != nil {
175 175
 		t.Fatalf("Failed to run ctr, ExitCode: %d, err: '%v' output: '%s' cid: '%s'\n", ec, err, out, cid)
176 176
 	}
... ...
@@ -1550,7 +1550,7 @@ func (s *DockerDaemonSuite) TestCleanupMountsAfterDaemonAndContainerKill(c *chec
1550 1550
 	c.Assert(strings.Contains(string(mountOut), id), check.Equals, true, comment)
1551 1551
 
1552 1552
 	// kill the container
1553
-	runCmd := exec.Command(ctrBinary, "--address", "/var/run/docker/libcontainerd/docker-containerd.sock", "containers", "kill", id)
1553
+	runCmd := exec.Command(ctrBinary, "--address", "unix:///var/run/docker/libcontainerd/docker-containerd.sock", "containers", "kill", id)
1554 1554
 	if out, ec, err := runCommandWithOutput(runCmd); err != nil {
1555 1555
 		c.Fatalf("Failed to run ctr, ExitCode: %d, err: %v output: %s id: %s\n", ec, err, out, id)
1556 1556
 	}
... ...
@@ -349,7 +349,12 @@ func (r *remote) runContainerdDaemon() error {
349 349
 	}
350 350
 
351 351
 	// Start a new instance
352
-	args := []string{"-l", r.rpcAddr, "--runtime", "docker-runc", "--metrics-interval=0"}
352
+	args := []string{
353
+		"-l", fmt.Sprintf("unix://%s", r.rpcAddr),
354
+		"--shim", "docker-containerd-shim",
355
+		"--runtime", "docker-runc",
356
+		"--metrics-interval=0",
357
+	}
353 358
 	if r.debugLog {
354 359
 		args = append(args, "--debug")
355 360
 	}
... ...
@@ -9,6 +9,8 @@ It is generated from these files:
9 9
 	api.proto
10 10
 
11 11
 It has these top-level messages:
12
+	GetServerVersionRequest
13
+	GetServerVersionResponse
12 14
 	UpdateProcessRequest
13 15
 	UpdateProcessResponse
14 16
 	CreateContainerRequest
... ...
@@ -67,6 +69,30 @@ var _ = proto.Marshal
67 67
 var _ = fmt.Errorf
68 68
 var _ = math.Inf
69 69
 
70
+// This is a compile-time assertion to ensure that this generated file
71
+// is compatible with the proto package it is being compiled against.
72
+const _ = proto.ProtoPackageIsVersion1
73
+
74
+type GetServerVersionRequest struct {
75
+}
76
+
77
+func (m *GetServerVersionRequest) Reset()                    { *m = GetServerVersionRequest{} }
78
+func (m *GetServerVersionRequest) String() string            { return proto.CompactTextString(m) }
79
+func (*GetServerVersionRequest) ProtoMessage()               {}
80
+func (*GetServerVersionRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{0} }
81
+
82
+type GetServerVersionResponse struct {
83
+	Major    uint32 `protobuf:"varint,1,opt,name=major" json:"major,omitempty"`
84
+	Minor    uint32 `protobuf:"varint,2,opt,name=minor" json:"minor,omitempty"`
85
+	Patch    uint32 `protobuf:"varint,3,opt,name=patch" json:"patch,omitempty"`
86
+	Revision string `protobuf:"bytes,4,opt,name=revision" json:"revision,omitempty"`
87
+}
88
+
89
+func (m *GetServerVersionResponse) Reset()                    { *m = GetServerVersionResponse{} }
90
+func (m *GetServerVersionResponse) String() string            { return proto.CompactTextString(m) }
91
+func (*GetServerVersionResponse) ProtoMessage()               {}
92
+func (*GetServerVersionResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{1} }
93
+
70 94
 type UpdateProcessRequest struct {
71 95
 	Id         string `protobuf:"bytes,1,opt,name=id" json:"id,omitempty"`
72 96
 	Pid        string `protobuf:"bytes,2,opt,name=pid" json:"pid,omitempty"`
... ...
@@ -78,7 +104,7 @@ type UpdateProcessRequest struct {
78 78
 func (m *UpdateProcessRequest) Reset()                    { *m = UpdateProcessRequest{} }
79 79
 func (m *UpdateProcessRequest) String() string            { return proto.CompactTextString(m) }
80 80
 func (*UpdateProcessRequest) ProtoMessage()               {}
81
-func (*UpdateProcessRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{0} }
81
+func (*UpdateProcessRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{2} }
82 82
 
83 83
 type UpdateProcessResponse struct {
84 84
 }
... ...
@@ -86,7 +112,7 @@ type UpdateProcessResponse struct {
86 86
 func (m *UpdateProcessResponse) Reset()                    { *m = UpdateProcessResponse{} }
87 87
 func (m *UpdateProcessResponse) String() string            { return proto.CompactTextString(m) }
88 88
 func (*UpdateProcessResponse) ProtoMessage()               {}
89
-func (*UpdateProcessResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{1} }
89
+func (*UpdateProcessResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{3} }
90 90
 
91 91
 type CreateContainerRequest struct {
92 92
 	Id          string   `protobuf:"bytes,1,opt,name=id" json:"id,omitempty"`
... ...
@@ -102,7 +128,7 @@ type CreateContainerRequest struct {
102 102
 func (m *CreateContainerRequest) Reset()                    { *m = CreateContainerRequest{} }
103 103
 func (m *CreateContainerRequest) String() string            { return proto.CompactTextString(m) }
104 104
 func (*CreateContainerRequest) ProtoMessage()               {}
105
-func (*CreateContainerRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{2} }
105
+func (*CreateContainerRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{4} }
106 106
 
107 107
 type CreateContainerResponse struct {
108 108
 	Container *Container `protobuf:"bytes,1,opt,name=container" json:"container,omitempty"`
... ...
@@ -111,7 +137,7 @@ type CreateContainerResponse struct {
111 111
 func (m *CreateContainerResponse) Reset()                    { *m = CreateContainerResponse{} }
112 112
 func (m *CreateContainerResponse) String() string            { return proto.CompactTextString(m) }
113 113
 func (*CreateContainerResponse) ProtoMessage()               {}
114
-func (*CreateContainerResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{3} }
114
+func (*CreateContainerResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{5} }
115 115
 
116 116
 func (m *CreateContainerResponse) GetContainer() *Container {
117 117
 	if m != nil {
... ...
@@ -129,7 +155,7 @@ type SignalRequest struct {
129 129
 func (m *SignalRequest) Reset()                    { *m = SignalRequest{} }
130 130
 func (m *SignalRequest) String() string            { return proto.CompactTextString(m) }
131 131
 func (*SignalRequest) ProtoMessage()               {}
132
-func (*SignalRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{4} }
132
+func (*SignalRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{6} }
133 133
 
134 134
 type SignalResponse struct {
135 135
 }
... ...
@@ -137,7 +163,7 @@ type SignalResponse struct {
137 137
 func (m *SignalResponse) Reset()                    { *m = SignalResponse{} }
138 138
 func (m *SignalResponse) String() string            { return proto.CompactTextString(m) }
139 139
 func (*SignalResponse) ProtoMessage()               {}
140
-func (*SignalResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{5} }
140
+func (*SignalResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{7} }
141 141
 
142 142
 type AddProcessRequest struct {
143 143
 	Id              string    `protobuf:"bytes,1,opt,name=id" json:"id,omitempty"`
... ...
@@ -160,7 +186,7 @@ type AddProcessRequest struct {
160 160
 func (m *AddProcessRequest) Reset()                    { *m = AddProcessRequest{} }
161 161
 func (m *AddProcessRequest) String() string            { return proto.CompactTextString(m) }
162 162
 func (*AddProcessRequest) ProtoMessage()               {}
163
-func (*AddProcessRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{6} }
163
+func (*AddProcessRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{8} }
164 164
 
165 165
 func (m *AddProcessRequest) GetUser() *User {
166 166
 	if m != nil {
... ...
@@ -185,7 +211,7 @@ type Rlimit struct {
185 185
 func (m *Rlimit) Reset()                    { *m = Rlimit{} }
186 186
 func (m *Rlimit) String() string            { return proto.CompactTextString(m) }
187 187
 func (*Rlimit) ProtoMessage()               {}
188
-func (*Rlimit) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{7} }
188
+func (*Rlimit) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{9} }
189 189
 
190 190
 type User struct {
191 191
 	Uid            uint32   `protobuf:"varint,1,opt,name=uid" json:"uid,omitempty"`
... ...
@@ -196,7 +222,7 @@ type User struct {
196 196
 func (m *User) Reset()                    { *m = User{} }
197 197
 func (m *User) String() string            { return proto.CompactTextString(m) }
198 198
 func (*User) ProtoMessage()               {}
199
-func (*User) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{8} }
199
+func (*User) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{10} }
200 200
 
201 201
 type AddProcessResponse struct {
202 202
 }
... ...
@@ -204,7 +230,7 @@ type AddProcessResponse struct {
204 204
 func (m *AddProcessResponse) Reset()                    { *m = AddProcessResponse{} }
205 205
 func (m *AddProcessResponse) String() string            { return proto.CompactTextString(m) }
206 206
 func (*AddProcessResponse) ProtoMessage()               {}
207
-func (*AddProcessResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{9} }
207
+func (*AddProcessResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{11} }
208 208
 
209 209
 type CreateCheckpointRequest struct {
210 210
 	Id         string      `protobuf:"bytes,1,opt,name=id" json:"id,omitempty"`
... ...
@@ -214,7 +240,7 @@ type CreateCheckpointRequest struct {
214 214
 func (m *CreateCheckpointRequest) Reset()                    { *m = CreateCheckpointRequest{} }
215 215
 func (m *CreateCheckpointRequest) String() string            { return proto.CompactTextString(m) }
216 216
 func (*CreateCheckpointRequest) ProtoMessage()               {}
217
-func (*CreateCheckpointRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{10} }
217
+func (*CreateCheckpointRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{12} }
218 218
 
219 219
 func (m *CreateCheckpointRequest) GetCheckpoint() *Checkpoint {
220 220
 	if m != nil {
... ...
@@ -229,7 +255,7 @@ type CreateCheckpointResponse struct {
229 229
 func (m *CreateCheckpointResponse) Reset()                    { *m = CreateCheckpointResponse{} }
230 230
 func (m *CreateCheckpointResponse) String() string            { return proto.CompactTextString(m) }
231 231
 func (*CreateCheckpointResponse) ProtoMessage()               {}
232
-func (*CreateCheckpointResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{11} }
232
+func (*CreateCheckpointResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{13} }
233 233
 
234 234
 type DeleteCheckpointRequest struct {
235 235
 	Id   string `protobuf:"bytes,1,opt,name=id" json:"id,omitempty"`
... ...
@@ -239,7 +265,7 @@ type DeleteCheckpointRequest struct {
239 239
 func (m *DeleteCheckpointRequest) Reset()                    { *m = DeleteCheckpointRequest{} }
240 240
 func (m *DeleteCheckpointRequest) String() string            { return proto.CompactTextString(m) }
241 241
 func (*DeleteCheckpointRequest) ProtoMessage()               {}
242
-func (*DeleteCheckpointRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{12} }
242
+func (*DeleteCheckpointRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{14} }
243 243
 
244 244
 type DeleteCheckpointResponse struct {
245 245
 }
... ...
@@ -247,7 +273,7 @@ type DeleteCheckpointResponse struct {
247 247
 func (m *DeleteCheckpointResponse) Reset()                    { *m = DeleteCheckpointResponse{} }
248 248
 func (m *DeleteCheckpointResponse) String() string            { return proto.CompactTextString(m) }
249 249
 func (*DeleteCheckpointResponse) ProtoMessage()               {}
250
-func (*DeleteCheckpointResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{13} }
250
+func (*DeleteCheckpointResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{15} }
251 251
 
252 252
 type ListCheckpointRequest struct {
253 253
 	Id string `protobuf:"bytes,1,opt,name=id" json:"id,omitempty"`
... ...
@@ -256,7 +282,7 @@ type ListCheckpointRequest struct {
256 256
 func (m *ListCheckpointRequest) Reset()                    { *m = ListCheckpointRequest{} }
257 257
 func (m *ListCheckpointRequest) String() string            { return proto.CompactTextString(m) }
258 258
 func (*ListCheckpointRequest) ProtoMessage()               {}
259
-func (*ListCheckpointRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{14} }
259
+func (*ListCheckpointRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{16} }
260 260
 
261 261
 type Checkpoint struct {
262 262
 	Name        string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"`
... ...
@@ -269,7 +295,7 @@ type Checkpoint struct {
269 269
 func (m *Checkpoint) Reset()                    { *m = Checkpoint{} }
270 270
 func (m *Checkpoint) String() string            { return proto.CompactTextString(m) }
271 271
 func (*Checkpoint) ProtoMessage()               {}
272
-func (*Checkpoint) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{15} }
272
+func (*Checkpoint) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{17} }
273 273
 
274 274
 type ListCheckpointResponse struct {
275 275
 	Checkpoints []*Checkpoint `protobuf:"bytes,1,rep,name=checkpoints" json:"checkpoints,omitempty"`
... ...
@@ -278,7 +304,7 @@ type ListCheckpointResponse struct {
278 278
 func (m *ListCheckpointResponse) Reset()                    { *m = ListCheckpointResponse{} }
279 279
 func (m *ListCheckpointResponse) String() string            { return proto.CompactTextString(m) }
280 280
 func (*ListCheckpointResponse) ProtoMessage()               {}
281
-func (*ListCheckpointResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{16} }
281
+func (*ListCheckpointResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{18} }
282 282
 
283 283
 func (m *ListCheckpointResponse) GetCheckpoints() []*Checkpoint {
284 284
 	if m != nil {
... ...
@@ -294,7 +320,7 @@ type StateRequest struct {
294 294
 func (m *StateRequest) Reset()                    { *m = StateRequest{} }
295 295
 func (m *StateRequest) String() string            { return proto.CompactTextString(m) }
296 296
 func (*StateRequest) ProtoMessage()               {}
297
-func (*StateRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{17} }
297
+func (*StateRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{19} }
298 298
 
299 299
 type ContainerState struct {
300 300
 	Status string `protobuf:"bytes,1,opt,name=status" json:"status,omitempty"`
... ...
@@ -303,7 +329,7 @@ type ContainerState struct {
303 303
 func (m *ContainerState) Reset()                    { *m = ContainerState{} }
304 304
 func (m *ContainerState) String() string            { return proto.CompactTextString(m) }
305 305
 func (*ContainerState) ProtoMessage()               {}
306
-func (*ContainerState) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{18} }
306
+func (*ContainerState) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{20} }
307 307
 
308 308
 type Process struct {
309 309
 	Pid             string    `protobuf:"bytes,1,opt,name=pid" json:"pid,omitempty"`
... ...
@@ -326,7 +352,7 @@ type Process struct {
326 326
 func (m *Process) Reset()                    { *m = Process{} }
327 327
 func (m *Process) String() string            { return proto.CompactTextString(m) }
328 328
 func (*Process) ProtoMessage()               {}
329
-func (*Process) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{19} }
329
+func (*Process) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{21} }
330 330
 
331 331
 func (m *Process) GetUser() *User {
332 332
 	if m != nil {
... ...
@@ -355,7 +381,7 @@ type Container struct {
355 355
 func (m *Container) Reset()                    { *m = Container{} }
356 356
 func (m *Container) String() string            { return proto.CompactTextString(m) }
357 357
 func (*Container) ProtoMessage()               {}
358
-func (*Container) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{20} }
358
+func (*Container) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{22} }
359 359
 
360 360
 func (m *Container) GetProcesses() []*Process {
361 361
 	if m != nil {
... ...
@@ -373,7 +399,7 @@ type Machine struct {
373 373
 func (m *Machine) Reset()                    { *m = Machine{} }
374 374
 func (m *Machine) String() string            { return proto.CompactTextString(m) }
375 375
 func (*Machine) ProtoMessage()               {}
376
-func (*Machine) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{21} }
376
+func (*Machine) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{23} }
377 377
 
378 378
 // StateResponse is information about containerd daemon
379 379
 type StateResponse struct {
... ...
@@ -384,7 +410,7 @@ type StateResponse struct {
384 384
 func (m *StateResponse) Reset()                    { *m = StateResponse{} }
385 385
 func (m *StateResponse) String() string            { return proto.CompactTextString(m) }
386 386
 func (*StateResponse) ProtoMessage()               {}
387
-func (*StateResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{22} }
387
+func (*StateResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{24} }
388 388
 
389 389
 func (m *StateResponse) GetContainers() []*Container {
390 390
 	if m != nil {
... ...
@@ -410,7 +436,7 @@ type UpdateContainerRequest struct {
410 410
 func (m *UpdateContainerRequest) Reset()                    { *m = UpdateContainerRequest{} }
411 411
 func (m *UpdateContainerRequest) String() string            { return proto.CompactTextString(m) }
412 412
 func (*UpdateContainerRequest) ProtoMessage()               {}
413
-func (*UpdateContainerRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{23} }
413
+func (*UpdateContainerRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{25} }
414 414
 
415 415
 func (m *UpdateContainerRequest) GetResources() *UpdateResource {
416 416
 	if m != nil {
... ...
@@ -435,7 +461,7 @@ type UpdateResource struct {
435 435
 func (m *UpdateResource) Reset()                    { *m = UpdateResource{} }
436 436
 func (m *UpdateResource) String() string            { return proto.CompactTextString(m) }
437 437
 func (*UpdateResource) ProtoMessage()               {}
438
-func (*UpdateResource) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{24} }
438
+func (*UpdateResource) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{26} }
439 439
 
440 440
 type UpdateContainerResponse struct {
441 441
 }
... ...
@@ -443,7 +469,7 @@ type UpdateContainerResponse struct {
443 443
 func (m *UpdateContainerResponse) Reset()                    { *m = UpdateContainerResponse{} }
444 444
 func (m *UpdateContainerResponse) String() string            { return proto.CompactTextString(m) }
445 445
 func (*UpdateContainerResponse) ProtoMessage()               {}
446
-func (*UpdateContainerResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{25} }
446
+func (*UpdateContainerResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{27} }
447 447
 
448 448
 type EventsRequest struct {
449 449
 	Timestamp uint64 `protobuf:"varint,1,opt,name=timestamp" json:"timestamp,omitempty"`
... ...
@@ -452,7 +478,7 @@ type EventsRequest struct {
452 452
 func (m *EventsRequest) Reset()                    { *m = EventsRequest{} }
453 453
 func (m *EventsRequest) String() string            { return proto.CompactTextString(m) }
454 454
 func (*EventsRequest) ProtoMessage()               {}
455
-func (*EventsRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{26} }
455
+func (*EventsRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{28} }
456 456
 
457 457
 type Event struct {
458 458
 	Type      string `protobuf:"bytes,1,opt,name=type" json:"type,omitempty"`
... ...
@@ -465,58 +491,58 @@ type Event struct {
465 465
 func (m *Event) Reset()                    { *m = Event{} }
466 466
 func (m *Event) String() string            { return proto.CompactTextString(m) }
467 467
 func (*Event) ProtoMessage()               {}
468
-func (*Event) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{27} }
468
+func (*Event) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{29} }
469 469
 
470 470
 type NetworkStats struct {
471 471
 	Name       string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"`
472
-	RxBytes    uint64 `protobuf:"varint,2,opt,name=rx_bytes,json=rxBytes" json:"rx_bytes,omitempty"`
473
-	Rx_Packets uint64 `protobuf:"varint,3,opt,name=rx_Packets,json=rxPackets" json:"rx_Packets,omitempty"`
474
-	RxErrors   uint64 `protobuf:"varint,4,opt,name=Rx_errors,json=rxErrors" json:"Rx_errors,omitempty"`
475
-	RxDropped  uint64 `protobuf:"varint,5,opt,name=Rx_dropped,json=rxDropped" json:"Rx_dropped,omitempty"`
476
-	TxBytes    uint64 `protobuf:"varint,6,opt,name=Tx_bytes,json=txBytes" json:"Tx_bytes,omitempty"`
477
-	TxPackets  uint64 `protobuf:"varint,7,opt,name=Tx_packets,json=txPackets" json:"Tx_packets,omitempty"`
478
-	TxErrors   uint64 `protobuf:"varint,8,opt,name=Tx_errors,json=txErrors" json:"Tx_errors,omitempty"`
479
-	TxDropped  uint64 `protobuf:"varint,9,opt,name=Tx_dropped,json=txDropped" json:"Tx_dropped,omitempty"`
472
+	RxBytes    uint64 `protobuf:"varint,2,opt,name=rx_bytes" json:"rx_bytes,omitempty"`
473
+	Rx_Packets uint64 `protobuf:"varint,3,opt,name=rx_Packets" json:"rx_Packets,omitempty"`
474
+	RxErrors   uint64 `protobuf:"varint,4,opt,name=Rx_errors" json:"Rx_errors,omitempty"`
475
+	RxDropped  uint64 `protobuf:"varint,5,opt,name=Rx_dropped" json:"Rx_dropped,omitempty"`
476
+	TxBytes    uint64 `protobuf:"varint,6,opt,name=Tx_bytes" json:"Tx_bytes,omitempty"`
477
+	TxPackets  uint64 `protobuf:"varint,7,opt,name=Tx_packets" json:"Tx_packets,omitempty"`
478
+	TxErrors   uint64 `protobuf:"varint,8,opt,name=Tx_errors" json:"Tx_errors,omitempty"`
479
+	TxDropped  uint64 `protobuf:"varint,9,opt,name=Tx_dropped" json:"Tx_dropped,omitempty"`
480 480
 }
481 481
 
482 482
 func (m *NetworkStats) Reset()                    { *m = NetworkStats{} }
483 483
 func (m *NetworkStats) String() string            { return proto.CompactTextString(m) }
484 484
 func (*NetworkStats) ProtoMessage()               {}
485
-func (*NetworkStats) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{28} }
485
+func (*NetworkStats) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{30} }
486 486
 
487 487
 type CpuUsage struct {
488
-	TotalUsage        uint64   `protobuf:"varint,1,opt,name=total_usage,json=totalUsage" json:"total_usage,omitempty"`
489
-	PercpuUsage       []uint64 `protobuf:"varint,2,rep,name=percpu_usage,json=percpuUsage" json:"percpu_usage,omitempty"`
490
-	UsageInKernelmode uint64   `protobuf:"varint,3,opt,name=usage_in_kernelmode,json=usageInKernelmode" json:"usage_in_kernelmode,omitempty"`
491
-	UsageInUsermode   uint64   `protobuf:"varint,4,opt,name=usage_in_usermode,json=usageInUsermode" json:"usage_in_usermode,omitempty"`
488
+	TotalUsage        uint64   `protobuf:"varint,1,opt,name=total_usage" json:"total_usage,omitempty"`
489
+	PercpuUsage       []uint64 `protobuf:"varint,2,rep,name=percpu_usage" json:"percpu_usage,omitempty"`
490
+	UsageInKernelmode uint64   `protobuf:"varint,3,opt,name=usage_in_kernelmode" json:"usage_in_kernelmode,omitempty"`
491
+	UsageInUsermode   uint64   `protobuf:"varint,4,opt,name=usage_in_usermode" json:"usage_in_usermode,omitempty"`
492 492
 }
493 493
 
494 494
 func (m *CpuUsage) Reset()                    { *m = CpuUsage{} }
495 495
 func (m *CpuUsage) String() string            { return proto.CompactTextString(m) }
496 496
 func (*CpuUsage) ProtoMessage()               {}
497
-func (*CpuUsage) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{29} }
497
+func (*CpuUsage) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{31} }
498 498
 
499 499
 type ThrottlingData struct {
500 500
 	Periods          uint64 `protobuf:"varint,1,opt,name=periods" json:"periods,omitempty"`
501
-	ThrottledPeriods uint64 `protobuf:"varint,2,opt,name=throttled_periods,json=throttledPeriods" json:"throttled_periods,omitempty"`
502
-	ThrottledTime    uint64 `protobuf:"varint,3,opt,name=throttled_time,json=throttledTime" json:"throttled_time,omitempty"`
501
+	ThrottledPeriods uint64 `protobuf:"varint,2,opt,name=throttled_periods" json:"throttled_periods,omitempty"`
502
+	ThrottledTime    uint64 `protobuf:"varint,3,opt,name=throttled_time" json:"throttled_time,omitempty"`
503 503
 }
504 504
 
505 505
 func (m *ThrottlingData) Reset()                    { *m = ThrottlingData{} }
506 506
 func (m *ThrottlingData) String() string            { return proto.CompactTextString(m) }
507 507
 func (*ThrottlingData) ProtoMessage()               {}
508
-func (*ThrottlingData) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{30} }
508
+func (*ThrottlingData) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{32} }
509 509
 
510 510
 type CpuStats struct {
511
-	CpuUsage       *CpuUsage       `protobuf:"bytes,1,opt,name=cpu_usage,json=cpuUsage" json:"cpu_usage,omitempty"`
512
-	ThrottlingData *ThrottlingData `protobuf:"bytes,2,opt,name=throttling_data,json=throttlingData" json:"throttling_data,omitempty"`
513
-	SystemUsage    uint64          `protobuf:"varint,3,opt,name=system_usage,json=systemUsage" json:"system_usage,omitempty"`
511
+	CpuUsage       *CpuUsage       `protobuf:"bytes,1,opt,name=cpu_usage" json:"cpu_usage,omitempty"`
512
+	ThrottlingData *ThrottlingData `protobuf:"bytes,2,opt,name=throttling_data" json:"throttling_data,omitempty"`
513
+	SystemUsage    uint64          `protobuf:"varint,3,opt,name=system_usage" json:"system_usage,omitempty"`
514 514
 }
515 515
 
516 516
 func (m *CpuStats) Reset()                    { *m = CpuStats{} }
517 517
 func (m *CpuStats) String() string            { return proto.CompactTextString(m) }
518 518
 func (*CpuStats) ProtoMessage()               {}
519
-func (*CpuStats) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{31} }
519
+func (*CpuStats) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{33} }
520 520
 
521 521
 func (m *CpuStats) GetCpuUsage() *CpuUsage {
522 522
 	if m != nil {
... ...
@@ -540,11 +566,11 @@ type PidsStats struct {
540 540
 func (m *PidsStats) Reset()                    { *m = PidsStats{} }
541 541
 func (m *PidsStats) String() string            { return proto.CompactTextString(m) }
542 542
 func (*PidsStats) ProtoMessage()               {}
543
-func (*PidsStats) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{32} }
543
+func (*PidsStats) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{34} }
544 544
 
545 545
 type MemoryData struct {
546 546
 	Usage    uint64 `protobuf:"varint,1,opt,name=usage" json:"usage,omitempty"`
547
-	MaxUsage uint64 `protobuf:"varint,2,opt,name=max_usage,json=maxUsage" json:"max_usage,omitempty"`
547
+	MaxUsage uint64 `protobuf:"varint,2,opt,name=max_usage" json:"max_usage,omitempty"`
548 548
 	Failcnt  uint64 `protobuf:"varint,3,opt,name=failcnt" json:"failcnt,omitempty"`
549 549
 	Limit    uint64 `protobuf:"varint,4,opt,name=limit" json:"limit,omitempty"`
550 550
 }
... ...
@@ -552,20 +578,20 @@ type MemoryData struct {
552 552
 func (m *MemoryData) Reset()                    { *m = MemoryData{} }
553 553
 func (m *MemoryData) String() string            { return proto.CompactTextString(m) }
554 554
 func (*MemoryData) ProtoMessage()               {}
555
-func (*MemoryData) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{33} }
555
+func (*MemoryData) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{35} }
556 556
 
557 557
 type MemoryStats struct {
558 558
 	Cache       uint64            `protobuf:"varint,1,opt,name=cache" json:"cache,omitempty"`
559 559
 	Usage       *MemoryData       `protobuf:"bytes,2,opt,name=usage" json:"usage,omitempty"`
560
-	SwapUsage   *MemoryData       `protobuf:"bytes,3,opt,name=swap_usage,json=swapUsage" json:"swap_usage,omitempty"`
561
-	KernelUsage *MemoryData       `protobuf:"bytes,4,opt,name=kernel_usage,json=kernelUsage" json:"kernel_usage,omitempty"`
560
+	SwapUsage   *MemoryData       `protobuf:"bytes,3,opt,name=swap_usage" json:"swap_usage,omitempty"`
561
+	KernelUsage *MemoryData       `protobuf:"bytes,4,opt,name=kernel_usage" json:"kernel_usage,omitempty"`
562 562
 	Stats       map[string]uint64 `protobuf:"bytes,5,rep,name=stats" json:"stats,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"varint,2,opt,name=value"`
563 563
 }
564 564
 
565 565
 func (m *MemoryStats) Reset()                    { *m = MemoryStats{} }
566 566
 func (m *MemoryStats) String() string            { return proto.CompactTextString(m) }
567 567
 func (*MemoryStats) ProtoMessage()               {}
568
-func (*MemoryStats) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{34} }
568
+func (*MemoryStats) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{36} }
569 569
 
570 570
 func (m *MemoryStats) GetUsage() *MemoryData {
571 571
 	if m != nil {
... ...
@@ -605,23 +631,23 @@ type BlkioStatsEntry struct {
605 605
 func (m *BlkioStatsEntry) Reset()                    { *m = BlkioStatsEntry{} }
606 606
 func (m *BlkioStatsEntry) String() string            { return proto.CompactTextString(m) }
607 607
 func (*BlkioStatsEntry) ProtoMessage()               {}
608
-func (*BlkioStatsEntry) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{35} }
608
+func (*BlkioStatsEntry) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{37} }
609 609
 
610 610
 type BlkioStats struct {
611
-	IoServiceBytesRecursive []*BlkioStatsEntry `protobuf:"bytes,1,rep,name=io_service_bytes_recursive,json=ioServiceBytesRecursive" json:"io_service_bytes_recursive,omitempty"`
612
-	IoServicedRecursive     []*BlkioStatsEntry `protobuf:"bytes,2,rep,name=io_serviced_recursive,json=ioServicedRecursive" json:"io_serviced_recursive,omitempty"`
613
-	IoQueuedRecursive       []*BlkioStatsEntry `protobuf:"bytes,3,rep,name=io_queued_recursive,json=ioQueuedRecursive" json:"io_queued_recursive,omitempty"`
614
-	IoServiceTimeRecursive  []*BlkioStatsEntry `protobuf:"bytes,4,rep,name=io_service_time_recursive,json=ioServiceTimeRecursive" json:"io_service_time_recursive,omitempty"`
615
-	IoWaitTimeRecursive     []*BlkioStatsEntry `protobuf:"bytes,5,rep,name=io_wait_time_recursive,json=ioWaitTimeRecursive" json:"io_wait_time_recursive,omitempty"`
616
-	IoMergedRecursive       []*BlkioStatsEntry `protobuf:"bytes,6,rep,name=io_merged_recursive,json=ioMergedRecursive" json:"io_merged_recursive,omitempty"`
617
-	IoTimeRecursive         []*BlkioStatsEntry `protobuf:"bytes,7,rep,name=io_time_recursive,json=ioTimeRecursive" json:"io_time_recursive,omitempty"`
618
-	SectorsRecursive        []*BlkioStatsEntry `protobuf:"bytes,8,rep,name=sectors_recursive,json=sectorsRecursive" json:"sectors_recursive,omitempty"`
611
+	IoServiceBytesRecursive []*BlkioStatsEntry `protobuf:"bytes,1,rep,name=io_service_bytes_recursive" json:"io_service_bytes_recursive,omitempty"`
612
+	IoServicedRecursive     []*BlkioStatsEntry `protobuf:"bytes,2,rep,name=io_serviced_recursive" json:"io_serviced_recursive,omitempty"`
613
+	IoQueuedRecursive       []*BlkioStatsEntry `protobuf:"bytes,3,rep,name=io_queued_recursive" json:"io_queued_recursive,omitempty"`
614
+	IoServiceTimeRecursive  []*BlkioStatsEntry `protobuf:"bytes,4,rep,name=io_service_time_recursive" json:"io_service_time_recursive,omitempty"`
615
+	IoWaitTimeRecursive     []*BlkioStatsEntry `protobuf:"bytes,5,rep,name=io_wait_time_recursive" json:"io_wait_time_recursive,omitempty"`
616
+	IoMergedRecursive       []*BlkioStatsEntry `protobuf:"bytes,6,rep,name=io_merged_recursive" json:"io_merged_recursive,omitempty"`
617
+	IoTimeRecursive         []*BlkioStatsEntry `protobuf:"bytes,7,rep,name=io_time_recursive" json:"io_time_recursive,omitempty"`
618
+	SectorsRecursive        []*BlkioStatsEntry `protobuf:"bytes,8,rep,name=sectors_recursive" json:"sectors_recursive,omitempty"`
619 619
 }
620 620
 
621 621
 func (m *BlkioStats) Reset()                    { *m = BlkioStats{} }
622 622
 func (m *BlkioStats) String() string            { return proto.CompactTextString(m) }
623 623
 func (*BlkioStats) ProtoMessage()               {}
624
-func (*BlkioStats) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{36} }
624
+func (*BlkioStats) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{38} }
625 625
 
626 626
 func (m *BlkioStats) GetIoServiceBytesRecursive() []*BlkioStatsEntry {
627 627
 	if m != nil {
... ...
@@ -681,7 +707,7 @@ func (m *BlkioStats) GetSectorsRecursive() []*BlkioStatsEntry {
681 681
 
682 682
 type HugetlbStats struct {
683 683
 	Usage    uint64 `protobuf:"varint,1,opt,name=usage" json:"usage,omitempty"`
684
-	MaxUsage uint64 `protobuf:"varint,2,opt,name=max_usage,json=maxUsage" json:"max_usage,omitempty"`
684
+	MaxUsage uint64 `protobuf:"varint,2,opt,name=max_usage" json:"max_usage,omitempty"`
685 685
 	Failcnt  uint64 `protobuf:"varint,3,opt,name=failcnt" json:"failcnt,omitempty"`
686 686
 	Limit    uint64 `protobuf:"varint,4,opt,name=limit" json:"limit,omitempty"`
687 687
 }
... ...
@@ -689,20 +715,20 @@ type HugetlbStats struct {
689 689
 func (m *HugetlbStats) Reset()                    { *m = HugetlbStats{} }
690 690
 func (m *HugetlbStats) String() string            { return proto.CompactTextString(m) }
691 691
 func (*HugetlbStats) ProtoMessage()               {}
692
-func (*HugetlbStats) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{37} }
692
+func (*HugetlbStats) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{39} }
693 693
 
694 694
 type CgroupStats struct {
695
-	CpuStats     *CpuStats                `protobuf:"bytes,1,opt,name=cpu_stats,json=cpuStats" json:"cpu_stats,omitempty"`
696
-	MemoryStats  *MemoryStats             `protobuf:"bytes,2,opt,name=memory_stats,json=memoryStats" json:"memory_stats,omitempty"`
697
-	BlkioStats   *BlkioStats              `protobuf:"bytes,3,opt,name=blkio_stats,json=blkioStats" json:"blkio_stats,omitempty"`
698
-	HugetlbStats map[string]*HugetlbStats `protobuf:"bytes,4,rep,name=hugetlb_stats,json=hugetlbStats" json:"hugetlb_stats,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"`
699
-	PidsStats    *PidsStats               `protobuf:"bytes,5,opt,name=pids_stats,json=pidsStats" json:"pids_stats,omitempty"`
695
+	CpuStats     *CpuStats                `protobuf:"bytes,1,opt,name=cpu_stats" json:"cpu_stats,omitempty"`
696
+	MemoryStats  *MemoryStats             `protobuf:"bytes,2,opt,name=memory_stats" json:"memory_stats,omitempty"`
697
+	BlkioStats   *BlkioStats              `protobuf:"bytes,3,opt,name=blkio_stats" json:"blkio_stats,omitempty"`
698
+	HugetlbStats map[string]*HugetlbStats `protobuf:"bytes,4,rep,name=hugetlb_stats" json:"hugetlb_stats,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"`
699
+	PidsStats    *PidsStats               `protobuf:"bytes,5,opt,name=pids_stats" json:"pids_stats,omitempty"`
700 700
 }
701 701
 
702 702
 func (m *CgroupStats) Reset()                    { *m = CgroupStats{} }
703 703
 func (m *CgroupStats) String() string            { return proto.CompactTextString(m) }
704 704
 func (*CgroupStats) ProtoMessage()               {}
705
-func (*CgroupStats) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{38} }
705
+func (*CgroupStats) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{40} }
706 706
 
707 707
 func (m *CgroupStats) GetCpuStats() *CpuStats {
708 708
 	if m != nil {
... ...
@@ -740,15 +766,15 @@ func (m *CgroupStats) GetPidsStats() *PidsStats {
740 740
 }
741 741
 
742 742
 type StatsResponse struct {
743
-	NetworkStats []*NetworkStats `protobuf:"bytes,1,rep,name=network_stats,json=networkStats" json:"network_stats,omitempty"`
744
-	CgroupStats  *CgroupStats    `protobuf:"bytes,2,opt,name=cgroup_stats,json=cgroupStats" json:"cgroup_stats,omitempty"`
743
+	NetworkStats []*NetworkStats `protobuf:"bytes,1,rep,name=network_stats" json:"network_stats,omitempty"`
744
+	CgroupStats  *CgroupStats    `protobuf:"bytes,2,opt,name=cgroup_stats" json:"cgroup_stats,omitempty"`
745 745
 	Timestamp    uint64          `protobuf:"varint,3,opt,name=timestamp" json:"timestamp,omitempty"`
746 746
 }
747 747
 
748 748
 func (m *StatsResponse) Reset()                    { *m = StatsResponse{} }
749 749
 func (m *StatsResponse) String() string            { return proto.CompactTextString(m) }
750 750
 func (*StatsResponse) ProtoMessage()               {}
751
-func (*StatsResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{39} }
751
+func (*StatsResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{41} }
752 752
 
753 753
 func (m *StatsResponse) GetNetworkStats() []*NetworkStats {
754 754
 	if m != nil {
... ...
@@ -771,9 +797,11 @@ type StatsRequest struct {
771 771
 func (m *StatsRequest) Reset()                    { *m = StatsRequest{} }
772 772
 func (m *StatsRequest) String() string            { return proto.CompactTextString(m) }
773 773
 func (*StatsRequest) ProtoMessage()               {}
774
-func (*StatsRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{40} }
774
+func (*StatsRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{42} }
775 775
 
776 776
 func init() {
777
+	proto.RegisterType((*GetServerVersionRequest)(nil), "types.GetServerVersionRequest")
778
+	proto.RegisterType((*GetServerVersionResponse)(nil), "types.GetServerVersionResponse")
777 779
 	proto.RegisterType((*UpdateProcessRequest)(nil), "types.UpdateProcessRequest")
778 780
 	proto.RegisterType((*UpdateProcessResponse)(nil), "types.UpdateProcessResponse")
779 781
 	proto.RegisterType((*CreateContainerRequest)(nil), "types.CreateContainerRequest")
... ...
@@ -824,6 +852,7 @@ var _ grpc.ClientConn
824 824
 // Client API for API service
825 825
 
826 826
 type APIClient interface {
827
+	GetServerVersion(ctx context.Context, in *GetServerVersionRequest, opts ...grpc.CallOption) (*GetServerVersionResponse, error)
827 828
 	CreateContainer(ctx context.Context, in *CreateContainerRequest, opts ...grpc.CallOption) (*CreateContainerResponse, error)
828 829
 	UpdateContainer(ctx context.Context, in *UpdateContainerRequest, opts ...grpc.CallOption) (*UpdateContainerResponse, error)
829 830
 	Signal(ctx context.Context, in *SignalRequest, opts ...grpc.CallOption) (*SignalResponse, error)
... ...
@@ -845,6 +874,15 @@ func NewAPIClient(cc *grpc.ClientConn) APIClient {
845 845
 	return &aPIClient{cc}
846 846
 }
847 847
 
848
+func (c *aPIClient) GetServerVersion(ctx context.Context, in *GetServerVersionRequest, opts ...grpc.CallOption) (*GetServerVersionResponse, error) {
849
+	out := new(GetServerVersionResponse)
850
+	err := grpc.Invoke(ctx, "/types.API/GetServerVersion", in, out, c.cc, opts...)
851
+	if err != nil {
852
+		return nil, err
853
+	}
854
+	return out, nil
855
+}
856
+
848 857
 func (c *aPIClient) CreateContainer(ctx context.Context, in *CreateContainerRequest, opts ...grpc.CallOption) (*CreateContainerResponse, error) {
849 858
 	out := new(CreateContainerResponse)
850 859
 	err := grpc.Invoke(ctx, "/types.API/CreateContainer", in, out, c.cc, opts...)
... ...
@@ -970,6 +1008,7 @@ func (c *aPIClient) Stats(ctx context.Context, in *StatsRequest, opts ...grpc.Ca
970 970
 // Server API for API service
971 971
 
972 972
 type APIServer interface {
973
+	GetServerVersion(context.Context, *GetServerVersionRequest) (*GetServerVersionResponse, error)
973 974
 	CreateContainer(context.Context, *CreateContainerRequest) (*CreateContainerResponse, error)
974 975
 	UpdateContainer(context.Context, *UpdateContainerRequest) (*UpdateContainerResponse, error)
975 976
 	Signal(context.Context, *SignalRequest) (*SignalResponse, error)
... ...
@@ -987,6 +1026,18 @@ func RegisterAPIServer(s *grpc.Server, srv APIServer) {
987 987
 	s.RegisterService(&_API_serviceDesc, srv)
988 988
 }
989 989
 
990
+func _API_GetServerVersion_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error) (interface{}, error) {
991
+	in := new(GetServerVersionRequest)
992
+	if err := dec(in); err != nil {
993
+		return nil, err
994
+	}
995
+	out, err := srv.(APIServer).GetServerVersion(ctx, in)
996
+	if err != nil {
997
+		return nil, err
998
+	}
999
+	return out, nil
1000
+}
1001
+
990 1002
 func _API_CreateContainer_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error) (interface{}, error) {
991 1003
 	in := new(CreateContainerRequest)
992 1004
 	if err := dec(in); err != nil {
... ...
@@ -1133,6 +1184,10 @@ var _API_serviceDesc = grpc.ServiceDesc{
1133 1133
 	HandlerType: (*APIServer)(nil),
1134 1134
 	Methods: []grpc.MethodDesc{
1135 1135
 		{
1136
+			MethodName: "GetServerVersion",
1137
+			Handler:    _API_GetServerVersion_Handler,
1138
+		},
1139
+		{
1136 1140
 			MethodName: "CreateContainer",
1137 1141
 			Handler:    _API_CreateContainer_Handler,
1138 1142
 		},
... ...
@@ -1183,144 +1238,148 @@ var _API_serviceDesc = grpc.ServiceDesc{
1183 1183
 }
1184 1184
 
1185 1185
 var fileDescriptor0 = []byte{
1186
-	// 2212 bytes of a gzipped FileDescriptorProto
1187
-	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0xec, 0x39, 0x4b, 0x73, 0x1c, 0x49,
1188
-	0xd1, 0x9e, 0xa7, 0x34, 0x39, 0x0f, 0x49, 0x6d, 0x3d, 0xc6, 0xb3, 0x6b, 0xaf, 0xbf, 0x8e, 0x0f,
1189
-	0xd6, 0xc0, 0x22, 0x8c, 0xbc, 0x1b, 0x38, 0x20, 0x20, 0x62, 0x2d, 0x1b, 0x30, 0x6b, 0x2d, 0x72,
1190
-	0x4b, 0x8a, 0xbd, 0x10, 0x31, 0xd1, 0x9a, 0x2e, 0xcf, 0x34, 0xea, 0xe9, 0xee, 0xed, 0xae, 0xd1,
1191
-	0xe3, 0xc2, 0x11, 0x6e, 0x1c, 0xb9, 0x10, 0xc1, 0x85, 0x1b, 0x77, 0x0e, 0xfc, 0x02, 0xfe, 0x09,
1192
-	0xb1, 0x3f, 0x81, 0x23, 0x59, 0x95, 0xd5, 0x55, 0xd5, 0xf3, 0x90, 0x96, 0x03, 0xc1, 0x85, 0xcb,
1193
-	0x44, 0xe5, 0xa3, 0x32, 0xb3, 0xf2, 0x55, 0xd9, 0x35, 0xd0, 0xf2, 0xd3, 0x70, 0x3f, 0xcd, 0x12,
1194
-	0x9e, 0x38, 0x0d, 0x7e, 0x93, 0xb2, 0xdc, 0xfd, 0x6d, 0x05, 0xb6, 0xcf, 0xd2, 0xc0, 0xe7, 0xec,
1195
-	0x38, 0x4b, 0x46, 0x2c, 0xcf, 0x3d, 0xf6, 0xe5, 0x8c, 0xe5, 0xdc, 0xe9, 0x41, 0x35, 0x0c, 0xfa,
1196
-	0x95, 0xc7, 0x95, 0x27, 0x2d, 0x0f, 0x57, 0xce, 0x26, 0xd4, 0x52, 0x44, 0x54, 0x25, 0x42, 0x2c,
1197
-	0x9d, 0x47, 0x00, 0xa3, 0x28, 0xc9, 0xd9, 0x09, 0x0f, 0xc2, 0xb8, 0x5f, 0x43, 0xc2, 0xba, 0x67,
1198
-	0x61, 0x9c, 0x6d, 0x68, 0x5c, 0x85, 0x01, 0x9f, 0xf4, 0xeb, 0x48, 0xea, 0x7a, 0x04, 0x38, 0xbb,
1199
-	0xd0, 0x9c, 0xb0, 0x70, 0x3c, 0xe1, 0xfd, 0x86, 0x44, 0x2b, 0xc8, 0xdd, 0x83, 0x9d, 0x39, 0x3b,
1200
-	0xf2, 0x34, 0x89, 0x73, 0xe6, 0x7e, 0x55, 0x81, 0xdd, 0xc3, 0x8c, 0x21, 0xe5, 0x30, 0x89, 0xb9,
1201
-	0x1f, 0xc6, 0x2c, 0x5b, 0x65, 0x23, 0x5a, 0x74, 0x3e, 0x8b, 0x83, 0x88, 0x1d, 0xfb, 0xa8, 0x96,
1202
-	0x4c, 0xb5, 0x30, 0xd2, 0xe2, 0x09, 0x1b, 0x5d, 0xa4, 0x49, 0x18, 0x73, 0x69, 0x31, 0xd2, 0x0d,
1203
-	0x46, 0x58, 0x9c, 0xcb, 0xc3, 0xd4, 0x25, 0x89, 0x00, 0x61, 0x31, 0x2e, 0x92, 0x19, 0x59, 0xdc,
1204
-	0xf2, 0x14, 0xa4, 0xf0, 0x2c, 0xcb, 0xfa, 0x4d, 0x8d, 0x47, 0x48, 0xe0, 0x23, 0xff, 0x9c, 0x45,
1205
-	0x79, 0x7f, 0xed, 0x71, 0x4d, 0xe0, 0x09, 0x72, 0x1e, 0x43, 0x3b, 0x4e, 0x8e, 0xc3, 0xcb, 0x84,
1206
-	0x7b, 0x49, 0xc2, 0xfb, 0xeb, 0xd2, 0x61, 0x36, 0xca, 0x7d, 0x0d, 0x7b, 0x0b, 0x27, 0x25, 0x2f,
1207
-	0x38, 0xfb, 0xd0, 0x1a, 0x15, 0x48, 0x79, 0xe2, 0xf6, 0xc1, 0xe6, 0xbe, 0x0c, 0xe1, 0xbe, 0x61,
1208
-	0x36, 0x2c, 0x28, 0xaa, 0x7b, 0x12, 0x8e, 0x63, 0x3f, 0xfa, 0xfa, 0xf1, 0x14, 0xe7, 0x91, 0x5b,
1209
-	0xa4, 0x67, 0x30, 0x32, 0x04, 0xb9, 0x9b, 0xd0, 0x2b, 0x44, 0xa9, 0x90, 0xfc, 0xb5, 0x06, 0x5b,
1210
-	0x9f, 0x06, 0xc1, 0x1d, 0x19, 0x33, 0x80, 0x75, 0xce, 0xb2, 0x69, 0x28, 0x24, 0x56, 0xe5, 0x61,
1211
-	0x35, 0xec, 0x7c, 0x00, 0xf5, 0x59, 0x8e, 0x27, 0xa9, 0xc9, 0x93, 0xb4, 0xd5, 0x49, 0xce, 0x10,
1212
-	0xe5, 0x49, 0x82, 0xe3, 0x40, 0xdd, 0xcf, 0xc6, 0x39, 0x46, 0x42, 0xb8, 0x50, 0xae, 0x85, 0xc9,
1213
-	0x2c, 0xbe, 0xc4, 0x28, 0x08, 0x94, 0x58, 0x0a, 0xcc, 0xe8, 0x2a, 0x50, 0xfe, 0x17, 0xcb, 0xe2,
1214
-	0x58, 0x6b, 0xe6, 0x58, 0x3a, 0xa8, 0xeb, 0xcb, 0x83, 0xda, 0x5a, 0x11, 0x54, 0x28, 0x05, 0xd5,
1215
-	0x85, 0xce, 0xc8, 0x4f, 0xfd, 0xf3, 0x30, 0x0a, 0x79, 0xc8, 0xf2, 0x7e, 0x5b, 0x1a, 0x51, 0xc2,
1216
-	0x39, 0x4f, 0x60, 0xc3, 0x4f, 0x53, 0x3f, 0x9b, 0x26, 0x19, 0xba, 0xe6, 0x5d, 0x18, 0xb1, 0x7e,
1217
-	0x47, 0x0a, 0x99, 0x47, 0x0b, 0x69, 0x39, 0x8b, 0xc2, 0x78, 0x76, 0xfd, 0x46, 0xe4, 0x46, 0xbf,
1218
-	0x2b, 0xd9, 0x4a, 0x38, 0x21, 0x2d, 0x4e, 0x3e, 0x67, 0x57, 0xc7, 0x59, 0x78, 0x89, 0x7b, 0xc6,
1219
-	0xa8, 0xb4, 0x27, 0xbd, 0x38, 0x8f, 0x76, 0x3e, 0x84, 0xb5, 0x2c, 0x0a, 0xa7, 0x21, 0xcf, 0xfb,
1220
-	0x1b, 0x68, 0x56, 0xfb, 0xa0, 0xab, 0xfc, 0xe9, 0x49, 0xac, 0x57, 0x50, 0xdd, 0x97, 0xd0, 0x24,
1221
-	0x94, 0x70, 0xaf, 0x60, 0x51, 0xd1, 0x92, 0x6b, 0x81, 0xcb, 0x93, 0x77, 0x5c, 0xc6, 0xaa, 0xee,
1222
-	0xc9, 0xb5, 0xc0, 0x4d, 0xfc, 0x2c, 0x90, 0x71, 0x42, 0x9c, 0x58, 0xbb, 0x1e, 0xd4, 0x45, 0xa0,
1223
-	0x84, 0xab, 0x67, 0x2a, 0xe0, 0x5d, 0x4f, 0x2c, 0x05, 0x66, 0xac, 0x72, 0x0a, 0x31, 0xb8, 0x74,
1224
-	0xbe, 0x09, 0x3d, 0x3f, 0x08, 0xd0, 0x3d, 0x09, 0x46, 0xfd, 0x67, 0x61, 0x90, 0xa3, 0xa4, 0x1a,
1225
-	0x12, 0xe7, 0xb0, 0xee, 0x36, 0x38, 0x76, 0x42, 0xa9, 0x3c, 0xfb, 0x95, 0xae, 0x07, 0x5d, 0xa3,
1226
-	0xab, 0x92, 0xed, 0xfb, 0xa5, 0xd2, 0xae, 0xca, 0xb4, 0xda, 0x2a, 0x0a, 0xc4, 0xec, 0xb6, 0x98,
1227
-	0xdc, 0x01, 0xf4, 0x17, 0xa5, 0x2b, 0xcd, 0x3f, 0x86, 0xbd, 0x97, 0x2c, 0x62, 0x5f, 0x47, 0x33,
1228
-	0xba, 0x28, 0xf6, 0xa7, 0x4c, 0x55, 0x92, 0x5c, 0x0b, 0xd1, 0x8b, 0xdb, 0x95, 0xe8, 0x0f, 0x61,
1229
-	0xe7, 0x4d, 0x98, 0xf3, 0x3b, 0x05, 0xbb, 0xbf, 0x01, 0x30, 0x4c, 0x5a, 0x4d, 0xc5, 0xa8, 0x11,
1230
-	0x38, 0x76, 0x1d, 0x72, 0x55, 0x5d, 0x72, 0x2d, 0x62, 0xc0, 0x47, 0xa9, 0x6a, 0xc7, 0x62, 0x29,
1231
-	0xfa, 0xce, 0x2c, 0x0e, 0xaf, 0x4f, 0x92, 0xd1, 0x05, 0xe3, 0xb9, 0xec, 0x6d, 0xd8, 0x77, 0x2c,
1232
-	0x94, 0x2c, 0x91, 0x09, 0x8b, 0x22, 0xd9, 0xe0, 0xd6, 0x3d, 0x02, 0xdc, 0x23, 0xd8, 0x9d, 0x37,
1233
-	0x54, 0x35, 0xa3, 0x67, 0xd0, 0x36, 0x7e, 0xcc, 0xd1, 0xa4, 0xda, 0x72, 0x6f, 0xdb, 0x5c, 0xee,
1234
-	0x23, 0xe8, 0x9c, 0x70, 0xf4, 0xf6, 0xaa, 0xe3, 0x3e, 0x81, 0x9e, 0xee, 0x64, 0x92, 0x91, 0x6a,
1235
-	0xd1, 0xe7, 0xb3, 0x5c, 0x71, 0x29, 0xc8, 0xfd, 0x5b, 0x0d, 0xd6, 0x54, 0xaa, 0x14, 0xf5, 0x5e,
1236
-	0x31, 0xf5, 0xfe, 0x5f, 0x69, 0x3b, 0xef, 0x43, 0x2b, 0xbf, 0xc9, 0x39, 0x9b, 0x1e, 0xab, 0xe6,
1237
-	0xd3, 0xf5, 0x0c, 0xe2, 0x7f, 0x2d, 0xc8, 0xb4, 0xa0, 0xbf, 0x57, 0xa0, 0xa5, 0xc3, 0xfc, 0x6f,
1238
-	0x5f, 0xe0, 0x1f, 0x41, 0x2b, 0xa5, 0xc0, 0x33, 0xea, 0x24, 0xed, 0x83, 0x9e, 0x52, 0x54, 0xf4,
1239
-	0x0e, 0xc3, 0x60, 0xe5, 0x4f, 0xdd, 0xce, 0x1f, 0xeb, 0x82, 0x6e, 0x94, 0x2e, 0x68, 0x0c, 0x7e,
1240
-	0x2a, 0x5a, 0x54, 0x53, 0xb6, 0x28, 0xb9, 0x76, 0xfa, 0x78, 0xb0, 0x59, 0xcc, 0x43, 0xac, 0x3c,
1241
-	0xba, 0x53, 0x0a, 0xd0, 0xfd, 0x04, 0xd6, 0x8e, 0xfc, 0xd1, 0x04, 0xcf, 0x21, 0x36, 0x8e, 0x52,
1242
-	0x95, 0xa6, 0xb8, 0x51, 0xac, 0x85, 0x92, 0x29, 0x43, 0x7f, 0xdf, 0xa8, 0x7e, 0xaa, 0x20, 0xf7,
1243
-	0x02, 0x2f, 0x66, 0x2a, 0x03, 0x55, 0x4c, 0x4f, 0xb1, 0x73, 0x15, 0x0e, 0x29, 0x6a, 0x69, 0xf1,
1244
-	0x6a, 0xb7, 0x78, 0x30, 0x2c, 0x6b, 0x53, 0xd2, 0xac, 0x1a, 0x5d, 0xe1, 0x03, 0x65, 0x8f, 0x57,
1245
-	0x90, 0xdd, 0xdf, 0xe1, 0xec, 0x44, 0x53, 0xd5, 0x9d, 0xb3, 0xd3, 0xf2, 0x79, 0x80, 0xdc, 0x57,
1246
-	0x2b, 0xb9, 0xef, 0x19, 0xb4, 0x32, 0x96, 0x27, 0xb3, 0x0c, 0xdd, 0x2c, 0x3d, 0xdb, 0x3e, 0xd8,
1247
-	0x29, 0x2a, 0x49, 0xea, 0xf2, 0x14, 0xd5, 0x33, 0x7c, 0xee, 0x57, 0x55, 0xe8, 0x95, 0xa9, 0xa2,
1248
-	0x2f, 0x9d, 0x47, 0x17, 0x61, 0xf2, 0x05, 0x8d, 0x83, 0xe4, 0x3c, 0x1b, 0x25, 0xaa, 0x0a, 0x7d,
1249
-	0x79, 0x82, 0xb7, 0x0e, 0x6a, 0xa2, 0x5b, 0xc5, 0x20, 0x14, 0xf5, 0x98, 0x65, 0x61, 0x12, 0xa8,
1250
-	0x91, 0xc5, 0x20, 0x44, 0x1b, 0x40, 0xe0, 0xed, 0x2c, 0xe1, 0xbe, 0x1a, 0x40, 0x35, 0x2c, 0xe7,
1251
-	0x40, 0x8c, 0x11, 0xe3, 0x87, 0x22, 0x6a, 0x0d, 0x35, 0x07, 0x6a, 0x8c, 0xa1, 0x1f, 0xb1, 0x69,
1252
-	0xae, 0xca, 0xdc, 0xc2, 0x08, 0xcb, 0x29, 0x9a, 0x6f, 0x44, 0x52, 0xab, 0x7a, 0xb7, 0x51, 0x42,
1253
-	0x02, 0x81, 0x27, 0x57, 0x7e, 0x2a, 0xcb, 0xbe, 0xeb, 0x59, 0x18, 0x4c, 0xe4, 0x2d, 0x82, 0xd0,
1254
-	0x1b, 0x2c, 0xbb, 0xf4, 0xc5, 0x55, 0x28, 0xdb, 0x40, 0xd7, 0x5b, 0x24, 0x08, 0xee, 0x0b, 0x96,
1255
-	0xc5, 0x2c, 0x3a, 0xb2, 0xb4, 0x02, 0x71, 0x2f, 0x10, 0xdc, 0x07, 0xb0, 0xb7, 0x10, 0x73, 0x75,
1256
-	0xf7, 0x7c, 0x17, 0xba, 0xaf, 0x2e, 0x19, 0x76, 0xe3, 0x22, 0x0b, 0xd0, 0x87, 0x22, 0x99, 0x31,
1257
-	0xb2, 0xd3, 0x54, 0x46, 0xa0, 0xee, 0x19, 0x84, 0x9b, 0x43, 0x43, 0xb2, 0x2f, 0x1d, 0x17, 0x28,
1258
-	0x81, 0xaa, 0x3a, 0x81, 0xca, 0xe9, 0xd2, 0xd5, 0xe9, 0xa2, 0x12, 0xab, 0x6e, 0x12, 0xab, 0xa4,
1259
-	0xb4, 0x31, 0xaf, 0xf4, 0xf7, 0x55, 0xe8, 0x7c, 0xce, 0xf8, 0x55, 0x92, 0x5d, 0x88, 0x42, 0xc9,
1260
-	0x97, 0xde, 0x7c, 0x0f, 0x60, 0x3d, 0xbb, 0x1e, 0x9e, 0xdf, 0x70, 0x95, 0x18, 0x75, 0xac, 0xcb,
1261
-	0xeb, 0x17, 0x02, 0x74, 0x1e, 0x02, 0x20, 0xe9, 0xd8, 0xa7, 0xdb, 0x8e, 0x06, 0x97, 0x56, 0x76,
1262
-	0xad, 0x10, 0xce, 0x7b, 0xd0, 0xf2, 0xae, 0x87, 0xd8, 0x4f, 0x93, 0x8c, 0xb2, 0xb7, 0xee, 0xa1,
1263
-	0xa8, 0x57, 0x12, 0x16, 0x7b, 0x91, 0x18, 0x64, 0x49, 0x9a, 0xb2, 0xa0, 0x30, 0x2d, 0xbb, 0x7e,
1264
-	0x49, 0x08, 0xa1, 0xf5, 0xb4, 0xd0, 0xda, 0x24, 0xad, 0xdc, 0x68, 0x45, 0x52, 0xaa, 0xb4, 0xae,
1265
-	0xa9, 0x43, 0xd9, 0x5a, 0x4f, 0xb5, 0xd6, 0x75, 0xd2, 0xca, 0x2d, 0xad, 0xa7, 0x46, 0x6b, 0xab,
1266
-	0xd8, 0xab, 0xb4, 0xba, 0x7f, 0xa9, 0xc0, 0x3a, 0xa6, 0xe5, 0x59, 0xee, 0x8f, 0x19, 0xde, 0x60,
1267
-	0x6d, 0x8e, 0x29, 0x1c, 0x0d, 0x67, 0x02, 0x54, 0x21, 0x03, 0x89, 0x22, 0x86, 0xff, 0x83, 0x4e,
1268
-	0xca, 0x32, 0x4c, 0x56, 0xc5, 0x51, 0xc5, 0x86, 0x52, 0xf7, 0xda, 0x84, 0x23, 0x96, 0x7d, 0xb8,
1269
-	0x2f, 0x69, 0xc3, 0x30, 0x1e, 0x52, 0xfa, 0x4c, 0x93, 0x80, 0x29, 0x57, 0x6d, 0x49, 0xd2, 0xeb,
1270
-	0xf8, 0x33, 0x4d, 0x70, 0xbe, 0x0d, 0x5b, 0x9a, 0x5f, 0xdc, 0x92, 0x92, 0x9b, 0x5c, 0xb7, 0xa1,
1271
-	0xb8, 0xcf, 0x14, 0x1a, 0x87, 0x96, 0xde, 0xe9, 0x04, 0x3f, 0x30, 0x39, 0x5e, 0x23, 0xe3, 0x97,
1272
-	0x3e, 0x16, 0x1b, 0x76, 0xd0, 0x54, 0x96, 0x64, 0xae, 0xac, 0x2d, 0x40, 0xe7, 0x3b, 0xb0, 0xc5,
1273
-	0x89, 0x97, 0x05, 0xc3, 0x82, 0x87, 0xa2, 0xb9, 0xa9, 0x09, 0xc7, 0x8a, 0xf9, 0x1b, 0xd0, 0x33,
1274
-	0xcc, 0xb2, 0x1f, 0x93, 0xbd, 0x5d, 0x8d, 0x3d, 0x15, 0x5d, 0xf9, 0x8f, 0xe4, 0x2c, 0xca, 0x9c,
1275
-	0x8f, 0x64, 0x87, 0xb0, 0x5c, 0xd5, 0x3e, 0xd8, 0x28, 0x3a, 0xab, 0x72, 0x86, 0xec, 0x0a, 0xe4,
1276
-	0x96, 0x9f, 0xc0, 0x06, 0xd7, 0xa6, 0x0f, 0xb1, 0x80, 0x7c, 0xd5, 0x5e, 0x8b, 0xee, 0x56, 0x3e,
1277
-	0x98, 0xd7, 0xe3, 0xe5, 0x83, 0xa2, 0xe7, 0xe9, 0xca, 0x57, 0x0a, 0xc9, 0xbe, 0x36, 0xe1, 0xa4,
1278
-	0x0a, 0xf7, 0x47, 0xd0, 0xc2, 0x79, 0x20, 0x27, 0xeb, 0xd0, 0x31, 0xa3, 0x59, 0x96, 0x61, 0x7d,
1279
-	0x15, 0x8e, 0x51, 0xa0, 0x98, 0x17, 0xe4, 0x75, 0xa9, 0x9c, 0x41, 0x80, 0x9b, 0x00, 0x50, 0x99,
1280
-	0x4b, 0x6d, 0xc8, 0x63, 0xa7, 0x00, 0x01, 0x22, 0xcf, 0xa6, 0xfe, 0xb5, 0x0e, 0xbd, 0xcc, 0x33,
1281
-	0x44, 0xd0, 0x01, 0x51, 0xe1, 0x3b, 0x3f, 0x8c, 0x46, 0xea, 0xdb, 0x17, 0x15, 0x2a, 0xd0, 0x28,
1282
-	0xac, 0xdb, 0x0a, 0xff, 0x5c, 0x85, 0x36, 0x69, 0x24, 0x83, 0x91, 0x6b, 0x84, 0x17, 0x8b, 0x56,
1283
-	0x29, 0x01, 0xbc, 0xfa, 0x1b, 0x46, 0x9d, 0x19, 0x03, 0x8d, 0xa9, 0x85, 0x6d, 0x78, 0xd1, 0xe5,
1284
-	0xd8, 0xfb, 0x2c, 0xef, 0x2c, 0xe5, 0x6e, 0x09, 0x26, 0x32, 0xf8, 0x63, 0xe8, 0x50, 0x7e, 0xaa,
1285
-	0x3d, 0xf5, 0x55, 0x7b, 0xda, 0xc4, 0x46, 0xbb, 0x9e, 0x89, 0x69, 0x0b, 0xed, 0x95, 0xb7, 0x7b,
1286
-	0xfb, 0xe0, 0x61, 0x89, 0x5d, 0x9e, 0x64, 0x5f, 0xfe, 0xbe, 0x8a, 0x39, 0xb6, 0x59, 0xe2, 0x1d,
1287
-	0x3c, 0x07, 0x30, 0x48, 0xd1, 0xb3, 0x2e, 0xd8, 0x4d, 0x31, 0x55, 0xe2, 0x52, 0x9c, 0xfd, 0xd2,
1288
-	0x8f, 0x66, 0x85, 0x53, 0x09, 0xf8, 0x61, 0xf5, 0x79, 0xc5, 0x1d, 0xc1, 0xc6, 0x0b, 0x71, 0x67,
1289
-	0x59, 0xdb, 0x91, 0x79, 0xea, 0xff, 0x3a, 0xc9, 0x0a, 0x47, 0x49, 0x40, 0x62, 0xc3, 0x18, 0xb1,
1290
-	0x4a, 0x84, 0x04, 0x44, 0x1b, 0x4d, 0x52, 0x75, 0xc3, 0xe2, 0xca, 0x28, 0xaa, 0x5b, 0x8a, 0xdc,
1291
-	0x7f, 0xd4, 0x01, 0x8c, 0x16, 0xe7, 0x04, 0x06, 0x61, 0x32, 0x14, 0x17, 0x44, 0x38, 0x62, 0xd4,
1292
-	0x90, 0x86, 0x19, 0xc3, 0xf4, 0xc9, 0xc3, 0x4b, 0xa6, 0x66, 0x88, 0x5d, 0x75, 0xee, 0x39, 0xe3,
1293
-	0xbc, 0x3d, 0x84, 0x68, 0xa3, 0xec, 0x5c, 0x5e, 0xb1, 0xcd, 0xf9, 0x05, 0xec, 0x18, 0xa1, 0x81,
1294
-	0x25, 0xaf, 0x7a, 0xab, 0xbc, 0xfb, 0x5a, 0x5e, 0x60, 0x64, 0xfd, 0x14, 0x10, 0x3d, 0xc4, 0x3b,
1295
-	0x66, 0x56, 0x92, 0x54, 0xbb, 0x55, 0xd2, 0x56, 0x98, 0xbc, 0x95, 0x3b, 0x8c, 0x9c, 0xb7, 0xf0,
1296
-	0xc0, 0x3a, 0xa8, 0x28, 0x7b, 0x4b, 0x5a, 0xfd, 0x56, 0x69, 0xbb, 0xda, 0x2e, 0xd1, 0x18, 0x8c,
1297
-	0xc8, 0xcf, 0x00, 0x29, 0xc3, 0x2b, 0x3f, 0xe4, 0xf3, 0xf2, 0x1a, 0x77, 0x9d, 0xf3, 0x0b, 0xdc,
1298
-	0x54, 0x16, 0x46, 0xe7, 0x9c, 0xb2, 0x6c, 0x5c, 0x3a, 0x67, 0xf3, 0xae, 0x73, 0x1e, 0xc9, 0x1d,
1299
-	0x46, 0xce, 0x0b, 0x40, 0xe4, 0xbc, 0x3d, 0x6b, 0xb7, 0x4a, 0xd9, 0x08, 0x93, 0xb2, 0x2d, 0x87,
1300
-	0xb0, 0x95, 0xb3, 0x11, 0xc7, 0x1b, 0xc5, 0x92, 0xb1, 0x7e, 0xab, 0x8c, 0x4d, 0xb5, 0x41, 0x0b,
1301
-	0x71, 0xbf, 0x84, 0xce, 0xcf, 0x67, 0x63, 0xc6, 0xa3, 0x73, 0x5d, 0xf3, 0xff, 0xe9, 0x36, 0xf3,
1302
-	0x4f, 0x6c, 0x33, 0x87, 0xe3, 0x2c, 0x99, 0xa5, 0xa5, 0xae, 0x4d, 0x35, 0xbc, 0xd0, 0xb5, 0x25,
1303
-	0x8f, 0xec, 0xda, 0xc4, 0xfd, 0x09, 0x74, 0x68, 0x60, 0x52, 0x1b, 0xa8, 0x0b, 0x39, 0x8b, 0x45,
1304
-	0x5f, 0x0c, 0x68, 0xb4, 0xed, 0x40, 0x0d, 0x9f, 0x6a, 0x57, 0xb9, 0x1b, 0x19, 0x37, 0xe1, 0xd7,
1305
-	0x87, 0xa9, 0xba, 0xd7, 0xd0, 0x9d, 0x90, 0x6f, 0xd4, 0x2e, 0x4a, 0xc0, 0xff, 0x2f, 0x8c, 0x33,
1306
-	0x67, 0xd8, 0xb7, 0x7d, 0x48, 0xae, 0xee, 0x4c, 0x6c, 0xb7, 0x7e, 0x0f, 0x40, 0x7c, 0x5e, 0x0c,
1307
-	0x8b, 0x46, 0x65, 0xbf, 0xe7, 0xe9, 0x1b, 0x02, 0xbf, 0x65, 0x8a, 0xe5, 0xe0, 0x14, 0xb6, 0x16,
1308
-	0x64, 0x2e, 0x69, 0x53, 0xdf, 0xb2, 0xdb, 0x54, 0xfb, 0xe0, 0xbe, 0x12, 0x69, 0x6f, 0xb5, 0x7b,
1309
-	0xd7, 0x9f, 0x2a, 0xf4, 0x35, 0xa2, 0x9f, 0x5c, 0x9c, 0xe7, 0xd0, 0x8d, 0x69, 0xf8, 0xd2, 0x01,
1310
-	0xa8, 0x59, 0x82, 0xec, 0xc1, 0xcc, 0xeb, 0xc4, 0xf6, 0x98, 0x86, 0x81, 0x18, 0x49, 0x0f, 0x2c,
1311
-	0x0d, 0x84, 0xe5, 0x1c, 0xaf, 0x3d, 0xb2, 0xa2, 0x5d, 0x1a, 0x06, 0x6b, 0xf3, 0xc3, 0xa0, 0x7a,
1312
-	0x34, 0x58, 0xf5, 0xc6, 0x78, 0xf0, 0x87, 0x26, 0xd4, 0x3e, 0x3d, 0x7e, 0xed, 0x78, 0xb0, 0x31,
1313
-	0xf7, 0x72, 0xea, 0x14, 0x7d, 0x7f, 0xf9, 0xdb, 0xf1, 0xe0, 0xd1, 0x2a, 0xb2, 0x1a, 0x95, 0xef,
1314
-	0x09, 0x99, 0x73, 0x73, 0xb4, 0x96, 0xb9, 0xfc, 0x9b, 0x4a, 0xcb, 0x5c, 0x35, 0x7e, 0xdf, 0x73,
1315
-	0x7e, 0x00, 0x4d, 0x7a, 0x4b, 0x75, 0xb6, 0x15, 0x6f, 0xe9, 0x95, 0x76, 0xb0, 0x33, 0x87, 0xd5,
1316
-	0x1b, 0xdf, 0x40, 0xb7, 0xf4, 0x3c, 0xee, 0xbc, 0x57, 0xd2, 0x55, 0x7e, 0x8a, 0x1d, 0xbc, 0xbf,
1317
-	0x9c, 0xa8, 0xa5, 0x1d, 0x02, 0x98, 0xe7, 0x36, 0xa7, 0xaf, 0xb8, 0x17, 0x9e, 0x74, 0x07, 0x0f,
1318
-	0x96, 0x50, 0xb4, 0x90, 0x33, 0xd8, 0x9c, 0x7f, 0x3f, 0x73, 0xe6, 0xbc, 0x3a, 0xff, 0xc6, 0x35,
1319
-	0xf8, 0x60, 0x25, 0xdd, 0x16, 0x3b, 0xff, 0x76, 0xa6, 0xc5, 0xae, 0x78, 0x93, 0xd3, 0x62, 0x57,
1320
-	0x3e, 0xba, 0xdd, 0x73, 0x7e, 0x09, 0xbd, 0xf2, 0x6b, 0x96, 0x53, 0x38, 0x69, 0xe9, 0x6b, 0xdc,
1321
-	0xe0, 0xe1, 0x0a, 0xaa, 0x16, 0xf8, 0x31, 0x34, 0xe8, 0x99, 0xaa, 0xa8, 0x0d, 0xfb, 0x75, 0x6b,
1322
-	0xb0, 0x5d, 0x46, 0xea, 0x5d, 0x4f, 0xa1, 0x49, 0x5f, 0x60, 0x3a, 0x01, 0x4a, 0x1f, 0x64, 0x83,
1323
-	0x8e, 0x8d, 0x75, 0xef, 0x3d, 0xad, 0x14, 0x7a, 0xf2, 0x92, 0x9e, 0x7c, 0x99, 0x1e, 0x2b, 0x38,
1324
-	0xe7, 0x4d, 0xf9, 0x2f, 0xcf, 0xb3, 0x7f, 0x05, 0x00, 0x00, 0xff, 0xff, 0x9a, 0x70, 0x70, 0x7d,
1325
-	0xf2, 0x19, 0x00, 0x00,
1186
+	// 2285 bytes of a gzipped FileDescriptorProto
1187
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0xec, 0x19, 0xcb, 0x72, 0x1c, 0x49,
1188
+	0xd1, 0xf3, 0x94, 0x26, 0xe7, 0x21, 0xa9, 0xfd, 0xd0, 0x78, 0x76, 0xed, 0x35, 0x1d, 0xc0, 0x1a,
1189
+	0x58, 0x84, 0x91, 0x77, 0x03, 0x07, 0x04, 0x44, 0xac, 0x65, 0xb3, 0x98, 0xb5, 0x16, 0xb9, 0x25,
1190
+	0xb1, 0x17, 0x22, 0x26, 0x5a, 0x33, 0xe5, 0x99, 0x46, 0x33, 0xdd, 0xbd, 0xdd, 0x35, 0xd2, 0xe8,
1191
+	0xc2, 0x11, 0x6e, 0xfc, 0x00, 0x11, 0x5c, 0xb8, 0x71, 0xe7, 0xc0, 0x17, 0xf0, 0x27, 0xc4, 0x5e,
1192
+	0xb8, 0x73, 0x24, 0xab, 0x32, 0xbb, 0xba, 0x7a, 0x1e, 0xd2, 0x72, 0x20, 0xb8, 0xec, 0x65, 0xa2,
1193
+	0x32, 0x2b, 0x2b, 0x33, 0x2b, 0xdf, 0x5d, 0x03, 0x0d, 0x3f, 0x0e, 0xf6, 0xe2, 0x24, 0x92, 0x91,
1194
+	0x53, 0x93, 0x57, 0xb1, 0x48, 0xdd, 0xfb, 0xb0, 0xfb, 0x89, 0x90, 0xc7, 0x22, 0xb9, 0x10, 0xc9,
1195
+	0xaf, 0x45, 0x92, 0x06, 0x51, 0xe8, 0x89, 0x2f, 0x66, 0x22, 0x95, 0xee, 0x1c, 0xba, 0xcb, 0x5b,
1196
+	0x69, 0x1c, 0x85, 0xa9, 0x70, 0xee, 0x40, 0x6d, 0xea, 0xff, 0x36, 0x4a, 0xba, 0xa5, 0x47, 0xa5,
1197
+	0xc7, 0x6d, 0x8f, 0x00, 0x8d, 0x0d, 0x42, 0xc4, 0x96, 0x19, 0xab, 0x00, 0x85, 0x8d, 0x7d, 0x39,
1198
+	0x18, 0x77, 0x2b, 0x84, 0xd5, 0x80, 0xd3, 0x83, 0xcd, 0x44, 0x5c, 0x04, 0x8a, 0x6b, 0xb7, 0x8a,
1199
+	0x1b, 0x0d, 0xcf, 0xc0, 0xee, 0xef, 0x4b, 0x70, 0xe7, 0x34, 0x1e, 0xfa, 0x52, 0x1c, 0x25, 0xd1,
1200
+	0x40, 0xa4, 0x29, 0xab, 0xe4, 0x74, 0xa0, 0x1c, 0x0c, 0xb5, 0xcc, 0x86, 0x87, 0x2b, 0x67, 0x1b,
1201
+	0x2a, 0x31, 0x22, 0xca, 0x1a, 0xa1, 0x96, 0xce, 0x43, 0x80, 0xc1, 0x24, 0x4a, 0xc5, 0xb1, 0x1c,
1202
+	0x06, 0xa1, 0x96, 0xb8, 0xe9, 0x59, 0x18, 0xa5, 0xcc, 0x65, 0x30, 0x94, 0x63, 0x2d, 0x13, 0x95,
1203
+	0xd1, 0x80, 0x73, 0x0f, 0xea, 0x63, 0x11, 0x8c, 0xc6, 0xb2, 0x5b, 0xd3, 0x68, 0x86, 0xdc, 0x5d,
1204
+	0xb8, 0xbb, 0xa0, 0x07, 0xdd, 0xdf, 0xfd, 0xb2, 0x04, 0xf7, 0x0e, 0x12, 0x81, 0x3b, 0x07, 0x51,
1205
+	0x28, 0xfd, 0x20, 0x14, 0xc9, 0x3a, 0x1d, 0x51, 0xa3, 0xb3, 0x59, 0x38, 0x9c, 0x88, 0x23, 0x1f,
1206
+	0xc5, 0x92, 0xaa, 0x16, 0x46, 0x6b, 0x3c, 0x16, 0x83, 0xf3, 0x38, 0x0a, 0x42, 0xa9, 0x35, 0xc6,
1207
+	0xfd, 0x1c, 0xa3, 0x34, 0x4e, 0xf5, 0x65, 0xc8, 0x4a, 0x04, 0x28, 0x8d, 0x71, 0x11, 0xcd, 0x48,
1208
+	0xe3, 0x86, 0xc7, 0x10, 0xe3, 0x45, 0x92, 0x74, 0xeb, 0x06, 0x8f, 0x90, 0xc2, 0x4f, 0xfc, 0x33,
1209
+	0x31, 0x49, 0xbb, 0x1b, 0x8f, 0x2a, 0x0a, 0x4f, 0x90, 0xf3, 0x08, 0x9a, 0x61, 0x74, 0x14, 0x5c,
1210
+	0x44, 0xd2, 0x8b, 0x22, 0xd9, 0xdd, 0xd4, 0x06, 0xb3, 0x51, 0xee, 0x2b, 0xd8, 0x5d, 0xba, 0x29,
1211
+	0x47, 0xc1, 0x1e, 0x34, 0x06, 0x19, 0x52, 0xdf, 0xb8, 0xb9, 0xbf, 0xbd, 0xa7, 0xe3, 0x6a, 0x2f,
1212
+	0x27, 0xce, 0x49, 0x90, 0x55, 0xfb, 0x38, 0x18, 0x85, 0xfe, 0xe4, 0xab, 0xfb, 0x53, 0xdd, 0x47,
1213
+	0x1f, 0xe1, 0xe8, 0x61, 0xc8, 0xdd, 0x86, 0x4e, 0xc6, 0x8a, 0x5d, 0xf2, 0xb7, 0x0a, 0xec, 0x7c,
1214
+	0x3c, 0x1c, 0xde, 0x10, 0x31, 0x18, 0x76, 0x52, 0x24, 0x18, 0x98, 0xc8, 0xb1, 0xac, 0x2f, 0x6b,
1215
+	0x60, 0xe7, 0x3d, 0xa8, 0xce, 0x52, 0xbc, 0x49, 0x45, 0xdf, 0xa4, 0xc9, 0x37, 0x39, 0x45, 0x94,
1216
+	0xa7, 0x37, 0x1c, 0x07, 0xaa, 0x7e, 0x32, 0x4a, 0xd1, 0x13, 0xca, 0x84, 0x7a, 0xad, 0x54, 0x16,
1217
+	0xe1, 0x05, 0x7a, 0x41, 0xa1, 0xd4, 0x52, 0x61, 0x06, 0x97, 0x43, 0xb6, 0xbf, 0x5a, 0x66, 0xd7,
1218
+	0xda, 0xc8, 0xaf, 0x65, 0x9c, 0xba, 0xb9, 0xda, 0xa9, 0x8d, 0x35, 0x4e, 0x85, 0x82, 0x53, 0x5d,
1219
+	0x68, 0x0d, 0xfc, 0xd8, 0x3f, 0x0b, 0x26, 0x81, 0x0c, 0x44, 0xda, 0x6d, 0x6a, 0x25, 0x0a, 0x38,
1220
+	0xe7, 0x31, 0x6c, 0xf9, 0x71, 0xec, 0x27, 0xd3, 0x28, 0x41, 0xd3, 0xbc, 0x0d, 0x26, 0xa2, 0xdb,
1221
+	0xd2, 0x4c, 0x16, 0xd1, 0x8a, 0x5b, 0x2a, 0x26, 0x41, 0x38, 0x9b, 0xbf, 0x56, 0xb1, 0xd1, 0x6d,
1222
+	0x6b, 0xb2, 0x02, 0x4e, 0x71, 0x0b, 0xa3, 0xcf, 0xc4, 0xe5, 0x51, 0x12, 0x5c, 0xe0, 0x99, 0x11,
1223
+	0x0a, 0xed, 0x68, 0x2b, 0x2e, 0xa2, 0x9d, 0xf7, 0x61, 0x23, 0x99, 0x04, 0xd3, 0x40, 0xa6, 0xdd,
1224
+	0x2d, 0x54, 0xab, 0xb9, 0xdf, 0x66, 0x7b, 0x7a, 0x1a, 0xeb, 0x65, 0xbb, 0xee, 0x0b, 0xa8, 0x13,
1225
+	0x4a, 0x99, 0x57, 0x91, 0xb0, 0xb7, 0xf4, 0x5a, 0xe1, 0xd2, 0xe8, 0xad, 0xd4, 0xbe, 0xaa, 0x7a,
1226
+	0x7a, 0xad, 0x70, 0x63, 0x3f, 0x19, 0x6a, 0x3f, 0x21, 0x4e, 0xad, 0x5d, 0x0f, 0xaa, 0xca, 0x51,
1227
+	0xca, 0xd4, 0x33, 0x76, 0x78, 0xdb, 0x53, 0x4b, 0x85, 0x19, 0x71, 0x4c, 0x21, 0x06, 0x97, 0xce,
1228
+	0xb7, 0xa1, 0xe3, 0x0f, 0x87, 0x68, 0x9e, 0x08, 0xbd, 0xfe, 0x49, 0x30, 0x4c, 0x91, 0x53, 0x05,
1229
+	0x37, 0x17, 0xb0, 0xee, 0x1d, 0x70, 0xec, 0x80, 0xe2, 0x38, 0xfb, 0x8d, 0xc9, 0x07, 0x93, 0xa3,
1230
+	0xeb, 0x82, 0xed, 0x87, 0x85, 0xd4, 0x2e, 0xeb, 0xb0, 0xda, 0xc9, 0x12, 0x24, 0x3f, 0x6d, 0x11,
1231
+	0xb9, 0x3d, 0xe8, 0x2e, 0x73, 0x67, 0xc9, 0x3f, 0x85, 0xdd, 0x17, 0x62, 0x22, 0xbe, 0x8a, 0x64,
1232
+	0x34, 0x51, 0xe8, 0x4f, 0x05, 0x67, 0x92, 0x5e, 0x2b, 0xd6, 0xcb, 0xc7, 0x99, 0xf5, 0xfb, 0x70,
1233
+	0xf7, 0x75, 0x90, 0xca, 0x1b, 0x19, 0xbb, 0xbf, 0x03, 0xc8, 0x89, 0x8c, 0x98, 0x52, 0x2e, 0x46,
1234
+	0xe1, 0xc4, 0x3c, 0x90, 0x9c, 0x5d, 0x7a, 0xad, 0x7c, 0x20, 0x07, 0x31, 0x97, 0x63, 0xb5, 0x54,
1235
+	0x75, 0x67, 0x16, 0x06, 0xf3, 0xe3, 0x68, 0x70, 0x2e, 0x64, 0xaa, 0x6b, 0x1b, 0xd6, 0x1d, 0x0b,
1236
+	0xa5, 0x53, 0x64, 0x2c, 0x26, 0x13, 0x5d, 0xe0, 0x36, 0x3d, 0x02, 0xdc, 0x43, 0xb8, 0xb7, 0xa8,
1237
+	0x28, 0x17, 0xa3, 0xa7, 0xd0, 0xcc, 0xed, 0x98, 0xa2, 0x4a, 0x95, 0xd5, 0xd6, 0xb6, 0xa9, 0xdc,
1238
+	0x87, 0xd0, 0x3a, 0x96, 0x68, 0xed, 0x75, 0xd7, 0x7d, 0x0c, 0x1d, 0x53, 0xc9, 0x34, 0x21, 0xe5,
1239
+	0xa2, 0x2f, 0x67, 0x29, 0x53, 0x31, 0xe4, 0xfe, 0xbd, 0x02, 0x1b, 0x1c, 0x2a, 0x59, 0xbe, 0x97,
1240
+	0xf2, 0x7c, 0xff, 0xbf, 0x94, 0x9d, 0x77, 0xa1, 0x91, 0x5e, 0xa5, 0x52, 0x4c, 0x8f, 0xb8, 0xf8,
1241
+	0xb4, 0xbd, 0x1c, 0xf1, 0x75, 0x09, 0xca, 0x4b, 0xd0, 0x3f, 0x4a, 0xd0, 0x30, 0x6e, 0xfe, 0xaf,
1242
+	0x1b, 0xf8, 0x07, 0xd0, 0x88, 0xc9, 0xf1, 0x82, 0x2a, 0x49, 0x73, 0xbf, 0xc3, 0x82, 0xb2, 0xda,
1243
+	0x91, 0x13, 0x58, 0xf1, 0x53, 0xb5, 0xe3, 0xc7, 0x6a, 0xd0, 0xb5, 0x42, 0x83, 0x46, 0xe7, 0xc7,
1244
+	0xaa, 0x44, 0xd5, 0x75, 0x89, 0xd2, 0x6b, 0xa7, 0x8b, 0x17, 0x9b, 0x85, 0x32, 0xc0, 0xcc, 0xa3,
1245
+	0x9e, 0x92, 0x81, 0xee, 0x47, 0xb0, 0x71, 0xe8, 0x0f, 0xc6, 0x78, 0x0f, 0x75, 0x70, 0x10, 0x73,
1246
+	0x98, 0xe2, 0x41, 0xb5, 0x56, 0x42, 0xa6, 0x02, 0xed, 0x7d, 0xc5, 0xf5, 0x94, 0x21, 0xf7, 0x1c,
1247
+	0x1b, 0x33, 0xa5, 0x01, 0x27, 0xd3, 0x13, 0xac, 0x5c, 0x99, 0x41, 0xb2, 0x5c, 0x5a, 0x6e, 0xed,
1248
+	0x16, 0x0d, 0xba, 0x65, 0x63, 0x4a, 0x92, 0xb9, 0xd0, 0x65, 0x36, 0x60, 0x7d, 0xbc, 0x6c, 0xdb,
1249
+	0xfd, 0x03, 0xce, 0x4e, 0x34, 0x55, 0xdd, 0x38, 0x3b, 0xad, 0x9e, 0x07, 0xc8, 0x7c, 0x95, 0x82,
1250
+	0xf9, 0x9e, 0x42, 0x23, 0x11, 0x69, 0x34, 0x4b, 0xd0, 0xcc, 0xda, 0xb2, 0xcd, 0xfd, 0xbb, 0x59,
1251
+	0x26, 0x69, 0x59, 0x1e, 0xef, 0x7a, 0x39, 0x9d, 0xfb, 0x65, 0x19, 0x3a, 0xc5, 0x5d, 0x55, 0x97,
1252
+	0xce, 0x26, 0xe7, 0x41, 0xf4, 0x39, 0x8d, 0x83, 0x64, 0x3c, 0x1b, 0xa5, 0xb2, 0x0a, 0x6d, 0x79,
1253
+	0x8c, 0x5d, 0x07, 0x25, 0x51, 0x57, 0xc9, 0x11, 0xbc, 0x7b, 0x24, 0x92, 0x20, 0x1a, 0xf2, 0xc8,
1254
+	0x92, 0x23, 0x54, 0x19, 0x40, 0xe0, 0xcd, 0x2c, 0x92, 0x3e, 0x0f, 0xa0, 0x06, 0xd6, 0x73, 0x20,
1255
+	0xfa, 0x48, 0xc8, 0x03, 0xe5, 0xb5, 0x1a, 0xcf, 0x81, 0x06, 0x93, 0xef, 0x1f, 0x8a, 0x69, 0xca,
1256
+	0x69, 0x6e, 0x61, 0x94, 0xe6, 0xe4, 0xcd, 0xd7, 0x2a, 0xa8, 0x39, 0xdf, 0x6d, 0x94, 0xe2, 0x40,
1257
+	0xe0, 0xf1, 0xa5, 0x1f, 0xeb, 0xb4, 0x6f, 0x7b, 0x16, 0x06, 0x03, 0x79, 0x87, 0x20, 0xb4, 0x06,
1258
+	0x4e, 0xfd, 0xbe, 0x6a, 0x85, 0xba, 0x0c, 0xb4, 0xbd, 0xe5, 0x0d, 0x45, 0x7d, 0x2e, 0x92, 0x50,
1259
+	0x4c, 0x0e, 0x2d, 0xa9, 0x40, 0xd4, 0x4b, 0x1b, 0xea, 0x3b, 0x63, 0xc9, 0xe7, 0xdc, 0x7b, 0xbe,
1260
+	0x0f, 0xed, 0x97, 0x17, 0x02, 0xab, 0x71, 0x16, 0x05, 0x68, 0x43, 0x15, 0xcc, 0xe8, 0xd9, 0x69,
1261
+	0xac, 0x3d, 0x50, 0xf5, 0x72, 0x84, 0x9b, 0x42, 0x4d, 0x93, 0xaf, 0x1c, 0x17, 0x28, 0x80, 0xca,
1262
+	0x26, 0x80, 0x8a, 0xe1, 0xd2, 0x36, 0xe1, 0xc2, 0x81, 0x55, 0xcd, 0x03, 0xab, 0x20, 0xb4, 0xb6,
1263
+	0x28, 0xf4, 0x8f, 0x65, 0x68, 0x7d, 0x26, 0xe4, 0x65, 0x94, 0x9c, 0xab, 0x44, 0x49, 0x57, 0x76,
1264
+	0xbe, 0xfb, 0xf8, 0x49, 0x33, 0xef, 0x9f, 0x5d, 0x49, 0x0e, 0x8c, 0x2a, 0xe6, 0xe5, 0xfc, 0xb9,
1265
+	0x02, 0x9d, 0x07, 0x00, 0xb8, 0x75, 0xe4, 0x53, 0xb7, 0xa3, 0xc1, 0xa5, 0x91, 0xcc, 0x19, 0xe1,
1266
+	0xbc, 0x03, 0x0d, 0x6f, 0xde, 0xc7, 0x7a, 0x1a, 0x25, 0x14, 0xbd, 0x55, 0xfc, 0x1a, 0x9a, 0xbf,
1267
+	0xd4, 0xb0, 0x3a, 0x8b, 0x9b, 0xc3, 0x24, 0x8a, 0x63, 0x31, 0xcc, 0x54, 0x4b, 0xe6, 0x2f, 0x08,
1268
+	0xa1, 0xa4, 0x9e, 0x64, 0x52, 0xeb, 0x24, 0x55, 0xe6, 0x52, 0x71, 0x2b, 0x66, 0xa9, 0x1b, 0x7c,
1269
+	0x29, 0x5b, 0xea, 0x89, 0x91, 0xba, 0x49, 0x52, 0xa5, 0x25, 0xf5, 0x24, 0x97, 0xda, 0xc8, 0xce,
1270
+	0xb2, 0x54, 0xf7, 0xaf, 0x25, 0xd8, 0xc4, 0xb0, 0x3c, 0x4d, 0xfd, 0x91, 0xc0, 0x0e, 0xd6, 0x94,
1271
+	0x18, 0xc2, 0x93, 0xfe, 0x4c, 0x81, 0xec, 0x32, 0xd0, 0x28, 0x22, 0xf8, 0x06, 0xb4, 0x62, 0x91,
1272
+	0x60, 0xb0, 0x32, 0x45, 0x19, 0x0b, 0x4a, 0xd5, 0x6b, 0x12, 0x8e, 0x48, 0xf6, 0xe0, 0xb6, 0xde,
1273
+	0xeb, 0x07, 0x61, 0x9f, 0xc2, 0x67, 0x1a, 0x0d, 0x05, 0x9b, 0x6a, 0x47, 0x6f, 0xbd, 0x0a, 0x3f,
1274
+	0x35, 0x1b, 0xce, 0x77, 0x61, 0xc7, 0xd0, 0xab, 0x2e, 0xa9, 0xa9, 0xc9, 0x74, 0x5b, 0x4c, 0x7d,
1275
+	0xca, 0x68, 0x1c, 0x5a, 0x3a, 0x27, 0x63, 0xfc, 0xea, 0x95, 0xd8, 0x46, 0x46, 0x2f, 0x7c, 0x4c,
1276
+	0x36, 0xac, 0xa0, 0xb1, 0x4e, 0xc9, 0x94, 0xb5, 0xcd, 0x40, 0xe7, 0x7b, 0xb0, 0x23, 0x89, 0x56,
1277
+	0x0c, 0xfb, 0x19, 0x0d, 0x79, 0x73, 0xdb, 0x6c, 0x1c, 0x31, 0xf1, 0xb7, 0xa0, 0x93, 0x13, 0xeb,
1278
+	0x7a, 0x4c, 0xfa, 0xb6, 0x0d, 0xf6, 0x44, 0x55, 0xe5, 0x3f, 0x91, 0xb1, 0x28, 0x72, 0x3e, 0xd0,
1279
+	0x15, 0xc2, 0x32, 0x55, 0x73, 0x7f, 0x2b, 0xab, 0xac, 0x6c, 0x0c, 0x5d, 0x15, 0xc8, 0x2c, 0x3f,
1280
+	0x83, 0x2d, 0x69, 0x54, 0xef, 0x63, 0x02, 0xf9, 0x5c, 0x5e, 0xb3, 0xea, 0x56, 0xbc, 0x98, 0xd7,
1281
+	0x91, 0xc5, 0x8b, 0xa2, 0xe5, 0xa9, 0xe5, 0xb3, 0x40, 0xd2, 0xaf, 0x49, 0x38, 0x2d, 0xc2, 0xfd,
1282
+	0x09, 0x34, 0x70, 0x1e, 0x48, 0x49, 0x3b, 0x34, 0xcc, 0x60, 0x96, 0x24, 0x98, 0x5f, 0x99, 0x61,
1283
+	0x18, 0x54, 0xf3, 0x82, 0x6e, 0x97, 0x6c, 0x0c, 0x02, 0xdc, 0x08, 0x80, 0xd2, 0x5c, 0x4b, 0x43,
1284
+	0x1a, 0x3b, 0x04, 0x08, 0x50, 0x71, 0x36, 0xf5, 0xe7, 0xc6, 0xf5, 0x3a, 0xce, 0x10, 0x41, 0x17,
1285
+	0x44, 0x81, 0x6f, 0xfd, 0x60, 0x32, 0xe0, 0x6f, 0x5f, 0x14, 0xc8, 0x60, 0x2e, 0xb0, 0x6a, 0x0b,
1286
+	0xfc, 0x4b, 0x19, 0x9a, 0x24, 0x91, 0x14, 0x46, 0xaa, 0x01, 0x36, 0x16, 0x23, 0x52, 0x03, 0xd8,
1287
+	0xfa, 0x6b, 0xb9, 0xb8, 0x7c, 0x0c, 0xcc, 0x55, 0xcd, 0x74, 0xc3, 0x46, 0x97, 0x62, 0xed, 0xb3,
1288
+	0xac, 0xb3, 0x92, 0xba, 0xa1, 0x88, 0x48, 0xe1, 0x0f, 0xa1, 0x45, 0xf1, 0xc9, 0x67, 0xaa, 0xeb,
1289
+	0xce, 0x34, 0x89, 0x8c, 0x4e, 0x3d, 0x55, 0xd3, 0x16, 0xea, 0xab, 0xbb, 0x7b, 0x73, 0xff, 0x41,
1290
+	0x81, 0x5c, 0xdf, 0x64, 0x4f, 0xff, 0xbe, 0x0c, 0x25, 0x96, 0x59, 0xa2, 0xed, 0x3d, 0x03, 0xc8,
1291
+	0x91, 0xaa, 0x66, 0x9d, 0x8b, 0xab, 0x6c, 0xaa, 0xc4, 0xa5, 0xba, 0xfb, 0x85, 0x3f, 0x99, 0x65,
1292
+	0x46, 0x25, 0xe0, 0xc7, 0xe5, 0x67, 0x25, 0x77, 0x00, 0x5b, 0xcf, 0x55, 0xcf, 0xb2, 0x8e, 0x17,
1293
+	0x9e, 0x6c, 0xaa, 0x2b, 0x9f, 0x6c, 0xaa, 0xd9, 0x93, 0x0d, 0x96, 0xd1, 0x28, 0xe6, 0x0e, 0x8b,
1294
+	0xab, 0x5c, 0x50, 0xd5, 0x12, 0xe4, 0xfe, 0xb3, 0x0a, 0x90, 0x4b, 0x71, 0x8e, 0xa1, 0x17, 0x44,
1295
+	0x7d, 0xd5, 0x20, 0x82, 0x81, 0xa0, 0x82, 0xd4, 0x4f, 0x04, 0x86, 0x4f, 0x1a, 0x5c, 0x08, 0x9e,
1296
+	0x21, 0xee, 0xf1, 0xbd, 0x17, 0x94, 0xf3, 0x76, 0x11, 0xa2, 0x83, 0xba, 0x72, 0x79, 0xd9, 0x31,
1297
+	0xe7, 0x97, 0x70, 0x37, 0x67, 0x3a, 0xb4, 0xf8, 0x95, 0xaf, 0xe5, 0x77, 0xdb, 0xf0, 0x1b, 0xe6,
1298
+	0xbc, 0x7e, 0x0e, 0x88, 0xee, 0x63, 0x8f, 0x99, 0x15, 0x38, 0x55, 0xae, 0xe5, 0xb4, 0x13, 0x44,
1299
+	0x6f, 0xf4, 0x89, 0x9c, 0xcf, 0x1b, 0xb8, 0x6f, 0x5d, 0x54, 0xa5, 0xbd, 0xc5, 0xad, 0x7a, 0x2d,
1300
+	0xb7, 0x7b, 0x46, 0x2f, 0x55, 0x18, 0x72, 0x96, 0x9f, 0x02, 0xee, 0xf4, 0x2f, 0xfd, 0x40, 0x2e,
1301
+	0xf2, 0xab, 0xdd, 0x74, 0xcf, 0xcf, 0xf1, 0x50, 0x91, 0x19, 0xdd, 0x73, 0x2a, 0x92, 0x51, 0xe1,
1302
+	0x9e, 0xf5, 0x9b, 0xee, 0x79, 0xa8, 0x4f, 0xe4, 0x7c, 0x9e, 0x03, 0x22, 0x17, 0xf5, 0xd9, 0xb8,
1303
+	0x96, 0xcb, 0x56, 0x10, 0x15, 0x75, 0x39, 0x80, 0x9d, 0x54, 0x0c, 0x24, 0x76, 0x14, 0x8b, 0xc7,
1304
+	0xe6, 0xb5, 0x3c, 0xb6, 0xf9, 0x80, 0x61, 0xe2, 0x7e, 0x01, 0xad, 0x5f, 0xcc, 0x46, 0x42, 0x4e,
1305
+	0xce, 0x4c, 0xce, 0xff, 0xaf, 0xcb, 0xcc, 0xbf, 0xb1, 0xcc, 0x1c, 0x8c, 0x92, 0x68, 0x16, 0x17,
1306
+	0xaa, 0x36, 0xe5, 0xf0, 0x52, 0xd5, 0xd6, 0x34, 0xba, 0x6a, 0x13, 0xf5, 0x47, 0xd0, 0xa2, 0x81,
1307
+	0x89, 0x0f, 0x50, 0x15, 0x72, 0x96, 0x93, 0x3e, 0x1b, 0xd0, 0xe8, 0xd8, 0x3e, 0x0f, 0x9f, 0x7c,
1308
+	0xaa, 0x58, 0x8d, 0x72, 0x33, 0xe1, 0xd7, 0x47, 0x9e, 0x75, 0xaf, 0xa0, 0x3d, 0x26, 0xdb, 0xf0,
1309
+	0x29, 0x0a, 0xc0, 0x6f, 0x66, 0xca, 0xe5, 0x77, 0xd8, 0xb3, 0x6d, 0x48, 0xa6, 0x6e, 0x8d, 0x6d,
1310
+	0xb3, 0xfe, 0x00, 0x40, 0x7d, 0x5e, 0xf4, 0xb3, 0x42, 0x65, 0xbf, 0xe7, 0x99, 0x0e, 0x81, 0xdf,
1311
+	0x32, 0xd9, 0xb2, 0x77, 0x02, 0x3b, 0x4b, 0x3c, 0x57, 0x94, 0xa9, 0xef, 0xd8, 0x65, 0xaa, 0xb9,
1312
+	0x7f, 0x9b, 0x59, 0xda, 0x47, 0xed, 0xda, 0xf5, 0xe7, 0x12, 0x7d, 0x8d, 0x98, 0x27, 0x17, 0xe7,
1313
+	0x19, 0xb4, 0x43, 0x1a, 0xbe, 0x8c, 0x03, 0x2a, 0x16, 0x23, 0x7b, 0x30, 0xf3, 0x5a, 0xa1, 0x3d,
1314
+	0xa6, 0xa1, 0x23, 0x06, 0xda, 0x02, 0x2b, 0x1d, 0x61, 0x19, 0xc7, 0x6b, 0x0e, 0x2c, 0x6f, 0x17,
1315
+	0x86, 0xc1, 0xca, 0xe2, 0x30, 0xc8, 0x8f, 0x06, 0xeb, 0xde, 0x18, 0xf7, 0xff, 0x55, 0x87, 0xca,
1316
+	0xc7, 0x47, 0xaf, 0x9c, 0x53, 0xd8, 0x5e, 0x7c, 0x40, 0x77, 0x1e, 0xb2, 0xe8, 0x35, 0x8f, 0xee,
1317
+	0xbd, 0xf7, 0xd6, 0xee, 0xf3, 0xb4, 0x7c, 0xcb, 0xf1, 0x60, 0x6b, 0xe1, 0x41, 0xd6, 0xc9, 0xda,
1318
+	0xc9, 0xea, 0x27, 0xe9, 0xde, 0xc3, 0x75, 0xdb, 0x36, 0xcf, 0x85, 0xf1, 0xdc, 0xf0, 0x5c, 0xfd,
1319
+	0xa9, 0x66, 0x78, 0xae, 0x9b, 0xea, 0x6f, 0x39, 0x3f, 0x82, 0x3a, 0x3d, 0xd1, 0x3a, 0x77, 0x98,
1320
+	0xb6, 0xf0, 0xf8, 0xdb, 0xbb, 0xbb, 0x80, 0x35, 0x07, 0x5f, 0x43, 0xbb, 0xf0, 0xea, 0xee, 0xbc,
1321
+	0x53, 0x90, 0x55, 0x7c, 0xe1, 0xed, 0xbd, 0xbb, 0x7a, 0xd3, 0x70, 0x3b, 0x00, 0xc8, 0x5f, 0xf1,
1322
+	0x9c, 0x2e, 0x53, 0x2f, 0xbd, 0x14, 0xf7, 0xee, 0xaf, 0xd8, 0x31, 0x4c, 0xd0, 0x95, 0x8b, 0xcf,
1323
+	0x72, 0xce, 0x82, 0x55, 0x17, 0x9f, 0xce, 0x8c, 0x2b, 0xd7, 0xbe, 0xe7, 0x69, 0xb6, 0x8b, 0x4f,
1324
+	0x72, 0x86, 0xed, 0x9a, 0xa7, 0x3e, 0xc3, 0x76, 0xed, 0x5b, 0xde, 0x2d, 0xe7, 0x57, 0xd0, 0x29,
1325
+	0x3e, 0x92, 0x39, 0x99, 0x91, 0x56, 0x3e, 0xf2, 0xf5, 0x1e, 0xac, 0xd9, 0x35, 0x0c, 0x3f, 0x84,
1326
+	0x1a, 0xbd, 0x7e, 0x65, 0x29, 0x67, 0x3f, 0x9a, 0xf5, 0xee, 0x14, 0x91, 0xe6, 0xd4, 0x13, 0xa8,
1327
+	0xd3, 0x87, 0x9d, 0x09, 0x80, 0xc2, 0x77, 0x5e, 0xaf, 0x65, 0x63, 0xdd, 0x5b, 0x4f, 0x4a, 0x99,
1328
+	0x9c, 0xb4, 0x20, 0x27, 0x5d, 0x25, 0xc7, 0x72, 0xce, 0x59, 0x5d, 0xff, 0xa3, 0xf5, 0xf4, 0x3f,
1329
+	0x01, 0x00, 0x00, 0xff, 0xff, 0xf0, 0xa3, 0xf6, 0xb8, 0xde, 0x1a, 0x00, 0x00,
1326 1330
 }
... ...
@@ -3,6 +3,7 @@ syntax = "proto3";
3 3
 package types;
4 4
 
5 5
 service API {
6
+	rpc GetServerVersion(GetServerVersionRequest) returns (GetServerVersionResponse) {}
6 7
 	rpc CreateContainer(CreateContainerRequest) returns (CreateContainerResponse) {}
7 8
 	rpc UpdateContainer(UpdateContainerRequest) returns (UpdateContainerResponse) {}
8 9
 	rpc Signal(SignalRequest) returns (SignalResponse) {}
... ...
@@ -16,6 +17,16 @@ service API {
16 16
 	rpc Stats(StatsRequest) returns (StatsResponse) {}
17 17
 }
18 18
 
19
+message GetServerVersionRequest {
20
+}
21
+
22
+message GetServerVersionResponse {
23
+	uint32 major = 1;
24
+	uint32 minor = 2;
25
+	uint32 patch = 3;
26
+	string revision = 4;
27
+}
28
+
19 29
 message UpdateProcessRequest {
20 30
 	string id = 1;
21 31
 	string pid = 2;
... ...
@@ -39,5 +39,5 @@ test: install generate-test-pbs
39 39
 generate-test-pbs:
40 40
 	make install
41 41
 	make -C testdata
42
-	protoc --go_out=Mtestdata/test.proto=github.com/golang/protobuf/proto/testdata:. proto3_proto/proto3.proto
42
+	protoc --go_out=Mtestdata/test.proto=github.com/golang/protobuf/proto/testdata,Mgoogle/protobuf/any.proto=github.com/golang/protobuf/ptypes/any:. proto3_proto/proto3.proto
43 43
 	make
... ...
@@ -768,10 +768,11 @@ func (o *Buffer) dec_new_map(p *Properties, base structPointer) error {
768 768
 		}
769 769
 	}
770 770
 	keyelem, valelem := keyptr.Elem(), valptr.Elem()
771
-	if !keyelem.IsValid() || !valelem.IsValid() {
772
-		// We did not decode the key or the value in the map entry.
773
-		// Either way, it's an invalid map entry.
774
-		return fmt.Errorf("proto: bad map data: missing key/val")
771
+	if !keyelem.IsValid() {
772
+		keyelem = reflect.Zero(p.mtype.Key())
773
+	}
774
+	if !valelem.IsValid() {
775
+		valelem = reflect.Zero(p.mtype.Elem())
775 776
 	}
776 777
 
777 778
 	v.SetMapIndex(keyelem, valelem)
... ...
@@ -64,6 +64,10 @@ var (
64 64
 	// a struct with a repeated field containing a nil element.
65 65
 	errRepeatedHasNil = errors.New("proto: repeated field has nil element")
66 66
 
67
+	// errOneofHasNil is the error returned if Marshal is called with
68
+	// a struct with a oneof field containing a nil element.
69
+	errOneofHasNil = errors.New("proto: oneof field has nil value")
70
+
67 71
 	// ErrNil is the error returned if Marshal is called with nil.
68 72
 	ErrNil = errors.New("proto: Marshal called with nil")
69 73
 )
... ...
@@ -1222,7 +1226,9 @@ func (o *Buffer) enc_struct(prop *StructProperties, base structPointer) error {
1222 1222
 	// Do oneof fields.
1223 1223
 	if prop.oneofMarshaler != nil {
1224 1224
 		m := structPointer_Interface(base, prop.stype).(Message)
1225
-		if err := prop.oneofMarshaler(m, o); err != nil {
1225
+		if err := prop.oneofMarshaler(m, o); err == ErrNil {
1226
+			return errOneofHasNil
1227
+		} else if err != nil {
1226 1228
 			return err
1227 1229
 		}
1228 1230
 	}
... ...
@@ -50,7 +50,9 @@ Equality is defined in this way:
50 50
     are equal, and extensions sets are equal.
51 51
   - Two set scalar fields are equal iff their values are equal.
52 52
     If the fields are of a floating-point type, remember that
53
-    NaN != x for all x, including NaN.
53
+    NaN != x for all x, including NaN. If the message is defined
54
+    in a proto3 .proto file, fields are not "set"; specifically,
55
+    zero length proto3 "bytes" fields are equal (nil == {}).
54 56
   - Two repeated fields are equal iff their lengths are the same,
55 57
     and their corresponding elements are equal (a "bytes" field,
56 58
     although represented by []byte, is not a repeated field)
... ...
@@ -88,6 +90,7 @@ func Equal(a, b Message) bool {
88 88
 
89 89
 // v1 and v2 are known to have the same type.
90 90
 func equalStruct(v1, v2 reflect.Value) bool {
91
+	sprop := GetProperties(v1.Type())
91 92
 	for i := 0; i < v1.NumField(); i++ {
92 93
 		f := v1.Type().Field(i)
93 94
 		if strings.HasPrefix(f.Name, "XXX_") {
... ...
@@ -113,7 +116,7 @@ func equalStruct(v1, v2 reflect.Value) bool {
113 113
 			}
114 114
 			f1, f2 = f1.Elem(), f2.Elem()
115 115
 		}
116
-		if !equalAny(f1, f2) {
116
+		if !equalAny(f1, f2, sprop.Prop[i]) {
117 117
 			return false
118 118
 		}
119 119
 	}
... ...
@@ -140,7 +143,8 @@ func equalStruct(v1, v2 reflect.Value) bool {
140 140
 }
141 141
 
142 142
 // v1 and v2 are known to have the same type.
143
-func equalAny(v1, v2 reflect.Value) bool {
143
+// prop may be nil.
144
+func equalAny(v1, v2 reflect.Value, prop *Properties) bool {
144 145
 	if v1.Type() == protoMessageType {
145 146
 		m1, _ := v1.Interface().(Message)
146 147
 		m2, _ := v2.Interface().(Message)
... ...
@@ -163,7 +167,7 @@ func equalAny(v1, v2 reflect.Value) bool {
163 163
 		if e1.Type() != e2.Type() {
164 164
 			return false
165 165
 		}
166
-		return equalAny(e1, e2)
166
+		return equalAny(e1, e2, nil)
167 167
 	case reflect.Map:
168 168
 		if v1.Len() != v2.Len() {
169 169
 			return false
... ...
@@ -174,16 +178,22 @@ func equalAny(v1, v2 reflect.Value) bool {
174 174
 				// This key was not found in the second map.
175 175
 				return false
176 176
 			}
177
-			if !equalAny(v1.MapIndex(key), val2) {
177
+			if !equalAny(v1.MapIndex(key), val2, nil) {
178 178
 				return false
179 179
 			}
180 180
 		}
181 181
 		return true
182 182
 	case reflect.Ptr:
183
-		return equalAny(v1.Elem(), v2.Elem())
183
+		return equalAny(v1.Elem(), v2.Elem(), prop)
184 184
 	case reflect.Slice:
185 185
 		if v1.Type().Elem().Kind() == reflect.Uint8 {
186 186
 			// short circuit: []byte
187
+
188
+			// Edge case: if this is in a proto3 message, a zero length
189
+			// bytes field is considered the zero value.
190
+			if prop != nil && prop.proto3 && v1.Len() == 0 && v2.Len() == 0 {
191
+				return true
192
+			}
187 193
 			if v1.IsNil() != v2.IsNil() {
188 194
 				return false
189 195
 			}
... ...
@@ -194,7 +204,7 @@ func equalAny(v1, v2 reflect.Value) bool {
194 194
 			return false
195 195
 		}
196 196
 		for i := 0; i < v1.Len(); i++ {
197
-			if !equalAny(v1.Index(i), v2.Index(i)) {
197
+			if !equalAny(v1.Index(i), v2.Index(i), prop) {
198 198
 				return false
199 199
 			}
200 200
 		}
... ...
@@ -229,7 +239,7 @@ func equalExtensions(base reflect.Type, em1, em2 map[int32]Extension) bool {
229 229
 
230 230
 		if m1 != nil && m2 != nil {
231 231
 			// Both are unencoded.
232
-			if !equalAny(reflect.ValueOf(m1), reflect.ValueOf(m2)) {
232
+			if !equalAny(reflect.ValueOf(m1), reflect.ValueOf(m2), nil) {
233 233
 				return false
234 234
 			}
235 235
 			continue
... ...
@@ -257,7 +267,7 @@ func equalExtensions(base reflect.Type, em1, em2 map[int32]Extension) bool {
257 257
 			log.Printf("proto: badly encoded extension %d of %v: %v", extNum, base, err)
258 258
 			return false
259 259
 		}
260
-		if !equalAny(reflect.ValueOf(m1), reflect.ValueOf(m2)) {
260
+		if !equalAny(reflect.ValueOf(m1), reflect.ValueOf(m2), nil) {
261 261
 			return false
262 262
 		}
263 263
 	}
... ...
@@ -70,6 +70,12 @@ for a protocol buffer variable v:
70 70
 	with distinguished wrapper types for each possible field value.
71 71
   - Marshal and Unmarshal are functions to encode and decode the wire format.
72 72
 
73
+When the .proto file specifies `syntax="proto3"`, there are some differences:
74
+
75
+  - Non-repeated fields of non-message type are values instead of pointers.
76
+  - Getters are only generated for message and oneof fields.
77
+  - Enum types do not get an Enum method.
78
+
73 79
 The simplest way to describe this is to see an example.
74 80
 Given file test.proto, containing
75 81
 
... ...
@@ -229,6 +235,7 @@ To create and play with a Test object:
229 229
 		test := &pb.Test{
230 230
 			Label: proto.String("hello"),
231 231
 			Type:  proto.Int32(17),
232
+			Reps:  []int64{1, 2, 3},
232 233
 			Optionalgroup: &pb.Test_OptionalGroup{
233 234
 				RequiredField: proto.String("good bye"),
234 235
 			},
... ...
@@ -881,3 +888,7 @@ func isProto3Zero(v reflect.Value) bool {
881 881
 	}
882 882
 	return false
883 883
 }
884
+
885
+// ProtoPackageIsVersion1 is referenced from generated protocol buffer files
886
+// to assert that that code is compatible with this version of the proto package.
887
+const ProtoPackageIsVersion1 = true
... ...
@@ -173,6 +173,7 @@ func (sp *StructProperties) Swap(i, j int) { sp.order[i], sp.order[j] = sp.order
173 173
 type Properties struct {
174 174
 	Name     string // name of the field, for error messages
175 175
 	OrigName string // original name before protocol compiler (always set)
176
+	JSONName string // name to use for JSON; determined by protoc
176 177
 	Wire     string
177 178
 	WireType int
178 179
 	Tag      int
... ...
@@ -229,8 +230,9 @@ func (p *Properties) String() string {
229 229
 	if p.Packed {
230 230
 		s += ",packed"
231 231
 	}
232
-	if p.OrigName != p.Name {
233
-		s += ",name=" + p.OrigName
232
+	s += ",name=" + p.OrigName
233
+	if p.JSONName != p.OrigName {
234
+		s += ",json=" + p.JSONName
234 235
 	}
235 236
 	if p.proto3 {
236 237
 		s += ",proto3"
... ...
@@ -310,6 +312,8 @@ func (p *Properties) Parse(s string) {
310 310
 			p.Packed = true
311 311
 		case strings.HasPrefix(f, "name="):
312 312
 			p.OrigName = f[5:]
313
+		case strings.HasPrefix(f, "json="):
314
+			p.JSONName = f[5:]
313 315
 		case strings.HasPrefix(f, "enum="):
314 316
 			p.Enum = f[5:]
315 317
 		case f == "proto3":
... ...
@@ -175,7 +175,93 @@ type raw interface {
175 175
 	Bytes() []byte
176 176
 }
177 177
 
178
-func writeStruct(w *textWriter, sv reflect.Value) error {
178
+func requiresQuotes(u string) bool {
179
+	// When type URL contains any characters except [0-9A-Za-z./\-]*, it must be quoted.
180
+	for _, ch := range u {
181
+		switch {
182
+		case ch == '.' || ch == '/' || ch == '_':
183
+			continue
184
+		case '0' <= ch && ch <= '9':
185
+			continue
186
+		case 'A' <= ch && ch <= 'Z':
187
+			continue
188
+		case 'a' <= ch && ch <= 'z':
189
+			continue
190
+		default:
191
+			return true
192
+		}
193
+	}
194
+	return false
195
+}
196
+
197
+// isAny reports whether sv is a google.protobuf.Any message
198
+func isAny(sv reflect.Value) bool {
199
+	type wkt interface {
200
+		XXX_WellKnownType() string
201
+	}
202
+	t, ok := sv.Addr().Interface().(wkt)
203
+	return ok && t.XXX_WellKnownType() == "Any"
204
+}
205
+
206
+// writeProto3Any writes an expanded google.protobuf.Any message.
207
+//
208
+// It returns (false, nil) if sv value can't be unmarshaled (e.g. because
209
+// required messages are not linked in).
210
+//
211
+// It returns (true, error) when sv was written in expanded format or an error
212
+// was encountered.
213
+func (tm *TextMarshaler) writeProto3Any(w *textWriter, sv reflect.Value) (bool, error) {
214
+	turl := sv.FieldByName("TypeUrl")
215
+	val := sv.FieldByName("Value")
216
+	if !turl.IsValid() || !val.IsValid() {
217
+		return true, errors.New("proto: invalid google.protobuf.Any message")
218
+	}
219
+
220
+	b, ok := val.Interface().([]byte)
221
+	if !ok {
222
+		return true, errors.New("proto: invalid google.protobuf.Any message")
223
+	}
224
+
225
+	parts := strings.Split(turl.String(), "/")
226
+	mt := MessageType(parts[len(parts)-1])
227
+	if mt == nil {
228
+		return false, nil
229
+	}
230
+	m := reflect.New(mt.Elem())
231
+	if err := Unmarshal(b, m.Interface().(Message)); err != nil {
232
+		return false, nil
233
+	}
234
+	w.Write([]byte("["))
235
+	u := turl.String()
236
+	if requiresQuotes(u) {
237
+		writeString(w, u)
238
+	} else {
239
+		w.Write([]byte(u))
240
+	}
241
+	if w.compact {
242
+		w.Write([]byte("]:<"))
243
+	} else {
244
+		w.Write([]byte("]: <\n"))
245
+		w.ind++
246
+	}
247
+	if err := tm.writeStruct(w, m.Elem()); err != nil {
248
+		return true, err
249
+	}
250
+	if w.compact {
251
+		w.Write([]byte("> "))
252
+	} else {
253
+		w.ind--
254
+		w.Write([]byte(">\n"))
255
+	}
256
+	return true, nil
257
+}
258
+
259
+func (tm *TextMarshaler) writeStruct(w *textWriter, sv reflect.Value) error {
260
+	if tm.ExpandAny && isAny(sv) {
261
+		if canExpand, err := tm.writeProto3Any(w, sv); canExpand {
262
+			return err
263
+		}
264
+	}
179 265
 	st := sv.Type()
180 266
 	sprops := GetProperties(st)
181 267
 	for i := 0; i < sv.NumField(); i++ {
... ...
@@ -227,7 +313,7 @@ func writeStruct(w *textWriter, sv reflect.Value) error {
227 227
 					}
228 228
 					continue
229 229
 				}
230
-				if err := writeAny(w, v, props); err != nil {
230
+				if err := tm.writeAny(w, v, props); err != nil {
231 231
 					return err
232 232
 				}
233 233
 				if err := w.WriteByte('\n'); err != nil {
... ...
@@ -269,7 +355,7 @@ func writeStruct(w *textWriter, sv reflect.Value) error {
269 269
 						return err
270 270
 					}
271 271
 				}
272
-				if err := writeAny(w, key, props.mkeyprop); err != nil {
272
+				if err := tm.writeAny(w, key, props.mkeyprop); err != nil {
273 273
 					return err
274 274
 				}
275 275
 				if err := w.WriteByte('\n'); err != nil {
... ...
@@ -286,7 +372,7 @@ func writeStruct(w *textWriter, sv reflect.Value) error {
286 286
 							return err
287 287
 						}
288 288
 					}
289
-					if err := writeAny(w, val, props.mvalprop); err != nil {
289
+					if err := tm.writeAny(w, val, props.mvalprop); err != nil {
290 290
 						return err
291 291
 					}
292 292
 					if err := w.WriteByte('\n'); err != nil {
... ...
@@ -358,7 +444,7 @@ func writeStruct(w *textWriter, sv reflect.Value) error {
358 358
 		}
359 359
 
360 360
 		// Enums have a String method, so writeAny will work fine.
361
-		if err := writeAny(w, fv, props); err != nil {
361
+		if err := tm.writeAny(w, fv, props); err != nil {
362 362
 			return err
363 363
 		}
364 364
 
... ...
@@ -370,7 +456,7 @@ func writeStruct(w *textWriter, sv reflect.Value) error {
370 370
 	// Extensions (the XXX_extensions field).
371 371
 	pv := sv.Addr()
372 372
 	if pv.Type().Implements(extendableProtoType) {
373
-		if err := writeExtensions(w, pv); err != nil {
373
+		if err := tm.writeExtensions(w, pv); err != nil {
374 374
 			return err
375 375
 		}
376 376
 	}
... ...
@@ -400,7 +486,7 @@ func writeRaw(w *textWriter, b []byte) error {
400 400
 }
401 401
 
402 402
 // writeAny writes an arbitrary field.
403
-func writeAny(w *textWriter, v reflect.Value, props *Properties) error {
403
+func (tm *TextMarshaler) writeAny(w *textWriter, v reflect.Value, props *Properties) error {
404 404
 	v = reflect.Indirect(v)
405 405
 
406 406
 	// Floats have special cases.
... ...
@@ -449,15 +535,15 @@ func writeAny(w *textWriter, v reflect.Value, props *Properties) error {
449 449
 			}
450 450
 		}
451 451
 		w.indent()
452
-		if tm, ok := v.Interface().(encoding.TextMarshaler); ok {
453
-			text, err := tm.MarshalText()
452
+		if etm, ok := v.Interface().(encoding.TextMarshaler); ok {
453
+			text, err := etm.MarshalText()
454 454
 			if err != nil {
455 455
 				return err
456 456
 			}
457 457
 			if _, err = w.Write(text); err != nil {
458 458
 				return err
459 459
 			}
460
-		} else if err := writeStruct(w, v); err != nil {
460
+		} else if err := tm.writeStruct(w, v); err != nil {
461 461
 			return err
462 462
 		}
463 463
 		w.unindent()
... ...
@@ -601,7 +687,7 @@ func (s int32Slice) Swap(i, j int)      { s[i], s[j] = s[j], s[i] }
601 601
 
602 602
 // writeExtensions writes all the extensions in pv.
603 603
 // pv is assumed to be a pointer to a protocol message struct that is extendable.
604
-func writeExtensions(w *textWriter, pv reflect.Value) error {
604
+func (tm *TextMarshaler) writeExtensions(w *textWriter, pv reflect.Value) error {
605 605
 	emap := extensionMaps[pv.Type().Elem()]
606 606
 	ep := pv.Interface().(extendableProto)
607 607
 
... ...
@@ -636,13 +722,13 @@ func writeExtensions(w *textWriter, pv reflect.Value) error {
636 636
 
637 637
 		// Repeated extensions will appear as a slice.
638 638
 		if !desc.repeated() {
639
-			if err := writeExtension(w, desc.Name, pb); err != nil {
639
+			if err := tm.writeExtension(w, desc.Name, pb); err != nil {
640 640
 				return err
641 641
 			}
642 642
 		} else {
643 643
 			v := reflect.ValueOf(pb)
644 644
 			for i := 0; i < v.Len(); i++ {
645
-				if err := writeExtension(w, desc.Name, v.Index(i).Interface()); err != nil {
645
+				if err := tm.writeExtension(w, desc.Name, v.Index(i).Interface()); err != nil {
646 646
 					return err
647 647
 				}
648 648
 			}
... ...
@@ -651,7 +737,7 @@ func writeExtensions(w *textWriter, pv reflect.Value) error {
651 651
 	return nil
652 652
 }
653 653
 
654
-func writeExtension(w *textWriter, name string, pb interface{}) error {
654
+func (tm *TextMarshaler) writeExtension(w *textWriter, name string, pb interface{}) error {
655 655
 	if _, err := fmt.Fprintf(w, "[%s]:", name); err != nil {
656 656
 		return err
657 657
 	}
... ...
@@ -660,7 +746,7 @@ func writeExtension(w *textWriter, name string, pb interface{}) error {
660 660
 			return err
661 661
 		}
662 662
 	}
663
-	if err := writeAny(w, reflect.ValueOf(pb), nil); err != nil {
663
+	if err := tm.writeAny(w, reflect.ValueOf(pb), nil); err != nil {
664 664
 		return err
665 665
 	}
666 666
 	if err := w.WriteByte('\n'); err != nil {
... ...
@@ -685,7 +771,15 @@ func (w *textWriter) writeIndent() {
685 685
 	w.complete = false
686 686
 }
687 687
 
688
-func marshalText(w io.Writer, pb Message, compact bool) error {
688
+// TextMarshaler is a configurable text format marshaler.
689
+type TextMarshaler struct {
690
+	Compact   bool // use compact text format (one line).
691
+	ExpandAny bool // expand google.protobuf.Any messages of known types
692
+}
693
+
694
+// Marshal writes a given protocol buffer in text format.
695
+// The only errors returned are from w.
696
+func (tm *TextMarshaler) Marshal(w io.Writer, pb Message) error {
689 697
 	val := reflect.ValueOf(pb)
690 698
 	if pb == nil || val.IsNil() {
691 699
 		w.Write([]byte("<nil>"))
... ...
@@ -700,11 +794,11 @@ func marshalText(w io.Writer, pb Message, compact bool) error {
700 700
 	aw := &textWriter{
701 701
 		w:        ww,
702 702
 		complete: true,
703
-		compact:  compact,
703
+		compact:  tm.Compact,
704 704
 	}
705 705
 
706
-	if tm, ok := pb.(encoding.TextMarshaler); ok {
707
-		text, err := tm.MarshalText()
706
+	if etm, ok := pb.(encoding.TextMarshaler); ok {
707
+		text, err := etm.MarshalText()
708 708
 		if err != nil {
709 709
 			return err
710 710
 		}
... ...
@@ -718,7 +812,7 @@ func marshalText(w io.Writer, pb Message, compact bool) error {
718 718
 	}
719 719
 	// Dereference the received pointer so we don't have outer < and >.
720 720
 	v := reflect.Indirect(val)
721
-	if err := writeStruct(aw, v); err != nil {
721
+	if err := tm.writeStruct(aw, v); err != nil {
722 722
 		return err
723 723
 	}
724 724
 	if bw != nil {
... ...
@@ -727,25 +821,29 @@ func marshalText(w io.Writer, pb Message, compact bool) error {
727 727
 	return nil
728 728
 }
729 729
 
730
+// Text is the same as Marshal, but returns the string directly.
731
+func (tm *TextMarshaler) Text(pb Message) string {
732
+	var buf bytes.Buffer
733
+	tm.Marshal(&buf, pb)
734
+	return buf.String()
735
+}
736
+
737
+var (
738
+	defaultTextMarshaler = TextMarshaler{}
739
+	compactTextMarshaler = TextMarshaler{Compact: true}
740
+)
741
+
742
+// TODO: consider removing some of the Marshal functions below.
743
+
730 744
 // MarshalText writes a given protocol buffer in text format.
731 745
 // The only errors returned are from w.
732
-func MarshalText(w io.Writer, pb Message) error {
733
-	return marshalText(w, pb, false)
734
-}
746
+func MarshalText(w io.Writer, pb Message) error { return defaultTextMarshaler.Marshal(w, pb) }
735 747
 
736 748
 // MarshalTextString is the same as MarshalText, but returns the string directly.
737
-func MarshalTextString(pb Message) string {
738
-	var buf bytes.Buffer
739
-	marshalText(&buf, pb, false)
740
-	return buf.String()
741
-}
749
+func MarshalTextString(pb Message) string { return defaultTextMarshaler.Text(pb) }
742 750
 
743 751
 // CompactText writes a given protocol buffer in compact text format (one line).
744
-func CompactText(w io.Writer, pb Message) error { return marshalText(w, pb, true) }
752
+func CompactText(w io.Writer, pb Message) error { return compactTextMarshaler.Marshal(w, pb) }
745 753
 
746 754
 // CompactTextString is the same as CompactText, but returns the string directly.
747
-func CompactTextString(pb Message) string {
748
-	var buf bytes.Buffer
749
-	marshalText(&buf, pb, true)
750
-	return buf.String()
751
-}
755
+func CompactTextString(pb Message) string { return compactTextMarshaler.Text(pb) }
... ...
@@ -119,6 +119,14 @@ func isWhitespace(c byte) bool {
119 119
 	return false
120 120
 }
121 121
 
122
+func isQuote(c byte) bool {
123
+	switch c {
124
+	case '"', '\'':
125
+		return true
126
+	}
127
+	return false
128
+}
129
+
122 130
 func (p *textParser) skipWhitespace() {
123 131
 	i := 0
124 132
 	for i < len(p.s) && (isWhitespace(p.s[i]) || p.s[i] == '#') {
... ...
@@ -155,7 +163,7 @@ func (p *textParser) advance() {
155 155
 	p.cur.offset, p.cur.line = p.offset, p.line
156 156
 	p.cur.unquoted = ""
157 157
 	switch p.s[0] {
158
-	case '<', '>', '{', '}', ':', '[', ']', ';', ',':
158
+	case '<', '>', '{', '}', ':', '[', ']', ';', ',', '/':
159 159
 		// Single symbol
160 160
 		p.cur.value, p.s = p.s[0:1], p.s[1:len(p.s)]
161 161
 	case '"', '\'':
... ...
@@ -333,13 +341,13 @@ func (p *textParser) next() *token {
333 333
 	p.advance()
334 334
 	if p.done {
335 335
 		p.cur.value = ""
336
-	} else if len(p.cur.value) > 0 && p.cur.value[0] == '"' {
336
+	} else if len(p.cur.value) > 0 && isQuote(p.cur.value[0]) {
337 337
 		// Look for multiple quoted strings separated by whitespace,
338 338
 		// and concatenate them.
339 339
 		cat := p.cur
340 340
 		for {
341 341
 			p.skipWhitespace()
342
-			if p.done || p.s[0] != '"' {
342
+			if p.done || !isQuote(p.s[0]) {
343 343
 				break
344 344
 			}
345 345
 			p.advance()
... ...
@@ -443,7 +451,10 @@ func (p *textParser) readStruct(sv reflect.Value, terminator string) error {
443 443
 	fieldSet := make(map[string]bool)
444 444
 	// A struct is a sequence of "name: value", terminated by one of
445 445
 	// '>' or '}', or the end of the input.  A name may also be
446
-	// "[extension]".
446
+	// "[extension]" or "[type/url]".
447
+	//
448
+	// The whole struct can also be an expanded Any message, like:
449
+	// [type/url] < ... struct contents ... >
447 450
 	for {
448 451
 		tok := p.next()
449 452
 		if tok.err != nil {
... ...
@@ -453,33 +464,66 @@ func (p *textParser) readStruct(sv reflect.Value, terminator string) error {
453 453
 			break
454 454
 		}
455 455
 		if tok.value == "[" {
456
-			// Looks like an extension.
456
+			// Looks like an extension or an Any.
457 457
 			//
458 458
 			// TODO: Check whether we need to handle
459 459
 			// namespace rooted names (e.g. ".something.Foo").
460
-			tok = p.next()
461
-			if tok.err != nil {
462
-				return tok.err
460
+			extName, err := p.consumeExtName()
461
+			if err != nil {
462
+				return err
463
+			}
464
+
465
+			if s := strings.LastIndex(extName, "/"); s >= 0 {
466
+				// If it contains a slash, it's an Any type URL.
467
+				messageName := extName[s+1:]
468
+				mt := MessageType(messageName)
469
+				if mt == nil {
470
+					return p.errorf("unrecognized message %q in google.protobuf.Any", messageName)
471
+				}
472
+				tok = p.next()
473
+				if tok.err != nil {
474
+					return tok.err
475
+				}
476
+				// consume an optional colon
477
+				if tok.value == ":" {
478
+					tok = p.next()
479
+					if tok.err != nil {
480
+						return tok.err
481
+					}
482
+				}
483
+				var terminator string
484
+				switch tok.value {
485
+				case "<":
486
+					terminator = ">"
487
+				case "{":
488
+					terminator = "}"
489
+				default:
490
+					return p.errorf("expected '{' or '<', found %q", tok.value)
491
+				}
492
+				v := reflect.New(mt.Elem())
493
+				if pe := p.readStruct(v.Elem(), terminator); pe != nil {
494
+					return pe
495
+				}
496
+				b, err := Marshal(v.Interface().(Message))
497
+				if err != nil {
498
+					return p.errorf("failed to marshal message of type %q: %v", messageName, err)
499
+				}
500
+				sv.FieldByName("TypeUrl").SetString(extName)
501
+				sv.FieldByName("Value").SetBytes(b)
502
+				continue
463 503
 			}
504
+
464 505
 			var desc *ExtensionDesc
465 506
 			// This could be faster, but it's functional.
466 507
 			// TODO: Do something smarter than a linear scan.
467 508
 			for _, d := range RegisteredExtensions(reflect.New(st).Interface().(Message)) {
468
-				if d.Name == tok.value {
509
+				if d.Name == extName {
469 510
 					desc = d
470 511
 					break
471 512
 				}
472 513
 			}
473 514
 			if desc == nil {
474
-				return p.errorf("unrecognized extension %q", tok.value)
475
-			}
476
-			// Check the extension terminator.
477
-			tok = p.next()
478
-			if tok.err != nil {
479
-				return tok.err
480
-			}
481
-			if tok.value != "]" {
482
-				return p.errorf("unrecognized extension terminator %q", tok.value)
515
+				return p.errorf("unrecognized extension %q", extName)
483 516
 			}
484 517
 
485 518
 			props := &Properties{}
... ...
@@ -635,6 +679,35 @@ func (p *textParser) readStruct(sv reflect.Value, terminator string) error {
635 635
 	return reqFieldErr
636 636
 }
637 637
 
638
+// consumeExtName consumes extension name or expanded Any type URL and the
639
+// following ']'. It returns the name or URL consumed.
640
+func (p *textParser) consumeExtName() (string, error) {
641
+	tok := p.next()
642
+	if tok.err != nil {
643
+		return "", tok.err
644
+	}
645
+
646
+	// If extension name or type url is quoted, it's a single token.
647
+	if len(tok.value) > 2 && isQuote(tok.value[0]) && tok.value[len(tok.value)-1] == tok.value[0] {
648
+		name, err := unquoteC(tok.value[1:len(tok.value)-1], rune(tok.value[0]))
649
+		if err != nil {
650
+			return "", err
651
+		}
652
+		return name, p.consumeToken("]")
653
+	}
654
+
655
+	// Consume everything up to "]"
656
+	var parts []string
657
+	for tok.value != "]" {
658
+		parts = append(parts, tok.value)
659
+		tok = p.next()
660
+		if tok.err != nil {
661
+			return "", p.errorf("unrecognized type_url or extension name: %s", tok.err)
662
+		}
663
+	}
664
+	return strings.Join(parts, ""), nil
665
+}
666
+
638 667
 // consumeOptionalSeparator consumes an optional semicolon or comma.
639 668
 // It is used in readStruct to provide backward compatibility.
640 669
 func (p *textParser) consumeOptionalSeparator() error {
... ...
@@ -7,6 +7,7 @@ package apparmor
7 7
 // #include <stdlib.h>
8 8
 import "C"
9 9
 import (
10
+	"fmt"
10 11
 	"io/ioutil"
11 12
 	"os"
12 13
 	"unsafe"
... ...
@@ -32,7 +33,7 @@ func ApplyProfile(name string) error {
32 32
 	cName := C.CString(name)
33 33
 	defer C.free(unsafe.Pointer(cName))
34 34
 	if _, err := C.aa_change_onexec(cName); err != nil {
35
-		return err
35
+		return fmt.Errorf("apparmor failed to apply profile: %s", err)
36 36
 	}
37 37
 	return nil
38 38
 }
... ...
@@ -11,6 +11,7 @@ type ThrottlingData struct {
11 11
 	ThrottledTime uint64 `json:"throttled_time,omitempty"`
12 12
 }
13 13
 
14
+// CpuUsage denotes the usage of a CPU.
14 15
 // All CPU stats are aggregate since container inception.
15 16
 type CpuUsage struct {
16 17
 	// Total CPU time consumed.
... ...
@@ -18,11 +18,14 @@ import (
18 18
 
19 19
 const cgroupNamePrefix = "name="
20 20
 
21
-// https://www.kernel.org/doc/Documentation/cgroups/cgroups.txt
21
+// https://www.kernel.org/doc/Documentation/cgroup-v1/cgroups.txt
22 22
 func FindCgroupMountpoint(subsystem string) (string, error) {
23 23
 	// We are not using mount.GetMounts() because it's super-inefficient,
24 24
 	// parsing it directly sped up x10 times because of not using Sscanf.
25 25
 	// It was one of two major performance drawbacks in container start.
26
+	if !isSubsystemAvailable(subsystem) {
27
+		return "", NewNotFoundError(subsystem)
28
+	}
26 29
 	f, err := os.Open("/proc/self/mountinfo")
27 30
 	if err != nil {
28 31
 		return "", err
... ...
@@ -47,6 +50,9 @@ func FindCgroupMountpoint(subsystem string) (string, error) {
47 47
 }
48 48
 
49 49
 func FindCgroupMountpointAndRoot(subsystem string) (string, string, error) {
50
+	if !isSubsystemAvailable(subsystem) {
51
+		return "", "", NewNotFoundError(subsystem)
52
+	}
50 53
 	f, err := os.Open("/proc/self/mountinfo")
51 54
 	if err != nil {
52 55
 		return "", "", err
... ...
@@ -70,6 +76,15 @@ func FindCgroupMountpointAndRoot(subsystem string) (string, string, error) {
70 70
 	return "", "", NewNotFoundError(subsystem)
71 71
 }
72 72
 
73
+func isSubsystemAvailable(subsystem string) bool {
74
+	cgroups, err := ParseCgroupFile("/proc/self/cgroup")
75
+	if err != nil {
76
+		return false
77
+	}
78
+	_, avail := cgroups[subsystem]
79
+	return avail
80
+}
81
+
73 82
 func FindCgroupMountpointDir() (string, error) {
74 83
 	f, err := os.Open("/proc/self/mountinfo")
75 84
 	if err != nil {
... ...
@@ -124,7 +139,8 @@ func (m Mount) GetThisCgroupDir(cgroups map[string]string) (string, error) {
124 124
 func getCgroupMountsHelper(ss map[string]bool, mi io.Reader) ([]Mount, error) {
125 125
 	res := make([]Mount, 0, len(ss))
126 126
 	scanner := bufio.NewScanner(mi)
127
-	for scanner.Scan() {
127
+	numFound := 0
128
+	for scanner.Scan() && numFound < len(ss) {
128 129
 		txt := scanner.Text()
129 130
 		sepIdx := strings.Index(txt, " - ")
130 131
 		if sepIdx == -1 {
... ...
@@ -139,12 +155,15 @@ func getCgroupMountsHelper(ss map[string]bool, mi io.Reader) ([]Mount, error) {
139 139
 			Root:       fields[3],
140 140
 		}
141 141
 		for _, opt := range strings.Split(fields[len(fields)-1], ",") {
142
+			if !ss[opt] {
143
+				continue
144
+			}
142 145
 			if strings.HasPrefix(opt, cgroupNamePrefix) {
143 146
 				m.Subsystems = append(m.Subsystems, opt[len(cgroupNamePrefix):])
144
-			}
145
-			if ss[opt] {
147
+			} else {
146 148
 				m.Subsystems = append(m.Subsystems, opt)
147 149
 			}
150
+			numFound++
148 151
 		}
149 152
 		res = append(res, m)
150 153
 	}
... ...
@@ -161,19 +180,19 @@ func GetCgroupMounts() ([]Mount, error) {
161 161
 	}
162 162
 	defer f.Close()
163 163
 
164
-	all, err := GetAllSubsystems()
164
+	all, err := ParseCgroupFile("/proc/self/cgroup")
165 165
 	if err != nil {
166 166
 		return nil, err
167 167
 	}
168 168
 
169 169
 	allMap := make(map[string]bool)
170
-	for _, s := range all {
170
+	for s := range all {
171 171
 		allMap[s] = true
172 172
 	}
173 173
 	return getCgroupMountsHelper(allMap, f)
174 174
 }
175 175
 
176
-// Returns all the cgroup subsystems supported by the kernel
176
+// GetAllSubsystems returns all the cgroup subsystems supported by the kernel
177 177
 func GetAllSubsystems() ([]string, error) {
178 178
 	f, err := os.Open("/proc/cgroups")
179 179
 	if err != nil {
... ...
@@ -199,7 +218,7 @@ func GetAllSubsystems() ([]string, error) {
199 199
 	return subsystems, nil
200 200
 }
201 201
 
202
-// Returns the relative path to the cgroup docker is running in.
202
+// GetThisCgroupDir returns the relative path to the cgroup docker is running in.
203 203
 func GetThisCgroupDir(subsystem string) (string, error) {
204 204
 	cgroups, err := ParseCgroupFile("/proc/self/cgroup")
205 205
 	if err != nil {
... ...
@@ -33,7 +33,7 @@ type Seccomp struct {
33 33
 	Syscalls      []*Syscall `json:"syscalls"`
34 34
 }
35 35
 
36
-// An action to be taken upon rule match in Seccomp
36
+// Action is taken upon rule match in Seccomp
37 37
 type Action int
38 38
 
39 39
 const (
... ...
@@ -44,7 +44,7 @@ const (
44 44
 	Trace
45 45
 )
46 46
 
47
-// A comparison operator to be used when matching syscall arguments in Seccomp
47
+// Operator is a comparison operator to be used when matching syscall arguments in Seccomp
48 48
 type Operator int
49 49
 
50 50
 const (
... ...
@@ -57,7 +57,7 @@ const (
57 57
 	MaskEqualTo
58 58
 )
59 59
 
60
-// A rule to match a specific syscall argument in Seccomp
60
+// Arg is a rule to match a specific syscall argument in Seccomp
61 61
 type Arg struct {
62 62
 	Index    uint     `json:"index"`
63 63
 	Value    uint64   `json:"value"`
... ...
@@ -65,7 +65,7 @@ type Arg struct {
65 65
 	Op       Operator `json:"op"`
66 66
 }
67 67
 
68
-// An rule to match a syscall in Seccomp
68
+// Syscall is a rule to match a syscall in Seccomp
69 69
 type Syscall struct {
70 70
 	Name   string `json:"name"`
71 71
 	Action Action `json:"action"`
... ...
@@ -249,10 +249,11 @@ func (hooks Hooks) MarshalJSON() ([]byte, error) {
249 249
 
250 250
 // HookState is the payload provided to a hook on execution.
251 251
 type HookState struct {
252
-	Version string `json:"version"`
253
-	ID      string `json:"id"`
254
-	Pid     int    `json:"pid"`
255
-	Root    string `json:"root"`
252
+	Version    string `json:"ociVersion"`
253
+	ID         string `json:"id"`
254
+	Pid        int    `json:"pid"`
255
+	Root       string `json:"root"`
256
+	BundlePath string `json:"bundlePath"`
256 257
 }
257 258
 
258 259
 type Hook interface {
... ...
@@ -260,7 +261,7 @@ type Hook interface {
260 260
 	Run(HookState) error
261 261
 }
262 262
 
263
-// NewFunctionHooks will call the provided function when the hook is run.
263
+// NewFunctionHook will call the provided function when the hook is run.
264 264
 func NewFunctionHook(f func(HookState) error) FuncHook {
265 265
 	return FuncHook{
266 266
 		run: f,
... ...
@@ -283,7 +284,7 @@ type Command struct {
283 283
 	Timeout *time.Duration `json:"timeout"`
284 284
 }
285 285
 
286
-// NewCommandHooks will execute the provided command when the hook is run.
286
+// NewCommandHook will execute the provided command when the hook is run.
287 287
 func NewCommandHook(cmd Command) CommandHook {
288 288
 	return CommandHook{
289 289
 		Command: cmd,
... ...
@@ -307,7 +308,11 @@ func (c Command) Run(s HookState) error {
307 307
 	}
308 308
 	errC := make(chan error, 1)
309 309
 	go func() {
310
-		errC <- cmd.Run()
310
+		out, err := cmd.CombinedOutput()
311
+		if err != nil {
312
+			err = fmt.Errorf("%s: %s", err, out)
313
+		}
314
+		errC <- err
311 315
 	}()
312 316
 	if c.Timeout != nil {
313 317
 		select {
... ...
@@ -4,7 +4,7 @@ package configs
4 4
 
5 5
 import "fmt"
6 6
 
7
-// Gets the root uid for the process on host which could be non-zero
7
+// HostUID gets the root uid for the process on host which could be non-zero
8 8
 // when user namespaces are enabled.
9 9
 func (c Config) HostUID() (int, error) {
10 10
 	if c.Namespaces.Contains(NEWUSER) {
... ...
@@ -21,7 +21,7 @@ func (c Config) HostUID() (int, error) {
21 21
 	return 0, nil
22 22
 }
23 23
 
24
-// Gets the root gid for the process on host which could be non-zero
24
+// HostGID gets the root gid for the process on host which could be non-zero
25 25
 // when user namespaces are enabled.
26 26
 func (c Config) HostGID() (int, error) {
27 27
 	if c.Namespaces.Contains(NEWUSER) {
... ...
@@ -3,7 +3,7 @@
3 3
 package configs
4 4
 
5 5
 var (
6
-	// These are devices that are to be both allowed and created.
6
+	// DefaultSimpleDevices are devices that are to be both allowed and created.
7 7
 	DefaultSimpleDevices = []*Device{
8 8
 		// /dev/null and zero
9 9
 		{
... ...
@@ -21,6 +21,10 @@ func SetProcessLabel(processLabel string) error {
21 21
 	return nil
22 22
 }
23 23
 
24
+func GetFileLabel(path string) (string, error) {
25
+	return "", nil
26
+}
27
+
24 28
 func SetFileLabel(path string, fileLabel string) error {
25 29
 	return nil
26 30
 }
... ...
@@ -94,6 +94,11 @@ func GetProcessLabel() (string, error) {
94 94
 	return selinux.Getexeccon()
95 95
 }
96 96
 
97
+// GetFileLabel returns the label for specified path
98
+func GetFileLabel(path string) (string, error) {
99
+	return selinux.Getfilecon(path)
100
+}
101
+
97 102
 // SetFileLabel modifies the "path" label to the specified file label
98 103
 func SetFileLabel(path string, fileLabel string) error {
99 104
 	if selinux.SelinuxEnabled() && fileLabel != "" {
... ...
@@ -102,7 +107,7 @@ func SetFileLabel(path string, fileLabel string) error {
102 102
 	return nil
103 103
 }
104 104
 
105
-// Tell the kernel the label for all files to be created
105
+// SetFileCreateLabel tells the kernel the label for all files to be created
106 106
 func SetFileCreateLabel(fileLabel string) error {
107 107
 	if selinux.SelinuxEnabled() {
108 108
 		return selinux.Setfscreatecon(fileLabel)
... ...
@@ -110,7 +115,7 @@ func SetFileCreateLabel(fileLabel string) error {
110 110
 	return nil
111 111
 }
112 112
 
113
-// Change the label of path to the filelabel string.
113
+// Relabel changes the label of path to the filelabel string.
114 114
 // It changes the MCS label to s0 if shared is true.
115 115
 // This will allow all containers to share the content.
116 116
 func Relabel(path string, fileLabel string, shared bool) error {
... ...
@@ -13,9 +13,9 @@ import (
13 13
 	"regexp"
14 14
 	"strconv"
15 15
 	"strings"
16
+	"sync"
16 17
 	"syscall"
17 18
 
18
-	"github.com/docker/docker/pkg/mount"
19 19
 	"github.com/opencontainers/runc/libcontainer/system"
20 20
 )
21 21
 
... ...
@@ -35,6 +35,7 @@ const (
35 35
 var (
36 36
 	assignRegex           = regexp.MustCompile(`^([^=]+)=(.*)$`)
37 37
 	mcsList               = make(map[string]bool)
38
+	mcsLock               sync.Mutex
38 39
 	selinuxfs             = "unknown"
39 40
 	selinuxEnabled        = false // Stores whether selinux is currently enabled
40 41
 	selinuxEnabledChecked = false // Stores whether selinux enablement has been checked or established yet
... ...
@@ -58,16 +59,31 @@ func getSelinuxMountPoint() string {
58 58
 	}
59 59
 	selinuxfs = ""
60 60
 
61
-	mounts, err := mount.GetMounts()
61
+	f, err := os.Open("/proc/self/mountinfo")
62 62
 	if err != nil {
63 63
 		return selinuxfs
64 64
 	}
65
-	for _, mount := range mounts {
66
-		if mount.Fstype == "selinuxfs" {
67
-			selinuxfs = mount.Mountpoint
68
-			break
65
+	defer f.Close()
66
+
67
+	scanner := bufio.NewScanner(f)
68
+	for scanner.Scan() {
69
+		txt := scanner.Text()
70
+		// Safe as mountinfo encodes mountpoints with spaces as \040.
71
+		sepIdx := strings.Index(txt, " - ")
72
+		if sepIdx == -1 {
73
+			continue
74
+		}
75
+		if !strings.Contains(txt[sepIdx:], "selinuxfs") {
76
+			continue
69 77
 		}
78
+		fields := strings.Split(txt, " ")
79
+		if len(fields) < 5 {
80
+			continue
81
+		}
82
+		selinuxfs = fields[4]
83
+		break
70 84
 	}
85
+
71 86
 	if selinuxfs != "" {
72 87
 		var buf syscall.Statfs_t
73 88
 		syscall.Statfs(selinuxfs, &buf)
... ...
@@ -267,6 +283,8 @@ func SelinuxGetEnforceMode() int {
267 267
 }
268 268
 
269 269
 func mcsAdd(mcs string) error {
270
+	mcsLock.Lock()
271
+	defer mcsLock.Unlock()
270 272
 	if mcsList[mcs] {
271 273
 		return fmt.Errorf("MCS Label already exists")
272 274
 	}
... ...
@@ -275,7 +293,9 @@ func mcsAdd(mcs string) error {
275 275
 }
276 276
 
277 277
 func mcsDelete(mcs string) {
278
+	mcsLock.Lock()
278 279
 	mcsList[mcs] = false
280
+	mcsLock.Unlock()
279 281
 }
280 282
 
281 283
 func IntToMcs(id int, catRange uint32) string {
... ...
@@ -291,7 +311,7 @@ func IntToMcs(id int, catRange uint32) string {
291 291
 
292 292
 	for ORD > TIER {
293 293
 		ORD = ORD - TIER
294
-		TIER -= 1
294
+		TIER--
295 295
 	}
296 296
 	TIER = SETSIZE - TIER
297 297
 	ORD = ORD + TIER
... ...
@@ -432,7 +452,7 @@ func badPrefix(fpath string) error {
432 432
 	return nil
433 433
 }
434 434
 
435
-// Change the fpath file object to the SELinux label scon.
435
+// Chcon changes the fpath file object to the SELinux label scon.
436 436
 // If the fpath is a directory and recurse is true Chcon will walk the
437 437
 // directory tree setting the label
438 438
 func Chcon(fpath string, scon string, recurse bool) error {
... ...
@@ -466,14 +486,14 @@ func DupSecOpt(src string) []string {
466 466
 		con["level"] == "" {
467 467
 		return nil
468 468
 	}
469
-	return []string{"label:user:" + con["user"],
470
-		"label:role:" + con["role"],
471
-		"label:type:" + con["type"],
472
-		"label:level:" + con["level"]}
469
+	return []string{"label=user:" + con["user"],
470
+		"label=role:" + con["role"],
471
+		"label=type:" + con["type"],
472
+		"label=level:" + con["level"]}
473 473
 }
474 474
 
475 475
 // DisableSecOpt returns a security opt that can be used to disabling SELinux
476 476
 // labeling support for future container processes
477 477
 func DisableSecOpt() []string {
478
-	return []string{"label:disable"}
478
+	return []string{"label=disable"}
479 479
 }
... ...
@@ -100,17 +100,12 @@ func Setctty() error {
100 100
 	return nil
101 101
 }
102 102
 
103
-/*
104
- * Detect whether we are currently running in a user namespace.
105
- * Copied from github.com/lxc/lxd/shared/util.go
106
- */
103
+// RunningInUserNS detects whether we are currently running in a user namespace.
104
+// Copied from github.com/lxc/lxd/shared/util.go
107 105
 func RunningInUserNS() bool {
108 106
 	file, err := os.Open("/proc/self/uid_map")
109 107
 	if err != nil {
110
-		/*
111
-		 * This kernel-provided file only exists if user namespaces are
112
-		 * supported
113
-		 */
108
+		// This kernel-provided file only exists if user namespaces are supported
114 109
 		return false
115 110
 	}
116 111
 	defer file.Close()
... ...
@@ -10,3 +10,7 @@ import "C"
10 10
 func GetClockTicks() int {
11 11
 	return int(C.sysconf(C._SC_CLK_TCK))
12 12
 }
13
+
14
+func GetLongBit() int {
15
+	return int(C.sysconf(C._SC_LONG_BIT))
16
+}