Browse code

Update swarmkit to 4dfc88ccce14ced6f0a6ea82d46dca004c6de0e2

Signed-off-by: Vincent Demeester <vincent@sbr.pm>

Vincent Demeester authored on 2016/11/03 03:43:27
Showing 17 changed files
... ...
@@ -147,7 +147,7 @@ clone git github.com/docker/containerd 52ef1ceb4b660c42cf4ea9013180a5663968d4c7
147 147
 clone git github.com/tonistiigi/fifo 8c56881ce5e63e19e2dfc495c8af0fb90916467d
148 148
 
149 149
 # cluster
150
-clone git github.com/docker/swarmkit 72981f443024da2c57d54b915eae0477be6dada5
150
+clone git github.com/docker/swarmkit 4dfc88ccce14ced6f0a6ea82d46dca004c6de0e2
151 151
 clone git github.com/golang/mock bd3c8e81be01eef76d4b503f5e687d2d1354d2d9
152 152
 clone git github.com/gogo/protobuf v0.3
153 153
 clone git github.com/cloudflare/cfssl 7fb22c8cba7ecaf98e4082d22d65800cf45e042a
... ...
@@ -1,3 +1,3 @@
1 1
 package api
2 2
 
3
-//go:generate protoc -I.:../protobuf:../vendor:../vendor/github.com/gogo/protobuf:../vendor/github.com/gogo/protobuf/protobuf --gogoswarm_out=plugins=grpc+deepcopy+raftproxy+authenticatedwrapper,import_path=github.com/docker/swarmkit/api,Mgogoproto/gogo.proto=github.com/gogo/protobuf/gogoproto,Mtimestamp/timestamp.proto=github.com/docker/swarmkit/api/timestamp,Mduration/duration.proto=github.com/docker/swarmkit/api/duration,Mgoogle/protobuf/descriptor.proto=github.com/gogo/protobuf/protoc-gen-gogo/descriptor,Mplugin/plugin.proto=github.com/docker/swarmkit/protobuf/plugin:. types.proto specs.proto objects.proto control.proto dispatcher.proto ca.proto snapshot.proto raft.proto health.proto resource.proto
3
+//go:generate protoc -I.:../protobuf:../vendor:../vendor/github.com/gogo/protobuf --gogoswarm_out=plugins=grpc+deepcopy+raftproxy+authenticatedwrapper,import_path=github.com/docker/swarmkit/api,Mgogoproto/gogo.proto=github.com/gogo/protobuf/gogoproto,Mtimestamp/timestamp.proto=github.com/docker/swarmkit/api/timestamp,Mduration/duration.proto=github.com/docker/swarmkit/api/duration,Mgoogle/protobuf/descriptor.proto=github.com/gogo/protobuf/protoc-gen-gogo/descriptor,Mplugin/plugin.proto=github.com/docker/swarmkit/protobuf/plugin:. types.proto specs.proto objects.proto control.proto dispatcher.proto ca.proto snapshot.proto raft.proto health.proto resource.proto
... ...
@@ -60,6 +60,7 @@
60 60
 		SecretReference
61 61
 		BlacklistedCertificate
62 62
 		HealthConfig
63
+		MaybeEncryptedRecord
63 64
 		NodeSpec
64 65
 		ServiceSpec
65 66
 		ReplicatedService
... ...
@@ -650,34 +651,28 @@ func (EncryptionKey_Algorithm) EnumDescriptor() ([]byte, []int) {
650 650
 	return fileDescriptorTypes, []int{37, 0}
651 651
 }
652 652
 
653
-// Mode specifies how this secret should be exposed to the task.
654
-type SecretReference_Mode int32
653
+type MaybeEncryptedRecord_Algorithm int32
655 654
 
656 655
 const (
657
-	// SYSTEM means that it is not exposed inside to a task at all, but
658
-	// only available via direct access, usually at the agent-level
659
-	SecretReference_SYSTEM SecretReference_Mode = 0
660
-	// FILE means that it will be exposed to the task as a file
661
-	SecretReference_FILE SecretReference_Mode = 1
662
-	// ENV means that it will be exposed to the task as an environment variable
663
-	SecretReference_ENV SecretReference_Mode = 2
656
+	MaybeEncryptedRecord_NotEncrypted                 MaybeEncryptedRecord_Algorithm = 0
657
+	MaybeEncryptedRecord_NACLSecretboxSalsa20Poly1305 MaybeEncryptedRecord_Algorithm = 1
664 658
 )
665 659
 
666
-var SecretReference_Mode_name = map[int32]string{
667
-	0: "SYSTEM",
668
-	1: "FILE",
669
-	2: "ENV",
660
+var MaybeEncryptedRecord_Algorithm_name = map[int32]string{
661
+	0: "NONE",
662
+	1: "SECRETBOX_SALSA20_POLY1305",
670 663
 }
671
-var SecretReference_Mode_value = map[string]int32{
672
-	"SYSTEM": 0,
673
-	"FILE":   1,
674
-	"ENV":    2,
664
+var MaybeEncryptedRecord_Algorithm_value = map[string]int32{
665
+	"NONE": 0,
666
+	"SECRETBOX_SALSA20_POLY1305": 1,
675 667
 }
676 668
 
677
-func (x SecretReference_Mode) String() string {
678
-	return proto.EnumName(SecretReference_Mode_name, int32(x))
669
+func (x MaybeEncryptedRecord_Algorithm) String() string {
670
+	return proto.EnumName(MaybeEncryptedRecord_Algorithm_name, int32(x))
671
+}
672
+func (MaybeEncryptedRecord_Algorithm) EnumDescriptor() ([]byte, []int) {
673
+	return fileDescriptorTypes, []int{42, 0}
679 674
 }
680
-func (SecretReference_Mode) EnumDescriptor() ([]byte, []int) { return fileDescriptorTypes, []int{39, 0} }
681 675
 
682 676
 // Version tracks the last time an object in the store was updated.
683 677
 type Version struct {
... ...
@@ -786,6 +781,8 @@ func (*RaftMemberStatus) Descriptor() ([]byte, []int) { return fileDescriptorTyp
786 786
 type NodeStatus struct {
787 787
 	State   NodeStatus_State `protobuf:"varint,1,opt,name=state,proto3,enum=docker.swarmkit.v1.NodeStatus_State" json:"state,omitempty"`
788 788
 	Message string           `protobuf:"bytes,2,opt,name=message,proto3" json:"message,omitempty"`
789
+	// Addr is the node's IP address as observed by the manager
790
+	Addr string `protobuf:"bytes,3,opt,name=addr,proto3" json:"addr,omitempty"`
789 791
 }
790 792
 
791 793
 func (m *NodeStatus) Reset()                    { *m = NodeStatus{} }
... ...
@@ -1437,19 +1434,119 @@ type SecretReference struct {
1437 1437
 	// referencing. This identifier exists so that SecretReferences don't leak
1438 1438
 	// any information about the secret contents.
1439 1439
 	SecretID string `protobuf:"bytes,1,opt,name=secret_id,json=secretId,proto3" json:"secret_id,omitempty"`
1440
-	// Mode is the way the secret should be presented.
1441
-	Mode SecretReference_Mode `protobuf:"varint,2,opt,name=mode,proto3,enum=docker.swarmkit.v1.SecretReference_Mode" json:"mode,omitempty"`
1442
-	// Target is the name by which the image accesses the secret.
1443
-	Target string `protobuf:"bytes,3,opt,name=target,proto3" json:"target,omitempty"`
1444 1440
 	// SecretName is the name of the secret that this references, but this is just provided for
1445 1441
 	// lookup/display purposes.  The secret in the reference will be identified by its ID.
1446
-	SecretName string `protobuf:"bytes,4,opt,name=secret_name,json=secretName,proto3" json:"secret_name,omitempty"`
1442
+	SecretName string `protobuf:"bytes,2,opt,name=secret_name,json=secretName,proto3" json:"secret_name,omitempty"`
1443
+	// Target specifies how this secret should be exposed to the task.
1444
+	//
1445
+	// Types that are valid to be assigned to Target:
1446
+	//	*SecretReference_File
1447
+	Target isSecretReference_Target `protobuf_oneof:"target"`
1447 1448
 }
1448 1449
 
1449 1450
 func (m *SecretReference) Reset()                    { *m = SecretReference{} }
1450 1451
 func (*SecretReference) ProtoMessage()               {}
1451 1452
 func (*SecretReference) Descriptor() ([]byte, []int) { return fileDescriptorTypes, []int{39} }
1452 1453
 
1454
+type isSecretReference_Target interface {
1455
+	isSecretReference_Target()
1456
+	MarshalTo([]byte) (int, error)
1457
+	Size() int
1458
+}
1459
+
1460
+type SecretReference_File struct {
1461
+	File *SecretReference_FileTarget `protobuf:"bytes,3,opt,name=file,oneof"`
1462
+}
1463
+
1464
+func (*SecretReference_File) isSecretReference_Target() {}
1465
+
1466
+func (m *SecretReference) GetTarget() isSecretReference_Target {
1467
+	if m != nil {
1468
+		return m.Target
1469
+	}
1470
+	return nil
1471
+}
1472
+
1473
+func (m *SecretReference) GetFile() *SecretReference_FileTarget {
1474
+	if x, ok := m.GetTarget().(*SecretReference_File); ok {
1475
+		return x.File
1476
+	}
1477
+	return nil
1478
+}
1479
+
1480
+// XXX_OneofFuncs is for the internal use of the proto package.
1481
+func (*SecretReference) XXX_OneofFuncs() (func(msg proto.Message, b *proto.Buffer) error, func(msg proto.Message, tag, wire int, b *proto.Buffer) (bool, error), func(msg proto.Message) (n int), []interface{}) {
1482
+	return _SecretReference_OneofMarshaler, _SecretReference_OneofUnmarshaler, _SecretReference_OneofSizer, []interface{}{
1483
+		(*SecretReference_File)(nil),
1484
+	}
1485
+}
1486
+
1487
+func _SecretReference_OneofMarshaler(msg proto.Message, b *proto.Buffer) error {
1488
+	m := msg.(*SecretReference)
1489
+	// target
1490
+	switch x := m.Target.(type) {
1491
+	case *SecretReference_File:
1492
+		_ = b.EncodeVarint(3<<3 | proto.WireBytes)
1493
+		if err := b.EncodeMessage(x.File); err != nil {
1494
+			return err
1495
+		}
1496
+	case nil:
1497
+	default:
1498
+		return fmt.Errorf("SecretReference.Target has unexpected type %T", x)
1499
+	}
1500
+	return nil
1501
+}
1502
+
1503
+func _SecretReference_OneofUnmarshaler(msg proto.Message, tag, wire int, b *proto.Buffer) (bool, error) {
1504
+	m := msg.(*SecretReference)
1505
+	switch tag {
1506
+	case 3: // target.file
1507
+		if wire != proto.WireBytes {
1508
+			return true, proto.ErrInternalBadWireType
1509
+		}
1510
+		msg := new(SecretReference_FileTarget)
1511
+		err := b.DecodeMessage(msg)
1512
+		m.Target = &SecretReference_File{msg}
1513
+		return true, err
1514
+	default:
1515
+		return false, nil
1516
+	}
1517
+}
1518
+
1519
+func _SecretReference_OneofSizer(msg proto.Message) (n int) {
1520
+	m := msg.(*SecretReference)
1521
+	// target
1522
+	switch x := m.Target.(type) {
1523
+	case *SecretReference_File:
1524
+		s := proto.Size(x.File)
1525
+		n += proto.SizeVarint(3<<3 | proto.WireBytes)
1526
+		n += proto.SizeVarint(uint64(s))
1527
+		n += s
1528
+	case nil:
1529
+	default:
1530
+		panic(fmt.Sprintf("proto: unexpected type %T in oneof", x))
1531
+	}
1532
+	return n
1533
+}
1534
+
1535
+// FileTarget represents a specific target that is backed by a file
1536
+type SecretReference_FileTarget struct {
1537
+	// Name represents the final filename in the filesystem
1538
+	Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
1539
+	// UID represents the file UID
1540
+	UID string `protobuf:"bytes,2,opt,name=uid,proto3" json:"uid,omitempty"`
1541
+	// GID represents the file GID
1542
+	GID string `protobuf:"bytes,3,opt,name=gid,proto3" json:"gid,omitempty"`
1543
+	// Mode represents the FileMode of the file
1544
+	Mode os.FileMode `protobuf:"varint,4,opt,name=mode,proto3,customtype=os.FileMode" json:"mode"`
1545
+}
1546
+
1547
+func (m *SecretReference_FileTarget) Reset()      { *m = SecretReference_FileTarget{} }
1548
+func (*SecretReference_FileTarget) ProtoMessage() {}
1549
+func (*SecretReference_FileTarget) Descriptor() ([]byte, []int) {
1550
+	return fileDescriptorTypes, []int{39, 0}
1551
+}
1552
+
1453 1553
 // BlacklistedCertificate is a record for a blacklisted certificate. It does not
1454 1554
 // contain the certificate's CN, because these records are indexed by CN.
1455 1555
 type BlacklistedCertificate struct {
... ...
@@ -1486,6 +1583,16 @@ func (m *HealthConfig) Reset()                    { *m = HealthConfig{} }
1486 1486
 func (*HealthConfig) ProtoMessage()               {}
1487 1487
 func (*HealthConfig) Descriptor() ([]byte, []int) { return fileDescriptorTypes, []int{41} }
1488 1488
 
1489
+type MaybeEncryptedRecord struct {
1490
+	Algorithm MaybeEncryptedRecord_Algorithm `protobuf:"varint,1,opt,name=algorithm,proto3,enum=docker.swarmkit.v1.MaybeEncryptedRecord_Algorithm" json:"algorithm,omitempty"`
1491
+	Data      []byte                         `protobuf:"bytes,2,opt,name=data,proto3" json:"data,omitempty"`
1492
+	Nonce     []byte                         `protobuf:"bytes,3,opt,name=nonce,proto3" json:"nonce,omitempty"`
1493
+}
1494
+
1495
+func (m *MaybeEncryptedRecord) Reset()                    { *m = MaybeEncryptedRecord{} }
1496
+func (*MaybeEncryptedRecord) ProtoMessage()               {}
1497
+func (*MaybeEncryptedRecord) Descriptor() ([]byte, []int) { return fileDescriptorTypes, []int{42} }
1498
+
1489 1499
 func init() {
1490 1500
 	proto.RegisterType((*Version)(nil), "docker.swarmkit.v1.Version")
1491 1501
 	proto.RegisterType((*Annotations)(nil), "docker.swarmkit.v1.Annotations")
... ...
@@ -1532,8 +1639,10 @@ func init() {
1532 1532
 	proto.RegisterType((*EncryptionKey)(nil), "docker.swarmkit.v1.EncryptionKey")
1533 1533
 	proto.RegisterType((*ManagerStatus)(nil), "docker.swarmkit.v1.ManagerStatus")
1534 1534
 	proto.RegisterType((*SecretReference)(nil), "docker.swarmkit.v1.SecretReference")
1535
+	proto.RegisterType((*SecretReference_FileTarget)(nil), "docker.swarmkit.v1.SecretReference.FileTarget")
1535 1536
 	proto.RegisterType((*BlacklistedCertificate)(nil), "docker.swarmkit.v1.BlacklistedCertificate")
1536 1537
 	proto.RegisterType((*HealthConfig)(nil), "docker.swarmkit.v1.HealthConfig")
1538
+	proto.RegisterType((*MaybeEncryptedRecord)(nil), "docker.swarmkit.v1.MaybeEncryptedRecord")
1537 1539
 	proto.RegisterEnum("docker.swarmkit.v1.TaskState", TaskState_name, TaskState_value)
1538 1540
 	proto.RegisterEnum("docker.swarmkit.v1.NodeRole", NodeRole_name, NodeRole_value)
1539 1541
 	proto.RegisterEnum("docker.swarmkit.v1.RaftMemberStatus_Reachability", RaftMemberStatus_Reachability_name, RaftMemberStatus_Reachability_value)
... ...
@@ -1549,7 +1658,7 @@ func init() {
1549 1549
 	proto.RegisterEnum("docker.swarmkit.v1.IssuanceStatus_State", IssuanceStatus_State_name, IssuanceStatus_State_value)
1550 1550
 	proto.RegisterEnum("docker.swarmkit.v1.ExternalCA_CAProtocol", ExternalCA_CAProtocol_name, ExternalCA_CAProtocol_value)
1551 1551
 	proto.RegisterEnum("docker.swarmkit.v1.EncryptionKey_Algorithm", EncryptionKey_Algorithm_name, EncryptionKey_Algorithm_value)
1552
-	proto.RegisterEnum("docker.swarmkit.v1.SecretReference_Mode", SecretReference_Mode_name, SecretReference_Mode_value)
1552
+	proto.RegisterEnum("docker.swarmkit.v1.MaybeEncryptedRecord_Algorithm", MaybeEncryptedRecord_Algorithm_name, MaybeEncryptedRecord_Algorithm_value)
1553 1553
 }
1554 1554
 
1555 1555
 func (m *Version) Copy() *Version {
... ...
@@ -1698,6 +1807,7 @@ func (m *NodeStatus) Copy() *NodeStatus {
1698 1698
 	o := &NodeStatus{
1699 1699
 		State:   m.State,
1700 1700
 		Message: m.Message,
1701
+		Addr:    m.Addr,
1701 1702
 	}
1702 1703
 
1703 1704
 	return o
... ...
@@ -2248,11 +2358,33 @@ func (m *SecretReference) Copy() *SecretReference {
2248 2248
 
2249 2249
 	o := &SecretReference{
2250 2250
 		SecretID:   m.SecretID,
2251
-		Mode:       m.Mode,
2252
-		Target:     m.Target,
2253 2251
 		SecretName: m.SecretName,
2254 2252
 	}
2255 2253
 
2254
+	switch m.Target.(type) {
2255
+	case *SecretReference_File:
2256
+		i := &SecretReference_File{
2257
+			File: m.GetFile().Copy(),
2258
+		}
2259
+
2260
+		o.Target = i
2261
+	}
2262
+
2263
+	return o
2264
+}
2265
+
2266
+func (m *SecretReference_FileTarget) Copy() *SecretReference_FileTarget {
2267
+	if m == nil {
2268
+		return nil
2269
+	}
2270
+
2271
+	o := &SecretReference_FileTarget{
2272
+		Name: m.Name,
2273
+		UID:  m.UID,
2274
+		GID:  m.GID,
2275
+		Mode: m.Mode,
2276
+	}
2277
+
2256 2278
 	return o
2257 2279
 }
2258 2280
 
... ...
@@ -2287,6 +2419,20 @@ func (m *HealthConfig) Copy() *HealthConfig {
2287 2287
 	return o
2288 2288
 }
2289 2289
 
2290
+func (m *MaybeEncryptedRecord) Copy() *MaybeEncryptedRecord {
2291
+	if m == nil {
2292
+		return nil
2293
+	}
2294
+
2295
+	o := &MaybeEncryptedRecord{
2296
+		Algorithm: m.Algorithm,
2297
+		Data:      m.Data,
2298
+		Nonce:     m.Nonce,
2299
+	}
2300
+
2301
+	return o
2302
+}
2303
+
2290 2304
 func (this *Version) GoString() string {
2291 2305
 	if this == nil {
2292 2306
 		return "nil"
... ...
@@ -2429,10 +2575,11 @@ func (this *NodeStatus) GoString() string {
2429 2429
 	if this == nil {
2430 2430
 		return "nil"
2431 2431
 	}
2432
-	s := make([]string, 0, 6)
2432
+	s := make([]string, 0, 7)
2433 2433
 	s = append(s, "&api.NodeStatus{")
2434 2434
 	s = append(s, "State: "+fmt.Sprintf("%#v", this.State)+",\n")
2435 2435
 	s = append(s, "Message: "+fmt.Sprintf("%#v", this.Message)+",\n")
2436
+	s = append(s, "Addr: "+fmt.Sprintf("%#v", this.Addr)+",\n")
2436 2437
 	s = append(s, "}")
2437 2438
 	return strings.Join(s, "")
2438 2439
 }
... ...
@@ -2945,12 +3092,34 @@ func (this *SecretReference) GoString() string {
2945 2945
 	if this == nil {
2946 2946
 		return "nil"
2947 2947
 	}
2948
-	s := make([]string, 0, 8)
2948
+	s := make([]string, 0, 7)
2949 2949
 	s = append(s, "&api.SecretReference{")
2950 2950
 	s = append(s, "SecretID: "+fmt.Sprintf("%#v", this.SecretID)+",\n")
2951
-	s = append(s, "Mode: "+fmt.Sprintf("%#v", this.Mode)+",\n")
2952
-	s = append(s, "Target: "+fmt.Sprintf("%#v", this.Target)+",\n")
2953 2951
 	s = append(s, "SecretName: "+fmt.Sprintf("%#v", this.SecretName)+",\n")
2952
+	if this.Target != nil {
2953
+		s = append(s, "Target: "+fmt.Sprintf("%#v", this.Target)+",\n")
2954
+	}
2955
+	s = append(s, "}")
2956
+	return strings.Join(s, "")
2957
+}
2958
+func (this *SecretReference_File) GoString() string {
2959
+	if this == nil {
2960
+		return "nil"
2961
+	}
2962
+	s := strings.Join([]string{`&api.SecretReference_File{` +
2963
+		`File:` + fmt.Sprintf("%#v", this.File) + `}`}, ", ")
2964
+	return s
2965
+}
2966
+func (this *SecretReference_FileTarget) GoString() string {
2967
+	if this == nil {
2968
+		return "nil"
2969
+	}
2970
+	s := make([]string, 0, 8)
2971
+	s = append(s, "&api.SecretReference_FileTarget{")
2972
+	s = append(s, "Name: "+fmt.Sprintf("%#v", this.Name)+",\n")
2973
+	s = append(s, "UID: "+fmt.Sprintf("%#v", this.UID)+",\n")
2974
+	s = append(s, "GID: "+fmt.Sprintf("%#v", this.GID)+",\n")
2975
+	s = append(s, "Mode: "+fmt.Sprintf("%#v", this.Mode)+",\n")
2954 2976
 	s = append(s, "}")
2955 2977
 	return strings.Join(s, "")
2956 2978
 }
... ...
@@ -2983,6 +3152,18 @@ func (this *HealthConfig) GoString() string {
2983 2983
 	s = append(s, "}")
2984 2984
 	return strings.Join(s, "")
2985 2985
 }
2986
+func (this *MaybeEncryptedRecord) GoString() string {
2987
+	if this == nil {
2988
+		return "nil"
2989
+	}
2990
+	s := make([]string, 0, 7)
2991
+	s = append(s, "&api.MaybeEncryptedRecord{")
2992
+	s = append(s, "Algorithm: "+fmt.Sprintf("%#v", this.Algorithm)+",\n")
2993
+	s = append(s, "Data: "+fmt.Sprintf("%#v", this.Data)+",\n")
2994
+	s = append(s, "Nonce: "+fmt.Sprintf("%#v", this.Nonce)+",\n")
2995
+	s = append(s, "}")
2996
+	return strings.Join(s, "")
2997
+}
2986 2998
 func valueToGoStringTypes(v interface{}, typ string) string {
2987 2999
 	rv := reflect.ValueOf(v)
2988 3000
 	if rv.IsNil() {
... ...
@@ -3371,6 +3552,12 @@ func (m *NodeStatus) MarshalTo(data []byte) (int, error) {
3371 3371
 		i = encodeVarintTypes(data, i, uint64(len(m.Message)))
3372 3372
 		i += copy(data[i:], m.Message)
3373 3373
 	}
3374
+	if len(m.Addr) > 0 {
3375
+		data[i] = 0x1a
3376
+		i++
3377
+		i = encodeVarintTypes(data, i, uint64(len(m.Addr)))
3378
+		i += copy(data[i:], m.Addr)
3379
+	}
3374 3380
 	return i, nil
3375 3381
 }
3376 3382
 
... ...
@@ -4768,22 +4955,73 @@ func (m *SecretReference) MarshalTo(data []byte) (int, error) {
4768 4768
 		i = encodeVarintTypes(data, i, uint64(len(m.SecretID)))
4769 4769
 		i += copy(data[i:], m.SecretID)
4770 4770
 	}
4771
-	if m.Mode != 0 {
4772
-		data[i] = 0x10
4771
+	if len(m.SecretName) > 0 {
4772
+		data[i] = 0x12
4773 4773
 		i++
4774
-		i = encodeVarintTypes(data, i, uint64(m.Mode))
4774
+		i = encodeVarintTypes(data, i, uint64(len(m.SecretName)))
4775
+		i += copy(data[i:], m.SecretName)
4775 4776
 	}
4776
-	if len(m.Target) > 0 {
4777
+	if m.Target != nil {
4778
+		nn28, err := m.Target.MarshalTo(data[i:])
4779
+		if err != nil {
4780
+			return 0, err
4781
+		}
4782
+		i += nn28
4783
+	}
4784
+	return i, nil
4785
+}
4786
+
4787
+func (m *SecretReference_File) MarshalTo(data []byte) (int, error) {
4788
+	i := 0
4789
+	if m.File != nil {
4777 4790
 		data[i] = 0x1a
4778 4791
 		i++
4779
-		i = encodeVarintTypes(data, i, uint64(len(m.Target)))
4780
-		i += copy(data[i:], m.Target)
4792
+		i = encodeVarintTypes(data, i, uint64(m.File.Size()))
4793
+		n29, err := m.File.MarshalTo(data[i:])
4794
+		if err != nil {
4795
+			return 0, err
4796
+		}
4797
+		i += n29
4781 4798
 	}
4782
-	if len(m.SecretName) > 0 {
4783
-		data[i] = 0x22
4799
+	return i, nil
4800
+}
4801
+func (m *SecretReference_FileTarget) Marshal() (data []byte, err error) {
4802
+	size := m.Size()
4803
+	data = make([]byte, size)
4804
+	n, err := m.MarshalTo(data)
4805
+	if err != nil {
4806
+		return nil, err
4807
+	}
4808
+	return data[:n], nil
4809
+}
4810
+
4811
+func (m *SecretReference_FileTarget) MarshalTo(data []byte) (int, error) {
4812
+	var i int
4813
+	_ = i
4814
+	var l int
4815
+	_ = l
4816
+	if len(m.Name) > 0 {
4817
+		data[i] = 0xa
4784 4818
 		i++
4785
-		i = encodeVarintTypes(data, i, uint64(len(m.SecretName)))
4786
-		i += copy(data[i:], m.SecretName)
4819
+		i = encodeVarintTypes(data, i, uint64(len(m.Name)))
4820
+		i += copy(data[i:], m.Name)
4821
+	}
4822
+	if len(m.UID) > 0 {
4823
+		data[i] = 0x12
4824
+		i++
4825
+		i = encodeVarintTypes(data, i, uint64(len(m.UID)))
4826
+		i += copy(data[i:], m.UID)
4827
+	}
4828
+	if len(m.GID) > 0 {
4829
+		data[i] = 0x1a
4830
+		i++
4831
+		i = encodeVarintTypes(data, i, uint64(len(m.GID)))
4832
+		i += copy(data[i:], m.GID)
4833
+	}
4834
+	if m.Mode != 0 {
4835
+		data[i] = 0x20
4836
+		i++
4837
+		i = encodeVarintTypes(data, i, uint64(m.Mode))
4787 4838
 	}
4788 4839
 	return i, nil
4789 4840
 }
... ...
@@ -4807,11 +5045,11 @@ func (m *BlacklistedCertificate) MarshalTo(data []byte) (int, error) {
4807 4807
 		data[i] = 0xa
4808 4808
 		i++
4809 4809
 		i = encodeVarintTypes(data, i, uint64(m.Expiry.Size()))
4810
-		n28, err := m.Expiry.MarshalTo(data[i:])
4810
+		n30, err := m.Expiry.MarshalTo(data[i:])
4811 4811
 		if err != nil {
4812 4812
 			return 0, err
4813 4813
 		}
4814
-		i += n28
4814
+		i += n30
4815 4815
 	}
4816 4816
 	return i, nil
4817 4817
 }
... ...
@@ -4850,21 +5088,21 @@ func (m *HealthConfig) MarshalTo(data []byte) (int, error) {
4850 4850
 		data[i] = 0x12
4851 4851
 		i++
4852 4852
 		i = encodeVarintTypes(data, i, uint64(m.Interval.Size()))
4853
-		n29, err := m.Interval.MarshalTo(data[i:])
4853
+		n31, err := m.Interval.MarshalTo(data[i:])
4854 4854
 		if err != nil {
4855 4855
 			return 0, err
4856 4856
 		}
4857
-		i += n29
4857
+		i += n31
4858 4858
 	}
4859 4859
 	if m.Timeout != nil {
4860 4860
 		data[i] = 0x1a
4861 4861
 		i++
4862 4862
 		i = encodeVarintTypes(data, i, uint64(m.Timeout.Size()))
4863
-		n30, err := m.Timeout.MarshalTo(data[i:])
4863
+		n32, err := m.Timeout.MarshalTo(data[i:])
4864 4864
 		if err != nil {
4865 4865
 			return 0, err
4866 4866
 		}
4867
-		i += n30
4867
+		i += n32
4868 4868
 	}
4869 4869
 	if m.Retries != 0 {
4870 4870
 		data[i] = 0x20
... ...
@@ -4874,6 +5112,41 @@ func (m *HealthConfig) MarshalTo(data []byte) (int, error) {
4874 4874
 	return i, nil
4875 4875
 }
4876 4876
 
4877
+func (m *MaybeEncryptedRecord) Marshal() (data []byte, err error) {
4878
+	size := m.Size()
4879
+	data = make([]byte, size)
4880
+	n, err := m.MarshalTo(data)
4881
+	if err != nil {
4882
+		return nil, err
4883
+	}
4884
+	return data[:n], nil
4885
+}
4886
+
4887
+func (m *MaybeEncryptedRecord) MarshalTo(data []byte) (int, error) {
4888
+	var i int
4889
+	_ = i
4890
+	var l int
4891
+	_ = l
4892
+	if m.Algorithm != 0 {
4893
+		data[i] = 0x8
4894
+		i++
4895
+		i = encodeVarintTypes(data, i, uint64(m.Algorithm))
4896
+	}
4897
+	if len(m.Data) > 0 {
4898
+		data[i] = 0x12
4899
+		i++
4900
+		i = encodeVarintTypes(data, i, uint64(len(m.Data)))
4901
+		i += copy(data[i:], m.Data)
4902
+	}
4903
+	if len(m.Nonce) > 0 {
4904
+		data[i] = 0x1a
4905
+		i++
4906
+		i = encodeVarintTypes(data, i, uint64(len(m.Nonce)))
4907
+		i += copy(data[i:], m.Nonce)
4908
+	}
4909
+	return i, nil
4910
+}
4911
+
4877 4912
 func encodeFixed64Types(data []byte, offset int, v uint64) int {
4878 4913
 	data[offset] = uint8(v)
4879 4914
 	data[offset+1] = uint8(v >> 8)
... ...
@@ -5055,6 +5328,10 @@ func (m *NodeStatus) Size() (n int) {
5055 5055
 	if l > 0 {
5056 5056
 		n += 1 + l + sovTypes(uint64(l))
5057 5057
 	}
5058
+	l = len(m.Addr)
5059
+	if l > 0 {
5060
+		n += 1 + l + sovTypes(uint64(l))
5061
+	}
5058 5062
 	return n
5059 5063
 }
5060 5064
 
... ...
@@ -5660,17 +5937,43 @@ func (m *SecretReference) Size() (n int) {
5660 5660
 	if l > 0 {
5661 5661
 		n += 1 + l + sovTypes(uint64(l))
5662 5662
 	}
5663
-	if m.Mode != 0 {
5664
-		n += 1 + sovTypes(uint64(m.Mode))
5663
+	l = len(m.SecretName)
5664
+	if l > 0 {
5665
+		n += 1 + l + sovTypes(uint64(l))
5665 5666
 	}
5666
-	l = len(m.Target)
5667
+	if m.Target != nil {
5668
+		n += m.Target.Size()
5669
+	}
5670
+	return n
5671
+}
5672
+
5673
+func (m *SecretReference_File) Size() (n int) {
5674
+	var l int
5675
+	_ = l
5676
+	if m.File != nil {
5677
+		l = m.File.Size()
5678
+		n += 1 + l + sovTypes(uint64(l))
5679
+	}
5680
+	return n
5681
+}
5682
+func (m *SecretReference_FileTarget) Size() (n int) {
5683
+	var l int
5684
+	_ = l
5685
+	l = len(m.Name)
5667 5686
 	if l > 0 {
5668 5687
 		n += 1 + l + sovTypes(uint64(l))
5669 5688
 	}
5670
-	l = len(m.SecretName)
5689
+	l = len(m.UID)
5671 5690
 	if l > 0 {
5672 5691
 		n += 1 + l + sovTypes(uint64(l))
5673 5692
 	}
5693
+	l = len(m.GID)
5694
+	if l > 0 {
5695
+		n += 1 + l + sovTypes(uint64(l))
5696
+	}
5697
+	if m.Mode != 0 {
5698
+		n += 1 + sovTypes(uint64(m.Mode))
5699
+	}
5674 5700
 	return n
5675 5701
 }
5676 5702
 
... ...
@@ -5707,6 +6010,23 @@ func (m *HealthConfig) Size() (n int) {
5707 5707
 	return n
5708 5708
 }
5709 5709
 
5710
+func (m *MaybeEncryptedRecord) Size() (n int) {
5711
+	var l int
5712
+	_ = l
5713
+	if m.Algorithm != 0 {
5714
+		n += 1 + sovTypes(uint64(m.Algorithm))
5715
+	}
5716
+	l = len(m.Data)
5717
+	if l > 0 {
5718
+		n += 1 + l + sovTypes(uint64(l))
5719
+	}
5720
+	l = len(m.Nonce)
5721
+	if l > 0 {
5722
+		n += 1 + l + sovTypes(uint64(l))
5723
+	}
5724
+	return n
5725
+}
5726
+
5710 5727
 func sovTypes(x uint64) (n int) {
5711 5728
 	for {
5712 5729
 		n++
... ...
@@ -5849,6 +6169,7 @@ func (this *NodeStatus) String() string {
5849 5849
 	s := strings.Join([]string{`&NodeStatus{`,
5850 5850
 		`State:` + fmt.Sprintf("%v", this.State) + `,`,
5851 5851
 		`Message:` + fmt.Sprintf("%v", this.Message) + `,`,
5852
+		`Addr:` + fmt.Sprintf("%v", this.Addr) + `,`,
5852 5853
 		`}`,
5853 5854
 	}, "")
5854 5855
 	return s
... ...
@@ -6314,9 +6635,31 @@ func (this *SecretReference) String() string {
6314 6314
 	}
6315 6315
 	s := strings.Join([]string{`&SecretReference{`,
6316 6316
 		`SecretID:` + fmt.Sprintf("%v", this.SecretID) + `,`,
6317
-		`Mode:` + fmt.Sprintf("%v", this.Mode) + `,`,
6318
-		`Target:` + fmt.Sprintf("%v", this.Target) + `,`,
6319 6317
 		`SecretName:` + fmt.Sprintf("%v", this.SecretName) + `,`,
6318
+		`Target:` + fmt.Sprintf("%v", this.Target) + `,`,
6319
+		`}`,
6320
+	}, "")
6321
+	return s
6322
+}
6323
+func (this *SecretReference_File) String() string {
6324
+	if this == nil {
6325
+		return "nil"
6326
+	}
6327
+	s := strings.Join([]string{`&SecretReference_File{`,
6328
+		`File:` + strings.Replace(fmt.Sprintf("%v", this.File), "SecretReference_FileTarget", "SecretReference_FileTarget", 1) + `,`,
6329
+		`}`,
6330
+	}, "")
6331
+	return s
6332
+}
6333
+func (this *SecretReference_FileTarget) String() string {
6334
+	if this == nil {
6335
+		return "nil"
6336
+	}
6337
+	s := strings.Join([]string{`&SecretReference_FileTarget{`,
6338
+		`Name:` + fmt.Sprintf("%v", this.Name) + `,`,
6339
+		`UID:` + fmt.Sprintf("%v", this.UID) + `,`,
6340
+		`GID:` + fmt.Sprintf("%v", this.GID) + `,`,
6341
+		`Mode:` + fmt.Sprintf("%v", this.Mode) + `,`,
6320 6342
 		`}`,
6321 6343
 	}, "")
6322 6344
 	return s
... ...
@@ -6344,6 +6687,18 @@ func (this *HealthConfig) String() string {
6344 6344
 	}, "")
6345 6345
 	return s
6346 6346
 }
6347
+func (this *MaybeEncryptedRecord) String() string {
6348
+	if this == nil {
6349
+		return "nil"
6350
+	}
6351
+	s := strings.Join([]string{`&MaybeEncryptedRecord{`,
6352
+		`Algorithm:` + fmt.Sprintf("%v", this.Algorithm) + `,`,
6353
+		`Data:` + fmt.Sprintf("%v", this.Data) + `,`,
6354
+		`Nonce:` + fmt.Sprintf("%v", this.Nonce) + `,`,
6355
+		`}`,
6356
+	}, "")
6357
+	return s
6358
+}
6347 6359
 func valueToStringTypes(v interface{}) string {
6348 6360
 	rv := reflect.ValueOf(v)
6349 6361
 	if rv.IsNil() {
... ...
@@ -7635,6 +7990,35 @@ func (m *NodeStatus) Unmarshal(data []byte) error {
7635 7635
 			}
7636 7636
 			m.Message = string(data[iNdEx:postIndex])
7637 7637
 			iNdEx = postIndex
7638
+		case 3:
7639
+			if wireType != 2 {
7640
+				return fmt.Errorf("proto: wrong wireType = %d for field Addr", wireType)
7641
+			}
7642
+			var stringLen uint64
7643
+			for shift := uint(0); ; shift += 7 {
7644
+				if shift >= 64 {
7645
+					return ErrIntOverflowTypes
7646
+				}
7647
+				if iNdEx >= l {
7648
+					return io.ErrUnexpectedEOF
7649
+				}
7650
+				b := data[iNdEx]
7651
+				iNdEx++
7652
+				stringLen |= (uint64(b) & 0x7F) << shift
7653
+				if b < 0x80 {
7654
+					break
7655
+				}
7656
+			}
7657
+			intStringLen := int(stringLen)
7658
+			if intStringLen < 0 {
7659
+				return ErrInvalidLengthTypes
7660
+			}
7661
+			postIndex := iNdEx + intStringLen
7662
+			if postIndex > l {
7663
+				return io.ErrUnexpectedEOF
7664
+			}
7665
+			m.Addr = string(data[iNdEx:postIndex])
7666
+			iNdEx = postIndex
7638 7667
 		default:
7639 7668
 			iNdEx = preIndex
7640 7669
 			skippy, err := skipTypes(data[iNdEx:])
... ...
@@ -12357,10 +12741,10 @@ func (m *SecretReference) Unmarshal(data []byte) error {
12357 12357
 			m.SecretID = string(data[iNdEx:postIndex])
12358 12358
 			iNdEx = postIndex
12359 12359
 		case 2:
12360
-			if wireType != 0 {
12361
-				return fmt.Errorf("proto: wrong wireType = %d for field Mode", wireType)
12360
+			if wireType != 2 {
12361
+				return fmt.Errorf("proto: wrong wireType = %d for field SecretName", wireType)
12362 12362
 			}
12363
-			m.Mode = 0
12363
+			var stringLen uint64
12364 12364
 			for shift := uint(0); ; shift += 7 {
12365 12365
 				if shift >= 64 {
12366 12366
 					return ErrIntOverflowTypes
... ...
@@ -12370,14 +12754,106 @@ func (m *SecretReference) Unmarshal(data []byte) error {
12370 12370
 				}
12371 12371
 				b := data[iNdEx]
12372 12372
 				iNdEx++
12373
-				m.Mode |= (SecretReference_Mode(b) & 0x7F) << shift
12373
+				stringLen |= (uint64(b) & 0x7F) << shift
12374 12374
 				if b < 0x80 {
12375 12375
 					break
12376 12376
 				}
12377 12377
 			}
12378
+			intStringLen := int(stringLen)
12379
+			if intStringLen < 0 {
12380
+				return ErrInvalidLengthTypes
12381
+			}
12382
+			postIndex := iNdEx + intStringLen
12383
+			if postIndex > l {
12384
+				return io.ErrUnexpectedEOF
12385
+			}
12386
+			m.SecretName = string(data[iNdEx:postIndex])
12387
+			iNdEx = postIndex
12378 12388
 		case 3:
12379 12389
 			if wireType != 2 {
12380
-				return fmt.Errorf("proto: wrong wireType = %d for field Target", wireType)
12390
+				return fmt.Errorf("proto: wrong wireType = %d for field File", wireType)
12391
+			}
12392
+			var msglen int
12393
+			for shift := uint(0); ; shift += 7 {
12394
+				if shift >= 64 {
12395
+					return ErrIntOverflowTypes
12396
+				}
12397
+				if iNdEx >= l {
12398
+					return io.ErrUnexpectedEOF
12399
+				}
12400
+				b := data[iNdEx]
12401
+				iNdEx++
12402
+				msglen |= (int(b) & 0x7F) << shift
12403
+				if b < 0x80 {
12404
+					break
12405
+				}
12406
+			}
12407
+			if msglen < 0 {
12408
+				return ErrInvalidLengthTypes
12409
+			}
12410
+			postIndex := iNdEx + msglen
12411
+			if postIndex > l {
12412
+				return io.ErrUnexpectedEOF
12413
+			}
12414
+			v := &SecretReference_FileTarget{}
12415
+			if err := v.Unmarshal(data[iNdEx:postIndex]); err != nil {
12416
+				return err
12417
+			}
12418
+			m.Target = &SecretReference_File{v}
12419
+			iNdEx = postIndex
12420
+		default:
12421
+			iNdEx = preIndex
12422
+			skippy, err := skipTypes(data[iNdEx:])
12423
+			if err != nil {
12424
+				return err
12425
+			}
12426
+			if skippy < 0 {
12427
+				return ErrInvalidLengthTypes
12428
+			}
12429
+			if (iNdEx + skippy) > l {
12430
+				return io.ErrUnexpectedEOF
12431
+			}
12432
+			iNdEx += skippy
12433
+		}
12434
+	}
12435
+
12436
+	if iNdEx > l {
12437
+		return io.ErrUnexpectedEOF
12438
+	}
12439
+	return nil
12440
+}
12441
+func (m *SecretReference_FileTarget) Unmarshal(data []byte) error {
12442
+	l := len(data)
12443
+	iNdEx := 0
12444
+	for iNdEx < l {
12445
+		preIndex := iNdEx
12446
+		var wire uint64
12447
+		for shift := uint(0); ; shift += 7 {
12448
+			if shift >= 64 {
12449
+				return ErrIntOverflowTypes
12450
+			}
12451
+			if iNdEx >= l {
12452
+				return io.ErrUnexpectedEOF
12453
+			}
12454
+			b := data[iNdEx]
12455
+			iNdEx++
12456
+			wire |= (uint64(b) & 0x7F) << shift
12457
+			if b < 0x80 {
12458
+				break
12459
+			}
12460
+		}
12461
+		fieldNum := int32(wire >> 3)
12462
+		wireType := int(wire & 0x7)
12463
+		if wireType == 4 {
12464
+			return fmt.Errorf("proto: FileTarget: wiretype end group for non-group")
12465
+		}
12466
+		if fieldNum <= 0 {
12467
+			return fmt.Errorf("proto: FileTarget: illegal tag %d (wire type %d)", fieldNum, wire)
12468
+		}
12469
+		switch fieldNum {
12470
+		case 1:
12471
+			if wireType != 2 {
12472
+				return fmt.Errorf("proto: wrong wireType = %d for field Name", wireType)
12381 12473
 			}
12382 12474
 			var stringLen uint64
12383 12475
 			for shift := uint(0); ; shift += 7 {
... ...
@@ -12402,11 +12878,11 @@ func (m *SecretReference) Unmarshal(data []byte) error {
12402 12402
 			if postIndex > l {
12403 12403
 				return io.ErrUnexpectedEOF
12404 12404
 			}
12405
-			m.Target = string(data[iNdEx:postIndex])
12405
+			m.Name = string(data[iNdEx:postIndex])
12406 12406
 			iNdEx = postIndex
12407
-		case 4:
12407
+		case 2:
12408 12408
 			if wireType != 2 {
12409
-				return fmt.Errorf("proto: wrong wireType = %d for field SecretName", wireType)
12409
+				return fmt.Errorf("proto: wrong wireType = %d for field UID", wireType)
12410 12410
 			}
12411 12411
 			var stringLen uint64
12412 12412
 			for shift := uint(0); ; shift += 7 {
... ...
@@ -12431,8 +12907,56 @@ func (m *SecretReference) Unmarshal(data []byte) error {
12431 12431
 			if postIndex > l {
12432 12432
 				return io.ErrUnexpectedEOF
12433 12433
 			}
12434
-			m.SecretName = string(data[iNdEx:postIndex])
12434
+			m.UID = string(data[iNdEx:postIndex])
12435 12435
 			iNdEx = postIndex
12436
+		case 3:
12437
+			if wireType != 2 {
12438
+				return fmt.Errorf("proto: wrong wireType = %d for field GID", wireType)
12439
+			}
12440
+			var stringLen uint64
12441
+			for shift := uint(0); ; shift += 7 {
12442
+				if shift >= 64 {
12443
+					return ErrIntOverflowTypes
12444
+				}
12445
+				if iNdEx >= l {
12446
+					return io.ErrUnexpectedEOF
12447
+				}
12448
+				b := data[iNdEx]
12449
+				iNdEx++
12450
+				stringLen |= (uint64(b) & 0x7F) << shift
12451
+				if b < 0x80 {
12452
+					break
12453
+				}
12454
+			}
12455
+			intStringLen := int(stringLen)
12456
+			if intStringLen < 0 {
12457
+				return ErrInvalidLengthTypes
12458
+			}
12459
+			postIndex := iNdEx + intStringLen
12460
+			if postIndex > l {
12461
+				return io.ErrUnexpectedEOF
12462
+			}
12463
+			m.GID = string(data[iNdEx:postIndex])
12464
+			iNdEx = postIndex
12465
+		case 4:
12466
+			if wireType != 0 {
12467
+				return fmt.Errorf("proto: wrong wireType = %d for field Mode", wireType)
12468
+			}
12469
+			m.Mode = 0
12470
+			for shift := uint(0); ; shift += 7 {
12471
+				if shift >= 64 {
12472
+					return ErrIntOverflowTypes
12473
+				}
12474
+				if iNdEx >= l {
12475
+					return io.ErrUnexpectedEOF
12476
+				}
12477
+				b := data[iNdEx]
12478
+				iNdEx++
12479
+				m.Mode |= (os.FileMode(b) & 0x7F) << shift
12480
+				if b < 0x80 {
12481
+					break
12482
+				}
12483
+			}
12436 12484
 		default:
12437 12485
 			iNdEx = preIndex
12438 12486
 			skippy, err := skipTypes(data[iNdEx:])
... ...
@@ -12701,6 +13225,137 @@ func (m *HealthConfig) Unmarshal(data []byte) error {
12701 12701
 	}
12702 12702
 	return nil
12703 12703
 }
12704
+func (m *MaybeEncryptedRecord) Unmarshal(data []byte) error {
12705
+	l := len(data)
12706
+	iNdEx := 0
12707
+	for iNdEx < l {
12708
+		preIndex := iNdEx
12709
+		var wire uint64
12710
+		for shift := uint(0); ; shift += 7 {
12711
+			if shift >= 64 {
12712
+				return ErrIntOverflowTypes
12713
+			}
12714
+			if iNdEx >= l {
12715
+				return io.ErrUnexpectedEOF
12716
+			}
12717
+			b := data[iNdEx]
12718
+			iNdEx++
12719
+			wire |= (uint64(b) & 0x7F) << shift
12720
+			if b < 0x80 {
12721
+				break
12722
+			}
12723
+		}
12724
+		fieldNum := int32(wire >> 3)
12725
+		wireType := int(wire & 0x7)
12726
+		if wireType == 4 {
12727
+			return fmt.Errorf("proto: MaybeEncryptedRecord: wiretype end group for non-group")
12728
+		}
12729
+		if fieldNum <= 0 {
12730
+			return fmt.Errorf("proto: MaybeEncryptedRecord: illegal tag %d (wire type %d)", fieldNum, wire)
12731
+		}
12732
+		switch fieldNum {
12733
+		case 1:
12734
+			if wireType != 0 {
12735
+				return fmt.Errorf("proto: wrong wireType = %d for field Algorithm", wireType)
12736
+			}
12737
+			m.Algorithm = 0
12738
+			for shift := uint(0); ; shift += 7 {
12739
+				if shift >= 64 {
12740
+					return ErrIntOverflowTypes
12741
+				}
12742
+				if iNdEx >= l {
12743
+					return io.ErrUnexpectedEOF
12744
+				}
12745
+				b := data[iNdEx]
12746
+				iNdEx++
12747
+				m.Algorithm |= (MaybeEncryptedRecord_Algorithm(b) & 0x7F) << shift
12748
+				if b < 0x80 {
12749
+					break
12750
+				}
12751
+			}
12752
+		case 2:
12753
+			if wireType != 2 {
12754
+				return fmt.Errorf("proto: wrong wireType = %d for field Data", wireType)
12755
+			}
12756
+			var byteLen int
12757
+			for shift := uint(0); ; shift += 7 {
12758
+				if shift >= 64 {
12759
+					return ErrIntOverflowTypes
12760
+				}
12761
+				if iNdEx >= l {
12762
+					return io.ErrUnexpectedEOF
12763
+				}
12764
+				b := data[iNdEx]
12765
+				iNdEx++
12766
+				byteLen |= (int(b) & 0x7F) << shift
12767
+				if b < 0x80 {
12768
+					break
12769
+				}
12770
+			}
12771
+			if byteLen < 0 {
12772
+				return ErrInvalidLengthTypes
12773
+			}
12774
+			postIndex := iNdEx + byteLen
12775
+			if postIndex > l {
12776
+				return io.ErrUnexpectedEOF
12777
+			}
12778
+			m.Data = append(m.Data[:0], data[iNdEx:postIndex]...)
12779
+			if m.Data == nil {
12780
+				m.Data = []byte{}
12781
+			}
12782
+			iNdEx = postIndex
12783
+		case 3:
12784
+			if wireType != 2 {
12785
+				return fmt.Errorf("proto: wrong wireType = %d for field Nonce", wireType)
12786
+			}
12787
+			var byteLen int
12788
+			for shift := uint(0); ; shift += 7 {
12789
+				if shift >= 64 {
12790
+					return ErrIntOverflowTypes
12791
+				}
12792
+				if iNdEx >= l {
12793
+					return io.ErrUnexpectedEOF
12794
+				}
12795
+				b := data[iNdEx]
12796
+				iNdEx++
12797
+				byteLen |= (int(b) & 0x7F) << shift
12798
+				if b < 0x80 {
12799
+					break
12800
+				}
12801
+			}
12802
+			if byteLen < 0 {
12803
+				return ErrInvalidLengthTypes
12804
+			}
12805
+			postIndex := iNdEx + byteLen
12806
+			if postIndex > l {
12807
+				return io.ErrUnexpectedEOF
12808
+			}
12809
+			m.Nonce = append(m.Nonce[:0], data[iNdEx:postIndex]...)
12810
+			if m.Nonce == nil {
12811
+				m.Nonce = []byte{}
12812
+			}
12813
+			iNdEx = postIndex
12814
+		default:
12815
+			iNdEx = preIndex
12816
+			skippy, err := skipTypes(data[iNdEx:])
12817
+			if err != nil {
12818
+				return err
12819
+			}
12820
+			if skippy < 0 {
12821
+				return ErrInvalidLengthTypes
12822
+			}
12823
+			if (iNdEx + skippy) > l {
12824
+				return io.ErrUnexpectedEOF
12825
+			}
12826
+			iNdEx += skippy
12827
+		}
12828
+	}
12829
+
12830
+	if iNdEx > l {
12831
+		return io.ErrUnexpectedEOF
12832
+	}
12833
+	return nil
12834
+}
12704 12835
 func skipTypes(data []byte) (n int, err error) {
12705 12836
 	l := len(data)
12706 12837
 	iNdEx := 0
... ...
@@ -12809,242 +13464,251 @@ var (
12809 12809
 func init() { proto.RegisterFile("types.proto", fileDescriptorTypes) }
12810 12810
 
12811 12811
 var fileDescriptorTypes = []byte{
12812
-	// 3787 bytes of a gzipped FileDescriptorProto
12813
-	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0xac, 0x59, 0x4d, 0x6c, 0x23, 0x47,
12814
-	0x76, 0x16, 0x7f, 0x45, 0x3e, 0x52, 0x52, 0x4f, 0xcd, 0xec, 0x58, 0x43, 0x8f, 0x25, 0xba, 0xc7,
12815
-	0xb3, 0x1e, 0xcf, 0x3a, 0xb4, 0x2d, 0x7b, 0x8d, 0x59, 0xcf, 0x66, 0xc7, 0xcd, 0x1f, 0x8d, 0xb8,
12816
-	0x23, 0x51, 0x44, 0x91, 0x9a, 0x81, 0x11, 0x20, 0x44, 0xa9, 0xbb, 0x44, 0xb5, 0xd5, 0xec, 0x66,
12817
-	0xba, 0x8b, 0xd2, 0x30, 0x41, 0x80, 0x41, 0x0e, 0x49, 0xa0, 0x53, 0xee, 0x81, 0xb0, 0x08, 0x12,
12818
-	0xe4, 0x90, 0x43, 0xae, 0x01, 0x72, 0x32, 0x72, 0xf2, 0x2d, 0x9b, 0x04, 0x08, 0x16, 0x1b, 0x64,
12819
-	0x10, 0x2b, 0xe7, 0x00, 0x7b, 0x09, 0x72, 0x48, 0x0e, 0x41, 0xfd, 0x74, 0xb3, 0xc9, 0xa1, 0x34,
12820
-	0xf2, 0xae, 0x2f, 0x64, 0xd7, 0xab, 0xef, 0xbd, 0xfa, 0x7b, 0xf5, 0xea, 0x7b, 0x55, 0x50, 0x60,
12821
-	0xe3, 0x21, 0x0d, 0x2a, 0x43, 0xdf, 0x63, 0x1e, 0x42, 0x96, 0x67, 0x1e, 0x51, 0xbf, 0x12, 0x9c,
12822
-	0x10, 0x7f, 0x70, 0x64, 0xb3, 0xca, 0xf1, 0x47, 0xa5, 0x5b, 0xcc, 0x1e, 0xd0, 0x80, 0x91, 0xc1,
12823
-	0xf0, 0x83, 0xe8, 0x4b, 0xc2, 0x4b, 0x6f, 0x58, 0x23, 0x9f, 0x30, 0xdb, 0x73, 0x3f, 0x08, 0x3f,
12824
-	0x54, 0xc5, 0x8d, 0xbe, 0xd7, 0xf7, 0xc4, 0xe7, 0x07, 0xfc, 0x4b, 0x4a, 0xf5, 0x75, 0x58, 0x7c,
12825
-	0x4a, 0xfd, 0xc0, 0xf6, 0x5c, 0x74, 0x03, 0x32, 0xb6, 0x6b, 0xd1, 0xe7, 0xab, 0x89, 0x72, 0xe2,
12826
-	0x5e, 0x1a, 0xcb, 0x82, 0xfe, 0x17, 0x09, 0x28, 0x18, 0xae, 0xeb, 0x31, 0x61, 0x2b, 0x40, 0x08,
12827
-	0xd2, 0x2e, 0x19, 0x50, 0x01, 0xca, 0x63, 0xf1, 0x8d, 0x6a, 0x90, 0x75, 0xc8, 0x3e, 0x75, 0x82,
12828
-	0xd5, 0x64, 0x39, 0x75, 0xaf, 0xb0, 0xf1, 0x83, 0xca, 0xab, 0x7d, 0xae, 0xc4, 0x8c, 0x54, 0xb6,
12829
-	0x05, 0xba, 0xe1, 0x32, 0x7f, 0x8c, 0x95, 0x6a, 0xe9, 0x47, 0x50, 0x88, 0x89, 0x91, 0x06, 0xa9,
12830
-	0x23, 0x3a, 0x56, 0xcd, 0xf0, 0x4f, 0xde, 0xbf, 0x63, 0xe2, 0x8c, 0xe8, 0x6a, 0x52, 0xc8, 0x64,
12831
-	0xe1, 0xb3, 0xe4, 0x83, 0x84, 0xfe, 0x05, 0xe4, 0x31, 0x0d, 0xbc, 0x91, 0x6f, 0xd2, 0x00, 0xbd,
12832
-	0x07, 0x79, 0x97, 0xb8, 0x5e, 0xcf, 0x1c, 0x8e, 0x02, 0xa1, 0x9e, 0xaa, 0x16, 0xcf, 0x5f, 0xae,
12833
-	0xe7, 0x5a, 0xc4, 0xf5, 0x6a, 0xed, 0xbd, 0x00, 0xe7, 0x78, 0x75, 0x6d, 0x38, 0x0a, 0xd0, 0xdb,
12834
-	0x50, 0x1c, 0xd0, 0x81, 0xe7, 0x8f, 0x7b, 0xfb, 0x63, 0x46, 0x03, 0x61, 0x38, 0x85, 0x0b, 0x52,
12835
-	0x56, 0xe5, 0x22, 0xfd, 0xcf, 0x12, 0x70, 0x23, 0xb4, 0x8d, 0xe9, 0xef, 0x8d, 0x6c, 0x9f, 0x0e,
12836
-	0xa8, 0xcb, 0x02, 0xf4, 0x43, 0xc8, 0x3a, 0xf6, 0xc0, 0x66, 0xb2, 0x8d, 0xc2, 0xc6, 0x5b, 0xf3,
12837
-	0xc6, 0x1c, 0xf5, 0x0a, 0x2b, 0x30, 0x32, 0xa0, 0xe8, 0xd3, 0x80, 0xfa, 0xc7, 0x72, 0x26, 0x44,
12838
-	0x93, 0xaf, 0x55, 0x9e, 0x52, 0xd1, 0x37, 0x21, 0xd7, 0x76, 0x08, 0x3b, 0xf0, 0xfc, 0x01, 0xd2,
12839
-	0xa1, 0x48, 0x7c, 0xf3, 0xd0, 0x66, 0xd4, 0x64, 0x23, 0x3f, 0x5c, 0x95, 0x29, 0x19, 0xba, 0x09,
12840
-	0x49, 0x4f, 0x36, 0x94, 0xaf, 0x66, 0xcf, 0x5f, 0xae, 0x27, 0x77, 0x3b, 0x38, 0xe9, 0x05, 0xfa,
12841
-	0x43, 0xb8, 0xd6, 0x76, 0x46, 0x7d, 0xdb, 0xad, 0xd3, 0xc0, 0xf4, 0xed, 0x21, 0xb7, 0xce, 0x97,
12842
-	0x97, 0x3b, 0x5f, 0xb8, 0xbc, 0xfc, 0x3b, 0x5a, 0xf2, 0xe4, 0x64, 0xc9, 0xf5, 0x3f, 0x49, 0xc2,
12843
-	0xb5, 0x86, 0xdb, 0xb7, 0x5d, 0x1a, 0xd7, 0xbe, 0x0b, 0xcb, 0x54, 0x08, 0x7b, 0xc7, 0xd2, 0xa9,
12844
-	0x94, 0x9d, 0x25, 0x29, 0x0d, 0x3d, 0xad, 0x39, 0xe3, 0x2f, 0x1f, 0xcd, 0x1b, 0xfe, 0x2b, 0xd6,
12845
-	0xe7, 0x79, 0x0d, 0x6a, 0xc0, 0xe2, 0x50, 0x0c, 0x22, 0x58, 0x4d, 0x09, 0x5b, 0x77, 0xe7, 0xd9,
12846
-	0x7a, 0x65, 0x9c, 0xd5, 0xf4, 0xd7, 0x2f, 0xd7, 0x17, 0x70, 0xa8, 0xfb, 0x9b, 0x38, 0xdf, 0x7f,
12847
-	0x26, 0x60, 0xa5, 0xe5, 0x59, 0x53, 0xf3, 0x50, 0x82, 0xdc, 0xa1, 0x17, 0xb0, 0xd8, 0x46, 0x89,
12848
-	0xca, 0xe8, 0x01, 0xe4, 0x86, 0x6a, 0xf9, 0xd4, 0xea, 0xdf, 0x9e, 0xdf, 0x65, 0x89, 0xc1, 0x11,
12849
-	0x1a, 0x3d, 0x84, 0xbc, 0x1f, 0xfa, 0xc4, 0x6a, 0xea, 0x2a, 0x8e, 0x33, 0xc1, 0xa3, 0xdf, 0x86,
12850
-	0xac, 0x5c, 0x84, 0xd5, 0xb4, 0xd0, 0xbc, 0x7b, 0xa5, 0x39, 0xc7, 0x4a, 0x49, 0xff, 0x45, 0x02,
12851
-	0x34, 0x4c, 0x0e, 0xd8, 0x0e, 0x1d, 0xec, 0x53, 0xbf, 0xc3, 0x08, 0x1b, 0x05, 0xe8, 0x26, 0x64,
12852
-	0x1d, 0x4a, 0x2c, 0xea, 0x8b, 0x41, 0xe6, 0xb0, 0x2a, 0xa1, 0x3d, 0xee, 0xe4, 0xc4, 0x3c, 0x24,
12853
-	0xfb, 0xb6, 0x63, 0xb3, 0xb1, 0x18, 0xe6, 0xf2, 0xfc, 0x55, 0x9e, 0xb5, 0x59, 0xc1, 0x31, 0x45,
12854
-	0x3c, 0x65, 0x06, 0xad, 0xc2, 0xe2, 0x80, 0x06, 0x01, 0xe9, 0x53, 0x31, 0xfa, 0x3c, 0x0e, 0x8b,
12855
-	0xfa, 0x43, 0x28, 0xc6, 0xf5, 0x50, 0x01, 0x16, 0xf7, 0x5a, 0x4f, 0x5a, 0xbb, 0xcf, 0x5a, 0xda,
12856
-	0x02, 0x5a, 0x81, 0xc2, 0x5e, 0x0b, 0x37, 0x8c, 0xda, 0x96, 0x51, 0xdd, 0x6e, 0x68, 0x09, 0xb4,
12857
-	0x04, 0xf9, 0x49, 0x31, 0xa9, 0xff, 0x2c, 0x01, 0xc0, 0x17, 0x50, 0x0d, 0xea, 0x33, 0xc8, 0x04,
12858
-	0x8c, 0x30, 0xb9, 0x70, 0xcb, 0x1b, 0xef, 0xcc, 0xeb, 0xf5, 0x04, 0x5e, 0xe1, 0x7f, 0x14, 0x4b,
12859
-	0x95, 0x78, 0x0f, 0x93, 0xb3, 0x3d, 0xcc, 0x08, 0xe4, 0x74, 0xd7, 0x72, 0x90, 0xae, 0xf3, 0xaf,
12860
-	0x04, 0xca, 0x43, 0x06, 0x37, 0x8c, 0xfa, 0x17, 0x5a, 0x12, 0x69, 0x50, 0xac, 0x37, 0x3b, 0xb5,
12861
-	0xdd, 0x56, 0xab, 0x51, 0xeb, 0x36, 0xea, 0x5a, 0x4a, 0xbf, 0x0b, 0x99, 0xe6, 0x80, 0xf4, 0x29,
12862
-	0xba, 0xcd, 0x3d, 0xe0, 0x80, 0xfa, 0xd4, 0x35, 0x43, 0xc7, 0x9a, 0x08, 0xf4, 0x9f, 0xe7, 0x21,
12863
-	0xb3, 0xe3, 0x8d, 0x5c, 0x86, 0x36, 0x62, 0xbb, 0x78, 0x79, 0x63, 0x6d, 0xde, 0x10, 0x04, 0xb0,
12864
-	0xd2, 0x1d, 0x0f, 0xa9, 0xda, 0xe5, 0x37, 0x21, 0x2b, 0x7d, 0x45, 0x75, 0x5d, 0x95, 0xb8, 0x9c,
12865
-	0x11, 0xbf, 0x4f, 0x99, 0x9a, 0x74, 0x55, 0x42, 0xf7, 0x20, 0xe7, 0x53, 0x62, 0x79, 0xae, 0x33,
12866
-	0x16, 0x2e, 0x95, 0x93, 0x61, 0x16, 0x53, 0x62, 0xed, 0xba, 0xce, 0x18, 0x47, 0xb5, 0x68, 0x0b,
12867
-	0x8a, 0xfb, 0xb6, 0x6b, 0xf5, 0xbc, 0xa1, 0x8c, 0x79, 0x99, 0x8b, 0x1d, 0x50, 0xf6, 0xaa, 0x6a,
12868
-	0xbb, 0xd6, 0xae, 0x04, 0xe3, 0xc2, 0xfe, 0xa4, 0x80, 0x5a, 0xb0, 0x7c, 0xec, 0x39, 0xa3, 0x01,
12869
-	0x8d, 0x6c, 0x65, 0x85, 0xad, 0x77, 0x2f, 0xb6, 0xf5, 0x54, 0xe0, 0x43, 0x6b, 0x4b, 0xc7, 0xf1,
12870
-	0x22, 0x7a, 0x02, 0x4b, 0x6c, 0x30, 0x3c, 0x08, 0x22, 0x73, 0x8b, 0xc2, 0xdc, 0xf7, 0x2f, 0x99,
12871
-	0x30, 0x0e, 0x0f, 0xad, 0x15, 0x59, 0xac, 0x54, 0xfa, 0xa3, 0x14, 0x14, 0x62, 0x3d, 0x47, 0x1d,
12872
-	0x28, 0x0c, 0x7d, 0x6f, 0x48, 0xfa, 0x22, 0x6e, 0xab, 0xb5, 0xf8, 0xe8, 0x4a, 0xa3, 0xae, 0xb4,
12873
-	0x27, 0x8a, 0x38, 0x6e, 0x45, 0x3f, 0x4b, 0x42, 0x21, 0x56, 0x89, 0xee, 0x43, 0x0e, 0xb7, 0x71,
12874
-	0xf3, 0xa9, 0xd1, 0x6d, 0x68, 0x0b, 0xa5, 0xdb, 0xa7, 0x67, 0xe5, 0x55, 0x61, 0x2d, 0x6e, 0xa0,
12875
-	0xed, 0xdb, 0xc7, 0xdc, 0xf5, 0xee, 0xc1, 0x62, 0x08, 0x4d, 0x94, 0xde, 0x3c, 0x3d, 0x2b, 0xbf,
12876
-	0x31, 0x0b, 0x8d, 0x21, 0x71, 0x67, 0xcb, 0xc0, 0x8d, 0xba, 0x96, 0x9c, 0x8f, 0xc4, 0x9d, 0x43,
12877
-	0xe2, 0x53, 0x0b, 0x7d, 0x1f, 0xb2, 0x0a, 0x98, 0x2a, 0x95, 0x4e, 0xcf, 0xca, 0x37, 0x67, 0x81,
12878
-	0x13, 0x1c, 0xee, 0x6c, 0x1b, 0x4f, 0x1b, 0x5a, 0x7a, 0x3e, 0x0e, 0x77, 0x1c, 0x72, 0x4c, 0xd1,
12879
-	0x3b, 0x90, 0x91, 0xb0, 0x4c, 0xe9, 0xd6, 0xe9, 0x59, 0xf9, 0x7b, 0xaf, 0x98, 0xe3, 0xa8, 0xd2,
12880
-	0xea, 0x9f, 0xfe, 0xe5, 0xda, 0xc2, 0xdf, 0xff, 0xd5, 0x9a, 0x36, 0x5b, 0x5d, 0xfa, 0xbf, 0x04,
12881
-	0x2c, 0x4d, 0x2d, 0x39, 0xd2, 0x21, 0xeb, 0x7a, 0xa6, 0x37, 0x94, 0xe1, 0x3c, 0x57, 0x85, 0xf3,
12882
-	0x97, 0xeb, 0xd9, 0x96, 0x57, 0xf3, 0x86, 0x63, 0xac, 0x6a, 0xd0, 0x93, 0x99, 0x03, 0xe9, 0xe3,
12883
-	0x2b, 0xfa, 0xd3, 0xdc, 0x23, 0xe9, 0x11, 0x2c, 0x59, 0xbe, 0x7d, 0x4c, 0xfd, 0x9e, 0xe9, 0xb9,
12884
-	0x07, 0x76, 0x5f, 0x85, 0xea, 0xd2, 0x3c, 0x9b, 0x75, 0x01, 0xc4, 0x45, 0xa9, 0x50, 0x13, 0xf8,
12885
-	0xdf, 0xe0, 0x30, 0x2a, 0x3d, 0x85, 0x62, 0xdc, 0x43, 0xd1, 0x5b, 0x00, 0x81, 0xfd, 0xfb, 0x54,
12886
-	0xf1, 0x1b, 0xc1, 0x86, 0x70, 0x9e, 0x4b, 0x04, 0xbb, 0x41, 0xef, 0x42, 0x7a, 0xe0, 0x59, 0xd2,
12887
-	0x4e, 0xa6, 0x7a, 0x9d, 0x9f, 0x89, 0xbf, 0x7c, 0xb9, 0x5e, 0xf0, 0x82, 0xca, 0xa6, 0xed, 0xd0,
12888
-	0x1d, 0xcf, 0xa2, 0x58, 0x00, 0xf4, 0x63, 0x48, 0xf3, 0x50, 0x81, 0xde, 0x84, 0x74, 0xb5, 0xd9,
12889
-	0xaa, 0x6b, 0x0b, 0xa5, 0x6b, 0xa7, 0x67, 0xe5, 0x25, 0x31, 0x25, 0xbc, 0x82, 0xfb, 0x2e, 0x5a,
12890
-	0x87, 0xec, 0xd3, 0xdd, 0xed, 0xbd, 0x1d, 0xee, 0x5e, 0xd7, 0x4f, 0xcf, 0xca, 0x2b, 0x51, 0xb5,
12891
-	0x9c, 0x34, 0xf4, 0x16, 0x64, 0xba, 0x3b, 0xed, 0xcd, 0x8e, 0x96, 0x2c, 0xa1, 0xd3, 0xb3, 0xf2,
12892
-	0x72, 0x54, 0x2f, 0xfa, 0x5c, 0xba, 0xa6, 0x56, 0x35, 0x1f, 0xc9, 0xf5, 0xff, 0x4d, 0xc2, 0x12,
12893
-	0xe6, 0xfc, 0xd6, 0x67, 0x6d, 0xcf, 0xb1, 0xcd, 0x31, 0x6a, 0x43, 0xde, 0xf4, 0x5c, 0xcb, 0x8e,
12894
-	0xed, 0xa9, 0x8d, 0x0b, 0x0e, 0xc1, 0x89, 0x56, 0x58, 0xaa, 0x85, 0x9a, 0x78, 0x62, 0x04, 0x6d,
12895
-	0x40, 0xc6, 0xa2, 0x0e, 0x19, 0x5f, 0x76, 0x1a, 0xd7, 0x15, 0x97, 0xc6, 0x12, 0x2a, 0x98, 0x23,
12896
-	0x79, 0xde, 0x23, 0x8c, 0xd1, 0xc1, 0x90, 0xc9, 0xd3, 0x38, 0x8d, 0x0b, 0x03, 0xf2, 0xdc, 0x50,
12897
-	0x22, 0xf4, 0x09, 0x64, 0x4f, 0x6c, 0xd7, 0xf2, 0x4e, 0xd4, 0x81, 0x7b, 0xb9, 0x5d, 0x85, 0xd5,
12898
-	0x4f, 0xf9, 0x39, 0x3b, 0xd3, 0x59, 0x3e, 0xeb, 0xad, 0xdd, 0x56, 0x23, 0x9c, 0x75, 0x55, 0xbf,
12899
-	0xeb, 0xb6, 0x3c, 0x97, 0xef, 0x18, 0xd8, 0x6d, 0xf5, 0x36, 0x8d, 0xe6, 0xf6, 0x1e, 0xe6, 0x33,
12900
-	0x7f, 0xe3, 0xf4, 0xac, 0xac, 0x45, 0x90, 0x4d, 0x62, 0x3b, 0x9c, 0x04, 0xde, 0x82, 0x94, 0xd1,
12901
-	0xfa, 0x42, 0x4b, 0x96, 0xb4, 0xd3, 0xb3, 0x72, 0x31, 0xaa, 0x36, 0xdc, 0xf1, 0x64, 0x33, 0xcd,
12902
-	0xb6, 0xab, 0xff, 0x7b, 0x12, 0x8a, 0x7b, 0x43, 0x8b, 0x30, 0x2a, 0x3d, 0x13, 0x95, 0xa1, 0x30,
12903
-	0x24, 0x3e, 0x71, 0x1c, 0xea, 0xd8, 0xc1, 0x40, 0x25, 0x0a, 0x71, 0x11, 0x7a, 0xf0, 0x2d, 0x26,
12904
-	0x53, 0x91, 0x30, 0x35, 0xa5, 0x7b, 0xb0, 0x7c, 0x20, 0x3b, 0xdb, 0x23, 0xa6, 0x58, 0xdd, 0x94,
12905
-	0x58, 0xdd, 0xca, 0x3c, 0x13, 0xf1, 0x5e, 0x55, 0xd4, 0x18, 0x0d, 0xa1, 0x85, 0x97, 0x0e, 0xe2,
12906
-	0x45, 0xf4, 0x29, 0x2c, 0x0e, 0x3c, 0xd7, 0x66, 0x9e, 0x7f, 0xa5, 0x75, 0x08, 0xc1, 0xe8, 0x3e,
12907
-	0x5c, 0xe3, 0x2b, 0x1c, 0x76, 0x49, 0x54, 0x8b, 0x93, 0x2b, 0x89, 0x57, 0x06, 0xe4, 0xb9, 0x6a,
12908
-	0x13, 0x73, 0xb1, 0xfe, 0x29, 0x2c, 0x4d, 0xf5, 0x81, 0x9f, 0xe6, 0x6d, 0x63, 0xaf, 0xd3, 0xd0,
12909
-	0x16, 0x50, 0x11, 0x72, 0xb5, 0xdd, 0x56, 0xb7, 0xd9, 0xda, 0xe3, 0xd4, 0xa3, 0x08, 0x39, 0xbc,
12910
-	0xbb, 0xbd, 0x5d, 0x35, 0x6a, 0x4f, 0xb4, 0xa4, 0xfe, 0xdf, 0xd1, 0xfc, 0x2a, 0xee, 0x51, 0x9d,
12911
-	0xe6, 0x1e, 0xef, 0x5f, 0x3c, 0x74, 0xc5, 0x3e, 0x26, 0x85, 0x88, 0x83, 0xfc, 0x18, 0x40, 0x2c,
12912
-	0x23, 0xb5, 0x7a, 0x84, 0x5d, 0x96, 0x5f, 0x74, 0xc3, 0xcc, 0x11, 0xe7, 0x95, 0x82, 0xc1, 0xd0,
12913
-	0xe7, 0x50, 0x34, 0xbd, 0xc1, 0xd0, 0xa1, 0x4a, 0x3f, 0x75, 0x15, 0xfd, 0x42, 0xa4, 0x62, 0xb0,
12914
-	0x38, 0x07, 0x4a, 0x4f, 0x73, 0xa0, 0x3f, 0x4e, 0x40, 0x21, 0xd6, 0xe1, 0x69, 0x2a, 0x54, 0x84,
12915
-	0xdc, 0x5e, 0xbb, 0x6e, 0x74, 0x9b, 0xad, 0xc7, 0x5a, 0x02, 0x01, 0x64, 0xc5, 0x04, 0xd6, 0xb5,
12916
-	0x24, 0xa7, 0x6b, 0xb5, 0xdd, 0x9d, 0xf6, 0x76, 0x43, 0x90, 0x21, 0x74, 0x03, 0xb4, 0x70, 0x0a,
12917
-	0x7b, 0x9d, 0xae, 0x81, 0xb9, 0x34, 0x8d, 0xae, 0xc3, 0x4a, 0x24, 0x55, 0x9a, 0x19, 0x74, 0x13,
12918
-	0x50, 0x24, 0x9c, 0x98, 0xc8, 0xea, 0x7f, 0x08, 0x2b, 0x35, 0xcf, 0x65, 0xc4, 0x76, 0x23, 0x2a,
12919
-	0xbb, 0xc1, 0xc7, 0xad, 0x44, 0x3d, 0xdb, 0x92, 0xd1, 0xb6, 0xba, 0x72, 0xfe, 0x72, 0xbd, 0x10,
12920
-	0x41, 0x9b, 0x75, 0x3e, 0xd2, 0xb0, 0x60, 0xf1, 0x3d, 0x35, 0xb4, 0x2d, 0x15, 0x3c, 0x17, 0xcf,
12921
-	0x5f, 0xae, 0xa7, 0xda, 0xcd, 0x3a, 0xe6, 0x32, 0xf4, 0x26, 0xe4, 0xe9, 0x73, 0x9b, 0xf5, 0x4c,
12922
-	0x1e, 0x5d, 0xf9, 0x1c, 0x66, 0x70, 0x8e, 0x0b, 0x6a, 0x3c, 0x98, 0x56, 0x01, 0xda, 0x9e, 0xcf,
12923
-	0x54, 0xcb, 0x9f, 0x40, 0x66, 0xe8, 0xf9, 0x22, 0x8f, 0xe4, 0x47, 0xcf, 0x5c, 0xb2, 0xc6, 0xe1,
12924
-	0xd2, 0xd9, 0xb1, 0x04, 0xeb, 0xff, 0x90, 0x04, 0xe8, 0x92, 0xe0, 0x48, 0x19, 0x79, 0x08, 0xf9,
12925
-	0xe8, 0x22, 0xe0, 0xb2, 0x84, 0x34, 0xb6, 0xe6, 0x11, 0x1e, 0x7d, 0x1c, 0x7a, 0x9d, 0xe4, 0xe9,
12926
-	0xf3, 0x15, 0x55, 0x5b, 0xf3, 0xa8, 0xee, 0x34, 0x19, 0xe7, 0xe7, 0x15, 0xf5, 0x7d, 0xb5, 0xf8,
12927
-	0xfc, 0x13, 0xd5, 0x44, 0xcc, 0x96, 0xf3, 0xa6, 0xd8, 0xdf, 0x9d, 0x79, 0x8d, 0xcc, 0x2c, 0xca,
12928
-	0xd6, 0x02, 0x9e, 0xe8, 0xa1, 0x47, 0x50, 0xe0, 0x43, 0xef, 0x05, 0xa2, 0x4e, 0x11, 0xbf, 0x0b,
12929
-	0x67, 0x4b, 0x5a, 0xc0, 0x30, 0x8c, 0xbe, 0xab, 0x1a, 0x2c, 0xfb, 0x23, 0x97, 0x0f, 0x5b, 0xd9,
12930
-	0xd0, 0x6d, 0x78, 0xa3, 0x45, 0xd9, 0x89, 0xe7, 0x1f, 0x19, 0x8c, 0x11, 0xf3, 0x90, 0x67, 0xf6,
12931
-	0x2a, 0xd2, 0x4d, 0x58, 0x6f, 0x62, 0x8a, 0xf5, 0xae, 0xc2, 0x22, 0x71, 0x6c, 0x12, 0x50, 0x49,
12932
-	0x15, 0xf2, 0x38, 0x2c, 0x72, 0x6e, 0x4e, 0x2c, 0xcb, 0xa7, 0x41, 0x40, 0x65, 0x2e, 0x9a, 0xc7,
12933
-	0x13, 0x81, 0xfe, 0x2f, 0x49, 0x80, 0x66, 0xdb, 0xd8, 0x51, 0xe6, 0xeb, 0x90, 0x3d, 0x20, 0x03,
12934
-	0xdb, 0x19, 0x5f, 0xb6, 0xd3, 0x27, 0xf8, 0x8a, 0x21, 0x0d, 0x6d, 0x0a, 0x1d, 0xac, 0x74, 0x05,
12935
-	0x65, 0x1f, 0xed, 0xbb, 0x94, 0x45, 0x94, 0x5d, 0x94, 0x38, 0x3f, 0xf0, 0x89, 0x1b, 0xad, 0x8c,
12936
-	0x2c, 0xf0, 0xae, 0xf7, 0x09, 0xa3, 0x27, 0x64, 0x1c, 0x6e, 0x4c, 0x55, 0x44, 0x5b, 0x9c, 0xca,
12937
-	0x07, 0xd4, 0x3f, 0xa6, 0xd6, 0x6a, 0x46, 0x78, 0xe1, 0xeb, 0xfa, 0x83, 0x15, 0x5c, 0x32, 0x9f,
12938
-	0x48, 0xbb, 0xf4, 0x50, 0x1c, 0xd7, 0x93, 0xaa, 0x6f, 0x95, 0x49, 0x7f, 0x08, 0x4b, 0x53, 0xe3,
12939
-	0x7c, 0x25, 0x57, 0x6a, 0xb6, 0x9f, 0x7e, 0xa2, 0xa5, 0xd5, 0xd7, 0xa7, 0x5a, 0x56, 0xff, 0x9b,
12940
-	0x94, 0xdc, 0x4a, 0x6a, 0x56, 0xe7, 0xdf, 0x4d, 0xe5, 0xc4, 0x4d, 0x97, 0xe9, 0x39, 0xca, 0xbf,
12941
-	0xdf, 0xbd, 0x7c, 0x87, 0x71, 0xee, 0x2d, 0xe0, 0x38, 0x52, 0x44, 0xeb, 0x50, 0x90, 0xeb, 0xdf,
12942
-	0xe3, 0xfe, 0x24, 0xa6, 0x75, 0x09, 0x83, 0x14, 0x71, 0x4d, 0x74, 0x17, 0x96, 0x87, 0xa3, 0x7d,
12943
-	0xc7, 0x0e, 0x0e, 0xa9, 0x25, 0x31, 0x69, 0x81, 0x59, 0x8a, 0xa4, 0x02, 0xb6, 0x03, 0x45, 0x25,
12944
-	0xe8, 0x09, 0xde, 0x95, 0x11, 0x1d, 0xba, 0xff, 0xba, 0x0e, 0x49, 0x15, 0x41, 0xc7, 0x0a, 0xc3,
12945
-	0x49, 0x41, 0xaf, 0x43, 0x2e, 0xec, 0x2c, 0x5a, 0x85, 0x54, 0xb7, 0xd6, 0xd6, 0x16, 0x4a, 0x2b,
12946
-	0xa7, 0x67, 0xe5, 0x42, 0x28, 0xee, 0xd6, 0xda, 0xbc, 0x66, 0xaf, 0xde, 0xd6, 0x12, 0xd3, 0x35,
12947
-	0x7b, 0xf5, 0x76, 0x29, 0xcd, 0x4f, 0x7e, 0xfd, 0x00, 0x0a, 0xb1, 0x16, 0xd0, 0x1d, 0x58, 0x6c,
12948
-	0xb6, 0x1e, 0xe3, 0x46, 0xa7, 0xa3, 0x2d, 0x94, 0x6e, 0x9e, 0x9e, 0x95, 0x51, 0xac, 0xb6, 0xe9,
12949
-	0xf6, 0xf9, 0xfa, 0xa0, 0xb7, 0x20, 0xbd, 0xb5, 0xdb, 0xe9, 0x86, 0x44, 0x2f, 0x86, 0xd8, 0xf2,
12950
-	0x02, 0x56, 0xba, 0xae, 0x28, 0x45, 0xdc, 0xb0, 0xfe, 0xe7, 0x09, 0xc8, 0x4a, 0xbe, 0x3b, 0x77,
12951
-	0xa1, 0x0c, 0x58, 0x0c, 0xb3, 0x30, 0x49, 0xc2, 0xdf, 0xbd, 0x98, 0x30, 0x57, 0x14, 0xbf, 0x95,
12952
-	0xee, 0x17, 0xea, 0x95, 0x3e, 0x83, 0x62, 0xbc, 0xe2, 0x5b, 0x39, 0xdf, 0x1f, 0x40, 0x81, 0xfb,
12953
-	0x77, 0x48, 0x9c, 0x37, 0x20, 0x2b, 0x39, 0xb9, 0x8a, 0xa6, 0x97, 0xb1, 0x77, 0x85, 0x44, 0x0f,
12954
-	0x60, 0x51, 0x32, 0xfe, 0xf0, 0x2e, 0x6a, 0xed, 0xf2, 0x5d, 0x84, 0x43, 0xb8, 0xfe, 0x08, 0xd2,
12955
-	0x6d, 0x4a, 0x7d, 0x3e, 0xf7, 0xae, 0x67, 0xd1, 0xc9, 0x01, 0xa4, 0x92, 0x15, 0x8b, 0x36, 0xeb,
12956
-	0x3c, 0x59, 0xb1, 0x68, 0xd3, 0xe2, 0x93, 0xc7, 0xe3, 0x4a, 0x78, 0x1d, 0xc7, 0xbf, 0xf5, 0x2e,
12957
-	0x14, 0x9f, 0x51, 0xbb, 0x7f, 0xc8, 0xa8, 0x25, 0x0c, 0xbd, 0x0f, 0xe9, 0x21, 0x8d, 0x3a, 0xbf,
12958
-	0x3a, 0xd7, 0xc1, 0x28, 0xf5, 0xb1, 0x40, 0xf1, 0x38, 0x72, 0x22, 0xb4, 0xd5, 0x0d, 0xa8, 0x2a,
12959
-	0xe9, 0xff, 0x9c, 0x84, 0xe5, 0x66, 0x10, 0x8c, 0x88, 0x6b, 0x86, 0x0c, 0xe5, 0x27, 0xd3, 0x0c,
12960
-	0xe5, 0xde, 0xdc, 0x11, 0x4e, 0xa9, 0x4c, 0xdf, 0x90, 0xa8, 0xc3, 0x21, 0x19, 0x1d, 0x0e, 0xfa,
12961
-	0x7f, 0x25, 0xc2, 0xab, 0x91, 0xbb, 0xb1, 0xed, 0x5e, 0x5a, 0x3d, 0x3d, 0x2b, 0xdf, 0x88, 0x5b,
12962
-	0xa2, 0x7b, 0xee, 0x91, 0xeb, 0x9d, 0xb8, 0xe8, 0x6d, 0xc8, 0xe0, 0x46, 0xab, 0xf1, 0x4c, 0x4b,
12963
-	0x48, 0xf7, 0x9c, 0x02, 0x61, 0xea, 0xd2, 0x13, 0x6e, 0xa9, 0xdd, 0x68, 0xd5, 0x39, 0x97, 0x48,
12964
-	0xce, 0xb1, 0xd4, 0xa6, 0xae, 0x65, 0xbb, 0x7d, 0x74, 0x07, 0xb2, 0xcd, 0x4e, 0x67, 0x4f, 0x24,
12965
-	0xaf, 0x6f, 0x9c, 0x9e, 0x95, 0xaf, 0x4f, 0xa1, 0x78, 0x81, 0x5a, 0x1c, 0xc4, 0xc9, 0x35, 0x67,
12966
-	0x19, 0x73, 0x40, 0x9c, 0xf7, 0x49, 0x10, 0xde, 0xed, 0xf2, 0xcc, 0x3a, 0x33, 0x07, 0x84, 0x3d,
12967
-	0xfe, 0xab, 0xb6, 0xdb, 0xbf, 0x25, 0x41, 0x33, 0x4c, 0x93, 0x0e, 0x19, 0xaf, 0x57, 0x59, 0x4d,
12968
-	0x17, 0x72, 0x43, 0xfe, 0x65, 0xd3, 0x90, 0x07, 0x3c, 0x98, 0x7b, 0x87, 0x3e, 0xa3, 0x57, 0xc1,
12969
-	0x9e, 0x43, 0x0d, 0x6b, 0x60, 0x07, 0x01, 0xcf, 0xde, 0x85, 0x0c, 0x47, 0x96, 0x4a, 0xbf, 0x4a,
12970
-	0xc0, 0xf5, 0x39, 0x08, 0xf4, 0x21, 0xa4, 0x7d, 0xcf, 0x09, 0xd7, 0xf0, 0xf6, 0x45, 0x37, 0x5c,
12971
-	0x5c, 0x15, 0x0b, 0x24, 0x5a, 0x03, 0x20, 0x23, 0xe6, 0x11, 0xd1, 0xbe, 0x58, 0xbd, 0x1c, 0x8e,
12972
-	0x49, 0xd0, 0x33, 0xc8, 0x06, 0xd4, 0xf4, 0x69, 0x48, 0x18, 0x1f, 0xfd, 0xba, 0xbd, 0xaf, 0x74,
12973
-	0x84, 0x19, 0xac, 0xcc, 0x95, 0x2a, 0x90, 0x95, 0x12, 0xee, 0xf6, 0x16, 0x61, 0x44, 0x74, 0xba,
12974
-	0x88, 0xc5, 0x37, 0xf7, 0x26, 0xe2, 0xf4, 0x43, 0x6f, 0x22, 0x4e, 0x5f, 0xff, 0x59, 0x12, 0xa0,
12975
-	0xf1, 0x9c, 0x51, 0xdf, 0x25, 0x4e, 0xcd, 0x40, 0x8d, 0x58, 0xf4, 0x97, 0xa3, 0x7d, 0x6f, 0xee,
12976
-	0xbd, 0x67, 0xa4, 0x51, 0xa9, 0x19, 0x73, 0xe2, 0xff, 0x2d, 0x48, 0x8d, 0x7c, 0x47, 0xdd, 0xa1,
12977
-	0x0b, 0xa6, 0xb7, 0x87, 0xb7, 0x31, 0x97, 0xa1, 0xc6, 0x24, 0x6c, 0xa5, 0x2e, 0x7e, 0xfc, 0x88,
12978
-	0x35, 0xf0, 0xdd, 0x87, 0xae, 0xf7, 0x01, 0x26, 0xbd, 0x46, 0x6b, 0x90, 0xa9, 0x6d, 0x76, 0x3a,
12979
-	0xdb, 0xda, 0x82, 0x8c, 0xcd, 0x93, 0x2a, 0x21, 0xd6, 0xff, 0x3a, 0x01, 0xb9, 0x9a, 0xa1, 0x4e,
12980
-	0xcc, 0x4d, 0xd0, 0x44, 0xc0, 0x31, 0xa9, 0xcf, 0x7a, 0xf4, 0xf9, 0xd0, 0xf6, 0xc7, 0x2a, 0x66,
12981
-	0x5c, 0x9e, 0x26, 0x2d, 0x73, 0xad, 0x1a, 0xf5, 0x59, 0x43, 0xe8, 0x20, 0x0c, 0x45, 0xaa, 0x86,
12982
-	0xd8, 0x33, 0x49, 0x18, 0xc1, 0xd7, 0x2e, 0x9f, 0x0a, 0x49, 0xaf, 0x27, 0xe5, 0x00, 0x17, 0x42,
12983
-	0x23, 0x35, 0x12, 0xe8, 0x4f, 0xe1, 0xfa, 0xae, 0x6f, 0x1e, 0xd2, 0x80, 0xc9, 0x46, 0x55, 0x97,
12984
-	0x1f, 0xc1, 0x6d, 0x46, 0x82, 0xa3, 0xde, 0xa1, 0x1d, 0x30, 0xcf, 0x1f, 0xf7, 0x7c, 0xca, 0xa8,
12985
-	0xcb, 0xeb, 0x7b, 0xe2, 0x89, 0x45, 0x5d, 0x72, 0xdc, 0xe2, 0x98, 0x2d, 0x09, 0xc1, 0x21, 0x62,
12986
-	0x9b, 0x03, 0xf4, 0x26, 0x14, 0x39, 0x9b, 0xad, 0xd3, 0x03, 0x32, 0x72, 0x58, 0x80, 0x7e, 0x04,
12987
-	0xe0, 0x78, 0xfd, 0xde, 0x95, 0xc3, 0x7d, 0xde, 0xf1, 0xfa, 0xf2, 0x53, 0xff, 0x1d, 0xd0, 0xea,
12988
-	0x76, 0x30, 0x24, 0xcc, 0x3c, 0x0c, 0x6f, 0x6f, 0xd0, 0x63, 0xd0, 0x0e, 0x29, 0xf1, 0xd9, 0x3e,
12989
-	0x25, 0xac, 0x37, 0xa4, 0xbe, 0xed, 0x59, 0x57, 0x9a, 0xd2, 0x95, 0x48, 0xab, 0x2d, 0x94, 0xf4,
12990
-	0xff, 0x49, 0x00, 0x60, 0x72, 0x10, 0x92, 0x9b, 0x1f, 0xc0, 0xb5, 0xc0, 0x25, 0xc3, 0xe0, 0xd0,
12991
-	0x63, 0x3d, 0xdb, 0x65, 0xd4, 0x3f, 0x26, 0x8e, 0xca, 0xc0, 0xb5, 0xb0, 0xa2, 0xa9, 0xe4, 0xe8,
12992
-	0x7d, 0x40, 0x47, 0x94, 0x0e, 0x7b, 0x9e, 0x63, 0xf5, 0xc2, 0x4a, 0xf9, 0x06, 0x94, 0xc6, 0x1a,
12993
-	0xaf, 0xd9, 0x75, 0xac, 0x4e, 0x28, 0x47, 0x55, 0x58, 0xe3, 0x33, 0x40, 0x5d, 0xe6, 0xdb, 0x34,
12994
-	0xe8, 0x1d, 0x78, 0x7e, 0x2f, 0x70, 0xbc, 0x93, 0xde, 0x81, 0xe7, 0x38, 0xde, 0x09, 0xf5, 0xc3,
12995
-	0xfb, 0x8d, 0x92, 0xe3, 0xf5, 0x1b, 0x12, 0xb4, 0xe9, 0xf9, 0x1d, 0xc7, 0x3b, 0xd9, 0x0c, 0x11,
12996
-	0x9c, 0x01, 0x4d, 0x86, 0xcd, 0x6c, 0xf3, 0x28, 0x64, 0x40, 0x91, 0xb4, 0x6b, 0x9b, 0x47, 0xe8,
12997
-	0x0e, 0x2c, 0x51, 0x87, 0x8a, 0x2c, 0x59, 0xa2, 0x32, 0x02, 0x55, 0x0c, 0x85, 0x1c, 0xa4, 0xff,
12998
-	0x16, 0xe4, 0xdb, 0x0e, 0x31, 0xc5, 0x4b, 0x1b, 0x2a, 0x03, 0x4f, 0xba, 0xb8, 0x13, 0xd8, 0xae,
12999
-	0xca, 0x92, 0xf2, 0x38, 0x2e, 0xd2, 0x7f, 0x02, 0xf0, 0x53, 0xcf, 0x76, 0xbb, 0xde, 0x11, 0x75,
13000
-	0xc5, 0xa3, 0x04, 0x67, 0xf4, 0x6a, 0x29, 0xf3, 0x58, 0x95, 0x44, 0xc2, 0x42, 0x5c, 0xd2, 0xa7,
13001
-	0x7e, 0x74, 0x37, 0x2f, 0x8b, 0xfa, 0xd7, 0x09, 0xc8, 0x62, 0xcf, 0x63, 0x35, 0x03, 0x95, 0x21,
13002
-	0x6b, 0x92, 0x5e, 0xb8, 0xf3, 0x8a, 0xd5, 0xfc, 0xf9, 0xcb, 0xf5, 0x4c, 0xcd, 0x78, 0x42, 0xc7,
13003
-	0x38, 0x63, 0x92, 0x27, 0x74, 0xcc, 0x8f, 0x68, 0x93, 0x88, 0xfd, 0x22, 0xcc, 0x14, 0xe5, 0x11,
13004
-	0x5d, 0x33, 0xf8, 0x66, 0xc0, 0x59, 0x93, 0xf0, 0x7f, 0xf4, 0x21, 0x14, 0x15, 0xa8, 0x77, 0x48,
13005
-	0x82, 0x43, 0xc9, 0xc3, 0xab, 0xcb, 0xe7, 0x2f, 0xd7, 0x41, 0x22, 0xb7, 0x48, 0x70, 0x88, 0x41,
13006
-	0xa2, 0xf9, 0x37, 0x6a, 0x40, 0xe1, 0x4b, 0xcf, 0x76, 0x7b, 0x4c, 0x0c, 0x42, 0x5d, 0x55, 0xcc,
13007
-	0xdd, 0x3f, 0x93, 0xa1, 0xaa, 0xfb, 0x13, 0xf8, 0x32, 0x92, 0xe8, 0xff, 0x9a, 0x80, 0x02, 0xb7,
13008
-	0x69, 0x1f, 0xd8, 0x26, 0x3f, 0x52, 0xbf, 0x7d, 0xa4, 0xbf, 0x05, 0x29, 0x33, 0xf0, 0xd5, 0xd8,
13009
-	0x44, 0xa8, 0xab, 0x75, 0x30, 0xe6, 0x32, 0xf4, 0x39, 0x64, 0x55, 0xf2, 0x25, 0x83, 0xbc, 0xfe,
13010
-	0xfa, 0xc3, 0x5f, 0x75, 0x51, 0xe9, 0x89, 0xb5, 0x9c, 0xf4, 0x4e, 0x8c, 0xb2, 0x88, 0xe3, 0x22,
13011
-	0x74, 0x13, 0x92, 0xa6, 0x2b, 0x9c, 0x42, 0x3d, 0x56, 0xd6, 0x5a, 0x38, 0x69, 0xba, 0xfa, 0x3f,
13012
-	0x25, 0x60, 0xa9, 0xe1, 0x9a, 0xfe, 0x58, 0x04, 0x49, 0xbe, 0x10, 0xb7, 0x21, 0x1f, 0x8c, 0xf6,
13013
-	0x83, 0x71, 0xc0, 0xe8, 0x20, 0x7c, 0x0b, 0x89, 0x04, 0xa8, 0x09, 0x79, 0xe2, 0xf4, 0x3d, 0xdf,
13014
-	0x66, 0x87, 0x03, 0xc5, 0xfb, 0xe7, 0x07, 0xe6, 0xb8, 0xcd, 0x8a, 0x11, 0xaa, 0xe0, 0x89, 0x76,
13015
-	0x18, 0x8a, 0x53, 0xa2, 0xb3, 0x22, 0x14, 0xbf, 0x0d, 0x45, 0x87, 0x0c, 0x44, 0x36, 0xca, 0xd3,
13016
-	0x49, 0x31, 0x8e, 0x34, 0x2e, 0x28, 0x19, 0xcf, 0xb1, 0x75, 0x1d, 0xf2, 0x91, 0x31, 0xb4, 0x02,
13017
-	0x05, 0xa3, 0xd1, 0xe9, 0x7d, 0xb4, 0xf1, 0xa0, 0xf7, 0xb8, 0xb6, 0xa3, 0x2d, 0x28, 0x26, 0xf0,
13018
-	0x77, 0x09, 0x58, 0xda, 0x91, 0x3e, 0xa8, 0xd8, 0xd5, 0x1d, 0x58, 0xf4, 0xc9, 0x01, 0x0b, 0xf9,
13019
-	0x5f, 0x5a, 0x3a, 0x17, 0x0f, 0x02, 0x9c, 0xff, 0xf1, 0xaa, 0xf9, 0xfc, 0x2f, 0xf6, 0x12, 0x97,
13020
-	0xba, 0xf4, 0x25, 0x2e, 0xfd, 0x9d, 0xbc, 0xc4, 0xe9, 0xbf, 0x4c, 0xc0, 0x8a, 0x3a, 0xa8, 0xc3,
13021
-	0xd7, 0x27, 0xf4, 0x1e, 0xe4, 0xe5, 0x99, 0x3d, 0x61, 0xaf, 0xe2, 0x41, 0x48, 0xe2, 0x9a, 0x75,
13022
-	0x9c, 0x93, 0xd5, 0x4d, 0x0b, 0xfd, 0x38, 0x76, 0xed, 0x7c, 0x01, 0x87, 0x9c, 0xb1, 0x5e, 0x99,
13023
-	0xdc, 0x45, 0x5f, 0xf8, 0x20, 0xb5, 0x0e, 0x05, 0xd5, 0x01, 0x91, 0x5b, 0xc8, 0x1c, 0x17, 0xa4,
13024
-	0xa8, 0x45, 0x06, 0x54, 0xbf, 0x0b, 0x69, 0x91, 0xe1, 0x00, 0x64, 0x3b, 0x5f, 0x74, 0xba, 0x8d,
13025
-	0x1d, 0x99, 0x55, 0x6e, 0x36, 0xc5, 0xab, 0xe0, 0x22, 0xa4, 0x1a, 0xad, 0xa7, 0x5a, 0x52, 0xdf,
13026
-	0x85, 0x9b, 0x55, 0x87, 0x98, 0x47, 0x8e, 0x1d, 0x30, 0x6a, 0xc5, 0x77, 0xd3, 0x0f, 0x21, 0x3b,
13027
-	0x75, 0x46, 0xbe, 0xe6, 0x8a, 0x45, 0x81, 0xf5, 0xbf, 0x4d, 0x40, 0x71, 0x8b, 0x12, 0x87, 0x1d,
13028
-	0x4e, 0xf2, 0x54, 0x46, 0x03, 0xa6, 0x62, 0x99, 0xf8, 0x46, 0x0f, 0x20, 0x17, 0x45, 0xf5, 0xab,
13029
-	0x5c, 0x44, 0x47, 0x68, 0xf4, 0x29, 0x2c, 0x72, 0x2f, 0xf4, 0x46, 0x21, 0xf9, 0x7a, 0xcd, 0x0d,
13030
-	0xa7, 0x02, 0xf3, 0x80, 0xe8, 0x53, 0x11, 0xcc, 0xc5, 0x5c, 0x65, 0x70, 0x58, 0xbc, 0xff, 0x8f,
13031
-	0x29, 0xc8, 0x47, 0x17, 0x3e, 0x3c, 0x22, 0x70, 0xb6, 0xbd, 0x20, 0xaf, 0x8e, 0x23, 0x79, 0x8b,
13032
-	0x9e, 0xa0, 0xb7, 0x27, 0x3c, 0xfb, 0x73, 0x79, 0xf1, 0x1c, 0x55, 0x87, 0x1c, 0xfb, 0x1d, 0xc8,
13033
-	0x19, 0x9d, 0x4e, 0xf3, 0x71, 0xab, 0x51, 0xd7, 0xbe, 0x4a, 0x94, 0xbe, 0x77, 0x7a, 0x56, 0xbe,
13034
-	0x16, 0x81, 0x8c, 0x20, 0xb0, 0xfb, 0x2e, 0xb5, 0x04, 0xaa, 0x56, 0x6b, 0xb4, 0xbb, 0x8d, 0xba,
13035
-	0xf6, 0x22, 0x39, 0x8b, 0x12, 0xbc, 0x51, 0x3c, 0x22, 0xe5, 0xdb, 0xb8, 0xd1, 0x36, 0x30, 0x6f,
13036
-	0xf0, 0xab, 0xa4, 0xa4, 0xff, 0x93, 0x16, 0x7d, 0x3a, 0x24, 0x3e, 0x6f, 0x73, 0x2d, 0x7c, 0x4c,
13037
-	0x7d, 0x91, 0x92, 0x0f, 0x0d, 0x93, 0xdb, 0x2b, 0x4a, 0xac, 0x31, 0x6f, 0x4d, 0xdc, 0x1c, 0x0a,
13038
-	0x33, 0xa9, 0x99, 0xd6, 0x3a, 0x8c, 0xf8, 0x8c, 0x5b, 0xd1, 0x61, 0x11, 0xef, 0xb5, 0x5a, 0x1c,
13039
-	0xf4, 0x22, 0x3d, 0x33, 0x3a, 0x3c, 0x72, 0x5d, 0x8e, 0xb9, 0x0b, 0xb9, 0xf0, 0x62, 0x51, 0xfb,
13040
-	0x2a, 0x3d, 0xd3, 0xa1, 0x5a, 0x78, 0x2b, 0x2a, 0x1a, 0xdc, 0xda, 0xeb, 0x8a, 0xb7, 0xde, 0x17,
13041
-	0x99, 0xd9, 0x06, 0x0f, 0x47, 0xcc, 0xe2, 0x89, 0x4d, 0x39, 0xca, 0x34, 0xbe, 0xca, 0x48, 0xee,
13042
-	0x16, 0x61, 0x54, 0x9a, 0xf1, 0x0e, 0xe4, 0x70, 0xe3, 0xa7, 0xf2, 0x59, 0xf8, 0x45, 0x76, 0xc6,
13043
-	0x0e, 0xa6, 0x5f, 0x52, 0x93, 0x51, 0x6b, 0xf2, 0x8e, 0x12, 0x55, 0xdd, 0xff, 0x5d, 0xc8, 0x85,
13044
-	0x71, 0x1e, 0xad, 0x41, 0xf6, 0xd9, 0x2e, 0x7e, 0xd2, 0xc0, 0xda, 0x82, 0x9c, 0x9d, 0xb0, 0xe6,
13045
-	0x99, 0x3c, 0x28, 0xcb, 0xb0, 0xb8, 0x63, 0xb4, 0x8c, 0xc7, 0x0d, 0x1c, 0xa6, 0xf7, 0x21, 0x40,
13046
-	0x05, 0xab, 0x92, 0xa6, 0x1a, 0x88, 0x6c, 0x56, 0x6f, 0x7f, 0xfd, 0xcd, 0xda, 0xc2, 0x2f, 0xbe,
13047
-	0x59, 0x5b, 0xf8, 0xd5, 0x37, 0x6b, 0x89, 0x17, 0xe7, 0x6b, 0x89, 0xaf, 0xcf, 0xd7, 0x12, 0x3f,
13048
-	0x3f, 0x5f, 0x4b, 0xfc, 0xc7, 0xf9, 0x5a, 0x62, 0x3f, 0x2b, 0x88, 0xf4, 0xc7, 0xff, 0x1f, 0x00,
13049
-	0x00, 0xff, 0xff, 0x24, 0x7a, 0x55, 0x47, 0xd8, 0x24, 0x00, 0x00,
12812
+	// 3932 bytes of a gzipped FileDescriptorProto
12813
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0xac, 0x79, 0x4d, 0x6c, 0x1b, 0x49,
12814
+	0x76, 0xbf, 0xf8, 0x29, 0xf2, 0x91, 0x92, 0xda, 0x65, 0xaf, 0x47, 0xe6, 0x78, 0x24, 0x4e, 0x7b,
12815
+	0xbc, 0xe3, 0xf1, 0xce, 0x9f, 0x63, 0x6b, 0x3e, 0xe0, 0x1d, 0xff, 0xb3, 0x9e, 0xe6, 0x87, 0x2c,
12816
+	0xae, 0x25, 0x92, 0x28, 0x52, 0x76, 0x06, 0x01, 0x42, 0x94, 0xba, 0x4b, 0x54, 0x8f, 0x9a, 0xdd,
12817
+	0x4c, 0x77, 0x51, 0x32, 0x13, 0x04, 0x31, 0x72, 0x48, 0x02, 0x9d, 0x72, 0x0f, 0x84, 0x20, 0x48,
12818
+	0x90, 0x43, 0x0e, 0x7b, 0xc9, 0x21, 0x40, 0x4e, 0x83, 0x9c, 0xe6, 0x96, 0x4d, 0x02, 0x04, 0x8b,
12819
+	0x04, 0x31, 0x32, 0xca, 0x39, 0xc0, 0x5e, 0x82, 0x1c, 0x92, 0x00, 0x41, 0x7d, 0x74, 0xb3, 0x29,
12820
+	0xd3, 0xb2, 0x26, 0xbb, 0x17, 0xb2, 0xeb, 0xd5, 0xef, 0xbd, 0xfa, 0x7a, 0x55, 0xf5, 0x7b, 0xaf,
12821
+	0xa0, 0xc0, 0x26, 0x23, 0x1a, 0x54, 0x46, 0xbe, 0xc7, 0x3c, 0x84, 0x2c, 0xcf, 0x3c, 0xa4, 0x7e,
12822
+	0x25, 0x38, 0x26, 0xfe, 0xf0, 0xd0, 0x66, 0x95, 0xa3, 0xfb, 0xa5, 0x1b, 0xcc, 0x1e, 0xd2, 0x80,
12823
+	0x91, 0xe1, 0xe8, 0xa3, 0xe8, 0x4b, 0xc2, 0x4b, 0x6f, 0x59, 0x63, 0x9f, 0x30, 0xdb, 0x73, 0x3f,
12824
+	0x0a, 0x3f, 0x54, 0xc5, 0xb5, 0x81, 0x37, 0xf0, 0xc4, 0xe7, 0x47, 0xfc, 0x4b, 0x4a, 0xf5, 0x75,
12825
+	0x58, 0x7c, 0x4a, 0xfd, 0xc0, 0xf6, 0x5c, 0x74, 0x0d, 0x32, 0xb6, 0x6b, 0xd1, 0xe7, 0xab, 0x89,
12826
+	0x72, 0xe2, 0x4e, 0x1a, 0xcb, 0x82, 0xfe, 0x27, 0x09, 0x28, 0x18, 0xae, 0xeb, 0x31, 0x61, 0x2b,
12827
+	0x40, 0x08, 0xd2, 0x2e, 0x19, 0x52, 0x01, 0xca, 0x63, 0xf1, 0x8d, 0x6a, 0x90, 0x75, 0xc8, 0x1e,
12828
+	0x75, 0x82, 0xd5, 0x64, 0x39, 0x75, 0xa7, 0xb0, 0xf1, 0x83, 0xca, 0xab, 0x7d, 0xae, 0xc4, 0x8c,
12829
+	0x54, 0xb6, 0x05, 0xba, 0xe1, 0x32, 0x7f, 0x82, 0x95, 0x6a, 0xe9, 0x87, 0x50, 0x88, 0x89, 0x91,
12830
+	0x06, 0xa9, 0x43, 0x3a, 0x51, 0xcd, 0xf0, 0x4f, 0xde, 0xbf, 0x23, 0xe2, 0x8c, 0xe9, 0x6a, 0x52,
12831
+	0xc8, 0x64, 0xe1, 0xf3, 0xe4, 0x83, 0x84, 0xfe, 0x25, 0xe4, 0x31, 0x0d, 0xbc, 0xb1, 0x6f, 0xd2,
12832
+	0x00, 0x7d, 0x00, 0x79, 0x97, 0xb8, 0x5e, 0xdf, 0x1c, 0x8d, 0x03, 0xa1, 0x9e, 0xaa, 0x16, 0xcf,
12833
+	0x5e, 0xae, 0xe7, 0x5a, 0xc4, 0xf5, 0x6a, 0x9d, 0xdd, 0x00, 0xe7, 0x78, 0x75, 0x6d, 0x34, 0x0e,
12834
+	0xd0, 0xbb, 0x50, 0x1c, 0xd2, 0xa1, 0xe7, 0x4f, 0xfa, 0x7b, 0x13, 0x46, 0x03, 0x61, 0x38, 0x85,
12835
+	0x0b, 0x52, 0x56, 0xe5, 0x22, 0xfd, 0x0f, 0x13, 0x70, 0x2d, 0xb4, 0x8d, 0xe9, 0x6f, 0x8c, 0x6d,
12836
+	0x9f, 0x0e, 0xa9, 0xcb, 0x02, 0xf4, 0x29, 0x64, 0x1d, 0x7b, 0x68, 0x33, 0xd9, 0x46, 0x61, 0xe3,
12837
+	0x9d, 0x79, 0x63, 0x8e, 0x7a, 0x85, 0x15, 0x18, 0x19, 0x50, 0xf4, 0x69, 0x40, 0xfd, 0x23, 0x39,
12838
+	0x13, 0xa2, 0xc9, 0x37, 0x2a, 0xcf, 0xa8, 0xe8, 0x9b, 0x90, 0xeb, 0x38, 0x84, 0xed, 0x7b, 0xfe,
12839
+	0x10, 0xe9, 0x50, 0x24, 0xbe, 0x79, 0x60, 0x33, 0x6a, 0xb2, 0xb1, 0x1f, 0xae, 0xca, 0x8c, 0x0c,
12840
+	0x5d, 0x87, 0xa4, 0x27, 0x1b, 0xca, 0x57, 0xb3, 0x67, 0x2f, 0xd7, 0x93, 0xed, 0x2e, 0x4e, 0x7a,
12841
+	0x81, 0xfe, 0x10, 0xae, 0x74, 0x9c, 0xf1, 0xc0, 0x76, 0xeb, 0x34, 0x30, 0x7d, 0x7b, 0xc4, 0xad,
12842
+	0xf3, 0xe5, 0xe5, 0xce, 0x17, 0x2e, 0x2f, 0xff, 0x8e, 0x96, 0x3c, 0x39, 0x5d, 0x72, 0xfd, 0xf7,
12843
+	0x93, 0x70, 0xa5, 0xe1, 0x0e, 0x6c, 0x97, 0xc6, 0xb5, 0x6f, 0xc3, 0x32, 0x15, 0xc2, 0xfe, 0x91,
12844
+	0x74, 0x2a, 0x65, 0x67, 0x49, 0x4a, 0x43, 0x4f, 0x6b, 0x9e, 0xf3, 0x97, 0xfb, 0xf3, 0x86, 0xff,
12845
+	0x8a, 0xf5, 0x79, 0x5e, 0x83, 0x1a, 0xb0, 0x38, 0x12, 0x83, 0x08, 0x56, 0x53, 0xc2, 0xd6, 0xed,
12846
+	0x79, 0xb6, 0x5e, 0x19, 0x67, 0x35, 0xfd, 0xcd, 0xcb, 0xf5, 0x05, 0x1c, 0xea, 0xfe, 0x22, 0xce,
12847
+	0xf7, 0x6f, 0x09, 0x58, 0x69, 0x79, 0xd6, 0xcc, 0x3c, 0x94, 0x20, 0x77, 0xe0, 0x05, 0x2c, 0xb6,
12848
+	0x51, 0xa2, 0x32, 0x7a, 0x00, 0xb9, 0x91, 0x5a, 0x3e, 0xb5, 0xfa, 0x37, 0xe7, 0x77, 0x59, 0x62,
12849
+	0x70, 0x84, 0x46, 0x0f, 0x21, 0xef, 0x87, 0x3e, 0xb1, 0x9a, 0xba, 0x8c, 0xe3, 0x4c, 0xf1, 0xe8,
12850
+	0x57, 0x20, 0x2b, 0x17, 0x61, 0x35, 0x2d, 0x34, 0x6f, 0x5f, 0x6a, 0xce, 0xb1, 0x52, 0xd2, 0x7f,
12851
+	0x96, 0x00, 0x0d, 0x93, 0x7d, 0xb6, 0x43, 0x87, 0x7b, 0xd4, 0xef, 0x32, 0xc2, 0xc6, 0x01, 0xba,
12852
+	0x0e, 0x59, 0x87, 0x12, 0x8b, 0xfa, 0x62, 0x90, 0x39, 0xac, 0x4a, 0x68, 0x97, 0x3b, 0x39, 0x31,
12853
+	0x0f, 0xc8, 0x9e, 0xed, 0xd8, 0x6c, 0x22, 0x86, 0xb9, 0x3c, 0x7f, 0x95, 0xcf, 0xdb, 0xac, 0xe0,
12854
+	0x98, 0x22, 0x9e, 0x31, 0x83, 0x56, 0x61, 0x71, 0x48, 0x83, 0x80, 0x0c, 0xa8, 0x18, 0x7d, 0x1e,
12855
+	0x87, 0x45, 0xfd, 0x21, 0x14, 0xe3, 0x7a, 0xa8, 0x00, 0x8b, 0xbb, 0xad, 0x27, 0xad, 0xf6, 0xb3,
12856
+	0x96, 0xb6, 0x80, 0x56, 0xa0, 0xb0, 0xdb, 0xc2, 0x0d, 0xa3, 0xb6, 0x65, 0x54, 0xb7, 0x1b, 0x5a,
12857
+	0x02, 0x2d, 0x41, 0x7e, 0x5a, 0x4c, 0xea, 0x7f, 0x99, 0x00, 0xe0, 0x0b, 0xa8, 0x06, 0xf5, 0x39,
12858
+	0x64, 0x02, 0x46, 0x98, 0x5c, 0xb8, 0xe5, 0x8d, 0xf7, 0xe6, 0xf5, 0x7a, 0x0a, 0xaf, 0xf0, 0x3f,
12859
+	0x8a, 0xa5, 0x4a, 0xbc, 0x87, 0xc9, 0x99, 0x1e, 0xf2, 0x3d, 0x44, 0x2c, 0xcb, 0x57, 0x1d, 0x17,
12860
+	0xdf, 0xfa, 0x43, 0xc8, 0x08, 0xed, 0xd9, 0xee, 0xe6, 0x20, 0x5d, 0xe7, 0x5f, 0x09, 0x94, 0x87,
12861
+	0x0c, 0x6e, 0x18, 0xf5, 0x2f, 0xb5, 0x24, 0xd2, 0xa0, 0x58, 0x6f, 0x76, 0x6b, 0xed, 0x56, 0xab,
12862
+	0x51, 0xeb, 0x35, 0xea, 0x5a, 0x4a, 0xbf, 0x0d, 0x99, 0xe6, 0x90, 0x5b, 0xbe, 0xc9, 0xbd, 0x62,
12863
+	0x9f, 0xfa, 0xd4, 0x35, 0x43, 0x67, 0x9b, 0x0a, 0xf4, 0x9f, 0xe6, 0x21, 0xb3, 0xe3, 0x8d, 0x5d,
12864
+	0x86, 0x36, 0x62, 0x3b, 0x7b, 0x79, 0x63, 0x6d, 0xde, 0xb0, 0x04, 0xb0, 0xd2, 0x9b, 0x8c, 0xa8,
12865
+	0xda, 0xf9, 0xd7, 0x21, 0x2b, 0xfd, 0x47, 0x0d, 0x47, 0x95, 0xb8, 0x9c, 0x11, 0x7f, 0x40, 0x99,
12866
+	0x1a, 0x8f, 0x2a, 0xa1, 0x3b, 0x90, 0xf3, 0x29, 0xb1, 0x3c, 0xd7, 0x99, 0x08, 0x37, 0xcb, 0xc9,
12867
+	0xa3, 0x17, 0x53, 0x62, 0xb5, 0x5d, 0x67, 0x82, 0xa3, 0x5a, 0xb4, 0x05, 0xc5, 0x3d, 0xdb, 0xb5,
12868
+	0xfa, 0xde, 0x48, 0x9e, 0x83, 0x99, 0xd7, 0x3b, 0xa5, 0xec, 0x55, 0xd5, 0x76, 0xad, 0xb6, 0x04,
12869
+	0xe3, 0xc2, 0xde, 0xb4, 0x80, 0x5a, 0xb0, 0x7c, 0xe4, 0x39, 0xe3, 0x21, 0x8d, 0x6c, 0x65, 0x85,
12870
+	0xad, 0xf7, 0x5f, 0x6f, 0xeb, 0xa9, 0xc0, 0x87, 0xd6, 0x96, 0x8e, 0xe2, 0x45, 0xf4, 0x04, 0x96,
12871
+	0xd8, 0x70, 0xb4, 0x1f, 0x44, 0xe6, 0x16, 0x85, 0xb9, 0xef, 0x5f, 0x30, 0x61, 0x1c, 0x1e, 0x5a,
12872
+	0x2b, 0xb2, 0x58, 0xa9, 0xf4, 0xbb, 0x29, 0x28, 0xc4, 0x7a, 0x8e, 0xba, 0x50, 0x18, 0xf9, 0xde,
12873
+	0x88, 0x0c, 0xc4, 0x59, 0xae, 0xd6, 0xe2, 0xfe, 0xa5, 0x46, 0x5d, 0xe9, 0x4c, 0x15, 0x71, 0xdc,
12874
+	0x8a, 0x7e, 0x9a, 0x84, 0x42, 0xac, 0x12, 0xdd, 0x85, 0x1c, 0xee, 0xe0, 0xe6, 0x53, 0xa3, 0xd7,
12875
+	0xd0, 0x16, 0x4a, 0x37, 0x4f, 0x4e, 0xcb, 0xab, 0xc2, 0x5a, 0xdc, 0x40, 0xc7, 0xb7, 0x8f, 0xb8,
12876
+	0xeb, 0xdd, 0x81, 0xc5, 0x10, 0x9a, 0x28, 0xbd, 0x7d, 0x72, 0x5a, 0x7e, 0xeb, 0x3c, 0x34, 0x86,
12877
+	0xc4, 0xdd, 0x2d, 0x03, 0x37, 0xea, 0x5a, 0x72, 0x3e, 0x12, 0x77, 0x0f, 0x88, 0x4f, 0x2d, 0xf4,
12878
+	0x7d, 0xc8, 0x2a, 0x60, 0xaa, 0x54, 0x3a, 0x39, 0x2d, 0x5f, 0x3f, 0x0f, 0x9c, 0xe2, 0x70, 0x77,
12879
+	0xdb, 0x78, 0xda, 0xd0, 0xd2, 0xf3, 0x71, 0xb8, 0xeb, 0x90, 0x23, 0x8a, 0xde, 0x83, 0x8c, 0x84,
12880
+	0x65, 0x4a, 0x37, 0x4e, 0x4e, 0xcb, 0xdf, 0x7b, 0xc5, 0x1c, 0x47, 0x95, 0x56, 0xff, 0xe0, 0x4f,
12881
+	0xd7, 0x16, 0xfe, 0xfa, 0xcf, 0xd6, 0xb4, 0xf3, 0xd5, 0xa5, 0xff, 0x4e, 0xc0, 0xd2, 0xcc, 0x92,
12882
+	0x23, 0x1d, 0xb2, 0xae, 0x67, 0x7a, 0x23, 0x79, 0xc4, 0xe7, 0xaa, 0x70, 0xf6, 0x72, 0x3d, 0xdb,
12883
+	0xf2, 0x6a, 0xde, 0x68, 0x82, 0x55, 0x0d, 0x7a, 0x72, 0xee, 0x92, 0xfa, 0xf8, 0x92, 0xfe, 0x34,
12884
+	0xf7, 0x9a, 0x7a, 0x04, 0x4b, 0x96, 0x6f, 0x1f, 0x51, 0xbf, 0x6f, 0x7a, 0xee, 0xbe, 0x3d, 0x50,
12885
+	0xc7, 0x77, 0x69, 0x9e, 0xcd, 0xba, 0x00, 0xe2, 0xa2, 0x54, 0xa8, 0x09, 0xfc, 0x2f, 0x70, 0x41,
12886
+	0x95, 0x9e, 0x42, 0x31, 0xee, 0xa1, 0xe8, 0x1d, 0x80, 0xc0, 0xfe, 0x4d, 0xaa, 0x38, 0x8f, 0x60,
12887
+	0x48, 0x38, 0xcf, 0x25, 0x82, 0xf1, 0xa0, 0xf7, 0x21, 0x3d, 0xf4, 0x2c, 0x69, 0x67, 0xa9, 0x7a,
12888
+	0x95, 0xdf, 0x93, 0xff, 0xf4, 0x72, 0xbd, 0xe0, 0x05, 0x95, 0x4d, 0xdb, 0xa1, 0x3b, 0x9e, 0x45,
12889
+	0xb1, 0x00, 0xe8, 0x47, 0x90, 0xe6, 0x47, 0x05, 0x7a, 0x1b, 0xd2, 0xd5, 0x66, 0xab, 0xae, 0x2d,
12890
+	0x94, 0xae, 0x9c, 0x9c, 0x96, 0x97, 0xc4, 0x94, 0xf0, 0x0a, 0xee, 0xbb, 0x68, 0x1d, 0xb2, 0x4f,
12891
+	0xdb, 0xdb, 0xbb, 0x3b, 0xdc, 0xbd, 0xae, 0x9e, 0x9c, 0x96, 0x57, 0xa2, 0x6a, 0x39, 0x69, 0xe8,
12892
+	0x1d, 0xc8, 0xf4, 0x76, 0x3a, 0x9b, 0x5d, 0x2d, 0x59, 0x42, 0x27, 0xa7, 0xe5, 0xe5, 0xa8, 0x5e,
12893
+	0xf4, 0xb9, 0x74, 0x45, 0xad, 0x6a, 0x3e, 0x92, 0xeb, 0xff, 0x95, 0x84, 0x25, 0xcc, 0x39, 0xaf,
12894
+	0xcf, 0x3a, 0x9e, 0x63, 0x9b, 0x13, 0xd4, 0x81, 0xbc, 0xe9, 0xb9, 0x96, 0x1d, 0xdb, 0x53, 0x1b,
12895
+	0xaf, 0xb9, 0x18, 0xa7, 0x5a, 0x61, 0xa9, 0x16, 0x6a, 0xe2, 0xa9, 0x11, 0xb4, 0x01, 0x19, 0x8b,
12896
+	0x3a, 0x64, 0x72, 0xd1, 0x0d, 0x5d, 0x57, 0xfc, 0x1a, 0x4b, 0xa8, 0x60, 0x93, 0xe4, 0x79, 0x9f,
12897
+	0x30, 0x46, 0x87, 0x23, 0x26, 0x6f, 0xe8, 0x34, 0x2e, 0x0c, 0xc9, 0x73, 0x43, 0x89, 0xd0, 0x27,
12898
+	0x90, 0x3d, 0xb6, 0x5d, 0xcb, 0x3b, 0x56, 0x97, 0xf0, 0xc5, 0x76, 0x15, 0x56, 0x3f, 0xe1, 0x77,
12899
+	0xef, 0xb9, 0xce, 0xf2, 0x59, 0x6f, 0xb5, 0x5b, 0x8d, 0x70, 0xd6, 0x55, 0x7d, 0xdb, 0x6d, 0x79,
12900
+	0x2e, 0xdf, 0x31, 0xd0, 0x6e, 0xf5, 0x37, 0x8d, 0xe6, 0xf6, 0x2e, 0xe6, 0x33, 0x7f, 0xed, 0xe4,
12901
+	0xb4, 0xac, 0x45, 0x90, 0x4d, 0x62, 0x3b, 0x9c, 0x18, 0xde, 0x80, 0x94, 0xd1, 0xfa, 0x52, 0x4b,
12902
+	0x96, 0xb4, 0x93, 0xd3, 0x72, 0x31, 0xaa, 0x36, 0xdc, 0xc9, 0x74, 0x33, 0x9d, 0x6f, 0x57, 0xff,
12903
+	0x97, 0x24, 0x14, 0x77, 0x47, 0x16, 0x61, 0x54, 0x7a, 0x26, 0x2a, 0x43, 0x61, 0x44, 0x7c, 0xe2,
12904
+	0x38, 0xd4, 0xb1, 0x83, 0xa1, 0x0a, 0x1e, 0xe2, 0x22, 0xf4, 0xe0, 0x3b, 0x4c, 0xa6, 0x22, 0x66,
12905
+	0x6a, 0x4a, 0x77, 0x61, 0x79, 0x5f, 0x76, 0xb6, 0x4f, 0x4c, 0xb1, 0xba, 0x29, 0xb1, 0xba, 0x95,
12906
+	0x79, 0x26, 0xe2, 0xbd, 0xaa, 0xa8, 0x31, 0x1a, 0x42, 0x0b, 0x2f, 0xed, 0xc7, 0x8b, 0xe8, 0x33,
12907
+	0x58, 0x1c, 0x7a, 0xae, 0xcd, 0x3c, 0xff, 0x52, 0xeb, 0x10, 0x82, 0xd1, 0x5d, 0xb8, 0xc2, 0x57,
12908
+	0x38, 0xec, 0x92, 0xa8, 0x16, 0x37, 0x57, 0x12, 0xaf, 0x0c, 0xc9, 0x73, 0xd5, 0x26, 0xe6, 0x62,
12909
+	0xfd, 0x33, 0x58, 0x9a, 0xe9, 0x03, 0xbf, 0xcd, 0x3b, 0xc6, 0x6e, 0xb7, 0xa1, 0x2d, 0xa0, 0x22,
12910
+	0xe4, 0x6a, 0xed, 0x56, 0xaf, 0xd9, 0xda, 0xe5, 0x74, 0xa4, 0x08, 0x39, 0xdc, 0xde, 0xde, 0xae,
12911
+	0x1a, 0xb5, 0x27, 0x5a, 0x52, 0xff, 0x8f, 0x68, 0x7e, 0x15, 0x1f, 0xa9, 0xce, 0xf2, 0x91, 0x0f,
12912
+	0x5f, 0x3f, 0x74, 0xc5, 0x48, 0xa6, 0x85, 0x88, 0x97, 0xfc, 0x7f, 0x00, 0xb1, 0x8c, 0xd4, 0xea,
12913
+	0x13, 0x76, 0x51, 0xcc, 0xd1, 0x0b, 0xa3, 0x49, 0x9c, 0x57, 0x0a, 0x06, 0x43, 0x5f, 0x40, 0xd1,
12914
+	0xf4, 0x86, 0x23, 0x87, 0x2a, 0xfd, 0xd4, 0x65, 0xf4, 0x0b, 0x91, 0x8a, 0xc1, 0xe2, 0xbc, 0x28,
12915
+	0x3d, 0xcb, 0xdc, 0x7e, 0x2f, 0x01, 0x85, 0x58, 0x87, 0x67, 0xa9, 0x50, 0x11, 0x72, 0xbb, 0x9d,
12916
+	0xba, 0xd1, 0x6b, 0xb6, 0x1e, 0x6b, 0x09, 0x04, 0x90, 0x15, 0x13, 0x58, 0xd7, 0x92, 0x9c, 0xc2,
12917
+	0xd5, 0xda, 0x3b, 0x9d, 0xed, 0x86, 0x20, 0x43, 0xe8, 0x1a, 0x68, 0xe1, 0x14, 0xf6, 0xbb, 0x3d,
12918
+	0x03, 0x73, 0x69, 0x1a, 0x5d, 0x85, 0x95, 0x48, 0xaa, 0x34, 0x33, 0xe8, 0x3a, 0xa0, 0x48, 0x38,
12919
+	0x35, 0x91, 0xd5, 0x7f, 0x1b, 0x56, 0x6a, 0x9e, 0xcb, 0x88, 0xed, 0x46, 0xf4, 0x76, 0x83, 0x8f,
12920
+	0x5b, 0x89, 0xfa, 0xb6, 0x25, 0x4f, 0xdb, 0xea, 0xca, 0xd9, 0xcb, 0xf5, 0x42, 0x04, 0x6d, 0xd6,
12921
+	0xf9, 0x48, 0xc3, 0x82, 0xc5, 0xf7, 0xd4, 0xc8, 0xb6, 0xc4, 0x14, 0x67, 0xaa, 0x8b, 0x67, 0x2f,
12922
+	0xd7, 0x53, 0x9d, 0x66, 0x1d, 0x73, 0x19, 0x7a, 0x1b, 0xf2, 0xf4, 0xb9, 0xcd, 0xfa, 0x26, 0x3f,
12923
+	0x5d, 0xf9, 0x1c, 0x66, 0x70, 0x8e, 0x0b, 0x6a, 0xfc, 0x30, 0xad, 0x02, 0x74, 0x3c, 0x9f, 0xa9,
12924
+	0x96, 0x3f, 0x81, 0xcc, 0xc8, 0xf3, 0x45, 0x6c, 0xc9, 0xaf, 0x9e, 0xb9, 0x64, 0x8d, 0xc3, 0xa5,
12925
+	0xb3, 0x63, 0x09, 0xd6, 0xff, 0x26, 0x09, 0xd0, 0x23, 0xc1, 0xa1, 0x32, 0xf2, 0x10, 0xf2, 0x51,
12926
+	0x72, 0xe0, 0xa2, 0x20, 0x35, 0xb6, 0xe6, 0x11, 0x1e, 0x7d, 0x1c, 0x7a, 0x9d, 0xe4, 0xee, 0xf3,
12927
+	0x15, 0x55, 0x5b, 0xf3, 0xe8, 0xef, 0x2c, 0x41, 0xe7, 0xf7, 0x15, 0xf5, 0x7d, 0xb5, 0xf8, 0xfc,
12928
+	0x13, 0xd5, 0xc4, 0x99, 0x2d, 0xe7, 0x4d, 0xb1, 0xbf, 0x5b, 0xf3, 0x1a, 0x39, 0xb7, 0x28, 0x5b,
12929
+	0x0b, 0x78, 0xaa, 0x87, 0x1e, 0x41, 0x81, 0x0f, 0xbd, 0x1f, 0x88, 0x3a, 0x45, 0xfc, 0x5e, 0x3b,
12930
+	0x5b, 0xd2, 0x02, 0x86, 0x51, 0xf4, 0x5d, 0xd5, 0x60, 0xd9, 0x1f, 0xbb, 0x7c, 0xd8, 0xca, 0x86,
12931
+	0x6e, 0xc3, 0x5b, 0x2d, 0xca, 0x8e, 0x3d, 0xff, 0xd0, 0x60, 0x8c, 0x98, 0x07, 0x3c, 0xda, 0x57,
12932
+	0x27, 0xdd, 0x94, 0xf5, 0x26, 0x66, 0x58, 0xef, 0x2a, 0x2c, 0x12, 0xc7, 0x26, 0x01, 0x95, 0x54,
12933
+	0x21, 0x8f, 0xc3, 0x22, 0xe7, 0xe6, 0x9c, 0xe9, 0xd3, 0x20, 0xa0, 0x32, 0x3e, 0xcd, 0xe3, 0xa9,
12934
+	0x40, 0xff, 0x87, 0x24, 0x40, 0xb3, 0x63, 0xec, 0x28, 0xf3, 0x75, 0xc8, 0xee, 0x93, 0xa1, 0xed,
12935
+	0x4c, 0x2e, 0xda, 0xe9, 0x53, 0x7c, 0xc5, 0x90, 0x86, 0x36, 0x85, 0x0e, 0x56, 0xba, 0x82, 0xb2,
12936
+	0x8f, 0xf7, 0x5c, 0xca, 0x22, 0xca, 0x2e, 0x4a, 0x9c, 0x1f, 0xf8, 0xc4, 0x8d, 0x56, 0x46, 0x16,
12937
+	0x78, 0xd7, 0x07, 0x84, 0xd1, 0x63, 0x32, 0x09, 0x37, 0xa6, 0x2a, 0xa2, 0x2d, 0x4e, 0xe5, 0x03,
12938
+	0xea, 0x1f, 0x51, 0x6b, 0x35, 0x23, 0xbc, 0xf0, 0x4d, 0xfd, 0xc1, 0x0a, 0x2e, 0x99, 0x4f, 0xa4,
12939
+	0x5d, 0x7a, 0x28, 0xae, 0xeb, 0x69, 0xd5, 0x77, 0x8a, 0xae, 0xef, 0xc1, 0xd2, 0xcc, 0x38, 0x5f,
12940
+	0x89, 0x95, 0x9a, 0x9d, 0xa7, 0x9f, 0x68, 0x69, 0xf5, 0xf5, 0x99, 0x96, 0xd5, 0xff, 0x22, 0x25,
12941
+	0xb7, 0x92, 0x9a, 0xd5, 0xf9, 0xf9, 0xaa, 0x9c, 0xc8, 0x7e, 0x99, 0x9e, 0xa3, 0xfc, 0xfb, 0xfd,
12942
+	0x8b, 0x77, 0x18, 0xe7, 0xde, 0x02, 0x8e, 0x23, 0x45, 0xb4, 0x0e, 0x05, 0xb9, 0xfe, 0x7d, 0xee,
12943
+	0x4f, 0x62, 0x5a, 0x97, 0x30, 0x48, 0x11, 0xd7, 0x44, 0xb7, 0x61, 0x79, 0x34, 0xde, 0x73, 0xec,
12944
+	0xe0, 0x80, 0x5a, 0x12, 0x93, 0x16, 0x98, 0xa5, 0x48, 0x2a, 0x60, 0x3b, 0x50, 0x54, 0x82, 0xbe,
12945
+	0xe0, 0x5d, 0x19, 0xd1, 0xa1, 0xbb, 0x6f, 0xea, 0x90, 0x54, 0x11, 0x74, 0xac, 0x30, 0x9a, 0x16,
12946
+	0xf4, 0x3a, 0xe4, 0xc2, 0xce, 0xa2, 0x55, 0x48, 0xf5, 0x6a, 0x1d, 0x6d, 0xa1, 0xb4, 0x72, 0x72,
12947
+	0x5a, 0x2e, 0x84, 0xe2, 0x5e, 0xad, 0xc3, 0x6b, 0x76, 0xeb, 0x1d, 0x2d, 0x31, 0x5b, 0xb3, 0x5b,
12948
+	0xef, 0x94, 0xd2, 0xfc, 0xe6, 0xd7, 0xf7, 0xa1, 0x10, 0x6b, 0x01, 0xdd, 0x82, 0xc5, 0x66, 0xeb,
12949
+	0x31, 0x6e, 0x74, 0xbb, 0xda, 0x42, 0xe9, 0xfa, 0xc9, 0x69, 0x19, 0xc5, 0x6a, 0x9b, 0xee, 0x80,
12950
+	0xaf, 0x0f, 0x7a, 0x07, 0xd2, 0x5b, 0xed, 0x6e, 0x2f, 0x24, 0x7a, 0x31, 0xc4, 0x96, 0x17, 0xb0,
12951
+	0xd2, 0x55, 0x45, 0x29, 0xe2, 0x86, 0xf5, 0x3f, 0x4a, 0x40, 0x56, 0xf2, 0xdd, 0xb9, 0x0b, 0x65,
12952
+	0xc0, 0x62, 0x18, 0x85, 0x49, 0x12, 0xfe, 0xfe, 0xeb, 0x09, 0x73, 0x45, 0xf1, 0x5b, 0xe9, 0x7e,
12953
+	0xa1, 0x5e, 0xe9, 0x73, 0x28, 0xc6, 0x2b, 0xbe, 0x93, 0xf3, 0xfd, 0x16, 0x14, 0xb8, 0x7f, 0x87,
12954
+	0xc4, 0x79, 0x03, 0xb2, 0x92, 0x93, 0xab, 0xd3, 0xf4, 0x22, 0xf6, 0xae, 0x90, 0xe8, 0x01, 0x2c,
12955
+	0x4a, 0xc6, 0x1f, 0xe6, 0xa7, 0xd6, 0x2e, 0xde, 0x45, 0x38, 0x84, 0xeb, 0x8f, 0x20, 0xdd, 0xa1,
12956
+	0xd4, 0xe7, 0x73, 0xef, 0x7a, 0x16, 0x9d, 0x5e, 0x40, 0x2a, 0x58, 0xb1, 0x68, 0xb3, 0xce, 0x83,
12957
+	0x15, 0x8b, 0x36, 0xad, 0x28, 0xbd, 0x90, 0x8c, 0xa5, 0x17, 0x7a, 0x50, 0x7c, 0x46, 0xed, 0xc1,
12958
+	0x01, 0xa3, 0x96, 0x30, 0xf4, 0x21, 0xa4, 0x47, 0x34, 0xea, 0xfc, 0xea, 0x5c, 0x07, 0xa3, 0xd4,
12959
+	0xc7, 0x02, 0xc5, 0xcf, 0x91, 0x63, 0xa1, 0xad, 0xb2, 0xa2, 0xaa, 0xa4, 0xff, 0x7d, 0x12, 0x96,
12960
+	0x9b, 0x41, 0x30, 0x26, 0xae, 0x19, 0x32, 0x94, 0x1f, 0xcd, 0x32, 0x94, 0x3b, 0x73, 0x47, 0x38,
12961
+	0xa3, 0x32, 0x9b, 0x35, 0x51, 0x97, 0x43, 0x32, 0xba, 0x1c, 0xf4, 0x7f, 0x4f, 0x84, 0xa9, 0x91,
12962
+	0xdb, 0xb1, 0xed, 0x5e, 0x5a, 0x3d, 0x39, 0x2d, 0x5f, 0x8b, 0x5b, 0xa2, 0xbb, 0xee, 0xa1, 0xeb,
12963
+	0x1d, 0xbb, 0xe8, 0x5d, 0xc8, 0xe0, 0x46, 0xab, 0xf1, 0x4c, 0x4b, 0x48, 0xf7, 0x9c, 0x01, 0x61,
12964
+	0xea, 0xd2, 0x63, 0x6e, 0xa9, 0xd3, 0x68, 0xd5, 0x39, 0x97, 0x48, 0xce, 0xb1, 0xd4, 0xa1, 0xae,
12965
+	0x65, 0xbb, 0x03, 0x74, 0x0b, 0xb2, 0xcd, 0x6e, 0x77, 0x57, 0x04, 0xaf, 0x6f, 0x9d, 0x9c, 0x96,
12966
+	0xaf, 0xce, 0xa0, 0x78, 0x81, 0x5a, 0x1c, 0xc4, 0xc9, 0x35, 0x67, 0x19, 0x73, 0x40, 0x9c, 0xf7,
12967
+	0x49, 0x10, 0x6e, 0xf7, 0x78, 0x64, 0x9d, 0x99, 0x03, 0xc2, 0x1e, 0xff, 0x55, 0xdb, 0xed, 0x9f,
12968
+	0x93, 0xa0, 0x19, 0xa6, 0x49, 0x47, 0x8c, 0xd7, 0xab, 0xa8, 0xa6, 0x07, 0xb9, 0x11, 0xff, 0xb2,
12969
+	0x69, 0xc8, 0x03, 0x1e, 0xcc, 0xcd, 0xab, 0x9f, 0xd3, 0xab, 0x60, 0xcf, 0xa1, 0x86, 0x35, 0xb4,
12970
+	0x83, 0x80, 0x47, 0xef, 0x42, 0x86, 0x23, 0x4b, 0xa5, 0x9f, 0x27, 0xe0, 0xea, 0x1c, 0x04, 0xba,
12971
+	0x07, 0x69, 0xdf, 0x73, 0xc2, 0x35, 0xbc, 0xf9, 0xba, 0xac, 0x17, 0x57, 0xc5, 0x02, 0x89, 0xd6,
12972
+	0x00, 0xc8, 0x98, 0x79, 0x44, 0xb4, 0x2f, 0x56, 0x2f, 0x87, 0x63, 0x12, 0xf4, 0x0c, 0xb2, 0x01,
12973
+	0x35, 0x7d, 0x1a, 0x12, 0xc6, 0x47, 0xff, 0xd7, 0xde, 0x57, 0xba, 0xc2, 0x0c, 0x56, 0xe6, 0x4a,
12974
+	0x15, 0xc8, 0x4a, 0x09, 0x77, 0x7b, 0x8b, 0x30, 0x22, 0x3a, 0x5d, 0xc4, 0xe2, 0x9b, 0x7b, 0x13,
12975
+	0x71, 0x06, 0xa1, 0x37, 0x11, 0x67, 0xa0, 0xff, 0x71, 0x12, 0xa0, 0xf1, 0x9c, 0x51, 0xdf, 0x25,
12976
+	0x4e, 0xcd, 0x40, 0x8d, 0xd8, 0xe9, 0x2f, 0x47, 0xfb, 0xc1, 0xdc, 0x5c, 0x68, 0xa4, 0x51, 0xa9,
12977
+	0x19, 0x73, 0xce, 0xff, 0x1b, 0x90, 0x1a, 0xfb, 0x8e, 0xca, 0xab, 0x0b, 0xa6, 0xb7, 0x8b, 0xb7,
12978
+	0x31, 0x97, 0xa1, 0xc6, 0xf4, 0xd8, 0x4a, 0xbd, 0xfe, 0x41, 0x24, 0xd6, 0xc0, 0x2f, 0xff, 0xe8,
12979
+	0xfa, 0x10, 0x60, 0xda, 0x6b, 0xb4, 0x06, 0x99, 0xda, 0x66, 0xb7, 0xbb, 0xad, 0x2d, 0xc8, 0xb3,
12980
+	0x79, 0x5a, 0x25, 0xc4, 0xfa, 0x9f, 0x27, 0x20, 0x57, 0x33, 0xd4, 0x8d, 0xb9, 0x09, 0x9a, 0x38,
12981
+	0x70, 0x4c, 0xea, 0xb3, 0x3e, 0x7d, 0x3e, 0xb2, 0xfd, 0x89, 0x3a, 0x33, 0x2e, 0x0e, 0x93, 0x96,
12982
+	0xb9, 0x56, 0x8d, 0xfa, 0xac, 0x21, 0x74, 0x10, 0x86, 0x22, 0x55, 0x43, 0xec, 0x9b, 0x24, 0x3c,
12983
+	0xc1, 0xd7, 0x2e, 0x9e, 0x0a, 0x49, 0xaf, 0xa7, 0xe5, 0x00, 0x17, 0x42, 0x23, 0x35, 0x12, 0xe8,
12984
+	0x4f, 0xe1, 0x6a, 0xdb, 0x37, 0x0f, 0x68, 0xc0, 0x64, 0xa3, 0xaa, 0xcb, 0x8f, 0xe0, 0x26, 0x23,
12985
+	0xc1, 0x61, 0xff, 0xc0, 0x0e, 0x98, 0xe7, 0x4f, 0xfa, 0x3e, 0x65, 0xd4, 0xe5, 0xf5, 0x7d, 0xf1,
12986
+	0xec, 0xa2, 0x92, 0x1c, 0x37, 0x38, 0x66, 0x4b, 0x42, 0x70, 0x88, 0xd8, 0xe6, 0x00, 0xbd, 0x09,
12987
+	0x45, 0xce, 0x66, 0xeb, 0x74, 0x9f, 0x8c, 0x1d, 0x16, 0xa0, 0x1f, 0x02, 0x38, 0xde, 0xa0, 0x7f,
12988
+	0xe9, 0xe3, 0x3e, 0xef, 0x78, 0x03, 0xf9, 0xa9, 0xff, 0x1a, 0x68, 0x75, 0x3b, 0x18, 0x11, 0x66,
12989
+	0x1e, 0x84, 0xd9, 0x1b, 0xf4, 0x18, 0xb4, 0x03, 0x4a, 0x7c, 0xb6, 0x47, 0x09, 0xeb, 0x8f, 0xa8,
12990
+	0x6f, 0x7b, 0xd6, 0xa5, 0xa6, 0x74, 0x25, 0xd2, 0xea, 0x08, 0x25, 0xfd, 0x3f, 0x13, 0x00, 0x98,
12991
+	0xec, 0x87, 0xe4, 0xe6, 0x07, 0x70, 0x25, 0x70, 0xc9, 0x28, 0x38, 0xf0, 0x58, 0xdf, 0x76, 0x19,
12992
+	0xf5, 0x8f, 0x88, 0xa3, 0x22, 0x70, 0x2d, 0xac, 0x68, 0x2a, 0x39, 0xfa, 0x10, 0xd0, 0x21, 0xa5,
12993
+	0xa3, 0xbe, 0xe7, 0x58, 0xfd, 0xb0, 0x52, 0xbe, 0x0b, 0xa5, 0xb1, 0xc6, 0x6b, 0xda, 0x8e, 0xd5,
12994
+	0x0d, 0xe5, 0xa8, 0x0a, 0x6b, 0x7c, 0x06, 0xa8, 0xcb, 0x7c, 0x9b, 0x06, 0xfd, 0x7d, 0xcf, 0xef,
12995
+	0x07, 0x8e, 0x77, 0xdc, 0xdf, 0xf7, 0x1c, 0xc7, 0x3b, 0xa6, 0x7e, 0x98, 0xdf, 0x28, 0x39, 0xde,
12996
+	0xa0, 0x21, 0x41, 0x9b, 0x9e, 0xdf, 0x75, 0xbc, 0xe3, 0xcd, 0x10, 0xc1, 0x19, 0xd0, 0x74, 0xd8,
12997
+	0xcc, 0x36, 0x0f, 0x43, 0x06, 0x14, 0x49, 0x7b, 0xb6, 0x79, 0x88, 0x6e, 0xc1, 0x12, 0x75, 0xa8,
12998
+	0x88, 0x92, 0x25, 0x2a, 0x23, 0x50, 0xc5, 0x50, 0xc8, 0x41, 0xfa, 0xff, 0x83, 0x7c, 0xc7, 0x21,
12999
+	0xa6, 0x78, 0x7d, 0x43, 0x65, 0xe0, 0x41, 0x17, 0x77, 0x02, 0xdb, 0x55, 0x51, 0x52, 0x1e, 0xc7,
13000
+	0x45, 0xfa, 0x8f, 0x00, 0x7e, 0xec, 0xd9, 0x6e, 0xcf, 0x3b, 0xa4, 0xae, 0x78, 0xa8, 0xe0, 0x8c,
13001
+	0x5e, 0x2d, 0x65, 0x1e, 0xab, 0x92, 0x08, 0x58, 0x88, 0x4b, 0x06, 0xd4, 0x8f, 0xf2, 0xf5, 0xb2,
13002
+	0xa8, 0x7f, 0x93, 0x80, 0x2c, 0xf6, 0x3c, 0x56, 0x33, 0x50, 0x19, 0xb2, 0x26, 0xe9, 0x87, 0x3b,
13003
+	0xaf, 0x58, 0xcd, 0x9f, 0xbd, 0x5c, 0xcf, 0xd4, 0x8c, 0x27, 0x74, 0x82, 0x33, 0x26, 0x79, 0x42,
13004
+	0x27, 0xfc, 0x8a, 0x36, 0x89, 0xd8, 0x2f, 0xc2, 0x4c, 0x51, 0x5e, 0xd1, 0x35, 0x83, 0x6f, 0x06,
13005
+	0x9c, 0x35, 0x09, 0xff, 0x47, 0xf7, 0xa0, 0xa8, 0x40, 0xfd, 0x03, 0x12, 0x1c, 0x48, 0x1e, 0x5e,
13006
+	0x5d, 0x3e, 0x7b, 0xb9, 0x0e, 0x12, 0xb9, 0x45, 0x82, 0x03, 0x0c, 0x12, 0xcd, 0xbf, 0x51, 0x03,
13007
+	0x0a, 0x5f, 0x79, 0xb6, 0xdb, 0x67, 0x62, 0x10, 0x2a, 0x55, 0x31, 0x77, 0xff, 0x4c, 0x87, 0xaa,
13008
+	0xf2, 0x27, 0xf0, 0x55, 0x24, 0xd1, 0xff, 0x31, 0x01, 0x05, 0x6e, 0xd3, 0xde, 0xb7, 0x4d, 0x7e,
13009
+	0xa5, 0x7e, 0xf7, 0x93, 0xfe, 0x06, 0xa4, 0xcc, 0xc0, 0x57, 0x63, 0x13, 0x47, 0x5d, 0xad, 0x8b,
13010
+	0x31, 0x97, 0xa1, 0x2f, 0x20, 0xab, 0x82, 0x2f, 0x79, 0xc8, 0xeb, 0x6f, 0xbe, 0xfc, 0x55, 0x17,
13011
+	0x95, 0x9e, 0x58, 0xcb, 0x69, 0xef, 0xc4, 0x28, 0x8b, 0x38, 0x2e, 0x42, 0xd7, 0x21, 0x69, 0xba,
13012
+	0xc2, 0x29, 0xd4, 0x03, 0x66, 0xad, 0x85, 0x93, 0xa6, 0xab, 0xff, 0x5d, 0x02, 0x96, 0x1a, 0xae,
13013
+	0xe9, 0x4f, 0xc4, 0x21, 0xc9, 0x17, 0xe2, 0x26, 0xe4, 0x83, 0xf1, 0x5e, 0x30, 0x09, 0x18, 0x1d,
13014
+	0x86, 0x6f, 0x21, 0x91, 0x00, 0x35, 0x21, 0x4f, 0x9c, 0x81, 0xe7, 0xdb, 0xec, 0x60, 0xa8, 0x78,
13015
+	0xff, 0xfc, 0x83, 0x39, 0x6e, 0xb3, 0x62, 0x84, 0x2a, 0x78, 0xaa, 0x1d, 0x1e, 0xc5, 0x29, 0xd1,
13016
+	0x59, 0x71, 0x14, 0xbf, 0x0b, 0x45, 0x87, 0x0c, 0x45, 0x34, 0xca, 0xc3, 0x49, 0x31, 0x8e, 0x34,
13017
+	0x2e, 0x28, 0x19, 0x8f, 0xb1, 0x75, 0x1d, 0xf2, 0x91, 0x31, 0xb4, 0x02, 0x05, 0xa3, 0xd1, 0xed,
13018
+	0xdf, 0xdf, 0x78, 0xd0, 0x7f, 0x5c, 0xdb, 0xd1, 0x16, 0x14, 0x13, 0xf8, 0xab, 0x04, 0x2c, 0xed,
13019
+	0x48, 0x1f, 0x54, 0xec, 0xea, 0x16, 0x2c, 0xfa, 0x64, 0x9f, 0x85, 0xfc, 0x2f, 0x2d, 0x9d, 0x8b,
13020
+	0x1f, 0x02, 0x9c, 0xff, 0xf1, 0xaa, 0xf9, 0xfc, 0x2f, 0xf6, 0x3a, 0x97, 0xba, 0xf0, 0x75, 0x2e,
13021
+	0xfd, 0x4b, 0x79, 0x9d, 0xd3, 0x7f, 0x92, 0x84, 0x15, 0x75, 0x51, 0x87, 0xaf, 0x4f, 0xe8, 0x03,
13022
+	0xc8, 0xcb, 0x3b, 0x7b, 0xca, 0x5e, 0xc5, 0x83, 0x90, 0xc4, 0x35, 0xeb, 0x38, 0x27, 0xab, 0x9b,
13023
+	0x16, 0x0f, 0xa7, 0x14, 0x34, 0xf6, 0xd6, 0x0c, 0x52, 0xd4, 0xe2, 0xb1, 0x40, 0x1d, 0xd2, 0xfb,
13024
+	0xb6, 0x43, 0x95, 0x9f, 0xcd, 0xcd, 0x00, 0x9e, 0x6b, 0x5e, 0x24, 0xac, 0x7b, 0x22, 0x20, 0xdb,
13025
+	0x5a, 0xc0, 0x42, 0xbb, 0xf4, 0x3b, 0x00, 0x53, 0xe9, 0xdc, 0x98, 0x83, 0xdf, 0xeb, 0x2a, 0x83,
13026
+	0x13, 0xde, 0xeb, 0xcd, 0x3a, 0xe6, 0x32, 0x5e, 0x35, 0xb0, 0x2d, 0xb5, 0x73, 0x45, 0xd5, 0x63,
13027
+	0x5e, 0x35, 0xb0, 0xad, 0x28, 0x6b, 0x9e, 0x7e, 0x43, 0xd6, 0xbc, 0x9a, 0x0b, 0x93, 0x08, 0x7a,
13028
+	0x1b, 0xae, 0x57, 0x1d, 0x62, 0x1e, 0x3a, 0x76, 0xc0, 0xa8, 0x15, 0xdf, 0xa1, 0x9f, 0x42, 0x76,
13029
+	0xe6, 0xde, 0x7d, 0x43, 0xda, 0x46, 0x81, 0xf5, 0x9f, 0x24, 0xa0, 0xb8, 0x45, 0x89, 0xc3, 0x0e,
13030
+	0xa6, 0xb1, 0x2f, 0xa3, 0x01, 0x53, 0xe7, 0xa3, 0xf8, 0x46, 0x0f, 0x20, 0x17, 0xdd, 0x14, 0x97,
13031
+	0x49, 0x6e, 0x47, 0x68, 0xf4, 0x19, 0x2c, 0x72, 0xcf, 0xf6, 0xc6, 0x21, 0xa1, 0x7b, 0x43, 0xd6,
13032
+	0x54, 0x81, 0xf9, 0x21, 0xeb, 0x53, 0x71, 0x41, 0x88, 0xd9, 0xc9, 0xe0, 0xb0, 0xa8, 0xff, 0x4f,
13033
+	0x02, 0xae, 0xed, 0x90, 0xc9, 0x1e, 0x55, 0x3b, 0x8e, 0x5a, 0x98, 0x9a, 0x9e, 0x6f, 0xa1, 0x4e,
13034
+	0x7c, 0xa7, 0x5e, 0x90, 0xd0, 0x9f, 0xa7, 0x3c, 0x7f, 0xc3, 0x86, 0x4c, 0x31, 0x19, 0x63, 0x8a,
13035
+	0xd7, 0x20, 0xe3, 0x7a, 0xae, 0x49, 0xd5, 0x36, 0x96, 0x05, 0xdd, 0x8e, 0xef, 0xd2, 0x52, 0x94,
13036
+	0x65, 0x17, 0x39, 0xf2, 0x96, 0xc7, 0xa2, 0xd6, 0xd0, 0x17, 0x50, 0xea, 0x36, 0x6a, 0xb8, 0xd1,
13037
+	0xab, 0xb6, 0x7f, 0xb5, 0xdf, 0x35, 0xb6, 0xbb, 0xc6, 0xc6, 0xbd, 0x7e, 0xa7, 0xbd, 0xfd, 0xe5,
13038
+	0xfd, 0x8f, 0xef, 0x7d, 0xaa, 0x25, 0x4a, 0xe5, 0x93, 0xd3, 0xf2, 0xcd, 0x96, 0x51, 0xdb, 0x96,
13039
+	0x6e, 0xb9, 0xe7, 0x3d, 0xef, 0x12, 0x27, 0x20, 0x1b, 0xf7, 0x3a, 0x9e, 0x33, 0xe1, 0x98, 0xbb,
13040
+	0x7f, 0x9b, 0x82, 0x7c, 0x94, 0x44, 0xe3, 0xde, 0xc5, 0x23, 0x18, 0xd5, 0x54, 0x24, 0x6f, 0xd1,
13041
+	0x63, 0xf4, 0xee, 0x34, 0x76, 0xf9, 0x42, 0x26, 0xf3, 0xa3, 0xea, 0x30, 0x6e, 0x79, 0x0f, 0x72,
13042
+	0x46, 0xb7, 0xdb, 0x7c, 0xdc, 0x6a, 0xd4, 0xb5, 0xaf, 0x13, 0xa5, 0xef, 0x9d, 0x9c, 0x96, 0xaf,
13043
+	0x44, 0x20, 0x23, 0x08, 0xec, 0x81, 0x4b, 0x2d, 0x81, 0xaa, 0xd5, 0x1a, 0x9d, 0x5e, 0xa3, 0xae,
13044
+	0xbd, 0x48, 0x9e, 0x47, 0x09, 0x2e, 0x2e, 0x1e, 0xe6, 0xf2, 0x1d, 0xdc, 0xe8, 0x18, 0x98, 0x37,
13045
+	0xf8, 0x75, 0x52, 0x86, 0x54, 0xd3, 0x16, 0x7d, 0x3a, 0x22, 0x3e, 0x6f, 0x73, 0x2d, 0x7c, 0xa0,
13046
+	0x7e, 0x91, 0x92, 0x8f, 0x37, 0xd3, 0x8c, 0x20, 0x25, 0xd6, 0x84, 0xb7, 0x26, 0xb2, 0xb1, 0xc2,
13047
+	0x4c, 0xea, 0x5c, 0x6b, 0x5d, 0x46, 0x7c, 0xc6, 0xad, 0xe8, 0xb0, 0x88, 0x77, 0x5b, 0x2d, 0x0e,
13048
+	0x7a, 0x91, 0x3e, 0x37, 0x3a, 0x3c, 0x76, 0x5d, 0x8e, 0xb9, 0x0d, 0xb9, 0x30, 0x59, 0xab, 0x7d,
13049
+	0x9d, 0x3e, 0xd7, 0xa1, 0x5a, 0x98, 0x69, 0x16, 0x0d, 0x6e, 0xed, 0xf6, 0xc4, 0xfb, 0xf9, 0x8b,
13050
+	0xcc, 0xf9, 0x06, 0x0f, 0xc6, 0xcc, 0xe2, 0xc1, 0x62, 0x39, 0x8a, 0xde, 0xbe, 0xce, 0x48, 0x3e,
13051
+	0x1c, 0x61, 0x54, 0xe8, 0xf6, 0x1e, 0xe4, 0x70, 0xe3, 0xc7, 0xf2, 0xa9, 0xfd, 0x45, 0xf6, 0x9c,
13052
+	0x1d, 0x4c, 0xbf, 0xa2, 0x26, 0xa3, 0xd6, 0xf4, 0x6d, 0x2a, 0xaa, 0xba, 0xfb, 0xeb, 0x90, 0x0b,
13053
+	0xef, 0x4e, 0xb4, 0x06, 0xd9, 0x67, 0x6d, 0xfc, 0xa4, 0x81, 0xb5, 0x05, 0x39, 0x3b, 0x61, 0xcd,
13054
+	0x33, 0x49, 0x3e, 0xca, 0xb0, 0xb8, 0x63, 0xb4, 0x8c, 0xc7, 0x0d, 0x1c, 0xa6, 0x4c, 0x42, 0x80,
13055
+	0xba, 0x00, 0x4a, 0x9a, 0x6a, 0x20, 0xb2, 0x59, 0xbd, 0xf9, 0xcd, 0xb7, 0x6b, 0x0b, 0x3f, 0xfb,
13056
+	0x76, 0x6d, 0xe1, 0xe7, 0xdf, 0xae, 0x25, 0x5e, 0x9c, 0xad, 0x25, 0xbe, 0x39, 0x5b, 0x4b, 0xfc,
13057
+	0xf4, 0x6c, 0x2d, 0xf1, 0xaf, 0x67, 0x6b, 0x89, 0xbd, 0xac, 0x08, 0x4e, 0x3e, 0xfe, 0xdf, 0x00,
13058
+	0x00, 0x00, 0xff, 0xff, 0xb1, 0x0a, 0x70, 0x15, 0x40, 0x26, 0x00, 0x00,
13050 13059
 }
... ...
@@ -117,6 +117,8 @@ message NodeStatus {
117 117
 
118 118
 	State state = 1;
119 119
 	string message = 2;
120
+	// Addr is the node's IP address as observed by the manager
121
+	string addr = 3;
120 122
 }
121 123
 
122 124
 message Image {
... ...
@@ -200,7 +202,7 @@ message Mount {
200 200
 		int64 size_bytes = 1;
201 201
 
202 202
 		// Mode of the tmpfs upon creation
203
-		int32 mode = 2 [(gogoproto.customtype) = "os.FileMode", (gogoproto.nullable) = false];
203
+		uint32 mode = 2 [(gogoproto.customtype) = "os.FileMode", (gogoproto.nullable) = false];
204 204
 
205 205
 		// TODO(stevvooe): There are several more tmpfs flags, specified in the
206 206
 		// daemon, that are accepted. Only the most basic are added for now.
... ...
@@ -781,6 +783,7 @@ message ManagerStatus {
781 781
 	RaftMemberStatus.Reachability reachability = 4;
782 782
 }
783 783
 
784
+
784 785
 // SecretReference is the linkage between a service and a secret that it uses.
785 786
 message SecretReference {
786 787
 	// SecretID represents the ID of the specific Secret that we're
... ...
@@ -788,26 +791,29 @@ message SecretReference {
788 788
 	// any information about the secret contents.
789 789
 	string secret_id = 1 [(gogoproto.customname) = "SecretID"];
790 790
 
791
-	// Mode specifies how this secret should be exposed to the task.
792
-	enum Mode {
793
-		// SYSTEM means that it is not exposed inside to a task at all, but
794
-		// only available via direct access, usually at the agent-level
795
-		SYSTEM = 0;
796
-		// FILE means that it will be exposed to the task as a file
797
-		FILE = 1;
798
-		// ENV means that it will be exposed to the task as an environment variable
799
-		ENV = 2;
800
-	}
791
+	// SecretName is the name of the secret that this references, but this is just provided for
792
+	// lookup/display purposes.  The secret in the reference will be identified by its ID.
793
+	string secret_name = 2;
801 794
 
802
-	// Mode is the way the secret should be presented.
803
-	Mode mode = 2;
795
+	// FileTarget represents a specific target that is backed by a file
796
+	message FileTarget {
797
+		// Name represents the final filename in the filesystem
798
+		string name = 1;
804 799
 
805
-	// Target is the name by which the image accesses the secret.
806
-	string target = 3;
800
+		// UID represents the file UID
801
+		string uid = 2 [(gogoproto.customname) = "UID"];
807 802
 
808
-	// SecretName is the name of the secret that this references, but this is just provided for
809
-	// lookup/display purposes.  The secret in the reference will be identified by its ID.
810
-	string secret_name = 4;
803
+		// GID represents the file GID
804
+		string gid = 3 [(gogoproto.customname) = "GID"];
805
+
806
+		// Mode represents the FileMode of the file
807
+		uint32 mode = 4 [(gogoproto.customtype) = "os.FileMode", (gogoproto.nullable) = false];
808
+	}
809
+
810
+	// Target specifies how this secret should be exposed to the task.
811
+	oneof target {
812
+		FileTarget file = 3;
813
+	}
811 814
 }
812 815
 
813 816
 // BlacklistedCertificate is a record for a blacklisted certificate. It does not
... ...
@@ -840,3 +846,14 @@ message HealthConfig {
840 840
 	// container as unhealthy. Zero means inherit.
841 841
 	int32 retries = 4;
842 842
 }
843
+
844
+message MaybeEncryptedRecord {
845
+	enum Algorithm {
846
+		NONE = 0 [(gogoproto.enumvalue_customname) = "NotEncrypted"];
847
+		SECRETBOX_SALSA20_POLY1305 = 1 [(gogoproto.enumvalue_customname) = "NACLSecretboxSalsa20Poly1305"];
848
+	}
849
+
850
+	Algorithm algorithm = 1;
851
+	bytes data = 2;
852
+	bytes nonce = 3;
853
+}
... ...
@@ -629,6 +629,7 @@ func GetRemoteSignedCertificate(ctx context.Context, csr []byte, token string, r
629 629
 	issueRequest := &api.IssueNodeCertificateRequest{CSR: csr, Token: token}
630 630
 	issueResponse, err := caClient.IssueNodeCertificate(ctx, issueRequest)
631 631
 	if err != nil {
632
+		r.Observe(peer, -remotes.DefaultObservationWeight)
632 633
 		return nil, err
633 634
 	}
634 635
 
... ...
@@ -8,7 +8,7 @@ import (
8 8
 	"net/http"
9 9
 	"sync"
10 10
 
11
-	log "github.com/Sirupsen/logrus"
11
+	"github.com/Sirupsen/logrus"
12 12
 	"github.com/cloudflare/cfssl/api"
13 13
 	"github.com/cloudflare/cfssl/signer"
14 14
 	"github.com/pkg/errors"
... ...
@@ -90,7 +90,7 @@ func (eca *ExternalCA) Sign(req signer.SignRequest) (cert []byte, err error) {
90 90
 			return eca.rootCA.AppendFirstRootPEM(cert)
91 91
 		}
92 92
 
93
-		log.Debugf("unable to proxy certificate signing request to %s: %s", url, err)
93
+		logrus.Debugf("unable to proxy certificate signing request to %s: %s", url, err)
94 94
 	}
95 95
 
96 96
 	return nil, err
... ...
@@ -114,7 +114,7 @@ func makeExternalSignRequest(client *http.Client, url string, csrJSON []byte) (c
114 114
 
115 115
 	var apiResponse api.Response
116 116
 	if err := json.Unmarshal(body, &apiResponse); err != nil {
117
-		log.Debugf("unable to JSON-parse CFSSL API response body: %s", string(body))
117
+		logrus.Debugf("unable to JSON-parse CFSSL API response body: %s", string(body))
118 118
 		return nil, recoverableErr{err: errors.Wrap(err, "unable to parse JSON response")}
119 119
 	}
120 120
 
... ...
@@ -73,6 +73,17 @@ func newPortSpace(protocol api.PortConfig_Protocol) (*portSpace, error) {
73 73
 	}, nil
74 74
 }
75 75
 
76
+// getPortConfigkey returns a map key for doing set operations with
77
+// ports. The key consists of name, protocol and target port which
78
+// uniquely identifies a port within a single Endpoint.
79
+func getPortConfigKey(p *api.PortConfig) api.PortConfig {
80
+	return api.PortConfig{
81
+		Name:       p.Name,
82
+		Protocol:   p.Protocol,
83
+		TargetPort: p.TargetPort,
84
+	}
85
+}
86
+
76 87
 func reconcilePortConfigs(s *api.Service) []*api.PortConfig {
77 88
 	// If runtime state hasn't been created or if port config has
78 89
 	// changed from port state return the port config from Spec.
... ...
@@ -80,15 +91,31 @@ func reconcilePortConfigs(s *api.Service) []*api.PortConfig {
80 80
 		return s.Spec.Endpoint.Ports
81 81
 	}
82 82
 
83
+	allocatedPorts := make(map[api.PortConfig]*api.PortConfig)
84
+	for _, portState := range s.Endpoint.Ports {
85
+		if portState.PublishMode != api.PublishModeIngress {
86
+			continue
87
+		}
88
+
89
+		allocatedPorts[getPortConfigKey(portState)] = portState
90
+	}
91
+
83 92
 	var portConfigs []*api.PortConfig
84
-	for i, portConfig := range s.Spec.Endpoint.Ports {
85
-		portState := s.Endpoint.Ports[i]
93
+	for _, portConfig := range s.Spec.Endpoint.Ports {
94
+		// If the PublishMode is not Ingress simply pick up
95
+		// the port config.
96
+		if portConfig.PublishMode != api.PublishModeIngress {
97
+			portConfigs = append(portConfigs, portConfig)
98
+			continue
99
+		}
100
+
101
+		portState, ok := allocatedPorts[getPortConfigKey(portConfig)]
86 102
 
87 103
 		// If the portConfig is exactly the same as portState
88 104
 		// except if SwarmPort is not user-define then prefer
89 105
 		// portState to ensure sticky allocation of the same
90 106
 		// port that was allocated before.
91
-		if portConfig.Name == portState.Name &&
107
+		if ok && portConfig.Name == portState.Name &&
92 108
 			portConfig.TargetPort == portState.TargetPort &&
93 109
 			portConfig.Protocol == portState.Protocol &&
94 110
 			portConfig.PublishedPort == 0 {
... ...
@@ -186,21 +213,26 @@ func (pa *portAllocator) isPortsAllocated(s *api.Service) bool {
186 186
 		return false
187 187
 	}
188 188
 
189
-	for i, portConfig := range s.Spec.Endpoint.Ports {
189
+	allocatedPorts := make(map[api.PortConfig]*api.PortConfig)
190
+	for _, portState := range s.Endpoint.Ports {
191
+		if portState.PublishMode != api.PublishModeIngress {
192
+			continue
193
+		}
194
+
195
+		allocatedPorts[getPortConfigKey(portState)] = portState
196
+	}
197
+
198
+	for _, portConfig := range s.Spec.Endpoint.Ports {
190 199
 		// Ignore ports which are not PublishModeIngress
191 200
 		if portConfig.PublishMode != api.PublishModeIngress {
192 201
 			continue
193 202
 		}
194 203
 
195
-		// The port configuration slice and port state slice
196
-		// are expected to be in the same order.
197
-		portState := s.Endpoint.Ports[i]
204
+		portState, ok := allocatedPorts[getPortConfigKey(portConfig)]
198 205
 
199 206
 		// If name, port, protocol values don't match then we
200 207
 		// are not allocated.
201
-		if portConfig.Name != portState.Name ||
202
-			portConfig.TargetPort != portState.TargetPort ||
203
-			portConfig.Protocol != portState.Protocol {
208
+		if !ok {
204 209
 			return false
205 210
 		}
206 211
 
... ...
@@ -3,9 +3,11 @@ package controlapi
3 3
 import (
4 4
 	"regexp"
5 5
 
6
+	"github.com/Sirupsen/logrus"
6 7
 	"github.com/docker/distribution/digest"
7 8
 	"github.com/docker/swarmkit/api"
8 9
 	"github.com/docker/swarmkit/identity"
10
+	"github.com/docker/swarmkit/log"
9 11
 	"github.com/docker/swarmkit/manager/state/store"
10 12
 	"golang.org/x/net/context"
11 13
 	"google.golang.org/grpc"
... ...
@@ -85,6 +87,12 @@ func (s *Server) UpdateSecret(ctx context.Context, request *api.UpdateSecretRequ
85 85
 		return nil, grpc.Errorf(codes.NotFound, "secret %s not found", request.SecretID)
86 86
 	}
87 87
 
88
+	log.G(ctx).WithFields(logrus.Fields{
89
+		"secret.ID":   request.SecretID,
90
+		"secret.Name": request.Spec.Annotations.Name,
91
+		"method":      "UpdateSecret",
92
+	}).Debugf("secret updated")
93
+
88 94
 	// WARN: we should never return the actual secret data here. We need to redact the private fields first.
89 95
 	secret.Spec.Data = nil
90 96
 	return &api.UpdateSecretResponse{
... ...
@@ -169,6 +177,11 @@ func (s *Server) CreateSecret(ctx context.Context, request *api.CreateSecretRequ
169 169
 		return nil, grpc.Errorf(codes.AlreadyExists, "secret %s already exists", request.Spec.Annotations.Name)
170 170
 	case nil:
171 171
 		secret.Spec.Data = nil // clean the actual secret data so it's never returned
172
+		log.G(ctx).WithFields(logrus.Fields{
173
+			"secret.Name": request.Spec.Annotations.Name,
174
+			"method":      "CreateSecret",
175
+		}).Debugf("secret created")
176
+
172 177
 		return &api.CreateSecretResponse{Secret: secret}, nil
173 178
 	default:
174 179
 		return nil, err
... ...
@@ -191,6 +204,11 @@ func (s *Server) RemoveSecret(ctx context.Context, request *api.RemoveSecretRequ
191 191
 	case store.ErrNotExist:
192 192
 		return nil, grpc.Errorf(codes.NotFound, "secret %s not found", request.SecretID)
193 193
 	case nil:
194
+		log.G(ctx).WithFields(logrus.Fields{
195
+			"secret.ID": request.SecretID,
196
+			"method":    "RemoveSecret",
197
+		}).Debugf("secret removed")
198
+
194 199
 		return &api.RemoveSecretResponse{}, nil
195 200
 	default:
196 201
 		return nil, err
... ...
@@ -2,6 +2,7 @@ package controlapi
2 2
 
3 3
 import (
4 4
 	"errors"
5
+	"path/filepath"
5 6
 	"reflect"
6 7
 	"regexp"
7 8
 	"strconv"
... ...
@@ -304,20 +305,42 @@ func (s *Server) checkPortConflicts(spec *api.ServiceSpec, serviceID string) err
304 304
 	return nil
305 305
 }
306 306
 
307
-// checkSecretConflicts finds if the passed in spec has secrets with conflicting targets.
308
-func (s *Server) checkSecretConflicts(spec *api.ServiceSpec) error {
307
+// checkSecretValidity finds if the secrets passed in spec have any conflicting targets.
308
+func (s *Server) checkSecretValidity(spec *api.ServiceSpec) error {
309 309
 	container := spec.Task.GetContainer()
310 310
 	if container == nil {
311 311
 		return nil
312 312
 	}
313 313
 
314
+	// Keep a map to track all the targets that will be exposed
315
+	// The string returned is only used for logging. It could as well be struct{}{}
314 316
 	existingTargets := make(map[string]string)
315 317
 	for _, secretRef := range container.Secrets {
316
-		if prevSecretName, ok := existingTargets[secretRef.Target]; ok {
317
-			return grpc.Errorf(codes.InvalidArgument, "secret references '%s' and '%s' have a conflicting target: '%s'", prevSecretName, secretRef.SecretName, secretRef.Target)
318
+		// SecretID and SecretName are mandatory, we have invalid references without them
319
+		if secretRef.SecretID == "" || secretRef.SecretName == "" {
320
+			return grpc.Errorf(codes.InvalidArgument, "malformed secret reference")
318 321
 		}
319 322
 
320
-		existingTargets[secretRef.Target] = secretRef.SecretName
323
+		// Every secret referece requires a Target
324
+		if secretRef.GetTarget() == nil {
325
+			return grpc.Errorf(codes.InvalidArgument, "malformed secret reference, no target provided")
326
+		}
327
+
328
+		// If this is a file target, we will ensure filename uniqueness
329
+		if secretRef.GetFile() != nil {
330
+			fileName := secretRef.GetFile().Name
331
+			// Validate the file name
332
+			if fileName == "" || fileName != filepath.Base(filepath.Clean(fileName)) {
333
+				return grpc.Errorf(codes.InvalidArgument, "malformed file secret reference, invalid target file name provided")
334
+			}
335
+
336
+			// If this target is already in use, we have conflicting targets
337
+			if prevSecretName, ok := existingTargets[fileName]; ok {
338
+				return grpc.Errorf(codes.InvalidArgument, "secret references '%s' and '%s' have a conflicting target: '%s'", prevSecretName, secretRef.SecretName, fileName)
339
+			}
340
+
341
+			existingTargets[fileName] = secretRef.SecretName
342
+		}
321 343
 	}
322 344
 
323 345
 	return nil
... ...
@@ -341,7 +364,7 @@ func (s *Server) CreateService(ctx context.Context, request *api.CreateServiceRe
341 341
 		return nil, err
342 342
 	}
343 343
 
344
-	if err := s.checkSecretConflicts(request.Spec); err != nil {
344
+	if err := s.checkSecretValidity(request.Spec); err != nil {
345 345
 		return nil, err
346 346
 	}
347 347
 
... ...
@@ -412,7 +435,7 @@ func (s *Server) UpdateService(ctx context.Context, request *api.UpdateServiceRe
412 412
 		}
413 413
 	}
414 414
 
415
-	if err := s.checkSecretConflicts(request.Spec); err != nil {
415
+	if err := s.checkSecretValidity(request.Spec); err != nil {
416 416
 		return nil, err
417 417
 	}
418 418
 
... ...
@@ -2,6 +2,7 @@ package dispatcher
2 2
 
3 3
 import (
4 4
 	"fmt"
5
+	"net"
5 6
 	"strconv"
6 7
 	"sync"
7 8
 	"time"
... ...
@@ -313,17 +314,16 @@ func (d *Dispatcher) markNodesUnknown(ctx context.Context) error {
313 313
 				if node.Status.State == api.NodeStatus_DOWN {
314 314
 					return nil
315 315
 				}
316
-				node.Status = api.NodeStatus{
317
-					State:   api.NodeStatus_UNKNOWN,
318
-					Message: `Node moved to "unknown" state due to leadership change in cluster`,
319
-				}
316
+
317
+				node.Status.State = api.NodeStatus_UNKNOWN
318
+				node.Status.Message = `Node moved to "unknown" state due to leadership change in cluster`
319
+
320 320
 				nodeID := node.ID
321 321
 
322 322
 				expireFunc := func() {
323 323
 					log := log.WithField("node", nodeID)
324
-					nodeStatus := api.NodeStatus{State: api.NodeStatus_DOWN, Message: `heartbeat failure for node in "unknown" state`}
325 324
 					log.Debugf("heartbeat expiration for unknown node")
326
-					if err := d.nodeRemove(nodeID, nodeStatus); err != nil {
325
+					if err := d.markNodeNotReady(nodeID, api.NodeStatus_DOWN, `heartbeat failure for node in "unknown" state`); err != nil {
327 326
 						log.WithError(err).Errorf(`failed deregistering node after heartbeat expiration for node in "unknown" state`)
328 327
 					}
329 328
 				}
... ...
@@ -356,12 +356,18 @@ func (d *Dispatcher) isRunning() bool {
356 356
 	return true
357 357
 }
358 358
 
359
-// updateNode updates the description of a node and sets status to READY
359
+// markNodeReady updates the description of a node, updates its address, and sets status to READY
360 360
 // this is used during registration when a new node description is provided
361 361
 // and during node updates when the node description changes
362
-func (d *Dispatcher) updateNode(nodeID string, description *api.NodeDescription) error {
362
+func (d *Dispatcher) markNodeReady(nodeID string, description *api.NodeDescription, addr string) error {
363 363
 	d.nodeUpdatesLock.Lock()
364
-	d.nodeUpdates[nodeID] = nodeUpdate{status: &api.NodeStatus{State: api.NodeStatus_READY}, description: description}
364
+	d.nodeUpdates[nodeID] = nodeUpdate{
365
+		status: &api.NodeStatus{
366
+			State: api.NodeStatus_READY,
367
+			Addr:  addr,
368
+		},
369
+		description: description,
370
+	}
365 371
 	numUpdates := len(d.nodeUpdates)
366 372
 	d.nodeUpdatesLock.Unlock()
367 373
 
... ...
@@ -387,6 +393,19 @@ func (d *Dispatcher) updateNode(nodeID string, description *api.NodeDescription)
387 387
 	return nil
388 388
 }
389 389
 
390
+// gets the node IP from the context of a grpc call
391
+func nodeIPFromContext(ctx context.Context) (string, error) {
392
+	nodeInfo, err := ca.RemoteNode(ctx)
393
+	if err != nil {
394
+		return "", err
395
+	}
396
+	addr, _, err := net.SplitHostPort(nodeInfo.RemoteAddr)
397
+	if err != nil {
398
+		return "", errors.Wrap(err, "unable to get ip from addr:port")
399
+	}
400
+	return addr, nil
401
+}
402
+
390 403
 // register is used for registration of node with particular dispatcher.
391 404
 func (d *Dispatcher) register(ctx context.Context, nodeID string, description *api.NodeDescription) (string, error) {
392 405
 	// prevent register until we're ready to accept it
... ...
@@ -407,14 +426,18 @@ func (d *Dispatcher) register(ctx context.Context, nodeID string, description *a
407 407
 		return "", ErrNodeNotFound
408 408
 	}
409 409
 
410
-	if err := d.updateNode(nodeID, description); err != nil {
410
+	addr, err := nodeIPFromContext(ctx)
411
+	if err != nil {
412
+		log.G(ctx).Debugf(err.Error())
413
+	}
414
+
415
+	if err := d.markNodeReady(nodeID, description, addr); err != nil {
411 416
 		return "", err
412 417
 	}
413 418
 
414 419
 	expireFunc := func() {
415
-		nodeStatus := api.NodeStatus{State: api.NodeStatus_DOWN, Message: "heartbeat failure"}
416 420
 		log.G(ctx).Debugf("heartbeat expiration")
417
-		if err := d.nodeRemove(nodeID, nodeStatus); err != nil {
421
+		if err := d.markNodeNotReady(nodeID, api.NodeStatus_DOWN, "heartbeat failure"); err != nil {
418 422
 			log.G(ctx).WithError(err).Errorf("failed deregistering node after heartbeat expiration")
419 423
 		}
420 424
 	}
... ...
@@ -575,7 +598,11 @@ func (d *Dispatcher) processUpdates() {
575 575
 				}
576 576
 
577 577
 				if nodeUpdate.status != nil {
578
-					node.Status = *nodeUpdate.status
578
+					node.Status.State = nodeUpdate.status.State
579
+					node.Status.Message = nodeUpdate.status.Message
580
+					if nodeUpdate.status.Addr != "" {
581
+						node.Status.Addr = nodeUpdate.status.Addr
582
+					}
579 583
 				}
580 584
 				if nodeUpdate.description != nil {
581 585
 					node.Description = nodeUpdate.description
... ...
@@ -782,13 +809,18 @@ func (d *Dispatcher) Assignments(r *api.AssignmentsRequest, stream api.Dispatche
782 782
 		}
783 783
 		var newSecrets []*api.Secret
784 784
 		for _, secretRef := range container.Secrets {
785
+			// Empty ID prefix will return all secrets. Bail if there is no SecretID
786
+			if secretRef.SecretID == "" {
787
+				log.Debugf("invalid secret reference")
788
+				continue
789
+			}
785 790
 			secretID := secretRef.SecretID
786 791
 			log := log.WithFields(logrus.Fields{
787 792
 				"secret.id":   secretID,
788 793
 				"secret.name": secretRef.SecretName,
789 794
 			})
790 795
 
791
-			if tasksUsingSecret[secretID] == nil {
796
+			if len(tasksUsingSecret[secretID]) == 0 {
792 797
 				tasksUsingSecret[secretID] = make(map[string]struct{})
793 798
 
794 799
 				secrets, err := store.FindSecrets(readTx, store.ByIDPrefix(secretID))
... ...
@@ -1046,18 +1078,24 @@ func (d *Dispatcher) Assignments(r *api.AssignmentsRequest, stream api.Dispatche
1046 1046
 				}
1047 1047
 			}
1048 1048
 			for id, secret := range updateSecrets {
1049
-				if _, ok := removeSecrets[id]; !ok {
1050
-					secretChange := &api.AssignmentChange{
1051
-						Assignment: &api.Assignment{
1052
-							Item: &api.Assignment_Secret{
1053
-								Secret: secret,
1054
-							},
1049
+				// If, due to multiple updates, this secret is no longer in use,
1050
+				// don't send it down.
1051
+				if len(tasksUsingSecret[id]) == 0 {
1052
+					// delete this secret for the secrets to be updated
1053
+					// so that deleteSecrets knows the current list
1054
+					delete(updateSecrets, id)
1055
+					continue
1056
+				}
1057
+				secretChange := &api.AssignmentChange{
1058
+					Assignment: &api.Assignment{
1059
+						Item: &api.Assignment_Secret{
1060
+							Secret: secret,
1055 1061
 						},
1056
-						Action: api.AssignmentChange_AssignmentActionUpdate,
1057
-					}
1058
-
1059
-					update.Changes = append(update.Changes, secretChange)
1062
+					},
1063
+					Action: api.AssignmentChange_AssignmentActionUpdate,
1060 1064
 				}
1065
+
1066
+				update.Changes = append(update.Changes, secretChange)
1061 1067
 			}
1062 1068
 			for id := range removeTasks {
1063 1069
 				taskChange := &api.AssignmentChange{
... ...
@@ -1072,6 +1110,12 @@ func (d *Dispatcher) Assignments(r *api.AssignmentsRequest, stream api.Dispatche
1072 1072
 				update.Changes = append(update.Changes, taskChange)
1073 1073
 			}
1074 1074
 			for id := range removeSecrets {
1075
+				// If this secret is also being sent on the updated set
1076
+				// don't also add it to the removed set
1077
+				if _, ok := updateSecrets[id]; ok {
1078
+					continue
1079
+				}
1080
+
1075 1081
 				secretChange := &api.AssignmentChange{
1076 1082
 					Assignment: &api.Assignment{
1077 1083
 						Item: &api.Assignment_Secret{
... ...
@@ -1091,13 +1135,22 @@ func (d *Dispatcher) Assignments(r *api.AssignmentsRequest, stream api.Dispatche
1091 1091
 	}
1092 1092
 }
1093 1093
 
1094
-func (d *Dispatcher) nodeRemove(id string, status api.NodeStatus) error {
1094
+// markNodeNotReady sets the node state to some state other than READY
1095
+func (d *Dispatcher) markNodeNotReady(id string, state api.NodeStatus_State, message string) error {
1095 1096
 	if err := d.isRunningLocked(); err != nil {
1096 1097
 		return err
1097 1098
 	}
1098 1099
 
1100
+	status := &api.NodeStatus{
1101
+		State:   state,
1102
+		Message: message,
1103
+	}
1104
+
1099 1105
 	d.nodeUpdatesLock.Lock()
1100
-	d.nodeUpdates[id] = nodeUpdate{status: status.Copy(), description: d.nodeUpdates[id].description}
1106
+	// pluck the description out of nodeUpdates. this protects against a case
1107
+	// where a node is marked ready and a description is added, but then the
1108
+	// node is immediately marked not ready. this preserves that description
1109
+	d.nodeUpdates[id] = nodeUpdate{status: status, description: d.nodeUpdates[id].description}
1101 1110
 	numUpdates := len(d.nodeUpdates)
1102 1111
 	d.nodeUpdatesLock.Unlock()
1103 1112
 
... ...
@@ -1159,14 +1212,19 @@ func (d *Dispatcher) Session(r *api.SessionRequest, stream api.Dispatcher_Sessio
1159 1159
 	var sessionID string
1160 1160
 	if _, err := d.nodes.GetWithSession(nodeID, r.SessionID); err != nil {
1161 1161
 		// register the node.
1162
-		sessionID, err = d.register(stream.Context(), nodeID, r.Description)
1162
+		sessionID, err = d.register(ctx, nodeID, r.Description)
1163 1163
 		if err != nil {
1164 1164
 			return err
1165 1165
 		}
1166 1166
 	} else {
1167 1167
 		sessionID = r.SessionID
1168
+		// get the node IP addr
1169
+		addr, err := nodeIPFromContext(stream.Context())
1170
+		if err != nil {
1171
+			log.G(ctx).Debugf(err.Error())
1172
+		}
1168 1173
 		// update the node description
1169
-		if err := d.updateNode(nodeID, r.Description); err != nil {
1174
+		if err := d.markNodeReady(nodeID, r.Description, addr); err != nil {
1170 1175
 			return err
1171 1176
 		}
1172 1177
 	}
... ...
@@ -1226,8 +1284,7 @@ func (d *Dispatcher) Session(r *api.SessionRequest, stream api.Dispatcher_Sessio
1226 1226
 			}
1227 1227
 		}
1228 1228
 
1229
-		nodeStatus := api.NodeStatus{State: api.NodeStatus_DISCONNECTED, Message: "node is currently trying to find new manager"}
1230
-		if err := d.nodeRemove(nodeID, nodeStatus); err != nil {
1229
+		if err := d.markNodeNotReady(nodeID, api.NodeStatus_DISCONNECTED, "node is currently trying to find new manager"); err != nil {
1231 1230
 			log.WithError(err).Error("failed to remove node")
1232 1231
 		}
1233 1232
 		// still return an abort if the transport closure was ineffective.
... ...
@@ -7,6 +7,7 @@ import (
7 7
 	"net"
8 8
 	"os"
9 9
 	"path/filepath"
10
+	"runtime"
10 11
 	"sync"
11 12
 	"syscall"
12 13
 	"time"
... ...
@@ -30,6 +31,7 @@ import (
30 30
 	"github.com/docker/swarmkit/manager/state/raft"
31 31
 	"github.com/docker/swarmkit/manager/state/store"
32 32
 	"github.com/docker/swarmkit/protobuf/ptypes"
33
+	"github.com/docker/swarmkit/xnet"
33 34
 	"github.com/pkg/errors"
34 35
 	"golang.org/x/net/context"
35 36
 	"google.golang.org/grpc"
... ...
@@ -40,6 +42,16 @@ const (
40 40
 	defaultTaskHistoryRetentionLimit = 5
41 41
 )
42 42
 
43
+// RemoteAddrs provides an listening address and an optional advertise address
44
+// for serving the remote API.
45
+type RemoteAddrs struct {
46
+	// Address to bind
47
+	ListenAddr string
48
+
49
+	// Address to advertise to remote nodes (optional).
50
+	AdvertiseAddr string
51
+}
52
+
43 53
 // Config is used to tune the Manager.
44 54
 type Config struct {
45 55
 	SecurityConfig *ca.SecurityConfig
... ...
@@ -48,13 +60,12 @@ type Config struct {
48 48
 	// will make certificate signing requests for node certificates.
49 49
 	ExternalCAs []*api.ExternalCA
50 50
 
51
-	ProtoAddr map[string]string
52
-	// ProtoListener will be used for grpc serving if it's not nil,
53
-	// ProtoAddr fields will be used to create listeners otherwise.
54
-	ProtoListener map[string]net.Listener
51
+	// ControlAPI is an address for serving the control API.
52
+	ControlAPI string
55 53
 
56
-	// AdvertiseAddr is a map of addresses to advertise, by protocol.
57
-	AdvertiseAddr string
54
+	// RemoteAPI is a listening address for serving the remote API, and
55
+	// an optional advertise address.
56
+	RemoteAPI RemoteAddrs
58 57
 
59 58
 	// JoinRaft is an optional address of a node in an existing raft
60 59
 	// cluster to join.
... ...
@@ -81,7 +92,7 @@ type Config struct {
81 81
 // subsystems.
82 82
 type Manager struct {
83 83
 	config    *Config
84
-	listeners map[string]net.Listener
84
+	listeners []net.Listener
85 85
 
86 86
 	caserver               *ca.Server
87 87
 	dispatcher             *dispatcher.Dispatcher
... ...
@@ -96,10 +107,11 @@ type Manager struct {
96 96
 	localserver            *grpc.Server
97 97
 	raftNode               *raft.Node
98 98
 
99
-	mu sync.Mutex
99
+	cancelFunc context.CancelFunc
100 100
 
101
+	mu      sync.Mutex
101 102
 	started chan struct{}
102
-	stopped chan struct{}
103
+	stopped bool
103 104
 }
104 105
 
105 106
 type closeOnceListener struct {
... ...
@@ -119,41 +131,28 @@ func (l *closeOnceListener) Close() error {
119 119
 func New(config *Config) (*Manager, error) {
120 120
 	dispatcherConfig := dispatcher.DefaultConfig()
121 121
 
122
-	if config.ProtoAddr == nil {
123
-		config.ProtoAddr = make(map[string]string)
124
-	}
125
-
126
-	if config.ProtoListener != nil && config.ProtoListener["tcp"] != nil {
127
-		config.ProtoAddr["tcp"] = config.ProtoListener["tcp"].Addr().String()
128
-	}
129
-
130 122
 	// If an AdvertiseAddr was specified, we use that as our
131 123
 	// externally-reachable address.
132
-	tcpAddr := config.AdvertiseAddr
124
+	advertiseAddr := config.RemoteAPI.AdvertiseAddr
133 125
 
134
-	var tcpAddrPort string
135
-	if tcpAddr == "" {
126
+	var advertiseAddrPort string
127
+	if advertiseAddr == "" {
136 128
 		// Otherwise, we know we are joining an existing swarm. Use a
137 129
 		// wildcard address to trigger remote autodetection of our
138 130
 		// address.
139 131
 		var err error
140
-		_, tcpAddrPort, err = net.SplitHostPort(config.ProtoAddr["tcp"])
132
+		_, advertiseAddrPort, err = net.SplitHostPort(config.RemoteAPI.ListenAddr)
141 133
 		if err != nil {
142
-			return nil, fmt.Errorf("missing or invalid listen address %s", config.ProtoAddr["tcp"])
134
+			return nil, fmt.Errorf("missing or invalid listen address %s", config.RemoteAPI.ListenAddr)
143 135
 		}
144 136
 
145 137
 		// Even with an IPv6 listening address, it's okay to use
146 138
 		// 0.0.0.0 here. Any "unspecified" (wildcard) IP will
147 139
 		// be substituted with the actual source address.
148
-		tcpAddr = net.JoinHostPort("0.0.0.0", tcpAddrPort)
149
-	}
150
-
151
-	err := os.MkdirAll(filepath.Dir(config.ProtoAddr["unix"]), 0700)
152
-	if err != nil {
153
-		return nil, errors.Wrap(err, "failed to create socket directory")
140
+		advertiseAddr = net.JoinHostPort("0.0.0.0", advertiseAddrPort)
154 141
 	}
155 142
 
156
-	err = os.MkdirAll(config.StateDir, 0700)
143
+	err := os.MkdirAll(config.StateDir, 0700)
157 144
 	if err != nil {
158 145
 		return nil, errors.Wrap(err, "failed to create state directory")
159 146
 	}
... ...
@@ -164,41 +163,49 @@ func New(config *Config) (*Manager, error) {
164 164
 		return nil, errors.Wrap(err, "failed to create raft state directory")
165 165
 	}
166 166
 
167
-	var listeners map[string]net.Listener
168
-	if len(config.ProtoListener) > 0 {
169
-		listeners = config.ProtoListener
170
-	} else {
171
-		listeners = make(map[string]net.Listener)
167
+	var listeners []net.Listener
172 168
 
173
-		for proto, addr := range config.ProtoAddr {
174
-			l, err := net.Listen(proto, addr)
169
+	// don't create a socket directory if we're on windows. we used named pipe
170
+	if runtime.GOOS != "windows" {
171
+		err := os.MkdirAll(filepath.Dir(config.ControlAPI), 0700)
172
+		if err != nil {
173
+			return nil, errors.Wrap(err, "failed to create socket directory")
174
+		}
175
+	}
175 176
 
176
-			// A unix socket may fail to bind if the file already
177
-			// exists. Try replacing the file.
178
-			unwrappedErr := err
179
-			if op, ok := unwrappedErr.(*net.OpError); ok {
180
-				unwrappedErr = op.Err
181
-			}
182
-			if sys, ok := unwrappedErr.(*os.SyscallError); ok {
183
-				unwrappedErr = sys.Err
184
-			}
185
-			if proto == "unix" && unwrappedErr == syscall.EADDRINUSE {
186
-				os.Remove(addr)
187
-				l, err = net.Listen(proto, addr)
188
-				if err != nil {
189
-					return nil, err
190
-				}
191
-			} else if err != nil {
192
-				return nil, err
193
-			}
194
-			if proto == "tcp" && tcpAddrPort == "0" {
195
-				// in case of 0 port
196
-				tcpAddr = l.Addr().String()
197
-			}
198
-			listeners[proto] = l
177
+	l, err := xnet.ListenLocal(config.ControlAPI)
178
+
179
+	// A unix socket may fail to bind if the file already
180
+	// exists. Try replacing the file.
181
+	if runtime.GOOS != "windows" {
182
+		unwrappedErr := err
183
+		if op, ok := unwrappedErr.(*net.OpError); ok {
184
+			unwrappedErr = op.Err
185
+		}
186
+		if sys, ok := unwrappedErr.(*os.SyscallError); ok {
187
+			unwrappedErr = sys.Err
199 188
 		}
189
+		if unwrappedErr == syscall.EADDRINUSE {
190
+			os.Remove(config.ControlAPI)
191
+			l, err = xnet.ListenLocal(config.ControlAPI)
192
+		}
193
+	}
194
+	if err != nil {
195
+		return nil, errors.Wrap(err, "failed to listen on control API address")
200 196
 	}
201 197
 
198
+	listeners = append(listeners, l)
199
+
200
+	l, err = net.Listen("tcp", config.RemoteAPI.ListenAddr)
201
+	if err != nil {
202
+		return nil, errors.Wrap(err, "failed to listen on remote API address")
203
+	}
204
+	if advertiseAddrPort == "0" {
205
+		advertiseAddr = l.Addr().String()
206
+		config.RemoteAPI.ListenAddr = advertiseAddr
207
+	}
208
+	listeners = append(listeners, l)
209
+
202 210
 	raftCfg := raft.DefaultNodeConfig()
203 211
 
204 212
 	if config.ElectionTick > 0 {
... ...
@@ -210,7 +217,7 @@ func New(config *Config) (*Manager, error) {
210 210
 
211 211
 	newNodeOpts := raft.NodeOptions{
212 212
 		ID:              config.SecurityConfig.ClientTLSCreds.NodeID(),
213
-		Addr:            tcpAddr,
213
+		Addr:            advertiseAddr,
214 214
 		JoinAddr:        config.JoinRaft,
215 215
 		Config:          raftCfg,
216 216
 		StateDir:        raftStateDir,
... ...
@@ -231,18 +238,14 @@ func New(config *Config) (*Manager, error) {
231 231
 		localserver: grpc.NewServer(opts...),
232 232
 		raftNode:    raftNode,
233 233
 		started:     make(chan struct{}),
234
-		stopped:     make(chan struct{}),
235 234
 	}
236 235
 
237 236
 	return m, nil
238 237
 }
239 238
 
240 239
 // Addr returns tcp address on which remote api listens.
241
-func (m *Manager) Addr() net.Addr {
242
-	if l, ok := m.listeners["tcp"]; ok {
243
-		return l.Addr()
244
-	}
245
-	return nil
240
+func (m *Manager) Addr() string {
241
+	return m.config.RemoteAPI.ListenAddr
246 242
 }
247 243
 
248 244
 // Run starts all manager sub-systems and the gRPC server at the configured
... ...
@@ -252,14 +255,7 @@ func (m *Manager) Run(parent context.Context) error {
252 252
 	ctx, ctxCancel := context.WithCancel(parent)
253 253
 	defer ctxCancel()
254 254
 
255
-	// Harakiri.
256
-	go func() {
257
-		select {
258
-		case <-ctx.Done():
259
-		case <-m.stopped:
260
-			ctxCancel()
261
-		}
262
-	}()
255
+	m.cancelFunc = ctxCancel
263 256
 
264 257
 	leadershipCh, cancel := m.raftNode.SubscribeLeadership()
265 258
 	defer cancel()
... ...
@@ -336,8 +332,8 @@ func (m *Manager) Run(parent context.Context) error {
336 336
 	localHealthServer.SetServingStatus("ControlAPI", api.HealthCheckResponse_NOT_SERVING)
337 337
 
338 338
 	errServe := make(chan error, len(m.listeners))
339
-	for proto, l := range m.listeners {
340
-		go m.serveListener(ctx, errServe, proto, l)
339
+	for _, lis := range m.listeners {
340
+		go m.serveListener(ctx, errServe, lis)
341 341
 	}
342 342
 
343 343
 	defer func() {
... ...
@@ -383,24 +379,14 @@ func (m *Manager) Run(parent context.Context) error {
383 383
 
384 384
 	// wait for an error in serving.
385 385
 	err = <-errServe
386
-	select {
387
-	// check to see if stopped was posted to. if so, we're in the process of
388
-	// stopping, or done and that's why we got the error. if stopping is
389
-	// deliberate, stopped will ALWAYS be closed before the error is trigger,
390
-	// so this path will ALWAYS be taken if the stop was deliberate
391
-	case <-m.stopped:
392
-		// shutdown was requested, do not return an error
393
-		// but first, we wait to acquire a mutex to guarantee that stopping is
394
-		// finished. as long as we acquire the mutex BEFORE we return, we know
395
-		// that stopping is stopped.
396
-		m.mu.Lock()
386
+	m.mu.Lock()
387
+	if m.stopped {
397 388
 		m.mu.Unlock()
398 389
 		return nil
399
-	// otherwise, we'll get something from errServe, which indicates that an
400
-	// error in serving has actually occurred and this isn't a planned shutdown
401
-	default:
402
-		return err
403 390
 	}
391
+	m.mu.Unlock()
392
+	m.Stop(ctx)
393
+	return err
404 394
 }
405 395
 
406 396
 const stopTimeout = 8 * time.Second
... ...
@@ -417,13 +403,10 @@ func (m *Manager) Stop(ctx context.Context) {
417 417
 	// from returning before we've finished stopping.
418 418
 	m.mu.Lock()
419 419
 	defer m.mu.Unlock()
420
-	select {
421
-	// check to see that we've already stopped
422
-	case <-m.stopped:
420
+	if m.stopped {
423 421
 		return
424
-	default:
425
-		// do nothing, we're stopping for the first time
426 422
 	}
423
+	m.stopped = true
427 424
 
428 425
 	srvDone, localSrvDone := make(chan struct{}), make(chan struct{})
429 426
 	go func() {
... ...
@@ -460,11 +443,7 @@ func (m *Manager) Stop(ctx context.Context) {
460 460
 		m.keyManager.Stop()
461 461
 	}
462 462
 
463
-	// once we start stopping, send a signal that we're doing so. this tells
464
-	// Run that we've started stopping, when it gets the error from errServe
465
-	// it also prevents the loop from processing any more stuff.
466
-	close(m.stopped)
467
-
463
+	m.cancelFunc()
468 464
 	<-m.raftNode.Done()
469 465
 
470 466
 	timer := time.AfterFunc(stopTimeout, func() {
... ...
@@ -582,11 +561,9 @@ func (m *Manager) handleLeadershipEvents(ctx context.Context, leadershipCh chan
582 582
 		select {
583 583
 		case leadershipEvent := <-leadershipCh:
584 584
 			m.mu.Lock()
585
-			select {
586
-			case <-m.stopped:
585
+			if m.stopped {
587 586
 				m.mu.Unlock()
588 587
 				return
589
-			default:
590 588
 			}
591 589
 			newState := leadershipEvent.(raft.LeadershipState)
592 590
 
... ...
@@ -596,8 +573,6 @@ func (m *Manager) handleLeadershipEvents(ctx context.Context, leadershipCh chan
596 596
 				m.becomeFollower()
597 597
 			}
598 598
 			m.mu.Unlock()
599
-		case <-m.stopped:
600
-			return
601 599
 		case <-ctx.Done():
602 600
 			return
603 601
 		}
... ...
@@ -605,20 +580,21 @@ func (m *Manager) handleLeadershipEvents(ctx context.Context, leadershipCh chan
605 605
 }
606 606
 
607 607
 // serveListener serves a listener for local and non local connections.
608
-func (m *Manager) serveListener(ctx context.Context, errServe chan error, proto string, lis net.Listener) {
608
+func (m *Manager) serveListener(ctx context.Context, errServe chan error, l net.Listener) {
609 609
 	ctx = log.WithLogger(ctx, log.G(ctx).WithFields(
610 610
 		logrus.Fields{
611
-			"proto": lis.Addr().Network(),
612
-			"addr":  lis.Addr().String()}))
613
-	if proto == "unix" {
611
+			"proto": l.Addr().Network(),
612
+			"addr":  l.Addr().String(),
613
+		}))
614
+	if _, ok := l.(*net.TCPListener); !ok {
614 615
 		log.G(ctx).Info("Listening for local connections")
615 616
 		// we need to disallow double closes because UnixListener.Close
616 617
 		// can delete unix-socket file of newer listener. grpc calls
617 618
 		// Close twice indeed: in Serve and in Stop.
618
-		errServe <- m.localserver.Serve(&closeOnceListener{Listener: lis})
619
+		errServe <- m.localserver.Serve(&closeOnceListener{Listener: l})
619 620
 	} else {
620 621
 		log.G(ctx).Info("Listening for connections")
621
-		errServe <- m.server.Serve(lis)
622
+		errServe <- m.server.Serve(l)
622 623
 	}
623 624
 }
624 625
 
... ...
@@ -205,7 +205,7 @@ func (g *Orchestrator) removeTasksFromNode(ctx context.Context, node *api.Node)
205 205
 		return nil
206 206
 	})
207 207
 	if err != nil {
208
-		log.G(ctx).WithError(err).Errorf("global orchestrator: removeTasksFromNode failed")
208
+		log.G(ctx).WithError(err).Errorf("global orchestrator: removeTasksFromNode failed batching tasks")
209 209
 	}
210 210
 }
211 211
 
... ...
@@ -1689,7 +1689,7 @@ func getIDs(snap *raftpb.Snapshot, ents []raftpb.Entry) []uint64 {
1689 1689
 		case raftpb.ConfChangeUpdateNode:
1690 1690
 			// do nothing
1691 1691
 		default:
1692
-			log.L.Panic("ConfChange Type should be either ConfChangeAddNode or ConfChangeRemoveNode!")
1692
+			log.L.Panic("ConfChange Type should be either ConfChangeAddNode, or ConfChangeRemoveNode, or ConfChangeUpdateNode!")
1693 1693
 		}
1694 1694
 	}
1695 1695
 	var sids []uint64
... ...
@@ -22,6 +22,7 @@ import (
22 22
 	"github.com/docker/swarmkit/log"
23 23
 	"github.com/docker/swarmkit/manager"
24 24
 	"github.com/docker/swarmkit/remotes"
25
+	"github.com/docker/swarmkit/xnet"
25 26
 	"github.com/pkg/errors"
26 27
 	"golang.org/x/net/context"
27 28
 	"google.golang.org/grpc"
... ...
@@ -116,10 +117,10 @@ func (n *Node) RemoteAPIAddr() (string, error) {
116 116
 		return "", errors.Errorf("node is not manager")
117 117
 	}
118 118
 	addr := n.manager.Addr()
119
-	if addr == nil {
119
+	if addr == "" {
120 120
 		return "", errors.Errorf("manager addr is not set")
121 121
 	}
122
-	return addr.String(), nil
122
+	return addr, nil
123 123
 }
124 124
 
125 125
 // New returns new Node instance.
... ...
@@ -554,12 +555,10 @@ func (n *Node) initManagerConnection(ctx context.Context, ready chan<- struct{})
554 554
 	opts := []grpc.DialOption{}
555 555
 	insecureCreds := credentials.NewTLS(&tls.Config{InsecureSkipVerify: true})
556 556
 	opts = append(opts, grpc.WithTransportCredentials(insecureCreds))
557
-	// Using listen address instead of advertised address because this is a
558
-	// local connection.
559 557
 	addr := n.config.ListenControlAPI
560 558
 	opts = append(opts, grpc.WithDialer(
561 559
 		func(addr string, timeout time.Duration) (net.Conn, error) {
562
-			return net.DialTimeout("unix", addr, timeout)
560
+			return xnet.DialTimeoutLocal(addr, timeout)
563 561
 		}))
564 562
 	conn, err := grpc.Dial(addr, opts...)
565 563
 	if err != nil {
... ...
@@ -623,11 +622,11 @@ func (n *Node) runManager(ctx context.Context, securityConfig *ca.SecurityConfig
623 623
 		remoteAddr, _ := n.remotes.Select(n.NodeID())
624 624
 		m, err := manager.New(&manager.Config{
625 625
 			ForceNewCluster: n.config.ForceNewCluster,
626
-			ProtoAddr: map[string]string{
627
-				"tcp":  n.config.ListenRemoteAPI,
628
-				"unix": n.config.ListenControlAPI,
626
+			RemoteAPI: manager.RemoteAddrs{
627
+				ListenAddr:    n.config.ListenRemoteAPI,
628
+				AdvertiseAddr: n.config.AdvertiseRemoteAPI,
629 629
 			},
630
-			AdvertiseAddr:  n.config.AdvertiseRemoteAPI,
630
+			ControlAPI:     n.config.ListenControlAPI,
631 631
 			SecurityConfig: securityConfig,
632 632
 			ExternalCAs:    n.config.ExternalCAs,
633 633
 			JoinRaft:       remoteAddr.Addr,
... ...
@@ -1,3 +1,3 @@
1 1
 package plugin
2 2
 
3
-//go:generate protoc -I.:../../vendor/github.com/gogo/protobuf/protobuf --gogoswarm_out=import_path=github.com/docker/swarmkit/protobuf/plugin,Mgoogle/protobuf/descriptor.proto=github.com/gogo/protobuf/protoc-gen-gogo/descriptor:. plugin.proto
3
+//go:generate protoc -I.:/usr/local --gogoswarm_out=import_path=github.com/docker/swarmkit/protobuf/plugin,Mgoogle/protobuf/descriptor.proto=github.com/gogo/protobuf/protoc-gen-gogo/descriptor:. plugin.proto
4 4
new file mode 100644
... ...
@@ -0,0 +1,20 @@
0
+// +build !windows
1
+
2
+package xnet
3
+
4
+import (
5
+	"net"
6
+	"time"
7
+)
8
+
9
+// ListenLocal opens a local socket for control communication
10
+func ListenLocal(socket string) (net.Listener, error) {
11
+	// on unix it's just a unix socket
12
+	return net.Listen("unix", socket)
13
+}
14
+
15
+// DialTimeoutLocal is a DialTimeout function for local sockets
16
+func DialTimeoutLocal(socket string, timeout time.Duration) (net.Conn, error) {
17
+	// on unix, we dial a unix socket
18
+	return net.DialTimeout("unix", socket, timeout)
19
+}
0 20
new file mode 100644
... ...
@@ -0,0 +1,31 @@
0
+// +build windows
1
+
2
+package xnet
3
+
4
+import (
5
+	"net"
6
+	"time"
7
+
8
+	"github.com/Microsoft/go-winio"
9
+)
10
+
11
+// ListenLocal opens a local socket for control communication
12
+func ListenLocal(socket string) (net.Listener, error) {
13
+	// set up ACL for the named pipe
14
+	// allow Administrators and SYSTEM
15
+	sddl := "D:P(A;;GA;;;BA)(A;;GA;;;SY)"
16
+	c := winio.PipeConfig{
17
+		SecurityDescriptor: sddl,
18
+		MessageMode:        true,  // Use message mode so that CloseWrite() is supported
19
+		InputBufferSize:    65536, // Use 64KB buffers to improve performance
20
+		OutputBufferSize:   65536,
21
+	}
22
+	// on windows, our socket is actually a named pipe
23
+	return winio.ListenPipe(socket, &c)
24
+}
25
+
26
+// DialTimeoutLocal is a DialTimeout function for local sockets
27
+func DialTimeoutLocal(socket string, timeout time.Duration) (net.Conn, error) {
28
+	// On windows, we dial a named pipe
29
+	return winio.DialPipe(socket, &timeout)
30
+}